diff --git a/experimental/xformer/.clang-format b/.clang-format similarity index 100% rename from experimental/xformer/.clang-format rename to .clang-format diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index d37cf72bd..000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,14 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - -version: 2 -updates: - - package-ecosystem: "gitsubmodule" # See documentation for possible values - directory: "/" # Location of package manifests - schedule: - interval: "daily" - time: "00:00" - timezone: "Europe/London" - diff --git a/.github/scripts/build_linux_wheel.sh b/.github/scripts/build_linux_wheel.sh deleted file mode 100755 index c94ae8b47..000000000 --- a/.github/scripts/build_linux_wheel.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash -set -e -x - -pip install cmake -cd third_party/lib_tflite_micro -# Use gcc7 toolchain from the docker file to build tflm_interpreter -CC=/dt7/usr/bin/gcc CXX=/dt7/usr/bin/g++ make build - -# Build xcore-opt with an older gcc7 toolchain -# Have to explicitly link with -lrt to prevent the following linking errors - -#/usr/bin/ld: bazel-out/k8-fastbuild/bin/external/org_tensorflow/tensorflow/core/platform/default/libenv_time.a(env_time.pic.o): in function `tensorflow::EnvTime::NowNanos()': -#env_time.cc:(.text+0x15): undefined reference to `clock_gettime' -#/usr/bin/ld: bazel-out/k8-fastbuild/bin/external/com_google_absl/absl/time/libtime.a(clock.pic.o): in function `absl::lts_20210324::time_internal::GetCurrentTimeNanosFromSystem()': -#clock.cc:(.text+0xda): undefined reference to `clock_gettime' -#/usr/bin/ld: bazel-out/k8-fastbuild/bin/external/com_google_absl/absl/base/libbase.a(sysinfo.pic.o): in function `absl::lts_20210324::base_internal::ReadMonotonicClockNanos()': -#sysinfo.cc:(.text+0x156): undefined reference to `clock_gettime' -cd ../../experimental/xformer -bazel build //:xcore-opt --linkopt=-lrt --crosstool_top=@org_tensorflow//third_party/toolchains/preconfig/ubuntu16.04/gcc7_manylinux2010-nvcc-cuda11.2:toolchain - -# Build python wheel -cd python -python setup.py bdist_wheel diff --git a/.github/workflows/auto-format.yml b/.github/workflows/auto-format.yml deleted file mode 100644 index 78c18020d..000000000 --- a/.github/workflows/auto-format.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Auto-format -on: - issue_comment: - types: [created] -jobs: - apply-formatting: - if: ${{ github.event.issue.pull_request }} - runs-on: ubuntu-latest - steps: - - name: Clone git repo - uses: actions/checkout@v2 - - - id: format - uses: xmos/xaction_format@v1.0 - with: - file-extensions: | - c h cpp hpp - exclude-dirs: "./third-party ./utils/lib_flexbuffers" - c-style: llvm - token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 85fcba893..000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,205 +0,0 @@ -name: xmos-ai-tools-release - -on: - release: - types: [published] - tags: - - v* - workflow_dispatch: - inputs: - version: - description: "Provide a valid release tag version in the format vX.Y.Z" - required: true - -# Either we triggered a workflow providing a version or published a new release -# Save the tag version in an environment variable -env: - TAG_VERSION: ${{ github.event.inputs.version == 0 && github.ref_name || github.event.inputs.version }} - - - -jobs: - macos-release-wheel: - name: Build release wheels for macOS - runs-on: macos-latest - strategy: - matrix: - python-version: [3.8] - fail-fast: false - steps: - # Caches and restores the bazelisk download directory, the bazel build directory. - - name: Cache bazel - uses: actions/cache@v2.1.4 - env: - cache-name: bazel-cache - with: - path: | - ~/.cache/bazelisk - ~/.cache/bazel - key: ${{ runner.os }}-${{ env.cache-name }} - - uses: actions/checkout@v2 - with: - submodules: recursive - ref: ${{ env.TAG_VERSION }} - - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - name: Build macOS wheels - env: - XMOS_AI_TOOLS_RELEASE_VERSION: ${{ env.TAG_VERSION }} - shell: bash - run: | - python --version - python -m pip install wheel setuptools numpy six --no-cache-dir - - cd third_party/lib_tflite_micro - make build - - cd ../../experimental/xformer - bazelisk build //:xcore-opt --copt=-fvisibility=hidden --copt=-mavx --copt=-mmacosx-version-min=10.13 --linkopt=-mmacosx-version-min=10.13 --linkopt=-dead_strip --distinct_host_configuration=false - - cd python - python setup.py bdist_wheel --plat macosx_10_9_x86_64 - - - uses: actions/upload-artifact@v2 - with: - name: ${{ runner.os }}-wheels - path: experimental/xformer/python/dist - - - - macos-arm-release-wheel: - name: Build release wheels for macOS arm64 - runs-on: macos-11 - strategy: - matrix: - python-version: [3.8] - fail-fast: false - steps: - # Caches and restores the bazelisk download directory, the bazel build directory. - - name: Cache bazel - uses: actions/cache@v2.1.4 - env: - cache-name: bazel-cache - with: - path: | - ~/.cache/bazelisk - ~/.cache/bazel - key: ${{ runner.os }}-arm-${{ env.cache-name }} - - uses: actions/checkout@v2 - with: - submodules: recursive - ref: ${{ env.TAG_VERSION }} - - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - name: Build macOS arm wheels - env: - XMOS_AI_TOOLS_RELEASE_VERSION: ${{ env.TAG_VERSION }} - shell: bash - run: | - python --version - python -m pip install wheel setuptools numpy six --no-cache-dir - - cd third_party/lib_tflite_micro - make build - - cd ../../experimental/xformer - bazelisk build //:xcore-opt --copt=-fvisibility=hidden --copt=-mmacosx-version-min=11.0 --linkopt=-mmacosx-version-min=11.0 --linkopt=-dead_strip - - cd python - python setup.py bdist_wheel --plat-name macosx_11_0_arm64 - - - uses: actions/upload-artifact@v2 - with: - name: ${{ runner.os }}-arm-wheels - path: experimental/xformer/python/dist - - - - manylinux-release-wheel: - name: Build release wheels for manylinux2010 - runs-on: ubuntu-18.04 - strategy: - matrix: - python-version: [3.8] - fail-fast: false - steps: - # Caches and restores the bazelisk download directory, the bazel build directory. - - name: Cache bazel - uses: actions/cache@v2.1.4 - env: - cache-name: bazel-cache - with: - path: | - ~/.cache/bazelisk - ~/.cache/bazel - key: ${{ runner.os }}-${{ env.cache-name }} - - uses: actions/checkout@v2 - with: - submodules: recursive - ref: ${{ env.TAG_VERSION }} - - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - name: Build manylinux2010 wheels - # The XMOS_AI_TOOLS_RELEASE_VERSION var is passed via docker to the - # python setup.py script to add the version info for the wheel file. - # - # auditwheel requires patchelf and repairs the created wheel file to - # be compatible for manylinux. - run: | - docker run -e XMOS_AI_TOOLS_RELEASE_VERSION=${{ env.TAG_VERSION }} \ - -v ${PWD}:/ai_tools -w /ai_tools \ - tensorflow/build:latest-python${{ matrix.python-version }} \ - .github/scripts/build_linux_wheel.sh - - sudo apt-get -y -qq install patchelf --no-install-recommends - python -m pip install auditwheel --no-cache-dir - cd experimental/xformer/python - for f in dist/*.whl; do - auditwheel repair --plat manylinux2010_x86_64 $f - done - - - uses: actions/upload-artifact@v2 - with: - name: ${{ runner.os }}-wheels - # auditwheel creates the output wheel in the wheelhouse folder - path: experimental/xformer/python/wheelhouse - - - - publish-wheels: - name: Publish wheels to PyPi - if: ${{ always() }} - needs: [macos-release-wheel, macos-arm-release-wheel, manylinux-release-wheel] - runs-on: ubuntu-latest - steps: - - uses: actions/download-artifact@v2 - with: - name: macOS-wheels - path: macOS-wheels - if: ${{ needs.macos-release-wheel.result == 'success' }} - - uses: actions/download-artifact@v2 - with: - name: macOS-arm-wheels - path: macOS-arm-wheels - if: ${{ needs.macos-arm-release-wheel.result == 'success' }} - - uses: actions/download-artifact@v2 - with: - name: Linux-wheels - path: Linux-wheels - if: ${{ needs.manylinux-release-wheel.result == 'success' }} - - run: | - set -x - mkdir -p dist - cp macOS-wheels/*.whl dist/ || true - cp macOS-arm-wheels/*.whl dist/ || true - cp Linux-wheels/*.whl dist/ || true - ls -la dist/ - sha256sum dist/*.whl - - name: Publish packages to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - user: __token__ - password: ${{ secrets.PYPI_API_TOKEN }} diff --git a/.github/workflows/test-actions.yml b/.github/workflows/test-actions.yml deleted file mode 100644 index 1026e6ce3..000000000 --- a/.github/workflows/test-actions.yml +++ /dev/null @@ -1,202 +0,0 @@ -name: xmos-ai-tools-test-actions - -on: -# release: -# types: [published] -# tags: -# - v* - workflow_dispatch: - inputs: - version: - description: "Provide a valid release tag version in the format vX.Y.Z" - required: true - -# Either we triggered a workflow providing a version or published a new release -# Save the tag version in an environment variable -env: - TAG_VERSION: ${{ github.event.inputs.version == 0 && github.ref_name || github.event.inputs.version }} - - -jobs: - macos-release-wheel: - name: Build release wheels for macOS - runs-on: macos-latest - strategy: - matrix: - python-version: [3.8] - fail-fast: false - steps: - # Caches and restores the bazelisk download directory, the bazel build directory. - - name: Cache bazel - uses: actions/cache@v2.1.4 - env: - cache-name: bazel-cache - with: - path: | - ~/.cache/bazelisk - ~/.cache/bazel - key: ${{ runner.os }}-${{ env.cache-name }} - - uses: actions/checkout@v2 - with: - submodules: recursive - - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - name: Build macOS wheels - env: - XMOS_AI_TOOLS_RELEASE_VERSION: ${{ env.TAG_VERSION }} - shell: bash - run: | - python --version - python -m pip install wheel setuptools numpy six --no-cache-dir - - cd third_party/lib_tflite_micro - make build - - cd ../../experimental/xformer - bazelisk build //:xcore-opt --copt=-fvisibility=hidden --copt=-mavx --copt=-mmacosx-version-min=10.13 --linkopt=-mmacosx-version-min=10.13 --linkopt=-dead_strip --distinct_host_configuration=false - - cd python - python setup.py bdist_wheel --plat macosx_10_9_x86_64 - - - uses: actions/upload-artifact@v2 - with: - name: ${{ runner.os }}-wheels - path: experimental/xformer/python/dist - - - - macos-arm-release-wheel: - name: Build release wheels for macOS arm64 - runs-on: macos-11 - strategy: - matrix: - python-version: [3.8] - fail-fast: false - steps: - # Caches and restores the bazelisk download directory, the bazel build directory. - - name: Cache bazel - uses: actions/cache@v2.1.4 - env: - cache-name: bazel-cache - with: - path: | - ~/.cache/bazelisk - ~/.cache/bazel - key: ${{ runner.os }}-arm-${{ env.cache-name }} - - uses: actions/checkout@v2 - with: - submodules: recursive - - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - name: Build macOS arm wheels - env: - XMOS_AI_TOOLS_RELEASE_VERSION: ${{ env.TAG_VERSION }} - shell: bash - run: | - python --version - python -m pip install wheel setuptools numpy six --no-cache-dir - - cd third_party/lib_tflite_micro - make build - - cd ../../experimental/xformer - bazelisk build //:xcore-opt --copt=-fvisibility=hidden --copt=-mmacosx-version-min=11.0 --linkopt=-mmacosx-version-min=11.0 --linkopt=-dead_strip - - cd python - python setup.py bdist_wheel --plat-name macosx_11_0_arm64 - - - uses: actions/upload-artifact@v2 - with: - name: ${{ runner.os }}-arm-wheels - path: experimental/xformer/python/dist - - - - manylinux-release-wheel: - name: Build release wheels for manylinux2010 - runs-on: ubuntu-18.04 - strategy: - matrix: - python-version: [3.8] - fail-fast: false - steps: - # Caches and restores the bazelisk download directory, the bazel build directory. - - name: Cache bazel - uses: actions/cache@v2.1.4 - env: - cache-name: bazel-cache - with: - path: | - ~/.cache/bazelisk - ~/.cache/bazel - key: ${{ runner.os }}-${{ env.cache-name }} - - uses: actions/checkout@v2 - with: - submodules: recursive - - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - name: Build manylinux2010 wheels - # The XMOS_AI_TOOLS_RELEASE_VERSION var is passed via docker to the - # python setup.py script to add the version info for the wheel file. - # - # auditwheel requires patchelf and repairs the created wheel file to - # be compatible for manylinux. - run: | - docker run -e XMOS_AI_TOOLS_RELEASE_VERSION=${{ env.TAG_VERSION }} \ - -v ${PWD}:/ai_tools -w /ai_tools \ - tensorflow/build:latest-python${{ matrix.python-version }} \ - .github/scripts/build_linux_wheel.sh - - sudo apt-get -y -qq install patchelf --no-install-recommends - python -m pip install auditwheel --no-cache-dir - cd experimental/xformer/python - for f in dist/*.whl; do - auditwheel repair --plat manylinux2010_x86_64 $f - done - - - uses: actions/upload-artifact@v2 - with: - name: ${{ runner.os }}-wheels - # auditwheel creates the output wheel in the wheelhouse folder - path: experimental/xformer/python/wheelhouse - - - - publish-wheels: - name: Publish wheels to TestPyPi - if: ${{ always() }} - needs: [macos-release-wheel, macos-arm-release-wheel, manylinux-release-wheel] - runs-on: ubuntu-latest - steps: - - uses: actions/download-artifact@v2 - with: - name: macOS-wheels - path: macOS-wheels - if: ${{ needs.macos-release-wheel.result == 'success' }} - - uses: actions/download-artifact@v2 - with: - name: macOS-arm-wheels - path: macOS-arm-wheels - if: ${{ needs.macos-arm-release-wheel.result == 'success' }} - - uses: actions/download-artifact@v2 - with: - name: Linux-wheels - path: Linux-wheels - if: ${{ needs.manylinux-release-wheel.result == 'success' }} - - run: | - set -x - mkdir -p dist - cp macOS-wheels/*.whl dist/ || true - cp macOS-arm-wheels/*.whl dist/ || true - cp Linux-wheels/*.whl dist/ || true - ls -la dist/ - sha256sum dist/*.whl - - name: Publish packages to TestPyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - user: __token__ - password: ${{ secrets.TEST_PYPI_API_TOKEN }} - repository_url: https://test.pypi.org/legacy/ diff --git a/.gitignore b/.gitignore index 6531a7017..c896353cb 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ **/*.eggs/* Pipfile.lock ai_tools_venv/* -experimental/xformer/.venv +xformer/.venv # Build cruft **/.lock* @@ -23,9 +23,15 @@ _build *.so* *.dylib /.bazelrc.user +.bazelrc.user /.tf_configure.bazelrc /bazel-* /bazel_pip +compile_commands.json +.cache +wheels/ +python/xmos_ai_tools/runtime/lib +python/xmos_ai_tools/runtime/include # Test cruft **/.pytest_cache/* @@ -49,12 +55,61 @@ _build # Models/training *.h5 -*.tflite *.html *training_history.png +xformer/model_maker/*.tflite # Others *.npz *.y *.x +**/notebooks/**/*.jpeg +**/notebooks/**/*.jpg +**/notebooks/**/*.txt.* + +# £xamples +examples/app_no_flash/model.tflite +examples/app_no_flash/src/model.tflite.cpp +examples/app_no_flash/src/model.tflite.h +examples/app_no_flash_with_ioserver/src/model.tflite +examples/app_no_flash_with_ioserver/src/model.tflite.cpp +examples/app_no_flash_with_ioserver/src/model.tflite.h +examples/app_flash_single_model/model.params +examples/app_flash_single_model/model.tflite +examples/app_flash_single_model/src/model.tflite.cpp +examples/app_flash_single_model/src/model.tflite.h +examples/app_flash_single_model/xcore_flash_binary.out +examples/app_flash_two_models/model1.params +examples/app_flash_two_models/model1.tflite +examples/app_flash_two_models/model2.params +examples/app_flash_two_models/model2.tflite +examples/app_flash_two_models/src/model1.tflite.cpp +examples/app_flash_two_models/src/model1.tflite.h +examples/app_flash_two_models/src/model2.tflite.cpp +examples/app_flash_two_models/src/model2.tflite.h +examples/app_flash_two_models/xcore_flash_binary.out +examples/app_flash_two_models_one_arena/model1.params +examples/app_flash_two_models_one_arena/model1.tflite +examples/app_flash_two_models_one_arena/model2.params +examples/app_flash_two_models_one_arena/xcore_flash_binary.out +examples/app_flash_two_models_one_arena/model2.tflite +examples/app_flash_two_models_one_arena/src/model1.tflite.cpp +examples/app_flash_two_models_one_arena/src/model1.tflite.h +examples/app_flash_two_models_one_arena/src/model2.tflite.cpp +examples/app_flash_two_models_one_arena/src/model2.tflite.h +examples/app_flash_two_models_one_arena/xcore_flash_binary.out +examples/app_mobilenetv2/src/model.tflite +examples/app_mobilenetv2/src/model.tflite.cpp +examples/app_mobilenetv2/src/model.tflite.h +examples/app_mobilenetv2/src/model_flash.params +examples/app_mobilenetv2/xcore_flash_binary.out +examples/app_mobilenetv2/mobilenetv2.tflite +examples/app_yolov8_classification/src/model.tflite +examples/app_yolov8_classification/src/model.tflite.cpp +examples/app_yolov8_classification/src/model.tflite.h +examples/app_yolov8_classification/src/model_flash.params +examples/app_yolov8_classification/xcore_flash_binary.out +examples/app_yolov8_classification/yolov8n-cls.onnx +examples/app_yolov8_classification/yolov8n-cls.pt +examples/app_yolov8_classification/yolov8n-cls_saved_model/ diff --git a/.gitmodules b/.gitmodules index 098d5b82e..599603d55 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,10 +1,9 @@ -[submodule "third_party/flatbuffers"] - path = third_party/flatbuffers - url = git@github.com:google/flatbuffers.git - ignore = dirty [submodule "third_party/lib_tflite_micro"] path = third_party/lib_tflite_micro url = git@github.com:xmos/lib_tflite_micro.git [submodule "third_party/lib_nn"] path = third_party/lib_nn url = git@github.com:xmos/lib_nn.git +[submodule "third_party/lib_xud"] + path = third_party/lib_xud + url = git@github.com:xmos/lib_xud.git diff --git a/Dockerfile b/Dockerfile index 656dd1961..ac19a9856 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,47 +1,2 @@ -FROM continuumio/miniconda3:4.10.3 - -# This Dockerfile is for use by the XMOS CI system -# It provides a minimal environment needed to execute the Jenkinsfile -# Most of the dependecies here are handled conda so we only include: -# - conda setup -# - xmos tools setup - -# fix conda perms and config -RUN chmod -R 777 /opt/conda \ - && mkdir -p /.conda \ - && chmod -R 777 /.conda \ - && conda init \ - && conda config --set auto_activate_base false - -# install tools lib dependencies -RUN apt-get update && apt-get install -y \ - libncurses5 libncurses5-dev \ - tcl environment-modules \ - && apt-get clean autoclean - -# install clang -RUN apt-get update && apt-get install -y \ - gnupg lsb-release software-properties-common -ADD https://apt.llvm.org/llvm.sh /tmp/ -ARG clang_version=12 -RUN cd /tmp \ - && chmod +x llvm.sh \ - && ./llvm.sh $clang_version all -RUN ln -s /usr/bin/clang-$clang_version /usr/bin/clang \ - && ln -s /usr/bin/clang++-$clang_version /usr/bin/clang++ \ - && ln -s /usr/bin/clang /usr/bin/cc \ - && ln -s /usr/bin/clang++ /usr/bin/c++ - -# install get_tools.py script -# requires connection to XMOS network at build and run time -# if not possible, find another way to install the tools -RUN mkdir -m 777 /XMOS -ADD https://github0.xmos.com/raw/xmos-int/get_tools/master/get_tools.py /XMOS/ -RUN cd /XMOS \ - && chmod 755 get_tools.py \ - && echo "export PATH=$PATH:/XMOS" \ - >> /etc/profile.d/xmos_tools.sh \ - && chmod a+x /etc/profile.d/xmos_tools.sh - -# set login shell -SHELL ["/bin/bash", "-l", "-c"] +FROM tensorflow/build:2.15-python3.11 +RUN pip install setuptools~=70.0 setuptools-scm diff --git a/Jenkinsfile b/Jenkinsfile index 22e62a588..855478400 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,110 +1,396 @@ -@Library('xmos_jenkins_shared_library@v0.14.2') _ +// Things to optimise if this is too slow: +// -build device runtime in parallel with host runtimes, use mutex before combining into wheel -getApproval() +@Library('xmos_jenkins_shared_library@v0.30.0') _ -pipeline { - agent { - dockerfile { - args "-v /home/jenkins/.keras:/root/.keras -v /etc/passwd:/etc/passwd:ro" - } - } +if (env.job_type != 'beta_release' && env.job_type != 'official_release') { + getApproval() +} - parameters { // Available to modify on the job page within Jenkins if starting a build - string( // use to try different tools versions - name: 'TOOLS_VERSION', - defaultValue: '15.0.6', - description: 'The tools version to build with (check /projects/tools/ReleasesTools/)' - ) - booleanParam( // use to check results of rolling all conda deps forward - name: 'UPDATE_ALL', - defaultValue: false, - description: 'Update all conda packages before building' - ) - } +def sh_bat(cmd) { + if (isUnix()) { + sh cmd + } else { + bat cmd + } +} + +def setupRepo() { + println "Stage running on: ${env.NODE_NAME}" + checkout scm + sh_bat 'git submodule update --init --recursive --jobs 4' + sh_bat 'make -C third_party/lib_tflite_micro patch' +} + +def createDeviceZip() { + dir('xformer') { sh './version_check.sh' } + dir('third_party/lib_tflite_micro/build') { + sh 'cmake .. --toolchain=../lib_tflite_micro/submodules/xmos_cmake_toolchain/xs3a.cmake' + sh 'make create_zip -j8' + } +} + +def buildXinterpreterAndHostLib() { + dir('python/xmos_ai_tools/xinterpreters/build') { + sh_bat 'cmake ..' + sh_bat 'cmake --build . -t install --parallel 8 --config Release' + } +} + +def extractDeviceZipAndHeaders() { + dir('python/xmos_ai_tools/runtime') { + unstash 'release_archive' + sh_bat 'unzip -o release_archive.zip' + } +} + +def runPytestDevice(String test, String args, String junit) { + timeout(time: 60, unit: 'MINUTES') { + sh 'xtagctl reset_all XCORE-AI-EXPLORER' + sh "pytest integration_tests/runner.py --models_path integration_tests/models/${test} ${args} --device --junitxml=integration_tests/integration_device_${junit}_junit.xml" + } +} + +def runPytestHost(String test, String args, String junit) { + sh "pytest integration_tests/runner.py --models_path integration_tests/models/${test} ${args} --junitxml=integration_tests/integration_host_${junit}_junit.xml" +} - options { // plenty of things could go here - timestamps() - // on develop discard builds after a certain number else keep forever - buildDiscarder(logRotator( - numToKeepStr: env.BRANCH_NAME ==~ /develop/ ? '100' : '', - artifactNumToKeepStr: env.BRANCH_NAME ==~ /develop/ ? '100' : '' - )) +def dailyDeviceTest = { + timeout(time: 20, unit: 'MINUTES') { + sh 'xtagctl reset_all XCORE-AI-EXPLORER' + sh 'pytest examples/app_mobilenetv2' + } + runPytestDevice('8x8/test_broadcast', '-n 1 --tc 1', 'broadcast_1') + runPytestDevice('16x8/test_transpose', '-n 1', '16x8_transpose') + runPytestDevice('8x8/test_concatenate', '-n 1 --tc 5', 'concat_5') + runPytestDevice('8x8/test_mean', '-n 1 --tc 1', 'mean_1') + runPytestDevice('16x8/test_mean', '-n 1 --tc 1', '16x8_mean_1') + runPytestDevice('8x8/test_lstm', '-n 1 --tc 1', 'lstm_1') + runPytestDevice('8x8/test_lstm', '-n 1', 'lstm_5') + runPytestDevice('complex_models/8x8/test_cnn_classifier', '-n 1 --tc 1', 'cnn_classifier_1') + runPytestDevice('complex_models/8x8/test_cnn_classifier', '-n 1', 'cnn_classifier_5') + runPytestDevice('8x8/test_softmax', '-n 1 --device', 'softmax_5') + runPytestDevice('8x8/test_detection_postprocess', '-n 1', 'detection_postprocess_5') + runPytestDevice('16x8/test_conv2d', '-n 1', '16x8_conv2d_5') + runPytestDevice('16x8/test_transpose_conv', '-n 1', '16x8_transpose_conv_5') +} + +def dailyHostTest = { platform -> + runPytestHost('float32', '-n 8 --tc 1', 'float32_1') + runPytestHost('16x8', '-n 8 --tc 5', '16x8_5') + runPytestHost('complex_models/8x8', '-n 2 --tc 5', 'complex_8x8_5') + runPytestHost('complex_models/float32', '-n 1 --tc 5', 'complex_float32_5') + runPytestHost('8x8', '-n 8 --tc 1', '8x8_1') + runPytestHost('8x8', '-n 8', '8x8_5') + if (platform != 'windows') { + // TODO - fix bnn tests on Windows + runPytestHost('bnns', '--bnn -n 8', 'bnns') + // TODO - fix compiled tests on Windows + runPytestHost('8x8', '--compiled -n 8', 'compiled_8x8') + runPytestHost('bnns', '--bnn --compiled -n 8', 'compiled_bnns') + runPytestHost('complex_models/8x8/test_mobilenet_v2', '--compiled -n 8', 'compiled_mobilenetv2') + } +} + +def runTests(String platform, Closure body) { + setupRepo() + createVenv('requirements.txt') + withVenv { + sh 'pip install -r requirements.txt' + dir('python') { + if (platform == 'linux' | platform == 'device') { + unstash 'linux_wheel' + } else if (platform == 'mac') { + unstash 'mac_wheel' + } else if (platform == 'windows') { + unstash 'windows_wheel' + } + sh 'pip install dist/*' + } + script { + XMOS_AITOOLSLIB_PATH = sh(script: 'python -c \"import xmos_ai_tools.runtime as rt; import os; print(os.path.dirname(rt.__file__))\"', returnStdout: true).trim() + env.XMOS_AITOOLSLIB_PATH = XMOS_AITOOLSLIB_PATH } + if (platform == 'device') { + sh "cd ${WORKSPACE} && git clone https://github0.xmos.com/xmos-int/xtagctl.git" + sh "pip install -e ${WORKSPACE}/xtagctl" + withTools(params.TOOLS_VERSION) { + body(platform) + } + } else if (platform == 'linux' | platform == 'mac' | platform == 'windows') { + body(platform) + } + junit '**/*_junit.xml' + } +} + +pipeline { + agent none + environment { + REPO = 'ai_tools' + BAZEL_CACHE_URL = 'http://srv-bri-bld-cache.xmos.local:8080' + BAZEL_USER_ROOT = "${WORKSPACE}/.bazel/" + } + parameters { // Available to modify on the job page within Jenkins if starting a build + string( // use to try different tools versions + name: 'TOOLS_VERSION', + defaultValue: '15.3.1', + description: 'The tools version to build with (check /projects/tools/ReleasesTools/)' + ) + } - stages { - stage("Setup") { - // Clone and install build dependencies - steps { - // clean auto default checkout - sh "rm -rf *" - // clone - checkout([ - $class: 'GitSCM', - branches: scm.branches, - doGenerateSubmoduleConfigurations: false, - extensions: [[$class: 'SubmoduleOption', - threads: 8, - timeout: 20, - shallow: true, - parentCredentials: true, - recursiveSubmodules: true], - [$class: 'CleanCheckout']], - userRemoteConfigs: [[credentialsId: 'xmos-bot', - url: 'git@github.com:xmos/ai_tools']] - ]) - // create venv and install pip packages - sh "conda env create -q -p ai_tools_venv -f ./environment.yml" - sh """. activate ./ai_tools_venv && - pip install -e "./tflite2xcore[test,examples]" - """ - // Install xmos tools version - sh "/XMOS/get_tools.py " + params.TOOLS_VERSION + options { + timestamps() + skipDefaultCheckout() + buildDiscarder(xmosDiscardBuildSettings()) + } + stages { stage('On PR') { + when { anyOf { branch pattern: 'PR-.*', comparator: 'REGEXP'; expression { env.job_type == 'beta_release' || env.job_type == 'official_release' } } } + agent { label 'linux && x86_64 && !noAVX2' } + stages { + stage('Build device runtime') { + steps { + setupRepo() + createVenv('requirements.txt') + withVenv { sh 'pip install -r requirements.txt' } + withVenv { withTools(params.TOOLS_VERSION) { createDeviceZip() } } + dir('third_party/lib_tflite_micro/build/') { + stash name: 'release_archive', includes: 'release_archive.zip' } + } + post { + unsuccessful { xcoreCleanSandbox() } + } } - stage("Update all packages") { - // Roll all conda packages forward beyond their pinned versions - when { expression { return params.UPDATE_ALL } } - steps { - sh "conda update --all -y -q -p ai_tools_venv" + stage('Build host wheels') { + parallel { + stage('Build linux runtime') { + steps { + extractDeviceZipAndHeaders() + script { + def customImage = docker.build("tensorflow-image-with-updated-pip:${env.BUILD_ID}") + USER_ID = sh(script: 'id -u', returnStdout: true).trim() + withEnv(['USER=' + USER_ID, "XDG_CACHE_HOME=${env.WORKSPACE}/.cache", "TEST_TMPDIR=${env.WORKSPACE}/.cache", "TMPDIR=${env.WORKSPACE}/.cache"]) { + customImage.inside() { + sh 'curl -LO https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-linux-x86_64.sh' + sh 'chmod +x cmake-3.28.3-linux-x86_64.sh' + sh "bash cmake-3.28.3-linux-x86_64.sh --skip-license --prefix=${env.WORKSPACE}" + sh './bin/cmake --version' + CMAKE_PATH = sh(script: 'pwd', returnStdout: true).trim() + '/bin' + sh 'git describe --tags' + // Build Xinterpreter and Host lib + // Instead of using buildXinterpreterAndHostLib(), we are building it + // directly here as we want to specify the compiler + sh "PATH=${CMAKE_PATH}:${env.PATH} CC=/dt9/usr/bin/gcc CXX=/dt9/usr/bin/g++ ./build.sh -T xinterpreter-nozip -b" + dir('xformer') { + sh 'curl -LO https://github.com/bazelbuild/bazelisk/releases/download/v1.19.0/bazelisk-linux-amd64' + sh 'chmod +x bazelisk-linux-amd64' + sh """ + ./bazelisk-linux-amd64 build //:xcore-opt \\ + --verbose_failures \\ + --linkopt=-lrt \\ + --crosstool_top="@sigbuild-r2.14-clang_config_cuda//crosstool:toolchain" \\ + --remote_cache=${env.BAZEL_CACHE_URL} \\ + --//:disable_version_check \\ + --jobs 8 \\ + --define SETUPTOOLS_SCM_VERSION=\$(python -m setuptools_scm -c ../python/pyproject.toml) + """ + sh ''' + ./bazelisk-linux-amd64 test //Test:all \\ + --verbose_failures \\ + --test_output=errors \\ + --crosstool_top="@sigbuild-r2.14-clang_config_cuda//crosstool:toolchain" \\ + --//:disable_version_check + ''' + } + dir('python') { + script { + if (env.job_type == 'official_release') { + withEnv(["SETUPTOOLS_SCM_PRETEND_VERSION=${env.TAG_VERSION}"]) { + sh 'python setup.py bdist_wheel' + } + } else { + sh 'python setup.py bdist_wheel' + } + } + } + } + } + withVenv { dir('python') { + sh 'pip install patchelf auditwheel==5.2.0 --no-cache-dir' + sh 'auditwheel repair --plat manylinux2014_x86_64 dist/*.whl' + sh 'rm dist/*.whl' + sh 'mv wheelhouse/*.whl dist/' + stash name: 'linux_wheel', includes: 'dist/*' + } } + } + } + post { unsuccessful { xcoreCleanSandbox() } } } - } - stage("Build") { - steps { - // below is how we can activate the tools, NOTE: xTIMEcomposer -> XTC at tools 15.0.5 and later - // sh """. /XMOS/tools/${params.TOOLS_VERSION}/XMOS/XTC/${params.TOOLS_VERSION}/SetEnv && // - sh """. /XMOS/tools/${params.TOOLS_VERSION}/XMOS/XTC/${params.TOOLS_VERSION}/SetEnv && - . activate ./ai_tools_venv && - make clean && - make build - """ - sh ". activate ./ai_tools_venv && make tflite2xcore_dist" - sh """. activate ./ai_tools_venv && cd experimental/xformer && - bazel build --client_env=CC=clang --remote_cache=http://srv-bri-bld-cache:8080 //:xcore-opt --verbose_failures - """ - sh """. activate ./ai_tools_venv && - pip install -e "./third_party/lib_tflite_micro/xtflm_interpreter[test]" - """ + stage('Build Windows runtime') { + agent { label 'ai && windows10' } + steps { + withVS() { + setupRepo() + extractDeviceZipAndHeaders() + buildXinterpreterAndHostLib() + createVenv('requirements.txt') + withVenv { + bat 'pip install wheel setuptools setuptools-scm numpy six --no-cache-dir' + dir('xformer') { + bat 'curl -LO https://github.com/bazelbuild/bazelisk/releases/download/v1.19.0/bazelisk-windows-amd64.exe' + script { + bat 'bazelisk-windows-amd64.exe clean --expunge' + PYTHON_BIN_PATH = bat(script: '@where python.exe', returnStdout: true).split()[0].trim() + bat "for /f %%i in ('python -m setuptools_scm -c ..\\python\\pyproject.toml') do bazelisk-windows-amd64.exe --output_user_root c:\\jenkins\\_bzl build //:xcore-opt --//:disable_version_check --remote_cache=${env.BAZEL_CACHE_URL} --action_env PYTHON_BIN_PATH=\"${PYTHON_BIN_PATH}\" --action_env BAZEL_VC=\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\VC\" --define SETUPTOOLS_SCM_VERSION=%%i" + } + } + + dir('python') { + script { + if (env.job_type == 'official_release') { + withEnv(["SETUPTOOLS_SCM_PRETEND_VERSION=${env.TAG_VERSION}"]) { + bat 'python setup.py bdist_wheel' + } + } else { + bat 'python setup.py bdist_wheel' + } + } + stash name: 'windows_wheel', includes: 'dist/*' + } + } + } + } + post { cleanup { + dir('xformer') { + bat 'bazelisk-windows-amd64.exe clean --expunge' + bat 'bazelisk-windows-amd64.exe shutdown' + script { + HANGING_BAZEL_EMBEDDED_JAVA_PID = bat(script: '@ps -W | grep _bzl | tr -s \" \" | cut -d \" \" -f 5', returnStdout: true).split()[0].trim() + bat "taskkill /F /PID \"${HANGING_BAZEL_EMBEDDED_JAVA_PID}\"" + } + } + xcoreCleanSandbox() } } } + stage('Build Mac runtime') { + agent { label 'macos && arm64 && xcode' } + steps { + setupRepo() + extractDeviceZipAndHeaders() + buildXinterpreterAndHostLib() + // TODO: Fix this, use a rule for the fat binary instead of manually combining + createVenv('requirements.txt') + dir('xformer') { withVenv { + sh 'pip install wheel setuptools setuptools-scm numpy six --no-cache-dir' + sh 'curl -LO https://github.com/bazelbuild/bazelisk/releases/download/v1.19.0/bazelisk-darwin-arm64' + sh 'chmod +x bazelisk-darwin-arm64' + script { + def compileAndRename = { arch -> + def cpuFlag = arch == 'arm64' ? 'darwin_arm64' : 'darwin_x86_64' + def outputName = "xcore-opt-${arch}" + sh """ + ./bazelisk-darwin-arm64 build //:xcore-opt \\ + --cpu=${cpuFlag} \\ + --remote_cache=${env.BAZEL_CACHE_URL} \\ + --copt=-fvisibility=hidden \\ + --copt=-mmacosx-version-min=10.15 \\ + --linkopt=-mmacosx-version-min=10.15 \\ + --linkopt=-dead_strip \\ + --//:disable_version_check \\ + --define SETUPTOOLS_SCM_VERSION=\$(python -m setuptools_scm -c ../python/pyproject.toml) + mv bazel-bin/xcore-opt ${outputName} + """ + } + compileAndRename('arm64') + compileAndRename('x86_64') + } + sh 'lipo -create xcore-opt-arm64 xcore-opt-x86_64 -output bazel-bin/xcore-opt' + } } + dir('python') { withVenv { + script { + if (env.job_type == 'official_release') { + withEnv(["SETUPTOOLS_SCM_PRETEND_VERSION=${env.TAG_VERSION}"]) { + sh 'python setup.py bdist_wheel --plat macosx_10_15_universal2' + } + } else { + sh 'python setup.py bdist_wheel --plat macosx_10_15_universal2' + } + } + stash name: 'mac_wheel', includes: 'dist/*' + } } + } + post { cleanup { xcoreCleanSandbox() } } + } + } } - stage("Test") { - steps { - // xformer2 unit tests - sh """. activate ./ai_tools_venv && cd experimental/xformer && - bazel test --client_env=CC=clang --remote_cache=http://srv-bri-bld-cache:8080 //Test:all --verbose_failures - """ - // xformer2 integration tests - sh """. activate ./ai_tools_venv && - make xformer2_integration_test NUM_PROCS=\$(grep -c ^processor /proc/cpuinfo) - """ - // Any call to pytest can be given the "--junitxml SOMETHING_junit.xml" option - // This step collects these files for display in Jenkins UI - junit "**/*_junit.xml" + stage('Test') { + when { + expression { env.job_type != 'beta_release' && env.job_type != 'official_release' } + } + parallel { + stage('Linux Test') { steps { script { + runTests('linux', dailyHostTest) + withVenv { + sh 'pip install pytest nbmake' + sh 'pytest --nbmake ./docs/notebooks/*.ipynb' + } + } } } + stage('Mac arm64 Test') { + agent { label 'macos && arm64 && !macos_10_14' } + steps { script { + runTests('mac', dailyHostTest) + } } + post { cleanup { xcoreCleanSandbox() } } + } + // TODO Too old MacOS version + // stage("Mac x86_64 Test") { + // agent { label "macos && x86_64" } + // steps { script { + // runTests("mac", dailyHostTest) + // } } + // post { cleanup {xcoreCleanSandbox() } } + // } + stage('Windows Test') { + agent { label 'ai && windows10' } + steps { script { + runTests('windows', dailyHostTest) + } } + post { cleanup { xcoreCleanSandbox() } } } + stage('Device Test') { + agent { label 'xcore.ai-explorer && lpddr && !macos' } + steps { script { runTests('device', dailyDeviceTest) } } + post { + always { + archiveArtifacts artifacts: 'examples/app_mobilenetv2/arena_sizes.csv', allowEmptyArchive: true + } + cleanup { xcoreCleanSandbox() } + } + } + } } - } - post { - cleanup { - cleanWs() + stage('Publish') { + when { + expression { env.job_type == 'beta_release' || env.job_type == 'official_release' } + } + steps { + script { + dir('python') { + unstash 'linux_wheel' + unstash 'mac_wheel' + unstash 'windows_wheel' + archiveArtifacts artifacts: 'dist/*', allowEmptyArchive: true + withVenv { + withCredentials([usernamePassword(credentialsId: '__CREDID__', usernameVariable: 'TWINE_USERNAME', passwordVariable: 'TWINE_PASSWORD')]) { + sh 'pip install twine' + sh 'twine upload dist/*' + } + } + } + } + } } - } + } + post { cleanup { xcoreCleanSandbox() } } + } } } diff --git a/Makefile b/Makefile deleted file mode 100644 index 2b8547a1f..000000000 --- a/Makefile +++ /dev/null @@ -1,168 +0,0 @@ -NUM_PROCS := 4 - -.DEFAULT_GOAL := help - -#************************** -# xcore_interpreter targets -#************************** - -.PHONY: xcore_interpreters_build -xcore_interpreters_build: - cd third_party/lib_tflite_micro/ && make build - -#************************** -# tflite2xcore targets -#************************** - -.PHONY: lib_flexbuffers_build -lib_flexbuffers_build: - cd utils/lib_flexbuffers && bash build.sh - -.PHONY: tflite2xcore_unit_test -tflite2xcore_unit_test: - tflite2xcore/tflite2xcore/tests/runtests.py tflite2xcore/tflite2xcore/tests -n $(NUM_PROCS) --junit - -.PHONY: tflite2xcore_dist -tflite2xcore_dist: - cd tflite2xcore && bash build_dist.sh - -#************************** -# integration test targets -#************************** - -.PHONY: integration_test -integration_test: - cd test && pytest integration_test --cache-clear --collect-only -qq - cd test && pytest integration_test -n $(NUM_PROCS) --dist loadfile --junitxml=integration_junit.xml - -.PHONY: xformer2_test -xformer2_integration_test: - cd test && pytest integration_test --cache-clear --collect-only -qq - # conv2d tests - cd test && pytest integration_test/test_single_op_models/test_conv2d --only-experimental-xformer2 -n $(NUM_PROCS) --dist loadfile --junitxml=integration_junit.xml - # bnn tests - cd test && pytest integration_test/test_single_op_models/test_binarized --only-experimental-xformer2 -n $(NUM_PROCS) --dist loadfile --junitxml=integration_junit.xml - -#************************** -# default build and test targets -#************************** - -.PHONY: build -build: lib_flexbuffers_build xcore_interpreters_build - -.PHONY: test -test: tflite2xcore_unit_test integration_test - -#************************** -# other targets -#************************** - -.PHONY: submodule_update -submodule_update: - git submodule update --init --recursive - -.PHONY: clean -clean: - cd third_party/lib_tflite_micro/ && make clean - rm -rf utils/lib_flexbuffers/build - -.PHONY: help -help: - @: # This silences the "Nothing to be done for 'help'" output - $(info usage: make [target]) - $(info ) - $(info ) - $(info primary targets:) - $(info build Build all components) - $(info test Run all tests (requires tflite2xcore[test] package)) - $(info clean Clean all build artifacts) - $(info ) - $(info secondary targets:) - $(info lib_flexbuffers_build Build lib_flexbuffers) - $(info xcore_interpreters_build Build xcore_interpreters) - $(info tflite2xcore_unit_test Run tflite2xcore unit tests (requires tflite2xcore[test] package)) - $(info tflite2xcore_dist Build tflite2xcore distribution (requires tflite2xcore[test] package)) - $(info integration_test Run integration tests (requires tflite2xcore[test] package)) - $(info xformer2_test Run integration tests with xformer2 (experimental requires tflite2xcore[test] package)) - $(info ) - -.PHONY: init_linux -init_linux: - export BAZEL_VERSION=`cat experimental/xformer/.bazelversion` ;\ - curl -fLO "https://github.com/bazelbuild/bazel/releases/download/$${BAZEL_VERSION}/bazel-$${BAZEL_VERSION}-installer-linux-x86_64.sh" && \ - chmod +x bazel-$${BAZEL_VERSION}-installer-linux-x86_64.sh && \ - ./bazel-$${BAZEL_VERSION}-installer-linux-x86_64.sh --prefix=$$PWD/bazel - -.PHONY: init_darwin -init_darwin: - export BAZEL_VERSION=`cat experimental/xformer/.bazelversion` ;\ - curl -fLO "https://github.com/bazelbuild/bazel/releases/download/$${BAZEL_VERSION}/bazel-$${BAZEL_VERSION}-installer-darwin-x86_64.sh" && \ - chmod +x bazel-$${BAZEL_VERSION}-installer-darwin-x86_64.sh && \ - ./bazel-$${BAZEL_VERSION}-installer-darwin-x86_64.sh --prefix=$$PWD/bazel - -.PHONY: init_windows -init_windows: - export BAZEL_VERSION=`cat experimental/xformer/.bazelversion` ;\ - curl -fLO 'https://github.com/bazelbuild/bazel/releases/download/${BAZEL_VERSION}/bazel-${BAZEL_VERSION}-windows-x86_64.exe' - mv bazel-${BAZEL_VERSION}-windows-x86_64.exe bazel.exe - -.PHONY: build_release_linux -build_release_linux: - ( module unload python && \ - module load python/python-3.8.1 && \ - module unload gcc && \ - module load gcc/gcc-11.2.0 && \ - module unload cmake && \ - module load cmake/cmake-3.21.4 && \ - python3 -m venv .venv && \ - . .venv/bin/activate && \ - pip install -r requirements.txt && \ - cd experimental/xformer && ../../bazel/bin/bazel build --remote_cache=http://srv-bri-bld-cache:8080 //:xcore-opt --verbose_failures) - rm -rf ../Installs/Linux/External/xformer - mkdir -p ../Installs/Linux/External/xformer - cp experimental/xformer/bazel-bin/xcore-opt ../Installs/Linux/External/xformer - -.PHONY: build_release_darwin -build_release_darwin: - ( python3 -m venv .venv && \ - . .venv/bin/activate && \ - pip3 install --upgrade pip && \ - pip3 install -r requirements.txt && \ - cd experimental/xformer && ../../bazel/bin/bazel build --remote_cache=http://srv-bri-bld-cache:8080 --config=darwin_config //:xcore-opt --verbose_failures) - rm -rf ../Installs/Mac/External/xformer - mkdir -p ../Installs/Mac/External/xformer - cp experimental/xformer/bazel-bin/xcore-opt ../Installs/Mac/External/xformer - -.PHONY: build_release_windows -build_release_windows: - python3 -m venv .venv - (. .venv/bin/activate && pip install -r requirements.txt) - (. .venv/bin/activate && cd experimental/xformer && ../../bazel build --remote_cache=http://srv-bri-bld-cache:8080 --config=windows_config //:xcore-opt --verbose_failures) - mkdir -p ../Installs/Linux/External/xformer - cp experimental/xformer/bazel-bin/xcore-opt ../Installs/Windows/External/xformer - -TEST_SCRIPT= \ -(cd utils/lib_flexbuffers && bash build.sh) && \ -make tflite2xcore_dist&& \ -pip install -e "./tflite2xcore[test]"&& \ -(cd third_party/lib_tflite_micro/ && make build)&& \ -pip install -e "./third_party/lib_tflite_micro/xtflm_interpreter[test]"&& \ -(cd experimental/xformer && ../../bazel/bin/bazel test --remote_cache=http://srv-bri-bld-cache:8080 //Test:all --verbose_failures)&& \ -(cd test && pytest integration_test --cache-clear --collect-only -qq&& \ -pytest integration_test/test_single_op_models/test_conv2d --only-experimental-xformer2 -n $(NUM_PROCS) --dist loadfile --junitxml=integration_junit.xml) - -.PHONY: test_linux -test_linux: - (. .venv/bin/activate && \ - module unload python && \ - module load python/python-3.8.1 && \ - module unload gcc && \ - module load gcc/gcc-11.2.0 && \ - module unload cmake && \ - module load cmake/cmake-3.21.4 && \ - ${TEST_SCRIPT} ) - -.PHONY: test_darwin -test_darwin: - (. .venv/bin/activate && \ - ${TEST_SCRIPT} ) diff --git a/README.md b/README.md index 4fe69b5e6..9ace915a9 100644 --- a/README.md +++ b/README.md @@ -1,84 +1,112 @@ -AI/ML tools repository -====================== +Documentation +============= -Summary -------- +## Index +- [Run models on XCORE.AI](docs/rst/flow.rst) +- [Run models via Python on host](#using-xmos-ai-tools-from-python) +- [Examples](examples/README.rst) +- [Graph transformer command-line options](docs/rst/options.rst) +- [Transforming Pytorch models](docs/rst/pytorch.rst) +- [FAQ](docs/rst/faq.rst) +- [Changelog](docs/rst/changelog.rst) +- Advanced topics + - [Detailed background to deploying on the edge using XCORE.AI](docs/rst/xcore-ai-coding.rst) + - [Building the graph transformer and xmos-ai-tools package](docs/rst/build-from-source.rst) -Installation ------------- -Some dependent libraries are included as git submodules. -These can be obtained by cloning this repository with the following commands: -```shell -git clone git@github.com:xmos/ai_tools.git -cd ai_tools -make submodule_update -``` +## Installing xmos-ai-tools -Install at least version 15 of the XMOS tools from your preferred location and activate it by sourcing `SetEnv` in the installation root. +``xmos-ai-tools`` is available on [PyPI](https://pypi.org/project/xmos-ai-tools/). +It includes: -[CMake 3.14](https://cmake.org/download/) or newer is required for building libraries and test firmware. -A correct version of CMake (and `make`) is included in the Conda environment file, utils/environment.yml. -To set up and activate the environment, simply run: -```shell -conda env create -p ./ai_tools_venv -f environment.yml -conda activate ai_tools_venv/ -``` +* the MLIR-based XCore optimizer(xformer) to optimize Tensorflow Lite models for XCore +* the XCore tflm interpreter to run the transformed models on host + + +Perform the following steps once: -If installing on a machine with CUDA GPUs, follow the instructions at https://www.tensorflow.org/install/gpu#software_requirements to install the necessary drivers and libraries. ```shell -TODO: add and test instructions for GPU builds. +# Create a virtual environment with +python3 -m venv + +# Activate the virtual environment +# On Windows, run: +\Scripts\activate.bat +# On Linux and MacOS, run: +source /bin/activate + +# Install xmos-ai-tools from PyPI +pip3 install xmos-ai-tools --upgrade ``` +Use ``pip3 install xmos-ai-tools --pre --upgrade`` instead if you want to install the latest beta version. + + +## Using xmos-ai-tools from Python + +```python +from xmos_ai_tools import xformer as xf + +# Optimizes the source model for xcore +# The main method in xformer is convert, which requires a path to an input model, +# an output path, and a list of configuration parameters. +# The list of parameters should be a dictionary of options and their values. +# +# Generates - +# * An optimized model which can be run on the host interpreter +# * C++ source and header which can be compiled for xcore target +# * Optionally generates flash image for model weights +xf.convert("source model path", "converted model path", params=None) + +# Returns the tensor arena size required for the optimized model +# Only valid after conversion is done +xf.tensor_arena_size() + +# Prints xformer output +# Useful for inspecting optimization warnings, if any +# Only valid after conversion is done +xf.print_optimization_report() + +# To see all available parameters +# To see hidden options, run `print_help(show_hidden=True)` +xf.print_help() -Build the libraries with default settings (see the [`Makefile`](Makefile) for more), run: -```shell -make build ``` -Install the `xcore_interpreters` and `tflite2xcore` python packages using `pip` (preferably inside a venv): -```shell -pip install -e "./third_party/lib_tflite_micro/tflm_interpreter" -pip install -e "./tflite2xcore[examples]" +For example: +```python +from xmos_ai_tools import xformer as xf + +xf.convert("example_int8_model.tflite", "xcore_optimised_int8_model.tflite", [ + ("xcore-thread-count", "5"), +]) ``` -To be able to run pytest(Integration tests) -```shell -pip install -e "./tflite2xcore[test]" +To create a parameters file and a tflite model suitable for loading to flash, use the "xcore-weights-file" option. +```python +xf.convert("example_int8_model.tflite", "xcore_optimised_int8_flash_model.tflite", [ + ("xcore-weights-file ", "./xcore_params.params"), +]) ``` -Docker Image ------------- +Some of the commonly used configuration options are described [here](docs/rst/options.rst) -The Dockerfile provided is used in the CI system but can serve as a guide to system setup. -Installation of the XMOS tools requires connection to our network. +## Running the xcore model on host interpreter -```shell -docker build -t xmos/ai_tools . -docker run -it \ - -v $(pwd):/ws \ - -u $(id -u):$(id -g) \ - -w /ws \ - xmos/ai_tools \ - bash -l -``` +```python +from xmos_ai_tools.xinterpreters import TFLMHostInterpreter -Note that this container will stop when you exit the shell -For a persistent container: - - add `-d` to the docker run command to start detached; - - add `--name somename`; - - enter with `docker exec -it somename bash -l`; - - stop with `docker stop somename`. +input_data = ... # define your input data -Then inside the container -```shell -# setup environment -conda env create -p ai_tools_venv -f utils/environment.yml -/XMOS/get_tools.py 15.0.6 -conda activate ./ai_tools_venv -pip install -e "./third_party/lib_tflite_micro/tflm_interpreter[test]" -pip install -e "./tflite2xcore[examples,test,dev]" -# activate tools (each new shell) -module load tools/15.0.6 -# build all and run tests -make build test +ie = TFLMHostInterpreter() +ie.set_model(model_path='path_to_xcore_model', params_path='path_to_xcore_params') +ie.set_tensor(ie.get_input_details()[0]['index'], value=input_data) +ie.invoke() + +xformer_outputs = [] +num_of_outputs = len(ie.get_output_details()) +for i in range(num_of_outputs): + xformer_outputs.append(ie.get_tensor(ie.get_output_details()[i]['index'])). + +# Note: use ie.close() or "with TFLMHostInterpreter() as ie:" to free resources +ie.close() ``` diff --git a/build.sh b/build.sh new file mode 100755 index 000000000..9a09bbefb --- /dev/null +++ b/build.sh @@ -0,0 +1,243 @@ +#!/bin/bash + +set -e +OS=$(uname) + +if [ "$OS" = "Linux" ]; then + NUM_PROCS=$(nproc) +elif [ "$OS" = "Darwin" ]; then + NUM_PROCS=$(sysctl -n hw.ncpu) +else + echo "Unsupported operating system." + exit 1 +fi + +ACTION="--build" +TARGET="" +DEBUG="false" +LSP="false" +SCRIPT_DIR="$( + cd "$(dirname "$0")" + pwd -P +)" +ARCH=$(uname -m) +MACHINE_ARCH="" +if [ "$ARCH" = "x86_64" ]; then + MACHINE_ARCH="x86" +elif [[ "$ARCH" == *"arm"* ]]; then + MACHINE_ARCH="arm" +else + echo "Unknown architecture" + exit 1 +fi + +help() { + echo "Usage: $(basename "$0") [ACTIONS]..." + echo " -b Build (default)" + echo " -c Clean build" + echo " -t Test build" + echo " -d Enable debug" + echo " -j [NUM_PROCS] Set number of jobs (default: nproc)" + echo " -T [TARGET] Set target:" + echo " init Initialise repository (update submodules and patch ltflm)" + echo " all Build everything" + echo " xinterpreter Build interpreter only" + echo " xformer Build compiler only" + echo " -h Show this help message" + exit 1 +} + +while getopts "cbtdj:T:hl" opt; do + case $opt in + c) + ACTION="--clean" + ;; + b) + ACTION="--build" + ;; + t) + ACTION="--test" + ;; + d) + DEBUG="true" + ;; + j) + NUM_PROCS="$OPTARG" + ;; + T) + TARGET="$OPTARG" + ;; + h) + help + ;; + l) + LSP="true" + ;; + *) + echo "Invalid option: -$OPTARG" >&2 + help + ;; + esac +done + +if [ -z "$TARGET" ]; then + echo "No target specified." + help +fi + +bazel_compile_commands() { + cd xformer + bazel run @hedron_compile_commands//:refresh_all + cd "$SCRIPT_DIR" +} + +build_xformer() { + if [ "$LSP" = "true" ]; then + bazel_compile_commands + fi + cd xformer + bazel_cmd="bazel build --jobs $NUM_PROCS //:xcore-opt" + if [ "$MACHINE_ARCH" = "arm" ]; then + bazel_cmd+=" --cpu=darwin_arm64" + fi + if [ "$DEBUG" = "true" ]; then + bazel_cmd+=" -c dbg --spawn_strategy=local --javacopt=\"-g\" --copt=\"-g\" --strip=\"never\" --verbose_failures --sandbox_debug" + fi + eval "$bazel_cmd" + cd "$SCRIPT_DIR" +} + +version_check() { + cd xformer + ./version_check.sh + cd "$SCRIPT_DIR" +} + +submodule_update() { + git submodule update --init --recursive --jobs "$NUM_PROCS" +} + +patch() { + make -C third_party/lib_tflite_micro patch +} + +unsupported_action() { + echo "Action $ACTION not supported for target $TARGET" + exit 1 +} + +create_zip() { + cd third_party/lib_tflite_micro + mkdir -p build + cd build + if [ "$1" = "xcore" ]; then + cmake .. --toolchain=../lib_tflite_micro/submodules/xmos_cmake_toolchain/xs3a.cmake + else + cmake .. -DLIB_NAME=x86tflitemicro + fi + make create_zip "-j$NUM_PROCS" + cd "$SCRIPT_DIR" + mv third_party/lib_tflite_micro/build/release_archive.zip python/xmos_ai_tools/runtime/release_archive.zip + cd python/xmos_ai_tools/runtime + rm -rf include + unzip -o release_archive.zip + rm release_archive.zip + cd "$SCRIPT_DIR" +} + +build_xinterpreter() { + cd "$SCRIPT_DIR" + make -C python/xmos_ai_tools/xinterpreters install "-j$NUM_PROCS" +} + +xformer_integration_test() { + pytest integration_tests/runner.py --models_path integration_tests/models/8x8 -n "$NUM_PROCS" + pytest integration_tests/runner.py --models_path integration_tests/models/16x8 -n "$NUM_PROCS" + pytest integration_tests/runner.py --models_path integration_tests/models/float32 -n "$NUM_PROCS" + pytest integration_tests/runner.py --models_path integration_tests/models/bnns --bnn -n"$NUM_PROCS" +} + +clean_xinterpreter() { + make -C python/xmos_ai_tools/xinterpreters clean +} + +clean_runtime() { + rm -rf third_party/lib_tflite_micro/build +} + +test_xinterpreter() { + echo "Not implemented yet" + exit 1 +} + +# we want this script to build the repository it's in, no matter where we call it from +cd "$SCRIPT_DIR" + +case $TARGET in +init) + submodule_update + patch + ;; +xformer) + build_xformer + ;; +xinterpreter) + case $ACTION in + --build) + version_check + # create_zip "xcore" + clean_runtime + create_zip "x86" + build_xinterpreter + ;; + --clean) + clean_xinterpreter + clean_runtime + ;; + --test) + test_xinterpreter + ;; + *) + unsupported_action + ;; + esac + ;; +# this is a mess: xinterpreter-nozip only used for CI +xinterpreter-nozip) + case $ACTION in + --build) + version_check + build_xinterpreter + ;; + --clean) + clean_xinterpreter + ;; + --test) + test_xinterpreter + ;; + esac + ;; +all) + case $ACTION in + --build) + version_check + build_xformer + create_zip "xcore" + build_xinterpreter + ;; + --clean) + clean_xinterpreter + ;; + --test) + xformer_integration_test + ;; + *) + unsupported_action + ;; + esac + ;; +*) + echo "Unknown target: $TARGET" + help + ;; +esac diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..914857870 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,20 @@ +# Documentation + +*This is incomplete and is a work-in-progress. Please [create an issue](https://github.com/xmos/ai_tools/issues) to request a specific topic be added here.* + +- [Converting a keras model into an xcore optimised tflite model](https://colab.research.google.com/github/xmos/ai_tools/blob/develop/docs/notebooks/keras_to_xcore.ipynb) +- [Making models that XFormer can optimise](https://colab.research.google.com/github/xmos/ai_tools/blob/develop/docs/notebooks/optimise_for_xcore.ipynb) + +## Installing Packages + +### Docker (Recommended) + +After installing Docker, simply run the `./start.sh` script to build and start the docker container. The logs should output the URL that jupyter lab can be accessed on. Copy and paste this URL into your web browser. + +### Other + +If you don't have docker installed, you can still run the notebooks. + +However, you must make sure that you install the packages listed in `./requirements.txt` file in whichever kernel you are using for your jupyter lab. + +It is important that the package versions match the `requirements.txt` file, so it is advised to create a separate kernel for this project. \ No newline at end of file diff --git a/docs/exclude-patterns.inc b/docs/exclude-patterns.inc new file mode 100644 index 000000000..23f93fb48 --- /dev/null +++ b/docs/exclude-patterns.inc @@ -0,0 +1,11 @@ +# The following patterns are to be excluded from the documentation build +LICENSE.rst +CHANGELOG.rst +README.md +notebooks/README.md +notebooks/keras_to_xcore.ipynb +notebooks/optimise_for_xcore.ipynb +notebooks/pytorch_to_tflite/LSTM/mnist_lstm.ipynb +notebooks/pytorch_to_tflite/YOLOv8/pytorch_to_tflite.ipynb +rst/arena_sharing.rst +doc/* diff --git a/docs/notebooks/.gitignore b/docs/notebooks/.gitignore new file mode 100644 index 000000000..2248f8a1e --- /dev/null +++ b/docs/notebooks/.gitignore @@ -0,0 +1 @@ +kaggle.json diff --git a/docs/notebooks/Dockerfile b/docs/notebooks/Dockerfile new file mode 100644 index 000000000..a204684fe --- /dev/null +++ b/docs/notebooks/Dockerfile @@ -0,0 +1,22 @@ +FROM --platform=linux/amd64 jupyter/base-notebook:2023-01-30 + +# switch to and install opencv dependencies +USER root +RUN sudo apt-get update && apt-get install ffmpeg libsm6 libxext6 -y +USER ${NB_USER} + +RUN pip install --upgrade pip + +# install all python dependencies +COPY --chown=${NB_UID}:${NB_GID} ./requirements.txt /tmp/ +RUN pip install --no-cache-dir --requirement /tmp/requirements.txt && \ + fix-permissions "${CONDA_DIR}" && \ + fix-permissions "/home/${NB_USER}" +RUN pip install --no-cache-dir nvidia-pyindex && \ + fix-permissions "${CONDA_DIR}" && \ + fix-permissions "/home/${NB_USER}" +RUN pip install --no-cache-dir onnx-graphsurgeon && \ + fix-permissions "${CONDA_DIR}" && \ + fix-permissions "/home/${NB_USER}" + +ENV JUPYTER_ENABLE_LAB=yes diff --git a/docs/notebooks/README.md b/docs/notebooks/README.md new file mode 100644 index 000000000..a3d6b905d --- /dev/null +++ b/docs/notebooks/README.md @@ -0,0 +1,15 @@ +# Notebooks + +## Package Installation + +### Docker (Recommended) + +After installing Docker, simply run the `./start.sh` script to build and start the docker container. The logs should output the URL that jupyter lab can be accessed on. Copy and paste this URL into your web browser. + +### Run without Docker + +If you don't have docker installed, you can still run the notebooks. + +However, you must make sure that you install the packages listed in `./requirements.txt` file in whichever environment you are using for your jupyter lab. + +It is important that the package versions match the `requirements.txt` file, so it is advised to create a separate environment for this project. \ No newline at end of file diff --git a/docs/notebooks/conversion_process.jpg b/docs/notebooks/conversion_process.jpg new file mode 100644 index 000000000..f6dfabf17 Binary files /dev/null and b/docs/notebooks/conversion_process.jpg differ diff --git a/docs/notebooks/keras_to_xcore.ipynb b/docs/notebooks/keras_to_xcore.ipynb new file mode 100644 index 000000000..62369af17 --- /dev/null +++ b/docs/notebooks/keras_to_xcore.ipynb @@ -0,0 +1,286 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0dcf0b88-e2ba-48c2-8a57-ddc7a7dc520a", + "metadata": {}, + "source": [ + "# Process Overview\n", + "\n", + "Start with a Keras model, which is then converted into a tflite model. The tflite model is then run through the xformer compiler to make an xmos optimised tflite file.\n", + "\n", + "We can use the relavent interpreters for each model to verify that given the same input, they both produce the same output. " + ] + }, + { + "cell_type": "markdown", + "id": "87c94f93-a1aa-4ac7-8b69-a4bccd22cae6", + "metadata": {}, + "source": [ + "\"Diagram" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8729a280-96ca-49aa-941e-ed0bf785c086", + "metadata": { + "tags": [ + "skip-execution" + ] + }, + "outputs": [], + "source": [ + "! pip install xmos_ai_tools" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75882760", + "metadata": {}, + "outputs": [], + "source": [ + "! pip install tensorflow" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12967287", + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "import numpy as np\n", + "from xmos_ai_tools import xformer\n", + "from xmos_ai_tools.xinterpreters import TFLMHostInterpreter" + ] + }, + { + "cell_type": "markdown", + "id": "b592ad9d-79e0-4304-a005-57eb03bf26ef", + "metadata": {}, + "source": [ + "# Make a Model to convert\n", + "Use Keras to make a model of arbiraty size and shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39cfdc25", + "metadata": {}, + "outputs": [], + "source": [ + "pool_size = (2, 2)\n", + "input_shape = (3, 3, 4)\n", + "model = tf.keras.Sequential(\n", + " [tf.keras.layers.AveragePooling2D(pool_size=pool_size, input_shape=input_shape)]\n", + ")\n", + "model.compile()" + ] + }, + { + "cell_type": "markdown", + "id": "50d58472-a59c-45c5-b47c-fc8d571b7677", + "metadata": {}, + "source": [ + "## Convert keras model into a tflite model\n", + "The xcore converter cannot optimise a keras model directly to run on xcore devices, so it must first be converted into a tflite file(a flatbuffer)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aafe3198", + "metadata": {}, + "outputs": [], + "source": [ + "converter = tf.lite.TFLiteConverter.from_keras_model(model)" + ] + }, + { + "cell_type": "markdown", + "id": "fa2f5c47", + "metadata": {}, + "source": [ + "### Representitive Dataset\n", + "\n", + "Tensorflow can optimise the converted model to int8 if you pass it a representative dataset. This dataset can be a small subset (around ~100-500 samples) of the training or validation data\n", + "\n", + "The below function randomly generates this, but see [the tensorflow ducumentation](https://www.tensorflow.org/lite/performance/post_training_quantization) to see how to do this in practice." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa57eb0a", + "metadata": {}, + "outputs": [], + "source": [ + "# As an example use a random dataset\n", + "def representative_dataset():\n", + " batch_size = 8\n", + " for _ in range(100):\n", + " data = np.random.uniform(-0.1, 0.001, (batch_size, *input_shape))\n", + " yield [data.astype(np.float32)]" + ] + }, + { + "cell_type": "markdown", + "id": "52dca7ac-8a6a-4d9c-b4d3-42d0b3fbb622", + "metadata": {}, + "source": [ + "* **tf.lite.Optimize.DEFAULT:** Default optimization strategy that quantizes model weights. Enhanced optimizations are gained by providing a representative dataset that quantizes biases and activations as well. Converter will do its best to reduce size and latency, while minimizing the loss in accuracy.\n", + "\n", + "* **target_spec.supported_ops:** Import TFLITE ops. [Tensorflow docs](https://www.tensorflow.org/lite/guide/ops_select)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b093742", + "metadata": {}, + "outputs": [], + "source": [ + "# Set up the converter to convert our float model into int8 quantised model\n", + "# explain https://www.tensorflow.org/lite/performance/post_training_quantization\n", + "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", + "converter.representative_dataset = representative_dataset\n", + "converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]\n", + "converter.inference_input_type = tf.int8\n", + "converter.inference_output_type = tf.int8\n", + "\n", + "tflite_model = converter.convert()\n", + "\n", + "# Save the model.\n", + "tflite_model_path = \"avgpooling2d.tflite\"\n", + "with open(tflite_model_path, \"wb\") as f:\n", + " f.write(tflite_model)" + ] + }, + { + "cell_type": "markdown", + "id": "379a4e6b-7a17-49c8-b289-0714b315f0bc", + "metadata": {}, + "source": [ + "# Optimise model for XCore\n", + "Use `xcore_conv.convert(input_path, output_path)` to make an xcore optimised version of the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a26aa710", + "metadata": {}, + "outputs": [], + "source": [ + "xcore_optimised_path = \"xcore_model.tflite\"\n", + "xformer.convert(tflite_model_path, xcore_optimised_path, None)" + ] + }, + { + "cell_type": "markdown", + "id": "73ee3d58-55da-4c5b-9ec5-46c82321b0a8", + "metadata": {}, + "source": [ + "# Check it worked\n", + "To check if it worked, we can use the interpreters to run the models and make sure that they produce the same output.\n", + "\n", + "For normal tensorflow tflite models, use `tensorflow.lite.Interpreter`. For XCore optimised models, the `xmos_ai_tools.xinterpreters.TFLMHostInterpreter` must be used." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ada7955", + "metadata": {}, + "outputs": [], + "source": [ + "tf_interpreter = tf.lite.Interpreter(model_path=tflite_model_path)\n", + "tf_interpreter.allocate_tensors()\n", + "\n", + "tf_input_details = tf_interpreter.get_input_details()\n", + "tf_output_details = tf_interpreter.get_output_details()\n", + "\n", + "tf_input_shape = tf_input_details[0][\"shape\"]\n", + "# Fill with 126 so that xcore can be given same input\n", + "tf_input_data = np.array(np.random.randint(126, 127, tf_input_shape), dtype=np.int8)\n", + "\n", + "tf_interpreter.set_tensor(tf_input_details[0][\"index\"], tf_input_data)\n", + "\n", + "tf_interpreter.invoke()\n", + "tf_output_data = tf_interpreter.get_tensor(tf_output_details[0][\"index\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "62d94234", + "metadata": {}, + "outputs": [], + "source": [ + "xcore_interpreter = TFLMHostInterpreter()\n", + "xcore_interpreter.set_model(model_path=xcore_optimised_path)\n", + "\n", + "xcore_input_details = xcore_interpreter.get_input_details()\n", + "xcore_output_details = xcore_interpreter.get_output_details()\n", + "\n", + "xcore_input_shape = xcore_input_details[0][\"shape\"]\n", + "# Fill with 126 so that xcore can be given same input\n", + "xcore_input_data = np.array(\n", + " np.random.randint(126, 127, xcore_input_shape), dtype=np.int8\n", + ")\n", + "\n", + "xcore_interpreter.set_tensor(xcore_input_details[0][\"index\"], xcore_input_data)\n", + "\n", + "xcore_interpreter.invoke()\n", + "xcore_output_data = xcore_interpreter.get_tensor(xcore_output_details[0][\"index\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f8e306c-f6f1-42d3-b1b3-384142733fbe", + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Both models' output the same result?\")\n", + "print(\"yes\" if np.array_equal(xcore_output_data[0], tf_output_data[0]) else \"no\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a23752cc", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "interpreter": { + "hash": "0436a0dea52299ed28644175e220c962eae431d92561f4f402c0c00186dcb06f" + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/notebooks/optimise_for_xcore.ipynb b/docs/notebooks/optimise_for_xcore.ipynb new file mode 100644 index 000000000..def35175c --- /dev/null +++ b/docs/notebooks/optimise_for_xcore.ipynb @@ -0,0 +1,161 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fd68bb25", + "metadata": {}, + "source": [ + "# XCore Optimisation Guide\n", + " \n", + "The XMOS tflite compiler, xformer, converts regular tflite files to run on xcore devices. It tries to optimise models as much as possible both in terms of runtime and disk space, but some optimisations have certain requirements in the model creation phase, without which xformer cannot fully optimise them." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "109981f0", + "metadata": {}, + "outputs": [], + "source": [ + "import keras\n", + "import tensorflow as tf\n", + "from keras import layers" + ] + }, + { + "cell_type": "markdown", + "id": "06f6f814", + "metadata": {}, + "source": [ + "## Convolutions\n", + "\n", + "Convolutions can be implentented by different kernels, all of which have different runtime and space complexities.\n", + "\n", + "Xformer currently supports four kernels. They are (from slowest to fastest):\n", + "1. Reference kernel (default)\n", + "2. Padded indirect\n", + "3. Valid indirect\n", + "4. Valid direct\n", + "\n", + "These each have requirements relating to the inputs to the convolution. Consider padding or rounding values to meet the rules for these optimisations.\n", + "\n", + "### Conv2D\n", + "\n", + "`Conv2D` applies a filter(s) to each channel of an input. The convolution of each layer is summed together to produce the new channel. `Conv2D` can therefore be any *n* input channels to any *m* output channels.\n", + "\n", + "#### REQUIREMENTS:\n", + "**No Optimisation (reference):**\n", + "\n", + "None\n", + "\n", + "**Padded Indirect:**\n", + "(for padding=same)\n", + "\n", + "* Number of input channels is multiple of 4\n", + "* Number of filters is multiple of 4\n", + "\n", + "**Valid Indirect**\n", + "(for padding=valid)\n", + "\n", + "* Number of Input channels is multiple of 4\n", + "* Number of filters is multiple of 4\n", + "\n", + "\n", + "**Valid Direct**\n", + "(for padding=valid)\n", + "\n", + "* Number of Input channels is multiple of 32\n", + "* Number of filters is multiple of 16\n", + "\n", + "#### EXAMPLE:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "64e58990", + "metadata": {}, + "outputs": [], + "source": [ + "# Unoptimisable\n", + "input = keras.Input(shape=(28, 28, 4), name=\"img\")\n", + "x = layers.MaxPool2D(4, 4)(input)\n", + "x = layers.Conv2D(filters=15, kernel_size=4, activation=\"relu\")(\n", + " x\n", + ") # Unoptimisable, the number of filters is not multiple of 16\n", + "output = layers.GlobalMaxPooling2D()(x)\n", + "model = keras.Model(input, output, name=\"Unoptimised\")\n", + "model.summary()\n", + "\n", + "# Optimisable\n", + "input = keras.Input(shape=(28, 28, 4), name=\"img\")\n", + "x = layers.MaxPool2D(4, 4)(input)\n", + "x = layers.Conv2D(filters=16, kernel_size=4, activation=\"relu\")(\n", + " x\n", + ") # Round this to 16 to get to the requirements to use the Valid Direct kernel\n", + "output = layers.GlobalMaxPooling2D()(x)\n", + "model = keras.Model(input, output, name=\"Optimised\")\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "id": "6e029b35", + "metadata": {}, + "source": [ + "### DepthwiseConv2D\n", + "\n", + "`DepthwiseConv2D` applies a filter to each channel of an input. Each channel has its own filter and the convolution is calculated independently of other channels. It is therefore *n* input channels to *n* output channels.\n", + "\n", + "*(NB: DepthwiseConv2D has a depth_multiplier argument which means that the the true number of output channels is n * depth_multiplier.)*\n", + "\n", + "#### REQUIREMENTS:\n", + "\n", + "The requirements for each optimisation are the same as for a regular `Conv2D`, but because a `DepthwiseConv2D` is *n* input to *dn* (where *d* is the integer value of depth_multiplier), the only factor which affects this is the number of input channels.\n", + "\n", + "**No Optimisation (reference):**\n", + "\n", + "None\n", + "\n", + "**Padded Indirect:**\n", + "(for padding=same)\n", + "\n", + "* Number of input channels is multiple of 4\n", + "\n", + "**Valid Direct**\n", + "(for padding=valid)\n", + "\n", + "* Number of Input channels is multiple of 4" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6bf232d9", + "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.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/notebooks/pytest.ini b/docs/notebooks/pytest.ini new file mode 100644 index 000000000..381d0eb25 --- /dev/null +++ b/docs/notebooks/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +addopts = --ignore docs/notebooks/pytorch_to_tflite/ diff --git a/docs/notebooks/pytorch_to_tflite/LSTM/.gitignore b/docs/notebooks/pytorch_to_tflite/LSTM/.gitignore new file mode 100644 index 000000000..d9efcd5ef --- /dev/null +++ b/docs/notebooks/pytorch_to_tflite/LSTM/.gitignore @@ -0,0 +1,7 @@ +# Ignore files created by notebook script +*.onnx +*.tflite +param_replacement.json +handwriting.tf +mnist +mnist.tf diff --git a/docs/notebooks/pytorch_to_tflite/LSTM/mnist_lstm.ipynb b/docs/notebooks/pytorch_to_tflite/LSTM/mnist_lstm.ipynb new file mode 100644 index 000000000..d2daefb24 --- /dev/null +++ b/docs/notebooks/pytorch_to_tflite/LSTM/mnist_lstm.ipynb @@ -0,0 +1,599 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "53aeff71-1811-4956-95db-13c0ad7f276d", + "metadata": {}, + "source": [ + "# Training and Converting an LSTM Model from PyTorch to Tensorflow Lite for Micro\n" + ] + }, + { + "cell_type": "markdown", + "id": "3a794d61-a6ff-42b3-bc1d-849c2dd2ab75", + "metadata": {}, + "source": [ + "## Training in PyTorch\n", + "\n", + "Let's train a hand-written character recognition model with the MNIST dataset which uses LSTM models.\n", + "\n", + "Start off with importing the dataset:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "517f9774-2b1d-4903-a089-1fd032b6532c", + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "import torchvision\n", + "from torchvision import transforms\n", + "\n", + "\"\"\"\n", + "Each data point is of form [PIL.Image, class] where the class is a number 0-9 of the\n", + "respective digit. The image is a single channel image with values from 0 to 1.\n", + "\"\"\"\n", + "\n", + "\n", + "def mnist_data(train: bool) -> torchvision.datasets.MNIST:\n", + " return torchvision.datasets.MNIST(\n", + " \"./mnist/\",\n", + " download=True,\n", + " train=train,\n", + " transform=transforms.Compose([transforms.ToTensor()]),\n", + " )\n", + "\n", + "\n", + "# iterator returning Tensors of type float32 and shape [batch (10), channels (1), height (28), width (28)]\n", + "data_loaders = {\n", + " \"train\": torch.utils.data.DataLoader(\n", + " mnist_data(True), batch_size=100, shuffle=True, num_workers=4\n", + " ),\n", + " \"test\": torch.utils.data.DataLoader(\n", + " mnist_data(False), batch_size=100, shuffle=True, num_workers=4\n", + " ),\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "c0f54c38-9bd9-4b43-8176-603f1c151256", + "metadata": {}, + "source": [ + "### Define Model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f2670a68-ae13-4d9e-b9de-297cf74f5f15", + "metadata": {}, + "outputs": [], + "source": [ + "class MNIST_LSTM(torch.nn.Module):\n", + " def __init__(self, input_size: int, hidden_size: int, num_layers: int = 1):\n", + " super(MNIST_LSTM, self).__init__()\n", + " self.num_layers = num_layers\n", + " self.hidden_size = hidden_size\n", + " self.input_size = input_size\n", + "\n", + " self.lstm = torch.nn.LSTM(\n", + " input_size=input_size,\n", + " hidden_size=hidden_size,\n", + " num_layers=num_layers,\n", + " batch_first=True,\n", + " )\n", + " self.dropout = torch.nn.Dropout(0.2)\n", + " self.fc = torch.nn.Linear(hidden_size, 10)\n", + "\n", + " def forward(self, x):\n", + " # Remove batch parameter\n", + " x = x.reshape(-1, self.input_size, self.input_size)\n", + "\n", + " # Set initial hidden and cell states\n", + " hidden_initial = torch.zeros(self.num_layers, x.size(0), self.hidden_size)\n", + " cell_states_initial = torch.zeros(self.num_layers, x.size(0), self.hidden_size)\n", + "\n", + " lstm_out, hidden = self.lstm(x, (hidden_initial, cell_states_initial))\n", + "\n", + " dropout_out = self.dropout(lstm_out)\n", + "\n", + " fc_out = self.fc(dropout_out[:, -1, :])\n", + " return fc_out" + ] + }, + { + "cell_type": "markdown", + "id": "5b5304fc-83cd-4bae-8334-5de38e890f56", + "metadata": {}, + "source": [ + "### Training Loop" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4f4496e-63dd-4753-8a90-004351b15674", + "metadata": {}, + "outputs": [], + "source": [ + "input_size = 28\n", + "\n", + "# instantiate model\n", + "model = MNIST_LSTM(input_size, hidden_size=128)\n", + "\n", + "loss_func = torch.nn.CrossEntropyLoss()\n", + "optimizer = torch.optim.Adam(model.parameters(), lr=0.01)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7a154b68-b258-405e-a2eb-a03af2b7361a", + "metadata": {}, + "outputs": [], + "source": [ + "def train(num_epochs: int, model: MNIST_LSTM, loaders):\n", + " for epoch in range(num_epochs):\n", + " print(f\"Epoch {epoch}/{num_epochs}\")\n", + " for i, (images, labels) in enumerate(loaders[\"train\"]):\n", + " outputs = model(images)\n", + " loss = loss_func(outputs, labels)\n", + "\n", + " optimizer.zero_grad()\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + " print(\"Ended epoch: \")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a4adfd31-a7c9-42c8-a604-f39afaa5d264", + "metadata": {}, + "outputs": [], + "source": [ + "train(num_epochs=3, model=model, loaders=data_loaders)" + ] + }, + { + "cell_type": "markdown", + "id": "e6161c20-3be0-4a6b-af5f-e375cc2d7ae8", + "metadata": {}, + "source": [ + "### Check that the model works" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8748974-a7dd-45f2-a57a-b3414b383733", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Load one batch to test\n", + "images, labels = next(iter(data_loaders[\"test\"]))\n", + "\n", + "results = model(images).tolist()\n", + "processed_results = list(map(lambda res: res.index(max(res)), results))\n", + "\n", + "# show first ten images and their calculated labels\n", + "for idx in range(10):\n", + " display(torchvision.transforms.ToPILImage()(images[idx]))\n", + " print(f\"{processed_results[idx]}\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "4687d372-cd62-4c01-9cd8-30cf67065bd5", + "metadata": {}, + "source": [ + "### Check Model Accuracy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "756e71c9-c34d-4d83-9cd2-ff8b75f040df", + "metadata": {}, + "outputs": [], + "source": [ + "# Test the model\n", + "model.eval()\n", + "\n", + "with torch.no_grad():\n", + " correct = 0\n", + " total = 0\n", + "\n", + " for images, labels in data_loaders[\"test\"]:\n", + " outputs = model(images)\n", + " _, predicted = torch.max(outputs.data, 1)\n", + " total = total + labels.size(0)\n", + "\n", + " correct = correct + (predicted == labels).sum().item()\n", + "\n", + " print(\n", + " \"Test Accuracy of the model on the 10000 test images: {} %\".format(\n", + " 100 * correct / total\n", + " )\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "9a9a7040-957d-4f2a-9b0c-f42864cef56a", + "metadata": {}, + "source": [ + "## Convert to ONNX" + ] + }, + { + "cell_type": "markdown", + "id": "14cb269b-2cf5-4104-baf3-3e1bd24fa114", + "metadata": {}, + "source": [ + "Now we can convert this to ONNX using PyTorch's built-in exporter. \n", + "\n", + "To do this, we need to provide a sample input. This sample input is passed as input to the model and the trace generated will be used to construct the ONNX model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5391abd8-c0d1-4910-87bc-372d760da611", + "metadata": {}, + "outputs": [], + "source": [ + "sample_input, sample_labels = next(iter(data_loaders[\"test\"]))\n", + "\n", + "onnx_filename = \"handwriting.onnx\"\n", + "\n", + "torch.onnx.export(\n", + " model, sample_input, onnx_filename, input_names=[\"images\"], output_names=[\"number\"]\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "be7ecc8f-3cab-46e7-b6e2-084b1aa351a0", + "metadata": {}, + "source": [ + "## Check ONNX\n", + "Let's just check that the ONNX conversion worked before we continue." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e8cab25e-2e3b-4edd-a6f2-6ada65cb67af", + "metadata": {}, + "outputs": [], + "source": [ + "import onnx\n", + "\n", + "# Load the ONNX model\n", + "onnx_model = onnx.load(onnx_filename)\n", + "\n", + "# Check that the model is well formed\n", + "onnx.checker.check_model(onnx_model)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc577c33-5f28-4581-84d5-84c0f006299a", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy\n", + "import onnxruntime as ort\n", + "\n", + "ort_session = ort.InferenceSession(onnx_filename)\n", + "\n", + "outputs = ort_session.run(\n", + " None,\n", + " {\"images\": sample_input.numpy()},\n", + ")\n", + "onnx_processed_results = [numpy.argmax(res) for res in outputs[0]]\n", + "\n", + "# show first ten images and their calculated labels\n", + "for idx in range(10):\n", + " display(torchvision.transforms.ToPILImage()(sample_input[idx]))\n", + " print(f\"{onnx_processed_results[idx]}\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "342e2af0-ee1e-498e-8293-0bc41834aa4f", + "metadata": {}, + "source": [ + "## ONNX To TFlite\n", + "\n", + "Our ONNX model seems to be working correctly, so let's continue to convert our model into a Keras Model. From there, we can convert it into a TFLite file." + ] + }, + { + "cell_type": "markdown", + "id": "b5f7d54e-8598-48fb-ac75-9c55c0903897", + "metadata": {}, + "source": [ + "### ONNX to Keras\n", + "\n", + "Here we use a library by [@PINTO0309](https://github.com/PINTO0309/) to convert our model into a Keras model. For full documentation, see: https://github.com/PINTO0309/onnx2tf\n", + "\n", + "`enable_rnn_unroll=True` option unrolls the network.\n", + "\n", + "#### Important note about Parameter Replacement\n", + "\n", + "`onnx2tf` converts PyTorch Tensors of shape BCHW into the form BHWC, as is convention for TensorFlow. It usually manages this fine, however, if it gets the shapes wrong, you can use the `param_replacement_file` to reshape an operator's input's our outputs to correct it. \n", + "\n", + "For example in this example, the `squeeze` after the LSTM operation was changed to operate on the 3rd axis, but the output of the LSTM output was not updated to match; therefore, we add a `post_process_transform` to the LSTM operator to make it work. For more details, see: https://github.com/PINTO0309/onnx2tf#parameter-replacement\n", + "\n", + "To see the source of the problem by checking input and output shapes, it may be useful to view the ONNX model in the [Netron](https://netron.app/) visualiser. This is also an easy way to check the `op_name` and `param_name` of the operations you wish to target.\n", + "\n", + "For example, if we remove the param_replacement_file, we get the error `Can not squeeze dim[3], expected a dimension of 1, got 128 for '{{node tf.squeeze_3/Squeeze}} = Squeeze[T=DT_FLOAT, squeeze_dims=[3]](Placeholder)' with input shapes: [100,1,28,128].`. Opening the converted ONNX file, we can see that the output of the LSTM operation has the shape [28, 1, 100, 128] however the error message tells us that it expects the 3rd axis to be 1; this is a good indicator that we need to reshape the output, and sure enough, when we use the param_replacement_file to do this, it works!\n", + "\n", + "![screenshot of netron graph](netron-screenshot.png)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "141257a9-b9de-4ca3-ac18-3aa6cd985652", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Create param_replacement.json file\n", + "# (This should be a separate file, but for reader convenience, we create the file in this script)\n", + "\n", + "param_replacement_path = \"param_replacement.json\"\n", + "param_replacement_content = \"\"\"\n", + "{\n", + " \"format_version\": 1,\n", + " \"operations\": [\n", + " {\n", + " \"op_name\": \"LSTM_22\",\n", + " \"param_target\": \"outputs\",\n", + " \"param_name\": \"onnx::Squeeze_94\",\n", + " \"post_process_transpose_perm\": [0, 2, 3, 1]\n", + " }\n", + " ]\n", + "}\n", + "\"\"\"\n", + "with open(param_replacement_path, \"w\") as fh:\n", + " fh.write(param_replacement_content)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d5d4beb-6978-4dfb-ad1f-a39415f80c30", + "metadata": {}, + "outputs": [], + "source": [ + "import onnx2tf\n", + "\n", + "keras_model = onnx2tf.convert(\n", + " input_onnx_file_path=onnx_filename,\n", + " output_folder_path=\"handwriting.tf\",\n", + " copy_onnx_input_output_names_to_tflite=True,\n", + " non_verbose=True,\n", + " enable_rnn_unroll=True,\n", + " param_replacement_file=param_replacement_path,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "36939950-ceb7-47a9-99e2-0609a2d8c37e", + "metadata": {}, + "source": [ + "#### Check Keras Accuracy" + ] + }, + { + "cell_type": "markdown", + "id": "c75b8e67-e2f2-48d5-83ad-08cfd485db28", + "metadata": {}, + "source": [ + "Now that we have a Keras model, let's check its accuracy. If all went well, it should not have changed significantly from the original model's accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7f797340-539f-45bc-97ba-862fcea5e2c2", + "metadata": {}, + "outputs": [], + "source": [ + "keras_correct = 0\n", + "keras_total = 0\n", + "\n", + "for test_images, test_labels in data_loaders[\"test\"]:\n", + " # transpose the input_batch into BHWC order for tensorflow\n", + " tf_input_data = numpy.transpose(test_images.numpy(), [0, 2, 3, 1])\n", + "\n", + " keras_output_data = keras_model(tf_input_data)\n", + " processed_keras_output = [numpy.argmax(res) for res in keras_output_data]\n", + "\n", + " keras_results = zip(processed_keras_output, test_labels)\n", + " keras_batch_correct = sum(\n", + " [1 if output == label.item() else 0 for output, label in keras_results]\n", + " )\n", + "\n", + " keras_correct = keras_correct + keras_batch_correct\n", + " keras_total = keras_total + test_labels.size(0)\n", + "\n", + "\n", + "print(\n", + " f\"Test Accuracy of the keras model on the {keras_total} test images: {100 * keras_correct / keras_total} % ({keras_correct}/{keras_total})\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ceb30033-ad26-4568-90f3-f85c064f29d3", + "metadata": {}, + "source": [ + "### Keras to TensorFlow Lite\n", + "Now let's quantise our model to int8 and export it to a TensorFlow Lite flatbuffer.\n", + "\n", + "\n", + "#### Representative Dataset\n", + "\n", + "To convert a model into to a TFLite flatbuffer, a representative dataset is required to help in quantisation. Refer to [Converting a keras model into an xcore optimised tflite model for more details on this.](https://colab.research.google.com/github/xmos/ai_tools/blob/develop/docs/notebooks/keras_to_xcore.ipynb)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61ff7a3f-2826-4a3f-8a77-e9b93a68dceb", + "metadata": {}, + "outputs": [], + "source": [ + "def representative_dataset():\n", + " for test_images, _ in data_loaders[\"test\"]:\n", + " tf_batch = numpy.transpose(test_images.numpy(), [0, 2, 3, 1])\n", + " yield [tf_batch]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1043d1fd-b8c2-4184-9305-4a6f22e36549", + "metadata": {}, + "outputs": [], + "source": [ + "# Now do the conversion to int8\n", + "import tensorflow as tf\n", + "\n", + "converter = tf.lite.TFLiteConverter.from_keras_model(keras_model)\n", + "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", + "converter.representative_dataset = representative_dataset\n", + "converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]\n", + "converter.inference_input_type = tf.int8\n", + "converter.inference_output_type = tf.int8\n", + "\n", + "tflite_int8_model = converter.convert()\n", + "\n", + "# Save the model.\n", + "tflite_int8_model_path = \"handwriting.tflite\"\n", + "with open(tflite_int8_model_path, \"wb\") as f:\n", + " f.write(tflite_int8_model)" + ] + }, + { + "cell_type": "markdown", + "id": "1b447d46-da8b-44e6-88a5-e88fcb538d20", + "metadata": {}, + "source": [ + "#### Check Accuracy of Converted Model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ae7bc907-7baa-484d-9314-b49a64b32917", + "metadata": {}, + "outputs": [], + "source": [ + "tfl_interpreter = tf.lite.Interpreter(model_path=tflite_int8_model_path)\n", + "tfl_interpreter.allocate_tensors()\n", + "\n", + "tfl_input_details = tfl_interpreter.get_input_details()\n", + "tfl_output_details = tfl_interpreter.get_output_details()\n", + "\n", + "tfl_correct = 0\n", + "tfl_total = 0\n", + "\n", + "for test_images, test_labels in data_loaders[\"test\"]:\n", + " int_images = (test_images.numpy() * 255 - 128.0).astype(numpy.int8)\n", + " # transpose the input_batch into BHWC order for tensorflow\n", + " tfl_input_data = numpy.transpose(int_images, [0, 2, 3, 1])\n", + "\n", + " tfl_interpreter.set_tensor(tfl_input_details[0][\"index\"], tfl_input_data)\n", + " tfl_interpreter.invoke()\n", + "\n", + " tfl_output_data = tfl_interpreter.get_tensor(tfl_output_details[0][\"index\"])\n", + " tfl_processed_results = [numpy.argmax(res) for res in tfl_output_data]\n", + "\n", + " tfl_results = zip(tfl_processed_results, test_labels)\n", + " tfl_batch_correct = sum(\n", + " [1 if output == label.item() else 0 for output, label in tfl_results]\n", + " )\n", + "\n", + " tfl_correct = tfl_correct + tfl_batch_correct\n", + " tfl_total = tfl_total + test_labels.size(0)\n", + "\n", + "print(\n", + " f\"Test Accuracy of the TensorFlow Lite for Micro model on the {tfl_total} test images: {100 * tfl_correct / tfl_total} % ({tfl_correct}/{tfl_total})\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "2ec22f2d-c1dc-41b8-a537-22aa8c052bfb", + "metadata": {}, + "source": [ + "### Check operator counts of converted model\n", + "Let us take a look at the operator counts inside the converted model. Ideally, we want the same accuracy with minimal operators. This uses a helper function defined in ../utils, but this step is not necessary to convert the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36764ad8-6643-4227-98e6-fc37e291a4f8", + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import os\n", + "\n", + "# allow importing helper functions from local module\n", + "module_path = os.path.abspath(os.path.join(\"..\"))\n", + "if module_path not in sys.path:\n", + " sys.path.append(module_path)\n", + "\n", + "import utils\n", + "\n", + "utils.print_operator_counts(tflite_int8_model)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7259ccf2-5d14-4b03-8288-a28a8e77c954", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/notebooks/pytorch_to_tflite/LSTM/netron-screenshot.png b/docs/notebooks/pytorch_to_tflite/LSTM/netron-screenshot.png new file mode 100644 index 000000000..e5a2259a0 Binary files /dev/null and b/docs/notebooks/pytorch_to_tflite/LSTM/netron-screenshot.png differ diff --git a/docs/notebooks/pytorch_to_tflite/YOLOv8/.gitignore b/docs/notebooks/pytorch_to_tflite/YOLOv8/.gitignore new file mode 100644 index 000000000..b71d94089 --- /dev/null +++ b/docs/notebooks/pytorch_to_tflite/YOLOv8/.gitignore @@ -0,0 +1,11 @@ +# datasets +val2017.zip +annotations_trainval2017.zip +coco + +# generated files +yolov8n.pt +yolo.onnx +yolov8_v2.onnx +yolo_saved_model +yolo.tflite \ No newline at end of file diff --git a/docs/notebooks/pytorch_to_tflite/YOLOv8/pytorch_to_tflite.ipynb b/docs/notebooks/pytorch_to_tflite/YOLOv8/pytorch_to_tflite.ipynb new file mode 100644 index 000000000..92ec83c11 --- /dev/null +++ b/docs/notebooks/pytorch_to_tflite/YOLOv8/pytorch_to_tflite.ipynb @@ -0,0 +1,549 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1c42ac65", + "metadata": {}, + "source": [ + "# Converting PyTorch to TensorFlow Lite for xCORE Using ONNX\n", + "\n", + "ONNX is an open format built to represent machine learning models. We can convert from PyTorch to ONNX, then from ONNX to TensorFlow, then from TensorFlow to TensorFlow Lite, and finally, run it through xformer to optimise it for xCORE.\n", + "\n", + "Ensure that you have installed Python 3.8 and have the installed requirements.txt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0bdecdb6-82c4-4dc3-be6c-524b017c2f7a", + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import os\n", + "\n", + "# allow importing helper functions from local module\n", + "module_path = os.path.abspath(os.path.join(\"..\"))\n", + "if module_path not in sys.path:\n", + " sys.path.append(module_path)" + ] + }, + { + "cell_type": "markdown", + "id": "8a90a93c", + "metadata": {}, + "source": [ + "## Import PyTorch Model\n", + "\n", + "For this example, we use YOLOv8." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f69af6e6", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import torch\n", + "from ultralytics import YOLO\n", + "\n", + "pytorch_yolo = YOLO(\"yolov8n\")" + ] + }, + { + "cell_type": "markdown", + "id": "1e82593e-5112-4daa-8297-2179f153a758", + "metadata": {}, + "source": [ + "## Prepare Datasets\n", + "\n", + "YOLO is trained on the COCO dataset. First lets download the images and their annotations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "98a82b12-820b-41e8-b341-00a110cc758d", + "metadata": {}, + "outputs": [], + "source": [ + "!wget http://images.cocodataset.org/zips/val2017.zip -nc\n", + "!wget http://images.cocodataset.org/annotations/annotations_trainval2017.zip -nc\n", + "\n", + "\n", + "def unzip_dataset(path):\n", + " import zipfile\n", + "\n", + " with zipfile.ZipFile(path, \"r\") as zip_ref:\n", + " zip_ref.extractall(\"./coco\")\n", + "\n", + "\n", + "import os\n", + "\n", + "if not os.path.exists(\"./coco\"):\n", + " unzip_dataset(\"val2017.zip\")\n", + " unzip_dataset(\"annotations_trainval2017.zip\")" + ] + }, + { + "cell_type": "markdown", + "id": "edffaf43-97eb-48d9-b49b-970075afd3be", + "metadata": {}, + "source": [ + "Once we have downloaded and extracted the dataset, we can create generators which returns a tuple of [path, original image, original shape, Tensor of type BCHW]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "485ec430-0343-4ba1-932d-00a4bb055f14", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from PIL import Image\n", + "import numpy\n", + "import json\n", + "\n", + "\n", + "def open_and_preprocess(path: str):\n", + " size = pytorch_yolo.model.args[\"imgsz\"]\n", + " pil_img = Image.open(path).convert(\"RGB\")\n", + " resized_img = pil_img.resize((size, size))\n", + "\n", + " np_arr = numpy.array(resized_img)\n", + " return (\n", + " path,\n", + " numpy.array(pil_img),\n", + " numpy.array(pil_img).shape,\n", + " torch.from_numpy(\n", + " numpy.ascontiguousarray(\n", + " numpy.expand_dims(np_arr.transpose([2, 0, 1]), 0).astype(numpy.single)\n", + " / 255\n", + " )\n", + " ),\n", + " )\n", + "\n", + "\n", + "with open(\"./coco/annotations/instances_val2017.json\") as fh:\n", + " data = json.load(fh)\n", + " images = data[\"images\"]\n", + "\n", + " # generator that returns validation images as tuple [path, original image, original image shape, torch tensors of shape BCHW]\n", + " def validation_images():\n", + " for image in images:\n", + " yield open_and_preprocess(\"coco/val2017/\" + image[\"file_name\"])\n", + "\n", + " class_names = {idx: cat[\"name\"] for idx, cat in enumerate(data[\"categories\"])}" + ] + }, + { + "cell_type": "markdown", + "id": "9b2630c0", + "metadata": {}, + "source": [ + "## Perform an infrence on the pytorch model\n", + "\n", + "Perform inference on the model to see how it works. The class you import when you run the imported \"model\" is not itself a pytorch model, it is a wrapper around it which applies some post-processing to the model output to put it into a nice `Results` object. Lets run both with and without the wrapper to see how to get the outputs into the `Results` class. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "013896a2-c279-4901-b656-3d0d4d37ee11", + "metadata": {}, + "outputs": [], + "source": [ + "# This is the same demo image we will use for all examples\n", + "demo_images = validation_images()\n", + "demo_image = next(demo_images)\n", + "\n", + "# import ultralytics postprocessing classes\n", + "from ultralytics.utils.ops import non_max_suppression\n", + "from ultralytics.engine.results import Results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fef9993c-9886-453d-8a76-a510054958b6", + "metadata": {}, + "outputs": [], + "source": [ + "# function to display the annotated image\n", + "def display_result(results_obj: Results):\n", + " im_array = results_obj.plot() # plot a BGR numpy array of predictions\n", + " im = Image.fromarray(im_array[..., ::-1]) # RGB PIL image\n", + " im.show() # show image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db6db91e-c005-4df4-8995-87c9a02dc41b", + "metadata": {}, + "outputs": [], + "source": [ + "# using yolo wrapper\n", + "wrapper_results = pytorch_yolo(demo_image[3])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "03b65ec8-7f7a-4895-aabe-e42d79edda86", + "metadata": {}, + "outputs": [], + "source": [ + "im_array = (\n", + " wrapper_results[0].plot().astype(numpy.uint8)\n", + ") # plot a BGR numpy array of predictions\n", + "im = Image.fromarray(im_array[..., ::-1]) # RGB PIL image\n", + "im.show() # show image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "49960e00-b5cb-4803-9e3c-03a2fd642ef9", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# using model directly\n", + "torch_tensor = demo_image[3]\n", + "pytorch_results = pytorch_yolo.model(torch_tensor)\n", + "res, _ = pytorch_results\n", + "\n", + "\n", + "# define function to put result through yolo post-processing\n", + "def post_process(result, image):\n", + " preds = non_max_suppression(\n", + " result,\n", + " pytorch_yolo.predictor.args.conf,\n", + " pytorch_yolo.predictor.args.iou,\n", + " agnostic=pytorch_yolo.predictor.args.agnostic_nms,\n", + " max_det=pytorch_yolo.predictor.args.max_det,\n", + " )[0]\n", + " return Results(orig_img=image[1], path=image[0], names=class_names, boxes=preds)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aef809f0-ae93-44c0-9023-971b705e48e4", + "metadata": {}, + "outputs": [], + "source": [ + "pytorch_processed_results = post_process(res, demo_image)\n", + "display_result(pytorch_processed_results)" + ] + }, + { + "cell_type": "markdown", + "id": "9b9fde0a", + "metadata": {}, + "source": [ + "## Convert to ONNX\n" + ] + }, + { + "cell_type": "markdown", + "id": "e7e96873-0da5-4856-a1cc-b7242819d4a1", + "metadata": {}, + "source": [ + "Pytorch has an onnx exporter included. It runs the model with the sample input and generates a trace of it. **For YOLO, which can normally accept a variety of input types (such as URLs, paths, PIL objects or numpy arrays), the converted model will only be able to accept the same type as the input**." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a13b79d", + "metadata": {}, + "outputs": [], + "source": [ + "# This is only for shape info for tracing the model during conversion\n", + "sample_input = next(demo_images)[3]\n", + "\n", + "onnx_model_path = \"yolov8_v2.onnx\"\n", + "\n", + "torch.onnx.export(\n", + " pytorch_yolo.model,\n", + " sample_input,\n", + " onnx_model_path,\n", + " input_names=[\"images\"],\n", + " output_names=[\"output0\"],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "f6475e32", + "metadata": {}, + "source": [ + "### Check ONNX Model" + ] + }, + { + "cell_type": "markdown", + "id": "a5d41df4-5dfe-4e71-b299-2cec1aee45ab", + "metadata": {}, + "source": [ + "Run the ONNX model checker to make sure that the conversion worked" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4bdc8eea", + "metadata": {}, + "outputs": [], + "source": [ + "import onnx\n", + "\n", + "onnx_model = onnx.load(onnx_model_path)\n", + "onnx.checker.check_model(onnx_model)" + ] + }, + { + "cell_type": "markdown", + "id": "8bb5ad56", + "metadata": {}, + "source": [ + "### Convert ONNX to Keras\n", + "\n", + "We do this using the `onnx2tf` package: https://github.com/PINTO0309/onnx2tf\n", + "\n", + "**NB: onnx2tf will transpose your inputs to change BCHW into BHWC as is the TensorFlow convention.**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b93812f5-bd99-4aa5-9720-2509dfbad9bd", + "metadata": {}, + "outputs": [], + "source": [ + "import onnx2tf\n", + "\n", + "keras_model = onnx2tf.convert(\n", + " input_onnx_file_path=onnx_model_path,\n", + " output_folder_path=\"yolo_saved_model\",\n", + " copy_onnx_input_output_names_to_tflite=True,\n", + " non_verbose=True,\n", + " enable_rnn_unroll=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "0549092a", + "metadata": {}, + "source": [ + "### Check the conversion to keras" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e1941714-3e8b-4529-91dd-af385d5e8543", + "metadata": {}, + "outputs": [], + "source": [ + "# change to BHWC\n", + "tf_input_data = numpy.transpose(demo_image[3].numpy(), [0, 2, 3, 1])\n", + "\n", + "keras_unprocessed_results = keras_model(tf_input_data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4b58cba-c557-4729-8809-6f6b4690c46f", + "metadata": {}, + "outputs": [], + "source": [ + "keras_processed_results = post_process(\n", + " torch.from_numpy(keras_unprocessed_results.numpy()), demo_image\n", + ")\n", + "display_result(keras_processed_results)" + ] + }, + { + "cell_type": "markdown", + "id": "d497e02a", + "metadata": {}, + "source": [ + "## Convert Keras to TFLite (int8)\n", + "We will still feed the data into the model in float32 format for convinence but the internals of the model will be int8. This will require representitive data but as we interface in float32 we can use the pytorch preprocessing. " + ] + }, + { + "cell_type": "markdown", + "id": "98e1db68", + "metadata": {}, + "source": [ + "### Representative Dataset\n", + "\n", + "To convert a model into to a TFLite flatbuffer, a representative dataset is required to help in quantisation. Refer to [Converting a keras model into an xcore optimised tflite model](https://colab.research.google.com/github/xmos/ai_tools/blob/develop/docs/notebooks/keras_to_xcore.ipynb) for more details on this." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a0bbdbe4-42b4-493c-8075-f1f1b82fb801", + "metadata": {}, + "outputs": [], + "source": [ + "import itertools\n", + "\n", + "\n", + "def representative_dataset():\n", + " # in the interest of running the notebook fast, we only provide ten images;\n", + " # ideally this would be done with a few hundred images.\n", + " for image in itertools.islice(validation_images(), 10):\n", + " # change to BHWC\n", + " tf_batch = numpy.transpose(image[3].numpy(), [0, 2, 3, 1])\n", + " yield [tf_batch]" + ] + }, + { + "cell_type": "markdown", + "id": "d855d75e-73d8-4dbe-a96d-499e945f3da9", + "metadata": {}, + "source": [ + "### Run converter" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ff9ad9c-ef70-4b07-a970-1dc75e49c091", + "metadata": {}, + "outputs": [], + "source": [ + "# Now do the conversion to int8\n", + "import tensorflow as tf\n", + "\n", + "converter = tf.lite.TFLiteConverter.from_keras_model(keras_model)\n", + "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", + "converter.representative_dataset = representative_dataset\n", + "converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]\n", + "converter.inference_input_type = tf.int8\n", + "# leave output as float32 so that we can use the YOLO post-processing functions\n", + "converter.inference_output_type = tf.float32\n", + "\n", + "tflite_int8_model = converter.convert()\n", + "\n", + "\n", + "# Save the model.\n", + "tflite_int8_model_path = \"yolo.tflite\"\n", + "with open(tflite_int8_model_path, \"wb\") as f:\n", + " f.write(tflite_int8_model)" + ] + }, + { + "cell_type": "markdown", + "id": "9cbdb4f8-bcd4-4393-8d9f-f885935f0269", + "metadata": {}, + "source": [ + "### Check output\n", + "Lets use the same image as before to check that it gives us the same outputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4a974790-17c1-4f4a-a7ba-e747379fef82", + "metadata": {}, + "outputs": [], + "source": [ + "# convert intput to int8\n", + "tf_int_data = (tf_input_data * 255 - 128).astype(numpy.int8)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5972519-bd21-43d2-bce6-3d6844d77730", + "metadata": {}, + "outputs": [], + "source": [ + "tfl_interpreter = tf.lite.Interpreter(model_path=tflite_int8_model_path)\n", + "tfl_interpreter.allocate_tensors()\n", + "\n", + "tfl_input_details = tfl_interpreter.get_input_details()\n", + "tfl_output_details = tfl_interpreter.get_output_details()\n", + "\n", + "tfl_input_data = tf_int_data\n", + "\n", + "tfl_interpreter.set_tensor(tfl_input_details[0][\"index\"], tfl_input_data)\n", + "tfl_interpreter.invoke()\n", + "\n", + "tfl_output_data = tfl_interpreter.get_tensor(tfl_output_details[0][\"index\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0f56018-eaaa-438f-828b-16b54ad3c191", + "metadata": {}, + "outputs": [], + "source": [ + "tfl_processed_results = post_process(torch.from_numpy(tfl_output_data), demo_image)\n", + "display_result(tfl_processed_results)" + ] + }, + { + "cell_type": "markdown", + "id": "5bd9ae5b", + "metadata": {}, + "source": [ + "# Analyse Models\n", + "Now the model is converted and we have confirmed that it works, let us take a look inside the converted models to see how good the conversion is.\n", + "\n", + "## Check Operator Counts\n", + "\n", + "Let us take a look at the operator counts inside the converted model. This uses a helper function defined in `../utils`, but this step is not necessary to convert the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd00458d-007d-403b-a590-1a6c9376a18b", + "metadata": {}, + "outputs": [], + "source": [ + "import utils\n", + "\n", + "utils.print_operator_counts(tflite_int8_model)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/notebooks/pytorch_to_tflite/mobilenet/pytorch2keras.ipynb b/docs/notebooks/pytorch_to_tflite/mobilenet/pytorch2keras.ipynb new file mode 100644 index 000000000..1f3ed94fb --- /dev/null +++ b/docs/notebooks/pytorch_to_tflite/mobilenet/pytorch2keras.ipynb @@ -0,0 +1,635 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# Converting to TensorFlow Lite using pytorch_to_keras" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook shows how to convert mobilenet_v2 from a pytorch model into a quantized TensorFlow Lite model. First, use the python library `pytorch2keras` to convert the model into a Keras model, then follow the usual steps to export from Keras as a quantised int8 tflite model.\n", + "\n", + "Ensure that you have installed Python 3.8 and have the installed `../requirements.txt`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import os\n", + "\n", + "# allow importing helper functions from local module\n", + "module_path = os.path.abspath(os.path.join(\"..\"))\n", + "if module_path not in sys.path:\n", + " sys.path.append(module_path)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# The original libraries are unable to convert Relu6 operations\n", + "!{sys.executable} -m pip install https://github.com/xmos/onnx2keras/archive/refs/heads/fix/relu6.zip\n", + "!{sys.executable} -m pip install https://github.com/xmos/pytorch2keras/archive/refs/heads/fix/relu6.zip" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import torch\n", + "import io, os, shutil\n", + "import tensorflow as tf\n", + "import numpy as np\n", + "import tflite\n", + "from pytorch2keras import pytorch_to_keras\n", + "from torch.autograd import Variable" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Import PyTorch Model\n", + "For this example, we use mobilenet_v2." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "pytorch_model = torch.hub.load(\n", + " \"pytorch/vision:v0.10.0\", \"mobilenet_v2\", pretrained=True\n", + ")\n", + "# Switch the model to eval mode\n", + "pytorch_model.eval()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Run Inference on PyTorch Model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, lets run inference on the PyTorch model directly, just to see how it works." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# Download an image to test against\n", + "import urllib\n", + "\n", + "url, filename = (\"https://github.com/pytorch/hub/raw/master/images/dog.jpg\", \"dog.jpg\")\n", + "try:\n", + " urllib.URLopener().retrieve(url, filename)\n", + "except:\n", + " urllib.request.urlretrieve(url, filename)\n", + "\n", + "import requests\n", + "\n", + "# Download Image Labels\n", + "resp = requests.get(\n", + " \"https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt\"\n", + ")\n", + "# Read the categories\n", + "categories = [s.strip() for s in resp.text.splitlines()]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# We will test and train with these params\n", + "batch_size = 1\n", + "channels = 3\n", + "height = 224\n", + "width = 224" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from PIL import Image\n", + "from torchvision import transforms\n", + "\n", + "# Open testing image\n", + "input_image = Image.open(filename)\n", + "\n", + "preprocess = transforms.Compose(\n", + " [\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(height),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ]\n", + ")\n", + "\n", + "# Note Pytorch is BCHW\n", + "input_tensor = preprocess(input_image)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model\n", + "\n", + "with torch.no_grad():\n", + " output = pytorch_model(input_batch)\n", + "\n", + "probabilities = torch.nn.functional.softmax(output[0], dim=0)\n", + "\n", + "# Show top categories per image\n", + "vals, idxs = torch.topk(probabilities, 5)\n", + "pytorch_results = [\n", + " (categories[idx], prob) for (idx, prob) in zip(idxs.tolist(), vals.tolist())\n", + "]\n", + "for cat, prob in pytorch_results:\n", + " print(cat, \":\", prob)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Convert to Keras" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def pytorch_to_keras_model(pytorch_model, input_shape) -> tf.keras.Model:\n", + " input_np = np.random.uniform(0, 1, tuple([1]) + input_shape)\n", + " input_var = Variable(torch.FloatTensor(input_np))\n", + "\n", + " return pytorch_to_keras(\n", + " pytorch_model,\n", + " input_var,\n", + " [input_shape],\n", + " verbose=True,\n", + " name_policy=\"renumerate\",\n", + " change_ordering=True, # change channel_first to channel_last\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "keras_model = pytorch_to_keras_model(pytorch_model, input_tensor.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "### Check keras conversion" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def softmax(xs):\n", + " return np.exp(xs) / sum(np.exp(xs))\n", + "\n", + "\n", + "# transpose the input_batch into BHWC order for tensorflow\n", + "tf_input_data = np.transpose(input_batch.numpy(), [0, 2, 3, 1])\n", + "\n", + "keras_output_data = keras_model(tf_input_data)\n", + "\n", + "probs = keras_output_data[0]\n", + "data = zip(range(len(probs)), probs)\n", + "keras_results = [\n", + " (categories[idx], prob)\n", + " for (idx, prob) in sorted(data, key=lambda x: x[1], reverse=True)[:5]\n", + "]\n", + "for cat, prob in keras_results:\n", + " print(cat, \":\", prob)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Convert to tflite\n", + "\n", + "We will still feed the data into the model in float32 format for convinence but the internals of the model will be int8. This will require representitive data but as we interface in float32 we can use the pytorch preprocessing. \n", + "\n", + "This conversion follows the method from [keras_to_xcore.ipynb](https://colab.research.google.com/github/xmos/ai_tools/blob/develop/docs/notebooks/keras_to_xcore.ipynb)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "### Representative Dataset\n", + "To convert a model into to a TFLite flatbuffer, a representative dataset is required to help in quantisation. Refer to [Converting a keras model into an xcore optimised tflite model](https://colab.research.google.com/github/xmos/ai_tools/blob/develop/docs/notebooks/keras_to_xcore.ipynb) for more details on this." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "import tensorflow_datasets as tfds\n", + "\n", + "ds = (\n", + " tfds.load(\"imagenette\", split=\"train\", as_supervised=True, shuffle_files=True)\n", + " .shuffle(1000)\n", + " .batch(1)\n", + " .prefetch(10)\n", + " .take(1000)\n", + ")\n", + "\n", + "\n", + "# Iterate over the sampled images and preprocess them\n", + "def representative_dataset():\n", + " for image, _ in ds:\n", + " pil_img = tf.keras.utils.array_to_img(image[0])\n", + " pytorch_batch = preprocess(pil_img).unsqueeze(0)\n", + " tf_batch = np.transpose(pytorch_batch.numpy(), [0, 2, 3, 1])\n", + " yield [tf_batch]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Conversion Process" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Now do the conversion to int8\n", + "import tensorflow as tf\n", + "\n", + "converter = tf.lite.TFLiteConverter.from_keras_model(keras_model)\n", + "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", + "converter.representative_dataset = representative_dataset\n", + "converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]\n", + "converter.inference_input_type = tf.float32\n", + "converter.inference_output_type = tf.float32\n", + "\n", + "tflite_int8_model = converter.convert()\n", + "\n", + "# Save the model.\n", + "tflite_int8_model_path = \"mobilenet_v2.tflite\"\n", + "with open(tflite_int8_model_path, \"wb\") as f:\n", + " f.write(tflite_int8_model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run inference" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tfl_interpreter = tf.lite.Interpreter(model_path=tflite_int8_model_path)\n", + "tfl_interpreter.allocate_tensors()\n", + "\n", + "tfl_input_details = tfl_interpreter.get_input_details()\n", + "tfl_output_details = tfl_interpreter.get_output_details()\n", + "\n", + "# Convert PyTorch Input Tensor into Numpy Matrix and Reshape for TensorFlow\n", + "tfl_interpreter.set_tensor(tfl_input_details[0][\"index\"], tf_input_data)\n", + "tfl_interpreter.invoke()\n", + "\n", + "tfl_output_data = tfl_interpreter.get_tensor(tfl_output_details[0][\"index\"])\n", + "\n", + "probs = softmax(tfl_output_data[0])\n", + "data = zip(range(len(probs)), probs)\n", + "tfl_int8_results = [\n", + " (categories[idx], prob)\n", + " for (idx, prob) in sorted(data, key=lambda x: x[1], reverse=True)[:5]\n", + "]\n", + "for cat, prob in tfl_int8_results:\n", + " print(cat, \":\", prob)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Analyse Model\n", + "\n", + "### Check Operator Counts\n", + "\n", + "Lets take a look at the operator counts inside the converted model. This uses a helper function defined in `../utils`, but this step is not necessary to convert the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import utils\n", + "\n", + "utils.print_operator_counts(tflite_int8_model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Accuracy\n", + "\n", + "Let's compare the accuracy of the converted model to the original PyTorch model.\n", + "\n", + "To do this, we take a large sampel from imagenet_v2 and compare the classifications returned by the models." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow_datasets as tfds\n", + "import tensorflow as tf\n", + "import requests\n", + "from typing import List\n", + "\n", + "# load dataset\n", + "ds, info = tfds.load(\n", + " \"imagenet_v2\", split=\"test\", with_info=True, as_supervised=True, shuffle_files=False\n", + ")\n", + "ds = ds.shuffle(100, reshuffle_each_iteration=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def accuracy_tflite(top_n: int = 1, samples=1000, verbose=False) -> float:\n", + " if top_n < 1 or n > 1000:\n", + " raise ValueError\n", + "\n", + " # take subset of dataset\n", + " selection = ds.prefetch(10).take(samples)\n", + "\n", + " correct = 0\n", + " incorrect = 0\n", + "\n", + " for image, label in selection:\n", + " trueCatIdx = tf.get_static_value(label)\n", + " # convert to PIL.Image\n", + " img = tf.keras.utils.array_to_img(image)\n", + "\n", + " # preprocess using PyTorch functions then convert back into Tf.Tensor\n", + " pytorch_batch = preprocess(img).unsqueeze(0)\n", + " tf_batch = np.transpose(pytorch_batch.numpy(), [0, 2, 3, 1])\n", + "\n", + " # use same tflite interpreter as before\n", + " tfl_interpreter.set_tensor(tfl_input_details[0][\"index\"], tf_batch)\n", + " tfl_interpreter.invoke()\n", + "\n", + " output = tfl_interpreter.get_tensor(tfl_output_details[0][\"index\"])\n", + "\n", + " # Sort into List[Tuple[index, confidence]] ordered by confidence (descending)\n", + " data = sorted(\n", + " zip(range(len(output[0])), output[0]), key=lambda x: x[1], reverse=True\n", + " )\n", + "\n", + " top_n_results: List[int] = [idx for (idx, _) in data[:top_n]]\n", + "\n", + " if trueCatIdx in top_n_results:\n", + " correct = correct + 1\n", + " else:\n", + " incorrect = incorrect + 1\n", + " if verbose:\n", + " print(\"--incorrect--\")\n", + " print(f\"True Category: {categories[trueCatIdx]}({trueCatIdx})\")\n", + " print(\n", + " [\n", + " f\"Top-{top_n} categories: {categories[idx]}({idx})\"\n", + " for idx in top_n_results\n", + " ]\n", + " )\n", + " display(img)\n", + "\n", + " accuracy = correct / (correct + incorrect)\n", + " print(\n", + " f\"Top-{top_n} accuracy (TFLite Model): {accuracy * 100}% ({correct}/{correct+incorrect})\"\n", + " )\n", + " return accuracy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def accuracy_torch(top_n: int = 1, samples=1000, verbose=False):\n", + " if top_n < 1 or n > 1000:\n", + " raise ValueError\n", + "\n", + " # take subset of dataset\n", + " selection = ds.prefetch(10).take(samples)\n", + "\n", + " correct = 0\n", + " incorrect = 0\n", + "\n", + " for image, label in selection:\n", + " trueCatIdx = tf.get_static_value(label)\n", + "\n", + " # convert to PIL.Image\n", + " img = tf.keras.utils.array_to_img(image)\n", + " input_batch = preprocess(img).unsqueeze(0)\n", + "\n", + " with torch.no_grad():\n", + " output = pytorch_model(input_batch)\n", + "\n", + " # Show top categories per image\n", + " vals, idxs = torch.topk(output[0], top_n)\n", + "\n", + " if trueCatIdx in idxs:\n", + " correct = correct + 1\n", + " else:\n", + " incorrect = incorrect + 1\n", + " if verbose:\n", + " print(\"--incorrect--\")\n", + " print(f\"True Category: {categories[trueCatIdx]}({trueCatIdx})\")\n", + " print(\n", + " [\n", + " f\"Top-{top_n} categories: {categories[idx]}({idx})\"\n", + " for idx in top_n_results\n", + " ]\n", + " )\n", + " display(img)\n", + "\n", + " accuracy = correct / (correct + incorrect)\n", + " print(\n", + " f\"Top-{top_n} accuracy (PyTorch Model): {accuracy * 100}% ({correct}/{correct+incorrect})\"\n", + " )\n", + " return accuracy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "samples = 500\n", + "for n in range(5):\n", + " accuracy_torch(n + 1, samples)\n", + " accuracy_tflite(n + 1, samples)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/notebooks/pytorch_to_tflite/mobilenet/pytorch_to_tflite.ipynb b/docs/notebooks/pytorch_to_tflite/mobilenet/pytorch_to_tflite.ipynb new file mode 100644 index 000000000..066228db8 --- /dev/null +++ b/docs/notebooks/pytorch_to_tflite/mobilenet/pytorch_to_tflite.ipynb @@ -0,0 +1,710 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1c42ac65", + "metadata": {}, + "source": [ + "# Converting PyTorch to TensorFlow Lite for xCORE Using ONNX\n", + "\n", + "ONNX is an open format built to represent machine learning models. We can convert from PyTorch to ONNX, then from ONNX to TensorFlow, then from TensorFlow to TensorFlow Lite, and finally, run it through xformer to optimise it for xCORE.\n", + "\n", + "Ensure that you have installed Python 3.8 and have the installed requirements.txt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0bdecdb6-82c4-4dc3-be6c-524b017c2f7a", + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import os\n", + "\n", + "# allow importing helper functions from local module\n", + "module_path = os.path.abspath(os.path.join(\"..\"))\n", + "if module_path not in sys.path:\n", + " sys.path.append(module_path)" + ] + }, + { + "cell_type": "markdown", + "id": "8a90a93c", + "metadata": {}, + "source": [ + "## Import PyTorch Model\n", + "\n", + "For this example, we use mobilenet_v2." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f69af6e6", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import torch\n", + "\n", + "pytorch_model = torch.hub.load(\n", + " \"pytorch/vision:v0.10.0\", \"mobilenet_v2\", pretrained=True\n", + ")\n", + "\n", + "# Switch the model to eval mode\n", + "pytorch_model.eval()" + ] + }, + { + "cell_type": "markdown", + "id": "b2033740", + "metadata": {}, + "source": [ + "### Download the Class Labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9d609035", + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "\n", + "resp = requests.get(\n", + " \"https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt\"\n", + ")\n", + "# Read the categories\n", + "categories = [s.strip() for s in resp.text.splitlines()]" + ] + }, + { + "cell_type": "markdown", + "id": "9b2630c0", + "metadata": {}, + "source": [ + "### Perform an infrence on the pytorch model\n", + "Perform inference on the model to see how it works." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c10252ab", + "metadata": {}, + "outputs": [], + "source": [ + "# Download an image to test against\n", + "import urllib\n", + "\n", + "url, filename = (\"https://github.com/pytorch/hub/raw/master/images/dog.jpg\", \"dog.jpg\")\n", + "try:\n", + " urllib.URLopener().retrieve(url, filename)\n", + "except:\n", + " urllib.request.urlretrieve(url, filename)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "94f2b92a", + "metadata": {}, + "outputs": [], + "source": [ + "# We will test and train with these params\n", + "batch_size = 1\n", + "channels = 3\n", + "height = 224\n", + "width = 224" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5eb63c28", + "metadata": {}, + "outputs": [], + "source": [ + "from PIL import Image\n", + "from torchvision import transforms\n", + "\n", + "# Open testing image\n", + "input_image = Image.open(filename)\n", + "\n", + "preprocess = transforms.Compose(\n", + " [\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(height),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ]\n", + ")\n", + "\n", + "# Note Pytorch is BCHW\n", + "input_tensor = preprocess(input_image)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8424fc1c", + "metadata": {}, + "outputs": [], + "source": [ + "input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model\n", + "\n", + "with torch.no_grad():\n", + " output = pytorch_model(input_batch)\n", + "\n", + "probabilities = torch.nn.functional.softmax(output[0], dim=0)\n", + "\n", + "# Show top categories per image\n", + "vals, idxs = torch.topk(probabilities, 5)\n", + "pytorch_results = [\n", + " (categories[idx], prob) for (idx, prob) in zip(idxs.tolist(), vals.tolist())\n", + "]\n", + "for cat, prob in pytorch_results:\n", + " print(cat, \":\", prob)" + ] + }, + { + "cell_type": "markdown", + "id": "9b9fde0a", + "metadata": {}, + "source": [ + "## Convert to ONNX\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a13b79d", + "metadata": {}, + "outputs": [], + "source": [ + "# This is only for shape info for tracing the model during conversion\n", + "sample_input = torch.rand((batch_size, channels, height, width))\n", + "\n", + "onnx_model_path = \"mobilenet_v2.onnx\"\n", + "\n", + "torch.onnx.export(\n", + " pytorch_model,\n", + " sample_input,\n", + " onnx_model_path,\n", + " input_names=[\"image\"],\n", + " output_names=[\"probabilities\"],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "f6475e32", + "metadata": {}, + "source": [ + "### Check the exported model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4bdc8eea", + "metadata": {}, + "outputs": [], + "source": [ + "import onnx\n", + "\n", + "onnx_model = onnx.load(onnx_model_path)\n", + "onnx.checker.check_model(onnx_model)" + ] + }, + { + "cell_type": "markdown", + "id": "880d2393", + "metadata": {}, + "source": [ + "### Check ONNX Output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "665cc98e", + "metadata": {}, + "outputs": [], + "source": [ + "import onnxruntime\n", + "import numpy as np\n", + "\n", + "ort_session = onnxruntime.InferenceSession(onnx_model_path)\n", + "\n", + "\n", + "def to_numpy(tensor):\n", + " return (\n", + " tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy()\n", + " )\n", + "\n", + "\n", + "def softmax(xs):\n", + " return np.exp(xs) / sum(np.exp(xs))\n", + "\n", + "\n", + "# compute ONNX Runtime output prediction\n", + "input_batch_np = to_numpy(input_batch)\n", + "ort_inputs = {ort_session.get_inputs()[0].name: input_batch_np}\n", + "ort_outs = ort_session.run(None, ort_inputs)\n", + "\n", + "# The input is still BCHW\n", + "data = zip(range(len(ort_outs[0][0])), softmax(ort_outs[0][0]))\n", + "\n", + "onnx_results = [\n", + " (categories[idx], prob)\n", + " for (idx, prob) in sorted(data, key=lambda x: x[1], reverse=True)[:5]\n", + "]\n", + "for cat, prob in onnx_results:\n", + " print(cat, \":\", prob)" + ] + }, + { + "cell_type": "markdown", + "id": "8bb5ad56", + "metadata": {}, + "source": [ + "### Convert ONNX to Keras\n", + "We do this using the `onnx2tf` package: https://github.com/PINTO0309/onnx2tf" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2722c50", + "metadata": {}, + "outputs": [], + "source": [ + "import onnx2tf\n", + "\n", + "keras_model_path = \"mobilenet_v2.tf\"\n", + "\n", + "keras_model = onnx2tf.convert(\n", + " input_onnx_file_path=onnx_model_path,\n", + " output_folder_path=keras_model_path,\n", + " non_verbose=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "0549092a", + "metadata": {}, + "source": [ + "### Check the conversion to keras" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "72cdf53b", + "metadata": {}, + "outputs": [], + "source": [ + "# transpose the input_batch into BHWC order for tensorflow\n", + "tf_input_data = np.transpose(input_batch.numpy(), [0, 2, 3, 1])\n", + "\n", + "keras_output_data = keras_model(tf_input_data)\n", + "\n", + "probs = softmax(keras_output_data[0])\n", + "data = zip(range(len(probs)), probs)\n", + "keras_results = [\n", + " (categories[idx], prob)\n", + " for (idx, prob) in sorted(data, key=lambda x: x[1], reverse=True)[:5]\n", + "]\n", + "for cat, prob in keras_results:\n", + " print(cat, \":\", prob)" + ] + }, + { + "cell_type": "markdown", + "id": "c60f3aa5", + "metadata": {}, + "source": [ + "## Convert Keras to TFLite (float32)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b392bcc", + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "\n", + "converter = tf.lite.TFLiteConverter.from_keras_model(keras_model)\n", + "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", + "converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS]\n", + "converter.inference_input_type = tf.float32\n", + "converter.inference_output_type = tf.float32\n", + "\n", + "tflite_model = converter.convert()\n", + "\n", + "# Save the model.\n", + "tflite_float_model_path = \"mobilenet_v2_float.tflite\"\n", + "with open(tflite_float_model_path, \"wb\") as f:\n", + " f.write(tflite_model)" + ] + }, + { + "cell_type": "markdown", + "id": "ba66dc2b", + "metadata": {}, + "source": [ + "### Check it Worked" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "85a1fce1", + "metadata": {}, + "outputs": [], + "source": [ + "tfl_interpreter = tf.lite.Interpreter(model_path=tflite_float_model_path)\n", + "tfl_interpreter.allocate_tensors()\n", + "\n", + "tfl_input_details = tfl_interpreter.get_input_details()\n", + "tfl_output_details = tfl_interpreter.get_output_details()\n", + "\n", + "# Convert PyTorch Input Tensor into Numpy Matrix and Reshape for TensorFlow\n", + "# (Pytorch model expects C x H x W but TF expects H x W x C)\n", + "tfl_interpreter.set_tensor(tfl_input_details[0][\"index\"], tf_input_data)\n", + "tfl_interpreter.invoke()\n", + "\n", + "tfl_output_data = tfl_interpreter.get_tensor(tfl_output_details[0][\"index\"])\n", + "\n", + "probs = softmax(tfl_output_data[0])\n", + "data = zip(range(len(probs)), probs)\n", + "tfl_float32_results = [\n", + " (categories[idx], prob)\n", + " for (idx, prob) in sorted(data, key=lambda x: x[1], reverse=True)[:5]\n", + "]\n", + "for cat, prob in tfl_float32_results:\n", + " print(cat, \":\", prob)" + ] + }, + { + "cell_type": "markdown", + "id": "d497e02a", + "metadata": {}, + "source": [ + "## Convert Keras to TFLite (int8)\n", + "We will still feed the data into the model in float32 format for convinence but the internals of the model will be int8. This will require representitive data but as we interface in float32 we can use the pytorch preprocessing. " + ] + }, + { + "cell_type": "markdown", + "id": "98e1db68", + "metadata": {}, + "source": [ + "### Representative Dataset\n", + "\n", + "To convert a model into to a TFLite flatbuffer, a representative dataset is required to help in quantisation. Refer to [Converting a keras model into an xcore optimised tflite model](https://colab.research.google.com/github/xmos/ai_tools/blob/develop/docs/notebooks/keras_to_xcore.ipynb) for more details on this." + ] + }, + { + "cell_type": "markdown", + "id": "3a7a5c3e", + "metadata": {}, + "source": [ + "#### Download & Extract Images from Data Set" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32503a30", + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "import tensorflow_datasets as tfds\n", + "\n", + "ds = (\n", + " tfds.load(\"imagenette\", split=\"train\", as_supervised=True, shuffle_files=True)\n", + " .shuffle(1000)\n", + " .batch(1)\n", + " .prefetch(10)\n", + " .take(1000)\n", + ")\n", + "\n", + "\n", + "# Iterate over the sampled images and preprocess them\n", + "def representative_dataset():\n", + " for image, _ in ds:\n", + " pil_img = tf.keras.utils.array_to_img(image[0])\n", + " pytorch_batch = preprocess(pil_img).unsqueeze(0)\n", + " tf_batch = np.transpose(pytorch_batch.numpy(), [0, 2, 3, 1])\n", + " yield [tf_batch]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61799382", + "metadata": {}, + "outputs": [], + "source": [ + "# Now do the conversion to int8\n", + "import tensorflow as tf\n", + "\n", + "converter = tf.lite.TFLiteConverter.from_keras_model(keras_model)\n", + "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", + "converter.representative_dataset = representative_dataset\n", + "converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]\n", + "converter.inference_input_type = tf.float32\n", + "converter.inference_output_type = tf.float32\n", + "\n", + "tflite_int8_model = converter.convert()\n", + "\n", + "# Save the model.\n", + "tflite_int8_model_path = \"mobilenet_v2.tflite\"\n", + "with open(tflite_int8_model_path, \"wb\") as f:\n", + " f.write(tflite_int8_model)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38fd12d4", + "metadata": {}, + "outputs": [], + "source": [ + "tfl_interpreter = tf.lite.Interpreter(model_path=tflite_int8_model_path)\n", + "tfl_interpreter.allocate_tensors()\n", + "\n", + "tfl_input_details = tfl_interpreter.get_input_details()\n", + "tfl_output_details = tfl_interpreter.get_output_details()\n", + "\n", + "# Convert PyTorch Input Tensor into Numpy Matrix and Reshape for TensorFlow\n", + "tfl_interpreter.set_tensor(tfl_input_details[0][\"index\"], tf_input_data)\n", + "tfl_interpreter.invoke()\n", + "\n", + "tfl_output_data = tfl_interpreter.get_tensor(tfl_output_details[0][\"index\"])\n", + "\n", + "probs = softmax(tfl_output_data[0])\n", + "data = zip(range(len(probs)), probs)\n", + "tfl_int8_results = [\n", + " (categories[idx], prob)\n", + " for (idx, prob) in sorted(data, key=lambda x: x[1], reverse=True)[:5]\n", + "]\n", + "for cat, prob in tfl_int8_results:\n", + " print(cat, \":\", prob)" + ] + }, + { + "cell_type": "markdown", + "id": "5bd9ae5b", + "metadata": {}, + "source": [ + "# Analyse Models\n", + "Now the model is converted and we have confirmed that it works, let us take a look inside the converted models to see how good the conversion is.\n", + "\n", + "## Check Operator Counts\n", + "\n", + "Let us take a look at the operator counts inside the converted model. This uses a helper function defined in `../utils`, but this step is not necessary to convert the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "acc21b12", + "metadata": {}, + "outputs": [], + "source": [ + "import utils\n", + "\n", + "utils.print_operator_counts(tflite_int8_model)" + ] + }, + { + "cell_type": "markdown", + "id": "15b76da4", + "metadata": {}, + "source": [ + "## Compare Accuracy" + ] + }, + { + "cell_type": "markdown", + "id": "ef7d503b-4dd3-43b1-bfc7-6ac74882a505", + "metadata": {}, + "source": [ + "Let's compare the accuracy of the converted model to the original PyTorch model.\n", + "\n", + "To do this, we take a large sampel from imagenet_v2 and compare the classifications returned by the models." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f011e37-c9d2-445d-b4a8-702c0dcb1452", + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow_datasets as tfds\n", + "import tensorflow as tf\n", + "import requests\n", + "from typing import List\n", + "\n", + "# load dataset\n", + "ds, info = tfds.load(\n", + " \"imagenet_v2\", split=\"test\", with_info=True, as_supervised=True, shuffle_files=False\n", + ")\n", + "ds = ds.shuffle(100, reshuffle_each_iteration=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2bf134ea-f5aa-4583-a8e2-bfca9071c21f", + "metadata": {}, + "outputs": [], + "source": [ + "def accuracy_tflite(top_n: int = 1, samples=1000, verbose=False) -> float:\n", + " if top_n < 1 or n > 1000:\n", + " raise ValueError\n", + "\n", + " # take subset of dataset\n", + " selection = ds.prefetch(10).take(samples)\n", + "\n", + " correct = 0\n", + " incorrect = 0\n", + "\n", + " for image, label in selection:\n", + " trueCatIdx = tf.get_static_value(label)\n", + " # convert to PIL.Image\n", + " img = tf.keras.utils.array_to_img(image)\n", + "\n", + " # preprocess using PyTorch functions then convert back into Tf.Tensor\n", + " pytorch_batch = preprocess(img).unsqueeze(0)\n", + " tf_batch = np.transpose(pytorch_batch.numpy(), [0, 2, 3, 1])\n", + "\n", + " # use same tflite interpreter as before\n", + " tfl_interpreter.set_tensor(tfl_input_details[0][\"index\"], tf_batch)\n", + " tfl_interpreter.invoke()\n", + "\n", + " output = tfl_interpreter.get_tensor(tfl_output_details[0][\"index\"])\n", + "\n", + " # Sort into List[Tuple[index, confidence]] ordered by confidence (descending)\n", + " data = sorted(\n", + " zip(range(len(output[0])), output[0]), key=lambda x: x[1], reverse=True\n", + " )\n", + "\n", + " top_n_results: List[int] = [idx for (idx, _) in data[:top_n]]\n", + "\n", + " if trueCatIdx in top_n_results:\n", + " correct = correct + 1\n", + " else:\n", + " incorrect = incorrect + 1\n", + " if verbose:\n", + " print(\"--incorrect--\")\n", + " print(f\"True Category: {categories[trueCatIdx]}({trueCatIdx})\")\n", + " print(\n", + " [\n", + " f\"Top-{top_n} categories: {categories[idx]}({idx})\"\n", + " for idx in top_n_results\n", + " ]\n", + " )\n", + " display(img)\n", + "\n", + " accuracy = correct / (correct + incorrect)\n", + " print(\n", + " f\"Top-{top_n} accuracy (TFLite Model): {accuracy * 100}% ({correct}/{correct+incorrect})\"\n", + " )\n", + " return accuracy\n", + "\n", + "\n", + "def accuracy_torch(top_n: int = 1, samples=1000, verbose=False):\n", + " if top_n < 1 or n > 1000:\n", + " raise ValueError\n", + "\n", + " # take subset of dataset\n", + " selection = ds.prefetch(10).take(samples)\n", + "\n", + " correct = 0\n", + " incorrect = 0\n", + "\n", + " for image, label in selection:\n", + " trueCatIdx = tf.get_static_value(label)\n", + "\n", + " # convert to PIL.Image\n", + " img = tf.keras.utils.array_to_img(image)\n", + " input_batch = preprocess(img).unsqueeze(0)\n", + "\n", + " with torch.no_grad():\n", + " output = pytorch_model(input_batch)\n", + "\n", + " # Show top categories per image\n", + " vals, idxs = torch.topk(output[0], top_n)\n", + "\n", + " if trueCatIdx in idxs:\n", + " correct = correct + 1\n", + " else:\n", + " incorrect = incorrect + 1\n", + " if verbose:\n", + " print(\"--incorrect--\")\n", + " print(f\"True Category: {categories[trueCatIdx]}({trueCatIdx})\")\n", + " print(\n", + " [\n", + " f\"Top-{top_n} categories: {categories[idx]}({idx})\"\n", + " for idx in top_n_results\n", + " ]\n", + " )\n", + " display(img)\n", + "\n", + " accuracy = correct / (correct + incorrect)\n", + " print(\n", + " f\"Top-{top_n} accuracy (PyTorch Model): {accuracy * 100}% ({correct}/{correct+incorrect})\"\n", + " )\n", + " return accuracy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1046ed32-c534-46eb-8ee5-87dbd6628873", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "samples = 500\n", + "for n in range(5):\n", + " accuracy_torch(n + 1, samples)\n", + " accuracy_tflite(n + 1, samples)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/notebooks/pytorch_to_tflite/utils/__init__.py b/docs/notebooks/pytorch_to_tflite/utils/__init__.py new file mode 100644 index 000000000..f8873c877 --- /dev/null +++ b/docs/notebooks/pytorch_to_tflite/utils/__init__.py @@ -0,0 +1,36 @@ +import io +import tensorflow as tf +from contextlib import redirect_stdout + + +def get_operator_counts(model_content): + with io.StringIO() as buf, redirect_stdout(buf): + tf.lite.experimental.Analyzer.analyze(model_content=model_content) + model_structure = buf.getvalue() + + operators = [ + op.strip().split(" ")[1].split("(")[0] + for op in model_structure.split("\n") + if "Op#" in op + ] + op_counts = {} + for operator in operators: + if operator in op_counts: + op_counts[operator] = op_counts[operator] + 1 + else: + op_counts[operator] = 1 + + return (len(operators), op_counts) + + +def print_operator_counts(model_content): + total_op_count, op_counts = get_operator_counts(model_content) + print(f"{'Operator'.upper():<20} {'Count'.upper():>6}") + print("-" * 20 + " " + "-" * 6) + + for operator, count in op_counts.items(): + print(f"{operator.lower():<20} {count:>6}") + + print("-" * 20 + " " + "-" * 6) + print(f"{'Total'.upper():<20} {total_op_count:>6}") + print("-" * 20 + " " + "-" * 6) diff --git a/docs/notebooks/requirements.txt b/docs/notebooks/requirements.txt new file mode 100644 index 000000000..56d65528e --- /dev/null +++ b/docs/notebooks/requirements.txt @@ -0,0 +1,12 @@ +torch==1.13.1 +torchvision==0.13.0 +onnx==1.16.0 +onnxruntime>=1.18.0 +onnx-simplifier==0.4.33 +simple_onnx_processing_tools +tensorflow==2.13.0 +psutil==5.9.5 +onnx2tf + +# YOLO conversion +ultralytics diff --git a/docs/notebooks/start.sh b/docs/notebooks/start.sh new file mode 100755 index 000000000..1a25e3738 --- /dev/null +++ b/docs/notebooks/start.sh @@ -0,0 +1,10 @@ +#!/bin/sh +docker build . --tag ai_tools_docs +docker run `# Create a container from an image and runs a command in it.` \ + --rm \ + -v $(pwd):/home/jovyan/work:z `# Bind the current directory to the workdir in the container. The 'z' causes SELinux relabelling of the host directory to allow access by this container (and potentially others).` \ + --name notebooks `# ` \ + -p 8888:8888 `# Run on port 8888` \ + -it `# Launch in interactive mode` \ + ai_tools_docs `# Use image that was just built` \ + start.sh jupyter lab --NotebookApp.token='' --NotebookApp.password='' \ \ No newline at end of file diff --git a/docs/rst/arena_sharing.rst b/docs/rst/arena_sharing.rst new file mode 100644 index 000000000..2fb11fdd4 --- /dev/null +++ b/docs/rst/arena_sharing.rst @@ -0,0 +1,11 @@ +Managing scratch memory (the tensor arena) +========================================== + +Running two networks sharing one arena +-------------------------------------- + +You need to translate the networks as before, + + .. literalinclude:: ../../examples/app_flash_two_models_one_arena/src/main.cpp + +To be described in more detail. diff --git a/docs/rst/build-from-source.rst b/docs/rst/build-from-source.rst new file mode 100644 index 000000000..caf730830 --- /dev/null +++ b/docs/rst/build-from-source.rst @@ -0,0 +1,45 @@ +Compiling xmos-ai-tools from source +=================================== + +Requirements: +------------- + +* Install version 15 or later of the `XMOS tools `_ from your preferred location and activate it by sourcing ``SetEnv`` in the installation root. + +* `CMake 3.23 `_ or newer is required for building libraries and test firmware. + +* Clone the repository:: + + git clone git@github.com:xmos/ai_tools.git + cd ai_tools + +* Set up and activate a Python virtual environment (or conda):: + + python -m venv ./venv + . ./venv/bin/activate + +* Install the necessary python packages using ``pip`` inside the environment:: + + pip install -r ./requirements.txt + +Building: +--------- + +* Clone submodules and apply patch to ``tflite-micro``:: + + ./build.sh -T init + +* Build ``xformer`` and ``xinterpreter`` with the default settings:: + + ./build.sh -T all -b + +* (Optional) other ``./build.sh`` flags: + + * ``-d`` (debug) flag for a debug build. + * ``-c`` (clean) to remove build artifacts. + * ``-t`` (test) to run integration tests (on host) + * ``-l`` (lsp) to generate ``compile_commands.json`` + +* Install the Python package in your environment:: + + cd python && pip install . diff --git a/docs/rst/changelog.rst b/docs/rst/changelog.rst new file mode 100644 index 000000000..1da41ddeb --- /dev/null +++ b/docs/rst/changelog.rst @@ -0,0 +1,19 @@ +Changelog +========= + +Version 1.1.3 +------------- + + * Add IO server + * Add hardware testing + * Remove device and base interpreters, move host interpreter down + * Remove host interpreter smoke test + * Remove unused third party libraries + * Rename ``xcore_tflm_host_interpreter`` to ``TFLMHostInterpreter`` to follow Python naming conventions + + +Version 1.0.0 +------------- + + First release + diff --git a/docs/rst/faq.rst b/docs/rst/faq.rst new file mode 100644 index 000000000..f8992ad11 --- /dev/null +++ b/docs/rst/faq.rst @@ -0,0 +1,11 @@ +Frequently Asked Questions +========================== + + +Pytorch conversion produces unexpected results +---------------------------------------------- + +You can set an ONNX version number to use for the conversion. You may want +to experiment with different values, because some modern operators are +mapped to a sequence of basic operators rather than a single modern +operators if an old version of ONNX is used. diff --git a/docs/rst/flash.rst b/docs/rst/flash.rst new file mode 100644 index 000000000..d93cec4ff --- /dev/null +++ b/docs/rst/flash.rst @@ -0,0 +1,176 @@ +Using flash memory +================== + +In order to use flash memory with AI tools, your main program needs to be +slightly more complex. We discuss a sequence of options, starting with the +simplest one comprising a single network on a single physical core, and the +final one being a multi-core, multi-network one. + +Introduction +------------ + +XMOS devices enable you to use any type of flash device, as the device +drivers are programmed in software. AI-tools is shipped with a +high-performance flash driver for Quad-flash (also known as QPI or QSPI). +This fast driver measures, at start-up time, the latencies of the +particular flash device and particular XMOS device (due to process +variations and the input voltages on the particular board), and picks a +safe timing window to run the device at high speed; up to 133 MHz, 66 +MByte/s. + + +For each application program +---------------------------- + +#. Create a directory ``my_models/app_model_flash_single_core`` inside the working directory + +#. Copy your ``source_model.tflite`` file to this directory + +#. Run the graph-transformer:: + + xcore-opt source_model.tflite -o model.tflite --xcore-flash-image-file model.params + + This creates four files: + + * ``model.tflite`` - optimized tflite model file + + * ``model.tflite.cpp`` - optimized C++ model file + + * ``model.tflite.h`` - C++ header file which provides API + + * ``model.params`` - A file containing all parameters for this model + + The parameter file has to be made into a flash image (a file that can be + written to flash), for this use the ``generate_flash()`` function via the + Python interface. + + .. code-block:: Python + + from xmos_ai_tools import xformer as xf + xf.generate_flash( + output_file="xcore_flash_binary.out", + model_files=["model.tflite"], + param_files=["model.params"] + ) + + The flash image .out file can be flashed on XCORE.AI using ``xflash``:: + + xflash --data xcore_flash_binary.out --target XCORE-AI-EXPLORER + + Replace the target with the board that yyou use. + +#. Next create a src directory with the following main.xc file inside it: + + .. literalinclude:: ../../examples/app_flash_single_model/src/main.xc + +#. Move the output files ``model.tflite.cpp`` and ``model.tflite.h`` into + the src directory. + +#. Create a Makefile with the following lines: + + .. literalinclude:: ../../examples/app_flash_single_model/Makefile + +#. Create a file ``config.xscope`` with the following lines: + + .. literalinclude:: ../../examples/app_flash_single_model/src/config.xscope + +#. Source the tools according to your platform (Windows: double click the + tools icon; Mac: ``source /Applications/XMOS_XTC_/Setenv`` Linux: + ``pushd ; source SetEnv; popd``) + +#. Run:: + + ``xmake`` + +#. Plug an explorer board into your computer and run:: + + ``xrun --xscope bin/app.xe`` + +#. This should run the network + +Programs with more than one model +--------------------------------- + +If you have multiple Neural Networks, each of which wants to use flash, +then the first thing to do is to transform each in turn:: + + xcore-opt source_model1.tflite -o model1.tflite --xcore-flash-image-file model1.params + xcore-opt source_model2.tflite -o model2.tflite --xcore-flash-image-file model2.params + +This creates eight files + + * ``model1.tflite`` - optimized tflite model file for model 1 + * ``model1.tflite.cpp`` - optimized C++ model file for model 1 + * ``model1.tflite.h`` - C++ header file which provides API for model 1 + * ``model1.params`` - A file containing all parameters for model 1 + * ``model2.tflite`` - optimized tflite model file for model 2 + * ``model2.tflite.cpp`` - optimized C++ model file for model 2 + * ``model2.tflite.h`` - C++ header file which provides API for model 2 + * ``model2.params`` - A file containing all parameters for model 2 + +The parameter files have to be assembled together into a single flash image +(the file that can be written to flash), for this use the +``generate_flash()`` function via the Python interface. + + .. code-block:: Python + + from xmos_ai_tools import xformer as xf + xf.generate_flash( + output_file="xcore_flash_binary.out", + model_files=["model1.tflite", "model2.tflite"], + param_files=["1.params", "2.params"] + ) + +We need a slightly different main.xc: + + .. literalinclude:: ../../examples/app_flash_two_models/src/main.cpp + +* Move the output files ``model1.tflite.cpp``, ``model1.tflite.h``, + ``model2.tflite.cpp`` and ``model2.tflite.h`` into the src directory. + +Build and execute the binary + +Running two models on two separate cores +---------------------------------------- + +You need to translate the networks as before, but you need to provide a +multi-core main file that instructs the tool-chain to create different parts +of the program on each core. This multi-core main file is written in XC as +follows: + + .. literalinclude:: ../../examples/app_flash_4/src/main.xc + +If you have multiple Neural Networks, each of which wants to use flash, +then the first thing to do is to transform each in turn:: + + xcore-opt source_model1.tflite -o model1.tflite --xcore-flash-image-file model1.params + xcore-opt source_model2.tflite -o model2.tflite --xcore-flash-image-file model2.params + +This creates eight files + + * ``model1.tflite`` - optimized tflite model file for model 1 + * ``model1.tflite.cpp`` - optimized C++ model file for model 1 + * ``model1.tflite.h`` - C++ header file which provides API for model 1 + * ``model1.params`` - A file containing all parameters for model 1 + * ``model2.tflite`` - optimized tflite model file for model 2 + * ``model2.tflite.cpp`` - optimized C++ model file for model 2 + * ``model2.tflite.h`` - C++ header file which provides API for model 2 + * ``model2.params`` - A file containing all parameters for model 2 + +The parameter files have to be assembled together into a single flash image +(the file that can be written to flash), for this use the +``generate_flash()`` function via the Python interface. + + .. code-block:: Python + + from xmos_ai_tools import xformer as xf + xf.generate_flash( + output_file="xcore_flash_binary.out", + model_files=["model1.tflite", "model2.tflite"], + param_files=["1.params", "2.params"] + ) + +* Move the output files ``model1.tflite.cpp``, ``model1.tflite.h``, + ``model2.tflite.cpp`` and ``model2.tflite.h`` into the src directory. + +Build and execute the binary diff --git a/docs/rst/flow.rst b/docs/rst/flow.rst new file mode 100644 index 000000000..7b5c81a7b --- /dev/null +++ b/docs/rst/flow.rst @@ -0,0 +1,96 @@ +.. _work_flow: + +Work Flow +========= + +``xmos-ai-tools`` is available on https://pypi.org/project/xmos-ai-tools/. +It includes: + +* the MLIR-based XCore optimizer (``xformer``) to optimize Tensorflow Lite models for XCore +* the XCore tflm interpreter to run the transformed models on host +* the XCore tflm runtime to run transformed models on device + +Installation steps +------------------ + +Perform the following steps once + +* Install xmos-ai-tools:: + + # Create a virtual environment with + python3 -m venv + + # Activate the virtual environment + # On Windows, run: + \Scripts\activate.bat + # On Linux and MacOS, run: + source /bin/activate + + # Install xmos-ai-tools from PyPI + pip3 install xmos-ai-tools --upgrade + + Use ``pip3 install xmos-ai-tools --pre --upgrade`` instead if you want to install the latest development version. + + Installing ``xmos-ai-tools`` will make the xcore-opt binary available in your shell to use directly. + +* Obtain the tool-chain from http://www.xmos.ai/tools and install it according to the platform instructions. + +* Setup ``XMOS_AITOOLSLIB_PATH`` environment variable. This is used to identify the installed location of xmos-ai-tools library and headers. + + On Windows, run the following command:: + + FOR /F "delims=" %i IN ('python -c "import xmos_ai_tools.runtime as rt; import os; print(os.path.dirname(rt.__file__))"') DO set XMOS_AITOOLSLIB_PATH=%i + + On MacOS and Linux, run the following command:: + + export XMOS_AITOOLSLIB_PATH=$(python -c "import xmos_ai_tools.runtime as rt; import os; print(os.path.dirname(rt.__file__))") + + Optionally, you may add the relevant ``export`` command in ``venv/bin/activate`` (for pip) or a script in ``($CONDA_PREFIX)/etc/conda/activate.d/`` (for conda), to automatically set the environment variable upon activating your virtual environment. + + +Example applications +-------------------- + +These are 4 example models; in order of complexity + +* `app_no_flash <../../examples/app_no_flash/README.rst>`_ - a single model, no flash memory used. This is the + fastest but most pressure on internal memory. + +* `app_flash_single_model <../../examples/app_flash_single_model/README.rst>`_ - a single model, with learned parameters in + flash memory. This removes a lot of pressure on internal memory. + +* `app_flash_two_models <../../examples/app_flash_two_models/README.rst>`_ - two models, with learned parameters in flash memory. + +* `app_flash_two_models_one_arena <../../examples/app_flash_two_models_one_arena/README.rst>`_ - two models, with learned parameters in + flash memory. The models share a single tensor arena (scratch memory). + +For more examples, see the `examples folder <../../examples/README.rst>`_. + + +More info regarding the generated C++ model files +------------------------------------------------- + +The model code is compiled to C++ source and header. +The generated header file contains the simple API to interact with the model. +Some of the commonly used functions are: + +* ``model_init(void *flash_data)`` This takes a single parameter, which is a channel end to + the flash server. + +* ``model_input_ptr(int index)`` This returns a pointer to the data where + the input tensor should be stored; index should be set to zero unless there are + multiple inputs. + +* ``model_invoke()`` This runs an inference + +* ``model_output_ptr(int index)`` This returns a pointer to the data where + the output tensor would be stored. + +Integration with sensors +------------------------ + +In order to integrate with sensors, create separate threads (maybe on a +separate tile) that input data from a sensor, camera, microphone, etc, and +a thread that performs the signal pre-processing on it, prior to posting +the data to the neural network. + diff --git a/docs/rst/index.rst b/docs/rst/index.rst new file mode 100644 index 000000000..6130e7fd1 --- /dev/null +++ b/docs/rst/index.rst @@ -0,0 +1,64 @@ +AI tools User Guide +################### + +This document gives an introduction how to use the XMOS ai-tools and how to +deploy trained models on XCORE.AI. XCORE.AI is a multi-threaded +micro-controller by XMOS, capable of real-time IO, DSP, and fast execution +of neural networks. The XMOS ai-tools take a (trained) neural network and +compile it to code that can be optimised and compiled to execute on +XCORE.AI. The optimisation and compilation process can be controlled in +order to make trade-offs between costs, speed, and model-size. + +This document first explains which models are suitable to run on XCORE.AI, +and what configuration choices you have. After that we discuss how models +are executed on XCORE.AI. The third section on :ref:`work_flow` describes +how to download and run the tools. Tools are installed through ``pip`` and +can be executed either from the command-line or through Python. The tools +natively work with ``.tflite`` files, and there are two python-notebooks +that show how to go from ``pytorch`` instead. The final section of this +document describes how to use flash to store learned parameters. + +Appendices cover the options that the ``xformer`` supports, the operators +that are optimised, and how to build the ``xformer`` from source should you +wish to do so. + + +.. include:: xcore-ai-coding.rst + +|newpage| + +.. include:: prepare.rst + +|newpage| + +.. include:: flow.rst + +|newpage| + +.. include:: pytorch.rst + +|newpage| + +.. include:: flash.rst + +|newpage| + +.. include:: changelog.rst + +|appendices| + +|newpage| + +.. include:: options.rst + +|newpage| + +.. include:: operators.rst + +|newpage| + +.. include:: build-from-source.rst + +|newpage| + +.. include:: faq.rst diff --git a/docs/rst/operators.rst b/docs/rst/operators.rst new file mode 100644 index 000000000..304883bd7 --- /dev/null +++ b/docs/rst/operators.rst @@ -0,0 +1,58 @@ +Operators +========= + +Virtually all tensorflow-lite-for-micro operators are supported +with the exception of Variables, While, and If. Only very few operators +have been optimised to run efficiently on XCORE; those that typically +account for 99% of the execution time. + +Optimized operators +------------------- + +The following operators can be optimized by the xcore optimizer into an +equivalent faster or more memory efficient operator: + +* Conv2D + +* Conv2DDepthwise + +* Conv2DTranspose + +* FullyConnected + +* MaxPool2D + +* AvgPool2D + +* Add + +* Mul + +* Concatenate + +* Pad + +* Slice or StridedSlice with a stride of 1 + +* Tanh, Sigmoid, Hardswish, Relu + +We are always interested to know of operators that take on a large +proportion of your model. + +Constraints on operators +------------------------ + +Some xcore optimizable operators have constraints on them which dictate +situations where they can not be optimized. In particular: + +* Make sure that each convolution outputs a multiple of FOUR channels. + +* For optimal speed, the number of input channels should be a multiple of + 16, otherwise 4. + +* For a first image convolution that typically has three channels (YUV, + RGB), the graph transformer will insert a fast pad from three to four. + +* For a convolution, execution is fast when the bias term is reasonably + close to zero. + diff --git a/docs/rst/options.rst b/docs/rst/options.rst new file mode 100644 index 000000000..8eb87a725 --- /dev/null +++ b/docs/rst/options.rst @@ -0,0 +1,134 @@ +Graph transformation options +============================ + +The graph transformer can be controlled through options. For example, one +can use options to set the level of parallelism to use or to specify the +name of the output file. + +The method of providing options depends on how the graph transformer is +invoked; whether it is invoked from a Python environment or from a +command-line environment. In both cases, the same options can be provided. +Below, we first describe how to pass options from Python and command-line +arguments respectively, then a list of most-used options, and then a list +of all options. + +Transformation options in a Python environment +---------------------------------------------- + +The Python interface "xmos-ai-tools" available through PyPi contains the xcore +optimiser (xformer) for optimising suitable tflite models. This module can be imported +using: + +.. code-block:: Python + + from xmos_ai_tools import xformer + +The main method in xformer is convert, which requires an path to an input model, +an output path, and a list of parameters. The parameters should be a list of tuple, +with first item the option name and second item the corresponding value. + +.. code-block:: Python + + xf.convert("example_int8_model.tflite", "xcore_optimized_int8_model.tflite", + params = [ + ("xcore-thread-count", 4), + ("xcore-reduce-memory", None), + ] + ) + +The possible options are described below in the command line interface section. If the default operation is intended this third argument can be "None". + +.. code-block:: Python + + xf.convert("example_int8_model.tflite", "xcore_optimized_int8_model.tflite", + params = None + ) + + +Transformation options in a command-line environment +---------------------------------------------------- + +Upon installing the "xmos-ai-tools" from PyPi, the program ``xcore-opt`` is +available on the command-line. It is called with at least two arguments (the +input model and the output model), and all other configuration options are specified with a ``--`` ahead of it, eg:: + + xcore-opt example_int8_model.tflite -o output_model.tflite --xcore-thread-count 4 --xcore-reduce-memory + + +Options +------- + + +``-o `` +++++++++++++++++++++++++++++++++++++++ + +Name of the file where to place the optimized TFLITE model + +``xcore-thread-count N`` +++++++++++++++++++++++++ + +Number of threads to translate for (max=5). Defaults to 1. + + +``xcore-weights-file filename`` ++++++++++++++++++++++++++++++++++++ + +File to place the learned parameters in. If this option is not specified, +the learned parameters are kept by the model. This will increase the amount +of RAM required by the model but is very fast. When this option is used, +the learned parameters are placed in a file that must be flashed onto the +hardware, and the learned parameters will be streamed from flash. This can +be slower but allows large numbers of learned parameters to be used. + +``xcore-load-externally-if-larger N`` ++++++++++++++++++++++++++++++++++++++ + +Sets a threshold under which to not place learned parameters in flash. The +default is set to 96 bytes. If less than 96 bytes, the overhead of lowering to flash is +more than the benefit gained. This option is only meaningful if +``xcore-weights-file`` has been used. You can experiment with this +parameter to get a different trade-off between speed and memory requirements. + +``xcore-reduce-memory true|false`` +++++++++++++++++++++++++++++++++++ + +Try to reduce memory usage by possibly increasing +execution time. Default is true + +``xcore-conv-err-threshold R`` +++++++++++++++++++++++++++++++ + +When optimising convolutions small inaccuracies are introduced, due to the +nature of fixed point comitations. These errors are typically small and +happen infrequently. The default threshold is 0.25, meaning that the +largest error that is acceptable is two bits below the decimal comma (in +integer arithmetic). If an error higher than this occurs, the compiler will +fall back on a less optimal convolution that produces a better result. + +You can adjust this parameter to get a different trade-off between +execution speed and accuracy of the result. + + +Advanced options +---------------- + +``xcore-force-conv-err-full-check`` ++++++++++++++++++++++++++++++++++++ + +By default a the above option calculates an upper-bound for the error. +Setting this option calculates the precise maximum error at the cost of +(significant) extra compile-time. + +``xcore-conv-multiplier-factor`` +++++++++++++++++++++++++++++++++ + +There are networks where large errors in a layer can be fixed by changing +the quantization. This option limits outliers in the multipliers of a +convolution to a factor of N larger than the minimum. THe default for N is +0x7fffffff (ie, no limit). + +``xcore-dont-minify`` ++++++++++++++++++++++ + +Normally the TFLITE model is minified, by reducing string lengths, using +this option enables you to keep the old strings. diff --git a/docs/rst/prepare.rst b/docs/rst/prepare.rst new file mode 100644 index 000000000..d860ab869 --- /dev/null +++ b/docs/rst/prepare.rst @@ -0,0 +1,53 @@ +How to prepare a network for XCORE.AI +===================================== + +The general approach to encoding a problem that incorporates a trained +network on an XCORE.AI chip is as follows: + + #. You train your network as normal, using for example Keras. + + #. You quantize your network to ``int8`` and convert it to TensorFlow + Lite. We also support ``16x8`` where intermediate results occupy 16 + bits and parameters are stored in eight bits. + You can keep the occasional float operation in the network without + affecting performance. + + #. You optimize your network for XCORE.AI + + #. You evaluate and deploy your network on XCORE.AI + +Several components are being used in this process: + + * A *training framework*. This can be any training framework that is + available as long as there is a way to produce TensorFlow Lite on the + output. This may be through, for example, exporting to ONNX. + + * A *quantizer*. The post training quantization step takes your + network and a set of representative data, and transforms all operators + to operate on low-precision integers. Rather than operating on floating + point values (16- or 32-bit floating point numbers), the network will be + operating on signed bytes (8-bit integers in the range [-128..127]). + + In order to compute an appropriate mapping from floating point values + to integer values, you need to provide a representative dataset to be used + during the transformation, and this will ensure that intermediate + values use the full range of int8 values. + + Typically we use the TensorFlow Lite quantizer to perform this step, + and the output of this step is a *flatbuffer* that contains the + architecture of the model and all the coefficients. + + * An *xcore transformer*. It takes a flatbuffer from the previous step, + and converts it into a flatbuffer that has been optimized for the + XCORE. Note that this step is not required, and the flatbuffer can be + executed "as is", but this execution will be painfully slow. The xcore + transformer simply produces an xcore-specific flatbuffer given a + generic flatbuffer, using operators optimized for xcore. + + * An *xcore.ai compiler*. It takes a flatbuffer and compiles it to C++, which + then be compiled to a binary to be executed on the xcore. + +The xcore transformer, compiler, and run-time support can all be installed +with a single pip command: . They can be used +through a python interface or from the command line as required. + diff --git a/docs/rst/pytorch.rst b/docs/rst/pytorch.rst new file mode 100644 index 000000000..f1c9703ca --- /dev/null +++ b/docs/rst/pytorch.rst @@ -0,0 +1,11 @@ +Converting models from Pytorch +============================== + +There are `python notebook examples +`_ for +converting MobilenetV2 from PyTorch to Tensorflow Lite. + +.. toctree:: + + ../notebooks/pytorch_to_tflite/mobilenet/pytorch_to_tflite + ../notebooks/pytorch_to_tflite/mobilenet/pytorch2keras diff --git a/docs/rst/xcore-ai-coding.rst b/docs/rst/xcore-ai-coding.rst new file mode 100644 index 000000000..05b08afef --- /dev/null +++ b/docs/rst/xcore-ai-coding.rst @@ -0,0 +1,210 @@ +Model suitability +================= + +The first question that you will have is "can I run my model on your +device". The answer depends on the model and the economic constraints of +the hardware that you wish to deploy the model on. We first explain the +variables of the model, then the characteristics of the XCORE device, and +then some rules of thumb. + +Model characteristics +--------------------- + +Not all models are suitable to be ran on the edge, or indeed execute on +XCORE.AI. In general a model is characterised by the amount of memory that +is needed, the amount of compute, and the type of compute. + +Memory required: + +* The size and number of learned parameters, also known as the + coefficients of the model. A small size is beneficial to run on the + edge, but a larger number may be required to achieve the desired + inferencing accuracy. + + Note that there is a difference between the *number* and *size* of the + parameters. Typically a trained model uses four bytes for each + parameters, but after quantisation it only uses one byte for each + parameter, meaning that the same number of parameters fits in a quarter + of the space. + +* The space required for the *tensor arena*. The tensor arena is the + scratch memory that is needed to store the temporary values used by the + network, whilst evaluating the network. The tools that we provide will + help you by calculating this number. + + The space is determined by the complexity of the model and by the + accuracy at which the model is executed. Some networks are designed to + keep more temporary tensors alive and therefore require more space. You + may choose to execute a network that is recurrant in nature at a higher + accuracy, requiring more space. + +* The size of the model excluding the learned parameters. This stores + information on how the graph is connected, quantisation parameters, + tensors sizes, etc. This is typically tens of kilobytes. It is linear in + the number of operators in the model + +Compute required: + +* The number of operations that a model requires, this is typically + expressed as the number of multiply-accumulate operations. + +Type of compute: + +* The operators used in your network. Operators are the basic instructions + that are performed during inferencing, and may be operations such as + 2D-convolutions, addition, or post-processing-detect. + +* The data types used in the model, this may be floats, half floats, int8, + etc. Typically models are trained using floating point arithmetic, but in + order to save on memory requirements and memory bandwidth they are often + *quantized* to 8-bit coefficients and values. + +In addition, there may be a required set of IO devices (sensors, actuators) +that surround the model. + + +XCORE.AI characteristics +------------------------ + +XCORE.AI is an embedded device, and as such there are constraints as to the +size an complexity of the models that can be executed. Multiple xcore.ai +devices can be connected to each other to create larger systems, and +external memory can be connected to increase the usable memory size. +However, there is a limit to what is economical to use for a certain problem. +A single XCORE.AI device comprises: + +* Two processors, each with their own memory, each capable of executing + up to 600 or 800 MHz depending on the version of the device. + +* Each processor has 512 kByte of memory (0.5 MByte) which is used for + storing code, model, and/or parameters + +* Each processor can execute up to 32 multiply accumulates per + clock cycle (on int8), for a total absolute maximum of 51.2 GMacc/s + +The device typically needs at least one flash device to store permanent +data (eg, code to boot from, model parameters etc), capable of storing 2-16 +MByte of data. In some situations the flash can be avoided if another +processor in the system can serve as a boot-server. + +An XCORE.AI device may be connected to an external LPDDR memory, capable of storing +64-128 MByte of data. Multiple XCORE.AI devices may be connected to each other, +scaling memory and performance. + +XCORE.AI devices can connect to MIPI cameras (up to 190 Mpixel/s at 8-bit +pixels), MEMS microphones (as many as the system needs, typically 1-8), SPI +radar devices, or other sensors. A wide variety of protocols are available +to communicate with devices or actuators. + +What models fit on XCORE.AI? +---------------------------- + +There is no hard limit on the number of parameters for a model, but larger +models do slow down. Very small models (say, 100 kByte) are held in +internal memory, larger models are typically streamed from flash. The +latter enables networks with up to a few million learned parameters to +execute efficiently. Significantly larger networks, with tens of millions +of learned parameters can be executed from flash, but the speed of +execution (frame rate) may be lower than desired. Large models may be +stored in external LPDDR memory which is fast but has a slightly higher BOM +cost. + +The size of the tensor arena can be a bottleneck. For optimal execution, +the tensor arena is held in internal memory, which limits the tensor arena +to a few hundred kbytes in size. The XMOS AI tools have methods of +minimising the required tensor arena. Larger tensor arenas can be stored in +external memory, if the BOM cost can sustain adding an external LPDDR +memory. This removes most limits on the size of the tensor arena. + +The third part that needs to be stored somewhere is the architecture of the +model. This can either go in internal or external memory; it cannot be +stored in flash. + +Finally memory is also required to store the code that executes the +operators. The size of the code is around 100-200 kByte - depending on the +number of different operators that are used, and whether code other +than AI code is present. + +We support most operators and types that are in TensorFlow Lite +for Micro; but only a subset of those operators have been optimized to run +on the device. The list of operators supported are TensorFlow Lite for +Microcontrollers operations listed `here `_, except the following operations: +- ``assign_variable``, ``call once``, ``if``, ``read variable``, ``var_handle``, ``while``. + +Convolutional networks with int8 datatypes typically run at +high speed. It is fine for some operations to execute as float32. As long +as the very large convolutions use int8 encodings the model is typically +executed efficiently. The tools support dense layers, but the nature of dense +layers means that every multiplication needs its own learned parameter +which means that the execution speed of large dense layers may be limited +by the speed of backing store where the parameters come from. + +In addition to the common int8, int16, and float +types we support highly efficient execution of +1-bit networks (also known as binarised neural networks or XNOR networks). +These can execute at a rate of up to 256 GMacc/s. + +Needless to say, this creates a very large number of options, from very +large systems to very small systems. We show the use cases of a few systems +below. + +XCORE.AI with 64Mbyte LPDDR memory +---------------------------------- + +This system has very little contraints. It can execute large models that +are held in external memory, and the tensor arena can either be held in +external or internal memory. + +If the tensor arena is held in external memory, then the total sum of the +tensor arena and the model should not exceed 64 Mbyte; for example, you may +have 60 MByte of parameters, and 4 MByte of tensor arena. + +If the tensor arena is small enough (less than a few hundred kilobytes) then +you can store the tensor arena in internal memory and the model in external +memory. The advantage of this configuration is that it is faster, and you +can use the whole external memory for parameters. + +Having an external memory is a good evaluation system for an initial +network, and it can be used to run large networks before they are optimized +down into smaller networks. + +XCORE.AI without external memory +-------------------------------- + +Without external memory, there are fewer options as to where the store the +model and the data. In particular, the tensor arena must be stored in +internal memory, and is therefore limited to around a few hundred kilobytes. The +model can either be stored in internal memory too or in flash memory. + +Storing the learned parameters in internal memory reduces the amount of memory available for +the tensor arena, but it is the fastest and most low power way to execute a +model. Storing the learned parameters in flash will result in a slower execution, but +will leave all of internal memory available for the tensor arena. As flash +cannot be written efficiently it cannot be used for the tensor arena. + +Assuming that the learned parameters are stored in flash, that means that +the internal memory will be shared between code (instruction sequences +implementing the operators), the tensor arena, and the model architecture. +These three should sum up to no more than 512 kByte. + +Using multiple processors +------------------------- + +In XCORE.AI each processor has 512 kBytes of memory; that means that there +are various ways in which the model can be split over two or more +processors. Examples of splits are: + +* A problem that requires more than one model, may execute one model on + each tile. + +* A model can be split in a first and second part, with each part running + on a processor. It may be that the split is organised so that one part + of the model needs a large tensor arena with a small number of + parameters, and the second part needs a small tensor arena with many + parameters. + +* A model may be split into a left and a right half, where each half + occupies a processor. This means that each processor only stores part + of the tensor arena. The current version of xcore-opt has no automated + support for this. + diff --git a/docs/settings.yml b/docs/settings.yml new file mode 100644 index 000000000..5d423961c --- /dev/null +++ b/docs/settings.yml @@ -0,0 +1,16 @@ +# This file relates to internal XMOS infrastructure and should be ignored by users + +project: 'ai-tools' +title: 'AI tools documentation' +version: 1.0.0 + +documentation: + exclude_patterns_path: exclude-patterns.inc + root_doc: rst/index.rst + latex_toc_depth: 1 + cognidox_part_number: XM-015210-UG + pdfs: + rst/index.rst: + pdf_title: '{{title}}' + pdf_filename: 'ai_tools_v{{version}}' + diff --git a/environment.yml b/environment.yml deleted file mode 100644 index 56d4cc875..000000000 --- a/environment.yml +++ /dev/null @@ -1,9 +0,0 @@ -channels: - - conda-forge - - defaults -dependencies: - - bazel=4.0.0 - - patch=2.7.5 - - cmake=3.14.0 - - make=4.2.1 - - python=3.8 diff --git a/examples/README.rst b/examples/README.rst new file mode 100644 index 000000000..d93b18e32 --- /dev/null +++ b/examples/README.rst @@ -0,0 +1,20 @@ +Example applications +---------------------------- + +These are 6 example models; in order of complexity + +* `app_no_flash `_ - a single model, no flash memory used. This is the + fastest but most pressure on internal memory. + +* `app_flash_single_model `_ - a single model, with learned parameters in + flash memory. This removes a lot of pressure on internal memory. + +* `app_flash_two_models <.app_flash_two_models/README.rst>`_ - two models, with learned parameters in flash memory. + +* `app_flash_two_models_one_arena `_ - two models, with learned parameters in + flash memory. The models share a single tensor arena (scratch memory). + +* `app_mobilenetv2 `_ - exporting a MobileNetV2 model (with flash) via xformer, with example inference + on host (via interpreter) and on device. + +* `app_profiling `_ - demonstrates how to enable and use profiling to speed up execution. diff --git a/examples/app_flash_4/src/main.xc b/examples/app_flash_4/src/main.xc new file mode 100644 index 000000000..11750c00c --- /dev/null +++ b/examples/app_flash_4/src/main.xc @@ -0,0 +1,37 @@ +#include +#include "flash_server.h" + +#define NFLASH_SPECS 1 +fl_QuadDeviceSpec flash_spec[NFLASH_SPECS] = { + FL_QUADDEVICE_MACRONIX_MX25R6435FM2IH0 +}; + +fl_QSPIPorts qspi = { + PORT_SQI_CS, + PORT_SQI_SCLK, + PORT_SQI_SIO, + XS1_CLKBLK_2 +}; + +extern void network_1(chanend channel_to_network_2); +extern void network_2(chanend channel_to_network_1); + +int main(void) { + chan c_flash[2], c_1_to_2; + par { + on tile[0] : { + flash_t headers[NNETWORKS]; + chanend c_flash[NNETWORKS]; + + flash_server(c_flash, headers, NNETWORKS, + &qspi, &flash_spec, NFLASH_SPEC); + } + on tile[0] : { + network_1(c_flash[0], c_1_to_2); + } + on tile[1] : { + network_2(c_flash[1], c_1_to_2); + } + } + +} diff --git a/examples/app_flash_single_model/Makefile b/examples/app_flash_single_model/Makefile new file mode 100644 index 000000000..d03c1d73e --- /dev/null +++ b/examples/app_flash_single_model/Makefile @@ -0,0 +1,32 @@ +TARGET = XCORE-AI-EXPLORER-800 +APP_NAME = + +APP_FLAGS = -report \ +-O3 -mcmodel=large -fxscope -Wno-xcore-fptrgroup \ +-g \ +-lquadflash + +# ******************************************************* +# Include AI Tools library and headers +# ******************************************************* +# The following variables are defined for AI Tools library +# and should be included when building the app. +# XMOS_AITOOLSLIB_DEFINITIONS +# XMOS_AITOOLSLIB_INCLUDES +# XMOS_AITOOLSLIB_LIBRARIES +# +ifeq ($(XMOS_AITOOLSLIB_PATH),) +$(error Path to XMOS AI Tools library and headers not set correctly!) +endif +include ${XMOS_AITOOLSLIB_PATH}/buildfiles/aitoolslib.make + +XCC_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_CPP_FLAGS = $(APP_FLAGS) -std=c++14 $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_MAP_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_LIBRARIES) + +#============================================================================= +# The following part of the Makefile includes the common build infrastructure +# for compiling XMOS applications. You should not need to edit below here. + +XMOS_MAKE_PATH ?= ../.. +include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common diff --git a/examples/app_flash_single_model/README.rst b/examples/app_flash_single_model/README.rst new file mode 100644 index 000000000..fbd004eb8 --- /dev/null +++ b/examples/app_flash_single_model/README.rst @@ -0,0 +1,36 @@ +Example with flash +================== + +Please consult `here <../../docs/rst/flow.rst>`_ on how to install the tools. + +In order to compile and run this example follow these steps:: + + xcore-opt --xcore-weights-file=model.params vww_quant.tflite -o model.tflite + mv model.tflite.cpp model.tflite.h src + xmake + python -c 'from xmos_ai_tools import xformer as xf; xf.generate_flash( + output_file="xcore_flash_binary.out", + model_files=["model.tflite"], + param_files=["model.params"] + )' + xflash --target XCORE-AI-EXPLORER --data xcore_flash_binary.out + xrun --xscope bin/app_flash_single_model.xe + +This should print:: + + No human (9%) + Human (98%) + +The difference with the version in ``../app_no_flash`` is that we have sent +the learned parameters into flash memory; this has significantly reduced +the size of the model. We can see this by looking at the size of the files:: + + % ls -l model.* + -rw-r--r-- 1 henk staff 224576 18 Jul 11:07 model.params + -rw-r--r-- 1 henk staff 20032 18 Jul 11:07 model.tflite + +The model.params file needs to be made into a flash image, which is what +the python command does. Finally, before we execute it, we must program the +flash with the learned parameters, which is what ``xflash`` is for. + + diff --git a/examples/app_flash_single_model/src/config.xscope b/examples/app_flash_single_model/src/config.xscope new file mode 100644 index 000000000..ef80fed5b --- /dev/null +++ b/examples/app_flash_single_model/src/config.xscope @@ -0,0 +1,3 @@ + + + diff --git a/examples/app_flash_single_model/src/image.h b/examples/app_flash_single_model/src/image.h new file mode 100644 index 000000000..dc3c860a3 --- /dev/null +++ b/examples/app_flash_single_model/src/image.h @@ -0,0 +1,27650 @@ +int8_t image[3*96*96] = { + 73, + 40, + 0, + 73, + 40, + -4, + 77, + 44, + 0, + 78, + 44, + -1, + 74, + 37, +-11, + 71, + 36, +-14, + 70, + 36, + -8, + 66, + 33, + -7, + 65, + 32, + -5, + 64, + 32, + -4, + 63, + 33, + -2, + 63, + 35, + 1, + 65, + 39, + 10, + 67, + 42, + 16, + 67, + 44, + 19, + 67, + 46, + 22, + 68, + 49, + 27, + 68, + 52, + 30, + 69, + 54, + 37, + 72, + 58, + 42, + 74, + 61, + 46, + 77, + 64, + 53, + 78, + 69, + 56, + 82, + 72, + 60, + 83, + 75, + 64, + 85, + 77, + 68, + 87, + 79, + 72, + 89, + 81, + 76, + 91, + 84, + 78, + 92, + 85, + 80, + 93, + 88, + 82, + 95, + 89, + 85, + 95, + 90, + 87, + 96, + 91, + 88, + 97, + 92, + 89, + 97, + 92, + 89, + 98, + 93, + 90, + 98, + 93, + 90, + 99, + 94, + 91, + 99, + 94, + 92, + 99, + 93, + 91, + 99, + 93, + 91, +100, + 94, + 92, + 99, + 94, + 91, + 99, + 93, + 91, + 99, + 93, + 91, +100, + 94, + 91, + 99, + 94, + 90, +100, + 95, + 91, +100, + 95, + 91, + 99, + 94, + 89, + 99, + 94, + 88, + 98, + 93, + 88, + 98, + 93, + 88, + 98, + 92, + 87, + 97, + 92, + 86, + 97, + 91, + 85, + 97, + 91, + 84, + 96, + 89, + 82, + 95, + 89, + 82, + 96, + 89, + 82, + 95, + 89, + 82, + 95, + 88, + 81, + 94, + 87, + 79, + 93, + 86, + 76, + 93, + 86, + 76, + 92, + 85, + 75, + 92, + 85, + 75, + 91, + 84, + 75, + 90, + 83, + 73, + 89, + 82, + 72, + 88, + 81, + 70, + 88, + 81, + 70, + 87, + 81, + 69, + 87, + 80, + 68, + 87, + 80, + 68, + 88, + 79, + 68, + 88, + 80, + 68, + 89, + 79, + 68, + 88, + 78, + 67, + 88, + 78, + 66, + 88, + 77, + 65, + 87, + 76, + 64, + 86, + 75, + 63, + 85, + 74, + 61, + 86, + 74, + 58, + 86, + 73, + 58, + 86, + 73, + 57, + 86, + 74, + 58, + 85, + 72, + 57, + 86, + 72, + 57, + 85, + 71, + 55, + 85, + 71, + 56, + 85, + 71, + 55, + 83, + 69, + 53, + 82, + 68, + 51, + 73, + 37, +-28, + 72, + 38, +-11, + 72, + 38, + -2, + 74, + 41, + -5, + 77, + 44, + -3, + 77, + 40, + -8, + 71, + 33, +-21, + 68, + 31, +-20, + 67, + 31, +-13, + 63, + 28, +-13, + 64, + 28, +-11, + 62, + 28, +-12, + 63, + 30, + -8, + 62, + 33, + -1, + 63, + 36, + 5, + 64, + 37, + 9, + 63, + 38, + 11, + 63, + 40, + 12, + 64, + 42, + 16, + 64, + 43, + 19, + 65, + 45, + 23, + 66, + 47, + 26, + 68, + 49, + 29, + 69, + 51, + 33, + 70, + 53, + 34, + 71, + 56, + 40, + 72, + 58, + 43, + 73, + 61, + 46, + 77, + 64, + 50, + 76, + 67, + 54, + 78, + 70, + 56, + 81, + 72, + 60, + 82, + 73, + 64, + 82, + 75, + 66, + 84, + 77, + 68, + 85, + 78, + 69, + 86, + 79, + 70, + 86, + 80, + 71, + 88, + 82, + 74, + 89, + 82, + 75, + 90, + 84, + 79, + 90, + 84, + 79, + 91, + 85, + 79, + 92, + 85, + 79, + 92, + 86, + 78, + 92, + 86, + 78, + 94, + 88, + 78, + 94, + 88, + 79, + 95, + 89, + 79, + 95, + 89, + 80, + 95, + 89, + 80, + 95, + 89, + 80, + 95, + 89, + 79, + 95, + 89, + 79, + 96, + 89, + 78, + 95, + 89, + 77, + 95, + 88, + 76, + 95, + 88, + 76, + 94, + 88, + 76, + 94, + 87, + 75, + 93, + 87, + 75, + 93, + 87, + 74, + 92, + 86, + 74, + 91, + 85, + 73, + 90, + 83, + 71, + 89, + 82, + 70, + 87, + 81, + 69, + 86, + 80, + 68, + 85, + 79, + 66, + 85, + 79, + 66, + 85, + 78, + 66, + 85, + 76, + 65, + 84, + 76, + 64, + 84, + 75, + 63, + 85, + 75, + 63, + 84, + 74, + 61, + 84, + 74, + 62, + 84, + 73, + 60, + 84, + 72, + 57, + 83, + 71, + 57, + 83, + 71, + 56, + 83, + 70, + 53, + 83, + 70, + 52, + 82, + 69, + 51, + 81, + 68, + 50, + 80, + 66, + 48, + 82, + 65, + 47, + 80, + 65, + 46, + 79, + 64, + 43, + 78, + 62, + 41, + 79, + 61, + 40, + 77, + 59, + 38, + 75, + 57, + 34, + 73, + 53, + 30, + 70, + 48, + 26, + 66, + 41, + 18, + 77, + 41, +-27, + 76, + 38, +-30, + 72, + 35, +-27, + 70, + 36, +-12, + 71, + 37, +-10, + 74, + 37, +-10, + 77, + 39, +-12, + 72, + 34, +-23, + 67, + 26, +-31, + 64, + 25, +-28, + 61, + 22, +-27, + 60, + 22, +-26, + 59, + 21, +-25, + 59, + 22, +-23, + 59, + 23, +-21, + 59, + 25, +-16, + 59, + 26, +-14, + 59, + 27, +-10, + 60, + 27, +-10, + 60, + 29, + -7, + 61, + 30, + -4, + 61, + 32, + -1, + 61, + 33, + 1, + 62, + 34, + 2, + 62, + 35, + 3, + 62, + 36, + 7, + 62, + 37, + 8, + 63, + 40, + 11, + 65, + 42, + 15, + 65, + 43, + 19, + 66, + 46, + 23, + 67, + 49, + 28, + 68, + 52, + 30, + 69, + 54, + 35, + 70, + 56, + 38, + 71, + 58, + 42, + 73, + 61, + 45, + 74, + 63, + 48, + 76, + 65, + 51, + 76, + 67, + 54, + 78, + 69, + 58, + 79, + 71, + 60, + 81, + 73, + 61, + 83, + 75, + 63, + 84, + 77, + 65, + 86, + 80, + 67, + 87, + 81, + 68, + 89, + 83, + 70, + 91, + 85, + 72, + 92, + 86, + 73, + 92, + 87, + 74, + 94, + 88, + 75, + 94, + 88, + 75, + 94, + 88, + 75, + 95, + 89, + 76, + 95, + 89, + 76, + 95, + 89, + 76, + 94, + 88, + 75, + 94, + 88, + 75, + 94, + 88, + 75, + 93, + 86, + 73, + 92, + 86, + 73, + 91, + 85, + 72, + 90, + 84, + 71, + 88, + 81, + 68, + 87, + 79, + 66, + 85, + 78, + 62, + 84, + 75, + 60, + 82, + 74, + 59, + 82, + 71, + 57, + 81, + 69, + 55, + 80, + 68, + 52, + 79, + 66, + 48, + 79, + 65, + 46, + 79, + 64, + 46, + 77, + 63, + 43, + 77, + 63, + 42, + 76, + 62, + 41, + 76, + 60, + 39, + 77, + 60, + 38, + 78, + 59, + 37, + 78, + 58, + 35, + 77, + 56, + 34, + 76, + 55, + 32, + 76, + 54, + 28, + 75, + 52, + 26, + 74, + 51, + 22, + 74, + 49, + 20, + 73, + 48, + 19, + 72, + 46, + 13, + 70, + 43, + 9, + 69, + 39, + 6, + 67, + 36, + 1, + 64, + 32, + -5, + 61, + 27, +-10, + 57, + 23, +-16, + 79, + 43, +-24, + 77, + 41, +-27, + 75, + 39, +-29, + 75, + 36, +-31, + 71, + 33, +-29, + 66, + 31, +-21, + 69, + 31, +-20, + 69, + 33, +-24, + 69, + 31, +-26, + 64, + 23, +-36, + 60, + 18, +-39, + 59, + 17, +-38, + 56, + 16, +-38, + 56, + 16, +-37, + 55, + 16, +-37, + 53, + 15, +-37, + 54, + 16, +-38, + 54, + 15, +-34, + 54, + 15, +-34, + 54, + 15, +-34, + 54, + 15, +-31, + 55, + 15, +-30, + 53, + 15, +-30, + 55, + 16, +-29, + 54, + 16, +-28, + 54, + 18, +-27, + 54, + 17, +-25, + 55, + 18, +-24, + 56, + 19, +-23, + 56, + 19, +-23, + 56, + 19, +-21, + 55, + 20, +-20, + 54, + 21, +-18, + 53, + 22, +-15, + 52, + 23, +-12, + 52, + 24, + -8, + 52, + 25, + -5, + 53, + 26, + -3, + 54, + 29, + -1, + 54, + 31, + 2, + 55, + 34, + 6, + 58, + 38, + 12, + 62, + 43, + 17, + 65, + 47, + 22, + 69, + 53, + 28, + 73, + 58, + 34, + 75, + 62, + 38, + 78, + 66, + 41, + 81, + 69, + 45, + 83, + 71, + 47, + 84, + 72, + 49, + 85, + 73, + 51, + 87, + 74, + 53, + 88, + 76, + 53, + 87, + 76, + 53, + 86, + 76, + 54, + 86, + 76, + 52, + 87, + 75, + 51, + 86, + 74, + 52, + 85, + 73, + 50, + 85, + 73, + 49, + 83, + 71, + 48, + 82, + 69, + 46, + 79, + 66, + 43, + 77, + 62, + 38, + 74, + 58, + 33, + 69, + 52, + 27, + 66, + 47, + 21, + 62, + 42, + 15, + 61, + 38, + 10, + 59, + 36, + 7, + 60, + 35, + 6, + 62, + 36, + 5, + 62, + 34, + 4, + 62, + 34, + 2, + 63, + 34, + 1, + 64, + 35, + -1, + 65, + 36, + -1, + 67, + 35, + -1, + 69, + 37, + 1, + 70, + 38, + 1, + 70, + 39, + -1, + 71, + 38, + -2, + 70, + 38, + -3, + 70, + 37, + -5, + 70, + 37, + -7, + 68, + 35, + -8, + 68, + 33, +-10, + 68, + 32, +-13, + 67, + 30, +-14, + 65, + 29, +-16, + 65, + 28, +-18, + 65, + 26, +-19, + 63, + 25, +-20, + 65, + 25, +-21, + 63, + 25, +-22, + 80, + 45, +-23, + 78, + 42, +-25, + 77, + 41, +-27, + 76, + 39, +-29, + 75, + 35, +-32, + 70, + 30, +-37, + 65, + 25, +-38, + 61, + 23, +-32, + 62, + 22, +-33, + 65, + 24, +-34, + 65, + 24, +-35, + 64, + 22, +-35, + 65, + 24, +-33, + 64, + 23, +-33, + 63, + 21, +-33, + 62, + 21, +-34, + 62, + 21, +-34, + 61, + 20, +-35, + 59, + 19, +-35, + 59, + 19, +-35, + 58, + 19, +-34, + 57, + 19, +-33, + 57, + 19, +-31, + 57, + 19, +-32, + 57, + 19, +-32, + 57, + 19, +-31, + 58, + 19, +-31, + 57, + 18, +-31, + 58, + 19, +-29, + 58, + 19, +-29, + 58, + 19, +-29, + 57, + 18, +-30, + 56, + 17, +-30, + 54, + 14, +-30, + 51, + 14, +-30, + 49, + 14, +-28, + 49, + 14, +-28, + 49, + 14, +-28, + 48, + 14, +-28, + 46, + 12, +-31, + 43, + 8, +-34, + 38, + 3, +-41, + 39, + 4, +-39, + 45, + 10, +-34, + 51, + 16, +-29, + 58, + 24, +-22, + 62, + 29, +-18, + 65, + 32, +-17, + 66, + 34, +-13, + 67, + 36, +-12, + 67, + 36, +-14, + 68, + 37, +-14, + 69, + 37, +-12, + 69, + 38, +-12, + 72, + 40, + -8, + 74, + 42, + -4, + 75, + 44, + 0, + 75, + 46, + 1, + 76, + 45, + 2, + 73, + 46, + 0, + 73, + 45, + 0, + 73, + 44, + -2, + 73, + 43, + -3, + 71, + 39, + -5, + 68, + 36, + -9, + 64, + 31, +-12, + 61, + 27, +-16, + 57, + 23, +-19, + 53, + 19, +-22, + 55, + 20, +-21, + 59, + 26, +-15, + 63, + 31, +-10, + 62, + 29, +-12, + 60, + 27, +-15, + 60, + 23, +-21, + 60, + 22, +-26, + 60, + 22, +-27, + 60, + 23, +-28, + 61, + 23, +-30, + 63, + 24, +-31, + 63, + 23, +-31, + 64, + 23, +-30, + 64, + 23, +-30, + 63, + 22, +-32, + 63, + 22, +-32, + 62, + 21, +-33, + 60, + 19, +-35, + 61, + 19, +-35, + 60, + 19, +-37, + 61, + 19, +-37, + 61, + 20, +-36, + 61, + 19, +-35, + 61, + 20, +-35, + 61, + 19, +-35, + 62, + 20, +-38, + 61, + 19, +-38, + 83, + 47, +-20, + 81, + 45, +-22, + 79, + 43, +-24, + 78, + 41, +-27, + 77, + 37, +-30, + 73, + 33, +-35, + 68, + 28, +-44, + 64, + 20, +-52, + 60, + 17, +-47, + 59, + 17, +-40, + 59, + 18, +-39, + 69, + 30, +-27, + 69, + 32, +-25, + 69, + 31, +-25, + 67, + 29, +-27, + 67, + 28, +-27, + 67, + 30, +-26, + 67, + 29, +-27, + 66, + 28, +-27, + 67, + 28, +-27, + 64, + 26, +-27, + 65, + 27, +-26, + 64, + 26, +-24, + 63, + 25, +-25, + 64, + 25, +-24, + 63, + 25, +-24, + 64, + 26, +-24, + 65, + 26, +-23, + 65, + 27, +-23, + 64, + 26, +-22, + 63, + 25, +-24, + 63, + 25, +-23, + 61, + 23, +-25, + 58, + 19, +-26, + 52, + 14, +-29, + 44, + 10, +-32, + 43, + 10, +-31, + 43, + 10, +-33, + 43, + 10, +-34, + 45, + 12, +-32, + 44, + 11, +-33, + 39, + 4, +-40, + 36, + 1, +-43, + 41, + 6, +-40, + 49, + 14, +-35, + 55, + 21, +-28, + 58, + 24, +-25, + 60, + 26, +-24, + 61, + 27, +-23, + 63, + 28, +-21, + 64, + 29, +-20, + 65, + 30, +-19, + 65, + 31, +-19, + 66, + 31, +-20, + 66, + 32, +-19, + 67, + 33, +-17, + 69, + 34, +-12, + 70, + 36, +-10, + 68, + 37, +-11, + 68, + 35, +-11, + 68, + 35, +-12, + 66, + 33, +-14, + 64, + 32, +-15, + 62, + 27, +-18, + 58, + 23, +-23, + 56, + 20, +-25, + 51, + 16, +-29, + 46, + 11, +-33, + 43, + 8, +-35, + 47, + 13, +-31, + 54, + 20, +-24, + 53, + 18, +-28, + 49, + 14, +-34, + 47, + 10, +-36, + 45, + 6, +-41, + 51, + 12, +-37, + 56, + 18, +-34, + 59, + 22, +-34, + 63, + 25, +-31, + 65, + 27, +-29, + 65, + 27, +-29, + 66, + 26, +-29, + 66, + 25, +-31, + 65, + 23, +-32, + 64, + 22, +-33, + 63, + 21, +-35, + 61, + 19, +-36, + 59, + 17, +-40, + 58, + 17, +-41, + 57, + 15, +-43, + 58, + 16, +-40, + 59, + 18, +-39, + 60, + 19, +-38, + 60, + 19, +-36, + 60, + 19, +-37, + 61, + 21, +-38, + 85, + 49, +-18, + 83, + 47, +-20, + 81, + 45, +-22, + 79, + 43, +-24, + 79, + 40, +-27, + 75, + 35, +-35, + 70, + 30, +-42, + 68, + 23, +-49, + 63, + 17, +-56, + 59, + 11, +-61, + 57, + 12, +-53, + 54, + 13, +-51, + 63, + 23, +-38, + 60, + 21, +-38, + 53, + 14, +-45, + 64, + 23, +-35, + 60, + 20, +-39, + 51, + 12, +-43, + 59, + 20, +-40, + 59, + 20, +-34, + 50, + 12, +-46, + 57, + 19, +-39, + 52, + 14, +-39, + 56, + 18, +-34, + 56, + 20, +-33, + 50, + 13, +-37, + 53, + 18, +-32, + 58, + 21, +-31, + 46, + 9, +-39, + 54, + 18, +-32, + 52, + 16, +-36, + 40, + 6, +-43, + 48, + 12, +-38, + 46, + 10, +-37, + 30, + -7, +-51, + 7, +-18, +-55, + 29, + -5, +-49, + 27, + -6, +-50, + 28, + -4, +-52, + 24, + -8, +-56, + 31, + -2, +-50, + 22, + -9, +-58, + 16, +-16, +-61, + 31, + -2, +-49, + 32, + -1, +-49, + 28, + -7, +-52, + 41, + 7, +-44, + 45, + 9, +-42, + 38, + 3, +-46, + 47, + 12, +-40, + 46, + 11, +-39, + 44, + 8, +-41, + 48, + 14, +-38, + 42, + 10, +-43, + 52, + 19, +-33, + 50, + 16, +-35, + 45, + 11, +-39, + 56, + 22, +-27, + 57, + 23, +-26, + 47, + 13, +-34, + 54, + 21, +-28, + 54, + 20, +-29, + 45, + 10, +-38, + 50, + 14, +-34, + 41, + 6, +-43, + 46, + 10, +-38, + 44, + 8, +-41, + 34, + -1, +-50, + 36, + 2, +-43, + 40, + 5, +-45, + 35, + 0, +-49, + 43, + 5, +-47, + 42, + 4, +-49, + 33, + -5, +-56, + 40, + -1, +-54, + 12, +-20, +-60, + 36, + 0, +-51, + 50, + 10, +-46, + 52, + 12, +-46, + 51, + 10, +-50, + 57, + 15, +-45, + 52, + 11, +-50, + 57, + 16, +-46, + 58, + 15, +-48, + 48, + 6, +-54, + 57, + 14, +-50, + 56, + 13, +-50, + 46, + 3, +-59, + 49, + 6, +-58, + 46, + 3, +-61, + 43, + -1, +-62, + 47, + 3, +-59, + 44, + 2, +-60, + 47, + 6, +-56, + 50, + 9, +-55, + 45, + 5, +-59, + 87, + 51, +-16, + 85, + 49, +-18, + 84, + 48, +-19, + 82, + 46, +-21, + 80, + 41, +-26, + 77, + 38, +-33, + 72, + 31, +-41, + 68, + 24, +-49, + 66, + 19, +-54, + 63, + 15, +-60, + 64, + 16, +-65, + 65, + 17, +-63, + 67, + 19, +-61, + 66, + 19, +-60, + 66, + 19, +-58, + 66, + 19, +-56, + 65, + 18, +-57, + 65, + 18, +-56, + 65, + 18, +-56, + 64, + 18, +-56, + 63, + 18, +-56, + 63, + 18, +-56, + 63, + 18, +-56, + 62, + 18, +-55, + 61, + 18, +-55, + 60, + 19, +-55, + 60, + 18, +-55, + 60, + 19, +-53, + 59, + 17, +-52, + 58, + 16, +-54, + 57, + 15, +-52, + 55, + 13, +-53, + 52, + 11, +-56, + 41, + 0, +-64, +-18, +-46, +-81, +-27, +-50, +-84, +-20, +-46, +-85, +-33, +-54, +-86, +-28, +-48, +-82, +-10, +-39, +-82, +-24, +-46, +-87, +-23, +-50, +-93, +-52, +-67, +-86, +-26, +-49, +-80, + -8, +-33, +-68, + -6, +-31, +-64, + 7, +-18, +-55, + 10, +-13, +-47, + 12, +-12, +-48, + 10, +-13, +-46, + 10, +-12, +-46, + 11, +-11, +-44, + 11, +-10, +-45, + 13, + -6, +-41, + 13, + -8, +-40, + 12, + -7, +-39, + 13, + -5, +-38, + 15, + -4, +-36, + 13, + -5, +-37, + 13, + -6, +-36, + 11, + -8, +-38, + 11, + -9, +-36, + 8, +-12, +-41, + 5, +-13, +-42, + 6, +-14, +-44, + -3, +-30, +-67, +-23, +-54, +-89, + 1, +-46, +-97, +-42, +-67, +-91, +-11, +-45, +-89, +-26, +-55, +-96, +-13, +-43, +-87, +-37, +-62, +-97, +-26, +-52, +-90, +-28, +-53, +-88, +-13, +-39, +-85, +-27, +-53, +-90, + 51, + 7, +-60, + 57, + 12, +-61, + 61, + 14, +-59, + 63, + 16, +-59, + 63, + 16, +-59, + 62, + 14, +-60, + 61, + 14, +-61, + 60, + 13, +-62, + 59, + 11, +-64, + 58, + 9, +-65, + 56, + 7, +-68, + 55, + 6, +-69, + 53, + 5, +-70, + 53, + 5, +-70, + 53, + 5, +-70, + 54, + 7, +-68, + 55, + 8, +-68, + 55, + 8, +-68, + 56, + 9, +-69, + 87, + 55, + 3, + 85, + 50, +-17, + 86, + 50, +-17, + 84, + 48, +-19, + 82, + 45, +-22, + 80, + 40, +-30, + 74, + 33, +-39, + 70, + 27, +-48, + 68, + 21, +-54, + 65, + 17, +-59, + 66, + 18, +-63, + 67, + 19, +-63, + 70, + 22, +-59, + 70, + 23, +-58, + 69, + 22, +-58, + 68, + 21, +-55, + 68, + 21, +-54, + 68, + 21, +-54, + 68, + 21, +-53, + 67, + 20, +-54, + 66, + 20, +-54, + 66, + 21, +-53, + 66, + 21, +-53, + 65, + 21, +-53, + 64, + 22, +-53, + 63, + 23, +-52, + 63, + 22, +-50, + 63, + 22, +-51, + 62, + 21, +-51, + 62, + 21, +-52, + 60, + 19, +-48, + 58, + 16, +-50, + 55, + 13, +-52, + 50, + 9, +-57, + 39, + -3, +-68, + -1, +-36, +-85, + 19, +-28, +-92, + 16, +-30, +-84, + 8, +-39, +-87, + 5, +-44, +-103, + 32, +-13, +-63, + 14, +-33, +-82, + 40, + -1, +-45, + 22, +-24, +-73, + 33, +-17, +-72, + 50, + 4, +-48, + 80, + 56, + 6, + 87, + 68, + 24, + 88, + 73, + 32, + 87, + 71, + 31, + 89, + 72, + 29, + 89, + 74, + 33, + 89, + 77, + 39, + 91, + 77, + 43, + 89, + 78, + 43, + 91, + 79, + 46, + 97, + 85, + 53, + 95, + 85, + 49, + 98, + 86, + 51, + 97, + 85, + 51, + 95, + 81, + 49, + 97, + 84, + 50, + 97, + 83, + 47, + 95, + 84, + 49, + 95, + 78, + 38, + 56, + 12, +-47, + 55, + 12, +-37, + 33, +-10, +-49, + 31, +-20, +-73, + 40, + -9, +-63, + 9, +-43, +-104, + 6, +-44, +-110, + 18, +-42, +-109, + 35, +-17, +-75, + 24, +-18, +-74, + 21, +-18, +-78, + 44, + 2, +-62, + 55, + 10, +-59, + 59, + 14, +-59, + 63, + 17, +-57, + 64, + 18, +-56, + 66, + 19, +-56, + 65, + 18, +-57, + 64, + 17, +-58, + 64, + 15, +-59, + 62, + 14, +-60, + 61, + 13, +-62, + 59, + 12, +-63, + 60, + 11, +-65, + 58, + 11, +-64, + 58, + 11, +-64, + 58, + 11, +-64, + 58, + 11, +-64, + 59, + 12, +-63, + 57, + 10, +-66, + 57, + 10, +-70, + 91, + 76, + 51, + 88, + 68, + 41, + 85, + 56, + 12, + 84, + 48, +-14, + 84, + 45, +-23, + 82, + 42, +-29, + 77, + 36, +-38, + 75, + 29, +-45, + 70, + 24, +-51, + 67, + 19, +-57, + 68, + 19, +-62, + 69, + 21, +-61, + 72, + 24, +-58, + 71, + 24, +-57, + 70, + 23, +-57, + 69, + 23, +-55, + 69, + 22, +-53, + 68, + 23, +-52, + 68, + 22, +-52, + 67, + 22, +-52, + 68, + 23, +-51, + 68, + 23, +-51, + 68, + 23, +-51, + 66, + 24, +-49, + 65, + 24, +-49, + 66, + 25, +-47, + 66, + 25, +-47, + 65, + 24, +-48, + 65, + 24, +-47, + 64, + 22, +-48, + 62, + 21, +-48, + 60, + 19, +-47, + 57, + 16, +-50, + 53, + 13, +-54, + 44, + 4, +-61, + 20, +-25, +-89, + 37, +-10, +-58, + 43, + -6, +-55, + 20, +-28, +-72, + 15, +-36, +-93, + 32, +-20, +-75, + 33, +-18, +-67, + 40, +-10, +-60, + 21, +-29, +-83, + 56, + 4, +-59, + 41, + -9, +-70, + 84, + 58, + 5, +100, + 87, + 42, + 98, + 91, + 48, + 99, + 91, + 50, +100, + 90, + 48, +100, + 93, + 57, +101, + 94, + 59, + 99, + 92, + 59, +101, + 92, + 59, +101, + 94, + 63, +105, + 98, + 68, +104, + 98, + 64, +105, + 99, + 67, +107, +100, + 67, +105, + 99, + 66, +106, + 99, + 66, +107, +100, + 66, +107, +100, + 67, +103, + 89, + 45, + 59, + 0, +-85, + 37, + -5, +-41, + 43, + -3, +-44, + 17, +-33, +-80, + 44, + -5, +-60, + 22, +-28, +-82, + 19, +-32, +-86, + 18, +-30, +-75, + 57, + 12, +-37, + 16, +-38, +-91, + 22, +-31, +-93, + 51, + 6, +-60, + 58, + 13, +-58, + 62, + 17, +-56, + 64, + 18, +-55, + 64, + 19, +-55, + 66, + 19, +-56, + 67, + 20, +-55, + 66, + 19, +-56, + 65, + 18, +-57, + 63, + 16, +-59, + 62, + 15, +-60, + 63, + 16, +-59, + 63, + 16, +-60, + 63, + 16, +-59, + 62, + 15, +-60, + 61, + 14, +-61, + 61, + 14, +-61, + 61, + 14, +-61, + 59, + 12, +-65, + 59, + 12, +-68, + 89, + 69, + 42, + 91, + 77, + 56, + 92, + 76, + 55, + 89, + 67, + 41, + 85, + 56, + 15, + 81, + 46, +-12, + 78, + 35, +-39, + 76, + 31, +-44, + 72, + 25, +-50, + 68, + 20, +-56, + 69, + 21, +-60, + 72, + 24, +-61, + 73, + 25, +-57, + 72, + 24, +-57, + 72, + 25, +-55, + 70, + 25, +-53, + 69, + 24, +-51, + 69, + 24, +-51, + 69, + 24, +-50, + 69, + 24, +-50, + 69, + 24, +-50, + 68, + 26, +-49, + 67, + 27, +-49, + 69, + 27, +-46, + 69, + 27, +-45, + 68, + 27, +-45, + 68, + 28, +-45, + 67, + 27, +-46, + 66, + 26, +-46, + 66, + 25, +-45, + 64, + 24, +-43, + 63, + 22, +-45, + 60, + 20, +-47, + 55, + 15, +-51, + 50, + 9, +-57, + 36, + -6, +-71, + 28, +-20, +-84, + 27, +-27, +-85, + 30, +-22, +-76, + 17, +-31, +-76, + 41, + -8, +-59, + 49, + 3, +-48, + 26, +-25, +-72, + 29, +-22, +-72, + 31, +-16, +-67, + 52, + -5, +-83, + 97, + 76, + 25, +109, +103, + 65, +108, +104, + 69, +107, +103, + 67, +106, +104, + 70, +107, +104, + 75, +107, +104, + 76, +106, +104, + 76, +107, +103, + 75, +107, +105, + 78, +110, +108, + 84, +109, +107, + 81, +111, +109, + 82, +112, +110, + 84, +112, +110, + 83, +113, +111, + 85, +114, +112, + 84, +116, +114, + 90, +116, +113, + 81, + 66, + 15, +-56, + 51, + 0, +-56, + 47, + 0, +-42, + 23, +-23, +-72, + 50, + 4, +-53, + 15, +-37, +-84, + 42, + -2, +-46, + 28, +-10, +-44, + 48, + 5, +-34, + 11, +-41, +-91, + 38, +-13, +-79, + 52, + 6, +-60, + 59, + 14, +-58, + 64, + 19, +-55, + 65, + 20, +-54, + 67, + 21, +-53, + 69, + 22, +-53, + 69, + 22, +-53, + 68, + 21, +-54, + 66, + 19, +-56, + 65, + 18, +-57, + 65, + 18, +-57, + 66, + 19, +-57, + 67, + 20, +-57, + 67, + 20, +-55, + 65, + 18, +-57, + 63, + 16, +-60, + 62, + 15, +-61, + 62, + 15, +-60, + 60, + 13, +-64, + 61, + 13, +-67, + 64, + 44, + 18, + 62, + 47, + 27, + 86, + 68, + 43, + 91, + 68, + 42, + 90, + 64, + 33, + 87, + 61, + 24, + 85, + 53, + 10, + 79, + 40, +-20, + 70, + 25, +-46, + 69, + 22, +-55, + 71, + 23, +-59, + 74, + 27, +-59, + 75, + 27, +-56, + 74, + 27, +-54, + 73, + 26, +-53, + 71, + 26, +-53, + 70, + 25, +-50, + 71, + 26, +-49, + 71, + 26, +-48, + 70, + 25, +-49, + 71, + 26, +-48, + 70, + 28, +-47, + 70, + 30, +-46, + 70, + 30, +-45, + 70, + 30, +-43, + 70, + 29, +-43, + 70, + 30, +-42, + 69, + 30, +-43, + 68, + 29, +-44, + 68, + 28, +-42, + 66, + 26, +-41, + 65, + 25, +-42, + 61, + 21, +-46, + 58, + 18, +-49, + 53, + 12, +-54, + 47, + 6, +-60, + 32, +-12, +-79, + 18, +-35, +-95, + 0, +-54, +-105, + 1, +-47, +-90, + 13, +-38, +-87, + -2, +-49, +-92, + 31, +-13, +-57, + 19, +-25, +-71, + 26, +-18, +-62, + 71, + 41, + -4, +112, +106, + 72, +112, +108, + 81, +111, +108, + 85, +108, +106, + 80, +107, +105, + 79, +108, +107, + 86, +108, +107, + 87, +106, +104, + 84, +104, +104, + 82, +108, +108, + 89, +110, +109, + 91, +109, +109, + 90, +112, +111, + 93, +112, +112, + 93, +112, +111, + 92, +113, +112, + 93, +114, +114, + 96, +117, +116, +100, +118, +117, +100, +103, + 90, + 59, + 45, + -3, +-50, + 33, +-17, +-68, + 38, + -7, +-55, + 41, + -7, +-59, + 38, + -6, +-47, + 33, +-17, +-66, + 37, +-13, +-65, + 56, + 11, +-36, + 35, +-17, +-79, + 45, + -2, +-67, + 54, + 9, +-60, + 61, + 16, +-57, + 64, + 19, +-55, + 67, + 22, +-52, + 68, + 23, +-52, + 69, + 23, +-52, + 68, + 23, +-52, + 70, + 23, +-52, + 68, + 21, +-54, + 67, + 20, +-55, + 66, + 19, +-57, + 65, + 18, +-61, + 67, + 20, +-57, + 68, + 21, +-54, + 66, + 19, +-56, + 65, + 18, +-61, + 64, + 17, +-62, + 62, + 15, +-63, + 62, + 15, +-64, + 62, + 15, +-65, + 36, + 17, + -7, +-29, +-43, +-64, +-12, +-25, +-45, + 32, + 15, + -6, + 66, + 44, + 18, + 88, + 61, + 27, + 87, + 56, + 16, + 85, + 51, + 4, + 83, + 45, + -7, + 74, + 32, +-31, + 73, + 25, +-57, + 75, + 28, +-58, + 77, + 30, +-55, + 75, + 28, +-51, + 73, + 28, +-51, + 73, + 28, +-50, + 73, + 28, +-47, + 73, + 28, +-47, + 73, + 28, +-46, + 72, + 28, +-46, + 70, + 30, +-46, + 70, + 30, +-46, + 71, + 31, +-45, + 71, + 30, +-43, + 71, + 30, +-42, + 70, + 31, +-42, + 70, + 31, +-42, + 71, + 32, +-41, + 70, + 30, +-41, + 69, + 29, +-39, + 68, + 28, +-39, + 66, + 26, +-41, + 64, + 24, +-43, + 60, + 20, +-47, + 56, + 16, +-51, + 51, + 11, +-56, + 38, + -6, +-71, + 27, +-30, +-102, + 4, +-53, +-116, + 18, +-29, +-75, + 32, +-20, +-74, + 4, +-53, +-117, + 8, +-48, +-117, + 40, +-10, +-66, + 24, +-28, +-90, + 81, + 56, + 14, +112, +109, + 87, +111, +109, + 93, +110, +110, + 97, +107, +107, + 92, +106, +105, + 93, +106, +107, + 93, +109, +108, + 97, +108, +108, + 99, +107, +107, + 98, +108, +108, + 99, +110, +110, +101, +111, +111, +101, +113, +113, +105, +113, +113, +105, +112, +113, +101, +114, +113, +103, +115, +115, +108, +118, +118, +111, +118, +118, +111, +119, +118, +107, + 74, + 36, + -5, + 46, +-10, +-76, + 32, +-22, +-75, + 12, +-43, +-99, +-18, +-66, +-108, + 12, +-45, +-99, + 50, + -1, +-61, + 27, +-25, +-77, + 27, +-25, +-85, + 48, + 3, +-64, + 57, + 12, +-59, + 63, + 18, +-55, + 66, + 21, +-53, + 68, + 23, +-51, + 69, + 24, +-51, + 69, + 24, +-51, + 70, + 24, +-51, + 70, + 23, +-52, + 69, + 22, +-53, + 66, + 19, +-56, + 65, + 18, +-60, + 65, + 18, +-62, + 67, + 19, +-60, + 67, + 19, +-58, + 67, + 20, +-57, + 66, + 19, +-59, + 64, + 17, +-60, + 63, + 16, +-64, + 63, + 16, +-64, + 62, + 15, +-65, + 30, + 13, +-12, +-94, +-94, +-111, +-81, +-83, +-100, +-59, +-67, +-90, +-45, +-56, +-80, + -4, +-22, +-48, + 48, + 20, +-14, + 69, + 38, + -5, + 83, + 45, + -6, + 81, + 41, +-17, + 75, + 27, +-56, + 78, + 31, +-55, + 78, + 31, +-53, + 76, + 30, +-51, + 76, + 30, +-50, + 74, + 29, +-47, + 73, + 28, +-47, + 74, + 29, +-45, + 72, + 29, +-45, + 71, + 31, +-45, + 70, + 30, +-46, + 68, + 28, +-46, + 68, + 28, +-47, + 67, + 26, +-44, + 66, + 26, +-44, + 67, + 27, +-44, + 69, + 29, +-43, + 70, + 31, +-40, + 71, + 31, +-39, + 71, + 31, +-37, + 69, + 29, +-37, + 67, + 27, +-40, + 65, + 25, +-42, + 63, + 23, +-44, + 59, + 19, +-48, + 54, + 14, +-53, + 40, + -4, +-69, + 36, +-27, +-102, + -5, +-63, +-121, + 26, +-27, +-78, + 29, +-25, +-87, + 19, +-42, +-123, + 5, +-53, +-128, + 48, + -4, +-67, + 12, +-44, +-123, + 83, + 59, + 18, +112, +109, + 93, +109, +109, + 97, +109, +108, +101, +106, +106, + 97, +105, +105, + 97, +106, +107, + 97, +108, +109, +102, +108, +109, +103, +107, +107, +101, +107, +108, +102, +110, +110, +105, +111, +111, +108, +112, +112, +109, +112, +113, +107, +113, +114, +108, +115, +115, +112, +114, +115, +111, +117, +118, +115, +117, +117, +113, +117, +118, +111, + 71, + 32, + -4, + 38, +-21, +-90, + 37, +-20, +-85, + 23, +-41, +-109, + 10, +-41, +-89, + 14, +-46, +-103, + 55, + 8, +-52, + 45, +-16, +-89, + 26, +-34, +-111, + 52, + 6, +-62, + 60, + 15, +-57, + 64, + 19, +-53, + 68, + 23, +-51, + 69, + 24, +-50, + 70, + 25, +-50, + 70, + 25, +-50, + 69, + 24, +-50, + 69, + 22, +-53, + 64, + 17, +-57, + 60, + 14, +-60, + 58, + 11, +-63, + 58, + 11, +-63, + 60, + 13, +-61, + 63, + 15, +-59, + 64, + 16, +-62, + 62, + 14, +-63, + 61, + 14, +-65, + 62, + 15, +-65, + 62, + 15, +-65, + 62, + 15, +-65, + 31, + 15, + -9, +-80, +-79, +-96, +-85, +-82, +-93, +-90, +-88, +-104, +-74, +-77, +-96, +-26, +-37, +-56, + 22, + 3, +-19, + 28, + 7, +-18, + 58, + 33, + 4, + 86, + 44, + -7, + 78, + 28, +-55, + 79, + 32, +-54, + 80, + 34, +-50, + 79, + 33, +-48, + 77, + 32, +-47, + 76, + 32, +-45, + 75, + 30, +-45, + 72, + 30, +-45, + 71, + 30, +-46, + 69, + 29, +-46, + 65, + 24, +-47, + 60, + 18, +-50, + 46, + 3, +-60, + 25, +-18, +-72, + 17, +-28, +-79, + 20, +-21, +-73, + 38, + -1, +-61, + 61, + 20, +-47, + 67, + 27, +-44, + 70, + 30, +-38, + 71, + 31, +-36, + 69, + 29, +-38, + 67, + 27, +-40, + 64, + 24, +-43, + 61, + 21, +-46, + 57, + 16, +-51, + 41, + -3, +-69, + 37, +-23, +-94, + 4, +-54, +-107, + 25, +-24, +-70, + 19, +-35, +-90, + 31, +-27, +-95, + 6, +-52, +-118, + 43, + -2, +-51, + 21, +-33, +-98, + 90, + 70, + 34, +111, +111, + 96, +108, +108, +100, +107, +107, +101, +107, +107, +102, +106, +107, +102, +107, +108, +102, +109, +109, +105, +108, +109, +105, +108, +108, +104, +109, +110, +106, +111, +111, +108, +111, +111, +108, +113, +114, +111, +114, +114, +111, +113, +113, +110, +114, +114, +112, +115, +116, +113, +117, +117, +114, +116, +116, +113, +117, +118, +115, + 64, + 19, +-29, + 18, +-36, +-94, + 44, + -9, +-60, + 27, +-31, +-93, + 14, +-39, +-86, + 24, +-30, +-93, + 54, + 16, +-23, + 54, + 2, +-51, + 23, +-37, +-114, + 55, + 8, +-62, + 63, + 18, +-56, + 66, + 21, +-53, + 69, + 24, +-50, + 70, + 25, +-49, + 70, + 25, +-50, + 69, + 24, +-51, + 64, + 19, +-55, + 53, + 10, +-62, + 39, + -8, +-76, + 21, +-28, +-87, + 7, +-40, +-86, + 13, +-34, +-86, + 31, +-17, +-80, + 49, + 2, +-71, + 54, + 5, +-70, + 56, + 7, +-69, + 55, + 7, +-71, + 56, + 8, +-72, + 57, + 9, +-70, + 61, + 14, +-67, + 33, + 17, + -6, +-63, +-69, +-98, +-77, +-76, +-90, +-72, +-76, +-103, +-66, +-70, +-95, +-27, +-35, +-54, + 22, + 5, +-14, + 30, + 12, +-11, + 58, + 37, + 9, + 87, + 47, + -5, + 79, + 31, +-53, + 81, + 35, +-52, + 81, + 35, +-48, + 80, + 34, +-47, + 78, + 34, +-46, + 78, + 33, +-44, + 76, + 32, +-43, + 74, + 29, +-45, + 66, + 25, +-48, + 60, + 19, +-52, + 43, + 0, +-63, + -4, +-50, +-97, +-27, +-70, +-90, + 6, +-10, +-19, + 11, + 1, +-13, + 6, + -2, +-13, + -9, +-28, +-39, +-12, +-55, +-98, + 39, + -2, +-61, + 62, + 20, +-46, + 68, + 27, +-39, + 69, + 29, +-38, + 69, + 29, +-38, + 66, + 26, +-41, + 62, + 22, +-45, + 58, + 18, +-49, + 42, + -2, +-66, + 35, +-23, +-92, + 18, +-37, +-84, + 27, +-17, +-58, + 7, +-50, +-109, + 35, +-21, +-81, + 11, +-43, +-105, + 51, + 8, +-37, + 23, +-26, +-81, + 91, + 72, + 40, +109, +109, + 98, +107, +107, +101, +107, +108, +103, +106, +107, +102, +108, +109, +106, +108, +109, +105, +108, +109, +105, +109, +109, +106, +109, +109, +107, +110, +110, +109, +112, +112, +109, +111, +111, +109, +112, +112, +110, +112, +112, +111, +112, +113, +110, +115, +115, +113, +115, +115, +113, +116, +116, +114, +116, +117, +114, +118, +118, +116, + 57, + 9, +-51, + 12, +-42, +-98, + 39, +-12, +-66, + 39, +-16, +-76, + 24, +-27, +-73, + 30, +-19, +-79, + 52, + 13, +-25, + 58, + 11, +-34, + 19, +-43, +-122, + 56, + 10, +-62, + 63, + 19, +-55, + 67, + 23, +-51, + 70, + 25, +-49, + 70, + 25, +-49, + 67, + 21, +-52, + 60, + 14, +-57, + 37, + -8, +-73, + 12, +-46, +-104, + 19, +-30, +-72, + 21, + -2, +-10, + 35, + 13, +-19, + 45, + 10, +-37, + 2, +-40, +-74, + -9, +-63, +-110, + 26, +-22, +-86, + 45, + -3, +-76, + 51, + 2, +-73, + 54, + 6, +-72, + 53, + 5, +-74, + 55, + 7, +-73, + 32, + 16, + -6, +-60, +-66, +-94, +-59, +-63, +-90, +-68, +-73, +-101, +-65, +-69, +-92, +-25, +-33, +-51, + 25, + 9, +-10, + 33, + 15, + -6, + 60, + 40, + 12, + 87, + 48, + -4, + 80, + 33, +-52, + 82, + 36, +-50, + 83, + 37, +-45, + 80, + 36, +-45, + 79, + 35, +-44, + 77, + 32, +-43, + 72, + 30, +-45, + 65, + 24, +-49, + 43, + -1, +-66, + -2, +-44, +-90, +-19, +-74, +-114, + -5, +-42, +-67, + 77, + 68, + 34, + 91, + 84, + 38, + 96, + 89, + 40, +101, + 94, + 50, + 80, + 75, + 41, + 34, + 28, + 16, +-11, +-42, +-61, + 1, +-40, +-87, + 42, + -2, +-61, + 64, + 23, +-43, + 67, + 27, +-40, + 66, + 26, +-41, + 63, + 23, +-44, + 58, + 18, +-49, + 43, + -3, +-64, + 31, +-25, +-92, + 30, +-26, +-80, + 20, +-32, +-81, + 12, +-49, +-116, + 32, +-24, +-92, + 19, +-37, +-105, + 60, + 11, +-43, + 23, +-27, +-84, + 88, + 66, + 31, +109, +109, + 99, +107, +107, +103, +106, +107, +104, +106, +106, +104, +106, +107, +104, +108, +108, +106, +109, +109, +107, +109, +109, +108, +108, +109, +107, +109, +109, +109, +112, +112, +111, +112, +112, +111, +113, +113, +112, +112, +112, +111, +111, +111, +110, +114, +114, +113, +114, +114, +113, +115, +115, +115, +116, +116, +115, +119, +118, +116, + 55, + 4, +-64, + 19, +-37, +-103, + 36, +-20, +-89, + 34, +-25, +-92, + 33, +-20, +-80, + 32, +-22, +-85, + 51, + 2, +-48, + 58, + 4, +-57, + 17, +-48, +-127, + 55, + 9, +-64, + 63, + 19, +-54, + 67, + 23, +-51, + 68, + 24, +-49, + 62, + 19, +-52, + 41, + -4, +-69, + 14, +-38, +-97, + 20, +-39, +-94, + 32, + -8, +-72, + 18, + 1, +-31, + 57, + 24, +-67, + 44, + 34, +-14, + 85, + 39, +-36, + 83, + 47, +-13, + 54, + 14, +-51, +-17, +-64, +-105, +-11, +-61, +-107, + 20, +-29, +-93, + 48, + -1, +-75, + 53, + 4, +-73, + 54, + 6, +-75, + 31, + 17, + -4, +-63, +-70, +-97, +-62, +-65, +-90, +-62, +-68, +-95, +-73, +-74, +-90, +-23, +-30, +-45, + 26, + 11, + -7, + 33, + 16, + -3, + 60, + 42, + 16, + 86, + 49, + -3, + 81, + 33, +-51, + 83, + 37, +-47, + 82, + 38, +-44, + 82, + 38, +-42, + 78, + 36, +-41, + 75, + 32, +-44, + 71, + 26, +-47, + 47, + 3, +-69, +-21, +-71, +-115, + 35, + 19, +-11, + 74, + 63, + 20, + 85, + 73, + 28, + 93, + 81, + 33, + 92, + 83, + 37, + 95, + 88, + 43, +100, + 92, + 48, +107, + 99, + 55, +108, +101, + 58, + 94, + 87, + 49, + 69, + 58, + 22, + 8, +-33, +-71, + 29, +-13, +-68, + 65, + 24, +-43, + 67, + 27, +-40, + 63, + 23, +-44, + 59, + 19, +-48, + 42, + -6, +-72, + 29, +-33, +-111, + 24, +-40, +-109, + 27, +-30, +-103, + 13, +-50, +-124, + 31, +-29, +-110, + 24, +-40, +-118, + 60, + 11, +-55, + 21, +-33, +-108, + 89, + 64, + 27, +108, +108, + 98, +106, +106, +101, +107, +107, +104, +106, +106, +104, +108, +108, +106, +109, +109, +107, +110, +111, +109, +111, +111, +110, +110, +111, +109, +112, +112, +112, +114, +114, +113, +113, +113, +112, +114, +114, +112, +113, +113, +112, +112, +112, +111, +115, +115, +114, +114, +114, +113, +117, +117, +116, +117, +117, +116, +118, +117, +116, + 59, + 9, +-74, + 34, +-23, +-99, + 37, +-20, +-95, + 29, +-36, +-115, + 36, +-21, +-94, + 28, +-31, +-108, + 53, + -1, +-63, + 55, + -5, +-84, + 19, +-50, +-128, + 57, + 7, +-65, + 64, + 19, +-54, + 68, + 24, +-51, + 65, + 22, +-50, + 35, +-10, +-73, + 17, +-43, +-109, + 28, + -9, +-52, + 38, + 17, +-33, + 28, + 6, +-45, + 28, + 17, +-19, + 68, + 34, +-61, + 53, + 36, +-14, + 81, + 46, + -8, + 87, + 41, +-51, + 76, + 57, + 16, + 94, + 90, + 78, + 67, + 61, + 54, +-21, +-73, +-107, + 25, +-23, +-92, + 50, + 2, +-75, + 53, + 5, +-76, + 31, + 16, + -2, +-61, +-73, +-104, +-57, +-64, +-91, +-63, +-69, +-93, +-66, +-70, +-91, +-20, +-28, +-43, + 28, + 14, + -4, + 36, + 19, + 0, + 62, + 44, + 19, + 86, + 48, + -2, + 81, + 34, +-48, + 84, + 39, +-45, + 83, + 39, +-42, + 82, + 39, +-41, + 78, + 37, +-40, + 76, + 32, +-43, + 69, + 25, +-48, + 45, + -6, +-82, + 15, +-16, +-43, + 88, + 74, + 26, + 90, + 78, + 30, + 92, + 80, + 32, + 74, + 58, + 8, + 47, + 27, +-18, + 70, + 59, + 17, + 93, + 86, + 43, +107, +100, + 57, +110, +102, + 58, +110, +102, + 58, +109, +101, + 57, + 74, + 56, + 14, + 9, +-38, +-84, + 62, + 21, +-46, + 67, + 27, +-40, + 64, + 24, +-43, + 59, + 19, +-48, + 40, + -7, +-73, + 34, +-28, +-108, + 19, +-45, +-118, + 33, +-22, +-90, + 12, +-49, +-120, + 38, +-20, +-98, + 26, +-36, +-112, + 64, + 19, +-34, + 23, +-32, +-105, + 91, + 66, + 31, +108, +108, + 96, +106, +106, +100, +105, +106, +102, +108, +109, +106, +108, +108, +105, +111, +111, +108, +112, +112, +109, +112, +112, +110, +112, +113, +111, +114, +115, +114, +116, +116, +116, +115, +115, +114, +115, +115, +114, +112, +112, +111, +110, +110, +109, +112, +112, +111, +113, +113, +112, +117, +117, +116, +117, +117, +115, +118, +118, +114, + 55, + 6, +-68, + 38, +-15, +-85, + 40, +-16, +-78, + 31, +-32, +-96, + 34, +-20, +-91, + 30, +-28, +-100, + 58, + 4, +-53, + 55, + -5, +-80, + 21, +-45, +-123, + 53, + 4, +-69, + 64, + 19, +-54, + 69, + 24, +-50, + 66, + 21, +-51, + 26, +-27, +-93, + 43, + 12, +-23, + 77, + 53, +-19, + 43, + 10, +-51, + 48, + 26, +-27, + 41, + 40, + 12, + 67, + 32, +-56, + 42, + 21, +-17, + 83, + 52, + 9, + 97, + 52, +-39, + 78, + 63, + 26, +108, +109, +104, + 67, + 40, + 10, + 44, + 12, +-29, + 35, +-16, +-104, + 48, + -1, +-78, + 53, + 5, +-75, + 34, + 19, + 1, +-64, +-77, +-107, +-78, +-77, +-85, +-66, +-69, +-91, +-63, +-68, +-94, +-17, +-25, +-43, + 29, + 16, + -2, + 36, + 21, + 3, + 62, + 46, + 21, + 87, + 49, + 0, + 82, + 35, +-47, + 84, + 39, +-44, + 84, + 40, +-41, + 81, + 40, +-39, + 78, + 38, +-39, + 74, + 33, +-43, + 68, + 25, +-48, + 43, + -9, +-81, + 24, +-13, +-51, + 82, + 67, + 22, + 90, + 78, + 31, + 89, + 80, + 35, + 55, + 41, + -8, + -7, +-35, +-72, + 17, +-13, +-60, + 21, + -9, +-59, + 56, + 39, + 3, +110, +102, + 59, +110, +102, + 58, +110, +101, + 56, + 56, + 22, +-26, + 15, +-32, +-85, + 64, + 22, +-44, + 67, + 27, +-40, + 64, + 24, +-43, + 59, + 19, +-48, + 41, + -2, +-59, + 33, +-22, +-83, + 19, +-38, +-101, + 37, +-15, +-67, + 14, +-43, +-107, + 47, + -6, +-76, + 29, +-27, +-91, + 75, + 35, + -8, + 30, +-20, +-84, + 92, + 73, + 45, +109, +109, + 99, +107, +107, +102, +109, +109, +106, +110, +110, +108, +109, +109, +107, +112, +112, +109, +113, +113, +111, +114, +115, +113, +114, +115, +113, +116, +116, +115, +118, +118, +117, +116, +116, +115, +115, +115, +114, +114, +114, +113, +112, +112, +110, +112, +113, +112, +114, +114, +112, +116, +116, +116, +117, +117, +115, +118, +118, +118, + 47, + 6, +-48, + 38, +-11, +-74, + 39, + -8, +-58, + 33, +-21, +-74, + 29, +-23, +-78, + 38, +-16, +-80, + 61, + 14, +-34, + 53, + -2, +-64, + 27, +-34, +-101, + 50, + 1, +-69, + 64, + 19, +-54, + 69, + 24, +-50, + 66, + 21, +-49, + 24, +-28, +-93, + 33, + 10, +-14, + 90, + 61, +-12, + 35, + 5, +-53, + 40, + 15, +-43, + 17, + 20, + -2, + 54, + 24, +-60, + 53, + 28, +-23, + 84, + 42, +-28, + 91, + 44, +-82, + 81, + 65, + 26, +108, +109, +105, + 58, + 25, +-16, + 56, + 22, +-15, + 40, +-17, +-102, + 47, + -2, +-76, + 53, + 5, +-74, + 35, + 19, + 0, +-69, +-80, +-106, +-77, +-75, +-84, +-75, +-74, +-90, +-61, +-66, +-91, +-15, +-23, +-40, + 31, + 18, + 0, + 36, + 23, + 5, + 64, + 47, + 22, + 87, + 51, + 2, + 83, + 36, +-46, + 84, + 39, +-44, + 84, + 40, +-40, + 80, + 40, +-38, + 79, + 39, +-38, + 74, + 34, +-42, + 69, + 26, +-47, + 49, + 2, +-76, + 23, +-12, +-54, + 79, + 68, + 27, + 90, + 81, + 37, + 90, + 82, + 38, + 53, + 39, + -6, + 0, +-22, +-64, + 55, + 55, + 45, + 51, + 52, + 38, + 57, + 51, + 27, +110, +102, + 59, +109, +101, + 57, +109, +101, + 56, + 59, + 37, + 5, + 23, +-25, +-82, + 64, + 22, +-44, + 66, + 27, +-41, + 64, + 24, +-43, + 58, + 18, +-49, + 41, + -3, +-58, + 33, +-22, +-83, + 14, +-45, +-108, + 39, +-13, +-66, + 14, +-42, +-107, + 44, + -9, +-78, + 32, +-25, +-90, + 80, + 38, + -9, + 33, +-20, +-89, + 93, + 72, + 43, +110, +110, +102, +108, +108, +103, +110, +110, +107, +109, +109, +107, +109, +110, +107, +111, +112, +108, +113, +113, +110, +115, +115, +114, +115, +115, +113, +116, +116, +115, +118, +118, +117, +116, +116, +116, +115, +115, +114, +113, +113, +112, +111, +111, +110, +112, +112, +111, +112, +113, +111, +115, +115, +114, +118, +118, +117, +119, +119, +119, + 50, + 7, +-47, + 33, +-19, +-83, + 42, + -6, +-58, + 35, +-20, +-73, + 22, +-33, +-84, + 38, +-15, +-84, + 62, + 16, +-27, + 52, + -2, +-70, + 32, +-30, +-97, + 47, + -3, +-71, + 63, + 18, +-54, + 69, + 24, +-50, + 66, + 21, +-51, + 30, +-22, +-90, + 43, + 19, +-11, + 90, + 65, + -8, + 60, + 32, +-30, + 52, + 34, +-22, + 16, + 20, + -9, + 53, + 23, +-50, + 45, + 15, +-50, + 95, + 60, + -5, + 92, + 47, +-56, + 82, + 67, + 30, +109, +110, +105, + 60, + 30, +-11, + 50, + 20, +-15, + 39, +-17, +-103, + 48, + -1, +-76, + 53, + 5, +-74, + 36, + 22, + 4, +-68, +-77, +-105, +-76, +-74, +-80, +-78, +-76, +-84, +-70, +-71, +-87, +-14, +-22, +-38, + 32, + 19, + 2, + 37, + 24, + 7, + 66, + 48, + 24, + 86, + 52, + 3, + 83, + 37, +-44, + 85, + 41, +-42, + 84, + 42, +-38, + 81, + 41, +-36, + 78, + 38, +-37, + 74, + 34, +-41, + 68, + 27, +-45, + 50, + 2, +-76, + 32, + -7, +-53, + 80, + 69, + 26, + 90, + 82, + 38, + 91, + 83, + 39, + 52, + 40, + -5, + 22, + 6, +-21, + 44, + 46, + 46, + 33, + 39, + 21, + 55, + 55, + 40, +109, +101, + 58, +108, +100, + 56, +108, +100, + 54, + 44, + 25, +-20, + 27, +-20, +-80, + 64, + 22, +-44, + 66, + 26, +-41, + 64, + 24, +-43, + 58, + 17, +-49, + 41, + -7, +-69, + 32, +-28, +-106, + 12, +-50, +-125, + 44, +-15, +-86, + 23, +-37, +-111, + 39, +-20, +-97, + 31, +-29, +-105, + 81, + 34, +-33, + 34, +-25, +-106, + 94, + 69, + 30, +109, +109, +101, +109, +109, +104, +110, +110, +107, +111, +111, +109, +110, +111, +109, +112, +113, +110, +114, +115, +113, +116, +116, +115, +115, +115, +114, +117, +117, +116, +118, +118, +116, +117, +117, +116, +117, +117, +116, +115, +115, +114, +113, +113, +112, +113, +113, +112, +114, +114, +113, +116, +116, +115, +118, +118, +117, +119, +119, +119, + 58, + 11, +-59, + 27, +-30, +-109, + 46, + -5, +-72, + 37, +-29, +-104, + 21, +-40, +-112, + 37, +-21, +-103, + 64, + 7, +-61, + 50, +-11, +-97, + 33, +-36, +-121, + 43, + -8, +-75, + 62, + 17, +-55, + 67, + 24, +-50, + 67, + 21, +-50, + 32, +-21, +-89, + 58, + 22, +-20, + 88, + 69, + 10, + 63, + 34, +-33, + 71, + 47, +-17, + 44, + 39, + 3, + 47, + 13, +-59, + 53, + 31, +-16, + 93, + 72, + 32, + 94, + 50, +-33, + 82, + 69, + 36, +110, +110, +104, + 59, + 23, +-23, + 44, + 8, +-40, + 44, +-12, +-93, + 48, + -1, +-76, + 53, + 5, +-74, + 34, + 22, + 5, +-58, +-70, +-102, +-73, +-72, +-78, +-64, +-65, +-82, +-61, +-65, +-88, +-11, +-19, +-35, + 34, + 21, + 4, + 39, + 26, + 9, + 66, + 47, + 26, + 90, + 53, + 5, + 83, + 37, +-44, + 86, + 42, +-40, + 83, + 44, +-36, + 81, + 41, +-35, + 80, + 40, +-35, + 75, + 35, +-40, + 69, + 28, +-44, + 48, + 5, +-73, + 45, + 0, +-54, + 81, + 69, + 28, + 92, + 84, + 40, + 93, + 85, + 41, + 54, + 42, + -3, + 17, + 1, +-20, + 48, + 52, + 30, + 26, + 26, +-25, + 55, + 52, + 35, +108, +100, + 57, +108, +100, + 56, +108, + 99, + 54, + 49, + 29, +-18, + 28, +-20, +-82, + 64, + 22, +-44, + 67, + 27, +-40, + 64, + 24, +-43, + 57, + 16, +-49, + 38, +-10, +-77, + 33, +-29, +-113, + 7, +-56, +-128, + 42, +-17, +-96, + 28, +-32, +-107, + 42, +-17, +-95, + 30, +-29, +-106, + 81, + 35, +-28, + 32, +-30, +-108, + 95, + 69, + 31, +108, +108, +100, +108, +108, +104, +110, +110, +108, +109, +109, +108, +110, +110, +109, +112, +113, +110, +114, +114, +114, +115, +115, +115, +116, +116, +115, +116, +116, +116, +118, +118, +117, +117, +117, +116, +117, +117, +117, +115, +115, +115, +113, +113, +113, +113, +113, +112, +113, +113, +113, +117, +117, +116, +118, +118, +118, +119, +120, +120, + 56, + 12, +-55, + 23, +-34, +-110, + 53, + 5, +-56, + 40, +-24, +-95, + 22, +-41, +-117, + 36, +-24, +-103, + 63, + 8, +-59, + 51, +-12, +-96, + 38, +-30, +-119, + 41, +-10, +-78, + 61, + 16, +-56, + 67, + 24, +-49, + 65, + 22, +-51, + 38, +-16, +-86, + 52, + 6, +-51, + 68, + 46, + -6, + 57, + 27, +-40, + 60, + 38, +-20, + 34, + 19, +-20, + 10, +-26, +-76, + 63, + 32, +-27, +102, + 71, + 18, + 88, + 41, +-66, + 86, + 69, + 38, +106, +103, + 96, + 57, + 13, +-49, + 49, + 9, +-44, + 43, +-13, +-94, + 48, + -1, +-75, + 54, + 6, +-72, + 36, + 23, + 8, +-55, +-70, +-104, +-55, +-60, +-80, +-51, +-58, +-81, +-60, +-64, +-87, +-11, +-19, +-34, + 35, + 21, + 11, + 40, + 26, + 12, + 65, + 49, + 28, + 89, + 54, + 7, + 83, + 37, +-44, + 86, + 42, +-39, + 83, + 44, +-36, + 81, + 41, +-35, + 80, + 40, +-35, + 76, + 36, +-37, + 68, + 27, +-45, + 43, + 4, +-67, + 50, + 5, +-51, + 73, + 64, + 26, + 95, + 87, + 43, + 95, + 87, + 42, + 55, + 44, + 1, + 4, +-17, +-42, + 44, + 48, + 9, + 23, + 23, +-29, + 71, + 70, + 50, +109, +101, + 59, +108, +100, + 56, +107, + 98, + 54, + 53, + 34, + -8, + 27, +-21, +-81, + 65, + 23, +-43, + 67, + 27, +-40, + 63, + 23, +-44, + 55, + 15, +-50, + 39, + -7, +-65, + 35, +-21, +-96, + 8, +-50, +-111, + 44, +-12, +-77, + 30, +-26, +-92, + 46, + -9, +-78, + 29, +-27, +-94, + 82, + 45, + 5, + 32, +-23, +-87, + 92, + 72, + 45, +108, +108, + 98, +107, +107, +103, +110, +110, +109, +111, +111, +111, +111, +111, +110, +111, +111, +110, +114, +114, +114, +115, +115, +115, +115, +115, +115, +116, +116, +116, +117, +117, +116, +116, +116, +116, +116, +116, +116, +115, +115, +115, +113, +113, +113, +112, +112, +112, +114, +114, +114, +117, +117, +117, +118, +118, +118, +120, +119, +120, + 51, + 8, +-41, + 27, +-26, +-93, + 57, + 17, +-28, + 44, +-11, +-65, + 23, +-34, +-102, + 35, +-20, +-90, + 62, + 20, +-19, + 54, + 0, +-71, + 42, +-16, +-74, + 40, +-10, +-79, + 61, + 17, +-56, + 65, + 24, +-48, + 66, + 24, +-50, + 41, +-14, +-86, + 30, +-22, +-76, + 18, + 4, +-26, + 53, + 24, +-45, + 31, + 14, +-33, + 12, + 0, +-29, + -9, +-36, +-66, + 66, + 31, +-45, + 99, + 65, + -8, + 82, + 31, +-95, + 80, + 65, + 30, +102, + 98, + 90, + 58, + 15, +-41, + 45, + -4, +-66, + 52, + 3, +-79, + 49, + 0, +-75, + 54, + 6, +-73, + 37, + 24, + 8, +-49, +-64, +-102, +-51, +-56, +-78, +-47, +-55, +-77, +-65, +-67, +-84, +-11, +-19, +-33, + 36, + 22, + 7, + 39, + 26, + 9, + 67, + 49, + 26, + 88, + 55, + 8, + 85, + 39, +-43, + 86, + 44, +-38, + 84, + 44, +-34, + 82, + 42, +-33, + 79, + 40, +-35, + 75, + 36, +-38, + 69, + 29, +-43, + 49, + 8, +-64, + 50, + 7, +-47, + 65, + 58, + 22, + 95, + 87, + 43, + 95, + 87, + 44, + 57, + 46, + 6, + 5, +-18, +-50, + 44, + 45, + 2, + 26, + 27, +-12, + 85, + 81, + 60, +109, +100, + 60, +108, +100, + 56, +106, + 98, + 53, + 55, + 41, + 15, + 23, +-28, +-81, + 64, + 23, +-44, + 67, + 27, +-40, + 62, + 23, +-44, + 54, + 13, +-51, + 39, + -8, +-64, + 37, +-16, +-85, + 14, +-43, +-100, + 47, + -9, +-76, + 31, +-24, +-87, + 46, + -8, +-72, + 26, +-27, +-88, + 82, + 48, + 12, + 34, +-21, +-90, + 91, + 71, + 44, +101, +100, + 90, +100, +101, + 98, +103, +103, +104, +105, +105, +105, +104, +104, +105, +104, +103, +103, +105, +105, +104, +107, +108, +107, +108, +108, +108, +109, +109, +108, +111, +112, +112, +109, +109, +110, +110, +110, +111, +110, +109, +110, +110, +110, +110, +110, +110, +111, +110, +110, +109, +111, +112, +111, +115, +114, +114, +117, +116, +118, + 47, + 6, +-40, + 27, +-29, +-96, + 61, + 19, +-23, + 47, + -7, +-61, + 23, +-36, +-102, + 33, +-23, +-88, + 58, + 16, +-21, + 57, + 3, +-63, + 42, +-16, +-75, + 40, +-11, +-80, + 60, + 16, +-56, + 65, + 24, +-48, + 66, + 25, +-47, + 40, +-13, +-83, + 77, + 50, + 36, + 50, + 37, + -4, + 56, + 30, +-29, + 38, + 19, +-30, + -2, +-20, +-59, + 54, + 34, +-21, + 72, + 47, + -1, + 95, + 68, + 15, + 79, + 32, +-62, + 84, + 72, + 46, +103, + 96, + 85, + 61, + 30, +-10, + 43, + -5, +-63, + 50, + 8, +-67, + 49, + 0, +-75, + 55, + 6, +-72, + 40, + 25, + 8, + -2, +-48, +-110, +-33, +-47, +-75, +-51, +-57, +-77, +-63, +-66, +-78, +-11, +-19, +-30, + 35, + 21, + 9, + 40, + 27, + 10, + 68, + 50, + 26, + 89, + 56, + 7, + 85, + 40, +-42, + 88, + 44, +-37, + 85, + 45, +-32, + 82, + 42, +-33, + 80, + 41, +-34, + 75, + 36, +-37, + 69, + 29, +-41, + 47, + 8, +-64, + 56, + 11, +-44, + 62, + 56, + 21, + 95, + 87, + 44, + 95, + 87, + 45, + 57, + 48, + 9, + 11, +-12, +-44, + 46, + 47, + 7, + 36, + 39, + 5, + 77, + 76, + 52, +108, +100, + 59, +107, + 99, + 57, +105, + 97, + 52, + 60, + 40, + 17, + 20, +-30, +-81, + 64, + 23, +-43, + 65, + 26, +-41, + 60, + 22, +-44, + 53, + 12, +-53, + 37, +-13, +-76, + 37, +-19, +-91, + 10, +-50, +-113, + 42, +-16, +-91, + 32, +-23, +-91, + 38, +-19, +-86, + 25, +-32, +-100, + 86, + 44, +-16, + 35, +-22, +-98, + 90, + 57, + 8, + 71, + 48, + 12, + 66, + 48, + 22, + 63, + 49, + 24, + 62, + 48, + 24, + 62, + 48, + 25, + 63, + 51, + 30, + 66, + 57, + 39, + 66, + 59, + 44, + 66, + 58, + 40, + 67, + 61, + 47, + 69, + 63, + 49, + 66, + 60, + 43, + 67, + 60, + 41, + 68, + 61, + 44, + 73, + 68, + 55, + 70, + 63, + 47, + 70, + 59, + 41, + 74, + 64, + 45, + 79, + 68, + 44, + 91, + 73, + 41, + 50, + 2, +-64, + 23, +-34, +-114, + 64, + 12, +-52, + 49, +-14, +-83, + 20, +-45, +-121, + 30, +-30, +-106, + 55, + 0, +-58, + 52, + -4, +-82, + 39, +-26, +-108, + 39, +-16, +-83, + 60, + 15, +-55, + 66, + 25, +-47, + 67, + 25, +-47, + 37, +-16, +-83, + 75, + 52, + 35, + 83, + 68, + 16, + 78, + 56, + -8, + 54, + 30, +-29, + 11, + -9, +-39, + 71, + 50, +-15, + 79, + 56, + 9, + 92, + 62, + 6, + 78, + 30, +-54, + 84, + 78, + 65, + 88, + 77, + 61, + 65, + 32, +-16, + 37, +-11, +-68, + 51, + 12, +-50, + 51, + 0, +-74, + 55, + 7, +-72, + 41, + 14, +-13, + 17, +-25, +-75, + 17, +-19, +-75, + 4, +-28, +-73, + -4, +-38, +-83, + 13, +-16, +-46, + 40, + 18, + -5, + 41, + 28, + 11, + 68, + 50, + 28, + 89, + 56, + 7, + 84, + 40, +-42, + 87, + 46, +-36, + 85, + 45, +-32, + 82, + 42, +-33, + 80, + 41, +-33, + 76, + 37, +-36, + 70, + 29, +-39, + 45, + 5, +-65, + 53, + 12, +-38, + 61, + 54, + 17, + 95, + 87, + 44, + 95, + 87, + 44, + 59, + 49, + 11, + 15, + -8, +-36, + 46, + 48, + 5, + 30, + 33, + 3, + 72, + 70, + 42, +108, +100, + 58, +106, + 98, + 55, +104, + 96, + 51, + 62, + 43, + 15, + 25, +-26, +-82, + 65, + 23, +-43, + 65, + 26, +-41, + 61, + 21, +-45, + 52, + 10, +-54, + 36, +-17, +-89, + 36, +-27, +-111, + 6, +-56, +-124, + 41, +-19, +-100, + 29, +-26, +-101, + 36, +-27, +-97, + 24, +-37, +-105, + 85, + 42, +-22, + 40, +-19, +-100, + 94, + 60, + 10, + 72, + 48, + 11, + 68, + 50, + 21, + 68, + 53, + 26, + 69, + 56, + 29, + 72, + 61, + 39, + 75, + 69, + 49, + 76, + 70, + 54, + 79, + 73, + 57, + 78, + 71, + 55, + 76, + 70, + 53, + 74, + 70, + 53, + 73, + 67, + 49, + 71, + 64, + 45, + 71, + 63, + 43, + 70, + 63, + 43, + 70, + 61, + 40, + 72, + 59, + 38, + 74, + 63, + 40, + 79, + 65, + 36, + 93, + 69, + 30, + 47, + -4, +-75, + 29, +-29, +-108, + 63, + 14, +-55, + 51, +-13, +-86, + 19, +-47, +-128, + 30, +-30, +-110, + 56, + -4, +-72, + 56, + -1, +-81, + 39, +-28, +-126, + 35, +-19, +-85, + 60, + 15, +-56, + 66, + 24, +-47, + 69, + 26, +-46, + 45, + -6, +-80, + 75, + 51, + 35, + 90, + 77, + 26, + 88, + 70, + 15, + 44, + 6, +-42, + 36, + 7, +-21, + 90, + 62, +-24, + 82, + 55, + -4, + 93, + 52, +-32, + 82, + 35, +-55, + 90, + 90, + 81, + 85, + 69, + 47, + 72, + 29, +-40, + 38, +-15, +-79, + 50, + 17, +-45, + 52, + 0, +-76, + 55, + 7, +-73, + 70, + 31, +-31, + 77, + 37, +-20, + 81, + 44, +-10, + 88, + 50, + -2, + 92, + 54, + 4, + 93, + 57, + 10, + 86, + 56, + 12, + 40, + 27, + 11, + 67, + 49, + 29, + 90, + 55, + 6, + 85, + 39, +-42, + 86, + 45, +-37, + 85, + 45, +-31, + 81, + 42, +-33, + 80, + 41, +-33, + 75, + 36, +-36, + 69, + 29, +-38, + 43, + 4, +-65, + 50, + 9, +-32, + 72, + 56, + 8, + 91, + 82, + 33, + 93, + 85, + 42, + 64, + 54, + 13, + 19, + -5, +-32, + 43, + 45, + 5, + 17, + 20, + -7, + 51, + 44, + 15, + 99, + 89, + 46, +106, + 98, + 55, +102, + 95, + 51, + 54, + 40, + 5, + 20, +-29, +-81, + 64, + 23, +-43, + 64, + 25, +-42, + 61, + 21, +-45, + 49, + 8, +-56, + 39, +-14, +-80, + 45, +-13, +-86, + 6, +-52, +-103, + 41, +-16, +-88, + 26, +-29, +-98, + 38, +-20, +-81, + 33, +-24, +-71, + 84, + 51, + 12, + 42, +-14, +-80, + 95, + 80, + 49, + 85, + 77, + 56, + 78, + 71, + 57, + 81, + 76, + 65, + 81, + 77, + 67, + 86, + 84, + 74, + 95, + 93, + 84, + 96, + 95, + 88, + 96, + 95, + 88, + 97, + 97, + 90, + 97, + 96, + 90, + 94, + 93, + 87, + 89, + 88, + 82, + 86, + 86, + 79, + 84, + 82, + 76, + 85, + 83, + 78, + 83, + 81, + 76, + 85, + 82, + 75, + 86, + 83, + 75, + 92, + 89, + 78, +105, +100, + 83, + 45, + -5, +-69, + 30, +-22, +-86, + 60, + 18, +-30, + 52, + -3, +-62, + 21, +-42, +-120, + 29, +-27, +-96, + 55, + 1, +-57, + 52, + 3, +-60, + 42, +-21, +-94, + 35, +-20, +-84, + 58, + 14, +-57, + 65, + 25, +-49, + 67, + 27, +-48, + 49, + 4, +-79, + 76, + 51, + 37, + 85, + 73, + 22, + 77, + 66, + 14, + 67, + 53, + 0, + 64, + 53, + 0, + 72, + 63, + 17, + 98, + 76, + 28, + 98, + 60, +-18, + 91, + 51, +-27, + 67, + 57, + 42, + 82, + 63, + 35, + 70, + 31, +-34, + 41, + -5, +-52, + 53, + 19, +-35, + 53, + 1, +-78, + 55, + 7, +-73, + 78, + 41, +-20, + 83, + 46, +-11, + 87, + 51, + -2, + 91, + 57, + 7, + 95, + 62, + 15, + 95, + 65, + 19, + 99, + 68, + 22, + 61, + 41, + 12, + 68, + 49, + 26, + 90, + 55, + 7, + 83, + 38, +-43, + 86, + 45, +-36, + 84, + 45, +-31, + 81, + 42, +-33, + 79, + 40, +-33, + 76, + 36, +-36, + 69, + 29, +-38, + 42, + 0, +-70, + 55, + 19, +-31, + 67, + 45, +-21, + 79, + 62, + -4, + 89, + 81, + 38, + 68, + 57, + 19, + 20, + -3, +-28, + 40, + 14, +-41, + 37, + -4, +-77, + 41, + 2, +-67, + 62, + 30, +-41, + 71, + 48, +-15, + 71, + 43, +-22, + 46, + 8, +-48, + 17, +-30, +-81, + 64, + 23, +-44, + 63, + 24, +-43, + 59, + 20, +-46, + 48, + 7, +-58, + 42, + -9, +-64, + 50, + -6, +-71, + 8, +-48, +-97, + 43, +-13, +-84, + 20, +-36, +-96, + 37, +-17, +-76, + 35, +-16, +-56, + 90, + 61, + 25, + 42, +-11, +-69, +100, + 91, + 75, +114, +113, +110, +112, +111, +109, +112, +112, +109, +113, +113, +111, +115, +115, +114, +120, +120, +120, +120, +120, +120, +118, +118, +117, +120, +120, +119, +120, +120, +120, +110, +111, +111, +107, +107, +108, +111, +112, +110, +114, +114, +114, +114, +114, +113, +114, +114, +113, +111, +111, +109, +105, +105, +103, +111, +110, +108, +117, +117, +113, + 40, + -6, +-66, + 25, +-27, +-88, + 56, + 15, +-28, + 55, + 5, +-48, + 21, +-38, +-106, + 27, +-26, +-89, + 49, + -3, +-56, + 46, + 2, +-53, + 43, +-15, +-80, + 33, +-21, +-85, + 58, + 13, +-57, + 65, + 25, +-50, + 67, + 27, +-47, + 50, + 5, +-80, + 73, + 50, + 36, + 76, + 67, + 23, + 75, + 63, + 17, + 74, + 63, + 14, + 74, + 63, + 14, + 80, + 67, + 19, + 99, + 81, + 38, +110, + 81, + 17, +103, + 67, + -9, + 21, + -5, +-56, + 73, + 48, + -1, + 74, + 40, + -9, + 36, + -5, +-44, + 48, + 12, +-46, + 53, + 1, +-78, + 55, + 7, +-74, + 76, + 39, +-21, + 83, + 46, +-11, + 86, + 50, + -5, + 91, + 57, + 6, + 94, + 60, + 13, + 96, + 65, + 18, + 99, + 67, + 22, + 88, + 60, + 21, + 68, + 49, + 27, + 89, + 54, + 6, + 83, + 38, +-43, + 85, + 44, +-36, + 84, + 45, +-31, + 81, + 41, +-33, + 79, + 40, +-33, + 75, + 36, +-36, + 69, + 29, +-39, + 43, + 2, +-69, + 63, + 24, +-28, + 66, + 41, +-27, + 74, + 52, +-26, + 85, + 77, + 33, + 69, + 58, + 21, + 29, + 4, +-26, + 36, + -4, +-81, + 36, + -1, +-76, + 45, + 10, +-65, + 67, + 40, +-34, + 74, + 51, +-21, + 74, + 53, +-11, + 49, + 12, +-50, + 26, +-24, +-78, + 64, + 23, +-43, + 63, + 23, +-43, + 58, + 18, +-47, + 47, + 6, +-58, + 40, +-12, +-74, + 47, + -8, +-74, + 12, +-46, +-104, + 42, +-19, +-92, + 23, +-33, +-96, + 38, +-17, +-75, + 41, + -9, +-51, + 93, + 54, + 2, + 36, +-17, +-78, +105, + 92, + 74, +121, +121, +121, +119, +120, +120, +120, +120, +120, +121, +121, +121, +121, +121, +121, +121, +121, +121, +115, +114, +111, +102, + 96, + 88, +109, +105, + 98, +120, +120, +118, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +117, +117, +117, +111, +111, +109, +112, +112, +109, +117, +117, +115, + 37, +-15, +-76, + 26, +-29, +-102, + 50, + 3, +-50, + 55, + 3, +-58, + 21, +-41, +-116, + 25, +-32, +-99, + 48, + -9, +-73, + 40, +-10, +-66, + 42, +-20, +-96, + 30, +-27, +-92, + 56, + 12, +-59, + 65, + 23, +-50, + 67, + 26, +-48, + 51, + 4, +-79, + 64, + 40, + 25, + 60, + 59, + 37, + 66, + 68, + 55, + 75, + 78, + 67, + 88, + 88, + 76, + 91, + 91, + 75, +104, + 76, + 18, +119, + 87, + 10, +109, + 73, +-27, + 37, + 14, +-39, + 79, + 50, + 4, + 78, + 39, +-22, + 37, +-10, +-58, + 47, + 7, +-57, + 54, + 1, +-78, + 55, + 6, +-74, + 78, + 41, +-20, + 82, + 45, +-12, + 87, + 51, + -4, + 91, + 57, + 6, + 94, + 60, + 11, + 96, + 64, + 17, + 98, + 66, + 21, +101, + 70, + 25, + 77, + 55, + 27, + 89, + 54, + 6, + 83, + 38, +-43, + 85, + 44, +-37, + 85, + 45, +-31, + 81, + 41, +-33, + 79, + 40, +-33, + 75, + 36, +-36, + 69, + 29, +-38, + 42, + -2, +-68, + 63, + 18, +-33, + 62, + 35, +-34, + 69, + 42, +-36, + 77, + 67, + 21, + 68, + 57, + 19, + 26, + -9, +-80, + 34, + -6, +-83, + 38, + 1, +-75, + 51, + 16, +-59, + 74, + 49, +-23, + 81, + 59, + -9, + 72, + 47, +-23, + 60, + 27, +-31, + 26, +-23, +-84, + 62, + 21, +-46, + 62, + 22, +-44, + 58, + 18, +-47, + 45, + 4, +-60, + 38, +-19, +-94, + 44, +-17, +-94, + 19, +-45, +-122, + 43, +-17, +-94, + 25, +-33, +-102, + 41, +-20, +-93, + 53, + 5, +-42, + 89, + 48, +-15, + 33, +-21, +-84, +106, + 90, + 63, +121, +121, +122, + 99, + 99, +100, +108, +108, +109, +121, +121, +120, +121, +121, +121, +112, +111, +109, + 78, + 69, + 50, + 74, + 60, + 36, + 71, + 51, + 18, +107, +103, + 95, +103, +103, +101, +112, +112, +110, +114, +114, +113, +121, +121, +120, +120, +120, +120, +121, +121, +121, +119, +119, +118, +106, +108, +101, + 98, +104, + 92, +115, +114, +109, + 32, +-23, +-97, + 27, +-27, +-100, + 47, + -4, +-73, + 56, + -1, +-72, + 21, +-44, +-128, + 21, +-40, +-117, + 48, +-17, +-97, + 41, +-18, +-91, + 41, +-23, +-122, + 29, +-32, +-99, + 56, + 11, +-60, + 64, + 22, +-51, + 66, + 26, +-50, + 48, + 1, +-79, + 61, + 37, + 18, + 55, + 40, +-12, + 62, + 62, + 42, + 71, + 73, + 61, + 84, + 86, + 77, + 90, + 91, + 83, +108, + 76, + 9, +121, + 91, + 15, +113, + 78, +-19, + 41, + 19, +-33, + 79, + 42, +-27, + 84, + 39, +-40, + 51, + 4, +-49, + 47, + -5, +-93, + 54, + 1, +-79, + 56, + 6, +-74, + 81, + 44, +-16, + 86, + 49, + -8, + 89, + 53, + -2, + 92, + 58, + 7, + 95, + 60, + 11, + 98, + 64, + 18, + 99, + 66, + 20, +102, + 70, + 26, + 97, + 69, + 28, + 89, + 54, + 5, + 83, + 38, +-42, + 85, + 44, +-34, + 84, + 44, +-31, + 80, + 41, +-34, + 79, + 40, +-34, + 75, + 35, +-35, + 68, + 28, +-39, + 40, + 1, +-64, + 65, + 16, +-31, + 64, + 34, +-36, + 60, + 31, +-44, + 70, + 59, + 14, + 68, + 55, + 16, + 16, +-26, +-87, + 23, +-22, +-96, + 28, +-15, +-91, + 36, + -2, +-74, + 73, + 39, +-32, + 84, + 49, +-15, + 68, + 35, +-35, + 61, + 23, +-42, + 21, +-28, +-81, + 61, + 20, +-46, + 61, + 21, +-44, + 57, + 17, +-48, + 43, + 2, +-62, + 35, +-22, +-97, + 45, +-15, +-86, + 22, +-41, +-114, + 41, +-19, +-93, + 31, +-25, +-95, + 43, +-17, +-83, + 51, + 9, +-33, + 84, + 43, +-12, + 43, + 5, +-39, +104, + 92, + 68, +104, +103, + 92, + 94, + 94, + 83, + 90, + 91, + 81, + 82, + 84, + 73, + 87, + 88, + 79, + 81, + 77, + 61, + 74, + 62, + 38, + 75, + 61, + 36, + 70, + 46, + 3, + 82, + 69, + 40, + 95, + 96, + 90, + 99, +100, + 94, + 94, + 95, + 89, + 99, +100, + 93, + 98, + 99, + 92, +100, +100, + 94, +102, +102, + 97, +101, +102, + 97, +108, +109, +105, +106, +103, + 96, + 31, +-28, +-97, + 36, +-15, +-79, + 49, + 0, +-62, + 57, + 4, +-59, + 22, +-41, +-116, + 19, +-40, +-114, + 48, +-14, +-85, + 40, +-19, +-84, + 42, +-21, +-112, + 26, +-34, +-103, + 54, + 9, +-61, + 64, + 21, +-52, + 66, + 26, +-50, + 46, + -4, +-78, + 59, + 34, + 10, + 63, + 48, + -8, + 73, + 73, + 53, + 82, + 84, + 71, + 85, + 87, + 76, + 91, + 92, + 80, +106, + 86, + 45, +120, + 98, + 43, +116, + 88, + 26, + 42, + 20, +-31, + 81, + 43, +-23, + 89, + 53, + -9, + 46, + 8, +-32, + 45, +-18, +-110, + 54, + 0, +-80, + 55, + 5, +-76, + 83, + 47, +-14, + 89, + 52, + -5, + 92, + 55, + 1, + 94, + 59, + 9, + 96, + 62, + 12, +100, + 65, + 18, +101, + 66, + 20, +102, + 70, + 25, +103, + 73, + 28, + 89, + 54, + 3, + 83, + 38, +-42, + 85, + 43, +-35, + 84, + 45, +-31, + 81, + 41, +-33, + 78, + 39, +-34, + 74, + 34, +-35, + 67, + 27, +-40, + 44, + 6, +-66, + 61, + 14, +-40, + 66, + 43, +-26, + 70, + 51, +-15, + 74, + 65, + 18, + 62, + 53, + 13, + 38, + 24, + -2, + 88, + 77, + 34, + 59, + 41, + -6, + 19, + 10, +-19, +-12, +-17, +-43, + 45, + 40, + 14, + 16, + -5, +-37, + 18, +-27, +-77, + 23, +-26, +-83, + 60, + 19, +-48, + 60, + 20, +-45, + 56, + 16, +-49, + 43, + 1, +-63, + 35, +-18, +-84, + 48, + -5, +-60, + 21, +-37, +-96, + 53, + -5, +-73, + 36, +-17, +-81, + 41, +-11, +-65, + 51, + 14, +-16, + 80, + 45, + 4, + 52, + 20, +-14, +105, +100, + 90, +121, +121, +120, + 91, + 90, + 92, +101, +100, +102, + 75, + 78, + 80, + 82, + 83, + 83, + 81, + 73, + 53, + 74, + 60, + 33, + 80, + 64, + 39, + 69, + 45, + -2, + 71, + 47, + 0, + 83, + 82, + 71, +115, +115, +114, +115, +115, +114, +120, +120, +118, +116, +116, +115, +121, +121, +121, +120, +120, +120, +107, +108, +105, + 96, + 99, + 91, + 97, + 94, + 85, + 31, +-24, +-91, + 42, + -4, +-63, + 52, + 8, +-46, + 57, + 13, +-37, + 24, +-34, +-98, + 21, +-36, +-104, + 53, + 2, +-54, + 41, +-10, +-65, + 43, +-14, +-88, + 23, +-33, +-102, + 54, + 9, +-63, + 63, + 21, +-52, + 66, + 26, +-50, + 47, + -5, +-76, + 60, + 34, + 12, + 66, + 51, + 0, + 76, + 79, + 62, + 82, + 84, + 71, + 85, + 86, + 77, + 91, + 89, + 73, +111, + 86, + 37, +121, + 95, + 30, +119, + 90, + 17, + 42, + 20, +-32, + 82, + 44, +-15, + 89, + 66, + 24, + 35, + 5, +-23, + 36, +-28, +-112, + 52, + 0, +-80, + 53, + 5, +-76, + 75, + 27, +-40, + 82, + 34, +-31, + 86, + 39, +-23, + 84, + 38, +-19, + 81, + 37, +-18, + 84, + 40, +-17, + 91, + 43, +-16, + 90, + 40, +-17, + 96, + 51, + -6, + 76, + 31, +-38, + 83, + 38, +-42, + 85, + 44, +-34, + 84, + 44, +-31, + 81, + 41, +-33, + 78, + 39, +-34, + 74, + 34, +-35, + 67, + 27, +-39, + 42, + 0, +-67, + 51, + 4, +-48, + 48, + 29, +-30, + 67, + 55, + 1, + 73, + 65, + 22, + 54, + 45, + 6, + 8, +-16, +-50, + -9, +-38, +-88, + 16, + -8, +-117, + -7, +-13, +-115, +-39, +-62, +-116, + 76, + 70, + 35, + 8, + -4, +-35, + 11, +-39, +-109, + 25, +-24, +-87, + 59, + 18, +-48, + 59, + 19, +-46, + 55, + 15, +-49, + 41, + 0, +-62, + 37, +-18, +-79, + 49, + -3, +-60, + 18, +-39, +-100, + 63, + 5, +-66, + 39, +-13, +-74, + 33, +-18, +-71, + 62, + 24, + -8, + 77, + 40, + -3, + 45, + 9, +-27, +105, +100, + 87, +122, +122, +121, +102, +101, +103, +107, +107, +108, +106, +107, +107, + 84, + 81, + 72, + 81, + 72, + 51, + 79, + 67, + 39, + 81, + 67, + 39, + 74, + 50, + 4, + 75, + 50, + 0, + 90, + 82, + 56, +120, +120, +120, +121, +121, +121, +120, +120, +118, +113, +113, +111, +121, +121, +121, +121, +121, +121, +117, +116, +114, +101, +103, + 95, +101, + 96, + 86, + 34, +-21, +-90, + 41, + -8, +-69, + 54, + 9, +-48, + 59, + 15, +-39, + 25, +-34, +-100, + 20, +-37, +-107, + 55, + 6, +-51, + 40, +-11, +-69, + 45, +-14, +-88, + 23, +-37, +-108, + 52, + 7, +-65, + 62, + 20, +-55, + 65, + 25, +-51, + 43, +-11, +-78, + 55, + 31, + 10, + 67, + 58, + 11, + 82, + 84, + 71, + 91, + 93, + 83, + 92, + 93, + 85, + 96, + 89, + 70, +113, + 77, + 8, +119, + 88, + -3, +120, + 85, +-10, + 44, + 21, +-28, + 81, + 33, +-48, + 91, + 61, + 8, + 41, + 9, +-27, + 44, +-20, +-104, + 51, + -2, +-81, + 52, + 3, +-77, + 24, + -1, +-28, + 15, +-26, +-86, + 16, +-19, +-78, + 25, + 1, +-54, + 14, +-29, +-88, + 15, +-17, +-48, + 42, + 11, +-15, + 49, + 20, + -8, + 68, + 44, + 17, + 90, + 53, + 1, + 83, + 37, +-43, + 85, + 43, +-34, + 84, + 44, +-31, + 79, + 40, +-34, + 78, + 39, +-34, + 74, + 34, +-34, + 68, + 27, +-39, + 40, + 0, +-68, + 44, + -7, +-60, + 40, + 23, +-33, + 63, + 51, + -3, + 73, + 66, + 23, + 53, + 44, + 9, + 30, + 20, +-10, + 30, + 27, +-11, + 53, + 35, +-119, + -7, +-13, +-97, + 41, + 34, +-87, + 70, + 55, + 5, + 25, + 5, +-35, + 36, + 8, +-97, + 26, +-23, +-81, + 58, + 17, +-49, + 58, + 18, +-47, + 54, + 14, +-51, + 39, + -3, +-67, + 43, +-19, +-94, + 46, +-10, +-88, + 19, +-43, +-111, + 60, + -2, +-91, + 40, +-17, +-88, + 23, +-37, +-100, + 63, + 17, +-36, + 77, + 30, +-38, + 46, + 0, +-56, +109, + 96, + 70, +121, +121, +121, +121, +121, +121, +121, +121, +121, +113, +112, +110, + 84, + 79, + 64, + 83, + 74, + 49, + 84, + 73, + 44, + 84, + 72, + 44, + 81, + 59, + 13, + 79, + 57, + 6, + 77, + 61, + 19, +113, +113, +108, +121, +121, +121, +121, +121, +121, +114, +114, +113, +121, +121, +121, +121, +121, +121, +114, +114, +111, + 92, + 96, + 81, +101, + 96, + 89, + 32, +-25, +-104, + 44, +-10, +-84, + 60, + 9, +-64, + 62, + 9, +-62, + 22, +-42, +-128, + 17, +-42, +-127, + 57, + -2, +-81, + 40, +-22, +-97, + 42, +-22, +-128, + 19, +-45, +-123, + 51, + 6, +-66, + 63, + 18, +-56, + 65, + 24, +-52, + 29, +-18, +-82, + 54, + 32, + 11, + 65, + 52, + 10, + 76, + 78, + 67, + 86, + 87, + 79, + 87, + 89, + 83, + 97, + 90, + 72, +110, + 83, + 33, +120, + 91, + 18, +119, + 88, + 11, + 45, + 21, +-26, + 87, + 39, +-44, + 93, + 50, +-27, + 55, + 16, +-27, + 38, +-20, +-100, + 52, + -2, +-82, + 52, + 3, +-79, +-88, +-120, +-124, +-58, +-86, +-113, +-38, +-64, +-82, +-44, +-72, +-94, +-16, +-41, +-117, + -9, +-18, +-33, + 38, + 24, + 9, + 44, + 31, + 14, + 67, + 49, + 26, + 86, + 52, + 1, + 82, + 37, +-44, + 84, + 43, +-36, + 83, + 43, +-32, + 80, + 40, +-34, + 77, + 38, +-35, + 74, + 34, +-33, + 68, + 27, +-39, + 41, + -4, +-69, + 3, +-47, +-92, + 19, +-17, +-62, + 18, +-21, +-73, + 16, +-11, +-40, + -5, +-41, +-68, + -6, +-43, +-79, +-19, +-53, +-95, +-33, +-87, +-121, +-34, +-88, +-126, +-34, +-89, +-123, +-36, +-91, +-123, +-32, +-83, +-117, +-17, +-66, +-107, + 18, +-30, +-81, + 57, + 16, +-50, + 57, + 17, +-48, + 53, + 13, +-52, + 35, + -7, +-70, + 47, +-15, +-95, + 47, +-12, +-90, + 27, +-35, +-107, + 63, + 1, +-84, + 43, +-16, +-91, + 20, +-41, +-114, + 63, + 18, +-32, + 75, + 29, +-37, + 52, + 6, +-51, +108, + 96, + 70, +122, +122, +122, +121, +121, +121, +121, +121, +121, +108, +107, +105, + 99, + 97, + 91, + 96, + 91, + 81, + 99, + 93, + 80, + 84, + 70, + 49, + 91, + 78, + 58, + 92, + 79, + 56, + 89, + 76, + 55, +109, +107, + 99, +118, +118, +115, +120, +120, +118, +115, +115, +114, +121, +121, +121, +121, +121, +121, +115, +115, +113, + 98, + 98, + 95, +105, + 99, + 92, + 42, +-16, +-97, + 48, + -2, +-76, + 60, + 9, +-65, + 65, + 10, +-61, + 22, +-42, +-128, + 18, +-42, +-126, + 59, + 2, +-79, + 40, +-22, +-98, + 41, +-22, +-128, + 19, +-48, +-128, + 50, + 5, +-69, + 62, + 17, +-56, + 66, + 24, +-52, + 39, +-11, +-82, + 16, +-31, +-72, + 19, +-16, +-59, + 23, +-11, +-37, + 13, +-14, +-30, + 14, +-10, +-21, + 17, + -6, +-21, + 24, + -9, +-48, + 31, + -2, +-46, + 30, + -5, +-59, + 2, +-37, +-72, + 14, +-34, +-86, + 12, +-30, +-70, + -5, +-50, +-79, + 24, +-34, +-111, + 51, + -3, +-82, + 51, + 2, +-78, +-85, +-116, +-121, +-68, +-104, +-122, +-51, +-80, +-92, +-63, +-94, +-113, +-29, +-31, +-112, + 44, + 24, +-73, + 59, + 44, +-33, + 64, + 44, + -4, + 78, + 59, + 15, + 87, + 52, + -1, + 83, + 37, +-45, + 84, + 43, +-39, + 83, + 43, +-33, + 79, + 39, +-36, + 77, + 38, +-35, + 75, + 35, +-34, + 70, + 31, +-36, + 57, + 17, +-48, + 31, + -8, +-64, + 31, +-10, +-64, + 31, +-10, +-65, + 30, +-10, +-65, + 29, +-11, +-64, + 29, +-11, +-66, + 28, +-13, +-66, + 27, +-15, +-67, + 26, +-16, +-68, + 24, +-18, +-70, + 22, +-20, +-72, + 21, +-21, +-76, + 19, +-24, +-78, + 36, + -6, +-62, + 57, + 16, +-48, + 56, + 16, +-49, + 51, + 10, +-54, + 33, + -9, +-69, + 44, +-13, +-86, + 46, + -8, +-72, + 40, +-15, +-83, + 66, + 12, +-55, + 41, + -9, +-72, + 21, +-37, +-96, + 66, + 35, + 8, + 76, + 41, + -5, + 56, + 11, +-31, +107, +101, + 87, +121, +121, +121, +114, +114, +113, +118, +118, +118, +120, +120, +120, +113, +113, +112, +121, +121, +121, +116, +113, +111, + 48, + 18, +-15, + 93, + 86, + 79, +119, +118, +118, +121, +121, +121, +115, +116, +106, +120, +120, +120, +119, +120, +116, +114, +115, +112, +121, +121, +121, +121, +121, +121, +118, +118, +116, + 96, + 97, + 95, +103, + 98, + 92, + 48, + -2, +-74, + 50, + 9, +-48, + 62, + 17, +-42, + 63, + 17, +-40, + 24, +-36, +-118, + 17, +-37, +-111, + 62, + 12, +-53, + 41, +-14, +-74, + 41, +-19, +-99, + 20, +-43, +-119, + 48, + 2, +-71, + 61, + 16, +-57, + 65, + 23, +-52, + 51, + 9, +-64, + 44, + -8, +-82, + 49, + -6, +-83, + 45, +-10, +-84, + 48, +-10, +-86, + 42, +-16, +-93, + 40, +-19, +-95, + 36, +-24, +-97, + 37, +-21, +-100, + 33, +-26, +-105, + 31, +-28, +-105, + 26, +-31, +-108, + 19, +-35, +-108, + 19, +-33, +-106, + 34, +-17, +-90, + 52, + 2, +-77, + 53, + 5, +-76, +-69, +-107, +-123, +-55, +-100, +-125, +-15, +-61, +-94, + 17, +-23, +-109, + 13, + -1, +-111, +-43, +-48, +-123, + 49, + 28, +-57, + 81, + 38, +-126, + 83, + 56, +-52, + 90, + 51, +-21, + 82, + 36, +-46, + 84, + 43, +-39, + 81, + 41, +-35, + 78, + 38, +-37, + 76, + 37, +-37, + 75, + 36, +-33, + 72, + 34, +-33, + 70, + 30, +-37, + 67, + 27, +-40, + 64, + 26, +-40, + 64, + 27, +-39, + 63, + 26, +-39, + 65, + 27, +-38, + 65, + 26, +-39, + 62, + 23, +-40, + 61, + 21, +-42, + 57, + 19, +-45, + 57, + 17, +-48, + 55, + 14, +-45, + 54, + 13, +-46, + 53, + 13, +-49, + 54, + 14, +-49, + 55, + 15, +-48, + 53, + 12, +-50, + 49, + 9, +-55, + 36, + -8, +-70, + 49, + -8, +-77, + 49, + -4, +-65, + 37, +-20, +-86, + 71, + 20, +-49, + 47, + -3, +-66, + 22, +-35, +-92, + 71, + 39, + 12, + 77, + 40, + -6, + 55, + 11, +-28, +107, +101, + 87, +121, +121, +121, +109, +110, +107, +120, +120, +120, +120, +120, +120, +115, +115, +113, +120, +119, +119, + 89, + 80, + 72, + 27, + -8, +-40, + 54, + 33, + 12, +114, +113, +112, +121, +121, +121, +121, +121, +121, +111, +110, +105, + 85, + 84, + 65, + 86, + 83, + 67, +100, +100, + 96, +112, +111, +109, +120, +121, +120, +105, +106, +103, +103, + 98, + 92, + 49, + -2, +-71, + 56, + 14, +-47, + 57, + 14, +-41, + 62, + 22, +-30, + 28, +-33, +-107, + 17, +-37, +-103, + 63, + 18, +-39, + 40, +-11, +-60, + 42, +-14, +-88, + 21, +-39, +-109, + 45, + -2, +-74, + 59, + 14, +-59, + 65, + 23, +-53, + 67, + 27, +-51, + 68, + 27, +-53, + 68, + 26, +-53, + 69, + 25, +-52, + 68, + 21, +-53, + 60, + 12, +-60, + 59, + 11, +-62, + 57, + 9, +-65, + 55, + 6, +-67, + 52, + 3, +-72, + 52, + 1, +-73, + 53, + 0, +-75, + 50, + 0, +-74, + 49, + 0, +-75, + 52, + 3, +-72, + 52, + 3, +-72, + 53, + 5, +-76, +-44, +-87, +-115, +-12, +-63, +-107, + 16, +-32, +-76, + 3, +-42, +-104, +-25, +-20, +-121, +-32, +-22, +-109, + 14, + 9, +-27, + 11, +-19, +-64, + 72, + 31, +-126, +102, + 72, +-79, + 80, + 34, +-49, + 83, + 40, +-41, + 81, + 41, +-38, + 77, + 37, +-38, + 75, + 36, +-37, + 75, + 35, +-34, + 73, + 33, +-34, + 71, + 32, +-35, + 68, + 31, +-36, + 67, + 31, +-37, + 66, + 30, +-35, + 66, + 30, +-35, + 65, + 29, +-36, + 65, + 29, +-36, + 63, + 26, +-39, + 61, + 25, +-40, + 60, + 23, +-42, + 59, + 19, +-43, + 57, + 17, +-43, + 55, + 15, +-44, + 55, + 14, +-47, + 54, + 13, +-49, + 52, + 11, +-48, + 50, + 9, +-53, + 47, + 6, +-57, + 33, +-14, +-79, + 54, + -6, +-81, + 48, +-12, +-78, + 42, +-19, +-93, + 72, + 15, +-66, + 58, + 4, +-69, + 26, +-38, +-106, + 78, + 37, +-11, + 79, + 32, +-35, + 66, + 14, +-41, +109, + 97, + 74, +119, +119, +117, +118, +118, +116, +118, +118, +115, +119, +118, +116, +112, +110, +105, + 86, + 73, + 59, + 15, +-17, +-52, + 41, + 5, +-32, + 21, +-20, +-67, + 44, + 21, +-11, +111, +112, +107, +112, +113, +110, + 97, + 97, + 82, + 76, + 73, + 52, + 54, + 49, + 19, + 75, + 68, + 42, + 70, + 58, + 24, + 14, + 15, +-10, + 70, + 72, + 65, +105, + 99, + 91, + 53, + -3, +-84, + 58, + 8, +-63, + 54, + 5, +-58, + 62, + 15, +-46, + 27, +-34, +-107, + 15, +-42, +-115, + 63, + 15, +-51, + 38, +-16, +-71, + 39, +-22, +-105, + 22, +-41, +-118, + 41, + -8, +-75, + 57, + 13, +-61, + 65, + 22, +-54, + 68, + 29, +-51, + 72, + 33, +-49, + 72, + 32, +-50, + 73, + 29, +-50, + 70, + 26, +-51, + 66, + 19, +-56, + 64, + 17, +-60, + 62, + 14, +-63, + 60, + 11, +-63, + 60, + 8, +-69, + 60, + 6, +-73, + 59, + 5, +-74, + 57, + 4, +-75, + 55, + 5, +-71, + 54, + 5, +-70, + 52, + 3, +-72, + 51, + 3, +-77, +-62, +-96, +-120, +-28, +-61, +-87, + 12, +-19, +-44, + 14, +-14, +-55, +-33, +-41, +-97, + 41, + 5, +-124, + 9, + -2, +-43, +-31, +-15, +-106, + 17, + 12, +-74, + 72, + 47, +-85, + 64, + 29, +-52, + 83, + 38, +-42, + 79, + 39, +-38, + 76, + 36, +-39, + 75, + 35, +-38, + 74, + 34, +-35, + 72, + 32, +-35, + 71, + 31, +-36, + 68, + 31, +-37, + 66, + 30, +-38, + 66, + 29, +-37, + 65, + 28, +-37, + 63, + 24, +-41, + 61, + 23, +-42, + 59, + 21, +-44, + 56, + 17, +-44, + 43, + 9, +-39, + 33, + -4, +-55, + 30, + -8, +-59, + 32, + -7, +-57, + 30, +-10, +-61, + 22, +-18, +-68, + 19, +-23, +-73, + 14, +-28, +-79, + 12, +-30, +-83, + 8, +-39, +-93, + 15, +-34, +-93, + 25, +-32, +-96, + 46, +-17, +-99, + 69, + 6, +-81, + 64, + 8, +-75, + 28, +-42, +-124, + 79, + 37, +-16, + 79, + 32, +-45, + 72, + 23, +-39, +112, + 98, + 74, +121, +121, +121, +122, +122, +122, +121, +121, +121, +121, +121, +121, +118, +118, +116, +113, +110, +105, + 94, + 84, + 70, + 31, + -7, +-46, + 63, + 45, + 24, + 97, + 93, + 87, +120, +120, +119, +101, +101, + 91, + 79, + 79, + 65, + 30, + 29, + 0, + 68, + 63, + 40, + 74, + 63, + 26, + 61, + 37, +-15, + 37, + 20, +-21, + 43, + 30, +-12, + 82, + 65, + 36, + 52, + -4, +-97, + 54, + 4, +-70, + 52, + -1, +-72, + 62, + 10, +-62, + 27, +-37, +-113, + 12, +-46, +-122, + 62, + 8, +-69, + 35, +-22, +-93, + 35, +-28, +-128, + 8, +-52, +-126, + 18, +-29, +-88, + 35, + -9, +-68, + 44, + 2, +-62, + 49, + 10, +-58, + 50, + 12, +-58, + 49, + 9, +-60, + 50, + 7, +-61, + 47, + 4, +-62, + 44, + -1, +-64, + 40, + -5, +-70, + 46, + 0, +-70, + 60, + 11, +-67, + 59, + 9, +-70, + 60, + 6, +-73, + 58, + 4, +-73, + 57, + 3, +-73, + 53, + 4, +-71, + 52, + 3, +-71, + 50, + 1, +-74, + 50, + 1, +-75, + 46, + -1, +-77, + 74, + 36, +-22, + 90, + 55, + -8, + 95, + 68, + 25, +-42, +-57, +-86, + 27, +-23, +-126, +-22, +-40, +-125, +-17, +-31, +-113, + 32, + -5, +-123, +-35, +-40, +-117, + 56, + 24, +-76, + 83, + 39, +-45, + 79, + 37, +-41, + 74, + 34, +-42, + 74, + 33, +-40, + 72, + 31, +-37, + 70, + 30, +-37, + 70, + 30, +-37, + 67, + 28, +-39, + 66, + 27, +-40, + 64, + 27, +-39, + 63, + 25, +-40, + 55, + 15, +-50, + 50, + 10, +-54, + 49, + 8, +-53, + 46, + 4, +-54, + 22, +-12, +-43, +-26, +-67, +-101, +-18, +-61, +-103, +-25, +-69, +-112, +-26, +-73, +-119, +-24, +-71, +-116, +-18, +-66, +-114, +-20, +-67, +-110, +-24, +-68, +-112, +-19, +-63, +-104, +-34, +-80, +-118, + 12, +-47, +-106, + 49, + -9, +-84, + 69, + 9, +-69, + 73, + 22, +-54, + 28, +-41, +-115, + 84, + 50, + 13, + 82, + 41, +-20, + 75, + 27, +-29, +113, +105, + 89, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +119, +119, +118, +121, +121, +121, +113, +111, +105, + 32, + -7, +-51, + 81, + 70, + 55, +113, +113, +112, +118, +118, +117, + 89, + 87, + 71, + 71, + 67, + 48, + 86, + 84, + 58, + 74, + 66, + 39, + 65, + 47, + 8, + 46, + 19, +-33, + 65, + 39, +-20, + 57, + 28, +-33, + 76, + 54, + 13, + 58, + 1, +-78, + 53, + 11, +-48, + 52, + 2, +-63, + 62, + 11, +-54, + 30, +-31, +-99, + 11, +-46, +-121, + 61, + 8, +-63, + 31, +-25, +-89, + 32, +-31, +-126, + -4, +-58, +-123, +-30, +-81, +-125, +-11, +-56, +-91, +-25, +-77, +-122, +-23, +-74, +-119, +-17, +-70, +-111, +-17, +-68, +-113, +-20, +-73, +-119, +-13, +-61, +-103, + 3, +-44, +-80, + 1, +-48, +-87, + 30, +-16, +-79, + 58, + 9, +-68, + 59, + 6, +-69, + 58, + 3, +-72, + 57, + 2, +-73, + 55, + 2, +-73, + 51, + 2, +-73, + 50, + 1, +-74, + 48, + -1, +-76, + 47, + -2, +-77, + 45, + 5, +-60, + 74, + 35, +-33, + 95, + 62, + 15, +104, + 88, + 63, +-29, +-34, +-71, + 42, +-10, +-126, + 44, + 11, +-122, + 17, +-29, +-127, + 25, + 5, +-33, + 65, + 20, +-55, + 83, + 37, +-101, + 84, + 40, +-50, + 80, + 36, +-42, + 75, + 33, +-43, + 72, + 31, +-42, + 70, + 29, +-41, + 68, + 28, +-39, + 67, + 27, +-40, + 65, + 25, +-42, + 64, + 24, +-42, + 62, + 22, +-43, + 61, + 21, +-44, + 48, + 8, +-56, + 42, + 2, +-59, + 42, + 0, +-59, + 38, + -4, +-60, + 13, +-21, +-52, + 13, + -6, +-16, + 55, + 39, + 30, + 51, + 27, + 11, + 52, + 27, + 11, + 51, + 22, + 4, + 56, + 32, + 15, + 63, + 39, + 24, + 71, + 45, + 28, + 57, + 18, +-23, + 18, +-16, +-44, + 7, +-47, +-99, + 51, + -6, +-70, + 70, + 12, +-61, + 73, + 24, +-43, + 38, +-19, +-78, + 65, + 26, + -9, + 56, + 16, +-30, + 49, + 11, +-35, + 44, + 8, +-42, + 54, + 33, +-16, + 80, + 59, + 22, + 97, + 85, + 63, +114, +109, +102, +119, +119, +118, +117, +116, +114, +101, + 89, + 74, + 63, + 37, + 8, + 74, + 53, + 22, +109, +109, +108, +116, +115, +116, + 83, + 83, + 70, + 58, + 50, + 21, + 85, + 83, + 62, + 78, + 68, + 40, + 58, + 34, +-18, + 46, + 16, +-37, + 57, + 27, +-30, + 63, + 35, +-23, + 81, + 66, + 43, + 60, + 6, +-65, + 48, + 9, +-38, + 49, + 4, +-50, + 60, + 15, +-35, + 31, +-24, +-83, + 9, +-45, +-108, + 58, + 13, +-41, + 28, +-21, +-68, + 29, +-31, +-118, + -9, +-59, +-117, + 4, +-30, +-51, + 25, +-15, +-51, + 24, +-17, +-58, + 28, +-14, +-53, + 33, +-10, +-47, + 37, + -4, +-37, + 39, + 0, +-32, + 47, + 13, +-17, + 54, + 25, + -5, +-18, +-64, +-98, + 34, +-14, +-80, + 55, + 6, +-69, + 54, + 4, +-71, + 55, + 1, +-72, + 53, + -1, +-74, + 50, + 0, +-74, + 49, + 0, +-75, + 48, + -1, +-76, + 46, + -3, +-77, + 45, + -4, +-78, + 39, + 1, +-57, + 64, + 30, +-25, + 95, + 67, + 20, + 99, + 74, + 28, + -6, +-11, +-46, + 0, +-37, +-121, + 4, +-24, +-121, + 15, + 11, +-29, + 65, + 36, + 6, + 83, + 41, +-21, + 77, + 30, +-54, + 82, + 36, +-48, + 78, + 34, +-44, + 73, + 30, +-45, + 69, + 29, +-46, + 68, + 27, +-41, + 67, + 27, +-40, + 65, + 25, +-42, + 63, + 23, +-44, + 62, + 22, +-44, + 59, + 19, +-46, + 57, + 17, +-48, + 45, + 5, +-58, + 40, + -1, +-61, + 38, + -3, +-62, + 36, + -8, +-61, + 9, +-28, +-60, + 61, + 54, + 51, +103, + 98, + 92, + 87, + 72, + 59, + 89, + 73, + 62, + 89, + 70, + 56, + 90, + 68, + 51, + 87, + 57, + 30, + 81, + 41, + -3, + 84, + 42, +-10, + 55, + 32, + 12, + 12, +-44, +-95, + 48, +-11, +-83, + 58, + -1, +-73, + 68, + 20, +-34, + 61, + 18, +-20, + 72, + 40, + 14, + 81, + 48, + 9, + 80, + 52, + 13, + 83, + 59, + 24, + 80, + 61, + 29, + 67, + 50, + 23, + 54, + 26, +-20, + 62, + 25, +-36, + 85, + 70, + 53, + 95, + 92, + 87, + 58, + 38, + 21, + 33, +-10, +-46, + 59, + 42, + 29, +106, +105, +103, +121, +121, +121, + 86, + 79, + 68, + 53, + 36, + 7, + 55, + 39, + 6, + 47, + 28, + -5, + 41, + 19, +-24, + 43, + 27, + 4, + 34, + 4, +-45, + 56, + 33, +-13, + 74, + 53, + 19, + 60, + 5, +-71, + 57, + 17, +-34, + 47, + 0, +-55, + 62, + 17, +-36, + 29, +-26, +-87, + 6, +-48, +-107, + 58, + 17, +-38, + 25, +-24, +-72, + 29, +-29, +-114, + -7, +-56, +-114, + 43, + 26, + 16, + 51, + 7, +-38, + 56, + 11, +-34, + 60, + 18, +-28, + 68, + 26, +-18, + 80, + 40, + 1, + 89, + 54, + 21, + 90, + 59, + 25, + 95, + 61, + 13, +-16, +-59, +-96, + 34, +-14, +-79, + 52, + 3, +-71, + 50, + 1, +-74, + 48, + -1, +-75, + 47, + -2, +-76, + 47, + -2, +-76, + 47, + -2, +-76, + 46, + -3, +-77, + 43, + -5, +-79, + 42, + -7, +-81, + 17, + 1, +-18, + 28, + 31, + 35, + 81, + 64, + 34, + 96, + 73, + 31, + 1, + -6, +-48, +-66, +-51, +-122, +-85, +-68, +-100, +-14, +-14, +-35, + -8, +-39, +-79, + 65, + 10, +-109, + 78, + 31, +-58, + 81, + 34, +-50, + 76, + 32, +-46, + 73, + 28, +-47, + 68, + 26, +-46, + 67, + 25, +-43, + 66, + 24, +-42, + 64, + 23, +-43, + 62, + 22, +-44, + 60, + 20, +-45, + 57, + 16, +-49, + 55, + 15, +-50, + 42, + 1, +-58, + 38, + -3, +-63, + 36, + -6, +-62, + 33, +-10, +-64, + 14, +-25, +-60, + 57, + 51, + 49, +105, + 98, + 92, + 88, + 74, + 62, + 86, + 65, + 47, + 84, + 56, + 33, + 80, + 44, + 7, + 78, + 34, +-13, + 78, + 35, +-19, + 87, + 46, + -9, + 58, + 33, + 11, + 47, + 7, +-43, + 52, + 14, +-34, + 32, + 3, +-52, + 23, +-30, +-67, + 83, + 17, + -9, + 87, + 48, + 7, + 86, + 58, + 14, + 60, + 43, + 0, + 61, + 45, + 4, + 56, + 47, + 12, + 59, + 51, + 19, + 39, + 36, +-12, + 9, + 18, +-28, + 56, + 43, + 10, + 39, + 16, +-25, + 46, + 13, +-36, + 34, + -7, +-54, + 8, + -5, +-17, + 48, + 44, + 41, + 59, + 55, + 50, +121, +121, +120, +121, +121, +120, + 97, + 90, + 81, + 13, + 3, +-17, + 59, + 55, + 47, + 46, + 46, + 39, + 94, + 89, + 84, +103, + 93, + 82, +108, + 88, + 64, + 58, + 0, +-79, + 56, + 9, +-49, + 45, + -8, +-79, + 57, + 5, +-64, + 26, +-35, +-105, + 3, +-56, +-126, + 58, + 5, +-70, + 20, +-35, +-95, + 26, +-36, +-128, +-10, +-60, +-113, + 48, + 39, + 36, + 48, + 6, +-37, + 52, + 7, +-39, + 56, + 10, +-35, + 65, + 22, +-23, + 81, + 41, + 2, + 88, + 53, + 18, + 90, + 55, + 18, + 93, + 59, + 6, +-23, +-61, +-91, + 30, +-17, +-81, + 47, + -2, +-73, + 46, + -3, +-75, + 46, + -3, +-77, + 45, + -4, +-78, + 45, + -4, +-78, + 45, + -4, +-78, + 42, + -7, +-81, + 41, + -8, +-82, + 40, + -9, +-83, + 6, + 10, + 6, + 22, + 28, + 28, + 62, + 48, + 27, + 93, + 68, + 22, + 16, + 8, +-37, +-88, +-71, +-111, +-78, +-57, +-79, +-62, +-51, +-73, + 8, + -6, +-37, + 80, + 40, +-14, + 75, + 26, +-57, + 78, + 31, +-52, + 76, + 29, +-48, + 70, + 25, +-50, + 68, + 23, +-48, + 65, + 23, +-45, + 63, + 21, +-45, + 62, + 21, +-45, + 60, + 19, +-46, + 58, + 17, +-48, + 53, + 12, +-52, + 50, + 9, +-55, + 39, + -2, +-62, + 35, + -6, +-66, + 32, + -9, +-68, + 30, +-13, +-68, + 14, +-27, +-61, + 57, + 51, + 48, +105, + 97, + 92, + 90, + 72, + 57, + 85, + 59, + 36, + 81, + 48, + 16, + 76, + 36, +-10, + 74, + 29, +-22, + 76, + 31, +-24, + 85, + 43, +-12, + 82, + 51, + 21, + 0, +-34, +-77, + 57, + 2, +-57, + 25, +-11, +-76, + 14, + 10, +-36, + 92, + 60, + 15, + 76, + 48, + 0, + 58, + 38, +-14, + 16, + 12, +-37, + 19, + 13, +-30, + 40, + 30, +-14, + 34, + 28, +-13, +-24, +-15, +-66, +-35, + -9, +-52, +-44, + -7, +-38, + 12, + 25, + -1, +-45, + -6, +-41, + 48, + 14, +-37, +-25, +-24, +-48, +-36, +-28, +-48, +-27, +-24, +-44, + 83, + 80, + 76, +121, +120, +119, +112, +111, +110, + 84, + 84, + 83, +119, +119, +119, +111, +110, +109, +114, +113, +112, +120, +120, +119, +103, + 93, + 80, + 65, + 37, + 16, + 64, + 22, +-20, + 41, +-10, +-80, + 53, + 3, +-61, + 24, +-36, +-101, + -2, +-57, +-128, + 56, + 4, +-68, + 17, +-36, +-99, + 23, +-40, +-128, +-19, +-69, +-124, + 53, + 46, + 46, + 46, + 3, +-38, + 50, + 5, +-40, + 56, + 10, +-36, + 66, + 23, +-23, + 81, + 41, + 0, + 88, + 51, + 16, + 88, + 51, + 8, + 97, + 63, + 8, +-25, +-67, +-97, + 28, +-19, +-85, + 44, + -5, +-76, + 43, + -7, +-77, + 42, + -7, +-80, + 44, + -9, +-82, + 42, + -8, +-81, + 42, + -8, +-80, + 40, + -9, +-83, + 38, +-11, +-85, + 38, +-11, +-86, + 21, + 23, + 16, + 39, + 40, + 34, + 46, + 51, + 42, + 68, + 46, + 1, + 24, + 15, +-28, +-40, +-30, +-45, +-61, +-45, +-55, +-14, + -3, +-10, +-29, +-25, +-65, + 78, + 37, +-18, + 72, + 23, +-58, + 76, + 29, +-53, + 75, + 28, +-49, + 69, + 23, +-51, + 66, + 21, +-51, + 64, + 20, +-47, + 61, + 19, +-47, + 60, + 18, +-48, + 58, + 16, +-48, + 54, + 12, +-52, + 49, + 7, +-56, + 46, + 4, +-57, + 37, + -6, +-65, + 33, +-10, +-69, + 31, +-12, +-71, + 27, +-16, +-72, + 7, +-33, +-68, + 58, + 49, + 44, +107, +100, + 94, + 92, + 72, + 56, + 83, + 52, + 24, + 79, + 41, + 3, + 72, + 28, +-19, + 68, + 22, +-31, + 72, + 24, +-29, + 80, + 36, +-21, + 68, + 38, + 0, + 55, + 48, + 25, +105, + 59, +-37, + 66, + 11, +-108, + 43, + 27, +-21, + 88, + 57, + 9, + -2, + -3, +-58, +-12, +-11, +-70, + 17, + 12, +-47, + 22, + 16, +-29, + 37, + 28, +-14, + 48, + 36, + -7, + 39, + 29, +-21, +-39, +-24, +-79, + -4, + 2, +-51, +-23, + -5, +-52, + 25, + 36, + -7, + 39, + 8, +-40, +-38, +-70, +-93, +-49, +-85, +-116, +-43, +-77, +-108, + 7, + -5, +-13, + 51, + 42, + 37, + 42, + 32, + 26, + 33, + 21, + 19, + 29, + 18, + 13, + 17, + 4, + -2, + 18, + 1, + -6, + 18, + 2, + -4, +-16, +-43, +-53, +-21, +-68, +-103, + 66, + 34, + 8, + 36, + -8, +-59, + 53, + 11, +-35, + 24, +-29, +-83, + -5, +-59, +-123, + 54, + 10, +-41, + 17, +-32, +-81, + 22, +-38, +-118, +-31, +-73, +-106, + 66, + 59, + 59, + 43, + -1, +-42, + 50, + 5, +-41, + 55, + 10, +-39, + 67, + 24, +-22, + 80, + 39, + -3, + 87, + 48, + 8, + 87, + 49, + 3, +102, + 69, + 15, +-23, +-66, +-97, + 24, +-24, +-88, + 41, + -9, +-80, + 40, + -9, +-82, + 39, +-10, +-84, + 41, +-13, +-85, + 40, +-11, +-84, + 38, +-12, +-84, + 37, +-13, +-86, + 36, +-13, +-88, + 35, +-14, +-88, + 23, + 24, + 15, + 36, + 37, + 35, + 53, + 61, + 56, + -7, + 6, +-31, + 23, + 14, +-19, +-26, +-18, +-23, +-71, +-54, +-63, +-13, + -5, +-12, + 24, + 18, + -7, + 71, + 30, +-25, + 73, + 19, +-60, + 75, + 26, +-56, + 73, + 25, +-52, + 66, + 20, +-52, + 64, + 19, +-51, + 62, + 17, +-49, + 60, + 17, +-49, + 57, + 15, +-49, + 53, + 11, +-53, + 49, + 7, +-57, + 44, + 2, +-59, + 42, + -1, +-60, + 33, +-10, +-69, + 31, +-13, +-71, + 29, +-14, +-73, + 26, +-18, +-75, + 28, + 4, +-14, + 19, + -1, +-10, + 94, + 81, + 69, + 89, + 64, + 41, + 81, + 43, + 8, + 72, + 30, +-13, + 63, + 16, +-31, + 59, + 11, +-41, + 63, + 14, +-39, + 66, + 16, +-38, + 45, + 1, +-49, + 71, + 69, + 64, + 95, + 58, + 7, + 86, + 36, +-59, + 85, + 50, + -3, + 80, + 51, + 3, + 13, + 4, +-52, + 6, + 5, +-58, + 24, + 17, +-42, + 20, + 17, +-36, + 57, + 40, + -4, + 25, + 17, +-39, + 17, + 11, +-44, + 8, + 9, +-46, + 48, + 34, + -4, + 49, + 47, + 15, + 86, + 85, + 68, + 52, + 15, +-30, + -5, +-43, +-87, +-13, +-55, +-104, + -5, +-45, +-94, + 0, +-36, +-83, + 1, +-37, +-84, + -3, +-39, +-87, +-13, +-50, +-95, + -7, +-43, +-87, +-21, +-58, +-97, +-46, +-77, +-108, + 2, +-15, +-26, + -3, +-32, +-48, + 6, +-38, +-77, + 62, + 32, + 5, + 27, +-18, +-59, + 47, + 8, +-36, + 21, +-28, +-80, +-11, +-60, +-106, + 54, + 21, + -7, + 37, + 2, +-23, + 12, +-31, +-70, +-22, +-50, +-54, + 32, + 14, + 7, + 42, + -2, +-44, + 49, + 3, +-42, + 54, + 9, +-40, + 65, + 20, +-26, + 76, + 36, +-11, + 83, + 43, + -1, + 84, + 45, + -3, + 72, + 40, + -8, +-31, +-67, +-97, + 22, +-27, +-89, + 37, +-12, +-82, + 37, +-13, +-84, + 37, +-15, +-88, + 39, +-17, +-89, + 35, +-15, +-88, + 35, +-15, +-87, + 33, +-16, +-89, + 33, +-16, +-92, + 32, +-17, +-92, + 32, + 34, + 27, + 40, + 42, + 42, + 43, + 48, + 47, + 49, + 53, + 22, + 2, + 1, +-32, +-103, +-80, +-94, +-99, +-76, +-89, +-76, +-63, +-74, + 10, +-15, +-41, + 33, + -3, +-43, + 42, + 13, +-22, + 47, + 18, + -9, + 47, + 21, + -6, + 15, + -7, +-32, + 49, + 27, + -5, + 61, + 41, + 3, + 59, + 13, +-51, + 55, + 11, +-54, + 49, + 6, +-58, + 43, + 1, +-62, + 39, + -4, +-63, + 37, + -6, +-65, + 31, +-13, +-71, + 29, +-14, +-73, + 28, +-16, +-74, + 29, + -9, +-54, + 1, +-18, +-30, + 24, + 1, +-17, + 37, +-11, +-52, + 58, + 11, +-33, + 62, + 14, +-31, + 64, + 27, + -9, + 75, + 51, + 23, + 96, + 88, + 70, + 92, + 85, + 71, + 73, + 52, + 33, + 54, + 9, +-38, + 73, + 57, + 29, + 69, +-12, +-109, + 64, + 8, +-39, + 86, + 50, + -1, + 33, + 19, +-42, + -2, + -5, +-63, + 3, + 1, +-61, + 34, + 25, +-36, + 19, + 13, +-42, + 42, + 31, +-17, +-26, +-16, +-68, + 13, + 7, +-50, + 16, + 10, +-44, + 82, + 62, + 28, + 73, + 62, + 31, +101, +100, + 91, + 64, + 26, +-33, +115, +113, +109, +111, +109, +106, +118, +117, +113, +117, +116, +113, +119, +119, +113, +122, +122, +119, +118, +117, +114, +121, +121, +121, + 83, + 78, + 69, +-39, +-67, +-112, +102, +100, + 96, + 78, + 54, + 33, + 30, +-16, +-56, + 48, + 13, +-25, + 16, +-31, +-85, + 41, + -5, +-55, + -2, +-44, +-85, +-37, +-73, +-102, + 47, + 21, +-14, + 55, + 14, +-37, + 24, +-22, +-70, +-34, +-68, +-89, + 5, +-36, +-72, + 41, + -4, +-46, + 49, + 3, +-42, + 54, + 9, +-38, + 62, + 17, +-30, + 72, + 29, +-18, + 77, + 35, +-12, + 49, + 10, +-29, + 56, + 38, + 18, + 59, + 37, + 13, + 24, +-25, +-93, + 35, +-15, +-86, + 34, +-15, +-87, + 34, +-17, +-91, + 36, +-19, +-92, + 34, +-19, +-92, + 31, +-18, +-92, + 30, +-19, +-94, + 30, +-19, +-94, + 29, +-20, +-96, + 39, + 40, + 40, + 40, + 42, + 43, + 41, + 45, + 45, + 75, + 70, + 48, + 73, + 63, + 36, +-119, +-112, +-123, +-93, +-91, +-90, +-32, +-34, +-34, + 14, + 3, + 5, + 18, + 8, + 10, + 19, + 9, + 12, + 22, + 13, + 17, + 21, + 12, + 15, + 14, + 6, + 7, + 24, + 1, +-24, + 26, +-34, +-43, + 53, + 9, +-37, + 54, + 7, +-55, + 44, + 1, +-61, + 38, + -5, +-64, + 36, + -7, +-66, + 32, +-11, +-70, + 30, +-13, +-72, + 28, +-15, +-75, + 25, +-17, +-79, + 22, +-14, +-59, +-56, +-96, +-116, + 40, + 28, + 23, + 92, + 77, + 52, + 88, + 74, + 47, + 85, + 71, + 48, +105, +102, + 88, +107, +106, + 95, +103, + 99, + 84, +109, +108, + 97, +107, +105, + 96, + 75, + 48, + 16, + 76, + 64, + 44, + 86, + 28, +-87, + 74, + 9, +-82, + 66, + 39, + -9, + 20, + 8, +-50, + 37, +-13, +-57, + 39, + 28, +-12, + 61, + 44, + 0, + 37, + 28, +-20, + 33, + 27, +-11, + 7, + 9, +-44, + 25, + 18, +-38, + 15, + 7, +-48, + 85, + 63, + 26, + 81, + 69, + 41, + 89, + 89, + 70, + 66, + 31, +-33, +123, +122, +123, +119, +119, +117, +123, +123, +123, +123, +123, +123, +122, +122, +122, +122, +122, +122, +120, +120, +118, +122, +122, +122, + 91, + 84, + 73, +-24, +-51, +-98, +106, +103, + 97, + 79, + 54, + 31, + 44, + 8, +-17, + 30, +-15, +-67, + 15, +-36, +-97, + 34, +-15, +-69, + 1, +-43, +-93, +-30, +-65, +-91, + 31, +-16, +-75, + 13, +-39, +-98, + 9, +-52, +-128, +-45, +-78, +-106, + 31, + 4, + -8, + 42, + 0, +-41, + 49, + 4, +-38, + 52, + 6, +-39, + 56, + 10, +-37, + 62, + 17, +-32, + 65, + 20, +-28, + 5, +-35, +-68, + 15, +-12, +-36, + -7, +-40, +-59, + 27, +-22, +-90, + 32, +-18, +-90, + 34, +-20, +-91, + 34, +-20, +-93, + 33, +-23, +-96, + 33, +-22, +-95, + 29, +-20, +-96, + 28, +-21, +-97, + 27, +-23, +-98, + 27, +-24, +-100, + 39, + 40, + 35, + 41, + 43, + 42, + 42, + 46, + 44, + 76, + 70, + 55, +104, + 88, + 64, + 2, + -5, +-23, +-41, +-50, +-49, + 20, + 5, + -2, + 27, + 9, + -5, + 33, + 12, + 1, + 30, + 8, + -3, + 31, + 7, + -3, + 29, + 6, + -3, + 24, + 4, + -6, + 35, + 3, +-35, + 67, + 25, +-68, + 21, +-19, +-69, + 35, +-16, +-66, + 28, +-21, +-69, + 33, +-14, +-70, + 32, +-15, +-75, + 32, +-16, +-76, + 29, +-15, +-79, + 28, +-18, +-81, + 25, +-19, +-83, + 23, +-17, +-66, +-58, +-92, +-100, + 68, + 54, + 18, + 90, + 80, + 44, + 94, + 88, + 57, + 99, + 92, + 72, + 97, + 94, + 73, +103, +101, + 87, + 95, + 91, + 70, +104, +101, + 85, +102, + 99, + 84, + 82, + 71, + 48, +101, + 95, + 75, + 83, + 46, +-11, + 55, + -3, +-69, + 27, + 10, +-43, + 32, +-11, +-58, + 38, + 14, +-41, + 47, + 33, +-13, + 41, + 26, +-41, + 13, + 8, +-51, +-45, +-27, +-98, +-44, +-26, +-100, +-29, +-19, +-88, + 1, + 2, +-56, + 55, + 8, +-67, + 77, + 67, + 38, + 50, + 56, + 25, + 55, + 24, +-40, +123, +123, +123, +119, +119, +118, +123, +123, +123, +123, +123, +123, +122, +122, +122, +123, +123, +123, +119, +119, +118, +123, +123, +123, + 96, + 89, + 78, +-18, +-47, +-93, +109, +106, + 99, + 74, + 46, + 17, + 34, + 2, +-21, + 30, +-10, +-48, + 14, +-36, +-88, + 31, +-11, +-53, + 5, +-35, +-74, +-23, +-61, +-89, + 32, +-14, +-66, + 13, +-35, +-86, + 7, +-51, +-126, +-49, +-77, +-93, + 52, + 32, + 20, + 40, + 1, +-36, + 43, + -1, +-40, + 43, + -3, +-46, + 44, + -2, +-47, + 49, + -1, +-47, + 52, + 2, +-47, + 4, +-37, +-73, + 15, +-18, +-44, +-19, +-66, +-109, + 26, +-24, +-93, + 29, +-21, +-93, + 29, +-21, +-95, + 30, +-24, +-98, + 29, +-26, +-100, + 29, +-26, +-100, + 26, +-25, +-100, + 24, +-26, +-102, + 26, +-28, +-103, + 23, +-28, +-105, + 33, + 33, + 26, + 33, + 35, + 32, + 43, + 44, + 43, + 49, + 54, + 43, + 54, + 58, + 29, + 74, + 51, + 7, +-80, +-91, +-105, + 56, + 36, + 20, + 58, + 36, + 21, + 59, + 38, + 24, + 64, + 40, + 26, + 65, + 41, + 25, + 65, + 40, + 24, + 65, + 41, + 20, + 48, + 17, + -8, + 10, +-44, +-116, + 4, +-38, +-84, + 25, +-14, +-59, + 22, +-19, +-66, + 30, +-18, +-79, + 31, +-17, +-79, + 30, +-18, +-79, + 30, +-18, +-80, + 28, +-20, +-81, + 30, + -8, +-59, + 32, + 0, +-40, + 73, + 61, + 22, + 86, + 74, + 34, + 74, + 63, + 19, + 87, + 76, + 45, +103, +101, + 87, +100, + 98, + 83, +101, + 99, + 84, + 86, + 82, + 63, + 95, + 88, + 65, + 98, + 93, + 61, +101, + 93, + 53, +102, + 97, + 51, +101, + 92, + 56, +106, +102, + 77, + 43, + 37, + 13, + 8, + -9, +-62, + 8, +-36, +-81, + 33, + 19, +-38, + 25, + 17, +-36, +-22, +-17, +-77, +-85, +-45, +-118, +-80, +-43, +-118, +-46, +-25, +-90, + 20, + 14, +-41, + 25, + 17, +-38, + 18, + 16, +-28, + 30, + 22, +-19, + 46, + 14, +-49, +109, +107, + 96, +120, +120, +119, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +119, +119, +119, +123, +123, +123, + 92, + 87, + 76, +-22, +-54, +-98, +109, +106, + 99, + 63, + 28, +-15, + 41, + 12, + -8, + 31, +-10, +-49, + 11, +-37, +-85, + 30, + -7, +-41, + 16, +-25, +-63, + 7, +-35, +-69, + 33, + -8, +-50, + 14, +-32, +-75, + 1, +-50, +-95, + -5, +-32, +-45, + 1, +-29, +-42, +-14, +-50, +-76, +-20, +-61, +-93, +-20, +-63, +-97, +-23, +-64, +-99, + -9, +-56, +-97, + -1, +-50, +-95, +-10, +-57, +-100, + 26, + -2, +-24, +-23, +-71, +-118, + 24, +-26, +-96, + 26, +-23, +-98, + 26, +-24, +-100, + 25, +-26, +-102, + 26, +-29, +-104, + 26, +-30, +-105, + 24, +-29, +-105, + 24, +-32, +-107, + 24, +-32, +-108, + 20, +-33, +-111, + 31, + 32, + 24, + 32, + 34, + 30, + 35, + 37, + 37, + 47, + 51, + 46, + 40, + 49, + 22, + 89, + 81, + 53, +-58, +-75, +-85, +-46, +-80, +-92, +-43, +-80, +-91, +-43, +-81, +-94, +-47, +-85, +-99, +-51, +-89, +-104, +-54, +-93, +-107, +-57, +-98, +-113, +-60, +-103, +-120, + 8, +-19, +-44, + 20, + -6, +-42, + 31, + 2, +-39, + 25, +-10, +-53, + 28, +-19, +-81, + 29, +-19, +-79, + 29, +-19, +-78, + 27, +-20, +-81, + 52, + 27, +-11, + 98, + 92, + 69, + 95, + 86, + 54, + 87, + 72, + 27, + 79, + 56, + -1, + 81, + 67, + 32, + 99, + 90, + 61, +102, + 98, + 81, +105, +102, + 82, +106, +105, + 88, + 99, + 97, + 78, +108, +106, + 90, + 99, + 95, + 71, + 97, + 89, + 48, +100, + 95, + 64, +104, + 99, + 57, + 97, + 90, + 40, + 95, + 89, + 58, + 28, +-11, +-39, + 0, +-21, +-70, + 20, + 4, +-49, +-28, +-20, +-84, + 14, + 2, +-59, + 43, + 25, +-19, +-19, +-14, +-70, +-18, +-12, +-73, + 9, + 4, +-55, + 38, + 23, +-29, + 27, + 12, +-34, +-15, +-37, +-79, + 34, + -5, +-53, + 83, + 66, + 34, +112, +112, +111, +116, +116, +116, +116, +116, +116, +115, +115, +115, +115, +115, +115, + 98, + 98, + 94, +106, +106, +106, + 61, + 58, + 50, +-42, +-77, +-114, +101, +100, + 96, + 50, + 6, +-44, + 37, + 6, +-16, + 29, +-17, +-69, + 12, +-39, +-95, + 22, +-20, +-61, + 19, +-25, +-67, + 13, +-26, +-52, + 62, + 48, + 44, + 78, + 73, + 85, + 81, + 80, + 95, + 69, + 63, + 71, + 64, + 51, + 49, + 66, + 47, + 35, + 63, + 40, + 26, + 50, + 30, + 16, + 53, + 31, + 18, + 57, + 38, + 24, + 66, + 48, + 33, + 29, + 5, +-11, + 37, + 9, +-14, + 9, +-40, +-85, + 23, +-27, +-102, + 23, +-26, +-102, + 25, +-28, +-103, + 24, +-32, +-107, + 22, +-34, +-111, + 20, +-32, +-106, + 25, +-25, +-77, + 22, +-19, +-62, + 14, +-27, +-60, + 10, +-28, +-67, + 25, + 27, + 17, + 29, + 31, + 27, + 23, + 27, + 28, + 35, + 39, + 40, + 40, + 49, + 33, + 76, + 72, + 49, + 25, + 25, + 4, +-108, +-125, +-125, +-103, +-125, +-126, +-100, +-125, +-126, +-101, +-122, +-125, +-94, +-121, +-126, +-95, +-112, +-118, +-93, +-113, +-118, +-74, +-100, +-110, + -4, +-26, +-52, +-15, +-42, +-70, + 20, + -7, +-42, + 15, +-24, +-61, + 26, +-21, +-83, + 26, +-22, +-84, + 26, +-22, +-84, + 45, + 12, +-29, + 84, + 68, + 31, + 97, + 85, + 55, + 97, + 91, + 73, + 79, + 61, + 7, + 57, + 38, +-10, + 97, + 89, + 56, + 95, + 89, + 66, + 99, + 93, + 71, +101, + 95, + 73, +109, +107, + 93, +104, + 99, + 78, +106, +102, + 76, + 97, + 94, + 72, + 57, + 50, + 11, + 92, + 86, + 51, +100, + 96, + 68, +105, + 97, + 62, +106, + 97, + 55, + 98, + 90, + 60, + 79, + 57, + 31, + 50, + 20, +-24, + 43, + 20, +-31, + 52, + 29, +-21, + 39, + 21, +-29, + 75, + 41, +-14, + 61, + 35, +-19, + 54, + 31, +-25, + 41, + 23, +-34, + 27, + 9, +-45, + 40, + 39, + 6, + 20, +-24, +-71, + 63, + 34, + 1, + 76, + 63, + 49, + 99, + 99, + 98, +101, +101, +102, +101, +101, +102, +100, +100, +101, + 97, + 97, + 96, +100, +100, + 98, + 59, + 58, + 58, +-63, +-103, +-124, + 90, + 87, + 85, + 36, +-22, +-89, + 36, + 5, +-19, + 26, +-26, +-85, + 16, +-40, +-114, + 20, +-29, +-90, + 18, +-29, +-80, + 19, +-12, +-35, + 85, + 65, + 55, + 92, + 79, + 82, + 88, + 82, + 90, + 86, + 79, + 80, + 87, + 76, + 73, + 87, + 74, + 69, + 87, + 72, + 65, + 87, + 72, + 65, + 91, + 75, + 66, + 92, + 75, + 60, + 91, + 71, + 54, + 43, + 18, + 3, + 27, + 9, +-13, + 26, + 9, +-11, + 2, +-19, +-46, +-15, +-33, +-52, +-12, +-28, +-49, +-19, +-31, +-50, +-26, +-36, +-53, +-34, +-42, +-61, +-36, +-49, +-71, +-44, +-57, +-76, +-38, +-50, +-71, +-49, +-63, +-88, + 12, + 17, + 7, + 15, + 18, + 13, + 20, + 24, + 17, + 29, + 31, + 27, + 44, + 49, + 42, + 47, + 54, + 28, + 88, + 77, + 57, +-12, + 4, +-11, + -6, + 9, + -5, + -7, + 9, + -5, +-12, + 5, +-11, + -9, + 9, + -9, +-14, + 5, +-11, +-11, + 8, + -9, + -6, + 11, + -5, + 1, + 14, + 2, + 42, + 48, + 41, +-34, +-52, +-64, + -1, +-39, +-73, + 24, +-24, +-86, + 24, +-24, +-86, + 30, +-14, +-68, + 85, + 69, + 31, + 95, + 81, + 47, +112, +108, + 93, + 95, + 91, + 69, + 27, + 14, +-28, + 65, + 47, + -2, + 82, + 64, + 18, + 94, + 86, + 60, + 99, + 92, + 71, + 95, + 86, + 57, + 98, + 94, + 74, +107, +105, + 93, + 96, + 95, + 74, + 95, + 92, + 72, + 71, + 68, + 41, + 47, + 40, + -7, + 54, + 53, + 27, + 79, + 76, + 46, +102, + 98, + 63, +107, +103, + 79, +101, + 96, + 70, + 64, + 27, +-15, + 65, + 4, +-29, + 65, + 2, +-31, + 82, + 25, +-30, + 81, + 30, +-34, + 60, + 28, +-33, + 42, + 23, +-37, + 30, + 16, +-42, + 36, + 25, +-26, + 56, + 54, + 27, + 41, + -8, +-66, + 43, + 8, +-28, + 46, + 13, +-24, + 45, + 25, + -3, + 49, + 33, + 9, + 46, + 30, + 8, + 43, + 29, + 8, + 48, + 37, + 17, + 48, + 39, + 20, + 20, + 15, + 5, +-75, +-117, +-125, + 66, + 54, + 48, + 31, +-20, +-78, + 41, + 17, + 0, + 24, +-26, +-81, + 16, +-38, +-106, + 20, +-28, +-81, + 17, +-29, +-77, + 58, + 37, + 22, +101, + 84, + 68, +107, + 93, + 81, +107, + 93, + 79, +107, + 93, + 79, +106, + 90, + 75, +104, + 86, + 68, +102, + 82, + 62, +101, + 77, + 49, +102, + 77, + 47, +102, + 75, + 43, +100, + 67, + 24, + 36, + 11, +-24, +-37, +-47, +-69, +-23, +-42, +-72, +-26, +-48, +-78, +-30, +-52, +-86, +-26, +-47, +-74, +-37, +-58, +-88, +-34, +-55, +-89, +-33, +-51, +-78, +-50, +-64, +-94, +-45, +-63, +-97, +-42, +-63, +-90, +-60, +-74, +-103, + 10, + 11, + -2, + 19, + 20, + 7, + 24, + 27, + 16, + 31, + 33, + 27, + 34, + 38, + 38, + 18, + 34, + 6, + 35, + 46, + 18, +-36, +-24, +-46, +-63, +-38, +-51, +-64, +-39, +-52, +-62, +-38, +-50, +-61, +-36, +-48, +-59, +-34, +-47, +-59, +-34, +-46, +-60, +-35, +-46, +-51, +-28, +-38, + 27, + 39, + 35, +-46, +-48, +-49, +-19, +-49, +-73, + 20, +-28, +-89, + 20, +-27, +-90, + 59, + 31, +-16, + 83, + 61, + 11, +100, + 90, + 66, +105, + 95, + 73, + 81, + 75, + 56, +-28, +-42, +-105, + 29, + 15, +-24, + 78, + 56, + 3, + 83, + 69, + 31, +102, + 97, + 77, +107, +104, + 87, +103, + 99, + 77, +102, +101, + 89, + 55, + 54, + 36, + 96, + 91, + 68, + 99, + 94, + 67, + 50, + 49, + 32, + 73, + 68, + 42, +101, + 94, + 60, +112, +109, + 91, +110, +106, + 81, +104, + 99, + 74, + 81, + 60, + 40, + 47, +-13, +-44, + 82, + 29, +-20, + 73, + 22, +-10, + 76, + 28, +-10, + 82, + 47, + 13, + 77, + 58, + 28, + 55, + 45, + 16, + 55, + 48, + 16, + 68, + 64, + 37, + 48, + 2, +-49, + 43, + 5, +-44, + 45, + 7, +-41, + 41, + 11, +-36, + 46, + 19, +-21, + 44, + 19, +-21, + 43, + 20, +-21, + 47, + 25, +-14, + 46, + 25, +-13, + 19, + 3, +-28, +-84, +-123, +-126, + 38, + 15, + -6, + 29, +-13, +-51, + 38, + 21, + 11, + 24, +-25, +-77, + 15, +-32, +-88, + 16, +-20, +-54, + 16, +-24, +-65, + 33, + -2, +-29, + 79, + 48, + 20, + 89, + 64, + 45, +101, + 81, + 62, + 93, + 74, + 56, + 98, + 78, + 60, + 96, + 71, + 49, + 89, + 55, + 24, + 85, + 48, + 6, + 84, + 45, + 2, + 78, + 33, +-15, + 73, + 24, +-29, + 42, + 13, +-28, +-44, +-54, +-77, +-27, +-52, +-83, +-35, +-57, +-91, +-35, +-56, +-93, +-42, +-63, +-99, +-34, +-58, +-95, +-47, +-66, +-102, +-46, +-66, +-101, +-51, +-68, +-102, +-54, +-74, +-111, +-56, +-73, +-108, +-63, +-80, +-115, + 1, + 2, +-13, + 11, + 11, + -1, + 19, + 19, + 5, + 20, + 22, + 17, + 20, + 23, + 18, + 26, + 36, + 18, + 40, + 48, + 25, + 10, + 9, +-23, +-66, +-41, +-54, +-65, +-40, +-52, +-64, +-40, +-51, +-64, +-40, +-50, +-60, +-36, +-47, +-60, +-36, +-47, +-58, +-34, +-44, +-49, +-27, +-36, + 19, + 32, + 28, +-19, +-18, +-20, +-18, +-47, +-73, + 47, + 5, +-37, + 46, + 4, +-39, + 68, + 40, + -8, + 81, + 59, + 10, + 99, + 87, + 61, + 91, + 81, + 50, + 23, + 5, +-50, +-83, +-85, +-121, +-27, +-33, +-58, + 91, + 76, + 43, + 95, + 88, + 61, +102, + 97, + 74, + 96, + 91, + 69, +104, + 99, + 79, +102, + 98, + 78, + 98, + 93, + 73, +104, + 98, + 74, + 99, + 94, + 72, +107, +104, + 87, + 50, + 41, + 1, +103, + 93, + 52, +107, +102, + 70, +107, +102, + 79, +107, +104, + 83, + 60, + 62, + 38, + 69, + 72, + 51, + 86, + 90, + 72, + 63, + 72, + 48, + 81, + 86, + 66, + 97, + 98, + 82, + 85, + 88, + 71, + 51, + 59, + 32, + 52, + 57, + 30, + 49, + 45, + 6, + 64, + 54, + 17, + 54, + 23, +-19, + 57, + 25, +-18, + 53, + 33, + 3, + 64, + 49, + 30, + 63, + 52, + 33, + 64, + 54, + 35, + 67, + 58, + 41, + 65, + 57, + 44, + 33, + 28, + 20, +-89, +-123, +-126, + 43, + 25, + 10, + 23, +-19, +-56, + 45, + 31, + 26, + 19, +-30, +-93, + 14, +-34, +-94, + 18, +-17, +-51, + 14, +-24, +-63, +-12, +-56, +-86, + 35, +-10, +-37, + 54, + 8, +-22, + 33, + -8, +-35, + 22, +-13, +-35, + 18, + -9, +-29, + 10, +-21, +-43, + 23, + -8, +-34, + 25, +-10, +-40, + 29, + -8, +-47, + 21, +-17, +-58, + 17, +-25, +-68, +-10, +-40, +-64, +-44, +-50, +-73, +-55, +-67, +-102, +-43, +-66, +-100, +-45, +-65, +-104, +-53, +-69, +-106, +-48, +-70, +-109, +-49, +-70, +-110, +-58, +-73, +-113, +-58, +-75, +-114, +-59, +-78, +-115, +-63, +-80, +-118, +-17, +-21, +-29, +-17, +-15, +-30, +-12, +-11, +-26, + -2, + -1, +-16, + 8, + 10, + 1, + 15, + 17, + 10, + 22, + 30, + 20, + 32, + 40, + 19, + 34, + 24, +-15, + 7, + -3, +-35, +-69, +-46, +-56, +-68, +-46, +-55, +-69, +-46, +-55, +-67, +-44, +-54, +-63, +-41, +-50, +-60, +-37, +-47, +-55, +-32, +-42, + 8, + 24, + 19, + -9, +-12, +-17, + -5, +-50, +-78, + 16, +-25, +-58, + 17, +-25, +-58, + 27, +-11, +-50, + 72, + 45, +-15, + 89, + 77, + 52, + 93, + 88, + 66, + 3, +-10, +-44, +-61, +-63, +-91, + 64, + 46, + -4, + 75, + 54, + 5, + 80, + 65, + 32, + 97, + 92, + 73, +104, +102, + 87, + 89, + 79, + 50, + 92, + 84, + 55, + 97, + 88, + 59, + 98, + 94, + 75, +107, +104, + 88, +107, +104, + 89, + 30, + 22, + -7, + 93, + 83, + 46, +105, + 99, + 75, +108, +102, + 74, +100, + 96, + 74, + 40, + 9, +-32, + 41, + -6, +-62, + 92, + 81, + 54, + 66, + 58, + 30, + 44, + 47, + 14, + 56, + 57, + 19, + 61, + 58, + 18, + 76, + 70, + 36, + 73, + 68, + 35, + 76, + 72, + 44, + 70, + 61, + 30, + 52, + 20, +-27, + 62, + 28, +-14, + 61, + 42, + 17, + 71, + 59, + 43, + 69, + 57, + 41, + 66, + 53, + 38, + 67, + 55, + 39, + 58, + 46, + 30, + 27, + 18, + 3, +-92, +-124, +-126, + 23, +-11, +-46, + 20, +-30, +-86, + 51, + 33, + 24, + 13, +-42, +-128, + 13, +-40, +-112, + 16, +-31, +-92, + 9, +-36, +-87, +-28, +-72, +-106, + 23, +-21, +-66, + 4, +-43, +-91, + -7, +-60, +-99, +-20, +-59, +-84, + 1, +-40, +-66, + -1, +-40, +-78, + 4, +-26, +-50, + -7, +-18, +-39, + 6, + 1, +-22, + 1, + 0, +-21, + 2, + 1, +-23, + 0, + 2, +-23, + -3, + 1, +-21, + 2, + 4, +-16, + -2, + 0, +-21, +-12, +-10, +-31, +-28, +-28, +-50, +-35, +-35, +-58, +-47, +-48, +-75, +-52, +-57, +-86, +-62, +-70, +-102, +-63, +-74, +-110, + 37, + 40, + 36, + 34, + 32, + 14, +-30, +-31, +-53, +-35, +-32, +-49, +-32, +-28, +-40, +-32, +-26, +-32, +-27, +-20, +-24, + -5, + 1, + -5, + 9, + 15, + 9, + 30, + 30, + 4, + 44, + 39, + 14, + 17, + 26, + 11, + 20, + 29, + 14, + 20, + 29, + 16, + 14, + 25, + 14, + 4, + 16, + 5, +-12, + 2, + -8, +-51, +-31, +-40, + 2, + 18, + 12, + -8, +-12, +-16, + -5, +-51, +-79, + 12, +-30, +-63, + 10, +-29, +-64, + 34, + 2, +-41, + 59, + 28, +-28, + 73, + 54, + 15, + 91, + 85, + 66, + 36, + 20, +-15, + 23, + 10, +-33, + 40, + 20, +-41, + 68, + 48, + -3, + 74, + 55, + 16, + 78, + 66, + 40, + 82, + 75, + 56, + 77, + 64, + 37, + 83, + 68, + 31, + 87, + 78, + 43, + 95, + 88, + 65, +108, +105, + 84, + 99, + 95, + 77, + 50, + 47, + 33, + 79, + 67, + 33, + 95, + 87, + 55, +100, + 93, + 60, + 76, + 70, + 44, + 4, +-23, +-53, + 40, + 13, +-16, + 50, + 41, + 31, + 71, + 59, + 38, + 41, + 37, + -6, + 18, + 22, +-19, + 36, + 35, +-17, + 64, + 52, + 8, + 64, + 53, + 18, + 77, + 48, + 17, + 80, + 59, + 30, + 78, + 52, + 25, + 70, + 42, + 7, + 53, + 30, + 2, + 65, + 51, + 32, + 65, + 51, + 33, + 62, + 48, + 31, + 68, + 55, + 39, + 44, + 30, + 13, + 11, + 0, +-13, +-95, +-124, +-125, + 22, +-23, +-75, + 26, +-25, +-77, + 47, + 32, + 29, + 10, +-45, +-127, + 12, +-41, +-112, + 25, +-26, +-91, + 11, +-36, +-88, +-21, +-69, +-104, + 12, +-35, +-84, + 15, +-34, +-95, +-20, +-74, +-120, +-47, +-91, +-125, + -7, +-60, +-118, + 10, +-31, +-79, + 33, + 17, + 1, + 31, + 33, + 30, + 44, + 45, + 46, + 6, + 8, + 3, + -5, + -2, +-16, +-13, +-11, +-31, +-12, +-11, +-32, +-17, +-16, +-38, +-19, +-18, +-38, +-21, +-19, +-38, +-37, +-34, +-56, +-44, +-43, +-65, +-50, +-51, +-78, +-48, +-51, +-80, +-56, +-62, +-93, + -5, + -6, +-12, + 51, + 49, + 39, + -3, + -7, +-30, +-71, +-64, +-72, +-79, +-71, +-77, +-75, +-66, +-76, +-58, +-49, +-60, +-37, +-28, +-38, +-11, + -2, +-15, + 12, + 23, + 8, + 36, + 46, + 28, + 46, + 54, + 37, + 53, + 60, + 43, + 56, + 63, + 47, + 57, + 66, + 50, + 59, + 69, + 59, + 62, + 72, + 64, + 62, + 72, + 64, + 55, + 65, + 59, + 38, + 51, + 45, +-14, +-17, +-20, +-23, +-67, +-92, + -7, +-46, +-77, + -7, +-44, +-77, + 2, +-32, +-64, + 14, +-15, +-57, + 29, + 7, +-29, + 40, + 19, +-21, + 0, +-32, +-68, +-58, +-69, +-87, + 56, + 38, +-14, + 97, + 91, + 63, + 86, + 81, + 51, + 31, + 24, +-12, +-46, +-46, +-76, + 49, + 42, + 17, + 89, + 75, + 44, + 95, + 90, + 68, +103, +100, + 87, + 97, + 93, + 70, + 88, + 86, + 69, +-14, +-16, +-24, + 19, + 12, +-13, + 63, + 59, + 37, + 72, + 69, + 52, + -4, + -9, +-18, +-98, +-114, +-120, +-72, +-81, +-79, +-13, +-28, +-27, + 51, + 18, + -4, + 7, + 9, +-35, + 23, + 25, +-27, + 32, + 32, +-19, + 55, + 45, + -2, + 4, + 2, +-28, + 71, + 45, + 23, + 55, +-21, +-45, + 17, +-17, +-41, + 21, + -1, +-40, + 21, + 9, + -2, + 28, + 18, + 12, + 1, + -6, + -8, + 12, + 0, + -9, + -2, +-23, +-41, + 17, + -6, +-26, + 8, +-11, +-30, +-101, +-124, +-124, + 18, +-29, +-80, + 30, + -7, +-38, + 39, + 20, + 18, + 8, +-45, +-125, + 12, +-36, +-88, + 13, +-30, +-72, + 2, +-41, +-80, +-21, +-69, +-107, + -1, +-45, +-79, + 22, +-22, +-68, +-37, +-88, +-127, +-48, +-92, +-121, +-14, +-61, +-116, + 5, +-35, +-80, + 29, + 19, + 10, + 33, + 34, + 36, + 62, + 63, + 67, + 21, + 23, + 20, + 16, + 17, + 6, + 17, + 15, + -1, + 0, + 3, +-12, + 1, + 1, +-16, + -8, + -5, +-26, +-11, + -9, +-30, +-17, +-18, +-41, +-35, +-37, +-63, +-48, +-53, +-83, +-56, +-65, +-95, +-52, +-61, +-91, + 17, + 13, + 10, + 11, + 10, + -2, + -2, +-10, +-29, +-25, +-16, +-40, +-11, + -1, +-28, + 1, + 13, +-15, + 10, + 22, + -4, + 16, + 27, + 2, + 20, + 30, + 4, + 22, + 33, + 10, + 29, + 39, + 18, + 27, + 39, + 19, + 35, + 45, + 27, + 49, + 58, + 41, + 54, + 65, + 48, + 58, + 69, + 58, + 53, + 64, + 56, + 53, + 62, + 57, + 58, + 67, + 62, + 59, + 66, + 61, +-12, +-16, +-19, +-50, +-97, +-123, +-57, +-101, +-126, +-61, +-106, +-125, +-61, +-105, +-126, +-57, +-102, +-126, +-55, +-94, +-112, +-46, +-76, +-92, +-61, +-103, +-121, +-20, +-64, +-105, + 42, + 30, + -8, + 78, + 64, + 16, + 79, + 67, + 20, + 18, + 1, +-59, +-109, +-95, +-118, + -9, +-15, +-51, + 37, + 17, +-23, + 54, + 39, + 8, + 58, + 53, + 37, + 42, + 38, + 19, + 30, + 30, + 23, +-72, +-76, +-84, +-101, +-82, +-117, +-97, +-87, +-123, +-63, +-104, +-108, +-52, +-93, +-98, +-55, +-96, +-94, +-54, +-87, +-83, +-32, +-52, +-50, + -9, +-42, +-55, + 11, + 11, +-10, + 2, + 6, +-12, + 31, + 29, + 10, + 38, + 33, + 4, + 38, + 31, + -7, + 50, + 26, +-18, + 72, + 38, + -5, +-74, +-37, +-80, +-18, + -5, +-42, +-50, +-95, +-120, +-53, +-97, +-120, +-58, +-100, +-121, +-51, +-88, +-99, +-23, +-41, +-43, +-35, +-57, +-56, +-52, +-74, +-72, +-99, +-117, +-117, + 6, +-37, +-83, + 15, +-18, +-48, + 25, + -6, +-19, + 3, +-51, +-127, + 15, +-32, +-85, + 27, +-14, +-63, + -3, +-43, +-83, +-25, +-70, +-108, +-32, +-69, +-91, + 13, +-28, +-70, +-46, +-82, +-104, +-50, +-92, +-120, +-15, +-62, +-114, +-60, +-103, +-124, + 10, + 6, + -2, + 28, + 29, + 23, + 78, + 79, + 81, + 43, + 44, + 41, + 36, + 39, + 25, + 9, + 14, + 2, + 6, + 5, +-10, + 4, + 7, + -6, + 27, + 27, + 17, + 2, + 4, + -2, +-15, +-13, +-30, +-16, +-23, +-49, +-39, +-51, +-82, +-48, +-60, +-88, +-68, +-77, +-98, +-45, +-47, +-52, +-27, +-30, +-42, +-49, +-57, +-75, + -2, + 8, +-22, + 2, + 12, +-21, + 8, + 18, +-16, + 12, + 22, +-12, + 16, + 26, + -7, + 20, + 31, + -2, + 22, + 33, + 1, + 28, + 38, + 8, + 34, + 44, + 14, + 37, + 45, + 21, + 34, + 46, + 23, + 43, + 55, + 37, + 39, + 53, + 41, + 47, + 58, + 51, + 60, + 68, + 64, + 59, + 65, + 61, + 59, + 64, + 60, +-12, +-14, +-19, +-31, +-76, +-114, +-12, +-61, +-116, + -5, +-56, +-112, +-13, +-61, +-114, + -1, +-45, +-89, + 3, +-40, +-80, + 2, +-37, +-77, + -1, +-40, +-79, +-29, +-67, +-97, +-11, +-21, +-54, + 67, + 49, + -2, + 56, + 43, + 0, + 66, + 50, + 1, + 72, + 64, + 26, + 76, + 69, + 27, + 55, + 53, + 31, +-76, +-63, +-98, +-32, + -7, +-89, +-76, +-54, +-113, +-107, +-82, +-117, +-68, +-67, +-69, +-98, +-76, +-116, +-48, +-47, +-50, +-20, +-25, +-21, +-41, +-51, +-51, +-16, +-25, +-22, +-32, +-42, +-38, +-48, +-63, +-61, +-53, +-65, +-68, + 59, + 57, + 57, + 74, + 73, + 76, + 97, + 97, + 99, + 59, + 56, + 52, + 6, + -6, +-19, + 1, +-19, +-71, + 26, + -7, +-60, + -2, +-14, +-43, + 35, + 24, + 5, +106, +106, +106, +104, +105, +106, +103, +103, +104, +100, +100, +102, + 94, + 95, +100, + 85, + 87, + 93, + 71, + 74, + 83, +-60, +-61, +-60, + 75, + 77, + 86, + 68, + 72, + 80, + 63, + 67, + 76, + 59, + 60, + 71, + 53, + 56, + 64, + 40, + 43, + 52, + 19, + 12, + 17, +-18, +-56, +-81, + 17, + 7, + 5, + 19, + 4, + 3, + 16, + 1, + -6, +-22, +-43, +-56, +-10, +-48, +-79, + -2, +-40, +-76, +-10, +-41, +-82, + 9, + 5, + -7, + 67, + 69, + 69, + 57, + 59, + 57, + 45, + 47, + 43, + 47, + 46, + 37, + 19, + 19, + 9, + 17, + 21, + 12, + 24, + 21, + 8, + 39, + 39, + 30, + 1, + -6, +-26, +-47, +-64, +-97, +-36, +-55, +-89, +-52, +-64, +-92, +-54, +-70, +-99, +-63, +-70, +-94, +-69, +-81, +-114, +-90, +-103, +-122, + 6, + 16, +-17, + 12, + 22, +-11, + 15, + 25, + -9, + 19, + 28, + -8, + 25, + 33, + -2, + 26, + 35, + 0, + 27, + 37, + 3, + 28, + 37, + 5, + 28, + 37, + 4, + 30, + 39, + 11, + 28, + 38, + 13, + 16, + 29, + 10, + 43, + 52, + 42, + 51, + 60, + 52, + 57, + 63, + 57, + 56, + 61, + 57, + 50, + 55, + 51, +-19, +-19, +-23, + 21, + -7, +-39, + 53, + 19, +-20, + 44, + 2, +-32, + 41, + 7, +-27, + 46, + 21, + -7, + 57, + 27, + 6, + 60, + 35, + 11, + 35, + 7, +-16, +-20, +-45, +-72, +-31, +-53, +-95, + 5, + -5, +-36, + 59, + 49, + 18, + 57, + 51, + 19, + 60, + 52, + 23, + 36, + 35, + 21, + 2, + 4, + -3, +-99, +-86, +-114, +-36, +-15, +-78, +-26, + -2, +-86, +-38, +-28, +-48, + 32, + 31, + 32, + 46, + 45, + 46, + 48, + 47, + 47, + 53, + 51, + 52, + 57, + 55, + 56, + 58, + 57, + 57, + 62, + 61, + 61, + 58, + 57, + 58, + 68, + 67, + 67, + 70, + 66, + 59, + 91, + 90, + 84, +105, +104, + 99, + 49, + 46, + 36, +-11, +-23, +-28, +-65, +-92, +-120, +-62, +-83, +-117, +-11, +-42, +-84, + 63, + 38, + 19, + 91, + 90, + 95, + 86, + 85, + 91, + 93, + 92, + 98, + 96, + 95, +102, + 99, +100, +106, +100, +101, +109, + 99, +100, +108, +-28, +-28, +-28, + 95, +100, +110, + 87, + 92, +106, + 81, + 87, +102, + 82, + 87, +102, + 78, + 83, + 98, + 78, + 82, + 97, + 52, + 52, + 58, + -6, +-31, +-40, + 72, + 76, + 89, + 64, + 66, + 81, + 61, + 64, + 78, + 50, + 52, + 66, + 42, + 42, + 54, + 38, + 35, + 43, + 26, + 23, + 22, + 4, + 5, + 4, +-27, +-26, +-29, + 23, + 23, + 20, + 50, + 51, + 49, + 56, + 57, + 54, + 41, + 42, + 39, + 44, + 46, + 40, + 39, + 40, + 33, + 35, + 34, + 25, +-21, +-36, +-66, +-39, +-60, +-97, +-49, +-66, +-99, +-51, +-68, +-104, +-58, +-74, +-109, +-77, +-90, +-118, +-85, +-95, +-122, +-68, +-87, +-118, + 16, + 25, + -4, + 15, + 24, + -5, + 19, + 28, + -4, + 23, + 31, + -2, + 25, + 33, + -1, + 33, + 41, + 7, + 32, + 41, + 8, + 30, + 40, + 8, + 35, + 43, + 14, + 18, + 27, + 0, + 8, + 18, + -4, + 27, + 36, + 18, + 47, + 54, + 44, + 48, + 54, + 47, + 55, + 61, + 55, + 27, + 33, + 29, + 10, + 19, + 14, +-23, +-24, +-27, + 47, + 22, + 0, + 79, + 50, + 28, + 72, + 49, + 27, + 68, + 49, + 24, + 88, + 60, + 27, + 88, + 59, + 30, + 47, + 18, +-14, +-32, +-55, +-81, +-38, +-60, +-106, +-34, +-56, +-98, +-31, +-53, +-97, +-17, +-32, +-55, + -7, +-11, +-18, +-15, +-14, +-18, +-100, +-100, +-123, +-61, +-56, +-75, +-23, +-22, +-40, +-78, +-65, +-118, +-53, +-48, +-70, + 0, + 2, + -1, + 51, + 51, + 52, + 61, + 61, + 63, + 56, + 56, + 58, + 58, + 58, + 61, + 61, + 61, + 63, + 65, + 65, + 66, + 68, + 68, + 70, + 46, + 46, + 47, + 73, + 73, + 72, + 68, + 63, + 50, +107, +104, + 96, + 92, + 90, + 80, + 65, + 62, + 55, +-39, +-44, +-74, +-36, +-27, +-80, + 26, + 10, +-36, + 79, + 30, +-10, + 71, + 40, + 29, + 98, + 94, +101, + 92, + 90, + 98, + 95, + 93, +103, + 95, + 95, +103, + 90, + 89, + 98, + 97, + 96, +103, + 87, + 85, + 95, + 39, + 37, + 43, + 58, + 52, + 56, + 80, + 77, + 86, + 81, + 81, + 93, + 75, + 75, + 88, + 78, + 77, + 92, + 81, + 81, + 95, + 58, + 57, + 65, + 20, + 10, + 14, + 48, + 50, + 65, + 68, + 68, + 90, + 60, + 63, + 85, + 54, + 56, + 77, + 63, + 64, + 82, + 60, + 62, + 75, + 55, + 55, + 61, + 19, + 22, + 16, + -9, + -8, +-17, +-65, +-69, +-81, +-59, +-61, +-71, +-16, +-17, +-21, + 32, + 33, + 32, + 50, + 48, + 45, + 59, + 59, + 57, + 27, + 26, + 17, +-28, +-45, +-77, +-49, +-61, +-93, +-51, +-65, +-99, +-56, +-70, +-104, +-36, +-42, +-63, + 6, + 5, + -9, + 20, + 21, + 4, + 11, + 11, + -5, + 31, + 40, + 20, + 32, + 40, + 17, + 33, + 40, + 14, + 39, + 46, + 20, + 39, + 46, + 18, + 36, + 44, + 16, + 36, + 44, + 17, + 23, + 32, + 6, + 5, + 13, +-11, + 14, + 22, + -2, + 20, + 27, + 4, + 30, + 35, + 17, + 41, + 47, + 34, + 38, + 44, + 37, + 5, + 12, + 7, + 34, + 40, + 36, + 30, + 39, + 33, +-18, +-21, +-24, + 59, + 43, + 31, + 79, + 70, + 57, + 75, + 70, + 59, + 93, + 85, + 75, + 99, + 83, + 68, + 47, + 33, + 18, +-34, +-57, +-84, +-43, +-65, +-111, +-41, +-63, +-111, +-40, +-63, +-105, +-37, +-59, +-106, +-40, +-62, +-110, + 28, + 25, + 23, +-78, +-79, +-116, +-73, +-63, +-118, +-44, +-41, +-68, +-27, +-30, +-45, +-51, +-46, +-78, +-40, +-47, +-58, +-53, +-59, +-53, +-49, +-55, +-49, +-38, +-46, +-39, +-44, +-50, +-46, +-39, +-47, +-42, +-35, +-43, +-38, +-35, +-42, +-38, +-32, +-39, +-37, +-40, +-47, +-47, + -2, + -8, +-10, + 88, + 82, + 68, +107, +103, + 91, + 85, + 80, + 65, + 49, + 43, + 34, + -8, +-35, +-62, + 19, + -1, +-34, + 30, + 14, +-18, + 47, + 16, +-21, + 65, + 50, + 40, +109, +108, +109, +109, +109, +110, +102, +101, +102, +103, +102, +103, +104, +103, +105, +104, +104, +105, + 99, + 98, +101, + 93, + 91, + 97, + 87, + 86, + 92, + 79, + 77, + 85, + 80, + 80, + 91, + 77, + 76, + 86, + 79, + 78, + 86, + 79, + 78, + 83, + 82, + 81, + 87, + 89, + 87, + 93, + 79, + 78, + 84, + 70, + 65, + 68, + 64, + 53, + 51, + 72, + 68, + 73, + 78, + 74, + 74, + 76, + 71, + 74, + 83, + 79, + 78, + 2, + 3, + -8, + 24, + 27, + 15, + 9, + 10, + 4, +-19, +-18, +-27, +-45, +-44, +-53, +-79, +-78, +-88, +-57, +-59, +-66, +-14, +-14, +-15, + 9, + 8, + 2, +-40, +-56, +-89, + -9, +-12, +-32, + 20, + 20, + 3, + 42, + 43, + 22, + 55, + 57, + 37, + 60, + 59, + 42, + 62, + 61, + 41, + 63, + 62, + 42, + 46, + 55, + 40, + 48, + 56, + 42, + 44, + 53, + 35, + 43, + 52, + 33, + 43, + 52, + 31, + 37, + 46, + 24, + 15, + 26, + 4, + 17, + 24, + 2, + 19, + 26, + 1, + 14, + 20, + -2, + 25, + 30, + 8, + 29, + 33, + 18, + 18, + 25, + 13, + 8, + 17, + 11, + 48, + 53, + 48, + 54, + 59, + 55, + 27, + 36, + 31, + 10, + 14, + 8, + 50, + 43, + 36, + 88, + 84, + 77, + 90, + 82, + 73, + 92, + 81, + 68, + 38, + 27, + 22, +-41, +-65, +-94, +-46, +-69, +-110, +-44, +-67, +-108, +-44, +-67, +-108, +-42, +-65, +-106, +-43, +-65, +-111, +-48, +-71, +-119, +-42, +-48, +-55, +-86, +-88, +-105, +-59, +-59, +-63, +-28, +-24, +-37, +-18, +-19, +-35, +-29, +-35, +-58, +-89, +-94, +-107, +-100, +-108, +-112, +-86, +-98, +-102, +-78, +-90, +-95, +-75, +-90, +-95, +-72, +-87, +-92, +-68, +-83, +-88, +-67, +-79, +-85, +-67, +-79, +-84, +-62, +-73, +-79, + -8, +-16, +-27, + 83, + 74, + 57, +102, + 97, + 84, + 74, + 65, + 51, + 40, + 31, + 19, + 26, + -8, +-39, + 46, + 7, +-29, + 41, + 0, +-39, + 52, + 12, +-33, + 80, + 58, + 41, +110, +106, +104, +104, +102, + 99, +101, + 98, + 97, + 99, + 97, + 95, +103, +102, +102, +106, +103, +103, +103, +102, +102, + 99, + 98, + 98, + 98, + 96, + 99, + 91, + 90, + 96, + 90, + 89, + 97, + 85, + 83, + 91, + 84, + 82, + 87, + 90, + 88, + 92, + 90, + 86, + 85, + 90, + 87, + 90, + 92, + 89, + 90, + 86, + 82, + 83, + 87, + 82, + 80, + 86, + 80, + 74, + 92, + 81, + 72, + 93, + 81, + 73, +102, + 96, + 94, + 16, + 18, + 9, + 14, + 16, + 1, + 7, + 9, + -2, + 7, + 10, + 2, + 32, + 34, + 30, + 11, + 15, + 11, +-21, +-20, +-27, +-54, +-53, +-66, +-30, +-30, +-40, + 45, + 47, + 31, + 53, + 55, + 40, + 46, + 49, + 28, + 44, + 47, + 25, + 58, + 55, + 36, + 73, + 63, + 40, + 69, + 60, + 36, + 70, + 61, + 38, + 47, + 60, + 48, + 50, + 62, + 53, + 50, + 62, + 53, + 42, + 55, + 43, + 21, + 35, + 20, + 13, + 25, + 8, + 16, + 25, + 8, + 20, + 27, + 6, + 28, + 34, + 11, + 14, + 19, + -3, + 29, + 32, + 12, + -3, + 4, + -9, + 15, + 22, + 15, + 49, + 55, + 48, + 49, + 54, + 49, + 33, + 41, + 36, + 38, + 45, + 41, + 42, + 48, + 41, + 57, + 44, + 28, + 99, + 80, + 59, + 97, + 82, + 66, + 37, + 21, + 8, +-41, +-67, +-91, +-43, +-66, +-106, +-43, +-66, +-106, +-47, +-69, +-110, +-47, +-70, +-111, +-47, +-70, +-112, +-51, +-75, +-118, +-53, +-78, +-121, +-76, +-92, +-113, +-116, +-121, +-123, +-120, +-121, +-124, +-114, +-119, +-124, +-61, +-64, +-58, +-110, +-118, +-125, +-111, +-119, +-125, +-106, +-114, +-124, +-90, +-104, +-121, +-82, +-97, +-112, +-75, +-92, +-109, +-70, +-86, +-104, +-67, +-81, +-98, +-65, +-78, +-91, +-60, +-73, +-86, +-47, +-61, +-73, + -1, +-14, +-32, + 55, + 44, + 26, + 82, + 74, + 58, + 51, + 39, + 22, + 39, + 28, + 16, + 89, + 83, + 76, +112, +108, +102, + 28, + -6, +-25, + 24, +-18, +-55, + 70, + 48, + 32, +112, +109, +110, +104, +103, +104, +107, +105, +105, +112, +111, +111, +105, +104, +105, +103, + 98, +101, +105, +103, +103, +102, +101, +100, + 96, + 95, + 94, + 96, + 93, + 92, + 90, + 84, + 83, + 92, + 87, + 86, + 95, + 92, + 89, + 90, + 82, + 76, + 91, + 84, + 78, + 95, + 90, + 89, + 96, + 94, + 94, + 95, + 92, + 97, + 93, + 91, + 95, + 98, + 94, + 98, + 94, + 88, + 92, + 96, + 93, + 95, + 98, + 87, + 84, + 9, + 11, + 1, + 1, + 2, +-14, + 1, + 3, + -9, + -3, + -1, +-14, + 38, + 39, + 36, + 46, + 47, + 45, + 32, + 34, + 30, + 16, + 19, + 11, + 56, + 58, + 44, + 47, + 49, + 34, + 37, + 40, + 20, + 45, + 47, + 26, + 40, + 44, + 25, + 53, + 50, + 31, + 59, + 45, + 17, + 52, + 46, + 23, + 52, + 39, + 9, + 55, + 22, +-13, + 40, + 36, + 23, + 39, + 50, + 42, + 38, + 49, + 42, + 34, + 47, + 37, + 23, + 33, + 17, + 19, + 27, + 9, + 26, + 30, + 14, + 26, + 31, + 11, + 14, + 20, + -2, +-15, + -7, +-23, + 23, + 30, + 20, + 46, + 52, + 45, + 46, + 53, + 48, + 26, + 36, + 29, + 42, + 48, + 42, + 46, + 51, + 46, + 40, + 45, + 39, + 62, + 53, + 41, + 94, + 75, + 53, + 59, + 41, + 23, +-24, +-61, +-97, +-70, +-89, +-112, +-69, +-87, +-112, +-75, +-91, +-114, +-75, +-92, +-115, +-79, +-96, +-117, +-82, +-98, +-119, +-90, +-105, +-121, +-91, +-106, +-122, +-98, +-111, +-122, +-109, +-119, +-124, +-108, +-118, +-123, +-106, +-116, +-124, +-97, +-104, +-110, +-104, +-115, +-123, +-100, +-113, +-122, +-98, +-110, +-121, +-92, +-107, +-119, +-88, +-104, +-117, +-85, +-99, +-114, +-83, +-98, +-113, +-79, +-92, +-109, +-74, +-87, +-102, +-71, +-83, +-95, +-64, +-76, +-87, +-41, +-53, +-64, +-25, +-35, +-46, +-10, +-19, +-31, + 8, +-29, +-47, +-14, +-35, +-48, +100, +100, + 99, +116, +113, +110, + 1, +-41, +-70, + 21, + -5, +-22, + 65, + 50, + 39, +111, +108, +106, +105, +101, + 96, +109, +108, +107, +110, +107, +105, +109, +107, +106, +106, +104, +102, +106, +104, +102, +102, +100, + 99, + 97, + 94, + 90, + 92, + 87, + 84, + 92, + 88, + 86, + 99, + 98, +100, + 99, + 98, +102, + 92, + 88, + 88, + 92, + 89, + 87, + 90, + 86, + 82, + 94, + 92, + 90, + 98, + 95, + 96, + 93, + 89, + 90, + 99, + 94, + 96, +100, + 93, + 94, + 98, + 92, + 92, + 78, + 75, + 75, +-24, +-40, +-64, + -2, + -5, +-21, + 8, + 10, + -5, +-16, +-18, +-40, + 16, + 18, + 12, + 40, + 41, + 39, + 41, + 42, + 38, + 37, + 40, + 25, + 53, + 56, + 38, + 50, + 52, + 36, + 20, + 22, + 1, + 3, + 5, +-21, + 14, + 2, +-27, + 15, + 6, +-23, + 35, + 16, +-20, + 27, + 12, +-22, + 37, + 14, +-24, + 26, + -6, +-40, + 49, + 15, +-26, + 51, + 15, +-26, + 56, + 29, + -3, + 40, + 23, + -1, + 19, + 11, +-11, + 21, + 24, + 3, + 28, + 32, + 15, + -3, + 5, +-10, +-11, + 0, +-12, + 32, + 38, + 24, + 44, + 49, + 39, + 43, + 49, + 44, + 26, + 36, + 29, + 43, + 47, + 41, + 45, + 49, + 44, + 43, + 48, + 43, + 40, + 45, + 39, + 63, + 61, + 53, + 89, + 85, + 80, + 31, + 5, +-12, + 6, +-37, +-80, +-92, +-107, +-121, +-91, +-106, +-120, +-93, +-107, +-120, +-92, +-108, +-121, +-98, +-113, +-122, +-100, +-115, +-124, +-101, +-116, +-123, +-102, +-116, +-124, +-101, +-115, +-123, +-101, +-114, +-122, +-101, +-112, +-121, +-93, +-107, +-117, +-90, +-104, +-114, +-92, +-106, +-116, +-92, +-106, +-116, +-90, +-104, +-114, +-91, +-105, +-115, +-89, +-102, +-112, +-92, +-103, +-113, +-96, +-108, +-118, +-96, +-108, +-118, +-92, +-104, +-111, +-87, +-96, +-102, +-90, +-98, +-105, +-93, +-103, +-108, +-86, +-98, +-104, +-84, +-98, +-105, + 44, + -1, +-68, +-18, +-55, +-77, +115, +114, +114, +110, +110, +110, + 6, +-32, +-52, + 12, +-21, +-47, + 80, + 72, + 65, +110, +105, +103, +111, +110, +107, +105, +101, + 96, +105, +103, + 97, +103, +101, + 98, +100, + 95, + 90, +108, +106, +105, +103, + 99, + 98, +103, +100, +101, + 99, + 97, +101, + 90, + 89, + 94, + 88, + 87, + 91, + 88, + 86, + 90, + 85, + 84, + 89, + 85, + 81, + 86, + 97, + 95, +100, + 96, + 90, + 90, + 95, + 90, + 88, +100, + 96, + 95, + 96, + 88, + 82, +100, + 94, + 88, +103, + 96, + 91, + 67, + 59, + 54, +-38, +-59, +-96, +-35, +-58, +-94, +-22, +-34, +-54, +-26, +-30, +-53, + 10, + 12, + -2, + 22, + 24, + 17, + 32, + 35, + 24, + 55, + 58, + 42, + 44, + 46, + 29, + 19, + 20, + -1, +-13, +-18, +-49, +-16, +-22, +-57, +-17, +-29, +-65, +-11, +-29, +-61, + 14, +-12, +-49, + 25, + -2, +-44, + 13, +-13, +-53, + 38, + -7, +-54, + 30, +-19, +-65, + 16, +-30, +-72, + 8, +-32, +-72, + 21, + -9, +-42, + 69, + 41, + 1, + 69, + 34, + -8, + 20, + 1, +-36, + 5, + 18, + 6, + 37, + 44, + 30, + 43, + 48, + 38, + 39, + 45, + 40, + 28, + 37, + 31, + 43, + 48, + 42, + 45, + 48, + 43, + 45, + 48, + 43, + 43, + 48, + 42, + 40, + 45, + 39, + 62, + 52, + 34, + 88, + 66, + 44, + 25, + -3, +-27, +-38, +-81, +-119, +-104, +-120, +-125, +-104, +-119, +-125, +-107, +-122, +-125, +-104, +-120, +-125, +-107, +-122, +-125, +-109, +-123, +-125, +-111, +-124, +-125, +-114, +-124, +-124, +-114, +-125, +-124, +-114, +-124, +-124, +-114, +-124, +-125, +-105, +-120, +-125, +-104, +-120, +-125, +-104, +-121, +-125, +-101, +-118, +-124, +-98, +-115, +-122, +-97, +-114, +-121, +-92, +-109, +-119, +-101, +-116, +-122, +-103, +-119, +-124, +-103, +-119, +-124, +-102, +-119, +-124, +-103, +-119, +-123, +-101, +-116, +-122, +-103, +-118, +-123, +-96, +-114, +-122, +-90, +-112, +-121, + 33, +-36, +-97, +-22, +-68, +-108, +114, +111, +108, +112, +106, + 98, + 70, + 53, + 39, + 9, +-33, +-66, + 84, + 71, + 58, +102, + 92, + 81, +107, +102, + 95, +109, +107, +105, +104, + 93, + 88, +103, + 93, + 87, +100, + 95, + 90, + 97, + 87, + 77, + 96, + 88, + 80, + 97, + 91, + 83, + 96, + 86, + 77, + 98, + 90, + 83, + 88, + 79, + 74, + 96, + 94, + 93, + 93, + 89, + 89, + 98, + 92, + 87, + 94, + 81, + 72, + 94, + 83, + 72, + 92, + 81, + 69, + 96, + 83, + 70, + 97, + 83, + 73, +100, + 95, + 90, + 99, + 87, + 79, + 69, + 55, + 44, +-55, +-80, +-115, +-43, +-67, +-109, +-41, +-63, +-102, +-39, +-61, +-101, +-24, +-39, +-61, + 24, + 26, + 9, + 10, + 16, + 1, + 16, + 19, + 5, + 29, + 29, + 14, + 29, + 23, + 3, +-25, +-31, +-63, +-39, +-47, +-79, +-48, +-54, +-81, +-31, +-50, +-85, +-19, +-52, +-89, +-30, +-53, +-85, +-12, +-43, +-80, + 48, + 3, +-45, + 45, + 0, +-47, + 43, + -2, +-50, + 50, + 4, +-43, + 37, + -9, +-56, + -7, +-50, +-88, + 61, + 32, + 0, + 98, + 72, + 32, + 45, + 38, + 15, + 42, + 48, + 39, + 30, + 38, + 32, + 29, + 38, + 32, + 46, + 51, + 46, + 46, + 51, + 45, + 45, + 49, + 43, + 44, + 49, + 43, + 42, + 47, + 42, + 39, + 44, + 38, + 59, + 55, + 46, + 87, + 71, + 56, + 65, + 48, + 39, +-60, +-98, +-115, +-71, +-96, +-113, +-60, +-73, +-80, + 16, + 8, + 0, + 41, + 30, + 22, + 60, + 53, + 49, + 27, + 24, + 21, +-123, +-126, +-126, + 61, + 50, + 40, + 58, + 42, + 19, + 63, + 56, + 43, + -2, +-34, +-65, +-48, +-61, +-71, +-65, +-92, +-126, +-60, +-89, +-126, +-60, +-91, +-125, +-27, +-50, +-85, +-41, +-78, +-117, +-62, +-94, +-126, +-69, +-83, +-110, +-73, +-85, +-105, +-86, +-89, +-102, +-84, +-89, +-101, + 3, + -2, + -9, + 53, + 48, + 44, + 55, + 47, + 36, + 57, + 47, + 34, +-25, +-36, +-42, +-19, +-59, +-90, +-20, +-50, +-72, +109, + 97, + 80, +101, + 82, + 63, + 96, + 71, + 48, + 4, +-38, +-71, + 88, + 79, + 72, + 99, + 92, + 84, + 82, + 72, + 66, + 81, + 76, + 72, + 85, + 78, + 76, + 93, + 81, + 80, + 79, + 71, + 69, + 77, + 67, + 64, + 91, + 86, + 82, + 94, + 85, + 79, + 96, + 89, + 82, + 94, + 81, + 66, + 92, + 74, + 56, + 88, + 69, + 51, + 89, + 72, + 55, + 92, + 78, + 61, + 91, + 65, + 46, + 93, + 78, + 64, + 93, + 85, + 78, + 97, + 89, + 84, + 95, + 87, + 85, + 89, + 76, + 72, + 81, + 76, + 72, + 59, + 47, + 43, +-52, +-77, +-110, +-51, +-76, +-114, +-47, +-72, +-115, +-48, +-76, +-115, +-47, +-71, +-110, + 30, + 27, + 12, + 28, + 24, + 2, + 33, + 18, + -9, + 21, + 6, +-19, + 37, + 15, +-24, + 10, +-16, +-53, +-17, +-40, +-79, +-50, +-62, +-93, +-59, +-70, +-96, +-40, +-64, +-103, +-56, +-79, +-114, +-57, +-79, +-108, + 33, +-17, +-62, + 39, + -9, +-56, + 41, + -6, +-52, + 47, + 2, +-46, + 45, + 2, +-49, + 39, + -8, +-56, + 15, +-31, +-75, +101, + 80, + 52, + 74, + 47, + 13, + 19, + 30, + 22, + 21, + 33, + 25, + 44, + 50, + 45, + 51, + 56, + 52, + 46, + 51, + 47, + 44, + 49, + 43, + 43, + 48, + 42, + 43, + 48, + 44, + 40, + 45, + 41, + 54, + 50, + 41, + 74, + 49, + 24, + 80, + 61, + 44, + 29, + 11, + -4, +-43, +-93, +-119, +-16, +-31, +-36, + 86, + 74, + 60, + 75, + 55, + 34, + 69, + 45, + 21, + 35, + 13, +-12, +-123, +-125, +-125, + 99, + 88, + 72, + 95, + 80, + 62, +103, + 97, + 92, +-14, +-42, +-71, +-69, +-102, +-125, +-57, +-90, +-126, +-60, +-91, +-126, +-63, +-97, +-126, +-42, +-65, +-93, +-39, +-71, +-103, +-65, +-98, +-126, +-72, +-90, +-123, +-61, +-78, +-103, +-66, +-74, +-87, +-45, +-53, +-65, + 54, + 50, + 42, + 91, + 71, + 55, + 88, + 61, + 35, + 88, + 63, + 40, + 5, +-23, +-39, +-11, +-68, +-103, +-41, +-81, +-103, + 79, + 72, + 67, + 78, + 65, + 50, + 94, + 73, + 54, + 7, +-37, +-77, + 88, + 69, + 46, + 90, + 73, + 56, + 88, + 69, + 51, + 89, + 74, + 60, + 93, + 77, + 60, + 89, + 72, + 59, + 92, + 81, + 65, + 87, + 75, + 65, + 85, + 65, + 43, + 75, + 59, + 45, + 81, + 62, + 39, + 81, + 68, + 52, + 81, + 65, + 47, + 77, + 64, + 54, + 75, + 73, + 71, + 76, + 71, + 66, + 75, + 62, + 50, + 85, + 78, + 67, + 85, + 64, + 42, + 84, + 64, + 41, + 90, + 75, + 60, + 97, + 79, + 62, + 88, + 73, + 60, + 50, + 36, + 22, +-51, +-77, +-113, +-55, +-81, +-113, +-53, +-76, +-112, +-58, +-86, +-116, +-62, +-90, +-120, + 34, + 31, + 16, + 40, + 28, + 5, + 48, + 38, + 11, + 30, + 29, + 11, + 36, + 24, + 1, + 23, + 11, +-14, + 9, +-11, +-44, +-27, +-41, +-68, +-73, +-83, +-109, +-21, +-42, +-83, +-35, +-49, +-85, +-28, +-51, +-86, + 12, +-14, +-41, + 11, +-25, +-55, + 0, +-44, +-82, + 37, +-12, +-58, + 43, + -3, +-51, + 46, + 0, +-49, + 39, + -9, +-56, + 67, + 32, + -3, + 95, + 67, + 35, + 18, + 22, + 11, + 31, + 40, + 34, + 46, + 52, + 48, + 53, + 57, + 55, + 48, + 53, + 49, + 43, + 48, + 43, + 42, + 47, + 41, + 43, + 48, + 44, + 44, + 48, + 47, + 50, + 51, + 44, + 77, + 54, + 33, + 82, + 60, + 41, + 61, + 39, + 16, +-33, +-83, +-109, + -2, +-24, +-35, + 92, + 79, + 64, + 92, + 82, + 72, + 91, + 80, + 65, + 56, + 47, + 37, +-122, +-124, +-124, + 25, + 16, + 6, + 42, + 20, + 2, + 37, + 17, + -4, +-44, +-55, +-64, +-42, +-48, +-57, +-37, +-43, +-55, +-37, +-43, +-60, +-39, +-48, +-64, +-26, +-36, +-57, +-27, +-40, +-62, +-38, +-48, +-63, +-32, +-38, +-50, +-19, +-22, +-23, + 4, + 3, + 5, + 24, + 22, + 21, + 37, + 26, + 23, +101, + 90, + 81, + 93, + 82, + 73, + 90, + 85, + 81, + -4, +-22, +-26, +-17, +-73, +-102, +-54, +-92, +-113, + 58, + 36, + 17, + 29, + 7, +-17, + 27, + 4, +-21, + 24, + -9, +-49, + 45, + 14, +-15, + 69, + 44, + 18, + 74, + 55, + 35, + 73, + 48, + 21, + 65, + 46, + 23, + 72, + 43, + 13, + 73, + 50, + 27, + 68, + 47, + 21, + 81, + 66, + 50, + 74, + 57, + 40, + 76, + 64, + 51, + 68, + 55, + 45, + 55, + 49, + 42, + 50, + 48, + 40, + 55, + 46, + 33, + 53, + 43, + 31, + 52, + 42, + 35, + 48, + 42, + 36, + 51, + 44, + 30, + 65, + 54, + 40, + 72, + 54, + 35, + 80, + 66, + 52, + 83, + 63, + 41, + 15, + -5, +-22, +-56, +-78, +-111, +-59, +-82, +-111, +-60, +-80, +-112, +-59, +-85, +-117, +-64, +-91, +-123, + 45, + 41, + 25, + 21, + 19, + -1, + 43, + 33, + 13, + 45, + 39, + 20, + 43, + 36, + 17, + 35, + 27, + 4, + 30, + 16, +-11, + 10, + -9, +-40, +-64, +-67, +-84, +-21, +-28, +-59, +-10, +-21, +-47, + -1, +-18, +-51, +-43, +-37, +-67, + 40, + 19, + -7, + 38, + 15, +-11, + 4, +-19, +-46, + 30, +-12, +-55, + 51, + 6, +-42, + 48, + 4, +-45, + 38, + -6, +-50, +103, + 75, + 41, + 25, + 14, + -7, + 33, + 42, + 37, + 47, + 53, + 48, + 54, + 58, + 56, + 48, + 53, + 50, + 42, + 47, + 41, + 41, + 46, + 41, + 42, + 47, + 43, + 43, + 47, + 46, + 47, + 39, + 30, + 63, + 39, + 19, + 73, + 52, + 32, + 75, + 51, + 25, +-22, +-70, +-100, + -4, +-40, +-60, + 81, + 58, + 35, + 79, + 57, + 33, + 84, + 62, + 39, + 68, + 48, + 27, +-102, +-118, +-124, +-74, +-100, +-125, +-70, +-98, +-124, +-73, +-101, +-123, + 8, + 6, + -3, + 26, + 23, + 13, + 22, + 18, + 8, + 18, + 14, + 3, + 9, + 6, + -5, + 0, + -3, +-13, +-18, +-21, +-31, +-18, +-21, +-33, + 1, + 0, + -5, + 34, + 33, + 32, + 64, + 64, + 63, + 81, + 78, + 77, +-30, +-40, +-41, +-28, +-32, +-37, +-34, +-42, +-53, +-75, +-83, +-108, +-51, +-86, +-109, +-18, +-68, +-94, +-68, +-90, +-100, + 64, + 45, + 25, + 58, + 27, + -2, + 54, + 17, +-19, + 11, +-32, +-66, + 20, +-22, +-61, + 62, + 21, +-23, + 60, + 14, +-29, + 75, + 41, + 3, + 76, + 41, + 2, + 74, + 42, + 0, + 75, + 41, + 2, + 78, + 50, + 18, + 63, + 26, + -6, + 73, + 39, + -1, + 70, + 36, + -5, + 67, + 35, + -2, + 65, + 36, + 3, + 68, + 50, + 34, + 58, + 39, + 17, + 51, + 43, + 29, + 49, + 40, + 28, + 62, + 43, + 28, + 70, + 46, + 19, + 63, + 38, + 14, + 63, + 34, + 5, + 61, + 32, + 2, + 59, + 25, + -4, +-29, +-51, +-71, +-58, +-76, +-107, +-73, +-92, +-115, +-58, +-79, +-110, +-64, +-89, +-120, +-64, +-93, +-122, + 31, + 26, + 13, + 29, + 19, + -7, + 40, + 28, + 6, + 34, + 32, + 16, + 46, + 34, + 12, + 41, + 38, + 20, + 38, + 26, + 3, + 21, + 17, + -5, +-36, +-42, +-57, + -5, +-18, +-49, + 2, + -2, +-28, + 10, + -3, +-32, +-46, +-34, +-77, +-47, +-36, +-69, + 28, + 14, +-11, + 39, + 19, + -6, + 8, +-27, +-63, + 46, + 1, +-48, + 47, + 2, +-48, + 42, + -3, +-51, + 93, + 68, + 36, + 29, + 11, +-13, + 34, + 42, + 37, + 40, + 46, + 42, + 53, + 57, + 55, + 46, + 51, + 47, + 39, + 44, + 39, + 41, + 47, + 42, + 42, + 46, + 44, + 13, + 9, + 5, + 3, +-10, +-36, + 22, + -9, +-34, + 40, + 8, +-10, + 58, + 41, + 30, +-55, +-76, +-85, +-16, +-28, +-37, + 77, + 55, + 31, + 74, + 51, + 26, + 72, + 41, + 4, + 63, + 32, + -4, +-110, +-123, +-124, + -2, +-22, +-44, +-81, +-107, +-127, +-71, +-95, +-111, + 4, + 1, + -2, + 33, + 30, + 23, + 30, + 28, + 19, + 24, + 22, + 15, + 12, + 10, + 3, + 0, + 0, + -8, +-18, +-19, +-26, +-17, +-20, +-27, + 14, + 14, + 15, + 45, + 43, + 46, + 67, + 64, + 67, + 58, + 55, + 54, +-23, +-24, +-21, +-76, +-83, +-95, +-64, +-79, +-108, + -2, +-37, +-66, +-22, +-47, +-68, +-12, +-44, +-64, +-67, +-97, +-108, + 55, + 9, +-37, + 39, +-11, +-62, + 34, +-16, +-65, + 36, +-14, +-67, + 66, + 21, +-27, + 76, + 37, + -8, + 76, + 35, + -4, + 62, + 26, + -5, + 67, + 36, + 2, + 65, + 28, + -4, + 76, + 47, + 20, + 62, + 41, + 17, + 68, + 44, + 18, + 71, + 46, + 22, + 77, + 49, + 14, + 73, + 46, + 13, + 68, + 34, + -8, + 61, + 23, +-18, + 52, + 16, +-16, + 63, + 37, + 9, + 62, + 38, + 10, + 61, + 34, + 4, + 54, + 20, +-10, + 58, + 24, +-11, + 45, + 19, +-10, + 41, + 16, + -5, + 31, + 14, + 2, + 1, +-15, +-24, +-53, +-67, +-78, +-71, +-86, +-110, +-78, +-96, +-121, +-66, +-91, +-118, +-67, +-91, +-119, + -5, +-13, +-30, + -3, +-13, +-40, + 16, + 8, +-14, + 27, + 18, + -7, + 25, + 18, + -5, + 28, + 22, + -1, + 35, + 25, + 1, + 35, + 30, + 13, +-42, +-40, +-51, + -1, +-19, +-50, + 8, + 2, +-21, + 18, + 4, +-23, +-30, +-24, +-66, +-31, +-24, +-65, +-49, +-36, +-76, +-53, +-40, +-74, +-31, +-53, +-83, + 42, + -4, +-53, + 47, + 2, +-47, + 42, + -4, +-53, + 73, + 44, + 13, + 51, + 28, + -4, + 35, + 42, + 37, + 30, + 37, + 32, + 51, + 54, + 54, + 42, + 49, + 45, + 38, + 47, + 42, + 40, + 47, + 43, + 14, + 17, + 10, + 9, +-17, +-40, + 22, +-19, +-43, + 24, +-13, +-39, + 14, + -1, +-31, + 22, + -8, +-37, +-34, +-50, +-70, + -5, +-29, +-45, + 78, + 50, + 16, + 74, + 46, + 16, + 65, + 27, + -9, + 60, + 20, +-20, +-102, +-123, +-124, + 15, + -4, +-36, +-88, +-111, +-126, +-73, +-95, +-120, + 28, + 28, + 36, + 19, + 19, + 30, + 20, + 20, + 29, + 17, + 17, + 26, + 15, + 15, + 23, + 2, + 2, + 11, +-19, +-17, + -9, +-42, +-41, +-34, +-23, +-22, +-14, + 16, + 17, + 25, + 39, + 40, + 46, + 49, + 49, + 54, +-29, +-30, +-24, +-79, +-87, +-109, + 4, +-31, +-69, + 59, + 18, +-24, +-27, +-61, +-93, +-23, +-55, +-81, +-67, +-97, +-111, + 77, + 37, +-13, + 58, + 11, +-35, + 49, + 1, +-54, + 46, + -5, +-66, + 53, + 8, +-48, + 65, + 26, +-20, + 62, + 23, +-18, + 57, + 26, +-15, + 56, + 23, +-15, + 66, + 23, +-11, + 70, + 27, + -5, + 48, + 28, + -3, + 61, + 40, + 10, + 76, + 54, + 29, + 66, + 38, + 10, + 72, + 45, + 15, + 62, + 26, +-12, + 65, + 34, + -2, + 48, + 8, +-31, + 56, + 21, +-17, + 49, + 15, +-20, + 45, + 14, +-17, + 31, + -2, +-29, + 24, + -6, +-33, + 35, + 10, +-12, + 40, + 21, + 3, + 33, + 14, + -2, + 18, + 2, + -9, + 0, +-14, +-26, +-43, +-54, +-75, +-71, +-94, +-113, +-69, +-91, +-119, +-66, +-92, +-114, +-14, +-19, +-27, +-27, +-24, +-34, +-29, +-32, +-47, +-40, +-36, +-48, +-28, +-26, +-43, + -7, +-14, +-33, + 20, + 7, +-19, + 13, + 6, + -9, +-75, +-76, +-86, + -2, + -7, +-33, + 9, + 5, +-20, + 21, + 8, +-20, + 27, + 9, +-23, +-17, +-17, +-55, +-20, +-14, +-56, +-28, +-21, +-60, +-54, +-60, +-90, + 41, + -5, +-53, + 47, + 2, +-47, + 40, + -7, +-55, + 54, + 23, + -8, + 65, + 41, + 9, + 30, + 37, + 32, + 25, + 33, + 27, + 47, + 52, + 49, + 39, + 45, + 42, + 38, + 46, + 42, + 21, + 22, + 16, + 24, + -4, +-39, + 20, +-17, +-54, + 35, + 3, +-34, + 34, + 0, +-41, + 37, + 4, +-32, + 26, +-13, +-57, +-31, +-64, +-92, +-25, +-59, +-85, + 42, + 1, +-44, + 58, + 18, +-29, + 66, + 37, + 2, + 67, + 38, + 6, +-104, +-120, +-124, +-97, +-113, +-118, +-84, +-95, +-108, +-83, +-92, +-112, +-67, +-66, +-54, +-64, +-61, +-42, +-67, +-62, +-47, +-57, +-57, +-43, +-54, +-54, +-45, +-72, +-68, +-59, +-80, +-77, +-67, +-92, +-91, +-83, +-85, +-83, +-75, +-66, +-65, +-56, +-49, +-49, +-39, +-53, +-54, +-41, +-17, +-19, +-15, +-82, +-93, +-112, + 50, + 7, +-45, + 66, + 27, +-20, + -7, +-34, +-62, +-28, +-75, +-111, +-70, +-93, +-103, + 65, + 36, + 0, + 63, + 24, +-19, + 67, + 23, +-28, + 60, + 12, +-45, + 67, + 20, +-38, + 64, + 22, +-26, + 72, + 29, +-28, + 47, + -4, +-56, + 72, + 36, +-13, + 58, + 14, +-34, + 68, + 26, +-15, + 68, + 35, + -8, + 57, + 24, +-12, + 52, + 9, +-37, + 65, + 32, + -9, + 57, + 23, +-18, + 48, + 15, +-24, + 46, + 11, +-24, + 47, + 14, +-16, + 46, + 27, + 5, + 42, + 34, + 21, + 38, + 25, + 8, + 37, + 13, + -9, + 46, + 22, + -1, + 27, + -5, +-33, + 34, + 10, +-16, + 27, + 0, +-24, + 23, + -2, +-25, + 11, +-13, +-34, + 23, + 2, +-16, + 2, +-26, +-52, +-53, +-78, +-102, +-63, +-83, +-113, +-19, +-22, +-31, + -2, +-13, +-41, + 9, + 6, +-17, + 24, + 11, +-14, + 9, + 5, +-10, + 17, + 4, +-19, + 0, + -2, +-19, + -3, + 0, + -6, +-44, +-46, +-57, + 5, +-10, +-36, + 15, + 9, +-14, + 24, + 12, +-14, + 4, + -6, +-34, + 45, + 23, + -7, + 22, + 8, +-23, + -2, + -6, +-41, +-51, +-53, +-82, + 41, + -3, +-50, + 50, + 6, +-40, + 35, +-13, +-61, + 43, + 9, +-21, + 75, + 50, + 22, + 26, + 32, + 26, + 32, + 39, + 34, + 33, + 42, + 36, + 33, + 41, + 37, + 19, + 21, + 14, + 10, +-20, +-54, + 17, +-14, +-51, + 25, +-14, +-58, + 26, + -8, +-47, + 21, +-19, +-61, + 36, + 2, +-39, + 44, + 10, +-31, +-15, +-51, +-81, +-36, +-67, +-92, + 36, + 7, +-35, + 17, +-10, +-51, + 12, +-14, +-51, + -2, +-23, +-51, +-116, +-123, +-124, +-113, +-124, +-125, +-11, + -8, + -7, + 33, + 35, + 36, + 35, + 37, + 38, + 37, + 39, + 40, + 38, + 41, + 42, + 38, + 40, + 41, + 37, + 39, + 39, + 37, + 39, + 39, + 40, + 41, + 42, + 41, + 43, + 42, + 38, + 39, + 39, + 22, + 24, + 27, + -9, + -8, + -9, +-13, +-12, +-14, + 11, + 9, + 8, +-90, +-103, +-119, + 1, +-16, +-47, + 16, + -6, +-43, +-13, +-47, +-82, +-25, +-70, +-103, +-68, +-96, +-107, + 26, + -7, +-49, + 23, + -1, +-42, + 26, + 5, +-29, + 50, + 23, +-18, + 51, + 17, +-25, + 72, + 35, + -9, + 73, + 39, + -4, + 63, + 23, +-22, + 61, + 20, +-31, + 53, + 14, +-29, + 54, + 11, +-39, + 53, + 14, +-29, + 52, + 13, +-30, + 65, + 37, + 3, + 55, + 27, + -3, + 53, + 25, + -5, + 46, + 26, + -1, + 35, + 22, + 0, + 22, + 10, +-11, + 12, + 2, +-18, + 23, + -2, +-27, + 23, + 7, +-15, + 15, + 2, +-14, + 13, + 2, +-13, + 24, + 12, + 0, + 32, + 16, + 5, + 19, + -3, +-20, + 27, + 8, +-11, + 28, + 9, + -8, + 13, +-14, +-35, + 17, + -3, +-20, + 0, +-29, +-54, +-31, +-64, +-95, +-11, +-15, +-25, + -2, + -8, +-34, + 9, + 0, +-22, + 19, + 9, +-12, + 25, + 17, + -6, + 19, + 12, +-10, + 15, + 8, +-12, + 19, + 5, +-22, + 22, + 6, +-23, + 0, + -3, +-25, + 10, + 6, +-17, + 24, + 12, +-12, +-57, +-44, +-81, + 8, + -3, +-28, + 51, + 28, + 3, + 56, + 34, + 8, + 8, +-10, +-35, + 38, + -6, +-50, + 51, + 9, +-38, + 34, +-13, +-60, + 36, + -5, +-40, + 86, + 61, + 32, + 17, + 21, + 16, + 33, + 38, + 36, + 16, + 25, + 17, + 24, + 29, + 24, + 8, +-19, +-56, + 28, + -3, +-43, + 10, +-27, +-73, + 31, + -5, +-45, + 28, + -9, +-46, + 35, + -3, +-43, + 32, + -5, +-46, + 37, + 0, +-44, +-16, +-48, +-80, +-38, +-68, +-92, + 30, + -7, +-49, + 3, +-25, +-58, +-51, +-72, +-95, +-109, +-122, +-125, +-117, +-123, +-124, +-114, +-123, +-122, +-111, +-108, +-75, +-87, +-98, +-56, +-70, +-89, +-53, +-34, +-65, +-47, +-27, +-57, +-46, +-34, +-66, +-48, +-37, +-71, +-54, +-50, +-82, +-57, +-48, +-76, +-56, +-56, +-82, +-56, +-86, +-97, +-56, +-102, +-109, +-73, +-115, +-115, +-94, +-119, +-118, +-104, +-107, +-116, +-112, +-99, +-113, +-124, +-99, +-112, +-124, + 13, + -9, +-38, + 12, +-19, +-50, +-34, +-73, +-99, +-53, +-73, +-88, + 44, + 18, +-23, + 59, + 22, +-23, + 52, + 14, +-27, + 60, + 19, +-27, + 62, + 14, +-38, + 66, + 24, +-24, + 58, + 18, +-25, + 53, + 14, +-28, + 56, + 17, +-32, + 51, + 9, +-36, + 50, + 8, +-38, + 65, + 30, +-11, + 51, + 14, +-25, + 54, + 24, + -9, + 51, + 18, +-15, + 52, + 20, +-14, + 43, + 14, +-14, + 39, + 13, + -9, + 30, + 0, +-27, + 33, + 14, +-10, + 18, + 5, +-19, + 3, + -7, +-29, + 5, + -8, +-25, + 23, + 12, + -7, + 37, + 21, + 3, + 30, + 10, +-10, + 22, +-12, +-38, + 31, + 7, +-15, + 26, + 5, +-17, + 27, + 6, +-13, + 9, +-17, +-39, + 15, +-13, +-37, + 2, +-33, +-64, + 20, + 11, + -6, + 10, + -4, +-27, + 4, + 2, +-15, + 23, + 15, + -7, + 26, + 18, + -1, + 24, + 19, + -1, + 31, + 19, + -5, + 22, + 16, + -3, + 29, + 17, + -7, + 13, + 14, + -7, + 15, + 8, +-16, + 24, + 10, +-14, +-61, +-46, +-82, +-44, +-33, +-71, +-13, +-15, +-42, + 44, + 28, + 3, + 17, + 0, +-23, + 29, +-13, +-53, + 50, + 9, +-36, + 46, + 1, +-44, + 23, +-24, +-67, + 89, + 64, + 34, + 6, + 11, + 3, + 30, + 38, + 35, + 8, + 13, + 4, + 20, + 0, +-27, + 22, + -9, +-44, + 31, + 2, +-32, + 26, + -3, +-40, + 32, + 3, +-35, + 29, + -3, +-43, + 8, +-38, +-87, + 27, +-15, +-63, + 21, +-24, +-78, +-30, +-67, +-106, +-48, +-85, +-111, + 6, +-29, +-75, + 11, +-27, +-76, + 38, + -3, +-56, + 43, + 5, +-44, + 24, +-20, +-68, + 25, +-28, +-84, + 63, + 10, +-72, + 50, + -7, +-80, + 45, + -5, +-61, + 53, + 2, +-57, + 46, + -1, +-47, + 50, + 14, +-20, + 37, + 5, +-26, + 46, + 9, +-25, + 48, + 4, +-28, + 45, + 0, +-39, + 46, + 7, +-34, + 33, + -3, +-40, + 27, +-17, +-58, + 12, +-35, +-76, + 2, +-46, +-90, +-25, +-68, +-105, +-53, +-96, +-124, +-77, +-110, +-124, +-32, +-60, +-97, +-45, +-77, +-102, +-79, +-87, +-94, + 68, + 30, +-17, + 51, + 9, +-37, + 50, + 7, +-42, + 41, + -7, +-60, + 47, + -1, +-57, + 40, + -8, +-60, + 51, + 7, +-41, + 50, + 14, +-25, + 67, + 36, + 2, + 59, + 21, +-18, + 61, + 24, +-10, + 48, + 14, +-21, + 64, + 38, + 4, + 40, + 5, +-28, + 44, + 3, +-37, + 45, + 4, +-38, + 43, + 2, +-40, + 40, + -1, +-42, + 40, + 10, +-26, + 36, + 8, +-19, + 42, + 13, +-17, + 46, + 25, + 0, + 36, + 15, +-10, + 37, + 10, +-17, + 37, + 9, +-19, + 30, + -3, +-38, + 24, +-12, +-44, + 27, + -2, +-30, + 22, +-10, +-39, + 12, +-23, +-51, + 28, + 7, +-11, + 25, + 2, +-18, + 18, + -7, +-27, + 26, + 17, + 2, + 9, + 2, +-18, + 9, + 10, + -7, + 22, + 11, +-10, + 16, + 9, + -9, + 23, + 16, + -7, + 22, + 17, + -6, + 29, + 20, + -2, + 30, + 18, + -5, + 15, + 5, +-19, + 10, + 5, +-18, + 20, + 6, +-18, +-63, +-49, +-86, +-61, +-44, +-78, +-23, +-16, +-53, +-28, +-18, +-55, +-30, +-28, +-55, + 17, +-20, +-57, + 50, + 10, +-33, + 50, + 9, +-35, + 21, +-24, +-68, + 87, + 58, + 25, + -2, + -2, +-12, + 23, + 25, + 23, +-20, +-31, +-50, +-10, +-33, +-59, + 15, +-16, +-44, + 12, +-22, +-51, + -3, +-30, +-62, + 11, +-14, +-46, + 28, + 0, +-35, + 38, + 8, +-32, + 30, + -8, +-56, + 27, +-13, +-60, +-22, +-58, +-101, +-40, +-75, +-98, + 20, +-27, +-83, + 21, +-27, +-84, + 26, +-21, +-83, + 12, +-37, +-92, +-18, +-52, +-85, +-26, +-55, +-93, + 34, +-10, +-66, + 50, + 13, +-33, + 42, + 4, +-39, + 55, + 22, +-12, + 44, + 5, +-29, + 24, +-16, +-51, + 30, + 0, +-35, + 35, + 0, +-33, + 48, + 9, +-20, + 35, + -3, +-34, + 37, + -2, +-37, + 38, + -3, +-35, + 49, + 12, +-21, + 49, + 10, +-29, + 55, + 20, +-18, + 57, + 15, +-32, + 46, + 2, +-42, + 28, +-15, +-58, + -4, +-44, +-85, +-40, +-70, +-99, +-62, +-73, +-91, + 45, + 2, +-44, + 45, + -3, +-50, + 54, + 12, +-36, + 49, + 8, +-39, + 62, + 30, + -9, + 63, + 29, +-10, + 53, + 14, +-17, + 36, + 1, +-30, + 31, + -1, +-30, + 32, + 2, +-27, + 39, + 6, +-20, + 37, + 10, +-17, + 24, + -1, +-26, + 43, + 17, + -8, + 58, + 33, + 8, + 59, + 33, + 6, + 51, + 23, + -5, + 51, + 22, +-11, + 47, + 11, +-26, + 36, + 2, +-32, + 25, +-15, +-50, + 24, +-18, +-60, + 31, + -9, +-49, + 30, + -6, +-42, + 24, +-13, +-50, + 27, +-10, +-45, + 32, + -1, +-36, + 31, + 6, +-17, + 37, + 13, + -9, + 44, + 29, + 15, + 17, + 2, +-13, + -9, +-28, +-40, + 9, +-13, +-25, + 15, + 1, +-10, + 11, + 6, +-12, + 13, + 6, +-14, + 14, + 8, +-10, + 18, + 12, + -7, + 11, + 9, + -8, + 13, + 9, +-12, + 16, + 8, +-13, + 21, + 9, +-13, + 7, + 6, + -8, + 3, + -1, +-22, + 18, + 7, +-21, +-35, +-29, +-65, +-51, +-41, +-76, +-18, +-18, +-44, + 23, + 15, +-12, + -1, + -6, +-30, + 13, +-21, +-58, + 50, + 11, +-28, + 49, + 10, +-32, + 21, +-22, +-64, + 96, + 70, + 37, + 4, + 0, +-13, +-23, +-33, +-47, + -7, +-34, +-61, + 9, +-23, +-48, + 12, +-18, +-46, + -3, +-18, +-49, + -5, +-35, +-68, + 8, +-23, +-58, + 31, + -5, +-45, + 15, +-21, +-66, + 28, + -7, +-53, + 25, +-15, +-67, + -9, +-50, +-90, +-42, +-74, +-99, + 17, +-27, +-79, + 13, +-34, +-91, + 18, +-26, +-78, + 14, +-29, +-75, +-13, +-49, +-90, +-61, +-75, +-95, + 32, + -9, +-60, + 38, + 0, +-40, + 29, + -7, +-49, + 42, + 7, +-28, + 20, +-11, +-48, + 9, +-19, +-54, + 34, + -4, +-40, + 49, + 2, +-32, + 42, + -3, +-34, + 14, +-12, +-43, + 19, +-11, +-45, + 44, + 12, +-21, + 51, + 21, +-15, + 46, + 5, +-39, + 46, + 7, +-35, + 33, +-11, +-59, + 25, +-22, +-65, + 39, + -4, +-45, + 5, +-36, +-80, +-40, +-66, +-94, +-93, +-104, +-112, + 56, + 15, +-29, + 50, + 4, +-42, + 50, + 6, +-44, + 56, + 14, +-33, + 67, + 35, + -3, + 53, + 20, +-15, + 67, + 37, + 11, + 41, + 11, +-18, + 25, + 4, +-24, + 36, + 3, +-26, + 53, + 10, +-16, + 47, + 11, +-17, + 32, + 5, +-22, + 30, + -2, +-27, + 42, + 13, +-10, + 56, + 33, + 7, + 43, + 14, +-18, + 50, + 20, +-10, + 37, + -1, +-40, + 34, + -4, +-45, + 27, +-13, +-50, + 23, +-17, +-53, + 21, +-20, +-61, + 23, +-18, +-59, + 28, + -7, +-44, + 18, +-25, +-64, + 29, + -8, +-41, + 32, + 5, +-20, + 27, + 1, +-21, + 35, + 12, + -8, + 25, + -1, +-17, + 3, +-25, +-43, + 5, +-10, +-23, + 27, + 21, + 9, + 21, + 10, +-12, + 6, + 6, + -9, + 17, + 11, + -9, + 12, + 9, + -8, + 14, + 10, + -7, + 22, + 13, + -9, + 15, + 11, + -7, + 23, + 13, + -9, + 7, + 4, +-17, + 11, + 3, +-22, + 16, + 4, +-22, + -8, +-16, +-50, +-36, +-30, +-65, +-33, +-25, +-61, +-52, +-38, +-70, +-28, +-26, +-47, + -5, +-33, +-65, + 46, + 9, +-29, + 45, + 8, +-33, + 15, +-25, +-65, + 94, + 64, + 33, + 11, +-14, +-42, + 26, + 11, +-17, + 23, + 3, +-22, + 22, + 1, +-27, + 28, + 7, +-23, + 33, + 10, +-23, + 13, +-15, +-52, + 9, +-29, +-67, + 2, +-39, +-84, + 15, +-27, +-81, + 10, +-34, +-87, + 15, +-27, +-77, +-11, +-46, +-83, +-38, +-65, +-88, + 26, + -8, +-53, + 25, + -8, +-50, + 23, + 2, +-45, + 30, + 16, +-38, + 62, + 62, + 21, + 59, + 74, + 41, + 59, + 50, + 30, + 59, + 22, + -8, + 79, + 57, + 33, + 57, + 36, + 12, + 35, + 12, +-14, + 42, + 7, +-33, + 32, + -7, +-45, + 42, + 5, +-35, + 41, + 1, +-38, + 58, + 29, + -8, + 44, + 6, +-34, + 33, + -8, +-52, + 34, +-11, +-54, + 33, +-12, +-56, + 32, +-14, +-60, + 42, + 1, +-40, + 48, + 20, +-16, + 30, + -8, +-42, +-12, +-48, +-83, +-31, +-56, +-87, +-75, +-87, +-101, + 44, + 5, +-35, + 55, + 21, +-18, + 56, + 19, +-20, + 50, + 8, +-36, + 49, + 6, +-42, + 47, + 3, +-44, + 55, + 14, +-28, + 67, + 35, + -6, + 74, + 54, + 28, + 65, + 35, + 2, + 57, + 22, + -8, + 56, + 20, +-13, + 65, + 40, + 11, + 59, + 40, + 16, + 44, + 8, +-20, + 47, + 8, +-27, + 46, + 7, +-31, + 35, + -4, +-47, + 37, + -2, +-45, + 42, + 11, +-24, + 43, + 15, +-15, + 39, + 12, +-20, + 49, + 26, + -1, + 38, + 17, + -7, + 42, + 14, +-14, + 31, + -1, +-31, + 39, + 10, +-18, + 28, + -9, +-46, + 30, + -7, +-45, + 24, +-10, +-43, + 24, +-11, +-37, + 19, + -4, +-25, + 31, + 12, + -4, + 5, +-18, +-48, + -4, +-29, +-61, + -5, +-26, +-57, + 0, +-15, +-40, + 4, +-13, +-39, + 3, + -8, +-29, + 4, + -3, +-22, + 13, + 3, +-20, + 18, + 7, +-14, + 3, + -5, +-24, + 2, + -1, +-22, + 8, + -1, +-27, + 39, + 15, +-12, + -1, + -9, +-41, +-39, +-28, +-65, +-20, +-11, +-45, +-32, +-23, +-52, +-25, +-47, +-76, + 41, + 4, +-34, + 43, + 6, +-32, + 5, +-34, +-71, + 82, + 52, + 20, + 14, + 1, +-40, + 41, + 45, + 11, + 57, + 53, + 23, + 67, + 61, + 32, + 17, + 30, + -7, +-19, + 14, +-28, + 23, + 37, + 2, + 44, + 49, + 17, + 40, + 45, + 16, + 22, + 34, + 4, + 4, + 9, +-23, + 13, + 9, +-27, + -9, +-16, +-38, +-35, +-40, +-64, + 11, + 17, +-14, + 35, + 47, + 16, + 85, + 66, +-20, +119, + 89, + 13, +115, +100, + 61, +110, +103, + 83, + 91, + 75, + 49, + 72, + 27, + 12, + 67, + 54, + 37, + 84, + 71, + 54, + 60, + 45, + 28, + 17, +-21, +-65, + 20, +-25, +-73, + 23, +-22, +-71, + 21, +-24, +-69, + 21, +-20, +-62, + 32, + -4, +-40, + 21, +-19, +-58, + 36, + -4, +-46, + 24, +-18, +-58, + 31, + -6, +-40, + 25, + -8, +-40, + 26, + -4, +-32, + 21, + 2, +-18, +-32, +-65, +-95, +-11, +-42, +-72, +-13, +-24, +-52, + 18, + -2, +-31, + 35, + 3, +-32, + 35, + 2, +-34, + 49, + 15, +-19, + 47, + 5, +-38, + 56, + 17, +-26, + 49, + 9, +-27, + 53, + 20, +-12, + 47, + 8, +-29, + 47, + 8, +-33, + 55, + 14, +-28, + 53, + 12, +-31, + 50, + 13, +-29, + 51, + 14, +-21, + 59, + 27, + -9, + 53, + 20, +-14, + 60, + 24, +-14, + 46, + 6, +-33, + 44, + 14, +-15, + 39, + 11, +-15, + 33, + 8, +-16, + 29, + 14, + -7, + 11, + 4, +-13, + 10, + 4, +-11, + 17, + 9, + -6, + 21, + 7, +-10, + 36, + 8, +-16, + 39, + 10, +-14, + 36, + 8, +-18, + 35, + 3, +-27, + 35, + 4, +-29, + 28, + -3, +-31, + 23, + -9, +-36, + 7, +-12, +-44, + -4, +-15, +-42, + 3, +-12, +-40, + 8, + -9, +-43, + -5, +-21, +-50, + -5, +-23, +-55, + -8, +-35, +-72, + 0, +-32, +-72, +-10, +-31, +-65, +-10, +-36, +-72, +-11, +-29, +-56, + -7, +-23, +-48, + 41, + 16, +-10, + 44, + 21, + -4, + 22, + 10, +-19, +-21, +-15, +-50, +-37, +-25, +-56, +-43, +-54, +-82, + 39, + 3, +-33, + 43, + 5, +-32, + 0, +-39, +-76, + 76, + 47, + 18, + 28, + 10, +-35, + -9, + 12, +-30, + 46, + 46, + 16, + 87, + 71, + 49, + 80, + 68, + 46, + 39, + 42, + 11, + 13, + 29, + -8, + 53, + 57, + 32, + 24, + 42, + 14, + 43, + 49, + 24, + 69, + 67, + 44, + 33, + 41, + 8, + 50, + 57, + 32, + 71, + 74, + 55, + 74, + 77, + 61, + 29, + 34, +-14, +109, + 54, +-74, +117, + 83, + 3, +113, + 88, + 38, +100, + 87, + 65, + 73, +-23, +-46, + 94, + 63, + 41, +105, + 93, + 77, +103, + 92, + 74, + 61, + 42, + 27, + 17, +-23, +-67, + 8, +-39, +-88, + 16, +-24, +-68, + 19, +-18, +-55, + 13, +-28, +-73, + 32, + -7, +-46, + 40, + 9, +-27, + 28, + -2, +-34, + 26, + 4, +-24, + 5, +-10, +-34, +-11, +-18, +-37, +-13, +-22, +-47, + -6, +-24, +-56, +-34, +-66, +-97, + 6, +-30, +-62, + 29, +-12, +-44, + -4, +-22, +-55, + -8, +-15, +-39, + 14, + 8, +-11, + 19, + 2, +-22, + 48, + 30, + 3, + 61, + 34, + 4, + 65, + 41, + 8, + 55, + 20, +-18, + 48, + 11, +-29, + 60, + 31, + 4, + 51, + 13, +-22, + 51, + 11, +-33, + 65, + 36, + 4, + 53, + 18, +-18, + 63, + 32, + -1, + 68, + 46, + 24, + 70, + 50, + 28, + 66, + 45, + 22, + 43, + 32, + 16, + 42, + 37, + 26, + 18, + 14, + -1, + 9, + -1, +-22, + 30, + 11, + -8, + 31, + 8, +-14, + 31, + 1, +-19, + 10, +-15, +-39, + 2, + -8, +-31, + 4, + -5, +-17, + 29, + 16, + -2, + 28, + 10, + -6, + 47, + 24, + 0, + 42, + 23, + 5, + 35, + 9, +-14, +-14, +-33, +-63, +-19, +-34, +-60, + -7, +-19, +-44, + 1, +-13, +-40, +-13, +-26, +-49, +-13, +-25, +-52, +-13, +-32, +-56, +-12, +-24, +-51, +-29, +-43, +-65, +-18, +-38, +-60, + -3, +-30, +-65, +-20, +-44, +-78, + 40, + 14, +-12, + 44, + 21, + -4, + 46, + 27, + 2, + 49, + 32, + 7, + 34, + 21, + -3, +-14, +-30, +-51, + 36, + -1, +-36, + 43, + 8, +-26, + -3, +-38, +-75, + 81, + 50, + 19, + 62, + 37, + 5, + 59, + 53, + 29, + 51, + 48, + 23, + 53, + 50, + 24, + 63, + 57, + 32, + 69, + 62, + 35, + 69, + 60, + 33, + 54, + 52, + 25, + 73, + 66, + 43, + 80, + 76, + 53, + 86, + 84, + 67, + 88, + 83, + 67, + 70, + 75, + 62, + 54, + 73, + 55, + 61, + 71, + 60, + 90, + 58, + 40, + 93, + 17, +-125, +102, + 64, +-18, + 89, + 58, + 8, + 85, + 54, + 38, + 81, + 37, + 21, +102, + 84, + 63, + 87, + 68, + 47, + 94, + 79, + 62, + 33, + 9, +-11, + 16, +-23, +-66, + 12, +-32, +-74, + 27, +-11, +-51, + 16, +-24, +-67, + 14, +-23, +-62, + 24, +-10, +-47, + 3, +-35, +-72, + 22, +-16, +-55, + 18, +-23, +-62, + 31, + -3, +-38, + 20, + -9, +-38, + 36, + 11, +-14, + 10, + -4, +-26, +-57, +-82, +-101, + -9, +-33, +-56, + 3, +-14, +-41, + 31, + 10, +-14, + 36, + 5, +-25, + 49, + 20, +-10, + 46, + 12, +-22, + 45, + 7, +-31, + 48, + 14, +-22, + 49, + 19, +-13, + 63, + 39, + 11, + 57, + 23, +-10, + 67, + 36, + 0, + 57, + 22, +-16, + 56, + 17, +-25, + 65, + 39, + 8, + 55, + 23, + -6, + 61, + 39, + 14, + 66, + 46, + 22, + 52, + 21, +-14, + 61, + 31, + 2, + 56, + 28, + 3, + 54, + 27, + 3, + 49, + 23, + -4, + 28, + 5, +-15, + 16, + 7, + -7, + 4, + -3, +-24, + 23, + 12, +-11, + 13, + 3, +-21, + 12, + 0, +-20, + 33, + 11, +-13, + 45, + 24, + 1, + 35, + 9, +-15, + 43, + 20, + -8, + 38, + 12, +-13, + 30, + 4, +-18, +-23, +-39, +-63, +-14, +-26, +-51, +-10, +-24, +-50, + -3, +-22, +-47, +-20, +-34, +-61, + -8, +-23, +-52, +-30, +-42, +-64, +-11, +-28, +-53, +-23, +-40, +-69, +-32, +-53, +-78, +-18, +-34, +-60, +-26, +-42, +-67, + 38, + 12, +-13, + 43, + 19, + -6, + 45, + 25, + 0, + 27, + 14, + -8, + 48, + 32, + 12, +-10, +-21, +-39, + 32, + -5, +-41, + 43, + 10, +-25, + 6, +-31, +-68, + 80, + 50, + 21, + 46, + 18, +-19, + 31, + 34, + -1, + 44, + 47, + 14, + 59, + 57, + 26, + 47, + 49, + 16, + 24, + 35, + -2, + 40, + 37, + 1, + 86, + 74, + 54, +100, + 94, + 81, +104, + 99, + 90, +105, + 97, + 84, + 96, + 73, + 35, + 72, + 76, + 66, + 46, + 59, + 46, + 32, + 47, + 36, + 76, + 41, + 29, + 72, + 5, +-100, + 67, + 32, +-44, + 67, + 11, +-22, + 72, + 16, + 3, + 67, + 38, + 18, + 51, + 29, + 9, + 53, + 37, + 22, + 93, + 83, + 69, +-22, +-56, +-92, + 6, +-28, +-64, + 10, +-27, +-62, + 4, +-34, +-68, + 16, +-14, +-42, +-15, +-62, +-106, + 15, +-24, +-66, + 19, +-18, +-57, + 11, +-30, +-74, + 19, +-24, +-65, + 26, +-14, +-54, + 27, + -6, +-42, + 22, +-13, +-41, + 39, + 11, +-15, +-69, +-87, +-96, + 7, +-15, +-38, + 43, + 13, +-18, + 35, + -3, +-37, + 50, + 18, +-18, + 44, + 4, +-36, + 51, + 12, +-28, + 54, + 12, +-38, + 51, + 13, +-28, + 57, + 23, +-16, + 28, +-22, +-75, + 46, + 15, +-17, + 53, + 19, +-14, + 48, + 10, +-27, + 57, + 24, + -7, + 51, + 11, +-32, + 70, + 44, + 14, + 45, + 9, +-28, + 52, + 9, +-38, + 65, + 38, + 7, + 57, + 22, +-12, + 69, + 33, + -8, + 68, + 36, + 0, + 50, + 18, +-11, + 58, + 33, + 9, + 49, + 24, + -4, + 53, + 35, + 13, + 28, + 14, + -2, + 42, + 25, + 3, + 51, + 27, + 3, + 48, + 22, + -8, + 44, + 12, +-22, + 39, + 1, +-33, + 36, + 0, +-37, + 35, + 4, +-26, + 41, + 13, +-20, +-32, +-49, +-74, +-13, +-26, +-55, +-23, +-34, +-55, + -5, +-19, +-47, +-25, +-38, +-55, + -7, +-22, +-43, +-28, +-43, +-64, +-14, +-32, +-57, +-24, +-38, +-64, +-26, +-45, +-68, +-22, +-41, +-67, +-33, +-44, +-72, + 31, + 7, +-18, + 41, + 17, + -7, + 44, + 23, + -1, + 9, + 1, +-23, + 45, + 30, + 11, + -6, +-10, +-26, + 17, +-20, +-51, + 44, + 10, +-25, + 15, +-24, +-60, + 71, + 48, + 24, + 49, + 19, +-21, + 19, + 27, + -5, + 32, + 35, + 3, + 53, + 48, + 18, + 37, + 32, + -8, + 48, + 38, + -5, + 78, + 61, + 33, + 95, + 89, + 76, +102, + 97, + 90, +101, + 95, + 85, +100, + 88, + 78, + 85, + 31, +-41, + 62, + 64, + 55, + 13, + 26, + 10, + 24, + 32, + 21, + 30, +-24, +-63, + 36, + 8, +-59, +-21, + 10, +-33, + 33, + 3, +-42, + 84, + 50, +-12, + 87, + 46, +-17, + 57, + 44, + 30, + 53, + 40, + 25, + 74, + 65, + 54, + 54, +-38, +-59, + 52, +-25, +-48, + 37, +-14, +-38, + 4, +-25, +-51, + -9, +-26, +-52, + 15, + -7, +-36, + 18, +-10, +-39, + 22, +-12, +-46, + 7, +-32, +-69, + 7, +-39, +-87, + 13, +-29, +-74, + 11, +-33, +-79, + 26, + -5, +-34, + 37, + 5, +-31, +-49, +-79, +-100, + 14, +-12, +-42, + 45, + 10, +-30, + 33, + -3, +-41, + 37, + -7, +-55, + 38, + -3, +-54, + 42, + -5, +-57, + 46, + 7, +-30, + 61, + 28, + -9, + 53, + 25, + -8, + 48, + 28, + 4, + 47, + 33, + 7, + 58, + 28, + 2, + 58, + 17, + -8, + 55, + 8, +-13, + 70, + 41, + 19, + 56, + 42, + 21, + 62, + 46, + 26, + 58, + 36, + 14, + 62, + 37, + 9, + 64, + 30, + -3, + 57, + 23, +-11, + 51, + 9, +-39, + 61, + 28, +-11, + 50, + 12, +-30, + 57, + 23, + -8, + 57, + 32, + 6, + 62, + 36, + 7, + 55, + 30, + 2, + 50, + 17, +-17, + 34, + -2, +-32, + 37, + 5, +-29, + 36, + -5, +-45, + 20, +-23, +-66, + 32, + -2, +-35, + 40, + 8, +-23, +-32, +-51, +-77, + -8, +-20, +-44, +-21, +-34, +-57, + -8, +-23, +-47, +-23, +-36, +-54, +-24, +-33, +-59, +-42, +-54, +-73, +-15, +-30, +-55, +-32, +-47, +-69, +-38, +-53, +-75, +-13, +-31, +-57, +-40, +-54, +-74, + 15, + -2, +-30, + 39, + 15, + -9, + 34, + 15, + -9, + 7, + 2, +-24, + 35, + 22, + 1, + -2, + -5, +-24, + 6, +-32, +-61, + 45, + 11, +-24, + 21, +-18, +-55, + 60, + 42, + 24, + 56, + 27, + -5, + 18, +-18, +-54, + 28, +-19, +-61, + 60, + 4, +-63, + 42, + -2, +-59, + 39, + 5, +-28, + 91, + 79, + 63, + 90, + 85, + 73, + 89, + 79, + 58, + 89, + 86, + 76, + 69, + 8, +-20, + 64, + 18, +-94, + 14, + 19, + 9, + 37, + 43, + 37, + 36, + 32, + 16, + 67, +-17, +-104, + -2, +-11, +-49, + 30, + 7, +-30, + 83, + 31, +-60, + 99, + 59, +-62, + 98, + 61, +-17, + 61, + 54, + 40, + 56, + 43, + 27, + 65, + 54, + 42, + 24, + 17, +-11, + 79, + 24, + 13, + 83, + -2, +-14, + 88, + 10, + -3, + 68, + 30, + 12, + 40, + 9, +-16, + 19, +-13, +-42, + 3, +-36, +-71, + 31, + 2, +-30, + 12, +-26, +-64, + 24, +-10, +-47, + 9, +-32, +-71, + -3, +-55, +-101, + 6, +-42, +-91, +-94, +-99, +-95, + -3, +-38, +-72, + 15, +-32, +-79, + 25, +-21, +-66, + 44, + 6, +-33, + 42, + 8, +-29, + 57, + 25, +-15, + 63, + 34, + 3, + 50, + 22, + -5, + 54, + 18, + -9, + 51, + 15, +-11, + 44, + 10, +-16, + 36, + 12, +-12, + 45, + 20, + -1, + 41, + 16, + -2, + 46, + 32, + 12, + 33, + 4, +-20, + 44, + 14, +-12, + 58, + 27, + 4, + 73, + 51, + 31, + 59, + 32, + 5, + 68, + 48, + 25, + 66, + 38, + 7, + 57, + 25, + -6, + 62, + 29, + -4, + 51, + 4, +-39, + 45, + -2, +-42, + 53, + 10, +-40, + 47, + 6, +-41, + 38, + -3, +-45, + 28, +-15, +-56, + 24, +-16, +-51, + 23, +-12, +-41, + 31, + -2, +-35, + 49, + 24, + -3, + 45, + 19, +-11, +-28, +-45, +-70, +-10, +-22, +-45, +-26, +-35, +-56, + 1, +-12, +-40, +-25, +-37, +-56, +-11, +-29, +-54, +-34, +-43, +-61, +-18, +-31, +-58, +-37, +-53, +-74, +-40, +-53, +-77, +-28, +-43, +-69, +-33, +-52, +-73, +-12, +-19, +-50, + 34, + 12, +-13, + 18, + 2, +-23, + 3, + -1, +-28, + 24, + 17, + -6, + -4, + -4, +-25, + -5, +-40, +-70, + 45, + 12, +-23, + 24, +-15, +-54, + 38, + 20, + 2, + 64, + 36, + 7, + 63, + 8, +-44, + 59, + 10, +-33, + 76, + 37, + -2, + 45, + 1, +-42, + 50, + 14, +-20, + 59, + 24, +-22, + 88, + 64, + 20, + 81, + 72, + 53, + 77, + 58, + 43, + 45, + 17, +-59, + 36, + 39, + 14, + 61, + 65, + 58, + 49, + 45, + 38, + 42, + 19, + -7, + 41, + 16, +-26, + 28, + 34, + -4, + 14, + 35, + 1, + 16, + 36, + 5, + 51, + 54, + 29, +-17, + 21, +-26, + 59, + 52, + 39, + 48, + 35, + 18, + 59, + 47, + 30, + 51, + 55, + 34, + 81, + 83, + 68, +103, + 97, + 85, +102, + 84, + 70, +100, + 66, + 58, +103, + 88, + 77, +100, + 89, + 73, + 66, + 49, + 30, + 9, +-22, +-55, + 11, +-31, +-73, + 12, +-28, +-72, + 23, +-21, +-63, + 22, +-20, +-65, + 20, +-26, +-71, +-78, +-87, +-86, + 5, +-30, +-59, + 43, + 2, +-42, + 43, + -2, +-56, + 41, + -3, +-49, + 50, + 10, +-34, + 52, + 17, +-23, + 65, + 39, + 8, + 58, + 28, + -6, + 62, + 34, + 11, + 47, + 12, +-13, + 20, +-11, +-37, + 36, + 21, + -4, + 61, + 35, + 13, + 49, + 17, + -3, + 65, + 33, + 8, + 32, + 12, +-15, + 36, + 1, +-28, + 50, + 21, + -7, + 60, + 31, + 9, + 69, + 45, + 15, + 64, + 39, + 10, + 74, + 54, + 28, + 66, + 30, + -9, + 59, + 22, +-19, + 46, + 3, +-40, + 48, + 6, +-37, + 47, + 4, +-41, + 56, + 14, +-35, + 54, + 11, +-38, + 49, + 9, +-31, + 40, + -1, +-42, + 20, +-20, +-58, + 33, + 0, +-35, + 45, + 21, + -4, + 16, +-18, +-46, +-29, +-46, +-71, +-12, +-23, +-43, +-25, +-33, +-58, +-15, +-28, +-52, +-29, +-38, +-58, +-14, +-28, +-49, +-34, +-44, +-65, +-24, +-36, +-57, +-43, +-57, +-78, +-36, +-50, +-76, +-31, +-45, +-70, +-47, +-64, +-85, +-19, +-21, +-55, + -4, +-12, +-40, + 0, +-12, +-36, +-19, +-16, +-41, + 8, + 8, +-17, + -7, + -6, +-28, +-13, +-45, +-74, + 40, + 6, +-27, + 29, + -8, +-46, + 24, + -1, +-21, + 90, + 66, + 40, + 59, + 23, +-12, + 68, + 33, + 0, + 73, + 43, + 15, + 89, + 63, + 38, + 71, + 46, + 20, + 50, + 1, +-77, + 90, + 51, +-44, + 92, + 63, + 15, + 17, + 12, +-44, +-49, + 2, +-33, + 1, + -3, +-27, + 31, +-12, +-60, + 51, + -2, +-67, + 62, + 19, +-25, + 62, + 29, + -8, + 61, + 35, + 5, + 49, + 30, + -1, + 47, + 32, + 3, + 51, + 42, + 17, + 5, + 27, +-10, + 52, + 46, + 31, + 52, + 38, + 22, + 68, + 54, + 38, + 58, + 58, + 40, + 86, + 86, + 77, +103, + 99, + 93, +104, + 99, + 93, +104, +100, + 91, +106, + 99, + 93, + 95, + 88, + 76, + 60, + 15, + -8, +-17, +-59, +-100, + 1, +-40, +-85, + 19, +-22, +-66, + 21, +-20, +-57, + 34, + -6, +-49, + 53, + 22, +-12, + 24, + -4, +-30, + 44, + 21, + -5, + 46, + 9, +-33, + 45, + 7, +-38, + 48, + 9, +-34, + 44, + 0, +-50, + 42, + -5, +-63, + 58, + 15, +-35, + 58, + 19, +-24, + 55, + 25, + -8, + 49, + 26, + 1, + 59, + 44, + 19, + 62, + 40, + 18, + 56, + 12, +-12, + 64, + 15, + -8, + 68, + 27, + 4, + 76, + 55, + 32, + 58, + 45, + 18, + 66, + 51, + 27, + 56, + 32, + 7, + 60, + 30, + -3, + 63, + 28, +-11, + 58, + 21, +-22, + 61, + 18, +-38, + 69, + 30, +-22, + 64, + 28, +-13, + 66, + 34, + -5, + 65, + 35, + 2, + 72, + 48, + 21, + 64, + 40, + 13, + 63, + 33, + 2, + 58, + 25, +-11, + 41, + 4, +-28, + 23, +-18, +-55, + 19, +-27, +-73, + 27, + -6, +-43, +-36, +-52, +-82, +-11, +-22, +-41, +-25, +-35, +-52, +-20, +-30, +-51, +-30, +-36, +-58, +-16, +-24, +-45, +-40, +-50, +-70, +-29, +-40, +-60, +-32, +-51, +-71, +-49, +-61, +-84, +-22, +-34, +-55, +-44, +-60, +-83, +-21, +-22, +-55, +-16, +-17, +-48, +-44, +-40, +-71, +-56, +-46, +-74, + -3, + 0, +-26, +-11, + -8, +-31, +-23, +-44, +-68, + 38, + 4, +-29, + 29, + -7, +-44, + 5, +-33, +-67, + 71, + 47, + 25, + 91, + 64, + 37, + 92, + 60, + 31, + 89, + 53, + 16, + 85, + 50, + 9, + 88, + 62, + 20, + 58, + 20, +-14, + 30, +-16, +-77, + 41, + -4, +-92, + 27, +-31, +-98, + 41, +-19, +-121, + 64, + 6, +-74, + 72, + 41, + 11, + 82, + 67, + 48, + 86, + 74, + 57, + 86, + 76, + 63, + 86, + 77, + 63, + 78, + 72, + 56, + 48, + 45, + 25, + 58, + 43, + 19, + 38, + 16, +-15, + 48, + 38, + 22, + 60, + 49, + 32, + 63, + 50, + 34, + 58, + 49, + 33, + 98, + 88, + 73, + 66, + 53, + 45, + 87, + 85, + 79, +103, + 99, + 93, +101, + 89, + 72, +100, + 52, + -8, + 74, + 16, + 9, + 3, +-35, +-70, +-10, +-49, +-89, + -1, +-34, +-70, + 16, +-16, +-47, + 41, + 10, +-20, + 44, + 23, + -1, +-10, +-40, +-65, + 36, + 12, +-14, + 57, + 29, + -2, + 51, + 18, +-13, + 51, + 18, +-21, + 50, + 10, +-32, + 55, + 16, +-25, + 49, + 3, +-50, + 52, + 11, +-31, + 54, + 18, +-18, + 51, + 2, +-53, + 48, + 7, +-30, + 67, + 45, + 21, + 54, + 14, +-32, + 71, + 44, + 7, + 63, + 32, + -5, + 53, + 10, +-38, + 78, + 60, + 33, + 47, + 5, +-31, + 60, + 13, +-38, + 57, + 22, +-12, + 67, + 30, +-10, + 60, + 17, +-35, + 67, + 30, +-12, + 68, + 33, + -5, + 72, + 47, + 16, + 57, + 26, + -4, + 72, + 48, + 22, + 70, + 54, + 36, + 55, + 43, + 27, + 72, + 55, + 34, + 51, + 21, + -5, + 66, + 41, + 17, + 60, + 26, +-16, + 37, + -1, +-37, + 25, + -8, +-43, +-45, +-59, +-84, +-27, +-40, +-62, +-27, +-36, +-54, +-30, +-40, +-62, +-22, +-35, +-56, +-30, +-43, +-61, +-30, +-41, +-62, +-29, +-40, +-60, +-46, +-59, +-79, +-46, +-57, +-80, +-36, +-51, +-74, +-53, +-68, +-90, +-36, +-36, +-67, +-10, +-13, +-43, +-41, +-36, +-65, +-103, +-70, +-104, +-15, +-10, +-35, +-15, +-11, +-35, +-36, +-47, +-69, + 36, + 3, +-31, + 33, + -4, +-40, + 29, + -6, +-33, + 54, + 17, +-15, + 58, + 24, + -8, + 48, + 11, +-21, + 69, + 40, + 14, + 83, + 62, + 37, + 64, + 34, + 8, + 57, + 11, +-21, + 52, + -9, +-80, + 54, +-15, +-128, + 65, + 3, +-128, + 75, + 36, + -6, + 80, + 49, + 30, + 88, + 57, + 41, + 86, + 58, + 44, + 85, + 63, + 50, + 87, + 67, + 56, + 87, + 73, + 61, + 56, + 59, + 42, + 78, + 77, + 64, + 93, + 88, + 78, + 81, + 76, + 67, + 25, + 20, + 7, + 51, + 46, + 31, + 61, + 46, + 28, + 57, + 41, + 23, + 65, +-33, +-43, + 44, +-64, +-66, + 2, +-66, +-68, + 59, + 32, + 3, +100, + 53, +-34, + 97, + 21, + 16, + 93, + 57, + 49, + 6, +-30, +-59, + 5, +-27, +-57, + 4, +-30, +-65, +-13, +-41, +-72, +-19, +-33, +-57, +-14, +-17, +-36, +-17, +-51, +-82, + -4, +-17, +-33, + 27, + 20, + 8, + 45, + 20, + -2, + 57, + 27, + -3, + 56, + 25, + -4, + 44, + 9, +-19, + 61, + 21, +-20, + 75, + 39, + -3, + 50, + 11, +-31, + 60, + 31, + 3, + 37, +-10, +-48, + 61, + 18, +-31, + 58, + 19, +-23, + 58, + 11, +-43, + 58, + 17, +-27, + 68, + 36, + -5, + 53, + 12, +-30, + 48, + 1, +-48, + 70, + 39, + 4, + 60, + 22, +-14, + 72, + 39, + -4, + 69, + 30, +-16, + 62, + 27, + -5, + 49, + 12, +-19, + 69, + 39, + 4, + 56, + 33, + 11, + 56, + 50, + 37, + 31, + 30, + 18, + 38, + 34, + 20, + 32, + 31, + 16, + 39, + 33, + 19, + 57, + 48, + 33, + 63, + 35, + 6, + 49, + 20, + -7, + 31, + 1, +-26, + 9, +-16, +-46, +-29, +-44, +-67, +-44, +-57, +-78, +-29, +-42, +-67, +-24, +-38, +-60, +-20, +-30, +-54, +-47, +-56, +-80, +-26, +-38, +-65, +-54, +-67, +-83, +-45, +-58, +-77, +-34, +-50, +-75, +-57, +-68, +-91, +-16, +-28, +-54, +-21, +-22, +-54, +-35, +-32, +-61, +-113, +-73, +-110, +-26, +-19, +-45, +-19, +-14, +-38, +-48, +-58, +-79, + 37, + 3, +-30, + 30, + -7, +-40, + 20, +-13, +-38, + 93, + 70, + 47, + 85, + 62, + 39, + 78, + 53, + 28, + 62, + 25, +-20, + 51, + 7, +-55, + 37, +-31, +-81, + 37, +-60, +-128, + 53, +-32, +-128, + 63, + -8, +-128, + 70, + 18, +-42, + 61, +-10, +-24, + 76, + -1, +-14, + 76, + 6, + -6, + 83, + 28, + 17, + 90, + 53, + 43, + 89, + 64, + 53, + 90, + 70, + 60, + 78, + 67, + 55, + 78, + 75, + 66, + 94, + 89, + 83, + 95, + 92, + 86, + 56, + 53, + 45, + 18, + 20, + 12, + 36, + 25, + 8, + 62, + 50, + 32, + 62, + 25, + 10, + 30, +-30, +-39, +-10, +-104, +-113, + 40, +-24, +-28, + 94, + 59, + 57, + 87, + 51, + 49, + 86, + 31, + 22, + 5, +-19, +-47, + 0, +-15, +-40, + -8, +-21, +-45, + 1, +-21, +-52, +-32, +-52, +-83, +-35, +-64, +-92, +-14, +-52, +-76, + 32, + -1, +-26, + 30, + 9, +-17, + 37, + 24, + -7, + 39, + 34, + 19, + 55, + 48, + 32, + 52, + 33, + 11, + 68, + 51, + 27, + 74, + 50, + 21, + 72, + 46, + 20, + 70, + 44, + 19, + 75, + 44, + 10, + 63, + 30, + -2, + 68, + 41, + 13, + 69, + 35, + -5, + 57, + 14, +-39, + 75, + 49, + 17, + 66, + 37, + 9, + 75, + 48, + 16, + 77, + 57, + 31, + 71, + 46, + 21, + 79, + 59, + 32, + 73, + 47, + 21, + 64, + 43, + 18, + 71, + 58, + 38, + 55, + 48, + 32, + 37, + 30, + 13, + 39, + 25, + -3, + 43, + 30, + 7, + 50, + 25, + -5, + 29, + 8, +-19, + 49, + 13, +-11, + 34, + 16, +-13, + 53, + 44, + 19, + 46, + 41, + 25, + 75, + 60, + 39, + 40, + 15, +-13, + 61, + 31, + -5, + 51, + 20, +-17, + 33, + 4, +-31, + -2, +-33, +-69, +-13, +-49, +-87, +-30, +-62, +-94, +-44, +-67, +-92, +-55, +-76, +-93, +-58, +-72, +-91, +-32, +-48, +-69, +-61, +-74, +-96, +-32, +-36, +-63, +-37, +-35, +-65, +-27, +-23, +-55, +-114, +-82, +-112, +-35, +-28, +-53, +-34, +-28, +-50, +-67, +-68, +-90, + 33, + 0, +-32, + 29, + -8, +-41, + 0, +-35, +-65, + 93, + 68, + 43, + 85, + 61, + 34, + 53, + 4, +-86, + 61, + 12, +-84, + 64, + 19, +-71, + 72, + 37, +-19, + 63, + 16, +-10, + 55, +-37, +-103, + 64, +-18, +-128, + 41, +-49, +-86, + 58, +-42, +-52, + 60, +-32, +-46, + 72, +-18, +-29, + 73, +-14, +-23, + 85, + 16, + 7, + 91, + 55, + 46, + 93, + 62, + 54, + 92, + 75, + 66, + 33, + 51, + 37, + 83, + 83, + 75, + 93, + 91, + 85, + 77, + 75, + 69, + -9, + -7, +-13, + -3, + -4, +-17, + 64, + 50, + 33, + 68, + 51, + 33, + 51, + 30, + 15, + 63, + 54, + 53, + 66, + 18, + 21, + 80, + 23, + 27, + 83, + 72, + 68, + 81, + 52, + 41, + 15, + -8, +-38, + 15, + -4, +-30, + 13, + -5, +-33, + 2, +-18, +-50, + -4, +-29, +-59, +-18, +-44, +-70, +-19, +-33, +-61, + 24, + -1, +-31, + 36, + 16, +-13, + 24, + 10, +-20, + 35, + 30, + 13, + 60, + 47, + 28, + 50, + 32, + 12, + 65, + 46, + 23, + 74, + 48, + 21, + 79, + 59, + 32, + 80, + 56, + 23, + 70, + 40, + 6, + 68, + 36, + 4, + 72, + 47, + 22, + 77, + 50, + 14, + 65, + 25, +-29, + 77, + 46, + 11, + 72, + 47, + 23, + 66, + 34, + -2, + 74, + 44, + 9, + 77, + 59, + 32, + 74, + 53, + 28, + 77, + 57, + 28, + 70, + 53, + 31, + 50, + 37, + 18, + 56, + 50, + 36, + 48, + 43, + 30, + 43, + 35, + 11, + 42, + 18, +-10, + 68, + 41, + 11, + 42, + 23, + -3, + 50, + 12, +-15, + 44, + 22, +-10, + 30, + 19, + -5, + 26, + 21, + 9, + 43, + 38, + 22, + 57, + 45, + 24, + 55, + 32, + 4, + 64, + 32, + -3, + 69, + 41, + 5, + 53, + 20, +-21, + 44, + 3, +-37, + 32, +-10, +-50, + 42, + 4, +-38, + 23, +-19, +-61, + 11, +-35, +-83, + 8, +-29, +-68, + -1, +-33, +-66, +-88, +-74, +-101, +-60, +-54, +-80, +-25, +-21, +-53, +-65, +-57, +-80, +-44, +-35, +-58, +-38, +-30, +-52, +-53, +-50, +-68, + 28, + -5, +-37, + 27, +-12, +-44, + 0, +-38, +-68, + 79, + 52, + 29, + 91, + 67, + 43, + 55, + 5, +-82, + 63, + 14, +-86, + 68, + 25, +-69, + 76, + 38, +-38, + 80, + 53, + 4, + 85, + 74, + 52, + 69, + 28, +-15, +-15, +-48, +-80, + 5, +-39, +-65, + 61, + 3, + -6, + 67, + 8, + -3, + 68, + 0, + -8, + 70, + -7, +-13, + 87, + 33, + 29, + 92, + 77, + 72, + 94, + 81, + 74, + 79, + 58, + 52, + 30, + 47, + 36, + 81, + 77, + 73, + 36, + 53, + 40, + 35, + 41, + 30, + -6, + -4, +-14, + 34, + 17, + -2, + 56, + 42, + 24, + 69, + 52, + 32, + 48, + 8, + -4, + 70, + 31, + 35, + 60, + 14, + 14, + 76, + 59, + 54, + 54, + 24, + 7, + 23, +-16, +-57, + 22, +-15, +-56, + 19, +-19, +-53, + 26, + 14, + -9, + 6, + 0, +-18, + 5, + 2, +-18, + 39, + 30, + 8, + 31, + 28, + 9, + 37, + 33, + 21, + 64, + 43, + 23, + 63, + 34, + 5, + 69, + 41, + 10, + 64, + 31, + -4, + 68, + 32, + -7, + 76, + 44, + 11, + 40, + -1, +-37, + 78, + 54, + 24, + 62, + 29, + -4, + 62, + 21, +-29, + 76, + 42, + -8, + 59, + 19, +-34, + 47, + 5, +-33, + 75, + 42, + -2, + 68, + 38, + 1, + 61, + 24, +-22, + 56, + 23, + -8, + 80, + 60, + 34, + 59, + 24, +-18, + 57, + 22, +-13, + 72, + 42, + 3, + 66, + 39, + 9, + 70, + 40, + 11, + 71, + 42, + 12, + 61, + 32, + 3, + 36, + 34, + 23, + 23, + 23, + 6, + 45, + 39, + 13, + 49, + 44, + 17, + 29, + 29, + 8, + 39, + 35, + 20, + 51, + 27, + 0, + 73, + 52, + 24, + 61, + 33, + 3, + 58, + 26, + -8, + 70, + 37, + -4, + 48, + 10, +-30, + 33, +-10, +-49, + 55, + 20, +-16, + 25, +-19, +-60, + 28, +-17, +-58, + 39, + -2, +-43, + 34, +-10, +-59, + 27, +-19, +-67, + 18, +-28, +-71, +-47, +-45, +-74, +-92, +-77, +-102, +-41, +-34, +-61, +-38, +-32, +-58, +-57, +-47, +-66, +-42, +-34, +-54, +-56, +-48, +-62, + 18, +-15, +-47, + 27, +-13, +-44, + 4, +-35, +-67, + 65, + 38, + 16, + 91, + 68, + 45, + 58, + 8, +-65, + 66, + 19, +-97, + 73, + 30, +-81, + 80, + 40, +-46, + 80, + 44, +-28, + 80, + 48, +-15, + 35, + 24, +-22, +-10, + 8, +-15, + 11, + 27, + 5, + 24, + 30, + 16, + 80, + 75, + 63, + 83, + 78, + 67, + 87, + 78, + 70, + 85, + 77, + 71, + 85, + 80, + 77, + 87, + 81, + 78, + 55, + 62, + 56, + 18, + 36, + 28, + 60, + 50, + 50, + -6, + 25, + 4, + 65, + 70, + 63, + 28, + 34, + 26, + -1, + -6, +-17, + 45, + 29, + 12, + 54, + 40, + 24, + 59, + 34, + 14, + 41, +-29, +-30, + 48, + 40, + 37, + 39, +-12, +-17, + 46, + 9, +-32, + 25, +-16, +-65, + 22, +-22, +-67, + 33, + -3, +-42, + 21, +-17, +-49, + 51, + 30, + 3, + 39, + 28, + 10, + 50, + 41, + 27, + 68, + 53, + 31, + 59, + 35, + 7, + 67, + 36, + 6, + 62, + 19, +-31, + 64, + 23, +-22, + 72, + 39, + 2, + 75, + 37, +-22, + 67, + 32, + -4, + 71, + 46, + 15, + 73, + 38, +-11, + 57, + 4, +-55, + 67, + 39, + 12, + 68, + 39, + 3, + 54, + 16, +-23, + 63, + 29, + -3, + 58, + 24, +-13, + 58, + 21, +-19, + 77, + 54, + 26, + 51, + 7, +-39, + 62, + 16, +-44, + 67, + 31, + -8, + 71, + 43, + 9, + 60, + 19, +-28, + 72, + 40, + -4, + 67, + 35, + -7, + 64, + 26, +-21, + 67, + 35, + -3, + 66, + 42, + 15, + 70, + 46, + 23, + 68, + 59, + 40, + 34, + 34, + 23, + 57, + 46, + 28, + 70, + 43, + 14, + 59, + 24, + -9, + 66, + 30, +-16, + 60, + 18, +-31, + 63, + 30, +-11, + 65, + 25, +-31, + 60, + 23, +-23, + 57, + 20, +-22, + 53, + 13, +-36, + 41, + -3, +-58, + 48, + 12, +-24, + 49, + 14, +-25, + 42, + 2, +-44, + 35, + -7, +-54, + 17, +-29, +-68 +}; diff --git a/examples/app_flash_single_model/src/image2.h b/examples/app_flash_single_model/src/image2.h new file mode 100644 index 000000000..4daa44d76 --- /dev/null +++ b/examples/app_flash_single_model/src/image2.h @@ -0,0 +1,27650 @@ +int8_t image2[96*96*3] = { +122, +122, +122, +122, +122, +122, +122, +122, +122, +121, +121, +121, +123, +123, +123, +124, +124, +124, +122, +122, +122, +122, +122, +122, +119, +119, +119, +118, +118, +118, +123, +123, +123, +121, +121, +121, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +122, +122, +122, +120, +120, +120, +121, +121, +121, +124, +122, +123, +125, +122, +123, +125, +122, +123, +124, +121, +122, +124, +121, +122, +123, +121, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +125, +120, +122, +125, +120, +122, +121, +122, +122, +120, +123, +123, +121, +122, +124, +124, +122, +124, +120, +122, +121, +120, +122, +121, +122, +122, +120, +125, +124, +121, +124, +123, +118, +123, +120, +117, +117, +113, +113, +115, +111, +111, +116, +112, +112, +117, +113, +113, +120, +117, +117, +123, +121, +122, +121, +121, +124, +122, +121, +123, +119, +119, +120, +119, +119, +119, +123, +121, +121, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +122, +121, +121, +121, +118, +119, +123, +120, +121, +123, +120, +121, +123, +120, +121, +124, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +122, +121, +121, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +118, +118, +118, +117, +117, +117, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +113, +113, +113, +116, +116, +116, +119, +117, +118, +119, +117, +118, +119, +116, +117, +118, +115, +116, +118, +115, +116, +118, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +119, +115, +116, +117, +116, +116, +113, +118, +116, +111, +115, +114, +116, +117, +118, +117, +114, +116, +118, +115, +114, +107, +105, +102, + 92, + 88, + 85, + 80, + 75, + 71, + 68, + 62, + 56, + 68, + 60, + 55, + 46, + 36, + 32, + 29, + 19, + 14, + 33, + 23, + 18, + 38, + 28, + 24, + 54, + 45, + 40, + 85, + 76, + 73, +104, + 98, + 96, +117, +112, +111, +120, +117, +116, +119, +117, +118, +116, +116, +117, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +117, +116, +116, +113, +111, +111, +119, +117, +118, +119, +116, +117, +118, +115, +116, +118, +115, +116, +119, +116, +117, +120, +117, +118, +120, +117, +118, +117, +115, +115, +117, +114, +115, +117, +114, +115, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +117, +117, +116, +116, +116, +114, +114, +114, +113, +113, +113, +116, +116, +116, +117, +117, +117, +116, +116, +116, +115, +115, +115, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +114, +114, +114, +110, +110, +110, +108, +108, +108, +115, +113, +114, +116, +114, +114, +116, +114, +114, +119, +116, +117, +119, +116, +117, +118, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +117, +117, +114, +118, +117, +112, +119, +117, +113, +119, +115, +114, +113, +111, +106, + 99, + 97, + 77, + 68, + 64, + 59, + 50, + 45, + 58, + 47, + 41, + 44, + 32, + 25, + 33, + 19, + 11, + 25, + 9, + 0, + 7, +-12, +-21, + 4, +-15, +-24, + 11, + -9, +-18, + 2, +-17, +-26, + 9, +-10, +-20, + 14, + -3, +-12, + 30, + 16, + 8, + 60, + 48, + 43, + 87, + 79, + 76, +108, +103, +103, +116, +114, +116, +118, +115, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +116, +116, +116, +113, +114, +116, +114, +115, +119, +116, +117, +118, +116, +117, +118, +116, +117, +118, +115, +116, +118, +115, +116, +117, +115, +116, +116, +113, +114, +115, +112, +113, +115, +112, +113, +113, +113, +113, +115, +115, +115, +117, +117, +117, +118, +118, +118, +118, +118, +118, +112, +112, +112, +115, +115, +115, +117, +117, +117, +119, +119, +119, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +119, +116, +117, +120, +117, +118, +116, +114, +114, +118, +115, +116, +118, +115, +116, +118, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +117, +117, +117, +117, +117, +117, +115, +116, +117, +115, +119, +119, +116, +120, +117, +113, +113, +110, + 84, + 75, + 72, + 57, + 41, + 38, + 43, + 25, + 19, + 33, + 14, + 7, + 20, + 0, + -7, + 23, + 1, + -8, + 6, +-17, +-26, +-12, +-36, +-47, +-22, +-49, +-60, +-16, +-43, +-55, + -5, +-32, +-43, + -9, +-36, +-48, +-13, +-40, +-51, +-11, +-36, +-47, +-11, +-33, +-43, +-14, +-33, +-41, + -2, +-17, +-22, + 32, + 21, + 19, + 92, + 83, + 82, +120, +115, +116, +121, +118, +119, +119, +116, +117, +119, +116, +117, +118, +115, +116, +118, +115, +116, +117, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +117, +116, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +117, +118, +118, +116, +117, +117, +114, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +116, +116, +116, +112, +112, +112, +114, +114, +114, +115, +115, +115, +115, +115, +115, +113, +113, +113, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +115, +115, +115, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +118, +115, +116, +118, +116, +117, +115, +112, +113, +118, +115, +116, +118, +115, +116, +117, +115, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +119, +116, +116, +118, +118, +116, +115, + 93, + 85, + 83, + 52, + 32, + 29, + 48, + 20, + 18, + 36, + 11, + 4, + 17, + -9, +-17, + 31, + 4, + -5, + 13, +-14, +-25, + 6, +-24, +-36, +-15, +-44, +-57, +-11, +-39, +-50, + 11, +-17, +-28, + 28, + -1, +-12, + 22, + -7, +-18, + 3, +-26, +-36, +-16, +-42, +-52, +-33, +-55, +-64, +-24, +-46, +-55, +-23, +-44, +-53, +-15, +-35, +-43, + 13, + -6, +-13, + 95, + 89, + 88, +118, +115, +116, +119, +117, +117, +119, +116, +117, +120, +117, +118, +119, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +117, +116, +116, +118, +116, +116, +118, +116, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +115, +116, +117, +114, +115, +115, +112, +113, +116, +114, +114, +117, +114, +115, +117, +114, +115, +116, +115, +116, +111, +111, +110, +112, +112, +111, +113, +113, +112, +114, +113, +113, +114, +113, +113, +108, +107, +107, +111, +110, +110, +115, +114, +114, +115, +114, +114, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +114, +114, +114, +114, +114, +114, +114, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +116, +116, +117, +116, +116, +117, +116, +116, +116, +115, +116, +116, +116, +116, +117, +116, +116, +116, +113, +114, +117, +114, +115, +114, +111, +112, +115, +112, +113, +115, +112, +113, +114, +112, +113, +113, +113, +112, +113, +113, +112, +114, +113, +113, +114, +114, +113, +114, +114, +114, +114, +114, +113, +114, +114, +113, +114, +114, +113, +116, +115, +115, +116, +115, +115, +116, +115, +115, +117, +114, +116, +116, +112, +114, +105, + 99, + 98, + 62, + 49, + 47, + 56, + 30, + 29, + 43, + 10, + 7, + 17, +-13, +-22, + 6, +-23, +-36, + -3, +-34, +-49, + 11, +-22, +-37, + 28, + -5, +-18, + 31, + 1, +-11, + 45, + 19, + 8, + 67, + 41, + 31, + 69, + 44, + 33, + 59, + 31, + 20, + 39, + 11, + -3, + 0, +-27, +-40, +-18, +-41, +-52, +-20, +-41, +-51, +-34, +-56, +-64, +-22, +-44, +-52, + -7, +-30, +-41, + 18, + 8, + 5, + 98, + 92, + 91, +117, +113, +112, +118, +115, +115, +118, +115, +115, +118, +114, +115, +116, +115, +115, +116, +115, +115, +115, +115, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +114, +114, +113, +113, +112, +112, +113, +112, +112, +113, +112, +112, +114, +111, +111, +114, +111, +111, +113, +110, +111, +112, +110, +110, +112, +110, +110, +113, +111, +111, +113, +110, +111, +112, +109, +110, +113, +110, +111, +113, +111, +111, +113, +111, +111, +112, +111, +111, +114, +112, +110, +114, +112, +110, +114, +112, +110, +113, +111, +109, +115, +113, +111, +111, +109, +107, +113, +111, +110, +114, +112, +110, +114, +112, +110, +114, +112, +111, +114, +112, +111, +114, +112, +111, +115, +113, +111, +115, +113, +111, +114, +113, +112, +113, +113, +113, +113, +113, +113, +112, +112, +112, +112, +112, +112, +114, +114, +114, +116, +114, +114, +116, +113, +114, +116, +113, +114, +115, +112, +113, +114, +111, +112, +113, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +112, +111, +114, +112, +111, +115, +113, +112, +115, +113, +111, +116, +114, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +116, +114, +113, +117, +115, +113, +117, +115, +113, +120, +115, +114, +110, +104, +105, + 53, + 46, + 48, + 77, + 61, + 63, + 71, + 46, + 45, + 50, + 16, + 11, + 30, + -5, +-16, + 17, +-19, +-38, + 25, +-13, +-38, + 39, + 3, +-19, + 61, + 28, + 15, + 69, + 40, + 31, + 76, + 52, + 39, + 78, + 55, + 44, + 80, + 56, + 43, + 74, + 46, + 29, + 60, + 25, + 4, + 21, +-10, +-32, +-28, +-50, +-68, +-26, +-44, +-55, +-29, +-43, +-50, +-36, +-50, +-55, +-38, +-55, +-61, +-30, +-49, +-57, + 25, + 12, + 5, +105, + 99, + 92, +117, +115, +111, +118, +114, +114, +120, +113, +115, +118, +115, +114, +116, +114, +113, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +113, +111, +110, +113, +111, +110, +113, +111, +110, +112, +110, +109, +112, +110, +109, +111, +109, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +112, +110, +109, +113, +111, +110, +113, +111, +110, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +110, +108, +106, +110, +108, +106, +110, +108, +106, +112, +110, +108, +111, +109, +108, +106, +104, +102, +106, +104, +102, +111, +109, +108, +113, +111, +109, +114, +112, +110, +114, +112, +110, +115, +113, +111, +116, +114, +112, +116, +114, +112, +115, +114, +113, +114, +114, +114, +114, +114, +114, +113, +113, +113, +113, +113, +113, +115, +115, +115, +117, +115, +116, +118, +115, +116, +118, +115, +116, +111, +108, +109, +113, +110, +111, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +117, +114, +115, +117, +114, +115, +117, +115, +115, +117, +115, +113, +117, +115, +113, +118, +116, +114, +115, +113, +112, +116, +114, +113, +117, +115, +114, +116, +114, +113, +116, +114, +113, +117, +115, +114, +117, +115, +114, +117, +115, +114, +116, +114, +114, + 75, + 71, + 74, + 59, + 49, + 53, + 85, + 67, + 69, + 65, + 39, + 35, + 52, + 18, + 9, + 42, + -3, +-17, + 40, + -8, +-27, + 50, + 4, +-21, + 62, + 21, + -3, + 69, + 34, + 16, + 76, + 46, + 32, + 83, + 55, + 42, + 79, + 52, + 40, + 74, + 47, + 34, + 76, + 45, + 30, + 66, + 29, + 9, + 26, + -8, +-29, +-43, +-66, +-84, +-56, +-73, +-85, +-46, +-59, +-66, +-45, +-57, +-62, +-45, +-59, +-64, +-52, +-68, +-74, +-37, +-49, +-56, + 58, + 51, + 46, +113, +110, +106, +118, +115, +115, +119, +114, +115, +115, +112, +111, +113, +111, +110, +112, +110, +109, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +112, +115, +113, +112, +114, +112, +111, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +107, +109, +107, +105, +108, +106, +105, +109, +107, +105, +111, +109, +107, +112, +110, +108, +110, +108, +106, +111, +109, +107, +113, +111, +109, +115, +113, +111, +114, +112, +110, +114, +112, +110, +115, +113, +111, +117, +115, +113, +117, +115, +113, +116, +115, +114, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +116, +117, +119, +116, +117, +119, +116, +117, +117, +115, +116, +118, +116, +117, +120, +117, +118, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +116, +116, +119, +117, +115, +119, +117, +115, +119, +117, +116, +115, +113, +111, +116, +114, +113, +118, +115, +114, +117, +115, +114, +117, +115, +114, +118, +116, +114, +118, +116, +114, +118, +116, +114, +111, +109, +111, + 50, + 44, + 48, + 87, + 72, + 76, + 72, + 48, + 48, + 67, + 35, + 27, + 58, + 21, + 6, + 57, + 1, +-18, + 58, + 0, +-23, + 61, + 7, +-20, + 63, + 16, +-10, + 71, + 32, + 9, + 75, + 41, + 20, + 81, + 46, + 29, + 78, + 45, + 30, + 72, + 40, + 26, + 75, + 40, + 23, + 63, + 24, + 3, + 32, + -2, +-26, +-32, +-54, +-75, +-69, +-85, +-100, +-63, +-74, +-81, +-46, +-54, +-59, +-41, +-51, +-55, +-37, +-46, +-51, +-21, +-30, +-34, + 19, + 12, + 9, + 97, + 92, + 90, +115, +111, +111, +114, +110, +111, +114, +111, +110, +113, +111, +109, +112, +110, +108, +113, +110, +109, +113, +111, +109, +113, +111, +109, +111, +109, +107, +111, +109, +108, +113, +111, +110, +116, +114, +112, +116, +114, +112, +115, +113, +111, +114, +112, +110, +114, +112, +110, +113, +111, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +111, +109, +107, +110, +108, +107, +110, +108, +107, +111, +109, +108, +107, +105, +103, +106, +104, +103, +106, +104, +103, +108, +106, +105, +108, +106, +105, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +108, +107, +112, +110, +108, +112, +110, +108, +112, +111, +110, +112, +112, +112, +112, +112, +112, +113, +113, +113, +113, +113, +113, +113, +113, +113, +116, +114, +115, +116, +114, +115, +116, +114, +115, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +115, +112, +113, +117, +115, +116, +117, +115, +115, +117, +115, +114, +117, +115, +114, +117, +115, +114, +115, +113, +112, +115, +113, +111, +117, +115, +113, +116, +114, +113, +116, +114, +113, +116, +114, +112, +116, +114, +113, +116, +114, +112, + 89, + 85, + 85, + 73, + 61, + 63, + 81, + 57, + 58, + 65, + 31, + 24, + 55, + 15, + -2, + 49, + 7, +-21, + 57, + 2, +-28, + 60, + 2, +-28, + 65, + 8, +-22, + 63, + 12, +-18, + 62, + 20, + -9, + 70, + 31, + 2, + 78, + 37, + 11, + 72, + 35, + 12, + 70, + 35, + 14, + 73, + 36, + 12, + 67, + 26, + -1, + 46, + 11, +-17, +-19, +-41, +-64, +-63, +-79, +-95, +-57, +-64, +-72, + -9, +-14, +-19, + -8, +-15, +-18, +-32, +-36, +-38, + -1, + -5, + -6, + 7, + 0, + -1, + 75, + 68, + 68, +113, +109, +108, +111, +110, +108, +112, +110, +109, +113, +111, +109, +112, +110, +108, +110, +108, +106, +109, +107, +105, +110, +108, +106, +107, +105, +103, +107, +105, +103, +109, +107, +106, +110, +108, +107, +110, +108, +107, +111, +108, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +108, +106, +105, +108, +106, +104, +108, +106, +104, +107, +105, +103, +112, +110, +108, +111, +109, +108, +111, +109, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +114, +111, +110, +114, +111, +110, +113, +112, +112, +113, +113, +113, +113, +113, +113, +114, +114, +114, +114, +114, +114, +114, +114, +114, +115, +112, +113, +115, +112, +113, +115, +112, +113, +116, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +116, +114, +114, +111, +108, +109, +116, +114, +112, +116, +114, +112, +115, +113, +112, +117, +115, +113, +114, +112, +111, +116, +114, +112, +115, +113, +112, +115, +113, +112, +114, +112, +111, +114, +112, +111, +113, +111, +110, + 69, + 61, + 58, + 79, + 62, + 59, + 61, + 28, + 23, + 53, + 8, + -5, + 49, + -1, +-27, + 49, + -1, +-38, + 51, + 1, +-38, + 56, + 3, +-34, + 59, + 5, +-29, + 59, + 7, +-26, + 58, + 12, +-21, + 63, + 21, +-15, + 67, + 24, +-13, + 61, + 21, +-13, + 69, + 32, + 1, + 69, + 31, + 0, + 61, + 20, +-14, + 38, + 3, +-29, +-20, +-43, +-68, +-58, +-72, +-89, +-69, +-76, +-85, +-68, +-71, +-75, +-31, +-34, +-36, + -8, + -8, + -9, + -7, + -8, + -8, + 12, + 5, + 7, + 60, + 51, + 52, +114, +109, +108, +113, +112, +110, +114, +112, +111, +114, +112, +111, +114, +112, +110, +111, +109, +107, +111, +109, +107, +112, +110, +108, +113, +111, +109, +112, +110, +109, +113, +110, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +109, +108, +110, +110, +108, +110, +110, +108, +112, +110, +109, +112, +109, +109, +112, +109, +109, +112, +110, +110, +112, +110, +110, +112, +110, +110, +113, +111, +111, +113, +111, +111, +114, +111, +111, +114, +111, +111, +114, +111, +111, +114, +112, +112, +114, +113, +113, +114, +113, +113, +115, +114, +114, +115, +114, +114, +115, +114, +114, +114, +112, +113, +114, +112, +112, +114, +112, +112, +117, +114, +115, +117, +114, +115, +117, +114, +115, +114, +112, +113, +114, +112, +113, +115, +112, +113, +117, +114, +115, +118, +115, +116, +115, +112, +112, +117, +115, +113, +117, +115, +113, +116, +114, +113, +115, +113, +112, +115, +113, +112, +116, +113, +111, +117, +112, +111, +115, +113, +111, +113, +113, +111, +114, +112, +110, +111, +108, +107, + 74, + 64, + 63, + 65, + 42, + 38, + 48, + 6, + -3, + 47, + -7, +-26, + 50, + -5, +-34, + 48, + -2, +-37, + 46, + 1, +-40, + 49, + 2, +-37, + 53, + 2, +-35, + 57, + 5, +-31, + 60, + 8, +-27, + 57, + 8, +-30, + 59, + 11, +-31, + 60, + 16, +-25, + 64, + 22, +-17, + 61, + 21, +-19, + 56, + 14, +-27, + 36, + 0, +-36, + -9, +-33, +-60, +-39, +-55, +-74, +-34, +-41, +-51, +-50, +-53, +-60, +-43, +-45, +-49, + -8, + -5, +-10, +-33, +-35, +-37, + 6, + -3, + -2, + 56, + 46, + 47, +111, +106, +104, +113, +112, +109, +114, +112, +110, +114, +112, +110, +114, +112, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +114, +112, +110, +113, +111, +109, +113, +111, +109, +112, +110, +109, +112, +110, +108, +112, +110, +109, +112, +110, +108, +112, +110, +108, +111, +109, +107, +110, +108, +107, +109, +107, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +110, +110, +110, +110, +111, +108, +110, +111, +108, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +111, +108, +109, +111, +108, +109, +115, +112, +113, +114, +111, +112, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +118, +115, +116, +118, +115, +116, +118, +115, +116, +116, +113, +114, +116, +113, +114, +116, +114, +115, +118, +115, +116, +118, +115, +116, +117, +115, +115, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +111, +115, +113, +111, +119, +113, +112, +120, +113, +113, +116, +115, +113, +114, +114, +112, +116, +114, +112, +104, + 98, + 98, + 64, + 52, + 53, + 59, + 33, + 29, + 44, + -2, +-17, + 48, + -9, +-33, + 50, + -5, +-33, + 47, + 0, +-30, + 46, + 1, +-37, + 49, + 2, +-36, + 52, + 3, +-34, + 57, + 5, +-32, + 63, + 9, +-27, + 62, + 8, +-29, + 60, + 9, +-33, + 59, + 9, +-33, + 60, + 13, +-30, + 59, + 15, +-29, + 57, + 14, +-31, + 34, + -3, +-41, +-16, +-43, +-71, +-40, +-58, +-78, +-46, +-55, +-68, +-38, +-43, +-51, +-60, +-63, +-71, +-34, +-33, +-41, +-25, +-27, +-33, +-19, +-27, +-31, + 30, + 21, + 19, +104, + 98, + 96, +112, +110, +107, +115, +113, +111, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +113, +111, +110, +113, +110, +109, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +109, +107, +106, +110, +108, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +107, +105, +104, +110, +110, +110, +110, +111, +108, +110, +111, +108, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +111, +108, +109, +110, +107, +108, +113, +110, +111, +113, +110, +111, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +117, +114, +115, +117, +115, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +118, +115, +116, +117, +115, +115, +117, +115, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +117, +115, +115, +116, +114, +112, +116, +114, +112, +115, +113, +111, +114, +112, +110, +114, +112, +110, +116, +111, +111, +117, +112, +112, +114, +114, +112, +112, +112, +110, +117, +114, +112, +101, + 93, + 93, + 67, + 52, + 51, + 66, + 40, + 31, + 58, + 13, + -5, + 56, + 1, +-25, + 53, + -1, +-30, + 47, + -1, +-31, + 47, + 3, +-34, + 52, + 7, +-31, + 56, + 10, +-28, + 60, + 11, +-25, + 62, + 13, +-24, + 61, + 11, +-28, + 59, + 9, +-35, + 60, + 10, +-34, + 61, + 13, +-32, + 62, + 14, +-31, + 60, + 13, +-32, + 39, + -2, +-41, +-16, +-47, +-75, +-41, +-62, +-83, +-56, +-69, +-83, +-52, +-58, +-69, +-65, +-70, +-80, +-58, +-60, +-70, +-56, +-61, +-69, +-30, +-40, +-45, + 16, + 6, + 4, +102, + 96, + 94, +106, +104, +102, +114, +112, +110, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +113, +111, +109, +113, +110, +109, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +109, +107, +106, +110, +108, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +106, +104, +103, +110, +110, +109, +110, +111, +108, +110, +111, +108, +112, +110, +111, +113, +110, +111, +113, +110, +111, +112, +109, +110, +107, +105, +105, +112, +110, +110, +111, +108, +109, +111, +108, +109, +112, +109, +110, +114, +112, +112, +114, +112, +112, +114, +111, +112, +114, +111, +112, +115, +113, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +114, +114, +116, +114, +114, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +115, +116, +118, +115, +116, +117, +114, +115, +117, +115, +115, +115, +113, +112, +117, +115, +113, +117, +115, +114, +117, +115, +113, +117, +115, +113, +117, +113, +112, +116, +113, +112, +114, +115, +112, +115, +116, +113, +117, +112, +111, +101, + 91, + 92, + 62, + 43, + 39, + 50, + 21, + 8, + 53, + 11, +-13, + 54, + 3, +-28, + 54, + 4, +-27, + 52, + 3, +-26, + 55, + 10, +-26, + 55, + 11, +-26, + 57, + 13, +-24, + 60, + 16, +-21, + 62, + 18, +-19, + 59, + 14, +-24, + 60, + 13, +-31, + 59, + 12, +-32, + 60, + 14, +-30, + 61, + 14, +-30, + 61, + 14, +-30, + 50, + 7, +-32, + 1, +-32, +-64, +-37, +-61, +-85, +-58, +-73, +-90, +-71, +-81, +-94, +-81, +-90, +-102, +-68, +-74, +-87, +-56, +-65, +-75, +-39, +-51, +-57, + 18, + 8, + 5, +108, +101, +100, +111, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +106, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +105, +108, +106, +105, +108, +106, +105, +109, +107, +105, +108, +108, +108, +108, +109, +106, +109, +109, +107, +112, +109, +110, +112, +109, +110, +112, +109, +110, +109, +106, +107, +103, +100, +101, +111, +108, +109, +111, +109, +110, +111, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +113, +110, +111, +109, +106, +107, +112, +110, +111, +114, +111, +112, +113, +110, +111, +113, +110, +111, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +115, +112, +113, +115, +112, +113, +116, +113, +114, +116, +113, +114, +117, +114, +115, +111, +109, +109, +114, +111, +112, +114, +112, +112, +114, +112, +110, +114, +112, +110, +114, +112, +111, +113, +111, +110, +113, +111, +110, +113, +111, +110, +112, +112, +109, +110, +112, +109, +110, +111, +109, +116, +110, +109, +101, + 88, + 90, + 56, + 33, + 27, + 34, + 3, +-14, + 34, + -4, +-34, + 46, + 0, +-35, + 49, + 2, +-33, + 46, + -2, +-33, + 45, + 0, +-34, + 44, + 1, +-34, + 47, + 5, +-30, + 56, + 16, +-20, + 55, + 17, +-20, + 55, + 17, +-20, + 63, + 24, +-16, + 62, + 23, +-18, + 57, + 16, +-24, + 58, + 16, +-24, + 59, + 15, +-24, + 56, + 14, +-24, + 30, + -6, +-40, +-23, +-50, +-77, +-52, +-70, +-90, +-68, +-81, +-97, +-77, +-88, +-103, +-69, +-79, +-94, +-59, +-70, +-84, +-44, +-58, +-67, + 27, + 15, + 12, +108, +101, +100, +108, +107, +107, +109, +107, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +108, +106, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +107, +105, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +105, +105, +105, +106, +103, +105, +106, +104, +111, +108, +109, +111, +108, +109, +111, +108, +109, +110, +108, +108, +110, +107, +108, +110, +107, +108, +109, +106, +107, +109, +106, +107, +110, +107, +108, +111, +108, +109, +111, +108, +109, +111, +108, +109, +109, +106, +107, +112, +109, +110, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +111, +111, +113, +111, +111, +113, +110, +111, +112, +109, +110, +112, +109, +110, +112, +109, +110, +107, +105, +106, +110, +108, +109, +113, +111, +111, +112, +110, +108, +111, +109, +107, +110, +108, +106, +111, +109, +107, +111, +109, +107, +110, +110, +108, +110, +111, +109, +109, +112, +109, +111, +110, +108, +111, +103, +103, + 47, + 32, + 35, + 2, +-23, +-31, + 2, +-29, +-49, + 22, +-15, +-48, + 36, + -7, +-46, + 41, + -6, +-41, + 39, + -9, +-41, + 37, + -7, +-40, + 37, + -5, +-39, + 27, +-13, +-47, + 22, +-15, +-50, + 26, + -9, +-45, + 30, + -3, +-39, + 36, + 5, +-32, + 50, + 18, +-18, + 53, + 18, +-17, + 56, + 18, +-16, + 57, + 17, +-16, + 59, + 17, +-18, + 49, + 10, +-25, + -7, +-36, +-64, +-50, +-70, +-91, +-63, +-78, +-95, +-70, +-83, +-100, +-73, +-85, +-103, +-63, +-77, +-92, +-33, +-49, +-59, + 29, + 17, + 13, +108, +101, +100, +105, +104, +103, +107, +105, +104, +107, +105, +104, +107, +105, +104, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +104, +102, +101, +103, +101, +100, +103, +101, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, +103, +101, +100, +103, +101, +100, +103, +101, + 99, +107, +106, +106, +108, +106, +104, +108, +106, +103, +110, +108, +107, +110, +108, +107, +110, +108, +107, +111, +109, +108, +111, +109, +108, +110, +108, +107, +109, +107, +107, +109, +107, +107, +110, +108, +107, +111, +109, +108, +110, +107, +106, +109, +107, +106, +107, +105, +104, +112, +109, +109, +111, +109, +108, +112, +110, +108, +113, +110, +110, +113, +110, +110, +113, +110, +110, +113, +110, +110, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +108, +111, +109, +108, +112, +110, +109, +114, +112, +110, +112, +110, +108, +110, +108, +107, +111, +109, +107, +112, +110, +108, +113, +111, +109, +111, +112, +108, +112, +111, +109, +115, +109, +110, +111, +110, +110, +109, +108, +104, + 45, + 32, + 28, +-12, +-31, +-42, +-32, +-52, +-71, +-25, +-49, +-77, + 9, +-22, +-56, + 32, + -9, +-44, + 40, + -9, +-41, + 35, + -7, +-39, + 24, +-15, +-48, + 3, +-34, +-67, + -9, +-43, +-78, + -4, +-36, +-69, + 9, +-22, +-54, + 17, +-15, +-45, + 34, + -1, +-33, + 48, + 11, +-23, + 53, + 16, +-18, + 55, + 20, +-13, + 58, + 19, +-15, + 49, + 10, +-25, +-10, +-38, +-67, +-49, +-66, +-90, +-58, +-73, +-93, +-60, +-79, +-97, +-49, +-77, +-91, + 15, +-24, +-38, + 27, +-10, +-23, + 40, + 33, + 28, +106, +106, +106, +115, +107, +107, +108, +105, +104, +110, +108, +106, +110, +108, +107, +109, +107, +106, +109, +107, +106, +108, +106, +105, +105, +103, +101, +106, +104, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +104, +105, +103, +102, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +105, +103, +101, +102, +100, + 99, +102, +100, + 99, +102, +100, + 98, +100, + 98, + 96, +109, +106, +107, +109, +107, +105, +109, +107, +104, +109, +108, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +107, +109, +107, +105, +101, + 99, + 97, +112, +110, +109, +112, +110, +108, +112, +110, +108, +114, +112, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +114, +112, +110, +114, +112, +110, +112, +109, +108, +108, +106, +104, +113, +111, +109, +115, +113, +112, +110, +112, +108, +113, +110, +109, +117, +108, +111, +112, +112, +112, +113, +114, +109, + 62, + 49, + 44, +-29, +-50, +-60, +-46, +-66, +-81, +-15, +-38, +-58, +-30, +-61, +-85, + 9, +-32, +-60, + 38, +-12, +-41, + 38, + -4, +-43, + 16, +-22, +-62, +-15, +-50, +-86, +-30, +-61, +-94, +-14, +-42, +-72, + 4, +-24, +-53, + 30, + -2, +-35, + 49, + 12, +-24, + 50, + 11, +-28, + 51, + 14, +-24, + 55, + 21, +-14, + 60, + 21, +-14, + 48, + 8, +-26, +-11, +-39, +-68, +-50, +-69, +-94, +-51, +-71, +-93, +-45, +-70, +-91, + 7, +-28, +-48, + 60, + 4, +-15, + 61, + 5, + -8, + 81, + 60, + 57, +106, +105, +106, +110, +104, +103, +101, + 98, + 97, +110, +108, +107, +110, +108, +106, +110, +108, +106, +110, +108, +107, +110, +108, +107, +111, +109, +107, +110, +108, +107, +108, +106, +105, +108, +106, +105, +108, +106, +105, +107, +105, +104, +106, +104, +102, +103, +101, + 99, +110, +108, +107, +109, +107, +105, +107, +105, +103, +107, +105, +104, +107, +105, +103, +106, +104, +102, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +102, +109, +106, +107, +109, +107, +105, +109, +107, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +105, +110, +108, +106, +110, +108, +106, +109, +107, +106, +110, +108, +106, +111, +109, +107, +112, +110, +108, +110, +108, +106, +110, +108, +107, +113, +111, +109, +114, +112, +110, +115, +113, +112, +114, +112, +110, +113, +111, +109, +113, +111, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +115, +113, +111, +115, +113, +112, +113, +111, +109, +111, +109, +107, +111, +109, +107, +113, +111, +109, +114, +112, +111, +112, +112, +108, +114, +110, +109, +116, +109, +111, +111, +111, +111, +114, +112, +108, + 69, + 50, + 46, + 11, +-15, +-28, +-27, +-53, +-72, + 2, +-25, +-45, +-17, +-51, +-75, + 18, +-26, +-55, + 39, +-12, +-46, + 33, +-12, +-61, + 23, +-18, +-66, +-15, +-50, +-92, +-28, +-57, +-92, +-31, +-56, +-83, + -9, +-34, +-62, + 4, +-30, +-70, + 22, +-16, +-59, + 43, + 4, +-41, + 52, + 13, +-29, + 58, + 22, +-16, + 61, + 21, +-15, + 39, + -3, +-36, +-23, +-55, +-84, +-49, +-74, +-101, +-35, +-63, +-88, + 1, +-33, +-57, + 49, + 6, +-26, + 61, + -8, +-36, + 41, +-36, +-48, +105, + 68, + 68, +111, +107, +108, +107, +110, +106, +111, +109, +107, +110, +108, +107, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +108, +106, +105, +111, +109, +108, +110, +108, +106, +110, +108, +107, +110, +108, +107, +109, +107, +105, +111, +109, +107, +109, +107, +106, +108, +106, +105, +109, +107, +105, +109, +107, +105, +107, +105, +104, +107, +105, +104, +107, +105, +104, +108, +106, +105, +109, +107, +105, +109, +107, +105, +107, +105, +103, +109, +106, +107, +109, +107, +105, +108, +107, +104, +110, +108, +106, +110, +108, +107, +110, +108, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +111, +109, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +107, +106, +104, +103, +113, +111, +109, +115, +113, +111, +115, +113, +111, +114, +112, +111, +113, +111, +110, +112, +110, +109, +111, +109, +108, +111, +109, +107, +111, +108, +107, +111, +109, +107, +112, +110, +108, +113, +111, +110, +115, +112, +111, +115, +113, +111, +114, +112, +110, +112, +110, +108, +111, +109, +107, +111, +109, +108, +112, +110, +109, +112, +110, +109, +111, +111, +108, +113, +109, +108, +114, +109, +110, +110, +111, +111, +110, +105, +102, + 65, + 37, + 36, + 22, +-11, +-32, + -7, +-39, +-68, +-13, +-46, +-73, + 13, +-25, +-54, + 64, + 18, +-16, + 51, + -1, +-42, + 26, +-24, +-77, + 23, +-23, +-74, + -7, +-47, +-92, +-18, +-51, +-88, +-13, +-41, +-71, + 12, +-17, +-49, + 24, +-13, +-57, + 26, +-15, +-62, + 40, + -5, +-50, + 54, + 12, +-31, + 61, + 22, +-15, + 62, + 18, +-14, + 32, +-13, +-42, +-22, +-58, +-87, +-34, +-67, +-95, + 9, +-29, +-55, + 57, + 11, +-17, + 42, +-12, +-48, + 58, +-18, +-49, + 43, +-38, +-50, +111, + 73, + 75, +110, +107, +108, +106, +111, +104, +110, +109, +106, +110, +108, +107, +110, +108, +107, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +105, +109, +107, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +109, +106, +108, +110, +108, +106, +110, +108, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +108, +106, +105, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +112, +110, +108, +111, +109, +107, +111, +109, +107, +108, +106, +105, +106, +104, +102, +109, +107, +105, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +110, +108, +106, +108, +106, +104, +107, +105, +104, +109, +107, +105, +109, +107, +105, +109, +107, +104, +112, +106, +106, +111, +106, +108, +107, +110, +109, + 95, + 89, + 87, + 50, + 16, + 17, + 30, +-11, +-29, + 16, +-24, +-45, + 19, +-22, +-36, + 64, + 19, + 2, + 63, + 12, +-13, + 47, +-10, +-42, + 28, +-29, +-69, + 25, +-28, +-71, + 13, +-35, +-77, + -5, +-48, +-89, + 7, +-31, +-71, + 24, +-13, +-54, + 35, + -5, +-49, + 46, + 2, +-43, + 58, + 10, +-33, + 61, + 14, +-23, + 63, + 19, +-12, + 64, + 17, +-11, + 47, + -1, +-29, + 16, +-24, +-52, + 4, +-34, +-61, + 55, + 9, +-21, + 56, + 2, +-31, + 59, + -3, +-38, + 78, + 3, +-26, + 60, + -5, +-17, +118, + 95, + 95, +106, +110, +110, +110, +110, +103, +110, +108, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +108, +106, +104, +109, +106, +105, +109, +107, +105, +108, +106, +104, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +103, +104, +109, +107, +105, +108, +107, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +111, +109, +107, +109, +107, +105, +109, +107, +105, +108, +106, +105, +107, +105, +103, +109, +107, +106, +110, +108, +106, +109, +107, +105, +109, +107, +105, +111, +109, +108, +111, +109, +107, +109, +107, +106, +109, +107, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +109, +107, +106, +110, +109, +107, +109, +107, +106, +109, +107, +106, +108, +106, +105, +106, +105, +103, +109, +107, +106, +110, +108, +107, +110, +108, +106, +110, +108, +106, +109, +108, +105, +112, +106, +105, +110, +107, +107, +107, +110, +109, + 89, + 82, + 81, + 35, + -2, + -1, + 33, +-15, +-22, + 37, +-11, +-15, + 60, + 11, + 15, + 54, + 1, + 4, + 50, + -9, +-14, + 50, +-14, +-26, + 37, +-25, +-51, + 31, +-28, +-60, + 35, +-19, +-57, + 28, +-24, +-67, + 23, +-25, +-73, + 28, +-16, +-64, + 43, + 0, +-42, + 57, + 10, +-30, + 62, + 12, +-27, + 62, + 13, +-20, + 64, + 18, + -9, + 66, + 18, + -7, + 60, + 11, +-16, + 46, + 4, +-24, + 54, + 11, +-18, + 67, + 16, +-15, + 44, +-17, +-52, + 40, +-26, +-58, + 55, +-12, +-37, + 81, + 37, + 25, +112, +108, +104, + 99, +110, +108, +112, +107, +100, +109, +106, +103, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +104, +102, +100, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +102, + 96, +101, +108, +106, +105, +107, +107, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +109, +107, +105, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +108, +109, +108, +107, +109, +109, +108, +110, +110, +109, +111, +110, +109, +111, +107, +106, +108, +107, +106, +109, +111, +110, +113, +111, +110, +112, +110, +109, +111, +110, +109, +112, +110, +109, +111, +109, +108, +110, +109, +108, +110, +109, +108, +110, +110, +108, +111, +110, +108, +111, +108, +109, +109, +111, +110, +107, +112, +110, +107, +110, +111, +114, +101, + 91, + 94, + 40, + 2, + -2, + 32, +-17, +-33, + 34, +-17, +-23, + 56, + 2, + 3, + 43, +-15, +-23, + 50, +-16, +-28, + 58, +-15, +-22, + 44, +-26, +-38, + 40, +-26, +-46, + 39, +-22, +-53, + 34, +-23, +-62, + 32, +-23, +-63, + 45, + -6, +-46, + 54, + 10, +-29, + 56, + 12, +-26, + 54, + 11, +-26, + 57, + 16, +-19, + 61, + 22, +-11, + 60, + 19, + -9, + 52, + 13, +-15, + 50, + 12, +-19, + 60, + 17, +-16, + 68, + 13, +-22, + 44, +-22, +-57, + 48, +-16, +-50, + 63, + 13, +-11, + 93, + 69, + 62, +112, +105, +108, +108, +105, +110, +112, +105, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 87, + 80, + 86, +107, +104, +104, +107, +108, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +106, +109, +107, +105, +109, +107, +105, +110, +109, +110, +117, +116, +118, +117, +117, +119, +117, +116, +119, +118, +118, +120, +117, +116, +119, +117, +116, +118, +117, +117, +119, +117, +116, +119, +117, +116, +119, +117, +116, +119, +117, +116, +118, +115, +115, +117, +115, +115, +117, +116, +116, +118, +117, +116, +119, +117, +116, +119, +117, +116, +118, +119, +117, +115, +119, +117, +114, +115, +116, +120, +114, +104, +109, + 44, + 9, + 4, + 24, +-25, +-46, + 35, +-17, +-27, + 33, +-21, +-24, + 45, +-13, +-24, + 51, +-15, +-29, + 55, +-19, +-24, + 46, +-24, +-36, + 28, +-38, +-59, + 37, +-26, +-56, + 43, +-15, +-52, + 47, +-10, +-47, + 56, + 3, +-33, + 53, + 10, +-28, + 52, + 9, +-28, + 56, + 15, +-21, + 58, + 18, +-16, + 59, + 20, +-13, + 56, + 18, +-14, + 51, + 13, +-18, + 48, + 9, +-24, + 63, + 20, +-15, + 56, + 3, +-33, + 65, + 3, +-32, + 74, + 18, +-14, + 55, + 15, + -5, +115, + 95, + 89, +112, +106, +109, +110, +107, +110, +112, +106, +106, +109, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 72, + 66, + 71, +108, +105, +104, +106, +107, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +106, +104, +102, +105, +103, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +107, +109, +114, +113, +115, +110, +109, +112, +110, +110, +112, +114, +113, +115, +114, +113, +115, +110, +109, +112, +111, +110, +113, +114, +113, +116, +111, +110, +113, +111, +111, +113, +112, +111, +114, +110, +109, +112, +110, +109, +112, +112, +111, +113, +112, +111, +114, +112, +111, +114, +111, +110, +113, +112, +108, +108, +115, +113, +112, +115, +118, +123, +117, +110, +115, + 48, + 17, + 13, + 24, +-23, +-47, + 14, +-37, +-52, + 32, +-19, +-25, + 49, + -5, +-19, + 51, + -9, +-25, + 38, +-31, +-37, + 44, +-20, +-36, + 31, +-31, +-55, + 26, +-34, +-66, + 41, +-18, +-53, + 56, + -3, +-38, + 58, + 3, +-30, + 52, + 10, +-27, + 55, + 15, +-21, + 60, + 20, +-15, + 59, + 21, +-13, + 56, + 19, +-13, + 53, + 16, +-18, + 51, + 12, +-23, + 51, + 11, +-24, + 64, + 19, +-16, + 64, + 14, +-20, + 71, + 17, +-17, + 70, + 26, + 1, + 91, + 63, + 47, +117, +104, + 98, +109, +106, +106, +107, +106, +107, +110, +106, +103, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 58, + 52, + 58, +104, +102, +101, +106, +107, +103, +107, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +108, +106, +103, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +106, +107, +116, +115, +117, +114, +113, +116, +115, +114, +116, +115, +115, +117, +114, +114, +116, +116, +115, +118, +114, +114, +116, +116, +116, +118, +115, +115, +117, +115, +114, +117, +114, +114, +116, +114, +114, +116, +114, +114, +116, +115, +115, +117, +117, +116, +118, +117, +116, +118, +116, +115, +119, +118, +114, +116, +117, +114, +115, +112, +116, +122, +116, +113, +118, + 51, + 25, + 21, + 22, +-21, +-44, + 1, +-43, +-60, + 2, +-41, +-51, + 17, +-27, +-45, + 16, +-33, +-55, + 20, +-37, +-52, + 19, +-36, +-58, + 28, +-26, +-54, + 28, +-25, +-59, + 34, +-19, +-56, + 51, + -4, +-38, + 57, + 5, +-27, + 54, + 13, +-22, + 58, + 18, +-17, + 58, + 20, +-13, + 57, + 20, +-12, + 48, + 12, +-19, + 49, + 12, +-21, + 49, + 9, +-26, + 55, + 12, +-22, + 57, + 10, +-20, + 61, + 13, +-15, + 65, + 18, +-10, + 64, + 35, + 19, +112, + 96, + 86, +111, +105, +101, +105, +105, +104, +105, +106, +104, +107, +106, +101, +108, +106, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +102, +100, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 49, + 42, + 48, + 99, + 97, + 96, +104, +104, +100, +106, +104, +102, +106, +104, +102, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +107, +109, +115, +115, +117, +113, +113, +115, +114, +113, +115, +113, +112, +115, +114, +113, +116, +114, +114, +116, +115, +114, +117, +113, +113, +115, +115, +114, +116, +114, +114, +116, +116, +115, +117, +116, +115, +118, +116, +115, +118, +116, +116, +118, +117, +117, +119, +117, +117, +119, +119, +116, +121, +121, +116, +119, +120, +117, +119, +111, +117, +124, +113, +111, +118, + 49, + 26, + 22, + 13, +-23, +-44, + 6, +-31, +-45, + 14, +-20, +-32, + 1, +-32, +-57, + -3, +-39, +-72, + 15, +-26, +-54, + 14, +-29, +-57, + 24, +-19, +-52, + 24, +-20, +-58, + 24, +-21, +-60, + 49, + 1, +-34, + 59, + 12, +-20, + 57, + 18, +-16, + 59, + 20, +-13, + 58, + 21, +-11, + 52, + 17, +-14, + 47, + 13, +-17, + 48, + 11, +-21, + 49, + 7, +-24, + 62, + 15, +-12, + 54, + 4, +-18, + 60, + 13, + -6, + 60, + 18, + 1, + 92, + 76, + 66, +111, +106, +100, +108, +107, +104, +105, +108, +105, +105, +108, +103, +107, +107, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +102, +104, +102, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +104, +102, +100, +102, +100, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 45, + 39, + 47, + 88, + 85, + 87, +104, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +106, +108, +113, +113, +115, +108, +108, +110, +111, +111, +113, +112, +111, +114, +112, +111, +114, +110, +109, +112, +110, +110, +112, +110, +109, +112, +109, +109, +111, +110, +109, +112, +111, +110, +113, +117, +117, +118, +117, +117, +118, +117, +117, +119, +118, +117, +120, +118, +117, +120, +117, +117, +121, +119, +115, +120, +119, +116, +120, +111, +117, +123, +112, +112, +116, + 39, + 19, + 14, + 14, +-19, +-36, + 18, +-17, +-30, + 5, +-28, +-41, + -4, +-34, +-62, + 2, +-28, +-67, + 23, +-10, +-46, + 25, + -9, +-41, + 22, +-13, +-47, + 20, +-17, +-56, + 25, +-15, +-54, + 41, + -1, +-37, + 57, + 14, +-20, + 55, + 19, +-15, + 56, + 19, +-15, + 54, + 19, +-13, + 52, + 17, +-14, + 50, + 16, +-15, + 47, + 11, +-20, + 50, + 7, +-20, + 65, + 17, + -3, + 57, + 11, + -3, + 83, + 47, + 38, +108, + 78, + 72, +116, +106, +102, +107, +107, +105, +103, +104, +102, +104, +106, +103, +105, +106, +101, +106, +106, +100, +108, +106, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +106, +104, +102, +105, +103, +102, +105, +103, +101, +106, +104, +102, +105, +103, +101, +103, +101, +100, +102, +100, + 98, +103, +101, +100, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 43, + 39, + 52, + 73, + 69, + 77, +105, +101, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +105, +103, +101, +105, +103, +101, +105, +103, +102, +106, +104, +103, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +105, +103, +104, +106, +104, +106, +107, +105, +107, +106, +105, +106, +106, +105, +106, +106, +105, +106, +105, +104, +105, +104, +104, +105, +104, +104, +105, +104, +103, +104, +104, +103, +104, +104, +103, +104, +104, +104, +104, +104, +104, +104, +104, +104, +104, +105, +105, +105, +105, +105, +105, + 99, +104, +105, +100, +101, +106, +106, +100, +107, +102, +103, +104, +101, +100, + 95, + 36, + 18, + 9, + 21, +-11, +-24, + 14, +-22, +-38, + -3, +-43, +-61, + 10, +-31, +-55, + 16, +-22, +-52, + 22, +-12, +-45, + 30, + -4, +-31, + 35, + -1, +-28, + 31, + -7, +-38, + 32, + -8, +-42, + 35, + -7, +-44, + 50, + 10, +-27, + 50, + 19, +-17, + 50, + 19, +-17, + 51, + 18, +-18, + 52, + 18, +-17, + 49, + 13, +-21, + 50, + 15, +-16, + 54, + 12, +-11, + 60, + 13, + -1, + 65, + 37, + 29, +111, +103, +100, +111, +105, +110, +109, +106, +107, +106, +104, +102, +102, +100, + 98, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +105, +109, +107, +105, +106, +104, +102, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +104, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +105, +103, +101, +104, +102, +100, +106, +104, +103, +105, +103, +102, +103, +101, +100, +100, + 98, + 97, +101, + 99, + 98, +104, +102, +101, +104, +102, +100, +103, +101, +100, + 43, + 39, + 53, + 60, + 55, + 64, +105, +101, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +107, +105, +103, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +106, +102, +101, +102, + 98, + 97, +101, + 97, + 96, +101, + 97, + 96, +101, + 97, + 96, +101, + 97, + 96, +102, + 98, + 97, +102, + 98, + 97, +102, + 98, + 97, +103, + 99, + 98, +102, + 98, + 97, +103, + 99, + 98, +102, + 99, + 96, +102, + 99, + 96, +103, +100, + 97, +104, +101, + 98, +104, +101, + 98, +101, +102, +100, +102, +100, +102, +106, + 97, +102, +101, + 98, + 98, +102, +100, + 92, + 44, + 25, + 15, + 12, +-15, +-30, +-13, +-45, +-61, +-39, +-75, +-93, + 0, +-38, +-62, + 18, +-17, +-46, + 18, +-14, +-46, + 4, +-39, +-63, + 13, +-31, +-55, + 28, +-15, +-45, + 34, + -8, +-42, + 40, + 0, +-36, + 43, + 5, +-32, + 45, + 14, +-21, + 49, + 16, +-17, + 51, + 16, +-17, + 50, + 14, +-19, + 50, + 12, +-20, + 50, + 13, +-18, + 57, + 13, +-10, + 54, + 8, + -5, + 84, + 60, + 53, +112, +105, +103, +109, +105, +108, +109, +106, +106, +107, +105, +104, +105, +103, +101, +107, +105, +103, +108, +106, +104, +108, +106, +104, +109, +107, +105, +108, +106, +104, +104, +102, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +106, +104, +102, +105, +103, +101, +104, +102, +101, +103, +101, + 99, +102, +100, + 98, +104, +102, +101, +104, +102, +100, +103, +101, + 99, + 37, + 32, + 49, + 48, + 43, + 55, +100, + 96, +102, +106, +103, +103, +106, +104, +102, +105, +103, +102, +104, +102, +101, +104, +102, +101, +104, +102, +100, +103, +101, + 99, +106, +104, +102, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +108, +105, +104, +109, +104, +103, +109, +102, +102, +108, +101, +101, +107, +101, +101, +106, +100, +100, +107, +101, +100, +108, +103, +102, +108, +103, +103, +108, +103, +103, +106, +102, +101, +108, +103, +102, +107, +102, +101, +106, +102, + 99, +106, +102, + 98, +107, +103, + 99, +108, +104, +101, +108, +104, +101, +106, +105, +101, +108, +103, +102, +109, + 98, +102, +102, + 99, + 97, +107, +104, + 96, + 54, + 36, + 28, + 9, +-25, +-36, + 16, +-25, +-37, + 3, +-44, +-57, + -4, +-54, +-72, + 1, +-47, +-71, + 1, +-45, +-72, + 4, +-50, +-73, + 12, +-40, +-65, + 17, +-31, +-59, + 24, +-18, +-50, + 44, + 6, +-29, + 40, + 4, +-31, + 45, + 11, +-21, + 48, + 13, +-19, + 51, + 14, +-17, + 50, + 12, +-19, + 51, + 11, +-19, + 53, + 12, +-18, + 56, + 9, +-15, + 54, + 8, + -3, +101, + 80, + 74, +111, +108, +105, +109, +106, +107, +110, +107, +106, +108, +106, +104, +107, +105, +103, +106, +104, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +104, +107, +105, +104, +107, +105, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +104, +102, +101, +106, +104, +102, +105, +103, +101, +104, +102, +101, +105, +103, +101, +103, +101, +100, +105, +103, +101, +104, +102, +100, +104, +102, +100, + 32, + 26, + 45, + 42, + 37, + 50, + 90, + 86, + 93, +102, +100, + 99, +102, +100, + 98, +102, +100, + 99, +103, +101, +100, +103, +101, +100, +103, +101, + 99, +102, +100, + 98, +104, +102, +100, +106, +104, +102, +105, +103, +102, +105, +103, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +104, +102, +100, +106, +104, +102, +102, + 98, + 99, + 95, + 91, + 93, + 91, + 88, + 89, + 91, + 87, + 89, + 85, + 81, + 83, + 85, + 81, + 83, + 87, + 85, + 87, + 87, + 85, + 86, + 87, + 84, + 86, + 86, + 84, + 85, + 86, + 84, + 85, + 85, + 83, + 84, + 84, + 83, + 82, + 83, + 81, + 80, + 82, + 81, + 79, + 83, + 81, + 80, + 83, + 81, + 80, + 82, + 82, + 80, + 86, + 81, + 82, + 86, + 76, + 81, + 79, + 79, + 80, + 80, + 82, + 77, + 48, + 36, + 30, + 12, +-25, +-32, + 18, +-29, +-37, + 9, +-46, +-55, + 12, +-48, +-62, + 15, +-44, +-63, + 28, +-29, +-51, + 40, +-15, +-40, + 41, +-11, +-38, + 31, +-15, +-44, + 19, +-22, +-53, + 39, + 2, +-31, + 42, + 8, +-25, + 45, + 9, +-21, + 50, + 13, +-17, + 50, + 11, +-18, + 51, + 10, +-18, + 52, + 10, +-18, + 56, + 11, +-19, + 53, + 3, +-21, + 57, + 11, + 2, +109, + 89, + 86, +106, +106, +103, +107, +105, +103, +109, +106, +105, +107, +105, +103, +109, +107, +105, +106, +104, +102, +106, +104, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, + 20, + 14, + 34, + 38, + 31, + 46, + 74, + 69, + 78, +101, + 99, + 98, +101, + 99, + 97, +102, +100, + 98, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +104, +102, +100, +104, +102, +100, + 50, + 50, + 53, +-38, +-38, +-32, +-36, +-36, +-30, +-39, +-38, +-33, +-46, +-46, +-40, +-49, +-48, +-42, +-49, +-46, +-41, +-50, +-47, +-42, +-50, +-48, +-42, +-50, +-47, +-42, +-51, +-48, +-42, +-51, +-48, +-44, +-50, +-47, +-44, +-50, +-47, +-44, +-50, +-46, +-43, +-49, +-45, +-42, +-49, +-45, +-42, +-49, +-45, +-44, +-46, +-48, +-45, +-45, +-50, +-43, +-50, +-45, +-40, +-53, +-46, +-45, +-20, +-28, +-28, + 13, +-13, +-20, + 3, +-33, +-43, + -2, +-47, +-58, + -1, +-52, +-67, + 4, +-48, +-67, + 18, +-32, +-55, + 26, +-19, +-50, + 25, +-18, +-49, + 28, +-14, +-44, + 20, +-18, +-50, + 32, + -4, +-36, + 43, + 9, +-22, + 43, + 6, +-21, + 49, + 10, +-17, + 50, + 10, +-17, + 51, + 8, +-17, + 52, + 8, +-17, + 55, + 6, +-22, + 54, + 0, +-25, + 65, + 21, + 12, +114, + 95, + 93, +102, +104, +101, +103, +102, + 99, +105, +102, +100, +105, +103, +102, +106, +104, +103, +104, +102, +101, +105, +103, +102, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +-26, +-29, +-16, + 32, + 28, + 42, + 60, + 56, + 67, +103, +100, +102, +103, +101, +101, +101, + 99, + 98, +104, +102, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +106, +103, +102, +106, +103, +102, +105, +103, +101, +104, +102, +100, +102, +100, + 99, + 46, + 45, + 49, +-36, +-35, +-27, + 57, + 63, + 70, + 59, + 68, + 72, + 62, + 71, + 72, + 61, + 70, + 69, + 63, + 71, + 72, + 62, + 70, + 72, + 63, + 71, + 73, + 64, + 72, + 75, + 65, + 73, + 77, + 64, + 72, + 78, + 62, + 70, + 78, + 64, + 71, + 78, + 71, + 78, + 83, + 73, + 79, + 81, + 73, + 80, + 79, + 75, + 81, + 83, + 76, + 78, + 86, + 74, + 76, + 83, + 72, + 79, + 84, + 73, + 82, + 83, + 77, + 80, + 79, + 32, + 21, + 20, + 15, +-13, +-20, + 10, +-34, +-47, + -7, +-54, +-68, +-13, +-58, +-74, + 1, +-44, +-65, + 11, +-31, +-60, + 17, +-23, +-54, + 23, +-16, +-47, + 24, +-12, +-45, + 32, + -2, +-36, + 43, + 9, +-23, + 45, + 7, +-21, + 50, + 10, +-17, + 49, + 7, +-20, + 52, + 6, +-21, + 52, + 5, +-23, + 55, + 3, +-25, + 57, + 2, +-21, + 71, + 30, + 18, +113, + 99, + 97, +100, +103, +104, +102, +101, + 98, +104, +101, + 98, +103, +101, +100, +102, +100, + 98, +100, + 98, + 97, +104, +102, +100, +105, +102, +101, +104, +102, +100, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +101, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +-74, +-74, +-67, + 22, + 20, + 33, + 47, + 44, + 59, +100, + 97, +101, +104, +101, +104, +103, +100, +101, +103, +101, +101, +104, +102, +101, +103, +101, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +102, +100, + 98, + 92, + 90, + 88, + 35, + 32, + 37, +-45, +-45, +-36, + 8, + 17, + 25, + 22, + 35, + 40, + 22, + 35, + 35, + 25, + 37, + 32, + 23, + 33, + 32, + 19, + 29, + 29, + 22, + 31, + 33, + -3, + 6, + 9, + 17, + 25, + 30, + 8, + 17, + 22, + 13, + 25, + 26, + 25, + 34, + 37, + 86, + 94, + 97, + 89, + 95, + 99, + 90, + 95, + 98, + 89, + 94, + 99, + 88, + 94, +100, + 76, + 82, + 87, + 79, + 85, + 88, + 78, + 85, + 86, + 84, + 91, + 91, + 75, + 72, + 75, + 15, +-11, +-18, + 11, +-36, +-56, + 8, +-40, +-60, + 5, +-39, +-59, + 20, +-25, +-52, + 18, +-26, +-52, + 30, +-12, +-39, + 33, + -6, +-35, + 39, + 2, +-30, + 39, + 5, +-30, + 41, + 7, +-27, + 49, + 11, +-18, + 49, + 10, +-19, + 50, + 6, +-23, + 54, + 6, +-24, + 53, + 4, +-27, + 54, + 2, +-26, + 57, + 4, +-21, + 59, + 21, + 3, + 86, + 75, + 73, + 99, +102, +106, +104, +101, + 98, +105, +101, + 98, +104, +102, +100, +104, +102, +100, +104, +102, +100, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +103, +102, +104, +102, +101, +103, +101, + 99, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +104, +102, +100, +-103, +-103, +-96, + 3, + 1, + 14, + 39, + 37, + 51, + 93, + 89, + 94, +105, +102, +105, +103, +100, +101, +104, +101, +101, +103, +101, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +103, +101, +100, +100, + 98, + 97, + 91, + 89, + 88, + 38, + 34, + 41, +-52, +-52, +-40, +-19, +-12, + 0, + -6, + 6, + 15, + -8, + 4, + 8, + 1, + 11, + 12, + -1, + 7, + 11, + 1, + 10, + 15, + -1, + 8, + 15, +-38, +-30, +-21, +-31, +-24, +-13, +-36, +-27, +-19, +-22, + -9, +-13, + 1, + 12, + 10, + 87, + 95, + 97, + 88, + 93, +100, + 89, + 91, +104, + 89, + 93, +100, + 86, + 94, + 94, + 87, + 94, + 96, + 87, + 93, + 97, + 87, + 93, + 99, + 89, + 95, +102, + 65, + 65, + 70, + 19, + 0, + -7, + 10, +-30, +-54, + 14, +-25, +-53, + 13, +-20, +-52, + 20, +-16, +-54, + 32, + -8, +-35, + 39, + 0, +-26, + 45, + 6, +-22, + 45, + 8, +-23, + 39, + 5, +-28, + 40, + 6, +-27, + 44, + 6, +-24, + 43, + 4, +-27, + 49, + 7, +-25, + 54, + 7, +-24, + 57, + 8, +-23, + 59, + 7, +-25, + 60, + 10, +-22, + 48, + 9, +-16, + 27, + 17, + 10, + 97, +100, +100, +104, +104, + 98, +105, +102, + 99, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +105, +103, +102, +105, +103, +102, +107, +105, +103, +107, +105, +104, +106, +104, +103, +102, +100, + 98, +103, +100, + 99, +103, +101, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +100, + 98, + 97, +103, +101, + 99, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +102, +100, + 98, +102, +100, + 99, +104, +102, +100, +-90, +-92, +-86, +-24, +-27, +-15, + 38, + 33, + 49, + 78, + 74, + 78, +104, +100, +104, +104, +101, +103, +104, +102, +101, +103, +101, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +100, + 98, + 96, + 91, + 89, + 87, + 40, + 36, + 42, +-55, +-55, +-44, +-29, +-22, + -9, +-35, +-23, +-12, +-36, +-25, +-16, +-32, +-23, +-17, +-38, +-26, +-19, +-36, +-24, +-16, +-37, +-26, +-16, +-41, +-31, +-19, +-39, +-28, +-15, +-27, +-17, + -2, +-29, +-22, + -3, + -8, + -1, + 9, + 84, + 93, + 95, + 80, + 87, + 85, + 80, + 86, + 85, + 83, + 90, + 89, + 85, + 92, + 93, + 87, + 93, + 97, + 87, + 92, +102, + 74, + 78, + 92, + 40, + 43, + 60, + 11, + 13, + 28, + 51, + 36, + 40, + 15, +-23, +-35, + 17, +-18, +-36, + 21, +-10, +-32, + 29, + -3, +-34, + 39, + 4, +-23, + 40, + 4, +-23, + 37, + 1, +-26, + 35, + 0, +-29, + 38, + 3, +-29, + 43, + 7, +-25, + 42, + 5, +-26, + 47, + 8, +-25, + 52, + 10, +-23, + 57, + 10, +-24, + 61, + 13, +-21, + 63, + 13, +-21, + 63, + 15, +-21, + 45, + 6, +-24, + -5, +-17, +-29, + 75, + 78, + 77, + 99, +100, + 97, +102, +100, + 97, +104, +102, +100, +102, +100, + 98, + 98, + 96, + 94, +106, +104, +102, +105, +103, +102, +106, +103, +102, +106, +104, +102, +106, +104, +103, +105, +103, +102, +104, +102, +101, +104, +102, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +101, + 99, + 97, +104, +102, +101, +106, +104, +102, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +-49, +-53, +-46, +-55, +-60, +-48, + 35, + 28, + 44, + 64, + 61, + 65, +102, + 99, +102, +103, +100, +102, +104, +102, +102, +104, +102, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +106, +104, +102, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +100, + 98, + 97, + 92, + 90, + 88, + 43, + 41, + 42, +-57, +-56, +-50, +-28, +-20, +-11, +-34, +-22, +-13, +-35, +-23, +-15, +-32, +-23, +-17, +-38, +-26, +-19, +-38, +-25, +-18, +-39, +-26, +-17, +-37, +-25, +-15, +-36, +-24, +-12, + -6, + 3, + 21, + -8, + -3, + 25, +-10, + -3, + 10, + 87, + 95, + 96, + 85, + 93, + 89, + 87, + 93, + 90, + 86, + 91, + 95, + 76, + 81, + 92, + 61, + 64, + 79, + 31, + 34, + 51, + -7, + -6, + 18, +-22, +-22, + 4, + 21, + 21, + 43, + 32, + 17, + 28, + -5, +-43, +-47, + -2, +-39, +-47, + 4, +-28, +-39, + 16, +-18, +-37, + 22, +-10, +-35, + 26, + -6, +-33, + 31, + -3, +-30, + 35, + 0, +-28, + 38, + 3, +-27, + 43, + 7, +-24, + 47, + 11, +-23, + 50, + 11, +-23, + 55, + 13, +-22, + 60, + 14, +-21, + 63, + 15, +-20, + 60, + 13, +-22, + 59, + 12, +-23, + 38, + -3, +-34, +-14, +-30, +-39, + 52, + 52, + 55, + 63, + 64, + 68, +104, +102, +102, +107, +105, +103, +107, +105, +103, +103, +101, +100, +107, +105, +103, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +105, +103, +102, +104, +101, +100, +101, + 99, + 97, +103, +101, + 99, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, + -8, +-12, + -5, +-85, +-90, +-78, + 25, + 19, + 34, + 52, + 48, + 53, +102, + 99, +102, +106, +103, +104, +106, +103, +103, +106, +104, +102, +106, +104, +103, +107, +105, +104, +107, +105, +104, +106, +104, +103, +105, +103, +101, +105, +103, +101, +104, +102, +101, +103, +101, + 99, +102, +100, + 98, +102, +100, + 98, +100, + 98, + 97, + 92, + 90, + 88, + 47, + 46, + 44, +-60, +-58, +-57, +-30, +-21, +-17, +-32, +-19, +-13, +-32, +-20, +-15, +-24, +-14, +-11, +-37, +-23, +-20, +-37, +-22, +-18, +-38, +-24, +-18, +-39, +-25, +-18, +-37, +-24, +-15, +-26, +-14, + -4, +-15, + -5, + 5, +-14, + -4, + -2, + 84, + 93, + 92, + 74, + 80, + 86, + 55, + 55, + 72, + 23, + 23, + 45, + 0, + 0, + 25, +-15, +-15, + 10, +-26, +-27, + 1, +-30, +-31, + -1, +-39, +-41, + -9, + 28, + 28, + 42, + 7, + -8, + -8, +-11, +-49, +-62, +-15, +-54, +-67, + -5, +-40, +-53, + 13, +-23, +-42, + 23, + -7, +-31, + 27, + -3, +-28, + 34, + 2, +-25, + 39, + 4, +-23, + 44, + 7, +-20, + 45, + 8, +-21, + 50, + 13, +-21, + 52, + 14, +-21, + 54, + 12, +-23, + 57, + 11, +-25, + 56, + 9, +-28, + 55, + 8, +-24, + 49, + 2, +-29, + 27, +-15, +-42, + 13, + -4, +-10, + 51, + 49, + 56, + -5, + -5, + 6, + 86, + 84, + 86, +108, +106, +105, +108, +106, +105, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 11, + 13, + 20, +-110, +-108, +-100, + 4, + 5, + 16, + 42, + 38, + 48, + 93, + 89, + 95, +106, +103, +104, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +103, +101, +100, +103, +101, + 99, +103, +101, + 99, +100, + 98, + 97, + 92, + 90, + 89, + 50, + 48, + 49, +-60, +-57, +-55, +-34, +-24, +-23, +-41, +-27, +-25, +-45, +-31, +-28, +-42, +-31, +-26, +-49, +-37, +-30, +-48, +-36, +-28, +-40, +-29, +-19, +-38, +-28, +-14, +-40, +-31, +-15, +-25, +-18, + 1, + -8, + -6, + 18, + -3, + 0, + 22, + 8, + 10, + 30, + -8, + -8, + 17, +-23, +-25, + 6, +-35, +-37, + -5, +-31, +-33, + -2, +-32, +-33, + -4, +-36, +-36, + -8, +-39, +-39, +-12, +-48, +-48, +-21, + 34, + 35, + 44, + 13, + 1, + -5, + -7, +-43, +-68, + 4, +-41, +-71, + -5, +-50, +-73, + 6, +-36, +-51, + 20, +-13, +-33, + 31, + -3, +-25, + 39, + 3, +-20, + 45, + 8, +-17, + 46, + 8, +-19, + 46, + 7, +-22, + 46, + 6, +-27, + 46, + 6, +-27, + 48, + 6, +-26, + 43, + -1, +-33, + 41, + -6, +-38, + 42, +-12, +-41, + 32, +-20, +-49, + 11, +-22, +-49, + 59, + 51, + 39, + 42, + 43, + 50, +-45, +-44, +-18, + -5, + -6, + 12, + 68, + 66, + 79, +102, +101, +109, +104, +103, +105, +103, +102, +100, +105, +104, + 98, +106, +105, +101, +106, +104, +102, +106, +104, +103, +106, +103, +104, +106, +103, +104, +106, +103, +104, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 28, + 29, + 38, +-94, +-94, +-86, +-21, +-21, +-11, + 40, + 35, + 47, + 82, + 78, + 85, +104, +101, +102, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +102, +100, + 98, + 99, + 97, + 96, + 91, + 89, + 87, + 52, + 50, + 52, +-60, +-58, +-54, +-25, +-16, +-11, +-21, + -8, + -1, +-43, +-33, +-21, +-31, +-23, + -8, +-25, +-19, + -1, +-15, + -9, + 10, +-10, + -4, + 17, + -5, + 0, + 24, + -4, + 1, + 26, + -9, + -7, + 21, +-13, +-14, + 17, +-18, +-19, + 12, +-25, +-26, + 5, +-37, +-39, + -8, +-45, +-46, +-15, +-49, +-50, +-20, +-42, +-43, +-14, +-45, +-46, +-17, +-47, +-47, +-21, +-55, +-55, +-31, +-60, +-60, +-36, + 37, + 39, + 50, + 27, + 18, + 14, + -7, +-38, +-62, + 12, +-33, +-67, + 7, +-41, +-70, + -8, +-50, +-71, + 13, +-26, +-46, + 28, +-11, +-33, + 37, + -4, +-27, + 42, + -1, +-25, + 40, + -3, +-30, + 38, + -5, +-33, + 38, + -8, +-36, + 40, + -6, +-35, + 40, + -8, +-38, + 31, +-18, +-51, + 33, +-19, +-53, + 27, +-27, +-64, + 17, +-30, +-62, + 18, + -5, +-24, + 79, + 72, + 70, + 36, + 36, + 48, +-56, +-56, +-28, +-39, +-41, +-14, +-27, +-29, + -6, + 35, + 33, + 49, + 94, + 92, +101, +104, +103, +106, +104, +103, +102, +107, +105, +101, +107, +105, +102, +107, +105, +103, +107, +105, +103, +107, +105, +104, +106, +104, +103, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 50, + 45, + 59, +-54, +-58, +-48, +-50, +-53, +-45, + 37, + 32, + 44, + 68, + 63, + 71, +103, +100, +102, +102, +100, + 99, +102, +100, + 99, +103, +100, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +106, +104, +102, +105, +103, +101, +102, + 99, + 98, +102, +100, + 98, +100, + 98, + 96, + 92, + 90, + 88, + 55, + 52, + 53, +-60, +-60, +-55, +-28, +-22, +-10, +-14, + -6, + 13, +-12, + -7, + 18, + -4, + -2, + 27, + -5, + -4, + 26, + -9, + -8, + 23, +-13, +-12, + 20, +-16, +-16, + 17, +-25, +-25, + 8, +-32, +-32, + 0, +-31, +-31, + -3, +-38, +-38, +-10, +-44, +-45, +-17, +-50, +-50, +-22, +-52, +-53, +-25, +-43, +-44, +-16, +-45, +-45, +-18, +-55, +-55, +-29, +-60, +-60, +-37, +-71, +-70, +-49, +-78, +-77, +-56, + 36, + 38, + 49, + 43, + 37, + 36, + -1, +-24, +-43, + 13, +-24, +-57, + 17, +-26, +-61, + 10, +-33, +-65, + 13, +-32, +-56, + 28, +-17, +-42, + 33, +-14, +-39, + 36, +-12, +-37, + 33, +-17, +-42, + 30, +-21, +-44, + 29, +-25, +-43, + 29, +-27, +-50, + 26, +-31, +-62, + 27, +-30, +-67, + 31, +-24, +-64, + 21, +-25, +-69, + 2, +-29, +-64, + 58, + 40, + 33, + 83, + 74, + 87, + 15, + 12, + 33, +-60, +-59, +-37, +-51, +-52, +-26, +-44, +-46, +-18, +-30, +-32, + -9, + -1, + -3, + 15, + 49, + 47, + 60, + 92, + 89, + 99, +106, +104, +107, +106, +105, +105, +106, +105, +104, +105, +105, +103, +105, +106, +101, +105, +105, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 34, + 27, + 44, +-12, +-17, + -6, +-80, +-83, +-77, + 29, + 24, + 36, + 55, + 50, + 58, +100, + 97, + 98, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +103, +101, + 99, +104, +102, +100, +103, +101, +100, +100, + 98, + 96, + 98, + 96, + 94, + 90, + 88, + 86, + 58, + 54, + 53, +-55, +-58, +-52, +-25, +-23, + -5, +-28, +-24, + 3, +-35, +-34, + -1, +-24, +-26, + 9, +-23, +-26, + 11, +-28, +-31, + 5, +-31, +-34, + 2, +-38, +-41, + -5, +-43, +-45, +-10, +-48, +-49, +-17, +-51, +-50, +-25, +-55, +-54, +-29, +-57, +-57, +-32, +-58, +-58, +-33, +-62, +-62, +-37, +-69, +-68, +-45, +-57, +-56, +-34, +-62, +-61, +-39, +-72, +-70, +-51, +-86, +-84, +-67, +-89, +-86, +-69, + 12, + 16, + 25, + -6, + -8, + -9, + 21, + 8, + -8, + 6, +-20, +-52, + 15, +-22, +-61, + 23, +-22, +-61, + 18, +-30, +-60, + 27, +-21, +-50, + 33, +-19, +-46, + 37, +-16, +-43, + 34, +-20, +-46, + 28, +-29, +-50, + 24, +-34, +-49, + 24, +-37, +-59, + 23, +-38, +-69, + 25, +-31, +-66, + 21, +-28, +-63, + 11, +-19, +-55, + 41, + 27, + 6, + 82, + 69, + 71, + 77, + 69, + 90, +-13, +-16, + 7, +-64, +-62, +-44, +-56, +-55, +-30, +-47, +-48, +-19, +-43, +-45, +-17, +-31, +-34, + -9, +-21, +-25, + -1, + 2, + -2, + 20, + 60, + 57, + 68, + 99, + 98, +106, +105, +104, +109, +104, +104, +104, +104, +106, +102, +105, +106, +101, +107, +106, +103, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 15, + 12, + 30, + 19, + 18, + 29, +-102, +-101, +-97, + 13, + 8, + 19, + 43, + 38, + 46, + 97, + 94, + 96, +105, +103, +101, +105, +103, +101, +105, +102, +102, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +103, +101, +100, +103, +101, +100, +101, + 99, + 97, +100, + 98, + 96, + 92, + 90, + 89, + 63, + 58, + 57, +-56, +-60, +-53, +-29, +-29, + -8, +-47, +-47, +-16, +-50, +-51, +-19, +-38, +-40, +-10, +-40, +-43, + -9, +-42, +-45, +-11, +-49, +-51, +-19, +-53, +-55, +-25, +-57, +-58, +-30, +-62, +-62, +-37, +-65, +-64, +-42, +-66, +-65, +-43, +-66, +-64, +-43, +-64, +-62, +-41, +-67, +-66, +-45, +-102, +-101, +-81, +-81, +-80, +-61, +-76, +-74, +-56, +-84, +-81, +-65, +-90, +-87, +-72, +-91, +-88, +-74, +-16, + -7, + -6, +-14, + -8, +-15, + 6, + 3, +-15, + 11, + -5, +-34, + 13, +-21, +-59, + 25, +-22, +-63, + 25, +-22, +-58, + 21, +-26, +-60, + 25, +-25, +-57, + 32, +-21, +-50, + 28, +-26, +-53, + 24, +-32, +-56, + 21, +-37, +-56, + 20, +-40, +-65, + 18, +-39, +-68, + 15, +-30, +-57, + 10, +-22, +-41, + 42, + 30, + 16, + 76, + 73, + 66, + 77, + 74, + 78, + 66, + 64, + 78, +-42, +-44, +-27, +-64, +-64, +-45, +-61, +-59, +-36, +-53, +-51, +-25, +-51, +-50, +-24, +-46, +-47, +-20, +-37, +-41, +-13, +-29, +-33, + -5, +-13, +-17, + 7, + 17, + 15, + 33, + 73, + 73, + 84, +101, +102, +107, +103, +105, +105, +103, +105, +102, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 30, + 31, + 49, + 32, + 36, + 45, +-92, +-88, +-86, + -3, + -7, + 3, + 44, + 40, + 48, + 85, + 83, + 84, +104, +102, +101, +105, +103, +101, +105, +102, +102, +105, +103, +101, +105, +103, +101, +105, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +104, +102, + 99, +101, + 99, + 97, +100, + 98, + 96, + 92, + 90, + 88, + 65, + 60, + 59, +-42, +-47, +-38, +-42, +-45, +-23, +-60, +-60, +-31, +-56, +-56, +-29, +-54, +-56, +-32, +-52, +-56, +-27, +-57, +-60, +-33, +-60, +-63, +-37, +-63, +-65, +-41, +-67, +-68, +-48, +-72, +-72, +-53, +-74, +-72, +-52, +-70, +-68, +-49, +-67, +-66, +-46, +-66, +-64, +-45, +-73, +-72, +-52, +-85, +-83, +-65, +-86, +-84, +-68, +-88, +-85, +-69, +-90, +-87, +-73, +-94, +-90, +-78, +-96, +-92, +-80, +-12, + -2, + -7, + 5, + 14, + 3, + 4, + 8, + -9, + 23, + 13, +-11, + 11, +-22, +-56, + 30, +-18, +-59, + 26, +-19, +-59, + 25, +-21, +-58, + 21, +-28, +-62, + 19, +-32, +-63, + 19, +-34, +-62, + 22, +-31, +-59, + 20, +-35, +-63, + 17, +-38, +-67, + 11, +-37, +-62, + 21, + -9, +-23, + 55, + 40, + 35, + 30, + 28, + 31, + -2, + 1, + 8, + 65, + 67, + 72, + 47, + 48, + 54, +-77, +-76, +-65, +-68, +-69, +-49, +-66, +-64, +-42, +-64, +-60, +-38, +-59, +-58, +-34, +-51, +-52, +-26, +-49, +-52, +-24, +-44, +-48, +-18, +-32, +-38, + -6, +-16, +-22, + 7, + -3, + -6, + 14, + 33, + 32, + 45, + 82, + 83, + 90, +102, +103, +106, +105, +103, +103, +103, +101, +100, +103, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 54, + 55, + 70, + 41, + 44, + 53, +-53, +-50, +-47, +-31, +-33, +-21, + 44, + 43, + 54, + 69, + 68, + 74, +103, +101, +103, +105, +103, +101, +104, +103, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +101, + 99, + 98, + 99, + 97, + 96, + 92, + 90, + 89, + 66, + 66, + 68, +-32, +-34, +-22, +-62, +-66, +-43, +-65, +-70, +-42, +-67, +-70, +-48, +-66, +-68, +-52, +-69, +-70, +-50, +-69, +-70, +-50, +-69, +-70, +-50, +-72, +-73, +-53, +-77, +-78, +-58, +-77, +-77, +-58, +-77, +-76, +-59, +-75, +-75, +-58, +-68, +-68, +-50, +-70, +-70, +-53, +-83, +-83, +-65, +-90, +-89, +-74, +-86, +-85, +-71, +-88, +-86, +-74, +-91, +-88, +-79, +-91, +-88, +-80, +-93, +-90, +-83, + -3, + 2, + -4, + 12, + 16, + 3, + 1, + 7, + -4, + 5, + 7, + -4, + 6, +-14, +-34, + 25, +-25, +-63, + 29, +-18, +-59, + 31, +-24, +-55, + 23, +-42, +-62, + 18, +-49, +-67, + 19, +-42, +-68, + 22, +-34, +-68, + 20, +-32, +-72, + 12, +-33, +-55, + 41, + 11, + 7, + 59, + 45, + 49, + 42, + 45, + 49, + 11, + 21, + 20, + -8, + 0, + -3, + 43, + 51, + 50, + 2, + 7, + 10, +-103, +-98, +-88, +-81, +-78, +-63, +-69, +-68, +-47, +-66, +-65, +-41, +-64, +-63, +-38, +-50, +-50, +-23, +-51, +-53, +-24, +-57, +-59, +-29, +-49, +-50, +-23, +-39, +-40, +-13, +-25, +-26, + 2, +-14, +-15, + 14, + 0, + -2, + 27, + 35, + 33, + 56, + 82, + 79, + 89, +104, +102, +110, +102, +102, +105, +103, +105, +101, +105, +107, + 99, +105, +104, + 99, +107, +103, +103, +107, +103, +103, +106, +103, +102, +105, +103, +101, +103, +101, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, + 99, + 60, + 62, + 76, + 51, + 52, + 64, +-16, +-16, + -6, +-66, +-67, +-54, + 38, + 36, + 49, + 53, + 51, + 60, +102, +100, +103, +104, +102, +101, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +102, +104, +102, +100, +103, +101, +100, +102, +100, + 98, + 95, + 93, + 91, + 73, + 73, + 76, +-20, +-20, + -9, +-69, +-73, +-51, +-75, +-80, +-54, +-77, +-81, +-61, +-78, +-79, +-66, +-79, +-79, +-62, +-79, +-80, +-62, +-79, +-80, +-62, +-81, +-81, +-63, +-82, +-83, +-65, +-78, +-78, +-61, +-77, +-77, +-61, +-75, +-75, +-59, +-84, +-83, +-68, +-87, +-87, +-71, +-90, +-89, +-74, +-91, +-90, +-76, +-87, +-86, +-73, +-90, +-89, +-78, +-92, +-90, +-81, +-93, +-90, +-82, +-90, +-87, +-81, + 9, + 17, + 10, + 17, + 24, + 11, + 14, + 22, + 11, + 10, + 15, + 7, + 28, + 11, + -5, + 11, +-38, +-71, + 19, +-30, +-68, + 24, +-26, +-60, + 14, +-40, +-68, + 5, +-51, +-76, + 10, +-48, +-75, + 24, +-36, +-66, + 22, +-34, +-65, + 17, +-19, +-36, + 65, + 50, + 44, + 42, + 41, + 42, + 37, + 43, + 46, + 18, + 26, + 24, + 12, + 21, + 16, + 31, + 39, + 38, +-44, +-38, +-35, +-103, +-99, +-89, +-89, +-85, +-72, +-76, +-73, +-56, +-64, +-62, +-43, +-59, +-57, +-37, +-59, +-58, +-36, +-62, +-62, +-38, +-64, +-63, +-39, +-56, +-56, +-31, +-51, +-51, +-26, +-42, +-43, +-15, +-29, +-30, + -1, +-19, +-20, + 10, + -9, +-11, + 19, + 1, + -3, + 21, + 39, + 36, + 55, + 89, + 88, +101, + 99, +100, +106, +101, +104, +104, +106, +106, +104, +108, +105, +103, +108, +106, +103, +108, +106, +104, +106, +104, +103, +105, +103, +101, +105, +103, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +103, +102, + 98, + 50, + 53, + 66, +-11, +-12, + 2, + 18, + 16, + 31, +-64, +-66, +-50, + 26, + 25, + 38, + 43, + 41, + 51, + 95, + 93, + 98, +104, +101, +102, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +100, +102, +100, + 98, +103, +101, + 99, +102, +100, + 98, + 95, + 93, + 92, + 72, + 72, + 77, +-32, +-33, +-21, +-86, +-89, +-70, +-88, +-92, +-71, +-89, +-91, +-74, +-85, +-85, +-73, +-86, +-85, +-70, +-86, +-85, +-70, +-86, +-86, +-70, +-89, +-88, +-73, +-87, +-86, +-70, +-83, +-82, +-67, +-83, +-82, +-68, +-81, +-80, +-67, +-89, +-88, +-74, +-92, +-91, +-78, +-90, +-89, +-76, +-89, +-88, +-74, +-89, +-87, +-75, +-93, +-92, +-81, +-94, +-92, +-83, +-95, +-92, +-84, +-92, +-89, +-83, + 11, + 23, + 15, + 19, + 29, + 14, + 15, + 26, + 12, + 13, + 20, + 12, + 32, + 19, + 7, + 12, +-30, +-56, + 25, +-35, +-65, + 18, +-38, +-71, + 18, +-34, +-68, + 12, +-42, +-72, + 13, +-47, +-72, + 31, +-35, +-56, + 22, +-32, +-51, + 23, + 2, +-13, + 50, + 55, + 44, + 28, + 42, + 36, + 30, + 35, + 35, + 26, + 30, + 28, + 24, + 33, + 28, + 16, + 24, + 23, +-54, +-48, +-45, +-102, +-97, +-88, +-89, +-86, +-73, +-87, +-83, +-71, +-73, +-68, +-57, +-75, +-72, +-59, +-102, +-99, +-85, +-76, +-73, +-57, +-67, +-65, +-46, +-64, +-62, +-41, +-59, +-58, +-36, +-51, +-51, +-27, +-44, +-44, +-19, +-35, +-35, + -8, +-23, +-26, + 5, +-14, +-22, + 16, + -9, +-16, + 18, + 4, + -1, + 25, + 31, + 29, + 47, + 65, + 64, + 77, + 95, + 96, +100, +103, +104, +102, +103, +104, +102, +104, +104, +102, +104, +102, +101, +103, +101, +101, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, + 99, + 71, + 75, + 87, + 4, + 4, + 18, + 38, + 35, + 53, +-10, +-12, + 5, + 19, + 17, + 33, + 42, + 39, + 51, + 87, + 84, + 90, +103, +100, +103, +104, +101, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +104, +102, +100, +104, +102, +100, +103, +101, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +102, +100, + 98, + 97, + 95, + 93, + 29, + 28, + 35, +-73, +-75, +-61, +-91, +-93, +-77, +-94, +-96, +-81, +-91, +-92, +-79, +-87, +-87, +-77, +-92, +-90, +-79, +-92, +-91, +-79, +-92, +-90, +-78, +-90, +-88, +-76, +-88, +-87, +-74, +-87, +-86, +-73, +-86, +-84, +-72, +-87, +-86, +-74, +-100, +-98, +-87, +-93, +-92, +-80, +-90, +-89, +-77, +-88, +-86, +-74, +-89, +-88, +-75, +-94, +-92, +-81, +-97, +-94, +-85, +-96, +-93, +-86, +-92, +-89, +-83, + 18, + 29, + 23, + 24, + 34, + 19, + 18, + 28, + 14, + 14, + 26, + 18, + 28, + 24, + 14, + 25, + -1, +-19, + 25, +-36, +-55, + 29, +-35, +-61, + 31, +-33, +-65, + 15, +-47, +-77, + 21, +-40, +-59, + 27, +-30, +-40, + 45, + 12, + 4, + 40, + 32, + 20, + 29, + 43, + 30, + 23, + 41, + 31, + 33, + 40, + 35, + 29, + 34, + 28, + 27, + 36, + 31, + 28, + 36, + 35, +-81, +-76, +-73, +-98, +-94, +-84, +-92, +-89, +-75, +-91, +-86, +-76, +-93, +-88, +-80, +-103, +-98, +-89, +-106, +-102, +-90, +-84, +-81, +-68, +-71, +-68, +-52, +-66, +-64, +-45, +-65, +-63, +-44, +-63, +-62, +-41, +-58, +-56, +-34, +-49, +-48, +-24, +-41, +-42, +-14, +-29, +-35, + 4, +-24, +-28, + 7, +-18, +-21, + 10, +-14, +-16, + 12, + -8, + -9, + 15, + 7, + 9, + 24, + 57, + 61, + 67, + 98, +100, +105, +102, +102, +106, +103, +100, +102, +103, + 99, +100, +102, + 99, + 98, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 96, + 78, + 85, + 93, + 47, + 48, + 58, + 45, + 42, + 56, + 20, + 17, + 36, + 25, + 23, + 40, + 42, + 39, + 51, + 72, + 69, + 76, +104, +101, +105, +103, +100, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +101, + 99, + 97, +103, +101, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 98, +101, + 99, + 98, + 89, + 87, + 86, +-29, +-31, +-23, +-84, +-86, +-71, +-94, +-95, +-82, +-102, +-102, +-91, +-98, +-98, +-88, +-94, +-94, +-86, +-95, +-93, +-84, +-95, +-93, +-84, +-95, +-93, +-84, +-93, +-91, +-82, +-93, +-91, +-82, +-93, +-91, +-82, +-89, +-87, +-76, +-88, +-86, +-76, +-106, +-104, +-93, +-96, +-95, +-84, +-89, +-87, +-77, +-89, +-87, +-76, +-91, +-90, +-77, +-94, +-92, +-82, +-97, +-94, +-85, +-97, +-94, +-87, +-85, +-82, +-77, + 23, + 30, + 25, + 30, + 35, + 22, + 22, + 30, + 17, + 17, + 34, + 27, + 5, + 15, + 7, + 30, + 20, + 3, + 26, + -6, +-24, + 25, +-27, +-50, + 25, +-41, +-70, + 13, +-48, +-74, + 23, +-17, +-35, + 48, + 26, + 16, + 49, + 41, + 36, + 26, + 28, + 20, + 26, + 37, + 26, + 30, + 41, + 31, + 32, + 40, + 31, + 33, + 41, + 33, + 39, + 48, + 42, + 19, + 26, + 24, +-101, +-95, +-92, +-97, +-93, +-83, +-93, +-89, +-76, +-89, +-85, +-74, +-90, +-86, +-76, +-86, +-82, +-70, +-82, +-78, +-65, +-82, +-78, +-64, +-72, +-69, +-53, +-69, +-66, +-50, +-68, +-65, +-49, +-68, +-66, +-48, +-68, +-66, +-47, +-63, +-61, +-40, +-53, +-52, +-30, +-45, +-45, +-19, +-37, +-37, +-10, +-33, +-33, + -5, +-26, +-27, + 2, +-16, +-17, + 13, +-10, + -9, + 18, + -9, + -7, + 16, + 27, + 28, + 44, + 69, + 68, + 79, +101, + 98, +103, +103, + 98, + 99, +102, + 99, + 98, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 96, + 71, + 79, + 88, + 89, + 93, +101, + 81, + 81, + 92, + 51, + 49, + 66, + 34, + 32, + 49, + 43, + 41, + 56, + 57, + 54, + 64, +103, +100, +104, +103, +100, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +101, + 99, + 97, +100, + 98, + 96, +104, +101, + 99, +104, +102, + 99, +104, +102, + 99, +104, +102, +100, +103, +101, +101, + 62, + 60, + 61, +-61, +-63, +-51, +-91, +-92, +-78, +-101, +-101, +-90, +-105, +-105, +-96, +-101, +-101, +-93, +-98, +-97, +-90, +-98, +-96, +-90, +-98, +-96, +-89, +-98, +-96, +-89, +-99, +-96, +-89, +-96, +-94, +-86, +-94, +-91, +-83, +-91, +-89, +-79, +-93, +-91, +-81, +-107, +-104, +-94, +-96, +-94, +-84, +-90, +-88, +-78, +-92, +-90, +-79, +-93, +-92, +-80, +-95, +-93, +-82, +-97, +-95, +-85, +-99, +-96, +-89, +-85, +-82, +-78, + 26, + 29, + 26, + 30, + 33, + 21, + 26, + 33, + 21, + 21, + 38, + 30, + 22, + 36, + 29, + 17, + 20, + 7, + 28, + 22, + 6, + 19, + -9, +-28, + 13, +-35, +-58, + 21, +-19, +-39, + 55, + 39, + 22, + 43, + 48, + 36, + 38, + 49, + 43, + 30, + 38, + 31, + 34, + 39, + 31, + 35, + 41, + 32, + 32, + 40, + 30, + 37, + 46, + 38, + 47, + 55, + 51, + -8, + -2, + -3, +-104, +-99, +-94, +-98, +-94, +-84, +-90, +-87, +-74, +-91, +-88, +-76, +-89, +-85, +-74, +-89, +-86, +-73, +-92, +-89, +-75, +-73, +-70, +-55, +-59, +-56, +-41, +-67, +-65, +-50, +-70, +-68, +-52, +-72, +-70, +-54, +-72, +-71, +-53, +-70, +-68, +-49, +-61, +-60, +-41, +-58, +-56, +-39, +-49, +-47, +-28, +-44, +-44, +-21, +-36, +-37, +-10, +-34, +-35, + -5, +-32, +-32, + 1, +-32, +-33, + 0, +-25, +-27, + 0, + -9, +-11, + 6, + 83, + 78, + 84, +102, + 98, + 97, +100, + 98, + 95, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 97, +102, +100, + 97, +101, +100, + 96, + 72, + 78, + 89, + 92, + 95, +104, + 94, + 96, +104, + 61, + 63, + 73, + 35, + 36, + 52, + 43, + 40, + 60, + 46, + 43, + 57, + 95, + 94, + 96, +102, +101, + 97, +101, + 99, + 98, +101, + 99, + 98, +102, +100, + 99, +103, +101, +100, +103, +101, +100, +104, +101, + 98, +105, +101, + 97, +104, +101, + 97, +104, +102, +101, +101, + 99, +104, + 16, + 12, + 24, +-69, +-70, +-60, +-97, +-97, +-88, +-104, +-104, +-95, +-109, +-109, +-100, +-102, +-102, +-93, +-99, +-99, +-90, +-100, +-99, +-93, +-100, +-100, +-92, +-100, +-100, +-91, +-98, +-99, +-88, +-95, +-96, +-83, +-93, +-94, +-81, +-91, +-89, +-80, +-93, +-90, +-82, +-105, +-103, +-95, +-96, +-93, +-85, +-91, +-88, +-80, +-92, +-89, +-82, +-95, +-93, +-85, +-96, +-95, +-83, +-97, +-95, +-84, +-100, +-97, +-91, +-85, +-81, +-80, + 24, + 31, + 24, + 29, + 36, + 27, + 27, + 34, + 25, + 28, + 36, + 27, + 30, + 38, + 29, + 22, + 29, + 20, + 20, + 24, + 15, + 26, + 20, + 11, + 7, + -7, +-17, + 56, + 44, + 33, + 50, + 47, + 37, + 43, + 49, + 40, + 37, + 43, + 37, + 33, + 40, + 33, + 34, + 41, + 34, + 34, + 40, + 34, + 34, + 40, + 34, + 45, + 51, + 48, + 46, + 51, + 52, +-43, +-39, +-37, +-99, +-96, +-89, +-96, +-94, +-83, +-91, +-89, +-76, +-86, +-84, +-73, +-94, +-92, +-81, +-87, +-85, +-74, +-89, +-87, +-77, +-86, +-84, +-73, +-80, +-78, +-67, +-69, +-69, +-53, +-69, +-69, +-52, +-74, +-74, +-57, +-76, +-76, +-59, +-73, +-73, +-56, +-67, +-66, +-49, +-63, +-63, +-44, +-60, +-61, +-41, +-53, +-54, +-33, +-49, +-51, +-27, +-49, +-51, +-26, +-49, +-50, +-24, +-50, +-52, +-24, +-38, +-41, +-16, +-29, +-35, +-15, + 57, + 50, + 58, +102, + 96, + 94, +100, + 97, + 93, +100, + 98, + 94, +100, + 98, + 94, +101, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 93, + 92, + 96, + 98, + 95, + 97, + 98, + 94, + 95, + 74, + 76, + 83, + 36, + 37, + 51, + 43, + 41, + 59, + 43, + 41, + 55, + 84, + 83, + 86, +101, + 99, + 97, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, + 99, + 98, +103, + 99, + 97, +103, +100, + 96, +102, +100, + 99, + 85, + 82, + 89, +-39, +-43, +-30, +-83, +-84, +-73, +-103, +-103, +-94, +-109, +-109, +-100, +-111, +-111, +-102, +-104, +-104, +-95, +-100, +-100, +-92, +-101, +-100, +-93, +-101, +-101, +-93, +-100, +-100, +-91, +-98, +-99, +-88, +-95, +-96, +-83, +-93, +-93, +-81, +-91, +-89, +-80, +-92, +-89, +-81, +-101, +-99, +-91, +-100, +-97, +-89, +-92, +-89, +-81, +-92, +-89, +-82, +-95, +-93, +-85, +-96, +-95, +-83, +-97, +-96, +-84, +-101, +-98, +-92, +-81, +-77, +-77, + 26, + 32, + 25, + 29, + 37, + 28, + 27, + 34, + 25, + 29, + 36, + 27, + 32, + 39, + 30, + 28, + 36, + 27, + 22, + 30, + 21, + 30, + 32, + 21, + 50, + 46, + 34, + 51, + 47, + 36, + 44, + 47, + 37, + 41, + 49, + 41, + 34, + 41, + 34, + 35, + 42, + 35, + 34, + 41, + 34, + 34, + 41, + 34, + 40, + 47, + 40, + 46, + 52, + 49, + 36, + 40, + 42, +-80, +-77, +-74, +-98, +-95, +-88, +-96, +-94, +-83, +-90, +-89, +-76, +-87, +-85, +-74, +-90, +-88, +-78, +-95, +-93, +-82, +-88, +-86, +-76, +-85, +-83, +-72, +-84, +-82, +-72, +-73, +-72, +-57, +-71, +-71, +-56, +-78, +-77, +-62, +-80, +-80, +-65, +-82, +-81, +-66, +-78, +-77, +-62, +-73, +-72, +-56, +-69, +-69, +-52, +-63, +-64, +-45, +-61, +-62, +-41, +-61, +-62, +-40, +-61, +-62, +-38, +-63, +-65, +-39, +-42, +-44, +-20, +-38, +-43, +-24, + 35, + 28, + 36, +106, +100, + 99, +102, + 99, + 95, +101, +100, + 96, +101, +100, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 68, + 71, + 79, + 80, + 81, + 87, + 94, + 94, + 98, + 85, + 88, + 94, + 40, + 42, + 54, + 43, + 41, + 59, + 43, + 40, + 56, + 72, + 71, + 76, + 98, + 96, + 95, + 99, + 97, + 95, + 99, + 97, + 95, +100, + 98, + 96, +101, + 99, + 97, +101, + 99, + 97, +102, + 98, + 98, +102, + 98, + 97, +102, + 98, + 96, +100, + 97, + 98, + 49, + 47, + 54, +-69, +-74, +-58, +-90, +-92, +-80, +-105, +-105, +-96, +-109, +-109, +-100, +-111, +-111, +-102, +-105, +-105, +-96, +-102, +-102, +-93, +-100, +-99, +-92, +-99, +-99, +-91, +-98, +-98, +-88, +-97, +-98, +-87, +-95, +-96, +-82, +-93, +-93, +-80, +-92, +-89, +-81, +-92, +-89, +-81, +-97, +-94, +-86, +-103, +-101, +-93, +-94, +-91, +-83, +-93, +-90, +-83, +-95, +-93, +-85, +-97, +-95, +-84, +-98, +-96, +-85, +-103, +-100, +-94, +-84, +-79, +-79, + 25, + 32, + 25, + 28, + 35, + 26, + 27, + 34, + 25, + 29, + 36, + 27, + 32, + 40, + 30, + 33, + 41, + 32, + 28, + 40, + 31, + 39, + 47, + 36, + 46, + 51, + 37, + 42, + 48, + 34, + 40, + 50, + 39, + 31, + 42, + 34, + 31, + 38, + 31, + 33, + 39, + 33, + 35, + 42, + 35, + 38, + 45, + 39, + 44, + 51, + 44, + 45, + 51, + 48, + 16, + 20, + 21, +-102, +-99, +-95, +-98, +-95, +-88, +-97, +-95, +-84, +-91, +-90, +-77, +-87, +-86, +-74, +-88, +-86, +-75, +-88, +-86, +-75, +-83, +-81, +-70, +-90, +-88, +-78, +-93, +-91, +-80, +-74, +-73, +-60, +-75, +-74, +-61, +-80, +-78, +-65, +-84, +-83, +-70, +-87, +-86, +-73, +-87, +-85, +-73, +-83, +-81, +-69, +-79, +-78, +-64, +-74, +-73, +-57, +-71, +-71, +-53, +-71, +-72, +-53, +-72, +-72, +-52, +-74, +-74, +-53, +-55, +-57, +-35, +-47, +-52, +-35, + 28, + 21, + 29, +106, +100, +101, +101, + 98, + 95, +100, + 99, + 95, +100, + 99, + 95, +101, +100, + 95, +101, +100, + 96, +101, +100, + 96, + 99, + 97, + 93, + 53, + 65, + 78, + 62, + 69, + 81, + 88, + 94, +104, + 91, + 95, + 99, + 52, + 54, + 64, + 41, + 39, + 57, + 38, + 34, + 51, + 61, + 58, + 67, +103, +100, +102, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, + 99, +100, +105, + 99, +100, +104, +100, + 99, +100, + 97, +100, + 5, + 2, + 11, +-77, +-83, +-64, +-94, +-96, +-83, +-105, +-105, +-96, +-108, +-109, +-100, +-112, +-112, +-103, +-106, +-106, +-97, +-104, +-104, +-95, +-100, +-100, +-93, +-97, +-97, +-89, +-95, +-95, +-85, +-94, +-95, +-84, +-93, +-94, +-81, +-93, +-93, +-81, +-92, +-90, +-81, +-92, +-89, +-81, +-93, +-91, +-83, +-106, +-103, +-95, +-96, +-93, +-85, +-95, +-92, +-85, +-96, +-94, +-86, +-97, +-96, +-85, +-100, +-98, +-87, +-105, +-101, +-96, +-81, +-76, +-76, + 27, + 34, + 27, + 30, + 38, + 29, + 28, + 36, + 27, + 30, + 38, + 29, + 35, + 42, + 33, + 36, + 44, + 35, + 38, + 49, + 43, + 43, + 53, + 44, + 42, + 52, + 38, + 40, + 50, + 37, + 38, + 48, + 39, + 26, + 37, + 31, + 33, + 39, + 33, + 36, + 43, + 36, + 40, + 46, + 40, + 43, + 50, + 43, + 44, + 50, + 44, + 44, + 50, + 47, + -8, + -4, + -3, +-105, +-101, +-97, +-99, +-96, +-88, +-98, +-96, +-85, +-92, +-91, +-78, +-88, +-86, +-75, +-87, +-85, +-74, +-86, +-84, +-73, +-86, +-84, +-74, +-94, +-92, +-82, +-96, +-94, +-83, +-77, +-75, +-64, +-78, +-76, +-65, +-84, +-82, +-71, +-87, +-85, +-74, +-90, +-88, +-77, +-92, +-90, +-79, +-90, +-88, +-79, +-87, +-86, +-75, +-84, +-83, +-71, +-80, +-79, +-65, +-79, +-79, +-63, +-79, +-77, +-61, +-76, +-75, +-58, +-63, +-64, +-46, +-55, +-60, +-45, + 15, + 9, + 16, +103, + 97, + 98, +103, + 99, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 98, + 97, + 93, + 65, + 70, + 79, + 72, + 75, + 83, + 92, + 93, + 99, + 94, + 99, +100, + 63, + 65, + 73, + 47, + 45, + 63, + 38, + 35, + 52, + 50, + 47, + 57, + 98, + 95, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, +100, +101, +105, +100, +102, +104, +100, +101, + 91, + 87, + 91, +-39, +-43, +-32, +-83, +-88, +-68, +-96, +-98, +-85, +-107, +-107, +-98, +-110, +-110, +-101, +-112, +-112, +-103, +-106, +-106, +-97, +-104, +-104, +-95, +-100, +-100, +-93, +-97, +-97, +-89, +-94, +-95, +-85, +-94, +-95, +-83, +-95, +-96, +-83, +-96, +-96, +-84, +-95, +-92, +-84, +-95, +-92, +-84, +-94, +-92, +-84, +-107, +-104, +-96, +-99, +-97, +-88, +-97, +-94, +-87, +-98, +-95, +-87, +-99, +-97, +-86, +-101, +-99, +-88, +-104, +-101, +-95, +-76, +-72, +-72, + 30, + 37, + 29, + 32, + 40, + 30, + 30, + 37, + 28, + 34, + 41, + 32, + 38, + 45, + 36, + 37, + 44, + 36, + 46, + 52, + 48, + 51, + 59, + 51, + 44, + 54, + 42, + 40, + 50, + 39, + 38, + 46, + 39, + 32, + 39, + 34, + 41, + 48, + 41, + 44, + 50, + 44, + 43, + 50, + 44, + 42, + 49, + 42, + 42, + 49, + 43, + 43, + 49, + 46, +-43, +-39, +-38, +-103, +-99, +-95, +-98, +-95, +-88, +-98, +-96, +-85, +-92, +-91, +-78, +-87, +-85, +-74, +-87, +-85, +-74, +-87, +-85, +-75, +-90, +-88, +-78, +-101, +-99, +-88, +-91, +-89, +-79, +-81, +-79, +-69, +-86, +-84, +-73, +-89, +-87, +-77, +-92, +-90, +-79, +-94, +-93, +-82, +-97, +-95, +-85, +-96, +-93, +-85, +-92, +-90, +-82, +-90, +-88, +-78, +-89, +-88, +-77, +-86, +-84, +-71, +-89, +-86, +-73, +-85, +-83, +-70, +-79, +-79, +-63, +-67, +-71, +-58, +-20, +-26, +-19, + 98, + 92, + 93, +104, +101, + 98, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +102, + 98, + 93, + 93, + 98, +100, + 98, +103, +100, + 98, +101, + 95, + 98, + 99, + 79, + 80, + 88, + 54, + 52, + 69, + 45, + 42, + 60, + 44, + 42, + 56, + 88, + 86, + 92, +100, + 97, + 96, +101, + 99, + 98, +102, +100, + 99, +102, +100, + 98, +101, + 99, + 97, + 99, + 96, + 95, +103, + 99, + 99, +103, +100, +102, + 58, + 55, + 60, +-69, +-72, +-60, +-89, +-93, +-75, +-99, +-100, +-89, +-108, +-108, +-101, +-112, +-111, +-105, +-112, +-111, +-105, +-107, +-107, +-100, +-105, +-104, +-97, +-99, +-99, +-90, +-96, +-96, +-86, +-95, +-95, +-85, +-96, +-97, +-85, +-98, +-99, +-86, +-99, +-100, +-88, +-98, +-97, +-88, +-97, +-96, +-87, +-96, +-95, +-86, +-106, +-104, +-96, +-100, +-99, +-90, +-98, +-96, +-88, +-98, +-95, +-87, +-99, +-97, +-88, +-101, +-98, +-90, +-104, +-100, +-96, +-76, +-71, +-71, + 30, + 37, + 31, + 33, + 40, + 32, + 31, + 38, + 30, + 36, + 43, + 35, + 34, + 41, + 33, + 33, + 39, + 32, + 49, + 53, + 50, + 49, + 54, + 49, + 53, + 58, + 51, + 47, + 52, + 45, + 40, + 45, + 41, + 41, + 46, + 42, + 45, + 51, + 45, + 42, + 49, + 42, + 43, + 49, + 43, + 42, + 48, + 42, + 44, + 50, + 44, + 33, + 39, + 36, +-83, +-80, +-78, +-102, +-99, +-94, +-98, +-95, +-88, +-98, +-96, +-86, +-92, +-90, +-78, +-86, +-84, +-73, +-86, +-84, +-73, +-89, +-87, +-76, +-94, +-92, +-82, +-102, +-100, +-89, +-85, +-83, +-73, +-85, +-83, +-72, +-92, +-90, +-80, +-94, +-92, +-83, +-97, +-94, +-85, +-98, +-95, +-88, +-100, +-97, +-90, +-99, +-97, +-90, +-98, +-95, +-88, +-95, +-92, +-84, +-94, +-92, +-82, +-93, +-91, +-81, +-97, +-95, +-85, +-92, +-92, +-80, +-91, +-90, +-77, +-81, +-82, +-70, +-52, +-56, +-49, + 87, + 82, + 83, +105, +101, + 99, +105, +102, + 98, +104, +101, + 97, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 97, + 89, + 89, + 96, + 87, + 88, + 94, + 90, + 91, + 97, + 91, + 93, + 94, + 90, + 90, + 99, + 64, + 62, + 78, + 45, + 42, + 61, + 39, + 37, + 53, + 75, + 73, + 82, +100, + 98, + 97, +101, + 99, + 97, +100, + 97, + 96, +101, + 99, + 97, +102, +100, + 98, + 98, + 97, + 94, +101, + 99, + 97, +102, +100, +102, + 16, + 14, + 19, +-79, +-81, +-69, +-95, +-97, +-81, +-102, +-102, +-94, +-110, +-109, +-105, +-113, +-111, +-107, +-112, +-110, +-106, +-109, +-107, +-103, +-106, +-104, +-100, +-97, +-97, +-87, +-93, +-94, +-83, +-94, +-95, +-84, +-96, +-97, +-86, +-98, +-98, +-87, +-99, +-99, +-89, +-98, +-98, +-89, +-97, +-97, +-88, +-96, +-96, +-87, +-103, +-103, +-94, +-101, +-101, +-92, +-97, +-96, +-87, +-96, +-93, +-86, +-99, +-95, +-89, +-103, +-99, +-95, +-108, +-104, +-101, +-67, +-63, +-62, + 35, + 41, + 36, + 34, + 41, + 34, + 32, + 38, + 32, + 39, + 46, + 39, + 34, + 41, + 34, + 35, + 42, + 35, + 51, + 55, + 51, + 51, + 55, + 51, + 53, + 57, + 53, + 54, + 57, + 54, + 47, + 50, + 47, + 43, + 47, + 43, + 42, + 49, + 42, + 43, + 49, + 43, + 42, + 49, + 42, + 40, + 47, + 41, + 43, + 50, + 43, + 9, + 15, + 12, +-105, +-101, +-98, +-101, +-97, +-92, +-99, +-97, +-89, +-99, +-97, +-88, +-91, +-89, +-78, +-86, +-84, +-73, +-85, +-83, +-73, +-91, +-89, +-78, +-100, +-98, +-87, +-94, +-92, +-81, +-85, +-83, +-72, +-89, +-87, +-76, +-96, +-94, +-84, +-100, +-97, +-89, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-98, +-94, +-101, +-99, +-91, +-101, +-99, +-91, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-101, +-92, +-93, +-94, +-85, +-92, +-89, +-78, +-83, +-80, +-69, +-53, +-53, +-46, + 87, + 83, + 85, +100, + 96, + 94, +101, + 97, + 94, +105, +101, + 98, +105, +101, + 98, +104, +100, + 97, +104, +100, + 97, +102, + 99, + 93, +102, +103, +109, + 96, + 97, +103, + 99, + 99, +106, +101, +102, +106, +100, +100, +108, + 71, + 70, + 83, + 53, + 51, + 67, + 40, + 38, + 55, + 62, + 60, + 71, +101, + 99, + 97, +100, + 98, + 96, + 97, + 95, + 93, +101, + 99, + 97, +102, +100, + 98, +101, + 99, + 96, +101, + 99, + 97, + 91, + 88, + 92, +-41, +-43, +-36, +-83, +-84, +-72, +-95, +-97, +-83, +-105, +-105, +-98, +-112, +-111, +-107, +-113, +-111, +-107, +-112, +-110, +-106, +-109, +-107, +-103, +-106, +-104, +-100, +-98, +-98, +-89, +-95, +-95, +-86, +-96, +-96, +-87, +-98, +-98, +-89, +-100, +-100, +-91, +-100, +-100, +-91, +-98, +-98, +-89, +-97, +-97, +-88, +-95, +-95, +-86, +-101, +-101, +-92, +-104, +-104, +-95, +-97, +-96, +-87, +-96, +-93, +-86, +-99, +-95, +-89, +-103, +-99, +-95, +-107, +-103, +-100, +-65, +-60, +-60, + 39, + 46, + 41, + 38, + 44, + 38, + 33, + 40, + 33, + 39, + 46, + 39, + 34, + 41, + 34, + 35, + 41, + 35, + 54, + 58, + 54, + 54, + 57, + 54, + 53, + 56, + 53, + 57, + 60, + 57, + 52, + 56, + 52, + 49, + 52, + 49, + 44, + 50, + 44, + 42, + 49, + 42, + 40, + 47, + 40, + 38, + 45, + 38, + 39, + 46, + 39, +-26, +-21, +-25, +-106, +-101, +-98, +-99, +-96, +-90, +-100, +-97, +-90, +-99, +-97, +-88, +-91, +-89, +-78, +-86, +-84, +-74, +-89, +-87, +-77, +-94, +-93, +-82, +-102, +-100, +-90, +-88, +-86, +-75, +-85, +-83, +-73, +-90, +-88, +-78, +-98, +-96, +-86, +-101, +-98, +-91, +-103, +-100, +-94, +-103, +-99, +-95, +-103, +-100, +-95, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-97, +-89, +-102, +-99, +-91, +-105, +-105, +-97, +-97, +-97, +-89, +-93, +-90, +-80, +-82, +-79, +-68, +-59, +-59, +-51, + 64, + 59, + 63, +103, + 98, + 97, +102, + 98, + 95, +103, + 99, + 95, +101, + 97, + 94, +100, + 96, + 93, +100, + 96, + 93, +100, + 96, + 91, + 82, + 83, + 90, + 84, + 85, + 91, + 86, + 87, + 93, + 85, + 87, + 92, + 87, + 87, + 94, + 73, + 73, + 83, + 58, + 57, + 71, + 40, + 38, + 55, + 52, + 49, + 63, + 99, + 97, + 96, + 99, + 97, + 95, + 99, + 97, + 95, +102, +100, + 98, +101, + 99, + 97, +100, + 98, + 95, +101, + 98, + 98, + 54, + 50, + 55, +-74, +-76, +-65, +-87, +-88, +-76, +-100, +-100, +-91, +-110, +-109, +-104, +-114, +-112, +-108, +-115, +-113, +-109, +-112, +-111, +-107, +-111, +-110, +-106, +-108, +-107, +-102, +-102, +-102, +-95, +-98, +-98, +-91, +-98, +-98, +-90, +-99, +-99, +-92, +-101, +-101, +-93, +-102, +-102, +-94, +-101, +-101, +-92, +-98, +-98, +-89, +-96, +-96, +-87, +-98, +-98, +-89, +-106, +-106, +-97, +-98, +-97, +-88, +-97, +-94, +-86, +-99, +-96, +-90, +-102, +-98, +-94, +-106, +-101, +-99, +-66, +-63, +-62, + 41, + 47, + 42, + 40, + 47, + 40, + 34, + 41, + 34, + 44, + 51, + 44, + 38, + 44, + 38, + 37, + 44, + 37, + 55, + 58, + 55, + 54, + 57, + 54, + 53, + 57, + 53, + 56, + 60, + 56, + 49, + 52, + 49, + 54, + 59, + 54, + 51, + 57, + 51, + 43, + 50, + 43, + 37, + 44, + 38, + 38, + 45, + 38, + 36, + 43, + 36, +-55, +-50, +-54, +-104, +-100, +-96, +-100, +-97, +-91, +-100, +-97, +-89, +-99, +-97, +-88, +-93, +-91, +-80, +-90, +-88, +-78, +-94, +-92, +-82, +-99, +-98, +-87, +-97, +-95, +-85, +-86, +-84, +-73, +-83, +-81, +-71, +-90, +-88, +-77, +-97, +-94, +-85, +-101, +-98, +-91, +-102, +-99, +-93, +-102, +-98, +-95, +-102, +-99, +-94, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-99, +-97, +-89, +-102, +-100, +-92, +-107, +-106, +-100, +-101, +-100, +-95, +-95, +-92, +-83, +-83, +-80, +-70, +-63, +-64, +-54, + 39, + 34, + 40, +102, + 97, + 96, +101, + 97, + 93, +101, + 96, + 93, + 99, + 95, + 92, + 99, + 95, + 92, + 99, + 95, + 92, + 98, + 94, + 89, + 80, + 81, + 88, + 81, + 82, + 88, + 81, + 82, + 89, + 82, + 82, + 91, + 84, + 85, + 92, + 75, + 76, + 83, + 65, + 64, + 76, + 44, + 41, + 59, + 45, + 42, + 57, + 95, + 93, + 92, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +100, + 98, + 95, + 94, + 91, + 92, + -5, + -9, + -1, +-77, +-81, +-66, +-90, +-91, +-80, +-104, +-103, +-98, +-112, +-111, +-107, +-114, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-107, +-113, +-111, +-107, +-110, +-108, +-104, +-104, +-104, +-98, +-100, +-99, +-93, +-99, +-98, +-92, +-100, +-99, +-93, +-101, +-101, +-95, +-103, +-102, +-95, +-102, +-102, +-93, +-99, +-99, +-90, +-96, +-96, +-87, +-96, +-96, +-87, +-106, +-106, +-97, +-100, +-98, +-90, +-99, +-96, +-88, +-101, +-97, +-92, +-103, +-99, +-95, +-104, +-100, +-97, +-59, +-55, +-54, + 42, + 48, + 43, + 39, + 46, + 39, + 39, + 45, + 39, + 47, + 54, + 48, + 39, + 46, + 39, + 43, + 50, + 43, + 55, + 59, + 55, + 53, + 56, + 53, + 57, + 60, + 57, + 55, + 59, + 56, + 45, + 49, + 45, + 49, + 54, + 49, + 53, + 60, + 53, + 50, + 56, + 50, + 39, + 46, + 39, + 38, + 44, + 38, + 26, + 32, + 26, +-93, +-88, +-90, +-101, +-97, +-93, +-98, +-95, +-90, +-99, +-96, +-89, +-99, +-97, +-88, +-93, +-91, +-81, +-93, +-91, +-80, +-96, +-94, +-83, +-104, +-102, +-91, +-92, +-90, +-79, +-84, +-82, +-71, +-81, +-79, +-68, +-88, +-86, +-75, +-94, +-92, +-82, +-99, +-96, +-89, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-100, +-97, +-89, +-105, +-102, +-94, +-108, +-106, +-102, +-100, +-98, +-95, +-94, +-91, +-83, +-87, +-85, +-74, +-70, +-71, +-60, + 11, + 5, + 14, +104, +100, +100, +103, + 99, + 96, +104, +100, + 97, +104, +100, + 97, +104, +100, + 97, +104, +100, + 97, +103, + 99, + 94, + 79, + 79, + 86, + 81, + 81, + 88, + 84, + 85, + 92, + 88, + 87, + 98, + 86, + 86, + 94, + 81, + 81, + 87, + 74, + 73, + 83, + 46, + 44, + 62, + 41, + 38, + 54, + 83, + 81, + 80, +101, + 99, + 98, +101, + 99, + 97, +102, +100, + 98, +102, +100, + 98, +102, +101, + 98, + 92, + 89, + 90, +-36, +-41, +-30, +-80, +-85, +-68, +-95, +-96, +-85, +-107, +-105, +-104, +-113, +-111, +-108, +-114, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-107, +-113, +-111, +-107, +-110, +-108, +-104, +-106, +-105, +-101, +-101, +-100, +-96, +-101, +-100, +-96, +-102, +-100, +-96, +-103, +-102, +-98, +-104, +-103, +-98, +-102, +-102, +-93, +-99, +-99, +-90, +-97, +-97, +-88, +-96, +-96, +-87, +-105, +-105, +-96, +-100, +-99, +-90, +-98, +-95, +-88, +-100, +-97, +-91, +-102, +-98, +-94, +-102, +-98, +-95, +-55, +-51, +-50, + 45, + 52, + 47, + 43, + 50, + 44, + 45, + 52, + 45, + 47, + 53, + 47, + 38, + 45, + 38, + 48, + 54, + 48, + 51, + 55, + 51, + 54, + 58, + 54, + 57, + 61, + 57, + 57, + 60, + 57, + 46, + 49, + 46, + 45, + 49, + 45, + 53, + 60, + 53, + 55, + 61, + 55, + 43, + 50, + 43, + 38, + 45, + 38, + -2, + 4, + -2, +-106, +-101, +-102, +-100, +-96, +-92, +-99, +-96, +-90, +-99, +-96, +-89, +-99, +-97, +-88, +-93, +-91, +-81, +-94, +-92, +-81, +-101, +-99, +-88, +-103, +-101, +-90, +-89, +-87, +-77, +-86, +-84, +-73, +-83, +-81, +-70, +-87, +-85, +-75, +-93, +-91, +-81, +-99, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-108, +-106, +-98, +-108, +-106, +-102, +-99, +-97, +-96, +-94, +-90, +-83, +-90, +-87, +-75, +-74, +-75, +-63, +-25, +-32, +-21, + 94, + 89, + 90, +103, + 99, + 96, +105, +101, + 98, +106, +102, + 99, +106, +101, + 98, +105, +101, + 98, +104, +101, + 95, + 79, + 79, + 85, + 81, + 80, + 86, + 72, + 71, + 78, + 66, + 66, + 76, + 53, + 54, + 62, + 49, + 51, + 58, + 49, + 50, + 59, + 48, + 45, + 61, + 41, + 37, + 52, + 68, + 66, + 71, + 98, + 97, + 97, +100, + 99, + 95, +101, + 99, + 94, +102, + 99, + 96, +102, +101, + 98, + 69, + 70, + 71, +-58, +-60, +-48, +-89, +-92, +-74, +-98, +-99, +-87, +-109, +-107, +-105, +-113, +-110, +-110, +-114, +-112, +-111, +-116, +-114, +-112, +-113, +-112, +-109, +-114, +-112, +-108, +-111, +-109, +-105, +-106, +-105, +-99, +-104, +-103, +-97, +-103, +-102, +-96, +-102, +-102, +-96, +-103, +-103, +-97, +-104, +-103, +-96, +-104, +-102, +-94, +-101, +-99, +-91, +-96, +-94, +-86, +-96, +-94, +-86, +-105, +-103, +-95, +-100, +-98, +-90, +-94, +-91, +-84, +-98, +-94, +-88, +-101, +-98, +-94, +-100, +-96, +-93, +-54, +-50, +-49, + 50, + 56, + 51, + 49, + 56, + 49, + 46, + 52, + 46, + 45, + 52, + 45, + 36, + 43, + 36, + 52, + 59, + 52, + 53, + 60, + 52, + 51, + 57, + 49, + 53, + 58, + 53, + 53, + 59, + 55, + 45, + 51, + 47, + 40, + 45, + 41, + 52, + 59, + 52, + 54, + 61, + 54, + 45, + 51, + 48, + 37, + 42, + 41, +-44, +-40, +-40, +-103, +-99, +-95, +-99, +-96, +-89, +-99, +-96, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-94, +-91, +-83, +-95, +-92, +-85, +-105, +-102, +-94, +-99, +-96, +-87, +-91, +-89, +-78, +-86, +-85, +-73, +-84, +-83, +-70, +-87, +-85, +-74, +-93, +-91, +-81, +-98, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-111, +-109, +-101, +-107, +-105, +-98, +-100, +-98, +-91, +-95, +-92, +-84, +-89, +-88, +-76, +-77, +-77, +-64, +-53, +-54, +-41, + 69, + 67, + 67, +102, +100, + 96, +102, +100, + 96, +105, +102, + 98, +105, +102, + 98, +105, +102, + 98, +105, +103, + 98, + 65, + 74, + 87, + 66, + 75, + 88, + 66, + 74, + 87, + 76, + 79, + 92, + 77, + 79, + 89, + 78, + 81, + 88, + 79, + 80, + 89, + 75, + 74, + 87, + 45, + 41, + 56, + 57, + 55, + 64, + 95, + 94, + 96, + 97, + 96, + 92, +101, + 98, + 93, +103, + 98, + 96, +102, +101, + 99, + 42, + 44, + 45, +-71, +-72, +-60, +-91, +-94, +-76, +-99, +-100, +-88, +-111, +-109, +-107, +-113, +-111, +-112, +-114, +-112, +-112, +-116, +-113, +-113, +-115, +-113, +-111, +-114, +-113, +-109, +-110, +-109, +-104, +-107, +-106, +-100, +-105, +-105, +-98, +-104, +-103, +-97, +-104, +-103, +-97, +-103, +-103, +-96, +-102, +-101, +-94, +-101, +-99, +-91, +-102, +-99, +-91, +-97, +-94, +-86, +-95, +-93, +-84, +-103, +-100, +-92, +-100, +-97, +-89, +-92, +-90, +-82, +-98, +-94, +-88, +-101, +-97, +-93, +-101, +-97, +-94, +-46, +-42, +-42, + 52, + 58, + 53, + 48, + 55, + 48, + 46, + 53, + 46, + 44, + 51, + 44, + 38, + 45, + 39, + 50, + 57, + 50, + 49, + 56, + 47, + 52, + 59, + 50, + 51, + 58, + 51, + 52, + 58, + 53, + 44, + 50, + 47, + 40, + 46, + 42, + 49, + 56, + 48, + 54, + 60, + 54, + 44, + 50, + 47, + 28, + 33, + 35, +-80, +-77, +-74, +-101, +-97, +-91, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-97, +-89, +-101, +-98, +-90, +-95, +-92, +-84, +-99, +-96, +-90, +-106, +-103, +-96, +-97, +-95, +-87, +-93, +-91, +-81, +-87, +-85, +-74, +-84, +-83, +-70, +-88, +-86, +-75, +-93, +-91, +-82, +-99, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-99, +-91, +-111, +-109, +-100, +-106, +-103, +-95, +-100, +-97, +-89, +-96, +-94, +-85, +-90, +-89, +-76, +-79, +-78, +-65, +-60, +-59, +-45, + 48, + 47, + 47, +103, +102, + 98, +104, +103, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, + -5, + 17, + 41, + -1, + 22, + 46, + -4, + 17, + 40, + 54, + 62, + 79, + 77, + 82, + 94, + 80, + 82, + 89, + 77, + 76, + 84, + 73, + 71, + 84, + 48, + 46, + 61, + 53, + 50, + 60, + 93, + 92, + 95, +100, + 98, + 96, +100, + 97, + 94, + 99, + 94, + 94, + 93, + 92, + 93, + -5, + -4, + 1, +-84, +-85, +-73, +-99, +-100, +-85, +-104, +-104, +-95, +-112, +-110, +-108, +-113, +-111, +-112, +-114, +-112, +-112, +-116, +-113, +-113, +-116, +-114, +-112, +-115, +-113, +-109, +-108, +-107, +-103, +-108, +-107, +-101, +-107, +-106, +-99, +-105, +-105, +-98, +-105, +-105, +-98, +-102, +-102, +-95, +-101, +-100, +-93, +-101, +-98, +-90, +-100, +-97, +-89, +-94, +-92, +-84, +-95, +-92, +-84, +-99, +-97, +-89, +-105, +-102, +-94, +-99, +-96, +-88, +-101, +-97, +-92, +-101, +-97, +-93, +-100, +-96, +-94, +-45, +-41, +-40, + 51, + 58, + 53, + 50, + 57, + 51, + 50, + 57, + 50, + 45, + 51, + 45, + 41, + 48, + 41, + 56, + 63, + 56, + 52, + 59, + 51, + 49, + 57, + 48, + 52, + 59, + 52, + 50, + 56, + 52, + 44, + 50, + 46, + 41, + 48, + 44, + 45, + 52, + 45, + 54, + 61, + 54, + 46, + 51, + 49, + 12, + 16, + 18, +-103, +-99, +-96, +-100, +-97, +-90, +-99, +-96, +-88, +-99, +-96, +-88, +-98, +-96, +-88, +-100, +-97, +-89, +-96, +-94, +-85, +-104, +-101, +-95, +-102, +-99, +-92, +-95, +-92, +-84, +-91, +-89, +-79, +-88, +-86, +-75, +-89, +-87, +-74, +-90, +-88, +-77, +-95, +-93, +-84, +-100, +-98, +-90, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-103, +-100, +-93, +-110, +-107, +-99, +-104, +-101, +-93, +-99, +-96, +-88, +-97, +-94, +-85, +-92, +-91, +-79, +-82, +-80, +-67, +-62, +-61, +-47, + 44, + 42, + 42, +103, +101, + 97, +103, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +102, +101, + 97, +-23, + 9, + 41, +-19, + 14, + 46, +-19, + 12, + 42, + 22, + 36, + 57, + 81, + 89, +103, + 93, + 94, +101, + 73, + 71, + 78, + 45, + 43, + 57, + 43, + 41, + 59, + 48, + 44, + 56, + 82, + 81, + 86, + 96, + 94, + 94, + 97, + 94, + 92, + 99, + 94, + 96, + 66, + 63, + 69, +-54, +-54, +-46, +-97, +-98, +-87, +-105, +-106, +-96, +-110, +-109, +-103, +-114, +-112, +-111, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-114, +-112, +-108, +-107, +-106, +-102, +-108, +-108, +-101, +-107, +-107, +-100, +-105, +-105, +-98, +-104, +-104, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-99, +-90, +-98, +-96, +-87, +-96, +-93, +-85, +-95, +-92, +-84, +-96, +-94, +-86, +-106, +-104, +-96, +-99, +-96, +-89, +-100, +-96, +-91, +-102, +-99, +-95, +-101, +-97, +-94, +-47, +-43, +-42, + 51, + 57, + 52, + 52, + 59, + 52, + 51, + 58, + 51, + 42, + 49, + 42, + 41, + 47, + 41, + 52, + 59, + 52, + 61, + 68, + 59, + 52, + 60, + 51, + 48, + 54, + 48, + 49, + 55, + 51, + 43, + 49, + 45, + 42, + 48, + 44, + 42, + 49, + 41, + 52, + 58, + 52, + 44, + 49, + 47, +-24, +-20, +-18, +-105, +-102, +-98, +-100, +-97, +-91, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-97, +-89, +-106, +-103, +-97, +-98, +-95, +-89, +-94, +-91, +-83, +-93, +-91, +-80, +-91, +-89, +-78, +-93, +-92, +-79, +-96, +-94, +-84, +-101, +-99, +-90, +-102, +-99, +-92, +-104, +-101, +-95, +-104, +-100, +-96, +-104, +-101, +-96, +-104, +-102, +-94, +-103, +-100, +-92, +-101, +-98, +-90, +-105, +-102, +-94, +-108, +-106, +-97, +-103, +-100, +-92, +-99, +-97, +-89, +-96, +-94, +-85, +-93, +-91, +-79, +-85, +-83, +-70, +-71, +-70, +-56, + 39, + 38, + 38, +100, + 99, + 95, +100, + 99, + 95, +101, +100, + 96, +101, +100, + 96, +102, +101, + 97, +101, +100, + 96, +-25, + 10, + 43, +-26, + 10, + 43, +-22, + 12, + 45, + 0, + 20, + 45, + 74, + 84, + 99, + 92, + 93, + 99, + 84, + 81, + 87, + 49, + 47, + 61, + 41, + 41, + 60, + 43, + 40, + 54, + 71, + 68, + 76, +103, +100, +101, +103, + 99, + 99, +102, + 97, + 99, + 18, + 14, + 21, +-82, +-83, +-70, +-101, +-102, +-91, +-106, +-106, +-99, +-111, +-109, +-105, +-114, +-112, +-111, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-113, +-112, +-108, +-108, +-106, +-102, +-108, +-108, +-101, +-107, +-107, +-100, +-105, +-105, +-98, +-103, +-103, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-98, +-90, +-98, +-95, +-87, +-96, +-93, +-85, +-94, +-91, +-83, +-95, +-92, +-84, +-107, +-105, +-97, +-101, +-98, +-91, +-100, +-97, +-91, +-101, +-98, +-94, +-100, +-96, +-93, +-42, +-38, +-38, + 51, + 57, + 53, + 53, + 60, + 53, + 46, + 53, + 46, + 36, + 43, + 36, + 44, + 50, + 44, + 47, + 54, + 47, + 58, + 65, + 56, + 54, + 61, + 52, + 48, + 55, + 49, + 47, + 53, + 49, + 41, + 47, + 43, + 45, + 51, + 46, + 44, + 51, + 43, + 48, + 55, + 49, + 37, + 43, + 40, +-74, +-70, +-69, +-102, +-98, +-95, +-99, +-96, +-90, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-99, +-97, +-88, +-105, +-102, +-94, +-107, +-104, +-98, +-100, +-97, +-91, +-98, +-95, +-87, +-97, +-95, +-85, +-96, +-94, +-83, +-97, +-96, +-83, +-103, +-101, +-90, +-103, +-101, +-91, +-102, +-99, +-91, +-99, +-96, +-90, +-97, +-94, +-90, +-94, +-91, +-86, +-93, +-90, +-82, +-100, +-98, +-90, +-99, +-96, +-88, +-114, +-111, +-104, +-109, +-106, +-98, +-103, +-100, +-92, +-100, +-97, +-89, +-96, +-93, +-85, +-94, +-92, +-80, +-87, +-86, +-73, +-77, +-76, +-62, + 20, + 19, + 18, +103, +102, + 98, +105, +103, + 99, +105, +103, + 99, +104, +103, + 99, +100, + 98, + 94, +100, + 99, + 95, +-26, + 7, + 39, +-25, + 8, + 41, +-22, + 10, + 43, +-14, + 7, + 35, + 52, + 64, + 81, + 93, + 96, +101, + 92, + 89, + 95, + 67, + 65, + 79, + 44, + 42, + 62, + 46, + 42, + 57, + 61, + 59, + 67, +102, + 99, +101, +103, + 99, +100, + 90, + 84, + 88, +-31, +-35, +-26, +-92, +-94, +-79, +-104, +-104, +-94, +-107, +-107, +-100, +-111, +-109, +-106, +-114, +-112, +-110, +-115, +-112, +-112, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-113, +-112, +-108, +-108, +-106, +-102, +-108, +-108, +-102, +-107, +-107, +-100, +-106, +-105, +-99, +-103, +-103, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-98, +-90, +-98, +-95, +-87, +-96, +-93, +-85, +-92, +-89, +-81, +-93, +-91, +-83, +-108, +-105, +-97, +-103, +-100, +-93, +-100, +-97, +-91, +-101, +-98, +-93, +-101, +-97, +-94, +-39, +-35, +-35, + 51, + 57, + 52, + 46, + 53, + 46, + 38, + 45, + 38, + 32, + 39, + 32, + 50, + 57, + 50, + 55, + 62, + 55, + 53, + 60, + 52, + 55, + 62, + 53, + 54, + 61, + 54, + 47, + 54, + 49, + 47, + 53, + 48, + 48, + 54, + 50, + 48, + 55, + 47, + 45, + 52, + 45, + 22, + 27, + 25, +-103, +-99, +-97, +-102, +-98, +-94, +-99, +-96, +-89, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-102, +-99, +-91, +-105, +-103, +-95, +-103, +-100, +-93, +-98, +-95, +-88, +-97, +-94, +-86, +-96, +-94, +-84, +-93, +-92, +-81, +-95, +-94, +-81, +-96, +-94, +-84, +-97, +-94, +-85, +-102, +-99, +-91, +-105, +-102, +-96, +-104, +-100, +-96, +-103, +-99, +-94, +-99, +-96, +-88, +-97, +-95, +-86, +-99, +-97, +-89, +-117, +-115, +-107, +-109, +-106, +-99, +-103, +-101, +-93, +-100, +-97, +-89, +-96, +-93, +-85, +-93, +-91, +-79, +-87, +-86, +-73, +-80, +-79, +-65, +-24, +-25, +-25, + 99, + 96, + 93, +104, +102, + 99, +106, +104, +100, +105, +103, + 99, + 96, + 95, + 91, + 96, + 95, + 90, +-18, + 3, + 31, +-14, + 6, + 38, +-16, + 3, + 37, +-17, + 2, + 29, + 35, + 48, + 64, + 89, + 93, +100, + 94, + 93, + 99, + 73, + 69, + 82, + 51, + 47, + 65, + 46, + 44, + 60, + 51, + 51, + 59, + 93, + 95, + 96, + 99, +101, +101, + 58, + 59, + 62, +-73, +-73, +-66, +-103, +-104, +-95, +-106, +-106, +-99, +-110, +-109, +-105, +-113, +-111, +-108, +-114, +-112, +-110, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-119, +-117, +-116, +-114, +-113, +-109, +-109, +-108, +-104, +-109, +-108, +-103, +-108, +-106, +-102, +-106, +-105, +-100, +-103, +-102, +-98, +-102, +-100, +-96, +-101, +-99, +-94, +-101, +-98, +-90, +-99, +-96, +-88, +-95, +-92, +-84, +-91, +-88, +-80, +-91, +-89, +-80, +-105, +-101, +-96, +-102, +-98, +-94, +-100, +-97, +-90, +-101, +-98, +-91, +-102, +-98, +-95, +-41, +-36, +-38, + 49, + 55, + 50, + 43, + 50, + 43, + 40, + 47, + 40, + 35, + 41, + 35, + 54, + 61, + 54, + 54, + 61, + 54, + 54, + 61, + 56, + 51, + 58, + 53, + 51, + 57, + 52, + 45, + 51, + 47, + 48, + 54, + 50, + 50, + 56, + 52, + 48, + 54, + 48, + 42, + 48, + 44, + -9, + -5, + -6, +-106, +-102, +-100, +-102, +-98, +-93, +-101, +-98, +-91, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-97, +-91, +-107, +-103, +-98, +-99, +-96, +-90, +-101, +-98, +-91, +-103, +-101, +-93, +-104, +-101, +-93, +-102, +-100, +-91, +-100, +-98, +-89, +-99, +-97, +-88, +-100, +-97, +-89, +-100, +-98, +-89, +-102, +-99, +-91, +-105, +-102, +-94, +-106, +-103, +-95, +-103, +-100, +-92, +-100, +-98, +-88, +-94, +-92, +-83, +-108, +-106, +-98, +-116, +-113, +-107, +-108, +-105, +-101, +-103, +-99, +-94, +-100, +-97, +-89, +-97, +-94, +-85, +-93, +-92, +-80, +-88, +-87, +-74, +-80, +-80, +-65, +-60, +-68, +-58, + 81, + 72, + 77, +106, +100, + 99, +102, +100, + 95, +103, +103, + 97, + 95, + 96, + 92, + 92, + 92, + 85, + 83, + 88, +100, + 81, + 85, +101, + 75, + 78, + 96, + 57, + 67, + 86, + 56, + 63, + 77, + 79, + 81, + 88, + 95, + 95, +102, + 74, + 73, + 87, + 52, + 51, + 69, + 50, + 48, + 64, + 49, + 49, + 59, + 84, + 85, + 90, + 87, + 89, + 91, +-30, +-28, +-25, +-102, +-101, +-96, +-111, +-110, +-106, +-112, +-110, +-108, +-113, +-111, +-110, +-114, +-111, +-112, +-116, +-113, +-115, +-115, +-112, +-114, +-115, +-113, +-114, +-117, +-114, +-114, +-120, +-117, +-116, +-115, +-113, +-109, +-109, +-108, +-104, +-109, +-108, +-104, +-108, +-106, +-102, +-106, +-105, +-101, +-106, +-104, +-100, +-104, +-103, +-99, +-103, +-101, +-97, +-101, +-98, +-92, +-99, +-96, +-90, +-95, +-92, +-85, +-92, +-89, +-82, +-91, +-88, +-81, +-103, +-100, +-95, +-103, +-99, +-96, +-99, +-96, +-89, +-101, +-98, +-91, +-101, +-96, +-94, +-34, +-29, +-32, + 49, + 56, + 50, + 46, + 52, + 46, + 42, + 49, + 43, + 36, + 42, + 36, + 50, + 56, + 50, + 51, + 58, + 51, + 53, + 59, + 55, + 53, + 59, + 55, + 54, + 60, + 56, + 41, + 47, + 43, + 41, + 47, + 43, + 47, + 53, + 49, + 48, + 54, + 49, + 43, + 49, + 45, +-45, +-41, +-43, +-104, +-99, +-97, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-104, +-100, +-95, +-110, +-107, +-101, +-103, +-100, +-94, +-99, +-96, +-88, +-101, +-98, +-90, +-104, +-101, +-93, +-102, +-100, +-92, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-97, +-89, +-100, +-98, +-90, +-102, +-99, +-91, +-104, +-101, +-93, +-105, +-103, +-94, +-103, +-101, +-92, +-99, +-97, +-87, +-96, +-94, +-85, +-118, +-115, +-108, +-114, +-111, +-105, +-105, +-101, +-98, +-102, +-98, +-93, +-101, +-98, +-90, +-98, +-95, +-86, +-94, +-92, +-80, +-87, +-86, +-73, +-78, +-77, +-63, +-71, +-78, +-66, + 35, + 28, + 33, +106, +101, +100, +103, +101, + 96, +105, +105, + 99, +102, +101, + 97, + 98, + 97, + 93, +106, +102, +106, +108, +103, +109, +104, +100, +108, + 99, +103, +113, + 92, + 93, +101, + 72, + 69, + 76, + 97, + 96, +105, + 80, + 81, + 96, + 51, + 53, + 71, + 49, + 47, + 63, + 49, + 48, + 61, + 72, + 72, + 80, + 4, + 5, + 9, +-102, +-101, +-97, +-110, +-108, +-106, +-111, +-108, +-108, +-114, +-111, +-112, +-115, +-111, +-114, +-116, +-112, +-117, +-117, +-113, +-118, +-115, +-112, +-114, +-115, +-113, +-114, +-117, +-114, +-114, +-120, +-118, +-116, +-115, +-113, +-109, +-110, +-108, +-104, +-112, +-110, +-106, +-111, +-109, +-105, +-110, +-108, +-104, +-109, +-107, +-103, +-107, +-106, +-102, +-106, +-104, +-100, +-104, +-101, +-96, +-102, +-99, +-94, +-99, +-96, +-90, +-96, +-93, +-88, +-93, +-90, +-84, +-104, +-99, +-96, +-104, +-100, +-97, +-98, +-94, +-88, +-101, +-98, +-91, +-102, +-98, +-95, +-26, +-21, +-24, + 46, + 52, + 46, + 45, + 52, + 45, + 42, + 49, + 43, + 39, + 46, + 39, + 52, + 59, + 52, + 52, + 58, + 52, + 51, + 57, + 53, + 53, + 59, + 55, + 51, + 57, + 53, + 45, + 51, + 46, + 38, + 44, + 40, + 45, + 51, + 47, + 45, + 52, + 47, + 32, + 38, + 34, +-97, +-92, +-93, +-105, +-101, +-98, +-101, +-98, +-93, +-102, +-99, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-105, +-102, +-96, +-110, +-107, +-101, +-104, +-101, +-95, +-101, +-99, +-91, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-97, +-89, +-100, +-98, +-90, +-102, +-99, +-91, +-104, +-101, +-94, +-106, +-103, +-95, +-102, +-100, +-91, +-96, +-94, +-84, +-100, +-98, +-89, +-120, +-116, +-109, +-111, +-108, +-103, +-108, +-104, +-100, +-105, +-101, +-96, +-102, +-99, +-91, +-99, +-96, +-87, +-95, +-93, +-81, +-86, +-85, +-72, +-75, +-75, +-60, +-66, +-72, +-58, + -5, +-11, + -5, +104, +100, + 99, +103, +100, + 94, + 99, + 97, + 90, +105, +103, + 97, +111, +108, +108, +109, +109, +114, +105, +105, +111, +102, +102, +109, + 99, + 99, +103, +101, + 97, +102, + 81, + 75, + 81, + 93, + 88, + 98, + 90, + 89, +103, + 54, + 56, + 71, + 48, + 46, + 63, + 50, + 48, + 64, + 16, + 14, + 27, +-98, +-98, +-90, +-109, +-108, +-104, +-112, +-110, +-108, +-113, +-111, +-111, +-115, +-112, +-113, +-114, +-111, +-113, +-114, +-110, +-115, +-116, +-112, +-117, +-115, +-112, +-114, +-116, +-113, +-114, +-117, +-115, +-114, +-121, +-119, +-116, +-116, +-115, +-111, +-111, +-109, +-105, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-111, +-109, +-105, +-109, +-107, +-103, +-108, +-106, +-102, +-107, +-103, +-100, +-105, +-101, +-98, +-104, +-100, +-97, +-102, +-98, +-94, +-99, +-95, +-92, +-106, +-102, +-100, +-109, +-105, +-102, +-100, +-97, +-91, +-101, +-98, +-91, +-103, +-98, +-96, +-24, +-19, +-22, + 46, + 53, + 47, + 45, + 52, + 45, + 40, + 47, + 41, + 43, + 49, + 43, + 48, + 54, + 48, + 46, + 53, + 46, + 51, + 57, + 53, + 51, + 57, + 53, + 45, + 51, + 47, + 43, + 49, + 45, + 39, + 45, + 40, + 43, + 49, + 45, + 43, + 50, + 45, + -4, + 1, + -2, +-109, +-104, +-104, +-103, +-99, +-96, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-97, +-92, +-105, +-102, +-96, +-106, +-102, +-97, +-101, +-97, +-92, +-99, +-96, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-102, +-99, +-91, +-98, +-96, +-87, +-96, +-94, +-83, +-110, +-107, +-99, +-117, +-115, +-107, +-117, +-113, +-108, +-110, +-106, +-103, +-105, +-102, +-96, +-102, +-99, +-91, +-99, +-96, +-88, +-94, +-93, +-81, +-88, +-87, +-74, +-75, +-74, +-60, +-59, +-63, +-48, +-16, +-21, +-14, +102, + 98, + 98, +102, + 99, + 92, + 89, + 87, + 78, + 84, + 80, + 72, + 89, + 86, + 85, +114, +116, +120, +106, +108, +111, + 97, + 99, +102, + 92, + 92, + 94, + 91, + 86, + 91, + 82, + 73, + 80, + 82, + 74, + 82, + 97, + 92, +101, + 65, + 64, + 74, + 48, + 46, + 61, + 45, + 43, + 60, +-63, +-65, +-51, +-103, +-104, +-92, +-106, +-105, +-101, +-109, +-108, +-104, +-111, +-110, +-105, +-113, +-111, +-108, +-112, +-110, +-108, +-112, +-110, +-110, +-114, +-111, +-113, +-116, +-113, +-114, +-117, +-114, +-116, +-119, +-116, +-116, +-122, +-120, +-118, +-117, +-116, +-112, +-112, +-111, +-107, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-111, +-109, +-105, +-110, +-107, +-104, +-110, +-106, +-104, +-109, +-104, +-103, +-107, +-103, +-101, +-103, +-99, +-97, +-100, +-96, +-94, +-107, +-102, +-101, +-111, +-107, +-104, +-102, +-99, +-93, +-101, +-97, +-91, +-103, +-99, +-96, +-27, +-21, +-25, + 44, + 51, + 45, + 43, + 50, + 43, + 33, + 39, + 33, + 42, + 49, + 42, + 51, + 58, + 51, + 47, + 53, + 47, + 43, + 49, + 45, + 48, + 54, + 50, + 46, + 52, + 48, + 38, + 44, + 40, + 39, + 45, + 41, + 42, + 48, + 44, + 41, + 47, + 42, +-39, +-34, +-37, +-106, +-101, +-102, +-103, +-99, +-96, +-101, +-98, +-92, +-100, +-97, +-91, +-100, +-97, +-91, +-104, +-100, +-95, +-103, +-100, +-94, +-103, +-100, +-94, +-102, +-98, +-93, +-101, +-98, +-91, +-103, +-100, +-92, +-104, +-101, +-93, +-102, +-100, +-92, +-100, +-98, +-90, +-99, +-97, +-89, +-100, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-100, +-98, +-89, +-102, +-99, +-91, +-99, +-97, +-88, +-95, +-93, +-83, +-119, +-116, +-107, +-120, +-117, +-110, +-115, +-112, +-106, +-109, +-105, +-102, +-104, +-100, +-95, +-101, +-98, +-90, +-100, +-97, +-89, +-98, +-97, +-84, +-93, +-92, +-79, +-79, +-79, +-64, +-57, +-60, +-44, + -8, +-11, + -3, +102, + 99, + 99, +102, + 99, + 91, + 94, + 90, + 80, + 85, + 79, + 71, + 81, + 80, + 74, +119, +117, +118, +111, +110, +109, +102, +101, +100, + 94, + 94, + 96, + 79, + 70, + 74, + 86, + 68, + 74, + 89, + 71, + 77, + 99, + 88, + 94, + 76, + 71, + 78, + 51, + 48, + 62, + 8, + 7, + 25, +-75, +-76, +-57, +-90, +-92, +-79, +-100, +-98, +-93, +-104, +-102, +-96, +-106, +-106, +-98, +-108, +-107, +-101, +-109, +-108, +-104, +-111, +-109, +-106, +-113, +-111, +-108, +-116, +-114, +-114, +-119, +-116, +-117, +-120, +-118, +-117, +-123, +-121, +-119, +-119, +-117, +-113, +-113, +-112, +-108, +-112, +-111, +-107, +-112, +-111, +-106, +-112, +-111, +-107, +-113, +-111, +-107, +-111, +-110, +-106, +-110, +-108, +-104, +-110, +-105, +-104, +-108, +-104, +-102, +-107, +-103, +-101, +-105, +-100, +-99, +-102, +-98, +-96, +-108, +-103, +-102, +-114, +-109, +-107, +-105, +-101, +-95, +-100, +-97, +-91, +-104, +-99, +-96, +-21, +-16, +-18, + 43, + 50, + 44, + 40, + 46, + 40, + 33, + 39, + 33, + 42, + 49, + 43, + 45, + 53, + 46, + 47, + 54, + 49, + 48, + 53, + 49, + 47, + 53, + 48, + 42, + 49, + 43, + 38, + 49, + 39, + 29, + 45, + 32, + 35, + 49, + 37, + 36, + 40, + 35, +-79, +-75, +-78, +-107, +-101, +-100, +-104, +-99, +-96, +-102, +-98, +-93, +-101, +-98, +-92, +-101, +-97, +-92, +-103, +-100, +-94, +-101, +-98, +-92, +-101, +-97, +-92, +-101, +-98, +-92, +-100, +-97, +-90, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-100, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-102, +-99, +-91, +-99, +-97, +-88, +-98, +-96, +-87, +-121, +-118, +-110, +-118, +-115, +-109, +-114, +-111, +-105, +-107, +-103, +-100, +-102, +-99, +-93, +-100, +-98, +-89, +-101, +-98, +-89, +-99, +-98, +-86, +-97, +-96, +-83, +-89, +-88, +-74, +-63, +-66, +-50, + -7, +-10, + 0, + 99, + 97, + 98, + 98, + 95, + 88, + 93, + 88, + 77, + 90, + 83, + 73, + 83, + 81, + 72, +118, +118, +120, +114, +113, +116, +108, +108, +110, + 95, + 90, + 93, + 67, + 43, + 43, + 85, + 44, + 41, + 98, + 58, + 55, + 90, + 66, + 67, + 80, + 69, + 73, + 53, + 46, + 55, +-51, +-48, +-29, +-71, +-68, +-49, +-78, +-81, +-69, +-95, +-91, +-84, +-102, +-97, +-90, +-103, +-102, +-97, +-106, +-105, +-100, +-109, +-107, +-104, +-111, +-109, +-106, +-114, +-112, +-110, +-118, +-115, +-116, +-120, +-117, +-118, +-121, +-119, +-119, +-124, +-122, +-120, +-118, +-117, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-113, +-111, +-107, +-112, +-110, +-106, +-111, +-108, +-104, +-111, +-106, +-103, +-109, +-105, +-102, +-108, +-104, +-101, +-106, +-102, +-99, +-106, +-102, +-99, +-110, +-105, +-104, +-116, +-111, +-110, +-109, +-105, +-99, +-102, +-100, +-92, +-103, +-100, +-95, + -9, + -5, + -5, + 52, + 57, + 52, + 44, + 48, + 42, + 31, + 37, + 31, + 46, + 52, + 48, + 43, + 50, + 46, + 44, + 50, + 47, + 52, + 52, + 49, + 15, + 20, + 12, + -8, + 13, + -6, + -3, + 36, + 4, +-45, + 21, +-24, + -9, + 47, + 7, + 11, + 19, + 11, +-111, +-105, +-106, +-104, +-99, +-94, +-104, +-99, +-93, +-103, +-97, +-94, +-101, +-96, +-92, +-101, +-97, +-92, +-102, +-99, +-93, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-103, +-100, +-92, +-101, +-98, +-90, +-96, +-93, +-86, +-101, +-98, +-92, +-123, +-120, +-114, +-120, +-117, +-111, +-112, +-109, +-103, +-104, +-101, +-95, +-102, +-99, +-92, +-101, +-99, +-90, +-100, +-97, +-88, +-99, +-97, +-85, +-98, +-96, +-83, +-93, +-92, +-78, +-76, +-78, +-61, +-15, +-16, + -6, + 95, + 93, + 95, + 99, + 96, + 89, + 96, + 90, + 79, + 93, + 84, + 73, + 85, + 78, + 70, +118, +117, +120, +117, +117, +119, +116, +116, +119, +112, +115, +117, + 83, + 69, + 69, + 49, + 13, + 7, + 69, + 24, + 17, + 80, + 41, + 33, + 81, + 51, + 46, + 46, + 33, + 38, +-97, +-97, +-77, +-99, +-99, +-77, +-99, +-102, +-87, +-110, +-108, +-97, +-113, +-108, +-100, +-111, +-110, +-106, +-112, +-110, +-108, +-113, +-110, +-110, +-113, +-110, +-113, +-114, +-111, +-114, +-118, +-115, +-116, +-120, +-117, +-118, +-121, +-119, +-119, +-124, +-122, +-120, +-118, +-117, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-113, +-111, +-107, +-112, +-110, +-106, +-112, +-108, +-104, +-111, +-106, +-103, +-110, +-106, +-102, +-108, +-104, +-101, +-108, +-104, +-100, +-111, +-107, +-106, +-117, +-112, +-112, +-110, +-107, +-101, +-103, +-100, +-92, +-104, +-101, +-96, + -2, + 2, + 2, + 60, + 65, + 60, + 43, + 49, + 43, + 32, + 37, + 31, + 44, + 49, + 43, + 45, + 49, + 44, + 44, + 49, + 43, + 43, + 49, + 44, + 26, + 42, + 30, +-39, + -4, +-28, +-115, +-30, +-77, +-121, + 12, +-52, +-81, + 20, +-39, +-49, +-10, +-33, +-116, +-96, +-105, +-102, +-103, +-97, +-98, +-103, +-92, +-102, +-98, +-91, +-104, +-97, +-92, +-103, +-100, +-94, +-101, +-98, +-92, +-102, +-99, +-93, +-101, +-98, +-92, +-101, +-98, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-99, +-97, +-89, +-95, +-92, +-85, +-105, +-102, +-97, +-123, +-120, +-114, +-121, +-118, +-112, +-112, +-109, +-103, +-104, +-100, +-95, +-103, +-100, +-93, +-102, +-99, +-91, +-101, +-98, +-89, +-99, +-97, +-85, +-96, +-95, +-82, +-94, +-93, +-79, +-87, +-89, +-72, +-45, +-46, +-36, + 81, + 79, + 80, + 97, + 95, + 87, + 92, + 87, + 75, + 91, + 83, + 72, + 85, + 78, + 69, +118, +117, +119, +117, +117, +119, +116, +117, +120, +109, +118, +120, +117, +111, +111, + 86, + 61, + 55, + 44, + 0, +-12, + 63, + 10, + -8, + 74, + 26, + 9, + 32, + 10, + 9, +-51, +-56, +-37, +-52, +-52, +-27, +-54, +-57, +-37, +-75, +-75, +-58, +-103, +-100, +-88, +-115, +-115, +-110, +-119, +-117, +-116, +-118, +-115, +-117, +-117, +-113, +-118, +-116, +-111, +-118, +-118, +-115, +-118, +-120, +-118, +-119, +-122, +-119, +-119, +-124, +-122, +-120, +-117, +-116, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-113, +-109, +-106, +-111, +-107, +-104, +-110, +-106, +-103, +-109, +-105, +-102, +-109, +-105, +-102, +-113, +-108, +-107, +-118, +-113, +-112, +-111, +-108, +-102, +-103, +-101, +-93, +-104, +-100, +-95, +-19, +-15, +-16, + 38, + 43, + 39, + 37, + 44, + 38, + 35, + 42, + 35, + 43, + 52, + 43, + 51, + 59, + 49, + 37, + 47, + 36, + -2, + 21, + 8, +-57, +-25, +-43, +-105, +-46, +-79, +-125, +-37, +-85, +-104, + 12, +-49, +-107, + 9, +-53, +-88, +-11, +-48, +-123, +-90, +-107, +-100, +-101, +-97, +-94, +-104, +-92, +-100, +-99, +-88, +-107, +-100, +-93, +-104, +-101, +-95, +-104, +-100, +-95, +-102, +-99, +-93, +-102, +-98, +-93, +-102, +-98, +-93, +-101, +-98, +-90, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-99, +-96, +-88, +-95, +-92, +-85, +-112, +-108, +-103, +-123, +-120, +-114, +-121, +-118, +-112, +-116, +-113, +-108, +-108, +-105, +-99, +-103, +-100, +-93, +-100, +-97, +-89, +-99, +-97, +-88, +-97, +-96, +-84, +-94, +-92, +-79, +-94, +-93, +-79, +-93, +-95, +-77, +-78, +-79, +-68, + 53, + 51, + 51, + 97, + 93, + 86, + 87, + 82, + 70, + 90, + 82, + 71, + 86, + 79, + 70, +116, +116, +118, +117, +117, +119, +112, +113, +115, +104, +112, +114, +107, +108, +110, +105, + 90, + 87, + 55, + 21, + 9, + 60, + 6, +-18, + 71, + 15, +-10, + 45, + 14, + 8, +-28, +-37, +-20, +-40, +-42, +-13, +-46, +-51, +-25, +-54, +-55, +-32, +-78, +-77, +-59, +-97, +-97, +-87, +-112, +-111, +-104, +-119, +-117, +-115, +-121, +-117, +-120, +-120, +-115, +-121, +-120, +-117, +-119, +-121, +-118, +-120, +-122, +-120, +-120, +-124, +-122, +-120, +-115, +-114, +-110, +-114, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-113, +-110, +-106, +-112, +-108, +-104, +-111, +-107, +-103, +-109, +-105, +-102, +-111, +-107, +-103, +-114, +-110, +-109, +-116, +-111, +-111, +-113, +-110, +-103, +-102, +-99, +-91, +-104, +-101, +-96, +-18, +-13, +-14, + 35, + 40, + 37, + 32, + 39, + 34, + 31, + 44, + 34, + 31, + 49, + 35, + 32, + 53, + 35, + -9, + 17, + -3, +-51, + -7, +-30, +-85, +-40, +-64, +-94, +-48, +-76, +-93, +-43, +-76, +-85, +-25, +-65, +-81, + -9, +-52, +-113, +-36, +-73, +-105, +-63, +-83, +-105, +-98, +-98, +-96, +-100, +-92, +-101, +-100, +-92, +-108, +-102, +-97, +-105, +-102, +-96, +-105, +-102, +-96, +-104, +-101, +-95, +-104, +-101, +-95, +-104, +-101, +-95, +-103, +-100, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-99, +-96, +-88, +-99, +-97, +-89, +-120, +-117, +-111, +-124, +-121, +-115, +-121, +-118, +-112, +-119, +-116, +-110, +-111, +-108, +-103, +-104, +-101, +-94, +-99, +-96, +-88, +-98, +-95, +-86, +-96, +-95, +-83, +-93, +-92, +-79, +-94, +-93, +-79, +-93, +-95, +-77, +-90, +-92, +-80, + -9, +-11, +-11, + 94, + 91, + 83, + 90, + 85, + 73, + 93, + 84, + 74, + 88, + 81, + 72, +116, +115, +118, +118, +117, +119, +112, +111, +114, +105, +107, +112, +104, +107, +112, +105, +100, +101, + 56, + 34, + 25, + 54, + 10, +-15, + 67, + 12, +-18, + 48, + 10, + -1, +-19, +-32, +-16, +-30, +-33, + -3, +-35, +-40, +-10, +-44, +-48, +-19, +-68, +-70, +-46, +-84, +-87, +-69, +-100, +-101, +-87, +-111, +-111, +-103, +-119, +-117, +-115, +-121, +-118, +-120, +-120, +-117, +-118, +-121, +-118, +-120, +-122, +-120, +-120, +-121, +-119, +-117, +-114, +-113, +-109, +-114, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-115, +-111, +-108, +-114, +-110, +-106, +-112, +-107, +-104, +-109, +-105, +-102, +-111, +-107, +-103, +-113, +-108, +-107, +-116, +-111, +-110, +-114, +-111, +-105, +-103, +-101, +-93, +-104, +-100, +-95, + 2, + 6, + 5, + 48, + 53, + 50, + 26, + 34, + 29, + 30, + 47, + 36, + 1, + 29, + 11, +-50, +-10, +-36, +-64, +-16, +-46, +-54, +-10, +-36, +-79, +-41, +-64, +-91, +-55, +-77, +-78, +-41, +-63, +-88, +-44, +-68, +-96, +-44, +-70, +-83, +-34, +-61, +-68, +-33, +-49, +-109, +-88, +-94, +-102, +-94, +-94, +-105, +-102, +-101, +-107, +-104, +-101, +-105, +-102, +-96, +-105, +-102, +-96, +-106, +-102, +-96, +-106, +-102, +-97, +-106, +-102, +-97, +-104, +-101, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-97, +-89, +-97, +-94, +-86, +-105, +-102, +-94, +-123, +-120, +-114, +-122, +-119, +-113, +-121, +-118, +-112, +-120, +-117, +-111, +-116, +-112, +-107, +-107, +-104, +-97, +-100, +-97, +-89, +-96, +-94, +-85, +-95, +-94, +-81, +-91, +-90, +-77, +-89, +-88, +-74, +-88, +-89, +-72, +-85, +-86, +-74, +-67, +-69, +-68, + 75, + 72, + 64, + 95, + 90, + 78, + 93, + 84, + 73, + 88, + 81, + 72, +117, +116, +118, +117, +116, +119, +117, +116, +119, +114, +114, +117, +111, +115, +120, +106, +108, +109, + 49, + 36, + 26, + 45, + 7, +-21, + 67, + 17, +-18, + 55, + 17, + 2, +-13, +-31, +-21, +-31, +-35, + -7, +-36, +-38, + -7, +-45, +-50, +-22, +-65, +-70, +-45, +-84, +-86, +-68, +-96, +-93, +-81, +-110, +-105, +-101, +-115, +-113, +-112, +-116, +-119, +-118, +-118, +-118, +-121, +-122, +-118, +-122, +-125, +-119, +-122, +-122, +-114, +-114, +-116, +-112, +-108, +-114, +-112, +-107, +-114, +-114, +-107, +-114, +-114, +-108, +-115, +-113, +-109, +-116, +-114, +-111, +-115, +-113, +-111, +-115, +-113, +-110, +-114, +-111, +-108, +-113, +-110, +-107, +-110, +-108, +-104, +-109, +-106, +-102, +-110, +-107, +-103, +-112, +-108, +-107, +-115, +-112, +-111, +-115, +-113, +-108, +-105, +-103, +-98, +-103, +-100, +-97, + 10, + 14, + 14, + 45, + 50, + 47, + 22, + 35, + 26, +-24, + 1, +-13, +-84, +-41, +-65, +-102, +-46, +-74, +-85, +-32, +-62, +-84, +-51, +-73, +-80, +-54, +-75, +-56, +-30, +-51, +-25, + 6, +-15, +-86, +-41, +-62, +-83, +-33, +-55, +-85, +-43, +-68, +-83, +-45, +-65, +-55, +-27, +-45, +-13, + 5, +-12, +-84, +-77, +-85, +-106, +-104, +-102, +-106, +-103, +-98, +-108, +-101, +-97, +-109, +-101, +-97, +-108, +-102, +-97, +-105, +-104, +-98, +-104, +-102, +-94, +-103, +-101, +-92, +-103, +-100, +-92, +-101, +-99, +-91, +-100, +-98, +-90, +-100, +-97, +-89, +-100, +-98, +-89, +-101, +-98, +-89, +-100, +-98, +-89, +-100, +-97, +-88, +-97, +-95, +-86, +-110, +-107, +-100, +-124, +-121, +-118, +-121, +-118, +-115, +-120, +-118, +-114, +-119, +-117, +-112, +-116, +-114, +-109, +-112, +-109, +-103, +-104, +-101, +-94, +-98, +-95, +-87, +-94, +-92, +-81, +-89, +-87, +-75, +-87, +-86, +-72, +-86, +-87, +-70, +-79, +-81, +-65, +-72, +-74, +-67, + 52, + 50, + 42, + 90, + 86, + 74, + 94, + 85, + 80, + 91, + 84, + 82, +117, +116, +119, +117, +116, +119, +117, +116, +119, +115, +116, +117, +113, +119, +121, +111, +113, +113, + 44, + 31, + 21, + 35, + -2, +-33, + 58, + 9, +-29, + 69, + 31, + 12, + 21, + -3, + 0, +-38, +-45, +-20, +-47, +-48, +-16, +-48, +-52, +-25, +-53, +-56, +-31, +-81, +-79, +-57, +-95, +-89, +-77, +-108, +-102, +-97, +-115, +-111, +-108, +-119, +-118, +-115, +-118, +-121, +-121, +-123, +-122, +-124, +-122, +-117, +-119, +-118, +-112, +-111, +-113, +-113, +-108, +-109, +-113, +-106, +-114, +-114, +-106, +-114, +-114, +-107, +-115, +-113, +-109, +-116, +-114, +-112, +-115, +-113, +-112, +-114, +-112, +-111, +-111, +-110, +-106, +-111, +-110, +-106, +-109, +-108, +-103, +-109, +-107, +-103, +-110, +-109, +-105, +-112, +-110, +-108, +-116, +-114, +-112, +-116, +-114, +-112, +-64, +-63, +-61, +-39, +-37, +-36, + 16, + 18, + 19, + 32, + 41, + 32, +-38, +-17, +-32, +-99, +-55, +-79, +-95, +-41, +-69, +-104, +-49, +-78, +-103, +-56, +-84, +-70, +-42, +-61, +-48, +-23, +-45, +-21, + 2, +-22, +-60, +-30, +-56, +-89, +-49, +-74, +-99, +-51, +-77, +-101, +-50, +-82, +-75, +-31, +-58, +-85, +-49, +-78, +-54, +-29, +-59, +-75, +-55, +-76, +-107, +-101, +-103, +-105, +-104, +-100, +-109, +-101, +-99, +-112, +-100, +-97, +-109, +-101, +-97, +-105, +-103, +-97, +-105, +-103, +-95, +-104, +-102, +-93, +-103, +-101, +-92, +-101, +-99, +-91, +-101, +-99, +-91, +-101, +-99, +-91, +-101, +-99, +-89, +-101, +-99, +-89, +-101, +-99, +-89, +-100, +-98, +-88, +-101, +-99, +-89, +-118, +-115, +-107, +-123, +-121, +-121, +-122, +-119, +-119, +-120, +-118, +-116, +-116, +-115, +-112, +-114, +-112, +-108, +-114, +-112, +-107, +-109, +-106, +-100, +-100, +-97, +-89, +-96, +-94, +-84, +-88, +-86, +-75, +-82, +-81, +-68, +-82, +-82, +-66, +-77, +-81, +-60, +-62, +-64, +-52, + 46, + 46, + 37, + 91, + 88, + 76, + 98, + 89, + 89, +101, + 95, + 97, +117, +116, +119, +117, +116, +119, +117, +116, +119, +116, +116, +118, +115, +118, +121, +112, +110, +111, + 39, + 24, + 15, + 31, + -4, +-32, + 47, + -2, +-36, + 80, + 34, + 14, + 82, + 51, + 52, + 2, +-12, + 9, +-38, +-43, +-12, +-48, +-53, +-25, +-57, +-57, +-32, +-70, +-70, +-47, +-82, +-92, +-74, +-96, +-108, +-95, +-111, +-113, +-105, +-126, +-116, +-111, +-121, +-121, +-117, +-120, +-124, +-120, +-106, +-107, +-104, +-106, +-107, +-103, +-107, +-113, +-107, +-107, +-115, +-108, +-113, +-114, +-108, +-114, +-113, +-108, +-115, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-109, +-111, +-109, +-106, +-108, +-107, +-103, +-110, +-109, +-105, +-110, +-108, +-104, +-110, +-109, +-105, +-112, +-110, +-106, +-113, +-112, +-109, +-115, +-113, +-111, +-118, +-116, +-114, +-76, +-75, +-73, +-38, +-36, +-34, + -3, + -1, + 0, + 0, + 16, + 2, +-63, +-36, +-58, +-88, +-44, +-72, +-90, +-40, +-71, +-101, +-53, +-85, +-60, +-23, +-52, +-44, +-11, +-37, +-36, + -6, +-31, +-73, +-41, +-70, +-101, +-63, +-93, +-111, +-65, +-94, +-84, +-37, +-68, +-78, +-31, +-63, +-88, +-43, +-71, +-84, +-42, +-77, +-105, +-63, +-107, +-52, +-17, +-51, +-84, +-68, +-82, +-99, +-102, +-100, +-105, +-104, +-103, +-106, +-102, +-100, +-108, +-102, +-98, +-108, +-102, +-95, +-107, +-104, +-96, +-106, +-103, +-95, +-104, +-102, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-101, +-99, +-90, +-107, +-104, +-96, +-125, +-123, +-116, +-125, +-122, +-123, +-123, +-121, +-121, +-122, +-120, +-118, +-118, +-116, +-113, +-113, +-112, +-108, +-113, +-110, +-105, +-110, +-107, +-101, +-105, +-103, +-94, +-102, +-100, +-90, +-93, +-92, +-80, +-84, +-82, +-69, +-78, +-77, +-63, +-76, +-79, +-58, +-56, +-59, +-45, + 54, + 52, + 47, + 95, + 91, + 80, + 95, + 87, + 84, + 93, + 89, + 81, +117, +116, +119, +117, +116, +119, +115, +114, +117, +112, +113, +116, +113, +113, +117, +107, +102, +102, + 29, + 13, + 3, + 24, + -9, +-34, + 45, + -1, +-30, + 92, + 44, + 26, + 90, + 55, + 53, + 49, + 28, + 40, +-27, +-40, +-21, +-37, +-49, +-32, +-14, +-29, +-22, + 29, + 4, + 6, + 56, + 19, + 22, + 31, + -6, + -4, +-66, +-87, +-87, +-117, +-115, +-118, +-120, +-119, +-119, +-114, +-115, +-114, +-27, +-27, +-27, +-85, +-85, +-83, +-111, +-111, +-109, +-112, +-111, +-109, +-115, +-113, +-111, +-115, +-114, +-110, +-116, +-114, +-110, +-115, +-114, +-110, +-112, +-110, +-107, +-109, +-108, +-104, +-109, +-107, +-103, +-110, +-109, +-105, +-110, +-109, +-105, +-112, +-110, +-106, +-113, +-111, +-107, +-114, +-112, +-109, +-114, +-112, +-111, +-118, +-116, +-114, +-115, +-113, +-112, +-95, +-93, +-92, + 15, + 17, + 18, +-53, +-36, +-50, +-81, +-50, +-74, +-55, +-17, +-45, +-89, +-46, +-76, +-73, +-32, +-64, +-71, +-35, +-65, +-43, + -9, +-39, +-88, +-50, +-81, +-98, +-56, +-88, +-103, +-59, +-91, +-81, +-38, +-70, +-55, +-11, +-46, +-56, +-13, +-49, +-97, +-55, +-83, +-59, +-17, +-54, +-70, +-26, +-71, +-104, +-58, +-101, +-43, +-30, +-45, + -5, + -5, +-12, +-80, +-83, +-91, +-100, +-104, +-109, +-105, +-104, +-105, +-110, +-103, +-99, +-108, +-104, +-97, +-107, +-104, +-96, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-95, +-105, +-102, +-95, +-105, +-102, +-96, +-104, +-101, +-94, +-112, +-109, +-103, +-126, +-124, +-119, +-125, +-123, +-123, +-124, +-121, +-122, +-123, +-121, +-119, +-119, +-117, +-114, +-113, +-112, +-108, +-111, +-108, +-103, +-109, +-106, +-100, +-109, +-106, +-98, +-104, +-102, +-92, +-101, +-99, +-88, +-91, +-90, +-77, +-80, +-79, +-66, +-73, +-76, +-56, +-58, +-61, +-44, + 50, + 48, + 46, + 95, + 93, + 81, + 96, + 88, + 82, + 88, + 85, + 70, +116, +116, +118, +117, +116, +119, +113, +113, +116, +110, +110, +115, +112, +110, +114, +103, + 95, + 95, + 25, + 7, + -3, + 29, + -2, +-23, + 56, + 17, + -6, + 94, + 57, + 42, + 93, + 62, + 56, + 75, + 48, + 50, + 16, + -9, + -9, + 36, + 9, + 2, + 65, + 29, + 17, + 62, + 16, + 0, + 67, + 19, + 3, + 69, + 26, + 14, +-15, +-44, +-52, +-108, +-123, +-127, +-87, +-100, +-107, + -5, +-21, +-25, + 61, + 47, + 46, +-76, +-86, +-86, +-110, +-112, +-110, +-113, +-109, +-108, +-115, +-113, +-112, +-115, +-113, +-111, +-115, +-113, +-110, +-112, +-111, +-107, +-107, +-107, +-101, +-110, +-109, +-103, +-111, +-110, +-106, +-111, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-114, +-112, +-108, +-114, +-112, +-109, +-114, +-112, +-110, +-118, +-116, +-114, +-119, +-117, +-115, +-93, +-91, +-89, + 15, + 17, + 19, +-67, +-54, +-63, +-88, +-61, +-82, +-48, +-17, +-41, +-48, +-11, +-38, +-44, + -3, +-33, +-80, +-38, +-68, +-84, +-47, +-83, +-89, +-51, +-84, +-62, +-23, +-54, +-62, +-22, +-54, +-62, +-27, +-60, + 1, + 38, + -2, +-15, + 28, +-13, +-17, + 21, + -6, +-20, + 18, +-14, +-20, + 21, +-22, +-31, + 9, +-31, +-29, + -4, +-30, + 38, + 46, + 25, + 49, + 45, + 25, + 23, + 13, + -3, +-58, +-65, +-74, +-107, +-103, +-105, +-108, +-104, +-98, +-107, +-105, +-97, +-106, +-103, +-95, +-106, +-103, +-95, +-106, +-103, +-95, +-106, +-103, +-95, +-108, +-104, +-99, +-108, +-104, +-99, +-108, +-104, +-99, +-108, +-105, +-99, +-120, +-116, +-110, +-127, +-124, +-120, +-126, +-123, +-123, +-124, +-121, +-122, +-123, +-121, +-120, +-122, +-120, +-117, +-117, +-116, +-112, +-113, +-111, +-107, +-108, +-105, +-99, +-107, +-104, +-96, +-105, +-103, +-93, +-104, +-103, +-92, +-98, +-97, +-84, +-88, +-86, +-76, +-69, +-72, +-52, +-54, +-58, +-38, + 22, + 20, + 19, + 94, + 91, + 81, + 96, + 89, + 82, + 91, + 86, + 71, +116, +116, +118, +117, +116, +119, +114, +113, +116, +112, +112, +118, +114, +112, +115, + 69, + 60, + 59, + 27, + 7, + -2, + 31, + 0, +-18, + 57, + 25, + 5, + 79, + 55, + 45, + 97, + 72, + 65, + 95, + 65, + 57, + 73, + 37, + 20, + 59, + 17, + -9, + 51, + -2, +-32, + 54, + -2, +-30, + 54, + 11, +-16, + 18, +-12, +-31, +-67, +-89, +-97, +-30, +-48, +-41, + 54, + 17, + 10, + 85, + 42, + 34, + 92, + 51, + 49, + 16, +-18, +-16, +-92, +-113, +-107, +-106, +-115, +-108, +-113, +-112, +-112, +-113, +-111, +-110, +-113, +-111, +-109, +-109, +-108, +-103, +-107, +-107, +-100, +-110, +-110, +-102, +-113, +-111, +-107, +-113, +-111, +-107, +-112, +-111, +-107, +-112, +-110, +-106, +-114, +-112, +-108, +-114, +-112, +-109, +-114, +-112, +-110, +-118, +-116, +-114, +-117, +-115, +-113, +-80, +-78, +-77, + 30, + 32, + 34, + -5, + 5, + -2, +-75, +-58, +-71, +-69, +-44, +-62, +-52, +-18, +-41, +-90, +-47, +-73, +-91, +-42, +-72, +-69, +-37, +-74, +-41, + -7, +-42, +-27, + 10, +-21, +-58, +-22, +-54, +-81, +-52, +-86, +-30, + 0, +-40, +-49, + -7, +-49, +-23, + 13, +-14, + -6, + 27, + 1, +-22, + 9, +-22, +-68, +-38, +-69, +-44, +-17, +-45, +-24, + -8, +-39, + 28, + 25, + -6, + 66, + 51, + 25, + 41, + 28, + 12, +-93, +-96, +-102, +-109, +-106, +-101, +-109, +-106, +-98, +-107, +-105, +-97, +-107, +-104, +-96, +-107, +-104, +-96, +-107, +-104, +-97, +-111, +-107, +-103, +-112, +-107, +-104, +-112, +-108, +-105, +-113, +-109, +-106, +-122, +-118, +-114, +-126, +-122, +-120, +-125, +-122, +-123, +-124, +-121, +-122, +-123, +-121, +-120, +-123, +-121, +-118, +-121, +-120, +-116, +-119, +-117, +-112, +-110, +-107, +-101, +-107, +-104, +-97, +-105, +-103, +-93, +-102, +-100, +-89, +-99, +-97, +-85, +-96, +-94, +-84, +-80, +-82, +-63, +-51, +-56, +-36, + -8, +-10, + -9, + 92, + 89, + 78, + 98, + 91, + 82, + 94, + 87, + 74, +114, +113, +115, +112, +111, +114, +109, +108, +111, +107, +108, +115, + 97, + 92, + 97, + 19, + 2, + 3, + 32, + 6, + -1, + 24, + -6, +-22, + 41, + 11, + -7, + 68, + 38, + 28, + 81, + 49, + 37, + 68, + 34, + 16, + 43, + 3, +-23, + 45, + 2, +-32, + 51, + 5, +-33, + 53, + 8, +-23, + 23, +-13, +-31, +-30, +-59, +-66, + 35, + 6, + -6, + 59, + 28, + 11, + 51, + -2, +-25, + 55, + 0, +-20, + 69, + 20, + 9, + 40, + -3, + -6, + 34, + -4, + -5, + 53, + 16, + 16, +-12, +-34, +-38, +-82, +-97, +-98, +-91, +-101, +-99, +-107, +-107, +-105, +-116, +-106, +-107, +-118, +-107, +-108, +-113, +-111, +-108, +-113, +-112, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-112, +-108, +-116, +-112, +-110, +-118, +-114, +-112, +-120, +-116, +-115, +-72, +-68, +-69, + 34, + 39, + 38, + 22, + 30, + 25, +-41, +-27, +-38, +-76, +-48, +-71, +-56, +-18, +-48, +-94, +-52, +-82, +-75, +-38, +-67, +-47, +-18, +-52, +-40, +-11, +-43, +-35, + -6, +-37, +-49, +-22, +-52, +-97, +-73, +-102, +-28, + -5, +-36, +-47, +-15, +-49, +-42, + -5, +-35, +-41, + 0, +-29, +-47, + -8, +-38, +-60, +-30, +-56, +-53, +-23, +-51, +-27, +-18, +-47, + 43, + 28, + -5, + 59, + 34, + 3, + 62, + 46, + 21, +-15, +-24, +-38, +-107, +-107, +-103, +-110, +-107, +-101, +-108, +-106, +-100, +-108, +-106, +-101, +-110, +-106, +-101, +-111, +-108, +-101, +-111, +-109, +-102, +-112, +-110, +-104, +-113, +-111, +-107, +-118, +-114, +-114, +-21, +-18, +-21, +-107, +-103, +-107, +-126, +-123, +-124, +-125, +-122, +-123, +-124, +-122, +-122, +-124, +-122, +-122, +-122, +-120, +-119, +-121, +-118, +-114, +-116, +-112, +-107, +-111, +-108, +-101, +-107, +-104, +-98, +-102, +-99, +-92, +-100, +-97, +-89, +-97, +-96, +-85, +-88, +-89, +-73, +-59, +-60, +-43, +-18, +-20, +-12, + 84, + 81, + 76, + 95, + 88, + 77, + 94, + 86, + 76, +103, +102, +104, + 99, + 98, +101, + 96, + 96, + 98, + 96, + 97, +105, + 50, + 44, + 50, + 13, + -6, + -6, + 30, + 4, + -4, + 25, + -4, +-20, + 31, + 1, +-16, + 43, + 9, + -1, + 42, + 6, + -7, + 31, + -6, +-26, + 35, + -4, +-31, + 47, + 6, +-26, + 49, + 12, +-14, + 44, + 13, + -5, + 25, + -3, +-19, + 65, + 31, + 14, + 67, + 29, + 3, + 50, + 5, +-31, + 49, + -4, +-36, + 54, + 2, +-22, + 60, + 12, + -5, + 68, + 21, + 10, + 58, + 10, + 0, + 72, + 21, + 11, + 77, + 29, + 19, + 75, + 33, + 28, + 56, + 26, + 26, +-59, +-73, +-71, +-108, +-108, +-108, +-113, +-109, +-109, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-115, +-111, +-108, +-117, +-113, +-109, +-118, +-114, +-111, +-120, +-115, +-114, +-58, +-54, +-55, + 35, + 41, + 39, + 30, + 28, + 26, + -6, + -5, +-13, +-42, +-29, +-48, +-52, +-32, +-57, +-23, + -7, +-30, + -2, + 15, + -9, + -4, + 15, +-12, + 20, + 39, + 13, +-60, +-39, +-65, +-58, +-36, +-63, +-85, +-64, +-88, +-17, + 6, +-23, +-47, +-21, +-54, +-67, +-29, +-62, +-54, +-11, +-41, +-63, +-25, +-50, +-61, +-33, +-54, +-66, +-44, +-64, +-41, +-46, +-66, + 35, + 0, +-24, + 61, + 18, +-11, + 67, + 37, + 10, + 54, + 30, + 12, +-86, +-95, +-99, +-109, +-109, +-105, +-111, +-110, +-106, +-110, +-108, +-104, +-112, +-109, +-103, +-114, +-111, +-105, +-113, +-113, +-104, +-114, +-114, +-107, +-116, +-114, +-111, +-122, +-119, +-120, + 27, + 30, + 26, +-82, +-79, +-83, +-125, +-122, +-123, +-123, +-121, +-121, +-123, +-120, +-121, +-122, +-120, +-120, +-120, +-117, +-117, +-120, +-117, +-114, +-119, +-116, +-110, +-117, +-113, +-107, +-112, +-109, +-103, +-106, +-103, +-96, +-102, +-99, +-92, +-98, +-97, +-89, +-94, +-93, +-81, +-83, +-83, +-67, +-48, +-49, +-38, + 48, + 44, + 44, + 97, + 89, + 81, + 97, + 89, + 80, +109, +109, +111, +106, +106, +108, +103, +103, +106, + 99, +100, +108, + 54, + 48, + 52, + 21, + 3, + 0, + 26, + 0, + -9, + 30, + 0, +-13, + 30, + -1, +-14, + 33, + -1, + -9, + 37, + 2, +-11, + 33, + -4, +-22, + 40, + 0, +-22, + 53, + 12, +-15, + 71, + 33, + 19, + 86, + 53, + 43, + 83, + 51, + 28, + 56, + 23, +-13, + 45, + 5, +-33, + 50, + 3, +-32, + 48, + 3, +-24, + 66, + 21, + -2, + 73, + 24, + 5, + 53, + 1, +-18, + 54, + -4, +-25, + 65, + 2, +-19, + 62, + -3, +-22, + 60, + 4, + -7, + 45, + 6, + 4, +-54, +-74, +-72, +-104, +-112, +-107, +-109, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-115, +-111, +-108, +-117, +-113, +-109, +-118, +-114, +-111, +-119, +-114, +-113, +-44, +-40, +-41, + 44, + 49, + 47, + 47, + 43, + 39, + 25, + 21, + 15, + -8, + -8, +-19, +-18, +-14, +-30, +-15, +-11, +-27, + 25, + 29, + 13, + 39, + 45, + 27, + 43, + 52, + 33, + -7, + 6, +-14, +-71, +-53, +-77, +-62, +-40, +-64, +-41, +-17, +-46, +-57, +-31, +-67, +-61, +-27, +-63, +-42, + -6, +-36, +-57, +-27, +-47, +-52, +-33, +-42, +-102, +-92, +-98, +-66, +-85, +-93, + 23, +-26, +-41, + 60, + 7, +-19, + 76, + 36, + 7, + 76, + 42, + 20, + -6, +-23, +-33, +-107, +-112, +-114, +-112, +-113, +-110, +-113, +-111, +-106, +-115, +-112, +-106, +-117, +-113, +-108, +-117, +-117, +-110, +-119, +-118, +-113, +-120, +-119, +-116, +-118, +-115, +-115, + 49, + 52, + 49, +-84, +-81, +-84, +-122, +-120, +-117, +-120, +-119, +-115, +-120, +-118, +-115, +-115, +-114, +-111, +-110, +-109, +-105, +-112, +-110, +-105, +-114, +-112, +-104, +-116, +-113, +-105, +-114, +-112, +-104, +-112, +-110, +-101, +-115, +-112, +-104, +-114, +-112, +-107, +-113, +-110, +-102, +-112, +-111, +-97, +-99, +-101, +-88, +-69, +-74, +-71, + 67, + 57, + 54, + 98, + 90, + 81, +113, +112, +115, +111, +110, +113, +109, +109, +112, +107, +108, +115, + 41, + 36, + 38, + 22, + 4, + -1, + 25, + -1, +-11, + 35, + 4, + -7, + 27, + -5, +-14, + 31, + -1, +-10, + 47, + 14, + 3, + 52, + 16, + 2, + 43, + 5, +-13, + 37, + -3, +-24, + 66, + 20, + 5, + 69, + 22, + 3, + 52, + 11, +-23, + 41, + 5, +-36, + 44, + 11, +-21, + 47, + 16, + -4, + 63, + 26, + 5, + 72, + 30, + 6, + 54, + 6, +-19, + 52, + -1, +-26, + 58, + -1, +-25, + 45, +-15, +-39, + 43, + -9, +-29, + 26, +-14, +-28, +-56, +-79, +-85, +-105, +-112, +-112, +-112, +-111, +-108, +-114, +-110, +-106, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-111, +-107, +-114, +-110, +-107, +-115, +-111, +-108, +-116, +-111, +-111, +-33, +-29, +-30, + 46, + 51, + 49, + 48, + 55, + 48, + 47, + 54, + 45, + 23, + 28, + 20, + 13, + 17, + 7, + 36, + 40, + 29, + 41, + 47, + 34, + 48, + 53, + 40, + 52, + 57, + 44, + 32, + 44, + 27, +-60, +-44, +-63, +-49, +-27, +-50, +-47, +-22, +-50, +-53, +-26, +-63, +-51, +-22, +-58, +-34, + -7, +-37, +-87, +-66, +-83, +-102, +-91, +-93, +-123, +-115, +-113, +-105, +-119, +-122, +-15, +-58, +-72, + 35, +-11, +-40, + 71, + 38, + 4, + 66, + 40, + 9, + 66, + 47, + 30, +-49, +-60, +-67, +-112, +-115, +-114, +-115, +-112, +-107, +-116, +-113, +-107, +-119, +-117, +-112, +-121, +-120, +-116, +-122, +-120, +-118, +-123, +-121, +-119, +-98, +-97, +-96, + 17, + 19, + 18, +-105, +-103, +-102, +-109, +-108, +-102, +-110, +-109, +-103, +-110, +-109, +-103, +-109, +-109, +-102, +-103, +-102, +-95, +-100, +-99, +-91, +-100, +-98, +-88, +-97, +-95, +-85, +-95, +-93, +-83, +-97, +-95, +-85, +-97, +-94, +-84, +-98, +-96, +-92, +-111, +-109, +-102, +-107, +-107, +-93, +-98, +-99, +-86, +-87, +-92, +-86, + 45, + 36, + 33, + 97, + 89, + 81, +117, +116, +118, +116, +115, +117, +114, +113, +117, +108, +109, +117, + 9, + 3, + 4, + 18, + 1, + -8, + 22, + -3, +-15, + 35, + 3, + -4, + 33, + 1, + -4, + 37, + 6, + -2, + 41, + 9, + -1, + 43, + 9, + -3, + 31, + -6, +-20, + 22, +-18, +-34, + 37, + -7, +-26, + 41, + -5, +-28, + 42, + -4, +-30, + 50, + 6, +-21, + 54, + 17, + -7, + 65, + 33, + 15, + 62, + 26, + 1, + 54, + 11, +-17, + 54, + 7, +-21, + 51, + 1, +-24, + 37, +-12, +-30, + 40, + -5, +-19, + 7, +-22, +-32, +-69, +-85, +-91, +-111, +-111, +-112, +-117, +-109, +-107, +-117, +-109, +-107, +-114, +-110, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-110, +-107, +-114, +-110, +-108, +-115, +-111, +-110, +-15, +-10, +-12, + 42, + 47, + 45, + 43, + 59, + 47, + 34, + 49, + 38, + 30, + 35, + 31, + 9, + 10, + 8, + 21, + 24, + 18, + 39, + 44, + 35, + 41, + 51, + 42, + 48, + 60, + 49, + 38, + 54, + 39, + -8, + 10, + -8, +-30, + -8, +-31, +-46, +-22, +-48, +-34, + -8, +-40, +-21, + 2, +-31, +-33, +-14, +-41, +-122, +-110, +-123, +-122, +-119, +-116, +-121, +-114, +-111, +-103, +-113, +-117, +-11, +-52, +-67, + 18, +-27, +-56, + 66, + 36, + 1, + 63, + 40, + 7, + 70, + 44, + 23, + 14, + -4, +-16, +-113, +-120, +-121, +-120, +-117, +-112, +-122, +-118, +-112, +-121, +-119, +-115, +-123, +-121, +-120, +-123, +-121, +-120, +-122, +-120, +-118, +-117, +-115, +-113, +-107, +-105, +-103, +-99, +-97, +-93, +-96, +-96, +-87, +-100, +-101, +-91, +-96, +-96, +-86, +-95, +-95, +-85, +-99, +-99, +-90, +-94, +-93, +-82, +-95, +-93, +-82, +-92, +-90, +-79, +-92, +-91, +-79, +-95, +-93, +-82, +-94, +-92, +-80, +-87, +-86, +-78, +-90, +-88, +-77, +-103, +-103, +-88, +-101, +-103, +-91, +-62, +-67, +-66, + 78, + 69, + 63, + 97, + 89, + 80, +113, +112, +115, +112, +111, +114, +110, +110, +114, +103, +104, +112, + -1, + -7, + -8, + 1, +-15, +-26, + 26, + 2, +-11, + 30, + -1, + -8, + 41, + 8, + 5, + 40, + 11, + 3, + 44, + 12, + 4, + 33, + -1, +-11, + 34, + -3, +-15, + 43, + 3, +-10, + 42, + 10, + -3, + 43, + 15, + 1, + 45, + 5, + -6, + 48, + -2, +-15, + 51, + -1, +-24, + 58, + 8, +-24, + 49, + 4, +-28, + 53, + 7, +-23, + 48, + 3, +-26, + 36, + -7, +-27, + 17, +-18, +-30, +-29, +-55, +-60, +-102, +-117, +-110, +-112, +-115, +-107, +-117, +-110, +-102, +-118, +-110, +-103, +-112, +-112, +-106, +-109, +-112, +-109, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-110, +-107, +-114, +-110, +-108, +-116, +-111, +-111, + 1, + 6, + 4, + 43, + 48, + 46, + 46, + 59, + 47, + 50, + 57, + 49, + 53, + 48, + 48, + 39, + 24, + 28, + 13, + 0, + -1, + 16, + 11, + 5, + -4, + 12, + 4, + -7, + 13, + 1, +-26, + -5, +-21, +-64, +-43, +-61, +-58, +-38, +-58, +-63, +-42, +-64, +-81, +-60, +-84, +-48, +-31, +-56, +-48, +-35, +-56, +-125, +-119, +-127, +-115, +-115, +-112, +-111, +-111, +-107, +-69, +-89, +-94, + 15, +-33, +-47, + 26, +-27, +-53, + 65, + 26, + -4, + 69, + 36, + 8, + 66, + 34, + 11, + 61, + 38, + 21, +-70, +-79, +-83, +-121, +-119, +-114, +-123, +-118, +-111, +-114, +-112, +-107, +-106, +-104, +-102, +-107, +-104, +-103, +-107, +-105, +-102, +-105, +-103, +-99, +-99, +-97, +-94, +-94, +-93, +-87, +-90, +-90, +-79, +-95, +-95, +-84, +-91, +-91, +-79, +-90, +-91, +-79, +-89, +-89, +-77, +-85, +-84, +-72, +-83, +-81, +-68, +-92, +-91, +-78, +-89, +-88, +-75, +-97, +-96, +-83, +-97, +-96, +-82, +-84, +-84, +-71, +-82, +-81, +-66, +-89, +-89, +-73, +-92, +-93, +-82, +-72, +-76, +-78, + 76, + 69, + 57, + 96, + 88, + 79, + 96, + 96, +104, + 97, + 97, +105, + 99, + 98, +107, + 95, + 88, +102, + 6, + 1, + 3, +-19, +-25, +-36, + 28, + 14, + -1, + 37, + 11, + 4, + 43, + 10, + 10, + 42, + 13, + 12, + 47, + 16, + 14, + 40, + 6, + 4, + 40, + 5, + 0, + 50, + 14, + 7, + 52, + 19, + 12, + 45, + 12, + 3, + 23, +-19, +-28, + 34, +-12, +-26, + 42, + -2, +-23, + 44, + 4, +-24, + 46, + 3, +-13, + 40, + -2, +-11, + 16, +-19, +-24, +-10, +-36, +-38, +-86, +-102, +-99, +-105, +-115, +-106, +-111, +-110, +-103, +-112, +-109, +-103, +-113, +-109, +-103, +-116, +-113, +-107, +-115, +-113, +-107, +-115, +-113, +-107, +-114, +-113, +-107, +-112, +-112, +-105, +-112, +-111, +-105, +-112, +-111, +-105, +-112, +-111, +-105, +-116, +-115, +-111, +-113, +-111, +-109, +-113, +-111, +-110, +-107, +-105, +-105, + 12, + 16, + 13, + 45, + 49, + 46, + 43, + 48, + 41, + 46, + 49, + 38, + 48, + 34, + 21, + 51, + 13, + -1, + 32, + -9, +-29, + 1, +-27, +-55, +-62, +-61, +-87, +-63, +-49, +-73, +-65, +-41, +-66, +-58, +-33, +-54, +-45, +-26, +-38, +-67, +-55, +-62, +-118, +-111, +-116, +-126, +-121, +-125, +-122, +-118, +-122, +-120, +-116, +-119, +-114, +-111, +-112, +-109, +-111, +-110, +-45, +-68, +-78, + 30, +-19, +-42, + 42, +-12, +-39, + 67, + 24, + -1, + 66, + 30, + 2, + 64, + 32, + 7, + 69, + 44, + 25, + 29, + 12, + 6, +-64, +-70, +-64, +-62, +-61, +-46, +-60, +-55, +-36, +-52, +-53, +-35, +-51, +-53, +-33, +-56, +-57, +-35, +-72, +-70, +-51, +-97, +-93, +-80, +-105, +-100, +-89, +-86, +-83, +-67, +-88, +-86, +-70, +-91, +-88, +-75, +-87, +-84, +-72, +-94, +-90, +-80, +-92, +-89, +-79, +-82, +-80, +-70, +-82, +-80, +-68, +-89, +-88, +-75, +-84, +-83, +-68, +-93, +-93, +-77, +-91, +-88, +-75, +-65, +-65, +-50, +-90, +-90, +-75, +-88, +-92, +-83, +-66, +-69, +-71, + 70, + 65, + 56, + 93, + 86, + 77, + 91, + 91, +100, + 92, + 92, +101, + 93, + 93, +103, + 91, + 87, +100, + 2, + 1, + 2, + 2, + 2, + -9, + -2, + -9, +-23, + 42, + 24, + 15, + 47, + 21, + 18, + 46, + 22, + 20, + 55, + 29, + 27, + 55, + 28, + 25, + 54, + 26, + 21, + 49, + 19, + 14, + 41, + 13, + 7, + 41, + 13, + 7, + 46, + 14, + 7, + 48, + 16, + 5, + 45, + 17, + 1, + 55, + 32, + 15, + 26, + 8, + -2, +-50, +-68, +-72, +-94, +-105, +-107, +-107, +-111, +-110, +-111, +-109, +-105, +-114, +-108, +-103, +-110, +-106, +-101, +-111, +-108, +-102, +-113, +-109, +-104, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-114, +-114, +-106, +-112, +-112, +-105, +-111, +-111, +-104, +-112, +-111, +-104, +-112, +-111, +-105, +-121, +-119, +-115, +-123, +-121, +-119, +-114, +-112, +-111, +-88, +-86, +-87, + 26, + 29, + 26, + 43, + 46, + 43, + 50, + 54, + 48, + 47, + 50, + 40, + 30, + 17, + 4, + 31, + -7, +-23, + 36, + -8, +-32, + 29, + -4, +-36, + 24, +-11, +-36, + 12, +-14, +-40, +-21, +-30, +-55, +-51, +-44, +-67, +-96, +-78, +-91, +-125, +-109, +-117, +-124, +-121, +-122, +-123, +-120, +-121, +-120, +-117, +-118, +-118, +-115, +-116, +-115, +-112, +-113, +-111, +-112, +-111, +-48, +-69, +-80, + 39, + -5, +-31, + 59, + 12, +-16, + 73, + 37, + 11, + 66, + 34, + 6, + 73, + 40, + 13, + 74, + 44, + 23, + 73, + 51, + 41, + 20, + 7, + 7, +-39, +-44, +-32, +-44, +-44, +-24, +-42, +-45, +-21, +-41, +-45, +-18, +-42, +-44, +-16, +-52, +-52, +-27, +-62, +-58, +-39, +-84, +-79, +-64, +-78, +-75, +-58, +-82, +-80, +-63, +-85, +-82, +-67, +-86, +-82, +-70, +-84, +-80, +-68, +-94, +-91, +-80, +-89, +-87, +-77, +-83, +-81, +-70, +-87, +-85, +-72, +-84, +-84, +-69, +-81, +-81, +-64, +-93, +-91, +-77, +-85, +-84, +-69, +-87, +-87, +-73, +-84, +-88, +-80, +-58, +-62, +-64, + 79, + 74, + 66, + 94, + 87, + 78, + 87, + 88, + 97, + 89, + 89, + 98, + 90, + 90, +100, + 91, + 92, +103, + -2, + 2, + 5, + 12, + 18, + 9, +-12, +-11, +-23, +-23, +-32, +-42, + 29, + 12, + 7, + 44, + 24, + 21, + 49, + 30, + 26, + 52, + 32, + 27, + 56, + 36, + 31, + 55, + 34, + 29, + 47, + 28, + 23, + 44, + 26, + 23, + 47, + 31, + 27, + 62, + 50, + 44, + 88, + 79, + 72, + 97, + 90, + 82, +-15, +-17, +-21, +-113, +-111, +-109, +-113, +-110, +-107, +-111, +-106, +-103, +-112, +-104, +-100, +-108, +-101, +-97, +-110, +-106, +-100, +-113, +-110, +-104, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-114, +-113, +-106, +-112, +-112, +-105, +-111, +-111, +-104, +-111, +-111, +-104, +-112, +-111, +-105, +-118, +-116, +-112, +-120, +-118, +-117, +-120, +-117, +-116, +-48, +-46, +-47, + 38, + 41, + 38, + 47, + 50, + 47, + 45, + 47, + 42, + 41, + 44, + 36, + 28, + 18, + 9, + 35, + 0, +-12, + 26, +-18, +-38, + 22, +-13, +-44, + 50, + -3, +-29, + 51, + 4, +-26, + 52, + 17, +-14, + 14, + -7, +-33, +-56, +-68, +-82, +-110, +-114, +-122, +-121, +-118, +-119, +-120, +-117, +-118, +-119, +-116, +-117, +-117, +-114, +-115, +-116, +-113, +-114, +-111, +-112, +-112, +-51, +-69, +-81, + 47, + 9, +-19, + 74, + 35, + 5, + 78, + 48, + 22, + 77, + 50, + 24, + 77, + 44, + 19, + 75, + 40, + 18, + 71, + 41, + 24, + 76, + 55, + 47, + -4, +-17, +-12, +-43, +-49, +-30, +-43, +-49, +-21, +-45, +-50, +-18, +-42, +-46, +-13, +-45, +-47, +-16, +-59, +-58, +-33, +-60, +-56, +-36, +-54, +-52, +-33, +-54, +-52, +-35, +-89, +-87, +-71, +-79, +-76, +-62, +-80, +-76, +-63, +-88, +-85, +-74, +-92, +-90, +-79, +-83, +-81, +-70, +-87, +-86, +-73, +-82, +-81, +-66, +-79, +-79, +-62, +-84, +-81, +-67, +-90, +-89, +-74, +-81, +-81, +-67, +-83, +-87, +-79, +-16, +-19, +-22, + 92, + 87, + 79, + 96, + 89, + 80, + 51, + 51, + 58, + 51, + 51, + 58, + 55, + 55, + 63, + 56, + 58, + 66, + -8, + -4, + -1, +-31, +-25, +-31, +-11, + -7, +-16, +-40, +-42, +-51, +-45, +-55, +-61, + 8, + -6, +-10, + 21, + 6, + 4, + 20, + 7, + 3, + 18, + 4, + 1, + 19, + 5, + 2, + 5, + -7, + -8, + 31, + 23, + 23, + 42, + 35, + 35, + 57, + 53, + 52, + 56, + 55, + 53, + 45, + 45, + 43, +-73, +-73, +-72, +-105, +-105, +-102, +-102, +-102, +-99, +-102, +-101, +-98, +-100, +-101, +-97, +-99, +-99, +-95, +-103, +-101, +-98, +-104, +-103, +-100, +-105, +-104, +-101, +-105, +-104, +-101, +-105, +-104, +-101, +-105, +-104, +-101, +-104, +-104, +-101, +-104, +-104, +-101, +-103, +-103, +-99, +-102, +-102, +-99, +-104, +-103, +-100, +-106, +-105, +-104, +-107, +-107, +-106, +-107, +-106, +-105, +-41, +-39, +-40, + 17, + 20, + 18, + 21, + 24, + 21, + 17, + 19, + 15, + 19, + 22, + 16, + 3, + -3, + -8, + 1, +-25, +-32, + 0, +-34, +-48, + -4, +-31, +-55, + 7, +-28, +-52, + 18, +-20, +-46, + 23, +-15, +-42, + 24, +-10, +-31, + 1, +-28, +-39, +-74, +-91, +-95, +-106, +-105, +-106, +-107, +-105, +-106, +-106, +-105, +-105, +-105, +-104, +-104, +-104, +-103, +-103, +-101, +-102, +-102, +-24, +-40, +-49, + 20, + -8, +-31, + 46, + 18, + -6, + 41, + 19, + 0, + 45, + 25, + 6, + 48, + 21, + 4, + 39, + 10, + -8, + 36, + 10, + -8, + 42, + 22, + 12, + 6, + -7, + -5, +-60, +-67, +-53, +-60, +-65, +-42, +-60, +-65, +-38, +-59, +-63, +-35, +-57, +-59, +-34, +-62, +-61, +-41, +-77, +-75, +-58, +-64, +-63, +-47, +-54, +-52, +-37, +-87, +-85, +-74, +-84, +-82, +-71, +-82, +-79, +-69, +-89, +-87, +-78, +-92, +-91, +-84, +-84, +-82, +-74, +-94, +-93, +-84, +-83, +-83, +-72, +-82, +-82, +-70, +-84, +-83, +-73, +-89, +-89, +-78, +-84, +-84, +-74, +-86, +-89, +-84, + 2, + -1, + -3, + 59, + 56, + 49, + 60, + 54, + 47 +}; diff --git a/examples/app_flash_single_model/src/main.cpp.1 b/examples/app_flash_single_model/src/main.cpp.1 new file mode 100644 index 000000000..13c71b23f --- /dev/null +++ b/examples/app_flash_single_model/src/main.cpp.1 @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include +#include +#include "flash_server.h" +#include "model.tflite.h" + +#include "image.h" +#include "image2.h" + +#define NFLASH_SPECS 1 + +fl_QuadDeviceSpec flash_spec[NFLASH_SPECS] = { + FL_QUADDEVICE_DEFAULT //FL_QUADDEVICE_MACRONIX_MX25R6435FM2IH0 +}; + +fl_QSPIPorts qspi = { + PORT_SQI_CS, + PORT_SQI_SCLK, + PORT_SQI_SIO, + XS1_CLKBLK_2 +}; + +DECLARE_JOB(flash_server, (chanend_t *, flash_t*, int, + fl_QSPIPorts*, fl_QuadDeviceSpec*, int)); +DECLARE_JOB(nn_thread, (chanend_t)); + +void nn_thread(chanend_t x) { + model_init((void *)x); + int8_t *inputs = (int8_t *)model_input_ptr(0); + int8_t *outputs = (int8_t *)model_output_ptr(0); + memcpy(inputs, image, sizeof(image)); // copy data to inputs + model_invoke(); + printf("%s (%d%%)\n", outputs[0] > outputs[1] ? "No human" : "Human", (outputs[1]+128)*100/255); + memcpy(inputs, image2, sizeof(image2)); // copy data to inputs + model_invoke(); + printf("%s (%d%%)\n", outputs[0] > outputs[1] ? "No human" : "Human", (outputs[1]+128)*100/255); + chan_out_word(x, FLASH_SERVER_QUIT); +} + +#define NNETWORKS 1 + +int main(void) { + flash_t headers[NNETWORKS]; + chanend_t flash_server_chanends[NNETWORKS]; + channel_t c_flash = chan_alloc(); + flash_server_chanends[0] = c_flash.end_a; + + PAR_JOBS( + PJOB(flash_server, (flash_server_chanends, headers, NNETWORKS, + &qspi, &flash_spec[0], NFLASH_SPECS)), + PJOB(nn_thread, (c_flash.end_b)) + ); +} diff --git a/examples/app_flash_single_model/src/main.xc b/examples/app_flash_single_model/src/main.xc new file mode 100644 index 000000000..81a08b1d6 --- /dev/null +++ b/examples/app_flash_single_model/src/main.xc @@ -0,0 +1,36 @@ +#include +#include +#include "flash_server.h" + +#define NFLASH_SPECS 1 + +fl_QuadDeviceSpec flash_spec[NFLASH_SPECS] = { + FL_QUADDEVICE_DEFAULT //FL_QUADDEVICE_MACRONIX_MX25R6435FM2IH0 +}; + +on tile[0]: fl_QSPIPorts qspi = { + PORT_SQI_CS, + PORT_SQI_SCLK, + PORT_SQI_SIO, + XS1_CLKBLK_2 +}; + +extern void inferencer(chanend x); + +int main(void) { + chan x[1]; + + par { + on tile[0]: { + flash_t headers[1]; + flash_server(x, headers, 1, qspi, flash_spec, 1); + } + + on tile[1]: { + unsafe { + inferencer(x[0]); + } + } + } + return 0; +} diff --git a/examples/app_flash_single_model/src/support.cpp b/examples/app_flash_single_model/src/support.cpp new file mode 100644 index 000000000..cb0ba1f5e --- /dev/null +++ b/examples/app_flash_single_model/src/support.cpp @@ -0,0 +1,27 @@ +#include +#include +#include +#include "flash_server.h" + +#include "model.tflite.h" +#include "image.h" +#include "image2.h" + +void run(unsigned x) { + model_init((void *)x); + int8_t *inputs = (int8_t *)model_input_ptr(0); + int8_t *outputs = (int8_t *)model_output_ptr(0); + memcpy(inputs, image, sizeof(image)); // copy data to inputs + model_invoke(); + printf("%s (%d%%)\n", outputs[0] > outputs[1] ? "No human" : "Human", (outputs[1]+128)*100/255); + memcpy(inputs, image2, sizeof(image2)); // copy data to inputs + model_invoke(); + printf("%s (%d%%)\n", outputs[0] > outputs[1] ? "No human" : "Human", (outputs[1]+128)*100/255); + chan_out_word(x, FLASH_SERVER_QUIT); +} + +extern "C" { + void inferencer(unsigned x) { + run(x); + } +} diff --git a/examples/app_flash_single_model/vww_quant.tflite b/examples/app_flash_single_model/vww_quant.tflite new file mode 100644 index 000000000..2abf500af Binary files /dev/null and b/examples/app_flash_single_model/vww_quant.tflite differ diff --git a/examples/app_flash_two_models/Makefile b/examples/app_flash_two_models/Makefile new file mode 100644 index 000000000..238e35b62 --- /dev/null +++ b/examples/app_flash_two_models/Makefile @@ -0,0 +1,32 @@ +TARGET = XCORE-AI-EXPLORER +APP_NAME = + +APP_FLAGS = -report \ +-O3 -mcmodel=large -fxscope -Wno-xcore-fptrgroup \ +-g \ +-lquadflash + +# ******************************************************* +# Include AI Tools library and headers +# ******************************************************* +# The following variables are defined for AI Tools library +# and should be included when building the app. +# XMOS_AITOOLSLIB_DEFINITIONS +# XMOS_AITOOLSLIB_INCLUDES +# XMOS_AITOOLSLIB_LIBRARIES +# +ifeq ($(XMOS_AITOOLSLIB_PATH),) +$(error Path to XMOS AI Tools library and headers not set correctly!) +endif +include ${XMOS_AITOOLSLIB_PATH}/buildfiles/aitoolslib.make + +XCC_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_CPP_FLAGS = $(APP_FLAGS) -std=c++14 $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_MAP_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_LIBRARIES) + +#============================================================================= +# The following part of the Makefile includes the common build infrastructure +# for compiling XMOS applications. You should not need to edit below here. + +XMOS_MAKE_PATH ?= ../.. +include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common diff --git a/examples/app_flash_two_models/README.rst b/examples/app_flash_two_models/README.rst new file mode 100644 index 000000000..5ffea79c5 --- /dev/null +++ b/examples/app_flash_two_models/README.rst @@ -0,0 +1,34 @@ +Example with two models and learned parameters in flash +======================================================= + +Please consult `here <../../docs/rst/flow.rst>`_ on how to install the tools. + +This example adds a second model. With a second model, we need to make sure +that we give each model a separate prefix, and we need to merge the two +sets of learned parameters into a single flash image. + +In order to compile and run this example follow these steps:: + + xcore-opt --xcore-weights-file=model1.params \ + --xcore-naming-prefix=model1_ \ + vww_quant1.tflite -o model1.tflite + xcore-opt --xcore-weights-file=model2.params \ + --xcore-naming-prefix=model2_ \ + vww_quant2.tflite -o model2.tflite + mv model1.tflite.cpp model1.tflite.h src + mv model2.tflite.cpp model2.tflite.h src + xmake + python -c 'from xmos_ai_tools import xformer as xf; xf.generate_flash( + output_file="xcore_flash_binary.out", + model_files=["model1.tflite", "model2.tflite"], + param_files=["model1.params", "model2.params"] + )' + xflash --target XCORE-AI-EXPLORER --data xcore_flash_binary.out + xrun --xscope bin/app_flash_two_models.xe + +This should print:: + + No human (9%) + Human (98%) + + diff --git a/examples/app_flash_two_models/src/config.xscope b/examples/app_flash_two_models/src/config.xscope new file mode 100644 index 000000000..ef80fed5b --- /dev/null +++ b/examples/app_flash_two_models/src/config.xscope @@ -0,0 +1,3 @@ + + + diff --git a/examples/app_flash_two_models/src/image.h b/examples/app_flash_two_models/src/image.h new file mode 100644 index 000000000..dc3c860a3 --- /dev/null +++ b/examples/app_flash_two_models/src/image.h @@ -0,0 +1,27650 @@ +int8_t image[3*96*96] = { + 73, + 40, + 0, + 73, + 40, + -4, + 77, + 44, + 0, + 78, + 44, + -1, + 74, + 37, +-11, + 71, + 36, +-14, + 70, + 36, + -8, + 66, + 33, + -7, + 65, + 32, + -5, + 64, + 32, + -4, + 63, + 33, + -2, + 63, + 35, + 1, + 65, + 39, + 10, + 67, + 42, + 16, + 67, + 44, + 19, + 67, + 46, + 22, + 68, + 49, + 27, + 68, + 52, + 30, + 69, + 54, + 37, + 72, + 58, + 42, + 74, + 61, + 46, + 77, + 64, + 53, + 78, + 69, + 56, + 82, + 72, + 60, + 83, + 75, + 64, + 85, + 77, + 68, + 87, + 79, + 72, + 89, + 81, + 76, + 91, + 84, + 78, + 92, + 85, + 80, + 93, + 88, + 82, + 95, + 89, + 85, + 95, + 90, + 87, + 96, + 91, + 88, + 97, + 92, + 89, + 97, + 92, + 89, + 98, + 93, + 90, + 98, + 93, + 90, + 99, + 94, + 91, + 99, + 94, + 92, + 99, + 93, + 91, + 99, + 93, + 91, +100, + 94, + 92, + 99, + 94, + 91, + 99, + 93, + 91, + 99, + 93, + 91, +100, + 94, + 91, + 99, + 94, + 90, +100, + 95, + 91, +100, + 95, + 91, + 99, + 94, + 89, + 99, + 94, + 88, + 98, + 93, + 88, + 98, + 93, + 88, + 98, + 92, + 87, + 97, + 92, + 86, + 97, + 91, + 85, + 97, + 91, + 84, + 96, + 89, + 82, + 95, + 89, + 82, + 96, + 89, + 82, + 95, + 89, + 82, + 95, + 88, + 81, + 94, + 87, + 79, + 93, + 86, + 76, + 93, + 86, + 76, + 92, + 85, + 75, + 92, + 85, + 75, + 91, + 84, + 75, + 90, + 83, + 73, + 89, + 82, + 72, + 88, + 81, + 70, + 88, + 81, + 70, + 87, + 81, + 69, + 87, + 80, + 68, + 87, + 80, + 68, + 88, + 79, + 68, + 88, + 80, + 68, + 89, + 79, + 68, + 88, + 78, + 67, + 88, + 78, + 66, + 88, + 77, + 65, + 87, + 76, + 64, + 86, + 75, + 63, + 85, + 74, + 61, + 86, + 74, + 58, + 86, + 73, + 58, + 86, + 73, + 57, + 86, + 74, + 58, + 85, + 72, + 57, + 86, + 72, + 57, + 85, + 71, + 55, + 85, + 71, + 56, + 85, + 71, + 55, + 83, + 69, + 53, + 82, + 68, + 51, + 73, + 37, +-28, + 72, + 38, +-11, + 72, + 38, + -2, + 74, + 41, + -5, + 77, + 44, + -3, + 77, + 40, + -8, + 71, + 33, +-21, + 68, + 31, +-20, + 67, + 31, +-13, + 63, + 28, +-13, + 64, + 28, +-11, + 62, + 28, +-12, + 63, + 30, + -8, + 62, + 33, + -1, + 63, + 36, + 5, + 64, + 37, + 9, + 63, + 38, + 11, + 63, + 40, + 12, + 64, + 42, + 16, + 64, + 43, + 19, + 65, + 45, + 23, + 66, + 47, + 26, + 68, + 49, + 29, + 69, + 51, + 33, + 70, + 53, + 34, + 71, + 56, + 40, + 72, + 58, + 43, + 73, + 61, + 46, + 77, + 64, + 50, + 76, + 67, + 54, + 78, + 70, + 56, + 81, + 72, + 60, + 82, + 73, + 64, + 82, + 75, + 66, + 84, + 77, + 68, + 85, + 78, + 69, + 86, + 79, + 70, + 86, + 80, + 71, + 88, + 82, + 74, + 89, + 82, + 75, + 90, + 84, + 79, + 90, + 84, + 79, + 91, + 85, + 79, + 92, + 85, + 79, + 92, + 86, + 78, + 92, + 86, + 78, + 94, + 88, + 78, + 94, + 88, + 79, + 95, + 89, + 79, + 95, + 89, + 80, + 95, + 89, + 80, + 95, + 89, + 80, + 95, + 89, + 79, + 95, + 89, + 79, + 96, + 89, + 78, + 95, + 89, + 77, + 95, + 88, + 76, + 95, + 88, + 76, + 94, + 88, + 76, + 94, + 87, + 75, + 93, + 87, + 75, + 93, + 87, + 74, + 92, + 86, + 74, + 91, + 85, + 73, + 90, + 83, + 71, + 89, + 82, + 70, + 87, + 81, + 69, + 86, + 80, + 68, + 85, + 79, + 66, + 85, + 79, + 66, + 85, + 78, + 66, + 85, + 76, + 65, + 84, + 76, + 64, + 84, + 75, + 63, + 85, + 75, + 63, + 84, + 74, + 61, + 84, + 74, + 62, + 84, + 73, + 60, + 84, + 72, + 57, + 83, + 71, + 57, + 83, + 71, + 56, + 83, + 70, + 53, + 83, + 70, + 52, + 82, + 69, + 51, + 81, + 68, + 50, + 80, + 66, + 48, + 82, + 65, + 47, + 80, + 65, + 46, + 79, + 64, + 43, + 78, + 62, + 41, + 79, + 61, + 40, + 77, + 59, + 38, + 75, + 57, + 34, + 73, + 53, + 30, + 70, + 48, + 26, + 66, + 41, + 18, + 77, + 41, +-27, + 76, + 38, +-30, + 72, + 35, +-27, + 70, + 36, +-12, + 71, + 37, +-10, + 74, + 37, +-10, + 77, + 39, +-12, + 72, + 34, +-23, + 67, + 26, +-31, + 64, + 25, +-28, + 61, + 22, +-27, + 60, + 22, +-26, + 59, + 21, +-25, + 59, + 22, +-23, + 59, + 23, +-21, + 59, + 25, +-16, + 59, + 26, +-14, + 59, + 27, +-10, + 60, + 27, +-10, + 60, + 29, + -7, + 61, + 30, + -4, + 61, + 32, + -1, + 61, + 33, + 1, + 62, + 34, + 2, + 62, + 35, + 3, + 62, + 36, + 7, + 62, + 37, + 8, + 63, + 40, + 11, + 65, + 42, + 15, + 65, + 43, + 19, + 66, + 46, + 23, + 67, + 49, + 28, + 68, + 52, + 30, + 69, + 54, + 35, + 70, + 56, + 38, + 71, + 58, + 42, + 73, + 61, + 45, + 74, + 63, + 48, + 76, + 65, + 51, + 76, + 67, + 54, + 78, + 69, + 58, + 79, + 71, + 60, + 81, + 73, + 61, + 83, + 75, + 63, + 84, + 77, + 65, + 86, + 80, + 67, + 87, + 81, + 68, + 89, + 83, + 70, + 91, + 85, + 72, + 92, + 86, + 73, + 92, + 87, + 74, + 94, + 88, + 75, + 94, + 88, + 75, + 94, + 88, + 75, + 95, + 89, + 76, + 95, + 89, + 76, + 95, + 89, + 76, + 94, + 88, + 75, + 94, + 88, + 75, + 94, + 88, + 75, + 93, + 86, + 73, + 92, + 86, + 73, + 91, + 85, + 72, + 90, + 84, + 71, + 88, + 81, + 68, + 87, + 79, + 66, + 85, + 78, + 62, + 84, + 75, + 60, + 82, + 74, + 59, + 82, + 71, + 57, + 81, + 69, + 55, + 80, + 68, + 52, + 79, + 66, + 48, + 79, + 65, + 46, + 79, + 64, + 46, + 77, + 63, + 43, + 77, + 63, + 42, + 76, + 62, + 41, + 76, + 60, + 39, + 77, + 60, + 38, + 78, + 59, + 37, + 78, + 58, + 35, + 77, + 56, + 34, + 76, + 55, + 32, + 76, + 54, + 28, + 75, + 52, + 26, + 74, + 51, + 22, + 74, + 49, + 20, + 73, + 48, + 19, + 72, + 46, + 13, + 70, + 43, + 9, + 69, + 39, + 6, + 67, + 36, + 1, + 64, + 32, + -5, + 61, + 27, +-10, + 57, + 23, +-16, + 79, + 43, +-24, + 77, + 41, +-27, + 75, + 39, +-29, + 75, + 36, +-31, + 71, + 33, +-29, + 66, + 31, +-21, + 69, + 31, +-20, + 69, + 33, +-24, + 69, + 31, +-26, + 64, + 23, +-36, + 60, + 18, +-39, + 59, + 17, +-38, + 56, + 16, +-38, + 56, + 16, +-37, + 55, + 16, +-37, + 53, + 15, +-37, + 54, + 16, +-38, + 54, + 15, +-34, + 54, + 15, +-34, + 54, + 15, +-34, + 54, + 15, +-31, + 55, + 15, +-30, + 53, + 15, +-30, + 55, + 16, +-29, + 54, + 16, +-28, + 54, + 18, +-27, + 54, + 17, +-25, + 55, + 18, +-24, + 56, + 19, +-23, + 56, + 19, +-23, + 56, + 19, +-21, + 55, + 20, +-20, + 54, + 21, +-18, + 53, + 22, +-15, + 52, + 23, +-12, + 52, + 24, + -8, + 52, + 25, + -5, + 53, + 26, + -3, + 54, + 29, + -1, + 54, + 31, + 2, + 55, + 34, + 6, + 58, + 38, + 12, + 62, + 43, + 17, + 65, + 47, + 22, + 69, + 53, + 28, + 73, + 58, + 34, + 75, + 62, + 38, + 78, + 66, + 41, + 81, + 69, + 45, + 83, + 71, + 47, + 84, + 72, + 49, + 85, + 73, + 51, + 87, + 74, + 53, + 88, + 76, + 53, + 87, + 76, + 53, + 86, + 76, + 54, + 86, + 76, + 52, + 87, + 75, + 51, + 86, + 74, + 52, + 85, + 73, + 50, + 85, + 73, + 49, + 83, + 71, + 48, + 82, + 69, + 46, + 79, + 66, + 43, + 77, + 62, + 38, + 74, + 58, + 33, + 69, + 52, + 27, + 66, + 47, + 21, + 62, + 42, + 15, + 61, + 38, + 10, + 59, + 36, + 7, + 60, + 35, + 6, + 62, + 36, + 5, + 62, + 34, + 4, + 62, + 34, + 2, + 63, + 34, + 1, + 64, + 35, + -1, + 65, + 36, + -1, + 67, + 35, + -1, + 69, + 37, + 1, + 70, + 38, + 1, + 70, + 39, + -1, + 71, + 38, + -2, + 70, + 38, + -3, + 70, + 37, + -5, + 70, + 37, + -7, + 68, + 35, + -8, + 68, + 33, +-10, + 68, + 32, +-13, + 67, + 30, +-14, + 65, + 29, +-16, + 65, + 28, +-18, + 65, + 26, +-19, + 63, + 25, +-20, + 65, + 25, +-21, + 63, + 25, +-22, + 80, + 45, +-23, + 78, + 42, +-25, + 77, + 41, +-27, + 76, + 39, +-29, + 75, + 35, +-32, + 70, + 30, +-37, + 65, + 25, +-38, + 61, + 23, +-32, + 62, + 22, +-33, + 65, + 24, +-34, + 65, + 24, +-35, + 64, + 22, +-35, + 65, + 24, +-33, + 64, + 23, +-33, + 63, + 21, +-33, + 62, + 21, +-34, + 62, + 21, +-34, + 61, + 20, +-35, + 59, + 19, +-35, + 59, + 19, +-35, + 58, + 19, +-34, + 57, + 19, +-33, + 57, + 19, +-31, + 57, + 19, +-32, + 57, + 19, +-32, + 57, + 19, +-31, + 58, + 19, +-31, + 57, + 18, +-31, + 58, + 19, +-29, + 58, + 19, +-29, + 58, + 19, +-29, + 57, + 18, +-30, + 56, + 17, +-30, + 54, + 14, +-30, + 51, + 14, +-30, + 49, + 14, +-28, + 49, + 14, +-28, + 49, + 14, +-28, + 48, + 14, +-28, + 46, + 12, +-31, + 43, + 8, +-34, + 38, + 3, +-41, + 39, + 4, +-39, + 45, + 10, +-34, + 51, + 16, +-29, + 58, + 24, +-22, + 62, + 29, +-18, + 65, + 32, +-17, + 66, + 34, +-13, + 67, + 36, +-12, + 67, + 36, +-14, + 68, + 37, +-14, + 69, + 37, +-12, + 69, + 38, +-12, + 72, + 40, + -8, + 74, + 42, + -4, + 75, + 44, + 0, + 75, + 46, + 1, + 76, + 45, + 2, + 73, + 46, + 0, + 73, + 45, + 0, + 73, + 44, + -2, + 73, + 43, + -3, + 71, + 39, + -5, + 68, + 36, + -9, + 64, + 31, +-12, + 61, + 27, +-16, + 57, + 23, +-19, + 53, + 19, +-22, + 55, + 20, +-21, + 59, + 26, +-15, + 63, + 31, +-10, + 62, + 29, +-12, + 60, + 27, +-15, + 60, + 23, +-21, + 60, + 22, +-26, + 60, + 22, +-27, + 60, + 23, +-28, + 61, + 23, +-30, + 63, + 24, +-31, + 63, + 23, +-31, + 64, + 23, +-30, + 64, + 23, +-30, + 63, + 22, +-32, + 63, + 22, +-32, + 62, + 21, +-33, + 60, + 19, +-35, + 61, + 19, +-35, + 60, + 19, +-37, + 61, + 19, +-37, + 61, + 20, +-36, + 61, + 19, +-35, + 61, + 20, +-35, + 61, + 19, +-35, + 62, + 20, +-38, + 61, + 19, +-38, + 83, + 47, +-20, + 81, + 45, +-22, + 79, + 43, +-24, + 78, + 41, +-27, + 77, + 37, +-30, + 73, + 33, +-35, + 68, + 28, +-44, + 64, + 20, +-52, + 60, + 17, +-47, + 59, + 17, +-40, + 59, + 18, +-39, + 69, + 30, +-27, + 69, + 32, +-25, + 69, + 31, +-25, + 67, + 29, +-27, + 67, + 28, +-27, + 67, + 30, +-26, + 67, + 29, +-27, + 66, + 28, +-27, + 67, + 28, +-27, + 64, + 26, +-27, + 65, + 27, +-26, + 64, + 26, +-24, + 63, + 25, +-25, + 64, + 25, +-24, + 63, + 25, +-24, + 64, + 26, +-24, + 65, + 26, +-23, + 65, + 27, +-23, + 64, + 26, +-22, + 63, + 25, +-24, + 63, + 25, +-23, + 61, + 23, +-25, + 58, + 19, +-26, + 52, + 14, +-29, + 44, + 10, +-32, + 43, + 10, +-31, + 43, + 10, +-33, + 43, + 10, +-34, + 45, + 12, +-32, + 44, + 11, +-33, + 39, + 4, +-40, + 36, + 1, +-43, + 41, + 6, +-40, + 49, + 14, +-35, + 55, + 21, +-28, + 58, + 24, +-25, + 60, + 26, +-24, + 61, + 27, +-23, + 63, + 28, +-21, + 64, + 29, +-20, + 65, + 30, +-19, + 65, + 31, +-19, + 66, + 31, +-20, + 66, + 32, +-19, + 67, + 33, +-17, + 69, + 34, +-12, + 70, + 36, +-10, + 68, + 37, +-11, + 68, + 35, +-11, + 68, + 35, +-12, + 66, + 33, +-14, + 64, + 32, +-15, + 62, + 27, +-18, + 58, + 23, +-23, + 56, + 20, +-25, + 51, + 16, +-29, + 46, + 11, +-33, + 43, + 8, +-35, + 47, + 13, +-31, + 54, + 20, +-24, + 53, + 18, +-28, + 49, + 14, +-34, + 47, + 10, +-36, + 45, + 6, +-41, + 51, + 12, +-37, + 56, + 18, +-34, + 59, + 22, +-34, + 63, + 25, +-31, + 65, + 27, +-29, + 65, + 27, +-29, + 66, + 26, +-29, + 66, + 25, +-31, + 65, + 23, +-32, + 64, + 22, +-33, + 63, + 21, +-35, + 61, + 19, +-36, + 59, + 17, +-40, + 58, + 17, +-41, + 57, + 15, +-43, + 58, + 16, +-40, + 59, + 18, +-39, + 60, + 19, +-38, + 60, + 19, +-36, + 60, + 19, +-37, + 61, + 21, +-38, + 85, + 49, +-18, + 83, + 47, +-20, + 81, + 45, +-22, + 79, + 43, +-24, + 79, + 40, +-27, + 75, + 35, +-35, + 70, + 30, +-42, + 68, + 23, +-49, + 63, + 17, +-56, + 59, + 11, +-61, + 57, + 12, +-53, + 54, + 13, +-51, + 63, + 23, +-38, + 60, + 21, +-38, + 53, + 14, +-45, + 64, + 23, +-35, + 60, + 20, +-39, + 51, + 12, +-43, + 59, + 20, +-40, + 59, + 20, +-34, + 50, + 12, +-46, + 57, + 19, +-39, + 52, + 14, +-39, + 56, + 18, +-34, + 56, + 20, +-33, + 50, + 13, +-37, + 53, + 18, +-32, + 58, + 21, +-31, + 46, + 9, +-39, + 54, + 18, +-32, + 52, + 16, +-36, + 40, + 6, +-43, + 48, + 12, +-38, + 46, + 10, +-37, + 30, + -7, +-51, + 7, +-18, +-55, + 29, + -5, +-49, + 27, + -6, +-50, + 28, + -4, +-52, + 24, + -8, +-56, + 31, + -2, +-50, + 22, + -9, +-58, + 16, +-16, +-61, + 31, + -2, +-49, + 32, + -1, +-49, + 28, + -7, +-52, + 41, + 7, +-44, + 45, + 9, +-42, + 38, + 3, +-46, + 47, + 12, +-40, + 46, + 11, +-39, + 44, + 8, +-41, + 48, + 14, +-38, + 42, + 10, +-43, + 52, + 19, +-33, + 50, + 16, +-35, + 45, + 11, +-39, + 56, + 22, +-27, + 57, + 23, +-26, + 47, + 13, +-34, + 54, + 21, +-28, + 54, + 20, +-29, + 45, + 10, +-38, + 50, + 14, +-34, + 41, + 6, +-43, + 46, + 10, +-38, + 44, + 8, +-41, + 34, + -1, +-50, + 36, + 2, +-43, + 40, + 5, +-45, + 35, + 0, +-49, + 43, + 5, +-47, + 42, + 4, +-49, + 33, + -5, +-56, + 40, + -1, +-54, + 12, +-20, +-60, + 36, + 0, +-51, + 50, + 10, +-46, + 52, + 12, +-46, + 51, + 10, +-50, + 57, + 15, +-45, + 52, + 11, +-50, + 57, + 16, +-46, + 58, + 15, +-48, + 48, + 6, +-54, + 57, + 14, +-50, + 56, + 13, +-50, + 46, + 3, +-59, + 49, + 6, +-58, + 46, + 3, +-61, + 43, + -1, +-62, + 47, + 3, +-59, + 44, + 2, +-60, + 47, + 6, +-56, + 50, + 9, +-55, + 45, + 5, +-59, + 87, + 51, +-16, + 85, + 49, +-18, + 84, + 48, +-19, + 82, + 46, +-21, + 80, + 41, +-26, + 77, + 38, +-33, + 72, + 31, +-41, + 68, + 24, +-49, + 66, + 19, +-54, + 63, + 15, +-60, + 64, + 16, +-65, + 65, + 17, +-63, + 67, + 19, +-61, + 66, + 19, +-60, + 66, + 19, +-58, + 66, + 19, +-56, + 65, + 18, +-57, + 65, + 18, +-56, + 65, + 18, +-56, + 64, + 18, +-56, + 63, + 18, +-56, + 63, + 18, +-56, + 63, + 18, +-56, + 62, + 18, +-55, + 61, + 18, +-55, + 60, + 19, +-55, + 60, + 18, +-55, + 60, + 19, +-53, + 59, + 17, +-52, + 58, + 16, +-54, + 57, + 15, +-52, + 55, + 13, +-53, + 52, + 11, +-56, + 41, + 0, +-64, +-18, +-46, +-81, +-27, +-50, +-84, +-20, +-46, +-85, +-33, +-54, +-86, +-28, +-48, +-82, +-10, +-39, +-82, +-24, +-46, +-87, +-23, +-50, +-93, +-52, +-67, +-86, +-26, +-49, +-80, + -8, +-33, +-68, + -6, +-31, +-64, + 7, +-18, +-55, + 10, +-13, +-47, + 12, +-12, +-48, + 10, +-13, +-46, + 10, +-12, +-46, + 11, +-11, +-44, + 11, +-10, +-45, + 13, + -6, +-41, + 13, + -8, +-40, + 12, + -7, +-39, + 13, + -5, +-38, + 15, + -4, +-36, + 13, + -5, +-37, + 13, + -6, +-36, + 11, + -8, +-38, + 11, + -9, +-36, + 8, +-12, +-41, + 5, +-13, +-42, + 6, +-14, +-44, + -3, +-30, +-67, +-23, +-54, +-89, + 1, +-46, +-97, +-42, +-67, +-91, +-11, +-45, +-89, +-26, +-55, +-96, +-13, +-43, +-87, +-37, +-62, +-97, +-26, +-52, +-90, +-28, +-53, +-88, +-13, +-39, +-85, +-27, +-53, +-90, + 51, + 7, +-60, + 57, + 12, +-61, + 61, + 14, +-59, + 63, + 16, +-59, + 63, + 16, +-59, + 62, + 14, +-60, + 61, + 14, +-61, + 60, + 13, +-62, + 59, + 11, +-64, + 58, + 9, +-65, + 56, + 7, +-68, + 55, + 6, +-69, + 53, + 5, +-70, + 53, + 5, +-70, + 53, + 5, +-70, + 54, + 7, +-68, + 55, + 8, +-68, + 55, + 8, +-68, + 56, + 9, +-69, + 87, + 55, + 3, + 85, + 50, +-17, + 86, + 50, +-17, + 84, + 48, +-19, + 82, + 45, +-22, + 80, + 40, +-30, + 74, + 33, +-39, + 70, + 27, +-48, + 68, + 21, +-54, + 65, + 17, +-59, + 66, + 18, +-63, + 67, + 19, +-63, + 70, + 22, +-59, + 70, + 23, +-58, + 69, + 22, +-58, + 68, + 21, +-55, + 68, + 21, +-54, + 68, + 21, +-54, + 68, + 21, +-53, + 67, + 20, +-54, + 66, + 20, +-54, + 66, + 21, +-53, + 66, + 21, +-53, + 65, + 21, +-53, + 64, + 22, +-53, + 63, + 23, +-52, + 63, + 22, +-50, + 63, + 22, +-51, + 62, + 21, +-51, + 62, + 21, +-52, + 60, + 19, +-48, + 58, + 16, +-50, + 55, + 13, +-52, + 50, + 9, +-57, + 39, + -3, +-68, + -1, +-36, +-85, + 19, +-28, +-92, + 16, +-30, +-84, + 8, +-39, +-87, + 5, +-44, +-103, + 32, +-13, +-63, + 14, +-33, +-82, + 40, + -1, +-45, + 22, +-24, +-73, + 33, +-17, +-72, + 50, + 4, +-48, + 80, + 56, + 6, + 87, + 68, + 24, + 88, + 73, + 32, + 87, + 71, + 31, + 89, + 72, + 29, + 89, + 74, + 33, + 89, + 77, + 39, + 91, + 77, + 43, + 89, + 78, + 43, + 91, + 79, + 46, + 97, + 85, + 53, + 95, + 85, + 49, + 98, + 86, + 51, + 97, + 85, + 51, + 95, + 81, + 49, + 97, + 84, + 50, + 97, + 83, + 47, + 95, + 84, + 49, + 95, + 78, + 38, + 56, + 12, +-47, + 55, + 12, +-37, + 33, +-10, +-49, + 31, +-20, +-73, + 40, + -9, +-63, + 9, +-43, +-104, + 6, +-44, +-110, + 18, +-42, +-109, + 35, +-17, +-75, + 24, +-18, +-74, + 21, +-18, +-78, + 44, + 2, +-62, + 55, + 10, +-59, + 59, + 14, +-59, + 63, + 17, +-57, + 64, + 18, +-56, + 66, + 19, +-56, + 65, + 18, +-57, + 64, + 17, +-58, + 64, + 15, +-59, + 62, + 14, +-60, + 61, + 13, +-62, + 59, + 12, +-63, + 60, + 11, +-65, + 58, + 11, +-64, + 58, + 11, +-64, + 58, + 11, +-64, + 58, + 11, +-64, + 59, + 12, +-63, + 57, + 10, +-66, + 57, + 10, +-70, + 91, + 76, + 51, + 88, + 68, + 41, + 85, + 56, + 12, + 84, + 48, +-14, + 84, + 45, +-23, + 82, + 42, +-29, + 77, + 36, +-38, + 75, + 29, +-45, + 70, + 24, +-51, + 67, + 19, +-57, + 68, + 19, +-62, + 69, + 21, +-61, + 72, + 24, +-58, + 71, + 24, +-57, + 70, + 23, +-57, + 69, + 23, +-55, + 69, + 22, +-53, + 68, + 23, +-52, + 68, + 22, +-52, + 67, + 22, +-52, + 68, + 23, +-51, + 68, + 23, +-51, + 68, + 23, +-51, + 66, + 24, +-49, + 65, + 24, +-49, + 66, + 25, +-47, + 66, + 25, +-47, + 65, + 24, +-48, + 65, + 24, +-47, + 64, + 22, +-48, + 62, + 21, +-48, + 60, + 19, +-47, + 57, + 16, +-50, + 53, + 13, +-54, + 44, + 4, +-61, + 20, +-25, +-89, + 37, +-10, +-58, + 43, + -6, +-55, + 20, +-28, +-72, + 15, +-36, +-93, + 32, +-20, +-75, + 33, +-18, +-67, + 40, +-10, +-60, + 21, +-29, +-83, + 56, + 4, +-59, + 41, + -9, +-70, + 84, + 58, + 5, +100, + 87, + 42, + 98, + 91, + 48, + 99, + 91, + 50, +100, + 90, + 48, +100, + 93, + 57, +101, + 94, + 59, + 99, + 92, + 59, +101, + 92, + 59, +101, + 94, + 63, +105, + 98, + 68, +104, + 98, + 64, +105, + 99, + 67, +107, +100, + 67, +105, + 99, + 66, +106, + 99, + 66, +107, +100, + 66, +107, +100, + 67, +103, + 89, + 45, + 59, + 0, +-85, + 37, + -5, +-41, + 43, + -3, +-44, + 17, +-33, +-80, + 44, + -5, +-60, + 22, +-28, +-82, + 19, +-32, +-86, + 18, +-30, +-75, + 57, + 12, +-37, + 16, +-38, +-91, + 22, +-31, +-93, + 51, + 6, +-60, + 58, + 13, +-58, + 62, + 17, +-56, + 64, + 18, +-55, + 64, + 19, +-55, + 66, + 19, +-56, + 67, + 20, +-55, + 66, + 19, +-56, + 65, + 18, +-57, + 63, + 16, +-59, + 62, + 15, +-60, + 63, + 16, +-59, + 63, + 16, +-60, + 63, + 16, +-59, + 62, + 15, +-60, + 61, + 14, +-61, + 61, + 14, +-61, + 61, + 14, +-61, + 59, + 12, +-65, + 59, + 12, +-68, + 89, + 69, + 42, + 91, + 77, + 56, + 92, + 76, + 55, + 89, + 67, + 41, + 85, + 56, + 15, + 81, + 46, +-12, + 78, + 35, +-39, + 76, + 31, +-44, + 72, + 25, +-50, + 68, + 20, +-56, + 69, + 21, +-60, + 72, + 24, +-61, + 73, + 25, +-57, + 72, + 24, +-57, + 72, + 25, +-55, + 70, + 25, +-53, + 69, + 24, +-51, + 69, + 24, +-51, + 69, + 24, +-50, + 69, + 24, +-50, + 69, + 24, +-50, + 68, + 26, +-49, + 67, + 27, +-49, + 69, + 27, +-46, + 69, + 27, +-45, + 68, + 27, +-45, + 68, + 28, +-45, + 67, + 27, +-46, + 66, + 26, +-46, + 66, + 25, +-45, + 64, + 24, +-43, + 63, + 22, +-45, + 60, + 20, +-47, + 55, + 15, +-51, + 50, + 9, +-57, + 36, + -6, +-71, + 28, +-20, +-84, + 27, +-27, +-85, + 30, +-22, +-76, + 17, +-31, +-76, + 41, + -8, +-59, + 49, + 3, +-48, + 26, +-25, +-72, + 29, +-22, +-72, + 31, +-16, +-67, + 52, + -5, +-83, + 97, + 76, + 25, +109, +103, + 65, +108, +104, + 69, +107, +103, + 67, +106, +104, + 70, +107, +104, + 75, +107, +104, + 76, +106, +104, + 76, +107, +103, + 75, +107, +105, + 78, +110, +108, + 84, +109, +107, + 81, +111, +109, + 82, +112, +110, + 84, +112, +110, + 83, +113, +111, + 85, +114, +112, + 84, +116, +114, + 90, +116, +113, + 81, + 66, + 15, +-56, + 51, + 0, +-56, + 47, + 0, +-42, + 23, +-23, +-72, + 50, + 4, +-53, + 15, +-37, +-84, + 42, + -2, +-46, + 28, +-10, +-44, + 48, + 5, +-34, + 11, +-41, +-91, + 38, +-13, +-79, + 52, + 6, +-60, + 59, + 14, +-58, + 64, + 19, +-55, + 65, + 20, +-54, + 67, + 21, +-53, + 69, + 22, +-53, + 69, + 22, +-53, + 68, + 21, +-54, + 66, + 19, +-56, + 65, + 18, +-57, + 65, + 18, +-57, + 66, + 19, +-57, + 67, + 20, +-57, + 67, + 20, +-55, + 65, + 18, +-57, + 63, + 16, +-60, + 62, + 15, +-61, + 62, + 15, +-60, + 60, + 13, +-64, + 61, + 13, +-67, + 64, + 44, + 18, + 62, + 47, + 27, + 86, + 68, + 43, + 91, + 68, + 42, + 90, + 64, + 33, + 87, + 61, + 24, + 85, + 53, + 10, + 79, + 40, +-20, + 70, + 25, +-46, + 69, + 22, +-55, + 71, + 23, +-59, + 74, + 27, +-59, + 75, + 27, +-56, + 74, + 27, +-54, + 73, + 26, +-53, + 71, + 26, +-53, + 70, + 25, +-50, + 71, + 26, +-49, + 71, + 26, +-48, + 70, + 25, +-49, + 71, + 26, +-48, + 70, + 28, +-47, + 70, + 30, +-46, + 70, + 30, +-45, + 70, + 30, +-43, + 70, + 29, +-43, + 70, + 30, +-42, + 69, + 30, +-43, + 68, + 29, +-44, + 68, + 28, +-42, + 66, + 26, +-41, + 65, + 25, +-42, + 61, + 21, +-46, + 58, + 18, +-49, + 53, + 12, +-54, + 47, + 6, +-60, + 32, +-12, +-79, + 18, +-35, +-95, + 0, +-54, +-105, + 1, +-47, +-90, + 13, +-38, +-87, + -2, +-49, +-92, + 31, +-13, +-57, + 19, +-25, +-71, + 26, +-18, +-62, + 71, + 41, + -4, +112, +106, + 72, +112, +108, + 81, +111, +108, + 85, +108, +106, + 80, +107, +105, + 79, +108, +107, + 86, +108, +107, + 87, +106, +104, + 84, +104, +104, + 82, +108, +108, + 89, +110, +109, + 91, +109, +109, + 90, +112, +111, + 93, +112, +112, + 93, +112, +111, + 92, +113, +112, + 93, +114, +114, + 96, +117, +116, +100, +118, +117, +100, +103, + 90, + 59, + 45, + -3, +-50, + 33, +-17, +-68, + 38, + -7, +-55, + 41, + -7, +-59, + 38, + -6, +-47, + 33, +-17, +-66, + 37, +-13, +-65, + 56, + 11, +-36, + 35, +-17, +-79, + 45, + -2, +-67, + 54, + 9, +-60, + 61, + 16, +-57, + 64, + 19, +-55, + 67, + 22, +-52, + 68, + 23, +-52, + 69, + 23, +-52, + 68, + 23, +-52, + 70, + 23, +-52, + 68, + 21, +-54, + 67, + 20, +-55, + 66, + 19, +-57, + 65, + 18, +-61, + 67, + 20, +-57, + 68, + 21, +-54, + 66, + 19, +-56, + 65, + 18, +-61, + 64, + 17, +-62, + 62, + 15, +-63, + 62, + 15, +-64, + 62, + 15, +-65, + 36, + 17, + -7, +-29, +-43, +-64, +-12, +-25, +-45, + 32, + 15, + -6, + 66, + 44, + 18, + 88, + 61, + 27, + 87, + 56, + 16, + 85, + 51, + 4, + 83, + 45, + -7, + 74, + 32, +-31, + 73, + 25, +-57, + 75, + 28, +-58, + 77, + 30, +-55, + 75, + 28, +-51, + 73, + 28, +-51, + 73, + 28, +-50, + 73, + 28, +-47, + 73, + 28, +-47, + 73, + 28, +-46, + 72, + 28, +-46, + 70, + 30, +-46, + 70, + 30, +-46, + 71, + 31, +-45, + 71, + 30, +-43, + 71, + 30, +-42, + 70, + 31, +-42, + 70, + 31, +-42, + 71, + 32, +-41, + 70, + 30, +-41, + 69, + 29, +-39, + 68, + 28, +-39, + 66, + 26, +-41, + 64, + 24, +-43, + 60, + 20, +-47, + 56, + 16, +-51, + 51, + 11, +-56, + 38, + -6, +-71, + 27, +-30, +-102, + 4, +-53, +-116, + 18, +-29, +-75, + 32, +-20, +-74, + 4, +-53, +-117, + 8, +-48, +-117, + 40, +-10, +-66, + 24, +-28, +-90, + 81, + 56, + 14, +112, +109, + 87, +111, +109, + 93, +110, +110, + 97, +107, +107, + 92, +106, +105, + 93, +106, +107, + 93, +109, +108, + 97, +108, +108, + 99, +107, +107, + 98, +108, +108, + 99, +110, +110, +101, +111, +111, +101, +113, +113, +105, +113, +113, +105, +112, +113, +101, +114, +113, +103, +115, +115, +108, +118, +118, +111, +118, +118, +111, +119, +118, +107, + 74, + 36, + -5, + 46, +-10, +-76, + 32, +-22, +-75, + 12, +-43, +-99, +-18, +-66, +-108, + 12, +-45, +-99, + 50, + -1, +-61, + 27, +-25, +-77, + 27, +-25, +-85, + 48, + 3, +-64, + 57, + 12, +-59, + 63, + 18, +-55, + 66, + 21, +-53, + 68, + 23, +-51, + 69, + 24, +-51, + 69, + 24, +-51, + 70, + 24, +-51, + 70, + 23, +-52, + 69, + 22, +-53, + 66, + 19, +-56, + 65, + 18, +-60, + 65, + 18, +-62, + 67, + 19, +-60, + 67, + 19, +-58, + 67, + 20, +-57, + 66, + 19, +-59, + 64, + 17, +-60, + 63, + 16, +-64, + 63, + 16, +-64, + 62, + 15, +-65, + 30, + 13, +-12, +-94, +-94, +-111, +-81, +-83, +-100, +-59, +-67, +-90, +-45, +-56, +-80, + -4, +-22, +-48, + 48, + 20, +-14, + 69, + 38, + -5, + 83, + 45, + -6, + 81, + 41, +-17, + 75, + 27, +-56, + 78, + 31, +-55, + 78, + 31, +-53, + 76, + 30, +-51, + 76, + 30, +-50, + 74, + 29, +-47, + 73, + 28, +-47, + 74, + 29, +-45, + 72, + 29, +-45, + 71, + 31, +-45, + 70, + 30, +-46, + 68, + 28, +-46, + 68, + 28, +-47, + 67, + 26, +-44, + 66, + 26, +-44, + 67, + 27, +-44, + 69, + 29, +-43, + 70, + 31, +-40, + 71, + 31, +-39, + 71, + 31, +-37, + 69, + 29, +-37, + 67, + 27, +-40, + 65, + 25, +-42, + 63, + 23, +-44, + 59, + 19, +-48, + 54, + 14, +-53, + 40, + -4, +-69, + 36, +-27, +-102, + -5, +-63, +-121, + 26, +-27, +-78, + 29, +-25, +-87, + 19, +-42, +-123, + 5, +-53, +-128, + 48, + -4, +-67, + 12, +-44, +-123, + 83, + 59, + 18, +112, +109, + 93, +109, +109, + 97, +109, +108, +101, +106, +106, + 97, +105, +105, + 97, +106, +107, + 97, +108, +109, +102, +108, +109, +103, +107, +107, +101, +107, +108, +102, +110, +110, +105, +111, +111, +108, +112, +112, +109, +112, +113, +107, +113, +114, +108, +115, +115, +112, +114, +115, +111, +117, +118, +115, +117, +117, +113, +117, +118, +111, + 71, + 32, + -4, + 38, +-21, +-90, + 37, +-20, +-85, + 23, +-41, +-109, + 10, +-41, +-89, + 14, +-46, +-103, + 55, + 8, +-52, + 45, +-16, +-89, + 26, +-34, +-111, + 52, + 6, +-62, + 60, + 15, +-57, + 64, + 19, +-53, + 68, + 23, +-51, + 69, + 24, +-50, + 70, + 25, +-50, + 70, + 25, +-50, + 69, + 24, +-50, + 69, + 22, +-53, + 64, + 17, +-57, + 60, + 14, +-60, + 58, + 11, +-63, + 58, + 11, +-63, + 60, + 13, +-61, + 63, + 15, +-59, + 64, + 16, +-62, + 62, + 14, +-63, + 61, + 14, +-65, + 62, + 15, +-65, + 62, + 15, +-65, + 62, + 15, +-65, + 31, + 15, + -9, +-80, +-79, +-96, +-85, +-82, +-93, +-90, +-88, +-104, +-74, +-77, +-96, +-26, +-37, +-56, + 22, + 3, +-19, + 28, + 7, +-18, + 58, + 33, + 4, + 86, + 44, + -7, + 78, + 28, +-55, + 79, + 32, +-54, + 80, + 34, +-50, + 79, + 33, +-48, + 77, + 32, +-47, + 76, + 32, +-45, + 75, + 30, +-45, + 72, + 30, +-45, + 71, + 30, +-46, + 69, + 29, +-46, + 65, + 24, +-47, + 60, + 18, +-50, + 46, + 3, +-60, + 25, +-18, +-72, + 17, +-28, +-79, + 20, +-21, +-73, + 38, + -1, +-61, + 61, + 20, +-47, + 67, + 27, +-44, + 70, + 30, +-38, + 71, + 31, +-36, + 69, + 29, +-38, + 67, + 27, +-40, + 64, + 24, +-43, + 61, + 21, +-46, + 57, + 16, +-51, + 41, + -3, +-69, + 37, +-23, +-94, + 4, +-54, +-107, + 25, +-24, +-70, + 19, +-35, +-90, + 31, +-27, +-95, + 6, +-52, +-118, + 43, + -2, +-51, + 21, +-33, +-98, + 90, + 70, + 34, +111, +111, + 96, +108, +108, +100, +107, +107, +101, +107, +107, +102, +106, +107, +102, +107, +108, +102, +109, +109, +105, +108, +109, +105, +108, +108, +104, +109, +110, +106, +111, +111, +108, +111, +111, +108, +113, +114, +111, +114, +114, +111, +113, +113, +110, +114, +114, +112, +115, +116, +113, +117, +117, +114, +116, +116, +113, +117, +118, +115, + 64, + 19, +-29, + 18, +-36, +-94, + 44, + -9, +-60, + 27, +-31, +-93, + 14, +-39, +-86, + 24, +-30, +-93, + 54, + 16, +-23, + 54, + 2, +-51, + 23, +-37, +-114, + 55, + 8, +-62, + 63, + 18, +-56, + 66, + 21, +-53, + 69, + 24, +-50, + 70, + 25, +-49, + 70, + 25, +-50, + 69, + 24, +-51, + 64, + 19, +-55, + 53, + 10, +-62, + 39, + -8, +-76, + 21, +-28, +-87, + 7, +-40, +-86, + 13, +-34, +-86, + 31, +-17, +-80, + 49, + 2, +-71, + 54, + 5, +-70, + 56, + 7, +-69, + 55, + 7, +-71, + 56, + 8, +-72, + 57, + 9, +-70, + 61, + 14, +-67, + 33, + 17, + -6, +-63, +-69, +-98, +-77, +-76, +-90, +-72, +-76, +-103, +-66, +-70, +-95, +-27, +-35, +-54, + 22, + 5, +-14, + 30, + 12, +-11, + 58, + 37, + 9, + 87, + 47, + -5, + 79, + 31, +-53, + 81, + 35, +-52, + 81, + 35, +-48, + 80, + 34, +-47, + 78, + 34, +-46, + 78, + 33, +-44, + 76, + 32, +-43, + 74, + 29, +-45, + 66, + 25, +-48, + 60, + 19, +-52, + 43, + 0, +-63, + -4, +-50, +-97, +-27, +-70, +-90, + 6, +-10, +-19, + 11, + 1, +-13, + 6, + -2, +-13, + -9, +-28, +-39, +-12, +-55, +-98, + 39, + -2, +-61, + 62, + 20, +-46, + 68, + 27, +-39, + 69, + 29, +-38, + 69, + 29, +-38, + 66, + 26, +-41, + 62, + 22, +-45, + 58, + 18, +-49, + 42, + -2, +-66, + 35, +-23, +-92, + 18, +-37, +-84, + 27, +-17, +-58, + 7, +-50, +-109, + 35, +-21, +-81, + 11, +-43, +-105, + 51, + 8, +-37, + 23, +-26, +-81, + 91, + 72, + 40, +109, +109, + 98, +107, +107, +101, +107, +108, +103, +106, +107, +102, +108, +109, +106, +108, +109, +105, +108, +109, +105, +109, +109, +106, +109, +109, +107, +110, +110, +109, +112, +112, +109, +111, +111, +109, +112, +112, +110, +112, +112, +111, +112, +113, +110, +115, +115, +113, +115, +115, +113, +116, +116, +114, +116, +117, +114, +118, +118, +116, + 57, + 9, +-51, + 12, +-42, +-98, + 39, +-12, +-66, + 39, +-16, +-76, + 24, +-27, +-73, + 30, +-19, +-79, + 52, + 13, +-25, + 58, + 11, +-34, + 19, +-43, +-122, + 56, + 10, +-62, + 63, + 19, +-55, + 67, + 23, +-51, + 70, + 25, +-49, + 70, + 25, +-49, + 67, + 21, +-52, + 60, + 14, +-57, + 37, + -8, +-73, + 12, +-46, +-104, + 19, +-30, +-72, + 21, + -2, +-10, + 35, + 13, +-19, + 45, + 10, +-37, + 2, +-40, +-74, + -9, +-63, +-110, + 26, +-22, +-86, + 45, + -3, +-76, + 51, + 2, +-73, + 54, + 6, +-72, + 53, + 5, +-74, + 55, + 7, +-73, + 32, + 16, + -6, +-60, +-66, +-94, +-59, +-63, +-90, +-68, +-73, +-101, +-65, +-69, +-92, +-25, +-33, +-51, + 25, + 9, +-10, + 33, + 15, + -6, + 60, + 40, + 12, + 87, + 48, + -4, + 80, + 33, +-52, + 82, + 36, +-50, + 83, + 37, +-45, + 80, + 36, +-45, + 79, + 35, +-44, + 77, + 32, +-43, + 72, + 30, +-45, + 65, + 24, +-49, + 43, + -1, +-66, + -2, +-44, +-90, +-19, +-74, +-114, + -5, +-42, +-67, + 77, + 68, + 34, + 91, + 84, + 38, + 96, + 89, + 40, +101, + 94, + 50, + 80, + 75, + 41, + 34, + 28, + 16, +-11, +-42, +-61, + 1, +-40, +-87, + 42, + -2, +-61, + 64, + 23, +-43, + 67, + 27, +-40, + 66, + 26, +-41, + 63, + 23, +-44, + 58, + 18, +-49, + 43, + -3, +-64, + 31, +-25, +-92, + 30, +-26, +-80, + 20, +-32, +-81, + 12, +-49, +-116, + 32, +-24, +-92, + 19, +-37, +-105, + 60, + 11, +-43, + 23, +-27, +-84, + 88, + 66, + 31, +109, +109, + 99, +107, +107, +103, +106, +107, +104, +106, +106, +104, +106, +107, +104, +108, +108, +106, +109, +109, +107, +109, +109, +108, +108, +109, +107, +109, +109, +109, +112, +112, +111, +112, +112, +111, +113, +113, +112, +112, +112, +111, +111, +111, +110, +114, +114, +113, +114, +114, +113, +115, +115, +115, +116, +116, +115, +119, +118, +116, + 55, + 4, +-64, + 19, +-37, +-103, + 36, +-20, +-89, + 34, +-25, +-92, + 33, +-20, +-80, + 32, +-22, +-85, + 51, + 2, +-48, + 58, + 4, +-57, + 17, +-48, +-127, + 55, + 9, +-64, + 63, + 19, +-54, + 67, + 23, +-51, + 68, + 24, +-49, + 62, + 19, +-52, + 41, + -4, +-69, + 14, +-38, +-97, + 20, +-39, +-94, + 32, + -8, +-72, + 18, + 1, +-31, + 57, + 24, +-67, + 44, + 34, +-14, + 85, + 39, +-36, + 83, + 47, +-13, + 54, + 14, +-51, +-17, +-64, +-105, +-11, +-61, +-107, + 20, +-29, +-93, + 48, + -1, +-75, + 53, + 4, +-73, + 54, + 6, +-75, + 31, + 17, + -4, +-63, +-70, +-97, +-62, +-65, +-90, +-62, +-68, +-95, +-73, +-74, +-90, +-23, +-30, +-45, + 26, + 11, + -7, + 33, + 16, + -3, + 60, + 42, + 16, + 86, + 49, + -3, + 81, + 33, +-51, + 83, + 37, +-47, + 82, + 38, +-44, + 82, + 38, +-42, + 78, + 36, +-41, + 75, + 32, +-44, + 71, + 26, +-47, + 47, + 3, +-69, +-21, +-71, +-115, + 35, + 19, +-11, + 74, + 63, + 20, + 85, + 73, + 28, + 93, + 81, + 33, + 92, + 83, + 37, + 95, + 88, + 43, +100, + 92, + 48, +107, + 99, + 55, +108, +101, + 58, + 94, + 87, + 49, + 69, + 58, + 22, + 8, +-33, +-71, + 29, +-13, +-68, + 65, + 24, +-43, + 67, + 27, +-40, + 63, + 23, +-44, + 59, + 19, +-48, + 42, + -6, +-72, + 29, +-33, +-111, + 24, +-40, +-109, + 27, +-30, +-103, + 13, +-50, +-124, + 31, +-29, +-110, + 24, +-40, +-118, + 60, + 11, +-55, + 21, +-33, +-108, + 89, + 64, + 27, +108, +108, + 98, +106, +106, +101, +107, +107, +104, +106, +106, +104, +108, +108, +106, +109, +109, +107, +110, +111, +109, +111, +111, +110, +110, +111, +109, +112, +112, +112, +114, +114, +113, +113, +113, +112, +114, +114, +112, +113, +113, +112, +112, +112, +111, +115, +115, +114, +114, +114, +113, +117, +117, +116, +117, +117, +116, +118, +117, +116, + 59, + 9, +-74, + 34, +-23, +-99, + 37, +-20, +-95, + 29, +-36, +-115, + 36, +-21, +-94, + 28, +-31, +-108, + 53, + -1, +-63, + 55, + -5, +-84, + 19, +-50, +-128, + 57, + 7, +-65, + 64, + 19, +-54, + 68, + 24, +-51, + 65, + 22, +-50, + 35, +-10, +-73, + 17, +-43, +-109, + 28, + -9, +-52, + 38, + 17, +-33, + 28, + 6, +-45, + 28, + 17, +-19, + 68, + 34, +-61, + 53, + 36, +-14, + 81, + 46, + -8, + 87, + 41, +-51, + 76, + 57, + 16, + 94, + 90, + 78, + 67, + 61, + 54, +-21, +-73, +-107, + 25, +-23, +-92, + 50, + 2, +-75, + 53, + 5, +-76, + 31, + 16, + -2, +-61, +-73, +-104, +-57, +-64, +-91, +-63, +-69, +-93, +-66, +-70, +-91, +-20, +-28, +-43, + 28, + 14, + -4, + 36, + 19, + 0, + 62, + 44, + 19, + 86, + 48, + -2, + 81, + 34, +-48, + 84, + 39, +-45, + 83, + 39, +-42, + 82, + 39, +-41, + 78, + 37, +-40, + 76, + 32, +-43, + 69, + 25, +-48, + 45, + -6, +-82, + 15, +-16, +-43, + 88, + 74, + 26, + 90, + 78, + 30, + 92, + 80, + 32, + 74, + 58, + 8, + 47, + 27, +-18, + 70, + 59, + 17, + 93, + 86, + 43, +107, +100, + 57, +110, +102, + 58, +110, +102, + 58, +109, +101, + 57, + 74, + 56, + 14, + 9, +-38, +-84, + 62, + 21, +-46, + 67, + 27, +-40, + 64, + 24, +-43, + 59, + 19, +-48, + 40, + -7, +-73, + 34, +-28, +-108, + 19, +-45, +-118, + 33, +-22, +-90, + 12, +-49, +-120, + 38, +-20, +-98, + 26, +-36, +-112, + 64, + 19, +-34, + 23, +-32, +-105, + 91, + 66, + 31, +108, +108, + 96, +106, +106, +100, +105, +106, +102, +108, +109, +106, +108, +108, +105, +111, +111, +108, +112, +112, +109, +112, +112, +110, +112, +113, +111, +114, +115, +114, +116, +116, +116, +115, +115, +114, +115, +115, +114, +112, +112, +111, +110, +110, +109, +112, +112, +111, +113, +113, +112, +117, +117, +116, +117, +117, +115, +118, +118, +114, + 55, + 6, +-68, + 38, +-15, +-85, + 40, +-16, +-78, + 31, +-32, +-96, + 34, +-20, +-91, + 30, +-28, +-100, + 58, + 4, +-53, + 55, + -5, +-80, + 21, +-45, +-123, + 53, + 4, +-69, + 64, + 19, +-54, + 69, + 24, +-50, + 66, + 21, +-51, + 26, +-27, +-93, + 43, + 12, +-23, + 77, + 53, +-19, + 43, + 10, +-51, + 48, + 26, +-27, + 41, + 40, + 12, + 67, + 32, +-56, + 42, + 21, +-17, + 83, + 52, + 9, + 97, + 52, +-39, + 78, + 63, + 26, +108, +109, +104, + 67, + 40, + 10, + 44, + 12, +-29, + 35, +-16, +-104, + 48, + -1, +-78, + 53, + 5, +-75, + 34, + 19, + 1, +-64, +-77, +-107, +-78, +-77, +-85, +-66, +-69, +-91, +-63, +-68, +-94, +-17, +-25, +-43, + 29, + 16, + -2, + 36, + 21, + 3, + 62, + 46, + 21, + 87, + 49, + 0, + 82, + 35, +-47, + 84, + 39, +-44, + 84, + 40, +-41, + 81, + 40, +-39, + 78, + 38, +-39, + 74, + 33, +-43, + 68, + 25, +-48, + 43, + -9, +-81, + 24, +-13, +-51, + 82, + 67, + 22, + 90, + 78, + 31, + 89, + 80, + 35, + 55, + 41, + -8, + -7, +-35, +-72, + 17, +-13, +-60, + 21, + -9, +-59, + 56, + 39, + 3, +110, +102, + 59, +110, +102, + 58, +110, +101, + 56, + 56, + 22, +-26, + 15, +-32, +-85, + 64, + 22, +-44, + 67, + 27, +-40, + 64, + 24, +-43, + 59, + 19, +-48, + 41, + -2, +-59, + 33, +-22, +-83, + 19, +-38, +-101, + 37, +-15, +-67, + 14, +-43, +-107, + 47, + -6, +-76, + 29, +-27, +-91, + 75, + 35, + -8, + 30, +-20, +-84, + 92, + 73, + 45, +109, +109, + 99, +107, +107, +102, +109, +109, +106, +110, +110, +108, +109, +109, +107, +112, +112, +109, +113, +113, +111, +114, +115, +113, +114, +115, +113, +116, +116, +115, +118, +118, +117, +116, +116, +115, +115, +115, +114, +114, +114, +113, +112, +112, +110, +112, +113, +112, +114, +114, +112, +116, +116, +116, +117, +117, +115, +118, +118, +118, + 47, + 6, +-48, + 38, +-11, +-74, + 39, + -8, +-58, + 33, +-21, +-74, + 29, +-23, +-78, + 38, +-16, +-80, + 61, + 14, +-34, + 53, + -2, +-64, + 27, +-34, +-101, + 50, + 1, +-69, + 64, + 19, +-54, + 69, + 24, +-50, + 66, + 21, +-49, + 24, +-28, +-93, + 33, + 10, +-14, + 90, + 61, +-12, + 35, + 5, +-53, + 40, + 15, +-43, + 17, + 20, + -2, + 54, + 24, +-60, + 53, + 28, +-23, + 84, + 42, +-28, + 91, + 44, +-82, + 81, + 65, + 26, +108, +109, +105, + 58, + 25, +-16, + 56, + 22, +-15, + 40, +-17, +-102, + 47, + -2, +-76, + 53, + 5, +-74, + 35, + 19, + 0, +-69, +-80, +-106, +-77, +-75, +-84, +-75, +-74, +-90, +-61, +-66, +-91, +-15, +-23, +-40, + 31, + 18, + 0, + 36, + 23, + 5, + 64, + 47, + 22, + 87, + 51, + 2, + 83, + 36, +-46, + 84, + 39, +-44, + 84, + 40, +-40, + 80, + 40, +-38, + 79, + 39, +-38, + 74, + 34, +-42, + 69, + 26, +-47, + 49, + 2, +-76, + 23, +-12, +-54, + 79, + 68, + 27, + 90, + 81, + 37, + 90, + 82, + 38, + 53, + 39, + -6, + 0, +-22, +-64, + 55, + 55, + 45, + 51, + 52, + 38, + 57, + 51, + 27, +110, +102, + 59, +109, +101, + 57, +109, +101, + 56, + 59, + 37, + 5, + 23, +-25, +-82, + 64, + 22, +-44, + 66, + 27, +-41, + 64, + 24, +-43, + 58, + 18, +-49, + 41, + -3, +-58, + 33, +-22, +-83, + 14, +-45, +-108, + 39, +-13, +-66, + 14, +-42, +-107, + 44, + -9, +-78, + 32, +-25, +-90, + 80, + 38, + -9, + 33, +-20, +-89, + 93, + 72, + 43, +110, +110, +102, +108, +108, +103, +110, +110, +107, +109, +109, +107, +109, +110, +107, +111, +112, +108, +113, +113, +110, +115, +115, +114, +115, +115, +113, +116, +116, +115, +118, +118, +117, +116, +116, +116, +115, +115, +114, +113, +113, +112, +111, +111, +110, +112, +112, +111, +112, +113, +111, +115, +115, +114, +118, +118, +117, +119, +119, +119, + 50, + 7, +-47, + 33, +-19, +-83, + 42, + -6, +-58, + 35, +-20, +-73, + 22, +-33, +-84, + 38, +-15, +-84, + 62, + 16, +-27, + 52, + -2, +-70, + 32, +-30, +-97, + 47, + -3, +-71, + 63, + 18, +-54, + 69, + 24, +-50, + 66, + 21, +-51, + 30, +-22, +-90, + 43, + 19, +-11, + 90, + 65, + -8, + 60, + 32, +-30, + 52, + 34, +-22, + 16, + 20, + -9, + 53, + 23, +-50, + 45, + 15, +-50, + 95, + 60, + -5, + 92, + 47, +-56, + 82, + 67, + 30, +109, +110, +105, + 60, + 30, +-11, + 50, + 20, +-15, + 39, +-17, +-103, + 48, + -1, +-76, + 53, + 5, +-74, + 36, + 22, + 4, +-68, +-77, +-105, +-76, +-74, +-80, +-78, +-76, +-84, +-70, +-71, +-87, +-14, +-22, +-38, + 32, + 19, + 2, + 37, + 24, + 7, + 66, + 48, + 24, + 86, + 52, + 3, + 83, + 37, +-44, + 85, + 41, +-42, + 84, + 42, +-38, + 81, + 41, +-36, + 78, + 38, +-37, + 74, + 34, +-41, + 68, + 27, +-45, + 50, + 2, +-76, + 32, + -7, +-53, + 80, + 69, + 26, + 90, + 82, + 38, + 91, + 83, + 39, + 52, + 40, + -5, + 22, + 6, +-21, + 44, + 46, + 46, + 33, + 39, + 21, + 55, + 55, + 40, +109, +101, + 58, +108, +100, + 56, +108, +100, + 54, + 44, + 25, +-20, + 27, +-20, +-80, + 64, + 22, +-44, + 66, + 26, +-41, + 64, + 24, +-43, + 58, + 17, +-49, + 41, + -7, +-69, + 32, +-28, +-106, + 12, +-50, +-125, + 44, +-15, +-86, + 23, +-37, +-111, + 39, +-20, +-97, + 31, +-29, +-105, + 81, + 34, +-33, + 34, +-25, +-106, + 94, + 69, + 30, +109, +109, +101, +109, +109, +104, +110, +110, +107, +111, +111, +109, +110, +111, +109, +112, +113, +110, +114, +115, +113, +116, +116, +115, +115, +115, +114, +117, +117, +116, +118, +118, +116, +117, +117, +116, +117, +117, +116, +115, +115, +114, +113, +113, +112, +113, +113, +112, +114, +114, +113, +116, +116, +115, +118, +118, +117, +119, +119, +119, + 58, + 11, +-59, + 27, +-30, +-109, + 46, + -5, +-72, + 37, +-29, +-104, + 21, +-40, +-112, + 37, +-21, +-103, + 64, + 7, +-61, + 50, +-11, +-97, + 33, +-36, +-121, + 43, + -8, +-75, + 62, + 17, +-55, + 67, + 24, +-50, + 67, + 21, +-50, + 32, +-21, +-89, + 58, + 22, +-20, + 88, + 69, + 10, + 63, + 34, +-33, + 71, + 47, +-17, + 44, + 39, + 3, + 47, + 13, +-59, + 53, + 31, +-16, + 93, + 72, + 32, + 94, + 50, +-33, + 82, + 69, + 36, +110, +110, +104, + 59, + 23, +-23, + 44, + 8, +-40, + 44, +-12, +-93, + 48, + -1, +-76, + 53, + 5, +-74, + 34, + 22, + 5, +-58, +-70, +-102, +-73, +-72, +-78, +-64, +-65, +-82, +-61, +-65, +-88, +-11, +-19, +-35, + 34, + 21, + 4, + 39, + 26, + 9, + 66, + 47, + 26, + 90, + 53, + 5, + 83, + 37, +-44, + 86, + 42, +-40, + 83, + 44, +-36, + 81, + 41, +-35, + 80, + 40, +-35, + 75, + 35, +-40, + 69, + 28, +-44, + 48, + 5, +-73, + 45, + 0, +-54, + 81, + 69, + 28, + 92, + 84, + 40, + 93, + 85, + 41, + 54, + 42, + -3, + 17, + 1, +-20, + 48, + 52, + 30, + 26, + 26, +-25, + 55, + 52, + 35, +108, +100, + 57, +108, +100, + 56, +108, + 99, + 54, + 49, + 29, +-18, + 28, +-20, +-82, + 64, + 22, +-44, + 67, + 27, +-40, + 64, + 24, +-43, + 57, + 16, +-49, + 38, +-10, +-77, + 33, +-29, +-113, + 7, +-56, +-128, + 42, +-17, +-96, + 28, +-32, +-107, + 42, +-17, +-95, + 30, +-29, +-106, + 81, + 35, +-28, + 32, +-30, +-108, + 95, + 69, + 31, +108, +108, +100, +108, +108, +104, +110, +110, +108, +109, +109, +108, +110, +110, +109, +112, +113, +110, +114, +114, +114, +115, +115, +115, +116, +116, +115, +116, +116, +116, +118, +118, +117, +117, +117, +116, +117, +117, +117, +115, +115, +115, +113, +113, +113, +113, +113, +112, +113, +113, +113, +117, +117, +116, +118, +118, +118, +119, +120, +120, + 56, + 12, +-55, + 23, +-34, +-110, + 53, + 5, +-56, + 40, +-24, +-95, + 22, +-41, +-117, + 36, +-24, +-103, + 63, + 8, +-59, + 51, +-12, +-96, + 38, +-30, +-119, + 41, +-10, +-78, + 61, + 16, +-56, + 67, + 24, +-49, + 65, + 22, +-51, + 38, +-16, +-86, + 52, + 6, +-51, + 68, + 46, + -6, + 57, + 27, +-40, + 60, + 38, +-20, + 34, + 19, +-20, + 10, +-26, +-76, + 63, + 32, +-27, +102, + 71, + 18, + 88, + 41, +-66, + 86, + 69, + 38, +106, +103, + 96, + 57, + 13, +-49, + 49, + 9, +-44, + 43, +-13, +-94, + 48, + -1, +-75, + 54, + 6, +-72, + 36, + 23, + 8, +-55, +-70, +-104, +-55, +-60, +-80, +-51, +-58, +-81, +-60, +-64, +-87, +-11, +-19, +-34, + 35, + 21, + 11, + 40, + 26, + 12, + 65, + 49, + 28, + 89, + 54, + 7, + 83, + 37, +-44, + 86, + 42, +-39, + 83, + 44, +-36, + 81, + 41, +-35, + 80, + 40, +-35, + 76, + 36, +-37, + 68, + 27, +-45, + 43, + 4, +-67, + 50, + 5, +-51, + 73, + 64, + 26, + 95, + 87, + 43, + 95, + 87, + 42, + 55, + 44, + 1, + 4, +-17, +-42, + 44, + 48, + 9, + 23, + 23, +-29, + 71, + 70, + 50, +109, +101, + 59, +108, +100, + 56, +107, + 98, + 54, + 53, + 34, + -8, + 27, +-21, +-81, + 65, + 23, +-43, + 67, + 27, +-40, + 63, + 23, +-44, + 55, + 15, +-50, + 39, + -7, +-65, + 35, +-21, +-96, + 8, +-50, +-111, + 44, +-12, +-77, + 30, +-26, +-92, + 46, + -9, +-78, + 29, +-27, +-94, + 82, + 45, + 5, + 32, +-23, +-87, + 92, + 72, + 45, +108, +108, + 98, +107, +107, +103, +110, +110, +109, +111, +111, +111, +111, +111, +110, +111, +111, +110, +114, +114, +114, +115, +115, +115, +115, +115, +115, +116, +116, +116, +117, +117, +116, +116, +116, +116, +116, +116, +116, +115, +115, +115, +113, +113, +113, +112, +112, +112, +114, +114, +114, +117, +117, +117, +118, +118, +118, +120, +119, +120, + 51, + 8, +-41, + 27, +-26, +-93, + 57, + 17, +-28, + 44, +-11, +-65, + 23, +-34, +-102, + 35, +-20, +-90, + 62, + 20, +-19, + 54, + 0, +-71, + 42, +-16, +-74, + 40, +-10, +-79, + 61, + 17, +-56, + 65, + 24, +-48, + 66, + 24, +-50, + 41, +-14, +-86, + 30, +-22, +-76, + 18, + 4, +-26, + 53, + 24, +-45, + 31, + 14, +-33, + 12, + 0, +-29, + -9, +-36, +-66, + 66, + 31, +-45, + 99, + 65, + -8, + 82, + 31, +-95, + 80, + 65, + 30, +102, + 98, + 90, + 58, + 15, +-41, + 45, + -4, +-66, + 52, + 3, +-79, + 49, + 0, +-75, + 54, + 6, +-73, + 37, + 24, + 8, +-49, +-64, +-102, +-51, +-56, +-78, +-47, +-55, +-77, +-65, +-67, +-84, +-11, +-19, +-33, + 36, + 22, + 7, + 39, + 26, + 9, + 67, + 49, + 26, + 88, + 55, + 8, + 85, + 39, +-43, + 86, + 44, +-38, + 84, + 44, +-34, + 82, + 42, +-33, + 79, + 40, +-35, + 75, + 36, +-38, + 69, + 29, +-43, + 49, + 8, +-64, + 50, + 7, +-47, + 65, + 58, + 22, + 95, + 87, + 43, + 95, + 87, + 44, + 57, + 46, + 6, + 5, +-18, +-50, + 44, + 45, + 2, + 26, + 27, +-12, + 85, + 81, + 60, +109, +100, + 60, +108, +100, + 56, +106, + 98, + 53, + 55, + 41, + 15, + 23, +-28, +-81, + 64, + 23, +-44, + 67, + 27, +-40, + 62, + 23, +-44, + 54, + 13, +-51, + 39, + -8, +-64, + 37, +-16, +-85, + 14, +-43, +-100, + 47, + -9, +-76, + 31, +-24, +-87, + 46, + -8, +-72, + 26, +-27, +-88, + 82, + 48, + 12, + 34, +-21, +-90, + 91, + 71, + 44, +101, +100, + 90, +100, +101, + 98, +103, +103, +104, +105, +105, +105, +104, +104, +105, +104, +103, +103, +105, +105, +104, +107, +108, +107, +108, +108, +108, +109, +109, +108, +111, +112, +112, +109, +109, +110, +110, +110, +111, +110, +109, +110, +110, +110, +110, +110, +110, +111, +110, +110, +109, +111, +112, +111, +115, +114, +114, +117, +116, +118, + 47, + 6, +-40, + 27, +-29, +-96, + 61, + 19, +-23, + 47, + -7, +-61, + 23, +-36, +-102, + 33, +-23, +-88, + 58, + 16, +-21, + 57, + 3, +-63, + 42, +-16, +-75, + 40, +-11, +-80, + 60, + 16, +-56, + 65, + 24, +-48, + 66, + 25, +-47, + 40, +-13, +-83, + 77, + 50, + 36, + 50, + 37, + -4, + 56, + 30, +-29, + 38, + 19, +-30, + -2, +-20, +-59, + 54, + 34, +-21, + 72, + 47, + -1, + 95, + 68, + 15, + 79, + 32, +-62, + 84, + 72, + 46, +103, + 96, + 85, + 61, + 30, +-10, + 43, + -5, +-63, + 50, + 8, +-67, + 49, + 0, +-75, + 55, + 6, +-72, + 40, + 25, + 8, + -2, +-48, +-110, +-33, +-47, +-75, +-51, +-57, +-77, +-63, +-66, +-78, +-11, +-19, +-30, + 35, + 21, + 9, + 40, + 27, + 10, + 68, + 50, + 26, + 89, + 56, + 7, + 85, + 40, +-42, + 88, + 44, +-37, + 85, + 45, +-32, + 82, + 42, +-33, + 80, + 41, +-34, + 75, + 36, +-37, + 69, + 29, +-41, + 47, + 8, +-64, + 56, + 11, +-44, + 62, + 56, + 21, + 95, + 87, + 44, + 95, + 87, + 45, + 57, + 48, + 9, + 11, +-12, +-44, + 46, + 47, + 7, + 36, + 39, + 5, + 77, + 76, + 52, +108, +100, + 59, +107, + 99, + 57, +105, + 97, + 52, + 60, + 40, + 17, + 20, +-30, +-81, + 64, + 23, +-43, + 65, + 26, +-41, + 60, + 22, +-44, + 53, + 12, +-53, + 37, +-13, +-76, + 37, +-19, +-91, + 10, +-50, +-113, + 42, +-16, +-91, + 32, +-23, +-91, + 38, +-19, +-86, + 25, +-32, +-100, + 86, + 44, +-16, + 35, +-22, +-98, + 90, + 57, + 8, + 71, + 48, + 12, + 66, + 48, + 22, + 63, + 49, + 24, + 62, + 48, + 24, + 62, + 48, + 25, + 63, + 51, + 30, + 66, + 57, + 39, + 66, + 59, + 44, + 66, + 58, + 40, + 67, + 61, + 47, + 69, + 63, + 49, + 66, + 60, + 43, + 67, + 60, + 41, + 68, + 61, + 44, + 73, + 68, + 55, + 70, + 63, + 47, + 70, + 59, + 41, + 74, + 64, + 45, + 79, + 68, + 44, + 91, + 73, + 41, + 50, + 2, +-64, + 23, +-34, +-114, + 64, + 12, +-52, + 49, +-14, +-83, + 20, +-45, +-121, + 30, +-30, +-106, + 55, + 0, +-58, + 52, + -4, +-82, + 39, +-26, +-108, + 39, +-16, +-83, + 60, + 15, +-55, + 66, + 25, +-47, + 67, + 25, +-47, + 37, +-16, +-83, + 75, + 52, + 35, + 83, + 68, + 16, + 78, + 56, + -8, + 54, + 30, +-29, + 11, + -9, +-39, + 71, + 50, +-15, + 79, + 56, + 9, + 92, + 62, + 6, + 78, + 30, +-54, + 84, + 78, + 65, + 88, + 77, + 61, + 65, + 32, +-16, + 37, +-11, +-68, + 51, + 12, +-50, + 51, + 0, +-74, + 55, + 7, +-72, + 41, + 14, +-13, + 17, +-25, +-75, + 17, +-19, +-75, + 4, +-28, +-73, + -4, +-38, +-83, + 13, +-16, +-46, + 40, + 18, + -5, + 41, + 28, + 11, + 68, + 50, + 28, + 89, + 56, + 7, + 84, + 40, +-42, + 87, + 46, +-36, + 85, + 45, +-32, + 82, + 42, +-33, + 80, + 41, +-33, + 76, + 37, +-36, + 70, + 29, +-39, + 45, + 5, +-65, + 53, + 12, +-38, + 61, + 54, + 17, + 95, + 87, + 44, + 95, + 87, + 44, + 59, + 49, + 11, + 15, + -8, +-36, + 46, + 48, + 5, + 30, + 33, + 3, + 72, + 70, + 42, +108, +100, + 58, +106, + 98, + 55, +104, + 96, + 51, + 62, + 43, + 15, + 25, +-26, +-82, + 65, + 23, +-43, + 65, + 26, +-41, + 61, + 21, +-45, + 52, + 10, +-54, + 36, +-17, +-89, + 36, +-27, +-111, + 6, +-56, +-124, + 41, +-19, +-100, + 29, +-26, +-101, + 36, +-27, +-97, + 24, +-37, +-105, + 85, + 42, +-22, + 40, +-19, +-100, + 94, + 60, + 10, + 72, + 48, + 11, + 68, + 50, + 21, + 68, + 53, + 26, + 69, + 56, + 29, + 72, + 61, + 39, + 75, + 69, + 49, + 76, + 70, + 54, + 79, + 73, + 57, + 78, + 71, + 55, + 76, + 70, + 53, + 74, + 70, + 53, + 73, + 67, + 49, + 71, + 64, + 45, + 71, + 63, + 43, + 70, + 63, + 43, + 70, + 61, + 40, + 72, + 59, + 38, + 74, + 63, + 40, + 79, + 65, + 36, + 93, + 69, + 30, + 47, + -4, +-75, + 29, +-29, +-108, + 63, + 14, +-55, + 51, +-13, +-86, + 19, +-47, +-128, + 30, +-30, +-110, + 56, + -4, +-72, + 56, + -1, +-81, + 39, +-28, +-126, + 35, +-19, +-85, + 60, + 15, +-56, + 66, + 24, +-47, + 69, + 26, +-46, + 45, + -6, +-80, + 75, + 51, + 35, + 90, + 77, + 26, + 88, + 70, + 15, + 44, + 6, +-42, + 36, + 7, +-21, + 90, + 62, +-24, + 82, + 55, + -4, + 93, + 52, +-32, + 82, + 35, +-55, + 90, + 90, + 81, + 85, + 69, + 47, + 72, + 29, +-40, + 38, +-15, +-79, + 50, + 17, +-45, + 52, + 0, +-76, + 55, + 7, +-73, + 70, + 31, +-31, + 77, + 37, +-20, + 81, + 44, +-10, + 88, + 50, + -2, + 92, + 54, + 4, + 93, + 57, + 10, + 86, + 56, + 12, + 40, + 27, + 11, + 67, + 49, + 29, + 90, + 55, + 6, + 85, + 39, +-42, + 86, + 45, +-37, + 85, + 45, +-31, + 81, + 42, +-33, + 80, + 41, +-33, + 75, + 36, +-36, + 69, + 29, +-38, + 43, + 4, +-65, + 50, + 9, +-32, + 72, + 56, + 8, + 91, + 82, + 33, + 93, + 85, + 42, + 64, + 54, + 13, + 19, + -5, +-32, + 43, + 45, + 5, + 17, + 20, + -7, + 51, + 44, + 15, + 99, + 89, + 46, +106, + 98, + 55, +102, + 95, + 51, + 54, + 40, + 5, + 20, +-29, +-81, + 64, + 23, +-43, + 64, + 25, +-42, + 61, + 21, +-45, + 49, + 8, +-56, + 39, +-14, +-80, + 45, +-13, +-86, + 6, +-52, +-103, + 41, +-16, +-88, + 26, +-29, +-98, + 38, +-20, +-81, + 33, +-24, +-71, + 84, + 51, + 12, + 42, +-14, +-80, + 95, + 80, + 49, + 85, + 77, + 56, + 78, + 71, + 57, + 81, + 76, + 65, + 81, + 77, + 67, + 86, + 84, + 74, + 95, + 93, + 84, + 96, + 95, + 88, + 96, + 95, + 88, + 97, + 97, + 90, + 97, + 96, + 90, + 94, + 93, + 87, + 89, + 88, + 82, + 86, + 86, + 79, + 84, + 82, + 76, + 85, + 83, + 78, + 83, + 81, + 76, + 85, + 82, + 75, + 86, + 83, + 75, + 92, + 89, + 78, +105, +100, + 83, + 45, + -5, +-69, + 30, +-22, +-86, + 60, + 18, +-30, + 52, + -3, +-62, + 21, +-42, +-120, + 29, +-27, +-96, + 55, + 1, +-57, + 52, + 3, +-60, + 42, +-21, +-94, + 35, +-20, +-84, + 58, + 14, +-57, + 65, + 25, +-49, + 67, + 27, +-48, + 49, + 4, +-79, + 76, + 51, + 37, + 85, + 73, + 22, + 77, + 66, + 14, + 67, + 53, + 0, + 64, + 53, + 0, + 72, + 63, + 17, + 98, + 76, + 28, + 98, + 60, +-18, + 91, + 51, +-27, + 67, + 57, + 42, + 82, + 63, + 35, + 70, + 31, +-34, + 41, + -5, +-52, + 53, + 19, +-35, + 53, + 1, +-78, + 55, + 7, +-73, + 78, + 41, +-20, + 83, + 46, +-11, + 87, + 51, + -2, + 91, + 57, + 7, + 95, + 62, + 15, + 95, + 65, + 19, + 99, + 68, + 22, + 61, + 41, + 12, + 68, + 49, + 26, + 90, + 55, + 7, + 83, + 38, +-43, + 86, + 45, +-36, + 84, + 45, +-31, + 81, + 42, +-33, + 79, + 40, +-33, + 76, + 36, +-36, + 69, + 29, +-38, + 42, + 0, +-70, + 55, + 19, +-31, + 67, + 45, +-21, + 79, + 62, + -4, + 89, + 81, + 38, + 68, + 57, + 19, + 20, + -3, +-28, + 40, + 14, +-41, + 37, + -4, +-77, + 41, + 2, +-67, + 62, + 30, +-41, + 71, + 48, +-15, + 71, + 43, +-22, + 46, + 8, +-48, + 17, +-30, +-81, + 64, + 23, +-44, + 63, + 24, +-43, + 59, + 20, +-46, + 48, + 7, +-58, + 42, + -9, +-64, + 50, + -6, +-71, + 8, +-48, +-97, + 43, +-13, +-84, + 20, +-36, +-96, + 37, +-17, +-76, + 35, +-16, +-56, + 90, + 61, + 25, + 42, +-11, +-69, +100, + 91, + 75, +114, +113, +110, +112, +111, +109, +112, +112, +109, +113, +113, +111, +115, +115, +114, +120, +120, +120, +120, +120, +120, +118, +118, +117, +120, +120, +119, +120, +120, +120, +110, +111, +111, +107, +107, +108, +111, +112, +110, +114, +114, +114, +114, +114, +113, +114, +114, +113, +111, +111, +109, +105, +105, +103, +111, +110, +108, +117, +117, +113, + 40, + -6, +-66, + 25, +-27, +-88, + 56, + 15, +-28, + 55, + 5, +-48, + 21, +-38, +-106, + 27, +-26, +-89, + 49, + -3, +-56, + 46, + 2, +-53, + 43, +-15, +-80, + 33, +-21, +-85, + 58, + 13, +-57, + 65, + 25, +-50, + 67, + 27, +-47, + 50, + 5, +-80, + 73, + 50, + 36, + 76, + 67, + 23, + 75, + 63, + 17, + 74, + 63, + 14, + 74, + 63, + 14, + 80, + 67, + 19, + 99, + 81, + 38, +110, + 81, + 17, +103, + 67, + -9, + 21, + -5, +-56, + 73, + 48, + -1, + 74, + 40, + -9, + 36, + -5, +-44, + 48, + 12, +-46, + 53, + 1, +-78, + 55, + 7, +-74, + 76, + 39, +-21, + 83, + 46, +-11, + 86, + 50, + -5, + 91, + 57, + 6, + 94, + 60, + 13, + 96, + 65, + 18, + 99, + 67, + 22, + 88, + 60, + 21, + 68, + 49, + 27, + 89, + 54, + 6, + 83, + 38, +-43, + 85, + 44, +-36, + 84, + 45, +-31, + 81, + 41, +-33, + 79, + 40, +-33, + 75, + 36, +-36, + 69, + 29, +-39, + 43, + 2, +-69, + 63, + 24, +-28, + 66, + 41, +-27, + 74, + 52, +-26, + 85, + 77, + 33, + 69, + 58, + 21, + 29, + 4, +-26, + 36, + -4, +-81, + 36, + -1, +-76, + 45, + 10, +-65, + 67, + 40, +-34, + 74, + 51, +-21, + 74, + 53, +-11, + 49, + 12, +-50, + 26, +-24, +-78, + 64, + 23, +-43, + 63, + 23, +-43, + 58, + 18, +-47, + 47, + 6, +-58, + 40, +-12, +-74, + 47, + -8, +-74, + 12, +-46, +-104, + 42, +-19, +-92, + 23, +-33, +-96, + 38, +-17, +-75, + 41, + -9, +-51, + 93, + 54, + 2, + 36, +-17, +-78, +105, + 92, + 74, +121, +121, +121, +119, +120, +120, +120, +120, +120, +121, +121, +121, +121, +121, +121, +121, +121, +121, +115, +114, +111, +102, + 96, + 88, +109, +105, + 98, +120, +120, +118, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +117, +117, +117, +111, +111, +109, +112, +112, +109, +117, +117, +115, + 37, +-15, +-76, + 26, +-29, +-102, + 50, + 3, +-50, + 55, + 3, +-58, + 21, +-41, +-116, + 25, +-32, +-99, + 48, + -9, +-73, + 40, +-10, +-66, + 42, +-20, +-96, + 30, +-27, +-92, + 56, + 12, +-59, + 65, + 23, +-50, + 67, + 26, +-48, + 51, + 4, +-79, + 64, + 40, + 25, + 60, + 59, + 37, + 66, + 68, + 55, + 75, + 78, + 67, + 88, + 88, + 76, + 91, + 91, + 75, +104, + 76, + 18, +119, + 87, + 10, +109, + 73, +-27, + 37, + 14, +-39, + 79, + 50, + 4, + 78, + 39, +-22, + 37, +-10, +-58, + 47, + 7, +-57, + 54, + 1, +-78, + 55, + 6, +-74, + 78, + 41, +-20, + 82, + 45, +-12, + 87, + 51, + -4, + 91, + 57, + 6, + 94, + 60, + 11, + 96, + 64, + 17, + 98, + 66, + 21, +101, + 70, + 25, + 77, + 55, + 27, + 89, + 54, + 6, + 83, + 38, +-43, + 85, + 44, +-37, + 85, + 45, +-31, + 81, + 41, +-33, + 79, + 40, +-33, + 75, + 36, +-36, + 69, + 29, +-38, + 42, + -2, +-68, + 63, + 18, +-33, + 62, + 35, +-34, + 69, + 42, +-36, + 77, + 67, + 21, + 68, + 57, + 19, + 26, + -9, +-80, + 34, + -6, +-83, + 38, + 1, +-75, + 51, + 16, +-59, + 74, + 49, +-23, + 81, + 59, + -9, + 72, + 47, +-23, + 60, + 27, +-31, + 26, +-23, +-84, + 62, + 21, +-46, + 62, + 22, +-44, + 58, + 18, +-47, + 45, + 4, +-60, + 38, +-19, +-94, + 44, +-17, +-94, + 19, +-45, +-122, + 43, +-17, +-94, + 25, +-33, +-102, + 41, +-20, +-93, + 53, + 5, +-42, + 89, + 48, +-15, + 33, +-21, +-84, +106, + 90, + 63, +121, +121, +122, + 99, + 99, +100, +108, +108, +109, +121, +121, +120, +121, +121, +121, +112, +111, +109, + 78, + 69, + 50, + 74, + 60, + 36, + 71, + 51, + 18, +107, +103, + 95, +103, +103, +101, +112, +112, +110, +114, +114, +113, +121, +121, +120, +120, +120, +120, +121, +121, +121, +119, +119, +118, +106, +108, +101, + 98, +104, + 92, +115, +114, +109, + 32, +-23, +-97, + 27, +-27, +-100, + 47, + -4, +-73, + 56, + -1, +-72, + 21, +-44, +-128, + 21, +-40, +-117, + 48, +-17, +-97, + 41, +-18, +-91, + 41, +-23, +-122, + 29, +-32, +-99, + 56, + 11, +-60, + 64, + 22, +-51, + 66, + 26, +-50, + 48, + 1, +-79, + 61, + 37, + 18, + 55, + 40, +-12, + 62, + 62, + 42, + 71, + 73, + 61, + 84, + 86, + 77, + 90, + 91, + 83, +108, + 76, + 9, +121, + 91, + 15, +113, + 78, +-19, + 41, + 19, +-33, + 79, + 42, +-27, + 84, + 39, +-40, + 51, + 4, +-49, + 47, + -5, +-93, + 54, + 1, +-79, + 56, + 6, +-74, + 81, + 44, +-16, + 86, + 49, + -8, + 89, + 53, + -2, + 92, + 58, + 7, + 95, + 60, + 11, + 98, + 64, + 18, + 99, + 66, + 20, +102, + 70, + 26, + 97, + 69, + 28, + 89, + 54, + 5, + 83, + 38, +-42, + 85, + 44, +-34, + 84, + 44, +-31, + 80, + 41, +-34, + 79, + 40, +-34, + 75, + 35, +-35, + 68, + 28, +-39, + 40, + 1, +-64, + 65, + 16, +-31, + 64, + 34, +-36, + 60, + 31, +-44, + 70, + 59, + 14, + 68, + 55, + 16, + 16, +-26, +-87, + 23, +-22, +-96, + 28, +-15, +-91, + 36, + -2, +-74, + 73, + 39, +-32, + 84, + 49, +-15, + 68, + 35, +-35, + 61, + 23, +-42, + 21, +-28, +-81, + 61, + 20, +-46, + 61, + 21, +-44, + 57, + 17, +-48, + 43, + 2, +-62, + 35, +-22, +-97, + 45, +-15, +-86, + 22, +-41, +-114, + 41, +-19, +-93, + 31, +-25, +-95, + 43, +-17, +-83, + 51, + 9, +-33, + 84, + 43, +-12, + 43, + 5, +-39, +104, + 92, + 68, +104, +103, + 92, + 94, + 94, + 83, + 90, + 91, + 81, + 82, + 84, + 73, + 87, + 88, + 79, + 81, + 77, + 61, + 74, + 62, + 38, + 75, + 61, + 36, + 70, + 46, + 3, + 82, + 69, + 40, + 95, + 96, + 90, + 99, +100, + 94, + 94, + 95, + 89, + 99, +100, + 93, + 98, + 99, + 92, +100, +100, + 94, +102, +102, + 97, +101, +102, + 97, +108, +109, +105, +106, +103, + 96, + 31, +-28, +-97, + 36, +-15, +-79, + 49, + 0, +-62, + 57, + 4, +-59, + 22, +-41, +-116, + 19, +-40, +-114, + 48, +-14, +-85, + 40, +-19, +-84, + 42, +-21, +-112, + 26, +-34, +-103, + 54, + 9, +-61, + 64, + 21, +-52, + 66, + 26, +-50, + 46, + -4, +-78, + 59, + 34, + 10, + 63, + 48, + -8, + 73, + 73, + 53, + 82, + 84, + 71, + 85, + 87, + 76, + 91, + 92, + 80, +106, + 86, + 45, +120, + 98, + 43, +116, + 88, + 26, + 42, + 20, +-31, + 81, + 43, +-23, + 89, + 53, + -9, + 46, + 8, +-32, + 45, +-18, +-110, + 54, + 0, +-80, + 55, + 5, +-76, + 83, + 47, +-14, + 89, + 52, + -5, + 92, + 55, + 1, + 94, + 59, + 9, + 96, + 62, + 12, +100, + 65, + 18, +101, + 66, + 20, +102, + 70, + 25, +103, + 73, + 28, + 89, + 54, + 3, + 83, + 38, +-42, + 85, + 43, +-35, + 84, + 45, +-31, + 81, + 41, +-33, + 78, + 39, +-34, + 74, + 34, +-35, + 67, + 27, +-40, + 44, + 6, +-66, + 61, + 14, +-40, + 66, + 43, +-26, + 70, + 51, +-15, + 74, + 65, + 18, + 62, + 53, + 13, + 38, + 24, + -2, + 88, + 77, + 34, + 59, + 41, + -6, + 19, + 10, +-19, +-12, +-17, +-43, + 45, + 40, + 14, + 16, + -5, +-37, + 18, +-27, +-77, + 23, +-26, +-83, + 60, + 19, +-48, + 60, + 20, +-45, + 56, + 16, +-49, + 43, + 1, +-63, + 35, +-18, +-84, + 48, + -5, +-60, + 21, +-37, +-96, + 53, + -5, +-73, + 36, +-17, +-81, + 41, +-11, +-65, + 51, + 14, +-16, + 80, + 45, + 4, + 52, + 20, +-14, +105, +100, + 90, +121, +121, +120, + 91, + 90, + 92, +101, +100, +102, + 75, + 78, + 80, + 82, + 83, + 83, + 81, + 73, + 53, + 74, + 60, + 33, + 80, + 64, + 39, + 69, + 45, + -2, + 71, + 47, + 0, + 83, + 82, + 71, +115, +115, +114, +115, +115, +114, +120, +120, +118, +116, +116, +115, +121, +121, +121, +120, +120, +120, +107, +108, +105, + 96, + 99, + 91, + 97, + 94, + 85, + 31, +-24, +-91, + 42, + -4, +-63, + 52, + 8, +-46, + 57, + 13, +-37, + 24, +-34, +-98, + 21, +-36, +-104, + 53, + 2, +-54, + 41, +-10, +-65, + 43, +-14, +-88, + 23, +-33, +-102, + 54, + 9, +-63, + 63, + 21, +-52, + 66, + 26, +-50, + 47, + -5, +-76, + 60, + 34, + 12, + 66, + 51, + 0, + 76, + 79, + 62, + 82, + 84, + 71, + 85, + 86, + 77, + 91, + 89, + 73, +111, + 86, + 37, +121, + 95, + 30, +119, + 90, + 17, + 42, + 20, +-32, + 82, + 44, +-15, + 89, + 66, + 24, + 35, + 5, +-23, + 36, +-28, +-112, + 52, + 0, +-80, + 53, + 5, +-76, + 75, + 27, +-40, + 82, + 34, +-31, + 86, + 39, +-23, + 84, + 38, +-19, + 81, + 37, +-18, + 84, + 40, +-17, + 91, + 43, +-16, + 90, + 40, +-17, + 96, + 51, + -6, + 76, + 31, +-38, + 83, + 38, +-42, + 85, + 44, +-34, + 84, + 44, +-31, + 81, + 41, +-33, + 78, + 39, +-34, + 74, + 34, +-35, + 67, + 27, +-39, + 42, + 0, +-67, + 51, + 4, +-48, + 48, + 29, +-30, + 67, + 55, + 1, + 73, + 65, + 22, + 54, + 45, + 6, + 8, +-16, +-50, + -9, +-38, +-88, + 16, + -8, +-117, + -7, +-13, +-115, +-39, +-62, +-116, + 76, + 70, + 35, + 8, + -4, +-35, + 11, +-39, +-109, + 25, +-24, +-87, + 59, + 18, +-48, + 59, + 19, +-46, + 55, + 15, +-49, + 41, + 0, +-62, + 37, +-18, +-79, + 49, + -3, +-60, + 18, +-39, +-100, + 63, + 5, +-66, + 39, +-13, +-74, + 33, +-18, +-71, + 62, + 24, + -8, + 77, + 40, + -3, + 45, + 9, +-27, +105, +100, + 87, +122, +122, +121, +102, +101, +103, +107, +107, +108, +106, +107, +107, + 84, + 81, + 72, + 81, + 72, + 51, + 79, + 67, + 39, + 81, + 67, + 39, + 74, + 50, + 4, + 75, + 50, + 0, + 90, + 82, + 56, +120, +120, +120, +121, +121, +121, +120, +120, +118, +113, +113, +111, +121, +121, +121, +121, +121, +121, +117, +116, +114, +101, +103, + 95, +101, + 96, + 86, + 34, +-21, +-90, + 41, + -8, +-69, + 54, + 9, +-48, + 59, + 15, +-39, + 25, +-34, +-100, + 20, +-37, +-107, + 55, + 6, +-51, + 40, +-11, +-69, + 45, +-14, +-88, + 23, +-37, +-108, + 52, + 7, +-65, + 62, + 20, +-55, + 65, + 25, +-51, + 43, +-11, +-78, + 55, + 31, + 10, + 67, + 58, + 11, + 82, + 84, + 71, + 91, + 93, + 83, + 92, + 93, + 85, + 96, + 89, + 70, +113, + 77, + 8, +119, + 88, + -3, +120, + 85, +-10, + 44, + 21, +-28, + 81, + 33, +-48, + 91, + 61, + 8, + 41, + 9, +-27, + 44, +-20, +-104, + 51, + -2, +-81, + 52, + 3, +-77, + 24, + -1, +-28, + 15, +-26, +-86, + 16, +-19, +-78, + 25, + 1, +-54, + 14, +-29, +-88, + 15, +-17, +-48, + 42, + 11, +-15, + 49, + 20, + -8, + 68, + 44, + 17, + 90, + 53, + 1, + 83, + 37, +-43, + 85, + 43, +-34, + 84, + 44, +-31, + 79, + 40, +-34, + 78, + 39, +-34, + 74, + 34, +-34, + 68, + 27, +-39, + 40, + 0, +-68, + 44, + -7, +-60, + 40, + 23, +-33, + 63, + 51, + -3, + 73, + 66, + 23, + 53, + 44, + 9, + 30, + 20, +-10, + 30, + 27, +-11, + 53, + 35, +-119, + -7, +-13, +-97, + 41, + 34, +-87, + 70, + 55, + 5, + 25, + 5, +-35, + 36, + 8, +-97, + 26, +-23, +-81, + 58, + 17, +-49, + 58, + 18, +-47, + 54, + 14, +-51, + 39, + -3, +-67, + 43, +-19, +-94, + 46, +-10, +-88, + 19, +-43, +-111, + 60, + -2, +-91, + 40, +-17, +-88, + 23, +-37, +-100, + 63, + 17, +-36, + 77, + 30, +-38, + 46, + 0, +-56, +109, + 96, + 70, +121, +121, +121, +121, +121, +121, +121, +121, +121, +113, +112, +110, + 84, + 79, + 64, + 83, + 74, + 49, + 84, + 73, + 44, + 84, + 72, + 44, + 81, + 59, + 13, + 79, + 57, + 6, + 77, + 61, + 19, +113, +113, +108, +121, +121, +121, +121, +121, +121, +114, +114, +113, +121, +121, +121, +121, +121, +121, +114, +114, +111, + 92, + 96, + 81, +101, + 96, + 89, + 32, +-25, +-104, + 44, +-10, +-84, + 60, + 9, +-64, + 62, + 9, +-62, + 22, +-42, +-128, + 17, +-42, +-127, + 57, + -2, +-81, + 40, +-22, +-97, + 42, +-22, +-128, + 19, +-45, +-123, + 51, + 6, +-66, + 63, + 18, +-56, + 65, + 24, +-52, + 29, +-18, +-82, + 54, + 32, + 11, + 65, + 52, + 10, + 76, + 78, + 67, + 86, + 87, + 79, + 87, + 89, + 83, + 97, + 90, + 72, +110, + 83, + 33, +120, + 91, + 18, +119, + 88, + 11, + 45, + 21, +-26, + 87, + 39, +-44, + 93, + 50, +-27, + 55, + 16, +-27, + 38, +-20, +-100, + 52, + -2, +-82, + 52, + 3, +-79, +-88, +-120, +-124, +-58, +-86, +-113, +-38, +-64, +-82, +-44, +-72, +-94, +-16, +-41, +-117, + -9, +-18, +-33, + 38, + 24, + 9, + 44, + 31, + 14, + 67, + 49, + 26, + 86, + 52, + 1, + 82, + 37, +-44, + 84, + 43, +-36, + 83, + 43, +-32, + 80, + 40, +-34, + 77, + 38, +-35, + 74, + 34, +-33, + 68, + 27, +-39, + 41, + -4, +-69, + 3, +-47, +-92, + 19, +-17, +-62, + 18, +-21, +-73, + 16, +-11, +-40, + -5, +-41, +-68, + -6, +-43, +-79, +-19, +-53, +-95, +-33, +-87, +-121, +-34, +-88, +-126, +-34, +-89, +-123, +-36, +-91, +-123, +-32, +-83, +-117, +-17, +-66, +-107, + 18, +-30, +-81, + 57, + 16, +-50, + 57, + 17, +-48, + 53, + 13, +-52, + 35, + -7, +-70, + 47, +-15, +-95, + 47, +-12, +-90, + 27, +-35, +-107, + 63, + 1, +-84, + 43, +-16, +-91, + 20, +-41, +-114, + 63, + 18, +-32, + 75, + 29, +-37, + 52, + 6, +-51, +108, + 96, + 70, +122, +122, +122, +121, +121, +121, +121, +121, +121, +108, +107, +105, + 99, + 97, + 91, + 96, + 91, + 81, + 99, + 93, + 80, + 84, + 70, + 49, + 91, + 78, + 58, + 92, + 79, + 56, + 89, + 76, + 55, +109, +107, + 99, +118, +118, +115, +120, +120, +118, +115, +115, +114, +121, +121, +121, +121, +121, +121, +115, +115, +113, + 98, + 98, + 95, +105, + 99, + 92, + 42, +-16, +-97, + 48, + -2, +-76, + 60, + 9, +-65, + 65, + 10, +-61, + 22, +-42, +-128, + 18, +-42, +-126, + 59, + 2, +-79, + 40, +-22, +-98, + 41, +-22, +-128, + 19, +-48, +-128, + 50, + 5, +-69, + 62, + 17, +-56, + 66, + 24, +-52, + 39, +-11, +-82, + 16, +-31, +-72, + 19, +-16, +-59, + 23, +-11, +-37, + 13, +-14, +-30, + 14, +-10, +-21, + 17, + -6, +-21, + 24, + -9, +-48, + 31, + -2, +-46, + 30, + -5, +-59, + 2, +-37, +-72, + 14, +-34, +-86, + 12, +-30, +-70, + -5, +-50, +-79, + 24, +-34, +-111, + 51, + -3, +-82, + 51, + 2, +-78, +-85, +-116, +-121, +-68, +-104, +-122, +-51, +-80, +-92, +-63, +-94, +-113, +-29, +-31, +-112, + 44, + 24, +-73, + 59, + 44, +-33, + 64, + 44, + -4, + 78, + 59, + 15, + 87, + 52, + -1, + 83, + 37, +-45, + 84, + 43, +-39, + 83, + 43, +-33, + 79, + 39, +-36, + 77, + 38, +-35, + 75, + 35, +-34, + 70, + 31, +-36, + 57, + 17, +-48, + 31, + -8, +-64, + 31, +-10, +-64, + 31, +-10, +-65, + 30, +-10, +-65, + 29, +-11, +-64, + 29, +-11, +-66, + 28, +-13, +-66, + 27, +-15, +-67, + 26, +-16, +-68, + 24, +-18, +-70, + 22, +-20, +-72, + 21, +-21, +-76, + 19, +-24, +-78, + 36, + -6, +-62, + 57, + 16, +-48, + 56, + 16, +-49, + 51, + 10, +-54, + 33, + -9, +-69, + 44, +-13, +-86, + 46, + -8, +-72, + 40, +-15, +-83, + 66, + 12, +-55, + 41, + -9, +-72, + 21, +-37, +-96, + 66, + 35, + 8, + 76, + 41, + -5, + 56, + 11, +-31, +107, +101, + 87, +121, +121, +121, +114, +114, +113, +118, +118, +118, +120, +120, +120, +113, +113, +112, +121, +121, +121, +116, +113, +111, + 48, + 18, +-15, + 93, + 86, + 79, +119, +118, +118, +121, +121, +121, +115, +116, +106, +120, +120, +120, +119, +120, +116, +114, +115, +112, +121, +121, +121, +121, +121, +121, +118, +118, +116, + 96, + 97, + 95, +103, + 98, + 92, + 48, + -2, +-74, + 50, + 9, +-48, + 62, + 17, +-42, + 63, + 17, +-40, + 24, +-36, +-118, + 17, +-37, +-111, + 62, + 12, +-53, + 41, +-14, +-74, + 41, +-19, +-99, + 20, +-43, +-119, + 48, + 2, +-71, + 61, + 16, +-57, + 65, + 23, +-52, + 51, + 9, +-64, + 44, + -8, +-82, + 49, + -6, +-83, + 45, +-10, +-84, + 48, +-10, +-86, + 42, +-16, +-93, + 40, +-19, +-95, + 36, +-24, +-97, + 37, +-21, +-100, + 33, +-26, +-105, + 31, +-28, +-105, + 26, +-31, +-108, + 19, +-35, +-108, + 19, +-33, +-106, + 34, +-17, +-90, + 52, + 2, +-77, + 53, + 5, +-76, +-69, +-107, +-123, +-55, +-100, +-125, +-15, +-61, +-94, + 17, +-23, +-109, + 13, + -1, +-111, +-43, +-48, +-123, + 49, + 28, +-57, + 81, + 38, +-126, + 83, + 56, +-52, + 90, + 51, +-21, + 82, + 36, +-46, + 84, + 43, +-39, + 81, + 41, +-35, + 78, + 38, +-37, + 76, + 37, +-37, + 75, + 36, +-33, + 72, + 34, +-33, + 70, + 30, +-37, + 67, + 27, +-40, + 64, + 26, +-40, + 64, + 27, +-39, + 63, + 26, +-39, + 65, + 27, +-38, + 65, + 26, +-39, + 62, + 23, +-40, + 61, + 21, +-42, + 57, + 19, +-45, + 57, + 17, +-48, + 55, + 14, +-45, + 54, + 13, +-46, + 53, + 13, +-49, + 54, + 14, +-49, + 55, + 15, +-48, + 53, + 12, +-50, + 49, + 9, +-55, + 36, + -8, +-70, + 49, + -8, +-77, + 49, + -4, +-65, + 37, +-20, +-86, + 71, + 20, +-49, + 47, + -3, +-66, + 22, +-35, +-92, + 71, + 39, + 12, + 77, + 40, + -6, + 55, + 11, +-28, +107, +101, + 87, +121, +121, +121, +109, +110, +107, +120, +120, +120, +120, +120, +120, +115, +115, +113, +120, +119, +119, + 89, + 80, + 72, + 27, + -8, +-40, + 54, + 33, + 12, +114, +113, +112, +121, +121, +121, +121, +121, +121, +111, +110, +105, + 85, + 84, + 65, + 86, + 83, + 67, +100, +100, + 96, +112, +111, +109, +120, +121, +120, +105, +106, +103, +103, + 98, + 92, + 49, + -2, +-71, + 56, + 14, +-47, + 57, + 14, +-41, + 62, + 22, +-30, + 28, +-33, +-107, + 17, +-37, +-103, + 63, + 18, +-39, + 40, +-11, +-60, + 42, +-14, +-88, + 21, +-39, +-109, + 45, + -2, +-74, + 59, + 14, +-59, + 65, + 23, +-53, + 67, + 27, +-51, + 68, + 27, +-53, + 68, + 26, +-53, + 69, + 25, +-52, + 68, + 21, +-53, + 60, + 12, +-60, + 59, + 11, +-62, + 57, + 9, +-65, + 55, + 6, +-67, + 52, + 3, +-72, + 52, + 1, +-73, + 53, + 0, +-75, + 50, + 0, +-74, + 49, + 0, +-75, + 52, + 3, +-72, + 52, + 3, +-72, + 53, + 5, +-76, +-44, +-87, +-115, +-12, +-63, +-107, + 16, +-32, +-76, + 3, +-42, +-104, +-25, +-20, +-121, +-32, +-22, +-109, + 14, + 9, +-27, + 11, +-19, +-64, + 72, + 31, +-126, +102, + 72, +-79, + 80, + 34, +-49, + 83, + 40, +-41, + 81, + 41, +-38, + 77, + 37, +-38, + 75, + 36, +-37, + 75, + 35, +-34, + 73, + 33, +-34, + 71, + 32, +-35, + 68, + 31, +-36, + 67, + 31, +-37, + 66, + 30, +-35, + 66, + 30, +-35, + 65, + 29, +-36, + 65, + 29, +-36, + 63, + 26, +-39, + 61, + 25, +-40, + 60, + 23, +-42, + 59, + 19, +-43, + 57, + 17, +-43, + 55, + 15, +-44, + 55, + 14, +-47, + 54, + 13, +-49, + 52, + 11, +-48, + 50, + 9, +-53, + 47, + 6, +-57, + 33, +-14, +-79, + 54, + -6, +-81, + 48, +-12, +-78, + 42, +-19, +-93, + 72, + 15, +-66, + 58, + 4, +-69, + 26, +-38, +-106, + 78, + 37, +-11, + 79, + 32, +-35, + 66, + 14, +-41, +109, + 97, + 74, +119, +119, +117, +118, +118, +116, +118, +118, +115, +119, +118, +116, +112, +110, +105, + 86, + 73, + 59, + 15, +-17, +-52, + 41, + 5, +-32, + 21, +-20, +-67, + 44, + 21, +-11, +111, +112, +107, +112, +113, +110, + 97, + 97, + 82, + 76, + 73, + 52, + 54, + 49, + 19, + 75, + 68, + 42, + 70, + 58, + 24, + 14, + 15, +-10, + 70, + 72, + 65, +105, + 99, + 91, + 53, + -3, +-84, + 58, + 8, +-63, + 54, + 5, +-58, + 62, + 15, +-46, + 27, +-34, +-107, + 15, +-42, +-115, + 63, + 15, +-51, + 38, +-16, +-71, + 39, +-22, +-105, + 22, +-41, +-118, + 41, + -8, +-75, + 57, + 13, +-61, + 65, + 22, +-54, + 68, + 29, +-51, + 72, + 33, +-49, + 72, + 32, +-50, + 73, + 29, +-50, + 70, + 26, +-51, + 66, + 19, +-56, + 64, + 17, +-60, + 62, + 14, +-63, + 60, + 11, +-63, + 60, + 8, +-69, + 60, + 6, +-73, + 59, + 5, +-74, + 57, + 4, +-75, + 55, + 5, +-71, + 54, + 5, +-70, + 52, + 3, +-72, + 51, + 3, +-77, +-62, +-96, +-120, +-28, +-61, +-87, + 12, +-19, +-44, + 14, +-14, +-55, +-33, +-41, +-97, + 41, + 5, +-124, + 9, + -2, +-43, +-31, +-15, +-106, + 17, + 12, +-74, + 72, + 47, +-85, + 64, + 29, +-52, + 83, + 38, +-42, + 79, + 39, +-38, + 76, + 36, +-39, + 75, + 35, +-38, + 74, + 34, +-35, + 72, + 32, +-35, + 71, + 31, +-36, + 68, + 31, +-37, + 66, + 30, +-38, + 66, + 29, +-37, + 65, + 28, +-37, + 63, + 24, +-41, + 61, + 23, +-42, + 59, + 21, +-44, + 56, + 17, +-44, + 43, + 9, +-39, + 33, + -4, +-55, + 30, + -8, +-59, + 32, + -7, +-57, + 30, +-10, +-61, + 22, +-18, +-68, + 19, +-23, +-73, + 14, +-28, +-79, + 12, +-30, +-83, + 8, +-39, +-93, + 15, +-34, +-93, + 25, +-32, +-96, + 46, +-17, +-99, + 69, + 6, +-81, + 64, + 8, +-75, + 28, +-42, +-124, + 79, + 37, +-16, + 79, + 32, +-45, + 72, + 23, +-39, +112, + 98, + 74, +121, +121, +121, +122, +122, +122, +121, +121, +121, +121, +121, +121, +118, +118, +116, +113, +110, +105, + 94, + 84, + 70, + 31, + -7, +-46, + 63, + 45, + 24, + 97, + 93, + 87, +120, +120, +119, +101, +101, + 91, + 79, + 79, + 65, + 30, + 29, + 0, + 68, + 63, + 40, + 74, + 63, + 26, + 61, + 37, +-15, + 37, + 20, +-21, + 43, + 30, +-12, + 82, + 65, + 36, + 52, + -4, +-97, + 54, + 4, +-70, + 52, + -1, +-72, + 62, + 10, +-62, + 27, +-37, +-113, + 12, +-46, +-122, + 62, + 8, +-69, + 35, +-22, +-93, + 35, +-28, +-128, + 8, +-52, +-126, + 18, +-29, +-88, + 35, + -9, +-68, + 44, + 2, +-62, + 49, + 10, +-58, + 50, + 12, +-58, + 49, + 9, +-60, + 50, + 7, +-61, + 47, + 4, +-62, + 44, + -1, +-64, + 40, + -5, +-70, + 46, + 0, +-70, + 60, + 11, +-67, + 59, + 9, +-70, + 60, + 6, +-73, + 58, + 4, +-73, + 57, + 3, +-73, + 53, + 4, +-71, + 52, + 3, +-71, + 50, + 1, +-74, + 50, + 1, +-75, + 46, + -1, +-77, + 74, + 36, +-22, + 90, + 55, + -8, + 95, + 68, + 25, +-42, +-57, +-86, + 27, +-23, +-126, +-22, +-40, +-125, +-17, +-31, +-113, + 32, + -5, +-123, +-35, +-40, +-117, + 56, + 24, +-76, + 83, + 39, +-45, + 79, + 37, +-41, + 74, + 34, +-42, + 74, + 33, +-40, + 72, + 31, +-37, + 70, + 30, +-37, + 70, + 30, +-37, + 67, + 28, +-39, + 66, + 27, +-40, + 64, + 27, +-39, + 63, + 25, +-40, + 55, + 15, +-50, + 50, + 10, +-54, + 49, + 8, +-53, + 46, + 4, +-54, + 22, +-12, +-43, +-26, +-67, +-101, +-18, +-61, +-103, +-25, +-69, +-112, +-26, +-73, +-119, +-24, +-71, +-116, +-18, +-66, +-114, +-20, +-67, +-110, +-24, +-68, +-112, +-19, +-63, +-104, +-34, +-80, +-118, + 12, +-47, +-106, + 49, + -9, +-84, + 69, + 9, +-69, + 73, + 22, +-54, + 28, +-41, +-115, + 84, + 50, + 13, + 82, + 41, +-20, + 75, + 27, +-29, +113, +105, + 89, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +119, +119, +118, +121, +121, +121, +113, +111, +105, + 32, + -7, +-51, + 81, + 70, + 55, +113, +113, +112, +118, +118, +117, + 89, + 87, + 71, + 71, + 67, + 48, + 86, + 84, + 58, + 74, + 66, + 39, + 65, + 47, + 8, + 46, + 19, +-33, + 65, + 39, +-20, + 57, + 28, +-33, + 76, + 54, + 13, + 58, + 1, +-78, + 53, + 11, +-48, + 52, + 2, +-63, + 62, + 11, +-54, + 30, +-31, +-99, + 11, +-46, +-121, + 61, + 8, +-63, + 31, +-25, +-89, + 32, +-31, +-126, + -4, +-58, +-123, +-30, +-81, +-125, +-11, +-56, +-91, +-25, +-77, +-122, +-23, +-74, +-119, +-17, +-70, +-111, +-17, +-68, +-113, +-20, +-73, +-119, +-13, +-61, +-103, + 3, +-44, +-80, + 1, +-48, +-87, + 30, +-16, +-79, + 58, + 9, +-68, + 59, + 6, +-69, + 58, + 3, +-72, + 57, + 2, +-73, + 55, + 2, +-73, + 51, + 2, +-73, + 50, + 1, +-74, + 48, + -1, +-76, + 47, + -2, +-77, + 45, + 5, +-60, + 74, + 35, +-33, + 95, + 62, + 15, +104, + 88, + 63, +-29, +-34, +-71, + 42, +-10, +-126, + 44, + 11, +-122, + 17, +-29, +-127, + 25, + 5, +-33, + 65, + 20, +-55, + 83, + 37, +-101, + 84, + 40, +-50, + 80, + 36, +-42, + 75, + 33, +-43, + 72, + 31, +-42, + 70, + 29, +-41, + 68, + 28, +-39, + 67, + 27, +-40, + 65, + 25, +-42, + 64, + 24, +-42, + 62, + 22, +-43, + 61, + 21, +-44, + 48, + 8, +-56, + 42, + 2, +-59, + 42, + 0, +-59, + 38, + -4, +-60, + 13, +-21, +-52, + 13, + -6, +-16, + 55, + 39, + 30, + 51, + 27, + 11, + 52, + 27, + 11, + 51, + 22, + 4, + 56, + 32, + 15, + 63, + 39, + 24, + 71, + 45, + 28, + 57, + 18, +-23, + 18, +-16, +-44, + 7, +-47, +-99, + 51, + -6, +-70, + 70, + 12, +-61, + 73, + 24, +-43, + 38, +-19, +-78, + 65, + 26, + -9, + 56, + 16, +-30, + 49, + 11, +-35, + 44, + 8, +-42, + 54, + 33, +-16, + 80, + 59, + 22, + 97, + 85, + 63, +114, +109, +102, +119, +119, +118, +117, +116, +114, +101, + 89, + 74, + 63, + 37, + 8, + 74, + 53, + 22, +109, +109, +108, +116, +115, +116, + 83, + 83, + 70, + 58, + 50, + 21, + 85, + 83, + 62, + 78, + 68, + 40, + 58, + 34, +-18, + 46, + 16, +-37, + 57, + 27, +-30, + 63, + 35, +-23, + 81, + 66, + 43, + 60, + 6, +-65, + 48, + 9, +-38, + 49, + 4, +-50, + 60, + 15, +-35, + 31, +-24, +-83, + 9, +-45, +-108, + 58, + 13, +-41, + 28, +-21, +-68, + 29, +-31, +-118, + -9, +-59, +-117, + 4, +-30, +-51, + 25, +-15, +-51, + 24, +-17, +-58, + 28, +-14, +-53, + 33, +-10, +-47, + 37, + -4, +-37, + 39, + 0, +-32, + 47, + 13, +-17, + 54, + 25, + -5, +-18, +-64, +-98, + 34, +-14, +-80, + 55, + 6, +-69, + 54, + 4, +-71, + 55, + 1, +-72, + 53, + -1, +-74, + 50, + 0, +-74, + 49, + 0, +-75, + 48, + -1, +-76, + 46, + -3, +-77, + 45, + -4, +-78, + 39, + 1, +-57, + 64, + 30, +-25, + 95, + 67, + 20, + 99, + 74, + 28, + -6, +-11, +-46, + 0, +-37, +-121, + 4, +-24, +-121, + 15, + 11, +-29, + 65, + 36, + 6, + 83, + 41, +-21, + 77, + 30, +-54, + 82, + 36, +-48, + 78, + 34, +-44, + 73, + 30, +-45, + 69, + 29, +-46, + 68, + 27, +-41, + 67, + 27, +-40, + 65, + 25, +-42, + 63, + 23, +-44, + 62, + 22, +-44, + 59, + 19, +-46, + 57, + 17, +-48, + 45, + 5, +-58, + 40, + -1, +-61, + 38, + -3, +-62, + 36, + -8, +-61, + 9, +-28, +-60, + 61, + 54, + 51, +103, + 98, + 92, + 87, + 72, + 59, + 89, + 73, + 62, + 89, + 70, + 56, + 90, + 68, + 51, + 87, + 57, + 30, + 81, + 41, + -3, + 84, + 42, +-10, + 55, + 32, + 12, + 12, +-44, +-95, + 48, +-11, +-83, + 58, + -1, +-73, + 68, + 20, +-34, + 61, + 18, +-20, + 72, + 40, + 14, + 81, + 48, + 9, + 80, + 52, + 13, + 83, + 59, + 24, + 80, + 61, + 29, + 67, + 50, + 23, + 54, + 26, +-20, + 62, + 25, +-36, + 85, + 70, + 53, + 95, + 92, + 87, + 58, + 38, + 21, + 33, +-10, +-46, + 59, + 42, + 29, +106, +105, +103, +121, +121, +121, + 86, + 79, + 68, + 53, + 36, + 7, + 55, + 39, + 6, + 47, + 28, + -5, + 41, + 19, +-24, + 43, + 27, + 4, + 34, + 4, +-45, + 56, + 33, +-13, + 74, + 53, + 19, + 60, + 5, +-71, + 57, + 17, +-34, + 47, + 0, +-55, + 62, + 17, +-36, + 29, +-26, +-87, + 6, +-48, +-107, + 58, + 17, +-38, + 25, +-24, +-72, + 29, +-29, +-114, + -7, +-56, +-114, + 43, + 26, + 16, + 51, + 7, +-38, + 56, + 11, +-34, + 60, + 18, +-28, + 68, + 26, +-18, + 80, + 40, + 1, + 89, + 54, + 21, + 90, + 59, + 25, + 95, + 61, + 13, +-16, +-59, +-96, + 34, +-14, +-79, + 52, + 3, +-71, + 50, + 1, +-74, + 48, + -1, +-75, + 47, + -2, +-76, + 47, + -2, +-76, + 47, + -2, +-76, + 46, + -3, +-77, + 43, + -5, +-79, + 42, + -7, +-81, + 17, + 1, +-18, + 28, + 31, + 35, + 81, + 64, + 34, + 96, + 73, + 31, + 1, + -6, +-48, +-66, +-51, +-122, +-85, +-68, +-100, +-14, +-14, +-35, + -8, +-39, +-79, + 65, + 10, +-109, + 78, + 31, +-58, + 81, + 34, +-50, + 76, + 32, +-46, + 73, + 28, +-47, + 68, + 26, +-46, + 67, + 25, +-43, + 66, + 24, +-42, + 64, + 23, +-43, + 62, + 22, +-44, + 60, + 20, +-45, + 57, + 16, +-49, + 55, + 15, +-50, + 42, + 1, +-58, + 38, + -3, +-63, + 36, + -6, +-62, + 33, +-10, +-64, + 14, +-25, +-60, + 57, + 51, + 49, +105, + 98, + 92, + 88, + 74, + 62, + 86, + 65, + 47, + 84, + 56, + 33, + 80, + 44, + 7, + 78, + 34, +-13, + 78, + 35, +-19, + 87, + 46, + -9, + 58, + 33, + 11, + 47, + 7, +-43, + 52, + 14, +-34, + 32, + 3, +-52, + 23, +-30, +-67, + 83, + 17, + -9, + 87, + 48, + 7, + 86, + 58, + 14, + 60, + 43, + 0, + 61, + 45, + 4, + 56, + 47, + 12, + 59, + 51, + 19, + 39, + 36, +-12, + 9, + 18, +-28, + 56, + 43, + 10, + 39, + 16, +-25, + 46, + 13, +-36, + 34, + -7, +-54, + 8, + -5, +-17, + 48, + 44, + 41, + 59, + 55, + 50, +121, +121, +120, +121, +121, +120, + 97, + 90, + 81, + 13, + 3, +-17, + 59, + 55, + 47, + 46, + 46, + 39, + 94, + 89, + 84, +103, + 93, + 82, +108, + 88, + 64, + 58, + 0, +-79, + 56, + 9, +-49, + 45, + -8, +-79, + 57, + 5, +-64, + 26, +-35, +-105, + 3, +-56, +-126, + 58, + 5, +-70, + 20, +-35, +-95, + 26, +-36, +-128, +-10, +-60, +-113, + 48, + 39, + 36, + 48, + 6, +-37, + 52, + 7, +-39, + 56, + 10, +-35, + 65, + 22, +-23, + 81, + 41, + 2, + 88, + 53, + 18, + 90, + 55, + 18, + 93, + 59, + 6, +-23, +-61, +-91, + 30, +-17, +-81, + 47, + -2, +-73, + 46, + -3, +-75, + 46, + -3, +-77, + 45, + -4, +-78, + 45, + -4, +-78, + 45, + -4, +-78, + 42, + -7, +-81, + 41, + -8, +-82, + 40, + -9, +-83, + 6, + 10, + 6, + 22, + 28, + 28, + 62, + 48, + 27, + 93, + 68, + 22, + 16, + 8, +-37, +-88, +-71, +-111, +-78, +-57, +-79, +-62, +-51, +-73, + 8, + -6, +-37, + 80, + 40, +-14, + 75, + 26, +-57, + 78, + 31, +-52, + 76, + 29, +-48, + 70, + 25, +-50, + 68, + 23, +-48, + 65, + 23, +-45, + 63, + 21, +-45, + 62, + 21, +-45, + 60, + 19, +-46, + 58, + 17, +-48, + 53, + 12, +-52, + 50, + 9, +-55, + 39, + -2, +-62, + 35, + -6, +-66, + 32, + -9, +-68, + 30, +-13, +-68, + 14, +-27, +-61, + 57, + 51, + 48, +105, + 97, + 92, + 90, + 72, + 57, + 85, + 59, + 36, + 81, + 48, + 16, + 76, + 36, +-10, + 74, + 29, +-22, + 76, + 31, +-24, + 85, + 43, +-12, + 82, + 51, + 21, + 0, +-34, +-77, + 57, + 2, +-57, + 25, +-11, +-76, + 14, + 10, +-36, + 92, + 60, + 15, + 76, + 48, + 0, + 58, + 38, +-14, + 16, + 12, +-37, + 19, + 13, +-30, + 40, + 30, +-14, + 34, + 28, +-13, +-24, +-15, +-66, +-35, + -9, +-52, +-44, + -7, +-38, + 12, + 25, + -1, +-45, + -6, +-41, + 48, + 14, +-37, +-25, +-24, +-48, +-36, +-28, +-48, +-27, +-24, +-44, + 83, + 80, + 76, +121, +120, +119, +112, +111, +110, + 84, + 84, + 83, +119, +119, +119, +111, +110, +109, +114, +113, +112, +120, +120, +119, +103, + 93, + 80, + 65, + 37, + 16, + 64, + 22, +-20, + 41, +-10, +-80, + 53, + 3, +-61, + 24, +-36, +-101, + -2, +-57, +-128, + 56, + 4, +-68, + 17, +-36, +-99, + 23, +-40, +-128, +-19, +-69, +-124, + 53, + 46, + 46, + 46, + 3, +-38, + 50, + 5, +-40, + 56, + 10, +-36, + 66, + 23, +-23, + 81, + 41, + 0, + 88, + 51, + 16, + 88, + 51, + 8, + 97, + 63, + 8, +-25, +-67, +-97, + 28, +-19, +-85, + 44, + -5, +-76, + 43, + -7, +-77, + 42, + -7, +-80, + 44, + -9, +-82, + 42, + -8, +-81, + 42, + -8, +-80, + 40, + -9, +-83, + 38, +-11, +-85, + 38, +-11, +-86, + 21, + 23, + 16, + 39, + 40, + 34, + 46, + 51, + 42, + 68, + 46, + 1, + 24, + 15, +-28, +-40, +-30, +-45, +-61, +-45, +-55, +-14, + -3, +-10, +-29, +-25, +-65, + 78, + 37, +-18, + 72, + 23, +-58, + 76, + 29, +-53, + 75, + 28, +-49, + 69, + 23, +-51, + 66, + 21, +-51, + 64, + 20, +-47, + 61, + 19, +-47, + 60, + 18, +-48, + 58, + 16, +-48, + 54, + 12, +-52, + 49, + 7, +-56, + 46, + 4, +-57, + 37, + -6, +-65, + 33, +-10, +-69, + 31, +-12, +-71, + 27, +-16, +-72, + 7, +-33, +-68, + 58, + 49, + 44, +107, +100, + 94, + 92, + 72, + 56, + 83, + 52, + 24, + 79, + 41, + 3, + 72, + 28, +-19, + 68, + 22, +-31, + 72, + 24, +-29, + 80, + 36, +-21, + 68, + 38, + 0, + 55, + 48, + 25, +105, + 59, +-37, + 66, + 11, +-108, + 43, + 27, +-21, + 88, + 57, + 9, + -2, + -3, +-58, +-12, +-11, +-70, + 17, + 12, +-47, + 22, + 16, +-29, + 37, + 28, +-14, + 48, + 36, + -7, + 39, + 29, +-21, +-39, +-24, +-79, + -4, + 2, +-51, +-23, + -5, +-52, + 25, + 36, + -7, + 39, + 8, +-40, +-38, +-70, +-93, +-49, +-85, +-116, +-43, +-77, +-108, + 7, + -5, +-13, + 51, + 42, + 37, + 42, + 32, + 26, + 33, + 21, + 19, + 29, + 18, + 13, + 17, + 4, + -2, + 18, + 1, + -6, + 18, + 2, + -4, +-16, +-43, +-53, +-21, +-68, +-103, + 66, + 34, + 8, + 36, + -8, +-59, + 53, + 11, +-35, + 24, +-29, +-83, + -5, +-59, +-123, + 54, + 10, +-41, + 17, +-32, +-81, + 22, +-38, +-118, +-31, +-73, +-106, + 66, + 59, + 59, + 43, + -1, +-42, + 50, + 5, +-41, + 55, + 10, +-39, + 67, + 24, +-22, + 80, + 39, + -3, + 87, + 48, + 8, + 87, + 49, + 3, +102, + 69, + 15, +-23, +-66, +-97, + 24, +-24, +-88, + 41, + -9, +-80, + 40, + -9, +-82, + 39, +-10, +-84, + 41, +-13, +-85, + 40, +-11, +-84, + 38, +-12, +-84, + 37, +-13, +-86, + 36, +-13, +-88, + 35, +-14, +-88, + 23, + 24, + 15, + 36, + 37, + 35, + 53, + 61, + 56, + -7, + 6, +-31, + 23, + 14, +-19, +-26, +-18, +-23, +-71, +-54, +-63, +-13, + -5, +-12, + 24, + 18, + -7, + 71, + 30, +-25, + 73, + 19, +-60, + 75, + 26, +-56, + 73, + 25, +-52, + 66, + 20, +-52, + 64, + 19, +-51, + 62, + 17, +-49, + 60, + 17, +-49, + 57, + 15, +-49, + 53, + 11, +-53, + 49, + 7, +-57, + 44, + 2, +-59, + 42, + -1, +-60, + 33, +-10, +-69, + 31, +-13, +-71, + 29, +-14, +-73, + 26, +-18, +-75, + 28, + 4, +-14, + 19, + -1, +-10, + 94, + 81, + 69, + 89, + 64, + 41, + 81, + 43, + 8, + 72, + 30, +-13, + 63, + 16, +-31, + 59, + 11, +-41, + 63, + 14, +-39, + 66, + 16, +-38, + 45, + 1, +-49, + 71, + 69, + 64, + 95, + 58, + 7, + 86, + 36, +-59, + 85, + 50, + -3, + 80, + 51, + 3, + 13, + 4, +-52, + 6, + 5, +-58, + 24, + 17, +-42, + 20, + 17, +-36, + 57, + 40, + -4, + 25, + 17, +-39, + 17, + 11, +-44, + 8, + 9, +-46, + 48, + 34, + -4, + 49, + 47, + 15, + 86, + 85, + 68, + 52, + 15, +-30, + -5, +-43, +-87, +-13, +-55, +-104, + -5, +-45, +-94, + 0, +-36, +-83, + 1, +-37, +-84, + -3, +-39, +-87, +-13, +-50, +-95, + -7, +-43, +-87, +-21, +-58, +-97, +-46, +-77, +-108, + 2, +-15, +-26, + -3, +-32, +-48, + 6, +-38, +-77, + 62, + 32, + 5, + 27, +-18, +-59, + 47, + 8, +-36, + 21, +-28, +-80, +-11, +-60, +-106, + 54, + 21, + -7, + 37, + 2, +-23, + 12, +-31, +-70, +-22, +-50, +-54, + 32, + 14, + 7, + 42, + -2, +-44, + 49, + 3, +-42, + 54, + 9, +-40, + 65, + 20, +-26, + 76, + 36, +-11, + 83, + 43, + -1, + 84, + 45, + -3, + 72, + 40, + -8, +-31, +-67, +-97, + 22, +-27, +-89, + 37, +-12, +-82, + 37, +-13, +-84, + 37, +-15, +-88, + 39, +-17, +-89, + 35, +-15, +-88, + 35, +-15, +-87, + 33, +-16, +-89, + 33, +-16, +-92, + 32, +-17, +-92, + 32, + 34, + 27, + 40, + 42, + 42, + 43, + 48, + 47, + 49, + 53, + 22, + 2, + 1, +-32, +-103, +-80, +-94, +-99, +-76, +-89, +-76, +-63, +-74, + 10, +-15, +-41, + 33, + -3, +-43, + 42, + 13, +-22, + 47, + 18, + -9, + 47, + 21, + -6, + 15, + -7, +-32, + 49, + 27, + -5, + 61, + 41, + 3, + 59, + 13, +-51, + 55, + 11, +-54, + 49, + 6, +-58, + 43, + 1, +-62, + 39, + -4, +-63, + 37, + -6, +-65, + 31, +-13, +-71, + 29, +-14, +-73, + 28, +-16, +-74, + 29, + -9, +-54, + 1, +-18, +-30, + 24, + 1, +-17, + 37, +-11, +-52, + 58, + 11, +-33, + 62, + 14, +-31, + 64, + 27, + -9, + 75, + 51, + 23, + 96, + 88, + 70, + 92, + 85, + 71, + 73, + 52, + 33, + 54, + 9, +-38, + 73, + 57, + 29, + 69, +-12, +-109, + 64, + 8, +-39, + 86, + 50, + -1, + 33, + 19, +-42, + -2, + -5, +-63, + 3, + 1, +-61, + 34, + 25, +-36, + 19, + 13, +-42, + 42, + 31, +-17, +-26, +-16, +-68, + 13, + 7, +-50, + 16, + 10, +-44, + 82, + 62, + 28, + 73, + 62, + 31, +101, +100, + 91, + 64, + 26, +-33, +115, +113, +109, +111, +109, +106, +118, +117, +113, +117, +116, +113, +119, +119, +113, +122, +122, +119, +118, +117, +114, +121, +121, +121, + 83, + 78, + 69, +-39, +-67, +-112, +102, +100, + 96, + 78, + 54, + 33, + 30, +-16, +-56, + 48, + 13, +-25, + 16, +-31, +-85, + 41, + -5, +-55, + -2, +-44, +-85, +-37, +-73, +-102, + 47, + 21, +-14, + 55, + 14, +-37, + 24, +-22, +-70, +-34, +-68, +-89, + 5, +-36, +-72, + 41, + -4, +-46, + 49, + 3, +-42, + 54, + 9, +-38, + 62, + 17, +-30, + 72, + 29, +-18, + 77, + 35, +-12, + 49, + 10, +-29, + 56, + 38, + 18, + 59, + 37, + 13, + 24, +-25, +-93, + 35, +-15, +-86, + 34, +-15, +-87, + 34, +-17, +-91, + 36, +-19, +-92, + 34, +-19, +-92, + 31, +-18, +-92, + 30, +-19, +-94, + 30, +-19, +-94, + 29, +-20, +-96, + 39, + 40, + 40, + 40, + 42, + 43, + 41, + 45, + 45, + 75, + 70, + 48, + 73, + 63, + 36, +-119, +-112, +-123, +-93, +-91, +-90, +-32, +-34, +-34, + 14, + 3, + 5, + 18, + 8, + 10, + 19, + 9, + 12, + 22, + 13, + 17, + 21, + 12, + 15, + 14, + 6, + 7, + 24, + 1, +-24, + 26, +-34, +-43, + 53, + 9, +-37, + 54, + 7, +-55, + 44, + 1, +-61, + 38, + -5, +-64, + 36, + -7, +-66, + 32, +-11, +-70, + 30, +-13, +-72, + 28, +-15, +-75, + 25, +-17, +-79, + 22, +-14, +-59, +-56, +-96, +-116, + 40, + 28, + 23, + 92, + 77, + 52, + 88, + 74, + 47, + 85, + 71, + 48, +105, +102, + 88, +107, +106, + 95, +103, + 99, + 84, +109, +108, + 97, +107, +105, + 96, + 75, + 48, + 16, + 76, + 64, + 44, + 86, + 28, +-87, + 74, + 9, +-82, + 66, + 39, + -9, + 20, + 8, +-50, + 37, +-13, +-57, + 39, + 28, +-12, + 61, + 44, + 0, + 37, + 28, +-20, + 33, + 27, +-11, + 7, + 9, +-44, + 25, + 18, +-38, + 15, + 7, +-48, + 85, + 63, + 26, + 81, + 69, + 41, + 89, + 89, + 70, + 66, + 31, +-33, +123, +122, +123, +119, +119, +117, +123, +123, +123, +123, +123, +123, +122, +122, +122, +122, +122, +122, +120, +120, +118, +122, +122, +122, + 91, + 84, + 73, +-24, +-51, +-98, +106, +103, + 97, + 79, + 54, + 31, + 44, + 8, +-17, + 30, +-15, +-67, + 15, +-36, +-97, + 34, +-15, +-69, + 1, +-43, +-93, +-30, +-65, +-91, + 31, +-16, +-75, + 13, +-39, +-98, + 9, +-52, +-128, +-45, +-78, +-106, + 31, + 4, + -8, + 42, + 0, +-41, + 49, + 4, +-38, + 52, + 6, +-39, + 56, + 10, +-37, + 62, + 17, +-32, + 65, + 20, +-28, + 5, +-35, +-68, + 15, +-12, +-36, + -7, +-40, +-59, + 27, +-22, +-90, + 32, +-18, +-90, + 34, +-20, +-91, + 34, +-20, +-93, + 33, +-23, +-96, + 33, +-22, +-95, + 29, +-20, +-96, + 28, +-21, +-97, + 27, +-23, +-98, + 27, +-24, +-100, + 39, + 40, + 35, + 41, + 43, + 42, + 42, + 46, + 44, + 76, + 70, + 55, +104, + 88, + 64, + 2, + -5, +-23, +-41, +-50, +-49, + 20, + 5, + -2, + 27, + 9, + -5, + 33, + 12, + 1, + 30, + 8, + -3, + 31, + 7, + -3, + 29, + 6, + -3, + 24, + 4, + -6, + 35, + 3, +-35, + 67, + 25, +-68, + 21, +-19, +-69, + 35, +-16, +-66, + 28, +-21, +-69, + 33, +-14, +-70, + 32, +-15, +-75, + 32, +-16, +-76, + 29, +-15, +-79, + 28, +-18, +-81, + 25, +-19, +-83, + 23, +-17, +-66, +-58, +-92, +-100, + 68, + 54, + 18, + 90, + 80, + 44, + 94, + 88, + 57, + 99, + 92, + 72, + 97, + 94, + 73, +103, +101, + 87, + 95, + 91, + 70, +104, +101, + 85, +102, + 99, + 84, + 82, + 71, + 48, +101, + 95, + 75, + 83, + 46, +-11, + 55, + -3, +-69, + 27, + 10, +-43, + 32, +-11, +-58, + 38, + 14, +-41, + 47, + 33, +-13, + 41, + 26, +-41, + 13, + 8, +-51, +-45, +-27, +-98, +-44, +-26, +-100, +-29, +-19, +-88, + 1, + 2, +-56, + 55, + 8, +-67, + 77, + 67, + 38, + 50, + 56, + 25, + 55, + 24, +-40, +123, +123, +123, +119, +119, +118, +123, +123, +123, +123, +123, +123, +122, +122, +122, +123, +123, +123, +119, +119, +118, +123, +123, +123, + 96, + 89, + 78, +-18, +-47, +-93, +109, +106, + 99, + 74, + 46, + 17, + 34, + 2, +-21, + 30, +-10, +-48, + 14, +-36, +-88, + 31, +-11, +-53, + 5, +-35, +-74, +-23, +-61, +-89, + 32, +-14, +-66, + 13, +-35, +-86, + 7, +-51, +-126, +-49, +-77, +-93, + 52, + 32, + 20, + 40, + 1, +-36, + 43, + -1, +-40, + 43, + -3, +-46, + 44, + -2, +-47, + 49, + -1, +-47, + 52, + 2, +-47, + 4, +-37, +-73, + 15, +-18, +-44, +-19, +-66, +-109, + 26, +-24, +-93, + 29, +-21, +-93, + 29, +-21, +-95, + 30, +-24, +-98, + 29, +-26, +-100, + 29, +-26, +-100, + 26, +-25, +-100, + 24, +-26, +-102, + 26, +-28, +-103, + 23, +-28, +-105, + 33, + 33, + 26, + 33, + 35, + 32, + 43, + 44, + 43, + 49, + 54, + 43, + 54, + 58, + 29, + 74, + 51, + 7, +-80, +-91, +-105, + 56, + 36, + 20, + 58, + 36, + 21, + 59, + 38, + 24, + 64, + 40, + 26, + 65, + 41, + 25, + 65, + 40, + 24, + 65, + 41, + 20, + 48, + 17, + -8, + 10, +-44, +-116, + 4, +-38, +-84, + 25, +-14, +-59, + 22, +-19, +-66, + 30, +-18, +-79, + 31, +-17, +-79, + 30, +-18, +-79, + 30, +-18, +-80, + 28, +-20, +-81, + 30, + -8, +-59, + 32, + 0, +-40, + 73, + 61, + 22, + 86, + 74, + 34, + 74, + 63, + 19, + 87, + 76, + 45, +103, +101, + 87, +100, + 98, + 83, +101, + 99, + 84, + 86, + 82, + 63, + 95, + 88, + 65, + 98, + 93, + 61, +101, + 93, + 53, +102, + 97, + 51, +101, + 92, + 56, +106, +102, + 77, + 43, + 37, + 13, + 8, + -9, +-62, + 8, +-36, +-81, + 33, + 19, +-38, + 25, + 17, +-36, +-22, +-17, +-77, +-85, +-45, +-118, +-80, +-43, +-118, +-46, +-25, +-90, + 20, + 14, +-41, + 25, + 17, +-38, + 18, + 16, +-28, + 30, + 22, +-19, + 46, + 14, +-49, +109, +107, + 96, +120, +120, +119, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +119, +119, +119, +123, +123, +123, + 92, + 87, + 76, +-22, +-54, +-98, +109, +106, + 99, + 63, + 28, +-15, + 41, + 12, + -8, + 31, +-10, +-49, + 11, +-37, +-85, + 30, + -7, +-41, + 16, +-25, +-63, + 7, +-35, +-69, + 33, + -8, +-50, + 14, +-32, +-75, + 1, +-50, +-95, + -5, +-32, +-45, + 1, +-29, +-42, +-14, +-50, +-76, +-20, +-61, +-93, +-20, +-63, +-97, +-23, +-64, +-99, + -9, +-56, +-97, + -1, +-50, +-95, +-10, +-57, +-100, + 26, + -2, +-24, +-23, +-71, +-118, + 24, +-26, +-96, + 26, +-23, +-98, + 26, +-24, +-100, + 25, +-26, +-102, + 26, +-29, +-104, + 26, +-30, +-105, + 24, +-29, +-105, + 24, +-32, +-107, + 24, +-32, +-108, + 20, +-33, +-111, + 31, + 32, + 24, + 32, + 34, + 30, + 35, + 37, + 37, + 47, + 51, + 46, + 40, + 49, + 22, + 89, + 81, + 53, +-58, +-75, +-85, +-46, +-80, +-92, +-43, +-80, +-91, +-43, +-81, +-94, +-47, +-85, +-99, +-51, +-89, +-104, +-54, +-93, +-107, +-57, +-98, +-113, +-60, +-103, +-120, + 8, +-19, +-44, + 20, + -6, +-42, + 31, + 2, +-39, + 25, +-10, +-53, + 28, +-19, +-81, + 29, +-19, +-79, + 29, +-19, +-78, + 27, +-20, +-81, + 52, + 27, +-11, + 98, + 92, + 69, + 95, + 86, + 54, + 87, + 72, + 27, + 79, + 56, + -1, + 81, + 67, + 32, + 99, + 90, + 61, +102, + 98, + 81, +105, +102, + 82, +106, +105, + 88, + 99, + 97, + 78, +108, +106, + 90, + 99, + 95, + 71, + 97, + 89, + 48, +100, + 95, + 64, +104, + 99, + 57, + 97, + 90, + 40, + 95, + 89, + 58, + 28, +-11, +-39, + 0, +-21, +-70, + 20, + 4, +-49, +-28, +-20, +-84, + 14, + 2, +-59, + 43, + 25, +-19, +-19, +-14, +-70, +-18, +-12, +-73, + 9, + 4, +-55, + 38, + 23, +-29, + 27, + 12, +-34, +-15, +-37, +-79, + 34, + -5, +-53, + 83, + 66, + 34, +112, +112, +111, +116, +116, +116, +116, +116, +116, +115, +115, +115, +115, +115, +115, + 98, + 98, + 94, +106, +106, +106, + 61, + 58, + 50, +-42, +-77, +-114, +101, +100, + 96, + 50, + 6, +-44, + 37, + 6, +-16, + 29, +-17, +-69, + 12, +-39, +-95, + 22, +-20, +-61, + 19, +-25, +-67, + 13, +-26, +-52, + 62, + 48, + 44, + 78, + 73, + 85, + 81, + 80, + 95, + 69, + 63, + 71, + 64, + 51, + 49, + 66, + 47, + 35, + 63, + 40, + 26, + 50, + 30, + 16, + 53, + 31, + 18, + 57, + 38, + 24, + 66, + 48, + 33, + 29, + 5, +-11, + 37, + 9, +-14, + 9, +-40, +-85, + 23, +-27, +-102, + 23, +-26, +-102, + 25, +-28, +-103, + 24, +-32, +-107, + 22, +-34, +-111, + 20, +-32, +-106, + 25, +-25, +-77, + 22, +-19, +-62, + 14, +-27, +-60, + 10, +-28, +-67, + 25, + 27, + 17, + 29, + 31, + 27, + 23, + 27, + 28, + 35, + 39, + 40, + 40, + 49, + 33, + 76, + 72, + 49, + 25, + 25, + 4, +-108, +-125, +-125, +-103, +-125, +-126, +-100, +-125, +-126, +-101, +-122, +-125, +-94, +-121, +-126, +-95, +-112, +-118, +-93, +-113, +-118, +-74, +-100, +-110, + -4, +-26, +-52, +-15, +-42, +-70, + 20, + -7, +-42, + 15, +-24, +-61, + 26, +-21, +-83, + 26, +-22, +-84, + 26, +-22, +-84, + 45, + 12, +-29, + 84, + 68, + 31, + 97, + 85, + 55, + 97, + 91, + 73, + 79, + 61, + 7, + 57, + 38, +-10, + 97, + 89, + 56, + 95, + 89, + 66, + 99, + 93, + 71, +101, + 95, + 73, +109, +107, + 93, +104, + 99, + 78, +106, +102, + 76, + 97, + 94, + 72, + 57, + 50, + 11, + 92, + 86, + 51, +100, + 96, + 68, +105, + 97, + 62, +106, + 97, + 55, + 98, + 90, + 60, + 79, + 57, + 31, + 50, + 20, +-24, + 43, + 20, +-31, + 52, + 29, +-21, + 39, + 21, +-29, + 75, + 41, +-14, + 61, + 35, +-19, + 54, + 31, +-25, + 41, + 23, +-34, + 27, + 9, +-45, + 40, + 39, + 6, + 20, +-24, +-71, + 63, + 34, + 1, + 76, + 63, + 49, + 99, + 99, + 98, +101, +101, +102, +101, +101, +102, +100, +100, +101, + 97, + 97, + 96, +100, +100, + 98, + 59, + 58, + 58, +-63, +-103, +-124, + 90, + 87, + 85, + 36, +-22, +-89, + 36, + 5, +-19, + 26, +-26, +-85, + 16, +-40, +-114, + 20, +-29, +-90, + 18, +-29, +-80, + 19, +-12, +-35, + 85, + 65, + 55, + 92, + 79, + 82, + 88, + 82, + 90, + 86, + 79, + 80, + 87, + 76, + 73, + 87, + 74, + 69, + 87, + 72, + 65, + 87, + 72, + 65, + 91, + 75, + 66, + 92, + 75, + 60, + 91, + 71, + 54, + 43, + 18, + 3, + 27, + 9, +-13, + 26, + 9, +-11, + 2, +-19, +-46, +-15, +-33, +-52, +-12, +-28, +-49, +-19, +-31, +-50, +-26, +-36, +-53, +-34, +-42, +-61, +-36, +-49, +-71, +-44, +-57, +-76, +-38, +-50, +-71, +-49, +-63, +-88, + 12, + 17, + 7, + 15, + 18, + 13, + 20, + 24, + 17, + 29, + 31, + 27, + 44, + 49, + 42, + 47, + 54, + 28, + 88, + 77, + 57, +-12, + 4, +-11, + -6, + 9, + -5, + -7, + 9, + -5, +-12, + 5, +-11, + -9, + 9, + -9, +-14, + 5, +-11, +-11, + 8, + -9, + -6, + 11, + -5, + 1, + 14, + 2, + 42, + 48, + 41, +-34, +-52, +-64, + -1, +-39, +-73, + 24, +-24, +-86, + 24, +-24, +-86, + 30, +-14, +-68, + 85, + 69, + 31, + 95, + 81, + 47, +112, +108, + 93, + 95, + 91, + 69, + 27, + 14, +-28, + 65, + 47, + -2, + 82, + 64, + 18, + 94, + 86, + 60, + 99, + 92, + 71, + 95, + 86, + 57, + 98, + 94, + 74, +107, +105, + 93, + 96, + 95, + 74, + 95, + 92, + 72, + 71, + 68, + 41, + 47, + 40, + -7, + 54, + 53, + 27, + 79, + 76, + 46, +102, + 98, + 63, +107, +103, + 79, +101, + 96, + 70, + 64, + 27, +-15, + 65, + 4, +-29, + 65, + 2, +-31, + 82, + 25, +-30, + 81, + 30, +-34, + 60, + 28, +-33, + 42, + 23, +-37, + 30, + 16, +-42, + 36, + 25, +-26, + 56, + 54, + 27, + 41, + -8, +-66, + 43, + 8, +-28, + 46, + 13, +-24, + 45, + 25, + -3, + 49, + 33, + 9, + 46, + 30, + 8, + 43, + 29, + 8, + 48, + 37, + 17, + 48, + 39, + 20, + 20, + 15, + 5, +-75, +-117, +-125, + 66, + 54, + 48, + 31, +-20, +-78, + 41, + 17, + 0, + 24, +-26, +-81, + 16, +-38, +-106, + 20, +-28, +-81, + 17, +-29, +-77, + 58, + 37, + 22, +101, + 84, + 68, +107, + 93, + 81, +107, + 93, + 79, +107, + 93, + 79, +106, + 90, + 75, +104, + 86, + 68, +102, + 82, + 62, +101, + 77, + 49, +102, + 77, + 47, +102, + 75, + 43, +100, + 67, + 24, + 36, + 11, +-24, +-37, +-47, +-69, +-23, +-42, +-72, +-26, +-48, +-78, +-30, +-52, +-86, +-26, +-47, +-74, +-37, +-58, +-88, +-34, +-55, +-89, +-33, +-51, +-78, +-50, +-64, +-94, +-45, +-63, +-97, +-42, +-63, +-90, +-60, +-74, +-103, + 10, + 11, + -2, + 19, + 20, + 7, + 24, + 27, + 16, + 31, + 33, + 27, + 34, + 38, + 38, + 18, + 34, + 6, + 35, + 46, + 18, +-36, +-24, +-46, +-63, +-38, +-51, +-64, +-39, +-52, +-62, +-38, +-50, +-61, +-36, +-48, +-59, +-34, +-47, +-59, +-34, +-46, +-60, +-35, +-46, +-51, +-28, +-38, + 27, + 39, + 35, +-46, +-48, +-49, +-19, +-49, +-73, + 20, +-28, +-89, + 20, +-27, +-90, + 59, + 31, +-16, + 83, + 61, + 11, +100, + 90, + 66, +105, + 95, + 73, + 81, + 75, + 56, +-28, +-42, +-105, + 29, + 15, +-24, + 78, + 56, + 3, + 83, + 69, + 31, +102, + 97, + 77, +107, +104, + 87, +103, + 99, + 77, +102, +101, + 89, + 55, + 54, + 36, + 96, + 91, + 68, + 99, + 94, + 67, + 50, + 49, + 32, + 73, + 68, + 42, +101, + 94, + 60, +112, +109, + 91, +110, +106, + 81, +104, + 99, + 74, + 81, + 60, + 40, + 47, +-13, +-44, + 82, + 29, +-20, + 73, + 22, +-10, + 76, + 28, +-10, + 82, + 47, + 13, + 77, + 58, + 28, + 55, + 45, + 16, + 55, + 48, + 16, + 68, + 64, + 37, + 48, + 2, +-49, + 43, + 5, +-44, + 45, + 7, +-41, + 41, + 11, +-36, + 46, + 19, +-21, + 44, + 19, +-21, + 43, + 20, +-21, + 47, + 25, +-14, + 46, + 25, +-13, + 19, + 3, +-28, +-84, +-123, +-126, + 38, + 15, + -6, + 29, +-13, +-51, + 38, + 21, + 11, + 24, +-25, +-77, + 15, +-32, +-88, + 16, +-20, +-54, + 16, +-24, +-65, + 33, + -2, +-29, + 79, + 48, + 20, + 89, + 64, + 45, +101, + 81, + 62, + 93, + 74, + 56, + 98, + 78, + 60, + 96, + 71, + 49, + 89, + 55, + 24, + 85, + 48, + 6, + 84, + 45, + 2, + 78, + 33, +-15, + 73, + 24, +-29, + 42, + 13, +-28, +-44, +-54, +-77, +-27, +-52, +-83, +-35, +-57, +-91, +-35, +-56, +-93, +-42, +-63, +-99, +-34, +-58, +-95, +-47, +-66, +-102, +-46, +-66, +-101, +-51, +-68, +-102, +-54, +-74, +-111, +-56, +-73, +-108, +-63, +-80, +-115, + 1, + 2, +-13, + 11, + 11, + -1, + 19, + 19, + 5, + 20, + 22, + 17, + 20, + 23, + 18, + 26, + 36, + 18, + 40, + 48, + 25, + 10, + 9, +-23, +-66, +-41, +-54, +-65, +-40, +-52, +-64, +-40, +-51, +-64, +-40, +-50, +-60, +-36, +-47, +-60, +-36, +-47, +-58, +-34, +-44, +-49, +-27, +-36, + 19, + 32, + 28, +-19, +-18, +-20, +-18, +-47, +-73, + 47, + 5, +-37, + 46, + 4, +-39, + 68, + 40, + -8, + 81, + 59, + 10, + 99, + 87, + 61, + 91, + 81, + 50, + 23, + 5, +-50, +-83, +-85, +-121, +-27, +-33, +-58, + 91, + 76, + 43, + 95, + 88, + 61, +102, + 97, + 74, + 96, + 91, + 69, +104, + 99, + 79, +102, + 98, + 78, + 98, + 93, + 73, +104, + 98, + 74, + 99, + 94, + 72, +107, +104, + 87, + 50, + 41, + 1, +103, + 93, + 52, +107, +102, + 70, +107, +102, + 79, +107, +104, + 83, + 60, + 62, + 38, + 69, + 72, + 51, + 86, + 90, + 72, + 63, + 72, + 48, + 81, + 86, + 66, + 97, + 98, + 82, + 85, + 88, + 71, + 51, + 59, + 32, + 52, + 57, + 30, + 49, + 45, + 6, + 64, + 54, + 17, + 54, + 23, +-19, + 57, + 25, +-18, + 53, + 33, + 3, + 64, + 49, + 30, + 63, + 52, + 33, + 64, + 54, + 35, + 67, + 58, + 41, + 65, + 57, + 44, + 33, + 28, + 20, +-89, +-123, +-126, + 43, + 25, + 10, + 23, +-19, +-56, + 45, + 31, + 26, + 19, +-30, +-93, + 14, +-34, +-94, + 18, +-17, +-51, + 14, +-24, +-63, +-12, +-56, +-86, + 35, +-10, +-37, + 54, + 8, +-22, + 33, + -8, +-35, + 22, +-13, +-35, + 18, + -9, +-29, + 10, +-21, +-43, + 23, + -8, +-34, + 25, +-10, +-40, + 29, + -8, +-47, + 21, +-17, +-58, + 17, +-25, +-68, +-10, +-40, +-64, +-44, +-50, +-73, +-55, +-67, +-102, +-43, +-66, +-100, +-45, +-65, +-104, +-53, +-69, +-106, +-48, +-70, +-109, +-49, +-70, +-110, +-58, +-73, +-113, +-58, +-75, +-114, +-59, +-78, +-115, +-63, +-80, +-118, +-17, +-21, +-29, +-17, +-15, +-30, +-12, +-11, +-26, + -2, + -1, +-16, + 8, + 10, + 1, + 15, + 17, + 10, + 22, + 30, + 20, + 32, + 40, + 19, + 34, + 24, +-15, + 7, + -3, +-35, +-69, +-46, +-56, +-68, +-46, +-55, +-69, +-46, +-55, +-67, +-44, +-54, +-63, +-41, +-50, +-60, +-37, +-47, +-55, +-32, +-42, + 8, + 24, + 19, + -9, +-12, +-17, + -5, +-50, +-78, + 16, +-25, +-58, + 17, +-25, +-58, + 27, +-11, +-50, + 72, + 45, +-15, + 89, + 77, + 52, + 93, + 88, + 66, + 3, +-10, +-44, +-61, +-63, +-91, + 64, + 46, + -4, + 75, + 54, + 5, + 80, + 65, + 32, + 97, + 92, + 73, +104, +102, + 87, + 89, + 79, + 50, + 92, + 84, + 55, + 97, + 88, + 59, + 98, + 94, + 75, +107, +104, + 88, +107, +104, + 89, + 30, + 22, + -7, + 93, + 83, + 46, +105, + 99, + 75, +108, +102, + 74, +100, + 96, + 74, + 40, + 9, +-32, + 41, + -6, +-62, + 92, + 81, + 54, + 66, + 58, + 30, + 44, + 47, + 14, + 56, + 57, + 19, + 61, + 58, + 18, + 76, + 70, + 36, + 73, + 68, + 35, + 76, + 72, + 44, + 70, + 61, + 30, + 52, + 20, +-27, + 62, + 28, +-14, + 61, + 42, + 17, + 71, + 59, + 43, + 69, + 57, + 41, + 66, + 53, + 38, + 67, + 55, + 39, + 58, + 46, + 30, + 27, + 18, + 3, +-92, +-124, +-126, + 23, +-11, +-46, + 20, +-30, +-86, + 51, + 33, + 24, + 13, +-42, +-128, + 13, +-40, +-112, + 16, +-31, +-92, + 9, +-36, +-87, +-28, +-72, +-106, + 23, +-21, +-66, + 4, +-43, +-91, + -7, +-60, +-99, +-20, +-59, +-84, + 1, +-40, +-66, + -1, +-40, +-78, + 4, +-26, +-50, + -7, +-18, +-39, + 6, + 1, +-22, + 1, + 0, +-21, + 2, + 1, +-23, + 0, + 2, +-23, + -3, + 1, +-21, + 2, + 4, +-16, + -2, + 0, +-21, +-12, +-10, +-31, +-28, +-28, +-50, +-35, +-35, +-58, +-47, +-48, +-75, +-52, +-57, +-86, +-62, +-70, +-102, +-63, +-74, +-110, + 37, + 40, + 36, + 34, + 32, + 14, +-30, +-31, +-53, +-35, +-32, +-49, +-32, +-28, +-40, +-32, +-26, +-32, +-27, +-20, +-24, + -5, + 1, + -5, + 9, + 15, + 9, + 30, + 30, + 4, + 44, + 39, + 14, + 17, + 26, + 11, + 20, + 29, + 14, + 20, + 29, + 16, + 14, + 25, + 14, + 4, + 16, + 5, +-12, + 2, + -8, +-51, +-31, +-40, + 2, + 18, + 12, + -8, +-12, +-16, + -5, +-51, +-79, + 12, +-30, +-63, + 10, +-29, +-64, + 34, + 2, +-41, + 59, + 28, +-28, + 73, + 54, + 15, + 91, + 85, + 66, + 36, + 20, +-15, + 23, + 10, +-33, + 40, + 20, +-41, + 68, + 48, + -3, + 74, + 55, + 16, + 78, + 66, + 40, + 82, + 75, + 56, + 77, + 64, + 37, + 83, + 68, + 31, + 87, + 78, + 43, + 95, + 88, + 65, +108, +105, + 84, + 99, + 95, + 77, + 50, + 47, + 33, + 79, + 67, + 33, + 95, + 87, + 55, +100, + 93, + 60, + 76, + 70, + 44, + 4, +-23, +-53, + 40, + 13, +-16, + 50, + 41, + 31, + 71, + 59, + 38, + 41, + 37, + -6, + 18, + 22, +-19, + 36, + 35, +-17, + 64, + 52, + 8, + 64, + 53, + 18, + 77, + 48, + 17, + 80, + 59, + 30, + 78, + 52, + 25, + 70, + 42, + 7, + 53, + 30, + 2, + 65, + 51, + 32, + 65, + 51, + 33, + 62, + 48, + 31, + 68, + 55, + 39, + 44, + 30, + 13, + 11, + 0, +-13, +-95, +-124, +-125, + 22, +-23, +-75, + 26, +-25, +-77, + 47, + 32, + 29, + 10, +-45, +-127, + 12, +-41, +-112, + 25, +-26, +-91, + 11, +-36, +-88, +-21, +-69, +-104, + 12, +-35, +-84, + 15, +-34, +-95, +-20, +-74, +-120, +-47, +-91, +-125, + -7, +-60, +-118, + 10, +-31, +-79, + 33, + 17, + 1, + 31, + 33, + 30, + 44, + 45, + 46, + 6, + 8, + 3, + -5, + -2, +-16, +-13, +-11, +-31, +-12, +-11, +-32, +-17, +-16, +-38, +-19, +-18, +-38, +-21, +-19, +-38, +-37, +-34, +-56, +-44, +-43, +-65, +-50, +-51, +-78, +-48, +-51, +-80, +-56, +-62, +-93, + -5, + -6, +-12, + 51, + 49, + 39, + -3, + -7, +-30, +-71, +-64, +-72, +-79, +-71, +-77, +-75, +-66, +-76, +-58, +-49, +-60, +-37, +-28, +-38, +-11, + -2, +-15, + 12, + 23, + 8, + 36, + 46, + 28, + 46, + 54, + 37, + 53, + 60, + 43, + 56, + 63, + 47, + 57, + 66, + 50, + 59, + 69, + 59, + 62, + 72, + 64, + 62, + 72, + 64, + 55, + 65, + 59, + 38, + 51, + 45, +-14, +-17, +-20, +-23, +-67, +-92, + -7, +-46, +-77, + -7, +-44, +-77, + 2, +-32, +-64, + 14, +-15, +-57, + 29, + 7, +-29, + 40, + 19, +-21, + 0, +-32, +-68, +-58, +-69, +-87, + 56, + 38, +-14, + 97, + 91, + 63, + 86, + 81, + 51, + 31, + 24, +-12, +-46, +-46, +-76, + 49, + 42, + 17, + 89, + 75, + 44, + 95, + 90, + 68, +103, +100, + 87, + 97, + 93, + 70, + 88, + 86, + 69, +-14, +-16, +-24, + 19, + 12, +-13, + 63, + 59, + 37, + 72, + 69, + 52, + -4, + -9, +-18, +-98, +-114, +-120, +-72, +-81, +-79, +-13, +-28, +-27, + 51, + 18, + -4, + 7, + 9, +-35, + 23, + 25, +-27, + 32, + 32, +-19, + 55, + 45, + -2, + 4, + 2, +-28, + 71, + 45, + 23, + 55, +-21, +-45, + 17, +-17, +-41, + 21, + -1, +-40, + 21, + 9, + -2, + 28, + 18, + 12, + 1, + -6, + -8, + 12, + 0, + -9, + -2, +-23, +-41, + 17, + -6, +-26, + 8, +-11, +-30, +-101, +-124, +-124, + 18, +-29, +-80, + 30, + -7, +-38, + 39, + 20, + 18, + 8, +-45, +-125, + 12, +-36, +-88, + 13, +-30, +-72, + 2, +-41, +-80, +-21, +-69, +-107, + -1, +-45, +-79, + 22, +-22, +-68, +-37, +-88, +-127, +-48, +-92, +-121, +-14, +-61, +-116, + 5, +-35, +-80, + 29, + 19, + 10, + 33, + 34, + 36, + 62, + 63, + 67, + 21, + 23, + 20, + 16, + 17, + 6, + 17, + 15, + -1, + 0, + 3, +-12, + 1, + 1, +-16, + -8, + -5, +-26, +-11, + -9, +-30, +-17, +-18, +-41, +-35, +-37, +-63, +-48, +-53, +-83, +-56, +-65, +-95, +-52, +-61, +-91, + 17, + 13, + 10, + 11, + 10, + -2, + -2, +-10, +-29, +-25, +-16, +-40, +-11, + -1, +-28, + 1, + 13, +-15, + 10, + 22, + -4, + 16, + 27, + 2, + 20, + 30, + 4, + 22, + 33, + 10, + 29, + 39, + 18, + 27, + 39, + 19, + 35, + 45, + 27, + 49, + 58, + 41, + 54, + 65, + 48, + 58, + 69, + 58, + 53, + 64, + 56, + 53, + 62, + 57, + 58, + 67, + 62, + 59, + 66, + 61, +-12, +-16, +-19, +-50, +-97, +-123, +-57, +-101, +-126, +-61, +-106, +-125, +-61, +-105, +-126, +-57, +-102, +-126, +-55, +-94, +-112, +-46, +-76, +-92, +-61, +-103, +-121, +-20, +-64, +-105, + 42, + 30, + -8, + 78, + 64, + 16, + 79, + 67, + 20, + 18, + 1, +-59, +-109, +-95, +-118, + -9, +-15, +-51, + 37, + 17, +-23, + 54, + 39, + 8, + 58, + 53, + 37, + 42, + 38, + 19, + 30, + 30, + 23, +-72, +-76, +-84, +-101, +-82, +-117, +-97, +-87, +-123, +-63, +-104, +-108, +-52, +-93, +-98, +-55, +-96, +-94, +-54, +-87, +-83, +-32, +-52, +-50, + -9, +-42, +-55, + 11, + 11, +-10, + 2, + 6, +-12, + 31, + 29, + 10, + 38, + 33, + 4, + 38, + 31, + -7, + 50, + 26, +-18, + 72, + 38, + -5, +-74, +-37, +-80, +-18, + -5, +-42, +-50, +-95, +-120, +-53, +-97, +-120, +-58, +-100, +-121, +-51, +-88, +-99, +-23, +-41, +-43, +-35, +-57, +-56, +-52, +-74, +-72, +-99, +-117, +-117, + 6, +-37, +-83, + 15, +-18, +-48, + 25, + -6, +-19, + 3, +-51, +-127, + 15, +-32, +-85, + 27, +-14, +-63, + -3, +-43, +-83, +-25, +-70, +-108, +-32, +-69, +-91, + 13, +-28, +-70, +-46, +-82, +-104, +-50, +-92, +-120, +-15, +-62, +-114, +-60, +-103, +-124, + 10, + 6, + -2, + 28, + 29, + 23, + 78, + 79, + 81, + 43, + 44, + 41, + 36, + 39, + 25, + 9, + 14, + 2, + 6, + 5, +-10, + 4, + 7, + -6, + 27, + 27, + 17, + 2, + 4, + -2, +-15, +-13, +-30, +-16, +-23, +-49, +-39, +-51, +-82, +-48, +-60, +-88, +-68, +-77, +-98, +-45, +-47, +-52, +-27, +-30, +-42, +-49, +-57, +-75, + -2, + 8, +-22, + 2, + 12, +-21, + 8, + 18, +-16, + 12, + 22, +-12, + 16, + 26, + -7, + 20, + 31, + -2, + 22, + 33, + 1, + 28, + 38, + 8, + 34, + 44, + 14, + 37, + 45, + 21, + 34, + 46, + 23, + 43, + 55, + 37, + 39, + 53, + 41, + 47, + 58, + 51, + 60, + 68, + 64, + 59, + 65, + 61, + 59, + 64, + 60, +-12, +-14, +-19, +-31, +-76, +-114, +-12, +-61, +-116, + -5, +-56, +-112, +-13, +-61, +-114, + -1, +-45, +-89, + 3, +-40, +-80, + 2, +-37, +-77, + -1, +-40, +-79, +-29, +-67, +-97, +-11, +-21, +-54, + 67, + 49, + -2, + 56, + 43, + 0, + 66, + 50, + 1, + 72, + 64, + 26, + 76, + 69, + 27, + 55, + 53, + 31, +-76, +-63, +-98, +-32, + -7, +-89, +-76, +-54, +-113, +-107, +-82, +-117, +-68, +-67, +-69, +-98, +-76, +-116, +-48, +-47, +-50, +-20, +-25, +-21, +-41, +-51, +-51, +-16, +-25, +-22, +-32, +-42, +-38, +-48, +-63, +-61, +-53, +-65, +-68, + 59, + 57, + 57, + 74, + 73, + 76, + 97, + 97, + 99, + 59, + 56, + 52, + 6, + -6, +-19, + 1, +-19, +-71, + 26, + -7, +-60, + -2, +-14, +-43, + 35, + 24, + 5, +106, +106, +106, +104, +105, +106, +103, +103, +104, +100, +100, +102, + 94, + 95, +100, + 85, + 87, + 93, + 71, + 74, + 83, +-60, +-61, +-60, + 75, + 77, + 86, + 68, + 72, + 80, + 63, + 67, + 76, + 59, + 60, + 71, + 53, + 56, + 64, + 40, + 43, + 52, + 19, + 12, + 17, +-18, +-56, +-81, + 17, + 7, + 5, + 19, + 4, + 3, + 16, + 1, + -6, +-22, +-43, +-56, +-10, +-48, +-79, + -2, +-40, +-76, +-10, +-41, +-82, + 9, + 5, + -7, + 67, + 69, + 69, + 57, + 59, + 57, + 45, + 47, + 43, + 47, + 46, + 37, + 19, + 19, + 9, + 17, + 21, + 12, + 24, + 21, + 8, + 39, + 39, + 30, + 1, + -6, +-26, +-47, +-64, +-97, +-36, +-55, +-89, +-52, +-64, +-92, +-54, +-70, +-99, +-63, +-70, +-94, +-69, +-81, +-114, +-90, +-103, +-122, + 6, + 16, +-17, + 12, + 22, +-11, + 15, + 25, + -9, + 19, + 28, + -8, + 25, + 33, + -2, + 26, + 35, + 0, + 27, + 37, + 3, + 28, + 37, + 5, + 28, + 37, + 4, + 30, + 39, + 11, + 28, + 38, + 13, + 16, + 29, + 10, + 43, + 52, + 42, + 51, + 60, + 52, + 57, + 63, + 57, + 56, + 61, + 57, + 50, + 55, + 51, +-19, +-19, +-23, + 21, + -7, +-39, + 53, + 19, +-20, + 44, + 2, +-32, + 41, + 7, +-27, + 46, + 21, + -7, + 57, + 27, + 6, + 60, + 35, + 11, + 35, + 7, +-16, +-20, +-45, +-72, +-31, +-53, +-95, + 5, + -5, +-36, + 59, + 49, + 18, + 57, + 51, + 19, + 60, + 52, + 23, + 36, + 35, + 21, + 2, + 4, + -3, +-99, +-86, +-114, +-36, +-15, +-78, +-26, + -2, +-86, +-38, +-28, +-48, + 32, + 31, + 32, + 46, + 45, + 46, + 48, + 47, + 47, + 53, + 51, + 52, + 57, + 55, + 56, + 58, + 57, + 57, + 62, + 61, + 61, + 58, + 57, + 58, + 68, + 67, + 67, + 70, + 66, + 59, + 91, + 90, + 84, +105, +104, + 99, + 49, + 46, + 36, +-11, +-23, +-28, +-65, +-92, +-120, +-62, +-83, +-117, +-11, +-42, +-84, + 63, + 38, + 19, + 91, + 90, + 95, + 86, + 85, + 91, + 93, + 92, + 98, + 96, + 95, +102, + 99, +100, +106, +100, +101, +109, + 99, +100, +108, +-28, +-28, +-28, + 95, +100, +110, + 87, + 92, +106, + 81, + 87, +102, + 82, + 87, +102, + 78, + 83, + 98, + 78, + 82, + 97, + 52, + 52, + 58, + -6, +-31, +-40, + 72, + 76, + 89, + 64, + 66, + 81, + 61, + 64, + 78, + 50, + 52, + 66, + 42, + 42, + 54, + 38, + 35, + 43, + 26, + 23, + 22, + 4, + 5, + 4, +-27, +-26, +-29, + 23, + 23, + 20, + 50, + 51, + 49, + 56, + 57, + 54, + 41, + 42, + 39, + 44, + 46, + 40, + 39, + 40, + 33, + 35, + 34, + 25, +-21, +-36, +-66, +-39, +-60, +-97, +-49, +-66, +-99, +-51, +-68, +-104, +-58, +-74, +-109, +-77, +-90, +-118, +-85, +-95, +-122, +-68, +-87, +-118, + 16, + 25, + -4, + 15, + 24, + -5, + 19, + 28, + -4, + 23, + 31, + -2, + 25, + 33, + -1, + 33, + 41, + 7, + 32, + 41, + 8, + 30, + 40, + 8, + 35, + 43, + 14, + 18, + 27, + 0, + 8, + 18, + -4, + 27, + 36, + 18, + 47, + 54, + 44, + 48, + 54, + 47, + 55, + 61, + 55, + 27, + 33, + 29, + 10, + 19, + 14, +-23, +-24, +-27, + 47, + 22, + 0, + 79, + 50, + 28, + 72, + 49, + 27, + 68, + 49, + 24, + 88, + 60, + 27, + 88, + 59, + 30, + 47, + 18, +-14, +-32, +-55, +-81, +-38, +-60, +-106, +-34, +-56, +-98, +-31, +-53, +-97, +-17, +-32, +-55, + -7, +-11, +-18, +-15, +-14, +-18, +-100, +-100, +-123, +-61, +-56, +-75, +-23, +-22, +-40, +-78, +-65, +-118, +-53, +-48, +-70, + 0, + 2, + -1, + 51, + 51, + 52, + 61, + 61, + 63, + 56, + 56, + 58, + 58, + 58, + 61, + 61, + 61, + 63, + 65, + 65, + 66, + 68, + 68, + 70, + 46, + 46, + 47, + 73, + 73, + 72, + 68, + 63, + 50, +107, +104, + 96, + 92, + 90, + 80, + 65, + 62, + 55, +-39, +-44, +-74, +-36, +-27, +-80, + 26, + 10, +-36, + 79, + 30, +-10, + 71, + 40, + 29, + 98, + 94, +101, + 92, + 90, + 98, + 95, + 93, +103, + 95, + 95, +103, + 90, + 89, + 98, + 97, + 96, +103, + 87, + 85, + 95, + 39, + 37, + 43, + 58, + 52, + 56, + 80, + 77, + 86, + 81, + 81, + 93, + 75, + 75, + 88, + 78, + 77, + 92, + 81, + 81, + 95, + 58, + 57, + 65, + 20, + 10, + 14, + 48, + 50, + 65, + 68, + 68, + 90, + 60, + 63, + 85, + 54, + 56, + 77, + 63, + 64, + 82, + 60, + 62, + 75, + 55, + 55, + 61, + 19, + 22, + 16, + -9, + -8, +-17, +-65, +-69, +-81, +-59, +-61, +-71, +-16, +-17, +-21, + 32, + 33, + 32, + 50, + 48, + 45, + 59, + 59, + 57, + 27, + 26, + 17, +-28, +-45, +-77, +-49, +-61, +-93, +-51, +-65, +-99, +-56, +-70, +-104, +-36, +-42, +-63, + 6, + 5, + -9, + 20, + 21, + 4, + 11, + 11, + -5, + 31, + 40, + 20, + 32, + 40, + 17, + 33, + 40, + 14, + 39, + 46, + 20, + 39, + 46, + 18, + 36, + 44, + 16, + 36, + 44, + 17, + 23, + 32, + 6, + 5, + 13, +-11, + 14, + 22, + -2, + 20, + 27, + 4, + 30, + 35, + 17, + 41, + 47, + 34, + 38, + 44, + 37, + 5, + 12, + 7, + 34, + 40, + 36, + 30, + 39, + 33, +-18, +-21, +-24, + 59, + 43, + 31, + 79, + 70, + 57, + 75, + 70, + 59, + 93, + 85, + 75, + 99, + 83, + 68, + 47, + 33, + 18, +-34, +-57, +-84, +-43, +-65, +-111, +-41, +-63, +-111, +-40, +-63, +-105, +-37, +-59, +-106, +-40, +-62, +-110, + 28, + 25, + 23, +-78, +-79, +-116, +-73, +-63, +-118, +-44, +-41, +-68, +-27, +-30, +-45, +-51, +-46, +-78, +-40, +-47, +-58, +-53, +-59, +-53, +-49, +-55, +-49, +-38, +-46, +-39, +-44, +-50, +-46, +-39, +-47, +-42, +-35, +-43, +-38, +-35, +-42, +-38, +-32, +-39, +-37, +-40, +-47, +-47, + -2, + -8, +-10, + 88, + 82, + 68, +107, +103, + 91, + 85, + 80, + 65, + 49, + 43, + 34, + -8, +-35, +-62, + 19, + -1, +-34, + 30, + 14, +-18, + 47, + 16, +-21, + 65, + 50, + 40, +109, +108, +109, +109, +109, +110, +102, +101, +102, +103, +102, +103, +104, +103, +105, +104, +104, +105, + 99, + 98, +101, + 93, + 91, + 97, + 87, + 86, + 92, + 79, + 77, + 85, + 80, + 80, + 91, + 77, + 76, + 86, + 79, + 78, + 86, + 79, + 78, + 83, + 82, + 81, + 87, + 89, + 87, + 93, + 79, + 78, + 84, + 70, + 65, + 68, + 64, + 53, + 51, + 72, + 68, + 73, + 78, + 74, + 74, + 76, + 71, + 74, + 83, + 79, + 78, + 2, + 3, + -8, + 24, + 27, + 15, + 9, + 10, + 4, +-19, +-18, +-27, +-45, +-44, +-53, +-79, +-78, +-88, +-57, +-59, +-66, +-14, +-14, +-15, + 9, + 8, + 2, +-40, +-56, +-89, + -9, +-12, +-32, + 20, + 20, + 3, + 42, + 43, + 22, + 55, + 57, + 37, + 60, + 59, + 42, + 62, + 61, + 41, + 63, + 62, + 42, + 46, + 55, + 40, + 48, + 56, + 42, + 44, + 53, + 35, + 43, + 52, + 33, + 43, + 52, + 31, + 37, + 46, + 24, + 15, + 26, + 4, + 17, + 24, + 2, + 19, + 26, + 1, + 14, + 20, + -2, + 25, + 30, + 8, + 29, + 33, + 18, + 18, + 25, + 13, + 8, + 17, + 11, + 48, + 53, + 48, + 54, + 59, + 55, + 27, + 36, + 31, + 10, + 14, + 8, + 50, + 43, + 36, + 88, + 84, + 77, + 90, + 82, + 73, + 92, + 81, + 68, + 38, + 27, + 22, +-41, +-65, +-94, +-46, +-69, +-110, +-44, +-67, +-108, +-44, +-67, +-108, +-42, +-65, +-106, +-43, +-65, +-111, +-48, +-71, +-119, +-42, +-48, +-55, +-86, +-88, +-105, +-59, +-59, +-63, +-28, +-24, +-37, +-18, +-19, +-35, +-29, +-35, +-58, +-89, +-94, +-107, +-100, +-108, +-112, +-86, +-98, +-102, +-78, +-90, +-95, +-75, +-90, +-95, +-72, +-87, +-92, +-68, +-83, +-88, +-67, +-79, +-85, +-67, +-79, +-84, +-62, +-73, +-79, + -8, +-16, +-27, + 83, + 74, + 57, +102, + 97, + 84, + 74, + 65, + 51, + 40, + 31, + 19, + 26, + -8, +-39, + 46, + 7, +-29, + 41, + 0, +-39, + 52, + 12, +-33, + 80, + 58, + 41, +110, +106, +104, +104, +102, + 99, +101, + 98, + 97, + 99, + 97, + 95, +103, +102, +102, +106, +103, +103, +103, +102, +102, + 99, + 98, + 98, + 98, + 96, + 99, + 91, + 90, + 96, + 90, + 89, + 97, + 85, + 83, + 91, + 84, + 82, + 87, + 90, + 88, + 92, + 90, + 86, + 85, + 90, + 87, + 90, + 92, + 89, + 90, + 86, + 82, + 83, + 87, + 82, + 80, + 86, + 80, + 74, + 92, + 81, + 72, + 93, + 81, + 73, +102, + 96, + 94, + 16, + 18, + 9, + 14, + 16, + 1, + 7, + 9, + -2, + 7, + 10, + 2, + 32, + 34, + 30, + 11, + 15, + 11, +-21, +-20, +-27, +-54, +-53, +-66, +-30, +-30, +-40, + 45, + 47, + 31, + 53, + 55, + 40, + 46, + 49, + 28, + 44, + 47, + 25, + 58, + 55, + 36, + 73, + 63, + 40, + 69, + 60, + 36, + 70, + 61, + 38, + 47, + 60, + 48, + 50, + 62, + 53, + 50, + 62, + 53, + 42, + 55, + 43, + 21, + 35, + 20, + 13, + 25, + 8, + 16, + 25, + 8, + 20, + 27, + 6, + 28, + 34, + 11, + 14, + 19, + -3, + 29, + 32, + 12, + -3, + 4, + -9, + 15, + 22, + 15, + 49, + 55, + 48, + 49, + 54, + 49, + 33, + 41, + 36, + 38, + 45, + 41, + 42, + 48, + 41, + 57, + 44, + 28, + 99, + 80, + 59, + 97, + 82, + 66, + 37, + 21, + 8, +-41, +-67, +-91, +-43, +-66, +-106, +-43, +-66, +-106, +-47, +-69, +-110, +-47, +-70, +-111, +-47, +-70, +-112, +-51, +-75, +-118, +-53, +-78, +-121, +-76, +-92, +-113, +-116, +-121, +-123, +-120, +-121, +-124, +-114, +-119, +-124, +-61, +-64, +-58, +-110, +-118, +-125, +-111, +-119, +-125, +-106, +-114, +-124, +-90, +-104, +-121, +-82, +-97, +-112, +-75, +-92, +-109, +-70, +-86, +-104, +-67, +-81, +-98, +-65, +-78, +-91, +-60, +-73, +-86, +-47, +-61, +-73, + -1, +-14, +-32, + 55, + 44, + 26, + 82, + 74, + 58, + 51, + 39, + 22, + 39, + 28, + 16, + 89, + 83, + 76, +112, +108, +102, + 28, + -6, +-25, + 24, +-18, +-55, + 70, + 48, + 32, +112, +109, +110, +104, +103, +104, +107, +105, +105, +112, +111, +111, +105, +104, +105, +103, + 98, +101, +105, +103, +103, +102, +101, +100, + 96, + 95, + 94, + 96, + 93, + 92, + 90, + 84, + 83, + 92, + 87, + 86, + 95, + 92, + 89, + 90, + 82, + 76, + 91, + 84, + 78, + 95, + 90, + 89, + 96, + 94, + 94, + 95, + 92, + 97, + 93, + 91, + 95, + 98, + 94, + 98, + 94, + 88, + 92, + 96, + 93, + 95, + 98, + 87, + 84, + 9, + 11, + 1, + 1, + 2, +-14, + 1, + 3, + -9, + -3, + -1, +-14, + 38, + 39, + 36, + 46, + 47, + 45, + 32, + 34, + 30, + 16, + 19, + 11, + 56, + 58, + 44, + 47, + 49, + 34, + 37, + 40, + 20, + 45, + 47, + 26, + 40, + 44, + 25, + 53, + 50, + 31, + 59, + 45, + 17, + 52, + 46, + 23, + 52, + 39, + 9, + 55, + 22, +-13, + 40, + 36, + 23, + 39, + 50, + 42, + 38, + 49, + 42, + 34, + 47, + 37, + 23, + 33, + 17, + 19, + 27, + 9, + 26, + 30, + 14, + 26, + 31, + 11, + 14, + 20, + -2, +-15, + -7, +-23, + 23, + 30, + 20, + 46, + 52, + 45, + 46, + 53, + 48, + 26, + 36, + 29, + 42, + 48, + 42, + 46, + 51, + 46, + 40, + 45, + 39, + 62, + 53, + 41, + 94, + 75, + 53, + 59, + 41, + 23, +-24, +-61, +-97, +-70, +-89, +-112, +-69, +-87, +-112, +-75, +-91, +-114, +-75, +-92, +-115, +-79, +-96, +-117, +-82, +-98, +-119, +-90, +-105, +-121, +-91, +-106, +-122, +-98, +-111, +-122, +-109, +-119, +-124, +-108, +-118, +-123, +-106, +-116, +-124, +-97, +-104, +-110, +-104, +-115, +-123, +-100, +-113, +-122, +-98, +-110, +-121, +-92, +-107, +-119, +-88, +-104, +-117, +-85, +-99, +-114, +-83, +-98, +-113, +-79, +-92, +-109, +-74, +-87, +-102, +-71, +-83, +-95, +-64, +-76, +-87, +-41, +-53, +-64, +-25, +-35, +-46, +-10, +-19, +-31, + 8, +-29, +-47, +-14, +-35, +-48, +100, +100, + 99, +116, +113, +110, + 1, +-41, +-70, + 21, + -5, +-22, + 65, + 50, + 39, +111, +108, +106, +105, +101, + 96, +109, +108, +107, +110, +107, +105, +109, +107, +106, +106, +104, +102, +106, +104, +102, +102, +100, + 99, + 97, + 94, + 90, + 92, + 87, + 84, + 92, + 88, + 86, + 99, + 98, +100, + 99, + 98, +102, + 92, + 88, + 88, + 92, + 89, + 87, + 90, + 86, + 82, + 94, + 92, + 90, + 98, + 95, + 96, + 93, + 89, + 90, + 99, + 94, + 96, +100, + 93, + 94, + 98, + 92, + 92, + 78, + 75, + 75, +-24, +-40, +-64, + -2, + -5, +-21, + 8, + 10, + -5, +-16, +-18, +-40, + 16, + 18, + 12, + 40, + 41, + 39, + 41, + 42, + 38, + 37, + 40, + 25, + 53, + 56, + 38, + 50, + 52, + 36, + 20, + 22, + 1, + 3, + 5, +-21, + 14, + 2, +-27, + 15, + 6, +-23, + 35, + 16, +-20, + 27, + 12, +-22, + 37, + 14, +-24, + 26, + -6, +-40, + 49, + 15, +-26, + 51, + 15, +-26, + 56, + 29, + -3, + 40, + 23, + -1, + 19, + 11, +-11, + 21, + 24, + 3, + 28, + 32, + 15, + -3, + 5, +-10, +-11, + 0, +-12, + 32, + 38, + 24, + 44, + 49, + 39, + 43, + 49, + 44, + 26, + 36, + 29, + 43, + 47, + 41, + 45, + 49, + 44, + 43, + 48, + 43, + 40, + 45, + 39, + 63, + 61, + 53, + 89, + 85, + 80, + 31, + 5, +-12, + 6, +-37, +-80, +-92, +-107, +-121, +-91, +-106, +-120, +-93, +-107, +-120, +-92, +-108, +-121, +-98, +-113, +-122, +-100, +-115, +-124, +-101, +-116, +-123, +-102, +-116, +-124, +-101, +-115, +-123, +-101, +-114, +-122, +-101, +-112, +-121, +-93, +-107, +-117, +-90, +-104, +-114, +-92, +-106, +-116, +-92, +-106, +-116, +-90, +-104, +-114, +-91, +-105, +-115, +-89, +-102, +-112, +-92, +-103, +-113, +-96, +-108, +-118, +-96, +-108, +-118, +-92, +-104, +-111, +-87, +-96, +-102, +-90, +-98, +-105, +-93, +-103, +-108, +-86, +-98, +-104, +-84, +-98, +-105, + 44, + -1, +-68, +-18, +-55, +-77, +115, +114, +114, +110, +110, +110, + 6, +-32, +-52, + 12, +-21, +-47, + 80, + 72, + 65, +110, +105, +103, +111, +110, +107, +105, +101, + 96, +105, +103, + 97, +103, +101, + 98, +100, + 95, + 90, +108, +106, +105, +103, + 99, + 98, +103, +100, +101, + 99, + 97, +101, + 90, + 89, + 94, + 88, + 87, + 91, + 88, + 86, + 90, + 85, + 84, + 89, + 85, + 81, + 86, + 97, + 95, +100, + 96, + 90, + 90, + 95, + 90, + 88, +100, + 96, + 95, + 96, + 88, + 82, +100, + 94, + 88, +103, + 96, + 91, + 67, + 59, + 54, +-38, +-59, +-96, +-35, +-58, +-94, +-22, +-34, +-54, +-26, +-30, +-53, + 10, + 12, + -2, + 22, + 24, + 17, + 32, + 35, + 24, + 55, + 58, + 42, + 44, + 46, + 29, + 19, + 20, + -1, +-13, +-18, +-49, +-16, +-22, +-57, +-17, +-29, +-65, +-11, +-29, +-61, + 14, +-12, +-49, + 25, + -2, +-44, + 13, +-13, +-53, + 38, + -7, +-54, + 30, +-19, +-65, + 16, +-30, +-72, + 8, +-32, +-72, + 21, + -9, +-42, + 69, + 41, + 1, + 69, + 34, + -8, + 20, + 1, +-36, + 5, + 18, + 6, + 37, + 44, + 30, + 43, + 48, + 38, + 39, + 45, + 40, + 28, + 37, + 31, + 43, + 48, + 42, + 45, + 48, + 43, + 45, + 48, + 43, + 43, + 48, + 42, + 40, + 45, + 39, + 62, + 52, + 34, + 88, + 66, + 44, + 25, + -3, +-27, +-38, +-81, +-119, +-104, +-120, +-125, +-104, +-119, +-125, +-107, +-122, +-125, +-104, +-120, +-125, +-107, +-122, +-125, +-109, +-123, +-125, +-111, +-124, +-125, +-114, +-124, +-124, +-114, +-125, +-124, +-114, +-124, +-124, +-114, +-124, +-125, +-105, +-120, +-125, +-104, +-120, +-125, +-104, +-121, +-125, +-101, +-118, +-124, +-98, +-115, +-122, +-97, +-114, +-121, +-92, +-109, +-119, +-101, +-116, +-122, +-103, +-119, +-124, +-103, +-119, +-124, +-102, +-119, +-124, +-103, +-119, +-123, +-101, +-116, +-122, +-103, +-118, +-123, +-96, +-114, +-122, +-90, +-112, +-121, + 33, +-36, +-97, +-22, +-68, +-108, +114, +111, +108, +112, +106, + 98, + 70, + 53, + 39, + 9, +-33, +-66, + 84, + 71, + 58, +102, + 92, + 81, +107, +102, + 95, +109, +107, +105, +104, + 93, + 88, +103, + 93, + 87, +100, + 95, + 90, + 97, + 87, + 77, + 96, + 88, + 80, + 97, + 91, + 83, + 96, + 86, + 77, + 98, + 90, + 83, + 88, + 79, + 74, + 96, + 94, + 93, + 93, + 89, + 89, + 98, + 92, + 87, + 94, + 81, + 72, + 94, + 83, + 72, + 92, + 81, + 69, + 96, + 83, + 70, + 97, + 83, + 73, +100, + 95, + 90, + 99, + 87, + 79, + 69, + 55, + 44, +-55, +-80, +-115, +-43, +-67, +-109, +-41, +-63, +-102, +-39, +-61, +-101, +-24, +-39, +-61, + 24, + 26, + 9, + 10, + 16, + 1, + 16, + 19, + 5, + 29, + 29, + 14, + 29, + 23, + 3, +-25, +-31, +-63, +-39, +-47, +-79, +-48, +-54, +-81, +-31, +-50, +-85, +-19, +-52, +-89, +-30, +-53, +-85, +-12, +-43, +-80, + 48, + 3, +-45, + 45, + 0, +-47, + 43, + -2, +-50, + 50, + 4, +-43, + 37, + -9, +-56, + -7, +-50, +-88, + 61, + 32, + 0, + 98, + 72, + 32, + 45, + 38, + 15, + 42, + 48, + 39, + 30, + 38, + 32, + 29, + 38, + 32, + 46, + 51, + 46, + 46, + 51, + 45, + 45, + 49, + 43, + 44, + 49, + 43, + 42, + 47, + 42, + 39, + 44, + 38, + 59, + 55, + 46, + 87, + 71, + 56, + 65, + 48, + 39, +-60, +-98, +-115, +-71, +-96, +-113, +-60, +-73, +-80, + 16, + 8, + 0, + 41, + 30, + 22, + 60, + 53, + 49, + 27, + 24, + 21, +-123, +-126, +-126, + 61, + 50, + 40, + 58, + 42, + 19, + 63, + 56, + 43, + -2, +-34, +-65, +-48, +-61, +-71, +-65, +-92, +-126, +-60, +-89, +-126, +-60, +-91, +-125, +-27, +-50, +-85, +-41, +-78, +-117, +-62, +-94, +-126, +-69, +-83, +-110, +-73, +-85, +-105, +-86, +-89, +-102, +-84, +-89, +-101, + 3, + -2, + -9, + 53, + 48, + 44, + 55, + 47, + 36, + 57, + 47, + 34, +-25, +-36, +-42, +-19, +-59, +-90, +-20, +-50, +-72, +109, + 97, + 80, +101, + 82, + 63, + 96, + 71, + 48, + 4, +-38, +-71, + 88, + 79, + 72, + 99, + 92, + 84, + 82, + 72, + 66, + 81, + 76, + 72, + 85, + 78, + 76, + 93, + 81, + 80, + 79, + 71, + 69, + 77, + 67, + 64, + 91, + 86, + 82, + 94, + 85, + 79, + 96, + 89, + 82, + 94, + 81, + 66, + 92, + 74, + 56, + 88, + 69, + 51, + 89, + 72, + 55, + 92, + 78, + 61, + 91, + 65, + 46, + 93, + 78, + 64, + 93, + 85, + 78, + 97, + 89, + 84, + 95, + 87, + 85, + 89, + 76, + 72, + 81, + 76, + 72, + 59, + 47, + 43, +-52, +-77, +-110, +-51, +-76, +-114, +-47, +-72, +-115, +-48, +-76, +-115, +-47, +-71, +-110, + 30, + 27, + 12, + 28, + 24, + 2, + 33, + 18, + -9, + 21, + 6, +-19, + 37, + 15, +-24, + 10, +-16, +-53, +-17, +-40, +-79, +-50, +-62, +-93, +-59, +-70, +-96, +-40, +-64, +-103, +-56, +-79, +-114, +-57, +-79, +-108, + 33, +-17, +-62, + 39, + -9, +-56, + 41, + -6, +-52, + 47, + 2, +-46, + 45, + 2, +-49, + 39, + -8, +-56, + 15, +-31, +-75, +101, + 80, + 52, + 74, + 47, + 13, + 19, + 30, + 22, + 21, + 33, + 25, + 44, + 50, + 45, + 51, + 56, + 52, + 46, + 51, + 47, + 44, + 49, + 43, + 43, + 48, + 42, + 43, + 48, + 44, + 40, + 45, + 41, + 54, + 50, + 41, + 74, + 49, + 24, + 80, + 61, + 44, + 29, + 11, + -4, +-43, +-93, +-119, +-16, +-31, +-36, + 86, + 74, + 60, + 75, + 55, + 34, + 69, + 45, + 21, + 35, + 13, +-12, +-123, +-125, +-125, + 99, + 88, + 72, + 95, + 80, + 62, +103, + 97, + 92, +-14, +-42, +-71, +-69, +-102, +-125, +-57, +-90, +-126, +-60, +-91, +-126, +-63, +-97, +-126, +-42, +-65, +-93, +-39, +-71, +-103, +-65, +-98, +-126, +-72, +-90, +-123, +-61, +-78, +-103, +-66, +-74, +-87, +-45, +-53, +-65, + 54, + 50, + 42, + 91, + 71, + 55, + 88, + 61, + 35, + 88, + 63, + 40, + 5, +-23, +-39, +-11, +-68, +-103, +-41, +-81, +-103, + 79, + 72, + 67, + 78, + 65, + 50, + 94, + 73, + 54, + 7, +-37, +-77, + 88, + 69, + 46, + 90, + 73, + 56, + 88, + 69, + 51, + 89, + 74, + 60, + 93, + 77, + 60, + 89, + 72, + 59, + 92, + 81, + 65, + 87, + 75, + 65, + 85, + 65, + 43, + 75, + 59, + 45, + 81, + 62, + 39, + 81, + 68, + 52, + 81, + 65, + 47, + 77, + 64, + 54, + 75, + 73, + 71, + 76, + 71, + 66, + 75, + 62, + 50, + 85, + 78, + 67, + 85, + 64, + 42, + 84, + 64, + 41, + 90, + 75, + 60, + 97, + 79, + 62, + 88, + 73, + 60, + 50, + 36, + 22, +-51, +-77, +-113, +-55, +-81, +-113, +-53, +-76, +-112, +-58, +-86, +-116, +-62, +-90, +-120, + 34, + 31, + 16, + 40, + 28, + 5, + 48, + 38, + 11, + 30, + 29, + 11, + 36, + 24, + 1, + 23, + 11, +-14, + 9, +-11, +-44, +-27, +-41, +-68, +-73, +-83, +-109, +-21, +-42, +-83, +-35, +-49, +-85, +-28, +-51, +-86, + 12, +-14, +-41, + 11, +-25, +-55, + 0, +-44, +-82, + 37, +-12, +-58, + 43, + -3, +-51, + 46, + 0, +-49, + 39, + -9, +-56, + 67, + 32, + -3, + 95, + 67, + 35, + 18, + 22, + 11, + 31, + 40, + 34, + 46, + 52, + 48, + 53, + 57, + 55, + 48, + 53, + 49, + 43, + 48, + 43, + 42, + 47, + 41, + 43, + 48, + 44, + 44, + 48, + 47, + 50, + 51, + 44, + 77, + 54, + 33, + 82, + 60, + 41, + 61, + 39, + 16, +-33, +-83, +-109, + -2, +-24, +-35, + 92, + 79, + 64, + 92, + 82, + 72, + 91, + 80, + 65, + 56, + 47, + 37, +-122, +-124, +-124, + 25, + 16, + 6, + 42, + 20, + 2, + 37, + 17, + -4, +-44, +-55, +-64, +-42, +-48, +-57, +-37, +-43, +-55, +-37, +-43, +-60, +-39, +-48, +-64, +-26, +-36, +-57, +-27, +-40, +-62, +-38, +-48, +-63, +-32, +-38, +-50, +-19, +-22, +-23, + 4, + 3, + 5, + 24, + 22, + 21, + 37, + 26, + 23, +101, + 90, + 81, + 93, + 82, + 73, + 90, + 85, + 81, + -4, +-22, +-26, +-17, +-73, +-102, +-54, +-92, +-113, + 58, + 36, + 17, + 29, + 7, +-17, + 27, + 4, +-21, + 24, + -9, +-49, + 45, + 14, +-15, + 69, + 44, + 18, + 74, + 55, + 35, + 73, + 48, + 21, + 65, + 46, + 23, + 72, + 43, + 13, + 73, + 50, + 27, + 68, + 47, + 21, + 81, + 66, + 50, + 74, + 57, + 40, + 76, + 64, + 51, + 68, + 55, + 45, + 55, + 49, + 42, + 50, + 48, + 40, + 55, + 46, + 33, + 53, + 43, + 31, + 52, + 42, + 35, + 48, + 42, + 36, + 51, + 44, + 30, + 65, + 54, + 40, + 72, + 54, + 35, + 80, + 66, + 52, + 83, + 63, + 41, + 15, + -5, +-22, +-56, +-78, +-111, +-59, +-82, +-111, +-60, +-80, +-112, +-59, +-85, +-117, +-64, +-91, +-123, + 45, + 41, + 25, + 21, + 19, + -1, + 43, + 33, + 13, + 45, + 39, + 20, + 43, + 36, + 17, + 35, + 27, + 4, + 30, + 16, +-11, + 10, + -9, +-40, +-64, +-67, +-84, +-21, +-28, +-59, +-10, +-21, +-47, + -1, +-18, +-51, +-43, +-37, +-67, + 40, + 19, + -7, + 38, + 15, +-11, + 4, +-19, +-46, + 30, +-12, +-55, + 51, + 6, +-42, + 48, + 4, +-45, + 38, + -6, +-50, +103, + 75, + 41, + 25, + 14, + -7, + 33, + 42, + 37, + 47, + 53, + 48, + 54, + 58, + 56, + 48, + 53, + 50, + 42, + 47, + 41, + 41, + 46, + 41, + 42, + 47, + 43, + 43, + 47, + 46, + 47, + 39, + 30, + 63, + 39, + 19, + 73, + 52, + 32, + 75, + 51, + 25, +-22, +-70, +-100, + -4, +-40, +-60, + 81, + 58, + 35, + 79, + 57, + 33, + 84, + 62, + 39, + 68, + 48, + 27, +-102, +-118, +-124, +-74, +-100, +-125, +-70, +-98, +-124, +-73, +-101, +-123, + 8, + 6, + -3, + 26, + 23, + 13, + 22, + 18, + 8, + 18, + 14, + 3, + 9, + 6, + -5, + 0, + -3, +-13, +-18, +-21, +-31, +-18, +-21, +-33, + 1, + 0, + -5, + 34, + 33, + 32, + 64, + 64, + 63, + 81, + 78, + 77, +-30, +-40, +-41, +-28, +-32, +-37, +-34, +-42, +-53, +-75, +-83, +-108, +-51, +-86, +-109, +-18, +-68, +-94, +-68, +-90, +-100, + 64, + 45, + 25, + 58, + 27, + -2, + 54, + 17, +-19, + 11, +-32, +-66, + 20, +-22, +-61, + 62, + 21, +-23, + 60, + 14, +-29, + 75, + 41, + 3, + 76, + 41, + 2, + 74, + 42, + 0, + 75, + 41, + 2, + 78, + 50, + 18, + 63, + 26, + -6, + 73, + 39, + -1, + 70, + 36, + -5, + 67, + 35, + -2, + 65, + 36, + 3, + 68, + 50, + 34, + 58, + 39, + 17, + 51, + 43, + 29, + 49, + 40, + 28, + 62, + 43, + 28, + 70, + 46, + 19, + 63, + 38, + 14, + 63, + 34, + 5, + 61, + 32, + 2, + 59, + 25, + -4, +-29, +-51, +-71, +-58, +-76, +-107, +-73, +-92, +-115, +-58, +-79, +-110, +-64, +-89, +-120, +-64, +-93, +-122, + 31, + 26, + 13, + 29, + 19, + -7, + 40, + 28, + 6, + 34, + 32, + 16, + 46, + 34, + 12, + 41, + 38, + 20, + 38, + 26, + 3, + 21, + 17, + -5, +-36, +-42, +-57, + -5, +-18, +-49, + 2, + -2, +-28, + 10, + -3, +-32, +-46, +-34, +-77, +-47, +-36, +-69, + 28, + 14, +-11, + 39, + 19, + -6, + 8, +-27, +-63, + 46, + 1, +-48, + 47, + 2, +-48, + 42, + -3, +-51, + 93, + 68, + 36, + 29, + 11, +-13, + 34, + 42, + 37, + 40, + 46, + 42, + 53, + 57, + 55, + 46, + 51, + 47, + 39, + 44, + 39, + 41, + 47, + 42, + 42, + 46, + 44, + 13, + 9, + 5, + 3, +-10, +-36, + 22, + -9, +-34, + 40, + 8, +-10, + 58, + 41, + 30, +-55, +-76, +-85, +-16, +-28, +-37, + 77, + 55, + 31, + 74, + 51, + 26, + 72, + 41, + 4, + 63, + 32, + -4, +-110, +-123, +-124, + -2, +-22, +-44, +-81, +-107, +-127, +-71, +-95, +-111, + 4, + 1, + -2, + 33, + 30, + 23, + 30, + 28, + 19, + 24, + 22, + 15, + 12, + 10, + 3, + 0, + 0, + -8, +-18, +-19, +-26, +-17, +-20, +-27, + 14, + 14, + 15, + 45, + 43, + 46, + 67, + 64, + 67, + 58, + 55, + 54, +-23, +-24, +-21, +-76, +-83, +-95, +-64, +-79, +-108, + -2, +-37, +-66, +-22, +-47, +-68, +-12, +-44, +-64, +-67, +-97, +-108, + 55, + 9, +-37, + 39, +-11, +-62, + 34, +-16, +-65, + 36, +-14, +-67, + 66, + 21, +-27, + 76, + 37, + -8, + 76, + 35, + -4, + 62, + 26, + -5, + 67, + 36, + 2, + 65, + 28, + -4, + 76, + 47, + 20, + 62, + 41, + 17, + 68, + 44, + 18, + 71, + 46, + 22, + 77, + 49, + 14, + 73, + 46, + 13, + 68, + 34, + -8, + 61, + 23, +-18, + 52, + 16, +-16, + 63, + 37, + 9, + 62, + 38, + 10, + 61, + 34, + 4, + 54, + 20, +-10, + 58, + 24, +-11, + 45, + 19, +-10, + 41, + 16, + -5, + 31, + 14, + 2, + 1, +-15, +-24, +-53, +-67, +-78, +-71, +-86, +-110, +-78, +-96, +-121, +-66, +-91, +-118, +-67, +-91, +-119, + -5, +-13, +-30, + -3, +-13, +-40, + 16, + 8, +-14, + 27, + 18, + -7, + 25, + 18, + -5, + 28, + 22, + -1, + 35, + 25, + 1, + 35, + 30, + 13, +-42, +-40, +-51, + -1, +-19, +-50, + 8, + 2, +-21, + 18, + 4, +-23, +-30, +-24, +-66, +-31, +-24, +-65, +-49, +-36, +-76, +-53, +-40, +-74, +-31, +-53, +-83, + 42, + -4, +-53, + 47, + 2, +-47, + 42, + -4, +-53, + 73, + 44, + 13, + 51, + 28, + -4, + 35, + 42, + 37, + 30, + 37, + 32, + 51, + 54, + 54, + 42, + 49, + 45, + 38, + 47, + 42, + 40, + 47, + 43, + 14, + 17, + 10, + 9, +-17, +-40, + 22, +-19, +-43, + 24, +-13, +-39, + 14, + -1, +-31, + 22, + -8, +-37, +-34, +-50, +-70, + -5, +-29, +-45, + 78, + 50, + 16, + 74, + 46, + 16, + 65, + 27, + -9, + 60, + 20, +-20, +-102, +-123, +-124, + 15, + -4, +-36, +-88, +-111, +-126, +-73, +-95, +-120, + 28, + 28, + 36, + 19, + 19, + 30, + 20, + 20, + 29, + 17, + 17, + 26, + 15, + 15, + 23, + 2, + 2, + 11, +-19, +-17, + -9, +-42, +-41, +-34, +-23, +-22, +-14, + 16, + 17, + 25, + 39, + 40, + 46, + 49, + 49, + 54, +-29, +-30, +-24, +-79, +-87, +-109, + 4, +-31, +-69, + 59, + 18, +-24, +-27, +-61, +-93, +-23, +-55, +-81, +-67, +-97, +-111, + 77, + 37, +-13, + 58, + 11, +-35, + 49, + 1, +-54, + 46, + -5, +-66, + 53, + 8, +-48, + 65, + 26, +-20, + 62, + 23, +-18, + 57, + 26, +-15, + 56, + 23, +-15, + 66, + 23, +-11, + 70, + 27, + -5, + 48, + 28, + -3, + 61, + 40, + 10, + 76, + 54, + 29, + 66, + 38, + 10, + 72, + 45, + 15, + 62, + 26, +-12, + 65, + 34, + -2, + 48, + 8, +-31, + 56, + 21, +-17, + 49, + 15, +-20, + 45, + 14, +-17, + 31, + -2, +-29, + 24, + -6, +-33, + 35, + 10, +-12, + 40, + 21, + 3, + 33, + 14, + -2, + 18, + 2, + -9, + 0, +-14, +-26, +-43, +-54, +-75, +-71, +-94, +-113, +-69, +-91, +-119, +-66, +-92, +-114, +-14, +-19, +-27, +-27, +-24, +-34, +-29, +-32, +-47, +-40, +-36, +-48, +-28, +-26, +-43, + -7, +-14, +-33, + 20, + 7, +-19, + 13, + 6, + -9, +-75, +-76, +-86, + -2, + -7, +-33, + 9, + 5, +-20, + 21, + 8, +-20, + 27, + 9, +-23, +-17, +-17, +-55, +-20, +-14, +-56, +-28, +-21, +-60, +-54, +-60, +-90, + 41, + -5, +-53, + 47, + 2, +-47, + 40, + -7, +-55, + 54, + 23, + -8, + 65, + 41, + 9, + 30, + 37, + 32, + 25, + 33, + 27, + 47, + 52, + 49, + 39, + 45, + 42, + 38, + 46, + 42, + 21, + 22, + 16, + 24, + -4, +-39, + 20, +-17, +-54, + 35, + 3, +-34, + 34, + 0, +-41, + 37, + 4, +-32, + 26, +-13, +-57, +-31, +-64, +-92, +-25, +-59, +-85, + 42, + 1, +-44, + 58, + 18, +-29, + 66, + 37, + 2, + 67, + 38, + 6, +-104, +-120, +-124, +-97, +-113, +-118, +-84, +-95, +-108, +-83, +-92, +-112, +-67, +-66, +-54, +-64, +-61, +-42, +-67, +-62, +-47, +-57, +-57, +-43, +-54, +-54, +-45, +-72, +-68, +-59, +-80, +-77, +-67, +-92, +-91, +-83, +-85, +-83, +-75, +-66, +-65, +-56, +-49, +-49, +-39, +-53, +-54, +-41, +-17, +-19, +-15, +-82, +-93, +-112, + 50, + 7, +-45, + 66, + 27, +-20, + -7, +-34, +-62, +-28, +-75, +-111, +-70, +-93, +-103, + 65, + 36, + 0, + 63, + 24, +-19, + 67, + 23, +-28, + 60, + 12, +-45, + 67, + 20, +-38, + 64, + 22, +-26, + 72, + 29, +-28, + 47, + -4, +-56, + 72, + 36, +-13, + 58, + 14, +-34, + 68, + 26, +-15, + 68, + 35, + -8, + 57, + 24, +-12, + 52, + 9, +-37, + 65, + 32, + -9, + 57, + 23, +-18, + 48, + 15, +-24, + 46, + 11, +-24, + 47, + 14, +-16, + 46, + 27, + 5, + 42, + 34, + 21, + 38, + 25, + 8, + 37, + 13, + -9, + 46, + 22, + -1, + 27, + -5, +-33, + 34, + 10, +-16, + 27, + 0, +-24, + 23, + -2, +-25, + 11, +-13, +-34, + 23, + 2, +-16, + 2, +-26, +-52, +-53, +-78, +-102, +-63, +-83, +-113, +-19, +-22, +-31, + -2, +-13, +-41, + 9, + 6, +-17, + 24, + 11, +-14, + 9, + 5, +-10, + 17, + 4, +-19, + 0, + -2, +-19, + -3, + 0, + -6, +-44, +-46, +-57, + 5, +-10, +-36, + 15, + 9, +-14, + 24, + 12, +-14, + 4, + -6, +-34, + 45, + 23, + -7, + 22, + 8, +-23, + -2, + -6, +-41, +-51, +-53, +-82, + 41, + -3, +-50, + 50, + 6, +-40, + 35, +-13, +-61, + 43, + 9, +-21, + 75, + 50, + 22, + 26, + 32, + 26, + 32, + 39, + 34, + 33, + 42, + 36, + 33, + 41, + 37, + 19, + 21, + 14, + 10, +-20, +-54, + 17, +-14, +-51, + 25, +-14, +-58, + 26, + -8, +-47, + 21, +-19, +-61, + 36, + 2, +-39, + 44, + 10, +-31, +-15, +-51, +-81, +-36, +-67, +-92, + 36, + 7, +-35, + 17, +-10, +-51, + 12, +-14, +-51, + -2, +-23, +-51, +-116, +-123, +-124, +-113, +-124, +-125, +-11, + -8, + -7, + 33, + 35, + 36, + 35, + 37, + 38, + 37, + 39, + 40, + 38, + 41, + 42, + 38, + 40, + 41, + 37, + 39, + 39, + 37, + 39, + 39, + 40, + 41, + 42, + 41, + 43, + 42, + 38, + 39, + 39, + 22, + 24, + 27, + -9, + -8, + -9, +-13, +-12, +-14, + 11, + 9, + 8, +-90, +-103, +-119, + 1, +-16, +-47, + 16, + -6, +-43, +-13, +-47, +-82, +-25, +-70, +-103, +-68, +-96, +-107, + 26, + -7, +-49, + 23, + -1, +-42, + 26, + 5, +-29, + 50, + 23, +-18, + 51, + 17, +-25, + 72, + 35, + -9, + 73, + 39, + -4, + 63, + 23, +-22, + 61, + 20, +-31, + 53, + 14, +-29, + 54, + 11, +-39, + 53, + 14, +-29, + 52, + 13, +-30, + 65, + 37, + 3, + 55, + 27, + -3, + 53, + 25, + -5, + 46, + 26, + -1, + 35, + 22, + 0, + 22, + 10, +-11, + 12, + 2, +-18, + 23, + -2, +-27, + 23, + 7, +-15, + 15, + 2, +-14, + 13, + 2, +-13, + 24, + 12, + 0, + 32, + 16, + 5, + 19, + -3, +-20, + 27, + 8, +-11, + 28, + 9, + -8, + 13, +-14, +-35, + 17, + -3, +-20, + 0, +-29, +-54, +-31, +-64, +-95, +-11, +-15, +-25, + -2, + -8, +-34, + 9, + 0, +-22, + 19, + 9, +-12, + 25, + 17, + -6, + 19, + 12, +-10, + 15, + 8, +-12, + 19, + 5, +-22, + 22, + 6, +-23, + 0, + -3, +-25, + 10, + 6, +-17, + 24, + 12, +-12, +-57, +-44, +-81, + 8, + -3, +-28, + 51, + 28, + 3, + 56, + 34, + 8, + 8, +-10, +-35, + 38, + -6, +-50, + 51, + 9, +-38, + 34, +-13, +-60, + 36, + -5, +-40, + 86, + 61, + 32, + 17, + 21, + 16, + 33, + 38, + 36, + 16, + 25, + 17, + 24, + 29, + 24, + 8, +-19, +-56, + 28, + -3, +-43, + 10, +-27, +-73, + 31, + -5, +-45, + 28, + -9, +-46, + 35, + -3, +-43, + 32, + -5, +-46, + 37, + 0, +-44, +-16, +-48, +-80, +-38, +-68, +-92, + 30, + -7, +-49, + 3, +-25, +-58, +-51, +-72, +-95, +-109, +-122, +-125, +-117, +-123, +-124, +-114, +-123, +-122, +-111, +-108, +-75, +-87, +-98, +-56, +-70, +-89, +-53, +-34, +-65, +-47, +-27, +-57, +-46, +-34, +-66, +-48, +-37, +-71, +-54, +-50, +-82, +-57, +-48, +-76, +-56, +-56, +-82, +-56, +-86, +-97, +-56, +-102, +-109, +-73, +-115, +-115, +-94, +-119, +-118, +-104, +-107, +-116, +-112, +-99, +-113, +-124, +-99, +-112, +-124, + 13, + -9, +-38, + 12, +-19, +-50, +-34, +-73, +-99, +-53, +-73, +-88, + 44, + 18, +-23, + 59, + 22, +-23, + 52, + 14, +-27, + 60, + 19, +-27, + 62, + 14, +-38, + 66, + 24, +-24, + 58, + 18, +-25, + 53, + 14, +-28, + 56, + 17, +-32, + 51, + 9, +-36, + 50, + 8, +-38, + 65, + 30, +-11, + 51, + 14, +-25, + 54, + 24, + -9, + 51, + 18, +-15, + 52, + 20, +-14, + 43, + 14, +-14, + 39, + 13, + -9, + 30, + 0, +-27, + 33, + 14, +-10, + 18, + 5, +-19, + 3, + -7, +-29, + 5, + -8, +-25, + 23, + 12, + -7, + 37, + 21, + 3, + 30, + 10, +-10, + 22, +-12, +-38, + 31, + 7, +-15, + 26, + 5, +-17, + 27, + 6, +-13, + 9, +-17, +-39, + 15, +-13, +-37, + 2, +-33, +-64, + 20, + 11, + -6, + 10, + -4, +-27, + 4, + 2, +-15, + 23, + 15, + -7, + 26, + 18, + -1, + 24, + 19, + -1, + 31, + 19, + -5, + 22, + 16, + -3, + 29, + 17, + -7, + 13, + 14, + -7, + 15, + 8, +-16, + 24, + 10, +-14, +-61, +-46, +-82, +-44, +-33, +-71, +-13, +-15, +-42, + 44, + 28, + 3, + 17, + 0, +-23, + 29, +-13, +-53, + 50, + 9, +-36, + 46, + 1, +-44, + 23, +-24, +-67, + 89, + 64, + 34, + 6, + 11, + 3, + 30, + 38, + 35, + 8, + 13, + 4, + 20, + 0, +-27, + 22, + -9, +-44, + 31, + 2, +-32, + 26, + -3, +-40, + 32, + 3, +-35, + 29, + -3, +-43, + 8, +-38, +-87, + 27, +-15, +-63, + 21, +-24, +-78, +-30, +-67, +-106, +-48, +-85, +-111, + 6, +-29, +-75, + 11, +-27, +-76, + 38, + -3, +-56, + 43, + 5, +-44, + 24, +-20, +-68, + 25, +-28, +-84, + 63, + 10, +-72, + 50, + -7, +-80, + 45, + -5, +-61, + 53, + 2, +-57, + 46, + -1, +-47, + 50, + 14, +-20, + 37, + 5, +-26, + 46, + 9, +-25, + 48, + 4, +-28, + 45, + 0, +-39, + 46, + 7, +-34, + 33, + -3, +-40, + 27, +-17, +-58, + 12, +-35, +-76, + 2, +-46, +-90, +-25, +-68, +-105, +-53, +-96, +-124, +-77, +-110, +-124, +-32, +-60, +-97, +-45, +-77, +-102, +-79, +-87, +-94, + 68, + 30, +-17, + 51, + 9, +-37, + 50, + 7, +-42, + 41, + -7, +-60, + 47, + -1, +-57, + 40, + -8, +-60, + 51, + 7, +-41, + 50, + 14, +-25, + 67, + 36, + 2, + 59, + 21, +-18, + 61, + 24, +-10, + 48, + 14, +-21, + 64, + 38, + 4, + 40, + 5, +-28, + 44, + 3, +-37, + 45, + 4, +-38, + 43, + 2, +-40, + 40, + -1, +-42, + 40, + 10, +-26, + 36, + 8, +-19, + 42, + 13, +-17, + 46, + 25, + 0, + 36, + 15, +-10, + 37, + 10, +-17, + 37, + 9, +-19, + 30, + -3, +-38, + 24, +-12, +-44, + 27, + -2, +-30, + 22, +-10, +-39, + 12, +-23, +-51, + 28, + 7, +-11, + 25, + 2, +-18, + 18, + -7, +-27, + 26, + 17, + 2, + 9, + 2, +-18, + 9, + 10, + -7, + 22, + 11, +-10, + 16, + 9, + -9, + 23, + 16, + -7, + 22, + 17, + -6, + 29, + 20, + -2, + 30, + 18, + -5, + 15, + 5, +-19, + 10, + 5, +-18, + 20, + 6, +-18, +-63, +-49, +-86, +-61, +-44, +-78, +-23, +-16, +-53, +-28, +-18, +-55, +-30, +-28, +-55, + 17, +-20, +-57, + 50, + 10, +-33, + 50, + 9, +-35, + 21, +-24, +-68, + 87, + 58, + 25, + -2, + -2, +-12, + 23, + 25, + 23, +-20, +-31, +-50, +-10, +-33, +-59, + 15, +-16, +-44, + 12, +-22, +-51, + -3, +-30, +-62, + 11, +-14, +-46, + 28, + 0, +-35, + 38, + 8, +-32, + 30, + -8, +-56, + 27, +-13, +-60, +-22, +-58, +-101, +-40, +-75, +-98, + 20, +-27, +-83, + 21, +-27, +-84, + 26, +-21, +-83, + 12, +-37, +-92, +-18, +-52, +-85, +-26, +-55, +-93, + 34, +-10, +-66, + 50, + 13, +-33, + 42, + 4, +-39, + 55, + 22, +-12, + 44, + 5, +-29, + 24, +-16, +-51, + 30, + 0, +-35, + 35, + 0, +-33, + 48, + 9, +-20, + 35, + -3, +-34, + 37, + -2, +-37, + 38, + -3, +-35, + 49, + 12, +-21, + 49, + 10, +-29, + 55, + 20, +-18, + 57, + 15, +-32, + 46, + 2, +-42, + 28, +-15, +-58, + -4, +-44, +-85, +-40, +-70, +-99, +-62, +-73, +-91, + 45, + 2, +-44, + 45, + -3, +-50, + 54, + 12, +-36, + 49, + 8, +-39, + 62, + 30, + -9, + 63, + 29, +-10, + 53, + 14, +-17, + 36, + 1, +-30, + 31, + -1, +-30, + 32, + 2, +-27, + 39, + 6, +-20, + 37, + 10, +-17, + 24, + -1, +-26, + 43, + 17, + -8, + 58, + 33, + 8, + 59, + 33, + 6, + 51, + 23, + -5, + 51, + 22, +-11, + 47, + 11, +-26, + 36, + 2, +-32, + 25, +-15, +-50, + 24, +-18, +-60, + 31, + -9, +-49, + 30, + -6, +-42, + 24, +-13, +-50, + 27, +-10, +-45, + 32, + -1, +-36, + 31, + 6, +-17, + 37, + 13, + -9, + 44, + 29, + 15, + 17, + 2, +-13, + -9, +-28, +-40, + 9, +-13, +-25, + 15, + 1, +-10, + 11, + 6, +-12, + 13, + 6, +-14, + 14, + 8, +-10, + 18, + 12, + -7, + 11, + 9, + -8, + 13, + 9, +-12, + 16, + 8, +-13, + 21, + 9, +-13, + 7, + 6, + -8, + 3, + -1, +-22, + 18, + 7, +-21, +-35, +-29, +-65, +-51, +-41, +-76, +-18, +-18, +-44, + 23, + 15, +-12, + -1, + -6, +-30, + 13, +-21, +-58, + 50, + 11, +-28, + 49, + 10, +-32, + 21, +-22, +-64, + 96, + 70, + 37, + 4, + 0, +-13, +-23, +-33, +-47, + -7, +-34, +-61, + 9, +-23, +-48, + 12, +-18, +-46, + -3, +-18, +-49, + -5, +-35, +-68, + 8, +-23, +-58, + 31, + -5, +-45, + 15, +-21, +-66, + 28, + -7, +-53, + 25, +-15, +-67, + -9, +-50, +-90, +-42, +-74, +-99, + 17, +-27, +-79, + 13, +-34, +-91, + 18, +-26, +-78, + 14, +-29, +-75, +-13, +-49, +-90, +-61, +-75, +-95, + 32, + -9, +-60, + 38, + 0, +-40, + 29, + -7, +-49, + 42, + 7, +-28, + 20, +-11, +-48, + 9, +-19, +-54, + 34, + -4, +-40, + 49, + 2, +-32, + 42, + -3, +-34, + 14, +-12, +-43, + 19, +-11, +-45, + 44, + 12, +-21, + 51, + 21, +-15, + 46, + 5, +-39, + 46, + 7, +-35, + 33, +-11, +-59, + 25, +-22, +-65, + 39, + -4, +-45, + 5, +-36, +-80, +-40, +-66, +-94, +-93, +-104, +-112, + 56, + 15, +-29, + 50, + 4, +-42, + 50, + 6, +-44, + 56, + 14, +-33, + 67, + 35, + -3, + 53, + 20, +-15, + 67, + 37, + 11, + 41, + 11, +-18, + 25, + 4, +-24, + 36, + 3, +-26, + 53, + 10, +-16, + 47, + 11, +-17, + 32, + 5, +-22, + 30, + -2, +-27, + 42, + 13, +-10, + 56, + 33, + 7, + 43, + 14, +-18, + 50, + 20, +-10, + 37, + -1, +-40, + 34, + -4, +-45, + 27, +-13, +-50, + 23, +-17, +-53, + 21, +-20, +-61, + 23, +-18, +-59, + 28, + -7, +-44, + 18, +-25, +-64, + 29, + -8, +-41, + 32, + 5, +-20, + 27, + 1, +-21, + 35, + 12, + -8, + 25, + -1, +-17, + 3, +-25, +-43, + 5, +-10, +-23, + 27, + 21, + 9, + 21, + 10, +-12, + 6, + 6, + -9, + 17, + 11, + -9, + 12, + 9, + -8, + 14, + 10, + -7, + 22, + 13, + -9, + 15, + 11, + -7, + 23, + 13, + -9, + 7, + 4, +-17, + 11, + 3, +-22, + 16, + 4, +-22, + -8, +-16, +-50, +-36, +-30, +-65, +-33, +-25, +-61, +-52, +-38, +-70, +-28, +-26, +-47, + -5, +-33, +-65, + 46, + 9, +-29, + 45, + 8, +-33, + 15, +-25, +-65, + 94, + 64, + 33, + 11, +-14, +-42, + 26, + 11, +-17, + 23, + 3, +-22, + 22, + 1, +-27, + 28, + 7, +-23, + 33, + 10, +-23, + 13, +-15, +-52, + 9, +-29, +-67, + 2, +-39, +-84, + 15, +-27, +-81, + 10, +-34, +-87, + 15, +-27, +-77, +-11, +-46, +-83, +-38, +-65, +-88, + 26, + -8, +-53, + 25, + -8, +-50, + 23, + 2, +-45, + 30, + 16, +-38, + 62, + 62, + 21, + 59, + 74, + 41, + 59, + 50, + 30, + 59, + 22, + -8, + 79, + 57, + 33, + 57, + 36, + 12, + 35, + 12, +-14, + 42, + 7, +-33, + 32, + -7, +-45, + 42, + 5, +-35, + 41, + 1, +-38, + 58, + 29, + -8, + 44, + 6, +-34, + 33, + -8, +-52, + 34, +-11, +-54, + 33, +-12, +-56, + 32, +-14, +-60, + 42, + 1, +-40, + 48, + 20, +-16, + 30, + -8, +-42, +-12, +-48, +-83, +-31, +-56, +-87, +-75, +-87, +-101, + 44, + 5, +-35, + 55, + 21, +-18, + 56, + 19, +-20, + 50, + 8, +-36, + 49, + 6, +-42, + 47, + 3, +-44, + 55, + 14, +-28, + 67, + 35, + -6, + 74, + 54, + 28, + 65, + 35, + 2, + 57, + 22, + -8, + 56, + 20, +-13, + 65, + 40, + 11, + 59, + 40, + 16, + 44, + 8, +-20, + 47, + 8, +-27, + 46, + 7, +-31, + 35, + -4, +-47, + 37, + -2, +-45, + 42, + 11, +-24, + 43, + 15, +-15, + 39, + 12, +-20, + 49, + 26, + -1, + 38, + 17, + -7, + 42, + 14, +-14, + 31, + -1, +-31, + 39, + 10, +-18, + 28, + -9, +-46, + 30, + -7, +-45, + 24, +-10, +-43, + 24, +-11, +-37, + 19, + -4, +-25, + 31, + 12, + -4, + 5, +-18, +-48, + -4, +-29, +-61, + -5, +-26, +-57, + 0, +-15, +-40, + 4, +-13, +-39, + 3, + -8, +-29, + 4, + -3, +-22, + 13, + 3, +-20, + 18, + 7, +-14, + 3, + -5, +-24, + 2, + -1, +-22, + 8, + -1, +-27, + 39, + 15, +-12, + -1, + -9, +-41, +-39, +-28, +-65, +-20, +-11, +-45, +-32, +-23, +-52, +-25, +-47, +-76, + 41, + 4, +-34, + 43, + 6, +-32, + 5, +-34, +-71, + 82, + 52, + 20, + 14, + 1, +-40, + 41, + 45, + 11, + 57, + 53, + 23, + 67, + 61, + 32, + 17, + 30, + -7, +-19, + 14, +-28, + 23, + 37, + 2, + 44, + 49, + 17, + 40, + 45, + 16, + 22, + 34, + 4, + 4, + 9, +-23, + 13, + 9, +-27, + -9, +-16, +-38, +-35, +-40, +-64, + 11, + 17, +-14, + 35, + 47, + 16, + 85, + 66, +-20, +119, + 89, + 13, +115, +100, + 61, +110, +103, + 83, + 91, + 75, + 49, + 72, + 27, + 12, + 67, + 54, + 37, + 84, + 71, + 54, + 60, + 45, + 28, + 17, +-21, +-65, + 20, +-25, +-73, + 23, +-22, +-71, + 21, +-24, +-69, + 21, +-20, +-62, + 32, + -4, +-40, + 21, +-19, +-58, + 36, + -4, +-46, + 24, +-18, +-58, + 31, + -6, +-40, + 25, + -8, +-40, + 26, + -4, +-32, + 21, + 2, +-18, +-32, +-65, +-95, +-11, +-42, +-72, +-13, +-24, +-52, + 18, + -2, +-31, + 35, + 3, +-32, + 35, + 2, +-34, + 49, + 15, +-19, + 47, + 5, +-38, + 56, + 17, +-26, + 49, + 9, +-27, + 53, + 20, +-12, + 47, + 8, +-29, + 47, + 8, +-33, + 55, + 14, +-28, + 53, + 12, +-31, + 50, + 13, +-29, + 51, + 14, +-21, + 59, + 27, + -9, + 53, + 20, +-14, + 60, + 24, +-14, + 46, + 6, +-33, + 44, + 14, +-15, + 39, + 11, +-15, + 33, + 8, +-16, + 29, + 14, + -7, + 11, + 4, +-13, + 10, + 4, +-11, + 17, + 9, + -6, + 21, + 7, +-10, + 36, + 8, +-16, + 39, + 10, +-14, + 36, + 8, +-18, + 35, + 3, +-27, + 35, + 4, +-29, + 28, + -3, +-31, + 23, + -9, +-36, + 7, +-12, +-44, + -4, +-15, +-42, + 3, +-12, +-40, + 8, + -9, +-43, + -5, +-21, +-50, + -5, +-23, +-55, + -8, +-35, +-72, + 0, +-32, +-72, +-10, +-31, +-65, +-10, +-36, +-72, +-11, +-29, +-56, + -7, +-23, +-48, + 41, + 16, +-10, + 44, + 21, + -4, + 22, + 10, +-19, +-21, +-15, +-50, +-37, +-25, +-56, +-43, +-54, +-82, + 39, + 3, +-33, + 43, + 5, +-32, + 0, +-39, +-76, + 76, + 47, + 18, + 28, + 10, +-35, + -9, + 12, +-30, + 46, + 46, + 16, + 87, + 71, + 49, + 80, + 68, + 46, + 39, + 42, + 11, + 13, + 29, + -8, + 53, + 57, + 32, + 24, + 42, + 14, + 43, + 49, + 24, + 69, + 67, + 44, + 33, + 41, + 8, + 50, + 57, + 32, + 71, + 74, + 55, + 74, + 77, + 61, + 29, + 34, +-14, +109, + 54, +-74, +117, + 83, + 3, +113, + 88, + 38, +100, + 87, + 65, + 73, +-23, +-46, + 94, + 63, + 41, +105, + 93, + 77, +103, + 92, + 74, + 61, + 42, + 27, + 17, +-23, +-67, + 8, +-39, +-88, + 16, +-24, +-68, + 19, +-18, +-55, + 13, +-28, +-73, + 32, + -7, +-46, + 40, + 9, +-27, + 28, + -2, +-34, + 26, + 4, +-24, + 5, +-10, +-34, +-11, +-18, +-37, +-13, +-22, +-47, + -6, +-24, +-56, +-34, +-66, +-97, + 6, +-30, +-62, + 29, +-12, +-44, + -4, +-22, +-55, + -8, +-15, +-39, + 14, + 8, +-11, + 19, + 2, +-22, + 48, + 30, + 3, + 61, + 34, + 4, + 65, + 41, + 8, + 55, + 20, +-18, + 48, + 11, +-29, + 60, + 31, + 4, + 51, + 13, +-22, + 51, + 11, +-33, + 65, + 36, + 4, + 53, + 18, +-18, + 63, + 32, + -1, + 68, + 46, + 24, + 70, + 50, + 28, + 66, + 45, + 22, + 43, + 32, + 16, + 42, + 37, + 26, + 18, + 14, + -1, + 9, + -1, +-22, + 30, + 11, + -8, + 31, + 8, +-14, + 31, + 1, +-19, + 10, +-15, +-39, + 2, + -8, +-31, + 4, + -5, +-17, + 29, + 16, + -2, + 28, + 10, + -6, + 47, + 24, + 0, + 42, + 23, + 5, + 35, + 9, +-14, +-14, +-33, +-63, +-19, +-34, +-60, + -7, +-19, +-44, + 1, +-13, +-40, +-13, +-26, +-49, +-13, +-25, +-52, +-13, +-32, +-56, +-12, +-24, +-51, +-29, +-43, +-65, +-18, +-38, +-60, + -3, +-30, +-65, +-20, +-44, +-78, + 40, + 14, +-12, + 44, + 21, + -4, + 46, + 27, + 2, + 49, + 32, + 7, + 34, + 21, + -3, +-14, +-30, +-51, + 36, + -1, +-36, + 43, + 8, +-26, + -3, +-38, +-75, + 81, + 50, + 19, + 62, + 37, + 5, + 59, + 53, + 29, + 51, + 48, + 23, + 53, + 50, + 24, + 63, + 57, + 32, + 69, + 62, + 35, + 69, + 60, + 33, + 54, + 52, + 25, + 73, + 66, + 43, + 80, + 76, + 53, + 86, + 84, + 67, + 88, + 83, + 67, + 70, + 75, + 62, + 54, + 73, + 55, + 61, + 71, + 60, + 90, + 58, + 40, + 93, + 17, +-125, +102, + 64, +-18, + 89, + 58, + 8, + 85, + 54, + 38, + 81, + 37, + 21, +102, + 84, + 63, + 87, + 68, + 47, + 94, + 79, + 62, + 33, + 9, +-11, + 16, +-23, +-66, + 12, +-32, +-74, + 27, +-11, +-51, + 16, +-24, +-67, + 14, +-23, +-62, + 24, +-10, +-47, + 3, +-35, +-72, + 22, +-16, +-55, + 18, +-23, +-62, + 31, + -3, +-38, + 20, + -9, +-38, + 36, + 11, +-14, + 10, + -4, +-26, +-57, +-82, +-101, + -9, +-33, +-56, + 3, +-14, +-41, + 31, + 10, +-14, + 36, + 5, +-25, + 49, + 20, +-10, + 46, + 12, +-22, + 45, + 7, +-31, + 48, + 14, +-22, + 49, + 19, +-13, + 63, + 39, + 11, + 57, + 23, +-10, + 67, + 36, + 0, + 57, + 22, +-16, + 56, + 17, +-25, + 65, + 39, + 8, + 55, + 23, + -6, + 61, + 39, + 14, + 66, + 46, + 22, + 52, + 21, +-14, + 61, + 31, + 2, + 56, + 28, + 3, + 54, + 27, + 3, + 49, + 23, + -4, + 28, + 5, +-15, + 16, + 7, + -7, + 4, + -3, +-24, + 23, + 12, +-11, + 13, + 3, +-21, + 12, + 0, +-20, + 33, + 11, +-13, + 45, + 24, + 1, + 35, + 9, +-15, + 43, + 20, + -8, + 38, + 12, +-13, + 30, + 4, +-18, +-23, +-39, +-63, +-14, +-26, +-51, +-10, +-24, +-50, + -3, +-22, +-47, +-20, +-34, +-61, + -8, +-23, +-52, +-30, +-42, +-64, +-11, +-28, +-53, +-23, +-40, +-69, +-32, +-53, +-78, +-18, +-34, +-60, +-26, +-42, +-67, + 38, + 12, +-13, + 43, + 19, + -6, + 45, + 25, + 0, + 27, + 14, + -8, + 48, + 32, + 12, +-10, +-21, +-39, + 32, + -5, +-41, + 43, + 10, +-25, + 6, +-31, +-68, + 80, + 50, + 21, + 46, + 18, +-19, + 31, + 34, + -1, + 44, + 47, + 14, + 59, + 57, + 26, + 47, + 49, + 16, + 24, + 35, + -2, + 40, + 37, + 1, + 86, + 74, + 54, +100, + 94, + 81, +104, + 99, + 90, +105, + 97, + 84, + 96, + 73, + 35, + 72, + 76, + 66, + 46, + 59, + 46, + 32, + 47, + 36, + 76, + 41, + 29, + 72, + 5, +-100, + 67, + 32, +-44, + 67, + 11, +-22, + 72, + 16, + 3, + 67, + 38, + 18, + 51, + 29, + 9, + 53, + 37, + 22, + 93, + 83, + 69, +-22, +-56, +-92, + 6, +-28, +-64, + 10, +-27, +-62, + 4, +-34, +-68, + 16, +-14, +-42, +-15, +-62, +-106, + 15, +-24, +-66, + 19, +-18, +-57, + 11, +-30, +-74, + 19, +-24, +-65, + 26, +-14, +-54, + 27, + -6, +-42, + 22, +-13, +-41, + 39, + 11, +-15, +-69, +-87, +-96, + 7, +-15, +-38, + 43, + 13, +-18, + 35, + -3, +-37, + 50, + 18, +-18, + 44, + 4, +-36, + 51, + 12, +-28, + 54, + 12, +-38, + 51, + 13, +-28, + 57, + 23, +-16, + 28, +-22, +-75, + 46, + 15, +-17, + 53, + 19, +-14, + 48, + 10, +-27, + 57, + 24, + -7, + 51, + 11, +-32, + 70, + 44, + 14, + 45, + 9, +-28, + 52, + 9, +-38, + 65, + 38, + 7, + 57, + 22, +-12, + 69, + 33, + -8, + 68, + 36, + 0, + 50, + 18, +-11, + 58, + 33, + 9, + 49, + 24, + -4, + 53, + 35, + 13, + 28, + 14, + -2, + 42, + 25, + 3, + 51, + 27, + 3, + 48, + 22, + -8, + 44, + 12, +-22, + 39, + 1, +-33, + 36, + 0, +-37, + 35, + 4, +-26, + 41, + 13, +-20, +-32, +-49, +-74, +-13, +-26, +-55, +-23, +-34, +-55, + -5, +-19, +-47, +-25, +-38, +-55, + -7, +-22, +-43, +-28, +-43, +-64, +-14, +-32, +-57, +-24, +-38, +-64, +-26, +-45, +-68, +-22, +-41, +-67, +-33, +-44, +-72, + 31, + 7, +-18, + 41, + 17, + -7, + 44, + 23, + -1, + 9, + 1, +-23, + 45, + 30, + 11, + -6, +-10, +-26, + 17, +-20, +-51, + 44, + 10, +-25, + 15, +-24, +-60, + 71, + 48, + 24, + 49, + 19, +-21, + 19, + 27, + -5, + 32, + 35, + 3, + 53, + 48, + 18, + 37, + 32, + -8, + 48, + 38, + -5, + 78, + 61, + 33, + 95, + 89, + 76, +102, + 97, + 90, +101, + 95, + 85, +100, + 88, + 78, + 85, + 31, +-41, + 62, + 64, + 55, + 13, + 26, + 10, + 24, + 32, + 21, + 30, +-24, +-63, + 36, + 8, +-59, +-21, + 10, +-33, + 33, + 3, +-42, + 84, + 50, +-12, + 87, + 46, +-17, + 57, + 44, + 30, + 53, + 40, + 25, + 74, + 65, + 54, + 54, +-38, +-59, + 52, +-25, +-48, + 37, +-14, +-38, + 4, +-25, +-51, + -9, +-26, +-52, + 15, + -7, +-36, + 18, +-10, +-39, + 22, +-12, +-46, + 7, +-32, +-69, + 7, +-39, +-87, + 13, +-29, +-74, + 11, +-33, +-79, + 26, + -5, +-34, + 37, + 5, +-31, +-49, +-79, +-100, + 14, +-12, +-42, + 45, + 10, +-30, + 33, + -3, +-41, + 37, + -7, +-55, + 38, + -3, +-54, + 42, + -5, +-57, + 46, + 7, +-30, + 61, + 28, + -9, + 53, + 25, + -8, + 48, + 28, + 4, + 47, + 33, + 7, + 58, + 28, + 2, + 58, + 17, + -8, + 55, + 8, +-13, + 70, + 41, + 19, + 56, + 42, + 21, + 62, + 46, + 26, + 58, + 36, + 14, + 62, + 37, + 9, + 64, + 30, + -3, + 57, + 23, +-11, + 51, + 9, +-39, + 61, + 28, +-11, + 50, + 12, +-30, + 57, + 23, + -8, + 57, + 32, + 6, + 62, + 36, + 7, + 55, + 30, + 2, + 50, + 17, +-17, + 34, + -2, +-32, + 37, + 5, +-29, + 36, + -5, +-45, + 20, +-23, +-66, + 32, + -2, +-35, + 40, + 8, +-23, +-32, +-51, +-77, + -8, +-20, +-44, +-21, +-34, +-57, + -8, +-23, +-47, +-23, +-36, +-54, +-24, +-33, +-59, +-42, +-54, +-73, +-15, +-30, +-55, +-32, +-47, +-69, +-38, +-53, +-75, +-13, +-31, +-57, +-40, +-54, +-74, + 15, + -2, +-30, + 39, + 15, + -9, + 34, + 15, + -9, + 7, + 2, +-24, + 35, + 22, + 1, + -2, + -5, +-24, + 6, +-32, +-61, + 45, + 11, +-24, + 21, +-18, +-55, + 60, + 42, + 24, + 56, + 27, + -5, + 18, +-18, +-54, + 28, +-19, +-61, + 60, + 4, +-63, + 42, + -2, +-59, + 39, + 5, +-28, + 91, + 79, + 63, + 90, + 85, + 73, + 89, + 79, + 58, + 89, + 86, + 76, + 69, + 8, +-20, + 64, + 18, +-94, + 14, + 19, + 9, + 37, + 43, + 37, + 36, + 32, + 16, + 67, +-17, +-104, + -2, +-11, +-49, + 30, + 7, +-30, + 83, + 31, +-60, + 99, + 59, +-62, + 98, + 61, +-17, + 61, + 54, + 40, + 56, + 43, + 27, + 65, + 54, + 42, + 24, + 17, +-11, + 79, + 24, + 13, + 83, + -2, +-14, + 88, + 10, + -3, + 68, + 30, + 12, + 40, + 9, +-16, + 19, +-13, +-42, + 3, +-36, +-71, + 31, + 2, +-30, + 12, +-26, +-64, + 24, +-10, +-47, + 9, +-32, +-71, + -3, +-55, +-101, + 6, +-42, +-91, +-94, +-99, +-95, + -3, +-38, +-72, + 15, +-32, +-79, + 25, +-21, +-66, + 44, + 6, +-33, + 42, + 8, +-29, + 57, + 25, +-15, + 63, + 34, + 3, + 50, + 22, + -5, + 54, + 18, + -9, + 51, + 15, +-11, + 44, + 10, +-16, + 36, + 12, +-12, + 45, + 20, + -1, + 41, + 16, + -2, + 46, + 32, + 12, + 33, + 4, +-20, + 44, + 14, +-12, + 58, + 27, + 4, + 73, + 51, + 31, + 59, + 32, + 5, + 68, + 48, + 25, + 66, + 38, + 7, + 57, + 25, + -6, + 62, + 29, + -4, + 51, + 4, +-39, + 45, + -2, +-42, + 53, + 10, +-40, + 47, + 6, +-41, + 38, + -3, +-45, + 28, +-15, +-56, + 24, +-16, +-51, + 23, +-12, +-41, + 31, + -2, +-35, + 49, + 24, + -3, + 45, + 19, +-11, +-28, +-45, +-70, +-10, +-22, +-45, +-26, +-35, +-56, + 1, +-12, +-40, +-25, +-37, +-56, +-11, +-29, +-54, +-34, +-43, +-61, +-18, +-31, +-58, +-37, +-53, +-74, +-40, +-53, +-77, +-28, +-43, +-69, +-33, +-52, +-73, +-12, +-19, +-50, + 34, + 12, +-13, + 18, + 2, +-23, + 3, + -1, +-28, + 24, + 17, + -6, + -4, + -4, +-25, + -5, +-40, +-70, + 45, + 12, +-23, + 24, +-15, +-54, + 38, + 20, + 2, + 64, + 36, + 7, + 63, + 8, +-44, + 59, + 10, +-33, + 76, + 37, + -2, + 45, + 1, +-42, + 50, + 14, +-20, + 59, + 24, +-22, + 88, + 64, + 20, + 81, + 72, + 53, + 77, + 58, + 43, + 45, + 17, +-59, + 36, + 39, + 14, + 61, + 65, + 58, + 49, + 45, + 38, + 42, + 19, + -7, + 41, + 16, +-26, + 28, + 34, + -4, + 14, + 35, + 1, + 16, + 36, + 5, + 51, + 54, + 29, +-17, + 21, +-26, + 59, + 52, + 39, + 48, + 35, + 18, + 59, + 47, + 30, + 51, + 55, + 34, + 81, + 83, + 68, +103, + 97, + 85, +102, + 84, + 70, +100, + 66, + 58, +103, + 88, + 77, +100, + 89, + 73, + 66, + 49, + 30, + 9, +-22, +-55, + 11, +-31, +-73, + 12, +-28, +-72, + 23, +-21, +-63, + 22, +-20, +-65, + 20, +-26, +-71, +-78, +-87, +-86, + 5, +-30, +-59, + 43, + 2, +-42, + 43, + -2, +-56, + 41, + -3, +-49, + 50, + 10, +-34, + 52, + 17, +-23, + 65, + 39, + 8, + 58, + 28, + -6, + 62, + 34, + 11, + 47, + 12, +-13, + 20, +-11, +-37, + 36, + 21, + -4, + 61, + 35, + 13, + 49, + 17, + -3, + 65, + 33, + 8, + 32, + 12, +-15, + 36, + 1, +-28, + 50, + 21, + -7, + 60, + 31, + 9, + 69, + 45, + 15, + 64, + 39, + 10, + 74, + 54, + 28, + 66, + 30, + -9, + 59, + 22, +-19, + 46, + 3, +-40, + 48, + 6, +-37, + 47, + 4, +-41, + 56, + 14, +-35, + 54, + 11, +-38, + 49, + 9, +-31, + 40, + -1, +-42, + 20, +-20, +-58, + 33, + 0, +-35, + 45, + 21, + -4, + 16, +-18, +-46, +-29, +-46, +-71, +-12, +-23, +-43, +-25, +-33, +-58, +-15, +-28, +-52, +-29, +-38, +-58, +-14, +-28, +-49, +-34, +-44, +-65, +-24, +-36, +-57, +-43, +-57, +-78, +-36, +-50, +-76, +-31, +-45, +-70, +-47, +-64, +-85, +-19, +-21, +-55, + -4, +-12, +-40, + 0, +-12, +-36, +-19, +-16, +-41, + 8, + 8, +-17, + -7, + -6, +-28, +-13, +-45, +-74, + 40, + 6, +-27, + 29, + -8, +-46, + 24, + -1, +-21, + 90, + 66, + 40, + 59, + 23, +-12, + 68, + 33, + 0, + 73, + 43, + 15, + 89, + 63, + 38, + 71, + 46, + 20, + 50, + 1, +-77, + 90, + 51, +-44, + 92, + 63, + 15, + 17, + 12, +-44, +-49, + 2, +-33, + 1, + -3, +-27, + 31, +-12, +-60, + 51, + -2, +-67, + 62, + 19, +-25, + 62, + 29, + -8, + 61, + 35, + 5, + 49, + 30, + -1, + 47, + 32, + 3, + 51, + 42, + 17, + 5, + 27, +-10, + 52, + 46, + 31, + 52, + 38, + 22, + 68, + 54, + 38, + 58, + 58, + 40, + 86, + 86, + 77, +103, + 99, + 93, +104, + 99, + 93, +104, +100, + 91, +106, + 99, + 93, + 95, + 88, + 76, + 60, + 15, + -8, +-17, +-59, +-100, + 1, +-40, +-85, + 19, +-22, +-66, + 21, +-20, +-57, + 34, + -6, +-49, + 53, + 22, +-12, + 24, + -4, +-30, + 44, + 21, + -5, + 46, + 9, +-33, + 45, + 7, +-38, + 48, + 9, +-34, + 44, + 0, +-50, + 42, + -5, +-63, + 58, + 15, +-35, + 58, + 19, +-24, + 55, + 25, + -8, + 49, + 26, + 1, + 59, + 44, + 19, + 62, + 40, + 18, + 56, + 12, +-12, + 64, + 15, + -8, + 68, + 27, + 4, + 76, + 55, + 32, + 58, + 45, + 18, + 66, + 51, + 27, + 56, + 32, + 7, + 60, + 30, + -3, + 63, + 28, +-11, + 58, + 21, +-22, + 61, + 18, +-38, + 69, + 30, +-22, + 64, + 28, +-13, + 66, + 34, + -5, + 65, + 35, + 2, + 72, + 48, + 21, + 64, + 40, + 13, + 63, + 33, + 2, + 58, + 25, +-11, + 41, + 4, +-28, + 23, +-18, +-55, + 19, +-27, +-73, + 27, + -6, +-43, +-36, +-52, +-82, +-11, +-22, +-41, +-25, +-35, +-52, +-20, +-30, +-51, +-30, +-36, +-58, +-16, +-24, +-45, +-40, +-50, +-70, +-29, +-40, +-60, +-32, +-51, +-71, +-49, +-61, +-84, +-22, +-34, +-55, +-44, +-60, +-83, +-21, +-22, +-55, +-16, +-17, +-48, +-44, +-40, +-71, +-56, +-46, +-74, + -3, + 0, +-26, +-11, + -8, +-31, +-23, +-44, +-68, + 38, + 4, +-29, + 29, + -7, +-44, + 5, +-33, +-67, + 71, + 47, + 25, + 91, + 64, + 37, + 92, + 60, + 31, + 89, + 53, + 16, + 85, + 50, + 9, + 88, + 62, + 20, + 58, + 20, +-14, + 30, +-16, +-77, + 41, + -4, +-92, + 27, +-31, +-98, + 41, +-19, +-121, + 64, + 6, +-74, + 72, + 41, + 11, + 82, + 67, + 48, + 86, + 74, + 57, + 86, + 76, + 63, + 86, + 77, + 63, + 78, + 72, + 56, + 48, + 45, + 25, + 58, + 43, + 19, + 38, + 16, +-15, + 48, + 38, + 22, + 60, + 49, + 32, + 63, + 50, + 34, + 58, + 49, + 33, + 98, + 88, + 73, + 66, + 53, + 45, + 87, + 85, + 79, +103, + 99, + 93, +101, + 89, + 72, +100, + 52, + -8, + 74, + 16, + 9, + 3, +-35, +-70, +-10, +-49, +-89, + -1, +-34, +-70, + 16, +-16, +-47, + 41, + 10, +-20, + 44, + 23, + -1, +-10, +-40, +-65, + 36, + 12, +-14, + 57, + 29, + -2, + 51, + 18, +-13, + 51, + 18, +-21, + 50, + 10, +-32, + 55, + 16, +-25, + 49, + 3, +-50, + 52, + 11, +-31, + 54, + 18, +-18, + 51, + 2, +-53, + 48, + 7, +-30, + 67, + 45, + 21, + 54, + 14, +-32, + 71, + 44, + 7, + 63, + 32, + -5, + 53, + 10, +-38, + 78, + 60, + 33, + 47, + 5, +-31, + 60, + 13, +-38, + 57, + 22, +-12, + 67, + 30, +-10, + 60, + 17, +-35, + 67, + 30, +-12, + 68, + 33, + -5, + 72, + 47, + 16, + 57, + 26, + -4, + 72, + 48, + 22, + 70, + 54, + 36, + 55, + 43, + 27, + 72, + 55, + 34, + 51, + 21, + -5, + 66, + 41, + 17, + 60, + 26, +-16, + 37, + -1, +-37, + 25, + -8, +-43, +-45, +-59, +-84, +-27, +-40, +-62, +-27, +-36, +-54, +-30, +-40, +-62, +-22, +-35, +-56, +-30, +-43, +-61, +-30, +-41, +-62, +-29, +-40, +-60, +-46, +-59, +-79, +-46, +-57, +-80, +-36, +-51, +-74, +-53, +-68, +-90, +-36, +-36, +-67, +-10, +-13, +-43, +-41, +-36, +-65, +-103, +-70, +-104, +-15, +-10, +-35, +-15, +-11, +-35, +-36, +-47, +-69, + 36, + 3, +-31, + 33, + -4, +-40, + 29, + -6, +-33, + 54, + 17, +-15, + 58, + 24, + -8, + 48, + 11, +-21, + 69, + 40, + 14, + 83, + 62, + 37, + 64, + 34, + 8, + 57, + 11, +-21, + 52, + -9, +-80, + 54, +-15, +-128, + 65, + 3, +-128, + 75, + 36, + -6, + 80, + 49, + 30, + 88, + 57, + 41, + 86, + 58, + 44, + 85, + 63, + 50, + 87, + 67, + 56, + 87, + 73, + 61, + 56, + 59, + 42, + 78, + 77, + 64, + 93, + 88, + 78, + 81, + 76, + 67, + 25, + 20, + 7, + 51, + 46, + 31, + 61, + 46, + 28, + 57, + 41, + 23, + 65, +-33, +-43, + 44, +-64, +-66, + 2, +-66, +-68, + 59, + 32, + 3, +100, + 53, +-34, + 97, + 21, + 16, + 93, + 57, + 49, + 6, +-30, +-59, + 5, +-27, +-57, + 4, +-30, +-65, +-13, +-41, +-72, +-19, +-33, +-57, +-14, +-17, +-36, +-17, +-51, +-82, + -4, +-17, +-33, + 27, + 20, + 8, + 45, + 20, + -2, + 57, + 27, + -3, + 56, + 25, + -4, + 44, + 9, +-19, + 61, + 21, +-20, + 75, + 39, + -3, + 50, + 11, +-31, + 60, + 31, + 3, + 37, +-10, +-48, + 61, + 18, +-31, + 58, + 19, +-23, + 58, + 11, +-43, + 58, + 17, +-27, + 68, + 36, + -5, + 53, + 12, +-30, + 48, + 1, +-48, + 70, + 39, + 4, + 60, + 22, +-14, + 72, + 39, + -4, + 69, + 30, +-16, + 62, + 27, + -5, + 49, + 12, +-19, + 69, + 39, + 4, + 56, + 33, + 11, + 56, + 50, + 37, + 31, + 30, + 18, + 38, + 34, + 20, + 32, + 31, + 16, + 39, + 33, + 19, + 57, + 48, + 33, + 63, + 35, + 6, + 49, + 20, + -7, + 31, + 1, +-26, + 9, +-16, +-46, +-29, +-44, +-67, +-44, +-57, +-78, +-29, +-42, +-67, +-24, +-38, +-60, +-20, +-30, +-54, +-47, +-56, +-80, +-26, +-38, +-65, +-54, +-67, +-83, +-45, +-58, +-77, +-34, +-50, +-75, +-57, +-68, +-91, +-16, +-28, +-54, +-21, +-22, +-54, +-35, +-32, +-61, +-113, +-73, +-110, +-26, +-19, +-45, +-19, +-14, +-38, +-48, +-58, +-79, + 37, + 3, +-30, + 30, + -7, +-40, + 20, +-13, +-38, + 93, + 70, + 47, + 85, + 62, + 39, + 78, + 53, + 28, + 62, + 25, +-20, + 51, + 7, +-55, + 37, +-31, +-81, + 37, +-60, +-128, + 53, +-32, +-128, + 63, + -8, +-128, + 70, + 18, +-42, + 61, +-10, +-24, + 76, + -1, +-14, + 76, + 6, + -6, + 83, + 28, + 17, + 90, + 53, + 43, + 89, + 64, + 53, + 90, + 70, + 60, + 78, + 67, + 55, + 78, + 75, + 66, + 94, + 89, + 83, + 95, + 92, + 86, + 56, + 53, + 45, + 18, + 20, + 12, + 36, + 25, + 8, + 62, + 50, + 32, + 62, + 25, + 10, + 30, +-30, +-39, +-10, +-104, +-113, + 40, +-24, +-28, + 94, + 59, + 57, + 87, + 51, + 49, + 86, + 31, + 22, + 5, +-19, +-47, + 0, +-15, +-40, + -8, +-21, +-45, + 1, +-21, +-52, +-32, +-52, +-83, +-35, +-64, +-92, +-14, +-52, +-76, + 32, + -1, +-26, + 30, + 9, +-17, + 37, + 24, + -7, + 39, + 34, + 19, + 55, + 48, + 32, + 52, + 33, + 11, + 68, + 51, + 27, + 74, + 50, + 21, + 72, + 46, + 20, + 70, + 44, + 19, + 75, + 44, + 10, + 63, + 30, + -2, + 68, + 41, + 13, + 69, + 35, + -5, + 57, + 14, +-39, + 75, + 49, + 17, + 66, + 37, + 9, + 75, + 48, + 16, + 77, + 57, + 31, + 71, + 46, + 21, + 79, + 59, + 32, + 73, + 47, + 21, + 64, + 43, + 18, + 71, + 58, + 38, + 55, + 48, + 32, + 37, + 30, + 13, + 39, + 25, + -3, + 43, + 30, + 7, + 50, + 25, + -5, + 29, + 8, +-19, + 49, + 13, +-11, + 34, + 16, +-13, + 53, + 44, + 19, + 46, + 41, + 25, + 75, + 60, + 39, + 40, + 15, +-13, + 61, + 31, + -5, + 51, + 20, +-17, + 33, + 4, +-31, + -2, +-33, +-69, +-13, +-49, +-87, +-30, +-62, +-94, +-44, +-67, +-92, +-55, +-76, +-93, +-58, +-72, +-91, +-32, +-48, +-69, +-61, +-74, +-96, +-32, +-36, +-63, +-37, +-35, +-65, +-27, +-23, +-55, +-114, +-82, +-112, +-35, +-28, +-53, +-34, +-28, +-50, +-67, +-68, +-90, + 33, + 0, +-32, + 29, + -8, +-41, + 0, +-35, +-65, + 93, + 68, + 43, + 85, + 61, + 34, + 53, + 4, +-86, + 61, + 12, +-84, + 64, + 19, +-71, + 72, + 37, +-19, + 63, + 16, +-10, + 55, +-37, +-103, + 64, +-18, +-128, + 41, +-49, +-86, + 58, +-42, +-52, + 60, +-32, +-46, + 72, +-18, +-29, + 73, +-14, +-23, + 85, + 16, + 7, + 91, + 55, + 46, + 93, + 62, + 54, + 92, + 75, + 66, + 33, + 51, + 37, + 83, + 83, + 75, + 93, + 91, + 85, + 77, + 75, + 69, + -9, + -7, +-13, + -3, + -4, +-17, + 64, + 50, + 33, + 68, + 51, + 33, + 51, + 30, + 15, + 63, + 54, + 53, + 66, + 18, + 21, + 80, + 23, + 27, + 83, + 72, + 68, + 81, + 52, + 41, + 15, + -8, +-38, + 15, + -4, +-30, + 13, + -5, +-33, + 2, +-18, +-50, + -4, +-29, +-59, +-18, +-44, +-70, +-19, +-33, +-61, + 24, + -1, +-31, + 36, + 16, +-13, + 24, + 10, +-20, + 35, + 30, + 13, + 60, + 47, + 28, + 50, + 32, + 12, + 65, + 46, + 23, + 74, + 48, + 21, + 79, + 59, + 32, + 80, + 56, + 23, + 70, + 40, + 6, + 68, + 36, + 4, + 72, + 47, + 22, + 77, + 50, + 14, + 65, + 25, +-29, + 77, + 46, + 11, + 72, + 47, + 23, + 66, + 34, + -2, + 74, + 44, + 9, + 77, + 59, + 32, + 74, + 53, + 28, + 77, + 57, + 28, + 70, + 53, + 31, + 50, + 37, + 18, + 56, + 50, + 36, + 48, + 43, + 30, + 43, + 35, + 11, + 42, + 18, +-10, + 68, + 41, + 11, + 42, + 23, + -3, + 50, + 12, +-15, + 44, + 22, +-10, + 30, + 19, + -5, + 26, + 21, + 9, + 43, + 38, + 22, + 57, + 45, + 24, + 55, + 32, + 4, + 64, + 32, + -3, + 69, + 41, + 5, + 53, + 20, +-21, + 44, + 3, +-37, + 32, +-10, +-50, + 42, + 4, +-38, + 23, +-19, +-61, + 11, +-35, +-83, + 8, +-29, +-68, + -1, +-33, +-66, +-88, +-74, +-101, +-60, +-54, +-80, +-25, +-21, +-53, +-65, +-57, +-80, +-44, +-35, +-58, +-38, +-30, +-52, +-53, +-50, +-68, + 28, + -5, +-37, + 27, +-12, +-44, + 0, +-38, +-68, + 79, + 52, + 29, + 91, + 67, + 43, + 55, + 5, +-82, + 63, + 14, +-86, + 68, + 25, +-69, + 76, + 38, +-38, + 80, + 53, + 4, + 85, + 74, + 52, + 69, + 28, +-15, +-15, +-48, +-80, + 5, +-39, +-65, + 61, + 3, + -6, + 67, + 8, + -3, + 68, + 0, + -8, + 70, + -7, +-13, + 87, + 33, + 29, + 92, + 77, + 72, + 94, + 81, + 74, + 79, + 58, + 52, + 30, + 47, + 36, + 81, + 77, + 73, + 36, + 53, + 40, + 35, + 41, + 30, + -6, + -4, +-14, + 34, + 17, + -2, + 56, + 42, + 24, + 69, + 52, + 32, + 48, + 8, + -4, + 70, + 31, + 35, + 60, + 14, + 14, + 76, + 59, + 54, + 54, + 24, + 7, + 23, +-16, +-57, + 22, +-15, +-56, + 19, +-19, +-53, + 26, + 14, + -9, + 6, + 0, +-18, + 5, + 2, +-18, + 39, + 30, + 8, + 31, + 28, + 9, + 37, + 33, + 21, + 64, + 43, + 23, + 63, + 34, + 5, + 69, + 41, + 10, + 64, + 31, + -4, + 68, + 32, + -7, + 76, + 44, + 11, + 40, + -1, +-37, + 78, + 54, + 24, + 62, + 29, + -4, + 62, + 21, +-29, + 76, + 42, + -8, + 59, + 19, +-34, + 47, + 5, +-33, + 75, + 42, + -2, + 68, + 38, + 1, + 61, + 24, +-22, + 56, + 23, + -8, + 80, + 60, + 34, + 59, + 24, +-18, + 57, + 22, +-13, + 72, + 42, + 3, + 66, + 39, + 9, + 70, + 40, + 11, + 71, + 42, + 12, + 61, + 32, + 3, + 36, + 34, + 23, + 23, + 23, + 6, + 45, + 39, + 13, + 49, + 44, + 17, + 29, + 29, + 8, + 39, + 35, + 20, + 51, + 27, + 0, + 73, + 52, + 24, + 61, + 33, + 3, + 58, + 26, + -8, + 70, + 37, + -4, + 48, + 10, +-30, + 33, +-10, +-49, + 55, + 20, +-16, + 25, +-19, +-60, + 28, +-17, +-58, + 39, + -2, +-43, + 34, +-10, +-59, + 27, +-19, +-67, + 18, +-28, +-71, +-47, +-45, +-74, +-92, +-77, +-102, +-41, +-34, +-61, +-38, +-32, +-58, +-57, +-47, +-66, +-42, +-34, +-54, +-56, +-48, +-62, + 18, +-15, +-47, + 27, +-13, +-44, + 4, +-35, +-67, + 65, + 38, + 16, + 91, + 68, + 45, + 58, + 8, +-65, + 66, + 19, +-97, + 73, + 30, +-81, + 80, + 40, +-46, + 80, + 44, +-28, + 80, + 48, +-15, + 35, + 24, +-22, +-10, + 8, +-15, + 11, + 27, + 5, + 24, + 30, + 16, + 80, + 75, + 63, + 83, + 78, + 67, + 87, + 78, + 70, + 85, + 77, + 71, + 85, + 80, + 77, + 87, + 81, + 78, + 55, + 62, + 56, + 18, + 36, + 28, + 60, + 50, + 50, + -6, + 25, + 4, + 65, + 70, + 63, + 28, + 34, + 26, + -1, + -6, +-17, + 45, + 29, + 12, + 54, + 40, + 24, + 59, + 34, + 14, + 41, +-29, +-30, + 48, + 40, + 37, + 39, +-12, +-17, + 46, + 9, +-32, + 25, +-16, +-65, + 22, +-22, +-67, + 33, + -3, +-42, + 21, +-17, +-49, + 51, + 30, + 3, + 39, + 28, + 10, + 50, + 41, + 27, + 68, + 53, + 31, + 59, + 35, + 7, + 67, + 36, + 6, + 62, + 19, +-31, + 64, + 23, +-22, + 72, + 39, + 2, + 75, + 37, +-22, + 67, + 32, + -4, + 71, + 46, + 15, + 73, + 38, +-11, + 57, + 4, +-55, + 67, + 39, + 12, + 68, + 39, + 3, + 54, + 16, +-23, + 63, + 29, + -3, + 58, + 24, +-13, + 58, + 21, +-19, + 77, + 54, + 26, + 51, + 7, +-39, + 62, + 16, +-44, + 67, + 31, + -8, + 71, + 43, + 9, + 60, + 19, +-28, + 72, + 40, + -4, + 67, + 35, + -7, + 64, + 26, +-21, + 67, + 35, + -3, + 66, + 42, + 15, + 70, + 46, + 23, + 68, + 59, + 40, + 34, + 34, + 23, + 57, + 46, + 28, + 70, + 43, + 14, + 59, + 24, + -9, + 66, + 30, +-16, + 60, + 18, +-31, + 63, + 30, +-11, + 65, + 25, +-31, + 60, + 23, +-23, + 57, + 20, +-22, + 53, + 13, +-36, + 41, + -3, +-58, + 48, + 12, +-24, + 49, + 14, +-25, + 42, + 2, +-44, + 35, + -7, +-54, + 17, +-29, +-68 +}; diff --git a/examples/app_flash_two_models/src/image2.h b/examples/app_flash_two_models/src/image2.h new file mode 100644 index 000000000..4daa44d76 --- /dev/null +++ b/examples/app_flash_two_models/src/image2.h @@ -0,0 +1,27650 @@ +int8_t image2[96*96*3] = { +122, +122, +122, +122, +122, +122, +122, +122, +122, +121, +121, +121, +123, +123, +123, +124, +124, +124, +122, +122, +122, +122, +122, +122, +119, +119, +119, +118, +118, +118, +123, +123, +123, +121, +121, +121, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +122, +122, +122, +120, +120, +120, +121, +121, +121, +124, +122, +123, +125, +122, +123, +125, +122, +123, +124, +121, +122, +124, +121, +122, +123, +121, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +125, +120, +122, +125, +120, +122, +121, +122, +122, +120, +123, +123, +121, +122, +124, +124, +122, +124, +120, +122, +121, +120, +122, +121, +122, +122, +120, +125, +124, +121, +124, +123, +118, +123, +120, +117, +117, +113, +113, +115, +111, +111, +116, +112, +112, +117, +113, +113, +120, +117, +117, +123, +121, +122, +121, +121, +124, +122, +121, +123, +119, +119, +120, +119, +119, +119, +123, +121, +121, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +122, +121, +121, +121, +118, +119, +123, +120, +121, +123, +120, +121, +123, +120, +121, +124, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +122, +121, +121, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +118, +118, +118, +117, +117, +117, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +113, +113, +113, +116, +116, +116, +119, +117, +118, +119, +117, +118, +119, +116, +117, +118, +115, +116, +118, +115, +116, +118, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +119, +115, +116, +117, +116, +116, +113, +118, +116, +111, +115, +114, +116, +117, +118, +117, +114, +116, +118, +115, +114, +107, +105, +102, + 92, + 88, + 85, + 80, + 75, + 71, + 68, + 62, + 56, + 68, + 60, + 55, + 46, + 36, + 32, + 29, + 19, + 14, + 33, + 23, + 18, + 38, + 28, + 24, + 54, + 45, + 40, + 85, + 76, + 73, +104, + 98, + 96, +117, +112, +111, +120, +117, +116, +119, +117, +118, +116, +116, +117, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +117, +116, +116, +113, +111, +111, +119, +117, +118, +119, +116, +117, +118, +115, +116, +118, +115, +116, +119, +116, +117, +120, +117, +118, +120, +117, +118, +117, +115, +115, +117, +114, +115, +117, +114, +115, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +117, +117, +116, +116, +116, +114, +114, +114, +113, +113, +113, +116, +116, +116, +117, +117, +117, +116, +116, +116, +115, +115, +115, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +114, +114, +114, +110, +110, +110, +108, +108, +108, +115, +113, +114, +116, +114, +114, +116, +114, +114, +119, +116, +117, +119, +116, +117, +118, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +117, +117, +114, +118, +117, +112, +119, +117, +113, +119, +115, +114, +113, +111, +106, + 99, + 97, + 77, + 68, + 64, + 59, + 50, + 45, + 58, + 47, + 41, + 44, + 32, + 25, + 33, + 19, + 11, + 25, + 9, + 0, + 7, +-12, +-21, + 4, +-15, +-24, + 11, + -9, +-18, + 2, +-17, +-26, + 9, +-10, +-20, + 14, + -3, +-12, + 30, + 16, + 8, + 60, + 48, + 43, + 87, + 79, + 76, +108, +103, +103, +116, +114, +116, +118, +115, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +116, +116, +116, +113, +114, +116, +114, +115, +119, +116, +117, +118, +116, +117, +118, +116, +117, +118, +115, +116, +118, +115, +116, +117, +115, +116, +116, +113, +114, +115, +112, +113, +115, +112, +113, +113, +113, +113, +115, +115, +115, +117, +117, +117, +118, +118, +118, +118, +118, +118, +112, +112, +112, +115, +115, +115, +117, +117, +117, +119, +119, +119, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +119, +116, +117, +120, +117, +118, +116, +114, +114, +118, +115, +116, +118, +115, +116, +118, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +117, +117, +117, +117, +117, +117, +115, +116, +117, +115, +119, +119, +116, +120, +117, +113, +113, +110, + 84, + 75, + 72, + 57, + 41, + 38, + 43, + 25, + 19, + 33, + 14, + 7, + 20, + 0, + -7, + 23, + 1, + -8, + 6, +-17, +-26, +-12, +-36, +-47, +-22, +-49, +-60, +-16, +-43, +-55, + -5, +-32, +-43, + -9, +-36, +-48, +-13, +-40, +-51, +-11, +-36, +-47, +-11, +-33, +-43, +-14, +-33, +-41, + -2, +-17, +-22, + 32, + 21, + 19, + 92, + 83, + 82, +120, +115, +116, +121, +118, +119, +119, +116, +117, +119, +116, +117, +118, +115, +116, +118, +115, +116, +117, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +117, +116, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +117, +118, +118, +116, +117, +117, +114, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +116, +116, +116, +112, +112, +112, +114, +114, +114, +115, +115, +115, +115, +115, +115, +113, +113, +113, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +115, +115, +115, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +118, +115, +116, +118, +116, +117, +115, +112, +113, +118, +115, +116, +118, +115, +116, +117, +115, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +119, +116, +116, +118, +118, +116, +115, + 93, + 85, + 83, + 52, + 32, + 29, + 48, + 20, + 18, + 36, + 11, + 4, + 17, + -9, +-17, + 31, + 4, + -5, + 13, +-14, +-25, + 6, +-24, +-36, +-15, +-44, +-57, +-11, +-39, +-50, + 11, +-17, +-28, + 28, + -1, +-12, + 22, + -7, +-18, + 3, +-26, +-36, +-16, +-42, +-52, +-33, +-55, +-64, +-24, +-46, +-55, +-23, +-44, +-53, +-15, +-35, +-43, + 13, + -6, +-13, + 95, + 89, + 88, +118, +115, +116, +119, +117, +117, +119, +116, +117, +120, +117, +118, +119, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +117, +116, +116, +118, +116, +116, +118, +116, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +115, +116, +117, +114, +115, +115, +112, +113, +116, +114, +114, +117, +114, +115, +117, +114, +115, +116, +115, +116, +111, +111, +110, +112, +112, +111, +113, +113, +112, +114, +113, +113, +114, +113, +113, +108, +107, +107, +111, +110, +110, +115, +114, +114, +115, +114, +114, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +114, +114, +114, +114, +114, +114, +114, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +116, +116, +117, +116, +116, +117, +116, +116, +116, +115, +116, +116, +116, +116, +117, +116, +116, +116, +113, +114, +117, +114, +115, +114, +111, +112, +115, +112, +113, +115, +112, +113, +114, +112, +113, +113, +113, +112, +113, +113, +112, +114, +113, +113, +114, +114, +113, +114, +114, +114, +114, +114, +113, +114, +114, +113, +114, +114, +113, +116, +115, +115, +116, +115, +115, +116, +115, +115, +117, +114, +116, +116, +112, +114, +105, + 99, + 98, + 62, + 49, + 47, + 56, + 30, + 29, + 43, + 10, + 7, + 17, +-13, +-22, + 6, +-23, +-36, + -3, +-34, +-49, + 11, +-22, +-37, + 28, + -5, +-18, + 31, + 1, +-11, + 45, + 19, + 8, + 67, + 41, + 31, + 69, + 44, + 33, + 59, + 31, + 20, + 39, + 11, + -3, + 0, +-27, +-40, +-18, +-41, +-52, +-20, +-41, +-51, +-34, +-56, +-64, +-22, +-44, +-52, + -7, +-30, +-41, + 18, + 8, + 5, + 98, + 92, + 91, +117, +113, +112, +118, +115, +115, +118, +115, +115, +118, +114, +115, +116, +115, +115, +116, +115, +115, +115, +115, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +114, +114, +113, +113, +112, +112, +113, +112, +112, +113, +112, +112, +114, +111, +111, +114, +111, +111, +113, +110, +111, +112, +110, +110, +112, +110, +110, +113, +111, +111, +113, +110, +111, +112, +109, +110, +113, +110, +111, +113, +111, +111, +113, +111, +111, +112, +111, +111, +114, +112, +110, +114, +112, +110, +114, +112, +110, +113, +111, +109, +115, +113, +111, +111, +109, +107, +113, +111, +110, +114, +112, +110, +114, +112, +110, +114, +112, +111, +114, +112, +111, +114, +112, +111, +115, +113, +111, +115, +113, +111, +114, +113, +112, +113, +113, +113, +113, +113, +113, +112, +112, +112, +112, +112, +112, +114, +114, +114, +116, +114, +114, +116, +113, +114, +116, +113, +114, +115, +112, +113, +114, +111, +112, +113, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +112, +111, +114, +112, +111, +115, +113, +112, +115, +113, +111, +116, +114, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +116, +114, +113, +117, +115, +113, +117, +115, +113, +120, +115, +114, +110, +104, +105, + 53, + 46, + 48, + 77, + 61, + 63, + 71, + 46, + 45, + 50, + 16, + 11, + 30, + -5, +-16, + 17, +-19, +-38, + 25, +-13, +-38, + 39, + 3, +-19, + 61, + 28, + 15, + 69, + 40, + 31, + 76, + 52, + 39, + 78, + 55, + 44, + 80, + 56, + 43, + 74, + 46, + 29, + 60, + 25, + 4, + 21, +-10, +-32, +-28, +-50, +-68, +-26, +-44, +-55, +-29, +-43, +-50, +-36, +-50, +-55, +-38, +-55, +-61, +-30, +-49, +-57, + 25, + 12, + 5, +105, + 99, + 92, +117, +115, +111, +118, +114, +114, +120, +113, +115, +118, +115, +114, +116, +114, +113, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +113, +111, +110, +113, +111, +110, +113, +111, +110, +112, +110, +109, +112, +110, +109, +111, +109, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +112, +110, +109, +113, +111, +110, +113, +111, +110, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +110, +108, +106, +110, +108, +106, +110, +108, +106, +112, +110, +108, +111, +109, +108, +106, +104, +102, +106, +104, +102, +111, +109, +108, +113, +111, +109, +114, +112, +110, +114, +112, +110, +115, +113, +111, +116, +114, +112, +116, +114, +112, +115, +114, +113, +114, +114, +114, +114, +114, +114, +113, +113, +113, +113, +113, +113, +115, +115, +115, +117, +115, +116, +118, +115, +116, +118, +115, +116, +111, +108, +109, +113, +110, +111, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +117, +114, +115, +117, +114, +115, +117, +115, +115, +117, +115, +113, +117, +115, +113, +118, +116, +114, +115, +113, +112, +116, +114, +113, +117, +115, +114, +116, +114, +113, +116, +114, +113, +117, +115, +114, +117, +115, +114, +117, +115, +114, +116, +114, +114, + 75, + 71, + 74, + 59, + 49, + 53, + 85, + 67, + 69, + 65, + 39, + 35, + 52, + 18, + 9, + 42, + -3, +-17, + 40, + -8, +-27, + 50, + 4, +-21, + 62, + 21, + -3, + 69, + 34, + 16, + 76, + 46, + 32, + 83, + 55, + 42, + 79, + 52, + 40, + 74, + 47, + 34, + 76, + 45, + 30, + 66, + 29, + 9, + 26, + -8, +-29, +-43, +-66, +-84, +-56, +-73, +-85, +-46, +-59, +-66, +-45, +-57, +-62, +-45, +-59, +-64, +-52, +-68, +-74, +-37, +-49, +-56, + 58, + 51, + 46, +113, +110, +106, +118, +115, +115, +119, +114, +115, +115, +112, +111, +113, +111, +110, +112, +110, +109, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +112, +115, +113, +112, +114, +112, +111, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +107, +109, +107, +105, +108, +106, +105, +109, +107, +105, +111, +109, +107, +112, +110, +108, +110, +108, +106, +111, +109, +107, +113, +111, +109, +115, +113, +111, +114, +112, +110, +114, +112, +110, +115, +113, +111, +117, +115, +113, +117, +115, +113, +116, +115, +114, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +116, +117, +119, +116, +117, +119, +116, +117, +117, +115, +116, +118, +116, +117, +120, +117, +118, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +116, +116, +119, +117, +115, +119, +117, +115, +119, +117, +116, +115, +113, +111, +116, +114, +113, +118, +115, +114, +117, +115, +114, +117, +115, +114, +118, +116, +114, +118, +116, +114, +118, +116, +114, +111, +109, +111, + 50, + 44, + 48, + 87, + 72, + 76, + 72, + 48, + 48, + 67, + 35, + 27, + 58, + 21, + 6, + 57, + 1, +-18, + 58, + 0, +-23, + 61, + 7, +-20, + 63, + 16, +-10, + 71, + 32, + 9, + 75, + 41, + 20, + 81, + 46, + 29, + 78, + 45, + 30, + 72, + 40, + 26, + 75, + 40, + 23, + 63, + 24, + 3, + 32, + -2, +-26, +-32, +-54, +-75, +-69, +-85, +-100, +-63, +-74, +-81, +-46, +-54, +-59, +-41, +-51, +-55, +-37, +-46, +-51, +-21, +-30, +-34, + 19, + 12, + 9, + 97, + 92, + 90, +115, +111, +111, +114, +110, +111, +114, +111, +110, +113, +111, +109, +112, +110, +108, +113, +110, +109, +113, +111, +109, +113, +111, +109, +111, +109, +107, +111, +109, +108, +113, +111, +110, +116, +114, +112, +116, +114, +112, +115, +113, +111, +114, +112, +110, +114, +112, +110, +113, +111, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +111, +109, +107, +110, +108, +107, +110, +108, +107, +111, +109, +108, +107, +105, +103, +106, +104, +103, +106, +104, +103, +108, +106, +105, +108, +106, +105, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +108, +107, +112, +110, +108, +112, +110, +108, +112, +111, +110, +112, +112, +112, +112, +112, +112, +113, +113, +113, +113, +113, +113, +113, +113, +113, +116, +114, +115, +116, +114, +115, +116, +114, +115, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +115, +112, +113, +117, +115, +116, +117, +115, +115, +117, +115, +114, +117, +115, +114, +117, +115, +114, +115, +113, +112, +115, +113, +111, +117, +115, +113, +116, +114, +113, +116, +114, +113, +116, +114, +112, +116, +114, +113, +116, +114, +112, + 89, + 85, + 85, + 73, + 61, + 63, + 81, + 57, + 58, + 65, + 31, + 24, + 55, + 15, + -2, + 49, + 7, +-21, + 57, + 2, +-28, + 60, + 2, +-28, + 65, + 8, +-22, + 63, + 12, +-18, + 62, + 20, + -9, + 70, + 31, + 2, + 78, + 37, + 11, + 72, + 35, + 12, + 70, + 35, + 14, + 73, + 36, + 12, + 67, + 26, + -1, + 46, + 11, +-17, +-19, +-41, +-64, +-63, +-79, +-95, +-57, +-64, +-72, + -9, +-14, +-19, + -8, +-15, +-18, +-32, +-36, +-38, + -1, + -5, + -6, + 7, + 0, + -1, + 75, + 68, + 68, +113, +109, +108, +111, +110, +108, +112, +110, +109, +113, +111, +109, +112, +110, +108, +110, +108, +106, +109, +107, +105, +110, +108, +106, +107, +105, +103, +107, +105, +103, +109, +107, +106, +110, +108, +107, +110, +108, +107, +111, +108, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +108, +106, +105, +108, +106, +104, +108, +106, +104, +107, +105, +103, +112, +110, +108, +111, +109, +108, +111, +109, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +114, +111, +110, +114, +111, +110, +113, +112, +112, +113, +113, +113, +113, +113, +113, +114, +114, +114, +114, +114, +114, +114, +114, +114, +115, +112, +113, +115, +112, +113, +115, +112, +113, +116, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +116, +114, +114, +111, +108, +109, +116, +114, +112, +116, +114, +112, +115, +113, +112, +117, +115, +113, +114, +112, +111, +116, +114, +112, +115, +113, +112, +115, +113, +112, +114, +112, +111, +114, +112, +111, +113, +111, +110, + 69, + 61, + 58, + 79, + 62, + 59, + 61, + 28, + 23, + 53, + 8, + -5, + 49, + -1, +-27, + 49, + -1, +-38, + 51, + 1, +-38, + 56, + 3, +-34, + 59, + 5, +-29, + 59, + 7, +-26, + 58, + 12, +-21, + 63, + 21, +-15, + 67, + 24, +-13, + 61, + 21, +-13, + 69, + 32, + 1, + 69, + 31, + 0, + 61, + 20, +-14, + 38, + 3, +-29, +-20, +-43, +-68, +-58, +-72, +-89, +-69, +-76, +-85, +-68, +-71, +-75, +-31, +-34, +-36, + -8, + -8, + -9, + -7, + -8, + -8, + 12, + 5, + 7, + 60, + 51, + 52, +114, +109, +108, +113, +112, +110, +114, +112, +111, +114, +112, +111, +114, +112, +110, +111, +109, +107, +111, +109, +107, +112, +110, +108, +113, +111, +109, +112, +110, +109, +113, +110, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +109, +108, +110, +110, +108, +110, +110, +108, +112, +110, +109, +112, +109, +109, +112, +109, +109, +112, +110, +110, +112, +110, +110, +112, +110, +110, +113, +111, +111, +113, +111, +111, +114, +111, +111, +114, +111, +111, +114, +111, +111, +114, +112, +112, +114, +113, +113, +114, +113, +113, +115, +114, +114, +115, +114, +114, +115, +114, +114, +114, +112, +113, +114, +112, +112, +114, +112, +112, +117, +114, +115, +117, +114, +115, +117, +114, +115, +114, +112, +113, +114, +112, +113, +115, +112, +113, +117, +114, +115, +118, +115, +116, +115, +112, +112, +117, +115, +113, +117, +115, +113, +116, +114, +113, +115, +113, +112, +115, +113, +112, +116, +113, +111, +117, +112, +111, +115, +113, +111, +113, +113, +111, +114, +112, +110, +111, +108, +107, + 74, + 64, + 63, + 65, + 42, + 38, + 48, + 6, + -3, + 47, + -7, +-26, + 50, + -5, +-34, + 48, + -2, +-37, + 46, + 1, +-40, + 49, + 2, +-37, + 53, + 2, +-35, + 57, + 5, +-31, + 60, + 8, +-27, + 57, + 8, +-30, + 59, + 11, +-31, + 60, + 16, +-25, + 64, + 22, +-17, + 61, + 21, +-19, + 56, + 14, +-27, + 36, + 0, +-36, + -9, +-33, +-60, +-39, +-55, +-74, +-34, +-41, +-51, +-50, +-53, +-60, +-43, +-45, +-49, + -8, + -5, +-10, +-33, +-35, +-37, + 6, + -3, + -2, + 56, + 46, + 47, +111, +106, +104, +113, +112, +109, +114, +112, +110, +114, +112, +110, +114, +112, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +114, +112, +110, +113, +111, +109, +113, +111, +109, +112, +110, +109, +112, +110, +108, +112, +110, +109, +112, +110, +108, +112, +110, +108, +111, +109, +107, +110, +108, +107, +109, +107, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +110, +110, +110, +110, +111, +108, +110, +111, +108, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +111, +108, +109, +111, +108, +109, +115, +112, +113, +114, +111, +112, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +118, +115, +116, +118, +115, +116, +118, +115, +116, +116, +113, +114, +116, +113, +114, +116, +114, +115, +118, +115, +116, +118, +115, +116, +117, +115, +115, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +111, +115, +113, +111, +119, +113, +112, +120, +113, +113, +116, +115, +113, +114, +114, +112, +116, +114, +112, +104, + 98, + 98, + 64, + 52, + 53, + 59, + 33, + 29, + 44, + -2, +-17, + 48, + -9, +-33, + 50, + -5, +-33, + 47, + 0, +-30, + 46, + 1, +-37, + 49, + 2, +-36, + 52, + 3, +-34, + 57, + 5, +-32, + 63, + 9, +-27, + 62, + 8, +-29, + 60, + 9, +-33, + 59, + 9, +-33, + 60, + 13, +-30, + 59, + 15, +-29, + 57, + 14, +-31, + 34, + -3, +-41, +-16, +-43, +-71, +-40, +-58, +-78, +-46, +-55, +-68, +-38, +-43, +-51, +-60, +-63, +-71, +-34, +-33, +-41, +-25, +-27, +-33, +-19, +-27, +-31, + 30, + 21, + 19, +104, + 98, + 96, +112, +110, +107, +115, +113, +111, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +113, +111, +110, +113, +110, +109, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +109, +107, +106, +110, +108, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +107, +105, +104, +110, +110, +110, +110, +111, +108, +110, +111, +108, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +111, +108, +109, +110, +107, +108, +113, +110, +111, +113, +110, +111, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +117, +114, +115, +117, +115, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +118, +115, +116, +117, +115, +115, +117, +115, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +117, +115, +115, +116, +114, +112, +116, +114, +112, +115, +113, +111, +114, +112, +110, +114, +112, +110, +116, +111, +111, +117, +112, +112, +114, +114, +112, +112, +112, +110, +117, +114, +112, +101, + 93, + 93, + 67, + 52, + 51, + 66, + 40, + 31, + 58, + 13, + -5, + 56, + 1, +-25, + 53, + -1, +-30, + 47, + -1, +-31, + 47, + 3, +-34, + 52, + 7, +-31, + 56, + 10, +-28, + 60, + 11, +-25, + 62, + 13, +-24, + 61, + 11, +-28, + 59, + 9, +-35, + 60, + 10, +-34, + 61, + 13, +-32, + 62, + 14, +-31, + 60, + 13, +-32, + 39, + -2, +-41, +-16, +-47, +-75, +-41, +-62, +-83, +-56, +-69, +-83, +-52, +-58, +-69, +-65, +-70, +-80, +-58, +-60, +-70, +-56, +-61, +-69, +-30, +-40, +-45, + 16, + 6, + 4, +102, + 96, + 94, +106, +104, +102, +114, +112, +110, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +113, +111, +109, +113, +110, +109, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +109, +107, +106, +110, +108, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +106, +104, +103, +110, +110, +109, +110, +111, +108, +110, +111, +108, +112, +110, +111, +113, +110, +111, +113, +110, +111, +112, +109, +110, +107, +105, +105, +112, +110, +110, +111, +108, +109, +111, +108, +109, +112, +109, +110, +114, +112, +112, +114, +112, +112, +114, +111, +112, +114, +111, +112, +115, +113, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +114, +114, +116, +114, +114, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +115, +116, +118, +115, +116, +117, +114, +115, +117, +115, +115, +115, +113, +112, +117, +115, +113, +117, +115, +114, +117, +115, +113, +117, +115, +113, +117, +113, +112, +116, +113, +112, +114, +115, +112, +115, +116, +113, +117, +112, +111, +101, + 91, + 92, + 62, + 43, + 39, + 50, + 21, + 8, + 53, + 11, +-13, + 54, + 3, +-28, + 54, + 4, +-27, + 52, + 3, +-26, + 55, + 10, +-26, + 55, + 11, +-26, + 57, + 13, +-24, + 60, + 16, +-21, + 62, + 18, +-19, + 59, + 14, +-24, + 60, + 13, +-31, + 59, + 12, +-32, + 60, + 14, +-30, + 61, + 14, +-30, + 61, + 14, +-30, + 50, + 7, +-32, + 1, +-32, +-64, +-37, +-61, +-85, +-58, +-73, +-90, +-71, +-81, +-94, +-81, +-90, +-102, +-68, +-74, +-87, +-56, +-65, +-75, +-39, +-51, +-57, + 18, + 8, + 5, +108, +101, +100, +111, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +106, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +105, +108, +106, +105, +108, +106, +105, +109, +107, +105, +108, +108, +108, +108, +109, +106, +109, +109, +107, +112, +109, +110, +112, +109, +110, +112, +109, +110, +109, +106, +107, +103, +100, +101, +111, +108, +109, +111, +109, +110, +111, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +113, +110, +111, +109, +106, +107, +112, +110, +111, +114, +111, +112, +113, +110, +111, +113, +110, +111, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +115, +112, +113, +115, +112, +113, +116, +113, +114, +116, +113, +114, +117, +114, +115, +111, +109, +109, +114, +111, +112, +114, +112, +112, +114, +112, +110, +114, +112, +110, +114, +112, +111, +113, +111, +110, +113, +111, +110, +113, +111, +110, +112, +112, +109, +110, +112, +109, +110, +111, +109, +116, +110, +109, +101, + 88, + 90, + 56, + 33, + 27, + 34, + 3, +-14, + 34, + -4, +-34, + 46, + 0, +-35, + 49, + 2, +-33, + 46, + -2, +-33, + 45, + 0, +-34, + 44, + 1, +-34, + 47, + 5, +-30, + 56, + 16, +-20, + 55, + 17, +-20, + 55, + 17, +-20, + 63, + 24, +-16, + 62, + 23, +-18, + 57, + 16, +-24, + 58, + 16, +-24, + 59, + 15, +-24, + 56, + 14, +-24, + 30, + -6, +-40, +-23, +-50, +-77, +-52, +-70, +-90, +-68, +-81, +-97, +-77, +-88, +-103, +-69, +-79, +-94, +-59, +-70, +-84, +-44, +-58, +-67, + 27, + 15, + 12, +108, +101, +100, +108, +107, +107, +109, +107, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +108, +106, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +107, +105, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +105, +105, +105, +106, +103, +105, +106, +104, +111, +108, +109, +111, +108, +109, +111, +108, +109, +110, +108, +108, +110, +107, +108, +110, +107, +108, +109, +106, +107, +109, +106, +107, +110, +107, +108, +111, +108, +109, +111, +108, +109, +111, +108, +109, +109, +106, +107, +112, +109, +110, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +111, +111, +113, +111, +111, +113, +110, +111, +112, +109, +110, +112, +109, +110, +112, +109, +110, +107, +105, +106, +110, +108, +109, +113, +111, +111, +112, +110, +108, +111, +109, +107, +110, +108, +106, +111, +109, +107, +111, +109, +107, +110, +110, +108, +110, +111, +109, +109, +112, +109, +111, +110, +108, +111, +103, +103, + 47, + 32, + 35, + 2, +-23, +-31, + 2, +-29, +-49, + 22, +-15, +-48, + 36, + -7, +-46, + 41, + -6, +-41, + 39, + -9, +-41, + 37, + -7, +-40, + 37, + -5, +-39, + 27, +-13, +-47, + 22, +-15, +-50, + 26, + -9, +-45, + 30, + -3, +-39, + 36, + 5, +-32, + 50, + 18, +-18, + 53, + 18, +-17, + 56, + 18, +-16, + 57, + 17, +-16, + 59, + 17, +-18, + 49, + 10, +-25, + -7, +-36, +-64, +-50, +-70, +-91, +-63, +-78, +-95, +-70, +-83, +-100, +-73, +-85, +-103, +-63, +-77, +-92, +-33, +-49, +-59, + 29, + 17, + 13, +108, +101, +100, +105, +104, +103, +107, +105, +104, +107, +105, +104, +107, +105, +104, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +104, +102, +101, +103, +101, +100, +103, +101, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, +103, +101, +100, +103, +101, +100, +103, +101, + 99, +107, +106, +106, +108, +106, +104, +108, +106, +103, +110, +108, +107, +110, +108, +107, +110, +108, +107, +111, +109, +108, +111, +109, +108, +110, +108, +107, +109, +107, +107, +109, +107, +107, +110, +108, +107, +111, +109, +108, +110, +107, +106, +109, +107, +106, +107, +105, +104, +112, +109, +109, +111, +109, +108, +112, +110, +108, +113, +110, +110, +113, +110, +110, +113, +110, +110, +113, +110, +110, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +108, +111, +109, +108, +112, +110, +109, +114, +112, +110, +112, +110, +108, +110, +108, +107, +111, +109, +107, +112, +110, +108, +113, +111, +109, +111, +112, +108, +112, +111, +109, +115, +109, +110, +111, +110, +110, +109, +108, +104, + 45, + 32, + 28, +-12, +-31, +-42, +-32, +-52, +-71, +-25, +-49, +-77, + 9, +-22, +-56, + 32, + -9, +-44, + 40, + -9, +-41, + 35, + -7, +-39, + 24, +-15, +-48, + 3, +-34, +-67, + -9, +-43, +-78, + -4, +-36, +-69, + 9, +-22, +-54, + 17, +-15, +-45, + 34, + -1, +-33, + 48, + 11, +-23, + 53, + 16, +-18, + 55, + 20, +-13, + 58, + 19, +-15, + 49, + 10, +-25, +-10, +-38, +-67, +-49, +-66, +-90, +-58, +-73, +-93, +-60, +-79, +-97, +-49, +-77, +-91, + 15, +-24, +-38, + 27, +-10, +-23, + 40, + 33, + 28, +106, +106, +106, +115, +107, +107, +108, +105, +104, +110, +108, +106, +110, +108, +107, +109, +107, +106, +109, +107, +106, +108, +106, +105, +105, +103, +101, +106, +104, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +104, +105, +103, +102, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +105, +103, +101, +102, +100, + 99, +102, +100, + 99, +102, +100, + 98, +100, + 98, + 96, +109, +106, +107, +109, +107, +105, +109, +107, +104, +109, +108, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +107, +109, +107, +105, +101, + 99, + 97, +112, +110, +109, +112, +110, +108, +112, +110, +108, +114, +112, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +114, +112, +110, +114, +112, +110, +112, +109, +108, +108, +106, +104, +113, +111, +109, +115, +113, +112, +110, +112, +108, +113, +110, +109, +117, +108, +111, +112, +112, +112, +113, +114, +109, + 62, + 49, + 44, +-29, +-50, +-60, +-46, +-66, +-81, +-15, +-38, +-58, +-30, +-61, +-85, + 9, +-32, +-60, + 38, +-12, +-41, + 38, + -4, +-43, + 16, +-22, +-62, +-15, +-50, +-86, +-30, +-61, +-94, +-14, +-42, +-72, + 4, +-24, +-53, + 30, + -2, +-35, + 49, + 12, +-24, + 50, + 11, +-28, + 51, + 14, +-24, + 55, + 21, +-14, + 60, + 21, +-14, + 48, + 8, +-26, +-11, +-39, +-68, +-50, +-69, +-94, +-51, +-71, +-93, +-45, +-70, +-91, + 7, +-28, +-48, + 60, + 4, +-15, + 61, + 5, + -8, + 81, + 60, + 57, +106, +105, +106, +110, +104, +103, +101, + 98, + 97, +110, +108, +107, +110, +108, +106, +110, +108, +106, +110, +108, +107, +110, +108, +107, +111, +109, +107, +110, +108, +107, +108, +106, +105, +108, +106, +105, +108, +106, +105, +107, +105, +104, +106, +104, +102, +103, +101, + 99, +110, +108, +107, +109, +107, +105, +107, +105, +103, +107, +105, +104, +107, +105, +103, +106, +104, +102, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +102, +109, +106, +107, +109, +107, +105, +109, +107, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +105, +110, +108, +106, +110, +108, +106, +109, +107, +106, +110, +108, +106, +111, +109, +107, +112, +110, +108, +110, +108, +106, +110, +108, +107, +113, +111, +109, +114, +112, +110, +115, +113, +112, +114, +112, +110, +113, +111, +109, +113, +111, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +115, +113, +111, +115, +113, +112, +113, +111, +109, +111, +109, +107, +111, +109, +107, +113, +111, +109, +114, +112, +111, +112, +112, +108, +114, +110, +109, +116, +109, +111, +111, +111, +111, +114, +112, +108, + 69, + 50, + 46, + 11, +-15, +-28, +-27, +-53, +-72, + 2, +-25, +-45, +-17, +-51, +-75, + 18, +-26, +-55, + 39, +-12, +-46, + 33, +-12, +-61, + 23, +-18, +-66, +-15, +-50, +-92, +-28, +-57, +-92, +-31, +-56, +-83, + -9, +-34, +-62, + 4, +-30, +-70, + 22, +-16, +-59, + 43, + 4, +-41, + 52, + 13, +-29, + 58, + 22, +-16, + 61, + 21, +-15, + 39, + -3, +-36, +-23, +-55, +-84, +-49, +-74, +-101, +-35, +-63, +-88, + 1, +-33, +-57, + 49, + 6, +-26, + 61, + -8, +-36, + 41, +-36, +-48, +105, + 68, + 68, +111, +107, +108, +107, +110, +106, +111, +109, +107, +110, +108, +107, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +108, +106, +105, +111, +109, +108, +110, +108, +106, +110, +108, +107, +110, +108, +107, +109, +107, +105, +111, +109, +107, +109, +107, +106, +108, +106, +105, +109, +107, +105, +109, +107, +105, +107, +105, +104, +107, +105, +104, +107, +105, +104, +108, +106, +105, +109, +107, +105, +109, +107, +105, +107, +105, +103, +109, +106, +107, +109, +107, +105, +108, +107, +104, +110, +108, +106, +110, +108, +107, +110, +108, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +111, +109, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +107, +106, +104, +103, +113, +111, +109, +115, +113, +111, +115, +113, +111, +114, +112, +111, +113, +111, +110, +112, +110, +109, +111, +109, +108, +111, +109, +107, +111, +108, +107, +111, +109, +107, +112, +110, +108, +113, +111, +110, +115, +112, +111, +115, +113, +111, +114, +112, +110, +112, +110, +108, +111, +109, +107, +111, +109, +108, +112, +110, +109, +112, +110, +109, +111, +111, +108, +113, +109, +108, +114, +109, +110, +110, +111, +111, +110, +105, +102, + 65, + 37, + 36, + 22, +-11, +-32, + -7, +-39, +-68, +-13, +-46, +-73, + 13, +-25, +-54, + 64, + 18, +-16, + 51, + -1, +-42, + 26, +-24, +-77, + 23, +-23, +-74, + -7, +-47, +-92, +-18, +-51, +-88, +-13, +-41, +-71, + 12, +-17, +-49, + 24, +-13, +-57, + 26, +-15, +-62, + 40, + -5, +-50, + 54, + 12, +-31, + 61, + 22, +-15, + 62, + 18, +-14, + 32, +-13, +-42, +-22, +-58, +-87, +-34, +-67, +-95, + 9, +-29, +-55, + 57, + 11, +-17, + 42, +-12, +-48, + 58, +-18, +-49, + 43, +-38, +-50, +111, + 73, + 75, +110, +107, +108, +106, +111, +104, +110, +109, +106, +110, +108, +107, +110, +108, +107, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +105, +109, +107, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +109, +106, +108, +110, +108, +106, +110, +108, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +108, +106, +105, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +112, +110, +108, +111, +109, +107, +111, +109, +107, +108, +106, +105, +106, +104, +102, +109, +107, +105, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +110, +108, +106, +108, +106, +104, +107, +105, +104, +109, +107, +105, +109, +107, +105, +109, +107, +104, +112, +106, +106, +111, +106, +108, +107, +110, +109, + 95, + 89, + 87, + 50, + 16, + 17, + 30, +-11, +-29, + 16, +-24, +-45, + 19, +-22, +-36, + 64, + 19, + 2, + 63, + 12, +-13, + 47, +-10, +-42, + 28, +-29, +-69, + 25, +-28, +-71, + 13, +-35, +-77, + -5, +-48, +-89, + 7, +-31, +-71, + 24, +-13, +-54, + 35, + -5, +-49, + 46, + 2, +-43, + 58, + 10, +-33, + 61, + 14, +-23, + 63, + 19, +-12, + 64, + 17, +-11, + 47, + -1, +-29, + 16, +-24, +-52, + 4, +-34, +-61, + 55, + 9, +-21, + 56, + 2, +-31, + 59, + -3, +-38, + 78, + 3, +-26, + 60, + -5, +-17, +118, + 95, + 95, +106, +110, +110, +110, +110, +103, +110, +108, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +108, +106, +104, +109, +106, +105, +109, +107, +105, +108, +106, +104, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +103, +104, +109, +107, +105, +108, +107, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +111, +109, +107, +109, +107, +105, +109, +107, +105, +108, +106, +105, +107, +105, +103, +109, +107, +106, +110, +108, +106, +109, +107, +105, +109, +107, +105, +111, +109, +108, +111, +109, +107, +109, +107, +106, +109, +107, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +109, +107, +106, +110, +109, +107, +109, +107, +106, +109, +107, +106, +108, +106, +105, +106, +105, +103, +109, +107, +106, +110, +108, +107, +110, +108, +106, +110, +108, +106, +109, +108, +105, +112, +106, +105, +110, +107, +107, +107, +110, +109, + 89, + 82, + 81, + 35, + -2, + -1, + 33, +-15, +-22, + 37, +-11, +-15, + 60, + 11, + 15, + 54, + 1, + 4, + 50, + -9, +-14, + 50, +-14, +-26, + 37, +-25, +-51, + 31, +-28, +-60, + 35, +-19, +-57, + 28, +-24, +-67, + 23, +-25, +-73, + 28, +-16, +-64, + 43, + 0, +-42, + 57, + 10, +-30, + 62, + 12, +-27, + 62, + 13, +-20, + 64, + 18, + -9, + 66, + 18, + -7, + 60, + 11, +-16, + 46, + 4, +-24, + 54, + 11, +-18, + 67, + 16, +-15, + 44, +-17, +-52, + 40, +-26, +-58, + 55, +-12, +-37, + 81, + 37, + 25, +112, +108, +104, + 99, +110, +108, +112, +107, +100, +109, +106, +103, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +104, +102, +100, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +102, + 96, +101, +108, +106, +105, +107, +107, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +109, +107, +105, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +108, +109, +108, +107, +109, +109, +108, +110, +110, +109, +111, +110, +109, +111, +107, +106, +108, +107, +106, +109, +111, +110, +113, +111, +110, +112, +110, +109, +111, +110, +109, +112, +110, +109, +111, +109, +108, +110, +109, +108, +110, +109, +108, +110, +110, +108, +111, +110, +108, +111, +108, +109, +109, +111, +110, +107, +112, +110, +107, +110, +111, +114, +101, + 91, + 94, + 40, + 2, + -2, + 32, +-17, +-33, + 34, +-17, +-23, + 56, + 2, + 3, + 43, +-15, +-23, + 50, +-16, +-28, + 58, +-15, +-22, + 44, +-26, +-38, + 40, +-26, +-46, + 39, +-22, +-53, + 34, +-23, +-62, + 32, +-23, +-63, + 45, + -6, +-46, + 54, + 10, +-29, + 56, + 12, +-26, + 54, + 11, +-26, + 57, + 16, +-19, + 61, + 22, +-11, + 60, + 19, + -9, + 52, + 13, +-15, + 50, + 12, +-19, + 60, + 17, +-16, + 68, + 13, +-22, + 44, +-22, +-57, + 48, +-16, +-50, + 63, + 13, +-11, + 93, + 69, + 62, +112, +105, +108, +108, +105, +110, +112, +105, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 87, + 80, + 86, +107, +104, +104, +107, +108, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +106, +109, +107, +105, +109, +107, +105, +110, +109, +110, +117, +116, +118, +117, +117, +119, +117, +116, +119, +118, +118, +120, +117, +116, +119, +117, +116, +118, +117, +117, +119, +117, +116, +119, +117, +116, +119, +117, +116, +119, +117, +116, +118, +115, +115, +117, +115, +115, +117, +116, +116, +118, +117, +116, +119, +117, +116, +119, +117, +116, +118, +119, +117, +115, +119, +117, +114, +115, +116, +120, +114, +104, +109, + 44, + 9, + 4, + 24, +-25, +-46, + 35, +-17, +-27, + 33, +-21, +-24, + 45, +-13, +-24, + 51, +-15, +-29, + 55, +-19, +-24, + 46, +-24, +-36, + 28, +-38, +-59, + 37, +-26, +-56, + 43, +-15, +-52, + 47, +-10, +-47, + 56, + 3, +-33, + 53, + 10, +-28, + 52, + 9, +-28, + 56, + 15, +-21, + 58, + 18, +-16, + 59, + 20, +-13, + 56, + 18, +-14, + 51, + 13, +-18, + 48, + 9, +-24, + 63, + 20, +-15, + 56, + 3, +-33, + 65, + 3, +-32, + 74, + 18, +-14, + 55, + 15, + -5, +115, + 95, + 89, +112, +106, +109, +110, +107, +110, +112, +106, +106, +109, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 72, + 66, + 71, +108, +105, +104, +106, +107, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +106, +104, +102, +105, +103, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +107, +109, +114, +113, +115, +110, +109, +112, +110, +110, +112, +114, +113, +115, +114, +113, +115, +110, +109, +112, +111, +110, +113, +114, +113, +116, +111, +110, +113, +111, +111, +113, +112, +111, +114, +110, +109, +112, +110, +109, +112, +112, +111, +113, +112, +111, +114, +112, +111, +114, +111, +110, +113, +112, +108, +108, +115, +113, +112, +115, +118, +123, +117, +110, +115, + 48, + 17, + 13, + 24, +-23, +-47, + 14, +-37, +-52, + 32, +-19, +-25, + 49, + -5, +-19, + 51, + -9, +-25, + 38, +-31, +-37, + 44, +-20, +-36, + 31, +-31, +-55, + 26, +-34, +-66, + 41, +-18, +-53, + 56, + -3, +-38, + 58, + 3, +-30, + 52, + 10, +-27, + 55, + 15, +-21, + 60, + 20, +-15, + 59, + 21, +-13, + 56, + 19, +-13, + 53, + 16, +-18, + 51, + 12, +-23, + 51, + 11, +-24, + 64, + 19, +-16, + 64, + 14, +-20, + 71, + 17, +-17, + 70, + 26, + 1, + 91, + 63, + 47, +117, +104, + 98, +109, +106, +106, +107, +106, +107, +110, +106, +103, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 58, + 52, + 58, +104, +102, +101, +106, +107, +103, +107, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +108, +106, +103, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +106, +107, +116, +115, +117, +114, +113, +116, +115, +114, +116, +115, +115, +117, +114, +114, +116, +116, +115, +118, +114, +114, +116, +116, +116, +118, +115, +115, +117, +115, +114, +117, +114, +114, +116, +114, +114, +116, +114, +114, +116, +115, +115, +117, +117, +116, +118, +117, +116, +118, +116, +115, +119, +118, +114, +116, +117, +114, +115, +112, +116, +122, +116, +113, +118, + 51, + 25, + 21, + 22, +-21, +-44, + 1, +-43, +-60, + 2, +-41, +-51, + 17, +-27, +-45, + 16, +-33, +-55, + 20, +-37, +-52, + 19, +-36, +-58, + 28, +-26, +-54, + 28, +-25, +-59, + 34, +-19, +-56, + 51, + -4, +-38, + 57, + 5, +-27, + 54, + 13, +-22, + 58, + 18, +-17, + 58, + 20, +-13, + 57, + 20, +-12, + 48, + 12, +-19, + 49, + 12, +-21, + 49, + 9, +-26, + 55, + 12, +-22, + 57, + 10, +-20, + 61, + 13, +-15, + 65, + 18, +-10, + 64, + 35, + 19, +112, + 96, + 86, +111, +105, +101, +105, +105, +104, +105, +106, +104, +107, +106, +101, +108, +106, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +102, +100, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 49, + 42, + 48, + 99, + 97, + 96, +104, +104, +100, +106, +104, +102, +106, +104, +102, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +107, +109, +115, +115, +117, +113, +113, +115, +114, +113, +115, +113, +112, +115, +114, +113, +116, +114, +114, +116, +115, +114, +117, +113, +113, +115, +115, +114, +116, +114, +114, +116, +116, +115, +117, +116, +115, +118, +116, +115, +118, +116, +116, +118, +117, +117, +119, +117, +117, +119, +119, +116, +121, +121, +116, +119, +120, +117, +119, +111, +117, +124, +113, +111, +118, + 49, + 26, + 22, + 13, +-23, +-44, + 6, +-31, +-45, + 14, +-20, +-32, + 1, +-32, +-57, + -3, +-39, +-72, + 15, +-26, +-54, + 14, +-29, +-57, + 24, +-19, +-52, + 24, +-20, +-58, + 24, +-21, +-60, + 49, + 1, +-34, + 59, + 12, +-20, + 57, + 18, +-16, + 59, + 20, +-13, + 58, + 21, +-11, + 52, + 17, +-14, + 47, + 13, +-17, + 48, + 11, +-21, + 49, + 7, +-24, + 62, + 15, +-12, + 54, + 4, +-18, + 60, + 13, + -6, + 60, + 18, + 1, + 92, + 76, + 66, +111, +106, +100, +108, +107, +104, +105, +108, +105, +105, +108, +103, +107, +107, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +102, +104, +102, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +104, +102, +100, +102, +100, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 45, + 39, + 47, + 88, + 85, + 87, +104, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +106, +108, +113, +113, +115, +108, +108, +110, +111, +111, +113, +112, +111, +114, +112, +111, +114, +110, +109, +112, +110, +110, +112, +110, +109, +112, +109, +109, +111, +110, +109, +112, +111, +110, +113, +117, +117, +118, +117, +117, +118, +117, +117, +119, +118, +117, +120, +118, +117, +120, +117, +117, +121, +119, +115, +120, +119, +116, +120, +111, +117, +123, +112, +112, +116, + 39, + 19, + 14, + 14, +-19, +-36, + 18, +-17, +-30, + 5, +-28, +-41, + -4, +-34, +-62, + 2, +-28, +-67, + 23, +-10, +-46, + 25, + -9, +-41, + 22, +-13, +-47, + 20, +-17, +-56, + 25, +-15, +-54, + 41, + -1, +-37, + 57, + 14, +-20, + 55, + 19, +-15, + 56, + 19, +-15, + 54, + 19, +-13, + 52, + 17, +-14, + 50, + 16, +-15, + 47, + 11, +-20, + 50, + 7, +-20, + 65, + 17, + -3, + 57, + 11, + -3, + 83, + 47, + 38, +108, + 78, + 72, +116, +106, +102, +107, +107, +105, +103, +104, +102, +104, +106, +103, +105, +106, +101, +106, +106, +100, +108, +106, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +106, +104, +102, +105, +103, +102, +105, +103, +101, +106, +104, +102, +105, +103, +101, +103, +101, +100, +102, +100, + 98, +103, +101, +100, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 43, + 39, + 52, + 73, + 69, + 77, +105, +101, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +105, +103, +101, +105, +103, +101, +105, +103, +102, +106, +104, +103, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +105, +103, +104, +106, +104, +106, +107, +105, +107, +106, +105, +106, +106, +105, +106, +106, +105, +106, +105, +104, +105, +104, +104, +105, +104, +104, +105, +104, +103, +104, +104, +103, +104, +104, +103, +104, +104, +104, +104, +104, +104, +104, +104, +104, +104, +105, +105, +105, +105, +105, +105, + 99, +104, +105, +100, +101, +106, +106, +100, +107, +102, +103, +104, +101, +100, + 95, + 36, + 18, + 9, + 21, +-11, +-24, + 14, +-22, +-38, + -3, +-43, +-61, + 10, +-31, +-55, + 16, +-22, +-52, + 22, +-12, +-45, + 30, + -4, +-31, + 35, + -1, +-28, + 31, + -7, +-38, + 32, + -8, +-42, + 35, + -7, +-44, + 50, + 10, +-27, + 50, + 19, +-17, + 50, + 19, +-17, + 51, + 18, +-18, + 52, + 18, +-17, + 49, + 13, +-21, + 50, + 15, +-16, + 54, + 12, +-11, + 60, + 13, + -1, + 65, + 37, + 29, +111, +103, +100, +111, +105, +110, +109, +106, +107, +106, +104, +102, +102, +100, + 98, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +105, +109, +107, +105, +106, +104, +102, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +104, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +105, +103, +101, +104, +102, +100, +106, +104, +103, +105, +103, +102, +103, +101, +100, +100, + 98, + 97, +101, + 99, + 98, +104, +102, +101, +104, +102, +100, +103, +101, +100, + 43, + 39, + 53, + 60, + 55, + 64, +105, +101, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +107, +105, +103, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +106, +102, +101, +102, + 98, + 97, +101, + 97, + 96, +101, + 97, + 96, +101, + 97, + 96, +101, + 97, + 96, +102, + 98, + 97, +102, + 98, + 97, +102, + 98, + 97, +103, + 99, + 98, +102, + 98, + 97, +103, + 99, + 98, +102, + 99, + 96, +102, + 99, + 96, +103, +100, + 97, +104, +101, + 98, +104, +101, + 98, +101, +102, +100, +102, +100, +102, +106, + 97, +102, +101, + 98, + 98, +102, +100, + 92, + 44, + 25, + 15, + 12, +-15, +-30, +-13, +-45, +-61, +-39, +-75, +-93, + 0, +-38, +-62, + 18, +-17, +-46, + 18, +-14, +-46, + 4, +-39, +-63, + 13, +-31, +-55, + 28, +-15, +-45, + 34, + -8, +-42, + 40, + 0, +-36, + 43, + 5, +-32, + 45, + 14, +-21, + 49, + 16, +-17, + 51, + 16, +-17, + 50, + 14, +-19, + 50, + 12, +-20, + 50, + 13, +-18, + 57, + 13, +-10, + 54, + 8, + -5, + 84, + 60, + 53, +112, +105, +103, +109, +105, +108, +109, +106, +106, +107, +105, +104, +105, +103, +101, +107, +105, +103, +108, +106, +104, +108, +106, +104, +109, +107, +105, +108, +106, +104, +104, +102, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +106, +104, +102, +105, +103, +101, +104, +102, +101, +103, +101, + 99, +102, +100, + 98, +104, +102, +101, +104, +102, +100, +103, +101, + 99, + 37, + 32, + 49, + 48, + 43, + 55, +100, + 96, +102, +106, +103, +103, +106, +104, +102, +105, +103, +102, +104, +102, +101, +104, +102, +101, +104, +102, +100, +103, +101, + 99, +106, +104, +102, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +108, +105, +104, +109, +104, +103, +109, +102, +102, +108, +101, +101, +107, +101, +101, +106, +100, +100, +107, +101, +100, +108, +103, +102, +108, +103, +103, +108, +103, +103, +106, +102, +101, +108, +103, +102, +107, +102, +101, +106, +102, + 99, +106, +102, + 98, +107, +103, + 99, +108, +104, +101, +108, +104, +101, +106, +105, +101, +108, +103, +102, +109, + 98, +102, +102, + 99, + 97, +107, +104, + 96, + 54, + 36, + 28, + 9, +-25, +-36, + 16, +-25, +-37, + 3, +-44, +-57, + -4, +-54, +-72, + 1, +-47, +-71, + 1, +-45, +-72, + 4, +-50, +-73, + 12, +-40, +-65, + 17, +-31, +-59, + 24, +-18, +-50, + 44, + 6, +-29, + 40, + 4, +-31, + 45, + 11, +-21, + 48, + 13, +-19, + 51, + 14, +-17, + 50, + 12, +-19, + 51, + 11, +-19, + 53, + 12, +-18, + 56, + 9, +-15, + 54, + 8, + -3, +101, + 80, + 74, +111, +108, +105, +109, +106, +107, +110, +107, +106, +108, +106, +104, +107, +105, +103, +106, +104, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +104, +107, +105, +104, +107, +105, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +104, +102, +101, +106, +104, +102, +105, +103, +101, +104, +102, +101, +105, +103, +101, +103, +101, +100, +105, +103, +101, +104, +102, +100, +104, +102, +100, + 32, + 26, + 45, + 42, + 37, + 50, + 90, + 86, + 93, +102, +100, + 99, +102, +100, + 98, +102, +100, + 99, +103, +101, +100, +103, +101, +100, +103, +101, + 99, +102, +100, + 98, +104, +102, +100, +106, +104, +102, +105, +103, +102, +105, +103, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +104, +102, +100, +106, +104, +102, +102, + 98, + 99, + 95, + 91, + 93, + 91, + 88, + 89, + 91, + 87, + 89, + 85, + 81, + 83, + 85, + 81, + 83, + 87, + 85, + 87, + 87, + 85, + 86, + 87, + 84, + 86, + 86, + 84, + 85, + 86, + 84, + 85, + 85, + 83, + 84, + 84, + 83, + 82, + 83, + 81, + 80, + 82, + 81, + 79, + 83, + 81, + 80, + 83, + 81, + 80, + 82, + 82, + 80, + 86, + 81, + 82, + 86, + 76, + 81, + 79, + 79, + 80, + 80, + 82, + 77, + 48, + 36, + 30, + 12, +-25, +-32, + 18, +-29, +-37, + 9, +-46, +-55, + 12, +-48, +-62, + 15, +-44, +-63, + 28, +-29, +-51, + 40, +-15, +-40, + 41, +-11, +-38, + 31, +-15, +-44, + 19, +-22, +-53, + 39, + 2, +-31, + 42, + 8, +-25, + 45, + 9, +-21, + 50, + 13, +-17, + 50, + 11, +-18, + 51, + 10, +-18, + 52, + 10, +-18, + 56, + 11, +-19, + 53, + 3, +-21, + 57, + 11, + 2, +109, + 89, + 86, +106, +106, +103, +107, +105, +103, +109, +106, +105, +107, +105, +103, +109, +107, +105, +106, +104, +102, +106, +104, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, + 20, + 14, + 34, + 38, + 31, + 46, + 74, + 69, + 78, +101, + 99, + 98, +101, + 99, + 97, +102, +100, + 98, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +104, +102, +100, +104, +102, +100, + 50, + 50, + 53, +-38, +-38, +-32, +-36, +-36, +-30, +-39, +-38, +-33, +-46, +-46, +-40, +-49, +-48, +-42, +-49, +-46, +-41, +-50, +-47, +-42, +-50, +-48, +-42, +-50, +-47, +-42, +-51, +-48, +-42, +-51, +-48, +-44, +-50, +-47, +-44, +-50, +-47, +-44, +-50, +-46, +-43, +-49, +-45, +-42, +-49, +-45, +-42, +-49, +-45, +-44, +-46, +-48, +-45, +-45, +-50, +-43, +-50, +-45, +-40, +-53, +-46, +-45, +-20, +-28, +-28, + 13, +-13, +-20, + 3, +-33, +-43, + -2, +-47, +-58, + -1, +-52, +-67, + 4, +-48, +-67, + 18, +-32, +-55, + 26, +-19, +-50, + 25, +-18, +-49, + 28, +-14, +-44, + 20, +-18, +-50, + 32, + -4, +-36, + 43, + 9, +-22, + 43, + 6, +-21, + 49, + 10, +-17, + 50, + 10, +-17, + 51, + 8, +-17, + 52, + 8, +-17, + 55, + 6, +-22, + 54, + 0, +-25, + 65, + 21, + 12, +114, + 95, + 93, +102, +104, +101, +103, +102, + 99, +105, +102, +100, +105, +103, +102, +106, +104, +103, +104, +102, +101, +105, +103, +102, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +-26, +-29, +-16, + 32, + 28, + 42, + 60, + 56, + 67, +103, +100, +102, +103, +101, +101, +101, + 99, + 98, +104, +102, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +106, +103, +102, +106, +103, +102, +105, +103, +101, +104, +102, +100, +102, +100, + 99, + 46, + 45, + 49, +-36, +-35, +-27, + 57, + 63, + 70, + 59, + 68, + 72, + 62, + 71, + 72, + 61, + 70, + 69, + 63, + 71, + 72, + 62, + 70, + 72, + 63, + 71, + 73, + 64, + 72, + 75, + 65, + 73, + 77, + 64, + 72, + 78, + 62, + 70, + 78, + 64, + 71, + 78, + 71, + 78, + 83, + 73, + 79, + 81, + 73, + 80, + 79, + 75, + 81, + 83, + 76, + 78, + 86, + 74, + 76, + 83, + 72, + 79, + 84, + 73, + 82, + 83, + 77, + 80, + 79, + 32, + 21, + 20, + 15, +-13, +-20, + 10, +-34, +-47, + -7, +-54, +-68, +-13, +-58, +-74, + 1, +-44, +-65, + 11, +-31, +-60, + 17, +-23, +-54, + 23, +-16, +-47, + 24, +-12, +-45, + 32, + -2, +-36, + 43, + 9, +-23, + 45, + 7, +-21, + 50, + 10, +-17, + 49, + 7, +-20, + 52, + 6, +-21, + 52, + 5, +-23, + 55, + 3, +-25, + 57, + 2, +-21, + 71, + 30, + 18, +113, + 99, + 97, +100, +103, +104, +102, +101, + 98, +104, +101, + 98, +103, +101, +100, +102, +100, + 98, +100, + 98, + 97, +104, +102, +100, +105, +102, +101, +104, +102, +100, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +101, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +-74, +-74, +-67, + 22, + 20, + 33, + 47, + 44, + 59, +100, + 97, +101, +104, +101, +104, +103, +100, +101, +103, +101, +101, +104, +102, +101, +103, +101, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +102, +100, + 98, + 92, + 90, + 88, + 35, + 32, + 37, +-45, +-45, +-36, + 8, + 17, + 25, + 22, + 35, + 40, + 22, + 35, + 35, + 25, + 37, + 32, + 23, + 33, + 32, + 19, + 29, + 29, + 22, + 31, + 33, + -3, + 6, + 9, + 17, + 25, + 30, + 8, + 17, + 22, + 13, + 25, + 26, + 25, + 34, + 37, + 86, + 94, + 97, + 89, + 95, + 99, + 90, + 95, + 98, + 89, + 94, + 99, + 88, + 94, +100, + 76, + 82, + 87, + 79, + 85, + 88, + 78, + 85, + 86, + 84, + 91, + 91, + 75, + 72, + 75, + 15, +-11, +-18, + 11, +-36, +-56, + 8, +-40, +-60, + 5, +-39, +-59, + 20, +-25, +-52, + 18, +-26, +-52, + 30, +-12, +-39, + 33, + -6, +-35, + 39, + 2, +-30, + 39, + 5, +-30, + 41, + 7, +-27, + 49, + 11, +-18, + 49, + 10, +-19, + 50, + 6, +-23, + 54, + 6, +-24, + 53, + 4, +-27, + 54, + 2, +-26, + 57, + 4, +-21, + 59, + 21, + 3, + 86, + 75, + 73, + 99, +102, +106, +104, +101, + 98, +105, +101, + 98, +104, +102, +100, +104, +102, +100, +104, +102, +100, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +103, +102, +104, +102, +101, +103, +101, + 99, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +104, +102, +100, +-103, +-103, +-96, + 3, + 1, + 14, + 39, + 37, + 51, + 93, + 89, + 94, +105, +102, +105, +103, +100, +101, +104, +101, +101, +103, +101, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +103, +101, +100, +100, + 98, + 97, + 91, + 89, + 88, + 38, + 34, + 41, +-52, +-52, +-40, +-19, +-12, + 0, + -6, + 6, + 15, + -8, + 4, + 8, + 1, + 11, + 12, + -1, + 7, + 11, + 1, + 10, + 15, + -1, + 8, + 15, +-38, +-30, +-21, +-31, +-24, +-13, +-36, +-27, +-19, +-22, + -9, +-13, + 1, + 12, + 10, + 87, + 95, + 97, + 88, + 93, +100, + 89, + 91, +104, + 89, + 93, +100, + 86, + 94, + 94, + 87, + 94, + 96, + 87, + 93, + 97, + 87, + 93, + 99, + 89, + 95, +102, + 65, + 65, + 70, + 19, + 0, + -7, + 10, +-30, +-54, + 14, +-25, +-53, + 13, +-20, +-52, + 20, +-16, +-54, + 32, + -8, +-35, + 39, + 0, +-26, + 45, + 6, +-22, + 45, + 8, +-23, + 39, + 5, +-28, + 40, + 6, +-27, + 44, + 6, +-24, + 43, + 4, +-27, + 49, + 7, +-25, + 54, + 7, +-24, + 57, + 8, +-23, + 59, + 7, +-25, + 60, + 10, +-22, + 48, + 9, +-16, + 27, + 17, + 10, + 97, +100, +100, +104, +104, + 98, +105, +102, + 99, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +105, +103, +102, +105, +103, +102, +107, +105, +103, +107, +105, +104, +106, +104, +103, +102, +100, + 98, +103, +100, + 99, +103, +101, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +100, + 98, + 97, +103, +101, + 99, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +102, +100, + 98, +102, +100, + 99, +104, +102, +100, +-90, +-92, +-86, +-24, +-27, +-15, + 38, + 33, + 49, + 78, + 74, + 78, +104, +100, +104, +104, +101, +103, +104, +102, +101, +103, +101, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +100, + 98, + 96, + 91, + 89, + 87, + 40, + 36, + 42, +-55, +-55, +-44, +-29, +-22, + -9, +-35, +-23, +-12, +-36, +-25, +-16, +-32, +-23, +-17, +-38, +-26, +-19, +-36, +-24, +-16, +-37, +-26, +-16, +-41, +-31, +-19, +-39, +-28, +-15, +-27, +-17, + -2, +-29, +-22, + -3, + -8, + -1, + 9, + 84, + 93, + 95, + 80, + 87, + 85, + 80, + 86, + 85, + 83, + 90, + 89, + 85, + 92, + 93, + 87, + 93, + 97, + 87, + 92, +102, + 74, + 78, + 92, + 40, + 43, + 60, + 11, + 13, + 28, + 51, + 36, + 40, + 15, +-23, +-35, + 17, +-18, +-36, + 21, +-10, +-32, + 29, + -3, +-34, + 39, + 4, +-23, + 40, + 4, +-23, + 37, + 1, +-26, + 35, + 0, +-29, + 38, + 3, +-29, + 43, + 7, +-25, + 42, + 5, +-26, + 47, + 8, +-25, + 52, + 10, +-23, + 57, + 10, +-24, + 61, + 13, +-21, + 63, + 13, +-21, + 63, + 15, +-21, + 45, + 6, +-24, + -5, +-17, +-29, + 75, + 78, + 77, + 99, +100, + 97, +102, +100, + 97, +104, +102, +100, +102, +100, + 98, + 98, + 96, + 94, +106, +104, +102, +105, +103, +102, +106, +103, +102, +106, +104, +102, +106, +104, +103, +105, +103, +102, +104, +102, +101, +104, +102, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +101, + 99, + 97, +104, +102, +101, +106, +104, +102, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +-49, +-53, +-46, +-55, +-60, +-48, + 35, + 28, + 44, + 64, + 61, + 65, +102, + 99, +102, +103, +100, +102, +104, +102, +102, +104, +102, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +106, +104, +102, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +100, + 98, + 97, + 92, + 90, + 88, + 43, + 41, + 42, +-57, +-56, +-50, +-28, +-20, +-11, +-34, +-22, +-13, +-35, +-23, +-15, +-32, +-23, +-17, +-38, +-26, +-19, +-38, +-25, +-18, +-39, +-26, +-17, +-37, +-25, +-15, +-36, +-24, +-12, + -6, + 3, + 21, + -8, + -3, + 25, +-10, + -3, + 10, + 87, + 95, + 96, + 85, + 93, + 89, + 87, + 93, + 90, + 86, + 91, + 95, + 76, + 81, + 92, + 61, + 64, + 79, + 31, + 34, + 51, + -7, + -6, + 18, +-22, +-22, + 4, + 21, + 21, + 43, + 32, + 17, + 28, + -5, +-43, +-47, + -2, +-39, +-47, + 4, +-28, +-39, + 16, +-18, +-37, + 22, +-10, +-35, + 26, + -6, +-33, + 31, + -3, +-30, + 35, + 0, +-28, + 38, + 3, +-27, + 43, + 7, +-24, + 47, + 11, +-23, + 50, + 11, +-23, + 55, + 13, +-22, + 60, + 14, +-21, + 63, + 15, +-20, + 60, + 13, +-22, + 59, + 12, +-23, + 38, + -3, +-34, +-14, +-30, +-39, + 52, + 52, + 55, + 63, + 64, + 68, +104, +102, +102, +107, +105, +103, +107, +105, +103, +103, +101, +100, +107, +105, +103, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +105, +103, +102, +104, +101, +100, +101, + 99, + 97, +103, +101, + 99, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, + -8, +-12, + -5, +-85, +-90, +-78, + 25, + 19, + 34, + 52, + 48, + 53, +102, + 99, +102, +106, +103, +104, +106, +103, +103, +106, +104, +102, +106, +104, +103, +107, +105, +104, +107, +105, +104, +106, +104, +103, +105, +103, +101, +105, +103, +101, +104, +102, +101, +103, +101, + 99, +102, +100, + 98, +102, +100, + 98, +100, + 98, + 97, + 92, + 90, + 88, + 47, + 46, + 44, +-60, +-58, +-57, +-30, +-21, +-17, +-32, +-19, +-13, +-32, +-20, +-15, +-24, +-14, +-11, +-37, +-23, +-20, +-37, +-22, +-18, +-38, +-24, +-18, +-39, +-25, +-18, +-37, +-24, +-15, +-26, +-14, + -4, +-15, + -5, + 5, +-14, + -4, + -2, + 84, + 93, + 92, + 74, + 80, + 86, + 55, + 55, + 72, + 23, + 23, + 45, + 0, + 0, + 25, +-15, +-15, + 10, +-26, +-27, + 1, +-30, +-31, + -1, +-39, +-41, + -9, + 28, + 28, + 42, + 7, + -8, + -8, +-11, +-49, +-62, +-15, +-54, +-67, + -5, +-40, +-53, + 13, +-23, +-42, + 23, + -7, +-31, + 27, + -3, +-28, + 34, + 2, +-25, + 39, + 4, +-23, + 44, + 7, +-20, + 45, + 8, +-21, + 50, + 13, +-21, + 52, + 14, +-21, + 54, + 12, +-23, + 57, + 11, +-25, + 56, + 9, +-28, + 55, + 8, +-24, + 49, + 2, +-29, + 27, +-15, +-42, + 13, + -4, +-10, + 51, + 49, + 56, + -5, + -5, + 6, + 86, + 84, + 86, +108, +106, +105, +108, +106, +105, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 11, + 13, + 20, +-110, +-108, +-100, + 4, + 5, + 16, + 42, + 38, + 48, + 93, + 89, + 95, +106, +103, +104, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +103, +101, +100, +103, +101, + 99, +103, +101, + 99, +100, + 98, + 97, + 92, + 90, + 89, + 50, + 48, + 49, +-60, +-57, +-55, +-34, +-24, +-23, +-41, +-27, +-25, +-45, +-31, +-28, +-42, +-31, +-26, +-49, +-37, +-30, +-48, +-36, +-28, +-40, +-29, +-19, +-38, +-28, +-14, +-40, +-31, +-15, +-25, +-18, + 1, + -8, + -6, + 18, + -3, + 0, + 22, + 8, + 10, + 30, + -8, + -8, + 17, +-23, +-25, + 6, +-35, +-37, + -5, +-31, +-33, + -2, +-32, +-33, + -4, +-36, +-36, + -8, +-39, +-39, +-12, +-48, +-48, +-21, + 34, + 35, + 44, + 13, + 1, + -5, + -7, +-43, +-68, + 4, +-41, +-71, + -5, +-50, +-73, + 6, +-36, +-51, + 20, +-13, +-33, + 31, + -3, +-25, + 39, + 3, +-20, + 45, + 8, +-17, + 46, + 8, +-19, + 46, + 7, +-22, + 46, + 6, +-27, + 46, + 6, +-27, + 48, + 6, +-26, + 43, + -1, +-33, + 41, + -6, +-38, + 42, +-12, +-41, + 32, +-20, +-49, + 11, +-22, +-49, + 59, + 51, + 39, + 42, + 43, + 50, +-45, +-44, +-18, + -5, + -6, + 12, + 68, + 66, + 79, +102, +101, +109, +104, +103, +105, +103, +102, +100, +105, +104, + 98, +106, +105, +101, +106, +104, +102, +106, +104, +103, +106, +103, +104, +106, +103, +104, +106, +103, +104, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 28, + 29, + 38, +-94, +-94, +-86, +-21, +-21, +-11, + 40, + 35, + 47, + 82, + 78, + 85, +104, +101, +102, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +102, +100, + 98, + 99, + 97, + 96, + 91, + 89, + 87, + 52, + 50, + 52, +-60, +-58, +-54, +-25, +-16, +-11, +-21, + -8, + -1, +-43, +-33, +-21, +-31, +-23, + -8, +-25, +-19, + -1, +-15, + -9, + 10, +-10, + -4, + 17, + -5, + 0, + 24, + -4, + 1, + 26, + -9, + -7, + 21, +-13, +-14, + 17, +-18, +-19, + 12, +-25, +-26, + 5, +-37, +-39, + -8, +-45, +-46, +-15, +-49, +-50, +-20, +-42, +-43, +-14, +-45, +-46, +-17, +-47, +-47, +-21, +-55, +-55, +-31, +-60, +-60, +-36, + 37, + 39, + 50, + 27, + 18, + 14, + -7, +-38, +-62, + 12, +-33, +-67, + 7, +-41, +-70, + -8, +-50, +-71, + 13, +-26, +-46, + 28, +-11, +-33, + 37, + -4, +-27, + 42, + -1, +-25, + 40, + -3, +-30, + 38, + -5, +-33, + 38, + -8, +-36, + 40, + -6, +-35, + 40, + -8, +-38, + 31, +-18, +-51, + 33, +-19, +-53, + 27, +-27, +-64, + 17, +-30, +-62, + 18, + -5, +-24, + 79, + 72, + 70, + 36, + 36, + 48, +-56, +-56, +-28, +-39, +-41, +-14, +-27, +-29, + -6, + 35, + 33, + 49, + 94, + 92, +101, +104, +103, +106, +104, +103, +102, +107, +105, +101, +107, +105, +102, +107, +105, +103, +107, +105, +103, +107, +105, +104, +106, +104, +103, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 50, + 45, + 59, +-54, +-58, +-48, +-50, +-53, +-45, + 37, + 32, + 44, + 68, + 63, + 71, +103, +100, +102, +102, +100, + 99, +102, +100, + 99, +103, +100, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +106, +104, +102, +105, +103, +101, +102, + 99, + 98, +102, +100, + 98, +100, + 98, + 96, + 92, + 90, + 88, + 55, + 52, + 53, +-60, +-60, +-55, +-28, +-22, +-10, +-14, + -6, + 13, +-12, + -7, + 18, + -4, + -2, + 27, + -5, + -4, + 26, + -9, + -8, + 23, +-13, +-12, + 20, +-16, +-16, + 17, +-25, +-25, + 8, +-32, +-32, + 0, +-31, +-31, + -3, +-38, +-38, +-10, +-44, +-45, +-17, +-50, +-50, +-22, +-52, +-53, +-25, +-43, +-44, +-16, +-45, +-45, +-18, +-55, +-55, +-29, +-60, +-60, +-37, +-71, +-70, +-49, +-78, +-77, +-56, + 36, + 38, + 49, + 43, + 37, + 36, + -1, +-24, +-43, + 13, +-24, +-57, + 17, +-26, +-61, + 10, +-33, +-65, + 13, +-32, +-56, + 28, +-17, +-42, + 33, +-14, +-39, + 36, +-12, +-37, + 33, +-17, +-42, + 30, +-21, +-44, + 29, +-25, +-43, + 29, +-27, +-50, + 26, +-31, +-62, + 27, +-30, +-67, + 31, +-24, +-64, + 21, +-25, +-69, + 2, +-29, +-64, + 58, + 40, + 33, + 83, + 74, + 87, + 15, + 12, + 33, +-60, +-59, +-37, +-51, +-52, +-26, +-44, +-46, +-18, +-30, +-32, + -9, + -1, + -3, + 15, + 49, + 47, + 60, + 92, + 89, + 99, +106, +104, +107, +106, +105, +105, +106, +105, +104, +105, +105, +103, +105, +106, +101, +105, +105, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 34, + 27, + 44, +-12, +-17, + -6, +-80, +-83, +-77, + 29, + 24, + 36, + 55, + 50, + 58, +100, + 97, + 98, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +103, +101, + 99, +104, +102, +100, +103, +101, +100, +100, + 98, + 96, + 98, + 96, + 94, + 90, + 88, + 86, + 58, + 54, + 53, +-55, +-58, +-52, +-25, +-23, + -5, +-28, +-24, + 3, +-35, +-34, + -1, +-24, +-26, + 9, +-23, +-26, + 11, +-28, +-31, + 5, +-31, +-34, + 2, +-38, +-41, + -5, +-43, +-45, +-10, +-48, +-49, +-17, +-51, +-50, +-25, +-55, +-54, +-29, +-57, +-57, +-32, +-58, +-58, +-33, +-62, +-62, +-37, +-69, +-68, +-45, +-57, +-56, +-34, +-62, +-61, +-39, +-72, +-70, +-51, +-86, +-84, +-67, +-89, +-86, +-69, + 12, + 16, + 25, + -6, + -8, + -9, + 21, + 8, + -8, + 6, +-20, +-52, + 15, +-22, +-61, + 23, +-22, +-61, + 18, +-30, +-60, + 27, +-21, +-50, + 33, +-19, +-46, + 37, +-16, +-43, + 34, +-20, +-46, + 28, +-29, +-50, + 24, +-34, +-49, + 24, +-37, +-59, + 23, +-38, +-69, + 25, +-31, +-66, + 21, +-28, +-63, + 11, +-19, +-55, + 41, + 27, + 6, + 82, + 69, + 71, + 77, + 69, + 90, +-13, +-16, + 7, +-64, +-62, +-44, +-56, +-55, +-30, +-47, +-48, +-19, +-43, +-45, +-17, +-31, +-34, + -9, +-21, +-25, + -1, + 2, + -2, + 20, + 60, + 57, + 68, + 99, + 98, +106, +105, +104, +109, +104, +104, +104, +104, +106, +102, +105, +106, +101, +107, +106, +103, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 15, + 12, + 30, + 19, + 18, + 29, +-102, +-101, +-97, + 13, + 8, + 19, + 43, + 38, + 46, + 97, + 94, + 96, +105, +103, +101, +105, +103, +101, +105, +102, +102, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +103, +101, +100, +103, +101, +100, +101, + 99, + 97, +100, + 98, + 96, + 92, + 90, + 89, + 63, + 58, + 57, +-56, +-60, +-53, +-29, +-29, + -8, +-47, +-47, +-16, +-50, +-51, +-19, +-38, +-40, +-10, +-40, +-43, + -9, +-42, +-45, +-11, +-49, +-51, +-19, +-53, +-55, +-25, +-57, +-58, +-30, +-62, +-62, +-37, +-65, +-64, +-42, +-66, +-65, +-43, +-66, +-64, +-43, +-64, +-62, +-41, +-67, +-66, +-45, +-102, +-101, +-81, +-81, +-80, +-61, +-76, +-74, +-56, +-84, +-81, +-65, +-90, +-87, +-72, +-91, +-88, +-74, +-16, + -7, + -6, +-14, + -8, +-15, + 6, + 3, +-15, + 11, + -5, +-34, + 13, +-21, +-59, + 25, +-22, +-63, + 25, +-22, +-58, + 21, +-26, +-60, + 25, +-25, +-57, + 32, +-21, +-50, + 28, +-26, +-53, + 24, +-32, +-56, + 21, +-37, +-56, + 20, +-40, +-65, + 18, +-39, +-68, + 15, +-30, +-57, + 10, +-22, +-41, + 42, + 30, + 16, + 76, + 73, + 66, + 77, + 74, + 78, + 66, + 64, + 78, +-42, +-44, +-27, +-64, +-64, +-45, +-61, +-59, +-36, +-53, +-51, +-25, +-51, +-50, +-24, +-46, +-47, +-20, +-37, +-41, +-13, +-29, +-33, + -5, +-13, +-17, + 7, + 17, + 15, + 33, + 73, + 73, + 84, +101, +102, +107, +103, +105, +105, +103, +105, +102, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 30, + 31, + 49, + 32, + 36, + 45, +-92, +-88, +-86, + -3, + -7, + 3, + 44, + 40, + 48, + 85, + 83, + 84, +104, +102, +101, +105, +103, +101, +105, +102, +102, +105, +103, +101, +105, +103, +101, +105, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +104, +102, + 99, +101, + 99, + 97, +100, + 98, + 96, + 92, + 90, + 88, + 65, + 60, + 59, +-42, +-47, +-38, +-42, +-45, +-23, +-60, +-60, +-31, +-56, +-56, +-29, +-54, +-56, +-32, +-52, +-56, +-27, +-57, +-60, +-33, +-60, +-63, +-37, +-63, +-65, +-41, +-67, +-68, +-48, +-72, +-72, +-53, +-74, +-72, +-52, +-70, +-68, +-49, +-67, +-66, +-46, +-66, +-64, +-45, +-73, +-72, +-52, +-85, +-83, +-65, +-86, +-84, +-68, +-88, +-85, +-69, +-90, +-87, +-73, +-94, +-90, +-78, +-96, +-92, +-80, +-12, + -2, + -7, + 5, + 14, + 3, + 4, + 8, + -9, + 23, + 13, +-11, + 11, +-22, +-56, + 30, +-18, +-59, + 26, +-19, +-59, + 25, +-21, +-58, + 21, +-28, +-62, + 19, +-32, +-63, + 19, +-34, +-62, + 22, +-31, +-59, + 20, +-35, +-63, + 17, +-38, +-67, + 11, +-37, +-62, + 21, + -9, +-23, + 55, + 40, + 35, + 30, + 28, + 31, + -2, + 1, + 8, + 65, + 67, + 72, + 47, + 48, + 54, +-77, +-76, +-65, +-68, +-69, +-49, +-66, +-64, +-42, +-64, +-60, +-38, +-59, +-58, +-34, +-51, +-52, +-26, +-49, +-52, +-24, +-44, +-48, +-18, +-32, +-38, + -6, +-16, +-22, + 7, + -3, + -6, + 14, + 33, + 32, + 45, + 82, + 83, + 90, +102, +103, +106, +105, +103, +103, +103, +101, +100, +103, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 54, + 55, + 70, + 41, + 44, + 53, +-53, +-50, +-47, +-31, +-33, +-21, + 44, + 43, + 54, + 69, + 68, + 74, +103, +101, +103, +105, +103, +101, +104, +103, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +101, + 99, + 98, + 99, + 97, + 96, + 92, + 90, + 89, + 66, + 66, + 68, +-32, +-34, +-22, +-62, +-66, +-43, +-65, +-70, +-42, +-67, +-70, +-48, +-66, +-68, +-52, +-69, +-70, +-50, +-69, +-70, +-50, +-69, +-70, +-50, +-72, +-73, +-53, +-77, +-78, +-58, +-77, +-77, +-58, +-77, +-76, +-59, +-75, +-75, +-58, +-68, +-68, +-50, +-70, +-70, +-53, +-83, +-83, +-65, +-90, +-89, +-74, +-86, +-85, +-71, +-88, +-86, +-74, +-91, +-88, +-79, +-91, +-88, +-80, +-93, +-90, +-83, + -3, + 2, + -4, + 12, + 16, + 3, + 1, + 7, + -4, + 5, + 7, + -4, + 6, +-14, +-34, + 25, +-25, +-63, + 29, +-18, +-59, + 31, +-24, +-55, + 23, +-42, +-62, + 18, +-49, +-67, + 19, +-42, +-68, + 22, +-34, +-68, + 20, +-32, +-72, + 12, +-33, +-55, + 41, + 11, + 7, + 59, + 45, + 49, + 42, + 45, + 49, + 11, + 21, + 20, + -8, + 0, + -3, + 43, + 51, + 50, + 2, + 7, + 10, +-103, +-98, +-88, +-81, +-78, +-63, +-69, +-68, +-47, +-66, +-65, +-41, +-64, +-63, +-38, +-50, +-50, +-23, +-51, +-53, +-24, +-57, +-59, +-29, +-49, +-50, +-23, +-39, +-40, +-13, +-25, +-26, + 2, +-14, +-15, + 14, + 0, + -2, + 27, + 35, + 33, + 56, + 82, + 79, + 89, +104, +102, +110, +102, +102, +105, +103, +105, +101, +105, +107, + 99, +105, +104, + 99, +107, +103, +103, +107, +103, +103, +106, +103, +102, +105, +103, +101, +103, +101, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, + 99, + 60, + 62, + 76, + 51, + 52, + 64, +-16, +-16, + -6, +-66, +-67, +-54, + 38, + 36, + 49, + 53, + 51, + 60, +102, +100, +103, +104, +102, +101, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +102, +104, +102, +100, +103, +101, +100, +102, +100, + 98, + 95, + 93, + 91, + 73, + 73, + 76, +-20, +-20, + -9, +-69, +-73, +-51, +-75, +-80, +-54, +-77, +-81, +-61, +-78, +-79, +-66, +-79, +-79, +-62, +-79, +-80, +-62, +-79, +-80, +-62, +-81, +-81, +-63, +-82, +-83, +-65, +-78, +-78, +-61, +-77, +-77, +-61, +-75, +-75, +-59, +-84, +-83, +-68, +-87, +-87, +-71, +-90, +-89, +-74, +-91, +-90, +-76, +-87, +-86, +-73, +-90, +-89, +-78, +-92, +-90, +-81, +-93, +-90, +-82, +-90, +-87, +-81, + 9, + 17, + 10, + 17, + 24, + 11, + 14, + 22, + 11, + 10, + 15, + 7, + 28, + 11, + -5, + 11, +-38, +-71, + 19, +-30, +-68, + 24, +-26, +-60, + 14, +-40, +-68, + 5, +-51, +-76, + 10, +-48, +-75, + 24, +-36, +-66, + 22, +-34, +-65, + 17, +-19, +-36, + 65, + 50, + 44, + 42, + 41, + 42, + 37, + 43, + 46, + 18, + 26, + 24, + 12, + 21, + 16, + 31, + 39, + 38, +-44, +-38, +-35, +-103, +-99, +-89, +-89, +-85, +-72, +-76, +-73, +-56, +-64, +-62, +-43, +-59, +-57, +-37, +-59, +-58, +-36, +-62, +-62, +-38, +-64, +-63, +-39, +-56, +-56, +-31, +-51, +-51, +-26, +-42, +-43, +-15, +-29, +-30, + -1, +-19, +-20, + 10, + -9, +-11, + 19, + 1, + -3, + 21, + 39, + 36, + 55, + 89, + 88, +101, + 99, +100, +106, +101, +104, +104, +106, +106, +104, +108, +105, +103, +108, +106, +103, +108, +106, +104, +106, +104, +103, +105, +103, +101, +105, +103, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +103, +102, + 98, + 50, + 53, + 66, +-11, +-12, + 2, + 18, + 16, + 31, +-64, +-66, +-50, + 26, + 25, + 38, + 43, + 41, + 51, + 95, + 93, + 98, +104, +101, +102, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +100, +102, +100, + 98, +103, +101, + 99, +102, +100, + 98, + 95, + 93, + 92, + 72, + 72, + 77, +-32, +-33, +-21, +-86, +-89, +-70, +-88, +-92, +-71, +-89, +-91, +-74, +-85, +-85, +-73, +-86, +-85, +-70, +-86, +-85, +-70, +-86, +-86, +-70, +-89, +-88, +-73, +-87, +-86, +-70, +-83, +-82, +-67, +-83, +-82, +-68, +-81, +-80, +-67, +-89, +-88, +-74, +-92, +-91, +-78, +-90, +-89, +-76, +-89, +-88, +-74, +-89, +-87, +-75, +-93, +-92, +-81, +-94, +-92, +-83, +-95, +-92, +-84, +-92, +-89, +-83, + 11, + 23, + 15, + 19, + 29, + 14, + 15, + 26, + 12, + 13, + 20, + 12, + 32, + 19, + 7, + 12, +-30, +-56, + 25, +-35, +-65, + 18, +-38, +-71, + 18, +-34, +-68, + 12, +-42, +-72, + 13, +-47, +-72, + 31, +-35, +-56, + 22, +-32, +-51, + 23, + 2, +-13, + 50, + 55, + 44, + 28, + 42, + 36, + 30, + 35, + 35, + 26, + 30, + 28, + 24, + 33, + 28, + 16, + 24, + 23, +-54, +-48, +-45, +-102, +-97, +-88, +-89, +-86, +-73, +-87, +-83, +-71, +-73, +-68, +-57, +-75, +-72, +-59, +-102, +-99, +-85, +-76, +-73, +-57, +-67, +-65, +-46, +-64, +-62, +-41, +-59, +-58, +-36, +-51, +-51, +-27, +-44, +-44, +-19, +-35, +-35, + -8, +-23, +-26, + 5, +-14, +-22, + 16, + -9, +-16, + 18, + 4, + -1, + 25, + 31, + 29, + 47, + 65, + 64, + 77, + 95, + 96, +100, +103, +104, +102, +103, +104, +102, +104, +104, +102, +104, +102, +101, +103, +101, +101, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, + 99, + 71, + 75, + 87, + 4, + 4, + 18, + 38, + 35, + 53, +-10, +-12, + 5, + 19, + 17, + 33, + 42, + 39, + 51, + 87, + 84, + 90, +103, +100, +103, +104, +101, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +104, +102, +100, +104, +102, +100, +103, +101, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +102, +100, + 98, + 97, + 95, + 93, + 29, + 28, + 35, +-73, +-75, +-61, +-91, +-93, +-77, +-94, +-96, +-81, +-91, +-92, +-79, +-87, +-87, +-77, +-92, +-90, +-79, +-92, +-91, +-79, +-92, +-90, +-78, +-90, +-88, +-76, +-88, +-87, +-74, +-87, +-86, +-73, +-86, +-84, +-72, +-87, +-86, +-74, +-100, +-98, +-87, +-93, +-92, +-80, +-90, +-89, +-77, +-88, +-86, +-74, +-89, +-88, +-75, +-94, +-92, +-81, +-97, +-94, +-85, +-96, +-93, +-86, +-92, +-89, +-83, + 18, + 29, + 23, + 24, + 34, + 19, + 18, + 28, + 14, + 14, + 26, + 18, + 28, + 24, + 14, + 25, + -1, +-19, + 25, +-36, +-55, + 29, +-35, +-61, + 31, +-33, +-65, + 15, +-47, +-77, + 21, +-40, +-59, + 27, +-30, +-40, + 45, + 12, + 4, + 40, + 32, + 20, + 29, + 43, + 30, + 23, + 41, + 31, + 33, + 40, + 35, + 29, + 34, + 28, + 27, + 36, + 31, + 28, + 36, + 35, +-81, +-76, +-73, +-98, +-94, +-84, +-92, +-89, +-75, +-91, +-86, +-76, +-93, +-88, +-80, +-103, +-98, +-89, +-106, +-102, +-90, +-84, +-81, +-68, +-71, +-68, +-52, +-66, +-64, +-45, +-65, +-63, +-44, +-63, +-62, +-41, +-58, +-56, +-34, +-49, +-48, +-24, +-41, +-42, +-14, +-29, +-35, + 4, +-24, +-28, + 7, +-18, +-21, + 10, +-14, +-16, + 12, + -8, + -9, + 15, + 7, + 9, + 24, + 57, + 61, + 67, + 98, +100, +105, +102, +102, +106, +103, +100, +102, +103, + 99, +100, +102, + 99, + 98, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 96, + 78, + 85, + 93, + 47, + 48, + 58, + 45, + 42, + 56, + 20, + 17, + 36, + 25, + 23, + 40, + 42, + 39, + 51, + 72, + 69, + 76, +104, +101, +105, +103, +100, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +101, + 99, + 97, +103, +101, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 98, +101, + 99, + 98, + 89, + 87, + 86, +-29, +-31, +-23, +-84, +-86, +-71, +-94, +-95, +-82, +-102, +-102, +-91, +-98, +-98, +-88, +-94, +-94, +-86, +-95, +-93, +-84, +-95, +-93, +-84, +-95, +-93, +-84, +-93, +-91, +-82, +-93, +-91, +-82, +-93, +-91, +-82, +-89, +-87, +-76, +-88, +-86, +-76, +-106, +-104, +-93, +-96, +-95, +-84, +-89, +-87, +-77, +-89, +-87, +-76, +-91, +-90, +-77, +-94, +-92, +-82, +-97, +-94, +-85, +-97, +-94, +-87, +-85, +-82, +-77, + 23, + 30, + 25, + 30, + 35, + 22, + 22, + 30, + 17, + 17, + 34, + 27, + 5, + 15, + 7, + 30, + 20, + 3, + 26, + -6, +-24, + 25, +-27, +-50, + 25, +-41, +-70, + 13, +-48, +-74, + 23, +-17, +-35, + 48, + 26, + 16, + 49, + 41, + 36, + 26, + 28, + 20, + 26, + 37, + 26, + 30, + 41, + 31, + 32, + 40, + 31, + 33, + 41, + 33, + 39, + 48, + 42, + 19, + 26, + 24, +-101, +-95, +-92, +-97, +-93, +-83, +-93, +-89, +-76, +-89, +-85, +-74, +-90, +-86, +-76, +-86, +-82, +-70, +-82, +-78, +-65, +-82, +-78, +-64, +-72, +-69, +-53, +-69, +-66, +-50, +-68, +-65, +-49, +-68, +-66, +-48, +-68, +-66, +-47, +-63, +-61, +-40, +-53, +-52, +-30, +-45, +-45, +-19, +-37, +-37, +-10, +-33, +-33, + -5, +-26, +-27, + 2, +-16, +-17, + 13, +-10, + -9, + 18, + -9, + -7, + 16, + 27, + 28, + 44, + 69, + 68, + 79, +101, + 98, +103, +103, + 98, + 99, +102, + 99, + 98, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 96, + 71, + 79, + 88, + 89, + 93, +101, + 81, + 81, + 92, + 51, + 49, + 66, + 34, + 32, + 49, + 43, + 41, + 56, + 57, + 54, + 64, +103, +100, +104, +103, +100, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +101, + 99, + 97, +100, + 98, + 96, +104, +101, + 99, +104, +102, + 99, +104, +102, + 99, +104, +102, +100, +103, +101, +101, + 62, + 60, + 61, +-61, +-63, +-51, +-91, +-92, +-78, +-101, +-101, +-90, +-105, +-105, +-96, +-101, +-101, +-93, +-98, +-97, +-90, +-98, +-96, +-90, +-98, +-96, +-89, +-98, +-96, +-89, +-99, +-96, +-89, +-96, +-94, +-86, +-94, +-91, +-83, +-91, +-89, +-79, +-93, +-91, +-81, +-107, +-104, +-94, +-96, +-94, +-84, +-90, +-88, +-78, +-92, +-90, +-79, +-93, +-92, +-80, +-95, +-93, +-82, +-97, +-95, +-85, +-99, +-96, +-89, +-85, +-82, +-78, + 26, + 29, + 26, + 30, + 33, + 21, + 26, + 33, + 21, + 21, + 38, + 30, + 22, + 36, + 29, + 17, + 20, + 7, + 28, + 22, + 6, + 19, + -9, +-28, + 13, +-35, +-58, + 21, +-19, +-39, + 55, + 39, + 22, + 43, + 48, + 36, + 38, + 49, + 43, + 30, + 38, + 31, + 34, + 39, + 31, + 35, + 41, + 32, + 32, + 40, + 30, + 37, + 46, + 38, + 47, + 55, + 51, + -8, + -2, + -3, +-104, +-99, +-94, +-98, +-94, +-84, +-90, +-87, +-74, +-91, +-88, +-76, +-89, +-85, +-74, +-89, +-86, +-73, +-92, +-89, +-75, +-73, +-70, +-55, +-59, +-56, +-41, +-67, +-65, +-50, +-70, +-68, +-52, +-72, +-70, +-54, +-72, +-71, +-53, +-70, +-68, +-49, +-61, +-60, +-41, +-58, +-56, +-39, +-49, +-47, +-28, +-44, +-44, +-21, +-36, +-37, +-10, +-34, +-35, + -5, +-32, +-32, + 1, +-32, +-33, + 0, +-25, +-27, + 0, + -9, +-11, + 6, + 83, + 78, + 84, +102, + 98, + 97, +100, + 98, + 95, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 97, +102, +100, + 97, +101, +100, + 96, + 72, + 78, + 89, + 92, + 95, +104, + 94, + 96, +104, + 61, + 63, + 73, + 35, + 36, + 52, + 43, + 40, + 60, + 46, + 43, + 57, + 95, + 94, + 96, +102, +101, + 97, +101, + 99, + 98, +101, + 99, + 98, +102, +100, + 99, +103, +101, +100, +103, +101, +100, +104, +101, + 98, +105, +101, + 97, +104, +101, + 97, +104, +102, +101, +101, + 99, +104, + 16, + 12, + 24, +-69, +-70, +-60, +-97, +-97, +-88, +-104, +-104, +-95, +-109, +-109, +-100, +-102, +-102, +-93, +-99, +-99, +-90, +-100, +-99, +-93, +-100, +-100, +-92, +-100, +-100, +-91, +-98, +-99, +-88, +-95, +-96, +-83, +-93, +-94, +-81, +-91, +-89, +-80, +-93, +-90, +-82, +-105, +-103, +-95, +-96, +-93, +-85, +-91, +-88, +-80, +-92, +-89, +-82, +-95, +-93, +-85, +-96, +-95, +-83, +-97, +-95, +-84, +-100, +-97, +-91, +-85, +-81, +-80, + 24, + 31, + 24, + 29, + 36, + 27, + 27, + 34, + 25, + 28, + 36, + 27, + 30, + 38, + 29, + 22, + 29, + 20, + 20, + 24, + 15, + 26, + 20, + 11, + 7, + -7, +-17, + 56, + 44, + 33, + 50, + 47, + 37, + 43, + 49, + 40, + 37, + 43, + 37, + 33, + 40, + 33, + 34, + 41, + 34, + 34, + 40, + 34, + 34, + 40, + 34, + 45, + 51, + 48, + 46, + 51, + 52, +-43, +-39, +-37, +-99, +-96, +-89, +-96, +-94, +-83, +-91, +-89, +-76, +-86, +-84, +-73, +-94, +-92, +-81, +-87, +-85, +-74, +-89, +-87, +-77, +-86, +-84, +-73, +-80, +-78, +-67, +-69, +-69, +-53, +-69, +-69, +-52, +-74, +-74, +-57, +-76, +-76, +-59, +-73, +-73, +-56, +-67, +-66, +-49, +-63, +-63, +-44, +-60, +-61, +-41, +-53, +-54, +-33, +-49, +-51, +-27, +-49, +-51, +-26, +-49, +-50, +-24, +-50, +-52, +-24, +-38, +-41, +-16, +-29, +-35, +-15, + 57, + 50, + 58, +102, + 96, + 94, +100, + 97, + 93, +100, + 98, + 94, +100, + 98, + 94, +101, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 93, + 92, + 96, + 98, + 95, + 97, + 98, + 94, + 95, + 74, + 76, + 83, + 36, + 37, + 51, + 43, + 41, + 59, + 43, + 41, + 55, + 84, + 83, + 86, +101, + 99, + 97, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, + 99, + 98, +103, + 99, + 97, +103, +100, + 96, +102, +100, + 99, + 85, + 82, + 89, +-39, +-43, +-30, +-83, +-84, +-73, +-103, +-103, +-94, +-109, +-109, +-100, +-111, +-111, +-102, +-104, +-104, +-95, +-100, +-100, +-92, +-101, +-100, +-93, +-101, +-101, +-93, +-100, +-100, +-91, +-98, +-99, +-88, +-95, +-96, +-83, +-93, +-93, +-81, +-91, +-89, +-80, +-92, +-89, +-81, +-101, +-99, +-91, +-100, +-97, +-89, +-92, +-89, +-81, +-92, +-89, +-82, +-95, +-93, +-85, +-96, +-95, +-83, +-97, +-96, +-84, +-101, +-98, +-92, +-81, +-77, +-77, + 26, + 32, + 25, + 29, + 37, + 28, + 27, + 34, + 25, + 29, + 36, + 27, + 32, + 39, + 30, + 28, + 36, + 27, + 22, + 30, + 21, + 30, + 32, + 21, + 50, + 46, + 34, + 51, + 47, + 36, + 44, + 47, + 37, + 41, + 49, + 41, + 34, + 41, + 34, + 35, + 42, + 35, + 34, + 41, + 34, + 34, + 41, + 34, + 40, + 47, + 40, + 46, + 52, + 49, + 36, + 40, + 42, +-80, +-77, +-74, +-98, +-95, +-88, +-96, +-94, +-83, +-90, +-89, +-76, +-87, +-85, +-74, +-90, +-88, +-78, +-95, +-93, +-82, +-88, +-86, +-76, +-85, +-83, +-72, +-84, +-82, +-72, +-73, +-72, +-57, +-71, +-71, +-56, +-78, +-77, +-62, +-80, +-80, +-65, +-82, +-81, +-66, +-78, +-77, +-62, +-73, +-72, +-56, +-69, +-69, +-52, +-63, +-64, +-45, +-61, +-62, +-41, +-61, +-62, +-40, +-61, +-62, +-38, +-63, +-65, +-39, +-42, +-44, +-20, +-38, +-43, +-24, + 35, + 28, + 36, +106, +100, + 99, +102, + 99, + 95, +101, +100, + 96, +101, +100, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 68, + 71, + 79, + 80, + 81, + 87, + 94, + 94, + 98, + 85, + 88, + 94, + 40, + 42, + 54, + 43, + 41, + 59, + 43, + 40, + 56, + 72, + 71, + 76, + 98, + 96, + 95, + 99, + 97, + 95, + 99, + 97, + 95, +100, + 98, + 96, +101, + 99, + 97, +101, + 99, + 97, +102, + 98, + 98, +102, + 98, + 97, +102, + 98, + 96, +100, + 97, + 98, + 49, + 47, + 54, +-69, +-74, +-58, +-90, +-92, +-80, +-105, +-105, +-96, +-109, +-109, +-100, +-111, +-111, +-102, +-105, +-105, +-96, +-102, +-102, +-93, +-100, +-99, +-92, +-99, +-99, +-91, +-98, +-98, +-88, +-97, +-98, +-87, +-95, +-96, +-82, +-93, +-93, +-80, +-92, +-89, +-81, +-92, +-89, +-81, +-97, +-94, +-86, +-103, +-101, +-93, +-94, +-91, +-83, +-93, +-90, +-83, +-95, +-93, +-85, +-97, +-95, +-84, +-98, +-96, +-85, +-103, +-100, +-94, +-84, +-79, +-79, + 25, + 32, + 25, + 28, + 35, + 26, + 27, + 34, + 25, + 29, + 36, + 27, + 32, + 40, + 30, + 33, + 41, + 32, + 28, + 40, + 31, + 39, + 47, + 36, + 46, + 51, + 37, + 42, + 48, + 34, + 40, + 50, + 39, + 31, + 42, + 34, + 31, + 38, + 31, + 33, + 39, + 33, + 35, + 42, + 35, + 38, + 45, + 39, + 44, + 51, + 44, + 45, + 51, + 48, + 16, + 20, + 21, +-102, +-99, +-95, +-98, +-95, +-88, +-97, +-95, +-84, +-91, +-90, +-77, +-87, +-86, +-74, +-88, +-86, +-75, +-88, +-86, +-75, +-83, +-81, +-70, +-90, +-88, +-78, +-93, +-91, +-80, +-74, +-73, +-60, +-75, +-74, +-61, +-80, +-78, +-65, +-84, +-83, +-70, +-87, +-86, +-73, +-87, +-85, +-73, +-83, +-81, +-69, +-79, +-78, +-64, +-74, +-73, +-57, +-71, +-71, +-53, +-71, +-72, +-53, +-72, +-72, +-52, +-74, +-74, +-53, +-55, +-57, +-35, +-47, +-52, +-35, + 28, + 21, + 29, +106, +100, +101, +101, + 98, + 95, +100, + 99, + 95, +100, + 99, + 95, +101, +100, + 95, +101, +100, + 96, +101, +100, + 96, + 99, + 97, + 93, + 53, + 65, + 78, + 62, + 69, + 81, + 88, + 94, +104, + 91, + 95, + 99, + 52, + 54, + 64, + 41, + 39, + 57, + 38, + 34, + 51, + 61, + 58, + 67, +103, +100, +102, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, + 99, +100, +105, + 99, +100, +104, +100, + 99, +100, + 97, +100, + 5, + 2, + 11, +-77, +-83, +-64, +-94, +-96, +-83, +-105, +-105, +-96, +-108, +-109, +-100, +-112, +-112, +-103, +-106, +-106, +-97, +-104, +-104, +-95, +-100, +-100, +-93, +-97, +-97, +-89, +-95, +-95, +-85, +-94, +-95, +-84, +-93, +-94, +-81, +-93, +-93, +-81, +-92, +-90, +-81, +-92, +-89, +-81, +-93, +-91, +-83, +-106, +-103, +-95, +-96, +-93, +-85, +-95, +-92, +-85, +-96, +-94, +-86, +-97, +-96, +-85, +-100, +-98, +-87, +-105, +-101, +-96, +-81, +-76, +-76, + 27, + 34, + 27, + 30, + 38, + 29, + 28, + 36, + 27, + 30, + 38, + 29, + 35, + 42, + 33, + 36, + 44, + 35, + 38, + 49, + 43, + 43, + 53, + 44, + 42, + 52, + 38, + 40, + 50, + 37, + 38, + 48, + 39, + 26, + 37, + 31, + 33, + 39, + 33, + 36, + 43, + 36, + 40, + 46, + 40, + 43, + 50, + 43, + 44, + 50, + 44, + 44, + 50, + 47, + -8, + -4, + -3, +-105, +-101, +-97, +-99, +-96, +-88, +-98, +-96, +-85, +-92, +-91, +-78, +-88, +-86, +-75, +-87, +-85, +-74, +-86, +-84, +-73, +-86, +-84, +-74, +-94, +-92, +-82, +-96, +-94, +-83, +-77, +-75, +-64, +-78, +-76, +-65, +-84, +-82, +-71, +-87, +-85, +-74, +-90, +-88, +-77, +-92, +-90, +-79, +-90, +-88, +-79, +-87, +-86, +-75, +-84, +-83, +-71, +-80, +-79, +-65, +-79, +-79, +-63, +-79, +-77, +-61, +-76, +-75, +-58, +-63, +-64, +-46, +-55, +-60, +-45, + 15, + 9, + 16, +103, + 97, + 98, +103, + 99, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 98, + 97, + 93, + 65, + 70, + 79, + 72, + 75, + 83, + 92, + 93, + 99, + 94, + 99, +100, + 63, + 65, + 73, + 47, + 45, + 63, + 38, + 35, + 52, + 50, + 47, + 57, + 98, + 95, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, +100, +101, +105, +100, +102, +104, +100, +101, + 91, + 87, + 91, +-39, +-43, +-32, +-83, +-88, +-68, +-96, +-98, +-85, +-107, +-107, +-98, +-110, +-110, +-101, +-112, +-112, +-103, +-106, +-106, +-97, +-104, +-104, +-95, +-100, +-100, +-93, +-97, +-97, +-89, +-94, +-95, +-85, +-94, +-95, +-83, +-95, +-96, +-83, +-96, +-96, +-84, +-95, +-92, +-84, +-95, +-92, +-84, +-94, +-92, +-84, +-107, +-104, +-96, +-99, +-97, +-88, +-97, +-94, +-87, +-98, +-95, +-87, +-99, +-97, +-86, +-101, +-99, +-88, +-104, +-101, +-95, +-76, +-72, +-72, + 30, + 37, + 29, + 32, + 40, + 30, + 30, + 37, + 28, + 34, + 41, + 32, + 38, + 45, + 36, + 37, + 44, + 36, + 46, + 52, + 48, + 51, + 59, + 51, + 44, + 54, + 42, + 40, + 50, + 39, + 38, + 46, + 39, + 32, + 39, + 34, + 41, + 48, + 41, + 44, + 50, + 44, + 43, + 50, + 44, + 42, + 49, + 42, + 42, + 49, + 43, + 43, + 49, + 46, +-43, +-39, +-38, +-103, +-99, +-95, +-98, +-95, +-88, +-98, +-96, +-85, +-92, +-91, +-78, +-87, +-85, +-74, +-87, +-85, +-74, +-87, +-85, +-75, +-90, +-88, +-78, +-101, +-99, +-88, +-91, +-89, +-79, +-81, +-79, +-69, +-86, +-84, +-73, +-89, +-87, +-77, +-92, +-90, +-79, +-94, +-93, +-82, +-97, +-95, +-85, +-96, +-93, +-85, +-92, +-90, +-82, +-90, +-88, +-78, +-89, +-88, +-77, +-86, +-84, +-71, +-89, +-86, +-73, +-85, +-83, +-70, +-79, +-79, +-63, +-67, +-71, +-58, +-20, +-26, +-19, + 98, + 92, + 93, +104, +101, + 98, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +102, + 98, + 93, + 93, + 98, +100, + 98, +103, +100, + 98, +101, + 95, + 98, + 99, + 79, + 80, + 88, + 54, + 52, + 69, + 45, + 42, + 60, + 44, + 42, + 56, + 88, + 86, + 92, +100, + 97, + 96, +101, + 99, + 98, +102, +100, + 99, +102, +100, + 98, +101, + 99, + 97, + 99, + 96, + 95, +103, + 99, + 99, +103, +100, +102, + 58, + 55, + 60, +-69, +-72, +-60, +-89, +-93, +-75, +-99, +-100, +-89, +-108, +-108, +-101, +-112, +-111, +-105, +-112, +-111, +-105, +-107, +-107, +-100, +-105, +-104, +-97, +-99, +-99, +-90, +-96, +-96, +-86, +-95, +-95, +-85, +-96, +-97, +-85, +-98, +-99, +-86, +-99, +-100, +-88, +-98, +-97, +-88, +-97, +-96, +-87, +-96, +-95, +-86, +-106, +-104, +-96, +-100, +-99, +-90, +-98, +-96, +-88, +-98, +-95, +-87, +-99, +-97, +-88, +-101, +-98, +-90, +-104, +-100, +-96, +-76, +-71, +-71, + 30, + 37, + 31, + 33, + 40, + 32, + 31, + 38, + 30, + 36, + 43, + 35, + 34, + 41, + 33, + 33, + 39, + 32, + 49, + 53, + 50, + 49, + 54, + 49, + 53, + 58, + 51, + 47, + 52, + 45, + 40, + 45, + 41, + 41, + 46, + 42, + 45, + 51, + 45, + 42, + 49, + 42, + 43, + 49, + 43, + 42, + 48, + 42, + 44, + 50, + 44, + 33, + 39, + 36, +-83, +-80, +-78, +-102, +-99, +-94, +-98, +-95, +-88, +-98, +-96, +-86, +-92, +-90, +-78, +-86, +-84, +-73, +-86, +-84, +-73, +-89, +-87, +-76, +-94, +-92, +-82, +-102, +-100, +-89, +-85, +-83, +-73, +-85, +-83, +-72, +-92, +-90, +-80, +-94, +-92, +-83, +-97, +-94, +-85, +-98, +-95, +-88, +-100, +-97, +-90, +-99, +-97, +-90, +-98, +-95, +-88, +-95, +-92, +-84, +-94, +-92, +-82, +-93, +-91, +-81, +-97, +-95, +-85, +-92, +-92, +-80, +-91, +-90, +-77, +-81, +-82, +-70, +-52, +-56, +-49, + 87, + 82, + 83, +105, +101, + 99, +105, +102, + 98, +104, +101, + 97, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 97, + 89, + 89, + 96, + 87, + 88, + 94, + 90, + 91, + 97, + 91, + 93, + 94, + 90, + 90, + 99, + 64, + 62, + 78, + 45, + 42, + 61, + 39, + 37, + 53, + 75, + 73, + 82, +100, + 98, + 97, +101, + 99, + 97, +100, + 97, + 96, +101, + 99, + 97, +102, +100, + 98, + 98, + 97, + 94, +101, + 99, + 97, +102, +100, +102, + 16, + 14, + 19, +-79, +-81, +-69, +-95, +-97, +-81, +-102, +-102, +-94, +-110, +-109, +-105, +-113, +-111, +-107, +-112, +-110, +-106, +-109, +-107, +-103, +-106, +-104, +-100, +-97, +-97, +-87, +-93, +-94, +-83, +-94, +-95, +-84, +-96, +-97, +-86, +-98, +-98, +-87, +-99, +-99, +-89, +-98, +-98, +-89, +-97, +-97, +-88, +-96, +-96, +-87, +-103, +-103, +-94, +-101, +-101, +-92, +-97, +-96, +-87, +-96, +-93, +-86, +-99, +-95, +-89, +-103, +-99, +-95, +-108, +-104, +-101, +-67, +-63, +-62, + 35, + 41, + 36, + 34, + 41, + 34, + 32, + 38, + 32, + 39, + 46, + 39, + 34, + 41, + 34, + 35, + 42, + 35, + 51, + 55, + 51, + 51, + 55, + 51, + 53, + 57, + 53, + 54, + 57, + 54, + 47, + 50, + 47, + 43, + 47, + 43, + 42, + 49, + 42, + 43, + 49, + 43, + 42, + 49, + 42, + 40, + 47, + 41, + 43, + 50, + 43, + 9, + 15, + 12, +-105, +-101, +-98, +-101, +-97, +-92, +-99, +-97, +-89, +-99, +-97, +-88, +-91, +-89, +-78, +-86, +-84, +-73, +-85, +-83, +-73, +-91, +-89, +-78, +-100, +-98, +-87, +-94, +-92, +-81, +-85, +-83, +-72, +-89, +-87, +-76, +-96, +-94, +-84, +-100, +-97, +-89, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-98, +-94, +-101, +-99, +-91, +-101, +-99, +-91, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-101, +-92, +-93, +-94, +-85, +-92, +-89, +-78, +-83, +-80, +-69, +-53, +-53, +-46, + 87, + 83, + 85, +100, + 96, + 94, +101, + 97, + 94, +105, +101, + 98, +105, +101, + 98, +104, +100, + 97, +104, +100, + 97, +102, + 99, + 93, +102, +103, +109, + 96, + 97, +103, + 99, + 99, +106, +101, +102, +106, +100, +100, +108, + 71, + 70, + 83, + 53, + 51, + 67, + 40, + 38, + 55, + 62, + 60, + 71, +101, + 99, + 97, +100, + 98, + 96, + 97, + 95, + 93, +101, + 99, + 97, +102, +100, + 98, +101, + 99, + 96, +101, + 99, + 97, + 91, + 88, + 92, +-41, +-43, +-36, +-83, +-84, +-72, +-95, +-97, +-83, +-105, +-105, +-98, +-112, +-111, +-107, +-113, +-111, +-107, +-112, +-110, +-106, +-109, +-107, +-103, +-106, +-104, +-100, +-98, +-98, +-89, +-95, +-95, +-86, +-96, +-96, +-87, +-98, +-98, +-89, +-100, +-100, +-91, +-100, +-100, +-91, +-98, +-98, +-89, +-97, +-97, +-88, +-95, +-95, +-86, +-101, +-101, +-92, +-104, +-104, +-95, +-97, +-96, +-87, +-96, +-93, +-86, +-99, +-95, +-89, +-103, +-99, +-95, +-107, +-103, +-100, +-65, +-60, +-60, + 39, + 46, + 41, + 38, + 44, + 38, + 33, + 40, + 33, + 39, + 46, + 39, + 34, + 41, + 34, + 35, + 41, + 35, + 54, + 58, + 54, + 54, + 57, + 54, + 53, + 56, + 53, + 57, + 60, + 57, + 52, + 56, + 52, + 49, + 52, + 49, + 44, + 50, + 44, + 42, + 49, + 42, + 40, + 47, + 40, + 38, + 45, + 38, + 39, + 46, + 39, +-26, +-21, +-25, +-106, +-101, +-98, +-99, +-96, +-90, +-100, +-97, +-90, +-99, +-97, +-88, +-91, +-89, +-78, +-86, +-84, +-74, +-89, +-87, +-77, +-94, +-93, +-82, +-102, +-100, +-90, +-88, +-86, +-75, +-85, +-83, +-73, +-90, +-88, +-78, +-98, +-96, +-86, +-101, +-98, +-91, +-103, +-100, +-94, +-103, +-99, +-95, +-103, +-100, +-95, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-97, +-89, +-102, +-99, +-91, +-105, +-105, +-97, +-97, +-97, +-89, +-93, +-90, +-80, +-82, +-79, +-68, +-59, +-59, +-51, + 64, + 59, + 63, +103, + 98, + 97, +102, + 98, + 95, +103, + 99, + 95, +101, + 97, + 94, +100, + 96, + 93, +100, + 96, + 93, +100, + 96, + 91, + 82, + 83, + 90, + 84, + 85, + 91, + 86, + 87, + 93, + 85, + 87, + 92, + 87, + 87, + 94, + 73, + 73, + 83, + 58, + 57, + 71, + 40, + 38, + 55, + 52, + 49, + 63, + 99, + 97, + 96, + 99, + 97, + 95, + 99, + 97, + 95, +102, +100, + 98, +101, + 99, + 97, +100, + 98, + 95, +101, + 98, + 98, + 54, + 50, + 55, +-74, +-76, +-65, +-87, +-88, +-76, +-100, +-100, +-91, +-110, +-109, +-104, +-114, +-112, +-108, +-115, +-113, +-109, +-112, +-111, +-107, +-111, +-110, +-106, +-108, +-107, +-102, +-102, +-102, +-95, +-98, +-98, +-91, +-98, +-98, +-90, +-99, +-99, +-92, +-101, +-101, +-93, +-102, +-102, +-94, +-101, +-101, +-92, +-98, +-98, +-89, +-96, +-96, +-87, +-98, +-98, +-89, +-106, +-106, +-97, +-98, +-97, +-88, +-97, +-94, +-86, +-99, +-96, +-90, +-102, +-98, +-94, +-106, +-101, +-99, +-66, +-63, +-62, + 41, + 47, + 42, + 40, + 47, + 40, + 34, + 41, + 34, + 44, + 51, + 44, + 38, + 44, + 38, + 37, + 44, + 37, + 55, + 58, + 55, + 54, + 57, + 54, + 53, + 57, + 53, + 56, + 60, + 56, + 49, + 52, + 49, + 54, + 59, + 54, + 51, + 57, + 51, + 43, + 50, + 43, + 37, + 44, + 38, + 38, + 45, + 38, + 36, + 43, + 36, +-55, +-50, +-54, +-104, +-100, +-96, +-100, +-97, +-91, +-100, +-97, +-89, +-99, +-97, +-88, +-93, +-91, +-80, +-90, +-88, +-78, +-94, +-92, +-82, +-99, +-98, +-87, +-97, +-95, +-85, +-86, +-84, +-73, +-83, +-81, +-71, +-90, +-88, +-77, +-97, +-94, +-85, +-101, +-98, +-91, +-102, +-99, +-93, +-102, +-98, +-95, +-102, +-99, +-94, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-99, +-97, +-89, +-102, +-100, +-92, +-107, +-106, +-100, +-101, +-100, +-95, +-95, +-92, +-83, +-83, +-80, +-70, +-63, +-64, +-54, + 39, + 34, + 40, +102, + 97, + 96, +101, + 97, + 93, +101, + 96, + 93, + 99, + 95, + 92, + 99, + 95, + 92, + 99, + 95, + 92, + 98, + 94, + 89, + 80, + 81, + 88, + 81, + 82, + 88, + 81, + 82, + 89, + 82, + 82, + 91, + 84, + 85, + 92, + 75, + 76, + 83, + 65, + 64, + 76, + 44, + 41, + 59, + 45, + 42, + 57, + 95, + 93, + 92, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +100, + 98, + 95, + 94, + 91, + 92, + -5, + -9, + -1, +-77, +-81, +-66, +-90, +-91, +-80, +-104, +-103, +-98, +-112, +-111, +-107, +-114, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-107, +-113, +-111, +-107, +-110, +-108, +-104, +-104, +-104, +-98, +-100, +-99, +-93, +-99, +-98, +-92, +-100, +-99, +-93, +-101, +-101, +-95, +-103, +-102, +-95, +-102, +-102, +-93, +-99, +-99, +-90, +-96, +-96, +-87, +-96, +-96, +-87, +-106, +-106, +-97, +-100, +-98, +-90, +-99, +-96, +-88, +-101, +-97, +-92, +-103, +-99, +-95, +-104, +-100, +-97, +-59, +-55, +-54, + 42, + 48, + 43, + 39, + 46, + 39, + 39, + 45, + 39, + 47, + 54, + 48, + 39, + 46, + 39, + 43, + 50, + 43, + 55, + 59, + 55, + 53, + 56, + 53, + 57, + 60, + 57, + 55, + 59, + 56, + 45, + 49, + 45, + 49, + 54, + 49, + 53, + 60, + 53, + 50, + 56, + 50, + 39, + 46, + 39, + 38, + 44, + 38, + 26, + 32, + 26, +-93, +-88, +-90, +-101, +-97, +-93, +-98, +-95, +-90, +-99, +-96, +-89, +-99, +-97, +-88, +-93, +-91, +-81, +-93, +-91, +-80, +-96, +-94, +-83, +-104, +-102, +-91, +-92, +-90, +-79, +-84, +-82, +-71, +-81, +-79, +-68, +-88, +-86, +-75, +-94, +-92, +-82, +-99, +-96, +-89, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-100, +-97, +-89, +-105, +-102, +-94, +-108, +-106, +-102, +-100, +-98, +-95, +-94, +-91, +-83, +-87, +-85, +-74, +-70, +-71, +-60, + 11, + 5, + 14, +104, +100, +100, +103, + 99, + 96, +104, +100, + 97, +104, +100, + 97, +104, +100, + 97, +104, +100, + 97, +103, + 99, + 94, + 79, + 79, + 86, + 81, + 81, + 88, + 84, + 85, + 92, + 88, + 87, + 98, + 86, + 86, + 94, + 81, + 81, + 87, + 74, + 73, + 83, + 46, + 44, + 62, + 41, + 38, + 54, + 83, + 81, + 80, +101, + 99, + 98, +101, + 99, + 97, +102, +100, + 98, +102, +100, + 98, +102, +101, + 98, + 92, + 89, + 90, +-36, +-41, +-30, +-80, +-85, +-68, +-95, +-96, +-85, +-107, +-105, +-104, +-113, +-111, +-108, +-114, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-107, +-113, +-111, +-107, +-110, +-108, +-104, +-106, +-105, +-101, +-101, +-100, +-96, +-101, +-100, +-96, +-102, +-100, +-96, +-103, +-102, +-98, +-104, +-103, +-98, +-102, +-102, +-93, +-99, +-99, +-90, +-97, +-97, +-88, +-96, +-96, +-87, +-105, +-105, +-96, +-100, +-99, +-90, +-98, +-95, +-88, +-100, +-97, +-91, +-102, +-98, +-94, +-102, +-98, +-95, +-55, +-51, +-50, + 45, + 52, + 47, + 43, + 50, + 44, + 45, + 52, + 45, + 47, + 53, + 47, + 38, + 45, + 38, + 48, + 54, + 48, + 51, + 55, + 51, + 54, + 58, + 54, + 57, + 61, + 57, + 57, + 60, + 57, + 46, + 49, + 46, + 45, + 49, + 45, + 53, + 60, + 53, + 55, + 61, + 55, + 43, + 50, + 43, + 38, + 45, + 38, + -2, + 4, + -2, +-106, +-101, +-102, +-100, +-96, +-92, +-99, +-96, +-90, +-99, +-96, +-89, +-99, +-97, +-88, +-93, +-91, +-81, +-94, +-92, +-81, +-101, +-99, +-88, +-103, +-101, +-90, +-89, +-87, +-77, +-86, +-84, +-73, +-83, +-81, +-70, +-87, +-85, +-75, +-93, +-91, +-81, +-99, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-108, +-106, +-98, +-108, +-106, +-102, +-99, +-97, +-96, +-94, +-90, +-83, +-90, +-87, +-75, +-74, +-75, +-63, +-25, +-32, +-21, + 94, + 89, + 90, +103, + 99, + 96, +105, +101, + 98, +106, +102, + 99, +106, +101, + 98, +105, +101, + 98, +104, +101, + 95, + 79, + 79, + 85, + 81, + 80, + 86, + 72, + 71, + 78, + 66, + 66, + 76, + 53, + 54, + 62, + 49, + 51, + 58, + 49, + 50, + 59, + 48, + 45, + 61, + 41, + 37, + 52, + 68, + 66, + 71, + 98, + 97, + 97, +100, + 99, + 95, +101, + 99, + 94, +102, + 99, + 96, +102, +101, + 98, + 69, + 70, + 71, +-58, +-60, +-48, +-89, +-92, +-74, +-98, +-99, +-87, +-109, +-107, +-105, +-113, +-110, +-110, +-114, +-112, +-111, +-116, +-114, +-112, +-113, +-112, +-109, +-114, +-112, +-108, +-111, +-109, +-105, +-106, +-105, +-99, +-104, +-103, +-97, +-103, +-102, +-96, +-102, +-102, +-96, +-103, +-103, +-97, +-104, +-103, +-96, +-104, +-102, +-94, +-101, +-99, +-91, +-96, +-94, +-86, +-96, +-94, +-86, +-105, +-103, +-95, +-100, +-98, +-90, +-94, +-91, +-84, +-98, +-94, +-88, +-101, +-98, +-94, +-100, +-96, +-93, +-54, +-50, +-49, + 50, + 56, + 51, + 49, + 56, + 49, + 46, + 52, + 46, + 45, + 52, + 45, + 36, + 43, + 36, + 52, + 59, + 52, + 53, + 60, + 52, + 51, + 57, + 49, + 53, + 58, + 53, + 53, + 59, + 55, + 45, + 51, + 47, + 40, + 45, + 41, + 52, + 59, + 52, + 54, + 61, + 54, + 45, + 51, + 48, + 37, + 42, + 41, +-44, +-40, +-40, +-103, +-99, +-95, +-99, +-96, +-89, +-99, +-96, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-94, +-91, +-83, +-95, +-92, +-85, +-105, +-102, +-94, +-99, +-96, +-87, +-91, +-89, +-78, +-86, +-85, +-73, +-84, +-83, +-70, +-87, +-85, +-74, +-93, +-91, +-81, +-98, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-111, +-109, +-101, +-107, +-105, +-98, +-100, +-98, +-91, +-95, +-92, +-84, +-89, +-88, +-76, +-77, +-77, +-64, +-53, +-54, +-41, + 69, + 67, + 67, +102, +100, + 96, +102, +100, + 96, +105, +102, + 98, +105, +102, + 98, +105, +102, + 98, +105, +103, + 98, + 65, + 74, + 87, + 66, + 75, + 88, + 66, + 74, + 87, + 76, + 79, + 92, + 77, + 79, + 89, + 78, + 81, + 88, + 79, + 80, + 89, + 75, + 74, + 87, + 45, + 41, + 56, + 57, + 55, + 64, + 95, + 94, + 96, + 97, + 96, + 92, +101, + 98, + 93, +103, + 98, + 96, +102, +101, + 99, + 42, + 44, + 45, +-71, +-72, +-60, +-91, +-94, +-76, +-99, +-100, +-88, +-111, +-109, +-107, +-113, +-111, +-112, +-114, +-112, +-112, +-116, +-113, +-113, +-115, +-113, +-111, +-114, +-113, +-109, +-110, +-109, +-104, +-107, +-106, +-100, +-105, +-105, +-98, +-104, +-103, +-97, +-104, +-103, +-97, +-103, +-103, +-96, +-102, +-101, +-94, +-101, +-99, +-91, +-102, +-99, +-91, +-97, +-94, +-86, +-95, +-93, +-84, +-103, +-100, +-92, +-100, +-97, +-89, +-92, +-90, +-82, +-98, +-94, +-88, +-101, +-97, +-93, +-101, +-97, +-94, +-46, +-42, +-42, + 52, + 58, + 53, + 48, + 55, + 48, + 46, + 53, + 46, + 44, + 51, + 44, + 38, + 45, + 39, + 50, + 57, + 50, + 49, + 56, + 47, + 52, + 59, + 50, + 51, + 58, + 51, + 52, + 58, + 53, + 44, + 50, + 47, + 40, + 46, + 42, + 49, + 56, + 48, + 54, + 60, + 54, + 44, + 50, + 47, + 28, + 33, + 35, +-80, +-77, +-74, +-101, +-97, +-91, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-97, +-89, +-101, +-98, +-90, +-95, +-92, +-84, +-99, +-96, +-90, +-106, +-103, +-96, +-97, +-95, +-87, +-93, +-91, +-81, +-87, +-85, +-74, +-84, +-83, +-70, +-88, +-86, +-75, +-93, +-91, +-82, +-99, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-99, +-91, +-111, +-109, +-100, +-106, +-103, +-95, +-100, +-97, +-89, +-96, +-94, +-85, +-90, +-89, +-76, +-79, +-78, +-65, +-60, +-59, +-45, + 48, + 47, + 47, +103, +102, + 98, +104, +103, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, + -5, + 17, + 41, + -1, + 22, + 46, + -4, + 17, + 40, + 54, + 62, + 79, + 77, + 82, + 94, + 80, + 82, + 89, + 77, + 76, + 84, + 73, + 71, + 84, + 48, + 46, + 61, + 53, + 50, + 60, + 93, + 92, + 95, +100, + 98, + 96, +100, + 97, + 94, + 99, + 94, + 94, + 93, + 92, + 93, + -5, + -4, + 1, +-84, +-85, +-73, +-99, +-100, +-85, +-104, +-104, +-95, +-112, +-110, +-108, +-113, +-111, +-112, +-114, +-112, +-112, +-116, +-113, +-113, +-116, +-114, +-112, +-115, +-113, +-109, +-108, +-107, +-103, +-108, +-107, +-101, +-107, +-106, +-99, +-105, +-105, +-98, +-105, +-105, +-98, +-102, +-102, +-95, +-101, +-100, +-93, +-101, +-98, +-90, +-100, +-97, +-89, +-94, +-92, +-84, +-95, +-92, +-84, +-99, +-97, +-89, +-105, +-102, +-94, +-99, +-96, +-88, +-101, +-97, +-92, +-101, +-97, +-93, +-100, +-96, +-94, +-45, +-41, +-40, + 51, + 58, + 53, + 50, + 57, + 51, + 50, + 57, + 50, + 45, + 51, + 45, + 41, + 48, + 41, + 56, + 63, + 56, + 52, + 59, + 51, + 49, + 57, + 48, + 52, + 59, + 52, + 50, + 56, + 52, + 44, + 50, + 46, + 41, + 48, + 44, + 45, + 52, + 45, + 54, + 61, + 54, + 46, + 51, + 49, + 12, + 16, + 18, +-103, +-99, +-96, +-100, +-97, +-90, +-99, +-96, +-88, +-99, +-96, +-88, +-98, +-96, +-88, +-100, +-97, +-89, +-96, +-94, +-85, +-104, +-101, +-95, +-102, +-99, +-92, +-95, +-92, +-84, +-91, +-89, +-79, +-88, +-86, +-75, +-89, +-87, +-74, +-90, +-88, +-77, +-95, +-93, +-84, +-100, +-98, +-90, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-103, +-100, +-93, +-110, +-107, +-99, +-104, +-101, +-93, +-99, +-96, +-88, +-97, +-94, +-85, +-92, +-91, +-79, +-82, +-80, +-67, +-62, +-61, +-47, + 44, + 42, + 42, +103, +101, + 97, +103, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +102, +101, + 97, +-23, + 9, + 41, +-19, + 14, + 46, +-19, + 12, + 42, + 22, + 36, + 57, + 81, + 89, +103, + 93, + 94, +101, + 73, + 71, + 78, + 45, + 43, + 57, + 43, + 41, + 59, + 48, + 44, + 56, + 82, + 81, + 86, + 96, + 94, + 94, + 97, + 94, + 92, + 99, + 94, + 96, + 66, + 63, + 69, +-54, +-54, +-46, +-97, +-98, +-87, +-105, +-106, +-96, +-110, +-109, +-103, +-114, +-112, +-111, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-114, +-112, +-108, +-107, +-106, +-102, +-108, +-108, +-101, +-107, +-107, +-100, +-105, +-105, +-98, +-104, +-104, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-99, +-90, +-98, +-96, +-87, +-96, +-93, +-85, +-95, +-92, +-84, +-96, +-94, +-86, +-106, +-104, +-96, +-99, +-96, +-89, +-100, +-96, +-91, +-102, +-99, +-95, +-101, +-97, +-94, +-47, +-43, +-42, + 51, + 57, + 52, + 52, + 59, + 52, + 51, + 58, + 51, + 42, + 49, + 42, + 41, + 47, + 41, + 52, + 59, + 52, + 61, + 68, + 59, + 52, + 60, + 51, + 48, + 54, + 48, + 49, + 55, + 51, + 43, + 49, + 45, + 42, + 48, + 44, + 42, + 49, + 41, + 52, + 58, + 52, + 44, + 49, + 47, +-24, +-20, +-18, +-105, +-102, +-98, +-100, +-97, +-91, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-97, +-89, +-106, +-103, +-97, +-98, +-95, +-89, +-94, +-91, +-83, +-93, +-91, +-80, +-91, +-89, +-78, +-93, +-92, +-79, +-96, +-94, +-84, +-101, +-99, +-90, +-102, +-99, +-92, +-104, +-101, +-95, +-104, +-100, +-96, +-104, +-101, +-96, +-104, +-102, +-94, +-103, +-100, +-92, +-101, +-98, +-90, +-105, +-102, +-94, +-108, +-106, +-97, +-103, +-100, +-92, +-99, +-97, +-89, +-96, +-94, +-85, +-93, +-91, +-79, +-85, +-83, +-70, +-71, +-70, +-56, + 39, + 38, + 38, +100, + 99, + 95, +100, + 99, + 95, +101, +100, + 96, +101, +100, + 96, +102, +101, + 97, +101, +100, + 96, +-25, + 10, + 43, +-26, + 10, + 43, +-22, + 12, + 45, + 0, + 20, + 45, + 74, + 84, + 99, + 92, + 93, + 99, + 84, + 81, + 87, + 49, + 47, + 61, + 41, + 41, + 60, + 43, + 40, + 54, + 71, + 68, + 76, +103, +100, +101, +103, + 99, + 99, +102, + 97, + 99, + 18, + 14, + 21, +-82, +-83, +-70, +-101, +-102, +-91, +-106, +-106, +-99, +-111, +-109, +-105, +-114, +-112, +-111, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-113, +-112, +-108, +-108, +-106, +-102, +-108, +-108, +-101, +-107, +-107, +-100, +-105, +-105, +-98, +-103, +-103, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-98, +-90, +-98, +-95, +-87, +-96, +-93, +-85, +-94, +-91, +-83, +-95, +-92, +-84, +-107, +-105, +-97, +-101, +-98, +-91, +-100, +-97, +-91, +-101, +-98, +-94, +-100, +-96, +-93, +-42, +-38, +-38, + 51, + 57, + 53, + 53, + 60, + 53, + 46, + 53, + 46, + 36, + 43, + 36, + 44, + 50, + 44, + 47, + 54, + 47, + 58, + 65, + 56, + 54, + 61, + 52, + 48, + 55, + 49, + 47, + 53, + 49, + 41, + 47, + 43, + 45, + 51, + 46, + 44, + 51, + 43, + 48, + 55, + 49, + 37, + 43, + 40, +-74, +-70, +-69, +-102, +-98, +-95, +-99, +-96, +-90, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-99, +-97, +-88, +-105, +-102, +-94, +-107, +-104, +-98, +-100, +-97, +-91, +-98, +-95, +-87, +-97, +-95, +-85, +-96, +-94, +-83, +-97, +-96, +-83, +-103, +-101, +-90, +-103, +-101, +-91, +-102, +-99, +-91, +-99, +-96, +-90, +-97, +-94, +-90, +-94, +-91, +-86, +-93, +-90, +-82, +-100, +-98, +-90, +-99, +-96, +-88, +-114, +-111, +-104, +-109, +-106, +-98, +-103, +-100, +-92, +-100, +-97, +-89, +-96, +-93, +-85, +-94, +-92, +-80, +-87, +-86, +-73, +-77, +-76, +-62, + 20, + 19, + 18, +103, +102, + 98, +105, +103, + 99, +105, +103, + 99, +104, +103, + 99, +100, + 98, + 94, +100, + 99, + 95, +-26, + 7, + 39, +-25, + 8, + 41, +-22, + 10, + 43, +-14, + 7, + 35, + 52, + 64, + 81, + 93, + 96, +101, + 92, + 89, + 95, + 67, + 65, + 79, + 44, + 42, + 62, + 46, + 42, + 57, + 61, + 59, + 67, +102, + 99, +101, +103, + 99, +100, + 90, + 84, + 88, +-31, +-35, +-26, +-92, +-94, +-79, +-104, +-104, +-94, +-107, +-107, +-100, +-111, +-109, +-106, +-114, +-112, +-110, +-115, +-112, +-112, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-113, +-112, +-108, +-108, +-106, +-102, +-108, +-108, +-102, +-107, +-107, +-100, +-106, +-105, +-99, +-103, +-103, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-98, +-90, +-98, +-95, +-87, +-96, +-93, +-85, +-92, +-89, +-81, +-93, +-91, +-83, +-108, +-105, +-97, +-103, +-100, +-93, +-100, +-97, +-91, +-101, +-98, +-93, +-101, +-97, +-94, +-39, +-35, +-35, + 51, + 57, + 52, + 46, + 53, + 46, + 38, + 45, + 38, + 32, + 39, + 32, + 50, + 57, + 50, + 55, + 62, + 55, + 53, + 60, + 52, + 55, + 62, + 53, + 54, + 61, + 54, + 47, + 54, + 49, + 47, + 53, + 48, + 48, + 54, + 50, + 48, + 55, + 47, + 45, + 52, + 45, + 22, + 27, + 25, +-103, +-99, +-97, +-102, +-98, +-94, +-99, +-96, +-89, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-102, +-99, +-91, +-105, +-103, +-95, +-103, +-100, +-93, +-98, +-95, +-88, +-97, +-94, +-86, +-96, +-94, +-84, +-93, +-92, +-81, +-95, +-94, +-81, +-96, +-94, +-84, +-97, +-94, +-85, +-102, +-99, +-91, +-105, +-102, +-96, +-104, +-100, +-96, +-103, +-99, +-94, +-99, +-96, +-88, +-97, +-95, +-86, +-99, +-97, +-89, +-117, +-115, +-107, +-109, +-106, +-99, +-103, +-101, +-93, +-100, +-97, +-89, +-96, +-93, +-85, +-93, +-91, +-79, +-87, +-86, +-73, +-80, +-79, +-65, +-24, +-25, +-25, + 99, + 96, + 93, +104, +102, + 99, +106, +104, +100, +105, +103, + 99, + 96, + 95, + 91, + 96, + 95, + 90, +-18, + 3, + 31, +-14, + 6, + 38, +-16, + 3, + 37, +-17, + 2, + 29, + 35, + 48, + 64, + 89, + 93, +100, + 94, + 93, + 99, + 73, + 69, + 82, + 51, + 47, + 65, + 46, + 44, + 60, + 51, + 51, + 59, + 93, + 95, + 96, + 99, +101, +101, + 58, + 59, + 62, +-73, +-73, +-66, +-103, +-104, +-95, +-106, +-106, +-99, +-110, +-109, +-105, +-113, +-111, +-108, +-114, +-112, +-110, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-119, +-117, +-116, +-114, +-113, +-109, +-109, +-108, +-104, +-109, +-108, +-103, +-108, +-106, +-102, +-106, +-105, +-100, +-103, +-102, +-98, +-102, +-100, +-96, +-101, +-99, +-94, +-101, +-98, +-90, +-99, +-96, +-88, +-95, +-92, +-84, +-91, +-88, +-80, +-91, +-89, +-80, +-105, +-101, +-96, +-102, +-98, +-94, +-100, +-97, +-90, +-101, +-98, +-91, +-102, +-98, +-95, +-41, +-36, +-38, + 49, + 55, + 50, + 43, + 50, + 43, + 40, + 47, + 40, + 35, + 41, + 35, + 54, + 61, + 54, + 54, + 61, + 54, + 54, + 61, + 56, + 51, + 58, + 53, + 51, + 57, + 52, + 45, + 51, + 47, + 48, + 54, + 50, + 50, + 56, + 52, + 48, + 54, + 48, + 42, + 48, + 44, + -9, + -5, + -6, +-106, +-102, +-100, +-102, +-98, +-93, +-101, +-98, +-91, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-97, +-91, +-107, +-103, +-98, +-99, +-96, +-90, +-101, +-98, +-91, +-103, +-101, +-93, +-104, +-101, +-93, +-102, +-100, +-91, +-100, +-98, +-89, +-99, +-97, +-88, +-100, +-97, +-89, +-100, +-98, +-89, +-102, +-99, +-91, +-105, +-102, +-94, +-106, +-103, +-95, +-103, +-100, +-92, +-100, +-98, +-88, +-94, +-92, +-83, +-108, +-106, +-98, +-116, +-113, +-107, +-108, +-105, +-101, +-103, +-99, +-94, +-100, +-97, +-89, +-97, +-94, +-85, +-93, +-92, +-80, +-88, +-87, +-74, +-80, +-80, +-65, +-60, +-68, +-58, + 81, + 72, + 77, +106, +100, + 99, +102, +100, + 95, +103, +103, + 97, + 95, + 96, + 92, + 92, + 92, + 85, + 83, + 88, +100, + 81, + 85, +101, + 75, + 78, + 96, + 57, + 67, + 86, + 56, + 63, + 77, + 79, + 81, + 88, + 95, + 95, +102, + 74, + 73, + 87, + 52, + 51, + 69, + 50, + 48, + 64, + 49, + 49, + 59, + 84, + 85, + 90, + 87, + 89, + 91, +-30, +-28, +-25, +-102, +-101, +-96, +-111, +-110, +-106, +-112, +-110, +-108, +-113, +-111, +-110, +-114, +-111, +-112, +-116, +-113, +-115, +-115, +-112, +-114, +-115, +-113, +-114, +-117, +-114, +-114, +-120, +-117, +-116, +-115, +-113, +-109, +-109, +-108, +-104, +-109, +-108, +-104, +-108, +-106, +-102, +-106, +-105, +-101, +-106, +-104, +-100, +-104, +-103, +-99, +-103, +-101, +-97, +-101, +-98, +-92, +-99, +-96, +-90, +-95, +-92, +-85, +-92, +-89, +-82, +-91, +-88, +-81, +-103, +-100, +-95, +-103, +-99, +-96, +-99, +-96, +-89, +-101, +-98, +-91, +-101, +-96, +-94, +-34, +-29, +-32, + 49, + 56, + 50, + 46, + 52, + 46, + 42, + 49, + 43, + 36, + 42, + 36, + 50, + 56, + 50, + 51, + 58, + 51, + 53, + 59, + 55, + 53, + 59, + 55, + 54, + 60, + 56, + 41, + 47, + 43, + 41, + 47, + 43, + 47, + 53, + 49, + 48, + 54, + 49, + 43, + 49, + 45, +-45, +-41, +-43, +-104, +-99, +-97, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-104, +-100, +-95, +-110, +-107, +-101, +-103, +-100, +-94, +-99, +-96, +-88, +-101, +-98, +-90, +-104, +-101, +-93, +-102, +-100, +-92, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-97, +-89, +-100, +-98, +-90, +-102, +-99, +-91, +-104, +-101, +-93, +-105, +-103, +-94, +-103, +-101, +-92, +-99, +-97, +-87, +-96, +-94, +-85, +-118, +-115, +-108, +-114, +-111, +-105, +-105, +-101, +-98, +-102, +-98, +-93, +-101, +-98, +-90, +-98, +-95, +-86, +-94, +-92, +-80, +-87, +-86, +-73, +-78, +-77, +-63, +-71, +-78, +-66, + 35, + 28, + 33, +106, +101, +100, +103, +101, + 96, +105, +105, + 99, +102, +101, + 97, + 98, + 97, + 93, +106, +102, +106, +108, +103, +109, +104, +100, +108, + 99, +103, +113, + 92, + 93, +101, + 72, + 69, + 76, + 97, + 96, +105, + 80, + 81, + 96, + 51, + 53, + 71, + 49, + 47, + 63, + 49, + 48, + 61, + 72, + 72, + 80, + 4, + 5, + 9, +-102, +-101, +-97, +-110, +-108, +-106, +-111, +-108, +-108, +-114, +-111, +-112, +-115, +-111, +-114, +-116, +-112, +-117, +-117, +-113, +-118, +-115, +-112, +-114, +-115, +-113, +-114, +-117, +-114, +-114, +-120, +-118, +-116, +-115, +-113, +-109, +-110, +-108, +-104, +-112, +-110, +-106, +-111, +-109, +-105, +-110, +-108, +-104, +-109, +-107, +-103, +-107, +-106, +-102, +-106, +-104, +-100, +-104, +-101, +-96, +-102, +-99, +-94, +-99, +-96, +-90, +-96, +-93, +-88, +-93, +-90, +-84, +-104, +-99, +-96, +-104, +-100, +-97, +-98, +-94, +-88, +-101, +-98, +-91, +-102, +-98, +-95, +-26, +-21, +-24, + 46, + 52, + 46, + 45, + 52, + 45, + 42, + 49, + 43, + 39, + 46, + 39, + 52, + 59, + 52, + 52, + 58, + 52, + 51, + 57, + 53, + 53, + 59, + 55, + 51, + 57, + 53, + 45, + 51, + 46, + 38, + 44, + 40, + 45, + 51, + 47, + 45, + 52, + 47, + 32, + 38, + 34, +-97, +-92, +-93, +-105, +-101, +-98, +-101, +-98, +-93, +-102, +-99, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-105, +-102, +-96, +-110, +-107, +-101, +-104, +-101, +-95, +-101, +-99, +-91, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-97, +-89, +-100, +-98, +-90, +-102, +-99, +-91, +-104, +-101, +-94, +-106, +-103, +-95, +-102, +-100, +-91, +-96, +-94, +-84, +-100, +-98, +-89, +-120, +-116, +-109, +-111, +-108, +-103, +-108, +-104, +-100, +-105, +-101, +-96, +-102, +-99, +-91, +-99, +-96, +-87, +-95, +-93, +-81, +-86, +-85, +-72, +-75, +-75, +-60, +-66, +-72, +-58, + -5, +-11, + -5, +104, +100, + 99, +103, +100, + 94, + 99, + 97, + 90, +105, +103, + 97, +111, +108, +108, +109, +109, +114, +105, +105, +111, +102, +102, +109, + 99, + 99, +103, +101, + 97, +102, + 81, + 75, + 81, + 93, + 88, + 98, + 90, + 89, +103, + 54, + 56, + 71, + 48, + 46, + 63, + 50, + 48, + 64, + 16, + 14, + 27, +-98, +-98, +-90, +-109, +-108, +-104, +-112, +-110, +-108, +-113, +-111, +-111, +-115, +-112, +-113, +-114, +-111, +-113, +-114, +-110, +-115, +-116, +-112, +-117, +-115, +-112, +-114, +-116, +-113, +-114, +-117, +-115, +-114, +-121, +-119, +-116, +-116, +-115, +-111, +-111, +-109, +-105, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-111, +-109, +-105, +-109, +-107, +-103, +-108, +-106, +-102, +-107, +-103, +-100, +-105, +-101, +-98, +-104, +-100, +-97, +-102, +-98, +-94, +-99, +-95, +-92, +-106, +-102, +-100, +-109, +-105, +-102, +-100, +-97, +-91, +-101, +-98, +-91, +-103, +-98, +-96, +-24, +-19, +-22, + 46, + 53, + 47, + 45, + 52, + 45, + 40, + 47, + 41, + 43, + 49, + 43, + 48, + 54, + 48, + 46, + 53, + 46, + 51, + 57, + 53, + 51, + 57, + 53, + 45, + 51, + 47, + 43, + 49, + 45, + 39, + 45, + 40, + 43, + 49, + 45, + 43, + 50, + 45, + -4, + 1, + -2, +-109, +-104, +-104, +-103, +-99, +-96, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-97, +-92, +-105, +-102, +-96, +-106, +-102, +-97, +-101, +-97, +-92, +-99, +-96, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-102, +-99, +-91, +-98, +-96, +-87, +-96, +-94, +-83, +-110, +-107, +-99, +-117, +-115, +-107, +-117, +-113, +-108, +-110, +-106, +-103, +-105, +-102, +-96, +-102, +-99, +-91, +-99, +-96, +-88, +-94, +-93, +-81, +-88, +-87, +-74, +-75, +-74, +-60, +-59, +-63, +-48, +-16, +-21, +-14, +102, + 98, + 98, +102, + 99, + 92, + 89, + 87, + 78, + 84, + 80, + 72, + 89, + 86, + 85, +114, +116, +120, +106, +108, +111, + 97, + 99, +102, + 92, + 92, + 94, + 91, + 86, + 91, + 82, + 73, + 80, + 82, + 74, + 82, + 97, + 92, +101, + 65, + 64, + 74, + 48, + 46, + 61, + 45, + 43, + 60, +-63, +-65, +-51, +-103, +-104, +-92, +-106, +-105, +-101, +-109, +-108, +-104, +-111, +-110, +-105, +-113, +-111, +-108, +-112, +-110, +-108, +-112, +-110, +-110, +-114, +-111, +-113, +-116, +-113, +-114, +-117, +-114, +-116, +-119, +-116, +-116, +-122, +-120, +-118, +-117, +-116, +-112, +-112, +-111, +-107, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-111, +-109, +-105, +-110, +-107, +-104, +-110, +-106, +-104, +-109, +-104, +-103, +-107, +-103, +-101, +-103, +-99, +-97, +-100, +-96, +-94, +-107, +-102, +-101, +-111, +-107, +-104, +-102, +-99, +-93, +-101, +-97, +-91, +-103, +-99, +-96, +-27, +-21, +-25, + 44, + 51, + 45, + 43, + 50, + 43, + 33, + 39, + 33, + 42, + 49, + 42, + 51, + 58, + 51, + 47, + 53, + 47, + 43, + 49, + 45, + 48, + 54, + 50, + 46, + 52, + 48, + 38, + 44, + 40, + 39, + 45, + 41, + 42, + 48, + 44, + 41, + 47, + 42, +-39, +-34, +-37, +-106, +-101, +-102, +-103, +-99, +-96, +-101, +-98, +-92, +-100, +-97, +-91, +-100, +-97, +-91, +-104, +-100, +-95, +-103, +-100, +-94, +-103, +-100, +-94, +-102, +-98, +-93, +-101, +-98, +-91, +-103, +-100, +-92, +-104, +-101, +-93, +-102, +-100, +-92, +-100, +-98, +-90, +-99, +-97, +-89, +-100, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-100, +-98, +-89, +-102, +-99, +-91, +-99, +-97, +-88, +-95, +-93, +-83, +-119, +-116, +-107, +-120, +-117, +-110, +-115, +-112, +-106, +-109, +-105, +-102, +-104, +-100, +-95, +-101, +-98, +-90, +-100, +-97, +-89, +-98, +-97, +-84, +-93, +-92, +-79, +-79, +-79, +-64, +-57, +-60, +-44, + -8, +-11, + -3, +102, + 99, + 99, +102, + 99, + 91, + 94, + 90, + 80, + 85, + 79, + 71, + 81, + 80, + 74, +119, +117, +118, +111, +110, +109, +102, +101, +100, + 94, + 94, + 96, + 79, + 70, + 74, + 86, + 68, + 74, + 89, + 71, + 77, + 99, + 88, + 94, + 76, + 71, + 78, + 51, + 48, + 62, + 8, + 7, + 25, +-75, +-76, +-57, +-90, +-92, +-79, +-100, +-98, +-93, +-104, +-102, +-96, +-106, +-106, +-98, +-108, +-107, +-101, +-109, +-108, +-104, +-111, +-109, +-106, +-113, +-111, +-108, +-116, +-114, +-114, +-119, +-116, +-117, +-120, +-118, +-117, +-123, +-121, +-119, +-119, +-117, +-113, +-113, +-112, +-108, +-112, +-111, +-107, +-112, +-111, +-106, +-112, +-111, +-107, +-113, +-111, +-107, +-111, +-110, +-106, +-110, +-108, +-104, +-110, +-105, +-104, +-108, +-104, +-102, +-107, +-103, +-101, +-105, +-100, +-99, +-102, +-98, +-96, +-108, +-103, +-102, +-114, +-109, +-107, +-105, +-101, +-95, +-100, +-97, +-91, +-104, +-99, +-96, +-21, +-16, +-18, + 43, + 50, + 44, + 40, + 46, + 40, + 33, + 39, + 33, + 42, + 49, + 43, + 45, + 53, + 46, + 47, + 54, + 49, + 48, + 53, + 49, + 47, + 53, + 48, + 42, + 49, + 43, + 38, + 49, + 39, + 29, + 45, + 32, + 35, + 49, + 37, + 36, + 40, + 35, +-79, +-75, +-78, +-107, +-101, +-100, +-104, +-99, +-96, +-102, +-98, +-93, +-101, +-98, +-92, +-101, +-97, +-92, +-103, +-100, +-94, +-101, +-98, +-92, +-101, +-97, +-92, +-101, +-98, +-92, +-100, +-97, +-90, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-100, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-102, +-99, +-91, +-99, +-97, +-88, +-98, +-96, +-87, +-121, +-118, +-110, +-118, +-115, +-109, +-114, +-111, +-105, +-107, +-103, +-100, +-102, +-99, +-93, +-100, +-98, +-89, +-101, +-98, +-89, +-99, +-98, +-86, +-97, +-96, +-83, +-89, +-88, +-74, +-63, +-66, +-50, + -7, +-10, + 0, + 99, + 97, + 98, + 98, + 95, + 88, + 93, + 88, + 77, + 90, + 83, + 73, + 83, + 81, + 72, +118, +118, +120, +114, +113, +116, +108, +108, +110, + 95, + 90, + 93, + 67, + 43, + 43, + 85, + 44, + 41, + 98, + 58, + 55, + 90, + 66, + 67, + 80, + 69, + 73, + 53, + 46, + 55, +-51, +-48, +-29, +-71, +-68, +-49, +-78, +-81, +-69, +-95, +-91, +-84, +-102, +-97, +-90, +-103, +-102, +-97, +-106, +-105, +-100, +-109, +-107, +-104, +-111, +-109, +-106, +-114, +-112, +-110, +-118, +-115, +-116, +-120, +-117, +-118, +-121, +-119, +-119, +-124, +-122, +-120, +-118, +-117, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-113, +-111, +-107, +-112, +-110, +-106, +-111, +-108, +-104, +-111, +-106, +-103, +-109, +-105, +-102, +-108, +-104, +-101, +-106, +-102, +-99, +-106, +-102, +-99, +-110, +-105, +-104, +-116, +-111, +-110, +-109, +-105, +-99, +-102, +-100, +-92, +-103, +-100, +-95, + -9, + -5, + -5, + 52, + 57, + 52, + 44, + 48, + 42, + 31, + 37, + 31, + 46, + 52, + 48, + 43, + 50, + 46, + 44, + 50, + 47, + 52, + 52, + 49, + 15, + 20, + 12, + -8, + 13, + -6, + -3, + 36, + 4, +-45, + 21, +-24, + -9, + 47, + 7, + 11, + 19, + 11, +-111, +-105, +-106, +-104, +-99, +-94, +-104, +-99, +-93, +-103, +-97, +-94, +-101, +-96, +-92, +-101, +-97, +-92, +-102, +-99, +-93, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-103, +-100, +-92, +-101, +-98, +-90, +-96, +-93, +-86, +-101, +-98, +-92, +-123, +-120, +-114, +-120, +-117, +-111, +-112, +-109, +-103, +-104, +-101, +-95, +-102, +-99, +-92, +-101, +-99, +-90, +-100, +-97, +-88, +-99, +-97, +-85, +-98, +-96, +-83, +-93, +-92, +-78, +-76, +-78, +-61, +-15, +-16, + -6, + 95, + 93, + 95, + 99, + 96, + 89, + 96, + 90, + 79, + 93, + 84, + 73, + 85, + 78, + 70, +118, +117, +120, +117, +117, +119, +116, +116, +119, +112, +115, +117, + 83, + 69, + 69, + 49, + 13, + 7, + 69, + 24, + 17, + 80, + 41, + 33, + 81, + 51, + 46, + 46, + 33, + 38, +-97, +-97, +-77, +-99, +-99, +-77, +-99, +-102, +-87, +-110, +-108, +-97, +-113, +-108, +-100, +-111, +-110, +-106, +-112, +-110, +-108, +-113, +-110, +-110, +-113, +-110, +-113, +-114, +-111, +-114, +-118, +-115, +-116, +-120, +-117, +-118, +-121, +-119, +-119, +-124, +-122, +-120, +-118, +-117, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-113, +-111, +-107, +-112, +-110, +-106, +-112, +-108, +-104, +-111, +-106, +-103, +-110, +-106, +-102, +-108, +-104, +-101, +-108, +-104, +-100, +-111, +-107, +-106, +-117, +-112, +-112, +-110, +-107, +-101, +-103, +-100, +-92, +-104, +-101, +-96, + -2, + 2, + 2, + 60, + 65, + 60, + 43, + 49, + 43, + 32, + 37, + 31, + 44, + 49, + 43, + 45, + 49, + 44, + 44, + 49, + 43, + 43, + 49, + 44, + 26, + 42, + 30, +-39, + -4, +-28, +-115, +-30, +-77, +-121, + 12, +-52, +-81, + 20, +-39, +-49, +-10, +-33, +-116, +-96, +-105, +-102, +-103, +-97, +-98, +-103, +-92, +-102, +-98, +-91, +-104, +-97, +-92, +-103, +-100, +-94, +-101, +-98, +-92, +-102, +-99, +-93, +-101, +-98, +-92, +-101, +-98, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-99, +-97, +-89, +-95, +-92, +-85, +-105, +-102, +-97, +-123, +-120, +-114, +-121, +-118, +-112, +-112, +-109, +-103, +-104, +-100, +-95, +-103, +-100, +-93, +-102, +-99, +-91, +-101, +-98, +-89, +-99, +-97, +-85, +-96, +-95, +-82, +-94, +-93, +-79, +-87, +-89, +-72, +-45, +-46, +-36, + 81, + 79, + 80, + 97, + 95, + 87, + 92, + 87, + 75, + 91, + 83, + 72, + 85, + 78, + 69, +118, +117, +119, +117, +117, +119, +116, +117, +120, +109, +118, +120, +117, +111, +111, + 86, + 61, + 55, + 44, + 0, +-12, + 63, + 10, + -8, + 74, + 26, + 9, + 32, + 10, + 9, +-51, +-56, +-37, +-52, +-52, +-27, +-54, +-57, +-37, +-75, +-75, +-58, +-103, +-100, +-88, +-115, +-115, +-110, +-119, +-117, +-116, +-118, +-115, +-117, +-117, +-113, +-118, +-116, +-111, +-118, +-118, +-115, +-118, +-120, +-118, +-119, +-122, +-119, +-119, +-124, +-122, +-120, +-117, +-116, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-113, +-109, +-106, +-111, +-107, +-104, +-110, +-106, +-103, +-109, +-105, +-102, +-109, +-105, +-102, +-113, +-108, +-107, +-118, +-113, +-112, +-111, +-108, +-102, +-103, +-101, +-93, +-104, +-100, +-95, +-19, +-15, +-16, + 38, + 43, + 39, + 37, + 44, + 38, + 35, + 42, + 35, + 43, + 52, + 43, + 51, + 59, + 49, + 37, + 47, + 36, + -2, + 21, + 8, +-57, +-25, +-43, +-105, +-46, +-79, +-125, +-37, +-85, +-104, + 12, +-49, +-107, + 9, +-53, +-88, +-11, +-48, +-123, +-90, +-107, +-100, +-101, +-97, +-94, +-104, +-92, +-100, +-99, +-88, +-107, +-100, +-93, +-104, +-101, +-95, +-104, +-100, +-95, +-102, +-99, +-93, +-102, +-98, +-93, +-102, +-98, +-93, +-101, +-98, +-90, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-99, +-96, +-88, +-95, +-92, +-85, +-112, +-108, +-103, +-123, +-120, +-114, +-121, +-118, +-112, +-116, +-113, +-108, +-108, +-105, +-99, +-103, +-100, +-93, +-100, +-97, +-89, +-99, +-97, +-88, +-97, +-96, +-84, +-94, +-92, +-79, +-94, +-93, +-79, +-93, +-95, +-77, +-78, +-79, +-68, + 53, + 51, + 51, + 97, + 93, + 86, + 87, + 82, + 70, + 90, + 82, + 71, + 86, + 79, + 70, +116, +116, +118, +117, +117, +119, +112, +113, +115, +104, +112, +114, +107, +108, +110, +105, + 90, + 87, + 55, + 21, + 9, + 60, + 6, +-18, + 71, + 15, +-10, + 45, + 14, + 8, +-28, +-37, +-20, +-40, +-42, +-13, +-46, +-51, +-25, +-54, +-55, +-32, +-78, +-77, +-59, +-97, +-97, +-87, +-112, +-111, +-104, +-119, +-117, +-115, +-121, +-117, +-120, +-120, +-115, +-121, +-120, +-117, +-119, +-121, +-118, +-120, +-122, +-120, +-120, +-124, +-122, +-120, +-115, +-114, +-110, +-114, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-113, +-110, +-106, +-112, +-108, +-104, +-111, +-107, +-103, +-109, +-105, +-102, +-111, +-107, +-103, +-114, +-110, +-109, +-116, +-111, +-111, +-113, +-110, +-103, +-102, +-99, +-91, +-104, +-101, +-96, +-18, +-13, +-14, + 35, + 40, + 37, + 32, + 39, + 34, + 31, + 44, + 34, + 31, + 49, + 35, + 32, + 53, + 35, + -9, + 17, + -3, +-51, + -7, +-30, +-85, +-40, +-64, +-94, +-48, +-76, +-93, +-43, +-76, +-85, +-25, +-65, +-81, + -9, +-52, +-113, +-36, +-73, +-105, +-63, +-83, +-105, +-98, +-98, +-96, +-100, +-92, +-101, +-100, +-92, +-108, +-102, +-97, +-105, +-102, +-96, +-105, +-102, +-96, +-104, +-101, +-95, +-104, +-101, +-95, +-104, +-101, +-95, +-103, +-100, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-99, +-96, +-88, +-99, +-97, +-89, +-120, +-117, +-111, +-124, +-121, +-115, +-121, +-118, +-112, +-119, +-116, +-110, +-111, +-108, +-103, +-104, +-101, +-94, +-99, +-96, +-88, +-98, +-95, +-86, +-96, +-95, +-83, +-93, +-92, +-79, +-94, +-93, +-79, +-93, +-95, +-77, +-90, +-92, +-80, + -9, +-11, +-11, + 94, + 91, + 83, + 90, + 85, + 73, + 93, + 84, + 74, + 88, + 81, + 72, +116, +115, +118, +118, +117, +119, +112, +111, +114, +105, +107, +112, +104, +107, +112, +105, +100, +101, + 56, + 34, + 25, + 54, + 10, +-15, + 67, + 12, +-18, + 48, + 10, + -1, +-19, +-32, +-16, +-30, +-33, + -3, +-35, +-40, +-10, +-44, +-48, +-19, +-68, +-70, +-46, +-84, +-87, +-69, +-100, +-101, +-87, +-111, +-111, +-103, +-119, +-117, +-115, +-121, +-118, +-120, +-120, +-117, +-118, +-121, +-118, +-120, +-122, +-120, +-120, +-121, +-119, +-117, +-114, +-113, +-109, +-114, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-115, +-111, +-108, +-114, +-110, +-106, +-112, +-107, +-104, +-109, +-105, +-102, +-111, +-107, +-103, +-113, +-108, +-107, +-116, +-111, +-110, +-114, +-111, +-105, +-103, +-101, +-93, +-104, +-100, +-95, + 2, + 6, + 5, + 48, + 53, + 50, + 26, + 34, + 29, + 30, + 47, + 36, + 1, + 29, + 11, +-50, +-10, +-36, +-64, +-16, +-46, +-54, +-10, +-36, +-79, +-41, +-64, +-91, +-55, +-77, +-78, +-41, +-63, +-88, +-44, +-68, +-96, +-44, +-70, +-83, +-34, +-61, +-68, +-33, +-49, +-109, +-88, +-94, +-102, +-94, +-94, +-105, +-102, +-101, +-107, +-104, +-101, +-105, +-102, +-96, +-105, +-102, +-96, +-106, +-102, +-96, +-106, +-102, +-97, +-106, +-102, +-97, +-104, +-101, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-97, +-89, +-97, +-94, +-86, +-105, +-102, +-94, +-123, +-120, +-114, +-122, +-119, +-113, +-121, +-118, +-112, +-120, +-117, +-111, +-116, +-112, +-107, +-107, +-104, +-97, +-100, +-97, +-89, +-96, +-94, +-85, +-95, +-94, +-81, +-91, +-90, +-77, +-89, +-88, +-74, +-88, +-89, +-72, +-85, +-86, +-74, +-67, +-69, +-68, + 75, + 72, + 64, + 95, + 90, + 78, + 93, + 84, + 73, + 88, + 81, + 72, +117, +116, +118, +117, +116, +119, +117, +116, +119, +114, +114, +117, +111, +115, +120, +106, +108, +109, + 49, + 36, + 26, + 45, + 7, +-21, + 67, + 17, +-18, + 55, + 17, + 2, +-13, +-31, +-21, +-31, +-35, + -7, +-36, +-38, + -7, +-45, +-50, +-22, +-65, +-70, +-45, +-84, +-86, +-68, +-96, +-93, +-81, +-110, +-105, +-101, +-115, +-113, +-112, +-116, +-119, +-118, +-118, +-118, +-121, +-122, +-118, +-122, +-125, +-119, +-122, +-122, +-114, +-114, +-116, +-112, +-108, +-114, +-112, +-107, +-114, +-114, +-107, +-114, +-114, +-108, +-115, +-113, +-109, +-116, +-114, +-111, +-115, +-113, +-111, +-115, +-113, +-110, +-114, +-111, +-108, +-113, +-110, +-107, +-110, +-108, +-104, +-109, +-106, +-102, +-110, +-107, +-103, +-112, +-108, +-107, +-115, +-112, +-111, +-115, +-113, +-108, +-105, +-103, +-98, +-103, +-100, +-97, + 10, + 14, + 14, + 45, + 50, + 47, + 22, + 35, + 26, +-24, + 1, +-13, +-84, +-41, +-65, +-102, +-46, +-74, +-85, +-32, +-62, +-84, +-51, +-73, +-80, +-54, +-75, +-56, +-30, +-51, +-25, + 6, +-15, +-86, +-41, +-62, +-83, +-33, +-55, +-85, +-43, +-68, +-83, +-45, +-65, +-55, +-27, +-45, +-13, + 5, +-12, +-84, +-77, +-85, +-106, +-104, +-102, +-106, +-103, +-98, +-108, +-101, +-97, +-109, +-101, +-97, +-108, +-102, +-97, +-105, +-104, +-98, +-104, +-102, +-94, +-103, +-101, +-92, +-103, +-100, +-92, +-101, +-99, +-91, +-100, +-98, +-90, +-100, +-97, +-89, +-100, +-98, +-89, +-101, +-98, +-89, +-100, +-98, +-89, +-100, +-97, +-88, +-97, +-95, +-86, +-110, +-107, +-100, +-124, +-121, +-118, +-121, +-118, +-115, +-120, +-118, +-114, +-119, +-117, +-112, +-116, +-114, +-109, +-112, +-109, +-103, +-104, +-101, +-94, +-98, +-95, +-87, +-94, +-92, +-81, +-89, +-87, +-75, +-87, +-86, +-72, +-86, +-87, +-70, +-79, +-81, +-65, +-72, +-74, +-67, + 52, + 50, + 42, + 90, + 86, + 74, + 94, + 85, + 80, + 91, + 84, + 82, +117, +116, +119, +117, +116, +119, +117, +116, +119, +115, +116, +117, +113, +119, +121, +111, +113, +113, + 44, + 31, + 21, + 35, + -2, +-33, + 58, + 9, +-29, + 69, + 31, + 12, + 21, + -3, + 0, +-38, +-45, +-20, +-47, +-48, +-16, +-48, +-52, +-25, +-53, +-56, +-31, +-81, +-79, +-57, +-95, +-89, +-77, +-108, +-102, +-97, +-115, +-111, +-108, +-119, +-118, +-115, +-118, +-121, +-121, +-123, +-122, +-124, +-122, +-117, +-119, +-118, +-112, +-111, +-113, +-113, +-108, +-109, +-113, +-106, +-114, +-114, +-106, +-114, +-114, +-107, +-115, +-113, +-109, +-116, +-114, +-112, +-115, +-113, +-112, +-114, +-112, +-111, +-111, +-110, +-106, +-111, +-110, +-106, +-109, +-108, +-103, +-109, +-107, +-103, +-110, +-109, +-105, +-112, +-110, +-108, +-116, +-114, +-112, +-116, +-114, +-112, +-64, +-63, +-61, +-39, +-37, +-36, + 16, + 18, + 19, + 32, + 41, + 32, +-38, +-17, +-32, +-99, +-55, +-79, +-95, +-41, +-69, +-104, +-49, +-78, +-103, +-56, +-84, +-70, +-42, +-61, +-48, +-23, +-45, +-21, + 2, +-22, +-60, +-30, +-56, +-89, +-49, +-74, +-99, +-51, +-77, +-101, +-50, +-82, +-75, +-31, +-58, +-85, +-49, +-78, +-54, +-29, +-59, +-75, +-55, +-76, +-107, +-101, +-103, +-105, +-104, +-100, +-109, +-101, +-99, +-112, +-100, +-97, +-109, +-101, +-97, +-105, +-103, +-97, +-105, +-103, +-95, +-104, +-102, +-93, +-103, +-101, +-92, +-101, +-99, +-91, +-101, +-99, +-91, +-101, +-99, +-91, +-101, +-99, +-89, +-101, +-99, +-89, +-101, +-99, +-89, +-100, +-98, +-88, +-101, +-99, +-89, +-118, +-115, +-107, +-123, +-121, +-121, +-122, +-119, +-119, +-120, +-118, +-116, +-116, +-115, +-112, +-114, +-112, +-108, +-114, +-112, +-107, +-109, +-106, +-100, +-100, +-97, +-89, +-96, +-94, +-84, +-88, +-86, +-75, +-82, +-81, +-68, +-82, +-82, +-66, +-77, +-81, +-60, +-62, +-64, +-52, + 46, + 46, + 37, + 91, + 88, + 76, + 98, + 89, + 89, +101, + 95, + 97, +117, +116, +119, +117, +116, +119, +117, +116, +119, +116, +116, +118, +115, +118, +121, +112, +110, +111, + 39, + 24, + 15, + 31, + -4, +-32, + 47, + -2, +-36, + 80, + 34, + 14, + 82, + 51, + 52, + 2, +-12, + 9, +-38, +-43, +-12, +-48, +-53, +-25, +-57, +-57, +-32, +-70, +-70, +-47, +-82, +-92, +-74, +-96, +-108, +-95, +-111, +-113, +-105, +-126, +-116, +-111, +-121, +-121, +-117, +-120, +-124, +-120, +-106, +-107, +-104, +-106, +-107, +-103, +-107, +-113, +-107, +-107, +-115, +-108, +-113, +-114, +-108, +-114, +-113, +-108, +-115, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-109, +-111, +-109, +-106, +-108, +-107, +-103, +-110, +-109, +-105, +-110, +-108, +-104, +-110, +-109, +-105, +-112, +-110, +-106, +-113, +-112, +-109, +-115, +-113, +-111, +-118, +-116, +-114, +-76, +-75, +-73, +-38, +-36, +-34, + -3, + -1, + 0, + 0, + 16, + 2, +-63, +-36, +-58, +-88, +-44, +-72, +-90, +-40, +-71, +-101, +-53, +-85, +-60, +-23, +-52, +-44, +-11, +-37, +-36, + -6, +-31, +-73, +-41, +-70, +-101, +-63, +-93, +-111, +-65, +-94, +-84, +-37, +-68, +-78, +-31, +-63, +-88, +-43, +-71, +-84, +-42, +-77, +-105, +-63, +-107, +-52, +-17, +-51, +-84, +-68, +-82, +-99, +-102, +-100, +-105, +-104, +-103, +-106, +-102, +-100, +-108, +-102, +-98, +-108, +-102, +-95, +-107, +-104, +-96, +-106, +-103, +-95, +-104, +-102, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-101, +-99, +-90, +-107, +-104, +-96, +-125, +-123, +-116, +-125, +-122, +-123, +-123, +-121, +-121, +-122, +-120, +-118, +-118, +-116, +-113, +-113, +-112, +-108, +-113, +-110, +-105, +-110, +-107, +-101, +-105, +-103, +-94, +-102, +-100, +-90, +-93, +-92, +-80, +-84, +-82, +-69, +-78, +-77, +-63, +-76, +-79, +-58, +-56, +-59, +-45, + 54, + 52, + 47, + 95, + 91, + 80, + 95, + 87, + 84, + 93, + 89, + 81, +117, +116, +119, +117, +116, +119, +115, +114, +117, +112, +113, +116, +113, +113, +117, +107, +102, +102, + 29, + 13, + 3, + 24, + -9, +-34, + 45, + -1, +-30, + 92, + 44, + 26, + 90, + 55, + 53, + 49, + 28, + 40, +-27, +-40, +-21, +-37, +-49, +-32, +-14, +-29, +-22, + 29, + 4, + 6, + 56, + 19, + 22, + 31, + -6, + -4, +-66, +-87, +-87, +-117, +-115, +-118, +-120, +-119, +-119, +-114, +-115, +-114, +-27, +-27, +-27, +-85, +-85, +-83, +-111, +-111, +-109, +-112, +-111, +-109, +-115, +-113, +-111, +-115, +-114, +-110, +-116, +-114, +-110, +-115, +-114, +-110, +-112, +-110, +-107, +-109, +-108, +-104, +-109, +-107, +-103, +-110, +-109, +-105, +-110, +-109, +-105, +-112, +-110, +-106, +-113, +-111, +-107, +-114, +-112, +-109, +-114, +-112, +-111, +-118, +-116, +-114, +-115, +-113, +-112, +-95, +-93, +-92, + 15, + 17, + 18, +-53, +-36, +-50, +-81, +-50, +-74, +-55, +-17, +-45, +-89, +-46, +-76, +-73, +-32, +-64, +-71, +-35, +-65, +-43, + -9, +-39, +-88, +-50, +-81, +-98, +-56, +-88, +-103, +-59, +-91, +-81, +-38, +-70, +-55, +-11, +-46, +-56, +-13, +-49, +-97, +-55, +-83, +-59, +-17, +-54, +-70, +-26, +-71, +-104, +-58, +-101, +-43, +-30, +-45, + -5, + -5, +-12, +-80, +-83, +-91, +-100, +-104, +-109, +-105, +-104, +-105, +-110, +-103, +-99, +-108, +-104, +-97, +-107, +-104, +-96, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-95, +-105, +-102, +-95, +-105, +-102, +-96, +-104, +-101, +-94, +-112, +-109, +-103, +-126, +-124, +-119, +-125, +-123, +-123, +-124, +-121, +-122, +-123, +-121, +-119, +-119, +-117, +-114, +-113, +-112, +-108, +-111, +-108, +-103, +-109, +-106, +-100, +-109, +-106, +-98, +-104, +-102, +-92, +-101, +-99, +-88, +-91, +-90, +-77, +-80, +-79, +-66, +-73, +-76, +-56, +-58, +-61, +-44, + 50, + 48, + 46, + 95, + 93, + 81, + 96, + 88, + 82, + 88, + 85, + 70, +116, +116, +118, +117, +116, +119, +113, +113, +116, +110, +110, +115, +112, +110, +114, +103, + 95, + 95, + 25, + 7, + -3, + 29, + -2, +-23, + 56, + 17, + -6, + 94, + 57, + 42, + 93, + 62, + 56, + 75, + 48, + 50, + 16, + -9, + -9, + 36, + 9, + 2, + 65, + 29, + 17, + 62, + 16, + 0, + 67, + 19, + 3, + 69, + 26, + 14, +-15, +-44, +-52, +-108, +-123, +-127, +-87, +-100, +-107, + -5, +-21, +-25, + 61, + 47, + 46, +-76, +-86, +-86, +-110, +-112, +-110, +-113, +-109, +-108, +-115, +-113, +-112, +-115, +-113, +-111, +-115, +-113, +-110, +-112, +-111, +-107, +-107, +-107, +-101, +-110, +-109, +-103, +-111, +-110, +-106, +-111, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-114, +-112, +-108, +-114, +-112, +-109, +-114, +-112, +-110, +-118, +-116, +-114, +-119, +-117, +-115, +-93, +-91, +-89, + 15, + 17, + 19, +-67, +-54, +-63, +-88, +-61, +-82, +-48, +-17, +-41, +-48, +-11, +-38, +-44, + -3, +-33, +-80, +-38, +-68, +-84, +-47, +-83, +-89, +-51, +-84, +-62, +-23, +-54, +-62, +-22, +-54, +-62, +-27, +-60, + 1, + 38, + -2, +-15, + 28, +-13, +-17, + 21, + -6, +-20, + 18, +-14, +-20, + 21, +-22, +-31, + 9, +-31, +-29, + -4, +-30, + 38, + 46, + 25, + 49, + 45, + 25, + 23, + 13, + -3, +-58, +-65, +-74, +-107, +-103, +-105, +-108, +-104, +-98, +-107, +-105, +-97, +-106, +-103, +-95, +-106, +-103, +-95, +-106, +-103, +-95, +-106, +-103, +-95, +-108, +-104, +-99, +-108, +-104, +-99, +-108, +-104, +-99, +-108, +-105, +-99, +-120, +-116, +-110, +-127, +-124, +-120, +-126, +-123, +-123, +-124, +-121, +-122, +-123, +-121, +-120, +-122, +-120, +-117, +-117, +-116, +-112, +-113, +-111, +-107, +-108, +-105, +-99, +-107, +-104, +-96, +-105, +-103, +-93, +-104, +-103, +-92, +-98, +-97, +-84, +-88, +-86, +-76, +-69, +-72, +-52, +-54, +-58, +-38, + 22, + 20, + 19, + 94, + 91, + 81, + 96, + 89, + 82, + 91, + 86, + 71, +116, +116, +118, +117, +116, +119, +114, +113, +116, +112, +112, +118, +114, +112, +115, + 69, + 60, + 59, + 27, + 7, + -2, + 31, + 0, +-18, + 57, + 25, + 5, + 79, + 55, + 45, + 97, + 72, + 65, + 95, + 65, + 57, + 73, + 37, + 20, + 59, + 17, + -9, + 51, + -2, +-32, + 54, + -2, +-30, + 54, + 11, +-16, + 18, +-12, +-31, +-67, +-89, +-97, +-30, +-48, +-41, + 54, + 17, + 10, + 85, + 42, + 34, + 92, + 51, + 49, + 16, +-18, +-16, +-92, +-113, +-107, +-106, +-115, +-108, +-113, +-112, +-112, +-113, +-111, +-110, +-113, +-111, +-109, +-109, +-108, +-103, +-107, +-107, +-100, +-110, +-110, +-102, +-113, +-111, +-107, +-113, +-111, +-107, +-112, +-111, +-107, +-112, +-110, +-106, +-114, +-112, +-108, +-114, +-112, +-109, +-114, +-112, +-110, +-118, +-116, +-114, +-117, +-115, +-113, +-80, +-78, +-77, + 30, + 32, + 34, + -5, + 5, + -2, +-75, +-58, +-71, +-69, +-44, +-62, +-52, +-18, +-41, +-90, +-47, +-73, +-91, +-42, +-72, +-69, +-37, +-74, +-41, + -7, +-42, +-27, + 10, +-21, +-58, +-22, +-54, +-81, +-52, +-86, +-30, + 0, +-40, +-49, + -7, +-49, +-23, + 13, +-14, + -6, + 27, + 1, +-22, + 9, +-22, +-68, +-38, +-69, +-44, +-17, +-45, +-24, + -8, +-39, + 28, + 25, + -6, + 66, + 51, + 25, + 41, + 28, + 12, +-93, +-96, +-102, +-109, +-106, +-101, +-109, +-106, +-98, +-107, +-105, +-97, +-107, +-104, +-96, +-107, +-104, +-96, +-107, +-104, +-97, +-111, +-107, +-103, +-112, +-107, +-104, +-112, +-108, +-105, +-113, +-109, +-106, +-122, +-118, +-114, +-126, +-122, +-120, +-125, +-122, +-123, +-124, +-121, +-122, +-123, +-121, +-120, +-123, +-121, +-118, +-121, +-120, +-116, +-119, +-117, +-112, +-110, +-107, +-101, +-107, +-104, +-97, +-105, +-103, +-93, +-102, +-100, +-89, +-99, +-97, +-85, +-96, +-94, +-84, +-80, +-82, +-63, +-51, +-56, +-36, + -8, +-10, + -9, + 92, + 89, + 78, + 98, + 91, + 82, + 94, + 87, + 74, +114, +113, +115, +112, +111, +114, +109, +108, +111, +107, +108, +115, + 97, + 92, + 97, + 19, + 2, + 3, + 32, + 6, + -1, + 24, + -6, +-22, + 41, + 11, + -7, + 68, + 38, + 28, + 81, + 49, + 37, + 68, + 34, + 16, + 43, + 3, +-23, + 45, + 2, +-32, + 51, + 5, +-33, + 53, + 8, +-23, + 23, +-13, +-31, +-30, +-59, +-66, + 35, + 6, + -6, + 59, + 28, + 11, + 51, + -2, +-25, + 55, + 0, +-20, + 69, + 20, + 9, + 40, + -3, + -6, + 34, + -4, + -5, + 53, + 16, + 16, +-12, +-34, +-38, +-82, +-97, +-98, +-91, +-101, +-99, +-107, +-107, +-105, +-116, +-106, +-107, +-118, +-107, +-108, +-113, +-111, +-108, +-113, +-112, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-112, +-108, +-116, +-112, +-110, +-118, +-114, +-112, +-120, +-116, +-115, +-72, +-68, +-69, + 34, + 39, + 38, + 22, + 30, + 25, +-41, +-27, +-38, +-76, +-48, +-71, +-56, +-18, +-48, +-94, +-52, +-82, +-75, +-38, +-67, +-47, +-18, +-52, +-40, +-11, +-43, +-35, + -6, +-37, +-49, +-22, +-52, +-97, +-73, +-102, +-28, + -5, +-36, +-47, +-15, +-49, +-42, + -5, +-35, +-41, + 0, +-29, +-47, + -8, +-38, +-60, +-30, +-56, +-53, +-23, +-51, +-27, +-18, +-47, + 43, + 28, + -5, + 59, + 34, + 3, + 62, + 46, + 21, +-15, +-24, +-38, +-107, +-107, +-103, +-110, +-107, +-101, +-108, +-106, +-100, +-108, +-106, +-101, +-110, +-106, +-101, +-111, +-108, +-101, +-111, +-109, +-102, +-112, +-110, +-104, +-113, +-111, +-107, +-118, +-114, +-114, +-21, +-18, +-21, +-107, +-103, +-107, +-126, +-123, +-124, +-125, +-122, +-123, +-124, +-122, +-122, +-124, +-122, +-122, +-122, +-120, +-119, +-121, +-118, +-114, +-116, +-112, +-107, +-111, +-108, +-101, +-107, +-104, +-98, +-102, +-99, +-92, +-100, +-97, +-89, +-97, +-96, +-85, +-88, +-89, +-73, +-59, +-60, +-43, +-18, +-20, +-12, + 84, + 81, + 76, + 95, + 88, + 77, + 94, + 86, + 76, +103, +102, +104, + 99, + 98, +101, + 96, + 96, + 98, + 96, + 97, +105, + 50, + 44, + 50, + 13, + -6, + -6, + 30, + 4, + -4, + 25, + -4, +-20, + 31, + 1, +-16, + 43, + 9, + -1, + 42, + 6, + -7, + 31, + -6, +-26, + 35, + -4, +-31, + 47, + 6, +-26, + 49, + 12, +-14, + 44, + 13, + -5, + 25, + -3, +-19, + 65, + 31, + 14, + 67, + 29, + 3, + 50, + 5, +-31, + 49, + -4, +-36, + 54, + 2, +-22, + 60, + 12, + -5, + 68, + 21, + 10, + 58, + 10, + 0, + 72, + 21, + 11, + 77, + 29, + 19, + 75, + 33, + 28, + 56, + 26, + 26, +-59, +-73, +-71, +-108, +-108, +-108, +-113, +-109, +-109, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-115, +-111, +-108, +-117, +-113, +-109, +-118, +-114, +-111, +-120, +-115, +-114, +-58, +-54, +-55, + 35, + 41, + 39, + 30, + 28, + 26, + -6, + -5, +-13, +-42, +-29, +-48, +-52, +-32, +-57, +-23, + -7, +-30, + -2, + 15, + -9, + -4, + 15, +-12, + 20, + 39, + 13, +-60, +-39, +-65, +-58, +-36, +-63, +-85, +-64, +-88, +-17, + 6, +-23, +-47, +-21, +-54, +-67, +-29, +-62, +-54, +-11, +-41, +-63, +-25, +-50, +-61, +-33, +-54, +-66, +-44, +-64, +-41, +-46, +-66, + 35, + 0, +-24, + 61, + 18, +-11, + 67, + 37, + 10, + 54, + 30, + 12, +-86, +-95, +-99, +-109, +-109, +-105, +-111, +-110, +-106, +-110, +-108, +-104, +-112, +-109, +-103, +-114, +-111, +-105, +-113, +-113, +-104, +-114, +-114, +-107, +-116, +-114, +-111, +-122, +-119, +-120, + 27, + 30, + 26, +-82, +-79, +-83, +-125, +-122, +-123, +-123, +-121, +-121, +-123, +-120, +-121, +-122, +-120, +-120, +-120, +-117, +-117, +-120, +-117, +-114, +-119, +-116, +-110, +-117, +-113, +-107, +-112, +-109, +-103, +-106, +-103, +-96, +-102, +-99, +-92, +-98, +-97, +-89, +-94, +-93, +-81, +-83, +-83, +-67, +-48, +-49, +-38, + 48, + 44, + 44, + 97, + 89, + 81, + 97, + 89, + 80, +109, +109, +111, +106, +106, +108, +103, +103, +106, + 99, +100, +108, + 54, + 48, + 52, + 21, + 3, + 0, + 26, + 0, + -9, + 30, + 0, +-13, + 30, + -1, +-14, + 33, + -1, + -9, + 37, + 2, +-11, + 33, + -4, +-22, + 40, + 0, +-22, + 53, + 12, +-15, + 71, + 33, + 19, + 86, + 53, + 43, + 83, + 51, + 28, + 56, + 23, +-13, + 45, + 5, +-33, + 50, + 3, +-32, + 48, + 3, +-24, + 66, + 21, + -2, + 73, + 24, + 5, + 53, + 1, +-18, + 54, + -4, +-25, + 65, + 2, +-19, + 62, + -3, +-22, + 60, + 4, + -7, + 45, + 6, + 4, +-54, +-74, +-72, +-104, +-112, +-107, +-109, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-115, +-111, +-108, +-117, +-113, +-109, +-118, +-114, +-111, +-119, +-114, +-113, +-44, +-40, +-41, + 44, + 49, + 47, + 47, + 43, + 39, + 25, + 21, + 15, + -8, + -8, +-19, +-18, +-14, +-30, +-15, +-11, +-27, + 25, + 29, + 13, + 39, + 45, + 27, + 43, + 52, + 33, + -7, + 6, +-14, +-71, +-53, +-77, +-62, +-40, +-64, +-41, +-17, +-46, +-57, +-31, +-67, +-61, +-27, +-63, +-42, + -6, +-36, +-57, +-27, +-47, +-52, +-33, +-42, +-102, +-92, +-98, +-66, +-85, +-93, + 23, +-26, +-41, + 60, + 7, +-19, + 76, + 36, + 7, + 76, + 42, + 20, + -6, +-23, +-33, +-107, +-112, +-114, +-112, +-113, +-110, +-113, +-111, +-106, +-115, +-112, +-106, +-117, +-113, +-108, +-117, +-117, +-110, +-119, +-118, +-113, +-120, +-119, +-116, +-118, +-115, +-115, + 49, + 52, + 49, +-84, +-81, +-84, +-122, +-120, +-117, +-120, +-119, +-115, +-120, +-118, +-115, +-115, +-114, +-111, +-110, +-109, +-105, +-112, +-110, +-105, +-114, +-112, +-104, +-116, +-113, +-105, +-114, +-112, +-104, +-112, +-110, +-101, +-115, +-112, +-104, +-114, +-112, +-107, +-113, +-110, +-102, +-112, +-111, +-97, +-99, +-101, +-88, +-69, +-74, +-71, + 67, + 57, + 54, + 98, + 90, + 81, +113, +112, +115, +111, +110, +113, +109, +109, +112, +107, +108, +115, + 41, + 36, + 38, + 22, + 4, + -1, + 25, + -1, +-11, + 35, + 4, + -7, + 27, + -5, +-14, + 31, + -1, +-10, + 47, + 14, + 3, + 52, + 16, + 2, + 43, + 5, +-13, + 37, + -3, +-24, + 66, + 20, + 5, + 69, + 22, + 3, + 52, + 11, +-23, + 41, + 5, +-36, + 44, + 11, +-21, + 47, + 16, + -4, + 63, + 26, + 5, + 72, + 30, + 6, + 54, + 6, +-19, + 52, + -1, +-26, + 58, + -1, +-25, + 45, +-15, +-39, + 43, + -9, +-29, + 26, +-14, +-28, +-56, +-79, +-85, +-105, +-112, +-112, +-112, +-111, +-108, +-114, +-110, +-106, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-111, +-107, +-114, +-110, +-107, +-115, +-111, +-108, +-116, +-111, +-111, +-33, +-29, +-30, + 46, + 51, + 49, + 48, + 55, + 48, + 47, + 54, + 45, + 23, + 28, + 20, + 13, + 17, + 7, + 36, + 40, + 29, + 41, + 47, + 34, + 48, + 53, + 40, + 52, + 57, + 44, + 32, + 44, + 27, +-60, +-44, +-63, +-49, +-27, +-50, +-47, +-22, +-50, +-53, +-26, +-63, +-51, +-22, +-58, +-34, + -7, +-37, +-87, +-66, +-83, +-102, +-91, +-93, +-123, +-115, +-113, +-105, +-119, +-122, +-15, +-58, +-72, + 35, +-11, +-40, + 71, + 38, + 4, + 66, + 40, + 9, + 66, + 47, + 30, +-49, +-60, +-67, +-112, +-115, +-114, +-115, +-112, +-107, +-116, +-113, +-107, +-119, +-117, +-112, +-121, +-120, +-116, +-122, +-120, +-118, +-123, +-121, +-119, +-98, +-97, +-96, + 17, + 19, + 18, +-105, +-103, +-102, +-109, +-108, +-102, +-110, +-109, +-103, +-110, +-109, +-103, +-109, +-109, +-102, +-103, +-102, +-95, +-100, +-99, +-91, +-100, +-98, +-88, +-97, +-95, +-85, +-95, +-93, +-83, +-97, +-95, +-85, +-97, +-94, +-84, +-98, +-96, +-92, +-111, +-109, +-102, +-107, +-107, +-93, +-98, +-99, +-86, +-87, +-92, +-86, + 45, + 36, + 33, + 97, + 89, + 81, +117, +116, +118, +116, +115, +117, +114, +113, +117, +108, +109, +117, + 9, + 3, + 4, + 18, + 1, + -8, + 22, + -3, +-15, + 35, + 3, + -4, + 33, + 1, + -4, + 37, + 6, + -2, + 41, + 9, + -1, + 43, + 9, + -3, + 31, + -6, +-20, + 22, +-18, +-34, + 37, + -7, +-26, + 41, + -5, +-28, + 42, + -4, +-30, + 50, + 6, +-21, + 54, + 17, + -7, + 65, + 33, + 15, + 62, + 26, + 1, + 54, + 11, +-17, + 54, + 7, +-21, + 51, + 1, +-24, + 37, +-12, +-30, + 40, + -5, +-19, + 7, +-22, +-32, +-69, +-85, +-91, +-111, +-111, +-112, +-117, +-109, +-107, +-117, +-109, +-107, +-114, +-110, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-110, +-107, +-114, +-110, +-108, +-115, +-111, +-110, +-15, +-10, +-12, + 42, + 47, + 45, + 43, + 59, + 47, + 34, + 49, + 38, + 30, + 35, + 31, + 9, + 10, + 8, + 21, + 24, + 18, + 39, + 44, + 35, + 41, + 51, + 42, + 48, + 60, + 49, + 38, + 54, + 39, + -8, + 10, + -8, +-30, + -8, +-31, +-46, +-22, +-48, +-34, + -8, +-40, +-21, + 2, +-31, +-33, +-14, +-41, +-122, +-110, +-123, +-122, +-119, +-116, +-121, +-114, +-111, +-103, +-113, +-117, +-11, +-52, +-67, + 18, +-27, +-56, + 66, + 36, + 1, + 63, + 40, + 7, + 70, + 44, + 23, + 14, + -4, +-16, +-113, +-120, +-121, +-120, +-117, +-112, +-122, +-118, +-112, +-121, +-119, +-115, +-123, +-121, +-120, +-123, +-121, +-120, +-122, +-120, +-118, +-117, +-115, +-113, +-107, +-105, +-103, +-99, +-97, +-93, +-96, +-96, +-87, +-100, +-101, +-91, +-96, +-96, +-86, +-95, +-95, +-85, +-99, +-99, +-90, +-94, +-93, +-82, +-95, +-93, +-82, +-92, +-90, +-79, +-92, +-91, +-79, +-95, +-93, +-82, +-94, +-92, +-80, +-87, +-86, +-78, +-90, +-88, +-77, +-103, +-103, +-88, +-101, +-103, +-91, +-62, +-67, +-66, + 78, + 69, + 63, + 97, + 89, + 80, +113, +112, +115, +112, +111, +114, +110, +110, +114, +103, +104, +112, + -1, + -7, + -8, + 1, +-15, +-26, + 26, + 2, +-11, + 30, + -1, + -8, + 41, + 8, + 5, + 40, + 11, + 3, + 44, + 12, + 4, + 33, + -1, +-11, + 34, + -3, +-15, + 43, + 3, +-10, + 42, + 10, + -3, + 43, + 15, + 1, + 45, + 5, + -6, + 48, + -2, +-15, + 51, + -1, +-24, + 58, + 8, +-24, + 49, + 4, +-28, + 53, + 7, +-23, + 48, + 3, +-26, + 36, + -7, +-27, + 17, +-18, +-30, +-29, +-55, +-60, +-102, +-117, +-110, +-112, +-115, +-107, +-117, +-110, +-102, +-118, +-110, +-103, +-112, +-112, +-106, +-109, +-112, +-109, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-110, +-107, +-114, +-110, +-108, +-116, +-111, +-111, + 1, + 6, + 4, + 43, + 48, + 46, + 46, + 59, + 47, + 50, + 57, + 49, + 53, + 48, + 48, + 39, + 24, + 28, + 13, + 0, + -1, + 16, + 11, + 5, + -4, + 12, + 4, + -7, + 13, + 1, +-26, + -5, +-21, +-64, +-43, +-61, +-58, +-38, +-58, +-63, +-42, +-64, +-81, +-60, +-84, +-48, +-31, +-56, +-48, +-35, +-56, +-125, +-119, +-127, +-115, +-115, +-112, +-111, +-111, +-107, +-69, +-89, +-94, + 15, +-33, +-47, + 26, +-27, +-53, + 65, + 26, + -4, + 69, + 36, + 8, + 66, + 34, + 11, + 61, + 38, + 21, +-70, +-79, +-83, +-121, +-119, +-114, +-123, +-118, +-111, +-114, +-112, +-107, +-106, +-104, +-102, +-107, +-104, +-103, +-107, +-105, +-102, +-105, +-103, +-99, +-99, +-97, +-94, +-94, +-93, +-87, +-90, +-90, +-79, +-95, +-95, +-84, +-91, +-91, +-79, +-90, +-91, +-79, +-89, +-89, +-77, +-85, +-84, +-72, +-83, +-81, +-68, +-92, +-91, +-78, +-89, +-88, +-75, +-97, +-96, +-83, +-97, +-96, +-82, +-84, +-84, +-71, +-82, +-81, +-66, +-89, +-89, +-73, +-92, +-93, +-82, +-72, +-76, +-78, + 76, + 69, + 57, + 96, + 88, + 79, + 96, + 96, +104, + 97, + 97, +105, + 99, + 98, +107, + 95, + 88, +102, + 6, + 1, + 3, +-19, +-25, +-36, + 28, + 14, + -1, + 37, + 11, + 4, + 43, + 10, + 10, + 42, + 13, + 12, + 47, + 16, + 14, + 40, + 6, + 4, + 40, + 5, + 0, + 50, + 14, + 7, + 52, + 19, + 12, + 45, + 12, + 3, + 23, +-19, +-28, + 34, +-12, +-26, + 42, + -2, +-23, + 44, + 4, +-24, + 46, + 3, +-13, + 40, + -2, +-11, + 16, +-19, +-24, +-10, +-36, +-38, +-86, +-102, +-99, +-105, +-115, +-106, +-111, +-110, +-103, +-112, +-109, +-103, +-113, +-109, +-103, +-116, +-113, +-107, +-115, +-113, +-107, +-115, +-113, +-107, +-114, +-113, +-107, +-112, +-112, +-105, +-112, +-111, +-105, +-112, +-111, +-105, +-112, +-111, +-105, +-116, +-115, +-111, +-113, +-111, +-109, +-113, +-111, +-110, +-107, +-105, +-105, + 12, + 16, + 13, + 45, + 49, + 46, + 43, + 48, + 41, + 46, + 49, + 38, + 48, + 34, + 21, + 51, + 13, + -1, + 32, + -9, +-29, + 1, +-27, +-55, +-62, +-61, +-87, +-63, +-49, +-73, +-65, +-41, +-66, +-58, +-33, +-54, +-45, +-26, +-38, +-67, +-55, +-62, +-118, +-111, +-116, +-126, +-121, +-125, +-122, +-118, +-122, +-120, +-116, +-119, +-114, +-111, +-112, +-109, +-111, +-110, +-45, +-68, +-78, + 30, +-19, +-42, + 42, +-12, +-39, + 67, + 24, + -1, + 66, + 30, + 2, + 64, + 32, + 7, + 69, + 44, + 25, + 29, + 12, + 6, +-64, +-70, +-64, +-62, +-61, +-46, +-60, +-55, +-36, +-52, +-53, +-35, +-51, +-53, +-33, +-56, +-57, +-35, +-72, +-70, +-51, +-97, +-93, +-80, +-105, +-100, +-89, +-86, +-83, +-67, +-88, +-86, +-70, +-91, +-88, +-75, +-87, +-84, +-72, +-94, +-90, +-80, +-92, +-89, +-79, +-82, +-80, +-70, +-82, +-80, +-68, +-89, +-88, +-75, +-84, +-83, +-68, +-93, +-93, +-77, +-91, +-88, +-75, +-65, +-65, +-50, +-90, +-90, +-75, +-88, +-92, +-83, +-66, +-69, +-71, + 70, + 65, + 56, + 93, + 86, + 77, + 91, + 91, +100, + 92, + 92, +101, + 93, + 93, +103, + 91, + 87, +100, + 2, + 1, + 2, + 2, + 2, + -9, + -2, + -9, +-23, + 42, + 24, + 15, + 47, + 21, + 18, + 46, + 22, + 20, + 55, + 29, + 27, + 55, + 28, + 25, + 54, + 26, + 21, + 49, + 19, + 14, + 41, + 13, + 7, + 41, + 13, + 7, + 46, + 14, + 7, + 48, + 16, + 5, + 45, + 17, + 1, + 55, + 32, + 15, + 26, + 8, + -2, +-50, +-68, +-72, +-94, +-105, +-107, +-107, +-111, +-110, +-111, +-109, +-105, +-114, +-108, +-103, +-110, +-106, +-101, +-111, +-108, +-102, +-113, +-109, +-104, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-114, +-114, +-106, +-112, +-112, +-105, +-111, +-111, +-104, +-112, +-111, +-104, +-112, +-111, +-105, +-121, +-119, +-115, +-123, +-121, +-119, +-114, +-112, +-111, +-88, +-86, +-87, + 26, + 29, + 26, + 43, + 46, + 43, + 50, + 54, + 48, + 47, + 50, + 40, + 30, + 17, + 4, + 31, + -7, +-23, + 36, + -8, +-32, + 29, + -4, +-36, + 24, +-11, +-36, + 12, +-14, +-40, +-21, +-30, +-55, +-51, +-44, +-67, +-96, +-78, +-91, +-125, +-109, +-117, +-124, +-121, +-122, +-123, +-120, +-121, +-120, +-117, +-118, +-118, +-115, +-116, +-115, +-112, +-113, +-111, +-112, +-111, +-48, +-69, +-80, + 39, + -5, +-31, + 59, + 12, +-16, + 73, + 37, + 11, + 66, + 34, + 6, + 73, + 40, + 13, + 74, + 44, + 23, + 73, + 51, + 41, + 20, + 7, + 7, +-39, +-44, +-32, +-44, +-44, +-24, +-42, +-45, +-21, +-41, +-45, +-18, +-42, +-44, +-16, +-52, +-52, +-27, +-62, +-58, +-39, +-84, +-79, +-64, +-78, +-75, +-58, +-82, +-80, +-63, +-85, +-82, +-67, +-86, +-82, +-70, +-84, +-80, +-68, +-94, +-91, +-80, +-89, +-87, +-77, +-83, +-81, +-70, +-87, +-85, +-72, +-84, +-84, +-69, +-81, +-81, +-64, +-93, +-91, +-77, +-85, +-84, +-69, +-87, +-87, +-73, +-84, +-88, +-80, +-58, +-62, +-64, + 79, + 74, + 66, + 94, + 87, + 78, + 87, + 88, + 97, + 89, + 89, + 98, + 90, + 90, +100, + 91, + 92, +103, + -2, + 2, + 5, + 12, + 18, + 9, +-12, +-11, +-23, +-23, +-32, +-42, + 29, + 12, + 7, + 44, + 24, + 21, + 49, + 30, + 26, + 52, + 32, + 27, + 56, + 36, + 31, + 55, + 34, + 29, + 47, + 28, + 23, + 44, + 26, + 23, + 47, + 31, + 27, + 62, + 50, + 44, + 88, + 79, + 72, + 97, + 90, + 82, +-15, +-17, +-21, +-113, +-111, +-109, +-113, +-110, +-107, +-111, +-106, +-103, +-112, +-104, +-100, +-108, +-101, +-97, +-110, +-106, +-100, +-113, +-110, +-104, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-114, +-113, +-106, +-112, +-112, +-105, +-111, +-111, +-104, +-111, +-111, +-104, +-112, +-111, +-105, +-118, +-116, +-112, +-120, +-118, +-117, +-120, +-117, +-116, +-48, +-46, +-47, + 38, + 41, + 38, + 47, + 50, + 47, + 45, + 47, + 42, + 41, + 44, + 36, + 28, + 18, + 9, + 35, + 0, +-12, + 26, +-18, +-38, + 22, +-13, +-44, + 50, + -3, +-29, + 51, + 4, +-26, + 52, + 17, +-14, + 14, + -7, +-33, +-56, +-68, +-82, +-110, +-114, +-122, +-121, +-118, +-119, +-120, +-117, +-118, +-119, +-116, +-117, +-117, +-114, +-115, +-116, +-113, +-114, +-111, +-112, +-112, +-51, +-69, +-81, + 47, + 9, +-19, + 74, + 35, + 5, + 78, + 48, + 22, + 77, + 50, + 24, + 77, + 44, + 19, + 75, + 40, + 18, + 71, + 41, + 24, + 76, + 55, + 47, + -4, +-17, +-12, +-43, +-49, +-30, +-43, +-49, +-21, +-45, +-50, +-18, +-42, +-46, +-13, +-45, +-47, +-16, +-59, +-58, +-33, +-60, +-56, +-36, +-54, +-52, +-33, +-54, +-52, +-35, +-89, +-87, +-71, +-79, +-76, +-62, +-80, +-76, +-63, +-88, +-85, +-74, +-92, +-90, +-79, +-83, +-81, +-70, +-87, +-86, +-73, +-82, +-81, +-66, +-79, +-79, +-62, +-84, +-81, +-67, +-90, +-89, +-74, +-81, +-81, +-67, +-83, +-87, +-79, +-16, +-19, +-22, + 92, + 87, + 79, + 96, + 89, + 80, + 51, + 51, + 58, + 51, + 51, + 58, + 55, + 55, + 63, + 56, + 58, + 66, + -8, + -4, + -1, +-31, +-25, +-31, +-11, + -7, +-16, +-40, +-42, +-51, +-45, +-55, +-61, + 8, + -6, +-10, + 21, + 6, + 4, + 20, + 7, + 3, + 18, + 4, + 1, + 19, + 5, + 2, + 5, + -7, + -8, + 31, + 23, + 23, + 42, + 35, + 35, + 57, + 53, + 52, + 56, + 55, + 53, + 45, + 45, + 43, +-73, +-73, +-72, +-105, +-105, +-102, +-102, +-102, +-99, +-102, +-101, +-98, +-100, +-101, +-97, +-99, +-99, +-95, +-103, +-101, +-98, +-104, +-103, +-100, +-105, +-104, +-101, +-105, +-104, +-101, +-105, +-104, +-101, +-105, +-104, +-101, +-104, +-104, +-101, +-104, +-104, +-101, +-103, +-103, +-99, +-102, +-102, +-99, +-104, +-103, +-100, +-106, +-105, +-104, +-107, +-107, +-106, +-107, +-106, +-105, +-41, +-39, +-40, + 17, + 20, + 18, + 21, + 24, + 21, + 17, + 19, + 15, + 19, + 22, + 16, + 3, + -3, + -8, + 1, +-25, +-32, + 0, +-34, +-48, + -4, +-31, +-55, + 7, +-28, +-52, + 18, +-20, +-46, + 23, +-15, +-42, + 24, +-10, +-31, + 1, +-28, +-39, +-74, +-91, +-95, +-106, +-105, +-106, +-107, +-105, +-106, +-106, +-105, +-105, +-105, +-104, +-104, +-104, +-103, +-103, +-101, +-102, +-102, +-24, +-40, +-49, + 20, + -8, +-31, + 46, + 18, + -6, + 41, + 19, + 0, + 45, + 25, + 6, + 48, + 21, + 4, + 39, + 10, + -8, + 36, + 10, + -8, + 42, + 22, + 12, + 6, + -7, + -5, +-60, +-67, +-53, +-60, +-65, +-42, +-60, +-65, +-38, +-59, +-63, +-35, +-57, +-59, +-34, +-62, +-61, +-41, +-77, +-75, +-58, +-64, +-63, +-47, +-54, +-52, +-37, +-87, +-85, +-74, +-84, +-82, +-71, +-82, +-79, +-69, +-89, +-87, +-78, +-92, +-91, +-84, +-84, +-82, +-74, +-94, +-93, +-84, +-83, +-83, +-72, +-82, +-82, +-70, +-84, +-83, +-73, +-89, +-89, +-78, +-84, +-84, +-74, +-86, +-89, +-84, + 2, + -1, + -3, + 59, + 56, + 49, + 60, + 54, + 47 +}; diff --git a/examples/app_flash_two_models/src/main.cpp b/examples/app_flash_two_models/src/main.cpp new file mode 100644 index 000000000..2364ffb6b --- /dev/null +++ b/examples/app_flash_two_models/src/main.cpp @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include +#include "flash_server.h" +#include "model1.tflite.h" +#include "model2.tflite.h" + +#include "image.h" +#include "image2.h" + +#define NFLASH_SPECS 1 +fl_QuadDeviceSpec flash_spec[NFLASH_SPECS] = { + FL_QUADDEVICE_DEFAULT //FL_QUADDEVICE_MACRONIX_MX25R6435FM2IH0 +}; + +fl_QSPIPorts qspi = { + PORT_SQI_CS, + PORT_SQI_SCLK, + PORT_SQI_SIO, + XS1_CLKBLK_2 +}; + +DECLARE_JOB(flash_server, (chanend_t *, flash_t*, int, + fl_QSPIPorts*, fl_QuadDeviceSpec*, int)); +DECLARE_JOB(nn_thread, (chanend_t, chanend_t)); + +void nn_thread(chanend_t flash1, chanend_t flash2) { + model1_init((void *)flash1); + int8_t *inputs1 = (int8_t *)model1_input_ptr(0); + int8_t *outputs1 = (int8_t *)model1_output_ptr(0); + model2_init((void *)flash2); + int8_t *inputs2 = (int8_t *)model2_input_ptr(0); + int8_t *outputs2 = (int8_t *)model2_output_ptr(0); + memcpy(inputs1, image, sizeof(image)); // copy data to inputs + model1_invoke(); + printf("%s (%d%%)\n", outputs1[0] > outputs1[1] ? "No human" : "Human", (outputs1[1]+128)*100/255); + + memcpy(inputs2, image2, sizeof(image2)); // copy data to inputs + model2_invoke(); + printf("%s (%d%%)\n", outputs2[0] > outputs2[1] ? "No human" : "Human", (outputs2[1]+128)*100/255); + chan_out_word(flash1, FLASH_SERVER_QUIT); +} + +#define NNETWORKS 2 + +int main(void) { + flash_t headers[NNETWORKS]; + chanend_t flash_server_chanends[NNETWORKS]; + channel_t c_flash1 = chan_alloc(); + channel_t c_flash2 = chan_alloc(); + flash_server_chanends[0] = c_flash1.end_a; + flash_server_chanends[1] = c_flash2.end_a; + PAR_JOBS( + PJOB(flash_server, (flash_server_chanends, headers, NNETWORKS, + &qspi, &flash_spec[0], NFLASH_SPECS)), + PJOB(nn_thread, (c_flash1.end_b, c_flash2.end_b)) + ); +} diff --git a/examples/app_flash_two_models/vww_quant1.tflite b/examples/app_flash_two_models/vww_quant1.tflite new file mode 100644 index 000000000..2abf500af Binary files /dev/null and b/examples/app_flash_two_models/vww_quant1.tflite differ diff --git a/examples/app_flash_two_models/vww_quant2.tflite b/examples/app_flash_two_models/vww_quant2.tflite new file mode 100644 index 000000000..2abf500af Binary files /dev/null and b/examples/app_flash_two_models/vww_quant2.tflite differ diff --git a/examples/app_flash_two_models_one_arena/Makefile b/examples/app_flash_two_models_one_arena/Makefile new file mode 100644 index 000000000..a554210c8 --- /dev/null +++ b/examples/app_flash_two_models_one_arena/Makefile @@ -0,0 +1,33 @@ +TARGET = XCORE-AI-EXPLORER +APP_NAME = + +APP_FLAGS = -report \ +-O3 -mcmodel=large -fxscope -Wno-xcore-fptrgroup \ +-DSHARED_TENSOR_ARENA \ +-g \ +-lquadflash + +# ******************************************************* +# Include AI Tools library and headers +# ******************************************************* +# The following variables are defined for AI Tools library +# and should be included when building the app. +# XMOS_AITOOLSLIB_DEFINITIONS +# XMOS_AITOOLSLIB_INCLUDES +# XMOS_AITOOLSLIB_LIBRARIES +# +ifeq ($(XMOS_AITOOLSLIB_PATH),) +$(error Path to XMOS AI Tools library and headers not set correctly!) +endif +include ${XMOS_AITOOLSLIB_PATH}/buildfiles/aitoolslib.make + +XCC_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_CPP_FLAGS = $(APP_FLAGS) -std=c++14 $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_MAP_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_LIBRARIES) + +#============================================================================= +# The following part of the Makefile includes the common build infrastructure +# for compiling XMOS applications. You should not need to edit below here. + +XMOS_MAKE_PATH ?= ../.. +include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common diff --git a/examples/app_flash_two_models_one_arena/README.rst b/examples/app_flash_two_models_one_arena/README.rst new file mode 100644 index 000000000..fd29b0cc9 --- /dev/null +++ b/examples/app_flash_two_models_one_arena/README.rst @@ -0,0 +1,46 @@ +Example with two models sharing scratch memory +============================================== + +Please consult `here <../../docs/rst/flow.rst>`_ on how to install the tools. + +This is an example with two networks, but these two share a scratch memory. + +The differences with ``app_flash_two_models`` example are minimal: + +* The shared-arena defined ``-DSHARED_TENSOR_ARENA`` has been added to the + Makefile; + +* In main.cpp a shared tensor arena is declared:: + + uint8_t tensor_arena[LARGEST_TENSOR_ARENA_SIZE] ALIGN(8); + +* In main.cpp we ensured that each model is initialised before + it is invoked; because the arena is shared, each model initialisation + will overwrite the previous model's data. + +In order to compile and run this example follow these steps:: + + xcore-opt --xcore-weights-file=model1.params \ + --xcore-naming-prefix=model1_ \ + vww_quant1.tflite -o model1.tflite + xcore-opt --xcore-weights-file=model2.params \ + --xcore-naming-prefix=model2_ \ + vww_quant2.tflite -o model2.tflite + mv model1.tflite.cpp model1.tflite.h src + mv model2.tflite.cpp model2.tflite.h src + xmake + python -c 'from xmos_ai_tools import xformer as xf; xf.generate_flash( + output_file="xcore_flash_binary.out", + model_files=["model1.tflite", "model2.tflite"], + param_files=["model1.params", "model2.params"] + )' + xflash --target XCORE-AI-EXPLORER --data xcore_flash_binary.out + xrun --xscope bin/app_flash_two_models_one_arena.xe + +This should print:: + + No human (9%) + Human (98%) + + + diff --git a/examples/app_flash_two_models_one_arena/src/config.xscope b/examples/app_flash_two_models_one_arena/src/config.xscope new file mode 100644 index 000000000..ef80fed5b --- /dev/null +++ b/examples/app_flash_two_models_one_arena/src/config.xscope @@ -0,0 +1,3 @@ + + + diff --git a/examples/app_flash_two_models_one_arena/src/image.h b/examples/app_flash_two_models_one_arena/src/image.h new file mode 100644 index 000000000..dc3c860a3 --- /dev/null +++ b/examples/app_flash_two_models_one_arena/src/image.h @@ -0,0 +1,27650 @@ +int8_t image[3*96*96] = { + 73, + 40, + 0, + 73, + 40, + -4, + 77, + 44, + 0, + 78, + 44, + -1, + 74, + 37, +-11, + 71, + 36, +-14, + 70, + 36, + -8, + 66, + 33, + -7, + 65, + 32, + -5, + 64, + 32, + -4, + 63, + 33, + -2, + 63, + 35, + 1, + 65, + 39, + 10, + 67, + 42, + 16, + 67, + 44, + 19, + 67, + 46, + 22, + 68, + 49, + 27, + 68, + 52, + 30, + 69, + 54, + 37, + 72, + 58, + 42, + 74, + 61, + 46, + 77, + 64, + 53, + 78, + 69, + 56, + 82, + 72, + 60, + 83, + 75, + 64, + 85, + 77, + 68, + 87, + 79, + 72, + 89, + 81, + 76, + 91, + 84, + 78, + 92, + 85, + 80, + 93, + 88, + 82, + 95, + 89, + 85, + 95, + 90, + 87, + 96, + 91, + 88, + 97, + 92, + 89, + 97, + 92, + 89, + 98, + 93, + 90, + 98, + 93, + 90, + 99, + 94, + 91, + 99, + 94, + 92, + 99, + 93, + 91, + 99, + 93, + 91, +100, + 94, + 92, + 99, + 94, + 91, + 99, + 93, + 91, + 99, + 93, + 91, +100, + 94, + 91, + 99, + 94, + 90, +100, + 95, + 91, +100, + 95, + 91, + 99, + 94, + 89, + 99, + 94, + 88, + 98, + 93, + 88, + 98, + 93, + 88, + 98, + 92, + 87, + 97, + 92, + 86, + 97, + 91, + 85, + 97, + 91, + 84, + 96, + 89, + 82, + 95, + 89, + 82, + 96, + 89, + 82, + 95, + 89, + 82, + 95, + 88, + 81, + 94, + 87, + 79, + 93, + 86, + 76, + 93, + 86, + 76, + 92, + 85, + 75, + 92, + 85, + 75, + 91, + 84, + 75, + 90, + 83, + 73, + 89, + 82, + 72, + 88, + 81, + 70, + 88, + 81, + 70, + 87, + 81, + 69, + 87, + 80, + 68, + 87, + 80, + 68, + 88, + 79, + 68, + 88, + 80, + 68, + 89, + 79, + 68, + 88, + 78, + 67, + 88, + 78, + 66, + 88, + 77, + 65, + 87, + 76, + 64, + 86, + 75, + 63, + 85, + 74, + 61, + 86, + 74, + 58, + 86, + 73, + 58, + 86, + 73, + 57, + 86, + 74, + 58, + 85, + 72, + 57, + 86, + 72, + 57, + 85, + 71, + 55, + 85, + 71, + 56, + 85, + 71, + 55, + 83, + 69, + 53, + 82, + 68, + 51, + 73, + 37, +-28, + 72, + 38, +-11, + 72, + 38, + -2, + 74, + 41, + -5, + 77, + 44, + -3, + 77, + 40, + -8, + 71, + 33, +-21, + 68, + 31, +-20, + 67, + 31, +-13, + 63, + 28, +-13, + 64, + 28, +-11, + 62, + 28, +-12, + 63, + 30, + -8, + 62, + 33, + -1, + 63, + 36, + 5, + 64, + 37, + 9, + 63, + 38, + 11, + 63, + 40, + 12, + 64, + 42, + 16, + 64, + 43, + 19, + 65, + 45, + 23, + 66, + 47, + 26, + 68, + 49, + 29, + 69, + 51, + 33, + 70, + 53, + 34, + 71, + 56, + 40, + 72, + 58, + 43, + 73, + 61, + 46, + 77, + 64, + 50, + 76, + 67, + 54, + 78, + 70, + 56, + 81, + 72, + 60, + 82, + 73, + 64, + 82, + 75, + 66, + 84, + 77, + 68, + 85, + 78, + 69, + 86, + 79, + 70, + 86, + 80, + 71, + 88, + 82, + 74, + 89, + 82, + 75, + 90, + 84, + 79, + 90, + 84, + 79, + 91, + 85, + 79, + 92, + 85, + 79, + 92, + 86, + 78, + 92, + 86, + 78, + 94, + 88, + 78, + 94, + 88, + 79, + 95, + 89, + 79, + 95, + 89, + 80, + 95, + 89, + 80, + 95, + 89, + 80, + 95, + 89, + 79, + 95, + 89, + 79, + 96, + 89, + 78, + 95, + 89, + 77, + 95, + 88, + 76, + 95, + 88, + 76, + 94, + 88, + 76, + 94, + 87, + 75, + 93, + 87, + 75, + 93, + 87, + 74, + 92, + 86, + 74, + 91, + 85, + 73, + 90, + 83, + 71, + 89, + 82, + 70, + 87, + 81, + 69, + 86, + 80, + 68, + 85, + 79, + 66, + 85, + 79, + 66, + 85, + 78, + 66, + 85, + 76, + 65, + 84, + 76, + 64, + 84, + 75, + 63, + 85, + 75, + 63, + 84, + 74, + 61, + 84, + 74, + 62, + 84, + 73, + 60, + 84, + 72, + 57, + 83, + 71, + 57, + 83, + 71, + 56, + 83, + 70, + 53, + 83, + 70, + 52, + 82, + 69, + 51, + 81, + 68, + 50, + 80, + 66, + 48, + 82, + 65, + 47, + 80, + 65, + 46, + 79, + 64, + 43, + 78, + 62, + 41, + 79, + 61, + 40, + 77, + 59, + 38, + 75, + 57, + 34, + 73, + 53, + 30, + 70, + 48, + 26, + 66, + 41, + 18, + 77, + 41, +-27, + 76, + 38, +-30, + 72, + 35, +-27, + 70, + 36, +-12, + 71, + 37, +-10, + 74, + 37, +-10, + 77, + 39, +-12, + 72, + 34, +-23, + 67, + 26, +-31, + 64, + 25, +-28, + 61, + 22, +-27, + 60, + 22, +-26, + 59, + 21, +-25, + 59, + 22, +-23, + 59, + 23, +-21, + 59, + 25, +-16, + 59, + 26, +-14, + 59, + 27, +-10, + 60, + 27, +-10, + 60, + 29, + -7, + 61, + 30, + -4, + 61, + 32, + -1, + 61, + 33, + 1, + 62, + 34, + 2, + 62, + 35, + 3, + 62, + 36, + 7, + 62, + 37, + 8, + 63, + 40, + 11, + 65, + 42, + 15, + 65, + 43, + 19, + 66, + 46, + 23, + 67, + 49, + 28, + 68, + 52, + 30, + 69, + 54, + 35, + 70, + 56, + 38, + 71, + 58, + 42, + 73, + 61, + 45, + 74, + 63, + 48, + 76, + 65, + 51, + 76, + 67, + 54, + 78, + 69, + 58, + 79, + 71, + 60, + 81, + 73, + 61, + 83, + 75, + 63, + 84, + 77, + 65, + 86, + 80, + 67, + 87, + 81, + 68, + 89, + 83, + 70, + 91, + 85, + 72, + 92, + 86, + 73, + 92, + 87, + 74, + 94, + 88, + 75, + 94, + 88, + 75, + 94, + 88, + 75, + 95, + 89, + 76, + 95, + 89, + 76, + 95, + 89, + 76, + 94, + 88, + 75, + 94, + 88, + 75, + 94, + 88, + 75, + 93, + 86, + 73, + 92, + 86, + 73, + 91, + 85, + 72, + 90, + 84, + 71, + 88, + 81, + 68, + 87, + 79, + 66, + 85, + 78, + 62, + 84, + 75, + 60, + 82, + 74, + 59, + 82, + 71, + 57, + 81, + 69, + 55, + 80, + 68, + 52, + 79, + 66, + 48, + 79, + 65, + 46, + 79, + 64, + 46, + 77, + 63, + 43, + 77, + 63, + 42, + 76, + 62, + 41, + 76, + 60, + 39, + 77, + 60, + 38, + 78, + 59, + 37, + 78, + 58, + 35, + 77, + 56, + 34, + 76, + 55, + 32, + 76, + 54, + 28, + 75, + 52, + 26, + 74, + 51, + 22, + 74, + 49, + 20, + 73, + 48, + 19, + 72, + 46, + 13, + 70, + 43, + 9, + 69, + 39, + 6, + 67, + 36, + 1, + 64, + 32, + -5, + 61, + 27, +-10, + 57, + 23, +-16, + 79, + 43, +-24, + 77, + 41, +-27, + 75, + 39, +-29, + 75, + 36, +-31, + 71, + 33, +-29, + 66, + 31, +-21, + 69, + 31, +-20, + 69, + 33, +-24, + 69, + 31, +-26, + 64, + 23, +-36, + 60, + 18, +-39, + 59, + 17, +-38, + 56, + 16, +-38, + 56, + 16, +-37, + 55, + 16, +-37, + 53, + 15, +-37, + 54, + 16, +-38, + 54, + 15, +-34, + 54, + 15, +-34, + 54, + 15, +-34, + 54, + 15, +-31, + 55, + 15, +-30, + 53, + 15, +-30, + 55, + 16, +-29, + 54, + 16, +-28, + 54, + 18, +-27, + 54, + 17, +-25, + 55, + 18, +-24, + 56, + 19, +-23, + 56, + 19, +-23, + 56, + 19, +-21, + 55, + 20, +-20, + 54, + 21, +-18, + 53, + 22, +-15, + 52, + 23, +-12, + 52, + 24, + -8, + 52, + 25, + -5, + 53, + 26, + -3, + 54, + 29, + -1, + 54, + 31, + 2, + 55, + 34, + 6, + 58, + 38, + 12, + 62, + 43, + 17, + 65, + 47, + 22, + 69, + 53, + 28, + 73, + 58, + 34, + 75, + 62, + 38, + 78, + 66, + 41, + 81, + 69, + 45, + 83, + 71, + 47, + 84, + 72, + 49, + 85, + 73, + 51, + 87, + 74, + 53, + 88, + 76, + 53, + 87, + 76, + 53, + 86, + 76, + 54, + 86, + 76, + 52, + 87, + 75, + 51, + 86, + 74, + 52, + 85, + 73, + 50, + 85, + 73, + 49, + 83, + 71, + 48, + 82, + 69, + 46, + 79, + 66, + 43, + 77, + 62, + 38, + 74, + 58, + 33, + 69, + 52, + 27, + 66, + 47, + 21, + 62, + 42, + 15, + 61, + 38, + 10, + 59, + 36, + 7, + 60, + 35, + 6, + 62, + 36, + 5, + 62, + 34, + 4, + 62, + 34, + 2, + 63, + 34, + 1, + 64, + 35, + -1, + 65, + 36, + -1, + 67, + 35, + -1, + 69, + 37, + 1, + 70, + 38, + 1, + 70, + 39, + -1, + 71, + 38, + -2, + 70, + 38, + -3, + 70, + 37, + -5, + 70, + 37, + -7, + 68, + 35, + -8, + 68, + 33, +-10, + 68, + 32, +-13, + 67, + 30, +-14, + 65, + 29, +-16, + 65, + 28, +-18, + 65, + 26, +-19, + 63, + 25, +-20, + 65, + 25, +-21, + 63, + 25, +-22, + 80, + 45, +-23, + 78, + 42, +-25, + 77, + 41, +-27, + 76, + 39, +-29, + 75, + 35, +-32, + 70, + 30, +-37, + 65, + 25, +-38, + 61, + 23, +-32, + 62, + 22, +-33, + 65, + 24, +-34, + 65, + 24, +-35, + 64, + 22, +-35, + 65, + 24, +-33, + 64, + 23, +-33, + 63, + 21, +-33, + 62, + 21, +-34, + 62, + 21, +-34, + 61, + 20, +-35, + 59, + 19, +-35, + 59, + 19, +-35, + 58, + 19, +-34, + 57, + 19, +-33, + 57, + 19, +-31, + 57, + 19, +-32, + 57, + 19, +-32, + 57, + 19, +-31, + 58, + 19, +-31, + 57, + 18, +-31, + 58, + 19, +-29, + 58, + 19, +-29, + 58, + 19, +-29, + 57, + 18, +-30, + 56, + 17, +-30, + 54, + 14, +-30, + 51, + 14, +-30, + 49, + 14, +-28, + 49, + 14, +-28, + 49, + 14, +-28, + 48, + 14, +-28, + 46, + 12, +-31, + 43, + 8, +-34, + 38, + 3, +-41, + 39, + 4, +-39, + 45, + 10, +-34, + 51, + 16, +-29, + 58, + 24, +-22, + 62, + 29, +-18, + 65, + 32, +-17, + 66, + 34, +-13, + 67, + 36, +-12, + 67, + 36, +-14, + 68, + 37, +-14, + 69, + 37, +-12, + 69, + 38, +-12, + 72, + 40, + -8, + 74, + 42, + -4, + 75, + 44, + 0, + 75, + 46, + 1, + 76, + 45, + 2, + 73, + 46, + 0, + 73, + 45, + 0, + 73, + 44, + -2, + 73, + 43, + -3, + 71, + 39, + -5, + 68, + 36, + -9, + 64, + 31, +-12, + 61, + 27, +-16, + 57, + 23, +-19, + 53, + 19, +-22, + 55, + 20, +-21, + 59, + 26, +-15, + 63, + 31, +-10, + 62, + 29, +-12, + 60, + 27, +-15, + 60, + 23, +-21, + 60, + 22, +-26, + 60, + 22, +-27, + 60, + 23, +-28, + 61, + 23, +-30, + 63, + 24, +-31, + 63, + 23, +-31, + 64, + 23, +-30, + 64, + 23, +-30, + 63, + 22, +-32, + 63, + 22, +-32, + 62, + 21, +-33, + 60, + 19, +-35, + 61, + 19, +-35, + 60, + 19, +-37, + 61, + 19, +-37, + 61, + 20, +-36, + 61, + 19, +-35, + 61, + 20, +-35, + 61, + 19, +-35, + 62, + 20, +-38, + 61, + 19, +-38, + 83, + 47, +-20, + 81, + 45, +-22, + 79, + 43, +-24, + 78, + 41, +-27, + 77, + 37, +-30, + 73, + 33, +-35, + 68, + 28, +-44, + 64, + 20, +-52, + 60, + 17, +-47, + 59, + 17, +-40, + 59, + 18, +-39, + 69, + 30, +-27, + 69, + 32, +-25, + 69, + 31, +-25, + 67, + 29, +-27, + 67, + 28, +-27, + 67, + 30, +-26, + 67, + 29, +-27, + 66, + 28, +-27, + 67, + 28, +-27, + 64, + 26, +-27, + 65, + 27, +-26, + 64, + 26, +-24, + 63, + 25, +-25, + 64, + 25, +-24, + 63, + 25, +-24, + 64, + 26, +-24, + 65, + 26, +-23, + 65, + 27, +-23, + 64, + 26, +-22, + 63, + 25, +-24, + 63, + 25, +-23, + 61, + 23, +-25, + 58, + 19, +-26, + 52, + 14, +-29, + 44, + 10, +-32, + 43, + 10, +-31, + 43, + 10, +-33, + 43, + 10, +-34, + 45, + 12, +-32, + 44, + 11, +-33, + 39, + 4, +-40, + 36, + 1, +-43, + 41, + 6, +-40, + 49, + 14, +-35, + 55, + 21, +-28, + 58, + 24, +-25, + 60, + 26, +-24, + 61, + 27, +-23, + 63, + 28, +-21, + 64, + 29, +-20, + 65, + 30, +-19, + 65, + 31, +-19, + 66, + 31, +-20, + 66, + 32, +-19, + 67, + 33, +-17, + 69, + 34, +-12, + 70, + 36, +-10, + 68, + 37, +-11, + 68, + 35, +-11, + 68, + 35, +-12, + 66, + 33, +-14, + 64, + 32, +-15, + 62, + 27, +-18, + 58, + 23, +-23, + 56, + 20, +-25, + 51, + 16, +-29, + 46, + 11, +-33, + 43, + 8, +-35, + 47, + 13, +-31, + 54, + 20, +-24, + 53, + 18, +-28, + 49, + 14, +-34, + 47, + 10, +-36, + 45, + 6, +-41, + 51, + 12, +-37, + 56, + 18, +-34, + 59, + 22, +-34, + 63, + 25, +-31, + 65, + 27, +-29, + 65, + 27, +-29, + 66, + 26, +-29, + 66, + 25, +-31, + 65, + 23, +-32, + 64, + 22, +-33, + 63, + 21, +-35, + 61, + 19, +-36, + 59, + 17, +-40, + 58, + 17, +-41, + 57, + 15, +-43, + 58, + 16, +-40, + 59, + 18, +-39, + 60, + 19, +-38, + 60, + 19, +-36, + 60, + 19, +-37, + 61, + 21, +-38, + 85, + 49, +-18, + 83, + 47, +-20, + 81, + 45, +-22, + 79, + 43, +-24, + 79, + 40, +-27, + 75, + 35, +-35, + 70, + 30, +-42, + 68, + 23, +-49, + 63, + 17, +-56, + 59, + 11, +-61, + 57, + 12, +-53, + 54, + 13, +-51, + 63, + 23, +-38, + 60, + 21, +-38, + 53, + 14, +-45, + 64, + 23, +-35, + 60, + 20, +-39, + 51, + 12, +-43, + 59, + 20, +-40, + 59, + 20, +-34, + 50, + 12, +-46, + 57, + 19, +-39, + 52, + 14, +-39, + 56, + 18, +-34, + 56, + 20, +-33, + 50, + 13, +-37, + 53, + 18, +-32, + 58, + 21, +-31, + 46, + 9, +-39, + 54, + 18, +-32, + 52, + 16, +-36, + 40, + 6, +-43, + 48, + 12, +-38, + 46, + 10, +-37, + 30, + -7, +-51, + 7, +-18, +-55, + 29, + -5, +-49, + 27, + -6, +-50, + 28, + -4, +-52, + 24, + -8, +-56, + 31, + -2, +-50, + 22, + -9, +-58, + 16, +-16, +-61, + 31, + -2, +-49, + 32, + -1, +-49, + 28, + -7, +-52, + 41, + 7, +-44, + 45, + 9, +-42, + 38, + 3, +-46, + 47, + 12, +-40, + 46, + 11, +-39, + 44, + 8, +-41, + 48, + 14, +-38, + 42, + 10, +-43, + 52, + 19, +-33, + 50, + 16, +-35, + 45, + 11, +-39, + 56, + 22, +-27, + 57, + 23, +-26, + 47, + 13, +-34, + 54, + 21, +-28, + 54, + 20, +-29, + 45, + 10, +-38, + 50, + 14, +-34, + 41, + 6, +-43, + 46, + 10, +-38, + 44, + 8, +-41, + 34, + -1, +-50, + 36, + 2, +-43, + 40, + 5, +-45, + 35, + 0, +-49, + 43, + 5, +-47, + 42, + 4, +-49, + 33, + -5, +-56, + 40, + -1, +-54, + 12, +-20, +-60, + 36, + 0, +-51, + 50, + 10, +-46, + 52, + 12, +-46, + 51, + 10, +-50, + 57, + 15, +-45, + 52, + 11, +-50, + 57, + 16, +-46, + 58, + 15, +-48, + 48, + 6, +-54, + 57, + 14, +-50, + 56, + 13, +-50, + 46, + 3, +-59, + 49, + 6, +-58, + 46, + 3, +-61, + 43, + -1, +-62, + 47, + 3, +-59, + 44, + 2, +-60, + 47, + 6, +-56, + 50, + 9, +-55, + 45, + 5, +-59, + 87, + 51, +-16, + 85, + 49, +-18, + 84, + 48, +-19, + 82, + 46, +-21, + 80, + 41, +-26, + 77, + 38, +-33, + 72, + 31, +-41, + 68, + 24, +-49, + 66, + 19, +-54, + 63, + 15, +-60, + 64, + 16, +-65, + 65, + 17, +-63, + 67, + 19, +-61, + 66, + 19, +-60, + 66, + 19, +-58, + 66, + 19, +-56, + 65, + 18, +-57, + 65, + 18, +-56, + 65, + 18, +-56, + 64, + 18, +-56, + 63, + 18, +-56, + 63, + 18, +-56, + 63, + 18, +-56, + 62, + 18, +-55, + 61, + 18, +-55, + 60, + 19, +-55, + 60, + 18, +-55, + 60, + 19, +-53, + 59, + 17, +-52, + 58, + 16, +-54, + 57, + 15, +-52, + 55, + 13, +-53, + 52, + 11, +-56, + 41, + 0, +-64, +-18, +-46, +-81, +-27, +-50, +-84, +-20, +-46, +-85, +-33, +-54, +-86, +-28, +-48, +-82, +-10, +-39, +-82, +-24, +-46, +-87, +-23, +-50, +-93, +-52, +-67, +-86, +-26, +-49, +-80, + -8, +-33, +-68, + -6, +-31, +-64, + 7, +-18, +-55, + 10, +-13, +-47, + 12, +-12, +-48, + 10, +-13, +-46, + 10, +-12, +-46, + 11, +-11, +-44, + 11, +-10, +-45, + 13, + -6, +-41, + 13, + -8, +-40, + 12, + -7, +-39, + 13, + -5, +-38, + 15, + -4, +-36, + 13, + -5, +-37, + 13, + -6, +-36, + 11, + -8, +-38, + 11, + -9, +-36, + 8, +-12, +-41, + 5, +-13, +-42, + 6, +-14, +-44, + -3, +-30, +-67, +-23, +-54, +-89, + 1, +-46, +-97, +-42, +-67, +-91, +-11, +-45, +-89, +-26, +-55, +-96, +-13, +-43, +-87, +-37, +-62, +-97, +-26, +-52, +-90, +-28, +-53, +-88, +-13, +-39, +-85, +-27, +-53, +-90, + 51, + 7, +-60, + 57, + 12, +-61, + 61, + 14, +-59, + 63, + 16, +-59, + 63, + 16, +-59, + 62, + 14, +-60, + 61, + 14, +-61, + 60, + 13, +-62, + 59, + 11, +-64, + 58, + 9, +-65, + 56, + 7, +-68, + 55, + 6, +-69, + 53, + 5, +-70, + 53, + 5, +-70, + 53, + 5, +-70, + 54, + 7, +-68, + 55, + 8, +-68, + 55, + 8, +-68, + 56, + 9, +-69, + 87, + 55, + 3, + 85, + 50, +-17, + 86, + 50, +-17, + 84, + 48, +-19, + 82, + 45, +-22, + 80, + 40, +-30, + 74, + 33, +-39, + 70, + 27, +-48, + 68, + 21, +-54, + 65, + 17, +-59, + 66, + 18, +-63, + 67, + 19, +-63, + 70, + 22, +-59, + 70, + 23, +-58, + 69, + 22, +-58, + 68, + 21, +-55, + 68, + 21, +-54, + 68, + 21, +-54, + 68, + 21, +-53, + 67, + 20, +-54, + 66, + 20, +-54, + 66, + 21, +-53, + 66, + 21, +-53, + 65, + 21, +-53, + 64, + 22, +-53, + 63, + 23, +-52, + 63, + 22, +-50, + 63, + 22, +-51, + 62, + 21, +-51, + 62, + 21, +-52, + 60, + 19, +-48, + 58, + 16, +-50, + 55, + 13, +-52, + 50, + 9, +-57, + 39, + -3, +-68, + -1, +-36, +-85, + 19, +-28, +-92, + 16, +-30, +-84, + 8, +-39, +-87, + 5, +-44, +-103, + 32, +-13, +-63, + 14, +-33, +-82, + 40, + -1, +-45, + 22, +-24, +-73, + 33, +-17, +-72, + 50, + 4, +-48, + 80, + 56, + 6, + 87, + 68, + 24, + 88, + 73, + 32, + 87, + 71, + 31, + 89, + 72, + 29, + 89, + 74, + 33, + 89, + 77, + 39, + 91, + 77, + 43, + 89, + 78, + 43, + 91, + 79, + 46, + 97, + 85, + 53, + 95, + 85, + 49, + 98, + 86, + 51, + 97, + 85, + 51, + 95, + 81, + 49, + 97, + 84, + 50, + 97, + 83, + 47, + 95, + 84, + 49, + 95, + 78, + 38, + 56, + 12, +-47, + 55, + 12, +-37, + 33, +-10, +-49, + 31, +-20, +-73, + 40, + -9, +-63, + 9, +-43, +-104, + 6, +-44, +-110, + 18, +-42, +-109, + 35, +-17, +-75, + 24, +-18, +-74, + 21, +-18, +-78, + 44, + 2, +-62, + 55, + 10, +-59, + 59, + 14, +-59, + 63, + 17, +-57, + 64, + 18, +-56, + 66, + 19, +-56, + 65, + 18, +-57, + 64, + 17, +-58, + 64, + 15, +-59, + 62, + 14, +-60, + 61, + 13, +-62, + 59, + 12, +-63, + 60, + 11, +-65, + 58, + 11, +-64, + 58, + 11, +-64, + 58, + 11, +-64, + 58, + 11, +-64, + 59, + 12, +-63, + 57, + 10, +-66, + 57, + 10, +-70, + 91, + 76, + 51, + 88, + 68, + 41, + 85, + 56, + 12, + 84, + 48, +-14, + 84, + 45, +-23, + 82, + 42, +-29, + 77, + 36, +-38, + 75, + 29, +-45, + 70, + 24, +-51, + 67, + 19, +-57, + 68, + 19, +-62, + 69, + 21, +-61, + 72, + 24, +-58, + 71, + 24, +-57, + 70, + 23, +-57, + 69, + 23, +-55, + 69, + 22, +-53, + 68, + 23, +-52, + 68, + 22, +-52, + 67, + 22, +-52, + 68, + 23, +-51, + 68, + 23, +-51, + 68, + 23, +-51, + 66, + 24, +-49, + 65, + 24, +-49, + 66, + 25, +-47, + 66, + 25, +-47, + 65, + 24, +-48, + 65, + 24, +-47, + 64, + 22, +-48, + 62, + 21, +-48, + 60, + 19, +-47, + 57, + 16, +-50, + 53, + 13, +-54, + 44, + 4, +-61, + 20, +-25, +-89, + 37, +-10, +-58, + 43, + -6, +-55, + 20, +-28, +-72, + 15, +-36, +-93, + 32, +-20, +-75, + 33, +-18, +-67, + 40, +-10, +-60, + 21, +-29, +-83, + 56, + 4, +-59, + 41, + -9, +-70, + 84, + 58, + 5, +100, + 87, + 42, + 98, + 91, + 48, + 99, + 91, + 50, +100, + 90, + 48, +100, + 93, + 57, +101, + 94, + 59, + 99, + 92, + 59, +101, + 92, + 59, +101, + 94, + 63, +105, + 98, + 68, +104, + 98, + 64, +105, + 99, + 67, +107, +100, + 67, +105, + 99, + 66, +106, + 99, + 66, +107, +100, + 66, +107, +100, + 67, +103, + 89, + 45, + 59, + 0, +-85, + 37, + -5, +-41, + 43, + -3, +-44, + 17, +-33, +-80, + 44, + -5, +-60, + 22, +-28, +-82, + 19, +-32, +-86, + 18, +-30, +-75, + 57, + 12, +-37, + 16, +-38, +-91, + 22, +-31, +-93, + 51, + 6, +-60, + 58, + 13, +-58, + 62, + 17, +-56, + 64, + 18, +-55, + 64, + 19, +-55, + 66, + 19, +-56, + 67, + 20, +-55, + 66, + 19, +-56, + 65, + 18, +-57, + 63, + 16, +-59, + 62, + 15, +-60, + 63, + 16, +-59, + 63, + 16, +-60, + 63, + 16, +-59, + 62, + 15, +-60, + 61, + 14, +-61, + 61, + 14, +-61, + 61, + 14, +-61, + 59, + 12, +-65, + 59, + 12, +-68, + 89, + 69, + 42, + 91, + 77, + 56, + 92, + 76, + 55, + 89, + 67, + 41, + 85, + 56, + 15, + 81, + 46, +-12, + 78, + 35, +-39, + 76, + 31, +-44, + 72, + 25, +-50, + 68, + 20, +-56, + 69, + 21, +-60, + 72, + 24, +-61, + 73, + 25, +-57, + 72, + 24, +-57, + 72, + 25, +-55, + 70, + 25, +-53, + 69, + 24, +-51, + 69, + 24, +-51, + 69, + 24, +-50, + 69, + 24, +-50, + 69, + 24, +-50, + 68, + 26, +-49, + 67, + 27, +-49, + 69, + 27, +-46, + 69, + 27, +-45, + 68, + 27, +-45, + 68, + 28, +-45, + 67, + 27, +-46, + 66, + 26, +-46, + 66, + 25, +-45, + 64, + 24, +-43, + 63, + 22, +-45, + 60, + 20, +-47, + 55, + 15, +-51, + 50, + 9, +-57, + 36, + -6, +-71, + 28, +-20, +-84, + 27, +-27, +-85, + 30, +-22, +-76, + 17, +-31, +-76, + 41, + -8, +-59, + 49, + 3, +-48, + 26, +-25, +-72, + 29, +-22, +-72, + 31, +-16, +-67, + 52, + -5, +-83, + 97, + 76, + 25, +109, +103, + 65, +108, +104, + 69, +107, +103, + 67, +106, +104, + 70, +107, +104, + 75, +107, +104, + 76, +106, +104, + 76, +107, +103, + 75, +107, +105, + 78, +110, +108, + 84, +109, +107, + 81, +111, +109, + 82, +112, +110, + 84, +112, +110, + 83, +113, +111, + 85, +114, +112, + 84, +116, +114, + 90, +116, +113, + 81, + 66, + 15, +-56, + 51, + 0, +-56, + 47, + 0, +-42, + 23, +-23, +-72, + 50, + 4, +-53, + 15, +-37, +-84, + 42, + -2, +-46, + 28, +-10, +-44, + 48, + 5, +-34, + 11, +-41, +-91, + 38, +-13, +-79, + 52, + 6, +-60, + 59, + 14, +-58, + 64, + 19, +-55, + 65, + 20, +-54, + 67, + 21, +-53, + 69, + 22, +-53, + 69, + 22, +-53, + 68, + 21, +-54, + 66, + 19, +-56, + 65, + 18, +-57, + 65, + 18, +-57, + 66, + 19, +-57, + 67, + 20, +-57, + 67, + 20, +-55, + 65, + 18, +-57, + 63, + 16, +-60, + 62, + 15, +-61, + 62, + 15, +-60, + 60, + 13, +-64, + 61, + 13, +-67, + 64, + 44, + 18, + 62, + 47, + 27, + 86, + 68, + 43, + 91, + 68, + 42, + 90, + 64, + 33, + 87, + 61, + 24, + 85, + 53, + 10, + 79, + 40, +-20, + 70, + 25, +-46, + 69, + 22, +-55, + 71, + 23, +-59, + 74, + 27, +-59, + 75, + 27, +-56, + 74, + 27, +-54, + 73, + 26, +-53, + 71, + 26, +-53, + 70, + 25, +-50, + 71, + 26, +-49, + 71, + 26, +-48, + 70, + 25, +-49, + 71, + 26, +-48, + 70, + 28, +-47, + 70, + 30, +-46, + 70, + 30, +-45, + 70, + 30, +-43, + 70, + 29, +-43, + 70, + 30, +-42, + 69, + 30, +-43, + 68, + 29, +-44, + 68, + 28, +-42, + 66, + 26, +-41, + 65, + 25, +-42, + 61, + 21, +-46, + 58, + 18, +-49, + 53, + 12, +-54, + 47, + 6, +-60, + 32, +-12, +-79, + 18, +-35, +-95, + 0, +-54, +-105, + 1, +-47, +-90, + 13, +-38, +-87, + -2, +-49, +-92, + 31, +-13, +-57, + 19, +-25, +-71, + 26, +-18, +-62, + 71, + 41, + -4, +112, +106, + 72, +112, +108, + 81, +111, +108, + 85, +108, +106, + 80, +107, +105, + 79, +108, +107, + 86, +108, +107, + 87, +106, +104, + 84, +104, +104, + 82, +108, +108, + 89, +110, +109, + 91, +109, +109, + 90, +112, +111, + 93, +112, +112, + 93, +112, +111, + 92, +113, +112, + 93, +114, +114, + 96, +117, +116, +100, +118, +117, +100, +103, + 90, + 59, + 45, + -3, +-50, + 33, +-17, +-68, + 38, + -7, +-55, + 41, + -7, +-59, + 38, + -6, +-47, + 33, +-17, +-66, + 37, +-13, +-65, + 56, + 11, +-36, + 35, +-17, +-79, + 45, + -2, +-67, + 54, + 9, +-60, + 61, + 16, +-57, + 64, + 19, +-55, + 67, + 22, +-52, + 68, + 23, +-52, + 69, + 23, +-52, + 68, + 23, +-52, + 70, + 23, +-52, + 68, + 21, +-54, + 67, + 20, +-55, + 66, + 19, +-57, + 65, + 18, +-61, + 67, + 20, +-57, + 68, + 21, +-54, + 66, + 19, +-56, + 65, + 18, +-61, + 64, + 17, +-62, + 62, + 15, +-63, + 62, + 15, +-64, + 62, + 15, +-65, + 36, + 17, + -7, +-29, +-43, +-64, +-12, +-25, +-45, + 32, + 15, + -6, + 66, + 44, + 18, + 88, + 61, + 27, + 87, + 56, + 16, + 85, + 51, + 4, + 83, + 45, + -7, + 74, + 32, +-31, + 73, + 25, +-57, + 75, + 28, +-58, + 77, + 30, +-55, + 75, + 28, +-51, + 73, + 28, +-51, + 73, + 28, +-50, + 73, + 28, +-47, + 73, + 28, +-47, + 73, + 28, +-46, + 72, + 28, +-46, + 70, + 30, +-46, + 70, + 30, +-46, + 71, + 31, +-45, + 71, + 30, +-43, + 71, + 30, +-42, + 70, + 31, +-42, + 70, + 31, +-42, + 71, + 32, +-41, + 70, + 30, +-41, + 69, + 29, +-39, + 68, + 28, +-39, + 66, + 26, +-41, + 64, + 24, +-43, + 60, + 20, +-47, + 56, + 16, +-51, + 51, + 11, +-56, + 38, + -6, +-71, + 27, +-30, +-102, + 4, +-53, +-116, + 18, +-29, +-75, + 32, +-20, +-74, + 4, +-53, +-117, + 8, +-48, +-117, + 40, +-10, +-66, + 24, +-28, +-90, + 81, + 56, + 14, +112, +109, + 87, +111, +109, + 93, +110, +110, + 97, +107, +107, + 92, +106, +105, + 93, +106, +107, + 93, +109, +108, + 97, +108, +108, + 99, +107, +107, + 98, +108, +108, + 99, +110, +110, +101, +111, +111, +101, +113, +113, +105, +113, +113, +105, +112, +113, +101, +114, +113, +103, +115, +115, +108, +118, +118, +111, +118, +118, +111, +119, +118, +107, + 74, + 36, + -5, + 46, +-10, +-76, + 32, +-22, +-75, + 12, +-43, +-99, +-18, +-66, +-108, + 12, +-45, +-99, + 50, + -1, +-61, + 27, +-25, +-77, + 27, +-25, +-85, + 48, + 3, +-64, + 57, + 12, +-59, + 63, + 18, +-55, + 66, + 21, +-53, + 68, + 23, +-51, + 69, + 24, +-51, + 69, + 24, +-51, + 70, + 24, +-51, + 70, + 23, +-52, + 69, + 22, +-53, + 66, + 19, +-56, + 65, + 18, +-60, + 65, + 18, +-62, + 67, + 19, +-60, + 67, + 19, +-58, + 67, + 20, +-57, + 66, + 19, +-59, + 64, + 17, +-60, + 63, + 16, +-64, + 63, + 16, +-64, + 62, + 15, +-65, + 30, + 13, +-12, +-94, +-94, +-111, +-81, +-83, +-100, +-59, +-67, +-90, +-45, +-56, +-80, + -4, +-22, +-48, + 48, + 20, +-14, + 69, + 38, + -5, + 83, + 45, + -6, + 81, + 41, +-17, + 75, + 27, +-56, + 78, + 31, +-55, + 78, + 31, +-53, + 76, + 30, +-51, + 76, + 30, +-50, + 74, + 29, +-47, + 73, + 28, +-47, + 74, + 29, +-45, + 72, + 29, +-45, + 71, + 31, +-45, + 70, + 30, +-46, + 68, + 28, +-46, + 68, + 28, +-47, + 67, + 26, +-44, + 66, + 26, +-44, + 67, + 27, +-44, + 69, + 29, +-43, + 70, + 31, +-40, + 71, + 31, +-39, + 71, + 31, +-37, + 69, + 29, +-37, + 67, + 27, +-40, + 65, + 25, +-42, + 63, + 23, +-44, + 59, + 19, +-48, + 54, + 14, +-53, + 40, + -4, +-69, + 36, +-27, +-102, + -5, +-63, +-121, + 26, +-27, +-78, + 29, +-25, +-87, + 19, +-42, +-123, + 5, +-53, +-128, + 48, + -4, +-67, + 12, +-44, +-123, + 83, + 59, + 18, +112, +109, + 93, +109, +109, + 97, +109, +108, +101, +106, +106, + 97, +105, +105, + 97, +106, +107, + 97, +108, +109, +102, +108, +109, +103, +107, +107, +101, +107, +108, +102, +110, +110, +105, +111, +111, +108, +112, +112, +109, +112, +113, +107, +113, +114, +108, +115, +115, +112, +114, +115, +111, +117, +118, +115, +117, +117, +113, +117, +118, +111, + 71, + 32, + -4, + 38, +-21, +-90, + 37, +-20, +-85, + 23, +-41, +-109, + 10, +-41, +-89, + 14, +-46, +-103, + 55, + 8, +-52, + 45, +-16, +-89, + 26, +-34, +-111, + 52, + 6, +-62, + 60, + 15, +-57, + 64, + 19, +-53, + 68, + 23, +-51, + 69, + 24, +-50, + 70, + 25, +-50, + 70, + 25, +-50, + 69, + 24, +-50, + 69, + 22, +-53, + 64, + 17, +-57, + 60, + 14, +-60, + 58, + 11, +-63, + 58, + 11, +-63, + 60, + 13, +-61, + 63, + 15, +-59, + 64, + 16, +-62, + 62, + 14, +-63, + 61, + 14, +-65, + 62, + 15, +-65, + 62, + 15, +-65, + 62, + 15, +-65, + 31, + 15, + -9, +-80, +-79, +-96, +-85, +-82, +-93, +-90, +-88, +-104, +-74, +-77, +-96, +-26, +-37, +-56, + 22, + 3, +-19, + 28, + 7, +-18, + 58, + 33, + 4, + 86, + 44, + -7, + 78, + 28, +-55, + 79, + 32, +-54, + 80, + 34, +-50, + 79, + 33, +-48, + 77, + 32, +-47, + 76, + 32, +-45, + 75, + 30, +-45, + 72, + 30, +-45, + 71, + 30, +-46, + 69, + 29, +-46, + 65, + 24, +-47, + 60, + 18, +-50, + 46, + 3, +-60, + 25, +-18, +-72, + 17, +-28, +-79, + 20, +-21, +-73, + 38, + -1, +-61, + 61, + 20, +-47, + 67, + 27, +-44, + 70, + 30, +-38, + 71, + 31, +-36, + 69, + 29, +-38, + 67, + 27, +-40, + 64, + 24, +-43, + 61, + 21, +-46, + 57, + 16, +-51, + 41, + -3, +-69, + 37, +-23, +-94, + 4, +-54, +-107, + 25, +-24, +-70, + 19, +-35, +-90, + 31, +-27, +-95, + 6, +-52, +-118, + 43, + -2, +-51, + 21, +-33, +-98, + 90, + 70, + 34, +111, +111, + 96, +108, +108, +100, +107, +107, +101, +107, +107, +102, +106, +107, +102, +107, +108, +102, +109, +109, +105, +108, +109, +105, +108, +108, +104, +109, +110, +106, +111, +111, +108, +111, +111, +108, +113, +114, +111, +114, +114, +111, +113, +113, +110, +114, +114, +112, +115, +116, +113, +117, +117, +114, +116, +116, +113, +117, +118, +115, + 64, + 19, +-29, + 18, +-36, +-94, + 44, + -9, +-60, + 27, +-31, +-93, + 14, +-39, +-86, + 24, +-30, +-93, + 54, + 16, +-23, + 54, + 2, +-51, + 23, +-37, +-114, + 55, + 8, +-62, + 63, + 18, +-56, + 66, + 21, +-53, + 69, + 24, +-50, + 70, + 25, +-49, + 70, + 25, +-50, + 69, + 24, +-51, + 64, + 19, +-55, + 53, + 10, +-62, + 39, + -8, +-76, + 21, +-28, +-87, + 7, +-40, +-86, + 13, +-34, +-86, + 31, +-17, +-80, + 49, + 2, +-71, + 54, + 5, +-70, + 56, + 7, +-69, + 55, + 7, +-71, + 56, + 8, +-72, + 57, + 9, +-70, + 61, + 14, +-67, + 33, + 17, + -6, +-63, +-69, +-98, +-77, +-76, +-90, +-72, +-76, +-103, +-66, +-70, +-95, +-27, +-35, +-54, + 22, + 5, +-14, + 30, + 12, +-11, + 58, + 37, + 9, + 87, + 47, + -5, + 79, + 31, +-53, + 81, + 35, +-52, + 81, + 35, +-48, + 80, + 34, +-47, + 78, + 34, +-46, + 78, + 33, +-44, + 76, + 32, +-43, + 74, + 29, +-45, + 66, + 25, +-48, + 60, + 19, +-52, + 43, + 0, +-63, + -4, +-50, +-97, +-27, +-70, +-90, + 6, +-10, +-19, + 11, + 1, +-13, + 6, + -2, +-13, + -9, +-28, +-39, +-12, +-55, +-98, + 39, + -2, +-61, + 62, + 20, +-46, + 68, + 27, +-39, + 69, + 29, +-38, + 69, + 29, +-38, + 66, + 26, +-41, + 62, + 22, +-45, + 58, + 18, +-49, + 42, + -2, +-66, + 35, +-23, +-92, + 18, +-37, +-84, + 27, +-17, +-58, + 7, +-50, +-109, + 35, +-21, +-81, + 11, +-43, +-105, + 51, + 8, +-37, + 23, +-26, +-81, + 91, + 72, + 40, +109, +109, + 98, +107, +107, +101, +107, +108, +103, +106, +107, +102, +108, +109, +106, +108, +109, +105, +108, +109, +105, +109, +109, +106, +109, +109, +107, +110, +110, +109, +112, +112, +109, +111, +111, +109, +112, +112, +110, +112, +112, +111, +112, +113, +110, +115, +115, +113, +115, +115, +113, +116, +116, +114, +116, +117, +114, +118, +118, +116, + 57, + 9, +-51, + 12, +-42, +-98, + 39, +-12, +-66, + 39, +-16, +-76, + 24, +-27, +-73, + 30, +-19, +-79, + 52, + 13, +-25, + 58, + 11, +-34, + 19, +-43, +-122, + 56, + 10, +-62, + 63, + 19, +-55, + 67, + 23, +-51, + 70, + 25, +-49, + 70, + 25, +-49, + 67, + 21, +-52, + 60, + 14, +-57, + 37, + -8, +-73, + 12, +-46, +-104, + 19, +-30, +-72, + 21, + -2, +-10, + 35, + 13, +-19, + 45, + 10, +-37, + 2, +-40, +-74, + -9, +-63, +-110, + 26, +-22, +-86, + 45, + -3, +-76, + 51, + 2, +-73, + 54, + 6, +-72, + 53, + 5, +-74, + 55, + 7, +-73, + 32, + 16, + -6, +-60, +-66, +-94, +-59, +-63, +-90, +-68, +-73, +-101, +-65, +-69, +-92, +-25, +-33, +-51, + 25, + 9, +-10, + 33, + 15, + -6, + 60, + 40, + 12, + 87, + 48, + -4, + 80, + 33, +-52, + 82, + 36, +-50, + 83, + 37, +-45, + 80, + 36, +-45, + 79, + 35, +-44, + 77, + 32, +-43, + 72, + 30, +-45, + 65, + 24, +-49, + 43, + -1, +-66, + -2, +-44, +-90, +-19, +-74, +-114, + -5, +-42, +-67, + 77, + 68, + 34, + 91, + 84, + 38, + 96, + 89, + 40, +101, + 94, + 50, + 80, + 75, + 41, + 34, + 28, + 16, +-11, +-42, +-61, + 1, +-40, +-87, + 42, + -2, +-61, + 64, + 23, +-43, + 67, + 27, +-40, + 66, + 26, +-41, + 63, + 23, +-44, + 58, + 18, +-49, + 43, + -3, +-64, + 31, +-25, +-92, + 30, +-26, +-80, + 20, +-32, +-81, + 12, +-49, +-116, + 32, +-24, +-92, + 19, +-37, +-105, + 60, + 11, +-43, + 23, +-27, +-84, + 88, + 66, + 31, +109, +109, + 99, +107, +107, +103, +106, +107, +104, +106, +106, +104, +106, +107, +104, +108, +108, +106, +109, +109, +107, +109, +109, +108, +108, +109, +107, +109, +109, +109, +112, +112, +111, +112, +112, +111, +113, +113, +112, +112, +112, +111, +111, +111, +110, +114, +114, +113, +114, +114, +113, +115, +115, +115, +116, +116, +115, +119, +118, +116, + 55, + 4, +-64, + 19, +-37, +-103, + 36, +-20, +-89, + 34, +-25, +-92, + 33, +-20, +-80, + 32, +-22, +-85, + 51, + 2, +-48, + 58, + 4, +-57, + 17, +-48, +-127, + 55, + 9, +-64, + 63, + 19, +-54, + 67, + 23, +-51, + 68, + 24, +-49, + 62, + 19, +-52, + 41, + -4, +-69, + 14, +-38, +-97, + 20, +-39, +-94, + 32, + -8, +-72, + 18, + 1, +-31, + 57, + 24, +-67, + 44, + 34, +-14, + 85, + 39, +-36, + 83, + 47, +-13, + 54, + 14, +-51, +-17, +-64, +-105, +-11, +-61, +-107, + 20, +-29, +-93, + 48, + -1, +-75, + 53, + 4, +-73, + 54, + 6, +-75, + 31, + 17, + -4, +-63, +-70, +-97, +-62, +-65, +-90, +-62, +-68, +-95, +-73, +-74, +-90, +-23, +-30, +-45, + 26, + 11, + -7, + 33, + 16, + -3, + 60, + 42, + 16, + 86, + 49, + -3, + 81, + 33, +-51, + 83, + 37, +-47, + 82, + 38, +-44, + 82, + 38, +-42, + 78, + 36, +-41, + 75, + 32, +-44, + 71, + 26, +-47, + 47, + 3, +-69, +-21, +-71, +-115, + 35, + 19, +-11, + 74, + 63, + 20, + 85, + 73, + 28, + 93, + 81, + 33, + 92, + 83, + 37, + 95, + 88, + 43, +100, + 92, + 48, +107, + 99, + 55, +108, +101, + 58, + 94, + 87, + 49, + 69, + 58, + 22, + 8, +-33, +-71, + 29, +-13, +-68, + 65, + 24, +-43, + 67, + 27, +-40, + 63, + 23, +-44, + 59, + 19, +-48, + 42, + -6, +-72, + 29, +-33, +-111, + 24, +-40, +-109, + 27, +-30, +-103, + 13, +-50, +-124, + 31, +-29, +-110, + 24, +-40, +-118, + 60, + 11, +-55, + 21, +-33, +-108, + 89, + 64, + 27, +108, +108, + 98, +106, +106, +101, +107, +107, +104, +106, +106, +104, +108, +108, +106, +109, +109, +107, +110, +111, +109, +111, +111, +110, +110, +111, +109, +112, +112, +112, +114, +114, +113, +113, +113, +112, +114, +114, +112, +113, +113, +112, +112, +112, +111, +115, +115, +114, +114, +114, +113, +117, +117, +116, +117, +117, +116, +118, +117, +116, + 59, + 9, +-74, + 34, +-23, +-99, + 37, +-20, +-95, + 29, +-36, +-115, + 36, +-21, +-94, + 28, +-31, +-108, + 53, + -1, +-63, + 55, + -5, +-84, + 19, +-50, +-128, + 57, + 7, +-65, + 64, + 19, +-54, + 68, + 24, +-51, + 65, + 22, +-50, + 35, +-10, +-73, + 17, +-43, +-109, + 28, + -9, +-52, + 38, + 17, +-33, + 28, + 6, +-45, + 28, + 17, +-19, + 68, + 34, +-61, + 53, + 36, +-14, + 81, + 46, + -8, + 87, + 41, +-51, + 76, + 57, + 16, + 94, + 90, + 78, + 67, + 61, + 54, +-21, +-73, +-107, + 25, +-23, +-92, + 50, + 2, +-75, + 53, + 5, +-76, + 31, + 16, + -2, +-61, +-73, +-104, +-57, +-64, +-91, +-63, +-69, +-93, +-66, +-70, +-91, +-20, +-28, +-43, + 28, + 14, + -4, + 36, + 19, + 0, + 62, + 44, + 19, + 86, + 48, + -2, + 81, + 34, +-48, + 84, + 39, +-45, + 83, + 39, +-42, + 82, + 39, +-41, + 78, + 37, +-40, + 76, + 32, +-43, + 69, + 25, +-48, + 45, + -6, +-82, + 15, +-16, +-43, + 88, + 74, + 26, + 90, + 78, + 30, + 92, + 80, + 32, + 74, + 58, + 8, + 47, + 27, +-18, + 70, + 59, + 17, + 93, + 86, + 43, +107, +100, + 57, +110, +102, + 58, +110, +102, + 58, +109, +101, + 57, + 74, + 56, + 14, + 9, +-38, +-84, + 62, + 21, +-46, + 67, + 27, +-40, + 64, + 24, +-43, + 59, + 19, +-48, + 40, + -7, +-73, + 34, +-28, +-108, + 19, +-45, +-118, + 33, +-22, +-90, + 12, +-49, +-120, + 38, +-20, +-98, + 26, +-36, +-112, + 64, + 19, +-34, + 23, +-32, +-105, + 91, + 66, + 31, +108, +108, + 96, +106, +106, +100, +105, +106, +102, +108, +109, +106, +108, +108, +105, +111, +111, +108, +112, +112, +109, +112, +112, +110, +112, +113, +111, +114, +115, +114, +116, +116, +116, +115, +115, +114, +115, +115, +114, +112, +112, +111, +110, +110, +109, +112, +112, +111, +113, +113, +112, +117, +117, +116, +117, +117, +115, +118, +118, +114, + 55, + 6, +-68, + 38, +-15, +-85, + 40, +-16, +-78, + 31, +-32, +-96, + 34, +-20, +-91, + 30, +-28, +-100, + 58, + 4, +-53, + 55, + -5, +-80, + 21, +-45, +-123, + 53, + 4, +-69, + 64, + 19, +-54, + 69, + 24, +-50, + 66, + 21, +-51, + 26, +-27, +-93, + 43, + 12, +-23, + 77, + 53, +-19, + 43, + 10, +-51, + 48, + 26, +-27, + 41, + 40, + 12, + 67, + 32, +-56, + 42, + 21, +-17, + 83, + 52, + 9, + 97, + 52, +-39, + 78, + 63, + 26, +108, +109, +104, + 67, + 40, + 10, + 44, + 12, +-29, + 35, +-16, +-104, + 48, + -1, +-78, + 53, + 5, +-75, + 34, + 19, + 1, +-64, +-77, +-107, +-78, +-77, +-85, +-66, +-69, +-91, +-63, +-68, +-94, +-17, +-25, +-43, + 29, + 16, + -2, + 36, + 21, + 3, + 62, + 46, + 21, + 87, + 49, + 0, + 82, + 35, +-47, + 84, + 39, +-44, + 84, + 40, +-41, + 81, + 40, +-39, + 78, + 38, +-39, + 74, + 33, +-43, + 68, + 25, +-48, + 43, + -9, +-81, + 24, +-13, +-51, + 82, + 67, + 22, + 90, + 78, + 31, + 89, + 80, + 35, + 55, + 41, + -8, + -7, +-35, +-72, + 17, +-13, +-60, + 21, + -9, +-59, + 56, + 39, + 3, +110, +102, + 59, +110, +102, + 58, +110, +101, + 56, + 56, + 22, +-26, + 15, +-32, +-85, + 64, + 22, +-44, + 67, + 27, +-40, + 64, + 24, +-43, + 59, + 19, +-48, + 41, + -2, +-59, + 33, +-22, +-83, + 19, +-38, +-101, + 37, +-15, +-67, + 14, +-43, +-107, + 47, + -6, +-76, + 29, +-27, +-91, + 75, + 35, + -8, + 30, +-20, +-84, + 92, + 73, + 45, +109, +109, + 99, +107, +107, +102, +109, +109, +106, +110, +110, +108, +109, +109, +107, +112, +112, +109, +113, +113, +111, +114, +115, +113, +114, +115, +113, +116, +116, +115, +118, +118, +117, +116, +116, +115, +115, +115, +114, +114, +114, +113, +112, +112, +110, +112, +113, +112, +114, +114, +112, +116, +116, +116, +117, +117, +115, +118, +118, +118, + 47, + 6, +-48, + 38, +-11, +-74, + 39, + -8, +-58, + 33, +-21, +-74, + 29, +-23, +-78, + 38, +-16, +-80, + 61, + 14, +-34, + 53, + -2, +-64, + 27, +-34, +-101, + 50, + 1, +-69, + 64, + 19, +-54, + 69, + 24, +-50, + 66, + 21, +-49, + 24, +-28, +-93, + 33, + 10, +-14, + 90, + 61, +-12, + 35, + 5, +-53, + 40, + 15, +-43, + 17, + 20, + -2, + 54, + 24, +-60, + 53, + 28, +-23, + 84, + 42, +-28, + 91, + 44, +-82, + 81, + 65, + 26, +108, +109, +105, + 58, + 25, +-16, + 56, + 22, +-15, + 40, +-17, +-102, + 47, + -2, +-76, + 53, + 5, +-74, + 35, + 19, + 0, +-69, +-80, +-106, +-77, +-75, +-84, +-75, +-74, +-90, +-61, +-66, +-91, +-15, +-23, +-40, + 31, + 18, + 0, + 36, + 23, + 5, + 64, + 47, + 22, + 87, + 51, + 2, + 83, + 36, +-46, + 84, + 39, +-44, + 84, + 40, +-40, + 80, + 40, +-38, + 79, + 39, +-38, + 74, + 34, +-42, + 69, + 26, +-47, + 49, + 2, +-76, + 23, +-12, +-54, + 79, + 68, + 27, + 90, + 81, + 37, + 90, + 82, + 38, + 53, + 39, + -6, + 0, +-22, +-64, + 55, + 55, + 45, + 51, + 52, + 38, + 57, + 51, + 27, +110, +102, + 59, +109, +101, + 57, +109, +101, + 56, + 59, + 37, + 5, + 23, +-25, +-82, + 64, + 22, +-44, + 66, + 27, +-41, + 64, + 24, +-43, + 58, + 18, +-49, + 41, + -3, +-58, + 33, +-22, +-83, + 14, +-45, +-108, + 39, +-13, +-66, + 14, +-42, +-107, + 44, + -9, +-78, + 32, +-25, +-90, + 80, + 38, + -9, + 33, +-20, +-89, + 93, + 72, + 43, +110, +110, +102, +108, +108, +103, +110, +110, +107, +109, +109, +107, +109, +110, +107, +111, +112, +108, +113, +113, +110, +115, +115, +114, +115, +115, +113, +116, +116, +115, +118, +118, +117, +116, +116, +116, +115, +115, +114, +113, +113, +112, +111, +111, +110, +112, +112, +111, +112, +113, +111, +115, +115, +114, +118, +118, +117, +119, +119, +119, + 50, + 7, +-47, + 33, +-19, +-83, + 42, + -6, +-58, + 35, +-20, +-73, + 22, +-33, +-84, + 38, +-15, +-84, + 62, + 16, +-27, + 52, + -2, +-70, + 32, +-30, +-97, + 47, + -3, +-71, + 63, + 18, +-54, + 69, + 24, +-50, + 66, + 21, +-51, + 30, +-22, +-90, + 43, + 19, +-11, + 90, + 65, + -8, + 60, + 32, +-30, + 52, + 34, +-22, + 16, + 20, + -9, + 53, + 23, +-50, + 45, + 15, +-50, + 95, + 60, + -5, + 92, + 47, +-56, + 82, + 67, + 30, +109, +110, +105, + 60, + 30, +-11, + 50, + 20, +-15, + 39, +-17, +-103, + 48, + -1, +-76, + 53, + 5, +-74, + 36, + 22, + 4, +-68, +-77, +-105, +-76, +-74, +-80, +-78, +-76, +-84, +-70, +-71, +-87, +-14, +-22, +-38, + 32, + 19, + 2, + 37, + 24, + 7, + 66, + 48, + 24, + 86, + 52, + 3, + 83, + 37, +-44, + 85, + 41, +-42, + 84, + 42, +-38, + 81, + 41, +-36, + 78, + 38, +-37, + 74, + 34, +-41, + 68, + 27, +-45, + 50, + 2, +-76, + 32, + -7, +-53, + 80, + 69, + 26, + 90, + 82, + 38, + 91, + 83, + 39, + 52, + 40, + -5, + 22, + 6, +-21, + 44, + 46, + 46, + 33, + 39, + 21, + 55, + 55, + 40, +109, +101, + 58, +108, +100, + 56, +108, +100, + 54, + 44, + 25, +-20, + 27, +-20, +-80, + 64, + 22, +-44, + 66, + 26, +-41, + 64, + 24, +-43, + 58, + 17, +-49, + 41, + -7, +-69, + 32, +-28, +-106, + 12, +-50, +-125, + 44, +-15, +-86, + 23, +-37, +-111, + 39, +-20, +-97, + 31, +-29, +-105, + 81, + 34, +-33, + 34, +-25, +-106, + 94, + 69, + 30, +109, +109, +101, +109, +109, +104, +110, +110, +107, +111, +111, +109, +110, +111, +109, +112, +113, +110, +114, +115, +113, +116, +116, +115, +115, +115, +114, +117, +117, +116, +118, +118, +116, +117, +117, +116, +117, +117, +116, +115, +115, +114, +113, +113, +112, +113, +113, +112, +114, +114, +113, +116, +116, +115, +118, +118, +117, +119, +119, +119, + 58, + 11, +-59, + 27, +-30, +-109, + 46, + -5, +-72, + 37, +-29, +-104, + 21, +-40, +-112, + 37, +-21, +-103, + 64, + 7, +-61, + 50, +-11, +-97, + 33, +-36, +-121, + 43, + -8, +-75, + 62, + 17, +-55, + 67, + 24, +-50, + 67, + 21, +-50, + 32, +-21, +-89, + 58, + 22, +-20, + 88, + 69, + 10, + 63, + 34, +-33, + 71, + 47, +-17, + 44, + 39, + 3, + 47, + 13, +-59, + 53, + 31, +-16, + 93, + 72, + 32, + 94, + 50, +-33, + 82, + 69, + 36, +110, +110, +104, + 59, + 23, +-23, + 44, + 8, +-40, + 44, +-12, +-93, + 48, + -1, +-76, + 53, + 5, +-74, + 34, + 22, + 5, +-58, +-70, +-102, +-73, +-72, +-78, +-64, +-65, +-82, +-61, +-65, +-88, +-11, +-19, +-35, + 34, + 21, + 4, + 39, + 26, + 9, + 66, + 47, + 26, + 90, + 53, + 5, + 83, + 37, +-44, + 86, + 42, +-40, + 83, + 44, +-36, + 81, + 41, +-35, + 80, + 40, +-35, + 75, + 35, +-40, + 69, + 28, +-44, + 48, + 5, +-73, + 45, + 0, +-54, + 81, + 69, + 28, + 92, + 84, + 40, + 93, + 85, + 41, + 54, + 42, + -3, + 17, + 1, +-20, + 48, + 52, + 30, + 26, + 26, +-25, + 55, + 52, + 35, +108, +100, + 57, +108, +100, + 56, +108, + 99, + 54, + 49, + 29, +-18, + 28, +-20, +-82, + 64, + 22, +-44, + 67, + 27, +-40, + 64, + 24, +-43, + 57, + 16, +-49, + 38, +-10, +-77, + 33, +-29, +-113, + 7, +-56, +-128, + 42, +-17, +-96, + 28, +-32, +-107, + 42, +-17, +-95, + 30, +-29, +-106, + 81, + 35, +-28, + 32, +-30, +-108, + 95, + 69, + 31, +108, +108, +100, +108, +108, +104, +110, +110, +108, +109, +109, +108, +110, +110, +109, +112, +113, +110, +114, +114, +114, +115, +115, +115, +116, +116, +115, +116, +116, +116, +118, +118, +117, +117, +117, +116, +117, +117, +117, +115, +115, +115, +113, +113, +113, +113, +113, +112, +113, +113, +113, +117, +117, +116, +118, +118, +118, +119, +120, +120, + 56, + 12, +-55, + 23, +-34, +-110, + 53, + 5, +-56, + 40, +-24, +-95, + 22, +-41, +-117, + 36, +-24, +-103, + 63, + 8, +-59, + 51, +-12, +-96, + 38, +-30, +-119, + 41, +-10, +-78, + 61, + 16, +-56, + 67, + 24, +-49, + 65, + 22, +-51, + 38, +-16, +-86, + 52, + 6, +-51, + 68, + 46, + -6, + 57, + 27, +-40, + 60, + 38, +-20, + 34, + 19, +-20, + 10, +-26, +-76, + 63, + 32, +-27, +102, + 71, + 18, + 88, + 41, +-66, + 86, + 69, + 38, +106, +103, + 96, + 57, + 13, +-49, + 49, + 9, +-44, + 43, +-13, +-94, + 48, + -1, +-75, + 54, + 6, +-72, + 36, + 23, + 8, +-55, +-70, +-104, +-55, +-60, +-80, +-51, +-58, +-81, +-60, +-64, +-87, +-11, +-19, +-34, + 35, + 21, + 11, + 40, + 26, + 12, + 65, + 49, + 28, + 89, + 54, + 7, + 83, + 37, +-44, + 86, + 42, +-39, + 83, + 44, +-36, + 81, + 41, +-35, + 80, + 40, +-35, + 76, + 36, +-37, + 68, + 27, +-45, + 43, + 4, +-67, + 50, + 5, +-51, + 73, + 64, + 26, + 95, + 87, + 43, + 95, + 87, + 42, + 55, + 44, + 1, + 4, +-17, +-42, + 44, + 48, + 9, + 23, + 23, +-29, + 71, + 70, + 50, +109, +101, + 59, +108, +100, + 56, +107, + 98, + 54, + 53, + 34, + -8, + 27, +-21, +-81, + 65, + 23, +-43, + 67, + 27, +-40, + 63, + 23, +-44, + 55, + 15, +-50, + 39, + -7, +-65, + 35, +-21, +-96, + 8, +-50, +-111, + 44, +-12, +-77, + 30, +-26, +-92, + 46, + -9, +-78, + 29, +-27, +-94, + 82, + 45, + 5, + 32, +-23, +-87, + 92, + 72, + 45, +108, +108, + 98, +107, +107, +103, +110, +110, +109, +111, +111, +111, +111, +111, +110, +111, +111, +110, +114, +114, +114, +115, +115, +115, +115, +115, +115, +116, +116, +116, +117, +117, +116, +116, +116, +116, +116, +116, +116, +115, +115, +115, +113, +113, +113, +112, +112, +112, +114, +114, +114, +117, +117, +117, +118, +118, +118, +120, +119, +120, + 51, + 8, +-41, + 27, +-26, +-93, + 57, + 17, +-28, + 44, +-11, +-65, + 23, +-34, +-102, + 35, +-20, +-90, + 62, + 20, +-19, + 54, + 0, +-71, + 42, +-16, +-74, + 40, +-10, +-79, + 61, + 17, +-56, + 65, + 24, +-48, + 66, + 24, +-50, + 41, +-14, +-86, + 30, +-22, +-76, + 18, + 4, +-26, + 53, + 24, +-45, + 31, + 14, +-33, + 12, + 0, +-29, + -9, +-36, +-66, + 66, + 31, +-45, + 99, + 65, + -8, + 82, + 31, +-95, + 80, + 65, + 30, +102, + 98, + 90, + 58, + 15, +-41, + 45, + -4, +-66, + 52, + 3, +-79, + 49, + 0, +-75, + 54, + 6, +-73, + 37, + 24, + 8, +-49, +-64, +-102, +-51, +-56, +-78, +-47, +-55, +-77, +-65, +-67, +-84, +-11, +-19, +-33, + 36, + 22, + 7, + 39, + 26, + 9, + 67, + 49, + 26, + 88, + 55, + 8, + 85, + 39, +-43, + 86, + 44, +-38, + 84, + 44, +-34, + 82, + 42, +-33, + 79, + 40, +-35, + 75, + 36, +-38, + 69, + 29, +-43, + 49, + 8, +-64, + 50, + 7, +-47, + 65, + 58, + 22, + 95, + 87, + 43, + 95, + 87, + 44, + 57, + 46, + 6, + 5, +-18, +-50, + 44, + 45, + 2, + 26, + 27, +-12, + 85, + 81, + 60, +109, +100, + 60, +108, +100, + 56, +106, + 98, + 53, + 55, + 41, + 15, + 23, +-28, +-81, + 64, + 23, +-44, + 67, + 27, +-40, + 62, + 23, +-44, + 54, + 13, +-51, + 39, + -8, +-64, + 37, +-16, +-85, + 14, +-43, +-100, + 47, + -9, +-76, + 31, +-24, +-87, + 46, + -8, +-72, + 26, +-27, +-88, + 82, + 48, + 12, + 34, +-21, +-90, + 91, + 71, + 44, +101, +100, + 90, +100, +101, + 98, +103, +103, +104, +105, +105, +105, +104, +104, +105, +104, +103, +103, +105, +105, +104, +107, +108, +107, +108, +108, +108, +109, +109, +108, +111, +112, +112, +109, +109, +110, +110, +110, +111, +110, +109, +110, +110, +110, +110, +110, +110, +111, +110, +110, +109, +111, +112, +111, +115, +114, +114, +117, +116, +118, + 47, + 6, +-40, + 27, +-29, +-96, + 61, + 19, +-23, + 47, + -7, +-61, + 23, +-36, +-102, + 33, +-23, +-88, + 58, + 16, +-21, + 57, + 3, +-63, + 42, +-16, +-75, + 40, +-11, +-80, + 60, + 16, +-56, + 65, + 24, +-48, + 66, + 25, +-47, + 40, +-13, +-83, + 77, + 50, + 36, + 50, + 37, + -4, + 56, + 30, +-29, + 38, + 19, +-30, + -2, +-20, +-59, + 54, + 34, +-21, + 72, + 47, + -1, + 95, + 68, + 15, + 79, + 32, +-62, + 84, + 72, + 46, +103, + 96, + 85, + 61, + 30, +-10, + 43, + -5, +-63, + 50, + 8, +-67, + 49, + 0, +-75, + 55, + 6, +-72, + 40, + 25, + 8, + -2, +-48, +-110, +-33, +-47, +-75, +-51, +-57, +-77, +-63, +-66, +-78, +-11, +-19, +-30, + 35, + 21, + 9, + 40, + 27, + 10, + 68, + 50, + 26, + 89, + 56, + 7, + 85, + 40, +-42, + 88, + 44, +-37, + 85, + 45, +-32, + 82, + 42, +-33, + 80, + 41, +-34, + 75, + 36, +-37, + 69, + 29, +-41, + 47, + 8, +-64, + 56, + 11, +-44, + 62, + 56, + 21, + 95, + 87, + 44, + 95, + 87, + 45, + 57, + 48, + 9, + 11, +-12, +-44, + 46, + 47, + 7, + 36, + 39, + 5, + 77, + 76, + 52, +108, +100, + 59, +107, + 99, + 57, +105, + 97, + 52, + 60, + 40, + 17, + 20, +-30, +-81, + 64, + 23, +-43, + 65, + 26, +-41, + 60, + 22, +-44, + 53, + 12, +-53, + 37, +-13, +-76, + 37, +-19, +-91, + 10, +-50, +-113, + 42, +-16, +-91, + 32, +-23, +-91, + 38, +-19, +-86, + 25, +-32, +-100, + 86, + 44, +-16, + 35, +-22, +-98, + 90, + 57, + 8, + 71, + 48, + 12, + 66, + 48, + 22, + 63, + 49, + 24, + 62, + 48, + 24, + 62, + 48, + 25, + 63, + 51, + 30, + 66, + 57, + 39, + 66, + 59, + 44, + 66, + 58, + 40, + 67, + 61, + 47, + 69, + 63, + 49, + 66, + 60, + 43, + 67, + 60, + 41, + 68, + 61, + 44, + 73, + 68, + 55, + 70, + 63, + 47, + 70, + 59, + 41, + 74, + 64, + 45, + 79, + 68, + 44, + 91, + 73, + 41, + 50, + 2, +-64, + 23, +-34, +-114, + 64, + 12, +-52, + 49, +-14, +-83, + 20, +-45, +-121, + 30, +-30, +-106, + 55, + 0, +-58, + 52, + -4, +-82, + 39, +-26, +-108, + 39, +-16, +-83, + 60, + 15, +-55, + 66, + 25, +-47, + 67, + 25, +-47, + 37, +-16, +-83, + 75, + 52, + 35, + 83, + 68, + 16, + 78, + 56, + -8, + 54, + 30, +-29, + 11, + -9, +-39, + 71, + 50, +-15, + 79, + 56, + 9, + 92, + 62, + 6, + 78, + 30, +-54, + 84, + 78, + 65, + 88, + 77, + 61, + 65, + 32, +-16, + 37, +-11, +-68, + 51, + 12, +-50, + 51, + 0, +-74, + 55, + 7, +-72, + 41, + 14, +-13, + 17, +-25, +-75, + 17, +-19, +-75, + 4, +-28, +-73, + -4, +-38, +-83, + 13, +-16, +-46, + 40, + 18, + -5, + 41, + 28, + 11, + 68, + 50, + 28, + 89, + 56, + 7, + 84, + 40, +-42, + 87, + 46, +-36, + 85, + 45, +-32, + 82, + 42, +-33, + 80, + 41, +-33, + 76, + 37, +-36, + 70, + 29, +-39, + 45, + 5, +-65, + 53, + 12, +-38, + 61, + 54, + 17, + 95, + 87, + 44, + 95, + 87, + 44, + 59, + 49, + 11, + 15, + -8, +-36, + 46, + 48, + 5, + 30, + 33, + 3, + 72, + 70, + 42, +108, +100, + 58, +106, + 98, + 55, +104, + 96, + 51, + 62, + 43, + 15, + 25, +-26, +-82, + 65, + 23, +-43, + 65, + 26, +-41, + 61, + 21, +-45, + 52, + 10, +-54, + 36, +-17, +-89, + 36, +-27, +-111, + 6, +-56, +-124, + 41, +-19, +-100, + 29, +-26, +-101, + 36, +-27, +-97, + 24, +-37, +-105, + 85, + 42, +-22, + 40, +-19, +-100, + 94, + 60, + 10, + 72, + 48, + 11, + 68, + 50, + 21, + 68, + 53, + 26, + 69, + 56, + 29, + 72, + 61, + 39, + 75, + 69, + 49, + 76, + 70, + 54, + 79, + 73, + 57, + 78, + 71, + 55, + 76, + 70, + 53, + 74, + 70, + 53, + 73, + 67, + 49, + 71, + 64, + 45, + 71, + 63, + 43, + 70, + 63, + 43, + 70, + 61, + 40, + 72, + 59, + 38, + 74, + 63, + 40, + 79, + 65, + 36, + 93, + 69, + 30, + 47, + -4, +-75, + 29, +-29, +-108, + 63, + 14, +-55, + 51, +-13, +-86, + 19, +-47, +-128, + 30, +-30, +-110, + 56, + -4, +-72, + 56, + -1, +-81, + 39, +-28, +-126, + 35, +-19, +-85, + 60, + 15, +-56, + 66, + 24, +-47, + 69, + 26, +-46, + 45, + -6, +-80, + 75, + 51, + 35, + 90, + 77, + 26, + 88, + 70, + 15, + 44, + 6, +-42, + 36, + 7, +-21, + 90, + 62, +-24, + 82, + 55, + -4, + 93, + 52, +-32, + 82, + 35, +-55, + 90, + 90, + 81, + 85, + 69, + 47, + 72, + 29, +-40, + 38, +-15, +-79, + 50, + 17, +-45, + 52, + 0, +-76, + 55, + 7, +-73, + 70, + 31, +-31, + 77, + 37, +-20, + 81, + 44, +-10, + 88, + 50, + -2, + 92, + 54, + 4, + 93, + 57, + 10, + 86, + 56, + 12, + 40, + 27, + 11, + 67, + 49, + 29, + 90, + 55, + 6, + 85, + 39, +-42, + 86, + 45, +-37, + 85, + 45, +-31, + 81, + 42, +-33, + 80, + 41, +-33, + 75, + 36, +-36, + 69, + 29, +-38, + 43, + 4, +-65, + 50, + 9, +-32, + 72, + 56, + 8, + 91, + 82, + 33, + 93, + 85, + 42, + 64, + 54, + 13, + 19, + -5, +-32, + 43, + 45, + 5, + 17, + 20, + -7, + 51, + 44, + 15, + 99, + 89, + 46, +106, + 98, + 55, +102, + 95, + 51, + 54, + 40, + 5, + 20, +-29, +-81, + 64, + 23, +-43, + 64, + 25, +-42, + 61, + 21, +-45, + 49, + 8, +-56, + 39, +-14, +-80, + 45, +-13, +-86, + 6, +-52, +-103, + 41, +-16, +-88, + 26, +-29, +-98, + 38, +-20, +-81, + 33, +-24, +-71, + 84, + 51, + 12, + 42, +-14, +-80, + 95, + 80, + 49, + 85, + 77, + 56, + 78, + 71, + 57, + 81, + 76, + 65, + 81, + 77, + 67, + 86, + 84, + 74, + 95, + 93, + 84, + 96, + 95, + 88, + 96, + 95, + 88, + 97, + 97, + 90, + 97, + 96, + 90, + 94, + 93, + 87, + 89, + 88, + 82, + 86, + 86, + 79, + 84, + 82, + 76, + 85, + 83, + 78, + 83, + 81, + 76, + 85, + 82, + 75, + 86, + 83, + 75, + 92, + 89, + 78, +105, +100, + 83, + 45, + -5, +-69, + 30, +-22, +-86, + 60, + 18, +-30, + 52, + -3, +-62, + 21, +-42, +-120, + 29, +-27, +-96, + 55, + 1, +-57, + 52, + 3, +-60, + 42, +-21, +-94, + 35, +-20, +-84, + 58, + 14, +-57, + 65, + 25, +-49, + 67, + 27, +-48, + 49, + 4, +-79, + 76, + 51, + 37, + 85, + 73, + 22, + 77, + 66, + 14, + 67, + 53, + 0, + 64, + 53, + 0, + 72, + 63, + 17, + 98, + 76, + 28, + 98, + 60, +-18, + 91, + 51, +-27, + 67, + 57, + 42, + 82, + 63, + 35, + 70, + 31, +-34, + 41, + -5, +-52, + 53, + 19, +-35, + 53, + 1, +-78, + 55, + 7, +-73, + 78, + 41, +-20, + 83, + 46, +-11, + 87, + 51, + -2, + 91, + 57, + 7, + 95, + 62, + 15, + 95, + 65, + 19, + 99, + 68, + 22, + 61, + 41, + 12, + 68, + 49, + 26, + 90, + 55, + 7, + 83, + 38, +-43, + 86, + 45, +-36, + 84, + 45, +-31, + 81, + 42, +-33, + 79, + 40, +-33, + 76, + 36, +-36, + 69, + 29, +-38, + 42, + 0, +-70, + 55, + 19, +-31, + 67, + 45, +-21, + 79, + 62, + -4, + 89, + 81, + 38, + 68, + 57, + 19, + 20, + -3, +-28, + 40, + 14, +-41, + 37, + -4, +-77, + 41, + 2, +-67, + 62, + 30, +-41, + 71, + 48, +-15, + 71, + 43, +-22, + 46, + 8, +-48, + 17, +-30, +-81, + 64, + 23, +-44, + 63, + 24, +-43, + 59, + 20, +-46, + 48, + 7, +-58, + 42, + -9, +-64, + 50, + -6, +-71, + 8, +-48, +-97, + 43, +-13, +-84, + 20, +-36, +-96, + 37, +-17, +-76, + 35, +-16, +-56, + 90, + 61, + 25, + 42, +-11, +-69, +100, + 91, + 75, +114, +113, +110, +112, +111, +109, +112, +112, +109, +113, +113, +111, +115, +115, +114, +120, +120, +120, +120, +120, +120, +118, +118, +117, +120, +120, +119, +120, +120, +120, +110, +111, +111, +107, +107, +108, +111, +112, +110, +114, +114, +114, +114, +114, +113, +114, +114, +113, +111, +111, +109, +105, +105, +103, +111, +110, +108, +117, +117, +113, + 40, + -6, +-66, + 25, +-27, +-88, + 56, + 15, +-28, + 55, + 5, +-48, + 21, +-38, +-106, + 27, +-26, +-89, + 49, + -3, +-56, + 46, + 2, +-53, + 43, +-15, +-80, + 33, +-21, +-85, + 58, + 13, +-57, + 65, + 25, +-50, + 67, + 27, +-47, + 50, + 5, +-80, + 73, + 50, + 36, + 76, + 67, + 23, + 75, + 63, + 17, + 74, + 63, + 14, + 74, + 63, + 14, + 80, + 67, + 19, + 99, + 81, + 38, +110, + 81, + 17, +103, + 67, + -9, + 21, + -5, +-56, + 73, + 48, + -1, + 74, + 40, + -9, + 36, + -5, +-44, + 48, + 12, +-46, + 53, + 1, +-78, + 55, + 7, +-74, + 76, + 39, +-21, + 83, + 46, +-11, + 86, + 50, + -5, + 91, + 57, + 6, + 94, + 60, + 13, + 96, + 65, + 18, + 99, + 67, + 22, + 88, + 60, + 21, + 68, + 49, + 27, + 89, + 54, + 6, + 83, + 38, +-43, + 85, + 44, +-36, + 84, + 45, +-31, + 81, + 41, +-33, + 79, + 40, +-33, + 75, + 36, +-36, + 69, + 29, +-39, + 43, + 2, +-69, + 63, + 24, +-28, + 66, + 41, +-27, + 74, + 52, +-26, + 85, + 77, + 33, + 69, + 58, + 21, + 29, + 4, +-26, + 36, + -4, +-81, + 36, + -1, +-76, + 45, + 10, +-65, + 67, + 40, +-34, + 74, + 51, +-21, + 74, + 53, +-11, + 49, + 12, +-50, + 26, +-24, +-78, + 64, + 23, +-43, + 63, + 23, +-43, + 58, + 18, +-47, + 47, + 6, +-58, + 40, +-12, +-74, + 47, + -8, +-74, + 12, +-46, +-104, + 42, +-19, +-92, + 23, +-33, +-96, + 38, +-17, +-75, + 41, + -9, +-51, + 93, + 54, + 2, + 36, +-17, +-78, +105, + 92, + 74, +121, +121, +121, +119, +120, +120, +120, +120, +120, +121, +121, +121, +121, +121, +121, +121, +121, +121, +115, +114, +111, +102, + 96, + 88, +109, +105, + 98, +120, +120, +118, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +117, +117, +117, +111, +111, +109, +112, +112, +109, +117, +117, +115, + 37, +-15, +-76, + 26, +-29, +-102, + 50, + 3, +-50, + 55, + 3, +-58, + 21, +-41, +-116, + 25, +-32, +-99, + 48, + -9, +-73, + 40, +-10, +-66, + 42, +-20, +-96, + 30, +-27, +-92, + 56, + 12, +-59, + 65, + 23, +-50, + 67, + 26, +-48, + 51, + 4, +-79, + 64, + 40, + 25, + 60, + 59, + 37, + 66, + 68, + 55, + 75, + 78, + 67, + 88, + 88, + 76, + 91, + 91, + 75, +104, + 76, + 18, +119, + 87, + 10, +109, + 73, +-27, + 37, + 14, +-39, + 79, + 50, + 4, + 78, + 39, +-22, + 37, +-10, +-58, + 47, + 7, +-57, + 54, + 1, +-78, + 55, + 6, +-74, + 78, + 41, +-20, + 82, + 45, +-12, + 87, + 51, + -4, + 91, + 57, + 6, + 94, + 60, + 11, + 96, + 64, + 17, + 98, + 66, + 21, +101, + 70, + 25, + 77, + 55, + 27, + 89, + 54, + 6, + 83, + 38, +-43, + 85, + 44, +-37, + 85, + 45, +-31, + 81, + 41, +-33, + 79, + 40, +-33, + 75, + 36, +-36, + 69, + 29, +-38, + 42, + -2, +-68, + 63, + 18, +-33, + 62, + 35, +-34, + 69, + 42, +-36, + 77, + 67, + 21, + 68, + 57, + 19, + 26, + -9, +-80, + 34, + -6, +-83, + 38, + 1, +-75, + 51, + 16, +-59, + 74, + 49, +-23, + 81, + 59, + -9, + 72, + 47, +-23, + 60, + 27, +-31, + 26, +-23, +-84, + 62, + 21, +-46, + 62, + 22, +-44, + 58, + 18, +-47, + 45, + 4, +-60, + 38, +-19, +-94, + 44, +-17, +-94, + 19, +-45, +-122, + 43, +-17, +-94, + 25, +-33, +-102, + 41, +-20, +-93, + 53, + 5, +-42, + 89, + 48, +-15, + 33, +-21, +-84, +106, + 90, + 63, +121, +121, +122, + 99, + 99, +100, +108, +108, +109, +121, +121, +120, +121, +121, +121, +112, +111, +109, + 78, + 69, + 50, + 74, + 60, + 36, + 71, + 51, + 18, +107, +103, + 95, +103, +103, +101, +112, +112, +110, +114, +114, +113, +121, +121, +120, +120, +120, +120, +121, +121, +121, +119, +119, +118, +106, +108, +101, + 98, +104, + 92, +115, +114, +109, + 32, +-23, +-97, + 27, +-27, +-100, + 47, + -4, +-73, + 56, + -1, +-72, + 21, +-44, +-128, + 21, +-40, +-117, + 48, +-17, +-97, + 41, +-18, +-91, + 41, +-23, +-122, + 29, +-32, +-99, + 56, + 11, +-60, + 64, + 22, +-51, + 66, + 26, +-50, + 48, + 1, +-79, + 61, + 37, + 18, + 55, + 40, +-12, + 62, + 62, + 42, + 71, + 73, + 61, + 84, + 86, + 77, + 90, + 91, + 83, +108, + 76, + 9, +121, + 91, + 15, +113, + 78, +-19, + 41, + 19, +-33, + 79, + 42, +-27, + 84, + 39, +-40, + 51, + 4, +-49, + 47, + -5, +-93, + 54, + 1, +-79, + 56, + 6, +-74, + 81, + 44, +-16, + 86, + 49, + -8, + 89, + 53, + -2, + 92, + 58, + 7, + 95, + 60, + 11, + 98, + 64, + 18, + 99, + 66, + 20, +102, + 70, + 26, + 97, + 69, + 28, + 89, + 54, + 5, + 83, + 38, +-42, + 85, + 44, +-34, + 84, + 44, +-31, + 80, + 41, +-34, + 79, + 40, +-34, + 75, + 35, +-35, + 68, + 28, +-39, + 40, + 1, +-64, + 65, + 16, +-31, + 64, + 34, +-36, + 60, + 31, +-44, + 70, + 59, + 14, + 68, + 55, + 16, + 16, +-26, +-87, + 23, +-22, +-96, + 28, +-15, +-91, + 36, + -2, +-74, + 73, + 39, +-32, + 84, + 49, +-15, + 68, + 35, +-35, + 61, + 23, +-42, + 21, +-28, +-81, + 61, + 20, +-46, + 61, + 21, +-44, + 57, + 17, +-48, + 43, + 2, +-62, + 35, +-22, +-97, + 45, +-15, +-86, + 22, +-41, +-114, + 41, +-19, +-93, + 31, +-25, +-95, + 43, +-17, +-83, + 51, + 9, +-33, + 84, + 43, +-12, + 43, + 5, +-39, +104, + 92, + 68, +104, +103, + 92, + 94, + 94, + 83, + 90, + 91, + 81, + 82, + 84, + 73, + 87, + 88, + 79, + 81, + 77, + 61, + 74, + 62, + 38, + 75, + 61, + 36, + 70, + 46, + 3, + 82, + 69, + 40, + 95, + 96, + 90, + 99, +100, + 94, + 94, + 95, + 89, + 99, +100, + 93, + 98, + 99, + 92, +100, +100, + 94, +102, +102, + 97, +101, +102, + 97, +108, +109, +105, +106, +103, + 96, + 31, +-28, +-97, + 36, +-15, +-79, + 49, + 0, +-62, + 57, + 4, +-59, + 22, +-41, +-116, + 19, +-40, +-114, + 48, +-14, +-85, + 40, +-19, +-84, + 42, +-21, +-112, + 26, +-34, +-103, + 54, + 9, +-61, + 64, + 21, +-52, + 66, + 26, +-50, + 46, + -4, +-78, + 59, + 34, + 10, + 63, + 48, + -8, + 73, + 73, + 53, + 82, + 84, + 71, + 85, + 87, + 76, + 91, + 92, + 80, +106, + 86, + 45, +120, + 98, + 43, +116, + 88, + 26, + 42, + 20, +-31, + 81, + 43, +-23, + 89, + 53, + -9, + 46, + 8, +-32, + 45, +-18, +-110, + 54, + 0, +-80, + 55, + 5, +-76, + 83, + 47, +-14, + 89, + 52, + -5, + 92, + 55, + 1, + 94, + 59, + 9, + 96, + 62, + 12, +100, + 65, + 18, +101, + 66, + 20, +102, + 70, + 25, +103, + 73, + 28, + 89, + 54, + 3, + 83, + 38, +-42, + 85, + 43, +-35, + 84, + 45, +-31, + 81, + 41, +-33, + 78, + 39, +-34, + 74, + 34, +-35, + 67, + 27, +-40, + 44, + 6, +-66, + 61, + 14, +-40, + 66, + 43, +-26, + 70, + 51, +-15, + 74, + 65, + 18, + 62, + 53, + 13, + 38, + 24, + -2, + 88, + 77, + 34, + 59, + 41, + -6, + 19, + 10, +-19, +-12, +-17, +-43, + 45, + 40, + 14, + 16, + -5, +-37, + 18, +-27, +-77, + 23, +-26, +-83, + 60, + 19, +-48, + 60, + 20, +-45, + 56, + 16, +-49, + 43, + 1, +-63, + 35, +-18, +-84, + 48, + -5, +-60, + 21, +-37, +-96, + 53, + -5, +-73, + 36, +-17, +-81, + 41, +-11, +-65, + 51, + 14, +-16, + 80, + 45, + 4, + 52, + 20, +-14, +105, +100, + 90, +121, +121, +120, + 91, + 90, + 92, +101, +100, +102, + 75, + 78, + 80, + 82, + 83, + 83, + 81, + 73, + 53, + 74, + 60, + 33, + 80, + 64, + 39, + 69, + 45, + -2, + 71, + 47, + 0, + 83, + 82, + 71, +115, +115, +114, +115, +115, +114, +120, +120, +118, +116, +116, +115, +121, +121, +121, +120, +120, +120, +107, +108, +105, + 96, + 99, + 91, + 97, + 94, + 85, + 31, +-24, +-91, + 42, + -4, +-63, + 52, + 8, +-46, + 57, + 13, +-37, + 24, +-34, +-98, + 21, +-36, +-104, + 53, + 2, +-54, + 41, +-10, +-65, + 43, +-14, +-88, + 23, +-33, +-102, + 54, + 9, +-63, + 63, + 21, +-52, + 66, + 26, +-50, + 47, + -5, +-76, + 60, + 34, + 12, + 66, + 51, + 0, + 76, + 79, + 62, + 82, + 84, + 71, + 85, + 86, + 77, + 91, + 89, + 73, +111, + 86, + 37, +121, + 95, + 30, +119, + 90, + 17, + 42, + 20, +-32, + 82, + 44, +-15, + 89, + 66, + 24, + 35, + 5, +-23, + 36, +-28, +-112, + 52, + 0, +-80, + 53, + 5, +-76, + 75, + 27, +-40, + 82, + 34, +-31, + 86, + 39, +-23, + 84, + 38, +-19, + 81, + 37, +-18, + 84, + 40, +-17, + 91, + 43, +-16, + 90, + 40, +-17, + 96, + 51, + -6, + 76, + 31, +-38, + 83, + 38, +-42, + 85, + 44, +-34, + 84, + 44, +-31, + 81, + 41, +-33, + 78, + 39, +-34, + 74, + 34, +-35, + 67, + 27, +-39, + 42, + 0, +-67, + 51, + 4, +-48, + 48, + 29, +-30, + 67, + 55, + 1, + 73, + 65, + 22, + 54, + 45, + 6, + 8, +-16, +-50, + -9, +-38, +-88, + 16, + -8, +-117, + -7, +-13, +-115, +-39, +-62, +-116, + 76, + 70, + 35, + 8, + -4, +-35, + 11, +-39, +-109, + 25, +-24, +-87, + 59, + 18, +-48, + 59, + 19, +-46, + 55, + 15, +-49, + 41, + 0, +-62, + 37, +-18, +-79, + 49, + -3, +-60, + 18, +-39, +-100, + 63, + 5, +-66, + 39, +-13, +-74, + 33, +-18, +-71, + 62, + 24, + -8, + 77, + 40, + -3, + 45, + 9, +-27, +105, +100, + 87, +122, +122, +121, +102, +101, +103, +107, +107, +108, +106, +107, +107, + 84, + 81, + 72, + 81, + 72, + 51, + 79, + 67, + 39, + 81, + 67, + 39, + 74, + 50, + 4, + 75, + 50, + 0, + 90, + 82, + 56, +120, +120, +120, +121, +121, +121, +120, +120, +118, +113, +113, +111, +121, +121, +121, +121, +121, +121, +117, +116, +114, +101, +103, + 95, +101, + 96, + 86, + 34, +-21, +-90, + 41, + -8, +-69, + 54, + 9, +-48, + 59, + 15, +-39, + 25, +-34, +-100, + 20, +-37, +-107, + 55, + 6, +-51, + 40, +-11, +-69, + 45, +-14, +-88, + 23, +-37, +-108, + 52, + 7, +-65, + 62, + 20, +-55, + 65, + 25, +-51, + 43, +-11, +-78, + 55, + 31, + 10, + 67, + 58, + 11, + 82, + 84, + 71, + 91, + 93, + 83, + 92, + 93, + 85, + 96, + 89, + 70, +113, + 77, + 8, +119, + 88, + -3, +120, + 85, +-10, + 44, + 21, +-28, + 81, + 33, +-48, + 91, + 61, + 8, + 41, + 9, +-27, + 44, +-20, +-104, + 51, + -2, +-81, + 52, + 3, +-77, + 24, + -1, +-28, + 15, +-26, +-86, + 16, +-19, +-78, + 25, + 1, +-54, + 14, +-29, +-88, + 15, +-17, +-48, + 42, + 11, +-15, + 49, + 20, + -8, + 68, + 44, + 17, + 90, + 53, + 1, + 83, + 37, +-43, + 85, + 43, +-34, + 84, + 44, +-31, + 79, + 40, +-34, + 78, + 39, +-34, + 74, + 34, +-34, + 68, + 27, +-39, + 40, + 0, +-68, + 44, + -7, +-60, + 40, + 23, +-33, + 63, + 51, + -3, + 73, + 66, + 23, + 53, + 44, + 9, + 30, + 20, +-10, + 30, + 27, +-11, + 53, + 35, +-119, + -7, +-13, +-97, + 41, + 34, +-87, + 70, + 55, + 5, + 25, + 5, +-35, + 36, + 8, +-97, + 26, +-23, +-81, + 58, + 17, +-49, + 58, + 18, +-47, + 54, + 14, +-51, + 39, + -3, +-67, + 43, +-19, +-94, + 46, +-10, +-88, + 19, +-43, +-111, + 60, + -2, +-91, + 40, +-17, +-88, + 23, +-37, +-100, + 63, + 17, +-36, + 77, + 30, +-38, + 46, + 0, +-56, +109, + 96, + 70, +121, +121, +121, +121, +121, +121, +121, +121, +121, +113, +112, +110, + 84, + 79, + 64, + 83, + 74, + 49, + 84, + 73, + 44, + 84, + 72, + 44, + 81, + 59, + 13, + 79, + 57, + 6, + 77, + 61, + 19, +113, +113, +108, +121, +121, +121, +121, +121, +121, +114, +114, +113, +121, +121, +121, +121, +121, +121, +114, +114, +111, + 92, + 96, + 81, +101, + 96, + 89, + 32, +-25, +-104, + 44, +-10, +-84, + 60, + 9, +-64, + 62, + 9, +-62, + 22, +-42, +-128, + 17, +-42, +-127, + 57, + -2, +-81, + 40, +-22, +-97, + 42, +-22, +-128, + 19, +-45, +-123, + 51, + 6, +-66, + 63, + 18, +-56, + 65, + 24, +-52, + 29, +-18, +-82, + 54, + 32, + 11, + 65, + 52, + 10, + 76, + 78, + 67, + 86, + 87, + 79, + 87, + 89, + 83, + 97, + 90, + 72, +110, + 83, + 33, +120, + 91, + 18, +119, + 88, + 11, + 45, + 21, +-26, + 87, + 39, +-44, + 93, + 50, +-27, + 55, + 16, +-27, + 38, +-20, +-100, + 52, + -2, +-82, + 52, + 3, +-79, +-88, +-120, +-124, +-58, +-86, +-113, +-38, +-64, +-82, +-44, +-72, +-94, +-16, +-41, +-117, + -9, +-18, +-33, + 38, + 24, + 9, + 44, + 31, + 14, + 67, + 49, + 26, + 86, + 52, + 1, + 82, + 37, +-44, + 84, + 43, +-36, + 83, + 43, +-32, + 80, + 40, +-34, + 77, + 38, +-35, + 74, + 34, +-33, + 68, + 27, +-39, + 41, + -4, +-69, + 3, +-47, +-92, + 19, +-17, +-62, + 18, +-21, +-73, + 16, +-11, +-40, + -5, +-41, +-68, + -6, +-43, +-79, +-19, +-53, +-95, +-33, +-87, +-121, +-34, +-88, +-126, +-34, +-89, +-123, +-36, +-91, +-123, +-32, +-83, +-117, +-17, +-66, +-107, + 18, +-30, +-81, + 57, + 16, +-50, + 57, + 17, +-48, + 53, + 13, +-52, + 35, + -7, +-70, + 47, +-15, +-95, + 47, +-12, +-90, + 27, +-35, +-107, + 63, + 1, +-84, + 43, +-16, +-91, + 20, +-41, +-114, + 63, + 18, +-32, + 75, + 29, +-37, + 52, + 6, +-51, +108, + 96, + 70, +122, +122, +122, +121, +121, +121, +121, +121, +121, +108, +107, +105, + 99, + 97, + 91, + 96, + 91, + 81, + 99, + 93, + 80, + 84, + 70, + 49, + 91, + 78, + 58, + 92, + 79, + 56, + 89, + 76, + 55, +109, +107, + 99, +118, +118, +115, +120, +120, +118, +115, +115, +114, +121, +121, +121, +121, +121, +121, +115, +115, +113, + 98, + 98, + 95, +105, + 99, + 92, + 42, +-16, +-97, + 48, + -2, +-76, + 60, + 9, +-65, + 65, + 10, +-61, + 22, +-42, +-128, + 18, +-42, +-126, + 59, + 2, +-79, + 40, +-22, +-98, + 41, +-22, +-128, + 19, +-48, +-128, + 50, + 5, +-69, + 62, + 17, +-56, + 66, + 24, +-52, + 39, +-11, +-82, + 16, +-31, +-72, + 19, +-16, +-59, + 23, +-11, +-37, + 13, +-14, +-30, + 14, +-10, +-21, + 17, + -6, +-21, + 24, + -9, +-48, + 31, + -2, +-46, + 30, + -5, +-59, + 2, +-37, +-72, + 14, +-34, +-86, + 12, +-30, +-70, + -5, +-50, +-79, + 24, +-34, +-111, + 51, + -3, +-82, + 51, + 2, +-78, +-85, +-116, +-121, +-68, +-104, +-122, +-51, +-80, +-92, +-63, +-94, +-113, +-29, +-31, +-112, + 44, + 24, +-73, + 59, + 44, +-33, + 64, + 44, + -4, + 78, + 59, + 15, + 87, + 52, + -1, + 83, + 37, +-45, + 84, + 43, +-39, + 83, + 43, +-33, + 79, + 39, +-36, + 77, + 38, +-35, + 75, + 35, +-34, + 70, + 31, +-36, + 57, + 17, +-48, + 31, + -8, +-64, + 31, +-10, +-64, + 31, +-10, +-65, + 30, +-10, +-65, + 29, +-11, +-64, + 29, +-11, +-66, + 28, +-13, +-66, + 27, +-15, +-67, + 26, +-16, +-68, + 24, +-18, +-70, + 22, +-20, +-72, + 21, +-21, +-76, + 19, +-24, +-78, + 36, + -6, +-62, + 57, + 16, +-48, + 56, + 16, +-49, + 51, + 10, +-54, + 33, + -9, +-69, + 44, +-13, +-86, + 46, + -8, +-72, + 40, +-15, +-83, + 66, + 12, +-55, + 41, + -9, +-72, + 21, +-37, +-96, + 66, + 35, + 8, + 76, + 41, + -5, + 56, + 11, +-31, +107, +101, + 87, +121, +121, +121, +114, +114, +113, +118, +118, +118, +120, +120, +120, +113, +113, +112, +121, +121, +121, +116, +113, +111, + 48, + 18, +-15, + 93, + 86, + 79, +119, +118, +118, +121, +121, +121, +115, +116, +106, +120, +120, +120, +119, +120, +116, +114, +115, +112, +121, +121, +121, +121, +121, +121, +118, +118, +116, + 96, + 97, + 95, +103, + 98, + 92, + 48, + -2, +-74, + 50, + 9, +-48, + 62, + 17, +-42, + 63, + 17, +-40, + 24, +-36, +-118, + 17, +-37, +-111, + 62, + 12, +-53, + 41, +-14, +-74, + 41, +-19, +-99, + 20, +-43, +-119, + 48, + 2, +-71, + 61, + 16, +-57, + 65, + 23, +-52, + 51, + 9, +-64, + 44, + -8, +-82, + 49, + -6, +-83, + 45, +-10, +-84, + 48, +-10, +-86, + 42, +-16, +-93, + 40, +-19, +-95, + 36, +-24, +-97, + 37, +-21, +-100, + 33, +-26, +-105, + 31, +-28, +-105, + 26, +-31, +-108, + 19, +-35, +-108, + 19, +-33, +-106, + 34, +-17, +-90, + 52, + 2, +-77, + 53, + 5, +-76, +-69, +-107, +-123, +-55, +-100, +-125, +-15, +-61, +-94, + 17, +-23, +-109, + 13, + -1, +-111, +-43, +-48, +-123, + 49, + 28, +-57, + 81, + 38, +-126, + 83, + 56, +-52, + 90, + 51, +-21, + 82, + 36, +-46, + 84, + 43, +-39, + 81, + 41, +-35, + 78, + 38, +-37, + 76, + 37, +-37, + 75, + 36, +-33, + 72, + 34, +-33, + 70, + 30, +-37, + 67, + 27, +-40, + 64, + 26, +-40, + 64, + 27, +-39, + 63, + 26, +-39, + 65, + 27, +-38, + 65, + 26, +-39, + 62, + 23, +-40, + 61, + 21, +-42, + 57, + 19, +-45, + 57, + 17, +-48, + 55, + 14, +-45, + 54, + 13, +-46, + 53, + 13, +-49, + 54, + 14, +-49, + 55, + 15, +-48, + 53, + 12, +-50, + 49, + 9, +-55, + 36, + -8, +-70, + 49, + -8, +-77, + 49, + -4, +-65, + 37, +-20, +-86, + 71, + 20, +-49, + 47, + -3, +-66, + 22, +-35, +-92, + 71, + 39, + 12, + 77, + 40, + -6, + 55, + 11, +-28, +107, +101, + 87, +121, +121, +121, +109, +110, +107, +120, +120, +120, +120, +120, +120, +115, +115, +113, +120, +119, +119, + 89, + 80, + 72, + 27, + -8, +-40, + 54, + 33, + 12, +114, +113, +112, +121, +121, +121, +121, +121, +121, +111, +110, +105, + 85, + 84, + 65, + 86, + 83, + 67, +100, +100, + 96, +112, +111, +109, +120, +121, +120, +105, +106, +103, +103, + 98, + 92, + 49, + -2, +-71, + 56, + 14, +-47, + 57, + 14, +-41, + 62, + 22, +-30, + 28, +-33, +-107, + 17, +-37, +-103, + 63, + 18, +-39, + 40, +-11, +-60, + 42, +-14, +-88, + 21, +-39, +-109, + 45, + -2, +-74, + 59, + 14, +-59, + 65, + 23, +-53, + 67, + 27, +-51, + 68, + 27, +-53, + 68, + 26, +-53, + 69, + 25, +-52, + 68, + 21, +-53, + 60, + 12, +-60, + 59, + 11, +-62, + 57, + 9, +-65, + 55, + 6, +-67, + 52, + 3, +-72, + 52, + 1, +-73, + 53, + 0, +-75, + 50, + 0, +-74, + 49, + 0, +-75, + 52, + 3, +-72, + 52, + 3, +-72, + 53, + 5, +-76, +-44, +-87, +-115, +-12, +-63, +-107, + 16, +-32, +-76, + 3, +-42, +-104, +-25, +-20, +-121, +-32, +-22, +-109, + 14, + 9, +-27, + 11, +-19, +-64, + 72, + 31, +-126, +102, + 72, +-79, + 80, + 34, +-49, + 83, + 40, +-41, + 81, + 41, +-38, + 77, + 37, +-38, + 75, + 36, +-37, + 75, + 35, +-34, + 73, + 33, +-34, + 71, + 32, +-35, + 68, + 31, +-36, + 67, + 31, +-37, + 66, + 30, +-35, + 66, + 30, +-35, + 65, + 29, +-36, + 65, + 29, +-36, + 63, + 26, +-39, + 61, + 25, +-40, + 60, + 23, +-42, + 59, + 19, +-43, + 57, + 17, +-43, + 55, + 15, +-44, + 55, + 14, +-47, + 54, + 13, +-49, + 52, + 11, +-48, + 50, + 9, +-53, + 47, + 6, +-57, + 33, +-14, +-79, + 54, + -6, +-81, + 48, +-12, +-78, + 42, +-19, +-93, + 72, + 15, +-66, + 58, + 4, +-69, + 26, +-38, +-106, + 78, + 37, +-11, + 79, + 32, +-35, + 66, + 14, +-41, +109, + 97, + 74, +119, +119, +117, +118, +118, +116, +118, +118, +115, +119, +118, +116, +112, +110, +105, + 86, + 73, + 59, + 15, +-17, +-52, + 41, + 5, +-32, + 21, +-20, +-67, + 44, + 21, +-11, +111, +112, +107, +112, +113, +110, + 97, + 97, + 82, + 76, + 73, + 52, + 54, + 49, + 19, + 75, + 68, + 42, + 70, + 58, + 24, + 14, + 15, +-10, + 70, + 72, + 65, +105, + 99, + 91, + 53, + -3, +-84, + 58, + 8, +-63, + 54, + 5, +-58, + 62, + 15, +-46, + 27, +-34, +-107, + 15, +-42, +-115, + 63, + 15, +-51, + 38, +-16, +-71, + 39, +-22, +-105, + 22, +-41, +-118, + 41, + -8, +-75, + 57, + 13, +-61, + 65, + 22, +-54, + 68, + 29, +-51, + 72, + 33, +-49, + 72, + 32, +-50, + 73, + 29, +-50, + 70, + 26, +-51, + 66, + 19, +-56, + 64, + 17, +-60, + 62, + 14, +-63, + 60, + 11, +-63, + 60, + 8, +-69, + 60, + 6, +-73, + 59, + 5, +-74, + 57, + 4, +-75, + 55, + 5, +-71, + 54, + 5, +-70, + 52, + 3, +-72, + 51, + 3, +-77, +-62, +-96, +-120, +-28, +-61, +-87, + 12, +-19, +-44, + 14, +-14, +-55, +-33, +-41, +-97, + 41, + 5, +-124, + 9, + -2, +-43, +-31, +-15, +-106, + 17, + 12, +-74, + 72, + 47, +-85, + 64, + 29, +-52, + 83, + 38, +-42, + 79, + 39, +-38, + 76, + 36, +-39, + 75, + 35, +-38, + 74, + 34, +-35, + 72, + 32, +-35, + 71, + 31, +-36, + 68, + 31, +-37, + 66, + 30, +-38, + 66, + 29, +-37, + 65, + 28, +-37, + 63, + 24, +-41, + 61, + 23, +-42, + 59, + 21, +-44, + 56, + 17, +-44, + 43, + 9, +-39, + 33, + -4, +-55, + 30, + -8, +-59, + 32, + -7, +-57, + 30, +-10, +-61, + 22, +-18, +-68, + 19, +-23, +-73, + 14, +-28, +-79, + 12, +-30, +-83, + 8, +-39, +-93, + 15, +-34, +-93, + 25, +-32, +-96, + 46, +-17, +-99, + 69, + 6, +-81, + 64, + 8, +-75, + 28, +-42, +-124, + 79, + 37, +-16, + 79, + 32, +-45, + 72, + 23, +-39, +112, + 98, + 74, +121, +121, +121, +122, +122, +122, +121, +121, +121, +121, +121, +121, +118, +118, +116, +113, +110, +105, + 94, + 84, + 70, + 31, + -7, +-46, + 63, + 45, + 24, + 97, + 93, + 87, +120, +120, +119, +101, +101, + 91, + 79, + 79, + 65, + 30, + 29, + 0, + 68, + 63, + 40, + 74, + 63, + 26, + 61, + 37, +-15, + 37, + 20, +-21, + 43, + 30, +-12, + 82, + 65, + 36, + 52, + -4, +-97, + 54, + 4, +-70, + 52, + -1, +-72, + 62, + 10, +-62, + 27, +-37, +-113, + 12, +-46, +-122, + 62, + 8, +-69, + 35, +-22, +-93, + 35, +-28, +-128, + 8, +-52, +-126, + 18, +-29, +-88, + 35, + -9, +-68, + 44, + 2, +-62, + 49, + 10, +-58, + 50, + 12, +-58, + 49, + 9, +-60, + 50, + 7, +-61, + 47, + 4, +-62, + 44, + -1, +-64, + 40, + -5, +-70, + 46, + 0, +-70, + 60, + 11, +-67, + 59, + 9, +-70, + 60, + 6, +-73, + 58, + 4, +-73, + 57, + 3, +-73, + 53, + 4, +-71, + 52, + 3, +-71, + 50, + 1, +-74, + 50, + 1, +-75, + 46, + -1, +-77, + 74, + 36, +-22, + 90, + 55, + -8, + 95, + 68, + 25, +-42, +-57, +-86, + 27, +-23, +-126, +-22, +-40, +-125, +-17, +-31, +-113, + 32, + -5, +-123, +-35, +-40, +-117, + 56, + 24, +-76, + 83, + 39, +-45, + 79, + 37, +-41, + 74, + 34, +-42, + 74, + 33, +-40, + 72, + 31, +-37, + 70, + 30, +-37, + 70, + 30, +-37, + 67, + 28, +-39, + 66, + 27, +-40, + 64, + 27, +-39, + 63, + 25, +-40, + 55, + 15, +-50, + 50, + 10, +-54, + 49, + 8, +-53, + 46, + 4, +-54, + 22, +-12, +-43, +-26, +-67, +-101, +-18, +-61, +-103, +-25, +-69, +-112, +-26, +-73, +-119, +-24, +-71, +-116, +-18, +-66, +-114, +-20, +-67, +-110, +-24, +-68, +-112, +-19, +-63, +-104, +-34, +-80, +-118, + 12, +-47, +-106, + 49, + -9, +-84, + 69, + 9, +-69, + 73, + 22, +-54, + 28, +-41, +-115, + 84, + 50, + 13, + 82, + 41, +-20, + 75, + 27, +-29, +113, +105, + 89, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +119, +119, +118, +121, +121, +121, +113, +111, +105, + 32, + -7, +-51, + 81, + 70, + 55, +113, +113, +112, +118, +118, +117, + 89, + 87, + 71, + 71, + 67, + 48, + 86, + 84, + 58, + 74, + 66, + 39, + 65, + 47, + 8, + 46, + 19, +-33, + 65, + 39, +-20, + 57, + 28, +-33, + 76, + 54, + 13, + 58, + 1, +-78, + 53, + 11, +-48, + 52, + 2, +-63, + 62, + 11, +-54, + 30, +-31, +-99, + 11, +-46, +-121, + 61, + 8, +-63, + 31, +-25, +-89, + 32, +-31, +-126, + -4, +-58, +-123, +-30, +-81, +-125, +-11, +-56, +-91, +-25, +-77, +-122, +-23, +-74, +-119, +-17, +-70, +-111, +-17, +-68, +-113, +-20, +-73, +-119, +-13, +-61, +-103, + 3, +-44, +-80, + 1, +-48, +-87, + 30, +-16, +-79, + 58, + 9, +-68, + 59, + 6, +-69, + 58, + 3, +-72, + 57, + 2, +-73, + 55, + 2, +-73, + 51, + 2, +-73, + 50, + 1, +-74, + 48, + -1, +-76, + 47, + -2, +-77, + 45, + 5, +-60, + 74, + 35, +-33, + 95, + 62, + 15, +104, + 88, + 63, +-29, +-34, +-71, + 42, +-10, +-126, + 44, + 11, +-122, + 17, +-29, +-127, + 25, + 5, +-33, + 65, + 20, +-55, + 83, + 37, +-101, + 84, + 40, +-50, + 80, + 36, +-42, + 75, + 33, +-43, + 72, + 31, +-42, + 70, + 29, +-41, + 68, + 28, +-39, + 67, + 27, +-40, + 65, + 25, +-42, + 64, + 24, +-42, + 62, + 22, +-43, + 61, + 21, +-44, + 48, + 8, +-56, + 42, + 2, +-59, + 42, + 0, +-59, + 38, + -4, +-60, + 13, +-21, +-52, + 13, + -6, +-16, + 55, + 39, + 30, + 51, + 27, + 11, + 52, + 27, + 11, + 51, + 22, + 4, + 56, + 32, + 15, + 63, + 39, + 24, + 71, + 45, + 28, + 57, + 18, +-23, + 18, +-16, +-44, + 7, +-47, +-99, + 51, + -6, +-70, + 70, + 12, +-61, + 73, + 24, +-43, + 38, +-19, +-78, + 65, + 26, + -9, + 56, + 16, +-30, + 49, + 11, +-35, + 44, + 8, +-42, + 54, + 33, +-16, + 80, + 59, + 22, + 97, + 85, + 63, +114, +109, +102, +119, +119, +118, +117, +116, +114, +101, + 89, + 74, + 63, + 37, + 8, + 74, + 53, + 22, +109, +109, +108, +116, +115, +116, + 83, + 83, + 70, + 58, + 50, + 21, + 85, + 83, + 62, + 78, + 68, + 40, + 58, + 34, +-18, + 46, + 16, +-37, + 57, + 27, +-30, + 63, + 35, +-23, + 81, + 66, + 43, + 60, + 6, +-65, + 48, + 9, +-38, + 49, + 4, +-50, + 60, + 15, +-35, + 31, +-24, +-83, + 9, +-45, +-108, + 58, + 13, +-41, + 28, +-21, +-68, + 29, +-31, +-118, + -9, +-59, +-117, + 4, +-30, +-51, + 25, +-15, +-51, + 24, +-17, +-58, + 28, +-14, +-53, + 33, +-10, +-47, + 37, + -4, +-37, + 39, + 0, +-32, + 47, + 13, +-17, + 54, + 25, + -5, +-18, +-64, +-98, + 34, +-14, +-80, + 55, + 6, +-69, + 54, + 4, +-71, + 55, + 1, +-72, + 53, + -1, +-74, + 50, + 0, +-74, + 49, + 0, +-75, + 48, + -1, +-76, + 46, + -3, +-77, + 45, + -4, +-78, + 39, + 1, +-57, + 64, + 30, +-25, + 95, + 67, + 20, + 99, + 74, + 28, + -6, +-11, +-46, + 0, +-37, +-121, + 4, +-24, +-121, + 15, + 11, +-29, + 65, + 36, + 6, + 83, + 41, +-21, + 77, + 30, +-54, + 82, + 36, +-48, + 78, + 34, +-44, + 73, + 30, +-45, + 69, + 29, +-46, + 68, + 27, +-41, + 67, + 27, +-40, + 65, + 25, +-42, + 63, + 23, +-44, + 62, + 22, +-44, + 59, + 19, +-46, + 57, + 17, +-48, + 45, + 5, +-58, + 40, + -1, +-61, + 38, + -3, +-62, + 36, + -8, +-61, + 9, +-28, +-60, + 61, + 54, + 51, +103, + 98, + 92, + 87, + 72, + 59, + 89, + 73, + 62, + 89, + 70, + 56, + 90, + 68, + 51, + 87, + 57, + 30, + 81, + 41, + -3, + 84, + 42, +-10, + 55, + 32, + 12, + 12, +-44, +-95, + 48, +-11, +-83, + 58, + -1, +-73, + 68, + 20, +-34, + 61, + 18, +-20, + 72, + 40, + 14, + 81, + 48, + 9, + 80, + 52, + 13, + 83, + 59, + 24, + 80, + 61, + 29, + 67, + 50, + 23, + 54, + 26, +-20, + 62, + 25, +-36, + 85, + 70, + 53, + 95, + 92, + 87, + 58, + 38, + 21, + 33, +-10, +-46, + 59, + 42, + 29, +106, +105, +103, +121, +121, +121, + 86, + 79, + 68, + 53, + 36, + 7, + 55, + 39, + 6, + 47, + 28, + -5, + 41, + 19, +-24, + 43, + 27, + 4, + 34, + 4, +-45, + 56, + 33, +-13, + 74, + 53, + 19, + 60, + 5, +-71, + 57, + 17, +-34, + 47, + 0, +-55, + 62, + 17, +-36, + 29, +-26, +-87, + 6, +-48, +-107, + 58, + 17, +-38, + 25, +-24, +-72, + 29, +-29, +-114, + -7, +-56, +-114, + 43, + 26, + 16, + 51, + 7, +-38, + 56, + 11, +-34, + 60, + 18, +-28, + 68, + 26, +-18, + 80, + 40, + 1, + 89, + 54, + 21, + 90, + 59, + 25, + 95, + 61, + 13, +-16, +-59, +-96, + 34, +-14, +-79, + 52, + 3, +-71, + 50, + 1, +-74, + 48, + -1, +-75, + 47, + -2, +-76, + 47, + -2, +-76, + 47, + -2, +-76, + 46, + -3, +-77, + 43, + -5, +-79, + 42, + -7, +-81, + 17, + 1, +-18, + 28, + 31, + 35, + 81, + 64, + 34, + 96, + 73, + 31, + 1, + -6, +-48, +-66, +-51, +-122, +-85, +-68, +-100, +-14, +-14, +-35, + -8, +-39, +-79, + 65, + 10, +-109, + 78, + 31, +-58, + 81, + 34, +-50, + 76, + 32, +-46, + 73, + 28, +-47, + 68, + 26, +-46, + 67, + 25, +-43, + 66, + 24, +-42, + 64, + 23, +-43, + 62, + 22, +-44, + 60, + 20, +-45, + 57, + 16, +-49, + 55, + 15, +-50, + 42, + 1, +-58, + 38, + -3, +-63, + 36, + -6, +-62, + 33, +-10, +-64, + 14, +-25, +-60, + 57, + 51, + 49, +105, + 98, + 92, + 88, + 74, + 62, + 86, + 65, + 47, + 84, + 56, + 33, + 80, + 44, + 7, + 78, + 34, +-13, + 78, + 35, +-19, + 87, + 46, + -9, + 58, + 33, + 11, + 47, + 7, +-43, + 52, + 14, +-34, + 32, + 3, +-52, + 23, +-30, +-67, + 83, + 17, + -9, + 87, + 48, + 7, + 86, + 58, + 14, + 60, + 43, + 0, + 61, + 45, + 4, + 56, + 47, + 12, + 59, + 51, + 19, + 39, + 36, +-12, + 9, + 18, +-28, + 56, + 43, + 10, + 39, + 16, +-25, + 46, + 13, +-36, + 34, + -7, +-54, + 8, + -5, +-17, + 48, + 44, + 41, + 59, + 55, + 50, +121, +121, +120, +121, +121, +120, + 97, + 90, + 81, + 13, + 3, +-17, + 59, + 55, + 47, + 46, + 46, + 39, + 94, + 89, + 84, +103, + 93, + 82, +108, + 88, + 64, + 58, + 0, +-79, + 56, + 9, +-49, + 45, + -8, +-79, + 57, + 5, +-64, + 26, +-35, +-105, + 3, +-56, +-126, + 58, + 5, +-70, + 20, +-35, +-95, + 26, +-36, +-128, +-10, +-60, +-113, + 48, + 39, + 36, + 48, + 6, +-37, + 52, + 7, +-39, + 56, + 10, +-35, + 65, + 22, +-23, + 81, + 41, + 2, + 88, + 53, + 18, + 90, + 55, + 18, + 93, + 59, + 6, +-23, +-61, +-91, + 30, +-17, +-81, + 47, + -2, +-73, + 46, + -3, +-75, + 46, + -3, +-77, + 45, + -4, +-78, + 45, + -4, +-78, + 45, + -4, +-78, + 42, + -7, +-81, + 41, + -8, +-82, + 40, + -9, +-83, + 6, + 10, + 6, + 22, + 28, + 28, + 62, + 48, + 27, + 93, + 68, + 22, + 16, + 8, +-37, +-88, +-71, +-111, +-78, +-57, +-79, +-62, +-51, +-73, + 8, + -6, +-37, + 80, + 40, +-14, + 75, + 26, +-57, + 78, + 31, +-52, + 76, + 29, +-48, + 70, + 25, +-50, + 68, + 23, +-48, + 65, + 23, +-45, + 63, + 21, +-45, + 62, + 21, +-45, + 60, + 19, +-46, + 58, + 17, +-48, + 53, + 12, +-52, + 50, + 9, +-55, + 39, + -2, +-62, + 35, + -6, +-66, + 32, + -9, +-68, + 30, +-13, +-68, + 14, +-27, +-61, + 57, + 51, + 48, +105, + 97, + 92, + 90, + 72, + 57, + 85, + 59, + 36, + 81, + 48, + 16, + 76, + 36, +-10, + 74, + 29, +-22, + 76, + 31, +-24, + 85, + 43, +-12, + 82, + 51, + 21, + 0, +-34, +-77, + 57, + 2, +-57, + 25, +-11, +-76, + 14, + 10, +-36, + 92, + 60, + 15, + 76, + 48, + 0, + 58, + 38, +-14, + 16, + 12, +-37, + 19, + 13, +-30, + 40, + 30, +-14, + 34, + 28, +-13, +-24, +-15, +-66, +-35, + -9, +-52, +-44, + -7, +-38, + 12, + 25, + -1, +-45, + -6, +-41, + 48, + 14, +-37, +-25, +-24, +-48, +-36, +-28, +-48, +-27, +-24, +-44, + 83, + 80, + 76, +121, +120, +119, +112, +111, +110, + 84, + 84, + 83, +119, +119, +119, +111, +110, +109, +114, +113, +112, +120, +120, +119, +103, + 93, + 80, + 65, + 37, + 16, + 64, + 22, +-20, + 41, +-10, +-80, + 53, + 3, +-61, + 24, +-36, +-101, + -2, +-57, +-128, + 56, + 4, +-68, + 17, +-36, +-99, + 23, +-40, +-128, +-19, +-69, +-124, + 53, + 46, + 46, + 46, + 3, +-38, + 50, + 5, +-40, + 56, + 10, +-36, + 66, + 23, +-23, + 81, + 41, + 0, + 88, + 51, + 16, + 88, + 51, + 8, + 97, + 63, + 8, +-25, +-67, +-97, + 28, +-19, +-85, + 44, + -5, +-76, + 43, + -7, +-77, + 42, + -7, +-80, + 44, + -9, +-82, + 42, + -8, +-81, + 42, + -8, +-80, + 40, + -9, +-83, + 38, +-11, +-85, + 38, +-11, +-86, + 21, + 23, + 16, + 39, + 40, + 34, + 46, + 51, + 42, + 68, + 46, + 1, + 24, + 15, +-28, +-40, +-30, +-45, +-61, +-45, +-55, +-14, + -3, +-10, +-29, +-25, +-65, + 78, + 37, +-18, + 72, + 23, +-58, + 76, + 29, +-53, + 75, + 28, +-49, + 69, + 23, +-51, + 66, + 21, +-51, + 64, + 20, +-47, + 61, + 19, +-47, + 60, + 18, +-48, + 58, + 16, +-48, + 54, + 12, +-52, + 49, + 7, +-56, + 46, + 4, +-57, + 37, + -6, +-65, + 33, +-10, +-69, + 31, +-12, +-71, + 27, +-16, +-72, + 7, +-33, +-68, + 58, + 49, + 44, +107, +100, + 94, + 92, + 72, + 56, + 83, + 52, + 24, + 79, + 41, + 3, + 72, + 28, +-19, + 68, + 22, +-31, + 72, + 24, +-29, + 80, + 36, +-21, + 68, + 38, + 0, + 55, + 48, + 25, +105, + 59, +-37, + 66, + 11, +-108, + 43, + 27, +-21, + 88, + 57, + 9, + -2, + -3, +-58, +-12, +-11, +-70, + 17, + 12, +-47, + 22, + 16, +-29, + 37, + 28, +-14, + 48, + 36, + -7, + 39, + 29, +-21, +-39, +-24, +-79, + -4, + 2, +-51, +-23, + -5, +-52, + 25, + 36, + -7, + 39, + 8, +-40, +-38, +-70, +-93, +-49, +-85, +-116, +-43, +-77, +-108, + 7, + -5, +-13, + 51, + 42, + 37, + 42, + 32, + 26, + 33, + 21, + 19, + 29, + 18, + 13, + 17, + 4, + -2, + 18, + 1, + -6, + 18, + 2, + -4, +-16, +-43, +-53, +-21, +-68, +-103, + 66, + 34, + 8, + 36, + -8, +-59, + 53, + 11, +-35, + 24, +-29, +-83, + -5, +-59, +-123, + 54, + 10, +-41, + 17, +-32, +-81, + 22, +-38, +-118, +-31, +-73, +-106, + 66, + 59, + 59, + 43, + -1, +-42, + 50, + 5, +-41, + 55, + 10, +-39, + 67, + 24, +-22, + 80, + 39, + -3, + 87, + 48, + 8, + 87, + 49, + 3, +102, + 69, + 15, +-23, +-66, +-97, + 24, +-24, +-88, + 41, + -9, +-80, + 40, + -9, +-82, + 39, +-10, +-84, + 41, +-13, +-85, + 40, +-11, +-84, + 38, +-12, +-84, + 37, +-13, +-86, + 36, +-13, +-88, + 35, +-14, +-88, + 23, + 24, + 15, + 36, + 37, + 35, + 53, + 61, + 56, + -7, + 6, +-31, + 23, + 14, +-19, +-26, +-18, +-23, +-71, +-54, +-63, +-13, + -5, +-12, + 24, + 18, + -7, + 71, + 30, +-25, + 73, + 19, +-60, + 75, + 26, +-56, + 73, + 25, +-52, + 66, + 20, +-52, + 64, + 19, +-51, + 62, + 17, +-49, + 60, + 17, +-49, + 57, + 15, +-49, + 53, + 11, +-53, + 49, + 7, +-57, + 44, + 2, +-59, + 42, + -1, +-60, + 33, +-10, +-69, + 31, +-13, +-71, + 29, +-14, +-73, + 26, +-18, +-75, + 28, + 4, +-14, + 19, + -1, +-10, + 94, + 81, + 69, + 89, + 64, + 41, + 81, + 43, + 8, + 72, + 30, +-13, + 63, + 16, +-31, + 59, + 11, +-41, + 63, + 14, +-39, + 66, + 16, +-38, + 45, + 1, +-49, + 71, + 69, + 64, + 95, + 58, + 7, + 86, + 36, +-59, + 85, + 50, + -3, + 80, + 51, + 3, + 13, + 4, +-52, + 6, + 5, +-58, + 24, + 17, +-42, + 20, + 17, +-36, + 57, + 40, + -4, + 25, + 17, +-39, + 17, + 11, +-44, + 8, + 9, +-46, + 48, + 34, + -4, + 49, + 47, + 15, + 86, + 85, + 68, + 52, + 15, +-30, + -5, +-43, +-87, +-13, +-55, +-104, + -5, +-45, +-94, + 0, +-36, +-83, + 1, +-37, +-84, + -3, +-39, +-87, +-13, +-50, +-95, + -7, +-43, +-87, +-21, +-58, +-97, +-46, +-77, +-108, + 2, +-15, +-26, + -3, +-32, +-48, + 6, +-38, +-77, + 62, + 32, + 5, + 27, +-18, +-59, + 47, + 8, +-36, + 21, +-28, +-80, +-11, +-60, +-106, + 54, + 21, + -7, + 37, + 2, +-23, + 12, +-31, +-70, +-22, +-50, +-54, + 32, + 14, + 7, + 42, + -2, +-44, + 49, + 3, +-42, + 54, + 9, +-40, + 65, + 20, +-26, + 76, + 36, +-11, + 83, + 43, + -1, + 84, + 45, + -3, + 72, + 40, + -8, +-31, +-67, +-97, + 22, +-27, +-89, + 37, +-12, +-82, + 37, +-13, +-84, + 37, +-15, +-88, + 39, +-17, +-89, + 35, +-15, +-88, + 35, +-15, +-87, + 33, +-16, +-89, + 33, +-16, +-92, + 32, +-17, +-92, + 32, + 34, + 27, + 40, + 42, + 42, + 43, + 48, + 47, + 49, + 53, + 22, + 2, + 1, +-32, +-103, +-80, +-94, +-99, +-76, +-89, +-76, +-63, +-74, + 10, +-15, +-41, + 33, + -3, +-43, + 42, + 13, +-22, + 47, + 18, + -9, + 47, + 21, + -6, + 15, + -7, +-32, + 49, + 27, + -5, + 61, + 41, + 3, + 59, + 13, +-51, + 55, + 11, +-54, + 49, + 6, +-58, + 43, + 1, +-62, + 39, + -4, +-63, + 37, + -6, +-65, + 31, +-13, +-71, + 29, +-14, +-73, + 28, +-16, +-74, + 29, + -9, +-54, + 1, +-18, +-30, + 24, + 1, +-17, + 37, +-11, +-52, + 58, + 11, +-33, + 62, + 14, +-31, + 64, + 27, + -9, + 75, + 51, + 23, + 96, + 88, + 70, + 92, + 85, + 71, + 73, + 52, + 33, + 54, + 9, +-38, + 73, + 57, + 29, + 69, +-12, +-109, + 64, + 8, +-39, + 86, + 50, + -1, + 33, + 19, +-42, + -2, + -5, +-63, + 3, + 1, +-61, + 34, + 25, +-36, + 19, + 13, +-42, + 42, + 31, +-17, +-26, +-16, +-68, + 13, + 7, +-50, + 16, + 10, +-44, + 82, + 62, + 28, + 73, + 62, + 31, +101, +100, + 91, + 64, + 26, +-33, +115, +113, +109, +111, +109, +106, +118, +117, +113, +117, +116, +113, +119, +119, +113, +122, +122, +119, +118, +117, +114, +121, +121, +121, + 83, + 78, + 69, +-39, +-67, +-112, +102, +100, + 96, + 78, + 54, + 33, + 30, +-16, +-56, + 48, + 13, +-25, + 16, +-31, +-85, + 41, + -5, +-55, + -2, +-44, +-85, +-37, +-73, +-102, + 47, + 21, +-14, + 55, + 14, +-37, + 24, +-22, +-70, +-34, +-68, +-89, + 5, +-36, +-72, + 41, + -4, +-46, + 49, + 3, +-42, + 54, + 9, +-38, + 62, + 17, +-30, + 72, + 29, +-18, + 77, + 35, +-12, + 49, + 10, +-29, + 56, + 38, + 18, + 59, + 37, + 13, + 24, +-25, +-93, + 35, +-15, +-86, + 34, +-15, +-87, + 34, +-17, +-91, + 36, +-19, +-92, + 34, +-19, +-92, + 31, +-18, +-92, + 30, +-19, +-94, + 30, +-19, +-94, + 29, +-20, +-96, + 39, + 40, + 40, + 40, + 42, + 43, + 41, + 45, + 45, + 75, + 70, + 48, + 73, + 63, + 36, +-119, +-112, +-123, +-93, +-91, +-90, +-32, +-34, +-34, + 14, + 3, + 5, + 18, + 8, + 10, + 19, + 9, + 12, + 22, + 13, + 17, + 21, + 12, + 15, + 14, + 6, + 7, + 24, + 1, +-24, + 26, +-34, +-43, + 53, + 9, +-37, + 54, + 7, +-55, + 44, + 1, +-61, + 38, + -5, +-64, + 36, + -7, +-66, + 32, +-11, +-70, + 30, +-13, +-72, + 28, +-15, +-75, + 25, +-17, +-79, + 22, +-14, +-59, +-56, +-96, +-116, + 40, + 28, + 23, + 92, + 77, + 52, + 88, + 74, + 47, + 85, + 71, + 48, +105, +102, + 88, +107, +106, + 95, +103, + 99, + 84, +109, +108, + 97, +107, +105, + 96, + 75, + 48, + 16, + 76, + 64, + 44, + 86, + 28, +-87, + 74, + 9, +-82, + 66, + 39, + -9, + 20, + 8, +-50, + 37, +-13, +-57, + 39, + 28, +-12, + 61, + 44, + 0, + 37, + 28, +-20, + 33, + 27, +-11, + 7, + 9, +-44, + 25, + 18, +-38, + 15, + 7, +-48, + 85, + 63, + 26, + 81, + 69, + 41, + 89, + 89, + 70, + 66, + 31, +-33, +123, +122, +123, +119, +119, +117, +123, +123, +123, +123, +123, +123, +122, +122, +122, +122, +122, +122, +120, +120, +118, +122, +122, +122, + 91, + 84, + 73, +-24, +-51, +-98, +106, +103, + 97, + 79, + 54, + 31, + 44, + 8, +-17, + 30, +-15, +-67, + 15, +-36, +-97, + 34, +-15, +-69, + 1, +-43, +-93, +-30, +-65, +-91, + 31, +-16, +-75, + 13, +-39, +-98, + 9, +-52, +-128, +-45, +-78, +-106, + 31, + 4, + -8, + 42, + 0, +-41, + 49, + 4, +-38, + 52, + 6, +-39, + 56, + 10, +-37, + 62, + 17, +-32, + 65, + 20, +-28, + 5, +-35, +-68, + 15, +-12, +-36, + -7, +-40, +-59, + 27, +-22, +-90, + 32, +-18, +-90, + 34, +-20, +-91, + 34, +-20, +-93, + 33, +-23, +-96, + 33, +-22, +-95, + 29, +-20, +-96, + 28, +-21, +-97, + 27, +-23, +-98, + 27, +-24, +-100, + 39, + 40, + 35, + 41, + 43, + 42, + 42, + 46, + 44, + 76, + 70, + 55, +104, + 88, + 64, + 2, + -5, +-23, +-41, +-50, +-49, + 20, + 5, + -2, + 27, + 9, + -5, + 33, + 12, + 1, + 30, + 8, + -3, + 31, + 7, + -3, + 29, + 6, + -3, + 24, + 4, + -6, + 35, + 3, +-35, + 67, + 25, +-68, + 21, +-19, +-69, + 35, +-16, +-66, + 28, +-21, +-69, + 33, +-14, +-70, + 32, +-15, +-75, + 32, +-16, +-76, + 29, +-15, +-79, + 28, +-18, +-81, + 25, +-19, +-83, + 23, +-17, +-66, +-58, +-92, +-100, + 68, + 54, + 18, + 90, + 80, + 44, + 94, + 88, + 57, + 99, + 92, + 72, + 97, + 94, + 73, +103, +101, + 87, + 95, + 91, + 70, +104, +101, + 85, +102, + 99, + 84, + 82, + 71, + 48, +101, + 95, + 75, + 83, + 46, +-11, + 55, + -3, +-69, + 27, + 10, +-43, + 32, +-11, +-58, + 38, + 14, +-41, + 47, + 33, +-13, + 41, + 26, +-41, + 13, + 8, +-51, +-45, +-27, +-98, +-44, +-26, +-100, +-29, +-19, +-88, + 1, + 2, +-56, + 55, + 8, +-67, + 77, + 67, + 38, + 50, + 56, + 25, + 55, + 24, +-40, +123, +123, +123, +119, +119, +118, +123, +123, +123, +123, +123, +123, +122, +122, +122, +123, +123, +123, +119, +119, +118, +123, +123, +123, + 96, + 89, + 78, +-18, +-47, +-93, +109, +106, + 99, + 74, + 46, + 17, + 34, + 2, +-21, + 30, +-10, +-48, + 14, +-36, +-88, + 31, +-11, +-53, + 5, +-35, +-74, +-23, +-61, +-89, + 32, +-14, +-66, + 13, +-35, +-86, + 7, +-51, +-126, +-49, +-77, +-93, + 52, + 32, + 20, + 40, + 1, +-36, + 43, + -1, +-40, + 43, + -3, +-46, + 44, + -2, +-47, + 49, + -1, +-47, + 52, + 2, +-47, + 4, +-37, +-73, + 15, +-18, +-44, +-19, +-66, +-109, + 26, +-24, +-93, + 29, +-21, +-93, + 29, +-21, +-95, + 30, +-24, +-98, + 29, +-26, +-100, + 29, +-26, +-100, + 26, +-25, +-100, + 24, +-26, +-102, + 26, +-28, +-103, + 23, +-28, +-105, + 33, + 33, + 26, + 33, + 35, + 32, + 43, + 44, + 43, + 49, + 54, + 43, + 54, + 58, + 29, + 74, + 51, + 7, +-80, +-91, +-105, + 56, + 36, + 20, + 58, + 36, + 21, + 59, + 38, + 24, + 64, + 40, + 26, + 65, + 41, + 25, + 65, + 40, + 24, + 65, + 41, + 20, + 48, + 17, + -8, + 10, +-44, +-116, + 4, +-38, +-84, + 25, +-14, +-59, + 22, +-19, +-66, + 30, +-18, +-79, + 31, +-17, +-79, + 30, +-18, +-79, + 30, +-18, +-80, + 28, +-20, +-81, + 30, + -8, +-59, + 32, + 0, +-40, + 73, + 61, + 22, + 86, + 74, + 34, + 74, + 63, + 19, + 87, + 76, + 45, +103, +101, + 87, +100, + 98, + 83, +101, + 99, + 84, + 86, + 82, + 63, + 95, + 88, + 65, + 98, + 93, + 61, +101, + 93, + 53, +102, + 97, + 51, +101, + 92, + 56, +106, +102, + 77, + 43, + 37, + 13, + 8, + -9, +-62, + 8, +-36, +-81, + 33, + 19, +-38, + 25, + 17, +-36, +-22, +-17, +-77, +-85, +-45, +-118, +-80, +-43, +-118, +-46, +-25, +-90, + 20, + 14, +-41, + 25, + 17, +-38, + 18, + 16, +-28, + 30, + 22, +-19, + 46, + 14, +-49, +109, +107, + 96, +120, +120, +119, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +119, +119, +119, +123, +123, +123, + 92, + 87, + 76, +-22, +-54, +-98, +109, +106, + 99, + 63, + 28, +-15, + 41, + 12, + -8, + 31, +-10, +-49, + 11, +-37, +-85, + 30, + -7, +-41, + 16, +-25, +-63, + 7, +-35, +-69, + 33, + -8, +-50, + 14, +-32, +-75, + 1, +-50, +-95, + -5, +-32, +-45, + 1, +-29, +-42, +-14, +-50, +-76, +-20, +-61, +-93, +-20, +-63, +-97, +-23, +-64, +-99, + -9, +-56, +-97, + -1, +-50, +-95, +-10, +-57, +-100, + 26, + -2, +-24, +-23, +-71, +-118, + 24, +-26, +-96, + 26, +-23, +-98, + 26, +-24, +-100, + 25, +-26, +-102, + 26, +-29, +-104, + 26, +-30, +-105, + 24, +-29, +-105, + 24, +-32, +-107, + 24, +-32, +-108, + 20, +-33, +-111, + 31, + 32, + 24, + 32, + 34, + 30, + 35, + 37, + 37, + 47, + 51, + 46, + 40, + 49, + 22, + 89, + 81, + 53, +-58, +-75, +-85, +-46, +-80, +-92, +-43, +-80, +-91, +-43, +-81, +-94, +-47, +-85, +-99, +-51, +-89, +-104, +-54, +-93, +-107, +-57, +-98, +-113, +-60, +-103, +-120, + 8, +-19, +-44, + 20, + -6, +-42, + 31, + 2, +-39, + 25, +-10, +-53, + 28, +-19, +-81, + 29, +-19, +-79, + 29, +-19, +-78, + 27, +-20, +-81, + 52, + 27, +-11, + 98, + 92, + 69, + 95, + 86, + 54, + 87, + 72, + 27, + 79, + 56, + -1, + 81, + 67, + 32, + 99, + 90, + 61, +102, + 98, + 81, +105, +102, + 82, +106, +105, + 88, + 99, + 97, + 78, +108, +106, + 90, + 99, + 95, + 71, + 97, + 89, + 48, +100, + 95, + 64, +104, + 99, + 57, + 97, + 90, + 40, + 95, + 89, + 58, + 28, +-11, +-39, + 0, +-21, +-70, + 20, + 4, +-49, +-28, +-20, +-84, + 14, + 2, +-59, + 43, + 25, +-19, +-19, +-14, +-70, +-18, +-12, +-73, + 9, + 4, +-55, + 38, + 23, +-29, + 27, + 12, +-34, +-15, +-37, +-79, + 34, + -5, +-53, + 83, + 66, + 34, +112, +112, +111, +116, +116, +116, +116, +116, +116, +115, +115, +115, +115, +115, +115, + 98, + 98, + 94, +106, +106, +106, + 61, + 58, + 50, +-42, +-77, +-114, +101, +100, + 96, + 50, + 6, +-44, + 37, + 6, +-16, + 29, +-17, +-69, + 12, +-39, +-95, + 22, +-20, +-61, + 19, +-25, +-67, + 13, +-26, +-52, + 62, + 48, + 44, + 78, + 73, + 85, + 81, + 80, + 95, + 69, + 63, + 71, + 64, + 51, + 49, + 66, + 47, + 35, + 63, + 40, + 26, + 50, + 30, + 16, + 53, + 31, + 18, + 57, + 38, + 24, + 66, + 48, + 33, + 29, + 5, +-11, + 37, + 9, +-14, + 9, +-40, +-85, + 23, +-27, +-102, + 23, +-26, +-102, + 25, +-28, +-103, + 24, +-32, +-107, + 22, +-34, +-111, + 20, +-32, +-106, + 25, +-25, +-77, + 22, +-19, +-62, + 14, +-27, +-60, + 10, +-28, +-67, + 25, + 27, + 17, + 29, + 31, + 27, + 23, + 27, + 28, + 35, + 39, + 40, + 40, + 49, + 33, + 76, + 72, + 49, + 25, + 25, + 4, +-108, +-125, +-125, +-103, +-125, +-126, +-100, +-125, +-126, +-101, +-122, +-125, +-94, +-121, +-126, +-95, +-112, +-118, +-93, +-113, +-118, +-74, +-100, +-110, + -4, +-26, +-52, +-15, +-42, +-70, + 20, + -7, +-42, + 15, +-24, +-61, + 26, +-21, +-83, + 26, +-22, +-84, + 26, +-22, +-84, + 45, + 12, +-29, + 84, + 68, + 31, + 97, + 85, + 55, + 97, + 91, + 73, + 79, + 61, + 7, + 57, + 38, +-10, + 97, + 89, + 56, + 95, + 89, + 66, + 99, + 93, + 71, +101, + 95, + 73, +109, +107, + 93, +104, + 99, + 78, +106, +102, + 76, + 97, + 94, + 72, + 57, + 50, + 11, + 92, + 86, + 51, +100, + 96, + 68, +105, + 97, + 62, +106, + 97, + 55, + 98, + 90, + 60, + 79, + 57, + 31, + 50, + 20, +-24, + 43, + 20, +-31, + 52, + 29, +-21, + 39, + 21, +-29, + 75, + 41, +-14, + 61, + 35, +-19, + 54, + 31, +-25, + 41, + 23, +-34, + 27, + 9, +-45, + 40, + 39, + 6, + 20, +-24, +-71, + 63, + 34, + 1, + 76, + 63, + 49, + 99, + 99, + 98, +101, +101, +102, +101, +101, +102, +100, +100, +101, + 97, + 97, + 96, +100, +100, + 98, + 59, + 58, + 58, +-63, +-103, +-124, + 90, + 87, + 85, + 36, +-22, +-89, + 36, + 5, +-19, + 26, +-26, +-85, + 16, +-40, +-114, + 20, +-29, +-90, + 18, +-29, +-80, + 19, +-12, +-35, + 85, + 65, + 55, + 92, + 79, + 82, + 88, + 82, + 90, + 86, + 79, + 80, + 87, + 76, + 73, + 87, + 74, + 69, + 87, + 72, + 65, + 87, + 72, + 65, + 91, + 75, + 66, + 92, + 75, + 60, + 91, + 71, + 54, + 43, + 18, + 3, + 27, + 9, +-13, + 26, + 9, +-11, + 2, +-19, +-46, +-15, +-33, +-52, +-12, +-28, +-49, +-19, +-31, +-50, +-26, +-36, +-53, +-34, +-42, +-61, +-36, +-49, +-71, +-44, +-57, +-76, +-38, +-50, +-71, +-49, +-63, +-88, + 12, + 17, + 7, + 15, + 18, + 13, + 20, + 24, + 17, + 29, + 31, + 27, + 44, + 49, + 42, + 47, + 54, + 28, + 88, + 77, + 57, +-12, + 4, +-11, + -6, + 9, + -5, + -7, + 9, + -5, +-12, + 5, +-11, + -9, + 9, + -9, +-14, + 5, +-11, +-11, + 8, + -9, + -6, + 11, + -5, + 1, + 14, + 2, + 42, + 48, + 41, +-34, +-52, +-64, + -1, +-39, +-73, + 24, +-24, +-86, + 24, +-24, +-86, + 30, +-14, +-68, + 85, + 69, + 31, + 95, + 81, + 47, +112, +108, + 93, + 95, + 91, + 69, + 27, + 14, +-28, + 65, + 47, + -2, + 82, + 64, + 18, + 94, + 86, + 60, + 99, + 92, + 71, + 95, + 86, + 57, + 98, + 94, + 74, +107, +105, + 93, + 96, + 95, + 74, + 95, + 92, + 72, + 71, + 68, + 41, + 47, + 40, + -7, + 54, + 53, + 27, + 79, + 76, + 46, +102, + 98, + 63, +107, +103, + 79, +101, + 96, + 70, + 64, + 27, +-15, + 65, + 4, +-29, + 65, + 2, +-31, + 82, + 25, +-30, + 81, + 30, +-34, + 60, + 28, +-33, + 42, + 23, +-37, + 30, + 16, +-42, + 36, + 25, +-26, + 56, + 54, + 27, + 41, + -8, +-66, + 43, + 8, +-28, + 46, + 13, +-24, + 45, + 25, + -3, + 49, + 33, + 9, + 46, + 30, + 8, + 43, + 29, + 8, + 48, + 37, + 17, + 48, + 39, + 20, + 20, + 15, + 5, +-75, +-117, +-125, + 66, + 54, + 48, + 31, +-20, +-78, + 41, + 17, + 0, + 24, +-26, +-81, + 16, +-38, +-106, + 20, +-28, +-81, + 17, +-29, +-77, + 58, + 37, + 22, +101, + 84, + 68, +107, + 93, + 81, +107, + 93, + 79, +107, + 93, + 79, +106, + 90, + 75, +104, + 86, + 68, +102, + 82, + 62, +101, + 77, + 49, +102, + 77, + 47, +102, + 75, + 43, +100, + 67, + 24, + 36, + 11, +-24, +-37, +-47, +-69, +-23, +-42, +-72, +-26, +-48, +-78, +-30, +-52, +-86, +-26, +-47, +-74, +-37, +-58, +-88, +-34, +-55, +-89, +-33, +-51, +-78, +-50, +-64, +-94, +-45, +-63, +-97, +-42, +-63, +-90, +-60, +-74, +-103, + 10, + 11, + -2, + 19, + 20, + 7, + 24, + 27, + 16, + 31, + 33, + 27, + 34, + 38, + 38, + 18, + 34, + 6, + 35, + 46, + 18, +-36, +-24, +-46, +-63, +-38, +-51, +-64, +-39, +-52, +-62, +-38, +-50, +-61, +-36, +-48, +-59, +-34, +-47, +-59, +-34, +-46, +-60, +-35, +-46, +-51, +-28, +-38, + 27, + 39, + 35, +-46, +-48, +-49, +-19, +-49, +-73, + 20, +-28, +-89, + 20, +-27, +-90, + 59, + 31, +-16, + 83, + 61, + 11, +100, + 90, + 66, +105, + 95, + 73, + 81, + 75, + 56, +-28, +-42, +-105, + 29, + 15, +-24, + 78, + 56, + 3, + 83, + 69, + 31, +102, + 97, + 77, +107, +104, + 87, +103, + 99, + 77, +102, +101, + 89, + 55, + 54, + 36, + 96, + 91, + 68, + 99, + 94, + 67, + 50, + 49, + 32, + 73, + 68, + 42, +101, + 94, + 60, +112, +109, + 91, +110, +106, + 81, +104, + 99, + 74, + 81, + 60, + 40, + 47, +-13, +-44, + 82, + 29, +-20, + 73, + 22, +-10, + 76, + 28, +-10, + 82, + 47, + 13, + 77, + 58, + 28, + 55, + 45, + 16, + 55, + 48, + 16, + 68, + 64, + 37, + 48, + 2, +-49, + 43, + 5, +-44, + 45, + 7, +-41, + 41, + 11, +-36, + 46, + 19, +-21, + 44, + 19, +-21, + 43, + 20, +-21, + 47, + 25, +-14, + 46, + 25, +-13, + 19, + 3, +-28, +-84, +-123, +-126, + 38, + 15, + -6, + 29, +-13, +-51, + 38, + 21, + 11, + 24, +-25, +-77, + 15, +-32, +-88, + 16, +-20, +-54, + 16, +-24, +-65, + 33, + -2, +-29, + 79, + 48, + 20, + 89, + 64, + 45, +101, + 81, + 62, + 93, + 74, + 56, + 98, + 78, + 60, + 96, + 71, + 49, + 89, + 55, + 24, + 85, + 48, + 6, + 84, + 45, + 2, + 78, + 33, +-15, + 73, + 24, +-29, + 42, + 13, +-28, +-44, +-54, +-77, +-27, +-52, +-83, +-35, +-57, +-91, +-35, +-56, +-93, +-42, +-63, +-99, +-34, +-58, +-95, +-47, +-66, +-102, +-46, +-66, +-101, +-51, +-68, +-102, +-54, +-74, +-111, +-56, +-73, +-108, +-63, +-80, +-115, + 1, + 2, +-13, + 11, + 11, + -1, + 19, + 19, + 5, + 20, + 22, + 17, + 20, + 23, + 18, + 26, + 36, + 18, + 40, + 48, + 25, + 10, + 9, +-23, +-66, +-41, +-54, +-65, +-40, +-52, +-64, +-40, +-51, +-64, +-40, +-50, +-60, +-36, +-47, +-60, +-36, +-47, +-58, +-34, +-44, +-49, +-27, +-36, + 19, + 32, + 28, +-19, +-18, +-20, +-18, +-47, +-73, + 47, + 5, +-37, + 46, + 4, +-39, + 68, + 40, + -8, + 81, + 59, + 10, + 99, + 87, + 61, + 91, + 81, + 50, + 23, + 5, +-50, +-83, +-85, +-121, +-27, +-33, +-58, + 91, + 76, + 43, + 95, + 88, + 61, +102, + 97, + 74, + 96, + 91, + 69, +104, + 99, + 79, +102, + 98, + 78, + 98, + 93, + 73, +104, + 98, + 74, + 99, + 94, + 72, +107, +104, + 87, + 50, + 41, + 1, +103, + 93, + 52, +107, +102, + 70, +107, +102, + 79, +107, +104, + 83, + 60, + 62, + 38, + 69, + 72, + 51, + 86, + 90, + 72, + 63, + 72, + 48, + 81, + 86, + 66, + 97, + 98, + 82, + 85, + 88, + 71, + 51, + 59, + 32, + 52, + 57, + 30, + 49, + 45, + 6, + 64, + 54, + 17, + 54, + 23, +-19, + 57, + 25, +-18, + 53, + 33, + 3, + 64, + 49, + 30, + 63, + 52, + 33, + 64, + 54, + 35, + 67, + 58, + 41, + 65, + 57, + 44, + 33, + 28, + 20, +-89, +-123, +-126, + 43, + 25, + 10, + 23, +-19, +-56, + 45, + 31, + 26, + 19, +-30, +-93, + 14, +-34, +-94, + 18, +-17, +-51, + 14, +-24, +-63, +-12, +-56, +-86, + 35, +-10, +-37, + 54, + 8, +-22, + 33, + -8, +-35, + 22, +-13, +-35, + 18, + -9, +-29, + 10, +-21, +-43, + 23, + -8, +-34, + 25, +-10, +-40, + 29, + -8, +-47, + 21, +-17, +-58, + 17, +-25, +-68, +-10, +-40, +-64, +-44, +-50, +-73, +-55, +-67, +-102, +-43, +-66, +-100, +-45, +-65, +-104, +-53, +-69, +-106, +-48, +-70, +-109, +-49, +-70, +-110, +-58, +-73, +-113, +-58, +-75, +-114, +-59, +-78, +-115, +-63, +-80, +-118, +-17, +-21, +-29, +-17, +-15, +-30, +-12, +-11, +-26, + -2, + -1, +-16, + 8, + 10, + 1, + 15, + 17, + 10, + 22, + 30, + 20, + 32, + 40, + 19, + 34, + 24, +-15, + 7, + -3, +-35, +-69, +-46, +-56, +-68, +-46, +-55, +-69, +-46, +-55, +-67, +-44, +-54, +-63, +-41, +-50, +-60, +-37, +-47, +-55, +-32, +-42, + 8, + 24, + 19, + -9, +-12, +-17, + -5, +-50, +-78, + 16, +-25, +-58, + 17, +-25, +-58, + 27, +-11, +-50, + 72, + 45, +-15, + 89, + 77, + 52, + 93, + 88, + 66, + 3, +-10, +-44, +-61, +-63, +-91, + 64, + 46, + -4, + 75, + 54, + 5, + 80, + 65, + 32, + 97, + 92, + 73, +104, +102, + 87, + 89, + 79, + 50, + 92, + 84, + 55, + 97, + 88, + 59, + 98, + 94, + 75, +107, +104, + 88, +107, +104, + 89, + 30, + 22, + -7, + 93, + 83, + 46, +105, + 99, + 75, +108, +102, + 74, +100, + 96, + 74, + 40, + 9, +-32, + 41, + -6, +-62, + 92, + 81, + 54, + 66, + 58, + 30, + 44, + 47, + 14, + 56, + 57, + 19, + 61, + 58, + 18, + 76, + 70, + 36, + 73, + 68, + 35, + 76, + 72, + 44, + 70, + 61, + 30, + 52, + 20, +-27, + 62, + 28, +-14, + 61, + 42, + 17, + 71, + 59, + 43, + 69, + 57, + 41, + 66, + 53, + 38, + 67, + 55, + 39, + 58, + 46, + 30, + 27, + 18, + 3, +-92, +-124, +-126, + 23, +-11, +-46, + 20, +-30, +-86, + 51, + 33, + 24, + 13, +-42, +-128, + 13, +-40, +-112, + 16, +-31, +-92, + 9, +-36, +-87, +-28, +-72, +-106, + 23, +-21, +-66, + 4, +-43, +-91, + -7, +-60, +-99, +-20, +-59, +-84, + 1, +-40, +-66, + -1, +-40, +-78, + 4, +-26, +-50, + -7, +-18, +-39, + 6, + 1, +-22, + 1, + 0, +-21, + 2, + 1, +-23, + 0, + 2, +-23, + -3, + 1, +-21, + 2, + 4, +-16, + -2, + 0, +-21, +-12, +-10, +-31, +-28, +-28, +-50, +-35, +-35, +-58, +-47, +-48, +-75, +-52, +-57, +-86, +-62, +-70, +-102, +-63, +-74, +-110, + 37, + 40, + 36, + 34, + 32, + 14, +-30, +-31, +-53, +-35, +-32, +-49, +-32, +-28, +-40, +-32, +-26, +-32, +-27, +-20, +-24, + -5, + 1, + -5, + 9, + 15, + 9, + 30, + 30, + 4, + 44, + 39, + 14, + 17, + 26, + 11, + 20, + 29, + 14, + 20, + 29, + 16, + 14, + 25, + 14, + 4, + 16, + 5, +-12, + 2, + -8, +-51, +-31, +-40, + 2, + 18, + 12, + -8, +-12, +-16, + -5, +-51, +-79, + 12, +-30, +-63, + 10, +-29, +-64, + 34, + 2, +-41, + 59, + 28, +-28, + 73, + 54, + 15, + 91, + 85, + 66, + 36, + 20, +-15, + 23, + 10, +-33, + 40, + 20, +-41, + 68, + 48, + -3, + 74, + 55, + 16, + 78, + 66, + 40, + 82, + 75, + 56, + 77, + 64, + 37, + 83, + 68, + 31, + 87, + 78, + 43, + 95, + 88, + 65, +108, +105, + 84, + 99, + 95, + 77, + 50, + 47, + 33, + 79, + 67, + 33, + 95, + 87, + 55, +100, + 93, + 60, + 76, + 70, + 44, + 4, +-23, +-53, + 40, + 13, +-16, + 50, + 41, + 31, + 71, + 59, + 38, + 41, + 37, + -6, + 18, + 22, +-19, + 36, + 35, +-17, + 64, + 52, + 8, + 64, + 53, + 18, + 77, + 48, + 17, + 80, + 59, + 30, + 78, + 52, + 25, + 70, + 42, + 7, + 53, + 30, + 2, + 65, + 51, + 32, + 65, + 51, + 33, + 62, + 48, + 31, + 68, + 55, + 39, + 44, + 30, + 13, + 11, + 0, +-13, +-95, +-124, +-125, + 22, +-23, +-75, + 26, +-25, +-77, + 47, + 32, + 29, + 10, +-45, +-127, + 12, +-41, +-112, + 25, +-26, +-91, + 11, +-36, +-88, +-21, +-69, +-104, + 12, +-35, +-84, + 15, +-34, +-95, +-20, +-74, +-120, +-47, +-91, +-125, + -7, +-60, +-118, + 10, +-31, +-79, + 33, + 17, + 1, + 31, + 33, + 30, + 44, + 45, + 46, + 6, + 8, + 3, + -5, + -2, +-16, +-13, +-11, +-31, +-12, +-11, +-32, +-17, +-16, +-38, +-19, +-18, +-38, +-21, +-19, +-38, +-37, +-34, +-56, +-44, +-43, +-65, +-50, +-51, +-78, +-48, +-51, +-80, +-56, +-62, +-93, + -5, + -6, +-12, + 51, + 49, + 39, + -3, + -7, +-30, +-71, +-64, +-72, +-79, +-71, +-77, +-75, +-66, +-76, +-58, +-49, +-60, +-37, +-28, +-38, +-11, + -2, +-15, + 12, + 23, + 8, + 36, + 46, + 28, + 46, + 54, + 37, + 53, + 60, + 43, + 56, + 63, + 47, + 57, + 66, + 50, + 59, + 69, + 59, + 62, + 72, + 64, + 62, + 72, + 64, + 55, + 65, + 59, + 38, + 51, + 45, +-14, +-17, +-20, +-23, +-67, +-92, + -7, +-46, +-77, + -7, +-44, +-77, + 2, +-32, +-64, + 14, +-15, +-57, + 29, + 7, +-29, + 40, + 19, +-21, + 0, +-32, +-68, +-58, +-69, +-87, + 56, + 38, +-14, + 97, + 91, + 63, + 86, + 81, + 51, + 31, + 24, +-12, +-46, +-46, +-76, + 49, + 42, + 17, + 89, + 75, + 44, + 95, + 90, + 68, +103, +100, + 87, + 97, + 93, + 70, + 88, + 86, + 69, +-14, +-16, +-24, + 19, + 12, +-13, + 63, + 59, + 37, + 72, + 69, + 52, + -4, + -9, +-18, +-98, +-114, +-120, +-72, +-81, +-79, +-13, +-28, +-27, + 51, + 18, + -4, + 7, + 9, +-35, + 23, + 25, +-27, + 32, + 32, +-19, + 55, + 45, + -2, + 4, + 2, +-28, + 71, + 45, + 23, + 55, +-21, +-45, + 17, +-17, +-41, + 21, + -1, +-40, + 21, + 9, + -2, + 28, + 18, + 12, + 1, + -6, + -8, + 12, + 0, + -9, + -2, +-23, +-41, + 17, + -6, +-26, + 8, +-11, +-30, +-101, +-124, +-124, + 18, +-29, +-80, + 30, + -7, +-38, + 39, + 20, + 18, + 8, +-45, +-125, + 12, +-36, +-88, + 13, +-30, +-72, + 2, +-41, +-80, +-21, +-69, +-107, + -1, +-45, +-79, + 22, +-22, +-68, +-37, +-88, +-127, +-48, +-92, +-121, +-14, +-61, +-116, + 5, +-35, +-80, + 29, + 19, + 10, + 33, + 34, + 36, + 62, + 63, + 67, + 21, + 23, + 20, + 16, + 17, + 6, + 17, + 15, + -1, + 0, + 3, +-12, + 1, + 1, +-16, + -8, + -5, +-26, +-11, + -9, +-30, +-17, +-18, +-41, +-35, +-37, +-63, +-48, +-53, +-83, +-56, +-65, +-95, +-52, +-61, +-91, + 17, + 13, + 10, + 11, + 10, + -2, + -2, +-10, +-29, +-25, +-16, +-40, +-11, + -1, +-28, + 1, + 13, +-15, + 10, + 22, + -4, + 16, + 27, + 2, + 20, + 30, + 4, + 22, + 33, + 10, + 29, + 39, + 18, + 27, + 39, + 19, + 35, + 45, + 27, + 49, + 58, + 41, + 54, + 65, + 48, + 58, + 69, + 58, + 53, + 64, + 56, + 53, + 62, + 57, + 58, + 67, + 62, + 59, + 66, + 61, +-12, +-16, +-19, +-50, +-97, +-123, +-57, +-101, +-126, +-61, +-106, +-125, +-61, +-105, +-126, +-57, +-102, +-126, +-55, +-94, +-112, +-46, +-76, +-92, +-61, +-103, +-121, +-20, +-64, +-105, + 42, + 30, + -8, + 78, + 64, + 16, + 79, + 67, + 20, + 18, + 1, +-59, +-109, +-95, +-118, + -9, +-15, +-51, + 37, + 17, +-23, + 54, + 39, + 8, + 58, + 53, + 37, + 42, + 38, + 19, + 30, + 30, + 23, +-72, +-76, +-84, +-101, +-82, +-117, +-97, +-87, +-123, +-63, +-104, +-108, +-52, +-93, +-98, +-55, +-96, +-94, +-54, +-87, +-83, +-32, +-52, +-50, + -9, +-42, +-55, + 11, + 11, +-10, + 2, + 6, +-12, + 31, + 29, + 10, + 38, + 33, + 4, + 38, + 31, + -7, + 50, + 26, +-18, + 72, + 38, + -5, +-74, +-37, +-80, +-18, + -5, +-42, +-50, +-95, +-120, +-53, +-97, +-120, +-58, +-100, +-121, +-51, +-88, +-99, +-23, +-41, +-43, +-35, +-57, +-56, +-52, +-74, +-72, +-99, +-117, +-117, + 6, +-37, +-83, + 15, +-18, +-48, + 25, + -6, +-19, + 3, +-51, +-127, + 15, +-32, +-85, + 27, +-14, +-63, + -3, +-43, +-83, +-25, +-70, +-108, +-32, +-69, +-91, + 13, +-28, +-70, +-46, +-82, +-104, +-50, +-92, +-120, +-15, +-62, +-114, +-60, +-103, +-124, + 10, + 6, + -2, + 28, + 29, + 23, + 78, + 79, + 81, + 43, + 44, + 41, + 36, + 39, + 25, + 9, + 14, + 2, + 6, + 5, +-10, + 4, + 7, + -6, + 27, + 27, + 17, + 2, + 4, + -2, +-15, +-13, +-30, +-16, +-23, +-49, +-39, +-51, +-82, +-48, +-60, +-88, +-68, +-77, +-98, +-45, +-47, +-52, +-27, +-30, +-42, +-49, +-57, +-75, + -2, + 8, +-22, + 2, + 12, +-21, + 8, + 18, +-16, + 12, + 22, +-12, + 16, + 26, + -7, + 20, + 31, + -2, + 22, + 33, + 1, + 28, + 38, + 8, + 34, + 44, + 14, + 37, + 45, + 21, + 34, + 46, + 23, + 43, + 55, + 37, + 39, + 53, + 41, + 47, + 58, + 51, + 60, + 68, + 64, + 59, + 65, + 61, + 59, + 64, + 60, +-12, +-14, +-19, +-31, +-76, +-114, +-12, +-61, +-116, + -5, +-56, +-112, +-13, +-61, +-114, + -1, +-45, +-89, + 3, +-40, +-80, + 2, +-37, +-77, + -1, +-40, +-79, +-29, +-67, +-97, +-11, +-21, +-54, + 67, + 49, + -2, + 56, + 43, + 0, + 66, + 50, + 1, + 72, + 64, + 26, + 76, + 69, + 27, + 55, + 53, + 31, +-76, +-63, +-98, +-32, + -7, +-89, +-76, +-54, +-113, +-107, +-82, +-117, +-68, +-67, +-69, +-98, +-76, +-116, +-48, +-47, +-50, +-20, +-25, +-21, +-41, +-51, +-51, +-16, +-25, +-22, +-32, +-42, +-38, +-48, +-63, +-61, +-53, +-65, +-68, + 59, + 57, + 57, + 74, + 73, + 76, + 97, + 97, + 99, + 59, + 56, + 52, + 6, + -6, +-19, + 1, +-19, +-71, + 26, + -7, +-60, + -2, +-14, +-43, + 35, + 24, + 5, +106, +106, +106, +104, +105, +106, +103, +103, +104, +100, +100, +102, + 94, + 95, +100, + 85, + 87, + 93, + 71, + 74, + 83, +-60, +-61, +-60, + 75, + 77, + 86, + 68, + 72, + 80, + 63, + 67, + 76, + 59, + 60, + 71, + 53, + 56, + 64, + 40, + 43, + 52, + 19, + 12, + 17, +-18, +-56, +-81, + 17, + 7, + 5, + 19, + 4, + 3, + 16, + 1, + -6, +-22, +-43, +-56, +-10, +-48, +-79, + -2, +-40, +-76, +-10, +-41, +-82, + 9, + 5, + -7, + 67, + 69, + 69, + 57, + 59, + 57, + 45, + 47, + 43, + 47, + 46, + 37, + 19, + 19, + 9, + 17, + 21, + 12, + 24, + 21, + 8, + 39, + 39, + 30, + 1, + -6, +-26, +-47, +-64, +-97, +-36, +-55, +-89, +-52, +-64, +-92, +-54, +-70, +-99, +-63, +-70, +-94, +-69, +-81, +-114, +-90, +-103, +-122, + 6, + 16, +-17, + 12, + 22, +-11, + 15, + 25, + -9, + 19, + 28, + -8, + 25, + 33, + -2, + 26, + 35, + 0, + 27, + 37, + 3, + 28, + 37, + 5, + 28, + 37, + 4, + 30, + 39, + 11, + 28, + 38, + 13, + 16, + 29, + 10, + 43, + 52, + 42, + 51, + 60, + 52, + 57, + 63, + 57, + 56, + 61, + 57, + 50, + 55, + 51, +-19, +-19, +-23, + 21, + -7, +-39, + 53, + 19, +-20, + 44, + 2, +-32, + 41, + 7, +-27, + 46, + 21, + -7, + 57, + 27, + 6, + 60, + 35, + 11, + 35, + 7, +-16, +-20, +-45, +-72, +-31, +-53, +-95, + 5, + -5, +-36, + 59, + 49, + 18, + 57, + 51, + 19, + 60, + 52, + 23, + 36, + 35, + 21, + 2, + 4, + -3, +-99, +-86, +-114, +-36, +-15, +-78, +-26, + -2, +-86, +-38, +-28, +-48, + 32, + 31, + 32, + 46, + 45, + 46, + 48, + 47, + 47, + 53, + 51, + 52, + 57, + 55, + 56, + 58, + 57, + 57, + 62, + 61, + 61, + 58, + 57, + 58, + 68, + 67, + 67, + 70, + 66, + 59, + 91, + 90, + 84, +105, +104, + 99, + 49, + 46, + 36, +-11, +-23, +-28, +-65, +-92, +-120, +-62, +-83, +-117, +-11, +-42, +-84, + 63, + 38, + 19, + 91, + 90, + 95, + 86, + 85, + 91, + 93, + 92, + 98, + 96, + 95, +102, + 99, +100, +106, +100, +101, +109, + 99, +100, +108, +-28, +-28, +-28, + 95, +100, +110, + 87, + 92, +106, + 81, + 87, +102, + 82, + 87, +102, + 78, + 83, + 98, + 78, + 82, + 97, + 52, + 52, + 58, + -6, +-31, +-40, + 72, + 76, + 89, + 64, + 66, + 81, + 61, + 64, + 78, + 50, + 52, + 66, + 42, + 42, + 54, + 38, + 35, + 43, + 26, + 23, + 22, + 4, + 5, + 4, +-27, +-26, +-29, + 23, + 23, + 20, + 50, + 51, + 49, + 56, + 57, + 54, + 41, + 42, + 39, + 44, + 46, + 40, + 39, + 40, + 33, + 35, + 34, + 25, +-21, +-36, +-66, +-39, +-60, +-97, +-49, +-66, +-99, +-51, +-68, +-104, +-58, +-74, +-109, +-77, +-90, +-118, +-85, +-95, +-122, +-68, +-87, +-118, + 16, + 25, + -4, + 15, + 24, + -5, + 19, + 28, + -4, + 23, + 31, + -2, + 25, + 33, + -1, + 33, + 41, + 7, + 32, + 41, + 8, + 30, + 40, + 8, + 35, + 43, + 14, + 18, + 27, + 0, + 8, + 18, + -4, + 27, + 36, + 18, + 47, + 54, + 44, + 48, + 54, + 47, + 55, + 61, + 55, + 27, + 33, + 29, + 10, + 19, + 14, +-23, +-24, +-27, + 47, + 22, + 0, + 79, + 50, + 28, + 72, + 49, + 27, + 68, + 49, + 24, + 88, + 60, + 27, + 88, + 59, + 30, + 47, + 18, +-14, +-32, +-55, +-81, +-38, +-60, +-106, +-34, +-56, +-98, +-31, +-53, +-97, +-17, +-32, +-55, + -7, +-11, +-18, +-15, +-14, +-18, +-100, +-100, +-123, +-61, +-56, +-75, +-23, +-22, +-40, +-78, +-65, +-118, +-53, +-48, +-70, + 0, + 2, + -1, + 51, + 51, + 52, + 61, + 61, + 63, + 56, + 56, + 58, + 58, + 58, + 61, + 61, + 61, + 63, + 65, + 65, + 66, + 68, + 68, + 70, + 46, + 46, + 47, + 73, + 73, + 72, + 68, + 63, + 50, +107, +104, + 96, + 92, + 90, + 80, + 65, + 62, + 55, +-39, +-44, +-74, +-36, +-27, +-80, + 26, + 10, +-36, + 79, + 30, +-10, + 71, + 40, + 29, + 98, + 94, +101, + 92, + 90, + 98, + 95, + 93, +103, + 95, + 95, +103, + 90, + 89, + 98, + 97, + 96, +103, + 87, + 85, + 95, + 39, + 37, + 43, + 58, + 52, + 56, + 80, + 77, + 86, + 81, + 81, + 93, + 75, + 75, + 88, + 78, + 77, + 92, + 81, + 81, + 95, + 58, + 57, + 65, + 20, + 10, + 14, + 48, + 50, + 65, + 68, + 68, + 90, + 60, + 63, + 85, + 54, + 56, + 77, + 63, + 64, + 82, + 60, + 62, + 75, + 55, + 55, + 61, + 19, + 22, + 16, + -9, + -8, +-17, +-65, +-69, +-81, +-59, +-61, +-71, +-16, +-17, +-21, + 32, + 33, + 32, + 50, + 48, + 45, + 59, + 59, + 57, + 27, + 26, + 17, +-28, +-45, +-77, +-49, +-61, +-93, +-51, +-65, +-99, +-56, +-70, +-104, +-36, +-42, +-63, + 6, + 5, + -9, + 20, + 21, + 4, + 11, + 11, + -5, + 31, + 40, + 20, + 32, + 40, + 17, + 33, + 40, + 14, + 39, + 46, + 20, + 39, + 46, + 18, + 36, + 44, + 16, + 36, + 44, + 17, + 23, + 32, + 6, + 5, + 13, +-11, + 14, + 22, + -2, + 20, + 27, + 4, + 30, + 35, + 17, + 41, + 47, + 34, + 38, + 44, + 37, + 5, + 12, + 7, + 34, + 40, + 36, + 30, + 39, + 33, +-18, +-21, +-24, + 59, + 43, + 31, + 79, + 70, + 57, + 75, + 70, + 59, + 93, + 85, + 75, + 99, + 83, + 68, + 47, + 33, + 18, +-34, +-57, +-84, +-43, +-65, +-111, +-41, +-63, +-111, +-40, +-63, +-105, +-37, +-59, +-106, +-40, +-62, +-110, + 28, + 25, + 23, +-78, +-79, +-116, +-73, +-63, +-118, +-44, +-41, +-68, +-27, +-30, +-45, +-51, +-46, +-78, +-40, +-47, +-58, +-53, +-59, +-53, +-49, +-55, +-49, +-38, +-46, +-39, +-44, +-50, +-46, +-39, +-47, +-42, +-35, +-43, +-38, +-35, +-42, +-38, +-32, +-39, +-37, +-40, +-47, +-47, + -2, + -8, +-10, + 88, + 82, + 68, +107, +103, + 91, + 85, + 80, + 65, + 49, + 43, + 34, + -8, +-35, +-62, + 19, + -1, +-34, + 30, + 14, +-18, + 47, + 16, +-21, + 65, + 50, + 40, +109, +108, +109, +109, +109, +110, +102, +101, +102, +103, +102, +103, +104, +103, +105, +104, +104, +105, + 99, + 98, +101, + 93, + 91, + 97, + 87, + 86, + 92, + 79, + 77, + 85, + 80, + 80, + 91, + 77, + 76, + 86, + 79, + 78, + 86, + 79, + 78, + 83, + 82, + 81, + 87, + 89, + 87, + 93, + 79, + 78, + 84, + 70, + 65, + 68, + 64, + 53, + 51, + 72, + 68, + 73, + 78, + 74, + 74, + 76, + 71, + 74, + 83, + 79, + 78, + 2, + 3, + -8, + 24, + 27, + 15, + 9, + 10, + 4, +-19, +-18, +-27, +-45, +-44, +-53, +-79, +-78, +-88, +-57, +-59, +-66, +-14, +-14, +-15, + 9, + 8, + 2, +-40, +-56, +-89, + -9, +-12, +-32, + 20, + 20, + 3, + 42, + 43, + 22, + 55, + 57, + 37, + 60, + 59, + 42, + 62, + 61, + 41, + 63, + 62, + 42, + 46, + 55, + 40, + 48, + 56, + 42, + 44, + 53, + 35, + 43, + 52, + 33, + 43, + 52, + 31, + 37, + 46, + 24, + 15, + 26, + 4, + 17, + 24, + 2, + 19, + 26, + 1, + 14, + 20, + -2, + 25, + 30, + 8, + 29, + 33, + 18, + 18, + 25, + 13, + 8, + 17, + 11, + 48, + 53, + 48, + 54, + 59, + 55, + 27, + 36, + 31, + 10, + 14, + 8, + 50, + 43, + 36, + 88, + 84, + 77, + 90, + 82, + 73, + 92, + 81, + 68, + 38, + 27, + 22, +-41, +-65, +-94, +-46, +-69, +-110, +-44, +-67, +-108, +-44, +-67, +-108, +-42, +-65, +-106, +-43, +-65, +-111, +-48, +-71, +-119, +-42, +-48, +-55, +-86, +-88, +-105, +-59, +-59, +-63, +-28, +-24, +-37, +-18, +-19, +-35, +-29, +-35, +-58, +-89, +-94, +-107, +-100, +-108, +-112, +-86, +-98, +-102, +-78, +-90, +-95, +-75, +-90, +-95, +-72, +-87, +-92, +-68, +-83, +-88, +-67, +-79, +-85, +-67, +-79, +-84, +-62, +-73, +-79, + -8, +-16, +-27, + 83, + 74, + 57, +102, + 97, + 84, + 74, + 65, + 51, + 40, + 31, + 19, + 26, + -8, +-39, + 46, + 7, +-29, + 41, + 0, +-39, + 52, + 12, +-33, + 80, + 58, + 41, +110, +106, +104, +104, +102, + 99, +101, + 98, + 97, + 99, + 97, + 95, +103, +102, +102, +106, +103, +103, +103, +102, +102, + 99, + 98, + 98, + 98, + 96, + 99, + 91, + 90, + 96, + 90, + 89, + 97, + 85, + 83, + 91, + 84, + 82, + 87, + 90, + 88, + 92, + 90, + 86, + 85, + 90, + 87, + 90, + 92, + 89, + 90, + 86, + 82, + 83, + 87, + 82, + 80, + 86, + 80, + 74, + 92, + 81, + 72, + 93, + 81, + 73, +102, + 96, + 94, + 16, + 18, + 9, + 14, + 16, + 1, + 7, + 9, + -2, + 7, + 10, + 2, + 32, + 34, + 30, + 11, + 15, + 11, +-21, +-20, +-27, +-54, +-53, +-66, +-30, +-30, +-40, + 45, + 47, + 31, + 53, + 55, + 40, + 46, + 49, + 28, + 44, + 47, + 25, + 58, + 55, + 36, + 73, + 63, + 40, + 69, + 60, + 36, + 70, + 61, + 38, + 47, + 60, + 48, + 50, + 62, + 53, + 50, + 62, + 53, + 42, + 55, + 43, + 21, + 35, + 20, + 13, + 25, + 8, + 16, + 25, + 8, + 20, + 27, + 6, + 28, + 34, + 11, + 14, + 19, + -3, + 29, + 32, + 12, + -3, + 4, + -9, + 15, + 22, + 15, + 49, + 55, + 48, + 49, + 54, + 49, + 33, + 41, + 36, + 38, + 45, + 41, + 42, + 48, + 41, + 57, + 44, + 28, + 99, + 80, + 59, + 97, + 82, + 66, + 37, + 21, + 8, +-41, +-67, +-91, +-43, +-66, +-106, +-43, +-66, +-106, +-47, +-69, +-110, +-47, +-70, +-111, +-47, +-70, +-112, +-51, +-75, +-118, +-53, +-78, +-121, +-76, +-92, +-113, +-116, +-121, +-123, +-120, +-121, +-124, +-114, +-119, +-124, +-61, +-64, +-58, +-110, +-118, +-125, +-111, +-119, +-125, +-106, +-114, +-124, +-90, +-104, +-121, +-82, +-97, +-112, +-75, +-92, +-109, +-70, +-86, +-104, +-67, +-81, +-98, +-65, +-78, +-91, +-60, +-73, +-86, +-47, +-61, +-73, + -1, +-14, +-32, + 55, + 44, + 26, + 82, + 74, + 58, + 51, + 39, + 22, + 39, + 28, + 16, + 89, + 83, + 76, +112, +108, +102, + 28, + -6, +-25, + 24, +-18, +-55, + 70, + 48, + 32, +112, +109, +110, +104, +103, +104, +107, +105, +105, +112, +111, +111, +105, +104, +105, +103, + 98, +101, +105, +103, +103, +102, +101, +100, + 96, + 95, + 94, + 96, + 93, + 92, + 90, + 84, + 83, + 92, + 87, + 86, + 95, + 92, + 89, + 90, + 82, + 76, + 91, + 84, + 78, + 95, + 90, + 89, + 96, + 94, + 94, + 95, + 92, + 97, + 93, + 91, + 95, + 98, + 94, + 98, + 94, + 88, + 92, + 96, + 93, + 95, + 98, + 87, + 84, + 9, + 11, + 1, + 1, + 2, +-14, + 1, + 3, + -9, + -3, + -1, +-14, + 38, + 39, + 36, + 46, + 47, + 45, + 32, + 34, + 30, + 16, + 19, + 11, + 56, + 58, + 44, + 47, + 49, + 34, + 37, + 40, + 20, + 45, + 47, + 26, + 40, + 44, + 25, + 53, + 50, + 31, + 59, + 45, + 17, + 52, + 46, + 23, + 52, + 39, + 9, + 55, + 22, +-13, + 40, + 36, + 23, + 39, + 50, + 42, + 38, + 49, + 42, + 34, + 47, + 37, + 23, + 33, + 17, + 19, + 27, + 9, + 26, + 30, + 14, + 26, + 31, + 11, + 14, + 20, + -2, +-15, + -7, +-23, + 23, + 30, + 20, + 46, + 52, + 45, + 46, + 53, + 48, + 26, + 36, + 29, + 42, + 48, + 42, + 46, + 51, + 46, + 40, + 45, + 39, + 62, + 53, + 41, + 94, + 75, + 53, + 59, + 41, + 23, +-24, +-61, +-97, +-70, +-89, +-112, +-69, +-87, +-112, +-75, +-91, +-114, +-75, +-92, +-115, +-79, +-96, +-117, +-82, +-98, +-119, +-90, +-105, +-121, +-91, +-106, +-122, +-98, +-111, +-122, +-109, +-119, +-124, +-108, +-118, +-123, +-106, +-116, +-124, +-97, +-104, +-110, +-104, +-115, +-123, +-100, +-113, +-122, +-98, +-110, +-121, +-92, +-107, +-119, +-88, +-104, +-117, +-85, +-99, +-114, +-83, +-98, +-113, +-79, +-92, +-109, +-74, +-87, +-102, +-71, +-83, +-95, +-64, +-76, +-87, +-41, +-53, +-64, +-25, +-35, +-46, +-10, +-19, +-31, + 8, +-29, +-47, +-14, +-35, +-48, +100, +100, + 99, +116, +113, +110, + 1, +-41, +-70, + 21, + -5, +-22, + 65, + 50, + 39, +111, +108, +106, +105, +101, + 96, +109, +108, +107, +110, +107, +105, +109, +107, +106, +106, +104, +102, +106, +104, +102, +102, +100, + 99, + 97, + 94, + 90, + 92, + 87, + 84, + 92, + 88, + 86, + 99, + 98, +100, + 99, + 98, +102, + 92, + 88, + 88, + 92, + 89, + 87, + 90, + 86, + 82, + 94, + 92, + 90, + 98, + 95, + 96, + 93, + 89, + 90, + 99, + 94, + 96, +100, + 93, + 94, + 98, + 92, + 92, + 78, + 75, + 75, +-24, +-40, +-64, + -2, + -5, +-21, + 8, + 10, + -5, +-16, +-18, +-40, + 16, + 18, + 12, + 40, + 41, + 39, + 41, + 42, + 38, + 37, + 40, + 25, + 53, + 56, + 38, + 50, + 52, + 36, + 20, + 22, + 1, + 3, + 5, +-21, + 14, + 2, +-27, + 15, + 6, +-23, + 35, + 16, +-20, + 27, + 12, +-22, + 37, + 14, +-24, + 26, + -6, +-40, + 49, + 15, +-26, + 51, + 15, +-26, + 56, + 29, + -3, + 40, + 23, + -1, + 19, + 11, +-11, + 21, + 24, + 3, + 28, + 32, + 15, + -3, + 5, +-10, +-11, + 0, +-12, + 32, + 38, + 24, + 44, + 49, + 39, + 43, + 49, + 44, + 26, + 36, + 29, + 43, + 47, + 41, + 45, + 49, + 44, + 43, + 48, + 43, + 40, + 45, + 39, + 63, + 61, + 53, + 89, + 85, + 80, + 31, + 5, +-12, + 6, +-37, +-80, +-92, +-107, +-121, +-91, +-106, +-120, +-93, +-107, +-120, +-92, +-108, +-121, +-98, +-113, +-122, +-100, +-115, +-124, +-101, +-116, +-123, +-102, +-116, +-124, +-101, +-115, +-123, +-101, +-114, +-122, +-101, +-112, +-121, +-93, +-107, +-117, +-90, +-104, +-114, +-92, +-106, +-116, +-92, +-106, +-116, +-90, +-104, +-114, +-91, +-105, +-115, +-89, +-102, +-112, +-92, +-103, +-113, +-96, +-108, +-118, +-96, +-108, +-118, +-92, +-104, +-111, +-87, +-96, +-102, +-90, +-98, +-105, +-93, +-103, +-108, +-86, +-98, +-104, +-84, +-98, +-105, + 44, + -1, +-68, +-18, +-55, +-77, +115, +114, +114, +110, +110, +110, + 6, +-32, +-52, + 12, +-21, +-47, + 80, + 72, + 65, +110, +105, +103, +111, +110, +107, +105, +101, + 96, +105, +103, + 97, +103, +101, + 98, +100, + 95, + 90, +108, +106, +105, +103, + 99, + 98, +103, +100, +101, + 99, + 97, +101, + 90, + 89, + 94, + 88, + 87, + 91, + 88, + 86, + 90, + 85, + 84, + 89, + 85, + 81, + 86, + 97, + 95, +100, + 96, + 90, + 90, + 95, + 90, + 88, +100, + 96, + 95, + 96, + 88, + 82, +100, + 94, + 88, +103, + 96, + 91, + 67, + 59, + 54, +-38, +-59, +-96, +-35, +-58, +-94, +-22, +-34, +-54, +-26, +-30, +-53, + 10, + 12, + -2, + 22, + 24, + 17, + 32, + 35, + 24, + 55, + 58, + 42, + 44, + 46, + 29, + 19, + 20, + -1, +-13, +-18, +-49, +-16, +-22, +-57, +-17, +-29, +-65, +-11, +-29, +-61, + 14, +-12, +-49, + 25, + -2, +-44, + 13, +-13, +-53, + 38, + -7, +-54, + 30, +-19, +-65, + 16, +-30, +-72, + 8, +-32, +-72, + 21, + -9, +-42, + 69, + 41, + 1, + 69, + 34, + -8, + 20, + 1, +-36, + 5, + 18, + 6, + 37, + 44, + 30, + 43, + 48, + 38, + 39, + 45, + 40, + 28, + 37, + 31, + 43, + 48, + 42, + 45, + 48, + 43, + 45, + 48, + 43, + 43, + 48, + 42, + 40, + 45, + 39, + 62, + 52, + 34, + 88, + 66, + 44, + 25, + -3, +-27, +-38, +-81, +-119, +-104, +-120, +-125, +-104, +-119, +-125, +-107, +-122, +-125, +-104, +-120, +-125, +-107, +-122, +-125, +-109, +-123, +-125, +-111, +-124, +-125, +-114, +-124, +-124, +-114, +-125, +-124, +-114, +-124, +-124, +-114, +-124, +-125, +-105, +-120, +-125, +-104, +-120, +-125, +-104, +-121, +-125, +-101, +-118, +-124, +-98, +-115, +-122, +-97, +-114, +-121, +-92, +-109, +-119, +-101, +-116, +-122, +-103, +-119, +-124, +-103, +-119, +-124, +-102, +-119, +-124, +-103, +-119, +-123, +-101, +-116, +-122, +-103, +-118, +-123, +-96, +-114, +-122, +-90, +-112, +-121, + 33, +-36, +-97, +-22, +-68, +-108, +114, +111, +108, +112, +106, + 98, + 70, + 53, + 39, + 9, +-33, +-66, + 84, + 71, + 58, +102, + 92, + 81, +107, +102, + 95, +109, +107, +105, +104, + 93, + 88, +103, + 93, + 87, +100, + 95, + 90, + 97, + 87, + 77, + 96, + 88, + 80, + 97, + 91, + 83, + 96, + 86, + 77, + 98, + 90, + 83, + 88, + 79, + 74, + 96, + 94, + 93, + 93, + 89, + 89, + 98, + 92, + 87, + 94, + 81, + 72, + 94, + 83, + 72, + 92, + 81, + 69, + 96, + 83, + 70, + 97, + 83, + 73, +100, + 95, + 90, + 99, + 87, + 79, + 69, + 55, + 44, +-55, +-80, +-115, +-43, +-67, +-109, +-41, +-63, +-102, +-39, +-61, +-101, +-24, +-39, +-61, + 24, + 26, + 9, + 10, + 16, + 1, + 16, + 19, + 5, + 29, + 29, + 14, + 29, + 23, + 3, +-25, +-31, +-63, +-39, +-47, +-79, +-48, +-54, +-81, +-31, +-50, +-85, +-19, +-52, +-89, +-30, +-53, +-85, +-12, +-43, +-80, + 48, + 3, +-45, + 45, + 0, +-47, + 43, + -2, +-50, + 50, + 4, +-43, + 37, + -9, +-56, + -7, +-50, +-88, + 61, + 32, + 0, + 98, + 72, + 32, + 45, + 38, + 15, + 42, + 48, + 39, + 30, + 38, + 32, + 29, + 38, + 32, + 46, + 51, + 46, + 46, + 51, + 45, + 45, + 49, + 43, + 44, + 49, + 43, + 42, + 47, + 42, + 39, + 44, + 38, + 59, + 55, + 46, + 87, + 71, + 56, + 65, + 48, + 39, +-60, +-98, +-115, +-71, +-96, +-113, +-60, +-73, +-80, + 16, + 8, + 0, + 41, + 30, + 22, + 60, + 53, + 49, + 27, + 24, + 21, +-123, +-126, +-126, + 61, + 50, + 40, + 58, + 42, + 19, + 63, + 56, + 43, + -2, +-34, +-65, +-48, +-61, +-71, +-65, +-92, +-126, +-60, +-89, +-126, +-60, +-91, +-125, +-27, +-50, +-85, +-41, +-78, +-117, +-62, +-94, +-126, +-69, +-83, +-110, +-73, +-85, +-105, +-86, +-89, +-102, +-84, +-89, +-101, + 3, + -2, + -9, + 53, + 48, + 44, + 55, + 47, + 36, + 57, + 47, + 34, +-25, +-36, +-42, +-19, +-59, +-90, +-20, +-50, +-72, +109, + 97, + 80, +101, + 82, + 63, + 96, + 71, + 48, + 4, +-38, +-71, + 88, + 79, + 72, + 99, + 92, + 84, + 82, + 72, + 66, + 81, + 76, + 72, + 85, + 78, + 76, + 93, + 81, + 80, + 79, + 71, + 69, + 77, + 67, + 64, + 91, + 86, + 82, + 94, + 85, + 79, + 96, + 89, + 82, + 94, + 81, + 66, + 92, + 74, + 56, + 88, + 69, + 51, + 89, + 72, + 55, + 92, + 78, + 61, + 91, + 65, + 46, + 93, + 78, + 64, + 93, + 85, + 78, + 97, + 89, + 84, + 95, + 87, + 85, + 89, + 76, + 72, + 81, + 76, + 72, + 59, + 47, + 43, +-52, +-77, +-110, +-51, +-76, +-114, +-47, +-72, +-115, +-48, +-76, +-115, +-47, +-71, +-110, + 30, + 27, + 12, + 28, + 24, + 2, + 33, + 18, + -9, + 21, + 6, +-19, + 37, + 15, +-24, + 10, +-16, +-53, +-17, +-40, +-79, +-50, +-62, +-93, +-59, +-70, +-96, +-40, +-64, +-103, +-56, +-79, +-114, +-57, +-79, +-108, + 33, +-17, +-62, + 39, + -9, +-56, + 41, + -6, +-52, + 47, + 2, +-46, + 45, + 2, +-49, + 39, + -8, +-56, + 15, +-31, +-75, +101, + 80, + 52, + 74, + 47, + 13, + 19, + 30, + 22, + 21, + 33, + 25, + 44, + 50, + 45, + 51, + 56, + 52, + 46, + 51, + 47, + 44, + 49, + 43, + 43, + 48, + 42, + 43, + 48, + 44, + 40, + 45, + 41, + 54, + 50, + 41, + 74, + 49, + 24, + 80, + 61, + 44, + 29, + 11, + -4, +-43, +-93, +-119, +-16, +-31, +-36, + 86, + 74, + 60, + 75, + 55, + 34, + 69, + 45, + 21, + 35, + 13, +-12, +-123, +-125, +-125, + 99, + 88, + 72, + 95, + 80, + 62, +103, + 97, + 92, +-14, +-42, +-71, +-69, +-102, +-125, +-57, +-90, +-126, +-60, +-91, +-126, +-63, +-97, +-126, +-42, +-65, +-93, +-39, +-71, +-103, +-65, +-98, +-126, +-72, +-90, +-123, +-61, +-78, +-103, +-66, +-74, +-87, +-45, +-53, +-65, + 54, + 50, + 42, + 91, + 71, + 55, + 88, + 61, + 35, + 88, + 63, + 40, + 5, +-23, +-39, +-11, +-68, +-103, +-41, +-81, +-103, + 79, + 72, + 67, + 78, + 65, + 50, + 94, + 73, + 54, + 7, +-37, +-77, + 88, + 69, + 46, + 90, + 73, + 56, + 88, + 69, + 51, + 89, + 74, + 60, + 93, + 77, + 60, + 89, + 72, + 59, + 92, + 81, + 65, + 87, + 75, + 65, + 85, + 65, + 43, + 75, + 59, + 45, + 81, + 62, + 39, + 81, + 68, + 52, + 81, + 65, + 47, + 77, + 64, + 54, + 75, + 73, + 71, + 76, + 71, + 66, + 75, + 62, + 50, + 85, + 78, + 67, + 85, + 64, + 42, + 84, + 64, + 41, + 90, + 75, + 60, + 97, + 79, + 62, + 88, + 73, + 60, + 50, + 36, + 22, +-51, +-77, +-113, +-55, +-81, +-113, +-53, +-76, +-112, +-58, +-86, +-116, +-62, +-90, +-120, + 34, + 31, + 16, + 40, + 28, + 5, + 48, + 38, + 11, + 30, + 29, + 11, + 36, + 24, + 1, + 23, + 11, +-14, + 9, +-11, +-44, +-27, +-41, +-68, +-73, +-83, +-109, +-21, +-42, +-83, +-35, +-49, +-85, +-28, +-51, +-86, + 12, +-14, +-41, + 11, +-25, +-55, + 0, +-44, +-82, + 37, +-12, +-58, + 43, + -3, +-51, + 46, + 0, +-49, + 39, + -9, +-56, + 67, + 32, + -3, + 95, + 67, + 35, + 18, + 22, + 11, + 31, + 40, + 34, + 46, + 52, + 48, + 53, + 57, + 55, + 48, + 53, + 49, + 43, + 48, + 43, + 42, + 47, + 41, + 43, + 48, + 44, + 44, + 48, + 47, + 50, + 51, + 44, + 77, + 54, + 33, + 82, + 60, + 41, + 61, + 39, + 16, +-33, +-83, +-109, + -2, +-24, +-35, + 92, + 79, + 64, + 92, + 82, + 72, + 91, + 80, + 65, + 56, + 47, + 37, +-122, +-124, +-124, + 25, + 16, + 6, + 42, + 20, + 2, + 37, + 17, + -4, +-44, +-55, +-64, +-42, +-48, +-57, +-37, +-43, +-55, +-37, +-43, +-60, +-39, +-48, +-64, +-26, +-36, +-57, +-27, +-40, +-62, +-38, +-48, +-63, +-32, +-38, +-50, +-19, +-22, +-23, + 4, + 3, + 5, + 24, + 22, + 21, + 37, + 26, + 23, +101, + 90, + 81, + 93, + 82, + 73, + 90, + 85, + 81, + -4, +-22, +-26, +-17, +-73, +-102, +-54, +-92, +-113, + 58, + 36, + 17, + 29, + 7, +-17, + 27, + 4, +-21, + 24, + -9, +-49, + 45, + 14, +-15, + 69, + 44, + 18, + 74, + 55, + 35, + 73, + 48, + 21, + 65, + 46, + 23, + 72, + 43, + 13, + 73, + 50, + 27, + 68, + 47, + 21, + 81, + 66, + 50, + 74, + 57, + 40, + 76, + 64, + 51, + 68, + 55, + 45, + 55, + 49, + 42, + 50, + 48, + 40, + 55, + 46, + 33, + 53, + 43, + 31, + 52, + 42, + 35, + 48, + 42, + 36, + 51, + 44, + 30, + 65, + 54, + 40, + 72, + 54, + 35, + 80, + 66, + 52, + 83, + 63, + 41, + 15, + -5, +-22, +-56, +-78, +-111, +-59, +-82, +-111, +-60, +-80, +-112, +-59, +-85, +-117, +-64, +-91, +-123, + 45, + 41, + 25, + 21, + 19, + -1, + 43, + 33, + 13, + 45, + 39, + 20, + 43, + 36, + 17, + 35, + 27, + 4, + 30, + 16, +-11, + 10, + -9, +-40, +-64, +-67, +-84, +-21, +-28, +-59, +-10, +-21, +-47, + -1, +-18, +-51, +-43, +-37, +-67, + 40, + 19, + -7, + 38, + 15, +-11, + 4, +-19, +-46, + 30, +-12, +-55, + 51, + 6, +-42, + 48, + 4, +-45, + 38, + -6, +-50, +103, + 75, + 41, + 25, + 14, + -7, + 33, + 42, + 37, + 47, + 53, + 48, + 54, + 58, + 56, + 48, + 53, + 50, + 42, + 47, + 41, + 41, + 46, + 41, + 42, + 47, + 43, + 43, + 47, + 46, + 47, + 39, + 30, + 63, + 39, + 19, + 73, + 52, + 32, + 75, + 51, + 25, +-22, +-70, +-100, + -4, +-40, +-60, + 81, + 58, + 35, + 79, + 57, + 33, + 84, + 62, + 39, + 68, + 48, + 27, +-102, +-118, +-124, +-74, +-100, +-125, +-70, +-98, +-124, +-73, +-101, +-123, + 8, + 6, + -3, + 26, + 23, + 13, + 22, + 18, + 8, + 18, + 14, + 3, + 9, + 6, + -5, + 0, + -3, +-13, +-18, +-21, +-31, +-18, +-21, +-33, + 1, + 0, + -5, + 34, + 33, + 32, + 64, + 64, + 63, + 81, + 78, + 77, +-30, +-40, +-41, +-28, +-32, +-37, +-34, +-42, +-53, +-75, +-83, +-108, +-51, +-86, +-109, +-18, +-68, +-94, +-68, +-90, +-100, + 64, + 45, + 25, + 58, + 27, + -2, + 54, + 17, +-19, + 11, +-32, +-66, + 20, +-22, +-61, + 62, + 21, +-23, + 60, + 14, +-29, + 75, + 41, + 3, + 76, + 41, + 2, + 74, + 42, + 0, + 75, + 41, + 2, + 78, + 50, + 18, + 63, + 26, + -6, + 73, + 39, + -1, + 70, + 36, + -5, + 67, + 35, + -2, + 65, + 36, + 3, + 68, + 50, + 34, + 58, + 39, + 17, + 51, + 43, + 29, + 49, + 40, + 28, + 62, + 43, + 28, + 70, + 46, + 19, + 63, + 38, + 14, + 63, + 34, + 5, + 61, + 32, + 2, + 59, + 25, + -4, +-29, +-51, +-71, +-58, +-76, +-107, +-73, +-92, +-115, +-58, +-79, +-110, +-64, +-89, +-120, +-64, +-93, +-122, + 31, + 26, + 13, + 29, + 19, + -7, + 40, + 28, + 6, + 34, + 32, + 16, + 46, + 34, + 12, + 41, + 38, + 20, + 38, + 26, + 3, + 21, + 17, + -5, +-36, +-42, +-57, + -5, +-18, +-49, + 2, + -2, +-28, + 10, + -3, +-32, +-46, +-34, +-77, +-47, +-36, +-69, + 28, + 14, +-11, + 39, + 19, + -6, + 8, +-27, +-63, + 46, + 1, +-48, + 47, + 2, +-48, + 42, + -3, +-51, + 93, + 68, + 36, + 29, + 11, +-13, + 34, + 42, + 37, + 40, + 46, + 42, + 53, + 57, + 55, + 46, + 51, + 47, + 39, + 44, + 39, + 41, + 47, + 42, + 42, + 46, + 44, + 13, + 9, + 5, + 3, +-10, +-36, + 22, + -9, +-34, + 40, + 8, +-10, + 58, + 41, + 30, +-55, +-76, +-85, +-16, +-28, +-37, + 77, + 55, + 31, + 74, + 51, + 26, + 72, + 41, + 4, + 63, + 32, + -4, +-110, +-123, +-124, + -2, +-22, +-44, +-81, +-107, +-127, +-71, +-95, +-111, + 4, + 1, + -2, + 33, + 30, + 23, + 30, + 28, + 19, + 24, + 22, + 15, + 12, + 10, + 3, + 0, + 0, + -8, +-18, +-19, +-26, +-17, +-20, +-27, + 14, + 14, + 15, + 45, + 43, + 46, + 67, + 64, + 67, + 58, + 55, + 54, +-23, +-24, +-21, +-76, +-83, +-95, +-64, +-79, +-108, + -2, +-37, +-66, +-22, +-47, +-68, +-12, +-44, +-64, +-67, +-97, +-108, + 55, + 9, +-37, + 39, +-11, +-62, + 34, +-16, +-65, + 36, +-14, +-67, + 66, + 21, +-27, + 76, + 37, + -8, + 76, + 35, + -4, + 62, + 26, + -5, + 67, + 36, + 2, + 65, + 28, + -4, + 76, + 47, + 20, + 62, + 41, + 17, + 68, + 44, + 18, + 71, + 46, + 22, + 77, + 49, + 14, + 73, + 46, + 13, + 68, + 34, + -8, + 61, + 23, +-18, + 52, + 16, +-16, + 63, + 37, + 9, + 62, + 38, + 10, + 61, + 34, + 4, + 54, + 20, +-10, + 58, + 24, +-11, + 45, + 19, +-10, + 41, + 16, + -5, + 31, + 14, + 2, + 1, +-15, +-24, +-53, +-67, +-78, +-71, +-86, +-110, +-78, +-96, +-121, +-66, +-91, +-118, +-67, +-91, +-119, + -5, +-13, +-30, + -3, +-13, +-40, + 16, + 8, +-14, + 27, + 18, + -7, + 25, + 18, + -5, + 28, + 22, + -1, + 35, + 25, + 1, + 35, + 30, + 13, +-42, +-40, +-51, + -1, +-19, +-50, + 8, + 2, +-21, + 18, + 4, +-23, +-30, +-24, +-66, +-31, +-24, +-65, +-49, +-36, +-76, +-53, +-40, +-74, +-31, +-53, +-83, + 42, + -4, +-53, + 47, + 2, +-47, + 42, + -4, +-53, + 73, + 44, + 13, + 51, + 28, + -4, + 35, + 42, + 37, + 30, + 37, + 32, + 51, + 54, + 54, + 42, + 49, + 45, + 38, + 47, + 42, + 40, + 47, + 43, + 14, + 17, + 10, + 9, +-17, +-40, + 22, +-19, +-43, + 24, +-13, +-39, + 14, + -1, +-31, + 22, + -8, +-37, +-34, +-50, +-70, + -5, +-29, +-45, + 78, + 50, + 16, + 74, + 46, + 16, + 65, + 27, + -9, + 60, + 20, +-20, +-102, +-123, +-124, + 15, + -4, +-36, +-88, +-111, +-126, +-73, +-95, +-120, + 28, + 28, + 36, + 19, + 19, + 30, + 20, + 20, + 29, + 17, + 17, + 26, + 15, + 15, + 23, + 2, + 2, + 11, +-19, +-17, + -9, +-42, +-41, +-34, +-23, +-22, +-14, + 16, + 17, + 25, + 39, + 40, + 46, + 49, + 49, + 54, +-29, +-30, +-24, +-79, +-87, +-109, + 4, +-31, +-69, + 59, + 18, +-24, +-27, +-61, +-93, +-23, +-55, +-81, +-67, +-97, +-111, + 77, + 37, +-13, + 58, + 11, +-35, + 49, + 1, +-54, + 46, + -5, +-66, + 53, + 8, +-48, + 65, + 26, +-20, + 62, + 23, +-18, + 57, + 26, +-15, + 56, + 23, +-15, + 66, + 23, +-11, + 70, + 27, + -5, + 48, + 28, + -3, + 61, + 40, + 10, + 76, + 54, + 29, + 66, + 38, + 10, + 72, + 45, + 15, + 62, + 26, +-12, + 65, + 34, + -2, + 48, + 8, +-31, + 56, + 21, +-17, + 49, + 15, +-20, + 45, + 14, +-17, + 31, + -2, +-29, + 24, + -6, +-33, + 35, + 10, +-12, + 40, + 21, + 3, + 33, + 14, + -2, + 18, + 2, + -9, + 0, +-14, +-26, +-43, +-54, +-75, +-71, +-94, +-113, +-69, +-91, +-119, +-66, +-92, +-114, +-14, +-19, +-27, +-27, +-24, +-34, +-29, +-32, +-47, +-40, +-36, +-48, +-28, +-26, +-43, + -7, +-14, +-33, + 20, + 7, +-19, + 13, + 6, + -9, +-75, +-76, +-86, + -2, + -7, +-33, + 9, + 5, +-20, + 21, + 8, +-20, + 27, + 9, +-23, +-17, +-17, +-55, +-20, +-14, +-56, +-28, +-21, +-60, +-54, +-60, +-90, + 41, + -5, +-53, + 47, + 2, +-47, + 40, + -7, +-55, + 54, + 23, + -8, + 65, + 41, + 9, + 30, + 37, + 32, + 25, + 33, + 27, + 47, + 52, + 49, + 39, + 45, + 42, + 38, + 46, + 42, + 21, + 22, + 16, + 24, + -4, +-39, + 20, +-17, +-54, + 35, + 3, +-34, + 34, + 0, +-41, + 37, + 4, +-32, + 26, +-13, +-57, +-31, +-64, +-92, +-25, +-59, +-85, + 42, + 1, +-44, + 58, + 18, +-29, + 66, + 37, + 2, + 67, + 38, + 6, +-104, +-120, +-124, +-97, +-113, +-118, +-84, +-95, +-108, +-83, +-92, +-112, +-67, +-66, +-54, +-64, +-61, +-42, +-67, +-62, +-47, +-57, +-57, +-43, +-54, +-54, +-45, +-72, +-68, +-59, +-80, +-77, +-67, +-92, +-91, +-83, +-85, +-83, +-75, +-66, +-65, +-56, +-49, +-49, +-39, +-53, +-54, +-41, +-17, +-19, +-15, +-82, +-93, +-112, + 50, + 7, +-45, + 66, + 27, +-20, + -7, +-34, +-62, +-28, +-75, +-111, +-70, +-93, +-103, + 65, + 36, + 0, + 63, + 24, +-19, + 67, + 23, +-28, + 60, + 12, +-45, + 67, + 20, +-38, + 64, + 22, +-26, + 72, + 29, +-28, + 47, + -4, +-56, + 72, + 36, +-13, + 58, + 14, +-34, + 68, + 26, +-15, + 68, + 35, + -8, + 57, + 24, +-12, + 52, + 9, +-37, + 65, + 32, + -9, + 57, + 23, +-18, + 48, + 15, +-24, + 46, + 11, +-24, + 47, + 14, +-16, + 46, + 27, + 5, + 42, + 34, + 21, + 38, + 25, + 8, + 37, + 13, + -9, + 46, + 22, + -1, + 27, + -5, +-33, + 34, + 10, +-16, + 27, + 0, +-24, + 23, + -2, +-25, + 11, +-13, +-34, + 23, + 2, +-16, + 2, +-26, +-52, +-53, +-78, +-102, +-63, +-83, +-113, +-19, +-22, +-31, + -2, +-13, +-41, + 9, + 6, +-17, + 24, + 11, +-14, + 9, + 5, +-10, + 17, + 4, +-19, + 0, + -2, +-19, + -3, + 0, + -6, +-44, +-46, +-57, + 5, +-10, +-36, + 15, + 9, +-14, + 24, + 12, +-14, + 4, + -6, +-34, + 45, + 23, + -7, + 22, + 8, +-23, + -2, + -6, +-41, +-51, +-53, +-82, + 41, + -3, +-50, + 50, + 6, +-40, + 35, +-13, +-61, + 43, + 9, +-21, + 75, + 50, + 22, + 26, + 32, + 26, + 32, + 39, + 34, + 33, + 42, + 36, + 33, + 41, + 37, + 19, + 21, + 14, + 10, +-20, +-54, + 17, +-14, +-51, + 25, +-14, +-58, + 26, + -8, +-47, + 21, +-19, +-61, + 36, + 2, +-39, + 44, + 10, +-31, +-15, +-51, +-81, +-36, +-67, +-92, + 36, + 7, +-35, + 17, +-10, +-51, + 12, +-14, +-51, + -2, +-23, +-51, +-116, +-123, +-124, +-113, +-124, +-125, +-11, + -8, + -7, + 33, + 35, + 36, + 35, + 37, + 38, + 37, + 39, + 40, + 38, + 41, + 42, + 38, + 40, + 41, + 37, + 39, + 39, + 37, + 39, + 39, + 40, + 41, + 42, + 41, + 43, + 42, + 38, + 39, + 39, + 22, + 24, + 27, + -9, + -8, + -9, +-13, +-12, +-14, + 11, + 9, + 8, +-90, +-103, +-119, + 1, +-16, +-47, + 16, + -6, +-43, +-13, +-47, +-82, +-25, +-70, +-103, +-68, +-96, +-107, + 26, + -7, +-49, + 23, + -1, +-42, + 26, + 5, +-29, + 50, + 23, +-18, + 51, + 17, +-25, + 72, + 35, + -9, + 73, + 39, + -4, + 63, + 23, +-22, + 61, + 20, +-31, + 53, + 14, +-29, + 54, + 11, +-39, + 53, + 14, +-29, + 52, + 13, +-30, + 65, + 37, + 3, + 55, + 27, + -3, + 53, + 25, + -5, + 46, + 26, + -1, + 35, + 22, + 0, + 22, + 10, +-11, + 12, + 2, +-18, + 23, + -2, +-27, + 23, + 7, +-15, + 15, + 2, +-14, + 13, + 2, +-13, + 24, + 12, + 0, + 32, + 16, + 5, + 19, + -3, +-20, + 27, + 8, +-11, + 28, + 9, + -8, + 13, +-14, +-35, + 17, + -3, +-20, + 0, +-29, +-54, +-31, +-64, +-95, +-11, +-15, +-25, + -2, + -8, +-34, + 9, + 0, +-22, + 19, + 9, +-12, + 25, + 17, + -6, + 19, + 12, +-10, + 15, + 8, +-12, + 19, + 5, +-22, + 22, + 6, +-23, + 0, + -3, +-25, + 10, + 6, +-17, + 24, + 12, +-12, +-57, +-44, +-81, + 8, + -3, +-28, + 51, + 28, + 3, + 56, + 34, + 8, + 8, +-10, +-35, + 38, + -6, +-50, + 51, + 9, +-38, + 34, +-13, +-60, + 36, + -5, +-40, + 86, + 61, + 32, + 17, + 21, + 16, + 33, + 38, + 36, + 16, + 25, + 17, + 24, + 29, + 24, + 8, +-19, +-56, + 28, + -3, +-43, + 10, +-27, +-73, + 31, + -5, +-45, + 28, + -9, +-46, + 35, + -3, +-43, + 32, + -5, +-46, + 37, + 0, +-44, +-16, +-48, +-80, +-38, +-68, +-92, + 30, + -7, +-49, + 3, +-25, +-58, +-51, +-72, +-95, +-109, +-122, +-125, +-117, +-123, +-124, +-114, +-123, +-122, +-111, +-108, +-75, +-87, +-98, +-56, +-70, +-89, +-53, +-34, +-65, +-47, +-27, +-57, +-46, +-34, +-66, +-48, +-37, +-71, +-54, +-50, +-82, +-57, +-48, +-76, +-56, +-56, +-82, +-56, +-86, +-97, +-56, +-102, +-109, +-73, +-115, +-115, +-94, +-119, +-118, +-104, +-107, +-116, +-112, +-99, +-113, +-124, +-99, +-112, +-124, + 13, + -9, +-38, + 12, +-19, +-50, +-34, +-73, +-99, +-53, +-73, +-88, + 44, + 18, +-23, + 59, + 22, +-23, + 52, + 14, +-27, + 60, + 19, +-27, + 62, + 14, +-38, + 66, + 24, +-24, + 58, + 18, +-25, + 53, + 14, +-28, + 56, + 17, +-32, + 51, + 9, +-36, + 50, + 8, +-38, + 65, + 30, +-11, + 51, + 14, +-25, + 54, + 24, + -9, + 51, + 18, +-15, + 52, + 20, +-14, + 43, + 14, +-14, + 39, + 13, + -9, + 30, + 0, +-27, + 33, + 14, +-10, + 18, + 5, +-19, + 3, + -7, +-29, + 5, + -8, +-25, + 23, + 12, + -7, + 37, + 21, + 3, + 30, + 10, +-10, + 22, +-12, +-38, + 31, + 7, +-15, + 26, + 5, +-17, + 27, + 6, +-13, + 9, +-17, +-39, + 15, +-13, +-37, + 2, +-33, +-64, + 20, + 11, + -6, + 10, + -4, +-27, + 4, + 2, +-15, + 23, + 15, + -7, + 26, + 18, + -1, + 24, + 19, + -1, + 31, + 19, + -5, + 22, + 16, + -3, + 29, + 17, + -7, + 13, + 14, + -7, + 15, + 8, +-16, + 24, + 10, +-14, +-61, +-46, +-82, +-44, +-33, +-71, +-13, +-15, +-42, + 44, + 28, + 3, + 17, + 0, +-23, + 29, +-13, +-53, + 50, + 9, +-36, + 46, + 1, +-44, + 23, +-24, +-67, + 89, + 64, + 34, + 6, + 11, + 3, + 30, + 38, + 35, + 8, + 13, + 4, + 20, + 0, +-27, + 22, + -9, +-44, + 31, + 2, +-32, + 26, + -3, +-40, + 32, + 3, +-35, + 29, + -3, +-43, + 8, +-38, +-87, + 27, +-15, +-63, + 21, +-24, +-78, +-30, +-67, +-106, +-48, +-85, +-111, + 6, +-29, +-75, + 11, +-27, +-76, + 38, + -3, +-56, + 43, + 5, +-44, + 24, +-20, +-68, + 25, +-28, +-84, + 63, + 10, +-72, + 50, + -7, +-80, + 45, + -5, +-61, + 53, + 2, +-57, + 46, + -1, +-47, + 50, + 14, +-20, + 37, + 5, +-26, + 46, + 9, +-25, + 48, + 4, +-28, + 45, + 0, +-39, + 46, + 7, +-34, + 33, + -3, +-40, + 27, +-17, +-58, + 12, +-35, +-76, + 2, +-46, +-90, +-25, +-68, +-105, +-53, +-96, +-124, +-77, +-110, +-124, +-32, +-60, +-97, +-45, +-77, +-102, +-79, +-87, +-94, + 68, + 30, +-17, + 51, + 9, +-37, + 50, + 7, +-42, + 41, + -7, +-60, + 47, + -1, +-57, + 40, + -8, +-60, + 51, + 7, +-41, + 50, + 14, +-25, + 67, + 36, + 2, + 59, + 21, +-18, + 61, + 24, +-10, + 48, + 14, +-21, + 64, + 38, + 4, + 40, + 5, +-28, + 44, + 3, +-37, + 45, + 4, +-38, + 43, + 2, +-40, + 40, + -1, +-42, + 40, + 10, +-26, + 36, + 8, +-19, + 42, + 13, +-17, + 46, + 25, + 0, + 36, + 15, +-10, + 37, + 10, +-17, + 37, + 9, +-19, + 30, + -3, +-38, + 24, +-12, +-44, + 27, + -2, +-30, + 22, +-10, +-39, + 12, +-23, +-51, + 28, + 7, +-11, + 25, + 2, +-18, + 18, + -7, +-27, + 26, + 17, + 2, + 9, + 2, +-18, + 9, + 10, + -7, + 22, + 11, +-10, + 16, + 9, + -9, + 23, + 16, + -7, + 22, + 17, + -6, + 29, + 20, + -2, + 30, + 18, + -5, + 15, + 5, +-19, + 10, + 5, +-18, + 20, + 6, +-18, +-63, +-49, +-86, +-61, +-44, +-78, +-23, +-16, +-53, +-28, +-18, +-55, +-30, +-28, +-55, + 17, +-20, +-57, + 50, + 10, +-33, + 50, + 9, +-35, + 21, +-24, +-68, + 87, + 58, + 25, + -2, + -2, +-12, + 23, + 25, + 23, +-20, +-31, +-50, +-10, +-33, +-59, + 15, +-16, +-44, + 12, +-22, +-51, + -3, +-30, +-62, + 11, +-14, +-46, + 28, + 0, +-35, + 38, + 8, +-32, + 30, + -8, +-56, + 27, +-13, +-60, +-22, +-58, +-101, +-40, +-75, +-98, + 20, +-27, +-83, + 21, +-27, +-84, + 26, +-21, +-83, + 12, +-37, +-92, +-18, +-52, +-85, +-26, +-55, +-93, + 34, +-10, +-66, + 50, + 13, +-33, + 42, + 4, +-39, + 55, + 22, +-12, + 44, + 5, +-29, + 24, +-16, +-51, + 30, + 0, +-35, + 35, + 0, +-33, + 48, + 9, +-20, + 35, + -3, +-34, + 37, + -2, +-37, + 38, + -3, +-35, + 49, + 12, +-21, + 49, + 10, +-29, + 55, + 20, +-18, + 57, + 15, +-32, + 46, + 2, +-42, + 28, +-15, +-58, + -4, +-44, +-85, +-40, +-70, +-99, +-62, +-73, +-91, + 45, + 2, +-44, + 45, + -3, +-50, + 54, + 12, +-36, + 49, + 8, +-39, + 62, + 30, + -9, + 63, + 29, +-10, + 53, + 14, +-17, + 36, + 1, +-30, + 31, + -1, +-30, + 32, + 2, +-27, + 39, + 6, +-20, + 37, + 10, +-17, + 24, + -1, +-26, + 43, + 17, + -8, + 58, + 33, + 8, + 59, + 33, + 6, + 51, + 23, + -5, + 51, + 22, +-11, + 47, + 11, +-26, + 36, + 2, +-32, + 25, +-15, +-50, + 24, +-18, +-60, + 31, + -9, +-49, + 30, + -6, +-42, + 24, +-13, +-50, + 27, +-10, +-45, + 32, + -1, +-36, + 31, + 6, +-17, + 37, + 13, + -9, + 44, + 29, + 15, + 17, + 2, +-13, + -9, +-28, +-40, + 9, +-13, +-25, + 15, + 1, +-10, + 11, + 6, +-12, + 13, + 6, +-14, + 14, + 8, +-10, + 18, + 12, + -7, + 11, + 9, + -8, + 13, + 9, +-12, + 16, + 8, +-13, + 21, + 9, +-13, + 7, + 6, + -8, + 3, + -1, +-22, + 18, + 7, +-21, +-35, +-29, +-65, +-51, +-41, +-76, +-18, +-18, +-44, + 23, + 15, +-12, + -1, + -6, +-30, + 13, +-21, +-58, + 50, + 11, +-28, + 49, + 10, +-32, + 21, +-22, +-64, + 96, + 70, + 37, + 4, + 0, +-13, +-23, +-33, +-47, + -7, +-34, +-61, + 9, +-23, +-48, + 12, +-18, +-46, + -3, +-18, +-49, + -5, +-35, +-68, + 8, +-23, +-58, + 31, + -5, +-45, + 15, +-21, +-66, + 28, + -7, +-53, + 25, +-15, +-67, + -9, +-50, +-90, +-42, +-74, +-99, + 17, +-27, +-79, + 13, +-34, +-91, + 18, +-26, +-78, + 14, +-29, +-75, +-13, +-49, +-90, +-61, +-75, +-95, + 32, + -9, +-60, + 38, + 0, +-40, + 29, + -7, +-49, + 42, + 7, +-28, + 20, +-11, +-48, + 9, +-19, +-54, + 34, + -4, +-40, + 49, + 2, +-32, + 42, + -3, +-34, + 14, +-12, +-43, + 19, +-11, +-45, + 44, + 12, +-21, + 51, + 21, +-15, + 46, + 5, +-39, + 46, + 7, +-35, + 33, +-11, +-59, + 25, +-22, +-65, + 39, + -4, +-45, + 5, +-36, +-80, +-40, +-66, +-94, +-93, +-104, +-112, + 56, + 15, +-29, + 50, + 4, +-42, + 50, + 6, +-44, + 56, + 14, +-33, + 67, + 35, + -3, + 53, + 20, +-15, + 67, + 37, + 11, + 41, + 11, +-18, + 25, + 4, +-24, + 36, + 3, +-26, + 53, + 10, +-16, + 47, + 11, +-17, + 32, + 5, +-22, + 30, + -2, +-27, + 42, + 13, +-10, + 56, + 33, + 7, + 43, + 14, +-18, + 50, + 20, +-10, + 37, + -1, +-40, + 34, + -4, +-45, + 27, +-13, +-50, + 23, +-17, +-53, + 21, +-20, +-61, + 23, +-18, +-59, + 28, + -7, +-44, + 18, +-25, +-64, + 29, + -8, +-41, + 32, + 5, +-20, + 27, + 1, +-21, + 35, + 12, + -8, + 25, + -1, +-17, + 3, +-25, +-43, + 5, +-10, +-23, + 27, + 21, + 9, + 21, + 10, +-12, + 6, + 6, + -9, + 17, + 11, + -9, + 12, + 9, + -8, + 14, + 10, + -7, + 22, + 13, + -9, + 15, + 11, + -7, + 23, + 13, + -9, + 7, + 4, +-17, + 11, + 3, +-22, + 16, + 4, +-22, + -8, +-16, +-50, +-36, +-30, +-65, +-33, +-25, +-61, +-52, +-38, +-70, +-28, +-26, +-47, + -5, +-33, +-65, + 46, + 9, +-29, + 45, + 8, +-33, + 15, +-25, +-65, + 94, + 64, + 33, + 11, +-14, +-42, + 26, + 11, +-17, + 23, + 3, +-22, + 22, + 1, +-27, + 28, + 7, +-23, + 33, + 10, +-23, + 13, +-15, +-52, + 9, +-29, +-67, + 2, +-39, +-84, + 15, +-27, +-81, + 10, +-34, +-87, + 15, +-27, +-77, +-11, +-46, +-83, +-38, +-65, +-88, + 26, + -8, +-53, + 25, + -8, +-50, + 23, + 2, +-45, + 30, + 16, +-38, + 62, + 62, + 21, + 59, + 74, + 41, + 59, + 50, + 30, + 59, + 22, + -8, + 79, + 57, + 33, + 57, + 36, + 12, + 35, + 12, +-14, + 42, + 7, +-33, + 32, + -7, +-45, + 42, + 5, +-35, + 41, + 1, +-38, + 58, + 29, + -8, + 44, + 6, +-34, + 33, + -8, +-52, + 34, +-11, +-54, + 33, +-12, +-56, + 32, +-14, +-60, + 42, + 1, +-40, + 48, + 20, +-16, + 30, + -8, +-42, +-12, +-48, +-83, +-31, +-56, +-87, +-75, +-87, +-101, + 44, + 5, +-35, + 55, + 21, +-18, + 56, + 19, +-20, + 50, + 8, +-36, + 49, + 6, +-42, + 47, + 3, +-44, + 55, + 14, +-28, + 67, + 35, + -6, + 74, + 54, + 28, + 65, + 35, + 2, + 57, + 22, + -8, + 56, + 20, +-13, + 65, + 40, + 11, + 59, + 40, + 16, + 44, + 8, +-20, + 47, + 8, +-27, + 46, + 7, +-31, + 35, + -4, +-47, + 37, + -2, +-45, + 42, + 11, +-24, + 43, + 15, +-15, + 39, + 12, +-20, + 49, + 26, + -1, + 38, + 17, + -7, + 42, + 14, +-14, + 31, + -1, +-31, + 39, + 10, +-18, + 28, + -9, +-46, + 30, + -7, +-45, + 24, +-10, +-43, + 24, +-11, +-37, + 19, + -4, +-25, + 31, + 12, + -4, + 5, +-18, +-48, + -4, +-29, +-61, + -5, +-26, +-57, + 0, +-15, +-40, + 4, +-13, +-39, + 3, + -8, +-29, + 4, + -3, +-22, + 13, + 3, +-20, + 18, + 7, +-14, + 3, + -5, +-24, + 2, + -1, +-22, + 8, + -1, +-27, + 39, + 15, +-12, + -1, + -9, +-41, +-39, +-28, +-65, +-20, +-11, +-45, +-32, +-23, +-52, +-25, +-47, +-76, + 41, + 4, +-34, + 43, + 6, +-32, + 5, +-34, +-71, + 82, + 52, + 20, + 14, + 1, +-40, + 41, + 45, + 11, + 57, + 53, + 23, + 67, + 61, + 32, + 17, + 30, + -7, +-19, + 14, +-28, + 23, + 37, + 2, + 44, + 49, + 17, + 40, + 45, + 16, + 22, + 34, + 4, + 4, + 9, +-23, + 13, + 9, +-27, + -9, +-16, +-38, +-35, +-40, +-64, + 11, + 17, +-14, + 35, + 47, + 16, + 85, + 66, +-20, +119, + 89, + 13, +115, +100, + 61, +110, +103, + 83, + 91, + 75, + 49, + 72, + 27, + 12, + 67, + 54, + 37, + 84, + 71, + 54, + 60, + 45, + 28, + 17, +-21, +-65, + 20, +-25, +-73, + 23, +-22, +-71, + 21, +-24, +-69, + 21, +-20, +-62, + 32, + -4, +-40, + 21, +-19, +-58, + 36, + -4, +-46, + 24, +-18, +-58, + 31, + -6, +-40, + 25, + -8, +-40, + 26, + -4, +-32, + 21, + 2, +-18, +-32, +-65, +-95, +-11, +-42, +-72, +-13, +-24, +-52, + 18, + -2, +-31, + 35, + 3, +-32, + 35, + 2, +-34, + 49, + 15, +-19, + 47, + 5, +-38, + 56, + 17, +-26, + 49, + 9, +-27, + 53, + 20, +-12, + 47, + 8, +-29, + 47, + 8, +-33, + 55, + 14, +-28, + 53, + 12, +-31, + 50, + 13, +-29, + 51, + 14, +-21, + 59, + 27, + -9, + 53, + 20, +-14, + 60, + 24, +-14, + 46, + 6, +-33, + 44, + 14, +-15, + 39, + 11, +-15, + 33, + 8, +-16, + 29, + 14, + -7, + 11, + 4, +-13, + 10, + 4, +-11, + 17, + 9, + -6, + 21, + 7, +-10, + 36, + 8, +-16, + 39, + 10, +-14, + 36, + 8, +-18, + 35, + 3, +-27, + 35, + 4, +-29, + 28, + -3, +-31, + 23, + -9, +-36, + 7, +-12, +-44, + -4, +-15, +-42, + 3, +-12, +-40, + 8, + -9, +-43, + -5, +-21, +-50, + -5, +-23, +-55, + -8, +-35, +-72, + 0, +-32, +-72, +-10, +-31, +-65, +-10, +-36, +-72, +-11, +-29, +-56, + -7, +-23, +-48, + 41, + 16, +-10, + 44, + 21, + -4, + 22, + 10, +-19, +-21, +-15, +-50, +-37, +-25, +-56, +-43, +-54, +-82, + 39, + 3, +-33, + 43, + 5, +-32, + 0, +-39, +-76, + 76, + 47, + 18, + 28, + 10, +-35, + -9, + 12, +-30, + 46, + 46, + 16, + 87, + 71, + 49, + 80, + 68, + 46, + 39, + 42, + 11, + 13, + 29, + -8, + 53, + 57, + 32, + 24, + 42, + 14, + 43, + 49, + 24, + 69, + 67, + 44, + 33, + 41, + 8, + 50, + 57, + 32, + 71, + 74, + 55, + 74, + 77, + 61, + 29, + 34, +-14, +109, + 54, +-74, +117, + 83, + 3, +113, + 88, + 38, +100, + 87, + 65, + 73, +-23, +-46, + 94, + 63, + 41, +105, + 93, + 77, +103, + 92, + 74, + 61, + 42, + 27, + 17, +-23, +-67, + 8, +-39, +-88, + 16, +-24, +-68, + 19, +-18, +-55, + 13, +-28, +-73, + 32, + -7, +-46, + 40, + 9, +-27, + 28, + -2, +-34, + 26, + 4, +-24, + 5, +-10, +-34, +-11, +-18, +-37, +-13, +-22, +-47, + -6, +-24, +-56, +-34, +-66, +-97, + 6, +-30, +-62, + 29, +-12, +-44, + -4, +-22, +-55, + -8, +-15, +-39, + 14, + 8, +-11, + 19, + 2, +-22, + 48, + 30, + 3, + 61, + 34, + 4, + 65, + 41, + 8, + 55, + 20, +-18, + 48, + 11, +-29, + 60, + 31, + 4, + 51, + 13, +-22, + 51, + 11, +-33, + 65, + 36, + 4, + 53, + 18, +-18, + 63, + 32, + -1, + 68, + 46, + 24, + 70, + 50, + 28, + 66, + 45, + 22, + 43, + 32, + 16, + 42, + 37, + 26, + 18, + 14, + -1, + 9, + -1, +-22, + 30, + 11, + -8, + 31, + 8, +-14, + 31, + 1, +-19, + 10, +-15, +-39, + 2, + -8, +-31, + 4, + -5, +-17, + 29, + 16, + -2, + 28, + 10, + -6, + 47, + 24, + 0, + 42, + 23, + 5, + 35, + 9, +-14, +-14, +-33, +-63, +-19, +-34, +-60, + -7, +-19, +-44, + 1, +-13, +-40, +-13, +-26, +-49, +-13, +-25, +-52, +-13, +-32, +-56, +-12, +-24, +-51, +-29, +-43, +-65, +-18, +-38, +-60, + -3, +-30, +-65, +-20, +-44, +-78, + 40, + 14, +-12, + 44, + 21, + -4, + 46, + 27, + 2, + 49, + 32, + 7, + 34, + 21, + -3, +-14, +-30, +-51, + 36, + -1, +-36, + 43, + 8, +-26, + -3, +-38, +-75, + 81, + 50, + 19, + 62, + 37, + 5, + 59, + 53, + 29, + 51, + 48, + 23, + 53, + 50, + 24, + 63, + 57, + 32, + 69, + 62, + 35, + 69, + 60, + 33, + 54, + 52, + 25, + 73, + 66, + 43, + 80, + 76, + 53, + 86, + 84, + 67, + 88, + 83, + 67, + 70, + 75, + 62, + 54, + 73, + 55, + 61, + 71, + 60, + 90, + 58, + 40, + 93, + 17, +-125, +102, + 64, +-18, + 89, + 58, + 8, + 85, + 54, + 38, + 81, + 37, + 21, +102, + 84, + 63, + 87, + 68, + 47, + 94, + 79, + 62, + 33, + 9, +-11, + 16, +-23, +-66, + 12, +-32, +-74, + 27, +-11, +-51, + 16, +-24, +-67, + 14, +-23, +-62, + 24, +-10, +-47, + 3, +-35, +-72, + 22, +-16, +-55, + 18, +-23, +-62, + 31, + -3, +-38, + 20, + -9, +-38, + 36, + 11, +-14, + 10, + -4, +-26, +-57, +-82, +-101, + -9, +-33, +-56, + 3, +-14, +-41, + 31, + 10, +-14, + 36, + 5, +-25, + 49, + 20, +-10, + 46, + 12, +-22, + 45, + 7, +-31, + 48, + 14, +-22, + 49, + 19, +-13, + 63, + 39, + 11, + 57, + 23, +-10, + 67, + 36, + 0, + 57, + 22, +-16, + 56, + 17, +-25, + 65, + 39, + 8, + 55, + 23, + -6, + 61, + 39, + 14, + 66, + 46, + 22, + 52, + 21, +-14, + 61, + 31, + 2, + 56, + 28, + 3, + 54, + 27, + 3, + 49, + 23, + -4, + 28, + 5, +-15, + 16, + 7, + -7, + 4, + -3, +-24, + 23, + 12, +-11, + 13, + 3, +-21, + 12, + 0, +-20, + 33, + 11, +-13, + 45, + 24, + 1, + 35, + 9, +-15, + 43, + 20, + -8, + 38, + 12, +-13, + 30, + 4, +-18, +-23, +-39, +-63, +-14, +-26, +-51, +-10, +-24, +-50, + -3, +-22, +-47, +-20, +-34, +-61, + -8, +-23, +-52, +-30, +-42, +-64, +-11, +-28, +-53, +-23, +-40, +-69, +-32, +-53, +-78, +-18, +-34, +-60, +-26, +-42, +-67, + 38, + 12, +-13, + 43, + 19, + -6, + 45, + 25, + 0, + 27, + 14, + -8, + 48, + 32, + 12, +-10, +-21, +-39, + 32, + -5, +-41, + 43, + 10, +-25, + 6, +-31, +-68, + 80, + 50, + 21, + 46, + 18, +-19, + 31, + 34, + -1, + 44, + 47, + 14, + 59, + 57, + 26, + 47, + 49, + 16, + 24, + 35, + -2, + 40, + 37, + 1, + 86, + 74, + 54, +100, + 94, + 81, +104, + 99, + 90, +105, + 97, + 84, + 96, + 73, + 35, + 72, + 76, + 66, + 46, + 59, + 46, + 32, + 47, + 36, + 76, + 41, + 29, + 72, + 5, +-100, + 67, + 32, +-44, + 67, + 11, +-22, + 72, + 16, + 3, + 67, + 38, + 18, + 51, + 29, + 9, + 53, + 37, + 22, + 93, + 83, + 69, +-22, +-56, +-92, + 6, +-28, +-64, + 10, +-27, +-62, + 4, +-34, +-68, + 16, +-14, +-42, +-15, +-62, +-106, + 15, +-24, +-66, + 19, +-18, +-57, + 11, +-30, +-74, + 19, +-24, +-65, + 26, +-14, +-54, + 27, + -6, +-42, + 22, +-13, +-41, + 39, + 11, +-15, +-69, +-87, +-96, + 7, +-15, +-38, + 43, + 13, +-18, + 35, + -3, +-37, + 50, + 18, +-18, + 44, + 4, +-36, + 51, + 12, +-28, + 54, + 12, +-38, + 51, + 13, +-28, + 57, + 23, +-16, + 28, +-22, +-75, + 46, + 15, +-17, + 53, + 19, +-14, + 48, + 10, +-27, + 57, + 24, + -7, + 51, + 11, +-32, + 70, + 44, + 14, + 45, + 9, +-28, + 52, + 9, +-38, + 65, + 38, + 7, + 57, + 22, +-12, + 69, + 33, + -8, + 68, + 36, + 0, + 50, + 18, +-11, + 58, + 33, + 9, + 49, + 24, + -4, + 53, + 35, + 13, + 28, + 14, + -2, + 42, + 25, + 3, + 51, + 27, + 3, + 48, + 22, + -8, + 44, + 12, +-22, + 39, + 1, +-33, + 36, + 0, +-37, + 35, + 4, +-26, + 41, + 13, +-20, +-32, +-49, +-74, +-13, +-26, +-55, +-23, +-34, +-55, + -5, +-19, +-47, +-25, +-38, +-55, + -7, +-22, +-43, +-28, +-43, +-64, +-14, +-32, +-57, +-24, +-38, +-64, +-26, +-45, +-68, +-22, +-41, +-67, +-33, +-44, +-72, + 31, + 7, +-18, + 41, + 17, + -7, + 44, + 23, + -1, + 9, + 1, +-23, + 45, + 30, + 11, + -6, +-10, +-26, + 17, +-20, +-51, + 44, + 10, +-25, + 15, +-24, +-60, + 71, + 48, + 24, + 49, + 19, +-21, + 19, + 27, + -5, + 32, + 35, + 3, + 53, + 48, + 18, + 37, + 32, + -8, + 48, + 38, + -5, + 78, + 61, + 33, + 95, + 89, + 76, +102, + 97, + 90, +101, + 95, + 85, +100, + 88, + 78, + 85, + 31, +-41, + 62, + 64, + 55, + 13, + 26, + 10, + 24, + 32, + 21, + 30, +-24, +-63, + 36, + 8, +-59, +-21, + 10, +-33, + 33, + 3, +-42, + 84, + 50, +-12, + 87, + 46, +-17, + 57, + 44, + 30, + 53, + 40, + 25, + 74, + 65, + 54, + 54, +-38, +-59, + 52, +-25, +-48, + 37, +-14, +-38, + 4, +-25, +-51, + -9, +-26, +-52, + 15, + -7, +-36, + 18, +-10, +-39, + 22, +-12, +-46, + 7, +-32, +-69, + 7, +-39, +-87, + 13, +-29, +-74, + 11, +-33, +-79, + 26, + -5, +-34, + 37, + 5, +-31, +-49, +-79, +-100, + 14, +-12, +-42, + 45, + 10, +-30, + 33, + -3, +-41, + 37, + -7, +-55, + 38, + -3, +-54, + 42, + -5, +-57, + 46, + 7, +-30, + 61, + 28, + -9, + 53, + 25, + -8, + 48, + 28, + 4, + 47, + 33, + 7, + 58, + 28, + 2, + 58, + 17, + -8, + 55, + 8, +-13, + 70, + 41, + 19, + 56, + 42, + 21, + 62, + 46, + 26, + 58, + 36, + 14, + 62, + 37, + 9, + 64, + 30, + -3, + 57, + 23, +-11, + 51, + 9, +-39, + 61, + 28, +-11, + 50, + 12, +-30, + 57, + 23, + -8, + 57, + 32, + 6, + 62, + 36, + 7, + 55, + 30, + 2, + 50, + 17, +-17, + 34, + -2, +-32, + 37, + 5, +-29, + 36, + -5, +-45, + 20, +-23, +-66, + 32, + -2, +-35, + 40, + 8, +-23, +-32, +-51, +-77, + -8, +-20, +-44, +-21, +-34, +-57, + -8, +-23, +-47, +-23, +-36, +-54, +-24, +-33, +-59, +-42, +-54, +-73, +-15, +-30, +-55, +-32, +-47, +-69, +-38, +-53, +-75, +-13, +-31, +-57, +-40, +-54, +-74, + 15, + -2, +-30, + 39, + 15, + -9, + 34, + 15, + -9, + 7, + 2, +-24, + 35, + 22, + 1, + -2, + -5, +-24, + 6, +-32, +-61, + 45, + 11, +-24, + 21, +-18, +-55, + 60, + 42, + 24, + 56, + 27, + -5, + 18, +-18, +-54, + 28, +-19, +-61, + 60, + 4, +-63, + 42, + -2, +-59, + 39, + 5, +-28, + 91, + 79, + 63, + 90, + 85, + 73, + 89, + 79, + 58, + 89, + 86, + 76, + 69, + 8, +-20, + 64, + 18, +-94, + 14, + 19, + 9, + 37, + 43, + 37, + 36, + 32, + 16, + 67, +-17, +-104, + -2, +-11, +-49, + 30, + 7, +-30, + 83, + 31, +-60, + 99, + 59, +-62, + 98, + 61, +-17, + 61, + 54, + 40, + 56, + 43, + 27, + 65, + 54, + 42, + 24, + 17, +-11, + 79, + 24, + 13, + 83, + -2, +-14, + 88, + 10, + -3, + 68, + 30, + 12, + 40, + 9, +-16, + 19, +-13, +-42, + 3, +-36, +-71, + 31, + 2, +-30, + 12, +-26, +-64, + 24, +-10, +-47, + 9, +-32, +-71, + -3, +-55, +-101, + 6, +-42, +-91, +-94, +-99, +-95, + -3, +-38, +-72, + 15, +-32, +-79, + 25, +-21, +-66, + 44, + 6, +-33, + 42, + 8, +-29, + 57, + 25, +-15, + 63, + 34, + 3, + 50, + 22, + -5, + 54, + 18, + -9, + 51, + 15, +-11, + 44, + 10, +-16, + 36, + 12, +-12, + 45, + 20, + -1, + 41, + 16, + -2, + 46, + 32, + 12, + 33, + 4, +-20, + 44, + 14, +-12, + 58, + 27, + 4, + 73, + 51, + 31, + 59, + 32, + 5, + 68, + 48, + 25, + 66, + 38, + 7, + 57, + 25, + -6, + 62, + 29, + -4, + 51, + 4, +-39, + 45, + -2, +-42, + 53, + 10, +-40, + 47, + 6, +-41, + 38, + -3, +-45, + 28, +-15, +-56, + 24, +-16, +-51, + 23, +-12, +-41, + 31, + -2, +-35, + 49, + 24, + -3, + 45, + 19, +-11, +-28, +-45, +-70, +-10, +-22, +-45, +-26, +-35, +-56, + 1, +-12, +-40, +-25, +-37, +-56, +-11, +-29, +-54, +-34, +-43, +-61, +-18, +-31, +-58, +-37, +-53, +-74, +-40, +-53, +-77, +-28, +-43, +-69, +-33, +-52, +-73, +-12, +-19, +-50, + 34, + 12, +-13, + 18, + 2, +-23, + 3, + -1, +-28, + 24, + 17, + -6, + -4, + -4, +-25, + -5, +-40, +-70, + 45, + 12, +-23, + 24, +-15, +-54, + 38, + 20, + 2, + 64, + 36, + 7, + 63, + 8, +-44, + 59, + 10, +-33, + 76, + 37, + -2, + 45, + 1, +-42, + 50, + 14, +-20, + 59, + 24, +-22, + 88, + 64, + 20, + 81, + 72, + 53, + 77, + 58, + 43, + 45, + 17, +-59, + 36, + 39, + 14, + 61, + 65, + 58, + 49, + 45, + 38, + 42, + 19, + -7, + 41, + 16, +-26, + 28, + 34, + -4, + 14, + 35, + 1, + 16, + 36, + 5, + 51, + 54, + 29, +-17, + 21, +-26, + 59, + 52, + 39, + 48, + 35, + 18, + 59, + 47, + 30, + 51, + 55, + 34, + 81, + 83, + 68, +103, + 97, + 85, +102, + 84, + 70, +100, + 66, + 58, +103, + 88, + 77, +100, + 89, + 73, + 66, + 49, + 30, + 9, +-22, +-55, + 11, +-31, +-73, + 12, +-28, +-72, + 23, +-21, +-63, + 22, +-20, +-65, + 20, +-26, +-71, +-78, +-87, +-86, + 5, +-30, +-59, + 43, + 2, +-42, + 43, + -2, +-56, + 41, + -3, +-49, + 50, + 10, +-34, + 52, + 17, +-23, + 65, + 39, + 8, + 58, + 28, + -6, + 62, + 34, + 11, + 47, + 12, +-13, + 20, +-11, +-37, + 36, + 21, + -4, + 61, + 35, + 13, + 49, + 17, + -3, + 65, + 33, + 8, + 32, + 12, +-15, + 36, + 1, +-28, + 50, + 21, + -7, + 60, + 31, + 9, + 69, + 45, + 15, + 64, + 39, + 10, + 74, + 54, + 28, + 66, + 30, + -9, + 59, + 22, +-19, + 46, + 3, +-40, + 48, + 6, +-37, + 47, + 4, +-41, + 56, + 14, +-35, + 54, + 11, +-38, + 49, + 9, +-31, + 40, + -1, +-42, + 20, +-20, +-58, + 33, + 0, +-35, + 45, + 21, + -4, + 16, +-18, +-46, +-29, +-46, +-71, +-12, +-23, +-43, +-25, +-33, +-58, +-15, +-28, +-52, +-29, +-38, +-58, +-14, +-28, +-49, +-34, +-44, +-65, +-24, +-36, +-57, +-43, +-57, +-78, +-36, +-50, +-76, +-31, +-45, +-70, +-47, +-64, +-85, +-19, +-21, +-55, + -4, +-12, +-40, + 0, +-12, +-36, +-19, +-16, +-41, + 8, + 8, +-17, + -7, + -6, +-28, +-13, +-45, +-74, + 40, + 6, +-27, + 29, + -8, +-46, + 24, + -1, +-21, + 90, + 66, + 40, + 59, + 23, +-12, + 68, + 33, + 0, + 73, + 43, + 15, + 89, + 63, + 38, + 71, + 46, + 20, + 50, + 1, +-77, + 90, + 51, +-44, + 92, + 63, + 15, + 17, + 12, +-44, +-49, + 2, +-33, + 1, + -3, +-27, + 31, +-12, +-60, + 51, + -2, +-67, + 62, + 19, +-25, + 62, + 29, + -8, + 61, + 35, + 5, + 49, + 30, + -1, + 47, + 32, + 3, + 51, + 42, + 17, + 5, + 27, +-10, + 52, + 46, + 31, + 52, + 38, + 22, + 68, + 54, + 38, + 58, + 58, + 40, + 86, + 86, + 77, +103, + 99, + 93, +104, + 99, + 93, +104, +100, + 91, +106, + 99, + 93, + 95, + 88, + 76, + 60, + 15, + -8, +-17, +-59, +-100, + 1, +-40, +-85, + 19, +-22, +-66, + 21, +-20, +-57, + 34, + -6, +-49, + 53, + 22, +-12, + 24, + -4, +-30, + 44, + 21, + -5, + 46, + 9, +-33, + 45, + 7, +-38, + 48, + 9, +-34, + 44, + 0, +-50, + 42, + -5, +-63, + 58, + 15, +-35, + 58, + 19, +-24, + 55, + 25, + -8, + 49, + 26, + 1, + 59, + 44, + 19, + 62, + 40, + 18, + 56, + 12, +-12, + 64, + 15, + -8, + 68, + 27, + 4, + 76, + 55, + 32, + 58, + 45, + 18, + 66, + 51, + 27, + 56, + 32, + 7, + 60, + 30, + -3, + 63, + 28, +-11, + 58, + 21, +-22, + 61, + 18, +-38, + 69, + 30, +-22, + 64, + 28, +-13, + 66, + 34, + -5, + 65, + 35, + 2, + 72, + 48, + 21, + 64, + 40, + 13, + 63, + 33, + 2, + 58, + 25, +-11, + 41, + 4, +-28, + 23, +-18, +-55, + 19, +-27, +-73, + 27, + -6, +-43, +-36, +-52, +-82, +-11, +-22, +-41, +-25, +-35, +-52, +-20, +-30, +-51, +-30, +-36, +-58, +-16, +-24, +-45, +-40, +-50, +-70, +-29, +-40, +-60, +-32, +-51, +-71, +-49, +-61, +-84, +-22, +-34, +-55, +-44, +-60, +-83, +-21, +-22, +-55, +-16, +-17, +-48, +-44, +-40, +-71, +-56, +-46, +-74, + -3, + 0, +-26, +-11, + -8, +-31, +-23, +-44, +-68, + 38, + 4, +-29, + 29, + -7, +-44, + 5, +-33, +-67, + 71, + 47, + 25, + 91, + 64, + 37, + 92, + 60, + 31, + 89, + 53, + 16, + 85, + 50, + 9, + 88, + 62, + 20, + 58, + 20, +-14, + 30, +-16, +-77, + 41, + -4, +-92, + 27, +-31, +-98, + 41, +-19, +-121, + 64, + 6, +-74, + 72, + 41, + 11, + 82, + 67, + 48, + 86, + 74, + 57, + 86, + 76, + 63, + 86, + 77, + 63, + 78, + 72, + 56, + 48, + 45, + 25, + 58, + 43, + 19, + 38, + 16, +-15, + 48, + 38, + 22, + 60, + 49, + 32, + 63, + 50, + 34, + 58, + 49, + 33, + 98, + 88, + 73, + 66, + 53, + 45, + 87, + 85, + 79, +103, + 99, + 93, +101, + 89, + 72, +100, + 52, + -8, + 74, + 16, + 9, + 3, +-35, +-70, +-10, +-49, +-89, + -1, +-34, +-70, + 16, +-16, +-47, + 41, + 10, +-20, + 44, + 23, + -1, +-10, +-40, +-65, + 36, + 12, +-14, + 57, + 29, + -2, + 51, + 18, +-13, + 51, + 18, +-21, + 50, + 10, +-32, + 55, + 16, +-25, + 49, + 3, +-50, + 52, + 11, +-31, + 54, + 18, +-18, + 51, + 2, +-53, + 48, + 7, +-30, + 67, + 45, + 21, + 54, + 14, +-32, + 71, + 44, + 7, + 63, + 32, + -5, + 53, + 10, +-38, + 78, + 60, + 33, + 47, + 5, +-31, + 60, + 13, +-38, + 57, + 22, +-12, + 67, + 30, +-10, + 60, + 17, +-35, + 67, + 30, +-12, + 68, + 33, + -5, + 72, + 47, + 16, + 57, + 26, + -4, + 72, + 48, + 22, + 70, + 54, + 36, + 55, + 43, + 27, + 72, + 55, + 34, + 51, + 21, + -5, + 66, + 41, + 17, + 60, + 26, +-16, + 37, + -1, +-37, + 25, + -8, +-43, +-45, +-59, +-84, +-27, +-40, +-62, +-27, +-36, +-54, +-30, +-40, +-62, +-22, +-35, +-56, +-30, +-43, +-61, +-30, +-41, +-62, +-29, +-40, +-60, +-46, +-59, +-79, +-46, +-57, +-80, +-36, +-51, +-74, +-53, +-68, +-90, +-36, +-36, +-67, +-10, +-13, +-43, +-41, +-36, +-65, +-103, +-70, +-104, +-15, +-10, +-35, +-15, +-11, +-35, +-36, +-47, +-69, + 36, + 3, +-31, + 33, + -4, +-40, + 29, + -6, +-33, + 54, + 17, +-15, + 58, + 24, + -8, + 48, + 11, +-21, + 69, + 40, + 14, + 83, + 62, + 37, + 64, + 34, + 8, + 57, + 11, +-21, + 52, + -9, +-80, + 54, +-15, +-128, + 65, + 3, +-128, + 75, + 36, + -6, + 80, + 49, + 30, + 88, + 57, + 41, + 86, + 58, + 44, + 85, + 63, + 50, + 87, + 67, + 56, + 87, + 73, + 61, + 56, + 59, + 42, + 78, + 77, + 64, + 93, + 88, + 78, + 81, + 76, + 67, + 25, + 20, + 7, + 51, + 46, + 31, + 61, + 46, + 28, + 57, + 41, + 23, + 65, +-33, +-43, + 44, +-64, +-66, + 2, +-66, +-68, + 59, + 32, + 3, +100, + 53, +-34, + 97, + 21, + 16, + 93, + 57, + 49, + 6, +-30, +-59, + 5, +-27, +-57, + 4, +-30, +-65, +-13, +-41, +-72, +-19, +-33, +-57, +-14, +-17, +-36, +-17, +-51, +-82, + -4, +-17, +-33, + 27, + 20, + 8, + 45, + 20, + -2, + 57, + 27, + -3, + 56, + 25, + -4, + 44, + 9, +-19, + 61, + 21, +-20, + 75, + 39, + -3, + 50, + 11, +-31, + 60, + 31, + 3, + 37, +-10, +-48, + 61, + 18, +-31, + 58, + 19, +-23, + 58, + 11, +-43, + 58, + 17, +-27, + 68, + 36, + -5, + 53, + 12, +-30, + 48, + 1, +-48, + 70, + 39, + 4, + 60, + 22, +-14, + 72, + 39, + -4, + 69, + 30, +-16, + 62, + 27, + -5, + 49, + 12, +-19, + 69, + 39, + 4, + 56, + 33, + 11, + 56, + 50, + 37, + 31, + 30, + 18, + 38, + 34, + 20, + 32, + 31, + 16, + 39, + 33, + 19, + 57, + 48, + 33, + 63, + 35, + 6, + 49, + 20, + -7, + 31, + 1, +-26, + 9, +-16, +-46, +-29, +-44, +-67, +-44, +-57, +-78, +-29, +-42, +-67, +-24, +-38, +-60, +-20, +-30, +-54, +-47, +-56, +-80, +-26, +-38, +-65, +-54, +-67, +-83, +-45, +-58, +-77, +-34, +-50, +-75, +-57, +-68, +-91, +-16, +-28, +-54, +-21, +-22, +-54, +-35, +-32, +-61, +-113, +-73, +-110, +-26, +-19, +-45, +-19, +-14, +-38, +-48, +-58, +-79, + 37, + 3, +-30, + 30, + -7, +-40, + 20, +-13, +-38, + 93, + 70, + 47, + 85, + 62, + 39, + 78, + 53, + 28, + 62, + 25, +-20, + 51, + 7, +-55, + 37, +-31, +-81, + 37, +-60, +-128, + 53, +-32, +-128, + 63, + -8, +-128, + 70, + 18, +-42, + 61, +-10, +-24, + 76, + -1, +-14, + 76, + 6, + -6, + 83, + 28, + 17, + 90, + 53, + 43, + 89, + 64, + 53, + 90, + 70, + 60, + 78, + 67, + 55, + 78, + 75, + 66, + 94, + 89, + 83, + 95, + 92, + 86, + 56, + 53, + 45, + 18, + 20, + 12, + 36, + 25, + 8, + 62, + 50, + 32, + 62, + 25, + 10, + 30, +-30, +-39, +-10, +-104, +-113, + 40, +-24, +-28, + 94, + 59, + 57, + 87, + 51, + 49, + 86, + 31, + 22, + 5, +-19, +-47, + 0, +-15, +-40, + -8, +-21, +-45, + 1, +-21, +-52, +-32, +-52, +-83, +-35, +-64, +-92, +-14, +-52, +-76, + 32, + -1, +-26, + 30, + 9, +-17, + 37, + 24, + -7, + 39, + 34, + 19, + 55, + 48, + 32, + 52, + 33, + 11, + 68, + 51, + 27, + 74, + 50, + 21, + 72, + 46, + 20, + 70, + 44, + 19, + 75, + 44, + 10, + 63, + 30, + -2, + 68, + 41, + 13, + 69, + 35, + -5, + 57, + 14, +-39, + 75, + 49, + 17, + 66, + 37, + 9, + 75, + 48, + 16, + 77, + 57, + 31, + 71, + 46, + 21, + 79, + 59, + 32, + 73, + 47, + 21, + 64, + 43, + 18, + 71, + 58, + 38, + 55, + 48, + 32, + 37, + 30, + 13, + 39, + 25, + -3, + 43, + 30, + 7, + 50, + 25, + -5, + 29, + 8, +-19, + 49, + 13, +-11, + 34, + 16, +-13, + 53, + 44, + 19, + 46, + 41, + 25, + 75, + 60, + 39, + 40, + 15, +-13, + 61, + 31, + -5, + 51, + 20, +-17, + 33, + 4, +-31, + -2, +-33, +-69, +-13, +-49, +-87, +-30, +-62, +-94, +-44, +-67, +-92, +-55, +-76, +-93, +-58, +-72, +-91, +-32, +-48, +-69, +-61, +-74, +-96, +-32, +-36, +-63, +-37, +-35, +-65, +-27, +-23, +-55, +-114, +-82, +-112, +-35, +-28, +-53, +-34, +-28, +-50, +-67, +-68, +-90, + 33, + 0, +-32, + 29, + -8, +-41, + 0, +-35, +-65, + 93, + 68, + 43, + 85, + 61, + 34, + 53, + 4, +-86, + 61, + 12, +-84, + 64, + 19, +-71, + 72, + 37, +-19, + 63, + 16, +-10, + 55, +-37, +-103, + 64, +-18, +-128, + 41, +-49, +-86, + 58, +-42, +-52, + 60, +-32, +-46, + 72, +-18, +-29, + 73, +-14, +-23, + 85, + 16, + 7, + 91, + 55, + 46, + 93, + 62, + 54, + 92, + 75, + 66, + 33, + 51, + 37, + 83, + 83, + 75, + 93, + 91, + 85, + 77, + 75, + 69, + -9, + -7, +-13, + -3, + -4, +-17, + 64, + 50, + 33, + 68, + 51, + 33, + 51, + 30, + 15, + 63, + 54, + 53, + 66, + 18, + 21, + 80, + 23, + 27, + 83, + 72, + 68, + 81, + 52, + 41, + 15, + -8, +-38, + 15, + -4, +-30, + 13, + -5, +-33, + 2, +-18, +-50, + -4, +-29, +-59, +-18, +-44, +-70, +-19, +-33, +-61, + 24, + -1, +-31, + 36, + 16, +-13, + 24, + 10, +-20, + 35, + 30, + 13, + 60, + 47, + 28, + 50, + 32, + 12, + 65, + 46, + 23, + 74, + 48, + 21, + 79, + 59, + 32, + 80, + 56, + 23, + 70, + 40, + 6, + 68, + 36, + 4, + 72, + 47, + 22, + 77, + 50, + 14, + 65, + 25, +-29, + 77, + 46, + 11, + 72, + 47, + 23, + 66, + 34, + -2, + 74, + 44, + 9, + 77, + 59, + 32, + 74, + 53, + 28, + 77, + 57, + 28, + 70, + 53, + 31, + 50, + 37, + 18, + 56, + 50, + 36, + 48, + 43, + 30, + 43, + 35, + 11, + 42, + 18, +-10, + 68, + 41, + 11, + 42, + 23, + -3, + 50, + 12, +-15, + 44, + 22, +-10, + 30, + 19, + -5, + 26, + 21, + 9, + 43, + 38, + 22, + 57, + 45, + 24, + 55, + 32, + 4, + 64, + 32, + -3, + 69, + 41, + 5, + 53, + 20, +-21, + 44, + 3, +-37, + 32, +-10, +-50, + 42, + 4, +-38, + 23, +-19, +-61, + 11, +-35, +-83, + 8, +-29, +-68, + -1, +-33, +-66, +-88, +-74, +-101, +-60, +-54, +-80, +-25, +-21, +-53, +-65, +-57, +-80, +-44, +-35, +-58, +-38, +-30, +-52, +-53, +-50, +-68, + 28, + -5, +-37, + 27, +-12, +-44, + 0, +-38, +-68, + 79, + 52, + 29, + 91, + 67, + 43, + 55, + 5, +-82, + 63, + 14, +-86, + 68, + 25, +-69, + 76, + 38, +-38, + 80, + 53, + 4, + 85, + 74, + 52, + 69, + 28, +-15, +-15, +-48, +-80, + 5, +-39, +-65, + 61, + 3, + -6, + 67, + 8, + -3, + 68, + 0, + -8, + 70, + -7, +-13, + 87, + 33, + 29, + 92, + 77, + 72, + 94, + 81, + 74, + 79, + 58, + 52, + 30, + 47, + 36, + 81, + 77, + 73, + 36, + 53, + 40, + 35, + 41, + 30, + -6, + -4, +-14, + 34, + 17, + -2, + 56, + 42, + 24, + 69, + 52, + 32, + 48, + 8, + -4, + 70, + 31, + 35, + 60, + 14, + 14, + 76, + 59, + 54, + 54, + 24, + 7, + 23, +-16, +-57, + 22, +-15, +-56, + 19, +-19, +-53, + 26, + 14, + -9, + 6, + 0, +-18, + 5, + 2, +-18, + 39, + 30, + 8, + 31, + 28, + 9, + 37, + 33, + 21, + 64, + 43, + 23, + 63, + 34, + 5, + 69, + 41, + 10, + 64, + 31, + -4, + 68, + 32, + -7, + 76, + 44, + 11, + 40, + -1, +-37, + 78, + 54, + 24, + 62, + 29, + -4, + 62, + 21, +-29, + 76, + 42, + -8, + 59, + 19, +-34, + 47, + 5, +-33, + 75, + 42, + -2, + 68, + 38, + 1, + 61, + 24, +-22, + 56, + 23, + -8, + 80, + 60, + 34, + 59, + 24, +-18, + 57, + 22, +-13, + 72, + 42, + 3, + 66, + 39, + 9, + 70, + 40, + 11, + 71, + 42, + 12, + 61, + 32, + 3, + 36, + 34, + 23, + 23, + 23, + 6, + 45, + 39, + 13, + 49, + 44, + 17, + 29, + 29, + 8, + 39, + 35, + 20, + 51, + 27, + 0, + 73, + 52, + 24, + 61, + 33, + 3, + 58, + 26, + -8, + 70, + 37, + -4, + 48, + 10, +-30, + 33, +-10, +-49, + 55, + 20, +-16, + 25, +-19, +-60, + 28, +-17, +-58, + 39, + -2, +-43, + 34, +-10, +-59, + 27, +-19, +-67, + 18, +-28, +-71, +-47, +-45, +-74, +-92, +-77, +-102, +-41, +-34, +-61, +-38, +-32, +-58, +-57, +-47, +-66, +-42, +-34, +-54, +-56, +-48, +-62, + 18, +-15, +-47, + 27, +-13, +-44, + 4, +-35, +-67, + 65, + 38, + 16, + 91, + 68, + 45, + 58, + 8, +-65, + 66, + 19, +-97, + 73, + 30, +-81, + 80, + 40, +-46, + 80, + 44, +-28, + 80, + 48, +-15, + 35, + 24, +-22, +-10, + 8, +-15, + 11, + 27, + 5, + 24, + 30, + 16, + 80, + 75, + 63, + 83, + 78, + 67, + 87, + 78, + 70, + 85, + 77, + 71, + 85, + 80, + 77, + 87, + 81, + 78, + 55, + 62, + 56, + 18, + 36, + 28, + 60, + 50, + 50, + -6, + 25, + 4, + 65, + 70, + 63, + 28, + 34, + 26, + -1, + -6, +-17, + 45, + 29, + 12, + 54, + 40, + 24, + 59, + 34, + 14, + 41, +-29, +-30, + 48, + 40, + 37, + 39, +-12, +-17, + 46, + 9, +-32, + 25, +-16, +-65, + 22, +-22, +-67, + 33, + -3, +-42, + 21, +-17, +-49, + 51, + 30, + 3, + 39, + 28, + 10, + 50, + 41, + 27, + 68, + 53, + 31, + 59, + 35, + 7, + 67, + 36, + 6, + 62, + 19, +-31, + 64, + 23, +-22, + 72, + 39, + 2, + 75, + 37, +-22, + 67, + 32, + -4, + 71, + 46, + 15, + 73, + 38, +-11, + 57, + 4, +-55, + 67, + 39, + 12, + 68, + 39, + 3, + 54, + 16, +-23, + 63, + 29, + -3, + 58, + 24, +-13, + 58, + 21, +-19, + 77, + 54, + 26, + 51, + 7, +-39, + 62, + 16, +-44, + 67, + 31, + -8, + 71, + 43, + 9, + 60, + 19, +-28, + 72, + 40, + -4, + 67, + 35, + -7, + 64, + 26, +-21, + 67, + 35, + -3, + 66, + 42, + 15, + 70, + 46, + 23, + 68, + 59, + 40, + 34, + 34, + 23, + 57, + 46, + 28, + 70, + 43, + 14, + 59, + 24, + -9, + 66, + 30, +-16, + 60, + 18, +-31, + 63, + 30, +-11, + 65, + 25, +-31, + 60, + 23, +-23, + 57, + 20, +-22, + 53, + 13, +-36, + 41, + -3, +-58, + 48, + 12, +-24, + 49, + 14, +-25, + 42, + 2, +-44, + 35, + -7, +-54, + 17, +-29, +-68 +}; diff --git a/examples/app_flash_two_models_one_arena/src/image2.h b/examples/app_flash_two_models_one_arena/src/image2.h new file mode 100644 index 000000000..4daa44d76 --- /dev/null +++ b/examples/app_flash_two_models_one_arena/src/image2.h @@ -0,0 +1,27650 @@ +int8_t image2[96*96*3] = { +122, +122, +122, +122, +122, +122, +122, +122, +122, +121, +121, +121, +123, +123, +123, +124, +124, +124, +122, +122, +122, +122, +122, +122, +119, +119, +119, +118, +118, +118, +123, +123, +123, +121, +121, +121, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +122, +122, +122, +120, +120, +120, +121, +121, +121, +124, +122, +123, +125, +122, +123, +125, +122, +123, +124, +121, +122, +124, +121, +122, +123, +121, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +125, +120, +122, +125, +120, +122, +121, +122, +122, +120, +123, +123, +121, +122, +124, +124, +122, +124, +120, +122, +121, +120, +122, +121, +122, +122, +120, +125, +124, +121, +124, +123, +118, +123, +120, +117, +117, +113, +113, +115, +111, +111, +116, +112, +112, +117, +113, +113, +120, +117, +117, +123, +121, +122, +121, +121, +124, +122, +121, +123, +119, +119, +120, +119, +119, +119, +123, +121, +121, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +122, +121, +121, +121, +118, +119, +123, +120, +121, +123, +120, +121, +123, +120, +121, +124, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +122, +121, +121, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +118, +118, +118, +117, +117, +117, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +113, +113, +113, +116, +116, +116, +119, +117, +118, +119, +117, +118, +119, +116, +117, +118, +115, +116, +118, +115, +116, +118, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +119, +115, +116, +117, +116, +116, +113, +118, +116, +111, +115, +114, +116, +117, +118, +117, +114, +116, +118, +115, +114, +107, +105, +102, + 92, + 88, + 85, + 80, + 75, + 71, + 68, + 62, + 56, + 68, + 60, + 55, + 46, + 36, + 32, + 29, + 19, + 14, + 33, + 23, + 18, + 38, + 28, + 24, + 54, + 45, + 40, + 85, + 76, + 73, +104, + 98, + 96, +117, +112, +111, +120, +117, +116, +119, +117, +118, +116, +116, +117, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +117, +116, +116, +113, +111, +111, +119, +117, +118, +119, +116, +117, +118, +115, +116, +118, +115, +116, +119, +116, +117, +120, +117, +118, +120, +117, +118, +117, +115, +115, +117, +114, +115, +117, +114, +115, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +117, +117, +116, +116, +116, +114, +114, +114, +113, +113, +113, +116, +116, +116, +117, +117, +117, +116, +116, +116, +115, +115, +115, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +114, +114, +114, +110, +110, +110, +108, +108, +108, +115, +113, +114, +116, +114, +114, +116, +114, +114, +119, +116, +117, +119, +116, +117, +118, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +117, +117, +114, +118, +117, +112, +119, +117, +113, +119, +115, +114, +113, +111, +106, + 99, + 97, + 77, + 68, + 64, + 59, + 50, + 45, + 58, + 47, + 41, + 44, + 32, + 25, + 33, + 19, + 11, + 25, + 9, + 0, + 7, +-12, +-21, + 4, +-15, +-24, + 11, + -9, +-18, + 2, +-17, +-26, + 9, +-10, +-20, + 14, + -3, +-12, + 30, + 16, + 8, + 60, + 48, + 43, + 87, + 79, + 76, +108, +103, +103, +116, +114, +116, +118, +115, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +116, +116, +116, +113, +114, +116, +114, +115, +119, +116, +117, +118, +116, +117, +118, +116, +117, +118, +115, +116, +118, +115, +116, +117, +115, +116, +116, +113, +114, +115, +112, +113, +115, +112, +113, +113, +113, +113, +115, +115, +115, +117, +117, +117, +118, +118, +118, +118, +118, +118, +112, +112, +112, +115, +115, +115, +117, +117, +117, +119, +119, +119, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +119, +116, +117, +120, +117, +118, +116, +114, +114, +118, +115, +116, +118, +115, +116, +118, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +117, +117, +117, +117, +117, +117, +115, +116, +117, +115, +119, +119, +116, +120, +117, +113, +113, +110, + 84, + 75, + 72, + 57, + 41, + 38, + 43, + 25, + 19, + 33, + 14, + 7, + 20, + 0, + -7, + 23, + 1, + -8, + 6, +-17, +-26, +-12, +-36, +-47, +-22, +-49, +-60, +-16, +-43, +-55, + -5, +-32, +-43, + -9, +-36, +-48, +-13, +-40, +-51, +-11, +-36, +-47, +-11, +-33, +-43, +-14, +-33, +-41, + -2, +-17, +-22, + 32, + 21, + 19, + 92, + 83, + 82, +120, +115, +116, +121, +118, +119, +119, +116, +117, +119, +116, +117, +118, +115, +116, +118, +115, +116, +117, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +117, +116, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +117, +118, +118, +116, +117, +117, +114, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +116, +116, +116, +112, +112, +112, +114, +114, +114, +115, +115, +115, +115, +115, +115, +113, +113, +113, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +115, +115, +115, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +118, +115, +116, +118, +116, +117, +115, +112, +113, +118, +115, +116, +118, +115, +116, +117, +115, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +119, +116, +116, +118, +118, +116, +115, + 93, + 85, + 83, + 52, + 32, + 29, + 48, + 20, + 18, + 36, + 11, + 4, + 17, + -9, +-17, + 31, + 4, + -5, + 13, +-14, +-25, + 6, +-24, +-36, +-15, +-44, +-57, +-11, +-39, +-50, + 11, +-17, +-28, + 28, + -1, +-12, + 22, + -7, +-18, + 3, +-26, +-36, +-16, +-42, +-52, +-33, +-55, +-64, +-24, +-46, +-55, +-23, +-44, +-53, +-15, +-35, +-43, + 13, + -6, +-13, + 95, + 89, + 88, +118, +115, +116, +119, +117, +117, +119, +116, +117, +120, +117, +118, +119, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +117, +116, +116, +118, +116, +116, +118, +116, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +115, +116, +117, +114, +115, +115, +112, +113, +116, +114, +114, +117, +114, +115, +117, +114, +115, +116, +115, +116, +111, +111, +110, +112, +112, +111, +113, +113, +112, +114, +113, +113, +114, +113, +113, +108, +107, +107, +111, +110, +110, +115, +114, +114, +115, +114, +114, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +114, +114, +114, +114, +114, +114, +114, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +116, +116, +117, +116, +116, +117, +116, +116, +116, +115, +116, +116, +116, +116, +117, +116, +116, +116, +113, +114, +117, +114, +115, +114, +111, +112, +115, +112, +113, +115, +112, +113, +114, +112, +113, +113, +113, +112, +113, +113, +112, +114, +113, +113, +114, +114, +113, +114, +114, +114, +114, +114, +113, +114, +114, +113, +114, +114, +113, +116, +115, +115, +116, +115, +115, +116, +115, +115, +117, +114, +116, +116, +112, +114, +105, + 99, + 98, + 62, + 49, + 47, + 56, + 30, + 29, + 43, + 10, + 7, + 17, +-13, +-22, + 6, +-23, +-36, + -3, +-34, +-49, + 11, +-22, +-37, + 28, + -5, +-18, + 31, + 1, +-11, + 45, + 19, + 8, + 67, + 41, + 31, + 69, + 44, + 33, + 59, + 31, + 20, + 39, + 11, + -3, + 0, +-27, +-40, +-18, +-41, +-52, +-20, +-41, +-51, +-34, +-56, +-64, +-22, +-44, +-52, + -7, +-30, +-41, + 18, + 8, + 5, + 98, + 92, + 91, +117, +113, +112, +118, +115, +115, +118, +115, +115, +118, +114, +115, +116, +115, +115, +116, +115, +115, +115, +115, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +114, +114, +113, +113, +112, +112, +113, +112, +112, +113, +112, +112, +114, +111, +111, +114, +111, +111, +113, +110, +111, +112, +110, +110, +112, +110, +110, +113, +111, +111, +113, +110, +111, +112, +109, +110, +113, +110, +111, +113, +111, +111, +113, +111, +111, +112, +111, +111, +114, +112, +110, +114, +112, +110, +114, +112, +110, +113, +111, +109, +115, +113, +111, +111, +109, +107, +113, +111, +110, +114, +112, +110, +114, +112, +110, +114, +112, +111, +114, +112, +111, +114, +112, +111, +115, +113, +111, +115, +113, +111, +114, +113, +112, +113, +113, +113, +113, +113, +113, +112, +112, +112, +112, +112, +112, +114, +114, +114, +116, +114, +114, +116, +113, +114, +116, +113, +114, +115, +112, +113, +114, +111, +112, +113, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +112, +111, +114, +112, +111, +115, +113, +112, +115, +113, +111, +116, +114, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +116, +114, +113, +117, +115, +113, +117, +115, +113, +120, +115, +114, +110, +104, +105, + 53, + 46, + 48, + 77, + 61, + 63, + 71, + 46, + 45, + 50, + 16, + 11, + 30, + -5, +-16, + 17, +-19, +-38, + 25, +-13, +-38, + 39, + 3, +-19, + 61, + 28, + 15, + 69, + 40, + 31, + 76, + 52, + 39, + 78, + 55, + 44, + 80, + 56, + 43, + 74, + 46, + 29, + 60, + 25, + 4, + 21, +-10, +-32, +-28, +-50, +-68, +-26, +-44, +-55, +-29, +-43, +-50, +-36, +-50, +-55, +-38, +-55, +-61, +-30, +-49, +-57, + 25, + 12, + 5, +105, + 99, + 92, +117, +115, +111, +118, +114, +114, +120, +113, +115, +118, +115, +114, +116, +114, +113, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +113, +111, +110, +113, +111, +110, +113, +111, +110, +112, +110, +109, +112, +110, +109, +111, +109, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +112, +110, +109, +113, +111, +110, +113, +111, +110, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +110, +108, +106, +110, +108, +106, +110, +108, +106, +112, +110, +108, +111, +109, +108, +106, +104, +102, +106, +104, +102, +111, +109, +108, +113, +111, +109, +114, +112, +110, +114, +112, +110, +115, +113, +111, +116, +114, +112, +116, +114, +112, +115, +114, +113, +114, +114, +114, +114, +114, +114, +113, +113, +113, +113, +113, +113, +115, +115, +115, +117, +115, +116, +118, +115, +116, +118, +115, +116, +111, +108, +109, +113, +110, +111, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +117, +114, +115, +117, +114, +115, +117, +115, +115, +117, +115, +113, +117, +115, +113, +118, +116, +114, +115, +113, +112, +116, +114, +113, +117, +115, +114, +116, +114, +113, +116, +114, +113, +117, +115, +114, +117, +115, +114, +117, +115, +114, +116, +114, +114, + 75, + 71, + 74, + 59, + 49, + 53, + 85, + 67, + 69, + 65, + 39, + 35, + 52, + 18, + 9, + 42, + -3, +-17, + 40, + -8, +-27, + 50, + 4, +-21, + 62, + 21, + -3, + 69, + 34, + 16, + 76, + 46, + 32, + 83, + 55, + 42, + 79, + 52, + 40, + 74, + 47, + 34, + 76, + 45, + 30, + 66, + 29, + 9, + 26, + -8, +-29, +-43, +-66, +-84, +-56, +-73, +-85, +-46, +-59, +-66, +-45, +-57, +-62, +-45, +-59, +-64, +-52, +-68, +-74, +-37, +-49, +-56, + 58, + 51, + 46, +113, +110, +106, +118, +115, +115, +119, +114, +115, +115, +112, +111, +113, +111, +110, +112, +110, +109, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +112, +115, +113, +112, +114, +112, +111, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +107, +109, +107, +105, +108, +106, +105, +109, +107, +105, +111, +109, +107, +112, +110, +108, +110, +108, +106, +111, +109, +107, +113, +111, +109, +115, +113, +111, +114, +112, +110, +114, +112, +110, +115, +113, +111, +117, +115, +113, +117, +115, +113, +116, +115, +114, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +116, +117, +119, +116, +117, +119, +116, +117, +117, +115, +116, +118, +116, +117, +120, +117, +118, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +116, +116, +119, +117, +115, +119, +117, +115, +119, +117, +116, +115, +113, +111, +116, +114, +113, +118, +115, +114, +117, +115, +114, +117, +115, +114, +118, +116, +114, +118, +116, +114, +118, +116, +114, +111, +109, +111, + 50, + 44, + 48, + 87, + 72, + 76, + 72, + 48, + 48, + 67, + 35, + 27, + 58, + 21, + 6, + 57, + 1, +-18, + 58, + 0, +-23, + 61, + 7, +-20, + 63, + 16, +-10, + 71, + 32, + 9, + 75, + 41, + 20, + 81, + 46, + 29, + 78, + 45, + 30, + 72, + 40, + 26, + 75, + 40, + 23, + 63, + 24, + 3, + 32, + -2, +-26, +-32, +-54, +-75, +-69, +-85, +-100, +-63, +-74, +-81, +-46, +-54, +-59, +-41, +-51, +-55, +-37, +-46, +-51, +-21, +-30, +-34, + 19, + 12, + 9, + 97, + 92, + 90, +115, +111, +111, +114, +110, +111, +114, +111, +110, +113, +111, +109, +112, +110, +108, +113, +110, +109, +113, +111, +109, +113, +111, +109, +111, +109, +107, +111, +109, +108, +113, +111, +110, +116, +114, +112, +116, +114, +112, +115, +113, +111, +114, +112, +110, +114, +112, +110, +113, +111, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +111, +109, +107, +110, +108, +107, +110, +108, +107, +111, +109, +108, +107, +105, +103, +106, +104, +103, +106, +104, +103, +108, +106, +105, +108, +106, +105, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +108, +107, +112, +110, +108, +112, +110, +108, +112, +111, +110, +112, +112, +112, +112, +112, +112, +113, +113, +113, +113, +113, +113, +113, +113, +113, +116, +114, +115, +116, +114, +115, +116, +114, +115, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +115, +112, +113, +117, +115, +116, +117, +115, +115, +117, +115, +114, +117, +115, +114, +117, +115, +114, +115, +113, +112, +115, +113, +111, +117, +115, +113, +116, +114, +113, +116, +114, +113, +116, +114, +112, +116, +114, +113, +116, +114, +112, + 89, + 85, + 85, + 73, + 61, + 63, + 81, + 57, + 58, + 65, + 31, + 24, + 55, + 15, + -2, + 49, + 7, +-21, + 57, + 2, +-28, + 60, + 2, +-28, + 65, + 8, +-22, + 63, + 12, +-18, + 62, + 20, + -9, + 70, + 31, + 2, + 78, + 37, + 11, + 72, + 35, + 12, + 70, + 35, + 14, + 73, + 36, + 12, + 67, + 26, + -1, + 46, + 11, +-17, +-19, +-41, +-64, +-63, +-79, +-95, +-57, +-64, +-72, + -9, +-14, +-19, + -8, +-15, +-18, +-32, +-36, +-38, + -1, + -5, + -6, + 7, + 0, + -1, + 75, + 68, + 68, +113, +109, +108, +111, +110, +108, +112, +110, +109, +113, +111, +109, +112, +110, +108, +110, +108, +106, +109, +107, +105, +110, +108, +106, +107, +105, +103, +107, +105, +103, +109, +107, +106, +110, +108, +107, +110, +108, +107, +111, +108, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +108, +106, +105, +108, +106, +104, +108, +106, +104, +107, +105, +103, +112, +110, +108, +111, +109, +108, +111, +109, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +114, +111, +110, +114, +111, +110, +113, +112, +112, +113, +113, +113, +113, +113, +113, +114, +114, +114, +114, +114, +114, +114, +114, +114, +115, +112, +113, +115, +112, +113, +115, +112, +113, +116, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +116, +114, +114, +111, +108, +109, +116, +114, +112, +116, +114, +112, +115, +113, +112, +117, +115, +113, +114, +112, +111, +116, +114, +112, +115, +113, +112, +115, +113, +112, +114, +112, +111, +114, +112, +111, +113, +111, +110, + 69, + 61, + 58, + 79, + 62, + 59, + 61, + 28, + 23, + 53, + 8, + -5, + 49, + -1, +-27, + 49, + -1, +-38, + 51, + 1, +-38, + 56, + 3, +-34, + 59, + 5, +-29, + 59, + 7, +-26, + 58, + 12, +-21, + 63, + 21, +-15, + 67, + 24, +-13, + 61, + 21, +-13, + 69, + 32, + 1, + 69, + 31, + 0, + 61, + 20, +-14, + 38, + 3, +-29, +-20, +-43, +-68, +-58, +-72, +-89, +-69, +-76, +-85, +-68, +-71, +-75, +-31, +-34, +-36, + -8, + -8, + -9, + -7, + -8, + -8, + 12, + 5, + 7, + 60, + 51, + 52, +114, +109, +108, +113, +112, +110, +114, +112, +111, +114, +112, +111, +114, +112, +110, +111, +109, +107, +111, +109, +107, +112, +110, +108, +113, +111, +109, +112, +110, +109, +113, +110, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +109, +108, +110, +110, +108, +110, +110, +108, +112, +110, +109, +112, +109, +109, +112, +109, +109, +112, +110, +110, +112, +110, +110, +112, +110, +110, +113, +111, +111, +113, +111, +111, +114, +111, +111, +114, +111, +111, +114, +111, +111, +114, +112, +112, +114, +113, +113, +114, +113, +113, +115, +114, +114, +115, +114, +114, +115, +114, +114, +114, +112, +113, +114, +112, +112, +114, +112, +112, +117, +114, +115, +117, +114, +115, +117, +114, +115, +114, +112, +113, +114, +112, +113, +115, +112, +113, +117, +114, +115, +118, +115, +116, +115, +112, +112, +117, +115, +113, +117, +115, +113, +116, +114, +113, +115, +113, +112, +115, +113, +112, +116, +113, +111, +117, +112, +111, +115, +113, +111, +113, +113, +111, +114, +112, +110, +111, +108, +107, + 74, + 64, + 63, + 65, + 42, + 38, + 48, + 6, + -3, + 47, + -7, +-26, + 50, + -5, +-34, + 48, + -2, +-37, + 46, + 1, +-40, + 49, + 2, +-37, + 53, + 2, +-35, + 57, + 5, +-31, + 60, + 8, +-27, + 57, + 8, +-30, + 59, + 11, +-31, + 60, + 16, +-25, + 64, + 22, +-17, + 61, + 21, +-19, + 56, + 14, +-27, + 36, + 0, +-36, + -9, +-33, +-60, +-39, +-55, +-74, +-34, +-41, +-51, +-50, +-53, +-60, +-43, +-45, +-49, + -8, + -5, +-10, +-33, +-35, +-37, + 6, + -3, + -2, + 56, + 46, + 47, +111, +106, +104, +113, +112, +109, +114, +112, +110, +114, +112, +110, +114, +112, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +114, +112, +110, +113, +111, +109, +113, +111, +109, +112, +110, +109, +112, +110, +108, +112, +110, +109, +112, +110, +108, +112, +110, +108, +111, +109, +107, +110, +108, +107, +109, +107, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +110, +110, +110, +110, +111, +108, +110, +111, +108, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +111, +108, +109, +111, +108, +109, +115, +112, +113, +114, +111, +112, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +118, +115, +116, +118, +115, +116, +118, +115, +116, +116, +113, +114, +116, +113, +114, +116, +114, +115, +118, +115, +116, +118, +115, +116, +117, +115, +115, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +111, +115, +113, +111, +119, +113, +112, +120, +113, +113, +116, +115, +113, +114, +114, +112, +116, +114, +112, +104, + 98, + 98, + 64, + 52, + 53, + 59, + 33, + 29, + 44, + -2, +-17, + 48, + -9, +-33, + 50, + -5, +-33, + 47, + 0, +-30, + 46, + 1, +-37, + 49, + 2, +-36, + 52, + 3, +-34, + 57, + 5, +-32, + 63, + 9, +-27, + 62, + 8, +-29, + 60, + 9, +-33, + 59, + 9, +-33, + 60, + 13, +-30, + 59, + 15, +-29, + 57, + 14, +-31, + 34, + -3, +-41, +-16, +-43, +-71, +-40, +-58, +-78, +-46, +-55, +-68, +-38, +-43, +-51, +-60, +-63, +-71, +-34, +-33, +-41, +-25, +-27, +-33, +-19, +-27, +-31, + 30, + 21, + 19, +104, + 98, + 96, +112, +110, +107, +115, +113, +111, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +113, +111, +110, +113, +110, +109, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +109, +107, +106, +110, +108, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +107, +105, +104, +110, +110, +110, +110, +111, +108, +110, +111, +108, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +111, +108, +109, +110, +107, +108, +113, +110, +111, +113, +110, +111, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +117, +114, +115, +117, +115, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +118, +115, +116, +117, +115, +115, +117, +115, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +117, +115, +115, +116, +114, +112, +116, +114, +112, +115, +113, +111, +114, +112, +110, +114, +112, +110, +116, +111, +111, +117, +112, +112, +114, +114, +112, +112, +112, +110, +117, +114, +112, +101, + 93, + 93, + 67, + 52, + 51, + 66, + 40, + 31, + 58, + 13, + -5, + 56, + 1, +-25, + 53, + -1, +-30, + 47, + -1, +-31, + 47, + 3, +-34, + 52, + 7, +-31, + 56, + 10, +-28, + 60, + 11, +-25, + 62, + 13, +-24, + 61, + 11, +-28, + 59, + 9, +-35, + 60, + 10, +-34, + 61, + 13, +-32, + 62, + 14, +-31, + 60, + 13, +-32, + 39, + -2, +-41, +-16, +-47, +-75, +-41, +-62, +-83, +-56, +-69, +-83, +-52, +-58, +-69, +-65, +-70, +-80, +-58, +-60, +-70, +-56, +-61, +-69, +-30, +-40, +-45, + 16, + 6, + 4, +102, + 96, + 94, +106, +104, +102, +114, +112, +110, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +113, +111, +109, +113, +110, +109, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +109, +107, +106, +110, +108, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +106, +104, +103, +110, +110, +109, +110, +111, +108, +110, +111, +108, +112, +110, +111, +113, +110, +111, +113, +110, +111, +112, +109, +110, +107, +105, +105, +112, +110, +110, +111, +108, +109, +111, +108, +109, +112, +109, +110, +114, +112, +112, +114, +112, +112, +114, +111, +112, +114, +111, +112, +115, +113, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +114, +114, +116, +114, +114, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +115, +116, +118, +115, +116, +117, +114, +115, +117, +115, +115, +115, +113, +112, +117, +115, +113, +117, +115, +114, +117, +115, +113, +117, +115, +113, +117, +113, +112, +116, +113, +112, +114, +115, +112, +115, +116, +113, +117, +112, +111, +101, + 91, + 92, + 62, + 43, + 39, + 50, + 21, + 8, + 53, + 11, +-13, + 54, + 3, +-28, + 54, + 4, +-27, + 52, + 3, +-26, + 55, + 10, +-26, + 55, + 11, +-26, + 57, + 13, +-24, + 60, + 16, +-21, + 62, + 18, +-19, + 59, + 14, +-24, + 60, + 13, +-31, + 59, + 12, +-32, + 60, + 14, +-30, + 61, + 14, +-30, + 61, + 14, +-30, + 50, + 7, +-32, + 1, +-32, +-64, +-37, +-61, +-85, +-58, +-73, +-90, +-71, +-81, +-94, +-81, +-90, +-102, +-68, +-74, +-87, +-56, +-65, +-75, +-39, +-51, +-57, + 18, + 8, + 5, +108, +101, +100, +111, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +106, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +105, +108, +106, +105, +108, +106, +105, +109, +107, +105, +108, +108, +108, +108, +109, +106, +109, +109, +107, +112, +109, +110, +112, +109, +110, +112, +109, +110, +109, +106, +107, +103, +100, +101, +111, +108, +109, +111, +109, +110, +111, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +113, +110, +111, +109, +106, +107, +112, +110, +111, +114, +111, +112, +113, +110, +111, +113, +110, +111, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +115, +112, +113, +115, +112, +113, +116, +113, +114, +116, +113, +114, +117, +114, +115, +111, +109, +109, +114, +111, +112, +114, +112, +112, +114, +112, +110, +114, +112, +110, +114, +112, +111, +113, +111, +110, +113, +111, +110, +113, +111, +110, +112, +112, +109, +110, +112, +109, +110, +111, +109, +116, +110, +109, +101, + 88, + 90, + 56, + 33, + 27, + 34, + 3, +-14, + 34, + -4, +-34, + 46, + 0, +-35, + 49, + 2, +-33, + 46, + -2, +-33, + 45, + 0, +-34, + 44, + 1, +-34, + 47, + 5, +-30, + 56, + 16, +-20, + 55, + 17, +-20, + 55, + 17, +-20, + 63, + 24, +-16, + 62, + 23, +-18, + 57, + 16, +-24, + 58, + 16, +-24, + 59, + 15, +-24, + 56, + 14, +-24, + 30, + -6, +-40, +-23, +-50, +-77, +-52, +-70, +-90, +-68, +-81, +-97, +-77, +-88, +-103, +-69, +-79, +-94, +-59, +-70, +-84, +-44, +-58, +-67, + 27, + 15, + 12, +108, +101, +100, +108, +107, +107, +109, +107, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +108, +106, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +107, +105, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +105, +105, +105, +106, +103, +105, +106, +104, +111, +108, +109, +111, +108, +109, +111, +108, +109, +110, +108, +108, +110, +107, +108, +110, +107, +108, +109, +106, +107, +109, +106, +107, +110, +107, +108, +111, +108, +109, +111, +108, +109, +111, +108, +109, +109, +106, +107, +112, +109, +110, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +111, +111, +113, +111, +111, +113, +110, +111, +112, +109, +110, +112, +109, +110, +112, +109, +110, +107, +105, +106, +110, +108, +109, +113, +111, +111, +112, +110, +108, +111, +109, +107, +110, +108, +106, +111, +109, +107, +111, +109, +107, +110, +110, +108, +110, +111, +109, +109, +112, +109, +111, +110, +108, +111, +103, +103, + 47, + 32, + 35, + 2, +-23, +-31, + 2, +-29, +-49, + 22, +-15, +-48, + 36, + -7, +-46, + 41, + -6, +-41, + 39, + -9, +-41, + 37, + -7, +-40, + 37, + -5, +-39, + 27, +-13, +-47, + 22, +-15, +-50, + 26, + -9, +-45, + 30, + -3, +-39, + 36, + 5, +-32, + 50, + 18, +-18, + 53, + 18, +-17, + 56, + 18, +-16, + 57, + 17, +-16, + 59, + 17, +-18, + 49, + 10, +-25, + -7, +-36, +-64, +-50, +-70, +-91, +-63, +-78, +-95, +-70, +-83, +-100, +-73, +-85, +-103, +-63, +-77, +-92, +-33, +-49, +-59, + 29, + 17, + 13, +108, +101, +100, +105, +104, +103, +107, +105, +104, +107, +105, +104, +107, +105, +104, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +104, +102, +101, +103, +101, +100, +103, +101, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, +103, +101, +100, +103, +101, +100, +103, +101, + 99, +107, +106, +106, +108, +106, +104, +108, +106, +103, +110, +108, +107, +110, +108, +107, +110, +108, +107, +111, +109, +108, +111, +109, +108, +110, +108, +107, +109, +107, +107, +109, +107, +107, +110, +108, +107, +111, +109, +108, +110, +107, +106, +109, +107, +106, +107, +105, +104, +112, +109, +109, +111, +109, +108, +112, +110, +108, +113, +110, +110, +113, +110, +110, +113, +110, +110, +113, +110, +110, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +108, +111, +109, +108, +112, +110, +109, +114, +112, +110, +112, +110, +108, +110, +108, +107, +111, +109, +107, +112, +110, +108, +113, +111, +109, +111, +112, +108, +112, +111, +109, +115, +109, +110, +111, +110, +110, +109, +108, +104, + 45, + 32, + 28, +-12, +-31, +-42, +-32, +-52, +-71, +-25, +-49, +-77, + 9, +-22, +-56, + 32, + -9, +-44, + 40, + -9, +-41, + 35, + -7, +-39, + 24, +-15, +-48, + 3, +-34, +-67, + -9, +-43, +-78, + -4, +-36, +-69, + 9, +-22, +-54, + 17, +-15, +-45, + 34, + -1, +-33, + 48, + 11, +-23, + 53, + 16, +-18, + 55, + 20, +-13, + 58, + 19, +-15, + 49, + 10, +-25, +-10, +-38, +-67, +-49, +-66, +-90, +-58, +-73, +-93, +-60, +-79, +-97, +-49, +-77, +-91, + 15, +-24, +-38, + 27, +-10, +-23, + 40, + 33, + 28, +106, +106, +106, +115, +107, +107, +108, +105, +104, +110, +108, +106, +110, +108, +107, +109, +107, +106, +109, +107, +106, +108, +106, +105, +105, +103, +101, +106, +104, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +104, +105, +103, +102, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +105, +103, +101, +102, +100, + 99, +102, +100, + 99, +102, +100, + 98, +100, + 98, + 96, +109, +106, +107, +109, +107, +105, +109, +107, +104, +109, +108, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +107, +109, +107, +105, +101, + 99, + 97, +112, +110, +109, +112, +110, +108, +112, +110, +108, +114, +112, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +114, +112, +110, +114, +112, +110, +112, +109, +108, +108, +106, +104, +113, +111, +109, +115, +113, +112, +110, +112, +108, +113, +110, +109, +117, +108, +111, +112, +112, +112, +113, +114, +109, + 62, + 49, + 44, +-29, +-50, +-60, +-46, +-66, +-81, +-15, +-38, +-58, +-30, +-61, +-85, + 9, +-32, +-60, + 38, +-12, +-41, + 38, + -4, +-43, + 16, +-22, +-62, +-15, +-50, +-86, +-30, +-61, +-94, +-14, +-42, +-72, + 4, +-24, +-53, + 30, + -2, +-35, + 49, + 12, +-24, + 50, + 11, +-28, + 51, + 14, +-24, + 55, + 21, +-14, + 60, + 21, +-14, + 48, + 8, +-26, +-11, +-39, +-68, +-50, +-69, +-94, +-51, +-71, +-93, +-45, +-70, +-91, + 7, +-28, +-48, + 60, + 4, +-15, + 61, + 5, + -8, + 81, + 60, + 57, +106, +105, +106, +110, +104, +103, +101, + 98, + 97, +110, +108, +107, +110, +108, +106, +110, +108, +106, +110, +108, +107, +110, +108, +107, +111, +109, +107, +110, +108, +107, +108, +106, +105, +108, +106, +105, +108, +106, +105, +107, +105, +104, +106, +104, +102, +103, +101, + 99, +110, +108, +107, +109, +107, +105, +107, +105, +103, +107, +105, +104, +107, +105, +103, +106, +104, +102, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +102, +109, +106, +107, +109, +107, +105, +109, +107, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +105, +110, +108, +106, +110, +108, +106, +109, +107, +106, +110, +108, +106, +111, +109, +107, +112, +110, +108, +110, +108, +106, +110, +108, +107, +113, +111, +109, +114, +112, +110, +115, +113, +112, +114, +112, +110, +113, +111, +109, +113, +111, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +115, +113, +111, +115, +113, +112, +113, +111, +109, +111, +109, +107, +111, +109, +107, +113, +111, +109, +114, +112, +111, +112, +112, +108, +114, +110, +109, +116, +109, +111, +111, +111, +111, +114, +112, +108, + 69, + 50, + 46, + 11, +-15, +-28, +-27, +-53, +-72, + 2, +-25, +-45, +-17, +-51, +-75, + 18, +-26, +-55, + 39, +-12, +-46, + 33, +-12, +-61, + 23, +-18, +-66, +-15, +-50, +-92, +-28, +-57, +-92, +-31, +-56, +-83, + -9, +-34, +-62, + 4, +-30, +-70, + 22, +-16, +-59, + 43, + 4, +-41, + 52, + 13, +-29, + 58, + 22, +-16, + 61, + 21, +-15, + 39, + -3, +-36, +-23, +-55, +-84, +-49, +-74, +-101, +-35, +-63, +-88, + 1, +-33, +-57, + 49, + 6, +-26, + 61, + -8, +-36, + 41, +-36, +-48, +105, + 68, + 68, +111, +107, +108, +107, +110, +106, +111, +109, +107, +110, +108, +107, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +108, +106, +105, +111, +109, +108, +110, +108, +106, +110, +108, +107, +110, +108, +107, +109, +107, +105, +111, +109, +107, +109, +107, +106, +108, +106, +105, +109, +107, +105, +109, +107, +105, +107, +105, +104, +107, +105, +104, +107, +105, +104, +108, +106, +105, +109, +107, +105, +109, +107, +105, +107, +105, +103, +109, +106, +107, +109, +107, +105, +108, +107, +104, +110, +108, +106, +110, +108, +107, +110, +108, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +111, +109, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +107, +106, +104, +103, +113, +111, +109, +115, +113, +111, +115, +113, +111, +114, +112, +111, +113, +111, +110, +112, +110, +109, +111, +109, +108, +111, +109, +107, +111, +108, +107, +111, +109, +107, +112, +110, +108, +113, +111, +110, +115, +112, +111, +115, +113, +111, +114, +112, +110, +112, +110, +108, +111, +109, +107, +111, +109, +108, +112, +110, +109, +112, +110, +109, +111, +111, +108, +113, +109, +108, +114, +109, +110, +110, +111, +111, +110, +105, +102, + 65, + 37, + 36, + 22, +-11, +-32, + -7, +-39, +-68, +-13, +-46, +-73, + 13, +-25, +-54, + 64, + 18, +-16, + 51, + -1, +-42, + 26, +-24, +-77, + 23, +-23, +-74, + -7, +-47, +-92, +-18, +-51, +-88, +-13, +-41, +-71, + 12, +-17, +-49, + 24, +-13, +-57, + 26, +-15, +-62, + 40, + -5, +-50, + 54, + 12, +-31, + 61, + 22, +-15, + 62, + 18, +-14, + 32, +-13, +-42, +-22, +-58, +-87, +-34, +-67, +-95, + 9, +-29, +-55, + 57, + 11, +-17, + 42, +-12, +-48, + 58, +-18, +-49, + 43, +-38, +-50, +111, + 73, + 75, +110, +107, +108, +106, +111, +104, +110, +109, +106, +110, +108, +107, +110, +108, +107, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +105, +109, +107, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +109, +106, +108, +110, +108, +106, +110, +108, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +108, +106, +105, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +112, +110, +108, +111, +109, +107, +111, +109, +107, +108, +106, +105, +106, +104, +102, +109, +107, +105, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +110, +108, +106, +108, +106, +104, +107, +105, +104, +109, +107, +105, +109, +107, +105, +109, +107, +104, +112, +106, +106, +111, +106, +108, +107, +110, +109, + 95, + 89, + 87, + 50, + 16, + 17, + 30, +-11, +-29, + 16, +-24, +-45, + 19, +-22, +-36, + 64, + 19, + 2, + 63, + 12, +-13, + 47, +-10, +-42, + 28, +-29, +-69, + 25, +-28, +-71, + 13, +-35, +-77, + -5, +-48, +-89, + 7, +-31, +-71, + 24, +-13, +-54, + 35, + -5, +-49, + 46, + 2, +-43, + 58, + 10, +-33, + 61, + 14, +-23, + 63, + 19, +-12, + 64, + 17, +-11, + 47, + -1, +-29, + 16, +-24, +-52, + 4, +-34, +-61, + 55, + 9, +-21, + 56, + 2, +-31, + 59, + -3, +-38, + 78, + 3, +-26, + 60, + -5, +-17, +118, + 95, + 95, +106, +110, +110, +110, +110, +103, +110, +108, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +108, +106, +104, +109, +106, +105, +109, +107, +105, +108, +106, +104, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +103, +104, +109, +107, +105, +108, +107, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +111, +109, +107, +109, +107, +105, +109, +107, +105, +108, +106, +105, +107, +105, +103, +109, +107, +106, +110, +108, +106, +109, +107, +105, +109, +107, +105, +111, +109, +108, +111, +109, +107, +109, +107, +106, +109, +107, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +109, +107, +106, +110, +109, +107, +109, +107, +106, +109, +107, +106, +108, +106, +105, +106, +105, +103, +109, +107, +106, +110, +108, +107, +110, +108, +106, +110, +108, +106, +109, +108, +105, +112, +106, +105, +110, +107, +107, +107, +110, +109, + 89, + 82, + 81, + 35, + -2, + -1, + 33, +-15, +-22, + 37, +-11, +-15, + 60, + 11, + 15, + 54, + 1, + 4, + 50, + -9, +-14, + 50, +-14, +-26, + 37, +-25, +-51, + 31, +-28, +-60, + 35, +-19, +-57, + 28, +-24, +-67, + 23, +-25, +-73, + 28, +-16, +-64, + 43, + 0, +-42, + 57, + 10, +-30, + 62, + 12, +-27, + 62, + 13, +-20, + 64, + 18, + -9, + 66, + 18, + -7, + 60, + 11, +-16, + 46, + 4, +-24, + 54, + 11, +-18, + 67, + 16, +-15, + 44, +-17, +-52, + 40, +-26, +-58, + 55, +-12, +-37, + 81, + 37, + 25, +112, +108, +104, + 99, +110, +108, +112, +107, +100, +109, +106, +103, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +104, +102, +100, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +102, + 96, +101, +108, +106, +105, +107, +107, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +109, +107, +105, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +108, +109, +108, +107, +109, +109, +108, +110, +110, +109, +111, +110, +109, +111, +107, +106, +108, +107, +106, +109, +111, +110, +113, +111, +110, +112, +110, +109, +111, +110, +109, +112, +110, +109, +111, +109, +108, +110, +109, +108, +110, +109, +108, +110, +110, +108, +111, +110, +108, +111, +108, +109, +109, +111, +110, +107, +112, +110, +107, +110, +111, +114, +101, + 91, + 94, + 40, + 2, + -2, + 32, +-17, +-33, + 34, +-17, +-23, + 56, + 2, + 3, + 43, +-15, +-23, + 50, +-16, +-28, + 58, +-15, +-22, + 44, +-26, +-38, + 40, +-26, +-46, + 39, +-22, +-53, + 34, +-23, +-62, + 32, +-23, +-63, + 45, + -6, +-46, + 54, + 10, +-29, + 56, + 12, +-26, + 54, + 11, +-26, + 57, + 16, +-19, + 61, + 22, +-11, + 60, + 19, + -9, + 52, + 13, +-15, + 50, + 12, +-19, + 60, + 17, +-16, + 68, + 13, +-22, + 44, +-22, +-57, + 48, +-16, +-50, + 63, + 13, +-11, + 93, + 69, + 62, +112, +105, +108, +108, +105, +110, +112, +105, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 87, + 80, + 86, +107, +104, +104, +107, +108, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +106, +109, +107, +105, +109, +107, +105, +110, +109, +110, +117, +116, +118, +117, +117, +119, +117, +116, +119, +118, +118, +120, +117, +116, +119, +117, +116, +118, +117, +117, +119, +117, +116, +119, +117, +116, +119, +117, +116, +119, +117, +116, +118, +115, +115, +117, +115, +115, +117, +116, +116, +118, +117, +116, +119, +117, +116, +119, +117, +116, +118, +119, +117, +115, +119, +117, +114, +115, +116, +120, +114, +104, +109, + 44, + 9, + 4, + 24, +-25, +-46, + 35, +-17, +-27, + 33, +-21, +-24, + 45, +-13, +-24, + 51, +-15, +-29, + 55, +-19, +-24, + 46, +-24, +-36, + 28, +-38, +-59, + 37, +-26, +-56, + 43, +-15, +-52, + 47, +-10, +-47, + 56, + 3, +-33, + 53, + 10, +-28, + 52, + 9, +-28, + 56, + 15, +-21, + 58, + 18, +-16, + 59, + 20, +-13, + 56, + 18, +-14, + 51, + 13, +-18, + 48, + 9, +-24, + 63, + 20, +-15, + 56, + 3, +-33, + 65, + 3, +-32, + 74, + 18, +-14, + 55, + 15, + -5, +115, + 95, + 89, +112, +106, +109, +110, +107, +110, +112, +106, +106, +109, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 72, + 66, + 71, +108, +105, +104, +106, +107, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +106, +104, +102, +105, +103, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +107, +109, +114, +113, +115, +110, +109, +112, +110, +110, +112, +114, +113, +115, +114, +113, +115, +110, +109, +112, +111, +110, +113, +114, +113, +116, +111, +110, +113, +111, +111, +113, +112, +111, +114, +110, +109, +112, +110, +109, +112, +112, +111, +113, +112, +111, +114, +112, +111, +114, +111, +110, +113, +112, +108, +108, +115, +113, +112, +115, +118, +123, +117, +110, +115, + 48, + 17, + 13, + 24, +-23, +-47, + 14, +-37, +-52, + 32, +-19, +-25, + 49, + -5, +-19, + 51, + -9, +-25, + 38, +-31, +-37, + 44, +-20, +-36, + 31, +-31, +-55, + 26, +-34, +-66, + 41, +-18, +-53, + 56, + -3, +-38, + 58, + 3, +-30, + 52, + 10, +-27, + 55, + 15, +-21, + 60, + 20, +-15, + 59, + 21, +-13, + 56, + 19, +-13, + 53, + 16, +-18, + 51, + 12, +-23, + 51, + 11, +-24, + 64, + 19, +-16, + 64, + 14, +-20, + 71, + 17, +-17, + 70, + 26, + 1, + 91, + 63, + 47, +117, +104, + 98, +109, +106, +106, +107, +106, +107, +110, +106, +103, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 58, + 52, + 58, +104, +102, +101, +106, +107, +103, +107, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +108, +106, +103, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +106, +107, +116, +115, +117, +114, +113, +116, +115, +114, +116, +115, +115, +117, +114, +114, +116, +116, +115, +118, +114, +114, +116, +116, +116, +118, +115, +115, +117, +115, +114, +117, +114, +114, +116, +114, +114, +116, +114, +114, +116, +115, +115, +117, +117, +116, +118, +117, +116, +118, +116, +115, +119, +118, +114, +116, +117, +114, +115, +112, +116, +122, +116, +113, +118, + 51, + 25, + 21, + 22, +-21, +-44, + 1, +-43, +-60, + 2, +-41, +-51, + 17, +-27, +-45, + 16, +-33, +-55, + 20, +-37, +-52, + 19, +-36, +-58, + 28, +-26, +-54, + 28, +-25, +-59, + 34, +-19, +-56, + 51, + -4, +-38, + 57, + 5, +-27, + 54, + 13, +-22, + 58, + 18, +-17, + 58, + 20, +-13, + 57, + 20, +-12, + 48, + 12, +-19, + 49, + 12, +-21, + 49, + 9, +-26, + 55, + 12, +-22, + 57, + 10, +-20, + 61, + 13, +-15, + 65, + 18, +-10, + 64, + 35, + 19, +112, + 96, + 86, +111, +105, +101, +105, +105, +104, +105, +106, +104, +107, +106, +101, +108, +106, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +102, +100, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 49, + 42, + 48, + 99, + 97, + 96, +104, +104, +100, +106, +104, +102, +106, +104, +102, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +107, +109, +115, +115, +117, +113, +113, +115, +114, +113, +115, +113, +112, +115, +114, +113, +116, +114, +114, +116, +115, +114, +117, +113, +113, +115, +115, +114, +116, +114, +114, +116, +116, +115, +117, +116, +115, +118, +116, +115, +118, +116, +116, +118, +117, +117, +119, +117, +117, +119, +119, +116, +121, +121, +116, +119, +120, +117, +119, +111, +117, +124, +113, +111, +118, + 49, + 26, + 22, + 13, +-23, +-44, + 6, +-31, +-45, + 14, +-20, +-32, + 1, +-32, +-57, + -3, +-39, +-72, + 15, +-26, +-54, + 14, +-29, +-57, + 24, +-19, +-52, + 24, +-20, +-58, + 24, +-21, +-60, + 49, + 1, +-34, + 59, + 12, +-20, + 57, + 18, +-16, + 59, + 20, +-13, + 58, + 21, +-11, + 52, + 17, +-14, + 47, + 13, +-17, + 48, + 11, +-21, + 49, + 7, +-24, + 62, + 15, +-12, + 54, + 4, +-18, + 60, + 13, + -6, + 60, + 18, + 1, + 92, + 76, + 66, +111, +106, +100, +108, +107, +104, +105, +108, +105, +105, +108, +103, +107, +107, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +102, +104, +102, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +104, +102, +100, +102, +100, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 45, + 39, + 47, + 88, + 85, + 87, +104, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +106, +108, +113, +113, +115, +108, +108, +110, +111, +111, +113, +112, +111, +114, +112, +111, +114, +110, +109, +112, +110, +110, +112, +110, +109, +112, +109, +109, +111, +110, +109, +112, +111, +110, +113, +117, +117, +118, +117, +117, +118, +117, +117, +119, +118, +117, +120, +118, +117, +120, +117, +117, +121, +119, +115, +120, +119, +116, +120, +111, +117, +123, +112, +112, +116, + 39, + 19, + 14, + 14, +-19, +-36, + 18, +-17, +-30, + 5, +-28, +-41, + -4, +-34, +-62, + 2, +-28, +-67, + 23, +-10, +-46, + 25, + -9, +-41, + 22, +-13, +-47, + 20, +-17, +-56, + 25, +-15, +-54, + 41, + -1, +-37, + 57, + 14, +-20, + 55, + 19, +-15, + 56, + 19, +-15, + 54, + 19, +-13, + 52, + 17, +-14, + 50, + 16, +-15, + 47, + 11, +-20, + 50, + 7, +-20, + 65, + 17, + -3, + 57, + 11, + -3, + 83, + 47, + 38, +108, + 78, + 72, +116, +106, +102, +107, +107, +105, +103, +104, +102, +104, +106, +103, +105, +106, +101, +106, +106, +100, +108, +106, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +106, +104, +102, +105, +103, +102, +105, +103, +101, +106, +104, +102, +105, +103, +101, +103, +101, +100, +102, +100, + 98, +103, +101, +100, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 43, + 39, + 52, + 73, + 69, + 77, +105, +101, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +105, +103, +101, +105, +103, +101, +105, +103, +102, +106, +104, +103, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +105, +103, +104, +106, +104, +106, +107, +105, +107, +106, +105, +106, +106, +105, +106, +106, +105, +106, +105, +104, +105, +104, +104, +105, +104, +104, +105, +104, +103, +104, +104, +103, +104, +104, +103, +104, +104, +104, +104, +104, +104, +104, +104, +104, +104, +105, +105, +105, +105, +105, +105, + 99, +104, +105, +100, +101, +106, +106, +100, +107, +102, +103, +104, +101, +100, + 95, + 36, + 18, + 9, + 21, +-11, +-24, + 14, +-22, +-38, + -3, +-43, +-61, + 10, +-31, +-55, + 16, +-22, +-52, + 22, +-12, +-45, + 30, + -4, +-31, + 35, + -1, +-28, + 31, + -7, +-38, + 32, + -8, +-42, + 35, + -7, +-44, + 50, + 10, +-27, + 50, + 19, +-17, + 50, + 19, +-17, + 51, + 18, +-18, + 52, + 18, +-17, + 49, + 13, +-21, + 50, + 15, +-16, + 54, + 12, +-11, + 60, + 13, + -1, + 65, + 37, + 29, +111, +103, +100, +111, +105, +110, +109, +106, +107, +106, +104, +102, +102, +100, + 98, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +105, +109, +107, +105, +106, +104, +102, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +104, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +105, +103, +101, +104, +102, +100, +106, +104, +103, +105, +103, +102, +103, +101, +100, +100, + 98, + 97, +101, + 99, + 98, +104, +102, +101, +104, +102, +100, +103, +101, +100, + 43, + 39, + 53, + 60, + 55, + 64, +105, +101, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +107, +105, +103, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +106, +102, +101, +102, + 98, + 97, +101, + 97, + 96, +101, + 97, + 96, +101, + 97, + 96, +101, + 97, + 96, +102, + 98, + 97, +102, + 98, + 97, +102, + 98, + 97, +103, + 99, + 98, +102, + 98, + 97, +103, + 99, + 98, +102, + 99, + 96, +102, + 99, + 96, +103, +100, + 97, +104, +101, + 98, +104, +101, + 98, +101, +102, +100, +102, +100, +102, +106, + 97, +102, +101, + 98, + 98, +102, +100, + 92, + 44, + 25, + 15, + 12, +-15, +-30, +-13, +-45, +-61, +-39, +-75, +-93, + 0, +-38, +-62, + 18, +-17, +-46, + 18, +-14, +-46, + 4, +-39, +-63, + 13, +-31, +-55, + 28, +-15, +-45, + 34, + -8, +-42, + 40, + 0, +-36, + 43, + 5, +-32, + 45, + 14, +-21, + 49, + 16, +-17, + 51, + 16, +-17, + 50, + 14, +-19, + 50, + 12, +-20, + 50, + 13, +-18, + 57, + 13, +-10, + 54, + 8, + -5, + 84, + 60, + 53, +112, +105, +103, +109, +105, +108, +109, +106, +106, +107, +105, +104, +105, +103, +101, +107, +105, +103, +108, +106, +104, +108, +106, +104, +109, +107, +105, +108, +106, +104, +104, +102, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +106, +104, +102, +105, +103, +101, +104, +102, +101, +103, +101, + 99, +102, +100, + 98, +104, +102, +101, +104, +102, +100, +103, +101, + 99, + 37, + 32, + 49, + 48, + 43, + 55, +100, + 96, +102, +106, +103, +103, +106, +104, +102, +105, +103, +102, +104, +102, +101, +104, +102, +101, +104, +102, +100, +103, +101, + 99, +106, +104, +102, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +108, +105, +104, +109, +104, +103, +109, +102, +102, +108, +101, +101, +107, +101, +101, +106, +100, +100, +107, +101, +100, +108, +103, +102, +108, +103, +103, +108, +103, +103, +106, +102, +101, +108, +103, +102, +107, +102, +101, +106, +102, + 99, +106, +102, + 98, +107, +103, + 99, +108, +104, +101, +108, +104, +101, +106, +105, +101, +108, +103, +102, +109, + 98, +102, +102, + 99, + 97, +107, +104, + 96, + 54, + 36, + 28, + 9, +-25, +-36, + 16, +-25, +-37, + 3, +-44, +-57, + -4, +-54, +-72, + 1, +-47, +-71, + 1, +-45, +-72, + 4, +-50, +-73, + 12, +-40, +-65, + 17, +-31, +-59, + 24, +-18, +-50, + 44, + 6, +-29, + 40, + 4, +-31, + 45, + 11, +-21, + 48, + 13, +-19, + 51, + 14, +-17, + 50, + 12, +-19, + 51, + 11, +-19, + 53, + 12, +-18, + 56, + 9, +-15, + 54, + 8, + -3, +101, + 80, + 74, +111, +108, +105, +109, +106, +107, +110, +107, +106, +108, +106, +104, +107, +105, +103, +106, +104, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +104, +107, +105, +104, +107, +105, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +104, +102, +101, +106, +104, +102, +105, +103, +101, +104, +102, +101, +105, +103, +101, +103, +101, +100, +105, +103, +101, +104, +102, +100, +104, +102, +100, + 32, + 26, + 45, + 42, + 37, + 50, + 90, + 86, + 93, +102, +100, + 99, +102, +100, + 98, +102, +100, + 99, +103, +101, +100, +103, +101, +100, +103, +101, + 99, +102, +100, + 98, +104, +102, +100, +106, +104, +102, +105, +103, +102, +105, +103, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +104, +102, +100, +106, +104, +102, +102, + 98, + 99, + 95, + 91, + 93, + 91, + 88, + 89, + 91, + 87, + 89, + 85, + 81, + 83, + 85, + 81, + 83, + 87, + 85, + 87, + 87, + 85, + 86, + 87, + 84, + 86, + 86, + 84, + 85, + 86, + 84, + 85, + 85, + 83, + 84, + 84, + 83, + 82, + 83, + 81, + 80, + 82, + 81, + 79, + 83, + 81, + 80, + 83, + 81, + 80, + 82, + 82, + 80, + 86, + 81, + 82, + 86, + 76, + 81, + 79, + 79, + 80, + 80, + 82, + 77, + 48, + 36, + 30, + 12, +-25, +-32, + 18, +-29, +-37, + 9, +-46, +-55, + 12, +-48, +-62, + 15, +-44, +-63, + 28, +-29, +-51, + 40, +-15, +-40, + 41, +-11, +-38, + 31, +-15, +-44, + 19, +-22, +-53, + 39, + 2, +-31, + 42, + 8, +-25, + 45, + 9, +-21, + 50, + 13, +-17, + 50, + 11, +-18, + 51, + 10, +-18, + 52, + 10, +-18, + 56, + 11, +-19, + 53, + 3, +-21, + 57, + 11, + 2, +109, + 89, + 86, +106, +106, +103, +107, +105, +103, +109, +106, +105, +107, +105, +103, +109, +107, +105, +106, +104, +102, +106, +104, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, + 20, + 14, + 34, + 38, + 31, + 46, + 74, + 69, + 78, +101, + 99, + 98, +101, + 99, + 97, +102, +100, + 98, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +104, +102, +100, +104, +102, +100, + 50, + 50, + 53, +-38, +-38, +-32, +-36, +-36, +-30, +-39, +-38, +-33, +-46, +-46, +-40, +-49, +-48, +-42, +-49, +-46, +-41, +-50, +-47, +-42, +-50, +-48, +-42, +-50, +-47, +-42, +-51, +-48, +-42, +-51, +-48, +-44, +-50, +-47, +-44, +-50, +-47, +-44, +-50, +-46, +-43, +-49, +-45, +-42, +-49, +-45, +-42, +-49, +-45, +-44, +-46, +-48, +-45, +-45, +-50, +-43, +-50, +-45, +-40, +-53, +-46, +-45, +-20, +-28, +-28, + 13, +-13, +-20, + 3, +-33, +-43, + -2, +-47, +-58, + -1, +-52, +-67, + 4, +-48, +-67, + 18, +-32, +-55, + 26, +-19, +-50, + 25, +-18, +-49, + 28, +-14, +-44, + 20, +-18, +-50, + 32, + -4, +-36, + 43, + 9, +-22, + 43, + 6, +-21, + 49, + 10, +-17, + 50, + 10, +-17, + 51, + 8, +-17, + 52, + 8, +-17, + 55, + 6, +-22, + 54, + 0, +-25, + 65, + 21, + 12, +114, + 95, + 93, +102, +104, +101, +103, +102, + 99, +105, +102, +100, +105, +103, +102, +106, +104, +103, +104, +102, +101, +105, +103, +102, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +-26, +-29, +-16, + 32, + 28, + 42, + 60, + 56, + 67, +103, +100, +102, +103, +101, +101, +101, + 99, + 98, +104, +102, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +106, +103, +102, +106, +103, +102, +105, +103, +101, +104, +102, +100, +102, +100, + 99, + 46, + 45, + 49, +-36, +-35, +-27, + 57, + 63, + 70, + 59, + 68, + 72, + 62, + 71, + 72, + 61, + 70, + 69, + 63, + 71, + 72, + 62, + 70, + 72, + 63, + 71, + 73, + 64, + 72, + 75, + 65, + 73, + 77, + 64, + 72, + 78, + 62, + 70, + 78, + 64, + 71, + 78, + 71, + 78, + 83, + 73, + 79, + 81, + 73, + 80, + 79, + 75, + 81, + 83, + 76, + 78, + 86, + 74, + 76, + 83, + 72, + 79, + 84, + 73, + 82, + 83, + 77, + 80, + 79, + 32, + 21, + 20, + 15, +-13, +-20, + 10, +-34, +-47, + -7, +-54, +-68, +-13, +-58, +-74, + 1, +-44, +-65, + 11, +-31, +-60, + 17, +-23, +-54, + 23, +-16, +-47, + 24, +-12, +-45, + 32, + -2, +-36, + 43, + 9, +-23, + 45, + 7, +-21, + 50, + 10, +-17, + 49, + 7, +-20, + 52, + 6, +-21, + 52, + 5, +-23, + 55, + 3, +-25, + 57, + 2, +-21, + 71, + 30, + 18, +113, + 99, + 97, +100, +103, +104, +102, +101, + 98, +104, +101, + 98, +103, +101, +100, +102, +100, + 98, +100, + 98, + 97, +104, +102, +100, +105, +102, +101, +104, +102, +100, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +101, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +-74, +-74, +-67, + 22, + 20, + 33, + 47, + 44, + 59, +100, + 97, +101, +104, +101, +104, +103, +100, +101, +103, +101, +101, +104, +102, +101, +103, +101, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +102, +100, + 98, + 92, + 90, + 88, + 35, + 32, + 37, +-45, +-45, +-36, + 8, + 17, + 25, + 22, + 35, + 40, + 22, + 35, + 35, + 25, + 37, + 32, + 23, + 33, + 32, + 19, + 29, + 29, + 22, + 31, + 33, + -3, + 6, + 9, + 17, + 25, + 30, + 8, + 17, + 22, + 13, + 25, + 26, + 25, + 34, + 37, + 86, + 94, + 97, + 89, + 95, + 99, + 90, + 95, + 98, + 89, + 94, + 99, + 88, + 94, +100, + 76, + 82, + 87, + 79, + 85, + 88, + 78, + 85, + 86, + 84, + 91, + 91, + 75, + 72, + 75, + 15, +-11, +-18, + 11, +-36, +-56, + 8, +-40, +-60, + 5, +-39, +-59, + 20, +-25, +-52, + 18, +-26, +-52, + 30, +-12, +-39, + 33, + -6, +-35, + 39, + 2, +-30, + 39, + 5, +-30, + 41, + 7, +-27, + 49, + 11, +-18, + 49, + 10, +-19, + 50, + 6, +-23, + 54, + 6, +-24, + 53, + 4, +-27, + 54, + 2, +-26, + 57, + 4, +-21, + 59, + 21, + 3, + 86, + 75, + 73, + 99, +102, +106, +104, +101, + 98, +105, +101, + 98, +104, +102, +100, +104, +102, +100, +104, +102, +100, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +103, +102, +104, +102, +101, +103, +101, + 99, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +104, +102, +100, +-103, +-103, +-96, + 3, + 1, + 14, + 39, + 37, + 51, + 93, + 89, + 94, +105, +102, +105, +103, +100, +101, +104, +101, +101, +103, +101, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +103, +101, +100, +100, + 98, + 97, + 91, + 89, + 88, + 38, + 34, + 41, +-52, +-52, +-40, +-19, +-12, + 0, + -6, + 6, + 15, + -8, + 4, + 8, + 1, + 11, + 12, + -1, + 7, + 11, + 1, + 10, + 15, + -1, + 8, + 15, +-38, +-30, +-21, +-31, +-24, +-13, +-36, +-27, +-19, +-22, + -9, +-13, + 1, + 12, + 10, + 87, + 95, + 97, + 88, + 93, +100, + 89, + 91, +104, + 89, + 93, +100, + 86, + 94, + 94, + 87, + 94, + 96, + 87, + 93, + 97, + 87, + 93, + 99, + 89, + 95, +102, + 65, + 65, + 70, + 19, + 0, + -7, + 10, +-30, +-54, + 14, +-25, +-53, + 13, +-20, +-52, + 20, +-16, +-54, + 32, + -8, +-35, + 39, + 0, +-26, + 45, + 6, +-22, + 45, + 8, +-23, + 39, + 5, +-28, + 40, + 6, +-27, + 44, + 6, +-24, + 43, + 4, +-27, + 49, + 7, +-25, + 54, + 7, +-24, + 57, + 8, +-23, + 59, + 7, +-25, + 60, + 10, +-22, + 48, + 9, +-16, + 27, + 17, + 10, + 97, +100, +100, +104, +104, + 98, +105, +102, + 99, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +105, +103, +102, +105, +103, +102, +107, +105, +103, +107, +105, +104, +106, +104, +103, +102, +100, + 98, +103, +100, + 99, +103, +101, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +100, + 98, + 97, +103, +101, + 99, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +102, +100, + 98, +102, +100, + 99, +104, +102, +100, +-90, +-92, +-86, +-24, +-27, +-15, + 38, + 33, + 49, + 78, + 74, + 78, +104, +100, +104, +104, +101, +103, +104, +102, +101, +103, +101, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +100, + 98, + 96, + 91, + 89, + 87, + 40, + 36, + 42, +-55, +-55, +-44, +-29, +-22, + -9, +-35, +-23, +-12, +-36, +-25, +-16, +-32, +-23, +-17, +-38, +-26, +-19, +-36, +-24, +-16, +-37, +-26, +-16, +-41, +-31, +-19, +-39, +-28, +-15, +-27, +-17, + -2, +-29, +-22, + -3, + -8, + -1, + 9, + 84, + 93, + 95, + 80, + 87, + 85, + 80, + 86, + 85, + 83, + 90, + 89, + 85, + 92, + 93, + 87, + 93, + 97, + 87, + 92, +102, + 74, + 78, + 92, + 40, + 43, + 60, + 11, + 13, + 28, + 51, + 36, + 40, + 15, +-23, +-35, + 17, +-18, +-36, + 21, +-10, +-32, + 29, + -3, +-34, + 39, + 4, +-23, + 40, + 4, +-23, + 37, + 1, +-26, + 35, + 0, +-29, + 38, + 3, +-29, + 43, + 7, +-25, + 42, + 5, +-26, + 47, + 8, +-25, + 52, + 10, +-23, + 57, + 10, +-24, + 61, + 13, +-21, + 63, + 13, +-21, + 63, + 15, +-21, + 45, + 6, +-24, + -5, +-17, +-29, + 75, + 78, + 77, + 99, +100, + 97, +102, +100, + 97, +104, +102, +100, +102, +100, + 98, + 98, + 96, + 94, +106, +104, +102, +105, +103, +102, +106, +103, +102, +106, +104, +102, +106, +104, +103, +105, +103, +102, +104, +102, +101, +104, +102, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +101, + 99, + 97, +104, +102, +101, +106, +104, +102, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +-49, +-53, +-46, +-55, +-60, +-48, + 35, + 28, + 44, + 64, + 61, + 65, +102, + 99, +102, +103, +100, +102, +104, +102, +102, +104, +102, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +106, +104, +102, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +100, + 98, + 97, + 92, + 90, + 88, + 43, + 41, + 42, +-57, +-56, +-50, +-28, +-20, +-11, +-34, +-22, +-13, +-35, +-23, +-15, +-32, +-23, +-17, +-38, +-26, +-19, +-38, +-25, +-18, +-39, +-26, +-17, +-37, +-25, +-15, +-36, +-24, +-12, + -6, + 3, + 21, + -8, + -3, + 25, +-10, + -3, + 10, + 87, + 95, + 96, + 85, + 93, + 89, + 87, + 93, + 90, + 86, + 91, + 95, + 76, + 81, + 92, + 61, + 64, + 79, + 31, + 34, + 51, + -7, + -6, + 18, +-22, +-22, + 4, + 21, + 21, + 43, + 32, + 17, + 28, + -5, +-43, +-47, + -2, +-39, +-47, + 4, +-28, +-39, + 16, +-18, +-37, + 22, +-10, +-35, + 26, + -6, +-33, + 31, + -3, +-30, + 35, + 0, +-28, + 38, + 3, +-27, + 43, + 7, +-24, + 47, + 11, +-23, + 50, + 11, +-23, + 55, + 13, +-22, + 60, + 14, +-21, + 63, + 15, +-20, + 60, + 13, +-22, + 59, + 12, +-23, + 38, + -3, +-34, +-14, +-30, +-39, + 52, + 52, + 55, + 63, + 64, + 68, +104, +102, +102, +107, +105, +103, +107, +105, +103, +103, +101, +100, +107, +105, +103, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +105, +103, +102, +104, +101, +100, +101, + 99, + 97, +103, +101, + 99, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, + -8, +-12, + -5, +-85, +-90, +-78, + 25, + 19, + 34, + 52, + 48, + 53, +102, + 99, +102, +106, +103, +104, +106, +103, +103, +106, +104, +102, +106, +104, +103, +107, +105, +104, +107, +105, +104, +106, +104, +103, +105, +103, +101, +105, +103, +101, +104, +102, +101, +103, +101, + 99, +102, +100, + 98, +102, +100, + 98, +100, + 98, + 97, + 92, + 90, + 88, + 47, + 46, + 44, +-60, +-58, +-57, +-30, +-21, +-17, +-32, +-19, +-13, +-32, +-20, +-15, +-24, +-14, +-11, +-37, +-23, +-20, +-37, +-22, +-18, +-38, +-24, +-18, +-39, +-25, +-18, +-37, +-24, +-15, +-26, +-14, + -4, +-15, + -5, + 5, +-14, + -4, + -2, + 84, + 93, + 92, + 74, + 80, + 86, + 55, + 55, + 72, + 23, + 23, + 45, + 0, + 0, + 25, +-15, +-15, + 10, +-26, +-27, + 1, +-30, +-31, + -1, +-39, +-41, + -9, + 28, + 28, + 42, + 7, + -8, + -8, +-11, +-49, +-62, +-15, +-54, +-67, + -5, +-40, +-53, + 13, +-23, +-42, + 23, + -7, +-31, + 27, + -3, +-28, + 34, + 2, +-25, + 39, + 4, +-23, + 44, + 7, +-20, + 45, + 8, +-21, + 50, + 13, +-21, + 52, + 14, +-21, + 54, + 12, +-23, + 57, + 11, +-25, + 56, + 9, +-28, + 55, + 8, +-24, + 49, + 2, +-29, + 27, +-15, +-42, + 13, + -4, +-10, + 51, + 49, + 56, + -5, + -5, + 6, + 86, + 84, + 86, +108, +106, +105, +108, +106, +105, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 11, + 13, + 20, +-110, +-108, +-100, + 4, + 5, + 16, + 42, + 38, + 48, + 93, + 89, + 95, +106, +103, +104, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +103, +101, +100, +103, +101, + 99, +103, +101, + 99, +100, + 98, + 97, + 92, + 90, + 89, + 50, + 48, + 49, +-60, +-57, +-55, +-34, +-24, +-23, +-41, +-27, +-25, +-45, +-31, +-28, +-42, +-31, +-26, +-49, +-37, +-30, +-48, +-36, +-28, +-40, +-29, +-19, +-38, +-28, +-14, +-40, +-31, +-15, +-25, +-18, + 1, + -8, + -6, + 18, + -3, + 0, + 22, + 8, + 10, + 30, + -8, + -8, + 17, +-23, +-25, + 6, +-35, +-37, + -5, +-31, +-33, + -2, +-32, +-33, + -4, +-36, +-36, + -8, +-39, +-39, +-12, +-48, +-48, +-21, + 34, + 35, + 44, + 13, + 1, + -5, + -7, +-43, +-68, + 4, +-41, +-71, + -5, +-50, +-73, + 6, +-36, +-51, + 20, +-13, +-33, + 31, + -3, +-25, + 39, + 3, +-20, + 45, + 8, +-17, + 46, + 8, +-19, + 46, + 7, +-22, + 46, + 6, +-27, + 46, + 6, +-27, + 48, + 6, +-26, + 43, + -1, +-33, + 41, + -6, +-38, + 42, +-12, +-41, + 32, +-20, +-49, + 11, +-22, +-49, + 59, + 51, + 39, + 42, + 43, + 50, +-45, +-44, +-18, + -5, + -6, + 12, + 68, + 66, + 79, +102, +101, +109, +104, +103, +105, +103, +102, +100, +105, +104, + 98, +106, +105, +101, +106, +104, +102, +106, +104, +103, +106, +103, +104, +106, +103, +104, +106, +103, +104, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 28, + 29, + 38, +-94, +-94, +-86, +-21, +-21, +-11, + 40, + 35, + 47, + 82, + 78, + 85, +104, +101, +102, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +102, +100, + 98, + 99, + 97, + 96, + 91, + 89, + 87, + 52, + 50, + 52, +-60, +-58, +-54, +-25, +-16, +-11, +-21, + -8, + -1, +-43, +-33, +-21, +-31, +-23, + -8, +-25, +-19, + -1, +-15, + -9, + 10, +-10, + -4, + 17, + -5, + 0, + 24, + -4, + 1, + 26, + -9, + -7, + 21, +-13, +-14, + 17, +-18, +-19, + 12, +-25, +-26, + 5, +-37, +-39, + -8, +-45, +-46, +-15, +-49, +-50, +-20, +-42, +-43, +-14, +-45, +-46, +-17, +-47, +-47, +-21, +-55, +-55, +-31, +-60, +-60, +-36, + 37, + 39, + 50, + 27, + 18, + 14, + -7, +-38, +-62, + 12, +-33, +-67, + 7, +-41, +-70, + -8, +-50, +-71, + 13, +-26, +-46, + 28, +-11, +-33, + 37, + -4, +-27, + 42, + -1, +-25, + 40, + -3, +-30, + 38, + -5, +-33, + 38, + -8, +-36, + 40, + -6, +-35, + 40, + -8, +-38, + 31, +-18, +-51, + 33, +-19, +-53, + 27, +-27, +-64, + 17, +-30, +-62, + 18, + -5, +-24, + 79, + 72, + 70, + 36, + 36, + 48, +-56, +-56, +-28, +-39, +-41, +-14, +-27, +-29, + -6, + 35, + 33, + 49, + 94, + 92, +101, +104, +103, +106, +104, +103, +102, +107, +105, +101, +107, +105, +102, +107, +105, +103, +107, +105, +103, +107, +105, +104, +106, +104, +103, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 50, + 45, + 59, +-54, +-58, +-48, +-50, +-53, +-45, + 37, + 32, + 44, + 68, + 63, + 71, +103, +100, +102, +102, +100, + 99, +102, +100, + 99, +103, +100, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +106, +104, +102, +105, +103, +101, +102, + 99, + 98, +102, +100, + 98, +100, + 98, + 96, + 92, + 90, + 88, + 55, + 52, + 53, +-60, +-60, +-55, +-28, +-22, +-10, +-14, + -6, + 13, +-12, + -7, + 18, + -4, + -2, + 27, + -5, + -4, + 26, + -9, + -8, + 23, +-13, +-12, + 20, +-16, +-16, + 17, +-25, +-25, + 8, +-32, +-32, + 0, +-31, +-31, + -3, +-38, +-38, +-10, +-44, +-45, +-17, +-50, +-50, +-22, +-52, +-53, +-25, +-43, +-44, +-16, +-45, +-45, +-18, +-55, +-55, +-29, +-60, +-60, +-37, +-71, +-70, +-49, +-78, +-77, +-56, + 36, + 38, + 49, + 43, + 37, + 36, + -1, +-24, +-43, + 13, +-24, +-57, + 17, +-26, +-61, + 10, +-33, +-65, + 13, +-32, +-56, + 28, +-17, +-42, + 33, +-14, +-39, + 36, +-12, +-37, + 33, +-17, +-42, + 30, +-21, +-44, + 29, +-25, +-43, + 29, +-27, +-50, + 26, +-31, +-62, + 27, +-30, +-67, + 31, +-24, +-64, + 21, +-25, +-69, + 2, +-29, +-64, + 58, + 40, + 33, + 83, + 74, + 87, + 15, + 12, + 33, +-60, +-59, +-37, +-51, +-52, +-26, +-44, +-46, +-18, +-30, +-32, + -9, + -1, + -3, + 15, + 49, + 47, + 60, + 92, + 89, + 99, +106, +104, +107, +106, +105, +105, +106, +105, +104, +105, +105, +103, +105, +106, +101, +105, +105, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 34, + 27, + 44, +-12, +-17, + -6, +-80, +-83, +-77, + 29, + 24, + 36, + 55, + 50, + 58, +100, + 97, + 98, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +103, +101, + 99, +104, +102, +100, +103, +101, +100, +100, + 98, + 96, + 98, + 96, + 94, + 90, + 88, + 86, + 58, + 54, + 53, +-55, +-58, +-52, +-25, +-23, + -5, +-28, +-24, + 3, +-35, +-34, + -1, +-24, +-26, + 9, +-23, +-26, + 11, +-28, +-31, + 5, +-31, +-34, + 2, +-38, +-41, + -5, +-43, +-45, +-10, +-48, +-49, +-17, +-51, +-50, +-25, +-55, +-54, +-29, +-57, +-57, +-32, +-58, +-58, +-33, +-62, +-62, +-37, +-69, +-68, +-45, +-57, +-56, +-34, +-62, +-61, +-39, +-72, +-70, +-51, +-86, +-84, +-67, +-89, +-86, +-69, + 12, + 16, + 25, + -6, + -8, + -9, + 21, + 8, + -8, + 6, +-20, +-52, + 15, +-22, +-61, + 23, +-22, +-61, + 18, +-30, +-60, + 27, +-21, +-50, + 33, +-19, +-46, + 37, +-16, +-43, + 34, +-20, +-46, + 28, +-29, +-50, + 24, +-34, +-49, + 24, +-37, +-59, + 23, +-38, +-69, + 25, +-31, +-66, + 21, +-28, +-63, + 11, +-19, +-55, + 41, + 27, + 6, + 82, + 69, + 71, + 77, + 69, + 90, +-13, +-16, + 7, +-64, +-62, +-44, +-56, +-55, +-30, +-47, +-48, +-19, +-43, +-45, +-17, +-31, +-34, + -9, +-21, +-25, + -1, + 2, + -2, + 20, + 60, + 57, + 68, + 99, + 98, +106, +105, +104, +109, +104, +104, +104, +104, +106, +102, +105, +106, +101, +107, +106, +103, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 15, + 12, + 30, + 19, + 18, + 29, +-102, +-101, +-97, + 13, + 8, + 19, + 43, + 38, + 46, + 97, + 94, + 96, +105, +103, +101, +105, +103, +101, +105, +102, +102, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +103, +101, +100, +103, +101, +100, +101, + 99, + 97, +100, + 98, + 96, + 92, + 90, + 89, + 63, + 58, + 57, +-56, +-60, +-53, +-29, +-29, + -8, +-47, +-47, +-16, +-50, +-51, +-19, +-38, +-40, +-10, +-40, +-43, + -9, +-42, +-45, +-11, +-49, +-51, +-19, +-53, +-55, +-25, +-57, +-58, +-30, +-62, +-62, +-37, +-65, +-64, +-42, +-66, +-65, +-43, +-66, +-64, +-43, +-64, +-62, +-41, +-67, +-66, +-45, +-102, +-101, +-81, +-81, +-80, +-61, +-76, +-74, +-56, +-84, +-81, +-65, +-90, +-87, +-72, +-91, +-88, +-74, +-16, + -7, + -6, +-14, + -8, +-15, + 6, + 3, +-15, + 11, + -5, +-34, + 13, +-21, +-59, + 25, +-22, +-63, + 25, +-22, +-58, + 21, +-26, +-60, + 25, +-25, +-57, + 32, +-21, +-50, + 28, +-26, +-53, + 24, +-32, +-56, + 21, +-37, +-56, + 20, +-40, +-65, + 18, +-39, +-68, + 15, +-30, +-57, + 10, +-22, +-41, + 42, + 30, + 16, + 76, + 73, + 66, + 77, + 74, + 78, + 66, + 64, + 78, +-42, +-44, +-27, +-64, +-64, +-45, +-61, +-59, +-36, +-53, +-51, +-25, +-51, +-50, +-24, +-46, +-47, +-20, +-37, +-41, +-13, +-29, +-33, + -5, +-13, +-17, + 7, + 17, + 15, + 33, + 73, + 73, + 84, +101, +102, +107, +103, +105, +105, +103, +105, +102, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 30, + 31, + 49, + 32, + 36, + 45, +-92, +-88, +-86, + -3, + -7, + 3, + 44, + 40, + 48, + 85, + 83, + 84, +104, +102, +101, +105, +103, +101, +105, +102, +102, +105, +103, +101, +105, +103, +101, +105, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +104, +102, + 99, +101, + 99, + 97, +100, + 98, + 96, + 92, + 90, + 88, + 65, + 60, + 59, +-42, +-47, +-38, +-42, +-45, +-23, +-60, +-60, +-31, +-56, +-56, +-29, +-54, +-56, +-32, +-52, +-56, +-27, +-57, +-60, +-33, +-60, +-63, +-37, +-63, +-65, +-41, +-67, +-68, +-48, +-72, +-72, +-53, +-74, +-72, +-52, +-70, +-68, +-49, +-67, +-66, +-46, +-66, +-64, +-45, +-73, +-72, +-52, +-85, +-83, +-65, +-86, +-84, +-68, +-88, +-85, +-69, +-90, +-87, +-73, +-94, +-90, +-78, +-96, +-92, +-80, +-12, + -2, + -7, + 5, + 14, + 3, + 4, + 8, + -9, + 23, + 13, +-11, + 11, +-22, +-56, + 30, +-18, +-59, + 26, +-19, +-59, + 25, +-21, +-58, + 21, +-28, +-62, + 19, +-32, +-63, + 19, +-34, +-62, + 22, +-31, +-59, + 20, +-35, +-63, + 17, +-38, +-67, + 11, +-37, +-62, + 21, + -9, +-23, + 55, + 40, + 35, + 30, + 28, + 31, + -2, + 1, + 8, + 65, + 67, + 72, + 47, + 48, + 54, +-77, +-76, +-65, +-68, +-69, +-49, +-66, +-64, +-42, +-64, +-60, +-38, +-59, +-58, +-34, +-51, +-52, +-26, +-49, +-52, +-24, +-44, +-48, +-18, +-32, +-38, + -6, +-16, +-22, + 7, + -3, + -6, + 14, + 33, + 32, + 45, + 82, + 83, + 90, +102, +103, +106, +105, +103, +103, +103, +101, +100, +103, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 54, + 55, + 70, + 41, + 44, + 53, +-53, +-50, +-47, +-31, +-33, +-21, + 44, + 43, + 54, + 69, + 68, + 74, +103, +101, +103, +105, +103, +101, +104, +103, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +101, + 99, + 98, + 99, + 97, + 96, + 92, + 90, + 89, + 66, + 66, + 68, +-32, +-34, +-22, +-62, +-66, +-43, +-65, +-70, +-42, +-67, +-70, +-48, +-66, +-68, +-52, +-69, +-70, +-50, +-69, +-70, +-50, +-69, +-70, +-50, +-72, +-73, +-53, +-77, +-78, +-58, +-77, +-77, +-58, +-77, +-76, +-59, +-75, +-75, +-58, +-68, +-68, +-50, +-70, +-70, +-53, +-83, +-83, +-65, +-90, +-89, +-74, +-86, +-85, +-71, +-88, +-86, +-74, +-91, +-88, +-79, +-91, +-88, +-80, +-93, +-90, +-83, + -3, + 2, + -4, + 12, + 16, + 3, + 1, + 7, + -4, + 5, + 7, + -4, + 6, +-14, +-34, + 25, +-25, +-63, + 29, +-18, +-59, + 31, +-24, +-55, + 23, +-42, +-62, + 18, +-49, +-67, + 19, +-42, +-68, + 22, +-34, +-68, + 20, +-32, +-72, + 12, +-33, +-55, + 41, + 11, + 7, + 59, + 45, + 49, + 42, + 45, + 49, + 11, + 21, + 20, + -8, + 0, + -3, + 43, + 51, + 50, + 2, + 7, + 10, +-103, +-98, +-88, +-81, +-78, +-63, +-69, +-68, +-47, +-66, +-65, +-41, +-64, +-63, +-38, +-50, +-50, +-23, +-51, +-53, +-24, +-57, +-59, +-29, +-49, +-50, +-23, +-39, +-40, +-13, +-25, +-26, + 2, +-14, +-15, + 14, + 0, + -2, + 27, + 35, + 33, + 56, + 82, + 79, + 89, +104, +102, +110, +102, +102, +105, +103, +105, +101, +105, +107, + 99, +105, +104, + 99, +107, +103, +103, +107, +103, +103, +106, +103, +102, +105, +103, +101, +103, +101, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, + 99, + 60, + 62, + 76, + 51, + 52, + 64, +-16, +-16, + -6, +-66, +-67, +-54, + 38, + 36, + 49, + 53, + 51, + 60, +102, +100, +103, +104, +102, +101, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +102, +104, +102, +100, +103, +101, +100, +102, +100, + 98, + 95, + 93, + 91, + 73, + 73, + 76, +-20, +-20, + -9, +-69, +-73, +-51, +-75, +-80, +-54, +-77, +-81, +-61, +-78, +-79, +-66, +-79, +-79, +-62, +-79, +-80, +-62, +-79, +-80, +-62, +-81, +-81, +-63, +-82, +-83, +-65, +-78, +-78, +-61, +-77, +-77, +-61, +-75, +-75, +-59, +-84, +-83, +-68, +-87, +-87, +-71, +-90, +-89, +-74, +-91, +-90, +-76, +-87, +-86, +-73, +-90, +-89, +-78, +-92, +-90, +-81, +-93, +-90, +-82, +-90, +-87, +-81, + 9, + 17, + 10, + 17, + 24, + 11, + 14, + 22, + 11, + 10, + 15, + 7, + 28, + 11, + -5, + 11, +-38, +-71, + 19, +-30, +-68, + 24, +-26, +-60, + 14, +-40, +-68, + 5, +-51, +-76, + 10, +-48, +-75, + 24, +-36, +-66, + 22, +-34, +-65, + 17, +-19, +-36, + 65, + 50, + 44, + 42, + 41, + 42, + 37, + 43, + 46, + 18, + 26, + 24, + 12, + 21, + 16, + 31, + 39, + 38, +-44, +-38, +-35, +-103, +-99, +-89, +-89, +-85, +-72, +-76, +-73, +-56, +-64, +-62, +-43, +-59, +-57, +-37, +-59, +-58, +-36, +-62, +-62, +-38, +-64, +-63, +-39, +-56, +-56, +-31, +-51, +-51, +-26, +-42, +-43, +-15, +-29, +-30, + -1, +-19, +-20, + 10, + -9, +-11, + 19, + 1, + -3, + 21, + 39, + 36, + 55, + 89, + 88, +101, + 99, +100, +106, +101, +104, +104, +106, +106, +104, +108, +105, +103, +108, +106, +103, +108, +106, +104, +106, +104, +103, +105, +103, +101, +105, +103, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +103, +102, + 98, + 50, + 53, + 66, +-11, +-12, + 2, + 18, + 16, + 31, +-64, +-66, +-50, + 26, + 25, + 38, + 43, + 41, + 51, + 95, + 93, + 98, +104, +101, +102, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +100, +102, +100, + 98, +103, +101, + 99, +102, +100, + 98, + 95, + 93, + 92, + 72, + 72, + 77, +-32, +-33, +-21, +-86, +-89, +-70, +-88, +-92, +-71, +-89, +-91, +-74, +-85, +-85, +-73, +-86, +-85, +-70, +-86, +-85, +-70, +-86, +-86, +-70, +-89, +-88, +-73, +-87, +-86, +-70, +-83, +-82, +-67, +-83, +-82, +-68, +-81, +-80, +-67, +-89, +-88, +-74, +-92, +-91, +-78, +-90, +-89, +-76, +-89, +-88, +-74, +-89, +-87, +-75, +-93, +-92, +-81, +-94, +-92, +-83, +-95, +-92, +-84, +-92, +-89, +-83, + 11, + 23, + 15, + 19, + 29, + 14, + 15, + 26, + 12, + 13, + 20, + 12, + 32, + 19, + 7, + 12, +-30, +-56, + 25, +-35, +-65, + 18, +-38, +-71, + 18, +-34, +-68, + 12, +-42, +-72, + 13, +-47, +-72, + 31, +-35, +-56, + 22, +-32, +-51, + 23, + 2, +-13, + 50, + 55, + 44, + 28, + 42, + 36, + 30, + 35, + 35, + 26, + 30, + 28, + 24, + 33, + 28, + 16, + 24, + 23, +-54, +-48, +-45, +-102, +-97, +-88, +-89, +-86, +-73, +-87, +-83, +-71, +-73, +-68, +-57, +-75, +-72, +-59, +-102, +-99, +-85, +-76, +-73, +-57, +-67, +-65, +-46, +-64, +-62, +-41, +-59, +-58, +-36, +-51, +-51, +-27, +-44, +-44, +-19, +-35, +-35, + -8, +-23, +-26, + 5, +-14, +-22, + 16, + -9, +-16, + 18, + 4, + -1, + 25, + 31, + 29, + 47, + 65, + 64, + 77, + 95, + 96, +100, +103, +104, +102, +103, +104, +102, +104, +104, +102, +104, +102, +101, +103, +101, +101, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, + 99, + 71, + 75, + 87, + 4, + 4, + 18, + 38, + 35, + 53, +-10, +-12, + 5, + 19, + 17, + 33, + 42, + 39, + 51, + 87, + 84, + 90, +103, +100, +103, +104, +101, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +104, +102, +100, +104, +102, +100, +103, +101, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +102, +100, + 98, + 97, + 95, + 93, + 29, + 28, + 35, +-73, +-75, +-61, +-91, +-93, +-77, +-94, +-96, +-81, +-91, +-92, +-79, +-87, +-87, +-77, +-92, +-90, +-79, +-92, +-91, +-79, +-92, +-90, +-78, +-90, +-88, +-76, +-88, +-87, +-74, +-87, +-86, +-73, +-86, +-84, +-72, +-87, +-86, +-74, +-100, +-98, +-87, +-93, +-92, +-80, +-90, +-89, +-77, +-88, +-86, +-74, +-89, +-88, +-75, +-94, +-92, +-81, +-97, +-94, +-85, +-96, +-93, +-86, +-92, +-89, +-83, + 18, + 29, + 23, + 24, + 34, + 19, + 18, + 28, + 14, + 14, + 26, + 18, + 28, + 24, + 14, + 25, + -1, +-19, + 25, +-36, +-55, + 29, +-35, +-61, + 31, +-33, +-65, + 15, +-47, +-77, + 21, +-40, +-59, + 27, +-30, +-40, + 45, + 12, + 4, + 40, + 32, + 20, + 29, + 43, + 30, + 23, + 41, + 31, + 33, + 40, + 35, + 29, + 34, + 28, + 27, + 36, + 31, + 28, + 36, + 35, +-81, +-76, +-73, +-98, +-94, +-84, +-92, +-89, +-75, +-91, +-86, +-76, +-93, +-88, +-80, +-103, +-98, +-89, +-106, +-102, +-90, +-84, +-81, +-68, +-71, +-68, +-52, +-66, +-64, +-45, +-65, +-63, +-44, +-63, +-62, +-41, +-58, +-56, +-34, +-49, +-48, +-24, +-41, +-42, +-14, +-29, +-35, + 4, +-24, +-28, + 7, +-18, +-21, + 10, +-14, +-16, + 12, + -8, + -9, + 15, + 7, + 9, + 24, + 57, + 61, + 67, + 98, +100, +105, +102, +102, +106, +103, +100, +102, +103, + 99, +100, +102, + 99, + 98, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 96, + 78, + 85, + 93, + 47, + 48, + 58, + 45, + 42, + 56, + 20, + 17, + 36, + 25, + 23, + 40, + 42, + 39, + 51, + 72, + 69, + 76, +104, +101, +105, +103, +100, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +101, + 99, + 97, +103, +101, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 98, +101, + 99, + 98, + 89, + 87, + 86, +-29, +-31, +-23, +-84, +-86, +-71, +-94, +-95, +-82, +-102, +-102, +-91, +-98, +-98, +-88, +-94, +-94, +-86, +-95, +-93, +-84, +-95, +-93, +-84, +-95, +-93, +-84, +-93, +-91, +-82, +-93, +-91, +-82, +-93, +-91, +-82, +-89, +-87, +-76, +-88, +-86, +-76, +-106, +-104, +-93, +-96, +-95, +-84, +-89, +-87, +-77, +-89, +-87, +-76, +-91, +-90, +-77, +-94, +-92, +-82, +-97, +-94, +-85, +-97, +-94, +-87, +-85, +-82, +-77, + 23, + 30, + 25, + 30, + 35, + 22, + 22, + 30, + 17, + 17, + 34, + 27, + 5, + 15, + 7, + 30, + 20, + 3, + 26, + -6, +-24, + 25, +-27, +-50, + 25, +-41, +-70, + 13, +-48, +-74, + 23, +-17, +-35, + 48, + 26, + 16, + 49, + 41, + 36, + 26, + 28, + 20, + 26, + 37, + 26, + 30, + 41, + 31, + 32, + 40, + 31, + 33, + 41, + 33, + 39, + 48, + 42, + 19, + 26, + 24, +-101, +-95, +-92, +-97, +-93, +-83, +-93, +-89, +-76, +-89, +-85, +-74, +-90, +-86, +-76, +-86, +-82, +-70, +-82, +-78, +-65, +-82, +-78, +-64, +-72, +-69, +-53, +-69, +-66, +-50, +-68, +-65, +-49, +-68, +-66, +-48, +-68, +-66, +-47, +-63, +-61, +-40, +-53, +-52, +-30, +-45, +-45, +-19, +-37, +-37, +-10, +-33, +-33, + -5, +-26, +-27, + 2, +-16, +-17, + 13, +-10, + -9, + 18, + -9, + -7, + 16, + 27, + 28, + 44, + 69, + 68, + 79, +101, + 98, +103, +103, + 98, + 99, +102, + 99, + 98, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 96, + 71, + 79, + 88, + 89, + 93, +101, + 81, + 81, + 92, + 51, + 49, + 66, + 34, + 32, + 49, + 43, + 41, + 56, + 57, + 54, + 64, +103, +100, +104, +103, +100, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +101, + 99, + 97, +100, + 98, + 96, +104, +101, + 99, +104, +102, + 99, +104, +102, + 99, +104, +102, +100, +103, +101, +101, + 62, + 60, + 61, +-61, +-63, +-51, +-91, +-92, +-78, +-101, +-101, +-90, +-105, +-105, +-96, +-101, +-101, +-93, +-98, +-97, +-90, +-98, +-96, +-90, +-98, +-96, +-89, +-98, +-96, +-89, +-99, +-96, +-89, +-96, +-94, +-86, +-94, +-91, +-83, +-91, +-89, +-79, +-93, +-91, +-81, +-107, +-104, +-94, +-96, +-94, +-84, +-90, +-88, +-78, +-92, +-90, +-79, +-93, +-92, +-80, +-95, +-93, +-82, +-97, +-95, +-85, +-99, +-96, +-89, +-85, +-82, +-78, + 26, + 29, + 26, + 30, + 33, + 21, + 26, + 33, + 21, + 21, + 38, + 30, + 22, + 36, + 29, + 17, + 20, + 7, + 28, + 22, + 6, + 19, + -9, +-28, + 13, +-35, +-58, + 21, +-19, +-39, + 55, + 39, + 22, + 43, + 48, + 36, + 38, + 49, + 43, + 30, + 38, + 31, + 34, + 39, + 31, + 35, + 41, + 32, + 32, + 40, + 30, + 37, + 46, + 38, + 47, + 55, + 51, + -8, + -2, + -3, +-104, +-99, +-94, +-98, +-94, +-84, +-90, +-87, +-74, +-91, +-88, +-76, +-89, +-85, +-74, +-89, +-86, +-73, +-92, +-89, +-75, +-73, +-70, +-55, +-59, +-56, +-41, +-67, +-65, +-50, +-70, +-68, +-52, +-72, +-70, +-54, +-72, +-71, +-53, +-70, +-68, +-49, +-61, +-60, +-41, +-58, +-56, +-39, +-49, +-47, +-28, +-44, +-44, +-21, +-36, +-37, +-10, +-34, +-35, + -5, +-32, +-32, + 1, +-32, +-33, + 0, +-25, +-27, + 0, + -9, +-11, + 6, + 83, + 78, + 84, +102, + 98, + 97, +100, + 98, + 95, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 97, +102, +100, + 97, +101, +100, + 96, + 72, + 78, + 89, + 92, + 95, +104, + 94, + 96, +104, + 61, + 63, + 73, + 35, + 36, + 52, + 43, + 40, + 60, + 46, + 43, + 57, + 95, + 94, + 96, +102, +101, + 97, +101, + 99, + 98, +101, + 99, + 98, +102, +100, + 99, +103, +101, +100, +103, +101, +100, +104, +101, + 98, +105, +101, + 97, +104, +101, + 97, +104, +102, +101, +101, + 99, +104, + 16, + 12, + 24, +-69, +-70, +-60, +-97, +-97, +-88, +-104, +-104, +-95, +-109, +-109, +-100, +-102, +-102, +-93, +-99, +-99, +-90, +-100, +-99, +-93, +-100, +-100, +-92, +-100, +-100, +-91, +-98, +-99, +-88, +-95, +-96, +-83, +-93, +-94, +-81, +-91, +-89, +-80, +-93, +-90, +-82, +-105, +-103, +-95, +-96, +-93, +-85, +-91, +-88, +-80, +-92, +-89, +-82, +-95, +-93, +-85, +-96, +-95, +-83, +-97, +-95, +-84, +-100, +-97, +-91, +-85, +-81, +-80, + 24, + 31, + 24, + 29, + 36, + 27, + 27, + 34, + 25, + 28, + 36, + 27, + 30, + 38, + 29, + 22, + 29, + 20, + 20, + 24, + 15, + 26, + 20, + 11, + 7, + -7, +-17, + 56, + 44, + 33, + 50, + 47, + 37, + 43, + 49, + 40, + 37, + 43, + 37, + 33, + 40, + 33, + 34, + 41, + 34, + 34, + 40, + 34, + 34, + 40, + 34, + 45, + 51, + 48, + 46, + 51, + 52, +-43, +-39, +-37, +-99, +-96, +-89, +-96, +-94, +-83, +-91, +-89, +-76, +-86, +-84, +-73, +-94, +-92, +-81, +-87, +-85, +-74, +-89, +-87, +-77, +-86, +-84, +-73, +-80, +-78, +-67, +-69, +-69, +-53, +-69, +-69, +-52, +-74, +-74, +-57, +-76, +-76, +-59, +-73, +-73, +-56, +-67, +-66, +-49, +-63, +-63, +-44, +-60, +-61, +-41, +-53, +-54, +-33, +-49, +-51, +-27, +-49, +-51, +-26, +-49, +-50, +-24, +-50, +-52, +-24, +-38, +-41, +-16, +-29, +-35, +-15, + 57, + 50, + 58, +102, + 96, + 94, +100, + 97, + 93, +100, + 98, + 94, +100, + 98, + 94, +101, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 93, + 92, + 96, + 98, + 95, + 97, + 98, + 94, + 95, + 74, + 76, + 83, + 36, + 37, + 51, + 43, + 41, + 59, + 43, + 41, + 55, + 84, + 83, + 86, +101, + 99, + 97, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, + 99, + 98, +103, + 99, + 97, +103, +100, + 96, +102, +100, + 99, + 85, + 82, + 89, +-39, +-43, +-30, +-83, +-84, +-73, +-103, +-103, +-94, +-109, +-109, +-100, +-111, +-111, +-102, +-104, +-104, +-95, +-100, +-100, +-92, +-101, +-100, +-93, +-101, +-101, +-93, +-100, +-100, +-91, +-98, +-99, +-88, +-95, +-96, +-83, +-93, +-93, +-81, +-91, +-89, +-80, +-92, +-89, +-81, +-101, +-99, +-91, +-100, +-97, +-89, +-92, +-89, +-81, +-92, +-89, +-82, +-95, +-93, +-85, +-96, +-95, +-83, +-97, +-96, +-84, +-101, +-98, +-92, +-81, +-77, +-77, + 26, + 32, + 25, + 29, + 37, + 28, + 27, + 34, + 25, + 29, + 36, + 27, + 32, + 39, + 30, + 28, + 36, + 27, + 22, + 30, + 21, + 30, + 32, + 21, + 50, + 46, + 34, + 51, + 47, + 36, + 44, + 47, + 37, + 41, + 49, + 41, + 34, + 41, + 34, + 35, + 42, + 35, + 34, + 41, + 34, + 34, + 41, + 34, + 40, + 47, + 40, + 46, + 52, + 49, + 36, + 40, + 42, +-80, +-77, +-74, +-98, +-95, +-88, +-96, +-94, +-83, +-90, +-89, +-76, +-87, +-85, +-74, +-90, +-88, +-78, +-95, +-93, +-82, +-88, +-86, +-76, +-85, +-83, +-72, +-84, +-82, +-72, +-73, +-72, +-57, +-71, +-71, +-56, +-78, +-77, +-62, +-80, +-80, +-65, +-82, +-81, +-66, +-78, +-77, +-62, +-73, +-72, +-56, +-69, +-69, +-52, +-63, +-64, +-45, +-61, +-62, +-41, +-61, +-62, +-40, +-61, +-62, +-38, +-63, +-65, +-39, +-42, +-44, +-20, +-38, +-43, +-24, + 35, + 28, + 36, +106, +100, + 99, +102, + 99, + 95, +101, +100, + 96, +101, +100, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 68, + 71, + 79, + 80, + 81, + 87, + 94, + 94, + 98, + 85, + 88, + 94, + 40, + 42, + 54, + 43, + 41, + 59, + 43, + 40, + 56, + 72, + 71, + 76, + 98, + 96, + 95, + 99, + 97, + 95, + 99, + 97, + 95, +100, + 98, + 96, +101, + 99, + 97, +101, + 99, + 97, +102, + 98, + 98, +102, + 98, + 97, +102, + 98, + 96, +100, + 97, + 98, + 49, + 47, + 54, +-69, +-74, +-58, +-90, +-92, +-80, +-105, +-105, +-96, +-109, +-109, +-100, +-111, +-111, +-102, +-105, +-105, +-96, +-102, +-102, +-93, +-100, +-99, +-92, +-99, +-99, +-91, +-98, +-98, +-88, +-97, +-98, +-87, +-95, +-96, +-82, +-93, +-93, +-80, +-92, +-89, +-81, +-92, +-89, +-81, +-97, +-94, +-86, +-103, +-101, +-93, +-94, +-91, +-83, +-93, +-90, +-83, +-95, +-93, +-85, +-97, +-95, +-84, +-98, +-96, +-85, +-103, +-100, +-94, +-84, +-79, +-79, + 25, + 32, + 25, + 28, + 35, + 26, + 27, + 34, + 25, + 29, + 36, + 27, + 32, + 40, + 30, + 33, + 41, + 32, + 28, + 40, + 31, + 39, + 47, + 36, + 46, + 51, + 37, + 42, + 48, + 34, + 40, + 50, + 39, + 31, + 42, + 34, + 31, + 38, + 31, + 33, + 39, + 33, + 35, + 42, + 35, + 38, + 45, + 39, + 44, + 51, + 44, + 45, + 51, + 48, + 16, + 20, + 21, +-102, +-99, +-95, +-98, +-95, +-88, +-97, +-95, +-84, +-91, +-90, +-77, +-87, +-86, +-74, +-88, +-86, +-75, +-88, +-86, +-75, +-83, +-81, +-70, +-90, +-88, +-78, +-93, +-91, +-80, +-74, +-73, +-60, +-75, +-74, +-61, +-80, +-78, +-65, +-84, +-83, +-70, +-87, +-86, +-73, +-87, +-85, +-73, +-83, +-81, +-69, +-79, +-78, +-64, +-74, +-73, +-57, +-71, +-71, +-53, +-71, +-72, +-53, +-72, +-72, +-52, +-74, +-74, +-53, +-55, +-57, +-35, +-47, +-52, +-35, + 28, + 21, + 29, +106, +100, +101, +101, + 98, + 95, +100, + 99, + 95, +100, + 99, + 95, +101, +100, + 95, +101, +100, + 96, +101, +100, + 96, + 99, + 97, + 93, + 53, + 65, + 78, + 62, + 69, + 81, + 88, + 94, +104, + 91, + 95, + 99, + 52, + 54, + 64, + 41, + 39, + 57, + 38, + 34, + 51, + 61, + 58, + 67, +103, +100, +102, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, + 99, +100, +105, + 99, +100, +104, +100, + 99, +100, + 97, +100, + 5, + 2, + 11, +-77, +-83, +-64, +-94, +-96, +-83, +-105, +-105, +-96, +-108, +-109, +-100, +-112, +-112, +-103, +-106, +-106, +-97, +-104, +-104, +-95, +-100, +-100, +-93, +-97, +-97, +-89, +-95, +-95, +-85, +-94, +-95, +-84, +-93, +-94, +-81, +-93, +-93, +-81, +-92, +-90, +-81, +-92, +-89, +-81, +-93, +-91, +-83, +-106, +-103, +-95, +-96, +-93, +-85, +-95, +-92, +-85, +-96, +-94, +-86, +-97, +-96, +-85, +-100, +-98, +-87, +-105, +-101, +-96, +-81, +-76, +-76, + 27, + 34, + 27, + 30, + 38, + 29, + 28, + 36, + 27, + 30, + 38, + 29, + 35, + 42, + 33, + 36, + 44, + 35, + 38, + 49, + 43, + 43, + 53, + 44, + 42, + 52, + 38, + 40, + 50, + 37, + 38, + 48, + 39, + 26, + 37, + 31, + 33, + 39, + 33, + 36, + 43, + 36, + 40, + 46, + 40, + 43, + 50, + 43, + 44, + 50, + 44, + 44, + 50, + 47, + -8, + -4, + -3, +-105, +-101, +-97, +-99, +-96, +-88, +-98, +-96, +-85, +-92, +-91, +-78, +-88, +-86, +-75, +-87, +-85, +-74, +-86, +-84, +-73, +-86, +-84, +-74, +-94, +-92, +-82, +-96, +-94, +-83, +-77, +-75, +-64, +-78, +-76, +-65, +-84, +-82, +-71, +-87, +-85, +-74, +-90, +-88, +-77, +-92, +-90, +-79, +-90, +-88, +-79, +-87, +-86, +-75, +-84, +-83, +-71, +-80, +-79, +-65, +-79, +-79, +-63, +-79, +-77, +-61, +-76, +-75, +-58, +-63, +-64, +-46, +-55, +-60, +-45, + 15, + 9, + 16, +103, + 97, + 98, +103, + 99, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 98, + 97, + 93, + 65, + 70, + 79, + 72, + 75, + 83, + 92, + 93, + 99, + 94, + 99, +100, + 63, + 65, + 73, + 47, + 45, + 63, + 38, + 35, + 52, + 50, + 47, + 57, + 98, + 95, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, +100, +101, +105, +100, +102, +104, +100, +101, + 91, + 87, + 91, +-39, +-43, +-32, +-83, +-88, +-68, +-96, +-98, +-85, +-107, +-107, +-98, +-110, +-110, +-101, +-112, +-112, +-103, +-106, +-106, +-97, +-104, +-104, +-95, +-100, +-100, +-93, +-97, +-97, +-89, +-94, +-95, +-85, +-94, +-95, +-83, +-95, +-96, +-83, +-96, +-96, +-84, +-95, +-92, +-84, +-95, +-92, +-84, +-94, +-92, +-84, +-107, +-104, +-96, +-99, +-97, +-88, +-97, +-94, +-87, +-98, +-95, +-87, +-99, +-97, +-86, +-101, +-99, +-88, +-104, +-101, +-95, +-76, +-72, +-72, + 30, + 37, + 29, + 32, + 40, + 30, + 30, + 37, + 28, + 34, + 41, + 32, + 38, + 45, + 36, + 37, + 44, + 36, + 46, + 52, + 48, + 51, + 59, + 51, + 44, + 54, + 42, + 40, + 50, + 39, + 38, + 46, + 39, + 32, + 39, + 34, + 41, + 48, + 41, + 44, + 50, + 44, + 43, + 50, + 44, + 42, + 49, + 42, + 42, + 49, + 43, + 43, + 49, + 46, +-43, +-39, +-38, +-103, +-99, +-95, +-98, +-95, +-88, +-98, +-96, +-85, +-92, +-91, +-78, +-87, +-85, +-74, +-87, +-85, +-74, +-87, +-85, +-75, +-90, +-88, +-78, +-101, +-99, +-88, +-91, +-89, +-79, +-81, +-79, +-69, +-86, +-84, +-73, +-89, +-87, +-77, +-92, +-90, +-79, +-94, +-93, +-82, +-97, +-95, +-85, +-96, +-93, +-85, +-92, +-90, +-82, +-90, +-88, +-78, +-89, +-88, +-77, +-86, +-84, +-71, +-89, +-86, +-73, +-85, +-83, +-70, +-79, +-79, +-63, +-67, +-71, +-58, +-20, +-26, +-19, + 98, + 92, + 93, +104, +101, + 98, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +102, + 98, + 93, + 93, + 98, +100, + 98, +103, +100, + 98, +101, + 95, + 98, + 99, + 79, + 80, + 88, + 54, + 52, + 69, + 45, + 42, + 60, + 44, + 42, + 56, + 88, + 86, + 92, +100, + 97, + 96, +101, + 99, + 98, +102, +100, + 99, +102, +100, + 98, +101, + 99, + 97, + 99, + 96, + 95, +103, + 99, + 99, +103, +100, +102, + 58, + 55, + 60, +-69, +-72, +-60, +-89, +-93, +-75, +-99, +-100, +-89, +-108, +-108, +-101, +-112, +-111, +-105, +-112, +-111, +-105, +-107, +-107, +-100, +-105, +-104, +-97, +-99, +-99, +-90, +-96, +-96, +-86, +-95, +-95, +-85, +-96, +-97, +-85, +-98, +-99, +-86, +-99, +-100, +-88, +-98, +-97, +-88, +-97, +-96, +-87, +-96, +-95, +-86, +-106, +-104, +-96, +-100, +-99, +-90, +-98, +-96, +-88, +-98, +-95, +-87, +-99, +-97, +-88, +-101, +-98, +-90, +-104, +-100, +-96, +-76, +-71, +-71, + 30, + 37, + 31, + 33, + 40, + 32, + 31, + 38, + 30, + 36, + 43, + 35, + 34, + 41, + 33, + 33, + 39, + 32, + 49, + 53, + 50, + 49, + 54, + 49, + 53, + 58, + 51, + 47, + 52, + 45, + 40, + 45, + 41, + 41, + 46, + 42, + 45, + 51, + 45, + 42, + 49, + 42, + 43, + 49, + 43, + 42, + 48, + 42, + 44, + 50, + 44, + 33, + 39, + 36, +-83, +-80, +-78, +-102, +-99, +-94, +-98, +-95, +-88, +-98, +-96, +-86, +-92, +-90, +-78, +-86, +-84, +-73, +-86, +-84, +-73, +-89, +-87, +-76, +-94, +-92, +-82, +-102, +-100, +-89, +-85, +-83, +-73, +-85, +-83, +-72, +-92, +-90, +-80, +-94, +-92, +-83, +-97, +-94, +-85, +-98, +-95, +-88, +-100, +-97, +-90, +-99, +-97, +-90, +-98, +-95, +-88, +-95, +-92, +-84, +-94, +-92, +-82, +-93, +-91, +-81, +-97, +-95, +-85, +-92, +-92, +-80, +-91, +-90, +-77, +-81, +-82, +-70, +-52, +-56, +-49, + 87, + 82, + 83, +105, +101, + 99, +105, +102, + 98, +104, +101, + 97, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 97, + 89, + 89, + 96, + 87, + 88, + 94, + 90, + 91, + 97, + 91, + 93, + 94, + 90, + 90, + 99, + 64, + 62, + 78, + 45, + 42, + 61, + 39, + 37, + 53, + 75, + 73, + 82, +100, + 98, + 97, +101, + 99, + 97, +100, + 97, + 96, +101, + 99, + 97, +102, +100, + 98, + 98, + 97, + 94, +101, + 99, + 97, +102, +100, +102, + 16, + 14, + 19, +-79, +-81, +-69, +-95, +-97, +-81, +-102, +-102, +-94, +-110, +-109, +-105, +-113, +-111, +-107, +-112, +-110, +-106, +-109, +-107, +-103, +-106, +-104, +-100, +-97, +-97, +-87, +-93, +-94, +-83, +-94, +-95, +-84, +-96, +-97, +-86, +-98, +-98, +-87, +-99, +-99, +-89, +-98, +-98, +-89, +-97, +-97, +-88, +-96, +-96, +-87, +-103, +-103, +-94, +-101, +-101, +-92, +-97, +-96, +-87, +-96, +-93, +-86, +-99, +-95, +-89, +-103, +-99, +-95, +-108, +-104, +-101, +-67, +-63, +-62, + 35, + 41, + 36, + 34, + 41, + 34, + 32, + 38, + 32, + 39, + 46, + 39, + 34, + 41, + 34, + 35, + 42, + 35, + 51, + 55, + 51, + 51, + 55, + 51, + 53, + 57, + 53, + 54, + 57, + 54, + 47, + 50, + 47, + 43, + 47, + 43, + 42, + 49, + 42, + 43, + 49, + 43, + 42, + 49, + 42, + 40, + 47, + 41, + 43, + 50, + 43, + 9, + 15, + 12, +-105, +-101, +-98, +-101, +-97, +-92, +-99, +-97, +-89, +-99, +-97, +-88, +-91, +-89, +-78, +-86, +-84, +-73, +-85, +-83, +-73, +-91, +-89, +-78, +-100, +-98, +-87, +-94, +-92, +-81, +-85, +-83, +-72, +-89, +-87, +-76, +-96, +-94, +-84, +-100, +-97, +-89, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-98, +-94, +-101, +-99, +-91, +-101, +-99, +-91, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-101, +-92, +-93, +-94, +-85, +-92, +-89, +-78, +-83, +-80, +-69, +-53, +-53, +-46, + 87, + 83, + 85, +100, + 96, + 94, +101, + 97, + 94, +105, +101, + 98, +105, +101, + 98, +104, +100, + 97, +104, +100, + 97, +102, + 99, + 93, +102, +103, +109, + 96, + 97, +103, + 99, + 99, +106, +101, +102, +106, +100, +100, +108, + 71, + 70, + 83, + 53, + 51, + 67, + 40, + 38, + 55, + 62, + 60, + 71, +101, + 99, + 97, +100, + 98, + 96, + 97, + 95, + 93, +101, + 99, + 97, +102, +100, + 98, +101, + 99, + 96, +101, + 99, + 97, + 91, + 88, + 92, +-41, +-43, +-36, +-83, +-84, +-72, +-95, +-97, +-83, +-105, +-105, +-98, +-112, +-111, +-107, +-113, +-111, +-107, +-112, +-110, +-106, +-109, +-107, +-103, +-106, +-104, +-100, +-98, +-98, +-89, +-95, +-95, +-86, +-96, +-96, +-87, +-98, +-98, +-89, +-100, +-100, +-91, +-100, +-100, +-91, +-98, +-98, +-89, +-97, +-97, +-88, +-95, +-95, +-86, +-101, +-101, +-92, +-104, +-104, +-95, +-97, +-96, +-87, +-96, +-93, +-86, +-99, +-95, +-89, +-103, +-99, +-95, +-107, +-103, +-100, +-65, +-60, +-60, + 39, + 46, + 41, + 38, + 44, + 38, + 33, + 40, + 33, + 39, + 46, + 39, + 34, + 41, + 34, + 35, + 41, + 35, + 54, + 58, + 54, + 54, + 57, + 54, + 53, + 56, + 53, + 57, + 60, + 57, + 52, + 56, + 52, + 49, + 52, + 49, + 44, + 50, + 44, + 42, + 49, + 42, + 40, + 47, + 40, + 38, + 45, + 38, + 39, + 46, + 39, +-26, +-21, +-25, +-106, +-101, +-98, +-99, +-96, +-90, +-100, +-97, +-90, +-99, +-97, +-88, +-91, +-89, +-78, +-86, +-84, +-74, +-89, +-87, +-77, +-94, +-93, +-82, +-102, +-100, +-90, +-88, +-86, +-75, +-85, +-83, +-73, +-90, +-88, +-78, +-98, +-96, +-86, +-101, +-98, +-91, +-103, +-100, +-94, +-103, +-99, +-95, +-103, +-100, +-95, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-97, +-89, +-102, +-99, +-91, +-105, +-105, +-97, +-97, +-97, +-89, +-93, +-90, +-80, +-82, +-79, +-68, +-59, +-59, +-51, + 64, + 59, + 63, +103, + 98, + 97, +102, + 98, + 95, +103, + 99, + 95, +101, + 97, + 94, +100, + 96, + 93, +100, + 96, + 93, +100, + 96, + 91, + 82, + 83, + 90, + 84, + 85, + 91, + 86, + 87, + 93, + 85, + 87, + 92, + 87, + 87, + 94, + 73, + 73, + 83, + 58, + 57, + 71, + 40, + 38, + 55, + 52, + 49, + 63, + 99, + 97, + 96, + 99, + 97, + 95, + 99, + 97, + 95, +102, +100, + 98, +101, + 99, + 97, +100, + 98, + 95, +101, + 98, + 98, + 54, + 50, + 55, +-74, +-76, +-65, +-87, +-88, +-76, +-100, +-100, +-91, +-110, +-109, +-104, +-114, +-112, +-108, +-115, +-113, +-109, +-112, +-111, +-107, +-111, +-110, +-106, +-108, +-107, +-102, +-102, +-102, +-95, +-98, +-98, +-91, +-98, +-98, +-90, +-99, +-99, +-92, +-101, +-101, +-93, +-102, +-102, +-94, +-101, +-101, +-92, +-98, +-98, +-89, +-96, +-96, +-87, +-98, +-98, +-89, +-106, +-106, +-97, +-98, +-97, +-88, +-97, +-94, +-86, +-99, +-96, +-90, +-102, +-98, +-94, +-106, +-101, +-99, +-66, +-63, +-62, + 41, + 47, + 42, + 40, + 47, + 40, + 34, + 41, + 34, + 44, + 51, + 44, + 38, + 44, + 38, + 37, + 44, + 37, + 55, + 58, + 55, + 54, + 57, + 54, + 53, + 57, + 53, + 56, + 60, + 56, + 49, + 52, + 49, + 54, + 59, + 54, + 51, + 57, + 51, + 43, + 50, + 43, + 37, + 44, + 38, + 38, + 45, + 38, + 36, + 43, + 36, +-55, +-50, +-54, +-104, +-100, +-96, +-100, +-97, +-91, +-100, +-97, +-89, +-99, +-97, +-88, +-93, +-91, +-80, +-90, +-88, +-78, +-94, +-92, +-82, +-99, +-98, +-87, +-97, +-95, +-85, +-86, +-84, +-73, +-83, +-81, +-71, +-90, +-88, +-77, +-97, +-94, +-85, +-101, +-98, +-91, +-102, +-99, +-93, +-102, +-98, +-95, +-102, +-99, +-94, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-99, +-97, +-89, +-102, +-100, +-92, +-107, +-106, +-100, +-101, +-100, +-95, +-95, +-92, +-83, +-83, +-80, +-70, +-63, +-64, +-54, + 39, + 34, + 40, +102, + 97, + 96, +101, + 97, + 93, +101, + 96, + 93, + 99, + 95, + 92, + 99, + 95, + 92, + 99, + 95, + 92, + 98, + 94, + 89, + 80, + 81, + 88, + 81, + 82, + 88, + 81, + 82, + 89, + 82, + 82, + 91, + 84, + 85, + 92, + 75, + 76, + 83, + 65, + 64, + 76, + 44, + 41, + 59, + 45, + 42, + 57, + 95, + 93, + 92, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +100, + 98, + 95, + 94, + 91, + 92, + -5, + -9, + -1, +-77, +-81, +-66, +-90, +-91, +-80, +-104, +-103, +-98, +-112, +-111, +-107, +-114, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-107, +-113, +-111, +-107, +-110, +-108, +-104, +-104, +-104, +-98, +-100, +-99, +-93, +-99, +-98, +-92, +-100, +-99, +-93, +-101, +-101, +-95, +-103, +-102, +-95, +-102, +-102, +-93, +-99, +-99, +-90, +-96, +-96, +-87, +-96, +-96, +-87, +-106, +-106, +-97, +-100, +-98, +-90, +-99, +-96, +-88, +-101, +-97, +-92, +-103, +-99, +-95, +-104, +-100, +-97, +-59, +-55, +-54, + 42, + 48, + 43, + 39, + 46, + 39, + 39, + 45, + 39, + 47, + 54, + 48, + 39, + 46, + 39, + 43, + 50, + 43, + 55, + 59, + 55, + 53, + 56, + 53, + 57, + 60, + 57, + 55, + 59, + 56, + 45, + 49, + 45, + 49, + 54, + 49, + 53, + 60, + 53, + 50, + 56, + 50, + 39, + 46, + 39, + 38, + 44, + 38, + 26, + 32, + 26, +-93, +-88, +-90, +-101, +-97, +-93, +-98, +-95, +-90, +-99, +-96, +-89, +-99, +-97, +-88, +-93, +-91, +-81, +-93, +-91, +-80, +-96, +-94, +-83, +-104, +-102, +-91, +-92, +-90, +-79, +-84, +-82, +-71, +-81, +-79, +-68, +-88, +-86, +-75, +-94, +-92, +-82, +-99, +-96, +-89, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-100, +-97, +-89, +-105, +-102, +-94, +-108, +-106, +-102, +-100, +-98, +-95, +-94, +-91, +-83, +-87, +-85, +-74, +-70, +-71, +-60, + 11, + 5, + 14, +104, +100, +100, +103, + 99, + 96, +104, +100, + 97, +104, +100, + 97, +104, +100, + 97, +104, +100, + 97, +103, + 99, + 94, + 79, + 79, + 86, + 81, + 81, + 88, + 84, + 85, + 92, + 88, + 87, + 98, + 86, + 86, + 94, + 81, + 81, + 87, + 74, + 73, + 83, + 46, + 44, + 62, + 41, + 38, + 54, + 83, + 81, + 80, +101, + 99, + 98, +101, + 99, + 97, +102, +100, + 98, +102, +100, + 98, +102, +101, + 98, + 92, + 89, + 90, +-36, +-41, +-30, +-80, +-85, +-68, +-95, +-96, +-85, +-107, +-105, +-104, +-113, +-111, +-108, +-114, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-107, +-113, +-111, +-107, +-110, +-108, +-104, +-106, +-105, +-101, +-101, +-100, +-96, +-101, +-100, +-96, +-102, +-100, +-96, +-103, +-102, +-98, +-104, +-103, +-98, +-102, +-102, +-93, +-99, +-99, +-90, +-97, +-97, +-88, +-96, +-96, +-87, +-105, +-105, +-96, +-100, +-99, +-90, +-98, +-95, +-88, +-100, +-97, +-91, +-102, +-98, +-94, +-102, +-98, +-95, +-55, +-51, +-50, + 45, + 52, + 47, + 43, + 50, + 44, + 45, + 52, + 45, + 47, + 53, + 47, + 38, + 45, + 38, + 48, + 54, + 48, + 51, + 55, + 51, + 54, + 58, + 54, + 57, + 61, + 57, + 57, + 60, + 57, + 46, + 49, + 46, + 45, + 49, + 45, + 53, + 60, + 53, + 55, + 61, + 55, + 43, + 50, + 43, + 38, + 45, + 38, + -2, + 4, + -2, +-106, +-101, +-102, +-100, +-96, +-92, +-99, +-96, +-90, +-99, +-96, +-89, +-99, +-97, +-88, +-93, +-91, +-81, +-94, +-92, +-81, +-101, +-99, +-88, +-103, +-101, +-90, +-89, +-87, +-77, +-86, +-84, +-73, +-83, +-81, +-70, +-87, +-85, +-75, +-93, +-91, +-81, +-99, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-108, +-106, +-98, +-108, +-106, +-102, +-99, +-97, +-96, +-94, +-90, +-83, +-90, +-87, +-75, +-74, +-75, +-63, +-25, +-32, +-21, + 94, + 89, + 90, +103, + 99, + 96, +105, +101, + 98, +106, +102, + 99, +106, +101, + 98, +105, +101, + 98, +104, +101, + 95, + 79, + 79, + 85, + 81, + 80, + 86, + 72, + 71, + 78, + 66, + 66, + 76, + 53, + 54, + 62, + 49, + 51, + 58, + 49, + 50, + 59, + 48, + 45, + 61, + 41, + 37, + 52, + 68, + 66, + 71, + 98, + 97, + 97, +100, + 99, + 95, +101, + 99, + 94, +102, + 99, + 96, +102, +101, + 98, + 69, + 70, + 71, +-58, +-60, +-48, +-89, +-92, +-74, +-98, +-99, +-87, +-109, +-107, +-105, +-113, +-110, +-110, +-114, +-112, +-111, +-116, +-114, +-112, +-113, +-112, +-109, +-114, +-112, +-108, +-111, +-109, +-105, +-106, +-105, +-99, +-104, +-103, +-97, +-103, +-102, +-96, +-102, +-102, +-96, +-103, +-103, +-97, +-104, +-103, +-96, +-104, +-102, +-94, +-101, +-99, +-91, +-96, +-94, +-86, +-96, +-94, +-86, +-105, +-103, +-95, +-100, +-98, +-90, +-94, +-91, +-84, +-98, +-94, +-88, +-101, +-98, +-94, +-100, +-96, +-93, +-54, +-50, +-49, + 50, + 56, + 51, + 49, + 56, + 49, + 46, + 52, + 46, + 45, + 52, + 45, + 36, + 43, + 36, + 52, + 59, + 52, + 53, + 60, + 52, + 51, + 57, + 49, + 53, + 58, + 53, + 53, + 59, + 55, + 45, + 51, + 47, + 40, + 45, + 41, + 52, + 59, + 52, + 54, + 61, + 54, + 45, + 51, + 48, + 37, + 42, + 41, +-44, +-40, +-40, +-103, +-99, +-95, +-99, +-96, +-89, +-99, +-96, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-94, +-91, +-83, +-95, +-92, +-85, +-105, +-102, +-94, +-99, +-96, +-87, +-91, +-89, +-78, +-86, +-85, +-73, +-84, +-83, +-70, +-87, +-85, +-74, +-93, +-91, +-81, +-98, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-111, +-109, +-101, +-107, +-105, +-98, +-100, +-98, +-91, +-95, +-92, +-84, +-89, +-88, +-76, +-77, +-77, +-64, +-53, +-54, +-41, + 69, + 67, + 67, +102, +100, + 96, +102, +100, + 96, +105, +102, + 98, +105, +102, + 98, +105, +102, + 98, +105, +103, + 98, + 65, + 74, + 87, + 66, + 75, + 88, + 66, + 74, + 87, + 76, + 79, + 92, + 77, + 79, + 89, + 78, + 81, + 88, + 79, + 80, + 89, + 75, + 74, + 87, + 45, + 41, + 56, + 57, + 55, + 64, + 95, + 94, + 96, + 97, + 96, + 92, +101, + 98, + 93, +103, + 98, + 96, +102, +101, + 99, + 42, + 44, + 45, +-71, +-72, +-60, +-91, +-94, +-76, +-99, +-100, +-88, +-111, +-109, +-107, +-113, +-111, +-112, +-114, +-112, +-112, +-116, +-113, +-113, +-115, +-113, +-111, +-114, +-113, +-109, +-110, +-109, +-104, +-107, +-106, +-100, +-105, +-105, +-98, +-104, +-103, +-97, +-104, +-103, +-97, +-103, +-103, +-96, +-102, +-101, +-94, +-101, +-99, +-91, +-102, +-99, +-91, +-97, +-94, +-86, +-95, +-93, +-84, +-103, +-100, +-92, +-100, +-97, +-89, +-92, +-90, +-82, +-98, +-94, +-88, +-101, +-97, +-93, +-101, +-97, +-94, +-46, +-42, +-42, + 52, + 58, + 53, + 48, + 55, + 48, + 46, + 53, + 46, + 44, + 51, + 44, + 38, + 45, + 39, + 50, + 57, + 50, + 49, + 56, + 47, + 52, + 59, + 50, + 51, + 58, + 51, + 52, + 58, + 53, + 44, + 50, + 47, + 40, + 46, + 42, + 49, + 56, + 48, + 54, + 60, + 54, + 44, + 50, + 47, + 28, + 33, + 35, +-80, +-77, +-74, +-101, +-97, +-91, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-97, +-89, +-101, +-98, +-90, +-95, +-92, +-84, +-99, +-96, +-90, +-106, +-103, +-96, +-97, +-95, +-87, +-93, +-91, +-81, +-87, +-85, +-74, +-84, +-83, +-70, +-88, +-86, +-75, +-93, +-91, +-82, +-99, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-99, +-91, +-111, +-109, +-100, +-106, +-103, +-95, +-100, +-97, +-89, +-96, +-94, +-85, +-90, +-89, +-76, +-79, +-78, +-65, +-60, +-59, +-45, + 48, + 47, + 47, +103, +102, + 98, +104, +103, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, + -5, + 17, + 41, + -1, + 22, + 46, + -4, + 17, + 40, + 54, + 62, + 79, + 77, + 82, + 94, + 80, + 82, + 89, + 77, + 76, + 84, + 73, + 71, + 84, + 48, + 46, + 61, + 53, + 50, + 60, + 93, + 92, + 95, +100, + 98, + 96, +100, + 97, + 94, + 99, + 94, + 94, + 93, + 92, + 93, + -5, + -4, + 1, +-84, +-85, +-73, +-99, +-100, +-85, +-104, +-104, +-95, +-112, +-110, +-108, +-113, +-111, +-112, +-114, +-112, +-112, +-116, +-113, +-113, +-116, +-114, +-112, +-115, +-113, +-109, +-108, +-107, +-103, +-108, +-107, +-101, +-107, +-106, +-99, +-105, +-105, +-98, +-105, +-105, +-98, +-102, +-102, +-95, +-101, +-100, +-93, +-101, +-98, +-90, +-100, +-97, +-89, +-94, +-92, +-84, +-95, +-92, +-84, +-99, +-97, +-89, +-105, +-102, +-94, +-99, +-96, +-88, +-101, +-97, +-92, +-101, +-97, +-93, +-100, +-96, +-94, +-45, +-41, +-40, + 51, + 58, + 53, + 50, + 57, + 51, + 50, + 57, + 50, + 45, + 51, + 45, + 41, + 48, + 41, + 56, + 63, + 56, + 52, + 59, + 51, + 49, + 57, + 48, + 52, + 59, + 52, + 50, + 56, + 52, + 44, + 50, + 46, + 41, + 48, + 44, + 45, + 52, + 45, + 54, + 61, + 54, + 46, + 51, + 49, + 12, + 16, + 18, +-103, +-99, +-96, +-100, +-97, +-90, +-99, +-96, +-88, +-99, +-96, +-88, +-98, +-96, +-88, +-100, +-97, +-89, +-96, +-94, +-85, +-104, +-101, +-95, +-102, +-99, +-92, +-95, +-92, +-84, +-91, +-89, +-79, +-88, +-86, +-75, +-89, +-87, +-74, +-90, +-88, +-77, +-95, +-93, +-84, +-100, +-98, +-90, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-103, +-100, +-93, +-110, +-107, +-99, +-104, +-101, +-93, +-99, +-96, +-88, +-97, +-94, +-85, +-92, +-91, +-79, +-82, +-80, +-67, +-62, +-61, +-47, + 44, + 42, + 42, +103, +101, + 97, +103, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +102, +101, + 97, +-23, + 9, + 41, +-19, + 14, + 46, +-19, + 12, + 42, + 22, + 36, + 57, + 81, + 89, +103, + 93, + 94, +101, + 73, + 71, + 78, + 45, + 43, + 57, + 43, + 41, + 59, + 48, + 44, + 56, + 82, + 81, + 86, + 96, + 94, + 94, + 97, + 94, + 92, + 99, + 94, + 96, + 66, + 63, + 69, +-54, +-54, +-46, +-97, +-98, +-87, +-105, +-106, +-96, +-110, +-109, +-103, +-114, +-112, +-111, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-114, +-112, +-108, +-107, +-106, +-102, +-108, +-108, +-101, +-107, +-107, +-100, +-105, +-105, +-98, +-104, +-104, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-99, +-90, +-98, +-96, +-87, +-96, +-93, +-85, +-95, +-92, +-84, +-96, +-94, +-86, +-106, +-104, +-96, +-99, +-96, +-89, +-100, +-96, +-91, +-102, +-99, +-95, +-101, +-97, +-94, +-47, +-43, +-42, + 51, + 57, + 52, + 52, + 59, + 52, + 51, + 58, + 51, + 42, + 49, + 42, + 41, + 47, + 41, + 52, + 59, + 52, + 61, + 68, + 59, + 52, + 60, + 51, + 48, + 54, + 48, + 49, + 55, + 51, + 43, + 49, + 45, + 42, + 48, + 44, + 42, + 49, + 41, + 52, + 58, + 52, + 44, + 49, + 47, +-24, +-20, +-18, +-105, +-102, +-98, +-100, +-97, +-91, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-97, +-89, +-106, +-103, +-97, +-98, +-95, +-89, +-94, +-91, +-83, +-93, +-91, +-80, +-91, +-89, +-78, +-93, +-92, +-79, +-96, +-94, +-84, +-101, +-99, +-90, +-102, +-99, +-92, +-104, +-101, +-95, +-104, +-100, +-96, +-104, +-101, +-96, +-104, +-102, +-94, +-103, +-100, +-92, +-101, +-98, +-90, +-105, +-102, +-94, +-108, +-106, +-97, +-103, +-100, +-92, +-99, +-97, +-89, +-96, +-94, +-85, +-93, +-91, +-79, +-85, +-83, +-70, +-71, +-70, +-56, + 39, + 38, + 38, +100, + 99, + 95, +100, + 99, + 95, +101, +100, + 96, +101, +100, + 96, +102, +101, + 97, +101, +100, + 96, +-25, + 10, + 43, +-26, + 10, + 43, +-22, + 12, + 45, + 0, + 20, + 45, + 74, + 84, + 99, + 92, + 93, + 99, + 84, + 81, + 87, + 49, + 47, + 61, + 41, + 41, + 60, + 43, + 40, + 54, + 71, + 68, + 76, +103, +100, +101, +103, + 99, + 99, +102, + 97, + 99, + 18, + 14, + 21, +-82, +-83, +-70, +-101, +-102, +-91, +-106, +-106, +-99, +-111, +-109, +-105, +-114, +-112, +-111, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-113, +-112, +-108, +-108, +-106, +-102, +-108, +-108, +-101, +-107, +-107, +-100, +-105, +-105, +-98, +-103, +-103, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-98, +-90, +-98, +-95, +-87, +-96, +-93, +-85, +-94, +-91, +-83, +-95, +-92, +-84, +-107, +-105, +-97, +-101, +-98, +-91, +-100, +-97, +-91, +-101, +-98, +-94, +-100, +-96, +-93, +-42, +-38, +-38, + 51, + 57, + 53, + 53, + 60, + 53, + 46, + 53, + 46, + 36, + 43, + 36, + 44, + 50, + 44, + 47, + 54, + 47, + 58, + 65, + 56, + 54, + 61, + 52, + 48, + 55, + 49, + 47, + 53, + 49, + 41, + 47, + 43, + 45, + 51, + 46, + 44, + 51, + 43, + 48, + 55, + 49, + 37, + 43, + 40, +-74, +-70, +-69, +-102, +-98, +-95, +-99, +-96, +-90, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-99, +-97, +-88, +-105, +-102, +-94, +-107, +-104, +-98, +-100, +-97, +-91, +-98, +-95, +-87, +-97, +-95, +-85, +-96, +-94, +-83, +-97, +-96, +-83, +-103, +-101, +-90, +-103, +-101, +-91, +-102, +-99, +-91, +-99, +-96, +-90, +-97, +-94, +-90, +-94, +-91, +-86, +-93, +-90, +-82, +-100, +-98, +-90, +-99, +-96, +-88, +-114, +-111, +-104, +-109, +-106, +-98, +-103, +-100, +-92, +-100, +-97, +-89, +-96, +-93, +-85, +-94, +-92, +-80, +-87, +-86, +-73, +-77, +-76, +-62, + 20, + 19, + 18, +103, +102, + 98, +105, +103, + 99, +105, +103, + 99, +104, +103, + 99, +100, + 98, + 94, +100, + 99, + 95, +-26, + 7, + 39, +-25, + 8, + 41, +-22, + 10, + 43, +-14, + 7, + 35, + 52, + 64, + 81, + 93, + 96, +101, + 92, + 89, + 95, + 67, + 65, + 79, + 44, + 42, + 62, + 46, + 42, + 57, + 61, + 59, + 67, +102, + 99, +101, +103, + 99, +100, + 90, + 84, + 88, +-31, +-35, +-26, +-92, +-94, +-79, +-104, +-104, +-94, +-107, +-107, +-100, +-111, +-109, +-106, +-114, +-112, +-110, +-115, +-112, +-112, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-113, +-112, +-108, +-108, +-106, +-102, +-108, +-108, +-102, +-107, +-107, +-100, +-106, +-105, +-99, +-103, +-103, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-98, +-90, +-98, +-95, +-87, +-96, +-93, +-85, +-92, +-89, +-81, +-93, +-91, +-83, +-108, +-105, +-97, +-103, +-100, +-93, +-100, +-97, +-91, +-101, +-98, +-93, +-101, +-97, +-94, +-39, +-35, +-35, + 51, + 57, + 52, + 46, + 53, + 46, + 38, + 45, + 38, + 32, + 39, + 32, + 50, + 57, + 50, + 55, + 62, + 55, + 53, + 60, + 52, + 55, + 62, + 53, + 54, + 61, + 54, + 47, + 54, + 49, + 47, + 53, + 48, + 48, + 54, + 50, + 48, + 55, + 47, + 45, + 52, + 45, + 22, + 27, + 25, +-103, +-99, +-97, +-102, +-98, +-94, +-99, +-96, +-89, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-102, +-99, +-91, +-105, +-103, +-95, +-103, +-100, +-93, +-98, +-95, +-88, +-97, +-94, +-86, +-96, +-94, +-84, +-93, +-92, +-81, +-95, +-94, +-81, +-96, +-94, +-84, +-97, +-94, +-85, +-102, +-99, +-91, +-105, +-102, +-96, +-104, +-100, +-96, +-103, +-99, +-94, +-99, +-96, +-88, +-97, +-95, +-86, +-99, +-97, +-89, +-117, +-115, +-107, +-109, +-106, +-99, +-103, +-101, +-93, +-100, +-97, +-89, +-96, +-93, +-85, +-93, +-91, +-79, +-87, +-86, +-73, +-80, +-79, +-65, +-24, +-25, +-25, + 99, + 96, + 93, +104, +102, + 99, +106, +104, +100, +105, +103, + 99, + 96, + 95, + 91, + 96, + 95, + 90, +-18, + 3, + 31, +-14, + 6, + 38, +-16, + 3, + 37, +-17, + 2, + 29, + 35, + 48, + 64, + 89, + 93, +100, + 94, + 93, + 99, + 73, + 69, + 82, + 51, + 47, + 65, + 46, + 44, + 60, + 51, + 51, + 59, + 93, + 95, + 96, + 99, +101, +101, + 58, + 59, + 62, +-73, +-73, +-66, +-103, +-104, +-95, +-106, +-106, +-99, +-110, +-109, +-105, +-113, +-111, +-108, +-114, +-112, +-110, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-119, +-117, +-116, +-114, +-113, +-109, +-109, +-108, +-104, +-109, +-108, +-103, +-108, +-106, +-102, +-106, +-105, +-100, +-103, +-102, +-98, +-102, +-100, +-96, +-101, +-99, +-94, +-101, +-98, +-90, +-99, +-96, +-88, +-95, +-92, +-84, +-91, +-88, +-80, +-91, +-89, +-80, +-105, +-101, +-96, +-102, +-98, +-94, +-100, +-97, +-90, +-101, +-98, +-91, +-102, +-98, +-95, +-41, +-36, +-38, + 49, + 55, + 50, + 43, + 50, + 43, + 40, + 47, + 40, + 35, + 41, + 35, + 54, + 61, + 54, + 54, + 61, + 54, + 54, + 61, + 56, + 51, + 58, + 53, + 51, + 57, + 52, + 45, + 51, + 47, + 48, + 54, + 50, + 50, + 56, + 52, + 48, + 54, + 48, + 42, + 48, + 44, + -9, + -5, + -6, +-106, +-102, +-100, +-102, +-98, +-93, +-101, +-98, +-91, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-97, +-91, +-107, +-103, +-98, +-99, +-96, +-90, +-101, +-98, +-91, +-103, +-101, +-93, +-104, +-101, +-93, +-102, +-100, +-91, +-100, +-98, +-89, +-99, +-97, +-88, +-100, +-97, +-89, +-100, +-98, +-89, +-102, +-99, +-91, +-105, +-102, +-94, +-106, +-103, +-95, +-103, +-100, +-92, +-100, +-98, +-88, +-94, +-92, +-83, +-108, +-106, +-98, +-116, +-113, +-107, +-108, +-105, +-101, +-103, +-99, +-94, +-100, +-97, +-89, +-97, +-94, +-85, +-93, +-92, +-80, +-88, +-87, +-74, +-80, +-80, +-65, +-60, +-68, +-58, + 81, + 72, + 77, +106, +100, + 99, +102, +100, + 95, +103, +103, + 97, + 95, + 96, + 92, + 92, + 92, + 85, + 83, + 88, +100, + 81, + 85, +101, + 75, + 78, + 96, + 57, + 67, + 86, + 56, + 63, + 77, + 79, + 81, + 88, + 95, + 95, +102, + 74, + 73, + 87, + 52, + 51, + 69, + 50, + 48, + 64, + 49, + 49, + 59, + 84, + 85, + 90, + 87, + 89, + 91, +-30, +-28, +-25, +-102, +-101, +-96, +-111, +-110, +-106, +-112, +-110, +-108, +-113, +-111, +-110, +-114, +-111, +-112, +-116, +-113, +-115, +-115, +-112, +-114, +-115, +-113, +-114, +-117, +-114, +-114, +-120, +-117, +-116, +-115, +-113, +-109, +-109, +-108, +-104, +-109, +-108, +-104, +-108, +-106, +-102, +-106, +-105, +-101, +-106, +-104, +-100, +-104, +-103, +-99, +-103, +-101, +-97, +-101, +-98, +-92, +-99, +-96, +-90, +-95, +-92, +-85, +-92, +-89, +-82, +-91, +-88, +-81, +-103, +-100, +-95, +-103, +-99, +-96, +-99, +-96, +-89, +-101, +-98, +-91, +-101, +-96, +-94, +-34, +-29, +-32, + 49, + 56, + 50, + 46, + 52, + 46, + 42, + 49, + 43, + 36, + 42, + 36, + 50, + 56, + 50, + 51, + 58, + 51, + 53, + 59, + 55, + 53, + 59, + 55, + 54, + 60, + 56, + 41, + 47, + 43, + 41, + 47, + 43, + 47, + 53, + 49, + 48, + 54, + 49, + 43, + 49, + 45, +-45, +-41, +-43, +-104, +-99, +-97, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-104, +-100, +-95, +-110, +-107, +-101, +-103, +-100, +-94, +-99, +-96, +-88, +-101, +-98, +-90, +-104, +-101, +-93, +-102, +-100, +-92, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-97, +-89, +-100, +-98, +-90, +-102, +-99, +-91, +-104, +-101, +-93, +-105, +-103, +-94, +-103, +-101, +-92, +-99, +-97, +-87, +-96, +-94, +-85, +-118, +-115, +-108, +-114, +-111, +-105, +-105, +-101, +-98, +-102, +-98, +-93, +-101, +-98, +-90, +-98, +-95, +-86, +-94, +-92, +-80, +-87, +-86, +-73, +-78, +-77, +-63, +-71, +-78, +-66, + 35, + 28, + 33, +106, +101, +100, +103, +101, + 96, +105, +105, + 99, +102, +101, + 97, + 98, + 97, + 93, +106, +102, +106, +108, +103, +109, +104, +100, +108, + 99, +103, +113, + 92, + 93, +101, + 72, + 69, + 76, + 97, + 96, +105, + 80, + 81, + 96, + 51, + 53, + 71, + 49, + 47, + 63, + 49, + 48, + 61, + 72, + 72, + 80, + 4, + 5, + 9, +-102, +-101, +-97, +-110, +-108, +-106, +-111, +-108, +-108, +-114, +-111, +-112, +-115, +-111, +-114, +-116, +-112, +-117, +-117, +-113, +-118, +-115, +-112, +-114, +-115, +-113, +-114, +-117, +-114, +-114, +-120, +-118, +-116, +-115, +-113, +-109, +-110, +-108, +-104, +-112, +-110, +-106, +-111, +-109, +-105, +-110, +-108, +-104, +-109, +-107, +-103, +-107, +-106, +-102, +-106, +-104, +-100, +-104, +-101, +-96, +-102, +-99, +-94, +-99, +-96, +-90, +-96, +-93, +-88, +-93, +-90, +-84, +-104, +-99, +-96, +-104, +-100, +-97, +-98, +-94, +-88, +-101, +-98, +-91, +-102, +-98, +-95, +-26, +-21, +-24, + 46, + 52, + 46, + 45, + 52, + 45, + 42, + 49, + 43, + 39, + 46, + 39, + 52, + 59, + 52, + 52, + 58, + 52, + 51, + 57, + 53, + 53, + 59, + 55, + 51, + 57, + 53, + 45, + 51, + 46, + 38, + 44, + 40, + 45, + 51, + 47, + 45, + 52, + 47, + 32, + 38, + 34, +-97, +-92, +-93, +-105, +-101, +-98, +-101, +-98, +-93, +-102, +-99, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-105, +-102, +-96, +-110, +-107, +-101, +-104, +-101, +-95, +-101, +-99, +-91, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-97, +-89, +-100, +-98, +-90, +-102, +-99, +-91, +-104, +-101, +-94, +-106, +-103, +-95, +-102, +-100, +-91, +-96, +-94, +-84, +-100, +-98, +-89, +-120, +-116, +-109, +-111, +-108, +-103, +-108, +-104, +-100, +-105, +-101, +-96, +-102, +-99, +-91, +-99, +-96, +-87, +-95, +-93, +-81, +-86, +-85, +-72, +-75, +-75, +-60, +-66, +-72, +-58, + -5, +-11, + -5, +104, +100, + 99, +103, +100, + 94, + 99, + 97, + 90, +105, +103, + 97, +111, +108, +108, +109, +109, +114, +105, +105, +111, +102, +102, +109, + 99, + 99, +103, +101, + 97, +102, + 81, + 75, + 81, + 93, + 88, + 98, + 90, + 89, +103, + 54, + 56, + 71, + 48, + 46, + 63, + 50, + 48, + 64, + 16, + 14, + 27, +-98, +-98, +-90, +-109, +-108, +-104, +-112, +-110, +-108, +-113, +-111, +-111, +-115, +-112, +-113, +-114, +-111, +-113, +-114, +-110, +-115, +-116, +-112, +-117, +-115, +-112, +-114, +-116, +-113, +-114, +-117, +-115, +-114, +-121, +-119, +-116, +-116, +-115, +-111, +-111, +-109, +-105, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-111, +-109, +-105, +-109, +-107, +-103, +-108, +-106, +-102, +-107, +-103, +-100, +-105, +-101, +-98, +-104, +-100, +-97, +-102, +-98, +-94, +-99, +-95, +-92, +-106, +-102, +-100, +-109, +-105, +-102, +-100, +-97, +-91, +-101, +-98, +-91, +-103, +-98, +-96, +-24, +-19, +-22, + 46, + 53, + 47, + 45, + 52, + 45, + 40, + 47, + 41, + 43, + 49, + 43, + 48, + 54, + 48, + 46, + 53, + 46, + 51, + 57, + 53, + 51, + 57, + 53, + 45, + 51, + 47, + 43, + 49, + 45, + 39, + 45, + 40, + 43, + 49, + 45, + 43, + 50, + 45, + -4, + 1, + -2, +-109, +-104, +-104, +-103, +-99, +-96, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-97, +-92, +-105, +-102, +-96, +-106, +-102, +-97, +-101, +-97, +-92, +-99, +-96, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-102, +-99, +-91, +-98, +-96, +-87, +-96, +-94, +-83, +-110, +-107, +-99, +-117, +-115, +-107, +-117, +-113, +-108, +-110, +-106, +-103, +-105, +-102, +-96, +-102, +-99, +-91, +-99, +-96, +-88, +-94, +-93, +-81, +-88, +-87, +-74, +-75, +-74, +-60, +-59, +-63, +-48, +-16, +-21, +-14, +102, + 98, + 98, +102, + 99, + 92, + 89, + 87, + 78, + 84, + 80, + 72, + 89, + 86, + 85, +114, +116, +120, +106, +108, +111, + 97, + 99, +102, + 92, + 92, + 94, + 91, + 86, + 91, + 82, + 73, + 80, + 82, + 74, + 82, + 97, + 92, +101, + 65, + 64, + 74, + 48, + 46, + 61, + 45, + 43, + 60, +-63, +-65, +-51, +-103, +-104, +-92, +-106, +-105, +-101, +-109, +-108, +-104, +-111, +-110, +-105, +-113, +-111, +-108, +-112, +-110, +-108, +-112, +-110, +-110, +-114, +-111, +-113, +-116, +-113, +-114, +-117, +-114, +-116, +-119, +-116, +-116, +-122, +-120, +-118, +-117, +-116, +-112, +-112, +-111, +-107, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-111, +-109, +-105, +-110, +-107, +-104, +-110, +-106, +-104, +-109, +-104, +-103, +-107, +-103, +-101, +-103, +-99, +-97, +-100, +-96, +-94, +-107, +-102, +-101, +-111, +-107, +-104, +-102, +-99, +-93, +-101, +-97, +-91, +-103, +-99, +-96, +-27, +-21, +-25, + 44, + 51, + 45, + 43, + 50, + 43, + 33, + 39, + 33, + 42, + 49, + 42, + 51, + 58, + 51, + 47, + 53, + 47, + 43, + 49, + 45, + 48, + 54, + 50, + 46, + 52, + 48, + 38, + 44, + 40, + 39, + 45, + 41, + 42, + 48, + 44, + 41, + 47, + 42, +-39, +-34, +-37, +-106, +-101, +-102, +-103, +-99, +-96, +-101, +-98, +-92, +-100, +-97, +-91, +-100, +-97, +-91, +-104, +-100, +-95, +-103, +-100, +-94, +-103, +-100, +-94, +-102, +-98, +-93, +-101, +-98, +-91, +-103, +-100, +-92, +-104, +-101, +-93, +-102, +-100, +-92, +-100, +-98, +-90, +-99, +-97, +-89, +-100, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-100, +-98, +-89, +-102, +-99, +-91, +-99, +-97, +-88, +-95, +-93, +-83, +-119, +-116, +-107, +-120, +-117, +-110, +-115, +-112, +-106, +-109, +-105, +-102, +-104, +-100, +-95, +-101, +-98, +-90, +-100, +-97, +-89, +-98, +-97, +-84, +-93, +-92, +-79, +-79, +-79, +-64, +-57, +-60, +-44, + -8, +-11, + -3, +102, + 99, + 99, +102, + 99, + 91, + 94, + 90, + 80, + 85, + 79, + 71, + 81, + 80, + 74, +119, +117, +118, +111, +110, +109, +102, +101, +100, + 94, + 94, + 96, + 79, + 70, + 74, + 86, + 68, + 74, + 89, + 71, + 77, + 99, + 88, + 94, + 76, + 71, + 78, + 51, + 48, + 62, + 8, + 7, + 25, +-75, +-76, +-57, +-90, +-92, +-79, +-100, +-98, +-93, +-104, +-102, +-96, +-106, +-106, +-98, +-108, +-107, +-101, +-109, +-108, +-104, +-111, +-109, +-106, +-113, +-111, +-108, +-116, +-114, +-114, +-119, +-116, +-117, +-120, +-118, +-117, +-123, +-121, +-119, +-119, +-117, +-113, +-113, +-112, +-108, +-112, +-111, +-107, +-112, +-111, +-106, +-112, +-111, +-107, +-113, +-111, +-107, +-111, +-110, +-106, +-110, +-108, +-104, +-110, +-105, +-104, +-108, +-104, +-102, +-107, +-103, +-101, +-105, +-100, +-99, +-102, +-98, +-96, +-108, +-103, +-102, +-114, +-109, +-107, +-105, +-101, +-95, +-100, +-97, +-91, +-104, +-99, +-96, +-21, +-16, +-18, + 43, + 50, + 44, + 40, + 46, + 40, + 33, + 39, + 33, + 42, + 49, + 43, + 45, + 53, + 46, + 47, + 54, + 49, + 48, + 53, + 49, + 47, + 53, + 48, + 42, + 49, + 43, + 38, + 49, + 39, + 29, + 45, + 32, + 35, + 49, + 37, + 36, + 40, + 35, +-79, +-75, +-78, +-107, +-101, +-100, +-104, +-99, +-96, +-102, +-98, +-93, +-101, +-98, +-92, +-101, +-97, +-92, +-103, +-100, +-94, +-101, +-98, +-92, +-101, +-97, +-92, +-101, +-98, +-92, +-100, +-97, +-90, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-100, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-102, +-99, +-91, +-99, +-97, +-88, +-98, +-96, +-87, +-121, +-118, +-110, +-118, +-115, +-109, +-114, +-111, +-105, +-107, +-103, +-100, +-102, +-99, +-93, +-100, +-98, +-89, +-101, +-98, +-89, +-99, +-98, +-86, +-97, +-96, +-83, +-89, +-88, +-74, +-63, +-66, +-50, + -7, +-10, + 0, + 99, + 97, + 98, + 98, + 95, + 88, + 93, + 88, + 77, + 90, + 83, + 73, + 83, + 81, + 72, +118, +118, +120, +114, +113, +116, +108, +108, +110, + 95, + 90, + 93, + 67, + 43, + 43, + 85, + 44, + 41, + 98, + 58, + 55, + 90, + 66, + 67, + 80, + 69, + 73, + 53, + 46, + 55, +-51, +-48, +-29, +-71, +-68, +-49, +-78, +-81, +-69, +-95, +-91, +-84, +-102, +-97, +-90, +-103, +-102, +-97, +-106, +-105, +-100, +-109, +-107, +-104, +-111, +-109, +-106, +-114, +-112, +-110, +-118, +-115, +-116, +-120, +-117, +-118, +-121, +-119, +-119, +-124, +-122, +-120, +-118, +-117, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-113, +-111, +-107, +-112, +-110, +-106, +-111, +-108, +-104, +-111, +-106, +-103, +-109, +-105, +-102, +-108, +-104, +-101, +-106, +-102, +-99, +-106, +-102, +-99, +-110, +-105, +-104, +-116, +-111, +-110, +-109, +-105, +-99, +-102, +-100, +-92, +-103, +-100, +-95, + -9, + -5, + -5, + 52, + 57, + 52, + 44, + 48, + 42, + 31, + 37, + 31, + 46, + 52, + 48, + 43, + 50, + 46, + 44, + 50, + 47, + 52, + 52, + 49, + 15, + 20, + 12, + -8, + 13, + -6, + -3, + 36, + 4, +-45, + 21, +-24, + -9, + 47, + 7, + 11, + 19, + 11, +-111, +-105, +-106, +-104, +-99, +-94, +-104, +-99, +-93, +-103, +-97, +-94, +-101, +-96, +-92, +-101, +-97, +-92, +-102, +-99, +-93, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-103, +-100, +-92, +-101, +-98, +-90, +-96, +-93, +-86, +-101, +-98, +-92, +-123, +-120, +-114, +-120, +-117, +-111, +-112, +-109, +-103, +-104, +-101, +-95, +-102, +-99, +-92, +-101, +-99, +-90, +-100, +-97, +-88, +-99, +-97, +-85, +-98, +-96, +-83, +-93, +-92, +-78, +-76, +-78, +-61, +-15, +-16, + -6, + 95, + 93, + 95, + 99, + 96, + 89, + 96, + 90, + 79, + 93, + 84, + 73, + 85, + 78, + 70, +118, +117, +120, +117, +117, +119, +116, +116, +119, +112, +115, +117, + 83, + 69, + 69, + 49, + 13, + 7, + 69, + 24, + 17, + 80, + 41, + 33, + 81, + 51, + 46, + 46, + 33, + 38, +-97, +-97, +-77, +-99, +-99, +-77, +-99, +-102, +-87, +-110, +-108, +-97, +-113, +-108, +-100, +-111, +-110, +-106, +-112, +-110, +-108, +-113, +-110, +-110, +-113, +-110, +-113, +-114, +-111, +-114, +-118, +-115, +-116, +-120, +-117, +-118, +-121, +-119, +-119, +-124, +-122, +-120, +-118, +-117, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-113, +-111, +-107, +-112, +-110, +-106, +-112, +-108, +-104, +-111, +-106, +-103, +-110, +-106, +-102, +-108, +-104, +-101, +-108, +-104, +-100, +-111, +-107, +-106, +-117, +-112, +-112, +-110, +-107, +-101, +-103, +-100, +-92, +-104, +-101, +-96, + -2, + 2, + 2, + 60, + 65, + 60, + 43, + 49, + 43, + 32, + 37, + 31, + 44, + 49, + 43, + 45, + 49, + 44, + 44, + 49, + 43, + 43, + 49, + 44, + 26, + 42, + 30, +-39, + -4, +-28, +-115, +-30, +-77, +-121, + 12, +-52, +-81, + 20, +-39, +-49, +-10, +-33, +-116, +-96, +-105, +-102, +-103, +-97, +-98, +-103, +-92, +-102, +-98, +-91, +-104, +-97, +-92, +-103, +-100, +-94, +-101, +-98, +-92, +-102, +-99, +-93, +-101, +-98, +-92, +-101, +-98, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-99, +-97, +-89, +-95, +-92, +-85, +-105, +-102, +-97, +-123, +-120, +-114, +-121, +-118, +-112, +-112, +-109, +-103, +-104, +-100, +-95, +-103, +-100, +-93, +-102, +-99, +-91, +-101, +-98, +-89, +-99, +-97, +-85, +-96, +-95, +-82, +-94, +-93, +-79, +-87, +-89, +-72, +-45, +-46, +-36, + 81, + 79, + 80, + 97, + 95, + 87, + 92, + 87, + 75, + 91, + 83, + 72, + 85, + 78, + 69, +118, +117, +119, +117, +117, +119, +116, +117, +120, +109, +118, +120, +117, +111, +111, + 86, + 61, + 55, + 44, + 0, +-12, + 63, + 10, + -8, + 74, + 26, + 9, + 32, + 10, + 9, +-51, +-56, +-37, +-52, +-52, +-27, +-54, +-57, +-37, +-75, +-75, +-58, +-103, +-100, +-88, +-115, +-115, +-110, +-119, +-117, +-116, +-118, +-115, +-117, +-117, +-113, +-118, +-116, +-111, +-118, +-118, +-115, +-118, +-120, +-118, +-119, +-122, +-119, +-119, +-124, +-122, +-120, +-117, +-116, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-113, +-109, +-106, +-111, +-107, +-104, +-110, +-106, +-103, +-109, +-105, +-102, +-109, +-105, +-102, +-113, +-108, +-107, +-118, +-113, +-112, +-111, +-108, +-102, +-103, +-101, +-93, +-104, +-100, +-95, +-19, +-15, +-16, + 38, + 43, + 39, + 37, + 44, + 38, + 35, + 42, + 35, + 43, + 52, + 43, + 51, + 59, + 49, + 37, + 47, + 36, + -2, + 21, + 8, +-57, +-25, +-43, +-105, +-46, +-79, +-125, +-37, +-85, +-104, + 12, +-49, +-107, + 9, +-53, +-88, +-11, +-48, +-123, +-90, +-107, +-100, +-101, +-97, +-94, +-104, +-92, +-100, +-99, +-88, +-107, +-100, +-93, +-104, +-101, +-95, +-104, +-100, +-95, +-102, +-99, +-93, +-102, +-98, +-93, +-102, +-98, +-93, +-101, +-98, +-90, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-99, +-96, +-88, +-95, +-92, +-85, +-112, +-108, +-103, +-123, +-120, +-114, +-121, +-118, +-112, +-116, +-113, +-108, +-108, +-105, +-99, +-103, +-100, +-93, +-100, +-97, +-89, +-99, +-97, +-88, +-97, +-96, +-84, +-94, +-92, +-79, +-94, +-93, +-79, +-93, +-95, +-77, +-78, +-79, +-68, + 53, + 51, + 51, + 97, + 93, + 86, + 87, + 82, + 70, + 90, + 82, + 71, + 86, + 79, + 70, +116, +116, +118, +117, +117, +119, +112, +113, +115, +104, +112, +114, +107, +108, +110, +105, + 90, + 87, + 55, + 21, + 9, + 60, + 6, +-18, + 71, + 15, +-10, + 45, + 14, + 8, +-28, +-37, +-20, +-40, +-42, +-13, +-46, +-51, +-25, +-54, +-55, +-32, +-78, +-77, +-59, +-97, +-97, +-87, +-112, +-111, +-104, +-119, +-117, +-115, +-121, +-117, +-120, +-120, +-115, +-121, +-120, +-117, +-119, +-121, +-118, +-120, +-122, +-120, +-120, +-124, +-122, +-120, +-115, +-114, +-110, +-114, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-113, +-110, +-106, +-112, +-108, +-104, +-111, +-107, +-103, +-109, +-105, +-102, +-111, +-107, +-103, +-114, +-110, +-109, +-116, +-111, +-111, +-113, +-110, +-103, +-102, +-99, +-91, +-104, +-101, +-96, +-18, +-13, +-14, + 35, + 40, + 37, + 32, + 39, + 34, + 31, + 44, + 34, + 31, + 49, + 35, + 32, + 53, + 35, + -9, + 17, + -3, +-51, + -7, +-30, +-85, +-40, +-64, +-94, +-48, +-76, +-93, +-43, +-76, +-85, +-25, +-65, +-81, + -9, +-52, +-113, +-36, +-73, +-105, +-63, +-83, +-105, +-98, +-98, +-96, +-100, +-92, +-101, +-100, +-92, +-108, +-102, +-97, +-105, +-102, +-96, +-105, +-102, +-96, +-104, +-101, +-95, +-104, +-101, +-95, +-104, +-101, +-95, +-103, +-100, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-99, +-96, +-88, +-99, +-97, +-89, +-120, +-117, +-111, +-124, +-121, +-115, +-121, +-118, +-112, +-119, +-116, +-110, +-111, +-108, +-103, +-104, +-101, +-94, +-99, +-96, +-88, +-98, +-95, +-86, +-96, +-95, +-83, +-93, +-92, +-79, +-94, +-93, +-79, +-93, +-95, +-77, +-90, +-92, +-80, + -9, +-11, +-11, + 94, + 91, + 83, + 90, + 85, + 73, + 93, + 84, + 74, + 88, + 81, + 72, +116, +115, +118, +118, +117, +119, +112, +111, +114, +105, +107, +112, +104, +107, +112, +105, +100, +101, + 56, + 34, + 25, + 54, + 10, +-15, + 67, + 12, +-18, + 48, + 10, + -1, +-19, +-32, +-16, +-30, +-33, + -3, +-35, +-40, +-10, +-44, +-48, +-19, +-68, +-70, +-46, +-84, +-87, +-69, +-100, +-101, +-87, +-111, +-111, +-103, +-119, +-117, +-115, +-121, +-118, +-120, +-120, +-117, +-118, +-121, +-118, +-120, +-122, +-120, +-120, +-121, +-119, +-117, +-114, +-113, +-109, +-114, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-115, +-111, +-108, +-114, +-110, +-106, +-112, +-107, +-104, +-109, +-105, +-102, +-111, +-107, +-103, +-113, +-108, +-107, +-116, +-111, +-110, +-114, +-111, +-105, +-103, +-101, +-93, +-104, +-100, +-95, + 2, + 6, + 5, + 48, + 53, + 50, + 26, + 34, + 29, + 30, + 47, + 36, + 1, + 29, + 11, +-50, +-10, +-36, +-64, +-16, +-46, +-54, +-10, +-36, +-79, +-41, +-64, +-91, +-55, +-77, +-78, +-41, +-63, +-88, +-44, +-68, +-96, +-44, +-70, +-83, +-34, +-61, +-68, +-33, +-49, +-109, +-88, +-94, +-102, +-94, +-94, +-105, +-102, +-101, +-107, +-104, +-101, +-105, +-102, +-96, +-105, +-102, +-96, +-106, +-102, +-96, +-106, +-102, +-97, +-106, +-102, +-97, +-104, +-101, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-97, +-89, +-97, +-94, +-86, +-105, +-102, +-94, +-123, +-120, +-114, +-122, +-119, +-113, +-121, +-118, +-112, +-120, +-117, +-111, +-116, +-112, +-107, +-107, +-104, +-97, +-100, +-97, +-89, +-96, +-94, +-85, +-95, +-94, +-81, +-91, +-90, +-77, +-89, +-88, +-74, +-88, +-89, +-72, +-85, +-86, +-74, +-67, +-69, +-68, + 75, + 72, + 64, + 95, + 90, + 78, + 93, + 84, + 73, + 88, + 81, + 72, +117, +116, +118, +117, +116, +119, +117, +116, +119, +114, +114, +117, +111, +115, +120, +106, +108, +109, + 49, + 36, + 26, + 45, + 7, +-21, + 67, + 17, +-18, + 55, + 17, + 2, +-13, +-31, +-21, +-31, +-35, + -7, +-36, +-38, + -7, +-45, +-50, +-22, +-65, +-70, +-45, +-84, +-86, +-68, +-96, +-93, +-81, +-110, +-105, +-101, +-115, +-113, +-112, +-116, +-119, +-118, +-118, +-118, +-121, +-122, +-118, +-122, +-125, +-119, +-122, +-122, +-114, +-114, +-116, +-112, +-108, +-114, +-112, +-107, +-114, +-114, +-107, +-114, +-114, +-108, +-115, +-113, +-109, +-116, +-114, +-111, +-115, +-113, +-111, +-115, +-113, +-110, +-114, +-111, +-108, +-113, +-110, +-107, +-110, +-108, +-104, +-109, +-106, +-102, +-110, +-107, +-103, +-112, +-108, +-107, +-115, +-112, +-111, +-115, +-113, +-108, +-105, +-103, +-98, +-103, +-100, +-97, + 10, + 14, + 14, + 45, + 50, + 47, + 22, + 35, + 26, +-24, + 1, +-13, +-84, +-41, +-65, +-102, +-46, +-74, +-85, +-32, +-62, +-84, +-51, +-73, +-80, +-54, +-75, +-56, +-30, +-51, +-25, + 6, +-15, +-86, +-41, +-62, +-83, +-33, +-55, +-85, +-43, +-68, +-83, +-45, +-65, +-55, +-27, +-45, +-13, + 5, +-12, +-84, +-77, +-85, +-106, +-104, +-102, +-106, +-103, +-98, +-108, +-101, +-97, +-109, +-101, +-97, +-108, +-102, +-97, +-105, +-104, +-98, +-104, +-102, +-94, +-103, +-101, +-92, +-103, +-100, +-92, +-101, +-99, +-91, +-100, +-98, +-90, +-100, +-97, +-89, +-100, +-98, +-89, +-101, +-98, +-89, +-100, +-98, +-89, +-100, +-97, +-88, +-97, +-95, +-86, +-110, +-107, +-100, +-124, +-121, +-118, +-121, +-118, +-115, +-120, +-118, +-114, +-119, +-117, +-112, +-116, +-114, +-109, +-112, +-109, +-103, +-104, +-101, +-94, +-98, +-95, +-87, +-94, +-92, +-81, +-89, +-87, +-75, +-87, +-86, +-72, +-86, +-87, +-70, +-79, +-81, +-65, +-72, +-74, +-67, + 52, + 50, + 42, + 90, + 86, + 74, + 94, + 85, + 80, + 91, + 84, + 82, +117, +116, +119, +117, +116, +119, +117, +116, +119, +115, +116, +117, +113, +119, +121, +111, +113, +113, + 44, + 31, + 21, + 35, + -2, +-33, + 58, + 9, +-29, + 69, + 31, + 12, + 21, + -3, + 0, +-38, +-45, +-20, +-47, +-48, +-16, +-48, +-52, +-25, +-53, +-56, +-31, +-81, +-79, +-57, +-95, +-89, +-77, +-108, +-102, +-97, +-115, +-111, +-108, +-119, +-118, +-115, +-118, +-121, +-121, +-123, +-122, +-124, +-122, +-117, +-119, +-118, +-112, +-111, +-113, +-113, +-108, +-109, +-113, +-106, +-114, +-114, +-106, +-114, +-114, +-107, +-115, +-113, +-109, +-116, +-114, +-112, +-115, +-113, +-112, +-114, +-112, +-111, +-111, +-110, +-106, +-111, +-110, +-106, +-109, +-108, +-103, +-109, +-107, +-103, +-110, +-109, +-105, +-112, +-110, +-108, +-116, +-114, +-112, +-116, +-114, +-112, +-64, +-63, +-61, +-39, +-37, +-36, + 16, + 18, + 19, + 32, + 41, + 32, +-38, +-17, +-32, +-99, +-55, +-79, +-95, +-41, +-69, +-104, +-49, +-78, +-103, +-56, +-84, +-70, +-42, +-61, +-48, +-23, +-45, +-21, + 2, +-22, +-60, +-30, +-56, +-89, +-49, +-74, +-99, +-51, +-77, +-101, +-50, +-82, +-75, +-31, +-58, +-85, +-49, +-78, +-54, +-29, +-59, +-75, +-55, +-76, +-107, +-101, +-103, +-105, +-104, +-100, +-109, +-101, +-99, +-112, +-100, +-97, +-109, +-101, +-97, +-105, +-103, +-97, +-105, +-103, +-95, +-104, +-102, +-93, +-103, +-101, +-92, +-101, +-99, +-91, +-101, +-99, +-91, +-101, +-99, +-91, +-101, +-99, +-89, +-101, +-99, +-89, +-101, +-99, +-89, +-100, +-98, +-88, +-101, +-99, +-89, +-118, +-115, +-107, +-123, +-121, +-121, +-122, +-119, +-119, +-120, +-118, +-116, +-116, +-115, +-112, +-114, +-112, +-108, +-114, +-112, +-107, +-109, +-106, +-100, +-100, +-97, +-89, +-96, +-94, +-84, +-88, +-86, +-75, +-82, +-81, +-68, +-82, +-82, +-66, +-77, +-81, +-60, +-62, +-64, +-52, + 46, + 46, + 37, + 91, + 88, + 76, + 98, + 89, + 89, +101, + 95, + 97, +117, +116, +119, +117, +116, +119, +117, +116, +119, +116, +116, +118, +115, +118, +121, +112, +110, +111, + 39, + 24, + 15, + 31, + -4, +-32, + 47, + -2, +-36, + 80, + 34, + 14, + 82, + 51, + 52, + 2, +-12, + 9, +-38, +-43, +-12, +-48, +-53, +-25, +-57, +-57, +-32, +-70, +-70, +-47, +-82, +-92, +-74, +-96, +-108, +-95, +-111, +-113, +-105, +-126, +-116, +-111, +-121, +-121, +-117, +-120, +-124, +-120, +-106, +-107, +-104, +-106, +-107, +-103, +-107, +-113, +-107, +-107, +-115, +-108, +-113, +-114, +-108, +-114, +-113, +-108, +-115, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-109, +-111, +-109, +-106, +-108, +-107, +-103, +-110, +-109, +-105, +-110, +-108, +-104, +-110, +-109, +-105, +-112, +-110, +-106, +-113, +-112, +-109, +-115, +-113, +-111, +-118, +-116, +-114, +-76, +-75, +-73, +-38, +-36, +-34, + -3, + -1, + 0, + 0, + 16, + 2, +-63, +-36, +-58, +-88, +-44, +-72, +-90, +-40, +-71, +-101, +-53, +-85, +-60, +-23, +-52, +-44, +-11, +-37, +-36, + -6, +-31, +-73, +-41, +-70, +-101, +-63, +-93, +-111, +-65, +-94, +-84, +-37, +-68, +-78, +-31, +-63, +-88, +-43, +-71, +-84, +-42, +-77, +-105, +-63, +-107, +-52, +-17, +-51, +-84, +-68, +-82, +-99, +-102, +-100, +-105, +-104, +-103, +-106, +-102, +-100, +-108, +-102, +-98, +-108, +-102, +-95, +-107, +-104, +-96, +-106, +-103, +-95, +-104, +-102, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-101, +-99, +-90, +-107, +-104, +-96, +-125, +-123, +-116, +-125, +-122, +-123, +-123, +-121, +-121, +-122, +-120, +-118, +-118, +-116, +-113, +-113, +-112, +-108, +-113, +-110, +-105, +-110, +-107, +-101, +-105, +-103, +-94, +-102, +-100, +-90, +-93, +-92, +-80, +-84, +-82, +-69, +-78, +-77, +-63, +-76, +-79, +-58, +-56, +-59, +-45, + 54, + 52, + 47, + 95, + 91, + 80, + 95, + 87, + 84, + 93, + 89, + 81, +117, +116, +119, +117, +116, +119, +115, +114, +117, +112, +113, +116, +113, +113, +117, +107, +102, +102, + 29, + 13, + 3, + 24, + -9, +-34, + 45, + -1, +-30, + 92, + 44, + 26, + 90, + 55, + 53, + 49, + 28, + 40, +-27, +-40, +-21, +-37, +-49, +-32, +-14, +-29, +-22, + 29, + 4, + 6, + 56, + 19, + 22, + 31, + -6, + -4, +-66, +-87, +-87, +-117, +-115, +-118, +-120, +-119, +-119, +-114, +-115, +-114, +-27, +-27, +-27, +-85, +-85, +-83, +-111, +-111, +-109, +-112, +-111, +-109, +-115, +-113, +-111, +-115, +-114, +-110, +-116, +-114, +-110, +-115, +-114, +-110, +-112, +-110, +-107, +-109, +-108, +-104, +-109, +-107, +-103, +-110, +-109, +-105, +-110, +-109, +-105, +-112, +-110, +-106, +-113, +-111, +-107, +-114, +-112, +-109, +-114, +-112, +-111, +-118, +-116, +-114, +-115, +-113, +-112, +-95, +-93, +-92, + 15, + 17, + 18, +-53, +-36, +-50, +-81, +-50, +-74, +-55, +-17, +-45, +-89, +-46, +-76, +-73, +-32, +-64, +-71, +-35, +-65, +-43, + -9, +-39, +-88, +-50, +-81, +-98, +-56, +-88, +-103, +-59, +-91, +-81, +-38, +-70, +-55, +-11, +-46, +-56, +-13, +-49, +-97, +-55, +-83, +-59, +-17, +-54, +-70, +-26, +-71, +-104, +-58, +-101, +-43, +-30, +-45, + -5, + -5, +-12, +-80, +-83, +-91, +-100, +-104, +-109, +-105, +-104, +-105, +-110, +-103, +-99, +-108, +-104, +-97, +-107, +-104, +-96, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-95, +-105, +-102, +-95, +-105, +-102, +-96, +-104, +-101, +-94, +-112, +-109, +-103, +-126, +-124, +-119, +-125, +-123, +-123, +-124, +-121, +-122, +-123, +-121, +-119, +-119, +-117, +-114, +-113, +-112, +-108, +-111, +-108, +-103, +-109, +-106, +-100, +-109, +-106, +-98, +-104, +-102, +-92, +-101, +-99, +-88, +-91, +-90, +-77, +-80, +-79, +-66, +-73, +-76, +-56, +-58, +-61, +-44, + 50, + 48, + 46, + 95, + 93, + 81, + 96, + 88, + 82, + 88, + 85, + 70, +116, +116, +118, +117, +116, +119, +113, +113, +116, +110, +110, +115, +112, +110, +114, +103, + 95, + 95, + 25, + 7, + -3, + 29, + -2, +-23, + 56, + 17, + -6, + 94, + 57, + 42, + 93, + 62, + 56, + 75, + 48, + 50, + 16, + -9, + -9, + 36, + 9, + 2, + 65, + 29, + 17, + 62, + 16, + 0, + 67, + 19, + 3, + 69, + 26, + 14, +-15, +-44, +-52, +-108, +-123, +-127, +-87, +-100, +-107, + -5, +-21, +-25, + 61, + 47, + 46, +-76, +-86, +-86, +-110, +-112, +-110, +-113, +-109, +-108, +-115, +-113, +-112, +-115, +-113, +-111, +-115, +-113, +-110, +-112, +-111, +-107, +-107, +-107, +-101, +-110, +-109, +-103, +-111, +-110, +-106, +-111, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-114, +-112, +-108, +-114, +-112, +-109, +-114, +-112, +-110, +-118, +-116, +-114, +-119, +-117, +-115, +-93, +-91, +-89, + 15, + 17, + 19, +-67, +-54, +-63, +-88, +-61, +-82, +-48, +-17, +-41, +-48, +-11, +-38, +-44, + -3, +-33, +-80, +-38, +-68, +-84, +-47, +-83, +-89, +-51, +-84, +-62, +-23, +-54, +-62, +-22, +-54, +-62, +-27, +-60, + 1, + 38, + -2, +-15, + 28, +-13, +-17, + 21, + -6, +-20, + 18, +-14, +-20, + 21, +-22, +-31, + 9, +-31, +-29, + -4, +-30, + 38, + 46, + 25, + 49, + 45, + 25, + 23, + 13, + -3, +-58, +-65, +-74, +-107, +-103, +-105, +-108, +-104, +-98, +-107, +-105, +-97, +-106, +-103, +-95, +-106, +-103, +-95, +-106, +-103, +-95, +-106, +-103, +-95, +-108, +-104, +-99, +-108, +-104, +-99, +-108, +-104, +-99, +-108, +-105, +-99, +-120, +-116, +-110, +-127, +-124, +-120, +-126, +-123, +-123, +-124, +-121, +-122, +-123, +-121, +-120, +-122, +-120, +-117, +-117, +-116, +-112, +-113, +-111, +-107, +-108, +-105, +-99, +-107, +-104, +-96, +-105, +-103, +-93, +-104, +-103, +-92, +-98, +-97, +-84, +-88, +-86, +-76, +-69, +-72, +-52, +-54, +-58, +-38, + 22, + 20, + 19, + 94, + 91, + 81, + 96, + 89, + 82, + 91, + 86, + 71, +116, +116, +118, +117, +116, +119, +114, +113, +116, +112, +112, +118, +114, +112, +115, + 69, + 60, + 59, + 27, + 7, + -2, + 31, + 0, +-18, + 57, + 25, + 5, + 79, + 55, + 45, + 97, + 72, + 65, + 95, + 65, + 57, + 73, + 37, + 20, + 59, + 17, + -9, + 51, + -2, +-32, + 54, + -2, +-30, + 54, + 11, +-16, + 18, +-12, +-31, +-67, +-89, +-97, +-30, +-48, +-41, + 54, + 17, + 10, + 85, + 42, + 34, + 92, + 51, + 49, + 16, +-18, +-16, +-92, +-113, +-107, +-106, +-115, +-108, +-113, +-112, +-112, +-113, +-111, +-110, +-113, +-111, +-109, +-109, +-108, +-103, +-107, +-107, +-100, +-110, +-110, +-102, +-113, +-111, +-107, +-113, +-111, +-107, +-112, +-111, +-107, +-112, +-110, +-106, +-114, +-112, +-108, +-114, +-112, +-109, +-114, +-112, +-110, +-118, +-116, +-114, +-117, +-115, +-113, +-80, +-78, +-77, + 30, + 32, + 34, + -5, + 5, + -2, +-75, +-58, +-71, +-69, +-44, +-62, +-52, +-18, +-41, +-90, +-47, +-73, +-91, +-42, +-72, +-69, +-37, +-74, +-41, + -7, +-42, +-27, + 10, +-21, +-58, +-22, +-54, +-81, +-52, +-86, +-30, + 0, +-40, +-49, + -7, +-49, +-23, + 13, +-14, + -6, + 27, + 1, +-22, + 9, +-22, +-68, +-38, +-69, +-44, +-17, +-45, +-24, + -8, +-39, + 28, + 25, + -6, + 66, + 51, + 25, + 41, + 28, + 12, +-93, +-96, +-102, +-109, +-106, +-101, +-109, +-106, +-98, +-107, +-105, +-97, +-107, +-104, +-96, +-107, +-104, +-96, +-107, +-104, +-97, +-111, +-107, +-103, +-112, +-107, +-104, +-112, +-108, +-105, +-113, +-109, +-106, +-122, +-118, +-114, +-126, +-122, +-120, +-125, +-122, +-123, +-124, +-121, +-122, +-123, +-121, +-120, +-123, +-121, +-118, +-121, +-120, +-116, +-119, +-117, +-112, +-110, +-107, +-101, +-107, +-104, +-97, +-105, +-103, +-93, +-102, +-100, +-89, +-99, +-97, +-85, +-96, +-94, +-84, +-80, +-82, +-63, +-51, +-56, +-36, + -8, +-10, + -9, + 92, + 89, + 78, + 98, + 91, + 82, + 94, + 87, + 74, +114, +113, +115, +112, +111, +114, +109, +108, +111, +107, +108, +115, + 97, + 92, + 97, + 19, + 2, + 3, + 32, + 6, + -1, + 24, + -6, +-22, + 41, + 11, + -7, + 68, + 38, + 28, + 81, + 49, + 37, + 68, + 34, + 16, + 43, + 3, +-23, + 45, + 2, +-32, + 51, + 5, +-33, + 53, + 8, +-23, + 23, +-13, +-31, +-30, +-59, +-66, + 35, + 6, + -6, + 59, + 28, + 11, + 51, + -2, +-25, + 55, + 0, +-20, + 69, + 20, + 9, + 40, + -3, + -6, + 34, + -4, + -5, + 53, + 16, + 16, +-12, +-34, +-38, +-82, +-97, +-98, +-91, +-101, +-99, +-107, +-107, +-105, +-116, +-106, +-107, +-118, +-107, +-108, +-113, +-111, +-108, +-113, +-112, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-112, +-108, +-116, +-112, +-110, +-118, +-114, +-112, +-120, +-116, +-115, +-72, +-68, +-69, + 34, + 39, + 38, + 22, + 30, + 25, +-41, +-27, +-38, +-76, +-48, +-71, +-56, +-18, +-48, +-94, +-52, +-82, +-75, +-38, +-67, +-47, +-18, +-52, +-40, +-11, +-43, +-35, + -6, +-37, +-49, +-22, +-52, +-97, +-73, +-102, +-28, + -5, +-36, +-47, +-15, +-49, +-42, + -5, +-35, +-41, + 0, +-29, +-47, + -8, +-38, +-60, +-30, +-56, +-53, +-23, +-51, +-27, +-18, +-47, + 43, + 28, + -5, + 59, + 34, + 3, + 62, + 46, + 21, +-15, +-24, +-38, +-107, +-107, +-103, +-110, +-107, +-101, +-108, +-106, +-100, +-108, +-106, +-101, +-110, +-106, +-101, +-111, +-108, +-101, +-111, +-109, +-102, +-112, +-110, +-104, +-113, +-111, +-107, +-118, +-114, +-114, +-21, +-18, +-21, +-107, +-103, +-107, +-126, +-123, +-124, +-125, +-122, +-123, +-124, +-122, +-122, +-124, +-122, +-122, +-122, +-120, +-119, +-121, +-118, +-114, +-116, +-112, +-107, +-111, +-108, +-101, +-107, +-104, +-98, +-102, +-99, +-92, +-100, +-97, +-89, +-97, +-96, +-85, +-88, +-89, +-73, +-59, +-60, +-43, +-18, +-20, +-12, + 84, + 81, + 76, + 95, + 88, + 77, + 94, + 86, + 76, +103, +102, +104, + 99, + 98, +101, + 96, + 96, + 98, + 96, + 97, +105, + 50, + 44, + 50, + 13, + -6, + -6, + 30, + 4, + -4, + 25, + -4, +-20, + 31, + 1, +-16, + 43, + 9, + -1, + 42, + 6, + -7, + 31, + -6, +-26, + 35, + -4, +-31, + 47, + 6, +-26, + 49, + 12, +-14, + 44, + 13, + -5, + 25, + -3, +-19, + 65, + 31, + 14, + 67, + 29, + 3, + 50, + 5, +-31, + 49, + -4, +-36, + 54, + 2, +-22, + 60, + 12, + -5, + 68, + 21, + 10, + 58, + 10, + 0, + 72, + 21, + 11, + 77, + 29, + 19, + 75, + 33, + 28, + 56, + 26, + 26, +-59, +-73, +-71, +-108, +-108, +-108, +-113, +-109, +-109, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-115, +-111, +-108, +-117, +-113, +-109, +-118, +-114, +-111, +-120, +-115, +-114, +-58, +-54, +-55, + 35, + 41, + 39, + 30, + 28, + 26, + -6, + -5, +-13, +-42, +-29, +-48, +-52, +-32, +-57, +-23, + -7, +-30, + -2, + 15, + -9, + -4, + 15, +-12, + 20, + 39, + 13, +-60, +-39, +-65, +-58, +-36, +-63, +-85, +-64, +-88, +-17, + 6, +-23, +-47, +-21, +-54, +-67, +-29, +-62, +-54, +-11, +-41, +-63, +-25, +-50, +-61, +-33, +-54, +-66, +-44, +-64, +-41, +-46, +-66, + 35, + 0, +-24, + 61, + 18, +-11, + 67, + 37, + 10, + 54, + 30, + 12, +-86, +-95, +-99, +-109, +-109, +-105, +-111, +-110, +-106, +-110, +-108, +-104, +-112, +-109, +-103, +-114, +-111, +-105, +-113, +-113, +-104, +-114, +-114, +-107, +-116, +-114, +-111, +-122, +-119, +-120, + 27, + 30, + 26, +-82, +-79, +-83, +-125, +-122, +-123, +-123, +-121, +-121, +-123, +-120, +-121, +-122, +-120, +-120, +-120, +-117, +-117, +-120, +-117, +-114, +-119, +-116, +-110, +-117, +-113, +-107, +-112, +-109, +-103, +-106, +-103, +-96, +-102, +-99, +-92, +-98, +-97, +-89, +-94, +-93, +-81, +-83, +-83, +-67, +-48, +-49, +-38, + 48, + 44, + 44, + 97, + 89, + 81, + 97, + 89, + 80, +109, +109, +111, +106, +106, +108, +103, +103, +106, + 99, +100, +108, + 54, + 48, + 52, + 21, + 3, + 0, + 26, + 0, + -9, + 30, + 0, +-13, + 30, + -1, +-14, + 33, + -1, + -9, + 37, + 2, +-11, + 33, + -4, +-22, + 40, + 0, +-22, + 53, + 12, +-15, + 71, + 33, + 19, + 86, + 53, + 43, + 83, + 51, + 28, + 56, + 23, +-13, + 45, + 5, +-33, + 50, + 3, +-32, + 48, + 3, +-24, + 66, + 21, + -2, + 73, + 24, + 5, + 53, + 1, +-18, + 54, + -4, +-25, + 65, + 2, +-19, + 62, + -3, +-22, + 60, + 4, + -7, + 45, + 6, + 4, +-54, +-74, +-72, +-104, +-112, +-107, +-109, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-115, +-111, +-108, +-117, +-113, +-109, +-118, +-114, +-111, +-119, +-114, +-113, +-44, +-40, +-41, + 44, + 49, + 47, + 47, + 43, + 39, + 25, + 21, + 15, + -8, + -8, +-19, +-18, +-14, +-30, +-15, +-11, +-27, + 25, + 29, + 13, + 39, + 45, + 27, + 43, + 52, + 33, + -7, + 6, +-14, +-71, +-53, +-77, +-62, +-40, +-64, +-41, +-17, +-46, +-57, +-31, +-67, +-61, +-27, +-63, +-42, + -6, +-36, +-57, +-27, +-47, +-52, +-33, +-42, +-102, +-92, +-98, +-66, +-85, +-93, + 23, +-26, +-41, + 60, + 7, +-19, + 76, + 36, + 7, + 76, + 42, + 20, + -6, +-23, +-33, +-107, +-112, +-114, +-112, +-113, +-110, +-113, +-111, +-106, +-115, +-112, +-106, +-117, +-113, +-108, +-117, +-117, +-110, +-119, +-118, +-113, +-120, +-119, +-116, +-118, +-115, +-115, + 49, + 52, + 49, +-84, +-81, +-84, +-122, +-120, +-117, +-120, +-119, +-115, +-120, +-118, +-115, +-115, +-114, +-111, +-110, +-109, +-105, +-112, +-110, +-105, +-114, +-112, +-104, +-116, +-113, +-105, +-114, +-112, +-104, +-112, +-110, +-101, +-115, +-112, +-104, +-114, +-112, +-107, +-113, +-110, +-102, +-112, +-111, +-97, +-99, +-101, +-88, +-69, +-74, +-71, + 67, + 57, + 54, + 98, + 90, + 81, +113, +112, +115, +111, +110, +113, +109, +109, +112, +107, +108, +115, + 41, + 36, + 38, + 22, + 4, + -1, + 25, + -1, +-11, + 35, + 4, + -7, + 27, + -5, +-14, + 31, + -1, +-10, + 47, + 14, + 3, + 52, + 16, + 2, + 43, + 5, +-13, + 37, + -3, +-24, + 66, + 20, + 5, + 69, + 22, + 3, + 52, + 11, +-23, + 41, + 5, +-36, + 44, + 11, +-21, + 47, + 16, + -4, + 63, + 26, + 5, + 72, + 30, + 6, + 54, + 6, +-19, + 52, + -1, +-26, + 58, + -1, +-25, + 45, +-15, +-39, + 43, + -9, +-29, + 26, +-14, +-28, +-56, +-79, +-85, +-105, +-112, +-112, +-112, +-111, +-108, +-114, +-110, +-106, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-111, +-107, +-114, +-110, +-107, +-115, +-111, +-108, +-116, +-111, +-111, +-33, +-29, +-30, + 46, + 51, + 49, + 48, + 55, + 48, + 47, + 54, + 45, + 23, + 28, + 20, + 13, + 17, + 7, + 36, + 40, + 29, + 41, + 47, + 34, + 48, + 53, + 40, + 52, + 57, + 44, + 32, + 44, + 27, +-60, +-44, +-63, +-49, +-27, +-50, +-47, +-22, +-50, +-53, +-26, +-63, +-51, +-22, +-58, +-34, + -7, +-37, +-87, +-66, +-83, +-102, +-91, +-93, +-123, +-115, +-113, +-105, +-119, +-122, +-15, +-58, +-72, + 35, +-11, +-40, + 71, + 38, + 4, + 66, + 40, + 9, + 66, + 47, + 30, +-49, +-60, +-67, +-112, +-115, +-114, +-115, +-112, +-107, +-116, +-113, +-107, +-119, +-117, +-112, +-121, +-120, +-116, +-122, +-120, +-118, +-123, +-121, +-119, +-98, +-97, +-96, + 17, + 19, + 18, +-105, +-103, +-102, +-109, +-108, +-102, +-110, +-109, +-103, +-110, +-109, +-103, +-109, +-109, +-102, +-103, +-102, +-95, +-100, +-99, +-91, +-100, +-98, +-88, +-97, +-95, +-85, +-95, +-93, +-83, +-97, +-95, +-85, +-97, +-94, +-84, +-98, +-96, +-92, +-111, +-109, +-102, +-107, +-107, +-93, +-98, +-99, +-86, +-87, +-92, +-86, + 45, + 36, + 33, + 97, + 89, + 81, +117, +116, +118, +116, +115, +117, +114, +113, +117, +108, +109, +117, + 9, + 3, + 4, + 18, + 1, + -8, + 22, + -3, +-15, + 35, + 3, + -4, + 33, + 1, + -4, + 37, + 6, + -2, + 41, + 9, + -1, + 43, + 9, + -3, + 31, + -6, +-20, + 22, +-18, +-34, + 37, + -7, +-26, + 41, + -5, +-28, + 42, + -4, +-30, + 50, + 6, +-21, + 54, + 17, + -7, + 65, + 33, + 15, + 62, + 26, + 1, + 54, + 11, +-17, + 54, + 7, +-21, + 51, + 1, +-24, + 37, +-12, +-30, + 40, + -5, +-19, + 7, +-22, +-32, +-69, +-85, +-91, +-111, +-111, +-112, +-117, +-109, +-107, +-117, +-109, +-107, +-114, +-110, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-110, +-107, +-114, +-110, +-108, +-115, +-111, +-110, +-15, +-10, +-12, + 42, + 47, + 45, + 43, + 59, + 47, + 34, + 49, + 38, + 30, + 35, + 31, + 9, + 10, + 8, + 21, + 24, + 18, + 39, + 44, + 35, + 41, + 51, + 42, + 48, + 60, + 49, + 38, + 54, + 39, + -8, + 10, + -8, +-30, + -8, +-31, +-46, +-22, +-48, +-34, + -8, +-40, +-21, + 2, +-31, +-33, +-14, +-41, +-122, +-110, +-123, +-122, +-119, +-116, +-121, +-114, +-111, +-103, +-113, +-117, +-11, +-52, +-67, + 18, +-27, +-56, + 66, + 36, + 1, + 63, + 40, + 7, + 70, + 44, + 23, + 14, + -4, +-16, +-113, +-120, +-121, +-120, +-117, +-112, +-122, +-118, +-112, +-121, +-119, +-115, +-123, +-121, +-120, +-123, +-121, +-120, +-122, +-120, +-118, +-117, +-115, +-113, +-107, +-105, +-103, +-99, +-97, +-93, +-96, +-96, +-87, +-100, +-101, +-91, +-96, +-96, +-86, +-95, +-95, +-85, +-99, +-99, +-90, +-94, +-93, +-82, +-95, +-93, +-82, +-92, +-90, +-79, +-92, +-91, +-79, +-95, +-93, +-82, +-94, +-92, +-80, +-87, +-86, +-78, +-90, +-88, +-77, +-103, +-103, +-88, +-101, +-103, +-91, +-62, +-67, +-66, + 78, + 69, + 63, + 97, + 89, + 80, +113, +112, +115, +112, +111, +114, +110, +110, +114, +103, +104, +112, + -1, + -7, + -8, + 1, +-15, +-26, + 26, + 2, +-11, + 30, + -1, + -8, + 41, + 8, + 5, + 40, + 11, + 3, + 44, + 12, + 4, + 33, + -1, +-11, + 34, + -3, +-15, + 43, + 3, +-10, + 42, + 10, + -3, + 43, + 15, + 1, + 45, + 5, + -6, + 48, + -2, +-15, + 51, + -1, +-24, + 58, + 8, +-24, + 49, + 4, +-28, + 53, + 7, +-23, + 48, + 3, +-26, + 36, + -7, +-27, + 17, +-18, +-30, +-29, +-55, +-60, +-102, +-117, +-110, +-112, +-115, +-107, +-117, +-110, +-102, +-118, +-110, +-103, +-112, +-112, +-106, +-109, +-112, +-109, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-110, +-107, +-114, +-110, +-108, +-116, +-111, +-111, + 1, + 6, + 4, + 43, + 48, + 46, + 46, + 59, + 47, + 50, + 57, + 49, + 53, + 48, + 48, + 39, + 24, + 28, + 13, + 0, + -1, + 16, + 11, + 5, + -4, + 12, + 4, + -7, + 13, + 1, +-26, + -5, +-21, +-64, +-43, +-61, +-58, +-38, +-58, +-63, +-42, +-64, +-81, +-60, +-84, +-48, +-31, +-56, +-48, +-35, +-56, +-125, +-119, +-127, +-115, +-115, +-112, +-111, +-111, +-107, +-69, +-89, +-94, + 15, +-33, +-47, + 26, +-27, +-53, + 65, + 26, + -4, + 69, + 36, + 8, + 66, + 34, + 11, + 61, + 38, + 21, +-70, +-79, +-83, +-121, +-119, +-114, +-123, +-118, +-111, +-114, +-112, +-107, +-106, +-104, +-102, +-107, +-104, +-103, +-107, +-105, +-102, +-105, +-103, +-99, +-99, +-97, +-94, +-94, +-93, +-87, +-90, +-90, +-79, +-95, +-95, +-84, +-91, +-91, +-79, +-90, +-91, +-79, +-89, +-89, +-77, +-85, +-84, +-72, +-83, +-81, +-68, +-92, +-91, +-78, +-89, +-88, +-75, +-97, +-96, +-83, +-97, +-96, +-82, +-84, +-84, +-71, +-82, +-81, +-66, +-89, +-89, +-73, +-92, +-93, +-82, +-72, +-76, +-78, + 76, + 69, + 57, + 96, + 88, + 79, + 96, + 96, +104, + 97, + 97, +105, + 99, + 98, +107, + 95, + 88, +102, + 6, + 1, + 3, +-19, +-25, +-36, + 28, + 14, + -1, + 37, + 11, + 4, + 43, + 10, + 10, + 42, + 13, + 12, + 47, + 16, + 14, + 40, + 6, + 4, + 40, + 5, + 0, + 50, + 14, + 7, + 52, + 19, + 12, + 45, + 12, + 3, + 23, +-19, +-28, + 34, +-12, +-26, + 42, + -2, +-23, + 44, + 4, +-24, + 46, + 3, +-13, + 40, + -2, +-11, + 16, +-19, +-24, +-10, +-36, +-38, +-86, +-102, +-99, +-105, +-115, +-106, +-111, +-110, +-103, +-112, +-109, +-103, +-113, +-109, +-103, +-116, +-113, +-107, +-115, +-113, +-107, +-115, +-113, +-107, +-114, +-113, +-107, +-112, +-112, +-105, +-112, +-111, +-105, +-112, +-111, +-105, +-112, +-111, +-105, +-116, +-115, +-111, +-113, +-111, +-109, +-113, +-111, +-110, +-107, +-105, +-105, + 12, + 16, + 13, + 45, + 49, + 46, + 43, + 48, + 41, + 46, + 49, + 38, + 48, + 34, + 21, + 51, + 13, + -1, + 32, + -9, +-29, + 1, +-27, +-55, +-62, +-61, +-87, +-63, +-49, +-73, +-65, +-41, +-66, +-58, +-33, +-54, +-45, +-26, +-38, +-67, +-55, +-62, +-118, +-111, +-116, +-126, +-121, +-125, +-122, +-118, +-122, +-120, +-116, +-119, +-114, +-111, +-112, +-109, +-111, +-110, +-45, +-68, +-78, + 30, +-19, +-42, + 42, +-12, +-39, + 67, + 24, + -1, + 66, + 30, + 2, + 64, + 32, + 7, + 69, + 44, + 25, + 29, + 12, + 6, +-64, +-70, +-64, +-62, +-61, +-46, +-60, +-55, +-36, +-52, +-53, +-35, +-51, +-53, +-33, +-56, +-57, +-35, +-72, +-70, +-51, +-97, +-93, +-80, +-105, +-100, +-89, +-86, +-83, +-67, +-88, +-86, +-70, +-91, +-88, +-75, +-87, +-84, +-72, +-94, +-90, +-80, +-92, +-89, +-79, +-82, +-80, +-70, +-82, +-80, +-68, +-89, +-88, +-75, +-84, +-83, +-68, +-93, +-93, +-77, +-91, +-88, +-75, +-65, +-65, +-50, +-90, +-90, +-75, +-88, +-92, +-83, +-66, +-69, +-71, + 70, + 65, + 56, + 93, + 86, + 77, + 91, + 91, +100, + 92, + 92, +101, + 93, + 93, +103, + 91, + 87, +100, + 2, + 1, + 2, + 2, + 2, + -9, + -2, + -9, +-23, + 42, + 24, + 15, + 47, + 21, + 18, + 46, + 22, + 20, + 55, + 29, + 27, + 55, + 28, + 25, + 54, + 26, + 21, + 49, + 19, + 14, + 41, + 13, + 7, + 41, + 13, + 7, + 46, + 14, + 7, + 48, + 16, + 5, + 45, + 17, + 1, + 55, + 32, + 15, + 26, + 8, + -2, +-50, +-68, +-72, +-94, +-105, +-107, +-107, +-111, +-110, +-111, +-109, +-105, +-114, +-108, +-103, +-110, +-106, +-101, +-111, +-108, +-102, +-113, +-109, +-104, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-114, +-114, +-106, +-112, +-112, +-105, +-111, +-111, +-104, +-112, +-111, +-104, +-112, +-111, +-105, +-121, +-119, +-115, +-123, +-121, +-119, +-114, +-112, +-111, +-88, +-86, +-87, + 26, + 29, + 26, + 43, + 46, + 43, + 50, + 54, + 48, + 47, + 50, + 40, + 30, + 17, + 4, + 31, + -7, +-23, + 36, + -8, +-32, + 29, + -4, +-36, + 24, +-11, +-36, + 12, +-14, +-40, +-21, +-30, +-55, +-51, +-44, +-67, +-96, +-78, +-91, +-125, +-109, +-117, +-124, +-121, +-122, +-123, +-120, +-121, +-120, +-117, +-118, +-118, +-115, +-116, +-115, +-112, +-113, +-111, +-112, +-111, +-48, +-69, +-80, + 39, + -5, +-31, + 59, + 12, +-16, + 73, + 37, + 11, + 66, + 34, + 6, + 73, + 40, + 13, + 74, + 44, + 23, + 73, + 51, + 41, + 20, + 7, + 7, +-39, +-44, +-32, +-44, +-44, +-24, +-42, +-45, +-21, +-41, +-45, +-18, +-42, +-44, +-16, +-52, +-52, +-27, +-62, +-58, +-39, +-84, +-79, +-64, +-78, +-75, +-58, +-82, +-80, +-63, +-85, +-82, +-67, +-86, +-82, +-70, +-84, +-80, +-68, +-94, +-91, +-80, +-89, +-87, +-77, +-83, +-81, +-70, +-87, +-85, +-72, +-84, +-84, +-69, +-81, +-81, +-64, +-93, +-91, +-77, +-85, +-84, +-69, +-87, +-87, +-73, +-84, +-88, +-80, +-58, +-62, +-64, + 79, + 74, + 66, + 94, + 87, + 78, + 87, + 88, + 97, + 89, + 89, + 98, + 90, + 90, +100, + 91, + 92, +103, + -2, + 2, + 5, + 12, + 18, + 9, +-12, +-11, +-23, +-23, +-32, +-42, + 29, + 12, + 7, + 44, + 24, + 21, + 49, + 30, + 26, + 52, + 32, + 27, + 56, + 36, + 31, + 55, + 34, + 29, + 47, + 28, + 23, + 44, + 26, + 23, + 47, + 31, + 27, + 62, + 50, + 44, + 88, + 79, + 72, + 97, + 90, + 82, +-15, +-17, +-21, +-113, +-111, +-109, +-113, +-110, +-107, +-111, +-106, +-103, +-112, +-104, +-100, +-108, +-101, +-97, +-110, +-106, +-100, +-113, +-110, +-104, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-114, +-113, +-106, +-112, +-112, +-105, +-111, +-111, +-104, +-111, +-111, +-104, +-112, +-111, +-105, +-118, +-116, +-112, +-120, +-118, +-117, +-120, +-117, +-116, +-48, +-46, +-47, + 38, + 41, + 38, + 47, + 50, + 47, + 45, + 47, + 42, + 41, + 44, + 36, + 28, + 18, + 9, + 35, + 0, +-12, + 26, +-18, +-38, + 22, +-13, +-44, + 50, + -3, +-29, + 51, + 4, +-26, + 52, + 17, +-14, + 14, + -7, +-33, +-56, +-68, +-82, +-110, +-114, +-122, +-121, +-118, +-119, +-120, +-117, +-118, +-119, +-116, +-117, +-117, +-114, +-115, +-116, +-113, +-114, +-111, +-112, +-112, +-51, +-69, +-81, + 47, + 9, +-19, + 74, + 35, + 5, + 78, + 48, + 22, + 77, + 50, + 24, + 77, + 44, + 19, + 75, + 40, + 18, + 71, + 41, + 24, + 76, + 55, + 47, + -4, +-17, +-12, +-43, +-49, +-30, +-43, +-49, +-21, +-45, +-50, +-18, +-42, +-46, +-13, +-45, +-47, +-16, +-59, +-58, +-33, +-60, +-56, +-36, +-54, +-52, +-33, +-54, +-52, +-35, +-89, +-87, +-71, +-79, +-76, +-62, +-80, +-76, +-63, +-88, +-85, +-74, +-92, +-90, +-79, +-83, +-81, +-70, +-87, +-86, +-73, +-82, +-81, +-66, +-79, +-79, +-62, +-84, +-81, +-67, +-90, +-89, +-74, +-81, +-81, +-67, +-83, +-87, +-79, +-16, +-19, +-22, + 92, + 87, + 79, + 96, + 89, + 80, + 51, + 51, + 58, + 51, + 51, + 58, + 55, + 55, + 63, + 56, + 58, + 66, + -8, + -4, + -1, +-31, +-25, +-31, +-11, + -7, +-16, +-40, +-42, +-51, +-45, +-55, +-61, + 8, + -6, +-10, + 21, + 6, + 4, + 20, + 7, + 3, + 18, + 4, + 1, + 19, + 5, + 2, + 5, + -7, + -8, + 31, + 23, + 23, + 42, + 35, + 35, + 57, + 53, + 52, + 56, + 55, + 53, + 45, + 45, + 43, +-73, +-73, +-72, +-105, +-105, +-102, +-102, +-102, +-99, +-102, +-101, +-98, +-100, +-101, +-97, +-99, +-99, +-95, +-103, +-101, +-98, +-104, +-103, +-100, +-105, +-104, +-101, +-105, +-104, +-101, +-105, +-104, +-101, +-105, +-104, +-101, +-104, +-104, +-101, +-104, +-104, +-101, +-103, +-103, +-99, +-102, +-102, +-99, +-104, +-103, +-100, +-106, +-105, +-104, +-107, +-107, +-106, +-107, +-106, +-105, +-41, +-39, +-40, + 17, + 20, + 18, + 21, + 24, + 21, + 17, + 19, + 15, + 19, + 22, + 16, + 3, + -3, + -8, + 1, +-25, +-32, + 0, +-34, +-48, + -4, +-31, +-55, + 7, +-28, +-52, + 18, +-20, +-46, + 23, +-15, +-42, + 24, +-10, +-31, + 1, +-28, +-39, +-74, +-91, +-95, +-106, +-105, +-106, +-107, +-105, +-106, +-106, +-105, +-105, +-105, +-104, +-104, +-104, +-103, +-103, +-101, +-102, +-102, +-24, +-40, +-49, + 20, + -8, +-31, + 46, + 18, + -6, + 41, + 19, + 0, + 45, + 25, + 6, + 48, + 21, + 4, + 39, + 10, + -8, + 36, + 10, + -8, + 42, + 22, + 12, + 6, + -7, + -5, +-60, +-67, +-53, +-60, +-65, +-42, +-60, +-65, +-38, +-59, +-63, +-35, +-57, +-59, +-34, +-62, +-61, +-41, +-77, +-75, +-58, +-64, +-63, +-47, +-54, +-52, +-37, +-87, +-85, +-74, +-84, +-82, +-71, +-82, +-79, +-69, +-89, +-87, +-78, +-92, +-91, +-84, +-84, +-82, +-74, +-94, +-93, +-84, +-83, +-83, +-72, +-82, +-82, +-70, +-84, +-83, +-73, +-89, +-89, +-78, +-84, +-84, +-74, +-86, +-89, +-84, + 2, + -1, + -3, + 59, + 56, + 49, + 60, + 54, + 47 +}; diff --git a/examples/app_flash_two_models_one_arena/src/main.cpp b/examples/app_flash_two_models_one_arena/src/main.cpp new file mode 100644 index 000000000..7b1483d90 --- /dev/null +++ b/examples/app_flash_two_models_one_arena/src/main.cpp @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include +#include +#include "flash_server.h" +#include "model1.tflite.h" +#include "model2.tflite.h" + +#include "image.h" +#include "image2.h" + +uint8_t tensor_arena[LARGEST_TENSOR_ARENA_SIZE] __attribute__((aligned(8))); + +#define NFLASH_SPECS 1 +fl_QuadDeviceSpec flash_spec[NFLASH_SPECS] = { + FL_QUADDEVICE_DEFAULT //FL_QUADDEVICE_MACRONIX_MX25R6435FM2IH0 +}; + +fl_QSPIPorts qspi = { + PORT_SQI_CS, + PORT_SQI_SCLK, + PORT_SQI_SIO, + XS1_CLKBLK_2 +}; + +DECLARE_JOB(flash_server, (chanend_t *, flash_t*, int, + fl_QSPIPorts*, fl_QuadDeviceSpec*, int)); +DECLARE_JOB(nn_thread, (chanend_t, chanend_t)); + +void nn_thread(chanend_t flash1, chanend_t flash2) { + model1_init((void *)flash1); + int8_t *inputs1 = (int8_t *)model1_input_ptr(0); + int8_t *outputs1 = (int8_t *)model1_output_ptr(0); + memcpy(inputs1, image, sizeof(image)); // copy data to inputs + model1_invoke(); + printf("%s (%d%%)\n", outputs1[0] > outputs1[1] ? "No human" : "Human", (outputs1[1]+128)*100/255); + + // Note - when using a shared tensor arena, + // you must initialise the model before INVOKE + // when switching from one model to the other. + model2_init((void *)flash2); + int8_t *inputs2 = (int8_t *)model2_input_ptr(0); + int8_t *outputs2 = (int8_t *)model2_output_ptr(0); + memcpy(inputs2, image2, sizeof(image2)); // copy data to inputs + model2_invoke(); + printf("%s (%d%%)\n", outputs2[0] > outputs2[1] ? "No human" : "Human", (outputs2[1]+128)*100/255); + chan_out_word(flash1, FLASH_SERVER_QUIT); +} + +#define NNETWORKS 2 + +int main(void) { + flash_t headers[NNETWORKS]; + chanend_t flash_server_chanends[NNETWORKS]; + channel_t c_flash1 = chan_alloc(); + channel_t c_flash2 = chan_alloc(); + flash_server_chanends[0] = c_flash1.end_a; + flash_server_chanends[1] = c_flash2.end_a; + PAR_JOBS( + PJOB(flash_server, (flash_server_chanends, headers, NNETWORKS, + &qspi, &flash_spec[0], NFLASH_SPECS)), + PJOB(nn_thread, (c_flash1.end_b, c_flash2.end_b)) + ); +} diff --git a/examples/app_flash_two_models_one_arena/vww_quant1.tflite b/examples/app_flash_two_models_one_arena/vww_quant1.tflite new file mode 100644 index 000000000..2abf500af Binary files /dev/null and b/examples/app_flash_two_models_one_arena/vww_quant1.tflite differ diff --git a/examples/app_flash_two_models_one_arena/vww_quant2.tflite b/examples/app_flash_two_models_one_arena/vww_quant2.tflite new file mode 100644 index 000000000..2abf500af Binary files /dev/null and b/examples/app_flash_two_models_one_arena/vww_quant2.tflite differ diff --git a/examples/app_mobilenetv2/Makefile b/examples/app_mobilenetv2/Makefile new file mode 100644 index 000000000..70bee71a6 --- /dev/null +++ b/examples/app_mobilenetv2/Makefile @@ -0,0 +1,33 @@ +TARGET = XCORE-AI-EXPLORER +APP_NAME = + +APP_FLAGS = -report \ +-O3 -mcmodel=large -fxscope -Wno-xcore-fptrgroup \ +-g \ +-lquadflash \ +-DSHARED_TENSOR_ARENA + +# ******************************************************* +# Include AI Tools library and headers +# ******************************************************* +# The following variables are defined for AI Tools library +# and should be included when building the app. +# XMOS_AITOOLSLIB_DEFINITIONS +# XMOS_AITOOLSLIB_INCLUDES +# XMOS_AITOOLSLIB_LIBRARIES +# +ifeq ($(XMOS_AITOOLSLIB_PATH),) +$(error Path to XMOS AI Tools library and headers not set correctly!) +endif +include ${XMOS_AITOOLSLIB_PATH}/buildfiles/aitoolslib.make + +XCC_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_CPP_FLAGS = $(APP_FLAGS) -std=c++14 $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_MAP_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_LIBRARIES) + +#============================================================================= +# The following part of the Makefile includes the common build infrastructure +# for compiling XMOS applications. You should not need to edit below here. + +XMOS_MAKE_PATH ?= ../.. +include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common diff --git a/examples/app_mobilenetv2/README.rst b/examples/app_mobilenetv2/README.rst new file mode 100644 index 000000000..0955f10a8 --- /dev/null +++ b/examples/app_mobilenetv2/README.rst @@ -0,0 +1,18 @@ +MobilenetV2 example with flash +============================== + +Please consult `here <../../docs/rst/flow.rst>`_ on how to install the tools. + +In order to compile and run this example follow these steps:: + + python obtain_and_optimize_mobilenetv2.py + xmake + xflash --target XCORE-AI-EXPLORER --data xcore_flash_binary.out + xrun --xscope bin/app_mobilenetv2.xe + +In the example, we inference the model with a sample image of a LION. +Running the example should print:: + + Correct - Inferred class is LION! + +The same lion image is saved in raw format as ``lion.bin`` for inference on the host interpreter, and as a header file in ``src/lion.h`` for inference on device. diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000002377.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000002377.jpg new file mode 100644 index 000000000..9da1cde25 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000002377.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000003157.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000003157.jpg new file mode 100644 index 000000000..9037d7ad7 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000003157.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000026132.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000026132.jpg new file mode 100644 index 000000000..0721e9cfb Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000026132.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000026924.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000026924.jpg new file mode 100644 index 000000000..46d0405f1 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000026924.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000027622.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000027622.jpg new file mode 100644 index 000000000..824cdce98 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000027622.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000049478.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000049478.jpg new file mode 100644 index 000000000..052113731 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000049478.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000050562.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000050562.jpg new file mode 100644 index 000000000..d1c76b7fc Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000050562.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000066822.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000066822.jpg new file mode 100644 index 000000000..75a976ae4 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000066822.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000068502.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000068502.jpg new file mode 100644 index 000000000..148feaba3 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000068502.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000070322.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000070322.jpg new file mode 100644 index 000000000..7a88f4476 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000070322.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000070659.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000070659.jpg new file mode 100644 index 000000000..73c81baeb Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000070659.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000083002.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000083002.jpg new file mode 100644 index 000000000..78896dd12 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000083002.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000085589.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000085589.jpg new file mode 100644 index 000000000..a0e718c98 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000085589.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000090498.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000090498.jpg new file mode 100644 index 000000000..81318d0c8 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000090498.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000098956.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000098956.jpg new file mode 100644 index 000000000..f84072621 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000098956.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000100703.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000100703.jpg new file mode 100644 index 000000000..32b29a9e0 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000100703.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000105708.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000105708.jpg new file mode 100644 index 000000000..3c13c6c22 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000105708.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000106003.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000106003.jpg new file mode 100644 index 000000000..9d5e2f47e Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000106003.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000115218.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000115218.jpg new file mode 100644 index 000000000..03c50d52e Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000115218.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000116003.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000116003.jpg new file mode 100644 index 000000000..1697cc312 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000116003.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000118104.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000118104.jpg new file mode 100644 index 000000000..66da1dd3f Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000118104.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000123579.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000123579.jpg new file mode 100644 index 000000000..32a32e8e4 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000123579.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000125586.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000125586.jpg new file mode 100644 index 000000000..763889261 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000125586.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000126936.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000126936.jpg new file mode 100644 index 000000000..5c10dce3d Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000126936.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000131099.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000131099.jpg new file mode 100644 index 000000000..a7275d6ec Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000131099.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000143944.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000143944.jpg new file mode 100644 index 000000000..5a8118ca9 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000143944.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000151669.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000151669.jpg new file mode 100644 index 000000000..f11c9a19b Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000151669.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000157016.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000157016.jpg new file mode 100644 index 000000000..78e7adbe8 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000157016.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000158107.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000158107.jpg new file mode 100644 index 000000000..dece97801 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000158107.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000180609.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000180609.jpg new file mode 100644 index 000000000..51a229633 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000180609.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000190617.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000190617.jpg new file mode 100644 index 000000000..ccd1dd0e7 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000190617.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000192322.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000192322.jpg new file mode 100644 index 000000000..878147c0f Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000192322.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000195233.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000195233.jpg new file mode 100644 index 000000000..d866721a7 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000195233.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000205297.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000205297.jpg new file mode 100644 index 000000000..8b2f3a805 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000205297.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000210258.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000210258.jpg new file mode 100644 index 000000000..8ba7e60d4 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000210258.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000213344.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000213344.jpg new file mode 100644 index 000000000..c06805675 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000213344.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000217672.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000217672.jpg new file mode 100644 index 000000000..d6fe04baf Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000217672.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000218057.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000218057.jpg new file mode 100644 index 000000000..ba1ba2709 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000218057.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000219385.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000219385.jpg new file mode 100644 index 000000000..2993bcae2 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000219385.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000223458.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000223458.jpg new file mode 100644 index 000000000..c8f7b41dd Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000223458.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000229347.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000229347.jpg new file mode 100644 index 000000000..c36b72119 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000229347.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000230708.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000230708.jpg new file mode 100644 index 000000000..6964dc2a3 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000230708.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000232143.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000232143.jpg new file mode 100644 index 000000000..093602416 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000232143.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000238843.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000238843.jpg new file mode 100644 index 000000000..71d453dfc Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000238843.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000243361.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000243361.jpg new file mode 100644 index 000000000..261dc2d73 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000243361.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000243527.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000243527.jpg new file mode 100644 index 000000000..7c127cc16 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000243527.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000244528.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000244528.jpg new file mode 100644 index 000000000..ed3f6d39e Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000244528.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000246384.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000246384.jpg new file mode 100644 index 000000000..d6be6ad2b Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000246384.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000247338.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000247338.jpg new file mode 100644 index 000000000..fa1f249e1 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000247338.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000266880.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000266880.jpg new file mode 100644 index 000000000..f1c1885e3 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000266880.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000269561.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000269561.jpg new file mode 100644 index 000000000..297444913 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000269561.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000271006.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000271006.jpg new file mode 100644 index 000000000..7df0e348e Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000271006.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000279672.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000279672.jpg new file mode 100644 index 000000000..b5816a8db Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000279672.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000287427.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000287427.jpg new file mode 100644 index 000000000..98705651b Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000287427.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000292620.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000292620.jpg new file mode 100644 index 000000000..3d6afa0ad Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000292620.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000293805.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000293805.jpg new file mode 100644 index 000000000..08afdbf63 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000293805.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000297266.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000297266.jpg new file mode 100644 index 000000000..05d506977 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000297266.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000300028.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000300028.jpg new file mode 100644 index 000000000..5c0fbb94c Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000300028.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000305287.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000305287.jpg new file mode 100644 index 000000000..89734beed Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000305287.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000305600.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000305600.jpg new file mode 100644 index 000000000..f13b338f4 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000305600.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000307999.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000307999.jpg new file mode 100644 index 000000000..3b06508ed Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000307999.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000308302.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000308302.jpg new file mode 100644 index 000000000..da1b57273 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000308302.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000314852.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000314852.jpg new file mode 100644 index 000000000..e83e318a0 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000314852.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000316113.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000316113.jpg new file mode 100644 index 000000000..178e1f571 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000316113.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000330391.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000330391.jpg new file mode 100644 index 000000000..bb1684608 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000330391.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000348670.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000348670.jpg new file mode 100644 index 000000000..b8a60c0d3 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000348670.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000355550.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000355550.jpg new file mode 100644 index 000000000..094d31738 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000355550.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000365512.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000365512.jpg new file mode 100644 index 000000000..174c2f33e Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000365512.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000372229.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000372229.jpg new file mode 100644 index 000000000..98f32f9a7 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000372229.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000378396.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000378396.jpg new file mode 100644 index 000000000..03f628b1e Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000378396.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000384475.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000384475.jpg new file mode 100644 index 000000000..3f6ef3531 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000384475.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000385239.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000385239.jpg new file mode 100644 index 000000000..dc545f300 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000385239.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000387976.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000387976.jpg new file mode 100644 index 000000000..01036f15c Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000387976.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000421619.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000421619.jpg new file mode 100644 index 000000000..806ccdef8 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000421619.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000423637.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000423637.jpg new file mode 100644 index 000000000..da3299951 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000423637.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000444312.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000444312.jpg new file mode 100644 index 000000000..a229a8ada Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000444312.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000448461.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000448461.jpg new file mode 100644 index 000000000..0b387322e Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000448461.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000461549.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000461549.jpg new file mode 100644 index 000000000..e9efc0784 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000461549.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000466191.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000466191.jpg new file mode 100644 index 000000000..32ff4d392 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000466191.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000476125.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000476125.jpg new file mode 100644 index 000000000..35af963cd Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000476125.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000490434.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000490434.jpg new file mode 100644 index 000000000..a4c1b3908 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000490434.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000503274.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000503274.jpg new file mode 100644 index 000000000..633fcea8b Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000503274.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000505655.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000505655.jpg new file mode 100644 index 000000000..6b0e1d41c Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000505655.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000506149.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000506149.jpg new file mode 100644 index 000000000..7905d0f67 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000506149.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000508870.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000508870.jpg new file mode 100644 index 000000000..660b6a5f3 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000508870.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000510211.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000510211.jpg new file mode 100644 index 000000000..879488849 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000510211.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000513371.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000513371.jpg new file mode 100644 index 000000000..1078cbff3 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000513371.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000517882.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000517882.jpg new file mode 100644 index 000000000..5a4837cc3 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000517882.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000521048.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000521048.jpg new file mode 100644 index 000000000..0fbb10d68 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000521048.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000521327.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000521327.jpg new file mode 100644 index 000000000..d2f8c0022 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000521327.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000532457.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000532457.jpg new file mode 100644 index 000000000..ec8ec1d64 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000532457.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000535649.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000535649.jpg new file mode 100644 index 000000000..4301badc9 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000535649.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000537337.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000537337.jpg new file mode 100644 index 000000000..8a6398cba Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000537337.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000542931.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000542931.jpg new file mode 100644 index 000000000..78eb8d0b5 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000542931.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000546147.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000546147.jpg new file mode 100644 index 000000000..ca7a87cb7 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000546147.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000547979.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000547979.jpg new file mode 100644 index 000000000..c12194ecb Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000547979.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000549236.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000549236.jpg new file mode 100644 index 000000000..8c222a0d4 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000549236.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000551869.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000551869.jpg new file mode 100644 index 000000000..2be0d688b Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000551869.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000563597.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000563597.jpg new file mode 100644 index 000000000..3f2df2107 Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000563597.jpg differ diff --git a/examples/app_mobilenetv2/image_samples/COCO_train2014_000000563771.jpg b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000563771.jpg new file mode 100644 index 000000000..12215b73c Binary files /dev/null and b/examples/app_mobilenetv2/image_samples/COCO_train2014_000000563771.jpg differ diff --git a/examples/app_mobilenetv2/lion.bin b/examples/app_mobilenetv2/lion.bin new file mode 100644 index 000000000..9319435c1 --- /dev/null +++ b/examples/app_mobilenetv2/lion.bin @@ -0,0 +1,141 @@ +Ľͳžýºο»zqſ¼ŨǾûɾÿʹĿþ}ocY~wľϻĻƶ̿ĺʿȿžž¼ƿƻŻzk|vug^wd[zļ{øƸʴųĶɹķżɾįxǸ{|ozvhTLykanWKfQHgUKmXKm`wtxo±|lryɬqtrørdQ~io[kWrcZ~xoudWL8-jRGN:0`NE[F9w]Jo]r`UweWgTyg}{s{i}fTxvctj{b|hzhoĸ¹ǽ¼n_s`sUxgtc}l}lhVtTCrYr`v]KfN=cL@\F=o]PH7/W?6:(!@0)O=6U@5pUEtZJfSGy[DvZCfOsnoWp]y_JmVt^tWEgUqVnVuZDu]ýϿʼοvuSlM}aKiVjWnWF^E5mP9sQ1bI:Q=1kO;mP;yY@`K}_IeIyZBkO;fNxXDrS@iSeHaJeJlUyvtc|kvrxf~¶qndoa}k|mfToVX)I4#A)2V;#8!13"7&!I5,[B3D/"V:,fI3^?'_FcB)_ApQ5cG2rT&D.<)C,A)F03!--C1%W<-iL7H2!\<"O6#{W((:(9&mL6?(hH/P7#gC(aB)zT8kJ0bE-aD2hJ7hJ6uR;zS3e>hH[?tQ5lK0rQ7iI/sS:|_Hu\Jx`NcSdLfïƹɿŹr\nL[@rR9eD/W9'V:'V:$Y='E,4#<%Q6$kH-b?U1]=~R2zS2oL.rJ-_>$B)O9&D)E.A+?%  +3"9%^E3Y<%fI2^@bB'nJ,tP0rK/dG0eH2pP:gH3eDmBiCjEuU;`>kG+aC+[?)kI1pK2\>&bJ7rR9jQy¦ӹйѿѿw^aGtN1]='J/!F+G*O3!G+I/8"D*R6zR8^:Y2];uJ&sL/uP2mG(T6`H,Z<&U8%E+\=$W:# (B. N6#dF/J.X8mJ,|U3uL+jG0mL2_EiJ1]>iBrFe?~W6lEqL/mI-rO4dB(eC+P1\<#~V6iFvR`ʠzֺΣǧԼ˰nY^9yP1d@%I/=%B+J4&O9)Q6!S2U8!T6~T3eyINŇWƉVϑ^ljUәhˑfĖoѸξťĞʖnϖfؙf͒aёbȌȔ]zItEl>g9h9f9c9c;X4f=![;"wM3Q3a=Z4}P/Y5R0W1kAtGlE`gGvJ|KvJTXVċZϒȁ]Дb͑_ϒ`R~O‡X{NxMwKuE|KtB{FwC{GłNÀLύVяXԑZՒ[RbȤ̸»ˬjYWQ΍]֑]эT͈VˊWNsDo@qAp?i9lo=vEĂO{GǁNi:e7h8o@i;uFÂNNxMd=vKnIkBa7[3T/_8\3ÅT~QjBg]2oDh>b7qEJRÆRˌWϐ[ÄR̎\ΐ_ВaLJT{M[[ćYRvFzIp?r@vEvCzH{HĀMzGrBd;`>_?\;Y?~YBiYɹzfQjJyQrLpMb?\9zL+[6d=pA}J|JsCs@zFxGyF~HǀI{IzMS\YVɌZґ`Α^e?mB}Nn>xHg:f:rEd:g=j?qEkAe;sIxIsDMȈUÄPĆUƈWȊYӕdϏ]WZÊ^U|KvEqAq@uAvCuB{IzHuB{GyI{Mi@vMzSU_yUrTٸrZpLvK^rAf5h7oB|KxGj=RƊZqHzQpGdžWĉWƅTuL\QqBf<]4W,\5zM)e;i=`6g=mCkAzLOÃS~NPɋZŇVϐ`ĄRWĈX†VO}KzJzJwEv@xBvD|IǂO|Ir?OzKwGqEk>uJuNgBiEyQϯv[mInI]:P1}N,yJ(V1h@Z6X4W6V6wI$h;vFxFvDwGf6j;wHuEm={Lˊ[rK~SqFqCʊYӓb|QSQW.b:b9g>d:qF$Z5d8a8h?kC|MzJwGT}NŇX̎_}MÃSƈYϐaÅVRuEtCo?n@i:j9p>}Go9tArBe7g8tErCn>uAd=]6d=hAnKvQDzptPiApH`7T1R/}N,P*W/_;`;O0}L#c6[0_7f=j?i=f;c:i@i8qArCzKXRSwL‚RĄT|M~OVÊYyMi?qDpBR0V1pBn?|MlDo?sC|MQċ[SyJNɉYƇXɋ\ÄUzKpDmBe8m>h8q@p?q?xFd5_5npAN{Lo?uE…VƊZƏ]uGzLvC„QȌ\RńRTgb9zHtG}O+sESQzJwG~OćX͑aӜj{OmAlj\ņYQPʉW|OsHf9qCqBk;m;yFzF}I{Go>b6sGuDk:tAuDyJȃTÃOāNwF|NyMftUzNtGuIf>fAeBY1xI'wK/xK)V3a9f:S-tC$P+W-`6wIƇRґ\ȃLŀIǂO|JĀM~NdžYV‡YUWWVTTȋ[~O~Sk?|L|LX5~MRňW|OxKSʍ^ИjқlxPuIzOrFQ{LyJ}OrErEd7_2o>j;l>zFt@tCh9W0e:xFʂMzCqB{K~SɈWłRʃSzNuJ~QwvPDŽTɅV~KyIwJmDV2j; P1U-U0jAY0ewJf9k:g9a6`4a5g8i:d6c5i;yE}MwG|HLՍWّ[cԏZ{NyLϱϜsfʼnXɃP~LyM{QmE]9]4Z8c9T2j>i=^5l@MŃNȃQыWʅQǁNxENʉVɄQ|I|IwH̋]nj\~RYʌZyQW[‡YyIOTSĉ[|LiEXPm>}QVPTÍ`ɓfŒcYW~RuIƇXPQqCg9h;a4j8d6Y/^1tGk^3X3_;d>_9tCwEqGeN+U4M,R-@$F&D"+ E'T4vN/mD&b<S1_5mrGU6X7q?ȈVOPh=tEɸgZRiQ<ъZ~KhAnHX5nB'lA&qG'd='C#" "A&Y; lF(Y6`;uI)i>U2e?S*†TuG^9P/XWҡvƕiզz͜q֢r\ZX|P\UƎbzQvLzPlAsE{Q{TǐcҜn͖jZV˘mɘr[Ɠhԡv͘lÎb\TyMrIoDxHΉUʃM{DGk9lRC9xJ{KhC];`=W5]?Y9~P/S1%B! V4R1a8lBh?^4f;a7nCqDjAlD[fB}Xb”kک}ܪ}ʖjÎa]|SWzPɗjɒeȏaWf>evHe@X9yL/wK)oG*P0mHg@d8h?d;b8k@xR뷶{wqgZUVE;C5.bCwJa:M*M,b=g@a=R1_='=#G-:$iE%vHwGwFxFtBrCwLPTŠ\hDwSÔpff͘lʕi˗j]Tč^RњkË[~OVtKdF4,:,$YA6UrFT-xC'i7eAb=oF(d<(U9$B&$uV3Q'd8g9d7^0^1WňXT_jLʞxÔoӡx͘pōbXʕiɔhV~SZzNySgD}UZjB~T1oFc3,4*$2"5&gDǀQa;M-oA&_5qE.aB]>rP9B'%%?%T2}L{LrCPˎ]~Qd?dFoحץ|ڨ˖lКp̗kŐdXrIuJZVW~VuP}SmDsN.hAZ;yQzNuJ*^čaҚo]Î_͘n`ܧ{ۦzأwݩ|բuإxఉǙuY5a:d@S0O&a5c4mFI*@#hB(iB&X8oMoFŇ_VÃUOvF|GbzwuMHFB<:91/*"5%". 2!uPoEX5]9Z:Y?a=%Z8!3 +A*F/#$ c@%g:yFNxJ]5]:Z=pթޯ̛۪q֦{ҢvϚnќpϝr\W|PjEqIË_Z`gGaBP0e=~PSmCtY?rc|ǿxsnC<6/'",#/$.+(&Q4 ]dC&zPrMc=jCh>rD|Q|S~SΗlڦ{ܦv射ީ}ȓhΘnۦz跍纔ഐwUnC(vL1U2pFĊ[֛mwsؘc̑^ǑdʔgTvIoCyM/`C,{]EeP}ٹJDB=526+&+- 1/%7$V8 W6iG[9nFTÅTUVbAkD(P.9 F(aA(U7oSsӦΠxȚv͞xĚrhѝu˖mϕgԙlןrљlŊZÇ[zNzRpJf?YWtHrIkJ^wOvNd?mFvJ‚TʏaË_ōa֠r붊ڣtȓgϝs۩֤z縑㷐У{xUyR2W4WԘhjmnhԔ^ژ_ڗ_ӗhtET2oL3wO7Y=bJm\}oڬd^\@86;0*;,%1!.-0" +! !R8"c@yM˔d֓b֔_юY~KvKmFT3d?"T3M/lL,vQ̜t٩ӥשejiyXőeީ}Γgҗk̑bĉZSVxLzQvPe>f|SmEyPdBZtJjEeBoH}PƄWԘh̐b՚kʐbۦ|䯃ߧxИi଀ݫܫݯÛ黔ƖpsNyRǑgᮀzu֘iӎ\ЌZ͉RҎWhWpO/Y>$vU2}[>pWzdo֔RKI>4/=.&:)1*(0% 9"6"D'xQۡm՘dƆVsGuEzM^8_8F5/4#1 (% E/$D0$4!y]EeFzYXxOc?lJvM|MXkF\8^:c=zQ_ӟt௄ƙt]kʙpᰇ{؟lՙgÌ^sGOҔcQʏcɎbXqGfDY6g?wLyNVtN-{O~ToH`9a<{Nˑ`vҗhMRl?sHʎ_p볂汃鵊ޯߴ߬ףxUyO͌^xww|ޝhߟjjsәgerO0nK/mK1zT7_?qR}ٶbYS[LHT@9A-#4!)&% 1K3P8!fH}X^\wStKwL{PTɎ]ΖdSyNwOmGrNќu߮Ѥ~m_ףvڦyڠrڜjΒ`xJQϏ]ؚh{JΓgҗkɐ_tH[6kCUċ]O~SfA&|TyRpFh?nF}Mˑaw~}NƆVăT€VחhБaqu︊߳繓ݮXWxIӓbݜluohۚcۛeڟlڥvӤxˡurLfC~U5[?tUuȺ縻{gZUYGA=+!4#3!1) % +1O2}\fđfďcYYŌZ͏\͏\ȄT̈X~KQmArLuLX˚rϞwg{WbިɖcИl\˕gQҖcΎ\͏]tGՠt֞nѕe|LnDlCyLƋ^xNtLU0zSÈ\rGrFoCxK͗eߩw䱂̑e†RˆUɇXɇXŅVђbܛes䯂嵍ⴎ㱇ʏck=yHҍXo{|wۛgۛgy鳁츅اy|Rh?g?f?fòǷĻӮ|ZMERA7I3(G1&<'.( +,1z[<]ǔjϙlÎbY{R\ˍZLƇRzFsDvHsFhAnI[7gE`zVpK]ďeaĊ[‡YSTSwJąWӟrأw١pݡq͐asEoBtF~QrFsHsKnFU~S{Oe:oDT՛kߧz|ɎZĀOיh՗fyJ}Nʍ]՗g؜m嶎ᰆUqFtFzJЍZܙflݛgޞjߟkmx뷅岁ȔdJpEuQ|Ļ߷xjdcSHL9-B/$?(?%5):']C-}YǘjעuĎ_ZWŒcƍ_NJWwCqBwHlArDa9a:|S]h\sPtNX_^A~R3yR4yN0nIŕjxMYѢ|᱊ҜoДgNJ]k>zMZƋ]TQVlBwLpGmC{OwMĈX؜lz紇ٝixJwwLb9#tK/^;xP̓fœ淏ŐesIjAxJЊYՏZЎZӒ^ғ`ԔaҔ^ޟjsz|춁ןlċ\TzSqᄏs^VZE7N9+L4$G0"345\C.cBgգu]ďaΙnɔhZ{LvJoCuD}LyNX4^9h?|QyMzW|YhEqNnGd=wN.U7%W<(S8yR.[gAܬณ㵐˗kԗkyNuI}QYˑbȍZč]UzOUuJ[ˏ^}OOٜmߤr뷌إ{oBYW. \<$6Q2Z8~P՛kأv᳍ÜǒfpFf=k={KԏYٕ_hڙfזbӑ^͎Y֖dޥp}ӛgXƎ^]b黸xodNAcL:ZA0K5&='<#6?'jJ-^ПpYȔeԟqѝmÎ^ӘfԕeSQΐ_vFh=k@yOrGxLČ`\oMhGeDdAd?># 14   +_;$X3{RԦǙtďc†Z{OUT\WUUtL˔hvI{LUĈTNjZTΒbߣq居xM( +3*+I $& rH*^2zM_渒ƞܧ{U}SuG}LЊTْYaݗa֐Yۓaߤntޢnw}xŋ\UČ`͖jÔpɶͩzbUt\NhL>TA7H3$A'H-B(_D*bBf]Μiܪ}ՠnŒ[ϙg„S~P{JXxIh?i@pGwPd;{QfiEtT^@cC\4X7  +4 +" 4vYƚwvQ`|QU~R^Sƍ\QSyOÎaVʎ\~Lϑ_ϔbŌ_xKXƖixK#G! Q- D a;]4_ᰉ߱Ӣv֡wˌ]OƃNڒZڑYшPԉO֋Qߙ_lё_Ϗ\ߟmtܦs͗f˕f[j鰦k_t]Or[M^GU٩“nmMfGwXlI^='#/kA09 dE,X8sQnFsKU\URwKwKzKb9~SRQĆUϕcUrKa=Y@>#n uNmHrMxP{PzN~R‹`\j>T|PxKVƌ_wLkK[yB-"΍UȐБps]I羡T2tMҔg٢yj̞y[WvIpBɉQŀOͅOΉRĆMȃLыTՑ^ٖbߞjwvytܧsƏ`ÍehƤ짠vm|th]y]HtV?rP6uQ4rM0_>%\=%_?%_㮀}͕fљiƉXˆYQȇSя\ЊZޙhɊVvHhAi@f>dAizWbdFب}͕jĈX]ͶqSGƌYl=8 + oYqT<]A_Aa>pJuMyN~S|QwKUʏcYWxL~R{O}TcӯֽA.(8zH^[7"̶Ţ~O,nDϓcסwiȚvϡ}}]a>\3e|YuDǃQϋ[Ӑ[΋Uה^ߟhߡiߣmtxߦqКiКjckǭjVwV>zU7|X>eE/gE+X9vMΝl՞k֛f̐]LWT{O\}QT}KăSMÃPk@pFvPzUmKwVeFfGʗoәl۠tyRqN㼜־йʵǴiUH4#YB0fӢx}]cDsPuOzQ}R~PwKzOȓhQ~RUT{RnL•nױuK;1nӼڿǤ}XzTŽdϖfx鵇ǒjҠykzSeE}L.b;tDsAm<|LdžWё\͍VɉR֘_ۜcqxxszڡmңxÙtĶijhhQaE\>rM8tS7`?|UvL՛jՙeԕ]UW[ǕgϘl}Q{OŊ^͓aŅUq?ąRzLrGqI`>[>cFY>fHaZީ{ʒ`xS}V5ɞxɤտn~h\T@0_ǖmcjIlIySzQVZT{OzPT~RXUxOrNʘnڴn^x^P~۾἖m_ϝuȓhQːdĉ]ƛsȠǢŠ~вʫkTaۯɚq`BkGrMtKZX|L~PuLUxMTXxPrKđiԡzyܼĦ̭ͧpvKRuҔcΑcؤuXʘsĒmǗrVnB|MY2sDÅTƈWƇV~Mғ]Ԕ_̎Zΐ]lrxyܡks٣tӥ~ӱ϶ذwfFlHkG_=nHmGiCyOXіeГ_Ҕaʑ^ҙfܟmٟoΔcїgĉ]YV~R~R|PtEqGrIhvVgE,fE/yQ5f͘mVӘlZ\Ǣ~Ϯ|Φ޼~nQϤ|حНrfChCnH{PRŇVː^OvH|N~RTT~VqJǔl߬o޻߼ձѲаi|PŎ_ݣtۢt՜pݨ|zZǕpǕp͘oUWxJwIuGÅTВaɋZ„SąNБYܟkܞkڜeݟfry{ޣp䯁֪Χϴú忨wZnNnQnHuJoKaAeGqHŒ^Ȏ^ÈXŋZ֚g؜iʏcЖcʒfZ{TzOZɏ\Ȍaˆ_^9ˆ^ӛk`hJnI4V7#dA(|Wi[[Y\Ҧ׻ֲƞ|ڲrz\AjBb[iCjJ|V^Ŏ`[\]ˆWyIxMXXazOYΛo[̪߽ܳͤqkŏcʓeۣuȎ\ӡv՞r{[oMǚqǗjqG\}LR{IRϐXѐ\Д_ʋUǍZΓaӗerؚelwtx筁̰ݿɸóȾ}ktRoIzRUZiHxV4aAzOŒ^ŋZˆXݣrԛlҙjۡqÈZ~TZ}RȔcםlЖg{PƊZˎazMŌZȓguRiNR5\<'~^Zўu㰅aƓe̡z۷ӯqƝ{axV|[yR3mJc>tQYĎ_[TUZÉYOċ`Ya]zO~S{Wcѥ~ƚs۴忞ժǔiŎ`Ǒc՝q۠rⱉʗnhJkH̟v͡|vR}Q~NM†TjH}Qˎ]ϘdaWҕd̐^Α\ޡlޡiqvwyూ۷˻dX~UV}TjF_?eDlK|T\ÊXŋ[ЖfΙkۢuǐazNzSÏcőeƐ`VvISךhӗaPЕf̖j^]CV9#Q4[?wSjƕlΙn̛leХͧnxZzX`tSnN{O-iEX~SR}PyMnDzPRQwIP}Tcd~Se_֥~cҩ⹓ПuUǑeҜqסwŏf୆]vUŗrk͙pyNyK}POĉUĊZ~SY‰\қl^͓eלkԘdϑ]nlqtsܦrڨٺɼgW[SfAeDhEiGlIqK|PPʐ_ڠoќn̑eT{N_ǔh^[\ʎ]ʌ[̎]ޢm؜lÈZӝqghJW:&Q3qM2tSo^`Òf_ӧխbcGZl]\:hCxT}XVvKnCnDrIyOUÇXQ{L[Íae]d`ȕmZgǙsɕjXVЛq֣z̚s͜uqPjjʛ{ďgTVpDRҖaДbč^VǍ`ЙlϘkːdӘiכg՘d՗conmrt᫃קϵ˸ͭe`UlEa>kEtMfBgDiEyQUΕd͔cܧy|P}Q_Îa]|Ubآpܡm̎]ɋZovݢtϙmbwUY<(Q2b?%gIpRgjΝuÓiėrڲ_DdF_sLiHyN,nI}XhEbb=gAiDwOzPX̌ZR~N͑_ϙkɘl{Qďcʕi˗mfI_ŎbǓhʛrifcŕoḗҦѥ\̒aVzLnjW}Rʎ\͕gZTΗjΘjΔdȍ]Җfɍ]ѓaۛgۜgВ]ڝh˒c̛rѫͰƼɬ`YrPfDoKkFwLe?}X:lH,sO3lHTЙhő^YʓeƑfYƗtްՠtǒfWUƊZДdחesu؟nϚke^BkG+nK/nI-mMpN5aJ}^vQrUz[B{Z;kHd@zR3oHjH\;Q,T0U2[7iDe@rMvRsNyTXQʼnY}NPUdXeܦvɓf}UrMȎabn˟xdʙm֮ۮ֪ۯ^ݦw͒buEҒ_̏`ː_ǑeƐaa\Ιm՟nĎ\ЗcіbɋWٚeޞiݞlәgϔaÍ[Ϡ~ɭʿɹǦnyVqLvPtNoJa?{O1rL/hE)wS7qLɑ`Ζeʖd{NКl]a߲㷉̗k`zNďcڞnȌ]ϐ^ښe{xܧxnZ>uR6{X"sSpN5|YAmQlIeHkL4_?sLhKbBYiGe?yQiEdAeAmHgBxQsLiDrLWWVSΕczIףuϚlwLϜsǑdsLrN^_ȚxjƗnƔk⹒׬Ҧ׫~TQǍ]xGˏZV]e͜r~SĐcϛnZ֠n̒_؜hˍYӓ_ܜenЖbΒb\ȖlΨȳȤgtNyTqLsKrKZwR6`:gJ~W;yWA_ElPuYlO6kIoIqP6rWpM`:wOjDakJ4fL[ApRqS@yW@^@a@rN1vR7\>lCc!rK.oF~Mˏ^̐_ʔcסpџrcӢwҡvʝqܯǖn踋٤xǒf˗i̕dٟnިz緍߳ĖtmW8|R6yP4\@{V6sM3a?(gI6~[DgIbBgH/^?|WpIvQsTxPwMyRuPwRvRfApHnF~UXV_ȓgŐd˔fϗh[duQb^x[ѡ|֢zԠwڧ~Ⰸ꽗伕渕꺌~RʼnWΒ`Θj۩zץxӡtѝpϚnč_ˏ`Nj\ˏ\ӚgʏZޟg֘_ҒZߞflםibqŜ|ʪϿӽƭɩdqI_>a?V1Z3wM2oH-[:fD&tI'zR~NƊY؜kŒZ˚l^էwbÒgթ۬߬ᮁ֥yƖj˗kŠZߥs{ݰZʜw[lG)|S1[;Z9mF*_?)X:"Z=bHcApO:xS3`ʙm]ySW][}V_YS^Tčb[ebdȚo˖nҞuЛpvTњpbguXǚq䷌㸐淒迗΢~紅|Ď\Wנu`zפuբs̙j۩zϚl͕dΓ_ʋXәgNJUܜdߠgӓ[ۘ`gߤn͑agŬϻ̷ͣZvQX6`?];W4pJ/c?#_?#kG)a>oCOȍ[ƊXŽ\‘d̚lϝoe͛q乑ب}䱄ݪ}ԣx’fŔgӞmԛhעq滖ӤȚvrOkD'T3bAa@oF+T5eG/iKeIyU9eD)Y<]帑zXfnqĘpɘnϜqĔlԤ{ե{˛rӣ{˛spƛsĘpԨ٫繒ש~]Ȕj٪ndF˝w›鿛ϦΣ~ߪ|ߩxǒ`wKԝqƓiۣuئwئwެ}ќn՝lҖbʋXӘgΑ\ёZߡhۛcؕ]pܡkΒbējϫϵĮȷȡ}TpLc?fB~W6uO0mL/`?"\;iC#e>oAWnj[Pɔdȓf˗gȓfēh٪ګӤxڪݮెʛpܫ|ȓdϖg賄射ÞէhyVaBW8qOnLxN0Q3kJ1bFeIvV=cE-oTs[El\vZw˩մطֳԭ۴ڳݷܶڸԲ޼׵Χشǥ߸ڳ~V|WĕngkOʚvŝ뻐㺕Ӭڲ|Vՠr~ҝoY֡rfa籃ܨz䱂㱁٣qȌYԓb֘fٚgיc֘akܚemٝiЖgXѡ|ͻκǿӾw`e@`>_=}T4rN2eC'cB%eD'yQ0e;wIVƌ[zIҜn\\ќnΜrް٧|ݯۮ湎ը~ת̜p[ɏc췉䬀编˟xڰɝybrG'kHmJT5S5!bB(yY?xX>}[@\:$y]kP%rWDtϰػڽͱͱǪԷĬպڻѳͩ˪lUEzW}]ÑnvVpTʘu콗켐껐徚ʥϩ˝t֟rۦzɔh]ѝmզV٢u赆ףtڥwݬ|}Иeٛjטfޠmݠlԗampڛg؜hŠ[˗e˙tǾȽe[_>|U6cD}U5mH+uS7Y8gE(zR1c8VWOȏ_њl\أu˖hᮅث٦{ᴈޱ߲Уx߲֨\V굇ߨ|轗ت͟}a’p^>`=rO}R3[=(\@)jM7mQ;|V9^BsXĞ|K6*mZIs^PZG<|j]ʲʶƲȳ̷ʳzh[]J=l[rXG3%ze鼚ZjJĒp_aCޮÝǧɭЬiƘo̕h٤x]ǒhݩy㵎_Əb߬}ՠrΙkޭ~~֝jךgؚgq۞iڞhsޤnіbō^Z̙uҺǿb{VlK~Y6\;lI*{U2hF*c? sL+W4kCzM~RsFӝlˏ`ʔbΖdҞo߰اvУwޱתѤzΡwްТ{_Ìa~Қk缕͠wcfǙt}XlB hFU6U8$U8%cG0jJ5Y=gBZ<㽚:-# 70.TF8tbTn\NP?7F83 zgYȩȠpMtMc{\jPޯÝҷԷٵgПtӢwީ_ZݮⶊѤ|aӜk߮~ԟqۥtxtڡlܢpޥouqnmqӘdʔdÌ_Ēg̼ԹdwSiGyW8{S5kH*|V3mK0jF(yP-`:pFsGsH|P̑[ÆW̖dɑ_ڥvܯʙh֩|Уvڭ䷌ۮɜqԦ̛rÌaؤtءrԡrೌszUǙtk\:W5\>S6"`?*iI1fG1hM^:h@"Ԧ忠x\& uZPaUwXKwXL}^Qq[T q]Pŭ׶꺌dΙoe~_kRܴ꽗ǦӸ̤jǓr̜p֥zެ|RȓgృѤxܮƖiܤs깊ݨz՟nzxstttxsrݥnޣoʔd[^xv}_vQjHrJ'wO,rI,yO3rL-zU6vM*h@i?xKmBwIȑ\~MQŕf۩xϜmРt͠tթ|ڪ~깍ڭث庒ԤΜqئx٦vӠuةɝwY7p|wUqG%^=X=)yV=`?\A.];YdA&bメԠx|[=.  E3*|jl^tewh') g˦ٶЪ٠nҖk뵉fqRmTỜɳǥ}^jӡzcݪޫ_ћpڨwܮۭΟsܧxxޤrۡnܥury|쵃~糀zpߦoםlcemwʽ}_}WeCvN+}U2}T4zQ2{U6rM.zR/c=i@xKc:uHȑ\ɓaȒ`ԥvئuϛlΞtת}Фw浊Ѡu纏߲޴蹔Ǖkץw˗h٦|ԥ}ϣ}vUfԩguK)}R3Y8"b?&lLlGiC^jH_<ᬀѠpϝt}[qQ<,  oUK|f_k_jW) tbP˩ɨӯǞ᱅ÌbZ絊ୀőklNԧ徝Ѻ̧jʛx̚rפy䰆ޫĐiǐgԠq嵉ԣx㳉̘iy|Зd؞k|ݢos鵃{qٟi͓cϜqdoοd^oN\9jD#b?zS1]#mG&}V1_6c9nDyLǔa\ƒd\ΙkΜmԢsӢu٩{ޱث~թح߷ⵍب}㲆۫۫Ҡvbn}W9Q2iz\aC$pKƍ_ۥvءr汈Мrۨ{ݨ|Ξvெ⹒æ͸ūo[C51SD;C3.{pֻؽչȥ꼕ئ}纖ܪةƔk\ֳ˲q̢ϥ̝x^֡yzMНtƓjŽfʓgܩ|岅岄٧x굃ӝk٦qۦrՠlܣpwԝj鴀굁괁۠hަrÖkݴнǼȾ̶qh?rM+]< tO-uO1X6X6dB&zS1c;i>o@yKΙkVŐdΙkʕgcʗj˙lڧz௃ϣv溓޲ĝ٬٫岅޲޲֩ifeK\;lI3i\>[;zQČ_ĊYǓfԟrҜtbҠuϟxxQѤ~޸۽ǰѻpa/((QICϹϴۼڱƥ뿛ŢÛ콖žƝ븇ħ~yɟ{Щ΢|icǕfΛp͚oŔidݪ䲁䱅㱄ⳅؤqҜj뵃}ۢq՜gzӞmߩw}~ۣpءkܥjХ|ڷɭʶôȻʲ|[zQ1dD(P8#lL-X6M/Y<%U5pH'\4mCvH\U~R˖j\ƒdđdΛoȖiۨ|Ԥx߳ⷐ幒翙ԧޱୁ㶐ФҥmkmQwU,A+E3&\>%X;!G0>']@$gA uM)qDzPUzN]^VŽ_͘jҝoۧyݭȝu庒٭Ԩݵ帐ଂڪw輝ƛx޶npT~``@b@'fJplrhF}]Ɣgbԧ}ݴὝ¤۽DZXQKؾҺͭʧ㻓Ǟvjۣzಂѣyܭʟ~zlĞzoĖrɗtӢyݰڭgcԣyԤvܫ~鸋ެפwڨyΘj~屃yܤs{ܦt՟m관ߪvڨuSӠqӻù¹ȬmYKF2$;&* P5Z@(+ G*\8lG&sK'xKg>W}P\`X͙kZќnԠqԤw͢{ݱݱ뿘帐ک}ڭᷔ׭okY~`vWtQ6}fT|nƚxfΟ|ⶒܳ⹗⿞ܺéּ˺҃|wïԴȮǦ俚䵒۵ۯ껞ќpẒֺu›xp™spo“oڭۮ֩~Ϣwfץ}ܫ~٩{ం뼎ܮ䵅٧xۦx궅ݩw|zۥs٣ozYWĺȋ|r]I=C/#<(<(L1?*:$Q3eC$hF%qM)pEiJ6)A,"F.L05!K5R6P2aA#kJ(a:k@~SV~OX_ƒbҝoݨzԞmɜr㸎޳ݱ뿘꿘ొث֭ǝzh]iso_AkkR?{cKeDkHxWzSiŝzhܸͮ˰ɵ˼ÙǾ¨մ۲ڱ⼜鿛˨潙Ϣ{˜ttƥ¡ĢwŚvkէǕp޴ت幐̛p̙p㰃ⰃӢt峆涌ڥw٥vܧy䲃ܪ|~إqۦqywwP}WrZ௪zqZG9R>1H0$^A,K4'8!K1@(@(O4kI-pK&kFwMUSd]͙iՠrЛmb޴⸊֫~Ĝ溓߮巒ٰϣpjcвbCѱ[?)_F3_H,xZ>lvSqRj˜rʜtȫͲѺлȾ{Ϲ׮̣ͤȚtb{گr˫uurziѣ}̛u֨ݵ߲ܬ_ݩ߳ᴅ֤v軌ę۫|Κkڦxإw䲃ܪ|ެ|߬zӝm٣sݨsevS{YE{ȩzeTIYC5E.#I3"/@*C+8 +M3I-^A#iF%}V2yPV`^]ǔgўqΛnȘj߳۫|ᵉ軐軐䷊ơීҨˢ~rbßufLd]Et]\B+zcoxUnͣҥ伙ش§ŭ̼ĺ/&eUFѸèũߵ޸ڮӬƟv|uүjßiͨętϠyҥ~Ρvݰᴉۮ٨}֥z绎溍௄᱁䶍越ئy٦yݬ浊ுڧx䱀[ۧxףrңt[vZDl^žýtikVHZ@0<)' .@*A(B*H0B)N4fC"\8tK\wK}TŒeϝpҟrբu֧yڭఁ纐꽒꽒™辘׬ʡ{roqӱvUndrbIorXAiQuY_^Π{Ƞ}×rŞ|ոٽ;~8-%iYGīǮ侞㺘ݾѤ|{ͭѲktɤdṣ̌ϟwը~Ѥy㶋߲௄צz׫~߳깏㳃꽔ܫڧz˘lգw鸌㲄֣t~˗eʖfСro}]t[M~eZþtfeN;P:&?)"<, @(/G+O2:' O2]<xU5nCxOrGe`_f͜nک}ک~幌㶉꺏弔Ɯ߳ɠ{ǟzouͪkfbaEoqS8rZzdNkO4uP4{]>uM1W6^eͪԸŷνT?,:+ @0%.2#jWBʾнǮЧw}bCwR{tɯӸtp̥˜qu{ǜu̡yԨҥz湏ޱݱ஀ը}浊跌绎ೆМlzϟq幌Ⳇ۪}צwȖfc”jЩ{v_Iw_LzmxfXpXGN6)J5') -J2!* A(P38#M0\>$_?%d^C,cJ1eL8^<$c@&[;mE~^pȤ͵mgQ?k[NZJ>wg[scWO?2_M:nWF̹ܻϥÙxuaFnTy^yǥƦß~f˜sѫ^ğ}ʠz͡zʞwУxݰᵈ֣v߲ޭ䳈꾑㶉ʚl֥wԦy溍蹌㳅Ңs“e]kΪn]|qýÿsilVJD0)M7$3#' ;& E-D++ H/S7?&}Z6{QqH[X_bΠs۬զ{ܱ廐互ڭ鼑Ф~œxĜw|hszlyũuZpO7}^E{^FhK2rXA[A.:$S9%yS5eChpnmVC|gU|zl{jmWBjSֿش—uhsVzaKK2#hq{q{ƣenְljfӨm̟tҥzᴈ뾒ޮ㶊崉ݬ帋鼏ϡwϠt٩ఄ黍㴇զxeWZÎ}lwo¼όk[RE4,F.$*.& 3 ?'+ 8! O4'zY7sIkDYVaĘkɜq֩~ѣyⶌ纑ܯԧ|ԥ{ѥv›wyiƣ~qvƫgyW<`JnN7wW@rV=qU=C)>(B."U7!{V9f~\dqYt_{Ǹ}cu[tvu{^mWD1!_I;q[s[uà|plӪԮawԪͣ}ėl̟tҥzӦ{䷊ഇᰄդyҥx輏ۮcգzܫ㴆帋ΠqdxPkKo˰oeᯫvF2+F/" . & +H.6!:!- 3 A*6%nN4dvT9hF+wU;nL2bC'S3bB(wd{gƺŽͼƵ´νǼǿºİr]uVEclNwVc`tҫʠzśvө޴漘د֭Ѣ|ܰڮתΡvת}ŘkϢwת㸌׬ǜrh˞uf|ZkMeREcS@aE9I>6|wÃysl_UO=1>, ,&  /<(.  + % - Z?&mIsKb\enbǝw˜sˡ{mcկcfk™ubwU`BcE|Z=sR5kJ/pO4_=#X7iJ1oS?zŷǾȴ¸ӽ¸ùɷο÷Ļk\]C/rX~avXhjoѬĝxlԩ߹㻖խխۮڮ۰޴̞u٭Ĕghݳ׬Ө}ęnklepSfH\H9f\PcRHND;i_WЯ|uobXO=1D2&/-  :(!  + $  F2#dI-].yridVPWMDrg^ʝyjYNU@1I3%2 & :)!&   $ %\@"sP2mKwXZf~Yarsr^snt{Z_hd^>kLcGiH+gK^AlJ1Z8fD*aB*aF2s^kTBvjɽķò²´vdooZhv[FiN;oU@|^GiklqdӫϨ—tخ߷ġฑ޴֭㹑׮өڰحǜtǛt۰ҧ{ĞrvTitUrQvY@B4*yrj|rebYP|ohֹ}uk`NCVD9I7,:&(8( + %]E)sS8cCpS\wR}Yopkɟ{aq•oorQ~Zj|ZiJlNxT:hG*fIyW:lK1cB'kI/hI0U:&jN:oYGp^Qp^PweWtwbQviRBs]LxcNsr^biO:aF1T:&|^GyY?tjɠ~^gͥ}ˠ}⸔亖ģϤÜ֬Ḑ޴ٰӪҩ̡y—oȝrj`zXk|[+$01 - +   +   + :' M4cE+R9"iIuTjIaisoglhi\{[`ekIsVckMeJzYvT7mK/yX:|[>]A*J.rV@Q4B)6!VB3}jZt_P{lzgWrcs^Oyhw`Jo[Jtcw^JhTO8$uaNhPlN6eG/V@+eO=pX?gJ/dH/fJbHtWfaE.dIsX]CwU;}]hÛxilxTϧ֭ڳ彙ṕڱد志ٮݳʡyn`rjfyTkKqR?+H6*P=5B2&VI;ǸzpgYMD>.&5$<(!"  +  $ + Y>&;(G4"a@gHdGoNfšvipƜwaezVyVbrP}ZtRohJxYvWz[?dFjLcEZ>%K/iJ2S7B)5YG8J5%C1"E1!N6&`G5[D/R8$fH1jO:oU9oS:bF.kRAmUAeK4sT9pR7fHgM}]esZ~^Ez_pTdInQ}^vpizV̡ͣ{ڱ߹ܴᶋժ㿚ڮҩ~̧_yXng}]btTnNO:*UC7?2*VE>l[T~wn¼ɽvldM?48(/A/!'+  + $     +N3@-1 x\@vY=dGhG`lefq^]^\anK`buwYqQzZlQsTuWmNcG/U9!hH1S7B*>(N<.E0 :'3G/T<%U<"R7"Y?+aG1mT8T8 ]A(iQ9bI3pT>{\AwX>gJy^_ny[oO5|aqQtThI{\jĚvśv[cʡyѨڴṑ۰Хz۳۱ˢvsnLfFcfqP}]|WhL^H3Q?3A6.QE=YMEzp̯{]NGD4,4#4#H5&2&  !   +&E.7(H2cI2tX:fJ.rP^nbYg\]]zWaxTi[kc{[iL_{]}`y\cE+Z;$W:"U9!M2@)J6'W@.3 2 C,P7\?&cG1_D.Y=$`D+V:"dH/cI/\A)qU;_ClM3lNawXvrR_DevWekKkJ~\lmĘswSØnmҫ๑ڰɠvٯڳ̢yĞwgHfIjL^}`vVrTw\D\F3TB5C6.SI@{rl~ul´oc]SD=>0)I9,A1$E2#(    +  !/+4&S;(L6 s[<]@)yX9xXm_bc[cwTa]^dc_h_iNkz]egJsS9Z:%`D+_C*M0:#C/ U=+>&3 9"R8!W:!\?)Z>'X<$eI0N2aE,oS;hL3vY@dHlM3sUbgb~_fHda`wUeCuTae×oklgȠy⺓᷏ʠxФxỐ™pthJqSqY@}\hMkdIy^F]I9H6*eSHfXMWME{ȼj_YPD=?1)5%=,!@- "     +  +5#% O9%J7&bI.[A+y[>jJuVsRět]^`a]eaeh]chHpUt|]cpRtT9_>'cG0bF.N48 2 B+F.7 9 Y=&T7]@)dG.fJ1Y=$Q4nQ8pS;fI1cIlQuX>`CcdxXqsTzViaerOlJg[ebgbsرլpl۳ohjLx[-%;+">.$ + + +   0! +<, ! C05#[B(^F/uYhL3nSbletUh{Z~[`g\tPX^[^\i`׮լijөfgamPs[jLgLcEjS:I3&E1#K9/H91i[Nq^Rx|slmd]L>9F2*:)!7&9)'    %     2"-Q<&[C,uY'Q9#I1M3Y=&[@)S6nO4bF.]@(aB&|\AyYAsS<~cFfK.lQ7{[?}]ayZqRftTtQ^carM|RwT\{StPǤ{|W̤Ǥ|Ȥ|`ɟwigvUfu]DjPH9&kPV@)@-"@0#WF7RC8Q?3vxmd͍yqlg\SC5.E6/5)!."7(  "  $    +   ("M7#XB,hN2L7#x]DfJaqM_xT~Z^b˜pkdwUsQqRlQohlalQz[?Z>%iM4M5E,>%7T:$G-P5Z>%W<$T8 hI.T5rS8fD+~\CrR8rS8kOfJ0}\@~]@c|\lRqTnNrQnK{SdjhB\uOhboNytPp̫hkÝs^dBfsV@rUiO8YD1hO8\B/5%TA0D1#U>.Q@4vk]ѪXLCF70G81:/'+ ,  !        * &$P:'J8%]G/E0jN5{bHuT_a]{WfcocfzXyWqQ`Enlb}^lQtU9Z>&w[BK3I0B*D,[A)N3O4Z>%W<$Y=%aA&mM2uU:|[_DhLlP6zY<`D|\~^|^DqUdDqObAvR`˜rpJzV|VktOeF[^cljlj{YeGu[gJsZ?dM:^H5K7$U?,/<(:) N8*O=1dXJ߾h\W[PIH=7=2,:.$+  + +  +  + +! + +  +   K8&>+H4 [H1aJ.s[AhJnL^]Zi]ěub]ae}\qRkMoaB}^lQqQ6T8 dLE,J1E,K2aG0V;$Q5aE-_B*cD+vV9iG*{Z=~[=~[=wV9yX;gIrT;aCrSsStSgKlOrTz[`@oKfryVoK}YaoO|]?nN]sTd_fox\@vX;eJ/zaBkR=iQ@[C0J7'@0 ?1 ?.3";,"UC8fZPyoѷzsmrib[QJD;4B929+# "  +      5%J5&4 O<(]E,XA(w\@cD}[^_lhkhzU_luStUdFgsR3~_bGtU9aE,~bJE,S;%9! P8"eK4Y?'Z?'cG.iK3lL2kL.pO2xW:eGeFiLxV:vVrT6hKoOfvVz\iLiJz[~\mS9dL2s\B^D/;'1"8'8&<*>, L:1th`wmĒzrjtngRLETKFH=56( !  +   #  #*    + +- H3"( +?*ZC/S>)iR:rV9mM|[^jd^\`rPubB^iJdwV8bdGuU9mP6|_EG.E.P6 K2bH0aF.dI0iM3\>%tT:nN1lL/|\?aBpQbE`B\uV6{^AlLjuTdxY;pRrRgGc\{Wo~a>nIyXaI.dJ0jO8nP~aiS9t[?qPhLv]CdN8bG/I0S:$U?-U=)I4%A/$:)3$7&F2%YH>oaYph`Œ~vnfaYRLF<7?3+1"% !  +   +  $A,C/    " 8$6#L9(XB-R;'bH/eF`zWib~Y|XfvXv{[;zWyY}]bF]aDxY;kK0`E\A'D0[?'\@'eI0pT;dK/lP3nN3kK0qQ5iJ,vW9kKvWgHjKxU_?{_DgIdjH|Z}^@mReHvU8iFb|XjnQ3|\:oOeM5rX=Y?*|^}dKF2gP5mT6,(.& +   & +&. I5  +  +' - 2$N7#E.9)y]@yYoLn`ZkF`mMigGrPwW}]cH_lNqR4gG,wX<\A'WB-eI0Z>&w[CrV>\C'mQ4yY>vW;xY=kL.dF`mNkGzUtRgGuZ>jL{YmQgmN0gLcFvW;vV5|Wb[mT:rU#u[Fv\^H3;&[C-ZE/fP7aK6T=)E.C2"S9((B,M5'M4&bK<=+4#F6-^OFeWNչ{xd`WWNGME;1) . !     &5#%  "      + (H3!E/hS4eDuRcf|YwVdjJduRxYhHzYgIbiMrR7wX;aC\C&dJ4^B&iN2nR6|`D_D(jO2nP3yZ_DvV;~[pOpOrQwQlIdGmOyW`]kL,iP8hG|bE~_AsPyUlGfH^E2qT`K2T>'y_E_J2L;'J9(^G3D0>*E3%cO8?-S?.I4 =,!3$\C)X=,eM6M9-?/#G6*\J?uj\{tkǼ~|tnlkh_ZPJG:24&+ +% %    $ &   + +'        G4&B/ (K6cJ.vV}[btTrQ|YwW~^e`AkKtTgIvWjNyY>tU8vW:hO1`F/eJ-lQ4jO2}aEiM1sX;fI,|]@|]?}^CpQ6vU~aCsSuUuShHrTmOz[>e}cDaD*~eOyXt]AmR7tUtS{]uU8sW:\B+aF+gH+tV:eHlT4kR6V;!yY4G7,UE8qcVvmd뮮c\WND@?1)1&)+(" "     "  + "     +'1 ?,cF{_DgxWcDvWqPfI,y[=jL`CnPyZ>oOtT{`Ea@xY&YA*eJ.fH|_BaI0lR8lRhLiMxXsV;y]CsWVE=E5+D5(bREtl|rpke\UG=8?0).&#&1 2!1"  + )  + $! +#    $ /`I0qX=vWkMzZ;cCpSV;!rV:jNeKuU=}^CaCxYy]BbCnQ5x[@]D,_D)|^AlJfJ^G/J2R;&ZB(}aEeJnW?lU>s\EqX}bHpSzaAdK4fM4jN6iLZ?)gP7eJ4jPK9'x]D_H1>*w_EaI1aL5C0#( :&!?.!*6!" 8'6$E01E1!N9%H3$@+Q;)>(fL7^I:]LB<,$?0$^OCxpk뮮}wZUOB:29,&'&' 6&)  "   +%   +%#   +   )+ +H4!K4hI|^FmP3uZ:rX?_E+cH,fKlPcI/nQ6oR7vZkQwZ?`G,jP7_E,lQ5fJbD~bGW@)?+K6P9!iQ9x\Dw_JfM8[C-w`J~bI{bEu]@\D-jQ8]D.sX;VB/5 eLoT>qXFs[C]D09&`G0U<&V>() %)?+, +2"4";*:&E2#R;);'3 ZD2U<)A.I6$9'E2"_I7XE9;,$>0'QB9zs͂~~}t[VPD@76.'8,%/ 4$,-  $  + +%'  '1!  +'    +   + &6#3 S@)s[D[A'rX<^D*lR9U?&bL3gJdK1gK/qU9lPz\C|_D]F+O5dJ1oT7rV:jL/cHS?'7'>-O<(T@-nU?jPhO9lT>jVCt]G[G-t`F_H0fL3\E0S?*Q;(E0cIhO9jR?}eMR:&A.W>)F-K4% ++ @+% %7$-D3#-E-F0V;'D1VB5N8(bC+R<+F3!@/&)R?0O=1<.&=.%L>4gZTYRPA:43,&*-09'1%  #   % % +("  /2   + +   + + ( ) +-!P>'O9%W>%V@*H1dK4\D,qR^B*\C,|^EdKhN5dFV=&V?%oT6wZ:pV:Q9bFZE.5# ?-C0N;)K:'jQ`J5\E3[G7v]JP=*dM6lT&T=&fJ0tV;nT.M9,E4&F4&H6-?2*QICre[ΚWOJ\TNGA<));+:*6%+  ! +   +#% >,& + -!-       ! + G40!(?,B-O9&K6eL6F.tW>cM6`H/YA,O:#5$\E+oT9nS:Q;$^H4M:*I6#I7$N=)1 5'^K8J5"R<0R<+[D2YE3_F1]F4T=,gP:WB-N8 pZBVA-L9'dR)3M8%nU:@-$& +6%* ! <)A0I7'I6%H4ZC+]C0L5 ;*7"eL4T<0O8#P<(H5'K9+<, F6,@1(^WOuofᲲۇnh_mhd:1*0",-9) -*  '    +*<+,  $ 0!     +!  +  4$% )@.?-:(/O9#J5 Q;'^G/R>(K6"WC--Q=%`I0bK2pZA`L;=*M9(>,UE/<*@. RA-U>,M5(aJ:X@0M9'cK6bK8\E3dM9YC.bL5iS.\E5E1 gO:YC,_H3M7#YC0dM*L5"D15#?/ +1!2!V=-?,B/#C1"E2$<*V?,U=(hP;?+B.S:*eM6P9)<)G5)C2%=/$?/'H81[MFvkd}uoŝ=855'";,#1%4%3$'" $ & , & +( 4$  + +      + +    ) L9&5$2"* ;%M5#B/F3!O<+4"?.7$R@-I8"[K9-G7!G4"?/J:), G5#gP?`I9Q>,R?.?.`K7[E0Q:&O<*bN=YF5Q>-M:)F3":(@.E4#D2!8&>+D02 0"& 8(6#V@-N;)B. 7&@/!':'`I5R<([@+%N7&O7$XC2+8)2$>/'F70?0)C7/|oh~ysғmlh8.,)!9.(G6-1"*+*)$ +-+" ")! +"  %#       +    7&@,5&;'H4#- G5%=."G:):.;0 &@.<):+RC25(N:)gP?[C3YF4WD2E3"]G3O8$T=)bN=B/D1UA0C5%<.F6&0=,=,;(>*8$:(. <+!* 9&U?,L9&TB)3!E4&.* C+ZB4bH46&?,H4%M:+6&2"&<,$@1*D5.SJAcZQӘVRM1)$)"8/(2%5$5$,4#&04$1"! ,-'2$  +     +   +  '7&9'( ' 5%6&8):*4&)5(1!@/"B1%+1!E7)\K9eQ?aN,Q=,hT@H8&9(aP@3# *4$I4#9*=+C0 ?+E1%H5#, C1#D4$F2Q>.O<*L7#L;,8'0?-XF8G1 F3#>-D-!9(:+"4%6&=-$D8.KC=ZOFf[RnjdyxwUPM0)#=601(!1$6&1 +/+3"9'?, %))1#. 1"*          + & 8'   +2* + - :,/!5%4$H8+%/ 6(aO=]M=P@0Q>,TA/[I3\J4F3"H5#VB.?/:(?-- &3#I3"2#>,9%<(L9'@,E3%A/!9(J5&E2#L9)S>(>->-"2!@/G6(L9*8(2#I1%9)5&2#2"8(B5,^UPOHBngavo|yw\VSD=8KD>$=.#9),,0,8'J2"@, +" )-4%1# #         +  +1"#  5 1$5%  1"5%<, /!2%@4&U?0N?2K;-J7'Q>.P<)F6#9(3!:'* >/' 6'&7'4"E1"5$A/D1 >*>-;)G5%D2",I7'B-@+TA,B.!WG36#@,@,J6(M;.2!?)>-"2#)5&3%=2*@70bZUd_Y~tn}͝QLGYRL80+ 6'$ (2!,+>,@,0# 3%/ +,               +  +-& T?,%  4$  ! 8)8(*+2$H:.J7):*!B4I5&N:+H4"8(,) ;*& 6'+ 6' 8%E2"I7'0@.P<,:'H7'?.3!H6'2F5%B. C/"L:'@,8&>-7#C/">+ E2(8$E1#A-D3'(,. 6+%MB;G<6RLDzsvqk㨨jf`ga\*#%%#6%-:+!9'-/!  +*+.,%!0! +       +      -  S?-' +# +*(#,6'<- 3$M=2N>32#;+!@2D2"J6'G4!+ 7'6&1!%=.3$;+" 6$@.P=,@-D2$@-!M:(M<+6%6$9'E4(M<-A/%=+R?.>+9) C0$7$;(2"C4*4!J4'H2"S>06%,0!/#LB=YMGjd]zvo¿驪qontslQLH(&!$3#,A/#2 /..*" 3$.3$0   +      +     ! +     $  F5$*;+! 8-#! +:,"6&B3#$ J;/B1#E5)0 I9-G7*I8(A-K7%1"8).1!3#3#& C//!?+M9(UA0M8(:(9&L7)M:(4&?.1A1#G7)G3,=,M:*R?//":%2 -?-%8&;(M7(S;+L7*8'.4%5) SKD[PHd^Z}{tȬ|{tGB?%$ .#7&.B0$05#8&;)7%+( & ;,8( -  ! & ( & .    +  +1!'5#9)D4(($-. P@6>/9*"H8,>-D4'>."F6)4$C2%Q>(L8&2"2"+7'4%;+6&C.@2#G3!@-O9&\D0H3!,E/!Q>-7*B0":'2!/G3,I8*8$^J;>*I8)* + C0(3!=-#<*K4&F0$@/&2#1#0%RC8J?6[UQ~x}xȗG@;#"*A+ 6(0";)0*6&8(/")#  +,0  +( %2" +      +'   &       +  8* /"( +>0!L>/?/!#7, -MB5;+!L;,L;-=+XH,F3'R@./!I7'J9)>*/ 8*"H6+>+D6(7(VA4& 6#7&6%8&5$H4&3#I6*8)"5' .%>4,H:4LH@sje \ No newline at end of file diff --git a/examples/app_mobilenetv2/obtain_and_optimize_mobilenetv2.py b/examples/app_mobilenetv2/obtain_and_optimize_mobilenetv2.py new file mode 100644 index 000000000..7a17cd46a --- /dev/null +++ b/examples/app_mobilenetv2/obtain_and_optimize_mobilenetv2.py @@ -0,0 +1,94 @@ +from xmos_ai_tools import xformer +from xmos_ai_tools.xinterpreters import TFLMHostInterpreter +from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2 +from save_mobilenet import save_quantized_mobilenet +import numpy as np + +HEIGHT, WIDTH, CHANNELS = 160, 160, 3 +TFLITE_MODEL_PATH = "mobilenetv2.tflite" +OPT_MODEL_PATH = "src/model.tflite" +OPT_PARAMS_PATH = "src/model_flash.params" +NAMING_PREFIX = "model_" +ALPHA_VALUE = 1.0 + +############################################### +# Creating and converting a MobileNetV2 model # +############################################### + +# Obtain MobileNetV2 model +def get_mobilenetv2(): + model = MobileNetV2( + input_shape=(HEIGHT, WIDTH, CHANNELS), + alpha=ALPHA_VALUE, + weights="imagenet", + ) + save_quantized_mobilenet(model, TFLITE_MODEL_PATH, (HEIGHT, WIDTH)) + +# Quantize the model to int8 and save + +# Convert the model to XCore optimized TFLite via xformer: +# There are various ways to configure the compiler to optimize the model, +# operator splitting isn't documented yet. This configuration works well for +# MobileNetV2, reach out if you need assistance with other complex models + +def optimize_mobilenetv2(): + xformer.convert( + TFLITE_MODEL_PATH, + OPT_MODEL_PATH, + [ + ("xcore-weights-file", OPT_PARAMS_PATH), + ("xcore-thread-count", "5"), + ("xcore-naming-prefix", NAMING_PREFIX), + ("xcore-op-split-tensor-arena", "True"), + ("xcore-op-split-top-op", "0"), + ("xcore-op-split-bottom-op", "10"), + ("xcore-op-split-num-splits", "7"), + ("xcore-conv-err-threshold", "3"), + ], + ) + + # Generate flash binary + xformer.generate_flash( + output_file="xcore_flash_binary.out", + model_files=[OPT_MODEL_PATH], + param_files=[OPT_PARAMS_PATH], + ) + + return xformer.tensor_arena_size() + + +if __name__ == "__main__": + ####################################################################### + # Running the model on xcore host interpreter with sample input image # + ####################################################################### + get_mobilenetv2() + optimize_mobilenetv2() + + # Sample image of a lion (ImageNet class 291) + with open("lion.bin", "rb") as f: + data = f.read() + + input_array = np.frombuffer(data, dtype=np.uint8) + # input image values are in the range 0 to 255 + # we subtract 128 to change to -128 to 127 for int8 + input_array = (input_array - 128).astype(np.int8) + + + interpreter = TFLMHostInterpreter() + interpreter.set_model(model_path=OPT_MODEL_PATH, params_path=OPT_PARAMS_PATH) + interpreter.allocate_tensors() + + # Interpreter.get_input_details and interpreter.get_output_details + # return a list for each input/output in the model + # MobileNetV2 only has a single input and output, so we unwrap it + (input_details,) = interpreter.get_input_details() + (output_details,) = interpreter.get_output_details() + + input_data = input_array.astype(input_details["dtype"]) + input_data = np.reshape(input_data, input_details["shape"]) + interpreter.set_tensor(input_details["index"], input_data) + + # Inference + interpreter.invoke() + detections = interpreter.get_tensor(output_details["index"]) + print(f"Inferred imagenet class = {detections.argmax()}") diff --git a/examples/app_mobilenetv2/save_mobilenet.py b/examples/app_mobilenetv2/save_mobilenet.py new file mode 100644 index 000000000..7200fedb0 --- /dev/null +++ b/examples/app_mobilenetv2/save_mobilenet.py @@ -0,0 +1,32 @@ +import tensorflow as tf + + +def save_quantized_mobilenet(model: tf.keras.Model, model_path: str, size: tuple): + converter = tf.lite.TFLiteConverter.from_keras_model(model) + converter.optimizations = [tf.lite.Optimize.DEFAULT] + + # Use a representative dataset generator for accurate activation quantization + rep_ds = tf.data.Dataset.list_files("image_samples/*.jpg") + + def representative_dataset_gen(): + for image_path in rep_ds: + img = tf.io.read_file(image_path) + img = tf.io.decode_image(img, channels=3) + img = tf.image.convert_image_dtype(img, tf.float32) + resized_img = tf.image.resize(img, size) + resized_img = resized_img[tf.newaxis, :] + yield [resized_img] + + converter.representative_dataset = representative_dataset_gen + converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] + converter.inference_input_type = tf.int8 + converter.inference_output_type = tf.int8 + tflite_model = converter.convert() + with open(model_path, "wb") as f: + f.write(tflite_model) + print("Model quantized and saved successfully.") + + +if __name__ == "__main__": + model = tf.keras.applications.MobileNetV2(input_shape=(160, 160, 3), alpha=1.0, weights="imagenet") + save_quantized_mobilenet(model, "src/model.tflite", (160, 160)) diff --git a/examples/app_mobilenetv2/src/config.xscope b/examples/app_mobilenetv2/src/config.xscope new file mode 100644 index 000000000..f79e64115 --- /dev/null +++ b/examples/app_mobilenetv2/src/config.xscope @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/app_mobilenetv2/src/lion.h b/examples/app_mobilenetv2/src/lion.h new file mode 100644 index 000000000..b05d9686b --- /dev/null +++ b/examples/app_mobilenetv2/src/lion.h @@ -0,0 +1 @@ +#define LION_IMAGE { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf6, 0xf6, 0xf6, 0xfb, 0xfb, 0xf9, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xed, 0xed, 0xed, 0xf7, 0xf8, 0xf5, 0xfe, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf8, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xf8, 0xf8, 0xf7, 0xfb, 0xfb, 0xfa, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xfe, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xf1, 0xf1, 0xf0, 0xf4, 0xf4, 0xf2, 0xfe, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfa, 0xf9, 0xf9, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfb, 0xfa, 0xfa, 0xf9, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf9, 0xf9, 0xf9, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfa, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb, 0xf9, 0xfb, 0xfb, 0xf9, 0xf4, 0xf4, 0xf2, 0xfe, 0xfe, 0xfc, 0xfa, 0xfa, 0xf8, 0xf8, 0xf8, 0xf6, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf8, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfc, 0xfb, 0xfc, 0xf9, 0xee, 0xef, 0xed, 0xf0, 0xf1, 0xee, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfa, 0xfc, 0xfc, 0xfa, 0xf6, 0xf5, 0xf1, 0xf6, 0xf4, 0xf1, 0xf1, 0xf1, 0xef, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xfa, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xf8, 0xf1, 0xf1, 0xef, 0xf8, 0xf8, 0xf6, 0xf8, 0xf8, 0xf6, 0xee, 0xee, 0xec, 0xf5, 0xf5, 0xf3, 0xfb, 0xfb, 0xfb, 0xfe, 0xfe, 0xfe, 0xf8, 0xf8, 0xf8, 0xf9, 0xf8, 0xf8, 0xfc, 0xfc, 0xfb, 0xf9, 0xf9, 0xf7, 0xe8, 0xe9, 0xe6, 0xee, 0xee, 0xec, 0xfc, 0xfc, 0xfa, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfb, 0xfb, 0xf9, 0xf6, 0xf6, 0xf4, 0xf6, 0xf4, 0xf1, 0xe8, 0xe7, 0xe3, 0xf7, 0xf7, 0xf5, 0xfd, 0xfd, 0xfb, 0xf9, 0xf9, 0xf8, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xf8, 0xf8, 0xf8, 0xfb, 0xfb, 0xfb, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xf8, 0xf9, 0xf9, 0xf7, 0xfb, 0xfb, 0xf9, 0xf7, 0xf7, 0xf5, 0xf4, 0xf4, 0xf2, 0xf4, 0xf4, 0xf2, 0xf8, 0xf9, 0xf7, 0xed, 0xed, 0xeb, 0xeb, 0xeb, 0xe9, 0xec, 0xec, 0xea, 0xe4, 0xe2, 0xdf, 0xf1, 0xef, 0xec, 0xf4, 0xf3, 0xf1, 0xfb, 0xfb, 0xf9, 0xf5, 0xf5, 0xf3, 0xf4, 0xf5, 0xf2, 0xf7, 0xf8, 0xf6, 0xf0, 0xf1, 0xef, 0xe4, 0xe4, 0xe2, 0xed, 0xed, 0xeb, 0xf9, 0xf9, 0xf7, 0xfa, 0xfb, 0xf9, 0xf8, 0xf8, 0xf6, 0xfb, 0xfc, 0xf9, 0xf8, 0xf9, 0xf6, 0xfc, 0xfd, 0xfb, 0xfb, 0xfb, 0xf9, 0xf8, 0xfa, 0xf5, 0xee, 0xf0, 0xeb, 0xeb, 0xed, 0xe7, 0xdf, 0xd5, 0xce, 0xf9, 0xf9, 0xf7, 0xf0, 0xf0, 0xee, 0xfc, 0xfa, 0xf9, 0xfd, 0xfc, 0xfa, 0xf9, 0xf7, 0xf4, 0xf8, 0xf6, 0xf3, 0xf6, 0xf6, 0xf3, 0xfd, 0xfd, 0xfb, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xf9, 0xf5, 0xf5, 0xf3, 0xed, 0xed, 0xeb, 0xfb, 0xfb, 0xf9, 0xed, 0xed, 0xeb, 0xe0, 0xe0, 0xde, 0xf8, 0xf8, 0xf6, 0xee, 0xee, 0xec, 0xe1, 0xe2, 0xe0, 0xe3, 0xe4, 0xe2, 0xe8, 0xe7, 0xe4, 0xcb, 0xc9, 0xc6, 0xeb, 0xeb, 0xe8, 0xf6, 0xf6, 0xf4, 0xf5, 0xf6, 0xf4, 0xe8, 0xe8, 0xe6, 0xf1, 0xf2, 0xf0, 0xe4, 0xe5, 0xe2, 0xe3, 0xe4, 0xe2, 0xe4, 0xe4, 0xe2, 0xf2, 0xf2, 0xf0, 0xf7, 0xf7, 0xf5, 0xf4, 0xf4, 0xf2, 0xf4, 0xf5, 0xf3, 0xf5, 0xf5, 0xf3, 0xfd, 0xfd, 0xfb, 0xf9, 0xfa, 0xf8, 0xf1, 0xed, 0xea, 0xe7, 0xe3, 0xe1, 0xd4, 0xcb, 0xc3, 0xf1, 0xef, 0xe9, 0xf2, 0xf2, 0xf0, 0xf7, 0xf7, 0xf5, 0xec, 0xeb, 0xe9, 0xf4, 0xf2, 0xf1, 0xf4, 0xf2, 0xef, 0xf1, 0xf0, 0xec, 0xf6, 0xf5, 0xf3, 0xf6, 0xf6, 0xf4, 0xf8, 0xf8, 0xf6, 0xf5, 0xf6, 0xf2, 0xf5, 0xf6, 0xf2, 0xf9, 0xf9, 0xf9, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xfe, 0xfc, 0xfd, 0xfe, 0xfc, 0xfd, 0xfd, 0xfc, 0xfd, 0xfd, 0xfb, 0xfd, 0xfd, 0xfb, 0xfe, 0xfe, 0xfd, 0xfd, 0xfe, 0xfc, 0xfc, 0xfd, 0xfb, 0xfc, 0xfc, 0xfa, 0xfb, 0xfc, 0xfa, 0xf9, 0xf9, 0xf7, 0xfc, 0xfc, 0xfa, 0xfe, 0xfe, 0xfc, 0xf9, 0xf8, 0xf9, 0xf9, 0xf7, 0xf9, 0xee, 0xed, 0xec, 0xed, 0xec, 0xea, 0xf3, 0xf4, 0xf0, 0xea, 0xeb, 0xe7, 0xde, 0xdd, 0xda, 0xe9, 0xe8, 0xe5, 0xe4, 0xe0, 0xdd, 0xd7, 0xd3, 0xd1, 0xdc, 0xda, 0xd7, 0xc5, 0xc0, 0xbb, 0xb4, 0xb1, 0xac, 0xf0, 0xef, 0xee, 0xea, 0xea, 0xe7, 0xde, 0xdd, 0xd7, 0xde, 0xde, 0xd7, 0xdf, 0xdc, 0xd7, 0xd0, 0xcc, 0xc7, 0xe5, 0xe4, 0xe1, 0xf4, 0xf3, 0xf0, 0xf4, 0xf3, 0xf0, 0xf2, 0xf1, 0xee, 0xed, 0xef, 0xec, 0xf0, 0xf2, 0xf0, 0xf8, 0xf8, 0xf8, 0xf4, 0xf7, 0xf3, 0xdc, 0xda, 0xd6, 0xcd, 0xc4, 0xbd, 0xd4, 0xcd, 0xc5, 0xf8, 0xfb, 0xfa, 0xde, 0xde, 0xd7, 0xf5, 0xf4, 0xee, 0xee, 0xeb, 0xe7, 0xee, 0xeb, 0xe7, 0xea, 0xe5, 0xe0, 0xe7, 0xe3, 0xdd, 0xf3, 0xf2, 0xed, 0xee, 0xed, 0xea, 0xe9, 0xe8, 0xe5, 0xed, 0xec, 0xe8, 0xf8, 0xf7, 0xf3, 0xfc, 0xfc, 0xfb, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xf9, 0xfe, 0xfe, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfb, 0xfa, 0xfa, 0xfc, 0xfc, 0xfa, 0xf7, 0xf8, 0xf6, 0xf5, 0xf5, 0xf3, 0xf2, 0xf2, 0xf0, 0xf4, 0xf5, 0xf3, 0xfa, 0xfa, 0xf8, 0xfb, 0xfc, 0xf9, 0xfb, 0xfb, 0xf9, 0xfa, 0xfb, 0xf8, 0xfa, 0xfb, 0xf8, 0xf7, 0xf7, 0xf5, 0xf2, 0xf3, 0xf0, 0xf8, 0xf8, 0xf6, 0xf4, 0xf2, 0xf1, 0xf5, 0xf3, 0xf2, 0xf0, 0xef, 0xed, 0xe2, 0xe1, 0xdf, 0xe9, 0xea, 0xe5, 0xe8, 0xe8, 0xe4, 0xd8, 0xd6, 0xd3, 0xd8, 0xd7, 0xd3, 0xc6, 0xc1, 0xbe, 0xd5, 0xcf, 0xcd, 0xb3, 0xb1, 0xae, 0xbb, 0xb4, 0xaf, 0xad, 0xa6, 0x9f, 0xd2, 0xcf, 0xcc, 0xed, 0xeb, 0xe7, 0xc8, 0xc5, 0xbe, 0xd3, 0xd1, 0xca, 0xd3, 0xcf, 0xc8, 0xc3, 0xbd, 0xb8, 0xdd, 0xdc, 0xd8, 0xe5, 0xe4, 0xe0, 0xf1, 0xef, 0xec, 0xea, 0xe9, 0xe6, 0xe7, 0xe6, 0xe2, 0xee, 0xed, 0xea, 0xf1, 0xf1, 0xef, 0xee, 0xea, 0xe5, 0xc2, 0xba, 0xb1, 0xca, 0xc1, 0xb8, 0xe9, 0xe4, 0xdd, 0xe7, 0xe5, 0xe1, 0xdf, 0xdc, 0xd5, 0xde, 0xdb, 0xd4, 0xe5, 0xdf, 0xd8, 0xd5, 0xcf, 0xc8, 0xd3, 0xcc, 0xc6, 0xec, 0xe7, 0xe1, 0xe8, 0xe7, 0xe2, 0xe7, 0xe6, 0xe2, 0xf2, 0xf0, 0xed, 0xf1, 0xf0, 0xed, 0xef, 0xee, 0xeb, 0xea, 0xea, 0xe8, 0xf2, 0xf2, 0xf0, 0xfa, 0xfb, 0xf9, 0xfc, 0xfc, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfb, 0xfb, 0xf7, 0xf7, 0xf6, 0xf0, 0xf0, 0xee, 0xec, 0xec, 0xea, 0xe6, 0xe6, 0xe3, 0xe5, 0xe5, 0xe2, 0xdc, 0xdb, 0xd8, 0xe8, 0xe6, 0xe4, 0xea, 0xe9, 0xe7, 0xec, 0xec, 0xea, 0xf2, 0xf2, 0xf0, 0xf2, 0xf2, 0xef, 0xed, 0xed, 0xea, 0xf2, 0xf2, 0xef, 0xe2, 0xe2, 0xe0, 0xe7, 0xe6, 0xe1, 0xda, 0xd9, 0xd4, 0xe7, 0xe5, 0xe3, 0xd0, 0xce, 0xcb, 0xdb, 0xdb, 0xd6, 0xdc, 0xdc, 0xd8, 0xd4, 0xd2, 0xce, 0xbf, 0xbd, 0xb8, 0xa9, 0xa4, 0xa1, 0xbc, 0xb6, 0xb3, 0xaf, 0xad, 0xa8, 0xc2, 0xbb, 0xb6, 0x84, 0x7a, 0x71, 0xa3, 0x9b, 0x95, 0xd9, 0xd3, 0xcf, 0xc5, 0xbf, 0xb9, 0xc7, 0xc2, 0xbc, 0xc5, 0xc1, 0xba, 0xb9, 0xb3, 0xad, 0xd6, 0xd4, 0xd0, 0xcf, 0xce, 0xca, 0xe7, 0xe5, 0xe2, 0xe5, 0xe3, 0xe0, 0xd0, 0xca, 0xc4, 0xe3, 0xde, 0xd8, 0xe5, 0xe6, 0xdf, 0xd7, 0xce, 0xc5, 0xa8, 0x99, 0x8b, 0xd7, 0xcf, 0xc5, 0xe6, 0xe1, 0xdc, 0xc7, 0xbe, 0xb5, 0xe0, 0xda, 0xd6, 0xc3, 0xbb, 0xb4, 0xd7, 0xcd, 0xc2, 0xd1, 0xc9, 0xbe, 0xe0, 0xd8, 0xd1, 0xda, 0xd5, 0xcd, 0xdc, 0xdb, 0xd5, 0xe3, 0xe2, 0xde, 0xde, 0xdc, 0xda, 0xe0, 0xde, 0xdb, 0xee, 0xed, 0xe9, 0xfc, 0xfd, 0xfb, 0xfb, 0xfc, 0xfa, 0xfe, 0xfe, 0xfc, 0xfe, 0xfe, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xfa, 0xf8, 0xf0, 0xf1, 0xef, 0xf2, 0xf0, 0xee, 0xe4, 0xe2, 0xe1, 0xde, 0xdc, 0xd9, 0xe5, 0xe4, 0xe0, 0xe1, 0xdf, 0xda, 0xd4, 0xd2, 0xcd, 0xe2, 0xde, 0xd8, 0xde, 0xd7, 0xd1, 0xdd, 0xd8, 0xd2, 0xea, 0xe8, 0xe3, 0xe5, 0xe4, 0xde, 0xe6, 0xe5, 0xe0, 0xda, 0xd9, 0xd4, 0xe8, 0xe5, 0xe0, 0xe5, 0xe2, 0xdd, 0xce, 0xc9, 0xc5, 0xc8, 0xc3, 0xbf, 0xd0, 0xc9, 0xc3, 0xd5, 0xd0, 0xca, 0xb9, 0xae, 0xa7, 0xda, 0xd9, 0xd3, 0xc8, 0xc4, 0xbf, 0x9d, 0x95, 0x8b, 0xc3, 0xbe, 0xb6, 0xa5, 0x9d, 0x96, 0x90, 0x87, 0x7d, 0xb3, 0xaa, 0xa5, 0x6f, 0x63, 0x59, 0x87, 0x7e, 0x77, 0xb0, 0xa7, 0xa2, 0xbc, 0xb5, 0xb0, 0xb5, 0xb0, 0xa9, 0xb3, 0xad, 0xa5, 0xb6, 0xaf, 0xa8, 0xca, 0xc4, 0xbe, 0xbf, 0xbf, 0xb7, 0xd7, 0xd1, 0xcd, 0xda, 0xd4, 0xcf, 0xbb, 0xb1, 0xa8, 0xd0, 0xc9, 0xc3, 0xca, 0xc4, 0xbb, 0xb5, 0xac, 0xa0, 0x9e, 0x8e, 0x84, 0xd7, 0xd0, 0xc8, 0xd3, 0xcd, 0xc5, 0xc0, 0xb3, 0xa6, 0xdd, 0xd4, 0xcd, 0xc6, 0xb6, 0xaa, 0xcc, 0xbf, 0xb0, 0xc4, 0xba, 0xaf, 0xca, 0xbf, 0xb6, 0xd9, 0xd0, 0xc7, 0xd3, 0xc8, 0xbf, 0xd1, 0xc7, 0xc0, 0xda, 0xd9, 0xd4, 0xea, 0xe8, 0xe5, 0xf6, 0xf5, 0xf2, 0xf0, 0xf0, 0xee, 0xfc, 0xfc, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfa, 0xfa, 0xfa, 0xf7, 0xf8, 0xf5, 0xf5, 0xf5, 0xf3, 0xf0, 0xee, 0xed, 0xe5, 0xe3, 0xe2, 0xe3, 0xe1, 0xde, 0xd8, 0xd6, 0xd3, 0xd8, 0xd4, 0xcd, 0xcc, 0xc5, 0xbe, 0xcf, 0xc8, 0xc2, 0xc5, 0xbe, 0xb8, 0xc9, 0xc2, 0xbc, 0xce, 0xc8, 0xc1, 0xd1, 0xcb, 0xc3, 0xcc, 0xc6, 0xbf, 0xc6, 0xc0, 0xb9, 0xbe, 0xb2, 0xad, 0xc6, 0xbb, 0xb5, 0xd6, 0xcd, 0xc7, 0xc8, 0xc0, 0xb9, 0xb6, 0xa4, 0x98, 0xc5, 0xbb, 0xb7, 0xae, 0x9e, 0x94, 0xa9, 0x9b, 0x95, 0xb9, 0xb0, 0xad, 0x95, 0x88, 0x80, 0x9d, 0x90, 0x85, 0x9d, 0x8b, 0x82, 0x87, 0x7a, 0x6b, 0x8a, 0x7c, 0x76, 0x75, 0x67, 0x5e, 0x77, 0x64, 0x5b, 0x95, 0x84, 0x7a, 0xb4, 0xaa, 0xa1, 0x9f, 0x95, 0x8b, 0x9e, 0x93, 0x88, 0xa9, 0x9e, 0x93, 0xbc, 0xb2, 0xa9, 0xc7, 0xc1, 0xb7, 0xcf, 0xc4, 0xbc, 0xa9, 0x9d, 0x96, 0xbc, 0xac, 0xa0, 0xbc, 0xb1, 0xa9, 0xb2, 0xa4, 0x9a, 0x9b, 0x8a, 0x7b, 0xa7, 0x91, 0x84, 0xcf, 0xc3, 0xb8, 0xc6, 0xb8, 0xaa, 0xbe, 0xb0, 0xa2, 0xbb, 0xa7, 0x96, 0xca, 0xb4, 0xa3, 0xc5, 0xb3, 0xa3, 0xc4, 0xb6, 0xa7, 0xc9, 0xb9, 0xad, 0xc4, 0xb7, 0xaa, 0xc5, 0xbc, 0xb2, 0xe1, 0xda, 0xd6, 0xe6, 0xe4, 0xe1, 0xe9, 0xe8, 0xe4, 0xf4, 0xf3, 0xef, 0xfa, 0xfa, 0xf8, 0xfa, 0xfa, 0xf8, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xfa, 0xf9, 0xf9, 0xf7, 0xf7, 0xf8, 0xf6, 0xf6, 0xf5, 0xf3, 0xf0, 0xef, 0xed, 0xf0, 0xef, 0xeb, 0xf0, 0xef, 0xeb, 0xed, 0xe7, 0xe7, 0xe0, 0xda, 0xd7, 0xd0, 0xca, 0xc6, 0xc9, 0xbe, 0xb7, 0xb9, 0xa9, 0x9e, 0xc0, 0xad, 0xa1, 0xc4, 0xaf, 0xa4, 0xb0, 0xa4, 0x99, 0xb2, 0x9f, 0x97, 0xbb, 0xac, 0xa2, 0xb4, 0xaf, 0xa5, 0xa5, 0x93, 0x85, 0x9f, 0x89, 0x78, 0xaf, 0x9c, 0x8b, 0xc7, 0xb8, 0xac, 0xaa, 0x96, 0x8a, 0xa7, 0x8d, 0x7b, 0xad, 0x9e, 0x94, 0x8f, 0x7c, 0x6f, 0x91, 0x84, 0x7a, 0x88, 0x81, 0x76, 0x68, 0x54, 0x4c, 0x79, 0x6b, 0x61, 0x6e, 0x57, 0x4b, 0x66, 0x51, 0x48, 0x67, 0x55, 0x4b, 0x6d, 0x58, 0x4b, 0x80, 0x6d, 0x60, 0x94, 0x83, 0x77, 0x90, 0x7f, 0x74, 0x8d, 0x78, 0x6f, 0x9f, 0x8d, 0x7f, 0xaa, 0x98, 0x8d, 0xbb, 0xb7, 0xab, 0xc2, 0xb1, 0xa5, 0xa9, 0x9e, 0x91, 0xb8, 0xa7, 0x95, 0xba, 0xb1, 0xa6, 0xa5, 0x92, 0x82, 0x8f, 0x7c, 0x6c, 0xb1, 0x9f, 0x8c, 0xb4, 0xa1, 0x8f, 0xbe, 0xab, 0x9d, 0xb3, 0x9c, 0x8d, 0xad, 0x8b, 0x72, 0xbb, 0x9c, 0x88, 0xa1, 0x88, 0x79, 0xbc, 0xa3, 0x8d, 0xbb, 0xa5, 0x91, 0xcd, 0xc1, 0xb7, 0xda, 0xd4, 0xcf, 0xdf, 0xd9, 0xd4, 0xe9, 0xe3, 0xdf, 0xec, 0xe8, 0xe5, 0xef, 0xeb, 0xe8, 0xee, 0xee, 0xe9, 0xf9, 0xf8, 0xf4, 0xf6, 0xf3, 0xf0, 0xeb, 0xe9, 0xe6, 0xe8, 0xe6, 0xdf, 0xef, 0xed, 0xe6, 0xf5, 0xf4, 0xf2, 0xfa, 0xf9, 0xf7, 0xfd, 0xfd, 0xfb, 0xfe, 0xff, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xf9, 0xf4, 0xf4, 0xf2, 0xf5, 0xf3, 0xf1, 0xf8, 0xf6, 0xf4, 0xf6, 0xf5, 0xf1, 0xf0, 0xee, 0xeb, 0xf0, 0xea, 0xea, 0xd3, 0xce, 0xc9, 0xac, 0xa2, 0x9b, 0xa3, 0x98, 0x92, 0x9c, 0x8f, 0x87, 0xa8, 0x90, 0x82, 0xaa, 0x89, 0x71, 0xad, 0x8b, 0x74, 0x99, 0x84, 0x72, 0xa7, 0x94, 0x82, 0xab, 0x97, 0x8a, 0xd1, 0xc3, 0xb8, 0x92, 0x80, 0x72, 0x81, 0x64, 0x51, 0x9e, 0x7e, 0x69, 0xaa, 0x94, 0x85, 0x8e, 0x6f, 0x5b, 0x88, 0x6b, 0x57, 0x72, 0x63, 0x5a, 0x96, 0x87, 0x7e, 0x88, 0x78, 0x6f, 0x75, 0x64, 0x57, 0x4c, 0x38, 0x2d, 0x6a, 0x52, 0x47, 0x4e, 0x3a, 0x30, 0x60, 0x4e, 0x45, 0x5b, 0x46, 0x39, 0x77, 0x5d, 0x4a, 0x88, 0x6f, 0x5d, 0x72, 0x60, 0x55, 0x77, 0x65, 0x57, 0x87, 0x67, 0x54, 0x91, 0x79, 0x67, 0x9f, 0x8d, 0x7d, 0xa7, 0x90, 0x7b, 0xaf, 0x9a, 0x8f, 0xa8, 0x8a, 0x73, 0xa3, 0x8e, 0x80, 0x92, 0x7b, 0x69, 0x7d, 0x66, 0x54, 0xa6, 0x8b, 0x78, 0x91, 0x76, 0x63, 0x9f, 0x82, 0x74, 0xa1, 0x82, 0x6a, 0x9d, 0x7b, 0x62, 0x9a, 0x7c, 0x68, 0x98, 0x7a, 0x68, 0xab, 0x8b, 0x6f, 0xba, 0xae, 0x9d, 0xcb, 0xc4, 0xb8, 0xca, 0xc2, 0xb9, 0xe0, 0xd7, 0xcf, 0xd2, 0xc9, 0xc3, 0xe3, 0xdb, 0xd6, 0xe2, 0xda, 0xd5, 0xe7, 0xdd, 0xd8, 0xdb, 0xd2, 0xcd, 0xc7, 0xbd, 0xb4, 0xe6, 0xdb, 0xd3, 0xf0, 0xec, 0xe5, 0xe8, 0xe4, 0xdd, 0xee, 0xec, 0xeb, 0xfa, 0xf8, 0xf6, 0xfb, 0xfc, 0xf9, 0xfd, 0xfd, 0xfb, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf6, 0xf2, 0xf2, 0xf0, 0xe8, 0xe7, 0xe4, 0xe6, 0xe5, 0xe2, 0xe9, 0xe8, 0xe5, 0xdf, 0xdf, 0xdd, 0xe1, 0xde, 0xdb, 0xde, 0xd6, 0xcf, 0xe0, 0xda, 0xd5, 0xdb, 0xd6, 0xd0, 0xde, 0xda, 0xd4, 0xd2, 0xcc, 0xc6, 0xc2, 0xbc, 0xb5, 0x9e, 0x90, 0x86, 0x88, 0x6e, 0x5f, 0x91, 0x73, 0x60, 0x94, 0x73, 0x55, 0x94, 0x78, 0x67, 0x92, 0x74, 0x63, 0x94, 0x7d, 0x6c, 0x96, 0x7d, 0x6c, 0x81, 0x68, 0x56, 0x74, 0x54, 0x43, 0x92, 0x72, 0x59, 0x8f, 0x72, 0x60, 0x76, 0x5d, 0x4b, 0x66, 0x4e, 0x3d, 0x63, 0x4c, 0x40, 0x5c, 0x46, 0x3d, 0x6f, 0x5d, 0x50, 0x48, 0x37, 0x2f, 0x57, 0x3f, 0x36, 0x3a, 0x28, 0x21, 0x40, 0x30, 0x29, 0x4f, 0x3d, 0x36, 0x55, 0x40, 0x35, 0x70, 0x55, 0x45, 0x74, 0x5a, 0x4a, 0x66, 0x53, 0x47, 0x79, 0x5b, 0x44, 0x76, 0x5a, 0x43, 0x84, 0x66, 0x4f, 0xa3, 0x86, 0x73, 0x9d, 0x82, 0x6e, 0x93, 0x6f, 0x57, 0x8e, 0x70, 0x5d, 0x79, 0x5f, 0x4a, 0x8b, 0x6d, 0x56, 0x96, 0x74, 0x5e, 0x74, 0x57, 0x45, 0x82, 0x67, 0x55, 0x97, 0x71, 0x56, 0x8f, 0x6e, 0x56, 0x75, 0x5a, 0x44, 0x90, 0x75, 0x5d, 0xa4, 0x90, 0x83, 0xc1, 0xb4, 0xa4, 0xb0, 0xa1, 0x92, 0xc0, 0xb4, 0xa7, 0xd0, 0xc3, 0xbd, 0xba, 0xa9, 0x9c, 0xb3, 0xa1, 0x96, 0xb3, 0xa5, 0x9c, 0xad, 0x98, 0x8b, 0xc0, 0xad, 0xa4, 0xbc, 0xa9, 0x9e, 0xcf, 0xbf, 0xb6, 0xd9, 0xcd, 0xc5, 0xe2, 0xda, 0xd4, 0xf1, 0xec, 0xea, 0xed, 0xec, 0xe9, 0xf5, 0xf5, 0xf3, 0xf6, 0xf8, 0xf5, 0xf8, 0xf8, 0xf6, 0xfb, 0xfb, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xf7, 0xf7, 0xf5, 0xed, 0xed, 0xeb, 0xef, 0xed, 0xea, 0xe5, 0xe4, 0xe0, 0xd9, 0xd2, 0xca, 0xcc, 0xc0, 0xb6, 0xd5, 0xd0, 0xcc, 0xcc, 0xc6, 0xc1, 0xca, 0xbc, 0xb6, 0xce, 0xbf, 0xb8, 0xbf, 0xb2, 0xa8, 0xb4, 0xa6, 0x9c, 0xa9, 0x9b, 0x8f, 0xad, 0x9f, 0x92, 0xaf, 0x9f, 0x93, 0x9f, 0x87, 0x76, 0xa2, 0x75, 0x53, 0x91, 0x6c, 0x4d, 0x7d, 0x61, 0x4b, 0x86, 0x69, 0x56, 0x87, 0x6a, 0x57, 0x6e, 0x57, 0x46, 0x5e, 0x45, 0x35, 0x6d, 0x50, 0x39, 0x73, 0x51, 0x3c, 0x70, 0x54, 0x41, 0x66, 0x49, 0x36, 0x59, 0x40, 0x2f, 0x49, 0x33, 0x26, 0x4e, 0x37, 0x29, 0x3c, 0x2b, 0x20, 0x53, 0x39, 0x2a, 0x3b, 0x28, 0x1e, 0x3d, 0x2d, 0x27, 0x39, 0x29, 0x22, 0x3f, 0x2c, 0x23, 0x55, 0x3e, 0x31, 0x62, 0x49, 0x3a, 0x51, 0x3d, 0x31, 0x6b, 0x4f, 0x3b, 0x6d, 0x50, 0x3b, 0x79, 0x59, 0x40, 0x7f, 0x60, 0x4b, 0x7d, 0x5f, 0x49, 0x89, 0x65, 0x49, 0x79, 0x5a, 0x42, 0x6b, 0x4f, 0x3b, 0x85, 0x66, 0x4e, 0x78, 0x58, 0x44, 0x72, 0x53, 0x40, 0x8a, 0x69, 0x53, 0x8e, 0x65, 0x48, 0x7f, 0x61, 0x4a, 0x88, 0x65, 0x4a, 0x8a, 0x6c, 0x55, 0x9e, 0x89, 0x79, 0xa2, 0x8d, 0x82, 0xbc, 0xa6, 0x94, 0xa0, 0x8b, 0x76, 0x8d, 0x74, 0x63, 0x96, 0x7c, 0x6b, 0x9e, 0x85, 0x76, 0x9c, 0x83, 0x72, 0x93, 0x78, 0x66, 0xa4, 0x8d, 0x7e, 0xb4, 0x9e, 0x91, 0xb4, 0xa2, 0x97, 0xc2, 0xb6, 0xad, 0xd2, 0xca, 0xc4, 0xe0, 0xd7, 0xd3, 0xe9, 0xe5, 0xdf, 0xea, 0xe5, 0xe3, 0xf1, 0xf2, 0xee, 0xf9, 0xfa, 0xf8, 0xf9, 0xf9, 0xf7, 0xf9, 0xf9, 0xf9, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf5, 0xf5, 0xf5, 0xf3, 0xf3, 0xf1, 0xf1, 0xf0, 0xee, 0xe7, 0xe6, 0xe3, 0xea, 0xe9, 0xe5, 0xdd, 0xdb, 0xd7, 0xca, 0xc0, 0xb5, 0xac, 0x9a, 0x8b, 0xbf, 0xb0, 0xa5, 0xcd, 0xc0, 0xb4, 0xbe, 0xb1, 0xa5, 0xa0, 0x8e, 0x80, 0x94, 0x80, 0x71, 0x80, 0x6e, 0x64, 0x82, 0x6f, 0x61, 0x93, 0x7d, 0x6b, 0x92, 0x7c, 0x6d, 0x88, 0x66, 0x54, 0x97, 0x6f, 0x56, 0x83, 0x58, 0x3c, 0x76, 0x56, 0x3f, 0x78, 0x58, 0x41, 0x7a, 0x57, 0x40, 0x71, 0x54, 0x3c, 0x6b, 0x50, 0x3b, 0x6c, 0x48, 0x2f, 0x68, 0x47, 0x30, 0x61, 0x41, 0x2b, 0x58, 0x3e, 0x29, 0x49, 0x34, 0x23, 0x41, 0x29, 0x19, 0x32, 0x1c, 0x0e, 0x56, 0x3b, 0x23, 0x38, 0x21, 0x15, 0x31, 0x1f, 0x18, 0x33, 0x22, 0x1b, 0x37, 0x26, 0x21, 0x49, 0x35, 0x2c, 0x5b, 0x42, 0x33, 0x44, 0x2f, 0x22, 0x56, 0x3a, 0x2c, 0x66, 0x49, 0x33, 0x5e, 0x3f, 0x27, 0x82, 0x5f, 0x46, 0x63, 0x42, 0x29, 0x83, 0x5f, 0x41, 0x70, 0x51, 0x35, 0x63, 0x47, 0x32, 0x72, 0x54, 0x3c, 0x66, 0x49, 0x38, 0x7d, 0x5b, 0x45, 0x7a, 0x5c, 0x48, 0x79, 0x5b, 0x49, 0x74, 0x55, 0x3d, 0x8e, 0x64, 0x43, 0x88, 0x67, 0x51, 0x87, 0x6e, 0x57, 0x92, 0x78, 0x65, 0x85, 0x68, 0x56, 0x6e, 0x52, 0x45, 0x89, 0x6e, 0x5c, 0x88, 0x6a, 0x5e, 0x8a, 0x6d, 0x58, 0x86, 0x67, 0x53, 0xa3, 0x90, 0x84, 0xad, 0x9c, 0x93, 0xb0, 0x9a, 0x8c, 0xaf, 0x9b, 0x8e, 0xae, 0x98, 0x86, 0xc6, 0xb3, 0xa4, 0xd2, 0xc7, 0xc1, 0xdb, 0xd2, 0xcb, 0xe9, 0xe1, 0xdb, 0xf4, 0xf2, 0xeb, 0xf5, 0xf5, 0xf3, 0xf6, 0xf6, 0xf4, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xfa, 0xf9, 0xf9, 0xf9, 0xf9, 0xf8, 0xf6, 0xe9, 0xe5, 0xe0, 0xe0, 0xd9, 0xd3, 0xd6, 0xcc, 0xc4, 0xd7, 0xca, 0xc0, 0xc5, 0xb8, 0xaa, 0xb7, 0xa5, 0x98, 0xa7, 0x8c, 0x7c, 0x81, 0x69, 0x5a, 0x96, 0x7f, 0x6f, 0x8c, 0x76, 0x64, 0x80, 0x68, 0x5b, 0x5f, 0x49, 0x3f, 0x6b, 0x54, 0x46, 0x5e, 0x46, 0x36, 0x4f, 0x3b, 0x2c, 0x63, 0x4f, 0x3c, 0x68, 0x4a, 0x34, 0x99, 0x70, 0x50, 0x75, 0x51, 0x3a, 0x74, 0x50, 0x38, 0x72, 0x50, 0x39, 0x67, 0x4a, 0x35, 0x77, 0x56, 0x3b, 0x6c, 0x4a, 0x30, 0x6c, 0x4a, 0x2e, 0x55, 0x38, 0x21, 0x5d, 0x3e, 0x26, 0x44, 0x2e, 0x1e, 0x3c, 0x29, 0x1f, 0x43, 0x2c, 0x1a, 0x41, 0x29, 0x15, 0x46, 0x30, 0x1f, 0x33, 0x21, 0x11, 0x2d, 0x1b, 0x13, 0x2d, 0x1d, 0x1c, 0x43, 0x31, 0x25, 0x57, 0x3c, 0x2d, 0x69, 0x4c, 0x37, 0x48, 0x32, 0x21, 0x5c, 0x3c, 0x22, 0x4f, 0x36, 0x23, 0x7b, 0x57, 0x3c, 0x61, 0x42, 0x2a, 0x70, 0x4b, 0x2e, 0x72, 0x50, 0x37, 0x65, 0x48, 0x30, 0x6c, 0x4f, 0x3d, 0x5e, 0x41, 0x2e, 0x74, 0x56, 0x42, 0x85, 0x62, 0x48, 0x70, 0x4e, 0x3b, 0x90, 0x66, 0x45, 0x93, 0x6a, 0x49, 0x8c, 0x69, 0x4b, 0x71, 0x52, 0x3a, 0x75, 0x58, 0x42, 0x74, 0x58, 0x41, 0x7e, 0x60, 0x49, 0x7a, 0x59, 0x43, 0x85, 0x65, 0x4e, 0xb0, 0x96, 0x82, 0x86, 0x72, 0x63, 0x82, 0x67, 0x58, 0x92, 0x77, 0x6b, 0x9e, 0x7f, 0x6b, 0xa8, 0x8a, 0x78, 0xdc, 0xce, 0xc4, 0xe3, 0xdb, 0xd4, 0xde, 0xd3, 0xcc, 0xe6, 0xe0, 0xd8, 0xf2, 0xef, 0xe5, 0xeb, 0xec, 0xe5, 0xf7, 0xf5, 0xf4, 0xff, 0xfe, 0xfd, 0xfc, 0xfc, 0xfa, 0xfe, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf5, 0xf6, 0xf4, 0xee, 0xe9, 0xe4, 0xde, 0xd5, 0xce, 0xcf, 0xc2, 0xb8, 0xb4, 0xa1, 0x90, 0xb1, 0x94, 0x83, 0xaa, 0x8a, 0x77, 0x99, 0x7b, 0x61, 0x83, 0x64, 0x4e, 0x72, 0x53, 0x3d, 0x6d, 0x4e, 0x37, 0x6e, 0x4e, 0x3b, 0x62, 0x46, 0x35, 0x5f, 0x44, 0x2f, 0x62, 0x47, 0x30, 0x4e, 0x35, 0x25, 0x4c, 0x33, 0x25, 0x58, 0x3c, 0x29, 0x6f, 0x4f, 0x38, 0x84, 0x5c, 0x3d, 0x7c, 0x54, 0x35, 0x75, 0x4d, 0x30, 0x6c, 0x48, 0x2f, 0x76, 0x51, 0x33, 0x6b, 0x45, 0x28, 0x70, 0x4a, 0x2c, 0x6b, 0x49, 0x2e, 0x5b, 0x3b, 0x25, 0x42, 0x2d, 0x1c, 0x45, 0x2d, 0x25, 0x52, 0x35, 0x24, 0x32, 0x1f, 0x10, 0x46, 0x2e, 0x1d, 0x3e, 0x28, 0x17, 0x1f, 0x13, 0x08, 0x28, 0x1a, 0x14, 0x3a, 0x28, 0x1b, 0x39, 0x26, 0x1e, 0x6d, 0x4c, 0x36, 0x3f, 0x28, 0x1a, 0x68, 0x48, 0x2f, 0x50, 0x37, 0x23, 0x67, 0x43, 0x28, 0x61, 0x42, 0x29, 0x7a, 0x54, 0x38, 0x6b, 0x4a, 0x30, 0x62, 0x45, 0x2d, 0x61, 0x44, 0x32, 0x68, 0x4a, 0x37, 0x68, 0x4a, 0x36, 0x75, 0x52, 0x3b, 0x7a, 0x53, 0x33, 0x97, 0x65, 0x3e, 0x91, 0x68, 0x48, 0x82, 0x5b, 0x3f, 0x74, 0x51, 0x35, 0x6c, 0x4b, 0x30, 0x72, 0x51, 0x37, 0x69, 0x49, 0x2f, 0x73, 0x53, 0x3a, 0x7c, 0x5f, 0x48, 0x75, 0x5c, 0x4a, 0x78, 0x60, 0x4e, 0x7f, 0x63, 0x53, 0x86, 0x64, 0x4c, 0xa8, 0x82, 0x66, 0xc3, 0xaf, 0xa2, 0xd6, 0xc6, 0xb9, 0xd9, 0xce, 0xc6, 0xe0, 0xd7, 0xd0, 0xe0, 0xd7, 0xd0, 0xd7, 0xc9, 0xbf, 0xe5, 0xdb, 0xd4, 0xf5, 0xf3, 0xf2, 0xfa, 0xf8, 0xf7, 0xf8, 0xf9, 0xf7, 0xfa, 0xfa, 0xf8, 0xfb, 0xfb, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfa, 0xfa, 0xfa, 0xf8, 0xf6, 0xf4, 0xfb, 0xf9, 0xf8, 0xf2, 0xf1, 0xed, 0xe3, 0xe1, 0xde, 0xc5, 0xb9, 0xb4, 0xaf, 0x94, 0x83, 0x9d, 0x72, 0x5c, 0x95, 0x6e, 0x4c, 0x85, 0x5b, 0x40, 0x72, 0x52, 0x39, 0x65, 0x44, 0x2f, 0x57, 0x39, 0x27, 0x56, 0x3a, 0x27, 0x56, 0x3a, 0x24, 0x59, 0x3d, 0x27, 0x45, 0x2c, 0x1c, 0x34, 0x23, 0x18, 0x3c, 0x25, 0x16, 0x51, 0x36, 0x24, 0x6b, 0x48, 0x2d, 0x98, 0x62, 0x3f, 0x84, 0x55, 0x31, 0x86, 0x5d, 0x3d, 0x7e, 0x52, 0x32, 0x7a, 0x53, 0x32, 0x6f, 0x4c, 0x2e, 0x72, 0x4a, 0x2d, 0x5f, 0x3e, 0x24, 0x42, 0x29, 0x16, 0x4f, 0x39, 0x26, 0x44, 0x29, 0x15, 0x45, 0x2e, 0x1c, 0x41, 0x2b, 0x1a, 0x3f, 0x25, 0x11, 0x20, 0x14, 0x0a, 0x1c, 0x13, 0x0f, 0x33, 0x22, 0x19, 0x39, 0x25, 0x17, 0x5e, 0x45, 0x33, 0x59, 0x3c, 0x25, 0x66, 0x49, 0x32, 0x5e, 0x40, 0x1f, 0x62, 0x42, 0x27, 0x6e, 0x4a, 0x2c, 0x74, 0x50, 0x30, 0x72, 0x4b, 0x2f, 0x64, 0x47, 0x30, 0x65, 0x48, 0x32, 0x70, 0x50, 0x3a, 0x67, 0x48, 0x33, 0x8e, 0x65, 0x44, 0xa0, 0x6d, 0x42, 0x95, 0x69, 0x43, 0x92, 0x6a, 0x45, 0x75, 0x55, 0x3b, 0x8b, 0x60, 0x3e, 0x6b, 0x47, 0x2b, 0x61, 0x43, 0x2b, 0x5b, 0x3f, 0x29, 0x6b, 0x49, 0x31, 0x70, 0x4b, 0x32, 0x5c, 0x3e, 0x26, 0x62, 0x4a, 0x37, 0x72, 0x52, 0x39, 0x8a, 0x6a, 0x51, 0xb0, 0x90, 0x79, 0xc2, 0xa6, 0x8d, 0xd3, 0xb9, 0xa8, 0xd7, 0xc0, 0xb4, 0xd0, 0xb9, 0xaa, 0xd1, 0xbf, 0xad, 0xdc, 0xcd, 0xc5, 0xe7, 0xe5, 0xdb, 0xe9, 0xe5, 0xde, 0xf0, 0xeb, 0xe5, 0xf1, 0xec, 0xe6, 0xf6, 0xf4, 0xf2, 0xfc, 0xfc, 0xfa, 0xfd, 0xfd, 0xfb, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfb, 0xf9, 0xf8, 0xf4, 0xf3, 0xf1, 0xe5, 0xe4, 0xe0, 0xe1, 0xe0, 0xdd, 0xda, 0xd6, 0xd1, 0xbf, 0xb4, 0xab, 0xb8, 0xa1, 0x8d, 0x9d, 0x77, 0x5e, 0x8b, 0x61, 0x47, 0x74, 0x4e, 0x31, 0x5d, 0x3d, 0x27, 0x4a, 0x2f, 0x21, 0x46, 0x2b, 0x1c, 0x47, 0x2a, 0x1a, 0x4f, 0x33, 0x21, 0x47, 0x2b, 0x17, 0x49, 0x2f, 0x1f, 0x38, 0x22, 0x13, 0x44, 0x2a, 0x18, 0x52, 0x36, 0x1f, 0x7a, 0x52, 0x38, 0x8d, 0x5e, 0x3a, 0x8a, 0x59, 0x32, 0x8c, 0x5d, 0x3b, 0x75, 0x4a, 0x26, 0x73, 0x4c, 0x2f, 0x75, 0x50, 0x32, 0x6d, 0x47, 0x28, 0x54, 0x36, 0x1f, 0x60, 0x48, 0x2c, 0x5a, 0x3c, 0x26, 0x55, 0x38, 0x25, 0x45, 0x2b, 0x17, 0x5c, 0x3d, 0x24, 0x57, 0x3a, 0x23, 0x1b, 0x10, 0x09, 0x28, 0x18, 0x0e, 0x42, 0x2e, 0x20, 0x4e, 0x36, 0x23, 0x64, 0x46, 0x2f, 0x4a, 0x2e, 0x15, 0x58, 0x38, 0x1d, 0x6d, 0x4a, 0x2c, 0x7c, 0x55, 0x33, 0x75, 0x4c, 0x2b, 0x6a, 0x47, 0x30, 0x6d, 0x4c, 0x32, 0x80, 0x5f, 0x45, 0x69, 0x4a, 0x31, 0x83, 0x5d, 0x3e, 0x9a, 0x69, 0x42, 0xa4, 0x72, 0x46, 0x8f, 0x65, 0x3f, 0x7e, 0x57, 0x36, 0x9e, 0x6c, 0x45, 0x71, 0x4c, 0x2f, 0x6d, 0x49, 0x2d, 0x72, 0x4f, 0x34, 0x64, 0x42, 0x28, 0x65, 0x43, 0x2b, 0x50, 0x31, 0x1e, 0x5c, 0x3c, 0x23, 0x7e, 0x56, 0x36, 0x96, 0x69, 0x46, 0xa2, 0x76, 0x52, 0xb4, 0x84, 0x60, 0xca, 0xa0, 0x7a, 0xd6, 0xba, 0x9c, 0xce, 0xa3, 0x88, 0xc7, 0xa7, 0x8a, 0xd4, 0xbc, 0xac, 0xe1, 0xd4, 0xc9, 0xdd, 0xd2, 0xc5, 0xe3, 0xd9, 0xcf, 0xdd, 0xd3, 0xc8, 0xe8, 0xe3, 0xdd, 0xf7, 0xf6, 0xf2, 0xfd, 0xfd, 0xfb, 0xfe, 0xfe, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfc, 0xfd, 0xfb, 0xfd, 0xfd, 0xfb, 0xfd, 0xfd, 0xfc, 0xfa, 0xfa, 0xf8, 0xfd, 0xf8, 0xf8, 0xf5, 0xf1, 0xf1, 0xed, 0xec, 0xeb, 0xe7, 0xe2, 0xde, 0xe2, 0xdd, 0xda, 0xdb, 0xd8, 0xd2, 0xd8, 0xd2, 0xcc, 0xdd, 0xd7, 0xd0, 0xdf, 0xd4, 0xcb, 0xb0, 0x9b, 0x8e, 0x90, 0x6e, 0x59, 0x8f, 0x5e, 0x39, 0x79, 0x50, 0x31, 0x64, 0x40, 0x25, 0x49, 0x2f, 0x1a, 0x3d, 0x25, 0x17, 0x42, 0x2b, 0x1d, 0x4a, 0x34, 0x26, 0x4f, 0x39, 0x29, 0x51, 0x36, 0x21, 0x53, 0x32, 0x19, 0x55, 0x38, 0x21, 0x54, 0x36, 0x1e, 0x7e, 0x54, 0x33, 0x99, 0x65, 0x3c, 0x94, 0x64, 0x3a, 0x8f, 0x5f, 0x37, 0x80, 0x54, 0x32, 0x73, 0x4d, 0x2d, 0x6e, 0x48, 0x2a, 0x67, 0x43, 0x27, 0x5c, 0x3c, 0x23, 0x57, 0x3a, 0x22, 0x60, 0x3f, 0x28, 0x57, 0x36, 0x23, 0x61, 0x41, 0x26, 0x7f, 0x52, 0x32, 0x42, 0x2b, 0x18, 0x22, 0x13, 0x0a, 0x33, 0x1d, 0x11, 0x64, 0x44, 0x2b, 0x79, 0x58, 0x3a, 0x62, 0x45, 0x2b, 0x57, 0x39, 0x20, 0x7e, 0x55, 0x34, 0x7a, 0x4f, 0x2e, 0x85, 0x59, 0x37, 0x75, 0x50, 0x36, 0x7a, 0x59, 0x39, 0x78, 0x56, 0x3d, 0x72, 0x54, 0x39, 0x8f, 0x62, 0x3c, 0xb0, 0x77, 0x4b, 0xbb, 0x86, 0x5b, 0xa3, 0x71, 0x4a, 0x9b, 0x69, 0x42, 0x92, 0x65, 0x41, 0x81, 0x58, 0x38, 0x7e, 0x58, 0x38, 0x66, 0x43, 0x27, 0x6c, 0x49, 0x2e, 0x66, 0x41, 0x25, 0x73, 0x4d, 0x2e, 0x7f, 0x54, 0x31, 0x97, 0x67, 0x45, 0x9b, 0x69, 0x3d, 0xa3, 0x70, 0x4b, 0xb8, 0x84, 0x5e, 0xc8, 0x93, 0x6b, 0xc8, 0x90, 0x62, 0xd0, 0x9d, 0x75, 0xd2, 0xb5, 0xa0, 0xd4, 0xbd, 0xb0, 0xd4, 0xbb, 0xa6, 0xdc, 0xcd, 0xc1, 0xe6, 0xe1, 0xdc, 0xf0, 0xee, 0xe5, 0xf8, 0xf5, 0xf1, 0xf1, 0xf0, 0xed, 0xf2, 0xf2, 0xf0, 0xfa, 0xfa, 0xf8, 0xfe, 0xfe, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfa, 0xf9, 0xfa, 0xf8, 0xf4, 0xf4, 0xf2, 0xf2, 0xf2, 0xf0, 0xe9, 0xe3, 0xe1, 0xe8, 0xe3, 0xe1, 0xe2, 0xde, 0xda, 0xdc, 0xd3, 0xcc, 0xd7, 0xc4, 0xbf, 0xce, 0xb8, 0xab, 0xcd, 0xba, 0xad, 0xcb, 0xb9, 0xac, 0xd2, 0xbb, 0xac, 0xb6, 0x9f, 0x90, 0xae, 0x95, 0x85, 0x95, 0x69, 0x4a, 0x93, 0x60, 0x3c, 0x7b, 0x4e, 0x2c, 0x6e, 0x48, 0x2b, 0x4f, 0x2d, 0x19, 0x4f, 0x31, 0x21, 0x55, 0x39, 0x26, 0x57, 0x3b, 0x27, 0x5a, 0x3d, 0x26, 0x5c, 0x3b, 0x20, 0x61, 0x40, 0x26, 0x59, 0x38, 0x1e, 0x57, 0x37, 0x1e, 0x67, 0x43, 0x26, 0x88, 0x59, 0x2f, 0xa1, 0x69, 0x3f, 0x9b, 0x68, 0x3f, 0x85, 0x57, 0x33, 0x79, 0x4f, 0x2e, 0x77, 0x50, 0x31, 0x71, 0x4d, 0x30, 0x60, 0x41, 0x28, 0x57, 0x36, 0x19, 0x59, 0x37, 0x21, 0x65, 0x43, 0x28, 0x78, 0x4c, 0x2b, 0x67, 0x46, 0x29, 0x3d, 0x28, 0x17, 0x46, 0x2d, 0x1d, 0x6c, 0x4a, 0x30, 0x89, 0x5f, 0x3a, 0x70, 0x50, 0x34, 0x67, 0x47, 0x2b, 0x82, 0x55, 0x32, 0x91, 0x64, 0x40, 0x82, 0x58, 0x34, 0x93, 0x6a, 0x46, 0x7e, 0x57, 0x35, 0x83, 0x5c, 0x3a, 0x97, 0x6c, 0x47, 0xa5, 0x72, 0x46, 0xc0, 0x86, 0x56, 0xb3, 0x7e, 0x51, 0xb8, 0x84, 0x56, 0xa4, 0x71, 0x48, 0x85, 0x57, 0x32, 0x92, 0x64, 0x40, 0x80, 0x56, 0x31, 0x7b, 0x52, 0x31, 0x74, 0x4b, 0x2c, 0x83, 0x57, 0x34, 0x8c, 0x5e, 0x37, 0xa1, 0x6f, 0x47, 0x9f, 0x68, 0x41, 0xa8, 0x71, 0x44, 0xad, 0x76, 0x4b, 0xb8, 0x7e, 0x4d, 0xc3, 0x85, 0x51, 0xcb, 0x90, 0x62, 0xd7, 0xab, 0x89, 0xcd, 0xa3, 0x7d, 0xca, 0x9e, 0x77, 0xd1, 0xb7, 0xa3, 0xdc, 0xcb, 0xbd, 0xe3, 0xd3, 0xc9, 0xe5, 0xde, 0xd6, 0xea, 0xe9, 0xe5, 0xf5, 0xf3, 0xf0, 0xf3, 0xf3, 0xf1, 0xfb, 0xfc, 0xfa, 0xfe, 0xfe, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfb, 0xfc, 0xfa, 0xf7, 0xf7, 0xf5, 0xee, 0xee, 0xec, 0xef, 0xea, 0xe4, 0xe7, 0xe1, 0xdb, 0xe1, 0xd8, 0xd0, 0xd8, 0xc9, 0xbd, 0xce, 0xba, 0xac, 0xbc, 0xa0, 0x86, 0xc4, 0x98, 0x74, 0xc8, 0x9b, 0x78, 0xc4, 0x94, 0x71, 0xaa, 0x80, 0x62, 0xa5, 0x75, 0x53, 0x98, 0x6c, 0x4d, 0x9b, 0x61, 0x39, 0x96, 0x5c, 0x36, 0x88, 0x54, 0x2e, 0x79, 0x4e, 0x30, 0x61, 0x3c, 0x26, 0x62, 0x3f, 0x27, 0x65, 0x43, 0x2b, 0x64, 0x44, 0x2a, 0x72, 0x4c, 0x2f, 0x6a, 0x46, 0x2a, 0x77, 0x53, 0x36, 0x57, 0x36, 0x1c, 0x52, 0x33, 0x1a, 0x5e, 0x39, 0x1e, 0x87, 0x55, 0x33, 0xab, 0x71, 0x44, 0x9b, 0x66, 0x3d, 0x97, 0x67, 0x41, 0x7b, 0x53, 0x34, 0x63, 0x3c, 0x1d, 0x6c, 0x49, 0x2d, 0x69, 0x46, 0x26, 0x6a, 0x48, 0x2c, 0x69, 0x44, 0x29, 0x6d, 0x47, 0x24, 0x7a, 0x50, 0x2d, 0x5a, 0x3d, 0x23, 0x50, 0x33, 0x1f, 0x6a, 0x49, 0x2e, 0x9d, 0x6d, 0x43, 0x78, 0x54, 0x34, 0x6c, 0x49, 0x28, 0x9c, 0x6b, 0x43, 0x91, 0x61, 0x3a, 0x90, 0x68, 0x43, 0x9f, 0x72, 0x47, 0x9d, 0x6f, 0x4b, 0xad, 0x7f, 0x54, 0xc4, 0x8b, 0x5c, 0xc0, 0x86, 0x55, 0xc8, 0x8f, 0x5b, 0xc1, 0x8c, 0x5a, 0xbd, 0x84, 0x51, 0xa2, 0x72, 0x46, 0x91, 0x61, 0x3a, 0xa1, 0x6f, 0x48, 0x91, 0x61, 0x38, 0x8d, 0x5c, 0x37, 0x99, 0x69, 0x45, 0x94, 0x61, 0x3a, 0xa5, 0x70, 0x45, 0xad, 0x74, 0x47, 0xac, 0x6f, 0x42, 0xa9, 0x6d, 0x43, 0xb2, 0x78, 0x46, 0xb7, 0x77, 0x47, 0xca, 0x86, 0x53, 0xc9, 0x8c, 0x5f, 0xd7, 0x99, 0x66, 0xd3, 0x98, 0x6a, 0xd3, 0xa7, 0x86, 0xde, 0xb8, 0x9a, 0xd5, 0xb2, 0x97, 0xd7, 0xbd, 0xaf, 0xde, 0xd3, 0xcd, 0xf5, 0xf3, 0xef, 0xf6, 0xf5, 0xf2, 0xfb, 0xfb, 0xf9, 0xfd, 0xfe, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xf9, 0xf5, 0xf3, 0xf2, 0xf3, 0xf1, 0xf0, 0xee, 0xe7, 0xe1, 0xe9, 0xda, 0xcd, 0xcd, 0xb5, 0xa2, 0xce, 0xac, 0x91, 0xca, 0xa2, 0x80, 0xc7, 0x9c, 0x77, 0xc7, 0x91, 0x61, 0xc9, 0x8c, 0x5f, 0xc9, 0x8c, 0x5c, 0xc5, 0x87, 0x5b, 0xb0, 0x79, 0x4d, 0xac, 0x74, 0x45, 0xa3, 0x66, 0x3b, 0xa7, 0x6a, 0x41, 0x9d, 0x63, 0x3a, 0x91, 0x5d, 0x36, 0x82, 0x52, 0x2f, 0x6f, 0x45, 0x26, 0x62, 0x3c, 0x22, 0x65, 0x44, 0x2f, 0x60, 0x41, 0x27, 0x70, 0x4b, 0x30, 0x7c, 0x54, 0x34, 0x7d, 0x54, 0x37, 0x65, 0x41, 0x22, 0x73, 0x4a, 0x2d, 0x77, 0x4a, 0x29, 0x89, 0x58, 0x35, 0xa3, 0x6a, 0x40, 0xa8, 0x73, 0x49, 0x9d, 0x6b, 0x43, 0x86, 0x5c, 0x3b, 0x68, 0x42, 0x23, 0x71, 0x49, 0x27, 0x73, 0x4d, 0x2e, 0x6e, 0x4a, 0x29, 0x73, 0x4f, 0x2d, 0x7a, 0x52, 0x2c, 0x7e, 0x5b, 0x3a, 0x54, 0x37, 0x1c, 0x80, 0x58, 0x35, 0xa5, 0x71, 0x48, 0x86, 0x5d, 0x3f, 0x97, 0x6e, 0x48, 0xaf, 0x7a, 0x4e, 0x99, 0x6a, 0x40, 0xad, 0x7a, 0x51, 0xb1, 0x7f, 0x51, 0xad, 0x7b, 0x51, 0xb9, 0x84, 0x57, 0xc9, 0x8f, 0x5d, 0xc7, 0x8d, 0x5b, 0xd1, 0x95, 0x63, 0xc3, 0x87, 0x55, 0xc1, 0x89, 0x5b, 0xb4, 0x7f, 0x53, 0xa4, 0x6f, 0x47, 0xac, 0x77, 0x50, 0xa3, 0x70, 0x47, 0xa1, 0x6e, 0x46, 0xab, 0x77, 0x50, 0xab, 0x72, 0x4b, 0xa4, 0x6a, 0x3f, 0xa9, 0x6c, 0x3d, 0xb7, 0x77, 0x45, 0xae, 0x6e, 0x3e, 0xb9, 0x79, 0x49, 0xbc, 0x7f, 0x4e, 0xc5, 0x87, 0x57, 0xc6, 0x89, 0x56, 0xcf, 0x91, 0x5e, 0xc7, 0x89, 0x55, 0xd3, 0x99, 0x68, 0xcb, 0x91, 0x66, 0xc4, 0x96, 0x6f, 0xd1, 0xb8, 0xa6, 0xe9, 0xe1, 0xd8, 0xf4, 0xef, 0xeb, 0xf5, 0xf3, 0xf2, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xf4, 0xf3, 0xf1, 0xe8, 0xe6, 0xe5, 0xce, 0xbe, 0xb2, 0xc5, 0xa5, 0x8b, 0xc4, 0x9e, 0x80, 0xca, 0x96, 0x6e, 0xcf, 0x96, 0x66, 0xd8, 0x99, 0x66, 0xcd, 0x92, 0x61, 0xd1, 0x91, 0x62, 0xc8, 0x8c, 0x55, 0xcc, 0x8f, 0x5d, 0xb9, 0x7a, 0x49, 0xb0, 0x74, 0x45, 0xa7, 0x6c, 0x3e, 0xa4, 0x67, 0x39, 0xa6, 0x68, 0x39, 0xa2, 0x66, 0x39, 0x9c, 0x63, 0x39, 0x99, 0x63, 0x3b, 0x88, 0x58, 0x34, 0x66, 0x3d, 0x21, 0x5b, 0x3b, 0x22, 0x77, 0x4d, 0x33, 0x7f, 0x51, 0x33, 0x92, 0x61, 0x3d, 0x85, 0x5a, 0x34, 0x7d, 0x50, 0x2f, 0x8a, 0x59, 0x35, 0x81, 0x52, 0x30, 0x8a, 0x57, 0x31, 0x9f, 0x6b, 0x41, 0xae, 0x74, 0x47, 0x9e, 0x6c, 0x45, 0x8d, 0x60, 0x3c, 0x71, 0x4a, 0x29, 0x7c, 0x51, 0x2e, 0x7a, 0x50, 0x2c, 0x7f, 0x55, 0x32, 0x7d, 0x53, 0x2f, 0x7f, 0x57, 0x35, 0x71, 0x4c, 0x2e, 0x89, 0x5c, 0x3b, 0x9c, 0x65, 0x3e, 0x92, 0x67, 0x47, 0xab, 0x76, 0x4a, 0xb4, 0x7c, 0x4b, 0xab, 0x76, 0x4a, 0xbb, 0x84, 0x54, 0xba, 0x83, 0x58, 0xb8, 0x82, 0x56, 0xc4, 0x8b, 0x5a, 0xcf, 0x92, 0x61, 0xcc, 0x8f, 0x5d, 0xd0, 0x94, 0x62, 0xcd, 0x91, 0x5f, 0xcf, 0x92, 0x60, 0xb8, 0x80, 0x52, 0xb8, 0x7e, 0x4f, 0xc2, 0x87, 0x58, 0xb3, 0x7b, 0x4e, 0xb0, 0x78, 0x4d, 0xaf, 0x77, 0x4b, 0xb1, 0x75, 0x45, 0xba, 0x7c, 0x4b, 0xb4, 0x74, 0x42, 0xbf, 0x7b, 0x46, 0xbb, 0x77, 0x43, 0xc0, 0x7b, 0x47, 0xc5, 0x82, 0x4e, 0xc3, 0x80, 0x4c, 0xcf, 0x8d, 0x56, 0xd1, 0x8f, 0x58, 0xd4, 0x91, 0x5a, 0xd5, 0x92, 0x5b, 0xbe, 0x81, 0x52, 0xc0, 0x8c, 0x62, 0xc8, 0xa4, 0x89, 0xcc, 0xb8, 0xa6, 0xdf, 0xd5, 0xcd, 0xf0, 0xea, 0xe6, 0xf9, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf8, 0xef, 0xef, 0xed, 0xde, 0xd9, 0xd3, 0xcc, 0xc2, 0xbb, 0xcb, 0xac, 0x92, 0xbd, 0x8c, 0x6a, 0xb9, 0x86, 0x59, 0xbf, 0x83, 0x57, 0xbc, 0x82, 0x51, 0xce, 0x8d, 0x5d, 0xd6, 0x91, 0x5d, 0xd1, 0x8d, 0x54, 0xcd, 0x88, 0x56, 0xcb, 0x8a, 0x57, 0xc2, 0x81, 0x4e, 0xb3, 0x73, 0x44, 0xb2, 0x6f, 0x40, 0xb4, 0x71, 0x41, 0xb0, 0x70, 0x3f, 0xa8, 0x69, 0x39, 0xa9, 0x6c, 0x3c, 0xb0, 0x74, 0x43, 0xa0, 0x68, 0x3d, 0x8a, 0x5c, 0x38, 0x75, 0x48, 0x27, 0x84, 0x57, 0x35, 0x82, 0x58, 0x36, 0x7e, 0x52, 0x30, 0x7e, 0x4f, 0x2e, 0x84, 0x56, 0x34, 0x90, 0x5e, 0x3c, 0x92, 0x60, 0x38, 0x98, 0x61, 0x37, 0xb3, 0x76, 0x4b, 0xb0, 0x75, 0x48, 0xad, 0x78, 0x4d, 0x99, 0x66, 0x3f, 0x8a, 0x5d, 0x33, 0x91, 0x5f, 0x3b, 0x86, 0x58, 0x34, 0x94, 0x65, 0x3f, 0x7a, 0x4e, 0x2e, 0x80, 0x58, 0x3b, 0x93, 0x61, 0x39, 0xa5, 0x6d, 0x41, 0x9a, 0x68, 0x40, 0xb2, 0x7d, 0x52, 0xb8, 0x7c, 0x4e, 0xc3, 0x87, 0x55, 0xc8, 0x8c, 0x5b, 0xc3, 0x87, 0x55, 0xc7, 0x92, 0x5e, 0xc0, 0x84, 0x52, 0xcb, 0x88, 0x53, 0xcc, 0x8d, 0x5c, 0xcb, 0x8d, 0x5c, 0xd2, 0x94, 0x63, 0xc7, 0x87, 0x5a, 0xc2, 0x88, 0x58, 0xc3, 0x89, 0x57, 0xb9, 0x7e, 0x52, 0xbc, 0x80, 0x53, 0xb4, 0x77, 0x4c, 0xbd, 0x81, 0x4c, 0xb6, 0x75, 0x43, 0xb8, 0x74, 0x42, 0xbd, 0x7a, 0x45, 0xb7, 0x73, 0x3f, 0xb9, 0x74, 0x41, 0xbd, 0x77, 0x44, 0xc8, 0x7f, 0x4a, 0xd2, 0x89, 0x54, 0xcd, 0x89, 0x4f, 0xce, 0x89, 0x50, 0xcc, 0x88, 0x53, 0xc3, 0x82, 0x52, 0xab, 0x75, 0x4a, 0xb5, 0x82, 0x5b, 0xb5, 0x8b, 0x6c, 0xc5, 0xac, 0x9b, 0xc1, 0xb3, 0xa8, 0xe6, 0xe6, 0xe0, 0xf4, 0xf4, 0xf2, 0xf7, 0xf7, 0xf5, 0xfd, 0xfe, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xec, 0xea, 0xe9, 0xe9, 0xe5, 0xdf, 0xd5, 0xc3, 0xb5, 0xc2, 0xa2, 0x89, 0xa3, 0x7b, 0x5a, 0x9d, 0x6f, 0x4e, 0x8d, 0x61, 0x3d, 0x9c, 0x69, 0x42, 0xa8, 0x72, 0x4a, 0xa4, 0x69, 0x3e, 0xab, 0x6f, 0x3d, 0xba, 0x76, 0x45, 0xc4, 0x82, 0x4f, 0xbd, 0x7b, 0x47, 0xc7, 0x81, 0x4e, 0xab, 0x69, 0x3a, 0xa5, 0x65, 0x37, 0xa8, 0x68, 0x38, 0xb0, 0x6f, 0x40, 0xab, 0x69, 0x3b, 0xb8, 0x75, 0x46, 0xc3, 0x82, 0x4e, 0xc0, 0x81, 0x4e, 0xb3, 0x78, 0x4d, 0x98, 0x64, 0x3d, 0xac, 0x76, 0x4b, 0x9d, 0x6e, 0x49, 0x9d, 0x6b, 0x42, 0x92, 0x61, 0x37, 0x8c, 0x5b, 0x33, 0x86, 0x54, 0x2f, 0x93, 0x5f, 0x38, 0x94, 0x5c, 0x33, 0xc3, 0x85, 0x54, 0xb7, 0x7e, 0x51, 0xa5, 0x6a, 0x42, 0x9a, 0x67, 0x3c, 0x9a, 0x62, 0x3c, 0x8b, 0x5a, 0x32, 0x95, 0x65, 0x3f, 0x84, 0x55, 0x31, 0x88, 0x58, 0x34, 0x9a, 0x68, 0x40, 0x9b, 0x67, 0x3d, 0xa3, 0x6e, 0x44, 0xac, 0x73, 0x46, 0xb6, 0x7a, 0x4c, 0xbf, 0x84, 0x51, 0xc7, 0x8b, 0x59, 0xbd, 0x81, 0x4f, 0xcb, 0x90, 0x5e, 0xcc, 0x8d, 0x5d, 0xcb, 0x88, 0x53, 0xcc, 0x8d, 0x5b, 0xc5, 0x87, 0x56, 0xbf, 0x81, 0x50, 0xd2, 0x92, 0x5f, 0xd2, 0x97, 0x6b, 0xb2, 0x78, 0x4c, 0xc2, 0x87, 0x59, 0xbf, 0x83, 0x58, 0xc2, 0x86, 0x55, 0xb7, 0x7a, 0x48, 0xb3, 0x72, 0x40, 0xb0, 0x6c, 0x3b, 0xb1, 0x6d, 0x3c, 0xb6, 0x71, 0x40, 0xbb, 0x76, 0x43, 0xc3, 0x7d, 0x4a, 0xbb, 0x77, 0x44, 0xc1, 0x7d, 0x4a, 0xb5, 0x73, 0x42, 0xbb, 0x79, 0x48, 0xb6, 0x77, 0x4a, 0xae, 0x74, 0x4a, 0xa8, 0x70, 0x44, 0xa9, 0x77, 0x4e, 0xaf, 0x7a, 0x53, 0x9f, 0x75, 0x56, 0xba, 0xa6, 0x9d, 0xe8, 0xe4, 0xdf, 0xee, 0xed, 0xeb, 0xf3, 0xf3, 0xf1, 0xfb, 0xfb, 0xfa, 0xfd, 0xfd, 0xfd, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xfe, 0xfd, 0xfd, 0xfb, 0xfa, 0xfa, 0xf8, 0xe7, 0xe5, 0xe2, 0xd2, 0xc8, 0xc2, 0xc0, 0xb0, 0xa5, 0xac, 0x94, 0x83, 0x8c, 0x68, 0x51, 0x76, 0x54, 0x38, 0x82, 0x5a, 0x39, 0x86, 0x5d, 0x3c, 0x67, 0x42, 0x26, 0x69, 0x43, 0x26, 0x80, 0x53, 0x31, 0x8d, 0x5b, 0x37, 0xb5, 0x77, 0x48, 0xbb, 0x7d, 0x4e, 0xaf, 0x73, 0x44, 0xa0, 0x63, 0x38, 0xaa, 0x6b, 0x3d, 0xb2, 0x6f, 0x3b, 0xc6, 0x83, 0x4d, 0xc4, 0x83, 0x4d, 0xc0, 0x7e, 0x48, 0xbe, 0x7c, 0x46, 0xbb, 0x7d, 0x4b, 0xc3, 0x81, 0x50, 0xb5, 0x79, 0x4d, 0xbe, 0x84, 0x58, 0xb2, 0x80, 0x55, 0xb4, 0x7e, 0x54, 0xb8, 0x82, 0x58, 0xba, 0x85, 0x56, 0xb4, 0x80, 0x57, 0x88, 0x56, 0x2d, 0x8c, 0x5b, 0x36, 0xae, 0x73, 0x45, 0xb8, 0x7a, 0x49, 0xb0, 0x73, 0x45, 0xab, 0x70, 0x41, 0xa9, 0x71, 0x43, 0x9b, 0x66, 0x38, 0x9d, 0x6c, 0x43, 0x8d, 0x5d, 0x39, 0x9a, 0x66, 0x3e, 0x93, 0x5d, 0x32, 0xa4, 0x6f, 0x44, 0xa3, 0x68, 0x3e, 0x9e, 0x62, 0x37, 0xad, 0x71, 0x45, 0xc3, 0x7f, 0x4a, 0xbf, 0x81, 0x52, 0xc3, 0x86, 0x52, 0xcb, 0x8c, 0x57, 0xcf, 0x90, 0x5b, 0xc3, 0x84, 0x52, 0xcc, 0x8e, 0x5c, 0xce, 0x90, 0x5f, 0xd0, 0x92, 0x61, 0xc7, 0x87, 0x54, 0xb5, 0x7b, 0x4d, 0xbe, 0x86, 0x5b, 0xc0, 0x88, 0x5b, 0xc4, 0x87, 0x59, 0xc1, 0x84, 0x52, 0xb5, 0x76, 0x46, 0xba, 0x7a, 0x49, 0xb1, 0x70, 0x3f, 0xb3, 0x72, 0x40, 0xb8, 0x76, 0x45, 0xbb, 0x76, 0x43, 0xc0, 0x7a, 0x48, 0xbf, 0x7b, 0x48, 0xc4, 0x80, 0x4d, 0xbc, 0x7a, 0x47, 0xb0, 0x72, 0x42, 0x99, 0x64, 0x3b, 0x8c, 0x60, 0x3e, 0x8a, 0x5f, 0x3f, 0x80, 0x5c, 0x3b, 0x83, 0x59, 0x3f, 0x7e, 0x59, 0x42, 0x86, 0x69, 0x59, 0xbc, 0xaf, 0xa8, 0xe2, 0xe0, 0xde, 0xf7, 0xf3, 0xf0, 0xfb, 0xf9, 0xf8, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xf7, 0xf7, 0xf5, 0xe5, 0xe5, 0xe3, 0xd5, 0xcf, 0xc9, 0xb9, 0xaa, 0xa3, 0x98, 0x85, 0x7a, 0x84, 0x66, 0x51, 0x95, 0x6a, 0x4a, 0xaf, 0x79, 0x51, 0xa6, 0x72, 0x4c, 0x9f, 0x70, 0x4d, 0x91, 0x62, 0x3f, 0x8b, 0x5c, 0x39, 0x7a, 0x4c, 0x2b, 0x8d, 0x5b, 0x36, 0x99, 0x64, 0x3d, 0xae, 0x70, 0x41, 0xc1, 0x7d, 0x4a, 0xc0, 0x7c, 0x4a, 0xb5, 0x73, 0x43, 0xb5, 0x73, 0x40, 0xbf, 0x7a, 0x46, 0xbf, 0x78, 0x47, 0xbf, 0x79, 0x46, 0xc6, 0x7e, 0x48, 0xc7, 0x80, 0x49, 0xbd, 0x7b, 0x49, 0xb8, 0x7a, 0x4d, 0xba, 0x7f, 0x53, 0xc0, 0x89, 0x5c, 0xb9, 0x82, 0x59, 0xb7, 0x80, 0x56, 0xc9, 0x8c, 0x5a, 0xd2, 0x91, 0x60, 0xce, 0x91, 0x5e, 0x97, 0x65, 0x3f, 0xa5, 0x6d, 0x42, 0xb8, 0x7d, 0x4e, 0xaa, 0x6e, 0x3e, 0xb4, 0x78, 0x48, 0x9f, 0x67, 0x3a, 0x9d, 0x66, 0x3a, 0xaa, 0x72, 0x45, 0x9a, 0x64, 0x3a, 0x9c, 0x67, 0x3d, 0xa1, 0x6a, 0x3f, 0xa7, 0x71, 0x45, 0xa7, 0x6b, 0x41, 0xa0, 0x65, 0x3b, 0xaf, 0x73, 0x49, 0xb8, 0x78, 0x49, 0xb1, 0x73, 0x44, 0xbf, 0x82, 0x4d, 0xc8, 0x88, 0x55, 0xc3, 0x84, 0x50, 0xc4, 0x86, 0x55, 0xc6, 0x88, 0x57, 0xc8, 0x8a, 0x59, 0xd3, 0x95, 0x64, 0xcf, 0x8f, 0x5d, 0xc0, 0x85, 0x57, 0xbf, 0x87, 0x5a, 0xc3, 0x8a, 0x5e, 0xc1, 0x85, 0x55, 0xba, 0x7c, 0x4b, 0xb5, 0x76, 0x45, 0xb1, 0x71, 0x41, 0xb2, 0x71, 0x40, 0xb6, 0x75, 0x41, 0xb8, 0x76, 0x43, 0xba, 0x75, 0x42, 0xc1, 0x7b, 0x49, 0xc0, 0x7a, 0x48, 0xbb, 0x75, 0x42, 0xbd, 0x7b, 0x47, 0xb7, 0x79, 0x49, 0xb4, 0x7b, 0x4d, 0x9d, 0x69, 0x40, 0xaa, 0x76, 0x4d, 0xb5, 0x7a, 0x53, 0xb9, 0x82, 0x55, 0xbc, 0x88, 0x5f, 0xae, 0x79, 0x55, 0x9e, 0x72, 0x54, 0xae, 0x97, 0x86, 0xe6, 0xdf, 0xdb, 0xf8, 0xf9, 0xf9, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfa, 0xfa, 0xfa, 0xf4, 0xf4, 0xf2, 0xdb, 0xdb, 0xd9, 0xb8, 0xb0, 0xa7, 0xa2, 0x8e, 0x82, 0x93, 0x72, 0x5a, 0xa2, 0x70, 0x4c, 0xaa, 0x76, 0x4b, 0x94, 0x5e, 0x3c, 0x89, 0x56, 0x35, 0x7a, 0x4d, 0x2f, 0x7c, 0x4b, 0x2a, 0x84, 0x52, 0x31, 0x8c, 0x5a, 0x36, 0x85, 0x50, 0x28, 0x9e, 0x66, 0x3d, 0x96, 0x5e, 0x35, 0x9a, 0x5d, 0x35, 0xab, 0x6e, 0x3f, 0xb0, 0x70, 0x42, 0xaf, 0x6c, 0x3e, 0xb4, 0x72, 0x41, 0xa4, 0x66, 0x35, 0xa5, 0x68, 0x37, 0xb0, 0x6f, 0x42, 0xc2, 0x7c, 0x4b, 0xba, 0x78, 0x47, 0xaa, 0x6a, 0x3d, 0xc0, 0x81, 0x52, 0xc6, 0x8a, 0x5a, 0xa7, 0x71, 0x48, 0xb2, 0x7a, 0x51, 0xa8, 0x70, 0x47, 0xc7, 0x86, 0x57, 0xc4, 0x89, 0x57, 0xc6, 0x85, 0x54, 0xa9, 0x75, 0x4c, 0xbf, 0x87, 0x5c, 0xbd, 0x81, 0x51, 0xad, 0x71, 0x42, 0x9f, 0x66, 0x3c, 0x95, 0x5d, 0x34, 0x90, 0x57, 0x2c, 0x8e, 0x5c, 0x35, 0x7a, 0x4d, 0x29, 0x9b, 0x65, 0x3b, 0x9f, 0x69, 0x3d, 0x9b, 0x60, 0x36, 0xa1, 0x67, 0x3d, 0xa7, 0x6d, 0x43, 0xa3, 0x6b, 0x41, 0xb8, 0x7a, 0x4c, 0xc0, 0x83, 0x4f, 0xc3, 0x83, 0x53, 0xbf, 0x7e, 0x4e, 0xbe, 0x80, 0x50, 0xc9, 0x8b, 0x5a, 0xc5, 0x87, 0x56, 0xcf, 0x90, 0x60, 0xc4, 0x84, 0x52, 0xc0, 0x85, 0x57, 0xc4, 0x88, 0x58, 0xc2, 0x86, 0x56, 0xbe, 0x80, 0x4f, 0xbb, 0x7d, 0x4b, 0xba, 0x7a, 0x4a, 0xbb, 0x7a, 0x4a, 0xb9, 0x77, 0x45, 0xbb, 0x76, 0x40, 0xbd, 0x78, 0x42, 0xbd, 0x76, 0x44, 0xc2, 0x7c, 0x49, 0xc7, 0x82, 0x4f, 0xc0, 0x7c, 0x49, 0xb3, 0x72, 0x3f, 0xbd, 0x7f, 0x4f, 0xb7, 0x7a, 0x4b, 0xb5, 0x77, 0x47, 0xb2, 0x71, 0x45, 0xa8, 0x6b, 0x3e, 0xb1, 0x75, 0x4a, 0xae, 0x75, 0x4e, 0x9e, 0x67, 0x42, 0x9e, 0x69, 0x45, 0xad, 0x79, 0x51, 0xbc, 0xa2, 0x8e, 0xf3, 0xf1, 0xf0, 0xfc, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfb, 0xfb, 0xeb, 0xe9, 0xe8, 0xd3, 0xd1, 0xcf, 0xaf, 0xa3, 0x9b, 0x9e, 0x76, 0x5b, 0x9d, 0x6d, 0x49, 0xa3, 0x6e, 0x49, 0x8f, 0x5d, 0x3a, 0x83, 0x50, 0x31, 0x7d, 0x4e, 0x2c, 0x79, 0x4a, 0x28, 0x89, 0x56, 0x31, 0x9e, 0x68, 0x40, 0x8e, 0x5a, 0x36, 0x8c, 0x58, 0x34, 0x8a, 0x57, 0x36, 0x89, 0x56, 0x36, 0x77, 0x49, 0x24, 0x9e, 0x68, 0x3b, 0xb3, 0x76, 0x46, 0xb7, 0x78, 0x46, 0xb8, 0x76, 0x44, 0xba, 0x77, 0x47, 0xa8, 0x66, 0x36, 0xa8, 0x6a, 0x3b, 0xb6, 0x77, 0x48, 0xb6, 0x75, 0x45, 0xad, 0x6d, 0x3d, 0xb7, 0x7b, 0x4c, 0xcb, 0x8a, 0x5b, 0xa8, 0x72, 0x4b, 0xb8, 0x7e, 0x53, 0xaa, 0x71, 0x46, 0xaf, 0x71, 0x43, 0xca, 0x8a, 0x59, 0xd3, 0x93, 0x62, 0xb3, 0x7c, 0x51, 0xb6, 0x7f, 0x53, 0xbd, 0x82, 0x51, 0x91, 0x57, 0x2e, 0x9a, 0x62, 0x3a, 0x99, 0x62, 0x39, 0xa1, 0x67, 0x3e, 0x9d, 0x64, 0x3a, 0x71, 0x46, 0x24, 0x8b, 0x5a, 0x35, 0x98, 0x64, 0x38, 0x98, 0x61, 0x38, 0xa0, 0x68, 0x3f, 0xa0, 0x6b, 0x43, 0xb6, 0x7c, 0x4d, 0xb6, 0x7a, 0x4a, 0xb3, 0x77, 0x47, 0xc1, 0x83, 0x54, 0xbb, 0x7d, 0x4e, 0xc5, 0x87, 0x58, 0xcc, 0x8e, 0x5f, 0xbd, 0x7d, 0x4d, 0xc3, 0x83, 0x53, 0xc6, 0x88, 0x59, 0xcf, 0x90, 0x61, 0xc3, 0x85, 0x56, 0xc0, 0x81, 0x52, 0xb4, 0x75, 0x45, 0xb4, 0x74, 0x43, 0xb1, 0x6f, 0x3f, 0xb3, 0x6e, 0x40, 0xae, 0x69, 0x3a, 0xae, 0x6a, 0x39, 0xb5, 0x70, 0x3e, 0xc5, 0x7d, 0x47, 0xb7, 0x6f, 0x39, 0xb5, 0x74, 0x41, 0xaf, 0x72, 0x42, 0xa3, 0x65, 0x37, 0xa5, 0x67, 0x38, 0xb2, 0x74, 0x45, 0xb0, 0x72, 0x43, 0xb3, 0x6e, 0x3e, 0xb5, 0x75, 0x41, 0x9b, 0x64, 0x3d, 0x95, 0x5d, 0x36, 0x9c, 0x64, 0x3d, 0xa0, 0x68, 0x41, 0xa4, 0x6e, 0x4b, 0xab, 0x76, 0x51, 0xc7, 0xb2, 0xa1, 0xf5, 0xf5, 0xf2, 0xfc, 0xfd, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xed, 0xec, 0xec, 0xe4, 0xe2, 0xe0, 0xc5, 0xc2, 0xc1, 0xa0, 0x81, 0x70, 0xa2, 0x74, 0x50, 0x9d, 0x69, 0x41, 0xa8, 0x70, 0x48, 0x91, 0x60, 0x37, 0x86, 0x54, 0x31, 0x80, 0x52, 0x2f, 0x7d, 0x4e, 0x2c, 0x83, 0x50, 0x2a, 0x8d, 0x57, 0x2f, 0x93, 0x5f, 0x3b, 0x94, 0x60, 0x3b, 0x82, 0x4f, 0x30, 0x7d, 0x4c, 0x23, 0x98, 0x63, 0x36, 0x93, 0x5b, 0x30, 0x96, 0x5f, 0x37, 0x9e, 0x66, 0x3d, 0xa8, 0x6a, 0x3f, 0xa8, 0x69, 0x3d, 0xa6, 0x66, 0x3b, 0xa3, 0x63, 0x3a, 0xa9, 0x69, 0x40, 0xa9, 0x69, 0x38, 0xb1, 0x71, 0x41, 0xaf, 0x72, 0x43, 0xbb, 0x7a, 0x4b, 0xbd, 0x83, 0x58, 0xbe, 0x80, 0x52, 0xc0, 0x82, 0x53, 0xb1, 0x77, 0x4c, 0xc2, 0x82, 0x52, 0xc4, 0x84, 0x54, 0xb7, 0x7c, 0x4d, 0xba, 0x7e, 0x4f, 0xc1, 0x84, 0x56, 0xc3, 0x8a, 0x59, 0xb0, 0x79, 0x4d, 0xa0, 0x69, 0x3f, 0xa9, 0x71, 0x44, 0xad, 0x70, 0x42, 0x84, 0x52, 0x30, 0x86, 0x56, 0x31, 0xa3, 0x70, 0x42, 0xa4, 0x6e, 0x3f, 0xb2, 0x7c, 0x4d, 0xa2, 0x6c, 0x44, 0xa9, 0x6f, 0x3f, 0xaf, 0x73, 0x43, 0xb9, 0x7c, 0x4d, 0xbb, 0x82, 0x51, 0xc4, 0x8b, 0x5b, 0xc1, 0x82, 0x53, 0xb7, 0x79, 0x4a, 0xbf, 0x7f, 0x4e, 0xc9, 0x89, 0x59, 0xc6, 0x87, 0x58, 0xc9, 0x8b, 0x5c, 0xc3, 0x84, 0x55, 0xb8, 0x7a, 0x4b, 0xb1, 0x70, 0x44, 0xae, 0x6d, 0x42, 0xa8, 0x65, 0x38, 0xb1, 0x6d, 0x3e, 0xac, 0x68, 0x38, 0xb5, 0x71, 0x40, 0xb4, 0x70, 0x3f, 0xb4, 0x71, 0x3f, 0xbb, 0x78, 0x46, 0xa7, 0x64, 0x35, 0x9f, 0x5f, 0x35, 0xb1, 0x6e, 0x3c, 0xb0, 0x6d, 0x3b, 0xb0, 0x6d, 0x3c, 0xb5, 0x72, 0x40, 0xb3, 0x71, 0x42, 0xb1, 0x71, 0x3f, 0xa6, 0x6a, 0x40, 0x9b, 0x5f, 0x35, 0x9f, 0x62, 0x38, 0xaa, 0x6e, 0x43, 0xa7, 0x6c, 0x43, 0xa3, 0x6b, 0x45, 0xa7, 0x75, 0x51, 0xe2, 0xd2, 0xc9, 0xfc, 0xfd, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xf9, 0xf9, 0xf7, 0xe9, 0xe9, 0xe7, 0xda, 0xd6, 0xd3, 0xb5, 0xb0, 0xad, 0x9a, 0x69, 0x4b, 0xa2, 0x6e, 0x47, 0xa7, 0x6d, 0x46, 0x92, 0x5c, 0x38, 0x99, 0x5e, 0x3a, 0x8f, 0x59, 0x33, 0x80, 0x4d, 0x2c, 0x82, 0x4f, 0x2e, 0x91, 0x5d, 0x39, 0x9b, 0x62, 0x39, 0xa1, 0x6a, 0x3b, 0xac, 0x6e, 0x3a, 0xa9, 0x6e, 0x42, 0xaf, 0x71, 0x45, 0xa0, 0x63, 0x36, 0x9b, 0x64, 0x3a, 0x90, 0x5d, 0x38, 0x85, 0x52, 0x2c, 0x98, 0x5f, 0x34, 0xa6, 0x69, 0x3b, 0xa5, 0x68, 0x3b, 0xac, 0x6e, 0x44, 0xac, 0x6e, 0x44, 0xb5, 0x78, 0x4a, 0xba, 0x79, 0x4c, 0x9f, 0x62, 0x34, 0xb7, 0x7a, 0x4c, 0xb2, 0x78, 0x4c, 0xb4, 0x75, 0x4a, 0xc2, 0x84, 0x52, 0xc0, 0x82, 0x55, 0xbc, 0x7d, 0x4b, 0xc6, 0x87, 0x55, 0xbc, 0x80, 0x50, 0xc3, 0x87, 0x57, 0xc2, 0x84, 0x53, 0xc2, 0x84, 0x53, 0xc1, 0x86, 0x56, 0xa1, 0x6a, 0x40, 0xa8, 0x6e, 0x45, 0xb4, 0x79, 0x45, 0x9d, 0x61, 0x36, 0x7d, 0x4e, 0x2d, 0xa1, 0x68, 0x3e, 0xaa, 0x70, 0x41, 0xc0, 0x81, 0x4e, 0xb8, 0x7b, 0x4c, 0xab, 0x6f, 0x3f, 0xb1, 0x75, 0x45, 0xc2, 0x85, 0x56, 0xc6, 0x8a, 0x5a, 0xc6, 0x8f, 0x5d, 0xb5, 0x75, 0x47, 0xba, 0x7a, 0x4c, 0xb4, 0x76, 0x43, 0xc2, 0x84, 0x51, 0xc8, 0x8c, 0x5c, 0xbe, 0x82, 0x52, 0xc5, 0x84, 0x52, 0xc0, 0x82, 0x54, 0xa2, 0x67, 0x3c, 0xa6, 0x67, 0x3b, 0xab, 0x67, 0x39, 0xaa, 0x66, 0x37, 0xb7, 0x72, 0x41, 0xb2, 0x6e, 0x3b, 0xa8, 0x6a, 0x3a, 0xa4, 0x68, 0x38, 0xac, 0x6f, 0x3f, 0xb9, 0x79, 0x48, 0xc1, 0x77, 0x42, 0xb6, 0x73, 0x40, 0xb3, 0x70, 0x3c, 0xb9, 0x75, 0x44, 0xb7, 0x73, 0x41, 0xbc, 0x77, 0x49, 0xbb, 0x78, 0x43, 0xba, 0x76, 0x47, 0xb6, 0x72, 0x43, 0xae, 0x6d, 0x3f, 0xb3, 0x6d, 0x41, 0xb9, 0x77, 0x49, 0xad, 0x6f, 0x45, 0xb1, 0x77, 0x4b, 0xc6, 0x9f, 0x8b, 0xfb, 0xfc, 0xfd, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xf8, 0xf8, 0xf6, 0xf4, 0xf3, 0xf2, 0xdb, 0xd8, 0xd5, 0xae, 0x91, 0x7a, 0xa5, 0x6e, 0x47, 0xb3, 0x77, 0x4f, 0xb0, 0x72, 0x49, 0xa3, 0x6b, 0x43, 0xa0, 0x67, 0x3c, 0x93, 0x5f, 0x33, 0x7f, 0x4d, 0x2c, 0x73, 0x41, 0x20, 0x89, 0x55, 0x31, 0x98, 0x65, 0x42, 0xa6, 0x67, 0x3c, 0xb3, 0x78, 0x4e, 0xb1, 0x72, 0x46, 0x9a, 0x62, 0x3a, 0x81, 0x4f, 0x29, 0x8d, 0x58, 0x32, 0xa7, 0x70, 0x46, 0xac, 0x71, 0x44, 0xad, 0x6e, 0x40, 0xb2, 0x75, 0x48, 0xb0, 0x73, 0x46, 0xb6, 0x7a, 0x4c, 0xbc, 0x80, 0x52, 0xb5, 0x75, 0x45, 0xca, 0x83, 0x55, 0xc2, 0x80, 0x50, 0xba, 0x78, 0x48, 0xba, 0x7d, 0x52, 0xb8, 0x7d, 0x51, 0xbd, 0x7f, 0x4e, 0xc5, 0x86, 0x5a, 0xb5, 0x7a, 0x4c, 0xb9, 0x7e, 0x50, 0xbf, 0x83, 0x53, 0xc3, 0x86, 0x57, 0xcb, 0x8d, 0x5c, 0xbf, 0x81, 0x50, 0xc5, 0x8a, 0x59, 0xa0, 0x6a, 0x3e, 0x9b, 0x62, 0x39, 0xb6, 0x7a, 0x48, 0xaf, 0x74, 0x47, 0x7d, 0x4f, 0x2b, 0xac, 0x73, 0x45, 0xbc, 0x81, 0x53, 0xc1, 0x81, 0x51, 0xb6, 0x7a, 0x4a, 0xb3, 0x77, 0x47, 0xbb, 0x7e, 0x4f, 0xc4, 0x87, 0x58, 0xcd, 0x91, 0x61, 0xd3, 0x9c, 0x6a, 0xb6, 0x7b, 0x4f, 0xa8, 0x6d, 0x41, 0xc7, 0x89, 0x5c, 0xc5, 0x86, 0x59, 0xbd, 0x81, 0x51, 0xbc, 0x80, 0x50, 0xca, 0x89, 0x57, 0xba, 0x7c, 0x4f, 0xae, 0x73, 0x48, 0xa5, 0x66, 0x39, 0xb4, 0x71, 0x43, 0xb5, 0x71, 0x42, 0xaf, 0x6b, 0x3b, 0xb0, 0x6d, 0x3b, 0xbc, 0x79, 0x46, 0xbc, 0x7a, 0x46, 0xbf, 0x7d, 0x49, 0xbd, 0x7b, 0x47, 0xb4, 0x6f, 0x3e, 0xa3, 0x62, 0x36, 0xb4, 0x73, 0x47, 0xb9, 0x75, 0x44, 0xaf, 0x6b, 0x3a, 0xb8, 0x74, 0x41, 0xb9, 0x75, 0x44, 0xbd, 0x79, 0x4a, 0xc8, 0x83, 0x54, 0xc3, 0x83, 0x4f, 0xc4, 0x81, 0x4e, 0xbd, 0x77, 0x46, 0xbd, 0x7c, 0x4e, 0xb8, 0x79, 0x4d, 0xba, 0x89, 0x66, 0xf4, 0xec, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xf8, 0xf6, 0xf8, 0xf1, 0xed, 0xee, 0xa9, 0xa2, 0x9e, 0xa3, 0x74, 0x55, 0xbb, 0x7a, 0x4e, 0xb5, 0x74, 0x47, 0xb5, 0x75, 0x49, 0xa2, 0x66, 0x3e, 0xa3, 0x66, 0x41, 0x9d, 0x65, 0x42, 0x8a, 0x59, 0x31, 0x78, 0x49, 0x27, 0x77, 0x4b, 0x2f, 0x78, 0x4b, 0x29, 0x84, 0x56, 0x33, 0x93, 0x61, 0x39, 0xa1, 0x66, 0x3a, 0x87, 0x53, 0x2d, 0x74, 0x43, 0x24, 0x86, 0x50, 0x2b, 0x8e, 0x57, 0x2d, 0x97, 0x60, 0x36, 0xb2, 0x77, 0x49, 0xc6, 0x87, 0x52, 0xd2, 0x91, 0x5c, 0xc8, 0x83, 0x4c, 0xc5, 0x80, 0x49, 0xc7, 0x82, 0x4f, 0xc3, 0x7c, 0x4a, 0xc4, 0x80, 0x4d, 0xc2, 0x7e, 0x4e, 0xc7, 0x86, 0x59, 0xc0, 0x85, 0x56, 0xc2, 0x87, 0x59, 0xbe, 0x82, 0x55, 0xb9, 0x82, 0x57, 0xbb, 0x83, 0x57, 0xb8, 0x80, 0x56, 0xbb, 0x82, 0x54, 0xc1, 0x84, 0x54, 0xc8, 0x8b, 0x5b, 0xb9, 0x7e, 0x4f, 0xb8, 0x7e, 0x53, 0xa4, 0x6b, 0x3f, 0xb8, 0x7c, 0x4c, 0xb9, 0x7c, 0x4c, 0x8b, 0x58, 0x35, 0xb6, 0x7e, 0x4d, 0xbd, 0x81, 0x52, 0xc5, 0x88, 0x57, 0xb8, 0x7c, 0x4f, 0xb4, 0x78, 0x4b, 0xbe, 0x82, 0x53, 0xca, 0x8d, 0x5e, 0xd0, 0x98, 0x6a, 0xd2, 0x9b, 0x6c, 0xad, 0x78, 0x50, 0xa8, 0x75, 0x49, 0xb3, 0x7a, 0x4f, 0xab, 0x72, 0x46, 0xba, 0x7f, 0x51, 0xba, 0x7b, 0x4c, 0xba, 0x79, 0x4a, 0xbd, 0x7d, 0x4f, 0xb1, 0x72, 0x45, 0xb3, 0x72, 0x45, 0xa5, 0x64, 0x37, 0xa1, 0x5f, 0x32, 0xb1, 0x6f, 0x3e, 0xab, 0x6a, 0x3b, 0xb0, 0x6c, 0x3e, 0xbf, 0x7a, 0x46, 0xb9, 0x74, 0x40, 0xb4, 0x74, 0x43, 0xa7, 0x68, 0x39, 0x91, 0x57, 0x30, 0xa4, 0x65, 0x3a, 0xc0, 0x78, 0x46, 0xca, 0x82, 0x4d, 0xbd, 0x7a, 0x43, 0xb6, 0x71, 0x42, 0xb9, 0x7b, 0x4b, 0xbd, 0x7e, 0x53, 0xc9, 0x88, 0x57, 0xc5, 0x82, 0x52, 0xca, 0x83, 0x53, 0xc0, 0x7a, 0x4e, 0xbb, 0x75, 0x4a, 0xb7, 0x7e, 0x51, 0xe2, 0xcd, 0xc4, 0xfd, 0xfd, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xed, 0xea, 0xe9, 0xc1, 0xba, 0xb9, 0x8d, 0x7f, 0x77, 0xac, 0x76, 0x50, 0xc7, 0x84, 0x54, 0xc9, 0x85, 0x56, 0xbe, 0x7e, 0x4b, 0xb3, 0x79, 0x49, 0xb4, 0x77, 0x4a, 0xa5, 0x6d, 0x44, 0x87, 0x56, 0x32, 0x6a, 0x3b, 0x20, 0x80, 0x50, 0x31, 0x88, 0x55, 0x2d, 0x88, 0x55, 0x30, 0xa3, 0x6a, 0x41, 0x91, 0x59, 0x30, 0x9c, 0x65, 0x3c, 0x99, 0x62, 0x35, 0xaf, 0x74, 0x43, 0xc3, 0x83, 0x4c, 0xd1, 0x90, 0x55, 0xda, 0x96, 0x5c, 0xd7, 0x8f, 0x56, 0xcd, 0x86, 0x4e, 0xc4, 0x81, 0x4b, 0xc0, 0x7c, 0x47, 0xc4, 0x7e, 0x4c, 0xca, 0x85, 0x52, 0xbb, 0x78, 0x44, 0xbe, 0x79, 0x4c, 0xca, 0x89, 0x5b, 0xbf, 0x84, 0x54, 0xbc, 0x81, 0x55, 0xbb, 0x80, 0x54, 0xbf, 0x87, 0x5a, 0xb8, 0x82, 0x57, 0xb8, 0x83, 0x5a, 0xc3, 0x8a, 0x5e, 0xcd, 0x91, 0x61, 0xc7, 0x8b, 0x5b, 0xc7, 0x8c, 0x5c, 0xca, 0x8f, 0x60, 0xa8, 0x6e, 0x40, 0xbf, 0x84, 0x55, 0xbf, 0x82, 0x51, 0x9a, 0x68, 0x45, 0xb3, 0x7a, 0x4b, 0xc2, 0x86, 0x57, 0xba, 0x7e, 0x4e, 0xb7, 0x7c, 0x50, 0xb6, 0x7b, 0x4f, 0xb7, 0x7b, 0x4b, 0xc4, 0x88, 0x58, 0xd4, 0x9d, 0x70, 0xca, 0x93, 0x65, 0xb7, 0x85, 0x5a, 0xb6, 0x85, 0x5a, 0xb5, 0x7e, 0x53, 0xaa, 0x73, 0x48, 0xb9, 0x7e, 0x52, 0xbd, 0x7c, 0x4e, 0xc2, 0x82, 0x53, 0xbe, 0x7e, 0x4f, 0xb2, 0x71, 0x43, 0xac, 0x6c, 0x3e, 0xb5, 0x77, 0x4a, 0xa8, 0x66, 0x39, 0xae, 0x6b, 0x3a, 0xa7, 0x67, 0x39, 0xa1, 0x61, 0x36, 0x9b, 0x60, 0x34, 0x9c, 0x61, 0x35, 0xa5, 0x67, 0x38, 0xa7, 0x69, 0x3a, 0xa5, 0x64, 0x36, 0xa6, 0x63, 0x35, 0xad, 0x69, 0x3b, 0xbc, 0x79, 0x45, 0xbe, 0x7d, 0x4d, 0xb9, 0x77, 0x47, 0xc1, 0x7c, 0x48, 0xc5, 0x7f, 0x4c, 0xd5, 0x8d, 0x57, 0xd9, 0x91, 0x5b, 0xe2, 0x9d, 0x63, 0xd4, 0x8f, 0x5a, 0xb9, 0x7b, 0x4e, 0xb7, 0x79, 0x4c, 0xcf, 0xb1, 0x9c, 0xfd, 0xfe, 0xfe, 0xff, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf4, 0xf4, 0xf2, 0xd6, 0xd4, 0xcf, 0x9c, 0x94, 0x8f, 0x89, 0x73, 0x66, 0xc5, 0x89, 0x58, 0xc9, 0x83, 0x50, 0xc5, 0x7e, 0x4c, 0xba, 0x79, 0x4d, 0xb7, 0x7b, 0x51, 0xa9, 0x6d, 0x45, 0x96, 0x5d, 0x39, 0x8e, 0x5d, 0x34, 0x87, 0x5a, 0x38, 0x63, 0x39, 0x1e, 0x83, 0x54, 0x32, 0xa7, 0x6a, 0x3e, 0xa4, 0x69, 0x3d, 0x94, 0x5e, 0x35, 0xa8, 0x6c, 0x40, 0xbf, 0x82, 0x4d, 0xc5, 0x83, 0x4e, 0xc8, 0x83, 0x51, 0xd1, 0x8b, 0x57, 0xca, 0x85, 0x51, 0xc7, 0x81, 0x4e, 0xbe, 0x78, 0x45, 0xc2, 0x81, 0x4e, 0xca, 0x89, 0x56, 0xc9, 0x84, 0x51, 0xc2, 0x7c, 0x49, 0xc0, 0x7c, 0x49, 0xbb, 0x77, 0x48, 0xcc, 0x8b, 0x5d, 0xc7, 0x8c, 0x5c, 0xb9, 0x7e, 0x52, 0xc0, 0x86, 0x59, 0xca, 0x8c, 0x5a, 0xac, 0x79, 0x51, 0xb6, 0x80, 0x57, 0xc1, 0x87, 0x5b, 0xc2, 0x87, 0x59, 0xb4, 0x79, 0x49, 0xba, 0x7f, 0x4f, 0xc0, 0x86, 0x54, 0xbc, 0x83, 0x53, 0xc4, 0x89, 0x5b, 0xb8, 0x7c, 0x4c, 0x9e, 0x69, 0x45, 0xc0, 0x87, 0x58, 0xbb, 0x7f, 0x50, 0xa8, 0x6d, 0x3e, 0xb8, 0x7d, 0x51, 0xbd, 0x82, 0x56, 0xbb, 0x80, 0x50, 0xbe, 0x83, 0x54, 0xc3, 0x8d, 0x60, 0xc9, 0x93, 0x66, 0xc5, 0x92, 0x63, 0xb2, 0x80, 0x59, 0xb9, 0x82, 0x57, 0xb5, 0x7e, 0x52, 0xaf, 0x75, 0x49, 0xc6, 0x87, 0x58, 0xbf, 0x7f, 0x50, 0xc0, 0x7f, 0x51, 0xb1, 0x71, 0x43, 0xa8, 0x67, 0x39, 0xa7, 0x68, 0x3b, 0xa3, 0x61, 0x34, 0xac, 0x6a, 0x38, 0xa3, 0x64, 0x36, 0x99, 0x59, 0x2f, 0x9a, 0x5e, 0x31, 0xb1, 0x74, 0x47, 0xaa, 0x6b, 0x3c, 0xa4, 0x66, 0x36, 0xa0, 0x60, 0x34, 0x8e, 0x54, 0x2c, 0x93, 0x56, 0x2e, 0xab, 0x6e, 0x42, 0xb6, 0x77, 0x4d, 0xb6, 0x78, 0x48, 0xba, 0x77, 0x48, 0xc2, 0x7f, 0x4a, 0xb7, 0x75, 0x43, 0xc7, 0x86, 0x54, 0xcf, 0x8b, 0x54, 0xc9, 0x83, 0x50, 0xc3, 0x80, 0x4f, 0xb9, 0x76, 0x4b, 0xce, 0xb0, 0x98, 0xfd, 0xfe, 0xff, 0xff, 0xfe, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xf1, 0xf0, 0xef, 0xc8, 0xc4, 0xbf, 0xa0, 0x98, 0x90, 0x8e, 0x73, 0x61, 0xcc, 0x95, 0x69, 0xc8, 0x88, 0x58, 0xc5, 0x85, 0x55, 0xb9, 0x7d, 0x50, 0xb4, 0x77, 0x4a, 0xb6, 0x7d, 0x4e, 0xad, 0x72, 0x49, 0x86, 0x53, 0x2f, 0x7b, 0x4d, 0x2f, 0x7b, 0x4d, 0x2d, 0x7a, 0x48, 0x25, 0x60, 0x32, 0x17, 0x6f, 0x42, 0x24, 0x72, 0x4c, 0x33, 0x69, 0x40, 0x22, 0x97, 0x63, 0x3c, 0xaf, 0x74, 0x42, 0xaa, 0x6b, 0x3d, 0xb6, 0x74, 0x43, 0xbe, 0x7a, 0x46, 0xc1, 0x7d, 0x4a, 0xc0, 0x79, 0x43, 0xc2, 0x7c, 0x49, 0xc3, 0x7d, 0x4b, 0xc2, 0x7c, 0x4b, 0xb2, 0x6c, 0x3b, 0xab, 0x69, 0x39, 0xc4, 0x87, 0x55, 0xbb, 0x80, 0x54, 0xbe, 0x83, 0x57, 0xc8, 0x8b, 0x60, 0xcb, 0x95, 0x67, 0xba, 0x81, 0x59, 0xb0, 0x7c, 0x4e, 0xca, 0x92, 0x63, 0xbf, 0x86, 0x5d, 0xa9, 0x77, 0x4e, 0xb3, 0x7e, 0x51, 0xb1, 0x78, 0x4c, 0xb3, 0x7a, 0x4d, 0xc1, 0x86, 0x56, 0xba, 0x7f, 0x52, 0xa5, 0x6d, 0x45, 0xbc, 0x83, 0x54, 0xc9, 0x8d, 0x5d, 0xb6, 0x7d, 0x51, 0xa7, 0x71, 0x4b, 0xc0, 0x85, 0x59, 0xb8, 0x7e, 0x51, 0xb8, 0x81, 0x53, 0xae, 0x77, 0x4a, 0xb4, 0x81, 0x56, 0xb6, 0x83, 0x58, 0xbf, 0x86, 0x58, 0xbe, 0x89, 0x60, 0xb6, 0x7d, 0x52, 0xb9, 0x80, 0x55, 0xa9, 0x72, 0x46, 0xbf, 0x83, 0x53, 0xd1, 0x91, 0x63, 0xbb, 0x7a, 0x4c, 0xb8, 0x78, 0x4b, 0xb1, 0x6e, 0x3f, 0xbd, 0x78, 0x49, 0xbd, 0x79, 0x47, 0xba, 0x78, 0x44, 0x9a, 0x60, 0x31, 0x92, 0x56, 0x2d, 0x97, 0x5c, 0x32, 0x9c, 0x5d, 0x30, 0xb2, 0x6e, 0x3f, 0xbc, 0x78, 0x49, 0xb7, 0x74, 0x45, 0x85, 0x4d, 0x27, 0x83, 0x4e, 0x2d, 0x9f, 0x66, 0x3c, 0xbc, 0x7e, 0x4d, 0xb6, 0x78, 0x46, 0x8f, 0x55, 0x2c, 0xbb, 0x7e, 0x50, 0xc9, 0x88, 0x57, 0xc5, 0x85, 0x55, 0xc2, 0x7d, 0x4c, 0xcc, 0x85, 0x55, 0xc4, 0x7f, 0x4f, 0xbd, 0x7a, 0x4b, 0xc2, 0xa3, 0x8e, 0xf8, 0xf9, 0xfa, 0xff, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xe1, 0xe0, 0xdf, 0xac, 0xa7, 0xa2, 0x8b, 0x83, 0x7b, 0x7d, 0x61, 0x50, 0xdf, 0xa8, 0x7c, 0xcf, 0x8f, 0x5f, 0xc1, 0x81, 0x51, 0xae, 0x76, 0x48, 0xa3, 0x6a, 0x46, 0xa1, 0x6b, 0x41, 0x94, 0x5c, 0x37, 0x70, 0x44, 0x27, 0x5f, 0x39, 0x21, 0x68, 0x39, 0x1c, 0x5f, 0x35, 0x1d, 0x3c, 0x1e, 0x10, 0x44, 0x27, 0x15, 0x7d, 0x4f, 0x2e, 0x8d, 0x5b, 0x36, 0x84, 0x52, 0x2f, 0x9b, 0x68, 0x3c, 0xa4, 0x6a, 0x41, 0xb0, 0x72, 0x44, 0xb5, 0x73, 0x42, 0xbb, 0x7a, 0x48, 0xb0, 0x72, 0x43, 0xb4, 0x73, 0x43, 0xa7, 0x66, 0x36, 0xac, 0x6b, 0x3d, 0xb4, 0x72, 0x45, 0xb5, 0x76, 0x4a, 0xbf, 0x86, 0x59, 0xc6, 0x8c, 0x5f, 0xcd, 0x92, 0x66, 0xc5, 0x8e, 0x63, 0xc1, 0x8e, 0x62, 0xbb, 0x89, 0x62, 0xcb, 0x95, 0x66, 0xc8, 0x8d, 0x5f, 0xaa, 0x78, 0x4d, 0xaf, 0x7e, 0x55, 0xbc, 0x87, 0x5a, 0xb0, 0x7a, 0x4c, 0x99, 0x63, 0x3a, 0xb6, 0x7c, 0x51, 0xb6, 0x7b, 0x4e, 0xa0, 0x69, 0x40, 0xa9, 0x70, 0x41, 0xc2, 0x86, 0x56, 0xbb, 0x83, 0x56, 0x9c, 0x66, 0x40, 0xb7, 0x7d, 0x50, 0xc1, 0x86, 0x5a, 0xba, 0x84, 0x56, 0xb3, 0x7c, 0x4f, 0xb9, 0x86, 0x5c, 0xbb, 0x88, 0x5d, 0xbf, 0x85, 0x58, 0xbb, 0x86, 0x5d, 0xbe, 0x89, 0x5d, 0xb1, 0x7b, 0x4f, 0xb3, 0x7c, 0x50, 0xae, 0x72, 0x43, 0xc4, 0x88, 0x58, 0xc3, 0x87, 0x58, 0xa2, 0x65, 0x3b, 0xa6, 0x68, 0x3b, 0xae, 0x6b, 0x3d, 0xb9, 0x75, 0x43, 0xc2, 0x7e, 0x4a, 0xb3, 0x75, 0x44, 0xa9, 0x69, 0x3c, 0x9a, 0x5c, 0x32, 0x9c, 0x63, 0x3a, 0xa9, 0x69, 0x3e, 0x9e, 0x5e, 0x33, 0x8e, 0x58, 0x33, 0x95, 0x5f, 0x3b, 0x9a, 0x64, 0x3e, 0x99, 0x5f, 0x39, 0xb2, 0x74, 0x43, 0xb5, 0x77, 0x45, 0xad, 0x71, 0x47, 0x9c, 0x65, 0x3c, 0x98, 0x62, 0x39, 0xbe, 0x7f, 0x51, 0xbf, 0x7d, 0x4f, 0xc4, 0x83, 0x55, 0xba, 0x7a, 0x4d, 0xb2, 0x73, 0x47, 0xc6, 0xa9, 0x95, 0xf5, 0xf5, 0xf6, 0xff, 0xfd, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xf2, 0xf2, 0xf0, 0xc4, 0xc4, 0xc1, 0xaf, 0xad, 0xa7, 0x9c, 0x93, 0x89, 0x77, 0x60, 0x4d, 0xd4, 0x90, 0x61, 0xd4, 0x8b, 0x58, 0xb1, 0x6e, 0x47, 0x9a, 0x64, 0x3e, 0x82, 0x4e, 0x2b, 0x87, 0x55, 0x34, 0x80, 0x4d, 0x2c, 0x52, 0x2d, 0x1a, 0x40, 0x24, 0x10, 0x46, 0x26, 0x15, 0x44, 0x22, 0x10, 0x2b, 0x16, 0x0c, 0x45, 0x27, 0x15, 0x54, 0x34, 0x17, 0x76, 0x4e, 0x2f, 0x6d, 0x44, 0x26, 0x62, 0x3c, 0x1e, 0x80, 0x53, 0x31, 0x99, 0x5f, 0x35, 0xac, 0x6d, 0x3c, 0xab, 0x6f, 0x3f, 0xad, 0x70, 0x40, 0x9e, 0x62, 0x39, 0xb4, 0x71, 0x41, 0xa3, 0x64, 0x34, 0x9b, 0x61, 0x33, 0xa0, 0x68, 0x43, 0xb1, 0x7b, 0x52, 0xc4, 0x8d, 0x60, 0xc7, 0x90, 0x63, 0xc2, 0x8e, 0x64, 0xc5, 0x99, 0x6c, 0xd0, 0x9b, 0x6c, 0xcf, 0x9a, 0x70, 0xab, 0x80, 0x55, 0x9e, 0x6b, 0x46, 0xc0, 0x89, 0x5a, 0xc2, 0x8a, 0x5b, 0xba, 0x81, 0x54, 0x8f, 0x61, 0x3c, 0xac, 0x77, 0x4c, 0xb3, 0x7a, 0x4e, 0xa2, 0x6c, 0x42, 0xa5, 0x6e, 0x41, 0xc3, 0x85, 0x53, 0xb7, 0x7d, 0x55, 0x9f, 0x6a, 0x43, 0xb3, 0x7c, 0x4f, 0xc4, 0x8d, 0x60, 0xae, 0x7a, 0x51, 0xaf, 0x7f, 0x59, 0xc6, 0x93, 0x68, 0xc5, 0x92, 0x67, 0xbb, 0x8a, 0x64, 0xc4, 0x8f, 0x66, 0xba, 0x8a, 0x61, 0xb0, 0x80, 0x58, 0xbb, 0x86, 0x5a, 0xbd, 0x88, 0x5c, 0xb8, 0x7f, 0x51, 0xc4, 0x8a, 0x5c, 0xbe, 0x83, 0x55, 0xb1, 0x72, 0x46, 0xa0, 0x61, 0x34, 0xb1, 0x70, 0x40, 0xc2, 0x7e, 0x49, 0xcb, 0x83, 0x4e, 0xc2, 0x7c, 0x46, 0xb3, 0x73, 0x44, 0xa1, 0x60, 0x36, 0x9d, 0x62, 0x38, 0x93, 0x5c, 0x34, 0x8f, 0x56, 0x2f, 0xa9, 0x6f, 0x46, 0xa8, 0x6d, 0x43, 0xae, 0x73, 0x44, 0xae, 0x6c, 0x3e, 0xa9, 0x72, 0x47, 0x8d, 0x55, 0x36, 0x89, 0x58, 0x37, 0xb1, 0x71, 0x3f, 0xc8, 0x88, 0x56, 0xbf, 0x81, 0x4f, 0xbd, 0x7f, 0x50, 0xa6, 0x68, 0x3d, 0xb9, 0x74, 0x45, 0xbc, 0xa6, 0x98, 0xef, 0xed, 0xec, 0xfa, 0xfa, 0xfb, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfa, 0xe5, 0xe5, 0xe3, 0xcd, 0xcb, 0xc9, 0xb8, 0xb0, 0xad, 0x67, 0x5a, 0x52, 0x69, 0x51, 0x3c, 0xd1, 0x8a, 0x5a, 0xc8, 0x7e, 0x4b, 0xab, 0x68, 0x41, 0xa5, 0x6e, 0x48, 0x8b, 0x58, 0x35, 0x6e, 0x42, 0x27, 0x6c, 0x41, 0x26, 0x71, 0x47, 0x27, 0x64, 0x3d, 0x27, 0x43, 0x23, 0x14, 0x22, 0x0f, 0x09, 0x22, 0x08, 0x00, 0x41, 0x26, 0x15, 0x59, 0x3b, 0x20, 0x6c, 0x46, 0x28, 0x86, 0x59, 0x36, 0x8e, 0x60, 0x3b, 0x75, 0x49, 0x29, 0x69, 0x3e, 0x1e, 0x87, 0x55, 0x32, 0x9f, 0x65, 0x3f, 0x8d, 0x53, 0x2a, 0xc2, 0x86, 0x54, 0xb0, 0x75, 0x47, 0x96, 0x5e, 0x39, 0x84, 0x50, 0x2f, 0xb1, 0x7f, 0x58, 0xb3, 0x82, 0x57, 0xd2, 0xa1, 0x76, 0xc6, 0x95, 0x69, 0xd5, 0xa6, 0x7a, 0xcd, 0x9c, 0x71, 0xd6, 0xa2, 0x72, 0xbb, 0x86, 0x5c, 0xb4, 0x82, 0x5a, 0xbb, 0x86, 0x58, 0xb1, 0x7c, 0x50, 0xbd, 0x88, 0x5c, 0xb9, 0x82, 0x55, 0xc6, 0x8e, 0x62, 0xad, 0x7a, 0x51, 0xab, 0x76, 0x4c, 0xae, 0x7a, 0x50, 0x9f, 0x6c, 0x41, 0xaa, 0x73, 0x45, 0xb0, 0x7b, 0x51, 0xad, 0x7b, 0x54, 0xc7, 0x90, 0x63, 0xd2, 0x9c, 0x6e, 0xcd, 0x96, 0x6a, 0xb7, 0x83, 0x5a, 0xb4, 0x81, 0x56, 0xcb, 0x98, 0x6d, 0xc9, 0x98, 0x72, 0xb9, 0x84, 0x5b, 0xc6, 0x93, 0x68, 0xd4, 0xa1, 0x76, 0xcd, 0x98, 0x6c, 0xc3, 0x8e, 0x62, 0xbe, 0x88, 0x5c, 0xb7, 0x80, 0x54, 0xb0, 0x79, 0x4d, 0xae, 0x72, 0x49, 0xad, 0x6f, 0x44, 0xb9, 0x78, 0x48, 0xce, 0x89, 0x55, 0xca, 0x83, 0x4d, 0xc3, 0x7b, 0x44, 0xc5, 0x7f, 0x47, 0xa5, 0x6b, 0x39, 0xa5, 0x6c, 0x3c, 0xb0, 0x6f, 0x39, 0xa1, 0x63, 0x3c, 0xa0, 0x68, 0x46, 0xa0, 0x67, 0x3f, 0xaf, 0x76, 0x49, 0xa4, 0x69, 0x41, 0x98, 0x60, 0x34, 0x8e, 0x60, 0x3d, 0xaa, 0x6f, 0x42, 0xc1, 0x80, 0x54, 0xad, 0x6c, 0x40, 0xbb, 0x7c, 0x4d, 0x9c, 0x5c, 0x33, 0xa3, 0x64, 0x39, 0xb2, 0x72, 0x46, 0xcf, 0xbe, 0xb3, 0xf4, 0xf1, 0xf0, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf5, 0xf6, 0xf4, 0xd0, 0xd2, 0xce, 0xa8, 0xa7, 0xa1, 0x6d, 0x63, 0x5e, 0x57, 0x47, 0x3e, 0x52, 0x43, 0x39, 0xaf, 0x78, 0x4a, 0xc1, 0x7b, 0x4b, 0xa8, 0x68, 0x43, 0x94, 0x5d, 0x3b, 0x94, 0x60, 0x3d, 0x88, 0x57, 0x35, 0x93, 0x5d, 0x3f, 0x86, 0x59, 0x39, 0x7e, 0x50, 0x2f, 0x53, 0x31, 0x1b, 0x25, 0x0f, 0x07, 0x42, 0x21, 0x0d, 0x56, 0x34, 0x1a, 0x52, 0x31, 0x18, 0x94, 0x61, 0x38, 0xa4, 0x6c, 0x42, 0xa1, 0x68, 0x3f, 0x95, 0x5e, 0x34, 0x9c, 0x66, 0x3b, 0x98, 0x61, 0x37, 0xa9, 0x6e, 0x43, 0xac, 0x71, 0x44, 0xa7, 0x6a, 0x41, 0xa8, 0x6c, 0x44, 0xb7, 0x82, 0x5b, 0x91, 0x66, 0x42, 0xac, 0x7d, 0x58, 0xbe, 0x8b, 0x62, 0xc2, 0x94, 0x6b, 0xda, 0xa9, 0x7d, 0xdc, 0xaa, 0x7d, 0xca, 0x96, 0x6a, 0xc3, 0x8e, 0x61, 0xbd, 0x88, 0x5d, 0xae, 0x7c, 0x53, 0xb6, 0x84, 0x57, 0xa7, 0x7a, 0x50, 0xc9, 0x97, 0x6a, 0xc9, 0x92, 0x65, 0xc8, 0x8f, 0x61, 0xb1, 0x80, 0x57, 0x94, 0x66, 0x3e, 0x97, 0x65, 0x3c, 0xa2, 0x6f, 0x46, 0xad, 0x7a, 0x51, 0x91, 0x64, 0x40, 0xa0, 0x6f, 0x46, 0xc5, 0x8e, 0x61, 0xd7, 0x9d, 0x6d, 0xd1, 0x96, 0x6b, 0xd2, 0x9c, 0x71, 0xcd, 0x98, 0x67, 0xc2, 0x8d, 0x5e, 0xb4, 0x83, 0x56, 0xc4, 0x8f, 0x68, 0xc6, 0x91, 0x67, 0xce, 0x99, 0x6b, 0xd6, 0xa3, 0x76, 0xdb, 0xa8, 0x7b, 0xb5, 0x7e, 0x56, 0xac, 0x75, 0x4d, 0x9b, 0x67, 0x3f, 0x9d, 0x65, 0x3c, 0xb0, 0x74, 0x4a, 0xb3, 0x74, 0x46, 0xbb, 0x78, 0x46, 0xc5, 0x7e, 0x49, 0xd4, 0x8a, 0x53, 0xcb, 0x82, 0x48, 0xce, 0x86, 0x49, 0xb8, 0x73, 0x3e, 0xb3, 0x76, 0x48, 0x95, 0x65, 0x40, 0x80, 0x58, 0x39, 0x79, 0x4c, 0x2f, 0x77, 0x4b, 0x29, 0x6f, 0x47, 0x2a, 0x7f, 0x50, 0x30, 0xa4, 0x6d, 0x48, 0xa4, 0x67, 0x40, 0x9f, 0x64, 0x38, 0xa7, 0x68, 0x3f, 0xa5, 0x64, 0x3b, 0xa5, 0x62, 0x38, 0xaf, 0x6b, 0x40, 0xb1, 0x78, 0x52, 0xb7, 0xad, 0xa4, 0xd8, 0xd3, 0xcf, 0xf3, 0xf3, 0xf0, 0xfe, 0xfe, 0xfc, 0xfe, 0xfe, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xed, 0xec, 0xeb, 0xb7, 0xb6, 0xb2, 0x7b, 0x77, 0x71, 0x67, 0x5a, 0x55, 0x56, 0x45, 0x3b, 0x43, 0x35, 0x2e, 0x8c, 0x62, 0x43, 0xba, 0x77, 0x4a, 0xa3, 0x61, 0x3a, 0x84, 0x4d, 0x2a, 0x81, 0x4d, 0x2c, 0x93, 0x62, 0x3d, 0x9d, 0x67, 0x40, 0x91, 0x61, 0x3d, 0x7f, 0x52, 0x31, 0x5f, 0x3d, 0x27, 0x3d, 0x23, 0x15, 0x47, 0x2d, 0x1f, 0x3a, 0x24, 0x13, 0x69, 0x45, 0x25, 0xb2, 0x76, 0x48, 0xb8, 0x77, 0x47, 0xb8, 0x77, 0x46, 0xb8, 0x78, 0x46, 0xb3, 0x74, 0x42, 0xb0, 0x72, 0x43, 0xb4, 0x77, 0x4c, 0xbc, 0x80, 0x50, 0xc0, 0x85, 0x54, 0xc2, 0x8a, 0x5c, 0x99, 0x68, 0x44, 0xa2, 0x77, 0x53, 0xc3, 0x94, 0x70, 0xc2, 0x8f, 0x66, 0xbf, 0x8f, 0x66, 0xcd, 0x98, 0x6c, 0xca, 0x95, 0x69, 0xcb, 0x97, 0x6a, 0xbe, 0x89, 0x5d, 0xb5, 0x80, 0x54, 0xc4, 0x8d, 0x5e, 0xb8, 0x81, 0x52, 0xd1, 0x9a, 0x6b, 0xc3, 0x8b, 0x5b, 0xb9, 0x7e, 0x4f, 0xb4, 0x7f, 0x56, 0xa4, 0x74, 0x4b, 0x92, 0x64, 0x3c, 0x95, 0x66, 0x40, 0x9b, 0x68, 0x3f, 0xae, 0x7b, 0x53, 0x8a, 0x5d, 0x38, 0x96, 0x67, 0x42, 0xc2, 0x8e, 0x63, 0xcc, 0x93, 0x64, 0xc9, 0x92, 0x67, 0xc7, 0x94, 0x67, 0xbe, 0x8a, 0x61, 0xbd, 0x88, 0x65, 0xb3, 0x81, 0x55, 0xcd, 0x99, 0x6f, 0xcd, 0x98, 0x6e, 0xd3, 0x9f, 0x70, 0xd6, 0xa3, 0x76, 0xda, 0xa7, 0x7a, 0xd7, 0xa4, 0x7b, 0xbb, 0x87, 0x5f, 0xaa, 0x77, 0x4e, 0x95, 0x62, 0x3b, 0x9d, 0x67, 0x42, 0xa8, 0x70, 0x46, 0xa2, 0x65, 0x37, 0xbf, 0x7f, 0x4e, 0xc0, 0x7a, 0x45, 0xbb, 0x73, 0x3a, 0xc4, 0x7d, 0x44, 0xbc, 0x78, 0x43, 0xaf, 0x73, 0x46, 0x5a, 0x36, 0x19, 0x4c, 0x2e, 0x17, 0x5b, 0x39, 0x23, 0x5b, 0x3a, 0x20, 0x77, 0x50, 0x31, 0x8e, 0x5e, 0x3d, 0xa0, 0x69, 0x3c, 0xb8, 0x7c, 0x4d, 0xc2, 0x80, 0x4c, 0x90, 0x56, 0x30, 0x9f, 0x62, 0x3d, 0x9f, 0x5e, 0x36, 0xb9, 0x76, 0x4a, 0xb4, 0x8c, 0x72, 0xbe, 0xb6, 0xad, 0xd0, 0xca, 0xc5, 0xeb, 0xea, 0xe7, 0xfd, 0xfe, 0xfc, 0xfe, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf5, 0xf5, 0xd3, 0xd0, 0xcf, 0x96, 0x90, 0x8e, 0x5c, 0x53, 0x4f, 0x52, 0x42, 0x3e, 0x46, 0x34, 0x2c, 0x3a, 0x2c, 0x24, 0x59, 0x41, 0x36, 0xc0, 0x81, 0x55, 0xb9, 0x72, 0x46, 0x8b, 0x54, 0x2d, 0x78, 0x43, 0x27, 0x69, 0x37, 0x1c, 0x99, 0x65, 0x41, 0x97, 0x62, 0x3d, 0x6f, 0x46, 0x28, 0x64, 0x3c, 0x28, 0x55, 0x39, 0x24, 0x42, 0x26, 0x18, 0x24, 0x14, 0x08, 0x75, 0x56, 0x33, 0x86, 0x51, 0x27, 0xa0, 0x64, 0x38, 0xa4, 0x67, 0x39, 0x9f, 0x64, 0x37, 0x98, 0x5e, 0x30, 0x9a, 0x5e, 0x31, 0xc0, 0x82, 0x57, 0xc5, 0x88, 0x58, 0xbb, 0x82, 0x54, 0xb2, 0x85, 0x5f, 0x94, 0x6a, 0x4c, 0xca, 0x9e, 0x78, 0xc3, 0x94, 0x6f, 0xd3, 0xa1, 0x78, 0xcd, 0x98, 0x70, 0xc5, 0x8d, 0x62, 0xb9, 0x84, 0x58, 0xca, 0x95, 0x69, 0xc9, 0x94, 0x68, 0xb5, 0x82, 0x56, 0xb1, 0x7e, 0x53, 0xb8, 0x85, 0x5a, 0xb0, 0x7a, 0x4e, 0xac, 0x79, 0x53, 0x93, 0x67, 0x44, 0xaf, 0x7d, 0x55, 0xbf, 0x87, 0x5a, 0x98, 0x6a, 0x42, 0x7e, 0x54, 0x31, 0xa1, 0x6f, 0x46, 0x93, 0x63, 0x3c, 0xa5, 0x72, 0x48, 0x96, 0x6b, 0x47, 0xb2, 0x81, 0x58, 0xc6, 0x92, 0x66, 0xd2, 0x9e, 0x71, 0xd0, 0xa1, 0x73, 0xbf, 0x8f, 0x67, 0xa6, 0x75, 0x51, 0xb6, 0x82, 0x5b, 0xcc, 0x99, 0x6c, 0xd9, 0xa4, 0x7b, 0xde, 0xaa, 0x7b, 0xd7, 0xa4, 0x77, 0xd2, 0x9f, 0x72, 0xd5, 0xa5, 0x7a, 0xdc, 0xac, 0x82, 0xbe, 0x8b, 0x61, 0x90, 0x60, 0x3d, 0x7a, 0x4d, 0x2e, 0x90, 0x60, 0x3a, 0x94, 0x5f, 0x38, 0x93, 0x5a, 0x30, 0xad, 0x6e, 0x41, 0xbd, 0x7b, 0x47, 0xba, 0x77, 0x43, 0xb0, 0x71, 0x3b, 0x97, 0x62, 0x37, 0x62, 0x3d, 0x1f, 0x4d, 0x2d, 0x14, 0x5c, 0x3a, 0x23, 0x79, 0x57, 0x3b, 0x93, 0x68, 0x46, 0x99, 0x65, 0x42, 0x9d, 0x63, 0x3f, 0x9a, 0x5c, 0x33, 0xaf, 0x72, 0x45, 0xa2, 0x64, 0x39, 0xa5, 0x61, 0x37, 0xc0, 0x76, 0x46, 0xcb, 0x87, 0x58, 0xa2, 0x8f, 0x7f, 0xb6, 0xaf, 0xa5, 0xdb, 0xd5, 0xd0, 0xdd, 0xdc, 0xd9, 0xed, 0xed, 0xeb, 0xfc, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfa, 0xeb, 0xeb, 0xe9, 0xaa, 0xa7, 0xa5, 0x64, 0x5e, 0x5c, 0x52, 0x4a, 0x47, 0x3e, 0x33, 0x2c, 0x34, 0x2a, 0x24, 0x32, 0x22, 0x1f, 0x35, 0x26, 0x1c, 0x8f, 0x67, 0x44, 0xc7, 0x80, 0x51, 0x9d, 0x61, 0x3b, 0x81, 0x4d, 0x2d, 0x6f, 0x41, 0x26, 0x5f, 0x35, 0x1d, 0x71, 0x45, 0x2e, 0x8a, 0x61, 0x42, 0x86, 0x5d, 0x3e, 0x72, 0x50, 0x39, 0x42, 0x27, 0x1c, 0x25, 0x14, 0x07, 0x25, 0x12, 0x08, 0x3f, 0x25, 0x16, 0x80, 0x54, 0x32, 0xba, 0x7d, 0x4c, 0xb6, 0x7b, 0x4c, 0xae, 0x72, 0x43, 0xc0, 0x82, 0x50, 0xcb, 0x8e, 0x5d, 0xb6, 0x7e, 0x51, 0x94, 0x64, 0x3f, 0x8b, 0x64, 0x46, 0xb7, 0x91, 0x6f, 0xd8, 0xad, 0x88, 0xd7, 0xa5, 0x7c, 0xda, 0xa8, 0x7f, 0xcb, 0x96, 0x6c, 0xd0, 0x9a, 0x70, 0xcc, 0x97, 0x6b, 0xc5, 0x90, 0x64, 0xb6, 0x83, 0x58, 0xa0, 0x72, 0x49, 0xa6, 0x75, 0x4a, 0xbd, 0x88, 0x5a, 0xb9, 0x84, 0x56, 0xb6, 0x81, 0x57, 0xb3, 0x7e, 0x56, 0xa4, 0x75, 0x50, 0xb3, 0x7d, 0x53, 0xa1, 0x6d, 0x44, 0x73, 0x4e, 0x2e, 0x94, 0x68, 0x41, 0x81, 0x5a, 0x3b, 0xad, 0x79, 0x51, 0xa6, 0x7a, 0x4e, 0x75, 0x4a, 0x2a, 0xc1, 0x8c, 0x5e, 0xc4, 0x8d, 0x61, 0xd2, 0x9a, 0x6f, 0xbc, 0x87, 0x5d, 0xc3, 0x8e, 0x5f, 0xcd, 0x98, 0x6e, 0xbf, 0x89, 0x60, 0xdc, 0xa7, 0x7b, 0xdb, 0xa6, 0x7a, 0xd8, 0xa3, 0x77, 0xdd, 0xa9, 0x7c, 0xd5, 0xa2, 0x75, 0xd8, 0xa5, 0x78, 0xe0, 0xb0, 0x89, 0xc7, 0x99, 0x75, 0x85, 0x59, 0x35, 0x8f, 0x61, 0x3a, 0x90, 0x64, 0x40, 0x87, 0x53, 0x30, 0x86, 0x4f, 0x26, 0x9e, 0x61, 0x35, 0x9f, 0x63, 0x34, 0xa2, 0x6d, 0x46, 0x49, 0x2a, 0x14, 0x40, 0x23, 0x0f, 0x68, 0x42, 0x28, 0x69, 0x42, 0x26, 0x83, 0x58, 0x38, 0x9f, 0x6f, 0x4d, 0xa7, 0x6f, 0x46, 0xc5, 0x87, 0x5f, 0xc0, 0x83, 0x56, 0xc3, 0x83, 0x55, 0xc5, 0x7f, 0x4f, 0xbf, 0x76, 0x46, 0xc7, 0x7c, 0x47, 0xb0, 0x81, 0x62, 0xb8, 0xa7, 0x9c, 0xb3, 0xa9, 0x9f, 0xbe, 0xb8, 0xaf, 0xde, 0xdc, 0xd8, 0xef, 0xf0, 0xed, 0xfc, 0xfc, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xf8, 0xd8, 0xd8, 0xd6, 0x7a, 0x77, 0x75, 0x4d, 0x48, 0x46, 0x42, 0x3c, 0x3a, 0x39, 0x31, 0x2f, 0x2a, 0x22, 0x1f, 0x35, 0x25, 0x22, 0x2e, 0x20, 0x17, 0x32, 0x21, 0x17, 0xaa, 0x75, 0x50, 0xb1, 0x6f, 0x45, 0x91, 0x58, 0x35, 0x8e, 0x5d, 0x39, 0x87, 0x5a, 0x3a, 0x82, 0x59, 0x3f, 0x61, 0x3d, 0x25, 0x5a, 0x38, 0x21, 0x33, 0x1a, 0x0a, 0x41, 0x2a, 0x1b, 0x46, 0x2f, 0x1e, 0x23, 0x1a, 0x13, 0x24, 0x15, 0x09, 0x63, 0x40, 0x25, 0xa0, 0x67, 0x3a, 0xb9, 0x79, 0x46, 0xbe, 0x80, 0x4e, 0xb1, 0x78, 0x4a, 0x8f, 0x5d, 0x35, 0x89, 0x5d, 0x3a, 0x80, 0x5a, 0x3d, 0xb4, 0x8d, 0x70, 0xd5, 0xa9, 0x85, 0xde, 0xaf, 0x87, 0xdb, 0xaa, 0x80, 0xcc, 0x9b, 0x71, 0xd6, 0xa6, 0x7b, 0xd2, 0xa2, 0x76, 0xcf, 0x9a, 0x6e, 0xd1, 0x9c, 0x70, 0xcf, 0x9d, 0x72, 0xc1, 0x8b, 0x5c, 0xbe, 0x86, 0x57, 0xb0, 0x7c, 0x50, 0xa4, 0x6a, 0x45, 0xac, 0x71, 0x49, 0xc3, 0x8b, 0x5f, 0xbd, 0x86, 0x5a, 0x8f, 0x60, 0x3c, 0xaa, 0x76, 0x4d, 0x77, 0x51, 0x31, 0x83, 0x60, 0x40, 0x66, 0x46, 0x2c, 0x9b, 0x69, 0x40, 0xa9, 0x75, 0x4a, 0x74, 0x50, 0x30, 0x92, 0x62, 0x41, 0xa6, 0x73, 0x4a, 0xa8, 0x75, 0x4d, 0xad, 0x78, 0x4f, 0xcc, 0x98, 0x69, 0xda, 0xa6, 0x76, 0xd4, 0xa0, 0x70, 0xd5, 0xa1, 0x74, 0xd8, 0xa3, 0x77, 0xda, 0xa5, 0x79, 0xcd, 0x98, 0x6c, 0xe4, 0xb1, 0x84, 0xdb, 0xa9, 0x7c, 0xe4, 0xb5, 0x8e, 0xe5, 0xb7, 0x92, 0xb5, 0x86, 0x63, 0x85, 0x5b, 0x3c, 0x98, 0x68, 0x45, 0x8c, 0x59, 0x35, 0x8e, 0x57, 0x2f, 0x9c, 0x5f, 0x35, 0x9b, 0x5f, 0x30, 0x6b, 0x43, 0x1f, 0x52, 0x34, 0x1b, 0x59, 0x37, 0x1f, 0x56, 0x35, 0x1e, 0x5f, 0x3d, 0x24, 0x67, 0x40, 0x24, 0x97, 0x69, 0x46, 0xad, 0x76, 0x4d, 0xa3, 0x6d, 0x44, 0xaf, 0x6e, 0x43, 0xc9, 0x84, 0x54, 0xd3, 0x8a, 0x56, 0xd6, 0x88, 0x53, 0xb2, 0x78, 0x4f, 0x84, 0x6a, 0x5a, 0x98, 0x89, 0x80, 0xb3, 0xa4, 0x98, 0xc5, 0xbf, 0xb7, 0xd3, 0xd1, 0xcd, 0xe9, 0xea, 0xe8, 0xfb, 0xfb, 0xf9, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xdd, 0xdb, 0xd9, 0xa1, 0x9f, 0x9c, 0x6d, 0x69, 0x64, 0x4f, 0x48, 0x43, 0x3c, 0x34, 0x2f, 0x33, 0x2a, 0x25, 0x29, 0x1f, 0x19, 0x3b, 0x2a, 0x22, 0x2b, 0x1a, 0x12, 0x29, 0x1b, 0x12, 0x44, 0x31, 0x23, 0xbc, 0x7b, 0x4c, 0x9c, 0x65, 0x40, 0x97, 0x65, 0x42, 0x8f, 0x63, 0x42, 0x6e, 0x46, 0x2e, 0x4f, 0x2e, 0x1c, 0x48, 0x2c, 0x1c, 0x36, 0x20, 0x12, 0x31, 0x20, 0x12, 0x40, 0x29, 0x17, 0x51, 0x32, 0x1d, 0x58, 0x37, 0x1c, 0x66, 0x3f, 0x23, 0x75, 0x47, 0x27, 0x85, 0x52, 0x2e, 0x9f, 0x63, 0x3c, 0x90, 0x5e, 0x3b, 0x87, 0x5c, 0x3b, 0x71, 0x4d, 0x30, 0x97, 0x71, 0x53, 0xe0, 0xb4, 0x94, 0xd2, 0xa4, 0x80, 0xd4, 0xa3, 0x7a, 0xc7, 0x9a, 0x6f, 0xcb, 0x9e, 0x73, 0xe2, 0xb7, 0x8e, 0xd9, 0xa9, 0x7e, 0xd5, 0xa2, 0x75, 0xd1, 0x9e, 0x71, 0xcf, 0x99, 0x6b, 0xc8, 0x92, 0x64, 0xc2, 0x8b, 0x5f, 0xbd, 0x86, 0x5a, 0xad, 0x71, 0x44, 0xad, 0x73, 0x4a, 0xbb, 0x82, 0x59, 0xa3, 0x6e, 0x42, 0x9e, 0x70, 0x48, 0xb1, 0x83, 0x5c, 0x94, 0x69, 0x45, 0x68, 0x50, 0x39, 0x46, 0x2f, 0x1c, 0xb7, 0x82, 0x56, 0xbd, 0x87, 0x5e, 0x77, 0x55, 0x37, 0x8a, 0x62, 0x3f, 0xac, 0x77, 0x4d, 0xac, 0x72, 0x44, 0xa5, 0x6f, 0x46, 0xac, 0x78, 0x53, 0xce, 0x97, 0x6b, 0xd9, 0xa2, 0x77, 0xe2, 0xb3, 0x8a, 0xdd, 0xa9, 0x7d, 0xd8, 0xa3, 0x77, 0xc7, 0x92, 0x66, 0xe3, 0xae, 0x84, 0xde, 0xa9, 0x7f, 0xe0, 0xae, 0x84, 0xf3, 0xc6, 0x9f, 0xe0, 0xb5, 0x90, 0xa0, 0x73, 0x53, 0x81, 0x55, 0x39, 0x87, 0x5a, 0x35, 0x8b, 0x5b, 0x31, 0x8d, 0x58, 0x2f, 0xb1, 0x74, 0x44, 0xb8, 0x7f, 0x53, 0xbf, 0x8c, 0x64, 0xbd, 0x8b, 0x62, 0xa1, 0x75, 0x51, 0x9c, 0x6d, 0x48, 0x8a, 0x5f, 0x3e, 0x93, 0x67, 0x47, 0x8e, 0x61, 0x42, 0x81, 0x50, 0x30, 0x9f, 0x65, 0x3d, 0xbe, 0x7e, 0x50, 0xc9, 0x7f, 0x53, 0xa7, 0x6d, 0x43, 0x74, 0x59, 0x3f, 0x88, 0x72, 0x63, 0x94, 0x8a, 0x7c, 0xb1, 0xab, 0xa0, 0xcd, 0xc7, 0xbf, 0xd9, 0xd7, 0xd2, 0xdd, 0xdc, 0xd8, 0xf6, 0xf5, 0xf2, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xe7, 0xe7, 0xe7, 0xc5, 0xc4, 0xc1, 0x8c, 0x8b, 0x88, 0x78, 0x73, 0x6e, 0x43, 0x3c, 0x36, 0x2f, 0x27, 0x22, 0x2c, 0x23, 0x1e, 0x2f, 0x24, 0x1e, 0x2e, 0x1d, 0x15, 0x2b, 0x1a, 0x12, 0x28, 0x17, 0x10, 0x26, 0x17, 0x12, 0x51, 0x34, 0x20, 0x90, 0x5d, 0x3c, 0x8f, 0x63, 0x44, 0x75, 0x4e, 0x32, 0x6c, 0x46, 0x2a, 0x77, 0x51, 0x34, 0x78, 0x54, 0x38, 0x78, 0x53, 0x35, 0xa2, 0x73, 0x4e, 0x93, 0x67, 0x44, 0x86, 0x58, 0x34, 0x60, 0x38, 0x20, 0x4e, 0x2e, 0x1a, 0x44, 0x29, 0x16, 0x39, 0x20, 0x0f, 0x74, 0x4e, 0x33, 0x74, 0x4a, 0x2f, 0x60, 0x3c, 0x22, 0x86, 0x6a, 0x4a, 0xca, 0x9f, 0x7b, 0xe4, 0xb7, 0x8e, 0xe1, 0xb3, 0x8e, 0xcd, 0x9c, 0x73, 0xc3, 0x95, 0x6e, 0xcd, 0x9f, 0x78, 0xe0, 0xb1, 0x8a, 0xc6, 0x92, 0x68, 0xd0, 0x97, 0x69, 0xcc, 0x94, 0x65, 0xd8, 0xa1, 0x73, 0xd1, 0x9a, 0x6d, 0xdc, 0xa2, 0x74, 0xcd, 0x93, 0x65, 0xb9, 0x7d, 0x4f, 0xa4, 0x6a, 0x41, 0x9c, 0x62, 0x3d, 0xa9, 0x73, 0x4d, 0xa6, 0x77, 0x4f, 0xb3, 0x82, 0x58, 0xb2, 0x80, 0x56, 0x88, 0x61, 0x3e, 0x64, 0x43, 0x26, 0xaa, 0x7a, 0x50, 0xa6, 0x72, 0x4d, 0x91, 0x63, 0x3d, 0x95, 0x6a, 0x43, 0x9d, 0x68, 0x3e, 0xac, 0x72, 0x44, 0xb7, 0x7c, 0x51, 0xb2, 0x7c, 0x53, 0xb5, 0x7e, 0x53, 0xce, 0x97, 0x6c, 0xda, 0xa6, 0x7b, 0xdc, 0xa6, 0x76, 0xe5, 0xb0, 0x84, 0xde, 0xa9, 0x7d, 0xc8, 0x93, 0x68, 0xce, 0x98, 0x6e, 0xdb, 0xa6, 0x7a, 0xe8, 0xb7, 0x8d, 0xe7, 0xba, 0x94, 0xe0, 0xb4, 0x90, 0xa3, 0x77, 0x55, 0x6e, 0x43, 0x28, 0x76, 0x4c, 0x31, 0x82, 0x55, 0x32, 0xa5, 0x70, 0x46, 0xc4, 0x8a, 0x5b, 0xd6, 0x9b, 0x6d, 0xe8, 0xad, 0x77, 0xe7, 0xab, 0x73, 0xd8, 0x98, 0x63, 0xcc, 0x91, 0x5e, 0xc7, 0x91, 0x64, 0xca, 0x94, 0x67, 0xb8, 0x7f, 0x54, 0xb3, 0x76, 0x49, 0xae, 0x6f, 0x43, 0x79, 0x4d, 0x2f, 0x60, 0x43, 0x2c, 0x7b, 0x5d, 0x45, 0x82, 0x65, 0x50, 0x9e, 0x8b, 0x7d, 0xae, 0xa4, 0x9a, 0xd5, 0xce, 0xc7, 0xe0, 0xde, 0xd9, 0xd2, 0xd1, 0xcd, 0xee, 0xed, 0xea, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf3, 0xf3, 0xf2, 0xda, 0xdb, 0xd9, 0xb9, 0xb8, 0xb5, 0xa1, 0x9c, 0x9a, 0x4a, 0x44, 0x42, 0x3d, 0x35, 0x32, 0x36, 0x2b, 0x26, 0x2b, 0x1e, 0x1b, 0x2d, 0x20, 0x1b, 0x31, 0x1f, 0x18, 0x2f, 0x1b, 0x11, 0x25, 0x14, 0x0e, 0x1c, 0x13, 0x12, 0x37, 0x24, 0x17, 0x56, 0x38, 0x20, 0x82, 0x57, 0x36, 0x98, 0x69, 0x47, 0x83, 0x5b, 0x39, 0xa3, 0x6e, 0x46, 0xbb, 0x87, 0x54, 0xc3, 0x85, 0x54, 0xbf, 0x85, 0x55, 0xb6, 0x7f, 0x56, 0x93, 0x62, 0x41, 0x6b, 0x44, 0x28, 0x50, 0x2e, 0x19, 0x39, 0x1b, 0x0b, 0x46, 0x28, 0x14, 0x61, 0x41, 0x28, 0x55, 0x37, 0x1f, 0x90, 0x6f, 0x53, 0xbd, 0x96, 0x73, 0xd3, 0xa6, 0x7f, 0xce, 0xa0, 0x78, 0xc8, 0x9a, 0x76, 0xcd, 0x9e, 0x78, 0xc4, 0x9a, 0x72, 0xb9, 0x8b, 0x68, 0xd1, 0x9d, 0x75, 0xcb, 0x96, 0x6d, 0xcf, 0x95, 0x67, 0xd4, 0x99, 0x6c, 0xd7, 0x9f, 0x72, 0xd1, 0x99, 0x6c, 0xc5, 0x8a, 0x5a, 0xc3, 0x87, 0x5b, 0xb6, 0x7a, 0x4e, 0xb2, 0x7a, 0x52, 0xa9, 0x70, 0x4a, 0x9c, 0x66, 0x3f, 0xb6, 0x83, 0x59, 0xb6, 0x83, 0x57, 0xa7, 0x74, 0x48, 0xa5, 0x72, 0x49, 0x96, 0x6b, 0x4a, 0xbd, 0x89, 0x5e, 0xab, 0x77, 0x4f, 0xab, 0x76, 0x4e, 0x94, 0x64, 0x3f, 0xa6, 0x6d, 0x46, 0xb7, 0x76, 0x4a, 0xc2, 0x82, 0x54, 0xca, 0x8f, 0x61, 0xc3, 0x8b, 0x5f, 0xc5, 0x8d, 0x61, 0xd6, 0xa0, 0x72, 0xe1, 0xab, 0x7f, 0xeb, 0xb6, 0x8a, 0xda, 0xa3, 0x74, 0xc8, 0x93, 0x67, 0xcf, 0x9d, 0x73, 0xdb, 0xa9, 0x7f, 0xd6, 0xa4, 0x7a, 0xe7, 0xb8, 0x91, 0xe3, 0xb7, 0x90, 0xd0, 0xa3, 0x7b, 0xa4, 0x78, 0x55, 0x79, 0x52, 0x32, 0x84, 0x57, 0x34, 0xb2, 0x7f, 0x57, 0xd4, 0x98, 0x68, 0xe0, 0x9f, 0x6a, 0xe3, 0xa4, 0x6d, 0xe8, 0xa7, 0x6e, 0xe0, 0x9e, 0x68, 0xd4, 0x94, 0x5e, 0xda, 0x98, 0x5f, 0xda, 0x97, 0x5f, 0xd3, 0x97, 0x68, 0xa7, 0x74, 0x45, 0x84, 0x54, 0x32, 0x6f, 0x4c, 0x33, 0x77, 0x4f, 0x37, 0x83, 0x59, 0x3d, 0x84, 0x62, 0x4a, 0x87, 0x6d, 0x5c, 0x8f, 0x7d, 0x6f, 0xab, 0xa1, 0x98, 0xcc, 0xc7, 0xc4, 0xe2, 0xe0, 0xdd, 0xe9, 0xeb, 0xe5, 0xf9, 0xf9, 0xf8, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xe9, 0xea, 0xe8, 0xdc, 0xdc, 0xda, 0xac, 0xab, 0xa8, 0x64, 0x5e, 0x5c, 0x40, 0x38, 0x36, 0x3b, 0x30, 0x2a, 0x3b, 0x2c, 0x25, 0x31, 0x21, 0x1b, 0x2e, 0x1f, 0x18, 0x2d, 0x1a, 0x14, 0x30, 0x1a, 0x10, 0x22, 0x11, 0x0a, 0x21, 0x13, 0x0d, 0x21, 0x17, 0x10, 0x52, 0x38, 0x22, 0x8c, 0x63, 0x40, 0xac, 0x79, 0x4d, 0xcb, 0x94, 0x64, 0xd6, 0x93, 0x62, 0xd6, 0x94, 0x5f, 0xd1, 0x8e, 0x59, 0xbe, 0x7e, 0x4b, 0xb2, 0x76, 0x4b, 0xa4, 0x6d, 0x46, 0x82, 0x54, 0x33, 0x64, 0x3f, 0x22, 0x54, 0x33, 0x19, 0x4d, 0x2f, 0x14, 0x6c, 0x4c, 0x2c, 0x9c, 0x76, 0x51, 0xcc, 0x9c, 0x74, 0xd9, 0xa9, 0x80, 0xd3, 0xa5, 0x7f, 0xd7, 0xa9, 0x83, 0xb8, 0x89, 0x65, 0xbc, 0x8e, 0x6a, 0xb6, 0x89, 0x69, 0xab, 0x79, 0x58, 0xc5, 0x91, 0x65, 0xde, 0xa9, 0x7d, 0xce, 0x93, 0x67, 0xd2, 0x97, 0x6b, 0xcc, 0x91, 0x62, 0xc4, 0x89, 0x5a, 0xbe, 0x84, 0x53, 0xbc, 0x80, 0x56, 0xb3, 0x78, 0x4c, 0xb0, 0x7a, 0x51, 0xad, 0x76, 0x50, 0x98, 0x65, 0x3e, 0xc0, 0x8f, 0x66, 0xaf, 0x7c, 0x53, 0xa0, 0x6d, 0x45, 0xae, 0x79, 0x50, 0x8f, 0x64, 0x42, 0xbd, 0x86, 0x5a, 0xaa, 0x74, 0x4a, 0xa0, 0x6a, 0x45, 0x96, 0x65, 0x42, 0xa6, 0x6f, 0x48, 0xbc, 0x7d, 0x50, 0xc6, 0x84, 0x57, 0xd4, 0x98, 0x68, 0xcc, 0x90, 0x62, 0xd5, 0x9a, 0x6b, 0xca, 0x90, 0x62, 0xdb, 0xa6, 0x7c, 0xe4, 0xaf, 0x83, 0xdf, 0xa7, 0x78, 0xd0, 0x98, 0x69, 0xe0, 0xac, 0x80, 0xdd, 0xab, 0x82, 0xdc, 0xab, 0x81, 0xdd, 0xaf, 0x87, 0xee, 0xc3, 0x9b, 0xe9, 0xbb, 0x94, 0xc6, 0x96, 0x70, 0xa2, 0x73, 0x4e, 0xab, 0x79, 0x52, 0xc7, 0x91, 0x67, 0xe1, 0xae, 0x80, 0xe2, 0xaa, 0x7a, 0xe1, 0xa3, 0x75, 0xd6, 0x98, 0x69, 0xd3, 0x8e, 0x5c, 0xd0, 0x8c, 0x5a, 0xcd, 0x89, 0x52, 0xd2, 0x8e, 0x57, 0xe3, 0x9e, 0x68, 0xc0, 0x89, 0x57, 0x70, 0x4f, 0x2f, 0x59, 0x3e, 0x24, 0x76, 0x55, 0x32, 0x7d, 0x5b, 0x3e, 0x93, 0x70, 0x57, 0x9a, 0x7a, 0x64, 0x9d, 0x82, 0x6f, 0xa2, 0x91, 0x83, 0xbf, 0xb5, 0xad, 0xda, 0xd6, 0xcf, 0xe9, 0xe9, 0xe4, 0xf6, 0xf6, 0xf4, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xd7, 0xd8, 0xd6, 0xd8, 0xd8, 0xd6, 0x94, 0x92, 0x8f, 0x52, 0x4b, 0x49, 0x3e, 0x34, 0x2f, 0x3d, 0x2e, 0x26, 0x3a, 0x29, 0x1e, 0x31, 0x1f, 0x15, 0x2a, 0x19, 0x10, 0x28, 0x15, 0x0e, 0x30, 0x1a, 0x10, 0x25, 0x12, 0x0b, 0x39, 0x22, 0x14, 0x36, 0x22, 0x0f, 0x44, 0x27, 0x15, 0xa0, 0x78, 0x51, 0xdb, 0xa1, 0x6d, 0xd5, 0x98, 0x64, 0xc6, 0x86, 0x56, 0xb4, 0x73, 0x47, 0xb1, 0x75, 0x45, 0xb2, 0x7a, 0x4d, 0x92, 0x5e, 0x38, 0x90, 0x5f, 0x3c, 0x74, 0x4c, 0x2e, 0x5d, 0x37, 0x1d, 0x58, 0x33, 0x1b, 0x7e, 0x56, 0x3a, 0xbc, 0x8c, 0x64, 0xc8, 0x90, 0x63, 0xc1, 0x8f, 0x65, 0xdf, 0xb2, 0x8b, 0xc2, 0x94, 0x6e, 0xd0, 0xa2, 0x7c, 0xb7, 0x89, 0x64, 0xbd, 0x8f, 0x6a, 0xd4, 0xa4, 0x7e, 0xd0, 0x9c, 0x6c, 0xd5, 0xa0, 0x6f, 0xcf, 0x9a, 0x6a, 0xbc, 0x82, 0x56, 0xbe, 0x83, 0x57, 0xbd, 0x7f, 0x4e, 0xc5, 0x87, 0x56, 0xcb, 0x91, 0x61, 0xc6, 0x8a, 0x60, 0xc3, 0x89, 0x5d, 0xa3, 0x6e, 0x45, 0xa5, 0x70, 0x4d, 0x98, 0x67, 0x44, 0x9e, 0x6e, 0x49, 0x8c, 0x57, 0x32, 0xa4, 0x71, 0x4b, 0xb0, 0x7c, 0x52, 0x75, 0x4b, 0x28, 0xb9, 0x82, 0x56, 0x9b, 0x65, 0x3b, 0x9c, 0x67, 0x41, 0x8f, 0x5f, 0x3b, 0x9e, 0x6b, 0x43, 0xbc, 0x81, 0x52, 0xc6, 0x86, 0x57, 0xd6, 0x9a, 0x6a, 0xcd, 0x8f, 0x5e, 0xd4, 0x96, 0x65, 0xc0, 0x82, 0x56, 0xb6, 0x7d, 0x54, 0xcd, 0x98, 0x6c, 0xdb, 0xa3, 0x72, 0xdf, 0xa3, 0x72, 0xe7, 0xb0, 0x82, 0xe1, 0xaf, 0x85, 0xe2, 0xb1, 0x88, 0xe0, 0xb1, 0x89, 0xef, 0xc4, 0x9d, 0xe4, 0xb6, 0x8f, 0xd9, 0xa5, 0x7d, 0xb7, 0x7f, 0x52, 0xb2, 0x7c, 0x52, 0xd2, 0x98, 0x6b, 0xe4, 0xb0, 0x7e, 0xef, 0xb6, 0x80, 0xf1, 0xbb, 0x89, 0xe8, 0xb2, 0x80, 0xdc, 0xa3, 0x70, 0xdc, 0xa4, 0x71, 0xdc, 0x9d, 0x68, 0xde, 0x9f, 0x6b, 0xd5, 0x94, 0x5d, 0xb7, 0x85, 0x5a, 0x62, 0x41, 0x2b, 0x6b, 0x4a, 0x35, 0x72, 0x4b, 0x30, 0x83, 0x5b, 0x3d, 0x97, 0x6d, 0x4d, 0xa8, 0x7f, 0x63, 0xa9, 0x89, 0x71, 0xa6, 0x8e, 0x7b, 0xb4, 0xa6, 0x96, 0xb3, 0xab, 0xa1, 0xed, 0xea, 0xe8, 0xf6, 0xf6, 0xf3, 0xfa, 0xfb, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf1, 0xf1, 0xf1, 0xcf, 0xcd, 0xcc, 0xac, 0xa5, 0xa2, 0x5e, 0x58, 0x50, 0x41, 0x37, 0x30, 0x4d, 0x3e, 0x38, 0x46, 0x35, 0x2f, 0x34, 0x23, 0x1d, 0x31, 0x20, 0x19, 0x28, 0x18, 0x11, 0x25, 0x12, 0x0b, 0x45, 0x2f, 0x24, 0x44, 0x30, 0x24, 0x34, 0x21, 0x11, 0x79, 0x5d, 0x45, 0x8a, 0x65, 0x46, 0xa4, 0x7a, 0x59, 0xb2, 0x80, 0x58, 0xad, 0x78, 0x4f, 0x98, 0x63, 0x3f, 0x9c, 0x6c, 0x4a, 0xad, 0x76, 0x4d, 0xb3, 0x7c, 0x4d, 0xbd, 0x87, 0x58, 0x9f, 0x6b, 0x46, 0x86, 0x5c, 0x38, 0x84, 0x5e, 0x3a, 0x8d, 0x63, 0x3d, 0xac, 0x7a, 0x51, 0xbf, 0x8a, 0x5f, 0xd3, 0x9f, 0x74, 0xe0, 0xaf, 0x84, 0xc6, 0x99, 0x74, 0xae, 0x7f, 0x5d, 0xc1, 0x8f, 0x6b, 0xca, 0x99, 0x70, 0xe1, 0xb0, 0x87, 0xe0, 0xaa, 0x7b, 0xd8, 0x9f, 0x6c, 0xd5, 0x99, 0x67, 0xc3, 0x8c, 0x5e, 0xaa, 0x73, 0x47, 0xbc, 0x7f, 0x4f, 0xd2, 0x94, 0x63, 0xc0, 0x82, 0x51, 0xca, 0x8f, 0x63, 0xc9, 0x8e, 0x62, 0xbb, 0x86, 0x58, 0xa6, 0x71, 0x47, 0x9b, 0x66, 0x44, 0x8e, 0x59, 0x36, 0x9a, 0x67, 0x3f, 0xad, 0x77, 0x4c, 0xb1, 0x79, 0x4e, 0xb6, 0x80, 0x56, 0x74, 0x4e, 0x2d, 0xb2, 0x7b, 0x4f, 0xb3, 0x7e, 0x54, 0xa0, 0x6f, 0x48, 0x91, 0x60, 0x39, 0x97, 0x61, 0x3c, 0xb5, 0x7b, 0x4e, 0xcb, 0x91, 0x60, 0xe0, 0xa6, 0x76, 0xd2, 0x97, 0x68, 0xbe, 0x7f, 0x4d, 0xbb, 0x7f, 0x52, 0xa8, 0x6c, 0x3f, 0xb0, 0x73, 0x48, 0xca, 0x8e, 0x5f, 0xe1, 0xa1, 0x70, 0xeb, 0xb3, 0x82, 0xe6, 0xb1, 0x83, 0xe9, 0xb5, 0x8a, 0xde, 0xaf, 0x86, 0xdf, 0xb4, 0x8e, 0xdf, 0xac, 0x81, 0xd7, 0xa3, 0x78, 0xbb, 0x84, 0x55, 0xb5, 0x79, 0x4f, 0xcd, 0x8c, 0x5e, 0xe6, 0xaa, 0x78, 0xe4, 0xa8, 0x77, 0xe9, 0xaa, 0x77, 0xef, 0xb0, 0x7c, 0xde, 0x9d, 0x68, 0xdf, 0x9f, 0x6a, 0xe0, 0x9f, 0x6a, 0xe2, 0xa5, 0x73, 0xd3, 0x99, 0x67, 0xba, 0x8d, 0x65, 0x72, 0x4f, 0x30, 0x6e, 0x4b, 0x2f, 0x6d, 0x4b, 0x31, 0x7a, 0x54, 0x37, 0x89, 0x5f, 0x3f, 0x9c, 0x71, 0x52, 0xaf, 0x91, 0x7d, 0xc5, 0xae, 0x9c, 0xb9, 0xaa, 0x9b, 0xcc, 0xc2, 0xb6, 0xc8, 0xc1, 0xb9, 0xed, 0xe9, 0xe3, 0xfc, 0xfc, 0xfa, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf7, 0xf7, 0xf7, 0xbf, 0xbd, 0xbc, 0x9b, 0x94, 0x91, 0x62, 0x59, 0x53, 0x5b, 0x4c, 0x48, 0x54, 0x40, 0x39, 0x41, 0x2d, 0x23, 0x34, 0x21, 0x18, 0x29, 0x18, 0x11, 0x26, 0x15, 0x0f, 0x25, 0x12, 0x0c, 0x31, 0x1b, 0x10, 0x4b, 0x33, 0x1f, 0x50, 0x38, 0x21, 0x86, 0x66, 0x48, 0xa6, 0x7d, 0x58, 0xb6, 0x85, 0x5e, 0xb6, 0x84, 0x5c, 0xad, 0x77, 0x53, 0xa8, 0x74, 0x4b, 0xab, 0x77, 0x4c, 0xb0, 0x7b, 0x50, 0xc1, 0x86, 0x54, 0xc9, 0x8e, 0x5d, 0xce, 0x96, 0x64, 0xb8, 0x7f, 0x53, 0xb2, 0x79, 0x4e, 0xaf, 0x77, 0x4f, 0xa2, 0x6d, 0x47, 0xa8, 0x72, 0x4e, 0xd1, 0x9c, 0x75, 0xdf, 0xae, 0x85, 0xd1, 0xa4, 0x7e, 0xc1, 0x93, 0x6d, 0xba, 0x89, 0x5f, 0xd7, 0xa3, 0x76, 0xda, 0xa6, 0x79, 0xda, 0xa0, 0x72, 0xda, 0x9c, 0x6a, 0xce, 0x92, 0x60, 0xaf, 0x78, 0x4a, 0xbd, 0x81, 0x51, 0xcf, 0x8f, 0x5d, 0xd8, 0x9a, 0x68, 0xb9, 0x7b, 0x4a, 0xce, 0x93, 0x67, 0xd2, 0x97, 0x6b, 0xc9, 0x90, 0x5f, 0xae, 0x74, 0x48, 0x91, 0x5b, 0x36, 0x9f, 0x6b, 0x43, 0xb5, 0x80, 0x55, 0xc4, 0x8b, 0x5d, 0xba, 0x7f, 0x4f, 0xb4, 0x7e, 0x53, 0x66, 0x41, 0x26, 0xaf, 0x7c, 0x54, 0xa9, 0x79, 0x52, 0xa4, 0x70, 0x46, 0x9c, 0x68, 0x3f, 0xa3, 0x6e, 0x46, 0xb7, 0x7d, 0x4d, 0xcb, 0x91, 0x61, 0xe1, 0xa7, 0x77, 0xe0, 0xaa, 0x7e, 0xb9, 0x7d, 0x4e, 0xc6, 0x86, 0x56, 0xc4, 0x83, 0x54, 0xc2, 0x80, 0x56, 0xd7, 0x97, 0x68, 0xd0, 0x91, 0x61, 0xe4, 0xa6, 0x71, 0xe3, 0xa8, 0x75, 0xef, 0xb8, 0x8a, 0xed, 0xb9, 0x8d, 0xdf, 0xb3, 0x8e, 0xe7, 0xb9, 0x93, 0xdd, 0xae, 0x85, 0xb9, 0x84, 0x58, 0xbc, 0x81, 0x57, 0xb8, 0x78, 0x49, 0xd3, 0x93, 0x62, 0xdd, 0x9c, 0x6c, 0xe8, 0xaa, 0x75, 0xe1, 0xa3, 0x6f, 0xe0, 0x9f, 0x68, 0xdb, 0x9a, 0x63, 0xdb, 0x9b, 0x65, 0xda, 0x9f, 0x6c, 0xda, 0xa5, 0x76, 0xd3, 0xa4, 0x78, 0xcb, 0xa1, 0x75, 0x9d, 0x72, 0x4c, 0x92, 0x66, 0x43, 0x7e, 0x55, 0x35, 0x81, 0x5b, 0x3f, 0x9f, 0x74, 0x55, 0xb0, 0x8f, 0x75, 0xb9, 0xa3, 0x91, 0xc8, 0xba, 0xb1, 0xd9, 0xd2, 0xca, 0xde, 0xdb, 0xd5, 0xd3, 0xcf, 0xca, 0xf3, 0xf3, 0xf1, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf7, 0xf7, 0xf5, 0xe8, 0xe9, 0xe7, 0xb8, 0xbb, 0xb6, 0x87, 0x81, 0x7b, 0x67, 0x5a, 0x55, 0x59, 0x47, 0x41, 0x3d, 0x2b, 0x21, 0x34, 0x23, 0x17, 0x33, 0x21, 0x17, 0x31, 0x1c, 0x15, 0x29, 0x14, 0x0d, 0x25, 0x12, 0x0a, 0x31, 0x1e, 0x16, 0x4f, 0x32, 0x1b, 0xa7, 0x7d, 0x5c, 0xbb, 0x8d, 0x66, 0xc4, 0x91, 0x66, 0xc4, 0x8f, 0x63, 0xba, 0x86, 0x59, 0xbc, 0x88, 0x59, 0xc5, 0x8c, 0x5a, 0xcd, 0x8f, 0x5c, 0xcd, 0x8f, 0x5c, 0xc8, 0x84, 0x54, 0xcc, 0x88, 0x58, 0xc4, 0x7e, 0x4b, 0xc0, 0x80, 0x51, 0xaa, 0x6d, 0x41, 0xad, 0x72, 0x4c, 0xad, 0x75, 0x4c, 0xb6, 0x81, 0x58, 0xcb, 0x9a, 0x72, 0xcf, 0x9e, 0x77, 0xbe, 0x8d, 0x67, 0xac, 0x7b, 0x57, 0xbe, 0x8b, 0x62, 0xde, 0xa8, 0x7f, 0xc9, 0x96, 0x63, 0xd0, 0x98, 0x6c, 0xc0, 0x88, 0x5c, 0xcb, 0x95, 0x67, 0xb6, 0x7f, 0x51, 0xd2, 0x96, 0x63, 0xce, 0x8e, 0x5c, 0xcd, 0x8f, 0x5d, 0xb0, 0x74, 0x47, 0xd5, 0xa0, 0x74, 0xd6, 0x9e, 0x6e, 0xd1, 0x95, 0x65, 0xb8, 0x7c, 0x4c, 0xa5, 0x6e, 0x44, 0xa0, 0x6c, 0x43, 0xb1, 0x79, 0x4c, 0xc6, 0x8b, 0x5e, 0xb1, 0x78, 0x4e, 0xa8, 0x74, 0x4c, 0x81, 0x55, 0x30, 0xac, 0x7a, 0x53, 0xc3, 0x88, 0x5c, 0xa9, 0x72, 0x47, 0xa9, 0x72, 0x46, 0xa2, 0x6f, 0x43, 0xab, 0x78, 0x4b, 0xcd, 0x97, 0x65, 0xdf, 0xa9, 0x77, 0xe4, 0xb1, 0x82, 0xcc, 0x91, 0x65, 0xc2, 0x86, 0x52, 0xcb, 0x86, 0x55, 0xc9, 0x87, 0x58, 0xc9, 0x87, 0x58, 0xc5, 0x85, 0x56, 0xd1, 0x92, 0x62, 0xdc, 0x9b, 0x65, 0xe4, 0xa7, 0x73, 0xed, 0xb4, 0x84, 0xe4, 0xaf, 0x82, 0xe5, 0xb5, 0x8d, 0xe2, 0xb4, 0x8e, 0xe3, 0xb1, 0x87, 0xca, 0x8f, 0x63, 0xaf, 0x6b, 0x3d, 0xbb, 0x79, 0x48, 0xd2, 0x8d, 0x58, 0xe3, 0xa4, 0x6f, 0xef, 0xb0, 0x7b, 0xee, 0xb2, 0x7c, 0xe6, 0xae, 0x77, 0xdb, 0x9b, 0x67, 0xdb, 0x9b, 0x67, 0xe6, 0xa9, 0x79, 0xe9, 0xb3, 0x81, 0xec, 0xb8, 0x85, 0xd8, 0xa7, 0x79, 0xae, 0x7c, 0x52, 0x9a, 0x68, 0x3f, 0x95, 0x67, 0x3f, 0x93, 0x66, 0x3f, 0xb1, 0x87, 0x66, 0xd6, 0xc3, 0xb2, 0xd5, 0xc7, 0xb7, 0xd2, 0xc4, 0xbb, 0xeb, 0xea, 0xe4, 0xe9, 0xe6, 0xe2, 0xf5, 0xf5, 0xf3, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf5, 0xf5, 0xf3, 0xd5, 0xd6, 0xd3, 0xae, 0xad, 0xa9, 0x8b, 0x81, 0x7c, 0x5a, 0x4d, 0x45, 0x52, 0x41, 0x37, 0x49, 0x33, 0x28, 0x47, 0x31, 0x26, 0x3c, 0x27, 0x1c, 0x2e, 0x19, 0x0e, 0x28, 0x14, 0x0a, 0x2c, 0x19, 0x12, 0x31, 0x1e, 0x16, 0x7a, 0x5b, 0x3c, 0xb2, 0x86, 0x5d, 0xc7, 0x94, 0x6a, 0xcf, 0x99, 0x6c, 0xc3, 0x8e, 0x62, 0xba, 0x85, 0x59, 0xb0, 0x7b, 0x52, 0xc1, 0x87, 0x5c, 0xcb, 0x8d, 0x5a, 0xbc, 0x7f, 0x4c, 0xc6, 0x87, 0x52, 0xba, 0x7a, 0x46, 0xb0, 0x73, 0x44, 0xb4, 0x76, 0x48, 0xb0, 0x73, 0x46, 0xa3, 0x68, 0x41, 0xa7, 0x6e, 0x49, 0x91, 0x5b, 0x37, 0x98, 0x67, 0x45, 0xb3, 0x85, 0x60, 0xa8, 0x7a, 0x56, 0x9e, 0x70, 0x4b, 0xb9, 0x85, 0x5d, 0xc4, 0x8f, 0x65, 0xbe, 0x89, 0x61, 0xc4, 0x8a, 0x5b, 0xc2, 0x87, 0x59, 0xb9, 0x81, 0x53, 0xba, 0x82, 0x54, 0xba, 0x83, 0x53, 0xb4, 0x77, 0x4a, 0xc4, 0x85, 0x57, 0xd3, 0x9f, 0x72, 0xd8, 0xa3, 0x77, 0xd9, 0xa1, 0x70, 0xdd, 0xa1, 0x71, 0xcd, 0x90, 0x61, 0xad, 0x73, 0x45, 0xa7, 0x6f, 0x42, 0xaf, 0x74, 0x46, 0xb9, 0x7e, 0x51, 0xa9, 0x72, 0x46, 0xa9, 0x73, 0x48, 0xa5, 0x73, 0x4b, 0xa0, 0x6e, 0x46, 0xbc, 0x82, 0x55, 0xb5, 0x7e, 0x53, 0xb2, 0x7b, 0x4f, 0x9e, 0x65, 0x3a, 0xa8, 0x6f, 0x44, 0xbe, 0x84, 0x54, 0xd5, 0x9b, 0x6b, 0xdf, 0xa7, 0x7a, 0xe0, 0xaa, 0x7c, 0xc9, 0x8e, 0x5a, 0xc4, 0x80, 0x4f, 0xd7, 0x99, 0x68, 0xd5, 0x97, 0x66, 0xb8, 0x79, 0x4a, 0xbb, 0x7d, 0x4e, 0xca, 0x8d, 0x5d, 0xd5, 0x97, 0x67, 0xd8, 0x9c, 0x6d, 0xf3, 0xbe, 0x92, 0xe5, 0xb6, 0x8e, 0xef, 0xc0, 0x9b, 0xe1, 0xb0, 0x86, 0xb5, 0x7f, 0x55, 0xb0, 0x71, 0x46, 0xb5, 0x74, 0x46, 0xc0, 0x7a, 0x4a, 0xd0, 0x8d, 0x5a, 0xdc, 0x99, 0x66, 0xe5, 0x9e, 0x6c, 0xdd, 0x9b, 0x67, 0xde, 0x9e, 0x6a, 0xdf, 0x9f, 0x6b, 0xe0, 0xa1, 0x6d, 0xe9, 0xae, 0x78, 0xed, 0xb6, 0x81, 0xeb, 0xb7, 0x85, 0xe5, 0xb2, 0x81, 0xc8, 0x94, 0x64, 0xb2, 0x7f, 0x4a, 0xa5, 0x70, 0x45, 0xaa, 0x75, 0x51, 0xbe, 0x97, 0x7c, 0xdf, 0xce, 0xc6, 0xce, 0xc4, 0xbb, 0xdf, 0xd6, 0xcb, 0xeb, 0xe8, 0xe3, 0xf4, 0xf4, 0xf2, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xe9, 0xe9, 0xe9, 0xe4, 0xe1, 0xdf, 0xb7, 0xae, 0xab, 0x78, 0x6a, 0x64, 0x63, 0x53, 0x48, 0x4c, 0x39, 0x2d, 0x42, 0x2f, 0x24, 0x3f, 0x28, 0x1b, 0x3f, 0x25, 0x17, 0x35, 0x1f, 0x12, 0x29, 0x14, 0x08, 0x3a, 0x27, 0x18, 0x5d, 0x43, 0x2d, 0xa5, 0x7d, 0x59, 0xc7, 0x98, 0x6a, 0xd7, 0xa2, 0x75, 0xc4, 0x8e, 0x5f, 0xb8, 0x83, 0x5a, 0xb6, 0x80, 0x57, 0xc5, 0x92, 0x63, 0xc6, 0x8d, 0x5f, 0xc7, 0x8a, 0x57, 0xb3, 0x77, 0x43, 0xaf, 0x71, 0x42, 0xb5, 0x77, 0x48, 0xa2, 0x6c, 0x41, 0xab, 0x72, 0x44, 0x99, 0x61, 0x39, 0x98, 0x61, 0x3a, 0xb3, 0x7c, 0x53, 0xc0, 0x88, 0x5d, 0xba, 0x8c, 0x68, 0xac, 0x7f, 0x5c, 0xa0, 0x73, 0x50, 0xa5, 0x74, 0x4e, 0xb7, 0x81, 0x58, 0xb5, 0x83, 0x5f, 0x8b, 0x5e, 0x41, 0x7e, 0x52, 0x33, 0x79, 0x52, 0x34, 0x79, 0x4e, 0x30, 0xa9, 0x6e, 0x49, 0xc5, 0x95, 0x6a, 0xb3, 0x78, 0x4d, 0xbd, 0x83, 0x59, 0xd1, 0xa2, 0x7c, 0xe1, 0xb1, 0x8a, 0xd2, 0x9c, 0x6f, 0xd0, 0x94, 0x67, 0xc7, 0x8a, 0x5d, 0xa6, 0x6b, 0x3e, 0xb5, 0x7a, 0x4d, 0xc1, 0x87, 0x5a, 0xc6, 0x8b, 0x5d, 0xc0, 0x86, 0x54, 0xb9, 0x82, 0x51, 0xb7, 0x81, 0x56, 0xa1, 0x6c, 0x42, 0xaf, 0x77, 0x4c, 0xa5, 0x70, 0x47, 0xa1, 0x6d, 0x43, 0xb7, 0x7b, 0x4f, 0xb4, 0x77, 0x4d, 0xc4, 0x88, 0x58, 0xd8, 0x9c, 0x6c, 0xe6, 0xaa, 0x7a, 0xe7, 0xb4, 0x87, 0xd9, 0x9d, 0x69, 0xb6, 0x78, 0x4a, 0xe3, 0xa6, 0x77, 0xb1, 0x77, 0x4c, 0x62, 0x39, 0x23, 0x74, 0x4b, 0x2f, 0x8f, 0x5e, 0x3b, 0xb4, 0x78, 0x50, 0xcc, 0x93, 0x66, 0xed, 0xba, 0x8f, 0xed, 0xbd, 0x94, 0xf0, 0xc2, 0x9c, 0xe6, 0xb7, 0x8f, 0xc5, 0x90, 0x65, 0xaf, 0x73, 0x49, 0xa9, 0x6a, 0x41, 0xbc, 0x78, 0x4a, 0xd0, 0x8a, 0x59, 0xd5, 0x8f, 0x5a, 0xd0, 0x8e, 0x5a, 0xd3, 0x92, 0x5e, 0xd2, 0x93, 0x60, 0xd4, 0x94, 0x61, 0xd2, 0x94, 0x5e, 0xde, 0x9f, 0x6a, 0xe7, 0xa6, 0x73, 0xe6, 0xaf, 0x7a, 0xe6, 0xb1, 0x7c, 0xec, 0xb6, 0x81, 0xd7, 0x9f, 0x6c, 0xc4, 0x8b, 0x5c, 0xb9, 0x81, 0x54, 0xac, 0x7a, 0x53, 0xb4, 0x8d, 0x71, 0xd4, 0xc1, 0xb3, 0xdd, 0xd6, 0xcf, 0xe8, 0xe6, 0xe1, 0xed, 0xed, 0xeb, 0xf9, 0xfa, 0xf8, 0xfd, 0xfd, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xef, 0xef, 0xef, 0xbe, 0xbb, 0xb8, 0x8e, 0x8a, 0x81, 0x73, 0x5e, 0x56, 0x5a, 0x45, 0x37, 0x4e, 0x39, 0x2b, 0x4c, 0x34, 0x24, 0x47, 0x30, 0x22, 0x33, 0x1e, 0x12, 0x34, 0x1c, 0x10, 0x35, 0x1d, 0x10, 0x5c, 0x43, 0x2e, 0x85, 0x63, 0x42, 0xbf, 0x91, 0x67, 0xd5, 0xa3, 0x75, 0xc0, 0x8b, 0x5d, 0xc4, 0x8f, 0x61, 0xce, 0x99, 0x6e, 0xc9, 0x94, 0x68, 0xc0, 0x8b, 0x5a, 0xb6, 0x7b, 0x4c, 0xb3, 0x76, 0x4a, 0xac, 0x6f, 0x43, 0xb3, 0x75, 0x44, 0xbb, 0x7d, 0x4c, 0xb9, 0x79, 0x4e, 0x8f, 0x58, 0x34, 0x92, 0x5e, 0x39, 0xa0, 0x68, 0x3f, 0xb3, 0x7c, 0x51, 0xb2, 0x79, 0x4d, 0xa8, 0x7a, 0x57, 0xa9, 0x7c, 0x59, 0x95, 0x68, 0x45, 0xa2, 0x71, 0x4e, 0xa3, 0x6e, 0x47, 0x95, 0x64, 0x3d, 0x77, 0x4e, 0x2e, 0x55, 0x37, 0x25, 0x57, 0x3c, 0x28, 0x53, 0x38, 0x1c, 0x79, 0x52, 0x2e, 0xb4, 0x84, 0x5b, 0x96, 0x67, 0x41, 0xdc, 0xac, 0x80, 0xe0, 0xb8, 0x93, 0xe3, 0xb5, 0x90, 0xcb, 0x97, 0x6b, 0xd4, 0x97, 0x6b, 0xb6, 0x79, 0x4e, 0xb1, 0x75, 0x49, 0xb8, 0x7d, 0x51, 0xbe, 0x86, 0x59, 0xcb, 0x91, 0x62, 0xc8, 0x8d, 0x5a, 0xc4, 0x8d, 0x5d, 0xb7, 0x82, 0x55, 0xb1, 0x7a, 0x4f, 0xb8, 0x81, 0x55, 0xac, 0x75, 0x4a, 0xbd, 0x86, 0x5b, 0xcb, 0x8f, 0x5e, 0xb9, 0x7d, 0x4f, 0xbb, 0x7f, 0x4f, 0xd9, 0x9c, 0x6d, 0xdf, 0xa4, 0x72, 0xeb, 0xb7, 0x8c, 0xd8, 0xa5, 0x7b, 0xa8, 0x6f, 0x42, 0xb6, 0x83, 0x59, 0x57, 0x2e, 0x0b, 0x5c, 0x3c, 0x24, 0x36, 0x1e, 0x08, 0x51, 0x32, 0x19, 0x8f, 0x5a, 0x38, 0xb7, 0x7e, 0x50, 0xd5, 0x9b, 0x6b, 0xd8, 0xa3, 0x76, 0xe1, 0xb3, 0x8d, 0xf2, 0xc3, 0x9c, 0xc7, 0x92, 0x66, 0xac, 0x70, 0x46, 0xa4, 0x66, 0x3d, 0xad, 0x6b, 0x3d, 0xc1, 0x7b, 0x4b, 0xd4, 0x8f, 0x59, 0xd9, 0x95, 0x5f, 0xe2, 0x9e, 0x68, 0xda, 0x99, 0x66, 0xd7, 0x96, 0x62, 0xd3, 0x91, 0x5e, 0xcd, 0x8e, 0x59, 0xd6, 0x96, 0x64, 0xde, 0xa5, 0x70, 0xe7, 0xb2, 0x7d, 0xe9, 0xb3, 0x7f, 0xd3, 0x9b, 0x67, 0xc1, 0x87, 0x58, 0xc6, 0x8e, 0x5e, 0xc0, 0x8d, 0x5d, 0xb6, 0x89, 0x62, 0xb8, 0x9d, 0x88, 0xdd, 0xd4, 0xcd, 0xef, 0xec, 0xe7, 0xf5, 0xf6, 0xf4, 0xf8, 0xf9, 0xf7, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf7, 0xf7, 0xf7, 0xe9, 0xe9, 0xe9, 0xbb, 0xb8, 0xb5, 0x88, 0x78, 0x6f, 0x64, 0x4e, 0x41, 0x63, 0x4c, 0x3a, 0x5a, 0x41, 0x30, 0x4b, 0x35, 0x26, 0x3d, 0x27, 0x18, 0x3c, 0x23, 0x14, 0x36, 0x1e, 0x12, 0x3f, 0x27, 0x18, 0x6a, 0x4a, 0x2d, 0xaf, 0x86, 0x5e, 0xd0, 0x9f, 0x70, 0xbb, 0x85, 0x59, 0xc8, 0x94, 0x65, 0xd4, 0x9f, 0x71, 0xd1, 0x9d, 0x6d, 0xc3, 0x8e, 0x5e, 0xd3, 0x98, 0x66, 0xd4, 0x95, 0x65, 0xc1, 0x85, 0x53, 0xbf, 0x83, 0x51, 0xce, 0x90, 0x5f, 0xb4, 0x76, 0x46, 0xa2, 0x68, 0x3d, 0xa2, 0x6b, 0x40, 0xb0, 0x79, 0x4f, 0xae, 0x72, 0x47, 0xb0, 0x78, 0x4c, 0xc4, 0x8c, 0x60, 0xae, 0x80, 0x5c, 0x9c, 0x6f, 0x4d, 0x94, 0x68, 0x47, 0x92, 0x65, 0x44, 0x96, 0x64, 0x41, 0x64, 0x3f, 0x1f, 0x3e, 0x23, 0x0b, 0x31, 0x13, 0x02, 0x34, 0x11, 0x00, 0x1c, 0x09, 0x07, 0x20, 0x10, 0x0a, 0x5f, 0x3b, 0x24, 0x84, 0x58, 0x33, 0xaf, 0x7b, 0x52, 0xd4, 0xa6, 0x82, 0xc7, 0x99, 0x74, 0xc4, 0x8f, 0x63, 0xc2, 0x86, 0x5a, 0xb7, 0x7b, 0x4f, 0xbc, 0x81, 0x55, 0xba, 0x80, 0x54, 0xc1, 0x89, 0x5c, 0xc0, 0x86, 0x57, 0xc1, 0x86, 0x55, 0xb7, 0x7f, 0x55, 0xaa, 0x74, 0x4c, 0xcb, 0x94, 0x68, 0xad, 0x76, 0x49, 0xb5, 0x7b, 0x4c, 0xbf, 0x84, 0x55, 0xc4, 0x88, 0x54, 0xc7, 0x8b, 0x5a, 0xc0, 0x84, 0x54, 0xce, 0x92, 0x62, 0xdf, 0xa3, 0x71, 0xe5, 0xb1, 0x85, 0xe0, 0xa9, 0x7f, 0x78, 0x4d, 0x28, 0x1e, 0x0a, 0x02, 0x33, 0x2a, 0x2b, 0x49, 0x20, 0x01, 0x24, 0x07, 0x00, 0x26, 0x18, 0x0c, 0x72, 0x48, 0x2a, 0x93, 0x5e, 0x32, 0xaf, 0x7a, 0x4d, 0xbc, 0x8a, 0x5f, 0xe6, 0xb8, 0x92, 0xf5, 0xc6, 0x9e, 0xdc, 0xa7, 0x7b, 0xba, 0x7f, 0x55, 0xbc, 0x7d, 0x53, 0xb7, 0x75, 0x47, 0xc3, 0x7d, 0x4c, 0xd0, 0x8a, 0x54, 0xd9, 0x92, 0x59, 0xe0, 0x99, 0x61, 0xdd, 0x97, 0x61, 0xd6, 0x90, 0x59, 0xdb, 0x93, 0x61, 0xdf, 0xa4, 0x6e, 0xe3, 0xa9, 0x74, 0xde, 0xa2, 0x6e, 0xe2, 0xab, 0x77, 0xe7, 0xb1, 0x7d, 0xe4, 0xac, 0x78, 0xc5, 0x8b, 0x5c, 0xb9, 0x81, 0x55, 0xc4, 0x8c, 0x60, 0xcd, 0x96, 0x6a, 0xc3, 0x94, 0x70, 0xc9, 0xb6, 0xa8, 0xf1, 0xed, 0xe8, 0xf9, 0xf9, 0xf7, 0xfa, 0xfa, 0xf8, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xf4, 0xf4, 0xf4, 0xd3, 0xcc, 0xcd, 0xa9, 0xa0, 0x98, 0x7a, 0x62, 0x55, 0x74, 0x5c, 0x4e, 0x68, 0x4c, 0x3e, 0x54, 0x41, 0x37, 0x48, 0x33, 0x24, 0x41, 0x27, 0x18, 0x48, 0x2d, 0x1b, 0x42, 0x28, 0x17, 0x5f, 0x44, 0x2a, 0x88, 0x62, 0x42, 0xbd, 0x90, 0x66, 0xbc, 0x89, 0x5d, 0xce, 0x9c, 0x69, 0xdc, 0xaa, 0x7d, 0xd5, 0xa0, 0x6e, 0xc2, 0x8c, 0x5b, 0xcf, 0x99, 0x67, 0xc2, 0x84, 0x53, 0xb8, 0x7e, 0x50, 0xb7, 0x7b, 0x4a, 0xc1, 0x84, 0x58, 0xae, 0x78, 0x49, 0x9f, 0x68, 0x3f, 0xa0, 0x69, 0x40, 0xa8, 0x70, 0x47, 0xb3, 0x77, 0x50, 0x9e, 0x64, 0x3b, 0xb0, 0x7b, 0x51, 0xc0, 0x90, 0x66, 0x98, 0x69, 0x45, 0xa1, 0x74, 0x54, 0x87, 0x5e, 0x40, 0x8d, 0x63, 0x43, 0x5c, 0x34, 0x1a, 0x58, 0x37, 0x20, 0x12, 0x0c, 0x0a, 0x1f, 0x06, 0x00, 0x34, 0x10, 0x00, 0x07, 0x06, 0x00, 0x02, 0x0a, 0x05, 0x22, 0x09, 0x00, 0x34, 0x11, 0x00, 0x9a, 0x76, 0x59, 0xc6, 0x9a, 0x77, 0xa5, 0x76, 0x51, 0xbd, 0x89, 0x60, 0xb3, 0x7c, 0x51, 0xb8, 0x81, 0x55, 0xb5, 0x7e, 0x52, 0xc0, 0x89, 0x5e, 0xba, 0x82, 0x53, 0xc6, 0x8d, 0x5c, 0xb9, 0x82, 0x51, 0xb5, 0x81, 0x53, 0xae, 0x79, 0x4f, 0xc3, 0x8e, 0x61, 0xc1, 0x86, 0x56, 0xca, 0x8e, 0x5c, 0xba, 0x7e, 0x4c, 0xcf, 0x91, 0x5f, 0xcf, 0x94, 0x62, 0xc5, 0x8c, 0x5f, 0xb1, 0x78, 0x4b, 0xbd, 0x84, 0x58, 0xc6, 0x96, 0x69, 0x78, 0x4b, 0x23, 0x47, 0x21, 0x06, 0x04, 0x04, 0x09, 0x0d, 0x0b, 0x07, 0x51, 0x2d, 0x0b, 0x44, 0x18, 0x00, 0x0e, 0x05, 0x06, 0x20, 0x12, 0x03, 0x61, 0x3b, 0x1f, 0x90, 0x5d, 0x34, 0xb8, 0x86, 0x5f, 0xe1, 0xb0, 0x89, 0xdf, 0xb1, 0x89, 0xd3, 0xa2, 0x76, 0xd6, 0xa1, 0x77, 0xcb, 0x8c, 0x5d, 0xc0, 0x82, 0x4f, 0xc6, 0x83, 0x4e, 0xda, 0x92, 0x5a, 0xda, 0x91, 0x59, 0xd1, 0x88, 0x50, 0xd4, 0x89, 0x4f, 0xd6, 0x8b, 0x51, 0xdf, 0x99, 0x5f, 0xe4, 0xa2, 0x6c, 0xd1, 0x91, 0x5f, 0xcf, 0x8f, 0x5c, 0xdf, 0x9f, 0x6d, 0xe2, 0xa8, 0x74, 0xf1, 0xba, 0x86, 0xdc, 0xa6, 0x73, 0xcd, 0x97, 0x66, 0xcb, 0x95, 0x66, 0xbb, 0x86, 0x5b, 0xbd, 0x8f, 0x6a, 0xbd, 0x98, 0x82, 0xd8, 0xcb, 0xc2, 0xf3, 0xf4, 0xf0, 0xfc, 0xfc, 0xfa, 0xfc, 0xfc, 0xfa, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xe9, 0xe9, 0xe9, 0xb0, 0xa6, 0x9f, 0x84, 0x6b, 0x5f, 0x74, 0x5d, 0x4f, 0x72, 0x5b, 0x4d, 0x5e, 0x47, 0x3c, 0x4e, 0x3b, 0x2e, 0x52, 0x38, 0x23, 0x57, 0x3a, 0x24, 0x54, 0x34, 0x1d, 0x4f, 0x30, 0x1d, 0x67, 0x49, 0x2a, 0x9b, 0x75, 0x53, 0xa5, 0x76, 0x53, 0xd4, 0xa1, 0x76, 0xe3, 0xb1, 0x7e, 0xd5, 0xa0, 0x74, 0xc0, 0x87, 0x56, 0xce, 0x93, 0x5f, 0xd2, 0x97, 0x63, 0xc9, 0x8b, 0x5a, 0xc1, 0x87, 0x59, 0xb9, 0x82, 0x53, 0xa9, 0x70, 0x47, 0xae, 0x79, 0x4a, 0xad, 0x77, 0x4c, 0xb7, 0x7c, 0x50, 0xa6, 0x6a, 0x3d, 0xa5, 0x68, 0x3f, 0xa1, 0x66, 0x3e, 0xb4, 0x7f, 0x55, 0xd9, 0xa9, 0x80, 0xc2, 0x93, 0x6e, 0x9b, 0x6d, 0x4d, 0x91, 0x66, 0x47, 0xa6, 0x77, 0x58, 0x98, 0x6c, 0x49, 0x5e, 0x3d, 0x27, 0x23, 0x1b, 0x19, 0x2f, 0x16, 0x07, 0x6b, 0x41, 0x19, 0x30, 0x1f, 0x12, 0x12, 0x06, 0x04, 0x39, 0x16, 0x04, 0x1d, 0x07, 0x03, 0x20, 0x11, 0x06, 0x64, 0x45, 0x2c, 0x7f, 0x58, 0x38, 0x9f, 0x73, 0x51, 0xa1, 0x6e, 0x46, 0xa6, 0x73, 0x4b, 0xb6, 0x80, 0x55, 0xbf, 0x88, 0x5c, 0xb8, 0x82, 0x55, 0xb4, 0x7f, 0x52, 0xac, 0x77, 0x4b, 0xac, 0x77, 0x4b, 0xae, 0x7a, 0x4b, 0x98, 0x62, 0x39, 0xb9, 0x7e, 0x53, 0xc0, 0x84, 0x52, 0xbf, 0x83, 0x51, 0xc4, 0x86, 0x55, 0xcf, 0x95, 0x63, 0xbc, 0x82, 0x55, 0xa2, 0x72, 0x4b, 0x8d, 0x61, 0x3d, 0x80, 0x59, 0x40, 0x3e, 0x23, 0x12, 0x9e, 0x6e, 0x3c, 0x65, 0x45, 0x25, 0x68, 0x4f, 0x2c, 0xb3, 0x80, 0x4c, 0x6a, 0x40, 0x1f, 0x4f, 0x4a, 0x4a, 0x7b, 0x63, 0x4c, 0x7a, 0x53, 0x35, 0xb0, 0x79, 0x4d, 0xdd, 0xa9, 0x7e, 0xda, 0xa9, 0x81, 0xd3, 0xa5, 0x84, 0xdd, 0xb0, 0x88, 0xd2, 0x9f, 0x7a, 0xb7, 0x80, 0x54, 0xb6, 0x75, 0x46, 0xbc, 0x78, 0x49, 0xc5, 0x7d, 0x4a, 0xc8, 0x83, 0x50, 0xc2, 0x7c, 0x49, 0xbf, 0x7c, 0x48, 0xbb, 0x78, 0x44, 0xbb, 0x7b, 0x45, 0xce, 0x8a, 0x52, 0xdc, 0x9d, 0x65, 0xde, 0x9f, 0x68, 0xe5, 0xa5, 0x72, 0xe5, 0xab, 0x77, 0xe5, 0xaf, 0x77, 0xeb, 0xb6, 0x7d, 0xe8, 0xb3, 0x7d, 0xd2, 0x9d, 0x6a, 0xd3, 0x9f, 0x70, 0xc6, 0x98, 0x6e, 0xbb, 0x96, 0x79, 0xc9, 0xb5, 0xa3, 0xe2, 0xd9, 0xd7, 0xf7, 0xf7, 0xf5, 0xfa, 0xfa, 0xf8, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfb, 0xf9, 0xf8, 0xdd, 0xd6, 0xd2, 0x9b, 0x89, 0x83, 0x7f, 0x74, 0x6c, 0x66, 0x56, 0x4b, 0x6a, 0x55, 0x4b, 0x67, 0x4b, 0x33, 0x6d, 0x4b, 0x31, 0x72, 0x51, 0x37, 0x60, 0x41, 0x2a, 0x5b, 0x3b, 0x21, 0x5e, 0x40, 0x28, 0x80, 0x55, 0x35, 0x9a, 0x6f, 0x4d, 0xbf, 0x8f, 0x71, 0xe0, 0xaf, 0x82, 0xd6, 0xa1, 0x75, 0xb5, 0x80, 0x55, 0xd5, 0x9d, 0x69, 0xcd, 0x8e, 0x5c, 0xcf, 0x90, 0x5e, 0xd2, 0x93, 0x61, 0xc6, 0x87, 0x55, 0xc5, 0x8b, 0x57, 0xcb, 0x92, 0x5d, 0xd0, 0x91, 0x5c, 0xb4, 0x74, 0x46, 0xa9, 0x6b, 0x47, 0x9d, 0x62, 0x3d, 0xa4, 0x68, 0x40, 0xa9, 0x70, 0x4a, 0xad, 0x7b, 0x56, 0xbb, 0x8c, 0x66, 0xa6, 0x78, 0x56, 0x92, 0x6a, 0x4c, 0xbf, 0x8f, 0x66, 0xc8, 0x94, 0x6b, 0xc6, 0x8f, 0x63, 0xba, 0x8d, 0x6a, 0x94, 0x7e, 0x66, 0x49, 0x36, 0x2e, 0xcf, 0x94, 0x54, 0xbf, 0x8d, 0x56, 0x85, 0x5d, 0x2f, 0x4b, 0x25, 0x06, 0x10, 0x04, 0x00, 0x14, 0x0d, 0x0a, 0x44, 0x31, 0x20, 0x66, 0x42, 0x2b, 0x5f, 0x3e, 0x20, 0xa4, 0x75, 0x4e, 0x9b, 0x6d, 0x48, 0xa2, 0x72, 0x4d, 0xac, 0x78, 0x50, 0xb1, 0x7b, 0x50, 0xb1, 0x7a, 0x4e, 0xb5, 0x7e, 0x52, 0xc2, 0x8b, 0x60, 0xc0, 0x88, 0x5c, 0xa5, 0x6a, 0x3e, 0xbb, 0x81, 0x54, 0xb7, 0x7c, 0x50, 0xb2, 0x78, 0x4b, 0xbd, 0x83, 0x56, 0xc6, 0x8c, 0x5f, 0xb3, 0x77, 0x4c, 0x98, 0x6b, 0x4b, 0xa7, 0x7f, 0x5b, 0xad, 0x92, 0x79, 0x42, 0x2d, 0x22, 0xce, 0x8d, 0x55, 0xfb, 0xc8, 0x90, 0xf4, 0xd0, 0x91, 0xf4, 0xb0, 0x70, 0x73, 0x5d, 0x49, 0xab, 0xa2, 0x98, 0xe7, 0xbe, 0xa1, 0x86, 0x54, 0x32, 0xab, 0x74, 0x4d, 0xd2, 0x94, 0x67, 0xd9, 0xa2, 0x79, 0xbb, 0x90, 0x6a, 0xcc, 0x9e, 0x79, 0xad, 0x7f, 0x5b, 0xb6, 0x81, 0x57, 0xae, 0x76, 0x49, 0xad, 0x70, 0x42, 0xc9, 0x89, 0x51, 0xc5, 0x80, 0x4f, 0xcd, 0x85, 0x4f, 0xce, 0x89, 0x52, 0xc4, 0x86, 0x4d, 0xc8, 0x83, 0x4c, 0xd1, 0x8b, 0x54, 0xd5, 0x91, 0x5e, 0xd9, 0x96, 0x62, 0xdf, 0x9e, 0x6a, 0xe9, 0xad, 0x77, 0xe5, 0xab, 0x76, 0xe7, 0xae, 0x79, 0xe0, 0xab, 0x74, 0xdc, 0xa7, 0x73, 0xc6, 0x8f, 0x60, 0xc3, 0x8d, 0x65, 0xbb, 0x89, 0x68, 0xc6, 0xa4, 0x8b, 0xe2, 0xd6, 0xcf, 0xf2, 0xeb, 0xe5, 0xf9, 0xf7, 0xf3, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xef, 0xed, 0xec, 0xa7, 0xa0, 0x9c, 0x80, 0x76, 0x6d, 0x89, 0x7c, 0x74, 0x80, 0x68, 0x5d, 0x79, 0x5d, 0x48, 0x74, 0x56, 0x3f, 0x72, 0x50, 0x36, 0x75, 0x51, 0x34, 0x72, 0x4d, 0x30, 0x5f, 0x3e, 0x25, 0x5c, 0x3d, 0x25, 0x5f, 0x3f, 0x25, 0xad, 0x88, 0x5f, 0xe3, 0xae, 0x80, 0xe1, 0xad, 0x7d, 0xcd, 0x95, 0x66, 0xd1, 0x99, 0x69, 0xc6, 0x89, 0x58, 0xc2, 0x88, 0x59, 0xba, 0x80, 0x51, 0xc8, 0x87, 0x53, 0xd1, 0x8f, 0x5c, 0xd0, 0x8a, 0x5a, 0xde, 0x99, 0x68, 0xc9, 0x8a, 0x56, 0xb7, 0x76, 0x48, 0xa6, 0x68, 0x41, 0xa3, 0x69, 0x40, 0x9e, 0x66, 0x3e, 0x99, 0x64, 0x41, 0xba, 0x8b, 0x69, 0xa7, 0x7a, 0x57, 0xae, 0x82, 0x62, 0x8c, 0x64, 0x46, 0xd8, 0xa8, 0x7d, 0xcd, 0x95, 0x6a, 0xc4, 0x88, 0x58, 0xae, 0x81, 0x5d, 0xe5, 0xcd, 0xb6, 0x9f, 0x96, 0x90, 0x71, 0x53, 0x47, 0xc6, 0x8c, 0x59, 0xa3, 0x6c, 0x3d, 0x38, 0x1a, 0x03, 0x0a, 0x03, 0x04, 0x1d, 0x11, 0x0b, 0x86, 0x6f, 0x59, 0x71, 0x54, 0x3c, 0x80, 0x5d, 0x41, 0x85, 0x5f, 0x41, 0x8e, 0x61, 0x3e, 0xa0, 0x70, 0x4a, 0xa9, 0x75, 0x4d, 0xaf, 0x79, 0x4e, 0xb5, 0x7e, 0x53, 0xb3, 0x7c, 0x51, 0xad, 0x77, 0x4b, 0xb9, 0x81, 0x55, 0xca, 0x8f, 0x63, 0xc0, 0x85, 0x59, 0xbe, 0x84, 0x57, 0xb3, 0x78, 0x4c, 0xb9, 0x7e, 0x52, 0xb6, 0x7b, 0x4f, 0xb0, 0x7d, 0x54, 0xb3, 0x87, 0x63, 0xd3, 0xaf, 0x8e, 0xd6, 0xbd, 0xa8, 0x41, 0x2e, 0x28, 0x38, 0x1c, 0x11, 0xab, 0x7a, 0x48, 0xbd, 0x89, 0x5e, 0x5b, 0x37, 0x22, 0x8f, 0x85, 0x82, 0xe2, 0xcc, 0xb6, 0xeb, 0xc5, 0xa2, 0x7e, 0x4f, 0x2c, 0xa5, 0x6e, 0x44, 0xcf, 0x93, 0x63, 0xd7, 0xa1, 0x77, 0xbc, 0x8d, 0x69, 0xc8, 0x9a, 0x76, 0xcf, 0xa1, 0x7d, 0xae, 0x7d, 0x5d, 0x97, 0x61, 0x3e, 0x95, 0x5c, 0x33, 0xa4, 0x65, 0x3c, 0xab, 0x6b, 0x3b, 0xb5, 0x71, 0x3f, 0xc3, 0x7b, 0x45, 0xc9, 0x85, 0x4e, 0xc6, 0x87, 0x56, 0xc0, 0x82, 0x50, 0xce, 0x8a, 0x57, 0xde, 0x9a, 0x67, 0xde, 0x9c, 0x69, 0xdc, 0x9e, 0x69, 0xea, 0xaf, 0x7a, 0xea, 0xb1, 0x7c, 0xe7, 0xb1, 0x7a, 0xd9, 0xa4, 0x70, 0xe3, 0xac, 0x7a, 0xc7, 0x93, 0x60, 0xc5, 0x96, 0x6d, 0xca, 0xa6, 0x8f, 0xbb, 0xa2, 0x91, 0xf4, 0xed, 0xe7, 0xfc, 0xfa, 0xf6, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xe8, 0xe3, 0xe3, 0xac, 0xa6, 0xa2, 0xa1, 0x9b, 0x97, 0x92, 0x7d, 0x70, 0x8c, 0x6e, 0x5f, 0x82, 0x64, 0x4c, 0x76, 0x52, 0x3e, 0x7c, 0x59, 0x3c, 0x6a, 0x4b, 0x32, 0x62, 0x44, 0x2c, 0x61, 0x41, 0x2a, 0x7e, 0x55, 0x37, 0x9b, 0x6f, 0x4c, 0xd4, 0xa1, 0x73, 0xdc, 0xa5, 0x75, 0xdc, 0xa0, 0x6c, 0xd8, 0x9a, 0x67, 0xbb, 0x7f, 0x52, 0xb9, 0x7f, 0x52, 0xb4, 0x7c, 0x50, 0xad, 0x76, 0x4a, 0xb5, 0x7b, 0x4e, 0xbb, 0x81, 0x55, 0xc5, 0x88, 0x56, 0xc9, 0x88, 0x57, 0xc1, 0x81, 0x4e, 0xc1, 0x81, 0x50, 0xb6, 0x79, 0x50, 0x9e, 0x69, 0x41, 0x9a, 0x6b, 0x44, 0xa5, 0x76, 0x50, 0xa2, 0x76, 0x52, 0xac, 0x82, 0x61, 0x99, 0x70, 0x51, 0x8f, 0x64, 0x45, 0xc5, 0x94, 0x6b, 0xca, 0x91, 0x64, 0xc2, 0x83, 0x56, 0x91, 0x64, 0x43, 0xea, 0xcb, 0xad, 0xf2, 0xd6, 0xbd, 0xcc, 0xb6, 0xa4, 0x75, 0x61, 0x4f, 0x53, 0x42, 0x35, 0x40, 0x2f, 0x24, 0x1f, 0x11, 0x0a, 0x2d, 0x1f, 0x1a, 0x83, 0x69, 0x55, 0xbb, 0x93, 0x6f, 0xad, 0x7c, 0x55, 0x86, 0x62, 0x45, 0x7d, 0x56, 0x37, 0x90, 0x63, 0x3f, 0xa1, 0x6f, 0x48, 0xa2, 0x6d, 0x44, 0xaf, 0x78, 0x4d, 0xb3, 0x7b, 0x4e, 0xae, 0x78, 0x4c, 0xba, 0x84, 0x58, 0xcc, 0x95, 0x6a, 0xbc, 0x81, 0x54, 0xba, 0x7f, 0x53, 0xb8, 0x7d, 0x51, 0xbc, 0x82, 0x55, 0xb2, 0x7b, 0x51, 0xa3, 0x77, 0x54, 0xc0, 0x95, 0x6f, 0xdf, 0xbb, 0x99, 0xaa, 0x91, 0x80, 0x4d, 0x39, 0x31, 0x56, 0x41, 0x32, 0x82, 0x71, 0x63, 0x98, 0x86, 0x79, 0xb8, 0xa8, 0x98, 0xe2, 0xcb, 0xb0, 0xf9, 0xda, 0xb8, 0x9c, 0x71, 0x4d, 0x9e, 0x6e, 0x49, 0xbb, 0x83, 0x57, 0xe1, 0xa5, 0x73, 0xeb, 0xb6, 0x8a, 0xcb, 0x97, 0x71, 0xc3, 0x93, 0x6d, 0xc2, 0x91, 0x6d, 0xb5, 0x87, 0x61, 0x8c, 0x5c, 0x39, 0x9d, 0x6a, 0x43, 0xa9, 0x6b, 0x3d, 0xb7, 0x75, 0x43, 0xb2, 0x6f, 0x3e, 0xba, 0x75, 0x44, 0xc7, 0x83, 0x51, 0xcf, 0x8b, 0x5b, 0xd3, 0x90, 0x5b, 0xce, 0x8b, 0x55, 0xd7, 0x94, 0x5e, 0xdf, 0x9f, 0x68, 0xdf, 0xa1, 0x69, 0xdf, 0xa3, 0x6d, 0xe5, 0xa9, 0x74, 0xe8, 0xaf, 0x78, 0xdf, 0xa6, 0x71, 0xd0, 0x9a, 0x69, 0xd0, 0x9a, 0x6a, 0xba, 0x8c, 0x63, 0xba, 0x8e, 0x6b, 0xc7, 0xad, 0x98, 0xde, 0xd4, 0xcc, 0xed, 0xed, 0xe8, 0xfc, 0xfd, 0xfa, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf8, 0xf7, 0xf7, 0xc7, 0xc1, 0xc1, 0x9c, 0x97, 0x92, 0xbe, 0xb4, 0xb0, 0xb3, 0x97, 0x84, 0x8b, 0x6a, 0x56, 0x77, 0x56, 0x3e, 0x7a, 0x55, 0x37, 0x7c, 0x58, 0x3e, 0x65, 0x45, 0x2f, 0x67, 0x45, 0x2b, 0x7f, 0x58, 0x39, 0xa4, 0x76, 0x4d, 0xce, 0x9d, 0x6c, 0xd5, 0x9e, 0x6b, 0xd6, 0x9b, 0x66, 0xcc, 0x90, 0x5d, 0xbb, 0x7f, 0x4c, 0xbb, 0x81, 0x57, 0xb5, 0x81, 0x54, 0xb2, 0x7b, 0x4f, 0xbe, 0x88, 0x5c, 0xb8, 0x7d, 0x51, 0xbb, 0x80, 0x54, 0xb8, 0x7d, 0x4b, 0xc4, 0x83, 0x53, 0xbf, 0x7f, 0x4d, 0xc3, 0x83, 0x50, 0xa9, 0x6b, 0x40, 0xa5, 0x70, 0x46, 0xa6, 0x76, 0x50, 0xa8, 0x7a, 0x55, 0x98, 0x6d, 0x4b, 0xa0, 0x77, 0x56, 0x8d, 0x65, 0x46, 0x92, 0x66, 0x47, 0xca, 0x97, 0x6f, 0xd3, 0x99, 0x6c, 0xdb, 0xa0, 0x74, 0xab, 0x79, 0x52, 0x9a, 0x71, 0x4e, 0xe3, 0xbc, 0x9c, 0xf1, 0xd6, 0xbe, 0xe8, 0xd0, 0xb9, 0xe4, 0xca, 0xb5, 0xc7, 0xb4, 0xa3, 0x69, 0x55, 0x48, 0x34, 0x23, 0x1c, 0x59, 0x42, 0x30, 0xb7, 0x8c, 0x66, 0xd3, 0xa2, 0x78, 0xa4, 0x7d, 0x5d, 0x89, 0x63, 0x44, 0x9f, 0x73, 0x50, 0xa6, 0x75, 0x4f, 0xae, 0x7a, 0x51, 0xb4, 0x7d, 0x52, 0xb6, 0x7e, 0x50, 0xac, 0x77, 0x4b, 0xaf, 0x7a, 0x4f, 0xc8, 0x93, 0x68, 0xba, 0x80, 0x51, 0xb9, 0x7e, 0x52, 0xbc, 0x81, 0x55, 0xba, 0x81, 0x54, 0xb0, 0x7b, 0x52, 0x9c, 0x6e, 0x4c, 0xc2, 0x95, 0x6e, 0xd7, 0xb1, 0x8e, 0x9f, 0x85, 0x75, 0x4b, 0x3b, 0x31, 0x98, 0x7f, 0x6e, 0xea, 0xd3, 0xbc, 0xf1, 0xdc, 0xc7, 0xf3, 0xda, 0xbf, 0xec, 0xc7, 0xa4, 0xaa, 0x7d, 0x58, 0xaa, 0x7a, 0x54, 0xc2, 0x8e, 0x64, 0xcf, 0x96, 0x66, 0xe4, 0xa9, 0x78, 0xe9, 0xb5, 0x87, 0xc7, 0x92, 0x6a, 0xd2, 0xa0, 0x79, 0xc0, 0x8e, 0x6b, 0xa8, 0x7a, 0x53, 0x94, 0x65, 0x45, 0x7d, 0x4c, 0x2e, 0x9c, 0x62, 0x3b, 0xb4, 0x74, 0x44, 0xb5, 0x73, 0x41, 0xac, 0x6d, 0x3c, 0xbc, 0x7c, 0x4c, 0xc7, 0x86, 0x57, 0xd1, 0x91, 0x5c, 0xcd, 0x8d, 0x56, 0xc9, 0x89, 0x52, 0xd6, 0x98, 0x5f, 0xdb, 0x9c, 0x63, 0xe5, 0xa7, 0x71, 0xea, 0xad, 0x78, 0xeb, 0xaf, 0x78, 0xe2, 0xa9, 0x73, 0xe2, 0xac, 0x7a, 0xda, 0xa1, 0x6d, 0xd2, 0xa3, 0x78, 0xc3, 0x99, 0x74, 0xc0, 0x9f, 0x82, 0xd4, 0xc4, 0xb6, 0xee, 0xec, 0xe5, 0xf4, 0xf4, 0xf0, 0xfd, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf4, 0xf4, 0xf4, 0xbe, 0xb8, 0xb7, 0xba, 0xb5, 0xb1, 0xc4, 0xb3, 0xa7, 0xa4, 0x80, 0x68, 0x8d, 0x68, 0x51, 0x85, 0x61, 0x45, 0x82, 0x5c, 0x3e, 0x72, 0x4d, 0x38, 0x74, 0x53, 0x37, 0x8a, 0x60, 0x3f, 0xae, 0x7c, 0x55, 0xac, 0x76, 0x4c, 0xd5, 0x9b, 0x6a, 0xd5, 0x99, 0x65, 0xd4, 0x95, 0x5d, 0xbc, 0x84, 0x55, 0xbe, 0x86, 0x57, 0xbc, 0x87, 0x5b, 0xc7, 0x95, 0x67, 0xcf, 0x98, 0x6c, 0xb4, 0x7d, 0x51, 0xb6, 0x7b, 0x4f, 0xc5, 0x8a, 0x5e, 0xcd, 0x93, 0x61, 0xc5, 0x85, 0x55, 0xb0, 0x71, 0x3f, 0xc4, 0x85, 0x52, 0xbb, 0x7a, 0x4c, 0xac, 0x72, 0x47, 0xa8, 0x71, 0x49, 0x8e, 0x60, 0x3e, 0x82, 0x5b, 0x3e, 0x88, 0x63, 0x46, 0x80, 0x59, 0x3e, 0x93, 0x66, 0x48, 0xbd, 0x87, 0x61, 0xc1, 0x86, 0x5a, 0xde, 0xa9, 0x7b, 0xca, 0x92, 0x60, 0xaa, 0x78, 0x53, 0x7d, 0x56, 0x35, 0xc9, 0x9e, 0x78, 0xef, 0xc9, 0xa4, 0xef, 0xd5, 0xbf, 0xeb, 0xd9, 0xc0, 0x9d, 0x81, 0x6e, 0x7e, 0x68, 0x5c, 0x54, 0x40, 0x30, 0xb1, 0x85, 0x5f, 0xc7, 0x96, 0x6d, 0xb0, 0x85, 0x63, 0x94, 0x6a, 0x49, 0x9a, 0x6c, 0x49, 0xab, 0x79, 0x53, 0xae, 0x7a, 0x51, 0xb8, 0x81, 0x56, 0xbf, 0x87, 0x5a, 0xb5, 0x80, 0x54, 0xb0, 0x7b, 0x4f, 0xb0, 0x7a, 0x50, 0xbb, 0x81, 0x54, 0xb8, 0x7e, 0x52, 0xbe, 0x84, 0x58, 0xbb, 0x82, 0x55, 0xae, 0x78, 0x4f, 0xa4, 0x72, 0x4e, 0xca, 0x98, 0x6e, 0xda, 0xb4, 0x90, 0x89, 0x6e, 0x5e, 0x78, 0x5e, 0x50, 0xac, 0x93, 0x7e, 0xf2, 0xdb, 0xbe, 0xe1, 0xbc, 0x96, 0xc1, 0x94, 0x6d, 0x88, 0x5f, 0x3c, 0x99, 0x69, 0x48, 0xc5, 0x90, 0x66, 0xd8, 0xa0, 0x6d, 0xdf, 0xa6, 0x72, 0xec, 0xb5, 0x83, 0xeb, 0xb6, 0x89, 0xc0, 0x8c, 0x63, 0xc6, 0x94, 0x6d, 0xb6, 0x83, 0x60, 0xbd, 0x90, 0x69, 0x95, 0x66, 0x45, 0x89, 0x5a, 0x32, 0x85, 0x54, 0x29, 0x97, 0x5e, 0x35, 0xb4, 0x72, 0x40, 0xb8, 0x7e, 0x4b, 0xb6, 0x7c, 0x49, 0xc2, 0x84, 0x54, 0xd2, 0x94, 0x5f, 0xdb, 0x9d, 0x6a, 0xc4, 0x86, 0x53, 0xc7, 0x89, 0x51, 0xe0, 0xa1, 0x69, 0xe7, 0xa9, 0x73, 0xe8, 0xab, 0x75, 0xe3, 0xa7, 0x70, 0xe4, 0xaa, 0x74, 0xe2, 0xab, 0x78, 0xe0, 0xa2, 0x6c, 0xd2, 0x9e, 0x70, 0xdb, 0xb4, 0x93, 0xd2, 0xac, 0x8c, 0xc6, 0xb0, 0x97, 0xdc, 0xd0, 0xcb, 0xf6, 0xf6, 0xf1, 0xf7, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfa, 0xf9, 0xf9, 0xe3, 0xe3, 0xe3, 0xd7, 0xd6, 0xd2, 0xda, 0xdd, 0xd7, 0xc3, 0xb1, 0xa3, 0x96, 0x71, 0x54, 0x8b, 0x60, 0x47, 0x97, 0x6c, 0x4d, 0x83, 0x61, 0x44, 0x75, 0x51, 0x31, 0x93, 0x67, 0x45, 0x9a, 0x6c, 0x47, 0x9e, 0x6d, 0x43, 0xc1, 0x8b, 0x5e, 0xd0, 0x96, 0x65, 0xd4, 0x96, 0x63, 0xd6, 0x98, 0x65, 0xcd, 0x93, 0x61, 0xca, 0x90, 0x5e, 0xd1, 0x9b, 0x6e, 0xdb, 0xa1, 0x71, 0xca, 0x90, 0x60, 0xcb, 0x91, 0x61, 0xcc, 0x91, 0x65, 0xc1, 0x86, 0x5a, 0xbc, 0x81, 0x55, 0xb1, 0x76, 0x4a, 0xc6, 0x89, 0x5a, 0xc1, 0x85, 0x55, 0xb8, 0x7f, 0x4d, 0xa2, 0x68, 0x3a, 0xaf, 0x78, 0x4e, 0xb1, 0x7e, 0x57, 0x98, 0x6b, 0x4c, 0x79, 0x54, 0x3c, 0x7a, 0x56, 0x3f, 0x88, 0x5c, 0x3e, 0xcf, 0x9d, 0x75, 0xc8, 0x93, 0x68, 0xba, 0x7f, 0x51, 0xcb, 0x90, 0x64, 0xc4, 0x89, 0x5d, 0xc6, 0x9b, 0x73, 0xc8, 0xa0, 0x81, 0xc7, 0xa2, 0x80, 0xc5, 0xa0, 0x7e, 0xea, 0xd0, 0xb2, 0xca, 0xab, 0x95, 0xb4, 0x9b, 0x83, 0x8a, 0x6b, 0x54, 0xb4, 0x88, 0x61, 0xdb, 0xaf, 0x88, 0xc9, 0x9a, 0x71, 0x8d, 0x60, 0x42, 0x98, 0x6b, 0x47, 0xa4, 0x72, 0x4d, 0xa8, 0x74, 0x4b, 0xbe, 0x86, 0x5a, 0xc0, 0x87, 0x58, 0xb2, 0x7c, 0x4c, 0xb4, 0x7e, 0x50, 0xaa, 0x75, 0x4c, 0xb4, 0x7f, 0x55, 0xaf, 0x78, 0x4d, 0xb6, 0x7f, 0x54, 0xbd, 0x87, 0x58, 0xaf, 0x78, 0x50, 0xa6, 0x72, 0x4b, 0xc4, 0x91, 0x69, 0xd4, 0xa1, 0x7a, 0xb7, 0x94, 0x79, 0xb6, 0x97, 0x7f, 0xdc, 0xbc, 0xa4, 0xe8, 0xc4, 0xa6, 0xcc, 0xad, 0x8d, 0xcd, 0xa7, 0x86, 0xc0, 0x95, 0x70, 0xa8, 0x76, 0x4b, 0xb8, 0x81, 0x52, 0xe2, 0xa6, 0x75, 0xd2, 0x94, 0x63, 0xce, 0x91, 0x63, 0xd8, 0xa4, 0x75, 0xb3, 0x82, 0x58, 0xca, 0x98, 0x73, 0xc4, 0x92, 0x6d, 0xc7, 0x97, 0x72, 0xb4, 0x80, 0x56, 0xa3, 0x6e, 0x42, 0xb6, 0x7c, 0x4d, 0x91, 0x59, 0x32, 0xb1, 0x73, 0x44, 0xc3, 0x85, 0x54, 0xc6, 0x88, 0x57, 0xc6, 0x87, 0x56, 0xbc, 0x7e, 0x4d, 0xd2, 0x93, 0x5d, 0xd4, 0x94, 0x5f, 0xcc, 0x8e, 0x5a, 0xce, 0x90, 0x5d, 0xe1, 0xa3, 0x6c, 0xea, 0xab, 0x72, 0xec, 0xaf, 0x78, 0xea, 0xaf, 0x79, 0xdc, 0xa1, 0x6b, 0xe1, 0xa6, 0x73, 0xd9, 0xa3, 0x74, 0xd3, 0xa5, 0x7e, 0xd3, 0xb1, 0x94, 0xcf, 0xb6, 0xa0, 0xd9, 0xcd, 0xc6, 0xe5, 0xde, 0xd7, 0xfa, 0xf8, 0xf4, 0xfd, 0xfd, 0xfb, 0xfe, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf6, 0xf5, 0xf5, 0xe6, 0xe6, 0xe6, 0xe7, 0xe7, 0xe8, 0xe4, 0xdf, 0xd8, 0xb0, 0x90, 0x77, 0x8f, 0x66, 0x46, 0x96, 0x6c, 0x48, 0x95, 0x6b, 0x47, 0x87, 0x5f, 0x3d, 0x9a, 0x6e, 0x48, 0x9c, 0x6d, 0x47, 0x97, 0x69, 0x43, 0xa9, 0x79, 0x4f, 0xbc, 0x86, 0x58, 0xd1, 0x96, 0x65, 0xd0, 0x93, 0x5f, 0xd2, 0x94, 0x61, 0xca, 0x91, 0x5e, 0xd2, 0x99, 0x66, 0xdc, 0x9f, 0x6d, 0xd9, 0x9f, 0x6f, 0xce, 0x94, 0x63, 0xd1, 0x97, 0x67, 0xc4, 0x89, 0x5d, 0xc0, 0x85, 0x59, 0xbd, 0x82, 0x56, 0xb9, 0x7e, 0x52, 0xb6, 0x7e, 0x52, 0xb4, 0x7c, 0x50, 0xaa, 0x74, 0x45, 0xa8, 0x71, 0x47, 0xa8, 0x72, 0x49, 0xc2, 0x8f, 0x68, 0x9f, 0x76, 0x56, 0x67, 0x45, 0x2c, 0x66, 0x45, 0x2f, 0x79, 0x51, 0x35, 0xbc, 0x8c, 0x66, 0xcd, 0x98, 0x6d, 0xbf, 0x84, 0x56, 0xd3, 0x98, 0x6c, 0xc1, 0x86, 0x5a, 0xb8, 0x85, 0x5c, 0xc7, 0xa2, 0x7e, 0xcf, 0xae, 0x93, 0xb8, 0x96, 0x7c, 0xce, 0xa6, 0x84, 0xde, 0xbc, 0x9e, 0xc1, 0x9e, 0x7e, 0x96, 0x6e, 0x51, 0xcf, 0xa4, 0x7c, 0xd8, 0xad, 0x85, 0xd0, 0x9d, 0x72, 0x96, 0x66, 0x43, 0x96, 0x68, 0x43, 0xa0, 0x6e, 0x48, 0xb1, 0x7b, 0x50, 0xbd, 0x81, 0x52, 0xc5, 0x87, 0x56, 0xcb, 0x90, 0x5e, 0xbb, 0x80, 0x4f, 0xaf, 0x76, 0x48, 0xb5, 0x7c, 0x4e, 0xb5, 0x7e, 0x52, 0xb6, 0x7f, 0x54, 0xb9, 0x82, 0x54, 0xb5, 0x7e, 0x56, 0xa4, 0x71, 0x4a, 0xc7, 0x94, 0x6c, 0xdf, 0xac, 0x82, 0xbe, 0x95, 0x6f, 0xde, 0xbb, 0xa1, 0xdf, 0xbc, 0xa2, 0xd5, 0xb1, 0x93, 0xd1, 0xb2, 0x92, 0xd0, 0xb0, 0x93, 0xbb, 0x8f, 0x69, 0xb0, 0x7c, 0x50, 0xc5, 0x8e, 0x5f, 0xdd, 0xa3, 0x74, 0xdb, 0xa2, 0x74, 0xd5, 0x9c, 0x70, 0xdd, 0xa8, 0x7c, 0xad, 0x7a, 0x5a, 0xc7, 0x95, 0x70, 0xc7, 0x95, 0x70, 0xcd, 0x98, 0x6f, 0xb8, 0x81, 0x55, 0xb7, 0x82, 0x57, 0xb2, 0x78, 0x4a, 0xb5, 0x77, 0x49, 0xb4, 0x75, 0x47, 0xc3, 0x85, 0x54, 0xd0, 0x92, 0x61, 0xc9, 0x8b, 0x5a, 0xc2, 0x84, 0x53, 0xc4, 0x85, 0x4e, 0xd0, 0x91, 0x59, 0xdc, 0x9f, 0x6b, 0xdc, 0x9e, 0x6b, 0xda, 0x9c, 0x65, 0xdd, 0x9f, 0x66, 0xe6, 0xa9, 0x72, 0xea, 0xaf, 0x79, 0xed, 0xb2, 0x7b, 0xde, 0xa3, 0x70, 0xe4, 0xaf, 0x81, 0xd6, 0xaa, 0x85, 0xce, 0xa7, 0x85, 0xcf, 0xb4, 0x9b, 0xd4, 0xc3, 0xba, 0xe9, 0xe2, 0xdb, 0xe9, 0xe7, 0xe3, 0xf4, 0xf4, 0xf2, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xee, 0xf1, 0xee, 0xf1, 0xee, 0xed, 0xe6, 0xe7, 0xe5, 0xbf, 0xa8, 0x9e, 0x9b, 0x77, 0x5a, 0x96, 0x6e, 0x4e, 0x97, 0x6e, 0x51, 0x9d, 0x6e, 0x48, 0xa7, 0x75, 0x4a, 0x9e, 0x6f, 0x4b, 0x8e, 0x61, 0x41, 0x95, 0x65, 0x47, 0xa4, 0x71, 0x48, 0xc2, 0x8c, 0x5e, 0xc8, 0x8e, 0x5e, 0xc3, 0x88, 0x58, 0xc5, 0x8b, 0x5a, 0xd6, 0x9a, 0x67, 0xd8, 0x9c, 0x69, 0xca, 0x8f, 0x63, 0xd0, 0x96, 0x63, 0xca, 0x92, 0x66, 0xbe, 0x86, 0x5a, 0xb1, 0x7b, 0x54, 0xaf, 0x7a, 0x4f, 0xc0, 0x85, 0x5a, 0xc9, 0x8f, 0x5c, 0xc8, 0x8c, 0x61, 0xc2, 0x88, 0x5f, 0x99, 0x5e, 0x39, 0xc2, 0x88, 0x5e, 0xd3, 0x9b, 0x6b, 0xbe, 0x89, 0x60, 0x97, 0x68, 0x4a, 0x6e, 0x49, 0x34, 0x56, 0x37, 0x23, 0x64, 0x41, 0x28, 0xab, 0x7c, 0x57, 0xc1, 0x92, 0x69, 0xba, 0x87, 0x5b, 0xb9, 0x86, 0x5b, 0xb7, 0x84, 0x59, 0xb8, 0x84, 0x5c, 0xd2, 0xa6, 0x85, 0xd7, 0xbb, 0xa1, 0xd6, 0xb2, 0x93, 0xc6, 0x9e, 0x7c, 0xda, 0xb2, 0x90, 0xbd, 0x95, 0x72, 0x7a, 0x5c, 0x41, 0x96, 0x6a, 0x42, 0xc1, 0x8e, 0x62, 0xbc, 0x86, 0x5b, 0x99, 0x69, 0x43, 0x98, 0x6a, 0x4a, 0xad, 0x7c, 0x56, 0xc0, 0x8b, 0x5e, 0xc5, 0x8e, 0x60, 0xbf, 0x88, 0x5b, 0xbe, 0x88, 0x5c, 0xc1, 0x89, 0x5d, 0xc2, 0x88, 0x57, 0xb3, 0x79, 0x49, 0xb1, 0x78, 0x4d, 0xb9, 0x84, 0x58, 0xb8, 0x83, 0x58, 0xc0, 0x8b, 0x61, 0xad, 0x7a, 0x4f, 0xb6, 0x83, 0x59, 0xce, 0x9b, 0x6f, 0xb1, 0x82, 0x5b, 0xdc, 0xb3, 0x90, 0xcd, 0xa4, 0x82, 0xcc, 0xaa, 0x8f, 0xdf, 0xbd, 0xa2, 0xb8, 0x92, 0x71, 0xc1, 0x92, 0x6b, 0xc5, 0x8f, 0x63, 0xca, 0x93, 0x65, 0xdb, 0xa3, 0x75, 0xc8, 0x8e, 0x5c, 0xd3, 0xa1, 0x76, 0xd5, 0x9e, 0x72, 0xa9, 0x7b, 0x5b, 0x9e, 0x6f, 0x4d, 0xc7, 0x9a, 0x71, 0xc7, 0x97, 0x6a, 0xa6, 0x71, 0x47, 0xbc, 0x88, 0x5c, 0xb6, 0x7d, 0x4c, 0xbf, 0x83, 0x52, 0xb7, 0x7b, 0x49, 0xc1, 0x85, 0x52, 0xcf, 0x90, 0x58, 0xd1, 0x90, 0x5c, 0xd0, 0x94, 0x5f, 0xca, 0x8b, 0x55, 0xc7, 0x8d, 0x5a, 0xce, 0x93, 0x61, 0xd3, 0x97, 0x65, 0xe3, 0xa6, 0x72, 0xd8, 0x9a, 0x65, 0xe1, 0xa4, 0x6c, 0xed, 0xb0, 0x77, 0xe8, 0xab, 0x74, 0xe6, 0xaa, 0x78, 0xe7, 0xad, 0x81, 0xf6, 0xcc, 0xb0, 0xdd, 0xbf, 0xad, 0xdb, 0xc9, 0xb8, 0xc3, 0xb3, 0xa4, 0xe9, 0xe5, 0xdd, 0xf4, 0xf0, 0xed, 0xf1, 0xf1, 0xef, 0xfb, 0xfb, 0xf9, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xfa, 0xfa, 0xf4, 0xf7, 0xf4, 0xf1, 0xee, 0xed, 0xd3, 0xc8, 0xbe, 0xa0, 0x7d, 0x6b, 0x9e, 0x74, 0x52, 0x9e, 0x6f, 0x49, 0xb3, 0x7a, 0x52, 0xb8, 0x82, 0x55, 0xb9, 0x82, 0x5a, 0x94, 0x69, 0x48, 0x78, 0x56, 0x34, 0x8a, 0x61, 0x41, 0xa9, 0x7a, 0x4f, 0xc2, 0x8c, 0x5e, 0xc5, 0x8b, 0x5a, 0xc2, 0x88, 0x58, 0xdd, 0xa3, 0x72, 0xd4, 0x9b, 0x6c, 0xd2, 0x99, 0x6a, 0xdb, 0xa1, 0x71, 0xc3, 0x88, 0x5a, 0xb3, 0x7e, 0x54, 0xba, 0x84, 0x5a, 0xb2, 0x7d, 0x52, 0xc8, 0x94, 0x63, 0xd7, 0x9d, 0x6c, 0xd0, 0x96, 0x67, 0xb0, 0x7b, 0x50, 0xc6, 0x8a, 0x5a, 0xcb, 0x8e, 0x61, 0xb7, 0x7a, 0x4d, 0xc5, 0x8c, 0x5a, 0xc8, 0x93, 0x67, 0xa3, 0x75, 0x52, 0x8e, 0x69, 0x4e, 0x52, 0x35, 0x1f, 0x5c, 0x3c, 0x27, 0xab, 0x7e, 0x5e, 0xad, 0x7f, 0x5a, 0xd1, 0x9e, 0x75, 0xe3, 0xb0, 0x85, 0xbf, 0x8c, 0x61, 0xc6, 0x93, 0x65, 0xcc, 0xa1, 0x7a, 0xdb, 0xb7, 0x98, 0xd3, 0xaf, 0x91, 0xbc, 0x94, 0x71, 0xc6, 0x9d, 0x7b, 0xab, 0x83, 0x61, 0x9c, 0x78, 0x56, 0xa4, 0x7c, 0x5b, 0x79, 0x52, 0x33, 0x99, 0x6d, 0x4a, 0x91, 0x63, 0x3e, 0xa5, 0x74, 0x51, 0xb8, 0x83, 0x59, 0xc4, 0x8e, 0x5f, 0xbf, 0x89, 0x5b, 0xb8, 0x81, 0x54, 0xb8, 0x81, 0x55, 0xbe, 0x87, 0x5a, 0xc3, 0x89, 0x59, 0xb9, 0x7f, 0x4f, 0xc4, 0x8b, 0x60, 0xba, 0x86, 0x59, 0xc0, 0x8b, 0x61, 0xbc, 0x87, 0x5d, 0xad, 0x7a, 0x4f, 0xb1, 0x7e, 0x53, 0xa4, 0x7b, 0x57, 0xb6, 0x8a, 0x63, 0xd1, 0xa5, 0x7e, 0xc6, 0x9a, 0x73, 0xdb, 0xb4, 0x94, 0xe5, 0xbf, 0x9e, 0xd5, 0xaa, 0x85, 0xc7, 0x94, 0x69, 0xc5, 0x8e, 0x60, 0xc7, 0x91, 0x63, 0xd5, 0x9d, 0x71, 0xdb, 0xa0, 0x72, 0xe2, 0xb1, 0x89, 0xca, 0x97, 0x6e, 0x94, 0x68, 0x4a, 0x9a, 0x6b, 0x48, 0xcc, 0x9f, 0x76, 0xcd, 0xa1, 0x7c, 0xa6, 0x76, 0x52, 0xb2, 0x7d, 0x51, 0xb8, 0x7e, 0x4e, 0xba, 0x7f, 0x4d, 0xc2, 0x86, 0x54, 0xa3, 0x6a, 0x48, 0xba, 0x7d, 0x51, 0xcb, 0x8e, 0x5d, 0xcf, 0x98, 0x64, 0xc0, 0x8c, 0x61, 0xc1, 0x87, 0x57, 0xd2, 0x95, 0x64, 0xcc, 0x90, 0x5e, 0xce, 0x91, 0x5c, 0xde, 0xa1, 0x6c, 0xde, 0xa1, 0x69, 0xe7, 0xaa, 0x71, 0xeb, 0xaf, 0x76, 0xe9, 0xae, 0x77, 0xe5, 0xab, 0x79, 0xe0, 0xb1, 0x82, 0xdb, 0xb7, 0x92, 0xdd, 0xcb, 0xbb, 0xda, 0xd2, 0xc8, 0xe0, 0xdb, 0xd3, 0xf7, 0xf5, 0xf1, 0xf8, 0xf8, 0xf6, 0xfb, 0xfc, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfe, 0xff, 0xfb, 0xfa, 0xfa, 0xf1, 0xf0, 0xed, 0xe1, 0xd9, 0xd3, 0xc1, 0xab, 0x98, 0xad, 0x81, 0x64, 0xb4, 0x81, 0x58, 0xb3, 0x7e, 0x55, 0xb7, 0x7f, 0x56, 0xb0, 0x7d, 0x54, 0x96, 0x6a, 0x46, 0x88, 0x5f, 0x3f, 0x8f, 0x65, 0x44, 0x9a, 0x6c, 0x4b, 0xac, 0x7c, 0x54, 0xc0, 0x8b, 0x5c, 0xc3, 0x8a, 0x58, 0xc5, 0x8b, 0x5b, 0xd0, 0x96, 0x66, 0xce, 0x99, 0x6b, 0xdb, 0xa2, 0x75, 0xc7, 0x90, 0x61, 0xaf, 0x7a, 0x4e, 0xab, 0x7a, 0x53, 0xc3, 0x8f, 0x63, 0xc5, 0x91, 0x65, 0xc6, 0x90, 0x60, 0xbb, 0x83, 0x56, 0xb2, 0x76, 0x49, 0xbc, 0x82, 0x53, 0xd7, 0x9a, 0x68, 0xd3, 0x97, 0x61, 0xbd, 0x80, 0x50, 0xd0, 0x95, 0x66, 0xcc, 0x96, 0x6a, 0xb1, 0x80, 0x5e, 0x82, 0x5d, 0x43, 0x56, 0x39, 0x23, 0x51, 0x34, 0x1f, 0x82, 0x5b, 0x3f, 0xa7, 0x77, 0x53, 0xc0, 0x8e, 0x6a, 0xc6, 0x95, 0x6c, 0xce, 0x99, 0x6e, 0xcc, 0x9b, 0x6c, 0xb8, 0x88, 0x65, 0xd0, 0xa5, 0x81, 0xcd, 0xa7, 0x87, 0xb7, 0x8e, 0x6e, 0x9d, 0x78, 0x5a, 0xa2, 0x7a, 0x58, 0xab, 0x83, 0x60, 0xa1, 0x74, 0x53, 0x99, 0x6e, 0x4e, 0x7b, 0x4f, 0x2d, 0x97, 0x69, 0x45, 0xb1, 0x7f, 0x58, 0xb4, 0x7e, 0x53, 0xb8, 0x80, 0x52, 0xb5, 0x7d, 0x50, 0xb1, 0x79, 0x4d, 0xa5, 0x6e, 0x44, 0xb2, 0x7a, 0x50, 0xb9, 0x7f, 0x52, 0xbd, 0x81, 0x51, 0xb2, 0x77, 0x49, 0xb8, 0x7f, 0x50, 0xb1, 0x7d, 0x54, 0xc1, 0x8d, 0x63, 0xba, 0x8b, 0x64, 0xb1, 0x7e, 0x53, 0xb7, 0x89, 0x65, 0xbb, 0x88, 0x5f, 0xd6, 0xa5, 0x7e, 0xb5, 0x88, 0x63, 0xd2, 0xa9, 0x83, 0xe2, 0xb9, 0x93, 0xd0, 0x9f, 0x75, 0xb6, 0x81, 0x55, 0xc7, 0x91, 0x65, 0xd2, 0x9c, 0x71, 0xd7, 0xa1, 0x77, 0xc5, 0x8f, 0x66, 0xe0, 0xad, 0x86, 0xad, 0x80, 0x5d, 0xa0, 0x76, 0x55, 0xc5, 0x97, 0x72, 0xbc, 0x8e, 0x6b, 0xcd, 0x99, 0x70, 0xb0, 0x79, 0x4e, 0xaf, 0x79, 0x4b, 0xb6, 0x7d, 0x50, 0xbb, 0x7f, 0x4f, 0xc4, 0x89, 0x55, 0xc4, 0x8a, 0x5a, 0xb8, 0x7e, 0x53, 0xc1, 0x86, 0x59, 0xc2, 0x89, 0x5c, 0xd2, 0x9b, 0x6c, 0xc1, 0x8b, 0x5e, 0xcd, 0x93, 0x65, 0xd7, 0x9c, 0x6b, 0xd4, 0x98, 0x64, 0xcf, 0x91, 0x5d, 0xe0, 0xa3, 0x6e, 0xe0, 0xa3, 0x6c, 0xe6, 0xa8, 0x71, 0xe7, 0xaa, 0x74, 0xe3, 0xa8, 0x73, 0xdc, 0xa6, 0x72, 0xda, 0xa8, 0x82, 0xd9, 0xba, 0x9f, 0xd5, 0xc9, 0xbc, 0xe8, 0xe3, 0xdc, 0xf6, 0xf5, 0xf2, 0xf4, 0xf5, 0xf2, 0xfd, 0xfd, 0xfb, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf2, 0xee, 0xeb, 0xe4, 0xde, 0xda, 0xd9, 0xcb, 0xc0, 0xbf, 0xa4, 0x8c, 0xbb, 0x8b, 0x67, 0xb7, 0x81, 0x57, 0xba, 0x85, 0x5b, 0xb8, 0x85, 0x53, 0x97, 0x66, 0x41, 0x91, 0x65, 0x44, 0x93, 0x68, 0x45, 0x95, 0x69, 0x47, 0x98, 0x6c, 0x49, 0x9f, 0x71, 0x4b, 0xb1, 0x7c, 0x50, 0xb9, 0x80, 0x50, 0xca, 0x90, 0x5f, 0xda, 0xa0, 0x6f, 0xd1, 0x9c, 0x6e, 0xcc, 0x91, 0x65, 0xb6, 0x80, 0x54, 0xad, 0x7b, 0x4e, 0xbb, 0x89, 0x5f, 0xc7, 0x94, 0x68, 0xb9, 0x88, 0x5e, 0xbc, 0x88, 0x5b, 0xc0, 0x89, 0x5c, 0xca, 0x8e, 0x5d, 0xca, 0x8c, 0x5b, 0xcc, 0x8e, 0x5d, 0xde, 0xa2, 0x6d, 0xd8, 0x9c, 0x6c, 0xc3, 0x88, 0x5a, 0xd3, 0x9d, 0x71, 0xbe, 0x8c, 0x67, 0x8d, 0x68, 0x4a, 0x57, 0x3a, 0x26, 0x51, 0x33, 0x1e, 0x71, 0x4d, 0x32, 0xa2, 0x74, 0x53, 0xbe, 0x90, 0x6f, 0xb2, 0x86, 0x5e, 0xbc, 0x8b, 0x60, 0xc3, 0x92, 0x66, 0xb6, 0x84, 0x5f, 0xd3, 0xa7, 0x82, 0xd5, 0xad, 0x8c, 0xa8, 0x81, 0x62, 0x87, 0x63, 0x47, 0xaa, 0x80, 0x5a, 0xbc, 0x91, 0x6c, 0xa9, 0x7f, 0x5d, 0x86, 0x5c, 0x3a, 0x95, 0x68, 0x43, 0xa6, 0x78, 0x54, 0xad, 0x7d, 0x58, 0xb2, 0x7f, 0x56, 0xad, 0x76, 0x4b, 0xa4, 0x6e, 0x43, 0xa5, 0x6e, 0x44, 0xa9, 0x72, 0x49, 0xb0, 0x79, 0x4f, 0xb9, 0x80, 0x55, 0xc3, 0x87, 0x58, 0xbd, 0x80, 0x51, 0xb7, 0x7b, 0x4c, 0xbe, 0x87, 0x5b, 0xc3, 0x8d, 0x61, 0xbf, 0x8f, 0x65, 0xbb, 0x88, 0x5d, 0xb7, 0x88, 0x64, 0xbb, 0x87, 0x60, 0xc8, 0x95, 0x6d, 0xad, 0x7f, 0x5a, 0xbb, 0x8e, 0x67, 0xc7, 0x99, 0x73, 0xc9, 0x95, 0x6a, 0xb9, 0x84, 0x58, 0xb5, 0x80, 0x56, 0xd0, 0x9b, 0x71, 0xd6, 0xa3, 0x7a, 0xcc, 0x9a, 0x73, 0xcd, 0x9c, 0x75, 0x9b, 0x71, 0x50, 0xbd, 0x8f, 0x6a, 0xbe, 0x90, 0x6a, 0xca, 0x9b, 0x7b, 0xc4, 0x8f, 0x67, 0xb8, 0x80, 0x54, 0xbb, 0x86, 0x56, 0xa9, 0x70, 0x44, 0xbd, 0x81, 0x52, 0xd2, 0x96, 0x61, 0xd0, 0x94, 0x62, 0xc4, 0x8d, 0x5e, 0xbd, 0x82, 0x56, 0xc7, 0x8d, 0x60, 0xd0, 0x99, 0x6c, 0xcf, 0x98, 0x6b, 0xcb, 0x90, 0x64, 0xd3, 0x98, 0x69, 0xd7, 0x9b, 0x67, 0xd5, 0x98, 0x64, 0xd5, 0x97, 0x63, 0xe1, 0xa4, 0x6f, 0xe1, 0xa2, 0x6e, 0xe1, 0xa2, 0x6d, 0xe1, 0xa8, 0x72, 0xe2, 0xab, 0x74, 0xe1, 0xab, 0x83, 0xd7, 0xa7, 0x81, 0xcf, 0xb5, 0x98, 0xdc, 0xd5, 0xcc, 0xf2, 0xef, 0xe9, 0xfa, 0xfb, 0xf8, 0xfb, 0xfb, 0xf9, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf7, 0xf4, 0xf2, 0xe6, 0xdf, 0xd9, 0xe0, 0xd7, 0xd0, 0xcb, 0xb8, 0xa9, 0xcd, 0xad, 0x93, 0xbe, 0x8b, 0x65, 0xc0, 0x8b, 0x60, 0xb5, 0x7f, 0x55, 0x9e, 0x6c, 0x45, 0x8f, 0x61, 0x3e, 0x99, 0x6b, 0x45, 0xa3, 0x74, 0x4d, 0x93, 0x66, 0x42, 0x93, 0x67, 0x44, 0x97, 0x69, 0x45, 0xaf, 0x79, 0x51, 0xba, 0x81, 0x55, 0xce, 0x95, 0x64, 0xcd, 0x94, 0x63, 0xdc, 0xa7, 0x79, 0xb6, 0x7c, 0x50, 0xb3, 0x7d, 0x51, 0xbf, 0x8d, 0x5f, 0xc3, 0x8e, 0x61, 0xb4, 0x85, 0x5d, 0xa9, 0x7c, 0x55, 0xbe, 0x8c, 0x62, 0xd8, 0xa2, 0x70, 0xdc, 0xa1, 0x6d, 0xcc, 0x8e, 0x5d, 0xc9, 0x8b, 0x5a, 0xe0, 0xa5, 0x6f, 0xe3, 0xa7, 0x76, 0xdd, 0xa2, 0x74, 0xcf, 0x99, 0x6d, 0xbf, 0x8d, 0x62, 0x9c, 0x77, 0x55, 0x59, 0x3c, 0x28, 0x51, 0x32, 0x1d, 0x62, 0x3f, 0x25, 0x90, 0x67, 0x49, 0x9a, 0x70, 0x52, 0xb4, 0x8a, 0x67, 0xbf, 0x91, 0x6a, 0xce, 0x9d, 0x75, 0xc3, 0x93, 0x69, 0xc4, 0x97, 0x72, 0xda, 0xb2, 0x90, 0x82, 0x5f, 0x44, 0x8b, 0x64, 0x46, 0xb7, 0x87, 0x5f, 0xa3, 0x73, 0x4c, 0x93, 0x69, 0x48, 0x79, 0x4e, 0x2c, 0x9c, 0x6e, 0x49, 0xab, 0x7d, 0x58, 0x95, 0x68, 0x45, 0x93, 0x62, 0x3c, 0x99, 0x67, 0x40, 0x9c, 0x6b, 0x44, 0xa2, 0x6f, 0x47, 0xa9, 0x72, 0x49, 0xb2, 0x7b, 0x52, 0xb4, 0x7b, 0x4e, 0xb5, 0x79, 0x49, 0xc1, 0x84, 0x55, 0xbc, 0x7f, 0x4f, 0xc5, 0x8c, 0x57, 0xcc, 0x92, 0x5e, 0xc4, 0x8b, 0x5c, 0xc8, 0x95, 0x6b, 0xb9, 0x8a, 0x66, 0xc3, 0x91, 0x69, 0xc0, 0x8a, 0x5e, 0xb1, 0x7f, 0x57, 0xa5, 0x75, 0x4c, 0xc1, 0x90, 0x68, 0xc1, 0x8c, 0x60, 0xc3, 0x8e, 0x62, 0xd0, 0x9b, 0x71, 0xd5, 0xa0, 0x76, 0xc9, 0x98, 0x71, 0xd2, 0xa4, 0x7f, 0xc9, 0x9c, 0x78, 0x96, 0x6d, 0x4e, 0xc0, 0x8e, 0x66, 0xbe, 0x90, 0x6a, 0xc7, 0x99, 0x78, 0xbe, 0x89, 0x61, 0xbc, 0x85, 0x58, 0xca, 0x94, 0x64, 0xb1, 0x78, 0x4c, 0xbc, 0x81, 0x52, 0xcb, 0x8f, 0x5b, 0xcb, 0x8f, 0x5e, 0xd2, 0x9a, 0x6c, 0xcc, 0x91, 0x65, 0xca, 0x90, 0x63, 0xc2, 0x8c, 0x5e, 0xbe, 0x87, 0x5a, 0xd2, 0x98, 0x6b, 0xc9, 0x8f, 0x5f, 0xd0, 0x93, 0x60, 0xd6, 0x98, 0x65, 0xd6, 0x98, 0x64, 0xde, 0xa0, 0x6b, 0xe3, 0xa4, 0x6f, 0xde, 0xa0, 0x6b, 0xe1, 0xa8, 0x72, 0xda, 0xa3, 0x6c, 0xe2, 0xad, 0x85, 0xda, 0xb8, 0x95, 0xe1, 0xd1, 0xca, 0xe3, 0xd8, 0xcd, 0xdc, 0xd5, 0xcd, 0xf5, 0xf5, 0xf3, 0xfa, 0xfa, 0xf8, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xef, 0xee, 0xea, 0xf0, 0xef, 0xeb, 0xe5, 0xe1, 0xda, 0xce, 0xb9, 0xa7, 0xc5, 0x9f, 0x81, 0xc7, 0x99, 0x74, 0xb5, 0x80, 0x56, 0xaa, 0x75, 0x4b, 0x9d, 0x6e, 0x4b, 0x9f, 0x6d, 0x48, 0xaf, 0x7c, 0x52, 0xa3, 0x73, 0x4b, 0x85, 0x59, 0x35, 0x87, 0x5c, 0x3a, 0x87, 0x5b, 0x39, 0xa8, 0x75, 0x4e, 0xbb, 0x83, 0x55, 0xce, 0x98, 0x66, 0xcb, 0x94, 0x63, 0xce, 0x9a, 0x6b, 0xab, 0x79, 0x4f, 0xc0, 0x8c, 0x60, 0xc9, 0x94, 0x64, 0xb7, 0x89, 0x60, 0xb1, 0x82, 0x5d, 0xc3, 0x93, 0x69, 0xdd, 0xa9, 0x7a, 0xcd, 0x96, 0x68, 0xcd, 0x91, 0x60, 0xcc, 0x92, 0x61, 0xd9, 0x9a, 0x65, 0xe0, 0xa2, 0x6f, 0xe4, 0xa7, 0x73, 0xdd, 0xa2, 0x73, 0xd0, 0x9a, 0x6e, 0xc4, 0x90, 0x68, 0x9d, 0x71, 0x52, 0x60, 0x40, 0x28, 0x55, 0x36, 0x1f, 0x52, 0x30, 0x16, 0x7f, 0x59, 0x3f, 0xa3, 0x78, 0x5a, 0xac, 0x83, 0x69, 0xa2, 0x76, 0x52, 0xb5, 0x87, 0x60, 0xa9, 0x7b, 0x54, 0xbe, 0x8f, 0x67, 0xab, 0x7d, 0x5a, 0x6c, 0x4f, 0x38, 0x96, 0x6e, 0x4e, 0xa4, 0x76, 0x4e, 0x91, 0x62, 0x40, 0x79, 0x54, 0x37, 0x8d, 0x61, 0x3d, 0x9e, 0x70, 0x49, 0x9f, 0x71, 0x4a, 0x99, 0x6b, 0x46, 0x8d, 0x5e, 0x3a, 0x8d, 0x5f, 0x3a, 0x95, 0x67, 0x43, 0x98, 0x68, 0x42, 0xa4, 0x70, 0x48, 0xa4, 0x70, 0x48, 0xb5, 0x80, 0x55, 0xbf, 0x84, 0x55, 0xc4, 0x8a, 0x5b, 0xcb, 0x8c, 0x5a, 0xcc, 0x8f, 0x60, 0xcd, 0x90, 0x61, 0xcb, 0x94, 0x66, 0xd1, 0x9e, 0x72, 0xc1, 0x90, 0x68, 0xb7, 0x85, 0x60, 0xc2, 0x8d, 0x61, 0xbe, 0x8a, 0x5e, 0xb1, 0x88, 0x60, 0xa1, 0x79, 0x58, 0xcb, 0x95, 0x6a, 0xcb, 0x94, 0x69, 0xc9, 0x95, 0x6a, 0xd3, 0xa2, 0x7a, 0xcc, 0x9e, 0x7a, 0xc0, 0x92, 0x6b, 0xbd, 0x90, 0x67, 0xb4, 0x85, 0x61, 0xd4, 0xa6, 0x81, 0xbe, 0x92, 0x6d, 0xbd, 0x91, 0x6b, 0xa7, 0x74, 0x4e, 0xcf, 0x99, 0x6a, 0xcc, 0x92, 0x61, 0xbd, 0x7e, 0x4f, 0xc3, 0x8c, 0x5b, 0xbb, 0x80, 0x50, 0xce, 0x92, 0x60, 0xc6, 0x8e, 0x5f, 0xb3, 0x7e, 0x53, 0xcc, 0x98, 0x69, 0xcf, 0x99, 0x6b, 0xd7, 0xa1, 0x73, 0xc5, 0x8b, 0x5b, 0xce, 0x94, 0x64, 0xd0, 0x92, 0x60, 0xd1, 0x91, 0x5e, 0xd8, 0x98, 0x64, 0xd8, 0x98, 0x64, 0xe1, 0xa3, 0x6e, 0xda, 0x9d, 0x67, 0xd9, 0x9c, 0x67, 0xde, 0xa6, 0x76, 0xdb, 0xaa, 0x81, 0xda, 0xb4, 0x95, 0xdc, 0xc8, 0xb6, 0xdb, 0xd4, 0xca, 0xe4, 0xe3, 0xdd, 0xec, 0xe8, 0xe1, 0xfb, 0xfa, 0xf8, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xef, 0xed, 0xea, 0xf2, 0xf1, 0xed, 0xda, 0xd1, 0xc8, 0xc7, 0xad, 0x98, 0xc3, 0x9a, 0x7a, 0xaa, 0x78, 0x51, 0xad, 0x75, 0x4a, 0xa0, 0x72, 0x4e, 0x96, 0x68, 0x42, 0xab, 0x7a, 0x50, 0xa7, 0x74, 0x49, 0x99, 0x6a, 0x41, 0x8a, 0x5e, 0x3a, 0x84, 0x5a, 0x38, 0x82, 0x56, 0x34, 0xa4, 0x72, 0x49, 0xb9, 0x7f, 0x52, 0xd1, 0x9b, 0x6a, 0xd0, 0x9a, 0x68, 0xc4, 0x90, 0x61, 0xb0, 0x7e, 0x55, 0xd6, 0xa1, 0x72, 0xb8, 0x83, 0x58, 0xaf, 0x82, 0x58, 0xbc, 0x8d, 0x68, 0xe3, 0xb3, 0x88, 0xdc, 0xa8, 0x79, 0xcd, 0x96, 0x68, 0xce, 0x92, 0x62, 0xcf, 0x95, 0x64, 0xd5, 0x96, 0x61, 0xe0, 0xa2, 0x6f, 0xd8, 0x9a, 0x67, 0xdf, 0xa4, 0x71, 0xd5, 0xa0, 0x6f, 0xc8, 0x94, 0x68, 0xa6, 0x7b, 0x58, 0x70, 0x50, 0x37, 0x59, 0x3a, 0x23, 0x67, 0x45, 0x2b, 0x75, 0x52, 0x36, 0x89, 0x63, 0x44, 0x87, 0x64, 0x4c, 0xa2, 0x7b, 0x5a, 0xa3, 0x75, 0x52, 0xb3, 0x85, 0x62, 0xb4, 0x85, 0x5f, 0x8c, 0x65, 0x4a, 0x6b, 0x4b, 0x32, 0xa5, 0x77, 0x53, 0x95, 0x6b, 0x47, 0x87, 0x5c, 0x3d, 0x7b, 0x52, 0x31, 0x81, 0x57, 0x36, 0x93, 0x65, 0x42, 0x99, 0x6b, 0x48, 0x89, 0x5b, 0x37, 0x83, 0x54, 0x30, 0x8e, 0x60, 0x3b, 0x90, 0x62, 0x3e, 0x90, 0x62, 0x3d, 0x96, 0x67, 0x41, 0x98, 0x69, 0x44, 0xa9, 0x77, 0x4f, 0xb0, 0x7a, 0x50, 0xc0, 0x86, 0x58, 0xcc, 0x8c, 0x5a, 0xbe, 0x82, 0x52, 0xba, 0x7e, 0x4e, 0xcd, 0x91, 0x5f, 0xcf, 0x99, 0x6b, 0xc9, 0x98, 0x6c, 0xac, 0x7b, 0x51, 0xc4, 0x8f, 0x63, 0xca, 0x95, 0x69, 0xcb, 0x97, 0x6d, 0x92, 0x66, 0x49, 0xbe, 0x88, 0x5f, 0xc5, 0x8e, 0x62, 0xc7, 0x93, 0x68, 0xca, 0x9b, 0x72, 0xba, 0x8c, 0x69, 0xb7, 0x88, 0x66, 0xba, 0x8a, 0x63, 0xc5, 0x95, 0x6f, 0xe1, 0xb8, 0x97, 0xd2, 0xa6, 0x81, 0xd1, 0xa5, 0x7f, 0xbb, 0x84, 0x5c, 0xcc, 0x92, 0x61, 0xc0, 0x86, 0x56, 0xba, 0x7a, 0x4c, 0xc7, 0x8c, 0x57, 0xb5, 0x7d, 0x52, 0xca, 0x8e, 0x5c, 0xcd, 0x95, 0x67, 0xbd, 0x89, 0x5a, 0xb4, 0x7f, 0x54, 0xce, 0x97, 0x6a, 0xce, 0x98, 0x6a, 0xce, 0x94, 0x64, 0xc8, 0x8d, 0x5d, 0xd2, 0x96, 0x66, 0xc9, 0x8d, 0x5d, 0xd1, 0x93, 0x61, 0xdb, 0x9b, 0x67, 0xdb, 0x9c, 0x67, 0xd0, 0x92, 0x5d, 0xda, 0x9d, 0x68, 0xcb, 0x92, 0x63, 0xcc, 0x9b, 0x72, 0xd1, 0xab, 0x8b, 0xcd, 0xb0, 0x96, 0xe1, 0xd9, 0xd0, 0xf3, 0xf2, 0xec, 0xeb, 0xe7, 0xe2, 0xfb, 0xfb, 0xf8, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xf8, 0xf6, 0xf8, 0xf7, 0xf5, 0xec, 0xe7, 0xe1, 0xd2, 0xc6, 0xbc, 0xc9, 0xac, 0x94, 0xb3, 0x85, 0x60, 0xb4, 0x81, 0x59, 0x9d, 0x72, 0x50, 0x90, 0x66, 0x44, 0xa1, 0x6f, 0x4b, 0x9d, 0x6b, 0x46, 0xac, 0x77, 0x4c, 0x93, 0x65, 0x3f, 0x7d, 0x58, 0x3a, 0x6c, 0x48, 0x2c, 0x73, 0x4f, 0x33, 0x99, 0x6c, 0x48, 0xbd, 0x85, 0x54, 0xd0, 0x99, 0x68, 0xc5, 0x91, 0x5e, 0xbd, 0x86, 0x59, 0xca, 0x93, 0x65, 0xc6, 0x91, 0x66, 0xb1, 0x81, 0x59, 0xc6, 0x97, 0x74, 0xde, 0xb0, 0x87, 0xd5, 0xa0, 0x74, 0xc7, 0x92, 0x66, 0xb8, 0x83, 0x57, 0xb5, 0x81, 0x55, 0xc6, 0x8a, 0x5a, 0xd0, 0x94, 0x64, 0xd7, 0x97, 0x65, 0xe8, 0xa8, 0x73, 0xe0, 0xa4, 0x75, 0xd8, 0x9f, 0x6e, 0xcf, 0x9a, 0x6b, 0xb8, 0x89, 0x65, 0x85, 0x5e, 0x42, 0x6b, 0x47, 0x2b, 0x6e, 0x4b, 0x2f, 0x6e, 0x49, 0x2d, 0x96, 0x6d, 0x4d, 0x70, 0x4e, 0x35, 0x85, 0x61, 0x4a, 0xa8, 0x7d, 0x5e, 0xa0, 0x76, 0x51, 0x9b, 0x72, 0x55, 0x7a, 0x5b, 0x42, 0x7b, 0x5a, 0x3b, 0x9c, 0x6b, 0x48, 0x91, 0x64, 0x40, 0x7a, 0x52, 0x33, 0xa0, 0x6f, 0x48, 0x99, 0x6a, 0x48, 0x85, 0x5c, 0x3b, 0x7f, 0x51, 0x2c, 0x86, 0x54, 0x30, 0x87, 0x55, 0x32, 0x8d, 0x5b, 0x37, 0x9b, 0x69, 0x44, 0x94, 0x65, 0x40, 0x9f, 0x72, 0x4d, 0xa8, 0x76, 0x52, 0xa5, 0x73, 0x4e, 0xab, 0x79, 0x54, 0xba, 0x83, 0x58, 0xbb, 0x80, 0x51, 0xc5, 0x89, 0x59, 0xba, 0x7d, 0x4e, 0xbb, 0x81, 0x50, 0xbf, 0x85, 0x55, 0xc1, 0x8c, 0x64, 0xb5, 0x80, 0x58, 0xc2, 0x8f, 0x65, 0xdc, 0xa6, 0x76, 0xc9, 0x93, 0x66, 0xab, 0x7d, 0x55, 0xa1, 0x72, 0x4d, 0xc8, 0x8e, 0x61, 0xbe, 0x8f, 0x62, 0xbe, 0x8f, 0x6e, 0xcb, 0x9f, 0x78, 0xb6, 0x86, 0x64, 0xca, 0x99, 0x6d, 0xd6, 0xae, 0x86, 0xdb, 0xae, 0x8d, 0xd6, 0xaa, 0x85, 0xdb, 0xaf, 0x8a, 0xbc, 0x88, 0x5e, 0xdd, 0xa6, 0x77, 0xcd, 0x92, 0x62, 0xb0, 0x75, 0x45, 0xd2, 0x92, 0x5f, 0xcc, 0x8f, 0x60, 0xcb, 0x90, 0x5f, 0xc7, 0x91, 0x65, 0xc6, 0x90, 0x61, 0xc1, 0x8a, 0x61, 0xbd, 0x89, 0x5c, 0xce, 0x99, 0x6d, 0xd5, 0x9f, 0x6e, 0xc4, 0x8e, 0x5c, 0xd0, 0x97, 0x63, 0xd1, 0x96, 0x62, 0xc9, 0x8b, 0x57, 0xd9, 0x9a, 0x65, 0xde, 0x9e, 0x69, 0xdd, 0x9e, 0x6c, 0xd3, 0x99, 0x67, 0xcf, 0x94, 0x61, 0xc3, 0x8d, 0x5b, 0xcf, 0xa0, 0x7e, 0xc9, 0xad, 0x95, 0xda, 0xca, 0xbf, 0xef, 0xed, 0xe9, 0xf2, 0xf0, 0xed, 0xfa, 0xf9, 0xf5, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfc, 0xf6, 0xf6, 0xf4, 0xf4, 0xf4, 0xf2, 0xe3, 0xdf, 0xd9, 0xc9, 0xb9, 0xac, 0xc7, 0xa6, 0x8c, 0xb6, 0x8e, 0x6e, 0xa6, 0x79, 0x56, 0xa1, 0x71, 0x4c, 0xa6, 0x76, 0x50, 0xa5, 0x74, 0x4e, 0xa1, 0x6f, 0x4a, 0x91, 0x61, 0x3f, 0x7b, 0x4f, 0x31, 0x72, 0x4c, 0x2f, 0x68, 0x45, 0x29, 0x77, 0x53, 0x37, 0x9e, 0x71, 0x4c, 0xc9, 0x91, 0x60, 0xce, 0x96, 0x65, 0xca, 0x96, 0x64, 0xb2, 0x7b, 0x4e, 0xd0, 0x9a, 0x6c, 0xbd, 0x88, 0x5d, 0xba, 0x89, 0x61, 0xdf, 0xb2, 0x8a, 0xe3, 0xb7, 0x89, 0xcc, 0x97, 0x6b, 0xc1, 0x8c, 0x60, 0xaf, 0x7a, 0x4e, 0xc4, 0x8f, 0x63, 0xda, 0x9e, 0x6e, 0xc8, 0x8c, 0x5d, 0xcf, 0x90, 0x5e, 0xda, 0x9a, 0x65, 0xe6, 0xab, 0x7b, 0xe2, 0xa9, 0x78, 0xdc, 0xa7, 0x78, 0xc1, 0x93, 0x6e, 0x81, 0x5a, 0x3e, 0x75, 0x52, 0x36, 0x7b, 0x58, 0x3c, 0x63, 0x3e, 0x22, 0x9c, 0x73, 0x53, 0x70, 0x4e, 0x35, 0x7c, 0x59, 0x41, 0x95, 0x6d, 0x51, 0x92, 0x6c, 0x49, 0x8e, 0x65, 0x48, 0x6b, 0x4c, 0x34, 0x89, 0x5f, 0x3f, 0xa3, 0x73, 0x4c, 0x8d, 0x68, 0x4b, 0x8a, 0x62, 0x42, 0xb2, 0x80, 0x59, 0x98, 0x69, 0x47, 0x96, 0x65, 0x3f, 0xaa, 0x79, 0x51, 0x9b, 0x69, 0x45, 0x97, 0x64, 0x41, 0x97, 0x65, 0x41, 0x9f, 0x6d, 0x48, 0x99, 0x67, 0x42, 0xaa, 0x78, 0x51, 0xa3, 0x73, 0x4c, 0x9b, 0x69, 0x44, 0xa4, 0x72, 0x4c, 0xb3, 0x80, 0x57, 0xb9, 0x82, 0x57, 0xbc, 0x83, 0x56, 0xb9, 0x80, 0x53, 0xce, 0x95, 0x63, 0xb3, 0x7a, 0x49, 0xd7, 0xa3, 0x75, 0xcf, 0x9a, 0x6c, 0xa5, 0x77, 0x4c, 0xcf, 0x9c, 0x73, 0xc7, 0x91, 0x64, 0xa1, 0x73, 0x4c, 0x9e, 0x72, 0x4e, 0xbd, 0x87, 0x5e, 0xb5, 0x86, 0x5f, 0xc8, 0x9a, 0x78, 0xbd, 0x91, 0x6a, 0xc6, 0x97, 0x6e, 0xc6, 0x94, 0x6b, 0xe2, 0xb9, 0x92, 0xd7, 0xac, 0x8a, 0xd2, 0xa6, 0x81, 0xd7, 0xab, 0x86, 0xb3, 0x7e, 0x54, 0xb7, 0x80, 0x51, 0xc7, 0x8d, 0x5d, 0xb2, 0x78, 0x47, 0xcb, 0x8f, 0x5a, 0xbd, 0x86, 0x56, 0xc0, 0x8a, 0x5d, 0xc2, 0x90, 0x65, 0xcd, 0x9c, 0x72, 0xb0, 0x7e, 0x53, 0xc4, 0x90, 0x63, 0xcf, 0x9b, 0x6e, 0xc1, 0x8b, 0x5a, 0xd6, 0xa0, 0x6e, 0xcc, 0x92, 0x5f, 0xd8, 0x9c, 0x68, 0xcb, 0x8d, 0x59, 0xd3, 0x93, 0x5f, 0xdc, 0x9c, 0x65, 0xe4, 0xa6, 0x6e, 0xd0, 0x96, 0x62, 0xce, 0x92, 0x62, 0xbe, 0x87, 0x5c, 0xc8, 0x96, 0x6c, 0xce, 0xa8, 0x8f, 0xd4, 0xc0, 0xb2, 0xe7, 0xe0, 0xdb, 0xf6, 0xf5, 0xf1, 0xf5, 0xf4, 0xf0, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xfb, 0xfb, 0xf9, 0xf5, 0xf5, 0xf1, 0xee, 0xe7, 0xe0, 0xc8, 0xb3, 0xa4, 0xc8, 0xa4, 0x89, 0xbf, 0x8e, 0x67, 0xa5, 0x74, 0x4e, 0xa8, 0x79, 0x54, 0xa0, 0x71, 0x4c, 0xa4, 0x73, 0x4b, 0xa4, 0x72, 0x4b, 0x82, 0x5a, 0x3c, 0x75, 0x4d, 0x31, 0x71, 0x4b, 0x2e, 0x61, 0x3c, 0x20, 0x69, 0x45, 0x29, 0x8c, 0x5d, 0x38, 0xc4, 0x8d, 0x5d, 0xc2, 0x89, 0x58, 0xda, 0xa3, 0x72, 0xcb, 0x95, 0x65, 0xb9, 0x83, 0x56, 0xb9, 0x87, 0x5c, 0xd4, 0xa6, 0x7b, 0xe5, 0xb8, 0x8c, 0xd9, 0xa8, 0x7b, 0xc1, 0x8e, 0x62, 0xbe, 0x8a, 0x5f, 0xbb, 0x87, 0x5e, 0xbd, 0x8a, 0x5e, 0xca, 0x8f, 0x62, 0xca, 0x90, 0x5e, 0xd7, 0x98, 0x61, 0xe4, 0xa4, 0x70, 0xdb, 0x9f, 0x6e, 0xe0, 0xa9, 0x78, 0xde, 0xab, 0x7d, 0xc8, 0x9b, 0x76, 0x90, 0x69, 0x4c, 0x80, 0x5b, 0x3e, 0x77, 0x52, 0x36, 0x60, 0x3a, 0x1f, 0x8e, 0x67, 0x4a, 0x7e, 0x57, 0x3b, 0x79, 0x57, 0x41, 0x84, 0x5f, 0x45, 0x90, 0x6c, 0x50, 0x9a, 0x75, 0x59, 0x6c, 0x4f, 0x36, 0x93, 0x6b, 0x49, 0x97, 0x6f, 0x49, 0x71, 0x50, 0x36, 0x99, 0x72, 0x57, 0x9d, 0x70, 0x4d, 0x8f, 0x60, 0x3a, 0xab, 0x77, 0x4f, 0x9d, 0x6a, 0x44, 0x93, 0x61, 0x3c, 0x9e, 0x6b, 0x45, 0xa9, 0x76, 0x4e, 0xa9, 0x76, 0x4d, 0xae, 0x7b, 0x53, 0x9c, 0x69, 0x41, 0x94, 0x64, 0x3c, 0x9f, 0x6f, 0x46, 0xa5, 0x75, 0x4d, 0xa5, 0x73, 0x4d, 0xa9, 0x76, 0x4f, 0xa4, 0x6f, 0x47, 0xa8, 0x74, 0x49, 0xb3, 0x7b, 0x4e, 0xc2, 0x88, 0x59, 0xb8, 0x81, 0x56, 0xbc, 0x8a, 0x5e, 0xbd, 0x8d, 0x65, 0xa2, 0x70, 0x4a, 0xb8, 0x85, 0x5b, 0xb5, 0x83, 0x59, 0xa5, 0x79, 0x57, 0xc4, 0x91, 0x6a, 0xc1, 0x90, 0x6b, 0xbc, 0x8c, 0x67, 0xbf, 0x8f, 0x68, 0xce, 0x9d, 0x76, 0xdb, 0xaa, 0x83, 0xe5, 0xb8, 0x8f, 0xd6, 0xa7, 0x85, 0xed, 0xbf, 0x99, 0xcc, 0x9e, 0x77, 0xd1, 0x9c, 0x71, 0xd8, 0x9f, 0x6f, 0xc9, 0x8c, 0x5d, 0xbd, 0x83, 0x53, 0xd4, 0x97, 0x63, 0xc8, 0x90, 0x5e, 0xc6, 0x91, 0x65, 0xc1, 0x91, 0x68, 0xc9, 0x97, 0x6e, 0xb3, 0x81, 0x56, 0xc0, 0x8b, 0x5f, 0xc9, 0x92, 0x63, 0xca, 0x92, 0x61, 0xc3, 0x8a, 0x59, 0xdd, 0xa3, 0x70, 0xd9, 0x9c, 0x67, 0xd0, 0x91, 0x5b, 0xd0, 0x90, 0x5c, 0xdb, 0x9b, 0x65, 0xe0, 0xa2, 0x68, 0xd6, 0x9a, 0x63, 0xc4, 0x8c, 0x5f, 0xbe, 0x8a, 0x64, 0xbb, 0x8e, 0x6b, 0xc6, 0xa2, 0x83, 0xd4, 0xbd, 0xab, 0xe3, 0xdc, 0xd6, 0xf0, 0xed, 0xe8, 0xf8, 0xf7, 0xf5, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xfa, 0xfa, 0xf8, 0xf0, 0xf1, 0xeb, 0xd0, 0xc8, 0xc0, 0xc6, 0xb0, 0xa0, 0xc2, 0x9e, 0x82, 0xb3, 0x88, 0x65, 0xb6, 0x83, 0x5a, 0xa0, 0x72, 0x4e, 0x98, 0x6a, 0x46, 0xa5, 0x74, 0x4b, 0x9d, 0x6b, 0x43, 0x73, 0x4c, 0x2f, 0x76, 0x51, 0x34, 0x6b, 0x47, 0x2b, 0x5c, 0x3a, 0x1f, 0x5d, 0x3b, 0x21, 0x96, 0x66, 0x40, 0xbe, 0x88, 0x59, 0xd0, 0x96, 0x65, 0xce, 0x94, 0x64, 0xc1, 0x8c, 0x5a, 0xb3, 0x7c, 0x50, 0xc4, 0x92, 0x67, 0xd8, 0xab, 0x7e, 0xd9, 0xaa, 0x7d, 0xc8, 0x96, 0x6b, 0xc6, 0x93, 0x69, 0xc2, 0x8f, 0x64, 0xcd, 0x99, 0x72, 0xbf, 0x8c, 0x61, 0xca, 0x92, 0x65, 0xc8, 0x91, 0x5f, 0xc6, 0x8a, 0x55, 0xd5, 0x99, 0x66, 0xdd, 0xa3, 0x6f, 0xde, 0xa8, 0x78, 0xe1, 0xb0, 0x84, 0xdd, 0xb0, 0x8a, 0xa3, 0x7b, 0x5c, 0x80, 0x59, 0x3c, 0x8d, 0x66, 0x4a, 0x6a, 0x44, 0x29, 0x6e, 0x48, 0x2d, 0x84, 0x5a, 0x3c, 0x7d, 0x5c, 0x46, 0x84, 0x61, 0x47, 0x82, 0x5f, 0x45, 0x8e, 0x6c, 0x53, 0x87, 0x68, 0x4c, 0x83, 0x5f, 0x3c, 0x75, 0x51, 0x2f, 0x78, 0x55, 0x3b, 0x8c, 0x65, 0x4d, 0x83, 0x58, 0x38, 0x9e, 0x6f, 0x47, 0x94, 0x62, 0x3d, 0x98, 0x66, 0x41, 0x9c, 0x69, 0x44, 0xb4, 0x81, 0x59, 0xac, 0x79, 0x4e, 0xa4, 0x71, 0x46, 0xa5, 0x72, 0x48, 0xa2, 0x6e, 0x44, 0xa2, 0x6e, 0x45, 0xa2, 0x70, 0x47, 0xa5, 0x73, 0x4a, 0xa5, 0x73, 0x4e, 0xa7, 0x75, 0x50, 0xac, 0x78, 0x52, 0xb1, 0x7e, 0x53, 0xb0, 0x7c, 0x52, 0xbc, 0x83, 0x56, 0xbc, 0x85, 0x52, 0x9c, 0x69, 0x45, 0xbf, 0x90, 0x6a, 0xad, 0x7e, 0x59, 0xbf, 0x8b, 0x64, 0xc7, 0x92, 0x68, 0xa4, 0x7a, 0x59, 0xc4, 0x95, 0x70, 0xb1, 0x7f, 0x5b, 0xbe, 0x8c, 0x67, 0xbc, 0x8a, 0x63, 0xc6, 0x94, 0x6f, 0xde, 0xae, 0x88, 0xe4, 0xb7, 0x90, 0xe9, 0xbc, 0x97, 0xd5, 0xa8, 0x81, 0xda, 0xa7, 0x7d, 0xca, 0x96, 0x69, 0xd1, 0x97, 0x67, 0xc8, 0x8a, 0x5b, 0xc5, 0x8a, 0x5a, 0xd8, 0x9b, 0x68, 0xc5, 0x8c, 0x5d, 0xc2, 0x8d, 0x61, 0xc2, 0x91, 0x68, 0xcb, 0x98, 0x6d, 0xbe, 0x8b, 0x60, 0xac, 0x77, 0x4b, 0xcd, 0x95, 0x64, 0xcb, 0x91, 0x61, 0xc3, 0x89, 0x58, 0xda, 0xa0, 0x6d, 0xd8, 0x99, 0x64, 0xd6, 0x96, 0x60, 0xd6, 0x97, 0x62, 0xdb, 0x9c, 0x66, 0xdb, 0x9c, 0x63, 0xda, 0x9c, 0x64, 0xcb, 0x94, 0x64, 0xb7, 0x84, 0x5c, 0xca, 0x9c, 0x77, 0xcb, 0xa5, 0x86, 0xc5, 0xab, 0x97, 0xe0, 0xd7, 0xd0, 0xf6, 0xf2, 0xec, 0xf7, 0xf6, 0xf4, 0xfb, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfc, 0xf9, 0xf8, 0xf8, 0xf6, 0xee, 0xef, 0xe9, 0xcf, 0xc6, 0xbf, 0xc2, 0xac, 0x9c, 0xca, 0xa6, 0x8a, 0xbd, 0x8e, 0x68, 0xb8, 0x87, 0x60, 0x9b, 0x6c, 0x47, 0xa0, 0x72, 0x4d, 0xab, 0x7a, 0x51, 0x91, 0x5f, 0x37, 0x7a, 0x53, 0x36, 0x7a, 0x55, 0x38, 0x5e, 0x3d, 0x22, 0x55, 0x37, 0x1f, 0x5d, 0x3d, 0x24, 0x98, 0x68, 0x42, 0xb0, 0x7a, 0x4b, 0xd5, 0x9b, 0x6b, 0xc6, 0x8c, 0x5c, 0xc6, 0x90, 0x5e, 0xc7, 0x90, 0x63, 0xc7, 0x94, 0x69, 0xe3, 0xb6, 0x89, 0xd2, 0x9f, 0x74, 0xc8, 0x9c, 0x6f, 0xbe, 0x8b, 0x61, 0xd1, 0x9f, 0x74, 0xca, 0x96, 0x6f, 0xcd, 0x9a, 0x6f, 0xc5, 0x90, 0x67, 0xd8, 0xa3, 0x75, 0xd1, 0x98, 0x6d, 0xda, 0xa2, 0x72, 0xd7, 0x9e, 0x6a, 0xe5, 0xaf, 0x7e, 0xee, 0xbc, 0x94, 0xdc, 0xb0, 0x8b, 0xce, 0xa5, 0x82, 0x94, 0x68, 0x4d, 0x86, 0x5b, 0x40, 0x72, 0x4d, 0x31, 0x71, 0x4b, 0x2f, 0x85, 0x5c, 0x3e, 0x6b, 0x4a, 0x34, 0x8a, 0x66, 0x4c, 0x7f, 0x5b, 0x41, 0x70, 0x52, 0x3c, 0x90, 0x6c, 0x4e, 0x75, 0x50, 0x33, 0x73, 0x4e, 0x30, 0x77, 0x54, 0x39, 0x83, 0x5c, 0x43, 0x8f, 0x61, 0x42, 0x91, 0x61, 0x39, 0x9c, 0x6b, 0x46, 0x9c, 0x6a, 0x45, 0xa4, 0x70, 0x4b, 0xa6, 0x73, 0x4b, 0xa5, 0x72, 0x48, 0xa3, 0x70, 0x46, 0xac, 0x77, 0x4c, 0xae, 0x75, 0x49, 0xa5, 0x6e, 0x42, 0x9f, 0x69, 0x41, 0xa1, 0x6b, 0x43, 0x8e, 0x5d, 0x37, 0xae, 0x7c, 0x57, 0xab, 0x78, 0x52, 0xb3, 0x80, 0x56, 0xa8, 0x77, 0x50, 0xb5, 0x81, 0x57, 0xc1, 0x8b, 0x59, 0xb0, 0x7c, 0x4d, 0xa2, 0x75, 0x52, 0xb2, 0x86, 0x63, 0xb5, 0x83, 0x5c, 0xc1, 0x8c, 0x62, 0xba, 0x91, 0x72, 0xb3, 0x89, 0x68, 0xbb, 0x8a, 0x67, 0xcf, 0x9d, 0x77, 0xbe, 0x8c, 0x65, 0xcd, 0x9b, 0x76, 0xdc, 0xad, 0x89, 0xe2, 0xba, 0x96, 0xe5, 0xbe, 0x98, 0xf0, 0xc5, 0xa0, 0xe2, 0xaa, 0x7c, 0xd1, 0x9c, 0x70, 0xc1, 0x88, 0x57, 0xc4, 0x86, 0x57, 0xc4, 0x89, 0x59, 0xdc, 0xa3, 0x74, 0xbd, 0x89, 0x5b, 0xce, 0x99, 0x6c, 0xc6, 0x95, 0x6c, 0xc5, 0x92, 0x67, 0xd0, 0x9d, 0x72, 0xae, 0x79, 0x4d, 0xc4, 0x8c, 0x5b, 0xc6, 0x8c, 0x5c, 0xd6, 0x9c, 0x6c, 0xc9, 0x8f, 0x5c, 0xe0, 0xa3, 0x6d, 0xd5, 0x95, 0x5f, 0xce, 0x8f, 0x5a, 0xdf, 0xa0, 0x69, 0xe0, 0xa1, 0x69, 0xdd, 0x9f, 0x66, 0xc7, 0x8e, 0x5c, 0xdd, 0xa7, 0x7d, 0xb9, 0x8a, 0x65, 0xca, 0xa7, 0x87, 0xca, 0xab, 0x95, 0xc7, 0xba, 0xb0, 0xe9, 0xe5, 0xdf, 0xf6, 0xf7, 0xf4, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfd, 0xfb, 0xf3, 0xf4, 0xf2, 0xda, 0xd7, 0xcd, 0xca, 0xc3, 0xb6, 0xd4, 0xba, 0xa6, 0xbb, 0x94, 0x75, 0xb5, 0x86, 0x62, 0x9f, 0x71, 0x4d, 0xa2, 0x6e, 0x46, 0x99, 0x69, 0x43, 0x99, 0x68, 0x43, 0x87, 0x59, 0x38, 0x84, 0x5d, 0x3c, 0x70, 0x4a, 0x2d, 0x66, 0x40, 0x25, 0x55, 0x36, 0x18, 0x6f, 0x48, 0x2b, 0x8e, 0x60, 0x37, 0xc0, 0x86, 0x55, 0xcf, 0x93, 0x61, 0xce, 0x92, 0x61, 0xca, 0x94, 0x62, 0xd1, 0x9b, 0x6a, 0xe3, 0xb0, 0x83, 0xdb, 0xa9, 0x7c, 0xc1, 0x90, 0x65, 0xca, 0x9a, 0x6e, 0xc3, 0x96, 0x6a, 0xd2, 0xa4, 0x7c, 0xce, 0x9d, 0x75, 0xd7, 0xa6, 0x7a, 0xd4, 0x9f, 0x73, 0xc7, 0x92, 0x66, 0xcb, 0x96, 0x68, 0xc2, 0x8b, 0x5a, 0xdb, 0xa1, 0x6f, 0xe1, 0xab, 0x7d, 0xe8, 0xb8, 0x8e, 0xe1, 0xb5, 0x90, 0xd8, 0xa9, 0x89, 0xac, 0x7e, 0x61, 0x7c, 0x52, 0x37, 0x74, 0x4b, 0x2f, 0x6a, 0x41, 0x25, 0x8b, 0x5b, 0x3f, 0x79, 0x54, 0x34, 0x7a, 0x55, 0x3b, 0x77, 0x55, 0x3e, 0x71, 0x53, 0x40, 0x79, 0x57, 0x40, 0x84, 0x5e, 0x40, 0x8b, 0x61, 0x40, 0x72, 0x4e, 0x31, 0x76, 0x52, 0x37, 0x89, 0x5c, 0x3e, 0x97, 0x6c, 0x43, 0x8e, 0x63, 0x3c, 0x87, 0x5a, 0x3b, 0x9e, 0x6e, 0x46, 0xa3, 0x72, 0x49, 0xa7, 0x76, 0x4e, 0x9c, 0x6a, 0x45, 0x9f, 0x6d, 0x48, 0x9d, 0x68, 0x44, 0xa1, 0x6d, 0x48, 0x9f, 0x6c, 0x43, 0x98, 0x65, 0x3c, 0x9d, 0x6c, 0x45, 0xa6, 0x75, 0x4e, 0xad, 0x79, 0x51, 0xb9, 0x85, 0x5d, 0xba, 0x85, 0x59, 0xba, 0x85, 0x59, 0xb6, 0x80, 0x52, 0xce, 0x96, 0x67, 0xba, 0x8b, 0x69, 0xcf, 0xa2, 0x7a, 0xb1, 0x7d, 0x58, 0xb5, 0x82, 0x57, 0xbd, 0x8e, 0x6b, 0xa4, 0x79, 0x5b, 0xc2, 0x93, 0x6e, 0xd0, 0x9d, 0x75, 0xcb, 0x96, 0x6d, 0xda, 0xa7, 0x7e, 0xe7, 0xb5, 0x8b, 0xe0, 0xb3, 0x8c, 0xee, 0xc5, 0xa4, 0xec, 0xbe, 0x9b, 0xe8, 0xb8, 0x8a, 0xd5, 0x9e, 0x71, 0xc1, 0x8b, 0x5d, 0xc6, 0x8a, 0x59, 0xcd, 0x91, 0x5f, 0xe2, 0xab, 0x7d, 0xd5, 0xa2, 0x73, 0xd6, 0xa3, 0x77, 0xcc, 0x99, 0x6c, 0xd2, 0x9d, 0x71, 0xcf, 0x9a, 0x6e, 0xc0, 0x89, 0x5b, 0xc0, 0x84, 0x54, 0xc2, 0x85, 0x57, 0xd9, 0x9d, 0x6a, 0xbf, 0x86, 0x53, 0xd4, 0x9a, 0x64, 0xdd, 0x9f, 0x67, 0xd5, 0x96, 0x5e, 0xd3, 0x93, 0x5b, 0xe1, 0xa1, 0x69, 0xdd, 0xa1, 0x68, 0xc1, 0x8b, 0x5a, 0xbf, 0x92, 0x67, 0xd1, 0xa3, 0x79, 0xd2, 0xb1, 0x91, 0xc0, 0xa3, 0x8a, 0xcd, 0xc1, 0xb6, 0xe4, 0xe1, 0xd8, 0xf1, 0xf3, 0xee, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfa, 0xf0, 0xf0, 0xee, 0xd6, 0xce, 0xc6, 0xd6, 0xca, 0xbf, 0xc7, 0xa9, 0x91, 0xc4, 0xa1, 0x84, 0xb6, 0x8c, 0x6b, 0xa4, 0x73, 0x4c, 0xa0, 0x6f, 0x48, 0x8e, 0x62, 0x40, 0x82, 0x59, 0x31, 0x8d, 0x5d, 0x3d, 0x7c, 0x54, 0x33, 0x6c, 0x47, 0x2a, 0x63, 0x3d, 0x23, 0x5f, 0x3e, 0x21, 0x72, 0x4b, 0x2e, 0x9d, 0x6f, 0x46, 0xb7, 0x7e, 0x4d, 0xcb, 0x8f, 0x5e, 0xcc, 0x90, 0x5f, 0xca, 0x94, 0x63, 0xd7, 0xa1, 0x70, 0xd1, 0x9f, 0x72, 0xc2, 0x8f, 0x63, 0xd3, 0xa2, 0x77, 0xd2, 0xa1, 0x76, 0xca, 0x9d, 0x71, 0xdc, 0xaf, 0x87, 0xc7, 0x96, 0x6e, 0xe8, 0xb8, 0x8b, 0xd9, 0xa4, 0x78, 0xc7, 0x92, 0x66, 0xcb, 0x97, 0x69, 0xcc, 0x95, 0x64, 0xd9, 0x9f, 0x6e, 0xde, 0xa8, 0x7a, 0xe7, 0xb7, 0x8d, 0xdf, 0xb3, 0x8d, 0xc4, 0x96, 0x74, 0xbd, 0x8f, 0x6d, 0x80, 0x57, 0x38, 0x7c, 0x52, 0x36, 0x79, 0x50, 0x34, 0x8b, 0x5c, 0x40, 0x7b, 0x56, 0x36, 0x73, 0x4d, 0x33, 0x61, 0x3f, 0x28, 0x67, 0x49, 0x36, 0x7e, 0x5b, 0x44, 0x8d, 0x67, 0x49, 0x8d, 0x62, 0x42, 0x67, 0x48, 0x2f, 0x84, 0x5e, 0x3f, 0xa8, 0x7c, 0x57, 0x9b, 0x70, 0x49, 0xa2, 0x76, 0x51, 0xa0, 0x73, 0x54, 0xa8, 0x78, 0x50, 0xa8, 0x77, 0x4d, 0xab, 0x79, 0x52, 0xa7, 0x75, 0x50, 0xaa, 0x77, 0x52, 0xaa, 0x76, 0x52, 0x9a, 0x66, 0x41, 0xa4, 0x70, 0x48, 0xa2, 0x6e, 0x46, 0xb3, 0x7e, 0x55, 0xb6, 0x82, 0x58, 0xb5, 0x83, 0x56, 0xbf, 0x8c, 0x5f, 0xc8, 0x93, 0x67, 0xc5, 0x90, 0x64, 0xcb, 0x94, 0x66, 0xcf, 0x97, 0x68, 0xaf, 0x81, 0x5b, 0xb5, 0x87, 0x64, 0xa9, 0x75, 0x51, 0xc0, 0x8d, 0x62, 0xb1, 0x80, 0x5e, 0xa3, 0x78, 0x5b, 0xd1, 0xa1, 0x7c, 0xd6, 0xa2, 0x7a, 0xd4, 0xa0, 0x77, 0xda, 0xa7, 0x7e, 0xe2, 0xb0, 0x88, 0xea, 0xbd, 0x97, 0xe4, 0xbc, 0x95, 0xe6, 0xb8, 0x95, 0xea, 0xba, 0x8c, 0xe2, 0xac, 0x7e, 0xb7, 0x80, 0x52, 0xc5, 0x89, 0x57, 0xce, 0x92, 0x60, 0xce, 0x98, 0x6a, 0xdb, 0xa9, 0x7a, 0xd7, 0xa5, 0x78, 0xd3, 0xa1, 0x74, 0xd1, 0x9d, 0x70, 0xcf, 0x9a, 0x6e, 0xc4, 0x8d, 0x5f, 0xcb, 0x8f, 0x60, 0xc7, 0x8b, 0x5c, 0xcb, 0x8f, 0x5c, 0xd3, 0x9a, 0x67, 0xca, 0x8f, 0x5a, 0xde, 0x9f, 0x67, 0xd6, 0x98, 0x5f, 0xd2, 0x92, 0x5a, 0xdf, 0x9e, 0x66, 0xe2, 0xa6, 0x6c, 0xd7, 0x9d, 0x69, 0xc1, 0x8f, 0x62, 0xbe, 0x94, 0x71, 0xc5, 0x9c, 0x7c, 0xca, 0xaa, 0x8d, 0xcf, 0xbf, 0xb1, 0xd1, 0xca, 0xc2, 0xf1, 0xee, 0xea, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfb, 0xf0, 0xec, 0xe6, 0xd6, 0xcf, 0xca, 0xd3, 0xbd, 0xb4, 0xc6, 0xad, 0x97, 0xc9, 0xa9, 0x92, 0xb7, 0x84, 0x64, 0xa2, 0x71, 0x49, 0x8a, 0x5f, 0x3e, 0x8c, 0x61, 0x3f, 0x80, 0x56, 0x31, 0x86, 0x5a, 0x33, 0x77, 0x4d, 0x32, 0x6f, 0x48, 0x2d, 0x5b, 0x3a, 0x1d, 0x66, 0x44, 0x26, 0x74, 0x49, 0x27, 0xae, 0x7a, 0x52, 0xb7, 0x7e, 0x4e, 0xc6, 0x8a, 0x59, 0xd8, 0x9c, 0x6b, 0xc2, 0x8c, 0x5a, 0xcb, 0x9a, 0x6c, 0xb7, 0x87, 0x5e, 0xd5, 0xa7, 0x77, 0xbf, 0x8e, 0x62, 0xc3, 0x92, 0x67, 0xd5, 0xa9, 0x81, 0xdb, 0xac, 0x81, 0xdf, 0xac, 0x7f, 0xe1, 0xae, 0x81, 0xd6, 0xa5, 0x79, 0xc6, 0x96, 0x6a, 0xcb, 0x97, 0x6b, 0xc2, 0x8a, 0x5a, 0xdf, 0xa5, 0x73, 0xe1, 0xac, 0x7b, 0xed, 0xb7, 0x88, 0xdd, 0xb0, 0x88, 0xb1, 0x81, 0x5a, 0xca, 0x9c, 0x77, 0xac, 0x7f, 0x5b, 0x6c, 0x47, 0x29, 0x7c, 0x53, 0x31, 0x88, 0x5b, 0x3b, 0x87, 0x5a, 0x39, 0x6d, 0x46, 0x2a, 0x5f, 0x3f, 0x29, 0x58, 0x3a, 0x22, 0x7f, 0x5a, 0x3d, 0x89, 0x62, 0x48, 0x89, 0x63, 0x41, 0x70, 0x4f, 0x3a, 0x78, 0x53, 0x33, 0xb7, 0x87, 0x60, 0xca, 0x99, 0x6d, 0xad, 0x80, 0x5d, 0xa7, 0x79, 0x53, 0xb0, 0x7f, 0x57, 0xb6, 0x83, 0x5d, 0xb1, 0x81, 0x5b, 0xae, 0x7d, 0x56, 0xbd, 0x89, 0x5f, 0xb9, 0x86, 0x59, 0xb1, 0x7f, 0x53, 0xba, 0x87, 0x5e, 0xb7, 0x85, 0x54, 0xc4, 0x8d, 0x62, 0xbd, 0x86, 0x5b, 0xbc, 0x8c, 0x65, 0xba, 0x8c, 0x62, 0xbd, 0x8e, 0x64, 0xc8, 0x9a, 0x6f, 0xcb, 0x96, 0x6e, 0xd2, 0x9e, 0x75, 0xd0, 0x9b, 0x70, 0xa5, 0x76, 0x54, 0xd1, 0x9a, 0x70, 0xbc, 0x89, 0x62, 0xb9, 0x8a, 0x67, 0xa0, 0x75, 0x58, 0xc7, 0x9a, 0x71, 0xe4, 0xb7, 0x8c, 0xe3, 0xb8, 0x90, 0xed, 0xba, 0x8f, 0xe6, 0xb7, 0x92, 0xea, 0xc0, 0x9d, 0xe8, 0xbf, 0x97, 0xce, 0xa2, 0x7e, 0xe7, 0xb4, 0x85, 0xe4, 0xae, 0x7c, 0xc4, 0x8e, 0x5c, 0xba, 0x83, 0x57, 0xd7, 0xa0, 0x75, 0xbf, 0x8b, 0x60, 0xe0, 0xa9, 0x7a, 0xd7, 0xa4, 0x75, 0xd5, 0xa2, 0x73, 0xcc, 0x99, 0x6a, 0xdb, 0xa9, 0x7a, 0xcf, 0x9a, 0x6c, 0xcd, 0x95, 0x64, 0xce, 0x93, 0x5f, 0xca, 0x8b, 0x58, 0xd3, 0x99, 0x67, 0xc7, 0x8a, 0x55, 0xdc, 0x9c, 0x64, 0xdf, 0xa0, 0x67, 0xd3, 0x93, 0x5b, 0xdb, 0x98, 0x60, 0xe0, 0x9e, 0x67, 0xdf, 0xa4, 0x6e, 0xcd, 0x91, 0x61, 0xb8, 0x8b, 0x67, 0xc5, 0xac, 0x94, 0xbe, 0x9c, 0x81, 0xcf, 0xbb, 0xa8, 0xd6, 0xc9, 0xc2, 0xe9, 0xe4, 0xdf, 0xfc, 0xfc, 0xfa, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xf9, 0xf9, 0xf7, 0xe6, 0xe2, 0xdc, 0xdb, 0xcd, 0xc3, 0xcc, 0xb7, 0xa5, 0xe0, 0xd3, 0xc7, 0xcd, 0xa3, 0x85, 0xb3, 0x81, 0x5a, 0xa8, 0x76, 0x51, 0x83, 0x58, 0x36, 0x8b, 0x60, 0x3f, 0x86, 0x5d, 0x3b, 0x80, 0x57, 0x34, 0x70, 0x4a, 0x2f, 0x63, 0x3f, 0x23, 0x5f, 0x3f, 0x23, 0x6b, 0x47, 0x29, 0x8c, 0x61, 0x3e, 0xa4, 0x6f, 0x43, 0xbb, 0x82, 0x4f, 0xc8, 0x8d, 0x5b, 0xc6, 0x8a, 0x58, 0xc2, 0x8e, 0x5c, 0xc2, 0x91, 0x64, 0xcc, 0x9a, 0x6c, 0xcf, 0x9d, 0x6f, 0xc1, 0x90, 0x65, 0xcd, 0x9b, 0x71, 0xe4, 0xb9, 0x91, 0xd8, 0xa8, 0x7d, 0xe4, 0xb1, 0x84, 0xdd, 0xaa, 0x7d, 0xd4, 0xa3, 0x78, 0xc2, 0x92, 0x66, 0xc5, 0x94, 0x67, 0xd3, 0x9e, 0x6d, 0xd4, 0x9b, 0x68, 0xd7, 0xa2, 0x71, 0xe0, 0xad, 0x7f, 0xe6, 0xbb, 0x96, 0xd3, 0xa4, 0x7f, 0xc8, 0x9a, 0x76, 0xa0, 0x72, 0x4f, 0x6b, 0x44, 0x27, 0x80, 0x54, 0x33, 0x8f, 0x62, 0x41, 0x8e, 0x61, 0x40, 0x6f, 0x46, 0x2b, 0x54, 0x35, 0x1f, 0x65, 0x47, 0x2f, 0x8f, 0x69, 0x4b, 0x89, 0x65, 0x49, 0x79, 0x55, 0x39, 0x65, 0x44, 0x29, 0x7f, 0x59, 0x3c, 0xac, 0x7f, 0x5d, 0xe5, 0xb8, 0x91, 0xa3, 0x7a, 0x58, 0xb4, 0x8c, 0x66, 0xbe, 0x94, 0x6e, 0xc1, 0x96, 0x71, 0xc4, 0x98, 0x70, 0xc9, 0x98, 0x6e, 0xcf, 0x9c, 0x71, 0xc4, 0x94, 0x6c, 0xd4, 0xa4, 0x7b, 0xd5, 0xa5, 0x7b, 0xcb, 0x9b, 0x72, 0xd3, 0xa3, 0x7b, 0xcb, 0x9b, 0x73, 0xc1, 0x95, 0x70, 0xc6, 0x9b, 0x73, 0xc4, 0x98, 0x70, 0xd4, 0xa8, 0x80, 0xd9, 0xab, 0x84, 0xe7, 0xb9, 0x92, 0xd7, 0xa9, 0x7e, 0xb5, 0x80, 0x5d, 0xc8, 0x94, 0x6a, 0xd9, 0xaa, 0x82, 0xc0, 0x91, 0x6e, 0x8f, 0x64, 0x46, 0xcb, 0x9d, 0x77, 0xed, 0xbf, 0x98, 0xec, 0xc0, 0x9b, 0xf1, 0xbf, 0x93, 0xf1, 0xc2, 0x9b, 0xe9, 0xbf, 0x9b, 0xcf, 0xa6, 0x84, 0xce, 0xa3, 0x7e, 0xdf, 0xaa, 0x7c, 0xdf, 0xa9, 0x78, 0xc7, 0x92, 0x60, 0xae, 0x77, 0x4b, 0xd4, 0x9d, 0x71, 0xc6, 0x93, 0x69, 0xdb, 0xa3, 0x75, 0xe1, 0xae, 0x7f, 0xd8, 0xa6, 0x77, 0xd8, 0xa6, 0x77, 0xde, 0xac, 0x7d, 0xd1, 0x9c, 0x6e, 0xd5, 0x9d, 0x6c, 0xd2, 0x96, 0x62, 0xca, 0x8b, 0x58, 0xd3, 0x98, 0x67, 0xce, 0x91, 0x5c, 0xd1, 0x91, 0x5a, 0xdf, 0xa1, 0x68, 0xdb, 0x9b, 0x63, 0xd8, 0x95, 0x5d, 0xe9, 0xa8, 0x70, 0xdc, 0xa1, 0x6b, 0xce, 0x92, 0x62, 0xc4, 0x93, 0x6a, 0xcf, 0xab, 0x8b, 0xcf, 0xb5, 0xa0, 0xc4, 0xae, 0x9a, 0xdd, 0xce, 0xc6, 0xe2, 0xdc, 0xd7, 0xf9, 0xf9, 0xf7, 0xfe, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfc, 0xfc, 0xf1, 0xef, 0xed, 0xe6, 0xe4, 0xdf, 0xd5, 0xcc, 0xc5, 0xda, 0xd2, 0xc8, 0xd8, 0xc8, 0xb7, 0xc8, 0xa1, 0x85, 0xb1, 0x7d, 0x54, 0xa2, 0x70, 0x4c, 0x8f, 0x63, 0x3f, 0x93, 0x66, 0x42, 0x7e, 0x57, 0x36, 0x75, 0x4f, 0x30, 0x6d, 0x4c, 0x2f, 0x60, 0x3f, 0x22, 0x5c, 0x3b, 0x1f, 0x69, 0x43, 0x23, 0x92, 0x65, 0x3e, 0xa3, 0x6f, 0x41, 0xc1, 0x89, 0x57, 0xc7, 0x8c, 0x5b, 0xbb, 0x81, 0x50, 0xc9, 0x94, 0x64, 0xc8, 0x93, 0x66, 0xcb, 0x97, 0x67, 0xc8, 0x93, 0x66, 0xc4, 0x93, 0x68, 0xd9, 0xaa, 0x7f, 0xda, 0xab, 0x81, 0xd3, 0xa4, 0x78, 0xda, 0xaa, 0x7f, 0xdd, 0xae, 0x82, 0xe0, 0xb1, 0x86, 0xca, 0x9b, 0x70, 0xdc, 0xab, 0x7c, 0xc8, 0x93, 0x64, 0xcf, 0x96, 0x67, 0xe8, 0xb3, 0x84, 0xe5, 0xb0, 0x84, 0xed, 0xc3, 0x9e, 0xd5, 0xa7, 0x83, 0xba, 0x8b, 0x68, 0xa9, 0x79, 0x56, 0x90, 0x61, 0x42, 0x85, 0x57, 0x38, 0x9e, 0x71, 0x4f, 0x9b, 0x6e, 0x4c, 0x78, 0x4e, 0x30, 0x51, 0x33, 0x1d, 0x6b, 0x4a, 0x31, 0x85, 0x62, 0x46, 0x86, 0x65, 0x49, 0x76, 0x56, 0x3d, 0x63, 0x45, 0x2d, 0x95, 0x6f, 0x54, 0x73, 0x5b, 0x45, 0x83, 0x6c, 0x5c, 0x9e, 0x76, 0x5a, 0xbb, 0x96, 0x77, 0xcb, 0xa9, 0x8a, 0xd5, 0xb4, 0x96, 0xd8, 0xb7, 0x9a, 0xd6, 0xb3, 0x92, 0xd4, 0xad, 0x8b, 0xdb, 0xb4, 0x93, 0xda, 0xb3, 0x92, 0xdd, 0xb7, 0x95, 0xdc, 0xb6, 0x96, 0xda, 0xb8, 0x99, 0xd4, 0xb2, 0x93, 0xde, 0xbc, 0x9d, 0xd7, 0xb5, 0x95, 0xce, 0xa7, 0x84, 0xd8, 0xb4, 0x92, 0xf1, 0xc7, 0xa5, 0xdf, 0xb8, 0x93, 0xda, 0xb3, 0x92, 0xb3, 0x7e, 0x56, 0xaa, 0x7c, 0x57, 0xc4, 0x95, 0x6e, 0xb7, 0x88, 0x67, 0x96, 0x6b, 0x4f, 0xca, 0x9a, 0x76, 0xee, 0xc0, 0x9a, 0xf4, 0xc5, 0x9d, 0xeb, 0xbb, 0x90, 0xe3, 0xba, 0x95, 0xd3, 0xac, 0x8a, 0xda, 0xb2, 0x92, 0xa9, 0x7c, 0x56, 0xd5, 0xa0, 0x72, 0xe2, 0xad, 0x7e, 0xd2, 0x9d, 0x6f, 0xba, 0x84, 0x59, 0xd6, 0xa1, 0x72, 0xbf, 0x8f, 0x66, 0xc1, 0x8d, 0x61, 0xe7, 0xb1, 0x83, 0xe1, 0xaf, 0x7f, 0xdc, 0xa8, 0x7a, 0xe4, 0xb1, 0x82, 0xe3, 0xb1, 0x81, 0xd9, 0xa3, 0x71, 0xc8, 0x8c, 0x59, 0xd4, 0x93, 0x62, 0xd6, 0x98, 0x66, 0xd9, 0x9a, 0x67, 0xd7, 0x99, 0x63, 0xd6, 0x98, 0x61, 0xe0, 0xa1, 0x6b, 0xdc, 0x9a, 0x65, 0xe3, 0xa2, 0x6d, 0xd9, 0x9d, 0x69, 0xd0, 0x96, 0x67, 0xbb, 0x87, 0x58, 0xd1, 0xa1, 0x7c, 0xe6, 0xcd, 0xbb, 0xce, 0xba, 0xa7, 0xd6, 0xc7, 0xbf, 0xde, 0xd9, 0xd4, 0xef, 0xed, 0xe8, 0xfd, 0xfd, 0xfb, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xee, 0xec, 0xe9, 0xe3, 0xe2, 0xde, 0xdd, 0xd5, 0xcf, 0xd8, 0xce, 0xc6, 0xd3, 0xbe, 0xab, 0xbe, 0x96, 0x77, 0xba, 0x87, 0x60, 0x93, 0x65, 0x40, 0x8b, 0x60, 0x3e, 0x8a, 0x5f, 0x3d, 0x7d, 0x54, 0x34, 0x72, 0x4e, 0x32, 0x65, 0x43, 0x27, 0x63, 0x42, 0x25, 0x65, 0x44, 0x27, 0x79, 0x51, 0x30, 0x94, 0x65, 0x3b, 0xac, 0x77, 0x49, 0xc0, 0x87, 0x56, 0xc6, 0x8c, 0x5b, 0xb4, 0x7a, 0x49, 0xd2, 0x9c, 0x6e, 0xc0, 0x89, 0x5c, 0xbf, 0x8b, 0x5c, 0xd1, 0x9c, 0x6e, 0xce, 0x9c, 0x72, 0xde, 0xb0, 0x84, 0xd9, 0xa7, 0x7c, 0xdd, 0xaf, 0x83, 0xdb, 0xae, 0x83, 0xe6, 0xb9, 0x8e, 0xd5, 0xa8, 0x7e, 0xd7, 0xaa, 0x7f, 0xcc, 0x9c, 0x70, 0xbc, 0x87, 0x5b, 0xc9, 0x8f, 0x63, 0xec, 0xb7, 0x89, 0xe4, 0xac, 0x80, 0xe7, 0xbc, 0x96, 0xcb, 0x9f, 0x78, 0xda, 0xb0, 0x8c, 0xc9, 0x9d, 0x79, 0xb3, 0x83, 0x62, 0x72, 0x47, 0x27, 0x97, 0x6b, 0x48, 0x99, 0x6d, 0x4a, 0x7f, 0x54, 0x35, 0x53, 0x35, 0x21, 0x62, 0x42, 0x28, 0x79, 0x59, 0x3f, 0x78, 0x58, 0x3e, 0x7d, 0x5b, 0x40, 0x5c, 0x3a, 0x24, 0xa1, 0x79, 0x5d, 0x87, 0x6b, 0x50, 0x25, 0x1c, 0x19, 0x72, 0x57, 0x44, 0xab, 0x8e, 0x74, 0xbe, 0xa0, 0x85, 0xcf, 0xb0, 0x97, 0xd8, 0xbb, 0xa3, 0xda, 0xbd, 0xa4, 0xdf, 0xc0, 0xa5, 0xeb, 0xcd, 0xb1, 0xea, 0xcd, 0xb1, 0xe2, 0xc7, 0xaa, 0xef, 0xd4, 0xb7, 0xe0, 0xc4, 0xac, 0xd5, 0xba, 0xa2, 0xda, 0xbb, 0xa0, 0xd1, 0xb3, 0x97, 0xbd, 0xa2, 0x84, 0xcd, 0xa9, 0x84, 0xcb, 0xaa, 0x8d, 0x6c, 0x55, 0x45, 0xc0, 0x97, 0x7a, 0xb7, 0x83, 0x57, 0xa8, 0x7d, 0x5d, 0xc3, 0x91, 0x6e, 0xa5, 0x76, 0x56, 0x9a, 0x70, 0x54, 0xca, 0x98, 0x75, 0xec, 0xbd, 0x97, 0xec, 0xbc, 0x90, 0xea, 0xbb, 0x90, 0xe5, 0xbe, 0x9a, 0xca, 0xa5, 0x86, 0xcf, 0xa9, 0x89, 0xcb, 0x9d, 0x74, 0xd6, 0x9f, 0x72, 0xdb, 0xa6, 0x7a, 0xc9, 0x94, 0x68, 0xbc, 0x87, 0x5d, 0xd1, 0x9d, 0x6d, 0xd5, 0xa6, 0x80, 0xb4, 0x81, 0x56, 0xd9, 0xa2, 0x75, 0xe8, 0xb5, 0x86, 0xd7, 0xa3, 0x74, 0xda, 0xa5, 0x77, 0xdd, 0xac, 0x7c, 0xe4, 0xb0, 0x7d, 0xd0, 0x98, 0x65, 0xd9, 0x9b, 0x6a, 0xd7, 0x98, 0x66, 0xde, 0xa0, 0x6d, 0xdd, 0xa0, 0x6c, 0xd4, 0x97, 0x61, 0xe0, 0xa2, 0x6d, 0xe4, 0xa5, 0x70, 0xda, 0x9b, 0x67, 0xd8, 0x9c, 0x68, 0xc2, 0x8a, 0x5b, 0xcb, 0x97, 0x65, 0xcb, 0x99, 0x74, 0xd6, 0xc0, 0xaf, 0xde, 0xd2, 0xc8, 0xd3, 0xc7, 0xbe, 0xe4, 0xdf, 0xd9, 0xea, 0xe6, 0xe0, 0xfb, 0xfa, 0xf8, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xea, 0xe8, 0xe5, 0xeb, 0xea, 0xe6, 0xe8, 0xe4, 0xe1, 0xd6, 0xc8, 0xbd, 0xbb, 0x9e, 0x89, 0xb2, 0x89, 0x65, 0xb0, 0x81, 0x5b, 0x89, 0x5f, 0x3e, 0x7c, 0x55, 0x36, 0x8a, 0x63, 0x44, 0x7d, 0x55, 0x35, 0x6d, 0x48, 0x2b, 0x75, 0x53, 0x37, 0x59, 0x38, 0x1b, 0x67, 0x45, 0x28, 0x7a, 0x52, 0x31, 0x91, 0x63, 0x38, 0xb8, 0x84, 0x56, 0xc0, 0x88, 0x57, 0xb9, 0x7f, 0x4f, 0xc8, 0x8f, 0x5f, 0xd1, 0x9a, 0x6c, 0xc1, 0x8a, 0x5c, 0xd8, 0xa3, 0x75, 0xcb, 0x96, 0x68, 0xe1, 0xae, 0x85, 0xd8, 0xab, 0x7f, 0xd9, 0xa6, 0x7b, 0xe1, 0xb4, 0x88, 0xde, 0xb1, 0x87, 0xdf, 0xb2, 0x87, 0xd0, 0xa3, 0x78, 0xdf, 0xb2, 0x87, 0xd6, 0xa8, 0x80, 0xb5, 0x84, 0x5c, 0xb9, 0x80, 0x56, 0xea, 0xb5, 0x87, 0xdf, 0xa8, 0x7c, 0xe8, 0xbd, 0x97, 0xd8, 0xaa, 0x83, 0xcd, 0x9f, 0x7d, 0xb3, 0x84, 0x61, 0xc2, 0x92, 0x70, 0x8a, 0x5e, 0x3e, 0x8c, 0x60, 0x3d, 0x9f, 0x72, 0x4f, 0x7d, 0x52, 0x33, 0x5b, 0x3d, 0x28, 0x5c, 0x40, 0x29, 0x6a, 0x4d, 0x37, 0x6d, 0x51, 0x3b, 0x7c, 0x56, 0x39, 0x87, 0x5e, 0x42, 0x9d, 0x73, 0x58, 0xc4, 0x9e, 0x7c, 0x4b, 0x36, 0x2a, 0x10, 0x05, 0x00, 0x6d, 0x5a, 0x49, 0x73, 0x5e, 0x50, 0x5a, 0x47, 0x3c, 0x7c, 0x6a, 0x5d, 0xb0, 0x9b, 0x88, 0xca, 0xb2, 0x9d, 0xe1, 0xca, 0xb6, 0xdc, 0xc6, 0xb2, 0xdc, 0xc8, 0xb3, 0xe0, 0xcc, 0xb7, 0xca, 0xb3, 0x9d, 0xae, 0x98, 0x83, 0x7a, 0x68, 0x5b, 0x5d, 0x4a, 0x3d, 0x85, 0x6c, 0x5b, 0x72, 0x58, 0x47, 0x33, 0x25, 0x1e, 0x92, 0x7a, 0x65, 0xe9, 0xbc, 0x9a, 0xc1, 0x89, 0x5a, 0x97, 0x6a, 0x4a, 0xc4, 0x92, 0x70, 0xab, 0x80, 0x5f, 0x86, 0x61, 0x43, 0xde, 0xae, 0x8a, 0xef, 0xc1, 0x9b, 0xee, 0xc3, 0x9d, 0xed, 0xc7, 0xa7, 0xea, 0xc9, 0xad, 0xd0, 0xac, 0x8d, 0xb0, 0x8a, 0x69, 0xc6, 0x98, 0x6f, 0xcc, 0x95, 0x68, 0xd9, 0xa4, 0x78, 0xbe, 0x8a, 0x5d, 0xc7, 0x92, 0x68, 0xdd, 0xa9, 0x79, 0xe3, 0xb5, 0x8e, 0xbc, 0x89, 0x5f, 0xc6, 0x8f, 0x62, 0xdf, 0xac, 0x7d, 0xd5, 0xa0, 0x72, 0xce, 0x99, 0x6b, 0xde, 0xad, 0x7e, 0xe4, 0xb1, 0x7e, 0xed, 0xb7, 0x83, 0xd6, 0x9d, 0x6a, 0xd7, 0x9a, 0x67, 0xd8, 0x9a, 0x67, 0xe2, 0xa5, 0x71, 0xdb, 0x9e, 0x69, 0xda, 0x9e, 0x68, 0xe3, 0xa9, 0x73, 0xde, 0xa4, 0x6e, 0xd1, 0x96, 0x62, 0xc5, 0x8d, 0x5e, 0xc0, 0x8c, 0x5a, 0xcc, 0x99, 0x75, 0xd2, 0xba, 0xa2, 0xd6, 0xc7, 0xbf, 0xdd, 0xdb, 0xcf, 0xde, 0xd9, 0xd4, 0xe9, 0xe5, 0xdf, 0xf8, 0xf7, 0xf5, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xf9, 0xfa, 0xf8, 0xed, 0xec, 0xe8, 0xee, 0xed, 0xe9, 0xe7, 0xe6, 0xe2, 0xcf, 0xc0, 0xb1, 0xb6, 0x9a, 0x84, 0xaf, 0x84, 0x62, 0xaa, 0x7b, 0x56, 0x96, 0x6c, 0x4b, 0x7e, 0x59, 0x36, 0x87, 0x5c, 0x3b, 0x6c, 0x49, 0x2a, 0x7b, 0x55, 0x32, 0x68, 0x46, 0x2a, 0x63, 0x3f, 0x20, 0x73, 0x4c, 0x2b, 0x80, 0x57, 0x34, 0x9b, 0x6b, 0x43, 0xae, 0x7a, 0x4d, 0xb3, 0x7e, 0x52, 0xaa, 0x73, 0x46, 0xd3, 0x9d, 0x6c, 0xcb, 0x8f, 0x60, 0xca, 0x94, 0x62, 0xce, 0x96, 0x64, 0xd2, 0x9e, 0x6f, 0xdf, 0xb0, 0x85, 0xd8, 0xa7, 0x76, 0xd0, 0xa3, 0x77, 0xde, 0xb1, 0x84, 0xd7, 0xaa, 0x7f, 0xd1, 0xa4, 0x7a, 0xce, 0xa1, 0x77, 0xde, 0xb0, 0x86, 0xd0, 0xa2, 0x7b, 0xba, 0x88, 0x5f, 0xc3, 0x8c, 0x61, 0xe2, 0xae, 0x7e, 0xd2, 0x9a, 0x6b, 0xe7, 0xbc, 0x95, 0xcd, 0xa0, 0x77, 0xb0, 0x83, 0x63, 0xb8, 0x8c, 0x66, 0xc7, 0x99, 0x74, 0xab, 0x7d, 0x58, 0x6c, 0x42, 0x20, 0x93, 0x68, 0x46, 0x82, 0x55, 0x36, 0x55, 0x38, 0x24, 0x55, 0x38, 0x25, 0x63, 0x47, 0x30, 0x6a, 0x4a, 0x35, 0x82, 0x59, 0x3d, 0x96, 0x67, 0x42, 0x86, 0x5a, 0x3c, 0xe3, 0xbd, 0x9a, 0xc0, 0xa3, 0x87, 0x3a, 0x2d, 0x23, 0x07, 0x04, 0x02, 0x10, 0x0e, 0x0b, 0x03, 0x03, 0x01, 0x06, 0x05, 0x03, 0x37, 0x30, 0x2e, 0x54, 0x46, 0x38, 0x74, 0x62, 0x54, 0x9f, 0x8d, 0x7f, 0xa7, 0x95, 0x88, 0x6e, 0x5c, 0x4e, 0x50, 0x3f, 0x37, 0x46, 0x38, 0x33, 0x08, 0x06, 0x02, 0x07, 0x05, 0x02, 0x1f, 0x15, 0x0f, 0x17, 0x0e, 0x09, 0x7a, 0x67, 0x59, 0xe9, 0xc8, 0xa9, 0xf0, 0xc8, 0xa0, 0xa7, 0x70, 0x4d, 0xa6, 0x74, 0x4d, 0xad, 0x80, 0x63, 0xaa, 0x7b, 0x5c, 0x8e, 0x6a, 0x50, 0xde, 0xaf, 0x87, 0xed, 0xc2, 0x9d, 0xef, 0xc3, 0x9d, 0xf0, 0xd2, 0xb7, 0xf2, 0xd4, 0xb7, 0xd9, 0xb5, 0x96, 0xbc, 0x8d, 0x67, 0xd0, 0x9f, 0x74, 0xd3, 0xa2, 0x77, 0xde, 0xa9, 0x7f, 0xba, 0x8b, 0x5f, 0xbb, 0x86, 0x5a, 0xdd, 0xae, 0x80, 0xe2, 0xb6, 0x8a, 0xd1, 0xa4, 0x7c, 0xbf, 0x8d, 0x61, 0xd3, 0x9c, 0x6b, 0xdf, 0xae, 0x7e, 0xd4, 0x9f, 0x71, 0xdb, 0xa5, 0x74, 0xe0, 0xaa, 0x78, 0xe1, 0xa8, 0x74, 0xda, 0xa1, 0x6c, 0xdc, 0xa2, 0x70, 0xde, 0xa5, 0x6f, 0xe7, 0xad, 0x75, 0xe3, 0xa8, 0x71, 0xe0, 0xa4, 0x6e, 0xe0, 0xa2, 0x6d, 0xe4, 0xa7, 0x71, 0xd3, 0x98, 0x64, 0xca, 0x94, 0x64, 0xc3, 0x8c, 0x5f, 0xc4, 0x92, 0x67, 0xbb, 0x99, 0x7f, 0xcc, 0xbc, 0xaf, 0xe2, 0xdb, 0xd3, 0xed, 0xea, 0xe6, 0xeb, 0xeb, 0xe9, 0xf2, 0xf2, 0xf0, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfb, 0xfa, 0xfa, 0xf8, 0xef, 0xee, 0xea, 0xee, 0xed, 0xe9, 0xe0, 0xdb, 0xd4, 0xb9, 0xa6, 0x94, 0xba, 0x9a, 0x81, 0xaa, 0x83, 0x64, 0xa7, 0x77, 0x53, 0x93, 0x69, 0x47, 0x79, 0x57, 0x38, 0x7b, 0x53, 0x35, 0x6b, 0x48, 0x2a, 0x7c, 0x56, 0x33, 0x6d, 0x4b, 0x30, 0x6a, 0x46, 0x28, 0x79, 0x50, 0x2d, 0x8d, 0x60, 0x3a, 0xa2, 0x70, 0x46, 0xa8, 0x73, 0x47, 0xa7, 0x73, 0x48, 0xb2, 0x7c, 0x50, 0xcc, 0x91, 0x5b, 0xc3, 0x86, 0x57, 0xcc, 0x96, 0x64, 0xc9, 0x91, 0x5f, 0xda, 0xa5, 0x76, 0xdc, 0xaf, 0x83, 0xca, 0x99, 0x68, 0xd6, 0xa9, 0x7c, 0xd0, 0xa3, 0x76, 0xda, 0xad, 0x82, 0xe4, 0xb7, 0x8c, 0xdb, 0xae, 0x83, 0xc9, 0x9c, 0x71, 0xd4, 0xa6, 0x7f, 0xcc, 0x9b, 0x72, 0xc3, 0x8c, 0x61, 0xd8, 0xa4, 0x74, 0xd8, 0xa1, 0x72, 0xd4, 0xa1, 0x72, 0xe0, 0xb3, 0x8c, 0xbf, 0x92, 0x73, 0xa7, 0x7a, 0x55, 0xc7, 0x99, 0x74, 0xbe, 0x90, 0x6b, 0x87, 0x5c, 0x3a, 0x82, 0x57, 0x35, 0x89, 0x5c, 0x3e, 0x53, 0x36, 0x22, 0x60, 0x3f, 0x2a, 0x69, 0x49, 0x31, 0x66, 0x47, 0x31, 0x91, 0x68, 0x4d, 0x88, 0x5e, 0x3a, 0x68, 0x40, 0x22, 0xd4, 0xa6, 0x7f, 0xe5, 0xbf, 0xa0, 0x9a, 0x78, 0x5c, 0x26, 0x1b, 0x13, 0x09, 0x07, 0x04, 0x02, 0x03, 0x01, 0x01, 0x01, 0x00, 0x14, 0x14, 0x10, 0x75, 0x5a, 0x50, 0x80, 0x61, 0x55, 0x77, 0x58, 0x4b, 0x77, 0x58, 0x4c, 0x7d, 0x5e, 0x51, 0x71, 0x5b, 0x54, 0x13, 0x0f, 0x0d, 0x01, 0x03, 0x02, 0x00, 0x03, 0x01, 0x13, 0x11, 0x0e, 0x71, 0x5d, 0x50, 0xe5, 0xc5, 0xad, 0xfa, 0xd7, 0xb6, 0xea, 0xba, 0x8c, 0xbd, 0x86, 0x64, 0xce, 0x99, 0x6f, 0xb7, 0x85, 0x65, 0xad, 0x7e, 0x5f, 0x90, 0x6b, 0x52, 0xdc, 0xb4, 0x91, 0xea, 0xbd, 0x97, 0xeb, 0xc7, 0xa6, 0xf0, 0xd3, 0xb8, 0xcc, 0xa4, 0x81, 0xbb, 0x8d, 0x6a, 0xc7, 0x93, 0x72, 0xcc, 0x9c, 0x70, 0xd6, 0xa5, 0x7a, 0xde, 0xac, 0x81, 0xb1, 0x7c, 0x52, 0xc8, 0x93, 0x67, 0xe0, 0xb1, 0x83, 0xd1, 0xa4, 0x78, 0xdc, 0xae, 0x87, 0xc6, 0x96, 0x69, 0xdc, 0xa4, 0x73, 0xea, 0xb9, 0x8a, 0xdd, 0xa8, 0x7a, 0xd5, 0x9f, 0x6e, 0xe2, 0xac, 0x7a, 0xe5, 0xac, 0x78, 0xe1, 0xa7, 0x73, 0xe4, 0xab, 0x74, 0xe2, 0xa9, 0x74, 0xe0, 0xa8, 0x74, 0xe3, 0xac, 0x78, 0xe0, 0xa9, 0x73, 0xe2, 0xa9, 0x72, 0xdd, 0xa5, 0x6e, 0xde, 0xa3, 0x6f, 0xca, 0x94, 0x64, 0xb7, 0x84, 0x5b, 0xb6, 0x87, 0x5e, 0xba, 0x95, 0x78, 0xc0, 0xac, 0x9c, 0xe4, 0xde, 0xd6, 0xf0, 0xed, 0xe9, 0xec, 0xec, 0xea, 0xf6, 0xf6, 0xf4, 0xfd, 0xfd, 0xfd, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xf7, 0xe8, 0xe9, 0xe1, 0xd7, 0xcb, 0xc0, 0xbe, 0xa7, 0x91, 0xbc, 0x95, 0x76, 0xa3, 0x7d, 0x5f, 0xa3, 0x76, 0x51, 0x92, 0x6a, 0x48, 0x72, 0x4a, 0x27, 0x77, 0x4f, 0x2c, 0x72, 0x49, 0x2c, 0x79, 0x4f, 0x33, 0x72, 0x4c, 0x2d, 0x7a, 0x55, 0x36, 0x76, 0x4d, 0x2a, 0x96, 0x68, 0x40, 0x98, 0x69, 0x3f, 0xaa, 0x78, 0x4b, 0x9b, 0x6d, 0x42, 0xaa, 0x77, 0x49, 0xc8, 0x91, 0x5c, 0xb4, 0x7e, 0x4d, 0xb8, 0x82, 0x51, 0xc5, 0x95, 0x66, 0xdb, 0xa9, 0x78, 0xcf, 0x9c, 0x6d, 0xd0, 0xa0, 0x74, 0xcd, 0xa0, 0x74, 0xd5, 0xa9, 0x7c, 0xda, 0xaa, 0x7e, 0xea, 0xb9, 0x8d, 0xda, 0xad, 0x82, 0xd8, 0xab, 0x80, 0xe5, 0xba, 0x92, 0xd4, 0xa4, 0x7f, 0xce, 0x9c, 0x71, 0xd8, 0xa6, 0x78, 0xd9, 0xa6, 0x76, 0xd3, 0xa0, 0x75, 0xd8, 0xa9, 0x81, 0xc9, 0x9d, 0x77, 0x83, 0x59, 0x37, 0xc0, 0x95, 0x70, 0xc1, 0x9c, 0x7c, 0xa1, 0x77, 0x55, 0x71, 0x47, 0x25, 0x8b, 0x5e, 0x3d, 0x58, 0x3d, 0x29, 0x79, 0x56, 0x3d, 0x8a, 0x60, 0x3f, 0x5c, 0x41, 0x2e, 0x87, 0x5d, 0x3b, 0xb0, 0x7f, 0x59, 0x64, 0x41, 0x26, 0xb5, 0x87, 0x62, 0xef, 0xbe, 0x92, 0xd4, 0xa0, 0x78, 0x7c, 0x5b, 0x3d, 0x2e, 0x20, 0x18, 0x0b, 0x07, 0x06, 0x02, 0x03, 0x02, 0x04, 0x01, 0x00, 0x45, 0x33, 0x2a, 0xaa, 0x7c, 0x6a, 0x8b, 0x6c, 0x5e, 0x9f, 0x74, 0x65, 0xa5, 0x77, 0x68, 0x27, 0x1f, 0x12, 0x02, 0x00, 0x04, 0x04, 0x03, 0x04, 0x29, 0x20, 0x19, 0xa1, 0x82, 0x67, 0xef, 0xcb, 0xa6, 0xfe, 0xd9, 0xb6, 0xf9, 0xd0, 0xaa, 0xd9, 0xa0, 0x6e, 0xd2, 0x96, 0x6b, 0xeb, 0xb5, 0x89, 0xbe, 0x8c, 0x66, 0x9e, 0x71, 0x52, 0x90, 0x6d, 0x54, 0xe1, 0xbb, 0x9c, 0xee, 0xc0, 0x98, 0xe8, 0xc9, 0xb3, 0xe3, 0xc7, 0xa5, 0xaa, 0x7d, 0x5e, 0xbb, 0x8d, 0x6a, 0xd3, 0xa1, 0x7a, 0xc1, 0x8e, 0x63, 0xdd, 0xaa, 0x7f, 0xde, 0xab, 0x80, 0xba, 0x86, 0x5f, 0xd1, 0x9b, 0x70, 0xda, 0xa8, 0x77, 0xdc, 0xae, 0x85, 0xdb, 0xad, 0x84, 0xce, 0x9f, 0x73, 0xdc, 0xa7, 0x78, 0xe2, 0xac, 0x78, 0xe8, 0xb2, 0x7f, 0xde, 0xa4, 0x72, 0xdb, 0xa1, 0x6e, 0xdc, 0xa5, 0x75, 0xe0, 0xa6, 0x72, 0xe7, 0xac, 0x79, 0xe9, 0xaf, 0x7c, 0xec, 0xb5, 0x83, 0xe4, 0xb1, 0x7e, 0xe7, 0xb3, 0x80, 0xe6, 0xb0, 0x7a, 0xe1, 0xa8, 0x70, 0xdf, 0xa6, 0x6f, 0xd7, 0x9d, 0x6c, 0xc2, 0x8f, 0x63, 0xb4, 0x89, 0x65, 0xb5, 0x8d, 0x6d, 0xac, 0x8f, 0x77, 0xd9, 0xcf, 0xc6, 0xec, 0xe8, 0xe5, 0xef, 0xef, 0xed, 0xf3, 0xf3, 0xf1, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfb, 0xfb, 0xfb, 0xfc, 0xfa, 0xe7, 0xe8, 0xe0, 0xca, 0xbd, 0xb2, 0xba, 0xa2, 0x8c, 0xbd, 0x9d, 0x83, 0xa3, 0x7d, 0x5f, 0xa9, 0x7d, 0x57, 0x8e, 0x65, 0x43, 0x76, 0x4e, 0x2b, 0x7d, 0x55, 0x32, 0x7d, 0x54, 0x34, 0x7a, 0x51, 0x32, 0x7b, 0x55, 0x36, 0x72, 0x4d, 0x2e, 0x7a, 0x52, 0x2f, 0x92, 0x63, 0x3d, 0x99, 0x69, 0x40, 0xab, 0x78, 0x4b, 0x91, 0x63, 0x3a, 0xaa, 0x75, 0x48, 0xc8, 0x91, 0x5c, 0xc9, 0x93, 0x61, 0xc8, 0x92, 0x60, 0xd4, 0xa5, 0x76, 0xd8, 0xa6, 0x75, 0xcf, 0x9b, 0x6c, 0xce, 0x9e, 0x74, 0xd7, 0xaa, 0x7d, 0xd0, 0xa4, 0x77, 0xe6, 0xb5, 0x8a, 0xd1, 0xa0, 0x75, 0xe7, 0xba, 0x8f, 0xdf, 0xb2, 0x87, 0xde, 0xb4, 0x8a, 0xe8, 0xb9, 0x94, 0xc7, 0x95, 0x6b, 0xd7, 0xa5, 0x77, 0xcb, 0x97, 0x68, 0xd9, 0xa6, 0x7c, 0xd4, 0xa5, 0x7d, 0xcf, 0xa3, 0x7d, 0x9f, 0x76, 0x55, 0xb4, 0x8a, 0x66, 0xd4, 0xa9, 0x8c, 0xb4, 0x89, 0x67, 0x75, 0x4b, 0x29, 0x7d, 0x52, 0x33, 0x59, 0x38, 0x22, 0x62, 0x3f, 0x26, 0x97, 0x6c, 0x4c, 0xa0, 0x6c, 0x47, 0x97, 0x69, 0x43, 0xba, 0x87, 0x5e, 0x95, 0x6a, 0x48, 0x8f, 0x5f, 0x3c, 0xe1, 0xac, 0x80, 0xd1, 0xa0, 0x70, 0xcf, 0x9d, 0x74, 0xab, 0x7d, 0x5b, 0x71, 0x51, 0x3c, 0x2c, 0x1c, 0x11, 0x09, 0x05, 0x02, 0x09, 0x09, 0x08, 0x6f, 0x55, 0x4b, 0x7c, 0x66, 0x5f, 0x8d, 0x6b, 0x5f, 0x95, 0x6a, 0x57, 0x07, 0x05, 0x03, 0x29, 0x20, 0x1a, 0x74, 0x62, 0x50, 0xcb, 0xa9, 0x8c, 0xed, 0xc9, 0xa8, 0xfa, 0xd3, 0xaf, 0xf2, 0xc7, 0x9e, 0xe1, 0xb1, 0x85, 0xc3, 0x8c, 0x62, 0xb3, 0x82, 0x5a, 0xe7, 0xb5, 0x8a, 0xe0, 0xad, 0x80, 0xc5, 0x91, 0x6b, 0x96, 0x6c, 0x4e, 0xd4, 0xa7, 0x83, 0xe5, 0xbe, 0x9d, 0xee, 0xd1, 0xba, 0xcc, 0xa7, 0x83, 0xb7, 0x8b, 0x6a, 0xca, 0x9b, 0x78, 0xcc, 0x9a, 0x72, 0xd7, 0xa4, 0x79, 0xe4, 0xb0, 0x86, 0xde, 0xab, 0x80, 0xc4, 0x90, 0x69, 0xc7, 0x90, 0x67, 0xd4, 0xa0, 0x71, 0xe5, 0xb5, 0x89, 0xd4, 0xa3, 0x78, 0xe3, 0xb3, 0x89, 0xcc, 0x98, 0x69, 0xe2, 0xad, 0x79, 0xe5, 0xb0, 0x7c, 0xd0, 0x97, 0x64, 0xd8, 0x9e, 0x6b, 0xe2, 0xac, 0x7c, 0xdd, 0xa2, 0x6f, 0xe0, 0xa6, 0x73, 0xeb, 0xb1, 0x7f, 0xee, 0xb7, 0x84, 0xed, 0xb9, 0x87, 0xe9, 0xb5, 0x83, 0xe6, 0xb2, 0x7b, 0xe3, 0xaa, 0x71, 0xd9, 0x9f, 0x69, 0xcd, 0x93, 0x63, 0xcf, 0x9c, 0x71, 0xb3, 0x89, 0x64, 0xb7, 0x8e, 0x6f, 0xbd, 0x9f, 0x87, 0xbd, 0xab, 0x9e, 0xe7, 0xe2, 0xe0, 0xf4, 0xf4, 0xf2, 0xf8, 0xf8, 0xf6, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf4, 0xf5, 0xf3, 0xe0, 0xde, 0xd7, 0xce, 0xbf, 0xb2, 0xbd, 0xa6, 0x93, 0xbf, 0xa9, 0x97, 0xa7, 0x82, 0x64, 0xb0, 0x83, 0x5e, 0x99, 0x6f, 0x4e, 0x85, 0x5c, 0x39, 0x6a, 0x44, 0x23, 0x8c, 0x62, 0x3f, 0x7a, 0x53, 0x31, 0x82, 0x5d, 0x3c, 0x62, 0x3f, 0x21, 0x7d, 0x55, 0x31, 0x8b, 0x5d, 0x35, 0x95, 0x65, 0x3b, 0x9f, 0x6e, 0x43, 0xa2, 0x70, 0x47, 0xaf, 0x7b, 0x4e, 0xc3, 0x8e, 0x5b, 0xbb, 0x86, 0x57, 0xcb, 0x96, 0x67, 0xce, 0x9c, 0x6d, 0xcc, 0x98, 0x69, 0xd6, 0xa3, 0x74, 0xd5, 0xa4, 0x76, 0xd8, 0xa9, 0x7b, 0xdf, 0xb0, 0x82, 0xdd, 0xaf, 0x83, 0xd9, 0xab, 0x7f, 0xda, 0xad, 0x85, 0xe0, 0xb4, 0x8b, 0xd0, 0xa7, 0x7f, 0xe2, 0xb4, 0x8d, 0xcd, 0x9c, 0x71, 0xd8, 0xa7, 0x7a, 0xc6, 0x94, 0x67, 0xda, 0xa8, 0x7d, 0xd8, 0xa7, 0x7d, 0xb6, 0x87, 0x61, 0x9c, 0x71, 0x4e, 0x73, 0x49, 0x27, 0xb8, 0x8a, 0x6b, 0xc3, 0x9b, 0x7a, 0x8a, 0x62, 0x41, 0x7c, 0x4f, 0x30, 0x5f, 0x40, 0x28, 0x6e, 0x4e, 0x34, 0x81, 0x58, 0x38, 0x98, 0x6b, 0x49, 0x9d, 0x6a, 0x43, 0xa1, 0x74, 0x50, 0xb0, 0x7e, 0x54, 0x9e, 0x6e, 0x4e, 0xb8, 0x82, 0x5b, 0xb1, 0x7b, 0x54, 0xe0, 0xb1, 0x8b, 0xe3, 0xbb, 0x98, 0xd8, 0xb2, 0x94, 0xb5, 0x94, 0x7a, 0x5b, 0x43, 0x33, 0x09, 0x09, 0x05, 0x66, 0x4d, 0x42, 0x7c, 0x62, 0x54, 0x83, 0x67, 0x5a, 0x5f, 0x48, 0x41, 0x40, 0x31, 0x29, 0xc3, 0xaa, 0x90, 0xe4, 0xc8, 0xae, 0xf0, 0xd3, 0xb8, 0xf4, 0xd0, 0xac, 0xf1, 0xc6, 0xa0, 0xe4, 0xb1, 0x86, 0xdd, 0xa7, 0x77, 0xde, 0xa1, 0x73, 0xca, 0x96, 0x6b, 0xdb, 0xa4, 0x76, 0xf0, 0xbb, 0x8a, 0xd8, 0x9e, 0x71, 0xbb, 0x8a, 0x65, 0xd6, 0xa5, 0x7c, 0xee, 0xd1, 0xb8, 0xe3, 0xc6, 0xaa, 0xba, 0x93, 0x6f, 0xcc, 0xa5, 0x80, 0xc4, 0x96, 0x71, 0xc7, 0x95, 0x6d, 0xc3, 0x90, 0x66, 0xda, 0xa4, 0x77, 0xd7, 0xa7, 0x7d, 0xaf, 0x7f, 0x56, 0xc1, 0x8b, 0x62, 0xd3, 0x9d, 0x6f, 0xe7, 0xb5, 0x87, 0xd8, 0xa5, 0x77, 0xe3, 0xb1, 0x84, 0xd4, 0xa1, 0x72, 0xd5, 0x9f, 0x6c, 0xdb, 0xa5, 0x73, 0xdd, 0xa3, 0x70, 0xd5, 0x9b, 0x69, 0xd6, 0xa0, 0x6e, 0xdb, 0xa3, 0x6f, 0xda, 0xa1, 0x6e, 0xe1, 0xa7, 0x75, 0xee, 0xb7, 0x84, 0xed, 0xb8, 0x85, 0xe8, 0xb3, 0x7f, 0xe8, 0xb3, 0x7e, 0xe3, 0xac, 0x76, 0xe1, 0xa9, 0x72, 0xc0, 0x90, 0x63, 0xd3, 0xa3, 0x78, 0xc4, 0x9a, 0x77, 0xba, 0x96, 0x7b, 0xba, 0x9e, 0x87, 0xc8, 0xb1, 0x9e, 0xdd, 0xd9, 0xd5, 0xf3, 0xf4, 0xf0, 0xfa, 0xfa, 0xf9, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xee, 0xed, 0xeb, 0xdf, 0xdb, 0xd5, 0xc3, 0xb4, 0xa8, 0xc4, 0xb0, 0xa1, 0xb9, 0xa4, 0x92, 0xb0, 0x8a, 0x6c, 0xa8, 0x7c, 0x5a, 0xa3, 0x76, 0x52, 0x80, 0x56, 0x33, 0x6c, 0x47, 0x28, 0x89, 0x5e, 0x3b, 0x75, 0x4e, 0x2c, 0x75, 0x4f, 0x2e, 0x59, 0x39, 0x1e, 0x72, 0x4b, 0x27, 0x8d, 0x62, 0x3a, 0x91, 0x63, 0x39, 0x93, 0x63, 0x39, 0xaa, 0x76, 0x4d, 0xa4, 0x70, 0x43, 0xbf, 0x8b, 0x58, 0xc7, 0x93, 0x65, 0xc6, 0x91, 0x63, 0xbf, 0x8a, 0x5c, 0xcf, 0x9a, 0x6c, 0xd0, 0x9d, 0x6e, 0xd7, 0xa5, 0x76, 0xcf, 0x9e, 0x71, 0xd9, 0xa9, 0x7b, 0xde, 0xb2, 0x85, 0xe0, 0xb3, 0x86, 0xce, 0xa3, 0x7b, 0xe1, 0xb5, 0x8e, 0xdb, 0xb2, 0x8c, 0xe6, 0xb9, 0x91, 0xd5, 0xa5, 0x7a, 0xd8, 0xa7, 0x7b, 0xd5, 0xa4, 0x78, 0xd4, 0xa3, 0x77, 0xd3, 0xa1, 0x76, 0xc6, 0x94, 0x6e, 0xbb, 0x8d, 0x6a, 0x70, 0x45, 0x27, 0x96, 0x6f, 0x52, 0xba, 0x96, 0x76, 0x8d, 0x69, 0x4a, 0x7a, 0x56, 0x3b, 0x59, 0x3b, 0x25, 0x95, 0x68, 0x48, 0xcb, 0x9a, 0x69, 0xcb, 0x9f, 0x72, 0xd0, 0x9c, 0x70, 0x94, 0x69, 0x45, 0xd1, 0x9f, 0x72, 0x98, 0x69, 0x45, 0xc0, 0x8d, 0x68, 0xd2, 0xa2, 0x80, 0xee, 0xc8, 0xa7, 0xef, 0xcf, 0xb2, 0xef, 0xd3, 0xba, 0xe9, 0xcf, 0xb7, 0xbd, 0x9e, 0x88, 0x3b, 0x30, 0x25, 0x67, 0x50, 0x46, 0x6c, 0x54, 0x48, 0x7e, 0x5f, 0x58, 0x57, 0x45, 0x3d, 0xaa, 0x95, 0x84, 0xf1, 0xdc, 0xc1, 0xf4, 0xe2, 0xca, 0xf4, 0xdc, 0xc1, 0xf1, 0xce, 0xb0, 0xe6, 0xbc, 0x97, 0xcd, 0x9c, 0x72, 0xd7, 0xa1, 0x73, 0xd1, 0x9b, 0x71, 0xbe, 0x8b, 0x62, 0xc9, 0x91, 0x66, 0xd4, 0xa1, 0x74, 0xc5, 0x92, 0x6a, 0xc7, 0x96, 0x6e, 0xd7, 0xa8, 0x81, 0xf1, 0xd6, 0xbf, 0xc6, 0xa3, 0x83, 0xcb, 0xa5, 0x82, 0xd1, 0xa9, 0x85, 0xc7, 0x99, 0x73, 0xc2, 0x91, 0x68, 0xd2, 0x9d, 0x75, 0xc2, 0x8a, 0x5d, 0xdb, 0xad, 0x82, 0xb7, 0x89, 0x5f, 0xba, 0x85, 0x5e, 0xd4, 0x9c, 0x70, 0xe1, 0xae, 0x82, 0xe7, 0xb4, 0x87, 0xdd, 0xab, 0x7c, 0xdf, 0xad, 0x7e, 0xdb, 0xa5, 0x73, 0xd5, 0x9f, 0x6d, 0xe7, 0xb0, 0x7c, 0xd9, 0xa2, 0x6e, 0xd4, 0x9e, 0x6a, 0xe0, 0xab, 0x77, 0xdc, 0xa3, 0x70, 0xd8, 0x9e, 0x6c, 0xe7, 0xaf, 0x7c, 0xea, 0xb4, 0x80, 0xef, 0xb9, 0x85, 0xe7, 0xb1, 0x7e, 0xe4, 0xae, 0x7a, 0xe0, 0xa6, 0x70, 0xd3, 0xa6, 0x79, 0xc9, 0x9c, 0x71, 0xc9, 0xa1, 0x7e, 0xc5, 0xa6, 0x91, 0xc5, 0xae, 0x97, 0xc0, 0xac, 0x98, 0xdf, 0xda, 0xd4, 0xea, 0xeb, 0xe6, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xee, 0xee, 0xec, 0xce, 0xc9, 0xc3, 0xc7, 0xbb, 0xb2, 0xc8, 0xb9, 0xad, 0xb5, 0x97, 0x7e, 0xb3, 0x8f, 0x6f, 0xac, 0x87, 0x62, 0xa6, 0x77, 0x4c, 0x74, 0x4a, 0x27, 0x6a, 0x45, 0x26, 0x80, 0x56, 0x32, 0x76, 0x4f, 0x2e, 0x72, 0x4c, 0x2c, 0x5f, 0x3e, 0x23, 0x6d, 0x47, 0x26, 0x7d, 0x56, 0x31, 0x8a, 0x5f, 0x36, 0x93, 0x63, 0x39, 0xa2, 0x6e, 0x44, 0xad, 0x79, 0x4c, 0xc7, 0x94, 0x61, 0xbf, 0x8a, 0x5c, 0xc6, 0x92, 0x64, 0xbf, 0x8b, 0x5c, 0xce, 0x99, 0x6b, 0xce, 0x9c, 0x6d, 0xd4, 0xa2, 0x73, 0xd3, 0xa2, 0x75, 0xd9, 0xa9, 0x7b, 0xde, 0xb1, 0x84, 0xd8, 0xab, 0x7e, 0xd5, 0xa9, 0x82, 0xd8, 0xad, 0x85, 0xdf, 0xb7, 0x90, 0xe2, 0xb5, 0x8d, 0xd8, 0xa8, 0x7d, 0xe3, 0xb2, 0x86, 0xdb, 0xab, 0x7f, 0xdb, 0xab, 0x7f, 0xd2, 0xa0, 0x76, 0xba, 0x88, 0x62, 0xbe, 0x91, 0x6e, 0x7d, 0x57, 0x39, 0x51, 0x32, 0x1b, 0xa6, 0x87, 0x69, 0x99, 0x7a, 0x5c, 0x61, 0x43, 0x24, 0x9d, 0x70, 0x4b, 0xc6, 0x8d, 0x5f, 0xdb, 0xa5, 0x76, 0xd8, 0xa1, 0x72, 0xe6, 0xb1, 0x88, 0xd0, 0x9c, 0x72, 0xdb, 0xa8, 0x7b, 0xdd, 0xa8, 0x7c, 0xce, 0x9e, 0x76, 0xe0, 0xaf, 0x86, 0xe2, 0xb9, 0x92, 0xe4, 0xc0, 0x9f, 0xe2, 0xc3, 0xa6, 0xe8, 0xcd, 0xb8, 0xe0, 0xc5, 0xab, 0x8a, 0x6f, 0x5b, 0x43, 0x35, 0x31, 0x53, 0x44, 0x3b, 0x43, 0x33, 0x2e, 0x8b, 0x7b, 0x70, 0xeb, 0xd6, 0xbb, 0xf0, 0xe0, 0xca, 0xf2, 0xda, 0xc5, 0xf3, 0xd8, 0xbd, 0xf4, 0xd5, 0xb9, 0xef, 0xc8, 0xa5, 0xea, 0xbc, 0x95, 0xd8, 0xa6, 0x7d, 0xe7, 0xba, 0x96, 0xdc, 0xaa, 0x82, 0xd8, 0xa9, 0x83, 0xe9, 0xc0, 0x98, 0xc6, 0x94, 0x6b, 0xae, 0x80, 0x5c, 0xd6, 0xb3, 0x96, 0xe7, 0xcb, 0xb2, 0xbf, 0x94, 0x71, 0xcc, 0xa2, 0x80, 0xcf, 0xa5, 0x82, 0xcc, 0x9d, 0x78, 0xb8, 0x87, 0x5e, 0xd6, 0xa1, 0x79, 0xb2, 0x7a, 0x4d, 0xd0, 0x9d, 0x74, 0xc6, 0x93, 0x6a, 0xc2, 0x8e, 0x66, 0xca, 0x93, 0x67, 0xdc, 0xa9, 0x7c, 0xe5, 0xb2, 0x85, 0xe5, 0xb2, 0x84, 0xd9, 0xa7, 0x78, 0xea, 0xb5, 0x83, 0xd3, 0x9d, 0x6b, 0xd9, 0xa6, 0x71, 0xf1, 0xbd, 0x89, 0xdb, 0xa6, 0x72, 0xd5, 0xa0, 0x6c, 0xdc, 0xa3, 0x70, 0xe3, 0xa9, 0x77, 0xd4, 0x9d, 0x6a, 0xe8, 0xb2, 0x7f, 0xe9, 0xb4, 0x80, 0xea, 0xb5, 0x81, 0xea, 0xb4, 0x81, 0xdb, 0xa0, 0x68, 0xde, 0xa6, 0x72, 0xc3, 0x96, 0x6b, 0xdd, 0xb4, 0x91, 0xbf, 0xa3, 0x90, 0xd0, 0xbd, 0xab, 0xbe, 0xac, 0x9d, 0xd8, 0xcf, 0xc5, 0xe6, 0xe6, 0xe1, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xeb, 0xe9, 0xe4, 0xd5, 0xcf, 0xc6, 0xc7, 0xbc, 0xb2, 0xc8, 0xbe, 0xb0, 0xcc, 0xb6, 0xa4, 0xbf, 0xa1, 0x89, 0xb9, 0x94, 0x71, 0x94, 0x68, 0x3f, 0x72, 0x4d, 0x2b, 0x5d, 0x3c, 0x20, 0x74, 0x4f, 0x2d, 0x75, 0x4f, 0x31, 0x58, 0x36, 0x1b, 0x58, 0x36, 0x1c, 0x64, 0x42, 0x26, 0x7a, 0x53, 0x31, 0x91, 0x63, 0x3b, 0x98, 0x69, 0x3e, 0xa2, 0x6f, 0x40, 0xae, 0x79, 0x4b, 0xce, 0x99, 0x6b, 0xb7, 0x82, 0x56, 0xc5, 0x90, 0x64, 0xce, 0x99, 0x6b, 0xca, 0x95, 0x67, 0xc2, 0x8f, 0x63, 0xca, 0x97, 0x6a, 0xcb, 0x99, 0x6c, 0xda, 0xa7, 0x7a, 0xe0, 0xaf, 0x83, 0xcf, 0xa3, 0x76, 0xe6, 0xba, 0x93, 0xde, 0xb2, 0x8b, 0xec, 0xc4, 0x9d, 0xd9, 0xac, 0x83, 0xd9, 0xab, 0x82, 0xe5, 0xb2, 0x85, 0xde, 0xb2, 0x8a, 0xde, 0xb2, 0x8a, 0xd6, 0xa9, 0x81, 0xbc, 0x8f, 0x69, 0xb0, 0x87, 0x66, 0x8c, 0x65, 0x4b, 0x5c, 0x3b, 0x1e, 0x6c, 0x49, 0x33, 0xa6, 0x84, 0x69, 0x84, 0x5c, 0x3e, 0x89, 0x5b, 0x3b, 0xad, 0x7a, 0x51, 0xc4, 0x8c, 0x5f, 0xc4, 0x8a, 0x59, 0xc7, 0x93, 0x66, 0xd4, 0x9f, 0x72, 0xd2, 0x9c, 0x74, 0xc2, 0x8d, 0x62, 0xd2, 0xa0, 0x75, 0xcf, 0x9f, 0x78, 0xa9, 0x78, 0x51, 0xd1, 0xa4, 0x7e, 0xde, 0xb8, 0x98, 0xdb, 0xbd, 0xa3, 0xdf, 0xc7, 0xb0, 0xd1, 0xbb, 0xa5, 0x81, 0x70, 0x61, 0x2f, 0x28, 0x28, 0x51, 0x49, 0x43, 0xe0, 0xce, 0xc1, 0xe4, 0xcf, 0xb9, 0xe3, 0xcf, 0xb4, 0xdb, 0xbc, 0x9e, 0xda, 0xb1, 0x92, 0xe6, 0xc0, 0xa0, 0xeb, 0xc6, 0xa5, 0xeb, 0xbf, 0x9b, 0xee, 0xc5, 0xa2, 0xed, 0xc0, 0x97, 0xf1, 0xc3, 0x9b, 0xec, 0xbd, 0x96, 0xec, 0xc2, 0x9e, 0xef, 0xc6, 0x9d, 0xeb, 0xb8, 0x87, 0xe4, 0xc4, 0xa7, 0xbc, 0x9b, 0x7e, 0xbf, 0x99, 0x79, 0xc9, 0x9f, 0x7b, 0xd0, 0xa9, 0x87, 0xce, 0xa2, 0x7c, 0xbc, 0x8f, 0x69, 0xc0, 0x8c, 0x63, 0xc7, 0x95, 0x66, 0xce, 0x9b, 0x70, 0xcd, 0x9a, 0x6f, 0xc5, 0x94, 0x69, 0xc1, 0x90, 0x64, 0xdd, 0xaa, 0x80, 0xe4, 0xb2, 0x81, 0xe4, 0xb1, 0x85, 0xe3, 0xb1, 0x84, 0xe2, 0xb3, 0x85, 0xd8, 0xa4, 0x71, 0xd2, 0x9c, 0x6a, 0xeb, 0xb5, 0x83, 0xe7, 0xae, 0x7d, 0xdb, 0xa2, 0x71, 0xd5, 0x9c, 0x67, 0xe3, 0xae, 0x7a, 0xd3, 0x9e, 0x6d, 0xdf, 0xa9, 0x77, 0xe4, 0xb1, 0x7d, 0xe6, 0xb3, 0x7e, 0xdb, 0xa3, 0x70, 0xd8, 0xa1, 0x6b, 0xdc, 0xa5, 0x6a, 0xd0, 0xa5, 0x7c, 0xda, 0xb7, 0x94, 0xc9, 0xad, 0x97, 0xca, 0xb6, 0xa6, 0xc3, 0xb4, 0xaa, 0xc8, 0xbb, 0xb5, 0xeb, 0xe7, 0xe3, 0xf7, 0xf7, 0xf7, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xe8, 0xe5, 0xe1, 0xd5, 0xce, 0xc6, 0xd2, 0xcb, 0xc5, 0xd9, 0xd3, 0xc7, 0xde, 0xcf, 0xc3, 0xca, 0xb2, 0x9f, 0xa4, 0x7c, 0x5b, 0x7a, 0x51, 0x31, 0x64, 0x44, 0x28, 0x50, 0x38, 0x23, 0x6c, 0x4c, 0x2d, 0x58, 0x36, 0x1c, 0x4d, 0x2f, 0x18, 0x59, 0x3c, 0x25, 0x55, 0x35, 0x1b, 0x70, 0x48, 0x27, 0x8a, 0x5c, 0x34, 0x9d, 0x6d, 0x43, 0xa9, 0x76, 0x48, 0xbe, 0x8a, 0x5c, 0xb8, 0x83, 0x55, 0xb3, 0x7e, 0x52, 0xcb, 0x96, 0x6a, 0xbf, 0x8a, 0x5c, 0xc6, 0x92, 0x64, 0xc4, 0x91, 0x64, 0xce, 0x9b, 0x6f, 0xc8, 0x96, 0x69, 0xdb, 0xa8, 0x7c, 0xd4, 0xa4, 0x78, 0xdf, 0xb3, 0x86, 0xe2, 0xb7, 0x90, 0xe5, 0xb9, 0x92, 0xe7, 0xbf, 0x99, 0xd4, 0xa7, 0x7f, 0xde, 0xb1, 0x88, 0xe0, 0xad, 0x81, 0xe3, 0xb6, 0x90, 0xd0, 0xa4, 0x80, 0xd2, 0xa5, 0x7f, 0xbf, 0x92, 0x6d, 0xb5, 0x8c, 0x6b, 0x94, 0x6d, 0x51, 0x77, 0x55, 0x3c, 0x4d, 0x2b, 0x14, 0x95, 0x74, 0x58, 0x9a, 0x77, 0x58, 0x85, 0x5b, 0x3a, 0x8c, 0x60, 0x3d, 0xa0, 0x70, 0x4a, 0xab, 0x79, 0x52, 0xbb, 0x86, 0x5c, 0xa5, 0x71, 0x4c, 0xca, 0x98, 0x6d, 0xba, 0x8c, 0x68, 0xcf, 0xa5, 0x80, 0xe7, 0xbf, 0x9e, 0xe1, 0xb8, 0x97, 0xde, 0xb8, 0x98, 0xe6, 0xc9, 0xae, 0xe5, 0xcd, 0xb7, 0xdb, 0xc6, 0xb3, 0xe1, 0xd1, 0xbe, 0xd4, 0xc7, 0xb8, 0x32, 0x2b, 0x24, 0x91, 0x89, 0x83, 0xea, 0xd8, 0xca, 0xdb, 0xc8, 0xb5, 0xe6, 0xd4, 0xbd, 0xea, 0xd1, 0xb7, 0xe1, 0xbf, 0xa4, 0xe6, 0xc3, 0xa4, 0xd7, 0xad, 0x89, 0xdf, 0xb3, 0x8d, 0xe8, 0xc0, 0x9e, 0xdd, 0xaa, 0x80, 0xef, 0xbd, 0x93, 0xe7, 0xb9, 0x8d, 0xe8, 0xbe, 0x95, 0xf1, 0xc2, 0x9b, 0xdb, 0xac, 0x84, 0xdb, 0xb3, 0x8f, 0xb5, 0x90, 0x70, 0xbe, 0x99, 0x79, 0xc3, 0x99, 0x75, 0xca, 0xa3, 0x81, 0xc8, 0x9d, 0x77, 0xc2, 0x95, 0x70, 0xb8, 0x89, 0x61, 0xd4, 0xa6, 0x7a, 0xdb, 0xad, 0x81, 0xc3, 0x96, 0x69, 0xcc, 0x9c, 0x70, 0xb2, 0x81, 0x55, 0xdb, 0xa8, 0x7e, 0xda, 0xa8, 0x78, 0xe4, 0xb1, 0x84, 0xe5, 0xb2, 0x85, 0xde, 0xaf, 0x81, 0xe2, 0xae, 0x7b, 0xc9, 0x93, 0x61, 0xcd, 0x97, 0x65, 0xe7, 0xb2, 0x80, 0xe4, 0xaf, 0x7d, 0xdd, 0xa5, 0x70, 0xdf, 0xaa, 0x76, 0xd8, 0xa3, 0x72, 0xd6, 0xa0, 0x6e, 0xdf, 0xac, 0x79, 0xe9, 0xb6, 0x81, 0xe5, 0xae, 0x7b, 0xd4, 0x9f, 0x6c, 0xcb, 0x95, 0x66, 0xd4, 0xa9, 0x83, 0xd9, 0xbf, 0xa4, 0xd6, 0xc1, 0xb1, 0xca, 0xbf, 0xb5, 0xc0, 0xb4, 0xa9, 0xcc, 0xc5, 0xbd, 0xe2, 0xde, 0xda, 0xf7, 0xf6, 0xf7, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xe6, 0xe1, 0xdf, 0xd6, 0xd2, 0xcb, 0xe4, 0xe4, 0xd8, 0xde, 0xde, 0xd3, 0xe0, 0xd4, 0xcb, 0xc6, 0xb2, 0xa2, 0x82, 0x6d, 0x5b, 0x52, 0x3e, 0x2c, 0x41, 0x2b, 0x1f, 0x45, 0x33, 0x26, 0x5c, 0x3e, 0x25, 0x58, 0x3b, 0x21, 0x47, 0x30, 0x1a, 0x3e, 0x27, 0x11, 0x5d, 0x40, 0x24, 0x67, 0x41, 0x20, 0x75, 0x4d, 0x29, 0xa0, 0x71, 0x44, 0xaa, 0x7a, 0x50, 0xb5, 0x82, 0x55, 0xad, 0x7a, 0x4e, 0xbd, 0x8a, 0x5d, 0xbd, 0x8b, 0x5e, 0xb8, 0x84, 0x56, 0xc2, 0x8e, 0x5f, 0xcd, 0x98, 0x6a, 0xd2, 0x9d, 0x6f, 0xdb, 0xa7, 0x79, 0xdd, 0xad, 0x80, 0xc8, 0x9d, 0x75, 0xe5, 0xba, 0x92, 0xd9, 0xad, 0x86, 0xd4, 0xa8, 0x81, 0xdd, 0xb5, 0x8e, 0xe5, 0xb8, 0x90, 0xe0, 0xac, 0x82, 0xda, 0xaa, 0x77, 0xe8, 0xbc, 0x9d, 0xc6, 0x9b, 0x78, 0xde, 0xb6, 0x8d, 0xb8, 0x91, 0x6e, 0x99, 0x70, 0x54, 0xa7, 0x7e, 0x60, 0x84, 0x60, 0x40, 0x62, 0x40, 0x27, 0x8a, 0x66, 0x4a, 0xa4, 0x88, 0x70, 0xa8, 0x88, 0x6c, 0xb0, 0x8d, 0x72, 0x93, 0x68, 0x46, 0xa7, 0x7d, 0x5d, 0xc6, 0x94, 0x67, 0xb2, 0x84, 0x62, 0xd4, 0xa7, 0x7d, 0xdd, 0xb4, 0x92, 0xe1, 0xbd, 0x9d, 0xe4, 0xc2, 0xa4, 0xdb, 0xbd, 0xa2, 0xe2, 0xc7, 0xb1, 0xe9, 0xd2, 0xc1, 0xe5, 0xd4, 0xc3, 0xdf, 0xd2, 0xc1, 0xe7, 0xdf, 0xd2, 0xdc, 0xd5, 0xca, 0x58, 0x51, 0x4b, 0xba, 0xb3, 0xad, 0xec, 0xe5, 0xd9, 0xdf, 0xd2, 0xc1, 0xf0, 0xdd, 0xc8, 0xeb, 0xe0, 0xca, 0xe8, 0xd8, 0xbe, 0xec, 0xd2, 0xba, 0xf1, 0xcd, 0xad, 0xf1, 0xca, 0xa7, 0xe3, 0xbb, 0x93, 0xc7, 0x9e, 0x76, 0xbf, 0x8f, 0x6a, 0xdb, 0xa3, 0x7a, 0xe0, 0xb2, 0x82, 0xd1, 0xa3, 0x79, 0xdc, 0xad, 0x8a, 0xca, 0x9f, 0x7e, 0xc0, 0x99, 0x7a, 0xbf, 0x9e, 0x80, 0xbe, 0x90, 0x6c, 0xc4, 0x9e, 0x7a, 0xc0, 0x94, 0x6f, 0xc4, 0x96, 0x72, 0xc9, 0x97, 0x74, 0xd3, 0xa2, 0x79, 0xdd, 0xb0, 0x85, 0xda, 0xad, 0x83, 0xbf, 0x91, 0x67, 0xbf, 0x8c, 0x63, 0xd4, 0xa3, 0x79, 0xd4, 0xa4, 0x76, 0xdc, 0xab, 0x7e, 0xe9, 0xb8, 0x8b, 0xde, 0xac, 0x7f, 0xd7, 0xa4, 0x77, 0xda, 0xa8, 0x79, 0xce, 0x98, 0x6a, 0xe1, 0xac, 0x7e, 0xe5, 0xb1, 0x83, 0xe0, 0xa9, 0x79, 0xdc, 0xa4, 0x73, 0xe3, 0xac, 0x7b, 0xdc, 0xa6, 0x74, 0xd5, 0x9f, 0x6d, 0xea, 0xb4, 0x80, 0xdf, 0xaa, 0x76, 0xda, 0xa8, 0x75, 0xb3, 0x80, 0x53, 0xd3, 0xa0, 0x71, 0xd3, 0xbb, 0xa2, 0xd0, 0xc3, 0xb9, 0xcd, 0xc9, 0xc1, 0xc9, 0xc2, 0xb9, 0xd6, 0xce, 0xc5, 0xdb, 0xd7, 0xd1, 0xf7, 0xf6, 0xf4, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf9, 0xf9, 0xef, 0xed, 0xeb, 0xe1, 0xe0, 0xd9, 0xe9, 0xe8, 0xe2, 0xee, 0xed, 0xe7, 0xd8, 0xcf, 0xc8, 0xac, 0x9b, 0x8d, 0x6d, 0x59, 0x4b, 0x46, 0x32, 0x24, 0x3b, 0x26, 0x1a, 0x2a, 0x18, 0x0c, 0x50, 0x35, 0x1f, 0x5a, 0x40, 0x28, 0x2b, 0x19, 0x0d, 0x47, 0x2a, 0x18, 0x5c, 0x38, 0x1b, 0x6c, 0x47, 0x26, 0x73, 0x4b, 0x27, 0xa8, 0x78, 0x4b, 0x97, 0x67, 0x3e, 0xb6, 0x84, 0x57, 0xb0, 0x7d, 0x50, 0xbc, 0x89, 0x5c, 0xbf, 0x8d, 0x60, 0xbb, 0x86, 0x58, 0xcd, 0x99, 0x6b, 0xbd, 0x88, 0x5a, 0xd1, 0x9c, 0x6e, 0xd4, 0xa0, 0x71, 0xd4, 0xa4, 0x77, 0xcd, 0xa2, 0x7b, 0xdd, 0xb1, 0x8a, 0xdd, 0xb1, 0x8a, 0xeb, 0xbf, 0x98, 0xe9, 0xc1, 0x9b, 0xe5, 0xb8, 0x90, 0xda, 0xa9, 0x7d, 0xda, 0xad, 0x81, 0xe1, 0xb7, 0x94, 0xd7, 0xad, 0x89, 0xbb, 0x90, 0x6f, 0xb8, 0x8e, 0x6b, 0xaa, 0x80, 0x59, 0xa9, 0x7e, 0x60, 0x9b, 0x76, 0x57, 0x74, 0x51, 0x36, 0x7d, 0x66, 0x54, 0xbe, 0xa2, 0x8b, 0xb6, 0x97, 0x7c, 0xb8, 0x8e, 0x6e, 0xc6, 0x9a, 0x78, 0xbf, 0x92, 0x66, 0xce, 0x9f, 0x7c, 0xe2, 0xb6, 0x92, 0xdc, 0xb3, 0x8f, 0xe2, 0xb9, 0x97, 0xe2, 0xbf, 0x9e, 0xdc, 0xba, 0x9d, 0xe0, 0xc3, 0xa9, 0xd6, 0xbc, 0xa7, 0xe2, 0xcb, 0xba, 0xe8, 0xd7, 0xc5, 0xea, 0xdf, 0xcf, 0xe8, 0xdf, 0xd2, 0xe4, 0xdd, 0xd2, 0x83, 0x7c, 0x77, 0xd7, 0xd0, 0xca, 0xeb, 0xe5, 0xd9, 0xe9, 0xde, 0xcf, 0xea, 0xdb, 0xc8, 0xe5, 0xd2, 0xc0, 0xdb, 0xc3, 0xaf, 0xd4, 0xb4, 0x98, 0xe5, 0xc8, 0xae, 0xea, 0xc7, 0xa6, 0xe4, 0xbf, 0x9a, 0xe4, 0xb5, 0x92, 0xdb, 0xb5, 0x90, 0xdb, 0xaf, 0x80, 0xea, 0xbb, 0x9e, 0xd1, 0x9c, 0x70, 0xe1, 0xba, 0x92, 0xd6, 0xba, 0xa1, 0xbb, 0x94, 0x75, 0xc2, 0x9b, 0x78, 0xbc, 0x92, 0x70, 0xc2, 0x99, 0x73, 0xc1, 0x95, 0x70, 0xc0, 0x94, 0x6f, 0xc2, 0x93, 0x6f, 0xda, 0xad, 0x82, 0xdb, 0xae, 0x83, 0xd6, 0xa9, 0x7e, 0xcf, 0xa2, 0x77, 0xc2, 0x8f, 0x66, 0xd7, 0xa5, 0x7d, 0xdc, 0xab, 0x7e, 0xd9, 0xa9, 0x7b, 0xe0, 0xb0, 0x82, 0xeb, 0xbc, 0x8e, 0xdc, 0xae, 0x7f, 0xe4, 0xb5, 0x85, 0xd9, 0xa7, 0x78, 0xdb, 0xa6, 0x78, 0xe1, 0xad, 0x7f, 0xea, 0xb6, 0x85, 0xdd, 0xa9, 0x77, 0xe3, 0xae, 0x7c, 0xe1, 0xab, 0x7a, 0xdb, 0xa5, 0x73, 0xd9, 0xa3, 0x6f, 0xe3, 0xae, 0x7a, 0xe3, 0xb1, 0x7f, 0xb9, 0x86, 0x59, 0xb3, 0x81, 0x57, 0xbf, 0xa2, 0x89, 0xd0, 0xc4, 0xba, 0xd6, 0xd2, 0xca, 0xdb, 0xd7, 0xd2, 0xd9, 0xd5, 0xd0, 0xdb, 0xd7, 0xd1, 0xf3, 0xf2, 0xf1, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf4, 0xf5, 0xf2, 0xe7, 0xe8, 0xe4, 0xe8, 0xe7, 0xe3, 0xea, 0xe9, 0xe5, 0xd4, 0xce, 0xc8, 0x8b, 0x7c, 0x72, 0x5d, 0x49, 0x3d, 0x43, 0x2f, 0x23, 0x3c, 0x28, 0x1e, 0x3c, 0x28, 0x1a, 0x4c, 0x31, 0x1c, 0x3f, 0x2a, 0x17, 0x3a, 0x24, 0x0e, 0x51, 0x33, 0x19, 0x65, 0x43, 0x24, 0x68, 0x46, 0x25, 0x71, 0x4d, 0x29, 0x9e, 0x70, 0x45, 0x94, 0x69, 0x3c, 0xb5, 0x84, 0x57, 0xa6, 0x73, 0x49, 0xc0, 0x8d, 0x5f, 0xba, 0x8a, 0x5d, 0xbb, 0x89, 0x5b, 0xcd, 0x99, 0x69, 0xcd, 0x99, 0x6a, 0xd8, 0xa3, 0x75, 0xda, 0xa3, 0x72, 0xcb, 0x9b, 0x6f, 0xdf, 0xb3, 0x8c, 0xdc, 0xb1, 0x89, 0xd9, 0xad, 0x86, 0xe4, 0xb9, 0x92, 0xee, 0xc6, 0xa0, 0xe6, 0xb8, 0x91, 0xd5, 0xa6, 0x7d, 0xdd, 0xb3, 0x8e, 0xe2, 0xba, 0x95, 0xd2, 0xa8, 0x84, 0xc8, 0x9d, 0x78, 0xaf, 0x83, 0x5d, 0xae, 0x80, 0x5f, 0xb6, 0x8e, 0x6f, 0xb2, 0x90, 0x73, 0xa2, 0x84, 0x6d, 0x7c, 0x61, 0x4c, 0x9f, 0x86, 0x6b, 0xa1, 0x84, 0x70, 0xa9, 0x81, 0x65, 0xc2, 0x90, 0x62, 0xd4, 0xa4, 0x7d, 0xd5, 0xa7, 0x81, 0xda, 0xaf, 0x87, 0xd4, 0xac, 0x8c, 0xe0, 0xb9, 0x97, 0xdb, 0xb7, 0x97, 0xdc, 0xba, 0x9c, 0xd4, 0xb6, 0x9b, 0xda, 0xc1, 0xad, 0xdd, 0xc7, 0xb7, 0xe4, 0xd5, 0xc6, 0xe5, 0xdc, 0xcd, 0xe4, 0xdc, 0xd1, 0xd6, 0xcf, 0xc5, 0x9c, 0x94, 0x8d, 0xd3, 0xcb, 0xc5, 0xe5, 0xde, 0xd6, 0xeb, 0xe4, 0xd8, 0xe8, 0xdf, 0xd2, 0xeb, 0xde, 0xce, 0xe0, 0xce, 0xba, 0xda, 0xc1, 0xaa, 0xd8, 0xba, 0x9f, 0xde, 0xb9, 0x9a, 0xe9, 0xc3, 0xa3, 0xec, 0xc8, 0xa8, 0xee, 0xc6, 0xa5, 0xee, 0xcd, 0xb0, 0xe8, 0xbd, 0x93, 0xe9, 0xc4, 0x9f, 0xe2, 0xad, 0x7e, 0xcc, 0xae, 0x93, 0xd7, 0xb8, 0x9c, 0xcd, 0xb0, 0x96, 0xba, 0x97, 0x7a, 0xbe, 0x93, 0x69, 0xbf, 0x93, 0x6d, 0xbf, 0x94, 0x6e, 0xcb, 0x9f, 0x78, 0xcd, 0x9f, 0x77, 0xdd, 0xb2, 0x89, 0xda, 0xab, 0x80, 0xd5, 0xa7, 0x7e, 0xcc, 0x9b, 0x71, 0xd6, 0xa3, 0x7b, 0xdd, 0xac, 0x7d, 0xd6, 0xa4, 0x77, 0xda, 0xa9, 0x7b, 0xef, 0xbf, 0x91, 0xdc, 0xb0, 0x81, 0xe2, 0xb3, 0x85, 0xd5, 0xa1, 0x73, 0xd3, 0x9e, 0x70, 0xd2, 0x9d, 0x6f, 0xe9, 0xb7, 0x87, 0xe3, 0xb2, 0x81, 0xd9, 0xa6, 0x76, 0xdd, 0xa9, 0x78, 0xdf, 0xab, 0x77, 0xd7, 0xa1, 0x6b, 0xe8, 0xb4, 0x7e, 0xdc, 0xa8, 0x74, 0xab, 0x7c, 0x52, 0xa4, 0x74, 0x54, 0xb5, 0x98, 0x84, 0xd5, 0xcb, 0xc3, 0xda, 0xd6, 0xcf, 0xdf, 0xde, 0xda, 0xe7, 0xe6, 0xe2, 0xde, 0xdd, 0xd9, 0xf6, 0xf6, 0xf4, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf8, 0xf9, 0xf6, 0xe9, 0xe9, 0xe7, 0xe8, 0xe6, 0xe3, 0xe4, 0xe3, 0xdf, 0xd2, 0xcd, 0xc5, 0x7c, 0x6c, 0x62, 0x5f, 0x4b, 0x3e, 0x4a, 0x36, 0x29, 0x41, 0x2c, 0x22, 0x46, 0x2e, 0x1b, 0x4c, 0x30, 0x1e, 0x35, 0x21, 0x0f, 0x4b, 0x35, 0x1f, 0x52, 0x36, 0x1d, 0x50, 0x32, 0x15, 0x61, 0x41, 0x23, 0x6b, 0x4a, 0x28, 0x8c, 0x61, 0x3a, 0x96, 0x6b, 0x40, 0xad, 0x7e, 0x53, 0xb5, 0x83, 0x56, 0xb2, 0x7e, 0x4f, 0xb1, 0x82, 0x58, 0xba, 0x8a, 0x5f, 0xc6, 0x92, 0x62, 0xd2, 0x9d, 0x6f, 0xdd, 0xa8, 0x7a, 0xd4, 0x9e, 0x6d, 0xc9, 0x9c, 0x72, 0xe3, 0xb8, 0x8e, 0xde, 0xb3, 0x89, 0xdd, 0xb1, 0x8a, 0xeb, 0xbf, 0x98, 0xea, 0xbf, 0x98, 0xe0, 0xb1, 0x8a, 0xd8, 0xab, 0x87, 0xea, 0xc1, 0x9d, 0xd6, 0xad, 0x89, 0xc7, 0x9d, 0x7a, 0xb8, 0x8d, 0x68, 0xac, 0x80, 0x5d, 0xb1, 0x88, 0x69, 0xb5, 0x92, 0x73, 0xab, 0x8b, 0x6f, 0x7f, 0x5f, 0x41, 0xa2, 0x86, 0x6b, 0x6b, 0x52, 0x3f, 0x7b, 0x63, 0x4b, 0x8b, 0x65, 0x44, 0x95, 0x6b, 0x48, 0xa2, 0x78, 0x57, 0xac, 0x7a, 0x53, 0xb9, 0x8e, 0x69, 0xc5, 0x9d, 0x7a, 0xb4, 0x8b, 0x68, 0xdc, 0xb8, 0x99, 0xcd, 0xae, 0x90, 0xe6, 0xcb, 0xb0, 0xe0, 0xc9, 0xb5, 0xdf, 0xcb, 0xbc, 0xe6, 0xdb, 0xcc, 0xe8, 0xe0, 0xd4, 0xdd, 0xd4, 0xcb, 0xd5, 0xcd, 0xc3, 0x99, 0x90, 0x87, 0xc7, 0xbe, 0xb6, 0xdf, 0xd6, 0xce, 0xdf, 0xd9, 0xcd, 0xe9, 0xe3, 0xd7, 0xeb, 0xdf, 0xcf, 0xe7, 0xd7, 0xc4, 0xde, 0xc2, 0xa8, 0xd5, 0xb4, 0x97, 0xdb, 0xb2, 0x94, 0xda, 0xb1, 0x93, 0xe2, 0xbc, 0x9c, 0xe9, 0xbf, 0x9b, 0xef, 0xcb, 0xa8, 0xe6, 0xbd, 0x99, 0xcf, 0xa2, 0x7b, 0xc2, 0x98, 0x74, 0xad, 0x90, 0x74, 0xc6, 0xa5, 0x85, 0xc2, 0xa1, 0x80, 0xc4, 0xa2, 0x85, 0xbf, 0x9b, 0x77, 0xc5, 0x9a, 0x76, 0xbd, 0x91, 0x6b, 0xd5, 0xa7, 0x81, 0xc7, 0x95, 0x70, 0xde, 0xb4, 0x8d, 0xd8, 0xaa, 0x81, 0xe5, 0xb9, 0x90, 0xcc, 0x9b, 0x70, 0xcc, 0x99, 0x70, 0xe3, 0xb0, 0x83, 0xe2, 0xb0, 0x83, 0xd3, 0xa2, 0x74, 0xe5, 0xb3, 0x86, 0xee, 0xc1, 0x92, 0xe6, 0xb6, 0x8c, 0xda, 0xa5, 0x77, 0xd9, 0xa5, 0x76, 0xdc, 0xa7, 0x79, 0xe1, 0xae, 0x7f, 0xe4, 0xb2, 0x83, 0xdc, 0xaa, 0x7c, 0xe0, 0xae, 0x7e, 0xd8, 0xa5, 0x71, 0xdb, 0xa6, 0x71, 0xe2, 0xae, 0x79, 0xe2, 0xac, 0x77, 0xa5, 0x77, 0x50, 0xa8, 0x7d, 0x57, 0x8e, 0x72, 0x5a, 0xcc, 0xc0, 0xb6, 0xdb, 0xd7, 0xd1, 0xdf, 0xdd, 0xda, 0xe8, 0xe7, 0xe4, 0xe7, 0xe7, 0xe5, 0xfa, 0xfa, 0xf8, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf7, 0xf8, 0xf5, 0xef, 0xef, 0xed, 0xea, 0xe9, 0xe5, 0xe5, 0xe4, 0xe0, 0xaf, 0xaa, 0xa2, 0x8a, 0x7a, 0x71, 0x5a, 0x47, 0x39, 0x52, 0x3e, 0x31, 0x48, 0x30, 0x24, 0x5e, 0x41, 0x2c, 0x4b, 0x34, 0x27, 0x38, 0x21, 0x0f, 0x4b, 0x31, 0x19, 0x40, 0x28, 0x13, 0x40, 0x28, 0x11, 0x4f, 0x34, 0x19, 0x6b, 0x49, 0x2d, 0x70, 0x4b, 0x26, 0x9c, 0x6b, 0x46, 0xa5, 0x77, 0x4d, 0xb9, 0x88, 0x55, 0xb5, 0x81, 0x53, 0xbe, 0x8e, 0x64, 0xb9, 0x88, 0x5d, 0xcd, 0x99, 0x69, 0xd5, 0xa0, 0x72, 0xd0, 0x9b, 0x6d, 0xc1, 0x8f, 0x62, 0xde, 0xb4, 0x8e, 0xe2, 0xb8, 0x8a, 0xd6, 0xab, 0x7e, 0xef, 0xc4, 0x9c, 0xe6, 0xba, 0x93, 0xdf, 0xae, 0x83, 0xe5, 0xb7, 0x92, 0xe8, 0xc1, 0x9c, 0xd9, 0xb0, 0x8c, 0xcf, 0xa3, 0x80, 0xbd, 0x93, 0x70, 0xb9, 0x8d, 0x6a, 0xac, 0x83, 0x63, 0xd0, 0xb2, 0x95, 0xb8, 0x9a, 0x80, 0x83, 0x62, 0x43, 0xd1, 0xb1, 0x96, 0x5b, 0x3f, 0x29, 0x5f, 0x46, 0x33, 0x5f, 0x48, 0x2c, 0x78, 0x5a, 0x3e, 0xac, 0x88, 0x6c, 0xa4, 0x76, 0x53, 0x99, 0x71, 0x52, 0xb3, 0x8c, 0x6a, 0xc2, 0x98, 0x72, 0xca, 0x9c, 0x74, 0xe9, 0xc8, 0xab, 0xe7, 0xcd, 0xb2, 0xe8, 0xd1, 0xba, 0xe1, 0xd0, 0xbb, 0xe5, 0xd7, 0xc6, 0xe3, 0xda, 0xca, 0xde, 0xd6, 0xcb, 0xd8, 0xd0, 0xc7, 0xd0, 0xc8, 0xbe, 0x8d, 0x85, 0x7b, 0xb3, 0xab, 0x9d, 0xd6, 0xce, 0xc0, 0xe3, 0xdd, 0xd1, 0xe2, 0xdc, 0xd0, 0xec, 0xe5, 0xd8, 0xf0, 0xe3, 0xd4, 0xe9, 0xcf, 0xb9, 0xdc, 0xc0, 0xa6, 0xd7, 0xae, 0x90, 0xcc, 0xa3, 0x85, 0xcd, 0xa4, 0x7f, 0xc8, 0x9a, 0x74, 0xbe, 0x8b, 0x62, 0xbf, 0x98, 0x7b, 0xda, 0xaf, 0x89, 0xb8, 0x9c, 0x80, 0xb5, 0x92, 0x72, 0xcb, 0xab, 0x8b, 0xc1, 0x9c, 0x75, 0xbb, 0x95, 0x75, 0xbb, 0x95, 0x72, 0xc1, 0x9b, 0x7a, 0xbf, 0x92, 0x69, 0xd1, 0xa3, 0x7d, 0xcc, 0x9b, 0x75, 0xd6, 0xa8, 0x7f, 0xdd, 0xb5, 0x90, 0xdf, 0xb2, 0x8a, 0xdc, 0xac, 0x81, 0xbf, 0x8c, 0x5f, 0xdd, 0xa9, 0x82, 0xdf, 0xb3, 0x84, 0xe1, 0xb4, 0x85, 0xd6, 0xa4, 0x76, 0xe8, 0xbb, 0x8c, 0xf1, 0xc4, 0x99, 0xdb, 0xab, 0x7c, 0xce, 0x9a, 0x6b, 0xda, 0xa6, 0x78, 0xd8, 0xa5, 0x77, 0xe4, 0xb2, 0x83, 0xdc, 0xaa, 0x7c, 0xde, 0xac, 0x7c, 0xdf, 0xac, 0x7a, 0xd3, 0x9d, 0x6d, 0xd9, 0xa3, 0x73, 0xdd, 0xa8, 0x73, 0xba, 0x8c, 0x65, 0xa0, 0x76, 0x53, 0x7b, 0x59, 0x45, 0x9e, 0x8a, 0x7b, 0xd7, 0xd3, 0xce, 0xe4, 0xe2, 0xdf, 0xe7, 0xe5, 0xe2, 0xe6, 0xe7, 0xe5, 0xf7, 0xf8, 0xf5, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf9, 0xf7, 0xf3, 0xf3, 0xf1, 0xf2, 0xf1, 0xef, 0xd0, 0xcf, 0xc8, 0xa9, 0xa5, 0x9d, 0x92, 0x85, 0x7a, 0x65, 0x54, 0x49, 0x59, 0x43, 0x35, 0x45, 0x2e, 0x23, 0x49, 0x33, 0x22, 0x2f, 0x1e, 0x13, 0x40, 0x2a, 0x19, 0x43, 0x2b, 0x18, 0x38, 0x1f, 0x0a, 0x4d, 0x33, 0x17, 0x49, 0x2d, 0x16, 0x5e, 0x41, 0x23, 0x69, 0x46, 0x25, 0x7d, 0x56, 0x32, 0xa6, 0x79, 0x50, 0xb3, 0x82, 0x56, 0xbe, 0x8b, 0x60, 0xb5, 0x87, 0x5e, 0xbc, 0x8a, 0x5d, 0xc7, 0x94, 0x67, 0xd1, 0x9e, 0x71, 0xce, 0x9b, 0x6e, 0xc8, 0x98, 0x6a, 0xdf, 0xb3, 0x89, 0xdb, 0xab, 0x7c, 0xe1, 0xb5, 0x89, 0xe8, 0xbb, 0x90, 0xe8, 0xbb, 0x90, 0xe4, 0xb7, 0x8a, 0xef, 0xc6, 0xa1, 0xe0, 0xb7, 0x93, 0xd2, 0xa8, 0x82, 0xcb, 0xa2, 0x7e, 0xbd, 0x95, 0x72, 0xac, 0x84, 0x62, 0xc3, 0x9f, 0x80, 0xb1, 0x91, 0x75, 0x8a, 0x66, 0x4c, 0xa9, 0x87, 0x64, 0x7f, 0x5d, 0x45, 0x8c, 0x74, 0x5d, 0x5c, 0x42, 0x2b, 0x94, 0x7a, 0x63, 0xa1, 0x87, 0x6f, 0xa0, 0x78, 0x55, 0xba, 0x92, 0x6e, 0xcd, 0xa3, 0x7f, 0xd2, 0xa5, 0x80, 0xe4, 0xbc, 0x99, 0xd8, 0xb4, 0x95, 0xe1, 0xc2, 0xa7, 0xe1, 0xc5, 0xad, 0xdd, 0xc1, 0xa8, 0xdf, 0xcc, 0xbc, 0xdc, 0xcd, 0xc0, 0xdd, 0xd3, 0xc9, 0xd9, 0xd1, 0xc8, 0xcf, 0xc4, 0xba, 0xaf, 0xa3, 0x93, 0x2f, 0x26, 0x1b, 0x65, 0x55, 0x46, 0xbf, 0xb3, 0x9f, 0xd2, 0xca, 0xc0, 0xe7, 0xdf, 0xd4, 0xe7, 0xde, 0xd2, 0xeb, 0xde, 0xcf, 0xe8, 0xd7, 0xc4, 0xeb, 0xd1, 0xb8, 0xe2, 0xc3, 0xa8, 0xe5, 0xc5, 0xa9, 0xdf, 0xb5, 0x90, 0xde, 0xb8, 0x97, 0xda, 0xae, 0x87, 0xd3, 0xac, 0x89, 0xc6, 0x9f, 0x76, 0xb6, 0x9b, 0x7c, 0xb4, 0x93, 0x75, 0xd2, 0xaf, 0x92, 0xbc, 0x90, 0x6a, 0xc3, 0x9f, 0x7f, 0xb5, 0x8c, 0x69, 0xcd, 0xa8, 0x88, 0xc4, 0x99, 0x74, 0xcf, 0xa0, 0x79, 0xd2, 0xa5, 0x7e, 0xce, 0xa1, 0x76, 0xdd, 0xb0, 0x86, 0xe1, 0xb4, 0x89, 0xdb, 0xae, 0x83, 0xd9, 0xa8, 0x7d, 0xd6, 0xa5, 0x7a, 0xe7, 0xbb, 0x8e, 0xe6, 0xba, 0x8d, 0xe0, 0xaf, 0x84, 0xe1, 0xb1, 0x81, 0xe4, 0xb6, 0x8d, 0xe8, 0xb6, 0x8a, 0xd8, 0xa6, 0x79, 0xd9, 0xa6, 0x79, 0xdd, 0xac, 0x80, 0xe6, 0xb5, 0x8a, 0xe0, 0xaf, 0x81, 0xda, 0xa7, 0x78, 0xe4, 0xb1, 0x80, 0xc0, 0x8d, 0x5b, 0xdb, 0xa7, 0x78, 0xd7, 0xa3, 0x72, 0xd2, 0xa3, 0x74, 0xa4, 0x81, 0x5b, 0x76, 0x5a, 0x44, 0x88, 0x6c, 0x5e, 0xc5, 0xbe, 0xb8, 0xea, 0xe9, 0xe7, 0xe7, 0xe5, 0xe4, 0xe8, 0xe8, 0xe6, 0xfc, 0xfc, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfa, 0xf6, 0xf6, 0xf4, 0xea, 0xe9, 0xe7, 0xc4, 0xc3, 0xbd, 0xb7, 0xb3, 0xaa, 0x80, 0x74, 0x69, 0x6b, 0x56, 0x48, 0x5a, 0x40, 0x30, 0x3c, 0x29, 0x1c, 0x27, 0x14, 0x0b, 0x2e, 0x1b, 0x10, 0x40, 0x2a, 0x17, 0x41, 0x28, 0x15, 0x42, 0x2a, 0x15, 0x48, 0x30, 0x16, 0x42, 0x29, 0x15, 0x4e, 0x34, 0x18, 0x66, 0x43, 0x22, 0x83, 0x5c, 0x38, 0xa1, 0x74, 0x4b, 0xb8, 0x87, 0x5c, 0xa8, 0x77, 0x4b, 0xaa, 0x7d, 0x54, 0xc5, 0x92, 0x65, 0xcf, 0x9d, 0x70, 0xd2, 0x9f, 0x72, 0xd5, 0xa2, 0x75, 0xd6, 0xa7, 0x79, 0xda, 0xad, 0x83, 0xe0, 0xb0, 0x81, 0xe7, 0xba, 0x90, 0xea, 0xbd, 0x92, 0xea, 0xbd, 0x92, 0xe9, 0xc2, 0x99, 0xe8, 0xbe, 0x98, 0xd7, 0xac, 0x87, 0xca, 0xa1, 0x7b, 0xbf, 0x96, 0x72, 0xb9, 0x91, 0x6f, 0xb5, 0x91, 0x71, 0xd3, 0xb1, 0x92, 0x9c, 0x76, 0x55, 0xb1, 0x8f, 0x6e, 0xa3, 0x80, 0x64, 0xab, 0x8c, 0x72, 0x80, 0x62, 0x49, 0xa0, 0x86, 0x6f, 0x72, 0x58, 0x41, 0x85, 0x69, 0x51, 0x97, 0x75, 0x59, 0xa6, 0x81, 0x5f, 0xb5, 0x88, 0x5e, 0xce, 0xa0, 0x7b, 0xc8, 0xa0, 0x7d, 0xc3, 0x97, 0x72, 0xc5, 0x9e, 0x7c, 0xd5, 0xb8, 0xa1, 0xd9, 0xbd, 0xa4, 0xe1, 0xcd, 0xbe, 0xdf, 0xcf, 0xc3, 0xd5, 0xcb, 0xc2, 0xcc, 0xc0, 0xb4, 0xa0, 0x90, 0x7e, 0x38, 0x2d, 0x25, 0x1e, 0x1a, 0x15, 0x1b, 0x16, 0x11, 0x69, 0x59, 0x47, 0xb7, 0xa5, 0x95, 0xd8, 0xcd, 0xc3, 0xe5, 0xdc, 0xd0, 0xea, 0xdd, 0xce, 0xeb, 0xda, 0xc6, 0xde, 0xc4, 0xab, 0xe4, 0xc7, 0xae, 0xde, 0xc0, 0xa5, 0xe4, 0xbe, 0x9e, 0xe3, 0xba, 0x98, 0xdd, 0xbe, 0xa0, 0xd1, 0xa4, 0x7c, 0xbf, 0x9b, 0x7b, 0xbd, 0xa0, 0x85, 0xcd, 0xad, 0x91, 0xd1, 0xb2, 0x96, 0xb5, 0x8d, 0x6b, 0xc1, 0x97, 0x74, 0xc9, 0xa4, 0x84, 0xb1, 0x88, 0x64, 0xc5, 0xa1, 0x82, 0xcc, 0xa3, 0x80, 0xcf, 0x9f, 0x77, 0xd5, 0xa8, 0x7e, 0xd1, 0xa4, 0x79, 0xe3, 0xb6, 0x8b, 0xdf, 0xb2, 0x87, 0xe0, 0xaf, 0x84, 0xd7, 0xa6, 0x7a, 0xd7, 0xab, 0x7e, 0xdf, 0xb3, 0x86, 0xea, 0xb9, 0x8f, 0xe3, 0xb3, 0x83, 0xea, 0xbd, 0x94, 0xdc, 0xab, 0x80, 0xda, 0xa7, 0x7a, 0xcb, 0x98, 0x6c, 0xd5, 0xa3, 0x77, 0xe9, 0xb8, 0x8c, 0xe3, 0xb2, 0x84, 0xd6, 0xa3, 0x74, 0xe2, 0xb0, 0x7e, 0xcb, 0x97, 0x65, 0xca, 0x96, 0x66, 0xd0, 0xa1, 0x72, 0xc0, 0x94, 0x6f, 0x9d, 0x7d, 0x5d, 0x74, 0x5b, 0x4d, 0x7e, 0x65, 0x5a, 0xb0, 0xa5, 0x9b, 0xe9, 0xe8, 0xe6, 0xf5, 0xf3, 0xf1, 0xeb, 0xeb, 0xe9, 0xfc, 0xfc, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xe9, 0xe8, 0xe6, 0xc8, 0xc3, 0xbe, 0xb1, 0xa9, 0x9d, 0x83, 0x74, 0x66, 0x65, 0x4e, 0x3b, 0x50, 0x3a, 0x26, 0x3f, 0x29, 0x1f, 0x22, 0x12, 0x05, 0x3c, 0x2c, 0x20, 0x40, 0x28, 0x15, 0x2f, 0x1a, 0x08, 0x47, 0x2b, 0x16, 0x4f, 0x32, 0x1a, 0x3a, 0x27, 0x0c, 0x4f, 0x32, 0x18, 0x5d, 0x3c, 0x1d, 0x78, 0x55, 0x35, 0x9a, 0x6e, 0x43, 0xa6, 0x78, 0x4f, 0x9f, 0x72, 0x47, 0xbd, 0x90, 0x65, 0xbd, 0x8d, 0x60, 0xbc, 0x8c, 0x5f, 0xc1, 0x90, 0x66, 0xcd, 0x9c, 0x6e, 0xda, 0xa9, 0x7d, 0xda, 0xa9, 0x7e, 0xe5, 0xb9, 0x8c, 0xe3, 0xb6, 0x89, 0xea, 0xba, 0x8f, 0xe5, 0xbc, 0x94, 0xef, 0xc6, 0x9c, 0xdf, 0xb3, 0x8d, 0xc9, 0xa0, 0x7b, 0xc7, 0x9f, 0x7a, 0xb9, 0x90, 0x6f, 0xb9, 0x92, 0x75, 0xcd, 0xaa, 0x8a, 0xb7, 0x8d, 0x6b, 0xa8, 0x8c, 0x66, 0xa5, 0x83, 0x62, 0xbc, 0x9f, 0x83, 0x80, 0x61, 0x45, 0xa9, 0x89, 0x6f, 0x71, 0x53, 0x38, 0x8c, 0x72, 0x5a, 0x7a, 0x64, 0x4e, 0x6b, 0x4f, 0x34, 0x75, 0x50, 0x34, 0x7b, 0x5d, 0x3e, 0x75, 0x4d, 0x31, 0x86, 0x57, 0x36, 0xb7, 0x88, 0x5e, 0xb9, 0x88, 0x65, 0xcd, 0xaa, 0x8a, 0xd4, 0xb8, 0x9e, 0xd8, 0xc5, 0xb7, 0xd9, 0xcc, 0xc2, 0xce, 0xbd, 0xb2, 0xa5, 0x91, 0x80, 0x54, 0x3f, 0x2c, 0x3a, 0x2b, 0x20, 0x40, 0x30, 0x25, 0x2e, 0x1f, 0x18, 0x32, 0x23, 0x19, 0x6a, 0x57, 0x42, 0xb7, 0xa2, 0x90, 0xca, 0xbe, 0xb1, 0xdf, 0xd6, 0xcb, 0xe3, 0xd0, 0xbd, 0xe1, 0xc7, 0xae, 0xd0, 0xa7, 0x85, 0xbe, 0x97, 0x77, 0xbe, 0x9c, 0x7d, 0x8d, 0x62, 0x43, 0xa0, 0x77, 0x52, 0xbe, 0x9b, 0x7b, 0xb0, 0x8e, 0x74, 0xc9, 0xaf, 0x95, 0xbc, 0xa2, 0x87, 0xd3, 0xb8, 0x94, 0xbb, 0x94, 0x74, 0xbe, 0x94, 0x70, 0xcc, 0xa5, 0x82, 0xc2, 0x98, 0x71, 0xbf, 0x98, 0x75, 0xc1, 0x9c, 0x7b, 0xc7, 0x9c, 0x75, 0xcc, 0xa1, 0x79, 0xd4, 0xa8, 0x81, 0xd2, 0xa5, 0x7a, 0xe6, 0xb9, 0x8f, 0xde, 0xb1, 0x84, 0xdd, 0xb1, 0x84, 0xe0, 0xae, 0x80, 0xd5, 0xa8, 0x7d, 0xe6, 0xb5, 0x8a, 0xe8, 0xb7, 0x8c, 0xe7, 0xbb, 0x8e, 0xe0, 0xb3, 0x86, 0xd0, 0x9c, 0x6c, 0xe0, 0xaa, 0x7a, 0xcf, 0x9f, 0x71, 0xe5, 0xb9, 0x8c, 0xe2, 0xb3, 0x86, 0xdb, 0xaa, 0x7d, 0xd7, 0xa6, 0x77, 0xc8, 0x96, 0x66, 0xc1, 0x8e, 0x63, 0xc2, 0x94, 0x6a, 0xd0, 0xa9, 0x8a, 0xa7, 0x91, 0x7b, 0x76, 0x5f, 0x49, 0x77, 0x5f, 0x4c, 0x8b, 0x7a, 0x6d, 0xdf, 0xdc, 0xd6, 0xf7, 0xf8, 0xf6, 0xf3, 0xf3, 0xf1, 0xfc, 0xfc, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xfa, 0xde, 0xdf, 0xdc, 0xc4, 0xc0, 0xba, 0x97, 0x89, 0x7f, 0x78, 0x66, 0x58, 0x70, 0x58, 0x47, 0x4e, 0x36, 0x29, 0x4a, 0x35, 0x27, 0x29, 0x17, 0x0d, 0x2d, 0x1e, 0x13, 0x4a, 0x32, 0x21, 0x2a, 0x17, 0x0b, 0x41, 0x28, 0x14, 0x50, 0x33, 0x19, 0x38, 0x23, 0x10, 0x4d, 0x30, 0x17, 0x5c, 0x3e, 0x24, 0x5f, 0x3f, 0x25, 0x8a, 0x64, 0x3c, 0x9b, 0x6c, 0x44, 0xae, 0x81, 0x56, 0xb1, 0x84, 0x59, 0xb0, 0x82, 0x59, 0xb1, 0x84, 0x5b, 0xc7, 0x96, 0x6d, 0xcf, 0x9f, 0x71, 0xd5, 0xa4, 0x79, 0xe2, 0xb1, 0x86, 0xd5, 0xa8, 0x7b, 0xe9, 0xbc, 0x8f, 0xee, 0xc4, 0x9c, 0xee, 0xc3, 0x9a, 0xde, 0xb3, 0x88, 0xdc, 0xb0, 0x8a, 0xc7, 0x9d, 0x79, 0xc0, 0x98, 0x73, 0xae, 0x87, 0x67, 0xcc, 0xa7, 0x87, 0xc2, 0x9d, 0x79, 0xae, 0x8a, 0x66, 0xb2, 0x8d, 0x6a, 0xb1, 0x8f, 0x6f, 0xb7, 0x9a, 0x7e, 0xb7, 0x98, 0x7d, 0xae, 0x8e, 0x73, 0x7a, 0x5c, 0x41, 0x70, 0x55, 0x3e, 0x5e, 0x43, 0x2c, 0x63, 0x4a, 0x31, 0x65, 0x4c, 0x38, 0x5e, 0x3c, 0x24, 0x63, 0x40, 0x26, 0x87, 0x5b, 0x3b, 0x99, 0x6d, 0x45, 0xad, 0x7e, 0x5e, 0xbf, 0x94, 0x70, 0xc8, 0xa4, 0x86, 0xcd, 0xb5, 0xa2, 0xc0, 0xb3, 0xa0, 0x99, 0x80, 0x6d, 0x67, 0x51, 0x3f, 0x6b, 0x5b, 0x4e, 0x5a, 0x4a, 0x3e, 0x77, 0x67, 0x5b, 0x73, 0x63, 0x57, 0x4f, 0x3f, 0x32, 0x5f, 0x4d, 0x3a, 0x6e, 0x57, 0x46, 0xad, 0x9a, 0x88, 0xd0, 0xc0, 0xb1, 0xe0, 0xcc, 0xb9, 0xdc, 0xbb, 0x9e, 0xcf, 0xa5, 0x84, 0xc3, 0x99, 0x78, 0xb9, 0x93, 0x75, 0x82, 0x61, 0x46, 0x8f, 0x6e, 0x54, 0x9c, 0x79, 0x5e, 0xa5, 0x91, 0x79, 0xc0, 0xa2, 0x89, 0xc7, 0xa5, 0x8b, 0xc6, 0xa6, 0x84, 0xc3, 0x9f, 0x7e, 0xb2, 0x89, 0x66, 0xc2, 0x98, 0x73, 0xd1, 0xab, 0x86, 0xaf, 0x85, 0x5e, 0xc4, 0x9f, 0x7d, 0xca, 0xa0, 0x7a, 0xcd, 0xa1, 0x7a, 0xca, 0x9e, 0x77, 0xd0, 0xa3, 0x78, 0xdd, 0xb0, 0x86, 0xee, 0xc1, 0x94, 0xe1, 0xb5, 0x88, 0xd6, 0xa3, 0x76, 0xdf, 0xb2, 0x87, 0xde, 0xad, 0x82, 0xe4, 0xb3, 0x88, 0xea, 0xbe, 0x91, 0xe3, 0xb6, 0x89, 0xca, 0x9a, 0x6c, 0xd6, 0xa5, 0x77, 0xd4, 0xa6, 0x79, 0xe6, 0xba, 0x8d, 0xe8, 0xb9, 0x8c, 0xe3, 0xb3, 0x85, 0xd2, 0xa2, 0x73, 0xc2, 0x93, 0x65, 0xb6, 0x86, 0x5d, 0xbe, 0x92, 0x6b, 0xce, 0xaa, 0x8e, 0xb0, 0x9d, 0x8c, 0x9e, 0x92, 0x85, 0x83, 0x6e, 0x5d, 0x8b, 0x7c, 0x71, 0xc6, 0xc3, 0xbd, 0xf5, 0xf4, 0xf2, 0xf5, 0xf5, 0xf3, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf7, 0xf7, 0xf7, 0xdb, 0xda, 0xd8, 0xc3, 0xbf, 0xb9, 0x98, 0x89, 0x80, 0x86, 0x73, 0x69, 0x6c, 0x56, 0x4a, 0x44, 0x30, 0x29, 0x4d, 0x37, 0x24, 0x33, 0x23, 0x1c, 0x27, 0x15, 0x09, 0x3b, 0x26, 0x18, 0x1b, 0x0d, 0x07, 0x45, 0x2d, 0x1a, 0x44, 0x2b, 0x14, 0x2b, 0x17, 0x0b, 0x48, 0x2f, 0x18, 0x53, 0x37, 0x1e, 0x3f, 0x26, 0x11, 0x7d, 0x5a, 0x36, 0xae, 0x7b, 0x51, 0x9d, 0x71, 0x48, 0xb0, 0x84, 0x5b, 0xae, 0x81, 0x58, 0xb5, 0x89, 0x5f, 0xbc, 0x8d, 0x62, 0xce, 0xa0, 0x73, 0xdb, 0xac, 0x81, 0xd5, 0xa6, 0x7b, 0xdc, 0xb1, 0x86, 0xe5, 0xbb, 0x90, 0xe4, 0xba, 0x92, 0xda, 0xad, 0x83, 0xe9, 0xbc, 0x91, 0xd0, 0xa4, 0x7e, 0xc2, 0x9c, 0x78, 0xc4, 0x9c, 0x77, 0xbe, 0x9b, 0x7c, 0xb2, 0x8d, 0x68, 0xc0, 0x9c, 0x73, 0xbf, 0x9f, 0x7a, 0xb6, 0x8e, 0x6c, 0xb7, 0x98, 0x79, 0xc5, 0xa9, 0x91, 0x96, 0x75, 0x5a, 0x70, 0x4f, 0x37, 0x7d, 0x5e, 0x45, 0x7b, 0x5e, 0x46, 0x68, 0x4b, 0x32, 0x72, 0x58, 0x41, 0x5b, 0x41, 0x2e, 0x3a, 0x24, 0x17, 0x53, 0x39, 0x25, 0x79, 0x53, 0x35, 0x90, 0x65, 0x43, 0xb4, 0x89, 0x68, 0xbd, 0x93, 0x70, 0xc1, 0xa1, 0x84, 0xbd, 0xa3, 0x8c, 0x99, 0x84, 0x6e, 0x6d, 0x56, 0x43, 0x7c, 0x67, 0x55, 0xae, 0x9b, 0x8b, 0x99, 0x8a, 0x7c, 0x9e, 0x8f, 0x81, 0x9d, 0x8d, 0x80, 0x8a, 0x7a, 0x6c, 0x8d, 0x7b, 0x6a, 0x6d, 0x57, 0x42, 0x84, 0x6a, 0x53, 0xbf, 0xa8, 0x93, 0xd6, 0xbf, 0xad, 0xd8, 0xb4, 0x92, 0xc2, 0x97, 0x75, 0xb3, 0x89, 0x68, 0x97, 0x73, 0x56, 0x7a, 0x61, 0x4b, 0x4b, 0x32, 0x23, 0x9b, 0x7f, 0x68, 0xa0, 0x86, 0x71, 0xb5, 0x96, 0x7b, 0xaf, 0x8c, 0x71, 0xbe, 0x9b, 0x7b, 0xc6, 0xa3, 0x82, 0xb0, 0x87, 0x65, 0xbf, 0x95, 0x6e, 0xd6, 0xb0, 0x8d, 0xbc, 0x92, 0x6c, 0xb4, 0x8c, 0x6a, 0xb2, 0x8a, 0x66, 0xd3, 0xa8, 0x82, 0xbe, 0x93, 0x6d, 0xcc, 0x9f, 0x74, 0xd2, 0xa5, 0x7a, 0xe1, 0xb4, 0x88, 0xeb, 0xbe, 0x92, 0xde, 0xae, 0x81, 0xe3, 0xb6, 0x8a, 0xe5, 0xb4, 0x89, 0xdd, 0xac, 0x80, 0xe5, 0xb8, 0x8b, 0xe9, 0xbc, 0x8f, 0xcf, 0xa1, 0x77, 0xcf, 0xa0, 0x74, 0xd9, 0xa9, 0x7f, 0xe0, 0xb0, 0x84, 0xe9, 0xbb, 0x8d, 0xe3, 0xb4, 0x87, 0xd5, 0xa6, 0x78, 0xbe, 0x92, 0x65, 0xa9, 0x80, 0x57, 0xa6, 0x7f, 0x5a, 0xba, 0x9d, 0x83, 0xb6, 0xa6, 0x98, 0xce, 0xca, 0xc3, 0x8e, 0x7d, 0x6c, 0x88, 0x77, 0x6f, 0xc2, 0xbc, 0xb5, 0xeb, 0xeb, 0xe8, 0xf8, 0xf8, 0xf7, 0xfc, 0xfc, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xec, 0xec, 0xec, 0xe3, 0xe3, 0xe1, 0xbd, 0xb9, 0xb3, 0x95, 0x8b, 0x80, 0x99, 0x8b, 0x82, 0x6b, 0x5b, 0x52, 0x45, 0x34, 0x2c, 0x46, 0x2e, 0x1b, 0x24, 0x15, 0x0e, 0x2a, 0x14, 0x08, 0x2e, 0x1b, 0x11, 0x26, 0x18, 0x0d, 0x33, 0x1b, 0x09, 0x3f, 0x27, 0x15, 0x2b, 0x19, 0x0c, 0x38, 0x21, 0x0d, 0x4f, 0x34, 0x1c, 0x27, 0x15, 0x02, 0x7a, 0x59, 0x37, 0xa2, 0x73, 0x49, 0x97, 0x6b, 0x44, 0xac, 0x80, 0x59, 0xad, 0x7f, 0x56, 0xb8, 0x8b, 0x61, 0xc4, 0x98, 0x6b, 0xc9, 0x9c, 0x71, 0xd6, 0xa9, 0x7e, 0xd1, 0xa3, 0x79, 0xe2, 0xb6, 0x8c, 0xe7, 0xba, 0x91, 0xdc, 0xaf, 0x84, 0xd4, 0xa7, 0x7c, 0xd4, 0xa5, 0x7b, 0xd1, 0xa5, 0x7f, 0xc1, 0x9b, 0x76, 0xc2, 0x9b, 0x77, 0xbd, 0x99, 0x79, 0xb2, 0x8d, 0x69, 0xc6, 0xa3, 0x7e, 0xb4, 0x91, 0x71, 0xb4, 0x95, 0x76, 0xc6, 0xab, 0x8e, 0xa7, 0x83, 0x67, 0x79, 0x57, 0x3c, 0x83, 0x60, 0x4a, 0x6e, 0x4e, 0x37, 0x77, 0x57, 0x40, 0x72, 0x56, 0x3d, 0x71, 0x55, 0x3d, 0x43, 0x29, 0x18, 0x3e, 0x28, 0x1b, 0x42, 0x2e, 0x22, 0x55, 0x37, 0x21, 0x7b, 0x56, 0x39, 0xa8, 0x83, 0x66, 0xa3, 0x7e, 0x5c, 0xa1, 0x81, 0x64, 0x8d, 0x71, 0x59, 0x8b, 0x74, 0x5f, 0xa3, 0x8e, 0x7b, 0xb8, 0xa5, 0x93, 0xbc, 0xad, 0x9e, 0xc7, 0xb8, 0xa9, 0xbe, 0xaf, 0xa0, 0xae, 0x9f, 0x92, 0xa2, 0x93, 0x86, 0xba, 0xaa, 0x9b, 0xba, 0xa7, 0x96, 0x9b, 0x7d, 0x63, 0x93, 0x75, 0x5b, 0xac, 0x8d, 0x74, 0xbf, 0x9a, 0x76, 0xbd, 0x95, 0x75, 0x9f, 0x7b, 0x5e, 0x83, 0x6d, 0x57, 0x44, 0x31, 0x21, 0x5f, 0x49, 0x3b, 0x8b, 0x71, 0x5b, 0x8f, 0x73, 0x5b, 0xaf, 0x90, 0x75, 0xc1, 0xa0, 0x85, 0xc3, 0xa0, 0x81, 0xc2, 0x9d, 0x7c, 0xba, 0x91, 0x70, 0xbb, 0x91, 0x6c, 0xd3, 0xaa, 0x86, 0xd4, 0xae, 0x8b, 0xb0, 0x84, 0x61, 0xbf, 0x98, 0x77, 0xd4, 0xaa, 0x84, 0xcd, 0xa3, 0x7d, 0xc4, 0x97, 0x6c, 0xcc, 0x9f, 0x74, 0xd2, 0xa5, 0x7a, 0xd3, 0xa6, 0x7b, 0xe4, 0xb7, 0x8a, 0xe0, 0xb4, 0x87, 0xe1, 0xb0, 0x84, 0xd5, 0xa4, 0x79, 0xd2, 0xa5, 0x78, 0xe8, 0xbc, 0x8f, 0xdb, 0xae, 0x85, 0xbe, 0x8e, 0x63, 0xd5, 0xa3, 0x7a, 0xdc, 0xab, 0x81, 0xe3, 0xb4, 0x86, 0xe5, 0xb8, 0x8b, 0xce, 0xa0, 0x71, 0xc0, 0x93, 0x64, 0x9e, 0x78, 0x50, 0x8e, 0x6b, 0x4b, 0x9d, 0x85, 0x6f, 0xbc, 0xab, 0x9f, 0xd5, 0xd2, 0xcb, 0xb0, 0xa6, 0x97, 0x80, 0x6f, 0x65, 0xb4, 0xab, 0xa4, 0xe4, 0xe5, 0xe0, 0xf9, 0xf9, 0xf9, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xed, 0xed, 0xed, 0xe3, 0xe3, 0xe1, 0xaf, 0xab, 0xa5, 0xb3, 0xae, 0xa2, 0xaf, 0xa4, 0x9a, 0x8a, 0x81, 0x76, 0x46, 0x32, 0x2b, 0x46, 0x2f, 0x1c, 0x22, 0x13, 0x0c, 0x2e, 0x18, 0x0c, 0x26, 0x14, 0x0a, 0x48, 0x2e, 0x1a, 0x36, 0x21, 0x10, 0x3a, 0x21, 0x0e, 0x2d, 0x1b, 0x0d, 0x33, 0x1d, 0x0b, 0x41, 0x2a, 0x15, 0x36, 0x25, 0x14, 0x6e, 0x4e, 0x34, 0x88, 0x64, 0x3c, 0x9e, 0x73, 0x4b, 0xb5, 0x89, 0x62, 0xa7, 0x79, 0x54, 0xba, 0x8c, 0x67, 0xbf, 0x92, 0x66, 0xd4, 0xa7, 0x7b, 0xcc, 0x9f, 0x74, 0xd2, 0xa5, 0x7a, 0xe0, 0xaf, 0x83, 0xdf, 0xae, 0x82, 0xd9, 0xac, 0x81, 0xd2, 0xa5, 0x7b, 0xd3, 0xa4, 0x7a, 0xd2, 0xa6, 0x80, 0xc5, 0x9b, 0x73, 0xc5, 0xa4, 0x83, 0xb7, 0x8e, 0x6c, 0xc3, 0x9d, 0x7c, 0xbc, 0x99, 0x7b, 0x9c, 0x77, 0x59, 0xd4, 0xb7, 0x9e, 0x9f, 0x7e, 0x5d, 0x81, 0x5e, 0x42, 0x9e, 0x7c, 0x61, 0x6e, 0x4b, 0x35, 0x64, 0x44, 0x2d, 0x6e, 0x4e, 0x37, 0x70, 0x54, 0x3b, 0x55, 0x39, 0x20, 0x55, 0x38, 0x23, 0x4f, 0x37, 0x26, 0x55, 0x41, 0x30, 0x4e, 0x37, 0x25, 0x5e, 0x46, 0x32, 0x8e, 0x75, 0x61, 0x6f, 0x57, 0x41, 0x7c, 0x62, 0x4c, 0x9f, 0x88, 0x73, 0xc6, 0xb3, 0xa1, 0xc5, 0xb5, 0xa3, 0xd5, 0xc6, 0xb7, 0xc7, 0xba, 0xad, 0xcc, 0xbc, 0xae, 0xd2, 0xc4, 0xb5, 0xb1, 0xa7, 0x99, 0xc6, 0xbc, 0xae, 0xb9, 0xa9, 0x9b, 0xc4, 0xbb, 0xb1, 0xc3, 0xac, 0x98, 0xb9, 0xa2, 0x8e, 0xa5, 0x8a, 0x74, 0x9a, 0x80, 0x66, 0xad, 0x8c, 0x72, 0x93, 0x77, 0x61, 0x90, 0x7d, 0x6a, 0x7c, 0x63, 0x4e, 0x9f, 0x84, 0x73, 0x94, 0x76, 0x5d, 0x86, 0x69, 0x50, 0xa2, 0x82, 0x67, 0xb0, 0x90, 0x75, 0xc0, 0x9b, 0x7d, 0xc8, 0xa3, 0x82, 0xbf, 0x97, 0x76, 0xb2, 0x88, 0x63, 0xd3, 0xaa, 0x86, 0xd0, 0xaa, 0x87, 0xcd, 0xa1, 0x7e, 0xd2, 0xac, 0x8b, 0xd9, 0xaf, 0x89, 0xd0, 0xa6, 0x80, 0xcb, 0x9e, 0x73, 0xda, 0xad, 0x82, 0xd8, 0xab, 0x81, 0xba, 0x8d, 0x62, 0xdb, 0xaf, 0x82, 0xe4, 0xb7, 0x8a, 0xd9, 0xa8, 0x7d, 0xe6, 0xb5, 0x8a, 0xe2, 0xb5, 0x88, 0xe2, 0xb6, 0x89, 0xde, 0xb0, 0x87, 0xcf, 0x9d, 0x73, 0xd4, 0xa2, 0x78, 0xd4, 0xa3, 0x79, 0xdc, 0xad, 0x7f, 0xdf, 0xb2, 0x85, 0xd6, 0xa8, 0x7b, 0xbe, 0x92, 0x68, 0x8a, 0x64, 0x42, 0x89, 0x69, 0x51, 0x89, 0x75, 0x66, 0xa9, 0x9b, 0x93, 0xcf, 0xcf, 0xcc, 0xd4, 0xd4, 0xcd, 0x99, 0x8f, 0x81, 0xa9, 0xa0, 0x99, 0xe4, 0xe4, 0xdf, 0xf9, 0xf9, 0xf9, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf3, 0xf4, 0xf2, 0xf5, 0xf5, 0xf3, 0xd9, 0xd8, 0xd6, 0xb7, 0xb3, 0xad, 0xb4, 0xb2, 0xad, 0x9f, 0x99, 0x91, 0x85, 0x78, 0x6f, 0x4e, 0x3b, 0x33, 0x48, 0x34, 0x25, 0x1e, 0x11, 0x0b, 0x2e, 0x1a, 0x0f, 0x2c, 0x1d, 0x15, 0x2f, 0x1d, 0x10, 0x3f, 0x28, 0x16, 0x37, 0x25, 0x14, 0x2e, 0x19, 0x06, 0x23, 0x16, 0x0b, 0x24, 0x13, 0x06, 0x47, 0x32, 0x18, 0x49, 0x2e, 0x14, 0x7c, 0x59, 0x38, 0xa3, 0x76, 0x4d, 0xad, 0x81, 0x57, 0xa4, 0x78, 0x55, 0xb7, 0x8c, 0x63, 0xc5, 0x98, 0x6d, 0xca, 0x9d, 0x72, 0xbe, 0x92, 0x6a, 0xd0, 0xa5, 0x79, 0xdd, 0xb2, 0x86, 0xe4, 0xb9, 0x8d, 0xdc, 0xb1, 0x89, 0xd4, 0xa8, 0x81, 0xcf, 0xa2, 0x77, 0xca, 0xa2, 0x79, 0xcd, 0xaa, 0x85, 0xca, 0xa6, 0x83, 0xc5, 0xa0, 0x7f, 0xc8, 0xa3, 0x7f, 0xba, 0x9c, 0x7e, 0xaf, 0x8e, 0x6d, 0xc4, 0xa2, 0x82, 0x99, 0x72, 0x54, 0x93, 0x70, 0x56, 0x73, 0x53, 0x38, 0x60, 0x40, 0x25, 0x79, 0x58, 0x41, 0x58, 0x38, 0x21, 0x69, 0x49, 0x2e, 0x64, 0x44, 0x29, 0x62, 0x48, 0x30, 0x5b, 0x40, 0x2d, 0x67, 0x50, 0x3d, 0x69, 0x4e, 0x38, 0x78, 0x5f, 0x4b, 0x91, 0x7b, 0x69, 0xa4, 0x8f, 0x7f, 0xb1, 0x9b, 0x8b, 0xcf, 0xc0, 0xb2, 0xd8, 0xc8, 0xb9, 0xd6, 0xc6, 0xb6, 0xd7, 0xca, 0xbc, 0xd1, 0xc6, 0xbb, 0xc2, 0xb4, 0xaa, 0xc0, 0xb2, 0xa9, 0xbe, 0xb4, 0xa9, 0xc8, 0xbd, 0xb3, 0xd1, 0xc7, 0xb9, 0xde, 0xd5, 0xc6, 0xe1, 0xd2, 0xc5, 0xdd, 0xcf, 0xc1, 0xd6, 0xc3, 0xb7, 0xcc, 0xba, 0xad, 0xba, 0xa5, 0x93, 0xb8, 0x9f, 0x8e, 0xa9, 0x91, 0x79, 0x9c, 0x83, 0x70, 0x84, 0x6c, 0x51, 0x8d, 0x6f, 0x57, 0x96, 0x75, 0x5a, 0xa3, 0x85, 0x6c, 0xb4, 0x92, 0x7a, 0xc2, 0xa3, 0x7f, 0xc6, 0x9f, 0x7b, 0xc0, 0x9e, 0x7f, 0xb3, 0x88, 0x66, 0xb9, 0x90, 0x6c, 0xda, 0xb6, 0x8f, 0xd1, 0xa9, 0x85, 0xc7, 0x9e, 0x7e, 0xd9, 0xae, 0x87, 0xc3, 0x97, 0x70, 0xd6, 0xa9, 0x7e, 0xcb, 0x9e, 0x73, 0xdd, 0xb2, 0x87, 0xc4, 0x99, 0x6d, 0xcb, 0x9a, 0x6f, 0xdc, 0xab, 0x80, 0xdf, 0xae, 0x83, 0xe1, 0xb0, 0x85, 0xe6, 0xb9, 0x8c, 0xdf, 0xb2, 0x84, 0xdf, 0xb1, 0x88, 0xcb, 0x9a, 0x6f, 0xd5, 0xa4, 0x77, 0xcd, 0x9c, 0x71, 0xd4, 0xa6, 0x79, 0xde, 0xb1, 0x84, 0xda, 0xad, 0x80, 0xc2, 0x95, 0x68, 0x7c, 0x5a, 0x3b, 0x6b, 0x4a, 0x30, 0x5b, 0x4b, 0x3f, 0x97, 0x8c, 0x83, 0xbb, 0xb8, 0xb6, 0xdf, 0xe0, 0xdd, 0xb5, 0xb6, 0xae, 0xad, 0xa6, 0xa0, 0xda, 0xd8, 0xd4, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfa, 0xf5, 0xf6, 0xf3, 0xd3, 0xd2, 0xd1, 0xbe, 0xb9, 0xb4, 0xb4, 0xb2, 0xae, 0x9d, 0x96, 0x8f, 0x73, 0x66, 0x5c, 0x52, 0x3f, 0x37, 0x3d, 0x28, 0x1a, 0x20, 0x13, 0x0d, 0x1e, 0x10, 0x09, 0x2e, 0x1d, 0x14, 0x31, 0x1e, 0x10, 0x37, 0x20, 0x0e, 0x36, 0x20, 0x10, 0x23, 0x13, 0x09, 0x23, 0x13, 0x0a, 0x1d, 0x0c, 0x04, 0x3a, 0x20, 0x0f, 0x40, 0x29, 0x17, 0x62, 0x43, 0x26, 0x9a, 0x72, 0x4a, 0xa9, 0x81, 0x5b, 0xa0, 0x74, 0x52, 0xb4, 0x88, 0x5f, 0xc3, 0x96, 0x6b, 0xca, 0x9d, 0x72, 0xbd, 0x92, 0x69, 0xca, 0x9f, 0x73, 0xd3, 0xa9, 0x7d, 0xd6, 0xac, 0x80, 0xcc, 0xa1, 0x79, 0xdc, 0xb0, 0x89, 0xba, 0x8c, 0x65, 0xd1, 0xa8, 0x84, 0xd9, 0xb8, 0x95, 0xcd, 0xa8, 0x87, 0xb4, 0x8c, 0x6a, 0xd0, 0xaf, 0x8f, 0xa9, 0x86, 0x66, 0xae, 0x8a, 0x6a, 0xaf, 0x89, 0x6a, 0x99, 0x72, 0x54, 0x7e, 0x5a, 0x41, 0x70, 0x51, 0x35, 0x71, 0x51, 0x36, 0x69, 0x49, 0x32, 0x6e, 0x4e, 0x37, 0x5d, 0x3d, 0x22, 0x63, 0x44, 0x28, 0x69, 0x4f, 0x37, 0x75, 0x5a, 0x48, 0x7b, 0x5c, 0x44, 0x8b, 0x70, 0x5a, 0x9f, 0x89, 0x78, 0xbc, 0xab, 0x9d, 0xc7, 0xbc, 0xb1, 0xdb, 0xd0, 0xc5, 0xdb, 0xcf, 0xc4, 0xd0, 0xc0, 0xb1, 0xdd, 0xcc, 0xbc, 0xdd, 0xd0, 0xc2, 0xdc, 0xd0, 0xc6, 0xd8, 0xc9, 0xc0, 0xc6, 0xb8, 0xaf, 0xc6, 0xbc, 0xb2, 0xc7, 0xbd, 0xb2, 0xcf, 0xc0, 0xb3, 0xde, 0xcf, 0xc2, 0xd8, 0xca, 0xbd, 0xe0, 0xd2, 0xc4, 0xe5, 0xdb, 0xd1, 0xe2, 0xd8, 0xce, 0xd6, 0xca, 0xbe, 0xd7, 0xc6, 0xbb, 0xb9, 0xa0, 0x8b, 0xa2, 0x8a, 0x73, 0x99, 0x81, 0x65, 0xb4, 0x96, 0x7e, 0xab, 0x86, 0x68, 0x8c, 0x6b, 0x51, 0xb6, 0x98, 0x7d, 0xbc, 0x97, 0x76, 0xc5, 0xa0, 0x7b, 0xc6, 0xa4, 0x86, 0xbb, 0x8f, 0x6d, 0xb3, 0x8a, 0x66, 0xdd, 0xb9, 0x92, 0xd8, 0xb0, 0x8c, 0xdb, 0xb2, 0x92, 0xd6, 0xaa, 0x83, 0xcc, 0xa0, 0x79, 0xd4, 0xa7, 0x7c, 0xd6, 0xa8, 0x7e, 0xd6, 0xab, 0x7f, 0xd9, 0xae, 0x83, 0xc8, 0x97, 0x6b, 0xd6, 0xa5, 0x7a, 0xdc, 0xab, 0x80, 0xde, 0xad, 0x82, 0xe8, 0xbf, 0x96, 0xe8, 0xbe, 0x95, 0xe3, 0xb6, 0x8e, 0xcc, 0x9a, 0x6f, 0xd3, 0xa2, 0x75, 0xd1, 0xa0, 0x74, 0xd4, 0xa5, 0x79, 0xde, 0xb1, 0x84, 0xd5, 0xa8, 0x7b, 0xb8, 0x8b, 0x61, 0x8d, 0x6b, 0x51, 0x81, 0x62, 0x49, 0x5c, 0x47, 0x36, 0x8b, 0x7c, 0x70, 0xb4, 0xad, 0xa8, 0xe9, 0xea, 0xe8, 0xd6, 0xd8, 0xd0, 0xb6, 0xaf, 0xa8, 0xe7, 0xe5, 0xe0, 0xf7, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xfa, 0xfa, 0xf8, 0xf9, 0xf7, 0xea, 0xeb, 0xe9, 0xc7, 0xc6, 0xc2, 0xc7, 0xc6, 0xc2, 0xba, 0xb6, 0xb0, 0x95, 0x8d, 0x84, 0x6d, 0x5c, 0x54, 0x49, 0x39, 0x30, 0x33, 0x21, 0x15, 0x25, 0x15, 0x0a, 0x26, 0x18, 0x0c, 0x29, 0x19, 0x0d, 0x25, 0x17, 0x0d, 0x30, 0x1c, 0x0d, 0x37, 0x20, 0x14, 0x1a, 0x0e, 0x06, 0x2b, 0x18, 0x0a, 0x19, 0x0a, 0x02, 0x31, 0x1c, 0x10, 0x2e, 0x1b, 0x09, 0x4a, 0x31, 0x21, 0x88, 0x64, 0x43, 0x9a, 0x74, 0x4d, 0x9b, 0x73, 0x50, 0xac, 0x80, 0x5a, 0xbf, 0x91, 0x6b, 0xb8, 0x8a, 0x63, 0xb7, 0x8c, 0x64, 0xc2, 0x97, 0x6e, 0xc8, 0x9c, 0x75, 0xd1, 0xa6, 0x7e, 0xd7, 0xa9, 0x85, 0xcd, 0x9f, 0x7a, 0xc6, 0x99, 0x74, 0xd9, 0xb7, 0x95, 0xc7, 0xa1, 0x7c, 0xca, 0xa1, 0x7b, 0xc5, 0xa0, 0x7c, 0xcc, 0xa9, 0x89, 0xaf, 0x86, 0x69, 0xb0, 0x8c, 0x6d, 0xaf, 0x82, 0x62, 0x85, 0x5d, 0x3d, 0x81, 0x5a, 0x3d, 0x63, 0x42, 0x27, 0x66, 0x44, 0x2a, 0x64, 0x43, 0x28, 0x6d, 0x4b, 0x30, 0x61, 0x40, 0x25, 0x68, 0x4b, 0x32, 0x64, 0x47, 0x30, 0x91, 0x7b, 0x6a, 0xb2, 0xa0, 0x93, 0xc7, 0xb6, 0xa8, 0xd0, 0xc1, 0xb6, 0xcc, 0xbe, 0xb5, 0xd8, 0xcd, 0xc3, 0xd9, 0xce, 0xc4, 0xe3, 0xd7, 0xcd, 0xd9, 0xc9, 0xbc, 0xd0, 0xbd, 0xad, 0xd4, 0xc4, 0xb7, 0xdd, 0xd1, 0xc7, 0xd1, 0xc7, 0xbd, 0xcd, 0xc2, 0xb8, 0xd0, 0xc1, 0xb8, 0xd4, 0xc6, 0xbd, 0xe4, 0xd8, 0xce, 0xda, 0xce, 0xc4, 0xdf, 0xd2, 0xc9, 0xe6, 0xdd, 0xd2, 0xe8, 0xdf, 0xd6, 0xe4, 0xdb, 0xd2, 0xe5, 0xdb, 0xd0, 0xe3, 0xd9, 0xce, 0xd4, 0xc3, 0xb3, 0xaa, 0x92, 0x7c, 0x94, 0x78, 0x5f, 0xbb, 0x9b, 0x80, 0xa6, 0x82, 0x64, 0x9e, 0x79, 0x5c, 0xa9, 0x85, 0x68, 0xb4, 0x8f, 0x6e, 0xd2, 0xab, 0x87, 0xce, 0xa7, 0x85, 0xb8, 0x92, 0x71, 0xc1, 0x9b, 0x76, 0xd7, 0xb0, 0x8b, 0xd5, 0xad, 0x89, 0xc0, 0x98, 0x73, 0xdb, 0xb2, 0x8c, 0xbd, 0x93, 0x6d, 0xcf, 0xa3, 0x7c, 0xcb, 0x9f, 0x78, 0xd5, 0xab, 0x7f, 0xdc, 0xb1, 0x85, 0xdf, 0xae, 0x83, 0xc7, 0x96, 0x6b, 0xd8, 0xa7, 0x7b, 0xdf, 0xae, 0x83, 0xdd, 0xb1, 0x86, 0xe4, 0xb9, 0x8d, 0xe8, 0xbd, 0x90, 0xc4, 0x96, 0x69, 0xd6, 0xa6, 0x77, 0xd5, 0xa4, 0x77, 0xd6, 0xa8, 0x7b, 0xd9, 0xaf, 0x81, 0xcd, 0xa2, 0x78, 0x9e, 0x75, 0x53, 0x9a, 0x7a, 0x5c, 0x7a, 0x5b, 0x42, 0x6e, 0x5a, 0x4f, 0x82, 0x6f, 0x61, 0xb3, 0xae, 0xab, 0xe1, 0xe1, 0xdf, 0xe6, 0xe6, 0xe3, 0xc6, 0xc3, 0xbe, 0xe3, 0xe0, 0xdd, 0xf4, 0xf4, 0xf2, 0xfd, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfb, 0xe5, 0xe5, 0xe3, 0xd3, 0xd1, 0xce, 0xbf, 0xbe, 0xba, 0xaf, 0xab, 0xa5, 0x96, 0x8d, 0x83, 0x60, 0x4f, 0x47, 0x42, 0x31, 0x29, 0x36, 0x24, 0x18, 0x20, 0x0e, 0x02, 0x25, 0x14, 0x0b, 0x25, 0x15, 0x0c, 0x21, 0x13, 0x0b, 0x32, 0x1e, 0x10, 0x36, 0x20, 0x13, 0x1d, 0x10, 0x09, 0x23, 0x13, 0x08, 0x11, 0x06, 0x01, 0x31, 0x1d, 0x12, 0x3a, 0x29, 0x16, 0x33, 0x1b, 0x0b, 0x8c, 0x6b, 0x4c, 0x91, 0x6d, 0x47, 0x99, 0x71, 0x4f, 0xa4, 0x78, 0x52, 0xbf, 0x91, 0x6b, 0xb2, 0x84, 0x5e, 0xb7, 0x8b, 0x64, 0xc3, 0x97, 0x70, 0xcf, 0xa4, 0x7d, 0xd0, 0xa4, 0x7d, 0xbe, 0x95, 0x6f, 0xc6, 0x9d, 0x77, 0xde, 0xbc, 0x95, 0xcf, 0xa6, 0x83, 0xc8, 0x9d, 0x78, 0xce, 0xa4, 0x7e, 0xc8, 0xa2, 0x7d, 0xcf, 0xa8, 0x86, 0xb4, 0x8c, 0x6b, 0xb5, 0x8e, 0x6d, 0xa7, 0x7d, 0x58, 0x93, 0x6b, 0x4b, 0x91, 0x68, 0x4c, 0x7d, 0x5b, 0x40, 0x58, 0x36, 0x1c, 0x6b, 0x4a, 0x2f, 0x6b, 0x49, 0x2f, 0x69, 0x48, 0x2c, 0x5a, 0x3e, 0x24, 0x7f, 0x60, 0x49, 0xb1, 0x9d, 0x8d, 0xc0, 0xb0, 0xa3, 0xcc, 0xbc, 0xb0, 0xd3, 0xc5, 0xbc, 0xdd, 0xcf, 0xc6, 0xd9, 0xce, 0xc4, 0xd8, 0xce, 0xc3, 0xdf, 0xd4, 0xca, 0xdb, 0xcb, 0xbe, 0xd3, 0xc2, 0xb5, 0xd3, 0xc5, 0xba, 0xdd, 0xd1, 0xc8, 0xd4, 0xc6, 0xbd, 0xc9, 0xbb, 0xb2, 0xd2, 0xc3, 0xba, 0xd0, 0xc2, 0xb8, 0xde, 0xd2, 0xc8, 0xe0, 0xd9, 0xcd, 0xe5, 0xd8, 0xce, 0xe7, 0xde, 0xd3, 0xe8, 0xdf, 0xd6, 0xe5, 0xdc, 0xd3, 0xda, 0xcf, 0xc5, 0xe1, 0xd7, 0xcc, 0xe1, 0xd6, 0xc9, 0xcd, 0xb9, 0xa5, 0xb7, 0x9b, 0x82, 0xa7, 0x86, 0x6c, 0xa9, 0x84, 0x67, 0x9c, 0x77, 0x5a, 0xa0, 0x7a, 0x5d, 0xb1, 0x8c, 0x6b, 0xc1, 0x9a, 0x76, 0xc9, 0xa0, 0x7e, 0xb6, 0x8f, 0x6e, 0xc4, 0x9a, 0x76, 0xd0, 0xa6, 0x83, 0xcc, 0xa4, 0x80, 0xce, 0xa6, 0x82, 0xd4, 0xaa, 0x84, 0xd3, 0xa9, 0x83, 0xd3, 0xa8, 0x80, 0xcf, 0xa4, 0x7d, 0xdb, 0xb0, 0x84, 0xd2, 0xa7, 0x7c, 0xd5, 0xa4, 0x78, 0xc9, 0x98, 0x6c, 0xc9, 0x98, 0x6c, 0xdb, 0xaa, 0x7f, 0xd7, 0xaa, 0x7d, 0xd9, 0xac, 0x7f, 0xd8, 0xae, 0x80, 0xcb, 0x9d, 0x71, 0xda, 0xaa, 0x7a, 0xc7, 0x96, 0x69, 0xd7, 0xa9, 0x7d, 0xd6, 0xab, 0x7e, 0xc3, 0x99, 0x6f, 0x94, 0x70, 0x51, 0x7d, 0x61, 0x47, 0x87, 0x67, 0x4e, 0x5a, 0x48, 0x3e, 0x68, 0x57, 0x4a, 0xb4, 0xac, 0xa6, 0xe5, 0xe5, 0xe3, 0xeb, 0xeb, 0xe9, 0xdf, 0xe0, 0xdc, 0xdc, 0xdd, 0xd9, 0xf4, 0xf4, 0xf2, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xf0, 0xf0, 0xee, 0xee, 0xef, 0xed, 0xc6, 0xc4, 0xc1, 0xc3, 0xc1, 0xbe, 0xbd, 0xb8, 0xb2, 0x82, 0x79, 0x6f, 0x58, 0x48, 0x3f, 0x36, 0x25, 0x1d, 0x34, 0x22, 0x18, 0x2a, 0x19, 0x0f, 0x20, 0x11, 0x0a, 0x22, 0x14, 0x0d, 0x1b, 0x0e, 0x08, 0x38, 0x25, 0x13, 0x35, 0x1f, 0x0f, 0x24, 0x16, 0x0b, 0x17, 0x0a, 0x06, 0x12, 0x06, 0x00, 0x25, 0x17, 0x0c, 0x2d, 0x1b, 0x0f, 0x3c, 0x23, 0x10, 0x61, 0x47, 0x2f, 0x8a, 0x69, 0x44, 0x95, 0x6f, 0x4c, 0xa4, 0x79, 0x55, 0xac, 0x80, 0x5a, 0xb3, 0x88, 0x61, 0xb7, 0x8d, 0x66, 0xca, 0x9f, 0x79, 0xcd, 0xa2, 0x7c, 0xc3, 0x98, 0x72, 0xcc, 0xa6, 0x80, 0xd1, 0xac, 0x83, 0xd9, 0xb1, 0x8b, 0xcf, 0xa6, 0x7e, 0xbf, 0x95, 0x6e, 0xcb, 0xa2, 0x7c, 0xc5, 0x9c, 0x77, 0xca, 0xa0, 0x7c, 0xb7, 0x8e, 0x6a, 0xa8, 0x7e, 0x59, 0xb6, 0x8d, 0x67, 0x9a, 0x72, 0x50, 0x90, 0x67, 0x49, 0x76, 0x54, 0x39, 0x67, 0x45, 0x2b, 0x69, 0x47, 0x2d, 0x70, 0x4e, 0x34, 0x63, 0x43, 0x27, 0x61, 0x43, 0x28, 0x73, 0x56, 0x40, 0xa7, 0x94, 0x85, 0xc4, 0xb5, 0xa8, 0xd4, 0xc4, 0xb6, 0xd8, 0xcc, 0xc3, 0xda, 0xce, 0xc4, 0xd6, 0xc9, 0xbf, 0xd4, 0xc7, 0xbe, 0xdb, 0xcb, 0xc3, 0xd2, 0xc2, 0xb7, 0xd8, 0xcc, 0xc1, 0xdb, 0xd2, 0xc8, 0xda, 0xcf, 0xc5, 0xd3, 0xc5, 0xbc, 0xce, 0xc0, 0xb6, 0xcb, 0xbd, 0xb3, 0xd1, 0xc4, 0xbc, 0xd3, 0xc3, 0xba, 0xdd, 0xd7, 0xcb, 0xdb, 0xcf, 0xc5, 0xe0, 0xd7, 0xcc, 0xe6, 0xde, 0xd5, 0xe6, 0xdd, 0xd4, 0xe5, 0xdb, 0xd0, 0xda, 0xcf, 0xc5, 0xd7, 0xcd, 0xc0, 0xc9, 0xb6, 0xa8, 0xc1, 0xa7, 0x8c, 0x88, 0x6a, 0x4f, 0xa8, 0x81, 0x62, 0x9c, 0x75, 0x56, 0x9d, 0x76, 0x57, 0xb5, 0x8e, 0x6d, 0xc0, 0x99, 0x75, 0xc6, 0x9f, 0x7d, 0xc4, 0x9d, 0x7a, 0xc2, 0x97, 0x72, 0xcd, 0xa3, 0x7e, 0xda, 0xb1, 0x8b, 0xe9, 0xc0, 0x9b, 0xc8, 0x9f, 0x79, 0xd0, 0xa6, 0x7e, 0xce, 0xa3, 0x7c, 0xca, 0x9d, 0x76, 0xdb, 0xaf, 0x86, 0xd7, 0xab, 0x82, 0xd1, 0xa2, 0x77, 0xd7, 0xa8, 0x7d, 0xc5, 0x97, 0x6b, 0xd3, 0xa4, 0x78, 0xdc, 0xaf, 0x83, 0xe5, 0xb8, 0x8c, 0xe2, 0xb8, 0x8b, 0xd5, 0xa9, 0x7d, 0xd6, 0xa7, 0x78, 0xca, 0x99, 0x6b, 0xcc, 0x9e, 0x71, 0xcf, 0xa5, 0x78, 0xb9, 0x92, 0x6a, 0x8e, 0x6d, 0x4f, 0x74, 0x5c, 0x49, 0x6b, 0x4d, 0x38, 0x5e, 0x4a, 0x3b, 0x70, 0x61, 0x55, 0x8c, 0x80, 0x76, 0xd2, 0xd0, 0xcc, 0xf4, 0xf4, 0xf2, 0xe9, 0xeb, 0xe8, 0xe8, 0xea, 0xe6, 0xf4, 0xf4, 0xf2, 0xfa, 0xfb, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf6, 0xf6, 0xf6, 0xf4, 0xf4, 0xf2, 0xe6, 0xe6, 0xe4, 0xc4, 0xc3, 0xbf, 0xc7, 0xc6, 0xc2, 0xa8, 0xa1, 0x9d, 0x76, 0x6b, 0x62, 0x50, 0x40, 0x37, 0x32, 0x22, 0x19, 0x2f, 0x1e, 0x16, 0x31, 0x21, 0x18, 0x1e, 0x11, 0x09, 0x21, 0x15, 0x0d, 0x20, 0x11, 0x0c, 0x3d, 0x29, 0x15, 0x2d, 0x17, 0x0a, 0x2d, 0x1e, 0x11, 0x15, 0x0a, 0x05, 0x1c, 0x0d, 0x04, 0x19, 0x0b, 0x04, 0x15, 0x05, 0x00, 0x3d, 0x26, 0x14, 0x39, 0x24, 0x11, 0x7c, 0x5b, 0x39, 0x93, 0x6e, 0x4a, 0x92, 0x68, 0x46, 0xb1, 0x87, 0x61, 0xa9, 0x7f, 0x59, 0xb2, 0x88, 0x62, 0xba, 0x90, 0x6a, 0xcb, 0xa1, 0x7b, 0xb5, 0x8b, 0x65, 0xd9, 0xb0, 0x8d, 0xc8, 0xa0, 0x77, 0xc8, 0x9f, 0x78, 0xd4, 0xaa, 0x85, 0xc7, 0x9d, 0x77, 0xc8, 0x9e, 0x78, 0xca, 0xa0, 0x7b, 0xc0, 0x96, 0x72, 0xbd, 0x95, 0x70, 0xab, 0x83, 0x5d, 0xb7, 0x8b, 0x67, 0x8f, 0x6a, 0x47, 0x8e, 0x68, 0x46, 0x76, 0x54, 0x39, 0x67, 0x45, 0x2b, 0x70, 0x4f, 0x34, 0x77, 0x55, 0x3a, 0x5d, 0x3d, 0x22, 0x57, 0x38, 0x1c, 0x71, 0x56, 0x40, 0x9c, 0x8a, 0x7b, 0xba, 0xaa, 0x9a, 0xb6, 0xa7, 0x98, 0xdd, 0xd2, 0xc8, 0xd9, 0xce, 0xc3, 0xd4, 0xc5, 0xbc, 0xdc, 0xcd, 0xc4, 0xd3, 0xc1, 0xb9, 0xdc, 0xcd, 0xc4, 0xd9, 0xd1, 0xc7, 0xde, 0xd5, 0xcb, 0xd8, 0xca, 0xbd, 0xd8, 0xca, 0xbe, 0xce, 0xc0, 0xb4, 0xcf, 0xc1, 0xb6, 0xda, 0xcf, 0xc7, 0xd4, 0xc4, 0xbb, 0xdc, 0xd1, 0xc6, 0xda, 0xcf, 0xc4, 0xdd, 0xd1, 0xc7, 0xe2, 0xd9, 0xd0, 0xe3, 0xdb, 0xd2, 0xe4, 0xda, 0xd0, 0xd7, 0xcd, 0xc2, 0xdb, 0xcc, 0xbf, 0xc4, 0xb2, 0xa5, 0x92, 0x79, 0x5f, 0x7d, 0x5f, 0x49, 0xa7, 0x82, 0x60, 0xa8, 0x82, 0x60, 0xa3, 0x7c, 0x5a, 0xb8, 0x8f, 0x6d, 0xb9, 0x93, 0x70, 0xcb, 0xa7, 0x83, 0xc7, 0xa0, 0x7c, 0xbd, 0x93, 0x6d, 0xc4, 0x9a, 0x74, 0xdc, 0xb3, 0x8d, 0xe7, 0xbd, 0x97, 0xca, 0xa0, 0x7c, 0xd1, 0xa8, 0x7f, 0xd7, 0xae, 0x85, 0xd0, 0xa0, 0x7a, 0xd9, 0xae, 0x86, 0xd4, 0xa9, 0x81, 0xd3, 0xa6, 0x7b, 0xce, 0xa1, 0x76, 0xd3, 0xa6, 0x79, 0xd5, 0xa9, 0x7c, 0xde, 0xb1, 0x86, 0xdd, 0xb0, 0x85, 0xe1, 0xb6, 0x8b, 0xd1, 0xa6, 0x7a, 0xd1, 0xa4, 0x77, 0xcc, 0x9e, 0x70, 0xcf, 0xa2, 0x74, 0xba, 0x91, 0x66, 0xb2, 0x8e, 0x69, 0x8d, 0x6d, 0x4f, 0x65, 0x51, 0x42, 0x5e, 0x46, 0x35, 0x67, 0x4e, 0x3c, 0x66, 0x58, 0x4d, 0x8f, 0x85, 0x7d, 0xcf, 0xcb, 0xc6, 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xec, 0xf0, 0xf0, 0xee, 0xfa, 0xfb, 0xf9, 0xfa, 0xfa, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfa, 0xfa, 0xfa, 0xf8, 0xf8, 0xf6, 0xdc, 0xdc, 0xda, 0xc0, 0xbe, 0xbb, 0xbb, 0xba, 0xb6, 0x98, 0x91, 0x8d, 0x73, 0x68, 0x5f, 0x4a, 0x3a, 0x31, 0x3a, 0x29, 0x21, 0x2d, 0x1d, 0x14, 0x26, 0x15, 0x0d, 0x1e, 0x0d, 0x06, 0x2f, 0x1e, 0x18, 0x2c, 0x17, 0x0f, 0x39, 0x26, 0x13, 0x26, 0x15, 0x0c, 0x1d, 0x12, 0x09, 0x17, 0x0c, 0x0a, 0x0f, 0x05, 0x01, 0x27, 0x15, 0x06, 0x1b, 0x0b, 0x09, 0x23, 0x16, 0x0b, 0x38, 0x22, 0x15, 0x6d, 0x4c, 0x2d, 0x93, 0x6d, 0x4a, 0x92, 0x67, 0x46, 0xac, 0x83, 0x5d, 0xa5, 0x7b, 0x55, 0xad, 0x83, 0x5d, 0xc4, 0x9a, 0x74, 0xcf, 0xa5, 0x7f, 0xb7, 0x8d, 0x67, 0xca, 0x9e, 0x7d, 0xcf, 0xa3, 0x7c, 0xc0, 0x96, 0x70, 0xc7, 0x9d, 0x77, 0xce, 0xa4, 0x7e, 0xc3, 0x99, 0x73, 0xc4, 0x9a, 0x75, 0xb3, 0x89, 0x65, 0xc7, 0x9e, 0x79, 0xb6, 0x8d, 0x67, 0xab, 0x7f, 0x5c, 0x7c, 0x59, 0x3b, 0x7f, 0x5c, 0x3e, 0x76, 0x54, 0x39, 0x68, 0x46, 0x2b, 0x77, 0x55, 0x3b, 0x6e, 0x4c, 0x32, 0x62, 0x43, 0x27, 0x53, 0x33, 0x18, 0x62, 0x42, 0x28, 0x8f, 0x77, 0x64, 0x90, 0x7b, 0x67, 0xc6, 0xba, 0xaf, 0xd6, 0xc5, 0xbd, 0xcd, 0xbc, 0xb4, 0xde, 0xcf, 0xc6, 0xdc, 0xce, 0xc5, 0xdd, 0xce, 0xc5, 0xd9, 0xcf, 0xc4, 0xdd, 0xd5, 0xcb, 0xd9, 0xcc, 0xc3, 0xc6, 0xb5, 0xa8, 0xd4, 0xc2, 0xb4, 0xce, 0xbd, 0xaf, 0xd5, 0xc7, 0xbc, 0xd8, 0xcd, 0xc5, 0xda, 0xca, 0xc1, 0xdd, 0xd1, 0xc7, 0xd8, 0xc7, 0xbf, 0xd3, 0xc2, 0xba, 0xdc, 0xd4, 0xca, 0xe0, 0xd8, 0xcf, 0xd9, 0xcf, 0xc4, 0xdb, 0xd1, 0xc6, 0xc4, 0xb0, 0xa4, 0xc1, 0xb3, 0xa5, 0x8c, 0x72, 0x5d, 0x75, 0x56, 0x45, 0xa3, 0x80, 0x63, 0x8f, 0x6c, 0x4e, 0x9e, 0x77, 0x56, 0xae, 0x85, 0x63, 0xa9, 0x83, 0x60, 0xbc, 0x98, 0x74, 0xd2, 0xab, 0x87, 0xca, 0xa0, 0x7a, 0xc5, 0x9b, 0x76, 0xd3, 0xa9, 0x83, 0xde, 0xb4, 0x8e, 0xe6, 0xbc, 0x98, 0xd8, 0xaf, 0x85, 0xd6, 0xad, 0x85, 0xd1, 0xa2, 0x7c, 0xdc, 0xb0, 0x89, 0xda, 0xae, 0x87, 0xd7, 0xaa, 0x7f, 0xce, 0xa1, 0x76, 0xd7, 0xaa, 0x7d, 0xc5, 0x98, 0x6b, 0xcf, 0xa2, 0x77, 0xd7, 0xaa, 0x7f, 0xe3, 0xb8, 0x8c, 0xd7, 0xac, 0x81, 0xc7, 0x9c, 0x72, 0xbd, 0x92, 0x68, 0xcb, 0x9e, 0x75, 0xb5, 0x8c, 0x66, 0xa0, 0x7c, 0x5a, 0x8b, 0x6b, 0x4d, 0x65, 0x52, 0x45, 0x63, 0x53, 0x40, 0x61, 0x45, 0x39, 0x49, 0x3e, 0x36, 0x82, 0x7c, 0x77, 0xc4, 0xc1, 0xbb, 0xf3, 0xf3, 0xf1, 0xf2, 0xf2, 0xf0, 0xee, 0xee, 0xec, 0xfc, 0xfc, 0xfa, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xf7, 0xf7, 0xf7, 0xde, 0xde, 0xdc, 0xda, 0xda, 0xd8, 0xd6, 0xd5, 0xd1, 0xc8, 0xc6, 0xc3, 0x83, 0x79, 0x73, 0x6c, 0x5f, 0x55, 0x4f, 0x3d, 0x31, 0x3e, 0x2c, 0x20, 0x2c, 0x1b, 0x13, 0x26, 0x15, 0x0d, 0x1e, 0x11, 0x09, 0x2f, 0x1b, 0x10, 0x3c, 0x28, 0x1c, 0x2e, 0x1c, 0x10, 0x1e, 0x0f, 0x09, 0x1c, 0x0e, 0x03, 0x12, 0x0a, 0x03, 0x1b, 0x0e, 0x08, 0x17, 0x07, 0x01, 0x16, 0x09, 0x00, 0x25, 0x12, 0x09, 0x2d, 0x1b, 0x0d, 0x5a, 0x3f, 0x26, 0x93, 0x6d, 0x49, 0x9c, 0x73, 0x4b, 0xb1, 0x87, 0x62, 0xac, 0x82, 0x5c, 0xb4, 0x8b, 0x65, 0xbe, 0x94, 0x6e, 0xb2, 0x88, 0x62, 0xc7, 0x9d, 0x77, 0xc2, 0x98, 0x73, 0xcb, 0xa1, 0x7b, 0xbc, 0x91, 0x6d, 0xb1, 0x87, 0x63, 0xd5, 0xaf, 0x88, 0xb3, 0x89, 0x63, 0xb5, 0x8b, 0x66, 0xb7, 0x8f, 0x6b, 0xc2, 0x99, 0x75, 0xb0, 0x86, 0x62, 0xa0, 0x77, 0x55, 0x83, 0x60, 0x42, 0x86, 0x63, 0x45, 0x7c, 0x5a, 0x3d, 0x73, 0x52, 0x35, 0x6b, 0x4a, 0x2f, 0x70, 0x4f, 0x34, 0x5f, 0x3d, 0x23, 0x58, 0x37, 0x1c, 0x69, 0x4a, 0x31, 0x6f, 0x53, 0x3f, 0x99, 0x88, 0x7a, 0xad, 0x9c, 0x8f, 0xa0, 0x8d, 0x80, 0xc5, 0xb7, 0xac, 0xd6, 0xc7, 0xbe, 0xda, 0xcc, 0xc3, 0xda, 0xce, 0xc4, 0xd7, 0xcd, 0xc2, 0xe1, 0xd5, 0xcc, 0xd0, 0xc0, 0xb8, 0xc8, 0xb4, 0xa7, 0xd3, 0xc2, 0xb8, 0xd3, 0xbd, 0xb3, 0xd2, 0xc1, 0xb4, 0xcf, 0xc2, 0xb8, 0xce, 0xc3, 0xb9, 0xd8, 0xcd, 0xc3, 0xc9, 0xb7, 0xaa, 0xce, 0xbf, 0xb4, 0xcf, 0xc3, 0xb7, 0xd7, 0xd0, 0xc6, 0xd2, 0xc4, 0xbb, 0xae, 0x99, 0x88, 0xba, 0xa1, 0x8f, 0xb7, 0xa0, 0x89, 0x85, 0x6b, 0x5c, 0x5d, 0x43, 0x2f, 0x91, 0x72, 0x58, 0xa2, 0x7e, 0x61, 0x9e, 0x76, 0x58, 0xb2, 0x89, 0x68, 0xb2, 0x8c, 0x6a, 0xb3, 0x8e, 0x6f, 0xd1, 0xac, 0x8a, 0xc4, 0x9d, 0x78, 0xba, 0x90, 0x6c, 0xd4, 0xa9, 0x84, 0xdf, 0xb9, 0x92, 0xe3, 0xbb, 0x96, 0xd5, 0xad, 0x88, 0xd5, 0xad, 0x89, 0xdb, 0xae, 0x86, 0xda, 0xae, 0x87, 0xdb, 0xb0, 0x88, 0xde, 0xb4, 0x8e, 0xcc, 0x9e, 0x75, 0xd9, 0xad, 0x82, 0xc4, 0x94, 0x67, 0xbf, 0x94, 0x68, 0xdd, 0xb3, 0x87, 0xd7, 0xac, 0x80, 0xd3, 0xa8, 0x7d, 0xc4, 0x99, 0x6e, 0xc1, 0x96, 0x6b, 0xc0, 0x95, 0x6c, 0xb2, 0x8a, 0x65, 0x92, 0x70, 0x53, 0x84, 0x66, 0x48, 0x5c, 0x48, 0x39, 0x66, 0x5c, 0x50, 0x63, 0x52, 0x48, 0x4e, 0x44, 0x3b, 0x69, 0x5f, 0x57, 0xce, 0xca, 0xc5, 0xea, 0xea, 0xe8, 0xf9, 0xfa, 0xf8, 0xf2, 0xf3, 0xf1, 0xf8, 0xf8, 0xf8, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xfa, 0xfa, 0xed, 0xed, 0xed, 0xef, 0xef, 0xed, 0xe0, 0xe0, 0xde, 0xd5, 0xd3, 0xd0, 0xaf, 0xae, 0xaa, 0x85, 0x7c, 0x75, 0x6f, 0x62, 0x58, 0x4f, 0x3d, 0x31, 0x44, 0x32, 0x26, 0x2f, 0x1f, 0x16, 0x2d, 0x1c, 0x14, 0x20, 0x13, 0x0b, 0x3a, 0x28, 0x1c, 0x21, 0x13, 0x0c, 0x1b, 0x10, 0x0a, 0x15, 0x0b, 0x04, 0x24, 0x15, 0x0b, 0x12, 0x0b, 0x08, 0x12, 0x07, 0x01, 0x18, 0x0e, 0x07, 0x16, 0x07, 0x01, 0x10, 0x06, 0x00, 0x46, 0x32, 0x23, 0x64, 0x49, 0x2d, 0x7f, 0x5d, 0x3c, 0x97, 0x70, 0x4d, 0xa3, 0x79, 0x53, 0xaa, 0x80, 0x5a, 0xb8, 0x8e, 0x68, 0xb5, 0x8b, 0x65, 0xb4, 0x8a, 0x64, 0xc8, 0x9f, 0x79, 0xcb, 0xa1, 0x7b, 0xbe, 0x94, 0x6e, 0xb7, 0x8d, 0x69, 0xb3, 0x89, 0x65, 0xc8, 0xa1, 0x7b, 0xbc, 0x92, 0x6c, 0xa8, 0x7d, 0x59, 0xae, 0x86, 0x62, 0xaf, 0x87, 0x62, 0xac, 0x82, 0x5e, 0x99, 0x70, 0x4d, 0x84, 0x60, 0x42, 0x86, 0x62, 0x44, 0x79, 0x58, 0x3b, 0x80, 0x5f, 0x42, 0x76, 0x55, 0x3a, 0x68, 0x46, 0x2b, 0x62, 0x40, 0x26, 0x62, 0x40, 0x26, 0x60, 0x41, 0x28, 0x6e, 0x53, 0x3f, 0x83, 0x6d, 0x5b, 0x9c, 0x86, 0x75, 0x8c, 0x7a, 0x6c, 0xc3, 0xb5, 0xa9, 0xd2, 0xc4, 0xba, 0xce, 0xbf, 0xb6, 0xcf, 0xc3, 0xb9, 0xcf, 0xc5, 0xba, 0xd9, 0xcd, 0xc4, 0xd0, 0xbf, 0xb7, 0xc1, 0xad, 0x9f, 0xcb, 0xbc, 0xb2, 0xcf, 0xb9, 0xb0, 0xc5, 0xb3, 0xa6, 0xd5, 0xc8, 0xbf, 0xc7, 0xb8, 0xaf, 0xd0, 0xc0, 0xb7, 0xb1, 0xa0, 0x93, 0xc1, 0xb3, 0xa7, 0xb4, 0xa4, 0x94, 0xc7, 0xbb, 0xaf, 0xce, 0xc0, 0xb7, 0x9d, 0x86, 0x75, 0x8d, 0x71, 0x5a, 0xac, 0x91, 0x76, 0x82, 0x69, 0x54, 0x61, 0x48, 0x35, 0x81, 0x64, 0x4e, 0x9b, 0x7a, 0x60, 0xaa, 0x82, 0x65, 0xb2, 0x8a, 0x68, 0xbd, 0x97, 0x75, 0xaf, 0x8a, 0x6a, 0xc1, 0x9c, 0x7a, 0xcf, 0xa8, 0x83, 0xbb, 0x90, 0x6c, 0xcb, 0xa0, 0x7b, 0xe0, 0xba, 0x93, 0xe8, 0xc0, 0x9b, 0xe1, 0xb9, 0x94, 0xdc, 0xb5, 0x91, 0xd8, 0xab, 0x83, 0xd4, 0xa9, 0x82, 0xde, 0xb2, 0x8b, 0xe3, 0xb9, 0x93, 0xd1, 0xa3, 0x79, 0xd8, 0xac, 0x81, 0xcd, 0x9e, 0x70, 0xc4, 0x99, 0x6d, 0xdb, 0xb0, 0x84, 0xd4, 0xa9, 0x7e, 0xd9, 0xae, 0x82, 0xbb, 0x8f, 0x68, 0xb9, 0x8d, 0x67, 0xb9, 0x8f, 0x6a, 0x9e, 0x7a, 0x58, 0x8f, 0x6f, 0x50, 0x80, 0x62, 0x48, 0x4c, 0x3e, 0x2e, 0x79, 0x72, 0x69, 0x64, 0x56, 0x50, 0x57, 0x4d, 0x44, 0x72, 0x67, 0x5e, 0xa4, 0xa0, 0x9b, 0xea, 0xea, 0xe8, 0xf8, 0xf8, 0xf6, 0xf7, 0xf7, 0xf5, 0xfa, 0xfa, 0xfa, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xf8, 0xf0, 0xf0, 0xee, 0xf4, 0xf4, 0xf2, 0xd1, 0xd2, 0xcf, 0xce, 0xcd, 0xca, 0x9d, 0x9c, 0x98, 0x8b, 0x83, 0x79, 0x6a, 0x59, 0x4e, 0x55, 0x40, 0x31, 0x49, 0x33, 0x25, 0x32, 0x20, 0x13, 0x26, 0x17, 0x0f, 0x1b, 0x0b, 0x03, 0x3a, 0x29, 0x21, 0x26, 0x18, 0x12, 0x11, 0x09, 0x05, 0x12, 0x0b, 0x07, 0x0b, 0x08, 0x02, 0x0f, 0x07, 0x03, 0x12, 0x07, 0x02, 0x10, 0x05, 0x00, 0x24, 0x17, 0x12, 0x14, 0x0b, 0x05, 0x25, 0x16, 0x07, 0x5c, 0x40, 0x22, 0x73, 0x50, 0x32, 0x93, 0x6d, 0x4b, 0x9e, 0x77, 0x58, 0xab, 0x82, 0x5a, 0xb3, 0x8b, 0x66, 0xa6, 0x7e, 0x59, 0xae, 0x86, 0x61, 0xbe, 0x96, 0x72, 0xc1, 0x97, 0x73, 0xc0, 0x96, 0x72, 0xac, 0x82, 0x5e, 0xc0, 0x96, 0x73, 0xbf, 0x94, 0x6e, 0xc1, 0x98, 0x74, 0xa4, 0x7b, 0x5a, 0xab, 0x83, 0x5f, 0xb7, 0x8e, 0x68, 0xb0, 0x87, 0x64, 0x85, 0x5e, 0x3e, 0x91, 0x6b, 0x4c, 0x86, 0x63, 0x47, 0x69, 0x48, 0x2b, 0x89, 0x67, 0x4b, 0x80, 0x5e, 0x41, 0x6c, 0x4a, 0x31, 0x5a, 0x38, 0x1e, 0x66, 0x44, 0x2a, 0x61, 0x42, 0x2a, 0x61, 0x46, 0x32, 0x8d, 0x73, 0x5e, 0x6b, 0x54, 0x42, 0x86, 0x76, 0x6a, 0xb2, 0xa4, 0x99, 0xbe, 0xb0, 0xa4, 0xc0, 0xb1, 0xa6, 0xb9, 0xac, 0x9f, 0xc9, 0xbd, 0xaf, 0xc4, 0xb7, 0xab, 0xc3, 0xb2, 0xa5, 0xb0, 0x9c, 0x8d, 0xc2, 0xb2, 0xa6, 0xc0, 0xaf, 0xa2, 0xb6, 0xa6, 0x99, 0xbf, 0xaf, 0xa2, 0xbf, 0xb1, 0xa6, 0xc2, 0xb4, 0xa8, 0xa2, 0x90, 0x81, 0xb2, 0xa4, 0x99, 0x89, 0x76, 0x64, 0x91, 0x80, 0x6f, 0xab, 0x9a, 0x8d, 0xb2, 0x9b, 0x8a, 0x8d, 0x6f, 0x5a, 0xa5, 0x84, 0x68, 0x76, 0x5b, 0x46, 0x69, 0x4e, 0x3b, 0x6f, 0x55, 0x40, 0x7c, 0x5e, 0x47, 0xa8, 0x85, 0x69, 0xb8, 0x91, 0x6b, 0xb8, 0x8f, 0x6c, 0xbc, 0x93, 0x71, 0xae, 0x86, 0x64, 0xd3, 0xab, 0x87, 0xcf, 0xa8, 0x80, 0xc2, 0x97, 0x74, 0xd8, 0xae, 0x8a, 0xdf, 0xb7, 0x92, 0xe8, 0xc4, 0xa1, 0xe0, 0xb8, 0x91, 0xde, 0xb4, 0x8e, 0xd6, 0xad, 0x85, 0xe3, 0xb9, 0x91, 0xd7, 0xae, 0x86, 0xd3, 0xa9, 0x81, 0xda, 0xb0, 0x88, 0xd8, 0xad, 0x84, 0xc7, 0x9c, 0x74, 0xc7, 0x9b, 0x74, 0xdb, 0xb0, 0x85, 0xd2, 0xa7, 0x7b, 0xc4, 0x9e, 0x72, 0x9c, 0x76, 0x54, 0xb4, 0x8f, 0x69, 0x95, 0x74, 0x55, 0x91, 0x72, 0x51, 0x76, 0x59, 0x40, 0x42, 0x34, 0x2a, 0x79, 0x72, 0x6a, 0x7c, 0x72, 0x65, 0x62, 0x59, 0x50, 0x7c, 0x6f, 0x68, 0x93, 0x8f, 0x8c, 0xe6, 0xe6, 0xe2, 0xf6, 0xf6, 0xf4, 0xfc, 0xfc, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf8, 0xf8, 0xf6, 0xfa, 0xfa, 0xf8, 0xeb, 0xeb, 0xe9, 0xd8, 0xd8, 0xd6, 0xb9, 0xb8, 0xb4, 0xa7, 0xa6, 0xa2, 0x7d, 0x75, 0x6b, 0x60, 0x4e, 0x43, 0x56, 0x44, 0x39, 0x49, 0x37, 0x2c, 0x3a, 0x26, 0x1e, 0x28, 0x19, 0x0f, 0x1f, 0x0f, 0x06, 0x38, 0x28, 0x1f, 0x1d, 0x0f, 0x07, 0x16, 0x0d, 0x0a, 0x10, 0x08, 0x05, 0x07, 0x04, 0x00, 0x0e, 0x07, 0x04, 0x05, 0x02, 0x02, 0x07, 0x03, 0x03, 0x12, 0x07, 0x02, 0x1a, 0x0c, 0x04, 0x25, 0x14, 0x07, 0x5d, 0x45, 0x29, 0x73, 0x53, 0x38, 0x86, 0x63, 0x43, 0x96, 0x70, 0x53, 0xad, 0x83, 0x5c, 0x9f, 0x77, 0x52, 0xa5, 0x7d, 0x59, 0xbb, 0x93, 0x6f, 0xbc, 0x94, 0x70, 0xb9, 0x8f, 0x6b, 0xc9, 0x9f, 0x7b, 0xaf, 0x85, 0x61, 0xbf, 0x95, 0x71, 0xc2, 0x95, 0x6f, 0xbb, 0x92, 0x6f, 0x9a, 0x72, 0x51, 0xa6, 0x7e, 0x5a, 0xb9, 0x91, 0x6a, 0xa5, 0x7c, 0x5a, 0x8f, 0x69, 0x4a, 0x93, 0x6c, 0x4e, 0x78, 0x54, 0x3a, 0x68, 0x47, 0x2a, 0x87, 0x66, 0x49, 0x79, 0x57, 0x3a, 0x6c, 0x4b, 0x31, 0x63, 0x42, 0x27, 0x6b, 0x49, 0x2f, 0x68, 0x49, 0x30, 0x55, 0x3a, 0x26, 0x6a, 0x4e, 0x3a, 0x6f, 0x59, 0x47, 0x70, 0x5e, 0x51, 0x70, 0x5e, 0x50, 0x77, 0x65, 0x57, 0xa1, 0x90, 0x82, 0xaa, 0x9a, 0x8d, 0xb1, 0xa2, 0x95, 0xa6, 0x98, 0x8c, 0xb3, 0xa0, 0x92, 0x9a, 0x85, 0x74, 0xb2, 0x9d, 0x8c, 0xb2, 0x9d, 0x8d, 0xaf, 0x9a, 0x8a, 0xb0, 0x9b, 0x8b, 0xad, 0x9c, 0x8e, 0xa5, 0x94, 0x86, 0x77, 0x62, 0x51, 0x96, 0x84, 0x76, 0x69, 0x52, 0x42, 0x73, 0x5d, 0x4c, 0x78, 0x63, 0x4e, 0xa4, 0x89, 0x73, 0x90, 0x72, 0x5e, 0x9f, 0x7f, 0x62, 0x69, 0x4f, 0x3a, 0x61, 0x46, 0x31, 0x54, 0x3a, 0x26, 0x7c, 0x5e, 0x47, 0x79, 0x59, 0x3f, 0xbb, 0x99, 0x74, 0xb4, 0x8c, 0x6a, 0xc9, 0xa0, 0x7e, 0xa8, 0x7f, 0x5e, 0xb2, 0x8a, 0x67, 0xcd, 0xa5, 0x7d, 0xcb, 0xa0, 0x7d, 0xe2, 0xb8, 0x94, 0xe4, 0xba, 0x96, 0xe9, 0xc4, 0xa3, 0xcf, 0xa4, 0x7f, 0xeb, 0xc3, 0x9c, 0xd6, 0xac, 0x84, 0xe1, 0xb8, 0x90, 0xde, 0xb4, 0x8c, 0xd9, 0xb0, 0x88, 0xd3, 0xaa, 0x82, 0xd2, 0xa9, 0x81, 0xcc, 0xa1, 0x79, 0xc2, 0x97, 0x6f, 0xc8, 0x9d, 0x72, 0xc1, 0x96, 0x6a, 0xb1, 0x8c, 0x60, 0x9e, 0x7a, 0x58, 0xb4, 0x91, 0x6b, 0x7c, 0x5b, 0x3c, 0x8a, 0x6c, 0x4d, 0x78, 0x5c, 0x43, 0x3a, 0x26, 0x1b, 0x67, 0x5b, 0x53, 0x9f, 0x98, 0x8e, 0x8c, 0x84, 0x7a, 0x72, 0x65, 0x5d, 0xa5, 0xa1, 0x9f, 0xc2, 0xc2, 0xbe, 0xf9, 0xfa, 0xf7, 0xfa, 0xfa, 0xf8, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfb, 0xf2, 0xf2, 0xf0, 0xd7, 0xd6, 0xd3, 0xce, 0xce, 0xcb, 0xb5, 0xb4, 0xb0, 0xa0, 0x9b, 0x99, 0x77, 0x6e, 0x65, 0x63, 0x51, 0x46, 0x56, 0x46, 0x3b, 0x43, 0x33, 0x2b, 0x2a, 0x17, 0x12, 0x2e, 0x20, 0x16, 0x34, 0x22, 0x19, 0x26, 0x17, 0x0e, 0x16, 0x0c, 0x06, 0x0c, 0x05, 0x02, 0x0f, 0x06, 0x03, 0x14, 0x0a, 0x04, 0x16, 0x09, 0x03, 0x0e, 0x05, 0x00, 0x0d, 0x04, 0x01, 0x14, 0x0b, 0x08, 0x22, 0x12, 0x04, 0x22, 0x11, 0x04, 0x43, 0x2d, 0x16, 0x65, 0x47, 0x2c, 0x6e, 0x4f, 0x35, 0x8d, 0x69, 0x4b, 0x9f, 0x77, 0x52, 0x9b, 0x76, 0x52, 0x9e, 0x77, 0x52, 0xbc, 0x94, 0x6f, 0xbd, 0x95, 0x70, 0xaf, 0x85, 0x61, 0xc4, 0x9a, 0x76, 0xb6, 0x8c, 0x66, 0xb8, 0x8e, 0x6a, 0xbf, 0x93, 0x6c, 0xaa, 0x81, 0x5e, 0x9a, 0x71, 0x52, 0xaf, 0x85, 0x62, 0xb1, 0x88, 0x5f, 0xa5, 0x7c, 0x59, 0x93, 0x6d, 0x4f, 0x9b, 0x74, 0x55, 0x8a, 0x67, 0x4b, 0x84, 0x61, 0x45, 0x92, 0x6e, 0x50, 0x7a, 0x59, 0x3c, 0x68, 0x47, 0x2c, 0x6b, 0x4a, 0x2d, 0x75, 0x54, 0x38, 0x5f, 0x41, 0x29, 0x56, 0x3a, 0x24, 0x6f, 0x53, 0x40, 0x78, 0x5f, 0x4d, 0x59, 0x43, 0x31, 0x57, 0x42, 0x31, 0x65, 0x51, 0x41, 0x96, 0x82, 0x72, 0x9b, 0x86, 0x79, 0x92, 0x7f, 0x72, 0x95, 0x85, 0x77, 0x95, 0x83, 0x74, 0x86, 0x71, 0x61, 0x90, 0x7a, 0x68, 0x89, 0x73, 0x60, 0x8f, 0x7a, 0x68, 0x92, 0x7a, 0x6b, 0xab, 0x95, 0x83, 0x7f, 0x69, 0x57, 0x64, 0x4c, 0x39, 0x84, 0x70, 0x5f, 0x66, 0x4e, 0x3d, 0x67, 0x4c, 0x3a, 0x7c, 0x63, 0x4a, 0x84, 0x66, 0x49, 0x7f, 0x60, 0x49, 0x9e, 0x7e, 0x62, 0x78, 0x5e, 0x49, 0x7a, 0x5d, 0x49, 0x6b, 0x4e, 0x37, 0x81, 0x62, 0x4a, 0x7e, 0x5e, 0x44, 0x99, 0x78, 0x5a, 0xc0, 0x9c, 0x7b, 0xbd, 0x97, 0x75, 0xc5, 0x9c, 0x7a, 0xad, 0x84, 0x61, 0xbe, 0x97, 0x70, 0xd7, 0xae, 0x8a, 0xd7, 0xae, 0x8a, 0xd7, 0xad, 0x87, 0xe1, 0xbb, 0x99, 0xdb, 0xb1, 0x8c, 0xdc, 0xb5, 0x8f, 0xdb, 0xb2, 0x8a, 0xe2, 0xb8, 0x90, 0xd8, 0xb0, 0x88, 0xcf, 0xa5, 0x7c, 0xd3, 0xaa, 0x82, 0xc5, 0x9b, 0x73, 0xc3, 0x99, 0x6f, 0xa9, 0x7e, 0x56, 0xc6, 0x9c, 0x72, 0xc9, 0x9f, 0x74, 0xb7, 0x91, 0x67, 0x9c, 0x7a, 0x58, 0xa9, 0x87, 0x65, 0x9a, 0x78, 0x57, 0x7d, 0x63, 0x48, 0x63, 0x4d, 0x36, 0x49, 0x32, 0x23, 0x5c, 0x4a, 0x3f, 0xa2, 0x9c, 0x96, 0x9a, 0x95, 0x8c, 0x7b, 0x6f, 0x68, 0xac, 0xa8, 0xa3, 0xbf, 0xbf, 0xbb, 0xf1, 0xf2, 0xf0, 0xfa, 0xfb, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf8, 0xf8, 0xf6, 0xe9, 0xea, 0xe7, 0xe1, 0xdf, 0xdc, 0xc8, 0xc7, 0xc3, 0xc9, 0xc8, 0xc4, 0x95, 0x8d, 0x8b, 0x68, 0x5e, 0x55, 0x5e, 0x4f, 0x43, 0x59, 0x47, 0x3d, 0x3e, 0x2b, 0x24, 0x30, 0x1f, 0x14, 0x31, 0x20, 0x15, 0x2d, 0x1d, 0x13, 0x1d, 0x11, 0x0a, 0x0c, 0x05, 0x03, 0x09, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x19, 0x0d, 0x06, 0x19, 0x0c, 0x02, 0x13, 0x0a, 0x02, 0x0d, 0x04, 0x01, 0x0f, 0x08, 0x06, 0x3a, 0x27, 0x1a, 0x1e, 0x11, 0x09, 0x4d, 0x34, 0x1c, 0x63, 0x45, 0x2b, 0x52, 0x39, 0x22, 0x88, 0x69, 0x49, 0x9d, 0x75, 0x54, 0x8d, 0x6a, 0x49, 0xab, 0x84, 0x61, 0xb8, 0x90, 0x69, 0xc1, 0x9a, 0x73, 0xbb, 0x91, 0x6f, 0xb8, 0x8f, 0x67, 0xbf, 0x96, 0x6c, 0xb6, 0x8c, 0x68, 0xbd, 0x90, 0x69, 0xa8, 0x7f, 0x5c, 0xa4, 0x7b, 0x5b, 0xae, 0x84, 0x60, 0xb5, 0x8c, 0x65, 0x95, 0x6b, 0x49, 0x99, 0x73, 0x56, 0xaa, 0x84, 0x63, 0x8e, 0x6b, 0x4d, 0x89, 0x65, 0x4a, 0xa2, 0x7a, 0x59, 0x76, 0x54, 0x37, 0x6d, 0x4b, 0x2f, 0x79, 0x58, 0x3a, 0x7c, 0x5b, 0x3e, 0x5d, 0x41, 0x2a, 0x4a, 0x2e, 0x18, 0x72, 0x56, 0x40, 0x51, 0x34, 0x1f, 0x42, 0x29, 0x16, 0x36, 0x21, 0x10, 0x56, 0x42, 0x33, 0x7d, 0x6a, 0x5a, 0x74, 0x5f, 0x50, 0x8e, 0x7b, 0x6c, 0x7a, 0x67, 0x57, 0x86, 0x72, 0x63, 0x73, 0x5e, 0x4f, 0x91, 0x79, 0x68, 0x77, 0x60, 0x4a, 0x6f, 0x5b, 0x4a, 0x8e, 0x74, 0x63, 0x77, 0x5e, 0x4a, 0x82, 0x68, 0x54, 0x4f, 0x38, 0x24, 0x75, 0x61, 0x4e, 0x68, 0x50, 0x3c, 0x67, 0x4a, 0x32, 0x75, 0x59, 0x40, 0x7b, 0x5b, 0x3f, 0x74, 0x54, 0x39, 0x97, 0x76, 0x5a, 0x91, 0x77, 0x5e, 0x74, 0x56, 0x42, 0x80, 0x5f, 0x44, 0x91, 0x70, 0x55, 0x82, 0x61, 0x46, 0x82, 0x61, 0x47, 0xb0, 0x8e, 0x6e, 0xba, 0x95, 0x75, 0xc5, 0x9d, 0x79, 0xbe, 0x96, 0x71, 0xb6, 0x8e, 0x6a, 0xc8, 0xa0, 0x7c, 0xd6, 0xae, 0x8a, 0xd9, 0xaf, 0x87, 0xe1, 0xbb, 0x98, 0xe8, 0xc0, 0x9b, 0xe1, 0xb9, 0x94, 0xd8, 0xaf, 0x87, 0xdf, 0xb6, 0x8e, 0xde, 0xb7, 0x90, 0xdb, 0xb0, 0x86, 0xd8, 0xaf, 0x87, 0xc2, 0x98, 0x70, 0xc7, 0x9f, 0x73, 0x9a, 0x71, 0x4a, 0xc0, 0x98, 0x72, 0xb8, 0x8f, 0x6a, 0xb9, 0x92, 0x6e, 0x9a, 0x7a, 0x56, 0x93, 0x73, 0x56, 0x9c, 0x79, 0x57, 0x5d, 0x48, 0x33, 0x4c, 0x3a, 0x29, 0x39, 0x26, 0x1a, 0x4f, 0x3d, 0x30, 0x96, 0x90, 0x87, 0xb9, 0xb6, 0xaf, 0xa1, 0x9b, 0x95, 0x92, 0x8f, 0x87, 0xd2, 0xd3, 0xce, 0xe7, 0xe7, 0xe5, 0xfc, 0xfc, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf5, 0xf6, 0xf3, 0xe3, 0xe3, 0xe1, 0xd4, 0xd3, 0xcf, 0xcf, 0xcd, 0xca, 0xb9, 0xb7, 0xb4, 0x7b, 0x73, 0x71, 0x76, 0x6b, 0x62, 0x65, 0x56, 0x4a, 0x4a, 0x37, 0x33, 0x3f, 0x2d, 0x22, 0x42, 0x2c, 0x20, 0x33, 0x1d, 0x10, 0x21, 0x14, 0x0d, 0x0f, 0x07, 0x03, 0x0b, 0x02, 0x01, 0x0e, 0x04, 0x03, 0x13, 0x08, 0x03, 0x20, 0x14, 0x09, 0x1b, 0x0b, 0x00, 0x17, 0x0c, 0x05, 0x05, 0x04, 0x00, 0x0a, 0x03, 0x01, 0x36, 0x1c, 0x11, 0x19, 0x0d, 0x05, 0x4d, 0x35, 0x1d, 0x49, 0x30, 0x18, 0x48, 0x33, 0x1f, 0x85, 0x66, 0x46, 0x95, 0x6e, 0x4c, 0x97, 0x74, 0x53, 0xa4, 0x7d, 0x59, 0xb6, 0x8e, 0x68, 0xc8, 0xa0, 0x7a, 0xb1, 0x86, 0x64, 0xbf, 0x96, 0x6e, 0xb9, 0x90, 0x66, 0xab, 0x81, 0x5c, 0xbe, 0x92, 0x6b, 0x9c, 0x73, 0x51, 0xa8, 0x80, 0x5c, 0xb4, 0x8a, 0x66, 0xa8, 0x7d, 0x5e, 0xa5, 0x7c, 0x5a, 0x9a, 0x75, 0x52, 0xa6, 0x80, 0x5f, 0x88, 0x65, 0x47, 0xa3, 0x7e, 0x63, 0xa7, 0x7e, 0x5e, 0x7b, 0x59, 0x3c, 0x75, 0x53, 0x36, 0x81, 0x60, 0x43, 0x81, 0x5f, 0x43, 0x60, 0x44, 0x2d, 0x47, 0x2b, 0x14, 0x67, 0x4b, 0x30, 0x52, 0x36, 0x1b, 0x45, 0x2d, 0x19, 0x3a, 0x24, 0x14, 0x62, 0x4e, 0x3f, 0x59, 0x46, 0x36, 0x55, 0x44, 0x34, 0x72, 0x5d, 0x4e, 0x6b, 0x56, 0x47, 0x66, 0x52, 0x43, 0x6b, 0x55, 0x45, 0x69, 0x4f, 0x3b, 0x61, 0x46, 0x2e, 0x7d, 0x64, 0x52, 0x78, 0x5a, 0x3e, 0x6c, 0x4e, 0x36, 0x65, 0x47, 0x2f, 0x56, 0x40, 0x2b, 0x65, 0x4f, 0x3d, 0x70, 0x58, 0x3f, 0x67, 0x4a, 0x2f, 0x64, 0x48, 0x2f, 0x87, 0x66, 0x4a, 0x83, 0x62, 0x48, 0x94, 0x74, 0x57, 0xa8, 0x89, 0x66, 0x61, 0x45, 0x2e, 0x84, 0x64, 0x49, 0x95, 0x73, 0x58, 0x7f, 0x5d, 0x43, 0x77, 0x55, 0x3b, 0x9f, 0x7d, 0x5d, 0xae, 0x88, 0x68, 0xc3, 0x9b, 0x78, 0xb5, 0x8d, 0x69, 0xb9, 0x91, 0x6c, 0xa0, 0x78, 0x54, 0xcf, 0xa7, 0x83, 0xd6, 0xad, 0x85, 0xda, 0xb3, 0x90, 0xe5, 0xbd, 0x99, 0xe1, 0xb9, 0x95, 0xda, 0xb1, 0x89, 0xd8, 0xaf, 0x87, 0xe5, 0xbf, 0x97, 0xd9, 0xae, 0x84, 0xdd, 0xb3, 0x8b, 0xca, 0xa1, 0x79, 0xbb, 0x98, 0x6e, 0xa8, 0x84, 0x60, 0xb8, 0x93, 0x72, 0xb0, 0x8c, 0x6a, 0xae, 0x89, 0x66, 0x98, 0x79, 0x54, 0x88, 0x6b, 0x4b, 0x8f, 0x71, 0x52, 0x3f, 0x2b, 0x1f, 0x48, 0x36, 0x2a, 0x50, 0x3d, 0x35, 0x42, 0x32, 0x26, 0x56, 0x49, 0x3b, 0xb9, 0xb1, 0xac, 0xab, 0xac, 0xa4, 0xa2, 0x9e, 0x96, 0xd2, 0xd3, 0xce, 0xea, 0xea, 0xe8, 0xfb, 0xfb, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf3, 0xf3, 0xf1, 0xe4, 0xe4, 0xe2, 0xcc, 0xca, 0xc7, 0xb8, 0xb6, 0xb3, 0xa2, 0x9e, 0x98, 0x7a, 0x70, 0x67, 0x8a, 0x84, 0x7f, 0x59, 0x4d, 0x44, 0x3e, 0x2e, 0x26, 0x35, 0x24, 0x1c, 0x3c, 0x28, 0x1a, 0x21, 0x12, 0x07, 0x22, 0x14, 0x09, 0x0b, 0x06, 0x03, 0x14, 0x0a, 0x06, 0x09, 0x02, 0x01, 0x0d, 0x06, 0x02, 0x17, 0x0f, 0x05, 0x24, 0x11, 0x09, 0x18, 0x0e, 0x06, 0x04, 0x01, 0x03, 0x17, 0x0e, 0x07, 0x2b, 0x18, 0x0b, 0x17, 0x08, 0x00, 0x59, 0x3e, 0x26, 0x3b, 0x28, 0x16, 0x47, 0x34, 0x22, 0x81, 0x61, 0x40, 0x89, 0x67, 0x48, 0x83, 0x64, 0x47, 0x92, 0x6f, 0x4e, 0xb3, 0x8b, 0x66, 0xc2, 0x9a, 0x76, 0xb5, 0x8b, 0x69, 0xc1, 0x98, 0x70, 0xc6, 0x9c, 0x77, 0xaf, 0x85, 0x61, 0xb2, 0x89, 0x65, 0xa2, 0x7a, 0x56, 0xa1, 0x79, 0x56, 0xad, 0x85, 0x62, 0x9b, 0x72, 0x50, 0xa5, 0x7d, 0x5a, 0x9c, 0x74, 0x52, 0xb7, 0x90, 0x6f, 0x8c, 0x68, 0x4a, 0x9d, 0x78, 0x59, 0x9b, 0x76, 0x57, 0x7a, 0x5b, 0x3f, 0x88, 0x64, 0x46, 0x8d, 0x6a, 0x4c, 0x86, 0x63, 0x45, 0x5a, 0x3e, 0x25, 0x4b, 0x2f, 0x16, 0x69, 0x4a, 0x32, 0x53, 0x37, 0x1e, 0x42, 0x29, 0x16, 0x35, 0x1f, 0x0f, 0x59, 0x47, 0x38, 0x4a, 0x35, 0x25, 0x43, 0x31, 0x22, 0x45, 0x31, 0x21, 0x4e, 0x36, 0x26, 0x60, 0x47, 0x35, 0x5b, 0x44, 0x2f, 0x52, 0x38, 0x24, 0x66, 0x48, 0x31, 0x6a, 0x4f, 0x3a, 0x6f, 0x55, 0x39, 0x6f, 0x53, 0x3a, 0x62, 0x46, 0x2e, 0x6b, 0x52, 0x41, 0x6d, 0x55, 0x41, 0x65, 0x4b, 0x34, 0x73, 0x54, 0x39, 0x70, 0x52, 0x37, 0x89, 0x66, 0x48, 0x8b, 0x67, 0x4d, 0x9f, 0x7d, 0x5d, 0xa3, 0x84, 0x65, 0x92, 0x73, 0x5a, 0x7e, 0x5e, 0x45, 0x9e, 0x7a, 0x5f, 0x95, 0x70, 0x54, 0x89, 0x64, 0x49, 0x92, 0x6e, 0x51, 0xa0, 0x7d, 0x5e, 0xbd, 0x97, 0x76, 0xbe, 0x94, 0x70, 0xb7, 0x8d, 0x69, 0xa4, 0x7a, 0x56, 0xcc, 0xa1, 0x81, 0xcd, 0xa3, 0x7b, 0xda, 0xb1, 0x89, 0xdf, 0xb9, 0x93, 0xdc, 0xb4, 0x8d, 0xe1, 0xb6, 0x8b, 0xd5, 0xaa, 0x7f, 0xe3, 0xbf, 0x9a, 0xda, 0xae, 0x81, 0xd2, 0xa9, 0x7e, 0xcc, 0xa7, 0x7f, 0xae, 0x86, 0x5f, 0x9e, 0x79, 0x58, 0xb1, 0x8e, 0x6e, 0xaa, 0x87, 0x67, 0x9e, 0x7d, 0x5d, 0xa1, 0x82, 0x62, 0x95, 0x74, 0x54, 0x8a, 0x6e, 0x4e, 0x4f, 0x3a, 0x2a, 0x55, 0x43, 0x37, 0x3f, 0x32, 0x2a, 0x56, 0x45, 0x3e, 0x6c, 0x5b, 0x54, 0x7e, 0x77, 0x6e, 0xc5, 0xc2, 0xbc, 0xbb, 0xba, 0xb6, 0xc5, 0xc3, 0xc0, 0xf3, 0xf2, 0xf2, 0xfa, 0xfa, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xee, 0xee, 0xec, 0xd2, 0xd2, 0xd0, 0xce, 0xcd, 0xc9, 0xbd, 0xbb, 0xb8, 0x8c, 0x88, 0x82, 0x95, 0x8c, 0x82, 0x76, 0x6c, 0x64, 0x4d, 0x3f, 0x34, 0x38, 0x28, 0x1f, 0x2f, 0x1e, 0x16, 0x41, 0x2f, 0x21, 0x27, 0x19, 0x0e, 0x2b, 0x1d, 0x11, 0x0d, 0x07, 0x05, 0x19, 0x0e, 0x0a, 0x0b, 0x04, 0x03, 0x06, 0x02, 0x01, 0x24, 0x18, 0x0b, 0x1d, 0x0e, 0x09, 0x1d, 0x11, 0x07, 0x18, 0x0c, 0x09, 0x13, 0x07, 0x03, 0x19, 0x0c, 0x06, 0x18, 0x0a, 0x01, 0x4e, 0x33, 0x1b, 0x40, 0x2d, 0x1c, 0x31, 0x1e, 0x0d, 0x78, 0x5c, 0x40, 0x76, 0x59, 0x3d, 0x82, 0x64, 0x47, 0x8a, 0x68, 0x47, 0xac, 0x84, 0x60, 0xb9, 0x91, 0x6c, 0xb1, 0x87, 0x65, 0xb8, 0x8e, 0x66, 0xbf, 0x95, 0x71, 0xac, 0x82, 0x5e, 0xaa, 0x81, 0x5d, 0xab, 0x83, 0x5e, 0xa7, 0x7f, 0x5c, 0xac, 0x84, 0x61, 0x96, 0x6e, 0x4b, 0xab, 0x83, 0x60, 0xad, 0x85, 0x62, 0xbc, 0x96, 0x75, 0x9b, 0x77, 0x59, 0x96, 0x71, 0x51, 0x9e, 0x7a, 0x5a, 0x8c, 0x6c, 0x51, 0x96, 0x73, 0x54, 0x98, 0x75, 0x57, 0x90, 0x6d, 0x4e, 0x63, 0x47, 0x2f, 0x55, 0x39, 0x21, 0x68, 0x48, 0x31, 0x53, 0x37, 0x1f, 0x42, 0x2a, 0x16, 0x3e, 0x28, 0x17, 0x4e, 0x3c, 0x2e, 0x45, 0x30, 0x20, 0x3a, 0x27, 0x18, 0x33, 0x1f, 0x10, 0x47, 0x2f, 0x1c, 0x54, 0x3c, 0x25, 0x55, 0x3c, 0x22, 0x52, 0x37, 0x22, 0x59, 0x3f, 0x2b, 0x61, 0x47, 0x31, 0x6d, 0x54, 0x38, 0x54, 0x38, 0x20, 0x5d, 0x41, 0x28, 0x69, 0x51, 0x39, 0x62, 0x49, 0x33, 0x70, 0x54, 0x3e, 0x7b, 0x5c, 0x41, 0x77, 0x58, 0x3e, 0x8a, 0x67, 0x4a, 0x9c, 0x79, 0x5e, 0xa2, 0x7f, 0x5f, 0xaf, 0x91, 0x6e, 0x98, 0x79, 0x5b, 0x6f, 0x4f, 0x35, 0xa0, 0x7c, 0x61, 0x96, 0x71, 0x51, 0x99, 0x74, 0x54, 0x8c, 0x68, 0x49, 0x9e, 0x7b, 0x5c, 0xb0, 0x8a, 0x6a, 0xc4, 0x9a, 0x76, 0xc5, 0x9b, 0x76, 0xa9, 0x7f, 0x5b, 0xae, 0x83, 0x63, 0xca, 0xa1, 0x79, 0xd1, 0xa8, 0x80, 0xda, 0xb4, 0x8f, 0xe1, 0xb9, 0x91, 0xdb, 0xb0, 0x85, 0xd0, 0xa5, 0x7a, 0xdb, 0xb3, 0x8a, 0xdb, 0xb1, 0x88, 0xcb, 0xa2, 0x76, 0xc0, 0x9b, 0x73, 0x93, 0x6e, 0x4c, 0x86, 0x66, 0x46, 0xa2, 0x84, 0x63, 0xa6, 0x88, 0x66, 0x8f, 0x71, 0x50, 0x9c, 0x7d, 0x5d, 0x9c, 0x7c, 0x57, 0x85, 0x68, 0x4c, 0x5e, 0x48, 0x33, 0x51, 0x3f, 0x33, 0x41, 0x36, 0x2e, 0x51, 0x45, 0x3d, 0x59, 0x4d, 0x45, 0x81, 0x7a, 0x70, 0xae, 0xab, 0xa6, 0xc8, 0xc7, 0xc3, 0xcc, 0xca, 0xc7, 0xf1, 0xf1, 0xf1, 0xf9, 0xf9, 0xf9, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xec, 0xec, 0xea, 0xc9, 0xc9, 0xc7, 0xd1, 0xd0, 0xcc, 0xaf, 0xae, 0xaa, 0xa8, 0xa1, 0x9a, 0x8d, 0x82, 0x7b, 0x5d, 0x4e, 0x47, 0x44, 0x34, 0x2c, 0x34, 0x23, 0x19, 0x34, 0x23, 0x19, 0x48, 0x35, 0x26, 0x32, 0x26, 0x1c, 0x20, 0x13, 0x0f, 0x06, 0x04, 0x00, 0x0f, 0x06, 0x03, 0x10, 0x05, 0x00, 0x14, 0x0c, 0x07, 0x1d, 0x14, 0x04, 0x14, 0x08, 0x01, 0x21, 0x16, 0x0e, 0x14, 0x09, 0x04, 0x0b, 0x04, 0x00, 0x13, 0x0a, 0x04, 0x26, 0x14, 0x06, 0x45, 0x2e, 0x1d, 0x37, 0x28, 0x17, 0x48, 0x32, 0x1f, 0x63, 0x49, 0x32, 0x74, 0x58, 0x3a, 0x66, 0x4a, 0x2e, 0x93, 0x72, 0x50, 0xa5, 0x7f, 0x5e, 0xb5, 0x8f, 0x6e, 0xa6, 0x83, 0x62, 0xad, 0x81, 0x59, 0xb4, 0x8c, 0x67, 0xa8, 0x80, 0x5c, 0xab, 0x83, 0x5d, 0xa9, 0x81, 0x5d, 0xa3, 0x7a, 0x57, 0xaf, 0x85, 0x61, 0xa2, 0x78, 0x54, 0xb6, 0x8e, 0x69, 0xa7, 0x7f, 0x5b, 0xb6, 0x8d, 0x6b, 0xab, 0x84, 0x63, 0xa0, 0x7b, 0x5b, 0x8a, 0x69, 0x4c, 0x9d, 0x7f, 0x5f, 0x9e, 0x7b, 0x5d, 0x9e, 0x7d, 0x60, 0x9a, 0x79, 0x5c, 0x63, 0x45, 0x2b, 0x5a, 0x3b, 0x24, 0x57, 0x3a, 0x22, 0x55, 0x39, 0x21, 0x4d, 0x32, 0x1d, 0x40, 0x29, 0x17, 0x4a, 0x36, 0x27, 0x57, 0x40, 0x2e, 0x33, 0x1c, 0x0c, 0x32, 0x1b, 0x0b, 0x43, 0x2c, 0x19, 0x50, 0x37, 0x1e, 0x5c, 0x3f, 0x26, 0x63, 0x47, 0x31, 0x5f, 0x44, 0x2e, 0x59, 0x3d, 0x24, 0x60, 0x44, 0x2b, 0x56, 0x3a, 0x22, 0x64, 0x48, 0x2f, 0x63, 0x49, 0x2f, 0x5c, 0x41, 0x29, 0x71, 0x55, 0x3b, 0x80, 0x5f, 0x43, 0x6c, 0x4d, 0x33, 0x8f, 0x6c, 0x4e, 0xa2, 0x7f, 0x61, 0x9a, 0x77, 0x58, 0xb8, 0x96, 0x76, 0x8f, 0x72, 0x52, 0x81, 0x5f, 0x44, 0xa8, 0x81, 0x65, 0x9d, 0x76, 0x57, 0xac, 0x85, 0x65, 0x92, 0x6b, 0x4b, 0x92, 0x6b, 0x4a, 0xa5, 0x7e, 0x5c, 0xb9, 0x90, 0x6c, 0xbe, 0x92, 0x6d, 0xc4, 0x98, 0x73, 0xa3, 0x77, 0x53, 0xc3, 0x98, 0x6e, 0xc1, 0x96, 0x6d, 0xd2, 0xab, 0x84, 0xe0, 0xb9, 0x91, 0xda, 0xb0, 0x87, 0xc9, 0xa0, 0x76, 0xd9, 0xaf, 0x82, 0xda, 0xb3, 0x89, 0xcc, 0xa2, 0x79, 0xc4, 0x9e, 0x77, 0x88, 0x67, 0x48, 0x86, 0x66, 0x49, 0x85, 0x6a, 0x4c, 0xa3, 0x83, 0x5e, 0x9c, 0x7d, 0x60, 0x95, 0x76, 0x56, 0x92, 0x72, 0x54, 0x77, 0x5c, 0x44, 0x5c, 0x46, 0x33, 0x54, 0x42, 0x35, 0x43, 0x36, 0x2e, 0x53, 0x49, 0x40, 0x7b, 0x72, 0x6c, 0x7e, 0x75, 0x6c, 0x99, 0x94, 0x8f, 0xca, 0xc6, 0xc4, 0xda, 0xda, 0xd5, 0xeb, 0xeb, 0xe9, 0xfa, 0xfa, 0xf8, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xe2, 0xe2, 0xe0, 0xca, 0xca, 0xc8, 0xc7, 0xc6, 0xc2, 0xb4, 0xb2, 0xaf, 0xa9, 0xa2, 0x9a, 0x6f, 0x63, 0x5d, 0x53, 0x44, 0x3d, 0x3e, 0x30, 0x29, 0x49, 0x39, 0x2c, 0x41, 0x31, 0x24, 0x45, 0x32, 0x23, 0x28, 0x1e, 0x15, 0x1b, 0x12, 0x0d, 0x10, 0x08, 0x03, 0x14, 0x09, 0x04, 0x19, 0x0e, 0x08, 0x0e, 0x05, 0x02, 0x16, 0x0c, 0x02, 0x17, 0x0a, 0x04, 0x18, 0x0d, 0x07, 0x12, 0x08, 0x03, 0x0b, 0x06, 0x01, 0x21, 0x17, 0x0e, 0x2f, 0x1d, 0x0f, 0x2b, 0x1d, 0x12, 0x34, 0x26, 0x15, 0x53, 0x3b, 0x28, 0x4c, 0x36, 0x20, 0x73, 0x5b, 0x3c, 0x5d, 0x40, 0x29, 0x79, 0x58, 0x39, 0x9d, 0x78, 0x58, 0xb2, 0x8d, 0x6d, 0xa2, 0x81, 0x5f, 0xb7, 0x8c, 0x62, 0xaf, 0x87, 0x63, 0xa8, 0x7f, 0x5b, 0xb2, 0x8b, 0x63, 0xa0, 0x77, 0x54, 0xad, 0x83, 0x61, 0xab, 0x81, 0x5d, 0xab, 0x82, 0x5e, 0xb0, 0x88, 0x64, 0xb0, 0x87, 0x63, 0xa9, 0x81, 0x5f, 0xb2, 0x8a, 0x68, 0xa2, 0x7f, 0x5f, 0x89, 0x69, 0x4e, 0xa9, 0x8b, 0x6b, 0x9f, 0x7a, 0x5d, 0xa3, 0x82, 0x65, 0x89, 0x67, 0x4a, 0x73, 0x53, 0x39, 0x5a, 0x3a, 0x25, 0x60, 0x44, 0x2b, 0x5f, 0x43, 0x2a, 0x4d, 0x30, 0x1c, 0x3a, 0x23, 0x11, 0x43, 0x2f, 0x20, 0x55, 0x3d, 0x2b, 0x3e, 0x26, 0x15, 0x33, 0x1b, 0x0b, 0x39, 0x22, 0x10, 0x52, 0x38, 0x21, 0x57, 0x3a, 0x21, 0x5c, 0x3f, 0x29, 0x5a, 0x3e, 0x27, 0x58, 0x3c, 0x24, 0x65, 0x49, 0x30, 0x4e, 0x32, 0x19, 0x61, 0x45, 0x2c, 0x6f, 0x53, 0x3b, 0x68, 0x4c, 0x33, 0x76, 0x59, 0x40, 0x86, 0x64, 0x48, 0x6c, 0x4d, 0x33, 0x96, 0x73, 0x55, 0xa3, 0x80, 0x62, 0xa8, 0x85, 0x67, 0xa2, 0x82, 0x62, 0x9f, 0x7e, 0x5f, 0x89, 0x66, 0x48, 0xab, 0x84, 0x64, 0xab, 0x83, 0x61, 0xaa, 0x82, 0x60, 0xa0, 0x77, 0x55, 0x8e, 0x65, 0x43, 0x9d, 0x75, 0x54, 0xad, 0x84, 0x61, 0xba, 0x8c, 0x65, 0xc3, 0x97, 0x6f, 0xbf, 0x93, 0x6b, 0xbb, 0x93, 0x6c, 0xb5, 0x8d, 0x67, 0xc8, 0xa0, 0x79, 0xe2, 0xba, 0x93, 0xe1, 0xb7, 0x8f, 0xca, 0xa0, 0x78, 0xd0, 0xa4, 0x78, 0xe1, 0xbb, 0x90, 0xc2, 0x99, 0x70, 0xbf, 0x99, 0x74, 0x87, 0x68, 0x4a, 0x90, 0x71, 0x53, 0x71, 0x59, 0x40, 0x9d, 0x7d, 0x5c, 0x87, 0x68, 0x4d, 0xab, 0x8d, 0x6b, 0x84, 0x64, 0x49, 0x79, 0x5e, 0x46, 0x5d, 0x49, 0x39, 0x48, 0x36, 0x2a, 0x65, 0x53, 0x48, 0x66, 0x58, 0x4d, 0x57, 0x4d, 0x45, 0x8e, 0x83, 0x7b, 0xa2, 0x9d, 0x98, 0xbf, 0xbb, 0xb9, 0xe8, 0xe8, 0xe2, 0xe5, 0xe6, 0xe3, 0xfa, 0xfa, 0xf8, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfa, 0xfa, 0xf9, 0xf0, 0xf0, 0xef, 0xf6, 0xf6, 0xf4, 0xb4, 0xb5, 0xb1, 0xcd, 0xcc, 0xc8, 0xbc, 0xbb, 0xb7, 0x92, 0x8a, 0x83, 0x6a, 0x5f, 0x59, 0x50, 0x44, 0x3d, 0x3f, 0x31, 0x29, 0x35, 0x25, 0x1a, 0x3d, 0x2c, 0x21, 0x40, 0x2d, 0x20, 0x1a, 0x10, 0x07, 0x22, 0x19, 0x13, 0x1a, 0x0c, 0x06, 0x1d, 0x10, 0x08, 0x18, 0x0d, 0x08, 0x09, 0x04, 0x04, 0x14, 0x09, 0x03, 0x16, 0x0a, 0x04, 0x1a, 0x11, 0x0b, 0x10, 0x0a, 0x06, 0x0e, 0x06, 0x00, 0x14, 0x08, 0x02, 0x35, 0x23, 0x14, 0x0e, 0x08, 0x02, 0x25, 0x17, 0x0b, 0x4f, 0x39, 0x25, 0x4a, 0x37, 0x26, 0x62, 0x49, 0x2e, 0x5b, 0x41, 0x2b, 0x79, 0x5b, 0x3e, 0x8e, 0x6a, 0x4a, 0x99, 0x75, 0x56, 0x94, 0x73, 0x52, 0xc4, 0x9b, 0x74, 0xa8, 0x80, 0x5d, 0xa9, 0x81, 0x5e, 0xae, 0x86, 0x60, 0xad, 0x85, 0x61, 0xaa, 0x80, 0x5d, 0xb3, 0x88, 0x65, 0xaf, 0x85, 0x61, 0xb2, 0x8a, 0x65, 0xb4, 0x8c, 0x68, 0xa8, 0x80, 0x5d, 0xac, 0x84, 0x63, 0x8b, 0x68, 0x48, 0x90, 0x70, 0x55, 0xb3, 0x94, 0x74, 0x9e, 0x7c, 0x5d, 0xa3, 0x81, 0x63, 0x92, 0x70, 0x52, 0x74, 0x54, 0x39, 0x5f, 0x3e, 0x27, 0x63, 0x47, 0x30, 0x62, 0x46, 0x2e, 0x4e, 0x34, 0x1f, 0x38, 0x20, 0x0e, 0x32, 0x1d, 0x0d, 0x42, 0x2b, 0x18, 0x46, 0x2e, 0x1b, 0x37, 0x1f, 0x0d, 0x39, 0x20, 0x0c, 0x59, 0x3d, 0x26, 0x54, 0x37, 0x1f, 0x5d, 0x40, 0x29, 0x64, 0x47, 0x2e, 0x66, 0x4a, 0x31, 0x59, 0x3d, 0x24, 0x51, 0x34, 0x1a, 0x6e, 0x51, 0x38, 0x70, 0x53, 0x3b, 0x66, 0x49, 0x31, 0x81, 0x63, 0x49, 0x8d, 0x6c, 0x51, 0x75, 0x58, 0x3e, 0x83, 0x60, 0x43, 0xa5, 0x82, 0x63, 0xa6, 0x83, 0x64, 0x96, 0x78, 0x58, 0xb3, 0x8f, 0x71, 0x96, 0x73, 0x54, 0x9f, 0x7a, 0x56, 0xb7, 0x8e, 0x69, 0xae, 0x85, 0x61, 0xb2, 0x88, 0x65, 0x9c, 0x72, 0x4f, 0x95, 0x6c, 0x4a, 0xb6, 0x8d, 0x67, 0xac, 0x81, 0x5b, 0xbb, 0x90, 0x65, 0xb7, 0x8c, 0x62, 0xb0, 0x8b, 0x67, 0xad, 0x88, 0x62, 0xc0, 0x99, 0x73, 0xd8, 0xb1, 0x8b, 0xd5, 0xac, 0x85, 0xc1, 0x97, 0x70, 0xc1, 0x97, 0x6c, 0xdb, 0xb3, 0x8a, 0xbf, 0x98, 0x6f, 0xb4, 0x8f, 0x68, 0x89, 0x6a, 0x4c, 0x78, 0x5b, 0x3c, 0x79, 0x64, 0x4c, 0x9a, 0x7b, 0x5b, 0x9b, 0x7d, 0x61, 0x92, 0x72, 0x52, 0x7c, 0x5f, 0x46, 0x6e, 0x53, 0x41, 0x42, 0x2f, 0x22, 0x48, 0x35, 0x2c, 0x58, 0x44, 0x39, 0x6e, 0x5f, 0x51, 0x5b, 0x4b, 0x40, 0x91, 0x86, 0x7e, 0xa9, 0xa5, 0xa0, 0xae, 0xaa, 0xa6, 0xe0, 0xe0, 0xdc, 0xf5, 0xf5, 0xf4, 0xf3, 0xf3, 0xf3, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf8, 0xf8, 0xf6, 0xf7, 0xf8, 0xf6, 0xe2, 0xe2, 0xe2, 0xcf, 0xd0, 0xca, 0xc6, 0xc5, 0xc1, 0xa2, 0xa1, 0x9d, 0x8b, 0x82, 0x7b, 0x74, 0x6b, 0x64, 0x4f, 0x46, 0x40, 0x3b, 0x2e, 0x24, 0x3e, 0x2d, 0x25, 0x3b, 0x2b, 0x22, 0x3e, 0x2e, 0x24, 0x1a, 0x10, 0x07, 0x1a, 0x11, 0x0a, 0x13, 0x0a, 0x03, 0x1d, 0x11, 0x0a, 0x12, 0x08, 0x05, 0x08, 0x03, 0x02, 0x18, 0x0b, 0x05, 0x17, 0x0b, 0x07, 0x17, 0x10, 0x0b, 0x0b, 0x06, 0x02, 0x30, 0x21, 0x1a, 0x0a, 0x04, 0x00, 0x3c, 0x2c, 0x1f, 0x14, 0x0c, 0x06, 0x21, 0x11, 0x09, 0x43, 0x30, 0x1d, 0x35, 0x23, 0x16, 0x5b, 0x42, 0x28, 0x5e, 0x46, 0x2f, 0x75, 0x59, 0x3c, 0x8f, 0x6f, 0x51, 0x83, 0x63, 0x45, 0xa3, 0x81, 0x60, 0xbf, 0x98, 0x75, 0xa4, 0x7c, 0x59, 0xad, 0x85, 0x62, 0xa5, 0x7d, 0x59, 0xaf, 0x87, 0x62, 0xaa, 0x80, 0x5c, 0xb3, 0x89, 0x65, 0xb1, 0x88, 0x64, 0xb4, 0x8c, 0x67, 0xbc, 0x94, 0x6f, 0x9a, 0x71, 0x4f, 0xa6, 0x7d, 0x5f, 0x93, 0x70, 0x50, 0x8e, 0x6d, 0x52, 0xb3, 0x92, 0x73, 0xa1, 0x80, 0x61, 0xad, 0x89, 0x6b, 0xa0, 0x7d, 0x5e, 0x78, 0x58, 0x3d, 0x6e, 0x4e, 0x33, 0x5d, 0x40, 0x2a, 0x6a, 0x4d, 0x37, 0x4f, 0x36, 0x21, 0x33, 0x19, 0x08, 0x2f, 0x17, 0x07, 0x3a, 0x24, 0x10, 0x50, 0x38, 0x22, 0x41, 0x28, 0x13, 0x42, 0x27, 0x11, 0x5c, 0x3f, 0x29, 0x59, 0x3d, 0x26, 0x59, 0x3c, 0x25, 0x6a, 0x4b, 0x30, 0x59, 0x3d, 0x24, 0x5b, 0x3f, 0x26, 0x58, 0x39, 0x1e, 0x73, 0x54, 0x38, 0x74, 0x53, 0x3c, 0x66, 0x46, 0x2f, 0x89, 0x68, 0x4d, 0x7a, 0x59, 0x3e, 0x68, 0x4c, 0x33, 0x8f, 0x6e, 0x53, 0xa5, 0x82, 0x62, 0xaf, 0x8c, 0x6c, 0xa5, 0x84, 0x65, 0x95, 0x74, 0x55, 0xa9, 0x86, 0x68, 0xa1, 0x7b, 0x5a, 0xa8, 0x7e, 0x5b, 0xae, 0x84, 0x60, 0xb6, 0x8c, 0x67, 0xac, 0x82, 0x5c, 0x9e, 0x74, 0x50, 0xac, 0x82, 0x58, 0xab, 0x80, 0x5e, 0xae, 0x82, 0x5b, 0xb1, 0x85, 0x5e, 0xa3, 0x7f, 0x5c, 0xb6, 0x92, 0x69, 0xac, 0x84, 0x60, 0xd7, 0xae, 0x8a, 0xd5, 0xac, 0x86, 0xb8, 0x90, 0x69, 0xbb, 0x92, 0x6a, 0xd3, 0xa9, 0x81, 0xae, 0x8b, 0x66, 0xb0, 0x8c, 0x67, 0xa1, 0x83, 0x61, 0x88, 0x6d, 0x50, 0x89, 0x73, 0x5b, 0x89, 0x6a, 0x4c, 0x82, 0x67, 0x4c, 0x81, 0x63, 0x45, 0x6a, 0x53, 0x3a, 0x49, 0x33, 0x26, 0x45, 0x31, 0x23, 0x4b, 0x39, 0x2f, 0x48, 0x39, 0x31, 0x69, 0x5b, 0x4e, 0x71, 0x5e, 0x52, 0x8b, 0x80, 0x78, 0xa2, 0xa1, 0x9b, 0xb7, 0xb3, 0xae, 0xdb, 0xda, 0xd9, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xf9, 0xef, 0xef, 0xee, 0xdf, 0xdf, 0xdf, 0xd6, 0xd6, 0xd0, 0xc5, 0xc3, 0xc0, 0x91, 0x90, 0x8c, 0x7c, 0x73, 0x6c, 0x6d, 0x64, 0x5d, 0x4c, 0x3e, 0x39, 0x46, 0x32, 0x2a, 0x3a, 0x29, 0x21, 0x37, 0x26, 0x1e, 0x39, 0x29, 0x1f, 0x27, 0x1a, 0x12, 0x1f, 0x16, 0x10, 0x12, 0x09, 0x02, 0x20, 0x15, 0x0d, 0x0f, 0x04, 0x01, 0x0d, 0x09, 0x04, 0x25, 0x18, 0x12, 0x13, 0x06, 0x09, 0x11, 0x09, 0x05, 0x1c, 0x19, 0x0f, 0x1a, 0x0d, 0x06, 0x19, 0x10, 0x0d, 0x0f, 0x06, 0x00, 0x1c, 0x11, 0x09, 0x32, 0x22, 0x13, 0x2d, 0x1f, 0x12, 0x1b, 0x0e, 0x03, 0x51, 0x3c, 0x26, 0x5b, 0x43, 0x2c, 0x75, 0x59, 0x3c, 0x70, 0x54, 0x39, 0x75, 0x5a, 0x3f, 0x9f, 0x7c, 0x5c, 0xbc, 0x96, 0x73, 0x9e, 0x76, 0x54, 0xa3, 0x7b, 0x58, 0xa9, 0x81, 0x5d, 0xb0, 0x88, 0x63, 0xa0, 0x77, 0x53, 0xb3, 0x89, 0x65, 0xbb, 0x92, 0x6e, 0xb6, 0x8e, 0x6a, 0xb2, 0x8a, 0x66, 0xa8, 0x80, 0x5e, 0xa8, 0x7f, 0x61, 0x99, 0x76, 0x56, 0x86, 0x65, 0x4a, 0xa9, 0x88, 0x6a, 0xa2, 0x81, 0x62, 0xae, 0x8b, 0x6d, 0xa4, 0x81, 0x63, 0x78, 0x58, 0x3d, 0x76, 0x56, 0x3b, 0x50, 0x34, 0x1d, 0x61, 0x45, 0x2e, 0x54, 0x3c, 0x24, 0x36, 0x1c, 0x0b, 0x3c, 0x24, 0x14, 0x3e, 0x27, 0x14, 0x51, 0x39, 0x23, 0x49, 0x31, 0x1b, 0x4d, 0x33, 0x1d, 0x59, 0x3d, 0x26, 0x5b, 0x40, 0x29, 0x53, 0x36, 0x1e, 0x6e, 0x4f, 0x34, 0x62, 0x46, 0x2e, 0x5d, 0x40, 0x28, 0x61, 0x42, 0x26, 0x7c, 0x5c, 0x41, 0x79, 0x59, 0x41, 0x73, 0x53, 0x3c, 0x7e, 0x63, 0x46, 0x66, 0x4b, 0x2e, 0x6c, 0x51, 0x37, 0x7b, 0x5b, 0x3f, 0xa0, 0x7d, 0x5d, 0xa4, 0x81, 0x61, 0x9a, 0x79, 0x5a, 0x92, 0x71, 0x52, 0xa7, 0x84, 0x66, 0x9b, 0x74, 0x54, 0x9e, 0x74, 0x51, 0xac, 0x82, 0x5e, 0xb2, 0x88, 0x63, 0xb1, 0x87, 0x61, 0x9c, 0x72, 0x4d, 0xa5, 0x7c, 0x52, 0xa1, 0x77, 0x54, 0xaf, 0x83, 0x5c, 0xa6, 0x7b, 0x53, 0x98, 0x74, 0x50, 0xc7, 0xa4, 0x7b, 0xa4, 0x7c, 0x57, 0xcc, 0xa4, 0x80, 0xc7, 0xa4, 0x7c, 0xc8, 0xa4, 0x7c, 0xb1, 0x88, 0x60, 0xc9, 0x9f, 0x77, 0xa9, 0x8b, 0x69, 0xa7, 0x88, 0x67, 0x95, 0x76, 0x55, 0x9e, 0x83, 0x66, 0x75, 0x5d, 0x44, 0x82, 0x6a, 0x50, 0x48, 0x39, 0x26, 0x85, 0x6b, 0x50, 0x56, 0x40, 0x29, 0x40, 0x2d, 0x22, 0x40, 0x30, 0x23, 0x57, 0x46, 0x37, 0x52, 0x43, 0x38, 0x51, 0x3f, 0x33, 0x90, 0x85, 0x76, 0x78, 0x6d, 0x64, 0xb4, 0xb2, 0xad, 0xbc, 0xb9, 0xb3, 0xc9, 0xc9, 0xc7, 0xf2, 0xf2, 0xf2, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf3, 0xf4, 0xf2, 0xe4, 0xe4, 0xe2, 0xe0, 0xe1, 0xde, 0xd4, 0xd4, 0xd2, 0xd1, 0xcf, 0xcd, 0x8d, 0x89, 0x83, 0x79, 0x71, 0x6c, 0x67, 0x5c, 0x53, 0x43, 0x35, 0x2e, 0x45, 0x36, 0x2f, 0x35, 0x29, 0x21, 0x2e, 0x22, 0x1a, 0x37, 0x28, 0x20, 0x1d, 0x12, 0x0d, 0x22, 0x14, 0x0b, 0x10, 0x06, 0x00, 0x12, 0x09, 0x04, 0x0e, 0x07, 0x05, 0x24, 0x1c, 0x0f, 0x15, 0x0c, 0x08, 0x19, 0x0c, 0x08, 0x12, 0x0d, 0x06, 0x1e, 0x12, 0x0a, 0x1b, 0x0e, 0x06, 0x09, 0x00, 0x00, 0x1e, 0x14, 0x0c, 0x16, 0x0c, 0x04, 0x28, 0x1e, 0x11, 0x22, 0x17, 0x11, 0x1c, 0x12, 0x07, 0x4d, 0x37, 0x23, 0x58, 0x42, 0x2c, 0x68, 0x4e, 0x32, 0x4c, 0x37, 0x23, 0x78, 0x5d, 0x44, 0x85, 0x66, 0x4a, 0xab, 0x84, 0x61, 0x96, 0x71, 0x4d, 0xa8, 0x83, 0x5f, 0xa0, 0x78, 0x54, 0xa6, 0x7e, 0x5a, 0xaa, 0x81, 0x5e, 0xb1, 0x88, 0x62, 0xc2, 0x98, 0x70, 0xba, 0x91, 0x6b, 0xb2, 0x89, 0x64, 0xa0, 0x77, 0x55, 0x9b, 0x73, 0x51, 0x96, 0x71, 0x52, 0x8c, 0x6c, 0x51, 0xaf, 0x8e, 0x6f, 0xa8, 0x87, 0x68, 0xac, 0x8b, 0x6c, 0xa1, 0x80, 0x61, 0x8c, 0x6c, 0x51, 0x7a, 0x5b, 0x3f, 0x5a, 0x3e, 0x25, 0x69, 0x4d, 0x34, 0x4d, 0x35, 0x1f, 0x45, 0x2c, 0x17, 0x3e, 0x25, 0x10, 0x37, 0x1d, 0x0e, 0x54, 0x3a, 0x24, 0x47, 0x2d, 0x16, 0x50, 0x35, 0x1d, 0x5a, 0x3e, 0x25, 0x57, 0x3c, 0x24, 0x54, 0x38, 0x20, 0x68, 0x49, 0x2e, 0x54, 0x35, 0x1a, 0x72, 0x53, 0x38, 0x66, 0x44, 0x2b, 0x7e, 0x5c, 0x43, 0x72, 0x52, 0x38, 0x72, 0x53, 0x38, 0x8b, 0x6b, 0x4f, 0x66, 0x4a, 0x30, 0x7d, 0x5c, 0x40, 0x7e, 0x5d, 0x40, 0xa6, 0x83, 0x63, 0x9f, 0x7c, 0x5c, 0x8b, 0x6c, 0x52, 0x94, 0x71, 0x54, 0x8d, 0x6e, 0x4e, 0x96, 0x72, 0x51, 0x96, 0x6e, 0x4b, 0xa2, 0x7b, 0x53, 0xb5, 0x8d, 0x64, 0xba, 0x90, 0x6a, 0x91, 0x68, 0x42, 0xa9, 0x81, 0x5c, 0x9e, 0x75, 0x4f, 0xba, 0x8f, 0x68, 0xac, 0x86, 0x62, 0x92, 0x6f, 0x4e, 0xc1, 0x9f, 0x79, 0x97, 0x74, 0x50, 0xb7, 0x94, 0x70, 0xcc, 0xab, 0x81, 0xb3, 0x91, 0x68, 0xba, 0x95, 0x6b, 0xc3, 0x9d, 0x73, 0xa3, 0x83, 0x5e, 0x80, 0x64, 0x42, 0xaa, 0x8c, 0x66, 0x73, 0x56, 0x40, 0x8e, 0x72, 0x55, 0x69, 0x4f, 0x38, 0x59, 0x44, 0x31, 0x68, 0x4f, 0x38, 0x5c, 0x42, 0x2f, 0x35, 0x25, 0x1c, 0x54, 0x41, 0x30, 0x44, 0x31, 0x23, 0x55, 0x3e, 0x2e, 0x51, 0x40, 0x34, 0x76, 0x6b, 0x5d, 0x93, 0x8a, 0x81, 0xa5, 0xa1, 0x9c, 0xc7, 0xc7, 0xc3, 0xcf, 0xcf, 0xcb, 0xed, 0xee, 0xec, 0xfb, 0xfb, 0xf9, 0xfb, 0xfa, 0xfa, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xef, 0xef, 0xed, 0xf3, 0xf4, 0xf1, 0xe4, 0xe4, 0xe2, 0xd3, 0xd3, 0xd1, 0xaa, 0xaa, 0xa8, 0x8e, 0x89, 0x83, 0x8b, 0x84, 0x7f, 0x58, 0x4c, 0x43, 0x46, 0x37, 0x30, 0x47, 0x38, 0x31, 0x3a, 0x2f, 0x27, 0x2b, 0x20, 0x18, 0x2c, 0x1e, 0x15, 0x1a, 0x0f, 0x0b, 0x18, 0x0c, 0x08, 0x21, 0x12, 0x0c, 0x0d, 0x05, 0x03, 0x1d, 0x12, 0x0c, 0x13, 0x0b, 0x03, 0x1e, 0x0f, 0x09, 0x06, 0x03, 0x01, 0x20, 0x17, 0x0c, 0x16, 0x0d, 0x09, 0x13, 0x06, 0x00, 0x0b, 0x03, 0x02, 0x2a, 0x1d, 0x15, 0x0c, 0x07, 0x03, 0x26, 0x1c, 0x14, 0x24, 0x1a, 0x0f, 0x1a, 0x11, 0x08, 0x50, 0x3a, 0x27, 0x4a, 0x38, 0x25, 0x5d, 0x47, 0x2f, 0x45, 0x30, 0x1d, 0x6a, 0x4e, 0x35, 0x7b, 0x62, 0x48, 0x97, 0x75, 0x54, 0xa7, 0x83, 0x5f, 0xa9, 0x85, 0x61, 0xa8, 0x81, 0x5d, 0xa3, 0x7b, 0x57, 0xb2, 0x89, 0x66, 0xb3, 0x89, 0x63, 0xc1, 0x98, 0x6f, 0xb3, 0x89, 0x63, 0xb5, 0x8b, 0x66, 0xa3, 0x7a, 0x58, 0xa2, 0x79, 0x57, 0x94, 0x71, 0x51, 0x80, 0x60, 0x45, 0xae, 0x8d, 0x6e, 0xab, 0x8a, 0x6c, 0xa2, 0x81, 0x62, 0x9e, 0x7d, 0x5e, 0x8b, 0x6c, 0x51, 0x74, 0x55, 0x39, 0x5a, 0x3e, 0x26, 0x77, 0x5b, 0x42, 0x4b, 0x33, 0x1d, 0x49, 0x30, 0x1b, 0x42, 0x2a, 0x10, 0x44, 0x2c, 0x18, 0x5b, 0x41, 0x29, 0x4e, 0x33, 0x1c, 0x4f, 0x34, 0x1c, 0x5a, 0x3e, 0x25, 0x57, 0x3c, 0x24, 0x59, 0x3d, 0x25, 0x61, 0x41, 0x26, 0x6d, 0x4d, 0x32, 0x75, 0x55, 0x3a, 0x7c, 0x5b, 0x3c, 0x83, 0x62, 0x44, 0x79, 0x59, 0x3e, 0x7f, 0x5f, 0x44, 0x88, 0x68, 0x4c, 0x6c, 0x50, 0x36, 0x7a, 0x59, 0x3c, 0x82, 0x60, 0x44, 0x9f, 0x7c, 0x5c, 0xa1, 0x7e, 0x5e, 0x7c, 0x5e, 0x44, 0x95, 0x71, 0x55, 0x83, 0x64, 0x44, 0x94, 0x71, 0x4f, 0x8a, 0x62, 0x41, 0x9e, 0x76, 0x52, 0xaf, 0x86, 0x60, 0xc2, 0x98, 0x72, 0x99, 0x70, 0x4a, 0xa2, 0x7a, 0x56, 0xa4, 0x7c, 0x56, 0xba, 0x94, 0x6b, 0x96, 0x74, 0x4f, 0x83, 0x65, 0x46, 0x9d, 0x7f, 0x5b, 0xa4, 0x82, 0x5e, 0xa9, 0x87, 0x63, 0xb3, 0x91, 0x6c, 0xb1, 0x8f, 0x6a, 0xb7, 0x94, 0x6c, 0xb4, 0x92, 0x6a, 0x9b, 0x7b, 0x59, 0x81, 0x65, 0x47, 0x95, 0x75, 0x5b, 0x83, 0x67, 0x4a, 0x73, 0x5a, 0x3f, 0x64, 0x4d, 0x3a, 0x5e, 0x48, 0x35, 0x4b, 0x37, 0x24, 0x55, 0x3f, 0x2c, 0x2f, 0x1f, 0x16, 0x3c, 0x28, 0x1d, 0x3a, 0x29, 0x20, 0x4e, 0x38, 0x2a, 0x4f, 0x3d, 0x31, 0x64, 0x58, 0x4a, 0x97, 0x8f, 0x86, 0xac, 0xa8, 0xa3, 0xbd, 0xbe, 0xba, 0xd6, 0xd6, 0xd2, 0xe9, 0xea, 0xe8, 0xfa, 0xfb, 0xf9, 0xfd, 0xfd, 0xfd, 0xfe, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xfa, 0xf9, 0xf6, 0xf6, 0xf4, 0xf3, 0xf3, 0xf1, 0xe2, 0xe0, 0xdf, 0xbe, 0xbd, 0xbb, 0xa2, 0xa0, 0x9c, 0x9a, 0x93, 0x91, 0x68, 0x5c, 0x57, 0x5b, 0x50, 0x49, 0x48, 0x3d, 0x37, 0x3d, 0x32, 0x2c, 0x3a, 0x2e, 0x24, 0x2b, 0x20, 0x1a, 0x1f, 0x11, 0x0a, 0x12, 0x07, 0x01, 0x0a, 0x06, 0x03, 0x1c, 0x12, 0x0c, 0x11, 0x0a, 0x03, 0x20, 0x16, 0x0e, 0x12, 0x0a, 0x04, 0x15, 0x0a, 0x03, 0x0e, 0x07, 0x01, 0x21, 0x15, 0x0a, 0x12, 0x0a, 0x05, 0x13, 0x09, 0x04, 0x0c, 0x04, 0x00, 0x2b, 0x1b, 0x12, 0x20, 0x18, 0x10, 0x17, 0x11, 0x08, 0x17, 0x0d, 0x09, 0x1e, 0x14, 0x0d, 0x4b, 0x38, 0x26, 0x3e, 0x2b, 0x1e, 0x48, 0x34, 0x20, 0x5b, 0x48, 0x31, 0x61, 0x4a, 0x2e, 0x73, 0x5b, 0x41, 0x87, 0x68, 0x4a, 0x90, 0x6e, 0x4c, 0xa9, 0x83, 0x5e, 0xa5, 0x80, 0x5d, 0xa5, 0x80, 0x5a, 0xb7, 0x8e, 0x69, 0xad, 0x83, 0x5d, 0xc4, 0x9b, 0x75, 0xae, 0x86, 0x62, 0xa9, 0x81, 0x5d, 0xad, 0x85, 0x61, 0xb1, 0x89, 0x65, 0xa0, 0x7d, 0x5c, 0x92, 0x71, 0x52, 0x8e, 0x6b, 0x4d, 0xb1, 0x8e, 0x6f, 0x82, 0x61, 0x42, 0x9e, 0x7d, 0x5e, 0x8c, 0x6c, 0x51, 0x71, 0x51, 0x36, 0x54, 0x38, 0x20, 0x80, 0x64, 0x4c, 0x45, 0x2c, 0x17, 0x4a, 0x31, 0x1b, 0x45, 0x2c, 0x15, 0x4b, 0x32, 0x1d, 0x61, 0x47, 0x30, 0x56, 0x3b, 0x24, 0x51, 0x35, 0x1e, 0x61, 0x45, 0x2d, 0x5f, 0x42, 0x2a, 0x63, 0x44, 0x2b, 0x76, 0x56, 0x39, 0x69, 0x47, 0x2a, 0x7b, 0x5a, 0x3d, 0x7e, 0x5b, 0x3d, 0x7e, 0x5b, 0x3d, 0x77, 0x56, 0x39, 0x79, 0x58, 0x3b, 0x89, 0x67, 0x49, 0x72, 0x54, 0x3b, 0x80, 0x61, 0x43, 0x94, 0x72, 0x53, 0x96, 0x73, 0x53, 0x96, 0x74, 0x53, 0x86, 0x67, 0x4b, 0x8d, 0x6c, 0x4f, 0x95, 0x72, 0x54, 0x9e, 0x7a, 0x5b, 0x84, 0x60, 0x40, 0x97, 0x6f, 0x4b, 0xb0, 0x89, 0x66, 0xc0, 0x95, 0x72, 0xa3, 0x79, 0x56, 0x93, 0x6f, 0x4b, 0xa6, 0x7d, 0x59, 0xae, 0x87, 0x61, 0x90, 0x6f, 0x4f, 0x7c, 0x5d, 0x3f, 0x8d, 0x6e, 0x4e, 0xa6, 0x84, 0x5d, 0x92, 0x73, 0x54, 0xa5, 0x84, 0x64, 0xa0, 0x80, 0x5f, 0xb0, 0x8c, 0x66, 0xb5, 0x93, 0x6f, 0x78, 0x5c, 0x40, 0x76, 0x58, 0x3b, 0x65, 0x4a, 0x2f, 0x7a, 0x61, 0x42, 0x6b, 0x52, 0x3d, 0x69, 0x51, 0x40, 0x5b, 0x43, 0x30, 0x4a, 0x37, 0x27, 0x40, 0x30, 0x20, 0x3f, 0x31, 0x20, 0x3f, 0x2e, 0x1f, 0x33, 0x22, 0x16, 0x3b, 0x2c, 0x22, 0x55, 0x43, 0x38, 0x66, 0x5a, 0x50, 0x80, 0x79, 0x6f, 0xbc, 0xb9, 0xb4, 0xcd, 0xcc, 0xc6, 0xc9, 0xc8, 0xc6, 0xf4, 0xf4, 0xf2, 0xf3, 0xf3, 0xf1, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfa, 0xee, 0xee, 0xec, 0xd7, 0xd6, 0xd1, 0xb7, 0xb6, 0xb1, 0xc0, 0xbd, 0xbb, 0x7a, 0x73, 0x6d, 0x72, 0x69, 0x62, 0x5b, 0x51, 0x4a, 0x44, 0x3b, 0x34, 0x42, 0x39, 0x32, 0x39, 0x2b, 0x23, 0x1c, 0x11, 0x0e, 0x1f, 0x10, 0x0b, 0x22, 0x17, 0x10, 0x0c, 0x06, 0x04, 0x13, 0x08, 0x04, 0x1e, 0x14, 0x10, 0x17, 0x0d, 0x0a, 0x0c, 0x03, 0x00, 0x12, 0x09, 0x04, 0x18, 0x0c, 0x05, 0x1b, 0x10, 0x06, 0x1f, 0x15, 0x10, 0x1a, 0x0e, 0x08, 0x1a, 0x0e, 0x08, 0x20, 0x12, 0x0c, 0x18, 0x11, 0x08, 0x0d, 0x07, 0x00, 0x1a, 0x14, 0x10, 0x0e, 0x06, 0x03, 0x35, 0x25, 0x15, 0x4a, 0x35, 0x26, 0x34, 0x20, 0x11, 0x4f, 0x3c, 0x28, 0x5d, 0x45, 0x2c, 0x58, 0x41, 0x28, 0x77, 0x5c, 0x40, 0x82, 0x63, 0x44, 0xa1, 0x7d, 0x5b, 0xa4, 0x81, 0x5e, 0xa9, 0x84, 0x5f, 0xbc, 0x93, 0x6c, 0xb8, 0x8e, 0x68, 0xba, 0x91, 0x6b, 0xb5, 0x8d, 0x68, 0xa2, 0x7a, 0x55, 0xab, 0x83, 0x5f, 0xb8, 0x90, 0x6c, 0x96, 0x75, 0x53, 0x97, 0x74, 0x55, 0x87, 0x64, 0x46, 0xa8, 0x85, 0x67, 0x73, 0x52, 0x33, 0x9f, 0x7e, 0x5f, 0x82, 0x62, 0x47, 0x74, 0x55, 0x39, 0x61, 0x45, 0x2c, 0x7e, 0x62, 0x4a, 0x45, 0x2c, 0x16, 0x53, 0x3b, 0x25, 0x39, 0x21, 0x0b, 0x50, 0x38, 0x22, 0x65, 0x4b, 0x34, 0x59, 0x3f, 0x27, 0x5a, 0x3f, 0x27, 0x63, 0x47, 0x2e, 0x69, 0x4b, 0x33, 0x6c, 0x4c, 0x32, 0x6b, 0x4c, 0x2e, 0x70, 0x4f, 0x32, 0x78, 0x57, 0x3a, 0x88, 0x65, 0x47, 0x88, 0x65, 0x46, 0x8a, 0x69, 0x4c, 0x78, 0x56, 0x3a, 0x99, 0x76, 0x56, 0x72, 0x54, 0x36, 0x86, 0x68, 0x4b, 0x92, 0x6f, 0x4f, 0xa9, 0x86, 0x66, 0x99, 0x76, 0x56, 0x99, 0x7a, 0x5c, 0x89, 0x69, 0x4c, 0x88, 0x69, 0x4a, 0x9a, 0x7a, 0x5b, 0x7e, 0x5c, 0x3c, 0x9e, 0x76, 0x51, 0xa7, 0x82, 0x60, 0xa9, 0x82, 0x5e, 0xb9, 0x93, 0x6e, 0x7b, 0x5d, 0x37, 0xa7, 0x80, 0x5c, 0x95, 0x71, 0x4d, 0x74, 0x58, 0x3b, 0x59, 0x3d, 0x21, 0x7f, 0x63, 0x48, 0x8f, 0x72, 0x4f, 0x90, 0x72, 0x54, 0x98, 0x7d, 0x5e, 0x87, 0x6c, 0x4d, 0xa1, 0x7f, 0x5a, 0xa0, 0x82, 0x61, 0x77, 0x5d, 0x41, 0x69, 0x4e, 0x33, 0x72, 0x58, 0x3e, 0x6d, 0x53, 0x39, 0x64, 0x4c, 0x32, 0x73, 0x5c, 0x42, 0x5e, 0x44, 0x2f, 0x3b, 0x27, 0x18, 0x31, 0x22, 0x19, 0x38, 0x27, 0x1f, 0x38, 0x26, 0x1d, 0x3c, 0x2a, 0x1e, 0x3e, 0x2c, 0x20, 0x4c, 0x3a, 0x31, 0x74, 0x68, 0x60, 0x7f, 0x77, 0x6d, 0xad, 0xa9, 0xa4, 0xbb, 0xba, 0xb4, 0xc6, 0xc4, 0xc2, 0xee, 0xee, 0xec, 0xf7, 0xf8, 0xf6, 0xf9, 0xf9, 0xf9, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfb, 0xf2, 0xf3, 0xf0, 0xd6, 0xd7, 0xd4, 0xdb, 0xdb, 0xd6, 0xca, 0xca, 0xc4, 0x92, 0x8d, 0x8d, 0x7a, 0x72, 0x6a, 0x74, 0x6e, 0x67, 0x52, 0x4c, 0x45, 0x54, 0x4b, 0x46, 0x48, 0x3d, 0x35, 0x36, 0x28, 0x1f, 0x20, 0x14, 0x0e, 0x21, 0x13, 0x0e, 0x15, 0x0b, 0x05, 0x07, 0x01, 0x00, 0x1a, 0x0f, 0x0a, 0x16, 0x0e, 0x0b, 0x16, 0x0c, 0x09, 0x13, 0x08, 0x02, 0x15, 0x0b, 0x06, 0x23, 0x17, 0x0f, 0x1b, 0x10, 0x09, 0x18, 0x11, 0x0b, 0x23, 0x12, 0x07, 0x2a, 0x19, 0x0b, 0x0e, 0x04, 0x00, 0x0f, 0x09, 0x03, 0x13, 0x09, 0x01, 0x0a, 0x07, 0x03, 0x0a, 0x06, 0x05, 0x2d, 0x20, 0x15, 0x48, 0x33, 0x22, 0x28, 0x15, 0x0a, 0x3f, 0x2a, 0x19, 0x5a, 0x43, 0x2f, 0x53, 0x3e, 0x29, 0x69, 0x52, 0x3a, 0x72, 0x56, 0x39, 0x8d, 0x6d, 0x4d, 0x9f, 0x7c, 0x5b, 0xa7, 0x83, 0x5e, 0xba, 0x91, 0x6a, 0xb5, 0x8b, 0x64, 0xad, 0x84, 0x5e, 0xa8, 0x81, 0x5c, 0xad, 0x86, 0x60, 0x9b, 0x72, 0x50, 0xc1, 0x9a, 0x75, 0x83, 0x62, 0x42, 0xa2, 0x7f, 0x5e, 0x8c, 0x69, 0x4a, 0xa6, 0x83, 0x64, 0x77, 0x56, 0x38, 0xa3, 0x82, 0x62, 0x83, 0x64, 0x47, 0x75, 0x55, 0x39, 0x6d, 0x50, 0x36, 0x7c, 0x5f, 0x45, 0x47, 0x2e, 0x17, 0x45, 0x2e, 0x18, 0x50, 0x36, 0x20, 0x4b, 0x32, 0x1b, 0x62, 0x48, 0x30, 0x61, 0x46, 0x2e, 0x64, 0x49, 0x30, 0x69, 0x4d, 0x33, 0x5c, 0x3e, 0x25, 0x74, 0x54, 0x3a, 0x6e, 0x4e, 0x31, 0x6c, 0x4c, 0x2f, 0x7c, 0x5c, 0x3f, 0x84, 0x61, 0x42, 0x93, 0x70, 0x51, 0x85, 0x62, 0x45, 0x82, 0x60, 0x42, 0xa3, 0x80, 0x5c, 0x75, 0x56, 0x36, 0x7b, 0x5e, 0x41, 0x8e, 0x6c, 0x4c, 0xaf, 0x8d, 0x6a, 0x97, 0x75, 0x54, 0xa4, 0x83, 0x64, 0x78, 0x59, 0x3b, 0x8c, 0x70, 0x52, 0x90, 0x72, 0x52, 0x88, 0x67, 0x47, 0xb0, 0x88, 0x63, 0xa4, 0x80, 0x5c, 0x9f, 0x7b, 0x57, 0xb7, 0x93, 0x6f, 0x7e, 0x61, 0x3e, 0x90, 0x6e, 0x49, 0x9a, 0x79, 0x58, 0x61, 0x49, 0x2e, 0x64, 0x4a, 0x30, 0x6a, 0x4f, 0x38, 0x89, 0x6e, 0x50, 0x9b, 0x7e, 0x61, 0x69, 0x53, 0x39, 0x74, 0x5b, 0x3f, 0x8f, 0x71, 0x50, 0x84, 0x68, 0x4c, 0x76, 0x5d, 0x43, 0x64, 0x4e, 0x38, 0x62, 0x47, 0x2f, 0x49, 0x30, 0x1a, 0x53, 0x3a, 0x24, 0x55, 0x3f, 0x2d, 0x55, 0x3d, 0x29, 0x49, 0x34, 0x25, 0x41, 0x2f, 0x24, 0x3a, 0x29, 0x1e, 0x33, 0x24, 0x1b, 0x37, 0x26, 0x1c, 0x46, 0x32, 0x25, 0x59, 0x48, 0x3e, 0x6f, 0x61, 0x59, 0x70, 0x68, 0x60, 0xae, 0xaa, 0xa4, 0xc9, 0xc9, 0xc3, 0xd2, 0xd2, 0xcf, 0xe0, 0xe0, 0xde, 0xf7, 0xf7, 0xf5, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfa, 0xfa, 0xfa, 0xe7, 0xe7, 0xe5, 0xea, 0xea, 0xe8, 0xd9, 0xda, 0xd7, 0xc7, 0xc7, 0xc5, 0x92, 0x8e, 0x8a, 0x87, 0x7e, 0x76, 0x6e, 0x66, 0x61, 0x59, 0x52, 0x4c, 0x46, 0x3c, 0x37, 0x3f, 0x33, 0x2b, 0x31, 0x22, 0x19, 0x25, 0x17, 0x0d, 0x21, 0x14, 0x0d, 0x12, 0x0a, 0x07, 0x0c, 0x07, 0x03, 0x17, 0x0d, 0x05, 0x14, 0x0e, 0x0a, 0x17, 0x0d, 0x05, 0x1d, 0x10, 0x05, 0x18, 0x0d, 0x04, 0x24, 0x18, 0x0e, 0x0f, 0x05, 0x02, 0x0f, 0x08, 0x01, 0x41, 0x2c, 0x1f, 0x43, 0x2f, 0x1a, 0x0b, 0x04, 0x00, 0x0d, 0x06, 0x03, 0x13, 0x08, 0x00, 0x0b, 0x06, 0x04, 0x09, 0x05, 0x04, 0x22, 0x15, 0x0c, 0x38, 0x24, 0x16, 0x1f, 0x10, 0x06, 0x36, 0x23, 0x12, 0x4c, 0x39, 0x28, 0x58, 0x42, 0x2d, 0x52, 0x3b, 0x27, 0x62, 0x48, 0x2f, 0x83, 0x65, 0x46, 0xa4, 0x80, 0x60, 0x9e, 0x7a, 0x57, 0xb7, 0x90, 0x69, 0xb3, 0x8a, 0x62, 0xa6, 0x7e, 0x59, 0xa0, 0x7c, 0x58, 0xb3, 0x8f, 0x66, 0x9f, 0x76, 0x58, 0xbf, 0x9c, 0x76, 0x7b, 0x5b, 0x3b, 0x9f, 0x7a, 0x57, 0x9c, 0x79, 0x59, 0xa0, 0x7d, 0x5d, 0x83, 0x62, 0x46, 0xa0, 0x7f, 0x5d, 0x80, 0x61, 0x44, 0x78, 0x59, 0x3b, 0x6b, 0x4b, 0x30, 0x7f, 0x60, 0x45, 0x5c, 0x41, 0x27, 0x44, 0x30, 0x1b, 0x5b, 0x3f, 0x27, 0x5c, 0x40, 0x27, 0x65, 0x49, 0x30, 0x70, 0x54, 0x3b, 0x64, 0x4b, 0x2f, 0x6c, 0x50, 0x33, 0x6e, 0x4e, 0x33, 0x6b, 0x4b, 0x30, 0x71, 0x51, 0x35, 0x69, 0x4a, 0x2c, 0x76, 0x57, 0x39, 0x8e, 0x6b, 0x4b, 0x9c, 0x76, 0x57, 0x8a, 0x67, 0x48, 0x8d, 0x6a, 0x4b, 0x9d, 0x78, 0x55, 0x80, 0x5f, 0x3f, 0x7b, 0x5f, 0x44, 0x87, 0x67, 0x49, 0xac, 0x8b, 0x64, 0x8c, 0x6a, 0x48, 0xa0, 0x7c, 0x5a, 0x7d, 0x5e, 0x40, 0x89, 0x6d, 0x52, 0x84, 0x65, 0x48, 0x76, 0x55, 0x38, 0x8e, 0x69, 0x46, 0xad, 0x88, 0x62, 0xa0, 0x7c, 0x58, 0xb2, 0x8d, 0x6a, 0x6e, 0x51, 0x33, 0x7c, 0x5c, 0x3a, 0x90, 0x6f, 0x4f, 0x65, 0x4d, 0x35, 0x72, 0x58, 0x3d, 0x59, 0x3f, 0x2a, 0x99, 0x7c, 0x5e, 0x7d, 0x64, 0x4b, 0x46, 0x32, 0x1f, 0x67, 0x50, 0x35, 0x6d, 0x54, 0x3c, 0x85, 0x6b, 0x4f, 0x59, 0x43, 0x2e, 0x48, 0x32, 0x1d, 0x6a, 0x50, 0x38, 0x48, 0x34, 0x21, 0x5a, 0x40, 0x29, 0x33, 0x22, 0x14, 0x40, 0x2a, 0x18, 0x47, 0x2f, 0x22, 0x49, 0x32, 0x24, 0x48, 0x35, 0x2a, 0x31, 0x21, 0x18, 0x42, 0x32, 0x29, 0x3c, 0x2b, 0x23, 0x5b, 0x4d, 0x44, 0x69, 0x5a, 0x51, 0x7d, 0x75, 0x6f, 0x98, 0x94, 0x8d, 0xcf, 0xcf, 0xcb, 0xda, 0xda, 0xd6, 0xe7, 0xe8, 0xe5, 0xe4, 0xe4, 0xe2, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf3, 0xf3, 0xf2, 0xed, 0xed, 0xeb, 0xeb, 0xec, 0xe9, 0xde, 0xdf, 0xdd, 0xa7, 0xa7, 0xa5, 0x66, 0x67, 0x61, 0x81, 0x7d, 0x74, 0x5f, 0x58, 0x52, 0x48, 0x41, 0x3b, 0x54, 0x46, 0x3e, 0x36, 0x2c, 0x28, 0x2e, 0x1f, 0x16, 0x26, 0x18, 0x0f, 0x1c, 0x10, 0x08, 0x0f, 0x05, 0x03, 0x0f, 0x0a, 0x06, 0x16, 0x0c, 0x04, 0x18, 0x0d, 0x04, 0x1b, 0x12, 0x0b, 0x1e, 0x12, 0x08, 0x26, 0x17, 0x0a, 0x26, 0x1b, 0x10, 0x0f, 0x06, 0x04, 0x1d, 0x11, 0x06, 0x2e, 0x1a, 0x0c, 0x49, 0x35, 0x20, 0x16, 0x0e, 0x0a, 0x11, 0x08, 0x05, 0x1c, 0x11, 0x08, 0x09, 0x04, 0x02, 0x0a, 0x06, 0x05, 0x1c, 0x0f, 0x06, 0x27, 0x18, 0x0e, 0x20, 0x13, 0x0e, 0x2d, 0x20, 0x10, 0x32, 0x24, 0x15, 0x4e, 0x37, 0x23, 0x45, 0x2e, 0x1a, 0x39, 0x29, 0x16, 0x79, 0x5d, 0x40, 0x9e, 0x79, 0x59, 0x93, 0x6f, 0x4c, 0xbc, 0x95, 0x6e, 0xb2, 0x88, 0x60, 0xa7, 0x7f, 0x5a, 0x8f, 0x6b, 0x46, 0xac, 0x89, 0x60, 0x91, 0x6d, 0x4d, 0xae, 0x91, 0x69, 0x86, 0x67, 0x47, 0x98, 0x72, 0x50, 0x9a, 0x77, 0x57, 0xa0, 0x7d, 0x5d, 0x85, 0x63, 0x48, 0xa2, 0x81, 0x5f, 0x8b, 0x6c, 0x4e, 0x71, 0x52, 0x34, 0x67, 0x47, 0x2c, 0x77, 0x58, 0x3c, 0x5c, 0x41, 0x27, 0x57, 0x42, 0x2d, 0x65, 0x49, 0x30, 0x5a, 0x3e, 0x26, 0x77, 0x5b, 0x43, 0x72, 0x56, 0x3e, 0x5c, 0x43, 0x27, 0x6d, 0x51, 0x34, 0x79, 0x59, 0x3e, 0x76, 0x57, 0x3b, 0x78, 0x59, 0x3d, 0x6b, 0x4c, 0x2e, 0x83, 0x64, 0x46, 0xa2, 0x80, 0x60, 0x93, 0x6d, 0x4e, 0x8d, 0x6b, 0x47, 0x9c, 0x7a, 0x55, 0x98, 0x74, 0x52, 0x87, 0x67, 0x47, 0x75, 0x5a, 0x3e, 0x8b, 0x6a, 0x4c, 0x9e, 0x7b, 0x59, 0x91, 0x6d, 0x51, 0xac, 0x89, 0x67, 0x6d, 0x4e, 0x30, 0x83, 0x67, 0x4c, 0x83, 0x63, 0x46, 0x76, 0x57, 0x3b, 0x76, 0x56, 0x35, 0x9f, 0x7c, 0x57, 0xaa, 0x86, 0x62, 0xa2, 0x80, 0x5b, 0x6d, 0x54, 0x3a, 0x72, 0x55, 0x3c, 0x97, 0x77, 0x57, 0x58, 0x40, 0x28, 0x58, 0x3e, 0x23, 0x75, 0x5b, 0x46, 0x8f, 0x76, 0x5c, 0x5e, 0x48, 0x33, 0x3b, 0x26, 0x19, 0x5b, 0x43, 0x2d, 0x5a, 0x45, 0x2f, 0x66, 0x50, 0x37, 0x61, 0x4b, 0x36, 0x54, 0x3d, 0x29, 0x45, 0x2e, 0x1a, 0x43, 0x32, 0x22, 0x53, 0x39, 0x28, 0x28, 0x17, 0x0e, 0x42, 0x2c, 0x1b, 0x4d, 0x35, 0x27, 0x4d, 0x34, 0x26, 0x62, 0x4b, 0x3c, 0x3d, 0x2b, 0x1f, 0x34, 0x23, 0x1b, 0x46, 0x36, 0x2d, 0x5e, 0x4f, 0x46, 0x65, 0x57, 0x4e, 0x97, 0x8e, 0x89, 0x9e, 0x9b, 0x94, 0xc8, 0xc8, 0xc4, 0xd1, 0xd2, 0xce, 0xea, 0xeb, 0xe8, 0xef, 0xef, 0xed, 0xf5, 0xf5, 0xf5, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xed, 0xed, 0xec, 0xe6, 0xe6, 0xe4, 0xd7, 0xd7, 0xd5, 0xb9, 0xb8, 0xb4, 0x9f, 0x9e, 0x9a, 0x94, 0x8f, 0x8d, 0x80, 0x7b, 0x78, 0x64, 0x60, 0x57, 0x57, 0x4e, 0x47, 0x4d, 0x45, 0x3b, 0x31, 0x29, 0x20, 0x2e, 0x20, 0x15, 0x21, 0x12, 0x0c, 0x1a, 0x0f, 0x08, 0x1b, 0x11, 0x0b, 0x19, 0x0e, 0x09, 0x17, 0x0c, 0x06, 0x1c, 0x0f, 0x06, 0x1e, 0x13, 0x0d, 0x26, 0x18, 0x0f, 0x35, 0x23, 0x15, 0x25, 0x17, 0x0c, 0x10, 0x07, 0x00, 0x1f, 0x15, 0x0d, 0x1c, 0x14, 0x07, 0x22, 0x13, 0x08, 0x0c, 0x04, 0x02, 0x15, 0x0b, 0x04, 0x1f, 0x11, 0x0c, 0x08, 0x03, 0x02, 0x05, 0x03, 0x01, 0x17, 0x0b, 0x07, 0x17, 0x0b, 0x04, 0x15, 0x0a, 0x03, 0x1b, 0x0d, 0x04, 0x28, 0x1c, 0x0f, 0x48, 0x33, 0x21, 0x45, 0x2f, 0x1e, 0x1b, 0x0f, 0x05, 0x68, 0x53, 0x34, 0x83, 0x65, 0x44, 0x96, 0x75, 0x52, 0xad, 0x88, 0x63, 0xb6, 0x91, 0x66, 0xa1, 0x7c, 0x59, 0x9a, 0x77, 0x56, 0xab, 0x89, 0x64, 0x8d, 0x6a, 0x4a, 0xa7, 0x85, 0x64, 0x97, 0x75, 0x52, 0x9b, 0x78, 0x59, 0x8b, 0x68, 0x48, 0x9c, 0x7a, 0x59, 0x8a, 0x67, 0x49, 0xa3, 0x80, 0x62, 0x88, 0x69, 0x4d, 0x72, 0x52, 0x37, 0x77, 0x58, 0x3b, 0x80, 0x61, 0x43, 0x5c, 0x43, 0x26, 0x64, 0x4a, 0x34, 0x5e, 0x42, 0x26, 0x69, 0x4e, 0x32, 0x6e, 0x52, 0x36, 0x7c, 0x60, 0x44, 0x5f, 0x44, 0x28, 0x6a, 0x4f, 0x32, 0x6e, 0x50, 0x33, 0x79, 0x5a, 0x3c, 0x7a, 0x5b, 0x3e, 0x7f, 0x5f, 0x44, 0x76, 0x56, 0x3b, 0xa3, 0x7e, 0x5b, 0x91, 0x70, 0x4f, 0x92, 0x70, 0x4f, 0x95, 0x72, 0x51, 0x9a, 0x77, 0x51, 0x89, 0x6c, 0x49, 0x83, 0x64, 0x47, 0x8c, 0x6d, 0x4f, 0x98, 0x79, 0x57, 0x9f, 0x7f, 0x60, 0xa0, 0x81, 0x5d, 0x6b, 0x4c, 0x2c, 0x69, 0x50, 0x38, 0x87, 0x68, 0x47, 0x7c, 0x62, 0x45, 0x7e, 0x5f, 0x41, 0x95, 0x73, 0x50, 0x9c, 0x79, 0x55, 0x8d, 0x6c, 0x47, 0x82, 0x66, 0x48, 0x5e, 0x45, 0x32, 0x8d, 0x71, 0x54, 0x60, 0x4b, 0x32, 0x54, 0x3e, 0x27, 0x79, 0x5f, 0x45, 0x5f, 0x4a, 0x32, 0x4c, 0x3b, 0x27, 0x4a, 0x39, 0x28, 0x5e, 0x47, 0x33, 0x44, 0x30, 0x1f, 0x3e, 0x2a, 0x19, 0x45, 0x33, 0x25, 0x63, 0x4f, 0x38, 0x3f, 0x2d, 0x1e, 0x53, 0x3f, 0x2e, 0x49, 0x34, 0x20, 0x3d, 0x2c, 0x21, 0x33, 0x24, 0x1b, 0x5c, 0x43, 0x29, 0x58, 0x3d, 0x2c, 0x65, 0x4d, 0x36, 0x4d, 0x39, 0x2d, 0x3f, 0x2f, 0x23, 0x47, 0x36, 0x2a, 0x5c, 0x4a, 0x3f, 0x75, 0x6a, 0x5c, 0x7b, 0x74, 0x6b, 0xa3, 0xa0, 0x9a, 0xac, 0xaa, 0xa7, 0xdc, 0xdb, 0xd7, 0xe9, 0xe9, 0xe7, 0xf6, 0xf7, 0xf5, 0xf5, 0xf5, 0xf5, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf8, 0xec, 0xed, 0xec, 0xdc, 0xdd, 0xdb, 0xd4, 0xd5, 0xd2, 0xcb, 0xca, 0xc7, 0xbc, 0xbb, 0xb7, 0x84, 0x7e, 0x7c, 0x74, 0x6e, 0x6c, 0x6b, 0x68, 0x5f, 0x5a, 0x50, 0x4a, 0x47, 0x3a, 0x32, 0x34, 0x26, 0x1f, 0x2b, 0x1d, 0x12, 0x1f, 0x10, 0x0a, 0x25, 0x16, 0x0c, 0x25, 0x16, 0x0c, 0x1a, 0x0f, 0x08, 0x1d, 0x12, 0x0c, 0x19, 0x0f, 0x09, 0x1d, 0x12, 0x0b, 0x24, 0x16, 0x0d, 0x26, 0x19, 0x0e, 0x1e, 0x12, 0x09, 0x14, 0x0b, 0x04, 0x1b, 0x10, 0x0a, 0x1b, 0x12, 0x0a, 0x27, 0x18, 0x12, 0x0e, 0x06, 0x04, 0x16, 0x0c, 0x05, 0x17, 0x0b, 0x06, 0x09, 0x04, 0x03, 0x09, 0x02, 0x02, 0x0f, 0x07, 0x03, 0x11, 0x09, 0x06, 0x0b, 0x03, 0x01, 0x1c, 0x13, 0x0c, 0x15, 0x0c, 0x07, 0x47, 0x34, 0x26, 0x42, 0x2f, 0x20, 0x28, 0x18, 0x0e, 0x4b, 0x36, 0x1d, 0x63, 0x4a, 0x2e, 0x93, 0x76, 0x56, 0x9f, 0x7d, 0x5b, 0xad, 0x8a, 0x62, 0x97, 0x74, 0x54, 0x95, 0x72, 0x51, 0x9f, 0x7c, 0x59, 0x9a, 0x77, 0x57, 0xa1, 0x7e, 0x5e, 0xaa, 0x88, 0x65, 0x83, 0x60, 0x41, 0x8e, 0x6b, 0x4b, 0x97, 0x74, 0x54, 0x8a, 0x67, 0x49, 0x99, 0x76, 0x57, 0x89, 0x6a, 0x4e, 0x79, 0x59, 0x3e, 0x74, 0x55, 0x38, 0x76, 0x57, 0x3a, 0x68, 0x4f, 0x31, 0x60, 0x46, 0x2f, 0x65, 0x4a, 0x2d, 0x6c, 0x51, 0x34, 0x6a, 0x4f, 0x32, 0x7d, 0x61, 0x45, 0x69, 0x4d, 0x31, 0x73, 0x58, 0x3b, 0x66, 0x49, 0x2c, 0x7c, 0x5d, 0x40, 0x7c, 0x5d, 0x3f, 0x7d, 0x5e, 0x43, 0x70, 0x51, 0x36, 0x98, 0x76, 0x55, 0x7e, 0x61, 0x43, 0x96, 0x73, 0x53, 0x98, 0x75, 0x55, 0x98, 0x75, 0x53, 0x86, 0x68, 0x48, 0x91, 0x72, 0x54, 0x8c, 0x6d, 0x4f, 0x7a, 0x5b, 0x3e, 0xa7, 0x88, 0x65, 0x7d, 0x63, 0x44, 0x61, 0x44, 0x2a, 0x7e, 0x65, 0x4f, 0x98, 0x79, 0x58, 0x74, 0x5d, 0x41, 0x6d, 0x52, 0x37, 0x92, 0x74, 0x55, 0x92, 0x74, 0x53, 0x7b, 0x5d, 0x3c, 0x8e, 0x71, 0x55, 0x73, 0x5a, 0x43, 0x7a, 0x5e, 0x45, 0x4b, 0x37, 0x21, 0x58, 0x41, 0x2b, 0x81, 0x66, 0x4c, 0x57, 0x41, 0x2f, 0x44, 0x31, 0x22, 0x59, 0x45, 0x31, 0x3d, 0x2b, 0x1a, 0x2b, 0x1b, 0x0e, 0x36, 0x26, 0x19, 0x34, 0x22, 0x14, 0x60, 0x4c, 0x36, 0x2f, 0x1d, 0x0f, 0x44, 0x2f, 0x1e, 0x4a, 0x36, 0x23, 0x49, 0x33, 0x24, 0x33, 0x26, 0x19, 0x4d, 0x37, 0x25, 0x64, 0x4e, 0x39, 0x56, 0x41, 0x32, 0x52, 0x41, 0x32, 0x45, 0x35, 0x29, 0x50, 0x3f, 0x33, 0x56, 0x44, 0x38, 0x7e, 0x73, 0x65, 0x7d, 0x75, 0x6b, 0xa1, 0x9e, 0x99, 0xb6, 0xb4, 0xb1, 0xca, 0xc8, 0xc5, 0xda, 0xdb, 0xd8, 0xf7, 0xf8, 0xf6, 0xfb, 0xfb, 0xfb, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfa, 0xfa, 0xfb, 0xfb, 0xfa, 0xf5, 0xf5, 0xf3, 0xe4, 0xe4, 0xe2, 0xdc, 0xdd, 0xdb, 0xd0, 0xd0, 0xce, 0xce, 0xce, 0xcc, 0x9c, 0x9d, 0x97, 0x91, 0x8c, 0x85, 0x7f, 0x7b, 0x7a, 0x54, 0x4b, 0x45, 0x47, 0x3b, 0x34, 0x43, 0x34, 0x2b, 0x29, 0x20, 0x15, 0x27, 0x16, 0x0e, 0x23, 0x12, 0x0c, 0x2b, 0x1a, 0x12, 0x25, 0x19, 0x0f, 0x1a, 0x11, 0x0a, 0x15, 0x0c, 0x05, 0x16, 0x0b, 0x06, 0x1e, 0x12, 0x0c, 0x27, 0x1b, 0x13, 0x1a, 0x0f, 0x07, 0x1c, 0x12, 0x0b, 0x0e, 0x08, 0x03, 0x24, 0x17, 0x0c, 0x16, 0x0f, 0x0a, 0x1a, 0x0c, 0x05, 0x13, 0x0b, 0x09, 0x18, 0x0d, 0x07, 0x20, 0x13, 0x0b, 0x0c, 0x05, 0x00, 0x08, 0x03, 0x01, 0x0b, 0x05, 0x01, 0x08, 0x02, 0x02, 0x0a, 0x04, 0x04, 0x15, 0x0c, 0x06, 0x13, 0x08, 0x02, 0x2d, 0x1f, 0x13, 0x34, 0x20, 0x11, 0x21, 0x13, 0x05, 0x34, 0x22, 0x0f, 0x4d, 0x37, 0x1d, 0x95, 0x76, 0x58, 0x88, 0x68, 0x4a, 0xac, 0x89, 0x66, 0x9f, 0x7c, 0x5a, 0x8b, 0x6a, 0x4b, 0xa8, 0x86, 0x65, 0x93, 0x6e, 0x4d, 0x81, 0x60, 0x3f, 0x9a, 0x7a, 0x57, 0x77, 0x57, 0x36, 0x8d, 0x6d, 0x4c, 0x99, 0x78, 0x57, 0x82, 0x61, 0x45, 0x93, 0x72, 0x52, 0x89, 0x69, 0x4a, 0x8d, 0x70, 0x55, 0x7c, 0x5d, 0x3e, 0x75, 0x55, 0x38, 0x73, 0x57, 0x3a, 0x5c, 0x42, 0x2b, 0x61, 0x46, 0x2b, 0x67, 0x48, 0x2b, 0x74, 0x56, 0x3a, 0x81, 0x65, 0x48, 0x6c, 0x54, 0x34, 0x6b, 0x52, 0x36, 0x56, 0x3b, 0x21, 0x79, 0x59, 0x3c, 0x85, 0x65, 0x44, 0x7f, 0x62, 0x46, 0x7f, 0x64, 0x49, 0x82, 0x64, 0x46, 0x73, 0x56, 0x3b, 0x95, 0x75, 0x56, 0x83, 0x63, 0x44, 0xa4, 0x80, 0x5f, 0x6d, 0x4e, 0x35, 0x8a, 0x6b, 0x4f, 0x74, 0x55, 0x37, 0x4a, 0x31, 0x1d, 0xa1, 0x82, 0x61, 0x82, 0x67, 0x48, 0x6b, 0x51, 0x3b, 0x6f, 0x56, 0x3d, 0x80, 0x66, 0x44, 0x73, 0x5b, 0x40, 0x5c, 0x43, 0x2b, 0x8c, 0x6d, 0x4d, 0x85, 0x6b, 0x49, 0x88, 0x69, 0x4a, 0x80, 0x63, 0x46, 0x72, 0x59, 0x3f, 0x7e, 0x65, 0x4a, 0x54, 0x40, 0x2b, 0x53, 0x3f, 0x26, 0x65, 0x50, 0x36, 0x4a, 0x37, 0x25, 0x30, 0x1f, 0x0e, 0x58, 0x43, 0x2e, 0x2a, 0x1c, 0x0d, 0x1b, 0x0d, 0x07, 0x25, 0x13, 0x0a, 0x33, 0x21, 0x15, 0x59, 0x45, 0x2c, 0x29, 0x16, 0x0e, 0x4f, 0x3b, 0x26, 0x4e, 0x3a, 0x27, 0x3f, 0x2a, 0x1a, 0x4d, 0x3a, 0x2a, 0x47, 0x2f, 0x25, 0x58, 0x42, 0x2d, 0x48, 0x37, 0x2c, 0x5d, 0x4a, 0x3b, 0x4e, 0x3e, 0x34, 0x47, 0x37, 0x2c, 0x55, 0x45, 0x38, 0x71, 0x63, 0x56, 0x76, 0x6d, 0x64, 0x8c, 0x86, 0x82, 0xcb, 0xc9, 0xc6, 0xc3, 0xc1, 0xbe, 0xd5, 0xd5, 0xd3, 0xe8, 0xe9, 0xe6, 0xf9, 0xf9, 0xf9, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfa, 0xfa, 0xfa, 0xf8, 0xf8, 0xf8, 0xfb, 0xfb, 0xfa, 0xed, 0xed, 0xeb, 0xeb, 0xec, 0xe9, 0xe1, 0xe1, 0xdf, 0xed, 0xed, 0xeb, 0xae, 0xae, 0xae, 0x9e, 0x9f, 0x99, 0x88, 0x86, 0x7f, 0x63, 0x5c, 0x57, 0x4e, 0x44, 0x40, 0x3f, 0x31, 0x29, 0x31, 0x26, 0x1f, 0x29, 0x1d, 0x17, 0x2b, 0x1a, 0x12, 0x28, 0x17, 0x0f, 0x22, 0x12, 0x09, 0x22, 0x18, 0x0d, 0x19, 0x10, 0x09, 0x13, 0x0b, 0x04, 0x1a, 0x12, 0x0d, 0x17, 0x0b, 0x05, 0x22, 0x16, 0x0e, 0x1e, 0x13, 0x0b, 0x1c, 0x12, 0x0c, 0x09, 0x05, 0x01, 0x2b, 0x1d, 0x10, 0x12, 0x09, 0x06, 0x22, 0x13, 0x0c, 0x11, 0x07, 0x03, 0x1e, 0x10, 0x08, 0x19, 0x0c, 0x02, 0x1a, 0x11, 0x0b, 0x06, 0x03, 0x00, 0x08, 0x03, 0x00, 0x0b, 0x05, 0x05, 0x08, 0x02, 0x02, 0x10, 0x07, 0x01, 0x16, 0x0a, 0x00, 0x27, 0x19, 0x0f, 0x1c, 0x0f, 0x04, 0x10, 0x04, 0x00, 0x31, 0x20, 0x0d, 0x3f, 0x2c, 0x14, 0x80, 0x63, 0x46, 0x7b, 0x5f, 0x44, 0xa7, 0x87, 0x67, 0x9b, 0x78, 0x57, 0x84, 0x63, 0x44, 0x98, 0x76, 0x57, 0x92, 0x71, 0x50, 0x66, 0x49, 0x2c, 0x79, 0x5b, 0x3d, 0x88, 0x6a, 0x4c, 0x82, 0x60, 0x43, 0x8f, 0x6e, 0x50, 0x79, 0x5a, 0x3e, 0x8e, 0x6f, 0x4f, 0x95, 0x74, 0x54, 0x7b, 0x60, 0x45, 0x7f, 0x61, 0x40, 0x78, 0x59, 0x3c, 0x82, 0x65, 0x49, 0x4f, 0x37, 0x1f, 0x61, 0x46, 0x2c, 0x7b, 0x5a, 0x3d, 0x8d, 0x6d, 0x4e, 0x7a, 0x5e, 0x42, 0x6d, 0x56, 0x3a, 0x56, 0x3e, 0x26, 0x59, 0x41, 0x2a, 0x65, 0x4a, 0x2e, 0x85, 0x66, 0x48, 0x7c, 0x5f, 0x42, 0x61, 0x49, 0x30, 0x6c, 0x52, 0x38, 0x86, 0x6c, 0x52, 0x84, 0x68, 0x4c, 0x85, 0x69, 0x4d, 0x98, 0x78, 0x58, 0x73, 0x56, 0x3b, 0x79, 0x5d, 0x43, 0x73, 0x57, 0x3c, 0x5a, 0x3f, 0x2b, 0x92, 0x74, 0x56, 0x77, 0x5a, 0x3d, 0x6d, 0x55, 0x3b, 0x66, 0x4c, 0x35, 0x81, 0x68, 0x4a, 0x56, 0x43, 0x2b, 0x68, 0x4c, 0x35, 0x7f, 0x64, 0x47, 0x5d, 0x46, 0x2c, 0x80, 0x62, 0x46, 0x7f, 0x64, 0x49, 0x5c, 0x45, 0x2d, 0x62, 0x4d, 0x39, 0x3a, 0x2a, 0x19, 0x4e, 0x3b, 0x26, 0x4b, 0x38, 0x24, 0x3d, 0x2c, 0x1b, 0x3b, 0x29, 0x19, 0x3c, 0x2a, 0x1b, 0x3a, 0x29, 0x1b, 0x1d, 0x0f, 0x09, 0x2d, 0x1b, 0x0f, 0x39, 0x27, 0x1d, 0x55, 0x41, 0x28, 0x31, 0x1f, 0x15, 0x3f, 0x2a, 0x17, 0x3d, 0x2a, 0x16, 0x3c, 0x29, 0x1a, 0x44, 0x2e, 0x1d, 0x48, 0x30, 0x24, 0x54, 0x3d, 0x2f, 0x4d, 0x37, 0x26, 0x60, 0x4c, 0x3e, 0x56, 0x45, 0x3d, 0x45, 0x35, 0x2b, 0x44, 0x35, 0x28, 0x62, 0x52, 0x45, 0x7f, 0x74, 0x6c, 0x86, 0x80, 0x7c, 0xb5, 0xb4, 0xb0, 0xce, 0xcc, 0xc9, 0xd9, 0xd9, 0xd7, 0xe5, 0xe5, 0xe3, 0xf5, 0xf5, 0xf5, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xee, 0xee, 0xed, 0xf5, 0xf5, 0xf4, 0xee, 0xee, 0xec, 0xe2, 0xe2, 0xe0, 0x9e, 0x9e, 0x9c, 0x9b, 0x9a, 0x96, 0x72, 0x70, 0x6b, 0x65, 0x5c, 0x55, 0x47, 0x3d, 0x38, 0x3f, 0x30, 0x29, 0x2e, 0x26, 0x23, 0x26, 0x19, 0x17, 0x31, 0x20, 0x17, 0x32, 0x21, 0x18, 0x31, 0x22, 0x18, 0x1b, 0x10, 0x07, 0x19, 0x0f, 0x09, 0x1b, 0x11, 0x0a, 0x12, 0x0c, 0x09, 0x1d, 0x10, 0x08, 0x29, 0x1c, 0x11, 0x1f, 0x16, 0x0c, 0x14, 0x0a, 0x04, 0x15, 0x0d, 0x09, 0x24, 0x16, 0x08, 0x10, 0x07, 0x04, 0x21, 0x15, 0x10, 0x17, 0x0a, 0x03, 0x23, 0x13, 0x08, 0x1f, 0x10, 0x05, 0x15, 0x0d, 0x07, 0x0c, 0x07, 0x03, 0x06, 0x02, 0x00, 0x09, 0x02, 0x01, 0x0b, 0x04, 0x04, 0x0f, 0x08, 0x03, 0x24, 0x18, 0x0f, 0x1b, 0x0f, 0x06, 0x08, 0x02, 0x00, 0x17, 0x0b, 0x02, 0x1f, 0x10, 0x05, 0x2f, 0x1c, 0x0e, 0x60, 0x49, 0x30, 0x71, 0x58, 0x3d, 0x94, 0x76, 0x57, 0x8c, 0x6b, 0x4d, 0x7a, 0x5a, 0x3b, 0x82, 0x63, 0x43, 0x8d, 0x70, 0x53, 0x56, 0x3b, 0x21, 0x72, 0x56, 0x3a, 0x86, 0x6a, 0x4e, 0x86, 0x65, 0x4b, 0x75, 0x55, 0x3d, 0x7d, 0x5e, 0x43, 0x7f, 0x61, 0x43, 0x99, 0x78, 0x59, 0x79, 0x5d, 0x42, 0x7f, 0x62, 0x43, 0x6e, 0x51, 0x35, 0x78, 0x5b, 0x40, 0x5d, 0x44, 0x2c, 0x5f, 0x44, 0x29, 0x7c, 0x5e, 0x41, 0x8b, 0x6c, 0x4a, 0x82, 0x66, 0x4a, 0x5e, 0x47, 0x2f, 0x4a, 0x32, 0x1d, 0x52, 0x3b, 0x26, 0x5a, 0x42, 0x28, 0x7d, 0x61, 0x45, 0x82, 0x65, 0x4a, 0x6e, 0x57, 0x3f, 0x6c, 0x55, 0x3e, 0x73, 0x5c, 0x45, 0x8b, 0x71, 0x58, 0x7d, 0x62, 0x48, 0x8d, 0x70, 0x53, 0x7a, 0x61, 0x41, 0x64, 0x4b, 0x34, 0x66, 0x4d, 0x34, 0x6a, 0x4e, 0x36, 0x85, 0x69, 0x4c, 0x5a, 0x3f, 0x29, 0x67, 0x50, 0x37, 0x65, 0x4a, 0x34, 0x84, 0x6a, 0x50, 0x4b, 0x39, 0x27, 0x78, 0x5d, 0x44, 0x5f, 0x48, 0x31, 0x3e, 0x2a, 0x1b, 0x77, 0x5f, 0x45, 0x61, 0x49, 0x31, 0x61, 0x4c, 0x35, 0x43, 0x30, 0x23, 0x28, 0x1d, 0x12, 0x1c, 0x0b, 0x00, 0x3a, 0x26, 0x13, 0x21, 0x0e, 0x00, 0x3f, 0x2e, 0x21, 0x2a, 0x1a, 0x11, 0x36, 0x21, 0x13, 0x22, 0x16, 0x0c, 0x38, 0x27, 0x18, 0x36, 0x24, 0x19, 0x45, 0x30, 0x1a, 0x31, 0x1f, 0x13, 0x45, 0x31, 0x21, 0x4e, 0x39, 0x25, 0x48, 0x33, 0x24, 0x40, 0x2b, 0x1b, 0x51, 0x3b, 0x29, 0x3e, 0x28, 0x1e, 0x66, 0x4c, 0x37, 0x5e, 0x49, 0x3a, 0x5d, 0x4c, 0x42, 0x3c, 0x2c, 0x24, 0x3f, 0x30, 0x24, 0x5e, 0x4f, 0x43, 0x91, 0x88, 0x80, 0x78, 0x70, 0x6b, 0xac, 0xa9, 0xa4, 0xc9, 0xc8, 0xc4, 0xd4, 0xd4, 0xd1, 0xe6, 0xe6, 0xe4, 0xf1, 0xf1, 0xf0, 0xfb, 0xfb, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xf9, 0xf9, 0xf9, 0xef, 0xef, 0xee, 0xed, 0xed, 0xeb, 0xae, 0xae, 0xac, 0xb7, 0xb6, 0xb1, 0x83, 0x81, 0x7f, 0x82, 0x7d, 0x77, 0x5a, 0x55, 0x4f, 0x42, 0x3a, 0x32, 0x39, 0x2c, 0x26, 0x27, 0x1f, 0x1c, 0x26, 0x19, 0x13, 0x27, 0x18, 0x0b, 0x36, 0x26, 0x1a, 0x29, 0x1a, 0x0f, 0x17, 0x0e, 0x05, 0x18, 0x0f, 0x0c, 0x1a, 0x0e, 0x07, 0x1a, 0x0d, 0x09, 0x22, 0x15, 0x0b, 0x1d, 0x12, 0x07, 0x17, 0x0e, 0x06, 0x19, 0x0f, 0x09, 0x17, 0x0a, 0x02, 0x25, 0x16, 0x09, 0x1b, 0x10, 0x0b, 0x10, 0x0a, 0x07, 0x25, 0x1a, 0x12, 0x1e, 0x0e, 0x01, 0x23, 0x13, 0x06, 0x15, 0x0c, 0x05, 0x11, 0x08, 0x01, 0x0d, 0x07, 0x04, 0x0a, 0x02, 0x01, 0x0c, 0x04, 0x03, 0x03, 0x02, 0x00, 0x1d, 0x13, 0x0e, 0x20, 0x14, 0x0c, 0x0b, 0x03, 0x02, 0x29, 0x1c, 0x13, 0x12, 0x08, 0x00, 0x2b, 0x19, 0x0a, 0x48, 0x34, 0x21, 0x4b, 0x34, 0x1e, 0x82, 0x68, 0x49, 0x7c, 0x5e, 0x46, 0x6d, 0x50, 0x33, 0x75, 0x5a, 0x3a, 0x72, 0x58, 0x3f, 0x5f, 0x45, 0x2b, 0x63, 0x48, 0x2c, 0x81, 0x66, 0x4b, 0x8a, 0x6c, 0x50, 0x63, 0x49, 0x2f, 0x6e, 0x51, 0x36, 0x6f, 0x52, 0x37, 0x97, 0x76, 0x5a, 0x87, 0x6b, 0x51, 0x77, 0x5a, 0x3f, 0x60, 0x47, 0x2c, 0x6a, 0x50, 0x37, 0x5f, 0x45, 0x2c, 0x6c, 0x51, 0x35, 0x82, 0x66, 0x4a, 0x80, 0x62, 0x44, 0x7e, 0x62, 0x47, 0x57, 0x40, 0x29, 0x3f, 0x2b, 0x16, 0x4b, 0x36, 0x1f, 0x50, 0x39, 0x21, 0x69, 0x51, 0x39, 0x78, 0x5c, 0x44, 0x77, 0x5f, 0x4a, 0x66, 0x4d, 0x38, 0x5b, 0x43, 0x2d, 0x77, 0x60, 0x4a, 0x7e, 0x62, 0x49, 0x7b, 0x62, 0x45, 0x75, 0x5d, 0x40, 0x5c, 0x44, 0x2d, 0x6a, 0x51, 0x38, 0x5d, 0x44, 0x2e, 0x73, 0x58, 0x3b, 0x56, 0x42, 0x2f, 0x35, 0x20, 0x0e, 0x83, 0x65, 0x4c, 0x6f, 0x54, 0x3e, 0x71, 0x58, 0x46, 0x73, 0x5b, 0x43, 0x5d, 0x44, 0x30, 0x39, 0x26, 0x15, 0x60, 0x47, 0x30, 0x55, 0x3c, 0x26, 0x56, 0x3e, 0x28, 0x29, 0x18, 0x0b, 0x25, 0x1c, 0x0e, 0x29, 0x18, 0x0f, 0x3f, 0x2b, 0x1a, 0x2c, 0x19, 0x0a, 0x32, 0x22, 0x14, 0x34, 0x22, 0x17, 0x3b, 0x2a, 0x19, 0x1a, 0x0f, 0x06, 0x3a, 0x26, 0x17, 0x45, 0x32, 0x23, 0x52, 0x3b, 0x29, 0x3b, 0x27, 0x1b, 0x33, 0x20, 0x0f, 0x5a, 0x44, 0x32, 0x55, 0x3c, 0x29, 0x41, 0x2e, 0x1e, 0x49, 0x36, 0x24, 0x39, 0x27, 0x1c, 0x45, 0x32, 0x22, 0x5f, 0x49, 0x37, 0x58, 0x45, 0x39, 0x3b, 0x2c, 0x24, 0x3e, 0x30, 0x27, 0x51, 0x42, 0x39, 0x82, 0x7a, 0x73, 0x8e, 0x87, 0x80, 0x93, 0x8c, 0x85, 0xb9, 0xb7, 0xb3, 0xc6, 0xc7, 0xc2, 0xde, 0xde, 0xdf, 0xf5, 0xf5, 0xf3, 0xfb, 0xfc, 0xfa, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xf8, 0xf8, 0xf8, 0xe8, 0xe8, 0xe8, 0xe1, 0xe1, 0xdf, 0xce, 0xcf, 0xcd, 0x82, 0x80, 0x7e, 0x7e, 0x7d, 0x74, 0x90, 0x8b, 0x85, 0x5b, 0x56, 0x50, 0x44, 0x40, 0x37, 0x36, 0x2e, 0x27, 0x38, 0x2c, 0x25, 0x2f, 0x20, 0x16, 0x34, 0x24, 0x18, 0x2c, 0x1c, 0x0f, 0x2d, 0x19, 0x10, 0x1d, 0x0e, 0x07, 0x11, 0x09, 0x06, 0x1a, 0x0e, 0x06, 0x1e, 0x0c, 0x04, 0x24, 0x16, 0x0f, 0x1a, 0x11, 0x0b, 0x14, 0x0a, 0x08, 0x1a, 0x10, 0x0a, 0x25, 0x17, 0x0f, 0x27, 0x16, 0x0f, 0x1a, 0x0c, 0x03, 0x20, 0x15, 0x0f, 0x27, 0x1b, 0x13, 0x31, 0x21, 0x14, 0x20, 0x14, 0x0a, 0x27, 0x19, 0x0e, 0x17, 0x09, 0x00, 0x14, 0x0b, 0x04, 0x0c, 0x05, 0x03, 0x0a, 0x02, 0x01, 0x09, 0x04, 0x00, 0x17, 0x0c, 0x05, 0x0f, 0x02, 0x00, 0x10, 0x08, 0x06, 0x13, 0x0a, 0x03, 0x0c, 0x05, 0x00, 0x26, 0x15, 0x06, 0x36, 0x23, 0x11, 0x33, 0x20, 0x11, 0x53, 0x40, 0x29, 0x73, 0x5b, 0x44, 0x5b, 0x41, 0x27, 0x72, 0x58, 0x3c, 0x5e, 0x44, 0x2a, 0x6c, 0x52, 0x39, 0x55, 0x3f, 0x26, 0x62, 0x4c, 0x33, 0x85, 0x67, 0x4a, 0x64, 0x4b, 0x31, 0x67, 0x4b, 0x2f, 0x71, 0x55, 0x39, 0x8d, 0x6c, 0x50, 0x7a, 0x5c, 0x43, 0x7c, 0x5f, 0x44, 0x5d, 0x46, 0x2b, 0x4f, 0x35, 0x1b, 0x64, 0x4a, 0x31, 0x6f, 0x54, 0x37, 0x72, 0x56, 0x3a, 0x6a, 0x4c, 0x2f, 0x7f, 0x63, 0x48, 0x53, 0x3f, 0x27, 0x37, 0x27, 0x10, 0x3e, 0x2d, 0x17, 0x4f, 0x3c, 0x28, 0x54, 0x40, 0x2d, 0x6e, 0x55, 0x3f, 0x87, 0x6a, 0x50, 0x68, 0x4f, 0x39, 0x6c, 0x54, 0x3e, 0x6a, 0x56, 0x43, 0x74, 0x5d, 0x47, 0x5b, 0x47, 0x2d, 0x74, 0x60, 0x46, 0x5f, 0x48, 0x30, 0x66, 0x4c, 0x33, 0x5c, 0x45, 0x30, 0x53, 0x3f, 0x2a, 0x51, 0x3b, 0x28, 0x45, 0x30, 0x1d, 0x81, 0x63, 0x49, 0x68, 0x4f, 0x39, 0x6a, 0x52, 0x3f, 0x7d, 0x65, 0x4d, 0x52, 0x3a, 0x26, 0x41, 0x2e, 0x1d, 0x57, 0x3e, 0x29, 0x46, 0x2d, 0x18, 0x4b, 0x34, 0x1f, 0x25, 0x15, 0x0a, 0x2b, 0x1c, 0x09, 0x40, 0x2b, 0x1f, 0x25, 0x17, 0x09, 0x25, 0x15, 0x08, 0x37, 0x24, 0x15, 0x2d, 0x1b, 0x10, 0x44, 0x33, 0x23, 0x2d, 0x1d, 0x11, 0x45, 0x2d, 0x1a, 0x46, 0x30, 0x1e, 0x56, 0x3b, 0x27, 0x44, 0x31, 0x1d, 0x56, 0x42, 0x35, 0x4e, 0x38, 0x28, 0x62, 0x43, 0x2b, 0x52, 0x3c, 0x2b, 0x46, 0x33, 0x21, 0x40, 0x2f, 0x26, 0x29, 0x1a, 0x0e, 0x52, 0x3f, 0x30, 0x4f, 0x3d, 0x31, 0x3c, 0x2e, 0x26, 0x3d, 0x2e, 0x25, 0x4c, 0x3e, 0x34, 0x67, 0x5a, 0x54, 0x9b, 0x98, 0x8f, 0x9c, 0x95, 0x8f, 0xbe, 0xbb, 0xb7, 0xca, 0xcb, 0xc6, 0xcf, 0xcf, 0xcf, 0xf6, 0xf7, 0xf5, 0xfb, 0xfc, 0xfa, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfa, 0xfb, 0xf8, 0xe0, 0xe0, 0xde, 0xdb, 0xdc, 0xd9, 0xc1, 0xc2, 0xc0, 0xa3, 0xa2, 0xa0, 0x9b, 0x9a, 0x92, 0xb1, 0xae, 0xaa, 0x59, 0x52, 0x50, 0x41, 0x3a, 0x34, 0x33, 0x2c, 0x26, 0x2a, 0x1e, 0x16, 0x2d, 0x1c, 0x15, 0x30, 0x1e, 0x12, 0x39, 0x27, 0x1b, 0x31, 0x1e, 0x13, 0x25, 0x16, 0x0f, 0x20, 0x13, 0x0c, 0x23, 0x16, 0x0f, 0x1e, 0x12, 0x09, 0x15, 0x09, 0x06, 0x1d, 0x14, 0x0b, 0x10, 0x07, 0x06, 0x1d, 0x12, 0x08, 0x25, 0x15, 0x09, 0x25, 0x15, 0x0a, 0x1f, 0x10, 0x07, 0x1b, 0x11, 0x07, 0x28, 0x1d, 0x17, 0x22, 0x17, 0x10, 0x20, 0x11, 0x09, 0x2f, 0x1c, 0x11, 0x32, 0x20, 0x11, 0x1a, 0x0f, 0x06, 0x15, 0x09, 0x04, 0x0a, 0x03, 0x00, 0x07, 0x03, 0x02, 0x12, 0x0a, 0x05, 0x14, 0x09, 0x08, 0x09, 0x04, 0x02, 0x0a, 0x02, 0x00, 0x0a, 0x03, 0x01, 0x0d, 0x04, 0x00, 0x28, 0x17, 0x0b, 0x29, 0x19, 0x0a, 0x2d, 0x21, 0x11, 0x50, 0x3e, 0x27, 0x4f, 0x39, 0x25, 0x57, 0x3e, 0x25, 0x56, 0x40, 0x2a, 0x48, 0x31, 0x1f, 0x64, 0x4b, 0x34, 0x5c, 0x44, 0x2c, 0x8f, 0x71, 0x52, 0x5e, 0x42, 0x2a, 0x5c, 0x43, 0x2c, 0x7c, 0x5e, 0x45, 0x7f, 0x64, 0x4b, 0x68, 0x4e, 0x35, 0x80, 0x64, 0x46, 0x56, 0x3d, 0x26, 0x56, 0x3f, 0x25, 0x6f, 0x54, 0x36, 0x77, 0x5a, 0x3a, 0x70, 0x56, 0x3a, 0x51, 0x39, 0x1f, 0x80, 0x62, 0x46, 0x5a, 0x45, 0x2e, 0x35, 0x23, 0x0d, 0x3f, 0x2d, 0x19, 0x43, 0x30, 0x1e, 0x4e, 0x3b, 0x29, 0x4b, 0x3a, 0x27, 0x85, 0x6a, 0x51, 0x60, 0x4a, 0x35, 0x5c, 0x45, 0x33, 0x5b, 0x47, 0x37, 0x76, 0x5d, 0x4a, 0x50, 0x3d, 0x2a, 0x64, 0x4d, 0x36, 0x6c, 0x54, 0x3c, 0x64, 0x4c, 0x34, 0x5f, 0x47, 0x2f, 0x56, 0x43, 0x2e, 0x3f, 0x28, 0x14, 0x43, 0x2c, 0x18, 0x82, 0x65, 0x4b, 0x6d, 0x53, 0x3b, 0x65, 0x4f, 0x34, 0x68, 0x52, 0x3c, 0x45, 0x2e, 0x1c, 0x47, 0x36, 0x25, 0x49, 0x33, 0x1e, 0x5d, 0x42, 0x28, 0x5b, 0x47, 0x33, 0x2b, 0x1c, 0x0c, 0x2f, 0x20, 0x0e, 0x1e, 0x0f, 0x03, 0x34, 0x22, 0x15, 0x36, 0x25, 0x15, 0x3a, 0x28, 0x18, 0x2e, 0x1c, 0x0e, 0x3f, 0x2e, 0x1f, 0x3c, 0x2b, 0x1c, 0x43, 0x2c, 0x17, 0x4f, 0x38, 0x23, 0x58, 0x41, 0x2c, 0x59, 0x47, 0x33, 0x45, 0x2b, 0x19, 0x31, 0x23, 0x16, 0x5a, 0x43, 0x2f, 0x4d, 0x35, 0x25, 0x41, 0x2f, 0x21, 0x42, 0x2d, 0x21, 0x3b, 0x26, 0x20, 0x53, 0x40, 0x32, 0x53, 0x42, 0x34, 0x4a, 0x39, 0x2c, 0x47, 0x35, 0x2c, 0x43, 0x36, 0x2f, 0x4f, 0x46, 0x40, 0x85, 0x7a, 0x70, 0xa9, 0xa2, 0x9b, 0xb3, 0xb1, 0xad, 0xc6, 0xc6, 0xc4, 0xd8, 0xd8, 0xd6, 0xee, 0xee, 0xec, 0xfc, 0xfc, 0xfa, 0xfb, 0xfb, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfb, 0xf4, 0xf4, 0xf2, 0xe6, 0xe7, 0xe5, 0xd6, 0xd6, 0xd4, 0xcc, 0xcd, 0xcb, 0x96, 0x95, 0x93, 0xbe, 0xbd, 0xb5, 0xa9, 0xa6, 0xa3, 0x60, 0x59, 0x57, 0x46, 0x3f, 0x39, 0x3b, 0x34, 0x2e, 0x33, 0x27, 0x1f, 0x26, 0x15, 0x0f, 0x3a, 0x28, 0x1c, 0x38, 0x26, 0x1a, 0x33, 0x20, 0x14, 0x1b, 0x0c, 0x05, 0x1b, 0x10, 0x0b, 0x1c, 0x12, 0x0d, 0x1e, 0x14, 0x0c, 0x14, 0x09, 0x06, 0x1e, 0x13, 0x0d, 0x24, 0x19, 0x11, 0x21, 0x15, 0x0f, 0x18, 0x0c, 0x03, 0x17, 0x0b, 0x01, 0x21, 0x14, 0x0a, 0x27, 0x17, 0x0f, 0x1e, 0x13, 0x0d, 0x11, 0x06, 0x00, 0x3a, 0x27, 0x15, 0x1f, 0x15, 0x0c, 0x29, 0x1d, 0x13, 0x0b, 0x07, 0x03, 0x1b, 0x0f, 0x09, 0x0a, 0x03, 0x00, 0x06, 0x01, 0x01, 0x14, 0x0a, 0x06, 0x0f, 0x05, 0x00, 0x09, 0x05, 0x05, 0x09, 0x01, 0x00, 0x0c, 0x04, 0x03, 0x06, 0x00, 0x00, 0x1d, 0x0f, 0x07, 0x16, 0x0d, 0x01, 0x26, 0x18, 0x0d, 0x21, 0x16, 0x0b, 0x51, 0x3b, 0x26, 0x3c, 0x2b, 0x1b, 0x43, 0x31, 0x20, 0x3c, 0x29, 0x15, 0x55, 0x3d, 0x25, 0x5c, 0x44, 0x2c, 0x73, 0x59, 0x3d, 0x54, 0x3c, 0x27, 0x56, 0x3d, 0x26, 0x70, 0x51, 0x3a, 0x79, 0x60, 0x46, 0x73, 0x59, 0x3f, 0x5f, 0x46, 0x2d, 0x53, 0x3e, 0x26, 0x54, 0x3d, 0x26, 0x66, 0x4a, 0x30, 0x74, 0x56, 0x3b, 0x6e, 0x54, 0x3c, 0x41, 0x2d, 0x17, 0x76, 0x5d, 0x43, 0x4d, 0x3a, 0x24, 0x41, 0x2f, 0x19, 0x39, 0x27, 0x12, 0x4c, 0x39, 0x27, 0x49, 0x36, 0x25, 0x3c, 0x30, 0x20, 0x61, 0x4c, 0x35, 0x66, 0x4f, 0x3b, 0x52, 0x3b, 0x2a, 0x54, 0x3f, 0x2f, 0x69, 0x50, 0x3d, 0x4f, 0x3b, 0x2a, 0x64, 0x4c, 0x36, 0x6a, 0x51, 0x3d, 0x5b, 0x42, 0x2e, 0x6e, 0x56, 0x3d, 0x61, 0x4d, 0x38, 0x4c, 0x36, 0x21, 0x4e, 0x38, 0x23, 0x69, 0x50, 0x39, 0x56, 0x40, 0x2c, 0x5d, 0x47, 0x31, 0x60, 0x4a, 0x34, 0x54, 0x3d, 0x2a, 0x30, 0x1e, 0x11, 0x49, 0x33, 0x20, 0x71, 0x55, 0x3b, 0x41, 0x2e, 0x19, 0x2a, 0x1a, 0x12, 0x2e, 0x1f, 0x0d, 0x21, 0x13, 0x08, 0x3a, 0x27, 0x1a, 0x3a, 0x28, 0x1c, 0x33, 0x21, 0x14, 0x33, 0x22, 0x14, 0x41, 0x2f, 0x21, 0x41, 0x30, 0x1f, 0x49, 0x34, 0x21, 0x48, 0x30, 0x20, 0x5c, 0x45, 0x34, 0x58, 0x40, 0x2b, 0x54, 0x3f, 0x29, 0x27, 0x18, 0x0d, 0x47, 0x32, 0x22, 0x67, 0x4c, 0x39, 0x43, 0x2e, 0x21, 0x54, 0x3d, 0x2d, 0x51, 0x3e, 0x2e, 0x4d, 0x39, 0x2c, 0x45, 0x34, 0x26, 0x46, 0x34, 0x26, 0x48, 0x36, 0x2d, 0x3f, 0x32, 0x2a, 0x51, 0x49, 0x43, 0x72, 0x65, 0x5b, 0xa1, 0x9a, 0x94, 0xbb, 0xb9, 0xb5, 0xca, 0xca, 0xc8, 0xd3, 0xd4, 0xd2, 0xe9, 0xea, 0xe7, 0xfa, 0xfb, 0xf8, 0xfd, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xed, 0xee, 0xeb, 0xf1, 0xf1, 0xef, 0xde, 0xde, 0xdc, 0xc3, 0xc3, 0xc1, 0xb1, 0xb2, 0xac, 0xd3, 0xd4, 0xce, 0x9a, 0x97, 0x93, 0x57, 0x4f, 0x4a, 0x5c, 0x54, 0x4e, 0x47, 0x41, 0x3c, 0x29, 0x1e, 0x18, 0x29, 0x19, 0x10, 0x3b, 0x2b, 0x1e, 0x3a, 0x2a, 0x1e, 0x36, 0x25, 0x16, 0x2b, 0x1f, 0x13, 0x11, 0x09, 0x05, 0x16, 0x0e, 0x0b, 0x21, 0x16, 0x0f, 0x1a, 0x0e, 0x0a, 0x1f, 0x16, 0x0f, 0x20, 0x17, 0x0b, 0x1b, 0x12, 0x0a, 0x23, 0x18, 0x0f, 0x25, 0x19, 0x0c, 0x3e, 0x2c, 0x1c, 0x26, 0x18, 0x0f, 0x15, 0x0a, 0x04, 0x1e, 0x11, 0x09, 0x2d, 0x21, 0x12, 0x2d, 0x1f, 0x0f, 0x17, 0x0e, 0x06, 0x08, 0x04, 0x03, 0x19, 0x10, 0x0b, 0x07, 0x00, 0x00, 0x07, 0x04, 0x06, 0x1c, 0x12, 0x0d, 0x11, 0x09, 0x02, 0x04, 0x00, 0x00, 0x09, 0x03, 0x03, 0x0c, 0x01, 0x03, 0x07, 0x01, 0x02, 0x0d, 0x06, 0x03, 0x13, 0x0d, 0x05, 0x21, 0x15, 0x0a, 0x12, 0x09, 0x03, 0x47, 0x34, 0x1e, 0x30, 0x21, 0x15, 0x28, 0x1c, 0x10, 0x3f, 0x2c, 0x17, 0x42, 0x2d, 0x15, 0x4f, 0x39, 0x26, 0x4b, 0x36, 0x1f, 0x65, 0x4c, 0x36, 0x46, 0x2e, 0x18, 0x74, 0x57, 0x3e, 0x63, 0x4d, 0x36, 0x60, 0x48, 0x2f, 0x59, 0x41, 0x2c, 0x4f, 0x3a, 0x23, 0x35, 0x24, 0x10, 0x5c, 0x45, 0x2b, 0x6f, 0x54, 0x39, 0x6e, 0x53, 0x3a, 0x51, 0x3b, 0x24, 0x5e, 0x48, 0x34, 0x4d, 0x3a, 0x2a, 0x49, 0x36, 0x23, 0x49, 0x37, 0x24, 0x4e, 0x3d, 0x29, 0x31, 0x20, 0x0f, 0x35, 0x27, 0x1a, 0x5e, 0x4b, 0x38, 0x4a, 0x35, 0x22, 0x52, 0x3c, 0x30, 0x52, 0x3c, 0x2b, 0x5b, 0x44, 0x32, 0x59, 0x45, 0x33, 0x5f, 0x46, 0x31, 0x5d, 0x46, 0x34, 0x54, 0x3d, 0x2c, 0x67, 0x50, 0x3a, 0x57, 0x42, 0x2d, 0x4e, 0x38, 0x20, 0x70, 0x5a, 0x42, 0x56, 0x41, 0x2d, 0x4c, 0x39, 0x27, 0x64, 0x52, 0x3c, 0x4e, 0x3b, 0x27, 0x3e, 0x29, 0x13, 0x33, 0x1d, 0x0e, 0x4d, 0x38, 0x25, 0x6e, 0x55, 0x3a, 0x40, 0x2d, 0x1c, 0x24, 0x12, 0x06, 0x26, 0x14, 0x0c, 0x2b, 0x1b, 0x0f, 0x36, 0x25, 0x17, 0x2a, 0x17, 0x0d, 0x21, 0x14, 0x0c, 0x3c, 0x29, 0x1f, 0x41, 0x30, 0x1e, 0x49, 0x37, 0x27, 0x49, 0x36, 0x25, 0x48, 0x34, 0x1d, 0x5a, 0x43, 0x2b, 0x5d, 0x43, 0x30, 0x4c, 0x35, 0x20, 0x3b, 0x2a, 0x1c, 0x37, 0x22, 0x16, 0x65, 0x4c, 0x34, 0x54, 0x3c, 0x30, 0x4f, 0x38, 0x23, 0x50, 0x3c, 0x28, 0x48, 0x35, 0x27, 0x4b, 0x39, 0x2b, 0x3c, 0x2c, 0x20, 0x46, 0x36, 0x2c, 0x40, 0x31, 0x28, 0x5e, 0x57, 0x4f, 0x75, 0x6f, 0x66, 0x95, 0x8d, 0x87, 0xc8, 0xc5, 0xc1, 0xce, 0xcc, 0xc9, 0xc8, 0xc6, 0xc3, 0xf4, 0xf4, 0xf2, 0xf2, 0xf3, 0xf1, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfb, 0xec, 0xec, 0xea, 0xf5, 0xf5, 0xf3, 0xe2, 0xe3, 0xe1, 0xb2, 0xb2, 0xb0, 0xce, 0xce, 0xca, 0xda, 0xda, 0xdb, 0x87, 0x84, 0x80, 0x6e, 0x68, 0x5f, 0x6d, 0x68, 0x64, 0x3a, 0x31, 0x2a, 0x30, 0x22, 0x1a, 0x2c, 0x1f, 0x17, 0x2d, 0x1c, 0x13, 0x39, 0x29, 0x20, 0x2d, 0x1d, 0x10, 0x2a, 0x1e, 0x13, 0x1e, 0x12, 0x0c, 0x1b, 0x0f, 0x09, 0x27, 0x18, 0x13, 0x20, 0x15, 0x0f, 0x17, 0x0e, 0x08, 0x20, 0x15, 0x0c, 0x1e, 0x13, 0x0a, 0x18, 0x0e, 0x05, 0x2a, 0x1e, 0x10, 0x3c, 0x2b, 0x1b, 0x2c, 0x20, 0x15, 0x1d, 0x12, 0x0d, 0x24, 0x16, 0x0d, 0x1c, 0x10, 0x06, 0x30, 0x21, 0x14, 0x17, 0x0b, 0x05, 0x0d, 0x06, 0x04, 0x1b, 0x0f, 0x09, 0x18, 0x0c, 0x06, 0x0a, 0x05, 0x04, 0x21, 0x18, 0x13, 0x0b, 0x04, 0x00, 0x05, 0x01, 0x00, 0x04, 0x02, 0x01, 0x0e, 0x05, 0x06, 0x06, 0x00, 0x00, 0x07, 0x02, 0x01, 0x0a, 0x04, 0x01, 0x0d, 0x03, 0x00, 0x15, 0x0d, 0x07, 0x34, 0x24, 0x14, 0x25, 0x17, 0x0b, 0x29, 0x1b, 0x10, 0x40, 0x2e, 0x1e, 0x3f, 0x2d, 0x1b, 0x3a, 0x28, 0x16, 0x2f, 0x1e, 0x0e, 0x4f, 0x39, 0x23, 0x4a, 0x35, 0x20, 0x51, 0x3b, 0x27, 0x5e, 0x47, 0x2f, 0x52, 0x3e, 0x28, 0x4b, 0x36, 0x22, 0x57, 0x43, 0x2d, 0x2d, 0x1f, 0x0f, 0x51, 0x3d, 0x25, 0x60, 0x49, 0x30, 0x62, 0x4b, 0x32, 0x70, 0x5a, 0x41, 0x60, 0x4c, 0x3b, 0x3d, 0x2a, 0x1b, 0x4d, 0x39, 0x28, 0x3e, 0x2c, 0x1b, 0x55, 0x45, 0x2f, 0x3c, 0x2a, 0x19, 0x40, 0x2e, 0x20, 0x52, 0x41, 0x2d, 0x55, 0x3e, 0x2c, 0x4d, 0x35, 0x28, 0x61, 0x4a, 0x3a, 0x58, 0x40, 0x30, 0x4d, 0x39, 0x27, 0x63, 0x4b, 0x36, 0x62, 0x4b, 0x38, 0x5c, 0x45, 0x33, 0x64, 0x4d, 0x39, 0x59, 0x43, 0x2e, 0x62, 0x4c, 0x35, 0x69, 0x53, 0x3c, 0x43, 0x30, 0x1e, 0x49, 0x36, 0x25, 0x43, 0x32, 0x1c, 0x32, 0x21, 0x10, 0x46, 0x32, 0x1d, 0x4e, 0x38, 0x23, 0x4e, 0x39, 0x24, 0x62, 0x49, 0x32, 0x32, 0x1f, 0x13, 0x31, 0x1f, 0x14, 0x44, 0x33, 0x1f, 0x33, 0x23, 0x17, 0x2a, 0x1a, 0x0d, 0x2a, 0x18, 0x0c, 0x2a, 0x19, 0x0e, 0x33, 0x21, 0x16, 0x39, 0x28, 0x16, 0x45, 0x31, 0x22, 0x45, 0x31, 0x22, 0x44, 0x31, 0x1f, 0x50, 0x37, 0x23, 0x60, 0x48, 0x2f, 0x66, 0x4e, 0x35, 0x39, 0x27, 0x18, 0x3f, 0x2a, 0x1b, 0x5e, 0x46, 0x33, 0x63, 0x4a, 0x38, 0x54, 0x3c, 0x2a, 0x48, 0x34, 0x24, 0x44, 0x31, 0x23, 0x52, 0x3f, 0x31, 0x3c, 0x2d, 0x22, 0x47, 0x37, 0x2e, 0x45, 0x34, 0x2c, 0x52, 0x48, 0x41, 0x78, 0x74, 0x6b, 0x89, 0x81, 0x7b, 0xba, 0xb6, 0xb2, 0xc7, 0xc6, 0xc3, 0xd1, 0xcf, 0xcc, 0xea, 0xea, 0xe8, 0xf9, 0xfa, 0xf8, 0xfb, 0xfb, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfb, 0xf5, 0xf5, 0xf4, 0xef, 0xf0, 0xee, 0xe6, 0xe7, 0xe5, 0xc3, 0xc3, 0xc1, 0xd0, 0xd0, 0xcf, 0xbf, 0xbf, 0xc2, 0x78, 0x74, 0x6e, 0x98, 0x94, 0x8e, 0x5f, 0x5c, 0x5a, 0x30, 0x23, 0x1b, 0x36, 0x26, 0x1b, 0x2d, 0x21, 0x1c, 0x2a, 0x1a, 0x14, 0x36, 0x26, 0x1f, 0x2c, 0x1d, 0x13, 0x22, 0x17, 0x10, 0x20, 0x11, 0x08, 0x1f, 0x10, 0x07, 0x27, 0x19, 0x12, 0x1b, 0x0f, 0x0a, 0x1e, 0x14, 0x0d, 0x22, 0x17, 0x0e, 0x17, 0x0c, 0x04, 0x1e, 0x13, 0x0a, 0x1e, 0x12, 0x08, 0x3c, 0x2f, 0x22, 0x21, 0x14, 0x0a, 0x20, 0x14, 0x0e, 0x24, 0x15, 0x0e, 0x1c, 0x10, 0x0c, 0x25, 0x16, 0x0b, 0x1d, 0x12, 0x0c, 0x0e, 0x07, 0x03, 0x1c, 0x0f, 0x06, 0x21, 0x13, 0x0b, 0x0f, 0x06, 0x03, 0x10, 0x0a, 0x08, 0x0a, 0x03, 0x00, 0x07, 0x03, 0x02, 0x01, 0x02, 0x00, 0x0b, 0x06, 0x06, 0x0a, 0x04, 0x04, 0x07, 0x02, 0x02, 0x07, 0x02, 0x01, 0x08, 0x01, 0x01, 0x0d, 0x07, 0x03, 0x1f, 0x13, 0x0b, 0x21, 0x16, 0x0a, 0x3a, 0x28, 0x1d, 0x2d, 0x1f, 0x16, 0x2d, 0x20, 0x11, 0x49, 0x39, 0x24, 0x2d, 0x1c, 0x0f, 0x37, 0x23, 0x12, 0x44, 0x2f, 0x1d, 0x35, 0x23, 0x13, 0x66, 0x4b, 0x33, 0x3c, 0x28, 0x13, 0x4f, 0x3d, 0x28, 0x47, 0x35, 0x20, 0x21, 0x12, 0x04, 0x4d, 0x38, 0x25, 0x41, 0x2c, 0x17, 0x58, 0x44, 0x2e, 0x5c, 0x48, 0x30, 0x64, 0x51, 0x3f, 0x35, 0x23, 0x14, 0x4a, 0x38, 0x25, 0x53, 0x40, 0x2f, 0x48, 0x38, 0x23, 0x40, 0x30, 0x1f, 0x42, 0x32, 0x25, 0x47, 0x36, 0x22, 0x66, 0x4e, 0x3b, 0x5c, 0x44, 0x34, 0x55, 0x3e, 0x2e, 0x5c, 0x45, 0x35, 0x45, 0x31, 0x20, 0x67, 0x4f, 0x3a, 0x59, 0x43, 0x2c, 0x5f, 0x48, 0x33, 0x4d, 0x37, 0x23, 0x59, 0x43, 0x30, 0x64, 0x4d, 0x3c, 0x45, 0x2f, 0x1d, 0x43, 0x2f, 0x1d, 0x58, 0x44, 0x32, 0x3f, 0x2d, 0x1a, 0x2f, 0x1d, 0x10, 0x49, 0x36, 0x22, 0x4d, 0x38, 0x24, 0x3e, 0x2a, 0x14, 0x4c, 0x35, 0x22, 0x44, 0x31, 0x1f, 0x35, 0x23, 0x16, 0x3f, 0x2f, 0x20, 0x2b, 0x1b, 0x0f, 0x31, 0x21, 0x13, 0x32, 0x21, 0x15, 0x56, 0x3d, 0x2d, 0x3f, 0x2c, 0x1d, 0x42, 0x2f, 0x23, 0x43, 0x31, 0x22, 0x45, 0x32, 0x24, 0x3c, 0x2a, 0x1a, 0x56, 0x3f, 0x2c, 0x55, 0x3d, 0x28, 0x68, 0x50, 0x3b, 0x3f, 0x2b, 0x1f, 0x42, 0x2e, 0x1c, 0x53, 0x3a, 0x2a, 0x65, 0x4d, 0x36, 0x50, 0x39, 0x29, 0x3c, 0x29, 0x1c, 0x47, 0x35, 0x29, 0x43, 0x32, 0x25, 0x3d, 0x2f, 0x24, 0x3f, 0x2f, 0x27, 0x48, 0x38, 0x31, 0x5b, 0x4d, 0x46, 0x76, 0x6b, 0x64, 0x7d, 0x75, 0x6f, 0xb3, 0xae, 0xaa, 0xd1, 0xd1, 0xcd, 0xda, 0xda, 0xd6, 0xe0, 0xe1, 0xdf, 0xf4, 0xf4, 0xf2, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0xef, 0xe7, 0xe7, 0xe5, 0xe6, 0xe7, 0xe5, 0xdd, 0xdd, 0xdd, 0xc5, 0xc5, 0xc5, 0x9d, 0x97, 0x91, 0x8a, 0x8b, 0x8a, 0x3d, 0x38, 0x35, 0x35, 0x27, 0x22, 0x3b, 0x2c, 0x23, 0x31, 0x25, 0x1e, 0x34, 0x25, 0x1e, 0x33, 0x24, 0x1d, 0x27, 0x1c, 0x13, 0x1a, 0x0f, 0x06, 0x22, 0x14, 0x0b, 0x24, 0x16, 0x0d, 0x26, 0x1a, 0x0e, 0x20, 0x14, 0x0f, 0x2c, 0x20, 0x14, 0x26, 0x1b, 0x12, 0x15, 0x0a, 0x04, 0x28, 0x19, 0x11, 0x1d, 0x0f, 0x09, 0x34, 0x24, 0x16, 0x14, 0x09, 0x05, 0x1d, 0x0e, 0x05, 0x1d, 0x0d, 0x0a, 0x17, 0x0c, 0x06, 0x2b, 0x1e, 0x10, 0x17, 0x0c, 0x06, 0x16, 0x0b, 0x05, 0x17, 0x0d, 0x07, 0x18, 0x0d, 0x08, 0x0c, 0x04, 0x04, 0x0a, 0x06, 0x05, 0x0a, 0x02, 0x00, 0x07, 0x03, 0x04, 0x01, 0x01, 0x00, 0x04, 0x01, 0x00, 0x0d, 0x07, 0x07, 0x04, 0x02, 0x00, 0x06, 0x03, 0x01, 0x0c, 0x05, 0x04, 0x0c, 0x07, 0x05, 0x0f, 0x09, 0x04, 0x1b, 0x0f, 0x07, 0x29, 0x1c, 0x12, 0x1e, 0x15, 0x0d, 0x1d, 0x12, 0x06, 0x4c, 0x39, 0x26, 0x35, 0x24, 0x19, 0x32, 0x22, 0x13, 0x2a, 0x18, 0x0b, 0x3b, 0x25, 0x14, 0x4d, 0x35, 0x23, 0x42, 0x2f, 0x1a, 0x46, 0x33, 0x21, 0x4f, 0x3c, 0x2b, 0x34, 0x22, 0x12, 0x3f, 0x2e, 0x1e, 0x37, 0x24, 0x15, 0x52, 0x40, 0x2d, 0x49, 0x38, 0x22, 0x5b, 0x4b, 0x39, 0x2d, 0x1d, 0x0f, 0x47, 0x37, 0x21, 0x47, 0x34, 0x22, 0x3f, 0x2f, 0x1e, 0x4a, 0x3a, 0x29, 0x2c, 0x20, 0x14, 0x47, 0x35, 0x23, 0x67, 0x50, 0x3f, 0x60, 0x49, 0x39, 0x51, 0x3e, 0x2c, 0x52, 0x3f, 0x2e, 0x3f, 0x2e, 0x1d, 0x60, 0x4b, 0x37, 0x5b, 0x45, 0x30, 0x51, 0x3a, 0x26, 0x4f, 0x3c, 0x2a, 0x62, 0x4e, 0x3d, 0x59, 0x46, 0x35, 0x51, 0x3e, 0x2d, 0x4d, 0x3a, 0x29, 0x46, 0x33, 0x22, 0x3a, 0x28, 0x18, 0x40, 0x2e, 0x1e, 0x45, 0x34, 0x23, 0x44, 0x32, 0x21, 0x38, 0x26, 0x14, 0x3e, 0x2b, 0x1a, 0x44, 0x30, 0x1f, 0x32, 0x20, 0x12, 0x30, 0x22, 0x16, 0x26, 0x15, 0x0b, 0x38, 0x28, 0x1a, 0x36, 0x23, 0x18, 0x56, 0x40, 0x2d, 0x4e, 0x3b, 0x29, 0x42, 0x2e, 0x20, 0x37, 0x26, 0x18, 0x40, 0x2f, 0x21, 0x27, 0x18, 0x0e, 0x3a, 0x27, 0x19, 0x60, 0x49, 0x35, 0x52, 0x3c, 0x28, 0x5b, 0x40, 0x2b, 0x25, 0x15, 0x08, 0x4e, 0x37, 0x26, 0x4f, 0x37, 0x24, 0x58, 0x43, 0x32, 0x2b, 0x1b, 0x0f, 0x38, 0x29, 0x1d, 0x32, 0x24, 0x1c, 0x3e, 0x2f, 0x27, 0x46, 0x37, 0x30, 0x3f, 0x30, 0x29, 0x43, 0x37, 0x2f, 0x7c, 0x6f, 0x68, 0x7e, 0x79, 0x73, 0xa3, 0x9e, 0x98, 0xce, 0xcf, 0xcb, 0xdc, 0xdd, 0xd9, 0xea, 0xeb, 0xe8, 0xe3, 0xe3, 0xe1, 0xf6, 0xf6, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xfb, 0xfa, 0xfa, 0xf5, 0xf5, 0xf5, 0xe9, 0xe9, 0xe7, 0xf6, 0xf7, 0xf5, 0xd2, 0xd2, 0xd2, 0x93, 0x93, 0x93, 0xba, 0xb8, 0xb5, 0x6d, 0x6c, 0x68, 0x38, 0x2e, 0x2c, 0x29, 0x21, 0x1a, 0x39, 0x2e, 0x28, 0x47, 0x36, 0x2d, 0x31, 0x22, 0x1b, 0x2a, 0x1b, 0x14, 0x2b, 0x1b, 0x0f, 0x2a, 0x1a, 0x0e, 0x29, 0x1b, 0x11, 0x24, 0x16, 0x0d, 0x2b, 0x1c, 0x0f, 0x2d, 0x1c, 0x14, 0x2b, 0x1c, 0x10, 0x22, 0x16, 0x0d, 0x22, 0x18, 0x0f, 0x29, 0x1a, 0x11, 0x14, 0x05, 0x04, 0x21, 0x10, 0x0a, 0x1b, 0x11, 0x06, 0x22, 0x14, 0x0b, 0x1e, 0x0f, 0x0b, 0x25, 0x1b, 0x12, 0x23, 0x14, 0x0d, 0x17, 0x0c, 0x06, 0x1c, 0x11, 0x0b, 0x0b, 0x05, 0x03, 0x07, 0x01, 0x00, 0x0c, 0x06, 0x00, 0x0d, 0x02, 0x00, 0x0d, 0x06, 0x02, 0x07, 0x03, 0x04, 0x00, 0x00, 0x00, 0x07, 0x03, 0x03, 0x07, 0x01, 0x01, 0x03, 0x02, 0x00, 0x04, 0x03, 0x02, 0x06, 0x03, 0x04, 0x05, 0x02, 0x04, 0x0a, 0x03, 0x04, 0x11, 0x06, 0x03, 0x15, 0x10, 0x0c, 0x07, 0x07, 0x06, 0x0c, 0x09, 0x04, 0x1c, 0x10, 0x05, 0x1a, 0x0e, 0x04, 0x1a, 0x0e, 0x02, 0x20, 0x13, 0x09, 0x37, 0x26, 0x17, 0x40, 0x2c, 0x1c, 0x35, 0x26, 0x16, 0x3b, 0x27, 0x16, 0x48, 0x34, 0x23, 0x2d, 0x1b, 0x0b, 0x47, 0x35, 0x25, 0x3d, 0x2e, 0x22, 0x47, 0x3a, 0x29, 0x3a, 0x2e, 0x1a, 0x3b, 0x30, 0x20, 0x26, 0x19, 0x0f, 0x40, 0x2e, 0x1d, 0x3c, 0x29, 0x1b, 0x3a, 0x2b, 0x1a, 0x52, 0x43, 0x32, 0x35, 0x28, 0x1d, 0x4e, 0x3a, 0x29, 0x67, 0x50, 0x3f, 0x5b, 0x43, 0x33, 0x59, 0x46, 0x34, 0x57, 0x44, 0x32, 0x45, 0x33, 0x22, 0x5d, 0x47, 0x33, 0x4f, 0x38, 0x24, 0x54, 0x3d, 0x29, 0x62, 0x4e, 0x3d, 0x42, 0x2f, 0x1d, 0x44, 0x31, 0x1f, 0x55, 0x41, 0x30, 0x43, 0x35, 0x25, 0x3c, 0x2e, 0x1f, 0x46, 0x36, 0x26, 0x30, 0x1e, 0x0e, 0x3d, 0x2c, 0x1d, 0x3d, 0x2c, 0x1e, 0x3b, 0x28, 0x1a, 0x3e, 0x2a, 0x1d, 0x38, 0x24, 0x16, 0x3a, 0x28, 0x1a, 0x2e, 0x20, 0x15, 0x3c, 0x2b, 0x21, 0x2a, 0x1b, 0x0c, 0x39, 0x26, 0x1a, 0x55, 0x3f, 0x2c, 0x4c, 0x39, 0x26, 0x54, 0x42, 0x29, 0x33, 0x21, 0x13, 0x45, 0x34, 0x26, 0x2e, 0x1f, 0x18, 0x2a, 0x15, 0x0c, 0x43, 0x2b, 0x1d, 0x5a, 0x42, 0x34, 0x62, 0x48, 0x34, 0x36, 0x26, 0x19, 0x3f, 0x2c, 0x1c, 0x48, 0x34, 0x25, 0x4d, 0x3a, 0x2b, 0x36, 0x26, 0x19, 0x32, 0x22, 0x17, 0x26, 0x18, 0x10, 0x3c, 0x2c, 0x24, 0x40, 0x31, 0x2a, 0x44, 0x35, 0x2e, 0x53, 0x4a, 0x41, 0x63, 0x5a, 0x51, 0x94, 0x8f, 0x89, 0x96, 0x91, 0x8b, 0xc4, 0xc5, 0xc0, 0xd6, 0xd7, 0xd3, 0xef, 0xef, 0xed, 0xef, 0xef, 0xed, 0xf6, 0xf6, 0xf6, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xf2, 0xf2, 0xf2, 0xea, 0xea, 0xe8, 0xf5, 0xf5, 0xf3, 0xd3, 0xd3, 0xd3, 0x98, 0x99, 0x94, 0xa6, 0xa5, 0xa6, 0x56, 0x52, 0x4d, 0x31, 0x29, 0x24, 0x29, 0x22, 0x1c, 0x38, 0x2f, 0x28, 0x32, 0x25, 0x1a, 0x35, 0x24, 0x1c, 0x35, 0x24, 0x1c, 0x2c, 0x1b, 0x12, 0x34, 0x23, 0x1a, 0x26, 0x19, 0x10, 0x30, 0x1f, 0x12, 0x34, 0x24, 0x17, 0x31, 0x22, 0x18, 0x21, 0x13, 0x0b, 0x1c, 0x0e, 0x07, 0x2c, 0x1d, 0x15, 0x2d, 0x1f, 0x16, 0x27, 0x18, 0x11, 0x32, 0x24, 0x1b, 0x1b, 0x0d, 0x04, 0x12, 0x06, 0x00, 0x1b, 0x10, 0x08, 0x1f, 0x14, 0x0a, 0x1a, 0x0d, 0x09, 0x1e, 0x11, 0x09, 0x0e, 0x04, 0x00, 0x0c, 0x05, 0x02, 0x04, 0x01, 0x01, 0x09, 0x03, 0x02, 0x18, 0x0a, 0x04, 0x10, 0x06, 0x02, 0x0c, 0x02, 0x03, 0x01, 0x02, 0x03, 0x08, 0x04, 0x00, 0x03, 0x01, 0x00, 0x02, 0x01, 0x00, 0x03, 0x02, 0x01, 0x03, 0x02, 0x01, 0x04, 0x01, 0x01, 0x07, 0x03, 0x02, 0x02, 0x02, 0x00, 0x09, 0x08, 0x06, 0x08, 0x07, 0x06, 0x11, 0x0a, 0x03, 0x11, 0x09, 0x04, 0x11, 0x07, 0x00, 0x1e, 0x14, 0x0c, 0x27, 0x1e, 0x12, 0x37, 0x26, 0x14, 0x39, 0x27, 0x19, 0x28, 0x1b, 0x0b, 0x27, 0x18, 0x0c, 0x35, 0x25, 0x16, 0x36, 0x26, 0x18, 0x38, 0x29, 0x1a, 0x3a, 0x2a, 0x19, 0x34, 0x26, 0x16, 0x29, 0x1f, 0x0e, 0x35, 0x28, 0x19, 0x31, 0x21, 0x14, 0x40, 0x2f, 0x22, 0x42, 0x31, 0x25, 0x2b, 0x1b, 0x0e, 0x31, 0x21, 0x14, 0x45, 0x37, 0x29, 0x5c, 0x4b, 0x39, 0x65, 0x51, 0x3f, 0x61, 0x4e, 0x3c, 0x56, 0x43, 0x31, 0x58, 0x45, 0x34, 0x58, 0x46, 0x31, 0x5b, 0x48, 0x32, 0x52, 0x3e, 0x2c, 0x51, 0x3d, 0x2c, 0x68, 0x54, 0x40, 0x48, 0x38, 0x26, 0x39, 0x28, 0x18, 0x61, 0x50, 0x40, 0x33, 0x23, 0x14, 0x20, 0x0f, 0x06, 0x2a, 0x1c, 0x10, 0x34, 0x24, 0x17, 0x49, 0x34, 0x23, 0x39, 0x2a, 0x1c, 0x3d, 0x2b, 0x1a, 0x43, 0x30, 0x20, 0x3f, 0x2b, 0x1d, 0x45, 0x31, 0x25, 0x48, 0x35, 0x23, 0x2c, 0x1a, 0x0d, 0x43, 0x31, 0x23, 0x44, 0x34, 0x24, 0x46, 0x32, 0x1f, 0x51, 0x3e, 0x2e, 0x4f, 0x3c, 0x2a, 0x4c, 0x37, 0x23, 0x4c, 0x3b, 0x2c, 0x38, 0x27, 0x1c, 0x30, 0x1f, 0x0f, 0x3f, 0x2d, 0x1b, 0x58, 0x46, 0x38, 0x47, 0x31, 0x20, 0x46, 0x33, 0x23, 0x3e, 0x2d, 0x1c, 0x44, 0x2d, 0x21, 0x39, 0x28, 0x1e, 0x3a, 0x2b, 0x22, 0x34, 0x25, 0x1c, 0x36, 0x26, 0x1d, 0x3d, 0x2d, 0x24, 0x44, 0x38, 0x2e, 0x4b, 0x43, 0x3d, 0x5a, 0x4f, 0x46, 0x66, 0x5b, 0x52, 0x6e, 0x6a, 0x64, 0xaa, 0xa7, 0xa2, 0xb6, 0xb4, 0xb1, 0xd8, 0xd7, 0xd3, 0xe7, 0xe8, 0xe5, 0xf8, 0xf8, 0xf6, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xed, 0xed, 0xed, 0xf2, 0xf2, 0xf0, 0xf4, 0xf4, 0xf2, 0xc7, 0xc7, 0xc7, 0xce, 0xcf, 0xc9, 0x79, 0x78, 0x77, 0x55, 0x50, 0x4d, 0x30, 0x29, 0x23, 0x3d, 0x36, 0x30, 0x31, 0x28, 0x21, 0x31, 0x24, 0x1a, 0x36, 0x26, 0x1d, 0x31, 0x20, 0x18, 0x2b, 0x1b, 0x12, 0x2f, 0x1e, 0x16, 0x2b, 0x1e, 0x14, 0x33, 0x22, 0x14, 0x39, 0x27, 0x17, 0x3f, 0x2c, 0x20, 0x25, 0x16, 0x0e, 0x29, 0x1c, 0x14, 0x29, 0x19, 0x12, 0x31, 0x23, 0x1a, 0x2e, 0x20, 0x17, 0x31, 0x22, 0x19, 0x2a, 0x1c, 0x13, 0x20, 0x16, 0x0d, 0x14, 0x09, 0x01, 0x0e, 0x09, 0x06, 0x06, 0x01, 0x02, 0x1e, 0x11, 0x08, 0x12, 0x08, 0x04, 0x0b, 0x03, 0x01, 0x03, 0x00, 0x01, 0x15, 0x0b, 0x07, 0x13, 0x09, 0x04, 0x17, 0x0d, 0x08, 0x10, 0x03, 0x05, 0x03, 0x01, 0x00, 0x11, 0x09, 0x02, 0x05, 0x03, 0x02, 0x03, 0x01, 0x00, 0x02, 0x01, 0x00, 0x05, 0x03, 0x01, 0x02, 0x01, 0x00, 0x04, 0x02, 0x01, 0x06, 0x02, 0x02, 0x03, 0x01, 0x00, 0x04, 0x02, 0x01, 0x0f, 0x07, 0x00, 0x12, 0x0a, 0x06, 0x06, 0x02, 0x00, 0x07, 0x03, 0x00, 0x12, 0x0c, 0x06, 0x26, 0x18, 0x0b, 0x38, 0x27, 0x18, 0x20, 0x12, 0x0b, 0x1b, 0x12, 0x0a, 0x32, 0x1e, 0x0f, 0x2a, 0x1b, 0x0c, 0x2b, 0x1b, 0x0c, 0x2d, 0x1d, 0x0b, 0x3a, 0x2c, 0x1c, 0x19, 0x0e, 0x05, 0x2f, 0x21, 0x14, 0x35, 0x25, 0x16, 0x34, 0x24, 0x18, 0x48, 0x38, 0x2b, 0x25, 0x15, 0x08, 0x2f, 0x20, 0x13, 0x36, 0x28, 0x18, 0x61, 0x4f, 0x3d, 0x5d, 0x4d, 0x3d, 0x50, 0x40, 0x30, 0x51, 0x3e, 0x2c, 0x54, 0x41, 0x2f, 0x5b, 0x49, 0x33, 0x5c, 0x4a, 0x34, 0x46, 0x33, 0x22, 0x48, 0x35, 0x23, 0x56, 0x42, 0x2e, 0x3f, 0x2f, 0x1d, 0x3a, 0x28, 0x18, 0x3f, 0x2d, 0x1d, 0x2d, 0x1d, 0x0e, 0x1e, 0x0d, 0x05, 0x26, 0x19, 0x0e, 0x33, 0x23, 0x16, 0x49, 0x33, 0x22, 0x32, 0x23, 0x15, 0x3e, 0x2c, 0x19, 0x39, 0x25, 0x15, 0x3c, 0x28, 0x1a, 0x4c, 0x39, 0x27, 0x40, 0x2c, 0x1f, 0x45, 0x33, 0x25, 0x41, 0x2f, 0x21, 0x39, 0x28, 0x1d, 0x4a, 0x35, 0x26, 0x45, 0x32, 0x23, 0x4c, 0x39, 0x29, 0x53, 0x3e, 0x28, 0x3e, 0x2d, 0x1d, 0x3e, 0x2d, 0x22, 0x32, 0x21, 0x11, 0x40, 0x2f, 0x1d, 0x47, 0x36, 0x28, 0x4c, 0x39, 0x2a, 0x38, 0x28, 0x1c, 0x32, 0x23, 0x13, 0x49, 0x31, 0x25, 0x39, 0x29, 0x1f, 0x35, 0x26, 0x1d, 0x32, 0x23, 0x1a, 0x32, 0x22, 0x19, 0x38, 0x28, 0x1f, 0x42, 0x35, 0x2c, 0x5e, 0x55, 0x50, 0x4f, 0x48, 0x42, 0x6e, 0x67, 0x61, 0x81, 0x76, 0x6f, 0x96, 0x91, 0x8e, 0xbd, 0xbb, 0xb8, 0xcf, 0xcd, 0xca, 0xd6, 0xd7, 0xd4, 0xf3, 0xf3, 0xf1, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfa, 0xfa, 0xfa, 0xee, 0xee, 0xee, 0xf9, 0xf9, 0xf9, 0xeb, 0xeb, 0xeb, 0xc8, 0xc9, 0xc4, 0xd4, 0xd4, 0xd4, 0x7c, 0x79, 0x77, 0x5c, 0x56, 0x53, 0x44, 0x3d, 0x38, 0x4b, 0x44, 0x3e, 0x24, 0x1a, 0x13, 0x3d, 0x2e, 0x23, 0x39, 0x29, 0x1e, 0x2c, 0x1b, 0x11, 0x2c, 0x1b, 0x13, 0x30, 0x1f, 0x17, 0x2c, 0x1e, 0x15, 0x38, 0x27, 0x19, 0x4a, 0x32, 0x22, 0x40, 0x2c, 0x20, 0x2b, 0x1d, 0x14, 0x22, 0x15, 0x0b, 0x29, 0x1a, 0x11, 0x2d, 0x1f, 0x14, 0x34, 0x25, 0x1b, 0x31, 0x23, 0x1a, 0x17, 0x0b, 0x05, 0x0f, 0x07, 0x00, 0x23, 0x17, 0x0d, 0x14, 0x07, 0x00, 0x10, 0x08, 0x03, 0x1e, 0x11, 0x0b, 0x0d, 0x06, 0x03, 0x06, 0x02, 0x00, 0x06, 0x02, 0x03, 0x1e, 0x10, 0x08, 0x09, 0x04, 0x00, 0x18, 0x0b, 0x06, 0x0b, 0x02, 0x00, 0x07, 0x04, 0x01, 0x0d, 0x05, 0x00, 0x07, 0x04, 0x03, 0x05, 0x01, 0x01, 0x04, 0x01, 0x00, 0x0b, 0x05, 0x01, 0x03, 0x02, 0x01, 0x05, 0x00, 0x00, 0x0b, 0x06, 0x06, 0x02, 0x00, 0x00, 0x03, 0x00, 0x01, 0x11, 0x0a, 0x07, 0x15, 0x0e, 0x07, 0x08, 0x05, 0x02, 0x06, 0x02, 0x00, 0x0b, 0x06, 0x04, 0x1b, 0x11, 0x0a, 0x31, 0x22, 0x12, 0x23, 0x14, 0x0d, 0x0f, 0x09, 0x04, 0x35, 0x1f, 0x0d, 0x31, 0x24, 0x14, 0x12, 0x04, 0x00, 0x35, 0x25, 0x14, 0x20, 0x13, 0x05, 0x1d, 0x11, 0x0b, 0x1f, 0x12, 0x06, 0x31, 0x22, 0x14, 0x35, 0x25, 0x19, 0x3c, 0x2c, 0x20, 0x2f, 0x21, 0x16, 0x32, 0x25, 0x1a, 0x40, 0x34, 0x26, 0x55, 0x3f, 0x30, 0x4e, 0x3f, 0x32, 0x4b, 0x3b, 0x2d, 0x4a, 0x37, 0x27, 0x51, 0x3e, 0x2e, 0x50, 0x3c, 0x29, 0x46, 0x36, 0x23, 0x39, 0x28, 0x18, 0x33, 0x21, 0x11, 0x3a, 0x27, 0x15, 0x2a, 0x19, 0x0b, 0x3e, 0x2f, 0x1c, 0x27, 0x18, 0x09, 0x36, 0x27, 0x18, 0x26, 0x19, 0x10, 0x37, 0x27, 0x1b, 0x34, 0x22, 0x16, 0x45, 0x31, 0x22, 0x35, 0x24, 0x15, 0x41, 0x2f, 0x1d, 0x44, 0x31, 0x20, 0x3e, 0x2a, 0x1e, 0x3e, 0x2d, 0x1b, 0x3b, 0x29, 0x1b, 0x47, 0x35, 0x25, 0x44, 0x32, 0x22, 0x2c, 0x1a, 0x15, 0x49, 0x37, 0x27, 0x42, 0x2d, 0x1d, 0x40, 0x2b, 0x1b, 0x54, 0x41, 0x2c, 0x42, 0x2e, 0x21, 0x57, 0x47, 0x33, 0x36, 0x23, 0x17, 0x40, 0x2c, 0x1d, 0x40, 0x2c, 0x1f, 0x4a, 0x36, 0x28, 0x4d, 0x3b, 0x2e, 0x32, 0x21, 0x12, 0x3f, 0x29, 0x1d, 0x3e, 0x2d, 0x22, 0x32, 0x23, 0x1b, 0x29, 0x1b, 0x13, 0x35, 0x26, 0x1d, 0x33, 0x25, 0x1c, 0x3d, 0x32, 0x2a, 0x40, 0x37, 0x30, 0x62, 0x5a, 0x55, 0x64, 0x5f, 0x59, 0x7e, 0x74, 0x6e, 0x87, 0x82, 0x7d, 0xcf, 0xcf, 0xcd, 0xcc, 0xcd, 0xcb, 0xdf, 0xdf, 0xdd, 0xe8, 0xe8, 0xe6, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xef, 0xef, 0xef, 0xd1, 0xd2, 0xcc, 0xcb, 0xca, 0xcd, 0x9d, 0x9a, 0x98, 0x51, 0x4c, 0x47, 0x59, 0x52, 0x4c, 0x38, 0x30, 0x2b, 0x1a, 0x11, 0x0d, 0x36, 0x27, 0x1e, 0x24, 0x17, 0x0d, 0x28, 0x1b, 0x10, 0x32, 0x21, 0x19, 0x2c, 0x1b, 0x13, 0x2b, 0x1c, 0x13, 0x3e, 0x2c, 0x1f, 0x40, 0x2c, 0x1f, 0x30, 0x1f, 0x17, 0x23, 0x15, 0x0d, 0x33, 0x25, 0x1b, 0x2f, 0x20, 0x18, 0x1d, 0x0e, 0x07, 0x2b, 0x1b, 0x13, 0x2c, 0x1d, 0x13, 0x20, 0x15, 0x0d, 0x16, 0x0b, 0x02, 0x1a, 0x10, 0x07, 0x13, 0x09, 0x04, 0x1c, 0x14, 0x0b, 0x18, 0x0f, 0x0b, 0x12, 0x08, 0x05, 0x04, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x17, 0x0b, 0x01, 0x0d, 0x07, 0x01, 0x0b, 0x06, 0x03, 0x15, 0x0e, 0x08, 0x07, 0x05, 0x03, 0x0c, 0x05, 0x02, 0x0c, 0x04, 0x00, 0x08, 0x04, 0x01, 0x02, 0x01, 0x00, 0x0b, 0x06, 0x02, 0x07, 0x01, 0x00, 0x06, 0x00, 0x00, 0x07, 0x01, 0x01, 0x06, 0x01, 0x00, 0x05, 0x00, 0x00, 0x1e, 0x16, 0x13, 0x0c, 0x05, 0x03, 0x0a, 0x03, 0x01, 0x0b, 0x03, 0x02, 0x06, 0x01, 0x01, 0x13, 0x0a, 0x06, 0x2d, 0x1f, 0x16, 0x26, 0x18, 0x08, 0x0e, 0x0b, 0x05, 0x54, 0x3f, 0x2c, 0x25, 0x18, 0x09, 0x1a, 0x0c, 0x03, 0x34, 0x24, 0x17, 0x1f, 0x12, 0x07, 0x20, 0x13, 0x0b, 0x21, 0x12, 0x09, 0x38, 0x29, 0x1c, 0x38, 0x28, 0x1b, 0x2a, 0x1b, 0x10, 0x2b, 0x1d, 0x14, 0x32, 0x24, 0x1b, 0x48, 0x3a, 0x2e, 0x4a, 0x37, 0x29, 0x3a, 0x2a, 0x21, 0x42, 0x34, 0x1f, 0x49, 0x35, 0x26, 0x4e, 0x3a, 0x2b, 0x48, 0x34, 0x22, 0x38, 0x28, 0x19, 0x2c, 0x1d, 0x0e, 0x29, 0x1a, 0x0b, 0x3b, 0x2a, 0x19, 0x26, 0x14, 0x09, 0x36, 0x27, 0x14, 0x2b, 0x1b, 0x0c, 0x36, 0x27, 0x18, 0x1d, 0x13, 0x09, 0x38, 0x25, 0x15, 0x45, 0x32, 0x22, 0x49, 0x37, 0x27, 0x30, 0x1f, 0x11, 0x40, 0x2e, 0x1f, 0x50, 0x3c, 0x2c, 0x3a, 0x27, 0x17, 0x48, 0x37, 0x27, 0x3f, 0x2e, 0x1e, 0x33, 0x21, 0x13, 0x48, 0x36, 0x27, 0x32, 0x1f, 0x18, 0x46, 0x35, 0x25, 0x42, 0x2e, 0x20, 0x43, 0x2f, 0x22, 0x4c, 0x3a, 0x27, 0x40, 0x2c, 0x1e, 0x38, 0x26, 0x18, 0x3e, 0x2d, 0x1e, 0x37, 0x23, 0x16, 0x43, 0x2f, 0x22, 0x3e, 0x2b, 0x20, 0x45, 0x32, 0x28, 0x38, 0x24, 0x18, 0x45, 0x31, 0x23, 0x41, 0x2d, 0x1f, 0x44, 0x33, 0x27, 0x28, 0x1a, 0x11, 0x2c, 0x1d, 0x14, 0x2e, 0x20, 0x17, 0x36, 0x2b, 0x25, 0x4d, 0x42, 0x3b, 0x47, 0x3c, 0x36, 0x52, 0x4c, 0x44, 0x7f, 0x7a, 0x73, 0x76, 0x71, 0x6b, 0xb8, 0xb8, 0xb6, 0xd8, 0xd9, 0xd7, 0xe1, 0xe1, 0xdf, 0xe5, 0xe6, 0xe3, 0xf6, 0xf6, 0xf6, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xfa, 0xfa, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xec, 0xec, 0xec, 0xe7, 0xe8, 0xe3, 0xa8, 0xa8, 0xa9, 0x8f, 0x8d, 0x8b, 0x6a, 0x66, 0x60, 0x67, 0x61, 0x5c, 0x2a, 0x23, 0x1d, 0x1a, 0x13, 0x10, 0x25, 0x1a, 0x14, 0x25, 0x1a, 0x12, 0x23, 0x19, 0x11, 0x36, 0x25, 0x1d, 0x2d, 0x1c, 0x14, 0x3a, 0x2b, 0x21, 0x39, 0x27, 0x1a, 0x2d, 0x1e, 0x15, 0x2f, 0x21, 0x19, 0x20, 0x13, 0x0a, 0x2a, 0x1c, 0x13, 0x2b, 0x1d, 0x13, 0x2e, 0x1f, 0x0f, 0x2c, 0x1d, 0x0f, 0x25, 0x16, 0x07, 0x21, 0x14, 0x08, 0x30, 0x21, 0x17, 0x1a, 0x0f, 0x08, 0x07, 0x03, 0x02, 0x18, 0x0f, 0x07, 0x0a, 0x02, 0x02, 0x17, 0x0b, 0x05, 0x0b, 0x04, 0x04, 0x1c, 0x11, 0x07, 0x16, 0x0d, 0x05, 0x0b, 0x04, 0x00, 0x05, 0x05, 0x03, 0x12, 0x0c, 0x04, 0x09, 0x06, 0x03, 0x0a, 0x04, 0x00, 0x17, 0x0c, 0x02, 0x08, 0x05, 0x00, 0x02, 0x02, 0x03, 0x07, 0x05, 0x04, 0x1b, 0x0e, 0x07, 0x06, 0x01, 0x01, 0x08, 0x01, 0x01, 0x0c, 0x05, 0x01, 0x09, 0x02, 0x00, 0x0b, 0x03, 0x00, 0x0b, 0x02, 0x02, 0x0e, 0x04, 0x03, 0x12, 0x07, 0x05, 0x09, 0x02, 0x01, 0x11, 0x07, 0x04, 0x2d, 0x20, 0x12, 0x1f, 0x12, 0x07, 0x1a, 0x12, 0x0d, 0x53, 0x3f, 0x2d, 0x27, 0x18, 0x0a, 0x23, 0x14, 0x0a, 0x2a, 0x1b, 0x11, 0x28, 0x1c, 0x15, 0x23, 0x16, 0x0e, 0x2c, 0x1d, 0x13, 0x36, 0x27, 0x1b, 0x3c, 0x2d, 0x1f, 0x20, 0x11, 0x07, 0x33, 0x24, 0x1a, 0x4d, 0x3d, 0x32, 0x4e, 0x3e, 0x33, 0x32, 0x23, 0x14, 0x3b, 0x2b, 0x21, 0x40, 0x32, 0x1c, 0x44, 0x32, 0x22, 0x4a, 0x36, 0x27, 0x47, 0x34, 0x21, 0x2b, 0x1c, 0x0d, 0x37, 0x27, 0x18, 0x36, 0x26, 0x19, 0x31, 0x21, 0x11, 0x25, 0x14, 0x08, 0x3d, 0x2e, 0x1d, 0x33, 0x24, 0x16, 0x3b, 0x2b, 0x1b, 0x22, 0x17, 0x0b, 0x36, 0x24, 0x12, 0x40, 0x2e, 0x1b, 0x50, 0x3d, 0x2c, 0x40, 0x2d, 0x1e, 0x44, 0x32, 0x24, 0x40, 0x2d, 0x21, 0x4d, 0x3a, 0x28, 0x4d, 0x3c, 0x2b, 0x36, 0x25, 0x16, 0x36, 0x24, 0x19, 0x39, 0x27, 0x1d, 0x45, 0x34, 0x28, 0x4d, 0x3c, 0x2d, 0x41, 0x2f, 0x25, 0x3d, 0x2b, 0x1f, 0x52, 0x3f, 0x2e, 0x3e, 0x2b, 0x1c, 0x39, 0x29, 0x20, 0x43, 0x30, 0x24, 0x37, 0x24, 0x17, 0x3b, 0x28, 0x1b, 0x32, 0x22, 0x19, 0x43, 0x34, 0x2a, 0x34, 0x21, 0x15, 0x4a, 0x34, 0x27, 0x48, 0x32, 0x22, 0x53, 0x3e, 0x30, 0x36, 0x25, 0x1c, 0x2c, 0x1d, 0x15, 0x30, 0x21, 0x19, 0x2f, 0x23, 0x1c, 0x4c, 0x42, 0x3d, 0x59, 0x4d, 0x47, 0x6a, 0x64, 0x5d, 0x7a, 0x76, 0x6f, 0x8d, 0x89, 0x82, 0x93, 0x92, 0x90, 0xc2, 0xc2, 0xbf, 0xdf, 0xe0, 0xde, 0xe8, 0xe8, 0xe6, 0xf3, 0xf3, 0xf2, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xe9, 0xe9, 0xe9, 0xeb, 0xeb, 0xe9, 0xa9, 0xaa, 0xa8, 0x71, 0x6f, 0x6e, 0x74, 0x73, 0x6c, 0x51, 0x4c, 0x48, 0x28, 0x1f, 0x18, 0x26, 0x1b, 0x15, 0x21, 0x16, 0x10, 0x24, 0x19, 0x13, 0x1f, 0x14, 0x0e, 0x33, 0x23, 0x1a, 0x2c, 0x1c, 0x13, 0x41, 0x2f, 0x23, 0x32, 0x20, 0x14, 0x2f, 0x1f, 0x14, 0x2e, 0x1f, 0x14, 0x2e, 0x1f, 0x14, 0x2a, 0x1b, 0x13, 0x22, 0x12, 0x0c, 0x33, 0x24, 0x12, 0x2e, 0x1e, 0x13, 0x33, 0x24, 0x15, 0x30, 0x20, 0x12, 0x13, 0x0b, 0x08, 0x15, 0x0a, 0x08, 0x0b, 0x06, 0x02, 0x18, 0x0e, 0x06, 0x1a, 0x0e, 0x06, 0x08, 0x03, 0x00, 0x0e, 0x08, 0x09, 0x1f, 0x14, 0x06, 0x17, 0x0d, 0x05, 0x05, 0x03, 0x02, 0x0d, 0x06, 0x01, 0x0b, 0x04, 0x00, 0x16, 0x0f, 0x0a, 0x0c, 0x08, 0x05, 0x17, 0x0c, 0x07, 0x0d, 0x05, 0x03, 0x09, 0x04, 0x05, 0x0d, 0x09, 0x02, 0x21, 0x12, 0x0a, 0x0b, 0x06, 0x04, 0x10, 0x07, 0x04, 0x11, 0x07, 0x02, 0x0d, 0x03, 0x00, 0x0e, 0x05, 0x00, 0x12, 0x08, 0x04, 0x0c, 0x03, 0x00, 0x0f, 0x05, 0x00, 0x0c, 0x03, 0x00, 0x10, 0x07, 0x04, 0x1f, 0x15, 0x0b, 0x24, 0x18, 0x0d, 0x1e, 0x11, 0x0b, 0x46, 0x35, 0x24, 0x2a, 0x1a, 0x0e, 0x3b, 0x2b, 0x1f, 0x21, 0x17, 0x0c, 0x38, 0x2d, 0x23, 0x21, 0x13, 0x0a, 0x3a, 0x2c, 0x22, 0x36, 0x26, 0x1c, 0x42, 0x33, 0x23, 0x24, 0x15, 0x0d, 0x4a, 0x3b, 0x2f, 0x42, 0x31, 0x23, 0x45, 0x35, 0x29, 0x30, 0x20, 0x13, 0x49, 0x39, 0x2d, 0x47, 0x37, 0x2a, 0x49, 0x38, 0x28, 0x41, 0x2d, 0x1d, 0x4b, 0x37, 0x25, 0x31, 0x22, 0x13, 0x38, 0x29, 0x1a, 0x2e, 0x1e, 0x14, 0x31, 0x21, 0x12, 0x33, 0x23, 0x14, 0x33, 0x23, 0x17, 0x26, 0x16, 0x09, 0x43, 0x2f, 0x1d, 0x2f, 0x21, 0x11, 0x3f, 0x2b, 0x19, 0x4d, 0x39, 0x28, 0x55, 0x41, 0x30, 0x4d, 0x38, 0x28, 0x3a, 0x28, 0x19, 0x39, 0x26, 0x1f, 0x4c, 0x37, 0x29, 0x4d, 0x3a, 0x28, 0x34, 0x26, 0x17, 0x3f, 0x2e, 0x1f, 0x31, 0x1e, 0x14, 0x41, 0x31, 0x23, 0x47, 0x37, 0x29, 0x47, 0x33, 0x2c, 0x3d, 0x2c, 0x1e, 0x4d, 0x3a, 0x2a, 0x52, 0x3f, 0x2f, 0x2f, 0x22, 0x1c, 0x3a, 0x25, 0x14, 0x32, 0x20, 0x14, 0x2d, 0x1b, 0x0f, 0x3f, 0x2d, 0x25, 0x38, 0x26, 0x19, 0x3b, 0x28, 0x1c, 0x4d, 0x37, 0x28, 0x53, 0x3b, 0x2b, 0x4c, 0x37, 0x2a, 0x38, 0x27, 0x1e, 0x2e, 0x1f, 0x18, 0x34, 0x25, 0x1e, 0x35, 0x29, 0x20, 0x53, 0x4b, 0x44, 0x5b, 0x50, 0x48, 0x64, 0x5e, 0x5a, 0x7d, 0x7b, 0x74, 0x8e, 0x8c, 0x85, 0xb9, 0xb7, 0xb4, 0xb9, 0xb8, 0xb5, 0xd1, 0xd2, 0xcf, 0xe3, 0xe4, 0xe1, 0xed, 0xed, 0xeb, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xf5, 0xf5, 0xf5, 0xca, 0xca, 0xc8, 0xac, 0xac, 0xaa, 0x92, 0x90, 0x8f, 0x7c, 0x7b, 0x74, 0x47, 0x42, 0x3f, 0x25, 0x1c, 0x15, 0x24, 0x19, 0x13, 0x1f, 0x14, 0x0e, 0x20, 0x15, 0x0f, 0x2e, 0x23, 0x1d, 0x37, 0x26, 0x1e, 0x2e, 0x1e, 0x15, 0x42, 0x30, 0x24, 0x30, 0x1e, 0x12, 0x35, 0x23, 0x16, 0x38, 0x26, 0x18, 0x3b, 0x29, 0x1a, 0x37, 0x25, 0x19, 0x2b, 0x19, 0x12, 0x28, 0x18, 0x0b, 0x26, 0x16, 0x0d, 0x3b, 0x2c, 0x1d, 0x38, 0x28, 0x1a, 0x13, 0x0c, 0x07, 0x2d, 0x1d, 0x10, 0x19, 0x0f, 0x07, 0x1d, 0x10, 0x05, 0x0b, 0x04, 0x01, 0x03, 0x00, 0x01, 0x0e, 0x09, 0x05, 0x21, 0x14, 0x0b, 0x26, 0x17, 0x0b, 0x08, 0x02, 0x00, 0x04, 0x03, 0x03, 0x28, 0x1f, 0x19, 0x18, 0x0f, 0x07, 0x00, 0x02, 0x04, 0x12, 0x0c, 0x05, 0x26, 0x1b, 0x0e, 0x0f, 0x06, 0x01, 0x0f, 0x0c, 0x05, 0x2e, 0x1d, 0x14, 0x13, 0x09, 0x05, 0x15, 0x09, 0x02, 0x1e, 0x0f, 0x06, 0x17, 0x08, 0x00, 0x12, 0x09, 0x04, 0x13, 0x0a, 0x05, 0x0f, 0x06, 0x03, 0x13, 0x08, 0x03, 0x15, 0x0c, 0x05, 0x10, 0x07, 0x00, 0x11, 0x0b, 0x0a, 0x31, 0x21, 0x17, 0x27, 0x1a, 0x12, 0x35, 0x23, 0x17, 0x39, 0x29, 0x1c, 0x44, 0x34, 0x28, 0x28, 0x1d, 0x13, 0x24, 0x19, 0x0f, 0x2d, 0x1f, 0x16, 0x2e, 0x20, 0x17, 0x50, 0x40, 0x36, 0x3e, 0x2f, 0x1f, 0x39, 0x2a, 0x22, 0x48, 0x38, 0x2c, 0x3e, 0x2d, 0x1f, 0x44, 0x34, 0x27, 0x3e, 0x2e, 0x22, 0x46, 0x36, 0x29, 0x34, 0x24, 0x17, 0x43, 0x32, 0x25, 0x51, 0x3e, 0x28, 0x4c, 0x38, 0x26, 0x32, 0x22, 0x14, 0x32, 0x22, 0x14, 0x2b, 0x1a, 0x10, 0x37, 0x27, 0x18, 0x34, 0x25, 0x16, 0x3b, 0x2b, 0x1f, 0x36, 0x26, 0x19, 0x43, 0x2e, 0x1c, 0x40, 0x32, 0x23, 0x47, 0x33, 0x21, 0x40, 0x2d, 0x1b, 0x4f, 0x39, 0x26, 0x5c, 0x44, 0x30, 0x48, 0x33, 0x21, 0x2c, 0x19, 0x12, 0x45, 0x2f, 0x21, 0x51, 0x3e, 0x2d, 0x37, 0x2a, 0x1a, 0x42, 0x30, 0x22, 0x3a, 0x27, 0x1d, 0x32, 0x21, 0x19, 0x2f, 0x1f, 0x16, 0x47, 0x33, 0x2c, 0x49, 0x38, 0x2a, 0x38, 0x24, 0x15, 0x5e, 0x4a, 0x3b, 0x3e, 0x2a, 0x1f, 0x49, 0x38, 0x29, 0x2a, 0x18, 0x0c, 0x2b, 0x19, 0x0d, 0x43, 0x30, 0x28, 0x33, 0x21, 0x14, 0x3d, 0x2d, 0x23, 0x3c, 0x2a, 0x1f, 0x4b, 0x34, 0x26, 0x46, 0x30, 0x24, 0x40, 0x2f, 0x26, 0x32, 0x23, 0x1c, 0x31, 0x23, 0x1c, 0x30, 0x25, 0x1d, 0x52, 0x43, 0x38, 0x4a, 0x3f, 0x36, 0x5b, 0x55, 0x51, 0x85, 0x7e, 0x78, 0x84, 0x7d, 0x78, 0xb8, 0xb6, 0xb3, 0xc6, 0xc5, 0xc1, 0xd6, 0xd6, 0xd4, 0xd6, 0xd6, 0xd4, 0xf2, 0xf2, 0xf0, 0xf4, 0xf5, 0xf2, 0xfb, 0xfb, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xce, 0xcf, 0xc8, 0x97, 0x97, 0x96, 0x8c, 0x8b, 0x87, 0x8a, 0x89, 0x85, 0x47, 0x40, 0x3b, 0x23, 0x17, 0x13, 0x22, 0x16, 0x11, 0x2a, 0x1b, 0x12, 0x41, 0x2b, 0x20, 0x36, 0x28, 0x1e, 0x30, 0x22, 0x1b, 0x3b, 0x29, 0x1f, 0x30, 0x1f, 0x16, 0x2a, 0x19, 0x10, 0x36, 0x26, 0x1a, 0x38, 0x28, 0x1a, 0x2f, 0x1f, 0x11, 0x22, 0x14, 0x0e, 0x29, 0x1c, 0x12, 0x23, 0x15, 0x0b, 0x1d, 0x11, 0x0a, 0x2c, 0x1d, 0x0e, 0x30, 0x20, 0x12, 0x16, 0x0a, 0x06, 0x28, 0x18, 0x0b, 0x25, 0x15, 0x08, 0x32, 0x22, 0x10, 0x12, 0x0a, 0x06, 0x02, 0x01, 0x02, 0x0c, 0x0c, 0x03, 0x19, 0x09, 0x03, 0x14, 0x09, 0x02, 0x0d, 0x08, 0x07, 0x14, 0x0e, 0x08, 0x0e, 0x0c, 0x0b, 0x0d, 0x06, 0x01, 0x06, 0x02, 0x01, 0x0a, 0x06, 0x01, 0x27, 0x1a, 0x0c, 0x1e, 0x12, 0x09, 0x1a, 0x10, 0x09, 0x26, 0x18, 0x12, 0x1c, 0x10, 0x08, 0x13, 0x0b, 0x02, 0x20, 0x14, 0x08, 0x1a, 0x0d, 0x09, 0x0e, 0x05, 0x02, 0x15, 0x09, 0x02, 0x19, 0x0b, 0x05, 0x17, 0x09, 0x03, 0x13, 0x0a, 0x04, 0x13, 0x09, 0x03, 0x17, 0x0e, 0x09, 0x38, 0x2a, 0x20, 0x2f, 0x22, 0x18, 0x28, 0x15, 0x0a, 0x3e, 0x30, 0x21, 0x4c, 0x3e, 0x2f, 0x3f, 0x2f, 0x21, 0x23, 0x1b, 0x15, 0x37, 0x2c, 0x20, 0x2d, 0x1d, 0x11, 0x4d, 0x42, 0x35, 0x3b, 0x2b, 0x21, 0x4c, 0x3b, 0x2c, 0x4c, 0x3b, 0x2d, 0x3d, 0x2b, 0x1d, 0x58, 0x48, 0x3c, 0x3f, 0x2f, 0x22, 0x3c, 0x2c, 0x24, 0x37, 0x27, 0x1a, 0x3d, 0x2a, 0x1c, 0x50, 0x3d, 0x2a, 0x3c, 0x2a, 0x1b, 0x25, 0x17, 0x0b, 0x2d, 0x1f, 0x12, 0x29, 0x1b, 0x0e, 0x38, 0x28, 0x1b, 0x31, 0x21, 0x15, 0x2f, 0x1f, 0x12, 0x42, 0x32, 0x25, 0x35, 0x23, 0x15, 0x45, 0x35, 0x26, 0x46, 0x34, 0x23, 0x48, 0x35, 0x23, 0x55, 0x40, 0x2f, 0x5f, 0x47, 0x33, 0x3f, 0x2f, 0x20, 0x3e, 0x2c, 0x1f, 0x46, 0x33, 0x27, 0x52, 0x40, 0x2e, 0x2f, 0x21, 0x12, 0x49, 0x37, 0x27, 0x4a, 0x39, 0x29, 0x3e, 0x2a, 0x1d, 0x2f, 0x20, 0x17, 0x38, 0x2a, 0x22, 0x48, 0x36, 0x2b, 0x3e, 0x2b, 0x1f, 0x44, 0x36, 0x28, 0x37, 0x28, 0x1e, 0x56, 0x41, 0x34, 0x26, 0x14, 0x0b, 0x36, 0x23, 0x1b, 0x37, 0x26, 0x1e, 0x36, 0x25, 0x1c, 0x38, 0x26, 0x1b, 0x35, 0x24, 0x18, 0x48, 0x34, 0x26, 0x33, 0x23, 0x17, 0x49, 0x36, 0x2a, 0x38, 0x29, 0x22, 0x35, 0x27, 0x20, 0x2e, 0x25, 0x1e, 0x3e, 0x34, 0x2c, 0x48, 0x3a, 0x34, 0x4c, 0x48, 0x40, 0x73, 0x6a, 0x65, 0x93, 0x8f, 0x86, 0x8b, 0x89, 0x85, 0xd6, 0xd7, 0xd7, 0xdc, 0xdc, 0xda, 0xde, 0xdf, 0xdd, 0xe8, 0xe9, 0xe6, 0xf8, 0xf8, 0xf6, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } diff --git a/examples/app_mobilenetv2/src/main.c b/examples/app_mobilenetv2/src/main.c new file mode 100644 index 000000000..0df72c84e --- /dev/null +++ b/examples/app_mobilenetv2/src/main.c @@ -0,0 +1,65 @@ +// Copyright 2023 XMOS LIMITED. +// This Software is subject to the terms of the XMOS Public Licence: Version 1. +#include +#include + +#include "flash_server.h" +#include "stdio.h" +#include +#include +#include + + +DECLARE_JOB(f_server, (chanend_t*, flash_t*, int, + fl_QSPIPorts *, fl_QuadDeviceSpec*, + int) ); + +DECLARE_JOB(f_client, (chanend_t)); + + +flash_t headers[2]; + +#define NFLASH_SPECS 1 + +// #define FL_QUADDEVICE_DEFAULT {0,0} +// #define PORT_SQI_CS XS1_PORT_1B +// #define PORT_SQI_SCLK XS1_PORT_1C +// #define PORT_SQI_SIO XS1_PORT_4B + +fl_QuadDeviceSpec flash_spec[NFLASH_SPECS] = { + FL_QUADDEVICE_DEFAULT //FL_QUADDEVICE_MACRONIX_MX25R6435FM2IH0 +}; + +fl_QSPIPorts qspi = { + PORT_SQI_CS, + PORT_SQI_SCLK, + PORT_SQI_SIO, + XS1_CLKBLK_2 +}; + + +extern void init(void * c_flash); +extern void inference(); + +void f_server(chanend_t c_flash[], flash_t headers[], int n_flash, + fl_QSPIPorts *qspi, fl_QuadDeviceSpec flash_spec[], + int n_flash_spec) { + flash_server(c_flash, headers, n_flash, qspi, flash_spec, n_flash_spec); +} + +void f_client(chanend_t c_flash) { + init((void*)c_flash); + inference(); + chan_out_word(c_flash, FLASH_SERVER_QUIT); +} + +int main() { + channel_t a = chan_alloc(); + chanend_t fs[1] = {a.end_a}; + + PAR_JOBS( + PJOB(f_server, (fs,headers,1,&qspi,flash_spec,NFLASH_SPECS)), + PJOB(f_client, (a.end_b))); + + return 0; +} diff --git a/examples/app_mobilenetv2/src/support.cpp b/examples/app_mobilenetv2/src/support.cpp new file mode 100644 index 000000000..89428f925 --- /dev/null +++ b/examples/app_mobilenetv2/src/support.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include "model.tflite.h" +#include + +// The sample input image is initialized at the beginning of the tensor arena. +// Before we run inference, the input image is copied to the input tensor +// location in the tensor arena. +// With this optimization, we don't need an extra array to store the input +// image. Sample input image is of a LION and of size 160x160x3 = 76800 bytes +uint8_t tensor_arena[LARGEST_TENSOR_ARENA_SIZE] __attribute__((aligned(8))) = + LION_IMAGE; +#define LION_CLASS 291 + +void init_cpp(void* flash_data) { model_init(flash_data); } + +void run() { + int8_t *p = model_input(0)->data.int8; + // Copy the input image into input tensor location + // The input image values are between 0 and 255 + // Adjust the input image values to be between -128 and 127 + for (int i = 0; i < model_input_size(0); ++i) { + p[i] = tensor_arena[i] - 128; + } + + model_invoke(); + + int maxIndex = -1; + int max = -128; + int8_t *out = model_output(0)->data.int8; + for (int i = 0; i < model_output_size(0); ++i) { + if (out[i] > max) { + max = out[i]; + maxIndex = i; + } + } + if (maxIndex == LION_CLASS) { + printf("\nCorrect - Inferred class is LION!\n"); + } else { + printf("\nIncorrect class!\n"); + } +} + +extern "C" { +void init(void * flash_data) { init_cpp(flash_data); } + +void inference() { run(); } +} diff --git a/examples/app_mobilenetv2/test_mobilenetv2.py b/examples/app_mobilenetv2/test_mobilenetv2.py new file mode 100644 index 000000000..365d77078 --- /dev/null +++ b/examples/app_mobilenetv2/test_mobilenetv2.py @@ -0,0 +1,27 @@ +import csv +import subprocess +import pytest +import os +from obtain_and_optimize_mobilenetv2 import get_mobilenetv2, optimize_mobilenetv2 + +TEST_DIR = os.path.dirname(os.path.abspath(__file__)) +CSV_FILE_PATH = os.path.join(TEST_DIR, 'arena_sizes.csv') # Define path for CSV file +MAX_ARENA_SIZE = 345328 + +@pytest.fixture +def build_and_run_example(): + os.chdir(TEST_DIR) + get_mobilenetv2() + arena_size = optimize_mobilenetv2() + assert arena_size <= MAX_ARENA_SIZE, f"Optimized model size is too large: {arena_size} bytes" + with open(CSV_FILE_PATH, 'a', newline='') as csvfile: + writer = csv.writer(csvfile) + writer.writerow([arena_size]) + subprocess.run(["xmake"], check=True, cwd=TEST_DIR) + subprocess.run(["xflash", "--target", "XCORE-AI-EXPLORER", "--id", "0", "--data", "xcore_flash_binary.out"], check=True, cwd=TEST_DIR) + result = subprocess.run(["xrun", "--xscope", "--id", "0", "bin/app_mobilenetv2.xe"], check=True, cwd=TEST_DIR, capture_output=True, text=True) + return result.stdout + +def test_example_output(build_and_run_example): + expected_keyword = "LION" + assert expected_keyword in build_and_run_example, f"Output did not contain expected keyword: '{expected_keyword}'" diff --git a/examples/app_no_flash/Makefile b/examples/app_no_flash/Makefile new file mode 100644 index 000000000..238e35b62 --- /dev/null +++ b/examples/app_no_flash/Makefile @@ -0,0 +1,32 @@ +TARGET = XCORE-AI-EXPLORER +APP_NAME = + +APP_FLAGS = -report \ +-O3 -mcmodel=large -fxscope -Wno-xcore-fptrgroup \ +-g \ +-lquadflash + +# ******************************************************* +# Include AI Tools library and headers +# ******************************************************* +# The following variables are defined for AI Tools library +# and should be included when building the app. +# XMOS_AITOOLSLIB_DEFINITIONS +# XMOS_AITOOLSLIB_INCLUDES +# XMOS_AITOOLSLIB_LIBRARIES +# +ifeq ($(XMOS_AITOOLSLIB_PATH),) +$(error Path to XMOS AI Tools library and headers not set correctly!) +endif +include ${XMOS_AITOOLSLIB_PATH}/buildfiles/aitoolslib.make + +XCC_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_CPP_FLAGS = $(APP_FLAGS) -std=c++14 $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_MAP_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_LIBRARIES) + +#============================================================================= +# The following part of the Makefile includes the common build infrastructure +# for compiling XMOS applications. You should not need to edit below here. + +XMOS_MAKE_PATH ?= ../.. +include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common diff --git a/examples/app_no_flash/README.rst b/examples/app_no_flash/README.rst new file mode 100644 index 000000000..68ed205e7 --- /dev/null +++ b/examples/app_no_flash/README.rst @@ -0,0 +1,34 @@ +Example without flash +===================== + +Please consult `here <../../docs/rst/flow.rst>`_ on how to install the tools. + +In order to compile and run this example follow these steps:: + + xcore-opt vww_quant.tflite -o model.tflite + mv model.tflite.cpp model.tflite.h src + xmake + xrun --xscope bin/app_no_flash.xe + +This should print:: + + No human (9%) + Human (98%) + +The first step optimised the ``vww_quant.tflite`` model for xcore; it +produces three files:: + + model.tflite + model.tflite.cpp + model.tflite.h + +The first file is the optimised model; the second file is the generated +source code, the third file is the header for the source code. + +The second step places the source code into the source directory. + +The third step builds the project. + +The final step runs the code. + + diff --git a/examples/app_no_flash/src/config.xscope b/examples/app_no_flash/src/config.xscope new file mode 100644 index 000000000..ef80fed5b --- /dev/null +++ b/examples/app_no_flash/src/config.xscope @@ -0,0 +1,3 @@ + + + diff --git a/examples/app_no_flash/src/image.h b/examples/app_no_flash/src/image.h new file mode 100644 index 000000000..dc3c860a3 --- /dev/null +++ b/examples/app_no_flash/src/image.h @@ -0,0 +1,27650 @@ +int8_t image[3*96*96] = { + 73, + 40, + 0, + 73, + 40, + -4, + 77, + 44, + 0, + 78, + 44, + -1, + 74, + 37, +-11, + 71, + 36, +-14, + 70, + 36, + -8, + 66, + 33, + -7, + 65, + 32, + -5, + 64, + 32, + -4, + 63, + 33, + -2, + 63, + 35, + 1, + 65, + 39, + 10, + 67, + 42, + 16, + 67, + 44, + 19, + 67, + 46, + 22, + 68, + 49, + 27, + 68, + 52, + 30, + 69, + 54, + 37, + 72, + 58, + 42, + 74, + 61, + 46, + 77, + 64, + 53, + 78, + 69, + 56, + 82, + 72, + 60, + 83, + 75, + 64, + 85, + 77, + 68, + 87, + 79, + 72, + 89, + 81, + 76, + 91, + 84, + 78, + 92, + 85, + 80, + 93, + 88, + 82, + 95, + 89, + 85, + 95, + 90, + 87, + 96, + 91, + 88, + 97, + 92, + 89, + 97, + 92, + 89, + 98, + 93, + 90, + 98, + 93, + 90, + 99, + 94, + 91, + 99, + 94, + 92, + 99, + 93, + 91, + 99, + 93, + 91, +100, + 94, + 92, + 99, + 94, + 91, + 99, + 93, + 91, + 99, + 93, + 91, +100, + 94, + 91, + 99, + 94, + 90, +100, + 95, + 91, +100, + 95, + 91, + 99, + 94, + 89, + 99, + 94, + 88, + 98, + 93, + 88, + 98, + 93, + 88, + 98, + 92, + 87, + 97, + 92, + 86, + 97, + 91, + 85, + 97, + 91, + 84, + 96, + 89, + 82, + 95, + 89, + 82, + 96, + 89, + 82, + 95, + 89, + 82, + 95, + 88, + 81, + 94, + 87, + 79, + 93, + 86, + 76, + 93, + 86, + 76, + 92, + 85, + 75, + 92, + 85, + 75, + 91, + 84, + 75, + 90, + 83, + 73, + 89, + 82, + 72, + 88, + 81, + 70, + 88, + 81, + 70, + 87, + 81, + 69, + 87, + 80, + 68, + 87, + 80, + 68, + 88, + 79, + 68, + 88, + 80, + 68, + 89, + 79, + 68, + 88, + 78, + 67, + 88, + 78, + 66, + 88, + 77, + 65, + 87, + 76, + 64, + 86, + 75, + 63, + 85, + 74, + 61, + 86, + 74, + 58, + 86, + 73, + 58, + 86, + 73, + 57, + 86, + 74, + 58, + 85, + 72, + 57, + 86, + 72, + 57, + 85, + 71, + 55, + 85, + 71, + 56, + 85, + 71, + 55, + 83, + 69, + 53, + 82, + 68, + 51, + 73, + 37, +-28, + 72, + 38, +-11, + 72, + 38, + -2, + 74, + 41, + -5, + 77, + 44, + -3, + 77, + 40, + -8, + 71, + 33, +-21, + 68, + 31, +-20, + 67, + 31, +-13, + 63, + 28, +-13, + 64, + 28, +-11, + 62, + 28, +-12, + 63, + 30, + -8, + 62, + 33, + -1, + 63, + 36, + 5, + 64, + 37, + 9, + 63, + 38, + 11, + 63, + 40, + 12, + 64, + 42, + 16, + 64, + 43, + 19, + 65, + 45, + 23, + 66, + 47, + 26, + 68, + 49, + 29, + 69, + 51, + 33, + 70, + 53, + 34, + 71, + 56, + 40, + 72, + 58, + 43, + 73, + 61, + 46, + 77, + 64, + 50, + 76, + 67, + 54, + 78, + 70, + 56, + 81, + 72, + 60, + 82, + 73, + 64, + 82, + 75, + 66, + 84, + 77, + 68, + 85, + 78, + 69, + 86, + 79, + 70, + 86, + 80, + 71, + 88, + 82, + 74, + 89, + 82, + 75, + 90, + 84, + 79, + 90, + 84, + 79, + 91, + 85, + 79, + 92, + 85, + 79, + 92, + 86, + 78, + 92, + 86, + 78, + 94, + 88, + 78, + 94, + 88, + 79, + 95, + 89, + 79, + 95, + 89, + 80, + 95, + 89, + 80, + 95, + 89, + 80, + 95, + 89, + 79, + 95, + 89, + 79, + 96, + 89, + 78, + 95, + 89, + 77, + 95, + 88, + 76, + 95, + 88, + 76, + 94, + 88, + 76, + 94, + 87, + 75, + 93, + 87, + 75, + 93, + 87, + 74, + 92, + 86, + 74, + 91, + 85, + 73, + 90, + 83, + 71, + 89, + 82, + 70, + 87, + 81, + 69, + 86, + 80, + 68, + 85, + 79, + 66, + 85, + 79, + 66, + 85, + 78, + 66, + 85, + 76, + 65, + 84, + 76, + 64, + 84, + 75, + 63, + 85, + 75, + 63, + 84, + 74, + 61, + 84, + 74, + 62, + 84, + 73, + 60, + 84, + 72, + 57, + 83, + 71, + 57, + 83, + 71, + 56, + 83, + 70, + 53, + 83, + 70, + 52, + 82, + 69, + 51, + 81, + 68, + 50, + 80, + 66, + 48, + 82, + 65, + 47, + 80, + 65, + 46, + 79, + 64, + 43, + 78, + 62, + 41, + 79, + 61, + 40, + 77, + 59, + 38, + 75, + 57, + 34, + 73, + 53, + 30, + 70, + 48, + 26, + 66, + 41, + 18, + 77, + 41, +-27, + 76, + 38, +-30, + 72, + 35, +-27, + 70, + 36, +-12, + 71, + 37, +-10, + 74, + 37, +-10, + 77, + 39, +-12, + 72, + 34, +-23, + 67, + 26, +-31, + 64, + 25, +-28, + 61, + 22, +-27, + 60, + 22, +-26, + 59, + 21, +-25, + 59, + 22, +-23, + 59, + 23, +-21, + 59, + 25, +-16, + 59, + 26, +-14, + 59, + 27, +-10, + 60, + 27, +-10, + 60, + 29, + -7, + 61, + 30, + -4, + 61, + 32, + -1, + 61, + 33, + 1, + 62, + 34, + 2, + 62, + 35, + 3, + 62, + 36, + 7, + 62, + 37, + 8, + 63, + 40, + 11, + 65, + 42, + 15, + 65, + 43, + 19, + 66, + 46, + 23, + 67, + 49, + 28, + 68, + 52, + 30, + 69, + 54, + 35, + 70, + 56, + 38, + 71, + 58, + 42, + 73, + 61, + 45, + 74, + 63, + 48, + 76, + 65, + 51, + 76, + 67, + 54, + 78, + 69, + 58, + 79, + 71, + 60, + 81, + 73, + 61, + 83, + 75, + 63, + 84, + 77, + 65, + 86, + 80, + 67, + 87, + 81, + 68, + 89, + 83, + 70, + 91, + 85, + 72, + 92, + 86, + 73, + 92, + 87, + 74, + 94, + 88, + 75, + 94, + 88, + 75, + 94, + 88, + 75, + 95, + 89, + 76, + 95, + 89, + 76, + 95, + 89, + 76, + 94, + 88, + 75, + 94, + 88, + 75, + 94, + 88, + 75, + 93, + 86, + 73, + 92, + 86, + 73, + 91, + 85, + 72, + 90, + 84, + 71, + 88, + 81, + 68, + 87, + 79, + 66, + 85, + 78, + 62, + 84, + 75, + 60, + 82, + 74, + 59, + 82, + 71, + 57, + 81, + 69, + 55, + 80, + 68, + 52, + 79, + 66, + 48, + 79, + 65, + 46, + 79, + 64, + 46, + 77, + 63, + 43, + 77, + 63, + 42, + 76, + 62, + 41, + 76, + 60, + 39, + 77, + 60, + 38, + 78, + 59, + 37, + 78, + 58, + 35, + 77, + 56, + 34, + 76, + 55, + 32, + 76, + 54, + 28, + 75, + 52, + 26, + 74, + 51, + 22, + 74, + 49, + 20, + 73, + 48, + 19, + 72, + 46, + 13, + 70, + 43, + 9, + 69, + 39, + 6, + 67, + 36, + 1, + 64, + 32, + -5, + 61, + 27, +-10, + 57, + 23, +-16, + 79, + 43, +-24, + 77, + 41, +-27, + 75, + 39, +-29, + 75, + 36, +-31, + 71, + 33, +-29, + 66, + 31, +-21, + 69, + 31, +-20, + 69, + 33, +-24, + 69, + 31, +-26, + 64, + 23, +-36, + 60, + 18, +-39, + 59, + 17, +-38, + 56, + 16, +-38, + 56, + 16, +-37, + 55, + 16, +-37, + 53, + 15, +-37, + 54, + 16, +-38, + 54, + 15, +-34, + 54, + 15, +-34, + 54, + 15, +-34, + 54, + 15, +-31, + 55, + 15, +-30, + 53, + 15, +-30, + 55, + 16, +-29, + 54, + 16, +-28, + 54, + 18, +-27, + 54, + 17, +-25, + 55, + 18, +-24, + 56, + 19, +-23, + 56, + 19, +-23, + 56, + 19, +-21, + 55, + 20, +-20, + 54, + 21, +-18, + 53, + 22, +-15, + 52, + 23, +-12, + 52, + 24, + -8, + 52, + 25, + -5, + 53, + 26, + -3, + 54, + 29, + -1, + 54, + 31, + 2, + 55, + 34, + 6, + 58, + 38, + 12, + 62, + 43, + 17, + 65, + 47, + 22, + 69, + 53, + 28, + 73, + 58, + 34, + 75, + 62, + 38, + 78, + 66, + 41, + 81, + 69, + 45, + 83, + 71, + 47, + 84, + 72, + 49, + 85, + 73, + 51, + 87, + 74, + 53, + 88, + 76, + 53, + 87, + 76, + 53, + 86, + 76, + 54, + 86, + 76, + 52, + 87, + 75, + 51, + 86, + 74, + 52, + 85, + 73, + 50, + 85, + 73, + 49, + 83, + 71, + 48, + 82, + 69, + 46, + 79, + 66, + 43, + 77, + 62, + 38, + 74, + 58, + 33, + 69, + 52, + 27, + 66, + 47, + 21, + 62, + 42, + 15, + 61, + 38, + 10, + 59, + 36, + 7, + 60, + 35, + 6, + 62, + 36, + 5, + 62, + 34, + 4, + 62, + 34, + 2, + 63, + 34, + 1, + 64, + 35, + -1, + 65, + 36, + -1, + 67, + 35, + -1, + 69, + 37, + 1, + 70, + 38, + 1, + 70, + 39, + -1, + 71, + 38, + -2, + 70, + 38, + -3, + 70, + 37, + -5, + 70, + 37, + -7, + 68, + 35, + -8, + 68, + 33, +-10, + 68, + 32, +-13, + 67, + 30, +-14, + 65, + 29, +-16, + 65, + 28, +-18, + 65, + 26, +-19, + 63, + 25, +-20, + 65, + 25, +-21, + 63, + 25, +-22, + 80, + 45, +-23, + 78, + 42, +-25, + 77, + 41, +-27, + 76, + 39, +-29, + 75, + 35, +-32, + 70, + 30, +-37, + 65, + 25, +-38, + 61, + 23, +-32, + 62, + 22, +-33, + 65, + 24, +-34, + 65, + 24, +-35, + 64, + 22, +-35, + 65, + 24, +-33, + 64, + 23, +-33, + 63, + 21, +-33, + 62, + 21, +-34, + 62, + 21, +-34, + 61, + 20, +-35, + 59, + 19, +-35, + 59, + 19, +-35, + 58, + 19, +-34, + 57, + 19, +-33, + 57, + 19, +-31, + 57, + 19, +-32, + 57, + 19, +-32, + 57, + 19, +-31, + 58, + 19, +-31, + 57, + 18, +-31, + 58, + 19, +-29, + 58, + 19, +-29, + 58, + 19, +-29, + 57, + 18, +-30, + 56, + 17, +-30, + 54, + 14, +-30, + 51, + 14, +-30, + 49, + 14, +-28, + 49, + 14, +-28, + 49, + 14, +-28, + 48, + 14, +-28, + 46, + 12, +-31, + 43, + 8, +-34, + 38, + 3, +-41, + 39, + 4, +-39, + 45, + 10, +-34, + 51, + 16, +-29, + 58, + 24, +-22, + 62, + 29, +-18, + 65, + 32, +-17, + 66, + 34, +-13, + 67, + 36, +-12, + 67, + 36, +-14, + 68, + 37, +-14, + 69, + 37, +-12, + 69, + 38, +-12, + 72, + 40, + -8, + 74, + 42, + -4, + 75, + 44, + 0, + 75, + 46, + 1, + 76, + 45, + 2, + 73, + 46, + 0, + 73, + 45, + 0, + 73, + 44, + -2, + 73, + 43, + -3, + 71, + 39, + -5, + 68, + 36, + -9, + 64, + 31, +-12, + 61, + 27, +-16, + 57, + 23, +-19, + 53, + 19, +-22, + 55, + 20, +-21, + 59, + 26, +-15, + 63, + 31, +-10, + 62, + 29, +-12, + 60, + 27, +-15, + 60, + 23, +-21, + 60, + 22, +-26, + 60, + 22, +-27, + 60, + 23, +-28, + 61, + 23, +-30, + 63, + 24, +-31, + 63, + 23, +-31, + 64, + 23, +-30, + 64, + 23, +-30, + 63, + 22, +-32, + 63, + 22, +-32, + 62, + 21, +-33, + 60, + 19, +-35, + 61, + 19, +-35, + 60, + 19, +-37, + 61, + 19, +-37, + 61, + 20, +-36, + 61, + 19, +-35, + 61, + 20, +-35, + 61, + 19, +-35, + 62, + 20, +-38, + 61, + 19, +-38, + 83, + 47, +-20, + 81, + 45, +-22, + 79, + 43, +-24, + 78, + 41, +-27, + 77, + 37, +-30, + 73, + 33, +-35, + 68, + 28, +-44, + 64, + 20, +-52, + 60, + 17, +-47, + 59, + 17, +-40, + 59, + 18, +-39, + 69, + 30, +-27, + 69, + 32, +-25, + 69, + 31, +-25, + 67, + 29, +-27, + 67, + 28, +-27, + 67, + 30, +-26, + 67, + 29, +-27, + 66, + 28, +-27, + 67, + 28, +-27, + 64, + 26, +-27, + 65, + 27, +-26, + 64, + 26, +-24, + 63, + 25, +-25, + 64, + 25, +-24, + 63, + 25, +-24, + 64, + 26, +-24, + 65, + 26, +-23, + 65, + 27, +-23, + 64, + 26, +-22, + 63, + 25, +-24, + 63, + 25, +-23, + 61, + 23, +-25, + 58, + 19, +-26, + 52, + 14, +-29, + 44, + 10, +-32, + 43, + 10, +-31, + 43, + 10, +-33, + 43, + 10, +-34, + 45, + 12, +-32, + 44, + 11, +-33, + 39, + 4, +-40, + 36, + 1, +-43, + 41, + 6, +-40, + 49, + 14, +-35, + 55, + 21, +-28, + 58, + 24, +-25, + 60, + 26, +-24, + 61, + 27, +-23, + 63, + 28, +-21, + 64, + 29, +-20, + 65, + 30, +-19, + 65, + 31, +-19, + 66, + 31, +-20, + 66, + 32, +-19, + 67, + 33, +-17, + 69, + 34, +-12, + 70, + 36, +-10, + 68, + 37, +-11, + 68, + 35, +-11, + 68, + 35, +-12, + 66, + 33, +-14, + 64, + 32, +-15, + 62, + 27, +-18, + 58, + 23, +-23, + 56, + 20, +-25, + 51, + 16, +-29, + 46, + 11, +-33, + 43, + 8, +-35, + 47, + 13, +-31, + 54, + 20, +-24, + 53, + 18, +-28, + 49, + 14, +-34, + 47, + 10, +-36, + 45, + 6, +-41, + 51, + 12, +-37, + 56, + 18, +-34, + 59, + 22, +-34, + 63, + 25, +-31, + 65, + 27, +-29, + 65, + 27, +-29, + 66, + 26, +-29, + 66, + 25, +-31, + 65, + 23, +-32, + 64, + 22, +-33, + 63, + 21, +-35, + 61, + 19, +-36, + 59, + 17, +-40, + 58, + 17, +-41, + 57, + 15, +-43, + 58, + 16, +-40, + 59, + 18, +-39, + 60, + 19, +-38, + 60, + 19, +-36, + 60, + 19, +-37, + 61, + 21, +-38, + 85, + 49, +-18, + 83, + 47, +-20, + 81, + 45, +-22, + 79, + 43, +-24, + 79, + 40, +-27, + 75, + 35, +-35, + 70, + 30, +-42, + 68, + 23, +-49, + 63, + 17, +-56, + 59, + 11, +-61, + 57, + 12, +-53, + 54, + 13, +-51, + 63, + 23, +-38, + 60, + 21, +-38, + 53, + 14, +-45, + 64, + 23, +-35, + 60, + 20, +-39, + 51, + 12, +-43, + 59, + 20, +-40, + 59, + 20, +-34, + 50, + 12, +-46, + 57, + 19, +-39, + 52, + 14, +-39, + 56, + 18, +-34, + 56, + 20, +-33, + 50, + 13, +-37, + 53, + 18, +-32, + 58, + 21, +-31, + 46, + 9, +-39, + 54, + 18, +-32, + 52, + 16, +-36, + 40, + 6, +-43, + 48, + 12, +-38, + 46, + 10, +-37, + 30, + -7, +-51, + 7, +-18, +-55, + 29, + -5, +-49, + 27, + -6, +-50, + 28, + -4, +-52, + 24, + -8, +-56, + 31, + -2, +-50, + 22, + -9, +-58, + 16, +-16, +-61, + 31, + -2, +-49, + 32, + -1, +-49, + 28, + -7, +-52, + 41, + 7, +-44, + 45, + 9, +-42, + 38, + 3, +-46, + 47, + 12, +-40, + 46, + 11, +-39, + 44, + 8, +-41, + 48, + 14, +-38, + 42, + 10, +-43, + 52, + 19, +-33, + 50, + 16, +-35, + 45, + 11, +-39, + 56, + 22, +-27, + 57, + 23, +-26, + 47, + 13, +-34, + 54, + 21, +-28, + 54, + 20, +-29, + 45, + 10, +-38, + 50, + 14, +-34, + 41, + 6, +-43, + 46, + 10, +-38, + 44, + 8, +-41, + 34, + -1, +-50, + 36, + 2, +-43, + 40, + 5, +-45, + 35, + 0, +-49, + 43, + 5, +-47, + 42, + 4, +-49, + 33, + -5, +-56, + 40, + -1, +-54, + 12, +-20, +-60, + 36, + 0, +-51, + 50, + 10, +-46, + 52, + 12, +-46, + 51, + 10, +-50, + 57, + 15, +-45, + 52, + 11, +-50, + 57, + 16, +-46, + 58, + 15, +-48, + 48, + 6, +-54, + 57, + 14, +-50, + 56, + 13, +-50, + 46, + 3, +-59, + 49, + 6, +-58, + 46, + 3, +-61, + 43, + -1, +-62, + 47, + 3, +-59, + 44, + 2, +-60, + 47, + 6, +-56, + 50, + 9, +-55, + 45, + 5, +-59, + 87, + 51, +-16, + 85, + 49, +-18, + 84, + 48, +-19, + 82, + 46, +-21, + 80, + 41, +-26, + 77, + 38, +-33, + 72, + 31, +-41, + 68, + 24, +-49, + 66, + 19, +-54, + 63, + 15, +-60, + 64, + 16, +-65, + 65, + 17, +-63, + 67, + 19, +-61, + 66, + 19, +-60, + 66, + 19, +-58, + 66, + 19, +-56, + 65, + 18, +-57, + 65, + 18, +-56, + 65, + 18, +-56, + 64, + 18, +-56, + 63, + 18, +-56, + 63, + 18, +-56, + 63, + 18, +-56, + 62, + 18, +-55, + 61, + 18, +-55, + 60, + 19, +-55, + 60, + 18, +-55, + 60, + 19, +-53, + 59, + 17, +-52, + 58, + 16, +-54, + 57, + 15, +-52, + 55, + 13, +-53, + 52, + 11, +-56, + 41, + 0, +-64, +-18, +-46, +-81, +-27, +-50, +-84, +-20, +-46, +-85, +-33, +-54, +-86, +-28, +-48, +-82, +-10, +-39, +-82, +-24, +-46, +-87, +-23, +-50, +-93, +-52, +-67, +-86, +-26, +-49, +-80, + -8, +-33, +-68, + -6, +-31, +-64, + 7, +-18, +-55, + 10, +-13, +-47, + 12, +-12, +-48, + 10, +-13, +-46, + 10, +-12, +-46, + 11, +-11, +-44, + 11, +-10, +-45, + 13, + -6, +-41, + 13, + -8, +-40, + 12, + -7, +-39, + 13, + -5, +-38, + 15, + -4, +-36, + 13, + -5, +-37, + 13, + -6, +-36, + 11, + -8, +-38, + 11, + -9, +-36, + 8, +-12, +-41, + 5, +-13, +-42, + 6, +-14, +-44, + -3, +-30, +-67, +-23, +-54, +-89, + 1, +-46, +-97, +-42, +-67, +-91, +-11, +-45, +-89, +-26, +-55, +-96, +-13, +-43, +-87, +-37, +-62, +-97, +-26, +-52, +-90, +-28, +-53, +-88, +-13, +-39, +-85, +-27, +-53, +-90, + 51, + 7, +-60, + 57, + 12, +-61, + 61, + 14, +-59, + 63, + 16, +-59, + 63, + 16, +-59, + 62, + 14, +-60, + 61, + 14, +-61, + 60, + 13, +-62, + 59, + 11, +-64, + 58, + 9, +-65, + 56, + 7, +-68, + 55, + 6, +-69, + 53, + 5, +-70, + 53, + 5, +-70, + 53, + 5, +-70, + 54, + 7, +-68, + 55, + 8, +-68, + 55, + 8, +-68, + 56, + 9, +-69, + 87, + 55, + 3, + 85, + 50, +-17, + 86, + 50, +-17, + 84, + 48, +-19, + 82, + 45, +-22, + 80, + 40, +-30, + 74, + 33, +-39, + 70, + 27, +-48, + 68, + 21, +-54, + 65, + 17, +-59, + 66, + 18, +-63, + 67, + 19, +-63, + 70, + 22, +-59, + 70, + 23, +-58, + 69, + 22, +-58, + 68, + 21, +-55, + 68, + 21, +-54, + 68, + 21, +-54, + 68, + 21, +-53, + 67, + 20, +-54, + 66, + 20, +-54, + 66, + 21, +-53, + 66, + 21, +-53, + 65, + 21, +-53, + 64, + 22, +-53, + 63, + 23, +-52, + 63, + 22, +-50, + 63, + 22, +-51, + 62, + 21, +-51, + 62, + 21, +-52, + 60, + 19, +-48, + 58, + 16, +-50, + 55, + 13, +-52, + 50, + 9, +-57, + 39, + -3, +-68, + -1, +-36, +-85, + 19, +-28, +-92, + 16, +-30, +-84, + 8, +-39, +-87, + 5, +-44, +-103, + 32, +-13, +-63, + 14, +-33, +-82, + 40, + -1, +-45, + 22, +-24, +-73, + 33, +-17, +-72, + 50, + 4, +-48, + 80, + 56, + 6, + 87, + 68, + 24, + 88, + 73, + 32, + 87, + 71, + 31, + 89, + 72, + 29, + 89, + 74, + 33, + 89, + 77, + 39, + 91, + 77, + 43, + 89, + 78, + 43, + 91, + 79, + 46, + 97, + 85, + 53, + 95, + 85, + 49, + 98, + 86, + 51, + 97, + 85, + 51, + 95, + 81, + 49, + 97, + 84, + 50, + 97, + 83, + 47, + 95, + 84, + 49, + 95, + 78, + 38, + 56, + 12, +-47, + 55, + 12, +-37, + 33, +-10, +-49, + 31, +-20, +-73, + 40, + -9, +-63, + 9, +-43, +-104, + 6, +-44, +-110, + 18, +-42, +-109, + 35, +-17, +-75, + 24, +-18, +-74, + 21, +-18, +-78, + 44, + 2, +-62, + 55, + 10, +-59, + 59, + 14, +-59, + 63, + 17, +-57, + 64, + 18, +-56, + 66, + 19, +-56, + 65, + 18, +-57, + 64, + 17, +-58, + 64, + 15, +-59, + 62, + 14, +-60, + 61, + 13, +-62, + 59, + 12, +-63, + 60, + 11, +-65, + 58, + 11, +-64, + 58, + 11, +-64, + 58, + 11, +-64, + 58, + 11, +-64, + 59, + 12, +-63, + 57, + 10, +-66, + 57, + 10, +-70, + 91, + 76, + 51, + 88, + 68, + 41, + 85, + 56, + 12, + 84, + 48, +-14, + 84, + 45, +-23, + 82, + 42, +-29, + 77, + 36, +-38, + 75, + 29, +-45, + 70, + 24, +-51, + 67, + 19, +-57, + 68, + 19, +-62, + 69, + 21, +-61, + 72, + 24, +-58, + 71, + 24, +-57, + 70, + 23, +-57, + 69, + 23, +-55, + 69, + 22, +-53, + 68, + 23, +-52, + 68, + 22, +-52, + 67, + 22, +-52, + 68, + 23, +-51, + 68, + 23, +-51, + 68, + 23, +-51, + 66, + 24, +-49, + 65, + 24, +-49, + 66, + 25, +-47, + 66, + 25, +-47, + 65, + 24, +-48, + 65, + 24, +-47, + 64, + 22, +-48, + 62, + 21, +-48, + 60, + 19, +-47, + 57, + 16, +-50, + 53, + 13, +-54, + 44, + 4, +-61, + 20, +-25, +-89, + 37, +-10, +-58, + 43, + -6, +-55, + 20, +-28, +-72, + 15, +-36, +-93, + 32, +-20, +-75, + 33, +-18, +-67, + 40, +-10, +-60, + 21, +-29, +-83, + 56, + 4, +-59, + 41, + -9, +-70, + 84, + 58, + 5, +100, + 87, + 42, + 98, + 91, + 48, + 99, + 91, + 50, +100, + 90, + 48, +100, + 93, + 57, +101, + 94, + 59, + 99, + 92, + 59, +101, + 92, + 59, +101, + 94, + 63, +105, + 98, + 68, +104, + 98, + 64, +105, + 99, + 67, +107, +100, + 67, +105, + 99, + 66, +106, + 99, + 66, +107, +100, + 66, +107, +100, + 67, +103, + 89, + 45, + 59, + 0, +-85, + 37, + -5, +-41, + 43, + -3, +-44, + 17, +-33, +-80, + 44, + -5, +-60, + 22, +-28, +-82, + 19, +-32, +-86, + 18, +-30, +-75, + 57, + 12, +-37, + 16, +-38, +-91, + 22, +-31, +-93, + 51, + 6, +-60, + 58, + 13, +-58, + 62, + 17, +-56, + 64, + 18, +-55, + 64, + 19, +-55, + 66, + 19, +-56, + 67, + 20, +-55, + 66, + 19, +-56, + 65, + 18, +-57, + 63, + 16, +-59, + 62, + 15, +-60, + 63, + 16, +-59, + 63, + 16, +-60, + 63, + 16, +-59, + 62, + 15, +-60, + 61, + 14, +-61, + 61, + 14, +-61, + 61, + 14, +-61, + 59, + 12, +-65, + 59, + 12, +-68, + 89, + 69, + 42, + 91, + 77, + 56, + 92, + 76, + 55, + 89, + 67, + 41, + 85, + 56, + 15, + 81, + 46, +-12, + 78, + 35, +-39, + 76, + 31, +-44, + 72, + 25, +-50, + 68, + 20, +-56, + 69, + 21, +-60, + 72, + 24, +-61, + 73, + 25, +-57, + 72, + 24, +-57, + 72, + 25, +-55, + 70, + 25, +-53, + 69, + 24, +-51, + 69, + 24, +-51, + 69, + 24, +-50, + 69, + 24, +-50, + 69, + 24, +-50, + 68, + 26, +-49, + 67, + 27, +-49, + 69, + 27, +-46, + 69, + 27, +-45, + 68, + 27, +-45, + 68, + 28, +-45, + 67, + 27, +-46, + 66, + 26, +-46, + 66, + 25, +-45, + 64, + 24, +-43, + 63, + 22, +-45, + 60, + 20, +-47, + 55, + 15, +-51, + 50, + 9, +-57, + 36, + -6, +-71, + 28, +-20, +-84, + 27, +-27, +-85, + 30, +-22, +-76, + 17, +-31, +-76, + 41, + -8, +-59, + 49, + 3, +-48, + 26, +-25, +-72, + 29, +-22, +-72, + 31, +-16, +-67, + 52, + -5, +-83, + 97, + 76, + 25, +109, +103, + 65, +108, +104, + 69, +107, +103, + 67, +106, +104, + 70, +107, +104, + 75, +107, +104, + 76, +106, +104, + 76, +107, +103, + 75, +107, +105, + 78, +110, +108, + 84, +109, +107, + 81, +111, +109, + 82, +112, +110, + 84, +112, +110, + 83, +113, +111, + 85, +114, +112, + 84, +116, +114, + 90, +116, +113, + 81, + 66, + 15, +-56, + 51, + 0, +-56, + 47, + 0, +-42, + 23, +-23, +-72, + 50, + 4, +-53, + 15, +-37, +-84, + 42, + -2, +-46, + 28, +-10, +-44, + 48, + 5, +-34, + 11, +-41, +-91, + 38, +-13, +-79, + 52, + 6, +-60, + 59, + 14, +-58, + 64, + 19, +-55, + 65, + 20, +-54, + 67, + 21, +-53, + 69, + 22, +-53, + 69, + 22, +-53, + 68, + 21, +-54, + 66, + 19, +-56, + 65, + 18, +-57, + 65, + 18, +-57, + 66, + 19, +-57, + 67, + 20, +-57, + 67, + 20, +-55, + 65, + 18, +-57, + 63, + 16, +-60, + 62, + 15, +-61, + 62, + 15, +-60, + 60, + 13, +-64, + 61, + 13, +-67, + 64, + 44, + 18, + 62, + 47, + 27, + 86, + 68, + 43, + 91, + 68, + 42, + 90, + 64, + 33, + 87, + 61, + 24, + 85, + 53, + 10, + 79, + 40, +-20, + 70, + 25, +-46, + 69, + 22, +-55, + 71, + 23, +-59, + 74, + 27, +-59, + 75, + 27, +-56, + 74, + 27, +-54, + 73, + 26, +-53, + 71, + 26, +-53, + 70, + 25, +-50, + 71, + 26, +-49, + 71, + 26, +-48, + 70, + 25, +-49, + 71, + 26, +-48, + 70, + 28, +-47, + 70, + 30, +-46, + 70, + 30, +-45, + 70, + 30, +-43, + 70, + 29, +-43, + 70, + 30, +-42, + 69, + 30, +-43, + 68, + 29, +-44, + 68, + 28, +-42, + 66, + 26, +-41, + 65, + 25, +-42, + 61, + 21, +-46, + 58, + 18, +-49, + 53, + 12, +-54, + 47, + 6, +-60, + 32, +-12, +-79, + 18, +-35, +-95, + 0, +-54, +-105, + 1, +-47, +-90, + 13, +-38, +-87, + -2, +-49, +-92, + 31, +-13, +-57, + 19, +-25, +-71, + 26, +-18, +-62, + 71, + 41, + -4, +112, +106, + 72, +112, +108, + 81, +111, +108, + 85, +108, +106, + 80, +107, +105, + 79, +108, +107, + 86, +108, +107, + 87, +106, +104, + 84, +104, +104, + 82, +108, +108, + 89, +110, +109, + 91, +109, +109, + 90, +112, +111, + 93, +112, +112, + 93, +112, +111, + 92, +113, +112, + 93, +114, +114, + 96, +117, +116, +100, +118, +117, +100, +103, + 90, + 59, + 45, + -3, +-50, + 33, +-17, +-68, + 38, + -7, +-55, + 41, + -7, +-59, + 38, + -6, +-47, + 33, +-17, +-66, + 37, +-13, +-65, + 56, + 11, +-36, + 35, +-17, +-79, + 45, + -2, +-67, + 54, + 9, +-60, + 61, + 16, +-57, + 64, + 19, +-55, + 67, + 22, +-52, + 68, + 23, +-52, + 69, + 23, +-52, + 68, + 23, +-52, + 70, + 23, +-52, + 68, + 21, +-54, + 67, + 20, +-55, + 66, + 19, +-57, + 65, + 18, +-61, + 67, + 20, +-57, + 68, + 21, +-54, + 66, + 19, +-56, + 65, + 18, +-61, + 64, + 17, +-62, + 62, + 15, +-63, + 62, + 15, +-64, + 62, + 15, +-65, + 36, + 17, + -7, +-29, +-43, +-64, +-12, +-25, +-45, + 32, + 15, + -6, + 66, + 44, + 18, + 88, + 61, + 27, + 87, + 56, + 16, + 85, + 51, + 4, + 83, + 45, + -7, + 74, + 32, +-31, + 73, + 25, +-57, + 75, + 28, +-58, + 77, + 30, +-55, + 75, + 28, +-51, + 73, + 28, +-51, + 73, + 28, +-50, + 73, + 28, +-47, + 73, + 28, +-47, + 73, + 28, +-46, + 72, + 28, +-46, + 70, + 30, +-46, + 70, + 30, +-46, + 71, + 31, +-45, + 71, + 30, +-43, + 71, + 30, +-42, + 70, + 31, +-42, + 70, + 31, +-42, + 71, + 32, +-41, + 70, + 30, +-41, + 69, + 29, +-39, + 68, + 28, +-39, + 66, + 26, +-41, + 64, + 24, +-43, + 60, + 20, +-47, + 56, + 16, +-51, + 51, + 11, +-56, + 38, + -6, +-71, + 27, +-30, +-102, + 4, +-53, +-116, + 18, +-29, +-75, + 32, +-20, +-74, + 4, +-53, +-117, + 8, +-48, +-117, + 40, +-10, +-66, + 24, +-28, +-90, + 81, + 56, + 14, +112, +109, + 87, +111, +109, + 93, +110, +110, + 97, +107, +107, + 92, +106, +105, + 93, +106, +107, + 93, +109, +108, + 97, +108, +108, + 99, +107, +107, + 98, +108, +108, + 99, +110, +110, +101, +111, +111, +101, +113, +113, +105, +113, +113, +105, +112, +113, +101, +114, +113, +103, +115, +115, +108, +118, +118, +111, +118, +118, +111, +119, +118, +107, + 74, + 36, + -5, + 46, +-10, +-76, + 32, +-22, +-75, + 12, +-43, +-99, +-18, +-66, +-108, + 12, +-45, +-99, + 50, + -1, +-61, + 27, +-25, +-77, + 27, +-25, +-85, + 48, + 3, +-64, + 57, + 12, +-59, + 63, + 18, +-55, + 66, + 21, +-53, + 68, + 23, +-51, + 69, + 24, +-51, + 69, + 24, +-51, + 70, + 24, +-51, + 70, + 23, +-52, + 69, + 22, +-53, + 66, + 19, +-56, + 65, + 18, +-60, + 65, + 18, +-62, + 67, + 19, +-60, + 67, + 19, +-58, + 67, + 20, +-57, + 66, + 19, +-59, + 64, + 17, +-60, + 63, + 16, +-64, + 63, + 16, +-64, + 62, + 15, +-65, + 30, + 13, +-12, +-94, +-94, +-111, +-81, +-83, +-100, +-59, +-67, +-90, +-45, +-56, +-80, + -4, +-22, +-48, + 48, + 20, +-14, + 69, + 38, + -5, + 83, + 45, + -6, + 81, + 41, +-17, + 75, + 27, +-56, + 78, + 31, +-55, + 78, + 31, +-53, + 76, + 30, +-51, + 76, + 30, +-50, + 74, + 29, +-47, + 73, + 28, +-47, + 74, + 29, +-45, + 72, + 29, +-45, + 71, + 31, +-45, + 70, + 30, +-46, + 68, + 28, +-46, + 68, + 28, +-47, + 67, + 26, +-44, + 66, + 26, +-44, + 67, + 27, +-44, + 69, + 29, +-43, + 70, + 31, +-40, + 71, + 31, +-39, + 71, + 31, +-37, + 69, + 29, +-37, + 67, + 27, +-40, + 65, + 25, +-42, + 63, + 23, +-44, + 59, + 19, +-48, + 54, + 14, +-53, + 40, + -4, +-69, + 36, +-27, +-102, + -5, +-63, +-121, + 26, +-27, +-78, + 29, +-25, +-87, + 19, +-42, +-123, + 5, +-53, +-128, + 48, + -4, +-67, + 12, +-44, +-123, + 83, + 59, + 18, +112, +109, + 93, +109, +109, + 97, +109, +108, +101, +106, +106, + 97, +105, +105, + 97, +106, +107, + 97, +108, +109, +102, +108, +109, +103, +107, +107, +101, +107, +108, +102, +110, +110, +105, +111, +111, +108, +112, +112, +109, +112, +113, +107, +113, +114, +108, +115, +115, +112, +114, +115, +111, +117, +118, +115, +117, +117, +113, +117, +118, +111, + 71, + 32, + -4, + 38, +-21, +-90, + 37, +-20, +-85, + 23, +-41, +-109, + 10, +-41, +-89, + 14, +-46, +-103, + 55, + 8, +-52, + 45, +-16, +-89, + 26, +-34, +-111, + 52, + 6, +-62, + 60, + 15, +-57, + 64, + 19, +-53, + 68, + 23, +-51, + 69, + 24, +-50, + 70, + 25, +-50, + 70, + 25, +-50, + 69, + 24, +-50, + 69, + 22, +-53, + 64, + 17, +-57, + 60, + 14, +-60, + 58, + 11, +-63, + 58, + 11, +-63, + 60, + 13, +-61, + 63, + 15, +-59, + 64, + 16, +-62, + 62, + 14, +-63, + 61, + 14, +-65, + 62, + 15, +-65, + 62, + 15, +-65, + 62, + 15, +-65, + 31, + 15, + -9, +-80, +-79, +-96, +-85, +-82, +-93, +-90, +-88, +-104, +-74, +-77, +-96, +-26, +-37, +-56, + 22, + 3, +-19, + 28, + 7, +-18, + 58, + 33, + 4, + 86, + 44, + -7, + 78, + 28, +-55, + 79, + 32, +-54, + 80, + 34, +-50, + 79, + 33, +-48, + 77, + 32, +-47, + 76, + 32, +-45, + 75, + 30, +-45, + 72, + 30, +-45, + 71, + 30, +-46, + 69, + 29, +-46, + 65, + 24, +-47, + 60, + 18, +-50, + 46, + 3, +-60, + 25, +-18, +-72, + 17, +-28, +-79, + 20, +-21, +-73, + 38, + -1, +-61, + 61, + 20, +-47, + 67, + 27, +-44, + 70, + 30, +-38, + 71, + 31, +-36, + 69, + 29, +-38, + 67, + 27, +-40, + 64, + 24, +-43, + 61, + 21, +-46, + 57, + 16, +-51, + 41, + -3, +-69, + 37, +-23, +-94, + 4, +-54, +-107, + 25, +-24, +-70, + 19, +-35, +-90, + 31, +-27, +-95, + 6, +-52, +-118, + 43, + -2, +-51, + 21, +-33, +-98, + 90, + 70, + 34, +111, +111, + 96, +108, +108, +100, +107, +107, +101, +107, +107, +102, +106, +107, +102, +107, +108, +102, +109, +109, +105, +108, +109, +105, +108, +108, +104, +109, +110, +106, +111, +111, +108, +111, +111, +108, +113, +114, +111, +114, +114, +111, +113, +113, +110, +114, +114, +112, +115, +116, +113, +117, +117, +114, +116, +116, +113, +117, +118, +115, + 64, + 19, +-29, + 18, +-36, +-94, + 44, + -9, +-60, + 27, +-31, +-93, + 14, +-39, +-86, + 24, +-30, +-93, + 54, + 16, +-23, + 54, + 2, +-51, + 23, +-37, +-114, + 55, + 8, +-62, + 63, + 18, +-56, + 66, + 21, +-53, + 69, + 24, +-50, + 70, + 25, +-49, + 70, + 25, +-50, + 69, + 24, +-51, + 64, + 19, +-55, + 53, + 10, +-62, + 39, + -8, +-76, + 21, +-28, +-87, + 7, +-40, +-86, + 13, +-34, +-86, + 31, +-17, +-80, + 49, + 2, +-71, + 54, + 5, +-70, + 56, + 7, +-69, + 55, + 7, +-71, + 56, + 8, +-72, + 57, + 9, +-70, + 61, + 14, +-67, + 33, + 17, + -6, +-63, +-69, +-98, +-77, +-76, +-90, +-72, +-76, +-103, +-66, +-70, +-95, +-27, +-35, +-54, + 22, + 5, +-14, + 30, + 12, +-11, + 58, + 37, + 9, + 87, + 47, + -5, + 79, + 31, +-53, + 81, + 35, +-52, + 81, + 35, +-48, + 80, + 34, +-47, + 78, + 34, +-46, + 78, + 33, +-44, + 76, + 32, +-43, + 74, + 29, +-45, + 66, + 25, +-48, + 60, + 19, +-52, + 43, + 0, +-63, + -4, +-50, +-97, +-27, +-70, +-90, + 6, +-10, +-19, + 11, + 1, +-13, + 6, + -2, +-13, + -9, +-28, +-39, +-12, +-55, +-98, + 39, + -2, +-61, + 62, + 20, +-46, + 68, + 27, +-39, + 69, + 29, +-38, + 69, + 29, +-38, + 66, + 26, +-41, + 62, + 22, +-45, + 58, + 18, +-49, + 42, + -2, +-66, + 35, +-23, +-92, + 18, +-37, +-84, + 27, +-17, +-58, + 7, +-50, +-109, + 35, +-21, +-81, + 11, +-43, +-105, + 51, + 8, +-37, + 23, +-26, +-81, + 91, + 72, + 40, +109, +109, + 98, +107, +107, +101, +107, +108, +103, +106, +107, +102, +108, +109, +106, +108, +109, +105, +108, +109, +105, +109, +109, +106, +109, +109, +107, +110, +110, +109, +112, +112, +109, +111, +111, +109, +112, +112, +110, +112, +112, +111, +112, +113, +110, +115, +115, +113, +115, +115, +113, +116, +116, +114, +116, +117, +114, +118, +118, +116, + 57, + 9, +-51, + 12, +-42, +-98, + 39, +-12, +-66, + 39, +-16, +-76, + 24, +-27, +-73, + 30, +-19, +-79, + 52, + 13, +-25, + 58, + 11, +-34, + 19, +-43, +-122, + 56, + 10, +-62, + 63, + 19, +-55, + 67, + 23, +-51, + 70, + 25, +-49, + 70, + 25, +-49, + 67, + 21, +-52, + 60, + 14, +-57, + 37, + -8, +-73, + 12, +-46, +-104, + 19, +-30, +-72, + 21, + -2, +-10, + 35, + 13, +-19, + 45, + 10, +-37, + 2, +-40, +-74, + -9, +-63, +-110, + 26, +-22, +-86, + 45, + -3, +-76, + 51, + 2, +-73, + 54, + 6, +-72, + 53, + 5, +-74, + 55, + 7, +-73, + 32, + 16, + -6, +-60, +-66, +-94, +-59, +-63, +-90, +-68, +-73, +-101, +-65, +-69, +-92, +-25, +-33, +-51, + 25, + 9, +-10, + 33, + 15, + -6, + 60, + 40, + 12, + 87, + 48, + -4, + 80, + 33, +-52, + 82, + 36, +-50, + 83, + 37, +-45, + 80, + 36, +-45, + 79, + 35, +-44, + 77, + 32, +-43, + 72, + 30, +-45, + 65, + 24, +-49, + 43, + -1, +-66, + -2, +-44, +-90, +-19, +-74, +-114, + -5, +-42, +-67, + 77, + 68, + 34, + 91, + 84, + 38, + 96, + 89, + 40, +101, + 94, + 50, + 80, + 75, + 41, + 34, + 28, + 16, +-11, +-42, +-61, + 1, +-40, +-87, + 42, + -2, +-61, + 64, + 23, +-43, + 67, + 27, +-40, + 66, + 26, +-41, + 63, + 23, +-44, + 58, + 18, +-49, + 43, + -3, +-64, + 31, +-25, +-92, + 30, +-26, +-80, + 20, +-32, +-81, + 12, +-49, +-116, + 32, +-24, +-92, + 19, +-37, +-105, + 60, + 11, +-43, + 23, +-27, +-84, + 88, + 66, + 31, +109, +109, + 99, +107, +107, +103, +106, +107, +104, +106, +106, +104, +106, +107, +104, +108, +108, +106, +109, +109, +107, +109, +109, +108, +108, +109, +107, +109, +109, +109, +112, +112, +111, +112, +112, +111, +113, +113, +112, +112, +112, +111, +111, +111, +110, +114, +114, +113, +114, +114, +113, +115, +115, +115, +116, +116, +115, +119, +118, +116, + 55, + 4, +-64, + 19, +-37, +-103, + 36, +-20, +-89, + 34, +-25, +-92, + 33, +-20, +-80, + 32, +-22, +-85, + 51, + 2, +-48, + 58, + 4, +-57, + 17, +-48, +-127, + 55, + 9, +-64, + 63, + 19, +-54, + 67, + 23, +-51, + 68, + 24, +-49, + 62, + 19, +-52, + 41, + -4, +-69, + 14, +-38, +-97, + 20, +-39, +-94, + 32, + -8, +-72, + 18, + 1, +-31, + 57, + 24, +-67, + 44, + 34, +-14, + 85, + 39, +-36, + 83, + 47, +-13, + 54, + 14, +-51, +-17, +-64, +-105, +-11, +-61, +-107, + 20, +-29, +-93, + 48, + -1, +-75, + 53, + 4, +-73, + 54, + 6, +-75, + 31, + 17, + -4, +-63, +-70, +-97, +-62, +-65, +-90, +-62, +-68, +-95, +-73, +-74, +-90, +-23, +-30, +-45, + 26, + 11, + -7, + 33, + 16, + -3, + 60, + 42, + 16, + 86, + 49, + -3, + 81, + 33, +-51, + 83, + 37, +-47, + 82, + 38, +-44, + 82, + 38, +-42, + 78, + 36, +-41, + 75, + 32, +-44, + 71, + 26, +-47, + 47, + 3, +-69, +-21, +-71, +-115, + 35, + 19, +-11, + 74, + 63, + 20, + 85, + 73, + 28, + 93, + 81, + 33, + 92, + 83, + 37, + 95, + 88, + 43, +100, + 92, + 48, +107, + 99, + 55, +108, +101, + 58, + 94, + 87, + 49, + 69, + 58, + 22, + 8, +-33, +-71, + 29, +-13, +-68, + 65, + 24, +-43, + 67, + 27, +-40, + 63, + 23, +-44, + 59, + 19, +-48, + 42, + -6, +-72, + 29, +-33, +-111, + 24, +-40, +-109, + 27, +-30, +-103, + 13, +-50, +-124, + 31, +-29, +-110, + 24, +-40, +-118, + 60, + 11, +-55, + 21, +-33, +-108, + 89, + 64, + 27, +108, +108, + 98, +106, +106, +101, +107, +107, +104, +106, +106, +104, +108, +108, +106, +109, +109, +107, +110, +111, +109, +111, +111, +110, +110, +111, +109, +112, +112, +112, +114, +114, +113, +113, +113, +112, +114, +114, +112, +113, +113, +112, +112, +112, +111, +115, +115, +114, +114, +114, +113, +117, +117, +116, +117, +117, +116, +118, +117, +116, + 59, + 9, +-74, + 34, +-23, +-99, + 37, +-20, +-95, + 29, +-36, +-115, + 36, +-21, +-94, + 28, +-31, +-108, + 53, + -1, +-63, + 55, + -5, +-84, + 19, +-50, +-128, + 57, + 7, +-65, + 64, + 19, +-54, + 68, + 24, +-51, + 65, + 22, +-50, + 35, +-10, +-73, + 17, +-43, +-109, + 28, + -9, +-52, + 38, + 17, +-33, + 28, + 6, +-45, + 28, + 17, +-19, + 68, + 34, +-61, + 53, + 36, +-14, + 81, + 46, + -8, + 87, + 41, +-51, + 76, + 57, + 16, + 94, + 90, + 78, + 67, + 61, + 54, +-21, +-73, +-107, + 25, +-23, +-92, + 50, + 2, +-75, + 53, + 5, +-76, + 31, + 16, + -2, +-61, +-73, +-104, +-57, +-64, +-91, +-63, +-69, +-93, +-66, +-70, +-91, +-20, +-28, +-43, + 28, + 14, + -4, + 36, + 19, + 0, + 62, + 44, + 19, + 86, + 48, + -2, + 81, + 34, +-48, + 84, + 39, +-45, + 83, + 39, +-42, + 82, + 39, +-41, + 78, + 37, +-40, + 76, + 32, +-43, + 69, + 25, +-48, + 45, + -6, +-82, + 15, +-16, +-43, + 88, + 74, + 26, + 90, + 78, + 30, + 92, + 80, + 32, + 74, + 58, + 8, + 47, + 27, +-18, + 70, + 59, + 17, + 93, + 86, + 43, +107, +100, + 57, +110, +102, + 58, +110, +102, + 58, +109, +101, + 57, + 74, + 56, + 14, + 9, +-38, +-84, + 62, + 21, +-46, + 67, + 27, +-40, + 64, + 24, +-43, + 59, + 19, +-48, + 40, + -7, +-73, + 34, +-28, +-108, + 19, +-45, +-118, + 33, +-22, +-90, + 12, +-49, +-120, + 38, +-20, +-98, + 26, +-36, +-112, + 64, + 19, +-34, + 23, +-32, +-105, + 91, + 66, + 31, +108, +108, + 96, +106, +106, +100, +105, +106, +102, +108, +109, +106, +108, +108, +105, +111, +111, +108, +112, +112, +109, +112, +112, +110, +112, +113, +111, +114, +115, +114, +116, +116, +116, +115, +115, +114, +115, +115, +114, +112, +112, +111, +110, +110, +109, +112, +112, +111, +113, +113, +112, +117, +117, +116, +117, +117, +115, +118, +118, +114, + 55, + 6, +-68, + 38, +-15, +-85, + 40, +-16, +-78, + 31, +-32, +-96, + 34, +-20, +-91, + 30, +-28, +-100, + 58, + 4, +-53, + 55, + -5, +-80, + 21, +-45, +-123, + 53, + 4, +-69, + 64, + 19, +-54, + 69, + 24, +-50, + 66, + 21, +-51, + 26, +-27, +-93, + 43, + 12, +-23, + 77, + 53, +-19, + 43, + 10, +-51, + 48, + 26, +-27, + 41, + 40, + 12, + 67, + 32, +-56, + 42, + 21, +-17, + 83, + 52, + 9, + 97, + 52, +-39, + 78, + 63, + 26, +108, +109, +104, + 67, + 40, + 10, + 44, + 12, +-29, + 35, +-16, +-104, + 48, + -1, +-78, + 53, + 5, +-75, + 34, + 19, + 1, +-64, +-77, +-107, +-78, +-77, +-85, +-66, +-69, +-91, +-63, +-68, +-94, +-17, +-25, +-43, + 29, + 16, + -2, + 36, + 21, + 3, + 62, + 46, + 21, + 87, + 49, + 0, + 82, + 35, +-47, + 84, + 39, +-44, + 84, + 40, +-41, + 81, + 40, +-39, + 78, + 38, +-39, + 74, + 33, +-43, + 68, + 25, +-48, + 43, + -9, +-81, + 24, +-13, +-51, + 82, + 67, + 22, + 90, + 78, + 31, + 89, + 80, + 35, + 55, + 41, + -8, + -7, +-35, +-72, + 17, +-13, +-60, + 21, + -9, +-59, + 56, + 39, + 3, +110, +102, + 59, +110, +102, + 58, +110, +101, + 56, + 56, + 22, +-26, + 15, +-32, +-85, + 64, + 22, +-44, + 67, + 27, +-40, + 64, + 24, +-43, + 59, + 19, +-48, + 41, + -2, +-59, + 33, +-22, +-83, + 19, +-38, +-101, + 37, +-15, +-67, + 14, +-43, +-107, + 47, + -6, +-76, + 29, +-27, +-91, + 75, + 35, + -8, + 30, +-20, +-84, + 92, + 73, + 45, +109, +109, + 99, +107, +107, +102, +109, +109, +106, +110, +110, +108, +109, +109, +107, +112, +112, +109, +113, +113, +111, +114, +115, +113, +114, +115, +113, +116, +116, +115, +118, +118, +117, +116, +116, +115, +115, +115, +114, +114, +114, +113, +112, +112, +110, +112, +113, +112, +114, +114, +112, +116, +116, +116, +117, +117, +115, +118, +118, +118, + 47, + 6, +-48, + 38, +-11, +-74, + 39, + -8, +-58, + 33, +-21, +-74, + 29, +-23, +-78, + 38, +-16, +-80, + 61, + 14, +-34, + 53, + -2, +-64, + 27, +-34, +-101, + 50, + 1, +-69, + 64, + 19, +-54, + 69, + 24, +-50, + 66, + 21, +-49, + 24, +-28, +-93, + 33, + 10, +-14, + 90, + 61, +-12, + 35, + 5, +-53, + 40, + 15, +-43, + 17, + 20, + -2, + 54, + 24, +-60, + 53, + 28, +-23, + 84, + 42, +-28, + 91, + 44, +-82, + 81, + 65, + 26, +108, +109, +105, + 58, + 25, +-16, + 56, + 22, +-15, + 40, +-17, +-102, + 47, + -2, +-76, + 53, + 5, +-74, + 35, + 19, + 0, +-69, +-80, +-106, +-77, +-75, +-84, +-75, +-74, +-90, +-61, +-66, +-91, +-15, +-23, +-40, + 31, + 18, + 0, + 36, + 23, + 5, + 64, + 47, + 22, + 87, + 51, + 2, + 83, + 36, +-46, + 84, + 39, +-44, + 84, + 40, +-40, + 80, + 40, +-38, + 79, + 39, +-38, + 74, + 34, +-42, + 69, + 26, +-47, + 49, + 2, +-76, + 23, +-12, +-54, + 79, + 68, + 27, + 90, + 81, + 37, + 90, + 82, + 38, + 53, + 39, + -6, + 0, +-22, +-64, + 55, + 55, + 45, + 51, + 52, + 38, + 57, + 51, + 27, +110, +102, + 59, +109, +101, + 57, +109, +101, + 56, + 59, + 37, + 5, + 23, +-25, +-82, + 64, + 22, +-44, + 66, + 27, +-41, + 64, + 24, +-43, + 58, + 18, +-49, + 41, + -3, +-58, + 33, +-22, +-83, + 14, +-45, +-108, + 39, +-13, +-66, + 14, +-42, +-107, + 44, + -9, +-78, + 32, +-25, +-90, + 80, + 38, + -9, + 33, +-20, +-89, + 93, + 72, + 43, +110, +110, +102, +108, +108, +103, +110, +110, +107, +109, +109, +107, +109, +110, +107, +111, +112, +108, +113, +113, +110, +115, +115, +114, +115, +115, +113, +116, +116, +115, +118, +118, +117, +116, +116, +116, +115, +115, +114, +113, +113, +112, +111, +111, +110, +112, +112, +111, +112, +113, +111, +115, +115, +114, +118, +118, +117, +119, +119, +119, + 50, + 7, +-47, + 33, +-19, +-83, + 42, + -6, +-58, + 35, +-20, +-73, + 22, +-33, +-84, + 38, +-15, +-84, + 62, + 16, +-27, + 52, + -2, +-70, + 32, +-30, +-97, + 47, + -3, +-71, + 63, + 18, +-54, + 69, + 24, +-50, + 66, + 21, +-51, + 30, +-22, +-90, + 43, + 19, +-11, + 90, + 65, + -8, + 60, + 32, +-30, + 52, + 34, +-22, + 16, + 20, + -9, + 53, + 23, +-50, + 45, + 15, +-50, + 95, + 60, + -5, + 92, + 47, +-56, + 82, + 67, + 30, +109, +110, +105, + 60, + 30, +-11, + 50, + 20, +-15, + 39, +-17, +-103, + 48, + -1, +-76, + 53, + 5, +-74, + 36, + 22, + 4, +-68, +-77, +-105, +-76, +-74, +-80, +-78, +-76, +-84, +-70, +-71, +-87, +-14, +-22, +-38, + 32, + 19, + 2, + 37, + 24, + 7, + 66, + 48, + 24, + 86, + 52, + 3, + 83, + 37, +-44, + 85, + 41, +-42, + 84, + 42, +-38, + 81, + 41, +-36, + 78, + 38, +-37, + 74, + 34, +-41, + 68, + 27, +-45, + 50, + 2, +-76, + 32, + -7, +-53, + 80, + 69, + 26, + 90, + 82, + 38, + 91, + 83, + 39, + 52, + 40, + -5, + 22, + 6, +-21, + 44, + 46, + 46, + 33, + 39, + 21, + 55, + 55, + 40, +109, +101, + 58, +108, +100, + 56, +108, +100, + 54, + 44, + 25, +-20, + 27, +-20, +-80, + 64, + 22, +-44, + 66, + 26, +-41, + 64, + 24, +-43, + 58, + 17, +-49, + 41, + -7, +-69, + 32, +-28, +-106, + 12, +-50, +-125, + 44, +-15, +-86, + 23, +-37, +-111, + 39, +-20, +-97, + 31, +-29, +-105, + 81, + 34, +-33, + 34, +-25, +-106, + 94, + 69, + 30, +109, +109, +101, +109, +109, +104, +110, +110, +107, +111, +111, +109, +110, +111, +109, +112, +113, +110, +114, +115, +113, +116, +116, +115, +115, +115, +114, +117, +117, +116, +118, +118, +116, +117, +117, +116, +117, +117, +116, +115, +115, +114, +113, +113, +112, +113, +113, +112, +114, +114, +113, +116, +116, +115, +118, +118, +117, +119, +119, +119, + 58, + 11, +-59, + 27, +-30, +-109, + 46, + -5, +-72, + 37, +-29, +-104, + 21, +-40, +-112, + 37, +-21, +-103, + 64, + 7, +-61, + 50, +-11, +-97, + 33, +-36, +-121, + 43, + -8, +-75, + 62, + 17, +-55, + 67, + 24, +-50, + 67, + 21, +-50, + 32, +-21, +-89, + 58, + 22, +-20, + 88, + 69, + 10, + 63, + 34, +-33, + 71, + 47, +-17, + 44, + 39, + 3, + 47, + 13, +-59, + 53, + 31, +-16, + 93, + 72, + 32, + 94, + 50, +-33, + 82, + 69, + 36, +110, +110, +104, + 59, + 23, +-23, + 44, + 8, +-40, + 44, +-12, +-93, + 48, + -1, +-76, + 53, + 5, +-74, + 34, + 22, + 5, +-58, +-70, +-102, +-73, +-72, +-78, +-64, +-65, +-82, +-61, +-65, +-88, +-11, +-19, +-35, + 34, + 21, + 4, + 39, + 26, + 9, + 66, + 47, + 26, + 90, + 53, + 5, + 83, + 37, +-44, + 86, + 42, +-40, + 83, + 44, +-36, + 81, + 41, +-35, + 80, + 40, +-35, + 75, + 35, +-40, + 69, + 28, +-44, + 48, + 5, +-73, + 45, + 0, +-54, + 81, + 69, + 28, + 92, + 84, + 40, + 93, + 85, + 41, + 54, + 42, + -3, + 17, + 1, +-20, + 48, + 52, + 30, + 26, + 26, +-25, + 55, + 52, + 35, +108, +100, + 57, +108, +100, + 56, +108, + 99, + 54, + 49, + 29, +-18, + 28, +-20, +-82, + 64, + 22, +-44, + 67, + 27, +-40, + 64, + 24, +-43, + 57, + 16, +-49, + 38, +-10, +-77, + 33, +-29, +-113, + 7, +-56, +-128, + 42, +-17, +-96, + 28, +-32, +-107, + 42, +-17, +-95, + 30, +-29, +-106, + 81, + 35, +-28, + 32, +-30, +-108, + 95, + 69, + 31, +108, +108, +100, +108, +108, +104, +110, +110, +108, +109, +109, +108, +110, +110, +109, +112, +113, +110, +114, +114, +114, +115, +115, +115, +116, +116, +115, +116, +116, +116, +118, +118, +117, +117, +117, +116, +117, +117, +117, +115, +115, +115, +113, +113, +113, +113, +113, +112, +113, +113, +113, +117, +117, +116, +118, +118, +118, +119, +120, +120, + 56, + 12, +-55, + 23, +-34, +-110, + 53, + 5, +-56, + 40, +-24, +-95, + 22, +-41, +-117, + 36, +-24, +-103, + 63, + 8, +-59, + 51, +-12, +-96, + 38, +-30, +-119, + 41, +-10, +-78, + 61, + 16, +-56, + 67, + 24, +-49, + 65, + 22, +-51, + 38, +-16, +-86, + 52, + 6, +-51, + 68, + 46, + -6, + 57, + 27, +-40, + 60, + 38, +-20, + 34, + 19, +-20, + 10, +-26, +-76, + 63, + 32, +-27, +102, + 71, + 18, + 88, + 41, +-66, + 86, + 69, + 38, +106, +103, + 96, + 57, + 13, +-49, + 49, + 9, +-44, + 43, +-13, +-94, + 48, + -1, +-75, + 54, + 6, +-72, + 36, + 23, + 8, +-55, +-70, +-104, +-55, +-60, +-80, +-51, +-58, +-81, +-60, +-64, +-87, +-11, +-19, +-34, + 35, + 21, + 11, + 40, + 26, + 12, + 65, + 49, + 28, + 89, + 54, + 7, + 83, + 37, +-44, + 86, + 42, +-39, + 83, + 44, +-36, + 81, + 41, +-35, + 80, + 40, +-35, + 76, + 36, +-37, + 68, + 27, +-45, + 43, + 4, +-67, + 50, + 5, +-51, + 73, + 64, + 26, + 95, + 87, + 43, + 95, + 87, + 42, + 55, + 44, + 1, + 4, +-17, +-42, + 44, + 48, + 9, + 23, + 23, +-29, + 71, + 70, + 50, +109, +101, + 59, +108, +100, + 56, +107, + 98, + 54, + 53, + 34, + -8, + 27, +-21, +-81, + 65, + 23, +-43, + 67, + 27, +-40, + 63, + 23, +-44, + 55, + 15, +-50, + 39, + -7, +-65, + 35, +-21, +-96, + 8, +-50, +-111, + 44, +-12, +-77, + 30, +-26, +-92, + 46, + -9, +-78, + 29, +-27, +-94, + 82, + 45, + 5, + 32, +-23, +-87, + 92, + 72, + 45, +108, +108, + 98, +107, +107, +103, +110, +110, +109, +111, +111, +111, +111, +111, +110, +111, +111, +110, +114, +114, +114, +115, +115, +115, +115, +115, +115, +116, +116, +116, +117, +117, +116, +116, +116, +116, +116, +116, +116, +115, +115, +115, +113, +113, +113, +112, +112, +112, +114, +114, +114, +117, +117, +117, +118, +118, +118, +120, +119, +120, + 51, + 8, +-41, + 27, +-26, +-93, + 57, + 17, +-28, + 44, +-11, +-65, + 23, +-34, +-102, + 35, +-20, +-90, + 62, + 20, +-19, + 54, + 0, +-71, + 42, +-16, +-74, + 40, +-10, +-79, + 61, + 17, +-56, + 65, + 24, +-48, + 66, + 24, +-50, + 41, +-14, +-86, + 30, +-22, +-76, + 18, + 4, +-26, + 53, + 24, +-45, + 31, + 14, +-33, + 12, + 0, +-29, + -9, +-36, +-66, + 66, + 31, +-45, + 99, + 65, + -8, + 82, + 31, +-95, + 80, + 65, + 30, +102, + 98, + 90, + 58, + 15, +-41, + 45, + -4, +-66, + 52, + 3, +-79, + 49, + 0, +-75, + 54, + 6, +-73, + 37, + 24, + 8, +-49, +-64, +-102, +-51, +-56, +-78, +-47, +-55, +-77, +-65, +-67, +-84, +-11, +-19, +-33, + 36, + 22, + 7, + 39, + 26, + 9, + 67, + 49, + 26, + 88, + 55, + 8, + 85, + 39, +-43, + 86, + 44, +-38, + 84, + 44, +-34, + 82, + 42, +-33, + 79, + 40, +-35, + 75, + 36, +-38, + 69, + 29, +-43, + 49, + 8, +-64, + 50, + 7, +-47, + 65, + 58, + 22, + 95, + 87, + 43, + 95, + 87, + 44, + 57, + 46, + 6, + 5, +-18, +-50, + 44, + 45, + 2, + 26, + 27, +-12, + 85, + 81, + 60, +109, +100, + 60, +108, +100, + 56, +106, + 98, + 53, + 55, + 41, + 15, + 23, +-28, +-81, + 64, + 23, +-44, + 67, + 27, +-40, + 62, + 23, +-44, + 54, + 13, +-51, + 39, + -8, +-64, + 37, +-16, +-85, + 14, +-43, +-100, + 47, + -9, +-76, + 31, +-24, +-87, + 46, + -8, +-72, + 26, +-27, +-88, + 82, + 48, + 12, + 34, +-21, +-90, + 91, + 71, + 44, +101, +100, + 90, +100, +101, + 98, +103, +103, +104, +105, +105, +105, +104, +104, +105, +104, +103, +103, +105, +105, +104, +107, +108, +107, +108, +108, +108, +109, +109, +108, +111, +112, +112, +109, +109, +110, +110, +110, +111, +110, +109, +110, +110, +110, +110, +110, +110, +111, +110, +110, +109, +111, +112, +111, +115, +114, +114, +117, +116, +118, + 47, + 6, +-40, + 27, +-29, +-96, + 61, + 19, +-23, + 47, + -7, +-61, + 23, +-36, +-102, + 33, +-23, +-88, + 58, + 16, +-21, + 57, + 3, +-63, + 42, +-16, +-75, + 40, +-11, +-80, + 60, + 16, +-56, + 65, + 24, +-48, + 66, + 25, +-47, + 40, +-13, +-83, + 77, + 50, + 36, + 50, + 37, + -4, + 56, + 30, +-29, + 38, + 19, +-30, + -2, +-20, +-59, + 54, + 34, +-21, + 72, + 47, + -1, + 95, + 68, + 15, + 79, + 32, +-62, + 84, + 72, + 46, +103, + 96, + 85, + 61, + 30, +-10, + 43, + -5, +-63, + 50, + 8, +-67, + 49, + 0, +-75, + 55, + 6, +-72, + 40, + 25, + 8, + -2, +-48, +-110, +-33, +-47, +-75, +-51, +-57, +-77, +-63, +-66, +-78, +-11, +-19, +-30, + 35, + 21, + 9, + 40, + 27, + 10, + 68, + 50, + 26, + 89, + 56, + 7, + 85, + 40, +-42, + 88, + 44, +-37, + 85, + 45, +-32, + 82, + 42, +-33, + 80, + 41, +-34, + 75, + 36, +-37, + 69, + 29, +-41, + 47, + 8, +-64, + 56, + 11, +-44, + 62, + 56, + 21, + 95, + 87, + 44, + 95, + 87, + 45, + 57, + 48, + 9, + 11, +-12, +-44, + 46, + 47, + 7, + 36, + 39, + 5, + 77, + 76, + 52, +108, +100, + 59, +107, + 99, + 57, +105, + 97, + 52, + 60, + 40, + 17, + 20, +-30, +-81, + 64, + 23, +-43, + 65, + 26, +-41, + 60, + 22, +-44, + 53, + 12, +-53, + 37, +-13, +-76, + 37, +-19, +-91, + 10, +-50, +-113, + 42, +-16, +-91, + 32, +-23, +-91, + 38, +-19, +-86, + 25, +-32, +-100, + 86, + 44, +-16, + 35, +-22, +-98, + 90, + 57, + 8, + 71, + 48, + 12, + 66, + 48, + 22, + 63, + 49, + 24, + 62, + 48, + 24, + 62, + 48, + 25, + 63, + 51, + 30, + 66, + 57, + 39, + 66, + 59, + 44, + 66, + 58, + 40, + 67, + 61, + 47, + 69, + 63, + 49, + 66, + 60, + 43, + 67, + 60, + 41, + 68, + 61, + 44, + 73, + 68, + 55, + 70, + 63, + 47, + 70, + 59, + 41, + 74, + 64, + 45, + 79, + 68, + 44, + 91, + 73, + 41, + 50, + 2, +-64, + 23, +-34, +-114, + 64, + 12, +-52, + 49, +-14, +-83, + 20, +-45, +-121, + 30, +-30, +-106, + 55, + 0, +-58, + 52, + -4, +-82, + 39, +-26, +-108, + 39, +-16, +-83, + 60, + 15, +-55, + 66, + 25, +-47, + 67, + 25, +-47, + 37, +-16, +-83, + 75, + 52, + 35, + 83, + 68, + 16, + 78, + 56, + -8, + 54, + 30, +-29, + 11, + -9, +-39, + 71, + 50, +-15, + 79, + 56, + 9, + 92, + 62, + 6, + 78, + 30, +-54, + 84, + 78, + 65, + 88, + 77, + 61, + 65, + 32, +-16, + 37, +-11, +-68, + 51, + 12, +-50, + 51, + 0, +-74, + 55, + 7, +-72, + 41, + 14, +-13, + 17, +-25, +-75, + 17, +-19, +-75, + 4, +-28, +-73, + -4, +-38, +-83, + 13, +-16, +-46, + 40, + 18, + -5, + 41, + 28, + 11, + 68, + 50, + 28, + 89, + 56, + 7, + 84, + 40, +-42, + 87, + 46, +-36, + 85, + 45, +-32, + 82, + 42, +-33, + 80, + 41, +-33, + 76, + 37, +-36, + 70, + 29, +-39, + 45, + 5, +-65, + 53, + 12, +-38, + 61, + 54, + 17, + 95, + 87, + 44, + 95, + 87, + 44, + 59, + 49, + 11, + 15, + -8, +-36, + 46, + 48, + 5, + 30, + 33, + 3, + 72, + 70, + 42, +108, +100, + 58, +106, + 98, + 55, +104, + 96, + 51, + 62, + 43, + 15, + 25, +-26, +-82, + 65, + 23, +-43, + 65, + 26, +-41, + 61, + 21, +-45, + 52, + 10, +-54, + 36, +-17, +-89, + 36, +-27, +-111, + 6, +-56, +-124, + 41, +-19, +-100, + 29, +-26, +-101, + 36, +-27, +-97, + 24, +-37, +-105, + 85, + 42, +-22, + 40, +-19, +-100, + 94, + 60, + 10, + 72, + 48, + 11, + 68, + 50, + 21, + 68, + 53, + 26, + 69, + 56, + 29, + 72, + 61, + 39, + 75, + 69, + 49, + 76, + 70, + 54, + 79, + 73, + 57, + 78, + 71, + 55, + 76, + 70, + 53, + 74, + 70, + 53, + 73, + 67, + 49, + 71, + 64, + 45, + 71, + 63, + 43, + 70, + 63, + 43, + 70, + 61, + 40, + 72, + 59, + 38, + 74, + 63, + 40, + 79, + 65, + 36, + 93, + 69, + 30, + 47, + -4, +-75, + 29, +-29, +-108, + 63, + 14, +-55, + 51, +-13, +-86, + 19, +-47, +-128, + 30, +-30, +-110, + 56, + -4, +-72, + 56, + -1, +-81, + 39, +-28, +-126, + 35, +-19, +-85, + 60, + 15, +-56, + 66, + 24, +-47, + 69, + 26, +-46, + 45, + -6, +-80, + 75, + 51, + 35, + 90, + 77, + 26, + 88, + 70, + 15, + 44, + 6, +-42, + 36, + 7, +-21, + 90, + 62, +-24, + 82, + 55, + -4, + 93, + 52, +-32, + 82, + 35, +-55, + 90, + 90, + 81, + 85, + 69, + 47, + 72, + 29, +-40, + 38, +-15, +-79, + 50, + 17, +-45, + 52, + 0, +-76, + 55, + 7, +-73, + 70, + 31, +-31, + 77, + 37, +-20, + 81, + 44, +-10, + 88, + 50, + -2, + 92, + 54, + 4, + 93, + 57, + 10, + 86, + 56, + 12, + 40, + 27, + 11, + 67, + 49, + 29, + 90, + 55, + 6, + 85, + 39, +-42, + 86, + 45, +-37, + 85, + 45, +-31, + 81, + 42, +-33, + 80, + 41, +-33, + 75, + 36, +-36, + 69, + 29, +-38, + 43, + 4, +-65, + 50, + 9, +-32, + 72, + 56, + 8, + 91, + 82, + 33, + 93, + 85, + 42, + 64, + 54, + 13, + 19, + -5, +-32, + 43, + 45, + 5, + 17, + 20, + -7, + 51, + 44, + 15, + 99, + 89, + 46, +106, + 98, + 55, +102, + 95, + 51, + 54, + 40, + 5, + 20, +-29, +-81, + 64, + 23, +-43, + 64, + 25, +-42, + 61, + 21, +-45, + 49, + 8, +-56, + 39, +-14, +-80, + 45, +-13, +-86, + 6, +-52, +-103, + 41, +-16, +-88, + 26, +-29, +-98, + 38, +-20, +-81, + 33, +-24, +-71, + 84, + 51, + 12, + 42, +-14, +-80, + 95, + 80, + 49, + 85, + 77, + 56, + 78, + 71, + 57, + 81, + 76, + 65, + 81, + 77, + 67, + 86, + 84, + 74, + 95, + 93, + 84, + 96, + 95, + 88, + 96, + 95, + 88, + 97, + 97, + 90, + 97, + 96, + 90, + 94, + 93, + 87, + 89, + 88, + 82, + 86, + 86, + 79, + 84, + 82, + 76, + 85, + 83, + 78, + 83, + 81, + 76, + 85, + 82, + 75, + 86, + 83, + 75, + 92, + 89, + 78, +105, +100, + 83, + 45, + -5, +-69, + 30, +-22, +-86, + 60, + 18, +-30, + 52, + -3, +-62, + 21, +-42, +-120, + 29, +-27, +-96, + 55, + 1, +-57, + 52, + 3, +-60, + 42, +-21, +-94, + 35, +-20, +-84, + 58, + 14, +-57, + 65, + 25, +-49, + 67, + 27, +-48, + 49, + 4, +-79, + 76, + 51, + 37, + 85, + 73, + 22, + 77, + 66, + 14, + 67, + 53, + 0, + 64, + 53, + 0, + 72, + 63, + 17, + 98, + 76, + 28, + 98, + 60, +-18, + 91, + 51, +-27, + 67, + 57, + 42, + 82, + 63, + 35, + 70, + 31, +-34, + 41, + -5, +-52, + 53, + 19, +-35, + 53, + 1, +-78, + 55, + 7, +-73, + 78, + 41, +-20, + 83, + 46, +-11, + 87, + 51, + -2, + 91, + 57, + 7, + 95, + 62, + 15, + 95, + 65, + 19, + 99, + 68, + 22, + 61, + 41, + 12, + 68, + 49, + 26, + 90, + 55, + 7, + 83, + 38, +-43, + 86, + 45, +-36, + 84, + 45, +-31, + 81, + 42, +-33, + 79, + 40, +-33, + 76, + 36, +-36, + 69, + 29, +-38, + 42, + 0, +-70, + 55, + 19, +-31, + 67, + 45, +-21, + 79, + 62, + -4, + 89, + 81, + 38, + 68, + 57, + 19, + 20, + -3, +-28, + 40, + 14, +-41, + 37, + -4, +-77, + 41, + 2, +-67, + 62, + 30, +-41, + 71, + 48, +-15, + 71, + 43, +-22, + 46, + 8, +-48, + 17, +-30, +-81, + 64, + 23, +-44, + 63, + 24, +-43, + 59, + 20, +-46, + 48, + 7, +-58, + 42, + -9, +-64, + 50, + -6, +-71, + 8, +-48, +-97, + 43, +-13, +-84, + 20, +-36, +-96, + 37, +-17, +-76, + 35, +-16, +-56, + 90, + 61, + 25, + 42, +-11, +-69, +100, + 91, + 75, +114, +113, +110, +112, +111, +109, +112, +112, +109, +113, +113, +111, +115, +115, +114, +120, +120, +120, +120, +120, +120, +118, +118, +117, +120, +120, +119, +120, +120, +120, +110, +111, +111, +107, +107, +108, +111, +112, +110, +114, +114, +114, +114, +114, +113, +114, +114, +113, +111, +111, +109, +105, +105, +103, +111, +110, +108, +117, +117, +113, + 40, + -6, +-66, + 25, +-27, +-88, + 56, + 15, +-28, + 55, + 5, +-48, + 21, +-38, +-106, + 27, +-26, +-89, + 49, + -3, +-56, + 46, + 2, +-53, + 43, +-15, +-80, + 33, +-21, +-85, + 58, + 13, +-57, + 65, + 25, +-50, + 67, + 27, +-47, + 50, + 5, +-80, + 73, + 50, + 36, + 76, + 67, + 23, + 75, + 63, + 17, + 74, + 63, + 14, + 74, + 63, + 14, + 80, + 67, + 19, + 99, + 81, + 38, +110, + 81, + 17, +103, + 67, + -9, + 21, + -5, +-56, + 73, + 48, + -1, + 74, + 40, + -9, + 36, + -5, +-44, + 48, + 12, +-46, + 53, + 1, +-78, + 55, + 7, +-74, + 76, + 39, +-21, + 83, + 46, +-11, + 86, + 50, + -5, + 91, + 57, + 6, + 94, + 60, + 13, + 96, + 65, + 18, + 99, + 67, + 22, + 88, + 60, + 21, + 68, + 49, + 27, + 89, + 54, + 6, + 83, + 38, +-43, + 85, + 44, +-36, + 84, + 45, +-31, + 81, + 41, +-33, + 79, + 40, +-33, + 75, + 36, +-36, + 69, + 29, +-39, + 43, + 2, +-69, + 63, + 24, +-28, + 66, + 41, +-27, + 74, + 52, +-26, + 85, + 77, + 33, + 69, + 58, + 21, + 29, + 4, +-26, + 36, + -4, +-81, + 36, + -1, +-76, + 45, + 10, +-65, + 67, + 40, +-34, + 74, + 51, +-21, + 74, + 53, +-11, + 49, + 12, +-50, + 26, +-24, +-78, + 64, + 23, +-43, + 63, + 23, +-43, + 58, + 18, +-47, + 47, + 6, +-58, + 40, +-12, +-74, + 47, + -8, +-74, + 12, +-46, +-104, + 42, +-19, +-92, + 23, +-33, +-96, + 38, +-17, +-75, + 41, + -9, +-51, + 93, + 54, + 2, + 36, +-17, +-78, +105, + 92, + 74, +121, +121, +121, +119, +120, +120, +120, +120, +120, +121, +121, +121, +121, +121, +121, +121, +121, +121, +115, +114, +111, +102, + 96, + 88, +109, +105, + 98, +120, +120, +118, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +117, +117, +117, +111, +111, +109, +112, +112, +109, +117, +117, +115, + 37, +-15, +-76, + 26, +-29, +-102, + 50, + 3, +-50, + 55, + 3, +-58, + 21, +-41, +-116, + 25, +-32, +-99, + 48, + -9, +-73, + 40, +-10, +-66, + 42, +-20, +-96, + 30, +-27, +-92, + 56, + 12, +-59, + 65, + 23, +-50, + 67, + 26, +-48, + 51, + 4, +-79, + 64, + 40, + 25, + 60, + 59, + 37, + 66, + 68, + 55, + 75, + 78, + 67, + 88, + 88, + 76, + 91, + 91, + 75, +104, + 76, + 18, +119, + 87, + 10, +109, + 73, +-27, + 37, + 14, +-39, + 79, + 50, + 4, + 78, + 39, +-22, + 37, +-10, +-58, + 47, + 7, +-57, + 54, + 1, +-78, + 55, + 6, +-74, + 78, + 41, +-20, + 82, + 45, +-12, + 87, + 51, + -4, + 91, + 57, + 6, + 94, + 60, + 11, + 96, + 64, + 17, + 98, + 66, + 21, +101, + 70, + 25, + 77, + 55, + 27, + 89, + 54, + 6, + 83, + 38, +-43, + 85, + 44, +-37, + 85, + 45, +-31, + 81, + 41, +-33, + 79, + 40, +-33, + 75, + 36, +-36, + 69, + 29, +-38, + 42, + -2, +-68, + 63, + 18, +-33, + 62, + 35, +-34, + 69, + 42, +-36, + 77, + 67, + 21, + 68, + 57, + 19, + 26, + -9, +-80, + 34, + -6, +-83, + 38, + 1, +-75, + 51, + 16, +-59, + 74, + 49, +-23, + 81, + 59, + -9, + 72, + 47, +-23, + 60, + 27, +-31, + 26, +-23, +-84, + 62, + 21, +-46, + 62, + 22, +-44, + 58, + 18, +-47, + 45, + 4, +-60, + 38, +-19, +-94, + 44, +-17, +-94, + 19, +-45, +-122, + 43, +-17, +-94, + 25, +-33, +-102, + 41, +-20, +-93, + 53, + 5, +-42, + 89, + 48, +-15, + 33, +-21, +-84, +106, + 90, + 63, +121, +121, +122, + 99, + 99, +100, +108, +108, +109, +121, +121, +120, +121, +121, +121, +112, +111, +109, + 78, + 69, + 50, + 74, + 60, + 36, + 71, + 51, + 18, +107, +103, + 95, +103, +103, +101, +112, +112, +110, +114, +114, +113, +121, +121, +120, +120, +120, +120, +121, +121, +121, +119, +119, +118, +106, +108, +101, + 98, +104, + 92, +115, +114, +109, + 32, +-23, +-97, + 27, +-27, +-100, + 47, + -4, +-73, + 56, + -1, +-72, + 21, +-44, +-128, + 21, +-40, +-117, + 48, +-17, +-97, + 41, +-18, +-91, + 41, +-23, +-122, + 29, +-32, +-99, + 56, + 11, +-60, + 64, + 22, +-51, + 66, + 26, +-50, + 48, + 1, +-79, + 61, + 37, + 18, + 55, + 40, +-12, + 62, + 62, + 42, + 71, + 73, + 61, + 84, + 86, + 77, + 90, + 91, + 83, +108, + 76, + 9, +121, + 91, + 15, +113, + 78, +-19, + 41, + 19, +-33, + 79, + 42, +-27, + 84, + 39, +-40, + 51, + 4, +-49, + 47, + -5, +-93, + 54, + 1, +-79, + 56, + 6, +-74, + 81, + 44, +-16, + 86, + 49, + -8, + 89, + 53, + -2, + 92, + 58, + 7, + 95, + 60, + 11, + 98, + 64, + 18, + 99, + 66, + 20, +102, + 70, + 26, + 97, + 69, + 28, + 89, + 54, + 5, + 83, + 38, +-42, + 85, + 44, +-34, + 84, + 44, +-31, + 80, + 41, +-34, + 79, + 40, +-34, + 75, + 35, +-35, + 68, + 28, +-39, + 40, + 1, +-64, + 65, + 16, +-31, + 64, + 34, +-36, + 60, + 31, +-44, + 70, + 59, + 14, + 68, + 55, + 16, + 16, +-26, +-87, + 23, +-22, +-96, + 28, +-15, +-91, + 36, + -2, +-74, + 73, + 39, +-32, + 84, + 49, +-15, + 68, + 35, +-35, + 61, + 23, +-42, + 21, +-28, +-81, + 61, + 20, +-46, + 61, + 21, +-44, + 57, + 17, +-48, + 43, + 2, +-62, + 35, +-22, +-97, + 45, +-15, +-86, + 22, +-41, +-114, + 41, +-19, +-93, + 31, +-25, +-95, + 43, +-17, +-83, + 51, + 9, +-33, + 84, + 43, +-12, + 43, + 5, +-39, +104, + 92, + 68, +104, +103, + 92, + 94, + 94, + 83, + 90, + 91, + 81, + 82, + 84, + 73, + 87, + 88, + 79, + 81, + 77, + 61, + 74, + 62, + 38, + 75, + 61, + 36, + 70, + 46, + 3, + 82, + 69, + 40, + 95, + 96, + 90, + 99, +100, + 94, + 94, + 95, + 89, + 99, +100, + 93, + 98, + 99, + 92, +100, +100, + 94, +102, +102, + 97, +101, +102, + 97, +108, +109, +105, +106, +103, + 96, + 31, +-28, +-97, + 36, +-15, +-79, + 49, + 0, +-62, + 57, + 4, +-59, + 22, +-41, +-116, + 19, +-40, +-114, + 48, +-14, +-85, + 40, +-19, +-84, + 42, +-21, +-112, + 26, +-34, +-103, + 54, + 9, +-61, + 64, + 21, +-52, + 66, + 26, +-50, + 46, + -4, +-78, + 59, + 34, + 10, + 63, + 48, + -8, + 73, + 73, + 53, + 82, + 84, + 71, + 85, + 87, + 76, + 91, + 92, + 80, +106, + 86, + 45, +120, + 98, + 43, +116, + 88, + 26, + 42, + 20, +-31, + 81, + 43, +-23, + 89, + 53, + -9, + 46, + 8, +-32, + 45, +-18, +-110, + 54, + 0, +-80, + 55, + 5, +-76, + 83, + 47, +-14, + 89, + 52, + -5, + 92, + 55, + 1, + 94, + 59, + 9, + 96, + 62, + 12, +100, + 65, + 18, +101, + 66, + 20, +102, + 70, + 25, +103, + 73, + 28, + 89, + 54, + 3, + 83, + 38, +-42, + 85, + 43, +-35, + 84, + 45, +-31, + 81, + 41, +-33, + 78, + 39, +-34, + 74, + 34, +-35, + 67, + 27, +-40, + 44, + 6, +-66, + 61, + 14, +-40, + 66, + 43, +-26, + 70, + 51, +-15, + 74, + 65, + 18, + 62, + 53, + 13, + 38, + 24, + -2, + 88, + 77, + 34, + 59, + 41, + -6, + 19, + 10, +-19, +-12, +-17, +-43, + 45, + 40, + 14, + 16, + -5, +-37, + 18, +-27, +-77, + 23, +-26, +-83, + 60, + 19, +-48, + 60, + 20, +-45, + 56, + 16, +-49, + 43, + 1, +-63, + 35, +-18, +-84, + 48, + -5, +-60, + 21, +-37, +-96, + 53, + -5, +-73, + 36, +-17, +-81, + 41, +-11, +-65, + 51, + 14, +-16, + 80, + 45, + 4, + 52, + 20, +-14, +105, +100, + 90, +121, +121, +120, + 91, + 90, + 92, +101, +100, +102, + 75, + 78, + 80, + 82, + 83, + 83, + 81, + 73, + 53, + 74, + 60, + 33, + 80, + 64, + 39, + 69, + 45, + -2, + 71, + 47, + 0, + 83, + 82, + 71, +115, +115, +114, +115, +115, +114, +120, +120, +118, +116, +116, +115, +121, +121, +121, +120, +120, +120, +107, +108, +105, + 96, + 99, + 91, + 97, + 94, + 85, + 31, +-24, +-91, + 42, + -4, +-63, + 52, + 8, +-46, + 57, + 13, +-37, + 24, +-34, +-98, + 21, +-36, +-104, + 53, + 2, +-54, + 41, +-10, +-65, + 43, +-14, +-88, + 23, +-33, +-102, + 54, + 9, +-63, + 63, + 21, +-52, + 66, + 26, +-50, + 47, + -5, +-76, + 60, + 34, + 12, + 66, + 51, + 0, + 76, + 79, + 62, + 82, + 84, + 71, + 85, + 86, + 77, + 91, + 89, + 73, +111, + 86, + 37, +121, + 95, + 30, +119, + 90, + 17, + 42, + 20, +-32, + 82, + 44, +-15, + 89, + 66, + 24, + 35, + 5, +-23, + 36, +-28, +-112, + 52, + 0, +-80, + 53, + 5, +-76, + 75, + 27, +-40, + 82, + 34, +-31, + 86, + 39, +-23, + 84, + 38, +-19, + 81, + 37, +-18, + 84, + 40, +-17, + 91, + 43, +-16, + 90, + 40, +-17, + 96, + 51, + -6, + 76, + 31, +-38, + 83, + 38, +-42, + 85, + 44, +-34, + 84, + 44, +-31, + 81, + 41, +-33, + 78, + 39, +-34, + 74, + 34, +-35, + 67, + 27, +-39, + 42, + 0, +-67, + 51, + 4, +-48, + 48, + 29, +-30, + 67, + 55, + 1, + 73, + 65, + 22, + 54, + 45, + 6, + 8, +-16, +-50, + -9, +-38, +-88, + 16, + -8, +-117, + -7, +-13, +-115, +-39, +-62, +-116, + 76, + 70, + 35, + 8, + -4, +-35, + 11, +-39, +-109, + 25, +-24, +-87, + 59, + 18, +-48, + 59, + 19, +-46, + 55, + 15, +-49, + 41, + 0, +-62, + 37, +-18, +-79, + 49, + -3, +-60, + 18, +-39, +-100, + 63, + 5, +-66, + 39, +-13, +-74, + 33, +-18, +-71, + 62, + 24, + -8, + 77, + 40, + -3, + 45, + 9, +-27, +105, +100, + 87, +122, +122, +121, +102, +101, +103, +107, +107, +108, +106, +107, +107, + 84, + 81, + 72, + 81, + 72, + 51, + 79, + 67, + 39, + 81, + 67, + 39, + 74, + 50, + 4, + 75, + 50, + 0, + 90, + 82, + 56, +120, +120, +120, +121, +121, +121, +120, +120, +118, +113, +113, +111, +121, +121, +121, +121, +121, +121, +117, +116, +114, +101, +103, + 95, +101, + 96, + 86, + 34, +-21, +-90, + 41, + -8, +-69, + 54, + 9, +-48, + 59, + 15, +-39, + 25, +-34, +-100, + 20, +-37, +-107, + 55, + 6, +-51, + 40, +-11, +-69, + 45, +-14, +-88, + 23, +-37, +-108, + 52, + 7, +-65, + 62, + 20, +-55, + 65, + 25, +-51, + 43, +-11, +-78, + 55, + 31, + 10, + 67, + 58, + 11, + 82, + 84, + 71, + 91, + 93, + 83, + 92, + 93, + 85, + 96, + 89, + 70, +113, + 77, + 8, +119, + 88, + -3, +120, + 85, +-10, + 44, + 21, +-28, + 81, + 33, +-48, + 91, + 61, + 8, + 41, + 9, +-27, + 44, +-20, +-104, + 51, + -2, +-81, + 52, + 3, +-77, + 24, + -1, +-28, + 15, +-26, +-86, + 16, +-19, +-78, + 25, + 1, +-54, + 14, +-29, +-88, + 15, +-17, +-48, + 42, + 11, +-15, + 49, + 20, + -8, + 68, + 44, + 17, + 90, + 53, + 1, + 83, + 37, +-43, + 85, + 43, +-34, + 84, + 44, +-31, + 79, + 40, +-34, + 78, + 39, +-34, + 74, + 34, +-34, + 68, + 27, +-39, + 40, + 0, +-68, + 44, + -7, +-60, + 40, + 23, +-33, + 63, + 51, + -3, + 73, + 66, + 23, + 53, + 44, + 9, + 30, + 20, +-10, + 30, + 27, +-11, + 53, + 35, +-119, + -7, +-13, +-97, + 41, + 34, +-87, + 70, + 55, + 5, + 25, + 5, +-35, + 36, + 8, +-97, + 26, +-23, +-81, + 58, + 17, +-49, + 58, + 18, +-47, + 54, + 14, +-51, + 39, + -3, +-67, + 43, +-19, +-94, + 46, +-10, +-88, + 19, +-43, +-111, + 60, + -2, +-91, + 40, +-17, +-88, + 23, +-37, +-100, + 63, + 17, +-36, + 77, + 30, +-38, + 46, + 0, +-56, +109, + 96, + 70, +121, +121, +121, +121, +121, +121, +121, +121, +121, +113, +112, +110, + 84, + 79, + 64, + 83, + 74, + 49, + 84, + 73, + 44, + 84, + 72, + 44, + 81, + 59, + 13, + 79, + 57, + 6, + 77, + 61, + 19, +113, +113, +108, +121, +121, +121, +121, +121, +121, +114, +114, +113, +121, +121, +121, +121, +121, +121, +114, +114, +111, + 92, + 96, + 81, +101, + 96, + 89, + 32, +-25, +-104, + 44, +-10, +-84, + 60, + 9, +-64, + 62, + 9, +-62, + 22, +-42, +-128, + 17, +-42, +-127, + 57, + -2, +-81, + 40, +-22, +-97, + 42, +-22, +-128, + 19, +-45, +-123, + 51, + 6, +-66, + 63, + 18, +-56, + 65, + 24, +-52, + 29, +-18, +-82, + 54, + 32, + 11, + 65, + 52, + 10, + 76, + 78, + 67, + 86, + 87, + 79, + 87, + 89, + 83, + 97, + 90, + 72, +110, + 83, + 33, +120, + 91, + 18, +119, + 88, + 11, + 45, + 21, +-26, + 87, + 39, +-44, + 93, + 50, +-27, + 55, + 16, +-27, + 38, +-20, +-100, + 52, + -2, +-82, + 52, + 3, +-79, +-88, +-120, +-124, +-58, +-86, +-113, +-38, +-64, +-82, +-44, +-72, +-94, +-16, +-41, +-117, + -9, +-18, +-33, + 38, + 24, + 9, + 44, + 31, + 14, + 67, + 49, + 26, + 86, + 52, + 1, + 82, + 37, +-44, + 84, + 43, +-36, + 83, + 43, +-32, + 80, + 40, +-34, + 77, + 38, +-35, + 74, + 34, +-33, + 68, + 27, +-39, + 41, + -4, +-69, + 3, +-47, +-92, + 19, +-17, +-62, + 18, +-21, +-73, + 16, +-11, +-40, + -5, +-41, +-68, + -6, +-43, +-79, +-19, +-53, +-95, +-33, +-87, +-121, +-34, +-88, +-126, +-34, +-89, +-123, +-36, +-91, +-123, +-32, +-83, +-117, +-17, +-66, +-107, + 18, +-30, +-81, + 57, + 16, +-50, + 57, + 17, +-48, + 53, + 13, +-52, + 35, + -7, +-70, + 47, +-15, +-95, + 47, +-12, +-90, + 27, +-35, +-107, + 63, + 1, +-84, + 43, +-16, +-91, + 20, +-41, +-114, + 63, + 18, +-32, + 75, + 29, +-37, + 52, + 6, +-51, +108, + 96, + 70, +122, +122, +122, +121, +121, +121, +121, +121, +121, +108, +107, +105, + 99, + 97, + 91, + 96, + 91, + 81, + 99, + 93, + 80, + 84, + 70, + 49, + 91, + 78, + 58, + 92, + 79, + 56, + 89, + 76, + 55, +109, +107, + 99, +118, +118, +115, +120, +120, +118, +115, +115, +114, +121, +121, +121, +121, +121, +121, +115, +115, +113, + 98, + 98, + 95, +105, + 99, + 92, + 42, +-16, +-97, + 48, + -2, +-76, + 60, + 9, +-65, + 65, + 10, +-61, + 22, +-42, +-128, + 18, +-42, +-126, + 59, + 2, +-79, + 40, +-22, +-98, + 41, +-22, +-128, + 19, +-48, +-128, + 50, + 5, +-69, + 62, + 17, +-56, + 66, + 24, +-52, + 39, +-11, +-82, + 16, +-31, +-72, + 19, +-16, +-59, + 23, +-11, +-37, + 13, +-14, +-30, + 14, +-10, +-21, + 17, + -6, +-21, + 24, + -9, +-48, + 31, + -2, +-46, + 30, + -5, +-59, + 2, +-37, +-72, + 14, +-34, +-86, + 12, +-30, +-70, + -5, +-50, +-79, + 24, +-34, +-111, + 51, + -3, +-82, + 51, + 2, +-78, +-85, +-116, +-121, +-68, +-104, +-122, +-51, +-80, +-92, +-63, +-94, +-113, +-29, +-31, +-112, + 44, + 24, +-73, + 59, + 44, +-33, + 64, + 44, + -4, + 78, + 59, + 15, + 87, + 52, + -1, + 83, + 37, +-45, + 84, + 43, +-39, + 83, + 43, +-33, + 79, + 39, +-36, + 77, + 38, +-35, + 75, + 35, +-34, + 70, + 31, +-36, + 57, + 17, +-48, + 31, + -8, +-64, + 31, +-10, +-64, + 31, +-10, +-65, + 30, +-10, +-65, + 29, +-11, +-64, + 29, +-11, +-66, + 28, +-13, +-66, + 27, +-15, +-67, + 26, +-16, +-68, + 24, +-18, +-70, + 22, +-20, +-72, + 21, +-21, +-76, + 19, +-24, +-78, + 36, + -6, +-62, + 57, + 16, +-48, + 56, + 16, +-49, + 51, + 10, +-54, + 33, + -9, +-69, + 44, +-13, +-86, + 46, + -8, +-72, + 40, +-15, +-83, + 66, + 12, +-55, + 41, + -9, +-72, + 21, +-37, +-96, + 66, + 35, + 8, + 76, + 41, + -5, + 56, + 11, +-31, +107, +101, + 87, +121, +121, +121, +114, +114, +113, +118, +118, +118, +120, +120, +120, +113, +113, +112, +121, +121, +121, +116, +113, +111, + 48, + 18, +-15, + 93, + 86, + 79, +119, +118, +118, +121, +121, +121, +115, +116, +106, +120, +120, +120, +119, +120, +116, +114, +115, +112, +121, +121, +121, +121, +121, +121, +118, +118, +116, + 96, + 97, + 95, +103, + 98, + 92, + 48, + -2, +-74, + 50, + 9, +-48, + 62, + 17, +-42, + 63, + 17, +-40, + 24, +-36, +-118, + 17, +-37, +-111, + 62, + 12, +-53, + 41, +-14, +-74, + 41, +-19, +-99, + 20, +-43, +-119, + 48, + 2, +-71, + 61, + 16, +-57, + 65, + 23, +-52, + 51, + 9, +-64, + 44, + -8, +-82, + 49, + -6, +-83, + 45, +-10, +-84, + 48, +-10, +-86, + 42, +-16, +-93, + 40, +-19, +-95, + 36, +-24, +-97, + 37, +-21, +-100, + 33, +-26, +-105, + 31, +-28, +-105, + 26, +-31, +-108, + 19, +-35, +-108, + 19, +-33, +-106, + 34, +-17, +-90, + 52, + 2, +-77, + 53, + 5, +-76, +-69, +-107, +-123, +-55, +-100, +-125, +-15, +-61, +-94, + 17, +-23, +-109, + 13, + -1, +-111, +-43, +-48, +-123, + 49, + 28, +-57, + 81, + 38, +-126, + 83, + 56, +-52, + 90, + 51, +-21, + 82, + 36, +-46, + 84, + 43, +-39, + 81, + 41, +-35, + 78, + 38, +-37, + 76, + 37, +-37, + 75, + 36, +-33, + 72, + 34, +-33, + 70, + 30, +-37, + 67, + 27, +-40, + 64, + 26, +-40, + 64, + 27, +-39, + 63, + 26, +-39, + 65, + 27, +-38, + 65, + 26, +-39, + 62, + 23, +-40, + 61, + 21, +-42, + 57, + 19, +-45, + 57, + 17, +-48, + 55, + 14, +-45, + 54, + 13, +-46, + 53, + 13, +-49, + 54, + 14, +-49, + 55, + 15, +-48, + 53, + 12, +-50, + 49, + 9, +-55, + 36, + -8, +-70, + 49, + -8, +-77, + 49, + -4, +-65, + 37, +-20, +-86, + 71, + 20, +-49, + 47, + -3, +-66, + 22, +-35, +-92, + 71, + 39, + 12, + 77, + 40, + -6, + 55, + 11, +-28, +107, +101, + 87, +121, +121, +121, +109, +110, +107, +120, +120, +120, +120, +120, +120, +115, +115, +113, +120, +119, +119, + 89, + 80, + 72, + 27, + -8, +-40, + 54, + 33, + 12, +114, +113, +112, +121, +121, +121, +121, +121, +121, +111, +110, +105, + 85, + 84, + 65, + 86, + 83, + 67, +100, +100, + 96, +112, +111, +109, +120, +121, +120, +105, +106, +103, +103, + 98, + 92, + 49, + -2, +-71, + 56, + 14, +-47, + 57, + 14, +-41, + 62, + 22, +-30, + 28, +-33, +-107, + 17, +-37, +-103, + 63, + 18, +-39, + 40, +-11, +-60, + 42, +-14, +-88, + 21, +-39, +-109, + 45, + -2, +-74, + 59, + 14, +-59, + 65, + 23, +-53, + 67, + 27, +-51, + 68, + 27, +-53, + 68, + 26, +-53, + 69, + 25, +-52, + 68, + 21, +-53, + 60, + 12, +-60, + 59, + 11, +-62, + 57, + 9, +-65, + 55, + 6, +-67, + 52, + 3, +-72, + 52, + 1, +-73, + 53, + 0, +-75, + 50, + 0, +-74, + 49, + 0, +-75, + 52, + 3, +-72, + 52, + 3, +-72, + 53, + 5, +-76, +-44, +-87, +-115, +-12, +-63, +-107, + 16, +-32, +-76, + 3, +-42, +-104, +-25, +-20, +-121, +-32, +-22, +-109, + 14, + 9, +-27, + 11, +-19, +-64, + 72, + 31, +-126, +102, + 72, +-79, + 80, + 34, +-49, + 83, + 40, +-41, + 81, + 41, +-38, + 77, + 37, +-38, + 75, + 36, +-37, + 75, + 35, +-34, + 73, + 33, +-34, + 71, + 32, +-35, + 68, + 31, +-36, + 67, + 31, +-37, + 66, + 30, +-35, + 66, + 30, +-35, + 65, + 29, +-36, + 65, + 29, +-36, + 63, + 26, +-39, + 61, + 25, +-40, + 60, + 23, +-42, + 59, + 19, +-43, + 57, + 17, +-43, + 55, + 15, +-44, + 55, + 14, +-47, + 54, + 13, +-49, + 52, + 11, +-48, + 50, + 9, +-53, + 47, + 6, +-57, + 33, +-14, +-79, + 54, + -6, +-81, + 48, +-12, +-78, + 42, +-19, +-93, + 72, + 15, +-66, + 58, + 4, +-69, + 26, +-38, +-106, + 78, + 37, +-11, + 79, + 32, +-35, + 66, + 14, +-41, +109, + 97, + 74, +119, +119, +117, +118, +118, +116, +118, +118, +115, +119, +118, +116, +112, +110, +105, + 86, + 73, + 59, + 15, +-17, +-52, + 41, + 5, +-32, + 21, +-20, +-67, + 44, + 21, +-11, +111, +112, +107, +112, +113, +110, + 97, + 97, + 82, + 76, + 73, + 52, + 54, + 49, + 19, + 75, + 68, + 42, + 70, + 58, + 24, + 14, + 15, +-10, + 70, + 72, + 65, +105, + 99, + 91, + 53, + -3, +-84, + 58, + 8, +-63, + 54, + 5, +-58, + 62, + 15, +-46, + 27, +-34, +-107, + 15, +-42, +-115, + 63, + 15, +-51, + 38, +-16, +-71, + 39, +-22, +-105, + 22, +-41, +-118, + 41, + -8, +-75, + 57, + 13, +-61, + 65, + 22, +-54, + 68, + 29, +-51, + 72, + 33, +-49, + 72, + 32, +-50, + 73, + 29, +-50, + 70, + 26, +-51, + 66, + 19, +-56, + 64, + 17, +-60, + 62, + 14, +-63, + 60, + 11, +-63, + 60, + 8, +-69, + 60, + 6, +-73, + 59, + 5, +-74, + 57, + 4, +-75, + 55, + 5, +-71, + 54, + 5, +-70, + 52, + 3, +-72, + 51, + 3, +-77, +-62, +-96, +-120, +-28, +-61, +-87, + 12, +-19, +-44, + 14, +-14, +-55, +-33, +-41, +-97, + 41, + 5, +-124, + 9, + -2, +-43, +-31, +-15, +-106, + 17, + 12, +-74, + 72, + 47, +-85, + 64, + 29, +-52, + 83, + 38, +-42, + 79, + 39, +-38, + 76, + 36, +-39, + 75, + 35, +-38, + 74, + 34, +-35, + 72, + 32, +-35, + 71, + 31, +-36, + 68, + 31, +-37, + 66, + 30, +-38, + 66, + 29, +-37, + 65, + 28, +-37, + 63, + 24, +-41, + 61, + 23, +-42, + 59, + 21, +-44, + 56, + 17, +-44, + 43, + 9, +-39, + 33, + -4, +-55, + 30, + -8, +-59, + 32, + -7, +-57, + 30, +-10, +-61, + 22, +-18, +-68, + 19, +-23, +-73, + 14, +-28, +-79, + 12, +-30, +-83, + 8, +-39, +-93, + 15, +-34, +-93, + 25, +-32, +-96, + 46, +-17, +-99, + 69, + 6, +-81, + 64, + 8, +-75, + 28, +-42, +-124, + 79, + 37, +-16, + 79, + 32, +-45, + 72, + 23, +-39, +112, + 98, + 74, +121, +121, +121, +122, +122, +122, +121, +121, +121, +121, +121, +121, +118, +118, +116, +113, +110, +105, + 94, + 84, + 70, + 31, + -7, +-46, + 63, + 45, + 24, + 97, + 93, + 87, +120, +120, +119, +101, +101, + 91, + 79, + 79, + 65, + 30, + 29, + 0, + 68, + 63, + 40, + 74, + 63, + 26, + 61, + 37, +-15, + 37, + 20, +-21, + 43, + 30, +-12, + 82, + 65, + 36, + 52, + -4, +-97, + 54, + 4, +-70, + 52, + -1, +-72, + 62, + 10, +-62, + 27, +-37, +-113, + 12, +-46, +-122, + 62, + 8, +-69, + 35, +-22, +-93, + 35, +-28, +-128, + 8, +-52, +-126, + 18, +-29, +-88, + 35, + -9, +-68, + 44, + 2, +-62, + 49, + 10, +-58, + 50, + 12, +-58, + 49, + 9, +-60, + 50, + 7, +-61, + 47, + 4, +-62, + 44, + -1, +-64, + 40, + -5, +-70, + 46, + 0, +-70, + 60, + 11, +-67, + 59, + 9, +-70, + 60, + 6, +-73, + 58, + 4, +-73, + 57, + 3, +-73, + 53, + 4, +-71, + 52, + 3, +-71, + 50, + 1, +-74, + 50, + 1, +-75, + 46, + -1, +-77, + 74, + 36, +-22, + 90, + 55, + -8, + 95, + 68, + 25, +-42, +-57, +-86, + 27, +-23, +-126, +-22, +-40, +-125, +-17, +-31, +-113, + 32, + -5, +-123, +-35, +-40, +-117, + 56, + 24, +-76, + 83, + 39, +-45, + 79, + 37, +-41, + 74, + 34, +-42, + 74, + 33, +-40, + 72, + 31, +-37, + 70, + 30, +-37, + 70, + 30, +-37, + 67, + 28, +-39, + 66, + 27, +-40, + 64, + 27, +-39, + 63, + 25, +-40, + 55, + 15, +-50, + 50, + 10, +-54, + 49, + 8, +-53, + 46, + 4, +-54, + 22, +-12, +-43, +-26, +-67, +-101, +-18, +-61, +-103, +-25, +-69, +-112, +-26, +-73, +-119, +-24, +-71, +-116, +-18, +-66, +-114, +-20, +-67, +-110, +-24, +-68, +-112, +-19, +-63, +-104, +-34, +-80, +-118, + 12, +-47, +-106, + 49, + -9, +-84, + 69, + 9, +-69, + 73, + 22, +-54, + 28, +-41, +-115, + 84, + 50, + 13, + 82, + 41, +-20, + 75, + 27, +-29, +113, +105, + 89, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +119, +119, +118, +121, +121, +121, +113, +111, +105, + 32, + -7, +-51, + 81, + 70, + 55, +113, +113, +112, +118, +118, +117, + 89, + 87, + 71, + 71, + 67, + 48, + 86, + 84, + 58, + 74, + 66, + 39, + 65, + 47, + 8, + 46, + 19, +-33, + 65, + 39, +-20, + 57, + 28, +-33, + 76, + 54, + 13, + 58, + 1, +-78, + 53, + 11, +-48, + 52, + 2, +-63, + 62, + 11, +-54, + 30, +-31, +-99, + 11, +-46, +-121, + 61, + 8, +-63, + 31, +-25, +-89, + 32, +-31, +-126, + -4, +-58, +-123, +-30, +-81, +-125, +-11, +-56, +-91, +-25, +-77, +-122, +-23, +-74, +-119, +-17, +-70, +-111, +-17, +-68, +-113, +-20, +-73, +-119, +-13, +-61, +-103, + 3, +-44, +-80, + 1, +-48, +-87, + 30, +-16, +-79, + 58, + 9, +-68, + 59, + 6, +-69, + 58, + 3, +-72, + 57, + 2, +-73, + 55, + 2, +-73, + 51, + 2, +-73, + 50, + 1, +-74, + 48, + -1, +-76, + 47, + -2, +-77, + 45, + 5, +-60, + 74, + 35, +-33, + 95, + 62, + 15, +104, + 88, + 63, +-29, +-34, +-71, + 42, +-10, +-126, + 44, + 11, +-122, + 17, +-29, +-127, + 25, + 5, +-33, + 65, + 20, +-55, + 83, + 37, +-101, + 84, + 40, +-50, + 80, + 36, +-42, + 75, + 33, +-43, + 72, + 31, +-42, + 70, + 29, +-41, + 68, + 28, +-39, + 67, + 27, +-40, + 65, + 25, +-42, + 64, + 24, +-42, + 62, + 22, +-43, + 61, + 21, +-44, + 48, + 8, +-56, + 42, + 2, +-59, + 42, + 0, +-59, + 38, + -4, +-60, + 13, +-21, +-52, + 13, + -6, +-16, + 55, + 39, + 30, + 51, + 27, + 11, + 52, + 27, + 11, + 51, + 22, + 4, + 56, + 32, + 15, + 63, + 39, + 24, + 71, + 45, + 28, + 57, + 18, +-23, + 18, +-16, +-44, + 7, +-47, +-99, + 51, + -6, +-70, + 70, + 12, +-61, + 73, + 24, +-43, + 38, +-19, +-78, + 65, + 26, + -9, + 56, + 16, +-30, + 49, + 11, +-35, + 44, + 8, +-42, + 54, + 33, +-16, + 80, + 59, + 22, + 97, + 85, + 63, +114, +109, +102, +119, +119, +118, +117, +116, +114, +101, + 89, + 74, + 63, + 37, + 8, + 74, + 53, + 22, +109, +109, +108, +116, +115, +116, + 83, + 83, + 70, + 58, + 50, + 21, + 85, + 83, + 62, + 78, + 68, + 40, + 58, + 34, +-18, + 46, + 16, +-37, + 57, + 27, +-30, + 63, + 35, +-23, + 81, + 66, + 43, + 60, + 6, +-65, + 48, + 9, +-38, + 49, + 4, +-50, + 60, + 15, +-35, + 31, +-24, +-83, + 9, +-45, +-108, + 58, + 13, +-41, + 28, +-21, +-68, + 29, +-31, +-118, + -9, +-59, +-117, + 4, +-30, +-51, + 25, +-15, +-51, + 24, +-17, +-58, + 28, +-14, +-53, + 33, +-10, +-47, + 37, + -4, +-37, + 39, + 0, +-32, + 47, + 13, +-17, + 54, + 25, + -5, +-18, +-64, +-98, + 34, +-14, +-80, + 55, + 6, +-69, + 54, + 4, +-71, + 55, + 1, +-72, + 53, + -1, +-74, + 50, + 0, +-74, + 49, + 0, +-75, + 48, + -1, +-76, + 46, + -3, +-77, + 45, + -4, +-78, + 39, + 1, +-57, + 64, + 30, +-25, + 95, + 67, + 20, + 99, + 74, + 28, + -6, +-11, +-46, + 0, +-37, +-121, + 4, +-24, +-121, + 15, + 11, +-29, + 65, + 36, + 6, + 83, + 41, +-21, + 77, + 30, +-54, + 82, + 36, +-48, + 78, + 34, +-44, + 73, + 30, +-45, + 69, + 29, +-46, + 68, + 27, +-41, + 67, + 27, +-40, + 65, + 25, +-42, + 63, + 23, +-44, + 62, + 22, +-44, + 59, + 19, +-46, + 57, + 17, +-48, + 45, + 5, +-58, + 40, + -1, +-61, + 38, + -3, +-62, + 36, + -8, +-61, + 9, +-28, +-60, + 61, + 54, + 51, +103, + 98, + 92, + 87, + 72, + 59, + 89, + 73, + 62, + 89, + 70, + 56, + 90, + 68, + 51, + 87, + 57, + 30, + 81, + 41, + -3, + 84, + 42, +-10, + 55, + 32, + 12, + 12, +-44, +-95, + 48, +-11, +-83, + 58, + -1, +-73, + 68, + 20, +-34, + 61, + 18, +-20, + 72, + 40, + 14, + 81, + 48, + 9, + 80, + 52, + 13, + 83, + 59, + 24, + 80, + 61, + 29, + 67, + 50, + 23, + 54, + 26, +-20, + 62, + 25, +-36, + 85, + 70, + 53, + 95, + 92, + 87, + 58, + 38, + 21, + 33, +-10, +-46, + 59, + 42, + 29, +106, +105, +103, +121, +121, +121, + 86, + 79, + 68, + 53, + 36, + 7, + 55, + 39, + 6, + 47, + 28, + -5, + 41, + 19, +-24, + 43, + 27, + 4, + 34, + 4, +-45, + 56, + 33, +-13, + 74, + 53, + 19, + 60, + 5, +-71, + 57, + 17, +-34, + 47, + 0, +-55, + 62, + 17, +-36, + 29, +-26, +-87, + 6, +-48, +-107, + 58, + 17, +-38, + 25, +-24, +-72, + 29, +-29, +-114, + -7, +-56, +-114, + 43, + 26, + 16, + 51, + 7, +-38, + 56, + 11, +-34, + 60, + 18, +-28, + 68, + 26, +-18, + 80, + 40, + 1, + 89, + 54, + 21, + 90, + 59, + 25, + 95, + 61, + 13, +-16, +-59, +-96, + 34, +-14, +-79, + 52, + 3, +-71, + 50, + 1, +-74, + 48, + -1, +-75, + 47, + -2, +-76, + 47, + -2, +-76, + 47, + -2, +-76, + 46, + -3, +-77, + 43, + -5, +-79, + 42, + -7, +-81, + 17, + 1, +-18, + 28, + 31, + 35, + 81, + 64, + 34, + 96, + 73, + 31, + 1, + -6, +-48, +-66, +-51, +-122, +-85, +-68, +-100, +-14, +-14, +-35, + -8, +-39, +-79, + 65, + 10, +-109, + 78, + 31, +-58, + 81, + 34, +-50, + 76, + 32, +-46, + 73, + 28, +-47, + 68, + 26, +-46, + 67, + 25, +-43, + 66, + 24, +-42, + 64, + 23, +-43, + 62, + 22, +-44, + 60, + 20, +-45, + 57, + 16, +-49, + 55, + 15, +-50, + 42, + 1, +-58, + 38, + -3, +-63, + 36, + -6, +-62, + 33, +-10, +-64, + 14, +-25, +-60, + 57, + 51, + 49, +105, + 98, + 92, + 88, + 74, + 62, + 86, + 65, + 47, + 84, + 56, + 33, + 80, + 44, + 7, + 78, + 34, +-13, + 78, + 35, +-19, + 87, + 46, + -9, + 58, + 33, + 11, + 47, + 7, +-43, + 52, + 14, +-34, + 32, + 3, +-52, + 23, +-30, +-67, + 83, + 17, + -9, + 87, + 48, + 7, + 86, + 58, + 14, + 60, + 43, + 0, + 61, + 45, + 4, + 56, + 47, + 12, + 59, + 51, + 19, + 39, + 36, +-12, + 9, + 18, +-28, + 56, + 43, + 10, + 39, + 16, +-25, + 46, + 13, +-36, + 34, + -7, +-54, + 8, + -5, +-17, + 48, + 44, + 41, + 59, + 55, + 50, +121, +121, +120, +121, +121, +120, + 97, + 90, + 81, + 13, + 3, +-17, + 59, + 55, + 47, + 46, + 46, + 39, + 94, + 89, + 84, +103, + 93, + 82, +108, + 88, + 64, + 58, + 0, +-79, + 56, + 9, +-49, + 45, + -8, +-79, + 57, + 5, +-64, + 26, +-35, +-105, + 3, +-56, +-126, + 58, + 5, +-70, + 20, +-35, +-95, + 26, +-36, +-128, +-10, +-60, +-113, + 48, + 39, + 36, + 48, + 6, +-37, + 52, + 7, +-39, + 56, + 10, +-35, + 65, + 22, +-23, + 81, + 41, + 2, + 88, + 53, + 18, + 90, + 55, + 18, + 93, + 59, + 6, +-23, +-61, +-91, + 30, +-17, +-81, + 47, + -2, +-73, + 46, + -3, +-75, + 46, + -3, +-77, + 45, + -4, +-78, + 45, + -4, +-78, + 45, + -4, +-78, + 42, + -7, +-81, + 41, + -8, +-82, + 40, + -9, +-83, + 6, + 10, + 6, + 22, + 28, + 28, + 62, + 48, + 27, + 93, + 68, + 22, + 16, + 8, +-37, +-88, +-71, +-111, +-78, +-57, +-79, +-62, +-51, +-73, + 8, + -6, +-37, + 80, + 40, +-14, + 75, + 26, +-57, + 78, + 31, +-52, + 76, + 29, +-48, + 70, + 25, +-50, + 68, + 23, +-48, + 65, + 23, +-45, + 63, + 21, +-45, + 62, + 21, +-45, + 60, + 19, +-46, + 58, + 17, +-48, + 53, + 12, +-52, + 50, + 9, +-55, + 39, + -2, +-62, + 35, + -6, +-66, + 32, + -9, +-68, + 30, +-13, +-68, + 14, +-27, +-61, + 57, + 51, + 48, +105, + 97, + 92, + 90, + 72, + 57, + 85, + 59, + 36, + 81, + 48, + 16, + 76, + 36, +-10, + 74, + 29, +-22, + 76, + 31, +-24, + 85, + 43, +-12, + 82, + 51, + 21, + 0, +-34, +-77, + 57, + 2, +-57, + 25, +-11, +-76, + 14, + 10, +-36, + 92, + 60, + 15, + 76, + 48, + 0, + 58, + 38, +-14, + 16, + 12, +-37, + 19, + 13, +-30, + 40, + 30, +-14, + 34, + 28, +-13, +-24, +-15, +-66, +-35, + -9, +-52, +-44, + -7, +-38, + 12, + 25, + -1, +-45, + -6, +-41, + 48, + 14, +-37, +-25, +-24, +-48, +-36, +-28, +-48, +-27, +-24, +-44, + 83, + 80, + 76, +121, +120, +119, +112, +111, +110, + 84, + 84, + 83, +119, +119, +119, +111, +110, +109, +114, +113, +112, +120, +120, +119, +103, + 93, + 80, + 65, + 37, + 16, + 64, + 22, +-20, + 41, +-10, +-80, + 53, + 3, +-61, + 24, +-36, +-101, + -2, +-57, +-128, + 56, + 4, +-68, + 17, +-36, +-99, + 23, +-40, +-128, +-19, +-69, +-124, + 53, + 46, + 46, + 46, + 3, +-38, + 50, + 5, +-40, + 56, + 10, +-36, + 66, + 23, +-23, + 81, + 41, + 0, + 88, + 51, + 16, + 88, + 51, + 8, + 97, + 63, + 8, +-25, +-67, +-97, + 28, +-19, +-85, + 44, + -5, +-76, + 43, + -7, +-77, + 42, + -7, +-80, + 44, + -9, +-82, + 42, + -8, +-81, + 42, + -8, +-80, + 40, + -9, +-83, + 38, +-11, +-85, + 38, +-11, +-86, + 21, + 23, + 16, + 39, + 40, + 34, + 46, + 51, + 42, + 68, + 46, + 1, + 24, + 15, +-28, +-40, +-30, +-45, +-61, +-45, +-55, +-14, + -3, +-10, +-29, +-25, +-65, + 78, + 37, +-18, + 72, + 23, +-58, + 76, + 29, +-53, + 75, + 28, +-49, + 69, + 23, +-51, + 66, + 21, +-51, + 64, + 20, +-47, + 61, + 19, +-47, + 60, + 18, +-48, + 58, + 16, +-48, + 54, + 12, +-52, + 49, + 7, +-56, + 46, + 4, +-57, + 37, + -6, +-65, + 33, +-10, +-69, + 31, +-12, +-71, + 27, +-16, +-72, + 7, +-33, +-68, + 58, + 49, + 44, +107, +100, + 94, + 92, + 72, + 56, + 83, + 52, + 24, + 79, + 41, + 3, + 72, + 28, +-19, + 68, + 22, +-31, + 72, + 24, +-29, + 80, + 36, +-21, + 68, + 38, + 0, + 55, + 48, + 25, +105, + 59, +-37, + 66, + 11, +-108, + 43, + 27, +-21, + 88, + 57, + 9, + -2, + -3, +-58, +-12, +-11, +-70, + 17, + 12, +-47, + 22, + 16, +-29, + 37, + 28, +-14, + 48, + 36, + -7, + 39, + 29, +-21, +-39, +-24, +-79, + -4, + 2, +-51, +-23, + -5, +-52, + 25, + 36, + -7, + 39, + 8, +-40, +-38, +-70, +-93, +-49, +-85, +-116, +-43, +-77, +-108, + 7, + -5, +-13, + 51, + 42, + 37, + 42, + 32, + 26, + 33, + 21, + 19, + 29, + 18, + 13, + 17, + 4, + -2, + 18, + 1, + -6, + 18, + 2, + -4, +-16, +-43, +-53, +-21, +-68, +-103, + 66, + 34, + 8, + 36, + -8, +-59, + 53, + 11, +-35, + 24, +-29, +-83, + -5, +-59, +-123, + 54, + 10, +-41, + 17, +-32, +-81, + 22, +-38, +-118, +-31, +-73, +-106, + 66, + 59, + 59, + 43, + -1, +-42, + 50, + 5, +-41, + 55, + 10, +-39, + 67, + 24, +-22, + 80, + 39, + -3, + 87, + 48, + 8, + 87, + 49, + 3, +102, + 69, + 15, +-23, +-66, +-97, + 24, +-24, +-88, + 41, + -9, +-80, + 40, + -9, +-82, + 39, +-10, +-84, + 41, +-13, +-85, + 40, +-11, +-84, + 38, +-12, +-84, + 37, +-13, +-86, + 36, +-13, +-88, + 35, +-14, +-88, + 23, + 24, + 15, + 36, + 37, + 35, + 53, + 61, + 56, + -7, + 6, +-31, + 23, + 14, +-19, +-26, +-18, +-23, +-71, +-54, +-63, +-13, + -5, +-12, + 24, + 18, + -7, + 71, + 30, +-25, + 73, + 19, +-60, + 75, + 26, +-56, + 73, + 25, +-52, + 66, + 20, +-52, + 64, + 19, +-51, + 62, + 17, +-49, + 60, + 17, +-49, + 57, + 15, +-49, + 53, + 11, +-53, + 49, + 7, +-57, + 44, + 2, +-59, + 42, + -1, +-60, + 33, +-10, +-69, + 31, +-13, +-71, + 29, +-14, +-73, + 26, +-18, +-75, + 28, + 4, +-14, + 19, + -1, +-10, + 94, + 81, + 69, + 89, + 64, + 41, + 81, + 43, + 8, + 72, + 30, +-13, + 63, + 16, +-31, + 59, + 11, +-41, + 63, + 14, +-39, + 66, + 16, +-38, + 45, + 1, +-49, + 71, + 69, + 64, + 95, + 58, + 7, + 86, + 36, +-59, + 85, + 50, + -3, + 80, + 51, + 3, + 13, + 4, +-52, + 6, + 5, +-58, + 24, + 17, +-42, + 20, + 17, +-36, + 57, + 40, + -4, + 25, + 17, +-39, + 17, + 11, +-44, + 8, + 9, +-46, + 48, + 34, + -4, + 49, + 47, + 15, + 86, + 85, + 68, + 52, + 15, +-30, + -5, +-43, +-87, +-13, +-55, +-104, + -5, +-45, +-94, + 0, +-36, +-83, + 1, +-37, +-84, + -3, +-39, +-87, +-13, +-50, +-95, + -7, +-43, +-87, +-21, +-58, +-97, +-46, +-77, +-108, + 2, +-15, +-26, + -3, +-32, +-48, + 6, +-38, +-77, + 62, + 32, + 5, + 27, +-18, +-59, + 47, + 8, +-36, + 21, +-28, +-80, +-11, +-60, +-106, + 54, + 21, + -7, + 37, + 2, +-23, + 12, +-31, +-70, +-22, +-50, +-54, + 32, + 14, + 7, + 42, + -2, +-44, + 49, + 3, +-42, + 54, + 9, +-40, + 65, + 20, +-26, + 76, + 36, +-11, + 83, + 43, + -1, + 84, + 45, + -3, + 72, + 40, + -8, +-31, +-67, +-97, + 22, +-27, +-89, + 37, +-12, +-82, + 37, +-13, +-84, + 37, +-15, +-88, + 39, +-17, +-89, + 35, +-15, +-88, + 35, +-15, +-87, + 33, +-16, +-89, + 33, +-16, +-92, + 32, +-17, +-92, + 32, + 34, + 27, + 40, + 42, + 42, + 43, + 48, + 47, + 49, + 53, + 22, + 2, + 1, +-32, +-103, +-80, +-94, +-99, +-76, +-89, +-76, +-63, +-74, + 10, +-15, +-41, + 33, + -3, +-43, + 42, + 13, +-22, + 47, + 18, + -9, + 47, + 21, + -6, + 15, + -7, +-32, + 49, + 27, + -5, + 61, + 41, + 3, + 59, + 13, +-51, + 55, + 11, +-54, + 49, + 6, +-58, + 43, + 1, +-62, + 39, + -4, +-63, + 37, + -6, +-65, + 31, +-13, +-71, + 29, +-14, +-73, + 28, +-16, +-74, + 29, + -9, +-54, + 1, +-18, +-30, + 24, + 1, +-17, + 37, +-11, +-52, + 58, + 11, +-33, + 62, + 14, +-31, + 64, + 27, + -9, + 75, + 51, + 23, + 96, + 88, + 70, + 92, + 85, + 71, + 73, + 52, + 33, + 54, + 9, +-38, + 73, + 57, + 29, + 69, +-12, +-109, + 64, + 8, +-39, + 86, + 50, + -1, + 33, + 19, +-42, + -2, + -5, +-63, + 3, + 1, +-61, + 34, + 25, +-36, + 19, + 13, +-42, + 42, + 31, +-17, +-26, +-16, +-68, + 13, + 7, +-50, + 16, + 10, +-44, + 82, + 62, + 28, + 73, + 62, + 31, +101, +100, + 91, + 64, + 26, +-33, +115, +113, +109, +111, +109, +106, +118, +117, +113, +117, +116, +113, +119, +119, +113, +122, +122, +119, +118, +117, +114, +121, +121, +121, + 83, + 78, + 69, +-39, +-67, +-112, +102, +100, + 96, + 78, + 54, + 33, + 30, +-16, +-56, + 48, + 13, +-25, + 16, +-31, +-85, + 41, + -5, +-55, + -2, +-44, +-85, +-37, +-73, +-102, + 47, + 21, +-14, + 55, + 14, +-37, + 24, +-22, +-70, +-34, +-68, +-89, + 5, +-36, +-72, + 41, + -4, +-46, + 49, + 3, +-42, + 54, + 9, +-38, + 62, + 17, +-30, + 72, + 29, +-18, + 77, + 35, +-12, + 49, + 10, +-29, + 56, + 38, + 18, + 59, + 37, + 13, + 24, +-25, +-93, + 35, +-15, +-86, + 34, +-15, +-87, + 34, +-17, +-91, + 36, +-19, +-92, + 34, +-19, +-92, + 31, +-18, +-92, + 30, +-19, +-94, + 30, +-19, +-94, + 29, +-20, +-96, + 39, + 40, + 40, + 40, + 42, + 43, + 41, + 45, + 45, + 75, + 70, + 48, + 73, + 63, + 36, +-119, +-112, +-123, +-93, +-91, +-90, +-32, +-34, +-34, + 14, + 3, + 5, + 18, + 8, + 10, + 19, + 9, + 12, + 22, + 13, + 17, + 21, + 12, + 15, + 14, + 6, + 7, + 24, + 1, +-24, + 26, +-34, +-43, + 53, + 9, +-37, + 54, + 7, +-55, + 44, + 1, +-61, + 38, + -5, +-64, + 36, + -7, +-66, + 32, +-11, +-70, + 30, +-13, +-72, + 28, +-15, +-75, + 25, +-17, +-79, + 22, +-14, +-59, +-56, +-96, +-116, + 40, + 28, + 23, + 92, + 77, + 52, + 88, + 74, + 47, + 85, + 71, + 48, +105, +102, + 88, +107, +106, + 95, +103, + 99, + 84, +109, +108, + 97, +107, +105, + 96, + 75, + 48, + 16, + 76, + 64, + 44, + 86, + 28, +-87, + 74, + 9, +-82, + 66, + 39, + -9, + 20, + 8, +-50, + 37, +-13, +-57, + 39, + 28, +-12, + 61, + 44, + 0, + 37, + 28, +-20, + 33, + 27, +-11, + 7, + 9, +-44, + 25, + 18, +-38, + 15, + 7, +-48, + 85, + 63, + 26, + 81, + 69, + 41, + 89, + 89, + 70, + 66, + 31, +-33, +123, +122, +123, +119, +119, +117, +123, +123, +123, +123, +123, +123, +122, +122, +122, +122, +122, +122, +120, +120, +118, +122, +122, +122, + 91, + 84, + 73, +-24, +-51, +-98, +106, +103, + 97, + 79, + 54, + 31, + 44, + 8, +-17, + 30, +-15, +-67, + 15, +-36, +-97, + 34, +-15, +-69, + 1, +-43, +-93, +-30, +-65, +-91, + 31, +-16, +-75, + 13, +-39, +-98, + 9, +-52, +-128, +-45, +-78, +-106, + 31, + 4, + -8, + 42, + 0, +-41, + 49, + 4, +-38, + 52, + 6, +-39, + 56, + 10, +-37, + 62, + 17, +-32, + 65, + 20, +-28, + 5, +-35, +-68, + 15, +-12, +-36, + -7, +-40, +-59, + 27, +-22, +-90, + 32, +-18, +-90, + 34, +-20, +-91, + 34, +-20, +-93, + 33, +-23, +-96, + 33, +-22, +-95, + 29, +-20, +-96, + 28, +-21, +-97, + 27, +-23, +-98, + 27, +-24, +-100, + 39, + 40, + 35, + 41, + 43, + 42, + 42, + 46, + 44, + 76, + 70, + 55, +104, + 88, + 64, + 2, + -5, +-23, +-41, +-50, +-49, + 20, + 5, + -2, + 27, + 9, + -5, + 33, + 12, + 1, + 30, + 8, + -3, + 31, + 7, + -3, + 29, + 6, + -3, + 24, + 4, + -6, + 35, + 3, +-35, + 67, + 25, +-68, + 21, +-19, +-69, + 35, +-16, +-66, + 28, +-21, +-69, + 33, +-14, +-70, + 32, +-15, +-75, + 32, +-16, +-76, + 29, +-15, +-79, + 28, +-18, +-81, + 25, +-19, +-83, + 23, +-17, +-66, +-58, +-92, +-100, + 68, + 54, + 18, + 90, + 80, + 44, + 94, + 88, + 57, + 99, + 92, + 72, + 97, + 94, + 73, +103, +101, + 87, + 95, + 91, + 70, +104, +101, + 85, +102, + 99, + 84, + 82, + 71, + 48, +101, + 95, + 75, + 83, + 46, +-11, + 55, + -3, +-69, + 27, + 10, +-43, + 32, +-11, +-58, + 38, + 14, +-41, + 47, + 33, +-13, + 41, + 26, +-41, + 13, + 8, +-51, +-45, +-27, +-98, +-44, +-26, +-100, +-29, +-19, +-88, + 1, + 2, +-56, + 55, + 8, +-67, + 77, + 67, + 38, + 50, + 56, + 25, + 55, + 24, +-40, +123, +123, +123, +119, +119, +118, +123, +123, +123, +123, +123, +123, +122, +122, +122, +123, +123, +123, +119, +119, +118, +123, +123, +123, + 96, + 89, + 78, +-18, +-47, +-93, +109, +106, + 99, + 74, + 46, + 17, + 34, + 2, +-21, + 30, +-10, +-48, + 14, +-36, +-88, + 31, +-11, +-53, + 5, +-35, +-74, +-23, +-61, +-89, + 32, +-14, +-66, + 13, +-35, +-86, + 7, +-51, +-126, +-49, +-77, +-93, + 52, + 32, + 20, + 40, + 1, +-36, + 43, + -1, +-40, + 43, + -3, +-46, + 44, + -2, +-47, + 49, + -1, +-47, + 52, + 2, +-47, + 4, +-37, +-73, + 15, +-18, +-44, +-19, +-66, +-109, + 26, +-24, +-93, + 29, +-21, +-93, + 29, +-21, +-95, + 30, +-24, +-98, + 29, +-26, +-100, + 29, +-26, +-100, + 26, +-25, +-100, + 24, +-26, +-102, + 26, +-28, +-103, + 23, +-28, +-105, + 33, + 33, + 26, + 33, + 35, + 32, + 43, + 44, + 43, + 49, + 54, + 43, + 54, + 58, + 29, + 74, + 51, + 7, +-80, +-91, +-105, + 56, + 36, + 20, + 58, + 36, + 21, + 59, + 38, + 24, + 64, + 40, + 26, + 65, + 41, + 25, + 65, + 40, + 24, + 65, + 41, + 20, + 48, + 17, + -8, + 10, +-44, +-116, + 4, +-38, +-84, + 25, +-14, +-59, + 22, +-19, +-66, + 30, +-18, +-79, + 31, +-17, +-79, + 30, +-18, +-79, + 30, +-18, +-80, + 28, +-20, +-81, + 30, + -8, +-59, + 32, + 0, +-40, + 73, + 61, + 22, + 86, + 74, + 34, + 74, + 63, + 19, + 87, + 76, + 45, +103, +101, + 87, +100, + 98, + 83, +101, + 99, + 84, + 86, + 82, + 63, + 95, + 88, + 65, + 98, + 93, + 61, +101, + 93, + 53, +102, + 97, + 51, +101, + 92, + 56, +106, +102, + 77, + 43, + 37, + 13, + 8, + -9, +-62, + 8, +-36, +-81, + 33, + 19, +-38, + 25, + 17, +-36, +-22, +-17, +-77, +-85, +-45, +-118, +-80, +-43, +-118, +-46, +-25, +-90, + 20, + 14, +-41, + 25, + 17, +-38, + 18, + 16, +-28, + 30, + 22, +-19, + 46, + 14, +-49, +109, +107, + 96, +120, +120, +119, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +119, +119, +119, +123, +123, +123, + 92, + 87, + 76, +-22, +-54, +-98, +109, +106, + 99, + 63, + 28, +-15, + 41, + 12, + -8, + 31, +-10, +-49, + 11, +-37, +-85, + 30, + -7, +-41, + 16, +-25, +-63, + 7, +-35, +-69, + 33, + -8, +-50, + 14, +-32, +-75, + 1, +-50, +-95, + -5, +-32, +-45, + 1, +-29, +-42, +-14, +-50, +-76, +-20, +-61, +-93, +-20, +-63, +-97, +-23, +-64, +-99, + -9, +-56, +-97, + -1, +-50, +-95, +-10, +-57, +-100, + 26, + -2, +-24, +-23, +-71, +-118, + 24, +-26, +-96, + 26, +-23, +-98, + 26, +-24, +-100, + 25, +-26, +-102, + 26, +-29, +-104, + 26, +-30, +-105, + 24, +-29, +-105, + 24, +-32, +-107, + 24, +-32, +-108, + 20, +-33, +-111, + 31, + 32, + 24, + 32, + 34, + 30, + 35, + 37, + 37, + 47, + 51, + 46, + 40, + 49, + 22, + 89, + 81, + 53, +-58, +-75, +-85, +-46, +-80, +-92, +-43, +-80, +-91, +-43, +-81, +-94, +-47, +-85, +-99, +-51, +-89, +-104, +-54, +-93, +-107, +-57, +-98, +-113, +-60, +-103, +-120, + 8, +-19, +-44, + 20, + -6, +-42, + 31, + 2, +-39, + 25, +-10, +-53, + 28, +-19, +-81, + 29, +-19, +-79, + 29, +-19, +-78, + 27, +-20, +-81, + 52, + 27, +-11, + 98, + 92, + 69, + 95, + 86, + 54, + 87, + 72, + 27, + 79, + 56, + -1, + 81, + 67, + 32, + 99, + 90, + 61, +102, + 98, + 81, +105, +102, + 82, +106, +105, + 88, + 99, + 97, + 78, +108, +106, + 90, + 99, + 95, + 71, + 97, + 89, + 48, +100, + 95, + 64, +104, + 99, + 57, + 97, + 90, + 40, + 95, + 89, + 58, + 28, +-11, +-39, + 0, +-21, +-70, + 20, + 4, +-49, +-28, +-20, +-84, + 14, + 2, +-59, + 43, + 25, +-19, +-19, +-14, +-70, +-18, +-12, +-73, + 9, + 4, +-55, + 38, + 23, +-29, + 27, + 12, +-34, +-15, +-37, +-79, + 34, + -5, +-53, + 83, + 66, + 34, +112, +112, +111, +116, +116, +116, +116, +116, +116, +115, +115, +115, +115, +115, +115, + 98, + 98, + 94, +106, +106, +106, + 61, + 58, + 50, +-42, +-77, +-114, +101, +100, + 96, + 50, + 6, +-44, + 37, + 6, +-16, + 29, +-17, +-69, + 12, +-39, +-95, + 22, +-20, +-61, + 19, +-25, +-67, + 13, +-26, +-52, + 62, + 48, + 44, + 78, + 73, + 85, + 81, + 80, + 95, + 69, + 63, + 71, + 64, + 51, + 49, + 66, + 47, + 35, + 63, + 40, + 26, + 50, + 30, + 16, + 53, + 31, + 18, + 57, + 38, + 24, + 66, + 48, + 33, + 29, + 5, +-11, + 37, + 9, +-14, + 9, +-40, +-85, + 23, +-27, +-102, + 23, +-26, +-102, + 25, +-28, +-103, + 24, +-32, +-107, + 22, +-34, +-111, + 20, +-32, +-106, + 25, +-25, +-77, + 22, +-19, +-62, + 14, +-27, +-60, + 10, +-28, +-67, + 25, + 27, + 17, + 29, + 31, + 27, + 23, + 27, + 28, + 35, + 39, + 40, + 40, + 49, + 33, + 76, + 72, + 49, + 25, + 25, + 4, +-108, +-125, +-125, +-103, +-125, +-126, +-100, +-125, +-126, +-101, +-122, +-125, +-94, +-121, +-126, +-95, +-112, +-118, +-93, +-113, +-118, +-74, +-100, +-110, + -4, +-26, +-52, +-15, +-42, +-70, + 20, + -7, +-42, + 15, +-24, +-61, + 26, +-21, +-83, + 26, +-22, +-84, + 26, +-22, +-84, + 45, + 12, +-29, + 84, + 68, + 31, + 97, + 85, + 55, + 97, + 91, + 73, + 79, + 61, + 7, + 57, + 38, +-10, + 97, + 89, + 56, + 95, + 89, + 66, + 99, + 93, + 71, +101, + 95, + 73, +109, +107, + 93, +104, + 99, + 78, +106, +102, + 76, + 97, + 94, + 72, + 57, + 50, + 11, + 92, + 86, + 51, +100, + 96, + 68, +105, + 97, + 62, +106, + 97, + 55, + 98, + 90, + 60, + 79, + 57, + 31, + 50, + 20, +-24, + 43, + 20, +-31, + 52, + 29, +-21, + 39, + 21, +-29, + 75, + 41, +-14, + 61, + 35, +-19, + 54, + 31, +-25, + 41, + 23, +-34, + 27, + 9, +-45, + 40, + 39, + 6, + 20, +-24, +-71, + 63, + 34, + 1, + 76, + 63, + 49, + 99, + 99, + 98, +101, +101, +102, +101, +101, +102, +100, +100, +101, + 97, + 97, + 96, +100, +100, + 98, + 59, + 58, + 58, +-63, +-103, +-124, + 90, + 87, + 85, + 36, +-22, +-89, + 36, + 5, +-19, + 26, +-26, +-85, + 16, +-40, +-114, + 20, +-29, +-90, + 18, +-29, +-80, + 19, +-12, +-35, + 85, + 65, + 55, + 92, + 79, + 82, + 88, + 82, + 90, + 86, + 79, + 80, + 87, + 76, + 73, + 87, + 74, + 69, + 87, + 72, + 65, + 87, + 72, + 65, + 91, + 75, + 66, + 92, + 75, + 60, + 91, + 71, + 54, + 43, + 18, + 3, + 27, + 9, +-13, + 26, + 9, +-11, + 2, +-19, +-46, +-15, +-33, +-52, +-12, +-28, +-49, +-19, +-31, +-50, +-26, +-36, +-53, +-34, +-42, +-61, +-36, +-49, +-71, +-44, +-57, +-76, +-38, +-50, +-71, +-49, +-63, +-88, + 12, + 17, + 7, + 15, + 18, + 13, + 20, + 24, + 17, + 29, + 31, + 27, + 44, + 49, + 42, + 47, + 54, + 28, + 88, + 77, + 57, +-12, + 4, +-11, + -6, + 9, + -5, + -7, + 9, + -5, +-12, + 5, +-11, + -9, + 9, + -9, +-14, + 5, +-11, +-11, + 8, + -9, + -6, + 11, + -5, + 1, + 14, + 2, + 42, + 48, + 41, +-34, +-52, +-64, + -1, +-39, +-73, + 24, +-24, +-86, + 24, +-24, +-86, + 30, +-14, +-68, + 85, + 69, + 31, + 95, + 81, + 47, +112, +108, + 93, + 95, + 91, + 69, + 27, + 14, +-28, + 65, + 47, + -2, + 82, + 64, + 18, + 94, + 86, + 60, + 99, + 92, + 71, + 95, + 86, + 57, + 98, + 94, + 74, +107, +105, + 93, + 96, + 95, + 74, + 95, + 92, + 72, + 71, + 68, + 41, + 47, + 40, + -7, + 54, + 53, + 27, + 79, + 76, + 46, +102, + 98, + 63, +107, +103, + 79, +101, + 96, + 70, + 64, + 27, +-15, + 65, + 4, +-29, + 65, + 2, +-31, + 82, + 25, +-30, + 81, + 30, +-34, + 60, + 28, +-33, + 42, + 23, +-37, + 30, + 16, +-42, + 36, + 25, +-26, + 56, + 54, + 27, + 41, + -8, +-66, + 43, + 8, +-28, + 46, + 13, +-24, + 45, + 25, + -3, + 49, + 33, + 9, + 46, + 30, + 8, + 43, + 29, + 8, + 48, + 37, + 17, + 48, + 39, + 20, + 20, + 15, + 5, +-75, +-117, +-125, + 66, + 54, + 48, + 31, +-20, +-78, + 41, + 17, + 0, + 24, +-26, +-81, + 16, +-38, +-106, + 20, +-28, +-81, + 17, +-29, +-77, + 58, + 37, + 22, +101, + 84, + 68, +107, + 93, + 81, +107, + 93, + 79, +107, + 93, + 79, +106, + 90, + 75, +104, + 86, + 68, +102, + 82, + 62, +101, + 77, + 49, +102, + 77, + 47, +102, + 75, + 43, +100, + 67, + 24, + 36, + 11, +-24, +-37, +-47, +-69, +-23, +-42, +-72, +-26, +-48, +-78, +-30, +-52, +-86, +-26, +-47, +-74, +-37, +-58, +-88, +-34, +-55, +-89, +-33, +-51, +-78, +-50, +-64, +-94, +-45, +-63, +-97, +-42, +-63, +-90, +-60, +-74, +-103, + 10, + 11, + -2, + 19, + 20, + 7, + 24, + 27, + 16, + 31, + 33, + 27, + 34, + 38, + 38, + 18, + 34, + 6, + 35, + 46, + 18, +-36, +-24, +-46, +-63, +-38, +-51, +-64, +-39, +-52, +-62, +-38, +-50, +-61, +-36, +-48, +-59, +-34, +-47, +-59, +-34, +-46, +-60, +-35, +-46, +-51, +-28, +-38, + 27, + 39, + 35, +-46, +-48, +-49, +-19, +-49, +-73, + 20, +-28, +-89, + 20, +-27, +-90, + 59, + 31, +-16, + 83, + 61, + 11, +100, + 90, + 66, +105, + 95, + 73, + 81, + 75, + 56, +-28, +-42, +-105, + 29, + 15, +-24, + 78, + 56, + 3, + 83, + 69, + 31, +102, + 97, + 77, +107, +104, + 87, +103, + 99, + 77, +102, +101, + 89, + 55, + 54, + 36, + 96, + 91, + 68, + 99, + 94, + 67, + 50, + 49, + 32, + 73, + 68, + 42, +101, + 94, + 60, +112, +109, + 91, +110, +106, + 81, +104, + 99, + 74, + 81, + 60, + 40, + 47, +-13, +-44, + 82, + 29, +-20, + 73, + 22, +-10, + 76, + 28, +-10, + 82, + 47, + 13, + 77, + 58, + 28, + 55, + 45, + 16, + 55, + 48, + 16, + 68, + 64, + 37, + 48, + 2, +-49, + 43, + 5, +-44, + 45, + 7, +-41, + 41, + 11, +-36, + 46, + 19, +-21, + 44, + 19, +-21, + 43, + 20, +-21, + 47, + 25, +-14, + 46, + 25, +-13, + 19, + 3, +-28, +-84, +-123, +-126, + 38, + 15, + -6, + 29, +-13, +-51, + 38, + 21, + 11, + 24, +-25, +-77, + 15, +-32, +-88, + 16, +-20, +-54, + 16, +-24, +-65, + 33, + -2, +-29, + 79, + 48, + 20, + 89, + 64, + 45, +101, + 81, + 62, + 93, + 74, + 56, + 98, + 78, + 60, + 96, + 71, + 49, + 89, + 55, + 24, + 85, + 48, + 6, + 84, + 45, + 2, + 78, + 33, +-15, + 73, + 24, +-29, + 42, + 13, +-28, +-44, +-54, +-77, +-27, +-52, +-83, +-35, +-57, +-91, +-35, +-56, +-93, +-42, +-63, +-99, +-34, +-58, +-95, +-47, +-66, +-102, +-46, +-66, +-101, +-51, +-68, +-102, +-54, +-74, +-111, +-56, +-73, +-108, +-63, +-80, +-115, + 1, + 2, +-13, + 11, + 11, + -1, + 19, + 19, + 5, + 20, + 22, + 17, + 20, + 23, + 18, + 26, + 36, + 18, + 40, + 48, + 25, + 10, + 9, +-23, +-66, +-41, +-54, +-65, +-40, +-52, +-64, +-40, +-51, +-64, +-40, +-50, +-60, +-36, +-47, +-60, +-36, +-47, +-58, +-34, +-44, +-49, +-27, +-36, + 19, + 32, + 28, +-19, +-18, +-20, +-18, +-47, +-73, + 47, + 5, +-37, + 46, + 4, +-39, + 68, + 40, + -8, + 81, + 59, + 10, + 99, + 87, + 61, + 91, + 81, + 50, + 23, + 5, +-50, +-83, +-85, +-121, +-27, +-33, +-58, + 91, + 76, + 43, + 95, + 88, + 61, +102, + 97, + 74, + 96, + 91, + 69, +104, + 99, + 79, +102, + 98, + 78, + 98, + 93, + 73, +104, + 98, + 74, + 99, + 94, + 72, +107, +104, + 87, + 50, + 41, + 1, +103, + 93, + 52, +107, +102, + 70, +107, +102, + 79, +107, +104, + 83, + 60, + 62, + 38, + 69, + 72, + 51, + 86, + 90, + 72, + 63, + 72, + 48, + 81, + 86, + 66, + 97, + 98, + 82, + 85, + 88, + 71, + 51, + 59, + 32, + 52, + 57, + 30, + 49, + 45, + 6, + 64, + 54, + 17, + 54, + 23, +-19, + 57, + 25, +-18, + 53, + 33, + 3, + 64, + 49, + 30, + 63, + 52, + 33, + 64, + 54, + 35, + 67, + 58, + 41, + 65, + 57, + 44, + 33, + 28, + 20, +-89, +-123, +-126, + 43, + 25, + 10, + 23, +-19, +-56, + 45, + 31, + 26, + 19, +-30, +-93, + 14, +-34, +-94, + 18, +-17, +-51, + 14, +-24, +-63, +-12, +-56, +-86, + 35, +-10, +-37, + 54, + 8, +-22, + 33, + -8, +-35, + 22, +-13, +-35, + 18, + -9, +-29, + 10, +-21, +-43, + 23, + -8, +-34, + 25, +-10, +-40, + 29, + -8, +-47, + 21, +-17, +-58, + 17, +-25, +-68, +-10, +-40, +-64, +-44, +-50, +-73, +-55, +-67, +-102, +-43, +-66, +-100, +-45, +-65, +-104, +-53, +-69, +-106, +-48, +-70, +-109, +-49, +-70, +-110, +-58, +-73, +-113, +-58, +-75, +-114, +-59, +-78, +-115, +-63, +-80, +-118, +-17, +-21, +-29, +-17, +-15, +-30, +-12, +-11, +-26, + -2, + -1, +-16, + 8, + 10, + 1, + 15, + 17, + 10, + 22, + 30, + 20, + 32, + 40, + 19, + 34, + 24, +-15, + 7, + -3, +-35, +-69, +-46, +-56, +-68, +-46, +-55, +-69, +-46, +-55, +-67, +-44, +-54, +-63, +-41, +-50, +-60, +-37, +-47, +-55, +-32, +-42, + 8, + 24, + 19, + -9, +-12, +-17, + -5, +-50, +-78, + 16, +-25, +-58, + 17, +-25, +-58, + 27, +-11, +-50, + 72, + 45, +-15, + 89, + 77, + 52, + 93, + 88, + 66, + 3, +-10, +-44, +-61, +-63, +-91, + 64, + 46, + -4, + 75, + 54, + 5, + 80, + 65, + 32, + 97, + 92, + 73, +104, +102, + 87, + 89, + 79, + 50, + 92, + 84, + 55, + 97, + 88, + 59, + 98, + 94, + 75, +107, +104, + 88, +107, +104, + 89, + 30, + 22, + -7, + 93, + 83, + 46, +105, + 99, + 75, +108, +102, + 74, +100, + 96, + 74, + 40, + 9, +-32, + 41, + -6, +-62, + 92, + 81, + 54, + 66, + 58, + 30, + 44, + 47, + 14, + 56, + 57, + 19, + 61, + 58, + 18, + 76, + 70, + 36, + 73, + 68, + 35, + 76, + 72, + 44, + 70, + 61, + 30, + 52, + 20, +-27, + 62, + 28, +-14, + 61, + 42, + 17, + 71, + 59, + 43, + 69, + 57, + 41, + 66, + 53, + 38, + 67, + 55, + 39, + 58, + 46, + 30, + 27, + 18, + 3, +-92, +-124, +-126, + 23, +-11, +-46, + 20, +-30, +-86, + 51, + 33, + 24, + 13, +-42, +-128, + 13, +-40, +-112, + 16, +-31, +-92, + 9, +-36, +-87, +-28, +-72, +-106, + 23, +-21, +-66, + 4, +-43, +-91, + -7, +-60, +-99, +-20, +-59, +-84, + 1, +-40, +-66, + -1, +-40, +-78, + 4, +-26, +-50, + -7, +-18, +-39, + 6, + 1, +-22, + 1, + 0, +-21, + 2, + 1, +-23, + 0, + 2, +-23, + -3, + 1, +-21, + 2, + 4, +-16, + -2, + 0, +-21, +-12, +-10, +-31, +-28, +-28, +-50, +-35, +-35, +-58, +-47, +-48, +-75, +-52, +-57, +-86, +-62, +-70, +-102, +-63, +-74, +-110, + 37, + 40, + 36, + 34, + 32, + 14, +-30, +-31, +-53, +-35, +-32, +-49, +-32, +-28, +-40, +-32, +-26, +-32, +-27, +-20, +-24, + -5, + 1, + -5, + 9, + 15, + 9, + 30, + 30, + 4, + 44, + 39, + 14, + 17, + 26, + 11, + 20, + 29, + 14, + 20, + 29, + 16, + 14, + 25, + 14, + 4, + 16, + 5, +-12, + 2, + -8, +-51, +-31, +-40, + 2, + 18, + 12, + -8, +-12, +-16, + -5, +-51, +-79, + 12, +-30, +-63, + 10, +-29, +-64, + 34, + 2, +-41, + 59, + 28, +-28, + 73, + 54, + 15, + 91, + 85, + 66, + 36, + 20, +-15, + 23, + 10, +-33, + 40, + 20, +-41, + 68, + 48, + -3, + 74, + 55, + 16, + 78, + 66, + 40, + 82, + 75, + 56, + 77, + 64, + 37, + 83, + 68, + 31, + 87, + 78, + 43, + 95, + 88, + 65, +108, +105, + 84, + 99, + 95, + 77, + 50, + 47, + 33, + 79, + 67, + 33, + 95, + 87, + 55, +100, + 93, + 60, + 76, + 70, + 44, + 4, +-23, +-53, + 40, + 13, +-16, + 50, + 41, + 31, + 71, + 59, + 38, + 41, + 37, + -6, + 18, + 22, +-19, + 36, + 35, +-17, + 64, + 52, + 8, + 64, + 53, + 18, + 77, + 48, + 17, + 80, + 59, + 30, + 78, + 52, + 25, + 70, + 42, + 7, + 53, + 30, + 2, + 65, + 51, + 32, + 65, + 51, + 33, + 62, + 48, + 31, + 68, + 55, + 39, + 44, + 30, + 13, + 11, + 0, +-13, +-95, +-124, +-125, + 22, +-23, +-75, + 26, +-25, +-77, + 47, + 32, + 29, + 10, +-45, +-127, + 12, +-41, +-112, + 25, +-26, +-91, + 11, +-36, +-88, +-21, +-69, +-104, + 12, +-35, +-84, + 15, +-34, +-95, +-20, +-74, +-120, +-47, +-91, +-125, + -7, +-60, +-118, + 10, +-31, +-79, + 33, + 17, + 1, + 31, + 33, + 30, + 44, + 45, + 46, + 6, + 8, + 3, + -5, + -2, +-16, +-13, +-11, +-31, +-12, +-11, +-32, +-17, +-16, +-38, +-19, +-18, +-38, +-21, +-19, +-38, +-37, +-34, +-56, +-44, +-43, +-65, +-50, +-51, +-78, +-48, +-51, +-80, +-56, +-62, +-93, + -5, + -6, +-12, + 51, + 49, + 39, + -3, + -7, +-30, +-71, +-64, +-72, +-79, +-71, +-77, +-75, +-66, +-76, +-58, +-49, +-60, +-37, +-28, +-38, +-11, + -2, +-15, + 12, + 23, + 8, + 36, + 46, + 28, + 46, + 54, + 37, + 53, + 60, + 43, + 56, + 63, + 47, + 57, + 66, + 50, + 59, + 69, + 59, + 62, + 72, + 64, + 62, + 72, + 64, + 55, + 65, + 59, + 38, + 51, + 45, +-14, +-17, +-20, +-23, +-67, +-92, + -7, +-46, +-77, + -7, +-44, +-77, + 2, +-32, +-64, + 14, +-15, +-57, + 29, + 7, +-29, + 40, + 19, +-21, + 0, +-32, +-68, +-58, +-69, +-87, + 56, + 38, +-14, + 97, + 91, + 63, + 86, + 81, + 51, + 31, + 24, +-12, +-46, +-46, +-76, + 49, + 42, + 17, + 89, + 75, + 44, + 95, + 90, + 68, +103, +100, + 87, + 97, + 93, + 70, + 88, + 86, + 69, +-14, +-16, +-24, + 19, + 12, +-13, + 63, + 59, + 37, + 72, + 69, + 52, + -4, + -9, +-18, +-98, +-114, +-120, +-72, +-81, +-79, +-13, +-28, +-27, + 51, + 18, + -4, + 7, + 9, +-35, + 23, + 25, +-27, + 32, + 32, +-19, + 55, + 45, + -2, + 4, + 2, +-28, + 71, + 45, + 23, + 55, +-21, +-45, + 17, +-17, +-41, + 21, + -1, +-40, + 21, + 9, + -2, + 28, + 18, + 12, + 1, + -6, + -8, + 12, + 0, + -9, + -2, +-23, +-41, + 17, + -6, +-26, + 8, +-11, +-30, +-101, +-124, +-124, + 18, +-29, +-80, + 30, + -7, +-38, + 39, + 20, + 18, + 8, +-45, +-125, + 12, +-36, +-88, + 13, +-30, +-72, + 2, +-41, +-80, +-21, +-69, +-107, + -1, +-45, +-79, + 22, +-22, +-68, +-37, +-88, +-127, +-48, +-92, +-121, +-14, +-61, +-116, + 5, +-35, +-80, + 29, + 19, + 10, + 33, + 34, + 36, + 62, + 63, + 67, + 21, + 23, + 20, + 16, + 17, + 6, + 17, + 15, + -1, + 0, + 3, +-12, + 1, + 1, +-16, + -8, + -5, +-26, +-11, + -9, +-30, +-17, +-18, +-41, +-35, +-37, +-63, +-48, +-53, +-83, +-56, +-65, +-95, +-52, +-61, +-91, + 17, + 13, + 10, + 11, + 10, + -2, + -2, +-10, +-29, +-25, +-16, +-40, +-11, + -1, +-28, + 1, + 13, +-15, + 10, + 22, + -4, + 16, + 27, + 2, + 20, + 30, + 4, + 22, + 33, + 10, + 29, + 39, + 18, + 27, + 39, + 19, + 35, + 45, + 27, + 49, + 58, + 41, + 54, + 65, + 48, + 58, + 69, + 58, + 53, + 64, + 56, + 53, + 62, + 57, + 58, + 67, + 62, + 59, + 66, + 61, +-12, +-16, +-19, +-50, +-97, +-123, +-57, +-101, +-126, +-61, +-106, +-125, +-61, +-105, +-126, +-57, +-102, +-126, +-55, +-94, +-112, +-46, +-76, +-92, +-61, +-103, +-121, +-20, +-64, +-105, + 42, + 30, + -8, + 78, + 64, + 16, + 79, + 67, + 20, + 18, + 1, +-59, +-109, +-95, +-118, + -9, +-15, +-51, + 37, + 17, +-23, + 54, + 39, + 8, + 58, + 53, + 37, + 42, + 38, + 19, + 30, + 30, + 23, +-72, +-76, +-84, +-101, +-82, +-117, +-97, +-87, +-123, +-63, +-104, +-108, +-52, +-93, +-98, +-55, +-96, +-94, +-54, +-87, +-83, +-32, +-52, +-50, + -9, +-42, +-55, + 11, + 11, +-10, + 2, + 6, +-12, + 31, + 29, + 10, + 38, + 33, + 4, + 38, + 31, + -7, + 50, + 26, +-18, + 72, + 38, + -5, +-74, +-37, +-80, +-18, + -5, +-42, +-50, +-95, +-120, +-53, +-97, +-120, +-58, +-100, +-121, +-51, +-88, +-99, +-23, +-41, +-43, +-35, +-57, +-56, +-52, +-74, +-72, +-99, +-117, +-117, + 6, +-37, +-83, + 15, +-18, +-48, + 25, + -6, +-19, + 3, +-51, +-127, + 15, +-32, +-85, + 27, +-14, +-63, + -3, +-43, +-83, +-25, +-70, +-108, +-32, +-69, +-91, + 13, +-28, +-70, +-46, +-82, +-104, +-50, +-92, +-120, +-15, +-62, +-114, +-60, +-103, +-124, + 10, + 6, + -2, + 28, + 29, + 23, + 78, + 79, + 81, + 43, + 44, + 41, + 36, + 39, + 25, + 9, + 14, + 2, + 6, + 5, +-10, + 4, + 7, + -6, + 27, + 27, + 17, + 2, + 4, + -2, +-15, +-13, +-30, +-16, +-23, +-49, +-39, +-51, +-82, +-48, +-60, +-88, +-68, +-77, +-98, +-45, +-47, +-52, +-27, +-30, +-42, +-49, +-57, +-75, + -2, + 8, +-22, + 2, + 12, +-21, + 8, + 18, +-16, + 12, + 22, +-12, + 16, + 26, + -7, + 20, + 31, + -2, + 22, + 33, + 1, + 28, + 38, + 8, + 34, + 44, + 14, + 37, + 45, + 21, + 34, + 46, + 23, + 43, + 55, + 37, + 39, + 53, + 41, + 47, + 58, + 51, + 60, + 68, + 64, + 59, + 65, + 61, + 59, + 64, + 60, +-12, +-14, +-19, +-31, +-76, +-114, +-12, +-61, +-116, + -5, +-56, +-112, +-13, +-61, +-114, + -1, +-45, +-89, + 3, +-40, +-80, + 2, +-37, +-77, + -1, +-40, +-79, +-29, +-67, +-97, +-11, +-21, +-54, + 67, + 49, + -2, + 56, + 43, + 0, + 66, + 50, + 1, + 72, + 64, + 26, + 76, + 69, + 27, + 55, + 53, + 31, +-76, +-63, +-98, +-32, + -7, +-89, +-76, +-54, +-113, +-107, +-82, +-117, +-68, +-67, +-69, +-98, +-76, +-116, +-48, +-47, +-50, +-20, +-25, +-21, +-41, +-51, +-51, +-16, +-25, +-22, +-32, +-42, +-38, +-48, +-63, +-61, +-53, +-65, +-68, + 59, + 57, + 57, + 74, + 73, + 76, + 97, + 97, + 99, + 59, + 56, + 52, + 6, + -6, +-19, + 1, +-19, +-71, + 26, + -7, +-60, + -2, +-14, +-43, + 35, + 24, + 5, +106, +106, +106, +104, +105, +106, +103, +103, +104, +100, +100, +102, + 94, + 95, +100, + 85, + 87, + 93, + 71, + 74, + 83, +-60, +-61, +-60, + 75, + 77, + 86, + 68, + 72, + 80, + 63, + 67, + 76, + 59, + 60, + 71, + 53, + 56, + 64, + 40, + 43, + 52, + 19, + 12, + 17, +-18, +-56, +-81, + 17, + 7, + 5, + 19, + 4, + 3, + 16, + 1, + -6, +-22, +-43, +-56, +-10, +-48, +-79, + -2, +-40, +-76, +-10, +-41, +-82, + 9, + 5, + -7, + 67, + 69, + 69, + 57, + 59, + 57, + 45, + 47, + 43, + 47, + 46, + 37, + 19, + 19, + 9, + 17, + 21, + 12, + 24, + 21, + 8, + 39, + 39, + 30, + 1, + -6, +-26, +-47, +-64, +-97, +-36, +-55, +-89, +-52, +-64, +-92, +-54, +-70, +-99, +-63, +-70, +-94, +-69, +-81, +-114, +-90, +-103, +-122, + 6, + 16, +-17, + 12, + 22, +-11, + 15, + 25, + -9, + 19, + 28, + -8, + 25, + 33, + -2, + 26, + 35, + 0, + 27, + 37, + 3, + 28, + 37, + 5, + 28, + 37, + 4, + 30, + 39, + 11, + 28, + 38, + 13, + 16, + 29, + 10, + 43, + 52, + 42, + 51, + 60, + 52, + 57, + 63, + 57, + 56, + 61, + 57, + 50, + 55, + 51, +-19, +-19, +-23, + 21, + -7, +-39, + 53, + 19, +-20, + 44, + 2, +-32, + 41, + 7, +-27, + 46, + 21, + -7, + 57, + 27, + 6, + 60, + 35, + 11, + 35, + 7, +-16, +-20, +-45, +-72, +-31, +-53, +-95, + 5, + -5, +-36, + 59, + 49, + 18, + 57, + 51, + 19, + 60, + 52, + 23, + 36, + 35, + 21, + 2, + 4, + -3, +-99, +-86, +-114, +-36, +-15, +-78, +-26, + -2, +-86, +-38, +-28, +-48, + 32, + 31, + 32, + 46, + 45, + 46, + 48, + 47, + 47, + 53, + 51, + 52, + 57, + 55, + 56, + 58, + 57, + 57, + 62, + 61, + 61, + 58, + 57, + 58, + 68, + 67, + 67, + 70, + 66, + 59, + 91, + 90, + 84, +105, +104, + 99, + 49, + 46, + 36, +-11, +-23, +-28, +-65, +-92, +-120, +-62, +-83, +-117, +-11, +-42, +-84, + 63, + 38, + 19, + 91, + 90, + 95, + 86, + 85, + 91, + 93, + 92, + 98, + 96, + 95, +102, + 99, +100, +106, +100, +101, +109, + 99, +100, +108, +-28, +-28, +-28, + 95, +100, +110, + 87, + 92, +106, + 81, + 87, +102, + 82, + 87, +102, + 78, + 83, + 98, + 78, + 82, + 97, + 52, + 52, + 58, + -6, +-31, +-40, + 72, + 76, + 89, + 64, + 66, + 81, + 61, + 64, + 78, + 50, + 52, + 66, + 42, + 42, + 54, + 38, + 35, + 43, + 26, + 23, + 22, + 4, + 5, + 4, +-27, +-26, +-29, + 23, + 23, + 20, + 50, + 51, + 49, + 56, + 57, + 54, + 41, + 42, + 39, + 44, + 46, + 40, + 39, + 40, + 33, + 35, + 34, + 25, +-21, +-36, +-66, +-39, +-60, +-97, +-49, +-66, +-99, +-51, +-68, +-104, +-58, +-74, +-109, +-77, +-90, +-118, +-85, +-95, +-122, +-68, +-87, +-118, + 16, + 25, + -4, + 15, + 24, + -5, + 19, + 28, + -4, + 23, + 31, + -2, + 25, + 33, + -1, + 33, + 41, + 7, + 32, + 41, + 8, + 30, + 40, + 8, + 35, + 43, + 14, + 18, + 27, + 0, + 8, + 18, + -4, + 27, + 36, + 18, + 47, + 54, + 44, + 48, + 54, + 47, + 55, + 61, + 55, + 27, + 33, + 29, + 10, + 19, + 14, +-23, +-24, +-27, + 47, + 22, + 0, + 79, + 50, + 28, + 72, + 49, + 27, + 68, + 49, + 24, + 88, + 60, + 27, + 88, + 59, + 30, + 47, + 18, +-14, +-32, +-55, +-81, +-38, +-60, +-106, +-34, +-56, +-98, +-31, +-53, +-97, +-17, +-32, +-55, + -7, +-11, +-18, +-15, +-14, +-18, +-100, +-100, +-123, +-61, +-56, +-75, +-23, +-22, +-40, +-78, +-65, +-118, +-53, +-48, +-70, + 0, + 2, + -1, + 51, + 51, + 52, + 61, + 61, + 63, + 56, + 56, + 58, + 58, + 58, + 61, + 61, + 61, + 63, + 65, + 65, + 66, + 68, + 68, + 70, + 46, + 46, + 47, + 73, + 73, + 72, + 68, + 63, + 50, +107, +104, + 96, + 92, + 90, + 80, + 65, + 62, + 55, +-39, +-44, +-74, +-36, +-27, +-80, + 26, + 10, +-36, + 79, + 30, +-10, + 71, + 40, + 29, + 98, + 94, +101, + 92, + 90, + 98, + 95, + 93, +103, + 95, + 95, +103, + 90, + 89, + 98, + 97, + 96, +103, + 87, + 85, + 95, + 39, + 37, + 43, + 58, + 52, + 56, + 80, + 77, + 86, + 81, + 81, + 93, + 75, + 75, + 88, + 78, + 77, + 92, + 81, + 81, + 95, + 58, + 57, + 65, + 20, + 10, + 14, + 48, + 50, + 65, + 68, + 68, + 90, + 60, + 63, + 85, + 54, + 56, + 77, + 63, + 64, + 82, + 60, + 62, + 75, + 55, + 55, + 61, + 19, + 22, + 16, + -9, + -8, +-17, +-65, +-69, +-81, +-59, +-61, +-71, +-16, +-17, +-21, + 32, + 33, + 32, + 50, + 48, + 45, + 59, + 59, + 57, + 27, + 26, + 17, +-28, +-45, +-77, +-49, +-61, +-93, +-51, +-65, +-99, +-56, +-70, +-104, +-36, +-42, +-63, + 6, + 5, + -9, + 20, + 21, + 4, + 11, + 11, + -5, + 31, + 40, + 20, + 32, + 40, + 17, + 33, + 40, + 14, + 39, + 46, + 20, + 39, + 46, + 18, + 36, + 44, + 16, + 36, + 44, + 17, + 23, + 32, + 6, + 5, + 13, +-11, + 14, + 22, + -2, + 20, + 27, + 4, + 30, + 35, + 17, + 41, + 47, + 34, + 38, + 44, + 37, + 5, + 12, + 7, + 34, + 40, + 36, + 30, + 39, + 33, +-18, +-21, +-24, + 59, + 43, + 31, + 79, + 70, + 57, + 75, + 70, + 59, + 93, + 85, + 75, + 99, + 83, + 68, + 47, + 33, + 18, +-34, +-57, +-84, +-43, +-65, +-111, +-41, +-63, +-111, +-40, +-63, +-105, +-37, +-59, +-106, +-40, +-62, +-110, + 28, + 25, + 23, +-78, +-79, +-116, +-73, +-63, +-118, +-44, +-41, +-68, +-27, +-30, +-45, +-51, +-46, +-78, +-40, +-47, +-58, +-53, +-59, +-53, +-49, +-55, +-49, +-38, +-46, +-39, +-44, +-50, +-46, +-39, +-47, +-42, +-35, +-43, +-38, +-35, +-42, +-38, +-32, +-39, +-37, +-40, +-47, +-47, + -2, + -8, +-10, + 88, + 82, + 68, +107, +103, + 91, + 85, + 80, + 65, + 49, + 43, + 34, + -8, +-35, +-62, + 19, + -1, +-34, + 30, + 14, +-18, + 47, + 16, +-21, + 65, + 50, + 40, +109, +108, +109, +109, +109, +110, +102, +101, +102, +103, +102, +103, +104, +103, +105, +104, +104, +105, + 99, + 98, +101, + 93, + 91, + 97, + 87, + 86, + 92, + 79, + 77, + 85, + 80, + 80, + 91, + 77, + 76, + 86, + 79, + 78, + 86, + 79, + 78, + 83, + 82, + 81, + 87, + 89, + 87, + 93, + 79, + 78, + 84, + 70, + 65, + 68, + 64, + 53, + 51, + 72, + 68, + 73, + 78, + 74, + 74, + 76, + 71, + 74, + 83, + 79, + 78, + 2, + 3, + -8, + 24, + 27, + 15, + 9, + 10, + 4, +-19, +-18, +-27, +-45, +-44, +-53, +-79, +-78, +-88, +-57, +-59, +-66, +-14, +-14, +-15, + 9, + 8, + 2, +-40, +-56, +-89, + -9, +-12, +-32, + 20, + 20, + 3, + 42, + 43, + 22, + 55, + 57, + 37, + 60, + 59, + 42, + 62, + 61, + 41, + 63, + 62, + 42, + 46, + 55, + 40, + 48, + 56, + 42, + 44, + 53, + 35, + 43, + 52, + 33, + 43, + 52, + 31, + 37, + 46, + 24, + 15, + 26, + 4, + 17, + 24, + 2, + 19, + 26, + 1, + 14, + 20, + -2, + 25, + 30, + 8, + 29, + 33, + 18, + 18, + 25, + 13, + 8, + 17, + 11, + 48, + 53, + 48, + 54, + 59, + 55, + 27, + 36, + 31, + 10, + 14, + 8, + 50, + 43, + 36, + 88, + 84, + 77, + 90, + 82, + 73, + 92, + 81, + 68, + 38, + 27, + 22, +-41, +-65, +-94, +-46, +-69, +-110, +-44, +-67, +-108, +-44, +-67, +-108, +-42, +-65, +-106, +-43, +-65, +-111, +-48, +-71, +-119, +-42, +-48, +-55, +-86, +-88, +-105, +-59, +-59, +-63, +-28, +-24, +-37, +-18, +-19, +-35, +-29, +-35, +-58, +-89, +-94, +-107, +-100, +-108, +-112, +-86, +-98, +-102, +-78, +-90, +-95, +-75, +-90, +-95, +-72, +-87, +-92, +-68, +-83, +-88, +-67, +-79, +-85, +-67, +-79, +-84, +-62, +-73, +-79, + -8, +-16, +-27, + 83, + 74, + 57, +102, + 97, + 84, + 74, + 65, + 51, + 40, + 31, + 19, + 26, + -8, +-39, + 46, + 7, +-29, + 41, + 0, +-39, + 52, + 12, +-33, + 80, + 58, + 41, +110, +106, +104, +104, +102, + 99, +101, + 98, + 97, + 99, + 97, + 95, +103, +102, +102, +106, +103, +103, +103, +102, +102, + 99, + 98, + 98, + 98, + 96, + 99, + 91, + 90, + 96, + 90, + 89, + 97, + 85, + 83, + 91, + 84, + 82, + 87, + 90, + 88, + 92, + 90, + 86, + 85, + 90, + 87, + 90, + 92, + 89, + 90, + 86, + 82, + 83, + 87, + 82, + 80, + 86, + 80, + 74, + 92, + 81, + 72, + 93, + 81, + 73, +102, + 96, + 94, + 16, + 18, + 9, + 14, + 16, + 1, + 7, + 9, + -2, + 7, + 10, + 2, + 32, + 34, + 30, + 11, + 15, + 11, +-21, +-20, +-27, +-54, +-53, +-66, +-30, +-30, +-40, + 45, + 47, + 31, + 53, + 55, + 40, + 46, + 49, + 28, + 44, + 47, + 25, + 58, + 55, + 36, + 73, + 63, + 40, + 69, + 60, + 36, + 70, + 61, + 38, + 47, + 60, + 48, + 50, + 62, + 53, + 50, + 62, + 53, + 42, + 55, + 43, + 21, + 35, + 20, + 13, + 25, + 8, + 16, + 25, + 8, + 20, + 27, + 6, + 28, + 34, + 11, + 14, + 19, + -3, + 29, + 32, + 12, + -3, + 4, + -9, + 15, + 22, + 15, + 49, + 55, + 48, + 49, + 54, + 49, + 33, + 41, + 36, + 38, + 45, + 41, + 42, + 48, + 41, + 57, + 44, + 28, + 99, + 80, + 59, + 97, + 82, + 66, + 37, + 21, + 8, +-41, +-67, +-91, +-43, +-66, +-106, +-43, +-66, +-106, +-47, +-69, +-110, +-47, +-70, +-111, +-47, +-70, +-112, +-51, +-75, +-118, +-53, +-78, +-121, +-76, +-92, +-113, +-116, +-121, +-123, +-120, +-121, +-124, +-114, +-119, +-124, +-61, +-64, +-58, +-110, +-118, +-125, +-111, +-119, +-125, +-106, +-114, +-124, +-90, +-104, +-121, +-82, +-97, +-112, +-75, +-92, +-109, +-70, +-86, +-104, +-67, +-81, +-98, +-65, +-78, +-91, +-60, +-73, +-86, +-47, +-61, +-73, + -1, +-14, +-32, + 55, + 44, + 26, + 82, + 74, + 58, + 51, + 39, + 22, + 39, + 28, + 16, + 89, + 83, + 76, +112, +108, +102, + 28, + -6, +-25, + 24, +-18, +-55, + 70, + 48, + 32, +112, +109, +110, +104, +103, +104, +107, +105, +105, +112, +111, +111, +105, +104, +105, +103, + 98, +101, +105, +103, +103, +102, +101, +100, + 96, + 95, + 94, + 96, + 93, + 92, + 90, + 84, + 83, + 92, + 87, + 86, + 95, + 92, + 89, + 90, + 82, + 76, + 91, + 84, + 78, + 95, + 90, + 89, + 96, + 94, + 94, + 95, + 92, + 97, + 93, + 91, + 95, + 98, + 94, + 98, + 94, + 88, + 92, + 96, + 93, + 95, + 98, + 87, + 84, + 9, + 11, + 1, + 1, + 2, +-14, + 1, + 3, + -9, + -3, + -1, +-14, + 38, + 39, + 36, + 46, + 47, + 45, + 32, + 34, + 30, + 16, + 19, + 11, + 56, + 58, + 44, + 47, + 49, + 34, + 37, + 40, + 20, + 45, + 47, + 26, + 40, + 44, + 25, + 53, + 50, + 31, + 59, + 45, + 17, + 52, + 46, + 23, + 52, + 39, + 9, + 55, + 22, +-13, + 40, + 36, + 23, + 39, + 50, + 42, + 38, + 49, + 42, + 34, + 47, + 37, + 23, + 33, + 17, + 19, + 27, + 9, + 26, + 30, + 14, + 26, + 31, + 11, + 14, + 20, + -2, +-15, + -7, +-23, + 23, + 30, + 20, + 46, + 52, + 45, + 46, + 53, + 48, + 26, + 36, + 29, + 42, + 48, + 42, + 46, + 51, + 46, + 40, + 45, + 39, + 62, + 53, + 41, + 94, + 75, + 53, + 59, + 41, + 23, +-24, +-61, +-97, +-70, +-89, +-112, +-69, +-87, +-112, +-75, +-91, +-114, +-75, +-92, +-115, +-79, +-96, +-117, +-82, +-98, +-119, +-90, +-105, +-121, +-91, +-106, +-122, +-98, +-111, +-122, +-109, +-119, +-124, +-108, +-118, +-123, +-106, +-116, +-124, +-97, +-104, +-110, +-104, +-115, +-123, +-100, +-113, +-122, +-98, +-110, +-121, +-92, +-107, +-119, +-88, +-104, +-117, +-85, +-99, +-114, +-83, +-98, +-113, +-79, +-92, +-109, +-74, +-87, +-102, +-71, +-83, +-95, +-64, +-76, +-87, +-41, +-53, +-64, +-25, +-35, +-46, +-10, +-19, +-31, + 8, +-29, +-47, +-14, +-35, +-48, +100, +100, + 99, +116, +113, +110, + 1, +-41, +-70, + 21, + -5, +-22, + 65, + 50, + 39, +111, +108, +106, +105, +101, + 96, +109, +108, +107, +110, +107, +105, +109, +107, +106, +106, +104, +102, +106, +104, +102, +102, +100, + 99, + 97, + 94, + 90, + 92, + 87, + 84, + 92, + 88, + 86, + 99, + 98, +100, + 99, + 98, +102, + 92, + 88, + 88, + 92, + 89, + 87, + 90, + 86, + 82, + 94, + 92, + 90, + 98, + 95, + 96, + 93, + 89, + 90, + 99, + 94, + 96, +100, + 93, + 94, + 98, + 92, + 92, + 78, + 75, + 75, +-24, +-40, +-64, + -2, + -5, +-21, + 8, + 10, + -5, +-16, +-18, +-40, + 16, + 18, + 12, + 40, + 41, + 39, + 41, + 42, + 38, + 37, + 40, + 25, + 53, + 56, + 38, + 50, + 52, + 36, + 20, + 22, + 1, + 3, + 5, +-21, + 14, + 2, +-27, + 15, + 6, +-23, + 35, + 16, +-20, + 27, + 12, +-22, + 37, + 14, +-24, + 26, + -6, +-40, + 49, + 15, +-26, + 51, + 15, +-26, + 56, + 29, + -3, + 40, + 23, + -1, + 19, + 11, +-11, + 21, + 24, + 3, + 28, + 32, + 15, + -3, + 5, +-10, +-11, + 0, +-12, + 32, + 38, + 24, + 44, + 49, + 39, + 43, + 49, + 44, + 26, + 36, + 29, + 43, + 47, + 41, + 45, + 49, + 44, + 43, + 48, + 43, + 40, + 45, + 39, + 63, + 61, + 53, + 89, + 85, + 80, + 31, + 5, +-12, + 6, +-37, +-80, +-92, +-107, +-121, +-91, +-106, +-120, +-93, +-107, +-120, +-92, +-108, +-121, +-98, +-113, +-122, +-100, +-115, +-124, +-101, +-116, +-123, +-102, +-116, +-124, +-101, +-115, +-123, +-101, +-114, +-122, +-101, +-112, +-121, +-93, +-107, +-117, +-90, +-104, +-114, +-92, +-106, +-116, +-92, +-106, +-116, +-90, +-104, +-114, +-91, +-105, +-115, +-89, +-102, +-112, +-92, +-103, +-113, +-96, +-108, +-118, +-96, +-108, +-118, +-92, +-104, +-111, +-87, +-96, +-102, +-90, +-98, +-105, +-93, +-103, +-108, +-86, +-98, +-104, +-84, +-98, +-105, + 44, + -1, +-68, +-18, +-55, +-77, +115, +114, +114, +110, +110, +110, + 6, +-32, +-52, + 12, +-21, +-47, + 80, + 72, + 65, +110, +105, +103, +111, +110, +107, +105, +101, + 96, +105, +103, + 97, +103, +101, + 98, +100, + 95, + 90, +108, +106, +105, +103, + 99, + 98, +103, +100, +101, + 99, + 97, +101, + 90, + 89, + 94, + 88, + 87, + 91, + 88, + 86, + 90, + 85, + 84, + 89, + 85, + 81, + 86, + 97, + 95, +100, + 96, + 90, + 90, + 95, + 90, + 88, +100, + 96, + 95, + 96, + 88, + 82, +100, + 94, + 88, +103, + 96, + 91, + 67, + 59, + 54, +-38, +-59, +-96, +-35, +-58, +-94, +-22, +-34, +-54, +-26, +-30, +-53, + 10, + 12, + -2, + 22, + 24, + 17, + 32, + 35, + 24, + 55, + 58, + 42, + 44, + 46, + 29, + 19, + 20, + -1, +-13, +-18, +-49, +-16, +-22, +-57, +-17, +-29, +-65, +-11, +-29, +-61, + 14, +-12, +-49, + 25, + -2, +-44, + 13, +-13, +-53, + 38, + -7, +-54, + 30, +-19, +-65, + 16, +-30, +-72, + 8, +-32, +-72, + 21, + -9, +-42, + 69, + 41, + 1, + 69, + 34, + -8, + 20, + 1, +-36, + 5, + 18, + 6, + 37, + 44, + 30, + 43, + 48, + 38, + 39, + 45, + 40, + 28, + 37, + 31, + 43, + 48, + 42, + 45, + 48, + 43, + 45, + 48, + 43, + 43, + 48, + 42, + 40, + 45, + 39, + 62, + 52, + 34, + 88, + 66, + 44, + 25, + -3, +-27, +-38, +-81, +-119, +-104, +-120, +-125, +-104, +-119, +-125, +-107, +-122, +-125, +-104, +-120, +-125, +-107, +-122, +-125, +-109, +-123, +-125, +-111, +-124, +-125, +-114, +-124, +-124, +-114, +-125, +-124, +-114, +-124, +-124, +-114, +-124, +-125, +-105, +-120, +-125, +-104, +-120, +-125, +-104, +-121, +-125, +-101, +-118, +-124, +-98, +-115, +-122, +-97, +-114, +-121, +-92, +-109, +-119, +-101, +-116, +-122, +-103, +-119, +-124, +-103, +-119, +-124, +-102, +-119, +-124, +-103, +-119, +-123, +-101, +-116, +-122, +-103, +-118, +-123, +-96, +-114, +-122, +-90, +-112, +-121, + 33, +-36, +-97, +-22, +-68, +-108, +114, +111, +108, +112, +106, + 98, + 70, + 53, + 39, + 9, +-33, +-66, + 84, + 71, + 58, +102, + 92, + 81, +107, +102, + 95, +109, +107, +105, +104, + 93, + 88, +103, + 93, + 87, +100, + 95, + 90, + 97, + 87, + 77, + 96, + 88, + 80, + 97, + 91, + 83, + 96, + 86, + 77, + 98, + 90, + 83, + 88, + 79, + 74, + 96, + 94, + 93, + 93, + 89, + 89, + 98, + 92, + 87, + 94, + 81, + 72, + 94, + 83, + 72, + 92, + 81, + 69, + 96, + 83, + 70, + 97, + 83, + 73, +100, + 95, + 90, + 99, + 87, + 79, + 69, + 55, + 44, +-55, +-80, +-115, +-43, +-67, +-109, +-41, +-63, +-102, +-39, +-61, +-101, +-24, +-39, +-61, + 24, + 26, + 9, + 10, + 16, + 1, + 16, + 19, + 5, + 29, + 29, + 14, + 29, + 23, + 3, +-25, +-31, +-63, +-39, +-47, +-79, +-48, +-54, +-81, +-31, +-50, +-85, +-19, +-52, +-89, +-30, +-53, +-85, +-12, +-43, +-80, + 48, + 3, +-45, + 45, + 0, +-47, + 43, + -2, +-50, + 50, + 4, +-43, + 37, + -9, +-56, + -7, +-50, +-88, + 61, + 32, + 0, + 98, + 72, + 32, + 45, + 38, + 15, + 42, + 48, + 39, + 30, + 38, + 32, + 29, + 38, + 32, + 46, + 51, + 46, + 46, + 51, + 45, + 45, + 49, + 43, + 44, + 49, + 43, + 42, + 47, + 42, + 39, + 44, + 38, + 59, + 55, + 46, + 87, + 71, + 56, + 65, + 48, + 39, +-60, +-98, +-115, +-71, +-96, +-113, +-60, +-73, +-80, + 16, + 8, + 0, + 41, + 30, + 22, + 60, + 53, + 49, + 27, + 24, + 21, +-123, +-126, +-126, + 61, + 50, + 40, + 58, + 42, + 19, + 63, + 56, + 43, + -2, +-34, +-65, +-48, +-61, +-71, +-65, +-92, +-126, +-60, +-89, +-126, +-60, +-91, +-125, +-27, +-50, +-85, +-41, +-78, +-117, +-62, +-94, +-126, +-69, +-83, +-110, +-73, +-85, +-105, +-86, +-89, +-102, +-84, +-89, +-101, + 3, + -2, + -9, + 53, + 48, + 44, + 55, + 47, + 36, + 57, + 47, + 34, +-25, +-36, +-42, +-19, +-59, +-90, +-20, +-50, +-72, +109, + 97, + 80, +101, + 82, + 63, + 96, + 71, + 48, + 4, +-38, +-71, + 88, + 79, + 72, + 99, + 92, + 84, + 82, + 72, + 66, + 81, + 76, + 72, + 85, + 78, + 76, + 93, + 81, + 80, + 79, + 71, + 69, + 77, + 67, + 64, + 91, + 86, + 82, + 94, + 85, + 79, + 96, + 89, + 82, + 94, + 81, + 66, + 92, + 74, + 56, + 88, + 69, + 51, + 89, + 72, + 55, + 92, + 78, + 61, + 91, + 65, + 46, + 93, + 78, + 64, + 93, + 85, + 78, + 97, + 89, + 84, + 95, + 87, + 85, + 89, + 76, + 72, + 81, + 76, + 72, + 59, + 47, + 43, +-52, +-77, +-110, +-51, +-76, +-114, +-47, +-72, +-115, +-48, +-76, +-115, +-47, +-71, +-110, + 30, + 27, + 12, + 28, + 24, + 2, + 33, + 18, + -9, + 21, + 6, +-19, + 37, + 15, +-24, + 10, +-16, +-53, +-17, +-40, +-79, +-50, +-62, +-93, +-59, +-70, +-96, +-40, +-64, +-103, +-56, +-79, +-114, +-57, +-79, +-108, + 33, +-17, +-62, + 39, + -9, +-56, + 41, + -6, +-52, + 47, + 2, +-46, + 45, + 2, +-49, + 39, + -8, +-56, + 15, +-31, +-75, +101, + 80, + 52, + 74, + 47, + 13, + 19, + 30, + 22, + 21, + 33, + 25, + 44, + 50, + 45, + 51, + 56, + 52, + 46, + 51, + 47, + 44, + 49, + 43, + 43, + 48, + 42, + 43, + 48, + 44, + 40, + 45, + 41, + 54, + 50, + 41, + 74, + 49, + 24, + 80, + 61, + 44, + 29, + 11, + -4, +-43, +-93, +-119, +-16, +-31, +-36, + 86, + 74, + 60, + 75, + 55, + 34, + 69, + 45, + 21, + 35, + 13, +-12, +-123, +-125, +-125, + 99, + 88, + 72, + 95, + 80, + 62, +103, + 97, + 92, +-14, +-42, +-71, +-69, +-102, +-125, +-57, +-90, +-126, +-60, +-91, +-126, +-63, +-97, +-126, +-42, +-65, +-93, +-39, +-71, +-103, +-65, +-98, +-126, +-72, +-90, +-123, +-61, +-78, +-103, +-66, +-74, +-87, +-45, +-53, +-65, + 54, + 50, + 42, + 91, + 71, + 55, + 88, + 61, + 35, + 88, + 63, + 40, + 5, +-23, +-39, +-11, +-68, +-103, +-41, +-81, +-103, + 79, + 72, + 67, + 78, + 65, + 50, + 94, + 73, + 54, + 7, +-37, +-77, + 88, + 69, + 46, + 90, + 73, + 56, + 88, + 69, + 51, + 89, + 74, + 60, + 93, + 77, + 60, + 89, + 72, + 59, + 92, + 81, + 65, + 87, + 75, + 65, + 85, + 65, + 43, + 75, + 59, + 45, + 81, + 62, + 39, + 81, + 68, + 52, + 81, + 65, + 47, + 77, + 64, + 54, + 75, + 73, + 71, + 76, + 71, + 66, + 75, + 62, + 50, + 85, + 78, + 67, + 85, + 64, + 42, + 84, + 64, + 41, + 90, + 75, + 60, + 97, + 79, + 62, + 88, + 73, + 60, + 50, + 36, + 22, +-51, +-77, +-113, +-55, +-81, +-113, +-53, +-76, +-112, +-58, +-86, +-116, +-62, +-90, +-120, + 34, + 31, + 16, + 40, + 28, + 5, + 48, + 38, + 11, + 30, + 29, + 11, + 36, + 24, + 1, + 23, + 11, +-14, + 9, +-11, +-44, +-27, +-41, +-68, +-73, +-83, +-109, +-21, +-42, +-83, +-35, +-49, +-85, +-28, +-51, +-86, + 12, +-14, +-41, + 11, +-25, +-55, + 0, +-44, +-82, + 37, +-12, +-58, + 43, + -3, +-51, + 46, + 0, +-49, + 39, + -9, +-56, + 67, + 32, + -3, + 95, + 67, + 35, + 18, + 22, + 11, + 31, + 40, + 34, + 46, + 52, + 48, + 53, + 57, + 55, + 48, + 53, + 49, + 43, + 48, + 43, + 42, + 47, + 41, + 43, + 48, + 44, + 44, + 48, + 47, + 50, + 51, + 44, + 77, + 54, + 33, + 82, + 60, + 41, + 61, + 39, + 16, +-33, +-83, +-109, + -2, +-24, +-35, + 92, + 79, + 64, + 92, + 82, + 72, + 91, + 80, + 65, + 56, + 47, + 37, +-122, +-124, +-124, + 25, + 16, + 6, + 42, + 20, + 2, + 37, + 17, + -4, +-44, +-55, +-64, +-42, +-48, +-57, +-37, +-43, +-55, +-37, +-43, +-60, +-39, +-48, +-64, +-26, +-36, +-57, +-27, +-40, +-62, +-38, +-48, +-63, +-32, +-38, +-50, +-19, +-22, +-23, + 4, + 3, + 5, + 24, + 22, + 21, + 37, + 26, + 23, +101, + 90, + 81, + 93, + 82, + 73, + 90, + 85, + 81, + -4, +-22, +-26, +-17, +-73, +-102, +-54, +-92, +-113, + 58, + 36, + 17, + 29, + 7, +-17, + 27, + 4, +-21, + 24, + -9, +-49, + 45, + 14, +-15, + 69, + 44, + 18, + 74, + 55, + 35, + 73, + 48, + 21, + 65, + 46, + 23, + 72, + 43, + 13, + 73, + 50, + 27, + 68, + 47, + 21, + 81, + 66, + 50, + 74, + 57, + 40, + 76, + 64, + 51, + 68, + 55, + 45, + 55, + 49, + 42, + 50, + 48, + 40, + 55, + 46, + 33, + 53, + 43, + 31, + 52, + 42, + 35, + 48, + 42, + 36, + 51, + 44, + 30, + 65, + 54, + 40, + 72, + 54, + 35, + 80, + 66, + 52, + 83, + 63, + 41, + 15, + -5, +-22, +-56, +-78, +-111, +-59, +-82, +-111, +-60, +-80, +-112, +-59, +-85, +-117, +-64, +-91, +-123, + 45, + 41, + 25, + 21, + 19, + -1, + 43, + 33, + 13, + 45, + 39, + 20, + 43, + 36, + 17, + 35, + 27, + 4, + 30, + 16, +-11, + 10, + -9, +-40, +-64, +-67, +-84, +-21, +-28, +-59, +-10, +-21, +-47, + -1, +-18, +-51, +-43, +-37, +-67, + 40, + 19, + -7, + 38, + 15, +-11, + 4, +-19, +-46, + 30, +-12, +-55, + 51, + 6, +-42, + 48, + 4, +-45, + 38, + -6, +-50, +103, + 75, + 41, + 25, + 14, + -7, + 33, + 42, + 37, + 47, + 53, + 48, + 54, + 58, + 56, + 48, + 53, + 50, + 42, + 47, + 41, + 41, + 46, + 41, + 42, + 47, + 43, + 43, + 47, + 46, + 47, + 39, + 30, + 63, + 39, + 19, + 73, + 52, + 32, + 75, + 51, + 25, +-22, +-70, +-100, + -4, +-40, +-60, + 81, + 58, + 35, + 79, + 57, + 33, + 84, + 62, + 39, + 68, + 48, + 27, +-102, +-118, +-124, +-74, +-100, +-125, +-70, +-98, +-124, +-73, +-101, +-123, + 8, + 6, + -3, + 26, + 23, + 13, + 22, + 18, + 8, + 18, + 14, + 3, + 9, + 6, + -5, + 0, + -3, +-13, +-18, +-21, +-31, +-18, +-21, +-33, + 1, + 0, + -5, + 34, + 33, + 32, + 64, + 64, + 63, + 81, + 78, + 77, +-30, +-40, +-41, +-28, +-32, +-37, +-34, +-42, +-53, +-75, +-83, +-108, +-51, +-86, +-109, +-18, +-68, +-94, +-68, +-90, +-100, + 64, + 45, + 25, + 58, + 27, + -2, + 54, + 17, +-19, + 11, +-32, +-66, + 20, +-22, +-61, + 62, + 21, +-23, + 60, + 14, +-29, + 75, + 41, + 3, + 76, + 41, + 2, + 74, + 42, + 0, + 75, + 41, + 2, + 78, + 50, + 18, + 63, + 26, + -6, + 73, + 39, + -1, + 70, + 36, + -5, + 67, + 35, + -2, + 65, + 36, + 3, + 68, + 50, + 34, + 58, + 39, + 17, + 51, + 43, + 29, + 49, + 40, + 28, + 62, + 43, + 28, + 70, + 46, + 19, + 63, + 38, + 14, + 63, + 34, + 5, + 61, + 32, + 2, + 59, + 25, + -4, +-29, +-51, +-71, +-58, +-76, +-107, +-73, +-92, +-115, +-58, +-79, +-110, +-64, +-89, +-120, +-64, +-93, +-122, + 31, + 26, + 13, + 29, + 19, + -7, + 40, + 28, + 6, + 34, + 32, + 16, + 46, + 34, + 12, + 41, + 38, + 20, + 38, + 26, + 3, + 21, + 17, + -5, +-36, +-42, +-57, + -5, +-18, +-49, + 2, + -2, +-28, + 10, + -3, +-32, +-46, +-34, +-77, +-47, +-36, +-69, + 28, + 14, +-11, + 39, + 19, + -6, + 8, +-27, +-63, + 46, + 1, +-48, + 47, + 2, +-48, + 42, + -3, +-51, + 93, + 68, + 36, + 29, + 11, +-13, + 34, + 42, + 37, + 40, + 46, + 42, + 53, + 57, + 55, + 46, + 51, + 47, + 39, + 44, + 39, + 41, + 47, + 42, + 42, + 46, + 44, + 13, + 9, + 5, + 3, +-10, +-36, + 22, + -9, +-34, + 40, + 8, +-10, + 58, + 41, + 30, +-55, +-76, +-85, +-16, +-28, +-37, + 77, + 55, + 31, + 74, + 51, + 26, + 72, + 41, + 4, + 63, + 32, + -4, +-110, +-123, +-124, + -2, +-22, +-44, +-81, +-107, +-127, +-71, +-95, +-111, + 4, + 1, + -2, + 33, + 30, + 23, + 30, + 28, + 19, + 24, + 22, + 15, + 12, + 10, + 3, + 0, + 0, + -8, +-18, +-19, +-26, +-17, +-20, +-27, + 14, + 14, + 15, + 45, + 43, + 46, + 67, + 64, + 67, + 58, + 55, + 54, +-23, +-24, +-21, +-76, +-83, +-95, +-64, +-79, +-108, + -2, +-37, +-66, +-22, +-47, +-68, +-12, +-44, +-64, +-67, +-97, +-108, + 55, + 9, +-37, + 39, +-11, +-62, + 34, +-16, +-65, + 36, +-14, +-67, + 66, + 21, +-27, + 76, + 37, + -8, + 76, + 35, + -4, + 62, + 26, + -5, + 67, + 36, + 2, + 65, + 28, + -4, + 76, + 47, + 20, + 62, + 41, + 17, + 68, + 44, + 18, + 71, + 46, + 22, + 77, + 49, + 14, + 73, + 46, + 13, + 68, + 34, + -8, + 61, + 23, +-18, + 52, + 16, +-16, + 63, + 37, + 9, + 62, + 38, + 10, + 61, + 34, + 4, + 54, + 20, +-10, + 58, + 24, +-11, + 45, + 19, +-10, + 41, + 16, + -5, + 31, + 14, + 2, + 1, +-15, +-24, +-53, +-67, +-78, +-71, +-86, +-110, +-78, +-96, +-121, +-66, +-91, +-118, +-67, +-91, +-119, + -5, +-13, +-30, + -3, +-13, +-40, + 16, + 8, +-14, + 27, + 18, + -7, + 25, + 18, + -5, + 28, + 22, + -1, + 35, + 25, + 1, + 35, + 30, + 13, +-42, +-40, +-51, + -1, +-19, +-50, + 8, + 2, +-21, + 18, + 4, +-23, +-30, +-24, +-66, +-31, +-24, +-65, +-49, +-36, +-76, +-53, +-40, +-74, +-31, +-53, +-83, + 42, + -4, +-53, + 47, + 2, +-47, + 42, + -4, +-53, + 73, + 44, + 13, + 51, + 28, + -4, + 35, + 42, + 37, + 30, + 37, + 32, + 51, + 54, + 54, + 42, + 49, + 45, + 38, + 47, + 42, + 40, + 47, + 43, + 14, + 17, + 10, + 9, +-17, +-40, + 22, +-19, +-43, + 24, +-13, +-39, + 14, + -1, +-31, + 22, + -8, +-37, +-34, +-50, +-70, + -5, +-29, +-45, + 78, + 50, + 16, + 74, + 46, + 16, + 65, + 27, + -9, + 60, + 20, +-20, +-102, +-123, +-124, + 15, + -4, +-36, +-88, +-111, +-126, +-73, +-95, +-120, + 28, + 28, + 36, + 19, + 19, + 30, + 20, + 20, + 29, + 17, + 17, + 26, + 15, + 15, + 23, + 2, + 2, + 11, +-19, +-17, + -9, +-42, +-41, +-34, +-23, +-22, +-14, + 16, + 17, + 25, + 39, + 40, + 46, + 49, + 49, + 54, +-29, +-30, +-24, +-79, +-87, +-109, + 4, +-31, +-69, + 59, + 18, +-24, +-27, +-61, +-93, +-23, +-55, +-81, +-67, +-97, +-111, + 77, + 37, +-13, + 58, + 11, +-35, + 49, + 1, +-54, + 46, + -5, +-66, + 53, + 8, +-48, + 65, + 26, +-20, + 62, + 23, +-18, + 57, + 26, +-15, + 56, + 23, +-15, + 66, + 23, +-11, + 70, + 27, + -5, + 48, + 28, + -3, + 61, + 40, + 10, + 76, + 54, + 29, + 66, + 38, + 10, + 72, + 45, + 15, + 62, + 26, +-12, + 65, + 34, + -2, + 48, + 8, +-31, + 56, + 21, +-17, + 49, + 15, +-20, + 45, + 14, +-17, + 31, + -2, +-29, + 24, + -6, +-33, + 35, + 10, +-12, + 40, + 21, + 3, + 33, + 14, + -2, + 18, + 2, + -9, + 0, +-14, +-26, +-43, +-54, +-75, +-71, +-94, +-113, +-69, +-91, +-119, +-66, +-92, +-114, +-14, +-19, +-27, +-27, +-24, +-34, +-29, +-32, +-47, +-40, +-36, +-48, +-28, +-26, +-43, + -7, +-14, +-33, + 20, + 7, +-19, + 13, + 6, + -9, +-75, +-76, +-86, + -2, + -7, +-33, + 9, + 5, +-20, + 21, + 8, +-20, + 27, + 9, +-23, +-17, +-17, +-55, +-20, +-14, +-56, +-28, +-21, +-60, +-54, +-60, +-90, + 41, + -5, +-53, + 47, + 2, +-47, + 40, + -7, +-55, + 54, + 23, + -8, + 65, + 41, + 9, + 30, + 37, + 32, + 25, + 33, + 27, + 47, + 52, + 49, + 39, + 45, + 42, + 38, + 46, + 42, + 21, + 22, + 16, + 24, + -4, +-39, + 20, +-17, +-54, + 35, + 3, +-34, + 34, + 0, +-41, + 37, + 4, +-32, + 26, +-13, +-57, +-31, +-64, +-92, +-25, +-59, +-85, + 42, + 1, +-44, + 58, + 18, +-29, + 66, + 37, + 2, + 67, + 38, + 6, +-104, +-120, +-124, +-97, +-113, +-118, +-84, +-95, +-108, +-83, +-92, +-112, +-67, +-66, +-54, +-64, +-61, +-42, +-67, +-62, +-47, +-57, +-57, +-43, +-54, +-54, +-45, +-72, +-68, +-59, +-80, +-77, +-67, +-92, +-91, +-83, +-85, +-83, +-75, +-66, +-65, +-56, +-49, +-49, +-39, +-53, +-54, +-41, +-17, +-19, +-15, +-82, +-93, +-112, + 50, + 7, +-45, + 66, + 27, +-20, + -7, +-34, +-62, +-28, +-75, +-111, +-70, +-93, +-103, + 65, + 36, + 0, + 63, + 24, +-19, + 67, + 23, +-28, + 60, + 12, +-45, + 67, + 20, +-38, + 64, + 22, +-26, + 72, + 29, +-28, + 47, + -4, +-56, + 72, + 36, +-13, + 58, + 14, +-34, + 68, + 26, +-15, + 68, + 35, + -8, + 57, + 24, +-12, + 52, + 9, +-37, + 65, + 32, + -9, + 57, + 23, +-18, + 48, + 15, +-24, + 46, + 11, +-24, + 47, + 14, +-16, + 46, + 27, + 5, + 42, + 34, + 21, + 38, + 25, + 8, + 37, + 13, + -9, + 46, + 22, + -1, + 27, + -5, +-33, + 34, + 10, +-16, + 27, + 0, +-24, + 23, + -2, +-25, + 11, +-13, +-34, + 23, + 2, +-16, + 2, +-26, +-52, +-53, +-78, +-102, +-63, +-83, +-113, +-19, +-22, +-31, + -2, +-13, +-41, + 9, + 6, +-17, + 24, + 11, +-14, + 9, + 5, +-10, + 17, + 4, +-19, + 0, + -2, +-19, + -3, + 0, + -6, +-44, +-46, +-57, + 5, +-10, +-36, + 15, + 9, +-14, + 24, + 12, +-14, + 4, + -6, +-34, + 45, + 23, + -7, + 22, + 8, +-23, + -2, + -6, +-41, +-51, +-53, +-82, + 41, + -3, +-50, + 50, + 6, +-40, + 35, +-13, +-61, + 43, + 9, +-21, + 75, + 50, + 22, + 26, + 32, + 26, + 32, + 39, + 34, + 33, + 42, + 36, + 33, + 41, + 37, + 19, + 21, + 14, + 10, +-20, +-54, + 17, +-14, +-51, + 25, +-14, +-58, + 26, + -8, +-47, + 21, +-19, +-61, + 36, + 2, +-39, + 44, + 10, +-31, +-15, +-51, +-81, +-36, +-67, +-92, + 36, + 7, +-35, + 17, +-10, +-51, + 12, +-14, +-51, + -2, +-23, +-51, +-116, +-123, +-124, +-113, +-124, +-125, +-11, + -8, + -7, + 33, + 35, + 36, + 35, + 37, + 38, + 37, + 39, + 40, + 38, + 41, + 42, + 38, + 40, + 41, + 37, + 39, + 39, + 37, + 39, + 39, + 40, + 41, + 42, + 41, + 43, + 42, + 38, + 39, + 39, + 22, + 24, + 27, + -9, + -8, + -9, +-13, +-12, +-14, + 11, + 9, + 8, +-90, +-103, +-119, + 1, +-16, +-47, + 16, + -6, +-43, +-13, +-47, +-82, +-25, +-70, +-103, +-68, +-96, +-107, + 26, + -7, +-49, + 23, + -1, +-42, + 26, + 5, +-29, + 50, + 23, +-18, + 51, + 17, +-25, + 72, + 35, + -9, + 73, + 39, + -4, + 63, + 23, +-22, + 61, + 20, +-31, + 53, + 14, +-29, + 54, + 11, +-39, + 53, + 14, +-29, + 52, + 13, +-30, + 65, + 37, + 3, + 55, + 27, + -3, + 53, + 25, + -5, + 46, + 26, + -1, + 35, + 22, + 0, + 22, + 10, +-11, + 12, + 2, +-18, + 23, + -2, +-27, + 23, + 7, +-15, + 15, + 2, +-14, + 13, + 2, +-13, + 24, + 12, + 0, + 32, + 16, + 5, + 19, + -3, +-20, + 27, + 8, +-11, + 28, + 9, + -8, + 13, +-14, +-35, + 17, + -3, +-20, + 0, +-29, +-54, +-31, +-64, +-95, +-11, +-15, +-25, + -2, + -8, +-34, + 9, + 0, +-22, + 19, + 9, +-12, + 25, + 17, + -6, + 19, + 12, +-10, + 15, + 8, +-12, + 19, + 5, +-22, + 22, + 6, +-23, + 0, + -3, +-25, + 10, + 6, +-17, + 24, + 12, +-12, +-57, +-44, +-81, + 8, + -3, +-28, + 51, + 28, + 3, + 56, + 34, + 8, + 8, +-10, +-35, + 38, + -6, +-50, + 51, + 9, +-38, + 34, +-13, +-60, + 36, + -5, +-40, + 86, + 61, + 32, + 17, + 21, + 16, + 33, + 38, + 36, + 16, + 25, + 17, + 24, + 29, + 24, + 8, +-19, +-56, + 28, + -3, +-43, + 10, +-27, +-73, + 31, + -5, +-45, + 28, + -9, +-46, + 35, + -3, +-43, + 32, + -5, +-46, + 37, + 0, +-44, +-16, +-48, +-80, +-38, +-68, +-92, + 30, + -7, +-49, + 3, +-25, +-58, +-51, +-72, +-95, +-109, +-122, +-125, +-117, +-123, +-124, +-114, +-123, +-122, +-111, +-108, +-75, +-87, +-98, +-56, +-70, +-89, +-53, +-34, +-65, +-47, +-27, +-57, +-46, +-34, +-66, +-48, +-37, +-71, +-54, +-50, +-82, +-57, +-48, +-76, +-56, +-56, +-82, +-56, +-86, +-97, +-56, +-102, +-109, +-73, +-115, +-115, +-94, +-119, +-118, +-104, +-107, +-116, +-112, +-99, +-113, +-124, +-99, +-112, +-124, + 13, + -9, +-38, + 12, +-19, +-50, +-34, +-73, +-99, +-53, +-73, +-88, + 44, + 18, +-23, + 59, + 22, +-23, + 52, + 14, +-27, + 60, + 19, +-27, + 62, + 14, +-38, + 66, + 24, +-24, + 58, + 18, +-25, + 53, + 14, +-28, + 56, + 17, +-32, + 51, + 9, +-36, + 50, + 8, +-38, + 65, + 30, +-11, + 51, + 14, +-25, + 54, + 24, + -9, + 51, + 18, +-15, + 52, + 20, +-14, + 43, + 14, +-14, + 39, + 13, + -9, + 30, + 0, +-27, + 33, + 14, +-10, + 18, + 5, +-19, + 3, + -7, +-29, + 5, + -8, +-25, + 23, + 12, + -7, + 37, + 21, + 3, + 30, + 10, +-10, + 22, +-12, +-38, + 31, + 7, +-15, + 26, + 5, +-17, + 27, + 6, +-13, + 9, +-17, +-39, + 15, +-13, +-37, + 2, +-33, +-64, + 20, + 11, + -6, + 10, + -4, +-27, + 4, + 2, +-15, + 23, + 15, + -7, + 26, + 18, + -1, + 24, + 19, + -1, + 31, + 19, + -5, + 22, + 16, + -3, + 29, + 17, + -7, + 13, + 14, + -7, + 15, + 8, +-16, + 24, + 10, +-14, +-61, +-46, +-82, +-44, +-33, +-71, +-13, +-15, +-42, + 44, + 28, + 3, + 17, + 0, +-23, + 29, +-13, +-53, + 50, + 9, +-36, + 46, + 1, +-44, + 23, +-24, +-67, + 89, + 64, + 34, + 6, + 11, + 3, + 30, + 38, + 35, + 8, + 13, + 4, + 20, + 0, +-27, + 22, + -9, +-44, + 31, + 2, +-32, + 26, + -3, +-40, + 32, + 3, +-35, + 29, + -3, +-43, + 8, +-38, +-87, + 27, +-15, +-63, + 21, +-24, +-78, +-30, +-67, +-106, +-48, +-85, +-111, + 6, +-29, +-75, + 11, +-27, +-76, + 38, + -3, +-56, + 43, + 5, +-44, + 24, +-20, +-68, + 25, +-28, +-84, + 63, + 10, +-72, + 50, + -7, +-80, + 45, + -5, +-61, + 53, + 2, +-57, + 46, + -1, +-47, + 50, + 14, +-20, + 37, + 5, +-26, + 46, + 9, +-25, + 48, + 4, +-28, + 45, + 0, +-39, + 46, + 7, +-34, + 33, + -3, +-40, + 27, +-17, +-58, + 12, +-35, +-76, + 2, +-46, +-90, +-25, +-68, +-105, +-53, +-96, +-124, +-77, +-110, +-124, +-32, +-60, +-97, +-45, +-77, +-102, +-79, +-87, +-94, + 68, + 30, +-17, + 51, + 9, +-37, + 50, + 7, +-42, + 41, + -7, +-60, + 47, + -1, +-57, + 40, + -8, +-60, + 51, + 7, +-41, + 50, + 14, +-25, + 67, + 36, + 2, + 59, + 21, +-18, + 61, + 24, +-10, + 48, + 14, +-21, + 64, + 38, + 4, + 40, + 5, +-28, + 44, + 3, +-37, + 45, + 4, +-38, + 43, + 2, +-40, + 40, + -1, +-42, + 40, + 10, +-26, + 36, + 8, +-19, + 42, + 13, +-17, + 46, + 25, + 0, + 36, + 15, +-10, + 37, + 10, +-17, + 37, + 9, +-19, + 30, + -3, +-38, + 24, +-12, +-44, + 27, + -2, +-30, + 22, +-10, +-39, + 12, +-23, +-51, + 28, + 7, +-11, + 25, + 2, +-18, + 18, + -7, +-27, + 26, + 17, + 2, + 9, + 2, +-18, + 9, + 10, + -7, + 22, + 11, +-10, + 16, + 9, + -9, + 23, + 16, + -7, + 22, + 17, + -6, + 29, + 20, + -2, + 30, + 18, + -5, + 15, + 5, +-19, + 10, + 5, +-18, + 20, + 6, +-18, +-63, +-49, +-86, +-61, +-44, +-78, +-23, +-16, +-53, +-28, +-18, +-55, +-30, +-28, +-55, + 17, +-20, +-57, + 50, + 10, +-33, + 50, + 9, +-35, + 21, +-24, +-68, + 87, + 58, + 25, + -2, + -2, +-12, + 23, + 25, + 23, +-20, +-31, +-50, +-10, +-33, +-59, + 15, +-16, +-44, + 12, +-22, +-51, + -3, +-30, +-62, + 11, +-14, +-46, + 28, + 0, +-35, + 38, + 8, +-32, + 30, + -8, +-56, + 27, +-13, +-60, +-22, +-58, +-101, +-40, +-75, +-98, + 20, +-27, +-83, + 21, +-27, +-84, + 26, +-21, +-83, + 12, +-37, +-92, +-18, +-52, +-85, +-26, +-55, +-93, + 34, +-10, +-66, + 50, + 13, +-33, + 42, + 4, +-39, + 55, + 22, +-12, + 44, + 5, +-29, + 24, +-16, +-51, + 30, + 0, +-35, + 35, + 0, +-33, + 48, + 9, +-20, + 35, + -3, +-34, + 37, + -2, +-37, + 38, + -3, +-35, + 49, + 12, +-21, + 49, + 10, +-29, + 55, + 20, +-18, + 57, + 15, +-32, + 46, + 2, +-42, + 28, +-15, +-58, + -4, +-44, +-85, +-40, +-70, +-99, +-62, +-73, +-91, + 45, + 2, +-44, + 45, + -3, +-50, + 54, + 12, +-36, + 49, + 8, +-39, + 62, + 30, + -9, + 63, + 29, +-10, + 53, + 14, +-17, + 36, + 1, +-30, + 31, + -1, +-30, + 32, + 2, +-27, + 39, + 6, +-20, + 37, + 10, +-17, + 24, + -1, +-26, + 43, + 17, + -8, + 58, + 33, + 8, + 59, + 33, + 6, + 51, + 23, + -5, + 51, + 22, +-11, + 47, + 11, +-26, + 36, + 2, +-32, + 25, +-15, +-50, + 24, +-18, +-60, + 31, + -9, +-49, + 30, + -6, +-42, + 24, +-13, +-50, + 27, +-10, +-45, + 32, + -1, +-36, + 31, + 6, +-17, + 37, + 13, + -9, + 44, + 29, + 15, + 17, + 2, +-13, + -9, +-28, +-40, + 9, +-13, +-25, + 15, + 1, +-10, + 11, + 6, +-12, + 13, + 6, +-14, + 14, + 8, +-10, + 18, + 12, + -7, + 11, + 9, + -8, + 13, + 9, +-12, + 16, + 8, +-13, + 21, + 9, +-13, + 7, + 6, + -8, + 3, + -1, +-22, + 18, + 7, +-21, +-35, +-29, +-65, +-51, +-41, +-76, +-18, +-18, +-44, + 23, + 15, +-12, + -1, + -6, +-30, + 13, +-21, +-58, + 50, + 11, +-28, + 49, + 10, +-32, + 21, +-22, +-64, + 96, + 70, + 37, + 4, + 0, +-13, +-23, +-33, +-47, + -7, +-34, +-61, + 9, +-23, +-48, + 12, +-18, +-46, + -3, +-18, +-49, + -5, +-35, +-68, + 8, +-23, +-58, + 31, + -5, +-45, + 15, +-21, +-66, + 28, + -7, +-53, + 25, +-15, +-67, + -9, +-50, +-90, +-42, +-74, +-99, + 17, +-27, +-79, + 13, +-34, +-91, + 18, +-26, +-78, + 14, +-29, +-75, +-13, +-49, +-90, +-61, +-75, +-95, + 32, + -9, +-60, + 38, + 0, +-40, + 29, + -7, +-49, + 42, + 7, +-28, + 20, +-11, +-48, + 9, +-19, +-54, + 34, + -4, +-40, + 49, + 2, +-32, + 42, + -3, +-34, + 14, +-12, +-43, + 19, +-11, +-45, + 44, + 12, +-21, + 51, + 21, +-15, + 46, + 5, +-39, + 46, + 7, +-35, + 33, +-11, +-59, + 25, +-22, +-65, + 39, + -4, +-45, + 5, +-36, +-80, +-40, +-66, +-94, +-93, +-104, +-112, + 56, + 15, +-29, + 50, + 4, +-42, + 50, + 6, +-44, + 56, + 14, +-33, + 67, + 35, + -3, + 53, + 20, +-15, + 67, + 37, + 11, + 41, + 11, +-18, + 25, + 4, +-24, + 36, + 3, +-26, + 53, + 10, +-16, + 47, + 11, +-17, + 32, + 5, +-22, + 30, + -2, +-27, + 42, + 13, +-10, + 56, + 33, + 7, + 43, + 14, +-18, + 50, + 20, +-10, + 37, + -1, +-40, + 34, + -4, +-45, + 27, +-13, +-50, + 23, +-17, +-53, + 21, +-20, +-61, + 23, +-18, +-59, + 28, + -7, +-44, + 18, +-25, +-64, + 29, + -8, +-41, + 32, + 5, +-20, + 27, + 1, +-21, + 35, + 12, + -8, + 25, + -1, +-17, + 3, +-25, +-43, + 5, +-10, +-23, + 27, + 21, + 9, + 21, + 10, +-12, + 6, + 6, + -9, + 17, + 11, + -9, + 12, + 9, + -8, + 14, + 10, + -7, + 22, + 13, + -9, + 15, + 11, + -7, + 23, + 13, + -9, + 7, + 4, +-17, + 11, + 3, +-22, + 16, + 4, +-22, + -8, +-16, +-50, +-36, +-30, +-65, +-33, +-25, +-61, +-52, +-38, +-70, +-28, +-26, +-47, + -5, +-33, +-65, + 46, + 9, +-29, + 45, + 8, +-33, + 15, +-25, +-65, + 94, + 64, + 33, + 11, +-14, +-42, + 26, + 11, +-17, + 23, + 3, +-22, + 22, + 1, +-27, + 28, + 7, +-23, + 33, + 10, +-23, + 13, +-15, +-52, + 9, +-29, +-67, + 2, +-39, +-84, + 15, +-27, +-81, + 10, +-34, +-87, + 15, +-27, +-77, +-11, +-46, +-83, +-38, +-65, +-88, + 26, + -8, +-53, + 25, + -8, +-50, + 23, + 2, +-45, + 30, + 16, +-38, + 62, + 62, + 21, + 59, + 74, + 41, + 59, + 50, + 30, + 59, + 22, + -8, + 79, + 57, + 33, + 57, + 36, + 12, + 35, + 12, +-14, + 42, + 7, +-33, + 32, + -7, +-45, + 42, + 5, +-35, + 41, + 1, +-38, + 58, + 29, + -8, + 44, + 6, +-34, + 33, + -8, +-52, + 34, +-11, +-54, + 33, +-12, +-56, + 32, +-14, +-60, + 42, + 1, +-40, + 48, + 20, +-16, + 30, + -8, +-42, +-12, +-48, +-83, +-31, +-56, +-87, +-75, +-87, +-101, + 44, + 5, +-35, + 55, + 21, +-18, + 56, + 19, +-20, + 50, + 8, +-36, + 49, + 6, +-42, + 47, + 3, +-44, + 55, + 14, +-28, + 67, + 35, + -6, + 74, + 54, + 28, + 65, + 35, + 2, + 57, + 22, + -8, + 56, + 20, +-13, + 65, + 40, + 11, + 59, + 40, + 16, + 44, + 8, +-20, + 47, + 8, +-27, + 46, + 7, +-31, + 35, + -4, +-47, + 37, + -2, +-45, + 42, + 11, +-24, + 43, + 15, +-15, + 39, + 12, +-20, + 49, + 26, + -1, + 38, + 17, + -7, + 42, + 14, +-14, + 31, + -1, +-31, + 39, + 10, +-18, + 28, + -9, +-46, + 30, + -7, +-45, + 24, +-10, +-43, + 24, +-11, +-37, + 19, + -4, +-25, + 31, + 12, + -4, + 5, +-18, +-48, + -4, +-29, +-61, + -5, +-26, +-57, + 0, +-15, +-40, + 4, +-13, +-39, + 3, + -8, +-29, + 4, + -3, +-22, + 13, + 3, +-20, + 18, + 7, +-14, + 3, + -5, +-24, + 2, + -1, +-22, + 8, + -1, +-27, + 39, + 15, +-12, + -1, + -9, +-41, +-39, +-28, +-65, +-20, +-11, +-45, +-32, +-23, +-52, +-25, +-47, +-76, + 41, + 4, +-34, + 43, + 6, +-32, + 5, +-34, +-71, + 82, + 52, + 20, + 14, + 1, +-40, + 41, + 45, + 11, + 57, + 53, + 23, + 67, + 61, + 32, + 17, + 30, + -7, +-19, + 14, +-28, + 23, + 37, + 2, + 44, + 49, + 17, + 40, + 45, + 16, + 22, + 34, + 4, + 4, + 9, +-23, + 13, + 9, +-27, + -9, +-16, +-38, +-35, +-40, +-64, + 11, + 17, +-14, + 35, + 47, + 16, + 85, + 66, +-20, +119, + 89, + 13, +115, +100, + 61, +110, +103, + 83, + 91, + 75, + 49, + 72, + 27, + 12, + 67, + 54, + 37, + 84, + 71, + 54, + 60, + 45, + 28, + 17, +-21, +-65, + 20, +-25, +-73, + 23, +-22, +-71, + 21, +-24, +-69, + 21, +-20, +-62, + 32, + -4, +-40, + 21, +-19, +-58, + 36, + -4, +-46, + 24, +-18, +-58, + 31, + -6, +-40, + 25, + -8, +-40, + 26, + -4, +-32, + 21, + 2, +-18, +-32, +-65, +-95, +-11, +-42, +-72, +-13, +-24, +-52, + 18, + -2, +-31, + 35, + 3, +-32, + 35, + 2, +-34, + 49, + 15, +-19, + 47, + 5, +-38, + 56, + 17, +-26, + 49, + 9, +-27, + 53, + 20, +-12, + 47, + 8, +-29, + 47, + 8, +-33, + 55, + 14, +-28, + 53, + 12, +-31, + 50, + 13, +-29, + 51, + 14, +-21, + 59, + 27, + -9, + 53, + 20, +-14, + 60, + 24, +-14, + 46, + 6, +-33, + 44, + 14, +-15, + 39, + 11, +-15, + 33, + 8, +-16, + 29, + 14, + -7, + 11, + 4, +-13, + 10, + 4, +-11, + 17, + 9, + -6, + 21, + 7, +-10, + 36, + 8, +-16, + 39, + 10, +-14, + 36, + 8, +-18, + 35, + 3, +-27, + 35, + 4, +-29, + 28, + -3, +-31, + 23, + -9, +-36, + 7, +-12, +-44, + -4, +-15, +-42, + 3, +-12, +-40, + 8, + -9, +-43, + -5, +-21, +-50, + -5, +-23, +-55, + -8, +-35, +-72, + 0, +-32, +-72, +-10, +-31, +-65, +-10, +-36, +-72, +-11, +-29, +-56, + -7, +-23, +-48, + 41, + 16, +-10, + 44, + 21, + -4, + 22, + 10, +-19, +-21, +-15, +-50, +-37, +-25, +-56, +-43, +-54, +-82, + 39, + 3, +-33, + 43, + 5, +-32, + 0, +-39, +-76, + 76, + 47, + 18, + 28, + 10, +-35, + -9, + 12, +-30, + 46, + 46, + 16, + 87, + 71, + 49, + 80, + 68, + 46, + 39, + 42, + 11, + 13, + 29, + -8, + 53, + 57, + 32, + 24, + 42, + 14, + 43, + 49, + 24, + 69, + 67, + 44, + 33, + 41, + 8, + 50, + 57, + 32, + 71, + 74, + 55, + 74, + 77, + 61, + 29, + 34, +-14, +109, + 54, +-74, +117, + 83, + 3, +113, + 88, + 38, +100, + 87, + 65, + 73, +-23, +-46, + 94, + 63, + 41, +105, + 93, + 77, +103, + 92, + 74, + 61, + 42, + 27, + 17, +-23, +-67, + 8, +-39, +-88, + 16, +-24, +-68, + 19, +-18, +-55, + 13, +-28, +-73, + 32, + -7, +-46, + 40, + 9, +-27, + 28, + -2, +-34, + 26, + 4, +-24, + 5, +-10, +-34, +-11, +-18, +-37, +-13, +-22, +-47, + -6, +-24, +-56, +-34, +-66, +-97, + 6, +-30, +-62, + 29, +-12, +-44, + -4, +-22, +-55, + -8, +-15, +-39, + 14, + 8, +-11, + 19, + 2, +-22, + 48, + 30, + 3, + 61, + 34, + 4, + 65, + 41, + 8, + 55, + 20, +-18, + 48, + 11, +-29, + 60, + 31, + 4, + 51, + 13, +-22, + 51, + 11, +-33, + 65, + 36, + 4, + 53, + 18, +-18, + 63, + 32, + -1, + 68, + 46, + 24, + 70, + 50, + 28, + 66, + 45, + 22, + 43, + 32, + 16, + 42, + 37, + 26, + 18, + 14, + -1, + 9, + -1, +-22, + 30, + 11, + -8, + 31, + 8, +-14, + 31, + 1, +-19, + 10, +-15, +-39, + 2, + -8, +-31, + 4, + -5, +-17, + 29, + 16, + -2, + 28, + 10, + -6, + 47, + 24, + 0, + 42, + 23, + 5, + 35, + 9, +-14, +-14, +-33, +-63, +-19, +-34, +-60, + -7, +-19, +-44, + 1, +-13, +-40, +-13, +-26, +-49, +-13, +-25, +-52, +-13, +-32, +-56, +-12, +-24, +-51, +-29, +-43, +-65, +-18, +-38, +-60, + -3, +-30, +-65, +-20, +-44, +-78, + 40, + 14, +-12, + 44, + 21, + -4, + 46, + 27, + 2, + 49, + 32, + 7, + 34, + 21, + -3, +-14, +-30, +-51, + 36, + -1, +-36, + 43, + 8, +-26, + -3, +-38, +-75, + 81, + 50, + 19, + 62, + 37, + 5, + 59, + 53, + 29, + 51, + 48, + 23, + 53, + 50, + 24, + 63, + 57, + 32, + 69, + 62, + 35, + 69, + 60, + 33, + 54, + 52, + 25, + 73, + 66, + 43, + 80, + 76, + 53, + 86, + 84, + 67, + 88, + 83, + 67, + 70, + 75, + 62, + 54, + 73, + 55, + 61, + 71, + 60, + 90, + 58, + 40, + 93, + 17, +-125, +102, + 64, +-18, + 89, + 58, + 8, + 85, + 54, + 38, + 81, + 37, + 21, +102, + 84, + 63, + 87, + 68, + 47, + 94, + 79, + 62, + 33, + 9, +-11, + 16, +-23, +-66, + 12, +-32, +-74, + 27, +-11, +-51, + 16, +-24, +-67, + 14, +-23, +-62, + 24, +-10, +-47, + 3, +-35, +-72, + 22, +-16, +-55, + 18, +-23, +-62, + 31, + -3, +-38, + 20, + -9, +-38, + 36, + 11, +-14, + 10, + -4, +-26, +-57, +-82, +-101, + -9, +-33, +-56, + 3, +-14, +-41, + 31, + 10, +-14, + 36, + 5, +-25, + 49, + 20, +-10, + 46, + 12, +-22, + 45, + 7, +-31, + 48, + 14, +-22, + 49, + 19, +-13, + 63, + 39, + 11, + 57, + 23, +-10, + 67, + 36, + 0, + 57, + 22, +-16, + 56, + 17, +-25, + 65, + 39, + 8, + 55, + 23, + -6, + 61, + 39, + 14, + 66, + 46, + 22, + 52, + 21, +-14, + 61, + 31, + 2, + 56, + 28, + 3, + 54, + 27, + 3, + 49, + 23, + -4, + 28, + 5, +-15, + 16, + 7, + -7, + 4, + -3, +-24, + 23, + 12, +-11, + 13, + 3, +-21, + 12, + 0, +-20, + 33, + 11, +-13, + 45, + 24, + 1, + 35, + 9, +-15, + 43, + 20, + -8, + 38, + 12, +-13, + 30, + 4, +-18, +-23, +-39, +-63, +-14, +-26, +-51, +-10, +-24, +-50, + -3, +-22, +-47, +-20, +-34, +-61, + -8, +-23, +-52, +-30, +-42, +-64, +-11, +-28, +-53, +-23, +-40, +-69, +-32, +-53, +-78, +-18, +-34, +-60, +-26, +-42, +-67, + 38, + 12, +-13, + 43, + 19, + -6, + 45, + 25, + 0, + 27, + 14, + -8, + 48, + 32, + 12, +-10, +-21, +-39, + 32, + -5, +-41, + 43, + 10, +-25, + 6, +-31, +-68, + 80, + 50, + 21, + 46, + 18, +-19, + 31, + 34, + -1, + 44, + 47, + 14, + 59, + 57, + 26, + 47, + 49, + 16, + 24, + 35, + -2, + 40, + 37, + 1, + 86, + 74, + 54, +100, + 94, + 81, +104, + 99, + 90, +105, + 97, + 84, + 96, + 73, + 35, + 72, + 76, + 66, + 46, + 59, + 46, + 32, + 47, + 36, + 76, + 41, + 29, + 72, + 5, +-100, + 67, + 32, +-44, + 67, + 11, +-22, + 72, + 16, + 3, + 67, + 38, + 18, + 51, + 29, + 9, + 53, + 37, + 22, + 93, + 83, + 69, +-22, +-56, +-92, + 6, +-28, +-64, + 10, +-27, +-62, + 4, +-34, +-68, + 16, +-14, +-42, +-15, +-62, +-106, + 15, +-24, +-66, + 19, +-18, +-57, + 11, +-30, +-74, + 19, +-24, +-65, + 26, +-14, +-54, + 27, + -6, +-42, + 22, +-13, +-41, + 39, + 11, +-15, +-69, +-87, +-96, + 7, +-15, +-38, + 43, + 13, +-18, + 35, + -3, +-37, + 50, + 18, +-18, + 44, + 4, +-36, + 51, + 12, +-28, + 54, + 12, +-38, + 51, + 13, +-28, + 57, + 23, +-16, + 28, +-22, +-75, + 46, + 15, +-17, + 53, + 19, +-14, + 48, + 10, +-27, + 57, + 24, + -7, + 51, + 11, +-32, + 70, + 44, + 14, + 45, + 9, +-28, + 52, + 9, +-38, + 65, + 38, + 7, + 57, + 22, +-12, + 69, + 33, + -8, + 68, + 36, + 0, + 50, + 18, +-11, + 58, + 33, + 9, + 49, + 24, + -4, + 53, + 35, + 13, + 28, + 14, + -2, + 42, + 25, + 3, + 51, + 27, + 3, + 48, + 22, + -8, + 44, + 12, +-22, + 39, + 1, +-33, + 36, + 0, +-37, + 35, + 4, +-26, + 41, + 13, +-20, +-32, +-49, +-74, +-13, +-26, +-55, +-23, +-34, +-55, + -5, +-19, +-47, +-25, +-38, +-55, + -7, +-22, +-43, +-28, +-43, +-64, +-14, +-32, +-57, +-24, +-38, +-64, +-26, +-45, +-68, +-22, +-41, +-67, +-33, +-44, +-72, + 31, + 7, +-18, + 41, + 17, + -7, + 44, + 23, + -1, + 9, + 1, +-23, + 45, + 30, + 11, + -6, +-10, +-26, + 17, +-20, +-51, + 44, + 10, +-25, + 15, +-24, +-60, + 71, + 48, + 24, + 49, + 19, +-21, + 19, + 27, + -5, + 32, + 35, + 3, + 53, + 48, + 18, + 37, + 32, + -8, + 48, + 38, + -5, + 78, + 61, + 33, + 95, + 89, + 76, +102, + 97, + 90, +101, + 95, + 85, +100, + 88, + 78, + 85, + 31, +-41, + 62, + 64, + 55, + 13, + 26, + 10, + 24, + 32, + 21, + 30, +-24, +-63, + 36, + 8, +-59, +-21, + 10, +-33, + 33, + 3, +-42, + 84, + 50, +-12, + 87, + 46, +-17, + 57, + 44, + 30, + 53, + 40, + 25, + 74, + 65, + 54, + 54, +-38, +-59, + 52, +-25, +-48, + 37, +-14, +-38, + 4, +-25, +-51, + -9, +-26, +-52, + 15, + -7, +-36, + 18, +-10, +-39, + 22, +-12, +-46, + 7, +-32, +-69, + 7, +-39, +-87, + 13, +-29, +-74, + 11, +-33, +-79, + 26, + -5, +-34, + 37, + 5, +-31, +-49, +-79, +-100, + 14, +-12, +-42, + 45, + 10, +-30, + 33, + -3, +-41, + 37, + -7, +-55, + 38, + -3, +-54, + 42, + -5, +-57, + 46, + 7, +-30, + 61, + 28, + -9, + 53, + 25, + -8, + 48, + 28, + 4, + 47, + 33, + 7, + 58, + 28, + 2, + 58, + 17, + -8, + 55, + 8, +-13, + 70, + 41, + 19, + 56, + 42, + 21, + 62, + 46, + 26, + 58, + 36, + 14, + 62, + 37, + 9, + 64, + 30, + -3, + 57, + 23, +-11, + 51, + 9, +-39, + 61, + 28, +-11, + 50, + 12, +-30, + 57, + 23, + -8, + 57, + 32, + 6, + 62, + 36, + 7, + 55, + 30, + 2, + 50, + 17, +-17, + 34, + -2, +-32, + 37, + 5, +-29, + 36, + -5, +-45, + 20, +-23, +-66, + 32, + -2, +-35, + 40, + 8, +-23, +-32, +-51, +-77, + -8, +-20, +-44, +-21, +-34, +-57, + -8, +-23, +-47, +-23, +-36, +-54, +-24, +-33, +-59, +-42, +-54, +-73, +-15, +-30, +-55, +-32, +-47, +-69, +-38, +-53, +-75, +-13, +-31, +-57, +-40, +-54, +-74, + 15, + -2, +-30, + 39, + 15, + -9, + 34, + 15, + -9, + 7, + 2, +-24, + 35, + 22, + 1, + -2, + -5, +-24, + 6, +-32, +-61, + 45, + 11, +-24, + 21, +-18, +-55, + 60, + 42, + 24, + 56, + 27, + -5, + 18, +-18, +-54, + 28, +-19, +-61, + 60, + 4, +-63, + 42, + -2, +-59, + 39, + 5, +-28, + 91, + 79, + 63, + 90, + 85, + 73, + 89, + 79, + 58, + 89, + 86, + 76, + 69, + 8, +-20, + 64, + 18, +-94, + 14, + 19, + 9, + 37, + 43, + 37, + 36, + 32, + 16, + 67, +-17, +-104, + -2, +-11, +-49, + 30, + 7, +-30, + 83, + 31, +-60, + 99, + 59, +-62, + 98, + 61, +-17, + 61, + 54, + 40, + 56, + 43, + 27, + 65, + 54, + 42, + 24, + 17, +-11, + 79, + 24, + 13, + 83, + -2, +-14, + 88, + 10, + -3, + 68, + 30, + 12, + 40, + 9, +-16, + 19, +-13, +-42, + 3, +-36, +-71, + 31, + 2, +-30, + 12, +-26, +-64, + 24, +-10, +-47, + 9, +-32, +-71, + -3, +-55, +-101, + 6, +-42, +-91, +-94, +-99, +-95, + -3, +-38, +-72, + 15, +-32, +-79, + 25, +-21, +-66, + 44, + 6, +-33, + 42, + 8, +-29, + 57, + 25, +-15, + 63, + 34, + 3, + 50, + 22, + -5, + 54, + 18, + -9, + 51, + 15, +-11, + 44, + 10, +-16, + 36, + 12, +-12, + 45, + 20, + -1, + 41, + 16, + -2, + 46, + 32, + 12, + 33, + 4, +-20, + 44, + 14, +-12, + 58, + 27, + 4, + 73, + 51, + 31, + 59, + 32, + 5, + 68, + 48, + 25, + 66, + 38, + 7, + 57, + 25, + -6, + 62, + 29, + -4, + 51, + 4, +-39, + 45, + -2, +-42, + 53, + 10, +-40, + 47, + 6, +-41, + 38, + -3, +-45, + 28, +-15, +-56, + 24, +-16, +-51, + 23, +-12, +-41, + 31, + -2, +-35, + 49, + 24, + -3, + 45, + 19, +-11, +-28, +-45, +-70, +-10, +-22, +-45, +-26, +-35, +-56, + 1, +-12, +-40, +-25, +-37, +-56, +-11, +-29, +-54, +-34, +-43, +-61, +-18, +-31, +-58, +-37, +-53, +-74, +-40, +-53, +-77, +-28, +-43, +-69, +-33, +-52, +-73, +-12, +-19, +-50, + 34, + 12, +-13, + 18, + 2, +-23, + 3, + -1, +-28, + 24, + 17, + -6, + -4, + -4, +-25, + -5, +-40, +-70, + 45, + 12, +-23, + 24, +-15, +-54, + 38, + 20, + 2, + 64, + 36, + 7, + 63, + 8, +-44, + 59, + 10, +-33, + 76, + 37, + -2, + 45, + 1, +-42, + 50, + 14, +-20, + 59, + 24, +-22, + 88, + 64, + 20, + 81, + 72, + 53, + 77, + 58, + 43, + 45, + 17, +-59, + 36, + 39, + 14, + 61, + 65, + 58, + 49, + 45, + 38, + 42, + 19, + -7, + 41, + 16, +-26, + 28, + 34, + -4, + 14, + 35, + 1, + 16, + 36, + 5, + 51, + 54, + 29, +-17, + 21, +-26, + 59, + 52, + 39, + 48, + 35, + 18, + 59, + 47, + 30, + 51, + 55, + 34, + 81, + 83, + 68, +103, + 97, + 85, +102, + 84, + 70, +100, + 66, + 58, +103, + 88, + 77, +100, + 89, + 73, + 66, + 49, + 30, + 9, +-22, +-55, + 11, +-31, +-73, + 12, +-28, +-72, + 23, +-21, +-63, + 22, +-20, +-65, + 20, +-26, +-71, +-78, +-87, +-86, + 5, +-30, +-59, + 43, + 2, +-42, + 43, + -2, +-56, + 41, + -3, +-49, + 50, + 10, +-34, + 52, + 17, +-23, + 65, + 39, + 8, + 58, + 28, + -6, + 62, + 34, + 11, + 47, + 12, +-13, + 20, +-11, +-37, + 36, + 21, + -4, + 61, + 35, + 13, + 49, + 17, + -3, + 65, + 33, + 8, + 32, + 12, +-15, + 36, + 1, +-28, + 50, + 21, + -7, + 60, + 31, + 9, + 69, + 45, + 15, + 64, + 39, + 10, + 74, + 54, + 28, + 66, + 30, + -9, + 59, + 22, +-19, + 46, + 3, +-40, + 48, + 6, +-37, + 47, + 4, +-41, + 56, + 14, +-35, + 54, + 11, +-38, + 49, + 9, +-31, + 40, + -1, +-42, + 20, +-20, +-58, + 33, + 0, +-35, + 45, + 21, + -4, + 16, +-18, +-46, +-29, +-46, +-71, +-12, +-23, +-43, +-25, +-33, +-58, +-15, +-28, +-52, +-29, +-38, +-58, +-14, +-28, +-49, +-34, +-44, +-65, +-24, +-36, +-57, +-43, +-57, +-78, +-36, +-50, +-76, +-31, +-45, +-70, +-47, +-64, +-85, +-19, +-21, +-55, + -4, +-12, +-40, + 0, +-12, +-36, +-19, +-16, +-41, + 8, + 8, +-17, + -7, + -6, +-28, +-13, +-45, +-74, + 40, + 6, +-27, + 29, + -8, +-46, + 24, + -1, +-21, + 90, + 66, + 40, + 59, + 23, +-12, + 68, + 33, + 0, + 73, + 43, + 15, + 89, + 63, + 38, + 71, + 46, + 20, + 50, + 1, +-77, + 90, + 51, +-44, + 92, + 63, + 15, + 17, + 12, +-44, +-49, + 2, +-33, + 1, + -3, +-27, + 31, +-12, +-60, + 51, + -2, +-67, + 62, + 19, +-25, + 62, + 29, + -8, + 61, + 35, + 5, + 49, + 30, + -1, + 47, + 32, + 3, + 51, + 42, + 17, + 5, + 27, +-10, + 52, + 46, + 31, + 52, + 38, + 22, + 68, + 54, + 38, + 58, + 58, + 40, + 86, + 86, + 77, +103, + 99, + 93, +104, + 99, + 93, +104, +100, + 91, +106, + 99, + 93, + 95, + 88, + 76, + 60, + 15, + -8, +-17, +-59, +-100, + 1, +-40, +-85, + 19, +-22, +-66, + 21, +-20, +-57, + 34, + -6, +-49, + 53, + 22, +-12, + 24, + -4, +-30, + 44, + 21, + -5, + 46, + 9, +-33, + 45, + 7, +-38, + 48, + 9, +-34, + 44, + 0, +-50, + 42, + -5, +-63, + 58, + 15, +-35, + 58, + 19, +-24, + 55, + 25, + -8, + 49, + 26, + 1, + 59, + 44, + 19, + 62, + 40, + 18, + 56, + 12, +-12, + 64, + 15, + -8, + 68, + 27, + 4, + 76, + 55, + 32, + 58, + 45, + 18, + 66, + 51, + 27, + 56, + 32, + 7, + 60, + 30, + -3, + 63, + 28, +-11, + 58, + 21, +-22, + 61, + 18, +-38, + 69, + 30, +-22, + 64, + 28, +-13, + 66, + 34, + -5, + 65, + 35, + 2, + 72, + 48, + 21, + 64, + 40, + 13, + 63, + 33, + 2, + 58, + 25, +-11, + 41, + 4, +-28, + 23, +-18, +-55, + 19, +-27, +-73, + 27, + -6, +-43, +-36, +-52, +-82, +-11, +-22, +-41, +-25, +-35, +-52, +-20, +-30, +-51, +-30, +-36, +-58, +-16, +-24, +-45, +-40, +-50, +-70, +-29, +-40, +-60, +-32, +-51, +-71, +-49, +-61, +-84, +-22, +-34, +-55, +-44, +-60, +-83, +-21, +-22, +-55, +-16, +-17, +-48, +-44, +-40, +-71, +-56, +-46, +-74, + -3, + 0, +-26, +-11, + -8, +-31, +-23, +-44, +-68, + 38, + 4, +-29, + 29, + -7, +-44, + 5, +-33, +-67, + 71, + 47, + 25, + 91, + 64, + 37, + 92, + 60, + 31, + 89, + 53, + 16, + 85, + 50, + 9, + 88, + 62, + 20, + 58, + 20, +-14, + 30, +-16, +-77, + 41, + -4, +-92, + 27, +-31, +-98, + 41, +-19, +-121, + 64, + 6, +-74, + 72, + 41, + 11, + 82, + 67, + 48, + 86, + 74, + 57, + 86, + 76, + 63, + 86, + 77, + 63, + 78, + 72, + 56, + 48, + 45, + 25, + 58, + 43, + 19, + 38, + 16, +-15, + 48, + 38, + 22, + 60, + 49, + 32, + 63, + 50, + 34, + 58, + 49, + 33, + 98, + 88, + 73, + 66, + 53, + 45, + 87, + 85, + 79, +103, + 99, + 93, +101, + 89, + 72, +100, + 52, + -8, + 74, + 16, + 9, + 3, +-35, +-70, +-10, +-49, +-89, + -1, +-34, +-70, + 16, +-16, +-47, + 41, + 10, +-20, + 44, + 23, + -1, +-10, +-40, +-65, + 36, + 12, +-14, + 57, + 29, + -2, + 51, + 18, +-13, + 51, + 18, +-21, + 50, + 10, +-32, + 55, + 16, +-25, + 49, + 3, +-50, + 52, + 11, +-31, + 54, + 18, +-18, + 51, + 2, +-53, + 48, + 7, +-30, + 67, + 45, + 21, + 54, + 14, +-32, + 71, + 44, + 7, + 63, + 32, + -5, + 53, + 10, +-38, + 78, + 60, + 33, + 47, + 5, +-31, + 60, + 13, +-38, + 57, + 22, +-12, + 67, + 30, +-10, + 60, + 17, +-35, + 67, + 30, +-12, + 68, + 33, + -5, + 72, + 47, + 16, + 57, + 26, + -4, + 72, + 48, + 22, + 70, + 54, + 36, + 55, + 43, + 27, + 72, + 55, + 34, + 51, + 21, + -5, + 66, + 41, + 17, + 60, + 26, +-16, + 37, + -1, +-37, + 25, + -8, +-43, +-45, +-59, +-84, +-27, +-40, +-62, +-27, +-36, +-54, +-30, +-40, +-62, +-22, +-35, +-56, +-30, +-43, +-61, +-30, +-41, +-62, +-29, +-40, +-60, +-46, +-59, +-79, +-46, +-57, +-80, +-36, +-51, +-74, +-53, +-68, +-90, +-36, +-36, +-67, +-10, +-13, +-43, +-41, +-36, +-65, +-103, +-70, +-104, +-15, +-10, +-35, +-15, +-11, +-35, +-36, +-47, +-69, + 36, + 3, +-31, + 33, + -4, +-40, + 29, + -6, +-33, + 54, + 17, +-15, + 58, + 24, + -8, + 48, + 11, +-21, + 69, + 40, + 14, + 83, + 62, + 37, + 64, + 34, + 8, + 57, + 11, +-21, + 52, + -9, +-80, + 54, +-15, +-128, + 65, + 3, +-128, + 75, + 36, + -6, + 80, + 49, + 30, + 88, + 57, + 41, + 86, + 58, + 44, + 85, + 63, + 50, + 87, + 67, + 56, + 87, + 73, + 61, + 56, + 59, + 42, + 78, + 77, + 64, + 93, + 88, + 78, + 81, + 76, + 67, + 25, + 20, + 7, + 51, + 46, + 31, + 61, + 46, + 28, + 57, + 41, + 23, + 65, +-33, +-43, + 44, +-64, +-66, + 2, +-66, +-68, + 59, + 32, + 3, +100, + 53, +-34, + 97, + 21, + 16, + 93, + 57, + 49, + 6, +-30, +-59, + 5, +-27, +-57, + 4, +-30, +-65, +-13, +-41, +-72, +-19, +-33, +-57, +-14, +-17, +-36, +-17, +-51, +-82, + -4, +-17, +-33, + 27, + 20, + 8, + 45, + 20, + -2, + 57, + 27, + -3, + 56, + 25, + -4, + 44, + 9, +-19, + 61, + 21, +-20, + 75, + 39, + -3, + 50, + 11, +-31, + 60, + 31, + 3, + 37, +-10, +-48, + 61, + 18, +-31, + 58, + 19, +-23, + 58, + 11, +-43, + 58, + 17, +-27, + 68, + 36, + -5, + 53, + 12, +-30, + 48, + 1, +-48, + 70, + 39, + 4, + 60, + 22, +-14, + 72, + 39, + -4, + 69, + 30, +-16, + 62, + 27, + -5, + 49, + 12, +-19, + 69, + 39, + 4, + 56, + 33, + 11, + 56, + 50, + 37, + 31, + 30, + 18, + 38, + 34, + 20, + 32, + 31, + 16, + 39, + 33, + 19, + 57, + 48, + 33, + 63, + 35, + 6, + 49, + 20, + -7, + 31, + 1, +-26, + 9, +-16, +-46, +-29, +-44, +-67, +-44, +-57, +-78, +-29, +-42, +-67, +-24, +-38, +-60, +-20, +-30, +-54, +-47, +-56, +-80, +-26, +-38, +-65, +-54, +-67, +-83, +-45, +-58, +-77, +-34, +-50, +-75, +-57, +-68, +-91, +-16, +-28, +-54, +-21, +-22, +-54, +-35, +-32, +-61, +-113, +-73, +-110, +-26, +-19, +-45, +-19, +-14, +-38, +-48, +-58, +-79, + 37, + 3, +-30, + 30, + -7, +-40, + 20, +-13, +-38, + 93, + 70, + 47, + 85, + 62, + 39, + 78, + 53, + 28, + 62, + 25, +-20, + 51, + 7, +-55, + 37, +-31, +-81, + 37, +-60, +-128, + 53, +-32, +-128, + 63, + -8, +-128, + 70, + 18, +-42, + 61, +-10, +-24, + 76, + -1, +-14, + 76, + 6, + -6, + 83, + 28, + 17, + 90, + 53, + 43, + 89, + 64, + 53, + 90, + 70, + 60, + 78, + 67, + 55, + 78, + 75, + 66, + 94, + 89, + 83, + 95, + 92, + 86, + 56, + 53, + 45, + 18, + 20, + 12, + 36, + 25, + 8, + 62, + 50, + 32, + 62, + 25, + 10, + 30, +-30, +-39, +-10, +-104, +-113, + 40, +-24, +-28, + 94, + 59, + 57, + 87, + 51, + 49, + 86, + 31, + 22, + 5, +-19, +-47, + 0, +-15, +-40, + -8, +-21, +-45, + 1, +-21, +-52, +-32, +-52, +-83, +-35, +-64, +-92, +-14, +-52, +-76, + 32, + -1, +-26, + 30, + 9, +-17, + 37, + 24, + -7, + 39, + 34, + 19, + 55, + 48, + 32, + 52, + 33, + 11, + 68, + 51, + 27, + 74, + 50, + 21, + 72, + 46, + 20, + 70, + 44, + 19, + 75, + 44, + 10, + 63, + 30, + -2, + 68, + 41, + 13, + 69, + 35, + -5, + 57, + 14, +-39, + 75, + 49, + 17, + 66, + 37, + 9, + 75, + 48, + 16, + 77, + 57, + 31, + 71, + 46, + 21, + 79, + 59, + 32, + 73, + 47, + 21, + 64, + 43, + 18, + 71, + 58, + 38, + 55, + 48, + 32, + 37, + 30, + 13, + 39, + 25, + -3, + 43, + 30, + 7, + 50, + 25, + -5, + 29, + 8, +-19, + 49, + 13, +-11, + 34, + 16, +-13, + 53, + 44, + 19, + 46, + 41, + 25, + 75, + 60, + 39, + 40, + 15, +-13, + 61, + 31, + -5, + 51, + 20, +-17, + 33, + 4, +-31, + -2, +-33, +-69, +-13, +-49, +-87, +-30, +-62, +-94, +-44, +-67, +-92, +-55, +-76, +-93, +-58, +-72, +-91, +-32, +-48, +-69, +-61, +-74, +-96, +-32, +-36, +-63, +-37, +-35, +-65, +-27, +-23, +-55, +-114, +-82, +-112, +-35, +-28, +-53, +-34, +-28, +-50, +-67, +-68, +-90, + 33, + 0, +-32, + 29, + -8, +-41, + 0, +-35, +-65, + 93, + 68, + 43, + 85, + 61, + 34, + 53, + 4, +-86, + 61, + 12, +-84, + 64, + 19, +-71, + 72, + 37, +-19, + 63, + 16, +-10, + 55, +-37, +-103, + 64, +-18, +-128, + 41, +-49, +-86, + 58, +-42, +-52, + 60, +-32, +-46, + 72, +-18, +-29, + 73, +-14, +-23, + 85, + 16, + 7, + 91, + 55, + 46, + 93, + 62, + 54, + 92, + 75, + 66, + 33, + 51, + 37, + 83, + 83, + 75, + 93, + 91, + 85, + 77, + 75, + 69, + -9, + -7, +-13, + -3, + -4, +-17, + 64, + 50, + 33, + 68, + 51, + 33, + 51, + 30, + 15, + 63, + 54, + 53, + 66, + 18, + 21, + 80, + 23, + 27, + 83, + 72, + 68, + 81, + 52, + 41, + 15, + -8, +-38, + 15, + -4, +-30, + 13, + -5, +-33, + 2, +-18, +-50, + -4, +-29, +-59, +-18, +-44, +-70, +-19, +-33, +-61, + 24, + -1, +-31, + 36, + 16, +-13, + 24, + 10, +-20, + 35, + 30, + 13, + 60, + 47, + 28, + 50, + 32, + 12, + 65, + 46, + 23, + 74, + 48, + 21, + 79, + 59, + 32, + 80, + 56, + 23, + 70, + 40, + 6, + 68, + 36, + 4, + 72, + 47, + 22, + 77, + 50, + 14, + 65, + 25, +-29, + 77, + 46, + 11, + 72, + 47, + 23, + 66, + 34, + -2, + 74, + 44, + 9, + 77, + 59, + 32, + 74, + 53, + 28, + 77, + 57, + 28, + 70, + 53, + 31, + 50, + 37, + 18, + 56, + 50, + 36, + 48, + 43, + 30, + 43, + 35, + 11, + 42, + 18, +-10, + 68, + 41, + 11, + 42, + 23, + -3, + 50, + 12, +-15, + 44, + 22, +-10, + 30, + 19, + -5, + 26, + 21, + 9, + 43, + 38, + 22, + 57, + 45, + 24, + 55, + 32, + 4, + 64, + 32, + -3, + 69, + 41, + 5, + 53, + 20, +-21, + 44, + 3, +-37, + 32, +-10, +-50, + 42, + 4, +-38, + 23, +-19, +-61, + 11, +-35, +-83, + 8, +-29, +-68, + -1, +-33, +-66, +-88, +-74, +-101, +-60, +-54, +-80, +-25, +-21, +-53, +-65, +-57, +-80, +-44, +-35, +-58, +-38, +-30, +-52, +-53, +-50, +-68, + 28, + -5, +-37, + 27, +-12, +-44, + 0, +-38, +-68, + 79, + 52, + 29, + 91, + 67, + 43, + 55, + 5, +-82, + 63, + 14, +-86, + 68, + 25, +-69, + 76, + 38, +-38, + 80, + 53, + 4, + 85, + 74, + 52, + 69, + 28, +-15, +-15, +-48, +-80, + 5, +-39, +-65, + 61, + 3, + -6, + 67, + 8, + -3, + 68, + 0, + -8, + 70, + -7, +-13, + 87, + 33, + 29, + 92, + 77, + 72, + 94, + 81, + 74, + 79, + 58, + 52, + 30, + 47, + 36, + 81, + 77, + 73, + 36, + 53, + 40, + 35, + 41, + 30, + -6, + -4, +-14, + 34, + 17, + -2, + 56, + 42, + 24, + 69, + 52, + 32, + 48, + 8, + -4, + 70, + 31, + 35, + 60, + 14, + 14, + 76, + 59, + 54, + 54, + 24, + 7, + 23, +-16, +-57, + 22, +-15, +-56, + 19, +-19, +-53, + 26, + 14, + -9, + 6, + 0, +-18, + 5, + 2, +-18, + 39, + 30, + 8, + 31, + 28, + 9, + 37, + 33, + 21, + 64, + 43, + 23, + 63, + 34, + 5, + 69, + 41, + 10, + 64, + 31, + -4, + 68, + 32, + -7, + 76, + 44, + 11, + 40, + -1, +-37, + 78, + 54, + 24, + 62, + 29, + -4, + 62, + 21, +-29, + 76, + 42, + -8, + 59, + 19, +-34, + 47, + 5, +-33, + 75, + 42, + -2, + 68, + 38, + 1, + 61, + 24, +-22, + 56, + 23, + -8, + 80, + 60, + 34, + 59, + 24, +-18, + 57, + 22, +-13, + 72, + 42, + 3, + 66, + 39, + 9, + 70, + 40, + 11, + 71, + 42, + 12, + 61, + 32, + 3, + 36, + 34, + 23, + 23, + 23, + 6, + 45, + 39, + 13, + 49, + 44, + 17, + 29, + 29, + 8, + 39, + 35, + 20, + 51, + 27, + 0, + 73, + 52, + 24, + 61, + 33, + 3, + 58, + 26, + -8, + 70, + 37, + -4, + 48, + 10, +-30, + 33, +-10, +-49, + 55, + 20, +-16, + 25, +-19, +-60, + 28, +-17, +-58, + 39, + -2, +-43, + 34, +-10, +-59, + 27, +-19, +-67, + 18, +-28, +-71, +-47, +-45, +-74, +-92, +-77, +-102, +-41, +-34, +-61, +-38, +-32, +-58, +-57, +-47, +-66, +-42, +-34, +-54, +-56, +-48, +-62, + 18, +-15, +-47, + 27, +-13, +-44, + 4, +-35, +-67, + 65, + 38, + 16, + 91, + 68, + 45, + 58, + 8, +-65, + 66, + 19, +-97, + 73, + 30, +-81, + 80, + 40, +-46, + 80, + 44, +-28, + 80, + 48, +-15, + 35, + 24, +-22, +-10, + 8, +-15, + 11, + 27, + 5, + 24, + 30, + 16, + 80, + 75, + 63, + 83, + 78, + 67, + 87, + 78, + 70, + 85, + 77, + 71, + 85, + 80, + 77, + 87, + 81, + 78, + 55, + 62, + 56, + 18, + 36, + 28, + 60, + 50, + 50, + -6, + 25, + 4, + 65, + 70, + 63, + 28, + 34, + 26, + -1, + -6, +-17, + 45, + 29, + 12, + 54, + 40, + 24, + 59, + 34, + 14, + 41, +-29, +-30, + 48, + 40, + 37, + 39, +-12, +-17, + 46, + 9, +-32, + 25, +-16, +-65, + 22, +-22, +-67, + 33, + -3, +-42, + 21, +-17, +-49, + 51, + 30, + 3, + 39, + 28, + 10, + 50, + 41, + 27, + 68, + 53, + 31, + 59, + 35, + 7, + 67, + 36, + 6, + 62, + 19, +-31, + 64, + 23, +-22, + 72, + 39, + 2, + 75, + 37, +-22, + 67, + 32, + -4, + 71, + 46, + 15, + 73, + 38, +-11, + 57, + 4, +-55, + 67, + 39, + 12, + 68, + 39, + 3, + 54, + 16, +-23, + 63, + 29, + -3, + 58, + 24, +-13, + 58, + 21, +-19, + 77, + 54, + 26, + 51, + 7, +-39, + 62, + 16, +-44, + 67, + 31, + -8, + 71, + 43, + 9, + 60, + 19, +-28, + 72, + 40, + -4, + 67, + 35, + -7, + 64, + 26, +-21, + 67, + 35, + -3, + 66, + 42, + 15, + 70, + 46, + 23, + 68, + 59, + 40, + 34, + 34, + 23, + 57, + 46, + 28, + 70, + 43, + 14, + 59, + 24, + -9, + 66, + 30, +-16, + 60, + 18, +-31, + 63, + 30, +-11, + 65, + 25, +-31, + 60, + 23, +-23, + 57, + 20, +-22, + 53, + 13, +-36, + 41, + -3, +-58, + 48, + 12, +-24, + 49, + 14, +-25, + 42, + 2, +-44, + 35, + -7, +-54, + 17, +-29, +-68 +}; diff --git a/examples/app_no_flash/src/image2.h b/examples/app_no_flash/src/image2.h new file mode 100644 index 000000000..4daa44d76 --- /dev/null +++ b/examples/app_no_flash/src/image2.h @@ -0,0 +1,27650 @@ +int8_t image2[96*96*3] = { +122, +122, +122, +122, +122, +122, +122, +122, +122, +121, +121, +121, +123, +123, +123, +124, +124, +124, +122, +122, +122, +122, +122, +122, +119, +119, +119, +118, +118, +118, +123, +123, +123, +121, +121, +121, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +122, +122, +122, +120, +120, +120, +121, +121, +121, +124, +122, +123, +125, +122, +123, +125, +122, +123, +124, +121, +122, +124, +121, +122, +123, +121, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +125, +120, +122, +125, +120, +122, +121, +122, +122, +120, +123, +123, +121, +122, +124, +124, +122, +124, +120, +122, +121, +120, +122, +121, +122, +122, +120, +125, +124, +121, +124, +123, +118, +123, +120, +117, +117, +113, +113, +115, +111, +111, +116, +112, +112, +117, +113, +113, +120, +117, +117, +123, +121, +122, +121, +121, +124, +122, +121, +123, +119, +119, +120, +119, +119, +119, +123, +121, +121, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +122, +121, +121, +121, +118, +119, +123, +120, +121, +123, +120, +121, +123, +120, +121, +124, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +122, +121, +121, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +118, +118, +118, +117, +117, +117, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +113, +113, +113, +116, +116, +116, +119, +117, +118, +119, +117, +118, +119, +116, +117, +118, +115, +116, +118, +115, +116, +118, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +119, +115, +116, +117, +116, +116, +113, +118, +116, +111, +115, +114, +116, +117, +118, +117, +114, +116, +118, +115, +114, +107, +105, +102, + 92, + 88, + 85, + 80, + 75, + 71, + 68, + 62, + 56, + 68, + 60, + 55, + 46, + 36, + 32, + 29, + 19, + 14, + 33, + 23, + 18, + 38, + 28, + 24, + 54, + 45, + 40, + 85, + 76, + 73, +104, + 98, + 96, +117, +112, +111, +120, +117, +116, +119, +117, +118, +116, +116, +117, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +117, +116, +116, +113, +111, +111, +119, +117, +118, +119, +116, +117, +118, +115, +116, +118, +115, +116, +119, +116, +117, +120, +117, +118, +120, +117, +118, +117, +115, +115, +117, +114, +115, +117, +114, +115, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +117, +117, +116, +116, +116, +114, +114, +114, +113, +113, +113, +116, +116, +116, +117, +117, +117, +116, +116, +116, +115, +115, +115, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +114, +114, +114, +110, +110, +110, +108, +108, +108, +115, +113, +114, +116, +114, +114, +116, +114, +114, +119, +116, +117, +119, +116, +117, +118, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +117, +117, +114, +118, +117, +112, +119, +117, +113, +119, +115, +114, +113, +111, +106, + 99, + 97, + 77, + 68, + 64, + 59, + 50, + 45, + 58, + 47, + 41, + 44, + 32, + 25, + 33, + 19, + 11, + 25, + 9, + 0, + 7, +-12, +-21, + 4, +-15, +-24, + 11, + -9, +-18, + 2, +-17, +-26, + 9, +-10, +-20, + 14, + -3, +-12, + 30, + 16, + 8, + 60, + 48, + 43, + 87, + 79, + 76, +108, +103, +103, +116, +114, +116, +118, +115, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +116, +116, +116, +113, +114, +116, +114, +115, +119, +116, +117, +118, +116, +117, +118, +116, +117, +118, +115, +116, +118, +115, +116, +117, +115, +116, +116, +113, +114, +115, +112, +113, +115, +112, +113, +113, +113, +113, +115, +115, +115, +117, +117, +117, +118, +118, +118, +118, +118, +118, +112, +112, +112, +115, +115, +115, +117, +117, +117, +119, +119, +119, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +119, +116, +117, +120, +117, +118, +116, +114, +114, +118, +115, +116, +118, +115, +116, +118, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +117, +117, +117, +117, +117, +117, +115, +116, +117, +115, +119, +119, +116, +120, +117, +113, +113, +110, + 84, + 75, + 72, + 57, + 41, + 38, + 43, + 25, + 19, + 33, + 14, + 7, + 20, + 0, + -7, + 23, + 1, + -8, + 6, +-17, +-26, +-12, +-36, +-47, +-22, +-49, +-60, +-16, +-43, +-55, + -5, +-32, +-43, + -9, +-36, +-48, +-13, +-40, +-51, +-11, +-36, +-47, +-11, +-33, +-43, +-14, +-33, +-41, + -2, +-17, +-22, + 32, + 21, + 19, + 92, + 83, + 82, +120, +115, +116, +121, +118, +119, +119, +116, +117, +119, +116, +117, +118, +115, +116, +118, +115, +116, +117, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +117, +116, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +117, +118, +118, +116, +117, +117, +114, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +116, +116, +116, +112, +112, +112, +114, +114, +114, +115, +115, +115, +115, +115, +115, +113, +113, +113, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +115, +115, +115, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +118, +115, +116, +118, +116, +117, +115, +112, +113, +118, +115, +116, +118, +115, +116, +117, +115, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +119, +116, +116, +118, +118, +116, +115, + 93, + 85, + 83, + 52, + 32, + 29, + 48, + 20, + 18, + 36, + 11, + 4, + 17, + -9, +-17, + 31, + 4, + -5, + 13, +-14, +-25, + 6, +-24, +-36, +-15, +-44, +-57, +-11, +-39, +-50, + 11, +-17, +-28, + 28, + -1, +-12, + 22, + -7, +-18, + 3, +-26, +-36, +-16, +-42, +-52, +-33, +-55, +-64, +-24, +-46, +-55, +-23, +-44, +-53, +-15, +-35, +-43, + 13, + -6, +-13, + 95, + 89, + 88, +118, +115, +116, +119, +117, +117, +119, +116, +117, +120, +117, +118, +119, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +117, +116, +116, +118, +116, +116, +118, +116, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +115, +116, +117, +114, +115, +115, +112, +113, +116, +114, +114, +117, +114, +115, +117, +114, +115, +116, +115, +116, +111, +111, +110, +112, +112, +111, +113, +113, +112, +114, +113, +113, +114, +113, +113, +108, +107, +107, +111, +110, +110, +115, +114, +114, +115, +114, +114, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +114, +114, +114, +114, +114, +114, +114, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +116, +116, +117, +116, +116, +117, +116, +116, +116, +115, +116, +116, +116, +116, +117, +116, +116, +116, +113, +114, +117, +114, +115, +114, +111, +112, +115, +112, +113, +115, +112, +113, +114, +112, +113, +113, +113, +112, +113, +113, +112, +114, +113, +113, +114, +114, +113, +114, +114, +114, +114, +114, +113, +114, +114, +113, +114, +114, +113, +116, +115, +115, +116, +115, +115, +116, +115, +115, +117, +114, +116, +116, +112, +114, +105, + 99, + 98, + 62, + 49, + 47, + 56, + 30, + 29, + 43, + 10, + 7, + 17, +-13, +-22, + 6, +-23, +-36, + -3, +-34, +-49, + 11, +-22, +-37, + 28, + -5, +-18, + 31, + 1, +-11, + 45, + 19, + 8, + 67, + 41, + 31, + 69, + 44, + 33, + 59, + 31, + 20, + 39, + 11, + -3, + 0, +-27, +-40, +-18, +-41, +-52, +-20, +-41, +-51, +-34, +-56, +-64, +-22, +-44, +-52, + -7, +-30, +-41, + 18, + 8, + 5, + 98, + 92, + 91, +117, +113, +112, +118, +115, +115, +118, +115, +115, +118, +114, +115, +116, +115, +115, +116, +115, +115, +115, +115, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +114, +114, +113, +113, +112, +112, +113, +112, +112, +113, +112, +112, +114, +111, +111, +114, +111, +111, +113, +110, +111, +112, +110, +110, +112, +110, +110, +113, +111, +111, +113, +110, +111, +112, +109, +110, +113, +110, +111, +113, +111, +111, +113, +111, +111, +112, +111, +111, +114, +112, +110, +114, +112, +110, +114, +112, +110, +113, +111, +109, +115, +113, +111, +111, +109, +107, +113, +111, +110, +114, +112, +110, +114, +112, +110, +114, +112, +111, +114, +112, +111, +114, +112, +111, +115, +113, +111, +115, +113, +111, +114, +113, +112, +113, +113, +113, +113, +113, +113, +112, +112, +112, +112, +112, +112, +114, +114, +114, +116, +114, +114, +116, +113, +114, +116, +113, +114, +115, +112, +113, +114, +111, +112, +113, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +112, +111, +114, +112, +111, +115, +113, +112, +115, +113, +111, +116, +114, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +116, +114, +113, +117, +115, +113, +117, +115, +113, +120, +115, +114, +110, +104, +105, + 53, + 46, + 48, + 77, + 61, + 63, + 71, + 46, + 45, + 50, + 16, + 11, + 30, + -5, +-16, + 17, +-19, +-38, + 25, +-13, +-38, + 39, + 3, +-19, + 61, + 28, + 15, + 69, + 40, + 31, + 76, + 52, + 39, + 78, + 55, + 44, + 80, + 56, + 43, + 74, + 46, + 29, + 60, + 25, + 4, + 21, +-10, +-32, +-28, +-50, +-68, +-26, +-44, +-55, +-29, +-43, +-50, +-36, +-50, +-55, +-38, +-55, +-61, +-30, +-49, +-57, + 25, + 12, + 5, +105, + 99, + 92, +117, +115, +111, +118, +114, +114, +120, +113, +115, +118, +115, +114, +116, +114, +113, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +113, +111, +110, +113, +111, +110, +113, +111, +110, +112, +110, +109, +112, +110, +109, +111, +109, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +112, +110, +109, +113, +111, +110, +113, +111, +110, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +110, +108, +106, +110, +108, +106, +110, +108, +106, +112, +110, +108, +111, +109, +108, +106, +104, +102, +106, +104, +102, +111, +109, +108, +113, +111, +109, +114, +112, +110, +114, +112, +110, +115, +113, +111, +116, +114, +112, +116, +114, +112, +115, +114, +113, +114, +114, +114, +114, +114, +114, +113, +113, +113, +113, +113, +113, +115, +115, +115, +117, +115, +116, +118, +115, +116, +118, +115, +116, +111, +108, +109, +113, +110, +111, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +117, +114, +115, +117, +114, +115, +117, +115, +115, +117, +115, +113, +117, +115, +113, +118, +116, +114, +115, +113, +112, +116, +114, +113, +117, +115, +114, +116, +114, +113, +116, +114, +113, +117, +115, +114, +117, +115, +114, +117, +115, +114, +116, +114, +114, + 75, + 71, + 74, + 59, + 49, + 53, + 85, + 67, + 69, + 65, + 39, + 35, + 52, + 18, + 9, + 42, + -3, +-17, + 40, + -8, +-27, + 50, + 4, +-21, + 62, + 21, + -3, + 69, + 34, + 16, + 76, + 46, + 32, + 83, + 55, + 42, + 79, + 52, + 40, + 74, + 47, + 34, + 76, + 45, + 30, + 66, + 29, + 9, + 26, + -8, +-29, +-43, +-66, +-84, +-56, +-73, +-85, +-46, +-59, +-66, +-45, +-57, +-62, +-45, +-59, +-64, +-52, +-68, +-74, +-37, +-49, +-56, + 58, + 51, + 46, +113, +110, +106, +118, +115, +115, +119, +114, +115, +115, +112, +111, +113, +111, +110, +112, +110, +109, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +112, +115, +113, +112, +114, +112, +111, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +107, +109, +107, +105, +108, +106, +105, +109, +107, +105, +111, +109, +107, +112, +110, +108, +110, +108, +106, +111, +109, +107, +113, +111, +109, +115, +113, +111, +114, +112, +110, +114, +112, +110, +115, +113, +111, +117, +115, +113, +117, +115, +113, +116, +115, +114, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +116, +117, +119, +116, +117, +119, +116, +117, +117, +115, +116, +118, +116, +117, +120, +117, +118, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +116, +116, +119, +117, +115, +119, +117, +115, +119, +117, +116, +115, +113, +111, +116, +114, +113, +118, +115, +114, +117, +115, +114, +117, +115, +114, +118, +116, +114, +118, +116, +114, +118, +116, +114, +111, +109, +111, + 50, + 44, + 48, + 87, + 72, + 76, + 72, + 48, + 48, + 67, + 35, + 27, + 58, + 21, + 6, + 57, + 1, +-18, + 58, + 0, +-23, + 61, + 7, +-20, + 63, + 16, +-10, + 71, + 32, + 9, + 75, + 41, + 20, + 81, + 46, + 29, + 78, + 45, + 30, + 72, + 40, + 26, + 75, + 40, + 23, + 63, + 24, + 3, + 32, + -2, +-26, +-32, +-54, +-75, +-69, +-85, +-100, +-63, +-74, +-81, +-46, +-54, +-59, +-41, +-51, +-55, +-37, +-46, +-51, +-21, +-30, +-34, + 19, + 12, + 9, + 97, + 92, + 90, +115, +111, +111, +114, +110, +111, +114, +111, +110, +113, +111, +109, +112, +110, +108, +113, +110, +109, +113, +111, +109, +113, +111, +109, +111, +109, +107, +111, +109, +108, +113, +111, +110, +116, +114, +112, +116, +114, +112, +115, +113, +111, +114, +112, +110, +114, +112, +110, +113, +111, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +111, +109, +107, +110, +108, +107, +110, +108, +107, +111, +109, +108, +107, +105, +103, +106, +104, +103, +106, +104, +103, +108, +106, +105, +108, +106, +105, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +108, +107, +112, +110, +108, +112, +110, +108, +112, +111, +110, +112, +112, +112, +112, +112, +112, +113, +113, +113, +113, +113, +113, +113, +113, +113, +116, +114, +115, +116, +114, +115, +116, +114, +115, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +115, +112, +113, +117, +115, +116, +117, +115, +115, +117, +115, +114, +117, +115, +114, +117, +115, +114, +115, +113, +112, +115, +113, +111, +117, +115, +113, +116, +114, +113, +116, +114, +113, +116, +114, +112, +116, +114, +113, +116, +114, +112, + 89, + 85, + 85, + 73, + 61, + 63, + 81, + 57, + 58, + 65, + 31, + 24, + 55, + 15, + -2, + 49, + 7, +-21, + 57, + 2, +-28, + 60, + 2, +-28, + 65, + 8, +-22, + 63, + 12, +-18, + 62, + 20, + -9, + 70, + 31, + 2, + 78, + 37, + 11, + 72, + 35, + 12, + 70, + 35, + 14, + 73, + 36, + 12, + 67, + 26, + -1, + 46, + 11, +-17, +-19, +-41, +-64, +-63, +-79, +-95, +-57, +-64, +-72, + -9, +-14, +-19, + -8, +-15, +-18, +-32, +-36, +-38, + -1, + -5, + -6, + 7, + 0, + -1, + 75, + 68, + 68, +113, +109, +108, +111, +110, +108, +112, +110, +109, +113, +111, +109, +112, +110, +108, +110, +108, +106, +109, +107, +105, +110, +108, +106, +107, +105, +103, +107, +105, +103, +109, +107, +106, +110, +108, +107, +110, +108, +107, +111, +108, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +108, +106, +105, +108, +106, +104, +108, +106, +104, +107, +105, +103, +112, +110, +108, +111, +109, +108, +111, +109, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +114, +111, +110, +114, +111, +110, +113, +112, +112, +113, +113, +113, +113, +113, +113, +114, +114, +114, +114, +114, +114, +114, +114, +114, +115, +112, +113, +115, +112, +113, +115, +112, +113, +116, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +116, +114, +114, +111, +108, +109, +116, +114, +112, +116, +114, +112, +115, +113, +112, +117, +115, +113, +114, +112, +111, +116, +114, +112, +115, +113, +112, +115, +113, +112, +114, +112, +111, +114, +112, +111, +113, +111, +110, + 69, + 61, + 58, + 79, + 62, + 59, + 61, + 28, + 23, + 53, + 8, + -5, + 49, + -1, +-27, + 49, + -1, +-38, + 51, + 1, +-38, + 56, + 3, +-34, + 59, + 5, +-29, + 59, + 7, +-26, + 58, + 12, +-21, + 63, + 21, +-15, + 67, + 24, +-13, + 61, + 21, +-13, + 69, + 32, + 1, + 69, + 31, + 0, + 61, + 20, +-14, + 38, + 3, +-29, +-20, +-43, +-68, +-58, +-72, +-89, +-69, +-76, +-85, +-68, +-71, +-75, +-31, +-34, +-36, + -8, + -8, + -9, + -7, + -8, + -8, + 12, + 5, + 7, + 60, + 51, + 52, +114, +109, +108, +113, +112, +110, +114, +112, +111, +114, +112, +111, +114, +112, +110, +111, +109, +107, +111, +109, +107, +112, +110, +108, +113, +111, +109, +112, +110, +109, +113, +110, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +109, +108, +110, +110, +108, +110, +110, +108, +112, +110, +109, +112, +109, +109, +112, +109, +109, +112, +110, +110, +112, +110, +110, +112, +110, +110, +113, +111, +111, +113, +111, +111, +114, +111, +111, +114, +111, +111, +114, +111, +111, +114, +112, +112, +114, +113, +113, +114, +113, +113, +115, +114, +114, +115, +114, +114, +115, +114, +114, +114, +112, +113, +114, +112, +112, +114, +112, +112, +117, +114, +115, +117, +114, +115, +117, +114, +115, +114, +112, +113, +114, +112, +113, +115, +112, +113, +117, +114, +115, +118, +115, +116, +115, +112, +112, +117, +115, +113, +117, +115, +113, +116, +114, +113, +115, +113, +112, +115, +113, +112, +116, +113, +111, +117, +112, +111, +115, +113, +111, +113, +113, +111, +114, +112, +110, +111, +108, +107, + 74, + 64, + 63, + 65, + 42, + 38, + 48, + 6, + -3, + 47, + -7, +-26, + 50, + -5, +-34, + 48, + -2, +-37, + 46, + 1, +-40, + 49, + 2, +-37, + 53, + 2, +-35, + 57, + 5, +-31, + 60, + 8, +-27, + 57, + 8, +-30, + 59, + 11, +-31, + 60, + 16, +-25, + 64, + 22, +-17, + 61, + 21, +-19, + 56, + 14, +-27, + 36, + 0, +-36, + -9, +-33, +-60, +-39, +-55, +-74, +-34, +-41, +-51, +-50, +-53, +-60, +-43, +-45, +-49, + -8, + -5, +-10, +-33, +-35, +-37, + 6, + -3, + -2, + 56, + 46, + 47, +111, +106, +104, +113, +112, +109, +114, +112, +110, +114, +112, +110, +114, +112, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +114, +112, +110, +113, +111, +109, +113, +111, +109, +112, +110, +109, +112, +110, +108, +112, +110, +109, +112, +110, +108, +112, +110, +108, +111, +109, +107, +110, +108, +107, +109, +107, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +110, +110, +110, +110, +111, +108, +110, +111, +108, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +111, +108, +109, +111, +108, +109, +115, +112, +113, +114, +111, +112, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +118, +115, +116, +118, +115, +116, +118, +115, +116, +116, +113, +114, +116, +113, +114, +116, +114, +115, +118, +115, +116, +118, +115, +116, +117, +115, +115, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +111, +115, +113, +111, +119, +113, +112, +120, +113, +113, +116, +115, +113, +114, +114, +112, +116, +114, +112, +104, + 98, + 98, + 64, + 52, + 53, + 59, + 33, + 29, + 44, + -2, +-17, + 48, + -9, +-33, + 50, + -5, +-33, + 47, + 0, +-30, + 46, + 1, +-37, + 49, + 2, +-36, + 52, + 3, +-34, + 57, + 5, +-32, + 63, + 9, +-27, + 62, + 8, +-29, + 60, + 9, +-33, + 59, + 9, +-33, + 60, + 13, +-30, + 59, + 15, +-29, + 57, + 14, +-31, + 34, + -3, +-41, +-16, +-43, +-71, +-40, +-58, +-78, +-46, +-55, +-68, +-38, +-43, +-51, +-60, +-63, +-71, +-34, +-33, +-41, +-25, +-27, +-33, +-19, +-27, +-31, + 30, + 21, + 19, +104, + 98, + 96, +112, +110, +107, +115, +113, +111, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +113, +111, +110, +113, +110, +109, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +109, +107, +106, +110, +108, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +107, +105, +104, +110, +110, +110, +110, +111, +108, +110, +111, +108, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +111, +108, +109, +110, +107, +108, +113, +110, +111, +113, +110, +111, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +117, +114, +115, +117, +115, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +118, +115, +116, +117, +115, +115, +117, +115, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +117, +115, +115, +116, +114, +112, +116, +114, +112, +115, +113, +111, +114, +112, +110, +114, +112, +110, +116, +111, +111, +117, +112, +112, +114, +114, +112, +112, +112, +110, +117, +114, +112, +101, + 93, + 93, + 67, + 52, + 51, + 66, + 40, + 31, + 58, + 13, + -5, + 56, + 1, +-25, + 53, + -1, +-30, + 47, + -1, +-31, + 47, + 3, +-34, + 52, + 7, +-31, + 56, + 10, +-28, + 60, + 11, +-25, + 62, + 13, +-24, + 61, + 11, +-28, + 59, + 9, +-35, + 60, + 10, +-34, + 61, + 13, +-32, + 62, + 14, +-31, + 60, + 13, +-32, + 39, + -2, +-41, +-16, +-47, +-75, +-41, +-62, +-83, +-56, +-69, +-83, +-52, +-58, +-69, +-65, +-70, +-80, +-58, +-60, +-70, +-56, +-61, +-69, +-30, +-40, +-45, + 16, + 6, + 4, +102, + 96, + 94, +106, +104, +102, +114, +112, +110, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +113, +111, +109, +113, +110, +109, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +109, +107, +106, +110, +108, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +106, +104, +103, +110, +110, +109, +110, +111, +108, +110, +111, +108, +112, +110, +111, +113, +110, +111, +113, +110, +111, +112, +109, +110, +107, +105, +105, +112, +110, +110, +111, +108, +109, +111, +108, +109, +112, +109, +110, +114, +112, +112, +114, +112, +112, +114, +111, +112, +114, +111, +112, +115, +113, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +114, +114, +116, +114, +114, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +115, +116, +118, +115, +116, +117, +114, +115, +117, +115, +115, +115, +113, +112, +117, +115, +113, +117, +115, +114, +117, +115, +113, +117, +115, +113, +117, +113, +112, +116, +113, +112, +114, +115, +112, +115, +116, +113, +117, +112, +111, +101, + 91, + 92, + 62, + 43, + 39, + 50, + 21, + 8, + 53, + 11, +-13, + 54, + 3, +-28, + 54, + 4, +-27, + 52, + 3, +-26, + 55, + 10, +-26, + 55, + 11, +-26, + 57, + 13, +-24, + 60, + 16, +-21, + 62, + 18, +-19, + 59, + 14, +-24, + 60, + 13, +-31, + 59, + 12, +-32, + 60, + 14, +-30, + 61, + 14, +-30, + 61, + 14, +-30, + 50, + 7, +-32, + 1, +-32, +-64, +-37, +-61, +-85, +-58, +-73, +-90, +-71, +-81, +-94, +-81, +-90, +-102, +-68, +-74, +-87, +-56, +-65, +-75, +-39, +-51, +-57, + 18, + 8, + 5, +108, +101, +100, +111, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +106, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +105, +108, +106, +105, +108, +106, +105, +109, +107, +105, +108, +108, +108, +108, +109, +106, +109, +109, +107, +112, +109, +110, +112, +109, +110, +112, +109, +110, +109, +106, +107, +103, +100, +101, +111, +108, +109, +111, +109, +110, +111, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +113, +110, +111, +109, +106, +107, +112, +110, +111, +114, +111, +112, +113, +110, +111, +113, +110, +111, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +115, +112, +113, +115, +112, +113, +116, +113, +114, +116, +113, +114, +117, +114, +115, +111, +109, +109, +114, +111, +112, +114, +112, +112, +114, +112, +110, +114, +112, +110, +114, +112, +111, +113, +111, +110, +113, +111, +110, +113, +111, +110, +112, +112, +109, +110, +112, +109, +110, +111, +109, +116, +110, +109, +101, + 88, + 90, + 56, + 33, + 27, + 34, + 3, +-14, + 34, + -4, +-34, + 46, + 0, +-35, + 49, + 2, +-33, + 46, + -2, +-33, + 45, + 0, +-34, + 44, + 1, +-34, + 47, + 5, +-30, + 56, + 16, +-20, + 55, + 17, +-20, + 55, + 17, +-20, + 63, + 24, +-16, + 62, + 23, +-18, + 57, + 16, +-24, + 58, + 16, +-24, + 59, + 15, +-24, + 56, + 14, +-24, + 30, + -6, +-40, +-23, +-50, +-77, +-52, +-70, +-90, +-68, +-81, +-97, +-77, +-88, +-103, +-69, +-79, +-94, +-59, +-70, +-84, +-44, +-58, +-67, + 27, + 15, + 12, +108, +101, +100, +108, +107, +107, +109, +107, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +108, +106, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +107, +105, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +105, +105, +105, +106, +103, +105, +106, +104, +111, +108, +109, +111, +108, +109, +111, +108, +109, +110, +108, +108, +110, +107, +108, +110, +107, +108, +109, +106, +107, +109, +106, +107, +110, +107, +108, +111, +108, +109, +111, +108, +109, +111, +108, +109, +109, +106, +107, +112, +109, +110, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +111, +111, +113, +111, +111, +113, +110, +111, +112, +109, +110, +112, +109, +110, +112, +109, +110, +107, +105, +106, +110, +108, +109, +113, +111, +111, +112, +110, +108, +111, +109, +107, +110, +108, +106, +111, +109, +107, +111, +109, +107, +110, +110, +108, +110, +111, +109, +109, +112, +109, +111, +110, +108, +111, +103, +103, + 47, + 32, + 35, + 2, +-23, +-31, + 2, +-29, +-49, + 22, +-15, +-48, + 36, + -7, +-46, + 41, + -6, +-41, + 39, + -9, +-41, + 37, + -7, +-40, + 37, + -5, +-39, + 27, +-13, +-47, + 22, +-15, +-50, + 26, + -9, +-45, + 30, + -3, +-39, + 36, + 5, +-32, + 50, + 18, +-18, + 53, + 18, +-17, + 56, + 18, +-16, + 57, + 17, +-16, + 59, + 17, +-18, + 49, + 10, +-25, + -7, +-36, +-64, +-50, +-70, +-91, +-63, +-78, +-95, +-70, +-83, +-100, +-73, +-85, +-103, +-63, +-77, +-92, +-33, +-49, +-59, + 29, + 17, + 13, +108, +101, +100, +105, +104, +103, +107, +105, +104, +107, +105, +104, +107, +105, +104, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +104, +102, +101, +103, +101, +100, +103, +101, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, +103, +101, +100, +103, +101, +100, +103, +101, + 99, +107, +106, +106, +108, +106, +104, +108, +106, +103, +110, +108, +107, +110, +108, +107, +110, +108, +107, +111, +109, +108, +111, +109, +108, +110, +108, +107, +109, +107, +107, +109, +107, +107, +110, +108, +107, +111, +109, +108, +110, +107, +106, +109, +107, +106, +107, +105, +104, +112, +109, +109, +111, +109, +108, +112, +110, +108, +113, +110, +110, +113, +110, +110, +113, +110, +110, +113, +110, +110, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +108, +111, +109, +108, +112, +110, +109, +114, +112, +110, +112, +110, +108, +110, +108, +107, +111, +109, +107, +112, +110, +108, +113, +111, +109, +111, +112, +108, +112, +111, +109, +115, +109, +110, +111, +110, +110, +109, +108, +104, + 45, + 32, + 28, +-12, +-31, +-42, +-32, +-52, +-71, +-25, +-49, +-77, + 9, +-22, +-56, + 32, + -9, +-44, + 40, + -9, +-41, + 35, + -7, +-39, + 24, +-15, +-48, + 3, +-34, +-67, + -9, +-43, +-78, + -4, +-36, +-69, + 9, +-22, +-54, + 17, +-15, +-45, + 34, + -1, +-33, + 48, + 11, +-23, + 53, + 16, +-18, + 55, + 20, +-13, + 58, + 19, +-15, + 49, + 10, +-25, +-10, +-38, +-67, +-49, +-66, +-90, +-58, +-73, +-93, +-60, +-79, +-97, +-49, +-77, +-91, + 15, +-24, +-38, + 27, +-10, +-23, + 40, + 33, + 28, +106, +106, +106, +115, +107, +107, +108, +105, +104, +110, +108, +106, +110, +108, +107, +109, +107, +106, +109, +107, +106, +108, +106, +105, +105, +103, +101, +106, +104, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +104, +105, +103, +102, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +105, +103, +101, +102, +100, + 99, +102, +100, + 99, +102, +100, + 98, +100, + 98, + 96, +109, +106, +107, +109, +107, +105, +109, +107, +104, +109, +108, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +107, +109, +107, +105, +101, + 99, + 97, +112, +110, +109, +112, +110, +108, +112, +110, +108, +114, +112, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +114, +112, +110, +114, +112, +110, +112, +109, +108, +108, +106, +104, +113, +111, +109, +115, +113, +112, +110, +112, +108, +113, +110, +109, +117, +108, +111, +112, +112, +112, +113, +114, +109, + 62, + 49, + 44, +-29, +-50, +-60, +-46, +-66, +-81, +-15, +-38, +-58, +-30, +-61, +-85, + 9, +-32, +-60, + 38, +-12, +-41, + 38, + -4, +-43, + 16, +-22, +-62, +-15, +-50, +-86, +-30, +-61, +-94, +-14, +-42, +-72, + 4, +-24, +-53, + 30, + -2, +-35, + 49, + 12, +-24, + 50, + 11, +-28, + 51, + 14, +-24, + 55, + 21, +-14, + 60, + 21, +-14, + 48, + 8, +-26, +-11, +-39, +-68, +-50, +-69, +-94, +-51, +-71, +-93, +-45, +-70, +-91, + 7, +-28, +-48, + 60, + 4, +-15, + 61, + 5, + -8, + 81, + 60, + 57, +106, +105, +106, +110, +104, +103, +101, + 98, + 97, +110, +108, +107, +110, +108, +106, +110, +108, +106, +110, +108, +107, +110, +108, +107, +111, +109, +107, +110, +108, +107, +108, +106, +105, +108, +106, +105, +108, +106, +105, +107, +105, +104, +106, +104, +102, +103, +101, + 99, +110, +108, +107, +109, +107, +105, +107, +105, +103, +107, +105, +104, +107, +105, +103, +106, +104, +102, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +102, +109, +106, +107, +109, +107, +105, +109, +107, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +105, +110, +108, +106, +110, +108, +106, +109, +107, +106, +110, +108, +106, +111, +109, +107, +112, +110, +108, +110, +108, +106, +110, +108, +107, +113, +111, +109, +114, +112, +110, +115, +113, +112, +114, +112, +110, +113, +111, +109, +113, +111, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +115, +113, +111, +115, +113, +112, +113, +111, +109, +111, +109, +107, +111, +109, +107, +113, +111, +109, +114, +112, +111, +112, +112, +108, +114, +110, +109, +116, +109, +111, +111, +111, +111, +114, +112, +108, + 69, + 50, + 46, + 11, +-15, +-28, +-27, +-53, +-72, + 2, +-25, +-45, +-17, +-51, +-75, + 18, +-26, +-55, + 39, +-12, +-46, + 33, +-12, +-61, + 23, +-18, +-66, +-15, +-50, +-92, +-28, +-57, +-92, +-31, +-56, +-83, + -9, +-34, +-62, + 4, +-30, +-70, + 22, +-16, +-59, + 43, + 4, +-41, + 52, + 13, +-29, + 58, + 22, +-16, + 61, + 21, +-15, + 39, + -3, +-36, +-23, +-55, +-84, +-49, +-74, +-101, +-35, +-63, +-88, + 1, +-33, +-57, + 49, + 6, +-26, + 61, + -8, +-36, + 41, +-36, +-48, +105, + 68, + 68, +111, +107, +108, +107, +110, +106, +111, +109, +107, +110, +108, +107, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +108, +106, +105, +111, +109, +108, +110, +108, +106, +110, +108, +107, +110, +108, +107, +109, +107, +105, +111, +109, +107, +109, +107, +106, +108, +106, +105, +109, +107, +105, +109, +107, +105, +107, +105, +104, +107, +105, +104, +107, +105, +104, +108, +106, +105, +109, +107, +105, +109, +107, +105, +107, +105, +103, +109, +106, +107, +109, +107, +105, +108, +107, +104, +110, +108, +106, +110, +108, +107, +110, +108, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +111, +109, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +107, +106, +104, +103, +113, +111, +109, +115, +113, +111, +115, +113, +111, +114, +112, +111, +113, +111, +110, +112, +110, +109, +111, +109, +108, +111, +109, +107, +111, +108, +107, +111, +109, +107, +112, +110, +108, +113, +111, +110, +115, +112, +111, +115, +113, +111, +114, +112, +110, +112, +110, +108, +111, +109, +107, +111, +109, +108, +112, +110, +109, +112, +110, +109, +111, +111, +108, +113, +109, +108, +114, +109, +110, +110, +111, +111, +110, +105, +102, + 65, + 37, + 36, + 22, +-11, +-32, + -7, +-39, +-68, +-13, +-46, +-73, + 13, +-25, +-54, + 64, + 18, +-16, + 51, + -1, +-42, + 26, +-24, +-77, + 23, +-23, +-74, + -7, +-47, +-92, +-18, +-51, +-88, +-13, +-41, +-71, + 12, +-17, +-49, + 24, +-13, +-57, + 26, +-15, +-62, + 40, + -5, +-50, + 54, + 12, +-31, + 61, + 22, +-15, + 62, + 18, +-14, + 32, +-13, +-42, +-22, +-58, +-87, +-34, +-67, +-95, + 9, +-29, +-55, + 57, + 11, +-17, + 42, +-12, +-48, + 58, +-18, +-49, + 43, +-38, +-50, +111, + 73, + 75, +110, +107, +108, +106, +111, +104, +110, +109, +106, +110, +108, +107, +110, +108, +107, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +105, +109, +107, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +109, +106, +108, +110, +108, +106, +110, +108, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +108, +106, +105, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +112, +110, +108, +111, +109, +107, +111, +109, +107, +108, +106, +105, +106, +104, +102, +109, +107, +105, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +110, +108, +106, +108, +106, +104, +107, +105, +104, +109, +107, +105, +109, +107, +105, +109, +107, +104, +112, +106, +106, +111, +106, +108, +107, +110, +109, + 95, + 89, + 87, + 50, + 16, + 17, + 30, +-11, +-29, + 16, +-24, +-45, + 19, +-22, +-36, + 64, + 19, + 2, + 63, + 12, +-13, + 47, +-10, +-42, + 28, +-29, +-69, + 25, +-28, +-71, + 13, +-35, +-77, + -5, +-48, +-89, + 7, +-31, +-71, + 24, +-13, +-54, + 35, + -5, +-49, + 46, + 2, +-43, + 58, + 10, +-33, + 61, + 14, +-23, + 63, + 19, +-12, + 64, + 17, +-11, + 47, + -1, +-29, + 16, +-24, +-52, + 4, +-34, +-61, + 55, + 9, +-21, + 56, + 2, +-31, + 59, + -3, +-38, + 78, + 3, +-26, + 60, + -5, +-17, +118, + 95, + 95, +106, +110, +110, +110, +110, +103, +110, +108, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +108, +106, +104, +109, +106, +105, +109, +107, +105, +108, +106, +104, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +103, +104, +109, +107, +105, +108, +107, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +111, +109, +107, +109, +107, +105, +109, +107, +105, +108, +106, +105, +107, +105, +103, +109, +107, +106, +110, +108, +106, +109, +107, +105, +109, +107, +105, +111, +109, +108, +111, +109, +107, +109, +107, +106, +109, +107, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +109, +107, +106, +110, +109, +107, +109, +107, +106, +109, +107, +106, +108, +106, +105, +106, +105, +103, +109, +107, +106, +110, +108, +107, +110, +108, +106, +110, +108, +106, +109, +108, +105, +112, +106, +105, +110, +107, +107, +107, +110, +109, + 89, + 82, + 81, + 35, + -2, + -1, + 33, +-15, +-22, + 37, +-11, +-15, + 60, + 11, + 15, + 54, + 1, + 4, + 50, + -9, +-14, + 50, +-14, +-26, + 37, +-25, +-51, + 31, +-28, +-60, + 35, +-19, +-57, + 28, +-24, +-67, + 23, +-25, +-73, + 28, +-16, +-64, + 43, + 0, +-42, + 57, + 10, +-30, + 62, + 12, +-27, + 62, + 13, +-20, + 64, + 18, + -9, + 66, + 18, + -7, + 60, + 11, +-16, + 46, + 4, +-24, + 54, + 11, +-18, + 67, + 16, +-15, + 44, +-17, +-52, + 40, +-26, +-58, + 55, +-12, +-37, + 81, + 37, + 25, +112, +108, +104, + 99, +110, +108, +112, +107, +100, +109, +106, +103, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +104, +102, +100, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +102, + 96, +101, +108, +106, +105, +107, +107, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +109, +107, +105, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +108, +109, +108, +107, +109, +109, +108, +110, +110, +109, +111, +110, +109, +111, +107, +106, +108, +107, +106, +109, +111, +110, +113, +111, +110, +112, +110, +109, +111, +110, +109, +112, +110, +109, +111, +109, +108, +110, +109, +108, +110, +109, +108, +110, +110, +108, +111, +110, +108, +111, +108, +109, +109, +111, +110, +107, +112, +110, +107, +110, +111, +114, +101, + 91, + 94, + 40, + 2, + -2, + 32, +-17, +-33, + 34, +-17, +-23, + 56, + 2, + 3, + 43, +-15, +-23, + 50, +-16, +-28, + 58, +-15, +-22, + 44, +-26, +-38, + 40, +-26, +-46, + 39, +-22, +-53, + 34, +-23, +-62, + 32, +-23, +-63, + 45, + -6, +-46, + 54, + 10, +-29, + 56, + 12, +-26, + 54, + 11, +-26, + 57, + 16, +-19, + 61, + 22, +-11, + 60, + 19, + -9, + 52, + 13, +-15, + 50, + 12, +-19, + 60, + 17, +-16, + 68, + 13, +-22, + 44, +-22, +-57, + 48, +-16, +-50, + 63, + 13, +-11, + 93, + 69, + 62, +112, +105, +108, +108, +105, +110, +112, +105, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 87, + 80, + 86, +107, +104, +104, +107, +108, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +106, +109, +107, +105, +109, +107, +105, +110, +109, +110, +117, +116, +118, +117, +117, +119, +117, +116, +119, +118, +118, +120, +117, +116, +119, +117, +116, +118, +117, +117, +119, +117, +116, +119, +117, +116, +119, +117, +116, +119, +117, +116, +118, +115, +115, +117, +115, +115, +117, +116, +116, +118, +117, +116, +119, +117, +116, +119, +117, +116, +118, +119, +117, +115, +119, +117, +114, +115, +116, +120, +114, +104, +109, + 44, + 9, + 4, + 24, +-25, +-46, + 35, +-17, +-27, + 33, +-21, +-24, + 45, +-13, +-24, + 51, +-15, +-29, + 55, +-19, +-24, + 46, +-24, +-36, + 28, +-38, +-59, + 37, +-26, +-56, + 43, +-15, +-52, + 47, +-10, +-47, + 56, + 3, +-33, + 53, + 10, +-28, + 52, + 9, +-28, + 56, + 15, +-21, + 58, + 18, +-16, + 59, + 20, +-13, + 56, + 18, +-14, + 51, + 13, +-18, + 48, + 9, +-24, + 63, + 20, +-15, + 56, + 3, +-33, + 65, + 3, +-32, + 74, + 18, +-14, + 55, + 15, + -5, +115, + 95, + 89, +112, +106, +109, +110, +107, +110, +112, +106, +106, +109, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 72, + 66, + 71, +108, +105, +104, +106, +107, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +106, +104, +102, +105, +103, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +107, +109, +114, +113, +115, +110, +109, +112, +110, +110, +112, +114, +113, +115, +114, +113, +115, +110, +109, +112, +111, +110, +113, +114, +113, +116, +111, +110, +113, +111, +111, +113, +112, +111, +114, +110, +109, +112, +110, +109, +112, +112, +111, +113, +112, +111, +114, +112, +111, +114, +111, +110, +113, +112, +108, +108, +115, +113, +112, +115, +118, +123, +117, +110, +115, + 48, + 17, + 13, + 24, +-23, +-47, + 14, +-37, +-52, + 32, +-19, +-25, + 49, + -5, +-19, + 51, + -9, +-25, + 38, +-31, +-37, + 44, +-20, +-36, + 31, +-31, +-55, + 26, +-34, +-66, + 41, +-18, +-53, + 56, + -3, +-38, + 58, + 3, +-30, + 52, + 10, +-27, + 55, + 15, +-21, + 60, + 20, +-15, + 59, + 21, +-13, + 56, + 19, +-13, + 53, + 16, +-18, + 51, + 12, +-23, + 51, + 11, +-24, + 64, + 19, +-16, + 64, + 14, +-20, + 71, + 17, +-17, + 70, + 26, + 1, + 91, + 63, + 47, +117, +104, + 98, +109, +106, +106, +107, +106, +107, +110, +106, +103, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 58, + 52, + 58, +104, +102, +101, +106, +107, +103, +107, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +108, +106, +103, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +106, +107, +116, +115, +117, +114, +113, +116, +115, +114, +116, +115, +115, +117, +114, +114, +116, +116, +115, +118, +114, +114, +116, +116, +116, +118, +115, +115, +117, +115, +114, +117, +114, +114, +116, +114, +114, +116, +114, +114, +116, +115, +115, +117, +117, +116, +118, +117, +116, +118, +116, +115, +119, +118, +114, +116, +117, +114, +115, +112, +116, +122, +116, +113, +118, + 51, + 25, + 21, + 22, +-21, +-44, + 1, +-43, +-60, + 2, +-41, +-51, + 17, +-27, +-45, + 16, +-33, +-55, + 20, +-37, +-52, + 19, +-36, +-58, + 28, +-26, +-54, + 28, +-25, +-59, + 34, +-19, +-56, + 51, + -4, +-38, + 57, + 5, +-27, + 54, + 13, +-22, + 58, + 18, +-17, + 58, + 20, +-13, + 57, + 20, +-12, + 48, + 12, +-19, + 49, + 12, +-21, + 49, + 9, +-26, + 55, + 12, +-22, + 57, + 10, +-20, + 61, + 13, +-15, + 65, + 18, +-10, + 64, + 35, + 19, +112, + 96, + 86, +111, +105, +101, +105, +105, +104, +105, +106, +104, +107, +106, +101, +108, +106, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +102, +100, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 49, + 42, + 48, + 99, + 97, + 96, +104, +104, +100, +106, +104, +102, +106, +104, +102, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +107, +109, +115, +115, +117, +113, +113, +115, +114, +113, +115, +113, +112, +115, +114, +113, +116, +114, +114, +116, +115, +114, +117, +113, +113, +115, +115, +114, +116, +114, +114, +116, +116, +115, +117, +116, +115, +118, +116, +115, +118, +116, +116, +118, +117, +117, +119, +117, +117, +119, +119, +116, +121, +121, +116, +119, +120, +117, +119, +111, +117, +124, +113, +111, +118, + 49, + 26, + 22, + 13, +-23, +-44, + 6, +-31, +-45, + 14, +-20, +-32, + 1, +-32, +-57, + -3, +-39, +-72, + 15, +-26, +-54, + 14, +-29, +-57, + 24, +-19, +-52, + 24, +-20, +-58, + 24, +-21, +-60, + 49, + 1, +-34, + 59, + 12, +-20, + 57, + 18, +-16, + 59, + 20, +-13, + 58, + 21, +-11, + 52, + 17, +-14, + 47, + 13, +-17, + 48, + 11, +-21, + 49, + 7, +-24, + 62, + 15, +-12, + 54, + 4, +-18, + 60, + 13, + -6, + 60, + 18, + 1, + 92, + 76, + 66, +111, +106, +100, +108, +107, +104, +105, +108, +105, +105, +108, +103, +107, +107, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +102, +104, +102, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +104, +102, +100, +102, +100, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 45, + 39, + 47, + 88, + 85, + 87, +104, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +106, +108, +113, +113, +115, +108, +108, +110, +111, +111, +113, +112, +111, +114, +112, +111, +114, +110, +109, +112, +110, +110, +112, +110, +109, +112, +109, +109, +111, +110, +109, +112, +111, +110, +113, +117, +117, +118, +117, +117, +118, +117, +117, +119, +118, +117, +120, +118, +117, +120, +117, +117, +121, +119, +115, +120, +119, +116, +120, +111, +117, +123, +112, +112, +116, + 39, + 19, + 14, + 14, +-19, +-36, + 18, +-17, +-30, + 5, +-28, +-41, + -4, +-34, +-62, + 2, +-28, +-67, + 23, +-10, +-46, + 25, + -9, +-41, + 22, +-13, +-47, + 20, +-17, +-56, + 25, +-15, +-54, + 41, + -1, +-37, + 57, + 14, +-20, + 55, + 19, +-15, + 56, + 19, +-15, + 54, + 19, +-13, + 52, + 17, +-14, + 50, + 16, +-15, + 47, + 11, +-20, + 50, + 7, +-20, + 65, + 17, + -3, + 57, + 11, + -3, + 83, + 47, + 38, +108, + 78, + 72, +116, +106, +102, +107, +107, +105, +103, +104, +102, +104, +106, +103, +105, +106, +101, +106, +106, +100, +108, +106, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +106, +104, +102, +105, +103, +102, +105, +103, +101, +106, +104, +102, +105, +103, +101, +103, +101, +100, +102, +100, + 98, +103, +101, +100, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 43, + 39, + 52, + 73, + 69, + 77, +105, +101, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +105, +103, +101, +105, +103, +101, +105, +103, +102, +106, +104, +103, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +105, +103, +104, +106, +104, +106, +107, +105, +107, +106, +105, +106, +106, +105, +106, +106, +105, +106, +105, +104, +105, +104, +104, +105, +104, +104, +105, +104, +103, +104, +104, +103, +104, +104, +103, +104, +104, +104, +104, +104, +104, +104, +104, +104, +104, +105, +105, +105, +105, +105, +105, + 99, +104, +105, +100, +101, +106, +106, +100, +107, +102, +103, +104, +101, +100, + 95, + 36, + 18, + 9, + 21, +-11, +-24, + 14, +-22, +-38, + -3, +-43, +-61, + 10, +-31, +-55, + 16, +-22, +-52, + 22, +-12, +-45, + 30, + -4, +-31, + 35, + -1, +-28, + 31, + -7, +-38, + 32, + -8, +-42, + 35, + -7, +-44, + 50, + 10, +-27, + 50, + 19, +-17, + 50, + 19, +-17, + 51, + 18, +-18, + 52, + 18, +-17, + 49, + 13, +-21, + 50, + 15, +-16, + 54, + 12, +-11, + 60, + 13, + -1, + 65, + 37, + 29, +111, +103, +100, +111, +105, +110, +109, +106, +107, +106, +104, +102, +102, +100, + 98, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +105, +109, +107, +105, +106, +104, +102, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +104, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +105, +103, +101, +104, +102, +100, +106, +104, +103, +105, +103, +102, +103, +101, +100, +100, + 98, + 97, +101, + 99, + 98, +104, +102, +101, +104, +102, +100, +103, +101, +100, + 43, + 39, + 53, + 60, + 55, + 64, +105, +101, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +107, +105, +103, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +106, +102, +101, +102, + 98, + 97, +101, + 97, + 96, +101, + 97, + 96, +101, + 97, + 96, +101, + 97, + 96, +102, + 98, + 97, +102, + 98, + 97, +102, + 98, + 97, +103, + 99, + 98, +102, + 98, + 97, +103, + 99, + 98, +102, + 99, + 96, +102, + 99, + 96, +103, +100, + 97, +104, +101, + 98, +104, +101, + 98, +101, +102, +100, +102, +100, +102, +106, + 97, +102, +101, + 98, + 98, +102, +100, + 92, + 44, + 25, + 15, + 12, +-15, +-30, +-13, +-45, +-61, +-39, +-75, +-93, + 0, +-38, +-62, + 18, +-17, +-46, + 18, +-14, +-46, + 4, +-39, +-63, + 13, +-31, +-55, + 28, +-15, +-45, + 34, + -8, +-42, + 40, + 0, +-36, + 43, + 5, +-32, + 45, + 14, +-21, + 49, + 16, +-17, + 51, + 16, +-17, + 50, + 14, +-19, + 50, + 12, +-20, + 50, + 13, +-18, + 57, + 13, +-10, + 54, + 8, + -5, + 84, + 60, + 53, +112, +105, +103, +109, +105, +108, +109, +106, +106, +107, +105, +104, +105, +103, +101, +107, +105, +103, +108, +106, +104, +108, +106, +104, +109, +107, +105, +108, +106, +104, +104, +102, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +106, +104, +102, +105, +103, +101, +104, +102, +101, +103, +101, + 99, +102, +100, + 98, +104, +102, +101, +104, +102, +100, +103, +101, + 99, + 37, + 32, + 49, + 48, + 43, + 55, +100, + 96, +102, +106, +103, +103, +106, +104, +102, +105, +103, +102, +104, +102, +101, +104, +102, +101, +104, +102, +100, +103, +101, + 99, +106, +104, +102, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +108, +105, +104, +109, +104, +103, +109, +102, +102, +108, +101, +101, +107, +101, +101, +106, +100, +100, +107, +101, +100, +108, +103, +102, +108, +103, +103, +108, +103, +103, +106, +102, +101, +108, +103, +102, +107, +102, +101, +106, +102, + 99, +106, +102, + 98, +107, +103, + 99, +108, +104, +101, +108, +104, +101, +106, +105, +101, +108, +103, +102, +109, + 98, +102, +102, + 99, + 97, +107, +104, + 96, + 54, + 36, + 28, + 9, +-25, +-36, + 16, +-25, +-37, + 3, +-44, +-57, + -4, +-54, +-72, + 1, +-47, +-71, + 1, +-45, +-72, + 4, +-50, +-73, + 12, +-40, +-65, + 17, +-31, +-59, + 24, +-18, +-50, + 44, + 6, +-29, + 40, + 4, +-31, + 45, + 11, +-21, + 48, + 13, +-19, + 51, + 14, +-17, + 50, + 12, +-19, + 51, + 11, +-19, + 53, + 12, +-18, + 56, + 9, +-15, + 54, + 8, + -3, +101, + 80, + 74, +111, +108, +105, +109, +106, +107, +110, +107, +106, +108, +106, +104, +107, +105, +103, +106, +104, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +104, +107, +105, +104, +107, +105, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +104, +102, +101, +106, +104, +102, +105, +103, +101, +104, +102, +101, +105, +103, +101, +103, +101, +100, +105, +103, +101, +104, +102, +100, +104, +102, +100, + 32, + 26, + 45, + 42, + 37, + 50, + 90, + 86, + 93, +102, +100, + 99, +102, +100, + 98, +102, +100, + 99, +103, +101, +100, +103, +101, +100, +103, +101, + 99, +102, +100, + 98, +104, +102, +100, +106, +104, +102, +105, +103, +102, +105, +103, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +104, +102, +100, +106, +104, +102, +102, + 98, + 99, + 95, + 91, + 93, + 91, + 88, + 89, + 91, + 87, + 89, + 85, + 81, + 83, + 85, + 81, + 83, + 87, + 85, + 87, + 87, + 85, + 86, + 87, + 84, + 86, + 86, + 84, + 85, + 86, + 84, + 85, + 85, + 83, + 84, + 84, + 83, + 82, + 83, + 81, + 80, + 82, + 81, + 79, + 83, + 81, + 80, + 83, + 81, + 80, + 82, + 82, + 80, + 86, + 81, + 82, + 86, + 76, + 81, + 79, + 79, + 80, + 80, + 82, + 77, + 48, + 36, + 30, + 12, +-25, +-32, + 18, +-29, +-37, + 9, +-46, +-55, + 12, +-48, +-62, + 15, +-44, +-63, + 28, +-29, +-51, + 40, +-15, +-40, + 41, +-11, +-38, + 31, +-15, +-44, + 19, +-22, +-53, + 39, + 2, +-31, + 42, + 8, +-25, + 45, + 9, +-21, + 50, + 13, +-17, + 50, + 11, +-18, + 51, + 10, +-18, + 52, + 10, +-18, + 56, + 11, +-19, + 53, + 3, +-21, + 57, + 11, + 2, +109, + 89, + 86, +106, +106, +103, +107, +105, +103, +109, +106, +105, +107, +105, +103, +109, +107, +105, +106, +104, +102, +106, +104, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, + 20, + 14, + 34, + 38, + 31, + 46, + 74, + 69, + 78, +101, + 99, + 98, +101, + 99, + 97, +102, +100, + 98, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +104, +102, +100, +104, +102, +100, + 50, + 50, + 53, +-38, +-38, +-32, +-36, +-36, +-30, +-39, +-38, +-33, +-46, +-46, +-40, +-49, +-48, +-42, +-49, +-46, +-41, +-50, +-47, +-42, +-50, +-48, +-42, +-50, +-47, +-42, +-51, +-48, +-42, +-51, +-48, +-44, +-50, +-47, +-44, +-50, +-47, +-44, +-50, +-46, +-43, +-49, +-45, +-42, +-49, +-45, +-42, +-49, +-45, +-44, +-46, +-48, +-45, +-45, +-50, +-43, +-50, +-45, +-40, +-53, +-46, +-45, +-20, +-28, +-28, + 13, +-13, +-20, + 3, +-33, +-43, + -2, +-47, +-58, + -1, +-52, +-67, + 4, +-48, +-67, + 18, +-32, +-55, + 26, +-19, +-50, + 25, +-18, +-49, + 28, +-14, +-44, + 20, +-18, +-50, + 32, + -4, +-36, + 43, + 9, +-22, + 43, + 6, +-21, + 49, + 10, +-17, + 50, + 10, +-17, + 51, + 8, +-17, + 52, + 8, +-17, + 55, + 6, +-22, + 54, + 0, +-25, + 65, + 21, + 12, +114, + 95, + 93, +102, +104, +101, +103, +102, + 99, +105, +102, +100, +105, +103, +102, +106, +104, +103, +104, +102, +101, +105, +103, +102, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +-26, +-29, +-16, + 32, + 28, + 42, + 60, + 56, + 67, +103, +100, +102, +103, +101, +101, +101, + 99, + 98, +104, +102, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +106, +103, +102, +106, +103, +102, +105, +103, +101, +104, +102, +100, +102, +100, + 99, + 46, + 45, + 49, +-36, +-35, +-27, + 57, + 63, + 70, + 59, + 68, + 72, + 62, + 71, + 72, + 61, + 70, + 69, + 63, + 71, + 72, + 62, + 70, + 72, + 63, + 71, + 73, + 64, + 72, + 75, + 65, + 73, + 77, + 64, + 72, + 78, + 62, + 70, + 78, + 64, + 71, + 78, + 71, + 78, + 83, + 73, + 79, + 81, + 73, + 80, + 79, + 75, + 81, + 83, + 76, + 78, + 86, + 74, + 76, + 83, + 72, + 79, + 84, + 73, + 82, + 83, + 77, + 80, + 79, + 32, + 21, + 20, + 15, +-13, +-20, + 10, +-34, +-47, + -7, +-54, +-68, +-13, +-58, +-74, + 1, +-44, +-65, + 11, +-31, +-60, + 17, +-23, +-54, + 23, +-16, +-47, + 24, +-12, +-45, + 32, + -2, +-36, + 43, + 9, +-23, + 45, + 7, +-21, + 50, + 10, +-17, + 49, + 7, +-20, + 52, + 6, +-21, + 52, + 5, +-23, + 55, + 3, +-25, + 57, + 2, +-21, + 71, + 30, + 18, +113, + 99, + 97, +100, +103, +104, +102, +101, + 98, +104, +101, + 98, +103, +101, +100, +102, +100, + 98, +100, + 98, + 97, +104, +102, +100, +105, +102, +101, +104, +102, +100, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +101, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +-74, +-74, +-67, + 22, + 20, + 33, + 47, + 44, + 59, +100, + 97, +101, +104, +101, +104, +103, +100, +101, +103, +101, +101, +104, +102, +101, +103, +101, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +102, +100, + 98, + 92, + 90, + 88, + 35, + 32, + 37, +-45, +-45, +-36, + 8, + 17, + 25, + 22, + 35, + 40, + 22, + 35, + 35, + 25, + 37, + 32, + 23, + 33, + 32, + 19, + 29, + 29, + 22, + 31, + 33, + -3, + 6, + 9, + 17, + 25, + 30, + 8, + 17, + 22, + 13, + 25, + 26, + 25, + 34, + 37, + 86, + 94, + 97, + 89, + 95, + 99, + 90, + 95, + 98, + 89, + 94, + 99, + 88, + 94, +100, + 76, + 82, + 87, + 79, + 85, + 88, + 78, + 85, + 86, + 84, + 91, + 91, + 75, + 72, + 75, + 15, +-11, +-18, + 11, +-36, +-56, + 8, +-40, +-60, + 5, +-39, +-59, + 20, +-25, +-52, + 18, +-26, +-52, + 30, +-12, +-39, + 33, + -6, +-35, + 39, + 2, +-30, + 39, + 5, +-30, + 41, + 7, +-27, + 49, + 11, +-18, + 49, + 10, +-19, + 50, + 6, +-23, + 54, + 6, +-24, + 53, + 4, +-27, + 54, + 2, +-26, + 57, + 4, +-21, + 59, + 21, + 3, + 86, + 75, + 73, + 99, +102, +106, +104, +101, + 98, +105, +101, + 98, +104, +102, +100, +104, +102, +100, +104, +102, +100, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +103, +102, +104, +102, +101, +103, +101, + 99, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +104, +102, +100, +-103, +-103, +-96, + 3, + 1, + 14, + 39, + 37, + 51, + 93, + 89, + 94, +105, +102, +105, +103, +100, +101, +104, +101, +101, +103, +101, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +103, +101, +100, +100, + 98, + 97, + 91, + 89, + 88, + 38, + 34, + 41, +-52, +-52, +-40, +-19, +-12, + 0, + -6, + 6, + 15, + -8, + 4, + 8, + 1, + 11, + 12, + -1, + 7, + 11, + 1, + 10, + 15, + -1, + 8, + 15, +-38, +-30, +-21, +-31, +-24, +-13, +-36, +-27, +-19, +-22, + -9, +-13, + 1, + 12, + 10, + 87, + 95, + 97, + 88, + 93, +100, + 89, + 91, +104, + 89, + 93, +100, + 86, + 94, + 94, + 87, + 94, + 96, + 87, + 93, + 97, + 87, + 93, + 99, + 89, + 95, +102, + 65, + 65, + 70, + 19, + 0, + -7, + 10, +-30, +-54, + 14, +-25, +-53, + 13, +-20, +-52, + 20, +-16, +-54, + 32, + -8, +-35, + 39, + 0, +-26, + 45, + 6, +-22, + 45, + 8, +-23, + 39, + 5, +-28, + 40, + 6, +-27, + 44, + 6, +-24, + 43, + 4, +-27, + 49, + 7, +-25, + 54, + 7, +-24, + 57, + 8, +-23, + 59, + 7, +-25, + 60, + 10, +-22, + 48, + 9, +-16, + 27, + 17, + 10, + 97, +100, +100, +104, +104, + 98, +105, +102, + 99, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +105, +103, +102, +105, +103, +102, +107, +105, +103, +107, +105, +104, +106, +104, +103, +102, +100, + 98, +103, +100, + 99, +103, +101, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +100, + 98, + 97, +103, +101, + 99, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +102, +100, + 98, +102, +100, + 99, +104, +102, +100, +-90, +-92, +-86, +-24, +-27, +-15, + 38, + 33, + 49, + 78, + 74, + 78, +104, +100, +104, +104, +101, +103, +104, +102, +101, +103, +101, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +100, + 98, + 96, + 91, + 89, + 87, + 40, + 36, + 42, +-55, +-55, +-44, +-29, +-22, + -9, +-35, +-23, +-12, +-36, +-25, +-16, +-32, +-23, +-17, +-38, +-26, +-19, +-36, +-24, +-16, +-37, +-26, +-16, +-41, +-31, +-19, +-39, +-28, +-15, +-27, +-17, + -2, +-29, +-22, + -3, + -8, + -1, + 9, + 84, + 93, + 95, + 80, + 87, + 85, + 80, + 86, + 85, + 83, + 90, + 89, + 85, + 92, + 93, + 87, + 93, + 97, + 87, + 92, +102, + 74, + 78, + 92, + 40, + 43, + 60, + 11, + 13, + 28, + 51, + 36, + 40, + 15, +-23, +-35, + 17, +-18, +-36, + 21, +-10, +-32, + 29, + -3, +-34, + 39, + 4, +-23, + 40, + 4, +-23, + 37, + 1, +-26, + 35, + 0, +-29, + 38, + 3, +-29, + 43, + 7, +-25, + 42, + 5, +-26, + 47, + 8, +-25, + 52, + 10, +-23, + 57, + 10, +-24, + 61, + 13, +-21, + 63, + 13, +-21, + 63, + 15, +-21, + 45, + 6, +-24, + -5, +-17, +-29, + 75, + 78, + 77, + 99, +100, + 97, +102, +100, + 97, +104, +102, +100, +102, +100, + 98, + 98, + 96, + 94, +106, +104, +102, +105, +103, +102, +106, +103, +102, +106, +104, +102, +106, +104, +103, +105, +103, +102, +104, +102, +101, +104, +102, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +101, + 99, + 97, +104, +102, +101, +106, +104, +102, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +-49, +-53, +-46, +-55, +-60, +-48, + 35, + 28, + 44, + 64, + 61, + 65, +102, + 99, +102, +103, +100, +102, +104, +102, +102, +104, +102, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +106, +104, +102, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +100, + 98, + 97, + 92, + 90, + 88, + 43, + 41, + 42, +-57, +-56, +-50, +-28, +-20, +-11, +-34, +-22, +-13, +-35, +-23, +-15, +-32, +-23, +-17, +-38, +-26, +-19, +-38, +-25, +-18, +-39, +-26, +-17, +-37, +-25, +-15, +-36, +-24, +-12, + -6, + 3, + 21, + -8, + -3, + 25, +-10, + -3, + 10, + 87, + 95, + 96, + 85, + 93, + 89, + 87, + 93, + 90, + 86, + 91, + 95, + 76, + 81, + 92, + 61, + 64, + 79, + 31, + 34, + 51, + -7, + -6, + 18, +-22, +-22, + 4, + 21, + 21, + 43, + 32, + 17, + 28, + -5, +-43, +-47, + -2, +-39, +-47, + 4, +-28, +-39, + 16, +-18, +-37, + 22, +-10, +-35, + 26, + -6, +-33, + 31, + -3, +-30, + 35, + 0, +-28, + 38, + 3, +-27, + 43, + 7, +-24, + 47, + 11, +-23, + 50, + 11, +-23, + 55, + 13, +-22, + 60, + 14, +-21, + 63, + 15, +-20, + 60, + 13, +-22, + 59, + 12, +-23, + 38, + -3, +-34, +-14, +-30, +-39, + 52, + 52, + 55, + 63, + 64, + 68, +104, +102, +102, +107, +105, +103, +107, +105, +103, +103, +101, +100, +107, +105, +103, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +105, +103, +102, +104, +101, +100, +101, + 99, + 97, +103, +101, + 99, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, + -8, +-12, + -5, +-85, +-90, +-78, + 25, + 19, + 34, + 52, + 48, + 53, +102, + 99, +102, +106, +103, +104, +106, +103, +103, +106, +104, +102, +106, +104, +103, +107, +105, +104, +107, +105, +104, +106, +104, +103, +105, +103, +101, +105, +103, +101, +104, +102, +101, +103, +101, + 99, +102, +100, + 98, +102, +100, + 98, +100, + 98, + 97, + 92, + 90, + 88, + 47, + 46, + 44, +-60, +-58, +-57, +-30, +-21, +-17, +-32, +-19, +-13, +-32, +-20, +-15, +-24, +-14, +-11, +-37, +-23, +-20, +-37, +-22, +-18, +-38, +-24, +-18, +-39, +-25, +-18, +-37, +-24, +-15, +-26, +-14, + -4, +-15, + -5, + 5, +-14, + -4, + -2, + 84, + 93, + 92, + 74, + 80, + 86, + 55, + 55, + 72, + 23, + 23, + 45, + 0, + 0, + 25, +-15, +-15, + 10, +-26, +-27, + 1, +-30, +-31, + -1, +-39, +-41, + -9, + 28, + 28, + 42, + 7, + -8, + -8, +-11, +-49, +-62, +-15, +-54, +-67, + -5, +-40, +-53, + 13, +-23, +-42, + 23, + -7, +-31, + 27, + -3, +-28, + 34, + 2, +-25, + 39, + 4, +-23, + 44, + 7, +-20, + 45, + 8, +-21, + 50, + 13, +-21, + 52, + 14, +-21, + 54, + 12, +-23, + 57, + 11, +-25, + 56, + 9, +-28, + 55, + 8, +-24, + 49, + 2, +-29, + 27, +-15, +-42, + 13, + -4, +-10, + 51, + 49, + 56, + -5, + -5, + 6, + 86, + 84, + 86, +108, +106, +105, +108, +106, +105, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 11, + 13, + 20, +-110, +-108, +-100, + 4, + 5, + 16, + 42, + 38, + 48, + 93, + 89, + 95, +106, +103, +104, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +103, +101, +100, +103, +101, + 99, +103, +101, + 99, +100, + 98, + 97, + 92, + 90, + 89, + 50, + 48, + 49, +-60, +-57, +-55, +-34, +-24, +-23, +-41, +-27, +-25, +-45, +-31, +-28, +-42, +-31, +-26, +-49, +-37, +-30, +-48, +-36, +-28, +-40, +-29, +-19, +-38, +-28, +-14, +-40, +-31, +-15, +-25, +-18, + 1, + -8, + -6, + 18, + -3, + 0, + 22, + 8, + 10, + 30, + -8, + -8, + 17, +-23, +-25, + 6, +-35, +-37, + -5, +-31, +-33, + -2, +-32, +-33, + -4, +-36, +-36, + -8, +-39, +-39, +-12, +-48, +-48, +-21, + 34, + 35, + 44, + 13, + 1, + -5, + -7, +-43, +-68, + 4, +-41, +-71, + -5, +-50, +-73, + 6, +-36, +-51, + 20, +-13, +-33, + 31, + -3, +-25, + 39, + 3, +-20, + 45, + 8, +-17, + 46, + 8, +-19, + 46, + 7, +-22, + 46, + 6, +-27, + 46, + 6, +-27, + 48, + 6, +-26, + 43, + -1, +-33, + 41, + -6, +-38, + 42, +-12, +-41, + 32, +-20, +-49, + 11, +-22, +-49, + 59, + 51, + 39, + 42, + 43, + 50, +-45, +-44, +-18, + -5, + -6, + 12, + 68, + 66, + 79, +102, +101, +109, +104, +103, +105, +103, +102, +100, +105, +104, + 98, +106, +105, +101, +106, +104, +102, +106, +104, +103, +106, +103, +104, +106, +103, +104, +106, +103, +104, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 28, + 29, + 38, +-94, +-94, +-86, +-21, +-21, +-11, + 40, + 35, + 47, + 82, + 78, + 85, +104, +101, +102, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +102, +100, + 98, + 99, + 97, + 96, + 91, + 89, + 87, + 52, + 50, + 52, +-60, +-58, +-54, +-25, +-16, +-11, +-21, + -8, + -1, +-43, +-33, +-21, +-31, +-23, + -8, +-25, +-19, + -1, +-15, + -9, + 10, +-10, + -4, + 17, + -5, + 0, + 24, + -4, + 1, + 26, + -9, + -7, + 21, +-13, +-14, + 17, +-18, +-19, + 12, +-25, +-26, + 5, +-37, +-39, + -8, +-45, +-46, +-15, +-49, +-50, +-20, +-42, +-43, +-14, +-45, +-46, +-17, +-47, +-47, +-21, +-55, +-55, +-31, +-60, +-60, +-36, + 37, + 39, + 50, + 27, + 18, + 14, + -7, +-38, +-62, + 12, +-33, +-67, + 7, +-41, +-70, + -8, +-50, +-71, + 13, +-26, +-46, + 28, +-11, +-33, + 37, + -4, +-27, + 42, + -1, +-25, + 40, + -3, +-30, + 38, + -5, +-33, + 38, + -8, +-36, + 40, + -6, +-35, + 40, + -8, +-38, + 31, +-18, +-51, + 33, +-19, +-53, + 27, +-27, +-64, + 17, +-30, +-62, + 18, + -5, +-24, + 79, + 72, + 70, + 36, + 36, + 48, +-56, +-56, +-28, +-39, +-41, +-14, +-27, +-29, + -6, + 35, + 33, + 49, + 94, + 92, +101, +104, +103, +106, +104, +103, +102, +107, +105, +101, +107, +105, +102, +107, +105, +103, +107, +105, +103, +107, +105, +104, +106, +104, +103, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 50, + 45, + 59, +-54, +-58, +-48, +-50, +-53, +-45, + 37, + 32, + 44, + 68, + 63, + 71, +103, +100, +102, +102, +100, + 99, +102, +100, + 99, +103, +100, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +106, +104, +102, +105, +103, +101, +102, + 99, + 98, +102, +100, + 98, +100, + 98, + 96, + 92, + 90, + 88, + 55, + 52, + 53, +-60, +-60, +-55, +-28, +-22, +-10, +-14, + -6, + 13, +-12, + -7, + 18, + -4, + -2, + 27, + -5, + -4, + 26, + -9, + -8, + 23, +-13, +-12, + 20, +-16, +-16, + 17, +-25, +-25, + 8, +-32, +-32, + 0, +-31, +-31, + -3, +-38, +-38, +-10, +-44, +-45, +-17, +-50, +-50, +-22, +-52, +-53, +-25, +-43, +-44, +-16, +-45, +-45, +-18, +-55, +-55, +-29, +-60, +-60, +-37, +-71, +-70, +-49, +-78, +-77, +-56, + 36, + 38, + 49, + 43, + 37, + 36, + -1, +-24, +-43, + 13, +-24, +-57, + 17, +-26, +-61, + 10, +-33, +-65, + 13, +-32, +-56, + 28, +-17, +-42, + 33, +-14, +-39, + 36, +-12, +-37, + 33, +-17, +-42, + 30, +-21, +-44, + 29, +-25, +-43, + 29, +-27, +-50, + 26, +-31, +-62, + 27, +-30, +-67, + 31, +-24, +-64, + 21, +-25, +-69, + 2, +-29, +-64, + 58, + 40, + 33, + 83, + 74, + 87, + 15, + 12, + 33, +-60, +-59, +-37, +-51, +-52, +-26, +-44, +-46, +-18, +-30, +-32, + -9, + -1, + -3, + 15, + 49, + 47, + 60, + 92, + 89, + 99, +106, +104, +107, +106, +105, +105, +106, +105, +104, +105, +105, +103, +105, +106, +101, +105, +105, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 34, + 27, + 44, +-12, +-17, + -6, +-80, +-83, +-77, + 29, + 24, + 36, + 55, + 50, + 58, +100, + 97, + 98, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +103, +101, + 99, +104, +102, +100, +103, +101, +100, +100, + 98, + 96, + 98, + 96, + 94, + 90, + 88, + 86, + 58, + 54, + 53, +-55, +-58, +-52, +-25, +-23, + -5, +-28, +-24, + 3, +-35, +-34, + -1, +-24, +-26, + 9, +-23, +-26, + 11, +-28, +-31, + 5, +-31, +-34, + 2, +-38, +-41, + -5, +-43, +-45, +-10, +-48, +-49, +-17, +-51, +-50, +-25, +-55, +-54, +-29, +-57, +-57, +-32, +-58, +-58, +-33, +-62, +-62, +-37, +-69, +-68, +-45, +-57, +-56, +-34, +-62, +-61, +-39, +-72, +-70, +-51, +-86, +-84, +-67, +-89, +-86, +-69, + 12, + 16, + 25, + -6, + -8, + -9, + 21, + 8, + -8, + 6, +-20, +-52, + 15, +-22, +-61, + 23, +-22, +-61, + 18, +-30, +-60, + 27, +-21, +-50, + 33, +-19, +-46, + 37, +-16, +-43, + 34, +-20, +-46, + 28, +-29, +-50, + 24, +-34, +-49, + 24, +-37, +-59, + 23, +-38, +-69, + 25, +-31, +-66, + 21, +-28, +-63, + 11, +-19, +-55, + 41, + 27, + 6, + 82, + 69, + 71, + 77, + 69, + 90, +-13, +-16, + 7, +-64, +-62, +-44, +-56, +-55, +-30, +-47, +-48, +-19, +-43, +-45, +-17, +-31, +-34, + -9, +-21, +-25, + -1, + 2, + -2, + 20, + 60, + 57, + 68, + 99, + 98, +106, +105, +104, +109, +104, +104, +104, +104, +106, +102, +105, +106, +101, +107, +106, +103, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 15, + 12, + 30, + 19, + 18, + 29, +-102, +-101, +-97, + 13, + 8, + 19, + 43, + 38, + 46, + 97, + 94, + 96, +105, +103, +101, +105, +103, +101, +105, +102, +102, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +103, +101, +100, +103, +101, +100, +101, + 99, + 97, +100, + 98, + 96, + 92, + 90, + 89, + 63, + 58, + 57, +-56, +-60, +-53, +-29, +-29, + -8, +-47, +-47, +-16, +-50, +-51, +-19, +-38, +-40, +-10, +-40, +-43, + -9, +-42, +-45, +-11, +-49, +-51, +-19, +-53, +-55, +-25, +-57, +-58, +-30, +-62, +-62, +-37, +-65, +-64, +-42, +-66, +-65, +-43, +-66, +-64, +-43, +-64, +-62, +-41, +-67, +-66, +-45, +-102, +-101, +-81, +-81, +-80, +-61, +-76, +-74, +-56, +-84, +-81, +-65, +-90, +-87, +-72, +-91, +-88, +-74, +-16, + -7, + -6, +-14, + -8, +-15, + 6, + 3, +-15, + 11, + -5, +-34, + 13, +-21, +-59, + 25, +-22, +-63, + 25, +-22, +-58, + 21, +-26, +-60, + 25, +-25, +-57, + 32, +-21, +-50, + 28, +-26, +-53, + 24, +-32, +-56, + 21, +-37, +-56, + 20, +-40, +-65, + 18, +-39, +-68, + 15, +-30, +-57, + 10, +-22, +-41, + 42, + 30, + 16, + 76, + 73, + 66, + 77, + 74, + 78, + 66, + 64, + 78, +-42, +-44, +-27, +-64, +-64, +-45, +-61, +-59, +-36, +-53, +-51, +-25, +-51, +-50, +-24, +-46, +-47, +-20, +-37, +-41, +-13, +-29, +-33, + -5, +-13, +-17, + 7, + 17, + 15, + 33, + 73, + 73, + 84, +101, +102, +107, +103, +105, +105, +103, +105, +102, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 30, + 31, + 49, + 32, + 36, + 45, +-92, +-88, +-86, + -3, + -7, + 3, + 44, + 40, + 48, + 85, + 83, + 84, +104, +102, +101, +105, +103, +101, +105, +102, +102, +105, +103, +101, +105, +103, +101, +105, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +104, +102, + 99, +101, + 99, + 97, +100, + 98, + 96, + 92, + 90, + 88, + 65, + 60, + 59, +-42, +-47, +-38, +-42, +-45, +-23, +-60, +-60, +-31, +-56, +-56, +-29, +-54, +-56, +-32, +-52, +-56, +-27, +-57, +-60, +-33, +-60, +-63, +-37, +-63, +-65, +-41, +-67, +-68, +-48, +-72, +-72, +-53, +-74, +-72, +-52, +-70, +-68, +-49, +-67, +-66, +-46, +-66, +-64, +-45, +-73, +-72, +-52, +-85, +-83, +-65, +-86, +-84, +-68, +-88, +-85, +-69, +-90, +-87, +-73, +-94, +-90, +-78, +-96, +-92, +-80, +-12, + -2, + -7, + 5, + 14, + 3, + 4, + 8, + -9, + 23, + 13, +-11, + 11, +-22, +-56, + 30, +-18, +-59, + 26, +-19, +-59, + 25, +-21, +-58, + 21, +-28, +-62, + 19, +-32, +-63, + 19, +-34, +-62, + 22, +-31, +-59, + 20, +-35, +-63, + 17, +-38, +-67, + 11, +-37, +-62, + 21, + -9, +-23, + 55, + 40, + 35, + 30, + 28, + 31, + -2, + 1, + 8, + 65, + 67, + 72, + 47, + 48, + 54, +-77, +-76, +-65, +-68, +-69, +-49, +-66, +-64, +-42, +-64, +-60, +-38, +-59, +-58, +-34, +-51, +-52, +-26, +-49, +-52, +-24, +-44, +-48, +-18, +-32, +-38, + -6, +-16, +-22, + 7, + -3, + -6, + 14, + 33, + 32, + 45, + 82, + 83, + 90, +102, +103, +106, +105, +103, +103, +103, +101, +100, +103, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 54, + 55, + 70, + 41, + 44, + 53, +-53, +-50, +-47, +-31, +-33, +-21, + 44, + 43, + 54, + 69, + 68, + 74, +103, +101, +103, +105, +103, +101, +104, +103, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +101, + 99, + 98, + 99, + 97, + 96, + 92, + 90, + 89, + 66, + 66, + 68, +-32, +-34, +-22, +-62, +-66, +-43, +-65, +-70, +-42, +-67, +-70, +-48, +-66, +-68, +-52, +-69, +-70, +-50, +-69, +-70, +-50, +-69, +-70, +-50, +-72, +-73, +-53, +-77, +-78, +-58, +-77, +-77, +-58, +-77, +-76, +-59, +-75, +-75, +-58, +-68, +-68, +-50, +-70, +-70, +-53, +-83, +-83, +-65, +-90, +-89, +-74, +-86, +-85, +-71, +-88, +-86, +-74, +-91, +-88, +-79, +-91, +-88, +-80, +-93, +-90, +-83, + -3, + 2, + -4, + 12, + 16, + 3, + 1, + 7, + -4, + 5, + 7, + -4, + 6, +-14, +-34, + 25, +-25, +-63, + 29, +-18, +-59, + 31, +-24, +-55, + 23, +-42, +-62, + 18, +-49, +-67, + 19, +-42, +-68, + 22, +-34, +-68, + 20, +-32, +-72, + 12, +-33, +-55, + 41, + 11, + 7, + 59, + 45, + 49, + 42, + 45, + 49, + 11, + 21, + 20, + -8, + 0, + -3, + 43, + 51, + 50, + 2, + 7, + 10, +-103, +-98, +-88, +-81, +-78, +-63, +-69, +-68, +-47, +-66, +-65, +-41, +-64, +-63, +-38, +-50, +-50, +-23, +-51, +-53, +-24, +-57, +-59, +-29, +-49, +-50, +-23, +-39, +-40, +-13, +-25, +-26, + 2, +-14, +-15, + 14, + 0, + -2, + 27, + 35, + 33, + 56, + 82, + 79, + 89, +104, +102, +110, +102, +102, +105, +103, +105, +101, +105, +107, + 99, +105, +104, + 99, +107, +103, +103, +107, +103, +103, +106, +103, +102, +105, +103, +101, +103, +101, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, + 99, + 60, + 62, + 76, + 51, + 52, + 64, +-16, +-16, + -6, +-66, +-67, +-54, + 38, + 36, + 49, + 53, + 51, + 60, +102, +100, +103, +104, +102, +101, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +102, +104, +102, +100, +103, +101, +100, +102, +100, + 98, + 95, + 93, + 91, + 73, + 73, + 76, +-20, +-20, + -9, +-69, +-73, +-51, +-75, +-80, +-54, +-77, +-81, +-61, +-78, +-79, +-66, +-79, +-79, +-62, +-79, +-80, +-62, +-79, +-80, +-62, +-81, +-81, +-63, +-82, +-83, +-65, +-78, +-78, +-61, +-77, +-77, +-61, +-75, +-75, +-59, +-84, +-83, +-68, +-87, +-87, +-71, +-90, +-89, +-74, +-91, +-90, +-76, +-87, +-86, +-73, +-90, +-89, +-78, +-92, +-90, +-81, +-93, +-90, +-82, +-90, +-87, +-81, + 9, + 17, + 10, + 17, + 24, + 11, + 14, + 22, + 11, + 10, + 15, + 7, + 28, + 11, + -5, + 11, +-38, +-71, + 19, +-30, +-68, + 24, +-26, +-60, + 14, +-40, +-68, + 5, +-51, +-76, + 10, +-48, +-75, + 24, +-36, +-66, + 22, +-34, +-65, + 17, +-19, +-36, + 65, + 50, + 44, + 42, + 41, + 42, + 37, + 43, + 46, + 18, + 26, + 24, + 12, + 21, + 16, + 31, + 39, + 38, +-44, +-38, +-35, +-103, +-99, +-89, +-89, +-85, +-72, +-76, +-73, +-56, +-64, +-62, +-43, +-59, +-57, +-37, +-59, +-58, +-36, +-62, +-62, +-38, +-64, +-63, +-39, +-56, +-56, +-31, +-51, +-51, +-26, +-42, +-43, +-15, +-29, +-30, + -1, +-19, +-20, + 10, + -9, +-11, + 19, + 1, + -3, + 21, + 39, + 36, + 55, + 89, + 88, +101, + 99, +100, +106, +101, +104, +104, +106, +106, +104, +108, +105, +103, +108, +106, +103, +108, +106, +104, +106, +104, +103, +105, +103, +101, +105, +103, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +103, +102, + 98, + 50, + 53, + 66, +-11, +-12, + 2, + 18, + 16, + 31, +-64, +-66, +-50, + 26, + 25, + 38, + 43, + 41, + 51, + 95, + 93, + 98, +104, +101, +102, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +100, +102, +100, + 98, +103, +101, + 99, +102, +100, + 98, + 95, + 93, + 92, + 72, + 72, + 77, +-32, +-33, +-21, +-86, +-89, +-70, +-88, +-92, +-71, +-89, +-91, +-74, +-85, +-85, +-73, +-86, +-85, +-70, +-86, +-85, +-70, +-86, +-86, +-70, +-89, +-88, +-73, +-87, +-86, +-70, +-83, +-82, +-67, +-83, +-82, +-68, +-81, +-80, +-67, +-89, +-88, +-74, +-92, +-91, +-78, +-90, +-89, +-76, +-89, +-88, +-74, +-89, +-87, +-75, +-93, +-92, +-81, +-94, +-92, +-83, +-95, +-92, +-84, +-92, +-89, +-83, + 11, + 23, + 15, + 19, + 29, + 14, + 15, + 26, + 12, + 13, + 20, + 12, + 32, + 19, + 7, + 12, +-30, +-56, + 25, +-35, +-65, + 18, +-38, +-71, + 18, +-34, +-68, + 12, +-42, +-72, + 13, +-47, +-72, + 31, +-35, +-56, + 22, +-32, +-51, + 23, + 2, +-13, + 50, + 55, + 44, + 28, + 42, + 36, + 30, + 35, + 35, + 26, + 30, + 28, + 24, + 33, + 28, + 16, + 24, + 23, +-54, +-48, +-45, +-102, +-97, +-88, +-89, +-86, +-73, +-87, +-83, +-71, +-73, +-68, +-57, +-75, +-72, +-59, +-102, +-99, +-85, +-76, +-73, +-57, +-67, +-65, +-46, +-64, +-62, +-41, +-59, +-58, +-36, +-51, +-51, +-27, +-44, +-44, +-19, +-35, +-35, + -8, +-23, +-26, + 5, +-14, +-22, + 16, + -9, +-16, + 18, + 4, + -1, + 25, + 31, + 29, + 47, + 65, + 64, + 77, + 95, + 96, +100, +103, +104, +102, +103, +104, +102, +104, +104, +102, +104, +102, +101, +103, +101, +101, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, + 99, + 71, + 75, + 87, + 4, + 4, + 18, + 38, + 35, + 53, +-10, +-12, + 5, + 19, + 17, + 33, + 42, + 39, + 51, + 87, + 84, + 90, +103, +100, +103, +104, +101, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +104, +102, +100, +104, +102, +100, +103, +101, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +102, +100, + 98, + 97, + 95, + 93, + 29, + 28, + 35, +-73, +-75, +-61, +-91, +-93, +-77, +-94, +-96, +-81, +-91, +-92, +-79, +-87, +-87, +-77, +-92, +-90, +-79, +-92, +-91, +-79, +-92, +-90, +-78, +-90, +-88, +-76, +-88, +-87, +-74, +-87, +-86, +-73, +-86, +-84, +-72, +-87, +-86, +-74, +-100, +-98, +-87, +-93, +-92, +-80, +-90, +-89, +-77, +-88, +-86, +-74, +-89, +-88, +-75, +-94, +-92, +-81, +-97, +-94, +-85, +-96, +-93, +-86, +-92, +-89, +-83, + 18, + 29, + 23, + 24, + 34, + 19, + 18, + 28, + 14, + 14, + 26, + 18, + 28, + 24, + 14, + 25, + -1, +-19, + 25, +-36, +-55, + 29, +-35, +-61, + 31, +-33, +-65, + 15, +-47, +-77, + 21, +-40, +-59, + 27, +-30, +-40, + 45, + 12, + 4, + 40, + 32, + 20, + 29, + 43, + 30, + 23, + 41, + 31, + 33, + 40, + 35, + 29, + 34, + 28, + 27, + 36, + 31, + 28, + 36, + 35, +-81, +-76, +-73, +-98, +-94, +-84, +-92, +-89, +-75, +-91, +-86, +-76, +-93, +-88, +-80, +-103, +-98, +-89, +-106, +-102, +-90, +-84, +-81, +-68, +-71, +-68, +-52, +-66, +-64, +-45, +-65, +-63, +-44, +-63, +-62, +-41, +-58, +-56, +-34, +-49, +-48, +-24, +-41, +-42, +-14, +-29, +-35, + 4, +-24, +-28, + 7, +-18, +-21, + 10, +-14, +-16, + 12, + -8, + -9, + 15, + 7, + 9, + 24, + 57, + 61, + 67, + 98, +100, +105, +102, +102, +106, +103, +100, +102, +103, + 99, +100, +102, + 99, + 98, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 96, + 78, + 85, + 93, + 47, + 48, + 58, + 45, + 42, + 56, + 20, + 17, + 36, + 25, + 23, + 40, + 42, + 39, + 51, + 72, + 69, + 76, +104, +101, +105, +103, +100, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +101, + 99, + 97, +103, +101, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 98, +101, + 99, + 98, + 89, + 87, + 86, +-29, +-31, +-23, +-84, +-86, +-71, +-94, +-95, +-82, +-102, +-102, +-91, +-98, +-98, +-88, +-94, +-94, +-86, +-95, +-93, +-84, +-95, +-93, +-84, +-95, +-93, +-84, +-93, +-91, +-82, +-93, +-91, +-82, +-93, +-91, +-82, +-89, +-87, +-76, +-88, +-86, +-76, +-106, +-104, +-93, +-96, +-95, +-84, +-89, +-87, +-77, +-89, +-87, +-76, +-91, +-90, +-77, +-94, +-92, +-82, +-97, +-94, +-85, +-97, +-94, +-87, +-85, +-82, +-77, + 23, + 30, + 25, + 30, + 35, + 22, + 22, + 30, + 17, + 17, + 34, + 27, + 5, + 15, + 7, + 30, + 20, + 3, + 26, + -6, +-24, + 25, +-27, +-50, + 25, +-41, +-70, + 13, +-48, +-74, + 23, +-17, +-35, + 48, + 26, + 16, + 49, + 41, + 36, + 26, + 28, + 20, + 26, + 37, + 26, + 30, + 41, + 31, + 32, + 40, + 31, + 33, + 41, + 33, + 39, + 48, + 42, + 19, + 26, + 24, +-101, +-95, +-92, +-97, +-93, +-83, +-93, +-89, +-76, +-89, +-85, +-74, +-90, +-86, +-76, +-86, +-82, +-70, +-82, +-78, +-65, +-82, +-78, +-64, +-72, +-69, +-53, +-69, +-66, +-50, +-68, +-65, +-49, +-68, +-66, +-48, +-68, +-66, +-47, +-63, +-61, +-40, +-53, +-52, +-30, +-45, +-45, +-19, +-37, +-37, +-10, +-33, +-33, + -5, +-26, +-27, + 2, +-16, +-17, + 13, +-10, + -9, + 18, + -9, + -7, + 16, + 27, + 28, + 44, + 69, + 68, + 79, +101, + 98, +103, +103, + 98, + 99, +102, + 99, + 98, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 96, + 71, + 79, + 88, + 89, + 93, +101, + 81, + 81, + 92, + 51, + 49, + 66, + 34, + 32, + 49, + 43, + 41, + 56, + 57, + 54, + 64, +103, +100, +104, +103, +100, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +101, + 99, + 97, +100, + 98, + 96, +104, +101, + 99, +104, +102, + 99, +104, +102, + 99, +104, +102, +100, +103, +101, +101, + 62, + 60, + 61, +-61, +-63, +-51, +-91, +-92, +-78, +-101, +-101, +-90, +-105, +-105, +-96, +-101, +-101, +-93, +-98, +-97, +-90, +-98, +-96, +-90, +-98, +-96, +-89, +-98, +-96, +-89, +-99, +-96, +-89, +-96, +-94, +-86, +-94, +-91, +-83, +-91, +-89, +-79, +-93, +-91, +-81, +-107, +-104, +-94, +-96, +-94, +-84, +-90, +-88, +-78, +-92, +-90, +-79, +-93, +-92, +-80, +-95, +-93, +-82, +-97, +-95, +-85, +-99, +-96, +-89, +-85, +-82, +-78, + 26, + 29, + 26, + 30, + 33, + 21, + 26, + 33, + 21, + 21, + 38, + 30, + 22, + 36, + 29, + 17, + 20, + 7, + 28, + 22, + 6, + 19, + -9, +-28, + 13, +-35, +-58, + 21, +-19, +-39, + 55, + 39, + 22, + 43, + 48, + 36, + 38, + 49, + 43, + 30, + 38, + 31, + 34, + 39, + 31, + 35, + 41, + 32, + 32, + 40, + 30, + 37, + 46, + 38, + 47, + 55, + 51, + -8, + -2, + -3, +-104, +-99, +-94, +-98, +-94, +-84, +-90, +-87, +-74, +-91, +-88, +-76, +-89, +-85, +-74, +-89, +-86, +-73, +-92, +-89, +-75, +-73, +-70, +-55, +-59, +-56, +-41, +-67, +-65, +-50, +-70, +-68, +-52, +-72, +-70, +-54, +-72, +-71, +-53, +-70, +-68, +-49, +-61, +-60, +-41, +-58, +-56, +-39, +-49, +-47, +-28, +-44, +-44, +-21, +-36, +-37, +-10, +-34, +-35, + -5, +-32, +-32, + 1, +-32, +-33, + 0, +-25, +-27, + 0, + -9, +-11, + 6, + 83, + 78, + 84, +102, + 98, + 97, +100, + 98, + 95, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 97, +102, +100, + 97, +101, +100, + 96, + 72, + 78, + 89, + 92, + 95, +104, + 94, + 96, +104, + 61, + 63, + 73, + 35, + 36, + 52, + 43, + 40, + 60, + 46, + 43, + 57, + 95, + 94, + 96, +102, +101, + 97, +101, + 99, + 98, +101, + 99, + 98, +102, +100, + 99, +103, +101, +100, +103, +101, +100, +104, +101, + 98, +105, +101, + 97, +104, +101, + 97, +104, +102, +101, +101, + 99, +104, + 16, + 12, + 24, +-69, +-70, +-60, +-97, +-97, +-88, +-104, +-104, +-95, +-109, +-109, +-100, +-102, +-102, +-93, +-99, +-99, +-90, +-100, +-99, +-93, +-100, +-100, +-92, +-100, +-100, +-91, +-98, +-99, +-88, +-95, +-96, +-83, +-93, +-94, +-81, +-91, +-89, +-80, +-93, +-90, +-82, +-105, +-103, +-95, +-96, +-93, +-85, +-91, +-88, +-80, +-92, +-89, +-82, +-95, +-93, +-85, +-96, +-95, +-83, +-97, +-95, +-84, +-100, +-97, +-91, +-85, +-81, +-80, + 24, + 31, + 24, + 29, + 36, + 27, + 27, + 34, + 25, + 28, + 36, + 27, + 30, + 38, + 29, + 22, + 29, + 20, + 20, + 24, + 15, + 26, + 20, + 11, + 7, + -7, +-17, + 56, + 44, + 33, + 50, + 47, + 37, + 43, + 49, + 40, + 37, + 43, + 37, + 33, + 40, + 33, + 34, + 41, + 34, + 34, + 40, + 34, + 34, + 40, + 34, + 45, + 51, + 48, + 46, + 51, + 52, +-43, +-39, +-37, +-99, +-96, +-89, +-96, +-94, +-83, +-91, +-89, +-76, +-86, +-84, +-73, +-94, +-92, +-81, +-87, +-85, +-74, +-89, +-87, +-77, +-86, +-84, +-73, +-80, +-78, +-67, +-69, +-69, +-53, +-69, +-69, +-52, +-74, +-74, +-57, +-76, +-76, +-59, +-73, +-73, +-56, +-67, +-66, +-49, +-63, +-63, +-44, +-60, +-61, +-41, +-53, +-54, +-33, +-49, +-51, +-27, +-49, +-51, +-26, +-49, +-50, +-24, +-50, +-52, +-24, +-38, +-41, +-16, +-29, +-35, +-15, + 57, + 50, + 58, +102, + 96, + 94, +100, + 97, + 93, +100, + 98, + 94, +100, + 98, + 94, +101, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 93, + 92, + 96, + 98, + 95, + 97, + 98, + 94, + 95, + 74, + 76, + 83, + 36, + 37, + 51, + 43, + 41, + 59, + 43, + 41, + 55, + 84, + 83, + 86, +101, + 99, + 97, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, + 99, + 98, +103, + 99, + 97, +103, +100, + 96, +102, +100, + 99, + 85, + 82, + 89, +-39, +-43, +-30, +-83, +-84, +-73, +-103, +-103, +-94, +-109, +-109, +-100, +-111, +-111, +-102, +-104, +-104, +-95, +-100, +-100, +-92, +-101, +-100, +-93, +-101, +-101, +-93, +-100, +-100, +-91, +-98, +-99, +-88, +-95, +-96, +-83, +-93, +-93, +-81, +-91, +-89, +-80, +-92, +-89, +-81, +-101, +-99, +-91, +-100, +-97, +-89, +-92, +-89, +-81, +-92, +-89, +-82, +-95, +-93, +-85, +-96, +-95, +-83, +-97, +-96, +-84, +-101, +-98, +-92, +-81, +-77, +-77, + 26, + 32, + 25, + 29, + 37, + 28, + 27, + 34, + 25, + 29, + 36, + 27, + 32, + 39, + 30, + 28, + 36, + 27, + 22, + 30, + 21, + 30, + 32, + 21, + 50, + 46, + 34, + 51, + 47, + 36, + 44, + 47, + 37, + 41, + 49, + 41, + 34, + 41, + 34, + 35, + 42, + 35, + 34, + 41, + 34, + 34, + 41, + 34, + 40, + 47, + 40, + 46, + 52, + 49, + 36, + 40, + 42, +-80, +-77, +-74, +-98, +-95, +-88, +-96, +-94, +-83, +-90, +-89, +-76, +-87, +-85, +-74, +-90, +-88, +-78, +-95, +-93, +-82, +-88, +-86, +-76, +-85, +-83, +-72, +-84, +-82, +-72, +-73, +-72, +-57, +-71, +-71, +-56, +-78, +-77, +-62, +-80, +-80, +-65, +-82, +-81, +-66, +-78, +-77, +-62, +-73, +-72, +-56, +-69, +-69, +-52, +-63, +-64, +-45, +-61, +-62, +-41, +-61, +-62, +-40, +-61, +-62, +-38, +-63, +-65, +-39, +-42, +-44, +-20, +-38, +-43, +-24, + 35, + 28, + 36, +106, +100, + 99, +102, + 99, + 95, +101, +100, + 96, +101, +100, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 68, + 71, + 79, + 80, + 81, + 87, + 94, + 94, + 98, + 85, + 88, + 94, + 40, + 42, + 54, + 43, + 41, + 59, + 43, + 40, + 56, + 72, + 71, + 76, + 98, + 96, + 95, + 99, + 97, + 95, + 99, + 97, + 95, +100, + 98, + 96, +101, + 99, + 97, +101, + 99, + 97, +102, + 98, + 98, +102, + 98, + 97, +102, + 98, + 96, +100, + 97, + 98, + 49, + 47, + 54, +-69, +-74, +-58, +-90, +-92, +-80, +-105, +-105, +-96, +-109, +-109, +-100, +-111, +-111, +-102, +-105, +-105, +-96, +-102, +-102, +-93, +-100, +-99, +-92, +-99, +-99, +-91, +-98, +-98, +-88, +-97, +-98, +-87, +-95, +-96, +-82, +-93, +-93, +-80, +-92, +-89, +-81, +-92, +-89, +-81, +-97, +-94, +-86, +-103, +-101, +-93, +-94, +-91, +-83, +-93, +-90, +-83, +-95, +-93, +-85, +-97, +-95, +-84, +-98, +-96, +-85, +-103, +-100, +-94, +-84, +-79, +-79, + 25, + 32, + 25, + 28, + 35, + 26, + 27, + 34, + 25, + 29, + 36, + 27, + 32, + 40, + 30, + 33, + 41, + 32, + 28, + 40, + 31, + 39, + 47, + 36, + 46, + 51, + 37, + 42, + 48, + 34, + 40, + 50, + 39, + 31, + 42, + 34, + 31, + 38, + 31, + 33, + 39, + 33, + 35, + 42, + 35, + 38, + 45, + 39, + 44, + 51, + 44, + 45, + 51, + 48, + 16, + 20, + 21, +-102, +-99, +-95, +-98, +-95, +-88, +-97, +-95, +-84, +-91, +-90, +-77, +-87, +-86, +-74, +-88, +-86, +-75, +-88, +-86, +-75, +-83, +-81, +-70, +-90, +-88, +-78, +-93, +-91, +-80, +-74, +-73, +-60, +-75, +-74, +-61, +-80, +-78, +-65, +-84, +-83, +-70, +-87, +-86, +-73, +-87, +-85, +-73, +-83, +-81, +-69, +-79, +-78, +-64, +-74, +-73, +-57, +-71, +-71, +-53, +-71, +-72, +-53, +-72, +-72, +-52, +-74, +-74, +-53, +-55, +-57, +-35, +-47, +-52, +-35, + 28, + 21, + 29, +106, +100, +101, +101, + 98, + 95, +100, + 99, + 95, +100, + 99, + 95, +101, +100, + 95, +101, +100, + 96, +101, +100, + 96, + 99, + 97, + 93, + 53, + 65, + 78, + 62, + 69, + 81, + 88, + 94, +104, + 91, + 95, + 99, + 52, + 54, + 64, + 41, + 39, + 57, + 38, + 34, + 51, + 61, + 58, + 67, +103, +100, +102, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, + 99, +100, +105, + 99, +100, +104, +100, + 99, +100, + 97, +100, + 5, + 2, + 11, +-77, +-83, +-64, +-94, +-96, +-83, +-105, +-105, +-96, +-108, +-109, +-100, +-112, +-112, +-103, +-106, +-106, +-97, +-104, +-104, +-95, +-100, +-100, +-93, +-97, +-97, +-89, +-95, +-95, +-85, +-94, +-95, +-84, +-93, +-94, +-81, +-93, +-93, +-81, +-92, +-90, +-81, +-92, +-89, +-81, +-93, +-91, +-83, +-106, +-103, +-95, +-96, +-93, +-85, +-95, +-92, +-85, +-96, +-94, +-86, +-97, +-96, +-85, +-100, +-98, +-87, +-105, +-101, +-96, +-81, +-76, +-76, + 27, + 34, + 27, + 30, + 38, + 29, + 28, + 36, + 27, + 30, + 38, + 29, + 35, + 42, + 33, + 36, + 44, + 35, + 38, + 49, + 43, + 43, + 53, + 44, + 42, + 52, + 38, + 40, + 50, + 37, + 38, + 48, + 39, + 26, + 37, + 31, + 33, + 39, + 33, + 36, + 43, + 36, + 40, + 46, + 40, + 43, + 50, + 43, + 44, + 50, + 44, + 44, + 50, + 47, + -8, + -4, + -3, +-105, +-101, +-97, +-99, +-96, +-88, +-98, +-96, +-85, +-92, +-91, +-78, +-88, +-86, +-75, +-87, +-85, +-74, +-86, +-84, +-73, +-86, +-84, +-74, +-94, +-92, +-82, +-96, +-94, +-83, +-77, +-75, +-64, +-78, +-76, +-65, +-84, +-82, +-71, +-87, +-85, +-74, +-90, +-88, +-77, +-92, +-90, +-79, +-90, +-88, +-79, +-87, +-86, +-75, +-84, +-83, +-71, +-80, +-79, +-65, +-79, +-79, +-63, +-79, +-77, +-61, +-76, +-75, +-58, +-63, +-64, +-46, +-55, +-60, +-45, + 15, + 9, + 16, +103, + 97, + 98, +103, + 99, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 98, + 97, + 93, + 65, + 70, + 79, + 72, + 75, + 83, + 92, + 93, + 99, + 94, + 99, +100, + 63, + 65, + 73, + 47, + 45, + 63, + 38, + 35, + 52, + 50, + 47, + 57, + 98, + 95, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, +100, +101, +105, +100, +102, +104, +100, +101, + 91, + 87, + 91, +-39, +-43, +-32, +-83, +-88, +-68, +-96, +-98, +-85, +-107, +-107, +-98, +-110, +-110, +-101, +-112, +-112, +-103, +-106, +-106, +-97, +-104, +-104, +-95, +-100, +-100, +-93, +-97, +-97, +-89, +-94, +-95, +-85, +-94, +-95, +-83, +-95, +-96, +-83, +-96, +-96, +-84, +-95, +-92, +-84, +-95, +-92, +-84, +-94, +-92, +-84, +-107, +-104, +-96, +-99, +-97, +-88, +-97, +-94, +-87, +-98, +-95, +-87, +-99, +-97, +-86, +-101, +-99, +-88, +-104, +-101, +-95, +-76, +-72, +-72, + 30, + 37, + 29, + 32, + 40, + 30, + 30, + 37, + 28, + 34, + 41, + 32, + 38, + 45, + 36, + 37, + 44, + 36, + 46, + 52, + 48, + 51, + 59, + 51, + 44, + 54, + 42, + 40, + 50, + 39, + 38, + 46, + 39, + 32, + 39, + 34, + 41, + 48, + 41, + 44, + 50, + 44, + 43, + 50, + 44, + 42, + 49, + 42, + 42, + 49, + 43, + 43, + 49, + 46, +-43, +-39, +-38, +-103, +-99, +-95, +-98, +-95, +-88, +-98, +-96, +-85, +-92, +-91, +-78, +-87, +-85, +-74, +-87, +-85, +-74, +-87, +-85, +-75, +-90, +-88, +-78, +-101, +-99, +-88, +-91, +-89, +-79, +-81, +-79, +-69, +-86, +-84, +-73, +-89, +-87, +-77, +-92, +-90, +-79, +-94, +-93, +-82, +-97, +-95, +-85, +-96, +-93, +-85, +-92, +-90, +-82, +-90, +-88, +-78, +-89, +-88, +-77, +-86, +-84, +-71, +-89, +-86, +-73, +-85, +-83, +-70, +-79, +-79, +-63, +-67, +-71, +-58, +-20, +-26, +-19, + 98, + 92, + 93, +104, +101, + 98, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +102, + 98, + 93, + 93, + 98, +100, + 98, +103, +100, + 98, +101, + 95, + 98, + 99, + 79, + 80, + 88, + 54, + 52, + 69, + 45, + 42, + 60, + 44, + 42, + 56, + 88, + 86, + 92, +100, + 97, + 96, +101, + 99, + 98, +102, +100, + 99, +102, +100, + 98, +101, + 99, + 97, + 99, + 96, + 95, +103, + 99, + 99, +103, +100, +102, + 58, + 55, + 60, +-69, +-72, +-60, +-89, +-93, +-75, +-99, +-100, +-89, +-108, +-108, +-101, +-112, +-111, +-105, +-112, +-111, +-105, +-107, +-107, +-100, +-105, +-104, +-97, +-99, +-99, +-90, +-96, +-96, +-86, +-95, +-95, +-85, +-96, +-97, +-85, +-98, +-99, +-86, +-99, +-100, +-88, +-98, +-97, +-88, +-97, +-96, +-87, +-96, +-95, +-86, +-106, +-104, +-96, +-100, +-99, +-90, +-98, +-96, +-88, +-98, +-95, +-87, +-99, +-97, +-88, +-101, +-98, +-90, +-104, +-100, +-96, +-76, +-71, +-71, + 30, + 37, + 31, + 33, + 40, + 32, + 31, + 38, + 30, + 36, + 43, + 35, + 34, + 41, + 33, + 33, + 39, + 32, + 49, + 53, + 50, + 49, + 54, + 49, + 53, + 58, + 51, + 47, + 52, + 45, + 40, + 45, + 41, + 41, + 46, + 42, + 45, + 51, + 45, + 42, + 49, + 42, + 43, + 49, + 43, + 42, + 48, + 42, + 44, + 50, + 44, + 33, + 39, + 36, +-83, +-80, +-78, +-102, +-99, +-94, +-98, +-95, +-88, +-98, +-96, +-86, +-92, +-90, +-78, +-86, +-84, +-73, +-86, +-84, +-73, +-89, +-87, +-76, +-94, +-92, +-82, +-102, +-100, +-89, +-85, +-83, +-73, +-85, +-83, +-72, +-92, +-90, +-80, +-94, +-92, +-83, +-97, +-94, +-85, +-98, +-95, +-88, +-100, +-97, +-90, +-99, +-97, +-90, +-98, +-95, +-88, +-95, +-92, +-84, +-94, +-92, +-82, +-93, +-91, +-81, +-97, +-95, +-85, +-92, +-92, +-80, +-91, +-90, +-77, +-81, +-82, +-70, +-52, +-56, +-49, + 87, + 82, + 83, +105, +101, + 99, +105, +102, + 98, +104, +101, + 97, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 97, + 89, + 89, + 96, + 87, + 88, + 94, + 90, + 91, + 97, + 91, + 93, + 94, + 90, + 90, + 99, + 64, + 62, + 78, + 45, + 42, + 61, + 39, + 37, + 53, + 75, + 73, + 82, +100, + 98, + 97, +101, + 99, + 97, +100, + 97, + 96, +101, + 99, + 97, +102, +100, + 98, + 98, + 97, + 94, +101, + 99, + 97, +102, +100, +102, + 16, + 14, + 19, +-79, +-81, +-69, +-95, +-97, +-81, +-102, +-102, +-94, +-110, +-109, +-105, +-113, +-111, +-107, +-112, +-110, +-106, +-109, +-107, +-103, +-106, +-104, +-100, +-97, +-97, +-87, +-93, +-94, +-83, +-94, +-95, +-84, +-96, +-97, +-86, +-98, +-98, +-87, +-99, +-99, +-89, +-98, +-98, +-89, +-97, +-97, +-88, +-96, +-96, +-87, +-103, +-103, +-94, +-101, +-101, +-92, +-97, +-96, +-87, +-96, +-93, +-86, +-99, +-95, +-89, +-103, +-99, +-95, +-108, +-104, +-101, +-67, +-63, +-62, + 35, + 41, + 36, + 34, + 41, + 34, + 32, + 38, + 32, + 39, + 46, + 39, + 34, + 41, + 34, + 35, + 42, + 35, + 51, + 55, + 51, + 51, + 55, + 51, + 53, + 57, + 53, + 54, + 57, + 54, + 47, + 50, + 47, + 43, + 47, + 43, + 42, + 49, + 42, + 43, + 49, + 43, + 42, + 49, + 42, + 40, + 47, + 41, + 43, + 50, + 43, + 9, + 15, + 12, +-105, +-101, +-98, +-101, +-97, +-92, +-99, +-97, +-89, +-99, +-97, +-88, +-91, +-89, +-78, +-86, +-84, +-73, +-85, +-83, +-73, +-91, +-89, +-78, +-100, +-98, +-87, +-94, +-92, +-81, +-85, +-83, +-72, +-89, +-87, +-76, +-96, +-94, +-84, +-100, +-97, +-89, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-98, +-94, +-101, +-99, +-91, +-101, +-99, +-91, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-101, +-92, +-93, +-94, +-85, +-92, +-89, +-78, +-83, +-80, +-69, +-53, +-53, +-46, + 87, + 83, + 85, +100, + 96, + 94, +101, + 97, + 94, +105, +101, + 98, +105, +101, + 98, +104, +100, + 97, +104, +100, + 97, +102, + 99, + 93, +102, +103, +109, + 96, + 97, +103, + 99, + 99, +106, +101, +102, +106, +100, +100, +108, + 71, + 70, + 83, + 53, + 51, + 67, + 40, + 38, + 55, + 62, + 60, + 71, +101, + 99, + 97, +100, + 98, + 96, + 97, + 95, + 93, +101, + 99, + 97, +102, +100, + 98, +101, + 99, + 96, +101, + 99, + 97, + 91, + 88, + 92, +-41, +-43, +-36, +-83, +-84, +-72, +-95, +-97, +-83, +-105, +-105, +-98, +-112, +-111, +-107, +-113, +-111, +-107, +-112, +-110, +-106, +-109, +-107, +-103, +-106, +-104, +-100, +-98, +-98, +-89, +-95, +-95, +-86, +-96, +-96, +-87, +-98, +-98, +-89, +-100, +-100, +-91, +-100, +-100, +-91, +-98, +-98, +-89, +-97, +-97, +-88, +-95, +-95, +-86, +-101, +-101, +-92, +-104, +-104, +-95, +-97, +-96, +-87, +-96, +-93, +-86, +-99, +-95, +-89, +-103, +-99, +-95, +-107, +-103, +-100, +-65, +-60, +-60, + 39, + 46, + 41, + 38, + 44, + 38, + 33, + 40, + 33, + 39, + 46, + 39, + 34, + 41, + 34, + 35, + 41, + 35, + 54, + 58, + 54, + 54, + 57, + 54, + 53, + 56, + 53, + 57, + 60, + 57, + 52, + 56, + 52, + 49, + 52, + 49, + 44, + 50, + 44, + 42, + 49, + 42, + 40, + 47, + 40, + 38, + 45, + 38, + 39, + 46, + 39, +-26, +-21, +-25, +-106, +-101, +-98, +-99, +-96, +-90, +-100, +-97, +-90, +-99, +-97, +-88, +-91, +-89, +-78, +-86, +-84, +-74, +-89, +-87, +-77, +-94, +-93, +-82, +-102, +-100, +-90, +-88, +-86, +-75, +-85, +-83, +-73, +-90, +-88, +-78, +-98, +-96, +-86, +-101, +-98, +-91, +-103, +-100, +-94, +-103, +-99, +-95, +-103, +-100, +-95, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-97, +-89, +-102, +-99, +-91, +-105, +-105, +-97, +-97, +-97, +-89, +-93, +-90, +-80, +-82, +-79, +-68, +-59, +-59, +-51, + 64, + 59, + 63, +103, + 98, + 97, +102, + 98, + 95, +103, + 99, + 95, +101, + 97, + 94, +100, + 96, + 93, +100, + 96, + 93, +100, + 96, + 91, + 82, + 83, + 90, + 84, + 85, + 91, + 86, + 87, + 93, + 85, + 87, + 92, + 87, + 87, + 94, + 73, + 73, + 83, + 58, + 57, + 71, + 40, + 38, + 55, + 52, + 49, + 63, + 99, + 97, + 96, + 99, + 97, + 95, + 99, + 97, + 95, +102, +100, + 98, +101, + 99, + 97, +100, + 98, + 95, +101, + 98, + 98, + 54, + 50, + 55, +-74, +-76, +-65, +-87, +-88, +-76, +-100, +-100, +-91, +-110, +-109, +-104, +-114, +-112, +-108, +-115, +-113, +-109, +-112, +-111, +-107, +-111, +-110, +-106, +-108, +-107, +-102, +-102, +-102, +-95, +-98, +-98, +-91, +-98, +-98, +-90, +-99, +-99, +-92, +-101, +-101, +-93, +-102, +-102, +-94, +-101, +-101, +-92, +-98, +-98, +-89, +-96, +-96, +-87, +-98, +-98, +-89, +-106, +-106, +-97, +-98, +-97, +-88, +-97, +-94, +-86, +-99, +-96, +-90, +-102, +-98, +-94, +-106, +-101, +-99, +-66, +-63, +-62, + 41, + 47, + 42, + 40, + 47, + 40, + 34, + 41, + 34, + 44, + 51, + 44, + 38, + 44, + 38, + 37, + 44, + 37, + 55, + 58, + 55, + 54, + 57, + 54, + 53, + 57, + 53, + 56, + 60, + 56, + 49, + 52, + 49, + 54, + 59, + 54, + 51, + 57, + 51, + 43, + 50, + 43, + 37, + 44, + 38, + 38, + 45, + 38, + 36, + 43, + 36, +-55, +-50, +-54, +-104, +-100, +-96, +-100, +-97, +-91, +-100, +-97, +-89, +-99, +-97, +-88, +-93, +-91, +-80, +-90, +-88, +-78, +-94, +-92, +-82, +-99, +-98, +-87, +-97, +-95, +-85, +-86, +-84, +-73, +-83, +-81, +-71, +-90, +-88, +-77, +-97, +-94, +-85, +-101, +-98, +-91, +-102, +-99, +-93, +-102, +-98, +-95, +-102, +-99, +-94, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-99, +-97, +-89, +-102, +-100, +-92, +-107, +-106, +-100, +-101, +-100, +-95, +-95, +-92, +-83, +-83, +-80, +-70, +-63, +-64, +-54, + 39, + 34, + 40, +102, + 97, + 96, +101, + 97, + 93, +101, + 96, + 93, + 99, + 95, + 92, + 99, + 95, + 92, + 99, + 95, + 92, + 98, + 94, + 89, + 80, + 81, + 88, + 81, + 82, + 88, + 81, + 82, + 89, + 82, + 82, + 91, + 84, + 85, + 92, + 75, + 76, + 83, + 65, + 64, + 76, + 44, + 41, + 59, + 45, + 42, + 57, + 95, + 93, + 92, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +100, + 98, + 95, + 94, + 91, + 92, + -5, + -9, + -1, +-77, +-81, +-66, +-90, +-91, +-80, +-104, +-103, +-98, +-112, +-111, +-107, +-114, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-107, +-113, +-111, +-107, +-110, +-108, +-104, +-104, +-104, +-98, +-100, +-99, +-93, +-99, +-98, +-92, +-100, +-99, +-93, +-101, +-101, +-95, +-103, +-102, +-95, +-102, +-102, +-93, +-99, +-99, +-90, +-96, +-96, +-87, +-96, +-96, +-87, +-106, +-106, +-97, +-100, +-98, +-90, +-99, +-96, +-88, +-101, +-97, +-92, +-103, +-99, +-95, +-104, +-100, +-97, +-59, +-55, +-54, + 42, + 48, + 43, + 39, + 46, + 39, + 39, + 45, + 39, + 47, + 54, + 48, + 39, + 46, + 39, + 43, + 50, + 43, + 55, + 59, + 55, + 53, + 56, + 53, + 57, + 60, + 57, + 55, + 59, + 56, + 45, + 49, + 45, + 49, + 54, + 49, + 53, + 60, + 53, + 50, + 56, + 50, + 39, + 46, + 39, + 38, + 44, + 38, + 26, + 32, + 26, +-93, +-88, +-90, +-101, +-97, +-93, +-98, +-95, +-90, +-99, +-96, +-89, +-99, +-97, +-88, +-93, +-91, +-81, +-93, +-91, +-80, +-96, +-94, +-83, +-104, +-102, +-91, +-92, +-90, +-79, +-84, +-82, +-71, +-81, +-79, +-68, +-88, +-86, +-75, +-94, +-92, +-82, +-99, +-96, +-89, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-100, +-97, +-89, +-105, +-102, +-94, +-108, +-106, +-102, +-100, +-98, +-95, +-94, +-91, +-83, +-87, +-85, +-74, +-70, +-71, +-60, + 11, + 5, + 14, +104, +100, +100, +103, + 99, + 96, +104, +100, + 97, +104, +100, + 97, +104, +100, + 97, +104, +100, + 97, +103, + 99, + 94, + 79, + 79, + 86, + 81, + 81, + 88, + 84, + 85, + 92, + 88, + 87, + 98, + 86, + 86, + 94, + 81, + 81, + 87, + 74, + 73, + 83, + 46, + 44, + 62, + 41, + 38, + 54, + 83, + 81, + 80, +101, + 99, + 98, +101, + 99, + 97, +102, +100, + 98, +102, +100, + 98, +102, +101, + 98, + 92, + 89, + 90, +-36, +-41, +-30, +-80, +-85, +-68, +-95, +-96, +-85, +-107, +-105, +-104, +-113, +-111, +-108, +-114, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-107, +-113, +-111, +-107, +-110, +-108, +-104, +-106, +-105, +-101, +-101, +-100, +-96, +-101, +-100, +-96, +-102, +-100, +-96, +-103, +-102, +-98, +-104, +-103, +-98, +-102, +-102, +-93, +-99, +-99, +-90, +-97, +-97, +-88, +-96, +-96, +-87, +-105, +-105, +-96, +-100, +-99, +-90, +-98, +-95, +-88, +-100, +-97, +-91, +-102, +-98, +-94, +-102, +-98, +-95, +-55, +-51, +-50, + 45, + 52, + 47, + 43, + 50, + 44, + 45, + 52, + 45, + 47, + 53, + 47, + 38, + 45, + 38, + 48, + 54, + 48, + 51, + 55, + 51, + 54, + 58, + 54, + 57, + 61, + 57, + 57, + 60, + 57, + 46, + 49, + 46, + 45, + 49, + 45, + 53, + 60, + 53, + 55, + 61, + 55, + 43, + 50, + 43, + 38, + 45, + 38, + -2, + 4, + -2, +-106, +-101, +-102, +-100, +-96, +-92, +-99, +-96, +-90, +-99, +-96, +-89, +-99, +-97, +-88, +-93, +-91, +-81, +-94, +-92, +-81, +-101, +-99, +-88, +-103, +-101, +-90, +-89, +-87, +-77, +-86, +-84, +-73, +-83, +-81, +-70, +-87, +-85, +-75, +-93, +-91, +-81, +-99, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-108, +-106, +-98, +-108, +-106, +-102, +-99, +-97, +-96, +-94, +-90, +-83, +-90, +-87, +-75, +-74, +-75, +-63, +-25, +-32, +-21, + 94, + 89, + 90, +103, + 99, + 96, +105, +101, + 98, +106, +102, + 99, +106, +101, + 98, +105, +101, + 98, +104, +101, + 95, + 79, + 79, + 85, + 81, + 80, + 86, + 72, + 71, + 78, + 66, + 66, + 76, + 53, + 54, + 62, + 49, + 51, + 58, + 49, + 50, + 59, + 48, + 45, + 61, + 41, + 37, + 52, + 68, + 66, + 71, + 98, + 97, + 97, +100, + 99, + 95, +101, + 99, + 94, +102, + 99, + 96, +102, +101, + 98, + 69, + 70, + 71, +-58, +-60, +-48, +-89, +-92, +-74, +-98, +-99, +-87, +-109, +-107, +-105, +-113, +-110, +-110, +-114, +-112, +-111, +-116, +-114, +-112, +-113, +-112, +-109, +-114, +-112, +-108, +-111, +-109, +-105, +-106, +-105, +-99, +-104, +-103, +-97, +-103, +-102, +-96, +-102, +-102, +-96, +-103, +-103, +-97, +-104, +-103, +-96, +-104, +-102, +-94, +-101, +-99, +-91, +-96, +-94, +-86, +-96, +-94, +-86, +-105, +-103, +-95, +-100, +-98, +-90, +-94, +-91, +-84, +-98, +-94, +-88, +-101, +-98, +-94, +-100, +-96, +-93, +-54, +-50, +-49, + 50, + 56, + 51, + 49, + 56, + 49, + 46, + 52, + 46, + 45, + 52, + 45, + 36, + 43, + 36, + 52, + 59, + 52, + 53, + 60, + 52, + 51, + 57, + 49, + 53, + 58, + 53, + 53, + 59, + 55, + 45, + 51, + 47, + 40, + 45, + 41, + 52, + 59, + 52, + 54, + 61, + 54, + 45, + 51, + 48, + 37, + 42, + 41, +-44, +-40, +-40, +-103, +-99, +-95, +-99, +-96, +-89, +-99, +-96, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-94, +-91, +-83, +-95, +-92, +-85, +-105, +-102, +-94, +-99, +-96, +-87, +-91, +-89, +-78, +-86, +-85, +-73, +-84, +-83, +-70, +-87, +-85, +-74, +-93, +-91, +-81, +-98, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-111, +-109, +-101, +-107, +-105, +-98, +-100, +-98, +-91, +-95, +-92, +-84, +-89, +-88, +-76, +-77, +-77, +-64, +-53, +-54, +-41, + 69, + 67, + 67, +102, +100, + 96, +102, +100, + 96, +105, +102, + 98, +105, +102, + 98, +105, +102, + 98, +105, +103, + 98, + 65, + 74, + 87, + 66, + 75, + 88, + 66, + 74, + 87, + 76, + 79, + 92, + 77, + 79, + 89, + 78, + 81, + 88, + 79, + 80, + 89, + 75, + 74, + 87, + 45, + 41, + 56, + 57, + 55, + 64, + 95, + 94, + 96, + 97, + 96, + 92, +101, + 98, + 93, +103, + 98, + 96, +102, +101, + 99, + 42, + 44, + 45, +-71, +-72, +-60, +-91, +-94, +-76, +-99, +-100, +-88, +-111, +-109, +-107, +-113, +-111, +-112, +-114, +-112, +-112, +-116, +-113, +-113, +-115, +-113, +-111, +-114, +-113, +-109, +-110, +-109, +-104, +-107, +-106, +-100, +-105, +-105, +-98, +-104, +-103, +-97, +-104, +-103, +-97, +-103, +-103, +-96, +-102, +-101, +-94, +-101, +-99, +-91, +-102, +-99, +-91, +-97, +-94, +-86, +-95, +-93, +-84, +-103, +-100, +-92, +-100, +-97, +-89, +-92, +-90, +-82, +-98, +-94, +-88, +-101, +-97, +-93, +-101, +-97, +-94, +-46, +-42, +-42, + 52, + 58, + 53, + 48, + 55, + 48, + 46, + 53, + 46, + 44, + 51, + 44, + 38, + 45, + 39, + 50, + 57, + 50, + 49, + 56, + 47, + 52, + 59, + 50, + 51, + 58, + 51, + 52, + 58, + 53, + 44, + 50, + 47, + 40, + 46, + 42, + 49, + 56, + 48, + 54, + 60, + 54, + 44, + 50, + 47, + 28, + 33, + 35, +-80, +-77, +-74, +-101, +-97, +-91, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-97, +-89, +-101, +-98, +-90, +-95, +-92, +-84, +-99, +-96, +-90, +-106, +-103, +-96, +-97, +-95, +-87, +-93, +-91, +-81, +-87, +-85, +-74, +-84, +-83, +-70, +-88, +-86, +-75, +-93, +-91, +-82, +-99, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-99, +-91, +-111, +-109, +-100, +-106, +-103, +-95, +-100, +-97, +-89, +-96, +-94, +-85, +-90, +-89, +-76, +-79, +-78, +-65, +-60, +-59, +-45, + 48, + 47, + 47, +103, +102, + 98, +104, +103, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, + -5, + 17, + 41, + -1, + 22, + 46, + -4, + 17, + 40, + 54, + 62, + 79, + 77, + 82, + 94, + 80, + 82, + 89, + 77, + 76, + 84, + 73, + 71, + 84, + 48, + 46, + 61, + 53, + 50, + 60, + 93, + 92, + 95, +100, + 98, + 96, +100, + 97, + 94, + 99, + 94, + 94, + 93, + 92, + 93, + -5, + -4, + 1, +-84, +-85, +-73, +-99, +-100, +-85, +-104, +-104, +-95, +-112, +-110, +-108, +-113, +-111, +-112, +-114, +-112, +-112, +-116, +-113, +-113, +-116, +-114, +-112, +-115, +-113, +-109, +-108, +-107, +-103, +-108, +-107, +-101, +-107, +-106, +-99, +-105, +-105, +-98, +-105, +-105, +-98, +-102, +-102, +-95, +-101, +-100, +-93, +-101, +-98, +-90, +-100, +-97, +-89, +-94, +-92, +-84, +-95, +-92, +-84, +-99, +-97, +-89, +-105, +-102, +-94, +-99, +-96, +-88, +-101, +-97, +-92, +-101, +-97, +-93, +-100, +-96, +-94, +-45, +-41, +-40, + 51, + 58, + 53, + 50, + 57, + 51, + 50, + 57, + 50, + 45, + 51, + 45, + 41, + 48, + 41, + 56, + 63, + 56, + 52, + 59, + 51, + 49, + 57, + 48, + 52, + 59, + 52, + 50, + 56, + 52, + 44, + 50, + 46, + 41, + 48, + 44, + 45, + 52, + 45, + 54, + 61, + 54, + 46, + 51, + 49, + 12, + 16, + 18, +-103, +-99, +-96, +-100, +-97, +-90, +-99, +-96, +-88, +-99, +-96, +-88, +-98, +-96, +-88, +-100, +-97, +-89, +-96, +-94, +-85, +-104, +-101, +-95, +-102, +-99, +-92, +-95, +-92, +-84, +-91, +-89, +-79, +-88, +-86, +-75, +-89, +-87, +-74, +-90, +-88, +-77, +-95, +-93, +-84, +-100, +-98, +-90, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-103, +-100, +-93, +-110, +-107, +-99, +-104, +-101, +-93, +-99, +-96, +-88, +-97, +-94, +-85, +-92, +-91, +-79, +-82, +-80, +-67, +-62, +-61, +-47, + 44, + 42, + 42, +103, +101, + 97, +103, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +102, +101, + 97, +-23, + 9, + 41, +-19, + 14, + 46, +-19, + 12, + 42, + 22, + 36, + 57, + 81, + 89, +103, + 93, + 94, +101, + 73, + 71, + 78, + 45, + 43, + 57, + 43, + 41, + 59, + 48, + 44, + 56, + 82, + 81, + 86, + 96, + 94, + 94, + 97, + 94, + 92, + 99, + 94, + 96, + 66, + 63, + 69, +-54, +-54, +-46, +-97, +-98, +-87, +-105, +-106, +-96, +-110, +-109, +-103, +-114, +-112, +-111, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-114, +-112, +-108, +-107, +-106, +-102, +-108, +-108, +-101, +-107, +-107, +-100, +-105, +-105, +-98, +-104, +-104, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-99, +-90, +-98, +-96, +-87, +-96, +-93, +-85, +-95, +-92, +-84, +-96, +-94, +-86, +-106, +-104, +-96, +-99, +-96, +-89, +-100, +-96, +-91, +-102, +-99, +-95, +-101, +-97, +-94, +-47, +-43, +-42, + 51, + 57, + 52, + 52, + 59, + 52, + 51, + 58, + 51, + 42, + 49, + 42, + 41, + 47, + 41, + 52, + 59, + 52, + 61, + 68, + 59, + 52, + 60, + 51, + 48, + 54, + 48, + 49, + 55, + 51, + 43, + 49, + 45, + 42, + 48, + 44, + 42, + 49, + 41, + 52, + 58, + 52, + 44, + 49, + 47, +-24, +-20, +-18, +-105, +-102, +-98, +-100, +-97, +-91, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-97, +-89, +-106, +-103, +-97, +-98, +-95, +-89, +-94, +-91, +-83, +-93, +-91, +-80, +-91, +-89, +-78, +-93, +-92, +-79, +-96, +-94, +-84, +-101, +-99, +-90, +-102, +-99, +-92, +-104, +-101, +-95, +-104, +-100, +-96, +-104, +-101, +-96, +-104, +-102, +-94, +-103, +-100, +-92, +-101, +-98, +-90, +-105, +-102, +-94, +-108, +-106, +-97, +-103, +-100, +-92, +-99, +-97, +-89, +-96, +-94, +-85, +-93, +-91, +-79, +-85, +-83, +-70, +-71, +-70, +-56, + 39, + 38, + 38, +100, + 99, + 95, +100, + 99, + 95, +101, +100, + 96, +101, +100, + 96, +102, +101, + 97, +101, +100, + 96, +-25, + 10, + 43, +-26, + 10, + 43, +-22, + 12, + 45, + 0, + 20, + 45, + 74, + 84, + 99, + 92, + 93, + 99, + 84, + 81, + 87, + 49, + 47, + 61, + 41, + 41, + 60, + 43, + 40, + 54, + 71, + 68, + 76, +103, +100, +101, +103, + 99, + 99, +102, + 97, + 99, + 18, + 14, + 21, +-82, +-83, +-70, +-101, +-102, +-91, +-106, +-106, +-99, +-111, +-109, +-105, +-114, +-112, +-111, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-113, +-112, +-108, +-108, +-106, +-102, +-108, +-108, +-101, +-107, +-107, +-100, +-105, +-105, +-98, +-103, +-103, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-98, +-90, +-98, +-95, +-87, +-96, +-93, +-85, +-94, +-91, +-83, +-95, +-92, +-84, +-107, +-105, +-97, +-101, +-98, +-91, +-100, +-97, +-91, +-101, +-98, +-94, +-100, +-96, +-93, +-42, +-38, +-38, + 51, + 57, + 53, + 53, + 60, + 53, + 46, + 53, + 46, + 36, + 43, + 36, + 44, + 50, + 44, + 47, + 54, + 47, + 58, + 65, + 56, + 54, + 61, + 52, + 48, + 55, + 49, + 47, + 53, + 49, + 41, + 47, + 43, + 45, + 51, + 46, + 44, + 51, + 43, + 48, + 55, + 49, + 37, + 43, + 40, +-74, +-70, +-69, +-102, +-98, +-95, +-99, +-96, +-90, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-99, +-97, +-88, +-105, +-102, +-94, +-107, +-104, +-98, +-100, +-97, +-91, +-98, +-95, +-87, +-97, +-95, +-85, +-96, +-94, +-83, +-97, +-96, +-83, +-103, +-101, +-90, +-103, +-101, +-91, +-102, +-99, +-91, +-99, +-96, +-90, +-97, +-94, +-90, +-94, +-91, +-86, +-93, +-90, +-82, +-100, +-98, +-90, +-99, +-96, +-88, +-114, +-111, +-104, +-109, +-106, +-98, +-103, +-100, +-92, +-100, +-97, +-89, +-96, +-93, +-85, +-94, +-92, +-80, +-87, +-86, +-73, +-77, +-76, +-62, + 20, + 19, + 18, +103, +102, + 98, +105, +103, + 99, +105, +103, + 99, +104, +103, + 99, +100, + 98, + 94, +100, + 99, + 95, +-26, + 7, + 39, +-25, + 8, + 41, +-22, + 10, + 43, +-14, + 7, + 35, + 52, + 64, + 81, + 93, + 96, +101, + 92, + 89, + 95, + 67, + 65, + 79, + 44, + 42, + 62, + 46, + 42, + 57, + 61, + 59, + 67, +102, + 99, +101, +103, + 99, +100, + 90, + 84, + 88, +-31, +-35, +-26, +-92, +-94, +-79, +-104, +-104, +-94, +-107, +-107, +-100, +-111, +-109, +-106, +-114, +-112, +-110, +-115, +-112, +-112, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-113, +-112, +-108, +-108, +-106, +-102, +-108, +-108, +-102, +-107, +-107, +-100, +-106, +-105, +-99, +-103, +-103, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-98, +-90, +-98, +-95, +-87, +-96, +-93, +-85, +-92, +-89, +-81, +-93, +-91, +-83, +-108, +-105, +-97, +-103, +-100, +-93, +-100, +-97, +-91, +-101, +-98, +-93, +-101, +-97, +-94, +-39, +-35, +-35, + 51, + 57, + 52, + 46, + 53, + 46, + 38, + 45, + 38, + 32, + 39, + 32, + 50, + 57, + 50, + 55, + 62, + 55, + 53, + 60, + 52, + 55, + 62, + 53, + 54, + 61, + 54, + 47, + 54, + 49, + 47, + 53, + 48, + 48, + 54, + 50, + 48, + 55, + 47, + 45, + 52, + 45, + 22, + 27, + 25, +-103, +-99, +-97, +-102, +-98, +-94, +-99, +-96, +-89, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-102, +-99, +-91, +-105, +-103, +-95, +-103, +-100, +-93, +-98, +-95, +-88, +-97, +-94, +-86, +-96, +-94, +-84, +-93, +-92, +-81, +-95, +-94, +-81, +-96, +-94, +-84, +-97, +-94, +-85, +-102, +-99, +-91, +-105, +-102, +-96, +-104, +-100, +-96, +-103, +-99, +-94, +-99, +-96, +-88, +-97, +-95, +-86, +-99, +-97, +-89, +-117, +-115, +-107, +-109, +-106, +-99, +-103, +-101, +-93, +-100, +-97, +-89, +-96, +-93, +-85, +-93, +-91, +-79, +-87, +-86, +-73, +-80, +-79, +-65, +-24, +-25, +-25, + 99, + 96, + 93, +104, +102, + 99, +106, +104, +100, +105, +103, + 99, + 96, + 95, + 91, + 96, + 95, + 90, +-18, + 3, + 31, +-14, + 6, + 38, +-16, + 3, + 37, +-17, + 2, + 29, + 35, + 48, + 64, + 89, + 93, +100, + 94, + 93, + 99, + 73, + 69, + 82, + 51, + 47, + 65, + 46, + 44, + 60, + 51, + 51, + 59, + 93, + 95, + 96, + 99, +101, +101, + 58, + 59, + 62, +-73, +-73, +-66, +-103, +-104, +-95, +-106, +-106, +-99, +-110, +-109, +-105, +-113, +-111, +-108, +-114, +-112, +-110, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-119, +-117, +-116, +-114, +-113, +-109, +-109, +-108, +-104, +-109, +-108, +-103, +-108, +-106, +-102, +-106, +-105, +-100, +-103, +-102, +-98, +-102, +-100, +-96, +-101, +-99, +-94, +-101, +-98, +-90, +-99, +-96, +-88, +-95, +-92, +-84, +-91, +-88, +-80, +-91, +-89, +-80, +-105, +-101, +-96, +-102, +-98, +-94, +-100, +-97, +-90, +-101, +-98, +-91, +-102, +-98, +-95, +-41, +-36, +-38, + 49, + 55, + 50, + 43, + 50, + 43, + 40, + 47, + 40, + 35, + 41, + 35, + 54, + 61, + 54, + 54, + 61, + 54, + 54, + 61, + 56, + 51, + 58, + 53, + 51, + 57, + 52, + 45, + 51, + 47, + 48, + 54, + 50, + 50, + 56, + 52, + 48, + 54, + 48, + 42, + 48, + 44, + -9, + -5, + -6, +-106, +-102, +-100, +-102, +-98, +-93, +-101, +-98, +-91, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-97, +-91, +-107, +-103, +-98, +-99, +-96, +-90, +-101, +-98, +-91, +-103, +-101, +-93, +-104, +-101, +-93, +-102, +-100, +-91, +-100, +-98, +-89, +-99, +-97, +-88, +-100, +-97, +-89, +-100, +-98, +-89, +-102, +-99, +-91, +-105, +-102, +-94, +-106, +-103, +-95, +-103, +-100, +-92, +-100, +-98, +-88, +-94, +-92, +-83, +-108, +-106, +-98, +-116, +-113, +-107, +-108, +-105, +-101, +-103, +-99, +-94, +-100, +-97, +-89, +-97, +-94, +-85, +-93, +-92, +-80, +-88, +-87, +-74, +-80, +-80, +-65, +-60, +-68, +-58, + 81, + 72, + 77, +106, +100, + 99, +102, +100, + 95, +103, +103, + 97, + 95, + 96, + 92, + 92, + 92, + 85, + 83, + 88, +100, + 81, + 85, +101, + 75, + 78, + 96, + 57, + 67, + 86, + 56, + 63, + 77, + 79, + 81, + 88, + 95, + 95, +102, + 74, + 73, + 87, + 52, + 51, + 69, + 50, + 48, + 64, + 49, + 49, + 59, + 84, + 85, + 90, + 87, + 89, + 91, +-30, +-28, +-25, +-102, +-101, +-96, +-111, +-110, +-106, +-112, +-110, +-108, +-113, +-111, +-110, +-114, +-111, +-112, +-116, +-113, +-115, +-115, +-112, +-114, +-115, +-113, +-114, +-117, +-114, +-114, +-120, +-117, +-116, +-115, +-113, +-109, +-109, +-108, +-104, +-109, +-108, +-104, +-108, +-106, +-102, +-106, +-105, +-101, +-106, +-104, +-100, +-104, +-103, +-99, +-103, +-101, +-97, +-101, +-98, +-92, +-99, +-96, +-90, +-95, +-92, +-85, +-92, +-89, +-82, +-91, +-88, +-81, +-103, +-100, +-95, +-103, +-99, +-96, +-99, +-96, +-89, +-101, +-98, +-91, +-101, +-96, +-94, +-34, +-29, +-32, + 49, + 56, + 50, + 46, + 52, + 46, + 42, + 49, + 43, + 36, + 42, + 36, + 50, + 56, + 50, + 51, + 58, + 51, + 53, + 59, + 55, + 53, + 59, + 55, + 54, + 60, + 56, + 41, + 47, + 43, + 41, + 47, + 43, + 47, + 53, + 49, + 48, + 54, + 49, + 43, + 49, + 45, +-45, +-41, +-43, +-104, +-99, +-97, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-104, +-100, +-95, +-110, +-107, +-101, +-103, +-100, +-94, +-99, +-96, +-88, +-101, +-98, +-90, +-104, +-101, +-93, +-102, +-100, +-92, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-97, +-89, +-100, +-98, +-90, +-102, +-99, +-91, +-104, +-101, +-93, +-105, +-103, +-94, +-103, +-101, +-92, +-99, +-97, +-87, +-96, +-94, +-85, +-118, +-115, +-108, +-114, +-111, +-105, +-105, +-101, +-98, +-102, +-98, +-93, +-101, +-98, +-90, +-98, +-95, +-86, +-94, +-92, +-80, +-87, +-86, +-73, +-78, +-77, +-63, +-71, +-78, +-66, + 35, + 28, + 33, +106, +101, +100, +103, +101, + 96, +105, +105, + 99, +102, +101, + 97, + 98, + 97, + 93, +106, +102, +106, +108, +103, +109, +104, +100, +108, + 99, +103, +113, + 92, + 93, +101, + 72, + 69, + 76, + 97, + 96, +105, + 80, + 81, + 96, + 51, + 53, + 71, + 49, + 47, + 63, + 49, + 48, + 61, + 72, + 72, + 80, + 4, + 5, + 9, +-102, +-101, +-97, +-110, +-108, +-106, +-111, +-108, +-108, +-114, +-111, +-112, +-115, +-111, +-114, +-116, +-112, +-117, +-117, +-113, +-118, +-115, +-112, +-114, +-115, +-113, +-114, +-117, +-114, +-114, +-120, +-118, +-116, +-115, +-113, +-109, +-110, +-108, +-104, +-112, +-110, +-106, +-111, +-109, +-105, +-110, +-108, +-104, +-109, +-107, +-103, +-107, +-106, +-102, +-106, +-104, +-100, +-104, +-101, +-96, +-102, +-99, +-94, +-99, +-96, +-90, +-96, +-93, +-88, +-93, +-90, +-84, +-104, +-99, +-96, +-104, +-100, +-97, +-98, +-94, +-88, +-101, +-98, +-91, +-102, +-98, +-95, +-26, +-21, +-24, + 46, + 52, + 46, + 45, + 52, + 45, + 42, + 49, + 43, + 39, + 46, + 39, + 52, + 59, + 52, + 52, + 58, + 52, + 51, + 57, + 53, + 53, + 59, + 55, + 51, + 57, + 53, + 45, + 51, + 46, + 38, + 44, + 40, + 45, + 51, + 47, + 45, + 52, + 47, + 32, + 38, + 34, +-97, +-92, +-93, +-105, +-101, +-98, +-101, +-98, +-93, +-102, +-99, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-105, +-102, +-96, +-110, +-107, +-101, +-104, +-101, +-95, +-101, +-99, +-91, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-97, +-89, +-100, +-98, +-90, +-102, +-99, +-91, +-104, +-101, +-94, +-106, +-103, +-95, +-102, +-100, +-91, +-96, +-94, +-84, +-100, +-98, +-89, +-120, +-116, +-109, +-111, +-108, +-103, +-108, +-104, +-100, +-105, +-101, +-96, +-102, +-99, +-91, +-99, +-96, +-87, +-95, +-93, +-81, +-86, +-85, +-72, +-75, +-75, +-60, +-66, +-72, +-58, + -5, +-11, + -5, +104, +100, + 99, +103, +100, + 94, + 99, + 97, + 90, +105, +103, + 97, +111, +108, +108, +109, +109, +114, +105, +105, +111, +102, +102, +109, + 99, + 99, +103, +101, + 97, +102, + 81, + 75, + 81, + 93, + 88, + 98, + 90, + 89, +103, + 54, + 56, + 71, + 48, + 46, + 63, + 50, + 48, + 64, + 16, + 14, + 27, +-98, +-98, +-90, +-109, +-108, +-104, +-112, +-110, +-108, +-113, +-111, +-111, +-115, +-112, +-113, +-114, +-111, +-113, +-114, +-110, +-115, +-116, +-112, +-117, +-115, +-112, +-114, +-116, +-113, +-114, +-117, +-115, +-114, +-121, +-119, +-116, +-116, +-115, +-111, +-111, +-109, +-105, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-111, +-109, +-105, +-109, +-107, +-103, +-108, +-106, +-102, +-107, +-103, +-100, +-105, +-101, +-98, +-104, +-100, +-97, +-102, +-98, +-94, +-99, +-95, +-92, +-106, +-102, +-100, +-109, +-105, +-102, +-100, +-97, +-91, +-101, +-98, +-91, +-103, +-98, +-96, +-24, +-19, +-22, + 46, + 53, + 47, + 45, + 52, + 45, + 40, + 47, + 41, + 43, + 49, + 43, + 48, + 54, + 48, + 46, + 53, + 46, + 51, + 57, + 53, + 51, + 57, + 53, + 45, + 51, + 47, + 43, + 49, + 45, + 39, + 45, + 40, + 43, + 49, + 45, + 43, + 50, + 45, + -4, + 1, + -2, +-109, +-104, +-104, +-103, +-99, +-96, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-97, +-92, +-105, +-102, +-96, +-106, +-102, +-97, +-101, +-97, +-92, +-99, +-96, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-102, +-99, +-91, +-98, +-96, +-87, +-96, +-94, +-83, +-110, +-107, +-99, +-117, +-115, +-107, +-117, +-113, +-108, +-110, +-106, +-103, +-105, +-102, +-96, +-102, +-99, +-91, +-99, +-96, +-88, +-94, +-93, +-81, +-88, +-87, +-74, +-75, +-74, +-60, +-59, +-63, +-48, +-16, +-21, +-14, +102, + 98, + 98, +102, + 99, + 92, + 89, + 87, + 78, + 84, + 80, + 72, + 89, + 86, + 85, +114, +116, +120, +106, +108, +111, + 97, + 99, +102, + 92, + 92, + 94, + 91, + 86, + 91, + 82, + 73, + 80, + 82, + 74, + 82, + 97, + 92, +101, + 65, + 64, + 74, + 48, + 46, + 61, + 45, + 43, + 60, +-63, +-65, +-51, +-103, +-104, +-92, +-106, +-105, +-101, +-109, +-108, +-104, +-111, +-110, +-105, +-113, +-111, +-108, +-112, +-110, +-108, +-112, +-110, +-110, +-114, +-111, +-113, +-116, +-113, +-114, +-117, +-114, +-116, +-119, +-116, +-116, +-122, +-120, +-118, +-117, +-116, +-112, +-112, +-111, +-107, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-111, +-109, +-105, +-110, +-107, +-104, +-110, +-106, +-104, +-109, +-104, +-103, +-107, +-103, +-101, +-103, +-99, +-97, +-100, +-96, +-94, +-107, +-102, +-101, +-111, +-107, +-104, +-102, +-99, +-93, +-101, +-97, +-91, +-103, +-99, +-96, +-27, +-21, +-25, + 44, + 51, + 45, + 43, + 50, + 43, + 33, + 39, + 33, + 42, + 49, + 42, + 51, + 58, + 51, + 47, + 53, + 47, + 43, + 49, + 45, + 48, + 54, + 50, + 46, + 52, + 48, + 38, + 44, + 40, + 39, + 45, + 41, + 42, + 48, + 44, + 41, + 47, + 42, +-39, +-34, +-37, +-106, +-101, +-102, +-103, +-99, +-96, +-101, +-98, +-92, +-100, +-97, +-91, +-100, +-97, +-91, +-104, +-100, +-95, +-103, +-100, +-94, +-103, +-100, +-94, +-102, +-98, +-93, +-101, +-98, +-91, +-103, +-100, +-92, +-104, +-101, +-93, +-102, +-100, +-92, +-100, +-98, +-90, +-99, +-97, +-89, +-100, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-100, +-98, +-89, +-102, +-99, +-91, +-99, +-97, +-88, +-95, +-93, +-83, +-119, +-116, +-107, +-120, +-117, +-110, +-115, +-112, +-106, +-109, +-105, +-102, +-104, +-100, +-95, +-101, +-98, +-90, +-100, +-97, +-89, +-98, +-97, +-84, +-93, +-92, +-79, +-79, +-79, +-64, +-57, +-60, +-44, + -8, +-11, + -3, +102, + 99, + 99, +102, + 99, + 91, + 94, + 90, + 80, + 85, + 79, + 71, + 81, + 80, + 74, +119, +117, +118, +111, +110, +109, +102, +101, +100, + 94, + 94, + 96, + 79, + 70, + 74, + 86, + 68, + 74, + 89, + 71, + 77, + 99, + 88, + 94, + 76, + 71, + 78, + 51, + 48, + 62, + 8, + 7, + 25, +-75, +-76, +-57, +-90, +-92, +-79, +-100, +-98, +-93, +-104, +-102, +-96, +-106, +-106, +-98, +-108, +-107, +-101, +-109, +-108, +-104, +-111, +-109, +-106, +-113, +-111, +-108, +-116, +-114, +-114, +-119, +-116, +-117, +-120, +-118, +-117, +-123, +-121, +-119, +-119, +-117, +-113, +-113, +-112, +-108, +-112, +-111, +-107, +-112, +-111, +-106, +-112, +-111, +-107, +-113, +-111, +-107, +-111, +-110, +-106, +-110, +-108, +-104, +-110, +-105, +-104, +-108, +-104, +-102, +-107, +-103, +-101, +-105, +-100, +-99, +-102, +-98, +-96, +-108, +-103, +-102, +-114, +-109, +-107, +-105, +-101, +-95, +-100, +-97, +-91, +-104, +-99, +-96, +-21, +-16, +-18, + 43, + 50, + 44, + 40, + 46, + 40, + 33, + 39, + 33, + 42, + 49, + 43, + 45, + 53, + 46, + 47, + 54, + 49, + 48, + 53, + 49, + 47, + 53, + 48, + 42, + 49, + 43, + 38, + 49, + 39, + 29, + 45, + 32, + 35, + 49, + 37, + 36, + 40, + 35, +-79, +-75, +-78, +-107, +-101, +-100, +-104, +-99, +-96, +-102, +-98, +-93, +-101, +-98, +-92, +-101, +-97, +-92, +-103, +-100, +-94, +-101, +-98, +-92, +-101, +-97, +-92, +-101, +-98, +-92, +-100, +-97, +-90, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-100, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-102, +-99, +-91, +-99, +-97, +-88, +-98, +-96, +-87, +-121, +-118, +-110, +-118, +-115, +-109, +-114, +-111, +-105, +-107, +-103, +-100, +-102, +-99, +-93, +-100, +-98, +-89, +-101, +-98, +-89, +-99, +-98, +-86, +-97, +-96, +-83, +-89, +-88, +-74, +-63, +-66, +-50, + -7, +-10, + 0, + 99, + 97, + 98, + 98, + 95, + 88, + 93, + 88, + 77, + 90, + 83, + 73, + 83, + 81, + 72, +118, +118, +120, +114, +113, +116, +108, +108, +110, + 95, + 90, + 93, + 67, + 43, + 43, + 85, + 44, + 41, + 98, + 58, + 55, + 90, + 66, + 67, + 80, + 69, + 73, + 53, + 46, + 55, +-51, +-48, +-29, +-71, +-68, +-49, +-78, +-81, +-69, +-95, +-91, +-84, +-102, +-97, +-90, +-103, +-102, +-97, +-106, +-105, +-100, +-109, +-107, +-104, +-111, +-109, +-106, +-114, +-112, +-110, +-118, +-115, +-116, +-120, +-117, +-118, +-121, +-119, +-119, +-124, +-122, +-120, +-118, +-117, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-113, +-111, +-107, +-112, +-110, +-106, +-111, +-108, +-104, +-111, +-106, +-103, +-109, +-105, +-102, +-108, +-104, +-101, +-106, +-102, +-99, +-106, +-102, +-99, +-110, +-105, +-104, +-116, +-111, +-110, +-109, +-105, +-99, +-102, +-100, +-92, +-103, +-100, +-95, + -9, + -5, + -5, + 52, + 57, + 52, + 44, + 48, + 42, + 31, + 37, + 31, + 46, + 52, + 48, + 43, + 50, + 46, + 44, + 50, + 47, + 52, + 52, + 49, + 15, + 20, + 12, + -8, + 13, + -6, + -3, + 36, + 4, +-45, + 21, +-24, + -9, + 47, + 7, + 11, + 19, + 11, +-111, +-105, +-106, +-104, +-99, +-94, +-104, +-99, +-93, +-103, +-97, +-94, +-101, +-96, +-92, +-101, +-97, +-92, +-102, +-99, +-93, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-103, +-100, +-92, +-101, +-98, +-90, +-96, +-93, +-86, +-101, +-98, +-92, +-123, +-120, +-114, +-120, +-117, +-111, +-112, +-109, +-103, +-104, +-101, +-95, +-102, +-99, +-92, +-101, +-99, +-90, +-100, +-97, +-88, +-99, +-97, +-85, +-98, +-96, +-83, +-93, +-92, +-78, +-76, +-78, +-61, +-15, +-16, + -6, + 95, + 93, + 95, + 99, + 96, + 89, + 96, + 90, + 79, + 93, + 84, + 73, + 85, + 78, + 70, +118, +117, +120, +117, +117, +119, +116, +116, +119, +112, +115, +117, + 83, + 69, + 69, + 49, + 13, + 7, + 69, + 24, + 17, + 80, + 41, + 33, + 81, + 51, + 46, + 46, + 33, + 38, +-97, +-97, +-77, +-99, +-99, +-77, +-99, +-102, +-87, +-110, +-108, +-97, +-113, +-108, +-100, +-111, +-110, +-106, +-112, +-110, +-108, +-113, +-110, +-110, +-113, +-110, +-113, +-114, +-111, +-114, +-118, +-115, +-116, +-120, +-117, +-118, +-121, +-119, +-119, +-124, +-122, +-120, +-118, +-117, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-113, +-111, +-107, +-112, +-110, +-106, +-112, +-108, +-104, +-111, +-106, +-103, +-110, +-106, +-102, +-108, +-104, +-101, +-108, +-104, +-100, +-111, +-107, +-106, +-117, +-112, +-112, +-110, +-107, +-101, +-103, +-100, +-92, +-104, +-101, +-96, + -2, + 2, + 2, + 60, + 65, + 60, + 43, + 49, + 43, + 32, + 37, + 31, + 44, + 49, + 43, + 45, + 49, + 44, + 44, + 49, + 43, + 43, + 49, + 44, + 26, + 42, + 30, +-39, + -4, +-28, +-115, +-30, +-77, +-121, + 12, +-52, +-81, + 20, +-39, +-49, +-10, +-33, +-116, +-96, +-105, +-102, +-103, +-97, +-98, +-103, +-92, +-102, +-98, +-91, +-104, +-97, +-92, +-103, +-100, +-94, +-101, +-98, +-92, +-102, +-99, +-93, +-101, +-98, +-92, +-101, +-98, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-99, +-97, +-89, +-95, +-92, +-85, +-105, +-102, +-97, +-123, +-120, +-114, +-121, +-118, +-112, +-112, +-109, +-103, +-104, +-100, +-95, +-103, +-100, +-93, +-102, +-99, +-91, +-101, +-98, +-89, +-99, +-97, +-85, +-96, +-95, +-82, +-94, +-93, +-79, +-87, +-89, +-72, +-45, +-46, +-36, + 81, + 79, + 80, + 97, + 95, + 87, + 92, + 87, + 75, + 91, + 83, + 72, + 85, + 78, + 69, +118, +117, +119, +117, +117, +119, +116, +117, +120, +109, +118, +120, +117, +111, +111, + 86, + 61, + 55, + 44, + 0, +-12, + 63, + 10, + -8, + 74, + 26, + 9, + 32, + 10, + 9, +-51, +-56, +-37, +-52, +-52, +-27, +-54, +-57, +-37, +-75, +-75, +-58, +-103, +-100, +-88, +-115, +-115, +-110, +-119, +-117, +-116, +-118, +-115, +-117, +-117, +-113, +-118, +-116, +-111, +-118, +-118, +-115, +-118, +-120, +-118, +-119, +-122, +-119, +-119, +-124, +-122, +-120, +-117, +-116, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-113, +-109, +-106, +-111, +-107, +-104, +-110, +-106, +-103, +-109, +-105, +-102, +-109, +-105, +-102, +-113, +-108, +-107, +-118, +-113, +-112, +-111, +-108, +-102, +-103, +-101, +-93, +-104, +-100, +-95, +-19, +-15, +-16, + 38, + 43, + 39, + 37, + 44, + 38, + 35, + 42, + 35, + 43, + 52, + 43, + 51, + 59, + 49, + 37, + 47, + 36, + -2, + 21, + 8, +-57, +-25, +-43, +-105, +-46, +-79, +-125, +-37, +-85, +-104, + 12, +-49, +-107, + 9, +-53, +-88, +-11, +-48, +-123, +-90, +-107, +-100, +-101, +-97, +-94, +-104, +-92, +-100, +-99, +-88, +-107, +-100, +-93, +-104, +-101, +-95, +-104, +-100, +-95, +-102, +-99, +-93, +-102, +-98, +-93, +-102, +-98, +-93, +-101, +-98, +-90, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-99, +-96, +-88, +-95, +-92, +-85, +-112, +-108, +-103, +-123, +-120, +-114, +-121, +-118, +-112, +-116, +-113, +-108, +-108, +-105, +-99, +-103, +-100, +-93, +-100, +-97, +-89, +-99, +-97, +-88, +-97, +-96, +-84, +-94, +-92, +-79, +-94, +-93, +-79, +-93, +-95, +-77, +-78, +-79, +-68, + 53, + 51, + 51, + 97, + 93, + 86, + 87, + 82, + 70, + 90, + 82, + 71, + 86, + 79, + 70, +116, +116, +118, +117, +117, +119, +112, +113, +115, +104, +112, +114, +107, +108, +110, +105, + 90, + 87, + 55, + 21, + 9, + 60, + 6, +-18, + 71, + 15, +-10, + 45, + 14, + 8, +-28, +-37, +-20, +-40, +-42, +-13, +-46, +-51, +-25, +-54, +-55, +-32, +-78, +-77, +-59, +-97, +-97, +-87, +-112, +-111, +-104, +-119, +-117, +-115, +-121, +-117, +-120, +-120, +-115, +-121, +-120, +-117, +-119, +-121, +-118, +-120, +-122, +-120, +-120, +-124, +-122, +-120, +-115, +-114, +-110, +-114, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-113, +-110, +-106, +-112, +-108, +-104, +-111, +-107, +-103, +-109, +-105, +-102, +-111, +-107, +-103, +-114, +-110, +-109, +-116, +-111, +-111, +-113, +-110, +-103, +-102, +-99, +-91, +-104, +-101, +-96, +-18, +-13, +-14, + 35, + 40, + 37, + 32, + 39, + 34, + 31, + 44, + 34, + 31, + 49, + 35, + 32, + 53, + 35, + -9, + 17, + -3, +-51, + -7, +-30, +-85, +-40, +-64, +-94, +-48, +-76, +-93, +-43, +-76, +-85, +-25, +-65, +-81, + -9, +-52, +-113, +-36, +-73, +-105, +-63, +-83, +-105, +-98, +-98, +-96, +-100, +-92, +-101, +-100, +-92, +-108, +-102, +-97, +-105, +-102, +-96, +-105, +-102, +-96, +-104, +-101, +-95, +-104, +-101, +-95, +-104, +-101, +-95, +-103, +-100, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-99, +-96, +-88, +-99, +-97, +-89, +-120, +-117, +-111, +-124, +-121, +-115, +-121, +-118, +-112, +-119, +-116, +-110, +-111, +-108, +-103, +-104, +-101, +-94, +-99, +-96, +-88, +-98, +-95, +-86, +-96, +-95, +-83, +-93, +-92, +-79, +-94, +-93, +-79, +-93, +-95, +-77, +-90, +-92, +-80, + -9, +-11, +-11, + 94, + 91, + 83, + 90, + 85, + 73, + 93, + 84, + 74, + 88, + 81, + 72, +116, +115, +118, +118, +117, +119, +112, +111, +114, +105, +107, +112, +104, +107, +112, +105, +100, +101, + 56, + 34, + 25, + 54, + 10, +-15, + 67, + 12, +-18, + 48, + 10, + -1, +-19, +-32, +-16, +-30, +-33, + -3, +-35, +-40, +-10, +-44, +-48, +-19, +-68, +-70, +-46, +-84, +-87, +-69, +-100, +-101, +-87, +-111, +-111, +-103, +-119, +-117, +-115, +-121, +-118, +-120, +-120, +-117, +-118, +-121, +-118, +-120, +-122, +-120, +-120, +-121, +-119, +-117, +-114, +-113, +-109, +-114, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-115, +-111, +-108, +-114, +-110, +-106, +-112, +-107, +-104, +-109, +-105, +-102, +-111, +-107, +-103, +-113, +-108, +-107, +-116, +-111, +-110, +-114, +-111, +-105, +-103, +-101, +-93, +-104, +-100, +-95, + 2, + 6, + 5, + 48, + 53, + 50, + 26, + 34, + 29, + 30, + 47, + 36, + 1, + 29, + 11, +-50, +-10, +-36, +-64, +-16, +-46, +-54, +-10, +-36, +-79, +-41, +-64, +-91, +-55, +-77, +-78, +-41, +-63, +-88, +-44, +-68, +-96, +-44, +-70, +-83, +-34, +-61, +-68, +-33, +-49, +-109, +-88, +-94, +-102, +-94, +-94, +-105, +-102, +-101, +-107, +-104, +-101, +-105, +-102, +-96, +-105, +-102, +-96, +-106, +-102, +-96, +-106, +-102, +-97, +-106, +-102, +-97, +-104, +-101, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-97, +-89, +-97, +-94, +-86, +-105, +-102, +-94, +-123, +-120, +-114, +-122, +-119, +-113, +-121, +-118, +-112, +-120, +-117, +-111, +-116, +-112, +-107, +-107, +-104, +-97, +-100, +-97, +-89, +-96, +-94, +-85, +-95, +-94, +-81, +-91, +-90, +-77, +-89, +-88, +-74, +-88, +-89, +-72, +-85, +-86, +-74, +-67, +-69, +-68, + 75, + 72, + 64, + 95, + 90, + 78, + 93, + 84, + 73, + 88, + 81, + 72, +117, +116, +118, +117, +116, +119, +117, +116, +119, +114, +114, +117, +111, +115, +120, +106, +108, +109, + 49, + 36, + 26, + 45, + 7, +-21, + 67, + 17, +-18, + 55, + 17, + 2, +-13, +-31, +-21, +-31, +-35, + -7, +-36, +-38, + -7, +-45, +-50, +-22, +-65, +-70, +-45, +-84, +-86, +-68, +-96, +-93, +-81, +-110, +-105, +-101, +-115, +-113, +-112, +-116, +-119, +-118, +-118, +-118, +-121, +-122, +-118, +-122, +-125, +-119, +-122, +-122, +-114, +-114, +-116, +-112, +-108, +-114, +-112, +-107, +-114, +-114, +-107, +-114, +-114, +-108, +-115, +-113, +-109, +-116, +-114, +-111, +-115, +-113, +-111, +-115, +-113, +-110, +-114, +-111, +-108, +-113, +-110, +-107, +-110, +-108, +-104, +-109, +-106, +-102, +-110, +-107, +-103, +-112, +-108, +-107, +-115, +-112, +-111, +-115, +-113, +-108, +-105, +-103, +-98, +-103, +-100, +-97, + 10, + 14, + 14, + 45, + 50, + 47, + 22, + 35, + 26, +-24, + 1, +-13, +-84, +-41, +-65, +-102, +-46, +-74, +-85, +-32, +-62, +-84, +-51, +-73, +-80, +-54, +-75, +-56, +-30, +-51, +-25, + 6, +-15, +-86, +-41, +-62, +-83, +-33, +-55, +-85, +-43, +-68, +-83, +-45, +-65, +-55, +-27, +-45, +-13, + 5, +-12, +-84, +-77, +-85, +-106, +-104, +-102, +-106, +-103, +-98, +-108, +-101, +-97, +-109, +-101, +-97, +-108, +-102, +-97, +-105, +-104, +-98, +-104, +-102, +-94, +-103, +-101, +-92, +-103, +-100, +-92, +-101, +-99, +-91, +-100, +-98, +-90, +-100, +-97, +-89, +-100, +-98, +-89, +-101, +-98, +-89, +-100, +-98, +-89, +-100, +-97, +-88, +-97, +-95, +-86, +-110, +-107, +-100, +-124, +-121, +-118, +-121, +-118, +-115, +-120, +-118, +-114, +-119, +-117, +-112, +-116, +-114, +-109, +-112, +-109, +-103, +-104, +-101, +-94, +-98, +-95, +-87, +-94, +-92, +-81, +-89, +-87, +-75, +-87, +-86, +-72, +-86, +-87, +-70, +-79, +-81, +-65, +-72, +-74, +-67, + 52, + 50, + 42, + 90, + 86, + 74, + 94, + 85, + 80, + 91, + 84, + 82, +117, +116, +119, +117, +116, +119, +117, +116, +119, +115, +116, +117, +113, +119, +121, +111, +113, +113, + 44, + 31, + 21, + 35, + -2, +-33, + 58, + 9, +-29, + 69, + 31, + 12, + 21, + -3, + 0, +-38, +-45, +-20, +-47, +-48, +-16, +-48, +-52, +-25, +-53, +-56, +-31, +-81, +-79, +-57, +-95, +-89, +-77, +-108, +-102, +-97, +-115, +-111, +-108, +-119, +-118, +-115, +-118, +-121, +-121, +-123, +-122, +-124, +-122, +-117, +-119, +-118, +-112, +-111, +-113, +-113, +-108, +-109, +-113, +-106, +-114, +-114, +-106, +-114, +-114, +-107, +-115, +-113, +-109, +-116, +-114, +-112, +-115, +-113, +-112, +-114, +-112, +-111, +-111, +-110, +-106, +-111, +-110, +-106, +-109, +-108, +-103, +-109, +-107, +-103, +-110, +-109, +-105, +-112, +-110, +-108, +-116, +-114, +-112, +-116, +-114, +-112, +-64, +-63, +-61, +-39, +-37, +-36, + 16, + 18, + 19, + 32, + 41, + 32, +-38, +-17, +-32, +-99, +-55, +-79, +-95, +-41, +-69, +-104, +-49, +-78, +-103, +-56, +-84, +-70, +-42, +-61, +-48, +-23, +-45, +-21, + 2, +-22, +-60, +-30, +-56, +-89, +-49, +-74, +-99, +-51, +-77, +-101, +-50, +-82, +-75, +-31, +-58, +-85, +-49, +-78, +-54, +-29, +-59, +-75, +-55, +-76, +-107, +-101, +-103, +-105, +-104, +-100, +-109, +-101, +-99, +-112, +-100, +-97, +-109, +-101, +-97, +-105, +-103, +-97, +-105, +-103, +-95, +-104, +-102, +-93, +-103, +-101, +-92, +-101, +-99, +-91, +-101, +-99, +-91, +-101, +-99, +-91, +-101, +-99, +-89, +-101, +-99, +-89, +-101, +-99, +-89, +-100, +-98, +-88, +-101, +-99, +-89, +-118, +-115, +-107, +-123, +-121, +-121, +-122, +-119, +-119, +-120, +-118, +-116, +-116, +-115, +-112, +-114, +-112, +-108, +-114, +-112, +-107, +-109, +-106, +-100, +-100, +-97, +-89, +-96, +-94, +-84, +-88, +-86, +-75, +-82, +-81, +-68, +-82, +-82, +-66, +-77, +-81, +-60, +-62, +-64, +-52, + 46, + 46, + 37, + 91, + 88, + 76, + 98, + 89, + 89, +101, + 95, + 97, +117, +116, +119, +117, +116, +119, +117, +116, +119, +116, +116, +118, +115, +118, +121, +112, +110, +111, + 39, + 24, + 15, + 31, + -4, +-32, + 47, + -2, +-36, + 80, + 34, + 14, + 82, + 51, + 52, + 2, +-12, + 9, +-38, +-43, +-12, +-48, +-53, +-25, +-57, +-57, +-32, +-70, +-70, +-47, +-82, +-92, +-74, +-96, +-108, +-95, +-111, +-113, +-105, +-126, +-116, +-111, +-121, +-121, +-117, +-120, +-124, +-120, +-106, +-107, +-104, +-106, +-107, +-103, +-107, +-113, +-107, +-107, +-115, +-108, +-113, +-114, +-108, +-114, +-113, +-108, +-115, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-109, +-111, +-109, +-106, +-108, +-107, +-103, +-110, +-109, +-105, +-110, +-108, +-104, +-110, +-109, +-105, +-112, +-110, +-106, +-113, +-112, +-109, +-115, +-113, +-111, +-118, +-116, +-114, +-76, +-75, +-73, +-38, +-36, +-34, + -3, + -1, + 0, + 0, + 16, + 2, +-63, +-36, +-58, +-88, +-44, +-72, +-90, +-40, +-71, +-101, +-53, +-85, +-60, +-23, +-52, +-44, +-11, +-37, +-36, + -6, +-31, +-73, +-41, +-70, +-101, +-63, +-93, +-111, +-65, +-94, +-84, +-37, +-68, +-78, +-31, +-63, +-88, +-43, +-71, +-84, +-42, +-77, +-105, +-63, +-107, +-52, +-17, +-51, +-84, +-68, +-82, +-99, +-102, +-100, +-105, +-104, +-103, +-106, +-102, +-100, +-108, +-102, +-98, +-108, +-102, +-95, +-107, +-104, +-96, +-106, +-103, +-95, +-104, +-102, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-101, +-99, +-90, +-107, +-104, +-96, +-125, +-123, +-116, +-125, +-122, +-123, +-123, +-121, +-121, +-122, +-120, +-118, +-118, +-116, +-113, +-113, +-112, +-108, +-113, +-110, +-105, +-110, +-107, +-101, +-105, +-103, +-94, +-102, +-100, +-90, +-93, +-92, +-80, +-84, +-82, +-69, +-78, +-77, +-63, +-76, +-79, +-58, +-56, +-59, +-45, + 54, + 52, + 47, + 95, + 91, + 80, + 95, + 87, + 84, + 93, + 89, + 81, +117, +116, +119, +117, +116, +119, +115, +114, +117, +112, +113, +116, +113, +113, +117, +107, +102, +102, + 29, + 13, + 3, + 24, + -9, +-34, + 45, + -1, +-30, + 92, + 44, + 26, + 90, + 55, + 53, + 49, + 28, + 40, +-27, +-40, +-21, +-37, +-49, +-32, +-14, +-29, +-22, + 29, + 4, + 6, + 56, + 19, + 22, + 31, + -6, + -4, +-66, +-87, +-87, +-117, +-115, +-118, +-120, +-119, +-119, +-114, +-115, +-114, +-27, +-27, +-27, +-85, +-85, +-83, +-111, +-111, +-109, +-112, +-111, +-109, +-115, +-113, +-111, +-115, +-114, +-110, +-116, +-114, +-110, +-115, +-114, +-110, +-112, +-110, +-107, +-109, +-108, +-104, +-109, +-107, +-103, +-110, +-109, +-105, +-110, +-109, +-105, +-112, +-110, +-106, +-113, +-111, +-107, +-114, +-112, +-109, +-114, +-112, +-111, +-118, +-116, +-114, +-115, +-113, +-112, +-95, +-93, +-92, + 15, + 17, + 18, +-53, +-36, +-50, +-81, +-50, +-74, +-55, +-17, +-45, +-89, +-46, +-76, +-73, +-32, +-64, +-71, +-35, +-65, +-43, + -9, +-39, +-88, +-50, +-81, +-98, +-56, +-88, +-103, +-59, +-91, +-81, +-38, +-70, +-55, +-11, +-46, +-56, +-13, +-49, +-97, +-55, +-83, +-59, +-17, +-54, +-70, +-26, +-71, +-104, +-58, +-101, +-43, +-30, +-45, + -5, + -5, +-12, +-80, +-83, +-91, +-100, +-104, +-109, +-105, +-104, +-105, +-110, +-103, +-99, +-108, +-104, +-97, +-107, +-104, +-96, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-95, +-105, +-102, +-95, +-105, +-102, +-96, +-104, +-101, +-94, +-112, +-109, +-103, +-126, +-124, +-119, +-125, +-123, +-123, +-124, +-121, +-122, +-123, +-121, +-119, +-119, +-117, +-114, +-113, +-112, +-108, +-111, +-108, +-103, +-109, +-106, +-100, +-109, +-106, +-98, +-104, +-102, +-92, +-101, +-99, +-88, +-91, +-90, +-77, +-80, +-79, +-66, +-73, +-76, +-56, +-58, +-61, +-44, + 50, + 48, + 46, + 95, + 93, + 81, + 96, + 88, + 82, + 88, + 85, + 70, +116, +116, +118, +117, +116, +119, +113, +113, +116, +110, +110, +115, +112, +110, +114, +103, + 95, + 95, + 25, + 7, + -3, + 29, + -2, +-23, + 56, + 17, + -6, + 94, + 57, + 42, + 93, + 62, + 56, + 75, + 48, + 50, + 16, + -9, + -9, + 36, + 9, + 2, + 65, + 29, + 17, + 62, + 16, + 0, + 67, + 19, + 3, + 69, + 26, + 14, +-15, +-44, +-52, +-108, +-123, +-127, +-87, +-100, +-107, + -5, +-21, +-25, + 61, + 47, + 46, +-76, +-86, +-86, +-110, +-112, +-110, +-113, +-109, +-108, +-115, +-113, +-112, +-115, +-113, +-111, +-115, +-113, +-110, +-112, +-111, +-107, +-107, +-107, +-101, +-110, +-109, +-103, +-111, +-110, +-106, +-111, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-114, +-112, +-108, +-114, +-112, +-109, +-114, +-112, +-110, +-118, +-116, +-114, +-119, +-117, +-115, +-93, +-91, +-89, + 15, + 17, + 19, +-67, +-54, +-63, +-88, +-61, +-82, +-48, +-17, +-41, +-48, +-11, +-38, +-44, + -3, +-33, +-80, +-38, +-68, +-84, +-47, +-83, +-89, +-51, +-84, +-62, +-23, +-54, +-62, +-22, +-54, +-62, +-27, +-60, + 1, + 38, + -2, +-15, + 28, +-13, +-17, + 21, + -6, +-20, + 18, +-14, +-20, + 21, +-22, +-31, + 9, +-31, +-29, + -4, +-30, + 38, + 46, + 25, + 49, + 45, + 25, + 23, + 13, + -3, +-58, +-65, +-74, +-107, +-103, +-105, +-108, +-104, +-98, +-107, +-105, +-97, +-106, +-103, +-95, +-106, +-103, +-95, +-106, +-103, +-95, +-106, +-103, +-95, +-108, +-104, +-99, +-108, +-104, +-99, +-108, +-104, +-99, +-108, +-105, +-99, +-120, +-116, +-110, +-127, +-124, +-120, +-126, +-123, +-123, +-124, +-121, +-122, +-123, +-121, +-120, +-122, +-120, +-117, +-117, +-116, +-112, +-113, +-111, +-107, +-108, +-105, +-99, +-107, +-104, +-96, +-105, +-103, +-93, +-104, +-103, +-92, +-98, +-97, +-84, +-88, +-86, +-76, +-69, +-72, +-52, +-54, +-58, +-38, + 22, + 20, + 19, + 94, + 91, + 81, + 96, + 89, + 82, + 91, + 86, + 71, +116, +116, +118, +117, +116, +119, +114, +113, +116, +112, +112, +118, +114, +112, +115, + 69, + 60, + 59, + 27, + 7, + -2, + 31, + 0, +-18, + 57, + 25, + 5, + 79, + 55, + 45, + 97, + 72, + 65, + 95, + 65, + 57, + 73, + 37, + 20, + 59, + 17, + -9, + 51, + -2, +-32, + 54, + -2, +-30, + 54, + 11, +-16, + 18, +-12, +-31, +-67, +-89, +-97, +-30, +-48, +-41, + 54, + 17, + 10, + 85, + 42, + 34, + 92, + 51, + 49, + 16, +-18, +-16, +-92, +-113, +-107, +-106, +-115, +-108, +-113, +-112, +-112, +-113, +-111, +-110, +-113, +-111, +-109, +-109, +-108, +-103, +-107, +-107, +-100, +-110, +-110, +-102, +-113, +-111, +-107, +-113, +-111, +-107, +-112, +-111, +-107, +-112, +-110, +-106, +-114, +-112, +-108, +-114, +-112, +-109, +-114, +-112, +-110, +-118, +-116, +-114, +-117, +-115, +-113, +-80, +-78, +-77, + 30, + 32, + 34, + -5, + 5, + -2, +-75, +-58, +-71, +-69, +-44, +-62, +-52, +-18, +-41, +-90, +-47, +-73, +-91, +-42, +-72, +-69, +-37, +-74, +-41, + -7, +-42, +-27, + 10, +-21, +-58, +-22, +-54, +-81, +-52, +-86, +-30, + 0, +-40, +-49, + -7, +-49, +-23, + 13, +-14, + -6, + 27, + 1, +-22, + 9, +-22, +-68, +-38, +-69, +-44, +-17, +-45, +-24, + -8, +-39, + 28, + 25, + -6, + 66, + 51, + 25, + 41, + 28, + 12, +-93, +-96, +-102, +-109, +-106, +-101, +-109, +-106, +-98, +-107, +-105, +-97, +-107, +-104, +-96, +-107, +-104, +-96, +-107, +-104, +-97, +-111, +-107, +-103, +-112, +-107, +-104, +-112, +-108, +-105, +-113, +-109, +-106, +-122, +-118, +-114, +-126, +-122, +-120, +-125, +-122, +-123, +-124, +-121, +-122, +-123, +-121, +-120, +-123, +-121, +-118, +-121, +-120, +-116, +-119, +-117, +-112, +-110, +-107, +-101, +-107, +-104, +-97, +-105, +-103, +-93, +-102, +-100, +-89, +-99, +-97, +-85, +-96, +-94, +-84, +-80, +-82, +-63, +-51, +-56, +-36, + -8, +-10, + -9, + 92, + 89, + 78, + 98, + 91, + 82, + 94, + 87, + 74, +114, +113, +115, +112, +111, +114, +109, +108, +111, +107, +108, +115, + 97, + 92, + 97, + 19, + 2, + 3, + 32, + 6, + -1, + 24, + -6, +-22, + 41, + 11, + -7, + 68, + 38, + 28, + 81, + 49, + 37, + 68, + 34, + 16, + 43, + 3, +-23, + 45, + 2, +-32, + 51, + 5, +-33, + 53, + 8, +-23, + 23, +-13, +-31, +-30, +-59, +-66, + 35, + 6, + -6, + 59, + 28, + 11, + 51, + -2, +-25, + 55, + 0, +-20, + 69, + 20, + 9, + 40, + -3, + -6, + 34, + -4, + -5, + 53, + 16, + 16, +-12, +-34, +-38, +-82, +-97, +-98, +-91, +-101, +-99, +-107, +-107, +-105, +-116, +-106, +-107, +-118, +-107, +-108, +-113, +-111, +-108, +-113, +-112, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-112, +-108, +-116, +-112, +-110, +-118, +-114, +-112, +-120, +-116, +-115, +-72, +-68, +-69, + 34, + 39, + 38, + 22, + 30, + 25, +-41, +-27, +-38, +-76, +-48, +-71, +-56, +-18, +-48, +-94, +-52, +-82, +-75, +-38, +-67, +-47, +-18, +-52, +-40, +-11, +-43, +-35, + -6, +-37, +-49, +-22, +-52, +-97, +-73, +-102, +-28, + -5, +-36, +-47, +-15, +-49, +-42, + -5, +-35, +-41, + 0, +-29, +-47, + -8, +-38, +-60, +-30, +-56, +-53, +-23, +-51, +-27, +-18, +-47, + 43, + 28, + -5, + 59, + 34, + 3, + 62, + 46, + 21, +-15, +-24, +-38, +-107, +-107, +-103, +-110, +-107, +-101, +-108, +-106, +-100, +-108, +-106, +-101, +-110, +-106, +-101, +-111, +-108, +-101, +-111, +-109, +-102, +-112, +-110, +-104, +-113, +-111, +-107, +-118, +-114, +-114, +-21, +-18, +-21, +-107, +-103, +-107, +-126, +-123, +-124, +-125, +-122, +-123, +-124, +-122, +-122, +-124, +-122, +-122, +-122, +-120, +-119, +-121, +-118, +-114, +-116, +-112, +-107, +-111, +-108, +-101, +-107, +-104, +-98, +-102, +-99, +-92, +-100, +-97, +-89, +-97, +-96, +-85, +-88, +-89, +-73, +-59, +-60, +-43, +-18, +-20, +-12, + 84, + 81, + 76, + 95, + 88, + 77, + 94, + 86, + 76, +103, +102, +104, + 99, + 98, +101, + 96, + 96, + 98, + 96, + 97, +105, + 50, + 44, + 50, + 13, + -6, + -6, + 30, + 4, + -4, + 25, + -4, +-20, + 31, + 1, +-16, + 43, + 9, + -1, + 42, + 6, + -7, + 31, + -6, +-26, + 35, + -4, +-31, + 47, + 6, +-26, + 49, + 12, +-14, + 44, + 13, + -5, + 25, + -3, +-19, + 65, + 31, + 14, + 67, + 29, + 3, + 50, + 5, +-31, + 49, + -4, +-36, + 54, + 2, +-22, + 60, + 12, + -5, + 68, + 21, + 10, + 58, + 10, + 0, + 72, + 21, + 11, + 77, + 29, + 19, + 75, + 33, + 28, + 56, + 26, + 26, +-59, +-73, +-71, +-108, +-108, +-108, +-113, +-109, +-109, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-115, +-111, +-108, +-117, +-113, +-109, +-118, +-114, +-111, +-120, +-115, +-114, +-58, +-54, +-55, + 35, + 41, + 39, + 30, + 28, + 26, + -6, + -5, +-13, +-42, +-29, +-48, +-52, +-32, +-57, +-23, + -7, +-30, + -2, + 15, + -9, + -4, + 15, +-12, + 20, + 39, + 13, +-60, +-39, +-65, +-58, +-36, +-63, +-85, +-64, +-88, +-17, + 6, +-23, +-47, +-21, +-54, +-67, +-29, +-62, +-54, +-11, +-41, +-63, +-25, +-50, +-61, +-33, +-54, +-66, +-44, +-64, +-41, +-46, +-66, + 35, + 0, +-24, + 61, + 18, +-11, + 67, + 37, + 10, + 54, + 30, + 12, +-86, +-95, +-99, +-109, +-109, +-105, +-111, +-110, +-106, +-110, +-108, +-104, +-112, +-109, +-103, +-114, +-111, +-105, +-113, +-113, +-104, +-114, +-114, +-107, +-116, +-114, +-111, +-122, +-119, +-120, + 27, + 30, + 26, +-82, +-79, +-83, +-125, +-122, +-123, +-123, +-121, +-121, +-123, +-120, +-121, +-122, +-120, +-120, +-120, +-117, +-117, +-120, +-117, +-114, +-119, +-116, +-110, +-117, +-113, +-107, +-112, +-109, +-103, +-106, +-103, +-96, +-102, +-99, +-92, +-98, +-97, +-89, +-94, +-93, +-81, +-83, +-83, +-67, +-48, +-49, +-38, + 48, + 44, + 44, + 97, + 89, + 81, + 97, + 89, + 80, +109, +109, +111, +106, +106, +108, +103, +103, +106, + 99, +100, +108, + 54, + 48, + 52, + 21, + 3, + 0, + 26, + 0, + -9, + 30, + 0, +-13, + 30, + -1, +-14, + 33, + -1, + -9, + 37, + 2, +-11, + 33, + -4, +-22, + 40, + 0, +-22, + 53, + 12, +-15, + 71, + 33, + 19, + 86, + 53, + 43, + 83, + 51, + 28, + 56, + 23, +-13, + 45, + 5, +-33, + 50, + 3, +-32, + 48, + 3, +-24, + 66, + 21, + -2, + 73, + 24, + 5, + 53, + 1, +-18, + 54, + -4, +-25, + 65, + 2, +-19, + 62, + -3, +-22, + 60, + 4, + -7, + 45, + 6, + 4, +-54, +-74, +-72, +-104, +-112, +-107, +-109, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-115, +-111, +-108, +-117, +-113, +-109, +-118, +-114, +-111, +-119, +-114, +-113, +-44, +-40, +-41, + 44, + 49, + 47, + 47, + 43, + 39, + 25, + 21, + 15, + -8, + -8, +-19, +-18, +-14, +-30, +-15, +-11, +-27, + 25, + 29, + 13, + 39, + 45, + 27, + 43, + 52, + 33, + -7, + 6, +-14, +-71, +-53, +-77, +-62, +-40, +-64, +-41, +-17, +-46, +-57, +-31, +-67, +-61, +-27, +-63, +-42, + -6, +-36, +-57, +-27, +-47, +-52, +-33, +-42, +-102, +-92, +-98, +-66, +-85, +-93, + 23, +-26, +-41, + 60, + 7, +-19, + 76, + 36, + 7, + 76, + 42, + 20, + -6, +-23, +-33, +-107, +-112, +-114, +-112, +-113, +-110, +-113, +-111, +-106, +-115, +-112, +-106, +-117, +-113, +-108, +-117, +-117, +-110, +-119, +-118, +-113, +-120, +-119, +-116, +-118, +-115, +-115, + 49, + 52, + 49, +-84, +-81, +-84, +-122, +-120, +-117, +-120, +-119, +-115, +-120, +-118, +-115, +-115, +-114, +-111, +-110, +-109, +-105, +-112, +-110, +-105, +-114, +-112, +-104, +-116, +-113, +-105, +-114, +-112, +-104, +-112, +-110, +-101, +-115, +-112, +-104, +-114, +-112, +-107, +-113, +-110, +-102, +-112, +-111, +-97, +-99, +-101, +-88, +-69, +-74, +-71, + 67, + 57, + 54, + 98, + 90, + 81, +113, +112, +115, +111, +110, +113, +109, +109, +112, +107, +108, +115, + 41, + 36, + 38, + 22, + 4, + -1, + 25, + -1, +-11, + 35, + 4, + -7, + 27, + -5, +-14, + 31, + -1, +-10, + 47, + 14, + 3, + 52, + 16, + 2, + 43, + 5, +-13, + 37, + -3, +-24, + 66, + 20, + 5, + 69, + 22, + 3, + 52, + 11, +-23, + 41, + 5, +-36, + 44, + 11, +-21, + 47, + 16, + -4, + 63, + 26, + 5, + 72, + 30, + 6, + 54, + 6, +-19, + 52, + -1, +-26, + 58, + -1, +-25, + 45, +-15, +-39, + 43, + -9, +-29, + 26, +-14, +-28, +-56, +-79, +-85, +-105, +-112, +-112, +-112, +-111, +-108, +-114, +-110, +-106, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-111, +-107, +-114, +-110, +-107, +-115, +-111, +-108, +-116, +-111, +-111, +-33, +-29, +-30, + 46, + 51, + 49, + 48, + 55, + 48, + 47, + 54, + 45, + 23, + 28, + 20, + 13, + 17, + 7, + 36, + 40, + 29, + 41, + 47, + 34, + 48, + 53, + 40, + 52, + 57, + 44, + 32, + 44, + 27, +-60, +-44, +-63, +-49, +-27, +-50, +-47, +-22, +-50, +-53, +-26, +-63, +-51, +-22, +-58, +-34, + -7, +-37, +-87, +-66, +-83, +-102, +-91, +-93, +-123, +-115, +-113, +-105, +-119, +-122, +-15, +-58, +-72, + 35, +-11, +-40, + 71, + 38, + 4, + 66, + 40, + 9, + 66, + 47, + 30, +-49, +-60, +-67, +-112, +-115, +-114, +-115, +-112, +-107, +-116, +-113, +-107, +-119, +-117, +-112, +-121, +-120, +-116, +-122, +-120, +-118, +-123, +-121, +-119, +-98, +-97, +-96, + 17, + 19, + 18, +-105, +-103, +-102, +-109, +-108, +-102, +-110, +-109, +-103, +-110, +-109, +-103, +-109, +-109, +-102, +-103, +-102, +-95, +-100, +-99, +-91, +-100, +-98, +-88, +-97, +-95, +-85, +-95, +-93, +-83, +-97, +-95, +-85, +-97, +-94, +-84, +-98, +-96, +-92, +-111, +-109, +-102, +-107, +-107, +-93, +-98, +-99, +-86, +-87, +-92, +-86, + 45, + 36, + 33, + 97, + 89, + 81, +117, +116, +118, +116, +115, +117, +114, +113, +117, +108, +109, +117, + 9, + 3, + 4, + 18, + 1, + -8, + 22, + -3, +-15, + 35, + 3, + -4, + 33, + 1, + -4, + 37, + 6, + -2, + 41, + 9, + -1, + 43, + 9, + -3, + 31, + -6, +-20, + 22, +-18, +-34, + 37, + -7, +-26, + 41, + -5, +-28, + 42, + -4, +-30, + 50, + 6, +-21, + 54, + 17, + -7, + 65, + 33, + 15, + 62, + 26, + 1, + 54, + 11, +-17, + 54, + 7, +-21, + 51, + 1, +-24, + 37, +-12, +-30, + 40, + -5, +-19, + 7, +-22, +-32, +-69, +-85, +-91, +-111, +-111, +-112, +-117, +-109, +-107, +-117, +-109, +-107, +-114, +-110, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-110, +-107, +-114, +-110, +-108, +-115, +-111, +-110, +-15, +-10, +-12, + 42, + 47, + 45, + 43, + 59, + 47, + 34, + 49, + 38, + 30, + 35, + 31, + 9, + 10, + 8, + 21, + 24, + 18, + 39, + 44, + 35, + 41, + 51, + 42, + 48, + 60, + 49, + 38, + 54, + 39, + -8, + 10, + -8, +-30, + -8, +-31, +-46, +-22, +-48, +-34, + -8, +-40, +-21, + 2, +-31, +-33, +-14, +-41, +-122, +-110, +-123, +-122, +-119, +-116, +-121, +-114, +-111, +-103, +-113, +-117, +-11, +-52, +-67, + 18, +-27, +-56, + 66, + 36, + 1, + 63, + 40, + 7, + 70, + 44, + 23, + 14, + -4, +-16, +-113, +-120, +-121, +-120, +-117, +-112, +-122, +-118, +-112, +-121, +-119, +-115, +-123, +-121, +-120, +-123, +-121, +-120, +-122, +-120, +-118, +-117, +-115, +-113, +-107, +-105, +-103, +-99, +-97, +-93, +-96, +-96, +-87, +-100, +-101, +-91, +-96, +-96, +-86, +-95, +-95, +-85, +-99, +-99, +-90, +-94, +-93, +-82, +-95, +-93, +-82, +-92, +-90, +-79, +-92, +-91, +-79, +-95, +-93, +-82, +-94, +-92, +-80, +-87, +-86, +-78, +-90, +-88, +-77, +-103, +-103, +-88, +-101, +-103, +-91, +-62, +-67, +-66, + 78, + 69, + 63, + 97, + 89, + 80, +113, +112, +115, +112, +111, +114, +110, +110, +114, +103, +104, +112, + -1, + -7, + -8, + 1, +-15, +-26, + 26, + 2, +-11, + 30, + -1, + -8, + 41, + 8, + 5, + 40, + 11, + 3, + 44, + 12, + 4, + 33, + -1, +-11, + 34, + -3, +-15, + 43, + 3, +-10, + 42, + 10, + -3, + 43, + 15, + 1, + 45, + 5, + -6, + 48, + -2, +-15, + 51, + -1, +-24, + 58, + 8, +-24, + 49, + 4, +-28, + 53, + 7, +-23, + 48, + 3, +-26, + 36, + -7, +-27, + 17, +-18, +-30, +-29, +-55, +-60, +-102, +-117, +-110, +-112, +-115, +-107, +-117, +-110, +-102, +-118, +-110, +-103, +-112, +-112, +-106, +-109, +-112, +-109, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-110, +-107, +-114, +-110, +-108, +-116, +-111, +-111, + 1, + 6, + 4, + 43, + 48, + 46, + 46, + 59, + 47, + 50, + 57, + 49, + 53, + 48, + 48, + 39, + 24, + 28, + 13, + 0, + -1, + 16, + 11, + 5, + -4, + 12, + 4, + -7, + 13, + 1, +-26, + -5, +-21, +-64, +-43, +-61, +-58, +-38, +-58, +-63, +-42, +-64, +-81, +-60, +-84, +-48, +-31, +-56, +-48, +-35, +-56, +-125, +-119, +-127, +-115, +-115, +-112, +-111, +-111, +-107, +-69, +-89, +-94, + 15, +-33, +-47, + 26, +-27, +-53, + 65, + 26, + -4, + 69, + 36, + 8, + 66, + 34, + 11, + 61, + 38, + 21, +-70, +-79, +-83, +-121, +-119, +-114, +-123, +-118, +-111, +-114, +-112, +-107, +-106, +-104, +-102, +-107, +-104, +-103, +-107, +-105, +-102, +-105, +-103, +-99, +-99, +-97, +-94, +-94, +-93, +-87, +-90, +-90, +-79, +-95, +-95, +-84, +-91, +-91, +-79, +-90, +-91, +-79, +-89, +-89, +-77, +-85, +-84, +-72, +-83, +-81, +-68, +-92, +-91, +-78, +-89, +-88, +-75, +-97, +-96, +-83, +-97, +-96, +-82, +-84, +-84, +-71, +-82, +-81, +-66, +-89, +-89, +-73, +-92, +-93, +-82, +-72, +-76, +-78, + 76, + 69, + 57, + 96, + 88, + 79, + 96, + 96, +104, + 97, + 97, +105, + 99, + 98, +107, + 95, + 88, +102, + 6, + 1, + 3, +-19, +-25, +-36, + 28, + 14, + -1, + 37, + 11, + 4, + 43, + 10, + 10, + 42, + 13, + 12, + 47, + 16, + 14, + 40, + 6, + 4, + 40, + 5, + 0, + 50, + 14, + 7, + 52, + 19, + 12, + 45, + 12, + 3, + 23, +-19, +-28, + 34, +-12, +-26, + 42, + -2, +-23, + 44, + 4, +-24, + 46, + 3, +-13, + 40, + -2, +-11, + 16, +-19, +-24, +-10, +-36, +-38, +-86, +-102, +-99, +-105, +-115, +-106, +-111, +-110, +-103, +-112, +-109, +-103, +-113, +-109, +-103, +-116, +-113, +-107, +-115, +-113, +-107, +-115, +-113, +-107, +-114, +-113, +-107, +-112, +-112, +-105, +-112, +-111, +-105, +-112, +-111, +-105, +-112, +-111, +-105, +-116, +-115, +-111, +-113, +-111, +-109, +-113, +-111, +-110, +-107, +-105, +-105, + 12, + 16, + 13, + 45, + 49, + 46, + 43, + 48, + 41, + 46, + 49, + 38, + 48, + 34, + 21, + 51, + 13, + -1, + 32, + -9, +-29, + 1, +-27, +-55, +-62, +-61, +-87, +-63, +-49, +-73, +-65, +-41, +-66, +-58, +-33, +-54, +-45, +-26, +-38, +-67, +-55, +-62, +-118, +-111, +-116, +-126, +-121, +-125, +-122, +-118, +-122, +-120, +-116, +-119, +-114, +-111, +-112, +-109, +-111, +-110, +-45, +-68, +-78, + 30, +-19, +-42, + 42, +-12, +-39, + 67, + 24, + -1, + 66, + 30, + 2, + 64, + 32, + 7, + 69, + 44, + 25, + 29, + 12, + 6, +-64, +-70, +-64, +-62, +-61, +-46, +-60, +-55, +-36, +-52, +-53, +-35, +-51, +-53, +-33, +-56, +-57, +-35, +-72, +-70, +-51, +-97, +-93, +-80, +-105, +-100, +-89, +-86, +-83, +-67, +-88, +-86, +-70, +-91, +-88, +-75, +-87, +-84, +-72, +-94, +-90, +-80, +-92, +-89, +-79, +-82, +-80, +-70, +-82, +-80, +-68, +-89, +-88, +-75, +-84, +-83, +-68, +-93, +-93, +-77, +-91, +-88, +-75, +-65, +-65, +-50, +-90, +-90, +-75, +-88, +-92, +-83, +-66, +-69, +-71, + 70, + 65, + 56, + 93, + 86, + 77, + 91, + 91, +100, + 92, + 92, +101, + 93, + 93, +103, + 91, + 87, +100, + 2, + 1, + 2, + 2, + 2, + -9, + -2, + -9, +-23, + 42, + 24, + 15, + 47, + 21, + 18, + 46, + 22, + 20, + 55, + 29, + 27, + 55, + 28, + 25, + 54, + 26, + 21, + 49, + 19, + 14, + 41, + 13, + 7, + 41, + 13, + 7, + 46, + 14, + 7, + 48, + 16, + 5, + 45, + 17, + 1, + 55, + 32, + 15, + 26, + 8, + -2, +-50, +-68, +-72, +-94, +-105, +-107, +-107, +-111, +-110, +-111, +-109, +-105, +-114, +-108, +-103, +-110, +-106, +-101, +-111, +-108, +-102, +-113, +-109, +-104, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-114, +-114, +-106, +-112, +-112, +-105, +-111, +-111, +-104, +-112, +-111, +-104, +-112, +-111, +-105, +-121, +-119, +-115, +-123, +-121, +-119, +-114, +-112, +-111, +-88, +-86, +-87, + 26, + 29, + 26, + 43, + 46, + 43, + 50, + 54, + 48, + 47, + 50, + 40, + 30, + 17, + 4, + 31, + -7, +-23, + 36, + -8, +-32, + 29, + -4, +-36, + 24, +-11, +-36, + 12, +-14, +-40, +-21, +-30, +-55, +-51, +-44, +-67, +-96, +-78, +-91, +-125, +-109, +-117, +-124, +-121, +-122, +-123, +-120, +-121, +-120, +-117, +-118, +-118, +-115, +-116, +-115, +-112, +-113, +-111, +-112, +-111, +-48, +-69, +-80, + 39, + -5, +-31, + 59, + 12, +-16, + 73, + 37, + 11, + 66, + 34, + 6, + 73, + 40, + 13, + 74, + 44, + 23, + 73, + 51, + 41, + 20, + 7, + 7, +-39, +-44, +-32, +-44, +-44, +-24, +-42, +-45, +-21, +-41, +-45, +-18, +-42, +-44, +-16, +-52, +-52, +-27, +-62, +-58, +-39, +-84, +-79, +-64, +-78, +-75, +-58, +-82, +-80, +-63, +-85, +-82, +-67, +-86, +-82, +-70, +-84, +-80, +-68, +-94, +-91, +-80, +-89, +-87, +-77, +-83, +-81, +-70, +-87, +-85, +-72, +-84, +-84, +-69, +-81, +-81, +-64, +-93, +-91, +-77, +-85, +-84, +-69, +-87, +-87, +-73, +-84, +-88, +-80, +-58, +-62, +-64, + 79, + 74, + 66, + 94, + 87, + 78, + 87, + 88, + 97, + 89, + 89, + 98, + 90, + 90, +100, + 91, + 92, +103, + -2, + 2, + 5, + 12, + 18, + 9, +-12, +-11, +-23, +-23, +-32, +-42, + 29, + 12, + 7, + 44, + 24, + 21, + 49, + 30, + 26, + 52, + 32, + 27, + 56, + 36, + 31, + 55, + 34, + 29, + 47, + 28, + 23, + 44, + 26, + 23, + 47, + 31, + 27, + 62, + 50, + 44, + 88, + 79, + 72, + 97, + 90, + 82, +-15, +-17, +-21, +-113, +-111, +-109, +-113, +-110, +-107, +-111, +-106, +-103, +-112, +-104, +-100, +-108, +-101, +-97, +-110, +-106, +-100, +-113, +-110, +-104, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-114, +-113, +-106, +-112, +-112, +-105, +-111, +-111, +-104, +-111, +-111, +-104, +-112, +-111, +-105, +-118, +-116, +-112, +-120, +-118, +-117, +-120, +-117, +-116, +-48, +-46, +-47, + 38, + 41, + 38, + 47, + 50, + 47, + 45, + 47, + 42, + 41, + 44, + 36, + 28, + 18, + 9, + 35, + 0, +-12, + 26, +-18, +-38, + 22, +-13, +-44, + 50, + -3, +-29, + 51, + 4, +-26, + 52, + 17, +-14, + 14, + -7, +-33, +-56, +-68, +-82, +-110, +-114, +-122, +-121, +-118, +-119, +-120, +-117, +-118, +-119, +-116, +-117, +-117, +-114, +-115, +-116, +-113, +-114, +-111, +-112, +-112, +-51, +-69, +-81, + 47, + 9, +-19, + 74, + 35, + 5, + 78, + 48, + 22, + 77, + 50, + 24, + 77, + 44, + 19, + 75, + 40, + 18, + 71, + 41, + 24, + 76, + 55, + 47, + -4, +-17, +-12, +-43, +-49, +-30, +-43, +-49, +-21, +-45, +-50, +-18, +-42, +-46, +-13, +-45, +-47, +-16, +-59, +-58, +-33, +-60, +-56, +-36, +-54, +-52, +-33, +-54, +-52, +-35, +-89, +-87, +-71, +-79, +-76, +-62, +-80, +-76, +-63, +-88, +-85, +-74, +-92, +-90, +-79, +-83, +-81, +-70, +-87, +-86, +-73, +-82, +-81, +-66, +-79, +-79, +-62, +-84, +-81, +-67, +-90, +-89, +-74, +-81, +-81, +-67, +-83, +-87, +-79, +-16, +-19, +-22, + 92, + 87, + 79, + 96, + 89, + 80, + 51, + 51, + 58, + 51, + 51, + 58, + 55, + 55, + 63, + 56, + 58, + 66, + -8, + -4, + -1, +-31, +-25, +-31, +-11, + -7, +-16, +-40, +-42, +-51, +-45, +-55, +-61, + 8, + -6, +-10, + 21, + 6, + 4, + 20, + 7, + 3, + 18, + 4, + 1, + 19, + 5, + 2, + 5, + -7, + -8, + 31, + 23, + 23, + 42, + 35, + 35, + 57, + 53, + 52, + 56, + 55, + 53, + 45, + 45, + 43, +-73, +-73, +-72, +-105, +-105, +-102, +-102, +-102, +-99, +-102, +-101, +-98, +-100, +-101, +-97, +-99, +-99, +-95, +-103, +-101, +-98, +-104, +-103, +-100, +-105, +-104, +-101, +-105, +-104, +-101, +-105, +-104, +-101, +-105, +-104, +-101, +-104, +-104, +-101, +-104, +-104, +-101, +-103, +-103, +-99, +-102, +-102, +-99, +-104, +-103, +-100, +-106, +-105, +-104, +-107, +-107, +-106, +-107, +-106, +-105, +-41, +-39, +-40, + 17, + 20, + 18, + 21, + 24, + 21, + 17, + 19, + 15, + 19, + 22, + 16, + 3, + -3, + -8, + 1, +-25, +-32, + 0, +-34, +-48, + -4, +-31, +-55, + 7, +-28, +-52, + 18, +-20, +-46, + 23, +-15, +-42, + 24, +-10, +-31, + 1, +-28, +-39, +-74, +-91, +-95, +-106, +-105, +-106, +-107, +-105, +-106, +-106, +-105, +-105, +-105, +-104, +-104, +-104, +-103, +-103, +-101, +-102, +-102, +-24, +-40, +-49, + 20, + -8, +-31, + 46, + 18, + -6, + 41, + 19, + 0, + 45, + 25, + 6, + 48, + 21, + 4, + 39, + 10, + -8, + 36, + 10, + -8, + 42, + 22, + 12, + 6, + -7, + -5, +-60, +-67, +-53, +-60, +-65, +-42, +-60, +-65, +-38, +-59, +-63, +-35, +-57, +-59, +-34, +-62, +-61, +-41, +-77, +-75, +-58, +-64, +-63, +-47, +-54, +-52, +-37, +-87, +-85, +-74, +-84, +-82, +-71, +-82, +-79, +-69, +-89, +-87, +-78, +-92, +-91, +-84, +-84, +-82, +-74, +-94, +-93, +-84, +-83, +-83, +-72, +-82, +-82, +-70, +-84, +-83, +-73, +-89, +-89, +-78, +-84, +-84, +-74, +-86, +-89, +-84, + 2, + -1, + -3, + 59, + 56, + 49, + 60, + 54, + 47 +}; diff --git a/examples/app_no_flash/src/main.cpp.1 b/examples/app_no_flash/src/main.cpp.1 new file mode 100644 index 000000000..9dd639531 --- /dev/null +++ b/examples/app_no_flash/src/main.cpp.1 @@ -0,0 +1,19 @@ +#include +#include +#include "model.tflite.h" + +#include "image.h" +#include "image2.h" + + +int main(void) { + model_init(NULL); + int8_t *inputs = (int8_t *)model_input_ptr(0); + int8_t *outputs = (int8_t *)model_output_ptr(0); + memcpy(inputs, image, sizeof(image)); // copy data to inputs + model_invoke(); + printf("%s (%d%%)\n", outputs[0] > outputs[1] ? "No human" : "Human", (outputs[1]+128)*100/255); + memcpy(inputs, image2, sizeof(image2)); // copy data to inputs + model_invoke(); + printf("%s (%d%%)\n", outputs[0] > outputs[1] ? "No human" : "Human", (outputs[1]+128)*100/255); +} diff --git a/examples/app_no_flash/src/main.xc b/examples/app_no_flash/src/main.xc new file mode 100644 index 000000000..415bc4e01 --- /dev/null +++ b/examples/app_no_flash/src/main.xc @@ -0,0 +1,8 @@ +#include + +extern void inferencer(); + +int main(void) { + inferencer(); + return 0; +} diff --git a/examples/app_no_flash/src/support.cpp b/examples/app_no_flash/src/support.cpp new file mode 100644 index 000000000..623865b81 --- /dev/null +++ b/examples/app_no_flash/src/support.cpp @@ -0,0 +1,24 @@ +#include +#include + +#include "model.tflite.h" +#include "image.h" +#include "image2.h" + +void run() { + model_init(NULL); + int8_t *inputs = (int8_t *)model_input_ptr(0); + int8_t *outputs = (int8_t *)model_output_ptr(0); + memcpy(inputs, image, sizeof(image)); // copy data to inputs + model_invoke(); + printf("%s (%d%%)\n", outputs[0] > outputs[1] ? "No human" : "Human", (outputs[1]+128)*100/255); + memcpy(inputs, image2, sizeof(image2)); // copy data to inputs + model_invoke(); + printf("%s (%d%%)\n", outputs[0] > outputs[1] ? "No human" : "Human", (outputs[1]+128)*100/255); +} + +extern "C" { + void inferencer() { + run(); + } +} diff --git a/examples/app_no_flash/vww_quant.tflite b/examples/app_no_flash/vww_quant.tflite new file mode 100644 index 000000000..2abf500af Binary files /dev/null and b/examples/app_no_flash/vww_quant.tflite differ diff --git a/examples/app_no_flash_with_ioserver/Makefile b/examples/app_no_flash_with_ioserver/Makefile new file mode 100644 index 000000000..843f94140 --- /dev/null +++ b/examples/app_no_flash_with_ioserver/Makefile @@ -0,0 +1,37 @@ +TARGET = XCORE-AI-EXPLORER +APP_NAME = + +APP_FLAGS = -report \ +-O3 -mcmodel=large -fxscope -Wno-xcore-fptrgroup \ +-g \ +-Xcompiler-xc -mtimer-abi=hwtimers \ +-DUSB_TILE='tile[1]' -DXUD_CORE_CLOCK=600 \ +-lquadflash + +# The USED_MODULES variable lists other module used by the application. +USED_MODULES = lib_xud + +# ******************************************************* +# Include AI Tools library and headers +# ******************************************************* +# The following variables are defined for AI Tools library +# and should be included when building the app. +# XMOS_AITOOLSLIB_DEFINITIONS +# XMOS_AITOOLSLIB_INCLUDES +# XMOS_AITOOLSLIB_LIBRARIES +# +ifeq ($(XMOS_AITOOLSLIB_PATH),) +$(error Path to XMOS AI Tools library and headers not set correctly!) +endif +include ${XMOS_AITOOLSLIB_PATH}/buildfiles/aitoolslib.make + +XCC_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_CPP_FLAGS = $(APP_FLAGS) -std=c++14 $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_MAP_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_LIBRARIES) + +#============================================================================= +# The following part of the Makefile includes the common build infrastructure +# for compiling XMOS applications. You should not need to edit below here. + +XMOS_MAKE_PATH ?= ../.. +include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common diff --git a/examples/app_no_flash_with_ioserver/README.rst b/examples/app_no_flash_with_ioserver/README.rst new file mode 100644 index 000000000..5bedba1ee --- /dev/null +++ b/examples/app_no_flash_with_ioserver/README.rst @@ -0,0 +1,43 @@ +Example without flash and using ioserver to communicate with the model from host +================================================================================ + +Please consult `here <../../docs/rst/flow.rst>`_ on how to install the tools. + +In order to compile this example, follow these steps:: + + python build_model.py + xmake + +The first step optimised the ``vww_quant.tflite`` model for xcore; it +produces three files:: + + model.tflite + model.tflite.cpp + model.tflite.h + +The first file is the optimised model; the second file is the generated +source code, the third file is the header for the source code. +The second step builds the project. + + +In order to run this example, follow these steps:: + + xrun --xscope bin/app_no_flash_with_ioserver.xe + +This runs the app and sets an ioserver via USB that can be communicated to +from the host. + +Then run:: + + python run_model.py + +``run_model.py`` runs the model via the xcore host interpreter on the host, +and also on the device using the ioserver via USB. + +This should print:: + + Human (98%) + Not human (1%) + Connected to XCORE_IO_SERVER via USB + Human (98%) + Not human (1%) diff --git a/examples/app_no_flash_with_ioserver/build_model.py b/examples/app_no_flash_with_ioserver/build_model.py new file mode 100644 index 000000000..b93b259a4 --- /dev/null +++ b/examples/app_no_flash_with_ioserver/build_model.py @@ -0,0 +1,15 @@ +from xmos_ai_tools import xformer + +TFLITE_MODEL_PATH = "vww_quant.tflite" +OPT_MODEL_PATH = "src/model.tflite" +NAMING_PREFIX = "model_" + +# Convert the model to XCore optimized TFLite via xformer: +xformer.convert( + TFLITE_MODEL_PATH, + OPT_MODEL_PATH, + [ + ("xcore-thread-count", "5"), + ("xcore-naming-prefix", NAMING_PREFIX), + ], +) diff --git a/examples/app_no_flash_with_ioserver/human.jpg b/examples/app_no_flash_with_ioserver/human.jpg new file mode 100644 index 000000000..d41a4570d Binary files /dev/null and b/examples/app_no_flash_with_ioserver/human.jpg differ diff --git a/examples/app_no_flash_with_ioserver/nonhuman.jpg b/examples/app_no_flash_with_ioserver/nonhuman.jpg new file mode 100644 index 000000000..230dcef1b Binary files /dev/null and b/examples/app_no_flash_with_ioserver/nonhuman.jpg differ diff --git a/examples/app_no_flash_with_ioserver/run_model.py b/examples/app_no_flash_with_ioserver/run_model.py new file mode 100644 index 000000000..1ec95d102 --- /dev/null +++ b/examples/app_no_flash_with_ioserver/run_model.py @@ -0,0 +1,92 @@ +from xmos_ai_tools.xinterpreters import TFLMHostInterpreter +from xmos_ai_tools.io_server import IOServer +import numpy as np +import cv2 + + +def img_to_arr(image_file, input_details): + im = cv2.imread(image_file) + h, w = im.shape[:2] + + # RGB conversion + im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) + + # Resize + im_rgb = cv2.resize(im, (input_details["shape"][1], input_details["shape"][2])) + + # uint8 to int8 + input_data = im_rgb.astype(np.float32) + input_data -= 128.0 + input_data = input_data.astype(input_details["dtype"]) + input_data = np.expand_dims(input_data, axis=0) + return input_data + + +def print_detections(detections): + label = "Not human" if detections[0] > detections[1] else "Human" + percentage = (detections[1] + 128) * 100 / 255 + print(f"{label} ({percentage:.0f}%)") + + +OPT_MODEL_PATH = "src/model.tflite" + +######################################################################## +# Running the model on xcore host interpreter with sample input images # +######################################################################## + +# Setup host interpreter +interpreter = TFLMHostInterpreter() +interpreter.set_model(model_path=OPT_MODEL_PATH) +interpreter.allocate_tensors() + +# Interpreter.get_input_details and interpreter.get_output_details +# return a list for each input/output in the model +# MobileNetV2 only has a single input and output, so we unwrap it +(input_details,) = interpreter.get_input_details() +(output_details,) = interpreter.get_output_details() + +print(output_details) +# Read input image and convert to array +input_data = img_to_arr("human.jpg", input_details) +interpreter.set_tensor(input_details["index"], input_data) + +# Inference +interpreter.invoke() +(detections,) = interpreter.get_tensor(output_details["index"]) +print_detections(detections) + +# Read input image and convert to array +input_data = img_to_arr("nonhuman.jpg", input_details) +interpreter.set_tensor(input_details["index"], input_data) + +# Inference +interpreter.invoke() +(detections,) = interpreter.get_tensor(output_details["index"]) +print_detections(detections) + + +######################################################################## +# Running the model on xcore device with sample input images via USB # +######################################################################## + +# The app must be running on xcore so that it can be connected via USB +# Providing output details is optional +ie = IOServer(output_details=(output_details,)) +ie.connect() + +input_data = img_to_arr("human.jpg", input_details) +ie.write_input_tensor(input_data.tobytes()) +ie.start_inference() +# ie.read_output_tensor() will return a numpy array +# Since we've provided output details, the output will be reshaped and +# Converted to the corresponding dtype automatically, otherwise we'd receive +# a 1D array of uint8's (with a number of elements being a multiple of 4) +# For this model, the output tensor is only two bytes +detections = ie.read_output_tensor().flatten() +print_detections(detections) + +input_data = img_to_arr("nonhuman.jpg", input_details) +ie.write_input_tensor(input_data.tobytes()) +ie.start_inference() +detections = ie.read_output_tensor().flatten() +print_detections(detections) diff --git a/examples/app_no_flash_with_ioserver/src/config.xscope b/examples/app_no_flash_with_ioserver/src/config.xscope new file mode 100644 index 000000000..ef80fed5b --- /dev/null +++ b/examples/app_no_flash_with_ioserver/src/config.xscope @@ -0,0 +1,3 @@ + + + diff --git a/examples/app_no_flash_with_ioserver/src/main.cpp.1 b/examples/app_no_flash_with_ioserver/src/main.cpp.1 new file mode 100644 index 000000000..9dd639531 --- /dev/null +++ b/examples/app_no_flash_with_ioserver/src/main.cpp.1 @@ -0,0 +1,19 @@ +#include +#include +#include "model.tflite.h" + +#include "image.h" +#include "image2.h" + + +int main(void) { + model_init(NULL); + int8_t *inputs = (int8_t *)model_input_ptr(0); + int8_t *outputs = (int8_t *)model_output_ptr(0); + memcpy(inputs, image, sizeof(image)); // copy data to inputs + model_invoke(); + printf("%s (%d%%)\n", outputs[0] > outputs[1] ? "No human" : "Human", (outputs[1]+128)*100/255); + memcpy(inputs, image2, sizeof(image2)); // copy data to inputs + model_invoke(); + printf("%s (%d%%)\n", outputs[0] > outputs[1] ? "No human" : "Human", (outputs[1]+128)*100/255); +} diff --git a/examples/app_no_flash_with_ioserver/src/main.xc b/examples/app_no_flash_with_ioserver/src/main.xc new file mode 100644 index 000000000..c05b72c0a --- /dev/null +++ b/examples/app_no_flash_with_ioserver/src/main.xc @@ -0,0 +1,22 @@ +#include +#include "ioserver.h" + +#define NUMBER_OF_MODELS 1 + +extern void inferencer(chanend io_channel); + +int main(void) { + chan io_channel[NUMBER_OF_MODELS]; + par { + on tile[0]: { + unsafe { + inferencer(io_channel[0]); + } + } + on tile[1]: { + // ioserver uses three threads + ioserver(io_channel, NUMBER_OF_MODELS); + } + } + return 0; +} diff --git a/examples/app_no_flash_with_ioserver/src/support.cpp b/examples/app_no_flash_with_ioserver/src/support.cpp new file mode 100644 index 000000000..2f280af36 --- /dev/null +++ b/examples/app_no_flash_with_ioserver/src/support.cpp @@ -0,0 +1,12 @@ +#include "model.tflite.h" + +void run(unsigned io_channel) { + model_init(NULL); + model_ioserver(io_channel); +} + +extern "C" { + void inferencer(unsigned io_channel) { + run(io_channel); + } +} diff --git a/examples/app_no_flash_with_ioserver/vww_quant.tflite b/examples/app_no_flash_with_ioserver/vww_quant.tflite new file mode 100644 index 000000000..2abf500af Binary files /dev/null and b/examples/app_no_flash_with_ioserver/vww_quant.tflite differ diff --git a/examples/app_profiling/Makefile b/examples/app_profiling/Makefile new file mode 100644 index 000000000..cb9e85b41 --- /dev/null +++ b/examples/app_profiling/Makefile @@ -0,0 +1,34 @@ +TARGET = XCORE-AI-EXPLORER +APP_NAME = + +APP_FLAGS = -report \ +-O3 -mcmodel=large -fxscope -Wno-xcore-fptrgroup \ +-g \ +-lquadflash + +APP_FLAGS += -DTFLMC_XCORE_PROFILE + +# ******************************************************* +# Include AI Tools library and headers +# ******************************************************* +# The following variables are defined for AI Tools library +# and should be included when building the app. +# XMOS_AITOOLSLIB_DEFINITIONS +# XMOS_AITOOLSLIB_INCLUDES +# XMOS_AITOOLSLIB_LIBRARIES +# +ifeq ($(XMOS_AITOOLSLIB_PATH),) +$(error Path to XMOS AI Tools library and headers not set correctly!) +endif +include ${XMOS_AITOOLSLIB_PATH}/buildfiles/aitoolslib.make + +XCC_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_CPP_FLAGS = $(APP_FLAGS) -std=c++14 $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_MAP_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_LIBRARIES) + +#============================================================================= +# The following part of the Makefile includes the common build infrastructure +# for compiling XMOS applications. You should not need to edit below here. + +XMOS_MAKE_PATH ?= ../.. +include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common diff --git a/examples/app_profiling/README.rst b/examples/app_profiling/README.rst new file mode 100644 index 000000000..a73003f38 --- /dev/null +++ b/examples/app_profiling/README.rst @@ -0,0 +1,200 @@ +Example without flash +===================== + +Please consult `here <../../docs/rst/flow.rst>`_ on how to install the tools. + +In order to compile and run this example follow these steps:: + + xcore-opt vww_quant.tflite -o model.tflite + mv model.tflite.cpp model.tflite.h src + xmake + xrun --xscope bin/app_no_flash.xe + +This should print around 300 lines ending with:: + + [...] + Human (98%) + +The lines printed are profiling information which we will explain in detail +below. Profiling is enabled by this line in the Makefile:: + + APP_FLAGS += -DTFLMC_XCORE_PROFILE + +We show how profiling can be used to reduce execution time from 74 to 8 +milli-seconds. + +Purpose of profiling +-------------------- + +The purpose of profiling is for you to understand how fast the network +runs, and which parts of the network are taking how much time. If some +parts of the network are taking too much time, they may be remedied by +changing the network, or by suggesting an optimisation for this type of +network to the team at XMOS. + +How to enable profiling +----------------------- + +Profiling is controlled by a ``#define``. By defining the +``TFLMC_XCORE_PROFILE`` symbol profiling will be printed out. + +Interpreting the profiling output +--------------------------------- + +Profiling output comprises nine sections: + +* Per node, per class, and total time for the initialisation, +* Per node, per class, and total time for the preparation, and +* Per node, per class, and total time for the inference + +Typically, the last two are the most interesting. + +All times are printed in 10 ns ticks (0.000,000,01 second), and summarised +in milliseconds. + +* Per node profiling lists the number of tick for each node in the graph + (eg, a Convolution or a Sigmoid) + +* Summaries add together all nodes of the same type, and show the total + number of ticks and milliseconds for each class of operator. + +* The total time lists the total time for a stage. + +* Initialisation and preparation are two actions that prepare the graph and + the tensor-arena for the inferencing step. They are typically executed + once before many inferences are ran. For example, for a keyword spotter + one would initialise and prepare the tensor arena once, and then + inference time and time again. + +* Inferencing time is the time taken to, given some input data, infer the + output. + +Note that the times we give below may be different depending on your +target, the precise version of the AI tools, and the version of the +underlying compiler. + +The first three sections may be:: + + Profiling init()... + node 0 OP_XC_pad_3_to_4 320 + node 1 OP_XC_pad 536 + [...] + node 44 OP_XC_strided_slice 1555 + node 46 OP_SOFTMAX 21 + + Cumulative times for init()... + OP_XC_pad_3_to_4 320 0.00ms + OP_XC_pad 7503 0.08ms + OP_XC_conv2d_v2 90276 0.90ms + OP_DEPTHWISE_CONV_2D 42 0.00ms + OP_XC_strided_slice 1555 0.02ms + OP_RESHAPE 0 0.00ms + OP_SOFTMAX 21 0.00ms + + Total time for init() - 99717 1.00ms + +The first lines lists initialisation per node. 320 ticks (3.2 us) for node +0, 536 ticks (5.36 us) for node 1, etc. The second section shows that all +OP_XC_PAD operators together took 7503 ticks (75 us) to initialise. The +final section shows that initialisation all together took 1 ms. + +In a similar vein, the next three sections is the preparation of the tensor +arena, which takes a total of 1.71 ms. + +The last three sections are as follows:: + + node 0 OP_XC_pad_3_to_4 26991 + node 1 OP_XC_pad 13945 + [...] + node 40 OP_DEPTHWISE_CONV_2D 2243362 + node 41 OP_XC_conv2d_v2 34557 + node 42 OP_XC_conv2d_v2 2550 + node 43 OP_XC_conv2d_v2 591 + node 44 OP_XC_strided_slice 106 + node 45 OP_RESHAPE 131 + node 46 OP_SOFTMAX 1663 + + + Cumulative times for invoke()... + 1 OP_XC_pad_3_to_4 26991 0.27ms + 14 OP_XC_pad 53359 0.53ms + 27 OP_XC_conv2d_v2 2916236 29.16ms + 2 OP_DEPTHWISE_CONV_2D 4487819 44.88ms + 1 OP_XC_strided_slice 106 0.00ms + 1 OP_RESHAPE 131 0.00ms + 1 OP_SOFTMAX 1663 0.02ms + + Total time for invoke() - 7486305 74.86ms + +The bottom line shows the total time for the invokation of this network: +74.86ms; the lines above it shows in detail where the time went, note that +the two main parts of the inferencing are:: + + 27 OP_XC_conv2d_v2 2916236 29.16ms + 2 OP_DEPTHWISE_CONV_2D 4487819 44.88ms + +The first number of each line is the number of times that the operator was +invoked. The second column is the operator name, the third column the +number of ticks, and the final column the time in milli-seconds. + +The ``OP_XC_conv2d_v2`` operator executed 27 times, so on average took just +over one millisecond per invokation. The ``OP_DEPTHWISE_CONV_2D`` operator +took 22.44 ms per invokation. The reason this operator is so slow is +twofold. Any operator that has ``XC`` (for XCORE) in the name is an +optimised operator; this is a reference implementation. The reason that the +reference implementation was used is because of a warning emitted by the +graph transformer:: + + vww_quant.tflite:0:0: ... Quantization error of 0.325626 larger ... reverting to reference DepthwiseConv2D op + +The converter identified that the reference operator had a much higher +accuracy than the optimised operator, and it reverted to the reference +operator. As a first test we can change the threshold for this to happen:: + + xcore-opt vww_quant.tflite -o model.tflite --xcore-conv-err-threshold=0.5 + mv model.tflite.cpp model.tflite.h src + xmake + xrun --xscope bin/app_no_flash.xe + +Moving the source files, recompiling and executing it yields the following +profiling output:: + + Cumulative times for invoke()... + 1 OP_XC_pad_3_to_4 26993 0.27ms + 14 OP_XC_pad 54115 0.54ms + 29 OP_XC_conv2d_v2 2971789 29.72ms + 1 OP_XC_strided_slice 110 0.00ms + 1 OP_RESHAPE 134 0.00ms + 1 OP_SOFTMAX 1668 0.02ms + + Total time for invoke() - 3054809 30.55ms + + +This shows that the total execution time was reduced by 44 milliseconds. +The optimised convolution was executed twice more, accounting for an extra +556 micro-seconds; the optimised operator is 80 times faster than the +reference implementation. + +The final optimisation is to parallelise the execution. We do this by +telling the graph-transformer to generate code that uses five threads:: + + xcore-opt vww_quant.tflite -o model.tflite --xcore-conv-err-threshold=0.5 --xcore-thread-count=5 + mv model.tflite.cpp model.tflite.h src + xmake + xrun --xscope bin/app_no_flash.xe + +Moving the files, recompiling, and rerunning the code yields:: + + Cumulative times for invoke()... + 1 OP_XC_pad_3_to_4 26993 0.27ms + 14 OP_XC_pad 54115 0.54ms + 29 OP_XC_conv2d_v2 717748 7.18ms + 1 OP_XC_strided_slice 109 0.00ms + 1 OP_RESHAPE 134 0.00ms + 1 OP_SOFTMAX 1668 0.02ms + + Total time for invoke() - 800767 8.01ms + +Execution time has gone down from 30.55 to 8 milli-seconds. Five threads +has only yielded a 3.8x speedup on this occasion; typically on larger +graphs the speedup is closer to 5x. diff --git a/examples/app_profiling/src/config.xscope b/examples/app_profiling/src/config.xscope new file mode 100644 index 000000000..ef80fed5b --- /dev/null +++ b/examples/app_profiling/src/config.xscope @@ -0,0 +1,3 @@ + + + diff --git a/examples/app_profiling/src/image.h b/examples/app_profiling/src/image.h new file mode 100644 index 000000000..dc3c860a3 --- /dev/null +++ b/examples/app_profiling/src/image.h @@ -0,0 +1,27650 @@ +int8_t image[3*96*96] = { + 73, + 40, + 0, + 73, + 40, + -4, + 77, + 44, + 0, + 78, + 44, + -1, + 74, + 37, +-11, + 71, + 36, +-14, + 70, + 36, + -8, + 66, + 33, + -7, + 65, + 32, + -5, + 64, + 32, + -4, + 63, + 33, + -2, + 63, + 35, + 1, + 65, + 39, + 10, + 67, + 42, + 16, + 67, + 44, + 19, + 67, + 46, + 22, + 68, + 49, + 27, + 68, + 52, + 30, + 69, + 54, + 37, + 72, + 58, + 42, + 74, + 61, + 46, + 77, + 64, + 53, + 78, + 69, + 56, + 82, + 72, + 60, + 83, + 75, + 64, + 85, + 77, + 68, + 87, + 79, + 72, + 89, + 81, + 76, + 91, + 84, + 78, + 92, + 85, + 80, + 93, + 88, + 82, + 95, + 89, + 85, + 95, + 90, + 87, + 96, + 91, + 88, + 97, + 92, + 89, + 97, + 92, + 89, + 98, + 93, + 90, + 98, + 93, + 90, + 99, + 94, + 91, + 99, + 94, + 92, + 99, + 93, + 91, + 99, + 93, + 91, +100, + 94, + 92, + 99, + 94, + 91, + 99, + 93, + 91, + 99, + 93, + 91, +100, + 94, + 91, + 99, + 94, + 90, +100, + 95, + 91, +100, + 95, + 91, + 99, + 94, + 89, + 99, + 94, + 88, + 98, + 93, + 88, + 98, + 93, + 88, + 98, + 92, + 87, + 97, + 92, + 86, + 97, + 91, + 85, + 97, + 91, + 84, + 96, + 89, + 82, + 95, + 89, + 82, + 96, + 89, + 82, + 95, + 89, + 82, + 95, + 88, + 81, + 94, + 87, + 79, + 93, + 86, + 76, + 93, + 86, + 76, + 92, + 85, + 75, + 92, + 85, + 75, + 91, + 84, + 75, + 90, + 83, + 73, + 89, + 82, + 72, + 88, + 81, + 70, + 88, + 81, + 70, + 87, + 81, + 69, + 87, + 80, + 68, + 87, + 80, + 68, + 88, + 79, + 68, + 88, + 80, + 68, + 89, + 79, + 68, + 88, + 78, + 67, + 88, + 78, + 66, + 88, + 77, + 65, + 87, + 76, + 64, + 86, + 75, + 63, + 85, + 74, + 61, + 86, + 74, + 58, + 86, + 73, + 58, + 86, + 73, + 57, + 86, + 74, + 58, + 85, + 72, + 57, + 86, + 72, + 57, + 85, + 71, + 55, + 85, + 71, + 56, + 85, + 71, + 55, + 83, + 69, + 53, + 82, + 68, + 51, + 73, + 37, +-28, + 72, + 38, +-11, + 72, + 38, + -2, + 74, + 41, + -5, + 77, + 44, + -3, + 77, + 40, + -8, + 71, + 33, +-21, + 68, + 31, +-20, + 67, + 31, +-13, + 63, + 28, +-13, + 64, + 28, +-11, + 62, + 28, +-12, + 63, + 30, + -8, + 62, + 33, + -1, + 63, + 36, + 5, + 64, + 37, + 9, + 63, + 38, + 11, + 63, + 40, + 12, + 64, + 42, + 16, + 64, + 43, + 19, + 65, + 45, + 23, + 66, + 47, + 26, + 68, + 49, + 29, + 69, + 51, + 33, + 70, + 53, + 34, + 71, + 56, + 40, + 72, + 58, + 43, + 73, + 61, + 46, + 77, + 64, + 50, + 76, + 67, + 54, + 78, + 70, + 56, + 81, + 72, + 60, + 82, + 73, + 64, + 82, + 75, + 66, + 84, + 77, + 68, + 85, + 78, + 69, + 86, + 79, + 70, + 86, + 80, + 71, + 88, + 82, + 74, + 89, + 82, + 75, + 90, + 84, + 79, + 90, + 84, + 79, + 91, + 85, + 79, + 92, + 85, + 79, + 92, + 86, + 78, + 92, + 86, + 78, + 94, + 88, + 78, + 94, + 88, + 79, + 95, + 89, + 79, + 95, + 89, + 80, + 95, + 89, + 80, + 95, + 89, + 80, + 95, + 89, + 79, + 95, + 89, + 79, + 96, + 89, + 78, + 95, + 89, + 77, + 95, + 88, + 76, + 95, + 88, + 76, + 94, + 88, + 76, + 94, + 87, + 75, + 93, + 87, + 75, + 93, + 87, + 74, + 92, + 86, + 74, + 91, + 85, + 73, + 90, + 83, + 71, + 89, + 82, + 70, + 87, + 81, + 69, + 86, + 80, + 68, + 85, + 79, + 66, + 85, + 79, + 66, + 85, + 78, + 66, + 85, + 76, + 65, + 84, + 76, + 64, + 84, + 75, + 63, + 85, + 75, + 63, + 84, + 74, + 61, + 84, + 74, + 62, + 84, + 73, + 60, + 84, + 72, + 57, + 83, + 71, + 57, + 83, + 71, + 56, + 83, + 70, + 53, + 83, + 70, + 52, + 82, + 69, + 51, + 81, + 68, + 50, + 80, + 66, + 48, + 82, + 65, + 47, + 80, + 65, + 46, + 79, + 64, + 43, + 78, + 62, + 41, + 79, + 61, + 40, + 77, + 59, + 38, + 75, + 57, + 34, + 73, + 53, + 30, + 70, + 48, + 26, + 66, + 41, + 18, + 77, + 41, +-27, + 76, + 38, +-30, + 72, + 35, +-27, + 70, + 36, +-12, + 71, + 37, +-10, + 74, + 37, +-10, + 77, + 39, +-12, + 72, + 34, +-23, + 67, + 26, +-31, + 64, + 25, +-28, + 61, + 22, +-27, + 60, + 22, +-26, + 59, + 21, +-25, + 59, + 22, +-23, + 59, + 23, +-21, + 59, + 25, +-16, + 59, + 26, +-14, + 59, + 27, +-10, + 60, + 27, +-10, + 60, + 29, + -7, + 61, + 30, + -4, + 61, + 32, + -1, + 61, + 33, + 1, + 62, + 34, + 2, + 62, + 35, + 3, + 62, + 36, + 7, + 62, + 37, + 8, + 63, + 40, + 11, + 65, + 42, + 15, + 65, + 43, + 19, + 66, + 46, + 23, + 67, + 49, + 28, + 68, + 52, + 30, + 69, + 54, + 35, + 70, + 56, + 38, + 71, + 58, + 42, + 73, + 61, + 45, + 74, + 63, + 48, + 76, + 65, + 51, + 76, + 67, + 54, + 78, + 69, + 58, + 79, + 71, + 60, + 81, + 73, + 61, + 83, + 75, + 63, + 84, + 77, + 65, + 86, + 80, + 67, + 87, + 81, + 68, + 89, + 83, + 70, + 91, + 85, + 72, + 92, + 86, + 73, + 92, + 87, + 74, + 94, + 88, + 75, + 94, + 88, + 75, + 94, + 88, + 75, + 95, + 89, + 76, + 95, + 89, + 76, + 95, + 89, + 76, + 94, + 88, + 75, + 94, + 88, + 75, + 94, + 88, + 75, + 93, + 86, + 73, + 92, + 86, + 73, + 91, + 85, + 72, + 90, + 84, + 71, + 88, + 81, + 68, + 87, + 79, + 66, + 85, + 78, + 62, + 84, + 75, + 60, + 82, + 74, + 59, + 82, + 71, + 57, + 81, + 69, + 55, + 80, + 68, + 52, + 79, + 66, + 48, + 79, + 65, + 46, + 79, + 64, + 46, + 77, + 63, + 43, + 77, + 63, + 42, + 76, + 62, + 41, + 76, + 60, + 39, + 77, + 60, + 38, + 78, + 59, + 37, + 78, + 58, + 35, + 77, + 56, + 34, + 76, + 55, + 32, + 76, + 54, + 28, + 75, + 52, + 26, + 74, + 51, + 22, + 74, + 49, + 20, + 73, + 48, + 19, + 72, + 46, + 13, + 70, + 43, + 9, + 69, + 39, + 6, + 67, + 36, + 1, + 64, + 32, + -5, + 61, + 27, +-10, + 57, + 23, +-16, + 79, + 43, +-24, + 77, + 41, +-27, + 75, + 39, +-29, + 75, + 36, +-31, + 71, + 33, +-29, + 66, + 31, +-21, + 69, + 31, +-20, + 69, + 33, +-24, + 69, + 31, +-26, + 64, + 23, +-36, + 60, + 18, +-39, + 59, + 17, +-38, + 56, + 16, +-38, + 56, + 16, +-37, + 55, + 16, +-37, + 53, + 15, +-37, + 54, + 16, +-38, + 54, + 15, +-34, + 54, + 15, +-34, + 54, + 15, +-34, + 54, + 15, +-31, + 55, + 15, +-30, + 53, + 15, +-30, + 55, + 16, +-29, + 54, + 16, +-28, + 54, + 18, +-27, + 54, + 17, +-25, + 55, + 18, +-24, + 56, + 19, +-23, + 56, + 19, +-23, + 56, + 19, +-21, + 55, + 20, +-20, + 54, + 21, +-18, + 53, + 22, +-15, + 52, + 23, +-12, + 52, + 24, + -8, + 52, + 25, + -5, + 53, + 26, + -3, + 54, + 29, + -1, + 54, + 31, + 2, + 55, + 34, + 6, + 58, + 38, + 12, + 62, + 43, + 17, + 65, + 47, + 22, + 69, + 53, + 28, + 73, + 58, + 34, + 75, + 62, + 38, + 78, + 66, + 41, + 81, + 69, + 45, + 83, + 71, + 47, + 84, + 72, + 49, + 85, + 73, + 51, + 87, + 74, + 53, + 88, + 76, + 53, + 87, + 76, + 53, + 86, + 76, + 54, + 86, + 76, + 52, + 87, + 75, + 51, + 86, + 74, + 52, + 85, + 73, + 50, + 85, + 73, + 49, + 83, + 71, + 48, + 82, + 69, + 46, + 79, + 66, + 43, + 77, + 62, + 38, + 74, + 58, + 33, + 69, + 52, + 27, + 66, + 47, + 21, + 62, + 42, + 15, + 61, + 38, + 10, + 59, + 36, + 7, + 60, + 35, + 6, + 62, + 36, + 5, + 62, + 34, + 4, + 62, + 34, + 2, + 63, + 34, + 1, + 64, + 35, + -1, + 65, + 36, + -1, + 67, + 35, + -1, + 69, + 37, + 1, + 70, + 38, + 1, + 70, + 39, + -1, + 71, + 38, + -2, + 70, + 38, + -3, + 70, + 37, + -5, + 70, + 37, + -7, + 68, + 35, + -8, + 68, + 33, +-10, + 68, + 32, +-13, + 67, + 30, +-14, + 65, + 29, +-16, + 65, + 28, +-18, + 65, + 26, +-19, + 63, + 25, +-20, + 65, + 25, +-21, + 63, + 25, +-22, + 80, + 45, +-23, + 78, + 42, +-25, + 77, + 41, +-27, + 76, + 39, +-29, + 75, + 35, +-32, + 70, + 30, +-37, + 65, + 25, +-38, + 61, + 23, +-32, + 62, + 22, +-33, + 65, + 24, +-34, + 65, + 24, +-35, + 64, + 22, +-35, + 65, + 24, +-33, + 64, + 23, +-33, + 63, + 21, +-33, + 62, + 21, +-34, + 62, + 21, +-34, + 61, + 20, +-35, + 59, + 19, +-35, + 59, + 19, +-35, + 58, + 19, +-34, + 57, + 19, +-33, + 57, + 19, +-31, + 57, + 19, +-32, + 57, + 19, +-32, + 57, + 19, +-31, + 58, + 19, +-31, + 57, + 18, +-31, + 58, + 19, +-29, + 58, + 19, +-29, + 58, + 19, +-29, + 57, + 18, +-30, + 56, + 17, +-30, + 54, + 14, +-30, + 51, + 14, +-30, + 49, + 14, +-28, + 49, + 14, +-28, + 49, + 14, +-28, + 48, + 14, +-28, + 46, + 12, +-31, + 43, + 8, +-34, + 38, + 3, +-41, + 39, + 4, +-39, + 45, + 10, +-34, + 51, + 16, +-29, + 58, + 24, +-22, + 62, + 29, +-18, + 65, + 32, +-17, + 66, + 34, +-13, + 67, + 36, +-12, + 67, + 36, +-14, + 68, + 37, +-14, + 69, + 37, +-12, + 69, + 38, +-12, + 72, + 40, + -8, + 74, + 42, + -4, + 75, + 44, + 0, + 75, + 46, + 1, + 76, + 45, + 2, + 73, + 46, + 0, + 73, + 45, + 0, + 73, + 44, + -2, + 73, + 43, + -3, + 71, + 39, + -5, + 68, + 36, + -9, + 64, + 31, +-12, + 61, + 27, +-16, + 57, + 23, +-19, + 53, + 19, +-22, + 55, + 20, +-21, + 59, + 26, +-15, + 63, + 31, +-10, + 62, + 29, +-12, + 60, + 27, +-15, + 60, + 23, +-21, + 60, + 22, +-26, + 60, + 22, +-27, + 60, + 23, +-28, + 61, + 23, +-30, + 63, + 24, +-31, + 63, + 23, +-31, + 64, + 23, +-30, + 64, + 23, +-30, + 63, + 22, +-32, + 63, + 22, +-32, + 62, + 21, +-33, + 60, + 19, +-35, + 61, + 19, +-35, + 60, + 19, +-37, + 61, + 19, +-37, + 61, + 20, +-36, + 61, + 19, +-35, + 61, + 20, +-35, + 61, + 19, +-35, + 62, + 20, +-38, + 61, + 19, +-38, + 83, + 47, +-20, + 81, + 45, +-22, + 79, + 43, +-24, + 78, + 41, +-27, + 77, + 37, +-30, + 73, + 33, +-35, + 68, + 28, +-44, + 64, + 20, +-52, + 60, + 17, +-47, + 59, + 17, +-40, + 59, + 18, +-39, + 69, + 30, +-27, + 69, + 32, +-25, + 69, + 31, +-25, + 67, + 29, +-27, + 67, + 28, +-27, + 67, + 30, +-26, + 67, + 29, +-27, + 66, + 28, +-27, + 67, + 28, +-27, + 64, + 26, +-27, + 65, + 27, +-26, + 64, + 26, +-24, + 63, + 25, +-25, + 64, + 25, +-24, + 63, + 25, +-24, + 64, + 26, +-24, + 65, + 26, +-23, + 65, + 27, +-23, + 64, + 26, +-22, + 63, + 25, +-24, + 63, + 25, +-23, + 61, + 23, +-25, + 58, + 19, +-26, + 52, + 14, +-29, + 44, + 10, +-32, + 43, + 10, +-31, + 43, + 10, +-33, + 43, + 10, +-34, + 45, + 12, +-32, + 44, + 11, +-33, + 39, + 4, +-40, + 36, + 1, +-43, + 41, + 6, +-40, + 49, + 14, +-35, + 55, + 21, +-28, + 58, + 24, +-25, + 60, + 26, +-24, + 61, + 27, +-23, + 63, + 28, +-21, + 64, + 29, +-20, + 65, + 30, +-19, + 65, + 31, +-19, + 66, + 31, +-20, + 66, + 32, +-19, + 67, + 33, +-17, + 69, + 34, +-12, + 70, + 36, +-10, + 68, + 37, +-11, + 68, + 35, +-11, + 68, + 35, +-12, + 66, + 33, +-14, + 64, + 32, +-15, + 62, + 27, +-18, + 58, + 23, +-23, + 56, + 20, +-25, + 51, + 16, +-29, + 46, + 11, +-33, + 43, + 8, +-35, + 47, + 13, +-31, + 54, + 20, +-24, + 53, + 18, +-28, + 49, + 14, +-34, + 47, + 10, +-36, + 45, + 6, +-41, + 51, + 12, +-37, + 56, + 18, +-34, + 59, + 22, +-34, + 63, + 25, +-31, + 65, + 27, +-29, + 65, + 27, +-29, + 66, + 26, +-29, + 66, + 25, +-31, + 65, + 23, +-32, + 64, + 22, +-33, + 63, + 21, +-35, + 61, + 19, +-36, + 59, + 17, +-40, + 58, + 17, +-41, + 57, + 15, +-43, + 58, + 16, +-40, + 59, + 18, +-39, + 60, + 19, +-38, + 60, + 19, +-36, + 60, + 19, +-37, + 61, + 21, +-38, + 85, + 49, +-18, + 83, + 47, +-20, + 81, + 45, +-22, + 79, + 43, +-24, + 79, + 40, +-27, + 75, + 35, +-35, + 70, + 30, +-42, + 68, + 23, +-49, + 63, + 17, +-56, + 59, + 11, +-61, + 57, + 12, +-53, + 54, + 13, +-51, + 63, + 23, +-38, + 60, + 21, +-38, + 53, + 14, +-45, + 64, + 23, +-35, + 60, + 20, +-39, + 51, + 12, +-43, + 59, + 20, +-40, + 59, + 20, +-34, + 50, + 12, +-46, + 57, + 19, +-39, + 52, + 14, +-39, + 56, + 18, +-34, + 56, + 20, +-33, + 50, + 13, +-37, + 53, + 18, +-32, + 58, + 21, +-31, + 46, + 9, +-39, + 54, + 18, +-32, + 52, + 16, +-36, + 40, + 6, +-43, + 48, + 12, +-38, + 46, + 10, +-37, + 30, + -7, +-51, + 7, +-18, +-55, + 29, + -5, +-49, + 27, + -6, +-50, + 28, + -4, +-52, + 24, + -8, +-56, + 31, + -2, +-50, + 22, + -9, +-58, + 16, +-16, +-61, + 31, + -2, +-49, + 32, + -1, +-49, + 28, + -7, +-52, + 41, + 7, +-44, + 45, + 9, +-42, + 38, + 3, +-46, + 47, + 12, +-40, + 46, + 11, +-39, + 44, + 8, +-41, + 48, + 14, +-38, + 42, + 10, +-43, + 52, + 19, +-33, + 50, + 16, +-35, + 45, + 11, +-39, + 56, + 22, +-27, + 57, + 23, +-26, + 47, + 13, +-34, + 54, + 21, +-28, + 54, + 20, +-29, + 45, + 10, +-38, + 50, + 14, +-34, + 41, + 6, +-43, + 46, + 10, +-38, + 44, + 8, +-41, + 34, + -1, +-50, + 36, + 2, +-43, + 40, + 5, +-45, + 35, + 0, +-49, + 43, + 5, +-47, + 42, + 4, +-49, + 33, + -5, +-56, + 40, + -1, +-54, + 12, +-20, +-60, + 36, + 0, +-51, + 50, + 10, +-46, + 52, + 12, +-46, + 51, + 10, +-50, + 57, + 15, +-45, + 52, + 11, +-50, + 57, + 16, +-46, + 58, + 15, +-48, + 48, + 6, +-54, + 57, + 14, +-50, + 56, + 13, +-50, + 46, + 3, +-59, + 49, + 6, +-58, + 46, + 3, +-61, + 43, + -1, +-62, + 47, + 3, +-59, + 44, + 2, +-60, + 47, + 6, +-56, + 50, + 9, +-55, + 45, + 5, +-59, + 87, + 51, +-16, + 85, + 49, +-18, + 84, + 48, +-19, + 82, + 46, +-21, + 80, + 41, +-26, + 77, + 38, +-33, + 72, + 31, +-41, + 68, + 24, +-49, + 66, + 19, +-54, + 63, + 15, +-60, + 64, + 16, +-65, + 65, + 17, +-63, + 67, + 19, +-61, + 66, + 19, +-60, + 66, + 19, +-58, + 66, + 19, +-56, + 65, + 18, +-57, + 65, + 18, +-56, + 65, + 18, +-56, + 64, + 18, +-56, + 63, + 18, +-56, + 63, + 18, +-56, + 63, + 18, +-56, + 62, + 18, +-55, + 61, + 18, +-55, + 60, + 19, +-55, + 60, + 18, +-55, + 60, + 19, +-53, + 59, + 17, +-52, + 58, + 16, +-54, + 57, + 15, +-52, + 55, + 13, +-53, + 52, + 11, +-56, + 41, + 0, +-64, +-18, +-46, +-81, +-27, +-50, +-84, +-20, +-46, +-85, +-33, +-54, +-86, +-28, +-48, +-82, +-10, +-39, +-82, +-24, +-46, +-87, +-23, +-50, +-93, +-52, +-67, +-86, +-26, +-49, +-80, + -8, +-33, +-68, + -6, +-31, +-64, + 7, +-18, +-55, + 10, +-13, +-47, + 12, +-12, +-48, + 10, +-13, +-46, + 10, +-12, +-46, + 11, +-11, +-44, + 11, +-10, +-45, + 13, + -6, +-41, + 13, + -8, +-40, + 12, + -7, +-39, + 13, + -5, +-38, + 15, + -4, +-36, + 13, + -5, +-37, + 13, + -6, +-36, + 11, + -8, +-38, + 11, + -9, +-36, + 8, +-12, +-41, + 5, +-13, +-42, + 6, +-14, +-44, + -3, +-30, +-67, +-23, +-54, +-89, + 1, +-46, +-97, +-42, +-67, +-91, +-11, +-45, +-89, +-26, +-55, +-96, +-13, +-43, +-87, +-37, +-62, +-97, +-26, +-52, +-90, +-28, +-53, +-88, +-13, +-39, +-85, +-27, +-53, +-90, + 51, + 7, +-60, + 57, + 12, +-61, + 61, + 14, +-59, + 63, + 16, +-59, + 63, + 16, +-59, + 62, + 14, +-60, + 61, + 14, +-61, + 60, + 13, +-62, + 59, + 11, +-64, + 58, + 9, +-65, + 56, + 7, +-68, + 55, + 6, +-69, + 53, + 5, +-70, + 53, + 5, +-70, + 53, + 5, +-70, + 54, + 7, +-68, + 55, + 8, +-68, + 55, + 8, +-68, + 56, + 9, +-69, + 87, + 55, + 3, + 85, + 50, +-17, + 86, + 50, +-17, + 84, + 48, +-19, + 82, + 45, +-22, + 80, + 40, +-30, + 74, + 33, +-39, + 70, + 27, +-48, + 68, + 21, +-54, + 65, + 17, +-59, + 66, + 18, +-63, + 67, + 19, +-63, + 70, + 22, +-59, + 70, + 23, +-58, + 69, + 22, +-58, + 68, + 21, +-55, + 68, + 21, +-54, + 68, + 21, +-54, + 68, + 21, +-53, + 67, + 20, +-54, + 66, + 20, +-54, + 66, + 21, +-53, + 66, + 21, +-53, + 65, + 21, +-53, + 64, + 22, +-53, + 63, + 23, +-52, + 63, + 22, +-50, + 63, + 22, +-51, + 62, + 21, +-51, + 62, + 21, +-52, + 60, + 19, +-48, + 58, + 16, +-50, + 55, + 13, +-52, + 50, + 9, +-57, + 39, + -3, +-68, + -1, +-36, +-85, + 19, +-28, +-92, + 16, +-30, +-84, + 8, +-39, +-87, + 5, +-44, +-103, + 32, +-13, +-63, + 14, +-33, +-82, + 40, + -1, +-45, + 22, +-24, +-73, + 33, +-17, +-72, + 50, + 4, +-48, + 80, + 56, + 6, + 87, + 68, + 24, + 88, + 73, + 32, + 87, + 71, + 31, + 89, + 72, + 29, + 89, + 74, + 33, + 89, + 77, + 39, + 91, + 77, + 43, + 89, + 78, + 43, + 91, + 79, + 46, + 97, + 85, + 53, + 95, + 85, + 49, + 98, + 86, + 51, + 97, + 85, + 51, + 95, + 81, + 49, + 97, + 84, + 50, + 97, + 83, + 47, + 95, + 84, + 49, + 95, + 78, + 38, + 56, + 12, +-47, + 55, + 12, +-37, + 33, +-10, +-49, + 31, +-20, +-73, + 40, + -9, +-63, + 9, +-43, +-104, + 6, +-44, +-110, + 18, +-42, +-109, + 35, +-17, +-75, + 24, +-18, +-74, + 21, +-18, +-78, + 44, + 2, +-62, + 55, + 10, +-59, + 59, + 14, +-59, + 63, + 17, +-57, + 64, + 18, +-56, + 66, + 19, +-56, + 65, + 18, +-57, + 64, + 17, +-58, + 64, + 15, +-59, + 62, + 14, +-60, + 61, + 13, +-62, + 59, + 12, +-63, + 60, + 11, +-65, + 58, + 11, +-64, + 58, + 11, +-64, + 58, + 11, +-64, + 58, + 11, +-64, + 59, + 12, +-63, + 57, + 10, +-66, + 57, + 10, +-70, + 91, + 76, + 51, + 88, + 68, + 41, + 85, + 56, + 12, + 84, + 48, +-14, + 84, + 45, +-23, + 82, + 42, +-29, + 77, + 36, +-38, + 75, + 29, +-45, + 70, + 24, +-51, + 67, + 19, +-57, + 68, + 19, +-62, + 69, + 21, +-61, + 72, + 24, +-58, + 71, + 24, +-57, + 70, + 23, +-57, + 69, + 23, +-55, + 69, + 22, +-53, + 68, + 23, +-52, + 68, + 22, +-52, + 67, + 22, +-52, + 68, + 23, +-51, + 68, + 23, +-51, + 68, + 23, +-51, + 66, + 24, +-49, + 65, + 24, +-49, + 66, + 25, +-47, + 66, + 25, +-47, + 65, + 24, +-48, + 65, + 24, +-47, + 64, + 22, +-48, + 62, + 21, +-48, + 60, + 19, +-47, + 57, + 16, +-50, + 53, + 13, +-54, + 44, + 4, +-61, + 20, +-25, +-89, + 37, +-10, +-58, + 43, + -6, +-55, + 20, +-28, +-72, + 15, +-36, +-93, + 32, +-20, +-75, + 33, +-18, +-67, + 40, +-10, +-60, + 21, +-29, +-83, + 56, + 4, +-59, + 41, + -9, +-70, + 84, + 58, + 5, +100, + 87, + 42, + 98, + 91, + 48, + 99, + 91, + 50, +100, + 90, + 48, +100, + 93, + 57, +101, + 94, + 59, + 99, + 92, + 59, +101, + 92, + 59, +101, + 94, + 63, +105, + 98, + 68, +104, + 98, + 64, +105, + 99, + 67, +107, +100, + 67, +105, + 99, + 66, +106, + 99, + 66, +107, +100, + 66, +107, +100, + 67, +103, + 89, + 45, + 59, + 0, +-85, + 37, + -5, +-41, + 43, + -3, +-44, + 17, +-33, +-80, + 44, + -5, +-60, + 22, +-28, +-82, + 19, +-32, +-86, + 18, +-30, +-75, + 57, + 12, +-37, + 16, +-38, +-91, + 22, +-31, +-93, + 51, + 6, +-60, + 58, + 13, +-58, + 62, + 17, +-56, + 64, + 18, +-55, + 64, + 19, +-55, + 66, + 19, +-56, + 67, + 20, +-55, + 66, + 19, +-56, + 65, + 18, +-57, + 63, + 16, +-59, + 62, + 15, +-60, + 63, + 16, +-59, + 63, + 16, +-60, + 63, + 16, +-59, + 62, + 15, +-60, + 61, + 14, +-61, + 61, + 14, +-61, + 61, + 14, +-61, + 59, + 12, +-65, + 59, + 12, +-68, + 89, + 69, + 42, + 91, + 77, + 56, + 92, + 76, + 55, + 89, + 67, + 41, + 85, + 56, + 15, + 81, + 46, +-12, + 78, + 35, +-39, + 76, + 31, +-44, + 72, + 25, +-50, + 68, + 20, +-56, + 69, + 21, +-60, + 72, + 24, +-61, + 73, + 25, +-57, + 72, + 24, +-57, + 72, + 25, +-55, + 70, + 25, +-53, + 69, + 24, +-51, + 69, + 24, +-51, + 69, + 24, +-50, + 69, + 24, +-50, + 69, + 24, +-50, + 68, + 26, +-49, + 67, + 27, +-49, + 69, + 27, +-46, + 69, + 27, +-45, + 68, + 27, +-45, + 68, + 28, +-45, + 67, + 27, +-46, + 66, + 26, +-46, + 66, + 25, +-45, + 64, + 24, +-43, + 63, + 22, +-45, + 60, + 20, +-47, + 55, + 15, +-51, + 50, + 9, +-57, + 36, + -6, +-71, + 28, +-20, +-84, + 27, +-27, +-85, + 30, +-22, +-76, + 17, +-31, +-76, + 41, + -8, +-59, + 49, + 3, +-48, + 26, +-25, +-72, + 29, +-22, +-72, + 31, +-16, +-67, + 52, + -5, +-83, + 97, + 76, + 25, +109, +103, + 65, +108, +104, + 69, +107, +103, + 67, +106, +104, + 70, +107, +104, + 75, +107, +104, + 76, +106, +104, + 76, +107, +103, + 75, +107, +105, + 78, +110, +108, + 84, +109, +107, + 81, +111, +109, + 82, +112, +110, + 84, +112, +110, + 83, +113, +111, + 85, +114, +112, + 84, +116, +114, + 90, +116, +113, + 81, + 66, + 15, +-56, + 51, + 0, +-56, + 47, + 0, +-42, + 23, +-23, +-72, + 50, + 4, +-53, + 15, +-37, +-84, + 42, + -2, +-46, + 28, +-10, +-44, + 48, + 5, +-34, + 11, +-41, +-91, + 38, +-13, +-79, + 52, + 6, +-60, + 59, + 14, +-58, + 64, + 19, +-55, + 65, + 20, +-54, + 67, + 21, +-53, + 69, + 22, +-53, + 69, + 22, +-53, + 68, + 21, +-54, + 66, + 19, +-56, + 65, + 18, +-57, + 65, + 18, +-57, + 66, + 19, +-57, + 67, + 20, +-57, + 67, + 20, +-55, + 65, + 18, +-57, + 63, + 16, +-60, + 62, + 15, +-61, + 62, + 15, +-60, + 60, + 13, +-64, + 61, + 13, +-67, + 64, + 44, + 18, + 62, + 47, + 27, + 86, + 68, + 43, + 91, + 68, + 42, + 90, + 64, + 33, + 87, + 61, + 24, + 85, + 53, + 10, + 79, + 40, +-20, + 70, + 25, +-46, + 69, + 22, +-55, + 71, + 23, +-59, + 74, + 27, +-59, + 75, + 27, +-56, + 74, + 27, +-54, + 73, + 26, +-53, + 71, + 26, +-53, + 70, + 25, +-50, + 71, + 26, +-49, + 71, + 26, +-48, + 70, + 25, +-49, + 71, + 26, +-48, + 70, + 28, +-47, + 70, + 30, +-46, + 70, + 30, +-45, + 70, + 30, +-43, + 70, + 29, +-43, + 70, + 30, +-42, + 69, + 30, +-43, + 68, + 29, +-44, + 68, + 28, +-42, + 66, + 26, +-41, + 65, + 25, +-42, + 61, + 21, +-46, + 58, + 18, +-49, + 53, + 12, +-54, + 47, + 6, +-60, + 32, +-12, +-79, + 18, +-35, +-95, + 0, +-54, +-105, + 1, +-47, +-90, + 13, +-38, +-87, + -2, +-49, +-92, + 31, +-13, +-57, + 19, +-25, +-71, + 26, +-18, +-62, + 71, + 41, + -4, +112, +106, + 72, +112, +108, + 81, +111, +108, + 85, +108, +106, + 80, +107, +105, + 79, +108, +107, + 86, +108, +107, + 87, +106, +104, + 84, +104, +104, + 82, +108, +108, + 89, +110, +109, + 91, +109, +109, + 90, +112, +111, + 93, +112, +112, + 93, +112, +111, + 92, +113, +112, + 93, +114, +114, + 96, +117, +116, +100, +118, +117, +100, +103, + 90, + 59, + 45, + -3, +-50, + 33, +-17, +-68, + 38, + -7, +-55, + 41, + -7, +-59, + 38, + -6, +-47, + 33, +-17, +-66, + 37, +-13, +-65, + 56, + 11, +-36, + 35, +-17, +-79, + 45, + -2, +-67, + 54, + 9, +-60, + 61, + 16, +-57, + 64, + 19, +-55, + 67, + 22, +-52, + 68, + 23, +-52, + 69, + 23, +-52, + 68, + 23, +-52, + 70, + 23, +-52, + 68, + 21, +-54, + 67, + 20, +-55, + 66, + 19, +-57, + 65, + 18, +-61, + 67, + 20, +-57, + 68, + 21, +-54, + 66, + 19, +-56, + 65, + 18, +-61, + 64, + 17, +-62, + 62, + 15, +-63, + 62, + 15, +-64, + 62, + 15, +-65, + 36, + 17, + -7, +-29, +-43, +-64, +-12, +-25, +-45, + 32, + 15, + -6, + 66, + 44, + 18, + 88, + 61, + 27, + 87, + 56, + 16, + 85, + 51, + 4, + 83, + 45, + -7, + 74, + 32, +-31, + 73, + 25, +-57, + 75, + 28, +-58, + 77, + 30, +-55, + 75, + 28, +-51, + 73, + 28, +-51, + 73, + 28, +-50, + 73, + 28, +-47, + 73, + 28, +-47, + 73, + 28, +-46, + 72, + 28, +-46, + 70, + 30, +-46, + 70, + 30, +-46, + 71, + 31, +-45, + 71, + 30, +-43, + 71, + 30, +-42, + 70, + 31, +-42, + 70, + 31, +-42, + 71, + 32, +-41, + 70, + 30, +-41, + 69, + 29, +-39, + 68, + 28, +-39, + 66, + 26, +-41, + 64, + 24, +-43, + 60, + 20, +-47, + 56, + 16, +-51, + 51, + 11, +-56, + 38, + -6, +-71, + 27, +-30, +-102, + 4, +-53, +-116, + 18, +-29, +-75, + 32, +-20, +-74, + 4, +-53, +-117, + 8, +-48, +-117, + 40, +-10, +-66, + 24, +-28, +-90, + 81, + 56, + 14, +112, +109, + 87, +111, +109, + 93, +110, +110, + 97, +107, +107, + 92, +106, +105, + 93, +106, +107, + 93, +109, +108, + 97, +108, +108, + 99, +107, +107, + 98, +108, +108, + 99, +110, +110, +101, +111, +111, +101, +113, +113, +105, +113, +113, +105, +112, +113, +101, +114, +113, +103, +115, +115, +108, +118, +118, +111, +118, +118, +111, +119, +118, +107, + 74, + 36, + -5, + 46, +-10, +-76, + 32, +-22, +-75, + 12, +-43, +-99, +-18, +-66, +-108, + 12, +-45, +-99, + 50, + -1, +-61, + 27, +-25, +-77, + 27, +-25, +-85, + 48, + 3, +-64, + 57, + 12, +-59, + 63, + 18, +-55, + 66, + 21, +-53, + 68, + 23, +-51, + 69, + 24, +-51, + 69, + 24, +-51, + 70, + 24, +-51, + 70, + 23, +-52, + 69, + 22, +-53, + 66, + 19, +-56, + 65, + 18, +-60, + 65, + 18, +-62, + 67, + 19, +-60, + 67, + 19, +-58, + 67, + 20, +-57, + 66, + 19, +-59, + 64, + 17, +-60, + 63, + 16, +-64, + 63, + 16, +-64, + 62, + 15, +-65, + 30, + 13, +-12, +-94, +-94, +-111, +-81, +-83, +-100, +-59, +-67, +-90, +-45, +-56, +-80, + -4, +-22, +-48, + 48, + 20, +-14, + 69, + 38, + -5, + 83, + 45, + -6, + 81, + 41, +-17, + 75, + 27, +-56, + 78, + 31, +-55, + 78, + 31, +-53, + 76, + 30, +-51, + 76, + 30, +-50, + 74, + 29, +-47, + 73, + 28, +-47, + 74, + 29, +-45, + 72, + 29, +-45, + 71, + 31, +-45, + 70, + 30, +-46, + 68, + 28, +-46, + 68, + 28, +-47, + 67, + 26, +-44, + 66, + 26, +-44, + 67, + 27, +-44, + 69, + 29, +-43, + 70, + 31, +-40, + 71, + 31, +-39, + 71, + 31, +-37, + 69, + 29, +-37, + 67, + 27, +-40, + 65, + 25, +-42, + 63, + 23, +-44, + 59, + 19, +-48, + 54, + 14, +-53, + 40, + -4, +-69, + 36, +-27, +-102, + -5, +-63, +-121, + 26, +-27, +-78, + 29, +-25, +-87, + 19, +-42, +-123, + 5, +-53, +-128, + 48, + -4, +-67, + 12, +-44, +-123, + 83, + 59, + 18, +112, +109, + 93, +109, +109, + 97, +109, +108, +101, +106, +106, + 97, +105, +105, + 97, +106, +107, + 97, +108, +109, +102, +108, +109, +103, +107, +107, +101, +107, +108, +102, +110, +110, +105, +111, +111, +108, +112, +112, +109, +112, +113, +107, +113, +114, +108, +115, +115, +112, +114, +115, +111, +117, +118, +115, +117, +117, +113, +117, +118, +111, + 71, + 32, + -4, + 38, +-21, +-90, + 37, +-20, +-85, + 23, +-41, +-109, + 10, +-41, +-89, + 14, +-46, +-103, + 55, + 8, +-52, + 45, +-16, +-89, + 26, +-34, +-111, + 52, + 6, +-62, + 60, + 15, +-57, + 64, + 19, +-53, + 68, + 23, +-51, + 69, + 24, +-50, + 70, + 25, +-50, + 70, + 25, +-50, + 69, + 24, +-50, + 69, + 22, +-53, + 64, + 17, +-57, + 60, + 14, +-60, + 58, + 11, +-63, + 58, + 11, +-63, + 60, + 13, +-61, + 63, + 15, +-59, + 64, + 16, +-62, + 62, + 14, +-63, + 61, + 14, +-65, + 62, + 15, +-65, + 62, + 15, +-65, + 62, + 15, +-65, + 31, + 15, + -9, +-80, +-79, +-96, +-85, +-82, +-93, +-90, +-88, +-104, +-74, +-77, +-96, +-26, +-37, +-56, + 22, + 3, +-19, + 28, + 7, +-18, + 58, + 33, + 4, + 86, + 44, + -7, + 78, + 28, +-55, + 79, + 32, +-54, + 80, + 34, +-50, + 79, + 33, +-48, + 77, + 32, +-47, + 76, + 32, +-45, + 75, + 30, +-45, + 72, + 30, +-45, + 71, + 30, +-46, + 69, + 29, +-46, + 65, + 24, +-47, + 60, + 18, +-50, + 46, + 3, +-60, + 25, +-18, +-72, + 17, +-28, +-79, + 20, +-21, +-73, + 38, + -1, +-61, + 61, + 20, +-47, + 67, + 27, +-44, + 70, + 30, +-38, + 71, + 31, +-36, + 69, + 29, +-38, + 67, + 27, +-40, + 64, + 24, +-43, + 61, + 21, +-46, + 57, + 16, +-51, + 41, + -3, +-69, + 37, +-23, +-94, + 4, +-54, +-107, + 25, +-24, +-70, + 19, +-35, +-90, + 31, +-27, +-95, + 6, +-52, +-118, + 43, + -2, +-51, + 21, +-33, +-98, + 90, + 70, + 34, +111, +111, + 96, +108, +108, +100, +107, +107, +101, +107, +107, +102, +106, +107, +102, +107, +108, +102, +109, +109, +105, +108, +109, +105, +108, +108, +104, +109, +110, +106, +111, +111, +108, +111, +111, +108, +113, +114, +111, +114, +114, +111, +113, +113, +110, +114, +114, +112, +115, +116, +113, +117, +117, +114, +116, +116, +113, +117, +118, +115, + 64, + 19, +-29, + 18, +-36, +-94, + 44, + -9, +-60, + 27, +-31, +-93, + 14, +-39, +-86, + 24, +-30, +-93, + 54, + 16, +-23, + 54, + 2, +-51, + 23, +-37, +-114, + 55, + 8, +-62, + 63, + 18, +-56, + 66, + 21, +-53, + 69, + 24, +-50, + 70, + 25, +-49, + 70, + 25, +-50, + 69, + 24, +-51, + 64, + 19, +-55, + 53, + 10, +-62, + 39, + -8, +-76, + 21, +-28, +-87, + 7, +-40, +-86, + 13, +-34, +-86, + 31, +-17, +-80, + 49, + 2, +-71, + 54, + 5, +-70, + 56, + 7, +-69, + 55, + 7, +-71, + 56, + 8, +-72, + 57, + 9, +-70, + 61, + 14, +-67, + 33, + 17, + -6, +-63, +-69, +-98, +-77, +-76, +-90, +-72, +-76, +-103, +-66, +-70, +-95, +-27, +-35, +-54, + 22, + 5, +-14, + 30, + 12, +-11, + 58, + 37, + 9, + 87, + 47, + -5, + 79, + 31, +-53, + 81, + 35, +-52, + 81, + 35, +-48, + 80, + 34, +-47, + 78, + 34, +-46, + 78, + 33, +-44, + 76, + 32, +-43, + 74, + 29, +-45, + 66, + 25, +-48, + 60, + 19, +-52, + 43, + 0, +-63, + -4, +-50, +-97, +-27, +-70, +-90, + 6, +-10, +-19, + 11, + 1, +-13, + 6, + -2, +-13, + -9, +-28, +-39, +-12, +-55, +-98, + 39, + -2, +-61, + 62, + 20, +-46, + 68, + 27, +-39, + 69, + 29, +-38, + 69, + 29, +-38, + 66, + 26, +-41, + 62, + 22, +-45, + 58, + 18, +-49, + 42, + -2, +-66, + 35, +-23, +-92, + 18, +-37, +-84, + 27, +-17, +-58, + 7, +-50, +-109, + 35, +-21, +-81, + 11, +-43, +-105, + 51, + 8, +-37, + 23, +-26, +-81, + 91, + 72, + 40, +109, +109, + 98, +107, +107, +101, +107, +108, +103, +106, +107, +102, +108, +109, +106, +108, +109, +105, +108, +109, +105, +109, +109, +106, +109, +109, +107, +110, +110, +109, +112, +112, +109, +111, +111, +109, +112, +112, +110, +112, +112, +111, +112, +113, +110, +115, +115, +113, +115, +115, +113, +116, +116, +114, +116, +117, +114, +118, +118, +116, + 57, + 9, +-51, + 12, +-42, +-98, + 39, +-12, +-66, + 39, +-16, +-76, + 24, +-27, +-73, + 30, +-19, +-79, + 52, + 13, +-25, + 58, + 11, +-34, + 19, +-43, +-122, + 56, + 10, +-62, + 63, + 19, +-55, + 67, + 23, +-51, + 70, + 25, +-49, + 70, + 25, +-49, + 67, + 21, +-52, + 60, + 14, +-57, + 37, + -8, +-73, + 12, +-46, +-104, + 19, +-30, +-72, + 21, + -2, +-10, + 35, + 13, +-19, + 45, + 10, +-37, + 2, +-40, +-74, + -9, +-63, +-110, + 26, +-22, +-86, + 45, + -3, +-76, + 51, + 2, +-73, + 54, + 6, +-72, + 53, + 5, +-74, + 55, + 7, +-73, + 32, + 16, + -6, +-60, +-66, +-94, +-59, +-63, +-90, +-68, +-73, +-101, +-65, +-69, +-92, +-25, +-33, +-51, + 25, + 9, +-10, + 33, + 15, + -6, + 60, + 40, + 12, + 87, + 48, + -4, + 80, + 33, +-52, + 82, + 36, +-50, + 83, + 37, +-45, + 80, + 36, +-45, + 79, + 35, +-44, + 77, + 32, +-43, + 72, + 30, +-45, + 65, + 24, +-49, + 43, + -1, +-66, + -2, +-44, +-90, +-19, +-74, +-114, + -5, +-42, +-67, + 77, + 68, + 34, + 91, + 84, + 38, + 96, + 89, + 40, +101, + 94, + 50, + 80, + 75, + 41, + 34, + 28, + 16, +-11, +-42, +-61, + 1, +-40, +-87, + 42, + -2, +-61, + 64, + 23, +-43, + 67, + 27, +-40, + 66, + 26, +-41, + 63, + 23, +-44, + 58, + 18, +-49, + 43, + -3, +-64, + 31, +-25, +-92, + 30, +-26, +-80, + 20, +-32, +-81, + 12, +-49, +-116, + 32, +-24, +-92, + 19, +-37, +-105, + 60, + 11, +-43, + 23, +-27, +-84, + 88, + 66, + 31, +109, +109, + 99, +107, +107, +103, +106, +107, +104, +106, +106, +104, +106, +107, +104, +108, +108, +106, +109, +109, +107, +109, +109, +108, +108, +109, +107, +109, +109, +109, +112, +112, +111, +112, +112, +111, +113, +113, +112, +112, +112, +111, +111, +111, +110, +114, +114, +113, +114, +114, +113, +115, +115, +115, +116, +116, +115, +119, +118, +116, + 55, + 4, +-64, + 19, +-37, +-103, + 36, +-20, +-89, + 34, +-25, +-92, + 33, +-20, +-80, + 32, +-22, +-85, + 51, + 2, +-48, + 58, + 4, +-57, + 17, +-48, +-127, + 55, + 9, +-64, + 63, + 19, +-54, + 67, + 23, +-51, + 68, + 24, +-49, + 62, + 19, +-52, + 41, + -4, +-69, + 14, +-38, +-97, + 20, +-39, +-94, + 32, + -8, +-72, + 18, + 1, +-31, + 57, + 24, +-67, + 44, + 34, +-14, + 85, + 39, +-36, + 83, + 47, +-13, + 54, + 14, +-51, +-17, +-64, +-105, +-11, +-61, +-107, + 20, +-29, +-93, + 48, + -1, +-75, + 53, + 4, +-73, + 54, + 6, +-75, + 31, + 17, + -4, +-63, +-70, +-97, +-62, +-65, +-90, +-62, +-68, +-95, +-73, +-74, +-90, +-23, +-30, +-45, + 26, + 11, + -7, + 33, + 16, + -3, + 60, + 42, + 16, + 86, + 49, + -3, + 81, + 33, +-51, + 83, + 37, +-47, + 82, + 38, +-44, + 82, + 38, +-42, + 78, + 36, +-41, + 75, + 32, +-44, + 71, + 26, +-47, + 47, + 3, +-69, +-21, +-71, +-115, + 35, + 19, +-11, + 74, + 63, + 20, + 85, + 73, + 28, + 93, + 81, + 33, + 92, + 83, + 37, + 95, + 88, + 43, +100, + 92, + 48, +107, + 99, + 55, +108, +101, + 58, + 94, + 87, + 49, + 69, + 58, + 22, + 8, +-33, +-71, + 29, +-13, +-68, + 65, + 24, +-43, + 67, + 27, +-40, + 63, + 23, +-44, + 59, + 19, +-48, + 42, + -6, +-72, + 29, +-33, +-111, + 24, +-40, +-109, + 27, +-30, +-103, + 13, +-50, +-124, + 31, +-29, +-110, + 24, +-40, +-118, + 60, + 11, +-55, + 21, +-33, +-108, + 89, + 64, + 27, +108, +108, + 98, +106, +106, +101, +107, +107, +104, +106, +106, +104, +108, +108, +106, +109, +109, +107, +110, +111, +109, +111, +111, +110, +110, +111, +109, +112, +112, +112, +114, +114, +113, +113, +113, +112, +114, +114, +112, +113, +113, +112, +112, +112, +111, +115, +115, +114, +114, +114, +113, +117, +117, +116, +117, +117, +116, +118, +117, +116, + 59, + 9, +-74, + 34, +-23, +-99, + 37, +-20, +-95, + 29, +-36, +-115, + 36, +-21, +-94, + 28, +-31, +-108, + 53, + -1, +-63, + 55, + -5, +-84, + 19, +-50, +-128, + 57, + 7, +-65, + 64, + 19, +-54, + 68, + 24, +-51, + 65, + 22, +-50, + 35, +-10, +-73, + 17, +-43, +-109, + 28, + -9, +-52, + 38, + 17, +-33, + 28, + 6, +-45, + 28, + 17, +-19, + 68, + 34, +-61, + 53, + 36, +-14, + 81, + 46, + -8, + 87, + 41, +-51, + 76, + 57, + 16, + 94, + 90, + 78, + 67, + 61, + 54, +-21, +-73, +-107, + 25, +-23, +-92, + 50, + 2, +-75, + 53, + 5, +-76, + 31, + 16, + -2, +-61, +-73, +-104, +-57, +-64, +-91, +-63, +-69, +-93, +-66, +-70, +-91, +-20, +-28, +-43, + 28, + 14, + -4, + 36, + 19, + 0, + 62, + 44, + 19, + 86, + 48, + -2, + 81, + 34, +-48, + 84, + 39, +-45, + 83, + 39, +-42, + 82, + 39, +-41, + 78, + 37, +-40, + 76, + 32, +-43, + 69, + 25, +-48, + 45, + -6, +-82, + 15, +-16, +-43, + 88, + 74, + 26, + 90, + 78, + 30, + 92, + 80, + 32, + 74, + 58, + 8, + 47, + 27, +-18, + 70, + 59, + 17, + 93, + 86, + 43, +107, +100, + 57, +110, +102, + 58, +110, +102, + 58, +109, +101, + 57, + 74, + 56, + 14, + 9, +-38, +-84, + 62, + 21, +-46, + 67, + 27, +-40, + 64, + 24, +-43, + 59, + 19, +-48, + 40, + -7, +-73, + 34, +-28, +-108, + 19, +-45, +-118, + 33, +-22, +-90, + 12, +-49, +-120, + 38, +-20, +-98, + 26, +-36, +-112, + 64, + 19, +-34, + 23, +-32, +-105, + 91, + 66, + 31, +108, +108, + 96, +106, +106, +100, +105, +106, +102, +108, +109, +106, +108, +108, +105, +111, +111, +108, +112, +112, +109, +112, +112, +110, +112, +113, +111, +114, +115, +114, +116, +116, +116, +115, +115, +114, +115, +115, +114, +112, +112, +111, +110, +110, +109, +112, +112, +111, +113, +113, +112, +117, +117, +116, +117, +117, +115, +118, +118, +114, + 55, + 6, +-68, + 38, +-15, +-85, + 40, +-16, +-78, + 31, +-32, +-96, + 34, +-20, +-91, + 30, +-28, +-100, + 58, + 4, +-53, + 55, + -5, +-80, + 21, +-45, +-123, + 53, + 4, +-69, + 64, + 19, +-54, + 69, + 24, +-50, + 66, + 21, +-51, + 26, +-27, +-93, + 43, + 12, +-23, + 77, + 53, +-19, + 43, + 10, +-51, + 48, + 26, +-27, + 41, + 40, + 12, + 67, + 32, +-56, + 42, + 21, +-17, + 83, + 52, + 9, + 97, + 52, +-39, + 78, + 63, + 26, +108, +109, +104, + 67, + 40, + 10, + 44, + 12, +-29, + 35, +-16, +-104, + 48, + -1, +-78, + 53, + 5, +-75, + 34, + 19, + 1, +-64, +-77, +-107, +-78, +-77, +-85, +-66, +-69, +-91, +-63, +-68, +-94, +-17, +-25, +-43, + 29, + 16, + -2, + 36, + 21, + 3, + 62, + 46, + 21, + 87, + 49, + 0, + 82, + 35, +-47, + 84, + 39, +-44, + 84, + 40, +-41, + 81, + 40, +-39, + 78, + 38, +-39, + 74, + 33, +-43, + 68, + 25, +-48, + 43, + -9, +-81, + 24, +-13, +-51, + 82, + 67, + 22, + 90, + 78, + 31, + 89, + 80, + 35, + 55, + 41, + -8, + -7, +-35, +-72, + 17, +-13, +-60, + 21, + -9, +-59, + 56, + 39, + 3, +110, +102, + 59, +110, +102, + 58, +110, +101, + 56, + 56, + 22, +-26, + 15, +-32, +-85, + 64, + 22, +-44, + 67, + 27, +-40, + 64, + 24, +-43, + 59, + 19, +-48, + 41, + -2, +-59, + 33, +-22, +-83, + 19, +-38, +-101, + 37, +-15, +-67, + 14, +-43, +-107, + 47, + -6, +-76, + 29, +-27, +-91, + 75, + 35, + -8, + 30, +-20, +-84, + 92, + 73, + 45, +109, +109, + 99, +107, +107, +102, +109, +109, +106, +110, +110, +108, +109, +109, +107, +112, +112, +109, +113, +113, +111, +114, +115, +113, +114, +115, +113, +116, +116, +115, +118, +118, +117, +116, +116, +115, +115, +115, +114, +114, +114, +113, +112, +112, +110, +112, +113, +112, +114, +114, +112, +116, +116, +116, +117, +117, +115, +118, +118, +118, + 47, + 6, +-48, + 38, +-11, +-74, + 39, + -8, +-58, + 33, +-21, +-74, + 29, +-23, +-78, + 38, +-16, +-80, + 61, + 14, +-34, + 53, + -2, +-64, + 27, +-34, +-101, + 50, + 1, +-69, + 64, + 19, +-54, + 69, + 24, +-50, + 66, + 21, +-49, + 24, +-28, +-93, + 33, + 10, +-14, + 90, + 61, +-12, + 35, + 5, +-53, + 40, + 15, +-43, + 17, + 20, + -2, + 54, + 24, +-60, + 53, + 28, +-23, + 84, + 42, +-28, + 91, + 44, +-82, + 81, + 65, + 26, +108, +109, +105, + 58, + 25, +-16, + 56, + 22, +-15, + 40, +-17, +-102, + 47, + -2, +-76, + 53, + 5, +-74, + 35, + 19, + 0, +-69, +-80, +-106, +-77, +-75, +-84, +-75, +-74, +-90, +-61, +-66, +-91, +-15, +-23, +-40, + 31, + 18, + 0, + 36, + 23, + 5, + 64, + 47, + 22, + 87, + 51, + 2, + 83, + 36, +-46, + 84, + 39, +-44, + 84, + 40, +-40, + 80, + 40, +-38, + 79, + 39, +-38, + 74, + 34, +-42, + 69, + 26, +-47, + 49, + 2, +-76, + 23, +-12, +-54, + 79, + 68, + 27, + 90, + 81, + 37, + 90, + 82, + 38, + 53, + 39, + -6, + 0, +-22, +-64, + 55, + 55, + 45, + 51, + 52, + 38, + 57, + 51, + 27, +110, +102, + 59, +109, +101, + 57, +109, +101, + 56, + 59, + 37, + 5, + 23, +-25, +-82, + 64, + 22, +-44, + 66, + 27, +-41, + 64, + 24, +-43, + 58, + 18, +-49, + 41, + -3, +-58, + 33, +-22, +-83, + 14, +-45, +-108, + 39, +-13, +-66, + 14, +-42, +-107, + 44, + -9, +-78, + 32, +-25, +-90, + 80, + 38, + -9, + 33, +-20, +-89, + 93, + 72, + 43, +110, +110, +102, +108, +108, +103, +110, +110, +107, +109, +109, +107, +109, +110, +107, +111, +112, +108, +113, +113, +110, +115, +115, +114, +115, +115, +113, +116, +116, +115, +118, +118, +117, +116, +116, +116, +115, +115, +114, +113, +113, +112, +111, +111, +110, +112, +112, +111, +112, +113, +111, +115, +115, +114, +118, +118, +117, +119, +119, +119, + 50, + 7, +-47, + 33, +-19, +-83, + 42, + -6, +-58, + 35, +-20, +-73, + 22, +-33, +-84, + 38, +-15, +-84, + 62, + 16, +-27, + 52, + -2, +-70, + 32, +-30, +-97, + 47, + -3, +-71, + 63, + 18, +-54, + 69, + 24, +-50, + 66, + 21, +-51, + 30, +-22, +-90, + 43, + 19, +-11, + 90, + 65, + -8, + 60, + 32, +-30, + 52, + 34, +-22, + 16, + 20, + -9, + 53, + 23, +-50, + 45, + 15, +-50, + 95, + 60, + -5, + 92, + 47, +-56, + 82, + 67, + 30, +109, +110, +105, + 60, + 30, +-11, + 50, + 20, +-15, + 39, +-17, +-103, + 48, + -1, +-76, + 53, + 5, +-74, + 36, + 22, + 4, +-68, +-77, +-105, +-76, +-74, +-80, +-78, +-76, +-84, +-70, +-71, +-87, +-14, +-22, +-38, + 32, + 19, + 2, + 37, + 24, + 7, + 66, + 48, + 24, + 86, + 52, + 3, + 83, + 37, +-44, + 85, + 41, +-42, + 84, + 42, +-38, + 81, + 41, +-36, + 78, + 38, +-37, + 74, + 34, +-41, + 68, + 27, +-45, + 50, + 2, +-76, + 32, + -7, +-53, + 80, + 69, + 26, + 90, + 82, + 38, + 91, + 83, + 39, + 52, + 40, + -5, + 22, + 6, +-21, + 44, + 46, + 46, + 33, + 39, + 21, + 55, + 55, + 40, +109, +101, + 58, +108, +100, + 56, +108, +100, + 54, + 44, + 25, +-20, + 27, +-20, +-80, + 64, + 22, +-44, + 66, + 26, +-41, + 64, + 24, +-43, + 58, + 17, +-49, + 41, + -7, +-69, + 32, +-28, +-106, + 12, +-50, +-125, + 44, +-15, +-86, + 23, +-37, +-111, + 39, +-20, +-97, + 31, +-29, +-105, + 81, + 34, +-33, + 34, +-25, +-106, + 94, + 69, + 30, +109, +109, +101, +109, +109, +104, +110, +110, +107, +111, +111, +109, +110, +111, +109, +112, +113, +110, +114, +115, +113, +116, +116, +115, +115, +115, +114, +117, +117, +116, +118, +118, +116, +117, +117, +116, +117, +117, +116, +115, +115, +114, +113, +113, +112, +113, +113, +112, +114, +114, +113, +116, +116, +115, +118, +118, +117, +119, +119, +119, + 58, + 11, +-59, + 27, +-30, +-109, + 46, + -5, +-72, + 37, +-29, +-104, + 21, +-40, +-112, + 37, +-21, +-103, + 64, + 7, +-61, + 50, +-11, +-97, + 33, +-36, +-121, + 43, + -8, +-75, + 62, + 17, +-55, + 67, + 24, +-50, + 67, + 21, +-50, + 32, +-21, +-89, + 58, + 22, +-20, + 88, + 69, + 10, + 63, + 34, +-33, + 71, + 47, +-17, + 44, + 39, + 3, + 47, + 13, +-59, + 53, + 31, +-16, + 93, + 72, + 32, + 94, + 50, +-33, + 82, + 69, + 36, +110, +110, +104, + 59, + 23, +-23, + 44, + 8, +-40, + 44, +-12, +-93, + 48, + -1, +-76, + 53, + 5, +-74, + 34, + 22, + 5, +-58, +-70, +-102, +-73, +-72, +-78, +-64, +-65, +-82, +-61, +-65, +-88, +-11, +-19, +-35, + 34, + 21, + 4, + 39, + 26, + 9, + 66, + 47, + 26, + 90, + 53, + 5, + 83, + 37, +-44, + 86, + 42, +-40, + 83, + 44, +-36, + 81, + 41, +-35, + 80, + 40, +-35, + 75, + 35, +-40, + 69, + 28, +-44, + 48, + 5, +-73, + 45, + 0, +-54, + 81, + 69, + 28, + 92, + 84, + 40, + 93, + 85, + 41, + 54, + 42, + -3, + 17, + 1, +-20, + 48, + 52, + 30, + 26, + 26, +-25, + 55, + 52, + 35, +108, +100, + 57, +108, +100, + 56, +108, + 99, + 54, + 49, + 29, +-18, + 28, +-20, +-82, + 64, + 22, +-44, + 67, + 27, +-40, + 64, + 24, +-43, + 57, + 16, +-49, + 38, +-10, +-77, + 33, +-29, +-113, + 7, +-56, +-128, + 42, +-17, +-96, + 28, +-32, +-107, + 42, +-17, +-95, + 30, +-29, +-106, + 81, + 35, +-28, + 32, +-30, +-108, + 95, + 69, + 31, +108, +108, +100, +108, +108, +104, +110, +110, +108, +109, +109, +108, +110, +110, +109, +112, +113, +110, +114, +114, +114, +115, +115, +115, +116, +116, +115, +116, +116, +116, +118, +118, +117, +117, +117, +116, +117, +117, +117, +115, +115, +115, +113, +113, +113, +113, +113, +112, +113, +113, +113, +117, +117, +116, +118, +118, +118, +119, +120, +120, + 56, + 12, +-55, + 23, +-34, +-110, + 53, + 5, +-56, + 40, +-24, +-95, + 22, +-41, +-117, + 36, +-24, +-103, + 63, + 8, +-59, + 51, +-12, +-96, + 38, +-30, +-119, + 41, +-10, +-78, + 61, + 16, +-56, + 67, + 24, +-49, + 65, + 22, +-51, + 38, +-16, +-86, + 52, + 6, +-51, + 68, + 46, + -6, + 57, + 27, +-40, + 60, + 38, +-20, + 34, + 19, +-20, + 10, +-26, +-76, + 63, + 32, +-27, +102, + 71, + 18, + 88, + 41, +-66, + 86, + 69, + 38, +106, +103, + 96, + 57, + 13, +-49, + 49, + 9, +-44, + 43, +-13, +-94, + 48, + -1, +-75, + 54, + 6, +-72, + 36, + 23, + 8, +-55, +-70, +-104, +-55, +-60, +-80, +-51, +-58, +-81, +-60, +-64, +-87, +-11, +-19, +-34, + 35, + 21, + 11, + 40, + 26, + 12, + 65, + 49, + 28, + 89, + 54, + 7, + 83, + 37, +-44, + 86, + 42, +-39, + 83, + 44, +-36, + 81, + 41, +-35, + 80, + 40, +-35, + 76, + 36, +-37, + 68, + 27, +-45, + 43, + 4, +-67, + 50, + 5, +-51, + 73, + 64, + 26, + 95, + 87, + 43, + 95, + 87, + 42, + 55, + 44, + 1, + 4, +-17, +-42, + 44, + 48, + 9, + 23, + 23, +-29, + 71, + 70, + 50, +109, +101, + 59, +108, +100, + 56, +107, + 98, + 54, + 53, + 34, + -8, + 27, +-21, +-81, + 65, + 23, +-43, + 67, + 27, +-40, + 63, + 23, +-44, + 55, + 15, +-50, + 39, + -7, +-65, + 35, +-21, +-96, + 8, +-50, +-111, + 44, +-12, +-77, + 30, +-26, +-92, + 46, + -9, +-78, + 29, +-27, +-94, + 82, + 45, + 5, + 32, +-23, +-87, + 92, + 72, + 45, +108, +108, + 98, +107, +107, +103, +110, +110, +109, +111, +111, +111, +111, +111, +110, +111, +111, +110, +114, +114, +114, +115, +115, +115, +115, +115, +115, +116, +116, +116, +117, +117, +116, +116, +116, +116, +116, +116, +116, +115, +115, +115, +113, +113, +113, +112, +112, +112, +114, +114, +114, +117, +117, +117, +118, +118, +118, +120, +119, +120, + 51, + 8, +-41, + 27, +-26, +-93, + 57, + 17, +-28, + 44, +-11, +-65, + 23, +-34, +-102, + 35, +-20, +-90, + 62, + 20, +-19, + 54, + 0, +-71, + 42, +-16, +-74, + 40, +-10, +-79, + 61, + 17, +-56, + 65, + 24, +-48, + 66, + 24, +-50, + 41, +-14, +-86, + 30, +-22, +-76, + 18, + 4, +-26, + 53, + 24, +-45, + 31, + 14, +-33, + 12, + 0, +-29, + -9, +-36, +-66, + 66, + 31, +-45, + 99, + 65, + -8, + 82, + 31, +-95, + 80, + 65, + 30, +102, + 98, + 90, + 58, + 15, +-41, + 45, + -4, +-66, + 52, + 3, +-79, + 49, + 0, +-75, + 54, + 6, +-73, + 37, + 24, + 8, +-49, +-64, +-102, +-51, +-56, +-78, +-47, +-55, +-77, +-65, +-67, +-84, +-11, +-19, +-33, + 36, + 22, + 7, + 39, + 26, + 9, + 67, + 49, + 26, + 88, + 55, + 8, + 85, + 39, +-43, + 86, + 44, +-38, + 84, + 44, +-34, + 82, + 42, +-33, + 79, + 40, +-35, + 75, + 36, +-38, + 69, + 29, +-43, + 49, + 8, +-64, + 50, + 7, +-47, + 65, + 58, + 22, + 95, + 87, + 43, + 95, + 87, + 44, + 57, + 46, + 6, + 5, +-18, +-50, + 44, + 45, + 2, + 26, + 27, +-12, + 85, + 81, + 60, +109, +100, + 60, +108, +100, + 56, +106, + 98, + 53, + 55, + 41, + 15, + 23, +-28, +-81, + 64, + 23, +-44, + 67, + 27, +-40, + 62, + 23, +-44, + 54, + 13, +-51, + 39, + -8, +-64, + 37, +-16, +-85, + 14, +-43, +-100, + 47, + -9, +-76, + 31, +-24, +-87, + 46, + -8, +-72, + 26, +-27, +-88, + 82, + 48, + 12, + 34, +-21, +-90, + 91, + 71, + 44, +101, +100, + 90, +100, +101, + 98, +103, +103, +104, +105, +105, +105, +104, +104, +105, +104, +103, +103, +105, +105, +104, +107, +108, +107, +108, +108, +108, +109, +109, +108, +111, +112, +112, +109, +109, +110, +110, +110, +111, +110, +109, +110, +110, +110, +110, +110, +110, +111, +110, +110, +109, +111, +112, +111, +115, +114, +114, +117, +116, +118, + 47, + 6, +-40, + 27, +-29, +-96, + 61, + 19, +-23, + 47, + -7, +-61, + 23, +-36, +-102, + 33, +-23, +-88, + 58, + 16, +-21, + 57, + 3, +-63, + 42, +-16, +-75, + 40, +-11, +-80, + 60, + 16, +-56, + 65, + 24, +-48, + 66, + 25, +-47, + 40, +-13, +-83, + 77, + 50, + 36, + 50, + 37, + -4, + 56, + 30, +-29, + 38, + 19, +-30, + -2, +-20, +-59, + 54, + 34, +-21, + 72, + 47, + -1, + 95, + 68, + 15, + 79, + 32, +-62, + 84, + 72, + 46, +103, + 96, + 85, + 61, + 30, +-10, + 43, + -5, +-63, + 50, + 8, +-67, + 49, + 0, +-75, + 55, + 6, +-72, + 40, + 25, + 8, + -2, +-48, +-110, +-33, +-47, +-75, +-51, +-57, +-77, +-63, +-66, +-78, +-11, +-19, +-30, + 35, + 21, + 9, + 40, + 27, + 10, + 68, + 50, + 26, + 89, + 56, + 7, + 85, + 40, +-42, + 88, + 44, +-37, + 85, + 45, +-32, + 82, + 42, +-33, + 80, + 41, +-34, + 75, + 36, +-37, + 69, + 29, +-41, + 47, + 8, +-64, + 56, + 11, +-44, + 62, + 56, + 21, + 95, + 87, + 44, + 95, + 87, + 45, + 57, + 48, + 9, + 11, +-12, +-44, + 46, + 47, + 7, + 36, + 39, + 5, + 77, + 76, + 52, +108, +100, + 59, +107, + 99, + 57, +105, + 97, + 52, + 60, + 40, + 17, + 20, +-30, +-81, + 64, + 23, +-43, + 65, + 26, +-41, + 60, + 22, +-44, + 53, + 12, +-53, + 37, +-13, +-76, + 37, +-19, +-91, + 10, +-50, +-113, + 42, +-16, +-91, + 32, +-23, +-91, + 38, +-19, +-86, + 25, +-32, +-100, + 86, + 44, +-16, + 35, +-22, +-98, + 90, + 57, + 8, + 71, + 48, + 12, + 66, + 48, + 22, + 63, + 49, + 24, + 62, + 48, + 24, + 62, + 48, + 25, + 63, + 51, + 30, + 66, + 57, + 39, + 66, + 59, + 44, + 66, + 58, + 40, + 67, + 61, + 47, + 69, + 63, + 49, + 66, + 60, + 43, + 67, + 60, + 41, + 68, + 61, + 44, + 73, + 68, + 55, + 70, + 63, + 47, + 70, + 59, + 41, + 74, + 64, + 45, + 79, + 68, + 44, + 91, + 73, + 41, + 50, + 2, +-64, + 23, +-34, +-114, + 64, + 12, +-52, + 49, +-14, +-83, + 20, +-45, +-121, + 30, +-30, +-106, + 55, + 0, +-58, + 52, + -4, +-82, + 39, +-26, +-108, + 39, +-16, +-83, + 60, + 15, +-55, + 66, + 25, +-47, + 67, + 25, +-47, + 37, +-16, +-83, + 75, + 52, + 35, + 83, + 68, + 16, + 78, + 56, + -8, + 54, + 30, +-29, + 11, + -9, +-39, + 71, + 50, +-15, + 79, + 56, + 9, + 92, + 62, + 6, + 78, + 30, +-54, + 84, + 78, + 65, + 88, + 77, + 61, + 65, + 32, +-16, + 37, +-11, +-68, + 51, + 12, +-50, + 51, + 0, +-74, + 55, + 7, +-72, + 41, + 14, +-13, + 17, +-25, +-75, + 17, +-19, +-75, + 4, +-28, +-73, + -4, +-38, +-83, + 13, +-16, +-46, + 40, + 18, + -5, + 41, + 28, + 11, + 68, + 50, + 28, + 89, + 56, + 7, + 84, + 40, +-42, + 87, + 46, +-36, + 85, + 45, +-32, + 82, + 42, +-33, + 80, + 41, +-33, + 76, + 37, +-36, + 70, + 29, +-39, + 45, + 5, +-65, + 53, + 12, +-38, + 61, + 54, + 17, + 95, + 87, + 44, + 95, + 87, + 44, + 59, + 49, + 11, + 15, + -8, +-36, + 46, + 48, + 5, + 30, + 33, + 3, + 72, + 70, + 42, +108, +100, + 58, +106, + 98, + 55, +104, + 96, + 51, + 62, + 43, + 15, + 25, +-26, +-82, + 65, + 23, +-43, + 65, + 26, +-41, + 61, + 21, +-45, + 52, + 10, +-54, + 36, +-17, +-89, + 36, +-27, +-111, + 6, +-56, +-124, + 41, +-19, +-100, + 29, +-26, +-101, + 36, +-27, +-97, + 24, +-37, +-105, + 85, + 42, +-22, + 40, +-19, +-100, + 94, + 60, + 10, + 72, + 48, + 11, + 68, + 50, + 21, + 68, + 53, + 26, + 69, + 56, + 29, + 72, + 61, + 39, + 75, + 69, + 49, + 76, + 70, + 54, + 79, + 73, + 57, + 78, + 71, + 55, + 76, + 70, + 53, + 74, + 70, + 53, + 73, + 67, + 49, + 71, + 64, + 45, + 71, + 63, + 43, + 70, + 63, + 43, + 70, + 61, + 40, + 72, + 59, + 38, + 74, + 63, + 40, + 79, + 65, + 36, + 93, + 69, + 30, + 47, + -4, +-75, + 29, +-29, +-108, + 63, + 14, +-55, + 51, +-13, +-86, + 19, +-47, +-128, + 30, +-30, +-110, + 56, + -4, +-72, + 56, + -1, +-81, + 39, +-28, +-126, + 35, +-19, +-85, + 60, + 15, +-56, + 66, + 24, +-47, + 69, + 26, +-46, + 45, + -6, +-80, + 75, + 51, + 35, + 90, + 77, + 26, + 88, + 70, + 15, + 44, + 6, +-42, + 36, + 7, +-21, + 90, + 62, +-24, + 82, + 55, + -4, + 93, + 52, +-32, + 82, + 35, +-55, + 90, + 90, + 81, + 85, + 69, + 47, + 72, + 29, +-40, + 38, +-15, +-79, + 50, + 17, +-45, + 52, + 0, +-76, + 55, + 7, +-73, + 70, + 31, +-31, + 77, + 37, +-20, + 81, + 44, +-10, + 88, + 50, + -2, + 92, + 54, + 4, + 93, + 57, + 10, + 86, + 56, + 12, + 40, + 27, + 11, + 67, + 49, + 29, + 90, + 55, + 6, + 85, + 39, +-42, + 86, + 45, +-37, + 85, + 45, +-31, + 81, + 42, +-33, + 80, + 41, +-33, + 75, + 36, +-36, + 69, + 29, +-38, + 43, + 4, +-65, + 50, + 9, +-32, + 72, + 56, + 8, + 91, + 82, + 33, + 93, + 85, + 42, + 64, + 54, + 13, + 19, + -5, +-32, + 43, + 45, + 5, + 17, + 20, + -7, + 51, + 44, + 15, + 99, + 89, + 46, +106, + 98, + 55, +102, + 95, + 51, + 54, + 40, + 5, + 20, +-29, +-81, + 64, + 23, +-43, + 64, + 25, +-42, + 61, + 21, +-45, + 49, + 8, +-56, + 39, +-14, +-80, + 45, +-13, +-86, + 6, +-52, +-103, + 41, +-16, +-88, + 26, +-29, +-98, + 38, +-20, +-81, + 33, +-24, +-71, + 84, + 51, + 12, + 42, +-14, +-80, + 95, + 80, + 49, + 85, + 77, + 56, + 78, + 71, + 57, + 81, + 76, + 65, + 81, + 77, + 67, + 86, + 84, + 74, + 95, + 93, + 84, + 96, + 95, + 88, + 96, + 95, + 88, + 97, + 97, + 90, + 97, + 96, + 90, + 94, + 93, + 87, + 89, + 88, + 82, + 86, + 86, + 79, + 84, + 82, + 76, + 85, + 83, + 78, + 83, + 81, + 76, + 85, + 82, + 75, + 86, + 83, + 75, + 92, + 89, + 78, +105, +100, + 83, + 45, + -5, +-69, + 30, +-22, +-86, + 60, + 18, +-30, + 52, + -3, +-62, + 21, +-42, +-120, + 29, +-27, +-96, + 55, + 1, +-57, + 52, + 3, +-60, + 42, +-21, +-94, + 35, +-20, +-84, + 58, + 14, +-57, + 65, + 25, +-49, + 67, + 27, +-48, + 49, + 4, +-79, + 76, + 51, + 37, + 85, + 73, + 22, + 77, + 66, + 14, + 67, + 53, + 0, + 64, + 53, + 0, + 72, + 63, + 17, + 98, + 76, + 28, + 98, + 60, +-18, + 91, + 51, +-27, + 67, + 57, + 42, + 82, + 63, + 35, + 70, + 31, +-34, + 41, + -5, +-52, + 53, + 19, +-35, + 53, + 1, +-78, + 55, + 7, +-73, + 78, + 41, +-20, + 83, + 46, +-11, + 87, + 51, + -2, + 91, + 57, + 7, + 95, + 62, + 15, + 95, + 65, + 19, + 99, + 68, + 22, + 61, + 41, + 12, + 68, + 49, + 26, + 90, + 55, + 7, + 83, + 38, +-43, + 86, + 45, +-36, + 84, + 45, +-31, + 81, + 42, +-33, + 79, + 40, +-33, + 76, + 36, +-36, + 69, + 29, +-38, + 42, + 0, +-70, + 55, + 19, +-31, + 67, + 45, +-21, + 79, + 62, + -4, + 89, + 81, + 38, + 68, + 57, + 19, + 20, + -3, +-28, + 40, + 14, +-41, + 37, + -4, +-77, + 41, + 2, +-67, + 62, + 30, +-41, + 71, + 48, +-15, + 71, + 43, +-22, + 46, + 8, +-48, + 17, +-30, +-81, + 64, + 23, +-44, + 63, + 24, +-43, + 59, + 20, +-46, + 48, + 7, +-58, + 42, + -9, +-64, + 50, + -6, +-71, + 8, +-48, +-97, + 43, +-13, +-84, + 20, +-36, +-96, + 37, +-17, +-76, + 35, +-16, +-56, + 90, + 61, + 25, + 42, +-11, +-69, +100, + 91, + 75, +114, +113, +110, +112, +111, +109, +112, +112, +109, +113, +113, +111, +115, +115, +114, +120, +120, +120, +120, +120, +120, +118, +118, +117, +120, +120, +119, +120, +120, +120, +110, +111, +111, +107, +107, +108, +111, +112, +110, +114, +114, +114, +114, +114, +113, +114, +114, +113, +111, +111, +109, +105, +105, +103, +111, +110, +108, +117, +117, +113, + 40, + -6, +-66, + 25, +-27, +-88, + 56, + 15, +-28, + 55, + 5, +-48, + 21, +-38, +-106, + 27, +-26, +-89, + 49, + -3, +-56, + 46, + 2, +-53, + 43, +-15, +-80, + 33, +-21, +-85, + 58, + 13, +-57, + 65, + 25, +-50, + 67, + 27, +-47, + 50, + 5, +-80, + 73, + 50, + 36, + 76, + 67, + 23, + 75, + 63, + 17, + 74, + 63, + 14, + 74, + 63, + 14, + 80, + 67, + 19, + 99, + 81, + 38, +110, + 81, + 17, +103, + 67, + -9, + 21, + -5, +-56, + 73, + 48, + -1, + 74, + 40, + -9, + 36, + -5, +-44, + 48, + 12, +-46, + 53, + 1, +-78, + 55, + 7, +-74, + 76, + 39, +-21, + 83, + 46, +-11, + 86, + 50, + -5, + 91, + 57, + 6, + 94, + 60, + 13, + 96, + 65, + 18, + 99, + 67, + 22, + 88, + 60, + 21, + 68, + 49, + 27, + 89, + 54, + 6, + 83, + 38, +-43, + 85, + 44, +-36, + 84, + 45, +-31, + 81, + 41, +-33, + 79, + 40, +-33, + 75, + 36, +-36, + 69, + 29, +-39, + 43, + 2, +-69, + 63, + 24, +-28, + 66, + 41, +-27, + 74, + 52, +-26, + 85, + 77, + 33, + 69, + 58, + 21, + 29, + 4, +-26, + 36, + -4, +-81, + 36, + -1, +-76, + 45, + 10, +-65, + 67, + 40, +-34, + 74, + 51, +-21, + 74, + 53, +-11, + 49, + 12, +-50, + 26, +-24, +-78, + 64, + 23, +-43, + 63, + 23, +-43, + 58, + 18, +-47, + 47, + 6, +-58, + 40, +-12, +-74, + 47, + -8, +-74, + 12, +-46, +-104, + 42, +-19, +-92, + 23, +-33, +-96, + 38, +-17, +-75, + 41, + -9, +-51, + 93, + 54, + 2, + 36, +-17, +-78, +105, + 92, + 74, +121, +121, +121, +119, +120, +120, +120, +120, +120, +121, +121, +121, +121, +121, +121, +121, +121, +121, +115, +114, +111, +102, + 96, + 88, +109, +105, + 98, +120, +120, +118, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +117, +117, +117, +111, +111, +109, +112, +112, +109, +117, +117, +115, + 37, +-15, +-76, + 26, +-29, +-102, + 50, + 3, +-50, + 55, + 3, +-58, + 21, +-41, +-116, + 25, +-32, +-99, + 48, + -9, +-73, + 40, +-10, +-66, + 42, +-20, +-96, + 30, +-27, +-92, + 56, + 12, +-59, + 65, + 23, +-50, + 67, + 26, +-48, + 51, + 4, +-79, + 64, + 40, + 25, + 60, + 59, + 37, + 66, + 68, + 55, + 75, + 78, + 67, + 88, + 88, + 76, + 91, + 91, + 75, +104, + 76, + 18, +119, + 87, + 10, +109, + 73, +-27, + 37, + 14, +-39, + 79, + 50, + 4, + 78, + 39, +-22, + 37, +-10, +-58, + 47, + 7, +-57, + 54, + 1, +-78, + 55, + 6, +-74, + 78, + 41, +-20, + 82, + 45, +-12, + 87, + 51, + -4, + 91, + 57, + 6, + 94, + 60, + 11, + 96, + 64, + 17, + 98, + 66, + 21, +101, + 70, + 25, + 77, + 55, + 27, + 89, + 54, + 6, + 83, + 38, +-43, + 85, + 44, +-37, + 85, + 45, +-31, + 81, + 41, +-33, + 79, + 40, +-33, + 75, + 36, +-36, + 69, + 29, +-38, + 42, + -2, +-68, + 63, + 18, +-33, + 62, + 35, +-34, + 69, + 42, +-36, + 77, + 67, + 21, + 68, + 57, + 19, + 26, + -9, +-80, + 34, + -6, +-83, + 38, + 1, +-75, + 51, + 16, +-59, + 74, + 49, +-23, + 81, + 59, + -9, + 72, + 47, +-23, + 60, + 27, +-31, + 26, +-23, +-84, + 62, + 21, +-46, + 62, + 22, +-44, + 58, + 18, +-47, + 45, + 4, +-60, + 38, +-19, +-94, + 44, +-17, +-94, + 19, +-45, +-122, + 43, +-17, +-94, + 25, +-33, +-102, + 41, +-20, +-93, + 53, + 5, +-42, + 89, + 48, +-15, + 33, +-21, +-84, +106, + 90, + 63, +121, +121, +122, + 99, + 99, +100, +108, +108, +109, +121, +121, +120, +121, +121, +121, +112, +111, +109, + 78, + 69, + 50, + 74, + 60, + 36, + 71, + 51, + 18, +107, +103, + 95, +103, +103, +101, +112, +112, +110, +114, +114, +113, +121, +121, +120, +120, +120, +120, +121, +121, +121, +119, +119, +118, +106, +108, +101, + 98, +104, + 92, +115, +114, +109, + 32, +-23, +-97, + 27, +-27, +-100, + 47, + -4, +-73, + 56, + -1, +-72, + 21, +-44, +-128, + 21, +-40, +-117, + 48, +-17, +-97, + 41, +-18, +-91, + 41, +-23, +-122, + 29, +-32, +-99, + 56, + 11, +-60, + 64, + 22, +-51, + 66, + 26, +-50, + 48, + 1, +-79, + 61, + 37, + 18, + 55, + 40, +-12, + 62, + 62, + 42, + 71, + 73, + 61, + 84, + 86, + 77, + 90, + 91, + 83, +108, + 76, + 9, +121, + 91, + 15, +113, + 78, +-19, + 41, + 19, +-33, + 79, + 42, +-27, + 84, + 39, +-40, + 51, + 4, +-49, + 47, + -5, +-93, + 54, + 1, +-79, + 56, + 6, +-74, + 81, + 44, +-16, + 86, + 49, + -8, + 89, + 53, + -2, + 92, + 58, + 7, + 95, + 60, + 11, + 98, + 64, + 18, + 99, + 66, + 20, +102, + 70, + 26, + 97, + 69, + 28, + 89, + 54, + 5, + 83, + 38, +-42, + 85, + 44, +-34, + 84, + 44, +-31, + 80, + 41, +-34, + 79, + 40, +-34, + 75, + 35, +-35, + 68, + 28, +-39, + 40, + 1, +-64, + 65, + 16, +-31, + 64, + 34, +-36, + 60, + 31, +-44, + 70, + 59, + 14, + 68, + 55, + 16, + 16, +-26, +-87, + 23, +-22, +-96, + 28, +-15, +-91, + 36, + -2, +-74, + 73, + 39, +-32, + 84, + 49, +-15, + 68, + 35, +-35, + 61, + 23, +-42, + 21, +-28, +-81, + 61, + 20, +-46, + 61, + 21, +-44, + 57, + 17, +-48, + 43, + 2, +-62, + 35, +-22, +-97, + 45, +-15, +-86, + 22, +-41, +-114, + 41, +-19, +-93, + 31, +-25, +-95, + 43, +-17, +-83, + 51, + 9, +-33, + 84, + 43, +-12, + 43, + 5, +-39, +104, + 92, + 68, +104, +103, + 92, + 94, + 94, + 83, + 90, + 91, + 81, + 82, + 84, + 73, + 87, + 88, + 79, + 81, + 77, + 61, + 74, + 62, + 38, + 75, + 61, + 36, + 70, + 46, + 3, + 82, + 69, + 40, + 95, + 96, + 90, + 99, +100, + 94, + 94, + 95, + 89, + 99, +100, + 93, + 98, + 99, + 92, +100, +100, + 94, +102, +102, + 97, +101, +102, + 97, +108, +109, +105, +106, +103, + 96, + 31, +-28, +-97, + 36, +-15, +-79, + 49, + 0, +-62, + 57, + 4, +-59, + 22, +-41, +-116, + 19, +-40, +-114, + 48, +-14, +-85, + 40, +-19, +-84, + 42, +-21, +-112, + 26, +-34, +-103, + 54, + 9, +-61, + 64, + 21, +-52, + 66, + 26, +-50, + 46, + -4, +-78, + 59, + 34, + 10, + 63, + 48, + -8, + 73, + 73, + 53, + 82, + 84, + 71, + 85, + 87, + 76, + 91, + 92, + 80, +106, + 86, + 45, +120, + 98, + 43, +116, + 88, + 26, + 42, + 20, +-31, + 81, + 43, +-23, + 89, + 53, + -9, + 46, + 8, +-32, + 45, +-18, +-110, + 54, + 0, +-80, + 55, + 5, +-76, + 83, + 47, +-14, + 89, + 52, + -5, + 92, + 55, + 1, + 94, + 59, + 9, + 96, + 62, + 12, +100, + 65, + 18, +101, + 66, + 20, +102, + 70, + 25, +103, + 73, + 28, + 89, + 54, + 3, + 83, + 38, +-42, + 85, + 43, +-35, + 84, + 45, +-31, + 81, + 41, +-33, + 78, + 39, +-34, + 74, + 34, +-35, + 67, + 27, +-40, + 44, + 6, +-66, + 61, + 14, +-40, + 66, + 43, +-26, + 70, + 51, +-15, + 74, + 65, + 18, + 62, + 53, + 13, + 38, + 24, + -2, + 88, + 77, + 34, + 59, + 41, + -6, + 19, + 10, +-19, +-12, +-17, +-43, + 45, + 40, + 14, + 16, + -5, +-37, + 18, +-27, +-77, + 23, +-26, +-83, + 60, + 19, +-48, + 60, + 20, +-45, + 56, + 16, +-49, + 43, + 1, +-63, + 35, +-18, +-84, + 48, + -5, +-60, + 21, +-37, +-96, + 53, + -5, +-73, + 36, +-17, +-81, + 41, +-11, +-65, + 51, + 14, +-16, + 80, + 45, + 4, + 52, + 20, +-14, +105, +100, + 90, +121, +121, +120, + 91, + 90, + 92, +101, +100, +102, + 75, + 78, + 80, + 82, + 83, + 83, + 81, + 73, + 53, + 74, + 60, + 33, + 80, + 64, + 39, + 69, + 45, + -2, + 71, + 47, + 0, + 83, + 82, + 71, +115, +115, +114, +115, +115, +114, +120, +120, +118, +116, +116, +115, +121, +121, +121, +120, +120, +120, +107, +108, +105, + 96, + 99, + 91, + 97, + 94, + 85, + 31, +-24, +-91, + 42, + -4, +-63, + 52, + 8, +-46, + 57, + 13, +-37, + 24, +-34, +-98, + 21, +-36, +-104, + 53, + 2, +-54, + 41, +-10, +-65, + 43, +-14, +-88, + 23, +-33, +-102, + 54, + 9, +-63, + 63, + 21, +-52, + 66, + 26, +-50, + 47, + -5, +-76, + 60, + 34, + 12, + 66, + 51, + 0, + 76, + 79, + 62, + 82, + 84, + 71, + 85, + 86, + 77, + 91, + 89, + 73, +111, + 86, + 37, +121, + 95, + 30, +119, + 90, + 17, + 42, + 20, +-32, + 82, + 44, +-15, + 89, + 66, + 24, + 35, + 5, +-23, + 36, +-28, +-112, + 52, + 0, +-80, + 53, + 5, +-76, + 75, + 27, +-40, + 82, + 34, +-31, + 86, + 39, +-23, + 84, + 38, +-19, + 81, + 37, +-18, + 84, + 40, +-17, + 91, + 43, +-16, + 90, + 40, +-17, + 96, + 51, + -6, + 76, + 31, +-38, + 83, + 38, +-42, + 85, + 44, +-34, + 84, + 44, +-31, + 81, + 41, +-33, + 78, + 39, +-34, + 74, + 34, +-35, + 67, + 27, +-39, + 42, + 0, +-67, + 51, + 4, +-48, + 48, + 29, +-30, + 67, + 55, + 1, + 73, + 65, + 22, + 54, + 45, + 6, + 8, +-16, +-50, + -9, +-38, +-88, + 16, + -8, +-117, + -7, +-13, +-115, +-39, +-62, +-116, + 76, + 70, + 35, + 8, + -4, +-35, + 11, +-39, +-109, + 25, +-24, +-87, + 59, + 18, +-48, + 59, + 19, +-46, + 55, + 15, +-49, + 41, + 0, +-62, + 37, +-18, +-79, + 49, + -3, +-60, + 18, +-39, +-100, + 63, + 5, +-66, + 39, +-13, +-74, + 33, +-18, +-71, + 62, + 24, + -8, + 77, + 40, + -3, + 45, + 9, +-27, +105, +100, + 87, +122, +122, +121, +102, +101, +103, +107, +107, +108, +106, +107, +107, + 84, + 81, + 72, + 81, + 72, + 51, + 79, + 67, + 39, + 81, + 67, + 39, + 74, + 50, + 4, + 75, + 50, + 0, + 90, + 82, + 56, +120, +120, +120, +121, +121, +121, +120, +120, +118, +113, +113, +111, +121, +121, +121, +121, +121, +121, +117, +116, +114, +101, +103, + 95, +101, + 96, + 86, + 34, +-21, +-90, + 41, + -8, +-69, + 54, + 9, +-48, + 59, + 15, +-39, + 25, +-34, +-100, + 20, +-37, +-107, + 55, + 6, +-51, + 40, +-11, +-69, + 45, +-14, +-88, + 23, +-37, +-108, + 52, + 7, +-65, + 62, + 20, +-55, + 65, + 25, +-51, + 43, +-11, +-78, + 55, + 31, + 10, + 67, + 58, + 11, + 82, + 84, + 71, + 91, + 93, + 83, + 92, + 93, + 85, + 96, + 89, + 70, +113, + 77, + 8, +119, + 88, + -3, +120, + 85, +-10, + 44, + 21, +-28, + 81, + 33, +-48, + 91, + 61, + 8, + 41, + 9, +-27, + 44, +-20, +-104, + 51, + -2, +-81, + 52, + 3, +-77, + 24, + -1, +-28, + 15, +-26, +-86, + 16, +-19, +-78, + 25, + 1, +-54, + 14, +-29, +-88, + 15, +-17, +-48, + 42, + 11, +-15, + 49, + 20, + -8, + 68, + 44, + 17, + 90, + 53, + 1, + 83, + 37, +-43, + 85, + 43, +-34, + 84, + 44, +-31, + 79, + 40, +-34, + 78, + 39, +-34, + 74, + 34, +-34, + 68, + 27, +-39, + 40, + 0, +-68, + 44, + -7, +-60, + 40, + 23, +-33, + 63, + 51, + -3, + 73, + 66, + 23, + 53, + 44, + 9, + 30, + 20, +-10, + 30, + 27, +-11, + 53, + 35, +-119, + -7, +-13, +-97, + 41, + 34, +-87, + 70, + 55, + 5, + 25, + 5, +-35, + 36, + 8, +-97, + 26, +-23, +-81, + 58, + 17, +-49, + 58, + 18, +-47, + 54, + 14, +-51, + 39, + -3, +-67, + 43, +-19, +-94, + 46, +-10, +-88, + 19, +-43, +-111, + 60, + -2, +-91, + 40, +-17, +-88, + 23, +-37, +-100, + 63, + 17, +-36, + 77, + 30, +-38, + 46, + 0, +-56, +109, + 96, + 70, +121, +121, +121, +121, +121, +121, +121, +121, +121, +113, +112, +110, + 84, + 79, + 64, + 83, + 74, + 49, + 84, + 73, + 44, + 84, + 72, + 44, + 81, + 59, + 13, + 79, + 57, + 6, + 77, + 61, + 19, +113, +113, +108, +121, +121, +121, +121, +121, +121, +114, +114, +113, +121, +121, +121, +121, +121, +121, +114, +114, +111, + 92, + 96, + 81, +101, + 96, + 89, + 32, +-25, +-104, + 44, +-10, +-84, + 60, + 9, +-64, + 62, + 9, +-62, + 22, +-42, +-128, + 17, +-42, +-127, + 57, + -2, +-81, + 40, +-22, +-97, + 42, +-22, +-128, + 19, +-45, +-123, + 51, + 6, +-66, + 63, + 18, +-56, + 65, + 24, +-52, + 29, +-18, +-82, + 54, + 32, + 11, + 65, + 52, + 10, + 76, + 78, + 67, + 86, + 87, + 79, + 87, + 89, + 83, + 97, + 90, + 72, +110, + 83, + 33, +120, + 91, + 18, +119, + 88, + 11, + 45, + 21, +-26, + 87, + 39, +-44, + 93, + 50, +-27, + 55, + 16, +-27, + 38, +-20, +-100, + 52, + -2, +-82, + 52, + 3, +-79, +-88, +-120, +-124, +-58, +-86, +-113, +-38, +-64, +-82, +-44, +-72, +-94, +-16, +-41, +-117, + -9, +-18, +-33, + 38, + 24, + 9, + 44, + 31, + 14, + 67, + 49, + 26, + 86, + 52, + 1, + 82, + 37, +-44, + 84, + 43, +-36, + 83, + 43, +-32, + 80, + 40, +-34, + 77, + 38, +-35, + 74, + 34, +-33, + 68, + 27, +-39, + 41, + -4, +-69, + 3, +-47, +-92, + 19, +-17, +-62, + 18, +-21, +-73, + 16, +-11, +-40, + -5, +-41, +-68, + -6, +-43, +-79, +-19, +-53, +-95, +-33, +-87, +-121, +-34, +-88, +-126, +-34, +-89, +-123, +-36, +-91, +-123, +-32, +-83, +-117, +-17, +-66, +-107, + 18, +-30, +-81, + 57, + 16, +-50, + 57, + 17, +-48, + 53, + 13, +-52, + 35, + -7, +-70, + 47, +-15, +-95, + 47, +-12, +-90, + 27, +-35, +-107, + 63, + 1, +-84, + 43, +-16, +-91, + 20, +-41, +-114, + 63, + 18, +-32, + 75, + 29, +-37, + 52, + 6, +-51, +108, + 96, + 70, +122, +122, +122, +121, +121, +121, +121, +121, +121, +108, +107, +105, + 99, + 97, + 91, + 96, + 91, + 81, + 99, + 93, + 80, + 84, + 70, + 49, + 91, + 78, + 58, + 92, + 79, + 56, + 89, + 76, + 55, +109, +107, + 99, +118, +118, +115, +120, +120, +118, +115, +115, +114, +121, +121, +121, +121, +121, +121, +115, +115, +113, + 98, + 98, + 95, +105, + 99, + 92, + 42, +-16, +-97, + 48, + -2, +-76, + 60, + 9, +-65, + 65, + 10, +-61, + 22, +-42, +-128, + 18, +-42, +-126, + 59, + 2, +-79, + 40, +-22, +-98, + 41, +-22, +-128, + 19, +-48, +-128, + 50, + 5, +-69, + 62, + 17, +-56, + 66, + 24, +-52, + 39, +-11, +-82, + 16, +-31, +-72, + 19, +-16, +-59, + 23, +-11, +-37, + 13, +-14, +-30, + 14, +-10, +-21, + 17, + -6, +-21, + 24, + -9, +-48, + 31, + -2, +-46, + 30, + -5, +-59, + 2, +-37, +-72, + 14, +-34, +-86, + 12, +-30, +-70, + -5, +-50, +-79, + 24, +-34, +-111, + 51, + -3, +-82, + 51, + 2, +-78, +-85, +-116, +-121, +-68, +-104, +-122, +-51, +-80, +-92, +-63, +-94, +-113, +-29, +-31, +-112, + 44, + 24, +-73, + 59, + 44, +-33, + 64, + 44, + -4, + 78, + 59, + 15, + 87, + 52, + -1, + 83, + 37, +-45, + 84, + 43, +-39, + 83, + 43, +-33, + 79, + 39, +-36, + 77, + 38, +-35, + 75, + 35, +-34, + 70, + 31, +-36, + 57, + 17, +-48, + 31, + -8, +-64, + 31, +-10, +-64, + 31, +-10, +-65, + 30, +-10, +-65, + 29, +-11, +-64, + 29, +-11, +-66, + 28, +-13, +-66, + 27, +-15, +-67, + 26, +-16, +-68, + 24, +-18, +-70, + 22, +-20, +-72, + 21, +-21, +-76, + 19, +-24, +-78, + 36, + -6, +-62, + 57, + 16, +-48, + 56, + 16, +-49, + 51, + 10, +-54, + 33, + -9, +-69, + 44, +-13, +-86, + 46, + -8, +-72, + 40, +-15, +-83, + 66, + 12, +-55, + 41, + -9, +-72, + 21, +-37, +-96, + 66, + 35, + 8, + 76, + 41, + -5, + 56, + 11, +-31, +107, +101, + 87, +121, +121, +121, +114, +114, +113, +118, +118, +118, +120, +120, +120, +113, +113, +112, +121, +121, +121, +116, +113, +111, + 48, + 18, +-15, + 93, + 86, + 79, +119, +118, +118, +121, +121, +121, +115, +116, +106, +120, +120, +120, +119, +120, +116, +114, +115, +112, +121, +121, +121, +121, +121, +121, +118, +118, +116, + 96, + 97, + 95, +103, + 98, + 92, + 48, + -2, +-74, + 50, + 9, +-48, + 62, + 17, +-42, + 63, + 17, +-40, + 24, +-36, +-118, + 17, +-37, +-111, + 62, + 12, +-53, + 41, +-14, +-74, + 41, +-19, +-99, + 20, +-43, +-119, + 48, + 2, +-71, + 61, + 16, +-57, + 65, + 23, +-52, + 51, + 9, +-64, + 44, + -8, +-82, + 49, + -6, +-83, + 45, +-10, +-84, + 48, +-10, +-86, + 42, +-16, +-93, + 40, +-19, +-95, + 36, +-24, +-97, + 37, +-21, +-100, + 33, +-26, +-105, + 31, +-28, +-105, + 26, +-31, +-108, + 19, +-35, +-108, + 19, +-33, +-106, + 34, +-17, +-90, + 52, + 2, +-77, + 53, + 5, +-76, +-69, +-107, +-123, +-55, +-100, +-125, +-15, +-61, +-94, + 17, +-23, +-109, + 13, + -1, +-111, +-43, +-48, +-123, + 49, + 28, +-57, + 81, + 38, +-126, + 83, + 56, +-52, + 90, + 51, +-21, + 82, + 36, +-46, + 84, + 43, +-39, + 81, + 41, +-35, + 78, + 38, +-37, + 76, + 37, +-37, + 75, + 36, +-33, + 72, + 34, +-33, + 70, + 30, +-37, + 67, + 27, +-40, + 64, + 26, +-40, + 64, + 27, +-39, + 63, + 26, +-39, + 65, + 27, +-38, + 65, + 26, +-39, + 62, + 23, +-40, + 61, + 21, +-42, + 57, + 19, +-45, + 57, + 17, +-48, + 55, + 14, +-45, + 54, + 13, +-46, + 53, + 13, +-49, + 54, + 14, +-49, + 55, + 15, +-48, + 53, + 12, +-50, + 49, + 9, +-55, + 36, + -8, +-70, + 49, + -8, +-77, + 49, + -4, +-65, + 37, +-20, +-86, + 71, + 20, +-49, + 47, + -3, +-66, + 22, +-35, +-92, + 71, + 39, + 12, + 77, + 40, + -6, + 55, + 11, +-28, +107, +101, + 87, +121, +121, +121, +109, +110, +107, +120, +120, +120, +120, +120, +120, +115, +115, +113, +120, +119, +119, + 89, + 80, + 72, + 27, + -8, +-40, + 54, + 33, + 12, +114, +113, +112, +121, +121, +121, +121, +121, +121, +111, +110, +105, + 85, + 84, + 65, + 86, + 83, + 67, +100, +100, + 96, +112, +111, +109, +120, +121, +120, +105, +106, +103, +103, + 98, + 92, + 49, + -2, +-71, + 56, + 14, +-47, + 57, + 14, +-41, + 62, + 22, +-30, + 28, +-33, +-107, + 17, +-37, +-103, + 63, + 18, +-39, + 40, +-11, +-60, + 42, +-14, +-88, + 21, +-39, +-109, + 45, + -2, +-74, + 59, + 14, +-59, + 65, + 23, +-53, + 67, + 27, +-51, + 68, + 27, +-53, + 68, + 26, +-53, + 69, + 25, +-52, + 68, + 21, +-53, + 60, + 12, +-60, + 59, + 11, +-62, + 57, + 9, +-65, + 55, + 6, +-67, + 52, + 3, +-72, + 52, + 1, +-73, + 53, + 0, +-75, + 50, + 0, +-74, + 49, + 0, +-75, + 52, + 3, +-72, + 52, + 3, +-72, + 53, + 5, +-76, +-44, +-87, +-115, +-12, +-63, +-107, + 16, +-32, +-76, + 3, +-42, +-104, +-25, +-20, +-121, +-32, +-22, +-109, + 14, + 9, +-27, + 11, +-19, +-64, + 72, + 31, +-126, +102, + 72, +-79, + 80, + 34, +-49, + 83, + 40, +-41, + 81, + 41, +-38, + 77, + 37, +-38, + 75, + 36, +-37, + 75, + 35, +-34, + 73, + 33, +-34, + 71, + 32, +-35, + 68, + 31, +-36, + 67, + 31, +-37, + 66, + 30, +-35, + 66, + 30, +-35, + 65, + 29, +-36, + 65, + 29, +-36, + 63, + 26, +-39, + 61, + 25, +-40, + 60, + 23, +-42, + 59, + 19, +-43, + 57, + 17, +-43, + 55, + 15, +-44, + 55, + 14, +-47, + 54, + 13, +-49, + 52, + 11, +-48, + 50, + 9, +-53, + 47, + 6, +-57, + 33, +-14, +-79, + 54, + -6, +-81, + 48, +-12, +-78, + 42, +-19, +-93, + 72, + 15, +-66, + 58, + 4, +-69, + 26, +-38, +-106, + 78, + 37, +-11, + 79, + 32, +-35, + 66, + 14, +-41, +109, + 97, + 74, +119, +119, +117, +118, +118, +116, +118, +118, +115, +119, +118, +116, +112, +110, +105, + 86, + 73, + 59, + 15, +-17, +-52, + 41, + 5, +-32, + 21, +-20, +-67, + 44, + 21, +-11, +111, +112, +107, +112, +113, +110, + 97, + 97, + 82, + 76, + 73, + 52, + 54, + 49, + 19, + 75, + 68, + 42, + 70, + 58, + 24, + 14, + 15, +-10, + 70, + 72, + 65, +105, + 99, + 91, + 53, + -3, +-84, + 58, + 8, +-63, + 54, + 5, +-58, + 62, + 15, +-46, + 27, +-34, +-107, + 15, +-42, +-115, + 63, + 15, +-51, + 38, +-16, +-71, + 39, +-22, +-105, + 22, +-41, +-118, + 41, + -8, +-75, + 57, + 13, +-61, + 65, + 22, +-54, + 68, + 29, +-51, + 72, + 33, +-49, + 72, + 32, +-50, + 73, + 29, +-50, + 70, + 26, +-51, + 66, + 19, +-56, + 64, + 17, +-60, + 62, + 14, +-63, + 60, + 11, +-63, + 60, + 8, +-69, + 60, + 6, +-73, + 59, + 5, +-74, + 57, + 4, +-75, + 55, + 5, +-71, + 54, + 5, +-70, + 52, + 3, +-72, + 51, + 3, +-77, +-62, +-96, +-120, +-28, +-61, +-87, + 12, +-19, +-44, + 14, +-14, +-55, +-33, +-41, +-97, + 41, + 5, +-124, + 9, + -2, +-43, +-31, +-15, +-106, + 17, + 12, +-74, + 72, + 47, +-85, + 64, + 29, +-52, + 83, + 38, +-42, + 79, + 39, +-38, + 76, + 36, +-39, + 75, + 35, +-38, + 74, + 34, +-35, + 72, + 32, +-35, + 71, + 31, +-36, + 68, + 31, +-37, + 66, + 30, +-38, + 66, + 29, +-37, + 65, + 28, +-37, + 63, + 24, +-41, + 61, + 23, +-42, + 59, + 21, +-44, + 56, + 17, +-44, + 43, + 9, +-39, + 33, + -4, +-55, + 30, + -8, +-59, + 32, + -7, +-57, + 30, +-10, +-61, + 22, +-18, +-68, + 19, +-23, +-73, + 14, +-28, +-79, + 12, +-30, +-83, + 8, +-39, +-93, + 15, +-34, +-93, + 25, +-32, +-96, + 46, +-17, +-99, + 69, + 6, +-81, + 64, + 8, +-75, + 28, +-42, +-124, + 79, + 37, +-16, + 79, + 32, +-45, + 72, + 23, +-39, +112, + 98, + 74, +121, +121, +121, +122, +122, +122, +121, +121, +121, +121, +121, +121, +118, +118, +116, +113, +110, +105, + 94, + 84, + 70, + 31, + -7, +-46, + 63, + 45, + 24, + 97, + 93, + 87, +120, +120, +119, +101, +101, + 91, + 79, + 79, + 65, + 30, + 29, + 0, + 68, + 63, + 40, + 74, + 63, + 26, + 61, + 37, +-15, + 37, + 20, +-21, + 43, + 30, +-12, + 82, + 65, + 36, + 52, + -4, +-97, + 54, + 4, +-70, + 52, + -1, +-72, + 62, + 10, +-62, + 27, +-37, +-113, + 12, +-46, +-122, + 62, + 8, +-69, + 35, +-22, +-93, + 35, +-28, +-128, + 8, +-52, +-126, + 18, +-29, +-88, + 35, + -9, +-68, + 44, + 2, +-62, + 49, + 10, +-58, + 50, + 12, +-58, + 49, + 9, +-60, + 50, + 7, +-61, + 47, + 4, +-62, + 44, + -1, +-64, + 40, + -5, +-70, + 46, + 0, +-70, + 60, + 11, +-67, + 59, + 9, +-70, + 60, + 6, +-73, + 58, + 4, +-73, + 57, + 3, +-73, + 53, + 4, +-71, + 52, + 3, +-71, + 50, + 1, +-74, + 50, + 1, +-75, + 46, + -1, +-77, + 74, + 36, +-22, + 90, + 55, + -8, + 95, + 68, + 25, +-42, +-57, +-86, + 27, +-23, +-126, +-22, +-40, +-125, +-17, +-31, +-113, + 32, + -5, +-123, +-35, +-40, +-117, + 56, + 24, +-76, + 83, + 39, +-45, + 79, + 37, +-41, + 74, + 34, +-42, + 74, + 33, +-40, + 72, + 31, +-37, + 70, + 30, +-37, + 70, + 30, +-37, + 67, + 28, +-39, + 66, + 27, +-40, + 64, + 27, +-39, + 63, + 25, +-40, + 55, + 15, +-50, + 50, + 10, +-54, + 49, + 8, +-53, + 46, + 4, +-54, + 22, +-12, +-43, +-26, +-67, +-101, +-18, +-61, +-103, +-25, +-69, +-112, +-26, +-73, +-119, +-24, +-71, +-116, +-18, +-66, +-114, +-20, +-67, +-110, +-24, +-68, +-112, +-19, +-63, +-104, +-34, +-80, +-118, + 12, +-47, +-106, + 49, + -9, +-84, + 69, + 9, +-69, + 73, + 22, +-54, + 28, +-41, +-115, + 84, + 50, + 13, + 82, + 41, +-20, + 75, + 27, +-29, +113, +105, + 89, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +119, +119, +118, +121, +121, +121, +113, +111, +105, + 32, + -7, +-51, + 81, + 70, + 55, +113, +113, +112, +118, +118, +117, + 89, + 87, + 71, + 71, + 67, + 48, + 86, + 84, + 58, + 74, + 66, + 39, + 65, + 47, + 8, + 46, + 19, +-33, + 65, + 39, +-20, + 57, + 28, +-33, + 76, + 54, + 13, + 58, + 1, +-78, + 53, + 11, +-48, + 52, + 2, +-63, + 62, + 11, +-54, + 30, +-31, +-99, + 11, +-46, +-121, + 61, + 8, +-63, + 31, +-25, +-89, + 32, +-31, +-126, + -4, +-58, +-123, +-30, +-81, +-125, +-11, +-56, +-91, +-25, +-77, +-122, +-23, +-74, +-119, +-17, +-70, +-111, +-17, +-68, +-113, +-20, +-73, +-119, +-13, +-61, +-103, + 3, +-44, +-80, + 1, +-48, +-87, + 30, +-16, +-79, + 58, + 9, +-68, + 59, + 6, +-69, + 58, + 3, +-72, + 57, + 2, +-73, + 55, + 2, +-73, + 51, + 2, +-73, + 50, + 1, +-74, + 48, + -1, +-76, + 47, + -2, +-77, + 45, + 5, +-60, + 74, + 35, +-33, + 95, + 62, + 15, +104, + 88, + 63, +-29, +-34, +-71, + 42, +-10, +-126, + 44, + 11, +-122, + 17, +-29, +-127, + 25, + 5, +-33, + 65, + 20, +-55, + 83, + 37, +-101, + 84, + 40, +-50, + 80, + 36, +-42, + 75, + 33, +-43, + 72, + 31, +-42, + 70, + 29, +-41, + 68, + 28, +-39, + 67, + 27, +-40, + 65, + 25, +-42, + 64, + 24, +-42, + 62, + 22, +-43, + 61, + 21, +-44, + 48, + 8, +-56, + 42, + 2, +-59, + 42, + 0, +-59, + 38, + -4, +-60, + 13, +-21, +-52, + 13, + -6, +-16, + 55, + 39, + 30, + 51, + 27, + 11, + 52, + 27, + 11, + 51, + 22, + 4, + 56, + 32, + 15, + 63, + 39, + 24, + 71, + 45, + 28, + 57, + 18, +-23, + 18, +-16, +-44, + 7, +-47, +-99, + 51, + -6, +-70, + 70, + 12, +-61, + 73, + 24, +-43, + 38, +-19, +-78, + 65, + 26, + -9, + 56, + 16, +-30, + 49, + 11, +-35, + 44, + 8, +-42, + 54, + 33, +-16, + 80, + 59, + 22, + 97, + 85, + 63, +114, +109, +102, +119, +119, +118, +117, +116, +114, +101, + 89, + 74, + 63, + 37, + 8, + 74, + 53, + 22, +109, +109, +108, +116, +115, +116, + 83, + 83, + 70, + 58, + 50, + 21, + 85, + 83, + 62, + 78, + 68, + 40, + 58, + 34, +-18, + 46, + 16, +-37, + 57, + 27, +-30, + 63, + 35, +-23, + 81, + 66, + 43, + 60, + 6, +-65, + 48, + 9, +-38, + 49, + 4, +-50, + 60, + 15, +-35, + 31, +-24, +-83, + 9, +-45, +-108, + 58, + 13, +-41, + 28, +-21, +-68, + 29, +-31, +-118, + -9, +-59, +-117, + 4, +-30, +-51, + 25, +-15, +-51, + 24, +-17, +-58, + 28, +-14, +-53, + 33, +-10, +-47, + 37, + -4, +-37, + 39, + 0, +-32, + 47, + 13, +-17, + 54, + 25, + -5, +-18, +-64, +-98, + 34, +-14, +-80, + 55, + 6, +-69, + 54, + 4, +-71, + 55, + 1, +-72, + 53, + -1, +-74, + 50, + 0, +-74, + 49, + 0, +-75, + 48, + -1, +-76, + 46, + -3, +-77, + 45, + -4, +-78, + 39, + 1, +-57, + 64, + 30, +-25, + 95, + 67, + 20, + 99, + 74, + 28, + -6, +-11, +-46, + 0, +-37, +-121, + 4, +-24, +-121, + 15, + 11, +-29, + 65, + 36, + 6, + 83, + 41, +-21, + 77, + 30, +-54, + 82, + 36, +-48, + 78, + 34, +-44, + 73, + 30, +-45, + 69, + 29, +-46, + 68, + 27, +-41, + 67, + 27, +-40, + 65, + 25, +-42, + 63, + 23, +-44, + 62, + 22, +-44, + 59, + 19, +-46, + 57, + 17, +-48, + 45, + 5, +-58, + 40, + -1, +-61, + 38, + -3, +-62, + 36, + -8, +-61, + 9, +-28, +-60, + 61, + 54, + 51, +103, + 98, + 92, + 87, + 72, + 59, + 89, + 73, + 62, + 89, + 70, + 56, + 90, + 68, + 51, + 87, + 57, + 30, + 81, + 41, + -3, + 84, + 42, +-10, + 55, + 32, + 12, + 12, +-44, +-95, + 48, +-11, +-83, + 58, + -1, +-73, + 68, + 20, +-34, + 61, + 18, +-20, + 72, + 40, + 14, + 81, + 48, + 9, + 80, + 52, + 13, + 83, + 59, + 24, + 80, + 61, + 29, + 67, + 50, + 23, + 54, + 26, +-20, + 62, + 25, +-36, + 85, + 70, + 53, + 95, + 92, + 87, + 58, + 38, + 21, + 33, +-10, +-46, + 59, + 42, + 29, +106, +105, +103, +121, +121, +121, + 86, + 79, + 68, + 53, + 36, + 7, + 55, + 39, + 6, + 47, + 28, + -5, + 41, + 19, +-24, + 43, + 27, + 4, + 34, + 4, +-45, + 56, + 33, +-13, + 74, + 53, + 19, + 60, + 5, +-71, + 57, + 17, +-34, + 47, + 0, +-55, + 62, + 17, +-36, + 29, +-26, +-87, + 6, +-48, +-107, + 58, + 17, +-38, + 25, +-24, +-72, + 29, +-29, +-114, + -7, +-56, +-114, + 43, + 26, + 16, + 51, + 7, +-38, + 56, + 11, +-34, + 60, + 18, +-28, + 68, + 26, +-18, + 80, + 40, + 1, + 89, + 54, + 21, + 90, + 59, + 25, + 95, + 61, + 13, +-16, +-59, +-96, + 34, +-14, +-79, + 52, + 3, +-71, + 50, + 1, +-74, + 48, + -1, +-75, + 47, + -2, +-76, + 47, + -2, +-76, + 47, + -2, +-76, + 46, + -3, +-77, + 43, + -5, +-79, + 42, + -7, +-81, + 17, + 1, +-18, + 28, + 31, + 35, + 81, + 64, + 34, + 96, + 73, + 31, + 1, + -6, +-48, +-66, +-51, +-122, +-85, +-68, +-100, +-14, +-14, +-35, + -8, +-39, +-79, + 65, + 10, +-109, + 78, + 31, +-58, + 81, + 34, +-50, + 76, + 32, +-46, + 73, + 28, +-47, + 68, + 26, +-46, + 67, + 25, +-43, + 66, + 24, +-42, + 64, + 23, +-43, + 62, + 22, +-44, + 60, + 20, +-45, + 57, + 16, +-49, + 55, + 15, +-50, + 42, + 1, +-58, + 38, + -3, +-63, + 36, + -6, +-62, + 33, +-10, +-64, + 14, +-25, +-60, + 57, + 51, + 49, +105, + 98, + 92, + 88, + 74, + 62, + 86, + 65, + 47, + 84, + 56, + 33, + 80, + 44, + 7, + 78, + 34, +-13, + 78, + 35, +-19, + 87, + 46, + -9, + 58, + 33, + 11, + 47, + 7, +-43, + 52, + 14, +-34, + 32, + 3, +-52, + 23, +-30, +-67, + 83, + 17, + -9, + 87, + 48, + 7, + 86, + 58, + 14, + 60, + 43, + 0, + 61, + 45, + 4, + 56, + 47, + 12, + 59, + 51, + 19, + 39, + 36, +-12, + 9, + 18, +-28, + 56, + 43, + 10, + 39, + 16, +-25, + 46, + 13, +-36, + 34, + -7, +-54, + 8, + -5, +-17, + 48, + 44, + 41, + 59, + 55, + 50, +121, +121, +120, +121, +121, +120, + 97, + 90, + 81, + 13, + 3, +-17, + 59, + 55, + 47, + 46, + 46, + 39, + 94, + 89, + 84, +103, + 93, + 82, +108, + 88, + 64, + 58, + 0, +-79, + 56, + 9, +-49, + 45, + -8, +-79, + 57, + 5, +-64, + 26, +-35, +-105, + 3, +-56, +-126, + 58, + 5, +-70, + 20, +-35, +-95, + 26, +-36, +-128, +-10, +-60, +-113, + 48, + 39, + 36, + 48, + 6, +-37, + 52, + 7, +-39, + 56, + 10, +-35, + 65, + 22, +-23, + 81, + 41, + 2, + 88, + 53, + 18, + 90, + 55, + 18, + 93, + 59, + 6, +-23, +-61, +-91, + 30, +-17, +-81, + 47, + -2, +-73, + 46, + -3, +-75, + 46, + -3, +-77, + 45, + -4, +-78, + 45, + -4, +-78, + 45, + -4, +-78, + 42, + -7, +-81, + 41, + -8, +-82, + 40, + -9, +-83, + 6, + 10, + 6, + 22, + 28, + 28, + 62, + 48, + 27, + 93, + 68, + 22, + 16, + 8, +-37, +-88, +-71, +-111, +-78, +-57, +-79, +-62, +-51, +-73, + 8, + -6, +-37, + 80, + 40, +-14, + 75, + 26, +-57, + 78, + 31, +-52, + 76, + 29, +-48, + 70, + 25, +-50, + 68, + 23, +-48, + 65, + 23, +-45, + 63, + 21, +-45, + 62, + 21, +-45, + 60, + 19, +-46, + 58, + 17, +-48, + 53, + 12, +-52, + 50, + 9, +-55, + 39, + -2, +-62, + 35, + -6, +-66, + 32, + -9, +-68, + 30, +-13, +-68, + 14, +-27, +-61, + 57, + 51, + 48, +105, + 97, + 92, + 90, + 72, + 57, + 85, + 59, + 36, + 81, + 48, + 16, + 76, + 36, +-10, + 74, + 29, +-22, + 76, + 31, +-24, + 85, + 43, +-12, + 82, + 51, + 21, + 0, +-34, +-77, + 57, + 2, +-57, + 25, +-11, +-76, + 14, + 10, +-36, + 92, + 60, + 15, + 76, + 48, + 0, + 58, + 38, +-14, + 16, + 12, +-37, + 19, + 13, +-30, + 40, + 30, +-14, + 34, + 28, +-13, +-24, +-15, +-66, +-35, + -9, +-52, +-44, + -7, +-38, + 12, + 25, + -1, +-45, + -6, +-41, + 48, + 14, +-37, +-25, +-24, +-48, +-36, +-28, +-48, +-27, +-24, +-44, + 83, + 80, + 76, +121, +120, +119, +112, +111, +110, + 84, + 84, + 83, +119, +119, +119, +111, +110, +109, +114, +113, +112, +120, +120, +119, +103, + 93, + 80, + 65, + 37, + 16, + 64, + 22, +-20, + 41, +-10, +-80, + 53, + 3, +-61, + 24, +-36, +-101, + -2, +-57, +-128, + 56, + 4, +-68, + 17, +-36, +-99, + 23, +-40, +-128, +-19, +-69, +-124, + 53, + 46, + 46, + 46, + 3, +-38, + 50, + 5, +-40, + 56, + 10, +-36, + 66, + 23, +-23, + 81, + 41, + 0, + 88, + 51, + 16, + 88, + 51, + 8, + 97, + 63, + 8, +-25, +-67, +-97, + 28, +-19, +-85, + 44, + -5, +-76, + 43, + -7, +-77, + 42, + -7, +-80, + 44, + -9, +-82, + 42, + -8, +-81, + 42, + -8, +-80, + 40, + -9, +-83, + 38, +-11, +-85, + 38, +-11, +-86, + 21, + 23, + 16, + 39, + 40, + 34, + 46, + 51, + 42, + 68, + 46, + 1, + 24, + 15, +-28, +-40, +-30, +-45, +-61, +-45, +-55, +-14, + -3, +-10, +-29, +-25, +-65, + 78, + 37, +-18, + 72, + 23, +-58, + 76, + 29, +-53, + 75, + 28, +-49, + 69, + 23, +-51, + 66, + 21, +-51, + 64, + 20, +-47, + 61, + 19, +-47, + 60, + 18, +-48, + 58, + 16, +-48, + 54, + 12, +-52, + 49, + 7, +-56, + 46, + 4, +-57, + 37, + -6, +-65, + 33, +-10, +-69, + 31, +-12, +-71, + 27, +-16, +-72, + 7, +-33, +-68, + 58, + 49, + 44, +107, +100, + 94, + 92, + 72, + 56, + 83, + 52, + 24, + 79, + 41, + 3, + 72, + 28, +-19, + 68, + 22, +-31, + 72, + 24, +-29, + 80, + 36, +-21, + 68, + 38, + 0, + 55, + 48, + 25, +105, + 59, +-37, + 66, + 11, +-108, + 43, + 27, +-21, + 88, + 57, + 9, + -2, + -3, +-58, +-12, +-11, +-70, + 17, + 12, +-47, + 22, + 16, +-29, + 37, + 28, +-14, + 48, + 36, + -7, + 39, + 29, +-21, +-39, +-24, +-79, + -4, + 2, +-51, +-23, + -5, +-52, + 25, + 36, + -7, + 39, + 8, +-40, +-38, +-70, +-93, +-49, +-85, +-116, +-43, +-77, +-108, + 7, + -5, +-13, + 51, + 42, + 37, + 42, + 32, + 26, + 33, + 21, + 19, + 29, + 18, + 13, + 17, + 4, + -2, + 18, + 1, + -6, + 18, + 2, + -4, +-16, +-43, +-53, +-21, +-68, +-103, + 66, + 34, + 8, + 36, + -8, +-59, + 53, + 11, +-35, + 24, +-29, +-83, + -5, +-59, +-123, + 54, + 10, +-41, + 17, +-32, +-81, + 22, +-38, +-118, +-31, +-73, +-106, + 66, + 59, + 59, + 43, + -1, +-42, + 50, + 5, +-41, + 55, + 10, +-39, + 67, + 24, +-22, + 80, + 39, + -3, + 87, + 48, + 8, + 87, + 49, + 3, +102, + 69, + 15, +-23, +-66, +-97, + 24, +-24, +-88, + 41, + -9, +-80, + 40, + -9, +-82, + 39, +-10, +-84, + 41, +-13, +-85, + 40, +-11, +-84, + 38, +-12, +-84, + 37, +-13, +-86, + 36, +-13, +-88, + 35, +-14, +-88, + 23, + 24, + 15, + 36, + 37, + 35, + 53, + 61, + 56, + -7, + 6, +-31, + 23, + 14, +-19, +-26, +-18, +-23, +-71, +-54, +-63, +-13, + -5, +-12, + 24, + 18, + -7, + 71, + 30, +-25, + 73, + 19, +-60, + 75, + 26, +-56, + 73, + 25, +-52, + 66, + 20, +-52, + 64, + 19, +-51, + 62, + 17, +-49, + 60, + 17, +-49, + 57, + 15, +-49, + 53, + 11, +-53, + 49, + 7, +-57, + 44, + 2, +-59, + 42, + -1, +-60, + 33, +-10, +-69, + 31, +-13, +-71, + 29, +-14, +-73, + 26, +-18, +-75, + 28, + 4, +-14, + 19, + -1, +-10, + 94, + 81, + 69, + 89, + 64, + 41, + 81, + 43, + 8, + 72, + 30, +-13, + 63, + 16, +-31, + 59, + 11, +-41, + 63, + 14, +-39, + 66, + 16, +-38, + 45, + 1, +-49, + 71, + 69, + 64, + 95, + 58, + 7, + 86, + 36, +-59, + 85, + 50, + -3, + 80, + 51, + 3, + 13, + 4, +-52, + 6, + 5, +-58, + 24, + 17, +-42, + 20, + 17, +-36, + 57, + 40, + -4, + 25, + 17, +-39, + 17, + 11, +-44, + 8, + 9, +-46, + 48, + 34, + -4, + 49, + 47, + 15, + 86, + 85, + 68, + 52, + 15, +-30, + -5, +-43, +-87, +-13, +-55, +-104, + -5, +-45, +-94, + 0, +-36, +-83, + 1, +-37, +-84, + -3, +-39, +-87, +-13, +-50, +-95, + -7, +-43, +-87, +-21, +-58, +-97, +-46, +-77, +-108, + 2, +-15, +-26, + -3, +-32, +-48, + 6, +-38, +-77, + 62, + 32, + 5, + 27, +-18, +-59, + 47, + 8, +-36, + 21, +-28, +-80, +-11, +-60, +-106, + 54, + 21, + -7, + 37, + 2, +-23, + 12, +-31, +-70, +-22, +-50, +-54, + 32, + 14, + 7, + 42, + -2, +-44, + 49, + 3, +-42, + 54, + 9, +-40, + 65, + 20, +-26, + 76, + 36, +-11, + 83, + 43, + -1, + 84, + 45, + -3, + 72, + 40, + -8, +-31, +-67, +-97, + 22, +-27, +-89, + 37, +-12, +-82, + 37, +-13, +-84, + 37, +-15, +-88, + 39, +-17, +-89, + 35, +-15, +-88, + 35, +-15, +-87, + 33, +-16, +-89, + 33, +-16, +-92, + 32, +-17, +-92, + 32, + 34, + 27, + 40, + 42, + 42, + 43, + 48, + 47, + 49, + 53, + 22, + 2, + 1, +-32, +-103, +-80, +-94, +-99, +-76, +-89, +-76, +-63, +-74, + 10, +-15, +-41, + 33, + -3, +-43, + 42, + 13, +-22, + 47, + 18, + -9, + 47, + 21, + -6, + 15, + -7, +-32, + 49, + 27, + -5, + 61, + 41, + 3, + 59, + 13, +-51, + 55, + 11, +-54, + 49, + 6, +-58, + 43, + 1, +-62, + 39, + -4, +-63, + 37, + -6, +-65, + 31, +-13, +-71, + 29, +-14, +-73, + 28, +-16, +-74, + 29, + -9, +-54, + 1, +-18, +-30, + 24, + 1, +-17, + 37, +-11, +-52, + 58, + 11, +-33, + 62, + 14, +-31, + 64, + 27, + -9, + 75, + 51, + 23, + 96, + 88, + 70, + 92, + 85, + 71, + 73, + 52, + 33, + 54, + 9, +-38, + 73, + 57, + 29, + 69, +-12, +-109, + 64, + 8, +-39, + 86, + 50, + -1, + 33, + 19, +-42, + -2, + -5, +-63, + 3, + 1, +-61, + 34, + 25, +-36, + 19, + 13, +-42, + 42, + 31, +-17, +-26, +-16, +-68, + 13, + 7, +-50, + 16, + 10, +-44, + 82, + 62, + 28, + 73, + 62, + 31, +101, +100, + 91, + 64, + 26, +-33, +115, +113, +109, +111, +109, +106, +118, +117, +113, +117, +116, +113, +119, +119, +113, +122, +122, +119, +118, +117, +114, +121, +121, +121, + 83, + 78, + 69, +-39, +-67, +-112, +102, +100, + 96, + 78, + 54, + 33, + 30, +-16, +-56, + 48, + 13, +-25, + 16, +-31, +-85, + 41, + -5, +-55, + -2, +-44, +-85, +-37, +-73, +-102, + 47, + 21, +-14, + 55, + 14, +-37, + 24, +-22, +-70, +-34, +-68, +-89, + 5, +-36, +-72, + 41, + -4, +-46, + 49, + 3, +-42, + 54, + 9, +-38, + 62, + 17, +-30, + 72, + 29, +-18, + 77, + 35, +-12, + 49, + 10, +-29, + 56, + 38, + 18, + 59, + 37, + 13, + 24, +-25, +-93, + 35, +-15, +-86, + 34, +-15, +-87, + 34, +-17, +-91, + 36, +-19, +-92, + 34, +-19, +-92, + 31, +-18, +-92, + 30, +-19, +-94, + 30, +-19, +-94, + 29, +-20, +-96, + 39, + 40, + 40, + 40, + 42, + 43, + 41, + 45, + 45, + 75, + 70, + 48, + 73, + 63, + 36, +-119, +-112, +-123, +-93, +-91, +-90, +-32, +-34, +-34, + 14, + 3, + 5, + 18, + 8, + 10, + 19, + 9, + 12, + 22, + 13, + 17, + 21, + 12, + 15, + 14, + 6, + 7, + 24, + 1, +-24, + 26, +-34, +-43, + 53, + 9, +-37, + 54, + 7, +-55, + 44, + 1, +-61, + 38, + -5, +-64, + 36, + -7, +-66, + 32, +-11, +-70, + 30, +-13, +-72, + 28, +-15, +-75, + 25, +-17, +-79, + 22, +-14, +-59, +-56, +-96, +-116, + 40, + 28, + 23, + 92, + 77, + 52, + 88, + 74, + 47, + 85, + 71, + 48, +105, +102, + 88, +107, +106, + 95, +103, + 99, + 84, +109, +108, + 97, +107, +105, + 96, + 75, + 48, + 16, + 76, + 64, + 44, + 86, + 28, +-87, + 74, + 9, +-82, + 66, + 39, + -9, + 20, + 8, +-50, + 37, +-13, +-57, + 39, + 28, +-12, + 61, + 44, + 0, + 37, + 28, +-20, + 33, + 27, +-11, + 7, + 9, +-44, + 25, + 18, +-38, + 15, + 7, +-48, + 85, + 63, + 26, + 81, + 69, + 41, + 89, + 89, + 70, + 66, + 31, +-33, +123, +122, +123, +119, +119, +117, +123, +123, +123, +123, +123, +123, +122, +122, +122, +122, +122, +122, +120, +120, +118, +122, +122, +122, + 91, + 84, + 73, +-24, +-51, +-98, +106, +103, + 97, + 79, + 54, + 31, + 44, + 8, +-17, + 30, +-15, +-67, + 15, +-36, +-97, + 34, +-15, +-69, + 1, +-43, +-93, +-30, +-65, +-91, + 31, +-16, +-75, + 13, +-39, +-98, + 9, +-52, +-128, +-45, +-78, +-106, + 31, + 4, + -8, + 42, + 0, +-41, + 49, + 4, +-38, + 52, + 6, +-39, + 56, + 10, +-37, + 62, + 17, +-32, + 65, + 20, +-28, + 5, +-35, +-68, + 15, +-12, +-36, + -7, +-40, +-59, + 27, +-22, +-90, + 32, +-18, +-90, + 34, +-20, +-91, + 34, +-20, +-93, + 33, +-23, +-96, + 33, +-22, +-95, + 29, +-20, +-96, + 28, +-21, +-97, + 27, +-23, +-98, + 27, +-24, +-100, + 39, + 40, + 35, + 41, + 43, + 42, + 42, + 46, + 44, + 76, + 70, + 55, +104, + 88, + 64, + 2, + -5, +-23, +-41, +-50, +-49, + 20, + 5, + -2, + 27, + 9, + -5, + 33, + 12, + 1, + 30, + 8, + -3, + 31, + 7, + -3, + 29, + 6, + -3, + 24, + 4, + -6, + 35, + 3, +-35, + 67, + 25, +-68, + 21, +-19, +-69, + 35, +-16, +-66, + 28, +-21, +-69, + 33, +-14, +-70, + 32, +-15, +-75, + 32, +-16, +-76, + 29, +-15, +-79, + 28, +-18, +-81, + 25, +-19, +-83, + 23, +-17, +-66, +-58, +-92, +-100, + 68, + 54, + 18, + 90, + 80, + 44, + 94, + 88, + 57, + 99, + 92, + 72, + 97, + 94, + 73, +103, +101, + 87, + 95, + 91, + 70, +104, +101, + 85, +102, + 99, + 84, + 82, + 71, + 48, +101, + 95, + 75, + 83, + 46, +-11, + 55, + -3, +-69, + 27, + 10, +-43, + 32, +-11, +-58, + 38, + 14, +-41, + 47, + 33, +-13, + 41, + 26, +-41, + 13, + 8, +-51, +-45, +-27, +-98, +-44, +-26, +-100, +-29, +-19, +-88, + 1, + 2, +-56, + 55, + 8, +-67, + 77, + 67, + 38, + 50, + 56, + 25, + 55, + 24, +-40, +123, +123, +123, +119, +119, +118, +123, +123, +123, +123, +123, +123, +122, +122, +122, +123, +123, +123, +119, +119, +118, +123, +123, +123, + 96, + 89, + 78, +-18, +-47, +-93, +109, +106, + 99, + 74, + 46, + 17, + 34, + 2, +-21, + 30, +-10, +-48, + 14, +-36, +-88, + 31, +-11, +-53, + 5, +-35, +-74, +-23, +-61, +-89, + 32, +-14, +-66, + 13, +-35, +-86, + 7, +-51, +-126, +-49, +-77, +-93, + 52, + 32, + 20, + 40, + 1, +-36, + 43, + -1, +-40, + 43, + -3, +-46, + 44, + -2, +-47, + 49, + -1, +-47, + 52, + 2, +-47, + 4, +-37, +-73, + 15, +-18, +-44, +-19, +-66, +-109, + 26, +-24, +-93, + 29, +-21, +-93, + 29, +-21, +-95, + 30, +-24, +-98, + 29, +-26, +-100, + 29, +-26, +-100, + 26, +-25, +-100, + 24, +-26, +-102, + 26, +-28, +-103, + 23, +-28, +-105, + 33, + 33, + 26, + 33, + 35, + 32, + 43, + 44, + 43, + 49, + 54, + 43, + 54, + 58, + 29, + 74, + 51, + 7, +-80, +-91, +-105, + 56, + 36, + 20, + 58, + 36, + 21, + 59, + 38, + 24, + 64, + 40, + 26, + 65, + 41, + 25, + 65, + 40, + 24, + 65, + 41, + 20, + 48, + 17, + -8, + 10, +-44, +-116, + 4, +-38, +-84, + 25, +-14, +-59, + 22, +-19, +-66, + 30, +-18, +-79, + 31, +-17, +-79, + 30, +-18, +-79, + 30, +-18, +-80, + 28, +-20, +-81, + 30, + -8, +-59, + 32, + 0, +-40, + 73, + 61, + 22, + 86, + 74, + 34, + 74, + 63, + 19, + 87, + 76, + 45, +103, +101, + 87, +100, + 98, + 83, +101, + 99, + 84, + 86, + 82, + 63, + 95, + 88, + 65, + 98, + 93, + 61, +101, + 93, + 53, +102, + 97, + 51, +101, + 92, + 56, +106, +102, + 77, + 43, + 37, + 13, + 8, + -9, +-62, + 8, +-36, +-81, + 33, + 19, +-38, + 25, + 17, +-36, +-22, +-17, +-77, +-85, +-45, +-118, +-80, +-43, +-118, +-46, +-25, +-90, + 20, + 14, +-41, + 25, + 17, +-38, + 18, + 16, +-28, + 30, + 22, +-19, + 46, + 14, +-49, +109, +107, + 96, +120, +120, +119, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +123, +119, +119, +119, +123, +123, +123, + 92, + 87, + 76, +-22, +-54, +-98, +109, +106, + 99, + 63, + 28, +-15, + 41, + 12, + -8, + 31, +-10, +-49, + 11, +-37, +-85, + 30, + -7, +-41, + 16, +-25, +-63, + 7, +-35, +-69, + 33, + -8, +-50, + 14, +-32, +-75, + 1, +-50, +-95, + -5, +-32, +-45, + 1, +-29, +-42, +-14, +-50, +-76, +-20, +-61, +-93, +-20, +-63, +-97, +-23, +-64, +-99, + -9, +-56, +-97, + -1, +-50, +-95, +-10, +-57, +-100, + 26, + -2, +-24, +-23, +-71, +-118, + 24, +-26, +-96, + 26, +-23, +-98, + 26, +-24, +-100, + 25, +-26, +-102, + 26, +-29, +-104, + 26, +-30, +-105, + 24, +-29, +-105, + 24, +-32, +-107, + 24, +-32, +-108, + 20, +-33, +-111, + 31, + 32, + 24, + 32, + 34, + 30, + 35, + 37, + 37, + 47, + 51, + 46, + 40, + 49, + 22, + 89, + 81, + 53, +-58, +-75, +-85, +-46, +-80, +-92, +-43, +-80, +-91, +-43, +-81, +-94, +-47, +-85, +-99, +-51, +-89, +-104, +-54, +-93, +-107, +-57, +-98, +-113, +-60, +-103, +-120, + 8, +-19, +-44, + 20, + -6, +-42, + 31, + 2, +-39, + 25, +-10, +-53, + 28, +-19, +-81, + 29, +-19, +-79, + 29, +-19, +-78, + 27, +-20, +-81, + 52, + 27, +-11, + 98, + 92, + 69, + 95, + 86, + 54, + 87, + 72, + 27, + 79, + 56, + -1, + 81, + 67, + 32, + 99, + 90, + 61, +102, + 98, + 81, +105, +102, + 82, +106, +105, + 88, + 99, + 97, + 78, +108, +106, + 90, + 99, + 95, + 71, + 97, + 89, + 48, +100, + 95, + 64, +104, + 99, + 57, + 97, + 90, + 40, + 95, + 89, + 58, + 28, +-11, +-39, + 0, +-21, +-70, + 20, + 4, +-49, +-28, +-20, +-84, + 14, + 2, +-59, + 43, + 25, +-19, +-19, +-14, +-70, +-18, +-12, +-73, + 9, + 4, +-55, + 38, + 23, +-29, + 27, + 12, +-34, +-15, +-37, +-79, + 34, + -5, +-53, + 83, + 66, + 34, +112, +112, +111, +116, +116, +116, +116, +116, +116, +115, +115, +115, +115, +115, +115, + 98, + 98, + 94, +106, +106, +106, + 61, + 58, + 50, +-42, +-77, +-114, +101, +100, + 96, + 50, + 6, +-44, + 37, + 6, +-16, + 29, +-17, +-69, + 12, +-39, +-95, + 22, +-20, +-61, + 19, +-25, +-67, + 13, +-26, +-52, + 62, + 48, + 44, + 78, + 73, + 85, + 81, + 80, + 95, + 69, + 63, + 71, + 64, + 51, + 49, + 66, + 47, + 35, + 63, + 40, + 26, + 50, + 30, + 16, + 53, + 31, + 18, + 57, + 38, + 24, + 66, + 48, + 33, + 29, + 5, +-11, + 37, + 9, +-14, + 9, +-40, +-85, + 23, +-27, +-102, + 23, +-26, +-102, + 25, +-28, +-103, + 24, +-32, +-107, + 22, +-34, +-111, + 20, +-32, +-106, + 25, +-25, +-77, + 22, +-19, +-62, + 14, +-27, +-60, + 10, +-28, +-67, + 25, + 27, + 17, + 29, + 31, + 27, + 23, + 27, + 28, + 35, + 39, + 40, + 40, + 49, + 33, + 76, + 72, + 49, + 25, + 25, + 4, +-108, +-125, +-125, +-103, +-125, +-126, +-100, +-125, +-126, +-101, +-122, +-125, +-94, +-121, +-126, +-95, +-112, +-118, +-93, +-113, +-118, +-74, +-100, +-110, + -4, +-26, +-52, +-15, +-42, +-70, + 20, + -7, +-42, + 15, +-24, +-61, + 26, +-21, +-83, + 26, +-22, +-84, + 26, +-22, +-84, + 45, + 12, +-29, + 84, + 68, + 31, + 97, + 85, + 55, + 97, + 91, + 73, + 79, + 61, + 7, + 57, + 38, +-10, + 97, + 89, + 56, + 95, + 89, + 66, + 99, + 93, + 71, +101, + 95, + 73, +109, +107, + 93, +104, + 99, + 78, +106, +102, + 76, + 97, + 94, + 72, + 57, + 50, + 11, + 92, + 86, + 51, +100, + 96, + 68, +105, + 97, + 62, +106, + 97, + 55, + 98, + 90, + 60, + 79, + 57, + 31, + 50, + 20, +-24, + 43, + 20, +-31, + 52, + 29, +-21, + 39, + 21, +-29, + 75, + 41, +-14, + 61, + 35, +-19, + 54, + 31, +-25, + 41, + 23, +-34, + 27, + 9, +-45, + 40, + 39, + 6, + 20, +-24, +-71, + 63, + 34, + 1, + 76, + 63, + 49, + 99, + 99, + 98, +101, +101, +102, +101, +101, +102, +100, +100, +101, + 97, + 97, + 96, +100, +100, + 98, + 59, + 58, + 58, +-63, +-103, +-124, + 90, + 87, + 85, + 36, +-22, +-89, + 36, + 5, +-19, + 26, +-26, +-85, + 16, +-40, +-114, + 20, +-29, +-90, + 18, +-29, +-80, + 19, +-12, +-35, + 85, + 65, + 55, + 92, + 79, + 82, + 88, + 82, + 90, + 86, + 79, + 80, + 87, + 76, + 73, + 87, + 74, + 69, + 87, + 72, + 65, + 87, + 72, + 65, + 91, + 75, + 66, + 92, + 75, + 60, + 91, + 71, + 54, + 43, + 18, + 3, + 27, + 9, +-13, + 26, + 9, +-11, + 2, +-19, +-46, +-15, +-33, +-52, +-12, +-28, +-49, +-19, +-31, +-50, +-26, +-36, +-53, +-34, +-42, +-61, +-36, +-49, +-71, +-44, +-57, +-76, +-38, +-50, +-71, +-49, +-63, +-88, + 12, + 17, + 7, + 15, + 18, + 13, + 20, + 24, + 17, + 29, + 31, + 27, + 44, + 49, + 42, + 47, + 54, + 28, + 88, + 77, + 57, +-12, + 4, +-11, + -6, + 9, + -5, + -7, + 9, + -5, +-12, + 5, +-11, + -9, + 9, + -9, +-14, + 5, +-11, +-11, + 8, + -9, + -6, + 11, + -5, + 1, + 14, + 2, + 42, + 48, + 41, +-34, +-52, +-64, + -1, +-39, +-73, + 24, +-24, +-86, + 24, +-24, +-86, + 30, +-14, +-68, + 85, + 69, + 31, + 95, + 81, + 47, +112, +108, + 93, + 95, + 91, + 69, + 27, + 14, +-28, + 65, + 47, + -2, + 82, + 64, + 18, + 94, + 86, + 60, + 99, + 92, + 71, + 95, + 86, + 57, + 98, + 94, + 74, +107, +105, + 93, + 96, + 95, + 74, + 95, + 92, + 72, + 71, + 68, + 41, + 47, + 40, + -7, + 54, + 53, + 27, + 79, + 76, + 46, +102, + 98, + 63, +107, +103, + 79, +101, + 96, + 70, + 64, + 27, +-15, + 65, + 4, +-29, + 65, + 2, +-31, + 82, + 25, +-30, + 81, + 30, +-34, + 60, + 28, +-33, + 42, + 23, +-37, + 30, + 16, +-42, + 36, + 25, +-26, + 56, + 54, + 27, + 41, + -8, +-66, + 43, + 8, +-28, + 46, + 13, +-24, + 45, + 25, + -3, + 49, + 33, + 9, + 46, + 30, + 8, + 43, + 29, + 8, + 48, + 37, + 17, + 48, + 39, + 20, + 20, + 15, + 5, +-75, +-117, +-125, + 66, + 54, + 48, + 31, +-20, +-78, + 41, + 17, + 0, + 24, +-26, +-81, + 16, +-38, +-106, + 20, +-28, +-81, + 17, +-29, +-77, + 58, + 37, + 22, +101, + 84, + 68, +107, + 93, + 81, +107, + 93, + 79, +107, + 93, + 79, +106, + 90, + 75, +104, + 86, + 68, +102, + 82, + 62, +101, + 77, + 49, +102, + 77, + 47, +102, + 75, + 43, +100, + 67, + 24, + 36, + 11, +-24, +-37, +-47, +-69, +-23, +-42, +-72, +-26, +-48, +-78, +-30, +-52, +-86, +-26, +-47, +-74, +-37, +-58, +-88, +-34, +-55, +-89, +-33, +-51, +-78, +-50, +-64, +-94, +-45, +-63, +-97, +-42, +-63, +-90, +-60, +-74, +-103, + 10, + 11, + -2, + 19, + 20, + 7, + 24, + 27, + 16, + 31, + 33, + 27, + 34, + 38, + 38, + 18, + 34, + 6, + 35, + 46, + 18, +-36, +-24, +-46, +-63, +-38, +-51, +-64, +-39, +-52, +-62, +-38, +-50, +-61, +-36, +-48, +-59, +-34, +-47, +-59, +-34, +-46, +-60, +-35, +-46, +-51, +-28, +-38, + 27, + 39, + 35, +-46, +-48, +-49, +-19, +-49, +-73, + 20, +-28, +-89, + 20, +-27, +-90, + 59, + 31, +-16, + 83, + 61, + 11, +100, + 90, + 66, +105, + 95, + 73, + 81, + 75, + 56, +-28, +-42, +-105, + 29, + 15, +-24, + 78, + 56, + 3, + 83, + 69, + 31, +102, + 97, + 77, +107, +104, + 87, +103, + 99, + 77, +102, +101, + 89, + 55, + 54, + 36, + 96, + 91, + 68, + 99, + 94, + 67, + 50, + 49, + 32, + 73, + 68, + 42, +101, + 94, + 60, +112, +109, + 91, +110, +106, + 81, +104, + 99, + 74, + 81, + 60, + 40, + 47, +-13, +-44, + 82, + 29, +-20, + 73, + 22, +-10, + 76, + 28, +-10, + 82, + 47, + 13, + 77, + 58, + 28, + 55, + 45, + 16, + 55, + 48, + 16, + 68, + 64, + 37, + 48, + 2, +-49, + 43, + 5, +-44, + 45, + 7, +-41, + 41, + 11, +-36, + 46, + 19, +-21, + 44, + 19, +-21, + 43, + 20, +-21, + 47, + 25, +-14, + 46, + 25, +-13, + 19, + 3, +-28, +-84, +-123, +-126, + 38, + 15, + -6, + 29, +-13, +-51, + 38, + 21, + 11, + 24, +-25, +-77, + 15, +-32, +-88, + 16, +-20, +-54, + 16, +-24, +-65, + 33, + -2, +-29, + 79, + 48, + 20, + 89, + 64, + 45, +101, + 81, + 62, + 93, + 74, + 56, + 98, + 78, + 60, + 96, + 71, + 49, + 89, + 55, + 24, + 85, + 48, + 6, + 84, + 45, + 2, + 78, + 33, +-15, + 73, + 24, +-29, + 42, + 13, +-28, +-44, +-54, +-77, +-27, +-52, +-83, +-35, +-57, +-91, +-35, +-56, +-93, +-42, +-63, +-99, +-34, +-58, +-95, +-47, +-66, +-102, +-46, +-66, +-101, +-51, +-68, +-102, +-54, +-74, +-111, +-56, +-73, +-108, +-63, +-80, +-115, + 1, + 2, +-13, + 11, + 11, + -1, + 19, + 19, + 5, + 20, + 22, + 17, + 20, + 23, + 18, + 26, + 36, + 18, + 40, + 48, + 25, + 10, + 9, +-23, +-66, +-41, +-54, +-65, +-40, +-52, +-64, +-40, +-51, +-64, +-40, +-50, +-60, +-36, +-47, +-60, +-36, +-47, +-58, +-34, +-44, +-49, +-27, +-36, + 19, + 32, + 28, +-19, +-18, +-20, +-18, +-47, +-73, + 47, + 5, +-37, + 46, + 4, +-39, + 68, + 40, + -8, + 81, + 59, + 10, + 99, + 87, + 61, + 91, + 81, + 50, + 23, + 5, +-50, +-83, +-85, +-121, +-27, +-33, +-58, + 91, + 76, + 43, + 95, + 88, + 61, +102, + 97, + 74, + 96, + 91, + 69, +104, + 99, + 79, +102, + 98, + 78, + 98, + 93, + 73, +104, + 98, + 74, + 99, + 94, + 72, +107, +104, + 87, + 50, + 41, + 1, +103, + 93, + 52, +107, +102, + 70, +107, +102, + 79, +107, +104, + 83, + 60, + 62, + 38, + 69, + 72, + 51, + 86, + 90, + 72, + 63, + 72, + 48, + 81, + 86, + 66, + 97, + 98, + 82, + 85, + 88, + 71, + 51, + 59, + 32, + 52, + 57, + 30, + 49, + 45, + 6, + 64, + 54, + 17, + 54, + 23, +-19, + 57, + 25, +-18, + 53, + 33, + 3, + 64, + 49, + 30, + 63, + 52, + 33, + 64, + 54, + 35, + 67, + 58, + 41, + 65, + 57, + 44, + 33, + 28, + 20, +-89, +-123, +-126, + 43, + 25, + 10, + 23, +-19, +-56, + 45, + 31, + 26, + 19, +-30, +-93, + 14, +-34, +-94, + 18, +-17, +-51, + 14, +-24, +-63, +-12, +-56, +-86, + 35, +-10, +-37, + 54, + 8, +-22, + 33, + -8, +-35, + 22, +-13, +-35, + 18, + -9, +-29, + 10, +-21, +-43, + 23, + -8, +-34, + 25, +-10, +-40, + 29, + -8, +-47, + 21, +-17, +-58, + 17, +-25, +-68, +-10, +-40, +-64, +-44, +-50, +-73, +-55, +-67, +-102, +-43, +-66, +-100, +-45, +-65, +-104, +-53, +-69, +-106, +-48, +-70, +-109, +-49, +-70, +-110, +-58, +-73, +-113, +-58, +-75, +-114, +-59, +-78, +-115, +-63, +-80, +-118, +-17, +-21, +-29, +-17, +-15, +-30, +-12, +-11, +-26, + -2, + -1, +-16, + 8, + 10, + 1, + 15, + 17, + 10, + 22, + 30, + 20, + 32, + 40, + 19, + 34, + 24, +-15, + 7, + -3, +-35, +-69, +-46, +-56, +-68, +-46, +-55, +-69, +-46, +-55, +-67, +-44, +-54, +-63, +-41, +-50, +-60, +-37, +-47, +-55, +-32, +-42, + 8, + 24, + 19, + -9, +-12, +-17, + -5, +-50, +-78, + 16, +-25, +-58, + 17, +-25, +-58, + 27, +-11, +-50, + 72, + 45, +-15, + 89, + 77, + 52, + 93, + 88, + 66, + 3, +-10, +-44, +-61, +-63, +-91, + 64, + 46, + -4, + 75, + 54, + 5, + 80, + 65, + 32, + 97, + 92, + 73, +104, +102, + 87, + 89, + 79, + 50, + 92, + 84, + 55, + 97, + 88, + 59, + 98, + 94, + 75, +107, +104, + 88, +107, +104, + 89, + 30, + 22, + -7, + 93, + 83, + 46, +105, + 99, + 75, +108, +102, + 74, +100, + 96, + 74, + 40, + 9, +-32, + 41, + -6, +-62, + 92, + 81, + 54, + 66, + 58, + 30, + 44, + 47, + 14, + 56, + 57, + 19, + 61, + 58, + 18, + 76, + 70, + 36, + 73, + 68, + 35, + 76, + 72, + 44, + 70, + 61, + 30, + 52, + 20, +-27, + 62, + 28, +-14, + 61, + 42, + 17, + 71, + 59, + 43, + 69, + 57, + 41, + 66, + 53, + 38, + 67, + 55, + 39, + 58, + 46, + 30, + 27, + 18, + 3, +-92, +-124, +-126, + 23, +-11, +-46, + 20, +-30, +-86, + 51, + 33, + 24, + 13, +-42, +-128, + 13, +-40, +-112, + 16, +-31, +-92, + 9, +-36, +-87, +-28, +-72, +-106, + 23, +-21, +-66, + 4, +-43, +-91, + -7, +-60, +-99, +-20, +-59, +-84, + 1, +-40, +-66, + -1, +-40, +-78, + 4, +-26, +-50, + -7, +-18, +-39, + 6, + 1, +-22, + 1, + 0, +-21, + 2, + 1, +-23, + 0, + 2, +-23, + -3, + 1, +-21, + 2, + 4, +-16, + -2, + 0, +-21, +-12, +-10, +-31, +-28, +-28, +-50, +-35, +-35, +-58, +-47, +-48, +-75, +-52, +-57, +-86, +-62, +-70, +-102, +-63, +-74, +-110, + 37, + 40, + 36, + 34, + 32, + 14, +-30, +-31, +-53, +-35, +-32, +-49, +-32, +-28, +-40, +-32, +-26, +-32, +-27, +-20, +-24, + -5, + 1, + -5, + 9, + 15, + 9, + 30, + 30, + 4, + 44, + 39, + 14, + 17, + 26, + 11, + 20, + 29, + 14, + 20, + 29, + 16, + 14, + 25, + 14, + 4, + 16, + 5, +-12, + 2, + -8, +-51, +-31, +-40, + 2, + 18, + 12, + -8, +-12, +-16, + -5, +-51, +-79, + 12, +-30, +-63, + 10, +-29, +-64, + 34, + 2, +-41, + 59, + 28, +-28, + 73, + 54, + 15, + 91, + 85, + 66, + 36, + 20, +-15, + 23, + 10, +-33, + 40, + 20, +-41, + 68, + 48, + -3, + 74, + 55, + 16, + 78, + 66, + 40, + 82, + 75, + 56, + 77, + 64, + 37, + 83, + 68, + 31, + 87, + 78, + 43, + 95, + 88, + 65, +108, +105, + 84, + 99, + 95, + 77, + 50, + 47, + 33, + 79, + 67, + 33, + 95, + 87, + 55, +100, + 93, + 60, + 76, + 70, + 44, + 4, +-23, +-53, + 40, + 13, +-16, + 50, + 41, + 31, + 71, + 59, + 38, + 41, + 37, + -6, + 18, + 22, +-19, + 36, + 35, +-17, + 64, + 52, + 8, + 64, + 53, + 18, + 77, + 48, + 17, + 80, + 59, + 30, + 78, + 52, + 25, + 70, + 42, + 7, + 53, + 30, + 2, + 65, + 51, + 32, + 65, + 51, + 33, + 62, + 48, + 31, + 68, + 55, + 39, + 44, + 30, + 13, + 11, + 0, +-13, +-95, +-124, +-125, + 22, +-23, +-75, + 26, +-25, +-77, + 47, + 32, + 29, + 10, +-45, +-127, + 12, +-41, +-112, + 25, +-26, +-91, + 11, +-36, +-88, +-21, +-69, +-104, + 12, +-35, +-84, + 15, +-34, +-95, +-20, +-74, +-120, +-47, +-91, +-125, + -7, +-60, +-118, + 10, +-31, +-79, + 33, + 17, + 1, + 31, + 33, + 30, + 44, + 45, + 46, + 6, + 8, + 3, + -5, + -2, +-16, +-13, +-11, +-31, +-12, +-11, +-32, +-17, +-16, +-38, +-19, +-18, +-38, +-21, +-19, +-38, +-37, +-34, +-56, +-44, +-43, +-65, +-50, +-51, +-78, +-48, +-51, +-80, +-56, +-62, +-93, + -5, + -6, +-12, + 51, + 49, + 39, + -3, + -7, +-30, +-71, +-64, +-72, +-79, +-71, +-77, +-75, +-66, +-76, +-58, +-49, +-60, +-37, +-28, +-38, +-11, + -2, +-15, + 12, + 23, + 8, + 36, + 46, + 28, + 46, + 54, + 37, + 53, + 60, + 43, + 56, + 63, + 47, + 57, + 66, + 50, + 59, + 69, + 59, + 62, + 72, + 64, + 62, + 72, + 64, + 55, + 65, + 59, + 38, + 51, + 45, +-14, +-17, +-20, +-23, +-67, +-92, + -7, +-46, +-77, + -7, +-44, +-77, + 2, +-32, +-64, + 14, +-15, +-57, + 29, + 7, +-29, + 40, + 19, +-21, + 0, +-32, +-68, +-58, +-69, +-87, + 56, + 38, +-14, + 97, + 91, + 63, + 86, + 81, + 51, + 31, + 24, +-12, +-46, +-46, +-76, + 49, + 42, + 17, + 89, + 75, + 44, + 95, + 90, + 68, +103, +100, + 87, + 97, + 93, + 70, + 88, + 86, + 69, +-14, +-16, +-24, + 19, + 12, +-13, + 63, + 59, + 37, + 72, + 69, + 52, + -4, + -9, +-18, +-98, +-114, +-120, +-72, +-81, +-79, +-13, +-28, +-27, + 51, + 18, + -4, + 7, + 9, +-35, + 23, + 25, +-27, + 32, + 32, +-19, + 55, + 45, + -2, + 4, + 2, +-28, + 71, + 45, + 23, + 55, +-21, +-45, + 17, +-17, +-41, + 21, + -1, +-40, + 21, + 9, + -2, + 28, + 18, + 12, + 1, + -6, + -8, + 12, + 0, + -9, + -2, +-23, +-41, + 17, + -6, +-26, + 8, +-11, +-30, +-101, +-124, +-124, + 18, +-29, +-80, + 30, + -7, +-38, + 39, + 20, + 18, + 8, +-45, +-125, + 12, +-36, +-88, + 13, +-30, +-72, + 2, +-41, +-80, +-21, +-69, +-107, + -1, +-45, +-79, + 22, +-22, +-68, +-37, +-88, +-127, +-48, +-92, +-121, +-14, +-61, +-116, + 5, +-35, +-80, + 29, + 19, + 10, + 33, + 34, + 36, + 62, + 63, + 67, + 21, + 23, + 20, + 16, + 17, + 6, + 17, + 15, + -1, + 0, + 3, +-12, + 1, + 1, +-16, + -8, + -5, +-26, +-11, + -9, +-30, +-17, +-18, +-41, +-35, +-37, +-63, +-48, +-53, +-83, +-56, +-65, +-95, +-52, +-61, +-91, + 17, + 13, + 10, + 11, + 10, + -2, + -2, +-10, +-29, +-25, +-16, +-40, +-11, + -1, +-28, + 1, + 13, +-15, + 10, + 22, + -4, + 16, + 27, + 2, + 20, + 30, + 4, + 22, + 33, + 10, + 29, + 39, + 18, + 27, + 39, + 19, + 35, + 45, + 27, + 49, + 58, + 41, + 54, + 65, + 48, + 58, + 69, + 58, + 53, + 64, + 56, + 53, + 62, + 57, + 58, + 67, + 62, + 59, + 66, + 61, +-12, +-16, +-19, +-50, +-97, +-123, +-57, +-101, +-126, +-61, +-106, +-125, +-61, +-105, +-126, +-57, +-102, +-126, +-55, +-94, +-112, +-46, +-76, +-92, +-61, +-103, +-121, +-20, +-64, +-105, + 42, + 30, + -8, + 78, + 64, + 16, + 79, + 67, + 20, + 18, + 1, +-59, +-109, +-95, +-118, + -9, +-15, +-51, + 37, + 17, +-23, + 54, + 39, + 8, + 58, + 53, + 37, + 42, + 38, + 19, + 30, + 30, + 23, +-72, +-76, +-84, +-101, +-82, +-117, +-97, +-87, +-123, +-63, +-104, +-108, +-52, +-93, +-98, +-55, +-96, +-94, +-54, +-87, +-83, +-32, +-52, +-50, + -9, +-42, +-55, + 11, + 11, +-10, + 2, + 6, +-12, + 31, + 29, + 10, + 38, + 33, + 4, + 38, + 31, + -7, + 50, + 26, +-18, + 72, + 38, + -5, +-74, +-37, +-80, +-18, + -5, +-42, +-50, +-95, +-120, +-53, +-97, +-120, +-58, +-100, +-121, +-51, +-88, +-99, +-23, +-41, +-43, +-35, +-57, +-56, +-52, +-74, +-72, +-99, +-117, +-117, + 6, +-37, +-83, + 15, +-18, +-48, + 25, + -6, +-19, + 3, +-51, +-127, + 15, +-32, +-85, + 27, +-14, +-63, + -3, +-43, +-83, +-25, +-70, +-108, +-32, +-69, +-91, + 13, +-28, +-70, +-46, +-82, +-104, +-50, +-92, +-120, +-15, +-62, +-114, +-60, +-103, +-124, + 10, + 6, + -2, + 28, + 29, + 23, + 78, + 79, + 81, + 43, + 44, + 41, + 36, + 39, + 25, + 9, + 14, + 2, + 6, + 5, +-10, + 4, + 7, + -6, + 27, + 27, + 17, + 2, + 4, + -2, +-15, +-13, +-30, +-16, +-23, +-49, +-39, +-51, +-82, +-48, +-60, +-88, +-68, +-77, +-98, +-45, +-47, +-52, +-27, +-30, +-42, +-49, +-57, +-75, + -2, + 8, +-22, + 2, + 12, +-21, + 8, + 18, +-16, + 12, + 22, +-12, + 16, + 26, + -7, + 20, + 31, + -2, + 22, + 33, + 1, + 28, + 38, + 8, + 34, + 44, + 14, + 37, + 45, + 21, + 34, + 46, + 23, + 43, + 55, + 37, + 39, + 53, + 41, + 47, + 58, + 51, + 60, + 68, + 64, + 59, + 65, + 61, + 59, + 64, + 60, +-12, +-14, +-19, +-31, +-76, +-114, +-12, +-61, +-116, + -5, +-56, +-112, +-13, +-61, +-114, + -1, +-45, +-89, + 3, +-40, +-80, + 2, +-37, +-77, + -1, +-40, +-79, +-29, +-67, +-97, +-11, +-21, +-54, + 67, + 49, + -2, + 56, + 43, + 0, + 66, + 50, + 1, + 72, + 64, + 26, + 76, + 69, + 27, + 55, + 53, + 31, +-76, +-63, +-98, +-32, + -7, +-89, +-76, +-54, +-113, +-107, +-82, +-117, +-68, +-67, +-69, +-98, +-76, +-116, +-48, +-47, +-50, +-20, +-25, +-21, +-41, +-51, +-51, +-16, +-25, +-22, +-32, +-42, +-38, +-48, +-63, +-61, +-53, +-65, +-68, + 59, + 57, + 57, + 74, + 73, + 76, + 97, + 97, + 99, + 59, + 56, + 52, + 6, + -6, +-19, + 1, +-19, +-71, + 26, + -7, +-60, + -2, +-14, +-43, + 35, + 24, + 5, +106, +106, +106, +104, +105, +106, +103, +103, +104, +100, +100, +102, + 94, + 95, +100, + 85, + 87, + 93, + 71, + 74, + 83, +-60, +-61, +-60, + 75, + 77, + 86, + 68, + 72, + 80, + 63, + 67, + 76, + 59, + 60, + 71, + 53, + 56, + 64, + 40, + 43, + 52, + 19, + 12, + 17, +-18, +-56, +-81, + 17, + 7, + 5, + 19, + 4, + 3, + 16, + 1, + -6, +-22, +-43, +-56, +-10, +-48, +-79, + -2, +-40, +-76, +-10, +-41, +-82, + 9, + 5, + -7, + 67, + 69, + 69, + 57, + 59, + 57, + 45, + 47, + 43, + 47, + 46, + 37, + 19, + 19, + 9, + 17, + 21, + 12, + 24, + 21, + 8, + 39, + 39, + 30, + 1, + -6, +-26, +-47, +-64, +-97, +-36, +-55, +-89, +-52, +-64, +-92, +-54, +-70, +-99, +-63, +-70, +-94, +-69, +-81, +-114, +-90, +-103, +-122, + 6, + 16, +-17, + 12, + 22, +-11, + 15, + 25, + -9, + 19, + 28, + -8, + 25, + 33, + -2, + 26, + 35, + 0, + 27, + 37, + 3, + 28, + 37, + 5, + 28, + 37, + 4, + 30, + 39, + 11, + 28, + 38, + 13, + 16, + 29, + 10, + 43, + 52, + 42, + 51, + 60, + 52, + 57, + 63, + 57, + 56, + 61, + 57, + 50, + 55, + 51, +-19, +-19, +-23, + 21, + -7, +-39, + 53, + 19, +-20, + 44, + 2, +-32, + 41, + 7, +-27, + 46, + 21, + -7, + 57, + 27, + 6, + 60, + 35, + 11, + 35, + 7, +-16, +-20, +-45, +-72, +-31, +-53, +-95, + 5, + -5, +-36, + 59, + 49, + 18, + 57, + 51, + 19, + 60, + 52, + 23, + 36, + 35, + 21, + 2, + 4, + -3, +-99, +-86, +-114, +-36, +-15, +-78, +-26, + -2, +-86, +-38, +-28, +-48, + 32, + 31, + 32, + 46, + 45, + 46, + 48, + 47, + 47, + 53, + 51, + 52, + 57, + 55, + 56, + 58, + 57, + 57, + 62, + 61, + 61, + 58, + 57, + 58, + 68, + 67, + 67, + 70, + 66, + 59, + 91, + 90, + 84, +105, +104, + 99, + 49, + 46, + 36, +-11, +-23, +-28, +-65, +-92, +-120, +-62, +-83, +-117, +-11, +-42, +-84, + 63, + 38, + 19, + 91, + 90, + 95, + 86, + 85, + 91, + 93, + 92, + 98, + 96, + 95, +102, + 99, +100, +106, +100, +101, +109, + 99, +100, +108, +-28, +-28, +-28, + 95, +100, +110, + 87, + 92, +106, + 81, + 87, +102, + 82, + 87, +102, + 78, + 83, + 98, + 78, + 82, + 97, + 52, + 52, + 58, + -6, +-31, +-40, + 72, + 76, + 89, + 64, + 66, + 81, + 61, + 64, + 78, + 50, + 52, + 66, + 42, + 42, + 54, + 38, + 35, + 43, + 26, + 23, + 22, + 4, + 5, + 4, +-27, +-26, +-29, + 23, + 23, + 20, + 50, + 51, + 49, + 56, + 57, + 54, + 41, + 42, + 39, + 44, + 46, + 40, + 39, + 40, + 33, + 35, + 34, + 25, +-21, +-36, +-66, +-39, +-60, +-97, +-49, +-66, +-99, +-51, +-68, +-104, +-58, +-74, +-109, +-77, +-90, +-118, +-85, +-95, +-122, +-68, +-87, +-118, + 16, + 25, + -4, + 15, + 24, + -5, + 19, + 28, + -4, + 23, + 31, + -2, + 25, + 33, + -1, + 33, + 41, + 7, + 32, + 41, + 8, + 30, + 40, + 8, + 35, + 43, + 14, + 18, + 27, + 0, + 8, + 18, + -4, + 27, + 36, + 18, + 47, + 54, + 44, + 48, + 54, + 47, + 55, + 61, + 55, + 27, + 33, + 29, + 10, + 19, + 14, +-23, +-24, +-27, + 47, + 22, + 0, + 79, + 50, + 28, + 72, + 49, + 27, + 68, + 49, + 24, + 88, + 60, + 27, + 88, + 59, + 30, + 47, + 18, +-14, +-32, +-55, +-81, +-38, +-60, +-106, +-34, +-56, +-98, +-31, +-53, +-97, +-17, +-32, +-55, + -7, +-11, +-18, +-15, +-14, +-18, +-100, +-100, +-123, +-61, +-56, +-75, +-23, +-22, +-40, +-78, +-65, +-118, +-53, +-48, +-70, + 0, + 2, + -1, + 51, + 51, + 52, + 61, + 61, + 63, + 56, + 56, + 58, + 58, + 58, + 61, + 61, + 61, + 63, + 65, + 65, + 66, + 68, + 68, + 70, + 46, + 46, + 47, + 73, + 73, + 72, + 68, + 63, + 50, +107, +104, + 96, + 92, + 90, + 80, + 65, + 62, + 55, +-39, +-44, +-74, +-36, +-27, +-80, + 26, + 10, +-36, + 79, + 30, +-10, + 71, + 40, + 29, + 98, + 94, +101, + 92, + 90, + 98, + 95, + 93, +103, + 95, + 95, +103, + 90, + 89, + 98, + 97, + 96, +103, + 87, + 85, + 95, + 39, + 37, + 43, + 58, + 52, + 56, + 80, + 77, + 86, + 81, + 81, + 93, + 75, + 75, + 88, + 78, + 77, + 92, + 81, + 81, + 95, + 58, + 57, + 65, + 20, + 10, + 14, + 48, + 50, + 65, + 68, + 68, + 90, + 60, + 63, + 85, + 54, + 56, + 77, + 63, + 64, + 82, + 60, + 62, + 75, + 55, + 55, + 61, + 19, + 22, + 16, + -9, + -8, +-17, +-65, +-69, +-81, +-59, +-61, +-71, +-16, +-17, +-21, + 32, + 33, + 32, + 50, + 48, + 45, + 59, + 59, + 57, + 27, + 26, + 17, +-28, +-45, +-77, +-49, +-61, +-93, +-51, +-65, +-99, +-56, +-70, +-104, +-36, +-42, +-63, + 6, + 5, + -9, + 20, + 21, + 4, + 11, + 11, + -5, + 31, + 40, + 20, + 32, + 40, + 17, + 33, + 40, + 14, + 39, + 46, + 20, + 39, + 46, + 18, + 36, + 44, + 16, + 36, + 44, + 17, + 23, + 32, + 6, + 5, + 13, +-11, + 14, + 22, + -2, + 20, + 27, + 4, + 30, + 35, + 17, + 41, + 47, + 34, + 38, + 44, + 37, + 5, + 12, + 7, + 34, + 40, + 36, + 30, + 39, + 33, +-18, +-21, +-24, + 59, + 43, + 31, + 79, + 70, + 57, + 75, + 70, + 59, + 93, + 85, + 75, + 99, + 83, + 68, + 47, + 33, + 18, +-34, +-57, +-84, +-43, +-65, +-111, +-41, +-63, +-111, +-40, +-63, +-105, +-37, +-59, +-106, +-40, +-62, +-110, + 28, + 25, + 23, +-78, +-79, +-116, +-73, +-63, +-118, +-44, +-41, +-68, +-27, +-30, +-45, +-51, +-46, +-78, +-40, +-47, +-58, +-53, +-59, +-53, +-49, +-55, +-49, +-38, +-46, +-39, +-44, +-50, +-46, +-39, +-47, +-42, +-35, +-43, +-38, +-35, +-42, +-38, +-32, +-39, +-37, +-40, +-47, +-47, + -2, + -8, +-10, + 88, + 82, + 68, +107, +103, + 91, + 85, + 80, + 65, + 49, + 43, + 34, + -8, +-35, +-62, + 19, + -1, +-34, + 30, + 14, +-18, + 47, + 16, +-21, + 65, + 50, + 40, +109, +108, +109, +109, +109, +110, +102, +101, +102, +103, +102, +103, +104, +103, +105, +104, +104, +105, + 99, + 98, +101, + 93, + 91, + 97, + 87, + 86, + 92, + 79, + 77, + 85, + 80, + 80, + 91, + 77, + 76, + 86, + 79, + 78, + 86, + 79, + 78, + 83, + 82, + 81, + 87, + 89, + 87, + 93, + 79, + 78, + 84, + 70, + 65, + 68, + 64, + 53, + 51, + 72, + 68, + 73, + 78, + 74, + 74, + 76, + 71, + 74, + 83, + 79, + 78, + 2, + 3, + -8, + 24, + 27, + 15, + 9, + 10, + 4, +-19, +-18, +-27, +-45, +-44, +-53, +-79, +-78, +-88, +-57, +-59, +-66, +-14, +-14, +-15, + 9, + 8, + 2, +-40, +-56, +-89, + -9, +-12, +-32, + 20, + 20, + 3, + 42, + 43, + 22, + 55, + 57, + 37, + 60, + 59, + 42, + 62, + 61, + 41, + 63, + 62, + 42, + 46, + 55, + 40, + 48, + 56, + 42, + 44, + 53, + 35, + 43, + 52, + 33, + 43, + 52, + 31, + 37, + 46, + 24, + 15, + 26, + 4, + 17, + 24, + 2, + 19, + 26, + 1, + 14, + 20, + -2, + 25, + 30, + 8, + 29, + 33, + 18, + 18, + 25, + 13, + 8, + 17, + 11, + 48, + 53, + 48, + 54, + 59, + 55, + 27, + 36, + 31, + 10, + 14, + 8, + 50, + 43, + 36, + 88, + 84, + 77, + 90, + 82, + 73, + 92, + 81, + 68, + 38, + 27, + 22, +-41, +-65, +-94, +-46, +-69, +-110, +-44, +-67, +-108, +-44, +-67, +-108, +-42, +-65, +-106, +-43, +-65, +-111, +-48, +-71, +-119, +-42, +-48, +-55, +-86, +-88, +-105, +-59, +-59, +-63, +-28, +-24, +-37, +-18, +-19, +-35, +-29, +-35, +-58, +-89, +-94, +-107, +-100, +-108, +-112, +-86, +-98, +-102, +-78, +-90, +-95, +-75, +-90, +-95, +-72, +-87, +-92, +-68, +-83, +-88, +-67, +-79, +-85, +-67, +-79, +-84, +-62, +-73, +-79, + -8, +-16, +-27, + 83, + 74, + 57, +102, + 97, + 84, + 74, + 65, + 51, + 40, + 31, + 19, + 26, + -8, +-39, + 46, + 7, +-29, + 41, + 0, +-39, + 52, + 12, +-33, + 80, + 58, + 41, +110, +106, +104, +104, +102, + 99, +101, + 98, + 97, + 99, + 97, + 95, +103, +102, +102, +106, +103, +103, +103, +102, +102, + 99, + 98, + 98, + 98, + 96, + 99, + 91, + 90, + 96, + 90, + 89, + 97, + 85, + 83, + 91, + 84, + 82, + 87, + 90, + 88, + 92, + 90, + 86, + 85, + 90, + 87, + 90, + 92, + 89, + 90, + 86, + 82, + 83, + 87, + 82, + 80, + 86, + 80, + 74, + 92, + 81, + 72, + 93, + 81, + 73, +102, + 96, + 94, + 16, + 18, + 9, + 14, + 16, + 1, + 7, + 9, + -2, + 7, + 10, + 2, + 32, + 34, + 30, + 11, + 15, + 11, +-21, +-20, +-27, +-54, +-53, +-66, +-30, +-30, +-40, + 45, + 47, + 31, + 53, + 55, + 40, + 46, + 49, + 28, + 44, + 47, + 25, + 58, + 55, + 36, + 73, + 63, + 40, + 69, + 60, + 36, + 70, + 61, + 38, + 47, + 60, + 48, + 50, + 62, + 53, + 50, + 62, + 53, + 42, + 55, + 43, + 21, + 35, + 20, + 13, + 25, + 8, + 16, + 25, + 8, + 20, + 27, + 6, + 28, + 34, + 11, + 14, + 19, + -3, + 29, + 32, + 12, + -3, + 4, + -9, + 15, + 22, + 15, + 49, + 55, + 48, + 49, + 54, + 49, + 33, + 41, + 36, + 38, + 45, + 41, + 42, + 48, + 41, + 57, + 44, + 28, + 99, + 80, + 59, + 97, + 82, + 66, + 37, + 21, + 8, +-41, +-67, +-91, +-43, +-66, +-106, +-43, +-66, +-106, +-47, +-69, +-110, +-47, +-70, +-111, +-47, +-70, +-112, +-51, +-75, +-118, +-53, +-78, +-121, +-76, +-92, +-113, +-116, +-121, +-123, +-120, +-121, +-124, +-114, +-119, +-124, +-61, +-64, +-58, +-110, +-118, +-125, +-111, +-119, +-125, +-106, +-114, +-124, +-90, +-104, +-121, +-82, +-97, +-112, +-75, +-92, +-109, +-70, +-86, +-104, +-67, +-81, +-98, +-65, +-78, +-91, +-60, +-73, +-86, +-47, +-61, +-73, + -1, +-14, +-32, + 55, + 44, + 26, + 82, + 74, + 58, + 51, + 39, + 22, + 39, + 28, + 16, + 89, + 83, + 76, +112, +108, +102, + 28, + -6, +-25, + 24, +-18, +-55, + 70, + 48, + 32, +112, +109, +110, +104, +103, +104, +107, +105, +105, +112, +111, +111, +105, +104, +105, +103, + 98, +101, +105, +103, +103, +102, +101, +100, + 96, + 95, + 94, + 96, + 93, + 92, + 90, + 84, + 83, + 92, + 87, + 86, + 95, + 92, + 89, + 90, + 82, + 76, + 91, + 84, + 78, + 95, + 90, + 89, + 96, + 94, + 94, + 95, + 92, + 97, + 93, + 91, + 95, + 98, + 94, + 98, + 94, + 88, + 92, + 96, + 93, + 95, + 98, + 87, + 84, + 9, + 11, + 1, + 1, + 2, +-14, + 1, + 3, + -9, + -3, + -1, +-14, + 38, + 39, + 36, + 46, + 47, + 45, + 32, + 34, + 30, + 16, + 19, + 11, + 56, + 58, + 44, + 47, + 49, + 34, + 37, + 40, + 20, + 45, + 47, + 26, + 40, + 44, + 25, + 53, + 50, + 31, + 59, + 45, + 17, + 52, + 46, + 23, + 52, + 39, + 9, + 55, + 22, +-13, + 40, + 36, + 23, + 39, + 50, + 42, + 38, + 49, + 42, + 34, + 47, + 37, + 23, + 33, + 17, + 19, + 27, + 9, + 26, + 30, + 14, + 26, + 31, + 11, + 14, + 20, + -2, +-15, + -7, +-23, + 23, + 30, + 20, + 46, + 52, + 45, + 46, + 53, + 48, + 26, + 36, + 29, + 42, + 48, + 42, + 46, + 51, + 46, + 40, + 45, + 39, + 62, + 53, + 41, + 94, + 75, + 53, + 59, + 41, + 23, +-24, +-61, +-97, +-70, +-89, +-112, +-69, +-87, +-112, +-75, +-91, +-114, +-75, +-92, +-115, +-79, +-96, +-117, +-82, +-98, +-119, +-90, +-105, +-121, +-91, +-106, +-122, +-98, +-111, +-122, +-109, +-119, +-124, +-108, +-118, +-123, +-106, +-116, +-124, +-97, +-104, +-110, +-104, +-115, +-123, +-100, +-113, +-122, +-98, +-110, +-121, +-92, +-107, +-119, +-88, +-104, +-117, +-85, +-99, +-114, +-83, +-98, +-113, +-79, +-92, +-109, +-74, +-87, +-102, +-71, +-83, +-95, +-64, +-76, +-87, +-41, +-53, +-64, +-25, +-35, +-46, +-10, +-19, +-31, + 8, +-29, +-47, +-14, +-35, +-48, +100, +100, + 99, +116, +113, +110, + 1, +-41, +-70, + 21, + -5, +-22, + 65, + 50, + 39, +111, +108, +106, +105, +101, + 96, +109, +108, +107, +110, +107, +105, +109, +107, +106, +106, +104, +102, +106, +104, +102, +102, +100, + 99, + 97, + 94, + 90, + 92, + 87, + 84, + 92, + 88, + 86, + 99, + 98, +100, + 99, + 98, +102, + 92, + 88, + 88, + 92, + 89, + 87, + 90, + 86, + 82, + 94, + 92, + 90, + 98, + 95, + 96, + 93, + 89, + 90, + 99, + 94, + 96, +100, + 93, + 94, + 98, + 92, + 92, + 78, + 75, + 75, +-24, +-40, +-64, + -2, + -5, +-21, + 8, + 10, + -5, +-16, +-18, +-40, + 16, + 18, + 12, + 40, + 41, + 39, + 41, + 42, + 38, + 37, + 40, + 25, + 53, + 56, + 38, + 50, + 52, + 36, + 20, + 22, + 1, + 3, + 5, +-21, + 14, + 2, +-27, + 15, + 6, +-23, + 35, + 16, +-20, + 27, + 12, +-22, + 37, + 14, +-24, + 26, + -6, +-40, + 49, + 15, +-26, + 51, + 15, +-26, + 56, + 29, + -3, + 40, + 23, + -1, + 19, + 11, +-11, + 21, + 24, + 3, + 28, + 32, + 15, + -3, + 5, +-10, +-11, + 0, +-12, + 32, + 38, + 24, + 44, + 49, + 39, + 43, + 49, + 44, + 26, + 36, + 29, + 43, + 47, + 41, + 45, + 49, + 44, + 43, + 48, + 43, + 40, + 45, + 39, + 63, + 61, + 53, + 89, + 85, + 80, + 31, + 5, +-12, + 6, +-37, +-80, +-92, +-107, +-121, +-91, +-106, +-120, +-93, +-107, +-120, +-92, +-108, +-121, +-98, +-113, +-122, +-100, +-115, +-124, +-101, +-116, +-123, +-102, +-116, +-124, +-101, +-115, +-123, +-101, +-114, +-122, +-101, +-112, +-121, +-93, +-107, +-117, +-90, +-104, +-114, +-92, +-106, +-116, +-92, +-106, +-116, +-90, +-104, +-114, +-91, +-105, +-115, +-89, +-102, +-112, +-92, +-103, +-113, +-96, +-108, +-118, +-96, +-108, +-118, +-92, +-104, +-111, +-87, +-96, +-102, +-90, +-98, +-105, +-93, +-103, +-108, +-86, +-98, +-104, +-84, +-98, +-105, + 44, + -1, +-68, +-18, +-55, +-77, +115, +114, +114, +110, +110, +110, + 6, +-32, +-52, + 12, +-21, +-47, + 80, + 72, + 65, +110, +105, +103, +111, +110, +107, +105, +101, + 96, +105, +103, + 97, +103, +101, + 98, +100, + 95, + 90, +108, +106, +105, +103, + 99, + 98, +103, +100, +101, + 99, + 97, +101, + 90, + 89, + 94, + 88, + 87, + 91, + 88, + 86, + 90, + 85, + 84, + 89, + 85, + 81, + 86, + 97, + 95, +100, + 96, + 90, + 90, + 95, + 90, + 88, +100, + 96, + 95, + 96, + 88, + 82, +100, + 94, + 88, +103, + 96, + 91, + 67, + 59, + 54, +-38, +-59, +-96, +-35, +-58, +-94, +-22, +-34, +-54, +-26, +-30, +-53, + 10, + 12, + -2, + 22, + 24, + 17, + 32, + 35, + 24, + 55, + 58, + 42, + 44, + 46, + 29, + 19, + 20, + -1, +-13, +-18, +-49, +-16, +-22, +-57, +-17, +-29, +-65, +-11, +-29, +-61, + 14, +-12, +-49, + 25, + -2, +-44, + 13, +-13, +-53, + 38, + -7, +-54, + 30, +-19, +-65, + 16, +-30, +-72, + 8, +-32, +-72, + 21, + -9, +-42, + 69, + 41, + 1, + 69, + 34, + -8, + 20, + 1, +-36, + 5, + 18, + 6, + 37, + 44, + 30, + 43, + 48, + 38, + 39, + 45, + 40, + 28, + 37, + 31, + 43, + 48, + 42, + 45, + 48, + 43, + 45, + 48, + 43, + 43, + 48, + 42, + 40, + 45, + 39, + 62, + 52, + 34, + 88, + 66, + 44, + 25, + -3, +-27, +-38, +-81, +-119, +-104, +-120, +-125, +-104, +-119, +-125, +-107, +-122, +-125, +-104, +-120, +-125, +-107, +-122, +-125, +-109, +-123, +-125, +-111, +-124, +-125, +-114, +-124, +-124, +-114, +-125, +-124, +-114, +-124, +-124, +-114, +-124, +-125, +-105, +-120, +-125, +-104, +-120, +-125, +-104, +-121, +-125, +-101, +-118, +-124, +-98, +-115, +-122, +-97, +-114, +-121, +-92, +-109, +-119, +-101, +-116, +-122, +-103, +-119, +-124, +-103, +-119, +-124, +-102, +-119, +-124, +-103, +-119, +-123, +-101, +-116, +-122, +-103, +-118, +-123, +-96, +-114, +-122, +-90, +-112, +-121, + 33, +-36, +-97, +-22, +-68, +-108, +114, +111, +108, +112, +106, + 98, + 70, + 53, + 39, + 9, +-33, +-66, + 84, + 71, + 58, +102, + 92, + 81, +107, +102, + 95, +109, +107, +105, +104, + 93, + 88, +103, + 93, + 87, +100, + 95, + 90, + 97, + 87, + 77, + 96, + 88, + 80, + 97, + 91, + 83, + 96, + 86, + 77, + 98, + 90, + 83, + 88, + 79, + 74, + 96, + 94, + 93, + 93, + 89, + 89, + 98, + 92, + 87, + 94, + 81, + 72, + 94, + 83, + 72, + 92, + 81, + 69, + 96, + 83, + 70, + 97, + 83, + 73, +100, + 95, + 90, + 99, + 87, + 79, + 69, + 55, + 44, +-55, +-80, +-115, +-43, +-67, +-109, +-41, +-63, +-102, +-39, +-61, +-101, +-24, +-39, +-61, + 24, + 26, + 9, + 10, + 16, + 1, + 16, + 19, + 5, + 29, + 29, + 14, + 29, + 23, + 3, +-25, +-31, +-63, +-39, +-47, +-79, +-48, +-54, +-81, +-31, +-50, +-85, +-19, +-52, +-89, +-30, +-53, +-85, +-12, +-43, +-80, + 48, + 3, +-45, + 45, + 0, +-47, + 43, + -2, +-50, + 50, + 4, +-43, + 37, + -9, +-56, + -7, +-50, +-88, + 61, + 32, + 0, + 98, + 72, + 32, + 45, + 38, + 15, + 42, + 48, + 39, + 30, + 38, + 32, + 29, + 38, + 32, + 46, + 51, + 46, + 46, + 51, + 45, + 45, + 49, + 43, + 44, + 49, + 43, + 42, + 47, + 42, + 39, + 44, + 38, + 59, + 55, + 46, + 87, + 71, + 56, + 65, + 48, + 39, +-60, +-98, +-115, +-71, +-96, +-113, +-60, +-73, +-80, + 16, + 8, + 0, + 41, + 30, + 22, + 60, + 53, + 49, + 27, + 24, + 21, +-123, +-126, +-126, + 61, + 50, + 40, + 58, + 42, + 19, + 63, + 56, + 43, + -2, +-34, +-65, +-48, +-61, +-71, +-65, +-92, +-126, +-60, +-89, +-126, +-60, +-91, +-125, +-27, +-50, +-85, +-41, +-78, +-117, +-62, +-94, +-126, +-69, +-83, +-110, +-73, +-85, +-105, +-86, +-89, +-102, +-84, +-89, +-101, + 3, + -2, + -9, + 53, + 48, + 44, + 55, + 47, + 36, + 57, + 47, + 34, +-25, +-36, +-42, +-19, +-59, +-90, +-20, +-50, +-72, +109, + 97, + 80, +101, + 82, + 63, + 96, + 71, + 48, + 4, +-38, +-71, + 88, + 79, + 72, + 99, + 92, + 84, + 82, + 72, + 66, + 81, + 76, + 72, + 85, + 78, + 76, + 93, + 81, + 80, + 79, + 71, + 69, + 77, + 67, + 64, + 91, + 86, + 82, + 94, + 85, + 79, + 96, + 89, + 82, + 94, + 81, + 66, + 92, + 74, + 56, + 88, + 69, + 51, + 89, + 72, + 55, + 92, + 78, + 61, + 91, + 65, + 46, + 93, + 78, + 64, + 93, + 85, + 78, + 97, + 89, + 84, + 95, + 87, + 85, + 89, + 76, + 72, + 81, + 76, + 72, + 59, + 47, + 43, +-52, +-77, +-110, +-51, +-76, +-114, +-47, +-72, +-115, +-48, +-76, +-115, +-47, +-71, +-110, + 30, + 27, + 12, + 28, + 24, + 2, + 33, + 18, + -9, + 21, + 6, +-19, + 37, + 15, +-24, + 10, +-16, +-53, +-17, +-40, +-79, +-50, +-62, +-93, +-59, +-70, +-96, +-40, +-64, +-103, +-56, +-79, +-114, +-57, +-79, +-108, + 33, +-17, +-62, + 39, + -9, +-56, + 41, + -6, +-52, + 47, + 2, +-46, + 45, + 2, +-49, + 39, + -8, +-56, + 15, +-31, +-75, +101, + 80, + 52, + 74, + 47, + 13, + 19, + 30, + 22, + 21, + 33, + 25, + 44, + 50, + 45, + 51, + 56, + 52, + 46, + 51, + 47, + 44, + 49, + 43, + 43, + 48, + 42, + 43, + 48, + 44, + 40, + 45, + 41, + 54, + 50, + 41, + 74, + 49, + 24, + 80, + 61, + 44, + 29, + 11, + -4, +-43, +-93, +-119, +-16, +-31, +-36, + 86, + 74, + 60, + 75, + 55, + 34, + 69, + 45, + 21, + 35, + 13, +-12, +-123, +-125, +-125, + 99, + 88, + 72, + 95, + 80, + 62, +103, + 97, + 92, +-14, +-42, +-71, +-69, +-102, +-125, +-57, +-90, +-126, +-60, +-91, +-126, +-63, +-97, +-126, +-42, +-65, +-93, +-39, +-71, +-103, +-65, +-98, +-126, +-72, +-90, +-123, +-61, +-78, +-103, +-66, +-74, +-87, +-45, +-53, +-65, + 54, + 50, + 42, + 91, + 71, + 55, + 88, + 61, + 35, + 88, + 63, + 40, + 5, +-23, +-39, +-11, +-68, +-103, +-41, +-81, +-103, + 79, + 72, + 67, + 78, + 65, + 50, + 94, + 73, + 54, + 7, +-37, +-77, + 88, + 69, + 46, + 90, + 73, + 56, + 88, + 69, + 51, + 89, + 74, + 60, + 93, + 77, + 60, + 89, + 72, + 59, + 92, + 81, + 65, + 87, + 75, + 65, + 85, + 65, + 43, + 75, + 59, + 45, + 81, + 62, + 39, + 81, + 68, + 52, + 81, + 65, + 47, + 77, + 64, + 54, + 75, + 73, + 71, + 76, + 71, + 66, + 75, + 62, + 50, + 85, + 78, + 67, + 85, + 64, + 42, + 84, + 64, + 41, + 90, + 75, + 60, + 97, + 79, + 62, + 88, + 73, + 60, + 50, + 36, + 22, +-51, +-77, +-113, +-55, +-81, +-113, +-53, +-76, +-112, +-58, +-86, +-116, +-62, +-90, +-120, + 34, + 31, + 16, + 40, + 28, + 5, + 48, + 38, + 11, + 30, + 29, + 11, + 36, + 24, + 1, + 23, + 11, +-14, + 9, +-11, +-44, +-27, +-41, +-68, +-73, +-83, +-109, +-21, +-42, +-83, +-35, +-49, +-85, +-28, +-51, +-86, + 12, +-14, +-41, + 11, +-25, +-55, + 0, +-44, +-82, + 37, +-12, +-58, + 43, + -3, +-51, + 46, + 0, +-49, + 39, + -9, +-56, + 67, + 32, + -3, + 95, + 67, + 35, + 18, + 22, + 11, + 31, + 40, + 34, + 46, + 52, + 48, + 53, + 57, + 55, + 48, + 53, + 49, + 43, + 48, + 43, + 42, + 47, + 41, + 43, + 48, + 44, + 44, + 48, + 47, + 50, + 51, + 44, + 77, + 54, + 33, + 82, + 60, + 41, + 61, + 39, + 16, +-33, +-83, +-109, + -2, +-24, +-35, + 92, + 79, + 64, + 92, + 82, + 72, + 91, + 80, + 65, + 56, + 47, + 37, +-122, +-124, +-124, + 25, + 16, + 6, + 42, + 20, + 2, + 37, + 17, + -4, +-44, +-55, +-64, +-42, +-48, +-57, +-37, +-43, +-55, +-37, +-43, +-60, +-39, +-48, +-64, +-26, +-36, +-57, +-27, +-40, +-62, +-38, +-48, +-63, +-32, +-38, +-50, +-19, +-22, +-23, + 4, + 3, + 5, + 24, + 22, + 21, + 37, + 26, + 23, +101, + 90, + 81, + 93, + 82, + 73, + 90, + 85, + 81, + -4, +-22, +-26, +-17, +-73, +-102, +-54, +-92, +-113, + 58, + 36, + 17, + 29, + 7, +-17, + 27, + 4, +-21, + 24, + -9, +-49, + 45, + 14, +-15, + 69, + 44, + 18, + 74, + 55, + 35, + 73, + 48, + 21, + 65, + 46, + 23, + 72, + 43, + 13, + 73, + 50, + 27, + 68, + 47, + 21, + 81, + 66, + 50, + 74, + 57, + 40, + 76, + 64, + 51, + 68, + 55, + 45, + 55, + 49, + 42, + 50, + 48, + 40, + 55, + 46, + 33, + 53, + 43, + 31, + 52, + 42, + 35, + 48, + 42, + 36, + 51, + 44, + 30, + 65, + 54, + 40, + 72, + 54, + 35, + 80, + 66, + 52, + 83, + 63, + 41, + 15, + -5, +-22, +-56, +-78, +-111, +-59, +-82, +-111, +-60, +-80, +-112, +-59, +-85, +-117, +-64, +-91, +-123, + 45, + 41, + 25, + 21, + 19, + -1, + 43, + 33, + 13, + 45, + 39, + 20, + 43, + 36, + 17, + 35, + 27, + 4, + 30, + 16, +-11, + 10, + -9, +-40, +-64, +-67, +-84, +-21, +-28, +-59, +-10, +-21, +-47, + -1, +-18, +-51, +-43, +-37, +-67, + 40, + 19, + -7, + 38, + 15, +-11, + 4, +-19, +-46, + 30, +-12, +-55, + 51, + 6, +-42, + 48, + 4, +-45, + 38, + -6, +-50, +103, + 75, + 41, + 25, + 14, + -7, + 33, + 42, + 37, + 47, + 53, + 48, + 54, + 58, + 56, + 48, + 53, + 50, + 42, + 47, + 41, + 41, + 46, + 41, + 42, + 47, + 43, + 43, + 47, + 46, + 47, + 39, + 30, + 63, + 39, + 19, + 73, + 52, + 32, + 75, + 51, + 25, +-22, +-70, +-100, + -4, +-40, +-60, + 81, + 58, + 35, + 79, + 57, + 33, + 84, + 62, + 39, + 68, + 48, + 27, +-102, +-118, +-124, +-74, +-100, +-125, +-70, +-98, +-124, +-73, +-101, +-123, + 8, + 6, + -3, + 26, + 23, + 13, + 22, + 18, + 8, + 18, + 14, + 3, + 9, + 6, + -5, + 0, + -3, +-13, +-18, +-21, +-31, +-18, +-21, +-33, + 1, + 0, + -5, + 34, + 33, + 32, + 64, + 64, + 63, + 81, + 78, + 77, +-30, +-40, +-41, +-28, +-32, +-37, +-34, +-42, +-53, +-75, +-83, +-108, +-51, +-86, +-109, +-18, +-68, +-94, +-68, +-90, +-100, + 64, + 45, + 25, + 58, + 27, + -2, + 54, + 17, +-19, + 11, +-32, +-66, + 20, +-22, +-61, + 62, + 21, +-23, + 60, + 14, +-29, + 75, + 41, + 3, + 76, + 41, + 2, + 74, + 42, + 0, + 75, + 41, + 2, + 78, + 50, + 18, + 63, + 26, + -6, + 73, + 39, + -1, + 70, + 36, + -5, + 67, + 35, + -2, + 65, + 36, + 3, + 68, + 50, + 34, + 58, + 39, + 17, + 51, + 43, + 29, + 49, + 40, + 28, + 62, + 43, + 28, + 70, + 46, + 19, + 63, + 38, + 14, + 63, + 34, + 5, + 61, + 32, + 2, + 59, + 25, + -4, +-29, +-51, +-71, +-58, +-76, +-107, +-73, +-92, +-115, +-58, +-79, +-110, +-64, +-89, +-120, +-64, +-93, +-122, + 31, + 26, + 13, + 29, + 19, + -7, + 40, + 28, + 6, + 34, + 32, + 16, + 46, + 34, + 12, + 41, + 38, + 20, + 38, + 26, + 3, + 21, + 17, + -5, +-36, +-42, +-57, + -5, +-18, +-49, + 2, + -2, +-28, + 10, + -3, +-32, +-46, +-34, +-77, +-47, +-36, +-69, + 28, + 14, +-11, + 39, + 19, + -6, + 8, +-27, +-63, + 46, + 1, +-48, + 47, + 2, +-48, + 42, + -3, +-51, + 93, + 68, + 36, + 29, + 11, +-13, + 34, + 42, + 37, + 40, + 46, + 42, + 53, + 57, + 55, + 46, + 51, + 47, + 39, + 44, + 39, + 41, + 47, + 42, + 42, + 46, + 44, + 13, + 9, + 5, + 3, +-10, +-36, + 22, + -9, +-34, + 40, + 8, +-10, + 58, + 41, + 30, +-55, +-76, +-85, +-16, +-28, +-37, + 77, + 55, + 31, + 74, + 51, + 26, + 72, + 41, + 4, + 63, + 32, + -4, +-110, +-123, +-124, + -2, +-22, +-44, +-81, +-107, +-127, +-71, +-95, +-111, + 4, + 1, + -2, + 33, + 30, + 23, + 30, + 28, + 19, + 24, + 22, + 15, + 12, + 10, + 3, + 0, + 0, + -8, +-18, +-19, +-26, +-17, +-20, +-27, + 14, + 14, + 15, + 45, + 43, + 46, + 67, + 64, + 67, + 58, + 55, + 54, +-23, +-24, +-21, +-76, +-83, +-95, +-64, +-79, +-108, + -2, +-37, +-66, +-22, +-47, +-68, +-12, +-44, +-64, +-67, +-97, +-108, + 55, + 9, +-37, + 39, +-11, +-62, + 34, +-16, +-65, + 36, +-14, +-67, + 66, + 21, +-27, + 76, + 37, + -8, + 76, + 35, + -4, + 62, + 26, + -5, + 67, + 36, + 2, + 65, + 28, + -4, + 76, + 47, + 20, + 62, + 41, + 17, + 68, + 44, + 18, + 71, + 46, + 22, + 77, + 49, + 14, + 73, + 46, + 13, + 68, + 34, + -8, + 61, + 23, +-18, + 52, + 16, +-16, + 63, + 37, + 9, + 62, + 38, + 10, + 61, + 34, + 4, + 54, + 20, +-10, + 58, + 24, +-11, + 45, + 19, +-10, + 41, + 16, + -5, + 31, + 14, + 2, + 1, +-15, +-24, +-53, +-67, +-78, +-71, +-86, +-110, +-78, +-96, +-121, +-66, +-91, +-118, +-67, +-91, +-119, + -5, +-13, +-30, + -3, +-13, +-40, + 16, + 8, +-14, + 27, + 18, + -7, + 25, + 18, + -5, + 28, + 22, + -1, + 35, + 25, + 1, + 35, + 30, + 13, +-42, +-40, +-51, + -1, +-19, +-50, + 8, + 2, +-21, + 18, + 4, +-23, +-30, +-24, +-66, +-31, +-24, +-65, +-49, +-36, +-76, +-53, +-40, +-74, +-31, +-53, +-83, + 42, + -4, +-53, + 47, + 2, +-47, + 42, + -4, +-53, + 73, + 44, + 13, + 51, + 28, + -4, + 35, + 42, + 37, + 30, + 37, + 32, + 51, + 54, + 54, + 42, + 49, + 45, + 38, + 47, + 42, + 40, + 47, + 43, + 14, + 17, + 10, + 9, +-17, +-40, + 22, +-19, +-43, + 24, +-13, +-39, + 14, + -1, +-31, + 22, + -8, +-37, +-34, +-50, +-70, + -5, +-29, +-45, + 78, + 50, + 16, + 74, + 46, + 16, + 65, + 27, + -9, + 60, + 20, +-20, +-102, +-123, +-124, + 15, + -4, +-36, +-88, +-111, +-126, +-73, +-95, +-120, + 28, + 28, + 36, + 19, + 19, + 30, + 20, + 20, + 29, + 17, + 17, + 26, + 15, + 15, + 23, + 2, + 2, + 11, +-19, +-17, + -9, +-42, +-41, +-34, +-23, +-22, +-14, + 16, + 17, + 25, + 39, + 40, + 46, + 49, + 49, + 54, +-29, +-30, +-24, +-79, +-87, +-109, + 4, +-31, +-69, + 59, + 18, +-24, +-27, +-61, +-93, +-23, +-55, +-81, +-67, +-97, +-111, + 77, + 37, +-13, + 58, + 11, +-35, + 49, + 1, +-54, + 46, + -5, +-66, + 53, + 8, +-48, + 65, + 26, +-20, + 62, + 23, +-18, + 57, + 26, +-15, + 56, + 23, +-15, + 66, + 23, +-11, + 70, + 27, + -5, + 48, + 28, + -3, + 61, + 40, + 10, + 76, + 54, + 29, + 66, + 38, + 10, + 72, + 45, + 15, + 62, + 26, +-12, + 65, + 34, + -2, + 48, + 8, +-31, + 56, + 21, +-17, + 49, + 15, +-20, + 45, + 14, +-17, + 31, + -2, +-29, + 24, + -6, +-33, + 35, + 10, +-12, + 40, + 21, + 3, + 33, + 14, + -2, + 18, + 2, + -9, + 0, +-14, +-26, +-43, +-54, +-75, +-71, +-94, +-113, +-69, +-91, +-119, +-66, +-92, +-114, +-14, +-19, +-27, +-27, +-24, +-34, +-29, +-32, +-47, +-40, +-36, +-48, +-28, +-26, +-43, + -7, +-14, +-33, + 20, + 7, +-19, + 13, + 6, + -9, +-75, +-76, +-86, + -2, + -7, +-33, + 9, + 5, +-20, + 21, + 8, +-20, + 27, + 9, +-23, +-17, +-17, +-55, +-20, +-14, +-56, +-28, +-21, +-60, +-54, +-60, +-90, + 41, + -5, +-53, + 47, + 2, +-47, + 40, + -7, +-55, + 54, + 23, + -8, + 65, + 41, + 9, + 30, + 37, + 32, + 25, + 33, + 27, + 47, + 52, + 49, + 39, + 45, + 42, + 38, + 46, + 42, + 21, + 22, + 16, + 24, + -4, +-39, + 20, +-17, +-54, + 35, + 3, +-34, + 34, + 0, +-41, + 37, + 4, +-32, + 26, +-13, +-57, +-31, +-64, +-92, +-25, +-59, +-85, + 42, + 1, +-44, + 58, + 18, +-29, + 66, + 37, + 2, + 67, + 38, + 6, +-104, +-120, +-124, +-97, +-113, +-118, +-84, +-95, +-108, +-83, +-92, +-112, +-67, +-66, +-54, +-64, +-61, +-42, +-67, +-62, +-47, +-57, +-57, +-43, +-54, +-54, +-45, +-72, +-68, +-59, +-80, +-77, +-67, +-92, +-91, +-83, +-85, +-83, +-75, +-66, +-65, +-56, +-49, +-49, +-39, +-53, +-54, +-41, +-17, +-19, +-15, +-82, +-93, +-112, + 50, + 7, +-45, + 66, + 27, +-20, + -7, +-34, +-62, +-28, +-75, +-111, +-70, +-93, +-103, + 65, + 36, + 0, + 63, + 24, +-19, + 67, + 23, +-28, + 60, + 12, +-45, + 67, + 20, +-38, + 64, + 22, +-26, + 72, + 29, +-28, + 47, + -4, +-56, + 72, + 36, +-13, + 58, + 14, +-34, + 68, + 26, +-15, + 68, + 35, + -8, + 57, + 24, +-12, + 52, + 9, +-37, + 65, + 32, + -9, + 57, + 23, +-18, + 48, + 15, +-24, + 46, + 11, +-24, + 47, + 14, +-16, + 46, + 27, + 5, + 42, + 34, + 21, + 38, + 25, + 8, + 37, + 13, + -9, + 46, + 22, + -1, + 27, + -5, +-33, + 34, + 10, +-16, + 27, + 0, +-24, + 23, + -2, +-25, + 11, +-13, +-34, + 23, + 2, +-16, + 2, +-26, +-52, +-53, +-78, +-102, +-63, +-83, +-113, +-19, +-22, +-31, + -2, +-13, +-41, + 9, + 6, +-17, + 24, + 11, +-14, + 9, + 5, +-10, + 17, + 4, +-19, + 0, + -2, +-19, + -3, + 0, + -6, +-44, +-46, +-57, + 5, +-10, +-36, + 15, + 9, +-14, + 24, + 12, +-14, + 4, + -6, +-34, + 45, + 23, + -7, + 22, + 8, +-23, + -2, + -6, +-41, +-51, +-53, +-82, + 41, + -3, +-50, + 50, + 6, +-40, + 35, +-13, +-61, + 43, + 9, +-21, + 75, + 50, + 22, + 26, + 32, + 26, + 32, + 39, + 34, + 33, + 42, + 36, + 33, + 41, + 37, + 19, + 21, + 14, + 10, +-20, +-54, + 17, +-14, +-51, + 25, +-14, +-58, + 26, + -8, +-47, + 21, +-19, +-61, + 36, + 2, +-39, + 44, + 10, +-31, +-15, +-51, +-81, +-36, +-67, +-92, + 36, + 7, +-35, + 17, +-10, +-51, + 12, +-14, +-51, + -2, +-23, +-51, +-116, +-123, +-124, +-113, +-124, +-125, +-11, + -8, + -7, + 33, + 35, + 36, + 35, + 37, + 38, + 37, + 39, + 40, + 38, + 41, + 42, + 38, + 40, + 41, + 37, + 39, + 39, + 37, + 39, + 39, + 40, + 41, + 42, + 41, + 43, + 42, + 38, + 39, + 39, + 22, + 24, + 27, + -9, + -8, + -9, +-13, +-12, +-14, + 11, + 9, + 8, +-90, +-103, +-119, + 1, +-16, +-47, + 16, + -6, +-43, +-13, +-47, +-82, +-25, +-70, +-103, +-68, +-96, +-107, + 26, + -7, +-49, + 23, + -1, +-42, + 26, + 5, +-29, + 50, + 23, +-18, + 51, + 17, +-25, + 72, + 35, + -9, + 73, + 39, + -4, + 63, + 23, +-22, + 61, + 20, +-31, + 53, + 14, +-29, + 54, + 11, +-39, + 53, + 14, +-29, + 52, + 13, +-30, + 65, + 37, + 3, + 55, + 27, + -3, + 53, + 25, + -5, + 46, + 26, + -1, + 35, + 22, + 0, + 22, + 10, +-11, + 12, + 2, +-18, + 23, + -2, +-27, + 23, + 7, +-15, + 15, + 2, +-14, + 13, + 2, +-13, + 24, + 12, + 0, + 32, + 16, + 5, + 19, + -3, +-20, + 27, + 8, +-11, + 28, + 9, + -8, + 13, +-14, +-35, + 17, + -3, +-20, + 0, +-29, +-54, +-31, +-64, +-95, +-11, +-15, +-25, + -2, + -8, +-34, + 9, + 0, +-22, + 19, + 9, +-12, + 25, + 17, + -6, + 19, + 12, +-10, + 15, + 8, +-12, + 19, + 5, +-22, + 22, + 6, +-23, + 0, + -3, +-25, + 10, + 6, +-17, + 24, + 12, +-12, +-57, +-44, +-81, + 8, + -3, +-28, + 51, + 28, + 3, + 56, + 34, + 8, + 8, +-10, +-35, + 38, + -6, +-50, + 51, + 9, +-38, + 34, +-13, +-60, + 36, + -5, +-40, + 86, + 61, + 32, + 17, + 21, + 16, + 33, + 38, + 36, + 16, + 25, + 17, + 24, + 29, + 24, + 8, +-19, +-56, + 28, + -3, +-43, + 10, +-27, +-73, + 31, + -5, +-45, + 28, + -9, +-46, + 35, + -3, +-43, + 32, + -5, +-46, + 37, + 0, +-44, +-16, +-48, +-80, +-38, +-68, +-92, + 30, + -7, +-49, + 3, +-25, +-58, +-51, +-72, +-95, +-109, +-122, +-125, +-117, +-123, +-124, +-114, +-123, +-122, +-111, +-108, +-75, +-87, +-98, +-56, +-70, +-89, +-53, +-34, +-65, +-47, +-27, +-57, +-46, +-34, +-66, +-48, +-37, +-71, +-54, +-50, +-82, +-57, +-48, +-76, +-56, +-56, +-82, +-56, +-86, +-97, +-56, +-102, +-109, +-73, +-115, +-115, +-94, +-119, +-118, +-104, +-107, +-116, +-112, +-99, +-113, +-124, +-99, +-112, +-124, + 13, + -9, +-38, + 12, +-19, +-50, +-34, +-73, +-99, +-53, +-73, +-88, + 44, + 18, +-23, + 59, + 22, +-23, + 52, + 14, +-27, + 60, + 19, +-27, + 62, + 14, +-38, + 66, + 24, +-24, + 58, + 18, +-25, + 53, + 14, +-28, + 56, + 17, +-32, + 51, + 9, +-36, + 50, + 8, +-38, + 65, + 30, +-11, + 51, + 14, +-25, + 54, + 24, + -9, + 51, + 18, +-15, + 52, + 20, +-14, + 43, + 14, +-14, + 39, + 13, + -9, + 30, + 0, +-27, + 33, + 14, +-10, + 18, + 5, +-19, + 3, + -7, +-29, + 5, + -8, +-25, + 23, + 12, + -7, + 37, + 21, + 3, + 30, + 10, +-10, + 22, +-12, +-38, + 31, + 7, +-15, + 26, + 5, +-17, + 27, + 6, +-13, + 9, +-17, +-39, + 15, +-13, +-37, + 2, +-33, +-64, + 20, + 11, + -6, + 10, + -4, +-27, + 4, + 2, +-15, + 23, + 15, + -7, + 26, + 18, + -1, + 24, + 19, + -1, + 31, + 19, + -5, + 22, + 16, + -3, + 29, + 17, + -7, + 13, + 14, + -7, + 15, + 8, +-16, + 24, + 10, +-14, +-61, +-46, +-82, +-44, +-33, +-71, +-13, +-15, +-42, + 44, + 28, + 3, + 17, + 0, +-23, + 29, +-13, +-53, + 50, + 9, +-36, + 46, + 1, +-44, + 23, +-24, +-67, + 89, + 64, + 34, + 6, + 11, + 3, + 30, + 38, + 35, + 8, + 13, + 4, + 20, + 0, +-27, + 22, + -9, +-44, + 31, + 2, +-32, + 26, + -3, +-40, + 32, + 3, +-35, + 29, + -3, +-43, + 8, +-38, +-87, + 27, +-15, +-63, + 21, +-24, +-78, +-30, +-67, +-106, +-48, +-85, +-111, + 6, +-29, +-75, + 11, +-27, +-76, + 38, + -3, +-56, + 43, + 5, +-44, + 24, +-20, +-68, + 25, +-28, +-84, + 63, + 10, +-72, + 50, + -7, +-80, + 45, + -5, +-61, + 53, + 2, +-57, + 46, + -1, +-47, + 50, + 14, +-20, + 37, + 5, +-26, + 46, + 9, +-25, + 48, + 4, +-28, + 45, + 0, +-39, + 46, + 7, +-34, + 33, + -3, +-40, + 27, +-17, +-58, + 12, +-35, +-76, + 2, +-46, +-90, +-25, +-68, +-105, +-53, +-96, +-124, +-77, +-110, +-124, +-32, +-60, +-97, +-45, +-77, +-102, +-79, +-87, +-94, + 68, + 30, +-17, + 51, + 9, +-37, + 50, + 7, +-42, + 41, + -7, +-60, + 47, + -1, +-57, + 40, + -8, +-60, + 51, + 7, +-41, + 50, + 14, +-25, + 67, + 36, + 2, + 59, + 21, +-18, + 61, + 24, +-10, + 48, + 14, +-21, + 64, + 38, + 4, + 40, + 5, +-28, + 44, + 3, +-37, + 45, + 4, +-38, + 43, + 2, +-40, + 40, + -1, +-42, + 40, + 10, +-26, + 36, + 8, +-19, + 42, + 13, +-17, + 46, + 25, + 0, + 36, + 15, +-10, + 37, + 10, +-17, + 37, + 9, +-19, + 30, + -3, +-38, + 24, +-12, +-44, + 27, + -2, +-30, + 22, +-10, +-39, + 12, +-23, +-51, + 28, + 7, +-11, + 25, + 2, +-18, + 18, + -7, +-27, + 26, + 17, + 2, + 9, + 2, +-18, + 9, + 10, + -7, + 22, + 11, +-10, + 16, + 9, + -9, + 23, + 16, + -7, + 22, + 17, + -6, + 29, + 20, + -2, + 30, + 18, + -5, + 15, + 5, +-19, + 10, + 5, +-18, + 20, + 6, +-18, +-63, +-49, +-86, +-61, +-44, +-78, +-23, +-16, +-53, +-28, +-18, +-55, +-30, +-28, +-55, + 17, +-20, +-57, + 50, + 10, +-33, + 50, + 9, +-35, + 21, +-24, +-68, + 87, + 58, + 25, + -2, + -2, +-12, + 23, + 25, + 23, +-20, +-31, +-50, +-10, +-33, +-59, + 15, +-16, +-44, + 12, +-22, +-51, + -3, +-30, +-62, + 11, +-14, +-46, + 28, + 0, +-35, + 38, + 8, +-32, + 30, + -8, +-56, + 27, +-13, +-60, +-22, +-58, +-101, +-40, +-75, +-98, + 20, +-27, +-83, + 21, +-27, +-84, + 26, +-21, +-83, + 12, +-37, +-92, +-18, +-52, +-85, +-26, +-55, +-93, + 34, +-10, +-66, + 50, + 13, +-33, + 42, + 4, +-39, + 55, + 22, +-12, + 44, + 5, +-29, + 24, +-16, +-51, + 30, + 0, +-35, + 35, + 0, +-33, + 48, + 9, +-20, + 35, + -3, +-34, + 37, + -2, +-37, + 38, + -3, +-35, + 49, + 12, +-21, + 49, + 10, +-29, + 55, + 20, +-18, + 57, + 15, +-32, + 46, + 2, +-42, + 28, +-15, +-58, + -4, +-44, +-85, +-40, +-70, +-99, +-62, +-73, +-91, + 45, + 2, +-44, + 45, + -3, +-50, + 54, + 12, +-36, + 49, + 8, +-39, + 62, + 30, + -9, + 63, + 29, +-10, + 53, + 14, +-17, + 36, + 1, +-30, + 31, + -1, +-30, + 32, + 2, +-27, + 39, + 6, +-20, + 37, + 10, +-17, + 24, + -1, +-26, + 43, + 17, + -8, + 58, + 33, + 8, + 59, + 33, + 6, + 51, + 23, + -5, + 51, + 22, +-11, + 47, + 11, +-26, + 36, + 2, +-32, + 25, +-15, +-50, + 24, +-18, +-60, + 31, + -9, +-49, + 30, + -6, +-42, + 24, +-13, +-50, + 27, +-10, +-45, + 32, + -1, +-36, + 31, + 6, +-17, + 37, + 13, + -9, + 44, + 29, + 15, + 17, + 2, +-13, + -9, +-28, +-40, + 9, +-13, +-25, + 15, + 1, +-10, + 11, + 6, +-12, + 13, + 6, +-14, + 14, + 8, +-10, + 18, + 12, + -7, + 11, + 9, + -8, + 13, + 9, +-12, + 16, + 8, +-13, + 21, + 9, +-13, + 7, + 6, + -8, + 3, + -1, +-22, + 18, + 7, +-21, +-35, +-29, +-65, +-51, +-41, +-76, +-18, +-18, +-44, + 23, + 15, +-12, + -1, + -6, +-30, + 13, +-21, +-58, + 50, + 11, +-28, + 49, + 10, +-32, + 21, +-22, +-64, + 96, + 70, + 37, + 4, + 0, +-13, +-23, +-33, +-47, + -7, +-34, +-61, + 9, +-23, +-48, + 12, +-18, +-46, + -3, +-18, +-49, + -5, +-35, +-68, + 8, +-23, +-58, + 31, + -5, +-45, + 15, +-21, +-66, + 28, + -7, +-53, + 25, +-15, +-67, + -9, +-50, +-90, +-42, +-74, +-99, + 17, +-27, +-79, + 13, +-34, +-91, + 18, +-26, +-78, + 14, +-29, +-75, +-13, +-49, +-90, +-61, +-75, +-95, + 32, + -9, +-60, + 38, + 0, +-40, + 29, + -7, +-49, + 42, + 7, +-28, + 20, +-11, +-48, + 9, +-19, +-54, + 34, + -4, +-40, + 49, + 2, +-32, + 42, + -3, +-34, + 14, +-12, +-43, + 19, +-11, +-45, + 44, + 12, +-21, + 51, + 21, +-15, + 46, + 5, +-39, + 46, + 7, +-35, + 33, +-11, +-59, + 25, +-22, +-65, + 39, + -4, +-45, + 5, +-36, +-80, +-40, +-66, +-94, +-93, +-104, +-112, + 56, + 15, +-29, + 50, + 4, +-42, + 50, + 6, +-44, + 56, + 14, +-33, + 67, + 35, + -3, + 53, + 20, +-15, + 67, + 37, + 11, + 41, + 11, +-18, + 25, + 4, +-24, + 36, + 3, +-26, + 53, + 10, +-16, + 47, + 11, +-17, + 32, + 5, +-22, + 30, + -2, +-27, + 42, + 13, +-10, + 56, + 33, + 7, + 43, + 14, +-18, + 50, + 20, +-10, + 37, + -1, +-40, + 34, + -4, +-45, + 27, +-13, +-50, + 23, +-17, +-53, + 21, +-20, +-61, + 23, +-18, +-59, + 28, + -7, +-44, + 18, +-25, +-64, + 29, + -8, +-41, + 32, + 5, +-20, + 27, + 1, +-21, + 35, + 12, + -8, + 25, + -1, +-17, + 3, +-25, +-43, + 5, +-10, +-23, + 27, + 21, + 9, + 21, + 10, +-12, + 6, + 6, + -9, + 17, + 11, + -9, + 12, + 9, + -8, + 14, + 10, + -7, + 22, + 13, + -9, + 15, + 11, + -7, + 23, + 13, + -9, + 7, + 4, +-17, + 11, + 3, +-22, + 16, + 4, +-22, + -8, +-16, +-50, +-36, +-30, +-65, +-33, +-25, +-61, +-52, +-38, +-70, +-28, +-26, +-47, + -5, +-33, +-65, + 46, + 9, +-29, + 45, + 8, +-33, + 15, +-25, +-65, + 94, + 64, + 33, + 11, +-14, +-42, + 26, + 11, +-17, + 23, + 3, +-22, + 22, + 1, +-27, + 28, + 7, +-23, + 33, + 10, +-23, + 13, +-15, +-52, + 9, +-29, +-67, + 2, +-39, +-84, + 15, +-27, +-81, + 10, +-34, +-87, + 15, +-27, +-77, +-11, +-46, +-83, +-38, +-65, +-88, + 26, + -8, +-53, + 25, + -8, +-50, + 23, + 2, +-45, + 30, + 16, +-38, + 62, + 62, + 21, + 59, + 74, + 41, + 59, + 50, + 30, + 59, + 22, + -8, + 79, + 57, + 33, + 57, + 36, + 12, + 35, + 12, +-14, + 42, + 7, +-33, + 32, + -7, +-45, + 42, + 5, +-35, + 41, + 1, +-38, + 58, + 29, + -8, + 44, + 6, +-34, + 33, + -8, +-52, + 34, +-11, +-54, + 33, +-12, +-56, + 32, +-14, +-60, + 42, + 1, +-40, + 48, + 20, +-16, + 30, + -8, +-42, +-12, +-48, +-83, +-31, +-56, +-87, +-75, +-87, +-101, + 44, + 5, +-35, + 55, + 21, +-18, + 56, + 19, +-20, + 50, + 8, +-36, + 49, + 6, +-42, + 47, + 3, +-44, + 55, + 14, +-28, + 67, + 35, + -6, + 74, + 54, + 28, + 65, + 35, + 2, + 57, + 22, + -8, + 56, + 20, +-13, + 65, + 40, + 11, + 59, + 40, + 16, + 44, + 8, +-20, + 47, + 8, +-27, + 46, + 7, +-31, + 35, + -4, +-47, + 37, + -2, +-45, + 42, + 11, +-24, + 43, + 15, +-15, + 39, + 12, +-20, + 49, + 26, + -1, + 38, + 17, + -7, + 42, + 14, +-14, + 31, + -1, +-31, + 39, + 10, +-18, + 28, + -9, +-46, + 30, + -7, +-45, + 24, +-10, +-43, + 24, +-11, +-37, + 19, + -4, +-25, + 31, + 12, + -4, + 5, +-18, +-48, + -4, +-29, +-61, + -5, +-26, +-57, + 0, +-15, +-40, + 4, +-13, +-39, + 3, + -8, +-29, + 4, + -3, +-22, + 13, + 3, +-20, + 18, + 7, +-14, + 3, + -5, +-24, + 2, + -1, +-22, + 8, + -1, +-27, + 39, + 15, +-12, + -1, + -9, +-41, +-39, +-28, +-65, +-20, +-11, +-45, +-32, +-23, +-52, +-25, +-47, +-76, + 41, + 4, +-34, + 43, + 6, +-32, + 5, +-34, +-71, + 82, + 52, + 20, + 14, + 1, +-40, + 41, + 45, + 11, + 57, + 53, + 23, + 67, + 61, + 32, + 17, + 30, + -7, +-19, + 14, +-28, + 23, + 37, + 2, + 44, + 49, + 17, + 40, + 45, + 16, + 22, + 34, + 4, + 4, + 9, +-23, + 13, + 9, +-27, + -9, +-16, +-38, +-35, +-40, +-64, + 11, + 17, +-14, + 35, + 47, + 16, + 85, + 66, +-20, +119, + 89, + 13, +115, +100, + 61, +110, +103, + 83, + 91, + 75, + 49, + 72, + 27, + 12, + 67, + 54, + 37, + 84, + 71, + 54, + 60, + 45, + 28, + 17, +-21, +-65, + 20, +-25, +-73, + 23, +-22, +-71, + 21, +-24, +-69, + 21, +-20, +-62, + 32, + -4, +-40, + 21, +-19, +-58, + 36, + -4, +-46, + 24, +-18, +-58, + 31, + -6, +-40, + 25, + -8, +-40, + 26, + -4, +-32, + 21, + 2, +-18, +-32, +-65, +-95, +-11, +-42, +-72, +-13, +-24, +-52, + 18, + -2, +-31, + 35, + 3, +-32, + 35, + 2, +-34, + 49, + 15, +-19, + 47, + 5, +-38, + 56, + 17, +-26, + 49, + 9, +-27, + 53, + 20, +-12, + 47, + 8, +-29, + 47, + 8, +-33, + 55, + 14, +-28, + 53, + 12, +-31, + 50, + 13, +-29, + 51, + 14, +-21, + 59, + 27, + -9, + 53, + 20, +-14, + 60, + 24, +-14, + 46, + 6, +-33, + 44, + 14, +-15, + 39, + 11, +-15, + 33, + 8, +-16, + 29, + 14, + -7, + 11, + 4, +-13, + 10, + 4, +-11, + 17, + 9, + -6, + 21, + 7, +-10, + 36, + 8, +-16, + 39, + 10, +-14, + 36, + 8, +-18, + 35, + 3, +-27, + 35, + 4, +-29, + 28, + -3, +-31, + 23, + -9, +-36, + 7, +-12, +-44, + -4, +-15, +-42, + 3, +-12, +-40, + 8, + -9, +-43, + -5, +-21, +-50, + -5, +-23, +-55, + -8, +-35, +-72, + 0, +-32, +-72, +-10, +-31, +-65, +-10, +-36, +-72, +-11, +-29, +-56, + -7, +-23, +-48, + 41, + 16, +-10, + 44, + 21, + -4, + 22, + 10, +-19, +-21, +-15, +-50, +-37, +-25, +-56, +-43, +-54, +-82, + 39, + 3, +-33, + 43, + 5, +-32, + 0, +-39, +-76, + 76, + 47, + 18, + 28, + 10, +-35, + -9, + 12, +-30, + 46, + 46, + 16, + 87, + 71, + 49, + 80, + 68, + 46, + 39, + 42, + 11, + 13, + 29, + -8, + 53, + 57, + 32, + 24, + 42, + 14, + 43, + 49, + 24, + 69, + 67, + 44, + 33, + 41, + 8, + 50, + 57, + 32, + 71, + 74, + 55, + 74, + 77, + 61, + 29, + 34, +-14, +109, + 54, +-74, +117, + 83, + 3, +113, + 88, + 38, +100, + 87, + 65, + 73, +-23, +-46, + 94, + 63, + 41, +105, + 93, + 77, +103, + 92, + 74, + 61, + 42, + 27, + 17, +-23, +-67, + 8, +-39, +-88, + 16, +-24, +-68, + 19, +-18, +-55, + 13, +-28, +-73, + 32, + -7, +-46, + 40, + 9, +-27, + 28, + -2, +-34, + 26, + 4, +-24, + 5, +-10, +-34, +-11, +-18, +-37, +-13, +-22, +-47, + -6, +-24, +-56, +-34, +-66, +-97, + 6, +-30, +-62, + 29, +-12, +-44, + -4, +-22, +-55, + -8, +-15, +-39, + 14, + 8, +-11, + 19, + 2, +-22, + 48, + 30, + 3, + 61, + 34, + 4, + 65, + 41, + 8, + 55, + 20, +-18, + 48, + 11, +-29, + 60, + 31, + 4, + 51, + 13, +-22, + 51, + 11, +-33, + 65, + 36, + 4, + 53, + 18, +-18, + 63, + 32, + -1, + 68, + 46, + 24, + 70, + 50, + 28, + 66, + 45, + 22, + 43, + 32, + 16, + 42, + 37, + 26, + 18, + 14, + -1, + 9, + -1, +-22, + 30, + 11, + -8, + 31, + 8, +-14, + 31, + 1, +-19, + 10, +-15, +-39, + 2, + -8, +-31, + 4, + -5, +-17, + 29, + 16, + -2, + 28, + 10, + -6, + 47, + 24, + 0, + 42, + 23, + 5, + 35, + 9, +-14, +-14, +-33, +-63, +-19, +-34, +-60, + -7, +-19, +-44, + 1, +-13, +-40, +-13, +-26, +-49, +-13, +-25, +-52, +-13, +-32, +-56, +-12, +-24, +-51, +-29, +-43, +-65, +-18, +-38, +-60, + -3, +-30, +-65, +-20, +-44, +-78, + 40, + 14, +-12, + 44, + 21, + -4, + 46, + 27, + 2, + 49, + 32, + 7, + 34, + 21, + -3, +-14, +-30, +-51, + 36, + -1, +-36, + 43, + 8, +-26, + -3, +-38, +-75, + 81, + 50, + 19, + 62, + 37, + 5, + 59, + 53, + 29, + 51, + 48, + 23, + 53, + 50, + 24, + 63, + 57, + 32, + 69, + 62, + 35, + 69, + 60, + 33, + 54, + 52, + 25, + 73, + 66, + 43, + 80, + 76, + 53, + 86, + 84, + 67, + 88, + 83, + 67, + 70, + 75, + 62, + 54, + 73, + 55, + 61, + 71, + 60, + 90, + 58, + 40, + 93, + 17, +-125, +102, + 64, +-18, + 89, + 58, + 8, + 85, + 54, + 38, + 81, + 37, + 21, +102, + 84, + 63, + 87, + 68, + 47, + 94, + 79, + 62, + 33, + 9, +-11, + 16, +-23, +-66, + 12, +-32, +-74, + 27, +-11, +-51, + 16, +-24, +-67, + 14, +-23, +-62, + 24, +-10, +-47, + 3, +-35, +-72, + 22, +-16, +-55, + 18, +-23, +-62, + 31, + -3, +-38, + 20, + -9, +-38, + 36, + 11, +-14, + 10, + -4, +-26, +-57, +-82, +-101, + -9, +-33, +-56, + 3, +-14, +-41, + 31, + 10, +-14, + 36, + 5, +-25, + 49, + 20, +-10, + 46, + 12, +-22, + 45, + 7, +-31, + 48, + 14, +-22, + 49, + 19, +-13, + 63, + 39, + 11, + 57, + 23, +-10, + 67, + 36, + 0, + 57, + 22, +-16, + 56, + 17, +-25, + 65, + 39, + 8, + 55, + 23, + -6, + 61, + 39, + 14, + 66, + 46, + 22, + 52, + 21, +-14, + 61, + 31, + 2, + 56, + 28, + 3, + 54, + 27, + 3, + 49, + 23, + -4, + 28, + 5, +-15, + 16, + 7, + -7, + 4, + -3, +-24, + 23, + 12, +-11, + 13, + 3, +-21, + 12, + 0, +-20, + 33, + 11, +-13, + 45, + 24, + 1, + 35, + 9, +-15, + 43, + 20, + -8, + 38, + 12, +-13, + 30, + 4, +-18, +-23, +-39, +-63, +-14, +-26, +-51, +-10, +-24, +-50, + -3, +-22, +-47, +-20, +-34, +-61, + -8, +-23, +-52, +-30, +-42, +-64, +-11, +-28, +-53, +-23, +-40, +-69, +-32, +-53, +-78, +-18, +-34, +-60, +-26, +-42, +-67, + 38, + 12, +-13, + 43, + 19, + -6, + 45, + 25, + 0, + 27, + 14, + -8, + 48, + 32, + 12, +-10, +-21, +-39, + 32, + -5, +-41, + 43, + 10, +-25, + 6, +-31, +-68, + 80, + 50, + 21, + 46, + 18, +-19, + 31, + 34, + -1, + 44, + 47, + 14, + 59, + 57, + 26, + 47, + 49, + 16, + 24, + 35, + -2, + 40, + 37, + 1, + 86, + 74, + 54, +100, + 94, + 81, +104, + 99, + 90, +105, + 97, + 84, + 96, + 73, + 35, + 72, + 76, + 66, + 46, + 59, + 46, + 32, + 47, + 36, + 76, + 41, + 29, + 72, + 5, +-100, + 67, + 32, +-44, + 67, + 11, +-22, + 72, + 16, + 3, + 67, + 38, + 18, + 51, + 29, + 9, + 53, + 37, + 22, + 93, + 83, + 69, +-22, +-56, +-92, + 6, +-28, +-64, + 10, +-27, +-62, + 4, +-34, +-68, + 16, +-14, +-42, +-15, +-62, +-106, + 15, +-24, +-66, + 19, +-18, +-57, + 11, +-30, +-74, + 19, +-24, +-65, + 26, +-14, +-54, + 27, + -6, +-42, + 22, +-13, +-41, + 39, + 11, +-15, +-69, +-87, +-96, + 7, +-15, +-38, + 43, + 13, +-18, + 35, + -3, +-37, + 50, + 18, +-18, + 44, + 4, +-36, + 51, + 12, +-28, + 54, + 12, +-38, + 51, + 13, +-28, + 57, + 23, +-16, + 28, +-22, +-75, + 46, + 15, +-17, + 53, + 19, +-14, + 48, + 10, +-27, + 57, + 24, + -7, + 51, + 11, +-32, + 70, + 44, + 14, + 45, + 9, +-28, + 52, + 9, +-38, + 65, + 38, + 7, + 57, + 22, +-12, + 69, + 33, + -8, + 68, + 36, + 0, + 50, + 18, +-11, + 58, + 33, + 9, + 49, + 24, + -4, + 53, + 35, + 13, + 28, + 14, + -2, + 42, + 25, + 3, + 51, + 27, + 3, + 48, + 22, + -8, + 44, + 12, +-22, + 39, + 1, +-33, + 36, + 0, +-37, + 35, + 4, +-26, + 41, + 13, +-20, +-32, +-49, +-74, +-13, +-26, +-55, +-23, +-34, +-55, + -5, +-19, +-47, +-25, +-38, +-55, + -7, +-22, +-43, +-28, +-43, +-64, +-14, +-32, +-57, +-24, +-38, +-64, +-26, +-45, +-68, +-22, +-41, +-67, +-33, +-44, +-72, + 31, + 7, +-18, + 41, + 17, + -7, + 44, + 23, + -1, + 9, + 1, +-23, + 45, + 30, + 11, + -6, +-10, +-26, + 17, +-20, +-51, + 44, + 10, +-25, + 15, +-24, +-60, + 71, + 48, + 24, + 49, + 19, +-21, + 19, + 27, + -5, + 32, + 35, + 3, + 53, + 48, + 18, + 37, + 32, + -8, + 48, + 38, + -5, + 78, + 61, + 33, + 95, + 89, + 76, +102, + 97, + 90, +101, + 95, + 85, +100, + 88, + 78, + 85, + 31, +-41, + 62, + 64, + 55, + 13, + 26, + 10, + 24, + 32, + 21, + 30, +-24, +-63, + 36, + 8, +-59, +-21, + 10, +-33, + 33, + 3, +-42, + 84, + 50, +-12, + 87, + 46, +-17, + 57, + 44, + 30, + 53, + 40, + 25, + 74, + 65, + 54, + 54, +-38, +-59, + 52, +-25, +-48, + 37, +-14, +-38, + 4, +-25, +-51, + -9, +-26, +-52, + 15, + -7, +-36, + 18, +-10, +-39, + 22, +-12, +-46, + 7, +-32, +-69, + 7, +-39, +-87, + 13, +-29, +-74, + 11, +-33, +-79, + 26, + -5, +-34, + 37, + 5, +-31, +-49, +-79, +-100, + 14, +-12, +-42, + 45, + 10, +-30, + 33, + -3, +-41, + 37, + -7, +-55, + 38, + -3, +-54, + 42, + -5, +-57, + 46, + 7, +-30, + 61, + 28, + -9, + 53, + 25, + -8, + 48, + 28, + 4, + 47, + 33, + 7, + 58, + 28, + 2, + 58, + 17, + -8, + 55, + 8, +-13, + 70, + 41, + 19, + 56, + 42, + 21, + 62, + 46, + 26, + 58, + 36, + 14, + 62, + 37, + 9, + 64, + 30, + -3, + 57, + 23, +-11, + 51, + 9, +-39, + 61, + 28, +-11, + 50, + 12, +-30, + 57, + 23, + -8, + 57, + 32, + 6, + 62, + 36, + 7, + 55, + 30, + 2, + 50, + 17, +-17, + 34, + -2, +-32, + 37, + 5, +-29, + 36, + -5, +-45, + 20, +-23, +-66, + 32, + -2, +-35, + 40, + 8, +-23, +-32, +-51, +-77, + -8, +-20, +-44, +-21, +-34, +-57, + -8, +-23, +-47, +-23, +-36, +-54, +-24, +-33, +-59, +-42, +-54, +-73, +-15, +-30, +-55, +-32, +-47, +-69, +-38, +-53, +-75, +-13, +-31, +-57, +-40, +-54, +-74, + 15, + -2, +-30, + 39, + 15, + -9, + 34, + 15, + -9, + 7, + 2, +-24, + 35, + 22, + 1, + -2, + -5, +-24, + 6, +-32, +-61, + 45, + 11, +-24, + 21, +-18, +-55, + 60, + 42, + 24, + 56, + 27, + -5, + 18, +-18, +-54, + 28, +-19, +-61, + 60, + 4, +-63, + 42, + -2, +-59, + 39, + 5, +-28, + 91, + 79, + 63, + 90, + 85, + 73, + 89, + 79, + 58, + 89, + 86, + 76, + 69, + 8, +-20, + 64, + 18, +-94, + 14, + 19, + 9, + 37, + 43, + 37, + 36, + 32, + 16, + 67, +-17, +-104, + -2, +-11, +-49, + 30, + 7, +-30, + 83, + 31, +-60, + 99, + 59, +-62, + 98, + 61, +-17, + 61, + 54, + 40, + 56, + 43, + 27, + 65, + 54, + 42, + 24, + 17, +-11, + 79, + 24, + 13, + 83, + -2, +-14, + 88, + 10, + -3, + 68, + 30, + 12, + 40, + 9, +-16, + 19, +-13, +-42, + 3, +-36, +-71, + 31, + 2, +-30, + 12, +-26, +-64, + 24, +-10, +-47, + 9, +-32, +-71, + -3, +-55, +-101, + 6, +-42, +-91, +-94, +-99, +-95, + -3, +-38, +-72, + 15, +-32, +-79, + 25, +-21, +-66, + 44, + 6, +-33, + 42, + 8, +-29, + 57, + 25, +-15, + 63, + 34, + 3, + 50, + 22, + -5, + 54, + 18, + -9, + 51, + 15, +-11, + 44, + 10, +-16, + 36, + 12, +-12, + 45, + 20, + -1, + 41, + 16, + -2, + 46, + 32, + 12, + 33, + 4, +-20, + 44, + 14, +-12, + 58, + 27, + 4, + 73, + 51, + 31, + 59, + 32, + 5, + 68, + 48, + 25, + 66, + 38, + 7, + 57, + 25, + -6, + 62, + 29, + -4, + 51, + 4, +-39, + 45, + -2, +-42, + 53, + 10, +-40, + 47, + 6, +-41, + 38, + -3, +-45, + 28, +-15, +-56, + 24, +-16, +-51, + 23, +-12, +-41, + 31, + -2, +-35, + 49, + 24, + -3, + 45, + 19, +-11, +-28, +-45, +-70, +-10, +-22, +-45, +-26, +-35, +-56, + 1, +-12, +-40, +-25, +-37, +-56, +-11, +-29, +-54, +-34, +-43, +-61, +-18, +-31, +-58, +-37, +-53, +-74, +-40, +-53, +-77, +-28, +-43, +-69, +-33, +-52, +-73, +-12, +-19, +-50, + 34, + 12, +-13, + 18, + 2, +-23, + 3, + -1, +-28, + 24, + 17, + -6, + -4, + -4, +-25, + -5, +-40, +-70, + 45, + 12, +-23, + 24, +-15, +-54, + 38, + 20, + 2, + 64, + 36, + 7, + 63, + 8, +-44, + 59, + 10, +-33, + 76, + 37, + -2, + 45, + 1, +-42, + 50, + 14, +-20, + 59, + 24, +-22, + 88, + 64, + 20, + 81, + 72, + 53, + 77, + 58, + 43, + 45, + 17, +-59, + 36, + 39, + 14, + 61, + 65, + 58, + 49, + 45, + 38, + 42, + 19, + -7, + 41, + 16, +-26, + 28, + 34, + -4, + 14, + 35, + 1, + 16, + 36, + 5, + 51, + 54, + 29, +-17, + 21, +-26, + 59, + 52, + 39, + 48, + 35, + 18, + 59, + 47, + 30, + 51, + 55, + 34, + 81, + 83, + 68, +103, + 97, + 85, +102, + 84, + 70, +100, + 66, + 58, +103, + 88, + 77, +100, + 89, + 73, + 66, + 49, + 30, + 9, +-22, +-55, + 11, +-31, +-73, + 12, +-28, +-72, + 23, +-21, +-63, + 22, +-20, +-65, + 20, +-26, +-71, +-78, +-87, +-86, + 5, +-30, +-59, + 43, + 2, +-42, + 43, + -2, +-56, + 41, + -3, +-49, + 50, + 10, +-34, + 52, + 17, +-23, + 65, + 39, + 8, + 58, + 28, + -6, + 62, + 34, + 11, + 47, + 12, +-13, + 20, +-11, +-37, + 36, + 21, + -4, + 61, + 35, + 13, + 49, + 17, + -3, + 65, + 33, + 8, + 32, + 12, +-15, + 36, + 1, +-28, + 50, + 21, + -7, + 60, + 31, + 9, + 69, + 45, + 15, + 64, + 39, + 10, + 74, + 54, + 28, + 66, + 30, + -9, + 59, + 22, +-19, + 46, + 3, +-40, + 48, + 6, +-37, + 47, + 4, +-41, + 56, + 14, +-35, + 54, + 11, +-38, + 49, + 9, +-31, + 40, + -1, +-42, + 20, +-20, +-58, + 33, + 0, +-35, + 45, + 21, + -4, + 16, +-18, +-46, +-29, +-46, +-71, +-12, +-23, +-43, +-25, +-33, +-58, +-15, +-28, +-52, +-29, +-38, +-58, +-14, +-28, +-49, +-34, +-44, +-65, +-24, +-36, +-57, +-43, +-57, +-78, +-36, +-50, +-76, +-31, +-45, +-70, +-47, +-64, +-85, +-19, +-21, +-55, + -4, +-12, +-40, + 0, +-12, +-36, +-19, +-16, +-41, + 8, + 8, +-17, + -7, + -6, +-28, +-13, +-45, +-74, + 40, + 6, +-27, + 29, + -8, +-46, + 24, + -1, +-21, + 90, + 66, + 40, + 59, + 23, +-12, + 68, + 33, + 0, + 73, + 43, + 15, + 89, + 63, + 38, + 71, + 46, + 20, + 50, + 1, +-77, + 90, + 51, +-44, + 92, + 63, + 15, + 17, + 12, +-44, +-49, + 2, +-33, + 1, + -3, +-27, + 31, +-12, +-60, + 51, + -2, +-67, + 62, + 19, +-25, + 62, + 29, + -8, + 61, + 35, + 5, + 49, + 30, + -1, + 47, + 32, + 3, + 51, + 42, + 17, + 5, + 27, +-10, + 52, + 46, + 31, + 52, + 38, + 22, + 68, + 54, + 38, + 58, + 58, + 40, + 86, + 86, + 77, +103, + 99, + 93, +104, + 99, + 93, +104, +100, + 91, +106, + 99, + 93, + 95, + 88, + 76, + 60, + 15, + -8, +-17, +-59, +-100, + 1, +-40, +-85, + 19, +-22, +-66, + 21, +-20, +-57, + 34, + -6, +-49, + 53, + 22, +-12, + 24, + -4, +-30, + 44, + 21, + -5, + 46, + 9, +-33, + 45, + 7, +-38, + 48, + 9, +-34, + 44, + 0, +-50, + 42, + -5, +-63, + 58, + 15, +-35, + 58, + 19, +-24, + 55, + 25, + -8, + 49, + 26, + 1, + 59, + 44, + 19, + 62, + 40, + 18, + 56, + 12, +-12, + 64, + 15, + -8, + 68, + 27, + 4, + 76, + 55, + 32, + 58, + 45, + 18, + 66, + 51, + 27, + 56, + 32, + 7, + 60, + 30, + -3, + 63, + 28, +-11, + 58, + 21, +-22, + 61, + 18, +-38, + 69, + 30, +-22, + 64, + 28, +-13, + 66, + 34, + -5, + 65, + 35, + 2, + 72, + 48, + 21, + 64, + 40, + 13, + 63, + 33, + 2, + 58, + 25, +-11, + 41, + 4, +-28, + 23, +-18, +-55, + 19, +-27, +-73, + 27, + -6, +-43, +-36, +-52, +-82, +-11, +-22, +-41, +-25, +-35, +-52, +-20, +-30, +-51, +-30, +-36, +-58, +-16, +-24, +-45, +-40, +-50, +-70, +-29, +-40, +-60, +-32, +-51, +-71, +-49, +-61, +-84, +-22, +-34, +-55, +-44, +-60, +-83, +-21, +-22, +-55, +-16, +-17, +-48, +-44, +-40, +-71, +-56, +-46, +-74, + -3, + 0, +-26, +-11, + -8, +-31, +-23, +-44, +-68, + 38, + 4, +-29, + 29, + -7, +-44, + 5, +-33, +-67, + 71, + 47, + 25, + 91, + 64, + 37, + 92, + 60, + 31, + 89, + 53, + 16, + 85, + 50, + 9, + 88, + 62, + 20, + 58, + 20, +-14, + 30, +-16, +-77, + 41, + -4, +-92, + 27, +-31, +-98, + 41, +-19, +-121, + 64, + 6, +-74, + 72, + 41, + 11, + 82, + 67, + 48, + 86, + 74, + 57, + 86, + 76, + 63, + 86, + 77, + 63, + 78, + 72, + 56, + 48, + 45, + 25, + 58, + 43, + 19, + 38, + 16, +-15, + 48, + 38, + 22, + 60, + 49, + 32, + 63, + 50, + 34, + 58, + 49, + 33, + 98, + 88, + 73, + 66, + 53, + 45, + 87, + 85, + 79, +103, + 99, + 93, +101, + 89, + 72, +100, + 52, + -8, + 74, + 16, + 9, + 3, +-35, +-70, +-10, +-49, +-89, + -1, +-34, +-70, + 16, +-16, +-47, + 41, + 10, +-20, + 44, + 23, + -1, +-10, +-40, +-65, + 36, + 12, +-14, + 57, + 29, + -2, + 51, + 18, +-13, + 51, + 18, +-21, + 50, + 10, +-32, + 55, + 16, +-25, + 49, + 3, +-50, + 52, + 11, +-31, + 54, + 18, +-18, + 51, + 2, +-53, + 48, + 7, +-30, + 67, + 45, + 21, + 54, + 14, +-32, + 71, + 44, + 7, + 63, + 32, + -5, + 53, + 10, +-38, + 78, + 60, + 33, + 47, + 5, +-31, + 60, + 13, +-38, + 57, + 22, +-12, + 67, + 30, +-10, + 60, + 17, +-35, + 67, + 30, +-12, + 68, + 33, + -5, + 72, + 47, + 16, + 57, + 26, + -4, + 72, + 48, + 22, + 70, + 54, + 36, + 55, + 43, + 27, + 72, + 55, + 34, + 51, + 21, + -5, + 66, + 41, + 17, + 60, + 26, +-16, + 37, + -1, +-37, + 25, + -8, +-43, +-45, +-59, +-84, +-27, +-40, +-62, +-27, +-36, +-54, +-30, +-40, +-62, +-22, +-35, +-56, +-30, +-43, +-61, +-30, +-41, +-62, +-29, +-40, +-60, +-46, +-59, +-79, +-46, +-57, +-80, +-36, +-51, +-74, +-53, +-68, +-90, +-36, +-36, +-67, +-10, +-13, +-43, +-41, +-36, +-65, +-103, +-70, +-104, +-15, +-10, +-35, +-15, +-11, +-35, +-36, +-47, +-69, + 36, + 3, +-31, + 33, + -4, +-40, + 29, + -6, +-33, + 54, + 17, +-15, + 58, + 24, + -8, + 48, + 11, +-21, + 69, + 40, + 14, + 83, + 62, + 37, + 64, + 34, + 8, + 57, + 11, +-21, + 52, + -9, +-80, + 54, +-15, +-128, + 65, + 3, +-128, + 75, + 36, + -6, + 80, + 49, + 30, + 88, + 57, + 41, + 86, + 58, + 44, + 85, + 63, + 50, + 87, + 67, + 56, + 87, + 73, + 61, + 56, + 59, + 42, + 78, + 77, + 64, + 93, + 88, + 78, + 81, + 76, + 67, + 25, + 20, + 7, + 51, + 46, + 31, + 61, + 46, + 28, + 57, + 41, + 23, + 65, +-33, +-43, + 44, +-64, +-66, + 2, +-66, +-68, + 59, + 32, + 3, +100, + 53, +-34, + 97, + 21, + 16, + 93, + 57, + 49, + 6, +-30, +-59, + 5, +-27, +-57, + 4, +-30, +-65, +-13, +-41, +-72, +-19, +-33, +-57, +-14, +-17, +-36, +-17, +-51, +-82, + -4, +-17, +-33, + 27, + 20, + 8, + 45, + 20, + -2, + 57, + 27, + -3, + 56, + 25, + -4, + 44, + 9, +-19, + 61, + 21, +-20, + 75, + 39, + -3, + 50, + 11, +-31, + 60, + 31, + 3, + 37, +-10, +-48, + 61, + 18, +-31, + 58, + 19, +-23, + 58, + 11, +-43, + 58, + 17, +-27, + 68, + 36, + -5, + 53, + 12, +-30, + 48, + 1, +-48, + 70, + 39, + 4, + 60, + 22, +-14, + 72, + 39, + -4, + 69, + 30, +-16, + 62, + 27, + -5, + 49, + 12, +-19, + 69, + 39, + 4, + 56, + 33, + 11, + 56, + 50, + 37, + 31, + 30, + 18, + 38, + 34, + 20, + 32, + 31, + 16, + 39, + 33, + 19, + 57, + 48, + 33, + 63, + 35, + 6, + 49, + 20, + -7, + 31, + 1, +-26, + 9, +-16, +-46, +-29, +-44, +-67, +-44, +-57, +-78, +-29, +-42, +-67, +-24, +-38, +-60, +-20, +-30, +-54, +-47, +-56, +-80, +-26, +-38, +-65, +-54, +-67, +-83, +-45, +-58, +-77, +-34, +-50, +-75, +-57, +-68, +-91, +-16, +-28, +-54, +-21, +-22, +-54, +-35, +-32, +-61, +-113, +-73, +-110, +-26, +-19, +-45, +-19, +-14, +-38, +-48, +-58, +-79, + 37, + 3, +-30, + 30, + -7, +-40, + 20, +-13, +-38, + 93, + 70, + 47, + 85, + 62, + 39, + 78, + 53, + 28, + 62, + 25, +-20, + 51, + 7, +-55, + 37, +-31, +-81, + 37, +-60, +-128, + 53, +-32, +-128, + 63, + -8, +-128, + 70, + 18, +-42, + 61, +-10, +-24, + 76, + -1, +-14, + 76, + 6, + -6, + 83, + 28, + 17, + 90, + 53, + 43, + 89, + 64, + 53, + 90, + 70, + 60, + 78, + 67, + 55, + 78, + 75, + 66, + 94, + 89, + 83, + 95, + 92, + 86, + 56, + 53, + 45, + 18, + 20, + 12, + 36, + 25, + 8, + 62, + 50, + 32, + 62, + 25, + 10, + 30, +-30, +-39, +-10, +-104, +-113, + 40, +-24, +-28, + 94, + 59, + 57, + 87, + 51, + 49, + 86, + 31, + 22, + 5, +-19, +-47, + 0, +-15, +-40, + -8, +-21, +-45, + 1, +-21, +-52, +-32, +-52, +-83, +-35, +-64, +-92, +-14, +-52, +-76, + 32, + -1, +-26, + 30, + 9, +-17, + 37, + 24, + -7, + 39, + 34, + 19, + 55, + 48, + 32, + 52, + 33, + 11, + 68, + 51, + 27, + 74, + 50, + 21, + 72, + 46, + 20, + 70, + 44, + 19, + 75, + 44, + 10, + 63, + 30, + -2, + 68, + 41, + 13, + 69, + 35, + -5, + 57, + 14, +-39, + 75, + 49, + 17, + 66, + 37, + 9, + 75, + 48, + 16, + 77, + 57, + 31, + 71, + 46, + 21, + 79, + 59, + 32, + 73, + 47, + 21, + 64, + 43, + 18, + 71, + 58, + 38, + 55, + 48, + 32, + 37, + 30, + 13, + 39, + 25, + -3, + 43, + 30, + 7, + 50, + 25, + -5, + 29, + 8, +-19, + 49, + 13, +-11, + 34, + 16, +-13, + 53, + 44, + 19, + 46, + 41, + 25, + 75, + 60, + 39, + 40, + 15, +-13, + 61, + 31, + -5, + 51, + 20, +-17, + 33, + 4, +-31, + -2, +-33, +-69, +-13, +-49, +-87, +-30, +-62, +-94, +-44, +-67, +-92, +-55, +-76, +-93, +-58, +-72, +-91, +-32, +-48, +-69, +-61, +-74, +-96, +-32, +-36, +-63, +-37, +-35, +-65, +-27, +-23, +-55, +-114, +-82, +-112, +-35, +-28, +-53, +-34, +-28, +-50, +-67, +-68, +-90, + 33, + 0, +-32, + 29, + -8, +-41, + 0, +-35, +-65, + 93, + 68, + 43, + 85, + 61, + 34, + 53, + 4, +-86, + 61, + 12, +-84, + 64, + 19, +-71, + 72, + 37, +-19, + 63, + 16, +-10, + 55, +-37, +-103, + 64, +-18, +-128, + 41, +-49, +-86, + 58, +-42, +-52, + 60, +-32, +-46, + 72, +-18, +-29, + 73, +-14, +-23, + 85, + 16, + 7, + 91, + 55, + 46, + 93, + 62, + 54, + 92, + 75, + 66, + 33, + 51, + 37, + 83, + 83, + 75, + 93, + 91, + 85, + 77, + 75, + 69, + -9, + -7, +-13, + -3, + -4, +-17, + 64, + 50, + 33, + 68, + 51, + 33, + 51, + 30, + 15, + 63, + 54, + 53, + 66, + 18, + 21, + 80, + 23, + 27, + 83, + 72, + 68, + 81, + 52, + 41, + 15, + -8, +-38, + 15, + -4, +-30, + 13, + -5, +-33, + 2, +-18, +-50, + -4, +-29, +-59, +-18, +-44, +-70, +-19, +-33, +-61, + 24, + -1, +-31, + 36, + 16, +-13, + 24, + 10, +-20, + 35, + 30, + 13, + 60, + 47, + 28, + 50, + 32, + 12, + 65, + 46, + 23, + 74, + 48, + 21, + 79, + 59, + 32, + 80, + 56, + 23, + 70, + 40, + 6, + 68, + 36, + 4, + 72, + 47, + 22, + 77, + 50, + 14, + 65, + 25, +-29, + 77, + 46, + 11, + 72, + 47, + 23, + 66, + 34, + -2, + 74, + 44, + 9, + 77, + 59, + 32, + 74, + 53, + 28, + 77, + 57, + 28, + 70, + 53, + 31, + 50, + 37, + 18, + 56, + 50, + 36, + 48, + 43, + 30, + 43, + 35, + 11, + 42, + 18, +-10, + 68, + 41, + 11, + 42, + 23, + -3, + 50, + 12, +-15, + 44, + 22, +-10, + 30, + 19, + -5, + 26, + 21, + 9, + 43, + 38, + 22, + 57, + 45, + 24, + 55, + 32, + 4, + 64, + 32, + -3, + 69, + 41, + 5, + 53, + 20, +-21, + 44, + 3, +-37, + 32, +-10, +-50, + 42, + 4, +-38, + 23, +-19, +-61, + 11, +-35, +-83, + 8, +-29, +-68, + -1, +-33, +-66, +-88, +-74, +-101, +-60, +-54, +-80, +-25, +-21, +-53, +-65, +-57, +-80, +-44, +-35, +-58, +-38, +-30, +-52, +-53, +-50, +-68, + 28, + -5, +-37, + 27, +-12, +-44, + 0, +-38, +-68, + 79, + 52, + 29, + 91, + 67, + 43, + 55, + 5, +-82, + 63, + 14, +-86, + 68, + 25, +-69, + 76, + 38, +-38, + 80, + 53, + 4, + 85, + 74, + 52, + 69, + 28, +-15, +-15, +-48, +-80, + 5, +-39, +-65, + 61, + 3, + -6, + 67, + 8, + -3, + 68, + 0, + -8, + 70, + -7, +-13, + 87, + 33, + 29, + 92, + 77, + 72, + 94, + 81, + 74, + 79, + 58, + 52, + 30, + 47, + 36, + 81, + 77, + 73, + 36, + 53, + 40, + 35, + 41, + 30, + -6, + -4, +-14, + 34, + 17, + -2, + 56, + 42, + 24, + 69, + 52, + 32, + 48, + 8, + -4, + 70, + 31, + 35, + 60, + 14, + 14, + 76, + 59, + 54, + 54, + 24, + 7, + 23, +-16, +-57, + 22, +-15, +-56, + 19, +-19, +-53, + 26, + 14, + -9, + 6, + 0, +-18, + 5, + 2, +-18, + 39, + 30, + 8, + 31, + 28, + 9, + 37, + 33, + 21, + 64, + 43, + 23, + 63, + 34, + 5, + 69, + 41, + 10, + 64, + 31, + -4, + 68, + 32, + -7, + 76, + 44, + 11, + 40, + -1, +-37, + 78, + 54, + 24, + 62, + 29, + -4, + 62, + 21, +-29, + 76, + 42, + -8, + 59, + 19, +-34, + 47, + 5, +-33, + 75, + 42, + -2, + 68, + 38, + 1, + 61, + 24, +-22, + 56, + 23, + -8, + 80, + 60, + 34, + 59, + 24, +-18, + 57, + 22, +-13, + 72, + 42, + 3, + 66, + 39, + 9, + 70, + 40, + 11, + 71, + 42, + 12, + 61, + 32, + 3, + 36, + 34, + 23, + 23, + 23, + 6, + 45, + 39, + 13, + 49, + 44, + 17, + 29, + 29, + 8, + 39, + 35, + 20, + 51, + 27, + 0, + 73, + 52, + 24, + 61, + 33, + 3, + 58, + 26, + -8, + 70, + 37, + -4, + 48, + 10, +-30, + 33, +-10, +-49, + 55, + 20, +-16, + 25, +-19, +-60, + 28, +-17, +-58, + 39, + -2, +-43, + 34, +-10, +-59, + 27, +-19, +-67, + 18, +-28, +-71, +-47, +-45, +-74, +-92, +-77, +-102, +-41, +-34, +-61, +-38, +-32, +-58, +-57, +-47, +-66, +-42, +-34, +-54, +-56, +-48, +-62, + 18, +-15, +-47, + 27, +-13, +-44, + 4, +-35, +-67, + 65, + 38, + 16, + 91, + 68, + 45, + 58, + 8, +-65, + 66, + 19, +-97, + 73, + 30, +-81, + 80, + 40, +-46, + 80, + 44, +-28, + 80, + 48, +-15, + 35, + 24, +-22, +-10, + 8, +-15, + 11, + 27, + 5, + 24, + 30, + 16, + 80, + 75, + 63, + 83, + 78, + 67, + 87, + 78, + 70, + 85, + 77, + 71, + 85, + 80, + 77, + 87, + 81, + 78, + 55, + 62, + 56, + 18, + 36, + 28, + 60, + 50, + 50, + -6, + 25, + 4, + 65, + 70, + 63, + 28, + 34, + 26, + -1, + -6, +-17, + 45, + 29, + 12, + 54, + 40, + 24, + 59, + 34, + 14, + 41, +-29, +-30, + 48, + 40, + 37, + 39, +-12, +-17, + 46, + 9, +-32, + 25, +-16, +-65, + 22, +-22, +-67, + 33, + -3, +-42, + 21, +-17, +-49, + 51, + 30, + 3, + 39, + 28, + 10, + 50, + 41, + 27, + 68, + 53, + 31, + 59, + 35, + 7, + 67, + 36, + 6, + 62, + 19, +-31, + 64, + 23, +-22, + 72, + 39, + 2, + 75, + 37, +-22, + 67, + 32, + -4, + 71, + 46, + 15, + 73, + 38, +-11, + 57, + 4, +-55, + 67, + 39, + 12, + 68, + 39, + 3, + 54, + 16, +-23, + 63, + 29, + -3, + 58, + 24, +-13, + 58, + 21, +-19, + 77, + 54, + 26, + 51, + 7, +-39, + 62, + 16, +-44, + 67, + 31, + -8, + 71, + 43, + 9, + 60, + 19, +-28, + 72, + 40, + -4, + 67, + 35, + -7, + 64, + 26, +-21, + 67, + 35, + -3, + 66, + 42, + 15, + 70, + 46, + 23, + 68, + 59, + 40, + 34, + 34, + 23, + 57, + 46, + 28, + 70, + 43, + 14, + 59, + 24, + -9, + 66, + 30, +-16, + 60, + 18, +-31, + 63, + 30, +-11, + 65, + 25, +-31, + 60, + 23, +-23, + 57, + 20, +-22, + 53, + 13, +-36, + 41, + -3, +-58, + 48, + 12, +-24, + 49, + 14, +-25, + 42, + 2, +-44, + 35, + -7, +-54, + 17, +-29, +-68 +}; diff --git a/examples/app_profiling/src/image2.h b/examples/app_profiling/src/image2.h new file mode 100644 index 000000000..4daa44d76 --- /dev/null +++ b/examples/app_profiling/src/image2.h @@ -0,0 +1,27650 @@ +int8_t image2[96*96*3] = { +122, +122, +122, +122, +122, +122, +122, +122, +122, +121, +121, +121, +123, +123, +123, +124, +124, +124, +122, +122, +122, +122, +122, +122, +119, +119, +119, +118, +118, +118, +123, +123, +123, +121, +121, +121, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +121, +122, +122, +122, +120, +120, +120, +121, +121, +121, +124, +122, +123, +125, +122, +123, +125, +122, +123, +124, +121, +122, +124, +121, +122, +123, +121, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +125, +120, +122, +125, +120, +122, +121, +122, +122, +120, +123, +123, +121, +122, +124, +124, +122, +124, +120, +122, +121, +120, +122, +121, +122, +122, +120, +125, +124, +121, +124, +123, +118, +123, +120, +117, +117, +113, +113, +115, +111, +111, +116, +112, +112, +117, +113, +113, +120, +117, +117, +123, +121, +122, +121, +121, +124, +122, +121, +123, +119, +119, +120, +119, +119, +119, +123, +121, +121, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +124, +121, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +122, +121, +121, +121, +121, +121, +121, +122, +121, +121, +121, +118, +119, +123, +120, +121, +123, +120, +121, +123, +120, +121, +124, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +123, +120, +121, +122, +121, +121, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +118, +118, +118, +117, +117, +117, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +113, +113, +113, +116, +116, +116, +119, +117, +118, +119, +117, +118, +119, +116, +117, +118, +115, +116, +118, +115, +116, +118, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +119, +115, +116, +117, +116, +116, +113, +118, +116, +111, +115, +114, +116, +117, +118, +117, +114, +116, +118, +115, +114, +107, +105, +102, + 92, + 88, + 85, + 80, + 75, + 71, + 68, + 62, + 56, + 68, + 60, + 55, + 46, + 36, + 32, + 29, + 19, + 14, + 33, + 23, + 18, + 38, + 28, + 24, + 54, + 45, + 40, + 85, + 76, + 73, +104, + 98, + 96, +117, +112, +111, +120, +117, +116, +119, +117, +118, +116, +116, +117, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +117, +116, +116, +113, +111, +111, +119, +117, +118, +119, +116, +117, +118, +115, +116, +118, +115, +116, +119, +116, +117, +120, +117, +118, +120, +117, +118, +117, +115, +115, +117, +114, +115, +117, +114, +115, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +117, +117, +116, +116, +116, +114, +114, +114, +113, +113, +113, +116, +116, +116, +117, +117, +117, +116, +116, +116, +115, +115, +115, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +114, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +113, +114, +114, +114, +110, +110, +110, +108, +108, +108, +115, +113, +114, +116, +114, +114, +116, +114, +114, +119, +116, +117, +119, +116, +117, +118, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +117, +117, +114, +118, +117, +112, +119, +117, +113, +119, +115, +114, +113, +111, +106, + 99, + 97, + 77, + 68, + 64, + 59, + 50, + 45, + 58, + 47, + 41, + 44, + 32, + 25, + 33, + 19, + 11, + 25, + 9, + 0, + 7, +-12, +-21, + 4, +-15, +-24, + 11, + -9, +-18, + 2, +-17, +-26, + 9, +-10, +-20, + 14, + -3, +-12, + 30, + 16, + 8, + 60, + 48, + 43, + 87, + 79, + 76, +108, +103, +103, +116, +114, +116, +118, +115, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +116, +116, +116, +113, +114, +116, +114, +115, +119, +116, +117, +118, +116, +117, +118, +116, +117, +118, +115, +116, +118, +115, +116, +117, +115, +116, +116, +113, +114, +115, +112, +113, +115, +112, +113, +113, +113, +113, +115, +115, +115, +117, +117, +117, +118, +118, +118, +118, +118, +118, +112, +112, +112, +115, +115, +115, +117, +117, +117, +119, +119, +119, +117, +117, +117, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +119, +116, +117, +120, +117, +118, +116, +114, +114, +118, +115, +116, +118, +115, +116, +118, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +117, +117, +117, +117, +117, +117, +115, +116, +117, +115, +119, +119, +116, +120, +117, +113, +113, +110, + 84, + 75, + 72, + 57, + 41, + 38, + 43, + 25, + 19, + 33, + 14, + 7, + 20, + 0, + -7, + 23, + 1, + -8, + 6, +-17, +-26, +-12, +-36, +-47, +-22, +-49, +-60, +-16, +-43, +-55, + -5, +-32, +-43, + -9, +-36, +-48, +-13, +-40, +-51, +-11, +-36, +-47, +-11, +-33, +-43, +-14, +-33, +-41, + -2, +-17, +-22, + 32, + 21, + 19, + 92, + 83, + 82, +120, +115, +116, +121, +118, +119, +119, +116, +117, +119, +116, +117, +118, +115, +116, +118, +115, +116, +117, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +117, +116, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +117, +118, +118, +116, +117, +117, +114, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +116, +116, +116, +112, +112, +112, +114, +114, +114, +115, +115, +115, +115, +115, +115, +113, +113, +113, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +115, +115, +115, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +118, +115, +116, +118, +116, +117, +115, +112, +113, +118, +115, +116, +118, +115, +116, +117, +115, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +117, +119, +116, +116, +118, +118, +116, +115, + 93, + 85, + 83, + 52, + 32, + 29, + 48, + 20, + 18, + 36, + 11, + 4, + 17, + -9, +-17, + 31, + 4, + -5, + 13, +-14, +-25, + 6, +-24, +-36, +-15, +-44, +-57, +-11, +-39, +-50, + 11, +-17, +-28, + 28, + -1, +-12, + 22, + -7, +-18, + 3, +-26, +-36, +-16, +-42, +-52, +-33, +-55, +-64, +-24, +-46, +-55, +-23, +-44, +-53, +-15, +-35, +-43, + 13, + -6, +-13, + 95, + 89, + 88, +118, +115, +116, +119, +117, +117, +119, +116, +117, +120, +117, +118, +119, +117, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +118, +117, +117, +117, +116, +116, +116, +116, +116, +116, +117, +116, +116, +118, +116, +116, +118, +116, +116, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +115, +116, +117, +114, +115, +115, +112, +113, +116, +114, +114, +117, +114, +115, +117, +114, +115, +116, +115, +116, +111, +111, +110, +112, +112, +111, +113, +113, +112, +114, +113, +113, +114, +113, +113, +108, +107, +107, +111, +110, +110, +115, +114, +114, +115, +114, +114, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +113, +114, +114, +114, +114, +114, +114, +114, +114, +114, +115, +115, +115, +116, +116, +116, +117, +117, +117, +117, +116, +116, +117, +116, +116, +117, +116, +116, +116, +115, +116, +116, +116, +116, +117, +116, +116, +116, +113, +114, +117, +114, +115, +114, +111, +112, +115, +112, +113, +115, +112, +113, +114, +112, +113, +113, +113, +112, +113, +113, +112, +114, +113, +113, +114, +114, +113, +114, +114, +114, +114, +114, +113, +114, +114, +113, +114, +114, +113, +116, +115, +115, +116, +115, +115, +116, +115, +115, +117, +114, +116, +116, +112, +114, +105, + 99, + 98, + 62, + 49, + 47, + 56, + 30, + 29, + 43, + 10, + 7, + 17, +-13, +-22, + 6, +-23, +-36, + -3, +-34, +-49, + 11, +-22, +-37, + 28, + -5, +-18, + 31, + 1, +-11, + 45, + 19, + 8, + 67, + 41, + 31, + 69, + 44, + 33, + 59, + 31, + 20, + 39, + 11, + -3, + 0, +-27, +-40, +-18, +-41, +-52, +-20, +-41, +-51, +-34, +-56, +-64, +-22, +-44, +-52, + -7, +-30, +-41, + 18, + 8, + 5, + 98, + 92, + 91, +117, +113, +112, +118, +115, +115, +118, +115, +115, +118, +114, +115, +116, +115, +115, +116, +115, +115, +115, +115, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +115, +114, +114, +114, +114, +113, +113, +112, +112, +113, +112, +112, +113, +112, +112, +114, +111, +111, +114, +111, +111, +113, +110, +111, +112, +110, +110, +112, +110, +110, +113, +111, +111, +113, +110, +111, +112, +109, +110, +113, +110, +111, +113, +111, +111, +113, +111, +111, +112, +111, +111, +114, +112, +110, +114, +112, +110, +114, +112, +110, +113, +111, +109, +115, +113, +111, +111, +109, +107, +113, +111, +110, +114, +112, +110, +114, +112, +110, +114, +112, +111, +114, +112, +111, +114, +112, +111, +115, +113, +111, +115, +113, +111, +114, +113, +112, +113, +113, +113, +113, +113, +113, +112, +112, +112, +112, +112, +112, +114, +114, +114, +116, +114, +114, +116, +113, +114, +116, +113, +114, +115, +112, +113, +114, +111, +112, +113, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +111, +112, +114, +112, +111, +114, +112, +111, +115, +113, +112, +115, +113, +111, +116, +114, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +116, +114, +113, +117, +115, +113, +117, +115, +113, +120, +115, +114, +110, +104, +105, + 53, + 46, + 48, + 77, + 61, + 63, + 71, + 46, + 45, + 50, + 16, + 11, + 30, + -5, +-16, + 17, +-19, +-38, + 25, +-13, +-38, + 39, + 3, +-19, + 61, + 28, + 15, + 69, + 40, + 31, + 76, + 52, + 39, + 78, + 55, + 44, + 80, + 56, + 43, + 74, + 46, + 29, + 60, + 25, + 4, + 21, +-10, +-32, +-28, +-50, +-68, +-26, +-44, +-55, +-29, +-43, +-50, +-36, +-50, +-55, +-38, +-55, +-61, +-30, +-49, +-57, + 25, + 12, + 5, +105, + 99, + 92, +117, +115, +111, +118, +114, +114, +120, +113, +115, +118, +115, +114, +116, +114, +113, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +113, +111, +110, +113, +111, +110, +113, +111, +110, +112, +110, +109, +112, +110, +109, +111, +109, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +112, +110, +109, +113, +111, +110, +113, +111, +110, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +110, +108, +106, +110, +108, +106, +110, +108, +106, +112, +110, +108, +111, +109, +108, +106, +104, +102, +106, +104, +102, +111, +109, +108, +113, +111, +109, +114, +112, +110, +114, +112, +110, +115, +113, +111, +116, +114, +112, +116, +114, +112, +115, +114, +113, +114, +114, +114, +114, +114, +114, +113, +113, +113, +113, +113, +113, +115, +115, +115, +117, +115, +116, +118, +115, +116, +118, +115, +116, +111, +108, +109, +113, +110, +111, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +117, +114, +115, +117, +114, +115, +117, +115, +115, +117, +115, +113, +117, +115, +113, +118, +116, +114, +115, +113, +112, +116, +114, +113, +117, +115, +114, +116, +114, +113, +116, +114, +113, +117, +115, +114, +117, +115, +114, +117, +115, +114, +116, +114, +114, + 75, + 71, + 74, + 59, + 49, + 53, + 85, + 67, + 69, + 65, + 39, + 35, + 52, + 18, + 9, + 42, + -3, +-17, + 40, + -8, +-27, + 50, + 4, +-21, + 62, + 21, + -3, + 69, + 34, + 16, + 76, + 46, + 32, + 83, + 55, + 42, + 79, + 52, + 40, + 74, + 47, + 34, + 76, + 45, + 30, + 66, + 29, + 9, + 26, + -8, +-29, +-43, +-66, +-84, +-56, +-73, +-85, +-46, +-59, +-66, +-45, +-57, +-62, +-45, +-59, +-64, +-52, +-68, +-74, +-37, +-49, +-56, + 58, + 51, + 46, +113, +110, +106, +118, +115, +115, +119, +114, +115, +115, +112, +111, +113, +111, +110, +112, +110, +109, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +112, +115, +113, +112, +114, +112, +111, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +107, +109, +107, +105, +108, +106, +105, +109, +107, +105, +111, +109, +107, +112, +110, +108, +110, +108, +106, +111, +109, +107, +113, +111, +109, +115, +113, +111, +114, +112, +110, +114, +112, +110, +115, +113, +111, +117, +115, +113, +117, +115, +113, +116, +115, +114, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +116, +117, +117, +117, +118, +116, +117, +119, +116, +117, +119, +116, +117, +117, +115, +116, +118, +116, +117, +120, +117, +118, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +119, +116, +117, +118, +116, +116, +119, +117, +115, +119, +117, +115, +119, +117, +116, +115, +113, +111, +116, +114, +113, +118, +115, +114, +117, +115, +114, +117, +115, +114, +118, +116, +114, +118, +116, +114, +118, +116, +114, +111, +109, +111, + 50, + 44, + 48, + 87, + 72, + 76, + 72, + 48, + 48, + 67, + 35, + 27, + 58, + 21, + 6, + 57, + 1, +-18, + 58, + 0, +-23, + 61, + 7, +-20, + 63, + 16, +-10, + 71, + 32, + 9, + 75, + 41, + 20, + 81, + 46, + 29, + 78, + 45, + 30, + 72, + 40, + 26, + 75, + 40, + 23, + 63, + 24, + 3, + 32, + -2, +-26, +-32, +-54, +-75, +-69, +-85, +-100, +-63, +-74, +-81, +-46, +-54, +-59, +-41, +-51, +-55, +-37, +-46, +-51, +-21, +-30, +-34, + 19, + 12, + 9, + 97, + 92, + 90, +115, +111, +111, +114, +110, +111, +114, +111, +110, +113, +111, +109, +112, +110, +108, +113, +110, +109, +113, +111, +109, +113, +111, +109, +111, +109, +107, +111, +109, +108, +113, +111, +110, +116, +114, +112, +116, +114, +112, +115, +113, +111, +114, +112, +110, +114, +112, +110, +113, +111, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +111, +109, +107, +110, +108, +107, +110, +108, +107, +111, +109, +108, +107, +105, +103, +106, +104, +103, +106, +104, +103, +108, +106, +105, +108, +106, +105, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +108, +107, +112, +110, +108, +112, +110, +108, +112, +111, +110, +112, +112, +112, +112, +112, +112, +113, +113, +113, +113, +113, +113, +113, +113, +113, +116, +114, +115, +116, +114, +115, +116, +114, +115, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +118, +115, +116, +115, +112, +113, +117, +115, +116, +117, +115, +115, +117, +115, +114, +117, +115, +114, +117, +115, +114, +115, +113, +112, +115, +113, +111, +117, +115, +113, +116, +114, +113, +116, +114, +113, +116, +114, +112, +116, +114, +113, +116, +114, +112, + 89, + 85, + 85, + 73, + 61, + 63, + 81, + 57, + 58, + 65, + 31, + 24, + 55, + 15, + -2, + 49, + 7, +-21, + 57, + 2, +-28, + 60, + 2, +-28, + 65, + 8, +-22, + 63, + 12, +-18, + 62, + 20, + -9, + 70, + 31, + 2, + 78, + 37, + 11, + 72, + 35, + 12, + 70, + 35, + 14, + 73, + 36, + 12, + 67, + 26, + -1, + 46, + 11, +-17, +-19, +-41, +-64, +-63, +-79, +-95, +-57, +-64, +-72, + -9, +-14, +-19, + -8, +-15, +-18, +-32, +-36, +-38, + -1, + -5, + -6, + 7, + 0, + -1, + 75, + 68, + 68, +113, +109, +108, +111, +110, +108, +112, +110, +109, +113, +111, +109, +112, +110, +108, +110, +108, +106, +109, +107, +105, +110, +108, +106, +107, +105, +103, +107, +105, +103, +109, +107, +106, +110, +108, +107, +110, +108, +107, +111, +108, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +109, +107, +106, +108, +106, +105, +108, +106, +104, +108, +106, +104, +107, +105, +103, +112, +110, +108, +111, +109, +108, +111, +109, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +111, +109, +114, +111, +110, +114, +111, +110, +113, +112, +112, +113, +113, +113, +113, +113, +113, +114, +114, +114, +114, +114, +114, +114, +114, +114, +115, +112, +113, +115, +112, +113, +115, +112, +113, +116, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +116, +114, +114, +111, +108, +109, +116, +114, +112, +116, +114, +112, +115, +113, +112, +117, +115, +113, +114, +112, +111, +116, +114, +112, +115, +113, +112, +115, +113, +112, +114, +112, +111, +114, +112, +111, +113, +111, +110, + 69, + 61, + 58, + 79, + 62, + 59, + 61, + 28, + 23, + 53, + 8, + -5, + 49, + -1, +-27, + 49, + -1, +-38, + 51, + 1, +-38, + 56, + 3, +-34, + 59, + 5, +-29, + 59, + 7, +-26, + 58, + 12, +-21, + 63, + 21, +-15, + 67, + 24, +-13, + 61, + 21, +-13, + 69, + 32, + 1, + 69, + 31, + 0, + 61, + 20, +-14, + 38, + 3, +-29, +-20, +-43, +-68, +-58, +-72, +-89, +-69, +-76, +-85, +-68, +-71, +-75, +-31, +-34, +-36, + -8, + -8, + -9, + -7, + -8, + -8, + 12, + 5, + 7, + 60, + 51, + 52, +114, +109, +108, +113, +112, +110, +114, +112, +111, +114, +112, +111, +114, +112, +110, +111, +109, +107, +111, +109, +107, +112, +110, +108, +113, +111, +109, +112, +110, +109, +113, +110, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +111, +109, +108, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +109, +108, +110, +110, +108, +110, +110, +108, +112, +110, +109, +112, +109, +109, +112, +109, +109, +112, +110, +110, +112, +110, +110, +112, +110, +110, +113, +111, +111, +113, +111, +111, +114, +111, +111, +114, +111, +111, +114, +111, +111, +114, +112, +112, +114, +113, +113, +114, +113, +113, +115, +114, +114, +115, +114, +114, +115, +114, +114, +114, +112, +113, +114, +112, +112, +114, +112, +112, +117, +114, +115, +117, +114, +115, +117, +114, +115, +114, +112, +113, +114, +112, +113, +115, +112, +113, +117, +114, +115, +118, +115, +116, +115, +112, +112, +117, +115, +113, +117, +115, +113, +116, +114, +113, +115, +113, +112, +115, +113, +112, +116, +113, +111, +117, +112, +111, +115, +113, +111, +113, +113, +111, +114, +112, +110, +111, +108, +107, + 74, + 64, + 63, + 65, + 42, + 38, + 48, + 6, + -3, + 47, + -7, +-26, + 50, + -5, +-34, + 48, + -2, +-37, + 46, + 1, +-40, + 49, + 2, +-37, + 53, + 2, +-35, + 57, + 5, +-31, + 60, + 8, +-27, + 57, + 8, +-30, + 59, + 11, +-31, + 60, + 16, +-25, + 64, + 22, +-17, + 61, + 21, +-19, + 56, + 14, +-27, + 36, + 0, +-36, + -9, +-33, +-60, +-39, +-55, +-74, +-34, +-41, +-51, +-50, +-53, +-60, +-43, +-45, +-49, + -8, + -5, +-10, +-33, +-35, +-37, + 6, + -3, + -2, + 56, + 46, + 47, +111, +106, +104, +113, +112, +109, +114, +112, +110, +114, +112, +110, +114, +112, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +114, +112, +110, +113, +111, +109, +113, +111, +109, +112, +110, +109, +112, +110, +108, +112, +110, +109, +112, +110, +108, +112, +110, +108, +111, +109, +107, +110, +108, +107, +109, +107, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +110, +110, +110, +110, +111, +108, +110, +111, +108, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +111, +108, +109, +111, +108, +109, +115, +112, +113, +114, +111, +112, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +113, +114, +118, +115, +116, +118, +115, +116, +118, +115, +116, +116, +113, +114, +116, +113, +114, +116, +114, +115, +118, +115, +116, +118, +115, +116, +117, +115, +115, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +111, +115, +113, +111, +119, +113, +112, +120, +113, +113, +116, +115, +113, +114, +114, +112, +116, +114, +112, +104, + 98, + 98, + 64, + 52, + 53, + 59, + 33, + 29, + 44, + -2, +-17, + 48, + -9, +-33, + 50, + -5, +-33, + 47, + 0, +-30, + 46, + 1, +-37, + 49, + 2, +-36, + 52, + 3, +-34, + 57, + 5, +-32, + 63, + 9, +-27, + 62, + 8, +-29, + 60, + 9, +-33, + 59, + 9, +-33, + 60, + 13, +-30, + 59, + 15, +-29, + 57, + 14, +-31, + 34, + -3, +-41, +-16, +-43, +-71, +-40, +-58, +-78, +-46, +-55, +-68, +-38, +-43, +-51, +-60, +-63, +-71, +-34, +-33, +-41, +-25, +-27, +-33, +-19, +-27, +-31, + 30, + 21, + 19, +104, + 98, + 96, +112, +110, +107, +115, +113, +111, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +115, +113, +112, +113, +111, +110, +113, +110, +109, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +109, +107, +106, +110, +108, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +107, +105, +104, +110, +110, +110, +110, +111, +108, +110, +111, +108, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +111, +108, +109, +110, +107, +108, +113, +110, +111, +113, +110, +111, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +117, +114, +115, +117, +115, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +118, +115, +116, +117, +115, +115, +117, +115, +115, +117, +115, +115, +118, +115, +116, +118, +115, +116, +117, +115, +115, +116, +114, +112, +116, +114, +112, +115, +113, +111, +114, +112, +110, +114, +112, +110, +116, +111, +111, +117, +112, +112, +114, +114, +112, +112, +112, +110, +117, +114, +112, +101, + 93, + 93, + 67, + 52, + 51, + 66, + 40, + 31, + 58, + 13, + -5, + 56, + 1, +-25, + 53, + -1, +-30, + 47, + -1, +-31, + 47, + 3, +-34, + 52, + 7, +-31, + 56, + 10, +-28, + 60, + 11, +-25, + 62, + 13, +-24, + 61, + 11, +-28, + 59, + 9, +-35, + 60, + 10, +-34, + 61, + 13, +-32, + 62, + 14, +-31, + 60, + 13, +-32, + 39, + -2, +-41, +-16, +-47, +-75, +-41, +-62, +-83, +-56, +-69, +-83, +-52, +-58, +-69, +-65, +-70, +-80, +-58, +-60, +-70, +-56, +-61, +-69, +-30, +-40, +-45, + 16, + 6, + 4, +102, + 96, + 94, +106, +104, +102, +114, +112, +110, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +115, +113, +111, +113, +111, +109, +113, +110, +109, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +108, +109, +107, +106, +110, +108, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +106, +104, +103, +110, +110, +109, +110, +111, +108, +110, +111, +108, +112, +110, +111, +113, +110, +111, +113, +110, +111, +112, +109, +110, +107, +105, +105, +112, +110, +110, +111, +108, +109, +111, +108, +109, +112, +109, +110, +114, +112, +112, +114, +112, +112, +114, +111, +112, +114, +111, +112, +115, +113, +113, +115, +113, +113, +116, +113, +114, +116, +113, +114, +116, +113, +114, +116, +114, +114, +116, +114, +114, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +114, +115, +117, +115, +116, +118, +115, +116, +117, +114, +115, +117, +115, +115, +115, +113, +112, +117, +115, +113, +117, +115, +114, +117, +115, +113, +117, +115, +113, +117, +113, +112, +116, +113, +112, +114, +115, +112, +115, +116, +113, +117, +112, +111, +101, + 91, + 92, + 62, + 43, + 39, + 50, + 21, + 8, + 53, + 11, +-13, + 54, + 3, +-28, + 54, + 4, +-27, + 52, + 3, +-26, + 55, + 10, +-26, + 55, + 11, +-26, + 57, + 13, +-24, + 60, + 16, +-21, + 62, + 18, +-19, + 59, + 14, +-24, + 60, + 13, +-31, + 59, + 12, +-32, + 60, + 14, +-30, + 61, + 14, +-30, + 61, + 14, +-30, + 50, + 7, +-32, + 1, +-32, +-64, +-37, +-61, +-85, +-58, +-73, +-90, +-71, +-81, +-94, +-81, +-90, +-102, +-68, +-74, +-87, +-56, +-65, +-75, +-39, +-51, +-57, + 18, + 8, + 5, +108, +101, +100, +111, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +106, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +105, +108, +106, +105, +108, +106, +105, +109, +107, +105, +108, +108, +108, +108, +109, +106, +109, +109, +107, +112, +109, +110, +112, +109, +110, +112, +109, +110, +109, +106, +107, +103, +100, +101, +111, +108, +109, +111, +109, +110, +111, +109, +110, +112, +109, +110, +112, +109, +110, +112, +109, +110, +113, +110, +111, +109, +106, +107, +112, +110, +111, +114, +111, +112, +113, +110, +111, +113, +110, +111, +115, +112, +113, +115, +112, +113, +115, +112, +113, +115, +113, +113, +115, +112, +113, +115, +112, +113, +116, +113, +114, +116, +113, +114, +117, +114, +115, +111, +109, +109, +114, +111, +112, +114, +112, +112, +114, +112, +110, +114, +112, +110, +114, +112, +111, +113, +111, +110, +113, +111, +110, +113, +111, +110, +112, +112, +109, +110, +112, +109, +110, +111, +109, +116, +110, +109, +101, + 88, + 90, + 56, + 33, + 27, + 34, + 3, +-14, + 34, + -4, +-34, + 46, + 0, +-35, + 49, + 2, +-33, + 46, + -2, +-33, + 45, + 0, +-34, + 44, + 1, +-34, + 47, + 5, +-30, + 56, + 16, +-20, + 55, + 17, +-20, + 55, + 17, +-20, + 63, + 24, +-16, + 62, + 23, +-18, + 57, + 16, +-24, + 58, + 16, +-24, + 59, + 15, +-24, + 56, + 14, +-24, + 30, + -6, +-40, +-23, +-50, +-77, +-52, +-70, +-90, +-68, +-81, +-97, +-77, +-88, +-103, +-69, +-79, +-94, +-59, +-70, +-84, +-44, +-58, +-67, + 27, + 15, + 12, +108, +101, +100, +108, +107, +107, +109, +107, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +108, +106, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +107, +105, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +105, +105, +105, +106, +103, +105, +106, +104, +111, +108, +109, +111, +108, +109, +111, +108, +109, +110, +108, +108, +110, +107, +108, +110, +107, +108, +109, +106, +107, +109, +106, +107, +110, +107, +108, +111, +108, +109, +111, +108, +109, +111, +108, +109, +109, +106, +107, +112, +109, +110, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +110, +111, +113, +111, +111, +113, +111, +111, +113, +110, +111, +112, +109, +110, +112, +109, +110, +112, +109, +110, +107, +105, +106, +110, +108, +109, +113, +111, +111, +112, +110, +108, +111, +109, +107, +110, +108, +106, +111, +109, +107, +111, +109, +107, +110, +110, +108, +110, +111, +109, +109, +112, +109, +111, +110, +108, +111, +103, +103, + 47, + 32, + 35, + 2, +-23, +-31, + 2, +-29, +-49, + 22, +-15, +-48, + 36, + -7, +-46, + 41, + -6, +-41, + 39, + -9, +-41, + 37, + -7, +-40, + 37, + -5, +-39, + 27, +-13, +-47, + 22, +-15, +-50, + 26, + -9, +-45, + 30, + -3, +-39, + 36, + 5, +-32, + 50, + 18, +-18, + 53, + 18, +-17, + 56, + 18, +-16, + 57, + 17, +-16, + 59, + 17, +-18, + 49, + 10, +-25, + -7, +-36, +-64, +-50, +-70, +-91, +-63, +-78, +-95, +-70, +-83, +-100, +-73, +-85, +-103, +-63, +-77, +-92, +-33, +-49, +-59, + 29, + 17, + 13, +108, +101, +100, +105, +104, +103, +107, +105, +104, +107, +105, +104, +107, +105, +104, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +104, +102, +101, +103, +101, +100, +103, +101, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, +103, +101, +100, +103, +101, +100, +103, +101, + 99, +107, +106, +106, +108, +106, +104, +108, +106, +103, +110, +108, +107, +110, +108, +107, +110, +108, +107, +111, +109, +108, +111, +109, +108, +110, +108, +107, +109, +107, +107, +109, +107, +107, +110, +108, +107, +111, +109, +108, +110, +107, +106, +109, +107, +106, +107, +105, +104, +112, +109, +109, +111, +109, +108, +112, +110, +108, +113, +110, +110, +113, +110, +110, +113, +110, +110, +113, +110, +110, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +108, +111, +109, +108, +112, +110, +109, +114, +112, +110, +112, +110, +108, +110, +108, +107, +111, +109, +107, +112, +110, +108, +113, +111, +109, +111, +112, +108, +112, +111, +109, +115, +109, +110, +111, +110, +110, +109, +108, +104, + 45, + 32, + 28, +-12, +-31, +-42, +-32, +-52, +-71, +-25, +-49, +-77, + 9, +-22, +-56, + 32, + -9, +-44, + 40, + -9, +-41, + 35, + -7, +-39, + 24, +-15, +-48, + 3, +-34, +-67, + -9, +-43, +-78, + -4, +-36, +-69, + 9, +-22, +-54, + 17, +-15, +-45, + 34, + -1, +-33, + 48, + 11, +-23, + 53, + 16, +-18, + 55, + 20, +-13, + 58, + 19, +-15, + 49, + 10, +-25, +-10, +-38, +-67, +-49, +-66, +-90, +-58, +-73, +-93, +-60, +-79, +-97, +-49, +-77, +-91, + 15, +-24, +-38, + 27, +-10, +-23, + 40, + 33, + 28, +106, +106, +106, +115, +107, +107, +108, +105, +104, +110, +108, +106, +110, +108, +107, +109, +107, +106, +109, +107, +106, +108, +106, +105, +105, +103, +101, +106, +104, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +104, +105, +103, +102, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +105, +103, +101, +102, +100, + 99, +102, +100, + 99, +102, +100, + 98, +100, + 98, + 96, +109, +106, +107, +109, +107, +105, +109, +107, +104, +109, +108, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +110, +108, +106, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +107, +109, +107, +105, +101, + 99, + 97, +112, +110, +109, +112, +110, +108, +112, +110, +108, +114, +112, +110, +113, +111, +109, +113, +111, +109, +113, +111, +109, +113, +110, +109, +112, +110, +109, +112, +110, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +114, +112, +110, +114, +112, +110, +112, +109, +108, +108, +106, +104, +113, +111, +109, +115, +113, +112, +110, +112, +108, +113, +110, +109, +117, +108, +111, +112, +112, +112, +113, +114, +109, + 62, + 49, + 44, +-29, +-50, +-60, +-46, +-66, +-81, +-15, +-38, +-58, +-30, +-61, +-85, + 9, +-32, +-60, + 38, +-12, +-41, + 38, + -4, +-43, + 16, +-22, +-62, +-15, +-50, +-86, +-30, +-61, +-94, +-14, +-42, +-72, + 4, +-24, +-53, + 30, + -2, +-35, + 49, + 12, +-24, + 50, + 11, +-28, + 51, + 14, +-24, + 55, + 21, +-14, + 60, + 21, +-14, + 48, + 8, +-26, +-11, +-39, +-68, +-50, +-69, +-94, +-51, +-71, +-93, +-45, +-70, +-91, + 7, +-28, +-48, + 60, + 4, +-15, + 61, + 5, + -8, + 81, + 60, + 57, +106, +105, +106, +110, +104, +103, +101, + 98, + 97, +110, +108, +107, +110, +108, +106, +110, +108, +106, +110, +108, +107, +110, +108, +107, +111, +109, +107, +110, +108, +107, +108, +106, +105, +108, +106, +105, +108, +106, +105, +107, +105, +104, +106, +104, +102, +103, +101, + 99, +110, +108, +107, +109, +107, +105, +107, +105, +103, +107, +105, +104, +107, +105, +103, +106, +104, +102, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +102, +109, +106, +107, +109, +107, +105, +109, +107, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +105, +110, +108, +106, +110, +108, +106, +109, +107, +106, +110, +108, +106, +111, +109, +107, +112, +110, +108, +110, +108, +106, +110, +108, +107, +113, +111, +109, +114, +112, +110, +115, +113, +112, +114, +112, +110, +113, +111, +109, +113, +111, +109, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +115, +113, +111, +115, +113, +112, +113, +111, +109, +111, +109, +107, +111, +109, +107, +113, +111, +109, +114, +112, +111, +112, +112, +108, +114, +110, +109, +116, +109, +111, +111, +111, +111, +114, +112, +108, + 69, + 50, + 46, + 11, +-15, +-28, +-27, +-53, +-72, + 2, +-25, +-45, +-17, +-51, +-75, + 18, +-26, +-55, + 39, +-12, +-46, + 33, +-12, +-61, + 23, +-18, +-66, +-15, +-50, +-92, +-28, +-57, +-92, +-31, +-56, +-83, + -9, +-34, +-62, + 4, +-30, +-70, + 22, +-16, +-59, + 43, + 4, +-41, + 52, + 13, +-29, + 58, + 22, +-16, + 61, + 21, +-15, + 39, + -3, +-36, +-23, +-55, +-84, +-49, +-74, +-101, +-35, +-63, +-88, + 1, +-33, +-57, + 49, + 6, +-26, + 61, + -8, +-36, + 41, +-36, +-48, +105, + 68, + 68, +111, +107, +108, +107, +110, +106, +111, +109, +107, +110, +108, +107, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +108, +106, +105, +111, +109, +108, +110, +108, +106, +110, +108, +107, +110, +108, +107, +109, +107, +105, +111, +109, +107, +109, +107, +106, +108, +106, +105, +109, +107, +105, +109, +107, +105, +107, +105, +104, +107, +105, +104, +107, +105, +104, +108, +106, +105, +109, +107, +105, +109, +107, +105, +107, +105, +103, +109, +106, +107, +109, +107, +105, +108, +107, +104, +110, +108, +106, +110, +108, +107, +110, +108, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +111, +109, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +107, +106, +104, +103, +113, +111, +109, +115, +113, +111, +115, +113, +111, +114, +112, +111, +113, +111, +110, +112, +110, +109, +111, +109, +108, +111, +109, +107, +111, +108, +107, +111, +109, +107, +112, +110, +108, +113, +111, +110, +115, +112, +111, +115, +113, +111, +114, +112, +110, +112, +110, +108, +111, +109, +107, +111, +109, +108, +112, +110, +109, +112, +110, +109, +111, +111, +108, +113, +109, +108, +114, +109, +110, +110, +111, +111, +110, +105, +102, + 65, + 37, + 36, + 22, +-11, +-32, + -7, +-39, +-68, +-13, +-46, +-73, + 13, +-25, +-54, + 64, + 18, +-16, + 51, + -1, +-42, + 26, +-24, +-77, + 23, +-23, +-74, + -7, +-47, +-92, +-18, +-51, +-88, +-13, +-41, +-71, + 12, +-17, +-49, + 24, +-13, +-57, + 26, +-15, +-62, + 40, + -5, +-50, + 54, + 12, +-31, + 61, + 22, +-15, + 62, + 18, +-14, + 32, +-13, +-42, +-22, +-58, +-87, +-34, +-67, +-95, + 9, +-29, +-55, + 57, + 11, +-17, + 42, +-12, +-48, + 58, +-18, +-49, + 43, +-38, +-50, +111, + 73, + 75, +110, +107, +108, +106, +111, +104, +110, +109, +106, +110, +108, +107, +110, +108, +107, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +105, +109, +107, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +109, +106, +108, +110, +108, +106, +110, +108, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +112, +110, +108, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +108, +106, +105, +112, +110, +108, +112, +110, +108, +112, +110, +108, +113, +111, +109, +112, +110, +108, +111, +109, +107, +111, +109, +107, +108, +106, +105, +106, +104, +102, +109, +107, +105, +111, +109, +107, +112, +110, +108, +112, +110, +108, +112, +110, +108, +112, +110, +108, +110, +108, +106, +108, +106, +104, +107, +105, +104, +109, +107, +105, +109, +107, +105, +109, +107, +104, +112, +106, +106, +111, +106, +108, +107, +110, +109, + 95, + 89, + 87, + 50, + 16, + 17, + 30, +-11, +-29, + 16, +-24, +-45, + 19, +-22, +-36, + 64, + 19, + 2, + 63, + 12, +-13, + 47, +-10, +-42, + 28, +-29, +-69, + 25, +-28, +-71, + 13, +-35, +-77, + -5, +-48, +-89, + 7, +-31, +-71, + 24, +-13, +-54, + 35, + -5, +-49, + 46, + 2, +-43, + 58, + 10, +-33, + 61, + 14, +-23, + 63, + 19, +-12, + 64, + 17, +-11, + 47, + -1, +-29, + 16, +-24, +-52, + 4, +-34, +-61, + 55, + 9, +-21, + 56, + 2, +-31, + 59, + -3, +-38, + 78, + 3, +-26, + 60, + -5, +-17, +118, + 95, + 95, +106, +110, +110, +110, +110, +103, +110, +108, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +108, +106, +104, +109, +106, +105, +109, +107, +105, +108, +106, +104, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +103, +104, +109, +107, +105, +108, +107, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +111, +109, +107, +111, +109, +107, +109, +107, +105, +109, +107, +105, +108, +106, +105, +107, +105, +103, +109, +107, +106, +110, +108, +106, +109, +107, +105, +109, +107, +105, +111, +109, +108, +111, +109, +107, +109, +107, +106, +109, +107, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +109, +107, +106, +110, +109, +107, +109, +107, +106, +109, +107, +106, +108, +106, +105, +106, +105, +103, +109, +107, +106, +110, +108, +107, +110, +108, +106, +110, +108, +106, +109, +108, +105, +112, +106, +105, +110, +107, +107, +107, +110, +109, + 89, + 82, + 81, + 35, + -2, + -1, + 33, +-15, +-22, + 37, +-11, +-15, + 60, + 11, + 15, + 54, + 1, + 4, + 50, + -9, +-14, + 50, +-14, +-26, + 37, +-25, +-51, + 31, +-28, +-60, + 35, +-19, +-57, + 28, +-24, +-67, + 23, +-25, +-73, + 28, +-16, +-64, + 43, + 0, +-42, + 57, + 10, +-30, + 62, + 12, +-27, + 62, + 13, +-20, + 64, + 18, + -9, + 66, + 18, + -7, + 60, + 11, +-16, + 46, + 4, +-24, + 54, + 11, +-18, + 67, + 16, +-15, + 44, +-17, +-52, + 40, +-26, +-58, + 55, +-12, +-37, + 81, + 37, + 25, +112, +108, +104, + 99, +110, +108, +112, +107, +100, +109, +106, +103, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +104, +102, +100, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +102, + 96, +101, +108, +106, +105, +107, +107, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +109, +107, +105, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +111, +109, +107, +110, +108, +106, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +108, +109, +108, +107, +109, +109, +108, +110, +110, +109, +111, +110, +109, +111, +107, +106, +108, +107, +106, +109, +111, +110, +113, +111, +110, +112, +110, +109, +111, +110, +109, +112, +110, +109, +111, +109, +108, +110, +109, +108, +110, +109, +108, +110, +110, +108, +111, +110, +108, +111, +108, +109, +109, +111, +110, +107, +112, +110, +107, +110, +111, +114, +101, + 91, + 94, + 40, + 2, + -2, + 32, +-17, +-33, + 34, +-17, +-23, + 56, + 2, + 3, + 43, +-15, +-23, + 50, +-16, +-28, + 58, +-15, +-22, + 44, +-26, +-38, + 40, +-26, +-46, + 39, +-22, +-53, + 34, +-23, +-62, + 32, +-23, +-63, + 45, + -6, +-46, + 54, + 10, +-29, + 56, + 12, +-26, + 54, + 11, +-26, + 57, + 16, +-19, + 61, + 22, +-11, + 60, + 19, + -9, + 52, + 13, +-15, + 50, + 12, +-19, + 60, + 17, +-16, + 68, + 13, +-22, + 44, +-22, +-57, + 48, +-16, +-50, + 63, + 13, +-11, + 93, + 69, + 62, +112, +105, +108, +108, +105, +110, +112, +105, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 87, + 80, + 86, +107, +104, +104, +107, +108, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +110, +108, +106, +110, +108, +106, +110, +108, +106, +109, +107, +106, +109, +107, +105, +109, +107, +105, +110, +109, +110, +117, +116, +118, +117, +117, +119, +117, +116, +119, +118, +118, +120, +117, +116, +119, +117, +116, +118, +117, +117, +119, +117, +116, +119, +117, +116, +119, +117, +116, +119, +117, +116, +118, +115, +115, +117, +115, +115, +117, +116, +116, +118, +117, +116, +119, +117, +116, +119, +117, +116, +118, +119, +117, +115, +119, +117, +114, +115, +116, +120, +114, +104, +109, + 44, + 9, + 4, + 24, +-25, +-46, + 35, +-17, +-27, + 33, +-21, +-24, + 45, +-13, +-24, + 51, +-15, +-29, + 55, +-19, +-24, + 46, +-24, +-36, + 28, +-38, +-59, + 37, +-26, +-56, + 43, +-15, +-52, + 47, +-10, +-47, + 56, + 3, +-33, + 53, + 10, +-28, + 52, + 9, +-28, + 56, + 15, +-21, + 58, + 18, +-16, + 59, + 20, +-13, + 56, + 18, +-14, + 51, + 13, +-18, + 48, + 9, +-24, + 63, + 20, +-15, + 56, + 3, +-33, + 65, + 3, +-32, + 74, + 18, +-14, + 55, + 15, + -5, +115, + 95, + 89, +112, +106, +109, +110, +107, +110, +112, +106, +106, +109, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 72, + 66, + 71, +108, +105, +104, +106, +107, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +106, +104, +102, +105, +103, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +107, +109, +114, +113, +115, +110, +109, +112, +110, +110, +112, +114, +113, +115, +114, +113, +115, +110, +109, +112, +111, +110, +113, +114, +113, +116, +111, +110, +113, +111, +111, +113, +112, +111, +114, +110, +109, +112, +110, +109, +112, +112, +111, +113, +112, +111, +114, +112, +111, +114, +111, +110, +113, +112, +108, +108, +115, +113, +112, +115, +118, +123, +117, +110, +115, + 48, + 17, + 13, + 24, +-23, +-47, + 14, +-37, +-52, + 32, +-19, +-25, + 49, + -5, +-19, + 51, + -9, +-25, + 38, +-31, +-37, + 44, +-20, +-36, + 31, +-31, +-55, + 26, +-34, +-66, + 41, +-18, +-53, + 56, + -3, +-38, + 58, + 3, +-30, + 52, + 10, +-27, + 55, + 15, +-21, + 60, + 20, +-15, + 59, + 21, +-13, + 56, + 19, +-13, + 53, + 16, +-18, + 51, + 12, +-23, + 51, + 11, +-24, + 64, + 19, +-16, + 64, + 14, +-20, + 71, + 17, +-17, + 70, + 26, + 1, + 91, + 63, + 47, +117, +104, + 98, +109, +106, +106, +107, +106, +107, +110, +106, +103, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 58, + 52, + 58, +104, +102, +101, +106, +107, +103, +107, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +107, +105, +103, +108, +106, +103, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +109, +107, +105, +108, +106, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +106, +107, +116, +115, +117, +114, +113, +116, +115, +114, +116, +115, +115, +117, +114, +114, +116, +116, +115, +118, +114, +114, +116, +116, +116, +118, +115, +115, +117, +115, +114, +117, +114, +114, +116, +114, +114, +116, +114, +114, +116, +115, +115, +117, +117, +116, +118, +117, +116, +118, +116, +115, +119, +118, +114, +116, +117, +114, +115, +112, +116, +122, +116, +113, +118, + 51, + 25, + 21, + 22, +-21, +-44, + 1, +-43, +-60, + 2, +-41, +-51, + 17, +-27, +-45, + 16, +-33, +-55, + 20, +-37, +-52, + 19, +-36, +-58, + 28, +-26, +-54, + 28, +-25, +-59, + 34, +-19, +-56, + 51, + -4, +-38, + 57, + 5, +-27, + 54, + 13, +-22, + 58, + 18, +-17, + 58, + 20, +-13, + 57, + 20, +-12, + 48, + 12, +-19, + 49, + 12, +-21, + 49, + 9, +-26, + 55, + 12, +-22, + 57, + 10, +-20, + 61, + 13, +-15, + 65, + 18, +-10, + 64, + 35, + 19, +112, + 96, + 86, +111, +105, +101, +105, +105, +104, +105, +106, +104, +107, +106, +101, +108, +106, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +102, +100, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 49, + 42, + 48, + 99, + 97, + 96, +104, +104, +100, +106, +104, +102, +106, +104, +102, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +105, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +107, +109, +115, +115, +117, +113, +113, +115, +114, +113, +115, +113, +112, +115, +114, +113, +116, +114, +114, +116, +115, +114, +117, +113, +113, +115, +115, +114, +116, +114, +114, +116, +116, +115, +117, +116, +115, +118, +116, +115, +118, +116, +116, +118, +117, +117, +119, +117, +117, +119, +119, +116, +121, +121, +116, +119, +120, +117, +119, +111, +117, +124, +113, +111, +118, + 49, + 26, + 22, + 13, +-23, +-44, + 6, +-31, +-45, + 14, +-20, +-32, + 1, +-32, +-57, + -3, +-39, +-72, + 15, +-26, +-54, + 14, +-29, +-57, + 24, +-19, +-52, + 24, +-20, +-58, + 24, +-21, +-60, + 49, + 1, +-34, + 59, + 12, +-20, + 57, + 18, +-16, + 59, + 20, +-13, + 58, + 21, +-11, + 52, + 17, +-14, + 47, + 13, +-17, + 48, + 11, +-21, + 49, + 7, +-24, + 62, + 15, +-12, + 54, + 4, +-18, + 60, + 13, + -6, + 60, + 18, + 1, + 92, + 76, + 66, +111, +106, +100, +108, +107, +104, +105, +108, +105, +105, +108, +103, +107, +107, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +102, +104, +102, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +104, +102, +100, +102, +100, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 45, + 39, + 47, + 88, + 85, + 87, +104, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +106, +108, +113, +113, +115, +108, +108, +110, +111, +111, +113, +112, +111, +114, +112, +111, +114, +110, +109, +112, +110, +110, +112, +110, +109, +112, +109, +109, +111, +110, +109, +112, +111, +110, +113, +117, +117, +118, +117, +117, +118, +117, +117, +119, +118, +117, +120, +118, +117, +120, +117, +117, +121, +119, +115, +120, +119, +116, +120, +111, +117, +123, +112, +112, +116, + 39, + 19, + 14, + 14, +-19, +-36, + 18, +-17, +-30, + 5, +-28, +-41, + -4, +-34, +-62, + 2, +-28, +-67, + 23, +-10, +-46, + 25, + -9, +-41, + 22, +-13, +-47, + 20, +-17, +-56, + 25, +-15, +-54, + 41, + -1, +-37, + 57, + 14, +-20, + 55, + 19, +-15, + 56, + 19, +-15, + 54, + 19, +-13, + 52, + 17, +-14, + 50, + 16, +-15, + 47, + 11, +-20, + 50, + 7, +-20, + 65, + 17, + -3, + 57, + 11, + -3, + 83, + 47, + 38, +108, + 78, + 72, +116, +106, +102, +107, +107, +105, +103, +104, +102, +104, +106, +103, +105, +106, +101, +106, +106, +100, +108, +106, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +106, +104, +102, +105, +103, +102, +105, +103, +101, +106, +104, +102, +105, +103, +101, +103, +101, +100, +102, +100, + 98, +103, +101, +100, +105, +103, +101, +105, +103, +101, +104, +102, +100, + 43, + 39, + 52, + 73, + 69, + 77, +105, +101, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +105, +103, +101, +105, +103, +101, +105, +103, +102, +106, +104, +103, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +105, +103, +104, +106, +104, +106, +107, +105, +107, +106, +105, +106, +106, +105, +106, +106, +105, +106, +105, +104, +105, +104, +104, +105, +104, +104, +105, +104, +103, +104, +104, +103, +104, +104, +103, +104, +104, +104, +104, +104, +104, +104, +104, +104, +104, +105, +105, +105, +105, +105, +105, + 99, +104, +105, +100, +101, +106, +106, +100, +107, +102, +103, +104, +101, +100, + 95, + 36, + 18, + 9, + 21, +-11, +-24, + 14, +-22, +-38, + -3, +-43, +-61, + 10, +-31, +-55, + 16, +-22, +-52, + 22, +-12, +-45, + 30, + -4, +-31, + 35, + -1, +-28, + 31, + -7, +-38, + 32, + -8, +-42, + 35, + -7, +-44, + 50, + 10, +-27, + 50, + 19, +-17, + 50, + 19, +-17, + 51, + 18, +-18, + 52, + 18, +-17, + 49, + 13, +-21, + 50, + 15, +-16, + 54, + 12, +-11, + 60, + 13, + -1, + 65, + 37, + 29, +111, +103, +100, +111, +105, +110, +109, +106, +107, +106, +104, +102, +102, +100, + 98, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +105, +109, +107, +105, +106, +104, +102, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +104, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +105, +103, +101, +104, +102, +100, +106, +104, +103, +105, +103, +102, +103, +101, +100, +100, + 98, + 97, +101, + 99, + 98, +104, +102, +101, +104, +102, +100, +103, +101, +100, + 43, + 39, + 53, + 60, + 55, + 64, +105, +101, +105, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +107, +105, +103, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +106, +102, +101, +102, + 98, + 97, +101, + 97, + 96, +101, + 97, + 96, +101, + 97, + 96, +101, + 97, + 96, +102, + 98, + 97, +102, + 98, + 97, +102, + 98, + 97, +103, + 99, + 98, +102, + 98, + 97, +103, + 99, + 98, +102, + 99, + 96, +102, + 99, + 96, +103, +100, + 97, +104, +101, + 98, +104, +101, + 98, +101, +102, +100, +102, +100, +102, +106, + 97, +102, +101, + 98, + 98, +102, +100, + 92, + 44, + 25, + 15, + 12, +-15, +-30, +-13, +-45, +-61, +-39, +-75, +-93, + 0, +-38, +-62, + 18, +-17, +-46, + 18, +-14, +-46, + 4, +-39, +-63, + 13, +-31, +-55, + 28, +-15, +-45, + 34, + -8, +-42, + 40, + 0, +-36, + 43, + 5, +-32, + 45, + 14, +-21, + 49, + 16, +-17, + 51, + 16, +-17, + 50, + 14, +-19, + 50, + 12, +-20, + 50, + 13, +-18, + 57, + 13, +-10, + 54, + 8, + -5, + 84, + 60, + 53, +112, +105, +103, +109, +105, +108, +109, +106, +106, +107, +105, +104, +105, +103, +101, +107, +105, +103, +108, +106, +104, +108, +106, +104, +109, +107, +105, +108, +106, +104, +104, +102, +101, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +106, +104, +102, +105, +103, +101, +104, +102, +101, +103, +101, + 99, +102, +100, + 98, +104, +102, +101, +104, +102, +100, +103, +101, + 99, + 37, + 32, + 49, + 48, + 43, + 55, +100, + 96, +102, +106, +103, +103, +106, +104, +102, +105, +103, +102, +104, +102, +101, +104, +102, +101, +104, +102, +100, +103, +101, + 99, +106, +104, +102, +108, +106, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +103, +108, +105, +104, +109, +104, +103, +109, +102, +102, +108, +101, +101, +107, +101, +101, +106, +100, +100, +107, +101, +100, +108, +103, +102, +108, +103, +103, +108, +103, +103, +106, +102, +101, +108, +103, +102, +107, +102, +101, +106, +102, + 99, +106, +102, + 98, +107, +103, + 99, +108, +104, +101, +108, +104, +101, +106, +105, +101, +108, +103, +102, +109, + 98, +102, +102, + 99, + 97, +107, +104, + 96, + 54, + 36, + 28, + 9, +-25, +-36, + 16, +-25, +-37, + 3, +-44, +-57, + -4, +-54, +-72, + 1, +-47, +-71, + 1, +-45, +-72, + 4, +-50, +-73, + 12, +-40, +-65, + 17, +-31, +-59, + 24, +-18, +-50, + 44, + 6, +-29, + 40, + 4, +-31, + 45, + 11, +-21, + 48, + 13, +-19, + 51, + 14, +-17, + 50, + 12, +-19, + 51, + 11, +-19, + 53, + 12, +-18, + 56, + 9, +-15, + 54, + 8, + -3, +101, + 80, + 74, +111, +108, +105, +109, +106, +107, +110, +107, +106, +108, +106, +104, +107, +105, +103, +106, +104, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +109, +107, +105, +108, +106, +104, +108, +106, +104, +108, +106, +104, +108, +106, +104, +107, +105, +104, +107, +105, +104, +107, +105, +104, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +104, +102, +101, +106, +104, +102, +105, +103, +101, +104, +102, +101, +105, +103, +101, +103, +101, +100, +105, +103, +101, +104, +102, +100, +104, +102, +100, + 32, + 26, + 45, + 42, + 37, + 50, + 90, + 86, + 93, +102, +100, + 99, +102, +100, + 98, +102, +100, + 99, +103, +101, +100, +103, +101, +100, +103, +101, + 99, +102, +100, + 98, +104, +102, +100, +106, +104, +102, +105, +103, +102, +105, +103, +102, +107, +105, +103, +108, +106, +104, +108, +106, +104, +108, +106, +104, +104, +102, +100, +106, +104, +102, +102, + 98, + 99, + 95, + 91, + 93, + 91, + 88, + 89, + 91, + 87, + 89, + 85, + 81, + 83, + 85, + 81, + 83, + 87, + 85, + 87, + 87, + 85, + 86, + 87, + 84, + 86, + 86, + 84, + 85, + 86, + 84, + 85, + 85, + 83, + 84, + 84, + 83, + 82, + 83, + 81, + 80, + 82, + 81, + 79, + 83, + 81, + 80, + 83, + 81, + 80, + 82, + 82, + 80, + 86, + 81, + 82, + 86, + 76, + 81, + 79, + 79, + 80, + 80, + 82, + 77, + 48, + 36, + 30, + 12, +-25, +-32, + 18, +-29, +-37, + 9, +-46, +-55, + 12, +-48, +-62, + 15, +-44, +-63, + 28, +-29, +-51, + 40, +-15, +-40, + 41, +-11, +-38, + 31, +-15, +-44, + 19, +-22, +-53, + 39, + 2, +-31, + 42, + 8, +-25, + 45, + 9, +-21, + 50, + 13, +-17, + 50, + 11, +-18, + 51, + 10, +-18, + 52, + 10, +-18, + 56, + 11, +-19, + 53, + 3, +-21, + 57, + 11, + 2, +109, + 89, + 86, +106, +106, +103, +107, +105, +103, +109, +106, +105, +107, +105, +103, +109, +107, +105, +106, +104, +102, +106, +104, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +103, +106, +104, +103, +106, +104, +103, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, + 20, + 14, + 34, + 38, + 31, + 46, + 74, + 69, + 78, +101, + 99, + 98, +101, + 99, + 97, +102, +100, + 98, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +104, +102, +100, +104, +102, +100, + 50, + 50, + 53, +-38, +-38, +-32, +-36, +-36, +-30, +-39, +-38, +-33, +-46, +-46, +-40, +-49, +-48, +-42, +-49, +-46, +-41, +-50, +-47, +-42, +-50, +-48, +-42, +-50, +-47, +-42, +-51, +-48, +-42, +-51, +-48, +-44, +-50, +-47, +-44, +-50, +-47, +-44, +-50, +-46, +-43, +-49, +-45, +-42, +-49, +-45, +-42, +-49, +-45, +-44, +-46, +-48, +-45, +-45, +-50, +-43, +-50, +-45, +-40, +-53, +-46, +-45, +-20, +-28, +-28, + 13, +-13, +-20, + 3, +-33, +-43, + -2, +-47, +-58, + -1, +-52, +-67, + 4, +-48, +-67, + 18, +-32, +-55, + 26, +-19, +-50, + 25, +-18, +-49, + 28, +-14, +-44, + 20, +-18, +-50, + 32, + -4, +-36, + 43, + 9, +-22, + 43, + 6, +-21, + 49, + 10, +-17, + 50, + 10, +-17, + 51, + 8, +-17, + 52, + 8, +-17, + 55, + 6, +-22, + 54, + 0, +-25, + 65, + 21, + 12, +114, + 95, + 93, +102, +104, +101, +103, +102, + 99, +105, +102, +100, +105, +103, +102, +106, +104, +103, +104, +102, +101, +105, +103, +102, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +-26, +-29, +-16, + 32, + 28, + 42, + 60, + 56, + 67, +103, +100, +102, +103, +101, +101, +101, + 99, + 98, +104, +102, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +106, +103, +102, +106, +103, +102, +105, +103, +101, +104, +102, +100, +102, +100, + 99, + 46, + 45, + 49, +-36, +-35, +-27, + 57, + 63, + 70, + 59, + 68, + 72, + 62, + 71, + 72, + 61, + 70, + 69, + 63, + 71, + 72, + 62, + 70, + 72, + 63, + 71, + 73, + 64, + 72, + 75, + 65, + 73, + 77, + 64, + 72, + 78, + 62, + 70, + 78, + 64, + 71, + 78, + 71, + 78, + 83, + 73, + 79, + 81, + 73, + 80, + 79, + 75, + 81, + 83, + 76, + 78, + 86, + 74, + 76, + 83, + 72, + 79, + 84, + 73, + 82, + 83, + 77, + 80, + 79, + 32, + 21, + 20, + 15, +-13, +-20, + 10, +-34, +-47, + -7, +-54, +-68, +-13, +-58, +-74, + 1, +-44, +-65, + 11, +-31, +-60, + 17, +-23, +-54, + 23, +-16, +-47, + 24, +-12, +-45, + 32, + -2, +-36, + 43, + 9, +-23, + 45, + 7, +-21, + 50, + 10, +-17, + 49, + 7, +-20, + 52, + 6, +-21, + 52, + 5, +-23, + 55, + 3, +-25, + 57, + 2, +-21, + 71, + 30, + 18, +113, + 99, + 97, +100, +103, +104, +102, +101, + 98, +104, +101, + 98, +103, +101, +100, +102, +100, + 98, +100, + 98, + 97, +104, +102, +100, +105, +102, +101, +104, +102, +100, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +101, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +-74, +-74, +-67, + 22, + 20, + 33, + 47, + 44, + 59, +100, + 97, +101, +104, +101, +104, +103, +100, +101, +103, +101, +101, +104, +102, +101, +103, +101, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +102, +100, + 98, + 92, + 90, + 88, + 35, + 32, + 37, +-45, +-45, +-36, + 8, + 17, + 25, + 22, + 35, + 40, + 22, + 35, + 35, + 25, + 37, + 32, + 23, + 33, + 32, + 19, + 29, + 29, + 22, + 31, + 33, + -3, + 6, + 9, + 17, + 25, + 30, + 8, + 17, + 22, + 13, + 25, + 26, + 25, + 34, + 37, + 86, + 94, + 97, + 89, + 95, + 99, + 90, + 95, + 98, + 89, + 94, + 99, + 88, + 94, +100, + 76, + 82, + 87, + 79, + 85, + 88, + 78, + 85, + 86, + 84, + 91, + 91, + 75, + 72, + 75, + 15, +-11, +-18, + 11, +-36, +-56, + 8, +-40, +-60, + 5, +-39, +-59, + 20, +-25, +-52, + 18, +-26, +-52, + 30, +-12, +-39, + 33, + -6, +-35, + 39, + 2, +-30, + 39, + 5, +-30, + 41, + 7, +-27, + 49, + 11, +-18, + 49, + 10, +-19, + 50, + 6, +-23, + 54, + 6, +-24, + 53, + 4, +-27, + 54, + 2, +-26, + 57, + 4, +-21, + 59, + 21, + 3, + 86, + 75, + 73, + 99, +102, +106, +104, +101, + 98, +105, +101, + 98, +104, +102, +100, +104, +102, +100, +104, +102, +100, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +103, +102, +104, +102, +101, +103, +101, + 99, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +104, +102, +100, +-103, +-103, +-96, + 3, + 1, + 14, + 39, + 37, + 51, + 93, + 89, + 94, +105, +102, +105, +103, +100, +101, +104, +101, +101, +103, +101, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +103, +101, +100, +100, + 98, + 97, + 91, + 89, + 88, + 38, + 34, + 41, +-52, +-52, +-40, +-19, +-12, + 0, + -6, + 6, + 15, + -8, + 4, + 8, + 1, + 11, + 12, + -1, + 7, + 11, + 1, + 10, + 15, + -1, + 8, + 15, +-38, +-30, +-21, +-31, +-24, +-13, +-36, +-27, +-19, +-22, + -9, +-13, + 1, + 12, + 10, + 87, + 95, + 97, + 88, + 93, +100, + 89, + 91, +104, + 89, + 93, +100, + 86, + 94, + 94, + 87, + 94, + 96, + 87, + 93, + 97, + 87, + 93, + 99, + 89, + 95, +102, + 65, + 65, + 70, + 19, + 0, + -7, + 10, +-30, +-54, + 14, +-25, +-53, + 13, +-20, +-52, + 20, +-16, +-54, + 32, + -8, +-35, + 39, + 0, +-26, + 45, + 6, +-22, + 45, + 8, +-23, + 39, + 5, +-28, + 40, + 6, +-27, + 44, + 6, +-24, + 43, + 4, +-27, + 49, + 7, +-25, + 54, + 7, +-24, + 57, + 8, +-23, + 59, + 7, +-25, + 60, + 10, +-22, + 48, + 9, +-16, + 27, + 17, + 10, + 97, +100, +100, +104, +104, + 98, +105, +102, + 99, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +105, +103, +102, +105, +103, +102, +107, +105, +103, +107, +105, +104, +106, +104, +103, +102, +100, + 98, +103, +100, + 99, +103, +101, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +100, + 98, + 97, +103, +101, + 99, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +102, +100, + 98, +102, +100, + 99, +104, +102, +100, +-90, +-92, +-86, +-24, +-27, +-15, + 38, + 33, + 49, + 78, + 74, + 78, +104, +100, +104, +104, +101, +103, +104, +102, +101, +103, +101, + 99, +104, +102, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +100, + 98, + 96, + 91, + 89, + 87, + 40, + 36, + 42, +-55, +-55, +-44, +-29, +-22, + -9, +-35, +-23, +-12, +-36, +-25, +-16, +-32, +-23, +-17, +-38, +-26, +-19, +-36, +-24, +-16, +-37, +-26, +-16, +-41, +-31, +-19, +-39, +-28, +-15, +-27, +-17, + -2, +-29, +-22, + -3, + -8, + -1, + 9, + 84, + 93, + 95, + 80, + 87, + 85, + 80, + 86, + 85, + 83, + 90, + 89, + 85, + 92, + 93, + 87, + 93, + 97, + 87, + 92, +102, + 74, + 78, + 92, + 40, + 43, + 60, + 11, + 13, + 28, + 51, + 36, + 40, + 15, +-23, +-35, + 17, +-18, +-36, + 21, +-10, +-32, + 29, + -3, +-34, + 39, + 4, +-23, + 40, + 4, +-23, + 37, + 1, +-26, + 35, + 0, +-29, + 38, + 3, +-29, + 43, + 7, +-25, + 42, + 5, +-26, + 47, + 8, +-25, + 52, + 10, +-23, + 57, + 10, +-24, + 61, + 13, +-21, + 63, + 13, +-21, + 63, + 15, +-21, + 45, + 6, +-24, + -5, +-17, +-29, + 75, + 78, + 77, + 99, +100, + 97, +102, +100, + 97, +104, +102, +100, +102, +100, + 98, + 98, + 96, + 94, +106, +104, +102, +105, +103, +102, +106, +103, +102, +106, +104, +102, +106, +104, +103, +105, +103, +102, +104, +102, +101, +104, +102, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +101, + 99, + 97, +104, +102, +101, +106, +104, +102, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +-49, +-53, +-46, +-55, +-60, +-48, + 35, + 28, + 44, + 64, + 61, + 65, +102, + 99, +102, +103, +100, +102, +104, +102, +102, +104, +102, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +106, +104, +102, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +100, + 98, + 97, + 92, + 90, + 88, + 43, + 41, + 42, +-57, +-56, +-50, +-28, +-20, +-11, +-34, +-22, +-13, +-35, +-23, +-15, +-32, +-23, +-17, +-38, +-26, +-19, +-38, +-25, +-18, +-39, +-26, +-17, +-37, +-25, +-15, +-36, +-24, +-12, + -6, + 3, + 21, + -8, + -3, + 25, +-10, + -3, + 10, + 87, + 95, + 96, + 85, + 93, + 89, + 87, + 93, + 90, + 86, + 91, + 95, + 76, + 81, + 92, + 61, + 64, + 79, + 31, + 34, + 51, + -7, + -6, + 18, +-22, +-22, + 4, + 21, + 21, + 43, + 32, + 17, + 28, + -5, +-43, +-47, + -2, +-39, +-47, + 4, +-28, +-39, + 16, +-18, +-37, + 22, +-10, +-35, + 26, + -6, +-33, + 31, + -3, +-30, + 35, + 0, +-28, + 38, + 3, +-27, + 43, + 7, +-24, + 47, + 11, +-23, + 50, + 11, +-23, + 55, + 13, +-22, + 60, + 14, +-21, + 63, + 15, +-20, + 60, + 13, +-22, + 59, + 12, +-23, + 38, + -3, +-34, +-14, +-30, +-39, + 52, + 52, + 55, + 63, + 64, + 68, +104, +102, +102, +107, +105, +103, +107, +105, +103, +103, +101, +100, +107, +105, +103, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +106, +104, +102, +106, +104, +102, +107, +105, +103, +107, +105, +103, +107, +105, +103, +106, +104, +102, +106, +104, +102, +105, +103, +102, +104, +101, +100, +101, + 99, + 97, +103, +101, + 99, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, + -8, +-12, + -5, +-85, +-90, +-78, + 25, + 19, + 34, + 52, + 48, + 53, +102, + 99, +102, +106, +103, +104, +106, +103, +103, +106, +104, +102, +106, +104, +103, +107, +105, +104, +107, +105, +104, +106, +104, +103, +105, +103, +101, +105, +103, +101, +104, +102, +101, +103, +101, + 99, +102, +100, + 98, +102, +100, + 98, +100, + 98, + 97, + 92, + 90, + 88, + 47, + 46, + 44, +-60, +-58, +-57, +-30, +-21, +-17, +-32, +-19, +-13, +-32, +-20, +-15, +-24, +-14, +-11, +-37, +-23, +-20, +-37, +-22, +-18, +-38, +-24, +-18, +-39, +-25, +-18, +-37, +-24, +-15, +-26, +-14, + -4, +-15, + -5, + 5, +-14, + -4, + -2, + 84, + 93, + 92, + 74, + 80, + 86, + 55, + 55, + 72, + 23, + 23, + 45, + 0, + 0, + 25, +-15, +-15, + 10, +-26, +-27, + 1, +-30, +-31, + -1, +-39, +-41, + -9, + 28, + 28, + 42, + 7, + -8, + -8, +-11, +-49, +-62, +-15, +-54, +-67, + -5, +-40, +-53, + 13, +-23, +-42, + 23, + -7, +-31, + 27, + -3, +-28, + 34, + 2, +-25, + 39, + 4, +-23, + 44, + 7, +-20, + 45, + 8, +-21, + 50, + 13, +-21, + 52, + 14, +-21, + 54, + 12, +-23, + 57, + 11, +-25, + 56, + 9, +-28, + 55, + 8, +-24, + 49, + 2, +-29, + 27, +-15, +-42, + 13, + -4, +-10, + 51, + 49, + 56, + -5, + -5, + 6, + 86, + 84, + 86, +108, +106, +105, +108, +106, +105, +106, +104, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +106, +104, +102, +107, +105, +103, +107, +105, +103, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 11, + 13, + 20, +-110, +-108, +-100, + 4, + 5, + 16, + 42, + 38, + 48, + 93, + 89, + 95, +106, +103, +104, +105, +103, +102, +105, +103, +102, +105, +103, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +101, +103, +101, +100, +103, +101, + 99, +103, +101, + 99, +100, + 98, + 97, + 92, + 90, + 89, + 50, + 48, + 49, +-60, +-57, +-55, +-34, +-24, +-23, +-41, +-27, +-25, +-45, +-31, +-28, +-42, +-31, +-26, +-49, +-37, +-30, +-48, +-36, +-28, +-40, +-29, +-19, +-38, +-28, +-14, +-40, +-31, +-15, +-25, +-18, + 1, + -8, + -6, + 18, + -3, + 0, + 22, + 8, + 10, + 30, + -8, + -8, + 17, +-23, +-25, + 6, +-35, +-37, + -5, +-31, +-33, + -2, +-32, +-33, + -4, +-36, +-36, + -8, +-39, +-39, +-12, +-48, +-48, +-21, + 34, + 35, + 44, + 13, + 1, + -5, + -7, +-43, +-68, + 4, +-41, +-71, + -5, +-50, +-73, + 6, +-36, +-51, + 20, +-13, +-33, + 31, + -3, +-25, + 39, + 3, +-20, + 45, + 8, +-17, + 46, + 8, +-19, + 46, + 7, +-22, + 46, + 6, +-27, + 46, + 6, +-27, + 48, + 6, +-26, + 43, + -1, +-33, + 41, + -6, +-38, + 42, +-12, +-41, + 32, +-20, +-49, + 11, +-22, +-49, + 59, + 51, + 39, + 42, + 43, + 50, +-45, +-44, +-18, + -5, + -6, + 12, + 68, + 66, + 79, +102, +101, +109, +104, +103, +105, +103, +102, +100, +105, +104, + 98, +106, +105, +101, +106, +104, +102, +106, +104, +103, +106, +103, +104, +106, +103, +104, +106, +103, +104, +105, +103, +102, +105, +103, +102, +105, +103, +101, +104, +102, +101, +104, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 28, + 29, + 38, +-94, +-94, +-86, +-21, +-21, +-11, + 40, + 35, + 47, + 82, + 78, + 85, +104, +101, +102, +104, +102, +100, +104, +102, +100, +104, +102, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +103, +101, + 99, +102, +100, + 98, + 99, + 97, + 96, + 91, + 89, + 87, + 52, + 50, + 52, +-60, +-58, +-54, +-25, +-16, +-11, +-21, + -8, + -1, +-43, +-33, +-21, +-31, +-23, + -8, +-25, +-19, + -1, +-15, + -9, + 10, +-10, + -4, + 17, + -5, + 0, + 24, + -4, + 1, + 26, + -9, + -7, + 21, +-13, +-14, + 17, +-18, +-19, + 12, +-25, +-26, + 5, +-37, +-39, + -8, +-45, +-46, +-15, +-49, +-50, +-20, +-42, +-43, +-14, +-45, +-46, +-17, +-47, +-47, +-21, +-55, +-55, +-31, +-60, +-60, +-36, + 37, + 39, + 50, + 27, + 18, + 14, + -7, +-38, +-62, + 12, +-33, +-67, + 7, +-41, +-70, + -8, +-50, +-71, + 13, +-26, +-46, + 28, +-11, +-33, + 37, + -4, +-27, + 42, + -1, +-25, + 40, + -3, +-30, + 38, + -5, +-33, + 38, + -8, +-36, + 40, + -6, +-35, + 40, + -8, +-38, + 31, +-18, +-51, + 33, +-19, +-53, + 27, +-27, +-64, + 17, +-30, +-62, + 18, + -5, +-24, + 79, + 72, + 70, + 36, + 36, + 48, +-56, +-56, +-28, +-39, +-41, +-14, +-27, +-29, + -6, + 35, + 33, + 49, + 94, + 92, +101, +104, +103, +106, +104, +103, +102, +107, +105, +101, +107, +105, +102, +107, +105, +103, +107, +105, +103, +107, +105, +104, +106, +104, +103, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 50, + 45, + 59, +-54, +-58, +-48, +-50, +-53, +-45, + 37, + 32, + 44, + 68, + 63, + 71, +103, +100, +102, +102, +100, + 99, +102, +100, + 99, +103, +100, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +106, +104, +102, +105, +103, +101, +102, + 99, + 98, +102, +100, + 98, +100, + 98, + 96, + 92, + 90, + 88, + 55, + 52, + 53, +-60, +-60, +-55, +-28, +-22, +-10, +-14, + -6, + 13, +-12, + -7, + 18, + -4, + -2, + 27, + -5, + -4, + 26, + -9, + -8, + 23, +-13, +-12, + 20, +-16, +-16, + 17, +-25, +-25, + 8, +-32, +-32, + 0, +-31, +-31, + -3, +-38, +-38, +-10, +-44, +-45, +-17, +-50, +-50, +-22, +-52, +-53, +-25, +-43, +-44, +-16, +-45, +-45, +-18, +-55, +-55, +-29, +-60, +-60, +-37, +-71, +-70, +-49, +-78, +-77, +-56, + 36, + 38, + 49, + 43, + 37, + 36, + -1, +-24, +-43, + 13, +-24, +-57, + 17, +-26, +-61, + 10, +-33, +-65, + 13, +-32, +-56, + 28, +-17, +-42, + 33, +-14, +-39, + 36, +-12, +-37, + 33, +-17, +-42, + 30, +-21, +-44, + 29, +-25, +-43, + 29, +-27, +-50, + 26, +-31, +-62, + 27, +-30, +-67, + 31, +-24, +-64, + 21, +-25, +-69, + 2, +-29, +-64, + 58, + 40, + 33, + 83, + 74, + 87, + 15, + 12, + 33, +-60, +-59, +-37, +-51, +-52, +-26, +-44, +-46, +-18, +-30, +-32, + -9, + -1, + -3, + 15, + 49, + 47, + 60, + 92, + 89, + 99, +106, +104, +107, +106, +105, +105, +106, +105, +104, +105, +105, +103, +105, +106, +101, +105, +105, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, + 34, + 27, + 44, +-12, +-17, + -6, +-80, +-83, +-77, + 29, + 24, + 36, + 55, + 50, + 58, +100, + 97, + 98, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +102, +100, + 99, +103, +101, + 99, +104, +102, +100, +103, +101, +100, +100, + 98, + 96, + 98, + 96, + 94, + 90, + 88, + 86, + 58, + 54, + 53, +-55, +-58, +-52, +-25, +-23, + -5, +-28, +-24, + 3, +-35, +-34, + -1, +-24, +-26, + 9, +-23, +-26, + 11, +-28, +-31, + 5, +-31, +-34, + 2, +-38, +-41, + -5, +-43, +-45, +-10, +-48, +-49, +-17, +-51, +-50, +-25, +-55, +-54, +-29, +-57, +-57, +-32, +-58, +-58, +-33, +-62, +-62, +-37, +-69, +-68, +-45, +-57, +-56, +-34, +-62, +-61, +-39, +-72, +-70, +-51, +-86, +-84, +-67, +-89, +-86, +-69, + 12, + 16, + 25, + -6, + -8, + -9, + 21, + 8, + -8, + 6, +-20, +-52, + 15, +-22, +-61, + 23, +-22, +-61, + 18, +-30, +-60, + 27, +-21, +-50, + 33, +-19, +-46, + 37, +-16, +-43, + 34, +-20, +-46, + 28, +-29, +-50, + 24, +-34, +-49, + 24, +-37, +-59, + 23, +-38, +-69, + 25, +-31, +-66, + 21, +-28, +-63, + 11, +-19, +-55, + 41, + 27, + 6, + 82, + 69, + 71, + 77, + 69, + 90, +-13, +-16, + 7, +-64, +-62, +-44, +-56, +-55, +-30, +-47, +-48, +-19, +-43, +-45, +-17, +-31, +-34, + -9, +-21, +-25, + -1, + 2, + -2, + 20, + 60, + 57, + 68, + 99, + 98, +106, +105, +104, +109, +104, +104, +104, +104, +106, +102, +105, +106, +101, +107, +106, +103, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 15, + 12, + 30, + 19, + 18, + 29, +-102, +-101, +-97, + 13, + 8, + 19, + 43, + 38, + 46, + 97, + 94, + 96, +105, +103, +101, +105, +103, +101, +105, +102, +102, +105, +103, +101, +105, +103, +101, +104, +102, +101, +104, +102, +101, +104, +102, +101, +104, +102, +100, +103, +101, +100, +103, +101, +100, +101, + 99, + 97, +100, + 98, + 96, + 92, + 90, + 89, + 63, + 58, + 57, +-56, +-60, +-53, +-29, +-29, + -8, +-47, +-47, +-16, +-50, +-51, +-19, +-38, +-40, +-10, +-40, +-43, + -9, +-42, +-45, +-11, +-49, +-51, +-19, +-53, +-55, +-25, +-57, +-58, +-30, +-62, +-62, +-37, +-65, +-64, +-42, +-66, +-65, +-43, +-66, +-64, +-43, +-64, +-62, +-41, +-67, +-66, +-45, +-102, +-101, +-81, +-81, +-80, +-61, +-76, +-74, +-56, +-84, +-81, +-65, +-90, +-87, +-72, +-91, +-88, +-74, +-16, + -7, + -6, +-14, + -8, +-15, + 6, + 3, +-15, + 11, + -5, +-34, + 13, +-21, +-59, + 25, +-22, +-63, + 25, +-22, +-58, + 21, +-26, +-60, + 25, +-25, +-57, + 32, +-21, +-50, + 28, +-26, +-53, + 24, +-32, +-56, + 21, +-37, +-56, + 20, +-40, +-65, + 18, +-39, +-68, + 15, +-30, +-57, + 10, +-22, +-41, + 42, + 30, + 16, + 76, + 73, + 66, + 77, + 74, + 78, + 66, + 64, + 78, +-42, +-44, +-27, +-64, +-64, +-45, +-61, +-59, +-36, +-53, +-51, +-25, +-51, +-50, +-24, +-46, +-47, +-20, +-37, +-41, +-13, +-29, +-33, + -5, +-13, +-17, + 7, + 17, + 15, + 33, + 73, + 73, + 84, +101, +102, +107, +103, +105, +105, +103, +105, +102, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 30, + 31, + 49, + 32, + 36, + 45, +-92, +-88, +-86, + -3, + -7, + 3, + 44, + 40, + 48, + 85, + 83, + 84, +104, +102, +101, +105, +103, +101, +105, +102, +102, +105, +103, +101, +105, +103, +101, +105, +102, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +103, +101, + 99, +104, +102, + 99, +101, + 99, + 97, +100, + 98, + 96, + 92, + 90, + 88, + 65, + 60, + 59, +-42, +-47, +-38, +-42, +-45, +-23, +-60, +-60, +-31, +-56, +-56, +-29, +-54, +-56, +-32, +-52, +-56, +-27, +-57, +-60, +-33, +-60, +-63, +-37, +-63, +-65, +-41, +-67, +-68, +-48, +-72, +-72, +-53, +-74, +-72, +-52, +-70, +-68, +-49, +-67, +-66, +-46, +-66, +-64, +-45, +-73, +-72, +-52, +-85, +-83, +-65, +-86, +-84, +-68, +-88, +-85, +-69, +-90, +-87, +-73, +-94, +-90, +-78, +-96, +-92, +-80, +-12, + -2, + -7, + 5, + 14, + 3, + 4, + 8, + -9, + 23, + 13, +-11, + 11, +-22, +-56, + 30, +-18, +-59, + 26, +-19, +-59, + 25, +-21, +-58, + 21, +-28, +-62, + 19, +-32, +-63, + 19, +-34, +-62, + 22, +-31, +-59, + 20, +-35, +-63, + 17, +-38, +-67, + 11, +-37, +-62, + 21, + -9, +-23, + 55, + 40, + 35, + 30, + 28, + 31, + -2, + 1, + 8, + 65, + 67, + 72, + 47, + 48, + 54, +-77, +-76, +-65, +-68, +-69, +-49, +-66, +-64, +-42, +-64, +-60, +-38, +-59, +-58, +-34, +-51, +-52, +-26, +-49, +-52, +-24, +-44, +-48, +-18, +-32, +-38, + -6, +-16, +-22, + 7, + -3, + -6, + 14, + 33, + 32, + 45, + 82, + 83, + 90, +102, +103, +106, +105, +103, +103, +103, +101, +100, +103, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +104, +102, +100, +103, +101, +100, + 54, + 55, + 70, + 41, + 44, + 53, +-53, +-50, +-47, +-31, +-33, +-21, + 44, + 43, + 54, + 69, + 68, + 74, +103, +101, +103, +105, +103, +101, +104, +103, +100, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +100, +102, +100, + 99, +101, + 99, + 98, + 99, + 97, + 96, + 92, + 90, + 89, + 66, + 66, + 68, +-32, +-34, +-22, +-62, +-66, +-43, +-65, +-70, +-42, +-67, +-70, +-48, +-66, +-68, +-52, +-69, +-70, +-50, +-69, +-70, +-50, +-69, +-70, +-50, +-72, +-73, +-53, +-77, +-78, +-58, +-77, +-77, +-58, +-77, +-76, +-59, +-75, +-75, +-58, +-68, +-68, +-50, +-70, +-70, +-53, +-83, +-83, +-65, +-90, +-89, +-74, +-86, +-85, +-71, +-88, +-86, +-74, +-91, +-88, +-79, +-91, +-88, +-80, +-93, +-90, +-83, + -3, + 2, + -4, + 12, + 16, + 3, + 1, + 7, + -4, + 5, + 7, + -4, + 6, +-14, +-34, + 25, +-25, +-63, + 29, +-18, +-59, + 31, +-24, +-55, + 23, +-42, +-62, + 18, +-49, +-67, + 19, +-42, +-68, + 22, +-34, +-68, + 20, +-32, +-72, + 12, +-33, +-55, + 41, + 11, + 7, + 59, + 45, + 49, + 42, + 45, + 49, + 11, + 21, + 20, + -8, + 0, + -3, + 43, + 51, + 50, + 2, + 7, + 10, +-103, +-98, +-88, +-81, +-78, +-63, +-69, +-68, +-47, +-66, +-65, +-41, +-64, +-63, +-38, +-50, +-50, +-23, +-51, +-53, +-24, +-57, +-59, +-29, +-49, +-50, +-23, +-39, +-40, +-13, +-25, +-26, + 2, +-14, +-15, + 14, + 0, + -2, + 27, + 35, + 33, + 56, + 82, + 79, + 89, +104, +102, +110, +102, +102, +105, +103, +105, +101, +105, +107, + 99, +105, +104, + 99, +107, +103, +103, +107, +103, +103, +106, +103, +102, +105, +103, +101, +103, +101, +100, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, + 99, + 60, + 62, + 76, + 51, + 52, + 64, +-16, +-16, + -6, +-66, +-67, +-54, + 38, + 36, + 49, + 53, + 51, + 60, +102, +100, +103, +104, +102, +101, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +102, +104, +102, +100, +103, +101, +100, +102, +100, + 98, + 95, + 93, + 91, + 73, + 73, + 76, +-20, +-20, + -9, +-69, +-73, +-51, +-75, +-80, +-54, +-77, +-81, +-61, +-78, +-79, +-66, +-79, +-79, +-62, +-79, +-80, +-62, +-79, +-80, +-62, +-81, +-81, +-63, +-82, +-83, +-65, +-78, +-78, +-61, +-77, +-77, +-61, +-75, +-75, +-59, +-84, +-83, +-68, +-87, +-87, +-71, +-90, +-89, +-74, +-91, +-90, +-76, +-87, +-86, +-73, +-90, +-89, +-78, +-92, +-90, +-81, +-93, +-90, +-82, +-90, +-87, +-81, + 9, + 17, + 10, + 17, + 24, + 11, + 14, + 22, + 11, + 10, + 15, + 7, + 28, + 11, + -5, + 11, +-38, +-71, + 19, +-30, +-68, + 24, +-26, +-60, + 14, +-40, +-68, + 5, +-51, +-76, + 10, +-48, +-75, + 24, +-36, +-66, + 22, +-34, +-65, + 17, +-19, +-36, + 65, + 50, + 44, + 42, + 41, + 42, + 37, + 43, + 46, + 18, + 26, + 24, + 12, + 21, + 16, + 31, + 39, + 38, +-44, +-38, +-35, +-103, +-99, +-89, +-89, +-85, +-72, +-76, +-73, +-56, +-64, +-62, +-43, +-59, +-57, +-37, +-59, +-58, +-36, +-62, +-62, +-38, +-64, +-63, +-39, +-56, +-56, +-31, +-51, +-51, +-26, +-42, +-43, +-15, +-29, +-30, + -1, +-19, +-20, + 10, + -9, +-11, + 19, + 1, + -3, + 21, + 39, + 36, + 55, + 89, + 88, +101, + 99, +100, +106, +101, +104, +104, +106, +106, +104, +108, +105, +103, +108, +106, +103, +108, +106, +104, +106, +104, +103, +105, +103, +101, +105, +103, +102, +106, +104, +102, +106, +104, +102, +105, +103, +101, +105, +103, +101, +105, +103, +101, +103, +102, + 98, + 50, + 53, + 66, +-11, +-12, + 2, + 18, + 16, + 31, +-64, +-66, +-50, + 26, + 25, + 38, + 43, + 41, + 51, + 95, + 93, + 98, +104, +101, +102, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +103, +101, + 99, +104, +102, +100, +104, +102, +100, +102, +100, + 98, +103, +101, + 99, +102, +100, + 98, + 95, + 93, + 92, + 72, + 72, + 77, +-32, +-33, +-21, +-86, +-89, +-70, +-88, +-92, +-71, +-89, +-91, +-74, +-85, +-85, +-73, +-86, +-85, +-70, +-86, +-85, +-70, +-86, +-86, +-70, +-89, +-88, +-73, +-87, +-86, +-70, +-83, +-82, +-67, +-83, +-82, +-68, +-81, +-80, +-67, +-89, +-88, +-74, +-92, +-91, +-78, +-90, +-89, +-76, +-89, +-88, +-74, +-89, +-87, +-75, +-93, +-92, +-81, +-94, +-92, +-83, +-95, +-92, +-84, +-92, +-89, +-83, + 11, + 23, + 15, + 19, + 29, + 14, + 15, + 26, + 12, + 13, + 20, + 12, + 32, + 19, + 7, + 12, +-30, +-56, + 25, +-35, +-65, + 18, +-38, +-71, + 18, +-34, +-68, + 12, +-42, +-72, + 13, +-47, +-72, + 31, +-35, +-56, + 22, +-32, +-51, + 23, + 2, +-13, + 50, + 55, + 44, + 28, + 42, + 36, + 30, + 35, + 35, + 26, + 30, + 28, + 24, + 33, + 28, + 16, + 24, + 23, +-54, +-48, +-45, +-102, +-97, +-88, +-89, +-86, +-73, +-87, +-83, +-71, +-73, +-68, +-57, +-75, +-72, +-59, +-102, +-99, +-85, +-76, +-73, +-57, +-67, +-65, +-46, +-64, +-62, +-41, +-59, +-58, +-36, +-51, +-51, +-27, +-44, +-44, +-19, +-35, +-35, + -8, +-23, +-26, + 5, +-14, +-22, + 16, + -9, +-16, + 18, + 4, + -1, + 25, + 31, + 29, + 47, + 65, + 64, + 77, + 95, + 96, +100, +103, +104, +102, +103, +104, +102, +104, +104, +102, +104, +102, +101, +103, +101, +101, +104, +102, +100, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, +101, +105, +103, + 99, + 71, + 75, + 87, + 4, + 4, + 18, + 38, + 35, + 53, +-10, +-12, + 5, + 19, + 17, + 33, + 42, + 39, + 51, + 87, + 84, + 90, +103, +100, +103, +104, +101, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +104, +102, +100, +104, +102, +100, +103, +101, +100, +104, +102, +100, +104, +102, +100, +103, +101, + 99, +102, +100, + 98, + 97, + 95, + 93, + 29, + 28, + 35, +-73, +-75, +-61, +-91, +-93, +-77, +-94, +-96, +-81, +-91, +-92, +-79, +-87, +-87, +-77, +-92, +-90, +-79, +-92, +-91, +-79, +-92, +-90, +-78, +-90, +-88, +-76, +-88, +-87, +-74, +-87, +-86, +-73, +-86, +-84, +-72, +-87, +-86, +-74, +-100, +-98, +-87, +-93, +-92, +-80, +-90, +-89, +-77, +-88, +-86, +-74, +-89, +-88, +-75, +-94, +-92, +-81, +-97, +-94, +-85, +-96, +-93, +-86, +-92, +-89, +-83, + 18, + 29, + 23, + 24, + 34, + 19, + 18, + 28, + 14, + 14, + 26, + 18, + 28, + 24, + 14, + 25, + -1, +-19, + 25, +-36, +-55, + 29, +-35, +-61, + 31, +-33, +-65, + 15, +-47, +-77, + 21, +-40, +-59, + 27, +-30, +-40, + 45, + 12, + 4, + 40, + 32, + 20, + 29, + 43, + 30, + 23, + 41, + 31, + 33, + 40, + 35, + 29, + 34, + 28, + 27, + 36, + 31, + 28, + 36, + 35, +-81, +-76, +-73, +-98, +-94, +-84, +-92, +-89, +-75, +-91, +-86, +-76, +-93, +-88, +-80, +-103, +-98, +-89, +-106, +-102, +-90, +-84, +-81, +-68, +-71, +-68, +-52, +-66, +-64, +-45, +-65, +-63, +-44, +-63, +-62, +-41, +-58, +-56, +-34, +-49, +-48, +-24, +-41, +-42, +-14, +-29, +-35, + 4, +-24, +-28, + 7, +-18, +-21, + 10, +-14, +-16, + 12, + -8, + -9, + 15, + 7, + 9, + 24, + 57, + 61, + 67, + 98, +100, +105, +102, +102, +106, +103, +100, +102, +103, + 99, +100, +102, + 99, + 98, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 96, + 78, + 85, + 93, + 47, + 48, + 58, + 45, + 42, + 56, + 20, + 17, + 36, + 25, + 23, + 40, + 42, + 39, + 51, + 72, + 69, + 76, +104, +101, +105, +103, +100, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +101, + 99, + 97, +103, +101, +100, +104, +102, +100, +104, +102, +100, +102, +100, + 98, +101, + 99, + 98, + 89, + 87, + 86, +-29, +-31, +-23, +-84, +-86, +-71, +-94, +-95, +-82, +-102, +-102, +-91, +-98, +-98, +-88, +-94, +-94, +-86, +-95, +-93, +-84, +-95, +-93, +-84, +-95, +-93, +-84, +-93, +-91, +-82, +-93, +-91, +-82, +-93, +-91, +-82, +-89, +-87, +-76, +-88, +-86, +-76, +-106, +-104, +-93, +-96, +-95, +-84, +-89, +-87, +-77, +-89, +-87, +-76, +-91, +-90, +-77, +-94, +-92, +-82, +-97, +-94, +-85, +-97, +-94, +-87, +-85, +-82, +-77, + 23, + 30, + 25, + 30, + 35, + 22, + 22, + 30, + 17, + 17, + 34, + 27, + 5, + 15, + 7, + 30, + 20, + 3, + 26, + -6, +-24, + 25, +-27, +-50, + 25, +-41, +-70, + 13, +-48, +-74, + 23, +-17, +-35, + 48, + 26, + 16, + 49, + 41, + 36, + 26, + 28, + 20, + 26, + 37, + 26, + 30, + 41, + 31, + 32, + 40, + 31, + 33, + 41, + 33, + 39, + 48, + 42, + 19, + 26, + 24, +-101, +-95, +-92, +-97, +-93, +-83, +-93, +-89, +-76, +-89, +-85, +-74, +-90, +-86, +-76, +-86, +-82, +-70, +-82, +-78, +-65, +-82, +-78, +-64, +-72, +-69, +-53, +-69, +-66, +-50, +-68, +-65, +-49, +-68, +-66, +-48, +-68, +-66, +-47, +-63, +-61, +-40, +-53, +-52, +-30, +-45, +-45, +-19, +-37, +-37, +-10, +-33, +-33, + -5, +-26, +-27, + 2, +-16, +-17, + 13, +-10, + -9, + 18, + -9, + -7, + 16, + 27, + 28, + 44, + 69, + 68, + 79, +101, + 98, +103, +103, + 98, + 99, +102, + 99, + 98, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 96, + 71, + 79, + 88, + 89, + 93, +101, + 81, + 81, + 92, + 51, + 49, + 66, + 34, + 32, + 49, + 43, + 41, + 56, + 57, + 54, + 64, +103, +100, +104, +103, +100, +101, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +101, + 99, + 97, +100, + 98, + 96, +104, +101, + 99, +104, +102, + 99, +104, +102, + 99, +104, +102, +100, +103, +101, +101, + 62, + 60, + 61, +-61, +-63, +-51, +-91, +-92, +-78, +-101, +-101, +-90, +-105, +-105, +-96, +-101, +-101, +-93, +-98, +-97, +-90, +-98, +-96, +-90, +-98, +-96, +-89, +-98, +-96, +-89, +-99, +-96, +-89, +-96, +-94, +-86, +-94, +-91, +-83, +-91, +-89, +-79, +-93, +-91, +-81, +-107, +-104, +-94, +-96, +-94, +-84, +-90, +-88, +-78, +-92, +-90, +-79, +-93, +-92, +-80, +-95, +-93, +-82, +-97, +-95, +-85, +-99, +-96, +-89, +-85, +-82, +-78, + 26, + 29, + 26, + 30, + 33, + 21, + 26, + 33, + 21, + 21, + 38, + 30, + 22, + 36, + 29, + 17, + 20, + 7, + 28, + 22, + 6, + 19, + -9, +-28, + 13, +-35, +-58, + 21, +-19, +-39, + 55, + 39, + 22, + 43, + 48, + 36, + 38, + 49, + 43, + 30, + 38, + 31, + 34, + 39, + 31, + 35, + 41, + 32, + 32, + 40, + 30, + 37, + 46, + 38, + 47, + 55, + 51, + -8, + -2, + -3, +-104, +-99, +-94, +-98, +-94, +-84, +-90, +-87, +-74, +-91, +-88, +-76, +-89, +-85, +-74, +-89, +-86, +-73, +-92, +-89, +-75, +-73, +-70, +-55, +-59, +-56, +-41, +-67, +-65, +-50, +-70, +-68, +-52, +-72, +-70, +-54, +-72, +-71, +-53, +-70, +-68, +-49, +-61, +-60, +-41, +-58, +-56, +-39, +-49, +-47, +-28, +-44, +-44, +-21, +-36, +-37, +-10, +-34, +-35, + -5, +-32, +-32, + 1, +-32, +-33, + 0, +-25, +-27, + 0, + -9, +-11, + 6, + 83, + 78, + 84, +102, + 98, + 97, +100, + 98, + 95, +102, +100, + 99, +101, + 99, + 98, +102, +100, + 98, +102, +100, + 97, +102, +100, + 97, +101, +100, + 96, + 72, + 78, + 89, + 92, + 95, +104, + 94, + 96, +104, + 61, + 63, + 73, + 35, + 36, + 52, + 43, + 40, + 60, + 46, + 43, + 57, + 95, + 94, + 96, +102, +101, + 97, +101, + 99, + 98, +101, + 99, + 98, +102, +100, + 99, +103, +101, +100, +103, +101, +100, +104, +101, + 98, +105, +101, + 97, +104, +101, + 97, +104, +102, +101, +101, + 99, +104, + 16, + 12, + 24, +-69, +-70, +-60, +-97, +-97, +-88, +-104, +-104, +-95, +-109, +-109, +-100, +-102, +-102, +-93, +-99, +-99, +-90, +-100, +-99, +-93, +-100, +-100, +-92, +-100, +-100, +-91, +-98, +-99, +-88, +-95, +-96, +-83, +-93, +-94, +-81, +-91, +-89, +-80, +-93, +-90, +-82, +-105, +-103, +-95, +-96, +-93, +-85, +-91, +-88, +-80, +-92, +-89, +-82, +-95, +-93, +-85, +-96, +-95, +-83, +-97, +-95, +-84, +-100, +-97, +-91, +-85, +-81, +-80, + 24, + 31, + 24, + 29, + 36, + 27, + 27, + 34, + 25, + 28, + 36, + 27, + 30, + 38, + 29, + 22, + 29, + 20, + 20, + 24, + 15, + 26, + 20, + 11, + 7, + -7, +-17, + 56, + 44, + 33, + 50, + 47, + 37, + 43, + 49, + 40, + 37, + 43, + 37, + 33, + 40, + 33, + 34, + 41, + 34, + 34, + 40, + 34, + 34, + 40, + 34, + 45, + 51, + 48, + 46, + 51, + 52, +-43, +-39, +-37, +-99, +-96, +-89, +-96, +-94, +-83, +-91, +-89, +-76, +-86, +-84, +-73, +-94, +-92, +-81, +-87, +-85, +-74, +-89, +-87, +-77, +-86, +-84, +-73, +-80, +-78, +-67, +-69, +-69, +-53, +-69, +-69, +-52, +-74, +-74, +-57, +-76, +-76, +-59, +-73, +-73, +-56, +-67, +-66, +-49, +-63, +-63, +-44, +-60, +-61, +-41, +-53, +-54, +-33, +-49, +-51, +-27, +-49, +-51, +-26, +-49, +-50, +-24, +-50, +-52, +-24, +-38, +-41, +-16, +-29, +-35, +-15, + 57, + 50, + 58, +102, + 96, + 94, +100, + 97, + 93, +100, + 98, + 94, +100, + 98, + 94, +101, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 93, + 92, + 96, + 98, + 95, + 97, + 98, + 94, + 95, + 74, + 76, + 83, + 36, + 37, + 51, + 43, + 41, + 59, + 43, + 41, + 55, + 84, + 83, + 86, +101, + 99, + 97, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, + 99, + 98, +103, + 99, + 97, +103, +100, + 96, +102, +100, + 99, + 85, + 82, + 89, +-39, +-43, +-30, +-83, +-84, +-73, +-103, +-103, +-94, +-109, +-109, +-100, +-111, +-111, +-102, +-104, +-104, +-95, +-100, +-100, +-92, +-101, +-100, +-93, +-101, +-101, +-93, +-100, +-100, +-91, +-98, +-99, +-88, +-95, +-96, +-83, +-93, +-93, +-81, +-91, +-89, +-80, +-92, +-89, +-81, +-101, +-99, +-91, +-100, +-97, +-89, +-92, +-89, +-81, +-92, +-89, +-82, +-95, +-93, +-85, +-96, +-95, +-83, +-97, +-96, +-84, +-101, +-98, +-92, +-81, +-77, +-77, + 26, + 32, + 25, + 29, + 37, + 28, + 27, + 34, + 25, + 29, + 36, + 27, + 32, + 39, + 30, + 28, + 36, + 27, + 22, + 30, + 21, + 30, + 32, + 21, + 50, + 46, + 34, + 51, + 47, + 36, + 44, + 47, + 37, + 41, + 49, + 41, + 34, + 41, + 34, + 35, + 42, + 35, + 34, + 41, + 34, + 34, + 41, + 34, + 40, + 47, + 40, + 46, + 52, + 49, + 36, + 40, + 42, +-80, +-77, +-74, +-98, +-95, +-88, +-96, +-94, +-83, +-90, +-89, +-76, +-87, +-85, +-74, +-90, +-88, +-78, +-95, +-93, +-82, +-88, +-86, +-76, +-85, +-83, +-72, +-84, +-82, +-72, +-73, +-72, +-57, +-71, +-71, +-56, +-78, +-77, +-62, +-80, +-80, +-65, +-82, +-81, +-66, +-78, +-77, +-62, +-73, +-72, +-56, +-69, +-69, +-52, +-63, +-64, +-45, +-61, +-62, +-41, +-61, +-62, +-40, +-61, +-62, +-38, +-63, +-65, +-39, +-42, +-44, +-20, +-38, +-43, +-24, + 35, + 28, + 36, +106, +100, + 99, +102, + 99, + 95, +101, +100, + 96, +101, +100, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 68, + 71, + 79, + 80, + 81, + 87, + 94, + 94, + 98, + 85, + 88, + 94, + 40, + 42, + 54, + 43, + 41, + 59, + 43, + 40, + 56, + 72, + 71, + 76, + 98, + 96, + 95, + 99, + 97, + 95, + 99, + 97, + 95, +100, + 98, + 96, +101, + 99, + 97, +101, + 99, + 97, +102, + 98, + 98, +102, + 98, + 97, +102, + 98, + 96, +100, + 97, + 98, + 49, + 47, + 54, +-69, +-74, +-58, +-90, +-92, +-80, +-105, +-105, +-96, +-109, +-109, +-100, +-111, +-111, +-102, +-105, +-105, +-96, +-102, +-102, +-93, +-100, +-99, +-92, +-99, +-99, +-91, +-98, +-98, +-88, +-97, +-98, +-87, +-95, +-96, +-82, +-93, +-93, +-80, +-92, +-89, +-81, +-92, +-89, +-81, +-97, +-94, +-86, +-103, +-101, +-93, +-94, +-91, +-83, +-93, +-90, +-83, +-95, +-93, +-85, +-97, +-95, +-84, +-98, +-96, +-85, +-103, +-100, +-94, +-84, +-79, +-79, + 25, + 32, + 25, + 28, + 35, + 26, + 27, + 34, + 25, + 29, + 36, + 27, + 32, + 40, + 30, + 33, + 41, + 32, + 28, + 40, + 31, + 39, + 47, + 36, + 46, + 51, + 37, + 42, + 48, + 34, + 40, + 50, + 39, + 31, + 42, + 34, + 31, + 38, + 31, + 33, + 39, + 33, + 35, + 42, + 35, + 38, + 45, + 39, + 44, + 51, + 44, + 45, + 51, + 48, + 16, + 20, + 21, +-102, +-99, +-95, +-98, +-95, +-88, +-97, +-95, +-84, +-91, +-90, +-77, +-87, +-86, +-74, +-88, +-86, +-75, +-88, +-86, +-75, +-83, +-81, +-70, +-90, +-88, +-78, +-93, +-91, +-80, +-74, +-73, +-60, +-75, +-74, +-61, +-80, +-78, +-65, +-84, +-83, +-70, +-87, +-86, +-73, +-87, +-85, +-73, +-83, +-81, +-69, +-79, +-78, +-64, +-74, +-73, +-57, +-71, +-71, +-53, +-71, +-72, +-53, +-72, +-72, +-52, +-74, +-74, +-53, +-55, +-57, +-35, +-47, +-52, +-35, + 28, + 21, + 29, +106, +100, +101, +101, + 98, + 95, +100, + 99, + 95, +100, + 99, + 95, +101, +100, + 95, +101, +100, + 96, +101, +100, + 96, + 99, + 97, + 93, + 53, + 65, + 78, + 62, + 69, + 81, + 88, + 94, +104, + 91, + 95, + 99, + 52, + 54, + 64, + 41, + 39, + 57, + 38, + 34, + 51, + 61, + 58, + 67, +103, +100, +102, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, + 99, +100, +105, + 99, +100, +104, +100, + 99, +100, + 97, +100, + 5, + 2, + 11, +-77, +-83, +-64, +-94, +-96, +-83, +-105, +-105, +-96, +-108, +-109, +-100, +-112, +-112, +-103, +-106, +-106, +-97, +-104, +-104, +-95, +-100, +-100, +-93, +-97, +-97, +-89, +-95, +-95, +-85, +-94, +-95, +-84, +-93, +-94, +-81, +-93, +-93, +-81, +-92, +-90, +-81, +-92, +-89, +-81, +-93, +-91, +-83, +-106, +-103, +-95, +-96, +-93, +-85, +-95, +-92, +-85, +-96, +-94, +-86, +-97, +-96, +-85, +-100, +-98, +-87, +-105, +-101, +-96, +-81, +-76, +-76, + 27, + 34, + 27, + 30, + 38, + 29, + 28, + 36, + 27, + 30, + 38, + 29, + 35, + 42, + 33, + 36, + 44, + 35, + 38, + 49, + 43, + 43, + 53, + 44, + 42, + 52, + 38, + 40, + 50, + 37, + 38, + 48, + 39, + 26, + 37, + 31, + 33, + 39, + 33, + 36, + 43, + 36, + 40, + 46, + 40, + 43, + 50, + 43, + 44, + 50, + 44, + 44, + 50, + 47, + -8, + -4, + -3, +-105, +-101, +-97, +-99, +-96, +-88, +-98, +-96, +-85, +-92, +-91, +-78, +-88, +-86, +-75, +-87, +-85, +-74, +-86, +-84, +-73, +-86, +-84, +-74, +-94, +-92, +-82, +-96, +-94, +-83, +-77, +-75, +-64, +-78, +-76, +-65, +-84, +-82, +-71, +-87, +-85, +-74, +-90, +-88, +-77, +-92, +-90, +-79, +-90, +-88, +-79, +-87, +-86, +-75, +-84, +-83, +-71, +-80, +-79, +-65, +-79, +-79, +-63, +-79, +-77, +-61, +-76, +-75, +-58, +-63, +-64, +-46, +-55, +-60, +-45, + 15, + 9, + 16, +103, + 97, + 98, +103, + 99, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +102, +100, + 96, +101, + 99, + 95, + 98, + 97, + 93, + 65, + 70, + 79, + 72, + 75, + 83, + 92, + 93, + 99, + 94, + 99, +100, + 63, + 65, + 73, + 47, + 45, + 63, + 38, + 35, + 52, + 50, + 47, + 57, + 98, + 95, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +103, +100, +101, +105, +100, +102, +104, +100, +101, + 91, + 87, + 91, +-39, +-43, +-32, +-83, +-88, +-68, +-96, +-98, +-85, +-107, +-107, +-98, +-110, +-110, +-101, +-112, +-112, +-103, +-106, +-106, +-97, +-104, +-104, +-95, +-100, +-100, +-93, +-97, +-97, +-89, +-94, +-95, +-85, +-94, +-95, +-83, +-95, +-96, +-83, +-96, +-96, +-84, +-95, +-92, +-84, +-95, +-92, +-84, +-94, +-92, +-84, +-107, +-104, +-96, +-99, +-97, +-88, +-97, +-94, +-87, +-98, +-95, +-87, +-99, +-97, +-86, +-101, +-99, +-88, +-104, +-101, +-95, +-76, +-72, +-72, + 30, + 37, + 29, + 32, + 40, + 30, + 30, + 37, + 28, + 34, + 41, + 32, + 38, + 45, + 36, + 37, + 44, + 36, + 46, + 52, + 48, + 51, + 59, + 51, + 44, + 54, + 42, + 40, + 50, + 39, + 38, + 46, + 39, + 32, + 39, + 34, + 41, + 48, + 41, + 44, + 50, + 44, + 43, + 50, + 44, + 42, + 49, + 42, + 42, + 49, + 43, + 43, + 49, + 46, +-43, +-39, +-38, +-103, +-99, +-95, +-98, +-95, +-88, +-98, +-96, +-85, +-92, +-91, +-78, +-87, +-85, +-74, +-87, +-85, +-74, +-87, +-85, +-75, +-90, +-88, +-78, +-101, +-99, +-88, +-91, +-89, +-79, +-81, +-79, +-69, +-86, +-84, +-73, +-89, +-87, +-77, +-92, +-90, +-79, +-94, +-93, +-82, +-97, +-95, +-85, +-96, +-93, +-85, +-92, +-90, +-82, +-90, +-88, +-78, +-89, +-88, +-77, +-86, +-84, +-71, +-89, +-86, +-73, +-85, +-83, +-70, +-79, +-79, +-63, +-67, +-71, +-58, +-20, +-26, +-19, + 98, + 92, + 93, +104, +101, + 98, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +101, + 97, +103, +102, + 98, + 93, + 93, + 98, +100, + 98, +103, +100, + 98, +101, + 95, + 98, + 99, + 79, + 80, + 88, + 54, + 52, + 69, + 45, + 42, + 60, + 44, + 42, + 56, + 88, + 86, + 92, +100, + 97, + 96, +101, + 99, + 98, +102, +100, + 99, +102, +100, + 98, +101, + 99, + 97, + 99, + 96, + 95, +103, + 99, + 99, +103, +100, +102, + 58, + 55, + 60, +-69, +-72, +-60, +-89, +-93, +-75, +-99, +-100, +-89, +-108, +-108, +-101, +-112, +-111, +-105, +-112, +-111, +-105, +-107, +-107, +-100, +-105, +-104, +-97, +-99, +-99, +-90, +-96, +-96, +-86, +-95, +-95, +-85, +-96, +-97, +-85, +-98, +-99, +-86, +-99, +-100, +-88, +-98, +-97, +-88, +-97, +-96, +-87, +-96, +-95, +-86, +-106, +-104, +-96, +-100, +-99, +-90, +-98, +-96, +-88, +-98, +-95, +-87, +-99, +-97, +-88, +-101, +-98, +-90, +-104, +-100, +-96, +-76, +-71, +-71, + 30, + 37, + 31, + 33, + 40, + 32, + 31, + 38, + 30, + 36, + 43, + 35, + 34, + 41, + 33, + 33, + 39, + 32, + 49, + 53, + 50, + 49, + 54, + 49, + 53, + 58, + 51, + 47, + 52, + 45, + 40, + 45, + 41, + 41, + 46, + 42, + 45, + 51, + 45, + 42, + 49, + 42, + 43, + 49, + 43, + 42, + 48, + 42, + 44, + 50, + 44, + 33, + 39, + 36, +-83, +-80, +-78, +-102, +-99, +-94, +-98, +-95, +-88, +-98, +-96, +-86, +-92, +-90, +-78, +-86, +-84, +-73, +-86, +-84, +-73, +-89, +-87, +-76, +-94, +-92, +-82, +-102, +-100, +-89, +-85, +-83, +-73, +-85, +-83, +-72, +-92, +-90, +-80, +-94, +-92, +-83, +-97, +-94, +-85, +-98, +-95, +-88, +-100, +-97, +-90, +-99, +-97, +-90, +-98, +-95, +-88, +-95, +-92, +-84, +-94, +-92, +-82, +-93, +-91, +-81, +-97, +-95, +-85, +-92, +-92, +-80, +-91, +-90, +-77, +-81, +-82, +-70, +-52, +-56, +-49, + 87, + 82, + 83, +105, +101, + 99, +105, +102, + 98, +104, +101, + 97, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 97, + 89, + 89, + 96, + 87, + 88, + 94, + 90, + 91, + 97, + 91, + 93, + 94, + 90, + 90, + 99, + 64, + 62, + 78, + 45, + 42, + 61, + 39, + 37, + 53, + 75, + 73, + 82, +100, + 98, + 97, +101, + 99, + 97, +100, + 97, + 96, +101, + 99, + 97, +102, +100, + 98, + 98, + 97, + 94, +101, + 99, + 97, +102, +100, +102, + 16, + 14, + 19, +-79, +-81, +-69, +-95, +-97, +-81, +-102, +-102, +-94, +-110, +-109, +-105, +-113, +-111, +-107, +-112, +-110, +-106, +-109, +-107, +-103, +-106, +-104, +-100, +-97, +-97, +-87, +-93, +-94, +-83, +-94, +-95, +-84, +-96, +-97, +-86, +-98, +-98, +-87, +-99, +-99, +-89, +-98, +-98, +-89, +-97, +-97, +-88, +-96, +-96, +-87, +-103, +-103, +-94, +-101, +-101, +-92, +-97, +-96, +-87, +-96, +-93, +-86, +-99, +-95, +-89, +-103, +-99, +-95, +-108, +-104, +-101, +-67, +-63, +-62, + 35, + 41, + 36, + 34, + 41, + 34, + 32, + 38, + 32, + 39, + 46, + 39, + 34, + 41, + 34, + 35, + 42, + 35, + 51, + 55, + 51, + 51, + 55, + 51, + 53, + 57, + 53, + 54, + 57, + 54, + 47, + 50, + 47, + 43, + 47, + 43, + 42, + 49, + 42, + 43, + 49, + 43, + 42, + 49, + 42, + 40, + 47, + 41, + 43, + 50, + 43, + 9, + 15, + 12, +-105, +-101, +-98, +-101, +-97, +-92, +-99, +-97, +-89, +-99, +-97, +-88, +-91, +-89, +-78, +-86, +-84, +-73, +-85, +-83, +-73, +-91, +-89, +-78, +-100, +-98, +-87, +-94, +-92, +-81, +-85, +-83, +-72, +-89, +-87, +-76, +-96, +-94, +-84, +-100, +-97, +-89, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-98, +-94, +-101, +-99, +-91, +-101, +-99, +-91, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-101, +-92, +-93, +-94, +-85, +-92, +-89, +-78, +-83, +-80, +-69, +-53, +-53, +-46, + 87, + 83, + 85, +100, + 96, + 94, +101, + 97, + 94, +105, +101, + 98, +105, +101, + 98, +104, +100, + 97, +104, +100, + 97, +102, + 99, + 93, +102, +103, +109, + 96, + 97, +103, + 99, + 99, +106, +101, +102, +106, +100, +100, +108, + 71, + 70, + 83, + 53, + 51, + 67, + 40, + 38, + 55, + 62, + 60, + 71, +101, + 99, + 97, +100, + 98, + 96, + 97, + 95, + 93, +101, + 99, + 97, +102, +100, + 98, +101, + 99, + 96, +101, + 99, + 97, + 91, + 88, + 92, +-41, +-43, +-36, +-83, +-84, +-72, +-95, +-97, +-83, +-105, +-105, +-98, +-112, +-111, +-107, +-113, +-111, +-107, +-112, +-110, +-106, +-109, +-107, +-103, +-106, +-104, +-100, +-98, +-98, +-89, +-95, +-95, +-86, +-96, +-96, +-87, +-98, +-98, +-89, +-100, +-100, +-91, +-100, +-100, +-91, +-98, +-98, +-89, +-97, +-97, +-88, +-95, +-95, +-86, +-101, +-101, +-92, +-104, +-104, +-95, +-97, +-96, +-87, +-96, +-93, +-86, +-99, +-95, +-89, +-103, +-99, +-95, +-107, +-103, +-100, +-65, +-60, +-60, + 39, + 46, + 41, + 38, + 44, + 38, + 33, + 40, + 33, + 39, + 46, + 39, + 34, + 41, + 34, + 35, + 41, + 35, + 54, + 58, + 54, + 54, + 57, + 54, + 53, + 56, + 53, + 57, + 60, + 57, + 52, + 56, + 52, + 49, + 52, + 49, + 44, + 50, + 44, + 42, + 49, + 42, + 40, + 47, + 40, + 38, + 45, + 38, + 39, + 46, + 39, +-26, +-21, +-25, +-106, +-101, +-98, +-99, +-96, +-90, +-100, +-97, +-90, +-99, +-97, +-88, +-91, +-89, +-78, +-86, +-84, +-74, +-89, +-87, +-77, +-94, +-93, +-82, +-102, +-100, +-90, +-88, +-86, +-75, +-85, +-83, +-73, +-90, +-88, +-78, +-98, +-96, +-86, +-101, +-98, +-91, +-103, +-100, +-94, +-103, +-99, +-95, +-103, +-100, +-95, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-97, +-89, +-102, +-99, +-91, +-105, +-105, +-97, +-97, +-97, +-89, +-93, +-90, +-80, +-82, +-79, +-68, +-59, +-59, +-51, + 64, + 59, + 63, +103, + 98, + 97, +102, + 98, + 95, +103, + 99, + 95, +101, + 97, + 94, +100, + 96, + 93, +100, + 96, + 93, +100, + 96, + 91, + 82, + 83, + 90, + 84, + 85, + 91, + 86, + 87, + 93, + 85, + 87, + 92, + 87, + 87, + 94, + 73, + 73, + 83, + 58, + 57, + 71, + 40, + 38, + 55, + 52, + 49, + 63, + 99, + 97, + 96, + 99, + 97, + 95, + 99, + 97, + 95, +102, +100, + 98, +101, + 99, + 97, +100, + 98, + 95, +101, + 98, + 98, + 54, + 50, + 55, +-74, +-76, +-65, +-87, +-88, +-76, +-100, +-100, +-91, +-110, +-109, +-104, +-114, +-112, +-108, +-115, +-113, +-109, +-112, +-111, +-107, +-111, +-110, +-106, +-108, +-107, +-102, +-102, +-102, +-95, +-98, +-98, +-91, +-98, +-98, +-90, +-99, +-99, +-92, +-101, +-101, +-93, +-102, +-102, +-94, +-101, +-101, +-92, +-98, +-98, +-89, +-96, +-96, +-87, +-98, +-98, +-89, +-106, +-106, +-97, +-98, +-97, +-88, +-97, +-94, +-86, +-99, +-96, +-90, +-102, +-98, +-94, +-106, +-101, +-99, +-66, +-63, +-62, + 41, + 47, + 42, + 40, + 47, + 40, + 34, + 41, + 34, + 44, + 51, + 44, + 38, + 44, + 38, + 37, + 44, + 37, + 55, + 58, + 55, + 54, + 57, + 54, + 53, + 57, + 53, + 56, + 60, + 56, + 49, + 52, + 49, + 54, + 59, + 54, + 51, + 57, + 51, + 43, + 50, + 43, + 37, + 44, + 38, + 38, + 45, + 38, + 36, + 43, + 36, +-55, +-50, +-54, +-104, +-100, +-96, +-100, +-97, +-91, +-100, +-97, +-89, +-99, +-97, +-88, +-93, +-91, +-80, +-90, +-88, +-78, +-94, +-92, +-82, +-99, +-98, +-87, +-97, +-95, +-85, +-86, +-84, +-73, +-83, +-81, +-71, +-90, +-88, +-77, +-97, +-94, +-85, +-101, +-98, +-91, +-102, +-99, +-93, +-102, +-98, +-95, +-102, +-99, +-94, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-99, +-97, +-89, +-102, +-100, +-92, +-107, +-106, +-100, +-101, +-100, +-95, +-95, +-92, +-83, +-83, +-80, +-70, +-63, +-64, +-54, + 39, + 34, + 40, +102, + 97, + 96, +101, + 97, + 93, +101, + 96, + 93, + 99, + 95, + 92, + 99, + 95, + 92, + 99, + 95, + 92, + 98, + 94, + 89, + 80, + 81, + 88, + 81, + 82, + 88, + 81, + 82, + 89, + 82, + 82, + 91, + 84, + 85, + 92, + 75, + 76, + 83, + 65, + 64, + 76, + 44, + 41, + 59, + 45, + 42, + 57, + 95, + 93, + 92, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +102, +100, + 98, +100, + 98, + 95, + 94, + 91, + 92, + -5, + -9, + -1, +-77, +-81, +-66, +-90, +-91, +-80, +-104, +-103, +-98, +-112, +-111, +-107, +-114, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-107, +-113, +-111, +-107, +-110, +-108, +-104, +-104, +-104, +-98, +-100, +-99, +-93, +-99, +-98, +-92, +-100, +-99, +-93, +-101, +-101, +-95, +-103, +-102, +-95, +-102, +-102, +-93, +-99, +-99, +-90, +-96, +-96, +-87, +-96, +-96, +-87, +-106, +-106, +-97, +-100, +-98, +-90, +-99, +-96, +-88, +-101, +-97, +-92, +-103, +-99, +-95, +-104, +-100, +-97, +-59, +-55, +-54, + 42, + 48, + 43, + 39, + 46, + 39, + 39, + 45, + 39, + 47, + 54, + 48, + 39, + 46, + 39, + 43, + 50, + 43, + 55, + 59, + 55, + 53, + 56, + 53, + 57, + 60, + 57, + 55, + 59, + 56, + 45, + 49, + 45, + 49, + 54, + 49, + 53, + 60, + 53, + 50, + 56, + 50, + 39, + 46, + 39, + 38, + 44, + 38, + 26, + 32, + 26, +-93, +-88, +-90, +-101, +-97, +-93, +-98, +-95, +-90, +-99, +-96, +-89, +-99, +-97, +-88, +-93, +-91, +-81, +-93, +-91, +-80, +-96, +-94, +-83, +-104, +-102, +-91, +-92, +-90, +-79, +-84, +-82, +-71, +-81, +-79, +-68, +-88, +-86, +-75, +-94, +-92, +-82, +-99, +-96, +-89, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-100, +-97, +-89, +-105, +-102, +-94, +-108, +-106, +-102, +-100, +-98, +-95, +-94, +-91, +-83, +-87, +-85, +-74, +-70, +-71, +-60, + 11, + 5, + 14, +104, +100, +100, +103, + 99, + 96, +104, +100, + 97, +104, +100, + 97, +104, +100, + 97, +104, +100, + 97, +103, + 99, + 94, + 79, + 79, + 86, + 81, + 81, + 88, + 84, + 85, + 92, + 88, + 87, + 98, + 86, + 86, + 94, + 81, + 81, + 87, + 74, + 73, + 83, + 46, + 44, + 62, + 41, + 38, + 54, + 83, + 81, + 80, +101, + 99, + 98, +101, + 99, + 97, +102, +100, + 98, +102, +100, + 98, +102, +101, + 98, + 92, + 89, + 90, +-36, +-41, +-30, +-80, +-85, +-68, +-95, +-96, +-85, +-107, +-105, +-104, +-113, +-111, +-108, +-114, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-107, +-113, +-111, +-107, +-110, +-108, +-104, +-106, +-105, +-101, +-101, +-100, +-96, +-101, +-100, +-96, +-102, +-100, +-96, +-103, +-102, +-98, +-104, +-103, +-98, +-102, +-102, +-93, +-99, +-99, +-90, +-97, +-97, +-88, +-96, +-96, +-87, +-105, +-105, +-96, +-100, +-99, +-90, +-98, +-95, +-88, +-100, +-97, +-91, +-102, +-98, +-94, +-102, +-98, +-95, +-55, +-51, +-50, + 45, + 52, + 47, + 43, + 50, + 44, + 45, + 52, + 45, + 47, + 53, + 47, + 38, + 45, + 38, + 48, + 54, + 48, + 51, + 55, + 51, + 54, + 58, + 54, + 57, + 61, + 57, + 57, + 60, + 57, + 46, + 49, + 46, + 45, + 49, + 45, + 53, + 60, + 53, + 55, + 61, + 55, + 43, + 50, + 43, + 38, + 45, + 38, + -2, + 4, + -2, +-106, +-101, +-102, +-100, +-96, +-92, +-99, +-96, +-90, +-99, +-96, +-89, +-99, +-97, +-88, +-93, +-91, +-81, +-94, +-92, +-81, +-101, +-99, +-88, +-103, +-101, +-90, +-89, +-87, +-77, +-86, +-84, +-73, +-83, +-81, +-70, +-87, +-85, +-75, +-93, +-91, +-81, +-99, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-108, +-106, +-98, +-108, +-106, +-102, +-99, +-97, +-96, +-94, +-90, +-83, +-90, +-87, +-75, +-74, +-75, +-63, +-25, +-32, +-21, + 94, + 89, + 90, +103, + 99, + 96, +105, +101, + 98, +106, +102, + 99, +106, +101, + 98, +105, +101, + 98, +104, +101, + 95, + 79, + 79, + 85, + 81, + 80, + 86, + 72, + 71, + 78, + 66, + 66, + 76, + 53, + 54, + 62, + 49, + 51, + 58, + 49, + 50, + 59, + 48, + 45, + 61, + 41, + 37, + 52, + 68, + 66, + 71, + 98, + 97, + 97, +100, + 99, + 95, +101, + 99, + 94, +102, + 99, + 96, +102, +101, + 98, + 69, + 70, + 71, +-58, +-60, +-48, +-89, +-92, +-74, +-98, +-99, +-87, +-109, +-107, +-105, +-113, +-110, +-110, +-114, +-112, +-111, +-116, +-114, +-112, +-113, +-112, +-109, +-114, +-112, +-108, +-111, +-109, +-105, +-106, +-105, +-99, +-104, +-103, +-97, +-103, +-102, +-96, +-102, +-102, +-96, +-103, +-103, +-97, +-104, +-103, +-96, +-104, +-102, +-94, +-101, +-99, +-91, +-96, +-94, +-86, +-96, +-94, +-86, +-105, +-103, +-95, +-100, +-98, +-90, +-94, +-91, +-84, +-98, +-94, +-88, +-101, +-98, +-94, +-100, +-96, +-93, +-54, +-50, +-49, + 50, + 56, + 51, + 49, + 56, + 49, + 46, + 52, + 46, + 45, + 52, + 45, + 36, + 43, + 36, + 52, + 59, + 52, + 53, + 60, + 52, + 51, + 57, + 49, + 53, + 58, + 53, + 53, + 59, + 55, + 45, + 51, + 47, + 40, + 45, + 41, + 52, + 59, + 52, + 54, + 61, + 54, + 45, + 51, + 48, + 37, + 42, + 41, +-44, +-40, +-40, +-103, +-99, +-95, +-99, +-96, +-89, +-99, +-96, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-94, +-91, +-83, +-95, +-92, +-85, +-105, +-102, +-94, +-99, +-96, +-87, +-91, +-89, +-78, +-86, +-85, +-73, +-84, +-83, +-70, +-87, +-85, +-74, +-93, +-91, +-81, +-98, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-111, +-109, +-101, +-107, +-105, +-98, +-100, +-98, +-91, +-95, +-92, +-84, +-89, +-88, +-76, +-77, +-77, +-64, +-53, +-54, +-41, + 69, + 67, + 67, +102, +100, + 96, +102, +100, + 96, +105, +102, + 98, +105, +102, + 98, +105, +102, + 98, +105, +103, + 98, + 65, + 74, + 87, + 66, + 75, + 88, + 66, + 74, + 87, + 76, + 79, + 92, + 77, + 79, + 89, + 78, + 81, + 88, + 79, + 80, + 89, + 75, + 74, + 87, + 45, + 41, + 56, + 57, + 55, + 64, + 95, + 94, + 96, + 97, + 96, + 92, +101, + 98, + 93, +103, + 98, + 96, +102, +101, + 99, + 42, + 44, + 45, +-71, +-72, +-60, +-91, +-94, +-76, +-99, +-100, +-88, +-111, +-109, +-107, +-113, +-111, +-112, +-114, +-112, +-112, +-116, +-113, +-113, +-115, +-113, +-111, +-114, +-113, +-109, +-110, +-109, +-104, +-107, +-106, +-100, +-105, +-105, +-98, +-104, +-103, +-97, +-104, +-103, +-97, +-103, +-103, +-96, +-102, +-101, +-94, +-101, +-99, +-91, +-102, +-99, +-91, +-97, +-94, +-86, +-95, +-93, +-84, +-103, +-100, +-92, +-100, +-97, +-89, +-92, +-90, +-82, +-98, +-94, +-88, +-101, +-97, +-93, +-101, +-97, +-94, +-46, +-42, +-42, + 52, + 58, + 53, + 48, + 55, + 48, + 46, + 53, + 46, + 44, + 51, + 44, + 38, + 45, + 39, + 50, + 57, + 50, + 49, + 56, + 47, + 52, + 59, + 50, + 51, + 58, + 51, + 52, + 58, + 53, + 44, + 50, + 47, + 40, + 46, + 42, + 49, + 56, + 48, + 54, + 60, + 54, + 44, + 50, + 47, + 28, + 33, + 35, +-80, +-77, +-74, +-101, +-97, +-91, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-97, +-89, +-101, +-98, +-90, +-95, +-92, +-84, +-99, +-96, +-90, +-106, +-103, +-96, +-97, +-95, +-87, +-93, +-91, +-81, +-87, +-85, +-74, +-84, +-83, +-70, +-88, +-86, +-75, +-93, +-91, +-82, +-99, +-96, +-88, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-99, +-91, +-111, +-109, +-100, +-106, +-103, +-95, +-100, +-97, +-89, +-96, +-94, +-85, +-90, +-89, +-76, +-79, +-78, +-65, +-60, +-59, +-45, + 48, + 47, + 47, +103, +102, + 98, +104, +103, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, + -5, + 17, + 41, + -1, + 22, + 46, + -4, + 17, + 40, + 54, + 62, + 79, + 77, + 82, + 94, + 80, + 82, + 89, + 77, + 76, + 84, + 73, + 71, + 84, + 48, + 46, + 61, + 53, + 50, + 60, + 93, + 92, + 95, +100, + 98, + 96, +100, + 97, + 94, + 99, + 94, + 94, + 93, + 92, + 93, + -5, + -4, + 1, +-84, +-85, +-73, +-99, +-100, +-85, +-104, +-104, +-95, +-112, +-110, +-108, +-113, +-111, +-112, +-114, +-112, +-112, +-116, +-113, +-113, +-116, +-114, +-112, +-115, +-113, +-109, +-108, +-107, +-103, +-108, +-107, +-101, +-107, +-106, +-99, +-105, +-105, +-98, +-105, +-105, +-98, +-102, +-102, +-95, +-101, +-100, +-93, +-101, +-98, +-90, +-100, +-97, +-89, +-94, +-92, +-84, +-95, +-92, +-84, +-99, +-97, +-89, +-105, +-102, +-94, +-99, +-96, +-88, +-101, +-97, +-92, +-101, +-97, +-93, +-100, +-96, +-94, +-45, +-41, +-40, + 51, + 58, + 53, + 50, + 57, + 51, + 50, + 57, + 50, + 45, + 51, + 45, + 41, + 48, + 41, + 56, + 63, + 56, + 52, + 59, + 51, + 49, + 57, + 48, + 52, + 59, + 52, + 50, + 56, + 52, + 44, + 50, + 46, + 41, + 48, + 44, + 45, + 52, + 45, + 54, + 61, + 54, + 46, + 51, + 49, + 12, + 16, + 18, +-103, +-99, +-96, +-100, +-97, +-90, +-99, +-96, +-88, +-99, +-96, +-88, +-98, +-96, +-88, +-100, +-97, +-89, +-96, +-94, +-85, +-104, +-101, +-95, +-102, +-99, +-92, +-95, +-92, +-84, +-91, +-89, +-79, +-88, +-86, +-75, +-89, +-87, +-74, +-90, +-88, +-77, +-95, +-93, +-84, +-100, +-98, +-90, +-102, +-99, +-93, +-102, +-98, +-94, +-102, +-99, +-94, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-103, +-100, +-93, +-110, +-107, +-99, +-104, +-101, +-93, +-99, +-96, +-88, +-97, +-94, +-85, +-92, +-91, +-79, +-82, +-80, +-67, +-62, +-61, +-47, + 44, + 42, + 42, +103, +101, + 97, +103, +102, + 98, +104, +102, + 98, +104, +102, + 98, +104, +102, + 98, +102, +101, + 97, +-23, + 9, + 41, +-19, + 14, + 46, +-19, + 12, + 42, + 22, + 36, + 57, + 81, + 89, +103, + 93, + 94, +101, + 73, + 71, + 78, + 45, + 43, + 57, + 43, + 41, + 59, + 48, + 44, + 56, + 82, + 81, + 86, + 96, + 94, + 94, + 97, + 94, + 92, + 99, + 94, + 96, + 66, + 63, + 69, +-54, +-54, +-46, +-97, +-98, +-87, +-105, +-106, +-96, +-110, +-109, +-103, +-114, +-112, +-111, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-114, +-112, +-108, +-107, +-106, +-102, +-108, +-108, +-101, +-107, +-107, +-100, +-105, +-105, +-98, +-104, +-104, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-99, +-90, +-98, +-96, +-87, +-96, +-93, +-85, +-95, +-92, +-84, +-96, +-94, +-86, +-106, +-104, +-96, +-99, +-96, +-89, +-100, +-96, +-91, +-102, +-99, +-95, +-101, +-97, +-94, +-47, +-43, +-42, + 51, + 57, + 52, + 52, + 59, + 52, + 51, + 58, + 51, + 42, + 49, + 42, + 41, + 47, + 41, + 52, + 59, + 52, + 61, + 68, + 59, + 52, + 60, + 51, + 48, + 54, + 48, + 49, + 55, + 51, + 43, + 49, + 45, + 42, + 48, + 44, + 42, + 49, + 41, + 52, + 58, + 52, + 44, + 49, + 47, +-24, +-20, +-18, +-105, +-102, +-98, +-100, +-97, +-91, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-97, +-89, +-106, +-103, +-97, +-98, +-95, +-89, +-94, +-91, +-83, +-93, +-91, +-80, +-91, +-89, +-78, +-93, +-92, +-79, +-96, +-94, +-84, +-101, +-99, +-90, +-102, +-99, +-92, +-104, +-101, +-95, +-104, +-100, +-96, +-104, +-101, +-96, +-104, +-102, +-94, +-103, +-100, +-92, +-101, +-98, +-90, +-105, +-102, +-94, +-108, +-106, +-97, +-103, +-100, +-92, +-99, +-97, +-89, +-96, +-94, +-85, +-93, +-91, +-79, +-85, +-83, +-70, +-71, +-70, +-56, + 39, + 38, + 38, +100, + 99, + 95, +100, + 99, + 95, +101, +100, + 96, +101, +100, + 96, +102, +101, + 97, +101, +100, + 96, +-25, + 10, + 43, +-26, + 10, + 43, +-22, + 12, + 45, + 0, + 20, + 45, + 74, + 84, + 99, + 92, + 93, + 99, + 84, + 81, + 87, + 49, + 47, + 61, + 41, + 41, + 60, + 43, + 40, + 54, + 71, + 68, + 76, +103, +100, +101, +103, + 99, + 99, +102, + 97, + 99, + 18, + 14, + 21, +-82, +-83, +-70, +-101, +-102, +-91, +-106, +-106, +-99, +-111, +-109, +-105, +-114, +-112, +-111, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-113, +-112, +-108, +-108, +-106, +-102, +-108, +-108, +-101, +-107, +-107, +-100, +-105, +-105, +-98, +-103, +-103, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-98, +-90, +-98, +-95, +-87, +-96, +-93, +-85, +-94, +-91, +-83, +-95, +-92, +-84, +-107, +-105, +-97, +-101, +-98, +-91, +-100, +-97, +-91, +-101, +-98, +-94, +-100, +-96, +-93, +-42, +-38, +-38, + 51, + 57, + 53, + 53, + 60, + 53, + 46, + 53, + 46, + 36, + 43, + 36, + 44, + 50, + 44, + 47, + 54, + 47, + 58, + 65, + 56, + 54, + 61, + 52, + 48, + 55, + 49, + 47, + 53, + 49, + 41, + 47, + 43, + 45, + 51, + 46, + 44, + 51, + 43, + 48, + 55, + 49, + 37, + 43, + 40, +-74, +-70, +-69, +-102, +-98, +-95, +-99, +-96, +-90, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-99, +-97, +-88, +-105, +-102, +-94, +-107, +-104, +-98, +-100, +-97, +-91, +-98, +-95, +-87, +-97, +-95, +-85, +-96, +-94, +-83, +-97, +-96, +-83, +-103, +-101, +-90, +-103, +-101, +-91, +-102, +-99, +-91, +-99, +-96, +-90, +-97, +-94, +-90, +-94, +-91, +-86, +-93, +-90, +-82, +-100, +-98, +-90, +-99, +-96, +-88, +-114, +-111, +-104, +-109, +-106, +-98, +-103, +-100, +-92, +-100, +-97, +-89, +-96, +-93, +-85, +-94, +-92, +-80, +-87, +-86, +-73, +-77, +-76, +-62, + 20, + 19, + 18, +103, +102, + 98, +105, +103, + 99, +105, +103, + 99, +104, +103, + 99, +100, + 98, + 94, +100, + 99, + 95, +-26, + 7, + 39, +-25, + 8, + 41, +-22, + 10, + 43, +-14, + 7, + 35, + 52, + 64, + 81, + 93, + 96, +101, + 92, + 89, + 95, + 67, + 65, + 79, + 44, + 42, + 62, + 46, + 42, + 57, + 61, + 59, + 67, +102, + 99, +101, +103, + 99, +100, + 90, + 84, + 88, +-31, +-35, +-26, +-92, +-94, +-79, +-104, +-104, +-94, +-107, +-107, +-100, +-111, +-109, +-106, +-114, +-112, +-110, +-115, +-112, +-112, +-115, +-113, +-114, +-117, +-114, +-114, +-118, +-116, +-114, +-113, +-112, +-108, +-108, +-106, +-102, +-108, +-108, +-102, +-107, +-107, +-100, +-106, +-105, +-99, +-103, +-103, +-97, +-101, +-101, +-94, +-100, +-99, +-92, +-101, +-98, +-90, +-98, +-95, +-87, +-96, +-93, +-85, +-92, +-89, +-81, +-93, +-91, +-83, +-108, +-105, +-97, +-103, +-100, +-93, +-100, +-97, +-91, +-101, +-98, +-93, +-101, +-97, +-94, +-39, +-35, +-35, + 51, + 57, + 52, + 46, + 53, + 46, + 38, + 45, + 38, + 32, + 39, + 32, + 50, + 57, + 50, + 55, + 62, + 55, + 53, + 60, + 52, + 55, + 62, + 53, + 54, + 61, + 54, + 47, + 54, + 49, + 47, + 53, + 48, + 48, + 54, + 50, + 48, + 55, + 47, + 45, + 52, + 45, + 22, + 27, + 25, +-103, +-99, +-97, +-102, +-98, +-94, +-99, +-96, +-89, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-102, +-99, +-91, +-105, +-103, +-95, +-103, +-100, +-93, +-98, +-95, +-88, +-97, +-94, +-86, +-96, +-94, +-84, +-93, +-92, +-81, +-95, +-94, +-81, +-96, +-94, +-84, +-97, +-94, +-85, +-102, +-99, +-91, +-105, +-102, +-96, +-104, +-100, +-96, +-103, +-99, +-94, +-99, +-96, +-88, +-97, +-95, +-86, +-99, +-97, +-89, +-117, +-115, +-107, +-109, +-106, +-99, +-103, +-101, +-93, +-100, +-97, +-89, +-96, +-93, +-85, +-93, +-91, +-79, +-87, +-86, +-73, +-80, +-79, +-65, +-24, +-25, +-25, + 99, + 96, + 93, +104, +102, + 99, +106, +104, +100, +105, +103, + 99, + 96, + 95, + 91, + 96, + 95, + 90, +-18, + 3, + 31, +-14, + 6, + 38, +-16, + 3, + 37, +-17, + 2, + 29, + 35, + 48, + 64, + 89, + 93, +100, + 94, + 93, + 99, + 73, + 69, + 82, + 51, + 47, + 65, + 46, + 44, + 60, + 51, + 51, + 59, + 93, + 95, + 96, + 99, +101, +101, + 58, + 59, + 62, +-73, +-73, +-66, +-103, +-104, +-95, +-106, +-106, +-99, +-110, +-109, +-105, +-113, +-111, +-108, +-114, +-112, +-110, +-115, +-112, +-113, +-115, +-113, +-114, +-117, +-114, +-114, +-119, +-117, +-116, +-114, +-113, +-109, +-109, +-108, +-104, +-109, +-108, +-103, +-108, +-106, +-102, +-106, +-105, +-100, +-103, +-102, +-98, +-102, +-100, +-96, +-101, +-99, +-94, +-101, +-98, +-90, +-99, +-96, +-88, +-95, +-92, +-84, +-91, +-88, +-80, +-91, +-89, +-80, +-105, +-101, +-96, +-102, +-98, +-94, +-100, +-97, +-90, +-101, +-98, +-91, +-102, +-98, +-95, +-41, +-36, +-38, + 49, + 55, + 50, + 43, + 50, + 43, + 40, + 47, + 40, + 35, + 41, + 35, + 54, + 61, + 54, + 54, + 61, + 54, + 54, + 61, + 56, + 51, + 58, + 53, + 51, + 57, + 52, + 45, + 51, + 47, + 48, + 54, + 50, + 50, + 56, + 52, + 48, + 54, + 48, + 42, + 48, + 44, + -9, + -5, + -6, +-106, +-102, +-100, +-102, +-98, +-93, +-101, +-98, +-91, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-97, +-91, +-107, +-103, +-98, +-99, +-96, +-90, +-101, +-98, +-91, +-103, +-101, +-93, +-104, +-101, +-93, +-102, +-100, +-91, +-100, +-98, +-89, +-99, +-97, +-88, +-100, +-97, +-89, +-100, +-98, +-89, +-102, +-99, +-91, +-105, +-102, +-94, +-106, +-103, +-95, +-103, +-100, +-92, +-100, +-98, +-88, +-94, +-92, +-83, +-108, +-106, +-98, +-116, +-113, +-107, +-108, +-105, +-101, +-103, +-99, +-94, +-100, +-97, +-89, +-97, +-94, +-85, +-93, +-92, +-80, +-88, +-87, +-74, +-80, +-80, +-65, +-60, +-68, +-58, + 81, + 72, + 77, +106, +100, + 99, +102, +100, + 95, +103, +103, + 97, + 95, + 96, + 92, + 92, + 92, + 85, + 83, + 88, +100, + 81, + 85, +101, + 75, + 78, + 96, + 57, + 67, + 86, + 56, + 63, + 77, + 79, + 81, + 88, + 95, + 95, +102, + 74, + 73, + 87, + 52, + 51, + 69, + 50, + 48, + 64, + 49, + 49, + 59, + 84, + 85, + 90, + 87, + 89, + 91, +-30, +-28, +-25, +-102, +-101, +-96, +-111, +-110, +-106, +-112, +-110, +-108, +-113, +-111, +-110, +-114, +-111, +-112, +-116, +-113, +-115, +-115, +-112, +-114, +-115, +-113, +-114, +-117, +-114, +-114, +-120, +-117, +-116, +-115, +-113, +-109, +-109, +-108, +-104, +-109, +-108, +-104, +-108, +-106, +-102, +-106, +-105, +-101, +-106, +-104, +-100, +-104, +-103, +-99, +-103, +-101, +-97, +-101, +-98, +-92, +-99, +-96, +-90, +-95, +-92, +-85, +-92, +-89, +-82, +-91, +-88, +-81, +-103, +-100, +-95, +-103, +-99, +-96, +-99, +-96, +-89, +-101, +-98, +-91, +-101, +-96, +-94, +-34, +-29, +-32, + 49, + 56, + 50, + 46, + 52, + 46, + 42, + 49, + 43, + 36, + 42, + 36, + 50, + 56, + 50, + 51, + 58, + 51, + 53, + 59, + 55, + 53, + 59, + 55, + 54, + 60, + 56, + 41, + 47, + 43, + 41, + 47, + 43, + 47, + 53, + 49, + 48, + 54, + 49, + 43, + 49, + 45, +-45, +-41, +-43, +-104, +-99, +-97, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-104, +-100, +-95, +-110, +-107, +-101, +-103, +-100, +-94, +-99, +-96, +-88, +-101, +-98, +-90, +-104, +-101, +-93, +-102, +-100, +-92, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-97, +-89, +-100, +-98, +-90, +-102, +-99, +-91, +-104, +-101, +-93, +-105, +-103, +-94, +-103, +-101, +-92, +-99, +-97, +-87, +-96, +-94, +-85, +-118, +-115, +-108, +-114, +-111, +-105, +-105, +-101, +-98, +-102, +-98, +-93, +-101, +-98, +-90, +-98, +-95, +-86, +-94, +-92, +-80, +-87, +-86, +-73, +-78, +-77, +-63, +-71, +-78, +-66, + 35, + 28, + 33, +106, +101, +100, +103, +101, + 96, +105, +105, + 99, +102, +101, + 97, + 98, + 97, + 93, +106, +102, +106, +108, +103, +109, +104, +100, +108, + 99, +103, +113, + 92, + 93, +101, + 72, + 69, + 76, + 97, + 96, +105, + 80, + 81, + 96, + 51, + 53, + 71, + 49, + 47, + 63, + 49, + 48, + 61, + 72, + 72, + 80, + 4, + 5, + 9, +-102, +-101, +-97, +-110, +-108, +-106, +-111, +-108, +-108, +-114, +-111, +-112, +-115, +-111, +-114, +-116, +-112, +-117, +-117, +-113, +-118, +-115, +-112, +-114, +-115, +-113, +-114, +-117, +-114, +-114, +-120, +-118, +-116, +-115, +-113, +-109, +-110, +-108, +-104, +-112, +-110, +-106, +-111, +-109, +-105, +-110, +-108, +-104, +-109, +-107, +-103, +-107, +-106, +-102, +-106, +-104, +-100, +-104, +-101, +-96, +-102, +-99, +-94, +-99, +-96, +-90, +-96, +-93, +-88, +-93, +-90, +-84, +-104, +-99, +-96, +-104, +-100, +-97, +-98, +-94, +-88, +-101, +-98, +-91, +-102, +-98, +-95, +-26, +-21, +-24, + 46, + 52, + 46, + 45, + 52, + 45, + 42, + 49, + 43, + 39, + 46, + 39, + 52, + 59, + 52, + 52, + 58, + 52, + 51, + 57, + 53, + 53, + 59, + 55, + 51, + 57, + 53, + 45, + 51, + 46, + 38, + 44, + 40, + 45, + 51, + 47, + 45, + 52, + 47, + 32, + 38, + 34, +-97, +-92, +-93, +-105, +-101, +-98, +-101, +-98, +-93, +-102, +-99, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-105, +-102, +-96, +-110, +-107, +-101, +-104, +-101, +-95, +-101, +-99, +-91, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-97, +-89, +-100, +-98, +-90, +-102, +-99, +-91, +-104, +-101, +-94, +-106, +-103, +-95, +-102, +-100, +-91, +-96, +-94, +-84, +-100, +-98, +-89, +-120, +-116, +-109, +-111, +-108, +-103, +-108, +-104, +-100, +-105, +-101, +-96, +-102, +-99, +-91, +-99, +-96, +-87, +-95, +-93, +-81, +-86, +-85, +-72, +-75, +-75, +-60, +-66, +-72, +-58, + -5, +-11, + -5, +104, +100, + 99, +103, +100, + 94, + 99, + 97, + 90, +105, +103, + 97, +111, +108, +108, +109, +109, +114, +105, +105, +111, +102, +102, +109, + 99, + 99, +103, +101, + 97, +102, + 81, + 75, + 81, + 93, + 88, + 98, + 90, + 89, +103, + 54, + 56, + 71, + 48, + 46, + 63, + 50, + 48, + 64, + 16, + 14, + 27, +-98, +-98, +-90, +-109, +-108, +-104, +-112, +-110, +-108, +-113, +-111, +-111, +-115, +-112, +-113, +-114, +-111, +-113, +-114, +-110, +-115, +-116, +-112, +-117, +-115, +-112, +-114, +-116, +-113, +-114, +-117, +-115, +-114, +-121, +-119, +-116, +-116, +-115, +-111, +-111, +-109, +-105, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-111, +-109, +-105, +-109, +-107, +-103, +-108, +-106, +-102, +-107, +-103, +-100, +-105, +-101, +-98, +-104, +-100, +-97, +-102, +-98, +-94, +-99, +-95, +-92, +-106, +-102, +-100, +-109, +-105, +-102, +-100, +-97, +-91, +-101, +-98, +-91, +-103, +-98, +-96, +-24, +-19, +-22, + 46, + 53, + 47, + 45, + 52, + 45, + 40, + 47, + 41, + 43, + 49, + 43, + 48, + 54, + 48, + 46, + 53, + 46, + 51, + 57, + 53, + 51, + 57, + 53, + 45, + 51, + 47, + 43, + 49, + 45, + 39, + 45, + 40, + 43, + 49, + 45, + 43, + 50, + 45, + -4, + 1, + -2, +-109, +-104, +-104, +-103, +-99, +-96, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-97, +-92, +-105, +-102, +-96, +-106, +-102, +-97, +-101, +-97, +-92, +-99, +-96, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-99, +-96, +-88, +-99, +-96, +-88, +-99, +-96, +-88, +-100, +-97, +-89, +-102, +-99, +-91, +-98, +-96, +-87, +-96, +-94, +-83, +-110, +-107, +-99, +-117, +-115, +-107, +-117, +-113, +-108, +-110, +-106, +-103, +-105, +-102, +-96, +-102, +-99, +-91, +-99, +-96, +-88, +-94, +-93, +-81, +-88, +-87, +-74, +-75, +-74, +-60, +-59, +-63, +-48, +-16, +-21, +-14, +102, + 98, + 98, +102, + 99, + 92, + 89, + 87, + 78, + 84, + 80, + 72, + 89, + 86, + 85, +114, +116, +120, +106, +108, +111, + 97, + 99, +102, + 92, + 92, + 94, + 91, + 86, + 91, + 82, + 73, + 80, + 82, + 74, + 82, + 97, + 92, +101, + 65, + 64, + 74, + 48, + 46, + 61, + 45, + 43, + 60, +-63, +-65, +-51, +-103, +-104, +-92, +-106, +-105, +-101, +-109, +-108, +-104, +-111, +-110, +-105, +-113, +-111, +-108, +-112, +-110, +-108, +-112, +-110, +-110, +-114, +-111, +-113, +-116, +-113, +-114, +-117, +-114, +-116, +-119, +-116, +-116, +-122, +-120, +-118, +-117, +-116, +-112, +-112, +-111, +-107, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-111, +-109, +-105, +-110, +-107, +-104, +-110, +-106, +-104, +-109, +-104, +-103, +-107, +-103, +-101, +-103, +-99, +-97, +-100, +-96, +-94, +-107, +-102, +-101, +-111, +-107, +-104, +-102, +-99, +-93, +-101, +-97, +-91, +-103, +-99, +-96, +-27, +-21, +-25, + 44, + 51, + 45, + 43, + 50, + 43, + 33, + 39, + 33, + 42, + 49, + 42, + 51, + 58, + 51, + 47, + 53, + 47, + 43, + 49, + 45, + 48, + 54, + 50, + 46, + 52, + 48, + 38, + 44, + 40, + 39, + 45, + 41, + 42, + 48, + 44, + 41, + 47, + 42, +-39, +-34, +-37, +-106, +-101, +-102, +-103, +-99, +-96, +-101, +-98, +-92, +-100, +-97, +-91, +-100, +-97, +-91, +-104, +-100, +-95, +-103, +-100, +-94, +-103, +-100, +-94, +-102, +-98, +-93, +-101, +-98, +-91, +-103, +-100, +-92, +-104, +-101, +-93, +-102, +-100, +-92, +-100, +-98, +-90, +-99, +-97, +-89, +-100, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-100, +-98, +-89, +-102, +-99, +-91, +-99, +-97, +-88, +-95, +-93, +-83, +-119, +-116, +-107, +-120, +-117, +-110, +-115, +-112, +-106, +-109, +-105, +-102, +-104, +-100, +-95, +-101, +-98, +-90, +-100, +-97, +-89, +-98, +-97, +-84, +-93, +-92, +-79, +-79, +-79, +-64, +-57, +-60, +-44, + -8, +-11, + -3, +102, + 99, + 99, +102, + 99, + 91, + 94, + 90, + 80, + 85, + 79, + 71, + 81, + 80, + 74, +119, +117, +118, +111, +110, +109, +102, +101, +100, + 94, + 94, + 96, + 79, + 70, + 74, + 86, + 68, + 74, + 89, + 71, + 77, + 99, + 88, + 94, + 76, + 71, + 78, + 51, + 48, + 62, + 8, + 7, + 25, +-75, +-76, +-57, +-90, +-92, +-79, +-100, +-98, +-93, +-104, +-102, +-96, +-106, +-106, +-98, +-108, +-107, +-101, +-109, +-108, +-104, +-111, +-109, +-106, +-113, +-111, +-108, +-116, +-114, +-114, +-119, +-116, +-117, +-120, +-118, +-117, +-123, +-121, +-119, +-119, +-117, +-113, +-113, +-112, +-108, +-112, +-111, +-107, +-112, +-111, +-106, +-112, +-111, +-107, +-113, +-111, +-107, +-111, +-110, +-106, +-110, +-108, +-104, +-110, +-105, +-104, +-108, +-104, +-102, +-107, +-103, +-101, +-105, +-100, +-99, +-102, +-98, +-96, +-108, +-103, +-102, +-114, +-109, +-107, +-105, +-101, +-95, +-100, +-97, +-91, +-104, +-99, +-96, +-21, +-16, +-18, + 43, + 50, + 44, + 40, + 46, + 40, + 33, + 39, + 33, + 42, + 49, + 43, + 45, + 53, + 46, + 47, + 54, + 49, + 48, + 53, + 49, + 47, + 53, + 48, + 42, + 49, + 43, + 38, + 49, + 39, + 29, + 45, + 32, + 35, + 49, + 37, + 36, + 40, + 35, +-79, +-75, +-78, +-107, +-101, +-100, +-104, +-99, +-96, +-102, +-98, +-93, +-101, +-98, +-92, +-101, +-97, +-92, +-103, +-100, +-94, +-101, +-98, +-92, +-101, +-97, +-92, +-101, +-98, +-92, +-100, +-97, +-90, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-100, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-102, +-99, +-91, +-102, +-99, +-91, +-102, +-99, +-91, +-101, +-98, +-90, +-102, +-99, +-91, +-99, +-97, +-88, +-98, +-96, +-87, +-121, +-118, +-110, +-118, +-115, +-109, +-114, +-111, +-105, +-107, +-103, +-100, +-102, +-99, +-93, +-100, +-98, +-89, +-101, +-98, +-89, +-99, +-98, +-86, +-97, +-96, +-83, +-89, +-88, +-74, +-63, +-66, +-50, + -7, +-10, + 0, + 99, + 97, + 98, + 98, + 95, + 88, + 93, + 88, + 77, + 90, + 83, + 73, + 83, + 81, + 72, +118, +118, +120, +114, +113, +116, +108, +108, +110, + 95, + 90, + 93, + 67, + 43, + 43, + 85, + 44, + 41, + 98, + 58, + 55, + 90, + 66, + 67, + 80, + 69, + 73, + 53, + 46, + 55, +-51, +-48, +-29, +-71, +-68, +-49, +-78, +-81, +-69, +-95, +-91, +-84, +-102, +-97, +-90, +-103, +-102, +-97, +-106, +-105, +-100, +-109, +-107, +-104, +-111, +-109, +-106, +-114, +-112, +-110, +-118, +-115, +-116, +-120, +-117, +-118, +-121, +-119, +-119, +-124, +-122, +-120, +-118, +-117, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-113, +-111, +-107, +-112, +-110, +-106, +-111, +-108, +-104, +-111, +-106, +-103, +-109, +-105, +-102, +-108, +-104, +-101, +-106, +-102, +-99, +-106, +-102, +-99, +-110, +-105, +-104, +-116, +-111, +-110, +-109, +-105, +-99, +-102, +-100, +-92, +-103, +-100, +-95, + -9, + -5, + -5, + 52, + 57, + 52, + 44, + 48, + 42, + 31, + 37, + 31, + 46, + 52, + 48, + 43, + 50, + 46, + 44, + 50, + 47, + 52, + 52, + 49, + 15, + 20, + 12, + -8, + 13, + -6, + -3, + 36, + 4, +-45, + 21, +-24, + -9, + 47, + 7, + 11, + 19, + 11, +-111, +-105, +-106, +-104, +-99, +-94, +-104, +-99, +-93, +-103, +-97, +-94, +-101, +-96, +-92, +-101, +-97, +-92, +-102, +-99, +-93, +-101, +-98, +-92, +-101, +-98, +-92, +-101, +-98, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-103, +-100, +-92, +-101, +-98, +-90, +-96, +-93, +-86, +-101, +-98, +-92, +-123, +-120, +-114, +-120, +-117, +-111, +-112, +-109, +-103, +-104, +-101, +-95, +-102, +-99, +-92, +-101, +-99, +-90, +-100, +-97, +-88, +-99, +-97, +-85, +-98, +-96, +-83, +-93, +-92, +-78, +-76, +-78, +-61, +-15, +-16, + -6, + 95, + 93, + 95, + 99, + 96, + 89, + 96, + 90, + 79, + 93, + 84, + 73, + 85, + 78, + 70, +118, +117, +120, +117, +117, +119, +116, +116, +119, +112, +115, +117, + 83, + 69, + 69, + 49, + 13, + 7, + 69, + 24, + 17, + 80, + 41, + 33, + 81, + 51, + 46, + 46, + 33, + 38, +-97, +-97, +-77, +-99, +-99, +-77, +-99, +-102, +-87, +-110, +-108, +-97, +-113, +-108, +-100, +-111, +-110, +-106, +-112, +-110, +-108, +-113, +-110, +-110, +-113, +-110, +-113, +-114, +-111, +-114, +-118, +-115, +-116, +-120, +-117, +-118, +-121, +-119, +-119, +-124, +-122, +-120, +-118, +-117, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-113, +-111, +-107, +-112, +-110, +-106, +-112, +-108, +-104, +-111, +-106, +-103, +-110, +-106, +-102, +-108, +-104, +-101, +-108, +-104, +-100, +-111, +-107, +-106, +-117, +-112, +-112, +-110, +-107, +-101, +-103, +-100, +-92, +-104, +-101, +-96, + -2, + 2, + 2, + 60, + 65, + 60, + 43, + 49, + 43, + 32, + 37, + 31, + 44, + 49, + 43, + 45, + 49, + 44, + 44, + 49, + 43, + 43, + 49, + 44, + 26, + 42, + 30, +-39, + -4, +-28, +-115, +-30, +-77, +-121, + 12, +-52, +-81, + 20, +-39, +-49, +-10, +-33, +-116, +-96, +-105, +-102, +-103, +-97, +-98, +-103, +-92, +-102, +-98, +-91, +-104, +-97, +-92, +-103, +-100, +-94, +-101, +-98, +-92, +-102, +-99, +-93, +-101, +-98, +-92, +-101, +-98, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-102, +-99, +-91, +-103, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-99, +-97, +-89, +-95, +-92, +-85, +-105, +-102, +-97, +-123, +-120, +-114, +-121, +-118, +-112, +-112, +-109, +-103, +-104, +-100, +-95, +-103, +-100, +-93, +-102, +-99, +-91, +-101, +-98, +-89, +-99, +-97, +-85, +-96, +-95, +-82, +-94, +-93, +-79, +-87, +-89, +-72, +-45, +-46, +-36, + 81, + 79, + 80, + 97, + 95, + 87, + 92, + 87, + 75, + 91, + 83, + 72, + 85, + 78, + 69, +118, +117, +119, +117, +117, +119, +116, +117, +120, +109, +118, +120, +117, +111, +111, + 86, + 61, + 55, + 44, + 0, +-12, + 63, + 10, + -8, + 74, + 26, + 9, + 32, + 10, + 9, +-51, +-56, +-37, +-52, +-52, +-27, +-54, +-57, +-37, +-75, +-75, +-58, +-103, +-100, +-88, +-115, +-115, +-110, +-119, +-117, +-116, +-118, +-115, +-117, +-117, +-113, +-118, +-116, +-111, +-118, +-118, +-115, +-118, +-120, +-118, +-119, +-122, +-119, +-119, +-124, +-122, +-120, +-117, +-116, +-112, +-114, +-112, +-108, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-113, +-109, +-106, +-111, +-107, +-104, +-110, +-106, +-103, +-109, +-105, +-102, +-109, +-105, +-102, +-113, +-108, +-107, +-118, +-113, +-112, +-111, +-108, +-102, +-103, +-101, +-93, +-104, +-100, +-95, +-19, +-15, +-16, + 38, + 43, + 39, + 37, + 44, + 38, + 35, + 42, + 35, + 43, + 52, + 43, + 51, + 59, + 49, + 37, + 47, + 36, + -2, + 21, + 8, +-57, +-25, +-43, +-105, +-46, +-79, +-125, +-37, +-85, +-104, + 12, +-49, +-107, + 9, +-53, +-88, +-11, +-48, +-123, +-90, +-107, +-100, +-101, +-97, +-94, +-104, +-92, +-100, +-99, +-88, +-107, +-100, +-93, +-104, +-101, +-95, +-104, +-100, +-95, +-102, +-99, +-93, +-102, +-98, +-93, +-102, +-98, +-93, +-101, +-98, +-90, +-101, +-98, +-90, +-102, +-99, +-91, +-102, +-100, +-92, +-100, +-97, +-89, +-100, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-99, +-96, +-88, +-95, +-92, +-85, +-112, +-108, +-103, +-123, +-120, +-114, +-121, +-118, +-112, +-116, +-113, +-108, +-108, +-105, +-99, +-103, +-100, +-93, +-100, +-97, +-89, +-99, +-97, +-88, +-97, +-96, +-84, +-94, +-92, +-79, +-94, +-93, +-79, +-93, +-95, +-77, +-78, +-79, +-68, + 53, + 51, + 51, + 97, + 93, + 86, + 87, + 82, + 70, + 90, + 82, + 71, + 86, + 79, + 70, +116, +116, +118, +117, +117, +119, +112, +113, +115, +104, +112, +114, +107, +108, +110, +105, + 90, + 87, + 55, + 21, + 9, + 60, + 6, +-18, + 71, + 15, +-10, + 45, + 14, + 8, +-28, +-37, +-20, +-40, +-42, +-13, +-46, +-51, +-25, +-54, +-55, +-32, +-78, +-77, +-59, +-97, +-97, +-87, +-112, +-111, +-104, +-119, +-117, +-115, +-121, +-117, +-120, +-120, +-115, +-121, +-120, +-117, +-119, +-121, +-118, +-120, +-122, +-120, +-120, +-124, +-122, +-120, +-115, +-114, +-110, +-114, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-113, +-110, +-106, +-112, +-108, +-104, +-111, +-107, +-103, +-109, +-105, +-102, +-111, +-107, +-103, +-114, +-110, +-109, +-116, +-111, +-111, +-113, +-110, +-103, +-102, +-99, +-91, +-104, +-101, +-96, +-18, +-13, +-14, + 35, + 40, + 37, + 32, + 39, + 34, + 31, + 44, + 34, + 31, + 49, + 35, + 32, + 53, + 35, + -9, + 17, + -3, +-51, + -7, +-30, +-85, +-40, +-64, +-94, +-48, +-76, +-93, +-43, +-76, +-85, +-25, +-65, +-81, + -9, +-52, +-113, +-36, +-73, +-105, +-63, +-83, +-105, +-98, +-98, +-96, +-100, +-92, +-101, +-100, +-92, +-108, +-102, +-97, +-105, +-102, +-96, +-105, +-102, +-96, +-104, +-101, +-95, +-104, +-101, +-95, +-104, +-101, +-95, +-103, +-100, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-98, +-89, +-99, +-96, +-88, +-99, +-97, +-89, +-120, +-117, +-111, +-124, +-121, +-115, +-121, +-118, +-112, +-119, +-116, +-110, +-111, +-108, +-103, +-104, +-101, +-94, +-99, +-96, +-88, +-98, +-95, +-86, +-96, +-95, +-83, +-93, +-92, +-79, +-94, +-93, +-79, +-93, +-95, +-77, +-90, +-92, +-80, + -9, +-11, +-11, + 94, + 91, + 83, + 90, + 85, + 73, + 93, + 84, + 74, + 88, + 81, + 72, +116, +115, +118, +118, +117, +119, +112, +111, +114, +105, +107, +112, +104, +107, +112, +105, +100, +101, + 56, + 34, + 25, + 54, + 10, +-15, + 67, + 12, +-18, + 48, + 10, + -1, +-19, +-32, +-16, +-30, +-33, + -3, +-35, +-40, +-10, +-44, +-48, +-19, +-68, +-70, +-46, +-84, +-87, +-69, +-100, +-101, +-87, +-111, +-111, +-103, +-119, +-117, +-115, +-121, +-118, +-120, +-120, +-117, +-118, +-121, +-118, +-120, +-122, +-120, +-120, +-121, +-119, +-117, +-114, +-113, +-109, +-114, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-115, +-113, +-109, +-116, +-114, +-110, +-114, +-112, +-108, +-113, +-111, +-107, +-115, +-111, +-108, +-114, +-110, +-106, +-112, +-107, +-104, +-109, +-105, +-102, +-111, +-107, +-103, +-113, +-108, +-107, +-116, +-111, +-110, +-114, +-111, +-105, +-103, +-101, +-93, +-104, +-100, +-95, + 2, + 6, + 5, + 48, + 53, + 50, + 26, + 34, + 29, + 30, + 47, + 36, + 1, + 29, + 11, +-50, +-10, +-36, +-64, +-16, +-46, +-54, +-10, +-36, +-79, +-41, +-64, +-91, +-55, +-77, +-78, +-41, +-63, +-88, +-44, +-68, +-96, +-44, +-70, +-83, +-34, +-61, +-68, +-33, +-49, +-109, +-88, +-94, +-102, +-94, +-94, +-105, +-102, +-101, +-107, +-104, +-101, +-105, +-102, +-96, +-105, +-102, +-96, +-106, +-102, +-96, +-106, +-102, +-97, +-106, +-102, +-97, +-104, +-101, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-102, +-99, +-91, +-100, +-98, +-90, +-99, +-97, +-89, +-101, +-98, +-90, +-101, +-98, +-90, +-101, +-98, +-90, +-100, +-97, +-89, +-97, +-94, +-86, +-105, +-102, +-94, +-123, +-120, +-114, +-122, +-119, +-113, +-121, +-118, +-112, +-120, +-117, +-111, +-116, +-112, +-107, +-107, +-104, +-97, +-100, +-97, +-89, +-96, +-94, +-85, +-95, +-94, +-81, +-91, +-90, +-77, +-89, +-88, +-74, +-88, +-89, +-72, +-85, +-86, +-74, +-67, +-69, +-68, + 75, + 72, + 64, + 95, + 90, + 78, + 93, + 84, + 73, + 88, + 81, + 72, +117, +116, +118, +117, +116, +119, +117, +116, +119, +114, +114, +117, +111, +115, +120, +106, +108, +109, + 49, + 36, + 26, + 45, + 7, +-21, + 67, + 17, +-18, + 55, + 17, + 2, +-13, +-31, +-21, +-31, +-35, + -7, +-36, +-38, + -7, +-45, +-50, +-22, +-65, +-70, +-45, +-84, +-86, +-68, +-96, +-93, +-81, +-110, +-105, +-101, +-115, +-113, +-112, +-116, +-119, +-118, +-118, +-118, +-121, +-122, +-118, +-122, +-125, +-119, +-122, +-122, +-114, +-114, +-116, +-112, +-108, +-114, +-112, +-107, +-114, +-114, +-107, +-114, +-114, +-108, +-115, +-113, +-109, +-116, +-114, +-111, +-115, +-113, +-111, +-115, +-113, +-110, +-114, +-111, +-108, +-113, +-110, +-107, +-110, +-108, +-104, +-109, +-106, +-102, +-110, +-107, +-103, +-112, +-108, +-107, +-115, +-112, +-111, +-115, +-113, +-108, +-105, +-103, +-98, +-103, +-100, +-97, + 10, + 14, + 14, + 45, + 50, + 47, + 22, + 35, + 26, +-24, + 1, +-13, +-84, +-41, +-65, +-102, +-46, +-74, +-85, +-32, +-62, +-84, +-51, +-73, +-80, +-54, +-75, +-56, +-30, +-51, +-25, + 6, +-15, +-86, +-41, +-62, +-83, +-33, +-55, +-85, +-43, +-68, +-83, +-45, +-65, +-55, +-27, +-45, +-13, + 5, +-12, +-84, +-77, +-85, +-106, +-104, +-102, +-106, +-103, +-98, +-108, +-101, +-97, +-109, +-101, +-97, +-108, +-102, +-97, +-105, +-104, +-98, +-104, +-102, +-94, +-103, +-101, +-92, +-103, +-100, +-92, +-101, +-99, +-91, +-100, +-98, +-90, +-100, +-97, +-89, +-100, +-98, +-89, +-101, +-98, +-89, +-100, +-98, +-89, +-100, +-97, +-88, +-97, +-95, +-86, +-110, +-107, +-100, +-124, +-121, +-118, +-121, +-118, +-115, +-120, +-118, +-114, +-119, +-117, +-112, +-116, +-114, +-109, +-112, +-109, +-103, +-104, +-101, +-94, +-98, +-95, +-87, +-94, +-92, +-81, +-89, +-87, +-75, +-87, +-86, +-72, +-86, +-87, +-70, +-79, +-81, +-65, +-72, +-74, +-67, + 52, + 50, + 42, + 90, + 86, + 74, + 94, + 85, + 80, + 91, + 84, + 82, +117, +116, +119, +117, +116, +119, +117, +116, +119, +115, +116, +117, +113, +119, +121, +111, +113, +113, + 44, + 31, + 21, + 35, + -2, +-33, + 58, + 9, +-29, + 69, + 31, + 12, + 21, + -3, + 0, +-38, +-45, +-20, +-47, +-48, +-16, +-48, +-52, +-25, +-53, +-56, +-31, +-81, +-79, +-57, +-95, +-89, +-77, +-108, +-102, +-97, +-115, +-111, +-108, +-119, +-118, +-115, +-118, +-121, +-121, +-123, +-122, +-124, +-122, +-117, +-119, +-118, +-112, +-111, +-113, +-113, +-108, +-109, +-113, +-106, +-114, +-114, +-106, +-114, +-114, +-107, +-115, +-113, +-109, +-116, +-114, +-112, +-115, +-113, +-112, +-114, +-112, +-111, +-111, +-110, +-106, +-111, +-110, +-106, +-109, +-108, +-103, +-109, +-107, +-103, +-110, +-109, +-105, +-112, +-110, +-108, +-116, +-114, +-112, +-116, +-114, +-112, +-64, +-63, +-61, +-39, +-37, +-36, + 16, + 18, + 19, + 32, + 41, + 32, +-38, +-17, +-32, +-99, +-55, +-79, +-95, +-41, +-69, +-104, +-49, +-78, +-103, +-56, +-84, +-70, +-42, +-61, +-48, +-23, +-45, +-21, + 2, +-22, +-60, +-30, +-56, +-89, +-49, +-74, +-99, +-51, +-77, +-101, +-50, +-82, +-75, +-31, +-58, +-85, +-49, +-78, +-54, +-29, +-59, +-75, +-55, +-76, +-107, +-101, +-103, +-105, +-104, +-100, +-109, +-101, +-99, +-112, +-100, +-97, +-109, +-101, +-97, +-105, +-103, +-97, +-105, +-103, +-95, +-104, +-102, +-93, +-103, +-101, +-92, +-101, +-99, +-91, +-101, +-99, +-91, +-101, +-99, +-91, +-101, +-99, +-89, +-101, +-99, +-89, +-101, +-99, +-89, +-100, +-98, +-88, +-101, +-99, +-89, +-118, +-115, +-107, +-123, +-121, +-121, +-122, +-119, +-119, +-120, +-118, +-116, +-116, +-115, +-112, +-114, +-112, +-108, +-114, +-112, +-107, +-109, +-106, +-100, +-100, +-97, +-89, +-96, +-94, +-84, +-88, +-86, +-75, +-82, +-81, +-68, +-82, +-82, +-66, +-77, +-81, +-60, +-62, +-64, +-52, + 46, + 46, + 37, + 91, + 88, + 76, + 98, + 89, + 89, +101, + 95, + 97, +117, +116, +119, +117, +116, +119, +117, +116, +119, +116, +116, +118, +115, +118, +121, +112, +110, +111, + 39, + 24, + 15, + 31, + -4, +-32, + 47, + -2, +-36, + 80, + 34, + 14, + 82, + 51, + 52, + 2, +-12, + 9, +-38, +-43, +-12, +-48, +-53, +-25, +-57, +-57, +-32, +-70, +-70, +-47, +-82, +-92, +-74, +-96, +-108, +-95, +-111, +-113, +-105, +-126, +-116, +-111, +-121, +-121, +-117, +-120, +-124, +-120, +-106, +-107, +-104, +-106, +-107, +-103, +-107, +-113, +-107, +-107, +-115, +-108, +-113, +-114, +-108, +-114, +-113, +-108, +-115, +-113, +-109, +-116, +-114, +-110, +-113, +-111, +-109, +-111, +-109, +-106, +-108, +-107, +-103, +-110, +-109, +-105, +-110, +-108, +-104, +-110, +-109, +-105, +-112, +-110, +-106, +-113, +-112, +-109, +-115, +-113, +-111, +-118, +-116, +-114, +-76, +-75, +-73, +-38, +-36, +-34, + -3, + -1, + 0, + 0, + 16, + 2, +-63, +-36, +-58, +-88, +-44, +-72, +-90, +-40, +-71, +-101, +-53, +-85, +-60, +-23, +-52, +-44, +-11, +-37, +-36, + -6, +-31, +-73, +-41, +-70, +-101, +-63, +-93, +-111, +-65, +-94, +-84, +-37, +-68, +-78, +-31, +-63, +-88, +-43, +-71, +-84, +-42, +-77, +-105, +-63, +-107, +-52, +-17, +-51, +-84, +-68, +-82, +-99, +-102, +-100, +-105, +-104, +-103, +-106, +-102, +-100, +-108, +-102, +-98, +-108, +-102, +-95, +-107, +-104, +-96, +-106, +-103, +-95, +-104, +-102, +-93, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-103, +-100, +-92, +-101, +-99, +-90, +-107, +-104, +-96, +-125, +-123, +-116, +-125, +-122, +-123, +-123, +-121, +-121, +-122, +-120, +-118, +-118, +-116, +-113, +-113, +-112, +-108, +-113, +-110, +-105, +-110, +-107, +-101, +-105, +-103, +-94, +-102, +-100, +-90, +-93, +-92, +-80, +-84, +-82, +-69, +-78, +-77, +-63, +-76, +-79, +-58, +-56, +-59, +-45, + 54, + 52, + 47, + 95, + 91, + 80, + 95, + 87, + 84, + 93, + 89, + 81, +117, +116, +119, +117, +116, +119, +115, +114, +117, +112, +113, +116, +113, +113, +117, +107, +102, +102, + 29, + 13, + 3, + 24, + -9, +-34, + 45, + -1, +-30, + 92, + 44, + 26, + 90, + 55, + 53, + 49, + 28, + 40, +-27, +-40, +-21, +-37, +-49, +-32, +-14, +-29, +-22, + 29, + 4, + 6, + 56, + 19, + 22, + 31, + -6, + -4, +-66, +-87, +-87, +-117, +-115, +-118, +-120, +-119, +-119, +-114, +-115, +-114, +-27, +-27, +-27, +-85, +-85, +-83, +-111, +-111, +-109, +-112, +-111, +-109, +-115, +-113, +-111, +-115, +-114, +-110, +-116, +-114, +-110, +-115, +-114, +-110, +-112, +-110, +-107, +-109, +-108, +-104, +-109, +-107, +-103, +-110, +-109, +-105, +-110, +-109, +-105, +-112, +-110, +-106, +-113, +-111, +-107, +-114, +-112, +-109, +-114, +-112, +-111, +-118, +-116, +-114, +-115, +-113, +-112, +-95, +-93, +-92, + 15, + 17, + 18, +-53, +-36, +-50, +-81, +-50, +-74, +-55, +-17, +-45, +-89, +-46, +-76, +-73, +-32, +-64, +-71, +-35, +-65, +-43, + -9, +-39, +-88, +-50, +-81, +-98, +-56, +-88, +-103, +-59, +-91, +-81, +-38, +-70, +-55, +-11, +-46, +-56, +-13, +-49, +-97, +-55, +-83, +-59, +-17, +-54, +-70, +-26, +-71, +-104, +-58, +-101, +-43, +-30, +-45, + -5, + -5, +-12, +-80, +-83, +-91, +-100, +-104, +-109, +-105, +-104, +-105, +-110, +-103, +-99, +-108, +-104, +-97, +-107, +-104, +-96, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-94, +-105, +-102, +-95, +-105, +-102, +-95, +-105, +-102, +-96, +-104, +-101, +-94, +-112, +-109, +-103, +-126, +-124, +-119, +-125, +-123, +-123, +-124, +-121, +-122, +-123, +-121, +-119, +-119, +-117, +-114, +-113, +-112, +-108, +-111, +-108, +-103, +-109, +-106, +-100, +-109, +-106, +-98, +-104, +-102, +-92, +-101, +-99, +-88, +-91, +-90, +-77, +-80, +-79, +-66, +-73, +-76, +-56, +-58, +-61, +-44, + 50, + 48, + 46, + 95, + 93, + 81, + 96, + 88, + 82, + 88, + 85, + 70, +116, +116, +118, +117, +116, +119, +113, +113, +116, +110, +110, +115, +112, +110, +114, +103, + 95, + 95, + 25, + 7, + -3, + 29, + -2, +-23, + 56, + 17, + -6, + 94, + 57, + 42, + 93, + 62, + 56, + 75, + 48, + 50, + 16, + -9, + -9, + 36, + 9, + 2, + 65, + 29, + 17, + 62, + 16, + 0, + 67, + 19, + 3, + 69, + 26, + 14, +-15, +-44, +-52, +-108, +-123, +-127, +-87, +-100, +-107, + -5, +-21, +-25, + 61, + 47, + 46, +-76, +-86, +-86, +-110, +-112, +-110, +-113, +-109, +-108, +-115, +-113, +-112, +-115, +-113, +-111, +-115, +-113, +-110, +-112, +-111, +-107, +-107, +-107, +-101, +-110, +-109, +-103, +-111, +-110, +-106, +-111, +-110, +-106, +-112, +-110, +-106, +-112, +-110, +-106, +-114, +-112, +-108, +-114, +-112, +-109, +-114, +-112, +-110, +-118, +-116, +-114, +-119, +-117, +-115, +-93, +-91, +-89, + 15, + 17, + 19, +-67, +-54, +-63, +-88, +-61, +-82, +-48, +-17, +-41, +-48, +-11, +-38, +-44, + -3, +-33, +-80, +-38, +-68, +-84, +-47, +-83, +-89, +-51, +-84, +-62, +-23, +-54, +-62, +-22, +-54, +-62, +-27, +-60, + 1, + 38, + -2, +-15, + 28, +-13, +-17, + 21, + -6, +-20, + 18, +-14, +-20, + 21, +-22, +-31, + 9, +-31, +-29, + -4, +-30, + 38, + 46, + 25, + 49, + 45, + 25, + 23, + 13, + -3, +-58, +-65, +-74, +-107, +-103, +-105, +-108, +-104, +-98, +-107, +-105, +-97, +-106, +-103, +-95, +-106, +-103, +-95, +-106, +-103, +-95, +-106, +-103, +-95, +-108, +-104, +-99, +-108, +-104, +-99, +-108, +-104, +-99, +-108, +-105, +-99, +-120, +-116, +-110, +-127, +-124, +-120, +-126, +-123, +-123, +-124, +-121, +-122, +-123, +-121, +-120, +-122, +-120, +-117, +-117, +-116, +-112, +-113, +-111, +-107, +-108, +-105, +-99, +-107, +-104, +-96, +-105, +-103, +-93, +-104, +-103, +-92, +-98, +-97, +-84, +-88, +-86, +-76, +-69, +-72, +-52, +-54, +-58, +-38, + 22, + 20, + 19, + 94, + 91, + 81, + 96, + 89, + 82, + 91, + 86, + 71, +116, +116, +118, +117, +116, +119, +114, +113, +116, +112, +112, +118, +114, +112, +115, + 69, + 60, + 59, + 27, + 7, + -2, + 31, + 0, +-18, + 57, + 25, + 5, + 79, + 55, + 45, + 97, + 72, + 65, + 95, + 65, + 57, + 73, + 37, + 20, + 59, + 17, + -9, + 51, + -2, +-32, + 54, + -2, +-30, + 54, + 11, +-16, + 18, +-12, +-31, +-67, +-89, +-97, +-30, +-48, +-41, + 54, + 17, + 10, + 85, + 42, + 34, + 92, + 51, + 49, + 16, +-18, +-16, +-92, +-113, +-107, +-106, +-115, +-108, +-113, +-112, +-112, +-113, +-111, +-110, +-113, +-111, +-109, +-109, +-108, +-103, +-107, +-107, +-100, +-110, +-110, +-102, +-113, +-111, +-107, +-113, +-111, +-107, +-112, +-111, +-107, +-112, +-110, +-106, +-114, +-112, +-108, +-114, +-112, +-109, +-114, +-112, +-110, +-118, +-116, +-114, +-117, +-115, +-113, +-80, +-78, +-77, + 30, + 32, + 34, + -5, + 5, + -2, +-75, +-58, +-71, +-69, +-44, +-62, +-52, +-18, +-41, +-90, +-47, +-73, +-91, +-42, +-72, +-69, +-37, +-74, +-41, + -7, +-42, +-27, + 10, +-21, +-58, +-22, +-54, +-81, +-52, +-86, +-30, + 0, +-40, +-49, + -7, +-49, +-23, + 13, +-14, + -6, + 27, + 1, +-22, + 9, +-22, +-68, +-38, +-69, +-44, +-17, +-45, +-24, + -8, +-39, + 28, + 25, + -6, + 66, + 51, + 25, + 41, + 28, + 12, +-93, +-96, +-102, +-109, +-106, +-101, +-109, +-106, +-98, +-107, +-105, +-97, +-107, +-104, +-96, +-107, +-104, +-96, +-107, +-104, +-97, +-111, +-107, +-103, +-112, +-107, +-104, +-112, +-108, +-105, +-113, +-109, +-106, +-122, +-118, +-114, +-126, +-122, +-120, +-125, +-122, +-123, +-124, +-121, +-122, +-123, +-121, +-120, +-123, +-121, +-118, +-121, +-120, +-116, +-119, +-117, +-112, +-110, +-107, +-101, +-107, +-104, +-97, +-105, +-103, +-93, +-102, +-100, +-89, +-99, +-97, +-85, +-96, +-94, +-84, +-80, +-82, +-63, +-51, +-56, +-36, + -8, +-10, + -9, + 92, + 89, + 78, + 98, + 91, + 82, + 94, + 87, + 74, +114, +113, +115, +112, +111, +114, +109, +108, +111, +107, +108, +115, + 97, + 92, + 97, + 19, + 2, + 3, + 32, + 6, + -1, + 24, + -6, +-22, + 41, + 11, + -7, + 68, + 38, + 28, + 81, + 49, + 37, + 68, + 34, + 16, + 43, + 3, +-23, + 45, + 2, +-32, + 51, + 5, +-33, + 53, + 8, +-23, + 23, +-13, +-31, +-30, +-59, +-66, + 35, + 6, + -6, + 59, + 28, + 11, + 51, + -2, +-25, + 55, + 0, +-20, + 69, + 20, + 9, + 40, + -3, + -6, + 34, + -4, + -5, + 53, + 16, + 16, +-12, +-34, +-38, +-82, +-97, +-98, +-91, +-101, +-99, +-107, +-107, +-105, +-116, +-106, +-107, +-118, +-107, +-108, +-113, +-111, +-108, +-113, +-112, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-112, +-108, +-116, +-112, +-110, +-118, +-114, +-112, +-120, +-116, +-115, +-72, +-68, +-69, + 34, + 39, + 38, + 22, + 30, + 25, +-41, +-27, +-38, +-76, +-48, +-71, +-56, +-18, +-48, +-94, +-52, +-82, +-75, +-38, +-67, +-47, +-18, +-52, +-40, +-11, +-43, +-35, + -6, +-37, +-49, +-22, +-52, +-97, +-73, +-102, +-28, + -5, +-36, +-47, +-15, +-49, +-42, + -5, +-35, +-41, + 0, +-29, +-47, + -8, +-38, +-60, +-30, +-56, +-53, +-23, +-51, +-27, +-18, +-47, + 43, + 28, + -5, + 59, + 34, + 3, + 62, + 46, + 21, +-15, +-24, +-38, +-107, +-107, +-103, +-110, +-107, +-101, +-108, +-106, +-100, +-108, +-106, +-101, +-110, +-106, +-101, +-111, +-108, +-101, +-111, +-109, +-102, +-112, +-110, +-104, +-113, +-111, +-107, +-118, +-114, +-114, +-21, +-18, +-21, +-107, +-103, +-107, +-126, +-123, +-124, +-125, +-122, +-123, +-124, +-122, +-122, +-124, +-122, +-122, +-122, +-120, +-119, +-121, +-118, +-114, +-116, +-112, +-107, +-111, +-108, +-101, +-107, +-104, +-98, +-102, +-99, +-92, +-100, +-97, +-89, +-97, +-96, +-85, +-88, +-89, +-73, +-59, +-60, +-43, +-18, +-20, +-12, + 84, + 81, + 76, + 95, + 88, + 77, + 94, + 86, + 76, +103, +102, +104, + 99, + 98, +101, + 96, + 96, + 98, + 96, + 97, +105, + 50, + 44, + 50, + 13, + -6, + -6, + 30, + 4, + -4, + 25, + -4, +-20, + 31, + 1, +-16, + 43, + 9, + -1, + 42, + 6, + -7, + 31, + -6, +-26, + 35, + -4, +-31, + 47, + 6, +-26, + 49, + 12, +-14, + 44, + 13, + -5, + 25, + -3, +-19, + 65, + 31, + 14, + 67, + 29, + 3, + 50, + 5, +-31, + 49, + -4, +-36, + 54, + 2, +-22, + 60, + 12, + -5, + 68, + 21, + 10, + 58, + 10, + 0, + 72, + 21, + 11, + 77, + 29, + 19, + 75, + 33, + 28, + 56, + 26, + 26, +-59, +-73, +-71, +-108, +-108, +-108, +-113, +-109, +-109, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-115, +-111, +-108, +-117, +-113, +-109, +-118, +-114, +-111, +-120, +-115, +-114, +-58, +-54, +-55, + 35, + 41, + 39, + 30, + 28, + 26, + -6, + -5, +-13, +-42, +-29, +-48, +-52, +-32, +-57, +-23, + -7, +-30, + -2, + 15, + -9, + -4, + 15, +-12, + 20, + 39, + 13, +-60, +-39, +-65, +-58, +-36, +-63, +-85, +-64, +-88, +-17, + 6, +-23, +-47, +-21, +-54, +-67, +-29, +-62, +-54, +-11, +-41, +-63, +-25, +-50, +-61, +-33, +-54, +-66, +-44, +-64, +-41, +-46, +-66, + 35, + 0, +-24, + 61, + 18, +-11, + 67, + 37, + 10, + 54, + 30, + 12, +-86, +-95, +-99, +-109, +-109, +-105, +-111, +-110, +-106, +-110, +-108, +-104, +-112, +-109, +-103, +-114, +-111, +-105, +-113, +-113, +-104, +-114, +-114, +-107, +-116, +-114, +-111, +-122, +-119, +-120, + 27, + 30, + 26, +-82, +-79, +-83, +-125, +-122, +-123, +-123, +-121, +-121, +-123, +-120, +-121, +-122, +-120, +-120, +-120, +-117, +-117, +-120, +-117, +-114, +-119, +-116, +-110, +-117, +-113, +-107, +-112, +-109, +-103, +-106, +-103, +-96, +-102, +-99, +-92, +-98, +-97, +-89, +-94, +-93, +-81, +-83, +-83, +-67, +-48, +-49, +-38, + 48, + 44, + 44, + 97, + 89, + 81, + 97, + 89, + 80, +109, +109, +111, +106, +106, +108, +103, +103, +106, + 99, +100, +108, + 54, + 48, + 52, + 21, + 3, + 0, + 26, + 0, + -9, + 30, + 0, +-13, + 30, + -1, +-14, + 33, + -1, + -9, + 37, + 2, +-11, + 33, + -4, +-22, + 40, + 0, +-22, + 53, + 12, +-15, + 71, + 33, + 19, + 86, + 53, + 43, + 83, + 51, + 28, + 56, + 23, +-13, + 45, + 5, +-33, + 50, + 3, +-32, + 48, + 3, +-24, + 66, + 21, + -2, + 73, + 24, + 5, + 53, + 1, +-18, + 54, + -4, +-25, + 65, + 2, +-19, + 62, + -3, +-22, + 60, + 4, + -7, + 45, + 6, + 4, +-54, +-74, +-72, +-104, +-112, +-107, +-109, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-115, +-111, +-108, +-117, +-113, +-109, +-118, +-114, +-111, +-119, +-114, +-113, +-44, +-40, +-41, + 44, + 49, + 47, + 47, + 43, + 39, + 25, + 21, + 15, + -8, + -8, +-19, +-18, +-14, +-30, +-15, +-11, +-27, + 25, + 29, + 13, + 39, + 45, + 27, + 43, + 52, + 33, + -7, + 6, +-14, +-71, +-53, +-77, +-62, +-40, +-64, +-41, +-17, +-46, +-57, +-31, +-67, +-61, +-27, +-63, +-42, + -6, +-36, +-57, +-27, +-47, +-52, +-33, +-42, +-102, +-92, +-98, +-66, +-85, +-93, + 23, +-26, +-41, + 60, + 7, +-19, + 76, + 36, + 7, + 76, + 42, + 20, + -6, +-23, +-33, +-107, +-112, +-114, +-112, +-113, +-110, +-113, +-111, +-106, +-115, +-112, +-106, +-117, +-113, +-108, +-117, +-117, +-110, +-119, +-118, +-113, +-120, +-119, +-116, +-118, +-115, +-115, + 49, + 52, + 49, +-84, +-81, +-84, +-122, +-120, +-117, +-120, +-119, +-115, +-120, +-118, +-115, +-115, +-114, +-111, +-110, +-109, +-105, +-112, +-110, +-105, +-114, +-112, +-104, +-116, +-113, +-105, +-114, +-112, +-104, +-112, +-110, +-101, +-115, +-112, +-104, +-114, +-112, +-107, +-113, +-110, +-102, +-112, +-111, +-97, +-99, +-101, +-88, +-69, +-74, +-71, + 67, + 57, + 54, + 98, + 90, + 81, +113, +112, +115, +111, +110, +113, +109, +109, +112, +107, +108, +115, + 41, + 36, + 38, + 22, + 4, + -1, + 25, + -1, +-11, + 35, + 4, + -7, + 27, + -5, +-14, + 31, + -1, +-10, + 47, + 14, + 3, + 52, + 16, + 2, + 43, + 5, +-13, + 37, + -3, +-24, + 66, + 20, + 5, + 69, + 22, + 3, + 52, + 11, +-23, + 41, + 5, +-36, + 44, + 11, +-21, + 47, + 16, + -4, + 63, + 26, + 5, + 72, + 30, + 6, + 54, + 6, +-19, + 52, + -1, +-26, + 58, + -1, +-25, + 45, +-15, +-39, + 43, + -9, +-29, + 26, +-14, +-28, +-56, +-79, +-85, +-105, +-112, +-112, +-112, +-111, +-108, +-114, +-110, +-106, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-111, +-107, +-114, +-110, +-107, +-115, +-111, +-108, +-116, +-111, +-111, +-33, +-29, +-30, + 46, + 51, + 49, + 48, + 55, + 48, + 47, + 54, + 45, + 23, + 28, + 20, + 13, + 17, + 7, + 36, + 40, + 29, + 41, + 47, + 34, + 48, + 53, + 40, + 52, + 57, + 44, + 32, + 44, + 27, +-60, +-44, +-63, +-49, +-27, +-50, +-47, +-22, +-50, +-53, +-26, +-63, +-51, +-22, +-58, +-34, + -7, +-37, +-87, +-66, +-83, +-102, +-91, +-93, +-123, +-115, +-113, +-105, +-119, +-122, +-15, +-58, +-72, + 35, +-11, +-40, + 71, + 38, + 4, + 66, + 40, + 9, + 66, + 47, + 30, +-49, +-60, +-67, +-112, +-115, +-114, +-115, +-112, +-107, +-116, +-113, +-107, +-119, +-117, +-112, +-121, +-120, +-116, +-122, +-120, +-118, +-123, +-121, +-119, +-98, +-97, +-96, + 17, + 19, + 18, +-105, +-103, +-102, +-109, +-108, +-102, +-110, +-109, +-103, +-110, +-109, +-103, +-109, +-109, +-102, +-103, +-102, +-95, +-100, +-99, +-91, +-100, +-98, +-88, +-97, +-95, +-85, +-95, +-93, +-83, +-97, +-95, +-85, +-97, +-94, +-84, +-98, +-96, +-92, +-111, +-109, +-102, +-107, +-107, +-93, +-98, +-99, +-86, +-87, +-92, +-86, + 45, + 36, + 33, + 97, + 89, + 81, +117, +116, +118, +116, +115, +117, +114, +113, +117, +108, +109, +117, + 9, + 3, + 4, + 18, + 1, + -8, + 22, + -3, +-15, + 35, + 3, + -4, + 33, + 1, + -4, + 37, + 6, + -2, + 41, + 9, + -1, + 43, + 9, + -3, + 31, + -6, +-20, + 22, +-18, +-34, + 37, + -7, +-26, + 41, + -5, +-28, + 42, + -4, +-30, + 50, + 6, +-21, + 54, + 17, + -7, + 65, + 33, + 15, + 62, + 26, + 1, + 54, + 11, +-17, + 54, + 7, +-21, + 51, + 1, +-24, + 37, +-12, +-30, + 40, + -5, +-19, + 7, +-22, +-32, +-69, +-85, +-91, +-111, +-111, +-112, +-117, +-109, +-107, +-117, +-109, +-107, +-114, +-110, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-110, +-107, +-114, +-110, +-108, +-115, +-111, +-110, +-15, +-10, +-12, + 42, + 47, + 45, + 43, + 59, + 47, + 34, + 49, + 38, + 30, + 35, + 31, + 9, + 10, + 8, + 21, + 24, + 18, + 39, + 44, + 35, + 41, + 51, + 42, + 48, + 60, + 49, + 38, + 54, + 39, + -8, + 10, + -8, +-30, + -8, +-31, +-46, +-22, +-48, +-34, + -8, +-40, +-21, + 2, +-31, +-33, +-14, +-41, +-122, +-110, +-123, +-122, +-119, +-116, +-121, +-114, +-111, +-103, +-113, +-117, +-11, +-52, +-67, + 18, +-27, +-56, + 66, + 36, + 1, + 63, + 40, + 7, + 70, + 44, + 23, + 14, + -4, +-16, +-113, +-120, +-121, +-120, +-117, +-112, +-122, +-118, +-112, +-121, +-119, +-115, +-123, +-121, +-120, +-123, +-121, +-120, +-122, +-120, +-118, +-117, +-115, +-113, +-107, +-105, +-103, +-99, +-97, +-93, +-96, +-96, +-87, +-100, +-101, +-91, +-96, +-96, +-86, +-95, +-95, +-85, +-99, +-99, +-90, +-94, +-93, +-82, +-95, +-93, +-82, +-92, +-90, +-79, +-92, +-91, +-79, +-95, +-93, +-82, +-94, +-92, +-80, +-87, +-86, +-78, +-90, +-88, +-77, +-103, +-103, +-88, +-101, +-103, +-91, +-62, +-67, +-66, + 78, + 69, + 63, + 97, + 89, + 80, +113, +112, +115, +112, +111, +114, +110, +110, +114, +103, +104, +112, + -1, + -7, + -8, + 1, +-15, +-26, + 26, + 2, +-11, + 30, + -1, + -8, + 41, + 8, + 5, + 40, + 11, + 3, + 44, + 12, + 4, + 33, + -1, +-11, + 34, + -3, +-15, + 43, + 3, +-10, + 42, + 10, + -3, + 43, + 15, + 1, + 45, + 5, + -6, + 48, + -2, +-15, + 51, + -1, +-24, + 58, + 8, +-24, + 49, + 4, +-28, + 53, + 7, +-23, + 48, + 3, +-26, + 36, + -7, +-27, + 17, +-18, +-30, +-29, +-55, +-60, +-102, +-117, +-110, +-112, +-115, +-107, +-117, +-110, +-102, +-118, +-110, +-103, +-112, +-112, +-106, +-109, +-112, +-109, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-113, +-111, +-107, +-114, +-110, +-107, +-114, +-110, +-108, +-116, +-111, +-111, + 1, + 6, + 4, + 43, + 48, + 46, + 46, + 59, + 47, + 50, + 57, + 49, + 53, + 48, + 48, + 39, + 24, + 28, + 13, + 0, + -1, + 16, + 11, + 5, + -4, + 12, + 4, + -7, + 13, + 1, +-26, + -5, +-21, +-64, +-43, +-61, +-58, +-38, +-58, +-63, +-42, +-64, +-81, +-60, +-84, +-48, +-31, +-56, +-48, +-35, +-56, +-125, +-119, +-127, +-115, +-115, +-112, +-111, +-111, +-107, +-69, +-89, +-94, + 15, +-33, +-47, + 26, +-27, +-53, + 65, + 26, + -4, + 69, + 36, + 8, + 66, + 34, + 11, + 61, + 38, + 21, +-70, +-79, +-83, +-121, +-119, +-114, +-123, +-118, +-111, +-114, +-112, +-107, +-106, +-104, +-102, +-107, +-104, +-103, +-107, +-105, +-102, +-105, +-103, +-99, +-99, +-97, +-94, +-94, +-93, +-87, +-90, +-90, +-79, +-95, +-95, +-84, +-91, +-91, +-79, +-90, +-91, +-79, +-89, +-89, +-77, +-85, +-84, +-72, +-83, +-81, +-68, +-92, +-91, +-78, +-89, +-88, +-75, +-97, +-96, +-83, +-97, +-96, +-82, +-84, +-84, +-71, +-82, +-81, +-66, +-89, +-89, +-73, +-92, +-93, +-82, +-72, +-76, +-78, + 76, + 69, + 57, + 96, + 88, + 79, + 96, + 96, +104, + 97, + 97, +105, + 99, + 98, +107, + 95, + 88, +102, + 6, + 1, + 3, +-19, +-25, +-36, + 28, + 14, + -1, + 37, + 11, + 4, + 43, + 10, + 10, + 42, + 13, + 12, + 47, + 16, + 14, + 40, + 6, + 4, + 40, + 5, + 0, + 50, + 14, + 7, + 52, + 19, + 12, + 45, + 12, + 3, + 23, +-19, +-28, + 34, +-12, +-26, + 42, + -2, +-23, + 44, + 4, +-24, + 46, + 3, +-13, + 40, + -2, +-11, + 16, +-19, +-24, +-10, +-36, +-38, +-86, +-102, +-99, +-105, +-115, +-106, +-111, +-110, +-103, +-112, +-109, +-103, +-113, +-109, +-103, +-116, +-113, +-107, +-115, +-113, +-107, +-115, +-113, +-107, +-114, +-113, +-107, +-112, +-112, +-105, +-112, +-111, +-105, +-112, +-111, +-105, +-112, +-111, +-105, +-116, +-115, +-111, +-113, +-111, +-109, +-113, +-111, +-110, +-107, +-105, +-105, + 12, + 16, + 13, + 45, + 49, + 46, + 43, + 48, + 41, + 46, + 49, + 38, + 48, + 34, + 21, + 51, + 13, + -1, + 32, + -9, +-29, + 1, +-27, +-55, +-62, +-61, +-87, +-63, +-49, +-73, +-65, +-41, +-66, +-58, +-33, +-54, +-45, +-26, +-38, +-67, +-55, +-62, +-118, +-111, +-116, +-126, +-121, +-125, +-122, +-118, +-122, +-120, +-116, +-119, +-114, +-111, +-112, +-109, +-111, +-110, +-45, +-68, +-78, + 30, +-19, +-42, + 42, +-12, +-39, + 67, + 24, + -1, + 66, + 30, + 2, + 64, + 32, + 7, + 69, + 44, + 25, + 29, + 12, + 6, +-64, +-70, +-64, +-62, +-61, +-46, +-60, +-55, +-36, +-52, +-53, +-35, +-51, +-53, +-33, +-56, +-57, +-35, +-72, +-70, +-51, +-97, +-93, +-80, +-105, +-100, +-89, +-86, +-83, +-67, +-88, +-86, +-70, +-91, +-88, +-75, +-87, +-84, +-72, +-94, +-90, +-80, +-92, +-89, +-79, +-82, +-80, +-70, +-82, +-80, +-68, +-89, +-88, +-75, +-84, +-83, +-68, +-93, +-93, +-77, +-91, +-88, +-75, +-65, +-65, +-50, +-90, +-90, +-75, +-88, +-92, +-83, +-66, +-69, +-71, + 70, + 65, + 56, + 93, + 86, + 77, + 91, + 91, +100, + 92, + 92, +101, + 93, + 93, +103, + 91, + 87, +100, + 2, + 1, + 2, + 2, + 2, + -9, + -2, + -9, +-23, + 42, + 24, + 15, + 47, + 21, + 18, + 46, + 22, + 20, + 55, + 29, + 27, + 55, + 28, + 25, + 54, + 26, + 21, + 49, + 19, + 14, + 41, + 13, + 7, + 41, + 13, + 7, + 46, + 14, + 7, + 48, + 16, + 5, + 45, + 17, + 1, + 55, + 32, + 15, + 26, + 8, + -2, +-50, +-68, +-72, +-94, +-105, +-107, +-107, +-111, +-110, +-111, +-109, +-105, +-114, +-108, +-103, +-110, +-106, +-101, +-111, +-108, +-102, +-113, +-109, +-104, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-114, +-114, +-106, +-112, +-112, +-105, +-111, +-111, +-104, +-112, +-111, +-104, +-112, +-111, +-105, +-121, +-119, +-115, +-123, +-121, +-119, +-114, +-112, +-111, +-88, +-86, +-87, + 26, + 29, + 26, + 43, + 46, + 43, + 50, + 54, + 48, + 47, + 50, + 40, + 30, + 17, + 4, + 31, + -7, +-23, + 36, + -8, +-32, + 29, + -4, +-36, + 24, +-11, +-36, + 12, +-14, +-40, +-21, +-30, +-55, +-51, +-44, +-67, +-96, +-78, +-91, +-125, +-109, +-117, +-124, +-121, +-122, +-123, +-120, +-121, +-120, +-117, +-118, +-118, +-115, +-116, +-115, +-112, +-113, +-111, +-112, +-111, +-48, +-69, +-80, + 39, + -5, +-31, + 59, + 12, +-16, + 73, + 37, + 11, + 66, + 34, + 6, + 73, + 40, + 13, + 74, + 44, + 23, + 73, + 51, + 41, + 20, + 7, + 7, +-39, +-44, +-32, +-44, +-44, +-24, +-42, +-45, +-21, +-41, +-45, +-18, +-42, +-44, +-16, +-52, +-52, +-27, +-62, +-58, +-39, +-84, +-79, +-64, +-78, +-75, +-58, +-82, +-80, +-63, +-85, +-82, +-67, +-86, +-82, +-70, +-84, +-80, +-68, +-94, +-91, +-80, +-89, +-87, +-77, +-83, +-81, +-70, +-87, +-85, +-72, +-84, +-84, +-69, +-81, +-81, +-64, +-93, +-91, +-77, +-85, +-84, +-69, +-87, +-87, +-73, +-84, +-88, +-80, +-58, +-62, +-64, + 79, + 74, + 66, + 94, + 87, + 78, + 87, + 88, + 97, + 89, + 89, + 98, + 90, + 90, +100, + 91, + 92, +103, + -2, + 2, + 5, + 12, + 18, + 9, +-12, +-11, +-23, +-23, +-32, +-42, + 29, + 12, + 7, + 44, + 24, + 21, + 49, + 30, + 26, + 52, + 32, + 27, + 56, + 36, + 31, + 55, + 34, + 29, + 47, + 28, + 23, + 44, + 26, + 23, + 47, + 31, + 27, + 62, + 50, + 44, + 88, + 79, + 72, + 97, + 90, + 82, +-15, +-17, +-21, +-113, +-111, +-109, +-113, +-110, +-107, +-111, +-106, +-103, +-112, +-104, +-100, +-108, +-101, +-97, +-110, +-106, +-100, +-113, +-110, +-104, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-116, +-113, +-107, +-114, +-113, +-106, +-112, +-112, +-105, +-111, +-111, +-104, +-111, +-111, +-104, +-112, +-111, +-105, +-118, +-116, +-112, +-120, +-118, +-117, +-120, +-117, +-116, +-48, +-46, +-47, + 38, + 41, + 38, + 47, + 50, + 47, + 45, + 47, + 42, + 41, + 44, + 36, + 28, + 18, + 9, + 35, + 0, +-12, + 26, +-18, +-38, + 22, +-13, +-44, + 50, + -3, +-29, + 51, + 4, +-26, + 52, + 17, +-14, + 14, + -7, +-33, +-56, +-68, +-82, +-110, +-114, +-122, +-121, +-118, +-119, +-120, +-117, +-118, +-119, +-116, +-117, +-117, +-114, +-115, +-116, +-113, +-114, +-111, +-112, +-112, +-51, +-69, +-81, + 47, + 9, +-19, + 74, + 35, + 5, + 78, + 48, + 22, + 77, + 50, + 24, + 77, + 44, + 19, + 75, + 40, + 18, + 71, + 41, + 24, + 76, + 55, + 47, + -4, +-17, +-12, +-43, +-49, +-30, +-43, +-49, +-21, +-45, +-50, +-18, +-42, +-46, +-13, +-45, +-47, +-16, +-59, +-58, +-33, +-60, +-56, +-36, +-54, +-52, +-33, +-54, +-52, +-35, +-89, +-87, +-71, +-79, +-76, +-62, +-80, +-76, +-63, +-88, +-85, +-74, +-92, +-90, +-79, +-83, +-81, +-70, +-87, +-86, +-73, +-82, +-81, +-66, +-79, +-79, +-62, +-84, +-81, +-67, +-90, +-89, +-74, +-81, +-81, +-67, +-83, +-87, +-79, +-16, +-19, +-22, + 92, + 87, + 79, + 96, + 89, + 80, + 51, + 51, + 58, + 51, + 51, + 58, + 55, + 55, + 63, + 56, + 58, + 66, + -8, + -4, + -1, +-31, +-25, +-31, +-11, + -7, +-16, +-40, +-42, +-51, +-45, +-55, +-61, + 8, + -6, +-10, + 21, + 6, + 4, + 20, + 7, + 3, + 18, + 4, + 1, + 19, + 5, + 2, + 5, + -7, + -8, + 31, + 23, + 23, + 42, + 35, + 35, + 57, + 53, + 52, + 56, + 55, + 53, + 45, + 45, + 43, +-73, +-73, +-72, +-105, +-105, +-102, +-102, +-102, +-99, +-102, +-101, +-98, +-100, +-101, +-97, +-99, +-99, +-95, +-103, +-101, +-98, +-104, +-103, +-100, +-105, +-104, +-101, +-105, +-104, +-101, +-105, +-104, +-101, +-105, +-104, +-101, +-104, +-104, +-101, +-104, +-104, +-101, +-103, +-103, +-99, +-102, +-102, +-99, +-104, +-103, +-100, +-106, +-105, +-104, +-107, +-107, +-106, +-107, +-106, +-105, +-41, +-39, +-40, + 17, + 20, + 18, + 21, + 24, + 21, + 17, + 19, + 15, + 19, + 22, + 16, + 3, + -3, + -8, + 1, +-25, +-32, + 0, +-34, +-48, + -4, +-31, +-55, + 7, +-28, +-52, + 18, +-20, +-46, + 23, +-15, +-42, + 24, +-10, +-31, + 1, +-28, +-39, +-74, +-91, +-95, +-106, +-105, +-106, +-107, +-105, +-106, +-106, +-105, +-105, +-105, +-104, +-104, +-104, +-103, +-103, +-101, +-102, +-102, +-24, +-40, +-49, + 20, + -8, +-31, + 46, + 18, + -6, + 41, + 19, + 0, + 45, + 25, + 6, + 48, + 21, + 4, + 39, + 10, + -8, + 36, + 10, + -8, + 42, + 22, + 12, + 6, + -7, + -5, +-60, +-67, +-53, +-60, +-65, +-42, +-60, +-65, +-38, +-59, +-63, +-35, +-57, +-59, +-34, +-62, +-61, +-41, +-77, +-75, +-58, +-64, +-63, +-47, +-54, +-52, +-37, +-87, +-85, +-74, +-84, +-82, +-71, +-82, +-79, +-69, +-89, +-87, +-78, +-92, +-91, +-84, +-84, +-82, +-74, +-94, +-93, +-84, +-83, +-83, +-72, +-82, +-82, +-70, +-84, +-83, +-73, +-89, +-89, +-78, +-84, +-84, +-74, +-86, +-89, +-84, + 2, + -1, + -3, + 59, + 56, + 49, + 60, + 54, + 47 +}; diff --git a/examples/app_profiling/src/main.cpp.1 b/examples/app_profiling/src/main.cpp.1 new file mode 100644 index 000000000..9dd639531 --- /dev/null +++ b/examples/app_profiling/src/main.cpp.1 @@ -0,0 +1,19 @@ +#include +#include +#include "model.tflite.h" + +#include "image.h" +#include "image2.h" + + +int main(void) { + model_init(NULL); + int8_t *inputs = (int8_t *)model_input_ptr(0); + int8_t *outputs = (int8_t *)model_output_ptr(0); + memcpy(inputs, image, sizeof(image)); // copy data to inputs + model_invoke(); + printf("%s (%d%%)\n", outputs[0] > outputs[1] ? "No human" : "Human", (outputs[1]+128)*100/255); + memcpy(inputs, image2, sizeof(image2)); // copy data to inputs + model_invoke(); + printf("%s (%d%%)\n", outputs[0] > outputs[1] ? "No human" : "Human", (outputs[1]+128)*100/255); +} diff --git a/examples/app_profiling/src/main.xc b/examples/app_profiling/src/main.xc new file mode 100644 index 000000000..415bc4e01 --- /dev/null +++ b/examples/app_profiling/src/main.xc @@ -0,0 +1,8 @@ +#include + +extern void inferencer(); + +int main(void) { + inferencer(); + return 0; +} diff --git a/examples/app_profiling/src/support.cpp b/examples/app_profiling/src/support.cpp new file mode 100644 index 000000000..623865b81 --- /dev/null +++ b/examples/app_profiling/src/support.cpp @@ -0,0 +1,24 @@ +#include +#include + +#include "model.tflite.h" +#include "image.h" +#include "image2.h" + +void run() { + model_init(NULL); + int8_t *inputs = (int8_t *)model_input_ptr(0); + int8_t *outputs = (int8_t *)model_output_ptr(0); + memcpy(inputs, image, sizeof(image)); // copy data to inputs + model_invoke(); + printf("%s (%d%%)\n", outputs[0] > outputs[1] ? "No human" : "Human", (outputs[1]+128)*100/255); + memcpy(inputs, image2, sizeof(image2)); // copy data to inputs + model_invoke(); + printf("%s (%d%%)\n", outputs[0] > outputs[1] ? "No human" : "Human", (outputs[1]+128)*100/255); +} + +extern "C" { + void inferencer() { + run(); + } +} diff --git a/examples/app_profiling/vww_quant.tflite b/examples/app_profiling/vww_quant.tflite new file mode 100644 index 000000000..2abf500af Binary files /dev/null and b/examples/app_profiling/vww_quant.tflite differ diff --git a/examples/app_single_model_on_one_tile_and_DDR/.gitignore b/examples/app_single_model_on_one_tile_and_DDR/.gitignore new file mode 100644 index 000000000..c7a868ae5 --- /dev/null +++ b/examples/app_single_model_on_one_tile_and_DDR/.gitignore @@ -0,0 +1,6 @@ +manifest.txt +model_weights.c +model_weights.h +model.tflite.cpp +model.tflite.h +model.tflite diff --git a/examples/app_single_model_on_one_tile_and_DDR/CMakeLists.txt b/examples/app_single_model_on_one_tile_and_DDR/CMakeLists.txt new file mode 100644 index 000000000..90222bd4a --- /dev/null +++ b/examples/app_single_model_on_one_tile_and_DDR/CMakeLists.txt @@ -0,0 +1,46 @@ +cmake_minimum_required(VERSION 3.21) +include($ENV{XMOS_CMAKE_PATH}/xcommon.cmake) +project(app_ddr) + +# hw and xscope +set(APP_HW_TARGET src/XCORE-AI-EXPLORER-800.xn) +set(APP_XSCOPE_SRCS src/config.xscope) + +# export model and sources +execute_process( + COMMAND python generate_optimized_cpp_for_xcore.py + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} +) +set(APP_INCLUDES + src +) + +set(APP_XC_SRCS "") + +set(APP_C_SRCS + src/model_weights.c +) +set(APP_CXX_SRCS + src/model.tflite.cpp + src/main.cpp +) + +# Base flags +list(APPEND APP_COMPILER_FLAGS + -O3 + -g + -report + -Wall + -fxscope + -mcmodel=large + -Wno-xcore-fptrgroup + -lquadflash + # -DTFLMC_XCORE_PROFILE +) + +# dependencies and register +set(APP_DEPENDENT_MODULES "") +XMOS_REGISTER_APP() + +# Custom libs +include(aitools.cmake) diff --git a/examples/app_single_model_on_one_tile_and_DDR/README.rst b/examples/app_single_model_on_one_tile_and_DDR/README.rst new file mode 100644 index 000000000..edf8c863c --- /dev/null +++ b/examples/app_single_model_on_one_tile_and_DDR/README.rst @@ -0,0 +1,42 @@ +App Single Model on One Tile and DDR +==================================== + + +This example demonstrates how to run a MobileNetV2 model using DDR on tile[0]. +This example runs on the XCORE.AI EVALUATION KIT XK-EVK-XU316. + +Setup +----- + +1. Ensure you have XTC tools version 15.3.0 activated in your current terminal. +2. Install the `xmos_ai_tools` Python package in your virtual environment (venv). + +Build and Run +------------- + +Run the following commands in the current directory. + +.. code-block:: console + + # build + cmake -G "Unix Makefiles" -B build + xmake -C build + # run + xrun --xscope bin/app_ddr.xe + + +Output +------ + +The terminal should oyutput the three top classes given that image. +It outputs soemthing like the following: + +.. code-block:: console + + Init Mobilenet DDR model + Input size = 76800 + Output size = 1000 + Top 3 classes: + Top 0, class:291, prob:0.86, label:'lion, king of beasts, Panthera leo' + Top 1, class:260, prob:0.02, label:'chow, chow chow' + Top 2, class:200, prob:0.00, label:'Tibetan terrier, chrysanthemum dog' diff --git a/examples/app_single_model_on_one_tile_and_DDR/aitools.cmake b/examples/app_single_model_on_one_tile_and_DDR/aitools.cmake new file mode 100644 index 000000000..37a050f8a --- /dev/null +++ b/examples/app_single_model_on_one_tile_and_DDR/aitools.cmake @@ -0,0 +1,39 @@ +# Get path of xmos ai tools +set(CMD "\ +import os; \ +import xmos_ai_tools.runtime as rt; \ +print(os.path.dirname(rt.__file__)) \ +") + +execute_process( + COMMAND python -c "${CMD}" + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + OUTPUT_VARIABLE XMOS_AITOOLSLIB_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE + COMMAND_ERROR_IS_FATAL ANY +) + +# Add tflite_micro +set(XMOS_AITOOLSLIB_PATH_CMAKE "${XMOS_AITOOLSLIB_PATH}/buildfiles/aitoolslib.cmake") + +if(XMOS_AITOOLSLIB_PATH STREQUAL "") + message(FATAL_ERROR "Path to XMOS AI tools NOT found") +elseif(NOT EXISTS ${XMOS_AITOOLSLIB_PATH_CMAKE}) + message(FATAL_ERROR "Cmake file 'aitoolslib.cmake' NOT found in this path") +else() + message(STATUS "\nFound python package xmos-ai-tools at: ${XMOS_AITOOLSLIB_PATH}") + include(${XMOS_AITOOLSLIB_PATH_CMAKE}) + set(LIB_NAME tflite_micro) + add_library(${LIB_NAME} STATIC IMPORTED GLOBAL) + target_compile_definitions(${LIB_NAME} INTERFACE ${XMOS_AITOOLSLIB_DEFINITIONS}) + set_target_properties(${LIB_NAME} PROPERTIES + LINKER_LANGUAGE CXX + IMPORTED_LOCATION ${XMOS_AITOOLSLIB_LIBRARIES} + INTERFACE_INCLUDE_DIRECTORIES ${XMOS_AITOOLSLIB_INCLUDES}) +endif() + +# Link aitools with the targets +foreach(target ${APP_BUILD_TARGETS}) + message(STATUS "Linking ${target} with ${LIB_NAME}") + target_link_libraries(${target} PRIVATE ${LIB_NAME}) +endforeach() diff --git a/examples/app_single_model_on_one_tile_and_DDR/generate_optimized_cpp_for_xcore.py b/examples/app_single_model_on_one_tile_and_DDR/generate_optimized_cpp_for_xcore.py new file mode 100644 index 000000000..c1e0584de --- /dev/null +++ b/examples/app_single_model_on_one_tile_and_DDR/generate_optimized_cpp_for_xcore.py @@ -0,0 +1,43 @@ +from xmos_ai_tools import xformer + +TFLITE_MODEL_PATH = "mobilenetv2.tflite" +OPTIMIZED_MODEL_PATH = "src/model.tflite" + +OPTIMIZED_MODEL_PATH = "src/model.tflite" +WEIGHT_PARAMS_PATH = "src/model_weights" +FLASH_IMAGE_PATH = "src/xcore_flash_binary.out" +print("Generating app cpp files for model...") +xformer.convert( + TFLITE_MODEL_PATH, + OPTIMIZED_MODEL_PATH, + [ + ("xcore-thread-count", "5"), + # set conv err threshold + ("xcore-conv-err-threshold", "3"), + # operation splitting to reduce tensor arena size + ("xcore-op-split-tensor-arena", "True"), + ("xcore-op-split-top-op", "0,7"), + ("xcore-op-split-bottom-op", "6,14"), + ("xcore-op-split-num-splits", "8,4"), + # write weights as an array to be placed in DDR + ("xcore-write-weights-as-array", "True"), + ("xcore-weights-in-external-memory", "True"), + # For DDR, we want to ideally reduce loads smaller + # than 4000 bytes, as they are slower. + # But this would increase memory usage on tile + # and so it is a tradeoff + ("xcore-load-externally-if-larger", "1500"), + # move weights to this file + ("xcore-weights-file", WEIGHT_PARAMS_PATH), + ], +) +xformer.print_optimization_report() + +# # Generate flash image to be flashed using xflash +# xformer.generate_flash( +# output_file=FLASH_IMAGE_PATH, +# model_files=[OPTIMIZED_MODEL_PATH], +# param_files=[WEIGHT_PARAMS_PATH], +# ) + +print("Done!") diff --git a/examples/app_single_model_on_one_tile_and_DDR/mobilenetv2.tflite b/examples/app_single_model_on_one_tile_and_DDR/mobilenetv2.tflite new file mode 100644 index 000000000..e1286128f Binary files /dev/null and b/examples/app_single_model_on_one_tile_and_DDR/mobilenetv2.tflite differ diff --git a/examples/app_single_model_on_one_tile_and_DDR/src/XCORE-AI-EXPLORER-800.xn b/examples/app_single_model_on_one_tile_and_DDR/src/XCORE-AI-EXPLORER-800.xn new file mode 100644 index 000000000..075a48f6b --- /dev/null +++ b/examples/app_single_model_on_one_tile_and_DDR/src/XCORE-AI-EXPLORER-800.xn @@ -0,0 +1,104 @@ + + + Board + xcore.ai Explorer Kit + + + tileref tile[2] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/app_single_model_on_one_tile_and_DDR/src/config.xscope b/examples/app_single_model_on_one_tile_and_DDR/src/config.xscope new file mode 100644 index 000000000..3ec328050 --- /dev/null +++ b/examples/app_single_model_on_one_tile_and_DDR/src/config.xscope @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/app_single_model_on_one_tile_and_DDR/src/image.h b/examples/app_single_model_on_one_tile_and_DDR/src/image.h new file mode 100644 index 000000000..71fbb211d --- /dev/null +++ b/examples/app_single_model_on_one_tile_and_DDR/src/image.h @@ -0,0 +1,486 @@ +#define LION_HEIGHT 160 +#define LION_WIDTH 160 + +// array size is 76800 +const char lion[] = { + 51, 108, 172, 46, 95, 139, 64, 112, 161, 85, 144, 198, 91, 170, 241, 98, 178, 248, 104, 183, 248, 82, 163, 234, 10, 29, 67, 80, 131, 165, 77, 156, 231, 47, 107, 160, 30, 54, 68, 68, 89, 92, 89, 118, 133, 96, 117, 122, 75, 78, 51, 79, 76, 37, 83, 81, 47, 71, 69, 45, 56, 59, 41, 69, 95, 98, 97, 169, 224, 112, 189, 247, 99, 165, 218, 107, 186, 247, 108, 187, 249, 107, 187, 250, 108, 187, 250, 107, 187, 250, 109, 186, 250, 108, 187, 251, 108, 188, 251, 109, 187, 248, 108, 187, 251, 109, 188, 249, 107, 188, 248, 110, 188, 250, 111, 188, 249, 112, 189, 250, 113, 190, 250, 112, 189, 247, 102, 181, 240, 88, 150, 205, 73, 107, 136, 66, 76, 72, 77, 109, 112, 99, 175, 225, 117, 195, 248, 106, 182, 239, 34, 72, 103, 14, 21, 4, 15, 21, 5, 20, + 20, 8, 22, 21, 13, 31, 30, 22, 52, 64, 65, 108, 182, 239, 121, 196, 249, 117, 194, 250, 116, 190, 248, 111, 189, 247, 111, 186, 248, 107, 183, 247, 103, 180, 249, 102, 178, 250, 101, 177, 250, 103, 175, 251, 101, 173, 249, 102, 171, 244, 109, 174, 244, 89, 140, 208, 94, 132, 198, 98, 156, 225, 107, 173, 247, 102, 165, 239, 101, 163, 235, 95, 151, 221, 96, 138, 198, 90, 128, 185, 92, 134, 198, 102, 155, 220, 100, 152, 219, 102, 155, 221, 103, 159, 228, 104, 154, 221, 103, 154, 220, 101, 155, 224, 102, 157, 227, 103, 155, 227, 101, 155, 226, 101, 157, 225, 103, 158, 227, 102, 160, 231, 103, 161, 232, 102, 162, 232, 99, 163, 234, 99, 164, 237, 98, 159, 234, 97, 159, 233, 97, 160, 235, 98, 163, 239, 103, 169, 243, 101, 170, 245, 102, 169, 246, 99, 171, 246, 102, 172, + 248, 101, 174, 249, 101, 175, 249, 99, 178, 249, 100, 179, 250, 101, 180, 251, 103, 182, 250, 106, 184, 247, 106, 184, 249, 106, 184, 250, 104, 184, 248, 102, 184, 250, 103, 183, 250, 104, 184, 251, 104, 183, 250, 104, 183, 250, 104, 184, 251, 103, 183, 250, 101, 184, 249, 103, 183, 250, 101, 183, 249, 101, 183, 249, 102, 182, 249, 103, 182, 249, 103, 182, 249, 103, 182, 249, 102, 183, 250, 102, 183, 251, 102, 182, 251, 104, 175, 244, 102, 175, 247, 103, 182, 249, 102, 181, 250, 95, 164, 237, 57, 113, 168, 74, 154, 226, 100, 182, 247, 100, 183, 251, 100, 181, 250, 101, 181, 250, 99, 183, 250, 101, 181, 250, 100, 180, 249, 100, 181, 249, 98, 181, 251, 99, 180, 251, 98, 180, 251, 98, 179, 250, 97, 179, 250, 97, 179, 251, 98, 178, 251, 96, 179, 251, 96, 178, 251, 94, 173, 249, + 65, 136, 201, 76, 148, 221, 83, 158, 228, 99, 177, 245, 100, 179, 249, 101, 182, 249, 102, 186, 248, 56, 123, 192, 42, 42, 41, 102, 179, 230, 112, 189, 248, 92, 168, 238, 49, 96, 155, 57, 65, 54, 78, 75, 39, 115, 114, 54, 88, 85, 42, 76, 73, 38, 69, 69, 41, 68, 77, 58, 87, 146, 186, 103, 185, 244, 113, 191, 250, 110, 188, 248, 98, 152, 208, 106, 173, 237, 107, 181, 247, 109, 187, 249, 110, 187, 250, 111, 188, 250, 108, 189, 250, 109, 187, 249, 110, 187, 249, 111, 189, 251, 113, 188, 249, 110, 190, 249, 110, 190, 249, 112, 190, 250, 113, 189, 249, 107, 185, 248, 89, 166, 241, 58, 121, 182, 40, 65, 82, 49, 57, 44, 70, 110, 112, 88, 155, 216, 113, 189, 244, 121, 196, 249, 121, 197, 249, 66, 127, 188, 13, 24, 24, 10, 17, 7, 8, 15, 1, 18, + 19, 11, 26, 25, 18, 36, 33, 27, 70, 105, 127, 119, 197, 247, 119, 195, 249, 117, 192, 249, 110, 190, 249, 110, 186, 248, 106, 182, 247, 103, 181, 248, 104, 179, 250, 103, 177, 249, 103, 176, 248, 102, 173, 249, 101, 173, 247, 103, 170, 245, 108, 174, 246, 94, 135, 194, 106, 137, 191, 101, 154, 218, 104, 170, 243, 101, 160, 229, 99, 154, 224, 93, 132, 191, 104, 124, 156, 95, 107, 138, 104, 145, 201, 102, 156, 224, 98, 147, 213, 98, 144, 208, 104, 157, 225, 107, 151, 212, 109, 152, 214, 104, 151, 220, 102, 154, 224, 101, 157, 224, 104, 152, 219, 104, 157, 228, 104, 160, 230, 103, 161, 231, 104, 162, 234, 102, 162, 233, 103, 161, 232, 98, 148, 219, 98, 153, 220, 97, 162, 234, 103, 169, 244, 102, 166, 244, 101, 167, 243, 100, 169, 246, 101, 169, 246, 102, 170, 246, 102, 171, + 249, 101, 171, 249, 99, 174, 250, 99, 177, 248, 101, 178, 250, 100, 179, 250, 99, 180, 249, 103, 182, 249, 102, 183, 249, 104, 184, 249, 105, 184, 249, 104, 184, 251, 102, 184, 250, 103, 185, 251, 103, 184, 251, 103, 185, 250, 102, 183, 250, 102, 183, 249, 104, 184, 249, 101, 183, 249, 103, 183, 250, 102, 183, 250, 101, 184, 250, 103, 183, 250, 102, 183, 249, 104, 183, 250, 103, 184, 251, 103, 184, 250, 104, 183, 249, 103, 177, 249, 101, 175, 246, 104, 182, 249, 105, 182, 250, 96, 173, 244, 60, 120, 183, 58, 130, 201, 100, 181, 247, 98, 180, 251, 94, 176, 247, 100, 182, 250, 102, 181, 250, 101, 180, 249, 102, 181, 250, 102, 181, 250, 102, 181, 250, 99, 182, 250, 99, 181, 249, 98, 181, 249, 99, 179, 250, 98, 180, 251, 98, 180, 251, 98, 179, 250, 98, 178, 249, 94, 175, 250, + 65, 129, 203, 82, 151, 224, 99, 179, 249, 104, 185, 250, 105, 184, 248, 105, 187, 249, 104, 185, 246, 39, 82, 127, 79, 113, 130, 92, 169, 236, 80, 138, 199, 61, 97, 125, 64, 73, 63, 72, 71, 45, 75, 73, 39, 97, 92, 45, 107, 106, 63, 64, 62, 27, 67, 87, 96, 92, 161, 213, 109, 191, 248, 115, 193, 250, 112, 191, 249, 109, 187, 246, 88, 146, 202, 107, 182, 246, 101, 172, 238, 108, 184, 248, 110, 189, 249, 110, 188, 249, 112, 189, 249, 112, 189, 249, 112, 189, 249, 111, 189, 250, 109, 187, 248, 101, 178, 243, 95, 162, 222, 83, 136, 188, 67, 106, 145, 44, 73, 95, 28, 48, 56, 28, 43, 41, 54, 92, 112, 92, 160, 203, 110, 191, 247, 95, 168, 233, 117, 192, 247, 121, 197, 249, 91, 162, 226, 20, 43, 65, 10, 18, 11, 12, 17, 9, 12, 15, 7, 18, + 19, 11, 29, 29, 22, 42, 41, 30, 59, 70, 61, 81, 129, 167, 97, 163, 218, 105, 174, 239, 103, 174, 238, 102, 178, 244, 103, 179, 247, 100, 174, 244, 105, 176, 249, 103, 174, 249, 104, 173, 249, 101, 170, 246, 101, 165, 239, 99, 166, 238, 103, 165, 237, 97, 124, 173, 100, 116, 152, 103, 151, 213, 101, 155, 224, 96, 136, 200, 93, 133, 195, 101, 124, 166, 109, 111, 132, 108, 118, 141, 105, 150, 208, 108, 158, 222, 104, 149, 213, 107, 149, 210, 113, 151, 209, 110, 138, 187, 107, 143, 201, 107, 156, 220, 110, 152, 213, 111, 150, 208, 108, 155, 216, 106, 160, 229, 107, 161, 232, 108, 164, 231, 111, 155, 217, 111, 155, 213, 107, 148, 206, 103, 143, 205, 102, 156, 224, 103, 164, 237, 102, 160, 229, 100, 164, 238, 103, 168, 245, 102, 168, 245, 101, 167, 244, 101, 168, 246, 100, 169, + 247, 101, 170, 249, 102, 171, 249, 101, 172, 249, 100, 175, 249, 100, 177, 250, 101, 177, 249, 101, 180, 250, 101, 181, 249, 103, 183, 249, 103, 185, 249, 104, 184, 250, 103, 185, 251, 104, 184, 250, 104, 184, 251, 104, 185, 250, 103, 184, 250, 104, 184, 251, 101, 184, 250, 103, 183, 250, 102, 183, 250, 103, 183, 250, 101, 183, 249, 102, 184, 249, 101, 184, 249, 101, 184, 250, 103, 183, 250, 102, 184, 249, 103, 183, 248, 102, 181, 250, 104, 175, 246, 105, 182, 248, 104, 182, 250, 91, 170, 245, 56, 112, 174, 35, 90, 150, 73, 147, 219, 79, 153, 226, 88, 169, 240, 101, 183, 249, 102, 182, 250, 102, 182, 250, 102, 182, 250, 102, 182, 250, 101, 181, 250, 100, 182, 250, 100, 182, 250, 100, 181, 250, 99, 181, 250, 98, 180, 250, 98, 180, 250, 98, 180, 250, 99, 180, 250, 93, 175, 250, + 66, 132, 202, 77, 133, 176, 99, 176, 247, 102, 181, 247, 104, 180, 244, 102, 179, 243, 82, 157, 226, 37, 53, 70, 61, 97, 117, 49, 74, 98, 49, 55, 50, 54, 56, 39, 59, 59, 37, 57, 55, 29, 53, 52, 23, 53, 53, 28, 85, 101, 82, 97, 111, 82, 60, 79, 77, 77, 123, 169, 104, 179, 243, 116, 193, 248, 115, 192, 247, 111, 190, 247, 84, 147, 210, 83, 144, 219, 101, 173, 233, 106, 172, 241, 112, 188, 249, 112, 189, 247, 110, 187, 246, 106, 182, 242, 96, 166, 232, 78, 137, 198, 65, 104, 152, 52, 72, 83, 46, 54, 50, 43, 55, 45, 52, 78, 70, 69, 124, 154, 85, 163, 226, 76, 157, 221, 86, 153, 217, 109, 186, 248, 116, 194, 248, 87, 160, 228, 111, 188, 245, 110, 185, 241, 36, 73, 108, 13, 17, 9, 10, 15, 8, 13, 16, 9, 19, 20, 16, 21, + 21, 17, 30, 31, 25, 63, 85, 85, 87, 156, 197, 91, 168, 230, 88, 164, 223, 83, 146, 198, 77, 113, 135, 90, 136, 177, 95, 138, 182, 93, 151, 214, 103, 172, 245, 102, 170, 246, 102, 168, 244, 96, 157, 229, 96, 143, 196, 96, 152, 219, 97, 151, 220, 87, 94, 123, 105, 114, 137, 101, 133, 189, 101, 138, 198, 102, 129, 181, 98, 120, 161, 104, 112, 128, 106, 97, 98, 116, 135, 163, 111, 160, 223, 103, 146, 209, 114, 148, 204, 105, 154, 219, 119, 146, 196, 120, 136, 171, 118, 145, 193, 118, 136, 181, 123, 148, 198, 118, 150, 202, 113, 157, 219, 110, 156, 219, 111, 155, 217, 122, 151, 192, 124, 139, 176, 113, 145, 197, 116, 152, 205, 106, 150, 213, 103, 159, 227, 104, 155, 216, 107, 148, 194, 101, 162, 231, 102, 167, 245, 103, 168, 244, 103, 169, 245, 102, 167, 247, 100, 168, + 247, 101, 169, 247, 102, 169, 248, 102, 171, 249, 101, 172, 249, 101, 173, 249, 100, 176, 249, 99, 178, 250, 100, 179, 249, 101, 180, 249, 102, 182, 249, 105, 183, 249, 103, 184, 250, 104, 185, 250, 103, 185, 251, 105, 184, 250, 104, 184, 250, 103, 184, 250, 103, 184, 250, 103, 184, 250, 103, 183, 250, 104, 183, 250, 104, 184, 249, 101, 184, 249, 103, 184, 249, 103, 184, 250, 104, 183, 250, 100, 183, 249, 102, 183, 248, 102, 183, 250, 107, 176, 247, 103, 176, 244, 96, 180, 249, 91, 171, 245, 70, 140, 208, 36, 91, 143, 81, 164, 237, 97, 179, 247, 102, 183, 249, 103, 183, 249, 102, 183, 250, 102, 183, 249, 102, 183, 249, 102, 183, 249, 101, 182, 250, 102, 182, 251, 99, 181, 250, 102, 181, 250, 98, 178, 248, 90, 167, 241, 95, 175, 247, 99, 180, 250, 98, 180, 250, 94, 175, 250, + 86, 160, 227, 84, 131, 175, 91, 128, 154, 87, 114, 130, 88, 115, 119, 83, 103, 103, 54, 71, 63, 42, 44, 27, 42, 45, 30, 40, 42, 27, 36, 37, 21, 35, 36, 18, 37, 37, 19, 40, 40, 21, 61, 86, 86, 83, 146, 191, 98, 177, 238, 96, 164, 218, 82, 105, 96, 54, 61, 37, 79, 124, 164, 102, 171, 237, 109, 184, 247, 106, 178, 243, 70, 132, 186, 93, 148, 208, 110, 188, 249, 110, 178, 244, 100, 168, 232, 71, 124, 169, 61, 96, 130, 46, 69, 90, 40, 48, 52, 46, 54, 43, 56, 82, 81, 68, 125, 156, 84, 155, 200, 98, 174, 229, 105, 187, 245, 113, 191, 248, 116, 192, 249, 113, 191, 248, 99, 178, 243, 87, 164, 231, 99, 173, 237, 75, 146, 222, 95, 172, 241, 62, 118, 175, 18, 29, 24, 17, 20, 8, 18, 19, 11, 19, 20, 17, 21, 22, 19, 23, + 26, 22, 68, 104, 120, 112, 191, 246, 120, 195, 249, 112, 189, 247, 109, 187, 248, 108, 184, 249, 99, 169, 234, 102, 171, 240, 101, 171, 239, 94, 153, 222, 102, 164, 237, 99, 160, 233, 98, 151, 220, 91, 139, 204, 98, 146, 204, 98, 154, 221, 87, 122, 180, 85, 80, 87, 105, 105, 116, 99, 120, 155, 106, 140, 196, 104, 124, 167, 101, 120, 157, 108, 96, 92, 106, 91, 83, 118, 147, 189, 106, 139, 194, 112, 147, 199, 114, 143, 191, 109, 144, 199, 120, 132, 163, 128, 129, 148, 128, 139, 169, 132, 142, 177, 126, 146, 184, 121, 146, 191, 123, 147, 194, 119, 150, 202, 124, 146, 187, 126, 127, 143, 125, 149, 190, 124, 155, 203, 121, 152, 205, 114, 154, 215, 107, 160, 225, 104, 154, 213, 104, 162, 227, 101, 169, 241, 104, 168, 245, 103, 168, 245, 102, 167, 245, 102, 167, 244, 102, 168, + 244, 101, 167, 245, 99, 169, 245, 102, 169, 247, 102, 170, 247, 103, 171, 248, 100, 174, 249, 100, 174, 248, 100, 177, 249, 100, 179, 250, 99, 181, 249, 101, 182, 248, 102, 184, 248, 104, 185, 248, 104, 185, 250, 106, 184, 250, 106, 184, 250, 105, 184, 250, 105, 185, 248, 105, 184, 251, 104, 184, 251, 104, 183, 251, 100, 185, 250, 103, 184, 249, 102, 184, 250, 103, 184, 249, 102, 184, 250, 105, 185, 250, 101, 183, 249, 102, 183, 249, 101, 180, 250, 100, 174, 245, 103, 182, 248, 101, 184, 249, 92, 174, 249, 58, 121, 183, 83, 164, 232, 104, 183, 250, 103, 184, 250, 102, 184, 249, 104, 183, 250, 102, 183, 249, 101, 183, 249, 103, 184, 251, 103, 183, 250, 104, 183, 248, 102, 180, 248, 99, 173, 243, 97, 168, 239, 95, 172, 244, 98, 179, 248, 100, 182, 250, 100, 181, 250, 95, 177, 251, + 79, 137, 193, 84, 94, 87, 94, 95, 58, 93, 93, 51, 84, 83, 35, 69, 69, 24, 56, 57, 16, 51, 52, 28, 40, 41, 20, 31, 33, 15, 24, 24, 9, 30, 35, 21, 49, 71, 70, 78, 133, 167, 99, 179, 244, 112, 191, 249, 114, 193, 249, 111, 190, 248, 92, 156, 215, 78, 106, 104, 64, 98, 118, 74, 113, 144, 85, 118, 153, 91, 150, 214, 69, 133, 194, 99, 152, 207, 94, 158, 221, 80, 134, 185, 70, 83, 90, 39, 49, 34, 42, 64, 62, 62, 102, 117, 82, 148, 186, 93, 174, 232, 104, 187, 246, 111, 192, 250, 114, 192, 250, 116, 192, 250, 115, 193, 250, 116, 193, 251, 116, 192, 250, 119, 193, 250, 116, 193, 249, 111, 190, 248, 98, 176, 239, 71, 137, 192, 62, 120, 182, 29, 40, 37, 23, 26, 6, 27, 29, 13, 26, 29, 19, 21, 22, 20, 22, 22, 19, 45, + 56, 52, 98, 167, 220, 113, 172, 224, 112, 181, 239, 107, 183, 247, 105, 180, 247, 106, 178, 247, 106, 180, 248, 107, 179, 248, 105, 172, 244, 93, 150, 220, 86, 134, 203, 89, 138, 205, 87, 121, 176, 96, 140, 196, 96, 142, 207, 102, 149, 212, 93, 98, 131, 88, 68, 58, 107, 99, 99, 107, 115, 136, 109, 130, 171, 105, 118, 151, 105, 112, 133, 115, 92, 76, 120, 95, 78, 116, 121, 140, 104, 132, 173, 111, 145, 195, 120, 133, 164, 123, 139, 173, 125, 123, 135, 133, 123, 124, 129, 131, 148, 144, 138, 145, 138, 144, 165, 139, 137, 147, 127, 146, 178, 141, 152, 177, 142, 142, 159, 135, 143, 168, 131, 152, 190, 126, 144, 184, 125, 147, 192, 115, 152, 203, 107, 152, 206, 103, 163, 231, 105, 171, 245, 105, 168, 243, 104, 167, 240, 101, 166, 240, 102, 167, 241, 103, 167, 244, 101, 168, + 244, 101, 167, 243, 101, 167, 244, 100, 169, 246, 99, 170, 246, 100, 171, 247, 101, 172, 248, 101, 173, 248, 100, 175, 248, 100, 176, 249, 100, 178, 250, 101, 178, 249, 101, 181, 248, 104, 184, 248, 104, 185, 248, 106, 185, 248, 106, 185, 249, 105, 184, 250, 105, 185, 248, 106, 184, 249, 106, 184, 250, 105, 184, 251, 102, 185, 251, 103, 184, 251, 102, 184, 250, 103, 184, 251, 102, 184, 250, 104, 184, 251, 105, 184, 251, 103, 184, 249, 104, 185, 250, 100, 179, 249, 96, 174, 245, 102, 184, 247, 98, 180, 250, 70, 130, 195, 76, 150, 218, 104, 185, 250, 104, 184, 249, 102, 185, 250, 100, 182, 248, 88, 165, 234, 80, 155, 220, 96, 176, 244, 102, 183, 248, 104, 181, 248, 105, 171, 239, 101, 168, 236, 98, 178, 247, 102, 182, 249, 102, 183, 250, 100, 183, 251, 101, 182, 249, 97, 179, 252, + 84, 90, 73, 88, 87, 50, 89, 93, 60, 84, 86, 56, 65, 63, 29, 58, 56, 16, 48, 48, 12, 31, 32, 11, 31, 33, 10, 40, 43, 21, 47, 61, 48, 70, 140, 186, 99, 180, 240, 110, 190, 250, 113, 191, 250, 114, 191, 251, 115, 190, 251, 111, 190, 250, 102, 181, 248, 95, 171, 230, 80, 125, 163, 72, 144, 218, 72, 126, 173, 72, 108, 126, 51, 86, 110, 32, 70, 114, 47, 52, 47, 48, 49, 32, 87, 114, 120, 93, 170, 220, 107, 187, 241, 117, 193, 247, 116, 193, 248, 116, 193, 249, 114, 192, 249, 116, 192, 250, 117, 192, 250, 116, 192, 250, 116, 192, 250, 117, 193, 251, 119, 192, 250, 120, 193, 251, 118, 194, 247, 118, 195, 248, 121, 197, 248, 88, 160, 224, 38, 65, 78, 29, 32, 10, 34, 36, 15, 39, 38, 19, 31, 32, 22, 26, 25, 21, 34, 35, 26, 88, + 140, 175, 101, 173, 238, 98, 163, 229, 96, 143, 192, 107, 168, 234, 100, 168, 238, 102, 157, 231, 104, 171, 242, 104, 174, 246, 104, 168, 239, 88, 141, 207, 84, 107, 155, 86, 115, 168, 88, 101, 134, 99, 129, 172, 105, 147, 205, 106, 138, 192, 93, 94, 116, 95, 64, 42, 119, 88, 70, 114, 101, 98, 108, 102, 104, 110, 115, 129, 105, 102, 115, 115, 81, 58, 124, 88, 61, 111, 117, 135, 107, 149, 203, 116, 148, 189, 124, 122, 129, 121, 119, 126, 126, 110, 102, 125, 100, 86, 139, 118, 106, 150, 131, 119, 144, 130, 124, 132, 136, 149, 139, 147, 169, 140, 152, 180, 148, 151, 164, 141, 154, 184, 141, 146, 170, 135, 139, 162, 120, 147, 189, 111, 152, 203, 109, 164, 229, 107, 169, 239, 108, 171, 240, 107, 163, 232, 105, 167, 237, 105, 166, 239, 101, 168, 239, 101, 168, 241, 100, 166, + 240, 101, 167, 241, 100, 166, 242, 101, 168, 244, 100, 169, 245, 101, 170, 246, 102, 170, 246, 103, 170, 248, 100, 172, 248, 100, 174, 249, 101, 175, 250, 99, 178, 249, 98, 180, 249, 100, 180, 249, 103, 182, 250, 102, 185, 249, 107, 184, 248, 109, 186, 250, 105, 185, 250, 102, 186, 250, 103, 185, 250, 103, 185, 250, 104, 185, 250, 104, 185, 251, 101, 184, 249, 103, 184, 249, 105, 184, 250, 105, 184, 250, 104, 185, 249, 105, 184, 249, 104, 183, 250, 102, 182, 250, 94, 172, 247, 99, 179, 246, 102, 184, 248, 77, 140, 207, 67, 137, 203, 103, 183, 248, 107, 186, 250, 105, 185, 250, 99, 177, 249, 79, 155, 213, 75, 149, 222, 76, 137, 195, 88, 154, 228, 108, 170, 234, 104, 173, 240, 102, 183, 246, 102, 184, 250, 102, 184, 250, 106, 183, 251, 104, 184, 251, 102, 184, 250, 88, 166, 245, + 85, 85, 49, 90, 87, 39, 67, 68, 31, 57, 55, 19, 43, 40, 8, 64, 62, 20, 48, 55, 35, 46, 71, 73, 63, 108, 134, 86, 153, 197, 95, 171, 228, 101, 179, 240, 112, 191, 249, 112, 190, 249, 111, 190, 250, 111, 190, 250, 114, 190, 250, 113, 189, 250, 101, 178, 246, 107, 185, 246, 89, 159, 217, 89, 133, 168, 91, 150, 197, 63, 119, 187, 42, 59, 59, 29, 35, 24, 38, 53, 52, 54, 64, 61, 84, 131, 177, 91, 157, 219, 101, 167, 220, 107, 168, 221, 107, 178, 238, 109, 187, 249, 111, 189, 250, 113, 190, 249, 111, 189, 249, 110, 187, 249, 111, 189, 250, 111, 187, 249, 112, 185, 248, 110, 183, 247, 107, 183, 246, 109, 180, 245, 116, 170, 226, 75, 122, 164, 40, 45, 19, 33, 36, 10, 44, 44, 20, 43, 42, 26, 33, 34, 26, 31, 30, 23, 80, 98, 114, 119, + 168, 234, 110, 166, 233, 106, 174, 243, 95, 129, 174, 101, 136, 187, 107, 165, 232, 98, 144, 208, 98, 137, 199, 99, 144, 207, 106, 158, 227, 101, 138, 195, 89, 95, 121, 87, 90, 115, 98, 104, 124, 102, 117, 147, 96, 123, 171, 105, 119, 153, 96, 77, 71, 103, 62, 31, 115, 78, 49, 112, 87, 72, 114, 100, 93, 114, 111, 117, 105, 95, 96, 116, 75, 42, 123, 86, 56, 122, 148, 186, 117, 173, 236, 118, 146, 185, 121, 111, 111, 133, 117, 105, 136, 102, 71, 133, 96, 60, 146, 116, 90, 150, 128, 112, 145, 137, 135, 140, 123, 117, 149, 142, 143, 145, 145, 162, 144, 136, 135, 143, 140, 152, 142, 140, 146, 133, 143, 163, 111, 159, 219, 110, 168, 234, 110, 165, 232, 110, 164, 231, 116, 160, 219, 118, 155, 212, 116, 159, 222, 109, 164, 232, 107, 167, 236, 105, 164, 234, 101, 157, + 228, 101, 158, 230, 100, 160, 235, 99, 165, 239, 101, 167, 244, 100, 168, 245, 99, 168, 243, 102, 169, 247, 101, 170, 246, 102, 172, 247, 101, 173, 249, 99, 175, 248, 100, 177, 249, 102, 178, 249, 102, 179, 249, 102, 181, 248, 103, 183, 249, 104, 185, 249, 105, 186, 250, 105, 185, 250, 106, 186, 249, 105, 186, 251, 105, 185, 250, 104, 185, 250, 105, 185, 250, 105, 185, 249, 103, 186, 250, 105, 185, 249, 106, 184, 250, 105, 185, 250, 103, 185, 250, 104, 185, 250, 100, 182, 250, 97, 178, 248, 100, 185, 249, 81, 152, 221, 56, 119, 188, 98, 174, 243, 106, 185, 249, 105, 186, 250, 102, 184, 249, 95, 175, 249, 96, 168, 240, 89, 153, 229, 75, 123, 175, 71, 132, 204, 86, 159, 224, 96, 175, 244, 102, 183, 250, 106, 185, 251, 104, 185, 251, 102, 182, 251, 82, 155, 230, 47, 89, 129, + 76, 75, 42, 89, 86, 39, 48, 48, 16, 52, 53, 27, 59, 64, 44, 89, 95, 52, 86, 159, 213, 101, 180, 246, 110, 190, 249, 114, 192, 248, 116, 191, 249, 114, 191, 248, 112, 191, 250, 109, 185, 248, 107, 185, 249, 113, 190, 250, 115, 191, 251, 113, 189, 250, 102, 176, 245, 97, 176, 246, 109, 186, 246, 85, 149, 213, 88, 108, 99, 76, 80, 48, 44, 49, 23, 85, 139, 161, 79, 154, 222, 75, 130, 183, 61, 95, 125, 60, 87, 105, 77, 112, 130, 83, 98, 93, 82, 112, 131, 79, 133, 185, 77, 141, 209, 76, 142, 213, 67, 133, 201, 61, 126, 188, 62, 127, 196, 62, 133, 210, 69, 142, 223, 77, 153, 234, 89, 165, 242, 117, 171, 236, 130, 169, 211, 57, 68, 56, 40, 42, 8, 42, 42, 10, 50, 50, 27, 44, 43, 26, 36, 36, 23, 54, 47, 32, 133, 140, 156, 135, + 156, 201, 124, 143, 188, 106, 129, 176, 113, 141, 179, 113, 146, 199, 106, 122, 162, 112, 166, 228, 107, 134, 182, 118, 129, 166, 105, 110, 145, 105, 112, 139, 106, 97, 98, 103, 88, 80, 92, 80, 77, 103, 98, 99, 106, 116, 129, 109, 106, 107, 104, 72, 48, 99, 55, 21, 119, 75, 34, 114, 82, 59, 117, 91, 78, 117, 109, 112, 117, 83, 61, 113, 67, 28, 114, 80, 56, 127, 161, 207, 120, 172, 233, 122, 114, 120, 122, 102, 95, 132, 98, 73, 144, 96, 47, 138, 91, 41, 144, 108, 74, 148, 132, 124, 145, 123, 110, 150, 116, 82, 157, 138, 125, 151, 125, 109, 134, 128, 126, 145, 135, 132, 145, 133, 129, 122, 152, 193, 115, 162, 227, 112, 164, 232, 119, 155, 208, 119, 149, 197, 131, 138, 164, 120, 155, 205, 111, 164, 228, 111, 164, 233, 110, 155, 222, 104, 139, 197, 103, 144, + 203, 99, 147, 213, 102, 161, 230, 98, 160, 232, 95, 159, 234, 97, 162, 240, 101, 166, 242, 102, 169, 246, 101, 169, 245, 102, 170, 245, 102, 171, 248, 100, 173, 249, 101, 174, 249, 102, 176, 249, 100, 178, 250, 100, 180, 249, 100, 181, 249, 104, 184, 249, 105, 184, 249, 106, 186, 248, 104, 186, 250, 106, 187, 251, 104, 186, 250, 104, 185, 249, 108, 185, 251, 105, 186, 250, 105, 185, 250, 104, 185, 250, 106, 186, 249, 105, 185, 250, 103, 185, 250, 102, 185, 250, 101, 185, 249, 100, 179, 249, 103, 182, 247, 85, 160, 233, 53, 118, 187, 92, 169, 242, 102, 180, 248, 104, 184, 250, 98, 178, 249, 94, 172, 246, 91, 154, 225, 92, 132, 179, 82, 143, 208, 79, 145, 210, 87, 159, 234, 79, 142, 198, 77, 146, 218, 100, 177, 244, 99, 179, 249, 74, 139, 217, 35, 69, 105, 33, 82, 136, + 59, 62, 35, 73, 82, 53, 67, 123, 164, 78, 123, 155, 86, 99, 97, 100, 131, 122, 110, 187, 249, 114, 190, 248, 114, 191, 249, 115, 191, 249, 114, 190, 248, 114, 190, 251, 114, 191, 249, 104, 176, 241, 109, 186, 246, 114, 190, 251, 113, 191, 251, 115, 191, 250, 105, 179, 245, 95, 174, 247, 91, 168, 241, 43, 84, 138, 35, 45, 38, 85, 102, 76, 89, 124, 130, 97, 164, 212, 99, 171, 234, 96, 170, 240, 82, 147, 212, 70, 136, 193, 69, 132, 191, 80, 152, 217, 85, 161, 220, 82, 155, 217, 77, 149, 212, 70, 142, 204, 63, 132, 190, 51, 111, 160, 53, 116, 174, 55, 119, 181, 57, 121, 185, 61, 126, 186, 70, 133, 185, 87, 128, 172, 77, 99, 107, 45, 49, 11, 47, 49, 16, 51, 51, 18, 50, 49, 28, 43, 41, 28, 40, 35, 24, 98, 74, 48, 134, 115, 99, 126, + 119, 117, 105, 104, 110, 98, 96, 98, 110, 115, 124, 109, 123, 148, 110, 109, 120, 121, 103, 98, 118, 115, 122, 125, 117, 117, 126, 114, 109, 125, 99, 85, 132, 96, 66, 129, 94, 68, 117, 82, 57, 105, 91, 87, 116, 116, 128, 114, 98, 93, 113, 73, 40, 105, 60, 20, 111, 68, 24, 117, 76, 41, 116, 75, 45, 121, 90, 69, 116, 71, 32, 122, 70, 26, 117, 75, 41, 123, 146, 188, 110, 137, 176, 111, 96, 91, 124, 91, 69, 135, 82, 35, 150, 97, 40, 146, 98, 49, 144, 101, 67, 155, 113, 85, 152, 107, 68, 157, 105, 53, 160, 114, 66, 147, 109, 74, 143, 112, 88, 155, 120, 87, 150, 128, 112, 127, 144, 173, 123, 143, 186, 132, 142, 164, 139, 138, 150, 144, 133, 135, 133, 140, 165, 122, 153, 207, 117, 156, 215, 116, 134, 172, 115, 115, 130, 109, 121, 155, 102, 134, + 187, 101, 150, 215, 100, 155, 226, 99, 160, 229, 97, 161, 235, 99, 165, 238, 100, 168, 242, 101, 168, 246, 100, 169, 246, 100, 169, 246, 102, 169, 247, 101, 170, 249, 101, 172, 249, 101, 173, 249, 100, 175, 250, 100, 177, 250, 101, 179, 250, 100, 181, 248, 103, 182, 249, 103, 184, 249, 107, 185, 251, 106, 186, 251, 106, 185, 249, 104, 184, 250, 100, 176, 245, 104, 183, 247, 104, 186, 250, 104, 186, 250, 104, 186, 250, 105, 185, 250, 103, 185, 250, 105, 186, 249, 105, 185, 249, 94, 170, 242, 90, 164, 237, 75, 142, 210, 33, 72, 112, 63, 120, 175, 78, 133, 187, 83, 144, 210, 83, 138, 201, 76, 138, 208, 86, 152, 223, 93, 168, 239, 96, 170, 240, 96, 166, 237, 102, 169, 239, 101, 180, 247, 90, 168, 236, 71, 137, 204, 49, 96, 148, 25, 62, 94, 49, 115, 179, 88, 167, 239, + 58, 115, 164, 65, 107, 121, 86, 130, 144, 70, 108, 138, 93, 94, 46, 93, 137, 156, 103, 175, 239, 101, 176, 246, 96, 175, 247, 104, 185, 249, 113, 191, 248, 114, 192, 250, 111, 188, 247, 100, 167, 227, 109, 188, 247, 116, 192, 249, 116, 192, 251, 116, 192, 250, 106, 183, 245, 66, 136, 207, 23, 56, 97, 29, 43, 45, 81, 135, 164, 99, 181, 242, 88, 134, 168, 93, 123, 135, 102, 178, 241, 102, 183, 249, 102, 177, 244, 109, 189, 247, 92, 173, 237, 78, 144, 206, 94, 168, 229, 109, 184, 243, 111, 189, 248, 109, 188, 248, 97, 178, 247, 94, 173, 242, 105, 185, 248, 104, 187, 248, 103, 186, 248, 102, 185, 247, 94, 176, 244, 75, 135, 193, 53, 61, 33, 54, 56, 8, 51, 52, 13, 47, 44, 11, 55, 51, 28, 50, 45, 30, 76, 62, 35, 125, 103, 61, 117, 93, 56, 114, + 98, 74, 107, 90, 64, 95, 77, 56, 115, 94, 75, 121, 97, 78, 127, 101, 81, 137, 99, 69, 141, 102, 71, 133, 111, 99, 134, 118, 111, 143, 106, 80, 151, 100, 54, 154, 102, 54, 139, 90, 48, 117, 80, 50, 113, 106, 110, 126, 94, 74, 113, 66, 25, 113, 64, 21, 120, 72, 28, 110, 65, 24, 112, 65, 28, 123, 75, 34, 133, 78, 27, 124, 66, 22, 137, 81, 37, 123, 124, 136, 104, 104, 114, 106, 93, 90, 113, 64, 32, 146, 87, 25, 151, 93, 31, 149, 91, 36, 140, 93, 49, 160, 105, 48, 158, 101, 43, 165, 106, 43, 148, 100, 41, 138, 97, 66, 147, 107, 74, 152, 121, 95, 142, 141, 148, 132, 140, 165, 143, 136, 145, 151, 129, 115, 161, 125, 102, 152, 124, 108, 128, 143, 174, 137, 142, 168, 138, 124, 129, 127, 107, 99, 114, 112, 127, 110, 141, 192, 107, 156, + 218, 103, 155, 223, 101, 158, 227, 102, 160, 231, 102, 166, 238, 103, 168, 242, 102, 169, 243, 103, 169, 247, 102, 168, 246, 102, 168, 246, 101, 169, 246, 100, 170, 247, 101, 170, 247, 104, 171, 248, 103, 172, 251, 99, 175, 249, 101, 176, 250, 102, 178, 250, 101, 180, 248, 102, 182, 249, 104, 183, 250, 105, 186, 251, 106, 186, 249, 102, 181, 250, 94, 165, 231, 100, 178, 243, 106, 185, 250, 104, 186, 250, 103, 186, 249, 105, 185, 250, 106, 185, 250, 106, 185, 249, 107, 184, 249, 92, 171, 242, 88, 163, 231, 75, 148, 217, 32, 71, 104, 58, 132, 203, 86, 158, 229, 87, 163, 236, 91, 165, 237, 90, 165, 237, 104, 184, 248, 100, 181, 249, 100, 181, 248, 103, 178, 249, 98, 160, 232, 91, 168, 241, 79, 153, 223, 43, 86, 123, 27, 63, 94, 47, 105, 161, 75, 151, 223, 99, 182, 248, + 64, 134, 203, 54, 101, 128, 92, 118, 96, 88, 102, 88, 81, 87, 41, 77, 114, 115, 93, 146, 188, 84, 152, 215, 90, 162, 227, 105, 182, 249, 117, 192, 247, 117, 192, 249, 109, 184, 244, 104, 164, 216, 112, 190, 248, 116, 192, 250, 114, 192, 249, 105, 184, 244, 54, 107, 168, 15, 29, 37, 46, 69, 75, 97, 173, 230, 112, 187, 249, 116, 196, 249, 105, 182, 242, 78, 122, 160, 108, 153, 189, 109, 187, 247, 108, 187, 249, 106, 183, 249, 113, 191, 248, 103, 183, 245, 90, 167, 233, 88, 152, 211, 93, 156, 215, 99, 164, 230, 104, 176, 247, 96, 175, 246, 95, 168, 241, 114, 190, 249, 106, 186, 248, 117, 193, 248, 119, 195, 249, 67, 122, 167, 61, 64, 22, 77, 78, 27, 66, 65, 21, 47, 42, 11, 56, 52, 32, 60, 49, 29, 113, 89, 56, 115, 88, 60, 118, 95, 67, 112, + 91, 62, 107, 80, 53, 100, 70, 46, 120, 84, 58, 135, 93, 60, 135, 95, 62, 147, 104, 73, 149, 99, 56, 159, 108, 61, 142, 100, 68, 146, 106, 78, 150, 96, 49, 151, 89, 33, 168, 111, 50, 148, 95, 44, 100, 67, 48, 126, 87, 56, 122, 69, 27, 116, 61, 16, 121, 63, 17, 124, 70, 25, 127, 71, 27, 112, 59, 19, 129, 69, 19, 128, 69, 17, 147, 89, 31, 136, 95, 60, 101, 81, 69, 96, 67, 44, 90, 44, 12, 156, 89, 26, 153, 92, 35, 149, 85, 28, 147, 88, 30, 162, 95, 32, 147, 87, 33, 163, 101, 40, 158, 102, 43, 142, 95, 50, 151, 104, 57, 140, 120, 105, 138, 131, 134, 152, 130, 114, 159, 122, 93, 167, 124, 83, 164, 122, 82, 145, 120, 103, 146, 115, 95, 151, 108, 72, 138, 103, 76, 133, 123, 126, 111, 139, 183, 108, 154, 220, 104, 144, + 206, 103, 151, 217, 105, 165, 237, 106, 169, 243, 104, 168, 242, 102, 168, 244, 102, 167, 243, 103, 167, 241, 102, 168, 245, 102, 169, 246, 101, 169, 244, 102, 169, 247, 101, 170, 247, 102, 169, 247, 103, 171, 247, 103, 172, 247, 101, 173, 249, 105, 173, 250, 101, 177, 249, 101, 180, 249, 101, 180, 249, 104, 182, 251, 104, 184, 250, 104, 185, 251, 95, 168, 236, 100, 175, 237, 110, 185, 250, 109, 186, 250, 107, 187, 250, 107, 187, 250, 109, 185, 250, 109, 185, 250, 107, 185, 250, 106, 185, 249, 108, 186, 249, 95, 173, 246, 50, 107, 161, 78, 159, 230, 108, 186, 248, 106, 186, 250, 102, 181, 249, 98, 173, 241, 104, 185, 247, 105, 187, 250, 101, 179, 248, 109, 187, 247, 92, 168, 239, 59, 112, 182, 30, 59, 89, 36, 96, 154, 80, 162, 231, 99, 181, 248, 79, 151, 221, 77, 158, 230, + 53, 115, 169, 55, 91, 90, 91, 105, 80, 109, 107, 57, 77, 106, 97, 90, 149, 179, 107, 186, 248, 100, 174, 233, 96, 170, 242, 105, 182, 249, 110, 188, 248, 110, 185, 248, 104, 170, 234, 114, 177, 229, 119, 192, 247, 113, 190, 249, 89, 157, 221, 45, 82, 119, 41, 53, 54, 56, 97, 121, 70, 127, 173, 95, 164, 228, 104, 178, 246, 116, 194, 248, 115, 192, 248, 96, 169, 238, 75, 111, 148, 94, 139, 174, 111, 185, 244, 109, 188, 247, 114, 191, 250, 119, 193, 249, 116, 193, 249, 112, 191, 249, 109, 186, 248, 100, 177, 240, 91, 162, 229, 87, 151, 218, 92, 161, 235, 94, 154, 217, 99, 149, 187, 103, 170, 228, 93, 154, 209, 57, 68, 50, 55, 56, 3, 67, 64, 16, 46, 43, 10, 57, 49, 15, 65, 56, 32, 86, 67, 39, 131, 106, 66, 124, 97, 58, 114, 81, 43, 114, + 77, 37, 122, 82, 43, 123, 85, 47, 117, 78, 42, 122, 79, 41, 129, 82, 41, 144, 94, 55, 154, 104, 60, 157, 99, 45, 163, 106, 51, 156, 102, 56, 157, 100, 52, 154, 94, 35, 166, 103, 42, 169, 109, 49, 151, 95, 42, 134, 80, 35, 145, 87, 33, 121, 66, 20, 127, 70, 22, 121, 68, 20, 120, 67, 19, 128, 73, 25, 122, 64, 15, 136, 72, 21, 145, 85, 27, 155, 100, 46, 105, 81, 64, 82, 47, 23, 121, 68, 26, 155, 92, 33, 153, 92, 30, 164, 100, 33, 131, 76, 20, 138, 83, 25, 162, 105, 45, 162, 100, 45, 162, 109, 48, 145, 95, 40, 149, 110, 73, 140, 116, 102, 150, 111, 77, 167, 121, 73, 170, 115, 61, 169, 116, 63, 158, 104, 51, 148, 94, 46, 148, 95, 47, 146, 106, 72, 134, 116, 108, 121, 137, 168, 110, 140, 190, 106, 144, 203, 110, 162, + 226, 109, 168, 238, 108, 172, 244, 106, 170, 242, 103, 165, 237, 103, 163, 235, 101, 162, 236, 99, 162, 232, 103, 167, 243, 102, 169, 246, 103, 169, 243, 102, 169, 245, 103, 168, 244, 103, 169, 246, 102, 170, 247, 101, 172, 246, 102, 171, 248, 104, 172, 249, 102, 175, 249, 102, 177, 248, 100, 180, 249, 101, 181, 250, 104, 182, 250, 104, 183, 250, 98, 172, 241, 98, 173, 237, 110, 186, 250, 107, 187, 250, 107, 187, 250, 107, 186, 250, 110, 186, 250, 109, 186, 251, 108, 186, 251, 107, 186, 250, 109, 187, 249, 95, 176, 247, 51, 110, 164, 76, 157, 229, 107, 187, 249, 107, 187, 250, 104, 184, 250, 99, 173, 245, 106, 182, 246, 108, 187, 248, 100, 180, 249, 89, 165, 237, 57, 105, 154, 22, 48, 75, 37, 94, 152, 92, 170, 235, 109, 189, 248, 110, 188, 250, 96, 176, 245, 67, 132, 198, + 49, 94, 121, 56, 77, 50, 95, 95, 64, 94, 108, 92, 74, 102, 94, 96, 163, 210, 110, 186, 248, 108, 187, 249, 106, 181, 246, 101, 170, 239, 92, 158, 209, 91, 149, 191, 106, 143, 164, 111, 177, 227, 111, 187, 245, 71, 132, 192, 43, 57, 63, 53, 68, 60, 95, 165, 208, 108, 188, 248, 100, 181, 245, 69, 132, 198, 75, 131, 191, 103, 181, 246, 113, 191, 248, 107, 180, 247, 82, 161, 228, 63, 106, 136, 90, 135, 170, 111, 183, 243, 116, 193, 250, 119, 193, 250, 119, 194, 251, 119, 194, 251, 119, 194, 250, 109, 187, 248, 101, 179, 246, 102, 180, 248, 115, 191, 250, 95, 173, 229, 87, 152, 177, 85, 152, 203, 80, 87, 74, 82, 75, 29, 65, 59, 15, 49, 41, 7, 45, 33, 12, 73, 57, 25, 85, 64, 32, 109, 81, 43, 108, 79, 39, 103, 76, 36, 106, 77, 38, 114, + 76, 33, 123, 77, 30, 141, 90, 35, 134, 87, 43, 117, 73, 33, 113, 63, 24, 123, 67, 23, 149, 94, 43, 162, 109, 55, 163, 100, 44, 170, 109, 46, 153, 96, 38, 160, 99, 42, 157, 96, 37, 171, 106, 41, 173, 112, 48, 162, 103, 39, 145, 84, 23, 129, 71, 19, 132, 71, 16, 136, 75, 23, 118, 65, 17, 122, 62, 19, 126, 66, 19, 135, 71, 13, 136, 72, 19, 156, 94, 33, 141, 94, 46, 66, 31, 12, 122, 68, 21, 169, 103, 39, 168, 101, 33, 159, 94, 25, 149, 94, 37, 166, 102, 40, 169, 106, 41, 170, 110, 44, 158, 105, 44, 152, 98, 48, 149, 97, 49, 146, 95, 43, 172, 120, 64, 181, 121, 57, 168, 108, 43, 143, 85, 33, 128, 67, 20, 146, 83, 28, 155, 103, 57, 134, 106, 89, 120, 127, 151, 117, 126, 155, 115, 156, 209, 114, 165, 227, 111, 169, + 236, 110, 169, 238, 107, 157, 223, 106, 147, 207, 102, 144, 210, 100, 153, 222, 101, 156, 222, 102, 158, 221, 102, 165, 239, 101, 164, 240, 102, 167, 241, 102, 165, 236, 102, 166, 237, 103, 169, 243, 101, 169, 246, 103, 171, 244, 102, 170, 246, 103, 171, 248, 102, 173, 249, 100, 176, 249, 102, 176, 249, 101, 179, 249, 103, 180, 250, 103, 181, 249, 97, 174, 245, 96, 169, 237, 105, 182, 248, 106, 185, 249, 109, 187, 250, 109, 187, 251, 106, 187, 250, 106, 186, 249, 108, 186, 250, 109, 187, 251, 107, 188, 249, 97, 177, 247, 56, 112, 170, 75, 156, 226, 108, 187, 250, 109, 189, 251, 107, 188, 249, 100, 178, 249, 105, 181, 247, 102, 180, 249, 75, 140, 210, 40, 73, 110, 20, 53, 80, 55, 122, 197, 75, 149, 226, 94, 169, 238, 110, 188, 248, 111, 188, 250, 104, 186, 249, 82, 155, 225, + 45, 76, 78, 34, 42, 18, 65, 70, 52, 74, 112, 123, 87, 121, 106, 98, 173, 234, 105, 183, 249, 101, 181, 246, 85, 152, 204, 84, 120, 120, 92, 113, 73, 95, 137, 135, 107, 150, 172, 81, 147, 217, 35, 76, 121, 30, 42, 46, 75, 118, 136, 106, 182, 233, 114, 193, 249, 115, 192, 249, 114, 192, 248, 100, 172, 242, 87, 153, 222, 80, 155, 227, 90, 163, 231, 103, 180, 246, 107, 185, 249, 88, 164, 228, 73, 129, 180, 85, 120, 153, 104, 170, 225, 118, 192, 250, 119, 194, 250, 117, 194, 249, 118, 192, 248, 108, 185, 247, 93, 162, 223, 92, 161, 211, 101, 179, 243, 92, 167, 227, 71, 125, 138, 77, 105, 103, 81, 79, 27, 79, 69, 27, 91, 69, 31, 100, 71, 30, 96, 65, 30, 94, 65, 31, 94, 65, 29, 100, 74, 30, 102, 73, 30, 104, 73, 36, 96, 65, 27, 97, + 59, 22, 108, 60, 21, 122, 70, 21, 137, 80, 26, 138, 83, 30, 106, 59, 18, 101, 53, 12, 124, 67, 19, 153, 97, 42, 161, 104, 50, 166, 103, 44, 163, 100, 37, 149, 88, 30, 162, 98, 37, 161, 97, 37, 165, 97, 32, 167, 100, 36, 162, 101, 37, 149, 84, 25, 135, 71, 17, 155, 88, 27, 149, 85, 23, 134, 74, 22, 120, 58, 13, 136, 73, 22, 142, 77, 21, 151, 87, 33, 172, 105, 33, 88, 45, 13, 111, 63, 25, 158, 91, 28, 173, 104, 31, 159, 90, 27, 155, 93, 31, 163, 98, 36, 159, 94, 29, 172, 112, 46, 165, 109, 50, 161, 105, 47, 149, 94, 38, 174, 117, 53, 180, 118, 49, 174, 108, 44, 136, 80, 29, 119, 63, 16, 140, 77, 22, 143, 81, 29, 140, 85, 44, 125, 91, 70, 120, 106, 103, 125, 137, 169, 123, 150, 202, 120, 154, 206, 116, 143, + 186, 119, 130, 158, 119, 124, 151, 109, 138, 187, 106, 160, 227, 104, 162, 232, 99, 154, 219, 98, 156, 221, 98, 158, 225, 101, 159, 227, 102, 159, 224, 102, 155, 213, 101, 160, 229, 102, 168, 242, 102, 168, 243, 103, 169, 246, 102, 170, 246, 103, 172, 246, 102, 172, 248, 101, 173, 249, 101, 174, 249, 102, 176, 250, 103, 178, 248, 104, 180, 249, 96, 165, 237, 91, 150, 215, 100, 175, 246, 102, 178, 249, 104, 183, 247, 108, 187, 251, 107, 188, 250, 108, 187, 250, 108, 187, 250, 109, 187, 251, 111, 188, 249, 98, 177, 247, 54, 111, 170, 78, 156, 226, 110, 189, 250, 112, 189, 251, 110, 189, 249, 103, 182, 251, 93, 163, 236, 65, 125, 177, 31, 48, 59, 25, 63, 102, 70, 142, 210, 100, 181, 248, 92, 166, 238, 83, 152, 221, 105, 182, 245, 112, 189, 249, 112, 190, 249, 102, 182, 249, + 69, 76, 48, 67, 67, 34, 77, 126, 155, 68, 103, 95, 84, 144, 171, 83, 151, 209, 84, 149, 203, 78, 134, 164, 77, 107, 82, 90, 119, 80, 101, 160, 186, 93, 166, 229, 72, 118, 159, 38, 54, 72, 40, 56, 57, 90, 148, 181, 113, 191, 247, 116, 192, 249, 116, 192, 250, 117, 192, 250, 116, 192, 249, 107, 185, 247, 100, 173, 246, 106, 181, 247, 94, 173, 241, 84, 154, 227, 94, 168, 235, 109, 187, 247, 92, 169, 231, 63, 112, 148, 72, 107, 123, 101, 165, 218, 111, 190, 248, 109, 187, 249, 105, 182, 246, 99, 177, 247, 85, 149, 208, 70, 114, 140, 79, 130, 172, 74, 126, 179, 75, 98, 95, 85, 79, 35, 89, 76, 23, 92, 74, 29, 95, 74, 33, 107, 69, 29, 129, 83, 35, 134, 87, 38, 129, 87, 35, 120, 80, 34, 107, 72, 27, 103, 69, 29, 100, 63, 27, 97, + 61, 25, 100, 58, 20, 111, 61, 19, 134, 77, 27, 150, 88, 32, 148, 90, 33, 110, 62, 18, 112, 59, 19, 122, 65, 17, 158, 97, 41, 160, 97, 39, 162, 98, 36, 152, 88, 31, 152, 89, 30, 150, 82, 26, 161, 92, 29, 159, 90, 29, 157, 90, 28, 153, 85, 23, 157, 92, 33, 150, 81, 21, 170, 96, 29, 161, 91, 27, 140, 73, 18, 120, 58, 14, 147, 82, 22, 141, 76, 21, 166, 97, 27, 157, 102, 41, 124, 68, 23, 150, 78, 15, 173, 104, 32, 150, 84, 23, 149, 84, 25, 167, 101, 34, 162, 97, 31, 167, 105, 41, 158, 103, 46, 150, 100, 40, 172, 111, 45, 178, 114, 42, 173, 110, 42, 119, 63, 19, 94, 44, 6, 128, 70, 22, 153, 91, 34, 163, 104, 42, 165, 107, 42, 170, 115, 62, 168, 119, 80, 158, 110, 75, 152, 112, 89, 139, 100, 74, 136, 103, + 88, 122, 111, 113, 110, 134, 169, 108, 158, 224, 110, 168, 236, 107, 162, 226, 101, 147, 201, 98, 138, 189, 97, 137, 188, 97, 152, 212, 99, 148, 196, 98, 148, 201, 103, 164, 236, 105, 168, 245, 103, 169, 247, 103, 168, 244, 102, 169, 247, 103, 169, 247, 102, 170, 247, 100, 172, 247, 101, 173, 249, 103, 173, 250, 102, 176, 249, 101, 175, 247, 95, 161, 231, 87, 148, 210, 100, 180, 245, 104, 183, 249, 108, 177, 247, 109, 183, 247, 108, 187, 251, 110, 188, 251, 109, 188, 249, 110, 188, 250, 111, 189, 249, 98, 176, 247, 53, 110, 165, 79, 158, 229, 112, 189, 249, 112, 189, 249, 109, 188, 249, 96, 169, 236, 66, 104, 140, 34, 50, 55, 43, 96, 141, 81, 156, 227, 100, 180, 245, 108, 189, 250, 97, 176, 248, 92, 167, 239, 98, 171, 239, 112, 189, 248, 113, 190, 250, 111, 190, 250, + 116, 107, 46, 98, 131, 144, 69, 121, 149, 64, 85, 40, 76, 107, 90, 60, 87, 64, 47, 75, 35, 61, 83, 45, 74, 129, 155, 98, 163, 222, 110, 175, 242, 89, 128, 162, 74, 75, 49, 76, 93, 87, 101, 175, 231, 109, 188, 248, 106, 184, 246, 109, 188, 249, 114, 193, 249, 117, 192, 250, 116, 192, 250, 114, 191, 250, 103, 178, 246, 104, 179, 249, 114, 193, 249, 110, 187, 247, 79, 156, 225, 77, 142, 201, 94, 170, 237, 104, 182, 246, 92, 170, 232, 70, 117, 146, 95, 155, 207, 108, 187, 249, 101, 180, 247, 92, 169, 243, 82, 137, 197, 66, 116, 149, 66, 94, 104, 76, 101, 122, 92, 84, 55, 96, 71, 32, 101, 70, 24, 110, 70, 26, 119, 72, 30, 119, 71, 26, 134, 85, 36, 131, 80, 30, 138, 84, 31, 139, 88, 34, 147, 97, 42, 140, 94, 42, 108, 66, 27, 88, + 53, 18, 92, 53, 18, 84, 42, 12, 86, 41, 7, 123, 68, 22, 156, 96, 35, 168, 110, 49, 132, 78, 29, 116, 63, 20, 133, 75, 23, 160, 97, 36, 159, 96, 32, 152, 89, 30, 141, 76, 20, 155, 88, 29, 152, 83, 23, 166, 97, 32, 145, 74, 17, 150, 79, 20, 153, 83, 22, 143, 73, 12, 144, 72, 10, 167, 97, 26, 139, 70, 18, 131, 64, 11, 146, 78, 19, 149, 80, 19, 156, 86, 28, 169, 100, 34, 125, 66, 17, 151, 79, 17, 174, 97, 28, 182, 109, 35, 154, 86, 24, 166, 97, 29, 170, 106, 37, 165, 110, 52, 157, 100, 41, 169, 111, 44, 184, 123, 51, 155, 96, 42, 131, 79, 27, 67, 27, 1, 148, 89, 27, 171, 109, 42, 187, 117, 43, 180, 112, 42, 184, 118, 46, 183, 118, 49, 171, 105, 46, 159, 95, 41, 149, 87, 39, 140, 88, 43, 133, 92, + 65, 117, 101, 96, 117, 112, 120, 127, 128, 147, 127, 134, 158, 113, 120, 141, 114, 118, 130, 105, 130, 160, 99, 143, 190, 98, 145, 196, 100, 143, 179, 102, 155, 215, 106, 170, 242, 103, 171, 244, 104, 170, 245, 103, 169, 245, 101, 169, 245, 103, 169, 243, 102, 169, 247, 102, 170, 247, 103, 171, 248, 104, 171, 248, 103, 172, 249, 102, 169, 244, 96, 162, 232, 93, 151, 207, 92, 158, 224, 104, 183, 248, 108, 178, 248, 108, 178, 244, 109, 187, 248, 111, 189, 250, 110, 188, 250, 109, 189, 250, 109, 189, 249, 95, 173, 244, 50, 104, 151, 84, 162, 228, 115, 191, 248, 110, 190, 250, 91, 163, 229, 65, 93, 113, 39, 58, 66, 52, 113, 174, 94, 172, 237, 106, 188, 250, 100, 178, 247, 112, 190, 250, 102, 184, 249, 102, 183, 250, 95, 168, 239, 105, 183, 241, 110, 190, 251, 90, 164, 233, + 103, 106, 52, 74, 114, 118, 68, 95, 70, 83, 130, 138, 88, 136, 164, 59, 99, 116, 42, 61, 29, 66, 86, 61, 83, 122, 127, 94, 119, 112, 110, 121, 99, 90, 87, 41, 88, 103, 73, 103, 149, 172, 98, 162, 209, 98, 161, 214, 102, 168, 223, 107, 181, 245, 112, 191, 249, 115, 191, 249, 114, 192, 249, 113, 192, 249, 108, 184, 247, 105, 167, 238, 112, 189, 248, 116, 193, 249, 112, 189, 248, 89, 169, 235, 94, 169, 235, 95, 169, 234, 88, 163, 233, 69, 142, 213, 65, 105, 136, 86, 141, 181, 87, 156, 221, 85, 144, 204, 93, 148, 205, 88, 122, 155, 96, 98, 94, 102, 96, 73, 116, 91, 44, 113, 81, 29, 108, 73, 24, 108, 68, 24, 118, 75, 28, 123, 77, 28, 130, 82, 30, 137, 87, 35, 141, 89, 33, 124, 73, 24, 117, 66, 19, 122, 70, 20, 136, 81, 32, 126, + 79, 30, 109, 65, 21, 102, 60, 18, 98, 56, 18, 101, 55, 14, 121, 65, 14, 150, 89, 26, 167, 107, 41, 158, 98, 37, 136, 80, 27, 135, 75, 21, 156, 91, 30, 152, 86, 25, 137, 71, 18, 145, 78, 21, 146, 79, 18, 161, 89, 20, 166, 92, 22, 152, 79, 20, 134, 63, 8, 138, 67, 8, 132, 62, 7, 157, 87, 25, 159, 90, 28, 125, 58, 7, 126, 62, 8, 140, 72, 12, 156, 86, 27, 158, 84, 20, 149, 89, 35, 139, 71, 9, 165, 89, 21, 186, 115, 40, 159, 92, 29, 163, 91, 16, 162, 95, 29, 162, 99, 39, 168, 106, 42, 171, 105, 39, 162, 94, 29, 124, 70, 23, 73, 37, 9, 156, 93, 31, 178, 109, 36, 188, 120, 45, 184, 116, 44, 179, 112, 40, 166, 102, 36, 160, 101, 44, 155, 94, 37, 159, 97, 38, 156, 94, 35, 161, 101, 42, 159, 105, + 52, 155, 101, 54, 152, 97, 52, 145, 94, 56, 132, 96, 71, 117, 103, 99, 112, 110, 114, 105, 122, 150, 105, 141, 186, 101, 134, 169, 95, 129, 159, 97, 153, 217, 107, 171, 244, 106, 171, 244, 105, 169, 244, 103, 169, 245, 103, 169, 245, 101, 170, 244, 103, 169, 246, 103, 169, 247, 103, 170, 247, 104, 171, 248, 103, 172, 248, 102, 168, 240, 99, 167, 239, 100, 169, 240, 93, 149, 200, 99, 166, 228, 107, 180, 249, 106, 173, 242, 107, 184, 247, 110, 188, 249, 113, 189, 249, 112, 190, 249, 111, 192, 250, 94, 173, 243, 52, 108, 158, 89, 167, 233, 106, 185, 248, 84, 147, 205, 59, 88, 98, 51, 86, 105, 72, 139, 200, 95, 173, 244, 101, 180, 247, 111, 191, 249, 101, 178, 248, 109, 187, 246, 106, 186, 249, 108, 188, 248, 98, 176, 246, 89, 166, 239, 76, 139, 199, 44, 72, 95, + 81, 91, 48, 102, 117, 63, 100, 134, 103, 106, 172, 240, 109, 154, 196, 87, 132, 165, 84, 112, 113, 83, 106, 100, 79, 79, 38, 60, 57, 16, 75, 76, 34, 121, 125, 88, 108, 146, 162, 98, 159, 212, 98, 168, 238, 100, 175, 242, 105, 182, 245, 109, 188, 248, 112, 192, 248, 113, 192, 249, 113, 192, 249, 115, 192, 250, 111, 189, 247, 93, 158, 231, 106, 183, 247, 115, 193, 249, 117, 194, 250, 116, 194, 250, 116, 194, 250, 116, 195, 249, 118, 194, 248, 113, 192, 250, 96, 176, 241, 75, 126, 165, 96, 133, 160, 101, 169, 236, 97, 164, 227, 85, 142, 193, 92, 101, 94, 116, 93, 42, 134, 94, 36, 139, 98, 44, 142, 99, 46, 134, 91, 38, 122, 75, 28, 115, 69, 25, 117, 71, 22, 129, 81, 31, 137, 89, 39, 140, 92, 37, 129, 78, 27, 130, 77, 25, 120, 64, 18, 119, + 67, 20, 134, 81, 32, 124, 72, 23, 108, 62, 14, 130, 81, 33, 142, 87, 31, 136, 72, 18, 151, 85, 25, 161, 94, 31, 178, 112, 40, 152, 94, 31, 109, 51, 12, 142, 81, 27, 144, 79, 23, 136, 69, 12, 143, 70, 14, 155, 81, 18, 158, 81, 13, 157, 85, 18, 159, 89, 25, 122, 54, 7, 137, 63, 9, 152, 82, 20, 167, 100, 36, 128, 64, 14, 132, 71, 22, 136, 69, 12, 156, 85, 22, 143, 71, 8, 129, 65, 12, 128, 61, 6, 158, 79, 14, 185, 111, 33, 157, 87, 21, 161, 84, 16, 161, 92, 27, 166, 100, 35, 167, 98, 30, 167, 94, 29, 144, 80, 19, 69, 31, 5, 168, 106, 29, 182, 108, 35, 187, 118, 45, 189, 119, 46, 181, 107, 36, 182, 111, 39, 173, 113, 43, 173, 107, 43, 172, 106, 45, 161, 95, 33, 172, 104, 42, 171, 105, 40, 169, 104, + 42, 161, 99, 40, 155, 95, 42, 140, 95, 58, 125, 91, 70, 114, 87, 72, 114, 97, 88, 116, 114, 121, 113, 117, 135, 102, 105, 108, 96, 114, 124, 96, 143, 204, 104, 162, 231, 108, 172, 246, 106, 170, 244, 104, 167, 243, 104, 169, 244, 103, 169, 245, 103, 169, 245, 103, 169, 246, 103, 169, 246, 104, 171, 246, 104, 171, 246, 99, 166, 238, 100, 168, 239, 102, 175, 248, 99, 172, 239, 96, 143, 189, 99, 167, 237, 104, 172, 243, 104, 181, 247, 108, 185, 249, 110, 188, 248, 108, 190, 248, 112, 191, 249, 95, 171, 241, 49, 110, 163, 79, 156, 232, 72, 129, 182, 43, 67, 72, 52, 107, 150, 88, 170, 235, 111, 189, 248, 108, 187, 251, 99, 179, 247, 115, 191, 248, 101, 181, 249, 105, 180, 242, 109, 189, 249, 108, 188, 247, 95, 173, 240, 55, 100, 148, 25, 52, 73, 51, 114, 174, + 78, 88, 42, 87, 95, 24, 91, 137, 150, 105, 145, 174, 119, 140, 141, 100, 132, 152, 104, 110, 78, 93, 88, 35, 90, 88, 35, 94, 139, 154, 63, 119, 171, 113, 132, 131, 103, 151, 183, 97, 152, 194, 103, 163, 215, 104, 178, 244, 112, 188, 249, 117, 192, 249, 117, 191, 250, 114, 193, 250, 114, 193, 250, 113, 192, 249, 113, 191, 249, 98, 177, 244, 108, 186, 249, 117, 193, 249, 116, 193, 251, 117, 193, 250, 117, 194, 250, 117, 195, 249, 119, 194, 251, 121, 194, 248, 119, 194, 248, 109, 186, 243, 80, 142, 192, 96, 134, 162, 106, 159, 210, 101, 136, 170, 109, 105, 81, 114, 95, 36, 119, 90, 35, 132, 90, 40, 135, 90, 37, 142, 95, 38, 150, 101, 41, 144, 95, 39, 133, 86, 36, 117, 70, 25, 102, 57, 17, 104, 57, 18, 118, 71, 23, 131, 82, 29, 138, 84, 31, 135, + 82, 30, 139, 85, 33, 141, 86, 33, 129, 76, 24, 108, 63, 18, 90, 46, 11, 114, 65, 25, 146, 83, 24, 156, 89, 29, 159, 96, 30, 180, 116, 45, 164, 102, 37, 102, 47, 14, 110, 54, 13, 126, 64, 13, 154, 83, 20, 139, 68, 11, 143, 69, 11, 153, 79, 16, 146, 74, 16, 131, 65, 13, 129, 60, 10, 146, 77, 14, 155, 90, 28, 146, 78, 21, 128, 64, 11, 129, 64, 9, 137, 66, 12, 140, 71, 14, 143, 70, 11, 134, 65, 8, 150, 73, 11, 160, 83, 16, 155, 82, 19, 147, 72, 4, 165, 88, 21, 164, 93, 28, 158, 86, 21, 154, 83, 19, 117, 66, 20, 161, 90, 25, 186, 108, 32, 189, 113, 38, 188, 113, 38, 187, 113, 37, 180, 109, 35, 164, 95, 29, 164, 96, 36, 168, 101, 39, 170, 107, 45, 179, 114, 53, 169, 105, 43, 166, 102, 39, 158, 95, + 35, 167, 105, 43, 173, 113, 49, 173, 112, 49, 171, 112, 56, 159, 105, 56, 154, 103, 58, 149, 103, 70, 143, 103, 71, 133, 99, 71, 115, 103, 99, 103, 133, 180, 106, 153, 218, 102, 160, 228, 104, 162, 229, 106, 167, 235, 105, 169, 242, 104, 170, 245, 105, 170, 244, 105, 170, 246, 104, 170, 246, 104, 170, 244, 102, 171, 245, 104, 166, 236, 99, 164, 236, 103, 174, 248, 103, 174, 245, 96, 153, 206, 87, 131, 166, 97, 163, 236, 104, 180, 248, 106, 184, 250, 109, 186, 250, 110, 189, 248, 112, 191, 248, 86, 159, 227, 33, 69, 100, 37, 73, 105, 42, 75, 92, 64, 129, 185, 99, 178, 237, 114, 191, 248, 117, 192, 248, 114, 192, 249, 102, 182, 250, 108, 184, 245, 104, 185, 250, 99, 180, 246, 110, 190, 248, 94, 171, 242, 54, 95, 133, 23, 52, 86, 60, 127, 191, 102, 180, 243, + 61, 80, 46, 71, 82, 10, 89, 108, 86, 102, 117, 97, 122, 119, 63, 120, 109, 53, 90, 84, 23, 86, 98, 71, 113, 136, 116, 116, 166, 188, 96, 167, 233, 104, 146, 168, 91, 150, 200, 98, 159, 214, 104, 172, 233, 104, 178, 244, 109, 187, 249, 114, 191, 248, 115, 191, 249, 115, 191, 249, 114, 192, 250, 114, 192, 250, 114, 193, 248, 109, 187, 246, 106, 184, 248, 116, 193, 247, 116, 192, 251, 116, 193, 249, 117, 194, 250, 119, 194, 250, 119, 194, 251, 119, 195, 249, 119, 195, 248, 120, 195, 248, 108, 186, 245, 84, 142, 189, 87, 106, 108, 104, 103, 61, 109, 97, 32, 122, 99, 34, 123, 94, 39, 125, 90, 42, 120, 76, 29, 117, 71, 26, 128, 78, 29, 128, 82, 27, 122, 73, 25, 121, 72, 23, 116, 67, 21, 98, 53, 10, 94, 52, 11, 98, 52, 11, 106, 56, 15, 125, + 71, 22, 138, 79, 28, 145, 86, 31, 154, 95, 40, 149, 89, 34, 130, 77, 26, 100, 51, 15, 103, 56, 17, 133, 74, 22, 147, 83, 25, 156, 91, 28, 160, 93, 29, 162, 102, 42, 99, 50, 15, 96, 42, 4, 142, 75, 19, 147, 74, 15, 143, 71, 14, 130, 61, 9, 144, 71, 12, 140, 72, 18, 95, 39, 5, 134, 61, 10, 166, 91, 19, 151, 76, 13, 149, 77, 16, 128, 60, 7, 148, 72, 12, 154, 80, 13, 149, 80, 13, 153, 82, 14, 162, 87, 23, 157, 81, 15, 143, 72, 15, 139, 64, 7, 165, 89, 21, 151, 79, 15, 146, 75, 14, 130, 71, 15, 154, 84, 19, 174, 98, 23, 183, 105, 31, 178, 103, 31, 186, 114, 36, 178, 105, 32, 153, 83, 28, 148, 82, 23, 161, 88, 29, 166, 98, 35, 149, 82, 22, 152, 87, 26, 150, 83, 22, 154, 87, 26, 148, 83, + 22, 155, 88, 26, 162, 95, 32, 165, 96, 34, 163, 97, 31, 166, 104, 36, 167, 104, 38, 162, 99, 37, 164, 100, 42, 157, 99, 46, 151, 102, 58, 138, 106, 85, 116, 115, 135, 109, 130, 170, 106, 150, 209, 108, 163, 232, 106, 170, 242, 106, 174, 246, 108, 171, 246, 105, 172, 247, 103, 171, 246, 104, 170, 245, 105, 170, 245, 103, 165, 238, 101, 161, 232, 102, 173, 247, 105, 173, 248, 105, 174, 247, 95, 156, 221, 87, 142, 196, 101, 173, 245, 105, 182, 249, 107, 184, 250, 109, 187, 248, 103, 181, 249, 61, 111, 156, 21, 28, 27, 32, 60, 76, 71, 143, 206, 108, 187, 246, 118, 192, 249, 118, 193, 250, 117, 193, 249, 116, 193, 249, 110, 188, 250, 96, 172, 241, 93, 168, 232, 79, 147, 216, 70, 130, 183, 54, 82, 104, 17, 46, 73, 45, 110, 181, 63, 128, 192, 68, 133, 199, + 85, 88, 47, 86, 85, 32, 82, 76, 35, 88, 75, 25, 77, 70, 13, 69, 72, 28, 80, 98, 75, 87, 117, 108, 97, 124, 111, 105, 133, 126, 103, 140, 165, 118, 171, 203, 113, 189, 246, 114, 192, 248, 118, 193, 250, 115, 191, 250, 113, 192, 250, 114, 192, 250, 116, 192, 250, 116, 192, 250, 114, 192, 250, 114, 193, 250, 114, 193, 250, 115, 192, 249, 106, 187, 248, 114, 193, 250, 118, 194, 250, 117, 195, 251, 116, 194, 249, 119, 196, 250, 121, 194, 249, 121, 196, 251, 124, 197, 250, 123, 199, 248, 118, 193, 246, 102, 164, 219, 81, 116, 152, 92, 84, 47, 104, 88, 29, 102, 79, 24, 96, 67, 27, 96, 64, 31, 115, 76, 31, 126, 83, 34, 104, 63, 18, 98, 57, 14, 95, 51, 11, 101, 55, 15, 110, 62, 20, 116, 68, 22, 103, 55, 13, 92, 48, 11, 89, 44, 8, 109, + 55, 13, 130, 68, 19, 155, 91, 31, 160, 93, 34, 161, 93, 30, 171, 104, 39, 179, 110, 48, 180, 111, 40, 182, 113, 39, 173, 104, 35, 174, 105, 33, 160, 93, 29, 159, 92, 29, 156, 94, 35, 80, 39, 11, 84, 34, 6, 136, 62, 7, 158, 80, 15, 151, 76, 12, 151, 84, 23, 133, 65, 9, 131, 65, 15, 101, 43, 8, 164, 90, 24, 153, 81, 24, 158, 85, 19, 144, 73, 17, 134, 61, 7, 152, 76, 10, 147, 77, 19, 156, 80, 12, 173, 99, 25, 168, 93, 30, 124, 56, 11, 138, 68, 17, 150, 80, 18, 156, 86, 22, 117, 51, 1, 135, 66, 5, 173, 97, 24, 176, 98, 22, 173, 96, 17, 177, 101, 25, 166, 91, 21, 134, 64, 12, 173, 102, 34, 174, 103, 31, 175, 102, 32, 172, 98, 28, 169, 98, 31, 156, 85, 24, 151, 80, 19, 143, 75, 18, 141, 73, + 17, 125, 61, 12, 138, 71, 17, 141, 72, 16, 151, 83, 23, 148, 80, 22, 145, 75, 19, 159, 91, 28, 156, 89, 29, 152, 90, 33, 150, 94, 47, 154, 102, 61, 146, 106, 79, 118, 101, 97, 113, 112, 127, 102, 123, 168, 104, 150, 205, 103, 163, 223, 106, 164, 231, 106, 167, 237, 105, 171, 245, 105, 172, 244, 106, 172, 246, 103, 167, 237, 99, 157, 227, 103, 170, 246, 107, 173, 249, 106, 173, 248, 104, 172, 246, 85, 132, 180, 77, 143, 216, 105, 180, 247, 108, 184, 247, 105, 183, 248, 83, 148, 215, 36, 48, 55, 27, 46, 54, 69, 139, 198, 104, 187, 245, 116, 191, 247, 119, 193, 249, 119, 192, 250, 119, 194, 251, 118, 193, 250, 103, 177, 237, 71, 119, 150, 55, 110, 163, 56, 73, 77, 36, 43, 31, 26, 34, 20, 26, 48, 49, 50, 78, 77, 65, 113, 135, 82, 152, 215, + 119, 104, 43, 83, 76, 24, 55, 61, 37, 40, 66, 65, 41, 60, 46, 63, 76, 32, 90, 108, 93, 97, 138, 152, 100, 150, 189, 96, 151, 205, 112, 137, 146, 113, 183, 238, 119, 194, 249, 118, 195, 249, 118, 194, 250, 117, 194, 250, 117, 193, 250, 116, 193, 250, 116, 192, 250, 116, 193, 250, 115, 193, 250, 114, 193, 250, 116, 193, 250, 117, 193, 250, 112, 189, 248, 109, 190, 250, 117, 195, 251, 118, 195, 250, 119, 195, 250, 120, 195, 249, 119, 194, 250, 116, 192, 250, 118, 194, 249, 118, 194, 248, 112, 188, 249, 109, 173, 239, 99, 142, 195, 103, 89, 56, 119, 93, 35, 123, 87, 33, 126, 83, 32, 127, 83, 34, 123, 79, 33, 125, 78, 28, 119, 73, 25, 115, 68, 23, 108, 62, 18, 106, 59, 18, 104, 59, 18, 115, 65, 20, 121, 70, 22, 117, 64, 19, 111, 60, 16, 103, + 58, 14, 100, 51, 11, 112, 58, 12, 126, 69, 20, 127, 69, 15, 134, 70, 15, 158, 90, 25, 178, 106, 35, 190, 113, 36, 182, 108, 32, 174, 98, 29, 186, 109, 32, 191, 120, 42, 184, 118, 46, 121, 65, 18, 62, 22, 1, 113, 54, 9, 154, 77, 15, 157, 84, 20, 159, 89, 27, 133, 68, 15, 143, 76, 17, 117, 58, 12, 105, 49, 7, 143, 71, 16, 134, 63, 9, 149, 77, 17, 147, 72, 16, 145, 75, 19, 145, 71, 15, 140, 67, 12, 172, 102, 31, 175, 102, 32, 119, 53, 5, 127, 56, 7, 168, 88, 20, 160, 84, 23, 129, 64, 16, 136, 65, 6, 159, 85, 18, 158, 80, 11, 166, 89, 19, 157, 83, 18, 151, 80, 16, 164, 95, 25, 162, 90, 24, 154, 83, 20, 145, 73, 11, 147, 77, 16, 138, 71, 13, 135, 71, 18, 148, 85, 28, 153, 87, 29, 160, 93, + 31, 163, 93, 32, 165, 94, 33, 155, 85, 26, 155, 84, 24, 159, 87, 27, 160, 89, 28, 154, 86, 25, 151, 83, 24, 148, 86, 27, 140, 78, 26, 130, 70, 24, 138, 83, 37, 147, 95, 54, 139, 99, 70, 138, 112, 92, 127, 115, 112, 119, 126, 139, 118, 142, 166, 116, 151, 180, 111, 159, 208, 108, 167, 234, 106, 172, 245, 103, 169, 240, 99, 159, 226, 103, 169, 241, 107, 172, 248, 106, 173, 248, 107, 173, 249, 99, 157, 221, 76, 124, 177, 94, 162, 230, 107, 181, 249, 93, 150, 212, 65, 79, 84, 46, 73, 92, 76, 145, 206, 106, 184, 245, 103, 183, 246, 106, 183, 245, 118, 191, 247, 120, 194, 250, 120, 194, 250, 120, 194, 249, 110, 187, 248, 86, 153, 208, 76, 105, 118, 62, 66, 42, 49, 64, 34, 61, 87, 50, 68, 97, 71, 83, 111, 81, 93, 142, 158, 95, 164, 229, + 96, 101, 84, 80, 103, 89, 75, 126, 143, 61, 117, 151, 61, 90, 81, 82, 92, 30, 91, 104, 73, 100, 118, 114, 108, 138, 151, 113, 148, 176, 120, 164, 205, 116, 188, 249, 119, 195, 248, 118, 195, 249, 118, 193, 250, 116, 194, 250, 114, 194, 250, 115, 193, 250, 116, 192, 250, 117, 192, 249, 117, 193, 250, 116, 194, 251, 118, 193, 250, 117, 194, 250, 115, 193, 248, 113, 191, 249, 116, 195, 250, 120, 195, 250, 119, 195, 249, 120, 195, 250, 122, 196, 249, 122, 198, 249, 116, 192, 247, 103, 175, 244, 106, 170, 239, 101, 158, 221, 102, 113, 131, 104, 77, 39, 120, 82, 34, 124, 79, 31, 113, 66, 17, 118, 67, 24, 115, 65, 19, 115, 67, 19, 115, 65, 18, 115, 68, 22, 123, 75, 28, 127, 79, 32, 130, 79, 32, 134, 85, 35, 135, 84, 35, 135, 82, 33, 125, 74, 26, 131, + 79, 26, 129, 74, 23, 119, 63, 18, 94, 44, 6, 83, 39, 5, 92, 43, 9, 91, 37, 2, 109, 48, 6, 147, 73, 16, 181, 103, 28, 172, 94, 26, 173, 94, 24, 182, 104, 27, 198, 127, 47, 181, 123, 52, 92, 47, 7, 100, 48, 11, 155, 77, 15, 156, 82, 21, 177, 103, 34, 150, 85, 30, 107, 48, 4, 155, 86, 24, 137, 71, 18, 111, 48, 8, 106, 38, 4, 149, 76, 18, 170, 95, 24, 142, 76, 24, 160, 88, 25, 160, 87, 22, 172, 97, 28, 179, 104, 27, 168, 97, 39, 155, 78, 13, 174, 94, 25, 191, 117, 38, 160, 87, 23, 155, 83, 20, 136, 63, 12, 129, 56, 4, 149, 74, 13, 149, 74, 16, 152, 80, 11, 145, 72, 11, 132, 66, 9, 118, 50, 3, 123, 53, 6, 130, 64, 14, 143, 81, 27, 142, 80, 31, 138, 76, 23, 123, 60, 13, 122, 62, + 12, 142, 72, 18, 152, 80, 24, 160, 92, 30, 158, 86, 29, 148, 77, 17, 147, 76, 14, 147, 78, 15, 158, 87, 26, 164, 94, 32, 165, 96, 33, 160, 91, 30, 145, 82, 26, 133, 73, 21, 137, 78, 27, 138, 80, 31, 146, 88, 39, 148, 96, 46, 142, 101, 75, 125, 118, 127, 115, 148, 190, 107, 164, 229, 106, 170, 243, 106, 171, 243, 100, 164, 230, 103, 168, 240, 106, 172, 248, 107, 173, 248, 107, 173, 248, 106, 172, 243, 100, 162, 235, 74, 129, 179, 77, 141, 216, 67, 84, 99, 52, 68, 78, 81, 147, 208, 108, 188, 245, 107, 185, 247, 97, 169, 226, 97, 170, 229, 113, 190, 247, 118, 195, 249, 121, 195, 248, 116, 193, 249, 93, 159, 222, 64, 90, 99, 55, 69, 61, 75, 122, 142, 93, 136, 125, 69, 100, 54, 60, 93, 66, 77, 109, 64, 92, 136, 138, 87, 149, 187, + 90, 102, 103, 95, 105, 60, 95, 162, 212, 97, 172, 237, 90, 153, 202, 93, 135, 143, 82, 126, 143, 67, 109, 125, 73, 84, 66, 96, 108, 99, 113, 156, 194, 116, 177, 235, 113, 188, 247, 118, 195, 249, 119, 194, 251, 119, 194, 249, 115, 193, 250, 114, 193, 250, 114, 193, 250, 115, 193, 251, 115, 193, 251, 115, 194, 251, 118, 193, 250, 117, 194, 250, 116, 194, 250, 116, 195, 250, 118, 195, 249, 118, 194, 249, 120, 194, 250, 117, 195, 249, 117, 192, 249, 115, 192, 248, 109, 183, 246, 106, 171, 237, 102, 150, 209, 100, 115, 143, 108, 86, 59, 111, 77, 35, 111, 74, 28, 105, 68, 27, 95, 58, 18, 92, 55, 15, 92, 49, 11, 94, 52, 13, 95, 51, 9, 92, 51, 10, 92, 49, 12, 93, 51, 14, 101, 54, 15, 105, 57, 12, 115, 64, 18, 127, 74, 24, 130, 78, 25, 134, + 78, 25, 129, 74, 27, 117, 62, 18, 114, 61, 18, 103, 56, 16, 82, 35, 6, 82, 34, 5, 77, 30, 2, 84, 36, 5, 123, 57, 10, 165, 88, 22, 146, 71, 11, 158, 83, 19, 178, 99, 28, 190, 118, 44, 166, 108, 48, 104, 51, 11, 164, 89, 25, 172, 99, 33, 183, 109, 38, 175, 107, 42, 140, 70, 15, 159, 88, 22, 134, 69, 12, 103, 46, 8, 84, 29, 2, 125, 54, 8, 154, 76, 12, 144, 84, 33, 133, 70, 16, 150, 81, 20, 161, 85, 20, 182, 107, 39, 188, 122, 49, 168, 96, 30, 174, 95, 27, 185, 107, 30, 184, 105, 33, 168, 94, 29, 142, 65, 13, 145, 71, 14, 138, 66, 12, 138, 65, 14, 115, 48, 4, 91, 36, 3, 82, 29, 2, 98, 37, 1, 118, 48, 6, 128, 57, 11, 129, 60, 11, 142, 73, 17, 143, 73, 16, 149, 79, 22, 152, 85, + 24, 152, 84, 28, 142, 77, 27, 136, 70, 21, 135, 64, 14, 158, 87, 25, 163, 93, 28, 162, 90, 28, 164, 91, 28, 166, 92, 30, 161, 91, 27, 160, 92, 21, 165, 97, 30, 150, 79, 21, 138, 74, 20, 116, 60, 15, 126, 68, 24, 134, 75, 29, 141, 83, 36, 133, 85, 50, 118, 95, 89, 114, 124, 150, 110, 155, 215, 108, 168, 238, 103, 166, 237, 102, 167, 239, 107, 172, 248, 107, 173, 248, 107, 173, 247, 110, 173, 246, 106, 172, 243, 80, 121, 165, 41, 48, 52, 45, 58, 69, 75, 135, 196, 107, 178, 244, 112, 184, 248, 107, 173, 222, 96, 155, 179, 90, 160, 203, 107, 182, 243, 113, 188, 247, 103, 180, 247, 72, 128, 183, 37, 56, 65, 49, 65, 45, 90, 125, 119, 103, 155, 173, 93, 129, 80, 53, 83, 24, 56, 92, 70, 67, 111, 109, 88, 135, 146, 89, 139, 152, + 95, 95, 58, 85, 90, 28, 105, 145, 154, 106, 174, 226, 97, 178, 242, 104, 173, 233, 102, 177, 242, 84, 163, 226, 72, 124, 164, 88, 122, 136, 100, 148, 192, 109, 170, 229, 111, 187, 248, 118, 193, 250, 119, 194, 251, 118, 195, 249, 118, 193, 250, 117, 194, 250, 116, 194, 250, 116, 193, 249, 116, 194, 250, 116, 194, 250, 116, 194, 250, 116, 195, 251, 117, 194, 250, 119, 194, 251, 118, 195, 249, 120, 196, 249, 119, 196, 248, 119, 196, 248, 113, 189, 246, 104, 172, 235, 97, 148, 210, 101, 126, 168, 109, 115, 133, 117, 99, 82, 125, 90, 42, 135, 91, 43, 131, 92, 42, 124, 81, 34, 125, 78, 31, 111, 65, 21, 91, 49, 15, 87, 47, 12, 86, 47, 12, 91, 51, 11, 90, 48, 11, 88, 48, 10, 84, 43, 7, 88, 43, 8, 93, 46, 7, 98, 51, 10, 117, 65, 20, 138, + 83, 31, 151, 93, 36, 161, 101, 42, 165, 103, 39, 169, 109, 43, 153, 98, 36, 136, 82, 29, 123, 71, 26, 113, 62, 21, 131, 71, 19, 151, 80, 19, 149, 81, 25, 138, 69, 14, 161, 86, 21, 188, 119, 46, 204, 141, 65, 170, 106, 44, 165, 87, 27, 172, 96, 29, 187, 119, 45, 186, 117, 46, 172, 103, 35, 142, 71, 13, 129, 60, 10, 94, 35, 6, 83, 28, 0, 108, 42, 4, 123, 52, 3, 136, 68, 11, 137, 69, 17, 149, 90, 32, 151, 76, 17, 184, 111, 39, 184, 112, 37, 184, 112, 39, 159, 84, 20, 180, 99, 31, 184, 108, 38, 178, 108, 42, 143, 71, 17, 143, 72, 16, 130, 59, 7, 121, 51, 5, 111, 45, 6, 85, 32, 3, 77, 24, 0, 88, 31, 0, 93, 33, 3, 104, 42, 4, 118, 56, 11, 142, 75, 19, 155, 85, 27, 133, 63, 15, 129, 61, + 13, 144, 77, 20, 144, 76, 25, 151, 80, 25, 153, 82, 28, 147, 75, 19, 147, 78, 19, 152, 81, 20, 147, 73, 16, 146, 74, 14, 160, 88, 21, 160, 93, 28, 169, 100, 31, 169, 102, 41, 146, 85, 32, 130, 75, 36, 110, 68, 38, 119, 81, 51, 112, 86, 69, 121, 94, 78, 109, 98, 100, 98, 101, 120, 100, 110, 146, 105, 144, 206, 102, 160, 228, 102, 166, 237, 106, 172, 246, 107, 172, 247, 108, 173, 249, 110, 174, 248, 98, 163, 236, 68, 93, 123, 35, 36, 34, 53, 79, 113, 88, 154, 218, 105, 175, 243, 110, 177, 242, 113, 165, 185, 105, 142, 129, 92, 150, 177, 97, 160, 206, 92, 145, 178, 58, 95, 128, 26, 49, 63, 49, 102, 133, 89, 140, 151, 99, 129, 82, 90, 120, 82, 80, 110, 30, 55, 88, 17, 52, 85, 57, 57, 95, 94, 81, 124, 128, 92, 135, 140, + 91, 119, 125, 71, 105, 121, 95, 102, 40, 99, 137, 139, 96, 150, 183, 102, 163, 210, 105, 180, 239, 103, 178, 243, 100, 144, 174, 97, 168, 230, 97, 169, 231, 103, 179, 242, 113, 190, 250, 118, 194, 248, 119, 194, 249, 117, 194, 250, 118, 194, 250, 118, 195, 250, 119, 194, 249, 117, 194, 250, 116, 194, 250, 117, 195, 249, 118, 195, 249, 116, 196, 247, 118, 196, 248, 120, 195, 248, 119, 196, 250, 122, 197, 247, 120, 196, 249, 107, 181, 240, 85, 131, 194, 92, 99, 123, 115, 91, 79, 131, 87, 49, 133, 86, 41, 138, 88, 39, 129, 82, 33, 125, 77, 27, 122, 75, 26, 113, 68, 23, 117, 70, 24, 119, 73, 27, 113, 69, 22, 108, 61, 20, 101, 56, 16, 94, 54, 15, 83, 47, 11, 77, 43, 10, 81, 43, 8, 88, 44, 10, 104, 55, 15, 119, 67, 24, 137, 78, 26, 148, + 87, 25, 157, 93, 29, 162, 92, 32, 172, 102, 34, 165, 100, 33, 170, 99, 33, 180, 112, 38, 187, 119, 44, 185, 117, 44, 161, 93, 30, 153, 83, 21, 141, 70, 12, 151, 78, 15, 177, 100, 38, 194, 126, 53, 202, 140, 65, 179, 109, 38, 182, 108, 37, 187, 115, 42, 192, 122, 49, 165, 96, 29, 172, 100, 32, 136, 72, 16, 114, 58, 18, 88, 35, 6, 85, 28, 0, 100, 40, 4, 127, 59, 7, 154, 83, 19, 146, 78, 17, 147, 75, 20, 167, 93, 29, 194, 119, 45, 185, 112, 41, 183, 110, 44, 169, 99, 40, 179, 109, 43, 184, 115, 47, 184, 117, 50, 152, 81, 27, 138, 65, 14, 120, 51, 9, 112, 46, 7, 112, 45, 6, 101, 39, 2, 86, 30, 1, 73, 25, 1, 68, 24, 1, 87, 40, 10, 93, 37, 2, 146, 78, 22, 160, 92, 33, 146, 78, 21, 143, 77, + 25, 127, 59, 12, 136, 67, 15, 145, 73, 20, 152, 79, 23, 163, 89, 29, 150, 80, 21, 147, 77, 19, 162, 91, 26, 160, 89, 27, 148, 78, 19, 164, 98, 29, 170, 103, 36, 177, 111, 46, 159, 96, 44, 111, 63, 30, 110, 78, 54, 96, 79, 73, 109, 111, 124, 116, 129, 163, 117, 132, 167, 102, 130, 179, 103, 148, 204, 96, 136, 197, 103, 157, 222, 101, 160, 230, 108, 172, 246, 109, 173, 248, 110, 175, 249, 103, 168, 241, 82, 116, 163, 49, 54, 61, 63, 115, 171, 93, 157, 222, 95, 152, 213, 89, 136, 188, 92, 138, 192, 99, 134, 155, 104, 125, 92, 89, 129, 132, 72, 93, 101, 49, 55, 46, 42, 72, 97, 71, 139, 201, 102, 162, 206, 93, 143, 145, 85, 111, 32, 74, 96, 10, 70, 100, 9, 64, 98, 20, 54, 77, 32, 56, 93, 95, 78, 130, 156, 97, 145, 167, + 93, 156, 217, 69, 118, 174, 80, 91, 66, 104, 151, 181, 94, 155, 214, 88, 136, 171, 87, 123, 142, 89, 120, 133, 111, 133, 129, 106, 171, 228, 108, 183, 243, 109, 183, 244, 109, 183, 242, 111, 183, 244, 113, 184, 244, 112, 184, 245, 110, 183, 244, 109, 182, 244, 106, 179, 240, 109, 180, 239, 110, 186, 245, 109, 183, 245, 106, 179, 244, 106, 181, 247, 109, 187, 248, 119, 195, 250, 120, 196, 249, 115, 191, 247, 96, 157, 220, 89, 106, 143, 108, 87, 84, 122, 85, 56, 123, 78, 38, 120, 71, 30, 125, 74, 26, 119, 72, 26, 115, 72, 25, 112, 66, 22, 108, 63, 20, 104, 60, 20, 101, 56, 19, 97, 58, 15, 102, 58, 16, 108, 61, 18, 114, 64, 18, 113, 63, 18, 107, 60, 17, 104, 58, 17, 103, 58, 17, 113, 66, 21, 122, 67, 20, 134, 77, 25, 143, 83, 30, 145, + 83, 27, 145, 83, 25, 153, 92, 33, 164, 98, 34, 176, 107, 38, 177, 105, 37, 168, 94, 28, 163, 86, 20, 163, 88, 22, 155, 80, 17, 167, 94, 29, 160, 80, 14, 177, 101, 34, 179, 107, 44, 196, 129, 59, 182, 112, 43, 184, 111, 41, 191, 121, 50, 187, 117, 46, 181, 108, 38, 155, 82, 24, 155, 82, 22, 147, 81, 22, 116, 60, 22, 86, 35, 4, 87, 31, 0, 100, 45, 11, 168, 97, 29, 160, 87, 15, 162, 92, 24, 168, 98, 35, 168, 96, 29, 189, 110, 37, 194, 120, 47, 182, 110, 43, 187, 118, 54, 189, 121, 50, 189, 115, 44, 179, 108, 40, 164, 93, 36, 144, 73, 22, 141, 67, 13, 126, 57, 12, 115, 44, 4, 117, 47, 5, 94, 36, 3, 77, 26, 1, 89, 33, 3, 102, 44, 6, 111, 46, 5, 120, 55, 8, 143, 71, 16, 163, 90, 28, 142, 73, + 19, 145, 79, 24, 137, 70, 19, 142, 71, 15, 140, 68, 15, 149, 76, 17, 163, 90, 26, 162, 90, 24, 165, 96, 28, 157, 90, 26, 160, 93, 29, 163, 97, 26, 173, 108, 37, 171, 107, 37, 165, 106, 46, 144, 89, 45, 111, 69, 36, 106, 71, 50, 101, 86, 78, 96, 106, 135, 111, 142, 190, 113, 146, 201, 106, 154, 219, 107, 162, 231, 105, 160, 229, 102, 159, 228, 106, 171, 245, 111, 175, 249, 108, 173, 247, 86, 125, 172, 48, 49, 51, 66, 104, 152, 102, 168, 238, 111, 177, 247, 108, 172, 239, 104, 162, 218, 100, 161, 224, 97, 141, 171, 85, 93, 60, 62, 66, 51, 54, 55, 28, 57, 74, 61, 81, 141, 185, 103, 174, 240, 105, 165, 200, 99, 131, 104, 92, 103, 22, 78, 94, 16, 70, 87, 9, 68, 88, 15, 64, 83, 40, 66, 104, 110, 87, 140, 184, 95, 138, 166, + 94, 137, 183, 66, 99, 130, 63, 80, 87, 85, 110, 121, 86, 123, 154, 71, 97, 108, 66, 92, 83, 64, 76, 57, 95, 116, 112, 95, 133, 153, 99, 150, 187, 99, 163, 220, 100, 171, 229, 99, 171, 234, 104, 173, 234, 101, 170, 234, 97, 167, 228, 92, 160, 220, 82, 146, 208, 92, 138, 171, 101, 171, 236, 103, 183, 248, 108, 186, 249, 113, 193, 249, 117, 194, 249, 121, 196, 249, 105, 184, 242, 85, 132, 192, 96, 88, 102, 112, 89, 75, 114, 84, 63, 127, 81, 47, 130, 80, 34, 126, 77, 26, 125, 76, 26, 115, 68, 21, 110, 65, 23, 105, 61, 19, 98, 57, 17, 97, 55, 16, 91, 48, 14, 84, 47, 11, 92, 51, 11, 100, 53, 13, 110, 57, 14, 100, 49, 9, 103, 54, 12, 117, 67, 21, 125, 70, 24, 120, 67, 19, 131, 70, 19, 138, 74, 20, 146, 80, 22, 147, + 79, 20, 153, 85, 26, 156, 90, 29, 175, 107, 40, 166, 97, 27, 157, 85, 21, 150, 78, 17, 135, 65, 10, 134, 63, 12, 169, 94, 26, 166, 91, 22, 183, 106, 37, 200, 131, 63, 188, 117, 50, 187, 113, 46, 182, 108, 41, 187, 116, 46, 179, 102, 35, 180, 105, 36, 188, 118, 45, 176, 99, 33, 152, 78, 18, 150, 80, 23, 134, 69, 17, 106, 49, 6, 68, 23, 4, 88, 39, 6, 150, 83, 18, 167, 96, 20, 148, 78, 15, 163, 88, 24, 166, 88, 16, 181, 100, 26, 177, 104, 35, 176, 107, 41, 192, 123, 57, 188, 119, 53, 187, 120, 51, 181, 112, 42, 180, 113, 47, 176, 109, 47, 158, 80, 25, 156, 84, 24, 131, 58, 9, 115, 47, 4, 90, 35, 0, 81, 29, 0, 76, 24, 0, 93, 34, 1, 112, 42, 2, 115, 49, 2, 126, 58, 7, 149, 76, 18, 172, 101, + 35, 153, 86, 30, 161, 93, 33, 147, 79, 24, 151, 79, 18, 152, 82, 20, 160, 87, 25, 171, 99, 28, 177, 107, 29, 180, 110, 39, 162, 94, 33, 167, 99, 32, 174, 110, 42, 171, 105, 41, 166, 106, 41, 144, 89, 35, 128, 82, 41, 97, 61, 34, 103, 67, 36, 93, 74, 64, 95, 99, 125, 116, 137, 180, 118, 153, 210, 107, 166, 234, 110, 170, 240, 107, 166, 234, 108, 172, 246, 109, 174, 248, 90, 142, 207, 59, 63, 70, 58, 90, 127, 97, 160, 229, 111, 176, 240, 112, 175, 239, 112, 172, 236, 105, 157, 200, 99, 145, 197, 87, 116, 145, 60, 58, 32, 59, 57, 2, 81, 92, 28, 93, 128, 113, 99, 161, 207, 106, 181, 246, 107, 167, 213, 108, 137, 136, 116, 110, 18, 101, 100, 27, 69, 74, 9, 61, 73, 19, 69, 87, 42, 80, 104, 90, 88, 117, 119, 72, 89, 74, + 106, 153, 211, 91, 135, 192, 74, 111, 164, 75, 103, 127, 78, 115, 148, 79, 126, 162, 65, 127, 192, 74, 105, 120, 96, 162, 218, 104, 175, 238, 105, 178, 244, 105, 184, 248, 112, 191, 248, 118, 194, 249, 120, 195, 249, 119, 195, 248, 116, 194, 249, 117, 193, 248, 109, 189, 246, 89, 147, 197, 113, 188, 245, 119, 197, 249, 119, 197, 251, 120, 198, 248, 116, 193, 246, 101, 172, 238, 92, 148, 214, 95, 125, 174, 107, 113, 138, 116, 103, 106, 119, 91, 77, 127, 88, 56, 124, 80, 41, 120, 74, 28, 115, 67, 21, 106, 62, 19, 98, 56, 16, 93, 53, 16, 91, 49, 13, 89, 50, 12, 93, 50, 13, 91, 50, 9, 95, 52, 13, 98, 53, 12, 107, 59, 14, 115, 62, 18, 123, 70, 23, 126, 70, 23, 126, 71, 22, 122, 69, 21, 108, 55, 13, 106, 53, 10, 132, 71, 21, 150, + 85, 26, 155, 89, 27, 150, 81, 22, 147, 78, 24, 156, 85, 24, 124, 58, 9, 106, 45, 3, 131, 64, 13, 156, 87, 24, 171, 100, 30, 183, 111, 42, 190, 121, 51, 186, 121, 54, 185, 120, 55, 186, 125, 58, 176, 112, 44, 183, 113, 49, 181, 108, 45, 191, 118, 50, 193, 117, 46, 187, 110, 38, 177, 99, 30, 148, 75, 16, 141, 73, 16, 120, 55, 8, 95, 40, 5, 67, 25, 6, 122, 62, 9, 176, 102, 31, 173, 97, 27, 128, 66, 16, 161, 90, 28, 160, 82, 19, 155, 83, 23, 171, 101, 37, 180, 108, 45, 184, 120, 56, 182, 115, 55, 185, 117, 52, 185, 118, 53, 178, 108, 47, 178, 108, 50, 177, 106, 42, 156, 82, 21, 130, 59, 8, 108, 43, 3, 86, 32, 2, 73, 26, 0, 75, 24, 1, 71, 23, 2, 96, 34, 1, 103, 42, 5, 123, 54, 7, 155, 79, + 26, 161, 89, 29, 153, 86, 30, 144, 83, 30, 157, 89, 31, 169, 97, 28, 168, 97, 32, 160, 84, 19, 176, 104, 30, 187, 120, 43, 182, 114, 40, 172, 104, 35, 171, 107, 43, 177, 110, 42, 169, 103, 37, 171, 110, 45, 145, 95, 45, 121, 90, 66, 92, 86, 91, 96, 95, 113, 78, 82, 105, 78, 81, 105, 100, 112, 147, 102, 141, 194, 103, 155, 222, 102, 159, 230, 101, 166, 239, 94, 146, 211, 64, 69, 76, 58, 78, 105, 94, 154, 220, 112, 174, 240, 112, 171, 232, 111, 168, 226, 105, 160, 221, 97, 124, 146, 74, 74, 63, 63, 57, 17, 71, 74, 0, 96, 110, 16, 104, 122, 38, 98, 137, 131, 101, 169, 219, 110, 181, 246, 113, 158, 193, 120, 133, 106, 130, 114, 9, 97, 89, 10, 55, 60, 4, 51, 63, 5, 75, 84, 35, 95, 107, 90, 85, 113, 121, 77, 87, 55, + 121, 148, 181, 118, 143, 182, 112, 125, 145, 99, 126, 154, 85, 134, 186, 78, 132, 183, 65, 97, 124, 79, 120, 155, 100, 157, 199, 110, 178, 235, 111, 178, 238, 110, 181, 243, 110, 187, 248, 116, 193, 250, 120, 196, 249, 122, 196, 251, 121, 196, 251, 121, 196, 250, 116, 193, 245, 98, 152, 202, 114, 187, 240, 120, 197, 248, 121, 197, 248, 118, 195, 247, 98, 175, 244, 91, 150, 221, 90, 116, 163, 105, 107, 129, 107, 98, 102, 114, 91, 77, 124, 90, 66, 117, 80, 50, 112, 67, 28, 110, 62, 17, 105, 61, 16, 103, 58, 18, 107, 60, 21, 99, 55, 18, 87, 50, 11, 84, 47, 11, 84, 46, 9, 85, 45, 9, 93, 49, 12, 100, 55, 12, 112, 64, 18, 109, 61, 13, 105, 54, 13, 104, 55, 11, 109, 57, 14, 108, 57, 18, 97, 50, 11, 91, 47, 11, 88, 44, 7, 90, + 43, 7, 95, 43, 7, 108, 52, 5, 113, 50, 6, 99, 41, 4, 99, 42, 3, 131, 68, 18, 149, 81, 19, 174, 103, 37, 182, 116, 48, 183, 117, 49, 191, 127, 61, 194, 139, 72, 194, 144, 83, 181, 131, 71, 176, 117, 52, 189, 124, 60, 196, 128, 59, 193, 120, 50, 189, 114, 43, 184, 110, 41, 159, 85, 22, 149, 72, 15, 135, 65, 13, 108, 51, 14, 100, 42, 8, 89, 40, 7, 71, 28, 0, 145, 76, 15, 155, 84, 23, 126, 65, 19, 106, 49, 10, 112, 51, 10, 150, 84, 32, 173, 103, 47, 182, 114, 52, 189, 125, 64, 188, 123, 63, 192, 128, 66, 185, 119, 58, 173, 108, 49, 171, 104, 45, 187, 120, 58, 184, 117, 51, 169, 103, 40, 128, 59, 9, 102, 44, 5, 63, 21, 1, 65, 23, 0, 82, 33, 2, 102, 41, 1, 118, 51, 3, 110, 50, 6, 128, 61, + 11, 152, 78, 21, 155, 80, 24, 154, 85, 28, 170, 103, 37, 164, 94, 32, 164, 92, 27, 166, 93, 27, 171, 97, 27, 187, 117, 43, 188, 119, 47, 183, 114, 46, 161, 94, 27, 178, 114, 45, 178, 112, 46, 180, 119, 47, 150, 93, 40, 123, 87, 64, 104, 97, 101, 93, 100, 124, 95, 126, 176, 94, 136, 194, 93, 126, 177, 92, 128, 180, 98, 138, 191, 97, 134, 188, 85, 120, 167, 62, 71, 87, 48, 50, 55, 85, 132, 193, 112, 169, 224, 110, 168, 223, 106, 161, 220, 101, 139, 178, 91, 102, 110, 69, 62, 35, 64, 65, 39, 82, 95, 68, 104, 111, 17, 114, 125, 32, 112, 133, 78, 103, 151, 167, 106, 174, 235, 103, 169, 234, 97, 127, 134, 99, 97, 32, 93, 86, 8, 65, 61, 5, 35, 41, 1, 41, 50, 0, 67, 67, 8, 87, 93, 66, 93, 111, 110, 85, 106, 104, + 123, 158, 197, 124, 158, 202, 121, 155, 199, 113, 150, 193, 110, 154, 202, 81, 136, 204, 78, 106, 118, 82, 125, 154, 94, 149, 179, 104, 170, 226, 111, 164, 217, 119, 166, 208, 117, 173, 226, 114, 188, 247, 121, 197, 249, 119, 197, 247, 121, 197, 250, 121, 197, 249, 114, 192, 245, 96, 145, 191, 114, 185, 238, 120, 198, 248, 117, 195, 249, 118, 196, 248, 90, 166, 236, 90, 151, 219, 103, 157, 215, 105, 139, 189, 114, 124, 145, 117, 125, 138, 120, 119, 129, 120, 105, 98, 117, 82, 54, 119, 75, 31, 117, 69, 25, 103, 59, 17, 95, 52, 11, 95, 50, 15, 84, 48, 10, 84, 43, 12, 94, 50, 15, 97, 51, 13, 106, 58, 15, 102, 57, 13, 99, 51, 10, 104, 55, 12, 122, 70, 22, 130, 76, 24, 135, 81, 26, 137, 79, 21, 136, 79, 24, 140, 86, 34, 141, 85, 29, 122, + 66, 19, 118, 60, 13, 122, 62, 11, 95, 45, 6, 87, 40, 4, 107, 50, 7, 148, 78, 20, 169, 103, 36, 172, 109, 41, 191, 130, 63, 195, 132, 65, 196, 137, 71, 204, 149, 85, 195, 145, 82, 202, 147, 83, 189, 128, 60, 196, 129, 60, 200, 126, 53, 199, 126, 50, 192, 116, 43, 189, 115, 44, 155, 79, 17, 170, 97, 37, 169, 94, 31, 140, 71, 23, 126, 59, 17, 104, 47, 13, 106, 51, 15, 110, 48, 11, 120, 55, 5, 133, 65, 19, 136, 69, 18, 164, 98, 42, 163, 96, 40, 162, 95, 38, 164, 96, 35, 191, 122, 56, 189, 125, 61, 193, 128, 62, 193, 128, 66, 181, 116, 51, 177, 113, 52, 181, 119, 57, 188, 125, 60, 185, 125, 59, 162, 100, 39, 127, 63, 11, 103, 48, 8, 63, 25, 4, 65, 20, 1, 103, 46, 9, 113, 53, 6, 135, 68, 13, 124, 60, + 14, 143, 76, 21, 163, 90, 28, 173, 100, 34, 168, 93, 33, 179, 104, 33, 182, 111, 37, 179, 106, 35, 186, 113, 41, 185, 113, 47, 187, 123, 52, 184, 120, 51, 149, 84, 29, 156, 91, 23, 181, 115, 45, 185, 116, 42, 171, 109, 44, 127, 94, 62, 107, 107, 120, 97, 118, 162, 90, 132, 193, 98, 152, 217, 109, 167, 231, 101, 153, 219, 107, 164, 230, 99, 156, 222, 72, 87, 114, 44, 35, 27, 60, 73, 74, 94, 126, 146, 100, 148, 183, 98, 143, 177, 98, 116, 142, 82, 73, 56, 72, 61, 20, 82, 85, 50, 94, 106, 74, 98, 104, 51, 116, 120, 24, 122, 133, 47, 118, 141, 106, 105, 159, 188, 101, 161, 217, 97, 139, 172, 74, 81, 56, 57, 51, 0, 61, 56, 2, 50, 47, 2, 39, 40, 0, 46, 49, 0, 56, 58, 0, 67, 72, 34, 75, 98, 99, 90, 112, 111, + 118, 178, 243, 118, 168, 229, 114, 172, 236, 114, 178, 242, 108, 164, 227, 86, 121, 163, 105, 164, 216, 91, 159, 223, 81, 113, 120, 95, 131, 135, 103, 154, 181, 115, 168, 215, 119, 169, 216, 115, 181, 240, 120, 195, 250, 122, 197, 249, 121, 197, 249, 122, 199, 251, 120, 197, 248, 94, 152, 206, 114, 187, 240, 122, 198, 248, 118, 195, 248, 107, 184, 243, 97, 155, 215, 98, 144, 185, 105, 140, 174, 116, 143, 174, 121, 137, 169, 123, 136, 163, 118, 122, 135, 117, 103, 99, 114, 77, 47, 102, 63, 25, 95, 53, 18, 87, 46, 10, 81, 40, 5, 81, 39, 6, 83, 41, 7, 80, 41, 6, 79, 41, 7, 83, 43, 10, 95, 52, 12, 93, 49, 10, 108, 62, 17, 130, 78, 28, 138, 84, 28, 145, 89, 33, 140, 81, 30, 148, 88, 35, 164, 99, 37, 167, 101, 33, 167, 99, 31, 154, + 84, 19, 137, 67, 10, 142, 68, 12, 135, 69, 10, 110, 52, 8, 129, 72, 20, 174, 109, 47, 177, 116, 54, 174, 113, 49, 187, 126, 59, 189, 130, 64, 194, 138, 74, 196, 142, 78, 189, 132, 66, 203, 141, 74, 206, 146, 73, 201, 134, 64, 202, 130, 55, 202, 125, 48, 188, 106, 28, 177, 97, 27, 161, 86, 23, 189, 117, 50, 195, 121, 55, 172, 98, 36, 183, 109, 50, 141, 72, 26, 110, 57, 21, 78, 31, 4, 134, 74, 30, 161, 94, 39, 170, 102, 44, 155, 82, 27, 149, 82, 25, 163, 90, 27, 173, 101, 39, 187, 120, 56, 197, 132, 64, 199, 136, 71, 196, 135, 69, 190, 128, 62, 189, 128, 62, 178, 114, 53, 174, 107, 41, 185, 123, 56, 178, 120, 53, 152, 89, 30, 118, 55, 11, 93, 42, 6, 104, 49, 8, 119, 57, 9, 135, 66, 8, 149, 77, 15, 153, 81, + 15, 166, 91, 22, 166, 93, 29, 171, 99, 35, 173, 96, 33, 169, 93, 27, 175, 103, 35, 183, 114, 43, 196, 123, 51, 193, 125, 50, 191, 127, 56, 190, 126, 53, 155, 91, 36, 132, 71, 15, 158, 91, 23, 178, 105, 33, 167, 101, 32, 91, 71, 62, 79, 84, 105, 73, 105, 159, 84, 132, 197, 86, 140, 211, 97, 153, 220, 105, 162, 230, 104, 162, 229, 87, 114, 151, 58, 52, 48, 67, 84, 96, 96, 139, 165, 97, 116, 103, 80, 83, 58, 77, 75, 62, 66, 57, 30, 66, 59, 25, 77, 81, 49, 92, 100, 51, 89, 95, 30, 95, 95, 20, 107, 104, 15, 123, 129, 54, 121, 145, 125, 116, 152, 165, 103, 130, 132, 90, 101, 78, 76, 83, 67, 65, 69, 46, 79, 76, 26, 84, 84, 41, 75, 76, 44, 59, 63, 28, 59, 61, 14, 60, 67, 24, 66, 77, 66, 73, 88, 88, + 115, 181, 247, 102, 158, 227, 108, 162, 218, 114, 184, 249, 105, 174, 239, 87, 127, 171, 95, 165, 237, 74, 126, 184, 60, 75, 76, 87, 115, 111, 103, 153, 177, 111, 181, 238, 114, 189, 247, 113, 185, 247, 120, 193, 248, 124, 198, 251, 123, 198, 250, 123, 198, 251, 119, 196, 248, 64, 121, 168, 81, 126, 148, 96, 145, 187, 93, 133, 164, 97, 123, 137, 92, 127, 150, 109, 159, 209, 113, 171, 234, 108, 162, 222, 104, 156, 216, 100, 141, 199, 101, 128, 177, 91, 95, 106, 93, 71, 54, 86, 60, 36, 74, 47, 21, 75, 41, 9, 76, 39, 6, 75, 37, 9, 74, 35, 6, 79, 40, 6, 81, 44, 9, 91, 48, 12, 115, 64, 19, 132, 77, 26, 146, 89, 30, 144, 87, 28, 132, 77, 21, 122, 67, 16, 134, 74, 26, 146, 82, 28, 160, 94, 35, 162, 94, 29, 146, 75, 14, 120, + 56, 3, 114, 54, 8, 126, 58, 8, 130, 62, 5, 120, 59, 10, 165, 101, 35, 173, 116, 49, 186, 126, 62, 200, 140, 74, 195, 135, 66, 185, 126, 58, 191, 135, 73, 179, 120, 56, 197, 133, 64, 201, 139, 64, 210, 148, 63, 211, 146, 69, 199, 127, 50, 197, 120, 48, 195, 114, 36, 178, 95, 25, 162, 84, 21, 176, 98, 35, 189, 111, 45, 193, 119, 53, 188, 116, 53, 151, 83, 26, 93, 41, 9, 121, 58, 19, 144, 77, 30, 146, 77, 24, 159, 88, 33, 144, 74, 20, 143, 71, 17, 153, 76, 15, 179, 102, 36, 184, 116, 51, 197, 132, 62, 192, 128, 57, 191, 125, 56, 196, 134, 67, 188, 124, 60, 183, 120, 57, 179, 117, 52, 184, 130, 65, 189, 134, 74, 167, 108, 49, 128, 72, 24, 69, 29, 6, 88, 41, 3, 88, 37, 3, 126, 62, 14, 143, 75, 14, 167, 96, + 29, 170, 92, 26, 179, 106, 31, 172, 100, 37, 179, 107, 42, 180, 105, 39, 175, 100, 39, 184, 111, 46, 186, 118, 49, 178, 114, 48, 189, 123, 52, 192, 125, 49, 178, 114, 49, 132, 71, 17, 144, 76, 10, 176, 105, 29, 162, 92, 26, 94, 91, 96, 88, 121, 174, 92, 146, 215, 111, 178, 246, 109, 175, 244, 108, 175, 243, 108, 170, 239, 90, 125, 174, 71, 70, 65, 79, 106, 134, 102, 160, 215, 101, 144, 179, 81, 84, 67, 59, 45, 9, 59, 46, 7, 58, 56, 32, 67, 66, 27, 80, 79, 15, 82, 82, 11, 76, 75, 4, 85, 79, 2, 93, 85, 5, 109, 111, 47, 125, 142, 108, 127, 143, 120, 112, 113, 50, 87, 87, 39, 81, 89, 74, 88, 100, 110, 96, 110, 115, 113, 136, 162, 99, 144, 183, 90, 112, 132, 68, 76, 53, 62, 65, 16, 67, 78, 64, 81, 109, 131, + 96, 144, 187, 93, 122, 144, 106, 155, 201, 114, 182, 246, 81, 138, 207, 73, 109, 146, 68, 111, 150, 53, 70, 78, 65, 86, 92, 85, 142, 192, 97, 159, 212, 108, 177, 238, 116, 191, 250, 118, 193, 248, 122, 197, 248, 124, 199, 249, 124, 198, 249, 124, 198, 249, 94, 163, 219, 70, 99, 107, 93, 157, 200, 105, 174, 223, 109, 181, 234, 106, 183, 244, 112, 183, 247, 111, 183, 247, 111, 179, 248, 112, 179, 246, 109, 173, 240, 109, 168, 234, 94, 144, 200, 81, 80, 80, 85, 68, 52, 90, 64, 36, 95, 62, 26, 88, 49, 15, 76, 38, 8, 75, 37, 5, 72, 33, 4, 78, 40, 7, 106, 60, 16, 133, 76, 23, 137, 80, 24, 136, 79, 24, 141, 83, 25, 146, 88, 31, 131, 74, 25, 124, 67, 21, 136, 76, 26, 153, 92, 35, 155, 91, 32, 147, 80, 23, 150, 79, 18, 156, + 83, 17, 137, 70, 10, 135, 73, 19, 110, 52, 7, 140, 81, 25, 157, 99, 37, 174, 117, 56, 179, 122, 57, 192, 133, 67, 182, 122, 57, 179, 122, 58, 164, 106, 45, 174, 110, 44, 204, 143, 69, 200, 134, 57, 203, 136, 54, 205, 138, 58, 188, 119, 45, 190, 119, 47, 183, 102, 28, 182, 97, 25, 159, 81, 20, 158, 83, 25, 172, 93, 27, 170, 92, 26, 175, 97, 34, 162, 91, 31, 131, 64, 19, 145, 77, 32, 141, 68, 20, 165, 86, 25, 157, 73, 15, 143, 64, 11, 153, 71, 15, 173, 90, 23, 180, 100, 27, 192, 122, 50, 191, 127, 56, 171, 101, 32, 178, 108, 37, 183, 115, 47, 179, 112, 46, 180, 117, 55, 178, 116, 54, 181, 125, 62, 191, 139, 72, 187, 133, 67, 165, 106, 44, 109, 60, 19, 51, 24, 5, 30, 13, 3, 26, 6, 0, 93, 44, 8, 149, 79, + 26, 164, 90, 22, 182, 113, 41, 176, 103, 37, 180, 107, 42, 182, 107, 40, 170, 94, 28, 184, 111, 42, 183, 115, 48, 177, 110, 43, 178, 110, 41, 185, 120, 49, 180, 113, 44, 165, 101, 39, 154, 81, 17, 168, 86, 14, 169, 94, 27, 97, 103, 113, 86, 139, 197, 106, 172, 237, 111, 181, 246, 111, 184, 247, 109, 178, 245, 100, 148, 199, 81, 84, 82, 78, 108, 145, 92, 142, 197, 86, 111, 138, 65, 64, 55, 58, 46, 11, 59, 53, 12, 67, 67, 38, 66, 65, 28, 71, 67, 4, 77, 82, 38, 85, 94, 68, 74, 70, 14, 75, 66, 0, 81, 72, 0, 107, 108, 32, 124, 132, 71, 122, 122, 52, 103, 98, 26, 90, 85, 24, 89, 91, 64, 101, 113, 120, 120, 132, 141, 118, 146, 174, 104, 150, 199, 95, 117, 134, 66, 63, 32, 65, 78, 77, 71, 119, 171, 92, 150, 221, + 93, 109, 109, 93, 101, 88, 102, 153, 202, 93, 151, 213, 61, 79, 103, 58, 61, 51, 52, 55, 41, 58, 63, 58, 61, 93, 122, 74, 119, 163, 78, 134, 184, 91, 149, 199, 105, 169, 228, 114, 188, 249, 121, 196, 249, 125, 198, 249, 126, 199, 249, 109, 182, 233, 73, 109, 131, 110, 175, 219, 124, 199, 249, 122, 196, 248, 117, 192, 249, 111, 187, 248, 112, 186, 249, 110, 189, 249, 109, 184, 251, 110, 183, 248, 111, 180, 247, 109, 174, 242, 87, 109, 136, 95, 79, 56, 106, 80, 47, 106, 72, 38, 92, 56, 21, 88, 47, 12, 84, 43, 9, 81, 40, 8, 84, 44, 10, 98, 55, 18, 127, 76, 25, 145, 89, 32, 138, 80, 27, 146, 90, 32, 156, 98, 36, 141, 85, 28, 119, 65, 20, 135, 81, 33, 159, 100, 44, 163, 101, 41, 152, 86, 26, 149, 79, 16, 158, 86, 18, 155, + 79, 13, 139, 71, 12, 128, 65, 13, 121, 63, 14, 178, 115, 48, 188, 130, 61, 184, 127, 60, 194, 138, 67, 182, 122, 54, 180, 120, 51, 178, 117, 51, 180, 121, 53, 178, 112, 45, 196, 134, 62, 195, 120, 44, 196, 124, 48, 195, 123, 46, 196, 127, 52, 201, 138, 68, 183, 108, 36, 170, 88, 22, 150, 71, 12, 143, 67, 13, 154, 83, 26, 145, 72, 17, 173, 100, 37, 156, 87, 33, 145, 78, 33, 161, 90, 31, 170, 94, 30, 192, 114, 42, 185, 105, 28, 182, 97, 24, 177, 93, 24, 179, 101, 28, 188, 113, 42, 206, 140, 66, 183, 110, 41, 166, 93, 24, 168, 94, 25, 164, 88, 21, 173, 105, 40, 180, 112, 50, 170, 102, 43, 180, 119, 56, 187, 132, 66, 188, 130, 63, 185, 125, 58, 156, 96, 40, 96, 50, 13, 70, 38, 15, 35, 13, 2, 35, 15, 4, 96, 48, + 12, 158, 91, 25, 172, 99, 27, 183, 115, 47, 182, 113, 44, 191, 120, 50, 183, 108, 41, 175, 102, 34, 187, 115, 41, 186, 118, 50, 184, 119, 50, 177, 112, 40, 179, 113, 42, 160, 96, 37, 162, 91, 25, 174, 93, 20, 162, 89, 27, 88, 112, 147, 82, 135, 192, 82, 143, 209, 91, 154, 221, 88, 146, 210, 80, 127, 177, 75, 86, 89, 70, 83, 94, 73, 110, 152, 60, 70, 80, 50, 39, 21, 56, 51, 18, 70, 78, 46, 69, 78, 55, 68, 73, 57, 68, 63, 10, 76, 75, 25, 88, 107, 103, 84, 114, 135, 84, 89, 56, 76, 70, 3, 92, 87, 4, 111, 108, 13, 120, 120, 32, 106, 104, 42, 92, 93, 43, 103, 98, 29, 105, 101, 44, 106, 105, 72, 109, 104, 69, 105, 103, 73, 97, 104, 80, 96, 96, 53, 89, 78, 28, 82, 85, 57, 78, 100, 116, 83, 124, 171, + 98, 147, 203, 94, 117, 134, 88, 115, 140, 76, 104, 133, 64, 64, 51, 60, 56, 26, 73, 72, 23, 85, 105, 107, 96, 138, 177, 101, 162, 226, 101, 169, 235, 101, 166, 230, 108, 171, 231, 114, 187, 248, 121, 194, 250, 123, 197, 247, 115, 191, 245, 76, 121, 157, 104, 162, 200, 124, 199, 250, 124, 198, 249, 122, 193, 247, 115, 191, 249, 113, 190, 250, 112, 187, 249, 111, 185, 249, 108, 184, 250, 111, 184, 249, 113, 182, 250, 92, 150, 210, 93, 89, 73, 111, 88, 48, 109, 82, 45, 106, 75, 36, 105, 64, 23, 103, 60, 22, 102, 58, 23, 92, 52, 18, 90, 52, 13, 132, 81, 32, 146, 92, 35, 154, 95, 36, 145, 87, 29, 154, 94, 37, 146, 90, 31, 111, 63, 19, 126, 78, 29, 160, 100, 41, 158, 95, 39, 154, 89, 31, 141, 74, 15, 130, 64, 7, 140, 70, 9, 105, + 46, 3, 88, 39, 6, 106, 50, 8, 148, 90, 34, 162, 105, 45, 178, 120, 54, 181, 120, 54, 186, 125, 56, 167, 111, 44, 177, 111, 45, 181, 118, 51, 182, 113, 41, 187, 118, 42, 202, 134, 60, 203, 128, 50, 192, 114, 37, 209, 137, 63, 220, 160, 86, 208, 145, 75, 191, 117, 46, 166, 84, 18, 147, 69, 16, 128, 60, 16, 131, 66, 19, 138, 79, 34, 153, 91, 40, 134, 74, 30, 152, 81, 25, 198, 129, 51, 196, 121, 47, 198, 121, 42, 198, 125, 48, 193, 111, 34, 182, 100, 28, 173, 94, 22, 202, 138, 66, 200, 135, 64, 196, 129, 59, 163, 87, 22, 160, 84, 18, 149, 74, 12, 168, 101, 38, 173, 104, 44, 173, 102, 43, 174, 107, 44, 179, 121, 51, 183, 125, 60, 190, 131, 63, 194, 136, 69, 169, 105, 40, 106, 57, 22, 75, 31, 5, 65, 28, 10, 62, 20, + 0, 107, 53, 10, 169, 101, 28, 181, 105, 34, 189, 117, 40, 161, 92, 31, 186, 115, 45, 178, 107, 38, 168, 98, 34, 183, 110, 36, 177, 113, 46, 176, 112, 47, 170, 104, 39, 160, 95, 31, 166, 95, 30, 170, 83, 13, 142, 76, 26, 56, 65, 86, 89, 145, 208, 104, 166, 233, 104, 173, 239, 98, 157, 221, 72, 92, 107, 44, 43, 27, 43, 45, 43, 42, 42, 39, 50, 64, 81, 67, 91, 98, 91, 103, 52, 89, 98, 43, 72, 81, 51, 66, 68, 46, 65, 61, 4, 79, 92, 75, 99, 141, 173, 95, 145, 199, 94, 114, 119, 97, 91, 19, 104, 100, 5, 108, 105, 9, 101, 104, 45, 99, 101, 45, 97, 97, 37, 104, 97, 21, 103, 96, 33, 96, 89, 53, 82, 75, 30, 68, 60, 15, 73, 71, 43, 90, 93, 78, 96, 102, 90, 97, 128, 155, 95, 135, 182, 92, 132, 181, + 91, 135, 185, 86, 93, 76, 84, 87, 64, 71, 77, 69, 81, 80, 40, 84, 82, 28, 93, 92, 38, 98, 123, 130, 102, 149, 197, 111, 175, 238, 110, 178, 240, 109, 176, 234, 111, 175, 233, 116, 187, 248, 118, 188, 247, 105, 179, 237, 78, 125, 155, 71, 112, 141, 116, 189, 240, 123, 199, 249, 122, 195, 249, 119, 192, 250, 113, 191, 248, 109, 187, 250, 111, 186, 249, 111, 184, 249, 110, 183, 251, 111, 184, 249, 107, 174, 240, 97, 117, 138, 111, 94, 67, 115, 88, 50, 115, 84, 46, 110, 73, 37, 110, 69, 29, 109, 70, 28, 93, 58, 21, 83, 49, 13, 128, 78, 31, 147, 92, 35, 147, 91, 31, 145, 86, 29, 156, 97, 37, 147, 89, 30, 138, 84, 30, 124, 75, 29, 153, 97, 42, 163, 101, 41, 162, 97, 36, 141, 75, 19, 134, 66, 10, 146, 78, 19, 130, 68, 12, 128, + 69, 15, 116, 61, 13, 148, 86, 26, 170, 113, 53, 171, 115, 58, 165, 109, 48, 181, 119, 52, 182, 122, 57, 183, 123, 55, 187, 124, 54, 196, 124, 50, 202, 130, 56, 208, 136, 61, 219, 157, 82, 193, 120, 47, 184, 104, 30, 213, 149, 74, 222, 161, 87, 207, 140, 65, 179, 98, 24, 169, 87, 22, 135, 61, 12, 140, 76, 27, 140, 80, 29, 144, 86, 43, 121, 69, 31, 121, 67, 29, 171, 99, 38, 186, 112, 42, 200, 130, 53, 201, 126, 50, 210, 136, 59, 199, 119, 43, 187, 104, 30, 171, 98, 29, 194, 135, 69, 183, 131, 70, 199, 140, 74, 167, 93, 26, 147, 72, 13, 142, 71, 16, 157, 90, 31, 175, 106, 45, 175, 107, 50, 173, 104, 46, 175, 108, 46, 178, 113, 47, 187, 125, 59, 194, 130, 65, 187, 121, 53, 165, 96, 33, 87, 38, 7, 81, 36, 7, 76, 30, + 0, 122, 66, 18, 118, 61, 17, 155, 91, 29, 181, 112, 43, 183, 111, 40, 175, 103, 35, 178, 111, 43, 176, 109, 43, 166, 97, 35, 176, 107, 38, 172, 104, 40, 165, 98, 37, 166, 97, 35, 166, 94, 26, 169, 90, 19, 115, 74, 45, 46, 57, 77, 53, 83, 131, 83, 144, 208, 88, 146, 205, 77, 106, 125, 45, 46, 36, 34, 32, 22, 28, 26, 14, 35, 44, 49, 81, 138, 200, 98, 151, 190, 100, 114, 73, 85, 91, 37, 75, 72, 28, 62, 55, 12, 74, 72, 29, 93, 122, 137, 102, 158, 213, 103, 157, 219, 101, 128, 143, 105, 104, 29, 105, 103, 15, 99, 102, 37, 88, 90, 43, 92, 98, 72, 98, 94, 28, 101, 89, 23, 90, 87, 52, 90, 98, 93, 87, 114, 147, 92, 107, 115, 84, 80, 48, 75, 74, 50, 91, 89, 66, 105, 124, 120, 106, 141, 164, 107, 145, 175, + 84, 92, 72, 89, 84, 23, 91, 83, 20, 85, 74, 25, 106, 94, 14, 106, 101, 21, 110, 110, 40, 104, 111, 81, 102, 113, 96, 103, 130, 133, 99, 133, 142, 100, 129, 134, 108, 139, 145, 116, 165, 206, 112, 171, 227, 68, 117, 170, 90, 130, 158, 110, 189, 249, 116, 195, 249, 118, 194, 248, 118, 194, 249, 116, 192, 248, 113, 189, 248, 107, 185, 249, 110, 185, 250, 110, 184, 249, 110, 183, 250, 110, 181, 247, 104, 150, 200, 108, 97, 86, 117, 94, 59, 127, 94, 53, 121, 87, 47, 114, 75, 38, 110, 70, 29, 96, 60, 21, 71, 41, 9, 100, 62, 24, 140, 89, 39, 142, 88, 32, 134, 78, 26, 156, 97, 35, 152, 99, 38, 141, 87, 30, 121, 71, 22, 127, 78, 32, 161, 98, 37, 162, 98, 35, 143, 76, 17, 137, 72, 13, 142, 73, 14, 133, 66, 10, 122, 58, 9, 112, + 56, 10, 153, 94, 33, 173, 113, 51, 179, 120, 58, 186, 132, 71, 169, 116, 54, 175, 115, 49, 188, 131, 60, 178, 115, 49, 184, 113, 40, 202, 132, 61, 200, 124, 50, 191, 117, 43, 206, 140, 65, 186, 130, 67, 161, 92, 28, 202, 141, 68, 223, 167, 91, 206, 140, 63, 197, 118, 41, 167, 86, 22, 146, 73, 24, 152, 81, 24, 156, 85, 30, 165, 92, 36, 141, 70, 18, 153, 80, 22, 176, 106, 42, 185, 115, 46, 202, 131, 53, 195, 119, 46, 200, 122, 46, 202, 124, 46, 187, 104, 27, 187, 117, 43, 188, 141, 79, 173, 127, 69, 194, 140, 71, 180, 112, 41, 142, 72, 12, 162, 99, 39, 128, 63, 12, 133, 65, 15, 158, 89, 34, 160, 91, 34, 161, 91, 31, 178, 113, 52, 182, 118, 57, 181, 115, 50, 186, 121, 55, 194, 124, 54, 174, 106, 42, 82, 39, 9, 94, 35, + 4, 138, 72, 16, 149, 82, 28, 131, 74, 24, 138, 80, 24, 170, 104, 36, 171, 99, 34, 176, 109, 42, 173, 114, 46, 173, 112, 50, 184, 118, 51, 186, 120, 42, 177, 111, 44, 185, 113, 39, 171, 93, 25, 180, 102, 36, 84, 69, 70, 60, 92, 140, 75, 105, 148, 55, 90, 134, 54, 76, 100, 35, 42, 41, 22, 27, 25, 39, 61, 85, 51, 79, 115, 35, 47, 56, 45, 66, 91, 72, 106, 132, 95, 118, 122, 90, 110, 118, 89, 93, 74, 75, 73, 36, 78, 77, 44, 93, 118, 126, 101, 155, 203, 101, 156, 213, 100, 128, 139, 102, 101, 33, 97, 97, 38, 81, 93, 86, 96, 102, 61, 92, 86, 29, 99, 91, 18, 99, 83, 15, 94, 92, 67, 94, 125, 161, 98, 127, 150, 96, 121, 139, 98, 107, 100, 91, 90, 61, 93, 83, 43, 97, 99, 77, 94, 96, 70, 116, 115, 85, + 85, 85, 38, 91, 91, 51, 84, 76, 31, 87, 73, 28, 107, 103, 65, 116, 117, 85, 114, 111, 58, 103, 96, 39, 104, 103, 45, 107, 110, 49, 104, 116, 85, 103, 125, 124, 99, 116, 110, 110, 135, 146, 81, 128, 176, 85, 111, 129, 113, 183, 238, 117, 194, 249, 116, 193, 248, 118, 192, 250, 115, 191, 248, 112, 190, 247, 111, 187, 248, 109, 185, 248, 110, 183, 249, 111, 182, 250, 111, 178, 245, 110, 169, 236, 105, 121, 135, 112, 92, 51, 125, 98, 57, 128, 93, 52, 121, 84, 45, 120, 83, 45, 114, 76, 38, 84, 54, 25, 74, 41, 12, 120, 74, 27, 158, 104, 43, 133, 81, 30, 156, 97, 34, 148, 90, 30, 150, 94, 38, 122, 74, 28, 122, 76, 30, 152, 90, 33, 159, 94, 30, 153, 91, 33, 134, 73, 16, 118, 60, 10, 134, 68, 12, 153, 84, 22, 120, 62, 16, 139, + 85, 31, 160, 101, 38, 175, 117, 50, 183, 132, 68, 166, 113, 48, 157, 100, 44, 170, 109, 45, 168, 106, 40, 168, 100, 35, 184, 112, 43, 186, 112, 42, 177, 102, 38, 178, 108, 41, 207, 144, 64, 210, 150, 74, 176, 110, 36, 168, 102, 35, 194, 132, 60, 202, 141, 64, 203, 132, 55, 185, 109, 37, 160, 81, 17, 188, 112, 39, 202, 131, 51, 219, 151, 73, 204, 135, 56, 207, 139, 63, 189, 116, 46, 195, 125, 55, 211, 142, 69, 203, 135, 60, 204, 134, 60, 210, 130, 51, 195, 112, 36, 204, 136, 61, 178, 135, 80, 174, 131, 78, 208, 157, 89, 197, 131, 55, 183, 115, 42, 181, 117, 49, 135, 75, 25, 117, 53, 7, 130, 59, 12, 154, 84, 30, 158, 89, 30, 174, 108, 45, 185, 123, 60, 176, 106, 43, 182, 116, 48, 191, 124, 54, 194, 125, 57, 147, 85, 32, 87, 42, + 17, 113, 55, 8, 178, 108, 37, 183, 114, 47, 134, 74, 21, 129, 71, 20, 164, 99, 34, 176, 111, 39, 179, 117, 43, 179, 117, 48, 172, 106, 40, 171, 99, 26, 180, 108, 33, 183, 106, 32, 180, 100, 27, 137, 83, 36, 54, 50, 55, 61, 83, 115, 54, 82, 115, 48, 62, 74, 30, 35, 33, 34, 52, 54, 55, 105, 135, 90, 155, 206, 106, 176, 239, 101, 169, 232, 77, 129, 186, 52, 76, 108, 51, 56, 57, 77, 82, 80, 94, 97, 83, 102, 101, 48, 89, 90, 35, 88, 110, 102, 101, 147, 190, 98, 148, 206, 93, 109, 111, 79, 73, 16, 80, 83, 56, 93, 93, 63, 88, 77, 15, 93, 80, 5, 97, 80, 2, 94, 85, 40, 92, 100, 100, 102, 129, 151, 109, 127, 132, 97, 101, 89, 85, 93, 95, 84, 83, 69, 78, 65, 28, 69, 54, 16, 72, 57, 11, 88, 71, 19, + 87, 123, 153, 79, 108, 139, 75, 90, 114, 94, 104, 108, 103, 119, 129, 101, 113, 120, 104, 105, 97, 95, 98, 78, 99, 101, 56, 97, 100, 56, 99, 104, 47, 108, 123, 103, 102, 112, 104, 93, 122, 149, 87, 95, 94, 109, 167, 217, 114, 188, 249, 113, 189, 250, 115, 187, 249, 114, 188, 248, 111, 187, 249, 111, 185, 249, 111, 184, 249, 107, 181, 247, 112, 180, 247, 112, 181, 248, 113, 181, 247, 101, 147, 204, 108, 100, 57, 114, 91, 28, 132, 101, 56, 135, 97, 57, 131, 92, 49, 128, 91, 53, 109, 81, 42, 75, 56, 32, 79, 50, 24, 127, 80, 32, 136, 88, 30, 140, 89, 33, 157, 102, 42, 150, 93, 34, 141, 91, 32, 130, 77, 25, 155, 94, 33, 162, 94, 34, 167, 99, 36, 148, 86, 25, 136, 71, 13, 123, 65, 17, 143, 78, 18, 145, 83, 21, 159, 93, 27, 173, + 112, 43, 166, 106, 44, 163, 103, 44, 171, 113, 49, 158, 103, 44, 163, 107, 47, 171, 113, 45, 170, 108, 41, 181, 114, 44, 178, 108, 42, 163, 97, 37, 180, 131, 62, 143, 101, 41, 112, 70, 22, 115, 78, 29, 153, 110, 47, 152, 94, 34, 203, 155, 83, 217, 167, 94, 220, 166, 92, 200, 132, 56, 201, 126, 45, 209, 137, 57, 220, 154, 78, 213, 151, 75, 220, 151, 71, 208, 141, 62, 196, 124, 51, 205, 136, 61, 214, 145, 66, 207, 142, 64, 208, 140, 64, 210, 130, 52, 191, 110, 33, 205, 149, 69, 201, 154, 87, 214, 169, 98, 216, 172, 99, 172, 112, 46, 134, 88, 38, 125, 80, 33, 144, 102, 50, 165, 110, 47, 156, 88, 30, 153, 77, 21, 162, 90, 34, 161, 92, 33, 184, 118, 56, 173, 102, 42, 163, 92, 31, 183, 112, 45, 199, 126, 59, 192, 124, 54, 132, 78, + 31, 91, 41, 13, 144, 80, 23, 189, 115, 44, 191, 122, 52, 156, 94, 31, 156, 93, 32, 165, 100, 32, 170, 104, 35, 174, 110, 39, 185, 118, 47, 181, 110, 37, 192, 115, 39, 177, 98, 26, 138, 80, 30, 89, 57, 31, 56, 52, 50, 59, 62, 63, 42, 44, 44, 39, 40, 32, 47, 67, 65, 76, 134, 154, 97, 163, 193, 101, 175, 221, 111, 189, 243, 125, 197, 247, 118, 193, 250, 103, 172, 242, 87, 141, 203, 71, 91, 110, 70, 67, 40, 83, 77, 27, 87, 92, 56, 94, 127, 149, 99, 156, 214, 97, 147, 203, 77, 89, 96, 69, 64, 25, 71, 61, 8, 75, 64, 8, 73, 58, 2, 80, 65, 0, 91, 79, 17, 101, 105, 88, 91, 103, 109, 90, 96, 92, 76, 72, 55, 67, 53, 25, 66, 45, 14, 67, 43, 10, 67, 43, 8, 70, 57, 29, 90, 86, 67, 104, 86, 36, + 94, 138, 187, 80, 114, 155, 82, 97, 107, 97, 135, 177, 101, 154, 219, 98, 127, 165, 109, 136, 156, 89, 127, 167, 98, 109, 86, 88, 84, 34, 91, 83, 21, 106, 99, 36, 112, 137, 132, 83, 108, 128, 103, 140, 170, 114, 179, 244, 112, 183, 248, 110, 183, 248, 113, 182, 249, 113, 182, 250, 112, 182, 248, 113, 182, 249, 111, 183, 248, 94, 153, 218, 113, 178, 241, 115, 183, 248, 107, 171, 238, 99, 121, 154, 103, 88, 33, 122, 103, 34, 140, 111, 57, 139, 103, 59, 138, 101, 58, 136, 102, 58, 101, 79, 41, 70, 58, 41, 78, 52, 32, 145, 93, 39, 125, 78, 29, 152, 98, 42, 160, 101, 43, 148, 93, 36, 129, 79, 27, 127, 75, 21, 154, 90, 27, 159, 94, 31, 148, 83, 20, 148, 85, 22, 138, 72, 20, 124, 62, 14, 147, 83, 19, 165, 95, 29, 175, 108, 39, 184, + 121, 56, 169, 109, 44, 170, 108, 49, 166, 106, 44, 136, 82, 28, 165, 107, 44, 178, 120, 49, 182, 121, 53, 195, 134, 64, 190, 128, 61, 151, 93, 30, 68, 37, 6, 17, 5, 0, 16, 5, 3, 75, 82, 115, 19, 9, 3, 74, 38, 3, 212, 167, 91, 236, 193, 118, 230, 180, 105, 221, 167, 95, 191, 131, 56, 207, 143, 67, 229, 168, 89, 209, 143, 62, 217, 145, 64, 216, 147, 67, 221, 154, 78, 210, 140, 65, 210, 137, 59, 206, 133, 54, 202, 131, 51, 207, 134, 51, 203, 132, 54, 199, 147, 74, 229, 177, 96, 235, 193, 113, 192, 150, 82, 60, 36, 15, 13, 8, 5, 12, 6, 3, 15, 4, 0, 63, 31, 2, 161, 100, 40, 160, 89, 29, 184, 118, 49, 192, 127, 63, 183, 115, 50, 162, 91, 32, 143, 70, 18, 164, 91, 31, 182, 110, 48, 200, 135, 65, 197, 137, + 68, 145, 91, 43, 86, 41, 11, 159, 91, 31, 182, 108, 40, 183, 114, 46, 171, 110, 54, 154, 93, 41, 161, 97, 35, 179, 111, 39, 177, 115, 47, 189, 126, 55, 191, 120, 45, 165, 101, 35, 114, 70, 30, 110, 71, 39, 80, 56, 36, 40, 35, 26, 35, 35, 28, 46, 51, 42, 69, 113, 119, 93, 153, 179, 101, 176, 219, 118, 195, 244, 128, 201, 249, 130, 200, 250, 117, 194, 250, 112, 184, 249, 113, 180, 247, 106, 159, 206, 96, 115, 100, 80, 96, 90, 70, 84, 88, 82, 88, 83, 90, 119, 139, 86, 123, 157, 76, 101, 133, 74, 73, 48, 71, 60, 14, 69, 62, 29, 72, 60, 19, 79, 62, 6, 87, 72, 15, 80, 70, 54, 66, 52, 38, 58, 38, 11, 66, 41, 12, 81, 55, 7, 88, 66, 13, 80, 59, 12, 80, 63, 19, 90, 85, 42, 105, 116, 105, 114, 121, 112, + 98, 113, 110, 82, 94, 95, 96, 101, 84, 113, 158, 206, 106, 157, 216, 110, 146, 188, 117, 172, 235, 99, 150, 205, 93, 122, 139, 94, 98, 70, 92, 92, 63, 111, 110, 54, 105, 123, 119, 100, 114, 107, 109, 165, 221, 111, 171, 237, 112, 177, 245, 113, 172, 236, 114, 174, 237, 114, 178, 244, 113, 177, 244, 115, 179, 246, 102, 170, 242, 92, 132, 170, 104, 155, 209, 105, 151, 203, 98, 133, 176, 99, 94, 55, 114, 92, 28, 127, 103, 47, 143, 112, 64, 143, 109, 62, 143, 108, 57, 133, 105, 54, 97, 77, 32, 68, 49, 21, 87, 51, 18, 134, 85, 31, 135, 88, 37, 147, 96, 38, 161, 104, 44, 137, 82, 28, 101, 54, 16, 141, 82, 25, 155, 91, 27, 142, 83, 27, 141, 81, 19, 141, 79, 23, 107, 55, 13, 136, 73, 18, 153, 92, 32, 169, 99, 31, 173, 106, 38, 161, + 95, 34, 147, 84, 28, 155, 94, 35, 133, 76, 25, 115, 59, 13, 160, 100, 34, 179, 117, 43, 181, 118, 49, 155, 97, 34, 135, 79, 28, 54, 29, 9, 10, 4, 0, 70, 35, 7, 140, 79, 20, 154, 96, 32, 90, 50, 15, 46, 24, 4, 171, 126, 59, 209, 162, 83, 239, 195, 110, 230, 184, 112, 209, 155, 81, 201, 136, 59, 198, 120, 41, 202, 122, 41, 209, 133, 53, 212, 139, 57, 211, 136, 57, 200, 123, 49, 200, 123, 47, 198, 115, 38, 194, 117, 38, 198, 127, 46, 215, 150, 72, 196, 153, 90, 227, 177, 99, 213, 170, 93, 134, 97, 46, 98, 47, 5, 97, 57, 17, 37, 15, 3, 20, 4, 0, 5, 3, 0, 46, 23, 3, 120, 59, 10, 145, 81, 24, 188, 123, 49, 186, 118, 48, 160, 92, 32, 125, 56, 11, 142, 70, 20, 164, 89, 31, 186, 115, 50, 201, 137, + 69, 187, 127, 64, 131, 78, 38, 101, 53, 16, 144, 79, 19, 181, 106, 39, 184, 115, 49, 168, 108, 50, 151, 96, 48, 147, 90, 39, 168, 106, 44, 189, 128, 55, 199, 137, 66, 178, 118, 58, 118, 80, 45, 86, 57, 32, 95, 69, 41, 85, 69, 43, 72, 74, 51, 70, 105, 112, 85, 147, 185, 102, 175, 228, 123, 200, 246, 131, 204, 249, 132, 204, 251, 130, 202, 250, 121, 195, 249, 115, 188, 249, 114, 183, 246, 103, 155, 190, 100, 125, 119, 98, 145, 166, 103, 159, 206, 85, 121, 152, 67, 68, 44, 72, 67, 43, 78, 84, 76, 78, 73, 45, 81, 69, 36, 82, 67, 28, 77, 61, 18, 71, 52, 9, 68, 49, 6, 67, 45, 4, 71, 51, 3, 78, 63, 21, 96, 90, 60, 100, 96, 73, 101, 103, 93, 98, 95, 77, 83, 76, 47, 88, 109, 131, 107, 136, 163, 116, 140, 154, + 90, 90, 67, 86, 82, 36, 117, 128, 112, 105, 145, 189, 109, 127, 137, 118, 160, 197, 118, 179, 245, 91, 145, 210, 83, 91, 100, 90, 90, 50, 97, 93, 26, 107, 103, 43, 97, 89, 36, 118, 164, 203, 111, 179, 245, 107, 160, 222, 107, 157, 207, 110, 149, 184, 114, 167, 222, 114, 168, 228, 114, 165, 212, 108, 167, 230, 91, 129, 171, 83, 80, 77, 107, 129, 148, 112, 166, 228, 99, 127, 158, 99, 84, 23, 116, 89, 37, 131, 102, 57, 139, 107, 62, 131, 99, 48, 131, 95, 43, 127, 103, 56, 81, 64, 31, 59, 33, 8, 82, 42, 10, 122, 70, 26, 141, 93, 38, 147, 96, 37, 137, 77, 26, 127, 70, 22, 133, 79, 19, 139, 79, 23, 133, 74, 20, 147, 88, 29, 158, 96, 34, 148, 89, 25, 105, 55, 14, 131, 71, 17, 157, 92, 31, 164, 93, 28, 165, 96, 31, 147, + 84, 32, 124, 64, 22, 143, 86, 32, 109, 58, 16, 129, 69, 20, 135, 78, 20, 155, 95, 34, 152, 89, 28, 148, 85, 28, 129, 78, 34, 206, 169, 102, 170, 134, 85, 158, 84, 30, 221, 125, 29, 215, 125, 36, 130, 65, 16, 29, 15, 5, 137, 89, 31, 216, 166, 84, 240, 192, 108, 211, 152, 75, 177, 112, 36, 171, 96, 22, 175, 94, 12, 206, 122, 39, 210, 126, 44, 211, 132, 52, 197, 121, 48, 205, 126, 52, 217, 140, 60, 210, 129, 51, 194, 113, 35, 174, 95, 21, 203, 139, 58, 217, 164, 89, 230, 181, 97, 211, 165, 85, 101, 73, 33, 93, 41, 3, 205, 117, 27, 184, 104, 27, 42, 20, 7, 23, 12, 5, 91, 54, 19, 156, 99, 42, 106, 50, 11, 167, 96, 26, 192, 125, 54, 156, 85, 26, 102, 39, 4, 131, 62, 19, 159, 88, 30, 175, 103, 41, 191, 120, + 55, 199, 135, 68, 194, 133, 67, 139, 87, 42, 79, 34, 9, 140, 73, 17, 190, 119, 45, 195, 124, 51, 190, 132, 69, 173, 120, 69, 172, 115, 57, 185, 124, 57, 199, 137, 61, 203, 145, 65, 203, 145, 72, 174, 131, 77, 103, 73, 43, 104, 79, 43, 85, 84, 62, 68, 101, 107, 88, 153, 193, 112, 187, 243, 114, 187, 241, 129, 203, 249, 131, 205, 251, 128, 203, 249, 118, 192, 249, 120, 189, 248, 113, 181, 242, 96, 137, 153, 88, 106, 84, 94, 133, 142, 90, 131, 151, 89, 106, 95, 84, 91, 64, 65, 61, 26, 53, 42, 5, 62, 47, 8, 81, 65, 20, 84, 66, 23, 75, 56, 12, 69, 55, 14, 75, 61, 7, 80, 67, 0, 97, 85, 13, 101, 91, 32, 105, 106, 74, 109, 110, 87, 107, 110, 104, 95, 98, 99, 96, 99, 99, 90, 106, 117, 97, 142, 199, 111, 159, 214, + 65, 67, 67, 86, 82, 60, 113, 131, 135, 109, 133, 150, 123, 154, 175, 113, 160, 214, 98, 148, 206, 75, 104, 134, 72, 68, 49, 88, 80, 14, 100, 104, 57, 87, 89, 67, 111, 112, 84, 109, 142, 178, 112, 164, 215, 106, 154, 207, 107, 121, 119, 109, 149, 177, 110, 155, 202, 107, 126, 130, 105, 122, 131, 105, 131, 163, 106, 144, 184, 100, 142, 194, 107, 145, 186, 108, 161, 221, 97, 105, 95, 109, 90, 22, 121, 94, 49, 132, 100, 59, 136, 104, 61, 126, 96, 51, 115, 85, 47, 98, 80, 60, 55, 36, 22, 54, 28, 8, 81, 43, 14, 124, 76, 33, 152, 101, 43, 118, 69, 19, 133, 73, 20, 129, 73, 18, 121, 73, 23, 118, 72, 25, 153, 94, 32, 177, 113, 44, 150, 91, 26, 123, 67, 21, 109, 54, 12, 147, 78, 19, 176, 109, 36, 157, 90, 25, 150, 87, 32, 132, + 72, 23, 129, 67, 29, 137, 78, 29, 121, 65, 19, 131, 69, 17, 113, 62, 11, 133, 75, 19, 194, 136, 68, 198, 142, 74, 203, 138, 63, 246, 212, 133, 246, 224, 156, 223, 193, 127, 207, 161, 93, 204, 155, 91, 166, 128, 81, 75, 46, 21, 83, 45, 7, 184, 126, 51, 226, 163, 77, 204, 144, 67, 146, 81, 15, 171, 97, 21, 194, 115, 35, 205, 125, 44, 203, 122, 40, 205, 124, 40, 185, 101, 24, 216, 139, 56, 219, 147, 61, 212, 142, 57, 203, 135, 52, 180, 108, 32, 170, 99, 28, 218, 153, 74, 221, 163, 81, 165, 124, 59, 75, 46, 15, 115, 79, 38, 161, 115, 61, 165, 115, 64, 156, 118, 67, 197, 153, 89, 227, 176, 98, 212, 148, 68, 183, 111, 39, 182, 114, 44, 194, 133, 69, 153, 87, 32, 117, 52, 13, 131, 63, 17, 153, 80, 28, 164, 91, 33, 183, 120, + 56, 203, 140, 75, 203, 146, 76, 170, 117, 64, 118, 73, 34, 101, 52, 16, 127, 67, 18, 130, 71, 19, 181, 110, 41, 195, 129, 56, 189, 127, 60, 178, 116, 53, 177, 113, 47, 197, 132, 57, 204, 143, 62, 205, 147, 70, 191, 142, 78, 134, 103, 62, 100, 93, 71, 93, 106, 100, 92, 135, 162, 106, 176, 230, 121, 197, 246, 128, 201, 249, 132, 205, 251, 124, 199, 250, 116, 188, 247, 117, 186, 246, 108, 175, 237, 83, 125, 138, 60, 77, 54, 54, 71, 57, 46, 51, 36, 53, 54, 29, 51, 43, 18, 47, 39, 10, 61, 56, 39, 71, 77, 82, 80, 86, 86, 74, 84, 85, 70, 72, 64, 73, 62, 30, 75, 63, 10, 83, 76, 17, 97, 89, 20, 98, 93, 26, 108, 104, 41, 111, 111, 58, 111, 112, 81, 111, 113, 97, 97, 106, 111, 108, 133, 152, 103, 137, 169, 100, 149, 212, + 58, 57, 51, 101, 100, 72, 114, 162, 218, 111, 138, 166, 111, 153, 198, 99, 141, 191, 82, 105, 105, 75, 89, 80, 82, 77, 37, 101, 101, 45, 84, 102, 108, 92, 85, 55, 131, 132, 115, 121, 162, 211, 97, 122, 152, 103, 123, 133, 100, 102, 76, 95, 118, 145, 98, 107, 103, 109, 128, 132, 113, 160, 208, 109, 163, 223, 107, 158, 205, 114, 172, 230, 114, 174, 241, 95, 142, 202, 102, 90, 55, 115, 90, 35, 125, 93, 46, 136, 104, 60, 131, 103, 59, 123, 97, 53, 92, 67, 39, 97, 67, 36, 57, 33, 14, 52, 26, 7, 71, 38, 10, 122, 76, 36, 129, 81, 30, 94, 51, 14, 120, 64, 12, 103, 58, 16, 75, 41, 9, 159, 104, 44, 185, 121, 44, 159, 93, 27, 134, 72, 19, 138, 80, 22, 128, 71, 22, 147, 83, 21, 170, 98, 32, 164, 93, 34, 156, 89, 32, 155, + 91, 39, 125, 63, 19, 112, 53, 13, 130, 72, 24, 142, 83, 28, 132, 73, 17, 150, 87, 26, 176, 119, 50, 200, 143, 71, 219, 166, 94, 215, 160, 87, 241, 215, 147, 247, 232, 172, 251, 235, 171, 248, 226, 154, 222, 182, 112, 172, 128, 67, 104, 60, 18, 163, 98, 31, 223, 158, 79, 173, 106, 41, 151, 81, 19, 178, 107, 27, 192, 116, 31, 206, 131, 41, 211, 135, 46, 199, 117, 29, 178, 94, 12, 200, 116, 31, 209, 132, 47, 207, 135, 47, 196, 124, 40, 178, 107, 31, 162, 88, 19, 205, 138, 63, 228, 170, 92, 165, 103, 35, 122, 81, 40, 163, 103, 42, 240, 195, 110, 245, 203, 120, 246, 213, 136, 241, 206, 129, 224, 167, 91, 183, 113, 44, 179, 110, 47, 185, 117, 53, 199, 137, 68, 185, 119, 56, 134, 68, 21, 125, 59, 17, 142, 73, 26, 161, 92, 37, 188, 125, + 57, 197, 134, 67, 199, 138, 69, 197, 139, 73, 180, 126, 59, 157, 103, 52, 128, 78, 35, 111, 63, 25, 99, 51, 15, 111, 54, 14, 159, 94, 30, 184, 115, 43, 188, 125, 52, 191, 121, 48, 197, 128, 52, 196, 132, 53, 199, 138, 61, 185, 131, 67, 140, 123, 102, 97, 131, 163, 97, 147, 187, 104, 173, 232, 127, 201, 247, 130, 203, 249, 132, 205, 250, 120, 195, 249, 111, 178, 234, 104, 166, 216, 86, 135, 176, 60, 86, 93, 35, 41, 26, 25, 29, 19, 21, 21, 7, 32, 32, 18, 54, 59, 49, 67, 82, 75, 92, 120, 139, 106, 134, 166, 107, 123, 141, 90, 124, 162, 83, 123, 174, 73, 82, 89, 59, 47, 15, 66, 50, 13, 79, 65, 11, 94, 80, 16, 105, 98, 40, 114, 115, 84, 118, 126, 121, 111, 122, 129, 101, 116, 132, 99, 130, 177, 106, 133, 171, 94, 121, 162, + 72, 67, 39, 115, 119, 97, 102, 136, 172, 110, 126, 135, 105, 133, 163, 105, 118, 123, 96, 101, 47, 91, 106, 97, 101, 94, 42, 91, 110, 105, 93, 89, 56, 109, 148, 190, 140, 153, 157, 128, 165, 212, 92, 130, 171, 90, 80, 44, 100, 88, 61, 107, 103, 55, 118, 139, 132, 118, 165, 221, 115, 169, 229, 111, 163, 223, 101, 139, 168, 114, 148, 173, 115, 173, 232, 88, 123, 162, 100, 76, 30, 115, 86, 43, 125, 93, 55, 128, 100, 56, 130, 102, 56, 106, 81, 41, 74, 57, 40, 104, 72, 41, 52, 29, 5, 54, 29, 9, 62, 30, 7, 118, 71, 29, 81, 45, 8, 99, 54, 16, 101, 52, 10, 112, 69, 28, 181, 121, 50, 185, 125, 47, 139, 83, 24, 127, 64, 9, 119, 62, 12, 160, 100, 37, 175, 115, 51, 168, 102, 34, 174, 104, 34, 155, 83, 22, 148, 81, 22, 150, + 81, 28, 123, 61, 21, 85, 35, 3, 125, 68, 18, 138, 76, 18, 135, 73, 17, 160, 97, 31, 175, 114, 46, 191, 126, 54, 218, 160, 86, 209, 150, 78, 219, 166, 97, 228, 182, 108, 241, 201, 128, 228, 187, 114, 213, 175, 105, 188, 143, 76, 130, 82, 27, 158, 95, 35, 200, 133, 60, 159, 93, 27, 156, 82, 14, 174, 98, 19, 186, 103, 22, 189, 109, 21, 188, 104, 20, 172, 89, 9, 176, 98, 21, 179, 98, 22, 175, 93, 18, 175, 96, 17, 182, 101, 18, 182, 99, 16, 175, 96, 21, 189, 120, 51, 203, 136, 61, 155, 83, 20, 171, 117, 56, 191, 133, 65, 208, 166, 101, 229, 188, 111, 209, 157, 91, 190, 135, 72, 185, 125, 58, 196, 138, 65, 209, 150, 76, 216, 158, 86, 205, 143, 73, 184, 114, 46, 153, 82, 29, 118, 53, 16, 142, 74, 27, 156, 84, 33, 169, 102, + 39, 186, 119, 53, 190, 121, 54, 195, 131, 64, 199, 142, 78, 172, 118, 65, 153, 103, 53, 149, 99, 52, 122, 71, 26, 76, 35, 11, 66, 26, 6, 94, 48, 14, 129, 78, 26, 139, 79, 34, 155, 96, 34, 165, 109, 48, 173, 110, 43, 180, 121, 61, 171, 128, 80, 144, 152, 169, 116, 160, 208, 108, 174, 236, 113, 189, 247, 112, 184, 242, 107, 177, 238, 94, 155, 208, 79, 113, 132, 61, 74, 71, 33, 40, 27, 25, 31, 15, 30, 36, 23, 33, 38, 19, 49, 54, 35, 62, 80, 71, 81, 124, 146, 90, 131, 156, 97, 127, 141, 106, 125, 144, 102, 124, 144, 84, 120, 158, 82, 103, 121, 67, 68, 48, 70, 63, 32, 76, 73, 61, 75, 60, 26, 76, 52, 8, 88, 69, 37, 98, 95, 87, 98, 97, 97, 92, 96, 92, 98, 117, 135, 104, 132, 163, 105, 137, 179, 94, 131, 177, + 88, 83, 58, 101, 89, 41, 94, 83, 45, 113, 117, 104, 116, 132, 142, 116, 118, 104, 117, 122, 77, 96, 106, 97, 100, 99, 61, 87, 84, 50, 110, 135, 141, 99, 127, 157, 116, 107, 87, 96, 98, 84, 87, 81, 45, 97, 92, 60, 105, 94, 62, 122, 121, 85, 122, 143, 157, 120, 148, 168, 117, 150, 171, 115, 149, 176, 106, 142, 172, 100, 119, 117, 101, 130, 150, 78, 72, 61, 87, 61, 14, 105, 76, 32, 117, 90, 49, 127, 98, 61, 122, 95, 50, 84, 70, 54, 75, 67, 64, 80, 51, 31, 83, 48, 17, 50, 22, 2, 57, 25, 7, 117, 70, 28, 48, 20, 0, 67, 30, 5, 82, 42, 14, 157, 104, 46, 155, 99, 35, 148, 88, 27, 137, 71, 16, 112, 55, 12, 146, 86, 32, 183, 123, 58, 181, 119, 53, 175, 111, 41, 162, 92, 29, 162, 93, 31, 168, 100, 38, 162, + 96, 39, 128, 67, 24, 82, 35, 7, 88, 39, 7, 131, 71, 17, 134, 76, 14, 140, 77, 17, 180, 112, 41, 194, 127, 56, 212, 156, 87, 220, 166, 95, 215, 170, 102, 216, 176, 111, 216, 187, 125, 203, 160, 94, 227, 181, 108, 194, 146, 78, 137, 87, 32, 128, 69, 20, 190, 122, 50, 168, 100, 29, 160, 90, 20, 161, 84, 13, 162, 81, 10, 177, 94, 17, 183, 105, 23, 173, 100, 21, 160, 87, 17, 168, 93, 18, 159, 84, 13, 155, 80, 13, 155, 75, 7, 164, 81, 7, 175, 95, 20, 172, 96, 24, 169, 101, 40, 144, 76, 22, 169, 111, 49, 196, 139, 65, 208, 168, 105, 199, 157, 97, 189, 148, 86, 184, 131, 67, 187, 130, 63, 197, 136, 62, 203, 139, 68, 200, 135, 65, 186, 111, 45, 181, 108, 40, 163, 93, 35, 128, 61, 20, 147, 78, 32, 160, 90, 37, 172, 104, + 45, 186, 115, 55, 194, 130, 65, 190, 128, 62, 198, 139, 74, 201, 146, 81, 203, 148, 79, 187, 131, 71, 155, 99, 46, 129, 75, 31, 121, 76, 38, 86, 49, 19, 76, 42, 16, 94, 52, 17, 114, 68, 27, 123, 76, 32, 142, 90, 36, 154, 105, 57, 129, 108, 95, 115, 129, 153, 114, 143, 176, 100, 130, 153, 89, 110, 116, 84, 99, 94, 74, 88, 83, 55, 61, 43, 43, 47, 19, 41, 58, 57, 45, 90, 122, 69, 113, 129, 72, 121, 136, 81, 123, 130, 87, 127, 129, 89, 120, 117, 71, 110, 118, 81, 119, 143, 93, 133, 160, 102, 135, 166, 98, 141, 183, 83, 119, 156, 70, 81, 89, 72, 71, 71, 69, 56, 26, 72, 57, 19, 80, 61, 10, 87, 65, 12, 93, 69, 14, 87, 59, 27, 82, 58, 26, 84, 72, 51, 93, 98, 99, 104, 124, 147, 112, 132, 155, 117, 129, 126, + 111, 105, 72, 105, 88, 43, 102, 80, 45, 111, 91, 52, 127, 110, 68, 127, 115, 73, 117, 117, 84, 95, 92, 65, 81, 65, 7, 90, 74, 21, 90, 86, 48, 80, 69, 40, 81, 64, 17, 82, 70, 10, 87, 79, 26, 91, 92, 72, 89, 75, 33, 110, 91, 50, 119, 122, 110, 120, 152, 178, 117, 161, 208, 115, 161, 214, 104, 146, 193, 102, 129, 143, 84, 81, 61, 71, 45, 10, 77, 48, 8, 87, 57, 20, 109, 77, 42, 116, 89, 52, 111, 84, 50, 77, 68, 58, 63, 58, 59, 73, 50, 34, 76, 37, 14, 64, 29, 6, 73, 40, 14, 86, 46, 12, 47, 18, 1, 70, 39, 16, 146, 97, 38, 157, 105, 36, 135, 82, 24, 142, 80, 21, 103, 51, 11, 135, 75, 26, 164, 104, 38, 188, 132, 63, 185, 126, 55, 173, 106, 40, 164, 95, 33, 170, 99, 38, 176, 108, 42, 174, + 107, 46, 136, 73, 25, 98, 52, 14, 59, 20, 0, 112, 50, 9, 106, 50, 7, 116, 59, 8, 140, 75, 15, 150, 87, 29, 174, 114, 53, 205, 154, 87, 211, 161, 93, 209, 160, 93, 227, 190, 125, 210, 165, 99, 234, 191, 115, 160, 112, 57, 108, 51, 7, 156, 92, 30, 188, 122, 46, 170, 100, 27, 142, 73, 6, 151, 77, 13, 173, 96, 19, 176, 97, 21, 165, 92, 18, 147, 77, 11, 137, 69, 5, 154, 84, 17, 154, 83, 16, 157, 90, 18, 153, 81, 12, 131, 59, 0, 166, 85, 13, 181, 106, 27, 182, 115, 45, 124, 65, 18, 149, 88, 25, 194, 134, 62, 207, 165, 97, 193, 147, 82, 186, 134, 71, 197, 147, 81, 196, 139, 71, 203, 142, 71, 211, 148, 81, 180, 108, 43, 174, 96, 38, 179, 106, 37, 148, 78, 23, 126, 60, 21, 138, 73, 28, 130, 66, 25, 154, 89, + 39, 174, 103, 47, 187, 125, 66, 200, 138, 70, 202, 142, 77, 198, 144, 76, 205, 150, 81, 208, 145, 74, 204, 142, 69, 200, 140, 70, 194, 136, 67, 184, 129, 66, 159, 104, 37, 108, 66, 27, 77, 44, 14, 102, 61, 22, 131, 76, 25, 148, 92, 35, 160, 112, 67, 108, 97, 80, 85, 83, 59, 74, 71, 32, 62, 57, 13, 59, 54, 15, 55, 57, 23, 49, 48, 11, 51, 49, 5, 60, 80, 72, 80, 133, 164, 86, 143, 167, 79, 141, 172, 91, 140, 154, 95, 145, 154, 89, 133, 117, 67, 91, 64, 70, 89, 91, 89, 128, 156, 98, 143, 179, 102, 161, 217, 81, 125, 175, 67, 79, 92, 87, 83, 81, 81, 65, 26, 80, 63, 8, 91, 73, 20, 97, 78, 36, 101, 85, 54, 99, 93, 85, 107, 100, 78, 98, 91, 70, 89, 67, 32, 84, 63, 35, 90, 79, 56, 108, 96, 44, + 138, 126, 35, 127, 102, 36, 134, 108, 48, 129, 103, 37, 126, 102, 38, 115, 94, 39, 107, 93, 53, 88, 78, 30, 78, 62, 4, 97, 85, 17, 90, 81, 15, 80, 70, 17, 74, 67, 38, 78, 65, 17, 86, 73, 28, 87, 74, 31, 93, 72, 17, 107, 83, 30, 116, 108, 77, 116, 150, 184, 118, 168, 228, 115, 168, 232, 100, 139, 179, 94, 108, 112, 79, 64, 33, 81, 54, 10, 82, 50, 12, 80, 48, 14, 94, 62, 29, 106, 78, 41, 96, 72, 42, 90, 82, 77, 64, 53, 50, 63, 35, 16, 70, 35, 10, 70, 32, 6, 66, 28, 5, 54, 23, 5, 45, 19, 3, 114, 73, 27, 164, 107, 40, 149, 91, 29, 137, 80, 22, 98, 46, 8, 137, 77, 18, 170, 103, 33, 184, 125, 55, 182, 122, 51, 182, 115, 49, 179, 112, 42, 170, 102, 35, 168, 101, 38, 167, 99, 40, 156, + 92, 40, 160, 97, 45, 132, 71, 30, 63, 25, 6, 91, 38, 5, 97, 42, 6, 88, 39, 5, 140, 76, 17, 165, 104, 43, 176, 122, 59, 197, 146, 81, 214, 164, 95, 229, 184, 115, 226, 187, 123, 223, 182, 117, 192, 142, 84, 124, 72, 24, 100, 47, 9, 170, 105, 37, 173, 102, 26, 142, 70, 10, 120, 55, 2, 142, 71, 10, 144, 74, 12, 138, 75, 14, 132, 72, 12, 139, 74, 10, 147, 85, 20, 140, 83, 22, 134, 77, 17, 141, 83, 20, 151, 86, 19, 151, 82, 16, 136, 61, 4, 151, 73, 7, 182, 115, 41, 174, 111, 50, 128, 65, 16, 155, 96, 33, 197, 142, 72, 182, 124, 58, 179, 118, 54, 203, 151, 84, 205, 151, 82, 207, 148, 78, 197, 133, 66, 176, 103, 42, 176, 104, 39, 174, 103, 36, 129, 61, 15, 122, 58, 16, 129, 65, 25, 116, 59, 23, 105, 47, + 13, 142, 77, 31, 184, 119, 61, 190, 128, 63, 194, 134, 66, 196, 134, 64, 200, 136, 68, 194, 127, 57, 195, 127, 53, 200, 135, 62, 205, 142, 67, 205, 146, 78, 186, 124, 58, 155, 93, 33, 142, 85, 29, 135, 85, 36, 125, 73, 25, 145, 84, 30, 161, 101, 44, 147, 101, 52, 103, 75, 38, 69, 57, 19, 43, 39, 7, 37, 39, 19, 34, 40, 18, 30, 32, 7, 37, 37, 7, 43, 45, 18, 52, 53, 30, 38, 50, 39, 28, 49, 48, 34, 54, 45, 53, 74, 63, 68, 85, 44, 63, 78, 22, 77, 89, 62, 89, 101, 87, 86, 113, 124, 98, 134, 155, 100, 115, 115, 85, 75, 39, 95, 75, 27, 101, 79, 23, 91, 70, 13, 87, 67, 14, 86, 66, 30, 89, 71, 51, 86, 72, 55, 86, 68, 40, 92, 77, 47, 95, 76, 35, 94, 73, 21, 90, 66, 13, 82, 58, 11, + 136, 118, 16, 137, 119, 37, 114, 98, 24, 102, 82, 18, 93, 77, 18, 86, 65, 10, 90, 70, 10, 96, 82, 5, 93, 83, 5, 103, 95, 12, 98, 92, 7, 87, 84, 39, 82, 78, 61, 97, 90, 65, 92, 91, 75, 96, 79, 21, 105, 88, 32, 108, 96, 63, 118, 102, 57, 123, 129, 119, 114, 140, 160, 108, 143, 179, 106, 126, 131, 92, 88, 55, 90, 65, 13, 101, 70, 20, 97, 62, 19, 87, 51, 17, 85, 53, 19, 91, 64, 30, 75, 51, 32, 73, 51, 36, 66, 39, 18, 58, 28, 9, 60, 26, 7, 58, 25, 4, 58, 28, 8, 56, 25, 6, 88, 54, 22, 147, 99, 39, 170, 111, 51, 139, 82, 27, 106, 53, 14, 159, 98, 37, 178, 112, 41, 190, 128, 57, 187, 124, 54, 172, 110, 42, 180, 113, 43, 192, 127, 56, 177, 113, 44, 167, 99, 32, 169, 105, 42, 166, + 99, 45, 168, 108, 51, 144, 81, 35, 84, 40, 15, 74, 23, 2, 98, 43, 5, 77, 29, 4, 117, 56, 10, 161, 97, 37, 182, 125, 61, 195, 144, 78, 207, 163, 95, 221, 173, 104, 215, 169, 100, 208, 159, 95, 149, 98, 47, 129, 74, 25, 132, 70, 18, 169, 104, 36, 167, 97, 27, 110, 45, 0, 122, 65, 9, 124, 63, 11, 124, 65, 12, 126, 69, 15, 123, 67, 13, 134, 73, 18, 140, 81, 21, 125, 73, 19, 122, 70, 19, 127, 76, 22, 137, 85, 27, 151, 90, 27, 139, 71, 11, 142, 62, 1, 186, 115, 40, 186, 121, 52, 137, 74, 23, 134, 71, 18, 188, 124, 55, 190, 128, 61, 189, 129, 64, 200, 144, 75, 208, 153, 87, 211, 152, 82, 203, 141, 71, 166, 94, 31, 163, 84, 23, 162, 90, 28, 97, 37, 3, 145, 83, 38, 138, 79, 35, 115, 59, 26, 101, 49, + 19, 125, 66, 21, 153, 94, 38, 180, 119, 57, 192, 127, 59, 193, 127, 61, 180, 113, 46, 179, 109, 45, 173, 104, 37, 175, 106, 36, 192, 125, 54, 209, 148, 74, 209, 147, 76, 203, 140, 71, 175, 116, 55, 165, 104, 47, 146, 90, 35, 154, 86, 28, 162, 97, 34, 161, 101, 42, 142, 94, 50, 73, 60, 35, 70, 87, 99, 79, 128, 174, 78, 139, 195, 49, 83, 107, 24, 28, 14, 25, 33, 25, 23, 30, 20, 15, 20, 12, 8, 15, 10, 8, 15, 8, 13, 17, 3, 30, 32, 0, 52, 50, 1, 56, 53, 14, 47, 43, 8, 55, 49, 17, 88, 77, 23, 100, 86, 10, 111, 92, 18, 114, 91, 21, 99, 76, 12, 81, 59, 8, 71, 47, 8, 68, 41, 9, 69, 41, 10, 70, 41, 8, 74, 45, 7, 81, 51, 12, 84, 57, 10, 86, 62, 12, 85, 64, 14, 79, 59, 20, + 93, 78, 11, 93, 78, 8, 81, 68, 2, 94, 82, 13, 95, 86, 5, 94, 78, 8, 100, 80, 10, 110, 99, 7, 108, 99, 8, 104, 98, 9, 105, 94, 2, 107, 104, 47, 100, 89, 62, 106, 100, 73, 98, 90, 40, 106, 92, 19, 112, 106, 64, 101, 96, 74, 107, 88, 41, 125, 102, 32, 114, 110, 82, 109, 114, 113, 109, 112, 97, 99, 88, 32, 104, 76, 12, 116, 87, 28, 107, 74, 30, 95, 61, 22, 81, 52, 18, 75, 49, 19, 75, 49, 24, 76, 50, 29, 65, 32, 10, 64, 29, 8, 55, 24, 4, 43, 16, 0, 54, 31, 14, 77, 38, 13, 134, 83, 35, 137, 83, 24, 127, 73, 25, 139, 79, 24, 147, 92, 34, 145, 87, 33, 185, 124, 50, 188, 123, 49, 182, 121, 46, 170, 107, 43, 187, 126, 54, 189, 126, 56, 183, 116, 49, 183, 120, 51, 174, 111, 46, 168, + 104, 42, 171, 109, 48, 164, 100, 48, 119, 64, 26, 73, 26, 4, 97, 43, 7, 46, 15, 1, 106, 57, 13, 143, 91, 33, 162, 109, 45, 197, 150, 86, 175, 122, 64, 198, 144, 78, 194, 140, 70, 177, 127, 63, 128, 71, 23, 120, 66, 19, 141, 77, 15, 166, 100, 33, 156, 85, 18, 114, 58, 13, 115, 63, 11, 123, 70, 20, 126, 73, 16, 109, 60, 15, 99, 57, 16, 110, 58, 16, 116, 65, 16, 89, 50, 15, 70, 45, 20, 81, 51, 25, 98, 57, 17, 105, 65, 27, 135, 81, 26, 150, 82, 17, 174, 106, 35, 193, 130, 59, 158, 95, 32, 150, 84, 21, 156, 89, 31, 182, 118, 45, 190, 132, 61, 209, 156, 90, 206, 152, 84, 208, 151, 86, 206, 145, 74, 160, 94, 31, 141, 67, 12, 149, 77, 21, 119, 59, 21, 149, 81, 35, 146, 83, 38, 125, 68, 32, 103, 46, + 14, 126, 65, 23, 148, 79, 28, 178, 116, 58, 181, 115, 52, 185, 116, 49, 182, 117, 52, 193, 126, 58, 179, 112, 48, 174, 108, 49, 166, 98, 39, 195, 136, 67, 208, 151, 80, 206, 142, 68, 199, 138, 66, 188, 127, 53, 174, 117, 54, 158, 96, 36, 163, 97, 32, 163, 97, 32, 152, 96, 45, 104, 91, 81, 77, 132, 183, 91, 158, 222, 91, 161, 224, 52, 95, 125, 26, 46, 55, 46, 102, 151, 65, 128, 191, 54, 115, 162, 40, 81, 110, 14, 24, 17, 9, 12, 3, 18, 20, 4, 28, 30, 6, 26, 25, 5, 24, 24, 3, 49, 43, 3, 64, 55, 2, 74, 59, 0, 79, 62, 3, 77, 57, 4, 70, 48, 5, 65, 42, 5, 65, 39, 5, 65, 39, 12, 71, 45, 19, 74, 53, 34, 77, 57, 34, 82, 72, 60, 78, 68, 55, 82, 84, 85, 88, 109, 130, 91, 119, 155, + 113, 103, 36, 115, 102, 26, 109, 95, 22, 112, 102, 25, 95, 87, 15, 96, 82, 11, 120, 109, 29, 111, 103, 22, 112, 95, 14, 127, 112, 41, 118, 105, 26, 106, 92, 9, 101, 81, 19, 102, 87, 32, 102, 88, 20, 107, 95, 19, 107, 96, 35, 110, 98, 58, 109, 105, 92, 107, 94, 61, 120, 105, 64, 110, 102, 64, 106, 99, 48, 103, 79, 10, 112, 83, 14, 121, 91, 35, 117, 83, 40, 100, 66, 31, 83, 50, 20, 77, 50, 19, 84, 53, 19, 70, 39, 10, 60, 27, 4, 59, 24, 2, 50, 21, 3, 55, 28, 10, 69, 41, 14, 112, 73, 30, 124, 83, 31, 127, 80, 24, 129, 79, 24, 132, 83, 31, 162, 111, 51, 194, 137, 66, 189, 126, 52, 187, 127, 54, 174, 116, 49, 156, 95, 32, 176, 117, 47, 185, 124, 51, 182, 116, 47, 186, 121, 51, 181, 116, 51, 167, + 103, 42, 160, 102, 45, 146, 81, 30, 131, 68, 22, 85, 32, 6, 152, 90, 32, 113, 68, 24, 102, 57, 14, 128, 77, 24, 156, 103, 41, 171, 116, 50, 177, 122, 61, 181, 124, 56, 171, 116, 49, 156, 105, 50, 145, 90, 36, 132, 74, 22, 159, 90, 26, 167, 101, 33, 133, 76, 21, 122, 67, 17, 135, 80, 22, 131, 78, 24, 109, 68, 22, 106, 65, 23, 103, 63, 25, 98, 59, 23, 96, 58, 19, 77, 54, 31, 67, 56, 48, 77, 60, 43, 67, 48, 28, 91, 56, 20, 119, 66, 16, 148, 76, 14, 168, 99, 33, 195, 138, 67, 179, 110, 45, 147, 80, 25, 154, 90, 31, 183, 122, 59, 207, 149, 85, 200, 144, 78, 198, 145, 85, 198, 143, 75, 194, 134, 66, 124, 63, 19, 119, 58, 16, 151, 84, 28, 141, 74, 29, 154, 91, 40, 154, 93, 37, 137, 76, 34, 129, 69, + 28, 133, 69, 27, 140, 74, 28, 170, 103, 46, 175, 107, 48, 177, 113, 54, 179, 112, 48, 184, 118, 55, 180, 115, 54, 181, 112, 45, 181, 118, 53, 191, 131, 66, 192, 133, 68, 196, 139, 72, 207, 146, 73, 190, 129, 62, 176, 119, 56, 157, 103, 43, 157, 95, 37, 166, 100, 39, 157, 96, 46, 112, 90, 76, 85, 104, 127, 66, 111, 152, 63, 124, 180, 57, 106, 140, 58, 96, 112, 75, 136, 188, 86, 152, 212, 82, 150, 210, 72, 132, 182, 43, 67, 69, 37, 61, 69, 59, 76, 76, 70, 82, 78, 71, 93, 102, 58, 73, 79, 60, 87, 108, 64, 87, 99, 66, 79, 82, 65, 75, 76, 61, 58, 44, 68, 58, 29, 81, 77, 55, 90, 83, 62, 91, 89, 77, 95, 93, 90, 101, 104, 107, 99, 101, 104, 94, 102, 108, 96, 111, 127, 97, 128, 165, 106, 148, 198, 108, 155, 213, + 148, 139, 60, 134, 120, 57, 129, 115, 49, 109, 98, 29, 87, 76, 11, 93, 89, 21, 116, 114, 32, 120, 118, 48, 137, 116, 52, 149, 128, 82, 131, 110, 39, 116, 95, 4, 115, 91, 14, 105, 92, 42, 103, 87, 22, 105, 92, 28, 104, 86, 23, 112, 103, 75, 106, 106, 105, 105, 105, 102, 118, 94, 44, 110, 92, 22, 104, 83, 10, 105, 77, 4, 113, 83, 14, 124, 90, 41, 122, 89, 45, 106, 75, 39, 83, 54, 21, 86, 52, 15, 84, 47, 10, 72, 35, 3, 65, 29, 3, 51, 19, 1, 44, 17, 2, 59, 34, 14, 83, 52, 22, 117, 77, 33, 133, 91, 34, 98, 58, 13, 106, 68, 31, 186, 134, 63, 197, 139, 65, 190, 129, 57, 186, 129, 61, 165, 108, 45, 155, 95, 33, 154, 93, 35, 161, 106, 42, 168, 108, 41, 172, 111, 43, 182, 121, 51, 187, 127, 56, 174, + 111, 47, 159, 97, 39, 143, 79, 29, 117, 52, 10, 81, 29, 1, 155, 88, 29, 177, 122, 58, 128, 78, 23, 156, 105, 47, 130, 77, 23, 152, 96, 37, 168, 120, 62, 165, 109, 46, 149, 96, 38, 148, 92, 37, 151, 96, 40, 147, 86, 29, 165, 98, 34, 158, 98, 34, 147, 91, 31, 146, 88, 23, 146, 90, 23, 106, 64, 18, 59, 38, 16, 82, 59, 30, 103, 72, 36, 92, 65, 33, 83, 56, 22, 81, 60, 39, 81, 72, 58, 91, 77, 66, 83, 66, 50, 69, 42, 21, 84, 43, 7, 147, 78, 12, 182, 114, 43, 183, 118, 48, 192, 129, 57, 168, 103, 45, 146, 82, 26, 178, 116, 55, 193, 129, 66, 201, 141, 72, 191, 134, 72, 186, 124, 56, 167, 110, 55, 105, 48, 14, 160, 96, 35, 148, 83, 25, 142, 72, 20, 152, 85, 31, 156, 92, 39, 137, 78, 33, 131, 70, + 26, 144, 79, 30, 155, 88, 36, 165, 96, 37, 176, 110, 47, 181, 114, 48, 181, 114, 48, 184, 112, 45, 190, 115, 46, 188, 116, 45, 195, 127, 55, 200, 141, 71, 192, 137, 75, 179, 125, 69, 192, 135, 69, 208, 148, 73, 184, 125, 60, 178, 118, 49, 177, 120, 53, 174, 115, 46, 176, 113, 52, 138, 99, 66, 84, 101, 123, 84, 124, 164, 94, 162, 227, 101, 164, 217, 96, 142, 158, 103, 157, 203, 102, 166, 211, 95, 161, 206, 89, 145, 179, 57, 80, 86, 59, 76, 77, 71, 84, 62, 84, 99, 94, 79, 105, 117, 66, 85, 95, 61, 82, 94, 57, 65, 59, 59, 67, 62, 70, 95, 113, 72, 96, 120, 83, 111, 138, 99, 143, 189, 107, 141, 183, 106, 131, 158, 106, 115, 115, 99, 102, 97, 92, 99, 103, 94, 123, 160, 102, 142, 190, 107, 151, 198, 107, 148, 194, 106, 149, 199, + 125, 111, 30, 119, 107, 36, 108, 96, 23, 94, 88, 21, 93, 97, 39, 64, 63, 7, 94, 91, 16, 116, 116, 43, 123, 108, 37, 144, 119, 41, 136, 107, 18, 139, 113, 37, 115, 95, 35, 109, 89, 31, 108, 93, 27, 111, 100, 43, 100, 95, 75, 109, 98, 82, 106, 102, 92, 103, 101, 101, 107, 98, 87, 109, 85, 23, 99, 72, 9, 109, 78, 9, 116, 86, 21, 122, 86, 40, 120, 86, 43, 100, 69, 31, 91, 57, 21, 90, 56, 16, 80, 44, 6, 70, 34, 3, 55, 24, 0, 46, 19, 0, 44, 20, 2, 82, 54, 22, 82, 50, 16, 103, 69, 25, 75, 43, 14, 135, 89, 35, 193, 134, 58, 186, 129, 59, 179, 127, 54, 178, 122, 50, 171, 111, 40, 176, 119, 51, 164, 105, 39, 151, 95, 32, 142, 93, 36, 181, 124, 55, 182, 124, 55, 179, 120, 54, 191, 130, 61, 179, + 120, 56, 160, 102, 44, 139, 79, 26, 119, 60, 18, 93, 43, 11, 153, 90, 33, 168, 113, 50, 136, 84, 30, 149, 94, 36, 135, 82, 31, 140, 91, 35, 127, 81, 25, 128, 78, 27, 124, 73, 27, 159, 103, 47, 147, 94, 38, 179, 115, 44, 166, 107, 43, 153, 93, 31, 183, 128, 57, 148, 93, 26, 111, 65, 19, 41, 25, 9, 38, 32, 22, 76, 65, 50, 92, 73, 50, 99, 77, 52, 85, 64, 40, 84, 72, 57, 121, 116, 104, 130, 125, 115, 75, 71, 62, 50, 40, 29, 79, 48, 18, 154, 95, 31, 192, 130, 53, 180, 112, 45, 191, 126, 51, 180, 111, 45, 164, 106, 53, 157, 101, 44, 171, 110, 47, 183, 121, 54, 194, 135, 68, 186, 126, 57, 143, 89, 38, 110, 50, 14, 180, 116, 45, 163, 94, 33, 155, 86, 29, 159, 90, 34, 158, 94, 42, 155, 95, 43, 158, 94, + 37, 163, 99, 39, 164, 97, 38, 169, 101, 40, 170, 103, 40, 181, 110, 43, 179, 110, 47, 170, 104, 43, 171, 103, 43, 179, 108, 43, 186, 116, 49, 206, 140, 67, 203, 145, 74, 191, 134, 76, 166, 112, 60, 186, 130, 61, 205, 145, 75, 191, 125, 54, 178, 118, 49, 167, 103, 39, 163, 98, 36, 162, 103, 53, 126, 106, 92, 87, 117, 137, 94, 146, 188, 111, 153, 178, 123, 140, 141, 113, 135, 134, 98, 124, 114, 86, 119, 116, 77, 101, 97, 78, 103, 121, 92, 120, 144, 77, 104, 122, 69, 98, 114, 71, 103, 124, 70, 82, 87, 71, 69, 51, 60, 60, 37, 65, 76, 74, 76, 109, 139, 81, 117, 160, 92, 134, 185, 105, 162, 223, 114, 168, 232, 111, 155, 210, 99, 103, 107, 94, 101, 105, 100, 131, 174, 107, 154, 209, 109, 155, 212, 105, 148, 201, 99, 141, 188, 97, 137, 185, + 117, 105, 35, 100, 89, 15, 87, 79, 14, 96, 101, 34, 78, 90, 24, 66, 65, 13, 110, 104, 50, 105, 102, 30, 93, 85, 16, 117, 97, 12, 135, 105, 28, 138, 110, 57, 113, 83, 33, 109, 89, 51, 112, 109, 97, 116, 120, 114, 105, 113, 128, 112, 121, 144, 109, 117, 144, 114, 132, 167, 106, 123, 158, 97, 89, 80, 104, 76, 18, 108, 79, 12, 123, 93, 33, 134, 102, 52, 117, 85, 42, 106, 71, 31, 99, 65, 22, 95, 58, 16, 78, 40, 6, 65, 27, 1, 56, 25, 2, 50, 25, 2, 61, 33, 7, 54, 26, 5, 112, 72, 21, 124, 81, 29, 155, 106, 44, 172, 118, 49, 191, 137, 65, 174, 123, 55, 180, 124, 52, 168, 113, 47, 165, 111, 47, 181, 123, 53, 162, 99, 35, 145, 90, 34, 137, 86, 31, 173, 114, 44, 172, 111, 45, 176, 119, 55, 197, 141, 72, 196, + 138, 74, 175, 120, 62, 168, 111, 57, 117, 61, 21, 103, 49, 14, 173, 109, 44, 167, 112, 49, 158, 103, 42, 126, 74, 21, 150, 100, 42, 143, 98, 42, 114, 69, 28, 89, 51, 14, 126, 73, 26, 156, 100, 45, 148, 85, 29, 176, 108, 36, 160, 100, 35, 157, 106, 37, 148, 104, 39, 88, 60, 24, 58, 43, 27, 45, 37, 28, 52, 50, 42, 73, 64, 53, 94, 79, 64, 105, 82, 58, 103, 77, 49, 101, 86, 64, 135, 128, 115, 141, 136, 123, 109, 104, 93, 80, 65, 52, 86, 68, 48, 111, 70, 30, 188, 130, 61, 202, 138, 57, 188, 119, 42, 197, 130, 54, 180, 120, 58, 161, 102, 47, 163, 100, 37, 191, 129, 58, 190, 125, 55, 182, 120, 51, 148, 87, 35, 156, 88, 30, 195, 128, 56, 182, 115, 48, 163, 92, 30, 162, 94, 34, 162, 96, 39, 165, 99, 37, 174, 107, + 44, 184, 122, 58, 183, 117, 53, 173, 101, 38, 170, 99, 36, 178, 104, 37, 180, 105, 32, 189, 125, 53, 187, 123, 58, 166, 98, 36, 178, 111, 44, 194, 129, 58, 209, 148, 76, 204, 146, 74, 170, 114, 58, 149, 94, 39, 180, 114, 46, 198, 137, 65, 186, 126, 54, 172, 109, 43, 161, 98, 36, 164, 103, 44, 152, 105, 67, 109, 109, 104, 95, 122, 135, 118, 133, 129, 130, 131, 93, 122, 128, 85, 99, 104, 36, 76, 88, 47, 75, 81, 66, 98, 108, 107, 97, 103, 106, 80, 97, 118, 82, 120, 171, 87, 137, 195, 94, 136, 190, 103, 119, 141, 88, 114, 139, 83, 118, 162, 82, 124, 169, 84, 120, 159, 83, 109, 142, 95, 137, 187, 104, 150, 203, 100, 126, 161, 95, 109, 128, 91, 112, 143, 94, 129, 170, 101, 139, 189, 103, 144, 195, 103, 147, 198, 99, 146, 202, 101, 155, 215, + 107, 89, 21, 92, 75, 9, 85, 80, 20, 60, 67, 18, 59, 74, 30, 76, 74, 23, 125, 112, 63, 100, 92, 42, 73, 59, 8, 113, 92, 18, 131, 105, 43, 111, 82, 34, 102, 73, 26, 109, 93, 69, 102, 98, 93, 111, 97, 71, 105, 103, 98, 109, 109, 107, 112, 118, 128, 107, 130, 155, 107, 135, 173, 91, 98, 120, 108, 77, 24, 109, 78, 16, 113, 78, 23, 113, 78, 29, 117, 82, 37, 112, 77, 32, 104, 70, 26, 90, 52, 11, 69, 33, 3, 61, 32, 7, 60, 31, 7, 55, 28, 3, 58, 30, 3, 98, 60, 18, 149, 99, 35, 134, 86, 32, 129, 82, 31, 165, 117, 51, 170, 122, 57, 165, 113, 49, 172, 120, 53, 152, 101, 42, 183, 128, 61, 182, 123, 51, 155, 96, 32, 155, 101, 41, 166, 110, 45, 167, 109, 45, 176, 116, 50, 181, 122, 55, 197, 142, 72, 193, + 136, 70, 176, 124, 66, 171, 118, 60, 147, 92, 38, 136, 81, 36, 150, 85, 28, 165, 108, 45, 167, 114, 50, 154, 102, 44, 156, 100, 39, 145, 94, 38, 126, 85, 37, 87, 53, 18, 139, 83, 31, 159, 100, 37, 161, 95, 23, 154, 93, 21, 170, 125, 58, 58, 43, 23, 53, 32, 4, 25, 11, 2, 45, 30, 14, 77, 53, 32, 96, 77, 62, 85, 69, 54, 86, 73, 58, 93, 73, 50, 107, 87, 54, 103, 85, 60, 92, 78, 62, 107, 86, 71, 124, 92, 72, 118, 82, 54, 82, 54, 35, 72, 45, 25, 76, 46, 17, 111, 75, 32, 195, 135, 59, 201, 132, 52, 192, 126, 52, 181, 122, 62, 149, 85, 28, 191, 126, 51, 191, 126, 54, 195, 133, 64, 192, 127, 57, 191, 124, 50, 196, 126, 52, 200, 136, 67, 168, 100, 41, 172, 106, 44, 166, 100, 40, 184, 124, 60, 188, 122, + 60, 196, 129, 59, 198, 130, 58, 195, 126, 53, 181, 107, 40, 179, 102, 35, 183, 109, 33, 188, 117, 43, 194, 126, 54, 185, 118, 55, 180, 112, 51, 189, 125, 56, 203, 140, 65, 204, 141, 72, 197, 138, 69, 151, 89, 34, 159, 95, 37, 168, 102, 33, 194, 134, 58, 190, 125, 55, 176, 108, 47, 164, 96, 37, 153, 96, 50, 124, 97, 77, 91, 101, 110, 97, 102, 86, 101, 96, 21, 99, 98, 17, 71, 69, 6, 58, 52, 10, 75, 65, 27, 95, 75, 37, 119, 106, 85, 112, 119, 129, 102, 126, 161, 107, 152, 209, 108, 152, 211, 97, 136, 187, 96, 143, 194, 101, 155, 215, 95, 140, 187, 90, 122, 155, 85, 98, 102, 90, 117, 147, 85, 92, 107, 91, 98, 100, 97, 127, 166, 109, 148, 201, 99, 138, 192, 97, 134, 179, 102, 148, 204, 110, 161, 223, 111, 166, 228, 111, 165, 226, + 78, 66, 7, 113, 104, 37, 82, 86, 33, 49, 54, 20, 49, 52, 16, 62, 61, 16, 89, 80, 20, 70, 57, 15, 72, 56, 5, 102, 83, 11, 107, 80, 22, 89, 66, 15, 106, 77, 27, 123, 94, 50, 121, 104, 69, 118, 122, 123, 115, 133, 161, 112, 132, 163, 117, 132, 152, 118, 138, 156, 113, 134, 159, 93, 76, 55, 105, 71, 13, 119, 85, 29, 110, 74, 25, 109, 72, 31, 109, 73, 27, 112, 74, 34, 109, 70, 29, 79, 42, 8, 70, 36, 7, 82, 50, 17, 77, 44, 12, 69, 36, 5, 77, 41, 9, 120, 75, 24, 121, 74, 23, 123, 81, 34, 160, 117, 53, 158, 113, 50, 159, 110, 46, 175, 125, 60, 172, 119, 53, 159, 106, 43, 185, 128, 56, 180, 120, 49, 164, 104, 41, 172, 113, 46, 159, 101, 37, 172, 112, 41, 171, 111, 43, 193, 136, 65, 189, 130, 65, 191, + 136, 74, 192, 139, 72, 173, 117, 55, 144, 87, 34, 148, 92, 39, 156, 95, 41, 186, 127, 63, 175, 115, 49, 158, 99, 39, 144, 88, 32, 155, 100, 42, 128, 88, 45, 70, 35, 6, 148, 92, 33, 158, 94, 29, 168, 100, 28, 161, 102, 33, 140, 99, 41, 48, 43, 33, 2, 1, 0, 7, 4, 1, 1, 0, 0, 10, 5, 1, 57, 34, 19, 125, 81, 52, 129, 79, 53, 122, 81, 53, 105, 76, 52, 114, 74, 50, 132, 86, 58, 134, 88, 60, 47, 30, 19, 6, 4, 1, 5, 2, 0, 34, 26, 18, 62, 55, 45, 90, 80, 68, 178, 123, 59, 209, 137, 63, 201, 129, 55, 190, 131, 65, 155, 94, 36, 191, 132, 64, 187, 125, 59, 186, 123, 55, 198, 132, 58, 190, 119, 51, 207, 142, 69, 198, 134, 66, 181, 110, 45, 189, 122, 56, 192, 129, 66, 181, 120, 64, 184, 124, + 66, 179, 115, 51, 192, 123, 51, 200, 132, 58, 198, 130, 56, 190, 120, 51, 181, 106, 37, 186, 108, 34, 196, 127, 58, 200, 136, 68, 189, 127, 64, 190, 125, 61, 204, 140, 70, 207, 143, 72, 202, 143, 73, 174, 109, 47, 159, 92, 31, 170, 100, 32, 175, 102, 33, 178, 109, 39, 174, 106, 42, 162, 95, 30, 158, 98, 47, 140, 97, 64, 115, 103, 87, 78, 81, 49, 75, 78, 5, 101, 100, 19, 98, 88, 22, 111, 88, 37, 118, 83, 35, 112, 81, 33, 117, 90, 45, 111, 101, 82, 104, 120, 142, 107, 140, 183, 104, 133, 181, 95, 121, 163, 92, 134, 185, 94, 144, 204, 96, 145, 198, 94, 130, 159, 85, 96, 92, 77, 71, 43, 100, 103, 84, 106, 143, 183, 113, 160, 214, 114, 166, 229, 114, 167, 228, 108, 158, 218, 104, 146, 196, 104, 147, 195, 104, 149, 204, 101, 139, 184, + 82, 66, 12, 110, 104, 39, 74, 79, 23, 51, 56, 23, 51, 52, 5, 70, 72, 8, 72, 72, 13, 58, 47, 3, 71, 53, 8, 98, 72, 18, 122, 98, 53, 115, 90, 45, 126, 92, 43, 153, 120, 70, 153, 135, 95, 137, 160, 190, 125, 156, 200, 121, 139, 160, 122, 120, 94, 123, 124, 96, 106, 103, 95, 93, 62, 7, 104, 71, 13, 114, 79, 22, 123, 93, 34, 113, 80, 35, 114, 79, 35, 119, 79, 38, 98, 57, 20, 83, 46, 12, 104, 67, 30, 119, 80, 33, 101, 64, 19, 87, 52, 16, 107, 64, 22, 143, 94, 30, 132, 86, 29, 129, 84, 36, 129, 90, 32, 169, 120, 54, 180, 130, 63, 184, 133, 64, 173, 118, 51, 177, 118, 51, 186, 127, 54, 180, 122, 53, 177, 113, 42, 153, 91, 26, 168, 106, 41, 172, 108, 41, 175, 115, 46, 193, 132, 59, 198, 144, 76, 191, + 139, 75, 192, 142, 79, 180, 126, 60, 162, 104, 43, 147, 90, 37, 163, 106, 47, 177, 112, 50, 173, 114, 47, 173, 108, 45, 195, 142, 70, 189, 142, 72, 64, 34, 8, 77, 38, 7, 159, 93, 27, 173, 106, 30, 156, 95, 27, 170, 108, 37, 164, 121, 53, 100, 87, 62, 6, 6, 5, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 81, 41, 18, 158, 90, 53, 151, 90, 57, 133, 79, 51, 158, 90, 52, 169, 100, 59, 43, 26, 15, 0, 0, 0, 1, 1, 1, 10, 11, 7, 81, 74, 65, 71, 64, 55, 113, 92, 61, 187, 128, 53, 213, 145, 60, 205, 142, 64, 204, 137, 61, 162, 104, 45, 182, 124, 52, 206, 152, 82, 206, 148, 79, 197, 136, 67, 206, 145, 79, 204, 144, 78, 198, 135, 68, 199, 133, 62, 203, 141, 71, 199, 141, 78, 200, 145, 80, 202, 148, + 86, 182, 125, 63, 169, 103, 40, 179, 109, 40, 204, 138, 63, 197, 127, 57, 193, 127, 52, 195, 126, 56, 188, 116, 47, 198, 133, 66, 194, 138, 72, 203, 139, 71, 197, 133, 66, 208, 146, 75, 203, 143, 70, 198, 135, 64, 177, 110, 43, 166, 96, 25, 177, 106, 36, 175, 102, 35, 179, 111, 42, 166, 99, 40, 164, 98, 39, 159, 109, 66, 125, 102, 76, 101, 96, 33, 105, 100, 15, 122, 114, 33, 128, 108, 40, 146, 114, 58, 142, 107, 51, 124, 92, 37, 114, 87, 36, 97, 73, 33, 94, 81, 59, 110, 108, 107, 142, 144, 155, 114, 130, 158, 84, 107, 140, 92, 131, 175, 103, 159, 217, 92, 134, 183, 74, 73, 57, 88, 77, 16, 109, 119, 111, 125, 142, 150, 120, 167, 223, 113, 168, 233, 110, 162, 222, 106, 154, 211, 107, 153, 205, 95, 129, 173, 90, 106, 123, 81, 89, 101, + 74, 58, 11, 81, 72, 19, 57, 54, 7, 52, 52, 7, 54, 55, 2, 76, 73, 8, 74, 65, 0, 78, 64, 15, 84, 64, 29, 91, 68, 26, 116, 92, 50, 124, 101, 57, 120, 90, 42, 139, 109, 46, 150, 125, 62, 136, 137, 129, 124, 125, 110, 122, 119, 84, 126, 121, 91, 120, 142, 165, 95, 88, 78, 98, 66, 8, 113, 81, 24, 112, 78, 20, 122, 90, 24, 110, 78, 29, 112, 74, 38, 102, 73, 52, 95, 56, 23, 116, 71, 27, 140, 92, 39, 123, 76, 24, 110, 69, 24, 124, 77, 26, 141, 95, 36, 118, 74, 19, 101, 60, 19, 135, 90, 31, 163, 118, 51, 176, 127, 56, 172, 122, 54, 187, 134, 62, 181, 129, 58, 174, 112, 44, 177, 119, 53, 183, 128, 59, 170, 111, 42, 164, 100, 33, 172, 108, 39, 177, 117, 48, 178, 120, 52, 170, 111, 51, 174, 122, 61, 197, + 140, 76, 196, 145, 80, 185, 131, 63, 174, 119, 59, 141, 87, 35, 134, 81, 30, 171, 112, 50, 190, 132, 66, 170, 112, 47, 176, 116, 50, 165, 114, 55, 62, 30, 2, 66, 30, 3, 139, 77, 15, 160, 95, 21, 186, 123, 43, 180, 118, 41, 192, 144, 70, 163, 134, 78, 111, 99, 71, 28, 26, 17, 6, 7, 3, 2, 2, 2, 0, 0, 0, 12, 5, 0, 127, 70, 32, 161, 93, 54, 137, 74, 40, 171, 97, 53, 102, 62, 37, 5, 5, 3, 7, 6, 3, 16, 14, 10, 36, 32, 26, 66, 57, 47, 124, 102, 71, 181, 135, 70, 217, 153, 68, 225, 155, 67, 228, 158, 75, 210, 138, 56, 177, 115, 48, 175, 116, 49, 192, 131, 63, 204, 140, 71, 210, 151, 83, 214, 155, 85, 202, 136, 64, 185, 119, 49, 201, 139, 68, 201, 139, 66, 193, 135, 69, 205, 150, 83, 196, 141, + 76, 196, 136, 67, 191, 129, 65, 177, 115, 53, 183, 115, 48, 193, 123, 55, 195, 125, 51, 195, 127, 55, 198, 128, 57, 197, 126, 57, 200, 141, 76, 183, 122, 62, 202, 137, 68, 201, 141, 66, 208, 146, 72, 205, 138, 65, 185, 119, 45, 169, 98, 32, 173, 104, 33, 180, 107, 39, 179, 108, 38, 172, 102, 36, 159, 93, 36, 168, 106, 50, 142, 100, 56, 114, 95, 29, 105, 96, 18, 113, 96, 30, 114, 94, 30, 134, 103, 36, 150, 114, 41, 140, 108, 49, 88, 64, 17, 75, 54, 7, 112, 77, 24, 148, 119, 91, 140, 130, 123, 115, 116, 119, 88, 99, 112, 82, 104, 131, 71, 97, 135, 72, 83, 96, 65, 56, 26, 75, 64, 17, 91, 89, 59, 99, 116, 128, 100, 131, 167, 100, 142, 193, 99, 137, 186, 100, 126, 153, 88, 97, 98, 74, 74, 65, 69, 73, 79, 86, 109, 146, + 75, 64, 8, 72, 66, 16, 78, 70, 13, 88, 78, 25, 86, 71, 14, 89, 77, 16, 85, 70, 6, 80, 66, 8, 86, 68, 12, 89, 67, 15, 104, 81, 37, 104, 78, 26, 117, 89, 28, 132, 104, 46, 129, 106, 36, 126, 107, 39, 122, 112, 55, 122, 127, 113, 124, 133, 142, 109, 142, 187, 93, 75, 45, 103, 70, 13, 111, 76, 23, 108, 72, 23, 113, 77, 22, 112, 77, 23, 112, 79, 47, 114, 78, 46, 127, 77, 28, 139, 87, 37, 123, 76, 28, 115, 70, 24, 143, 92, 35, 150, 98, 36, 128, 79, 21, 101, 56, 13, 132, 84, 29, 147, 101, 35, 171, 117, 48, 171, 119, 50, 176, 122, 56, 186, 129, 59, 177, 122, 49, 167, 108, 42, 184, 133, 68, 187, 133, 61, 162, 96, 31, 168, 106, 41, 180, 115, 45, 189, 125, 54, 177, 114, 50, 188, 130, 64, 182, 131, 67, 195, + 140, 74, 196, 141, 79, 182, 125, 63, 180, 125, 62, 172, 116, 52, 136, 82, 33, 143, 88, 38, 171, 111, 48, 167, 113, 50, 170, 113, 49, 123, 74, 25, 69, 35, 7, 44, 13, 0, 113, 56, 8, 121, 66, 14, 152, 89, 19, 187, 120, 40, 205, 152, 71, 209, 171, 100, 187, 165, 111, 140, 129, 94, 110, 105, 84, 65, 64, 54, 52, 50, 47, 9, 8, 7, 112, 56, 23, 156, 87, 45, 114, 54, 23, 168, 92, 47, 76, 47, 27, 46, 45, 41, 75, 72, 64, 99, 90, 76, 127, 114, 88, 153, 130, 88, 180, 147, 93, 222, 169, 93, 230, 161, 71, 229, 159, 72, 206, 136, 56, 194, 122, 43, 172, 102, 32, 174, 115, 52, 196, 140, 74, 204, 150, 83, 213, 159, 89, 203, 142, 69, 182, 107, 39, 183, 116, 49, 197, 131, 63, 203, 141, 70, 201, 143, 78, 201, 143, 75, 188, 132, + 64, 181, 119, 57, 194, 130, 59, 198, 138, 66, 183, 118, 52, 185, 117, 52, 192, 122, 52, 195, 127, 55, 196, 127, 57, 203, 135, 61, 199, 136, 64, 198, 139, 77, 197, 137, 70, 193, 124, 56, 205, 143, 67, 208, 146, 73, 194, 124, 49, 182, 111, 37, 175, 104, 36, 181, 110, 38, 177, 107, 35, 182, 112, 42, 163, 93, 34, 157, 93, 34, 166, 110, 50, 144, 110, 48, 108, 88, 23, 95, 79, 17, 113, 94, 22, 130, 101, 24, 146, 115, 36, 124, 97, 32, 75, 56, 9, 63, 47, 5, 93, 58, 17, 110, 72, 35, 129, 91, 52, 104, 80, 56, 64, 54, 35, 57, 51, 43, 61, 58, 52, 58, 46, 22, 71, 59, 23, 91, 78, 28, 81, 72, 41, 80, 75, 61, 84, 93, 108, 85, 94, 105, 81, 90, 103, 78, 81, 80, 74, 66, 41, 73, 67, 47, 81, 89, 95, 83, 94, 108, + 73, 65, 4, 93, 82, 9, 106, 90, 13, 122, 98, 31, 120, 94, 25, 107, 81, 21, 91, 72, 16, 73, 61, 2, 84, 73, 7, 105, 85, 15, 114, 87, 30, 134, 103, 45, 144, 124, 71, 128, 105, 46, 117, 98, 22, 121, 109, 38, 109, 102, 68, 117, 118, 111, 122, 130, 146, 98, 106, 125, 92, 64, 19, 104, 68, 18, 105, 69, 22, 108, 70, 30, 109, 72, 25, 121, 84, 31, 123, 83, 49, 130, 80, 32, 134, 82, 31, 132, 81, 31, 119, 74, 28, 142, 91, 35, 149, 95, 35, 140, 85, 24, 145, 90, 29, 139, 87, 32, 149, 100, 36, 150, 103, 38, 170, 119, 49, 157, 105, 41, 183, 127, 57, 190, 132, 61, 172, 114, 45, 194, 138, 69, 190, 134, 64, 163, 106, 37, 166, 105, 39, 174, 109, 39, 185, 120, 49, 186, 126, 53, 180, 120, 50, 203, 145, 73, 191, 140, 68, 197, + 146, 80, 190, 136, 69, 195, 142, 82, 182, 126, 65, 186, 128, 60, 166, 104, 40, 121, 67, 23, 113, 63, 23, 151, 96, 45, 156, 105, 41, 88, 45, 8, 65, 31, 6, 40, 15, 0, 60, 30, 1, 130, 78, 20, 142, 77, 14, 167, 99, 22, 191, 128, 46, 221, 177, 98, 228, 193, 122, 206, 184, 128, 197, 181, 138, 160, 150, 120, 124, 121, 106, 28, 23, 17, 106, 50, 18, 131, 70, 39, 96, 47, 20, 167, 86, 41, 104, 58, 30, 89, 86, 78, 156, 142, 110, 183, 168, 125, 189, 168, 118, 167, 142, 97, 210, 175, 107, 235, 176, 88, 223, 144, 54, 216, 134, 46, 210, 150, 69, 179, 115, 44, 176, 103, 30, 159, 96, 36, 185, 128, 62, 193, 135, 69, 198, 141, 75, 179, 109, 42, 178, 110, 41, 203, 139, 66, 212, 151, 82, 212, 153, 88, 210, 154, 85, 203, 148, 84, 188, 128, + 57, 192, 136, 73, 178, 114, 50, 173, 107, 40, 192, 127, 56, 186, 120, 54, 188, 122, 51, 194, 127, 53, 196, 130, 55, 195, 132, 63, 198, 131, 62, 206, 155, 84, 195, 135, 64, 193, 131, 65, 198, 134, 58, 204, 144, 64, 190, 122, 45, 187, 118, 39, 189, 115, 44, 185, 113, 38, 182, 110, 40, 182, 112, 42, 175, 103, 39, 164, 97, 36, 169, 107, 46, 153, 109, 49, 133, 110, 48, 101, 81, 19, 115, 93, 17, 132, 100, 28, 120, 93, 24, 82, 62, 13, 54, 40, 5, 54, 37, 5, 55, 36, 3, 70, 46, 7, 82, 56, 21, 66, 50, 29, 64, 59, 53, 72, 73, 73, 74, 90, 106, 78, 91, 95, 78, 75, 44, 85, 79, 42, 91, 76, 23, 82, 68, 16, 89, 80, 42, 92, 80, 38, 88, 78, 38, 75, 67, 29, 76, 70, 35, 76, 79, 69, 84, 89, 88, 87, 86, 65, + 100, 91, 16, 100, 92, 6, 111, 95, 8, 124, 100, 20, 131, 105, 34, 122, 102, 44, 91, 79, 16, 80, 68, 2, 93, 80, 7, 105, 87, 11, 111, 88, 20, 145, 115, 68, 153, 127, 87, 129, 108, 54, 120, 100, 24, 123, 107, 47, 109, 103, 85, 117, 101, 52, 115, 105, 80, 90, 68, 33, 92, 59, 11, 97, 62, 17, 100, 62, 21, 100, 65, 24, 103, 66, 22, 118, 79, 27, 134, 89, 40, 140, 88, 36, 147, 94, 35, 146, 94, 40, 134, 85, 35, 136, 86, 30, 149, 97, 35, 161, 104, 37, 152, 99, 36, 148, 99, 35, 138, 87, 30, 148, 101, 40, 160, 108, 39, 141, 93, 35, 177, 126, 53, 179, 120, 49, 188, 130, 61, 194, 138, 68, 166, 104, 40, 175, 115, 45, 179, 116, 44, 180, 123, 53, 166, 110, 47, 177, 117, 46, 184, 124, 53, 188, 129, 60, 199, 143, 75, 190, + 137, 68, 200, 141, 73, 177, 121, 60, 178, 121, 56, 191, 133, 66, 198, 143, 71, 178, 114, 46, 108, 62, 20, 109, 61, 24, 107, 63, 21, 62, 26, 1, 56, 24, 1, 80, 42, 11, 51, 22, 2, 98, 54, 10, 131, 75, 17, 142, 86, 22, 157, 98, 28, 190, 135, 58, 235, 192, 114, 237, 208, 140, 230, 210, 152, 219, 205, 153, 203, 192, 149, 110, 105, 88, 51, 31, 14, 95, 51, 25, 60, 33, 16, 99, 54, 26, 67, 48, 27, 114, 97, 65, 195, 173, 118, 217, 195, 136, 184, 160, 112, 157, 132, 93, 211, 170, 103, 233, 169, 83, 214, 141, 56, 209, 134, 49, 205, 132, 48, 209, 150, 70, 181, 109, 33, 162, 98, 33, 184, 124, 58, 184, 125, 61, 176, 113, 45, 178, 109, 36, 191, 123, 51, 205, 141, 71, 202, 142, 69, 200, 141, 72, 209, 156, 89, 206, 154, 86, 189, 130, + 66, 204, 147, 75, 183, 129, 66, 167, 105, 44, 174, 105, 39, 186, 116, 46, 190, 127, 61, 188, 122, 52, 197, 134, 65, 198, 135, 70, 201, 139, 71, 202, 140, 65, 195, 141, 78, 201, 137, 64, 195, 131, 57, 202, 140, 61, 178, 112, 40, 181, 108, 34, 187, 115, 40, 182, 109, 38, 183, 112, 40, 177, 104, 35, 178, 110, 43, 173, 106, 41, 166, 101, 43, 160, 107, 51, 128, 90, 39, 102, 71, 25, 83, 58, 10, 78, 53, 8, 70, 49, 3, 73, 51, 5, 61, 43, 6, 59, 42, 5, 62, 39, 9, 61, 43, 10, 63, 45, 15, 65, 55, 38, 63, 61, 49, 70, 69, 51, 82, 89, 84, 89, 94, 83, 85, 86, 55, 87, 89, 58, 81, 74, 18, 81, 71, 10, 93, 82, 21, 99, 95, 37, 102, 102, 66, 102, 104, 81, 95, 104, 96, 100, 117, 122, 102, 121, 129, 105, 115, 101, + 101, 96, 16, 94, 93, 12, 101, 95, 13, 107, 94, 20, 111, 93, 26, 109, 92, 32, 87, 77, 9, 89, 80, 7, 105, 94, 17, 107, 95, 18, 95, 75, 5, 121, 91, 33, 128, 102, 53, 119, 92, 33, 107, 85, 10, 123, 102, 33, 113, 99, 40, 119, 104, 49, 100, 86, 49, 85, 54, 3, 91, 56, 9, 95, 58, 12, 98, 62, 17, 96, 59, 16, 108, 71, 25, 140, 96, 40, 151, 97, 35, 135, 81, 32, 153, 101, 46, 125, 75, 25, 118, 70, 24, 148, 96, 38, 176, 119, 51, 158, 101, 39, 157, 104, 43, 131, 84, 23, 105, 64, 16, 138, 91, 38, 155, 104, 40, 127, 77, 24, 154, 101, 32, 189, 130, 57, 191, 141, 68, 171, 111, 44, 177, 114, 43, 182, 121, 50, 185, 124, 53, 176, 125, 59, 173, 118, 53, 181, 123, 57, 189, 130, 59, 185, 124, 52, 198, 144, 72, 184, + 122, 54, 203, 145, 72, 183, 117, 52, 177, 119, 57, 179, 115, 56, 197, 140, 71, 196, 136, 63, 133, 83, 28, 51, 16, 1, 74, 32, 9, 51, 16, 0, 67, 31, 6, 89, 52, 19, 67, 39, 8, 118, 71, 22, 169, 112, 40, 191, 132, 51, 203, 144, 66, 202, 150, 70, 230, 186, 109, 232, 195, 124, 236, 209, 141, 237, 215, 154, 233, 215, 159, 215, 199, 152, 128, 121, 98, 36, 24, 16, 28, 17, 5, 64, 47, 28, 151, 132, 88, 221, 193, 126, 237, 214, 149, 234, 202, 134, 232, 199, 126, 239, 200, 126, 243, 201, 119, 241, 189, 96, 235, 171, 78, 226, 161, 74, 205, 139, 59, 198, 129, 50, 198, 127, 46, 173, 104, 35, 175, 113, 43, 170, 106, 42, 164, 92, 30, 194, 116, 41, 211, 150, 74, 208, 150, 79, 204, 147, 78, 205, 149, 82, 201, 141, 68, 216, 157, 87, 217, 160, + 86, 201, 139, 71, 201, 135, 63, 195, 134, 69, 155, 90, 34, 158, 98, 42, 167, 96, 30, 195, 136, 67, 206, 143, 75, 194, 131, 65, 202, 138, 70, 205, 145, 69, 204, 142, 70, 194, 136, 67, 194, 130, 54, 199, 136, 58, 190, 125, 49, 170, 98, 27, 185, 113, 41, 188, 118, 44, 184, 114, 41, 178, 105, 36, 184, 113, 43, 170, 103, 36, 173, 108, 44, 161, 103, 45, 150, 97, 45, 114, 79, 30, 96, 65, 23, 83, 61, 12, 94, 75, 20, 97, 78, 22, 73, 54, 13, 60, 41, 5, 58, 41, 7, 61, 42, 13, 66, 47, 11, 68, 53, 18, 70, 64, 39, 74, 67, 30, 80, 74, 31, 81, 75, 22, 91, 89, 41, 91, 95, 68, 85, 92, 66, 83, 87, 44, 89, 82, 19, 98, 95, 39, 105, 106, 74, 110, 116, 106, 107, 117, 118, 98, 126, 153, 96, 141, 183, 90, 132, 173, + 78, 78, 17, 87, 91, 23, 91, 92, 20, 92, 89, 20, 104, 92, 18, 109, 95, 31, 88, 77, 6, 89, 79, 7, 99, 89, 13, 103, 94, 13, 105, 92, 15, 99, 76, 14, 102, 78, 14, 98, 74, 9, 99, 74, 10, 108, 84, 14, 110, 89, 20, 107, 88, 23, 89, 64, 11, 87, 51, 3, 90, 54, 8, 112, 72, 19, 137, 110, 35, 109, 71, 13, 128, 85, 39, 139, 95, 52, 146, 91, 37, 150, 95, 39, 139, 88, 36, 118, 69, 23, 134, 82, 33, 172, 119, 52, 160, 105, 39, 150, 99, 40, 146, 90, 28, 119, 67, 12, 80, 41, 8, 123, 80, 27, 160, 110, 45, 128, 81, 29, 158, 103, 38, 192, 135, 62, 190, 136, 63, 184, 131, 59, 191, 131, 59, 190, 127, 55, 179, 118, 52, 179, 122, 53, 171, 112, 47, 173, 117, 49, 183, 123, 52, 182, 126, 60, 194, 136, 63, 181, + 121, 54, 201, 139, 65, 182, 114, 44, 187, 129, 63, 168, 116, 57, 163, 100, 40, 180, 119, 53, 164, 107, 49, 85, 45, 12, 35, 7, 0, 55, 19, 4, 126, 72, 18, 128, 80, 21, 107, 61, 12, 136, 83, 21, 163, 105, 30, 171, 111, 33, 191, 135, 54, 182, 126, 50, 198, 146, 71, 197, 151, 82, 220, 190, 124, 215, 180, 113, 223, 199, 138, 224, 206, 152, 204, 192, 150, 77, 71, 61, 22, 14, 5, 155, 145, 117, 217, 202, 154, 231, 214, 160, 236, 214, 153, 232, 199, 126, 220, 177, 108, 226, 176, 93, 228, 170, 81, 234, 171, 74, 235, 166, 71, 230, 156, 60, 221, 152, 61, 198, 134, 55, 192, 120, 45, 163, 94, 28, 162, 100, 37, 151, 84, 21, 195, 124, 49, 210, 141, 66, 196, 133, 64, 195, 138, 67, 192, 132, 66, 201, 148, 82, 213, 156, 81, 193, 130, 59, 202, 136, + 62, 202, 135, 57, 197, 128, 49, 193, 121, 47, 186, 115, 48, 171, 110, 52, 178, 115, 54, 195, 141, 82, 202, 143, 77, 205, 146, 74, 209, 147, 74, 200, 134, 64, 201, 139, 66, 204, 141, 66, 201, 138, 65, 197, 132, 56, 190, 125, 51, 170, 106, 40, 170, 99, 27, 188, 121, 50, 189, 122, 46, 178, 108, 36, 174, 105, 33, 175, 108, 41, 171, 105, 40, 168, 105, 46, 160, 103, 44, 125, 86, 36, 97, 72, 22, 93, 74, 21, 88, 71, 15, 79, 65, 11, 73, 58, 8, 74, 59, 5, 73, 60, 9, 68, 51, 10, 74, 58, 12, 80, 72, 40, 82, 87, 80, 77, 80, 65, 78, 75, 29, 85, 78, 16, 89, 87, 43, 94, 108, 98, 92, 108, 103, 87, 102, 90, 88, 94, 63, 90, 96, 68, 95, 104, 95, 93, 101, 95, 101, 124, 138, 100, 139, 178, 106, 153, 200, 108, 156, 203, + 75, 72, 29, 69, 70, 10, 80, 81, 12, 96, 90, 13, 111, 97, 27, 101, 85, 10, 101, 84, 5, 97, 85, 8, 91, 83, 13, 97, 86, 12, 107, 94, 6, 118, 101, 28, 106, 84, 28, 101, 75, 7, 105, 84, 11, 101, 81, 14, 98, 79, 15, 93, 73, 9, 86, 54, 1, 94, 61, 10, 103, 69, 19, 126, 96, 35, 135, 104, 31, 122, 79, 24, 139, 94, 50, 145, 96, 50, 145, 91, 36, 140, 87, 32, 134, 79, 28, 146, 91, 41, 171, 117, 53, 155, 101, 37, 151, 100, 41, 160, 107, 46, 134, 81, 21, 91, 46, 5, 70, 33, 8, 120, 74, 25, 147, 99, 44, 127, 79, 25, 161, 109, 48, 178, 122, 54, 186, 130, 56, 191, 135, 65, 194, 135, 64, 181, 119, 48, 174, 114, 45, 171, 109, 41, 169, 112, 48, 179, 122, 53, 176, 118, 57, 179, 121, 56, 184, 121, 52, 182, + 115, 44, 192, 126, 51, 196, 127, 59, 197, 140, 69, 182, 132, 71, 130, 77, 32, 146, 86, 35, 183, 131, 66, 110, 63, 20, 53, 26, 11, 54, 27, 12, 70, 30, 4, 60, 24, 1, 71, 36, 5, 113, 64, 15, 130, 77, 16, 150, 100, 37, 156, 104, 38, 184, 136, 65, 209, 166, 91, 224, 184, 111, 230, 198, 128, 232, 207, 141, 227, 206, 145, 236, 220, 167, 232, 221, 178, 126, 125, 109, 62, 55, 45, 206, 194, 162, 234, 222, 175, 238, 222, 169, 242, 219, 157, 245, 218, 146, 246, 212, 134, 242, 200, 114, 227, 174, 88, 212, 145, 59, 217, 147, 57, 224, 151, 58, 217, 147, 55, 221, 159, 73, 221, 154, 67, 201, 138, 58, 166, 104, 38, 173, 103, 34, 202, 133, 56, 205, 138, 63, 189, 125, 57, 197, 142, 77, 201, 147, 84, 198, 143, 76, 199, 138, 71, 204, 141, 68, 186, 119, + 54, 179, 106, 36, 193, 122, 44, 190, 115, 39, 186, 108, 37, 180, 105, 34, 184, 124, 60, 195, 136, 76, 200, 140, 69, 212, 154, 81, 217, 156, 79, 203, 143, 76, 198, 135, 59, 208, 146, 70, 201, 138, 63, 196, 131, 57, 186, 123, 51, 175, 110, 43, 163, 98, 35, 179, 108, 37, 189, 119, 47, 183, 111, 41, 175, 104, 35, 176, 105, 38, 175, 108, 40, 168, 107, 43, 161, 104, 45, 141, 95, 42, 89, 62, 11, 82, 61, 11, 75, 60, 4, 74, 65, 9, 82, 73, 13, 89, 78, 10, 85, 70, 9, 75, 59, 7, 86, 68, 15, 88, 81, 44, 84, 92, 84, 83, 96, 101, 86, 112, 122, 86, 107, 111, 97, 109, 94, 104, 112, 94, 95, 110, 97, 81, 90, 50, 73, 79, 46, 77, 89, 84, 82, 90, 78, 72, 93, 98, 99, 144, 180, 109, 167, 228, 110, 162, 220, 104, 144, 182, + 79, 82, 58, 82, 86, 30, 95, 94, 28, 101, 88, 10, 95, 82, 13, 85, 68, 5, 101, 80, 4, 101, 84, 3, 89, 82, 7, 98, 91, 21, 104, 94, 19, 117, 101, 17, 115, 96, 40, 101, 79, 7, 103, 84, 2, 96, 76, 5, 93, 71, 9, 84, 56, 3, 92, 59, 4, 128, 94, 28, 141, 116, 54, 105, 72, 19, 107, 66, 20, 119, 75, 29, 135, 91, 50, 149, 100, 58, 137, 85, 33, 146, 93, 37, 147, 94, 43, 176, 125, 67, 158, 107, 47, 135, 83, 34, 170, 118, 56, 161, 108, 45, 134, 80, 23, 87, 42, 5, 72, 35, 5, 135, 87, 35, 144, 95, 40, 117, 69, 21, 142, 89, 35, 165, 105, 42, 186, 128, 56, 195, 140, 69, 197, 141, 70, 182, 119, 49, 181, 118, 48, 175, 114, 48, 188, 124, 51, 170, 109, 45, 180, 121, 55, 183, 124, 54, 181, 120, 52, 167, + 102, 33, 191, 127, 50, 189, 124, 51, 193, 129, 57, 189, 134, 67, 143, 95, 42, 90, 42, 8, 137, 79, 28, 119, 67, 24, 70, 34, 8, 37, 12, 2, 40, 12, 0, 125, 80, 26, 147, 100, 40, 169, 118, 46, 182, 125, 51, 195, 140, 62, 194, 145, 73, 200, 154, 78, 207, 168, 94, 214, 178, 107, 225, 191, 121, 233, 212, 148, 240, 221, 162, 236, 215, 154, 229, 217, 168, 168, 165, 145, 134, 132, 115, 212, 198, 155, 227, 200, 135, 238, 217, 151, 243, 223, 159, 246, 217, 146, 233, 191, 108, 250, 217, 142, 245, 196, 105, 242, 190, 100, 227, 161, 73, 224, 162, 76, 200, 133, 54, 191, 119, 40, 192, 118, 39, 168, 95, 21, 185, 117, 44, 198, 131, 58, 203, 135, 64, 173, 104, 37, 195, 138, 71, 200, 149, 84, 206, 154, 90, 196, 134, 69, 200, 137, 67, 185, 117, 47, 196, 118, + 41, 194, 119, 45, 169, 96, 28, 177, 101, 28, 189, 115, 43, 180, 105, 40, 196, 139, 72, 183, 122, 64, 194, 134, 69, 214, 152, 77, 210, 143, 67, 221, 164, 86, 205, 144, 74, 186, 120, 46, 196, 133, 58, 201, 138, 62, 186, 124, 52, 184, 122, 49, 171, 110, 42, 171, 107, 38, 177, 108, 34, 193, 126, 51, 180, 109, 39, 172, 102, 34, 176, 105, 38, 172, 104, 42, 171, 115, 52, 153, 108, 44, 131, 95, 27, 106, 81, 16, 92, 74, 11, 88, 71, 16, 97, 79, 16, 96, 80, 5, 83, 71, 2, 80, 66, 0, 104, 87, 9, 96, 86, 19, 89, 91, 58, 82, 96, 99, 76, 111, 138, 82, 133, 185, 94, 134, 169, 95, 120, 125, 87, 103, 94, 74, 76, 27, 57, 61, 36, 57, 67, 65, 60, 63, 49, 79, 99, 109, 99, 149, 197, 113, 170, 232, 110, 164, 217, 95, 137, 165, + 98, 90, 36, 81, 76, 12, 71, 65, 4, 82, 76, 10, 89, 85, 24, 75, 65, 7, 85, 63, 4, 96, 69, 3, 94, 72, 7, 112, 98, 32, 103, 92, 18, 108, 94, 15, 106, 85, 12, 98, 77, 5, 90, 69, 0, 89, 67, 0, 93, 69, 8, 99, 69, 10, 109, 79, 9, 131, 103, 28, 120, 92, 39, 102, 64, 17, 102, 62, 19, 116, 74, 32, 125, 83, 46, 144, 91, 41, 148, 94, 36, 158, 108, 50, 169, 119, 60, 166, 116, 54, 143, 91, 34, 157, 108, 46, 176, 122, 59, 154, 98, 37, 118, 66, 18, 81, 38, 3, 75, 35, 5, 119, 75, 27, 144, 96, 31, 107, 58, 18, 129, 78, 30, 163, 106, 44, 180, 122, 52, 197, 138, 62, 191, 125, 51, 180, 116, 45, 164, 103, 42, 186, 121, 49, 181, 121, 49, 181, 122, 57, 175, 116, 53, 187, 128, 62, 186, 125, 54, 176, + 111, 39, 189, 121, 45, 180, 117, 43, 191, 129, 54, 202, 143, 70, 185, 131, 66, 135, 86, 35, 66, 27, 4, 84, 38, 6, 85, 43, 13, 66, 37, 20, 59, 32, 17, 99, 55, 12, 153, 101, 38, 166, 119, 49, 181, 132, 55, 179, 129, 58, 173, 130, 62, 180, 140, 70, 200, 165, 99, 207, 173, 109, 216, 181, 111, 231, 203, 134, 230, 200, 130, 220, 192, 131, 217, 204, 158, 152, 148, 122, 137, 130, 108, 195, 182, 140, 220, 200, 142, 233, 203, 130, 236, 202, 125, 240, 216, 144, 241, 220, 155, 238, 209, 137, 233, 189, 107, 233, 181, 98, 238, 180, 85, 234, 172, 81, 228, 166, 80, 217, 155, 73, 204, 138, 68, 173, 112, 48, 180, 120, 55, 202, 145, 79, 176, 112, 44, 188, 132, 69, 199, 148, 82, 204, 155, 91, 198, 140, 72, 192, 130, 60, 191, 124, 51, 189, 119, 48, 176, 101, + 35, 181, 107, 30, 190, 117, 39, 177, 102, 32, 184, 109, 35, 180, 110, 42, 196, 140, 76, 185, 123, 58, 192, 131, 66, 209, 150, 77, 210, 146, 71, 201, 137, 58, 211, 151, 72, 201, 139, 67, 194, 131, 54, 199, 133, 53, 196, 131, 55, 179, 113, 46, 183, 120, 50, 176, 112, 46, 175, 109, 44, 181, 110, 41, 184, 116, 46, 176, 107, 39, 177, 106, 37, 182, 113, 45, 176, 111, 47, 157, 107, 44, 142, 101, 36, 116, 85, 18, 115, 88, 25, 114, 86, 30, 110, 84, 33, 105, 82, 19, 85, 70, 4, 89, 77, 0, 109, 96, 2, 107, 93, 11, 95, 87, 27, 80, 89, 75, 84, 114, 139, 94, 132, 169, 85, 105, 108, 68, 74, 52, 64, 70, 55, 58, 71, 69, 62, 92, 112, 78, 120, 151, 84, 122, 149, 82, 118, 144, 96, 143, 187, 106, 145, 187, 97, 119, 131, 79, 93, 85, + 93, 79, 20, 63, 53, 1, 63, 58, 3, 76, 73, 13, 75, 72, 20, 77, 68, 21, 70, 52, 2, 89, 64, 8, 107, 86, 31, 96, 79, 30, 107, 88, 22, 106, 86, 18, 121, 99, 28, 119, 97, 33, 102, 76, 12, 91, 68, 2, 88, 64, 1, 117, 85, 16, 125, 94, 16, 123, 94, 24, 112, 80, 27, 104, 66, 21, 101, 64, 24, 116, 78, 35, 145, 95, 43, 146, 90, 31, 153, 99, 42, 170, 120, 57, 167, 118, 54, 153, 102, 43, 162, 114, 58, 182, 130, 63, 161, 107, 44, 127, 74, 23, 111, 63, 16, 80, 37, 2, 73, 33, 5, 122, 75, 28, 136, 91, 33, 105, 59, 14, 103, 53, 14, 164, 106, 42, 190, 133, 62, 190, 126, 49, 177, 110, 34, 167, 101, 33, 184, 114, 39, 185, 119, 45, 181, 118, 48, 175, 112, 45, 182, 121, 52, 179, 120, 53, 194, 127, 53, 181, + 114, 44, 182, 113, 39, 165, 94, 24, 183, 114, 39, 196, 132, 59, 192, 135, 63, 178, 128, 62, 116, 79, 40, 100, 62, 32, 98, 55, 21, 79, 45, 22, 64, 38, 24, 71, 43, 25, 90, 55, 26, 105, 71, 32, 122, 81, 31, 136, 90, 30, 151, 108, 42, 156, 114, 51, 195, 160, 94, 200, 160, 89, 223, 188, 118, 223, 192, 125, 223, 205, 151, 216, 202, 161, 206, 197, 161, 125, 120, 99, 87, 80, 63, 179, 167, 135, 212, 196, 150, 217, 199, 143, 240, 214, 145, 242, 205, 119, 240, 202, 123, 238, 200, 118, 237, 197, 112, 222, 166, 80, 227, 171, 84, 234, 172, 82, 229, 165, 77, 226, 164, 79, 211, 146, 63, 201, 138, 59, 198, 153, 93, 169, 117, 68, 165, 106, 46, 204, 151, 85, 203, 152, 85, 208, 156, 88, 175, 113, 53, 183, 118, 51, 185, 113, 43, 194, 121, 49, 166, 97, + 36, 182, 109, 34, 193, 126, 46, 189, 120, 45, 181, 110, 37, 181, 114, 42, 201, 138, 71, 196, 132, 60, 192, 128, 60, 204, 143, 70, 208, 149, 75, 200, 138, 65, 206, 143, 66, 209, 150, 74, 197, 135, 60, 191, 122, 45, 193, 124, 46, 182, 116, 52, 185, 120, 55, 179, 116, 52, 174, 106, 43, 171, 100, 32, 187, 118, 48, 178, 108, 39, 180, 109, 42, 185, 117, 45, 180, 116, 52, 165, 112, 48, 141, 100, 39, 125, 87, 25, 128, 94, 30, 124, 93, 32, 134, 99, 42, 116, 88, 30, 87, 67, 5, 92, 81, 0, 104, 96, 1, 105, 93, 7, 92, 80, 28, 70, 69, 40, 67, 71, 64, 64, 65, 52, 63, 64, 50, 50, 73, 95, 72, 119, 164, 89, 144, 189, 85, 136, 185, 76, 131, 171, 88, 153, 206, 96, 161, 216, 102, 168, 225, 96, 149, 202, 90, 106, 93, 81, 92, 43, + 99, 91, 38, 73, 68, 8, 84, 82, 19, 99, 103, 51, 91, 114, 129, 81, 81, 75, 75, 56, 16, 101, 76, 25, 94, 75, 16, 75, 54, 3, 87, 70, 14, 110, 89, 24, 126, 106, 49, 141, 119, 70, 135, 114, 65, 111, 90, 16, 98, 74, 6, 122, 97, 26, 133, 105, 38, 130, 102, 47, 113, 77, 28, 105, 67, 23, 111, 76, 25, 149, 107, 43, 147, 95, 33, 148, 95, 37, 170, 117, 56, 176, 123, 54, 158, 104, 39, 164, 114, 55, 176, 126, 64, 172, 120, 50, 151, 96, 35, 151, 96, 36, 122, 72, 24, 82, 41, 6, 88, 46, 13, 126, 78, 32, 139, 92, 36, 110, 62, 17, 106, 58, 15, 156, 97, 37, 171, 111, 42, 184, 117, 39, 177, 110, 35, 194, 124, 44, 195, 125, 46, 189, 124, 49, 187, 122, 49, 190, 127, 49, 185, 120, 46, 185, 115, 41, 190, 122, 43, 181, + 111, 36, 179, 109, 32, 167, 96, 26, 170, 103, 31, 190, 128, 56, 179, 122, 52, 186, 131, 63, 128, 85, 44, 85, 55, 32, 107, 67, 38, 106, 66, 33, 73, 36, 13, 64, 32, 8, 109, 68, 23, 132, 91, 36, 163, 122, 53, 178, 137, 66, 189, 148, 73, 182, 140, 74, 199, 159, 88, 205, 167, 93, 211, 183, 123, 212, 196, 151, 197, 186, 148, 196, 187, 153, 143, 138, 115, 46, 42, 36, 14, 14, 8, 88, 78, 59, 191, 178, 145, 204, 193, 154, 225, 209, 159, 246, 230, 169, 247, 222, 148, 245, 214, 136, 244, 205, 121, 245, 208, 125, 235, 184, 98, 217, 157, 75, 213, 152, 71, 194, 134, 58, 170, 105, 44, 173, 114, 52, 205, 146, 74, 189, 136, 69, 180, 130, 71, 187, 132, 70, 193, 130, 64, 205, 146, 73, 190, 129, 58, 167, 105, 41, 178, 110, 42, 186, 114, 40, 183, 116, + 46, 177, 108, 39, 179, 111, 45, 189, 125, 52, 180, 111, 45, 188, 119, 46, 199, 132, 62, 202, 136, 65, 193, 127, 60, 188, 120, 46, 210, 149, 74, 211, 148, 71, 201, 137, 64, 203, 143, 67, 202, 139, 64, 193, 130, 56, 180, 108, 36, 198, 134, 59, 184, 119, 52, 182, 120, 52, 183, 118, 52, 168, 100, 36, 179, 109, 40, 180, 111, 42, 181, 111, 42, 182, 112, 43, 175, 109, 46, 162, 103, 43, 147, 98, 42, 121, 84, 28, 125, 91, 38, 126, 89, 38, 115, 79, 26, 87, 62, 10, 72, 53, 1, 84, 70, 0, 85, 74, 1, 85, 73, 12, 78, 76, 57, 79, 95, 107, 73, 90, 91, 69, 87, 85, 72, 102, 117, 79, 130, 180, 89, 144, 195, 96, 149, 197, 99, 154, 190, 101, 159, 193, 104, 176, 232, 116, 193, 245, 111, 188, 248, 99, 167, 220, 93, 149, 188, 101, 130, 122, + 105, 92, 43, 91, 88, 25, 109, 111, 60, 124, 152, 144, 100, 150, 205, 97, 108, 117, 87, 81, 61, 102, 87, 41, 89, 67, 18, 72, 52, 2, 81, 62, 6, 108, 88, 28, 123, 101, 40, 139, 114, 52, 145, 121, 63, 121, 98, 36, 103, 79, 8, 102, 72, 5, 125, 95, 30, 118, 96, 44, 108, 73, 24, 119, 89, 27, 134, 98, 27, 152, 101, 33, 146, 94, 35, 165, 114, 52, 175, 120, 54, 168, 111, 46, 167, 112, 51, 179, 127, 62, 172, 119, 56, 160, 108, 44, 163, 112, 52, 164, 111, 49, 137, 89, 35, 92, 48, 9, 86, 47, 10, 100, 55, 16, 124, 78, 29, 107, 62, 17, 107, 60, 17, 147, 91, 33, 170, 107, 36, 179, 112, 38, 192, 122, 45, 186, 116, 38, 187, 115, 38, 191, 126, 47, 200, 130, 48, 197, 129, 51, 193, 131, 56, 196, 131, 53, 201, 139, 57, 183, + 115, 42, 177, 107, 37, 158, 88, 28, 157, 94, 32, 186, 125, 56, 184, 129, 61, 188, 129, 60, 149, 99, 42, 79, 48, 27, 58, 33, 16, 60, 26, 7, 62, 26, 6, 50, 21, 8, 84, 46, 19, 115, 70, 23, 156, 104, 41, 173, 123, 52, 183, 138, 66, 178, 135, 64, 186, 141, 69, 199, 169, 108, 200, 186, 141, 177, 166, 133, 179, 170, 138, 101, 94, 74, 21, 17, 12, 41, 36, 29, 120, 120, 112, 48, 48, 44, 107, 99, 79, 170, 164, 129, 206, 193, 155, 234, 219, 171, 239, 214, 148, 242, 209, 123, 247, 207, 124, 243, 195, 103, 241, 193, 105, 244, 193, 103, 234, 177, 87, 237, 181, 93, 211, 152, 69, 176, 116, 52, 173, 118, 58, 177, 118, 53, 195, 139, 77, 172, 112, 52, 184, 120, 54, 191, 127, 58, 198, 138, 68, 186, 121, 54, 168, 104, 36, 183, 115, 44, 197, 131, + 56, 193, 126, 52, 192, 126, 57, 180, 118, 51, 172, 106, 39, 189, 119, 46, 198, 133, 59, 203, 134, 58, 196, 130, 57, 185, 117, 49, 192, 126, 52, 209, 147, 68, 201, 139, 62, 202, 138, 61, 194, 130, 57, 187, 124, 52, 173, 104, 37, 191, 123, 44, 192, 124, 52, 176, 107, 39, 186, 119, 52, 180, 115, 49, 168, 97, 34, 173, 101, 36, 176, 106, 38, 179, 110, 42, 183, 116, 51, 166, 105, 44, 153, 98, 43, 113, 72, 27, 93, 61, 13, 101, 67, 19, 98, 70, 18, 83, 59, 12, 69, 49, 0, 89, 76, 0, 106, 97, 6, 105, 99, 40, 90, 94, 82, 92, 122, 146, 92, 139, 168, 90, 126, 138, 85, 110, 111, 83, 139, 179, 94, 159, 219, 96, 160, 218, 97, 154, 192, 105, 140, 140, 102, 152, 174, 104, 176, 229, 101, 175, 238, 105, 180, 235, 116, 189, 244, 102, 152, 185, + 105, 93, 55, 77, 73, 33, 95, 90, 36, 117, 142, 148, 116, 139, 172, 116, 130, 146, 105, 101, 75, 94, 79, 28, 99, 75, 27, 84, 62, 9, 90, 69, 11, 98, 81, 20, 103, 84, 10, 129, 109, 47, 125, 103, 35, 109, 87, 21, 97, 69, 8, 105, 76, 12, 121, 94, 28, 128, 100, 44, 132, 106, 28, 130, 104, 29, 133, 98, 37, 140, 93, 32, 155, 107, 42, 175, 123, 59, 174, 119, 55, 177, 125, 60, 175, 122, 56, 166, 111, 43, 170, 120, 54, 177, 125, 62, 178, 126, 61, 157, 109, 47, 113, 66, 25, 105, 59, 14, 75, 35, 0, 83, 46, 10, 107, 63, 23, 111, 65, 17, 108, 58, 13, 142, 84, 26, 175, 109, 38, 186, 116, 40, 180, 111, 38, 173, 104, 33, 186, 120, 43, 188, 121, 43, 197, 130, 50, 194, 129, 49, 186, 119, 42, 181, 115, 38, 180, 116, 43, 141, + 80, 24, 99, 46, 8, 146, 82, 27, 170, 106, 36, 189, 130, 60, 163, 106, 41, 174, 107, 36, 144, 91, 36, 52, 21, 8, 32, 17, 8, 63, 40, 26, 79, 42, 17, 67, 28, 6, 56, 21, 3, 112, 66, 24, 145, 85, 23, 173, 115, 42, 166, 108, 34, 174, 125, 48, 177, 143, 76, 179, 160, 112, 168, 156, 116, 124, 110, 79, 49, 44, 32, 19, 13, 8, 21, 16, 8, 29, 24, 18, 146, 140, 131, 66, 62, 61, 22, 16, 11, 85, 77, 61, 165, 150, 121, 190, 175, 132, 223, 201, 146, 239, 209, 138, 241, 203, 117, 243, 190, 97, 236, 179, 88, 223, 154, 65, 200, 133, 58, 164, 98, 37, 198, 138, 62, 184, 129, 66, 173, 118, 56, 179, 123, 58, 180, 125, 58, 165, 102, 41, 173, 108, 47, 179, 112, 47, 197, 136, 61, 185, 123, 54, 168, 107, 47, 180, 114, 49, 196, 130, + 60, 197, 132, 62, 195, 129, 57, 204, 146, 76, 167, 106, 44, 182, 114, 45, 188, 120, 50, 193, 118, 41, 201, 133, 53, 177, 111, 44, 192, 128, 58, 187, 124, 55, 192, 127, 52, 197, 134, 55, 193, 127, 53, 177, 111, 41, 187, 121, 58, 171, 100, 35, 191, 123, 49, 183, 115, 42, 178, 109, 39, 183, 116, 49, 181, 116, 50, 167, 98, 32, 180, 112, 46, 180, 109, 40, 183, 116, 47, 177, 117, 52, 147, 93, 36, 122, 78, 33, 86, 54, 16, 79, 55, 12, 97, 69, 22, 90, 66, 17, 71, 52, 8, 72, 56, 0, 91, 83, 8, 86, 85, 49, 84, 95, 97, 96, 123, 150, 101, 152, 204, 91, 139, 182, 83, 121, 142, 96, 149, 182, 84, 138, 173, 79, 139, 185, 90, 145, 181, 101, 131, 132, 93, 122, 108, 76, 130, 153, 87, 155, 203, 124, 198, 244, 119, 195, 249, 88, 128, 153, + 118, 102, 51, 82, 80, 36, 77, 68, 19, 113, 95, 55, 92, 86, 66, 93, 84, 62, 110, 90, 25, 104, 82, 21, 92, 71, 15, 80, 61, 13, 77, 58, 9, 81, 64, 6, 93, 82, 2, 110, 93, 14, 125, 106, 41, 118, 91, 32, 111, 84, 25, 120, 89, 31, 131, 102, 24, 150, 126, 39, 134, 113, 30, 122, 97, 26, 120, 81, 16, 145, 100, 31, 170, 118, 50, 175, 119, 50, 177, 122, 56, 176, 124, 55, 172, 115, 45, 172, 117, 48, 181, 127, 60, 187, 132, 65, 177, 120, 56, 140, 87, 35, 115, 68, 22, 111, 65, 17, 68, 31, 1, 86, 45, 12, 114, 69, 23, 126, 77, 26, 119, 68, 20, 158, 97, 33, 176, 114, 45, 160, 96, 31, 152, 85, 27, 166, 104, 36, 183, 116, 39, 197, 128, 51, 202, 132, 52, 193, 119, 40, 169, 102, 33, 180, 116, 46, 164, 102, 41, 151, + 96, 38, 161, 108, 48, 185, 127, 54, 172, 111, 44, 189, 129, 61, 151, 92, 33, 161, 92, 25, 158, 96, 29, 90, 51, 9, 19, 6, 0, 17, 2, 0, 36, 11, 0, 67, 27, 4, 74, 32, 10, 109, 59, 16, 168, 108, 36, 183, 123, 49, 190, 132, 54, 180, 138, 66, 173, 149, 97, 136, 118, 80, 89, 78, 48, 54, 46, 25, 94, 85, 59, 111, 97, 66, 111, 100, 67, 77, 65, 45, 108, 93, 66, 90, 78, 57, 110, 96, 64, 102, 88, 62, 82, 67, 44, 132, 117, 79, 184, 166, 118, 228, 202, 137, 245, 208, 123, 239, 185, 91, 240, 181, 92, 222, 159, 70, 197, 128, 50, 172, 102, 33, 196, 136, 63, 181, 128, 64, 179, 131, 74, 191, 138, 75, 188, 129, 63, 178, 114, 48, 172, 105, 41, 167, 99, 33, 184, 112, 37, 192, 130, 58, 173, 111, 45, 171, 106, 45, 190, 124, + 50, 201, 138, 63, 207, 142, 64, 207, 147, 72, 190, 128, 64, 182, 113, 42, 196, 129, 57, 192, 126, 53, 195, 124, 49, 192, 127, 61, 180, 119, 55, 181, 121, 50, 194, 132, 58, 195, 131, 57, 196, 131, 56, 186, 117, 45, 179, 112, 42, 177, 107, 40, 181, 114, 43, 190, 123, 51, 180, 109, 41, 177, 106, 37, 184, 118, 48, 174, 109, 42, 168, 98, 32, 176, 109, 42, 184, 117, 47, 178, 115, 45, 166, 114, 48, 139, 100, 37, 101, 76, 17, 98, 71, 16, 90, 68, 13, 82, 64, 8, 71, 53, 4, 71, 55, 9, 68, 56, 7, 74, 69, 31, 68, 65, 41, 67, 68, 69, 80, 93, 107, 72, 87, 91, 69, 78, 69, 61, 78, 70, 50, 63, 48, 41, 60, 55, 46, 70, 74, 64, 80, 74, 66, 81, 68, 54, 85, 89, 91, 145, 184, 115, 182, 228, 113, 182, 236, 89, 149, 202, + 117, 98, 38, 79, 69, 10, 99, 79, 22, 100, 78, 18, 75, 61, 2, 81, 64, 5, 88, 70, 15, 111, 97, 18, 108, 97, 23, 87, 71, 10, 75, 58, 4, 68, 51, 4, 80, 68, 3, 100, 86, 8, 115, 89, 18, 114, 90, 34, 100, 73, 8, 120, 95, 22, 145, 126, 28, 145, 128, 51, 96, 70, 8, 94, 61, 8, 114, 77, 23, 165, 116, 50, 169, 114, 51, 171, 114, 47, 168, 117, 48, 164, 109, 40, 172, 118, 49, 181, 126, 56, 186, 128, 58, 184, 128, 59, 145, 92, 34, 134, 82, 29, 161, 110, 51, 96, 51, 11, 67, 31, 3, 85, 44, 11, 112, 67, 26, 130, 80, 27, 148, 95, 34, 149, 92, 32, 145, 86, 26, 128, 72, 19, 129, 74, 24, 147, 88, 33, 179, 115, 41, 189, 119, 39, 174, 102, 26, 185, 122, 43, 186, 123, 50, 194, 130, 58, 189, 127, 56, 188, + 132, 62, 188, 129, 63, 196, 134, 61, 188, 130, 60, 172, 113, 55, 150, 93, 37, 158, 92, 27, 164, 98, 28, 120, 68, 20, 27, 8, 1, 17, 3, 1, 20, 6, 0, 56, 24, 3, 83, 35, 7, 73, 33, 8, 126, 74, 18, 160, 105, 37, 147, 96, 29, 121, 84, 32, 104, 78, 37, 55, 45, 25, 53, 43, 24, 164, 141, 88, 183, 163, 115, 162, 131, 76, 162, 136, 81, 146, 126, 88, 135, 116, 80, 161, 141, 99, 176, 142, 81, 163, 127, 67, 173, 149, 97, 94, 77, 51, 117, 100, 69, 175, 147, 92, 200, 152, 82, 229, 179, 91, 223, 159, 73, 201, 134, 58, 171, 112, 51, 186, 125, 60, 191, 136, 66, 180, 130, 71, 185, 137, 77, 178, 122, 55, 193, 134, 65, 183, 121, 54, 182, 114, 43, 186, 116, 41, 184, 118, 46, 195, 131, 52, 183, 119, 55, 175, 116, 52, 173, 110, + 47, 202, 139, 66, 203, 139, 66, 213, 150, 77, 213, 153, 84, 180, 113, 49, 187, 123, 51, 197, 129, 53, 196, 127, 53, 202, 141, 65, 173, 114, 49, 192, 134, 65, 190, 133, 59, 195, 133, 56, 198, 132, 56, 197, 130, 58, 182, 116, 41, 189, 122, 48, 173, 105, 35, 189, 120, 53, 193, 124, 51, 174, 104, 33, 178, 107, 38, 185, 118, 45, 176, 107, 38, 173, 106, 39, 182, 114, 45, 184, 118, 55, 169, 114, 49, 154, 111, 47, 127, 100, 30, 120, 99, 28, 117, 98, 29, 104, 88, 16, 103, 87, 13, 103, 86, 26, 90, 80, 46, 71, 83, 91, 62, 81, 103, 58, 71, 83, 70, 99, 134, 77, 121, 168, 75, 121, 162, 66, 118, 156, 65, 117, 157, 58, 100, 131, 44, 87, 115, 58, 92, 105, 50, 66, 57, 49, 56, 31, 79, 86, 66, 101, 115, 106, 94, 116, 117, 97, 119, 120, + 124, 98, 34, 82, 70, 4, 123, 97, 35, 91, 75, 13, 85, 69, 6, 87, 67, 12, 78, 69, 31, 106, 95, 45, 101, 105, 42, 105, 98, 22, 93, 72, 12, 71, 54, 6, 83, 69, 10, 108, 90, 17, 121, 102, 23, 125, 106, 33, 124, 107, 29, 110, 91, 16, 86, 66, 6, 66, 40, 0, 81, 51, 11, 98, 70, 20, 128, 89, 30, 159, 110, 43, 158, 105, 39, 176, 122, 51, 164, 114, 47, 173, 120, 53, 182, 127, 59, 186, 128, 58, 190, 130, 58, 156, 103, 41, 139, 86, 30, 164, 111, 51, 144, 93, 34, 97, 49, 11, 78, 39, 6, 81, 41, 6, 98, 53, 16, 126, 77, 26, 117, 66, 19, 117, 67, 18, 106, 56, 9, 115, 62, 15, 143, 91, 28, 154, 95, 36, 181, 115, 38, 192, 123, 44, 194, 124, 46, 197, 130, 50, 184, 121, 47, 202, 139, 64, 202, 137, 61, 180, + 121, 55, 197, 135, 63, 194, 129, 54, 206, 142, 66, 188, 126, 59, 158, 100, 39, 151, 89, 26, 166, 101, 30, 146, 94, 29, 49, 20, 3, 25, 9, 1, 17, 6, 0, 28, 14, 4, 82, 43, 18, 57, 24, 8, 78, 51, 28, 90, 51, 16, 75, 42, 9, 65, 44, 24, 66, 55, 38, 129, 117, 85, 187, 168, 124, 211, 183, 121, 196, 158, 92, 192, 157, 94, 177, 150, 92, 138, 119, 80, 160, 142, 99, 162, 140, 90, 190, 159, 99, 210, 175, 108, 224, 188, 113, 213, 190, 130, 111, 96, 65, 83, 70, 49, 113, 82, 38, 179, 124, 54, 195, 136, 60, 177, 117, 42, 176, 107, 32, 205, 142, 60, 194, 146, 79, 183, 136, 78, 168, 116, 58, 178, 124, 60, 178, 121, 58, 169, 106, 44, 184, 119, 48, 184, 114, 38, 200, 133, 59, 187, 124, 51, 201, 136, 59, 198, 141, 69, 177, 120, + 61, 181, 121, 55, 203, 139, 69, 208, 146, 71, 211, 146, 69, 204, 141, 72, 186, 124, 58, 193, 124, 53, 197, 131, 58, 194, 135, 60, 183, 122, 57, 180, 123, 53, 187, 124, 52, 197, 135, 58, 192, 126, 49, 195, 124, 47, 187, 119, 44, 185, 117, 43, 181, 112, 39, 182, 114, 43, 185, 116, 44, 190, 121, 46, 174, 102, 34, 182, 113, 40, 180, 111, 43, 174, 105, 36, 181, 116, 50, 184, 120, 52, 173, 120, 55, 155, 114, 47, 135, 109, 34, 124, 105, 19, 123, 102, 20, 112, 94, 15, 116, 100, 17, 113, 99, 24, 103, 103, 71, 100, 131, 156, 114, 170, 226, 113, 180, 235, 96, 157, 216, 78, 132, 185, 82, 147, 204, 101, 171, 231, 114, 188, 243, 112, 190, 245, 105, 183, 241, 111, 188, 243, 97, 159, 195, 76, 106, 92, 63, 102, 118, 67, 111, 141, 84, 144, 190, 93, 144, 178, + 107, 85, 24, 88, 75, 1, 123, 93, 35, 96, 75, 18, 76, 58, 11, 85, 65, 20, 99, 80, 38, 97, 86, 50, 110, 103, 41, 109, 102, 31, 115, 95, 37, 103, 88, 24, 116, 99, 31, 116, 100, 25, 107, 90, 14, 81, 65, 3, 68, 55, 0, 50, 37, 0, 52, 33, 4, 102, 75, 33, 104, 77, 31, 97, 69, 25, 126, 83, 28, 150, 98, 39, 160, 105, 39, 160, 107, 41, 169, 113, 48, 186, 128, 59, 182, 121, 50, 187, 123, 51, 165, 103, 37, 147, 91, 32, 167, 110, 43, 164, 110, 48, 140, 86, 33, 98, 52, 13, 82, 41, 8, 91, 50, 13, 84, 40, 5, 98, 53, 12, 102, 55, 15, 110, 62, 17, 115, 67, 18, 136, 84, 27, 149, 92, 35, 159, 103, 38, 181, 120, 45, 183, 115, 38, 189, 123, 44, 182, 119, 53, 175, 113, 47, 192, 125, 50, 205, 143, 68, 172, + 114, 53, 193, 131, 58, 205, 141, 63, 206, 139, 60, 197, 140, 70, 175, 120, 57, 149, 95, 35, 170, 106, 37, 176, 118, 51, 88, 51, 18, 30, 11, 1, 24, 9, 1, 37, 25, 12, 33, 13, 3, 50, 26, 14, 23, 11, 6, 25, 17, 7, 11, 4, 0, 36, 30, 19, 127, 113, 80, 193, 171, 121, 219, 196, 140, 210, 181, 121, 208, 170, 104, 202, 172, 108, 196, 166, 105, 192, 172, 123, 185, 162, 120, 214, 187, 133, 197, 167, 113, 204, 174, 113, 238, 207, 135, 240, 216, 147, 210, 191, 138, 124, 114, 93, 77, 64, 48, 88, 56, 25, 133, 91, 45, 99, 54, 15, 147, 90, 36, 191, 132, 56, 177, 127, 60, 186, 136, 72, 177, 126, 69, 171, 113, 50, 180, 123, 63, 163, 103, 41, 185, 117, 43, 181, 115, 43, 187, 126, 51, 182, 125, 55, 191, 127, 59, 205, 145, 73, 186, 126, + 60, 183, 122, 57, 201, 139, 65, 211, 148, 74, 207, 148, 74, 209, 147, 71, 189, 129, 62, 192, 125, 55, 199, 132, 58, 197, 135, 63, 191, 134, 65, 168, 105, 35, 186, 128, 54, 192, 132, 53, 191, 122, 50, 184, 113, 37, 189, 116, 39, 186, 116, 42, 179, 109, 35, 183, 112, 39, 179, 107, 38, 185, 117, 44, 188, 119, 45, 179, 107, 37, 182, 111, 43, 175, 105, 36, 182, 114, 45, 187, 124, 56, 180, 125, 53, 164, 117, 49, 136, 107, 32, 120, 102, 18, 120, 104, 22, 120, 99, 28, 110, 92, 21, 93, 82, 7, 95, 99, 66, 102, 137, 159, 113, 170, 222, 115, 182, 233, 107, 169, 221, 94, 159, 210, 83, 155, 217, 87, 154, 214, 91, 159, 217, 94, 166, 227, 92, 163, 224, 94, 163, 225, 82, 141, 175, 65, 102, 95, 49, 85, 96, 60, 117, 165, 100, 171, 221, 102, 166, 219, + 104, 89, 38, 101, 87, 35, 117, 90, 41, 95, 70, 26, 73, 55, 12, 78, 62, 13, 88, 67, 17, 67, 51, 8, 89, 74, 21, 68, 53, 5, 87, 68, 16, 119, 96, 34, 131, 111, 43, 91, 74, 10, 62, 49, 0, 37, 27, 0, 42, 28, 2, 64, 50, 9, 75, 62, 17, 123, 98, 41, 94, 73, 28, 88, 56, 16, 126, 82, 28, 140, 90, 31, 162, 107, 41, 174, 115, 48, 184, 125, 56, 184, 122, 48, 183, 120, 46, 162, 97, 29, 162, 99, 35, 177, 119, 50, 171, 114, 46, 163, 104, 43, 143, 91, 34, 110, 63, 21, 110, 66, 22, 95, 50, 13, 77, 38, 3, 80, 42, 5, 89, 44, 5, 122, 72, 23, 130, 82, 31, 144, 93, 37, 161, 106, 45, 171, 113, 48, 171, 113, 45, 176, 113, 41, 178, 110, 44, 178, 121, 53, 190, 129, 62, 190, 128, 54, 192, 131, 56, 157, + 98, 40, 187, 123, 52, 196, 127, 50, 208, 139, 62, 200, 138, 63, 179, 119, 49, 155, 98, 32, 154, 91, 27, 186, 120, 48, 139, 92, 34, 44, 17, 0, 49, 25, 8, 22, 10, 2, 33, 23, 16, 41, 20, 12, 17, 7, 2, 42, 37, 25, 73, 66, 44, 144, 130, 95, 209, 192, 148, 216, 194, 141, 219, 193, 132, 217, 190, 125, 202, 174, 116, 195, 171, 114, 209, 176, 111, 225, 202, 147, 189, 168, 126, 193, 170, 126, 217, 181, 114, 211, 188, 126, 232, 196, 117, 244, 222, 159, 241, 224, 170, 204, 186, 140, 117, 105, 77, 51, 41, 26, 52, 38, 26, 49, 25, 10, 94, 47, 11, 156, 105, 47, 153, 100, 44, 168, 115, 52, 170, 117, 55, 179, 120, 54, 189, 124, 54, 157, 96, 36, 176, 107, 34, 181, 114, 45, 195, 135, 63, 188, 126, 57, 197, 137, 62, 199, 138, 67, 205, 145, + 74, 186, 127, 61, 196, 139, 67, 211, 147, 74, 207, 143, 68, 204, 143, 70, 189, 125, 56, 184, 119, 44, 196, 132, 56, 193, 133, 58, 192, 133, 64, 176, 115, 46, 190, 129, 57, 192, 134, 59, 181, 111, 38, 184, 111, 34, 186, 111, 35, 192, 124, 47, 186, 115, 42, 179, 105, 35, 186, 115, 44, 176, 103, 37, 183, 113, 41, 185, 114, 45, 177, 108, 37, 177, 107, 38, 173, 102, 37, 186, 120, 50, 187, 129, 57, 166, 121, 49, 145, 106, 34, 121, 100, 30, 115, 97, 25, 107, 88, 22, 75, 60, 6, 74, 64, 0, 84, 80, 24, 87, 99, 73, 88, 114, 109, 83, 114, 113, 78, 122, 139, 76, 144, 198, 95, 169, 230, 111, 188, 245, 126, 200, 247, 133, 206, 248, 116, 193, 249, 84, 163, 229, 53, 98, 119, 35, 61, 54, 62, 94, 94, 83, 129, 148, 96, 145, 161, 96, 142, 154, + 96, 78, 20, 90, 74, 15, 108, 93, 46, 77, 58, 12, 73, 66, 18, 82, 73, 10, 85, 67, 12, 58, 44, 4, 78, 67, 10, 101, 89, 20, 135, 117, 36, 128, 98, 31, 89, 69, 12, 46, 34, 0, 34, 22, 1, 61, 49, 13, 94, 79, 32, 104, 89, 41, 91, 86, 29, 102, 80, 32, 97, 76, 35, 94, 66, 18, 124, 80, 28, 135, 87, 33, 172, 116, 49, 178, 122, 52, 182, 121, 48, 184, 123, 48, 154, 91, 28, 164, 101, 36, 180, 125, 55, 171, 114, 48, 171, 110, 42, 161, 103, 37, 146, 94, 36, 119, 74, 25, 118, 72, 27, 88, 46, 9, 74, 34, 3, 77, 38, 4, 98, 48, 14, 125, 78, 28, 130, 87, 31, 157, 105, 43, 160, 108, 43, 161, 105, 42, 166, 111, 43, 176, 113, 45, 188, 128, 56, 191, 133, 59, 167, 110, 44, 194, 134, 60, 192, 130, 60, 146, + 87, 25, 171, 111, 42, 195, 131, 57, 208, 140, 59, 202, 140, 64, 173, 113, 43, 178, 116, 45, 150, 87, 24, 183, 118, 44, 175, 120, 49, 96, 57, 18, 55, 25, 5, 45, 20, 6, 18, 5, 0, 26, 11, 3, 32, 16, 5, 117, 94, 56, 151, 132, 97, 187, 174, 137, 214, 197, 155, 219, 200, 151, 216, 195, 145, 219, 188, 127, 211, 178, 111, 216, 191, 132, 216, 186, 123, 209, 188, 137, 229, 208, 160, 218, 196, 148, 213, 180, 116, 230, 209, 153, 232, 211, 159, 237, 219, 171, 241, 220, 162, 236, 220, 174, 199, 184, 144, 137, 127, 96, 141, 121, 85, 110, 77, 43, 114, 63, 20, 148, 98, 47, 138, 87, 30, 140, 82, 22, 154, 96, 33, 161, 104, 46, 167, 105, 38, 159, 96, 34, 168, 101, 36, 189, 125, 55, 194, 131, 60, 194, 132, 63, 201, 141, 67, 205, 141, 66, 216, 157, + 83, 195, 136, 68, 200, 147, 77, 205, 142, 70, 217, 155, 79, 201, 138, 66, 186, 119, 57, 180, 115, 39, 188, 121, 45, 196, 137, 60, 189, 130, 65, 179, 121, 53, 185, 127, 54, 193, 133, 54, 181, 115, 42, 192, 120, 42, 182, 108, 33, 193, 120, 45, 192, 120, 46, 181, 109, 40, 180, 108, 34, 182, 109, 39, 176, 103, 34, 181, 113, 41, 188, 120, 48, 175, 103, 33, 167, 98, 33, 176, 108, 38, 192, 134, 62, 179, 127, 57, 148, 110, 38, 128, 103, 36, 103, 85, 19, 80, 70, 11, 64, 56, 1, 70, 63, 1, 76, 70, 4, 63, 63, 1, 59, 69, 5, 59, 77, 34, 60, 96, 101, 72, 130, 169, 89, 158, 210, 113, 190, 242, 131, 206, 249, 121, 195, 248, 100, 170, 225, 75, 131, 169, 47, 82, 88, 53, 86, 83, 86, 120, 117, 111, 142, 112, 113, 137, 92, 106, 142, 131, + 89, 74, 7, 88, 78, 10, 108, 96, 43, 91, 75, 26, 74, 69, 19, 77, 74, 20, 84, 70, 5, 103, 90, 9, 120, 111, 15, 132, 118, 10, 135, 117, 12, 114, 83, 30, 48, 30, 1, 36, 24, 1, 67, 56, 4, 115, 102, 28, 114, 99, 40, 102, 88, 40, 72, 65, 26, 94, 83, 24, 123, 104, 47, 115, 85, 32, 132, 87, 34, 158, 107, 43, 168, 112, 43, 165, 105, 42, 177, 115, 43, 155, 96, 30, 157, 98, 34, 186, 128, 55, 180, 125, 52, 167, 110, 41, 168, 110, 39, 161, 104, 38, 147, 99, 39, 110, 63, 17, 115, 67, 21, 93, 51, 9, 73, 33, 1, 85, 44, 8, 97, 53, 11, 126, 80, 35, 140, 94, 38, 160, 108, 48, 159, 108, 43, 157, 104, 42, 173, 116, 49, 185, 125, 55, 191, 133, 59, 189, 128, 58, 167, 110, 45, 195, 136, 65, 188, 127, 58, 164, + 106, 45, 167, 107, 44, 165, 105, 38, 197, 133, 54, 205, 143, 62, 172, 109, 40, 190, 128, 55, 160, 96, 28, 169, 101, 34, 183, 120, 45, 155, 107, 47, 68, 38, 12, 45, 16, 3, 35, 13, 0, 29, 13, 2, 53, 26, 9, 138, 102, 57, 182, 163, 116, 195, 178, 137, 212, 191, 146, 214, 193, 145, 220, 198, 149, 233, 206, 147, 230, 203, 145, 221, 198, 146, 223, 197, 144, 236, 215, 163, 231, 212, 164, 213, 188, 141, 222, 198, 141, 210, 188, 134, 232, 210, 154, 237, 225, 177, 242, 222, 166, 241, 222, 175, 229, 215, 172, 216, 194, 145, 196, 170, 120, 139, 99, 56, 130, 80, 32, 167, 110, 50, 170, 118, 54, 161, 101, 41, 184, 122, 48, 180, 120, 50, 194, 134, 66, 172, 108, 47, 168, 105, 41, 189, 124, 53, 190, 122, 53, 192, 128, 58, 198, 142, 74, 206, 142, 66, 217, 156, + 80, 201, 140, 65, 210, 153, 82, 199, 136, 64, 215, 151, 79, 202, 143, 69, 175, 112, 53, 179, 117, 46, 188, 125, 60, 195, 130, 58, 196, 140, 69, 193, 136, 67, 180, 120, 46, 195, 130, 52, 182, 115, 41, 178, 108, 36, 186, 115, 44, 177, 103, 29, 192, 119, 45, 187, 113, 37, 185, 114, 42, 186, 111, 40, 176, 102, 35, 173, 105, 38, 182, 107, 38, 182, 112, 43, 172, 103, 37, 167, 100, 35, 182, 115, 44, 184, 126, 57, 165, 114, 53, 113, 85, 23, 96, 83, 21, 68, 65, 5, 59, 58, 0, 63, 63, 2, 50, 51, 2, 39, 45, 0, 45, 62, 7, 42, 62, 24, 49, 72, 58, 65, 105, 118, 85, 148, 192, 106, 176, 236, 103, 173, 229, 89, 151, 194, 65, 98, 104, 31, 64, 69, 23, 69, 89, 49, 87, 98, 71, 95, 83, 77, 95, 42, 82, 101, 49, 82, 114, 103, + 100, 87, 28, 90, 84, 33, 92, 89, 60, 118, 91, 37, 87, 76, 23, 105, 98, 31, 138, 122, 21, 157, 141, 22, 141, 124, 15, 95, 85, 11, 62, 48, 4, 101, 69, 28, 42, 24, 2, 89, 81, 16, 123, 114, 13, 129, 116, 40, 114, 96, 38, 100, 87, 37, 71, 63, 15, 92, 81, 27, 130, 120, 43, 146, 120, 49, 147, 107, 45, 137, 95, 41, 150, 100, 40, 165, 108, 41, 152, 96, 32, 148, 93, 31, 182, 123, 52, 195, 133, 59, 176, 117, 46, 175, 115, 42, 172, 115, 43, 164, 111, 45, 136, 83, 27, 136, 84, 29, 108, 61, 16, 84, 43, 6, 72, 36, 3, 82, 42, 6, 88, 45, 10, 113, 70, 27, 133, 85, 33, 157, 104, 43, 158, 108, 44, 158, 104, 38, 174, 119, 45, 179, 125, 56, 175, 119, 50, 188, 131, 64, 170, 114, 50, 199, 143, 69, 186, 127, 58, 152, + 89, 28, 164, 108, 45, 143, 82, 26, 195, 129, 53, 206, 139, 58, 179, 115, 45, 148, 84, 24, 178, 111, 37, 169, 102, 36, 181, 113, 39, 170, 113, 48, 128, 88, 37, 63, 33, 9, 41, 16, 1, 39, 17, 5, 54, 26, 8, 114, 78, 43, 171, 149, 106, 199, 183, 143, 217, 195, 152, 205, 183, 138, 217, 193, 142, 208, 174, 111, 214, 187, 130, 218, 194, 140, 218, 192, 136, 227, 202, 147, 221, 195, 146, 211, 188, 134, 217, 189, 134, 229, 201, 143, 227, 195, 131, 242, 227, 185, 242, 227, 185, 236, 220, 169, 236, 222, 181, 223, 200, 148, 188, 150, 95, 126, 78, 30, 161, 108, 51, 171, 107, 41, 178, 119, 52, 165, 104, 40, 173, 106, 36, 196, 133, 58, 194, 133, 59, 196, 133, 59, 191, 130, 60, 186, 121, 50, 197, 130, 54, 201, 136, 60, 192, 128, 58, 194, 132, 62, 210, 148, + 69, 201, 141, 64, 204, 148, 76, 201, 137, 65, 213, 150, 69, 197, 136, 60, 186, 122, 53, 177, 114, 44, 191, 132, 59, 190, 127, 52, 194, 135, 64, 192, 136, 65, 179, 117, 45, 192, 123, 50, 185, 113, 39, 183, 109, 38, 183, 110, 37, 173, 100, 28, 181, 108, 35, 179, 104, 31, 188, 113, 38, 177, 106, 36, 182, 112, 40, 170, 101, 37, 173, 104, 35, 179, 109, 39, 179, 110, 39, 168, 101, 37, 176, 114, 42, 183, 125, 53, 176, 124, 53, 144, 105, 34, 109, 88, 25, 74, 67, 8, 61, 66, 0, 64, 74, 0, 46, 61, 2, 34, 46, 0, 35, 59, 1, 43, 72, 15, 49, 79, 42, 68, 108, 108, 82, 127, 143, 82, 119, 134, 68, 100, 106, 52, 70, 54, 30, 46, 33, 15, 43, 45, 21, 59, 73, 35, 71, 77, 45, 71, 57, 53, 70, 24, 50, 67, 34, 45, 64, 59, + 67, 52, 5, 90, 78, 27, 101, 97, 68, 116, 100, 38, 148, 125, 50, 152, 136, 35, 158, 146, 51, 129, 116, 33, 75, 62, 0, 43, 32, 0, 35, 22, 2, 110, 81, 38, 104, 96, 18, 118, 111, 10, 128, 121, 12, 139, 125, 45, 119, 101, 38, 94, 81, 26, 90, 79, 26, 75, 63, 12, 102, 90, 21, 139, 124, 47, 122, 95, 34, 128, 90, 36, 146, 97, 35, 152, 99, 35, 135, 85, 29, 186, 129, 55, 196, 136, 63, 176, 119, 44, 174, 113, 44, 167, 109, 38, 182, 125, 54, 165, 108, 45, 148, 93, 36, 113, 67, 19, 100, 54, 10, 80, 38, 4, 75, 36, 4, 72, 35, 2, 94, 53, 16, 91, 53, 12, 123, 79, 31, 162, 110, 50, 160, 108, 48, 165, 113, 49, 184, 131, 60, 177, 125, 58, 169, 114, 46, 180, 123, 54, 178, 120, 56, 197, 142, 68, 183, 127, 58, 166, + 107, 46, 163, 106, 47, 147, 88, 25, 180, 115, 46, 203, 136, 55, 185, 122, 48, 128, 75, 22, 174, 110, 37, 171, 103, 32, 183, 117, 40, 178, 115, 47, 154, 101, 42, 119, 75, 30, 66, 34, 10, 43, 15, 3, 41, 17, 5, 79, 53, 27, 186, 168, 129, 213, 198, 160, 216, 198, 159, 202, 183, 140, 217, 198, 151, 216, 189, 131, 225, 200, 151, 217, 194, 143, 227, 206, 158, 213, 188, 136, 228, 208, 159, 226, 205, 158, 220, 194, 146, 233, 213, 160, 223, 200, 145, 233, 215, 168, 239, 224, 182, 218, 193, 142, 226, 209, 165, 230, 214, 169, 191, 152, 94, 170, 120, 59, 181, 124, 54, 174, 116, 49, 177, 115, 43, 171, 104, 36, 181, 118, 48, 189, 122, 52, 200, 135, 61, 205, 139, 63, 208, 139, 59, 198, 131, 54, 203, 135, 57, 210, 145, 67, 205, 148, 76, 199, 141, 70, 199, 138, + 62, 196, 138, 63, 200, 146, 76, 203, 140, 65, 209, 148, 68, 199, 140, 70, 193, 132, 63, 177, 119, 54, 191, 132, 62, 189, 130, 60, 198, 136, 64, 188, 126, 54, 167, 104, 37, 186, 121, 43, 183, 115, 38, 180, 108, 34, 179, 106, 32, 182, 112, 44, 178, 108, 36, 184, 116, 46, 180, 106, 32, 182, 111, 40, 178, 108, 34, 186, 119, 46, 171, 101, 36, 177, 108, 38, 181, 111, 42, 177, 110, 44, 169, 108, 40, 175, 113, 46, 172, 125, 53, 152, 110, 40, 135, 104, 35, 96, 83, 15, 69, 74, 2, 66, 78, 1, 52, 67, 1, 46, 64, 0, 54, 79, 9, 59, 91, 36, 75, 106, 72, 87, 119, 108, 83, 134, 161, 82, 138, 179, 67, 118, 146, 60, 90, 93, 48, 85, 98, 36, 71, 82, 27, 67, 84, 40, 94, 127, 68, 113, 127, 83, 109, 75, 79, 101, 55, 58, 74, 42, + 65, 58, 13, 88, 74, 20, 78, 63, 7, 96, 81, 16, 141, 121, 44, 147, 128, 26, 113, 96, 9, 80, 71, 2, 28, 24, 0, 34, 26, 3, 102, 92, 24, 152, 131, 63, 120, 109, 21, 122, 115, 12, 139, 126, 15, 145, 130, 46, 118, 99, 38, 75, 60, 15, 78, 64, 13, 63, 57, 4, 73, 62, 13, 115, 96, 34, 113, 86, 30, 141, 97, 39, 154, 105, 42, 120, 70, 21, 144, 91, 36, 196, 139, 61, 179, 121, 53, 171, 113, 44, 165, 107, 37, 172, 114, 46, 188, 130, 56, 172, 116, 50, 136, 87, 34, 82, 43, 7, 108, 64, 15, 82, 45, 6, 76, 36, 3, 65, 29, 4, 86, 48, 12, 84, 49, 12, 123, 76, 31, 167, 119, 54, 169, 119, 57, 174, 123, 58, 192, 137, 67, 171, 120, 51, 175, 121, 51, 184, 131, 62, 174, 119, 55, 190, 136, 69, 187, 130, 64, 183, + 124, 52, 173, 117, 56, 168, 114, 46, 165, 102, 40, 202, 137, 57, 188, 124, 50, 140, 83, 28, 157, 94, 34, 170, 106, 43, 188, 122, 45, 185, 123, 49, 171, 110, 42, 144, 99, 40, 141, 91, 29, 60, 29, 5, 29, 8, 1, 96, 75, 50, 197, 178, 138, 208, 193, 156, 184, 163, 125, 201, 182, 144, 216, 196, 153, 187, 158, 109, 199, 175, 134, 208, 183, 134, 209, 187, 141, 196, 172, 122, 221, 206, 160, 195, 172, 125, 199, 171, 124, 221, 207, 164, 218, 198, 154, 222, 196, 144, 234, 219, 178, 221, 203, 163, 217, 200, 156, 230, 215, 175, 192, 153, 100, 184, 129, 62, 192, 133, 63, 181, 120, 51, 179, 112, 39, 190, 123, 46, 167, 104, 35, 193, 124, 51, 205, 140, 64, 204, 138, 60, 215, 149, 74, 200, 134, 58, 207, 143, 66, 208, 141, 66, 207, 151, 75, 211, 151, 78, 195, 132, + 54, 205, 152, 76, 207, 146, 70, 208, 142, 66, 206, 142, 65, 198, 137, 63, 198, 144, 71, 194, 138, 65, 188, 124, 51, 195, 141, 69, 197, 133, 59, 185, 123, 50, 170, 110, 41, 166, 104, 31, 173, 105, 33, 180, 110, 36, 176, 104, 34, 185, 110, 32, 183, 113, 40, 187, 119, 46, 177, 108, 39, 185, 115, 43, 169, 99, 29, 183, 113, 44, 176, 107, 39, 172, 100, 32, 182, 115, 45, 183, 115, 44, 178, 112, 45, 174, 109, 44, 166, 114, 43, 137, 102, 30, 126, 98, 23, 117, 98, 24, 79, 77, 7, 60, 72, 1, 59, 77, 1, 61, 82, 5, 69, 91, 40, 79, 108, 88, 88, 122, 109, 97, 135, 134, 103, 159, 193, 98, 174, 238, 96, 174, 235, 94, 160, 207, 89, 154, 202, 78, 147, 209, 62, 127, 175, 56, 119, 159, 81, 130, 145, 101, 126, 84, 106, 130, 74, 85, 109, 51, + 100, 88, 13, 113, 96, 18, 118, 103, 28, 100, 85, 15, 78, 62, 6, 100, 80, 20, 93, 82, 20, 70, 64, 7, 71, 63, 15, 132, 124, 48, 154, 146, 46, 151, 136, 51, 104, 94, 13, 111, 107, 14, 128, 118, 10, 144, 129, 41, 103, 86, 25, 43, 37, 1, 60, 60, 7, 85, 80, 11, 82, 75, 20, 86, 77, 26, 103, 73, 26, 126, 81, 34, 148, 101, 44, 117, 70, 24, 177, 123, 52, 194, 134, 61, 171, 117, 48, 161, 103, 34, 172, 110, 45, 188, 130, 58, 181, 123, 53, 164, 108, 44, 115, 68, 19, 101, 57, 13, 114, 67, 16, 83, 42, 4, 76, 38, 3, 63, 30, 3, 87, 51, 10, 78, 45, 9, 134, 85, 35, 168, 121, 58, 174, 123, 60, 177, 123, 57, 184, 137, 68, 174, 119, 52, 178, 125, 54, 189, 135, 63, 178, 130, 66, 191, 140, 72, 182, 126, 60, 190, + 133, 61, 171, 117, 57, 158, 101, 38, 151, 92, 27, 182, 119, 41, 189, 126, 49, 164, 108, 39, 149, 85, 25, 180, 114, 40, 177, 110, 38, 187, 119, 41, 189, 124, 47, 170, 115, 47, 143, 92, 30, 91, 47, 9, 36, 12, 0, 98, 76, 57, 165, 147, 114, 169, 151, 120, 183, 161, 129, 185, 167, 131, 210, 192, 153, 178, 158, 113, 180, 158, 117, 198, 181, 140, 193, 169, 129, 177, 153, 104, 206, 187, 143, 211, 191, 150, 205, 181, 137, 218, 199, 155, 209, 186, 143, 190, 166, 119, 214, 194, 147, 203, 183, 139, 203, 184, 144, 210, 189, 145, 198, 167, 115, 197, 139, 69, 197, 135, 62, 193, 133, 58, 182, 116, 45, 190, 126, 48, 192, 126, 49, 197, 129, 50, 211, 143, 60, 207, 141, 60, 211, 144, 65, 201, 137, 59, 198, 132, 61, 213, 151, 73, 205, 147, 74, 213, 153, 77, 190, 126, + 50, 200, 142, 76, 185, 120, 54, 200, 135, 61, 201, 139, 63, 201, 139, 63, 201, 144, 69, 200, 146, 73, 190, 130, 60, 193, 135, 63, 198, 137, 63, 184, 119, 46, 183, 119, 48, 177, 114, 47, 165, 101, 37, 176, 107, 38, 176, 105, 37, 173, 99, 29, 179, 109, 36, 182, 113, 41, 179, 108, 38, 172, 102, 32, 175, 104, 36, 169, 96, 31, 181, 110, 41, 182, 114, 45, 175, 105, 34, 178, 109, 40, 184, 115, 48, 176, 111, 43, 166, 113, 40, 138, 109, 31, 116, 101, 21, 103, 90, 16, 83, 79, 6, 69, 78, 2, 60, 75, 1, 61, 80, 15, 60, 82, 31, 66, 93, 67, 83, 124, 122, 101, 150, 168, 103, 166, 205, 110, 180, 239, 112, 190, 246, 115, 192, 246, 120, 197, 247, 111, 188, 245, 83, 152, 209, 55, 112, 150, 67, 125, 166, 96, 128, 118, 104, 132, 103, 107, 133, 84, + 127, 109, 21, 115, 101, 13, 81, 67, 11, 71, 60, 6, 47, 39, 2, 60, 43, 6, 43, 32, 5, 105, 94, 27, 154, 145, 52, 137, 127, 27, 115, 101, 20, 119, 102, 49, 69, 66, 16, 69, 69, 21, 99, 91, 11, 105, 94, 2, 73, 64, 0, 46, 42, 4, 90, 85, 8, 93, 82, 1, 89, 81, 8, 94, 77, 23, 88, 59, 17, 126, 90, 42, 134, 87, 36, 164, 113, 49, 181, 126, 54, 183, 130, 60, 163, 107, 43, 160, 102, 37, 188, 131, 57, 186, 128, 54, 176, 120, 50, 151, 99, 38, 109, 62, 16, 131, 80, 24, 103, 54, 8, 87, 46, 8, 76, 40, 4, 80, 44, 11, 98, 57, 13, 74, 41, 7, 143, 93, 39, 164, 118, 55, 177, 128, 64, 178, 127, 64, 186, 135, 68, 165, 109, 48, 174, 118, 51, 187, 134, 66, 173, 128, 62, 189, 139, 72, 184, 127, 61, 197, + 138, 68, 182, 127, 57, 165, 102, 40, 151, 91, 35, 174, 111, 34, 185, 119, 42, 165, 108, 44, 163, 103, 41, 179, 109, 35, 165, 97, 28, 183, 112, 36, 183, 115, 37, 189, 126, 47, 148, 95, 29, 107, 60, 17, 42, 17, 0, 91, 68, 54, 133, 117, 91, 137, 124, 94, 112, 102, 77, 148, 135, 109, 200, 184, 151, 183, 164, 129, 156, 133, 94, 178, 161, 130, 198, 178, 142, 197, 174, 132, 199, 179, 139, 198, 176, 140, 191, 167, 132, 188, 169, 129, 180, 155, 118, 187, 168, 130, 192, 174, 136, 159, 141, 109, 175, 152, 113, 192, 161, 113, 201, 160, 103, 205, 145, 73, 196, 131, 59, 182, 118, 48, 194, 128, 54, 199, 131, 50, 197, 130, 54, 212, 146, 60, 212, 140, 55, 211, 140, 55, 219, 152, 71, 209, 148, 74, 190, 119, 52, 204, 139, 64, 203, 141, 68, 213, 152, 77, 186, 123, + 50, 193, 134, 64, 184, 121, 56, 203, 140, 64, 203, 141, 66, 207, 147, 71, 210, 153, 78, 201, 148, 79, 190, 133, 64, 191, 130, 59, 194, 132, 58, 171, 106, 38, 179, 107, 38, 188, 121, 51, 188, 130, 66, 151, 83, 26, 160, 91, 23, 175, 101, 31, 172, 97, 31, 171, 98, 31, 168, 99, 34, 175, 107, 39, 178, 111, 45, 170, 98, 34, 174, 101, 34, 186, 114, 44, 181, 109, 39, 180, 112, 42, 180, 114, 43, 184, 122, 48, 180, 120, 49, 147, 110, 37, 108, 91, 15, 99, 88, 15, 86, 83, 15, 95, 95, 33, 72, 79, 21, 53, 68, 3, 52, 68, 3, 52, 75, 25, 75, 117, 108, 99, 152, 178, 111, 176, 216, 112, 184, 238, 119, 194, 246, 137, 208, 248, 139, 209, 250, 119, 197, 253, 87, 151, 199, 51, 106, 137, 65, 134, 186, 91, 149, 176, 102, 146, 147, 114, 145, 126, + 102, 87, 17, 74, 63, 12, 55, 46, 3, 37, 26, 0, 38, 28, 4, 84, 69, 25, 96, 87, 27, 72, 67, 16, 51, 46, 0, 37, 37, 0, 58, 44, 11, 66, 50, 18, 23, 23, 1, 17, 20, 0, 22, 25, 1, 30, 30, 0, 21, 22, 0, 15, 18, 2, 41, 39, 1, 54, 51, 0, 61, 57, 12, 66, 47, 14, 100, 69, 30, 153, 110, 43, 132, 90, 38, 166, 113, 48, 186, 133, 63, 168, 117, 48, 164, 107, 39, 182, 124, 52, 192, 135, 60, 172, 110, 38, 173, 117, 51, 137, 88, 28, 126, 77, 23, 131, 79, 20, 96, 50, 7, 101, 56, 13, 75, 38, 6, 103, 61, 18, 93, 55, 15, 91, 52, 13, 143, 91, 40, 164, 116, 52, 180, 129, 66, 178, 128, 63, 179, 129, 62, 164, 112, 45, 171, 118, 51, 189, 139, 71, 175, 128, 65, 187, 138, 73, 187, 135, 65, 183, + 130, 60, 182, 128, 59, 170, 108, 43, 149, 88, 29, 157, 97, 29, 176, 111, 38, 150, 93, 34, 161, 101, 37, 176, 106, 36, 161, 94, 26, 167, 103, 30, 188, 120, 40, 191, 127, 50, 178, 121, 46, 122, 77, 25, 43, 16, 1, 59, 34, 18, 110, 94, 75, 96, 84, 64, 121, 111, 93, 108, 98, 77, 186, 178, 151, 160, 144, 115, 169, 153, 125, 125, 112, 89, 149, 136, 101, 185, 164, 125, 179, 163, 126, 189, 169, 132, 190, 169, 132, 158, 139, 105, 149, 127, 97, 159, 138, 108, 152, 135, 106, 161, 147, 116, 179, 151, 107, 191, 144, 84, 208, 156, 88, 207, 155, 87, 199, 138, 64, 192, 130, 62, 188, 117, 41, 199, 128, 48, 190, 119, 43, 211, 140, 58, 204, 133, 52, 208, 138, 59, 212, 146, 62, 210, 146, 66, 196, 129, 56, 210, 149, 70, 202, 145, 71, 217, 156, 78, 194, 131, + 57, 194, 134, 68, 193, 134, 61, 195, 133, 60, 202, 140, 65, 200, 140, 63, 207, 147, 71, 198, 142, 72, 187, 129, 59, 192, 131, 60, 180, 118, 48, 170, 109, 43, 166, 99, 32, 187, 117, 42, 193, 131, 60, 185, 125, 61, 149, 87, 33, 141, 77, 21, 169, 99, 31, 175, 105, 35, 159, 90, 25, 165, 94, 28, 171, 105, 39, 183, 116, 44, 175, 105, 35, 185, 115, 41, 184, 114, 41, 182, 112, 40, 180, 118, 48, 177, 116, 50, 182, 123, 55, 156, 111, 40, 139, 111, 43, 116, 99, 37, 108, 102, 57, 105, 114, 100, 91, 105, 90, 63, 78, 19, 50, 68, 0, 56, 77, 1, 75, 99, 46, 99, 141, 141, 107, 167, 198, 115, 185, 239, 125, 199, 245, 140, 212, 251, 138, 212, 251, 126, 203, 254, 91, 159, 208, 59, 108, 125, 65, 134, 184, 87, 153, 195, 107, 152, 153, 107, 132, 97, + 53, 41, 4, 39, 28, 0, 37, 26, 0, 30, 22, 1, 42, 36, 7, 56, 51, 16, 41, 35, 2, 17, 18, 0, 17, 16, 0, 17, 17, 0, 51, 40, 8, 45, 57, 48, 38, 80, 106, 19, 42, 57, 34, 52, 65, 16, 21, 9, 37, 37, 9, 65, 58, 25, 69, 58, 30, 54, 44, 12, 54, 44, 12, 59, 39, 16, 129, 96, 46, 126, 86, 31, 145, 100, 44, 177, 124, 53, 172, 118, 48, 175, 124, 52, 165, 108, 39, 188, 134, 64, 187, 128, 56, 173, 115, 45, 160, 108, 42, 145, 93, 32, 154, 99, 33, 132, 78, 19, 127, 78, 22, 86, 47, 8, 62, 30, 3, 103, 61, 17, 92, 53, 14, 100, 59, 16, 146, 96, 44, 172, 120, 54, 178, 125, 60, 178, 125, 59, 177, 124, 57, 160, 107, 44, 177, 123, 55, 184, 135, 68, 185, 137, 72, 178, 133, 65, 178, 128, 63, 181, + 126, 55, 186, 135, 66, 188, 131, 64, 149, 95, 35, 163, 103, 36, 171, 108, 36, 154, 102, 45, 170, 113, 48, 167, 107, 40, 160, 95, 30, 138, 74, 17, 189, 122, 44, 191, 126, 52, 187, 125, 50, 137, 87, 37, 56, 21, 1, 63, 35, 19, 47, 31, 16, 74, 59, 43, 68, 57, 44, 72, 57, 45, 172, 157, 139, 115, 104, 81, 143, 131, 114, 77, 66, 50, 123, 108, 88, 179, 161, 121, 145, 124, 95, 166, 146, 115, 163, 141, 112, 147, 132, 102, 120, 105, 81, 148, 129, 105, 119, 97, 78, 142, 117, 89, 175, 125, 72, 202, 149, 72, 199, 135, 63, 196, 139, 71, 193, 131, 61, 198, 131, 58, 184, 114, 39, 201, 136, 55, 178, 110, 45, 207, 137, 50, 198, 122, 46, 207, 139, 59, 203, 133, 54, 206, 143, 66, 203, 135, 52, 211, 147, 66, 198, 136, 60, 213, 153, 75, 196, 134, + 66, 200, 141, 76, 194, 138, 64, 196, 136, 65, 201, 139, 65, 198, 138, 64, 202, 146, 71, 195, 140, 69, 188, 128, 58, 182, 122, 50, 172, 113, 46, 155, 95, 32, 152, 86, 24, 169, 101, 27, 185, 117, 44, 203, 143, 71, 183, 122, 60, 139, 80, 33, 149, 84, 24, 175, 106, 38, 176, 104, 34, 157, 86, 23, 162, 92, 27, 177, 109, 40, 175, 103, 35, 180, 109, 34, 184, 111, 40, 182, 116, 41, 176, 107, 39, 171, 112, 42, 170, 117, 53, 157, 112, 48, 141, 115, 53, 135, 114, 59, 105, 100, 63, 101, 111, 102, 88, 102, 89, 52, 64, 9, 40, 59, 0, 54, 72, 0, 72, 93, 23, 97, 127, 108, 98, 151, 169, 106, 168, 201, 111, 184, 231, 126, 202, 248, 132, 206, 248, 123, 202, 254, 98, 165, 209, 77, 116, 111, 65, 116, 141, 75, 128, 159, 101, 134, 121, 106, 122, 48, + 32, 22, 0, 40, 30, 2, 70, 62, 24, 40, 40, 20, 19, 19, 0, 17, 16, 1, 21, 15, 1, 51, 45, 11, 60, 58, 13, 68, 73, 12, 98, 97, 31, 78, 113, 86, 88, 156, 206, 73, 137, 194, 59, 83, 112, 35, 50, 48, 66, 60, 16, 126, 115, 68, 142, 124, 82, 128, 114, 69, 76, 66, 35, 79, 55, 28, 105, 72, 29, 135, 93, 38, 151, 107, 42, 148, 99, 38, 173, 117, 51, 165, 112, 43, 165, 111, 44, 194, 142, 65, 184, 122, 49, 174, 116, 49, 164, 113, 47, 162, 107, 41, 161, 103, 30, 154, 98, 34, 131, 82, 20, 78, 42, 5, 63, 32, 0, 98, 59, 15, 96, 53, 13, 115, 68, 22, 146, 97, 41, 157, 107, 39, 173, 120, 51, 178, 123, 57, 176, 125, 56, 164, 110, 50, 180, 129, 60, 168, 118, 54, 191, 138, 73, 178, 133, 67, 177, 129, 66, 166, + 113, 43, 190, 136, 67, 179, 123, 52, 158, 99, 39, 157, 96, 33, 163, 106, 42, 146, 98, 42, 173, 112, 46, 166, 102, 38, 158, 98, 37, 157, 92, 31, 159, 97, 34, 185, 121, 51, 189, 128, 52, 155, 89, 29, 98, 47, 9, 60, 21, 2, 46, 13, 0, 53, 32, 15, 47, 32, 21, 49, 30, 19, 147, 131, 109, 100, 88, 70, 99, 85, 65, 91, 76, 63, 66, 43, 26, 154, 134, 99, 156, 137, 111, 161, 142, 115, 152, 130, 104, 137, 112, 86, 112, 79, 53, 139, 102, 75, 113, 79, 53, 113, 79, 40, 165, 103, 38, 201, 143, 65, 191, 126, 49, 204, 132, 55, 194, 124, 49, 211, 141, 58, 195, 124, 45, 204, 137, 64, 185, 113, 40, 222, 151, 66, 197, 127, 43, 212, 145, 63, 200, 129, 57, 216, 151, 74, 193, 123, 41, 205, 141, 61, 199, 139, 65, 208, 152, 74, 199, 143, + 69, 199, 142, 75, 194, 134, 59, 202, 146, 74, 199, 139, 66, 197, 138, 66, 201, 146, 72, 193, 137, 65, 182, 121, 45, 185, 128, 54, 163, 103, 39, 147, 87, 26, 149, 86, 26, 152, 87, 26, 160, 92, 25, 189, 124, 46, 201, 140, 63, 173, 112, 53, 132, 68, 16, 164, 97, 35, 183, 114, 49, 171, 100, 36, 160, 91, 30, 172, 105, 41, 177, 107, 42, 176, 103, 33, 179, 109, 34, 183, 118, 39, 183, 119, 46, 158, 106, 36, 150, 108, 46, 148, 107, 48, 145, 118, 60, 138, 115, 56, 97, 86, 37, 74, 75, 41, 66, 75, 26, 44, 56, 3, 28, 48, 6, 37, 59, 5, 61, 86, 31, 86, 112, 79, 95, 123, 91, 92, 132, 121, 101, 165, 197, 112, 185, 235, 118, 197, 249, 118, 195, 250, 103, 165, 202, 88, 111, 76, 73, 91, 68, 73, 90, 82, 77, 96, 73, 92, 108, 60, + 72, 56, 22, 64, 60, 20, 33, 34, 10, 18, 16, 1, 22, 17, 1, 31, 28, 7, 68, 61, 18, 76, 88, 56, 74, 101, 93, 90, 113, 93, 110, 128, 100, 87, 118, 101, 97, 154, 176, 97, 168, 231, 73, 134, 191, 23, 50, 66, 47, 51, 13, 114, 101, 39, 146, 122, 71, 159, 142, 104, 78, 68, 45, 93, 68, 30, 80, 53, 23, 143, 103, 48, 141, 98, 42, 141, 94, 39, 173, 123, 53, 156, 105, 40, 178, 126, 61, 193, 131, 56, 176, 118, 45, 179, 127, 52, 152, 102, 40, 170, 112, 40, 167, 110, 42, 151, 98, 32, 99, 58, 12, 96, 59, 15, 73, 40, 4, 100, 57, 14, 113, 65, 18, 124, 76, 21, 151, 101, 42, 144, 97, 35, 174, 124, 55, 180, 127, 59, 175, 127, 59, 156, 106, 43, 182, 131, 62, 171, 123, 56, 186, 136, 69, 170, 125, 61, 175, 126, 64, 182, + 129, 60, 187, 136, 66, 172, 126, 58, 159, 103, 41, 152, 94, 28, 168, 110, 41, 133, 79, 25, 177, 118, 50, 176, 117, 50, 167, 107, 43, 176, 113, 44, 173, 106, 40, 190, 125, 50, 197, 136, 65, 173, 112, 44, 136, 77, 23, 128, 77, 26, 74, 30, 2, 65, 27, 5, 52, 25, 8, 47, 20, 10, 67, 46, 32, 100, 84, 69, 102, 85, 67, 64, 35, 21, 53, 23, 8, 125, 96, 69, 120, 91, 68, 146, 126, 93, 134, 94, 54, 135, 99, 62, 109, 69, 34, 144, 87, 42, 128, 80, 38, 148, 94, 43, 172, 106, 38, 197, 138, 62, 206, 139, 61, 217, 144, 61, 204, 130, 51, 201, 131, 49, 195, 128, 49, 195, 128, 49, 177, 106, 35, 197, 127, 49, 190, 120, 41, 212, 143, 62, 214, 149, 70, 208, 145, 69, 196, 132, 54, 194, 132, 56, 202, 141, 64, 210, 155, 81, 200, 145, + 72, 194, 135, 74, 196, 140, 73, 196, 142, 69, 198, 138, 66, 204, 148, 75, 198, 140, 66, 186, 126, 52, 183, 120, 46, 186, 119, 44, 190, 126, 52, 158, 95, 38, 150, 89, 31, 152, 90, 31, 133, 69, 14, 159, 91, 22, 191, 123, 49, 201, 138, 64, 183, 120, 56, 170, 105, 44, 175, 106, 42, 181, 113, 46, 170, 100, 39, 164, 94, 29, 174, 103, 38, 165, 98, 33, 179, 107, 35, 178, 111, 39, 182, 125, 54, 153, 103, 36, 127, 95, 32, 132, 103, 38, 127, 101, 38, 101, 85, 27, 65, 62, 16, 52, 54, 8, 54, 63, 6, 52, 72, 18, 49, 81, 64, 54, 95, 98, 69, 105, 94, 77, 105, 75, 90, 110, 61, 98, 132, 120, 107, 171, 203, 116, 193, 242, 116, 195, 249, 108, 180, 239, 87, 138, 160, 72, 89, 37, 70, 79, 18, 68, 77, 30, 72, 85, 48, 78, 87, 23, + 99, 76, 31, 26, 22, 0, 14, 10, 0, 27, 22, 4, 71, 61, 17, 67, 64, 28, 30, 35, 13, 63, 96, 77, 77, 129, 142, 103, 154, 179, 112, 170, 211, 102, 153, 187, 110, 143, 131, 107, 180, 234, 83, 152, 216, 39, 75, 102, 60, 65, 32, 98, 89, 22, 126, 114, 64, 127, 114, 73, 77, 60, 34, 57, 36, 9, 73, 47, 21, 155, 111, 50, 116, 78, 30, 156, 107, 42, 173, 118, 51, 180, 130, 60, 181, 131, 58, 197, 135, 58, 180, 122, 46, 171, 121, 52, 171, 117, 49, 176, 121, 53, 178, 123, 52, 131, 78, 22, 127, 80, 31, 111, 68, 17, 80, 44, 6, 88, 50, 11, 119, 70, 18, 127, 77, 21, 152, 104, 41, 141, 92, 33, 173, 123, 51, 176, 120, 50, 175, 125, 57, 165, 114, 49, 178, 127, 55, 176, 125, 59, 187, 142, 76, 159, 116, 52, 179, 131, 64, 172, + 119, 54, 185, 133, 65, 170, 121, 58, 173, 117, 51, 149, 86, 25, 164, 106, 40, 136, 84, 30, 182, 123, 53, 188, 129, 59, 168, 106, 38, 181, 117, 48, 189, 127, 54, 186, 124, 57, 194, 135, 60, 177, 119, 45, 176, 114, 45, 163, 102, 40, 113, 65, 17, 100, 53, 13, 87, 40, 10, 64, 28, 9, 41, 12, 0, 101, 63, 36, 78, 45, 19, 91, 48, 20, 68, 33, 9, 117, 79, 41, 133, 86, 42, 160, 116, 76, 172, 122, 64, 155, 111, 58, 110, 64, 20, 163, 104, 48, 166, 107, 48, 174, 118, 52, 173, 111, 46, 202, 140, 65, 204, 138, 62, 211, 145, 66, 204, 133, 52, 193, 124, 50, 204, 142, 59, 190, 125, 57, 185, 112, 40, 195, 128, 56, 201, 131, 54, 201, 134, 54, 213, 152, 75, 210, 146, 69, 207, 145, 71, 191, 128, 58, 207, 143, 66, 211, 154, 82, 201, 147, + 73, 194, 140, 73, 201, 148, 79, 196, 139, 70, 193, 132, 58, 205, 149, 73, 191, 133, 58, 189, 129, 55, 187, 121, 46, 183, 114, 40, 190, 122, 43, 193, 132, 57, 165, 105, 44, 164, 102, 41, 150, 85, 30, 132, 72, 13, 169, 103, 36, 192, 127, 53, 205, 141, 66, 193, 132, 59, 187, 126, 63, 179, 116, 52, 177, 112, 48, 160, 91, 31, 152, 85, 26, 167, 101, 34, 165, 97, 30, 176, 110, 40, 178, 118, 47, 154, 101, 43, 124, 85, 19, 112, 86, 26, 103, 86, 22, 82, 74, 19, 44, 51, 19, 42, 58, 47, 48, 68, 51, 58, 80, 37, 69, 104, 86, 73, 122, 129, 78, 121, 121, 70, 95, 61, 68, 90, 46, 93, 141, 150, 116, 184, 229, 122, 196, 245, 108, 177, 223, 81, 137, 175, 61, 79, 53, 49, 57, 6, 57, 67, 7, 66, 81, 12, 68, 84, 16, 68, 85, 21, + 109, 91, 39, 30, 21, 6, 28, 24, 3, 66, 58, 6, 98, 81, 9, 88, 85, 43, 56, 61, 38, 36, 48, 32, 67, 104, 101, 99, 158, 194, 104, 169, 218, 96, 155, 196, 98, 124, 119, 100, 143, 158, 71, 124, 166, 46, 73, 83, 58, 60, 30, 85, 78, 26, 94, 86, 29, 91, 88, 38, 55, 44, 16, 48, 32, 11, 102, 71, 34, 135, 95, 37, 120, 78, 30, 149, 98, 41, 175, 124, 58, 171, 123, 56, 188, 136, 65, 169, 113, 42, 167, 109, 39, 166, 118, 56, 162, 112, 47, 185, 127, 58, 152, 96, 30, 139, 88, 32, 148, 95, 33, 112, 67, 19, 79, 44, 6, 90, 50, 12, 137, 86, 28, 117, 66, 15, 144, 91, 30, 158, 108, 43, 159, 109, 40, 185, 129, 56, 174, 125, 55, 161, 106, 43, 179, 128, 58, 178, 130, 62, 186, 140, 70, 162, 113, 51, 177, 127, 61, 179, + 129, 58, 185, 136, 70, 181, 130, 63, 180, 124, 55, 161, 105, 40, 165, 109, 46, 164, 113, 48, 188, 127, 54, 188, 129, 55, 176, 115, 45, 189, 129, 56, 191, 129, 56, 178, 116, 51, 204, 147, 74, 187, 130, 61, 195, 136, 66, 174, 114, 52, 152, 104, 51, 143, 92, 40, 170, 111, 49, 100, 52, 20, 85, 41, 7, 90, 48, 20, 111, 55, 10, 140, 86, 32, 112, 61, 20, 131, 81, 34, 163, 108, 45, 167, 111, 50, 181, 127, 58, 152, 98, 40, 148, 101, 50, 180, 118, 53, 183, 121, 46, 180, 117, 52, 192, 128, 56, 204, 139, 63, 185, 127, 53, 200, 139, 66, 199, 134, 54, 192, 127, 52, 202, 140, 66, 200, 135, 61, 189, 123, 49, 187, 121, 49, 203, 135, 56, 199, 129, 51, 212, 151, 72, 205, 143, 67, 209, 148, 71, 190, 129, 59, 200, 139, 61, 201, 144, 71, 211, 154, + 80, 195, 139, 71, 201, 144, 79, 204, 149, 77, 199, 137, 59, 204, 145, 72, 200, 141, 65, 192, 129, 54, 184, 119, 44, 180, 115, 37, 188, 114, 38, 183, 112, 37, 185, 119, 47, 157, 94, 34, 161, 98, 37, 150, 88, 30, 149, 83, 25, 172, 103, 38, 201, 135, 61, 201, 137, 56, 195, 131, 60, 187, 119, 51, 171, 100, 35, 183, 122, 59, 169, 107, 46, 158, 90, 25, 164, 95, 31, 174, 109, 44, 184, 123, 57, 173, 117, 52, 130, 88, 29, 119, 94, 36, 92, 71, 14, 73, 66, 15, 68, 72, 40, 50, 80, 84, 49, 97, 121, 66, 100, 91, 65, 93, 63, 74, 116, 110, 75, 111, 98, 55, 76, 45, 47, 69, 33, 81, 122, 124, 110, 165, 185, 120, 162, 163, 90, 126, 111, 57, 80, 62, 33, 40, 7, 35, 38, 0, 45, 55, 0, 58, 76, 9, 62, 88, 21, 75, 101, 39, + 83, 73, 27, 113, 97, 46, 99, 90, 34, 110, 101, 30, 131, 115, 42, 148, 125, 47, 107, 104, 67, 59, 75, 66, 25, 33, 19, 55, 83, 74, 56, 100, 114, 56, 80, 80, 54, 68, 50, 58, 72, 51, 37, 59, 56, 38, 50, 40, 62, 66, 36, 90, 80, 20, 119, 108, 40, 105, 97, 33, 39, 32, 14, 57, 42, 19, 98, 69, 32, 89, 59, 18, 127, 87, 36, 149, 100, 45, 174, 122, 56, 164, 116, 51, 193, 140, 67, 160, 107, 39, 175, 122, 56, 171, 124, 57, 174, 122, 51, 177, 122, 49, 139, 82, 28, 159, 108, 50, 149, 100, 40, 122, 76, 26, 76, 43, 8, 98, 58, 20, 131, 79, 22, 126, 75, 19, 134, 81, 24, 158, 108, 42, 164, 112, 44, 179, 124, 51, 179, 130, 57, 166, 114, 48, 171, 119, 51, 176, 127, 58, 180, 130, 63, 183, 135, 65, 183, 131, 62, 191, + 140, 71, 186, 135, 74, 189, 138, 73, 185, 128, 62, 168, 107, 42, 162, 106, 47, 187, 131, 64, 188, 130, 59, 186, 130, 59, 178, 118, 51, 194, 134, 60, 179, 118, 50, 178, 119, 55, 195, 139, 66, 190, 135, 66, 206, 146, 71, 180, 123, 59, 152, 100, 44, 165, 110, 48, 174, 118, 62, 134, 74, 22, 158, 96, 29, 135, 86, 40, 86, 40, 13, 156, 98, 36, 143, 87, 28, 136, 79, 25, 173, 116, 47, 183, 127, 57, 183, 126, 58, 170, 114, 53, 172, 118, 57, 172, 109, 47, 189, 127, 52, 174, 115, 49, 187, 124, 50, 210, 146, 70, 187, 130, 61, 194, 135, 58, 187, 124, 51, 181, 122, 51, 195, 136, 62, 194, 132, 61, 193, 127, 52, 194, 129, 59, 197, 126, 52, 199, 133, 60, 210, 147, 69, 207, 145, 68, 206, 146, 77, 194, 133, 63, 204, 143, 70, 201, 146, 77, 207, 150, + 78, 195, 138, 70, 199, 146, 71, 205, 149, 78, 192, 134, 60, 199, 138, 60, 195, 133, 57, 189, 126, 49, 195, 129, 53, 172, 100, 29, 183, 108, 35, 181, 109, 38, 199, 130, 50, 191, 123, 49, 169, 104, 36, 157, 88, 30, 161, 96, 34, 150, 81, 23, 172, 107, 40, 199, 128, 53, 194, 124, 47, 195, 129, 56, 186, 121, 52, 172, 104, 38, 188, 126, 56, 168, 103, 40, 160, 95, 30, 178, 113, 49, 173, 112, 47, 176, 118, 54, 142, 101, 45, 125, 96, 42, 92, 71, 14, 89, 78, 29, 77, 77, 43, 70, 87, 80, 58, 101, 115, 66, 104, 103, 72, 109, 101, 80, 136, 162, 82, 139, 166, 72, 91, 48, 60, 73, 7, 90, 111, 59, 109, 131, 85, 103, 124, 58, 72, 90, 32, 47, 65, 15, 34, 49, 5, 28, 36, 0, 39, 51, 0, 52, 67, 4, 58, 80, 16, 74, 95, 33, + 27, 23, 8, 81, 66, 34, 120, 97, 57, 108, 97, 51, 110, 94, 45, 201, 157, 91, 164, 140, 74, 68, 76, 50, 67, 74, 39, 51, 63, 39, 57, 62, 8, 35, 49, 5, 18, 36, 15, 32, 61, 55, 25, 60, 60, 43, 53, 28, 88, 85, 28, 110, 102, 30, 97, 83, 16, 70, 62, 26, 30, 22, 10, 50, 39, 22, 72, 47, 19, 78, 52, 24, 141, 98, 43, 172, 118, 56, 165, 117, 53, 169, 119, 56, 178, 124, 56, 149, 100, 35, 179, 128, 60, 174, 123, 53, 190, 135, 59, 168, 113, 44, 155, 105, 46, 170, 116, 52, 159, 107, 47, 125, 81, 32, 70, 41, 10, 102, 58, 17, 136, 82, 26, 130, 74, 22, 141, 88, 26, 152, 100, 35, 156, 106, 35, 180, 123, 53, 174, 126, 56, 164, 114, 48, 163, 111, 46, 174, 126, 61, 181, 130, 63, 189, 140, 71, 183, 128, 57, 190, + 136, 65, 183, 134, 70, 182, 133, 65, 187, 132, 61, 176, 121, 52, 148, 94, 38, 179, 121, 53, 194, 143, 68, 174, 118, 54, 187, 127, 62, 184, 123, 51, 179, 118, 45, 177, 119, 55, 184, 127, 63, 175, 119, 58, 205, 151, 80, 166, 115, 56, 164, 112, 58, 171, 119, 55, 187, 129, 67, 166, 97, 28, 203, 136, 55, 177, 114, 44, 124, 72, 28, 119, 68, 22, 192, 136, 66, 162, 101, 36, 174, 110, 38, 194, 135, 58, 185, 132, 65, 175, 115, 50, 179, 125, 57, 175, 116, 50, 183, 119, 47, 177, 120, 51, 193, 128, 52, 219, 156, 74, 176, 115, 46, 168, 106, 35, 184, 123, 54, 184, 133, 73, 181, 122, 54, 200, 140, 71, 180, 113, 41, 206, 141, 62, 189, 118, 46, 200, 137, 67, 205, 147, 68, 205, 146, 65, 202, 142, 69, 201, 143, 65, 205, 151, 72, 204, 149, 76, 211, 157, + 89, 195, 138, 71, 201, 148, 75, 201, 142, 71, 191, 131, 54, 195, 132, 59, 181, 115, 43, 185, 118, 44, 192, 126, 53, 173, 103, 36, 179, 107, 34, 184, 113, 41, 185, 115, 41, 199, 129, 45, 188, 118, 42, 184, 115, 45, 147, 82, 26, 140, 77, 25, 155, 87, 24, 181, 112, 37, 194, 124, 48, 187, 114, 37, 200, 134, 59, 192, 129, 52, 187, 122, 45, 186, 126, 58, 166, 101, 34, 171, 108, 44, 185, 129, 64, 167, 114, 52, 151, 107, 50, 107, 83, 31, 103, 82, 29, 98, 87, 49, 92, 90, 61, 67, 75, 47, 58, 75, 56, 61, 79, 50, 65, 98, 85, 81, 141, 174, 89, 154, 195, 91, 116, 92, 87, 102, 24, 100, 118, 47, 105, 120, 52, 88, 101, 37, 65, 84, 28, 56, 80, 15, 48, 72, 12, 32, 49, 3, 34, 45, 0, 49, 61, 3, 61, 76, 9, 72, 83, 9, + 18, 21, 5, 16, 13, 3, 24, 21, 8, 25, 25, 5, 46, 38, 14, 150, 117, 55, 78, 72, 14, 33, 48, 7, 57, 69, 23, 65, 81, 45, 58, 69, 28, 44, 60, 22, 35, 59, 42, 42, 64, 52, 80, 89, 55, 94, 92, 26, 67, 66, 11, 31, 33, 0, 28, 32, 2, 41, 38, 9, 32, 23, 11, 43, 33, 16, 57, 36, 13, 88, 60, 28, 152, 105, 45, 179, 130, 61, 146, 99, 39, 142, 90, 32, 174, 122, 56, 149, 102, 44, 188, 136, 67, 186, 131, 58, 191, 135, 65, 157, 105, 42, 171, 119, 60, 170, 115, 52, 156, 102, 44, 108, 64, 20, 72, 40, 6, 119, 75, 23, 138, 86, 23, 127, 75, 19, 151, 95, 34, 135, 83, 27, 154, 104, 33, 178, 121, 51, 169, 121, 51, 160, 108, 42, 147, 96, 35, 173, 125, 55, 172, 119, 52, 189, 138, 66, 183, 129, 58, 191, + 137, 67, 184, 133, 68, 177, 127, 60, 186, 132, 61, 177, 125, 61, 160, 104, 42, 187, 136, 68, 194, 141, 68, 177, 125, 59, 183, 125, 56, 183, 123, 53, 178, 118, 51, 187, 131, 68, 172, 122, 57, 173, 119, 57, 185, 128, 56, 161, 106, 44, 181, 127, 68, 178, 128, 68, 187, 127, 56, 174, 108, 39, 204, 134, 50, 209, 142, 60, 179, 119, 52, 144, 90, 40, 157, 97, 39, 172, 112, 44, 190, 131, 55, 189, 136, 63, 175, 123, 55, 183, 120, 46, 197, 141, 65, 157, 93, 30, 176, 111, 44, 199, 138, 65, 190, 126, 54, 220, 158, 75, 188, 127, 52, 177, 115, 49, 188, 130, 62, 154, 97, 38, 168, 114, 57, 200, 139, 65, 188, 124, 51, 193, 131, 55, 195, 131, 57, 195, 134, 64, 193, 130, 55, 205, 142, 64, 202, 140, 70, 203, 145, 67, 207, 151, 81, 199, 143, 72, 212, 160, + 88, 196, 141, 70, 197, 140, 69, 200, 142, 68, 194, 131, 56, 192, 126, 53, 180, 115, 49, 168, 103, 36, 189, 125, 53, 187, 118, 43, 183, 111, 35, 174, 102, 32, 185, 118, 47, 198, 131, 56, 194, 127, 51, 183, 109, 34, 183, 117, 45, 158, 95, 37, 133, 66, 16, 158, 86, 20, 190, 118, 39, 200, 128, 49, 195, 123, 46, 188, 119, 44, 192, 125, 45, 199, 134, 59, 185, 124, 55, 160, 94, 31, 175, 117, 51, 171, 119, 59, 154, 111, 50, 107, 85, 33, 90, 75, 25, 73, 65, 21, 68, 66, 26, 58, 68, 29, 59, 76, 44, 64, 78, 52, 63, 85, 58, 71, 109, 114, 76, 127, 148, 71, 107, 91, 84, 106, 38, 99, 119, 59, 100, 116, 67, 87, 102, 40, 67, 83, 21, 63, 84, 18, 61, 82, 14, 41, 54, 4, 36, 42, 0, 61, 67, 0, 81, 90, 10, 86, 91, 13, + 11, 11, 0, 28, 32, 4, 25, 31, 7, 21, 31, 9, 36, 37, 9, 13, 17, 1, 12, 25, 1, 16, 37, 0, 31, 45, 1, 52, 63, 6, 59, 67, 5, 77, 82, 45, 109, 104, 50, 115, 110, 56, 119, 106, 40, 86, 84, 34, 66, 65, 31, 33, 34, 7, 24, 26, 4, 33, 31, 14, 30, 22, 9, 37, 27, 14, 69, 47, 21, 146, 99, 42, 179, 127, 58, 166, 116, 53, 134, 83, 27, 136, 86, 32, 160, 113, 47, 179, 130, 64, 191, 136, 67, 193, 138, 61, 176, 126, 57, 172, 121, 55, 182, 133, 68, 175, 122, 56, 149, 95, 33, 102, 55, 13, 58, 30, 5, 137, 84, 30, 150, 93, 30, 128, 75, 22, 147, 89, 27, 124, 74, 21, 156, 102, 35, 175, 121, 49, 175, 123, 51, 145, 94, 33, 145, 95, 34, 164, 113, 50, 175, 123, 55, 186, 130, 58, 185, 131, 57, 194, + 144, 72, 181, 131, 65, 190, 141, 74, 193, 140, 70, 177, 128, 62, 158, 104, 38, 181, 130, 61, 197, 142, 71, 173, 121, 54, 183, 123, 53, 176, 115, 46, 174, 118, 52, 178, 121, 58, 145, 91, 33, 183, 127, 62, 180, 119, 47, 176, 113, 47, 184, 127, 65, 154, 101, 46, 193, 137, 66, 174, 109, 46, 190, 131, 52, 210, 148, 66, 203, 141, 66, 151, 97, 35, 155, 95, 30, 169, 107, 35, 198, 141, 66, 195, 137, 66, 164, 115, 51, 209, 146, 64, 205, 145, 71, 175, 108, 39, 186, 120, 48, 203, 142, 75, 187, 120, 43, 217, 154, 69, 203, 139, 60, 197, 131, 58, 185, 129, 63, 146, 91, 36, 166, 116, 57, 193, 131, 59, 193, 128, 55, 193, 132, 62, 200, 137, 60, 193, 130, 61, 200, 140, 60, 204, 141, 61, 205, 141, 69, 206, 146, 71, 204, 152, 76, 199, 139, 68, 214, 161, + 89, 195, 139, 68, 197, 139, 65, 194, 132, 58, 196, 132, 60, 195, 129, 55, 190, 126, 56, 172, 108, 40, 192, 128, 53, 181, 115, 39, 185, 113, 34, 186, 112, 37, 174, 106, 37, 193, 128, 61, 193, 127, 55, 182, 109, 32, 192, 121, 47, 180, 113, 42, 154, 88, 26, 115, 50, 7, 148, 77, 13, 198, 123, 44, 207, 137, 54, 177, 108, 41, 163, 95, 25, 188, 123, 46, 206, 142, 68, 176, 110, 44, 171, 110, 41, 172, 122, 60, 159, 116, 55, 123, 95, 38, 95, 85, 38, 46, 47, 13, 38, 45, 18, 51, 74, 59, 65, 97, 93, 82, 107, 94, 70, 86, 51, 51, 74, 59, 51, 86, 82, 56, 73, 21, 73, 84, 13, 98, 110, 54, 105, 112, 52, 98, 106, 32, 74, 90, 27, 74, 97, 40, 85, 104, 40, 72, 87, 7, 63, 69, 1, 77, 80, 1, 98, 100, 13, 96, 94, 8, + 55, 53, 27, 36, 47, 10, 26, 37, 11, 82, 84, 34, 101, 91, 40, 63, 55, 23, 9, 16, 0, 27, 39, 3, 57, 67, 5, 92, 94, 21, 102, 100, 27, 119, 114, 34, 108, 101, 29, 98, 93, 27, 64, 56, 7, 70, 76, 51, 79, 103, 110, 62, 70, 61, 44, 44, 18, 42, 36, 19, 52, 40, 20, 77, 56, 29, 136, 97, 43, 166, 116, 54, 175, 122, 52, 144, 97, 32, 105, 60, 15, 125, 80, 29, 167, 114, 48, 185, 133, 60, 181, 127, 55, 188, 131, 59, 164, 108, 36, 177, 121, 50, 175, 124, 56, 176, 120, 55, 149, 94, 35, 103, 63, 18, 52, 26, 4, 152, 99, 35, 150, 95, 32, 133, 81, 24, 142, 90, 30, 112, 65, 15, 147, 93, 31, 164, 110, 42, 171, 117, 41, 152, 101, 36, 141, 92, 31, 164, 113, 46, 179, 129, 56, 179, 124, 54, 184, 126, 54, 191, + 140, 71, 183, 131, 65, 190, 139, 72, 199, 144, 76, 162, 107, 41, 163, 107, 42, 186, 134, 63, 187, 132, 64, 187, 133, 64, 185, 126, 59, 173, 116, 47, 176, 120, 52, 166, 109, 43, 150, 90, 33, 182, 126, 57, 194, 133, 57, 187, 125, 53, 198, 144, 79, 137, 83, 33, 189, 131, 66, 169, 108, 44, 183, 119, 45, 213, 153, 75, 208, 150, 75, 186, 132, 63, 163, 101, 37, 181, 122, 55, 200, 140, 67, 209, 146, 71, 181, 123, 53, 217, 155, 77, 214, 154, 80, 176, 108, 36, 188, 119, 43, 199, 141, 70, 176, 111, 42, 221, 158, 74, 199, 134, 58, 198, 134, 58, 180, 124, 54, 162, 108, 51, 161, 112, 57, 188, 128, 61, 197, 134, 57, 196, 133, 58, 205, 141, 66, 193, 128, 53, 203, 138, 64, 204, 140, 61, 206, 147, 72, 207, 148, 73, 204, 146, 75, 200, 140, 68, 212, 159, + 87, 198, 138, 67, 199, 139, 65, 191, 131, 55, 187, 123, 53, 186, 120, 44, 183, 115, 43, 187, 122, 48, 182, 113, 44, 195, 126, 54, 177, 104, 33, 188, 116, 39, 174, 101, 33, 186, 120, 49, 202, 139, 71, 195, 129, 57, 181, 106, 33, 194, 122, 44, 185, 117, 44, 152, 84, 21, 138, 68, 9, 153, 83, 16, 201, 129, 51, 205, 134, 56, 175, 102, 36, 170, 101, 37, 183, 115, 43, 185, 124, 51, 177, 113, 47, 174, 118, 55, 150, 101, 40, 128, 97, 43, 91, 76, 29, 68, 63, 22, 57, 63, 41, 54, 80, 80, 66, 102, 107, 69, 97, 77, 53, 70, 32, 52, 88, 91, 64, 116, 144, 76, 93, 61, 78, 81, 13, 84, 86, 23, 97, 97, 25, 88, 93, 25, 80, 93, 43, 96, 114, 85, 103, 122, 81, 95, 110, 24, 95, 101, 7, 99, 105, 12, 110, 115, 19, 103, 95, 5, + 76, 76, 34, 31, 43, 8, 44, 45, 20, 96, 90, 35, 76, 70, 18, 127, 106, 54, 71, 67, 18, 87, 85, 26, 98, 97, 26, 97, 91, 24, 93, 84, 8, 94, 95, 1, 92, 104, 21, 109, 120, 90, 119, 112, 58, 104, 94, 28, 101, 119, 113, 47, 73, 83, 33, 39, 28, 41, 35, 19, 65, 47, 21, 137, 100, 45, 129, 86, 38, 179, 130, 59, 177, 123, 52, 130, 84, 27, 89, 51, 16, 151, 98, 42, 170, 119, 51, 188, 139, 68, 178, 123, 52, 183, 128, 59, 163, 103, 33, 181, 125, 58, 183, 128, 61, 180, 119, 51, 162, 112, 49, 70, 39, 11, 70, 41, 19, 169, 114, 42, 151, 98, 35, 131, 76, 18, 130, 79, 19, 97, 56, 13, 149, 98, 38, 158, 104, 36, 156, 99, 28, 156, 102, 35, 142, 93, 31, 167, 110, 42, 173, 122, 51, 180, 125, 54, 185, 124, 54, 188, + 135, 65, 192, 138, 72, 204, 151, 83, 198, 143, 73, 150, 92, 31, 167, 111, 46, 185, 127, 57, 176, 122, 56, 188, 131, 62, 188, 131, 61, 179, 124, 55, 184, 125, 56, 159, 102, 42, 159, 102, 40, 185, 129, 61, 193, 133, 59, 197, 135, 63, 200, 149, 81, 151, 97, 41, 192, 133, 63, 177, 122, 55, 163, 100, 32, 205, 146, 70, 193, 137, 66, 159, 104, 43, 178, 120, 56, 173, 112, 46, 193, 136, 68, 205, 142, 66, 199, 138, 63, 215, 157, 81, 213, 157, 83, 202, 142, 69, 194, 130, 56, 192, 135, 65, 200, 139, 62, 221, 160, 76, 205, 139, 59, 205, 144, 64, 184, 122, 57, 176, 120, 59, 170, 111, 51, 190, 129, 61, 196, 132, 56, 200, 134, 63, 204, 140, 64, 199, 135, 62, 199, 134, 56, 202, 135, 59, 209, 149, 73, 209, 147, 72, 211, 152, 80, 199, 141, 68, 206, 152, + 78, 191, 130, 58, 199, 139, 63, 191, 131, 57, 184, 119, 45, 184, 115, 41, 177, 106, 39, 175, 105, 30, 177, 107, 39, 184, 111, 38, 188, 117, 44, 183, 113, 41, 194, 124, 51, 171, 101, 30, 199, 133, 63, 207, 143, 72, 178, 107, 37, 194, 121, 45, 202, 132, 60, 165, 98, 37, 161, 90, 28, 154, 82, 18, 179, 111, 42, 195, 126, 51, 194, 125, 53, 169, 98, 33, 180, 113, 43, 191, 127, 55, 166, 102, 42, 166, 106, 45, 164, 113, 50, 129, 93, 41, 96, 77, 27, 75, 68, 14, 66, 74, 34, 54, 70, 58, 51, 72, 49, 55, 75, 22, 43, 65, 27, 51, 95, 102, 69, 125, 149, 82, 116, 111, 83, 88, 31, 86, 88, 29, 78, 78, 17, 69, 75, 24, 67, 76, 45, 79, 95, 68, 86, 103, 60, 86, 100, 14, 91, 97, 6, 104, 108, 8, 111, 117, 16, 96, 93, 8, + 64, 60, 9, 50, 51, 6, 120, 102, 43, 88, 79, 18, 70, 71, 16, 105, 95, 34, 58, 51, 10, 35, 36, 2, 55, 56, 17, 51, 54, 5, 79, 78, 8, 109, 112, 7, 87, 96, 1, 84, 96, 70, 131, 129, 98, 134, 122, 69, 129, 126, 87, 86, 90, 75, 64, 60, 43, 40, 29, 17, 78, 56, 27, 107, 73, 32, 155, 110, 50, 197, 142, 65, 159, 110, 43, 69, 37, 5, 86, 48, 16, 146, 98, 46, 158, 115, 54, 183, 131, 59, 177, 122, 52, 165, 106, 36, 150, 92, 31, 190, 136, 68, 182, 126, 60, 179, 120, 54, 136, 88, 37, 60, 27, 2, 117, 71, 24, 151, 100, 33, 132, 81, 24, 138, 81, 23, 123, 77, 27, 89, 52, 15, 127, 81, 24, 156, 101, 33, 159, 105, 36, 133, 81, 27, 157, 106, 42, 158, 100, 37, 163, 108, 40, 173, 118, 48, 187, 130, 59, 195, + 140, 66, 195, 141, 69, 201, 149, 75, 190, 133, 64, 155, 95, 32, 172, 113, 47, 187, 129, 58, 178, 122, 53, 189, 135, 65, 197, 143, 68, 187, 132, 64, 173, 112, 45, 170, 113, 43, 165, 104, 37, 196, 143, 72, 204, 148, 82, 195, 137, 67, 200, 150, 89, 164, 107, 49, 187, 121, 49, 178, 119, 54, 166, 106, 44, 203, 141, 66, 178, 123, 56, 152, 95, 40, 159, 94, 28, 192, 137, 67, 185, 129, 60, 192, 128, 52, 193, 135, 70, 223, 168, 91, 212, 153, 79, 208, 145, 71, 181, 121, 55, 163, 102, 37, 208, 146, 68, 216, 153, 66, 210, 145, 67, 208, 145, 68, 189, 130, 60, 192, 137, 71, 168, 113, 53, 186, 127, 59, 199, 136, 61, 197, 132, 61, 201, 133, 58, 202, 137, 68, 195, 129, 53, 202, 134, 61, 205, 142, 64, 207, 146, 71, 211, 149, 74, 199, 138, 65, 211, 154, + 81, 195, 135, 62, 198, 135, 57, 185, 124, 51, 181, 115, 41, 177, 103, 29, 183, 112, 42, 163, 88, 18, 190, 120, 46, 173, 102, 27, 186, 114, 39, 191, 126, 51, 199, 130, 53, 189, 122, 58, 199, 133, 61, 196, 124, 54, 197, 128, 57, 186, 112, 34, 211, 144, 65, 192, 128, 62, 157, 87, 30, 157, 89, 27, 166, 99, 35, 169, 104, 39, 190, 121, 46, 162, 93, 32, 166, 97, 31, 192, 125, 50, 191, 131, 58, 156, 100, 41, 160, 114, 57, 133, 98, 42, 87, 73, 24, 76, 71, 17, 71, 79, 32, 67, 82, 62, 56, 76, 54, 51, 73, 21, 44, 67, 7, 41, 67, 28, 59, 97, 62, 73, 100, 43, 79, 88, 14, 70, 79, 8, 65, 67, 6, 47, 55, 6, 40, 58, 31, 50, 71, 35, 54, 67, 7, 56, 65, 0, 62, 70, 0, 78, 84, 0, 85, 92, 3, 80, 79, 4, + 59, 60, 4, 48, 55, 12, 135, 107, 52, 110, 96, 29, 59, 69, 5, 79, 82, 22, 91, 84, 34, 44, 50, 16, 42, 45, 7, 32, 38, 5, 65, 69, 8, 114, 117, 4, 81, 89, 0, 50, 60, 32, 123, 128, 122, 118, 126, 124, 95, 95, 68, 93, 86, 29, 51, 46, 20, 71, 52, 28, 117, 84, 39, 148, 107, 48, 184, 130, 59, 148, 100, 41, 75, 43, 12, 41, 19, 6, 90, 55, 18, 149, 107, 50, 150, 103, 45, 177, 124, 51, 176, 120, 51, 140, 88, 30, 154, 98, 44, 188, 134, 63, 184, 127, 57, 182, 126, 58, 103, 61, 18, 92, 51, 13, 141, 92, 37, 147, 97, 39, 141, 87, 29, 140, 85, 23, 112, 68, 25, 85, 45, 10, 110, 64, 18, 153, 99, 34, 143, 90, 26, 135, 85, 28, 158, 105, 40, 163, 107, 39, 147, 94, 30, 160, 105, 38, 184, 126, 56, 194, + 137, 65, 195, 140, 69, 198, 142, 70, 197, 142, 72, 166, 106, 41, 174, 117, 48, 172, 118, 50, 177, 121, 54, 192, 136, 63, 188, 131, 61, 164, 104, 41, 183, 127, 58, 165, 105, 36, 186, 127, 58, 201, 147, 78, 193, 141, 71, 189, 130, 61, 189, 132, 67, 158, 103, 44, 179, 120, 48, 193, 131, 59, 175, 110, 37, 205, 142, 64, 199, 138, 66, 164, 100, 40, 166, 94, 26, 209, 150, 77, 192, 128, 58, 198, 128, 54, 212, 152, 80, 228, 174, 98, 216, 155, 79, 201, 139, 66, 191, 136, 69, 168, 111, 47, 197, 135, 58, 205, 144, 63, 213, 148, 69, 201, 140, 64, 199, 140, 67, 191, 136, 64, 160, 102, 41, 193, 132, 59, 195, 130, 55, 193, 127, 51, 201, 135, 59, 197, 130, 57, 196, 131, 55, 201, 137, 63, 202, 137, 58, 208, 148, 69, 203, 141, 65, 200, 137, 63, 209, 153, + 79, 196, 134, 60, 198, 133, 57, 186, 124, 52, 169, 99, 27, 187, 117, 41, 191, 123, 48, 170, 97, 28, 186, 114, 37, 195, 126, 48, 190, 116, 40, 199, 129, 49, 204, 135, 55, 196, 129, 55, 195, 125, 52, 205, 135, 61, 198, 128, 57, 190, 114, 38, 209, 140, 62, 214, 145, 68, 179, 115, 54, 141, 72, 22, 162, 91, 29, 163, 97, 34, 170, 106, 42, 184, 119, 48, 159, 92, 31, 175, 110, 44, 183, 119, 51, 163, 109, 46, 150, 102, 43, 132, 94, 35, 73, 59, 14, 67, 64, 12, 67, 70, 11, 63, 75, 24, 50, 71, 23, 51, 70, 10, 47, 66, 2, 42, 61, 0, 47, 67, 0, 56, 75, 0, 61, 75, 4, 53, 63, 3, 39, 46, 2, 23, 39, 0, 25, 47, 4, 33, 57, 15, 48, 60, 0, 60, 68, 4, 59, 66, 1, 48, 59, 0, 47, 56, 0, 49, 50, 1, + 57, 58, 3, 50, 53, 12, 126, 107, 44, 124, 107, 47, 123, 111, 44, 84, 79, 21, 87, 79, 21, 44, 50, 14, 20, 31, 8, 15, 22, 7, 35, 38, 6, 96, 104, 23, 84, 90, 29, 46, 47, 15, 87, 86, 69, 75, 81, 75, 94, 90, 43, 118, 117, 58, 40, 35, 15, 104, 74, 32, 148, 107, 52, 194, 142, 71, 121, 78, 26, 59, 36, 8, 37, 21, 3, 51, 31, 11, 101, 60, 24, 145, 102, 46, 136, 89, 38, 174, 121, 49, 159, 105, 41, 138, 88, 30, 159, 104, 48, 187, 130, 59, 189, 131, 61, 157, 107, 41, 92, 50, 16, 111, 66, 22, 111, 64, 23, 150, 98, 34, 154, 97, 36, 146, 94, 35, 96, 53, 11, 112, 62, 19, 116, 69, 20, 131, 83, 26, 132, 83, 28, 130, 81, 25, 157, 97, 35, 154, 101, 35, 151, 98, 31, 162, 101, 43, 181, 124, 52, 189, + 132, 66, 199, 142, 68, 200, 143, 72, 198, 144, 70, 165, 104, 36, 176, 120, 50, 148, 97, 34, 174, 115, 43, 187, 127, 52, 172, 115, 49, 155, 97, 39, 192, 135, 65, 178, 121, 53, 197, 143, 74, 193, 140, 73, 191, 134, 67, 194, 134, 63, 172, 114, 54, 144, 93, 43, 172, 114, 44, 188, 125, 53, 175, 109, 38, 204, 139, 62, 209, 145, 65, 174, 110, 44, 163, 96, 28, 194, 131, 54, 204, 138, 63, 190, 125, 51, 212, 159, 83, 225, 175, 103, 192, 133, 64, 206, 151, 77, 188, 131, 69, 187, 122, 51, 197, 131, 55, 199, 130, 53, 197, 128, 51, 214, 153, 75, 197, 138, 64, 196, 139, 66, 157, 97, 34, 190, 129, 55, 193, 127, 53, 201, 135, 61, 204, 139, 62, 197, 131, 57, 197, 130, 54, 194, 129, 54, 201, 132, 55, 203, 140, 58, 203, 142, 70, 198, 136, 59, 208, 148, + 70, 190, 127, 53, 196, 130, 55, 186, 121, 46, 174, 102, 33, 192, 122, 48, 191, 120, 48, 188, 115, 39, 187, 113, 39, 188, 113, 36, 197, 128, 50, 198, 125, 45, 206, 135, 53, 191, 124, 56, 194, 123, 53, 203, 132, 50, 206, 139, 62, 188, 108, 35, 200, 124, 42, 212, 138, 63, 203, 136, 59, 179, 115, 52, 150, 81, 22, 154, 86, 31, 173, 110, 47, 178, 110, 41, 181, 112, 48, 157, 94, 36, 169, 106, 46, 168, 114, 49, 143, 96, 37, 127, 92, 33, 99, 76, 26, 66, 60, 11, 54, 55, 6, 52, 61, 0, 54, 70, 4, 51, 66, 0, 51, 67, 0, 46, 63, 3, 44, 57, 0, 53, 68, 2, 53, 61, 2, 44, 50, 2, 33, 46, 4, 29, 48, 8, 27, 44, 2, 33, 48, 0, 61, 71, 9, 77, 81, 15, 56, 64, 3, 41, 53, 0, 33, 45, 2, 34, 38, 0, + 45, 51, 3, 45, 53, 7, 93, 85, 28, 52, 57, 2, 84, 84, 26, 101, 86, 34, 88, 78, 23, 41, 58, 20, 28, 50, 27, 22, 43, 35, 25, 27, 12, 77, 83, 36, 58, 67, 49, 25, 26, 12, 56, 52, 23, 130, 125, 69, 135, 132, 61, 85, 77, 21, 57, 43, 18, 107, 79, 34, 185, 135, 63, 126, 84, 28, 78, 50, 14, 46, 28, 7, 62, 39, 16, 64, 38, 9, 115, 76, 33, 104, 67, 21, 151, 102, 45, 174, 118, 49, 172, 122, 53, 147, 95, 37, 160, 111, 52, 188, 129, 58, 193, 134, 60, 171, 119, 51, 127, 82, 32, 118, 69, 24, 145, 90, 29, 164, 112, 46, 158, 100, 36, 125, 76, 23, 131, 85, 30, 137, 88, 34, 114, 67, 21, 114, 68, 20, 127, 80, 23, 115, 61, 11, 149, 88, 29, 153, 94, 35, 145, 88, 28, 157, 98, 35, 171, 112, 41, 176, + 119, 51, 201, 144, 68, 208, 155, 82, 195, 136, 63, 174, 109, 35, 174, 115, 47, 153, 98, 36, 183, 120, 51, 184, 126, 56, 150, 93, 33, 169, 107, 42, 197, 140, 67, 188, 133, 66, 202, 149, 79, 191, 135, 67, 185, 123, 57, 196, 137, 68, 167, 113, 53, 150, 94, 37, 171, 111, 44, 190, 127, 55, 180, 117, 48, 193, 124, 54, 207, 142, 66, 189, 121, 46, 161, 92, 22, 184, 118, 47, 195, 126, 55, 192, 132, 67, 214, 155, 84, 218, 162, 92, 206, 146, 73, 202, 147, 74, 174, 123, 62, 174, 106, 44, 204, 139, 63, 213, 148, 72, 194, 122, 44, 213, 147, 70, 198, 136, 62, 209, 154, 76, 169, 108, 47, 190, 124, 54, 198, 132, 59, 198, 131, 56, 202, 134, 56, 201, 136, 59, 205, 140, 63, 197, 132, 57, 198, 131, 58, 201, 135, 56, 206, 148, 74, 193, 132, 56, 204, 147, + 67, 188, 122, 48, 185, 117, 40, 183, 117, 44, 171, 100, 26, 188, 119, 43, 191, 124, 52, 186, 114, 42, 191, 121, 47, 179, 105, 32, 189, 117, 41, 197, 127, 48, 203, 135, 55, 210, 142, 66, 189, 119, 51, 191, 121, 50, 205, 134, 53, 199, 129, 55, 184, 107, 29, 206, 133, 54, 208, 138, 65, 199, 139, 67, 170, 104, 38, 156, 92, 35, 158, 91, 30, 176, 113, 52, 178, 111, 40, 165, 102, 41, 160, 104, 40, 171, 118, 59, 167, 120, 55, 117, 86, 31, 99, 74, 21, 81, 70, 18, 50, 50, 12, 38, 51, 0, 46, 65, 0, 58, 76, 0, 65, 76, 5, 54, 70, 12, 56, 73, 19, 50, 70, 14, 51, 62, 4, 46, 59, 4, 50, 69, 38, 40, 59, 46, 39, 50, 20, 39, 46, 4, 47, 51, 3, 54, 54, 6, 43, 47, 3, 38, 44, 1, 37, 46, 2, 34, 40, 6, + 53, 54, 11, 59, 65, 14, 78, 75, 13, 74, 84, 15, 67, 77, 12, 72, 65, 16, 130, 109, 56, 45, 60, 11, 31, 53, 15, 21, 34, 12, 33, 34, 16, 39, 40, 14, 44, 45, 13, 66, 65, 27, 112, 106, 36, 125, 118, 49, 96, 93, 26, 33, 31, 10, 46, 39, 20, 130, 99, 53, 139, 97, 40, 122, 91, 45, 72, 47, 15, 62, 40, 16, 72, 44, 13, 86, 54, 17, 115, 78, 31, 97, 59, 22, 164, 107, 41, 165, 103, 34, 176, 128, 57, 141, 95, 42, 168, 121, 54, 183, 126, 55, 196, 134, 63, 173, 124, 60, 128, 78, 30, 119, 71, 23, 168, 110, 41, 168, 115, 44, 151, 92, 29, 139, 90, 35, 144, 93, 36, 148, 98, 44, 120, 70, 22, 130, 81, 26, 124, 77, 25, 126, 71, 19, 149, 92, 29, 125, 74, 24, 128, 77, 25, 164, 108, 41, 175, 116, 49, 165, + 107, 41, 197, 139, 64, 207, 152, 77, 195, 134, 61, 178, 111, 38, 168, 108, 40, 167, 108, 41, 179, 119, 46, 170, 114, 50, 156, 100, 38, 174, 117, 48, 199, 143, 71, 189, 132, 65, 193, 137, 64, 187, 130, 64, 183, 120, 52, 194, 138, 65, 165, 108, 51, 153, 94, 35, 176, 115, 47, 182, 119, 45, 179, 115, 41, 185, 117, 48, 202, 137, 60, 190, 121, 45, 168, 102, 37, 181, 119, 47, 185, 118, 48, 197, 134, 68, 212, 155, 84, 215, 152, 84, 211, 151, 78, 202, 146, 75, 165, 109, 48, 180, 115, 47, 191, 123, 50, 215, 150, 69, 196, 125, 48, 211, 146, 68, 196, 131, 53, 212, 151, 75, 178, 116, 54, 188, 123, 53, 197, 129, 56, 196, 130, 52, 198, 130, 51, 197, 130, 54, 202, 138, 60, 190, 126, 53, 190, 123, 51, 200, 132, 54, 206, 149, 71, 192, 127, 53, 204, 144, + 66, 187, 123, 49, 177, 105, 33, 186, 118, 44, 173, 101, 27, 185, 119, 48, 201, 135, 56, 181, 112, 44, 193, 123, 48, 180, 108, 36, 178, 107, 35, 191, 123, 47, 200, 134, 58, 213, 146, 65, 187, 122, 55, 191, 123, 54, 197, 125, 50, 205, 136, 59, 191, 124, 48, 188, 117, 40, 209, 137, 59, 200, 133, 59, 184, 121, 53, 156, 93, 38, 148, 78, 26, 163, 100, 38, 170, 103, 39, 176, 116, 50, 157, 97, 39, 165, 112, 55, 168, 117, 53, 142, 104, 40, 82, 68, 11, 81, 70, 11, 68, 64, 15, 46, 52, 7, 52, 66, 9, 55, 77, 17, 57, 79, 39, 56, 77, 60, 48, 70, 50, 42, 65, 16, 41, 55, 0, 44, 60, 7, 50, 65, 33, 43, 57, 23, 35, 45, 8, 24, 37, 0, 28, 41, 0, 35, 46, 0, 34, 46, 1, 30, 43, 1, 25, 35, 2, 26, 34, 3, + 74, 63, 15, 87, 78, 24, 87, 90, 41, 85, 98, 27, 46, 57, 0, 65, 65, 16, 145, 103, 37, 66, 60, 18, 53, 56, 21, 77, 76, 38, 92, 91, 37, 103, 103, 33, 111, 106, 29, 92, 89, 15, 79, 72, 15, 44, 41, 9, 35, 31, 3, 31, 29, 14, 53, 43, 27, 152, 108, 47, 130, 97, 49, 128, 91, 43, 75, 50, 20, 65, 43, 18, 93, 60, 24, 124, 83, 40, 96, 62, 23, 98, 57, 19, 167, 106, 41, 163, 103, 41, 169, 120, 57, 167, 118, 55, 167, 119, 57, 191, 132, 56, 202, 142, 71, 176, 130, 62, 141, 92, 32, 135, 79, 22, 188, 129, 50, 151, 97, 33, 125, 78, 26, 150, 100, 45, 168, 120, 56, 149, 99, 42, 142, 90, 33, 142, 90, 33, 128, 74, 19, 122, 69, 15, 148, 90, 33, 125, 78, 27, 116, 67, 21, 156, 98, 35, 159, 103, 44, 171, + 111, 43, 205, 146, 72, 203, 148, 73, 187, 130, 57, 178, 111, 34, 175, 117, 48, 183, 121, 49, 182, 123, 51, 161, 105, 43, 170, 112, 49, 165, 102, 38, 201, 142, 71, 190, 132, 65, 188, 129, 56, 195, 138, 67, 182, 118, 50, 205, 148, 75, 156, 104, 51, 155, 99, 37, 175, 114, 46, 169, 112, 47, 158, 99, 29, 189, 128, 55, 205, 143, 69, 190, 124, 48, 172, 106, 34, 193, 128, 61, 199, 132, 63, 190, 124, 58, 211, 158, 81, 200, 139, 68, 204, 144, 69, 217, 155, 82, 184, 122, 58, 182, 117, 47, 163, 96, 35, 220, 158, 84, 210, 142, 65, 213, 153, 73, 208, 146, 67, 202, 138, 59, 180, 119, 51, 183, 118, 47, 195, 130, 57, 195, 123, 49, 196, 128, 54, 191, 123, 45, 201, 136, 56, 193, 130, 54, 186, 118, 45, 197, 131, 55, 213, 153, 79, 190, 121, 49, 202, 142, + 61, 188, 125, 49, 174, 106, 34, 178, 108, 35, 170, 104, 30, 179, 112, 42, 203, 133, 61, 192, 122, 51, 202, 132, 61, 191, 120, 46, 166, 93, 26, 180, 112, 39, 192, 121, 48, 204, 139, 59, 200, 130, 54, 180, 110, 47, 197, 128, 58, 201, 128, 47, 190, 116, 43, 186, 122, 56, 189, 117, 44, 204, 139, 61, 198, 135, 65, 152, 94, 46, 127, 69, 24, 148, 80, 21, 167, 107, 46, 175, 117, 53, 160, 101, 41, 159, 100, 42, 168, 119, 59, 159, 113, 51, 121, 94, 32, 94, 79, 12, 64, 59, 6, 54, 62, 33, 57, 71, 45, 73, 86, 52, 50, 72, 61, 45, 76, 75, 46, 72, 57, 43, 57, 8, 47, 60, 5, 57, 71, 11, 61, 80, 19, 68, 84, 39, 46, 59, 18, 29, 40, 1, 24, 45, 0, 39, 63, 6, 47, 69, 15, 39, 57, 4, 28, 39, 6, 22, 34, 21, + 69, 64, 15, 88, 76, 19, 106, 94, 36, 111, 109, 54, 101, 101, 43, 93, 87, 27, 132, 112, 53, 118, 104, 47, 101, 95, 26, 121, 110, 33, 103, 95, 30, 63, 55, 0, 78, 71, 16, 38, 34, 0, 25, 21, 0, 20, 18, 0, 26, 24, 7, 31, 26, 14, 62, 47, 26, 125, 89, 47, 154, 115, 54, 118, 83, 33, 76, 50, 16, 97, 69, 28, 116, 76, 31, 103, 65, 24, 102, 65, 27, 137, 87, 35, 169, 111, 46, 132, 85, 29, 168, 121, 59, 169, 118, 50, 173, 121, 56, 190, 129, 53, 204, 143, 72, 176, 124, 53, 146, 91, 26, 162, 104, 36, 186, 127, 49, 141, 89, 26, 106, 65, 20, 152, 103, 49, 170, 121, 60, 157, 107, 45, 156, 101, 39, 136, 84, 25, 138, 81, 18, 118, 65, 15, 149, 95, 36, 123, 74, 27, 124, 71, 22, 155, 101, 39, 137, 88, 38, 169, + 111, 44, 200, 144, 71, 200, 139, 69, 192, 133, 66, 182, 115, 45, 182, 122, 51, 180, 118, 48, 178, 117, 46, 174, 118, 49, 138, 76, 20, 164, 104, 37, 194, 137, 66, 186, 129, 61, 199, 139, 64, 195, 137, 66, 189, 131, 59, 205, 144, 70, 170, 115, 52, 160, 98, 36, 179, 119, 50, 170, 113, 50, 163, 107, 48, 187, 125, 55, 206, 145, 73, 194, 129, 55, 190, 130, 59, 178, 108, 42, 202, 134, 63, 181, 113, 47, 210, 151, 78, 210, 147, 80, 202, 139, 66, 212, 150, 76, 197, 133, 61, 171, 108, 47, 153, 87, 31, 201, 140, 67, 214, 145, 72, 203, 136, 61, 210, 150, 69, 198, 135, 57, 191, 129, 61, 174, 112, 41, 197, 131, 57, 190, 118, 43, 197, 129, 53, 195, 125, 51, 197, 130, 52, 194, 130, 57, 190, 126, 49, 197, 130, 53, 203, 142, 68, 186, 120, 45, 197, 135, + 55, 180, 118, 46, 176, 110, 37, 182, 116, 43, 168, 104, 38, 187, 120, 46, 195, 127, 48, 199, 132, 60, 196, 127, 58, 189, 119, 48, 187, 117, 44, 175, 106, 40, 170, 105, 39, 189, 123, 53, 192, 127, 51, 174, 106, 40, 178, 104, 36, 191, 117, 39, 195, 123, 45, 183, 113, 37, 176, 111, 42, 183, 113, 43, 205, 138, 60, 191, 130, 63, 153, 96, 48, 119, 58, 16, 145, 79, 24, 170, 106, 44, 166, 104, 47, 151, 91, 32, 154, 103, 46, 153, 104, 43, 149, 111, 49, 111, 91, 26, 83, 72, 22, 68, 70, 37, 73, 80, 42, 115, 117, 44, 67, 70, 19, 49, 51, 6, 46, 51, 8, 45, 56, 5, 61, 81, 34, 71, 96, 59, 79, 105, 69, 74, 97, 66, 68, 80, 52, 59, 74, 45, 54, 72, 24, 49, 72, 36, 51, 74, 49, 49, 66, 34, 36, 48, 19, 37, 49, 12, + 94, 90, 26, 84, 79, 22, 65, 59, 7, 100, 83, 25, 137, 122, 62, 130, 120, 57, 121, 103, 42, 113, 88, 33, 45, 37, 4, 25, 20, 0, 13, 9, 0, 14, 13, 0, 47, 41, 13, 46, 42, 13, 15, 16, 1, 28, 37, 6, 27, 31, 14, 34, 28, 14, 56, 42, 20, 90, 62, 30, 150, 107, 49, 88, 56, 10, 100, 67, 27, 118, 73, 29, 109, 68, 26, 130, 89, 40, 92, 54, 21, 155, 106, 42, 163, 109, 41, 135, 91, 31, 151, 108, 46, 169, 120, 49, 169, 117, 54, 186, 128, 52, 199, 145, 72, 173, 119, 53, 162, 104, 36, 177, 118, 44, 163, 109, 36, 131, 80, 25, 117, 74, 31, 177, 127, 66, 185, 138, 72, 179, 124, 55, 169, 116, 50, 152, 94, 33, 147, 89, 25, 120, 67, 16, 150, 98, 38, 137, 89, 36, 121, 71, 21, 144, 88, 31, 121, 75, 25, 177, + 124, 57, 197, 143, 69, 198, 139, 66, 198, 139, 70, 187, 127, 53, 181, 118, 45, 172, 109, 40, 182, 118, 52, 161, 100, 33, 135, 73, 19, 166, 103, 41, 190, 130, 59, 189, 130, 60, 205, 146, 74, 197, 137, 66, 199, 140, 66, 199, 137, 58, 185, 126, 61, 156, 94, 31, 192, 138, 66, 173, 114, 50, 168, 109, 47, 189, 132, 62, 203, 144, 71, 190, 129, 59, 189, 126, 57, 171, 99, 31, 190, 122, 52, 191, 125, 57, 203, 140, 67, 199, 136, 66, 191, 127, 55, 203, 134, 56, 201, 137, 63, 193, 133, 61, 140, 77, 21, 174, 108, 44, 209, 141, 66, 202, 132, 56, 211, 149, 71, 192, 126, 51, 193, 129, 58, 164, 101, 33, 191, 128, 52, 192, 122, 46, 194, 129, 51, 196, 129, 50, 198, 128, 48, 197, 135, 62, 186, 123, 46, 194, 130, 50, 190, 130, 58, 190, 128, 52, 195, 132, + 56, 183, 122, 56, 167, 101, 32, 187, 119, 44, 159, 91, 26, 187, 118, 42, 187, 120, 47, 189, 122, 53, 183, 114, 46, 192, 127, 58, 184, 115, 48, 186, 121, 54, 153, 92, 36, 179, 119, 54, 184, 120, 52, 171, 107, 43, 169, 98, 29, 172, 98, 24, 195, 125, 48, 178, 103, 30, 172, 101, 33, 175, 110, 46, 184, 116, 40, 189, 125, 51, 189, 123, 59, 148, 89, 40, 114, 55, 9, 153, 87, 27, 156, 90, 35, 154, 91, 36, 154, 93, 34, 151, 99, 38, 144, 94, 33, 130, 95, 36, 104, 82, 30, 78, 68, 16, 74, 66, 13, 111, 102, 37, 66, 64, 13, 42, 42, 0, 41, 43, 5, 46, 54, 23, 56, 73, 46, 66, 82, 62, 62, 79, 53, 68, 82, 52, 99, 106, 74, 103, 115, 101, 95, 106, 70, 54, 70, 38, 52, 64, 44, 45, 51, 22, 31, 39, 0, 39, 47, 0, + 93, 93, 40, 71, 72, 26, 69, 66, 19, 68, 68, 24, 61, 55, 6, 107, 94, 30, 94, 87, 38, 145, 124, 60, 110, 108, 44, 99, 100, 42, 91, 84, 36, 62, 57, 16, 39, 35, 5, 24, 22, 0, 22, 31, 2, 26, 44, 5, 26, 30, 13, 41, 32, 18, 35, 26, 10, 92, 72, 47, 153, 108, 46, 95, 60, 16, 130, 87, 37, 111, 69, 29, 100, 61, 22, 90, 57, 12, 83, 51, 19, 167, 111, 48, 162, 108, 42, 148, 99, 40, 141, 96, 37, 174, 124, 53, 172, 122, 52, 198, 139, 61, 204, 152, 77, 176, 121, 44, 182, 122, 49, 161, 101, 34, 157, 100, 38, 128, 76, 23, 131, 87, 34, 188, 131, 65, 188, 138, 66, 179, 123, 51, 133, 83, 27, 162, 104, 37, 125, 71, 15, 132, 78, 21, 154, 98, 36, 147, 101, 45, 143, 91, 38, 134, 78, 22, 123, 73, 24, 159, + 115, 57, 192, 137, 64, 176, 121, 53, 180, 120, 52, 184, 121, 47, 173, 111, 40, 176, 111, 41, 167, 110, 44, 152, 93, 32, 143, 78, 17, 162, 97, 36, 182, 124, 53, 194, 135, 65, 208, 149, 76, 194, 135, 62, 204, 145, 73, 198, 136, 59, 189, 130, 58, 158, 92, 29, 194, 135, 63, 172, 111, 47, 180, 120, 58, 192, 133, 63, 197, 131, 57, 184, 122, 55, 189, 127, 58, 178, 107, 38, 171, 105, 40, 169, 100, 34, 206, 137, 65, 200, 135, 62, 192, 128, 54, 188, 122, 43, 198, 131, 57, 197, 134, 59, 161, 97, 34, 177, 111, 44, 195, 129, 54, 198, 132, 57, 201, 137, 63, 198, 129, 54, 193, 131, 61, 142, 79, 22, 187, 122, 51, 196, 125, 51, 186, 115, 38, 192, 126, 49, 198, 129, 51, 192, 129, 58, 186, 120, 47, 193, 128, 51, 193, 133, 60, 193, 133, 57, 193, 129, + 59, 170, 107, 43, 166, 101, 36, 186, 117, 42, 150, 78, 15, 181, 109, 40, 186, 117, 42, 181, 111, 39, 176, 105, 38, 186, 117, 46, 178, 112, 44, 164, 99, 40, 180, 117, 54, 149, 86, 34, 175, 115, 56, 174, 110, 44, 158, 87, 25, 159, 87, 21, 182, 112, 39, 190, 120, 45, 174, 104, 32, 164, 98, 34, 169, 104, 37, 173, 104, 38, 184, 117, 46, 171, 114, 56, 142, 87, 40, 123, 63, 18, 140, 83, 33, 136, 72, 22, 141, 79, 25, 142, 88, 31, 128, 81, 29, 124, 88, 29, 120, 89, 27, 107, 84, 27, 81, 67, 14, 92, 98, 66, 59, 59, 20, 51, 50, 5, 50, 50, 3, 44, 53, 4, 53, 64, 15, 52, 61, 19, 43, 51, 15, 73, 77, 42, 110, 117, 97, 129, 139, 132, 104, 108, 80, 65, 68, 36, 55, 59, 17, 43, 49, 7, 32, 36, 0, 28, 31, 0, + 88, 84, 33, 56, 55, 8, 36, 33, 2, 49, 46, 8, 36, 34, 5, 46, 43, 9, 85, 84, 13, 104, 92, 32, 34, 28, 4, 69, 68, 17, 90, 98, 20, 99, 106, 28, 108, 109, 45, 109, 107, 45, 103, 100, 40, 70, 72, 28, 29, 28, 15, 60, 49, 28, 48, 36, 20, 78, 55, 30, 125, 82, 34, 126, 86, 33, 106, 67, 21, 104, 66, 28, 98, 61, 22, 81, 45, 9, 109, 67, 28, 166, 110, 48, 156, 106, 39, 128, 82, 25, 145, 93, 37, 179, 127, 54, 193, 138, 65, 202, 146, 67, 203, 145, 64, 188, 131, 55, 173, 111, 38, 162, 99, 33, 160, 106, 40, 135, 83, 25, 148, 101, 38, 197, 144, 73, 191, 135, 62, 177, 120, 49, 139, 82, 27, 163, 107, 38, 137, 82, 27, 148, 93, 30, 137, 83, 24, 154, 102, 47, 148, 97, 35, 128, 71, 17, 104, 53, 11, 154, + 106, 49, 186, 136, 72, 195, 138, 72, 169, 113, 48, 184, 127, 53, 170, 104, 36, 174, 107, 36, 157, 100, 37, 144, 85, 28, 145, 81, 23, 164, 100, 38, 175, 113, 43, 198, 138, 66, 211, 152, 80, 199, 139, 66, 192, 132, 59, 202, 140, 63, 194, 137, 70, 149, 90, 30, 175, 114, 42, 187, 124, 51, 189, 124, 51, 182, 117, 47, 184, 120, 52, 183, 122, 51, 178, 119, 51, 183, 109, 39, 174, 107, 38, 151, 85, 23, 198, 129, 56, 205, 138, 67, 189, 120, 47, 192, 127, 56, 186, 118, 45, 186, 120, 46, 182, 116, 46, 165, 101, 40, 191, 123, 53, 190, 123, 52, 198, 134, 61, 197, 129, 52, 193, 127, 56, 139, 79, 21, 159, 94, 30, 196, 127, 52, 192, 124, 48, 186, 116, 43, 195, 126, 51, 197, 135, 64, 192, 127, 52, 194, 129, 56, 192, 125, 57, 190, 126, 52, 188, 124, + 50, 162, 99, 35, 160, 92, 27, 171, 101, 29, 163, 92, 25, 173, 106, 37, 189, 118, 43, 180, 107, 37, 152, 84, 20, 161, 95, 28, 184, 118, 50, 174, 113, 48, 170, 107, 47, 148, 87, 30, 156, 95, 37, 165, 101, 43, 164, 94, 29, 151, 78, 15, 165, 92, 24, 180, 109, 33, 179, 109, 38, 176, 109, 41, 163, 94, 34, 162, 99, 36, 169, 105, 41, 164, 103, 41, 144, 89, 42, 138, 81, 34, 137, 74, 23, 129, 71, 27, 114, 54, 13, 134, 73, 21, 131, 80, 30, 124, 76, 26, 125, 90, 28, 105, 81, 23, 99, 78, 23, 99, 96, 49, 63, 63, 24, 44, 48, 14, 42, 47, 5, 43, 51, 0, 53, 62, 1, 57, 63, 3, 49, 58, 5, 76, 75, 23, 88, 88, 53, 92, 96, 70, 87, 88, 59, 85, 82, 37, 76, 78, 33, 52, 54, 14, 35, 41, 2, 27, 35, 0, + 81, 76, 16, 76, 75, 15, 61, 64, 8, 73, 71, 18, 73, 73, 15, 87, 92, 23, 87, 94, 24, 70, 74, 7, 85, 84, 16, 118, 115, 48, 106, 117, 41, 80, 97, 20, 91, 99, 25, 91, 95, 27, 88, 96, 59, 54, 59, 37, 41, 37, 20, 59, 43, 23, 37, 26, 15, 67, 42, 18, 82, 52, 17, 102, 68, 24, 105, 66, 25, 108, 71, 30, 89, 53, 12, 80, 47, 10, 134, 88, 41, 156, 104, 40, 135, 86, 30, 120, 72, 19, 150, 99, 43, 187, 132, 57, 200, 144, 64, 205, 149, 70, 181, 126, 52, 183, 122, 44, 163, 104, 35, 167, 106, 37, 165, 108, 34, 146, 93, 30, 162, 108, 45, 197, 140, 67, 197, 138, 59, 169, 110, 35, 154, 98, 43, 155, 99, 34, 142, 90, 31, 155, 99, 32, 144, 90, 27, 146, 96, 44, 143, 91, 31, 128, 75, 24, 100, 52, 9, 144, + 94, 41, 169, 119, 60, 190, 142, 75, 147, 93, 36, 193, 139, 66, 175, 111, 41, 174, 108, 33, 166, 103, 40, 146, 86, 28, 145, 84, 29, 162, 97, 35, 179, 112, 43, 180, 119, 50, 203, 143, 69, 201, 140, 71, 185, 122, 53, 204, 140, 65, 204, 147, 75, 141, 89, 29, 170, 108, 39, 175, 109, 40, 180, 110, 40, 177, 112, 41, 175, 112, 41, 183, 120, 47, 174, 112, 43, 180, 108, 40, 188, 121, 47, 159, 90, 26, 183, 111, 40, 204, 137, 66, 189, 117, 43, 191, 126, 51, 177, 112, 38, 200, 138, 65, 180, 112, 40, 168, 105, 42, 191, 128, 55, 182, 116, 44, 191, 129, 58, 198, 133, 56, 199, 134, 64, 147, 83, 32, 155, 96, 37, 190, 122, 49, 196, 132, 56, 181, 110, 34, 180, 106, 33, 192, 129, 55, 191, 128, 61, 197, 135, 60, 195, 132, 61, 182, 112, 40, 187, 118, + 40, 163, 97, 33, 165, 94, 25, 162, 93, 25, 166, 98, 26, 154, 83, 18, 185, 108, 33, 166, 94, 26, 149, 83, 24, 133, 68, 13, 163, 102, 38, 178, 111, 37, 171, 105, 37, 169, 106, 42, 154, 87, 23, 159, 95, 42, 164, 95, 35, 144, 71, 8, 157, 83, 17, 176, 104, 32, 176, 105, 37, 183, 118, 47, 181, 113, 43, 172, 108, 42, 169, 106, 43, 169, 110, 49, 164, 107, 47, 138, 88, 38, 127, 76, 34, 113, 56, 15, 116, 56, 21, 114, 52, 13, 128, 70, 21, 132, 84, 30, 134, 92, 39, 108, 76, 26, 105, 81, 25, 108, 104, 63, 71, 71, 43, 47, 57, 40, 43, 45, 9, 40, 43, 4, 56, 57, 6, 58, 61, 0, 55, 67, 0, 60, 66, 4, 60, 59, 8, 72, 69, 28, 97, 101, 84, 113, 114, 82, 99, 110, 96, 71, 79, 59, 42, 41, 3, 35, 41, 0, + 28, 26, 0, 29, 29, 1, 29, 29, 0, 33, 36, 3, 48, 64, 3, 69, 90, 13, 64, 88, 15, 71, 75, 13, 32, 49, 1, 85, 85, 24, 108, 103, 37, 98, 96, 34, 95, 98, 26, 44, 58, 7, 55, 69, 37, 74, 79, 64, 39, 31, 17, 61, 45, 25, 29, 18, 6, 52, 32, 15, 78, 50, 22, 100, 63, 20, 105, 61, 22, 97, 57, 18, 97, 60, 18, 88, 53, 18, 138, 90, 40, 155, 107, 45, 138, 88, 30, 92, 52, 14, 146, 93, 33, 175, 119, 49, 197, 140, 64, 192, 138, 64, 177, 121, 48, 166, 106, 34, 184, 121, 47, 172, 112, 41, 163, 103, 36, 145, 89, 32, 172, 119, 54, 197, 140, 64, 188, 124, 47, 171, 111, 40, 156, 100, 34, 140, 83, 24, 143, 82, 19, 154, 96, 31, 140, 88, 28, 128, 81, 35, 154, 101, 37, 94, 56, 27, 116, 66, 18, 137, + 83, 29, 153, 98, 44, 194, 142, 76, 157, 107, 47, 178, 119, 51, 172, 103, 34, 199, 136, 60, 164, 103, 37, 148, 85, 32, 157, 94, 35, 174, 111, 45, 174, 108, 44, 173, 105, 39, 186, 123, 51, 195, 134, 62, 188, 125, 50, 203, 138, 63, 204, 146, 73, 158, 98, 36, 151, 90, 28, 156, 90, 26, 163, 94, 28, 173, 106, 40, 174, 106, 35, 189, 126, 54, 187, 123, 51, 181, 110, 40, 192, 121, 50, 170, 98, 27, 176, 106, 35, 201, 135, 59, 184, 116, 41, 186, 117, 44, 185, 119, 46, 193, 126, 54, 184, 117, 45, 196, 133, 60, 190, 125, 56, 191, 126, 56, 194, 130, 58, 197, 130, 55, 203, 142, 67, 146, 82, 27, 146, 83, 24, 180, 109, 40, 188, 123, 52, 187, 119, 45, 175, 103, 30, 186, 122, 48, 181, 119, 49, 187, 124, 50, 193, 130, 54, 181, 111, 35, 180, 109, + 36, 167, 96, 34, 160, 88, 25, 172, 102, 32, 146, 76, 16, 151, 80, 17, 174, 104, 31, 171, 100, 30, 149, 82, 19, 129, 64, 10, 130, 68, 19, 153, 87, 26, 157, 88, 26, 158, 92, 33, 145, 78, 23, 136, 72, 14, 160, 89, 27, 142, 74, 18, 150, 80, 16, 173, 97, 25, 175, 101, 32, 180, 105, 36, 176, 106, 38, 170, 101, 36, 166, 101, 32, 174, 113, 47, 174, 112, 49, 157, 97, 40, 121, 68, 27, 120, 66, 29, 81, 33, 8, 104, 49, 14, 108, 52, 19, 112, 65, 22, 107, 71, 23, 120, 82, 40, 100, 72, 37, 99, 85, 57, 65, 83, 81, 57, 66, 45, 36, 35, 0, 43, 40, 1, 57, 51, 0, 59, 58, 0, 60, 71, 8, 63, 78, 7, 54, 59, 3, 62, 59, 14, 101, 99, 54, 112, 116, 86, 104, 119, 97, 74, 79, 36, 42, 41, 3, 37, 36, 0, + 31, 39, 1, 47, 62, 3, 58, 69, 5, 47, 56, 0, 57, 75, 3, 67, 90, 7, 74, 105, 32, 64, 76, 13, 19, 41, 0, 72, 78, 32, 69, 65, 24, 98, 90, 15, 130, 122, 51, 84, 87, 42, 47, 60, 14, 39, 47, 15, 41, 33, 21, 58, 38, 16, 29, 19, 3, 73, 44, 17, 77, 48, 15, 75, 44, 12, 93, 55, 19, 123, 79, 31, 101, 63, 21, 104, 60, 22, 154, 103, 42, 150, 97, 35, 136, 89, 32, 110, 65, 24, 134, 86, 34, 168, 112, 51, 190, 134, 56, 186, 134, 54, 167, 107, 39, 184, 120, 46, 175, 110, 43, 165, 105, 35, 169, 107, 41, 136, 82, 28, 195, 136, 64, 194, 134, 56, 181, 123, 50, 171, 114, 43, 150, 94, 34, 125, 68, 11, 142, 83, 16, 163, 103, 41, 154, 96, 33, 117, 75, 26, 159, 108, 44, 102, 58, 17, 137, 83, 25, 136, + 81, 36, 158, 102, 49, 161, 114, 63, 162, 109, 49, 163, 101, 38, 179, 111, 43, 206, 140, 60, 178, 115, 46, 156, 97, 44, 167, 104, 38, 178, 116, 48, 173, 112, 45, 168, 103, 36, 182, 115, 42, 199, 136, 63, 179, 114, 41, 198, 133, 58, 199, 139, 66, 176, 116, 49, 147, 82, 26, 154, 96, 40, 168, 102, 34, 164, 95, 30, 192, 130, 56, 182, 114, 45, 164, 98, 31, 165, 101, 35, 183, 115, 46, 176, 105, 37, 179, 106, 39, 187, 118, 47, 179, 111, 39, 183, 116, 46, 198, 131, 55, 187, 119, 46, 190, 124, 51, 200, 136, 65, 181, 114, 50, 188, 124, 50, 183, 117, 48, 192, 124, 53, 202, 140, 67, 154, 91, 32, 150, 88, 26, 182, 115, 46, 173, 108, 41, 189, 123, 49, 174, 102, 32, 178, 114, 41, 178, 116, 43, 187, 125, 52, 189, 121, 41, 175, 106, 34, 175, 106, + 41, 167, 100, 38, 156, 87, 24, 178, 107, 35, 174, 109, 36, 156, 88, 21, 164, 96, 26, 162, 89, 26, 124, 58, 13, 112, 52, 11, 94, 38, 5, 102, 45, 13, 129, 68, 12, 149, 84, 21, 154, 89, 30, 142, 79, 20, 160, 88, 25, 159, 89, 27, 132, 65, 12, 153, 84, 19, 156, 84, 18, 167, 92, 23, 178, 107, 34, 168, 99, 29, 179, 114, 39, 166, 102, 37, 169, 106, 39, 178, 120, 57, 151, 93, 36, 133, 82, 37, 101, 57, 31, 67, 23, 4, 109, 59, 25, 102, 54, 26, 79, 47, 25, 97, 75, 57, 101, 87, 78, 104, 82, 58, 88, 91, 82, 72, 81, 62, 39, 42, 3, 42, 39, 0, 61, 50, 0, 68, 62, 0, 64, 70, 18, 69, 81, 13, 70, 73, 10, 61, 55, 0, 81, 79, 22, 86, 91, 51, 71, 75, 17, 44, 50, 3, 38, 40, 1, 37, 33, 0, + 50, 61, 6, 50, 67, 1, 50, 68, 0, 51, 61, 3, 69, 83, 3, 45, 60, 0, 63, 84, 17, 65, 97, 27, 39, 68, 3, 28, 47, 1, 81, 68, 9, 117, 94, 23, 86, 63, 3, 71, 63, 13, 108, 102, 19, 69, 67, 34, 22, 18, 6, 33, 21, 11, 24, 15, 4, 78, 49, 22, 72, 41, 14, 78, 49, 23, 109, 70, 31, 119, 77, 28, 105, 67, 26, 128, 76, 31, 144, 89, 32, 149, 96, 34, 116, 72, 24, 86, 45, 10, 124, 80, 36, 180, 127, 58, 187, 131, 53, 162, 110, 39, 178, 120, 48, 185, 124, 46, 145, 89, 29, 176, 115, 47, 158, 96, 29, 120, 71, 26, 193, 132, 61, 199, 137, 59, 193, 137, 60, 169, 110, 41, 161, 97, 29, 132, 79, 21, 144, 78, 15, 172, 108, 37, 151, 92, 32, 144, 92, 31, 158, 102, 35, 114, 62, 22, 134, 81, 29, 126, + 77, 26, 147, 91, 32, 132, 77, 31, 147, 98, 47, 150, 92, 32, 175, 117, 50, 193, 120, 46, 192, 125, 50, 167, 101, 33, 179, 119, 52, 185, 126, 59, 173, 109, 43, 153, 85, 23, 173, 101, 30, 189, 124, 52, 188, 127, 52, 191, 124, 53, 187, 126, 53, 192, 132, 62, 138, 75, 19, 137, 79, 25, 162, 96, 35, 174, 109, 41, 177, 110, 45, 158, 87, 22, 167, 100, 34, 155, 91, 28, 162, 93, 29, 179, 108, 37, 183, 113, 46, 188, 118, 45, 179, 112, 39, 173, 104, 30, 172, 107, 37, 176, 109, 38, 182, 113, 40, 195, 126, 59, 173, 106, 38, 192, 125, 56, 178, 110, 42, 190, 124, 49, 196, 133, 62, 165, 99, 38, 159, 94, 31, 184, 120, 51, 175, 107, 41, 185, 115, 41, 178, 108, 37, 176, 110, 39, 167, 103, 34, 184, 120, 44, 190, 124, 49, 169, 103, 36, 165, 102, + 37, 176, 113, 47, 171, 107, 46, 180, 112, 41, 186, 117, 46, 179, 113, 44, 168, 100, 35, 150, 79, 17, 146, 83, 26, 150, 93, 37, 144, 89, 34, 134, 74, 29, 121, 55, 11, 131, 61, 13, 142, 72, 18, 147, 79, 25, 142, 73, 16, 172, 99, 31, 176, 106, 37, 150, 84, 26, 139, 74, 18, 159, 87, 23, 157, 84, 21, 164, 94, 31, 173, 102, 32, 184, 117, 47, 172, 112, 43, 172, 111, 42, 179, 117, 53, 152, 94, 42, 130, 79, 41, 83, 37, 10, 84, 35, 11, 113, 64, 31, 88, 53, 34, 81, 75, 71, 94, 96, 104, 104, 88, 69, 99, 74, 46, 80, 71, 29, 42, 44, 3, 43, 41, 0, 65, 51, 0, 83, 70, 9, 81, 77, 22, 84, 89, 30, 78, 85, 17, 68, 69, 5, 62, 60, 7, 75, 74, 27, 66, 64, 10, 38, 44, 4, 24, 26, 0, 36, 30, 0, + 52, 63, 2, 48, 60, 0, 41, 54, 0, 68, 86, 17, 79, 102, 30, 39, 51, 0, 36, 42, 6, 64, 88, 27, 57, 83, 16, 51, 64, 5, 91, 73, 11, 147, 121, 48, 113, 88, 17, 45, 36, 0, 44, 39, 1, 49, 49, 2, 22, 19, 6, 30, 22, 5, 48, 32, 14, 77, 44, 13, 71, 43, 17, 95, 60, 32, 125, 83, 35, 138, 93, 41, 112, 70, 26, 137, 86, 33, 138, 83, 29, 142, 92, 37, 96, 56, 15, 67, 38, 13, 134, 88, 37, 179, 126, 55, 165, 112, 43, 166, 115, 46, 187, 130, 59, 178, 117, 44, 165, 109, 46, 171, 107, 40, 163, 101, 30, 119, 70, 26, 184, 124, 49, 195, 134, 56, 185, 130, 56, 170, 112, 46, 165, 102, 33, 134, 81, 24, 124, 68, 19, 171, 107, 37, 149, 92, 29, 166, 105, 41, 162, 104, 35, 131, 80, 27, 110, 59, 15, 139, + 84, 30, 118, 67, 19, 149, 82, 23, 146, 91, 39, 155, 98, 37, 170, 111, 42, 186, 122, 46, 176, 116, 44, 179, 108, 34, 188, 130, 58, 182, 123, 51, 163, 99, 33, 166, 95, 30, 179, 114, 42, 178, 115, 44, 187, 119, 45, 181, 113, 44, 194, 130, 55, 185, 122, 53, 160, 98, 37, 144, 84, 27, 146, 83, 24, 172, 112, 46, 143, 79, 17, 161, 90, 28, 168, 100, 33, 158, 92, 29, 141, 74, 13, 177, 105, 35, 184, 115, 45, 186, 116, 45, 180, 113, 43, 175, 110, 42, 167, 100, 34, 170, 103, 41, 164, 94, 28, 189, 123, 52, 180, 112, 42, 181, 112, 43, 172, 104, 36, 181, 112, 40, 194, 133, 58, 168, 104, 42, 163, 95, 32, 180, 118, 50, 161, 95, 29, 181, 111, 36, 181, 113, 40, 178, 114, 46, 171, 102, 34, 170, 101, 33, 187, 123, 48, 169, 102, 34, 189, 129, + 61, 213, 161, 93, 219, 164, 91, 217, 157, 84, 214, 152, 76, 207, 142, 68, 203, 140, 67, 199, 139, 65, 205, 151, 84, 211, 161, 92, 213, 160, 88, 212, 155, 83, 189, 127, 63, 164, 96, 39, 154, 84, 27, 165, 95, 34, 163, 94, 31, 166, 92, 26, 184, 110, 39, 183, 109, 35, 164, 92, 31, 138, 74, 17, 154, 87, 25, 153, 83, 23, 154, 80, 17, 174, 105, 37, 181, 114, 45, 170, 107, 43, 179, 115, 50, 157, 100, 41, 142, 80, 36, 97, 45, 13, 102, 51, 22, 105, 53, 24, 111, 69, 42, 87, 69, 56, 93, 80, 54, 98, 76, 41, 86, 60, 36, 91, 69, 30, 58, 48, 7, 38, 35, 3, 59, 52, 9, 76, 71, 38, 87, 84, 48, 77, 80, 47, 78, 85, 21, 63, 72, 6, 61, 63, 10, 82, 80, 26, 77, 75, 20, 38, 41, 10, 20, 20, 0, 46, 38, 0, + 36, 50, 0, 37, 54, 0, 46, 59, 1, 75, 97, 14, 75, 92, 13, 40, 46, 0, 30, 32, 0, 47, 57, 11, 70, 85, 31, 102, 95, 30, 87, 83, 20, 91, 83, 9, 130, 105, 15, 119, 100, 25, 94, 74, 3, 50, 50, 0, 22, 21, 6, 32, 22, 6, 69, 46, 23, 76, 44, 12, 81, 51, 22, 122, 82, 36, 136, 89, 35, 123, 76, 26, 118, 72, 28, 121, 69, 22, 141, 89, 40, 119, 70, 27, 78, 43, 13, 96, 60, 23, 151, 101, 41, 180, 130, 57, 161, 111, 45, 161, 113, 46, 197, 137, 61, 177, 118, 49, 174, 116, 45, 174, 114, 41, 159, 102, 41, 127, 76, 31, 181, 123, 52, 190, 130, 52, 188, 130, 60, 184, 121, 53, 173, 113, 45, 150, 93, 30, 150, 95, 37, 169, 107, 40, 150, 90, 25, 167, 104, 34, 184, 124, 57, 119, 67, 18, 111, 62, 20, 140, + 82, 29, 118, 64, 14, 175, 108, 29, 129, 67, 14, 148, 84, 24, 153, 88, 25, 192, 130, 53, 181, 116, 41, 166, 97, 31, 188, 130, 58, 190, 130, 59, 164, 99, 33, 171, 105, 36, 184, 119, 50, 182, 117, 46, 184, 115, 43, 172, 107, 36, 182, 125, 53, 182, 127, 58, 151, 93, 27, 148, 86, 26, 162, 95, 30, 150, 88, 28, 146, 81, 21, 141, 74, 16, 147, 86, 27, 138, 80, 25, 148, 76, 14, 165, 92, 26, 181, 111, 41, 191, 121, 51, 179, 112, 42, 178, 112, 41, 158, 95, 30, 136, 72, 13, 146, 79, 17, 160, 94, 30, 179, 112, 43, 168, 102, 34, 154, 83, 17, 165, 94, 29, 188, 119, 49, 183, 117, 51, 170, 106, 41, 165, 102, 37, 153, 84, 25, 183, 114, 39, 179, 112, 38, 165, 102, 35, 159, 93, 26, 166, 98, 31, 164, 99, 32, 191, 133, 67, 215, 160, + 86, 220, 158, 81, 223, 160, 83, 211, 145, 69, 203, 136, 58, 207, 135, 55, 203, 126, 47, 193, 114, 36, 191, 116, 41, 184, 109, 35, 183, 110, 36, 188, 118, 46, 196, 132, 62, 195, 127, 56, 178, 107, 40, 180, 109, 44, 173, 101, 34, 163, 89, 23, 182, 107, 34, 193, 119, 43, 203, 127, 51, 180, 112, 39, 146, 77, 17, 154, 82, 21, 148, 80, 18, 156, 87, 25, 183, 116, 47, 175, 105, 41, 160, 104, 42, 160, 104, 40, 152, 94, 43, 117, 63, 25, 102, 51, 22, 105, 51, 22, 90, 42, 15, 87, 63, 32, 89, 70, 32, 94, 91, 80, 79, 64, 45, 92, 67, 27, 77, 61, 16, 38, 38, 10, 40, 45, 34, 52, 57, 52, 66, 58, 23, 65, 55, 4, 74, 72, 0, 69, 77, 6, 75, 74, 8, 78, 72, 10, 70, 72, 14, 39, 40, 6, 29, 26, 0, 65, 53, 0, + 70, 69, 6, 44, 58, 0, 53, 78, 2, 55, 86, 0, 43, 59, 0, 37, 40, 0, 45, 39, 2, 36, 36, 3, 62, 70, 15, 92, 91, 23, 99, 97, 26, 105, 97, 16, 168, 136, 46, 180, 146, 64, 145, 117, 33, 70, 62, 0, 26, 19, 4, 43, 27, 13, 69, 41, 17, 77, 48, 18, 111, 72, 36, 131, 81, 31, 141, 93, 35, 113, 68, 18, 119, 71, 24, 147, 97, 40, 144, 97, 45, 102, 59, 20, 84, 51, 19, 115, 74, 30, 131, 84, 35, 159, 107, 39, 131, 87, 31, 164, 116, 48, 181, 123, 49, 171, 114, 48, 169, 111, 47, 177, 120, 52, 141, 86, 31, 110, 62, 22, 186, 128, 59, 183, 127, 49, 189, 129, 55, 191, 128, 55, 171, 112, 43, 153, 95, 36, 162, 111, 49, 168, 107, 39, 155, 93, 31, 163, 104, 37, 192, 132, 57, 142, 86, 28, 122, 75, 27, 126, + 70, 19, 126, 70, 21, 194, 126, 45, 156, 92, 28, 162, 94, 28, 153, 87, 21, 189, 123, 49, 160, 92, 27, 165, 102, 41, 196, 137, 66, 204, 144, 70, 170, 105, 41, 167, 103, 39, 170, 108, 40, 174, 106, 35, 180, 112, 39, 166, 100, 31, 189, 127, 57, 190, 130, 57, 132, 71, 17, 139, 82, 27, 146, 76, 15, 162, 95, 32, 140, 72, 17, 153, 87, 27, 152, 93, 36, 138, 82, 26, 134, 67, 12, 165, 93, 27, 177, 110, 42, 181, 109, 40, 181, 114, 42, 175, 107, 38, 167, 106, 42, 138, 72, 17, 128, 64, 9, 152, 87, 23, 171, 105, 36, 178, 110, 42, 158, 89, 26, 167, 96, 31, 182, 113, 44, 181, 114, 49, 166, 99, 35, 161, 93, 28, 154, 85, 25, 183, 116, 43, 172, 104, 30, 159, 92, 27, 162, 98, 33, 167, 100, 31, 186, 125, 55, 210, 155, 87, 219, 162, + 91, 221, 159, 81, 230, 165, 88, 225, 159, 77, 217, 148, 68, 210, 136, 53, 202, 124, 47, 203, 122, 45, 196, 111, 33, 187, 99, 17, 175, 91, 14, 172, 89, 14, 173, 100, 23, 184, 113, 44, 183, 111, 40, 181, 109, 39, 180, 101, 32, 173, 92, 27, 184, 105, 34, 196, 123, 43, 208, 135, 55, 206, 134, 56, 153, 87, 29, 134, 65, 9, 142, 75, 16, 142, 77, 20, 158, 93, 29, 168, 102, 35, 160, 97, 37, 156, 96, 38, 165, 107, 53, 131, 75, 30, 102, 53, 14, 111, 54, 21, 91, 38, 9, 95, 61, 21, 94, 69, 29, 79, 61, 33, 62, 46, 10, 79, 50, 14, 95, 73, 31, 68, 60, 29, 29, 33, 17, 23, 26, 10, 33, 27, 0, 57, 44, 0, 68, 61, 0, 80, 77, 11, 88, 86, 20, 89, 85, 19, 74, 78, 20, 72, 75, 17, 84, 84, 22, 95, 93, 28, + 145, 127, 40, 74, 68, 0, 37, 52, 0, 34, 62, 0, 26, 47, 0, 49, 49, 5, 76, 69, 21, 76, 67, 19, 52, 45, 4, 62, 61, 3, 48, 53, 0, 76, 69, 7, 151, 110, 27, 161, 126, 36, 125, 108, 20, 62, 57, 0, 29, 20, 4, 49, 32, 17, 78, 48, 21, 97, 63, 27, 91, 47, 16, 134, 84, 34, 114, 66, 14, 95, 49, 10, 133, 85, 29, 141, 95, 43, 131, 83, 33, 92, 52, 14, 131, 88, 44, 109, 63, 24, 131, 82, 33, 166, 112, 45, 134, 88, 29, 161, 110, 45, 175, 120, 43, 162, 108, 44, 182, 125, 60, 183, 124, 57, 143, 92, 31, 112, 66, 28, 191, 132, 63, 182, 123, 51, 189, 128, 52, 194, 131, 56, 150, 92, 32, 155, 102, 45, 159, 112, 56, 171, 113, 46, 160, 98, 34, 163, 104, 37, 188, 127, 56, 157, 103, 39, 153, 102, 42, 124, + 68, 17, 129, 79, 26, 197, 130, 45, 188, 121, 48, 158, 89, 26, 167, 96, 28, 180, 112, 41, 155, 83, 20, 175, 104, 31, 196, 128, 56, 216, 150, 72, 179, 116, 49, 179, 118, 53, 135, 72, 23, 171, 101, 28, 171, 97, 24, 176, 112, 41, 178, 113, 37, 184, 119, 48, 157, 93, 26, 137, 71, 11, 160, 92, 27, 178, 107, 39, 160, 95, 28, 163, 101, 35, 161, 103, 41, 157, 98, 37, 124, 66, 15, 154, 83, 16, 182, 114, 44, 163, 94, 25, 181, 112, 44, 186, 118, 52, 178, 112, 43, 145, 79, 19, 145, 82, 23, 159, 94, 27, 161, 97, 33, 187, 121, 48, 170, 104, 36, 175, 104, 35, 175, 106, 37, 182, 115, 45, 168, 103, 37, 157, 87, 26, 167, 94, 26, 184, 116, 42, 164, 98, 27, 138, 78, 21, 161, 98, 31, 171, 115, 53, 218, 167, 94, 224, 167, 91, 226, 166, + 89, 230, 166, 85, 232, 168, 87, 227, 162, 79, 221, 149, 66, 209, 130, 51, 208, 130, 52, 210, 130, 53, 202, 120, 46, 192, 103, 25, 178, 91, 11, 167, 83, 8, 167, 83, 9, 169, 87, 14, 177, 97, 23, 175, 97, 25, 178, 99, 28, 178, 93, 21, 179, 100, 26, 193, 117, 42, 204, 129, 52, 213, 138, 57, 201, 131, 55, 151, 83, 21, 154, 88, 28, 143, 82, 24, 152, 93, 33, 163, 101, 32, 170, 111, 43, 156, 93, 38, 168, 105, 47, 127, 73, 28, 119, 67, 26, 113, 59, 28, 101, 47, 18, 81, 51, 16, 71, 53, 16, 65, 51, 7, 58, 46, 0, 63, 43, 9, 97, 76, 41, 98, 80, 40, 59, 53, 27, 28, 28, 3, 38, 37, 2, 64, 57, 4, 79, 76, 24, 95, 95, 38, 110, 114, 51, 108, 110, 44, 93, 99, 30, 98, 100, 17, 128, 118, 24, 108, 90, 2, + 159, 136, 45, 95, 87, 5, 35, 50, 0, 17, 36, 0, 20, 30, 0, 36, 40, 4, 93, 83, 33, 101, 91, 42, 74, 65, 12, 64, 59, 6, 53, 49, 0, 62, 58, 4, 91, 81, 9, 80, 79, 3, 62, 67, 0, 42, 42, 0, 66, 44, 17, 74, 41, 17, 83, 47, 21, 88, 50, 19, 107, 62, 26, 116, 66, 21, 103, 55, 13, 93, 51, 13, 142, 93, 42, 147, 96, 44, 120, 75, 29, 133, 92, 41, 131, 88, 42, 106, 66, 24, 141, 91, 37, 150, 97, 37, 128, 82, 33, 162, 106, 41, 184, 128, 53, 158, 105, 45, 174, 120, 54, 180, 125, 61, 155, 106, 48, 123, 71, 24, 178, 122, 54, 185, 122, 53, 194, 135, 59, 192, 128, 52, 112, 66, 22, 145, 88, 34, 139, 95, 44, 168, 110, 46, 152, 96, 35, 162, 109, 44, 179, 123, 55, 175, 117, 50, 145, 91, 37, 161, + 105, 47, 151, 94, 32, 193, 130, 50, 191, 128, 52, 151, 87, 25, 168, 98, 29, 172, 103, 33, 184, 117, 46, 190, 127, 49, 180, 110, 36, 199, 130, 52, 190, 127, 52, 195, 133, 60, 151, 85, 27, 155, 80, 14, 171, 91, 17, 187, 117, 40, 170, 99, 29, 186, 112, 34, 192, 116, 41, 173, 98, 21, 191, 121, 44, 191, 124, 46, 179, 112, 38, 173, 106, 39, 179, 111, 37, 166, 100, 30, 126, 67, 16, 164, 96, 29, 175, 104, 37, 180, 110, 38, 169, 97, 30, 172, 100, 31, 187, 120, 46, 168, 97, 32, 154, 86, 25, 154, 88, 23, 141, 79, 20, 171, 104, 34, 187, 122, 49, 177, 108, 40, 169, 98, 28, 181, 116, 42, 170, 104, 38, 153, 86, 23, 165, 91, 23, 168, 101, 29, 166, 104, 37, 133, 74, 20, 164, 113, 53, 215, 165, 93, 220, 161, 83, 223, 160, 80, 231, 170, + 88, 229, 164, 83, 229, 162, 84, 224, 151, 70, 217, 145, 63, 208, 133, 53, 203, 127, 50, 203, 122, 43, 198, 116, 39, 189, 106, 30, 185, 99, 21, 182, 97, 21, 171, 89, 16, 164, 80, 6, 169, 87, 13, 165, 84, 15, 166, 83, 13, 173, 90, 15, 181, 99, 23, 194, 120, 39, 207, 137, 57, 207, 137, 57, 207, 134, 54, 180, 113, 42, 156, 89, 23, 165, 106, 42, 151, 98, 42, 135, 81, 31, 139, 82, 23, 170, 107, 47, 156, 92, 37, 149, 90, 43, 111, 60, 19, 114, 57, 20, 126, 67, 31, 119, 72, 32, 85, 66, 25, 84, 74, 29, 81, 71, 19, 86, 72, 23, 91, 75, 24, 105, 93, 32, 119, 109, 54, 84, 85, 21, 64, 71, 15, 56, 57, 6, 64, 63, 9, 71, 71, 4, 94, 93, 14, 96, 103, 17, 74, 83, 13, 75, 70, 9, 130, 122, 52, 128, 113, 18, + 117, 101, 19, 60, 59, 0, 29, 44, 0, 20, 39, 0, 15, 25, 0, 21, 29, 1, 41, 44, 5, 69, 68, 15, 58, 55, 6, 72, 70, 19, 75, 74, 21, 62, 69, 10, 55, 60, 0, 40, 49, 0, 36, 44, 0, 53, 45, 6, 69, 40, 13, 96, 55, 25, 100, 60, 23, 89, 45, 18, 110, 60, 21, 90, 44, 6, 100, 56, 19, 89, 51, 15, 138, 88, 40, 138, 85, 34, 117, 69, 28, 147, 102, 46, 132, 87, 37, 119, 77, 28, 144, 90, 38, 145, 97, 42, 117, 71, 23, 165, 107, 44, 185, 127, 50, 151, 97, 39, 171, 116, 50, 169, 118, 57, 143, 91, 36, 117, 67, 22, 171, 114, 46, 189, 126, 53, 194, 131, 54, 176, 117, 47, 88, 47, 10, 126, 74, 29, 147, 100, 45, 158, 98, 42, 165, 105, 42, 161, 110, 51, 163, 107, 42, 169, 111, 50, 165, 113, 52, 166, + 111, 52, 182, 118, 49, 168, 103, 35, 190, 127, 50, 143, 84, 27, 143, 82, 22, 154, 85, 23, 188, 121, 44, 197, 129, 54, 166, 97, 27, 195, 128, 53, 202, 139, 60, 184, 123, 49, 169, 101, 32, 146, 72, 13, 175, 96, 22, 197, 123, 44, 184, 108, 28, 193, 117, 36, 176, 90, 15, 188, 106, 25, 197, 117, 35, 196, 120, 39, 201, 128, 51, 197, 129, 50, 189, 115, 36, 184, 114, 36, 167, 98, 30, 158, 92, 29, 148, 82, 17, 172, 108, 38, 170, 102, 34, 164, 92, 23, 187, 120, 44, 175, 108, 40, 158, 91, 26, 150, 83, 22, 142, 81, 22, 152, 82, 20, 194, 127, 49, 169, 101, 29, 162, 92, 25, 177, 110, 38, 174, 108, 39, 160, 93, 28, 159, 87, 20, 170, 100, 27, 167, 99, 30, 155, 102, 47, 214, 163, 91, 228, 165, 83, 228, 166, 85, 230, 165, 82, 228, 158, + 76, 226, 157, 73, 225, 152, 70, 217, 146, 66, 217, 144, 63, 210, 133, 50, 196, 115, 37, 192, 109, 30, 193, 105, 25, 192, 105, 26, 201, 112, 34, 197, 115, 35, 192, 111, 32, 169, 89, 18, 163, 80, 9, 168, 86, 12, 167, 84, 14, 161, 79, 8, 175, 89, 16, 189, 111, 30, 212, 142, 60, 211, 145, 68, 209, 142, 62, 196, 128, 52, 167, 100, 29, 187, 126, 54, 177, 124, 61, 152, 98, 41, 118, 65, 17, 153, 96, 37, 153, 92, 33, 149, 88, 34, 130, 77, 32, 120, 64, 23, 121, 64, 23, 122, 72, 29, 112, 71, 30, 68, 47, 7, 61, 47, 0, 69, 52, 5, 63, 48, 3, 82, 69, 20, 96, 75, 29, 79, 70, 29, 34, 38, 1, 26, 39, 1, 32, 42, 0, 48, 54, 0, 79, 82, 2, 94, 106, 19, 86, 97, 19, 91, 77, 2, 127, 111, 45, 133, 125, 46, + 33, 35, 0, 21, 33, 0, 17, 29, 0, 23, 36, 4, 26, 38, 2, 27, 47, 1, 26, 55, 0, 28, 56, 0, 33, 53, 0, 52, 61, 10, 61, 75, 27, 64, 68, 9, 54, 52, 0, 59, 51, 2, 71, 48, 4, 75, 48, 8, 111, 71, 24, 102, 53, 17, 86, 45, 17, 76, 38, 11, 101, 52, 17, 102, 60, 21, 89, 53, 18, 71, 36, 12, 129, 77, 28, 106, 53, 19, 143, 95, 38, 134, 86, 33, 119, 79, 35, 118, 75, 29, 134, 84, 32, 132, 86, 33, 120, 74, 25, 161, 109, 40, 170, 112, 45, 157, 109, 45, 171, 115, 55, 159, 106, 50, 147, 93, 45, 120, 72, 24, 157, 101, 45, 178, 116, 48, 184, 117, 47, 176, 119, 49, 105, 66, 25, 108, 64, 23, 152, 100, 37, 141, 89, 38, 183, 124, 50, 162, 104, 36, 158, 100, 37, 164, 108, 37, 141, 88, 32, 134, + 84, 37, 193, 132, 59, 162, 100, 36, 191, 128, 54, 151, 90, 27, 156, 92, 29, 166, 104, 39, 182, 114, 42, 197, 127, 51, 150, 81, 19, 190, 122, 44, 190, 118, 41, 190, 116, 38, 187, 119, 46, 176, 104, 31, 171, 90, 15, 198, 117, 36, 202, 126, 43, 185, 106, 25, 183, 103, 24, 183, 100, 20, 190, 105, 24, 195, 111, 32, 194, 110, 28, 202, 124, 42, 196, 118, 40, 188, 113, 37, 178, 103, 32, 173, 109, 42, 155, 93, 30, 157, 88, 27, 166, 101, 31, 173, 102, 31, 174, 106, 34, 188, 119, 45, 169, 100, 32, 168, 101, 35, 141, 78, 20, 124, 62, 11, 182, 106, 35, 179, 107, 33, 170, 100, 31, 176, 106, 34, 183, 117, 40, 174, 106, 36, 160, 91, 26, 161, 91, 23, 149, 85, 26, 201, 146, 75, 219, 157, 74, 234, 172, 87, 234, 169, 87, 236, 167, 80, 234, 162, + 74, 219, 144, 62, 216, 139, 57, 214, 146, 65, 217, 144, 62, 211, 133, 51, 210, 129, 48, 202, 120, 35, 199, 113, 32, 193, 108, 30, 208, 125, 45, 197, 115, 37, 198, 120, 41, 189, 113, 38, 164, 86, 17, 167, 93, 18, 171, 95, 25, 163, 81, 9, 168, 86, 12, 184, 104, 27, 199, 124, 41, 214, 147, 69, 217, 155, 77, 207, 143, 65, 190, 126, 53, 200, 140, 61, 200, 147, 75, 166, 119, 59, 120, 77, 38, 113, 61, 20, 151, 91, 40, 134, 76, 27, 106, 57, 20, 118, 60, 21, 129, 75, 31, 108, 60, 20, 103, 61, 23, 88, 53, 12, 77, 56, 12, 59, 40, 5, 67, 47, 11, 79, 64, 26, 67, 51, 18, 98, 82, 48, 58, 54, 12, 24, 34, 0, 24, 40, 0, 37, 53, 3, 47, 62, 3, 67, 81, 6, 79, 88, 12, 99, 86, 2, 137, 110, 40, 126, 105, 39, + 15, 26, 1, 12, 26, 0, 13, 25, 0, 26, 35, 1, 41, 50, 0, 32, 48, 0, 29, 53, 1, 43, 68, 4, 62, 77, 4, 62, 65, 4, 52, 59, 8, 58, 61, 8, 61, 54, 3, 75, 53, 6, 82, 56, 7, 105, 64, 16, 109, 59, 21, 75, 34, 9, 67, 33, 11, 80, 40, 14, 84, 42, 17, 86, 50, 15, 66, 33, 8, 75, 42, 18, 120, 70, 26, 129, 77, 34, 146, 99, 42, 112, 68, 28, 116, 77, 31, 113, 73, 30, 126, 79, 32, 120, 75, 29, 109, 62, 17, 160, 105, 39, 162, 100, 36, 165, 107, 48, 141, 90, 40, 150, 97, 40, 129, 83, 37, 113, 62, 19, 153, 96, 39, 181, 119, 48, 176, 115, 46, 173, 122, 58, 116, 72, 31, 103, 57, 23, 117, 70, 30, 117, 67, 21, 167, 109, 42, 155, 92, 29, 157, 94, 31, 165, 103, 38, 166, 100, 31, 165, + 107, 38, 180, 121, 50, 165, 102, 40, 178, 119, 47, 164, 98, 32, 156, 91, 31, 166, 104, 39, 175, 107, 38, 183, 117, 43, 172, 106, 39, 175, 100, 27, 192, 122, 45, 203, 130, 49, 202, 129, 48, 196, 122, 45, 200, 123, 41, 201, 120, 37, 210, 128, 42, 204, 120, 37, 206, 127, 44, 205, 127, 44, 194, 113, 36, 186, 103, 24, 183, 97, 19, 197, 119, 39, 204, 131, 50, 198, 125, 48, 194, 123, 47, 193, 123, 47, 185, 115, 43, 174, 108, 40, 170, 102, 35, 182, 110, 41, 169, 99, 32, 181, 115, 48, 179, 110, 40, 181, 116, 42, 163, 97, 30, 141, 76, 16, 173, 102, 29, 190, 122, 44, 177, 109, 37, 166, 97, 28, 181, 109, 33, 171, 102, 30, 170, 103, 34, 161, 94, 32, 186, 137, 72, 219, 163, 84, 229, 169, 84, 239, 177, 91, 240, 179, 92, 240, 172, 85, 235, 165, + 76, 226, 153, 66, 223, 147, 62, 220, 142, 58, 222, 148, 68, 220, 143, 62, 220, 142, 60, 218, 136, 51, 212, 129, 46, 208, 125, 46, 206, 126, 47, 203, 123, 44, 198, 122, 48, 199, 122, 48, 176, 108, 36, 170, 101, 28, 179, 110, 42, 177, 103, 28, 178, 100, 23, 189, 112, 36, 197, 123, 43, 213, 145, 64, 217, 157, 78, 211, 151, 76, 205, 146, 71, 209, 150, 75, 203, 151, 80, 183, 136, 74, 135, 96, 52, 113, 72, 36, 126, 80, 35, 120, 67, 31, 94, 49, 18, 108, 60, 22, 124, 73, 27, 121, 74, 30, 97, 62, 21, 95, 66, 22, 95, 64, 20, 90, 60, 20, 73, 51, 25, 55, 44, 17, 62, 48, 21, 67, 47, 10, 86, 78, 36, 30, 34, 3, 20, 30, 2, 23, 38, 14, 29, 45, 12, 39, 52, 0, 65, 71, 4, 98, 88, 5, 128, 109, 40, 132, 116, 59, + 8, 25, 0, 20, 32, 0, 20, 33, 0, 28, 36, 0, 41, 51, 1, 25, 41, 0, 21, 37, 0, 33, 51, 1, 50, 60, 2, 51, 54, 0, 29, 35, 0, 20, 25, 0, 39, 33, 8, 50, 39, 3, 79, 54, 15, 104, 52, 16, 58, 21, 3, 51, 23, 5, 76, 39, 14, 78, 38, 13, 96, 54, 19, 68, 33, 4, 66, 33, 10, 93, 53, 22, 99, 52, 16, 161, 104, 43, 144, 94, 40, 99, 61, 25, 109, 71, 30, 111, 70, 28, 120, 78, 32, 86, 48, 13, 111, 64, 16, 137, 84, 27, 172, 114, 43, 167, 113, 51, 151, 98, 42, 149, 102, 46, 102, 59, 13, 104, 56, 15, 140, 86, 28, 180, 120, 48, 169, 108, 43, 167, 116, 57, 103, 62, 24, 106, 62, 25, 94, 51, 14, 75, 35, 9, 118, 66, 24, 164, 104, 33, 156, 96, 37, 143, 86, 33, 136, 72, 21, 162, + 105, 44, 175, 113, 48, 170, 113, 46, 154, 91, 32, 130, 73, 21, 120, 58, 11, 122, 65, 19, 171, 107, 39, 172, 103, 32, 160, 92, 30, 164, 90, 25, 196, 124, 47, 190, 114, 38, 190, 110, 29, 197, 124, 43, 207, 125, 42, 194, 103, 18, 197, 103, 20, 209, 122, 38, 211, 130, 45, 218, 137, 51, 214, 135, 49, 194, 109, 27, 169, 88, 12, 188, 107, 29, 193, 117, 35, 197, 123, 45, 203, 132, 52, 199, 131, 53, 196, 128, 54, 199, 135, 62, 190, 123, 54, 170, 102, 33, 167, 99, 34, 175, 110, 44, 170, 99, 28, 186, 118, 39, 178, 105, 32, 161, 84, 19, 176, 106, 32, 180, 111, 37, 189, 122, 47, 165, 95, 27, 170, 100, 28, 173, 105, 32, 170, 102, 33, 170, 114, 52, 198, 150, 82, 224, 169, 93, 238, 177, 98, 241, 177, 97, 246, 188, 100, 242, 182, 96, 235, 169, + 85, 233, 160, 74, 229, 153, 65, 225, 150, 65, 226, 155, 73, 227, 151, 66, 222, 145, 65, 220, 146, 63, 216, 140, 56, 217, 136, 56, 210, 128, 48, 210, 130, 51, 203, 131, 53, 204, 132, 56, 184, 119, 51, 195, 129, 59, 175, 111, 41, 185, 121, 49, 187, 118, 42, 199, 132, 55, 197, 126, 47, 201, 129, 48, 211, 147, 69, 213, 156, 80, 212, 153, 77, 211, 155, 82, 206, 156, 87, 188, 143, 84, 143, 106, 62, 84, 52, 21, 94, 59, 25, 113, 66, 35, 88, 46, 19, 93, 54, 23, 114, 74, 36, 98, 55, 23, 103, 66, 24, 84, 65, 19, 76, 57, 14, 94, 69, 20, 85, 63, 25, 67, 43, 14, 67, 47, 14, 59, 41, 6, 91, 77, 31, 66, 63, 19, 25, 33, 0, 24, 38, 2, 18, 29, 0, 36, 37, 0, 66, 62, 0, 89, 83, 12, 114, 104, 38, 123, 111, 54, + 7, 21, 0, 26, 42, 3, 33, 50, 0, 24, 31, 0, 20, 29, 0, 10, 23, 0, 8, 20, 0, 15, 28, 1, 27, 44, 1, 21, 39, 0, 11, 20, 0, 13, 18, 0, 34, 32, 3, 86, 64, 16, 97, 57, 13, 74, 33, 4, 56, 25, 9, 65, 36, 13, 77, 36, 11, 83, 44, 14, 88, 47, 17, 63, 29, 11, 66, 34, 12, 74, 34, 9, 118, 66, 25, 168, 112, 48, 126, 83, 34, 104, 59, 22, 106, 64, 24, 120, 78, 36, 106, 65, 26, 88, 51, 18, 96, 51, 13, 117, 64, 18, 147, 90, 33, 151, 96, 39, 156, 100, 37, 138, 93, 41, 98, 55, 15, 104, 55, 14, 128, 79, 25, 169, 105, 40, 173, 116, 47, 168, 120, 57, 104, 61, 22, 105, 61, 21, 115, 69, 21, 74, 31, 1, 72, 26, 4, 102, 49, 11, 159, 92, 31, 119, 61, 11, 121, 67, 25, 110, + 59, 20, 121, 68, 25, 160, 100, 35, 152, 89, 29, 144, 78, 24, 130, 63, 11, 135, 82, 30, 174, 111, 46, 153, 81, 24, 163, 91, 26, 170, 96, 26, 183, 108, 34, 184, 105, 28, 180, 103, 28, 197, 124, 45, 204, 118, 35, 203, 109, 22, 205, 110, 22, 205, 107, 17, 213, 118, 30, 213, 126, 37, 213, 126, 40, 214, 130, 48, 200, 126, 47, 188, 117, 42, 196, 136, 62, 200, 145, 74, 203, 144, 72, 202, 136, 61, 200, 134, 60, 198, 127, 51, 200, 133, 55, 184, 118, 44, 181, 115, 45, 159, 93, 27, 159, 88, 21, 170, 98, 27, 179, 109, 38, 165, 92, 24, 172, 103, 33, 179, 110, 37, 182, 118, 44, 172, 106, 38, 162, 92, 24, 158, 90, 23, 156, 97, 29, 190, 145, 83, 203, 152, 83, 225, 171, 91, 238, 180, 96, 237, 173, 92, 243, 184, 101, 242, 184, 101, 240, 171, + 84, 239, 172, 86, 235, 161, 76, 230, 155, 69, 229, 156, 74, 226, 151, 68, 223, 149, 64, 222, 145, 66, 221, 142, 61, 212, 132, 50, 211, 132, 53, 212, 136, 57, 206, 132, 53, 202, 126, 46, 194, 127, 51, 210, 151, 77, 183, 122, 51, 183, 119, 48, 189, 121, 44, 206, 143, 69, 210, 146, 74, 209, 141, 59, 216, 154, 76, 211, 153, 76, 216, 160, 86, 217, 161, 89, 214, 166, 97, 196, 154, 92, 130, 97, 65, 78, 53, 23, 95, 60, 30, 100, 59, 26, 113, 74, 43, 93, 59, 28, 99, 66, 31, 111, 82, 49, 97, 76, 50, 76, 64, 41, 97, 71, 34, 86, 66, 28, 63, 49, 10, 61, 46, 9, 73, 54, 19, 81, 62, 21, 58, 44, 6, 77, 67, 28, 36, 43, 4, 32, 46, 0, 34, 45, 1, 56, 49, 0, 93, 76, 3, 98, 90, 22, 105, 94, 37, 135, 120, 66, + 9, 22, 0, 30, 45, 3, 38, 56, 0, 16, 24, 0, 4, 10, 0, 10, 20, 0, 14, 26, 0, 13, 23, 0, 23, 42, 2, 25, 46, 0, 23, 27, 0, 19, 19, 3, 79, 56, 17, 85, 51, 13, 74, 35, 7, 68, 32, 5, 64, 34, 10, 73, 41, 10, 76, 34, 9, 93, 53, 22, 78, 40, 18, 54, 19, 3, 47, 21, 7, 87, 48, 20, 138, 82, 31, 137, 87, 32, 93, 52, 17, 104, 60, 24, 117, 73, 31, 108, 68, 27, 101, 62, 28, 75, 42, 12, 86, 45, 12, 95, 55, 14, 130, 74, 26, 145, 89, 36, 150, 95, 40, 119, 72, 28, 97, 55, 18, 96, 56, 16, 96, 53, 15, 157, 95, 32, 182, 123, 60, 176, 125, 59, 112, 64, 22, 94, 51, 16, 130, 76, 25, 108, 60, 16, 81, 35, 3, 76, 30, 1, 102, 44, 8, 146, 82, 27, 130, 78, 27, 116, + 71, 28, 90, 44, 11, 110, 57, 18, 168, 104, 35, 139, 76, 17, 128, 65, 13, 139, 83, 31, 172, 107, 40, 175, 105, 30, 172, 93, 19, 182, 102, 29, 187, 108, 38, 177, 95, 19, 183, 108, 33, 188, 104, 26, 200, 107, 22, 204, 103, 17, 198, 94, 7, 202, 97, 8, 209, 115, 24, 211, 121, 32, 204, 117, 30, 201, 116, 33, 199, 125, 48, 197, 135, 61, 203, 146, 72, 199, 145, 78, 198, 147, 82, 203, 150, 84, 197, 135, 64, 185, 115, 39, 199, 128, 51, 197, 131, 56, 180, 112, 43, 173, 104, 37, 159, 91, 23, 161, 90, 20, 171, 101, 34, 167, 96, 27, 168, 98, 27, 176, 107, 35, 180, 114, 42, 168, 102, 36, 153, 88, 22, 160, 92, 26, 168, 117, 49, 213, 168, 98, 227, 177, 105, 228, 172, 93, 237, 177, 95, 241, 179, 96, 242, 179, 96, 241, 179, 97, 244, 180, + 93, 241, 174, 89, 239, 171, 83, 236, 166, 80, 234, 163, 81, 228, 153, 69, 226, 147, 60, 219, 139, 57, 220, 139, 58, 221, 143, 63, 217, 136, 55, 216, 141, 58, 209, 134, 53, 202, 134, 59, 202, 129, 51, 198, 131, 50, 190, 127, 51, 188, 128, 59, 186, 121, 48, 193, 135, 62, 210, 148, 74, 211, 145, 67, 211, 148, 70, 218, 163, 90, 217, 162, 90, 221, 171, 99, 227, 179, 111, 208, 164, 101, 129, 94, 59, 73, 51, 30, 33, 14, 1, 95, 62, 30, 133, 96, 53, 93, 63, 33, 82, 59, 36, 91, 68, 45, 99, 96, 85, 78, 89, 90, 61, 67, 59, 66, 54, 35, 79, 65, 35, 48, 42, 9, 72, 56, 16, 92, 73, 39, 45, 40, 8, 28, 24, 1, 38, 42, 12, 39, 48, 4, 39, 47, 0, 74, 65, 0, 106, 87, 7, 103, 92, 20, 94, 88, 41, 142, 126, 78, + 13, 26, 1, 28, 40, 2, 29, 46, 0, 14, 23, 0, 5, 11, 0, 23, 27, 1, 32, 41, 0, 22, 30, 0, 25, 39, 2, 28, 40, 2, 20, 26, 0, 40, 34, 5, 74, 50, 13, 77, 42, 6, 65, 31, 3, 61, 36, 7, 69, 44, 10, 73, 40, 10, 84, 45, 15, 97, 55, 15, 62, 27, 7, 45, 16, 0, 47, 25, 11, 100, 59, 27, 140, 88, 32, 97, 54, 16, 82, 46, 17, 100, 57, 21, 104, 58, 21, 96, 62, 31, 84, 51, 22, 67, 36, 9, 85, 46, 13, 108, 57, 18, 120, 72, 25, 136, 82, 28, 128, 75, 27, 114, 63, 18, 100, 58, 12, 98, 59, 27, 74, 43, 9, 156, 95, 42, 172, 116, 53, 173, 124, 62, 115, 60, 26, 87, 46, 11, 126, 73, 28, 132, 82, 31, 102, 54, 11, 79, 32, 5, 111, 54, 11, 125, 63, 12, 133, 69, 18, 161, + 100, 35, 139, 80, 22, 143, 74, 16, 148, 76, 16, 172, 96, 29, 157, 89, 22, 155, 84, 23, 202, 136, 55, 201, 127, 45, 187, 102, 20, 179, 94, 17, 188, 108, 29, 175, 93, 20, 178, 102, 29, 190, 106, 29, 193, 93, 13, 201, 108, 22, 204, 107, 21, 204, 105, 16, 204, 108, 20, 196, 108, 26, 179, 93, 15, 179, 94, 17, 179, 100, 21, 195, 122, 43, 201, 131, 53, 200, 138, 65, 199, 142, 70, 201, 150, 79, 202, 153, 85, 205, 144, 72, 194, 129, 56, 197, 129, 57, 198, 136, 61, 179, 116, 43, 164, 96, 28, 160, 92, 28, 158, 89, 24, 156, 86, 23, 166, 94, 27, 163, 92, 21, 174, 108, 36, 165, 99, 31, 154, 92, 28, 167, 117, 53, 217, 170, 98, 223, 171, 97, 215, 158, 84, 224, 164, 86, 233, 172, 94, 240, 176, 93, 235, 173, 90, 241, 177, 93, 236, 170, + 86, 238, 172, 87, 238, 171, 85, 234, 166, 78, 237, 164, 80, 232, 160, 77, 225, 147, 61, 223, 140, 54, 222, 142, 60, 228, 155, 72, 225, 150, 68, 216, 145, 63, 215, 144, 60, 210, 141, 66, 206, 133, 57, 201, 131, 49, 197, 132, 55, 194, 134, 67, 194, 135, 67, 190, 128, 57, 207, 149, 76, 209, 148, 73, 213, 154, 80, 217, 167, 96, 215, 163, 90, 221, 172, 102, 225, 179, 115, 206, 160, 95, 146, 111, 69, 81, 59, 34, 39, 23, 8, 88, 59, 27, 122, 83, 40, 115, 82, 46, 85, 66, 42, 66, 57, 46, 82, 79, 76, 83, 96, 95, 62, 88, 102, 54, 66, 65, 64, 62, 46, 21, 28, 13, 35, 33, 7, 73, 63, 15, 56, 53, 6, 32, 38, 5, 20, 22, 0, 33, 36, 5, 35, 37, 1, 71, 57, 0, 98, 85, 15, 80, 81, 19, 72, 65, 11, 131, 111, 65, + 19, 35, 1, 22, 38, 0, 20, 36, 0, 9, 18, 0, 8, 16, 0, 24, 31, 0, 33, 37, 0, 22, 31, 0, 22, 34, 0, 30, 38, 0, 37, 35, 2, 51, 33, 4, 51, 28, 2, 58, 34, 5, 58, 39, 5, 73, 47, 13, 65, 40, 10, 47, 27, 6, 89, 49, 18, 95, 49, 15, 61, 25, 6, 55, 27, 13, 55, 29, 15, 111, 65, 28, 120, 70, 27, 86, 43, 12, 79, 45, 17, 98, 57, 22, 106, 61, 25, 97, 61, 28, 77, 46, 18, 70, 35, 9, 77, 38, 12, 98, 51, 13, 103, 52, 14, 134, 78, 25, 133, 82, 31, 104, 58, 17, 89, 50, 17, 96, 54, 24, 93, 55, 14, 160, 103, 45, 166, 110, 50, 168, 114, 52, 134, 80, 32, 93, 51, 18, 97, 52, 18, 148, 93, 33, 128, 71, 18, 107, 59, 15, 129, 74, 23, 137, 68, 11, 142, 75, 16, 123, + 58, 7, 142, 66, 9, 176, 93, 17, 168, 88, 14, 165, 90, 18, 134, 66, 11, 153, 81, 15, 188, 110, 32, 198, 118, 39, 189, 105, 26, 186, 99, 21, 192, 105, 21, 184, 101, 25, 190, 110, 27, 203, 117, 31, 205, 112, 25, 199, 112, 25, 202, 119, 36, 209, 130, 49, 205, 132, 53, 201, 133, 61, 194, 121, 46, 184, 110, 31, 191, 113, 33, 198, 123, 42, 203, 129, 52, 206, 139, 59, 206, 141, 65, 200, 134, 57, 193, 131, 60, 199, 144, 76, 202, 145, 73, 193, 130, 60, 191, 131, 58, 201, 143, 68, 187, 127, 55, 162, 94, 28, 166, 97, 30, 156, 87, 24, 151, 85, 20, 161, 93, 23, 172, 109, 37, 167, 107, 41, 167, 125, 67, 207, 160, 89, 215, 162, 92, 219, 159, 83, 218, 155, 78, 219, 156, 76, 226, 159, 80, 224, 155, 75, 231, 161, 77, 234, 167, 82, 234, 167, + 80, 231, 164, 81, 234, 165, 83, 237, 168, 85, 233, 160, 78, 232, 162, 78, 229, 152, 67, 222, 141, 58, 223, 144, 61, 228, 153, 69, 226, 154, 70, 220, 149, 66, 221, 153, 72, 210, 142, 64, 207, 136, 57, 208, 140, 62, 199, 138, 62, 196, 140, 72, 197, 143, 75, 185, 127, 60, 205, 149, 77, 211, 154, 80, 215, 164, 91, 213, 163, 94, 215, 159, 87, 219, 170, 102, 219, 175, 107, 195, 145, 79, 169, 131, 78, 72, 50, 24, 24, 11, 0, 67, 45, 14, 102, 67, 32, 110, 80, 42, 92, 77, 48, 72, 73, 68, 91, 101, 106, 85, 104, 106, 78, 100, 99, 50, 78, 80, 51, 57, 42, 29, 34, 19, 30, 33, 6, 62, 60, 0, 79, 87, 5, 65, 74, 9, 26, 33, 5, 9, 16, 3, 19, 21, 0, 62, 48, 0, 90, 82, 18, 77, 82, 31, 48, 45, 4, 88, 67, 26, + 16, 30, 1, 17, 33, 0, 15, 31, 0, 8, 22, 0, 17, 27, 0, 26, 34, 0, 24, 30, 0, 21, 33, 1, 14, 29, 0, 20, 26, 0, 27, 26, 2, 35, 29, 0, 41, 27, 0, 65, 48, 15, 89, 71, 27, 72, 53, 19, 50, 30, 7, 46, 28, 10, 91, 52, 16, 68, 29, 5, 59, 23, 7, 55, 24, 11, 70, 39, 19, 92, 55, 24, 104, 56, 18, 90, 49, 22, 95, 51, 18, 124, 78, 34, 93, 52, 19, 115, 76, 35, 81, 47, 13, 80, 40, 11, 68, 33, 8, 73, 37, 9, 96, 49, 17, 131, 79, 27, 109, 55, 12, 113, 64, 22, 73, 34, 7, 72, 35, 8, 101, 62, 23, 157, 97, 43, 167, 114, 50, 162, 109, 54, 169, 111, 50, 111, 67, 22, 109, 61, 23, 141, 84, 25, 143, 82, 20, 139, 78, 17, 133, 78, 26, 133, 65, 14, 129, 64, 14, 133, + 64, 11, 150, 78, 17, 156, 78, 9, 162, 83, 13, 145, 71, 12, 144, 78, 17, 174, 101, 26, 182, 109, 31, 192, 122, 46, 198, 125, 44, 183, 101, 23, 186, 104, 26, 192, 109, 26, 196, 116, 28, 211, 134, 45, 200, 119, 36, 200, 125, 45, 190, 117, 38, 184, 107, 30, 193, 127, 51, 206, 151, 84, 210, 154, 84, 200, 148, 78, 204, 153, 82, 204, 145, 73, 204, 134, 58, 208, 136, 53, 201, 129, 49, 202, 129, 45, 200, 131, 53, 190, 122, 47, 198, 139, 66, 199, 141, 70, 184, 128, 59, 173, 122, 60, 197, 145, 72, 181, 122, 57, 160, 93, 28, 158, 90, 24, 159, 94, 27, 158, 96, 28, 173, 111, 42, 180, 130, 67, 205, 154, 81, 206, 147, 71, 211, 151, 76, 225, 161, 86, 225, 160, 79, 224, 157, 75, 224, 160, 77, 226, 156, 74, 230, 160, 75, 229, 157, 72, 225, 147, + 63, 223, 147, 63, 229, 159, 77, 231, 157, 77, 231, 155, 78, 226, 155, 74, 227, 153, 71, 225, 146, 62, 230, 154, 67, 231, 156, 69, 228, 159, 71, 224, 158, 74, 226, 163, 86, 218, 154, 72, 213, 143, 63, 207, 140, 62, 202, 143, 65, 201, 147, 79, 191, 139, 72, 188, 135, 65, 204, 155, 86, 203, 148, 79, 212, 160, 94, 210, 160, 91, 202, 143, 69, 205, 155, 84, 204, 157, 87, 196, 147, 75, 161, 121, 70, 67, 46, 24, 16, 9, 1, 53, 34, 9, 110, 79, 35, 107, 78, 34, 102, 78, 32, 73, 72, 58, 91, 95, 91, 77, 88, 72, 58, 77, 46, 53, 78, 63, 46, 53, 26, 35, 41, 15, 33, 36, 6, 54, 62, 10, 95, 111, 21, 100, 115, 20, 63, 73, 12, 17, 21, 3, 26, 24, 0, 58, 50, 0, 91, 83, 10, 80, 81, 19, 50, 50, 6, 53, 36, 0, + 10, 19, 1, 19, 31, 0, 18, 30, 3, 11, 25, 5, 13, 26, 1, 17, 26, 0, 21, 28, 1, 26, 33, 0, 25, 29, 0, 33, 35, 1, 34, 32, 0, 60, 53, 11, 83, 66, 14, 96, 78, 13, 73, 59, 9, 59, 42, 3, 34, 22, 2, 53, 32, 10, 74, 41, 12, 73, 31, 7, 62, 26, 10, 49, 24, 12, 56, 29, 13, 71, 39, 17, 87, 44, 17, 67, 31, 12, 105, 62, 27, 124, 75, 33, 93, 55, 20, 99, 55, 23, 82, 42, 11, 68, 30, 6, 75, 35, 7, 67, 27, 4, 88, 44, 19, 123, 66, 25, 123, 62, 21, 112, 62, 18, 72, 35, 14, 76, 33, 8, 118, 68, 28, 133, 81, 32, 158, 105, 47, 159, 102, 46, 145, 88, 34, 142, 92, 37, 115, 65, 21, 120, 62, 11, 138, 75, 17, 154, 89, 25, 176, 106, 31, 135, 72, 10, 89, 36, 3, 111, + 51, 6, 124, 62, 11, 126, 60, 9, 125, 58, 7, 145, 78, 16, 155, 90, 21, 177, 105, 33, 185, 120, 48, 192, 127, 52, 193, 125, 47, 187, 115, 36, 183, 108, 30, 192, 117, 37, 192, 115, 36, 182, 109, 31, 173, 100, 28, 172, 95, 21, 184, 109, 32, 191, 119, 40, 190, 124, 46, 175, 112, 47, 176, 113, 46, 164, 99, 37, 176, 115, 50, 183, 128, 65, 189, 138, 70, 203, 140, 64, 206, 137, 58, 198, 130, 50, 200, 133, 57, 201, 136, 58, 197, 133, 54, 194, 133, 60, 192, 141, 73, 168, 124, 67, 141, 91, 42, 173, 120, 56, 159, 100, 37, 144, 79, 18, 149, 84, 21, 150, 90, 27, 179, 128, 63, 198, 143, 69, 209, 148, 70, 213, 143, 61, 213, 139, 55, 219, 151, 69, 223, 156, 76, 222, 150, 69, 215, 139, 53, 223, 154, 70, 230, 160, 77, 224, 152, 72, 215, 136, + 53, 209, 127, 45, 217, 143, 68, 223, 148, 72, 226, 150, 69, 221, 145, 65, 227, 155, 74, 233, 157, 73, 232, 156, 71, 232, 160, 73, 231, 162, 74, 227, 160, 80, 226, 165, 89, 221, 155, 76, 221, 154, 76, 205, 146, 66, 200, 148, 77, 195, 145, 80, 182, 134, 72, 183, 135, 68, 194, 145, 79, 191, 143, 73, 201, 154, 88, 199, 144, 71, 197, 142, 63, 191, 140, 71, 193, 151, 85, 181, 134, 63, 145, 108, 64, 74, 51, 26, 37, 25, 11, 49, 32, 11, 96, 71, 27, 96, 76, 30, 89, 71, 19, 88, 73, 26, 63, 57, 33, 72, 75, 42, 65, 73, 13, 57, 71, 7, 61, 70, 10, 54, 61, 26, 43, 51, 31, 48, 64, 50, 84, 95, 8, 108, 123, 18, 90, 105, 16, 49, 56, 7, 47, 40, 0, 72, 61, 0, 85, 76, 4, 91, 86, 15, 71, 65, 7, 41, 34, 0, + 12, 17, 2, 26, 38, 6, 22, 37, 12, 13, 28, 14, 18, 30, 1, 22, 32, 0, 21, 29, 1, 28, 34, 0, 33, 35, 1, 76, 72, 23, 104, 99, 59, 95, 83, 31, 74, 61, 7, 40, 34, 0, 37, 33, 1, 40, 29, 1, 32, 23, 3, 65, 37, 14, 76, 41, 17, 83, 41, 14, 53, 22, 5, 37, 15, 6, 59, 30, 14, 57, 27, 11, 78, 39, 15, 82, 42, 17, 94, 53, 22, 110, 68, 30, 71, 34, 6, 95, 47, 17, 78, 38, 10, 77, 36, 8, 77, 37, 10, 64, 26, 5, 81, 44, 16, 109, 58, 21, 113, 58, 20, 115, 64, 23, 75, 37, 8, 80, 37, 8, 106, 53, 15, 127, 76, 36, 163, 109, 51, 160, 100, 45, 143, 83, 31, 143, 83, 34, 132, 73, 21, 120, 64, 12, 116, 59, 10, 142, 75, 16, 159, 85, 19, 155, 86, 20, 74, 27, 1, 74, + 29, 1, 103, 51, 6, 100, 49, 7, 146, 82, 21, 165, 98, 30, 161, 99, 31, 176, 114, 40, 186, 130, 56, 195, 134, 59, 193, 127, 49, 205, 134, 55, 202, 128, 51, 204, 135, 55, 186, 115, 36, 169, 98, 25, 171, 102, 30, 176, 105, 32, 195, 127, 50, 202, 137, 60, 203, 138, 59, 178, 108, 38, 181, 111, 37, 172, 101, 30, 171, 105, 34, 182, 123, 54, 190, 141, 76, 194, 144, 74, 210, 153, 77, 205, 140, 64, 200, 137, 60, 196, 137, 64, 198, 141, 68, 202, 142, 67, 185, 132, 61, 183, 135, 69, 177, 134, 73, 133, 86, 40, 138, 87, 36, 141, 82, 21, 136, 76, 14, 158, 105, 42, 194, 142, 72, 205, 142, 65, 210, 146, 64, 216, 146, 64, 215, 141, 58, 225, 158, 74, 227, 161, 82, 219, 151, 71, 220, 150, 68, 223, 153, 71, 221, 148, 71, 221, 150, 71, 216, 139, + 62, 211, 130, 49, 210, 131, 51, 214, 136, 56, 221, 143, 62, 224, 148, 69, 230, 160, 77, 234, 160, 75, 229, 156, 73, 232, 160, 74, 232, 161, 75, 229, 169, 89, 226, 166, 84, 226, 166, 85, 219, 162, 88, 213, 163, 91, 191, 143, 76, 176, 130, 69, 177, 136, 76, 184, 144, 82, 175, 125, 59, 180, 132, 66, 192, 143, 78, 187, 131, 59, 182, 126, 52, 187, 143, 76, 184, 140, 76, 171, 124, 58, 139, 99, 52, 72, 51, 26, 32, 23, 6, 62, 42, 18, 85, 64, 23, 88, 72, 24, 63, 52, 7, 66, 56, 7, 53, 52, 9, 66, 63, 27, 64, 67, 13, 64, 77, 5, 63, 77, 10, 56, 74, 37, 35, 50, 32, 24, 31, 5, 41, 48, 0, 83, 96, 0, 101, 117, 10, 99, 104, 14, 86, 79, 9, 81, 68, 4, 69, 63, 0, 95, 90, 14, 79, 74, 14, 43, 35, 1, + 7, 13, 0, 20, 30, 4, 16, 33, 7, 12, 23, 11, 31, 41, 2, 51, 61, 6, 26, 34, 0, 25, 28, 2, 67, 63, 22, 119, 107, 64, 100, 89, 44, 47, 43, 1, 29, 28, 0, 25, 29, 0, 31, 31, 3, 29, 25, 5, 56, 44, 24, 73, 48, 25, 82, 49, 22, 76, 39, 18, 47, 23, 9, 43, 20, 8, 56, 27, 12, 73, 42, 23, 62, 30, 12, 95, 49, 19, 89, 45, 16, 103, 63, 25, 66, 31, 8, 73, 33, 7, 74, 36, 10, 69, 29, 5, 63, 28, 7, 63, 24, 2, 75, 33, 10, 107, 56, 21, 108, 55, 18, 102, 54, 19, 78, 41, 10, 74, 31, 8, 102, 46, 13, 123, 67, 25, 154, 100, 46, 147, 99, 46, 151, 91, 38, 119, 64, 26, 121, 67, 24, 71, 32, 3, 112, 54, 10, 115, 55, 6, 134, 72, 12, 141, 74, 12, 121, 66, 13, 92, + 46, 7, 96, 47, 7, 70, 27, 0, 138, 82, 27, 169, 110, 43, 165, 107, 43, 175, 123, 56, 185, 128, 57, 195, 137, 63, 207, 144, 67, 204, 136, 56, 175, 101, 26, 179, 112, 38, 179, 117, 44, 190, 134, 61, 199, 139, 69, 188, 125, 51, 202, 139, 64, 206, 143, 67, 199, 132, 58, 193, 126, 52, 188, 122, 45, 189, 120, 44, 195, 130, 56, 197, 139, 62, 188, 133, 66, 195, 147, 78, 196, 147, 77, 214, 158, 84, 210, 151, 74, 191, 141, 73, 184, 137, 75, 199, 146, 75, 206, 154, 80, 189, 139, 69, 162, 112, 48, 179, 137, 72, 163, 121, 62, 147, 97, 37, 138, 86, 31, 186, 138, 69, 201, 143, 69, 212, 145, 65, 216, 147, 66, 215, 142, 61, 222, 152, 70, 228, 162, 83, 221, 154, 76, 217, 150, 71, 216, 151, 71, 222, 154, 76, 222, 153, 71, 221, 152, 74, 210, 136, + 56, 220, 142, 61, 215, 136, 56, 208, 126, 48, 212, 133, 55, 221, 143, 66, 224, 151, 69, 234, 166, 86, 239, 173, 87, 236, 169, 82, 235, 173, 87, 236, 176, 95, 232, 171, 92, 228, 168, 92, 218, 167, 99, 181, 136, 74, 146, 103, 46, 149, 112, 56, 156, 120, 60, 162, 118, 56, 159, 105, 38, 164, 115, 50, 165, 113, 49, 172, 117, 47, 173, 123, 54, 170, 128, 62, 169, 123, 58, 165, 119, 53, 142, 106, 56, 86, 61, 34, 47, 34, 12, 71, 52, 29, 72, 53, 11, 71, 61, 12, 51, 43, 0, 39, 37, 2, 30, 38, 0, 55, 55, 21, 50, 50, 13, 49, 55, 9, 54, 65, 7, 46, 62, 28, 29, 44, 15, 14, 34, 0, 21, 33, 0, 48, 59, 0, 97, 110, 8, 126, 131, 38, 124, 118, 33, 93, 78, 12, 75, 71, 0, 88, 93, 25, 76, 80, 20, 40, 34, 0, + 8, 18, 0, 10, 23, 0, 13, 22, 0, 15, 21, 8, 22, 26, 3, 57, 61, 18, 50, 59, 19, 42, 43, 15, 64, 56, 22, 36, 30, 2, 21, 25, 0, 19, 26, 1, 17, 22, 0, 26, 27, 5, 44, 41, 14, 53, 45, 17, 53, 33, 13, 88, 55, 25, 83, 45, 20, 78, 42, 12, 59, 28, 10, 41, 17, 4, 42, 19, 7, 62, 33, 16, 56, 25, 8, 95, 50, 21, 102, 58, 20, 89, 49, 13, 70, 31, 7, 64, 26, 4, 77, 38, 12, 74, 37, 12, 75, 36, 9, 63, 25, 2, 85, 39, 11, 106, 58, 21, 108, 60, 21, 95, 52, 17, 67, 31, 11, 82, 38, 10, 102, 54, 18, 106, 55, 18, 129, 82, 37, 142, 88, 41, 144, 84, 31, 111, 60, 18, 97, 45, 12, 55, 18, 2, 66, 23, 1, 88, 38, 5, 125, 64, 12, 139, 74, 17, 152, 93, 30, 157, + 99, 38, 142, 86, 29, 65, 25, 2, 155, 102, 46, 161, 108, 48, 156, 110, 48, 178, 124, 56, 186, 130, 58, 198, 140, 67, 203, 144, 67, 202, 138, 59, 203, 141, 61, 209, 153, 80, 217, 172, 102, 192, 146, 83, 219, 175, 109, 198, 147, 81, 201, 145, 77, 204, 144, 71, 203, 141, 67, 193, 131, 60, 195, 135, 60, 185, 121, 45, 198, 135, 58, 195, 138, 61, 195, 144, 76, 194, 148, 84, 185, 139, 76, 209, 159, 87, 214, 162, 88, 195, 147, 80, 168, 123, 67, 165, 119, 62, 208, 163, 93, 204, 161, 90, 181, 133, 65, 164, 113, 46, 178, 138, 76, 152, 112, 54, 171, 124, 59, 199, 145, 73, 210, 147, 71, 219, 153, 68, 219, 148, 67, 216, 144, 63, 221, 154, 74, 226, 160, 82, 218, 151, 72, 221, 157, 77, 223, 158, 79, 218, 150, 73, 211, 143, 67, 216, 146, 68, 222, 154, + 73, 217, 143, 64, 224, 149, 72, 225, 151, 72, 216, 138, 60, 210, 130, 49, 219, 141, 61, 226, 158, 75, 237, 171, 87, 238, 171, 87, 234, 170, 85, 234, 173, 89, 234, 176, 97, 223, 174, 106, 163, 121, 72, 91, 52, 16, 81, 46, 6, 121, 86, 40, 159, 121, 65, 161, 109, 41, 160, 110, 42, 163, 116, 51, 161, 109, 39, 163, 111, 43, 157, 115, 52, 163, 121, 57, 157, 113, 50, 168, 130, 66, 147, 109, 55, 102, 75, 43, 71, 54, 35, 68, 54, 26, 81, 69, 19, 61, 55, 4, 60, 52, 3, 29, 33, 6, 20, 31, 0, 33, 40, 3, 40, 41, 11, 39, 38, 0, 43, 45, 5, 36, 45, 15, 35, 50, 32, 29, 47, 12, 23, 37, 0, 33, 41, 0, 74, 86, 6, 110, 124, 40, 114, 119, 36, 89, 87, 12, 80, 85, 9, 80, 101, 26, 63, 87, 23, 50, 58, 17, + 17, 25, 3, 20, 27, 2, 13, 19, 2, 43, 47, 33, 66, 70, 50, 87, 90, 69, 67, 71, 24, 36, 35, 0, 6, 9, 0, 9, 16, 0, 7, 16, 0, 6, 15, 0, 14, 21, 2, 25, 25, 6, 27, 23, 4, 38, 29, 8, 55, 39, 18, 114, 72, 38, 85, 45, 19, 69, 32, 7, 72, 32, 10, 52, 22, 3, 44, 19, 7, 69, 30, 13, 63, 31, 14, 85, 45, 15, 102, 56, 22, 82, 41, 9, 68, 28, 5, 65, 27, 3, 65, 29, 8, 68, 34, 12, 57, 24, 5, 55, 18, 4, 83, 31, 6, 108, 56, 21, 113, 64, 26, 89, 44, 10, 71, 31, 6, 80, 38, 13, 85, 39, 12, 97, 46, 8, 124, 77, 39, 128, 80, 35, 145, 86, 33, 126, 70, 24, 110, 52, 15, 63, 21, 0, 55, 19, 2, 79, 36, 4, 110, 52, 9, 143, 83, 31, 137, 83, 29, 151, + 94, 31, 147, 93, 30, 61, 22, 1, 120, 73, 31, 130, 82, 28, 127, 82, 32, 156, 103, 46, 198, 148, 75, 189, 136, 61, 187, 130, 58, 177, 115, 40, 184, 122, 49, 168, 119, 60, 195, 151, 86, 195, 152, 88, 196, 153, 99, 176, 136, 83, 187, 139, 80, 204, 152, 81, 203, 151, 79, 196, 141, 71, 205, 153, 78, 198, 139, 63, 204, 144, 66, 199, 145, 70, 179, 129, 60, 168, 121, 57, 193, 155, 96, 177, 132, 69, 212, 166, 93, 212, 163, 89, 163, 118, 60, 124, 83, 37, 179, 136, 80, 214, 178, 111, 204, 156, 87, 203, 155, 81, 183, 139, 76, 178, 136, 71, 197, 147, 78, 205, 148, 71, 213, 150, 70, 214, 144, 63, 217, 143, 61, 221, 148, 65, 227, 160, 82, 220, 154, 75, 221, 153, 76, 220, 150, 72, 215, 146, 63, 218, 151, 71, 219, 153, 77, 222, 153, 77, 229, 162, + 89, 218, 151, 75, 217, 144, 71, 224, 151, 71, 221, 149, 70, 217, 142, 59, 225, 154, 72, 231, 159, 73, 230, 163, 78, 238, 175, 92, 238, 178, 93, 237, 175, 92, 230, 173, 93, 179, 141, 91, 79, 45, 10, 73, 39, 0, 89, 53, 9, 139, 100, 44, 141, 94, 39, 132, 81, 19, 150, 103, 42, 144, 94, 40, 132, 82, 25, 139, 95, 39, 141, 98, 40, 148, 104, 41, 155, 114, 52, 179, 140, 75, 152, 111, 57, 112, 82, 46, 96, 72, 45, 85, 68, 30, 70, 63, 9, 60, 62, 6, 52, 53, 5, 27, 37, 3, 16, 36, 0, 21, 39, 0, 43, 47, 9, 52, 52, 6, 63, 60, 15, 48, 49, 7, 34, 39, 12, 24, 36, 11, 22, 41, 0, 32, 47, 0, 51, 64, 0, 86, 97, 17, 86, 101, 20, 77, 87, 16, 70, 80, 10, 64, 85, 15, 49, 71, 12, 38, 47, 8, + 50, 55, 28, 38, 42, 15, 17, 24, 10, 30, 33, 17, 36, 36, 12, 23, 21, 3, 31, 35, 4, 25, 29, 0, 10, 11, 3, 10, 14, 2, 21, 27, 5, 39, 42, 15, 60, 58, 26, 71, 68, 37, 73, 63, 42, 69, 57, 36, 97, 74, 45, 100, 57, 24, 89, 47, 16, 65, 33, 7, 65, 28, 6, 40, 13, 1, 52, 23, 10, 58, 25, 7, 64, 32, 14, 88, 45, 13, 111, 67, 25, 74, 36, 11, 58, 22, 3, 51, 19, 4, 73, 32, 9, 45, 20, 5, 48, 17, 0, 54, 20, 2, 84, 38, 7, 108, 62, 25, 102, 54, 15, 72, 33, 6, 77, 35, 5, 92, 46, 16, 98, 50, 20, 81, 38, 11, 96, 54, 23, 132, 89, 43, 115, 60, 19, 94, 45, 13, 125, 74, 33, 80, 36, 9, 61, 20, 0, 78, 31, 2, 99, 47, 7, 84, 36, 3, 81, 38, 3, 91, + 45, 7, 90, 44, 8, 60, 21, 1, 74, 36, 9, 84, 40, 10, 82, 42, 9, 116, 72, 22, 170, 115, 45, 174, 124, 55, 145, 92, 34, 145, 86, 27, 156, 99, 31, 130, 79, 22, 153, 101, 41, 181, 140, 82, 206, 167, 103, 205, 165, 104, 180, 136, 81, 199, 158, 91, 214, 170, 99, 205, 154, 81, 204, 153, 81, 196, 142, 66, 203, 147, 70, 212, 165, 93, 202, 155, 87, 143, 99, 46, 177, 142, 89, 187, 150, 92, 198, 157, 89, 215, 170, 99, 192, 151, 84, 132, 90, 40, 125, 76, 36, 195, 158, 100, 175, 135, 79, 171, 123, 60, 182, 144, 80, 189, 145, 81, 204, 151, 79, 211, 146, 68, 213, 142, 61, 210, 133, 50, 210, 133, 49, 221, 150, 68, 221, 154, 74, 219, 152, 74, 220, 153, 74, 220, 151, 70, 218, 144, 62, 211, 142, 61, 208, 138, 59, 214, 146, 72, 214, 145, + 70, 214, 146, 71, 222, 156, 77, 226, 155, 75, 225, 158, 77, 221, 148, 69, 231, 161, 77, 234, 166, 81, 234, 167, 80, 234, 168, 83, 238, 181, 99, 235, 183, 102, 199, 152, 89, 91, 51, 20, 82, 44, 1, 87, 47, 1, 115, 69, 15, 132, 84, 28, 106, 56, 12, 99, 48, 4, 86, 40, 4, 76, 38, 4, 91, 54, 12, 104, 64, 20, 120, 74, 20, 141, 96, 36, 163, 121, 60, 178, 134, 72, 160, 115, 56, 129, 97, 59, 108, 83, 52, 78, 65, 27, 51, 48, 4, 54, 60, 14, 41, 47, 9, 27, 39, 1, 19, 41, 0, 22, 40, 0, 38, 39, 0, 58, 56, 15, 75, 74, 43, 70, 68, 36, 47, 49, 5, 34, 39, 3, 21, 30, 5, 19, 31, 1, 34, 43, 1, 53, 59, 5, 47, 53, 6, 38, 42, 2, 49, 50, 2, 50, 59, 9, 27, 33, 5, 16, 22, 2, + 30, 33, 5, 22, 23, 1, 23, 27, 3, 45, 49, 19, 45, 52, 24, 24, 26, 5, 42, 42, 10, 60, 59, 17, 45, 46, 17, 35, 40, 11, 52, 53, 16, 63, 58, 15, 71, 60, 15, 71, 57, 10, 79, 55, 13, 65, 48, 13, 89, 58, 29, 91, 47, 21, 87, 51, 21, 62, 30, 4, 61, 24, 5, 38, 16, 0, 54, 23, 7, 45, 18, 4, 73, 37, 15, 89, 43, 15, 103, 63, 19, 66, 31, 7, 52, 19, 3, 53, 21, 5, 83, 38, 13, 45, 20, 5, 49, 20, 6, 63, 28, 4, 70, 28, 6, 113, 65, 30, 124, 72, 28, 66, 28, 5, 68, 30, 4, 97, 47, 16, 86, 42, 7, 91, 45, 13, 76, 42, 9, 105, 64, 32, 111, 62, 22, 65, 32, 11, 110, 70, 39, 77, 38, 9, 42, 14, 0, 42, 13, 1, 50, 17, 0, 53, 23, 0, 43, 13, 0, 37, + 10, 0, 22, 7, 0, 36, 11, 0, 52, 20, 1, 60, 23, 1, 60, 25, 1, 81, 39, 5, 129, 78, 28, 129, 81, 29, 118, 72, 22, 121, 66, 14, 154, 98, 34, 147, 95, 35, 152, 101, 42, 135, 93, 42, 169, 130, 76, 190, 150, 92, 196, 157, 97, 189, 152, 93, 208, 168, 104, 209, 163, 97, 209, 166, 96, 192, 140, 71, 198, 148, 75, 211, 168, 99, 196, 154, 88, 146, 101, 49, 154, 115, 66, 185, 149, 91, 169, 128, 68, 209, 170, 101, 204, 165, 101, 160, 121, 64, 124, 80, 34, 162, 120, 67, 158, 127, 77, 101, 58, 23, 181, 141, 82, 197, 152, 84, 209, 147, 68, 210, 138, 58, 204, 124, 42, 199, 111, 29, 205, 123, 41, 210, 137, 56, 212, 144, 67, 215, 149, 73, 216, 148, 68, 214, 146, 67, 209, 140, 61, 212, 146, 68, 215, 145, 74, 213, 142, 65, 211, 135, + 56, 213, 139, 63, 218, 151, 75, 224, 157, 81, 225, 156, 78, 224, 157, 77, 230, 164, 83, 240, 175, 91, 239, 177, 91, 236, 173, 87, 234, 181, 96, 224, 178, 111, 208, 173, 115, 99, 58, 21, 95, 52, 5, 97, 52, 5, 74, 37, 6, 43, 20, 4, 27, 13, 2, 51, 26, 9, 41, 18, 2, 44, 19, 0, 62, 32, 0, 104, 66, 15, 117, 76, 24, 144, 103, 45, 171, 130, 67, 173, 128, 68, 152, 108, 50, 135, 103, 62, 106, 82, 50, 98, 80, 40, 58, 52, 8, 48, 54, 11, 35, 47, 12, 25, 40, 0, 24, 46, 0, 25, 37, 1, 37, 37, 0, 63, 58, 11, 80, 69, 21, 81, 70, 13, 71, 63, 2, 62, 59, 11, 46, 50, 27, 25, 29, 9, 46, 43, 0, 72, 66, 4, 65, 61, 13, 48, 48, 19, 84, 83, 35, 96, 98, 40, 41, 39, 8, 22, 25, 0, + 39, 41, 7, 29, 31, 3, 39, 40, 9, 52, 53, 12, 74, 75, 16, 82, 83, 26, 81, 75, 20, 64, 58, 5, 49, 44, 4, 25, 31, 0, 26, 34, 5, 19, 19, 1, 35, 22, 4, 55, 38, 9, 65, 45, 7, 63, 47, 15, 82, 48, 23, 75, 35, 14, 82, 50, 20, 47, 24, 2, 52, 21, 5, 57, 24, 5, 43, 14, 2, 47, 16, 4, 71, 34, 12, 94, 47, 17, 71, 33, 8, 67, 28, 6, 58, 23, 3, 62, 28, 7, 75, 33, 8, 57, 27, 6, 43, 23, 4, 66, 32, 6, 68, 28, 5, 94, 45, 19, 124, 75, 27, 74, 34, 7, 79, 35, 5, 89, 47, 13, 94, 48, 14, 103, 53, 16, 112, 70, 25, 133, 86, 37, 94, 57, 16, 104, 63, 24, 98, 58, 24, 68, 41, 16, 32, 15, 2, 12, 1, 0, 6, 1, 0, 4, 1, 0, 4, 1, 0, 2, + 1, 1, 0, 1, 0, 3, 0, 0, 18, 6, 0, 37, 15, 0, 43, 15, 0, 45, 17, 0, 88, 43, 8, 106, 55, 14, 91, 47, 7, 103, 58, 10, 124, 78, 22, 143, 96, 36, 145, 96, 35, 127, 78, 26, 128, 78, 23, 137, 90, 35, 181, 141, 89, 197, 160, 99, 193, 150, 94, 220, 184, 115, 219, 180, 113, 191, 145, 78, 187, 142, 73, 202, 161, 95, 198, 158, 97, 143, 100, 49, 129, 86, 39, 175, 136, 80, 169, 132, 76, 182, 141, 82, 199, 162, 102, 171, 135, 72, 160, 124, 68, 156, 117, 61, 174, 139, 84, 157, 123, 72, 197, 156, 92, 207, 149, 76, 213, 146, 67, 208, 135, 56, 210, 131, 51, 199, 113, 32, 202, 123, 44, 203, 131, 53, 211, 143, 67, 215, 147, 70, 213, 145, 64, 214, 150, 72, 216, 154, 79, 216, 152, 75, 210, 144, 67, 207, 139, 62, 208, 139, + 60, 212, 139, 62, 215, 142, 65, 219, 153, 76, 219, 152, 72, 220, 155, 75, 226, 164, 83, 233, 170, 87, 238, 176, 90, 237, 182, 97, 226, 177, 96, 215, 179, 117, 218, 185, 127, 110, 74, 32, 70, 36, 8, 26, 10, 1, 21, 10, 2, 79, 58, 25, 160, 126, 71, 180, 141, 80, 161, 124, 73, 93, 67, 33, 98, 61, 19, 98, 59, 14, 127, 86, 28, 154, 113, 56, 169, 129, 66, 176, 134, 71, 165, 121, 64, 124, 89, 48, 112, 86, 53, 89, 69, 29, 51, 48, 1, 45, 50, 1, 37, 44, 3, 27, 38, 0, 25, 37, 0, 21, 29, 0, 41, 40, 0, 64, 56, 0, 81, 64, 1, 86, 69, 5, 81, 69, 5, 72, 66, 20, 49, 55, 37, 21, 31, 15, 39, 41, 4, 60, 58, 5, 66, 61, 14, 65, 60, 19, 66, 53, 8, 61, 49, 2, 62, 50, 0, 59, 49, 1, + 11, 15, 0, 27, 36, 3, 22, 24, 2, 17, 23, 0, 39, 35, 5, 49, 41, 4, 50, 45, 3, 49, 43, 5, 68, 52, 22, 27, 28, 0, 26, 29, 1, 41, 33, 7, 38, 30, 10, 41, 32, 12, 66, 48, 16, 73, 51, 26, 79, 41, 14, 85, 48, 20, 87, 52, 21, 53, 29, 5, 66, 28, 8, 52, 21, 4, 55, 22, 6, 52, 21, 2, 80, 40, 14, 97, 46, 13, 69, 27, 5, 69, 27, 6, 69, 30, 8, 58, 25, 6, 73, 32, 7, 41, 14, 0, 36, 20, 8, 69, 36, 8, 70, 33, 3, 97, 49, 15, 117, 65, 27, 95, 50, 12, 89, 49, 9, 84, 45, 11, 99, 55, 16, 106, 57, 15, 116, 74, 25, 151, 101, 45, 145, 101, 40, 131, 90, 32, 120, 83, 29, 144, 96, 37, 102, 75, 23, 98, 71, 24, 71, 54, 17, 49, 39, 12, 17, 14, 4, 3, + 3, 0, 6, 2, 0, 5, 1, 0, 6, 3, 0, 13, 3, 0, 18, 5, 0, 22, 7, 0, 47, 19, 0, 90, 45, 8, 90, 43, 4, 104, 59, 14, 111, 65, 16, 124, 78, 28, 140, 92, 36, 140, 91, 35, 146, 98, 37, 147, 99, 41, 145, 100, 44, 176, 137, 80, 200, 164, 106, 210, 175, 111, 220, 184, 117, 207, 167, 107, 189, 147, 85, 188, 149, 89, 192, 160, 100, 156, 115, 63, 145, 105, 55, 179, 142, 85, 199, 164, 101, 155, 118, 64, 172, 133, 73, 154, 113, 57, 157, 119, 65, 143, 104, 51, 162, 126, 72, 186, 149, 91, 201, 154, 84, 214, 155, 80, 212, 149, 72, 214, 150, 72, 204, 137, 59, 198, 126, 50, 199, 128, 52, 201, 129, 53, 200, 130, 53, 202, 132, 55, 205, 135, 57, 209, 143, 65, 214, 152, 78, 213, 149, 73, 211, 142, 66, 209, 143, 65, 205, 136, + 58, 206, 136, 60, 213, 143, 68, 220, 154, 76, 220, 155, 77, 216, 149, 68, 223, 159, 77, 226, 161, 79, 234, 173, 88, 234, 181, 99, 222, 177, 105, 228, 197, 132, 205, 182, 132, 55, 43, 29, 19, 11, 1, 58, 42, 16, 146, 116, 61, 181, 143, 86, 186, 146, 88, 194, 153, 92, 197, 154, 97, 193, 152, 97, 182, 142, 88, 149, 108, 56, 116, 76, 28, 142, 104, 51, 155, 112, 54, 154, 109, 50, 147, 105, 54, 87, 53, 23, 112, 79, 44, 99, 77, 37, 63, 57, 12, 50, 52, 3, 35, 38, 1, 25, 28, 0, 20, 26, 1, 17, 24, 0, 32, 33, 0, 53, 46, 0, 64, 54, 1, 64, 55, 1, 55, 51, 3, 39, 40, 3, 30, 40, 11, 26, 35, 6, 48, 49, 0, 57, 54, 1, 59, 50, 0, 70, 54, 0, 62, 48, 1, 70, 60, 0, 70, 60, 1, 62, 55, 0, + 36, 40, 13, 34, 39, 6, 26, 28, 2, 39, 38, 6, 65, 55, 13, 78, 63, 23, 69, 59, 15, 79, 68, 30, 90, 68, 34, 65, 56, 30, 52, 44, 24, 62, 49, 23, 65, 50, 24, 73, 49, 22, 81, 48, 15, 69, 42, 21, 94, 51, 22, 75, 36, 12, 77, 45, 22, 66, 32, 9, 68, 33, 11, 72, 33, 7, 85, 38, 9, 64, 26, 3, 77, 37, 9, 81, 38, 9, 85, 38, 9, 87, 40, 11, 81, 39, 10, 59, 25, 3, 64, 27, 7, 29, 9, 1, 31, 13, 6, 62, 32, 14, 88, 45, 10, 94, 46, 11, 112, 60, 20, 97, 57, 15, 88, 55, 11, 117, 77, 20, 127, 88, 34, 112, 72, 22, 121, 80, 25, 142, 101, 39, 170, 114, 45, 181, 134, 56, 170, 130, 54, 176, 133, 57, 172, 138, 53, 173, 144, 57, 171, 143, 59, 179, 145, 66, 166, 140, 61, 94, + 81, 30, 51, 44, 17, 37, 29, 13, 26, 18, 8, 22, 13, 3, 29, 14, 3, 31, 17, 2, 36, 17, 1, 51, 22, 2, 88, 47, 7, 100, 56, 9, 107, 66, 20, 98, 57, 10, 116, 70, 20, 137, 90, 33, 142, 98, 38, 155, 108, 52, 138, 95, 41, 153, 112, 58, 189, 159, 106, 190, 158, 102, 219, 185, 125, 213, 175, 116, 199, 160, 99, 185, 147, 86, 195, 162, 100, 177, 143, 85, 141, 105, 56, 187, 150, 92, 188, 151, 94, 179, 145, 87, 176, 139, 78, 197, 167, 104, 186, 154, 97, 128, 88, 40, 182, 151, 97, 196, 156, 93, 211, 160, 89, 214, 159, 88, 211, 151, 77, 206, 146, 71, 200, 135, 61, 197, 130, 54, 202, 133, 59, 202, 132, 57, 204, 137, 61, 204, 136, 59, 208, 140, 63, 207, 139, 60, 204, 139, 67, 207, 142, 66, 204, 138, 60, 200, 131, 56, 203, 131, + 59, 205, 137, 62, 212, 145, 71, 219, 158, 84, 217, 151, 78, 215, 141, 62, 217, 147, 64, 228, 162, 80, 231, 169, 89, 234, 179, 96, 216, 175, 106, 225, 195, 129, 164, 145, 109, 71, 56, 36, 142, 116, 62, 170, 136, 75, 171, 137, 80, 175, 138, 84, 186, 146, 93, 187, 149, 93, 196, 158, 103, 201, 166, 110, 198, 158, 104, 197, 156, 101, 190, 152, 98, 169, 134, 82, 163, 125, 68, 143, 103, 52, 106, 67, 27, 98, 65, 29, 83, 53, 21, 97, 69, 33, 78, 60, 12, 71, 67, 16, 42, 48, 2, 32, 36, 1, 19, 27, 1, 18, 26, 0, 28, 33, 0, 39, 38, 0, 37, 34, 0, 36, 37, 0, 31, 36, 1, 16, 30, 1, 16, 24, 0, 39, 36, 0, 70, 57, 0, 75, 61, 6, 54, 42, 0, 59, 46, 0, 59, 52, 0, 54, 51, 6, 28, 27, 2, 20, 17, 0, + 51, 42, 6, 64, 57, 20, 81, 76, 34, 45, 45, 15, 37, 36, 10, 56, 47, 15, 84, 73, 34, 123, 109, 64, 121, 104, 56, 103, 85, 44, 53, 42, 14, 38, 24, 4, 60, 39, 7, 92, 61, 25, 73, 38, 12, 54, 30, 11, 70, 33, 12, 68, 33, 4, 64, 36, 8, 59, 32, 12, 84, 44, 16, 96, 47, 14, 77, 29, 2, 35, 12, 0, 78, 40, 13, 83, 39, 11, 95, 44, 15, 98, 50, 17, 79, 37, 12, 76, 38, 13, 59, 32, 7, 65, 44, 15, 61, 43, 10, 60, 40, 12, 77, 47, 12, 103, 58, 14, 119, 69, 24, 114, 70, 19, 124, 81, 26, 138, 95, 33, 155, 117, 47, 142, 111, 39, 130, 93, 30, 154, 109, 40, 168, 119, 47, 174, 134, 57, 181, 141, 61, 176, 142, 63, 177, 150, 67, 173, 146, 66, 177, 145, 67, 171, 141, 64, 174, 142, 68, 170, + 143, 67, 160, 134, 63, 164, 133, 71, 150, 121, 66, 131, 103, 52, 125, 94, 49, 97, 70, 33, 45, 26, 8, 42, 22, 2, 54, 26, 4, 80, 44, 9, 97, 56, 14, 109, 67, 21, 122, 83, 36, 125, 81, 35, 147, 105, 54, 133, 90, 38, 129, 88, 35, 122, 80, 33, 154, 122, 70, 180, 147, 93, 202, 167, 107, 227, 195, 132, 225, 193, 128, 206, 171, 109, 189, 153, 95, 164, 126, 74, 127, 92, 51, 95, 61, 29, 121, 84, 42, 149, 109, 57, 151, 110, 57, 189, 153, 89, 189, 150, 87, 167, 135, 81, 171, 136, 80, 192, 142, 72, 208, 155, 80, 211, 156, 79, 207, 150, 75, 203, 140, 66, 200, 134, 59, 209, 144, 66, 207, 141, 66, 206, 138, 64, 207, 138, 65, 204, 134, 56, 208, 137, 59, 202, 134, 58, 199, 132, 58, 197, 127, 52, 190, 118, 46, 193, 120, 47, 199, 125, + 51, 205, 135, 59, 211, 144, 67, 214, 149, 74, 215, 147, 71, 216, 146, 68, 220, 151, 72, 222, 157, 75, 229, 169, 85, 227, 170, 90, 214, 176, 109, 207, 186, 132, 152, 131, 91, 144, 117, 58, 166, 132, 74, 169, 134, 76, 171, 136, 80, 174, 137, 81, 172, 136, 79, 176, 139, 84, 180, 144, 89, 187, 150, 95, 183, 148, 92, 186, 151, 93, 191, 152, 98, 190, 153, 101, 195, 154, 102, 187, 149, 97, 173, 138, 88, 168, 132, 84, 123, 93, 57, 98, 66, 36, 120, 82, 41, 108, 85, 38, 53, 51, 6, 34, 37, 1, 24, 32, 0, 25, 32, 0, 31, 37, 0, 41, 46, 0, 39, 45, 1, 38, 46, 0, 43, 48, 0, 44, 43, 0, 46, 42, 1, 65, 49, 0, 99, 75, 0, 80, 59, 8, 52, 39, 0, 35, 28, 5, 19, 26, 0, 19, 32, 0, 11, 27, 1, 4, 15, 0, + 86, 75, 21, 81, 76, 39, 91, 84, 40, 68, 64, 29, 49, 49, 24, 76, 72, 37, 104, 93, 44, 92, 82, 24, 54, 44, 0, 52, 39, 7, 22, 16, 0, 52, 42, 7, 84, 64, 18, 98, 64, 23, 46, 36, 12, 45, 34, 11, 69, 36, 11, 70, 39, 6, 58, 35, 6, 83, 50, 18, 106, 58, 23, 102, 47, 14, 55, 20, 2, 34, 19, 8, 90, 44, 12, 82, 37, 8, 88, 38, 9, 94, 41, 12, 89, 44, 10, 130, 79, 32, 150, 113, 49, 148, 117, 49, 146, 119, 50, 125, 97, 38, 97, 73, 25, 93, 59, 13, 99, 60, 17, 121, 74, 21, 132, 84, 29, 147, 103, 37, 154, 119, 47, 166, 131, 54, 155, 124, 49, 158, 123, 47, 154, 117, 40, 154, 116, 42, 165, 127, 50, 167, 135, 62, 172, 142, 69, 172, 144, 71, 173, 141, 72, 171, 141, 72, 170, 141, 70, 169, + 140, 71, 167, 136, 71, 168, 135, 74, 175, 139, 79, 187, 145, 84, 178, 137, 79, 179, 138, 79, 134, 99, 57, 76, 51, 27, 55, 31, 10, 49, 24, 6, 68, 38, 6, 97, 62, 24, 150, 117, 64, 151, 114, 60, 144, 104, 55, 127, 88, 40, 129, 94, 45, 96, 57, 15, 119, 77, 36, 161, 126, 73, 184, 151, 94, 219, 185, 122, 221, 187, 121, 210, 172, 110, 189, 155, 98, 159, 122, 68, 118, 84, 40, 112, 78, 38, 141, 104, 53, 178, 132, 70, 186, 140, 78, 188, 142, 82, 188, 144, 86, 169, 133, 81, 169, 129, 68, 195, 141, 67, 201, 145, 72, 201, 146, 71, 204, 143, 69, 198, 134, 56, 201, 136, 62, 205, 140, 67, 205, 143, 69, 203, 137, 62, 205, 137, 60, 206, 135, 58, 202, 132, 54, 200, 131, 56, 195, 122, 46, 185, 114, 39, 180, 106, 35, 194, 122, 47, 203, 133, + 59, 207, 138, 63, 211, 143, 66, 213, 145, 67, 213, 145, 69, 216, 150, 73, 219, 155, 80, 225, 163, 82, 228, 167, 84, 224, 173, 93, 204, 168, 111, 181, 160, 116, 162, 134, 82, 157, 127, 66, 163, 130, 73, 166, 130, 77, 164, 129, 75, 167, 132, 79, 166, 134, 82, 167, 134, 80, 170, 135, 82, 170, 135, 83, 173, 140, 85, 176, 144, 85, 178, 144, 87, 178, 145, 90, 179, 145, 94, 180, 144, 94, 179, 144, 94, 181, 146, 94, 181, 147, 93, 180, 145, 95, 173, 138, 89, 165, 133, 79, 153, 128, 71, 129, 111, 59, 75, 71, 29, 34, 39, 3, 39, 45, 0, 51, 57, 0, 48, 53, 1, 39, 45, 1, 45, 47, 0, 61, 56, 1, 75, 62, 0, 88, 69, 0, 93, 73, 2, 67, 54, 4, 48, 40, 5, 12, 13, 1, 6, 14, 0, 12, 30, 0, 16, 37, 0, 10, 27, 1, + 79, 78, 54, 100, 95, 55, 118, 105, 48, 87, 80, 26, 33, 34, 13, 42, 37, 6, 102, 84, 30, 111, 105, 57, 47, 44, 18, 48, 37, 14, 50, 38, 8, 54, 42, 9, 114, 81, 27, 47, 40, 2, 43, 38, 5, 47, 41, 13, 66, 40, 7, 50, 28, 0, 50, 28, 6, 82, 44, 17, 123, 68, 31, 91, 42, 14, 63, 36, 12, 47, 27, 13, 81, 42, 13, 92, 45, 13, 79, 33, 5, 106, 45, 9, 128, 77, 28, 148, 103, 38, 148, 113, 42, 153, 124, 54, 163, 135, 57, 163, 134, 64, 146, 119, 50, 129, 104, 38, 104, 79, 28, 104, 72, 19, 140, 94, 33, 137, 91, 35, 163, 123, 51, 173, 137, 61, 168, 135, 53, 169, 137, 59, 167, 138, 54, 148, 118, 45, 150, 114, 43, 169, 136, 64, 170, 136, 69, 169, 136, 70, 170, 140, 74, 169, 137, 73, 170, 135, 76, 175, + 137, 81, 177, 140, 82, 182, 143, 86, 186, 147, 90, 178, 141, 83, 184, 142, 86, 180, 141, 82, 173, 132, 77, 179, 137, 81, 161, 123, 69, 100, 73, 38, 62, 38, 14, 87, 56, 26, 149, 116, 67, 151, 113, 58, 156, 118, 63, 157, 116, 67, 157, 121, 64, 146, 105, 53, 170, 123, 60, 178, 130, 67, 193, 143, 83, 193, 147, 88, 193, 145, 85, 192, 142, 80, 184, 142, 79, 184, 139, 80, 180, 138, 79, 173, 133, 74, 165, 127, 69, 168, 126, 68, 172, 130, 71, 170, 134, 75, 162, 129, 71, 161, 127, 77, 185, 138, 72, 191, 138, 68, 201, 146, 74, 201, 145, 73, 199, 138, 65, 189, 132, 59, 198, 141, 72, 200, 140, 71, 197, 136, 70, 199, 133, 64, 204, 138, 64, 206, 136, 61, 195, 122, 45, 192, 121, 46, 198, 130, 55, 191, 124, 50, 193, 125, 50, 198, 129, 55, 207, 136, + 59, 205, 135, 57, 209, 138, 60, 212, 144, 69, 214, 148, 71, 220, 157, 78, 217, 156, 80, 218, 157, 77, 227, 168, 87, 228, 179, 105, 192, 162, 109, 161, 132, 85, 156, 128, 71, 159, 127, 66, 159, 128, 72, 164, 131, 76, 165, 132, 76, 170, 137, 79, 165, 133, 78, 170, 135, 80, 170, 140, 84, 164, 133, 76, 164, 135, 77, 168, 135, 81, 169, 137, 80, 168, 136, 85, 168, 137, 89, 169, 139, 88, 170, 141, 87, 170, 138, 84, 169, 137, 86, 169, 137, 84, 175, 138, 86, 179, 144, 90, 181, 146, 92, 191, 151, 94, 176, 144, 80, 127, 114, 57, 76, 75, 21, 41, 50, 1, 31, 40, 1, 26, 35, 0, 31, 34, 0, 48, 43, 0, 76, 65, 0, 90, 76, 1, 83, 71, 2, 71, 68, 9, 56, 55, 11, 18, 22, 4, 8, 15, 0, 17, 33, 0, 25, 46, 0, 19, 37, 1, + 39, 37, 4, 30, 27, 0, 35, 31, 1, 39, 35, 1, 16, 20, 0, 12, 15, 1, 30, 28, 6, 35, 26, 7, 70, 60, 30, 77, 64, 33, 66, 56, 21, 82, 58, 19, 60, 47, 14, 43, 38, 2, 22, 22, 0, 41, 38, 8, 67, 42, 10, 56, 35, 4, 63, 40, 10, 92, 54, 21, 96, 49, 15, 52, 23, 9, 68, 39, 11, 45, 26, 11, 72, 36, 9, 91, 44, 12, 105, 53, 15, 115, 59, 16, 142, 92, 29, 142, 101, 33, 149, 119, 44, 149, 123, 47, 156, 130, 56, 161, 135, 57, 152, 130, 51, 156, 134, 53, 120, 95, 35, 127, 93, 37, 141, 102, 41, 164, 122, 55, 169, 131, 60, 173, 141, 62, 168, 139, 57, 165, 137, 57, 165, 135, 57, 149, 123, 48, 153, 124, 48, 165, 131, 63, 175, 142, 71, 165, 132, 68, 166, 132, 73, 162, 127, 70, 167, 130, 74, 180, + 139, 84, 176, 139, 84, 171, 131, 79, 177, 138, 85, 181, 139, 85, 177, 139, 85, 177, 139, 85, 170, 134, 81, 176, 136, 82, 172, 133, 78, 165, 127, 75, 167, 131, 74, 166, 129, 75, 159, 122, 73, 162, 125, 75, 158, 119, 66, 160, 122, 69, 178, 130, 75, 179, 135, 77, 182, 132, 74, 179, 134, 77, 180, 138, 79, 172, 132, 74, 176, 134, 75, 180, 135, 75, 174, 137, 74, 174, 136, 75, 171, 135, 74, 171, 129, 68, 175, 131, 71, 186, 138, 76, 185, 139, 78, 168, 136, 72, 147, 117, 67, 177, 138, 78, 193, 145, 76, 199, 151, 81, 196, 145, 76, 202, 145, 76, 192, 138, 69, 193, 145, 80, 200, 155, 92, 198, 152, 89, 201, 149, 82, 203, 143, 73, 202, 137, 65, 200, 133, 59, 197, 129, 56, 193, 124, 52, 188, 124, 51, 192, 125, 51, 196, 129, 55, 203, 136, 63, 203, 132, + 56, 199, 123, 47, 206, 135, 61, 210, 143, 67, 213, 150, 72, 218, 158, 82, 218, 159, 83, 221, 161, 83, 222, 159, 78, 220, 174, 100, 177, 145, 92, 152, 125, 69, 154, 125, 64, 156, 125, 64, 157, 126, 64, 161, 132, 72, 164, 135, 75, 165, 138, 76, 161, 135, 72, 163, 134, 74, 165, 136, 79, 162, 133, 78, 161, 132, 81, 169, 137, 87, 169, 137, 84, 168, 136, 85, 167, 135, 83, 167, 134, 83, 166, 136, 82, 164, 134, 79, 165, 135, 83, 170, 137, 88, 171, 139, 94, 171, 141, 87, 175, 141, 87, 180, 150, 89, 158, 136, 61, 168, 142, 72, 178, 148, 92, 148, 133, 83, 94, 90, 44, 44, 50, 7, 41, 43, 0, 46, 43, 0, 70, 64, 1, 92, 86, 13, 88, 91, 25, 97, 105, 38, 82, 89, 20, 38, 47, 7, 13, 26, 0, 17, 31, 0, 23, 43, 0, 19, 34, 2, + 3, 5, 0, 4, 7, 0, 12, 14, 4, 23, 25, 9, 6, 12, 0, 6, 10, 0, 19, 20, 1, 12, 13, 1, 2, 5, 0, 44, 34, 9, 84, 67, 26, 112, 88, 42, 68, 57, 15, 29, 24, 0, 12, 15, 0, 24, 25, 6, 55, 37, 13, 87, 53, 11, 99, 63, 21, 83, 43, 9, 49, 20, 1, 56, 28, 12, 59, 25, 5, 65, 31, 7, 80, 40, 10, 101, 58, 16, 126, 79, 22, 126, 78, 17, 157, 111, 40, 149, 113, 35, 150, 124, 45, 165, 140, 50, 158, 137, 53, 156, 135, 52, 160, 142, 56, 163, 140, 57, 151, 127, 53, 140, 114, 45, 159, 131, 54, 154, 122, 49, 169, 135, 57, 163, 131, 50, 157, 131, 52, 164, 133, 59, 168, 136, 62, 157, 129, 60, 163, 134, 59, 163, 131, 65, 161, 133, 69, 149, 125, 60, 133, 107, 50, 154, 123, 67, 164, 127, 72, 169, + 132, 76, 183, 143, 88, 179, 140, 85, 180, 141, 86, 168, 134, 83, 163, 129, 77, 167, 128, 77, 168, 131, 78, 165, 128, 75, 161, 125, 72, 155, 120, 65, 157, 122, 68, 154, 118, 70, 144, 113, 63, 153, 120, 72, 149, 115, 64, 151, 116, 64, 171, 130, 74, 175, 133, 76, 181, 138, 77, 180, 135, 76, 178, 136, 76, 161, 122, 68, 168, 122, 62, 174, 127, 65, 176, 132, 74, 167, 127, 70, 178, 130, 73, 178, 131, 69, 168, 124, 68, 175, 136, 83, 183, 138, 80, 135, 102, 55, 142, 112, 74, 178, 135, 68, 189, 144, 74, 187, 139, 66, 190, 135, 66, 196, 145, 78, 193, 148, 84, 195, 153, 90, 191, 153, 95, 199, 150, 87, 201, 140, 70, 198, 130, 58, 201, 134, 61, 194, 129, 59, 196, 131, 61, 190, 128, 59, 194, 134, 58, 191, 122, 48, 195, 126, 50, 194, 125, 50, 193, 123, + 50, 197, 125, 50, 200, 136, 60, 211, 145, 72, 208, 143, 71, 213, 151, 77, 218, 161, 84, 216, 158, 85, 215, 154, 75, 217, 176, 103, 176, 144, 85, 156, 131, 65, 159, 131, 69, 159, 129, 69, 160, 127, 68, 169, 136, 79, 169, 138, 78, 167, 139, 77, 167, 140, 78, 165, 138, 79, 164, 137, 80, 166, 136, 81, 165, 135, 84, 168, 137, 86, 167, 136, 82, 163, 135, 78, 161, 130, 75, 162, 129, 77, 157, 121, 63, 164, 132, 76, 159, 129, 69, 162, 132, 78, 172, 137, 89, 148, 125, 58, 138, 114, 46, 168, 143, 83, 172, 149, 75, 165, 142, 71, 167, 139, 78, 161, 133, 74, 163, 134, 78, 151, 128, 80, 94, 88, 40, 57, 58, 15, 72, 76, 19, 90, 101, 39, 92, 104, 38, 91, 101, 22, 69, 76, 8, 37, 48, 2, 24, 40, 1, 25, 39, 0, 25, 37, 0, 19, 28, 0, + 3, 4, 0, 5, 9, 0, 4, 7, 0, 14, 17, 5, 5, 11, 3, 2, 5, 0, 21, 20, 6, 6, 9, 1, 3, 8, 0, 36, 29, 4, 73, 59, 22, 87, 60, 15, 56, 50, 14, 49, 44, 14, 43, 46, 22, 30, 29, 4, 43, 32, 3, 60, 36, 9, 93, 47, 14, 55, 30, 7, 55, 22, 4, 61, 33, 13, 48, 20, 3, 49, 23, 6, 99, 60, 21, 148, 100, 35, 121, 75, 19, 137, 88, 22, 165, 125, 40, 165, 130, 45, 161, 135, 50, 165, 140, 54, 165, 140, 54, 157, 138, 53, 163, 141, 59, 159, 135, 55, 164, 141, 56, 151, 129, 48, 159, 132, 46, 160, 132, 52, 166, 135, 57, 155, 130, 54, 152, 125, 55, 157, 126, 56, 161, 130, 62, 166, 135, 69, 158, 129, 59, 155, 124, 61, 155, 125, 67, 162, 130, 71, 155, 126, 65, 158, 130, 68, 169, 135, 78, 172, + 138, 80, 164, 130, 76, 170, 131, 80, 168, 136, 81, 165, 131, 74, 164, 130, 73, 161, 129, 73, 162, 130, 73, 160, 127, 69, 160, 125, 71, 164, 130, 73, 155, 125, 63, 120, 91, 42, 142, 108, 56, 141, 108, 53, 129, 96, 45, 124, 93, 41, 168, 130, 75, 164, 128, 69, 172, 132, 77, 154, 120, 61, 163, 124, 64, 157, 121, 66, 151, 117, 60, 144, 110, 53, 162, 122, 67, 170, 126, 71, 166, 126, 72, 159, 123, 68, 161, 124, 73, 166, 131, 80, 166, 128, 73, 70, 48, 22, 109, 81, 41, 170, 128, 66, 183, 136, 66, 156, 98, 33, 167, 111, 43, 188, 139, 70, 185, 141, 78, 187, 149, 93, 198, 155, 93, 201, 148, 81, 196, 133, 64, 184, 109, 36, 184, 108, 33, 191, 123, 52, 195, 131, 63, 192, 133, 64, 186, 120, 46, 193, 122, 49, 190, 118, 46, 190, 117, 43, 188, 119, + 42, 197, 130, 57, 195, 129, 55, 194, 125, 55, 198, 130, 60, 203, 141, 67, 210, 151, 78, 217, 163, 91, 216, 164, 91, 214, 169, 96, 171, 142, 75, 158, 131, 66, 163, 133, 69, 167, 137, 73, 163, 135, 70, 165, 134, 69, 162, 132, 68, 160, 132, 70, 165, 136, 78, 166, 138, 80, 163, 138, 76, 159, 130, 69, 141, 114, 54, 160, 131, 69, 159, 129, 60, 159, 126, 62, 169, 133, 74, 167, 132, 73, 163, 125, 70, 166, 127, 72, 167, 127, 71, 165, 131, 73, 171, 139, 82, 142, 119, 55, 107, 88, 32, 153, 129, 59, 154, 130, 62, 151, 130, 60, 143, 122, 54, 139, 120, 52, 142, 122, 59, 143, 120, 64, 142, 122, 64, 139, 121, 63, 118, 109, 54, 89, 93, 33, 60, 65, 12, 37, 44, 4, 28, 33, 0, 23, 31, 0, 25, 37, 0, 29, 38, 0, 28, 39, 1, 21, 33, 1, + 6, 10, 0, 8, 11, 0, 0, 3, 0, 1, 1, 0, 6, 11, 5, 5, 10, 2, 17, 17, 5, 5, 9, 0, 3, 9, 0, 35, 32, 8, 94, 76, 40, 53, 37, 4, 12, 17, 2, 34, 32, 5, 88, 81, 37, 80, 77, 46, 59, 49, 16, 57, 42, 11, 62, 34, 7, 67, 40, 8, 48, 25, 4, 50, 30, 10, 63, 39, 15, 94, 72, 35, 147, 113, 49, 151, 109, 40, 147, 103, 32, 138, 97, 29, 154, 119, 40, 172, 141, 53, 167, 140, 51, 166, 141, 52, 165, 141, 52, 158, 136, 52, 157, 135, 58, 162, 141, 61, 160, 138, 57, 153, 131, 51, 152, 128, 46, 159, 135, 56, 153, 130, 53, 155, 131, 58, 162, 137, 66, 172, 139, 72, 175, 143, 76, 163, 135, 70, 157, 131, 67, 153, 127, 58, 136, 112, 47, 154, 127, 67, 167, 132, 74, 169, 138, 81, 171, 135, 78, 169, + 134, 76, 160, 128, 72, 158, 129, 70, 162, 130, 70, 155, 127, 65, 157, 128, 66, 151, 123, 61, 158, 124, 66, 157, 123, 63, 164, 128, 73, 166, 131, 74, 159, 130, 65, 143, 117, 55, 144, 117, 52, 140, 109, 51, 137, 106, 52, 116, 89, 39, 165, 130, 70, 149, 121, 55, 151, 120, 56, 146, 117, 53, 147, 119, 56, 160, 124, 68, 142, 112, 51, 139, 109, 54, 144, 111, 61, 157, 118, 62, 164, 122, 68, 166, 126, 69, 168, 124, 68, 163, 124, 70, 82, 57, 30, 38, 28, 15, 111, 85, 49, 180, 140, 76, 181, 134, 63, 173, 116, 51, 187, 136, 69, 196, 152, 85, 189, 150, 95, 198, 159, 98, 205, 152, 83, 200, 144, 75, 192, 130, 58, 184, 113, 39, 178, 106, 36, 192, 128, 57, 203, 147, 78, 195, 134, 64, 190, 115, 44, 188, 119, 43, 189, 120, 43, 191, 120, 48, 194, 125, + 53, 195, 132, 63, 190, 124, 56, 188, 122, 48, 196, 129, 54, 202, 138, 65, 206, 145, 73, 206, 152, 79, 211, 160, 88, 208, 164, 96, 170, 144, 77, 164, 136, 72, 170, 142, 79, 168, 138, 75, 168, 140, 75, 167, 139, 74, 167, 138, 76, 163, 135, 73, 168, 137, 75, 167, 132, 72, 168, 138, 72, 161, 131, 65, 159, 129, 62, 163, 130, 63, 167, 132, 68, 161, 124, 62, 169, 127, 66, 176, 136, 76, 179, 138, 81, 184, 142, 84, 178, 135, 80, 175, 136, 78, 179, 147, 84, 142, 127, 49, 144, 124, 52, 155, 136, 58, 144, 128, 48, 145, 129, 52, 146, 129, 54, 142, 123, 55, 137, 119, 53, 130, 116, 50, 128, 114, 49, 127, 110, 51, 123, 109, 53, 119, 106, 55, 87, 82, 43, 32, 37, 9, 22, 28, 2, 12, 18, 0, 17, 21, 0, 24, 27, 0, 29, 35, 0, 31, 38, 0, + 22, 21, 2, 16, 16, 0, 0, 2, 0, 0, 0, 0, 1, 2, 0, 8, 13, 6, 9, 12, 3, 5, 9, 1, 2, 9, 1, 31, 29, 7, 94, 74, 40, 42, 28, 4, 3, 11, 0, 5, 13, 0, 15, 19, 0, 33, 32, 6, 106, 89, 38, 75, 67, 39, 59, 45, 14, 67, 41, 3, 74, 49, 18, 136, 113, 56, 157, 129, 60, 157, 124, 56, 159, 126, 57, 145, 119, 48, 163, 130, 50, 187, 158, 63, 174, 147, 60, 168, 142, 56, 174, 148, 60, 159, 136, 52, 150, 130, 52, 155, 134, 52, 166, 140, 64, 161, 136, 62, 159, 136, 58, 153, 130, 55, 151, 129, 56, 163, 136, 66, 156, 132, 60, 165, 137, 72, 163, 135, 71, 167, 137, 78, 177, 144, 83, 168, 138, 76, 157, 132, 63, 154, 126, 62, 152, 126, 62, 157, 128, 67, 160, 126, 67, 155, 126, 66, 162, 130, 70, 163, + 132, 69, 159, 128, 66, 160, 129, 66, 144, 117, 52, 157, 127, 69, 154, 124, 59, 140, 114, 47, 145, 119, 53, 160, 125, 66, 162, 126, 70, 159, 128, 67, 156, 126, 65, 159, 131, 68, 160, 134, 69, 155, 127, 61, 160, 128, 63, 164, 127, 66, 160, 128, 67, 149, 122, 56, 160, 132, 58, 144, 117, 49, 144, 118, 56, 148, 121, 59, 138, 112, 46, 140, 109, 52, 157, 126, 68, 141, 107, 53, 140, 107, 54, 148, 114, 53, 145, 113, 50, 107, 88, 43, 15, 15, 3, 23, 19, 9, 146, 119, 68, 186, 142, 72, 174, 127, 57, 201, 151, 82, 207, 159, 91, 201, 158, 96, 192, 157, 99, 204, 154, 85, 209, 150, 76, 204, 148, 78, 199, 138, 67, 197, 133, 62, 196, 139, 74, 197, 148, 83, 193, 140, 73, 203, 143, 74, 193, 123, 48, 189, 115, 39, 194, 123, 47, 192, 123, 51, 193, 137, + 71, 184, 133, 72, 193, 141, 75, 186, 124, 51, 191, 124, 51, 198, 131, 58, 204, 141, 66, 204, 146, 71, 208, 158, 84, 199, 160, 94, 161, 130, 72, 163, 129, 70, 163, 132, 70, 159, 129, 67, 167, 134, 74, 178, 144, 78, 168, 133, 73, 167, 133, 70, 162, 127, 59, 174, 134, 74, 183, 142, 81, 179, 139, 78, 192, 156, 83, 180, 145, 76, 183, 145, 80, 181, 140, 76, 179, 138, 73, 185, 147, 82, 173, 134, 75, 188, 147, 76, 167, 122, 65, 150, 114, 58, 181, 142, 86, 170, 139, 75, 161, 136, 62, 153, 138, 54, 151, 136, 50, 146, 131, 44, 145, 132, 48, 140, 124, 51, 132, 115, 46, 125, 110, 43, 119, 106, 41, 118, 104, 41, 111, 98, 40, 113, 96, 45, 114, 95, 55, 95, 86, 52, 26, 26, 3, 13, 16, 0, 15, 17, 0, 27, 29, 0, 39, 45, 0, 48, 51, 2, + 22, 19, 2, 26, 23, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 5, 7, 3, 13, 16, 5, 9, 12, 3, 3, 7, 0, 16, 16, 3, 73, 56, 24, 36, 29, 5, 15, 17, 5, 13, 15, 4, 7, 13, 1, 22, 27, 3, 39, 32, 3, 60, 47, 13, 67, 58, 15, 93, 75, 24, 150, 124, 59, 162, 137, 62, 155, 131, 54, 159, 130, 66, 159, 131, 59, 165, 139, 57, 166, 140, 55, 173, 149, 59, 175, 151, 65, 162, 140, 60, 157, 134, 58, 151, 128, 52, 151, 130, 50, 153, 130, 50, 155, 132, 52, 151, 130, 54, 159, 132, 64, 161, 135, 67, 157, 134, 64, 159, 135, 64, 158, 133, 63, 171, 144, 77, 162, 137, 69, 162, 132, 72, 174, 144, 79, 158, 132, 66, 157, 131, 66, 155, 128, 66, 159, 130, 70, 167, 138, 77, 162, 133, 70, 160, 133, 70, 160, 132, 67, 161, + 134, 69, 157, 131, 64, 151, 125, 56, 154, 125, 61, 156, 126, 62, 158, 131, 61, 148, 125, 53, 147, 121, 55, 153, 122, 61, 159, 128, 68, 159, 129, 66, 154, 125, 63, 152, 123, 62, 157, 123, 63, 164, 123, 61, 171, 126, 63, 172, 134, 72, 162, 131, 65, 154, 122, 58, 151, 123, 58, 157, 124, 62, 158, 127, 62, 149, 123, 56, 147, 124, 56, 155, 122, 61, 153, 117, 53, 151, 116, 55, 129, 101, 47, 149, 116, 59, 156, 129, 65, 113, 96, 49, 23, 22, 10, 125, 107, 65, 176, 141, 81, 184, 141, 75, 185, 139, 73, 196, 151, 85, 206, 164, 98, 191, 153, 96, 198, 152, 86, 201, 141, 69, 207, 144, 70, 207, 146, 76, 193, 132, 61, 185, 126, 55, 193, 143, 79, 190, 144, 85, 197, 148, 84, 202, 141, 69, 200, 136, 60, 201, 132, 58, 204, 135, 61, 198, 133, 61, 189, 142, + 81, 182, 138, 81, 195, 142, 78, 191, 135, 64, 191, 132, 63, 195, 134, 61, 204, 146, 70, 205, 151, 80, 209, 167, 97, 187, 151, 93, 167, 129, 73, 168, 133, 72, 165, 129, 67, 159, 124, 65, 171, 135, 75, 178, 142, 83, 175, 140, 81, 171, 136, 75, 163, 129, 63, 171, 130, 65, 179, 136, 71, 187, 146, 78, 191, 148, 85, 195, 158, 85, 184, 145, 77, 179, 137, 69, 199, 155, 86, 182, 143, 78, 185, 146, 79, 166, 129, 65, 152, 117, 55, 179, 139, 71, 167, 127, 66, 149, 120, 64, 163, 134, 70, 155, 133, 60, 153, 136, 52, 153, 139, 51, 144, 131, 46, 145, 125, 54, 133, 116, 43, 131, 115, 41, 127, 109, 44, 123, 107, 40, 120, 102, 44, 106, 90, 43, 110, 91, 46, 105, 89, 55, 40, 39, 12, 24, 25, 0, 27, 26, 0, 40, 35, 0, 47, 43, 0, 43, 40, 0, + 17, 17, 2, 28, 27, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 10, 12, 1, 14, 17, 6, 9, 14, 3, 22, 26, 11, 51, 45, 22, 26, 20, 0, 2, 4, 0, 11, 12, 3, 6, 11, 1, 13, 14, 2, 9, 13, 1, 27, 27, 5, 115, 95, 42, 156, 131, 61, 151, 127, 57, 161, 135, 61, 152, 131, 54, 169, 140, 78, 165, 135, 59, 182, 155, 65, 165, 142, 56, 165, 142, 58, 162, 140, 56, 165, 141, 60, 159, 137, 61, 156, 134, 56, 153, 130, 49, 154, 131, 53, 152, 130, 48, 147, 126, 51, 158, 131, 64, 175, 144, 75, 173, 145, 74, 162, 137, 64, 165, 138, 73, 166, 140, 72, 165, 138, 73, 160, 136, 69, 159, 135, 70, 161, 133, 72, 170, 135, 76, 181, 145, 86, 173, 139, 81, 165, 137, 75, 166, 135, 77, 173, 139, 79, 166, 135, 75, 161, + 131, 69, 157, 131, 62, 154, 131, 53, 154, 128, 58, 148, 122, 49, 158, 129, 62, 159, 132, 63, 160, 135, 70, 156, 129, 67, 161, 128, 71, 161, 130, 71, 161, 130, 71, 158, 124, 66, 149, 116, 58, 160, 124, 65, 168, 131, 72, 183, 142, 73, 170, 133, 69, 144, 115, 50, 148, 117, 57, 166, 128, 70, 170, 133, 77, 159, 128, 65, 154, 124, 58, 145, 110, 44, 145, 109, 49, 125, 100, 44, 122, 105, 44, 99, 82, 29, 162, 126, 69, 116, 94, 52, 60, 51, 31, 181, 156, 101, 177, 141, 77, 165, 131, 76, 180, 137, 75, 197, 156, 90, 185, 146, 86, 180, 142, 82, 206, 148, 69, 208, 143, 63, 206, 139, 68, 204, 144, 73, 203, 150, 81, 186, 138, 76, 184, 140, 80, 185, 139, 76, 193, 135, 65, 197, 131, 53, 203, 138, 58, 209, 146, 67, 211, 146, 72, 201, 144, 75, 183, 139, + 83, 185, 148, 89, 200, 151, 85, 196, 144, 72, 190, 134, 62, 195, 139, 68, 203, 147, 77, 203, 155, 83, 208, 171, 109, 173, 135, 81, 177, 136, 80, 174, 136, 77, 174, 135, 78, 169, 133, 75, 164, 129, 67, 173, 136, 79, 174, 138, 78, 172, 133, 74, 154, 116, 50, 169, 131, 50, 157, 120, 51, 167, 126, 61, 190, 147, 82, 191, 150, 85, 193, 154, 79, 189, 152, 78, 170, 132, 62, 181, 144, 72, 195, 156, 77, 138, 112, 55, 193, 157, 87, 193, 156, 88, 159, 127, 73, 143, 117, 54, 157, 130, 61, 164, 137, 69, 153, 130, 58, 157, 134, 59, 149, 128, 52, 146, 118, 53, 132, 109, 46, 139, 119, 43, 136, 115, 52, 121, 106, 45, 113, 97, 41, 105, 80, 37, 108, 82, 46, 89, 73, 40, 47, 43, 13, 28, 36, 0, 38, 40, 0, 46, 41, 0, 32, 32, 2, 21, 25, 0, + 9, 12, 2, 22, 22, 0, 4, 4, 0, 1, 1, 1, 0, 4, 0, 1, 5, 0, 11, 13, 1, 4, 5, 0, 2, 2, 0, 21, 20, 6, 52, 48, 29, 25, 21, 4, 9, 8, 0, 1, 6, 0, 3, 8, 0, 12, 13, 3, 8, 12, 0, 43, 42, 12, 100, 82, 35, 151, 119, 57, 167, 142, 61, 161, 137, 64, 168, 140, 72, 168, 143, 72, 176, 143, 67, 177, 150, 66, 162, 140, 59, 160, 137, 59, 168, 144, 65, 166, 142, 63, 177, 154, 70, 166, 147, 60, 164, 142, 59, 154, 132, 55, 154, 134, 56, 145, 125, 52, 181, 148, 76, 167, 140, 70, 157, 133, 63, 156, 133, 61, 166, 141, 63, 160, 133, 65, 164, 138, 73, 155, 130, 66, 155, 127, 68, 155, 127, 71, 167, 135, 77, 165, 133, 73, 163, 132, 72, 158, 129, 64, 155, 126, 62, 157, 125, 66, 159, 130, 69, 163, + 131, 70, 160, 132, 67, 157, 131, 60, 150, 126, 52, 151, 124, 55, 161, 132, 61, 159, 131, 63, 159, 136, 68, 156, 131, 63, 160, 127, 69, 163, 131, 71, 159, 125, 69, 166, 130, 68, 160, 128, 65, 158, 123, 63, 184, 141, 81, 175, 140, 76, 183, 147, 76, 148, 119, 51, 173, 136, 66, 151, 114, 48, 156, 118, 59, 167, 131, 70, 146, 112, 50, 142, 114, 55, 176, 148, 82, 161, 136, 71, 153, 133, 57, 113, 94, 33, 120, 97, 43, 57, 44, 25, 93, 82, 52, 144, 121, 79, 148, 121, 66, 165, 138, 88, 180, 143, 83, 187, 150, 91, 180, 138, 78, 190, 138, 64, 202, 140, 62, 203, 137, 61, 202, 138, 68, 204, 145, 71, 190, 141, 75, 168, 126, 71, 176, 129, 71, 191, 134, 66, 193, 129, 53, 194, 125, 46, 199, 130, 50, 206, 141, 66, 205, 142, 68, 194, 143, 79, 177, 135, + 78, 189, 151, 93, 202, 154, 87, 204, 149, 77, 201, 147, 74, 202, 149, 77, 200, 150, 81, 203, 162, 91, 208, 174, 111, 181, 140, 84, 176, 136, 78, 177, 135, 78, 177, 136, 79, 174, 135, 76, 168, 132, 71, 179, 141, 83, 174, 137, 78, 172, 135, 75, 161, 126, 66, 179, 141, 74, 166, 134, 58, 176, 141, 64, 176, 139, 72, 164, 127, 72, 115, 89, 34, 148, 115, 47, 166, 129, 60, 155, 119, 61, 160, 130, 71, 148, 118, 58, 196, 159, 90, 196, 160, 94, 181, 148, 87, 151, 127, 64, 158, 134, 60, 168, 143, 68, 151, 125, 56, 153, 127, 50, 141, 117, 42, 153, 124, 49, 131, 108, 44, 124, 102, 41, 109, 88, 32, 111, 87, 35, 101, 76, 32, 102, 79, 35, 90, 71, 31, 86, 65, 30, 50, 47, 19, 29, 35, 3, 31, 38, 1, 30, 33, 1, 16, 22, 0, 12, 23, 1, + 4, 14, 0, 10, 18, 0, 2, 4, 0, 0, 2, 0, 0, 7, 0, 3, 9, 0, 19, 23, 5, 4, 10, 0, 0, 6, 0, 15, 15, 2, 47, 44, 25, 11, 12, 0, 4, 6, 0, 5, 10, 0, 5, 13, 0, 10, 10, 0, 23, 25, 4, 91, 80, 32, 77, 65, 20, 138, 114, 54, 158, 130, 66, 169, 138, 81, 172, 143, 84, 177, 146, 82, 167, 138, 64, 162, 140, 60, 164, 139, 66, 174, 148, 74, 166, 145, 68, 167, 144, 67, 168, 149, 66, 170, 148, 72, 166, 146, 71, 164, 142, 71, 168, 142, 71, 177, 147, 81, 190, 153, 90, 184, 150, 85, 184, 150, 81, 165, 139, 69, 141, 118, 50, 149, 127, 56, 145, 121, 55, 135, 114, 53, 133, 113, 51, 156, 127, 68, 165, 134, 73, 159, 129, 66, 162, 130, 66, 163, 134, 70, 154, 127, 63, 151, 123, 58, 151, 122, 56, 154, + 127, 60, 157, 128, 64, 160, 131, 66, 157, 128, 59, 158, 130, 61, 158, 131, 65, 154, 127, 61, 160, 133, 66, 173, 140, 78, 171, 134, 70, 163, 129, 67, 153, 124, 61, 161, 131, 61, 162, 132, 66, 157, 128, 58, 167, 135, 67, 169, 137, 70, 172, 139, 67, 159, 130, 59, 153, 123, 53, 145, 112, 42, 106, 75, 25, 152, 117, 56, 146, 117, 51, 159, 137, 69, 154, 134, 65, 149, 128, 57, 152, 130, 58, 137, 118, 53, 75, 62, 21, 20, 15, 4, 115, 103, 67, 103, 82, 51, 126, 99, 57, 148, 117, 70, 171, 139, 84, 187, 154, 99, 152, 107, 49, 188, 135, 61, 206, 150, 74, 193, 137, 64, 205, 150, 76, 197, 141, 70, 182, 139, 76, 162, 121, 63, 185, 134, 68, 195, 133, 58, 197, 133, 59, 198, 130, 53, 200, 128, 52, 209, 147, 68, 206, 149, 76, 188, 142, 77, 176, 139, + 82, 191, 156, 98, 210, 165, 99, 206, 155, 82, 205, 155, 84, 204, 156, 84, 202, 156, 85, 207, 169, 102, 206, 173, 114, 183, 144, 90, 177, 133, 74, 179, 137, 77, 171, 134, 74, 162, 126, 67, 166, 131, 70, 183, 147, 80, 172, 135, 76, 161, 127, 70, 159, 124, 66, 176, 139, 79, 179, 144, 81, 177, 139, 72, 170, 137, 70, 150, 117, 57, 112, 90, 39, 87, 72, 18, 106, 82, 18, 190, 151, 76, 205, 167, 93, 175, 141, 80, 205, 167, 86, 186, 154, 84, 188, 155, 89, 172, 146, 70, 183, 154, 80, 169, 142, 67, 142, 120, 51, 155, 131, 58, 143, 121, 52, 127, 107, 40, 112, 97, 31, 105, 87, 31, 88, 75, 22, 83, 68, 19, 83, 64, 19, 79, 60, 23, 72, 53, 15, 81, 59, 24, 44, 41, 13, 21, 28, 0, 30, 38, 3, 23, 24, 2, 16, 21, 0, 8, 19, 0, + 5, 15, 0, 13, 20, 0, 3, 7, 0, 0, 6, 0, 0, 6, 0, 5, 9, 1, 23, 27, 6, 6, 21, 0, 1, 22, 0, 10, 17, 2, 40, 40, 16, 7, 9, 0, 1, 6, 0, 9, 11, 0, 12, 15, 0, 16, 17, 3, 73, 70, 29, 75, 63, 25, 92, 79, 28, 141, 115, 49, 128, 102, 47, 154, 119, 64, 163, 127, 71, 181, 146, 91, 166, 142, 70, 154, 132, 60, 183, 155, 72, 188, 163, 77, 177, 155, 74, 162, 142, 67, 173, 151, 76, 185, 162, 89, 165, 144, 74, 169, 141, 76, 179, 148, 83, 191, 159, 89, 180, 149, 85, 186, 151, 86, 182, 148, 85, 185, 151, 88, 178, 147, 84, 162, 135, 68, 146, 123, 56, 140, 119, 51, 122, 104, 43, 152, 119, 61, 171, 136, 72, 155, 127, 59, 158, 131, 61, 154, 128, 57, 148, 123, 53, 149, 123, 52, 149, 123, 55, 153, + 128, 58, 162, 134, 67, 161, 134, 67, 164, 138, 71, 164, 139, 71, 152, 127, 60, 153, 122, 58, 162, 134, 65, 156, 132, 60, 156, 131, 53, 158, 127, 60, 163, 135, 65, 165, 137, 61, 167, 138, 66, 149, 122, 53, 147, 118, 53, 162, 135, 66, 168, 140, 64, 154, 126, 58, 149, 122, 52, 156, 129, 56, 132, 106, 47, 148, 119, 56, 147, 123, 55, 155, 135, 61, 143, 125, 50, 164, 139, 62, 163, 141, 65, 136, 116, 48, 56, 51, 20, 19, 17, 7, 103, 94, 63, 70, 63, 41, 106, 80, 47, 123, 93, 53, 174, 145, 97, 167, 135, 80, 169, 121, 54, 201, 152, 78, 204, 153, 83, 198, 147, 77, 214, 164, 89, 210, 161, 89, 193, 154, 94, 187, 146, 86, 200, 147, 80, 200, 139, 68, 200, 141, 68, 202, 136, 61, 207, 142, 64, 214, 157, 81, 216, 169, 95, 198, 157, 92, 189, 153, + 94, 204, 170, 116, 210, 169, 104, 209, 165, 93, 209, 167, 97, 208, 166, 98, 204, 164, 97, 206, 173, 109, 197, 167, 111, 174, 136, 81, 173, 135, 74, 167, 130, 72, 171, 136, 77, 164, 132, 69, 171, 137, 74, 185, 147, 84, 180, 142, 81, 173, 141, 83, 179, 146, 90, 181, 148, 93, 201, 163, 99, 186, 148, 81, 172, 141, 76, 140, 114, 53, 114, 92, 37, 158, 127, 69, 150, 122, 68, 138, 107, 52, 188, 154, 79, 178, 145, 77, 204, 168, 91, 183, 149, 83, 176, 143, 78, 162, 141, 70, 185, 155, 78, 157, 135, 64, 141, 120, 52, 165, 136, 62, 148, 123, 60, 164, 139, 69, 120, 104, 37, 121, 97, 36, 137, 109, 42, 114, 96, 38, 82, 65, 17, 96, 76, 24, 82, 63, 19, 53, 33, 5, 44, 34, 6, 36, 33, 0, 119, 110, 50, 111, 94, 27, 51, 47, 11, 6, 15, 1, + 4, 10, 0, 12, 18, 0, 5, 11, 0, 0, 7, 0, 0, 3, 0, 9, 10, 2, 25, 30, 6, 8, 25, 0, 1, 21, 0, 9, 14, 1, 30, 30, 9, 1, 3, 0, 0, 3, 0, 4, 8, 0, 20, 21, 5, 90, 76, 39, 95, 76, 31, 53, 48, 16, 84, 72, 27, 137, 111, 48, 110, 93, 38, 101, 85, 35, 128, 105, 47, 157, 129, 68, 153, 131, 63, 166, 141, 72, 161, 139, 67, 165, 140, 66, 162, 140, 65, 169, 146, 69, 170, 148, 72, 168, 150, 66, 158, 141, 61, 160, 137, 71, 184, 150, 87, 187, 159, 86, 179, 155, 78, 170, 147, 74, 168, 143, 74, 185, 151, 86, 182, 151, 85, 167, 141, 72, 164, 139, 70, 151, 128, 57, 121, 103, 40, 124, 101, 34, 142, 119, 47, 151, 126, 54, 142, 119, 49, 149, 125, 53, 156, 129, 61, 161, 131, 68, 174, 138, 73, 186, + 146, 83, 181, 148, 78, 179, 146, 81, 184, 150, 83, 178, 150, 77, 164, 140, 64, 162, 135, 59, 159, 131, 59, 152, 128, 57, 166, 138, 64, 163, 136, 65, 168, 139, 67, 156, 131, 58, 158, 135, 60, 151, 126, 58, 152, 123, 53, 160, 130, 61, 171, 142, 69, 161, 133, 62, 167, 141, 63, 166, 141, 63, 146, 124, 52, 153, 133, 60, 148, 126, 58, 164, 139, 74, 155, 133, 66, 163, 140, 62, 169, 146, 62, 153, 132, 60, 61, 53, 20, 11, 11, 3, 28, 26, 15, 67, 57, 37, 94, 69, 40, 139, 114, 72, 185, 157, 103, 171, 134, 77, 166, 122, 56, 175, 136, 74, 161, 123, 67, 183, 141, 78, 212, 165, 97, 207, 163, 96, 204, 169, 106, 196, 161, 96, 200, 154, 85, 211, 162, 90, 215, 167, 89, 218, 160, 82, 212, 153, 75, 217, 161, 87, 222, 179, 106, 184, 147, 89, 178, 141, + 85, 200, 169, 113, 202, 165, 102, 212, 173, 107, 214, 178, 113, 209, 172, 106, 211, 175, 112, 205, 173, 116, 180, 150, 96, 158, 125, 68, 159, 124, 65, 168, 129, 71, 160, 123, 64, 168, 131, 70, 174, 135, 75, 174, 137, 77, 179, 139, 76, 177, 138, 79, 174, 137, 82, 186, 149, 87, 169, 135, 72, 149, 119, 51, 145, 117, 53, 161, 130, 69, 158, 129, 67, 188, 150, 76, 185, 149, 79, 180, 146, 80, 177, 141, 74, 186, 148, 81, 171, 138, 64, 164, 135, 69, 165, 137, 76, 163, 137, 70, 181, 156, 79, 157, 138, 65, 163, 138, 64, 156, 130, 61, 144, 123, 54, 145, 123, 57, 148, 124, 60, 116, 92, 40, 137, 109, 44, 140, 119, 59, 80, 66, 17, 73, 59, 15, 68, 52, 11, 43, 30, 5, 70, 45, 1, 106, 80, 21, 93, 74, 32, 78, 63, 19, 81, 67, 29, 59, 57, 25, + 1, 10, 0, 9, 16, 0, 5, 16, 0, 0, 13, 0, 2, 5, 0, 13, 13, 3, 30, 33, 10, 8, 22, 0, 1, 11, 0, 10, 11, 2, 26, 26, 10, 3, 4, 0, 12, 16, 4, 19, 25, 12, 77, 73, 35, 103, 92, 38, 116, 102, 40, 103, 93, 32, 71, 63, 20, 92, 76, 30, 115, 98, 36, 98, 92, 28, 116, 105, 37, 133, 116, 48, 144, 125, 56, 141, 121, 52, 134, 116, 47, 139, 122, 54, 143, 125, 56, 158, 134, 63, 169, 146, 71, 168, 147, 69, 153, 137, 60, 170, 145, 82, 188, 156, 94, 205, 169, 90, 187, 165, 84, 182, 158, 80, 176, 152, 77, 171, 147, 76, 177, 148, 80, 173, 145, 77, 171, 145, 71, 170, 145, 69, 157, 138, 56, 155, 131, 57, 162, 137, 62, 163, 138, 62, 176, 144, 78, 175, 147, 82, 171, 138, 78, 177, 144, 78, 176, 137, 72, 198, + 160, 88, 193, 155, 81, 194, 153, 77, 187, 152, 79, 173, 144, 73, 169, 142, 65, 178, 149, 69, 151, 124, 54, 170, 141, 73, 163, 139, 71, 162, 138, 67, 168, 141, 71, 172, 142, 74, 162, 136, 65, 149, 123, 48, 148, 120, 49, 145, 119, 50, 166, 141, 73, 155, 131, 60, 153, 129, 58, 158, 133, 64, 159, 137, 68, 157, 135, 67, 155, 132, 65, 162, 135, 67, 152, 132, 61, 161, 138, 64, 168, 146, 65, 163, 142, 65, 42, 39, 15, 8, 9, 1, 9, 9, 1, 97, 78, 47, 122, 95, 54, 157, 131, 84, 170, 137, 82, 172, 128, 65, 172, 139, 78, 155, 125, 71, 154, 121, 71, 178, 143, 82, 210, 173, 104, 201, 165, 105, 201, 170, 109, 206, 174, 113, 209, 164, 95, 213, 169, 99, 218, 176, 99, 221, 173, 92, 222, 167, 87, 216, 163, 94, 222, 182, 117, 184, 149, 89, 187, 157, + 102, 189, 157, 103, 197, 161, 96, 207, 175, 109, 210, 178, 114, 211, 177, 114, 214, 178, 116, 206, 176, 117, 175, 146, 90, 157, 126, 70, 155, 124, 68, 153, 125, 63, 158, 130, 71, 158, 128, 68, 168, 136, 79, 168, 136, 73, 173, 137, 70, 169, 128, 71, 162, 134, 70, 170, 138, 80, 173, 143, 79, 146, 121, 61, 166, 136, 74, 182, 150, 84, 188, 155, 92, 165, 131, 70, 162, 126, 64, 139, 106, 55, 166, 129, 61, 186, 150, 84, 202, 168, 86, 175, 145, 72, 165, 136, 68, 173, 143, 73, 165, 143, 71, 180, 151, 76, 180, 151, 84, 166, 140, 72, 160, 135, 69, 119, 101, 41, 129, 109, 51, 119, 97, 39, 143, 116, 48, 131, 112, 55, 79, 72, 20, 63, 55, 8, 57, 47, 9, 34, 26, 3, 62, 56, 0, 72, 74, 7, 32, 32, 5, 22, 25, 4, 17, 15, 0, 54, 45, 14, + 0, 10, 0, 3, 13, 0, 3, 16, 0, 0, 14, 0, 0, 4, 0, 17, 16, 6, 26, 23, 6, 4, 9, 0, 0, 4, 0, 16, 16, 7, 53, 49, 25, 79, 68, 40, 124, 103, 50, 153, 126, 63, 157, 135, 52, 142, 122, 53, 126, 110, 45, 95, 82, 24, 101, 89, 28, 84, 78, 39, 118, 105, 40, 96, 87, 30, 132, 112, 44, 132, 116, 42, 132, 116, 46, 118, 104, 37, 144, 126, 50, 151, 135, 52, 134, 120, 48, 155, 136, 55, 168, 149, 63, 157, 139, 63, 160, 142, 66, 179, 152, 82, 190, 160, 92, 193, 162, 95, 193, 166, 88, 182, 158, 85, 173, 149, 79, 185, 158, 95, 175, 149, 89, 183, 154, 90, 176, 151, 82, 169, 148, 71, 173, 149, 78, 179, 150, 84, 177, 147, 83, 180, 151, 86, 174, 144, 79, 159, 139, 72, 167, 141, 71, 163, 141, 61, 165, 135, 61, 180, + 156, 69, 168, 149, 72, 154, 130, 49, 159, 132, 55, 169, 142, 61, 174, 146, 69, 185, 155, 79, 156, 131, 55, 157, 129, 60, 161, 136, 66, 170, 144, 74, 166, 138, 70, 176, 144, 80, 165, 140, 73, 155, 129, 61, 147, 122, 50, 153, 128, 58, 161, 138, 66, 162, 140, 69, 157, 136, 66, 148, 127, 56, 152, 130, 61, 158, 134, 67, 166, 140, 64, 149, 129, 56, 141, 122, 54, 159, 137, 69, 172, 149, 73, 147, 126, 60, 21, 21, 6, 11, 10, 4, 15, 14, 5, 94, 76, 38, 128, 99, 49, 141, 107, 60, 172, 138, 78, 175, 138, 76, 153, 126, 73, 120, 84, 51, 139, 102, 55, 184, 147, 89, 211, 177, 111, 200, 171, 112, 192, 163, 105, 205, 176, 116, 190, 151, 87, 207, 167, 96, 211, 169, 99, 221, 175, 101, 218, 169, 94, 210, 164, 94, 223, 187, 116, 190, 158, 101, 188, 160, + 108, 185, 157, 109, 191, 160, 102, 195, 164, 103, 200, 164, 104, 215, 180, 118, 211, 179, 115, 210, 181, 117, 178, 151, 94, 157, 129, 70, 162, 131, 72, 164, 136, 74, 164, 132, 76, 168, 136, 79, 173, 142, 80, 162, 129, 67, 166, 132, 71, 164, 130, 70, 160, 128, 69, 166, 136, 80, 173, 144, 84, 175, 148, 83, 181, 150, 85, 179, 149, 78, 195, 161, 94, 186, 156, 92, 160, 135, 74, 123, 103, 48, 163, 132, 64, 183, 149, 79, 173, 143, 74, 160, 135, 68, 163, 140, 80, 171, 142, 72, 158, 134, 66, 155, 133, 64, 174, 149, 81, 167, 139, 72, 179, 148, 80, 133, 112, 50, 113, 97, 37, 116, 94, 36, 117, 97, 40, 103, 87, 34, 84, 73, 22, 65, 59, 14, 56, 47, 12, 64, 56, 22, 52, 48, 17, 31, 31, 8, 14, 17, 0, 11, 16, 0, 13, 14, 0, 23, 16, 0, + 0, 8, 0, 1, 10, 0, 1, 12, 0, 0, 9, 0, 1, 1, 1, 13, 13, 3, 15, 15, 1, 0, 0, 0, 16, 17, 10, 113, 94, 52, 152, 125, 57, 85, 72, 30, 132, 105, 43, 133, 110, 43, 113, 95, 38, 124, 103, 43, 82, 69, 23, 103, 88, 33, 96, 89, 28, 68, 61, 24, 113, 98, 31, 40, 42, 12, 91, 78, 23, 140, 122, 46, 140, 125, 54, 92, 84, 27, 120, 106, 38, 157, 137, 51, 138, 127, 47, 146, 132, 48, 149, 133, 50, 148, 131, 54, 151, 133, 59, 174, 149, 77, 185, 156, 81, 185, 157, 87, 180, 155, 83, 176, 151, 81, 171, 150, 78, 162, 142, 74, 168, 140, 78, 182, 151, 84, 177, 149, 83, 166, 137, 74, 171, 132, 75, 172, 132, 77, 180, 141, 80, 159, 126, 70, 168, 138, 76, 165, 141, 75, 165, 145, 78, 161, 141, 69, 159, 135, 62, 173, + 143, 64, 166, 144, 59, 171, 144, 61, 165, 137, 60, 146, 120, 45, 166, 140, 67, 167, 141, 66, 156, 129, 55, 171, 137, 68, 164, 141, 71, 158, 135, 66, 166, 139, 71, 167, 136, 73, 163, 136, 71, 159, 133, 66, 157, 134, 64, 147, 124, 53, 153, 128, 61, 162, 137, 70, 168, 144, 77, 162, 137, 68, 157, 130, 64, 148, 125, 55, 156, 132, 56, 145, 128, 54, 153, 134, 57, 156, 136, 62, 155, 135, 62, 105, 95, 48, 19, 18, 11, 14, 14, 5, 11, 12, 4, 40, 30, 7, 120, 92, 44, 182, 152, 90, 198, 165, 101, 153, 123, 69, 134, 111, 68, 76, 49, 21, 144, 105, 58, 195, 162, 97, 203, 169, 108, 195, 167, 114, 167, 134, 84, 199, 169, 118, 171, 133, 78, 202, 165, 100, 206, 171, 101, 221, 183, 110, 221, 177, 102, 211, 170, 100, 211, 177, 112, 177, 153, 102, 184, 157, + 105, 175, 148, 104, 181, 147, 92, 195, 167, 106, 199, 167, 103, 214, 184, 122, 210, 181, 121, 201, 173, 118, 172, 143, 89, 167, 133, 78, 174, 141, 83, 171, 143, 79, 164, 135, 72, 160, 129, 69, 162, 131, 70, 153, 125, 61, 158, 129, 59, 165, 132, 70, 144, 110, 52, 155, 121, 62, 169, 136, 74, 161, 133, 70, 158, 134, 67, 166, 139, 68, 158, 130, 64, 173, 146, 81, 169, 142, 80, 184, 155, 87, 169, 149, 67, 186, 156, 84, 167, 137, 70, 156, 131, 63, 163, 134, 73, 158, 130, 64, 159, 135, 63, 179, 151, 77, 189, 163, 88, 158, 134, 67, 146, 123, 58, 117, 96, 35, 120, 102, 39, 118, 98, 40, 109, 87, 34, 107, 87, 40, 82, 70, 23, 64, 55, 16, 61, 52, 16, 63, 53, 20, 59, 54, 23, 44, 40, 10, 14, 16, 3, 8, 12, 0, 10, 9, 0, 8, 8, 0, + 1, 8, 0, 3, 9, 0, 0, 7, 0, 1, 2, 0, 1, 1, 0, 11, 12, 5, 4, 7, 0, 12, 13, 9, 138, 114, 53, 160, 129, 59, 142, 122, 43, 61, 58, 16, 84, 66, 27, 155, 137, 61, 137, 123, 52, 121, 103, 38, 54, 50, 15, 124, 109, 47, 98, 94, 31, 65, 63, 24, 95, 89, 29, 63, 58, 7, 46, 45, 16, 128, 108, 30, 141, 126, 49, 106, 98, 27, 92, 88, 35, 139, 122, 44, 141, 133, 44, 117, 113, 32, 135, 115, 45, 150, 136, 59, 141, 126, 57, 150, 133, 62, 186, 159, 84, 178, 154, 77, 178, 153, 79, 184, 155, 75, 172, 146, 64, 166, 142, 65, 166, 143, 75, 164, 132, 80, 161, 129, 72, 156, 122, 67, 170, 135, 75, 158, 124, 67, 157, 122, 62, 126, 99, 46, 143, 120, 53, 157, 136, 59, 155, 136, 61, 154, 136, 67, 159, 136, 67, 165, + 142, 64, 168, 144, 63, 191, 153, 74, 159, 131, 58, 163, 137, 63, 164, 135, 63, 178, 146, 67, 166, 137, 61, 141, 116, 52, 160, 132, 65, 161, 132, 68, 173, 143, 79, 166, 138, 74, 168, 139, 73, 169, 139, 72, 157, 132, 66, 159, 132, 62, 148, 127, 59, 157, 133, 69, 151, 130, 63, 145, 124, 53, 149, 122, 58, 161, 132, 64, 148, 127, 54, 147, 130, 60, 150, 133, 59, 148, 129, 57, 139, 119, 43, 95, 81, 36, 19, 20, 8, 13, 12, 4, 8, 9, 1, 25, 22, 9, 117, 94, 48, 191, 165, 104, 197, 170, 109, 158, 132, 78, 109, 83, 46, 76, 45, 22, 154, 121, 73, 199, 168, 108, 187, 156, 102, 155, 136, 93, 155, 124, 73, 163, 134, 85, 121, 88, 47, 194, 161, 99, 212, 184, 120, 210, 177, 109, 221, 186, 113, 210, 173, 102, 204, 170, 107, 150, 129, 85, 154, 126, + 78, 182, 151, 101, 173, 135, 84, 173, 147, 92, 165, 137, 77, 182, 155, 96, 177, 149, 97, 161, 132, 83, 153, 117, 66, 158, 125, 68, 162, 127, 71, 158, 129, 65, 167, 135, 68, 148, 118, 58, 153, 124, 60, 151, 125, 60, 153, 127, 59, 142, 114, 49, 148, 119, 53, 158, 127, 65, 149, 122, 57, 149, 125, 57, 149, 127, 59, 151, 126, 56, 135, 106, 57, 143, 120, 54, 163, 141, 64, 175, 149, 75, 126, 106, 38, 179, 153, 76, 200, 171, 94, 185, 154, 82, 192, 156, 76, 167, 136, 71, 140, 123, 50, 165, 140, 67, 185, 157, 81, 170, 144, 67, 158, 132, 64, 125, 107, 38, 143, 117, 49, 129, 106, 44, 121, 95, 36, 110, 87, 41, 86, 70, 29, 73, 59, 24, 65, 51, 19, 64, 55, 24, 59, 54, 23, 35, 29, 3, 40, 36, 11, 8, 10, 2, 2, 4, 0, 9, 13, 0, + 0, 4, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 13, 14, 3, 8, 9, 1, 54, 48, 26, 121, 94, 42, 146, 120, 47, 145, 130, 43, 96, 90, 27, 35, 35, 18, 139, 117, 51, 137, 115, 39, 81, 69, 19, 49, 42, 8, 86, 79, 41, 118, 111, 48, 95, 89, 31, 99, 90, 27, 113, 97, 33, 42, 38, 12, 90, 80, 20, 143, 127, 53, 138, 127, 52, 74, 72, 24, 114, 105, 34, 142, 133, 41, 125, 119, 34, 132, 120, 44, 149, 136, 53, 157, 143, 64, 145, 130, 51, 173, 148, 69, 170, 147, 73, 170, 148, 75, 179, 154, 79, 177, 150, 84, 167, 142, 81, 148, 123, 68, 115, 93, 40, 134, 109, 51, 141, 110, 54, 156, 122, 62, 147, 118, 57, 135, 106, 50, 112, 88, 34, 118, 101, 34, 140, 120, 48, 165, 137, 68, 169, 144, 69, 168, 142, 72, 160, + 137, 66, 167, 138, 64, 170, 141, 65, 171, 143, 68, 175, 144, 71, 178, 148, 69, 168, 140, 61, 156, 127, 56, 136, 108, 45, 148, 118, 54, 167, 138, 72, 167, 140, 73, 174, 145, 77, 170, 142, 75, 172, 144, 78, 172, 144, 80, 162, 138, 71, 149, 126, 59, 143, 121, 52, 152, 129, 60, 146, 124, 58, 152, 124, 63, 162, 135, 64, 141, 119, 48, 147, 126, 52, 164, 140, 56, 159, 136, 60, 136, 119, 48, 146, 121, 55, 57, 48, 20, 15, 14, 8, 10, 11, 3, 29, 25, 9, 73, 58, 32, 145, 121, 72, 123, 105, 65, 148, 130, 78, 106, 84, 42, 93, 63, 31, 168, 139, 90, 179, 153, 99, 181, 157, 105, 144, 126, 84, 150, 123, 74, 121, 87, 49, 104, 71, 30, 189, 159, 102, 195, 167, 109, 201, 171, 109, 225, 193, 122, 224, 193, 124, 212, 182, 117, 184, 164, 114, 110, 84, + 43, 169, 139, 85, 184, 157, 103, 91, 72, 40, 62, 42, 13, 103, 78, 34, 129, 102, 51, 146, 116, 59, 152, 122, 61, 155, 126, 62, 148, 119, 55, 154, 127, 55, 153, 125, 57, 143, 117, 51, 149, 124, 59, 143, 121, 55, 150, 127, 53, 153, 128, 62, 153, 128, 59, 156, 131, 63, 151, 130, 61, 150, 127, 59, 155, 130, 67, 156, 132, 66, 166, 140, 77, 168, 140, 72, 170, 144, 72, 164, 139, 77, 166, 140, 76, 170, 141, 75, 189, 160, 86, 185, 159, 86, 138, 115, 63, 133, 109, 50, 139, 117, 51, 150, 124, 61, 184, 155, 86, 148, 124, 54, 144, 118, 51, 132, 113, 45, 127, 107, 39, 113, 91, 35, 136, 108, 43, 109, 86, 39, 75, 59, 23, 76, 57, 21, 70, 53, 20, 82, 63, 28, 76, 63, 26, 63, 55, 29, 47, 34, 6, 54, 45, 14, 21, 25, 1, 25, 33, 0, + 17, 19, 4, 14, 15, 0, 1, 1, 0, 0, 0, 0, 8, 7, 4, 58, 54, 31, 143, 121, 68, 142, 114, 53, 120, 103, 41, 139, 124, 46, 139, 128, 40, 125, 117, 30, 44, 42, 14, 110, 91, 32, 124, 107, 30, 93, 84, 20, 42, 36, 10, 45, 42, 21, 86, 77, 30, 71, 63, 14, 68, 61, 15, 51, 45, 12, 23, 21, 2, 62, 57, 19, 117, 106, 43, 145, 133, 52, 60, 60, 16, 76, 74, 18, 124, 116, 33, 131, 123, 37, 122, 112, 38, 129, 119, 39, 138, 127, 44, 160, 139, 60, 155, 133, 60, 169, 140, 73, 171, 145, 75, 175, 148, 78, 165, 141, 73, 139, 116, 60, 122, 94, 46, 119, 99, 39, 122, 102, 41, 127, 106, 42, 126, 103, 42, 138, 110, 52, 126, 100, 47, 122, 98, 38, 108, 91, 30, 128, 112, 41, 158, 131, 59, 183, 156, 79, 183, 155, 82, 164, + 138, 64, 165, 138, 68, 175, 139, 69, 172, 143, 70, 174, 142, 68, 181, 151, 76, 168, 142, 68, 133, 108, 46, 148, 117, 50, 143, 114, 50, 179, 146, 79, 176, 143, 76, 173, 144, 78, 165, 140, 73, 181, 151, 84, 169, 144, 78, 162, 139, 73, 165, 141, 76, 153, 130, 61, 143, 122, 51, 145, 121, 57, 170, 141, 71, 173, 146, 69, 141, 121, 49, 131, 113, 43, 161, 137, 56, 168, 142, 58, 171, 144, 60, 145, 122, 50, 59, 51, 25, 12, 11, 5, 13, 12, 5, 9, 9, 1, 13, 13, 5, 22, 21, 10, 28, 23, 12, 128, 110, 71, 105, 84, 44, 98, 70, 33, 167, 145, 93, 177, 154, 100, 151, 128, 74, 114, 95, 51, 137, 108, 54, 141, 108, 51, 149, 118, 66, 179, 151, 91, 193, 167, 109, 191, 161, 98, 215, 182, 113, 217, 185, 118, 208, 179, 115, 202, 181, 129, 112, 93, + 51, 107, 84, 40, 126, 106, 58, 111, 87, 40, 133, 102, 50, 142, 108, 53, 153, 122, 66, 158, 126, 67, 152, 125, 58, 157, 132, 60, 160, 134, 58, 153, 127, 53, 144, 120, 52, 144, 122, 66, 179, 167, 112, 192, 180, 126, 153, 130, 61, 146, 125, 54, 155, 132, 63, 155, 131, 61, 165, 138, 65, 162, 134, 59, 156, 131, 58, 147, 126, 54, 156, 132, 68, 161, 136, 69, 177, 150, 81, 182, 154, 82, 174, 151, 81, 173, 144, 79, 184, 156, 84, 178, 154, 81, 182, 157, 89, 158, 133, 66, 180, 146, 75, 110, 93, 40, 152, 127, 64, 166, 136, 63, 147, 117, 54, 143, 119, 51, 128, 110, 43, 132, 110, 43, 106, 82, 32, 45, 35, 12, 76, 56, 19, 103, 80, 38, 77, 65, 30, 85, 69, 24, 75, 61, 27, 75, 64, 23, 96, 81, 27, 156, 144, 68, 76, 71, 17, 26, 34, 1, + 120, 118, 64, 100, 102, 59, 52, 54, 10, 25, 25, 9, 84, 68, 34, 128, 102, 51, 131, 105, 47, 133, 107, 42, 120, 115, 32, 138, 129, 43, 134, 130, 40, 102, 100, 29, 54, 51, 18, 82, 70, 18, 119, 105, 36, 97, 89, 16, 39, 40, 12, 49, 44, 14, 85, 77, 26, 103, 95, 32, 93, 86, 32, 107, 99, 43, 48, 45, 15, 38, 38, 15, 125, 113, 46, 143, 132, 49, 88, 85, 23, 80, 76, 18, 100, 96, 29, 119, 113, 32, 109, 102, 30, 106, 97, 29, 109, 100, 28, 88, 75, 21, 144, 121, 49, 154, 129, 57, 136, 115, 49, 159, 133, 68, 171, 141, 74, 153, 126, 64, 115, 93, 42, 128, 106, 45, 129, 110, 42, 123, 106, 38, 123, 96, 36, 130, 99, 42, 132, 99, 42, 121, 98, 35, 99, 81, 19, 116, 97, 28, 154, 125, 57, 164, 136, 63, 136, 111, 46, 170, + 138, 60, 163, 132, 54, 154, 127, 50, 166, 137, 60, 176, 146, 76, 192, 157, 79, 185, 153, 80, 142, 118, 55, 119, 99, 37, 169, 140, 64, 168, 141, 70, 165, 140, 77, 166, 142, 73, 166, 140, 68, 157, 133, 66, 176, 148, 78, 172, 146, 76, 174, 149, 74, 168, 144, 69, 153, 135, 65, 140, 122, 52, 161, 136, 57, 177, 147, 67, 166, 141, 63, 149, 129, 56, 159, 136, 57, 153, 129, 50, 171, 143, 64, 143, 123, 58, 25, 24, 10, 11, 10, 2, 11, 11, 2, 9, 8, 0, 8, 7, 0, 5, 4, 0, 7, 5, 0, 53, 44, 26, 60, 49, 28, 114, 93, 47, 172, 150, 92, 153, 127, 71, 152, 125, 71, 136, 113, 61, 163, 136, 81, 157, 124, 71, 175, 148, 94, 174, 146, 91, 198, 170, 109, 190, 161, 100, 194, 158, 95, 201, 168, 105, 186, 153, 96, 187, 163, 110, 119, 100, + 64, 97, 73, 19, 139, 112, 46, 120, 95, 39, 148, 116, 62, 165, 134, 78, 153, 126, 63, 151, 125, 55, 155, 128, 58, 150, 124, 53, 160, 132, 60, 154, 127, 54, 141, 117, 53, 161, 143, 82, 179, 162, 102, 169, 149, 89, 156, 132, 66, 144, 122, 57, 146, 123, 55, 151, 126, 57, 143, 118, 48, 144, 120, 46, 166, 138, 56, 141, 118, 43, 142, 118, 52, 152, 128, 59, 172, 146, 70, 173, 148, 75, 164, 138, 69, 173, 148, 80, 172, 149, 78, 192, 165, 87, 166, 141, 72, 154, 133, 68, 147, 123, 67, 127, 105, 52, 157, 130, 69, 143, 121, 59, 134, 111, 53, 126, 106, 46, 101, 89, 41, 85, 73, 30, 87, 72, 30, 60, 47, 18, 83, 64, 21, 86, 68, 28, 83, 71, 29, 88, 71, 27, 80, 66, 23, 92, 77, 26, 101, 85, 25, 159, 140, 56, 92, 76, 22, 24, 23, 3, + 113, 105, 27, 155, 148, 66, 140, 138, 69, 81, 77, 34, 147, 119, 52, 115, 93, 35, 93, 74, 19, 117, 104, 32, 121, 115, 32, 133, 124, 44, 147, 138, 45, 126, 116, 37, 110, 99, 25, 56, 52, 7, 59, 51, 21, 111, 102, 26, 51, 50, 7, 48, 46, 18, 97, 87, 38, 141, 127, 48, 148, 137, 60, 105, 97, 42, 53, 47, 13, 18, 17, 0, 77, 66, 27, 137, 121, 33, 103, 96, 26, 80, 75, 23, 104, 98, 27, 126, 117, 36, 121, 114, 36, 111, 102, 32, 106, 101, 28, 62, 54, 21, 164, 139, 69, 165, 142, 67, 143, 119, 54, 139, 115, 53, 114, 90, 36, 142, 114, 52, 122, 100, 41, 120, 104, 36, 123, 108, 33, 124, 107, 34, 108, 86, 27, 105, 74, 28, 120, 85, 37, 119, 96, 32, 117, 98, 32, 86, 70, 17, 129, 109, 36, 159, 131, 55, 149, 125, 54, 159, + 129, 62, 144, 120, 50, 129, 112, 45, 128, 105, 46, 163, 135, 63, 183, 150, 75, 184, 152, 71, 161, 132, 61, 150, 123, 57, 160, 134, 56, 186, 154, 71, 185, 156, 78, 163, 140, 63, 172, 145, 72, 181, 152, 84, 172, 147, 74, 173, 150, 76, 180, 152, 76, 166, 143, 70, 160, 138, 68, 155, 133, 63, 155, 132, 58, 146, 126, 49, 152, 129, 56, 159, 136, 65, 154, 131, 58, 159, 132, 53, 160, 133, 52, 123, 107, 47, 39, 37, 15, 10, 10, 4, 7, 7, 0, 7, 6, 1, 7, 6, 0, 7, 5, 2, 6, 5, 1, 3, 2, 0, 17, 12, 2, 101, 84, 48, 123, 105, 62, 144, 121, 69, 145, 118, 62, 88, 68, 35, 163, 138, 87, 179, 157, 103, 130, 117, 83, 110, 94, 56, 139, 120, 78, 147, 126, 77, 121, 99, 52, 119, 97, 50, 97, 76, 36, 84, 64, 27, 50, 39, + 15, 102, 78, 25, 148, 120, 56, 144, 120, 55, 163, 133, 72, 173, 144, 75, 162, 137, 64, 163, 139, 64, 148, 125, 54, 138, 116, 45, 145, 121, 52, 136, 114, 47, 147, 121, 55, 151, 126, 58, 146, 122, 51, 152, 128, 63, 152, 127, 63, 147, 122, 60, 146, 122, 56, 141, 119, 49, 161, 135, 68, 145, 125, 51, 166, 139, 59, 157, 131, 53, 161, 131, 58, 157, 128, 65, 156, 133, 65, 181, 152, 73, 170, 141, 69, 182, 152, 80, 177, 150, 83, 193, 163, 91, 164, 139, 69, 136, 114, 57, 90, 73, 30, 150, 126, 62, 158, 133, 70, 156, 133, 70, 149, 127, 68, 133, 113, 57, 133, 112, 60, 110, 92, 44, 99, 84, 37, 71, 58, 23, 79, 65, 23, 57, 49, 15, 74, 62, 21, 65, 52, 12, 90, 74, 29, 111, 92, 34, 104, 86, 27, 92, 73, 26, 80, 64, 29, 49, 38, 6, + 22, 24, 7, 65, 59, 8, 111, 100, 23, 65, 54, 21, 105, 81, 35, 97, 80, 28, 99, 81, 21, 123, 111, 35, 144, 133, 46, 130, 123, 43, 136, 131, 40, 114, 105, 30, 122, 116, 34, 63, 62, 14, 37, 35, 7, 70, 67, 25, 95, 85, 22, 45, 39, 6, 69, 63, 28, 134, 118, 48, 148, 134, 68, 116, 105, 44, 53, 48, 14, 19, 17, 2, 34, 32, 9, 100, 87, 28, 101, 91, 24, 69, 66, 15, 117, 106, 32, 105, 99, 35, 120, 112, 36, 114, 104, 34, 120, 111, 35, 58, 49, 14, 119, 96, 39, 129, 105, 44, 122, 93, 45, 125, 96, 43, 125, 96, 42, 124, 102, 46, 118, 104, 38, 108, 88, 25, 122, 105, 27, 131, 113, 34, 113, 95, 31, 93, 67, 26, 119, 87, 40, 116, 92, 31, 130, 110, 37, 98, 78, 18, 124, 106, 29, 141, 119, 42, 153, 130, 50, 158, + 130, 54, 145, 122, 48, 156, 126, 56, 157, 125, 54, 165, 132, 59, 152, 123, 53, 176, 145, 68, 164, 139, 66, 155, 132, 55, 150, 129, 48, 153, 131, 50, 189, 160, 82, 173, 148, 68, 178, 151, 74, 198, 168, 87, 175, 147, 73, 161, 139, 67, 166, 143, 74, 174, 147, 74, 168, 144, 69, 152, 130, 60, 149, 126, 59, 139, 119, 52, 149, 127, 56, 169, 145, 69, 158, 137, 66, 149, 129, 53, 151, 127, 48, 147, 127, 51, 126, 109, 39, 64, 55, 21, 16, 17, 5, 6, 8, 1, 5, 6, 0, 2, 5, 0, 5, 6, 0, 2, 3, 0, 7, 5, 0, 28, 25, 12, 21, 17, 5, 66, 54, 30, 89, 75, 41, 14, 11, 4, 25, 21, 12, 32, 29, 20, 13, 10, 9, 6, 5, 1, 10, 8, 3, 9, 8, 3, 5, 3, 0, 5, 3, 0, 23, 17, 0, 61, 50, 10, 119, 97, + 32, 139, 118, 48, 168, 140, 70, 164, 138, 69, 171, 145, 69, 168, 145, 69, 162, 139, 66, 160, 137, 66, 154, 132, 61, 160, 137, 62, 154, 132, 56, 159, 136, 62, 152, 130, 57, 145, 120, 50, 163, 137, 66, 159, 128, 66, 147, 122, 58, 145, 122, 56, 144, 120, 55, 147, 123, 59, 162, 136, 71, 154, 133, 57, 168, 139, 56, 174, 144, 63, 154, 130, 54, 170, 139, 65, 187, 153, 79, 164, 142, 68, 163, 139, 74, 163, 136, 70, 163, 137, 71, 161, 136, 65, 150, 130, 62, 140, 118, 61, 107, 87, 48, 141, 114, 59, 146, 124, 60, 151, 128, 66, 139, 119, 58, 135, 115, 54, 128, 110, 54, 108, 92, 41, 92, 79, 31, 75, 62, 22, 73, 65, 24, 65, 59, 21, 63, 57, 18, 60, 51, 10, 86, 74, 25, 112, 92, 27, 123, 102, 38, 118, 96, 36, 76, 61, 25, 44, 32, 0, + 5, 8, 1, 5, 5, 0, 29, 25, 9, 80, 64, 23, 135, 111, 50, 85, 73, 30, 89, 80, 17, 106, 100, 30, 132, 126, 42, 132, 125, 40, 106, 100, 29, 90, 80, 27, 131, 119, 43, 116, 107, 35, 104, 98, 43, 83, 77, 20, 62, 60, 10, 74, 67, 25, 36, 36, 14, 82, 68, 27, 129, 111, 46, 96, 84, 34, 62, 53, 15, 25, 20, 7, 66, 59, 18, 81, 70, 13, 85, 77, 17, 58, 56, 16, 121, 110, 36, 129, 120, 43, 121, 114, 41, 120, 111, 36, 103, 94, 26, 46, 34, 7, 93, 72, 25, 151, 122, 52, 114, 89, 43, 138, 108, 51, 159, 131, 66, 138, 115, 51, 124, 108, 38, 121, 104, 32, 123, 109, 30, 140, 122, 41, 132, 112, 43, 113, 86, 36, 109, 79, 33, 113, 91, 26, 117, 97, 25, 99, 83, 18, 110, 88, 29, 134, 112, 38, 130, 108, 31, 135, + 109, 39, 140, 113, 46, 143, 114, 50, 141, 111, 46, 149, 117, 47, 143, 110, 45, 155, 118, 53, 166, 132, 57, 164, 135, 60, 164, 135, 62, 159, 136, 59, 207, 178, 90, 176, 154, 73, 177, 152, 74, 174, 150, 67, 161, 141, 59, 165, 143, 69, 175, 148, 78, 180, 155, 79, 161, 143, 69, 156, 137, 65, 156, 136, 67, 142, 123, 56, 141, 122, 52, 143, 124, 49, 149, 127, 53, 154, 131, 56, 146, 125, 46, 155, 136, 55, 148, 129, 50, 130, 111, 42, 86, 76, 27, 88, 78, 30, 28, 27, 8, 11, 12, 0, 13, 12, 2, 8, 7, 0, 7, 5, 0, 6, 4, 0, 6, 5, 0, 12, 8, 0, 11, 8, 1, 2, 1, 0, 1, 0, 0, 3, 1, 0, 2, 1, 0, 3, 2, 0, 5, 4, 0, 8, 7, 0, 14, 12, 6, 25, 21, 8, 91, 75, 13, 167, 141, 63, 165, 143, + 77, 166, 143, 77, 167, 142, 67, 153, 135, 54, 164, 141, 61, 184, 156, 78, 182, 156, 77, 168, 144, 70, 145, 125, 53, 139, 123, 47, 158, 136, 56, 184, 154, 79, 164, 138, 62, 154, 130, 60, 171, 141, 63, 163, 134, 67, 154, 127, 59, 154, 129, 60, 147, 121, 58, 154, 123, 66, 164, 133, 72, 163, 140, 62, 168, 142, 61, 162, 137, 57, 163, 140, 63, 172, 144, 72, 177, 147, 82, 176, 147, 76, 177, 148, 77, 163, 135, 65, 154, 128, 61, 167, 142, 72, 144, 123, 59, 147, 129, 71, 137, 118, 68, 99, 78, 35, 112, 91, 43, 143, 122, 66, 132, 112, 54, 127, 109, 55, 129, 109, 53, 117, 100, 49, 103, 88, 41, 87, 72, 31, 72, 64, 25, 66, 61, 22, 68, 62, 22, 75, 65, 22, 92, 77, 24, 107, 89, 31, 108, 89, 30, 114, 96, 38, 71, 57, 18, 39, 29, 2, + 1, 4, 0, 1, 1, 0, 23, 18, 6, 48, 38, 16, 141, 118, 50, 136, 118, 46, 98, 95, 26, 117, 107, 35, 143, 135, 45, 135, 128, 44, 92, 89, 25, 124, 112, 34, 74, 73, 23, 104, 98, 46, 87, 82, 31, 46, 46, 18, 49, 47, 6, 62, 59, 31, 84, 76, 42, 39, 37, 19, 98, 86, 38, 65, 61, 20, 49, 42, 10, 27, 25, 9, 28, 28, 7, 52, 48, 2, 69, 62, 13, 40, 39, 11, 111, 97, 36, 135, 120, 50, 143, 127, 50, 101, 92, 27, 62, 50, 7, 40, 27, 1, 70, 51, 15, 112, 87, 30, 121, 91, 36, 121, 90, 39, 133, 97, 43, 140, 110, 45, 110, 93, 27, 125, 105, 37, 122, 104, 32, 137, 123, 43, 112, 99, 31, 104, 76, 28, 90, 61, 21, 108, 86, 28, 104, 85, 22, 109, 93, 27, 123, 105, 43, 142, 123, 54, 133, 113, 39, 147, + 114, 50, 131, 97, 41, 136, 107, 49, 149, 119, 53, 129, 103, 40, 118, 92, 34, 126, 102, 48, 133, 104, 47, 178, 144, 71, 142, 116, 51, 184, 157, 76, 207, 179, 96, 210, 182, 95, 169, 144, 64, 170, 147, 65, 150, 136, 51, 163, 143, 66, 176, 151, 80, 183, 158, 88, 183, 159, 84, 162, 145, 77, 171, 158, 90, 165, 148, 82, 153, 133, 69, 133, 116, 45, 139, 118, 49, 156, 134, 56, 164, 143, 61, 158, 136, 51, 166, 144, 62, 146, 125, 41, 147, 127, 48, 155, 131, 54, 62, 52, 17, 23, 23, 6, 22, 22, 9, 11, 9, 0, 10, 8, 0, 8, 7, 0, 6, 5, 0, 9, 7, 0, 10, 7, 0, 10, 8, 0, 20, 16, 3, 25, 22, 8, 44, 41, 19, 38, 38, 17, 82, 71, 25, 124, 109, 48, 165, 140, 69, 183, 154, 80, 129, 112, 49, 166, 141, 74, 188, 158, + 92, 200, 169, 92, 147, 128, 48, 144, 127, 45, 154, 138, 57, 156, 135, 63, 173, 148, 75, 187, 160, 79, 158, 137, 63, 134, 118, 45, 156, 134, 54, 177, 146, 61, 160, 135, 56, 134, 112, 40, 159, 131, 55, 159, 132, 63, 146, 120, 53, 169, 139, 63, 163, 133, 65, 153, 129, 66, 160, 138, 74, 159, 140, 62, 173, 145, 65, 161, 136, 61, 178, 151, 75, 166, 142, 77, 174, 147, 75, 187, 157, 82, 173, 145, 70, 142, 117, 50, 124, 104, 37, 134, 114, 47, 139, 116, 54, 142, 122, 61, 146, 129, 71, 119, 97, 51, 112, 95, 42, 136, 118, 58, 143, 119, 66, 125, 110, 64, 131, 113, 66, 118, 100, 49, 101, 86, 41, 103, 87, 46, 85, 73, 36, 81, 74, 34, 70, 63, 24, 72, 60, 16, 87, 72, 22, 75, 64, 15, 88, 74, 25, 110, 93, 36, 108, 94, 39, 59, 51, 17, + 6, 8, 0, 1, 3, 0, 8, 8, 0, 16, 12, 1, 57, 47, 16, 128, 112, 38, 102, 94, 21, 96, 90, 28, 153, 135, 52, 124, 119, 35, 43, 41, 12, 112, 97, 31, 152, 134, 47, 72, 67, 22, 125, 114, 43, 105, 99, 37, 76, 73, 18, 24, 25, 11, 99, 86, 48, 104, 89, 38, 128, 112, 51, 118, 106, 39, 60, 53, 15, 26, 22, 4, 42, 36, 9, 41, 41, 11, 60, 52, 12, 32, 30, 11, 58, 53, 16, 114, 103, 41, 142, 125, 45, 124, 108, 35, 48, 39, 9, 44, 30, 2, 48, 33, 4, 69, 50, 11, 78, 54, 19, 111, 79, 31, 121, 87, 35, 138, 109, 45, 117, 101, 30, 120, 102, 34, 115, 98, 31, 136, 118, 41, 132, 115, 42, 102, 79, 29, 83, 56, 20, 110, 87, 28, 125, 106, 40, 117, 100, 39, 118, 99, 30, 144, 126, 48, 145, 121, 55, 153, + 117, 57, 144, 114, 55, 137, 108, 45, 145, 118, 50, 169, 140, 70, 148, 120, 57, 133, 111, 49, 123, 101, 44, 159, 126, 57, 135, 113, 52, 180, 156, 83, 200, 172, 92, 181, 162, 81, 188, 165, 88, 183, 161, 80, 162, 146, 60, 163, 142, 61, 191, 164, 84, 163, 145, 72, 183, 163, 83, 182, 164, 92, 186, 172, 99, 185, 165, 94, 176, 155, 84, 152, 132, 58, 135, 119, 48, 175, 155, 81, 168, 145, 67, 162, 142, 62, 166, 147, 66, 154, 133, 53, 153, 133, 55, 139, 117, 39, 127, 107, 41, 101, 87, 35, 118, 104, 52, 57, 50, 17, 102, 86, 38, 83, 74, 35, 59, 52, 20, 48, 42, 12, 87, 72, 27, 106, 88, 40, 151, 125, 64, 170, 145, 70, 180, 151, 74, 173, 146, 66, 181, 151, 73, 182, 149, 75, 175, 144, 76, 157, 127, 62, 142, 119, 60, 180, 149, 79, 213, 178, + 99, 213, 176, 91, 152, 127, 55, 145, 121, 46, 148, 124, 50, 158, 133, 60, 181, 154, 77, 173, 150, 78, 157, 133, 63, 152, 131, 55, 161, 137, 57, 159, 135, 52, 144, 122, 50, 154, 129, 51, 142, 119, 39, 150, 121, 46, 161, 133, 62, 155, 128, 60, 157, 129, 62, 156, 130, 65, 177, 150, 85, 180, 156, 83, 172, 143, 67, 162, 135, 62, 162, 136, 69, 168, 143, 74, 191, 162, 91, 163, 135, 65, 164, 135, 66, 141, 118, 52, 117, 101, 40, 138, 114, 52, 116, 98, 42, 146, 125, 60, 157, 136, 72, 145, 125, 65, 139, 121, 60, 142, 120, 58, 122, 102, 47, 115, 99, 52, 120, 101, 62, 116, 100, 54, 102, 87, 39, 114, 95, 49, 102, 87, 48, 96, 81, 48, 74, 64, 32, 83, 72, 24, 94, 82, 30, 95, 84, 23, 117, 99, 36, 111, 94, 31, 114, 100, 37, 108, 93, 39 +}; \ No newline at end of file diff --git a/examples/app_single_model_on_one_tile_and_DDR/src/labels.h b/examples/app_single_model_on_one_tile_and_DDR/src/labels.h new file mode 100644 index 000000000..808d82ad8 --- /dev/null +++ b/examples/app_single_model_on_one_tile_and_DDR/src/labels.h @@ -0,0 +1,1004 @@ +#include + +const char *imagenet_classes[] = { +"tench, Tinca tinca", +"goldfish, Carassius auratus", +"great white shark, white shark, man-eater, man-eating shark, Carcharodon caharias',", +"tiger shark, Galeocerdo cuvieri", +"hammerhead, hammerhead shark", +"electric ray, crampfish, numbfish, torpedo", +"stingray", +"cock", +"hen", +"ostrich, Struthio camelus", +"brambling, Fringilla montifringilla", +"goldfinch, Carduelis carduelis", +"house finch, linnet, Carpodacus mexicanus", +"junco, snowbird", +"indigo bunting, indigo finch, indigo bird, Passerina cyanea", +"robin, American robin, Turdus migratorius", +"bulbul", +"jay", +"magpie", +"chickadee", +"water ouzel, dipper", +"kite", +"bald eagle, American eagle, Haliaeetus leucocephalus", +"vulture", +"great grey owl, great gray owl, Strix nebulosa", +"European fire salamander, Salamandra salamandra", +"common newt, Triturus vulgaris", +"eft", +"spotted salamander, Ambystoma maculatum", +"axolotl, mud puppy, Ambystoma mexicanum", +"bullfrog, Rana catesbeiana", +"tree frog, tree-frog", +"tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui", +"loggerhead, loggerhead turtle, Caretta caretta", +"leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea", +"mud turtle", +"terrapin", +"box turtle, box tortoise", +"banded gecko", +"common iguana, iguana, Iguana iguana", +"American chameleon, anole, Anolis carolinensis", +"whiptail, whiptail lizard", +"agama", +"frilled lizard, Chlamydosaurus kingi", +"alligator lizard", +"Gila monster, Heloderma suspectum", +"green lizard, Lacerta viridis", +"African chameleon, Chamaeleo chamaeleon", +"Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoeis',", +"African crocodile, Nile crocodile, Crocodylus niloticus", +"American alligator, Alligator mississipiensis", +"triceratops", +"thunder snake, worm snake, Carphophis amoenus", +"ringneck snake, ring-necked snake, ring snake", +"hognose snake, puff adder, sand viper", +"green snake, grass snake", +"king snake, kingsnake", +"garter snake, grass snake", +"water snake", +"vine snake", +"night snake, Hypsiglena torquata", +"boa constrictor, Constrictor constrictor", +"rock python, rock snake, Python sebae", +"Indian cobra, Naja naja", +"green mamba", +"sea snake", +"horned viper, cerastes, sand viper, horned asp, Cerastes cornutus", +"diamondback, diamondback rattlesnake, Crotalus adamanteus", +"sidewinder, horned rattlesnake, Crotalus cerastes", +"trilobite", +"harvestman, daddy longlegs, Phalangium opilio", +"scorpion", +"black and gold garden spider, Argiope aurantia", +"barn spider, Araneus cavaticus", +"garden spider, Aranea diademata", +"black widow, Latrodectus mactans", +"tarantula", +"wolf spider, hunting spider", +"tick", +"centipede", +"black grouse", +"ptarmigan", +"ruffed grouse, partridge, Bonasa umbellus", +"prairie chicken, prairie grouse, prairie fowl", +"peacock", +"quail", +"partridge", +"African grey, African gray, Psittacus erithacus", +"macaw", +"sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita", +"lorikeet", +"coucal", +"bee eater", +"hornbill", +"hummingbird", +"jacamar", +"toucan", +"drake", +"red-breasted merganser, Mergus serrator", +"goose", +"black swan, Cygnus atratus", +"tusker", +"echidna, spiny anteater, anteater", +"platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhyhus anatinus',", +"wallaby, brush kangaroo", +"koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus", +"wombat", +"jellyfish", +"sea anemone, anemone", +"brain coral", +"flatworm, platyhelminth", +"nematode, nematode worm, roundworm", +"conch", +"snail", +"slug", +"sea slug, nudibranch", +"chiton, coat-of-mail shell, sea cradle, polyplacophore", +"chambered nautilus, pearly nautilus, nautilus", +"Dungeness crab, Cancer magister", +"rock crab, Cancer irroratus", +"fiddler crab", +"king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodesamtschatica',", +"American lobster, Northern lobster, Maine lobster, Homarus americanus", +"spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish", +"crayfish, crawfish, crawdad, crawdaddy", +"hermit crab", +"isopod", +"white stork, Ciconia ciconia", +"black stork, Ciconia nigra", +"spoonbill", +"flamingo", +"little blue heron, Egretta caerulea", +"American egret, great white heron, Egretta albus", +"bittern", +"crane, bird", +"limpkin, Aramus pictus", +"European gallinule, Porphyrio porphyrio", +"American coot, marsh hen, mud hen, water hen, Fulica americana", +"bustard", +"ruddy turnstone, Arenaria interpres", +"red-backed sandpiper, dunlin, Erolia alpina", +"redshank, Tringa totanus", +"dowitcher", +"oystercatcher, oyster catcher", +"pelican", +"king penguin, Aptenodytes patagonica", +"albatross, mollymawk", +"grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius rostus',", +"killer whale, killer, orca, grampus, sea wolf, Orcinus orca", +"dugong, Dugong dugon", +"sea lion", +"Chihuahua", +"Japanese spaniel", +"Maltese dog, Maltese terrier, Maltese", +"Pekinese, Pekingese, Peke", +"Shih-Tzu", +"Blenheim spaniel", +"papillon", +"toy terrier", +"Rhodesian ridgeback", +"Afghan hound, Afghan", +"basset, basset hound", +"beagle", +"bloodhound, sleuthhound", +"bluetick", +"black-and-tan coonhound", +"Walker hound, Walker foxhound", +"English foxhound", +"redbone", +"borzoi, Russian wolfhound", +"Irish wolfhound", +"Italian greyhound", +"whippet", +"Ibizan hound, Ibizan Podenco", +"Norwegian elkhound, elkhound", +"otterhound, otter hound", +"Saluki, gazelle hound", +"Scottish deerhound, deerhound", +"Weimaraner", +"Staffordshire bullterrier, Staffordshire bull terrier", +"American Staffordshire terrier, Staffordshire terrier, American pit bull rrier, pit bull terrier',", +"Bedlington terrier", +"Border terrier", +"Kerry blue terrier", +"Irish terrier", +"Norfolk terrier", +"Norwich terrier", +"Yorkshire terrier", +"wire-haired fox terrier", +"Lakeland terrier", +"Sealyham terrier, Sealyham", +"Airedale, Airedale terrier", +"cairn, cairn terrier", +"Australian terrier", +"Dandie Dinmont, Dandie Dinmont terrier", +"Boston bull, Boston terrier", +"miniature schnauzer", +"giant schnauzer", +"standard schnauzer", +"Scotch terrier, Scottish terrier, Scottie", +"Tibetan terrier, chrysanthemum dog", +"silky terrier, Sydney silky", +"soft-coated wheaten terrier", +"West Highland white terrier", +"Lhasa, Lhasa apso", +"flat-coated retriever", +"curly-coated retriever", +"golden retriever", +"Labrador retriever", +"Chesapeake Bay retriever", +"German short-haired pointer", +"vizsla, Hungarian pointer", +"English setter", +"Irish setter, red setter", +"Gordon setter", +"Brittany spaniel", +"clumber, clumber spaniel", +"English springer, English springer spaniel", +"Welsh springer spaniel", +"cocker spaniel, English cocker spaniel, cocker", +"Sussex spaniel", +"Irish water spaniel", +"kuvasz", +"schipperke", +"groenendael", +"malinois", +"briard", +"kelpie", +"komondor", +"Old English sheepdog, bobtail", +"Shetland sheepdog, Shetland sheep dog, Shetland", +"collie", +"Border collie", +"Bouvier des Flandres, Bouviers des Flandres", +"Rottweiler", +"German shepherd, German shepherd dog, German police dog, alsatian", +"Doberman, Doberman pinscher", +"miniature pinscher", +"Greater Swiss Mountain dog", +"Bernese mountain dog", +"Appenzeller", +"EntleBucher", +"boxer", +"bull mastiff", +"Tibetan mastiff", +"French bulldog", +"Great Dane", +"Saint Bernard, St Bernard", +"Eskimo dog, husky", +"malamute, malemute, Alaskan malamute", +"Siberian husky", +"dalmatian, coach dog, carriage dog", +"affenpinscher, monkey pinscher, monkey dog", +"basenji", +"pug, pug-dog", +"Leonberg", +"Newfoundland, Newfoundland dog", +"Great Pyrenees", +"Samoyed, Samoyede", +"Pomeranian", +"chow, chow chow", +"keeshond", +"Brabancon griffon", +"Pembroke, Pembroke Welsh corgi", +"Cardigan, Cardigan Welsh corgi", +"toy poodle", +"miniature poodle", +"standard poodle", +"Mexican hairless", +"timber wolf, grey wolf, gray wolf, Canis lupus", +"white wolf, Arctic wolf, Canis lupus tundrarum", +"red wolf, maned wolf, Canis rufus, Canis niger", +"coyote, prairie wolf, brush wolf, Canis latrans", +"dingo, warrigal, warragal, Canis dingo", +"dhole, Cuon alpinus", +"African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus", +"hyena, hyaena", +"red fox, Vulpes vulpes", +"kit fox, Vulpes macrotis", +"Arctic fox, white fox, Alopex lagopus", +"grey fox, gray fox, Urocyon cinereoargenteus", +"tabby, tabby cat", +"tiger cat", +"Persian cat", +"Siamese cat, Siamese", +"Egyptian cat", +"cougar, puma, catamount, mountain lion, painter, panther, Felis concolor", +"lynx, catamount", +"leopard, Panthera pardus", +"snow leopard, ounce, Panthera uncia", +"jaguar, panther, Panthera onca, Felis onca", +"lion, king of beasts, Panthera leo", +"tiger, Panthera tigris", +"cheetah, chetah, Acinonyx jubatus", +"brown bear, bruin, Ursus arctos", +"American black bear, black bear, Ursus americanus, Euarctos americanus", +"ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus", +"sloth bear, Melursus ursinus, Ursus ursinus", +"mongoose", +"meerkat, mierkat", +"tiger beetle", +"ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle", +"ground beetle, carabid beetle", +"long-horned beetle, longicorn, longicorn beetle", +"leaf beetle, chrysomelid", +"dung beetle", +"rhinoceros beetle", +"weevil", +"fly", +"bee", +"ant, emmet, pismire", +"grasshopper, hopper", +"cricket", +"walking stick, walkingstick, stick insect", +"cockroach, roach", +"mantis, mantid", +"cicada, cicala", +"leafhopper", +"lacewing, lacewing fly", +"dragonfly", +"damselfly", +"admiral", +"ringlet, ringlet butterfly", +"monarch, monarch butterfly, milkweed butterfly, Danaus plexippus", +"cabbage butterfly", +"sulphur butterfly, sulfur butterfly", +"lycaenid, lycaenid butterfly", +"starfish, sea star", +"sea urchin", +"sea cucumber, holothurian", +"wood rabbit, cottontail, cottontail rabbit", +"hare", +"Angora, Angora rabbit", +"hamster", +"porcupine, hedgehog", +"fox squirrel, eastern fox squirrel, Sciurus niger", +"marmot", +"beaver", +"guinea pig, Cavia cobaya", +"sorrel", +"zebra", +"hog, pig, grunter, squealer, Sus scrofa", +"wild boar, boar, Sus scrofa", +"warthog", +"hippopotamus, hippo, river horse, Hippopotamus amphibius", +"ox", +"water buffalo, water ox, Asiatic buffalo, Bubalus bubalis", +"bison", +"ram, tup", +"bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain eep, Ovis canadensis',", +"ibex, Capra ibex", +"hartebeest", +"impala, Aepyceros melampus", +"gazelle", +"Arabian camel, dromedary, Camelus dromedarius", +"llama", +"weasel", +"mink", +"polecat, fitch, foulmart, foumart, Mustela putorius", +"black-footed ferret, ferret, Mustela nigripes", +"otter", +"skunk, polecat, wood pussy", +"badger", +"armadillo", +"three-toed sloth, ai, Bradypus tridactylus", +"orangutan, orang, orangutang, Pongo pygmaeus", +"gorilla, Gorilla gorilla", +"chimpanzee, chimp, Pan troglodytes", +"gibbon, Hylobates lar", +"siamang, Hylobates syndactylus, Symphalangus syndactylus", +"guenon, guenon monkey", +"patas, hussar monkey, Erythrocebus patas", +"baboon", +"macaque", +"langur", +"colobus, colobus monkey", +"proboscis monkey, Nasalis larvatus", +"marmoset", +"capuchin, ringtail, Cebus capucinus", +"howler monkey, howler", +"titi, titi monkey", +"spider monkey, Ateles geoffroyi", +"squirrel monkey, Saimiri sciureus", +"Madagascar cat, ring-tailed lemur, Lemur catta", +"indri, indris, Indri indri, Indri brevicaudatus", +"Indian elephant, Elephas maximus", +"African elephant, Loxodonta africana", +"lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens", +"giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca", +"barracouta, snoek", +"eel", +"coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch", +"rock beauty, Holocanthus tricolor", +"anemone fish", +"sturgeon", +"gar, garfish, garpike, billfish, Lepisosteus osseus", +"lionfish", +"puffer, pufferfish, blowfish, globefish", +"abacus", +"abaya", +"academic gown, academic robe, judge's robe", +"accordion, piano accordion, squeeze box", +"acoustic guitar", +"aircraft carrier, carrier, flattop, attack aircraft carrier", +"airliner", +"airship, dirigible", +"altar", +"ambulance", +"amphibian, amphibious vehicle", +"analog clock", +"apiary, bee house", +"apron", +"ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustb, trash barrel, trash bin',", +"assault rifle, assault gun", +"backpack, back pack, knapsack, packsack, rucksack, haversack", +"bakery, bakeshop, bakehouse", +"balance beam, beam", +"balloon", +"ballpoint, ballpoint pen, ballpen, Biro", +"Band Aid", +"banjo", +"bannister, banister, balustrade, balusters, handrail", +"barbell", +"barber chair", +"barbershop", +"barn", +"barometer", +"barrel, cask", +"barrow, garden cart, lawn cart, wheelbarrow", +"baseball", +"basketball", +"bassinet", +"bassoon", +"bathing cap, swimming cap", +"bath towel", +"bathtub, bathing tub, bath, tub", +"beach wagon, station wagon, wagon, estate car, beach waggon, station wagg, waggon',", +"beacon, lighthouse, beacon light, pharos", +"beaker", +"bearskin, busby, shako", +"beer bottle", +"beer glass", +"bell cote, bell cot", +"bib", +"bicycle-built-for-two, tandem bicycle, tandem", +"bikini, two-piece", +"binder, ring-binder", +"binoculars, field glasses, opera glasses", +"birdhouse", +"boathouse", +"bobsled, bobsleigh, bob", +"bolo tie, bolo, bola tie, bola", +"bonnet, poke bonnet", +"bookcase", +"bookshop, bookstore, bookstall", +"bottlecap", +"bow", +"bow tie, bow-tie, bowtie", +"brass, memorial tablet, plaque", +"brassiere, bra, bandeau", +"breakwater, groin, groyne, mole, bulwark, seawall, jetty", +"breastplate, aegis, egis", +"broom", +"bucket, pail", +"buckle", +"bulletproof vest", +"bullet train, bullet", +"butcher shop, meat market", +"cab, hack, taxi, taxicab", +"caldron, cauldron", +"candle, taper, wax light", +"cannon", +"canoe", +"can opener, tin opener", +"cardigan", +"car mirror", +"carousel, carrousel, merry-go-round, roundabout, whirligig", +"carpenter's kit, tool kit", +"carton", +"car wheel", +"cash machine, cash dispenser, automated teller machine, automatic teller chine, automated teller, automatic teller, ATM',", +"cassette", +"cassette player", +"castle", +"catamaran", +"CD player", +"cello, violoncello", +"cellular telephone, cellular phone, cellphone, cell, mobile phone", +"chain", +"chainlink fence", +"chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring mour',", +"chain saw, chainsaw", +"chest", +"chiffonier, commode", +"chime, bell, gong", +"china cabinet, china closet", +"Christmas stocking", +"church, church building", +"cinema, movie theater, movie theatre, movie house, picture palace", +"cleaver, meat cleaver, chopper", +"cliff dwelling", +"cloak", +"clog, geta, patten, sabot", +"cocktail shaker", +"coffee mug", +"coffeepot", +"coil, spiral, volute, whorl, helix", +"combination lock", +"computer keyboard, keypad", +"confectionery, confectionary, candy store", +"container ship, containership, container vessel", +"convertible", +"corkscrew, bottle screw", +"cornet, horn, trumpet, trump", +"cowboy boot", +"cowboy hat, ten-gallon hat", +"cradle", +"crane", +"crash helmet", +"crate", +"crib, cot", +"Crock Pot", +"croquet ball", +"crutch", +"cuirass", +"dam, dike, dyke", +"desk", +"desktop computer", +"dial telephone, dial phone", +"diaper, nappy, napkin", +"digital clock", +"digital watch", +"dining table, board", +"dishrag, dishcloth", +"dishwasher, dish washer, dishwashing machine", +"disk brake, disc brake", +"dock, dockage, docking facility", +"dogsled, dog sled, dog sleigh", +"dome", +"doormat, welcome mat", +"drilling platform, offshore rig", +"drum, membranophone, tympan", +"drumstick", +"dumbbell", +"Dutch oven", +"electric fan, blower", +"electric guitar", +"electric locomotive", +"entertainment center", +"envelope", +"espresso maker", +"face powder", +"feather boa, boa", +"file, file cabinet, filing cabinet", +"fireboat", +"fire engine, fire truck", +"fire screen, fireguard", +"flagpole, flagstaff", +"flute, transverse flute", +"folding chair", +"football helmet", +"forklift", +"fountain", +"fountain pen", +"four-poster", +"freight car", +"French horn, horn", +"frying pan, frypan, skillet", +"fur coat", +"garbage truck, dustcart", +"gasmask, respirator, gas helmet", +"gas pump, gasoline pump, petrol pump, island dispenser", +"goblet", +"go-kart", +"golf ball", +"golfcart, golf cart", +"gondola", +"gong, tam-tam", +"gown", +"grand piano, grand", +"greenhouse, nursery, glasshouse", +"grille, radiator grille", +"grocery store, grocery, food market, market", +"guillotine", +"hair slide", +"hair spray", +"half track", +"hammer", +"hamper", +"hand blower, blow dryer, blow drier, hair dryer, hair drier", +"hand-held computer, hand-held microcomputer", +"handkerchief, hankie, hanky, hankey", +"hard disc, hard disk, fixed disk", +"harmonica, mouth organ, harp, mouth harp", +"harp", +"harvester, reaper", +"hatchet", +"holster", +"home theater, home theatre", +"honeycomb", +"hook, claw", +"hoopskirt, crinoline", +"horizontal bar, high bar", +"horse cart, horse-cart", +"hourglass", +"iPod", +"iron, smoothing iron", +"jack-o'-lantern", +"jean, blue jean, denim", +"jeep, landrover", +"jersey, T-shirt, tee shirt", +"jigsaw puzzle", +"jinrikisha, ricksha, rickshaw", +"joystick", +"kimono", +"knee pad", +"knot", +"lab coat, laboratory coat", +"ladle", +"lampshade, lamp shade", +"laptop, laptop computer", +"lawn mower, mower", +"lens cap, lens cover", +"letter opener, paper knife, paperknife", +"library", +"lifeboat", +"lighter, light, igniter, ignitor", +"limousine, limo", +"liner, ocean liner", +"lipstick, lip rouge", +"Loafer", +"lotion", +"loudspeaker, speaker, speaker unit, loudspeaker system, speaker system", +"loupe, jeweler's loupe", +"lumbermill, sawmill", +"magnetic compass", +"mailbag, postbag", +"mailbox, letter box", +"maillot", +"maillot, tank suit", +"manhole cover", +"maraca", +"marimba, xylophone", +"mask", +"matchstick", +"maypole", +"maze, labyrinth", +"measuring cup", +"medicine chest, medicine cabinet", +"megalith, megalithic structure", +"microphone, mike", +"microwave, microwave oven", +"military uniform", +"milk can", +"minibus", +"miniskirt, mini", +"minivan", +"missile", +"mitten", +"mixing bowl", +"mobile home, manufactured home", +"Model T", +"modem", +"monastery", +"monitor", +"moped", +"mortar", +"mortarboard", +"mosque", +"mosquito net", +"motor scooter, scooter", +"mountain bike, all-terrain bike, off-roader", +"mountain tent", +"mouse, computer mouse", +"mousetrap", +"moving van", +"muzzle", +"nail", +"neck brace", +"necklace", +"nipple", +"notebook, notebook computer", +"obelisk", +"oboe, hautboy, hautbois", +"ocarina, sweet potato", +"odometer, hodometer, mileometer, milometer", +"oil filter", +"organ, pipe organ", +"oscilloscope, scope, cathode-ray oscilloscope, CRO", +"overskirt", +"oxcart", +"oxygen mask", +"packet", +"paddle, boat paddle", +"paddlewheel, paddle wheel", +"padlock", +"paintbrush", +"pajama, pyjama, pj's, jammies", +"palace", +"panpipe, pandean pipe, syrinx", +"paper towel", +"parachute, chute", +"parallel bars, bars", +"park bench", +"parking meter", +"passenger car, coach, carriage", +"patio, terrace", +"pay-phone, pay-station", +"pedestal, plinth, footstall", +"pencil box, pencil case", +"pencil sharpener", +"perfume, essence", +"Petri dish", +"photocopier", +"pick, plectrum, plectron", +"pickelhaube", +"picket fence, paling", +"pickup, pickup truck", +"pier", +"piggy bank, penny bank", +"pill bottle", +"pillow", +"ping-pong ball", +"pinwheel", +"pirate, pirate ship", +"pitcher, ewer", +"plane, carpenter's plane, woodworking plane", +"planetarium", +"plastic bag", +"plate rack", +"plow, plough", +"plunger, plumber's helper", +"Polaroid camera, Polaroid Land camera", +"pole", +"police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria", +"poncho", +"pool table, billiard table, snooker table", +"pop bottle, soda bottle", +"pot, flowerpot", +"potter's wheel", +"power drill", +"prayer rug, prayer mat", +"printer", +"prison, prison house", +"projectile, missile", +"projector", +"puck, hockey puck", +"punching bag, punch bag, punching ball, punchball", +"purse", +"quill, quill pen", +"quilt, comforter, comfort, puff", +"racer, race car, racing car", +"racket, racquet", +"radiator", +"radio, wireless", +"radio telescope, radio reflector", +"rain barrel", +"recreational vehicle, RV, R.V.", +"reel", +"reflex camera", +"refrigerator, icebox", +"remote control, remote", +"restaurant, eating house, eating place, eatery", +"revolver, six-gun, six-shooter", +"rifle", +"rocking chair, rocker", +"rotisserie", +"rubber eraser, rubber, pencil eraser", +"rugby ball", +"rule, ruler", +"running shoe", +"safe", +"safety pin", +"saltshaker, salt shaker", +"sandal", +"sarong", +"sax, saxophone", +"scabbard", +"scale, weighing machine", +"school bus", +"schooner", +"scoreboard", +"screen, CRT screen", +"screw", +"screwdriver", +"seat belt, seatbelt", +"sewing machine", +"shield, buckler", +"shoe shop, shoe-shop, shoe store", +"shoji", +"shopping basket", +"shopping cart", +"shovel", +"shower cap", +"shower curtain", +"ski", +"ski mask", +"sleeping bag", +"slide rule, slipstick", +"sliding door", +"slot, one-armed bandit", +"snorkel", +"snowmobile", +"snowplow, snowplough", +"soap dispenser", +"soccer ball", +"sock", +"solar dish, solar collector, solar furnace", +"sombrero", +"soup bowl", +"space bar", +"space heater", +"space shuttle", +"spatula", +"speedboat", +"spider web, spider's web", +"spindle", +"sports car, sport car", +"spotlight, spot", +"stage", +"steam locomotive", +"steel arch bridge", +"steel drum", +"stethoscope", +"stole", +"stone wall", +"stopwatch, stop watch", +"stove", +"strainer", +"streetcar, tram, tramcar, trolley, trolley car", +"stretcher", +"studio couch, day bed", +"stupa, tope", +"submarine, pigboat, sub, U-boat", +"suit, suit of clothes", +"sundial", +"sunglass", +"sunglasses, dark glasses, shades", +"sunscreen, sunblock, sun blocker", +"suspension bridge", +"swab, swob, mop", +"sweatshirt", +"swimming trunks, bathing trunks", +"swing", +"switch, electric switch, electrical switch", +"syringe", +"table lamp", +"tank, army tank, armored combat vehicle, armoured combat vehicle", +"tape player", +"teapot", +"teddy, teddy bear", +"television, television system", +"tennis ball", +"thatch, thatched roof", +"theater curtain, theatre curtain", +"thimble", +"thresher, thrasher, threshing machine", +"throne", +"tile roof", +"toaster", +"tobacco shop, tobacconist shop, tobacconist", +"toilet seat", +"torch", +"totem pole", +"tow truck, tow car, wrecker", +"toyshop", +"tractor", +"trailer truck, tractor trailer, trucking rig, rig, articulated lorry, sem,", +"tray", +"trench coat", +"tricycle, trike, velocipede", +"trimaran", +"tripod", +"triumphal arch", +"trolleybus, trolley coach, trackless trolley", +"trombone", +"tub, vat", +"turnstile", +"typewriter keyboard", +"umbrella", +"unicycle, monocycle", +"upright, upright piano", +"vacuum, vacuum cleaner", +"vase", +"vault", +"velvet", +"vending machine", +"vestment", +"viaduct", +"violin, fiddle", +"volleyball", +"waffle iron", +"wall clock", +"wallet, billfold, notecase, pocketbook", +"wardrobe, closet, press", +"warplane, military plane", +"washbasin, handbasin, washbowl, lavabo, wash-hand basin", +"washer, automatic washer, washing machine", +"water bottle", +"water jug", +"water tower", +"whiskey jug", +"whistle", +"wig", +"window screen", +"window shade", +"Windsor tie", +"wine bottle", +"wing", +"wok", +"wooden spoon", +"wool, woolen, woollen", +"worm fence, snake fence, snake-rail fence, Virginia fence", +"wreck", +"yawl", +"yurt", +"web site, website, internet site, site", +"comic book", +"crossword puzzle, crossword", +"street sign", +"traffic light, traffic signal, stoplight", +"book jacket, dust cover, dust jacket, dust wrapper", +"menu", +"plate", +"guacamole", +"consomme", +"hot pot, hotpot", +"trifle", +"ice cream, icecream", +"ice lolly, lolly, lollipop, popsicle", +"French loaf", +"bagel, beigel", +"pretzel", +"cheeseburger", +"hotdog, hot dog, red hot", +"mashed potato", +"head cabbage", +"broccoli", +"cauliflower", +"zucchini, courgette", +"spaghetti squash", +"acorn squash", +"butternut squash", +"cucumber, cuke", +"artichoke, globe artichoke", +"bell pepper", +"cardoon", +"mushroom", +"Granny Smith", +"strawberry", +"orange", +"lemon", +"fig", +"pineapple, ananas", +"banana", +"jackfruit, jak, jack", +"custard apple", +"pomegranate", +"hay", +"carbonara", +"chocolate sauce, chocolate syrup", +"dough", +"meat loaf, meatloaf", +"pizza, pizza pie", +"potpie", +"burrito", +"red wine", +"espresso", +"cup", +"eggnog", +"alp", +"bubble", +"cliff, drop, drop-off", +"coral reef", +"geyser", +"lakeside, lakeshore", +"promontory, headland, head, foreland", +"sandbar, sand bar", +"seashore, coast, seacoast, sea-coast", +"valley, vale", +"volcano", +"ballplayer, baseball player", +"groom, bridegroom", +"scuba diver", +"rapeseed", +"daisy", +"yellow lady's slipper", +"corn", +"acorn", +"hip, rose hip, rosehip", +"buckeye, horse chestnut, conker", +"coral fungus", +"agaric", +"gyromitra", +"stinkhorn, carrion fungus", +"earthstar", +"hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa", +"bolete", +"ear, spike, capitulum", +"toilet tissue, toilet paper, bathroom tissue" +}; diff --git a/examples/app_single_model_on_one_tile_and_DDR/src/main.cpp b/examples/app_single_model_on_one_tile_and_DDR/src/main.cpp new file mode 100644 index 000000000..3186f6e6c --- /dev/null +++ b/examples/app_single_model_on_one_tile_and_DDR/src/main.cpp @@ -0,0 +1,86 @@ +// Copyright 2023 XMOS LIMITED. +// This Software is subject to the terms of the XMOS Public Licence: Version 1. + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "image.h" +#include "labels.h" +#include "model.tflite.h" + +extern const int8_t weights[]; + +static float dequantize_output(int n) { + return (n - model_output_zeropoint(0)) * model_output_scale(0); +} + +static void print_top3_classes(int idx[3], int8_t top[3]) { + printf("Top 3 classes:\n"); + for (unsigned i = 0; i < 3; i++) { + float prob = dequantize_output(top[i]); + printf("Top %d, class:%u, prob:%.2f, label:'%s'\n", i, idx[i], prob, imagenet_classes[idx[i]]); + } +} + +static void find_top3_classes( + int8_t *out, + size_t out_size, + int idx[3], + int8_t top[3] +) { + for (size_t i = 0; i < out_size; i++) { + if (out[i] > top[0]) { + top[2] = top[1];idx[2] = idx[1]; + top[1] = top[0];idx[1] = idx[0]; + top[0] = out[i];idx[0] = i; + } else if (out[i] > top[1]) { + top[2] = top[1];idx[2] = idx[1]; + top[1] = out[i];idx[1] = i; + } else if (out[i] > top[2]) { + top[2] = out[i];idx[2] = i; + } + } +} + +void run() { + // model Init + printf("Init Mobilenet DDR model\n"); + model_init((void*)&weights); + + // sizes and I/O + const size_t input_size = model_input_size(0); + const size_t output_size = model_output_size(0); + int8_t* inputs = (int8_t*)model_input_ptr(0); + int8_t* outputs = (int8_t*)model_output_ptr(0); + printf("Input size = %zu\n", input_size); + printf("Output size = %zu\n", output_size); + + // set input + for (unsigned i = 0; i < input_size; i++) { + inputs[i] = lion[i] - 128; + } + + // invoke + model_invoke(); + + // Find top three classes + int idx[3] = {-1,-1,-1}; + int8_t top[3] = {INT8_MIN, INT8_MIN, INT8_MIN}; + find_top3_classes(outputs, output_size, idx, top); + + // Print output + print_top3_classes(idx, top); +} + +int main() { + run(); + return 0; +} diff --git a/examples/app_single_model_on_two_tiles/Makefile b/examples/app_single_model_on_two_tiles/Makefile new file mode 100644 index 000000000..d114f6f9e --- /dev/null +++ b/examples/app_single_model_on_two_tiles/Makefile @@ -0,0 +1,43 @@ +TARGET = XCORE-AI-EXPLORER +APP_NAME = app_device + +APP_FLAGS = -report \ +-O3 -fcomment-asm -mcmodel=large -fxscope -Wno-xcore-fptrgroup \ +-Wno-unknown-pragmas \ +-Wno-bidirectional-buffered-port \ +-lquadflash \ +-g +#-Wm,--image-size,8388608,--image-base,8388608 + +# Comment out the below TFLMC_XCORE_PROFILE definition to disable profiling +APP_FLAGS += -DTFLMC_XCORE_PROFILE + +# Enable the below SHARED_TENSOR_ARENA definition for multiple models +# or to manage tensor arena array yourself +#APP_FLAGS += -DSHARED_TENSOR_ARENA + +# ******************************************************* +# Include AI Tools library and headers +# ******************************************************* +# The following variables are defined for AI Tools library +# and should be included when building the app. +# XMOS_AITOOLSLIB_DEFINITIONS +# XMOS_AITOOLSLIB_INCLUDES +# XMOS_AITOOLSLIB_LIBRARIES +# +ifeq ($(XMOS_AITOOLSLIB_PATH),) +$(error Path to XMOS AI Tools library and headers not set correctly!) +endif +include ${XMOS_AITOOLSLIB_PATH}/buildfiles/aitoolslib.make + +XCC_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_CPP_FLAGS = $(APP_FLAGS) -std=c++14 $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_MAP_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_LIBRARIES) + +#============================================================================= +# The following part of the Makefile includes the common build infrastructure +# for compiling XMOS applications. You should not need to edit below here. + +XMOS_MAKE_PATH ?= ../.. +include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common + diff --git a/examples/app_single_model_on_two_tiles/generate_optimized_cpp_for_xcore.py b/examples/app_single_model_on_two_tiles/generate_optimized_cpp_for_xcore.py new file mode 100644 index 000000000..d28a9571d --- /dev/null +++ b/examples/app_single_model_on_two_tiles/generate_optimized_cpp_for_xcore.py @@ -0,0 +1,33 @@ +from xmos_ai_tools import xformer + +TFLITE_MODEL_PATH = "mobilenetv1_25.tflite" +OPTIMIZED_MODEL_PATH = "src/model.tflite" + +OPTIMIZED_MODEL_PATH = "src/model.tflite" +WEIGHT_PARAMS_PATH = "src/model_weights.h" +print("Generating app cpp files for model...") +xformer.convert( + TFLITE_MODEL_PATH, + OPTIMIZED_MODEL_PATH, + { + ("xcore-thread-count", "5"), + # set conv err threshold + ("xcore-conv-err-threshold", "0.6"), + # operation splitting to reduce tensor arena size + ("xcore-op-split-tensor-arena", "True"), + ("xcore-op-split-top-op", "0"), + ("xcore-op-split-bottom-op", "4"), + ("xcore-op-split-num-splits", "10"), + # write weights as a header file to be + # placed on second tile + ("xcore-load-tile", "True"), + # roughly(tensors are not split) specifies + # size of weights to move out to header file + ("xcore-max-load-external-size", "270000"), + # move weights to this file + ("xcore-weights-file", WEIGHT_PARAMS_PATH), + }, +) +xformer.print_optimization_report() + +print("Done!") diff --git a/examples/app_single_model_on_two_tiles/mobilenetv1_25.tflite b/examples/app_single_model_on_two_tiles/mobilenetv1_25.tflite new file mode 100644 index 000000000..f4ba03b92 Binary files /dev/null and b/examples/app_single_model_on_two_tiles/mobilenetv1_25.tflite differ diff --git a/examples/app_single_model_on_two_tiles/src/config.xscope b/examples/app_single_model_on_two_tiles/src/config.xscope new file mode 100644 index 000000000..3ec328050 --- /dev/null +++ b/examples/app_single_model_on_two_tiles/src/config.xscope @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/app_single_model_on_two_tiles/src/image.h b/examples/app_single_model_on_two_tiles/src/image.h new file mode 100644 index 000000000..71fbb211d --- /dev/null +++ b/examples/app_single_model_on_two_tiles/src/image.h @@ -0,0 +1,486 @@ +#define LION_HEIGHT 160 +#define LION_WIDTH 160 + +// array size is 76800 +const char lion[] = { + 51, 108, 172, 46, 95, 139, 64, 112, 161, 85, 144, 198, 91, 170, 241, 98, 178, 248, 104, 183, 248, 82, 163, 234, 10, 29, 67, 80, 131, 165, 77, 156, 231, 47, 107, 160, 30, 54, 68, 68, 89, 92, 89, 118, 133, 96, 117, 122, 75, 78, 51, 79, 76, 37, 83, 81, 47, 71, 69, 45, 56, 59, 41, 69, 95, 98, 97, 169, 224, 112, 189, 247, 99, 165, 218, 107, 186, 247, 108, 187, 249, 107, 187, 250, 108, 187, 250, 107, 187, 250, 109, 186, 250, 108, 187, 251, 108, 188, 251, 109, 187, 248, 108, 187, 251, 109, 188, 249, 107, 188, 248, 110, 188, 250, 111, 188, 249, 112, 189, 250, 113, 190, 250, 112, 189, 247, 102, 181, 240, 88, 150, 205, 73, 107, 136, 66, 76, 72, 77, 109, 112, 99, 175, 225, 117, 195, 248, 106, 182, 239, 34, 72, 103, 14, 21, 4, 15, 21, 5, 20, + 20, 8, 22, 21, 13, 31, 30, 22, 52, 64, 65, 108, 182, 239, 121, 196, 249, 117, 194, 250, 116, 190, 248, 111, 189, 247, 111, 186, 248, 107, 183, 247, 103, 180, 249, 102, 178, 250, 101, 177, 250, 103, 175, 251, 101, 173, 249, 102, 171, 244, 109, 174, 244, 89, 140, 208, 94, 132, 198, 98, 156, 225, 107, 173, 247, 102, 165, 239, 101, 163, 235, 95, 151, 221, 96, 138, 198, 90, 128, 185, 92, 134, 198, 102, 155, 220, 100, 152, 219, 102, 155, 221, 103, 159, 228, 104, 154, 221, 103, 154, 220, 101, 155, 224, 102, 157, 227, 103, 155, 227, 101, 155, 226, 101, 157, 225, 103, 158, 227, 102, 160, 231, 103, 161, 232, 102, 162, 232, 99, 163, 234, 99, 164, 237, 98, 159, 234, 97, 159, 233, 97, 160, 235, 98, 163, 239, 103, 169, 243, 101, 170, 245, 102, 169, 246, 99, 171, 246, 102, 172, + 248, 101, 174, 249, 101, 175, 249, 99, 178, 249, 100, 179, 250, 101, 180, 251, 103, 182, 250, 106, 184, 247, 106, 184, 249, 106, 184, 250, 104, 184, 248, 102, 184, 250, 103, 183, 250, 104, 184, 251, 104, 183, 250, 104, 183, 250, 104, 184, 251, 103, 183, 250, 101, 184, 249, 103, 183, 250, 101, 183, 249, 101, 183, 249, 102, 182, 249, 103, 182, 249, 103, 182, 249, 103, 182, 249, 102, 183, 250, 102, 183, 251, 102, 182, 251, 104, 175, 244, 102, 175, 247, 103, 182, 249, 102, 181, 250, 95, 164, 237, 57, 113, 168, 74, 154, 226, 100, 182, 247, 100, 183, 251, 100, 181, 250, 101, 181, 250, 99, 183, 250, 101, 181, 250, 100, 180, 249, 100, 181, 249, 98, 181, 251, 99, 180, 251, 98, 180, 251, 98, 179, 250, 97, 179, 250, 97, 179, 251, 98, 178, 251, 96, 179, 251, 96, 178, 251, 94, 173, 249, + 65, 136, 201, 76, 148, 221, 83, 158, 228, 99, 177, 245, 100, 179, 249, 101, 182, 249, 102, 186, 248, 56, 123, 192, 42, 42, 41, 102, 179, 230, 112, 189, 248, 92, 168, 238, 49, 96, 155, 57, 65, 54, 78, 75, 39, 115, 114, 54, 88, 85, 42, 76, 73, 38, 69, 69, 41, 68, 77, 58, 87, 146, 186, 103, 185, 244, 113, 191, 250, 110, 188, 248, 98, 152, 208, 106, 173, 237, 107, 181, 247, 109, 187, 249, 110, 187, 250, 111, 188, 250, 108, 189, 250, 109, 187, 249, 110, 187, 249, 111, 189, 251, 113, 188, 249, 110, 190, 249, 110, 190, 249, 112, 190, 250, 113, 189, 249, 107, 185, 248, 89, 166, 241, 58, 121, 182, 40, 65, 82, 49, 57, 44, 70, 110, 112, 88, 155, 216, 113, 189, 244, 121, 196, 249, 121, 197, 249, 66, 127, 188, 13, 24, 24, 10, 17, 7, 8, 15, 1, 18, + 19, 11, 26, 25, 18, 36, 33, 27, 70, 105, 127, 119, 197, 247, 119, 195, 249, 117, 192, 249, 110, 190, 249, 110, 186, 248, 106, 182, 247, 103, 181, 248, 104, 179, 250, 103, 177, 249, 103, 176, 248, 102, 173, 249, 101, 173, 247, 103, 170, 245, 108, 174, 246, 94, 135, 194, 106, 137, 191, 101, 154, 218, 104, 170, 243, 101, 160, 229, 99, 154, 224, 93, 132, 191, 104, 124, 156, 95, 107, 138, 104, 145, 201, 102, 156, 224, 98, 147, 213, 98, 144, 208, 104, 157, 225, 107, 151, 212, 109, 152, 214, 104, 151, 220, 102, 154, 224, 101, 157, 224, 104, 152, 219, 104, 157, 228, 104, 160, 230, 103, 161, 231, 104, 162, 234, 102, 162, 233, 103, 161, 232, 98, 148, 219, 98, 153, 220, 97, 162, 234, 103, 169, 244, 102, 166, 244, 101, 167, 243, 100, 169, 246, 101, 169, 246, 102, 170, 246, 102, 171, + 249, 101, 171, 249, 99, 174, 250, 99, 177, 248, 101, 178, 250, 100, 179, 250, 99, 180, 249, 103, 182, 249, 102, 183, 249, 104, 184, 249, 105, 184, 249, 104, 184, 251, 102, 184, 250, 103, 185, 251, 103, 184, 251, 103, 185, 250, 102, 183, 250, 102, 183, 249, 104, 184, 249, 101, 183, 249, 103, 183, 250, 102, 183, 250, 101, 184, 250, 103, 183, 250, 102, 183, 249, 104, 183, 250, 103, 184, 251, 103, 184, 250, 104, 183, 249, 103, 177, 249, 101, 175, 246, 104, 182, 249, 105, 182, 250, 96, 173, 244, 60, 120, 183, 58, 130, 201, 100, 181, 247, 98, 180, 251, 94, 176, 247, 100, 182, 250, 102, 181, 250, 101, 180, 249, 102, 181, 250, 102, 181, 250, 102, 181, 250, 99, 182, 250, 99, 181, 249, 98, 181, 249, 99, 179, 250, 98, 180, 251, 98, 180, 251, 98, 179, 250, 98, 178, 249, 94, 175, 250, + 65, 129, 203, 82, 151, 224, 99, 179, 249, 104, 185, 250, 105, 184, 248, 105, 187, 249, 104, 185, 246, 39, 82, 127, 79, 113, 130, 92, 169, 236, 80, 138, 199, 61, 97, 125, 64, 73, 63, 72, 71, 45, 75, 73, 39, 97, 92, 45, 107, 106, 63, 64, 62, 27, 67, 87, 96, 92, 161, 213, 109, 191, 248, 115, 193, 250, 112, 191, 249, 109, 187, 246, 88, 146, 202, 107, 182, 246, 101, 172, 238, 108, 184, 248, 110, 189, 249, 110, 188, 249, 112, 189, 249, 112, 189, 249, 112, 189, 249, 111, 189, 250, 109, 187, 248, 101, 178, 243, 95, 162, 222, 83, 136, 188, 67, 106, 145, 44, 73, 95, 28, 48, 56, 28, 43, 41, 54, 92, 112, 92, 160, 203, 110, 191, 247, 95, 168, 233, 117, 192, 247, 121, 197, 249, 91, 162, 226, 20, 43, 65, 10, 18, 11, 12, 17, 9, 12, 15, 7, 18, + 19, 11, 29, 29, 22, 42, 41, 30, 59, 70, 61, 81, 129, 167, 97, 163, 218, 105, 174, 239, 103, 174, 238, 102, 178, 244, 103, 179, 247, 100, 174, 244, 105, 176, 249, 103, 174, 249, 104, 173, 249, 101, 170, 246, 101, 165, 239, 99, 166, 238, 103, 165, 237, 97, 124, 173, 100, 116, 152, 103, 151, 213, 101, 155, 224, 96, 136, 200, 93, 133, 195, 101, 124, 166, 109, 111, 132, 108, 118, 141, 105, 150, 208, 108, 158, 222, 104, 149, 213, 107, 149, 210, 113, 151, 209, 110, 138, 187, 107, 143, 201, 107, 156, 220, 110, 152, 213, 111, 150, 208, 108, 155, 216, 106, 160, 229, 107, 161, 232, 108, 164, 231, 111, 155, 217, 111, 155, 213, 107, 148, 206, 103, 143, 205, 102, 156, 224, 103, 164, 237, 102, 160, 229, 100, 164, 238, 103, 168, 245, 102, 168, 245, 101, 167, 244, 101, 168, 246, 100, 169, + 247, 101, 170, 249, 102, 171, 249, 101, 172, 249, 100, 175, 249, 100, 177, 250, 101, 177, 249, 101, 180, 250, 101, 181, 249, 103, 183, 249, 103, 185, 249, 104, 184, 250, 103, 185, 251, 104, 184, 250, 104, 184, 251, 104, 185, 250, 103, 184, 250, 104, 184, 251, 101, 184, 250, 103, 183, 250, 102, 183, 250, 103, 183, 250, 101, 183, 249, 102, 184, 249, 101, 184, 249, 101, 184, 250, 103, 183, 250, 102, 184, 249, 103, 183, 248, 102, 181, 250, 104, 175, 246, 105, 182, 248, 104, 182, 250, 91, 170, 245, 56, 112, 174, 35, 90, 150, 73, 147, 219, 79, 153, 226, 88, 169, 240, 101, 183, 249, 102, 182, 250, 102, 182, 250, 102, 182, 250, 102, 182, 250, 101, 181, 250, 100, 182, 250, 100, 182, 250, 100, 181, 250, 99, 181, 250, 98, 180, 250, 98, 180, 250, 98, 180, 250, 99, 180, 250, 93, 175, 250, + 66, 132, 202, 77, 133, 176, 99, 176, 247, 102, 181, 247, 104, 180, 244, 102, 179, 243, 82, 157, 226, 37, 53, 70, 61, 97, 117, 49, 74, 98, 49, 55, 50, 54, 56, 39, 59, 59, 37, 57, 55, 29, 53, 52, 23, 53, 53, 28, 85, 101, 82, 97, 111, 82, 60, 79, 77, 77, 123, 169, 104, 179, 243, 116, 193, 248, 115, 192, 247, 111, 190, 247, 84, 147, 210, 83, 144, 219, 101, 173, 233, 106, 172, 241, 112, 188, 249, 112, 189, 247, 110, 187, 246, 106, 182, 242, 96, 166, 232, 78, 137, 198, 65, 104, 152, 52, 72, 83, 46, 54, 50, 43, 55, 45, 52, 78, 70, 69, 124, 154, 85, 163, 226, 76, 157, 221, 86, 153, 217, 109, 186, 248, 116, 194, 248, 87, 160, 228, 111, 188, 245, 110, 185, 241, 36, 73, 108, 13, 17, 9, 10, 15, 8, 13, 16, 9, 19, 20, 16, 21, + 21, 17, 30, 31, 25, 63, 85, 85, 87, 156, 197, 91, 168, 230, 88, 164, 223, 83, 146, 198, 77, 113, 135, 90, 136, 177, 95, 138, 182, 93, 151, 214, 103, 172, 245, 102, 170, 246, 102, 168, 244, 96, 157, 229, 96, 143, 196, 96, 152, 219, 97, 151, 220, 87, 94, 123, 105, 114, 137, 101, 133, 189, 101, 138, 198, 102, 129, 181, 98, 120, 161, 104, 112, 128, 106, 97, 98, 116, 135, 163, 111, 160, 223, 103, 146, 209, 114, 148, 204, 105, 154, 219, 119, 146, 196, 120, 136, 171, 118, 145, 193, 118, 136, 181, 123, 148, 198, 118, 150, 202, 113, 157, 219, 110, 156, 219, 111, 155, 217, 122, 151, 192, 124, 139, 176, 113, 145, 197, 116, 152, 205, 106, 150, 213, 103, 159, 227, 104, 155, 216, 107, 148, 194, 101, 162, 231, 102, 167, 245, 103, 168, 244, 103, 169, 245, 102, 167, 247, 100, 168, + 247, 101, 169, 247, 102, 169, 248, 102, 171, 249, 101, 172, 249, 101, 173, 249, 100, 176, 249, 99, 178, 250, 100, 179, 249, 101, 180, 249, 102, 182, 249, 105, 183, 249, 103, 184, 250, 104, 185, 250, 103, 185, 251, 105, 184, 250, 104, 184, 250, 103, 184, 250, 103, 184, 250, 103, 184, 250, 103, 183, 250, 104, 183, 250, 104, 184, 249, 101, 184, 249, 103, 184, 249, 103, 184, 250, 104, 183, 250, 100, 183, 249, 102, 183, 248, 102, 183, 250, 107, 176, 247, 103, 176, 244, 96, 180, 249, 91, 171, 245, 70, 140, 208, 36, 91, 143, 81, 164, 237, 97, 179, 247, 102, 183, 249, 103, 183, 249, 102, 183, 250, 102, 183, 249, 102, 183, 249, 102, 183, 249, 101, 182, 250, 102, 182, 251, 99, 181, 250, 102, 181, 250, 98, 178, 248, 90, 167, 241, 95, 175, 247, 99, 180, 250, 98, 180, 250, 94, 175, 250, + 86, 160, 227, 84, 131, 175, 91, 128, 154, 87, 114, 130, 88, 115, 119, 83, 103, 103, 54, 71, 63, 42, 44, 27, 42, 45, 30, 40, 42, 27, 36, 37, 21, 35, 36, 18, 37, 37, 19, 40, 40, 21, 61, 86, 86, 83, 146, 191, 98, 177, 238, 96, 164, 218, 82, 105, 96, 54, 61, 37, 79, 124, 164, 102, 171, 237, 109, 184, 247, 106, 178, 243, 70, 132, 186, 93, 148, 208, 110, 188, 249, 110, 178, 244, 100, 168, 232, 71, 124, 169, 61, 96, 130, 46, 69, 90, 40, 48, 52, 46, 54, 43, 56, 82, 81, 68, 125, 156, 84, 155, 200, 98, 174, 229, 105, 187, 245, 113, 191, 248, 116, 192, 249, 113, 191, 248, 99, 178, 243, 87, 164, 231, 99, 173, 237, 75, 146, 222, 95, 172, 241, 62, 118, 175, 18, 29, 24, 17, 20, 8, 18, 19, 11, 19, 20, 17, 21, 22, 19, 23, + 26, 22, 68, 104, 120, 112, 191, 246, 120, 195, 249, 112, 189, 247, 109, 187, 248, 108, 184, 249, 99, 169, 234, 102, 171, 240, 101, 171, 239, 94, 153, 222, 102, 164, 237, 99, 160, 233, 98, 151, 220, 91, 139, 204, 98, 146, 204, 98, 154, 221, 87, 122, 180, 85, 80, 87, 105, 105, 116, 99, 120, 155, 106, 140, 196, 104, 124, 167, 101, 120, 157, 108, 96, 92, 106, 91, 83, 118, 147, 189, 106, 139, 194, 112, 147, 199, 114, 143, 191, 109, 144, 199, 120, 132, 163, 128, 129, 148, 128, 139, 169, 132, 142, 177, 126, 146, 184, 121, 146, 191, 123, 147, 194, 119, 150, 202, 124, 146, 187, 126, 127, 143, 125, 149, 190, 124, 155, 203, 121, 152, 205, 114, 154, 215, 107, 160, 225, 104, 154, 213, 104, 162, 227, 101, 169, 241, 104, 168, 245, 103, 168, 245, 102, 167, 245, 102, 167, 244, 102, 168, + 244, 101, 167, 245, 99, 169, 245, 102, 169, 247, 102, 170, 247, 103, 171, 248, 100, 174, 249, 100, 174, 248, 100, 177, 249, 100, 179, 250, 99, 181, 249, 101, 182, 248, 102, 184, 248, 104, 185, 248, 104, 185, 250, 106, 184, 250, 106, 184, 250, 105, 184, 250, 105, 185, 248, 105, 184, 251, 104, 184, 251, 104, 183, 251, 100, 185, 250, 103, 184, 249, 102, 184, 250, 103, 184, 249, 102, 184, 250, 105, 185, 250, 101, 183, 249, 102, 183, 249, 101, 180, 250, 100, 174, 245, 103, 182, 248, 101, 184, 249, 92, 174, 249, 58, 121, 183, 83, 164, 232, 104, 183, 250, 103, 184, 250, 102, 184, 249, 104, 183, 250, 102, 183, 249, 101, 183, 249, 103, 184, 251, 103, 183, 250, 104, 183, 248, 102, 180, 248, 99, 173, 243, 97, 168, 239, 95, 172, 244, 98, 179, 248, 100, 182, 250, 100, 181, 250, 95, 177, 251, + 79, 137, 193, 84, 94, 87, 94, 95, 58, 93, 93, 51, 84, 83, 35, 69, 69, 24, 56, 57, 16, 51, 52, 28, 40, 41, 20, 31, 33, 15, 24, 24, 9, 30, 35, 21, 49, 71, 70, 78, 133, 167, 99, 179, 244, 112, 191, 249, 114, 193, 249, 111, 190, 248, 92, 156, 215, 78, 106, 104, 64, 98, 118, 74, 113, 144, 85, 118, 153, 91, 150, 214, 69, 133, 194, 99, 152, 207, 94, 158, 221, 80, 134, 185, 70, 83, 90, 39, 49, 34, 42, 64, 62, 62, 102, 117, 82, 148, 186, 93, 174, 232, 104, 187, 246, 111, 192, 250, 114, 192, 250, 116, 192, 250, 115, 193, 250, 116, 193, 251, 116, 192, 250, 119, 193, 250, 116, 193, 249, 111, 190, 248, 98, 176, 239, 71, 137, 192, 62, 120, 182, 29, 40, 37, 23, 26, 6, 27, 29, 13, 26, 29, 19, 21, 22, 20, 22, 22, 19, 45, + 56, 52, 98, 167, 220, 113, 172, 224, 112, 181, 239, 107, 183, 247, 105, 180, 247, 106, 178, 247, 106, 180, 248, 107, 179, 248, 105, 172, 244, 93, 150, 220, 86, 134, 203, 89, 138, 205, 87, 121, 176, 96, 140, 196, 96, 142, 207, 102, 149, 212, 93, 98, 131, 88, 68, 58, 107, 99, 99, 107, 115, 136, 109, 130, 171, 105, 118, 151, 105, 112, 133, 115, 92, 76, 120, 95, 78, 116, 121, 140, 104, 132, 173, 111, 145, 195, 120, 133, 164, 123, 139, 173, 125, 123, 135, 133, 123, 124, 129, 131, 148, 144, 138, 145, 138, 144, 165, 139, 137, 147, 127, 146, 178, 141, 152, 177, 142, 142, 159, 135, 143, 168, 131, 152, 190, 126, 144, 184, 125, 147, 192, 115, 152, 203, 107, 152, 206, 103, 163, 231, 105, 171, 245, 105, 168, 243, 104, 167, 240, 101, 166, 240, 102, 167, 241, 103, 167, 244, 101, 168, + 244, 101, 167, 243, 101, 167, 244, 100, 169, 246, 99, 170, 246, 100, 171, 247, 101, 172, 248, 101, 173, 248, 100, 175, 248, 100, 176, 249, 100, 178, 250, 101, 178, 249, 101, 181, 248, 104, 184, 248, 104, 185, 248, 106, 185, 248, 106, 185, 249, 105, 184, 250, 105, 185, 248, 106, 184, 249, 106, 184, 250, 105, 184, 251, 102, 185, 251, 103, 184, 251, 102, 184, 250, 103, 184, 251, 102, 184, 250, 104, 184, 251, 105, 184, 251, 103, 184, 249, 104, 185, 250, 100, 179, 249, 96, 174, 245, 102, 184, 247, 98, 180, 250, 70, 130, 195, 76, 150, 218, 104, 185, 250, 104, 184, 249, 102, 185, 250, 100, 182, 248, 88, 165, 234, 80, 155, 220, 96, 176, 244, 102, 183, 248, 104, 181, 248, 105, 171, 239, 101, 168, 236, 98, 178, 247, 102, 182, 249, 102, 183, 250, 100, 183, 251, 101, 182, 249, 97, 179, 252, + 84, 90, 73, 88, 87, 50, 89, 93, 60, 84, 86, 56, 65, 63, 29, 58, 56, 16, 48, 48, 12, 31, 32, 11, 31, 33, 10, 40, 43, 21, 47, 61, 48, 70, 140, 186, 99, 180, 240, 110, 190, 250, 113, 191, 250, 114, 191, 251, 115, 190, 251, 111, 190, 250, 102, 181, 248, 95, 171, 230, 80, 125, 163, 72, 144, 218, 72, 126, 173, 72, 108, 126, 51, 86, 110, 32, 70, 114, 47, 52, 47, 48, 49, 32, 87, 114, 120, 93, 170, 220, 107, 187, 241, 117, 193, 247, 116, 193, 248, 116, 193, 249, 114, 192, 249, 116, 192, 250, 117, 192, 250, 116, 192, 250, 116, 192, 250, 117, 193, 251, 119, 192, 250, 120, 193, 251, 118, 194, 247, 118, 195, 248, 121, 197, 248, 88, 160, 224, 38, 65, 78, 29, 32, 10, 34, 36, 15, 39, 38, 19, 31, 32, 22, 26, 25, 21, 34, 35, 26, 88, + 140, 175, 101, 173, 238, 98, 163, 229, 96, 143, 192, 107, 168, 234, 100, 168, 238, 102, 157, 231, 104, 171, 242, 104, 174, 246, 104, 168, 239, 88, 141, 207, 84, 107, 155, 86, 115, 168, 88, 101, 134, 99, 129, 172, 105, 147, 205, 106, 138, 192, 93, 94, 116, 95, 64, 42, 119, 88, 70, 114, 101, 98, 108, 102, 104, 110, 115, 129, 105, 102, 115, 115, 81, 58, 124, 88, 61, 111, 117, 135, 107, 149, 203, 116, 148, 189, 124, 122, 129, 121, 119, 126, 126, 110, 102, 125, 100, 86, 139, 118, 106, 150, 131, 119, 144, 130, 124, 132, 136, 149, 139, 147, 169, 140, 152, 180, 148, 151, 164, 141, 154, 184, 141, 146, 170, 135, 139, 162, 120, 147, 189, 111, 152, 203, 109, 164, 229, 107, 169, 239, 108, 171, 240, 107, 163, 232, 105, 167, 237, 105, 166, 239, 101, 168, 239, 101, 168, 241, 100, 166, + 240, 101, 167, 241, 100, 166, 242, 101, 168, 244, 100, 169, 245, 101, 170, 246, 102, 170, 246, 103, 170, 248, 100, 172, 248, 100, 174, 249, 101, 175, 250, 99, 178, 249, 98, 180, 249, 100, 180, 249, 103, 182, 250, 102, 185, 249, 107, 184, 248, 109, 186, 250, 105, 185, 250, 102, 186, 250, 103, 185, 250, 103, 185, 250, 104, 185, 250, 104, 185, 251, 101, 184, 249, 103, 184, 249, 105, 184, 250, 105, 184, 250, 104, 185, 249, 105, 184, 249, 104, 183, 250, 102, 182, 250, 94, 172, 247, 99, 179, 246, 102, 184, 248, 77, 140, 207, 67, 137, 203, 103, 183, 248, 107, 186, 250, 105, 185, 250, 99, 177, 249, 79, 155, 213, 75, 149, 222, 76, 137, 195, 88, 154, 228, 108, 170, 234, 104, 173, 240, 102, 183, 246, 102, 184, 250, 102, 184, 250, 106, 183, 251, 104, 184, 251, 102, 184, 250, 88, 166, 245, + 85, 85, 49, 90, 87, 39, 67, 68, 31, 57, 55, 19, 43, 40, 8, 64, 62, 20, 48, 55, 35, 46, 71, 73, 63, 108, 134, 86, 153, 197, 95, 171, 228, 101, 179, 240, 112, 191, 249, 112, 190, 249, 111, 190, 250, 111, 190, 250, 114, 190, 250, 113, 189, 250, 101, 178, 246, 107, 185, 246, 89, 159, 217, 89, 133, 168, 91, 150, 197, 63, 119, 187, 42, 59, 59, 29, 35, 24, 38, 53, 52, 54, 64, 61, 84, 131, 177, 91, 157, 219, 101, 167, 220, 107, 168, 221, 107, 178, 238, 109, 187, 249, 111, 189, 250, 113, 190, 249, 111, 189, 249, 110, 187, 249, 111, 189, 250, 111, 187, 249, 112, 185, 248, 110, 183, 247, 107, 183, 246, 109, 180, 245, 116, 170, 226, 75, 122, 164, 40, 45, 19, 33, 36, 10, 44, 44, 20, 43, 42, 26, 33, 34, 26, 31, 30, 23, 80, 98, 114, 119, + 168, 234, 110, 166, 233, 106, 174, 243, 95, 129, 174, 101, 136, 187, 107, 165, 232, 98, 144, 208, 98, 137, 199, 99, 144, 207, 106, 158, 227, 101, 138, 195, 89, 95, 121, 87, 90, 115, 98, 104, 124, 102, 117, 147, 96, 123, 171, 105, 119, 153, 96, 77, 71, 103, 62, 31, 115, 78, 49, 112, 87, 72, 114, 100, 93, 114, 111, 117, 105, 95, 96, 116, 75, 42, 123, 86, 56, 122, 148, 186, 117, 173, 236, 118, 146, 185, 121, 111, 111, 133, 117, 105, 136, 102, 71, 133, 96, 60, 146, 116, 90, 150, 128, 112, 145, 137, 135, 140, 123, 117, 149, 142, 143, 145, 145, 162, 144, 136, 135, 143, 140, 152, 142, 140, 146, 133, 143, 163, 111, 159, 219, 110, 168, 234, 110, 165, 232, 110, 164, 231, 116, 160, 219, 118, 155, 212, 116, 159, 222, 109, 164, 232, 107, 167, 236, 105, 164, 234, 101, 157, + 228, 101, 158, 230, 100, 160, 235, 99, 165, 239, 101, 167, 244, 100, 168, 245, 99, 168, 243, 102, 169, 247, 101, 170, 246, 102, 172, 247, 101, 173, 249, 99, 175, 248, 100, 177, 249, 102, 178, 249, 102, 179, 249, 102, 181, 248, 103, 183, 249, 104, 185, 249, 105, 186, 250, 105, 185, 250, 106, 186, 249, 105, 186, 251, 105, 185, 250, 104, 185, 250, 105, 185, 250, 105, 185, 249, 103, 186, 250, 105, 185, 249, 106, 184, 250, 105, 185, 250, 103, 185, 250, 104, 185, 250, 100, 182, 250, 97, 178, 248, 100, 185, 249, 81, 152, 221, 56, 119, 188, 98, 174, 243, 106, 185, 249, 105, 186, 250, 102, 184, 249, 95, 175, 249, 96, 168, 240, 89, 153, 229, 75, 123, 175, 71, 132, 204, 86, 159, 224, 96, 175, 244, 102, 183, 250, 106, 185, 251, 104, 185, 251, 102, 182, 251, 82, 155, 230, 47, 89, 129, + 76, 75, 42, 89, 86, 39, 48, 48, 16, 52, 53, 27, 59, 64, 44, 89, 95, 52, 86, 159, 213, 101, 180, 246, 110, 190, 249, 114, 192, 248, 116, 191, 249, 114, 191, 248, 112, 191, 250, 109, 185, 248, 107, 185, 249, 113, 190, 250, 115, 191, 251, 113, 189, 250, 102, 176, 245, 97, 176, 246, 109, 186, 246, 85, 149, 213, 88, 108, 99, 76, 80, 48, 44, 49, 23, 85, 139, 161, 79, 154, 222, 75, 130, 183, 61, 95, 125, 60, 87, 105, 77, 112, 130, 83, 98, 93, 82, 112, 131, 79, 133, 185, 77, 141, 209, 76, 142, 213, 67, 133, 201, 61, 126, 188, 62, 127, 196, 62, 133, 210, 69, 142, 223, 77, 153, 234, 89, 165, 242, 117, 171, 236, 130, 169, 211, 57, 68, 56, 40, 42, 8, 42, 42, 10, 50, 50, 27, 44, 43, 26, 36, 36, 23, 54, 47, 32, 133, 140, 156, 135, + 156, 201, 124, 143, 188, 106, 129, 176, 113, 141, 179, 113, 146, 199, 106, 122, 162, 112, 166, 228, 107, 134, 182, 118, 129, 166, 105, 110, 145, 105, 112, 139, 106, 97, 98, 103, 88, 80, 92, 80, 77, 103, 98, 99, 106, 116, 129, 109, 106, 107, 104, 72, 48, 99, 55, 21, 119, 75, 34, 114, 82, 59, 117, 91, 78, 117, 109, 112, 117, 83, 61, 113, 67, 28, 114, 80, 56, 127, 161, 207, 120, 172, 233, 122, 114, 120, 122, 102, 95, 132, 98, 73, 144, 96, 47, 138, 91, 41, 144, 108, 74, 148, 132, 124, 145, 123, 110, 150, 116, 82, 157, 138, 125, 151, 125, 109, 134, 128, 126, 145, 135, 132, 145, 133, 129, 122, 152, 193, 115, 162, 227, 112, 164, 232, 119, 155, 208, 119, 149, 197, 131, 138, 164, 120, 155, 205, 111, 164, 228, 111, 164, 233, 110, 155, 222, 104, 139, 197, 103, 144, + 203, 99, 147, 213, 102, 161, 230, 98, 160, 232, 95, 159, 234, 97, 162, 240, 101, 166, 242, 102, 169, 246, 101, 169, 245, 102, 170, 245, 102, 171, 248, 100, 173, 249, 101, 174, 249, 102, 176, 249, 100, 178, 250, 100, 180, 249, 100, 181, 249, 104, 184, 249, 105, 184, 249, 106, 186, 248, 104, 186, 250, 106, 187, 251, 104, 186, 250, 104, 185, 249, 108, 185, 251, 105, 186, 250, 105, 185, 250, 104, 185, 250, 106, 186, 249, 105, 185, 250, 103, 185, 250, 102, 185, 250, 101, 185, 249, 100, 179, 249, 103, 182, 247, 85, 160, 233, 53, 118, 187, 92, 169, 242, 102, 180, 248, 104, 184, 250, 98, 178, 249, 94, 172, 246, 91, 154, 225, 92, 132, 179, 82, 143, 208, 79, 145, 210, 87, 159, 234, 79, 142, 198, 77, 146, 218, 100, 177, 244, 99, 179, 249, 74, 139, 217, 35, 69, 105, 33, 82, 136, + 59, 62, 35, 73, 82, 53, 67, 123, 164, 78, 123, 155, 86, 99, 97, 100, 131, 122, 110, 187, 249, 114, 190, 248, 114, 191, 249, 115, 191, 249, 114, 190, 248, 114, 190, 251, 114, 191, 249, 104, 176, 241, 109, 186, 246, 114, 190, 251, 113, 191, 251, 115, 191, 250, 105, 179, 245, 95, 174, 247, 91, 168, 241, 43, 84, 138, 35, 45, 38, 85, 102, 76, 89, 124, 130, 97, 164, 212, 99, 171, 234, 96, 170, 240, 82, 147, 212, 70, 136, 193, 69, 132, 191, 80, 152, 217, 85, 161, 220, 82, 155, 217, 77, 149, 212, 70, 142, 204, 63, 132, 190, 51, 111, 160, 53, 116, 174, 55, 119, 181, 57, 121, 185, 61, 126, 186, 70, 133, 185, 87, 128, 172, 77, 99, 107, 45, 49, 11, 47, 49, 16, 51, 51, 18, 50, 49, 28, 43, 41, 28, 40, 35, 24, 98, 74, 48, 134, 115, 99, 126, + 119, 117, 105, 104, 110, 98, 96, 98, 110, 115, 124, 109, 123, 148, 110, 109, 120, 121, 103, 98, 118, 115, 122, 125, 117, 117, 126, 114, 109, 125, 99, 85, 132, 96, 66, 129, 94, 68, 117, 82, 57, 105, 91, 87, 116, 116, 128, 114, 98, 93, 113, 73, 40, 105, 60, 20, 111, 68, 24, 117, 76, 41, 116, 75, 45, 121, 90, 69, 116, 71, 32, 122, 70, 26, 117, 75, 41, 123, 146, 188, 110, 137, 176, 111, 96, 91, 124, 91, 69, 135, 82, 35, 150, 97, 40, 146, 98, 49, 144, 101, 67, 155, 113, 85, 152, 107, 68, 157, 105, 53, 160, 114, 66, 147, 109, 74, 143, 112, 88, 155, 120, 87, 150, 128, 112, 127, 144, 173, 123, 143, 186, 132, 142, 164, 139, 138, 150, 144, 133, 135, 133, 140, 165, 122, 153, 207, 117, 156, 215, 116, 134, 172, 115, 115, 130, 109, 121, 155, 102, 134, + 187, 101, 150, 215, 100, 155, 226, 99, 160, 229, 97, 161, 235, 99, 165, 238, 100, 168, 242, 101, 168, 246, 100, 169, 246, 100, 169, 246, 102, 169, 247, 101, 170, 249, 101, 172, 249, 101, 173, 249, 100, 175, 250, 100, 177, 250, 101, 179, 250, 100, 181, 248, 103, 182, 249, 103, 184, 249, 107, 185, 251, 106, 186, 251, 106, 185, 249, 104, 184, 250, 100, 176, 245, 104, 183, 247, 104, 186, 250, 104, 186, 250, 104, 186, 250, 105, 185, 250, 103, 185, 250, 105, 186, 249, 105, 185, 249, 94, 170, 242, 90, 164, 237, 75, 142, 210, 33, 72, 112, 63, 120, 175, 78, 133, 187, 83, 144, 210, 83, 138, 201, 76, 138, 208, 86, 152, 223, 93, 168, 239, 96, 170, 240, 96, 166, 237, 102, 169, 239, 101, 180, 247, 90, 168, 236, 71, 137, 204, 49, 96, 148, 25, 62, 94, 49, 115, 179, 88, 167, 239, + 58, 115, 164, 65, 107, 121, 86, 130, 144, 70, 108, 138, 93, 94, 46, 93, 137, 156, 103, 175, 239, 101, 176, 246, 96, 175, 247, 104, 185, 249, 113, 191, 248, 114, 192, 250, 111, 188, 247, 100, 167, 227, 109, 188, 247, 116, 192, 249, 116, 192, 251, 116, 192, 250, 106, 183, 245, 66, 136, 207, 23, 56, 97, 29, 43, 45, 81, 135, 164, 99, 181, 242, 88, 134, 168, 93, 123, 135, 102, 178, 241, 102, 183, 249, 102, 177, 244, 109, 189, 247, 92, 173, 237, 78, 144, 206, 94, 168, 229, 109, 184, 243, 111, 189, 248, 109, 188, 248, 97, 178, 247, 94, 173, 242, 105, 185, 248, 104, 187, 248, 103, 186, 248, 102, 185, 247, 94, 176, 244, 75, 135, 193, 53, 61, 33, 54, 56, 8, 51, 52, 13, 47, 44, 11, 55, 51, 28, 50, 45, 30, 76, 62, 35, 125, 103, 61, 117, 93, 56, 114, + 98, 74, 107, 90, 64, 95, 77, 56, 115, 94, 75, 121, 97, 78, 127, 101, 81, 137, 99, 69, 141, 102, 71, 133, 111, 99, 134, 118, 111, 143, 106, 80, 151, 100, 54, 154, 102, 54, 139, 90, 48, 117, 80, 50, 113, 106, 110, 126, 94, 74, 113, 66, 25, 113, 64, 21, 120, 72, 28, 110, 65, 24, 112, 65, 28, 123, 75, 34, 133, 78, 27, 124, 66, 22, 137, 81, 37, 123, 124, 136, 104, 104, 114, 106, 93, 90, 113, 64, 32, 146, 87, 25, 151, 93, 31, 149, 91, 36, 140, 93, 49, 160, 105, 48, 158, 101, 43, 165, 106, 43, 148, 100, 41, 138, 97, 66, 147, 107, 74, 152, 121, 95, 142, 141, 148, 132, 140, 165, 143, 136, 145, 151, 129, 115, 161, 125, 102, 152, 124, 108, 128, 143, 174, 137, 142, 168, 138, 124, 129, 127, 107, 99, 114, 112, 127, 110, 141, 192, 107, 156, + 218, 103, 155, 223, 101, 158, 227, 102, 160, 231, 102, 166, 238, 103, 168, 242, 102, 169, 243, 103, 169, 247, 102, 168, 246, 102, 168, 246, 101, 169, 246, 100, 170, 247, 101, 170, 247, 104, 171, 248, 103, 172, 251, 99, 175, 249, 101, 176, 250, 102, 178, 250, 101, 180, 248, 102, 182, 249, 104, 183, 250, 105, 186, 251, 106, 186, 249, 102, 181, 250, 94, 165, 231, 100, 178, 243, 106, 185, 250, 104, 186, 250, 103, 186, 249, 105, 185, 250, 106, 185, 250, 106, 185, 249, 107, 184, 249, 92, 171, 242, 88, 163, 231, 75, 148, 217, 32, 71, 104, 58, 132, 203, 86, 158, 229, 87, 163, 236, 91, 165, 237, 90, 165, 237, 104, 184, 248, 100, 181, 249, 100, 181, 248, 103, 178, 249, 98, 160, 232, 91, 168, 241, 79, 153, 223, 43, 86, 123, 27, 63, 94, 47, 105, 161, 75, 151, 223, 99, 182, 248, + 64, 134, 203, 54, 101, 128, 92, 118, 96, 88, 102, 88, 81, 87, 41, 77, 114, 115, 93, 146, 188, 84, 152, 215, 90, 162, 227, 105, 182, 249, 117, 192, 247, 117, 192, 249, 109, 184, 244, 104, 164, 216, 112, 190, 248, 116, 192, 250, 114, 192, 249, 105, 184, 244, 54, 107, 168, 15, 29, 37, 46, 69, 75, 97, 173, 230, 112, 187, 249, 116, 196, 249, 105, 182, 242, 78, 122, 160, 108, 153, 189, 109, 187, 247, 108, 187, 249, 106, 183, 249, 113, 191, 248, 103, 183, 245, 90, 167, 233, 88, 152, 211, 93, 156, 215, 99, 164, 230, 104, 176, 247, 96, 175, 246, 95, 168, 241, 114, 190, 249, 106, 186, 248, 117, 193, 248, 119, 195, 249, 67, 122, 167, 61, 64, 22, 77, 78, 27, 66, 65, 21, 47, 42, 11, 56, 52, 32, 60, 49, 29, 113, 89, 56, 115, 88, 60, 118, 95, 67, 112, + 91, 62, 107, 80, 53, 100, 70, 46, 120, 84, 58, 135, 93, 60, 135, 95, 62, 147, 104, 73, 149, 99, 56, 159, 108, 61, 142, 100, 68, 146, 106, 78, 150, 96, 49, 151, 89, 33, 168, 111, 50, 148, 95, 44, 100, 67, 48, 126, 87, 56, 122, 69, 27, 116, 61, 16, 121, 63, 17, 124, 70, 25, 127, 71, 27, 112, 59, 19, 129, 69, 19, 128, 69, 17, 147, 89, 31, 136, 95, 60, 101, 81, 69, 96, 67, 44, 90, 44, 12, 156, 89, 26, 153, 92, 35, 149, 85, 28, 147, 88, 30, 162, 95, 32, 147, 87, 33, 163, 101, 40, 158, 102, 43, 142, 95, 50, 151, 104, 57, 140, 120, 105, 138, 131, 134, 152, 130, 114, 159, 122, 93, 167, 124, 83, 164, 122, 82, 145, 120, 103, 146, 115, 95, 151, 108, 72, 138, 103, 76, 133, 123, 126, 111, 139, 183, 108, 154, 220, 104, 144, + 206, 103, 151, 217, 105, 165, 237, 106, 169, 243, 104, 168, 242, 102, 168, 244, 102, 167, 243, 103, 167, 241, 102, 168, 245, 102, 169, 246, 101, 169, 244, 102, 169, 247, 101, 170, 247, 102, 169, 247, 103, 171, 247, 103, 172, 247, 101, 173, 249, 105, 173, 250, 101, 177, 249, 101, 180, 249, 101, 180, 249, 104, 182, 251, 104, 184, 250, 104, 185, 251, 95, 168, 236, 100, 175, 237, 110, 185, 250, 109, 186, 250, 107, 187, 250, 107, 187, 250, 109, 185, 250, 109, 185, 250, 107, 185, 250, 106, 185, 249, 108, 186, 249, 95, 173, 246, 50, 107, 161, 78, 159, 230, 108, 186, 248, 106, 186, 250, 102, 181, 249, 98, 173, 241, 104, 185, 247, 105, 187, 250, 101, 179, 248, 109, 187, 247, 92, 168, 239, 59, 112, 182, 30, 59, 89, 36, 96, 154, 80, 162, 231, 99, 181, 248, 79, 151, 221, 77, 158, 230, + 53, 115, 169, 55, 91, 90, 91, 105, 80, 109, 107, 57, 77, 106, 97, 90, 149, 179, 107, 186, 248, 100, 174, 233, 96, 170, 242, 105, 182, 249, 110, 188, 248, 110, 185, 248, 104, 170, 234, 114, 177, 229, 119, 192, 247, 113, 190, 249, 89, 157, 221, 45, 82, 119, 41, 53, 54, 56, 97, 121, 70, 127, 173, 95, 164, 228, 104, 178, 246, 116, 194, 248, 115, 192, 248, 96, 169, 238, 75, 111, 148, 94, 139, 174, 111, 185, 244, 109, 188, 247, 114, 191, 250, 119, 193, 249, 116, 193, 249, 112, 191, 249, 109, 186, 248, 100, 177, 240, 91, 162, 229, 87, 151, 218, 92, 161, 235, 94, 154, 217, 99, 149, 187, 103, 170, 228, 93, 154, 209, 57, 68, 50, 55, 56, 3, 67, 64, 16, 46, 43, 10, 57, 49, 15, 65, 56, 32, 86, 67, 39, 131, 106, 66, 124, 97, 58, 114, 81, 43, 114, + 77, 37, 122, 82, 43, 123, 85, 47, 117, 78, 42, 122, 79, 41, 129, 82, 41, 144, 94, 55, 154, 104, 60, 157, 99, 45, 163, 106, 51, 156, 102, 56, 157, 100, 52, 154, 94, 35, 166, 103, 42, 169, 109, 49, 151, 95, 42, 134, 80, 35, 145, 87, 33, 121, 66, 20, 127, 70, 22, 121, 68, 20, 120, 67, 19, 128, 73, 25, 122, 64, 15, 136, 72, 21, 145, 85, 27, 155, 100, 46, 105, 81, 64, 82, 47, 23, 121, 68, 26, 155, 92, 33, 153, 92, 30, 164, 100, 33, 131, 76, 20, 138, 83, 25, 162, 105, 45, 162, 100, 45, 162, 109, 48, 145, 95, 40, 149, 110, 73, 140, 116, 102, 150, 111, 77, 167, 121, 73, 170, 115, 61, 169, 116, 63, 158, 104, 51, 148, 94, 46, 148, 95, 47, 146, 106, 72, 134, 116, 108, 121, 137, 168, 110, 140, 190, 106, 144, 203, 110, 162, + 226, 109, 168, 238, 108, 172, 244, 106, 170, 242, 103, 165, 237, 103, 163, 235, 101, 162, 236, 99, 162, 232, 103, 167, 243, 102, 169, 246, 103, 169, 243, 102, 169, 245, 103, 168, 244, 103, 169, 246, 102, 170, 247, 101, 172, 246, 102, 171, 248, 104, 172, 249, 102, 175, 249, 102, 177, 248, 100, 180, 249, 101, 181, 250, 104, 182, 250, 104, 183, 250, 98, 172, 241, 98, 173, 237, 110, 186, 250, 107, 187, 250, 107, 187, 250, 107, 186, 250, 110, 186, 250, 109, 186, 251, 108, 186, 251, 107, 186, 250, 109, 187, 249, 95, 176, 247, 51, 110, 164, 76, 157, 229, 107, 187, 249, 107, 187, 250, 104, 184, 250, 99, 173, 245, 106, 182, 246, 108, 187, 248, 100, 180, 249, 89, 165, 237, 57, 105, 154, 22, 48, 75, 37, 94, 152, 92, 170, 235, 109, 189, 248, 110, 188, 250, 96, 176, 245, 67, 132, 198, + 49, 94, 121, 56, 77, 50, 95, 95, 64, 94, 108, 92, 74, 102, 94, 96, 163, 210, 110, 186, 248, 108, 187, 249, 106, 181, 246, 101, 170, 239, 92, 158, 209, 91, 149, 191, 106, 143, 164, 111, 177, 227, 111, 187, 245, 71, 132, 192, 43, 57, 63, 53, 68, 60, 95, 165, 208, 108, 188, 248, 100, 181, 245, 69, 132, 198, 75, 131, 191, 103, 181, 246, 113, 191, 248, 107, 180, 247, 82, 161, 228, 63, 106, 136, 90, 135, 170, 111, 183, 243, 116, 193, 250, 119, 193, 250, 119, 194, 251, 119, 194, 251, 119, 194, 250, 109, 187, 248, 101, 179, 246, 102, 180, 248, 115, 191, 250, 95, 173, 229, 87, 152, 177, 85, 152, 203, 80, 87, 74, 82, 75, 29, 65, 59, 15, 49, 41, 7, 45, 33, 12, 73, 57, 25, 85, 64, 32, 109, 81, 43, 108, 79, 39, 103, 76, 36, 106, 77, 38, 114, + 76, 33, 123, 77, 30, 141, 90, 35, 134, 87, 43, 117, 73, 33, 113, 63, 24, 123, 67, 23, 149, 94, 43, 162, 109, 55, 163, 100, 44, 170, 109, 46, 153, 96, 38, 160, 99, 42, 157, 96, 37, 171, 106, 41, 173, 112, 48, 162, 103, 39, 145, 84, 23, 129, 71, 19, 132, 71, 16, 136, 75, 23, 118, 65, 17, 122, 62, 19, 126, 66, 19, 135, 71, 13, 136, 72, 19, 156, 94, 33, 141, 94, 46, 66, 31, 12, 122, 68, 21, 169, 103, 39, 168, 101, 33, 159, 94, 25, 149, 94, 37, 166, 102, 40, 169, 106, 41, 170, 110, 44, 158, 105, 44, 152, 98, 48, 149, 97, 49, 146, 95, 43, 172, 120, 64, 181, 121, 57, 168, 108, 43, 143, 85, 33, 128, 67, 20, 146, 83, 28, 155, 103, 57, 134, 106, 89, 120, 127, 151, 117, 126, 155, 115, 156, 209, 114, 165, 227, 111, 169, + 236, 110, 169, 238, 107, 157, 223, 106, 147, 207, 102, 144, 210, 100, 153, 222, 101, 156, 222, 102, 158, 221, 102, 165, 239, 101, 164, 240, 102, 167, 241, 102, 165, 236, 102, 166, 237, 103, 169, 243, 101, 169, 246, 103, 171, 244, 102, 170, 246, 103, 171, 248, 102, 173, 249, 100, 176, 249, 102, 176, 249, 101, 179, 249, 103, 180, 250, 103, 181, 249, 97, 174, 245, 96, 169, 237, 105, 182, 248, 106, 185, 249, 109, 187, 250, 109, 187, 251, 106, 187, 250, 106, 186, 249, 108, 186, 250, 109, 187, 251, 107, 188, 249, 97, 177, 247, 56, 112, 170, 75, 156, 226, 108, 187, 250, 109, 189, 251, 107, 188, 249, 100, 178, 249, 105, 181, 247, 102, 180, 249, 75, 140, 210, 40, 73, 110, 20, 53, 80, 55, 122, 197, 75, 149, 226, 94, 169, 238, 110, 188, 248, 111, 188, 250, 104, 186, 249, 82, 155, 225, + 45, 76, 78, 34, 42, 18, 65, 70, 52, 74, 112, 123, 87, 121, 106, 98, 173, 234, 105, 183, 249, 101, 181, 246, 85, 152, 204, 84, 120, 120, 92, 113, 73, 95, 137, 135, 107, 150, 172, 81, 147, 217, 35, 76, 121, 30, 42, 46, 75, 118, 136, 106, 182, 233, 114, 193, 249, 115, 192, 249, 114, 192, 248, 100, 172, 242, 87, 153, 222, 80, 155, 227, 90, 163, 231, 103, 180, 246, 107, 185, 249, 88, 164, 228, 73, 129, 180, 85, 120, 153, 104, 170, 225, 118, 192, 250, 119, 194, 250, 117, 194, 249, 118, 192, 248, 108, 185, 247, 93, 162, 223, 92, 161, 211, 101, 179, 243, 92, 167, 227, 71, 125, 138, 77, 105, 103, 81, 79, 27, 79, 69, 27, 91, 69, 31, 100, 71, 30, 96, 65, 30, 94, 65, 31, 94, 65, 29, 100, 74, 30, 102, 73, 30, 104, 73, 36, 96, 65, 27, 97, + 59, 22, 108, 60, 21, 122, 70, 21, 137, 80, 26, 138, 83, 30, 106, 59, 18, 101, 53, 12, 124, 67, 19, 153, 97, 42, 161, 104, 50, 166, 103, 44, 163, 100, 37, 149, 88, 30, 162, 98, 37, 161, 97, 37, 165, 97, 32, 167, 100, 36, 162, 101, 37, 149, 84, 25, 135, 71, 17, 155, 88, 27, 149, 85, 23, 134, 74, 22, 120, 58, 13, 136, 73, 22, 142, 77, 21, 151, 87, 33, 172, 105, 33, 88, 45, 13, 111, 63, 25, 158, 91, 28, 173, 104, 31, 159, 90, 27, 155, 93, 31, 163, 98, 36, 159, 94, 29, 172, 112, 46, 165, 109, 50, 161, 105, 47, 149, 94, 38, 174, 117, 53, 180, 118, 49, 174, 108, 44, 136, 80, 29, 119, 63, 16, 140, 77, 22, 143, 81, 29, 140, 85, 44, 125, 91, 70, 120, 106, 103, 125, 137, 169, 123, 150, 202, 120, 154, 206, 116, 143, + 186, 119, 130, 158, 119, 124, 151, 109, 138, 187, 106, 160, 227, 104, 162, 232, 99, 154, 219, 98, 156, 221, 98, 158, 225, 101, 159, 227, 102, 159, 224, 102, 155, 213, 101, 160, 229, 102, 168, 242, 102, 168, 243, 103, 169, 246, 102, 170, 246, 103, 172, 246, 102, 172, 248, 101, 173, 249, 101, 174, 249, 102, 176, 250, 103, 178, 248, 104, 180, 249, 96, 165, 237, 91, 150, 215, 100, 175, 246, 102, 178, 249, 104, 183, 247, 108, 187, 251, 107, 188, 250, 108, 187, 250, 108, 187, 250, 109, 187, 251, 111, 188, 249, 98, 177, 247, 54, 111, 170, 78, 156, 226, 110, 189, 250, 112, 189, 251, 110, 189, 249, 103, 182, 251, 93, 163, 236, 65, 125, 177, 31, 48, 59, 25, 63, 102, 70, 142, 210, 100, 181, 248, 92, 166, 238, 83, 152, 221, 105, 182, 245, 112, 189, 249, 112, 190, 249, 102, 182, 249, + 69, 76, 48, 67, 67, 34, 77, 126, 155, 68, 103, 95, 84, 144, 171, 83, 151, 209, 84, 149, 203, 78, 134, 164, 77, 107, 82, 90, 119, 80, 101, 160, 186, 93, 166, 229, 72, 118, 159, 38, 54, 72, 40, 56, 57, 90, 148, 181, 113, 191, 247, 116, 192, 249, 116, 192, 250, 117, 192, 250, 116, 192, 249, 107, 185, 247, 100, 173, 246, 106, 181, 247, 94, 173, 241, 84, 154, 227, 94, 168, 235, 109, 187, 247, 92, 169, 231, 63, 112, 148, 72, 107, 123, 101, 165, 218, 111, 190, 248, 109, 187, 249, 105, 182, 246, 99, 177, 247, 85, 149, 208, 70, 114, 140, 79, 130, 172, 74, 126, 179, 75, 98, 95, 85, 79, 35, 89, 76, 23, 92, 74, 29, 95, 74, 33, 107, 69, 29, 129, 83, 35, 134, 87, 38, 129, 87, 35, 120, 80, 34, 107, 72, 27, 103, 69, 29, 100, 63, 27, 97, + 61, 25, 100, 58, 20, 111, 61, 19, 134, 77, 27, 150, 88, 32, 148, 90, 33, 110, 62, 18, 112, 59, 19, 122, 65, 17, 158, 97, 41, 160, 97, 39, 162, 98, 36, 152, 88, 31, 152, 89, 30, 150, 82, 26, 161, 92, 29, 159, 90, 29, 157, 90, 28, 153, 85, 23, 157, 92, 33, 150, 81, 21, 170, 96, 29, 161, 91, 27, 140, 73, 18, 120, 58, 14, 147, 82, 22, 141, 76, 21, 166, 97, 27, 157, 102, 41, 124, 68, 23, 150, 78, 15, 173, 104, 32, 150, 84, 23, 149, 84, 25, 167, 101, 34, 162, 97, 31, 167, 105, 41, 158, 103, 46, 150, 100, 40, 172, 111, 45, 178, 114, 42, 173, 110, 42, 119, 63, 19, 94, 44, 6, 128, 70, 22, 153, 91, 34, 163, 104, 42, 165, 107, 42, 170, 115, 62, 168, 119, 80, 158, 110, 75, 152, 112, 89, 139, 100, 74, 136, 103, + 88, 122, 111, 113, 110, 134, 169, 108, 158, 224, 110, 168, 236, 107, 162, 226, 101, 147, 201, 98, 138, 189, 97, 137, 188, 97, 152, 212, 99, 148, 196, 98, 148, 201, 103, 164, 236, 105, 168, 245, 103, 169, 247, 103, 168, 244, 102, 169, 247, 103, 169, 247, 102, 170, 247, 100, 172, 247, 101, 173, 249, 103, 173, 250, 102, 176, 249, 101, 175, 247, 95, 161, 231, 87, 148, 210, 100, 180, 245, 104, 183, 249, 108, 177, 247, 109, 183, 247, 108, 187, 251, 110, 188, 251, 109, 188, 249, 110, 188, 250, 111, 189, 249, 98, 176, 247, 53, 110, 165, 79, 158, 229, 112, 189, 249, 112, 189, 249, 109, 188, 249, 96, 169, 236, 66, 104, 140, 34, 50, 55, 43, 96, 141, 81, 156, 227, 100, 180, 245, 108, 189, 250, 97, 176, 248, 92, 167, 239, 98, 171, 239, 112, 189, 248, 113, 190, 250, 111, 190, 250, + 116, 107, 46, 98, 131, 144, 69, 121, 149, 64, 85, 40, 76, 107, 90, 60, 87, 64, 47, 75, 35, 61, 83, 45, 74, 129, 155, 98, 163, 222, 110, 175, 242, 89, 128, 162, 74, 75, 49, 76, 93, 87, 101, 175, 231, 109, 188, 248, 106, 184, 246, 109, 188, 249, 114, 193, 249, 117, 192, 250, 116, 192, 250, 114, 191, 250, 103, 178, 246, 104, 179, 249, 114, 193, 249, 110, 187, 247, 79, 156, 225, 77, 142, 201, 94, 170, 237, 104, 182, 246, 92, 170, 232, 70, 117, 146, 95, 155, 207, 108, 187, 249, 101, 180, 247, 92, 169, 243, 82, 137, 197, 66, 116, 149, 66, 94, 104, 76, 101, 122, 92, 84, 55, 96, 71, 32, 101, 70, 24, 110, 70, 26, 119, 72, 30, 119, 71, 26, 134, 85, 36, 131, 80, 30, 138, 84, 31, 139, 88, 34, 147, 97, 42, 140, 94, 42, 108, 66, 27, 88, + 53, 18, 92, 53, 18, 84, 42, 12, 86, 41, 7, 123, 68, 22, 156, 96, 35, 168, 110, 49, 132, 78, 29, 116, 63, 20, 133, 75, 23, 160, 97, 36, 159, 96, 32, 152, 89, 30, 141, 76, 20, 155, 88, 29, 152, 83, 23, 166, 97, 32, 145, 74, 17, 150, 79, 20, 153, 83, 22, 143, 73, 12, 144, 72, 10, 167, 97, 26, 139, 70, 18, 131, 64, 11, 146, 78, 19, 149, 80, 19, 156, 86, 28, 169, 100, 34, 125, 66, 17, 151, 79, 17, 174, 97, 28, 182, 109, 35, 154, 86, 24, 166, 97, 29, 170, 106, 37, 165, 110, 52, 157, 100, 41, 169, 111, 44, 184, 123, 51, 155, 96, 42, 131, 79, 27, 67, 27, 1, 148, 89, 27, 171, 109, 42, 187, 117, 43, 180, 112, 42, 184, 118, 46, 183, 118, 49, 171, 105, 46, 159, 95, 41, 149, 87, 39, 140, 88, 43, 133, 92, + 65, 117, 101, 96, 117, 112, 120, 127, 128, 147, 127, 134, 158, 113, 120, 141, 114, 118, 130, 105, 130, 160, 99, 143, 190, 98, 145, 196, 100, 143, 179, 102, 155, 215, 106, 170, 242, 103, 171, 244, 104, 170, 245, 103, 169, 245, 101, 169, 245, 103, 169, 243, 102, 169, 247, 102, 170, 247, 103, 171, 248, 104, 171, 248, 103, 172, 249, 102, 169, 244, 96, 162, 232, 93, 151, 207, 92, 158, 224, 104, 183, 248, 108, 178, 248, 108, 178, 244, 109, 187, 248, 111, 189, 250, 110, 188, 250, 109, 189, 250, 109, 189, 249, 95, 173, 244, 50, 104, 151, 84, 162, 228, 115, 191, 248, 110, 190, 250, 91, 163, 229, 65, 93, 113, 39, 58, 66, 52, 113, 174, 94, 172, 237, 106, 188, 250, 100, 178, 247, 112, 190, 250, 102, 184, 249, 102, 183, 250, 95, 168, 239, 105, 183, 241, 110, 190, 251, 90, 164, 233, + 103, 106, 52, 74, 114, 118, 68, 95, 70, 83, 130, 138, 88, 136, 164, 59, 99, 116, 42, 61, 29, 66, 86, 61, 83, 122, 127, 94, 119, 112, 110, 121, 99, 90, 87, 41, 88, 103, 73, 103, 149, 172, 98, 162, 209, 98, 161, 214, 102, 168, 223, 107, 181, 245, 112, 191, 249, 115, 191, 249, 114, 192, 249, 113, 192, 249, 108, 184, 247, 105, 167, 238, 112, 189, 248, 116, 193, 249, 112, 189, 248, 89, 169, 235, 94, 169, 235, 95, 169, 234, 88, 163, 233, 69, 142, 213, 65, 105, 136, 86, 141, 181, 87, 156, 221, 85, 144, 204, 93, 148, 205, 88, 122, 155, 96, 98, 94, 102, 96, 73, 116, 91, 44, 113, 81, 29, 108, 73, 24, 108, 68, 24, 118, 75, 28, 123, 77, 28, 130, 82, 30, 137, 87, 35, 141, 89, 33, 124, 73, 24, 117, 66, 19, 122, 70, 20, 136, 81, 32, 126, + 79, 30, 109, 65, 21, 102, 60, 18, 98, 56, 18, 101, 55, 14, 121, 65, 14, 150, 89, 26, 167, 107, 41, 158, 98, 37, 136, 80, 27, 135, 75, 21, 156, 91, 30, 152, 86, 25, 137, 71, 18, 145, 78, 21, 146, 79, 18, 161, 89, 20, 166, 92, 22, 152, 79, 20, 134, 63, 8, 138, 67, 8, 132, 62, 7, 157, 87, 25, 159, 90, 28, 125, 58, 7, 126, 62, 8, 140, 72, 12, 156, 86, 27, 158, 84, 20, 149, 89, 35, 139, 71, 9, 165, 89, 21, 186, 115, 40, 159, 92, 29, 163, 91, 16, 162, 95, 29, 162, 99, 39, 168, 106, 42, 171, 105, 39, 162, 94, 29, 124, 70, 23, 73, 37, 9, 156, 93, 31, 178, 109, 36, 188, 120, 45, 184, 116, 44, 179, 112, 40, 166, 102, 36, 160, 101, 44, 155, 94, 37, 159, 97, 38, 156, 94, 35, 161, 101, 42, 159, 105, + 52, 155, 101, 54, 152, 97, 52, 145, 94, 56, 132, 96, 71, 117, 103, 99, 112, 110, 114, 105, 122, 150, 105, 141, 186, 101, 134, 169, 95, 129, 159, 97, 153, 217, 107, 171, 244, 106, 171, 244, 105, 169, 244, 103, 169, 245, 103, 169, 245, 101, 170, 244, 103, 169, 246, 103, 169, 247, 103, 170, 247, 104, 171, 248, 103, 172, 248, 102, 168, 240, 99, 167, 239, 100, 169, 240, 93, 149, 200, 99, 166, 228, 107, 180, 249, 106, 173, 242, 107, 184, 247, 110, 188, 249, 113, 189, 249, 112, 190, 249, 111, 192, 250, 94, 173, 243, 52, 108, 158, 89, 167, 233, 106, 185, 248, 84, 147, 205, 59, 88, 98, 51, 86, 105, 72, 139, 200, 95, 173, 244, 101, 180, 247, 111, 191, 249, 101, 178, 248, 109, 187, 246, 106, 186, 249, 108, 188, 248, 98, 176, 246, 89, 166, 239, 76, 139, 199, 44, 72, 95, + 81, 91, 48, 102, 117, 63, 100, 134, 103, 106, 172, 240, 109, 154, 196, 87, 132, 165, 84, 112, 113, 83, 106, 100, 79, 79, 38, 60, 57, 16, 75, 76, 34, 121, 125, 88, 108, 146, 162, 98, 159, 212, 98, 168, 238, 100, 175, 242, 105, 182, 245, 109, 188, 248, 112, 192, 248, 113, 192, 249, 113, 192, 249, 115, 192, 250, 111, 189, 247, 93, 158, 231, 106, 183, 247, 115, 193, 249, 117, 194, 250, 116, 194, 250, 116, 194, 250, 116, 195, 249, 118, 194, 248, 113, 192, 250, 96, 176, 241, 75, 126, 165, 96, 133, 160, 101, 169, 236, 97, 164, 227, 85, 142, 193, 92, 101, 94, 116, 93, 42, 134, 94, 36, 139, 98, 44, 142, 99, 46, 134, 91, 38, 122, 75, 28, 115, 69, 25, 117, 71, 22, 129, 81, 31, 137, 89, 39, 140, 92, 37, 129, 78, 27, 130, 77, 25, 120, 64, 18, 119, + 67, 20, 134, 81, 32, 124, 72, 23, 108, 62, 14, 130, 81, 33, 142, 87, 31, 136, 72, 18, 151, 85, 25, 161, 94, 31, 178, 112, 40, 152, 94, 31, 109, 51, 12, 142, 81, 27, 144, 79, 23, 136, 69, 12, 143, 70, 14, 155, 81, 18, 158, 81, 13, 157, 85, 18, 159, 89, 25, 122, 54, 7, 137, 63, 9, 152, 82, 20, 167, 100, 36, 128, 64, 14, 132, 71, 22, 136, 69, 12, 156, 85, 22, 143, 71, 8, 129, 65, 12, 128, 61, 6, 158, 79, 14, 185, 111, 33, 157, 87, 21, 161, 84, 16, 161, 92, 27, 166, 100, 35, 167, 98, 30, 167, 94, 29, 144, 80, 19, 69, 31, 5, 168, 106, 29, 182, 108, 35, 187, 118, 45, 189, 119, 46, 181, 107, 36, 182, 111, 39, 173, 113, 43, 173, 107, 43, 172, 106, 45, 161, 95, 33, 172, 104, 42, 171, 105, 40, 169, 104, + 42, 161, 99, 40, 155, 95, 42, 140, 95, 58, 125, 91, 70, 114, 87, 72, 114, 97, 88, 116, 114, 121, 113, 117, 135, 102, 105, 108, 96, 114, 124, 96, 143, 204, 104, 162, 231, 108, 172, 246, 106, 170, 244, 104, 167, 243, 104, 169, 244, 103, 169, 245, 103, 169, 245, 103, 169, 246, 103, 169, 246, 104, 171, 246, 104, 171, 246, 99, 166, 238, 100, 168, 239, 102, 175, 248, 99, 172, 239, 96, 143, 189, 99, 167, 237, 104, 172, 243, 104, 181, 247, 108, 185, 249, 110, 188, 248, 108, 190, 248, 112, 191, 249, 95, 171, 241, 49, 110, 163, 79, 156, 232, 72, 129, 182, 43, 67, 72, 52, 107, 150, 88, 170, 235, 111, 189, 248, 108, 187, 251, 99, 179, 247, 115, 191, 248, 101, 181, 249, 105, 180, 242, 109, 189, 249, 108, 188, 247, 95, 173, 240, 55, 100, 148, 25, 52, 73, 51, 114, 174, + 78, 88, 42, 87, 95, 24, 91, 137, 150, 105, 145, 174, 119, 140, 141, 100, 132, 152, 104, 110, 78, 93, 88, 35, 90, 88, 35, 94, 139, 154, 63, 119, 171, 113, 132, 131, 103, 151, 183, 97, 152, 194, 103, 163, 215, 104, 178, 244, 112, 188, 249, 117, 192, 249, 117, 191, 250, 114, 193, 250, 114, 193, 250, 113, 192, 249, 113, 191, 249, 98, 177, 244, 108, 186, 249, 117, 193, 249, 116, 193, 251, 117, 193, 250, 117, 194, 250, 117, 195, 249, 119, 194, 251, 121, 194, 248, 119, 194, 248, 109, 186, 243, 80, 142, 192, 96, 134, 162, 106, 159, 210, 101, 136, 170, 109, 105, 81, 114, 95, 36, 119, 90, 35, 132, 90, 40, 135, 90, 37, 142, 95, 38, 150, 101, 41, 144, 95, 39, 133, 86, 36, 117, 70, 25, 102, 57, 17, 104, 57, 18, 118, 71, 23, 131, 82, 29, 138, 84, 31, 135, + 82, 30, 139, 85, 33, 141, 86, 33, 129, 76, 24, 108, 63, 18, 90, 46, 11, 114, 65, 25, 146, 83, 24, 156, 89, 29, 159, 96, 30, 180, 116, 45, 164, 102, 37, 102, 47, 14, 110, 54, 13, 126, 64, 13, 154, 83, 20, 139, 68, 11, 143, 69, 11, 153, 79, 16, 146, 74, 16, 131, 65, 13, 129, 60, 10, 146, 77, 14, 155, 90, 28, 146, 78, 21, 128, 64, 11, 129, 64, 9, 137, 66, 12, 140, 71, 14, 143, 70, 11, 134, 65, 8, 150, 73, 11, 160, 83, 16, 155, 82, 19, 147, 72, 4, 165, 88, 21, 164, 93, 28, 158, 86, 21, 154, 83, 19, 117, 66, 20, 161, 90, 25, 186, 108, 32, 189, 113, 38, 188, 113, 38, 187, 113, 37, 180, 109, 35, 164, 95, 29, 164, 96, 36, 168, 101, 39, 170, 107, 45, 179, 114, 53, 169, 105, 43, 166, 102, 39, 158, 95, + 35, 167, 105, 43, 173, 113, 49, 173, 112, 49, 171, 112, 56, 159, 105, 56, 154, 103, 58, 149, 103, 70, 143, 103, 71, 133, 99, 71, 115, 103, 99, 103, 133, 180, 106, 153, 218, 102, 160, 228, 104, 162, 229, 106, 167, 235, 105, 169, 242, 104, 170, 245, 105, 170, 244, 105, 170, 246, 104, 170, 246, 104, 170, 244, 102, 171, 245, 104, 166, 236, 99, 164, 236, 103, 174, 248, 103, 174, 245, 96, 153, 206, 87, 131, 166, 97, 163, 236, 104, 180, 248, 106, 184, 250, 109, 186, 250, 110, 189, 248, 112, 191, 248, 86, 159, 227, 33, 69, 100, 37, 73, 105, 42, 75, 92, 64, 129, 185, 99, 178, 237, 114, 191, 248, 117, 192, 248, 114, 192, 249, 102, 182, 250, 108, 184, 245, 104, 185, 250, 99, 180, 246, 110, 190, 248, 94, 171, 242, 54, 95, 133, 23, 52, 86, 60, 127, 191, 102, 180, 243, + 61, 80, 46, 71, 82, 10, 89, 108, 86, 102, 117, 97, 122, 119, 63, 120, 109, 53, 90, 84, 23, 86, 98, 71, 113, 136, 116, 116, 166, 188, 96, 167, 233, 104, 146, 168, 91, 150, 200, 98, 159, 214, 104, 172, 233, 104, 178, 244, 109, 187, 249, 114, 191, 248, 115, 191, 249, 115, 191, 249, 114, 192, 250, 114, 192, 250, 114, 193, 248, 109, 187, 246, 106, 184, 248, 116, 193, 247, 116, 192, 251, 116, 193, 249, 117, 194, 250, 119, 194, 250, 119, 194, 251, 119, 195, 249, 119, 195, 248, 120, 195, 248, 108, 186, 245, 84, 142, 189, 87, 106, 108, 104, 103, 61, 109, 97, 32, 122, 99, 34, 123, 94, 39, 125, 90, 42, 120, 76, 29, 117, 71, 26, 128, 78, 29, 128, 82, 27, 122, 73, 25, 121, 72, 23, 116, 67, 21, 98, 53, 10, 94, 52, 11, 98, 52, 11, 106, 56, 15, 125, + 71, 22, 138, 79, 28, 145, 86, 31, 154, 95, 40, 149, 89, 34, 130, 77, 26, 100, 51, 15, 103, 56, 17, 133, 74, 22, 147, 83, 25, 156, 91, 28, 160, 93, 29, 162, 102, 42, 99, 50, 15, 96, 42, 4, 142, 75, 19, 147, 74, 15, 143, 71, 14, 130, 61, 9, 144, 71, 12, 140, 72, 18, 95, 39, 5, 134, 61, 10, 166, 91, 19, 151, 76, 13, 149, 77, 16, 128, 60, 7, 148, 72, 12, 154, 80, 13, 149, 80, 13, 153, 82, 14, 162, 87, 23, 157, 81, 15, 143, 72, 15, 139, 64, 7, 165, 89, 21, 151, 79, 15, 146, 75, 14, 130, 71, 15, 154, 84, 19, 174, 98, 23, 183, 105, 31, 178, 103, 31, 186, 114, 36, 178, 105, 32, 153, 83, 28, 148, 82, 23, 161, 88, 29, 166, 98, 35, 149, 82, 22, 152, 87, 26, 150, 83, 22, 154, 87, 26, 148, 83, + 22, 155, 88, 26, 162, 95, 32, 165, 96, 34, 163, 97, 31, 166, 104, 36, 167, 104, 38, 162, 99, 37, 164, 100, 42, 157, 99, 46, 151, 102, 58, 138, 106, 85, 116, 115, 135, 109, 130, 170, 106, 150, 209, 108, 163, 232, 106, 170, 242, 106, 174, 246, 108, 171, 246, 105, 172, 247, 103, 171, 246, 104, 170, 245, 105, 170, 245, 103, 165, 238, 101, 161, 232, 102, 173, 247, 105, 173, 248, 105, 174, 247, 95, 156, 221, 87, 142, 196, 101, 173, 245, 105, 182, 249, 107, 184, 250, 109, 187, 248, 103, 181, 249, 61, 111, 156, 21, 28, 27, 32, 60, 76, 71, 143, 206, 108, 187, 246, 118, 192, 249, 118, 193, 250, 117, 193, 249, 116, 193, 249, 110, 188, 250, 96, 172, 241, 93, 168, 232, 79, 147, 216, 70, 130, 183, 54, 82, 104, 17, 46, 73, 45, 110, 181, 63, 128, 192, 68, 133, 199, + 85, 88, 47, 86, 85, 32, 82, 76, 35, 88, 75, 25, 77, 70, 13, 69, 72, 28, 80, 98, 75, 87, 117, 108, 97, 124, 111, 105, 133, 126, 103, 140, 165, 118, 171, 203, 113, 189, 246, 114, 192, 248, 118, 193, 250, 115, 191, 250, 113, 192, 250, 114, 192, 250, 116, 192, 250, 116, 192, 250, 114, 192, 250, 114, 193, 250, 114, 193, 250, 115, 192, 249, 106, 187, 248, 114, 193, 250, 118, 194, 250, 117, 195, 251, 116, 194, 249, 119, 196, 250, 121, 194, 249, 121, 196, 251, 124, 197, 250, 123, 199, 248, 118, 193, 246, 102, 164, 219, 81, 116, 152, 92, 84, 47, 104, 88, 29, 102, 79, 24, 96, 67, 27, 96, 64, 31, 115, 76, 31, 126, 83, 34, 104, 63, 18, 98, 57, 14, 95, 51, 11, 101, 55, 15, 110, 62, 20, 116, 68, 22, 103, 55, 13, 92, 48, 11, 89, 44, 8, 109, + 55, 13, 130, 68, 19, 155, 91, 31, 160, 93, 34, 161, 93, 30, 171, 104, 39, 179, 110, 48, 180, 111, 40, 182, 113, 39, 173, 104, 35, 174, 105, 33, 160, 93, 29, 159, 92, 29, 156, 94, 35, 80, 39, 11, 84, 34, 6, 136, 62, 7, 158, 80, 15, 151, 76, 12, 151, 84, 23, 133, 65, 9, 131, 65, 15, 101, 43, 8, 164, 90, 24, 153, 81, 24, 158, 85, 19, 144, 73, 17, 134, 61, 7, 152, 76, 10, 147, 77, 19, 156, 80, 12, 173, 99, 25, 168, 93, 30, 124, 56, 11, 138, 68, 17, 150, 80, 18, 156, 86, 22, 117, 51, 1, 135, 66, 5, 173, 97, 24, 176, 98, 22, 173, 96, 17, 177, 101, 25, 166, 91, 21, 134, 64, 12, 173, 102, 34, 174, 103, 31, 175, 102, 32, 172, 98, 28, 169, 98, 31, 156, 85, 24, 151, 80, 19, 143, 75, 18, 141, 73, + 17, 125, 61, 12, 138, 71, 17, 141, 72, 16, 151, 83, 23, 148, 80, 22, 145, 75, 19, 159, 91, 28, 156, 89, 29, 152, 90, 33, 150, 94, 47, 154, 102, 61, 146, 106, 79, 118, 101, 97, 113, 112, 127, 102, 123, 168, 104, 150, 205, 103, 163, 223, 106, 164, 231, 106, 167, 237, 105, 171, 245, 105, 172, 244, 106, 172, 246, 103, 167, 237, 99, 157, 227, 103, 170, 246, 107, 173, 249, 106, 173, 248, 104, 172, 246, 85, 132, 180, 77, 143, 216, 105, 180, 247, 108, 184, 247, 105, 183, 248, 83, 148, 215, 36, 48, 55, 27, 46, 54, 69, 139, 198, 104, 187, 245, 116, 191, 247, 119, 193, 249, 119, 192, 250, 119, 194, 251, 118, 193, 250, 103, 177, 237, 71, 119, 150, 55, 110, 163, 56, 73, 77, 36, 43, 31, 26, 34, 20, 26, 48, 49, 50, 78, 77, 65, 113, 135, 82, 152, 215, + 119, 104, 43, 83, 76, 24, 55, 61, 37, 40, 66, 65, 41, 60, 46, 63, 76, 32, 90, 108, 93, 97, 138, 152, 100, 150, 189, 96, 151, 205, 112, 137, 146, 113, 183, 238, 119, 194, 249, 118, 195, 249, 118, 194, 250, 117, 194, 250, 117, 193, 250, 116, 193, 250, 116, 192, 250, 116, 193, 250, 115, 193, 250, 114, 193, 250, 116, 193, 250, 117, 193, 250, 112, 189, 248, 109, 190, 250, 117, 195, 251, 118, 195, 250, 119, 195, 250, 120, 195, 249, 119, 194, 250, 116, 192, 250, 118, 194, 249, 118, 194, 248, 112, 188, 249, 109, 173, 239, 99, 142, 195, 103, 89, 56, 119, 93, 35, 123, 87, 33, 126, 83, 32, 127, 83, 34, 123, 79, 33, 125, 78, 28, 119, 73, 25, 115, 68, 23, 108, 62, 18, 106, 59, 18, 104, 59, 18, 115, 65, 20, 121, 70, 22, 117, 64, 19, 111, 60, 16, 103, + 58, 14, 100, 51, 11, 112, 58, 12, 126, 69, 20, 127, 69, 15, 134, 70, 15, 158, 90, 25, 178, 106, 35, 190, 113, 36, 182, 108, 32, 174, 98, 29, 186, 109, 32, 191, 120, 42, 184, 118, 46, 121, 65, 18, 62, 22, 1, 113, 54, 9, 154, 77, 15, 157, 84, 20, 159, 89, 27, 133, 68, 15, 143, 76, 17, 117, 58, 12, 105, 49, 7, 143, 71, 16, 134, 63, 9, 149, 77, 17, 147, 72, 16, 145, 75, 19, 145, 71, 15, 140, 67, 12, 172, 102, 31, 175, 102, 32, 119, 53, 5, 127, 56, 7, 168, 88, 20, 160, 84, 23, 129, 64, 16, 136, 65, 6, 159, 85, 18, 158, 80, 11, 166, 89, 19, 157, 83, 18, 151, 80, 16, 164, 95, 25, 162, 90, 24, 154, 83, 20, 145, 73, 11, 147, 77, 16, 138, 71, 13, 135, 71, 18, 148, 85, 28, 153, 87, 29, 160, 93, + 31, 163, 93, 32, 165, 94, 33, 155, 85, 26, 155, 84, 24, 159, 87, 27, 160, 89, 28, 154, 86, 25, 151, 83, 24, 148, 86, 27, 140, 78, 26, 130, 70, 24, 138, 83, 37, 147, 95, 54, 139, 99, 70, 138, 112, 92, 127, 115, 112, 119, 126, 139, 118, 142, 166, 116, 151, 180, 111, 159, 208, 108, 167, 234, 106, 172, 245, 103, 169, 240, 99, 159, 226, 103, 169, 241, 107, 172, 248, 106, 173, 248, 107, 173, 249, 99, 157, 221, 76, 124, 177, 94, 162, 230, 107, 181, 249, 93, 150, 212, 65, 79, 84, 46, 73, 92, 76, 145, 206, 106, 184, 245, 103, 183, 246, 106, 183, 245, 118, 191, 247, 120, 194, 250, 120, 194, 250, 120, 194, 249, 110, 187, 248, 86, 153, 208, 76, 105, 118, 62, 66, 42, 49, 64, 34, 61, 87, 50, 68, 97, 71, 83, 111, 81, 93, 142, 158, 95, 164, 229, + 96, 101, 84, 80, 103, 89, 75, 126, 143, 61, 117, 151, 61, 90, 81, 82, 92, 30, 91, 104, 73, 100, 118, 114, 108, 138, 151, 113, 148, 176, 120, 164, 205, 116, 188, 249, 119, 195, 248, 118, 195, 249, 118, 193, 250, 116, 194, 250, 114, 194, 250, 115, 193, 250, 116, 192, 250, 117, 192, 249, 117, 193, 250, 116, 194, 251, 118, 193, 250, 117, 194, 250, 115, 193, 248, 113, 191, 249, 116, 195, 250, 120, 195, 250, 119, 195, 249, 120, 195, 250, 122, 196, 249, 122, 198, 249, 116, 192, 247, 103, 175, 244, 106, 170, 239, 101, 158, 221, 102, 113, 131, 104, 77, 39, 120, 82, 34, 124, 79, 31, 113, 66, 17, 118, 67, 24, 115, 65, 19, 115, 67, 19, 115, 65, 18, 115, 68, 22, 123, 75, 28, 127, 79, 32, 130, 79, 32, 134, 85, 35, 135, 84, 35, 135, 82, 33, 125, 74, 26, 131, + 79, 26, 129, 74, 23, 119, 63, 18, 94, 44, 6, 83, 39, 5, 92, 43, 9, 91, 37, 2, 109, 48, 6, 147, 73, 16, 181, 103, 28, 172, 94, 26, 173, 94, 24, 182, 104, 27, 198, 127, 47, 181, 123, 52, 92, 47, 7, 100, 48, 11, 155, 77, 15, 156, 82, 21, 177, 103, 34, 150, 85, 30, 107, 48, 4, 155, 86, 24, 137, 71, 18, 111, 48, 8, 106, 38, 4, 149, 76, 18, 170, 95, 24, 142, 76, 24, 160, 88, 25, 160, 87, 22, 172, 97, 28, 179, 104, 27, 168, 97, 39, 155, 78, 13, 174, 94, 25, 191, 117, 38, 160, 87, 23, 155, 83, 20, 136, 63, 12, 129, 56, 4, 149, 74, 13, 149, 74, 16, 152, 80, 11, 145, 72, 11, 132, 66, 9, 118, 50, 3, 123, 53, 6, 130, 64, 14, 143, 81, 27, 142, 80, 31, 138, 76, 23, 123, 60, 13, 122, 62, + 12, 142, 72, 18, 152, 80, 24, 160, 92, 30, 158, 86, 29, 148, 77, 17, 147, 76, 14, 147, 78, 15, 158, 87, 26, 164, 94, 32, 165, 96, 33, 160, 91, 30, 145, 82, 26, 133, 73, 21, 137, 78, 27, 138, 80, 31, 146, 88, 39, 148, 96, 46, 142, 101, 75, 125, 118, 127, 115, 148, 190, 107, 164, 229, 106, 170, 243, 106, 171, 243, 100, 164, 230, 103, 168, 240, 106, 172, 248, 107, 173, 248, 107, 173, 248, 106, 172, 243, 100, 162, 235, 74, 129, 179, 77, 141, 216, 67, 84, 99, 52, 68, 78, 81, 147, 208, 108, 188, 245, 107, 185, 247, 97, 169, 226, 97, 170, 229, 113, 190, 247, 118, 195, 249, 121, 195, 248, 116, 193, 249, 93, 159, 222, 64, 90, 99, 55, 69, 61, 75, 122, 142, 93, 136, 125, 69, 100, 54, 60, 93, 66, 77, 109, 64, 92, 136, 138, 87, 149, 187, + 90, 102, 103, 95, 105, 60, 95, 162, 212, 97, 172, 237, 90, 153, 202, 93, 135, 143, 82, 126, 143, 67, 109, 125, 73, 84, 66, 96, 108, 99, 113, 156, 194, 116, 177, 235, 113, 188, 247, 118, 195, 249, 119, 194, 251, 119, 194, 249, 115, 193, 250, 114, 193, 250, 114, 193, 250, 115, 193, 251, 115, 193, 251, 115, 194, 251, 118, 193, 250, 117, 194, 250, 116, 194, 250, 116, 195, 250, 118, 195, 249, 118, 194, 249, 120, 194, 250, 117, 195, 249, 117, 192, 249, 115, 192, 248, 109, 183, 246, 106, 171, 237, 102, 150, 209, 100, 115, 143, 108, 86, 59, 111, 77, 35, 111, 74, 28, 105, 68, 27, 95, 58, 18, 92, 55, 15, 92, 49, 11, 94, 52, 13, 95, 51, 9, 92, 51, 10, 92, 49, 12, 93, 51, 14, 101, 54, 15, 105, 57, 12, 115, 64, 18, 127, 74, 24, 130, 78, 25, 134, + 78, 25, 129, 74, 27, 117, 62, 18, 114, 61, 18, 103, 56, 16, 82, 35, 6, 82, 34, 5, 77, 30, 2, 84, 36, 5, 123, 57, 10, 165, 88, 22, 146, 71, 11, 158, 83, 19, 178, 99, 28, 190, 118, 44, 166, 108, 48, 104, 51, 11, 164, 89, 25, 172, 99, 33, 183, 109, 38, 175, 107, 42, 140, 70, 15, 159, 88, 22, 134, 69, 12, 103, 46, 8, 84, 29, 2, 125, 54, 8, 154, 76, 12, 144, 84, 33, 133, 70, 16, 150, 81, 20, 161, 85, 20, 182, 107, 39, 188, 122, 49, 168, 96, 30, 174, 95, 27, 185, 107, 30, 184, 105, 33, 168, 94, 29, 142, 65, 13, 145, 71, 14, 138, 66, 12, 138, 65, 14, 115, 48, 4, 91, 36, 3, 82, 29, 2, 98, 37, 1, 118, 48, 6, 128, 57, 11, 129, 60, 11, 142, 73, 17, 143, 73, 16, 149, 79, 22, 152, 85, + 24, 152, 84, 28, 142, 77, 27, 136, 70, 21, 135, 64, 14, 158, 87, 25, 163, 93, 28, 162, 90, 28, 164, 91, 28, 166, 92, 30, 161, 91, 27, 160, 92, 21, 165, 97, 30, 150, 79, 21, 138, 74, 20, 116, 60, 15, 126, 68, 24, 134, 75, 29, 141, 83, 36, 133, 85, 50, 118, 95, 89, 114, 124, 150, 110, 155, 215, 108, 168, 238, 103, 166, 237, 102, 167, 239, 107, 172, 248, 107, 173, 248, 107, 173, 247, 110, 173, 246, 106, 172, 243, 80, 121, 165, 41, 48, 52, 45, 58, 69, 75, 135, 196, 107, 178, 244, 112, 184, 248, 107, 173, 222, 96, 155, 179, 90, 160, 203, 107, 182, 243, 113, 188, 247, 103, 180, 247, 72, 128, 183, 37, 56, 65, 49, 65, 45, 90, 125, 119, 103, 155, 173, 93, 129, 80, 53, 83, 24, 56, 92, 70, 67, 111, 109, 88, 135, 146, 89, 139, 152, + 95, 95, 58, 85, 90, 28, 105, 145, 154, 106, 174, 226, 97, 178, 242, 104, 173, 233, 102, 177, 242, 84, 163, 226, 72, 124, 164, 88, 122, 136, 100, 148, 192, 109, 170, 229, 111, 187, 248, 118, 193, 250, 119, 194, 251, 118, 195, 249, 118, 193, 250, 117, 194, 250, 116, 194, 250, 116, 193, 249, 116, 194, 250, 116, 194, 250, 116, 194, 250, 116, 195, 251, 117, 194, 250, 119, 194, 251, 118, 195, 249, 120, 196, 249, 119, 196, 248, 119, 196, 248, 113, 189, 246, 104, 172, 235, 97, 148, 210, 101, 126, 168, 109, 115, 133, 117, 99, 82, 125, 90, 42, 135, 91, 43, 131, 92, 42, 124, 81, 34, 125, 78, 31, 111, 65, 21, 91, 49, 15, 87, 47, 12, 86, 47, 12, 91, 51, 11, 90, 48, 11, 88, 48, 10, 84, 43, 7, 88, 43, 8, 93, 46, 7, 98, 51, 10, 117, 65, 20, 138, + 83, 31, 151, 93, 36, 161, 101, 42, 165, 103, 39, 169, 109, 43, 153, 98, 36, 136, 82, 29, 123, 71, 26, 113, 62, 21, 131, 71, 19, 151, 80, 19, 149, 81, 25, 138, 69, 14, 161, 86, 21, 188, 119, 46, 204, 141, 65, 170, 106, 44, 165, 87, 27, 172, 96, 29, 187, 119, 45, 186, 117, 46, 172, 103, 35, 142, 71, 13, 129, 60, 10, 94, 35, 6, 83, 28, 0, 108, 42, 4, 123, 52, 3, 136, 68, 11, 137, 69, 17, 149, 90, 32, 151, 76, 17, 184, 111, 39, 184, 112, 37, 184, 112, 39, 159, 84, 20, 180, 99, 31, 184, 108, 38, 178, 108, 42, 143, 71, 17, 143, 72, 16, 130, 59, 7, 121, 51, 5, 111, 45, 6, 85, 32, 3, 77, 24, 0, 88, 31, 0, 93, 33, 3, 104, 42, 4, 118, 56, 11, 142, 75, 19, 155, 85, 27, 133, 63, 15, 129, 61, + 13, 144, 77, 20, 144, 76, 25, 151, 80, 25, 153, 82, 28, 147, 75, 19, 147, 78, 19, 152, 81, 20, 147, 73, 16, 146, 74, 14, 160, 88, 21, 160, 93, 28, 169, 100, 31, 169, 102, 41, 146, 85, 32, 130, 75, 36, 110, 68, 38, 119, 81, 51, 112, 86, 69, 121, 94, 78, 109, 98, 100, 98, 101, 120, 100, 110, 146, 105, 144, 206, 102, 160, 228, 102, 166, 237, 106, 172, 246, 107, 172, 247, 108, 173, 249, 110, 174, 248, 98, 163, 236, 68, 93, 123, 35, 36, 34, 53, 79, 113, 88, 154, 218, 105, 175, 243, 110, 177, 242, 113, 165, 185, 105, 142, 129, 92, 150, 177, 97, 160, 206, 92, 145, 178, 58, 95, 128, 26, 49, 63, 49, 102, 133, 89, 140, 151, 99, 129, 82, 90, 120, 82, 80, 110, 30, 55, 88, 17, 52, 85, 57, 57, 95, 94, 81, 124, 128, 92, 135, 140, + 91, 119, 125, 71, 105, 121, 95, 102, 40, 99, 137, 139, 96, 150, 183, 102, 163, 210, 105, 180, 239, 103, 178, 243, 100, 144, 174, 97, 168, 230, 97, 169, 231, 103, 179, 242, 113, 190, 250, 118, 194, 248, 119, 194, 249, 117, 194, 250, 118, 194, 250, 118, 195, 250, 119, 194, 249, 117, 194, 250, 116, 194, 250, 117, 195, 249, 118, 195, 249, 116, 196, 247, 118, 196, 248, 120, 195, 248, 119, 196, 250, 122, 197, 247, 120, 196, 249, 107, 181, 240, 85, 131, 194, 92, 99, 123, 115, 91, 79, 131, 87, 49, 133, 86, 41, 138, 88, 39, 129, 82, 33, 125, 77, 27, 122, 75, 26, 113, 68, 23, 117, 70, 24, 119, 73, 27, 113, 69, 22, 108, 61, 20, 101, 56, 16, 94, 54, 15, 83, 47, 11, 77, 43, 10, 81, 43, 8, 88, 44, 10, 104, 55, 15, 119, 67, 24, 137, 78, 26, 148, + 87, 25, 157, 93, 29, 162, 92, 32, 172, 102, 34, 165, 100, 33, 170, 99, 33, 180, 112, 38, 187, 119, 44, 185, 117, 44, 161, 93, 30, 153, 83, 21, 141, 70, 12, 151, 78, 15, 177, 100, 38, 194, 126, 53, 202, 140, 65, 179, 109, 38, 182, 108, 37, 187, 115, 42, 192, 122, 49, 165, 96, 29, 172, 100, 32, 136, 72, 16, 114, 58, 18, 88, 35, 6, 85, 28, 0, 100, 40, 4, 127, 59, 7, 154, 83, 19, 146, 78, 17, 147, 75, 20, 167, 93, 29, 194, 119, 45, 185, 112, 41, 183, 110, 44, 169, 99, 40, 179, 109, 43, 184, 115, 47, 184, 117, 50, 152, 81, 27, 138, 65, 14, 120, 51, 9, 112, 46, 7, 112, 45, 6, 101, 39, 2, 86, 30, 1, 73, 25, 1, 68, 24, 1, 87, 40, 10, 93, 37, 2, 146, 78, 22, 160, 92, 33, 146, 78, 21, 143, 77, + 25, 127, 59, 12, 136, 67, 15, 145, 73, 20, 152, 79, 23, 163, 89, 29, 150, 80, 21, 147, 77, 19, 162, 91, 26, 160, 89, 27, 148, 78, 19, 164, 98, 29, 170, 103, 36, 177, 111, 46, 159, 96, 44, 111, 63, 30, 110, 78, 54, 96, 79, 73, 109, 111, 124, 116, 129, 163, 117, 132, 167, 102, 130, 179, 103, 148, 204, 96, 136, 197, 103, 157, 222, 101, 160, 230, 108, 172, 246, 109, 173, 248, 110, 175, 249, 103, 168, 241, 82, 116, 163, 49, 54, 61, 63, 115, 171, 93, 157, 222, 95, 152, 213, 89, 136, 188, 92, 138, 192, 99, 134, 155, 104, 125, 92, 89, 129, 132, 72, 93, 101, 49, 55, 46, 42, 72, 97, 71, 139, 201, 102, 162, 206, 93, 143, 145, 85, 111, 32, 74, 96, 10, 70, 100, 9, 64, 98, 20, 54, 77, 32, 56, 93, 95, 78, 130, 156, 97, 145, 167, + 93, 156, 217, 69, 118, 174, 80, 91, 66, 104, 151, 181, 94, 155, 214, 88, 136, 171, 87, 123, 142, 89, 120, 133, 111, 133, 129, 106, 171, 228, 108, 183, 243, 109, 183, 244, 109, 183, 242, 111, 183, 244, 113, 184, 244, 112, 184, 245, 110, 183, 244, 109, 182, 244, 106, 179, 240, 109, 180, 239, 110, 186, 245, 109, 183, 245, 106, 179, 244, 106, 181, 247, 109, 187, 248, 119, 195, 250, 120, 196, 249, 115, 191, 247, 96, 157, 220, 89, 106, 143, 108, 87, 84, 122, 85, 56, 123, 78, 38, 120, 71, 30, 125, 74, 26, 119, 72, 26, 115, 72, 25, 112, 66, 22, 108, 63, 20, 104, 60, 20, 101, 56, 19, 97, 58, 15, 102, 58, 16, 108, 61, 18, 114, 64, 18, 113, 63, 18, 107, 60, 17, 104, 58, 17, 103, 58, 17, 113, 66, 21, 122, 67, 20, 134, 77, 25, 143, 83, 30, 145, + 83, 27, 145, 83, 25, 153, 92, 33, 164, 98, 34, 176, 107, 38, 177, 105, 37, 168, 94, 28, 163, 86, 20, 163, 88, 22, 155, 80, 17, 167, 94, 29, 160, 80, 14, 177, 101, 34, 179, 107, 44, 196, 129, 59, 182, 112, 43, 184, 111, 41, 191, 121, 50, 187, 117, 46, 181, 108, 38, 155, 82, 24, 155, 82, 22, 147, 81, 22, 116, 60, 22, 86, 35, 4, 87, 31, 0, 100, 45, 11, 168, 97, 29, 160, 87, 15, 162, 92, 24, 168, 98, 35, 168, 96, 29, 189, 110, 37, 194, 120, 47, 182, 110, 43, 187, 118, 54, 189, 121, 50, 189, 115, 44, 179, 108, 40, 164, 93, 36, 144, 73, 22, 141, 67, 13, 126, 57, 12, 115, 44, 4, 117, 47, 5, 94, 36, 3, 77, 26, 1, 89, 33, 3, 102, 44, 6, 111, 46, 5, 120, 55, 8, 143, 71, 16, 163, 90, 28, 142, 73, + 19, 145, 79, 24, 137, 70, 19, 142, 71, 15, 140, 68, 15, 149, 76, 17, 163, 90, 26, 162, 90, 24, 165, 96, 28, 157, 90, 26, 160, 93, 29, 163, 97, 26, 173, 108, 37, 171, 107, 37, 165, 106, 46, 144, 89, 45, 111, 69, 36, 106, 71, 50, 101, 86, 78, 96, 106, 135, 111, 142, 190, 113, 146, 201, 106, 154, 219, 107, 162, 231, 105, 160, 229, 102, 159, 228, 106, 171, 245, 111, 175, 249, 108, 173, 247, 86, 125, 172, 48, 49, 51, 66, 104, 152, 102, 168, 238, 111, 177, 247, 108, 172, 239, 104, 162, 218, 100, 161, 224, 97, 141, 171, 85, 93, 60, 62, 66, 51, 54, 55, 28, 57, 74, 61, 81, 141, 185, 103, 174, 240, 105, 165, 200, 99, 131, 104, 92, 103, 22, 78, 94, 16, 70, 87, 9, 68, 88, 15, 64, 83, 40, 66, 104, 110, 87, 140, 184, 95, 138, 166, + 94, 137, 183, 66, 99, 130, 63, 80, 87, 85, 110, 121, 86, 123, 154, 71, 97, 108, 66, 92, 83, 64, 76, 57, 95, 116, 112, 95, 133, 153, 99, 150, 187, 99, 163, 220, 100, 171, 229, 99, 171, 234, 104, 173, 234, 101, 170, 234, 97, 167, 228, 92, 160, 220, 82, 146, 208, 92, 138, 171, 101, 171, 236, 103, 183, 248, 108, 186, 249, 113, 193, 249, 117, 194, 249, 121, 196, 249, 105, 184, 242, 85, 132, 192, 96, 88, 102, 112, 89, 75, 114, 84, 63, 127, 81, 47, 130, 80, 34, 126, 77, 26, 125, 76, 26, 115, 68, 21, 110, 65, 23, 105, 61, 19, 98, 57, 17, 97, 55, 16, 91, 48, 14, 84, 47, 11, 92, 51, 11, 100, 53, 13, 110, 57, 14, 100, 49, 9, 103, 54, 12, 117, 67, 21, 125, 70, 24, 120, 67, 19, 131, 70, 19, 138, 74, 20, 146, 80, 22, 147, + 79, 20, 153, 85, 26, 156, 90, 29, 175, 107, 40, 166, 97, 27, 157, 85, 21, 150, 78, 17, 135, 65, 10, 134, 63, 12, 169, 94, 26, 166, 91, 22, 183, 106, 37, 200, 131, 63, 188, 117, 50, 187, 113, 46, 182, 108, 41, 187, 116, 46, 179, 102, 35, 180, 105, 36, 188, 118, 45, 176, 99, 33, 152, 78, 18, 150, 80, 23, 134, 69, 17, 106, 49, 6, 68, 23, 4, 88, 39, 6, 150, 83, 18, 167, 96, 20, 148, 78, 15, 163, 88, 24, 166, 88, 16, 181, 100, 26, 177, 104, 35, 176, 107, 41, 192, 123, 57, 188, 119, 53, 187, 120, 51, 181, 112, 42, 180, 113, 47, 176, 109, 47, 158, 80, 25, 156, 84, 24, 131, 58, 9, 115, 47, 4, 90, 35, 0, 81, 29, 0, 76, 24, 0, 93, 34, 1, 112, 42, 2, 115, 49, 2, 126, 58, 7, 149, 76, 18, 172, 101, + 35, 153, 86, 30, 161, 93, 33, 147, 79, 24, 151, 79, 18, 152, 82, 20, 160, 87, 25, 171, 99, 28, 177, 107, 29, 180, 110, 39, 162, 94, 33, 167, 99, 32, 174, 110, 42, 171, 105, 41, 166, 106, 41, 144, 89, 35, 128, 82, 41, 97, 61, 34, 103, 67, 36, 93, 74, 64, 95, 99, 125, 116, 137, 180, 118, 153, 210, 107, 166, 234, 110, 170, 240, 107, 166, 234, 108, 172, 246, 109, 174, 248, 90, 142, 207, 59, 63, 70, 58, 90, 127, 97, 160, 229, 111, 176, 240, 112, 175, 239, 112, 172, 236, 105, 157, 200, 99, 145, 197, 87, 116, 145, 60, 58, 32, 59, 57, 2, 81, 92, 28, 93, 128, 113, 99, 161, 207, 106, 181, 246, 107, 167, 213, 108, 137, 136, 116, 110, 18, 101, 100, 27, 69, 74, 9, 61, 73, 19, 69, 87, 42, 80, 104, 90, 88, 117, 119, 72, 89, 74, + 106, 153, 211, 91, 135, 192, 74, 111, 164, 75, 103, 127, 78, 115, 148, 79, 126, 162, 65, 127, 192, 74, 105, 120, 96, 162, 218, 104, 175, 238, 105, 178, 244, 105, 184, 248, 112, 191, 248, 118, 194, 249, 120, 195, 249, 119, 195, 248, 116, 194, 249, 117, 193, 248, 109, 189, 246, 89, 147, 197, 113, 188, 245, 119, 197, 249, 119, 197, 251, 120, 198, 248, 116, 193, 246, 101, 172, 238, 92, 148, 214, 95, 125, 174, 107, 113, 138, 116, 103, 106, 119, 91, 77, 127, 88, 56, 124, 80, 41, 120, 74, 28, 115, 67, 21, 106, 62, 19, 98, 56, 16, 93, 53, 16, 91, 49, 13, 89, 50, 12, 93, 50, 13, 91, 50, 9, 95, 52, 13, 98, 53, 12, 107, 59, 14, 115, 62, 18, 123, 70, 23, 126, 70, 23, 126, 71, 22, 122, 69, 21, 108, 55, 13, 106, 53, 10, 132, 71, 21, 150, + 85, 26, 155, 89, 27, 150, 81, 22, 147, 78, 24, 156, 85, 24, 124, 58, 9, 106, 45, 3, 131, 64, 13, 156, 87, 24, 171, 100, 30, 183, 111, 42, 190, 121, 51, 186, 121, 54, 185, 120, 55, 186, 125, 58, 176, 112, 44, 183, 113, 49, 181, 108, 45, 191, 118, 50, 193, 117, 46, 187, 110, 38, 177, 99, 30, 148, 75, 16, 141, 73, 16, 120, 55, 8, 95, 40, 5, 67, 25, 6, 122, 62, 9, 176, 102, 31, 173, 97, 27, 128, 66, 16, 161, 90, 28, 160, 82, 19, 155, 83, 23, 171, 101, 37, 180, 108, 45, 184, 120, 56, 182, 115, 55, 185, 117, 52, 185, 118, 53, 178, 108, 47, 178, 108, 50, 177, 106, 42, 156, 82, 21, 130, 59, 8, 108, 43, 3, 86, 32, 2, 73, 26, 0, 75, 24, 1, 71, 23, 2, 96, 34, 1, 103, 42, 5, 123, 54, 7, 155, 79, + 26, 161, 89, 29, 153, 86, 30, 144, 83, 30, 157, 89, 31, 169, 97, 28, 168, 97, 32, 160, 84, 19, 176, 104, 30, 187, 120, 43, 182, 114, 40, 172, 104, 35, 171, 107, 43, 177, 110, 42, 169, 103, 37, 171, 110, 45, 145, 95, 45, 121, 90, 66, 92, 86, 91, 96, 95, 113, 78, 82, 105, 78, 81, 105, 100, 112, 147, 102, 141, 194, 103, 155, 222, 102, 159, 230, 101, 166, 239, 94, 146, 211, 64, 69, 76, 58, 78, 105, 94, 154, 220, 112, 174, 240, 112, 171, 232, 111, 168, 226, 105, 160, 221, 97, 124, 146, 74, 74, 63, 63, 57, 17, 71, 74, 0, 96, 110, 16, 104, 122, 38, 98, 137, 131, 101, 169, 219, 110, 181, 246, 113, 158, 193, 120, 133, 106, 130, 114, 9, 97, 89, 10, 55, 60, 4, 51, 63, 5, 75, 84, 35, 95, 107, 90, 85, 113, 121, 77, 87, 55, + 121, 148, 181, 118, 143, 182, 112, 125, 145, 99, 126, 154, 85, 134, 186, 78, 132, 183, 65, 97, 124, 79, 120, 155, 100, 157, 199, 110, 178, 235, 111, 178, 238, 110, 181, 243, 110, 187, 248, 116, 193, 250, 120, 196, 249, 122, 196, 251, 121, 196, 251, 121, 196, 250, 116, 193, 245, 98, 152, 202, 114, 187, 240, 120, 197, 248, 121, 197, 248, 118, 195, 247, 98, 175, 244, 91, 150, 221, 90, 116, 163, 105, 107, 129, 107, 98, 102, 114, 91, 77, 124, 90, 66, 117, 80, 50, 112, 67, 28, 110, 62, 17, 105, 61, 16, 103, 58, 18, 107, 60, 21, 99, 55, 18, 87, 50, 11, 84, 47, 11, 84, 46, 9, 85, 45, 9, 93, 49, 12, 100, 55, 12, 112, 64, 18, 109, 61, 13, 105, 54, 13, 104, 55, 11, 109, 57, 14, 108, 57, 18, 97, 50, 11, 91, 47, 11, 88, 44, 7, 90, + 43, 7, 95, 43, 7, 108, 52, 5, 113, 50, 6, 99, 41, 4, 99, 42, 3, 131, 68, 18, 149, 81, 19, 174, 103, 37, 182, 116, 48, 183, 117, 49, 191, 127, 61, 194, 139, 72, 194, 144, 83, 181, 131, 71, 176, 117, 52, 189, 124, 60, 196, 128, 59, 193, 120, 50, 189, 114, 43, 184, 110, 41, 159, 85, 22, 149, 72, 15, 135, 65, 13, 108, 51, 14, 100, 42, 8, 89, 40, 7, 71, 28, 0, 145, 76, 15, 155, 84, 23, 126, 65, 19, 106, 49, 10, 112, 51, 10, 150, 84, 32, 173, 103, 47, 182, 114, 52, 189, 125, 64, 188, 123, 63, 192, 128, 66, 185, 119, 58, 173, 108, 49, 171, 104, 45, 187, 120, 58, 184, 117, 51, 169, 103, 40, 128, 59, 9, 102, 44, 5, 63, 21, 1, 65, 23, 0, 82, 33, 2, 102, 41, 1, 118, 51, 3, 110, 50, 6, 128, 61, + 11, 152, 78, 21, 155, 80, 24, 154, 85, 28, 170, 103, 37, 164, 94, 32, 164, 92, 27, 166, 93, 27, 171, 97, 27, 187, 117, 43, 188, 119, 47, 183, 114, 46, 161, 94, 27, 178, 114, 45, 178, 112, 46, 180, 119, 47, 150, 93, 40, 123, 87, 64, 104, 97, 101, 93, 100, 124, 95, 126, 176, 94, 136, 194, 93, 126, 177, 92, 128, 180, 98, 138, 191, 97, 134, 188, 85, 120, 167, 62, 71, 87, 48, 50, 55, 85, 132, 193, 112, 169, 224, 110, 168, 223, 106, 161, 220, 101, 139, 178, 91, 102, 110, 69, 62, 35, 64, 65, 39, 82, 95, 68, 104, 111, 17, 114, 125, 32, 112, 133, 78, 103, 151, 167, 106, 174, 235, 103, 169, 234, 97, 127, 134, 99, 97, 32, 93, 86, 8, 65, 61, 5, 35, 41, 1, 41, 50, 0, 67, 67, 8, 87, 93, 66, 93, 111, 110, 85, 106, 104, + 123, 158, 197, 124, 158, 202, 121, 155, 199, 113, 150, 193, 110, 154, 202, 81, 136, 204, 78, 106, 118, 82, 125, 154, 94, 149, 179, 104, 170, 226, 111, 164, 217, 119, 166, 208, 117, 173, 226, 114, 188, 247, 121, 197, 249, 119, 197, 247, 121, 197, 250, 121, 197, 249, 114, 192, 245, 96, 145, 191, 114, 185, 238, 120, 198, 248, 117, 195, 249, 118, 196, 248, 90, 166, 236, 90, 151, 219, 103, 157, 215, 105, 139, 189, 114, 124, 145, 117, 125, 138, 120, 119, 129, 120, 105, 98, 117, 82, 54, 119, 75, 31, 117, 69, 25, 103, 59, 17, 95, 52, 11, 95, 50, 15, 84, 48, 10, 84, 43, 12, 94, 50, 15, 97, 51, 13, 106, 58, 15, 102, 57, 13, 99, 51, 10, 104, 55, 12, 122, 70, 22, 130, 76, 24, 135, 81, 26, 137, 79, 21, 136, 79, 24, 140, 86, 34, 141, 85, 29, 122, + 66, 19, 118, 60, 13, 122, 62, 11, 95, 45, 6, 87, 40, 4, 107, 50, 7, 148, 78, 20, 169, 103, 36, 172, 109, 41, 191, 130, 63, 195, 132, 65, 196, 137, 71, 204, 149, 85, 195, 145, 82, 202, 147, 83, 189, 128, 60, 196, 129, 60, 200, 126, 53, 199, 126, 50, 192, 116, 43, 189, 115, 44, 155, 79, 17, 170, 97, 37, 169, 94, 31, 140, 71, 23, 126, 59, 17, 104, 47, 13, 106, 51, 15, 110, 48, 11, 120, 55, 5, 133, 65, 19, 136, 69, 18, 164, 98, 42, 163, 96, 40, 162, 95, 38, 164, 96, 35, 191, 122, 56, 189, 125, 61, 193, 128, 62, 193, 128, 66, 181, 116, 51, 177, 113, 52, 181, 119, 57, 188, 125, 60, 185, 125, 59, 162, 100, 39, 127, 63, 11, 103, 48, 8, 63, 25, 4, 65, 20, 1, 103, 46, 9, 113, 53, 6, 135, 68, 13, 124, 60, + 14, 143, 76, 21, 163, 90, 28, 173, 100, 34, 168, 93, 33, 179, 104, 33, 182, 111, 37, 179, 106, 35, 186, 113, 41, 185, 113, 47, 187, 123, 52, 184, 120, 51, 149, 84, 29, 156, 91, 23, 181, 115, 45, 185, 116, 42, 171, 109, 44, 127, 94, 62, 107, 107, 120, 97, 118, 162, 90, 132, 193, 98, 152, 217, 109, 167, 231, 101, 153, 219, 107, 164, 230, 99, 156, 222, 72, 87, 114, 44, 35, 27, 60, 73, 74, 94, 126, 146, 100, 148, 183, 98, 143, 177, 98, 116, 142, 82, 73, 56, 72, 61, 20, 82, 85, 50, 94, 106, 74, 98, 104, 51, 116, 120, 24, 122, 133, 47, 118, 141, 106, 105, 159, 188, 101, 161, 217, 97, 139, 172, 74, 81, 56, 57, 51, 0, 61, 56, 2, 50, 47, 2, 39, 40, 0, 46, 49, 0, 56, 58, 0, 67, 72, 34, 75, 98, 99, 90, 112, 111, + 118, 178, 243, 118, 168, 229, 114, 172, 236, 114, 178, 242, 108, 164, 227, 86, 121, 163, 105, 164, 216, 91, 159, 223, 81, 113, 120, 95, 131, 135, 103, 154, 181, 115, 168, 215, 119, 169, 216, 115, 181, 240, 120, 195, 250, 122, 197, 249, 121, 197, 249, 122, 199, 251, 120, 197, 248, 94, 152, 206, 114, 187, 240, 122, 198, 248, 118, 195, 248, 107, 184, 243, 97, 155, 215, 98, 144, 185, 105, 140, 174, 116, 143, 174, 121, 137, 169, 123, 136, 163, 118, 122, 135, 117, 103, 99, 114, 77, 47, 102, 63, 25, 95, 53, 18, 87, 46, 10, 81, 40, 5, 81, 39, 6, 83, 41, 7, 80, 41, 6, 79, 41, 7, 83, 43, 10, 95, 52, 12, 93, 49, 10, 108, 62, 17, 130, 78, 28, 138, 84, 28, 145, 89, 33, 140, 81, 30, 148, 88, 35, 164, 99, 37, 167, 101, 33, 167, 99, 31, 154, + 84, 19, 137, 67, 10, 142, 68, 12, 135, 69, 10, 110, 52, 8, 129, 72, 20, 174, 109, 47, 177, 116, 54, 174, 113, 49, 187, 126, 59, 189, 130, 64, 194, 138, 74, 196, 142, 78, 189, 132, 66, 203, 141, 74, 206, 146, 73, 201, 134, 64, 202, 130, 55, 202, 125, 48, 188, 106, 28, 177, 97, 27, 161, 86, 23, 189, 117, 50, 195, 121, 55, 172, 98, 36, 183, 109, 50, 141, 72, 26, 110, 57, 21, 78, 31, 4, 134, 74, 30, 161, 94, 39, 170, 102, 44, 155, 82, 27, 149, 82, 25, 163, 90, 27, 173, 101, 39, 187, 120, 56, 197, 132, 64, 199, 136, 71, 196, 135, 69, 190, 128, 62, 189, 128, 62, 178, 114, 53, 174, 107, 41, 185, 123, 56, 178, 120, 53, 152, 89, 30, 118, 55, 11, 93, 42, 6, 104, 49, 8, 119, 57, 9, 135, 66, 8, 149, 77, 15, 153, 81, + 15, 166, 91, 22, 166, 93, 29, 171, 99, 35, 173, 96, 33, 169, 93, 27, 175, 103, 35, 183, 114, 43, 196, 123, 51, 193, 125, 50, 191, 127, 56, 190, 126, 53, 155, 91, 36, 132, 71, 15, 158, 91, 23, 178, 105, 33, 167, 101, 32, 91, 71, 62, 79, 84, 105, 73, 105, 159, 84, 132, 197, 86, 140, 211, 97, 153, 220, 105, 162, 230, 104, 162, 229, 87, 114, 151, 58, 52, 48, 67, 84, 96, 96, 139, 165, 97, 116, 103, 80, 83, 58, 77, 75, 62, 66, 57, 30, 66, 59, 25, 77, 81, 49, 92, 100, 51, 89, 95, 30, 95, 95, 20, 107, 104, 15, 123, 129, 54, 121, 145, 125, 116, 152, 165, 103, 130, 132, 90, 101, 78, 76, 83, 67, 65, 69, 46, 79, 76, 26, 84, 84, 41, 75, 76, 44, 59, 63, 28, 59, 61, 14, 60, 67, 24, 66, 77, 66, 73, 88, 88, + 115, 181, 247, 102, 158, 227, 108, 162, 218, 114, 184, 249, 105, 174, 239, 87, 127, 171, 95, 165, 237, 74, 126, 184, 60, 75, 76, 87, 115, 111, 103, 153, 177, 111, 181, 238, 114, 189, 247, 113, 185, 247, 120, 193, 248, 124, 198, 251, 123, 198, 250, 123, 198, 251, 119, 196, 248, 64, 121, 168, 81, 126, 148, 96, 145, 187, 93, 133, 164, 97, 123, 137, 92, 127, 150, 109, 159, 209, 113, 171, 234, 108, 162, 222, 104, 156, 216, 100, 141, 199, 101, 128, 177, 91, 95, 106, 93, 71, 54, 86, 60, 36, 74, 47, 21, 75, 41, 9, 76, 39, 6, 75, 37, 9, 74, 35, 6, 79, 40, 6, 81, 44, 9, 91, 48, 12, 115, 64, 19, 132, 77, 26, 146, 89, 30, 144, 87, 28, 132, 77, 21, 122, 67, 16, 134, 74, 26, 146, 82, 28, 160, 94, 35, 162, 94, 29, 146, 75, 14, 120, + 56, 3, 114, 54, 8, 126, 58, 8, 130, 62, 5, 120, 59, 10, 165, 101, 35, 173, 116, 49, 186, 126, 62, 200, 140, 74, 195, 135, 66, 185, 126, 58, 191, 135, 73, 179, 120, 56, 197, 133, 64, 201, 139, 64, 210, 148, 63, 211, 146, 69, 199, 127, 50, 197, 120, 48, 195, 114, 36, 178, 95, 25, 162, 84, 21, 176, 98, 35, 189, 111, 45, 193, 119, 53, 188, 116, 53, 151, 83, 26, 93, 41, 9, 121, 58, 19, 144, 77, 30, 146, 77, 24, 159, 88, 33, 144, 74, 20, 143, 71, 17, 153, 76, 15, 179, 102, 36, 184, 116, 51, 197, 132, 62, 192, 128, 57, 191, 125, 56, 196, 134, 67, 188, 124, 60, 183, 120, 57, 179, 117, 52, 184, 130, 65, 189, 134, 74, 167, 108, 49, 128, 72, 24, 69, 29, 6, 88, 41, 3, 88, 37, 3, 126, 62, 14, 143, 75, 14, 167, 96, + 29, 170, 92, 26, 179, 106, 31, 172, 100, 37, 179, 107, 42, 180, 105, 39, 175, 100, 39, 184, 111, 46, 186, 118, 49, 178, 114, 48, 189, 123, 52, 192, 125, 49, 178, 114, 49, 132, 71, 17, 144, 76, 10, 176, 105, 29, 162, 92, 26, 94, 91, 96, 88, 121, 174, 92, 146, 215, 111, 178, 246, 109, 175, 244, 108, 175, 243, 108, 170, 239, 90, 125, 174, 71, 70, 65, 79, 106, 134, 102, 160, 215, 101, 144, 179, 81, 84, 67, 59, 45, 9, 59, 46, 7, 58, 56, 32, 67, 66, 27, 80, 79, 15, 82, 82, 11, 76, 75, 4, 85, 79, 2, 93, 85, 5, 109, 111, 47, 125, 142, 108, 127, 143, 120, 112, 113, 50, 87, 87, 39, 81, 89, 74, 88, 100, 110, 96, 110, 115, 113, 136, 162, 99, 144, 183, 90, 112, 132, 68, 76, 53, 62, 65, 16, 67, 78, 64, 81, 109, 131, + 96, 144, 187, 93, 122, 144, 106, 155, 201, 114, 182, 246, 81, 138, 207, 73, 109, 146, 68, 111, 150, 53, 70, 78, 65, 86, 92, 85, 142, 192, 97, 159, 212, 108, 177, 238, 116, 191, 250, 118, 193, 248, 122, 197, 248, 124, 199, 249, 124, 198, 249, 124, 198, 249, 94, 163, 219, 70, 99, 107, 93, 157, 200, 105, 174, 223, 109, 181, 234, 106, 183, 244, 112, 183, 247, 111, 183, 247, 111, 179, 248, 112, 179, 246, 109, 173, 240, 109, 168, 234, 94, 144, 200, 81, 80, 80, 85, 68, 52, 90, 64, 36, 95, 62, 26, 88, 49, 15, 76, 38, 8, 75, 37, 5, 72, 33, 4, 78, 40, 7, 106, 60, 16, 133, 76, 23, 137, 80, 24, 136, 79, 24, 141, 83, 25, 146, 88, 31, 131, 74, 25, 124, 67, 21, 136, 76, 26, 153, 92, 35, 155, 91, 32, 147, 80, 23, 150, 79, 18, 156, + 83, 17, 137, 70, 10, 135, 73, 19, 110, 52, 7, 140, 81, 25, 157, 99, 37, 174, 117, 56, 179, 122, 57, 192, 133, 67, 182, 122, 57, 179, 122, 58, 164, 106, 45, 174, 110, 44, 204, 143, 69, 200, 134, 57, 203, 136, 54, 205, 138, 58, 188, 119, 45, 190, 119, 47, 183, 102, 28, 182, 97, 25, 159, 81, 20, 158, 83, 25, 172, 93, 27, 170, 92, 26, 175, 97, 34, 162, 91, 31, 131, 64, 19, 145, 77, 32, 141, 68, 20, 165, 86, 25, 157, 73, 15, 143, 64, 11, 153, 71, 15, 173, 90, 23, 180, 100, 27, 192, 122, 50, 191, 127, 56, 171, 101, 32, 178, 108, 37, 183, 115, 47, 179, 112, 46, 180, 117, 55, 178, 116, 54, 181, 125, 62, 191, 139, 72, 187, 133, 67, 165, 106, 44, 109, 60, 19, 51, 24, 5, 30, 13, 3, 26, 6, 0, 93, 44, 8, 149, 79, + 26, 164, 90, 22, 182, 113, 41, 176, 103, 37, 180, 107, 42, 182, 107, 40, 170, 94, 28, 184, 111, 42, 183, 115, 48, 177, 110, 43, 178, 110, 41, 185, 120, 49, 180, 113, 44, 165, 101, 39, 154, 81, 17, 168, 86, 14, 169, 94, 27, 97, 103, 113, 86, 139, 197, 106, 172, 237, 111, 181, 246, 111, 184, 247, 109, 178, 245, 100, 148, 199, 81, 84, 82, 78, 108, 145, 92, 142, 197, 86, 111, 138, 65, 64, 55, 58, 46, 11, 59, 53, 12, 67, 67, 38, 66, 65, 28, 71, 67, 4, 77, 82, 38, 85, 94, 68, 74, 70, 14, 75, 66, 0, 81, 72, 0, 107, 108, 32, 124, 132, 71, 122, 122, 52, 103, 98, 26, 90, 85, 24, 89, 91, 64, 101, 113, 120, 120, 132, 141, 118, 146, 174, 104, 150, 199, 95, 117, 134, 66, 63, 32, 65, 78, 77, 71, 119, 171, 92, 150, 221, + 93, 109, 109, 93, 101, 88, 102, 153, 202, 93, 151, 213, 61, 79, 103, 58, 61, 51, 52, 55, 41, 58, 63, 58, 61, 93, 122, 74, 119, 163, 78, 134, 184, 91, 149, 199, 105, 169, 228, 114, 188, 249, 121, 196, 249, 125, 198, 249, 126, 199, 249, 109, 182, 233, 73, 109, 131, 110, 175, 219, 124, 199, 249, 122, 196, 248, 117, 192, 249, 111, 187, 248, 112, 186, 249, 110, 189, 249, 109, 184, 251, 110, 183, 248, 111, 180, 247, 109, 174, 242, 87, 109, 136, 95, 79, 56, 106, 80, 47, 106, 72, 38, 92, 56, 21, 88, 47, 12, 84, 43, 9, 81, 40, 8, 84, 44, 10, 98, 55, 18, 127, 76, 25, 145, 89, 32, 138, 80, 27, 146, 90, 32, 156, 98, 36, 141, 85, 28, 119, 65, 20, 135, 81, 33, 159, 100, 44, 163, 101, 41, 152, 86, 26, 149, 79, 16, 158, 86, 18, 155, + 79, 13, 139, 71, 12, 128, 65, 13, 121, 63, 14, 178, 115, 48, 188, 130, 61, 184, 127, 60, 194, 138, 67, 182, 122, 54, 180, 120, 51, 178, 117, 51, 180, 121, 53, 178, 112, 45, 196, 134, 62, 195, 120, 44, 196, 124, 48, 195, 123, 46, 196, 127, 52, 201, 138, 68, 183, 108, 36, 170, 88, 22, 150, 71, 12, 143, 67, 13, 154, 83, 26, 145, 72, 17, 173, 100, 37, 156, 87, 33, 145, 78, 33, 161, 90, 31, 170, 94, 30, 192, 114, 42, 185, 105, 28, 182, 97, 24, 177, 93, 24, 179, 101, 28, 188, 113, 42, 206, 140, 66, 183, 110, 41, 166, 93, 24, 168, 94, 25, 164, 88, 21, 173, 105, 40, 180, 112, 50, 170, 102, 43, 180, 119, 56, 187, 132, 66, 188, 130, 63, 185, 125, 58, 156, 96, 40, 96, 50, 13, 70, 38, 15, 35, 13, 2, 35, 15, 4, 96, 48, + 12, 158, 91, 25, 172, 99, 27, 183, 115, 47, 182, 113, 44, 191, 120, 50, 183, 108, 41, 175, 102, 34, 187, 115, 41, 186, 118, 50, 184, 119, 50, 177, 112, 40, 179, 113, 42, 160, 96, 37, 162, 91, 25, 174, 93, 20, 162, 89, 27, 88, 112, 147, 82, 135, 192, 82, 143, 209, 91, 154, 221, 88, 146, 210, 80, 127, 177, 75, 86, 89, 70, 83, 94, 73, 110, 152, 60, 70, 80, 50, 39, 21, 56, 51, 18, 70, 78, 46, 69, 78, 55, 68, 73, 57, 68, 63, 10, 76, 75, 25, 88, 107, 103, 84, 114, 135, 84, 89, 56, 76, 70, 3, 92, 87, 4, 111, 108, 13, 120, 120, 32, 106, 104, 42, 92, 93, 43, 103, 98, 29, 105, 101, 44, 106, 105, 72, 109, 104, 69, 105, 103, 73, 97, 104, 80, 96, 96, 53, 89, 78, 28, 82, 85, 57, 78, 100, 116, 83, 124, 171, + 98, 147, 203, 94, 117, 134, 88, 115, 140, 76, 104, 133, 64, 64, 51, 60, 56, 26, 73, 72, 23, 85, 105, 107, 96, 138, 177, 101, 162, 226, 101, 169, 235, 101, 166, 230, 108, 171, 231, 114, 187, 248, 121, 194, 250, 123, 197, 247, 115, 191, 245, 76, 121, 157, 104, 162, 200, 124, 199, 250, 124, 198, 249, 122, 193, 247, 115, 191, 249, 113, 190, 250, 112, 187, 249, 111, 185, 249, 108, 184, 250, 111, 184, 249, 113, 182, 250, 92, 150, 210, 93, 89, 73, 111, 88, 48, 109, 82, 45, 106, 75, 36, 105, 64, 23, 103, 60, 22, 102, 58, 23, 92, 52, 18, 90, 52, 13, 132, 81, 32, 146, 92, 35, 154, 95, 36, 145, 87, 29, 154, 94, 37, 146, 90, 31, 111, 63, 19, 126, 78, 29, 160, 100, 41, 158, 95, 39, 154, 89, 31, 141, 74, 15, 130, 64, 7, 140, 70, 9, 105, + 46, 3, 88, 39, 6, 106, 50, 8, 148, 90, 34, 162, 105, 45, 178, 120, 54, 181, 120, 54, 186, 125, 56, 167, 111, 44, 177, 111, 45, 181, 118, 51, 182, 113, 41, 187, 118, 42, 202, 134, 60, 203, 128, 50, 192, 114, 37, 209, 137, 63, 220, 160, 86, 208, 145, 75, 191, 117, 46, 166, 84, 18, 147, 69, 16, 128, 60, 16, 131, 66, 19, 138, 79, 34, 153, 91, 40, 134, 74, 30, 152, 81, 25, 198, 129, 51, 196, 121, 47, 198, 121, 42, 198, 125, 48, 193, 111, 34, 182, 100, 28, 173, 94, 22, 202, 138, 66, 200, 135, 64, 196, 129, 59, 163, 87, 22, 160, 84, 18, 149, 74, 12, 168, 101, 38, 173, 104, 44, 173, 102, 43, 174, 107, 44, 179, 121, 51, 183, 125, 60, 190, 131, 63, 194, 136, 69, 169, 105, 40, 106, 57, 22, 75, 31, 5, 65, 28, 10, 62, 20, + 0, 107, 53, 10, 169, 101, 28, 181, 105, 34, 189, 117, 40, 161, 92, 31, 186, 115, 45, 178, 107, 38, 168, 98, 34, 183, 110, 36, 177, 113, 46, 176, 112, 47, 170, 104, 39, 160, 95, 31, 166, 95, 30, 170, 83, 13, 142, 76, 26, 56, 65, 86, 89, 145, 208, 104, 166, 233, 104, 173, 239, 98, 157, 221, 72, 92, 107, 44, 43, 27, 43, 45, 43, 42, 42, 39, 50, 64, 81, 67, 91, 98, 91, 103, 52, 89, 98, 43, 72, 81, 51, 66, 68, 46, 65, 61, 4, 79, 92, 75, 99, 141, 173, 95, 145, 199, 94, 114, 119, 97, 91, 19, 104, 100, 5, 108, 105, 9, 101, 104, 45, 99, 101, 45, 97, 97, 37, 104, 97, 21, 103, 96, 33, 96, 89, 53, 82, 75, 30, 68, 60, 15, 73, 71, 43, 90, 93, 78, 96, 102, 90, 97, 128, 155, 95, 135, 182, 92, 132, 181, + 91, 135, 185, 86, 93, 76, 84, 87, 64, 71, 77, 69, 81, 80, 40, 84, 82, 28, 93, 92, 38, 98, 123, 130, 102, 149, 197, 111, 175, 238, 110, 178, 240, 109, 176, 234, 111, 175, 233, 116, 187, 248, 118, 188, 247, 105, 179, 237, 78, 125, 155, 71, 112, 141, 116, 189, 240, 123, 199, 249, 122, 195, 249, 119, 192, 250, 113, 191, 248, 109, 187, 250, 111, 186, 249, 111, 184, 249, 110, 183, 251, 111, 184, 249, 107, 174, 240, 97, 117, 138, 111, 94, 67, 115, 88, 50, 115, 84, 46, 110, 73, 37, 110, 69, 29, 109, 70, 28, 93, 58, 21, 83, 49, 13, 128, 78, 31, 147, 92, 35, 147, 91, 31, 145, 86, 29, 156, 97, 37, 147, 89, 30, 138, 84, 30, 124, 75, 29, 153, 97, 42, 163, 101, 41, 162, 97, 36, 141, 75, 19, 134, 66, 10, 146, 78, 19, 130, 68, 12, 128, + 69, 15, 116, 61, 13, 148, 86, 26, 170, 113, 53, 171, 115, 58, 165, 109, 48, 181, 119, 52, 182, 122, 57, 183, 123, 55, 187, 124, 54, 196, 124, 50, 202, 130, 56, 208, 136, 61, 219, 157, 82, 193, 120, 47, 184, 104, 30, 213, 149, 74, 222, 161, 87, 207, 140, 65, 179, 98, 24, 169, 87, 22, 135, 61, 12, 140, 76, 27, 140, 80, 29, 144, 86, 43, 121, 69, 31, 121, 67, 29, 171, 99, 38, 186, 112, 42, 200, 130, 53, 201, 126, 50, 210, 136, 59, 199, 119, 43, 187, 104, 30, 171, 98, 29, 194, 135, 69, 183, 131, 70, 199, 140, 74, 167, 93, 26, 147, 72, 13, 142, 71, 16, 157, 90, 31, 175, 106, 45, 175, 107, 50, 173, 104, 46, 175, 108, 46, 178, 113, 47, 187, 125, 59, 194, 130, 65, 187, 121, 53, 165, 96, 33, 87, 38, 7, 81, 36, 7, 76, 30, + 0, 122, 66, 18, 118, 61, 17, 155, 91, 29, 181, 112, 43, 183, 111, 40, 175, 103, 35, 178, 111, 43, 176, 109, 43, 166, 97, 35, 176, 107, 38, 172, 104, 40, 165, 98, 37, 166, 97, 35, 166, 94, 26, 169, 90, 19, 115, 74, 45, 46, 57, 77, 53, 83, 131, 83, 144, 208, 88, 146, 205, 77, 106, 125, 45, 46, 36, 34, 32, 22, 28, 26, 14, 35, 44, 49, 81, 138, 200, 98, 151, 190, 100, 114, 73, 85, 91, 37, 75, 72, 28, 62, 55, 12, 74, 72, 29, 93, 122, 137, 102, 158, 213, 103, 157, 219, 101, 128, 143, 105, 104, 29, 105, 103, 15, 99, 102, 37, 88, 90, 43, 92, 98, 72, 98, 94, 28, 101, 89, 23, 90, 87, 52, 90, 98, 93, 87, 114, 147, 92, 107, 115, 84, 80, 48, 75, 74, 50, 91, 89, 66, 105, 124, 120, 106, 141, 164, 107, 145, 175, + 84, 92, 72, 89, 84, 23, 91, 83, 20, 85, 74, 25, 106, 94, 14, 106, 101, 21, 110, 110, 40, 104, 111, 81, 102, 113, 96, 103, 130, 133, 99, 133, 142, 100, 129, 134, 108, 139, 145, 116, 165, 206, 112, 171, 227, 68, 117, 170, 90, 130, 158, 110, 189, 249, 116, 195, 249, 118, 194, 248, 118, 194, 249, 116, 192, 248, 113, 189, 248, 107, 185, 249, 110, 185, 250, 110, 184, 249, 110, 183, 250, 110, 181, 247, 104, 150, 200, 108, 97, 86, 117, 94, 59, 127, 94, 53, 121, 87, 47, 114, 75, 38, 110, 70, 29, 96, 60, 21, 71, 41, 9, 100, 62, 24, 140, 89, 39, 142, 88, 32, 134, 78, 26, 156, 97, 35, 152, 99, 38, 141, 87, 30, 121, 71, 22, 127, 78, 32, 161, 98, 37, 162, 98, 35, 143, 76, 17, 137, 72, 13, 142, 73, 14, 133, 66, 10, 122, 58, 9, 112, + 56, 10, 153, 94, 33, 173, 113, 51, 179, 120, 58, 186, 132, 71, 169, 116, 54, 175, 115, 49, 188, 131, 60, 178, 115, 49, 184, 113, 40, 202, 132, 61, 200, 124, 50, 191, 117, 43, 206, 140, 65, 186, 130, 67, 161, 92, 28, 202, 141, 68, 223, 167, 91, 206, 140, 63, 197, 118, 41, 167, 86, 22, 146, 73, 24, 152, 81, 24, 156, 85, 30, 165, 92, 36, 141, 70, 18, 153, 80, 22, 176, 106, 42, 185, 115, 46, 202, 131, 53, 195, 119, 46, 200, 122, 46, 202, 124, 46, 187, 104, 27, 187, 117, 43, 188, 141, 79, 173, 127, 69, 194, 140, 71, 180, 112, 41, 142, 72, 12, 162, 99, 39, 128, 63, 12, 133, 65, 15, 158, 89, 34, 160, 91, 34, 161, 91, 31, 178, 113, 52, 182, 118, 57, 181, 115, 50, 186, 121, 55, 194, 124, 54, 174, 106, 42, 82, 39, 9, 94, 35, + 4, 138, 72, 16, 149, 82, 28, 131, 74, 24, 138, 80, 24, 170, 104, 36, 171, 99, 34, 176, 109, 42, 173, 114, 46, 173, 112, 50, 184, 118, 51, 186, 120, 42, 177, 111, 44, 185, 113, 39, 171, 93, 25, 180, 102, 36, 84, 69, 70, 60, 92, 140, 75, 105, 148, 55, 90, 134, 54, 76, 100, 35, 42, 41, 22, 27, 25, 39, 61, 85, 51, 79, 115, 35, 47, 56, 45, 66, 91, 72, 106, 132, 95, 118, 122, 90, 110, 118, 89, 93, 74, 75, 73, 36, 78, 77, 44, 93, 118, 126, 101, 155, 203, 101, 156, 213, 100, 128, 139, 102, 101, 33, 97, 97, 38, 81, 93, 86, 96, 102, 61, 92, 86, 29, 99, 91, 18, 99, 83, 15, 94, 92, 67, 94, 125, 161, 98, 127, 150, 96, 121, 139, 98, 107, 100, 91, 90, 61, 93, 83, 43, 97, 99, 77, 94, 96, 70, 116, 115, 85, + 85, 85, 38, 91, 91, 51, 84, 76, 31, 87, 73, 28, 107, 103, 65, 116, 117, 85, 114, 111, 58, 103, 96, 39, 104, 103, 45, 107, 110, 49, 104, 116, 85, 103, 125, 124, 99, 116, 110, 110, 135, 146, 81, 128, 176, 85, 111, 129, 113, 183, 238, 117, 194, 249, 116, 193, 248, 118, 192, 250, 115, 191, 248, 112, 190, 247, 111, 187, 248, 109, 185, 248, 110, 183, 249, 111, 182, 250, 111, 178, 245, 110, 169, 236, 105, 121, 135, 112, 92, 51, 125, 98, 57, 128, 93, 52, 121, 84, 45, 120, 83, 45, 114, 76, 38, 84, 54, 25, 74, 41, 12, 120, 74, 27, 158, 104, 43, 133, 81, 30, 156, 97, 34, 148, 90, 30, 150, 94, 38, 122, 74, 28, 122, 76, 30, 152, 90, 33, 159, 94, 30, 153, 91, 33, 134, 73, 16, 118, 60, 10, 134, 68, 12, 153, 84, 22, 120, 62, 16, 139, + 85, 31, 160, 101, 38, 175, 117, 50, 183, 132, 68, 166, 113, 48, 157, 100, 44, 170, 109, 45, 168, 106, 40, 168, 100, 35, 184, 112, 43, 186, 112, 42, 177, 102, 38, 178, 108, 41, 207, 144, 64, 210, 150, 74, 176, 110, 36, 168, 102, 35, 194, 132, 60, 202, 141, 64, 203, 132, 55, 185, 109, 37, 160, 81, 17, 188, 112, 39, 202, 131, 51, 219, 151, 73, 204, 135, 56, 207, 139, 63, 189, 116, 46, 195, 125, 55, 211, 142, 69, 203, 135, 60, 204, 134, 60, 210, 130, 51, 195, 112, 36, 204, 136, 61, 178, 135, 80, 174, 131, 78, 208, 157, 89, 197, 131, 55, 183, 115, 42, 181, 117, 49, 135, 75, 25, 117, 53, 7, 130, 59, 12, 154, 84, 30, 158, 89, 30, 174, 108, 45, 185, 123, 60, 176, 106, 43, 182, 116, 48, 191, 124, 54, 194, 125, 57, 147, 85, 32, 87, 42, + 17, 113, 55, 8, 178, 108, 37, 183, 114, 47, 134, 74, 21, 129, 71, 20, 164, 99, 34, 176, 111, 39, 179, 117, 43, 179, 117, 48, 172, 106, 40, 171, 99, 26, 180, 108, 33, 183, 106, 32, 180, 100, 27, 137, 83, 36, 54, 50, 55, 61, 83, 115, 54, 82, 115, 48, 62, 74, 30, 35, 33, 34, 52, 54, 55, 105, 135, 90, 155, 206, 106, 176, 239, 101, 169, 232, 77, 129, 186, 52, 76, 108, 51, 56, 57, 77, 82, 80, 94, 97, 83, 102, 101, 48, 89, 90, 35, 88, 110, 102, 101, 147, 190, 98, 148, 206, 93, 109, 111, 79, 73, 16, 80, 83, 56, 93, 93, 63, 88, 77, 15, 93, 80, 5, 97, 80, 2, 94, 85, 40, 92, 100, 100, 102, 129, 151, 109, 127, 132, 97, 101, 89, 85, 93, 95, 84, 83, 69, 78, 65, 28, 69, 54, 16, 72, 57, 11, 88, 71, 19, + 87, 123, 153, 79, 108, 139, 75, 90, 114, 94, 104, 108, 103, 119, 129, 101, 113, 120, 104, 105, 97, 95, 98, 78, 99, 101, 56, 97, 100, 56, 99, 104, 47, 108, 123, 103, 102, 112, 104, 93, 122, 149, 87, 95, 94, 109, 167, 217, 114, 188, 249, 113, 189, 250, 115, 187, 249, 114, 188, 248, 111, 187, 249, 111, 185, 249, 111, 184, 249, 107, 181, 247, 112, 180, 247, 112, 181, 248, 113, 181, 247, 101, 147, 204, 108, 100, 57, 114, 91, 28, 132, 101, 56, 135, 97, 57, 131, 92, 49, 128, 91, 53, 109, 81, 42, 75, 56, 32, 79, 50, 24, 127, 80, 32, 136, 88, 30, 140, 89, 33, 157, 102, 42, 150, 93, 34, 141, 91, 32, 130, 77, 25, 155, 94, 33, 162, 94, 34, 167, 99, 36, 148, 86, 25, 136, 71, 13, 123, 65, 17, 143, 78, 18, 145, 83, 21, 159, 93, 27, 173, + 112, 43, 166, 106, 44, 163, 103, 44, 171, 113, 49, 158, 103, 44, 163, 107, 47, 171, 113, 45, 170, 108, 41, 181, 114, 44, 178, 108, 42, 163, 97, 37, 180, 131, 62, 143, 101, 41, 112, 70, 22, 115, 78, 29, 153, 110, 47, 152, 94, 34, 203, 155, 83, 217, 167, 94, 220, 166, 92, 200, 132, 56, 201, 126, 45, 209, 137, 57, 220, 154, 78, 213, 151, 75, 220, 151, 71, 208, 141, 62, 196, 124, 51, 205, 136, 61, 214, 145, 66, 207, 142, 64, 208, 140, 64, 210, 130, 52, 191, 110, 33, 205, 149, 69, 201, 154, 87, 214, 169, 98, 216, 172, 99, 172, 112, 46, 134, 88, 38, 125, 80, 33, 144, 102, 50, 165, 110, 47, 156, 88, 30, 153, 77, 21, 162, 90, 34, 161, 92, 33, 184, 118, 56, 173, 102, 42, 163, 92, 31, 183, 112, 45, 199, 126, 59, 192, 124, 54, 132, 78, + 31, 91, 41, 13, 144, 80, 23, 189, 115, 44, 191, 122, 52, 156, 94, 31, 156, 93, 32, 165, 100, 32, 170, 104, 35, 174, 110, 39, 185, 118, 47, 181, 110, 37, 192, 115, 39, 177, 98, 26, 138, 80, 30, 89, 57, 31, 56, 52, 50, 59, 62, 63, 42, 44, 44, 39, 40, 32, 47, 67, 65, 76, 134, 154, 97, 163, 193, 101, 175, 221, 111, 189, 243, 125, 197, 247, 118, 193, 250, 103, 172, 242, 87, 141, 203, 71, 91, 110, 70, 67, 40, 83, 77, 27, 87, 92, 56, 94, 127, 149, 99, 156, 214, 97, 147, 203, 77, 89, 96, 69, 64, 25, 71, 61, 8, 75, 64, 8, 73, 58, 2, 80, 65, 0, 91, 79, 17, 101, 105, 88, 91, 103, 109, 90, 96, 92, 76, 72, 55, 67, 53, 25, 66, 45, 14, 67, 43, 10, 67, 43, 8, 70, 57, 29, 90, 86, 67, 104, 86, 36, + 94, 138, 187, 80, 114, 155, 82, 97, 107, 97, 135, 177, 101, 154, 219, 98, 127, 165, 109, 136, 156, 89, 127, 167, 98, 109, 86, 88, 84, 34, 91, 83, 21, 106, 99, 36, 112, 137, 132, 83, 108, 128, 103, 140, 170, 114, 179, 244, 112, 183, 248, 110, 183, 248, 113, 182, 249, 113, 182, 250, 112, 182, 248, 113, 182, 249, 111, 183, 248, 94, 153, 218, 113, 178, 241, 115, 183, 248, 107, 171, 238, 99, 121, 154, 103, 88, 33, 122, 103, 34, 140, 111, 57, 139, 103, 59, 138, 101, 58, 136, 102, 58, 101, 79, 41, 70, 58, 41, 78, 52, 32, 145, 93, 39, 125, 78, 29, 152, 98, 42, 160, 101, 43, 148, 93, 36, 129, 79, 27, 127, 75, 21, 154, 90, 27, 159, 94, 31, 148, 83, 20, 148, 85, 22, 138, 72, 20, 124, 62, 14, 147, 83, 19, 165, 95, 29, 175, 108, 39, 184, + 121, 56, 169, 109, 44, 170, 108, 49, 166, 106, 44, 136, 82, 28, 165, 107, 44, 178, 120, 49, 182, 121, 53, 195, 134, 64, 190, 128, 61, 151, 93, 30, 68, 37, 6, 17, 5, 0, 16, 5, 3, 75, 82, 115, 19, 9, 3, 74, 38, 3, 212, 167, 91, 236, 193, 118, 230, 180, 105, 221, 167, 95, 191, 131, 56, 207, 143, 67, 229, 168, 89, 209, 143, 62, 217, 145, 64, 216, 147, 67, 221, 154, 78, 210, 140, 65, 210, 137, 59, 206, 133, 54, 202, 131, 51, 207, 134, 51, 203, 132, 54, 199, 147, 74, 229, 177, 96, 235, 193, 113, 192, 150, 82, 60, 36, 15, 13, 8, 5, 12, 6, 3, 15, 4, 0, 63, 31, 2, 161, 100, 40, 160, 89, 29, 184, 118, 49, 192, 127, 63, 183, 115, 50, 162, 91, 32, 143, 70, 18, 164, 91, 31, 182, 110, 48, 200, 135, 65, 197, 137, + 68, 145, 91, 43, 86, 41, 11, 159, 91, 31, 182, 108, 40, 183, 114, 46, 171, 110, 54, 154, 93, 41, 161, 97, 35, 179, 111, 39, 177, 115, 47, 189, 126, 55, 191, 120, 45, 165, 101, 35, 114, 70, 30, 110, 71, 39, 80, 56, 36, 40, 35, 26, 35, 35, 28, 46, 51, 42, 69, 113, 119, 93, 153, 179, 101, 176, 219, 118, 195, 244, 128, 201, 249, 130, 200, 250, 117, 194, 250, 112, 184, 249, 113, 180, 247, 106, 159, 206, 96, 115, 100, 80, 96, 90, 70, 84, 88, 82, 88, 83, 90, 119, 139, 86, 123, 157, 76, 101, 133, 74, 73, 48, 71, 60, 14, 69, 62, 29, 72, 60, 19, 79, 62, 6, 87, 72, 15, 80, 70, 54, 66, 52, 38, 58, 38, 11, 66, 41, 12, 81, 55, 7, 88, 66, 13, 80, 59, 12, 80, 63, 19, 90, 85, 42, 105, 116, 105, 114, 121, 112, + 98, 113, 110, 82, 94, 95, 96, 101, 84, 113, 158, 206, 106, 157, 216, 110, 146, 188, 117, 172, 235, 99, 150, 205, 93, 122, 139, 94, 98, 70, 92, 92, 63, 111, 110, 54, 105, 123, 119, 100, 114, 107, 109, 165, 221, 111, 171, 237, 112, 177, 245, 113, 172, 236, 114, 174, 237, 114, 178, 244, 113, 177, 244, 115, 179, 246, 102, 170, 242, 92, 132, 170, 104, 155, 209, 105, 151, 203, 98, 133, 176, 99, 94, 55, 114, 92, 28, 127, 103, 47, 143, 112, 64, 143, 109, 62, 143, 108, 57, 133, 105, 54, 97, 77, 32, 68, 49, 21, 87, 51, 18, 134, 85, 31, 135, 88, 37, 147, 96, 38, 161, 104, 44, 137, 82, 28, 101, 54, 16, 141, 82, 25, 155, 91, 27, 142, 83, 27, 141, 81, 19, 141, 79, 23, 107, 55, 13, 136, 73, 18, 153, 92, 32, 169, 99, 31, 173, 106, 38, 161, + 95, 34, 147, 84, 28, 155, 94, 35, 133, 76, 25, 115, 59, 13, 160, 100, 34, 179, 117, 43, 181, 118, 49, 155, 97, 34, 135, 79, 28, 54, 29, 9, 10, 4, 0, 70, 35, 7, 140, 79, 20, 154, 96, 32, 90, 50, 15, 46, 24, 4, 171, 126, 59, 209, 162, 83, 239, 195, 110, 230, 184, 112, 209, 155, 81, 201, 136, 59, 198, 120, 41, 202, 122, 41, 209, 133, 53, 212, 139, 57, 211, 136, 57, 200, 123, 49, 200, 123, 47, 198, 115, 38, 194, 117, 38, 198, 127, 46, 215, 150, 72, 196, 153, 90, 227, 177, 99, 213, 170, 93, 134, 97, 46, 98, 47, 5, 97, 57, 17, 37, 15, 3, 20, 4, 0, 5, 3, 0, 46, 23, 3, 120, 59, 10, 145, 81, 24, 188, 123, 49, 186, 118, 48, 160, 92, 32, 125, 56, 11, 142, 70, 20, 164, 89, 31, 186, 115, 50, 201, 137, + 69, 187, 127, 64, 131, 78, 38, 101, 53, 16, 144, 79, 19, 181, 106, 39, 184, 115, 49, 168, 108, 50, 151, 96, 48, 147, 90, 39, 168, 106, 44, 189, 128, 55, 199, 137, 66, 178, 118, 58, 118, 80, 45, 86, 57, 32, 95, 69, 41, 85, 69, 43, 72, 74, 51, 70, 105, 112, 85, 147, 185, 102, 175, 228, 123, 200, 246, 131, 204, 249, 132, 204, 251, 130, 202, 250, 121, 195, 249, 115, 188, 249, 114, 183, 246, 103, 155, 190, 100, 125, 119, 98, 145, 166, 103, 159, 206, 85, 121, 152, 67, 68, 44, 72, 67, 43, 78, 84, 76, 78, 73, 45, 81, 69, 36, 82, 67, 28, 77, 61, 18, 71, 52, 9, 68, 49, 6, 67, 45, 4, 71, 51, 3, 78, 63, 21, 96, 90, 60, 100, 96, 73, 101, 103, 93, 98, 95, 77, 83, 76, 47, 88, 109, 131, 107, 136, 163, 116, 140, 154, + 90, 90, 67, 86, 82, 36, 117, 128, 112, 105, 145, 189, 109, 127, 137, 118, 160, 197, 118, 179, 245, 91, 145, 210, 83, 91, 100, 90, 90, 50, 97, 93, 26, 107, 103, 43, 97, 89, 36, 118, 164, 203, 111, 179, 245, 107, 160, 222, 107, 157, 207, 110, 149, 184, 114, 167, 222, 114, 168, 228, 114, 165, 212, 108, 167, 230, 91, 129, 171, 83, 80, 77, 107, 129, 148, 112, 166, 228, 99, 127, 158, 99, 84, 23, 116, 89, 37, 131, 102, 57, 139, 107, 62, 131, 99, 48, 131, 95, 43, 127, 103, 56, 81, 64, 31, 59, 33, 8, 82, 42, 10, 122, 70, 26, 141, 93, 38, 147, 96, 37, 137, 77, 26, 127, 70, 22, 133, 79, 19, 139, 79, 23, 133, 74, 20, 147, 88, 29, 158, 96, 34, 148, 89, 25, 105, 55, 14, 131, 71, 17, 157, 92, 31, 164, 93, 28, 165, 96, 31, 147, + 84, 32, 124, 64, 22, 143, 86, 32, 109, 58, 16, 129, 69, 20, 135, 78, 20, 155, 95, 34, 152, 89, 28, 148, 85, 28, 129, 78, 34, 206, 169, 102, 170, 134, 85, 158, 84, 30, 221, 125, 29, 215, 125, 36, 130, 65, 16, 29, 15, 5, 137, 89, 31, 216, 166, 84, 240, 192, 108, 211, 152, 75, 177, 112, 36, 171, 96, 22, 175, 94, 12, 206, 122, 39, 210, 126, 44, 211, 132, 52, 197, 121, 48, 205, 126, 52, 217, 140, 60, 210, 129, 51, 194, 113, 35, 174, 95, 21, 203, 139, 58, 217, 164, 89, 230, 181, 97, 211, 165, 85, 101, 73, 33, 93, 41, 3, 205, 117, 27, 184, 104, 27, 42, 20, 7, 23, 12, 5, 91, 54, 19, 156, 99, 42, 106, 50, 11, 167, 96, 26, 192, 125, 54, 156, 85, 26, 102, 39, 4, 131, 62, 19, 159, 88, 30, 175, 103, 41, 191, 120, + 55, 199, 135, 68, 194, 133, 67, 139, 87, 42, 79, 34, 9, 140, 73, 17, 190, 119, 45, 195, 124, 51, 190, 132, 69, 173, 120, 69, 172, 115, 57, 185, 124, 57, 199, 137, 61, 203, 145, 65, 203, 145, 72, 174, 131, 77, 103, 73, 43, 104, 79, 43, 85, 84, 62, 68, 101, 107, 88, 153, 193, 112, 187, 243, 114, 187, 241, 129, 203, 249, 131, 205, 251, 128, 203, 249, 118, 192, 249, 120, 189, 248, 113, 181, 242, 96, 137, 153, 88, 106, 84, 94, 133, 142, 90, 131, 151, 89, 106, 95, 84, 91, 64, 65, 61, 26, 53, 42, 5, 62, 47, 8, 81, 65, 20, 84, 66, 23, 75, 56, 12, 69, 55, 14, 75, 61, 7, 80, 67, 0, 97, 85, 13, 101, 91, 32, 105, 106, 74, 109, 110, 87, 107, 110, 104, 95, 98, 99, 96, 99, 99, 90, 106, 117, 97, 142, 199, 111, 159, 214, + 65, 67, 67, 86, 82, 60, 113, 131, 135, 109, 133, 150, 123, 154, 175, 113, 160, 214, 98, 148, 206, 75, 104, 134, 72, 68, 49, 88, 80, 14, 100, 104, 57, 87, 89, 67, 111, 112, 84, 109, 142, 178, 112, 164, 215, 106, 154, 207, 107, 121, 119, 109, 149, 177, 110, 155, 202, 107, 126, 130, 105, 122, 131, 105, 131, 163, 106, 144, 184, 100, 142, 194, 107, 145, 186, 108, 161, 221, 97, 105, 95, 109, 90, 22, 121, 94, 49, 132, 100, 59, 136, 104, 61, 126, 96, 51, 115, 85, 47, 98, 80, 60, 55, 36, 22, 54, 28, 8, 81, 43, 14, 124, 76, 33, 152, 101, 43, 118, 69, 19, 133, 73, 20, 129, 73, 18, 121, 73, 23, 118, 72, 25, 153, 94, 32, 177, 113, 44, 150, 91, 26, 123, 67, 21, 109, 54, 12, 147, 78, 19, 176, 109, 36, 157, 90, 25, 150, 87, 32, 132, + 72, 23, 129, 67, 29, 137, 78, 29, 121, 65, 19, 131, 69, 17, 113, 62, 11, 133, 75, 19, 194, 136, 68, 198, 142, 74, 203, 138, 63, 246, 212, 133, 246, 224, 156, 223, 193, 127, 207, 161, 93, 204, 155, 91, 166, 128, 81, 75, 46, 21, 83, 45, 7, 184, 126, 51, 226, 163, 77, 204, 144, 67, 146, 81, 15, 171, 97, 21, 194, 115, 35, 205, 125, 44, 203, 122, 40, 205, 124, 40, 185, 101, 24, 216, 139, 56, 219, 147, 61, 212, 142, 57, 203, 135, 52, 180, 108, 32, 170, 99, 28, 218, 153, 74, 221, 163, 81, 165, 124, 59, 75, 46, 15, 115, 79, 38, 161, 115, 61, 165, 115, 64, 156, 118, 67, 197, 153, 89, 227, 176, 98, 212, 148, 68, 183, 111, 39, 182, 114, 44, 194, 133, 69, 153, 87, 32, 117, 52, 13, 131, 63, 17, 153, 80, 28, 164, 91, 33, 183, 120, + 56, 203, 140, 75, 203, 146, 76, 170, 117, 64, 118, 73, 34, 101, 52, 16, 127, 67, 18, 130, 71, 19, 181, 110, 41, 195, 129, 56, 189, 127, 60, 178, 116, 53, 177, 113, 47, 197, 132, 57, 204, 143, 62, 205, 147, 70, 191, 142, 78, 134, 103, 62, 100, 93, 71, 93, 106, 100, 92, 135, 162, 106, 176, 230, 121, 197, 246, 128, 201, 249, 132, 205, 251, 124, 199, 250, 116, 188, 247, 117, 186, 246, 108, 175, 237, 83, 125, 138, 60, 77, 54, 54, 71, 57, 46, 51, 36, 53, 54, 29, 51, 43, 18, 47, 39, 10, 61, 56, 39, 71, 77, 82, 80, 86, 86, 74, 84, 85, 70, 72, 64, 73, 62, 30, 75, 63, 10, 83, 76, 17, 97, 89, 20, 98, 93, 26, 108, 104, 41, 111, 111, 58, 111, 112, 81, 111, 113, 97, 97, 106, 111, 108, 133, 152, 103, 137, 169, 100, 149, 212, + 58, 57, 51, 101, 100, 72, 114, 162, 218, 111, 138, 166, 111, 153, 198, 99, 141, 191, 82, 105, 105, 75, 89, 80, 82, 77, 37, 101, 101, 45, 84, 102, 108, 92, 85, 55, 131, 132, 115, 121, 162, 211, 97, 122, 152, 103, 123, 133, 100, 102, 76, 95, 118, 145, 98, 107, 103, 109, 128, 132, 113, 160, 208, 109, 163, 223, 107, 158, 205, 114, 172, 230, 114, 174, 241, 95, 142, 202, 102, 90, 55, 115, 90, 35, 125, 93, 46, 136, 104, 60, 131, 103, 59, 123, 97, 53, 92, 67, 39, 97, 67, 36, 57, 33, 14, 52, 26, 7, 71, 38, 10, 122, 76, 36, 129, 81, 30, 94, 51, 14, 120, 64, 12, 103, 58, 16, 75, 41, 9, 159, 104, 44, 185, 121, 44, 159, 93, 27, 134, 72, 19, 138, 80, 22, 128, 71, 22, 147, 83, 21, 170, 98, 32, 164, 93, 34, 156, 89, 32, 155, + 91, 39, 125, 63, 19, 112, 53, 13, 130, 72, 24, 142, 83, 28, 132, 73, 17, 150, 87, 26, 176, 119, 50, 200, 143, 71, 219, 166, 94, 215, 160, 87, 241, 215, 147, 247, 232, 172, 251, 235, 171, 248, 226, 154, 222, 182, 112, 172, 128, 67, 104, 60, 18, 163, 98, 31, 223, 158, 79, 173, 106, 41, 151, 81, 19, 178, 107, 27, 192, 116, 31, 206, 131, 41, 211, 135, 46, 199, 117, 29, 178, 94, 12, 200, 116, 31, 209, 132, 47, 207, 135, 47, 196, 124, 40, 178, 107, 31, 162, 88, 19, 205, 138, 63, 228, 170, 92, 165, 103, 35, 122, 81, 40, 163, 103, 42, 240, 195, 110, 245, 203, 120, 246, 213, 136, 241, 206, 129, 224, 167, 91, 183, 113, 44, 179, 110, 47, 185, 117, 53, 199, 137, 68, 185, 119, 56, 134, 68, 21, 125, 59, 17, 142, 73, 26, 161, 92, 37, 188, 125, + 57, 197, 134, 67, 199, 138, 69, 197, 139, 73, 180, 126, 59, 157, 103, 52, 128, 78, 35, 111, 63, 25, 99, 51, 15, 111, 54, 14, 159, 94, 30, 184, 115, 43, 188, 125, 52, 191, 121, 48, 197, 128, 52, 196, 132, 53, 199, 138, 61, 185, 131, 67, 140, 123, 102, 97, 131, 163, 97, 147, 187, 104, 173, 232, 127, 201, 247, 130, 203, 249, 132, 205, 250, 120, 195, 249, 111, 178, 234, 104, 166, 216, 86, 135, 176, 60, 86, 93, 35, 41, 26, 25, 29, 19, 21, 21, 7, 32, 32, 18, 54, 59, 49, 67, 82, 75, 92, 120, 139, 106, 134, 166, 107, 123, 141, 90, 124, 162, 83, 123, 174, 73, 82, 89, 59, 47, 15, 66, 50, 13, 79, 65, 11, 94, 80, 16, 105, 98, 40, 114, 115, 84, 118, 126, 121, 111, 122, 129, 101, 116, 132, 99, 130, 177, 106, 133, 171, 94, 121, 162, + 72, 67, 39, 115, 119, 97, 102, 136, 172, 110, 126, 135, 105, 133, 163, 105, 118, 123, 96, 101, 47, 91, 106, 97, 101, 94, 42, 91, 110, 105, 93, 89, 56, 109, 148, 190, 140, 153, 157, 128, 165, 212, 92, 130, 171, 90, 80, 44, 100, 88, 61, 107, 103, 55, 118, 139, 132, 118, 165, 221, 115, 169, 229, 111, 163, 223, 101, 139, 168, 114, 148, 173, 115, 173, 232, 88, 123, 162, 100, 76, 30, 115, 86, 43, 125, 93, 55, 128, 100, 56, 130, 102, 56, 106, 81, 41, 74, 57, 40, 104, 72, 41, 52, 29, 5, 54, 29, 9, 62, 30, 7, 118, 71, 29, 81, 45, 8, 99, 54, 16, 101, 52, 10, 112, 69, 28, 181, 121, 50, 185, 125, 47, 139, 83, 24, 127, 64, 9, 119, 62, 12, 160, 100, 37, 175, 115, 51, 168, 102, 34, 174, 104, 34, 155, 83, 22, 148, 81, 22, 150, + 81, 28, 123, 61, 21, 85, 35, 3, 125, 68, 18, 138, 76, 18, 135, 73, 17, 160, 97, 31, 175, 114, 46, 191, 126, 54, 218, 160, 86, 209, 150, 78, 219, 166, 97, 228, 182, 108, 241, 201, 128, 228, 187, 114, 213, 175, 105, 188, 143, 76, 130, 82, 27, 158, 95, 35, 200, 133, 60, 159, 93, 27, 156, 82, 14, 174, 98, 19, 186, 103, 22, 189, 109, 21, 188, 104, 20, 172, 89, 9, 176, 98, 21, 179, 98, 22, 175, 93, 18, 175, 96, 17, 182, 101, 18, 182, 99, 16, 175, 96, 21, 189, 120, 51, 203, 136, 61, 155, 83, 20, 171, 117, 56, 191, 133, 65, 208, 166, 101, 229, 188, 111, 209, 157, 91, 190, 135, 72, 185, 125, 58, 196, 138, 65, 209, 150, 76, 216, 158, 86, 205, 143, 73, 184, 114, 46, 153, 82, 29, 118, 53, 16, 142, 74, 27, 156, 84, 33, 169, 102, + 39, 186, 119, 53, 190, 121, 54, 195, 131, 64, 199, 142, 78, 172, 118, 65, 153, 103, 53, 149, 99, 52, 122, 71, 26, 76, 35, 11, 66, 26, 6, 94, 48, 14, 129, 78, 26, 139, 79, 34, 155, 96, 34, 165, 109, 48, 173, 110, 43, 180, 121, 61, 171, 128, 80, 144, 152, 169, 116, 160, 208, 108, 174, 236, 113, 189, 247, 112, 184, 242, 107, 177, 238, 94, 155, 208, 79, 113, 132, 61, 74, 71, 33, 40, 27, 25, 31, 15, 30, 36, 23, 33, 38, 19, 49, 54, 35, 62, 80, 71, 81, 124, 146, 90, 131, 156, 97, 127, 141, 106, 125, 144, 102, 124, 144, 84, 120, 158, 82, 103, 121, 67, 68, 48, 70, 63, 32, 76, 73, 61, 75, 60, 26, 76, 52, 8, 88, 69, 37, 98, 95, 87, 98, 97, 97, 92, 96, 92, 98, 117, 135, 104, 132, 163, 105, 137, 179, 94, 131, 177, + 88, 83, 58, 101, 89, 41, 94, 83, 45, 113, 117, 104, 116, 132, 142, 116, 118, 104, 117, 122, 77, 96, 106, 97, 100, 99, 61, 87, 84, 50, 110, 135, 141, 99, 127, 157, 116, 107, 87, 96, 98, 84, 87, 81, 45, 97, 92, 60, 105, 94, 62, 122, 121, 85, 122, 143, 157, 120, 148, 168, 117, 150, 171, 115, 149, 176, 106, 142, 172, 100, 119, 117, 101, 130, 150, 78, 72, 61, 87, 61, 14, 105, 76, 32, 117, 90, 49, 127, 98, 61, 122, 95, 50, 84, 70, 54, 75, 67, 64, 80, 51, 31, 83, 48, 17, 50, 22, 2, 57, 25, 7, 117, 70, 28, 48, 20, 0, 67, 30, 5, 82, 42, 14, 157, 104, 46, 155, 99, 35, 148, 88, 27, 137, 71, 16, 112, 55, 12, 146, 86, 32, 183, 123, 58, 181, 119, 53, 175, 111, 41, 162, 92, 29, 162, 93, 31, 168, 100, 38, 162, + 96, 39, 128, 67, 24, 82, 35, 7, 88, 39, 7, 131, 71, 17, 134, 76, 14, 140, 77, 17, 180, 112, 41, 194, 127, 56, 212, 156, 87, 220, 166, 95, 215, 170, 102, 216, 176, 111, 216, 187, 125, 203, 160, 94, 227, 181, 108, 194, 146, 78, 137, 87, 32, 128, 69, 20, 190, 122, 50, 168, 100, 29, 160, 90, 20, 161, 84, 13, 162, 81, 10, 177, 94, 17, 183, 105, 23, 173, 100, 21, 160, 87, 17, 168, 93, 18, 159, 84, 13, 155, 80, 13, 155, 75, 7, 164, 81, 7, 175, 95, 20, 172, 96, 24, 169, 101, 40, 144, 76, 22, 169, 111, 49, 196, 139, 65, 208, 168, 105, 199, 157, 97, 189, 148, 86, 184, 131, 67, 187, 130, 63, 197, 136, 62, 203, 139, 68, 200, 135, 65, 186, 111, 45, 181, 108, 40, 163, 93, 35, 128, 61, 20, 147, 78, 32, 160, 90, 37, 172, 104, + 45, 186, 115, 55, 194, 130, 65, 190, 128, 62, 198, 139, 74, 201, 146, 81, 203, 148, 79, 187, 131, 71, 155, 99, 46, 129, 75, 31, 121, 76, 38, 86, 49, 19, 76, 42, 16, 94, 52, 17, 114, 68, 27, 123, 76, 32, 142, 90, 36, 154, 105, 57, 129, 108, 95, 115, 129, 153, 114, 143, 176, 100, 130, 153, 89, 110, 116, 84, 99, 94, 74, 88, 83, 55, 61, 43, 43, 47, 19, 41, 58, 57, 45, 90, 122, 69, 113, 129, 72, 121, 136, 81, 123, 130, 87, 127, 129, 89, 120, 117, 71, 110, 118, 81, 119, 143, 93, 133, 160, 102, 135, 166, 98, 141, 183, 83, 119, 156, 70, 81, 89, 72, 71, 71, 69, 56, 26, 72, 57, 19, 80, 61, 10, 87, 65, 12, 93, 69, 14, 87, 59, 27, 82, 58, 26, 84, 72, 51, 93, 98, 99, 104, 124, 147, 112, 132, 155, 117, 129, 126, + 111, 105, 72, 105, 88, 43, 102, 80, 45, 111, 91, 52, 127, 110, 68, 127, 115, 73, 117, 117, 84, 95, 92, 65, 81, 65, 7, 90, 74, 21, 90, 86, 48, 80, 69, 40, 81, 64, 17, 82, 70, 10, 87, 79, 26, 91, 92, 72, 89, 75, 33, 110, 91, 50, 119, 122, 110, 120, 152, 178, 117, 161, 208, 115, 161, 214, 104, 146, 193, 102, 129, 143, 84, 81, 61, 71, 45, 10, 77, 48, 8, 87, 57, 20, 109, 77, 42, 116, 89, 52, 111, 84, 50, 77, 68, 58, 63, 58, 59, 73, 50, 34, 76, 37, 14, 64, 29, 6, 73, 40, 14, 86, 46, 12, 47, 18, 1, 70, 39, 16, 146, 97, 38, 157, 105, 36, 135, 82, 24, 142, 80, 21, 103, 51, 11, 135, 75, 26, 164, 104, 38, 188, 132, 63, 185, 126, 55, 173, 106, 40, 164, 95, 33, 170, 99, 38, 176, 108, 42, 174, + 107, 46, 136, 73, 25, 98, 52, 14, 59, 20, 0, 112, 50, 9, 106, 50, 7, 116, 59, 8, 140, 75, 15, 150, 87, 29, 174, 114, 53, 205, 154, 87, 211, 161, 93, 209, 160, 93, 227, 190, 125, 210, 165, 99, 234, 191, 115, 160, 112, 57, 108, 51, 7, 156, 92, 30, 188, 122, 46, 170, 100, 27, 142, 73, 6, 151, 77, 13, 173, 96, 19, 176, 97, 21, 165, 92, 18, 147, 77, 11, 137, 69, 5, 154, 84, 17, 154, 83, 16, 157, 90, 18, 153, 81, 12, 131, 59, 0, 166, 85, 13, 181, 106, 27, 182, 115, 45, 124, 65, 18, 149, 88, 25, 194, 134, 62, 207, 165, 97, 193, 147, 82, 186, 134, 71, 197, 147, 81, 196, 139, 71, 203, 142, 71, 211, 148, 81, 180, 108, 43, 174, 96, 38, 179, 106, 37, 148, 78, 23, 126, 60, 21, 138, 73, 28, 130, 66, 25, 154, 89, + 39, 174, 103, 47, 187, 125, 66, 200, 138, 70, 202, 142, 77, 198, 144, 76, 205, 150, 81, 208, 145, 74, 204, 142, 69, 200, 140, 70, 194, 136, 67, 184, 129, 66, 159, 104, 37, 108, 66, 27, 77, 44, 14, 102, 61, 22, 131, 76, 25, 148, 92, 35, 160, 112, 67, 108, 97, 80, 85, 83, 59, 74, 71, 32, 62, 57, 13, 59, 54, 15, 55, 57, 23, 49, 48, 11, 51, 49, 5, 60, 80, 72, 80, 133, 164, 86, 143, 167, 79, 141, 172, 91, 140, 154, 95, 145, 154, 89, 133, 117, 67, 91, 64, 70, 89, 91, 89, 128, 156, 98, 143, 179, 102, 161, 217, 81, 125, 175, 67, 79, 92, 87, 83, 81, 81, 65, 26, 80, 63, 8, 91, 73, 20, 97, 78, 36, 101, 85, 54, 99, 93, 85, 107, 100, 78, 98, 91, 70, 89, 67, 32, 84, 63, 35, 90, 79, 56, 108, 96, 44, + 138, 126, 35, 127, 102, 36, 134, 108, 48, 129, 103, 37, 126, 102, 38, 115, 94, 39, 107, 93, 53, 88, 78, 30, 78, 62, 4, 97, 85, 17, 90, 81, 15, 80, 70, 17, 74, 67, 38, 78, 65, 17, 86, 73, 28, 87, 74, 31, 93, 72, 17, 107, 83, 30, 116, 108, 77, 116, 150, 184, 118, 168, 228, 115, 168, 232, 100, 139, 179, 94, 108, 112, 79, 64, 33, 81, 54, 10, 82, 50, 12, 80, 48, 14, 94, 62, 29, 106, 78, 41, 96, 72, 42, 90, 82, 77, 64, 53, 50, 63, 35, 16, 70, 35, 10, 70, 32, 6, 66, 28, 5, 54, 23, 5, 45, 19, 3, 114, 73, 27, 164, 107, 40, 149, 91, 29, 137, 80, 22, 98, 46, 8, 137, 77, 18, 170, 103, 33, 184, 125, 55, 182, 122, 51, 182, 115, 49, 179, 112, 42, 170, 102, 35, 168, 101, 38, 167, 99, 40, 156, + 92, 40, 160, 97, 45, 132, 71, 30, 63, 25, 6, 91, 38, 5, 97, 42, 6, 88, 39, 5, 140, 76, 17, 165, 104, 43, 176, 122, 59, 197, 146, 81, 214, 164, 95, 229, 184, 115, 226, 187, 123, 223, 182, 117, 192, 142, 84, 124, 72, 24, 100, 47, 9, 170, 105, 37, 173, 102, 26, 142, 70, 10, 120, 55, 2, 142, 71, 10, 144, 74, 12, 138, 75, 14, 132, 72, 12, 139, 74, 10, 147, 85, 20, 140, 83, 22, 134, 77, 17, 141, 83, 20, 151, 86, 19, 151, 82, 16, 136, 61, 4, 151, 73, 7, 182, 115, 41, 174, 111, 50, 128, 65, 16, 155, 96, 33, 197, 142, 72, 182, 124, 58, 179, 118, 54, 203, 151, 84, 205, 151, 82, 207, 148, 78, 197, 133, 66, 176, 103, 42, 176, 104, 39, 174, 103, 36, 129, 61, 15, 122, 58, 16, 129, 65, 25, 116, 59, 23, 105, 47, + 13, 142, 77, 31, 184, 119, 61, 190, 128, 63, 194, 134, 66, 196, 134, 64, 200, 136, 68, 194, 127, 57, 195, 127, 53, 200, 135, 62, 205, 142, 67, 205, 146, 78, 186, 124, 58, 155, 93, 33, 142, 85, 29, 135, 85, 36, 125, 73, 25, 145, 84, 30, 161, 101, 44, 147, 101, 52, 103, 75, 38, 69, 57, 19, 43, 39, 7, 37, 39, 19, 34, 40, 18, 30, 32, 7, 37, 37, 7, 43, 45, 18, 52, 53, 30, 38, 50, 39, 28, 49, 48, 34, 54, 45, 53, 74, 63, 68, 85, 44, 63, 78, 22, 77, 89, 62, 89, 101, 87, 86, 113, 124, 98, 134, 155, 100, 115, 115, 85, 75, 39, 95, 75, 27, 101, 79, 23, 91, 70, 13, 87, 67, 14, 86, 66, 30, 89, 71, 51, 86, 72, 55, 86, 68, 40, 92, 77, 47, 95, 76, 35, 94, 73, 21, 90, 66, 13, 82, 58, 11, + 136, 118, 16, 137, 119, 37, 114, 98, 24, 102, 82, 18, 93, 77, 18, 86, 65, 10, 90, 70, 10, 96, 82, 5, 93, 83, 5, 103, 95, 12, 98, 92, 7, 87, 84, 39, 82, 78, 61, 97, 90, 65, 92, 91, 75, 96, 79, 21, 105, 88, 32, 108, 96, 63, 118, 102, 57, 123, 129, 119, 114, 140, 160, 108, 143, 179, 106, 126, 131, 92, 88, 55, 90, 65, 13, 101, 70, 20, 97, 62, 19, 87, 51, 17, 85, 53, 19, 91, 64, 30, 75, 51, 32, 73, 51, 36, 66, 39, 18, 58, 28, 9, 60, 26, 7, 58, 25, 4, 58, 28, 8, 56, 25, 6, 88, 54, 22, 147, 99, 39, 170, 111, 51, 139, 82, 27, 106, 53, 14, 159, 98, 37, 178, 112, 41, 190, 128, 57, 187, 124, 54, 172, 110, 42, 180, 113, 43, 192, 127, 56, 177, 113, 44, 167, 99, 32, 169, 105, 42, 166, + 99, 45, 168, 108, 51, 144, 81, 35, 84, 40, 15, 74, 23, 2, 98, 43, 5, 77, 29, 4, 117, 56, 10, 161, 97, 37, 182, 125, 61, 195, 144, 78, 207, 163, 95, 221, 173, 104, 215, 169, 100, 208, 159, 95, 149, 98, 47, 129, 74, 25, 132, 70, 18, 169, 104, 36, 167, 97, 27, 110, 45, 0, 122, 65, 9, 124, 63, 11, 124, 65, 12, 126, 69, 15, 123, 67, 13, 134, 73, 18, 140, 81, 21, 125, 73, 19, 122, 70, 19, 127, 76, 22, 137, 85, 27, 151, 90, 27, 139, 71, 11, 142, 62, 1, 186, 115, 40, 186, 121, 52, 137, 74, 23, 134, 71, 18, 188, 124, 55, 190, 128, 61, 189, 129, 64, 200, 144, 75, 208, 153, 87, 211, 152, 82, 203, 141, 71, 166, 94, 31, 163, 84, 23, 162, 90, 28, 97, 37, 3, 145, 83, 38, 138, 79, 35, 115, 59, 26, 101, 49, + 19, 125, 66, 21, 153, 94, 38, 180, 119, 57, 192, 127, 59, 193, 127, 61, 180, 113, 46, 179, 109, 45, 173, 104, 37, 175, 106, 36, 192, 125, 54, 209, 148, 74, 209, 147, 76, 203, 140, 71, 175, 116, 55, 165, 104, 47, 146, 90, 35, 154, 86, 28, 162, 97, 34, 161, 101, 42, 142, 94, 50, 73, 60, 35, 70, 87, 99, 79, 128, 174, 78, 139, 195, 49, 83, 107, 24, 28, 14, 25, 33, 25, 23, 30, 20, 15, 20, 12, 8, 15, 10, 8, 15, 8, 13, 17, 3, 30, 32, 0, 52, 50, 1, 56, 53, 14, 47, 43, 8, 55, 49, 17, 88, 77, 23, 100, 86, 10, 111, 92, 18, 114, 91, 21, 99, 76, 12, 81, 59, 8, 71, 47, 8, 68, 41, 9, 69, 41, 10, 70, 41, 8, 74, 45, 7, 81, 51, 12, 84, 57, 10, 86, 62, 12, 85, 64, 14, 79, 59, 20, + 93, 78, 11, 93, 78, 8, 81, 68, 2, 94, 82, 13, 95, 86, 5, 94, 78, 8, 100, 80, 10, 110, 99, 7, 108, 99, 8, 104, 98, 9, 105, 94, 2, 107, 104, 47, 100, 89, 62, 106, 100, 73, 98, 90, 40, 106, 92, 19, 112, 106, 64, 101, 96, 74, 107, 88, 41, 125, 102, 32, 114, 110, 82, 109, 114, 113, 109, 112, 97, 99, 88, 32, 104, 76, 12, 116, 87, 28, 107, 74, 30, 95, 61, 22, 81, 52, 18, 75, 49, 19, 75, 49, 24, 76, 50, 29, 65, 32, 10, 64, 29, 8, 55, 24, 4, 43, 16, 0, 54, 31, 14, 77, 38, 13, 134, 83, 35, 137, 83, 24, 127, 73, 25, 139, 79, 24, 147, 92, 34, 145, 87, 33, 185, 124, 50, 188, 123, 49, 182, 121, 46, 170, 107, 43, 187, 126, 54, 189, 126, 56, 183, 116, 49, 183, 120, 51, 174, 111, 46, 168, + 104, 42, 171, 109, 48, 164, 100, 48, 119, 64, 26, 73, 26, 4, 97, 43, 7, 46, 15, 1, 106, 57, 13, 143, 91, 33, 162, 109, 45, 197, 150, 86, 175, 122, 64, 198, 144, 78, 194, 140, 70, 177, 127, 63, 128, 71, 23, 120, 66, 19, 141, 77, 15, 166, 100, 33, 156, 85, 18, 114, 58, 13, 115, 63, 11, 123, 70, 20, 126, 73, 16, 109, 60, 15, 99, 57, 16, 110, 58, 16, 116, 65, 16, 89, 50, 15, 70, 45, 20, 81, 51, 25, 98, 57, 17, 105, 65, 27, 135, 81, 26, 150, 82, 17, 174, 106, 35, 193, 130, 59, 158, 95, 32, 150, 84, 21, 156, 89, 31, 182, 118, 45, 190, 132, 61, 209, 156, 90, 206, 152, 84, 208, 151, 86, 206, 145, 74, 160, 94, 31, 141, 67, 12, 149, 77, 21, 119, 59, 21, 149, 81, 35, 146, 83, 38, 125, 68, 32, 103, 46, + 14, 126, 65, 23, 148, 79, 28, 178, 116, 58, 181, 115, 52, 185, 116, 49, 182, 117, 52, 193, 126, 58, 179, 112, 48, 174, 108, 49, 166, 98, 39, 195, 136, 67, 208, 151, 80, 206, 142, 68, 199, 138, 66, 188, 127, 53, 174, 117, 54, 158, 96, 36, 163, 97, 32, 163, 97, 32, 152, 96, 45, 104, 91, 81, 77, 132, 183, 91, 158, 222, 91, 161, 224, 52, 95, 125, 26, 46, 55, 46, 102, 151, 65, 128, 191, 54, 115, 162, 40, 81, 110, 14, 24, 17, 9, 12, 3, 18, 20, 4, 28, 30, 6, 26, 25, 5, 24, 24, 3, 49, 43, 3, 64, 55, 2, 74, 59, 0, 79, 62, 3, 77, 57, 4, 70, 48, 5, 65, 42, 5, 65, 39, 5, 65, 39, 12, 71, 45, 19, 74, 53, 34, 77, 57, 34, 82, 72, 60, 78, 68, 55, 82, 84, 85, 88, 109, 130, 91, 119, 155, + 113, 103, 36, 115, 102, 26, 109, 95, 22, 112, 102, 25, 95, 87, 15, 96, 82, 11, 120, 109, 29, 111, 103, 22, 112, 95, 14, 127, 112, 41, 118, 105, 26, 106, 92, 9, 101, 81, 19, 102, 87, 32, 102, 88, 20, 107, 95, 19, 107, 96, 35, 110, 98, 58, 109, 105, 92, 107, 94, 61, 120, 105, 64, 110, 102, 64, 106, 99, 48, 103, 79, 10, 112, 83, 14, 121, 91, 35, 117, 83, 40, 100, 66, 31, 83, 50, 20, 77, 50, 19, 84, 53, 19, 70, 39, 10, 60, 27, 4, 59, 24, 2, 50, 21, 3, 55, 28, 10, 69, 41, 14, 112, 73, 30, 124, 83, 31, 127, 80, 24, 129, 79, 24, 132, 83, 31, 162, 111, 51, 194, 137, 66, 189, 126, 52, 187, 127, 54, 174, 116, 49, 156, 95, 32, 176, 117, 47, 185, 124, 51, 182, 116, 47, 186, 121, 51, 181, 116, 51, 167, + 103, 42, 160, 102, 45, 146, 81, 30, 131, 68, 22, 85, 32, 6, 152, 90, 32, 113, 68, 24, 102, 57, 14, 128, 77, 24, 156, 103, 41, 171, 116, 50, 177, 122, 61, 181, 124, 56, 171, 116, 49, 156, 105, 50, 145, 90, 36, 132, 74, 22, 159, 90, 26, 167, 101, 33, 133, 76, 21, 122, 67, 17, 135, 80, 22, 131, 78, 24, 109, 68, 22, 106, 65, 23, 103, 63, 25, 98, 59, 23, 96, 58, 19, 77, 54, 31, 67, 56, 48, 77, 60, 43, 67, 48, 28, 91, 56, 20, 119, 66, 16, 148, 76, 14, 168, 99, 33, 195, 138, 67, 179, 110, 45, 147, 80, 25, 154, 90, 31, 183, 122, 59, 207, 149, 85, 200, 144, 78, 198, 145, 85, 198, 143, 75, 194, 134, 66, 124, 63, 19, 119, 58, 16, 151, 84, 28, 141, 74, 29, 154, 91, 40, 154, 93, 37, 137, 76, 34, 129, 69, + 28, 133, 69, 27, 140, 74, 28, 170, 103, 46, 175, 107, 48, 177, 113, 54, 179, 112, 48, 184, 118, 55, 180, 115, 54, 181, 112, 45, 181, 118, 53, 191, 131, 66, 192, 133, 68, 196, 139, 72, 207, 146, 73, 190, 129, 62, 176, 119, 56, 157, 103, 43, 157, 95, 37, 166, 100, 39, 157, 96, 46, 112, 90, 76, 85, 104, 127, 66, 111, 152, 63, 124, 180, 57, 106, 140, 58, 96, 112, 75, 136, 188, 86, 152, 212, 82, 150, 210, 72, 132, 182, 43, 67, 69, 37, 61, 69, 59, 76, 76, 70, 82, 78, 71, 93, 102, 58, 73, 79, 60, 87, 108, 64, 87, 99, 66, 79, 82, 65, 75, 76, 61, 58, 44, 68, 58, 29, 81, 77, 55, 90, 83, 62, 91, 89, 77, 95, 93, 90, 101, 104, 107, 99, 101, 104, 94, 102, 108, 96, 111, 127, 97, 128, 165, 106, 148, 198, 108, 155, 213, + 148, 139, 60, 134, 120, 57, 129, 115, 49, 109, 98, 29, 87, 76, 11, 93, 89, 21, 116, 114, 32, 120, 118, 48, 137, 116, 52, 149, 128, 82, 131, 110, 39, 116, 95, 4, 115, 91, 14, 105, 92, 42, 103, 87, 22, 105, 92, 28, 104, 86, 23, 112, 103, 75, 106, 106, 105, 105, 105, 102, 118, 94, 44, 110, 92, 22, 104, 83, 10, 105, 77, 4, 113, 83, 14, 124, 90, 41, 122, 89, 45, 106, 75, 39, 83, 54, 21, 86, 52, 15, 84, 47, 10, 72, 35, 3, 65, 29, 3, 51, 19, 1, 44, 17, 2, 59, 34, 14, 83, 52, 22, 117, 77, 33, 133, 91, 34, 98, 58, 13, 106, 68, 31, 186, 134, 63, 197, 139, 65, 190, 129, 57, 186, 129, 61, 165, 108, 45, 155, 95, 33, 154, 93, 35, 161, 106, 42, 168, 108, 41, 172, 111, 43, 182, 121, 51, 187, 127, 56, 174, + 111, 47, 159, 97, 39, 143, 79, 29, 117, 52, 10, 81, 29, 1, 155, 88, 29, 177, 122, 58, 128, 78, 23, 156, 105, 47, 130, 77, 23, 152, 96, 37, 168, 120, 62, 165, 109, 46, 149, 96, 38, 148, 92, 37, 151, 96, 40, 147, 86, 29, 165, 98, 34, 158, 98, 34, 147, 91, 31, 146, 88, 23, 146, 90, 23, 106, 64, 18, 59, 38, 16, 82, 59, 30, 103, 72, 36, 92, 65, 33, 83, 56, 22, 81, 60, 39, 81, 72, 58, 91, 77, 66, 83, 66, 50, 69, 42, 21, 84, 43, 7, 147, 78, 12, 182, 114, 43, 183, 118, 48, 192, 129, 57, 168, 103, 45, 146, 82, 26, 178, 116, 55, 193, 129, 66, 201, 141, 72, 191, 134, 72, 186, 124, 56, 167, 110, 55, 105, 48, 14, 160, 96, 35, 148, 83, 25, 142, 72, 20, 152, 85, 31, 156, 92, 39, 137, 78, 33, 131, 70, + 26, 144, 79, 30, 155, 88, 36, 165, 96, 37, 176, 110, 47, 181, 114, 48, 181, 114, 48, 184, 112, 45, 190, 115, 46, 188, 116, 45, 195, 127, 55, 200, 141, 71, 192, 137, 75, 179, 125, 69, 192, 135, 69, 208, 148, 73, 184, 125, 60, 178, 118, 49, 177, 120, 53, 174, 115, 46, 176, 113, 52, 138, 99, 66, 84, 101, 123, 84, 124, 164, 94, 162, 227, 101, 164, 217, 96, 142, 158, 103, 157, 203, 102, 166, 211, 95, 161, 206, 89, 145, 179, 57, 80, 86, 59, 76, 77, 71, 84, 62, 84, 99, 94, 79, 105, 117, 66, 85, 95, 61, 82, 94, 57, 65, 59, 59, 67, 62, 70, 95, 113, 72, 96, 120, 83, 111, 138, 99, 143, 189, 107, 141, 183, 106, 131, 158, 106, 115, 115, 99, 102, 97, 92, 99, 103, 94, 123, 160, 102, 142, 190, 107, 151, 198, 107, 148, 194, 106, 149, 199, + 125, 111, 30, 119, 107, 36, 108, 96, 23, 94, 88, 21, 93, 97, 39, 64, 63, 7, 94, 91, 16, 116, 116, 43, 123, 108, 37, 144, 119, 41, 136, 107, 18, 139, 113, 37, 115, 95, 35, 109, 89, 31, 108, 93, 27, 111, 100, 43, 100, 95, 75, 109, 98, 82, 106, 102, 92, 103, 101, 101, 107, 98, 87, 109, 85, 23, 99, 72, 9, 109, 78, 9, 116, 86, 21, 122, 86, 40, 120, 86, 43, 100, 69, 31, 91, 57, 21, 90, 56, 16, 80, 44, 6, 70, 34, 3, 55, 24, 0, 46, 19, 0, 44, 20, 2, 82, 54, 22, 82, 50, 16, 103, 69, 25, 75, 43, 14, 135, 89, 35, 193, 134, 58, 186, 129, 59, 179, 127, 54, 178, 122, 50, 171, 111, 40, 176, 119, 51, 164, 105, 39, 151, 95, 32, 142, 93, 36, 181, 124, 55, 182, 124, 55, 179, 120, 54, 191, 130, 61, 179, + 120, 56, 160, 102, 44, 139, 79, 26, 119, 60, 18, 93, 43, 11, 153, 90, 33, 168, 113, 50, 136, 84, 30, 149, 94, 36, 135, 82, 31, 140, 91, 35, 127, 81, 25, 128, 78, 27, 124, 73, 27, 159, 103, 47, 147, 94, 38, 179, 115, 44, 166, 107, 43, 153, 93, 31, 183, 128, 57, 148, 93, 26, 111, 65, 19, 41, 25, 9, 38, 32, 22, 76, 65, 50, 92, 73, 50, 99, 77, 52, 85, 64, 40, 84, 72, 57, 121, 116, 104, 130, 125, 115, 75, 71, 62, 50, 40, 29, 79, 48, 18, 154, 95, 31, 192, 130, 53, 180, 112, 45, 191, 126, 51, 180, 111, 45, 164, 106, 53, 157, 101, 44, 171, 110, 47, 183, 121, 54, 194, 135, 68, 186, 126, 57, 143, 89, 38, 110, 50, 14, 180, 116, 45, 163, 94, 33, 155, 86, 29, 159, 90, 34, 158, 94, 42, 155, 95, 43, 158, 94, + 37, 163, 99, 39, 164, 97, 38, 169, 101, 40, 170, 103, 40, 181, 110, 43, 179, 110, 47, 170, 104, 43, 171, 103, 43, 179, 108, 43, 186, 116, 49, 206, 140, 67, 203, 145, 74, 191, 134, 76, 166, 112, 60, 186, 130, 61, 205, 145, 75, 191, 125, 54, 178, 118, 49, 167, 103, 39, 163, 98, 36, 162, 103, 53, 126, 106, 92, 87, 117, 137, 94, 146, 188, 111, 153, 178, 123, 140, 141, 113, 135, 134, 98, 124, 114, 86, 119, 116, 77, 101, 97, 78, 103, 121, 92, 120, 144, 77, 104, 122, 69, 98, 114, 71, 103, 124, 70, 82, 87, 71, 69, 51, 60, 60, 37, 65, 76, 74, 76, 109, 139, 81, 117, 160, 92, 134, 185, 105, 162, 223, 114, 168, 232, 111, 155, 210, 99, 103, 107, 94, 101, 105, 100, 131, 174, 107, 154, 209, 109, 155, 212, 105, 148, 201, 99, 141, 188, 97, 137, 185, + 117, 105, 35, 100, 89, 15, 87, 79, 14, 96, 101, 34, 78, 90, 24, 66, 65, 13, 110, 104, 50, 105, 102, 30, 93, 85, 16, 117, 97, 12, 135, 105, 28, 138, 110, 57, 113, 83, 33, 109, 89, 51, 112, 109, 97, 116, 120, 114, 105, 113, 128, 112, 121, 144, 109, 117, 144, 114, 132, 167, 106, 123, 158, 97, 89, 80, 104, 76, 18, 108, 79, 12, 123, 93, 33, 134, 102, 52, 117, 85, 42, 106, 71, 31, 99, 65, 22, 95, 58, 16, 78, 40, 6, 65, 27, 1, 56, 25, 2, 50, 25, 2, 61, 33, 7, 54, 26, 5, 112, 72, 21, 124, 81, 29, 155, 106, 44, 172, 118, 49, 191, 137, 65, 174, 123, 55, 180, 124, 52, 168, 113, 47, 165, 111, 47, 181, 123, 53, 162, 99, 35, 145, 90, 34, 137, 86, 31, 173, 114, 44, 172, 111, 45, 176, 119, 55, 197, 141, 72, 196, + 138, 74, 175, 120, 62, 168, 111, 57, 117, 61, 21, 103, 49, 14, 173, 109, 44, 167, 112, 49, 158, 103, 42, 126, 74, 21, 150, 100, 42, 143, 98, 42, 114, 69, 28, 89, 51, 14, 126, 73, 26, 156, 100, 45, 148, 85, 29, 176, 108, 36, 160, 100, 35, 157, 106, 37, 148, 104, 39, 88, 60, 24, 58, 43, 27, 45, 37, 28, 52, 50, 42, 73, 64, 53, 94, 79, 64, 105, 82, 58, 103, 77, 49, 101, 86, 64, 135, 128, 115, 141, 136, 123, 109, 104, 93, 80, 65, 52, 86, 68, 48, 111, 70, 30, 188, 130, 61, 202, 138, 57, 188, 119, 42, 197, 130, 54, 180, 120, 58, 161, 102, 47, 163, 100, 37, 191, 129, 58, 190, 125, 55, 182, 120, 51, 148, 87, 35, 156, 88, 30, 195, 128, 56, 182, 115, 48, 163, 92, 30, 162, 94, 34, 162, 96, 39, 165, 99, 37, 174, 107, + 44, 184, 122, 58, 183, 117, 53, 173, 101, 38, 170, 99, 36, 178, 104, 37, 180, 105, 32, 189, 125, 53, 187, 123, 58, 166, 98, 36, 178, 111, 44, 194, 129, 58, 209, 148, 76, 204, 146, 74, 170, 114, 58, 149, 94, 39, 180, 114, 46, 198, 137, 65, 186, 126, 54, 172, 109, 43, 161, 98, 36, 164, 103, 44, 152, 105, 67, 109, 109, 104, 95, 122, 135, 118, 133, 129, 130, 131, 93, 122, 128, 85, 99, 104, 36, 76, 88, 47, 75, 81, 66, 98, 108, 107, 97, 103, 106, 80, 97, 118, 82, 120, 171, 87, 137, 195, 94, 136, 190, 103, 119, 141, 88, 114, 139, 83, 118, 162, 82, 124, 169, 84, 120, 159, 83, 109, 142, 95, 137, 187, 104, 150, 203, 100, 126, 161, 95, 109, 128, 91, 112, 143, 94, 129, 170, 101, 139, 189, 103, 144, 195, 103, 147, 198, 99, 146, 202, 101, 155, 215, + 107, 89, 21, 92, 75, 9, 85, 80, 20, 60, 67, 18, 59, 74, 30, 76, 74, 23, 125, 112, 63, 100, 92, 42, 73, 59, 8, 113, 92, 18, 131, 105, 43, 111, 82, 34, 102, 73, 26, 109, 93, 69, 102, 98, 93, 111, 97, 71, 105, 103, 98, 109, 109, 107, 112, 118, 128, 107, 130, 155, 107, 135, 173, 91, 98, 120, 108, 77, 24, 109, 78, 16, 113, 78, 23, 113, 78, 29, 117, 82, 37, 112, 77, 32, 104, 70, 26, 90, 52, 11, 69, 33, 3, 61, 32, 7, 60, 31, 7, 55, 28, 3, 58, 30, 3, 98, 60, 18, 149, 99, 35, 134, 86, 32, 129, 82, 31, 165, 117, 51, 170, 122, 57, 165, 113, 49, 172, 120, 53, 152, 101, 42, 183, 128, 61, 182, 123, 51, 155, 96, 32, 155, 101, 41, 166, 110, 45, 167, 109, 45, 176, 116, 50, 181, 122, 55, 197, 142, 72, 193, + 136, 70, 176, 124, 66, 171, 118, 60, 147, 92, 38, 136, 81, 36, 150, 85, 28, 165, 108, 45, 167, 114, 50, 154, 102, 44, 156, 100, 39, 145, 94, 38, 126, 85, 37, 87, 53, 18, 139, 83, 31, 159, 100, 37, 161, 95, 23, 154, 93, 21, 170, 125, 58, 58, 43, 23, 53, 32, 4, 25, 11, 2, 45, 30, 14, 77, 53, 32, 96, 77, 62, 85, 69, 54, 86, 73, 58, 93, 73, 50, 107, 87, 54, 103, 85, 60, 92, 78, 62, 107, 86, 71, 124, 92, 72, 118, 82, 54, 82, 54, 35, 72, 45, 25, 76, 46, 17, 111, 75, 32, 195, 135, 59, 201, 132, 52, 192, 126, 52, 181, 122, 62, 149, 85, 28, 191, 126, 51, 191, 126, 54, 195, 133, 64, 192, 127, 57, 191, 124, 50, 196, 126, 52, 200, 136, 67, 168, 100, 41, 172, 106, 44, 166, 100, 40, 184, 124, 60, 188, 122, + 60, 196, 129, 59, 198, 130, 58, 195, 126, 53, 181, 107, 40, 179, 102, 35, 183, 109, 33, 188, 117, 43, 194, 126, 54, 185, 118, 55, 180, 112, 51, 189, 125, 56, 203, 140, 65, 204, 141, 72, 197, 138, 69, 151, 89, 34, 159, 95, 37, 168, 102, 33, 194, 134, 58, 190, 125, 55, 176, 108, 47, 164, 96, 37, 153, 96, 50, 124, 97, 77, 91, 101, 110, 97, 102, 86, 101, 96, 21, 99, 98, 17, 71, 69, 6, 58, 52, 10, 75, 65, 27, 95, 75, 37, 119, 106, 85, 112, 119, 129, 102, 126, 161, 107, 152, 209, 108, 152, 211, 97, 136, 187, 96, 143, 194, 101, 155, 215, 95, 140, 187, 90, 122, 155, 85, 98, 102, 90, 117, 147, 85, 92, 107, 91, 98, 100, 97, 127, 166, 109, 148, 201, 99, 138, 192, 97, 134, 179, 102, 148, 204, 110, 161, 223, 111, 166, 228, 111, 165, 226, + 78, 66, 7, 113, 104, 37, 82, 86, 33, 49, 54, 20, 49, 52, 16, 62, 61, 16, 89, 80, 20, 70, 57, 15, 72, 56, 5, 102, 83, 11, 107, 80, 22, 89, 66, 15, 106, 77, 27, 123, 94, 50, 121, 104, 69, 118, 122, 123, 115, 133, 161, 112, 132, 163, 117, 132, 152, 118, 138, 156, 113, 134, 159, 93, 76, 55, 105, 71, 13, 119, 85, 29, 110, 74, 25, 109, 72, 31, 109, 73, 27, 112, 74, 34, 109, 70, 29, 79, 42, 8, 70, 36, 7, 82, 50, 17, 77, 44, 12, 69, 36, 5, 77, 41, 9, 120, 75, 24, 121, 74, 23, 123, 81, 34, 160, 117, 53, 158, 113, 50, 159, 110, 46, 175, 125, 60, 172, 119, 53, 159, 106, 43, 185, 128, 56, 180, 120, 49, 164, 104, 41, 172, 113, 46, 159, 101, 37, 172, 112, 41, 171, 111, 43, 193, 136, 65, 189, 130, 65, 191, + 136, 74, 192, 139, 72, 173, 117, 55, 144, 87, 34, 148, 92, 39, 156, 95, 41, 186, 127, 63, 175, 115, 49, 158, 99, 39, 144, 88, 32, 155, 100, 42, 128, 88, 45, 70, 35, 6, 148, 92, 33, 158, 94, 29, 168, 100, 28, 161, 102, 33, 140, 99, 41, 48, 43, 33, 2, 1, 0, 7, 4, 1, 1, 0, 0, 10, 5, 1, 57, 34, 19, 125, 81, 52, 129, 79, 53, 122, 81, 53, 105, 76, 52, 114, 74, 50, 132, 86, 58, 134, 88, 60, 47, 30, 19, 6, 4, 1, 5, 2, 0, 34, 26, 18, 62, 55, 45, 90, 80, 68, 178, 123, 59, 209, 137, 63, 201, 129, 55, 190, 131, 65, 155, 94, 36, 191, 132, 64, 187, 125, 59, 186, 123, 55, 198, 132, 58, 190, 119, 51, 207, 142, 69, 198, 134, 66, 181, 110, 45, 189, 122, 56, 192, 129, 66, 181, 120, 64, 184, 124, + 66, 179, 115, 51, 192, 123, 51, 200, 132, 58, 198, 130, 56, 190, 120, 51, 181, 106, 37, 186, 108, 34, 196, 127, 58, 200, 136, 68, 189, 127, 64, 190, 125, 61, 204, 140, 70, 207, 143, 72, 202, 143, 73, 174, 109, 47, 159, 92, 31, 170, 100, 32, 175, 102, 33, 178, 109, 39, 174, 106, 42, 162, 95, 30, 158, 98, 47, 140, 97, 64, 115, 103, 87, 78, 81, 49, 75, 78, 5, 101, 100, 19, 98, 88, 22, 111, 88, 37, 118, 83, 35, 112, 81, 33, 117, 90, 45, 111, 101, 82, 104, 120, 142, 107, 140, 183, 104, 133, 181, 95, 121, 163, 92, 134, 185, 94, 144, 204, 96, 145, 198, 94, 130, 159, 85, 96, 92, 77, 71, 43, 100, 103, 84, 106, 143, 183, 113, 160, 214, 114, 166, 229, 114, 167, 228, 108, 158, 218, 104, 146, 196, 104, 147, 195, 104, 149, 204, 101, 139, 184, + 82, 66, 12, 110, 104, 39, 74, 79, 23, 51, 56, 23, 51, 52, 5, 70, 72, 8, 72, 72, 13, 58, 47, 3, 71, 53, 8, 98, 72, 18, 122, 98, 53, 115, 90, 45, 126, 92, 43, 153, 120, 70, 153, 135, 95, 137, 160, 190, 125, 156, 200, 121, 139, 160, 122, 120, 94, 123, 124, 96, 106, 103, 95, 93, 62, 7, 104, 71, 13, 114, 79, 22, 123, 93, 34, 113, 80, 35, 114, 79, 35, 119, 79, 38, 98, 57, 20, 83, 46, 12, 104, 67, 30, 119, 80, 33, 101, 64, 19, 87, 52, 16, 107, 64, 22, 143, 94, 30, 132, 86, 29, 129, 84, 36, 129, 90, 32, 169, 120, 54, 180, 130, 63, 184, 133, 64, 173, 118, 51, 177, 118, 51, 186, 127, 54, 180, 122, 53, 177, 113, 42, 153, 91, 26, 168, 106, 41, 172, 108, 41, 175, 115, 46, 193, 132, 59, 198, 144, 76, 191, + 139, 75, 192, 142, 79, 180, 126, 60, 162, 104, 43, 147, 90, 37, 163, 106, 47, 177, 112, 50, 173, 114, 47, 173, 108, 45, 195, 142, 70, 189, 142, 72, 64, 34, 8, 77, 38, 7, 159, 93, 27, 173, 106, 30, 156, 95, 27, 170, 108, 37, 164, 121, 53, 100, 87, 62, 6, 6, 5, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 81, 41, 18, 158, 90, 53, 151, 90, 57, 133, 79, 51, 158, 90, 52, 169, 100, 59, 43, 26, 15, 0, 0, 0, 1, 1, 1, 10, 11, 7, 81, 74, 65, 71, 64, 55, 113, 92, 61, 187, 128, 53, 213, 145, 60, 205, 142, 64, 204, 137, 61, 162, 104, 45, 182, 124, 52, 206, 152, 82, 206, 148, 79, 197, 136, 67, 206, 145, 79, 204, 144, 78, 198, 135, 68, 199, 133, 62, 203, 141, 71, 199, 141, 78, 200, 145, 80, 202, 148, + 86, 182, 125, 63, 169, 103, 40, 179, 109, 40, 204, 138, 63, 197, 127, 57, 193, 127, 52, 195, 126, 56, 188, 116, 47, 198, 133, 66, 194, 138, 72, 203, 139, 71, 197, 133, 66, 208, 146, 75, 203, 143, 70, 198, 135, 64, 177, 110, 43, 166, 96, 25, 177, 106, 36, 175, 102, 35, 179, 111, 42, 166, 99, 40, 164, 98, 39, 159, 109, 66, 125, 102, 76, 101, 96, 33, 105, 100, 15, 122, 114, 33, 128, 108, 40, 146, 114, 58, 142, 107, 51, 124, 92, 37, 114, 87, 36, 97, 73, 33, 94, 81, 59, 110, 108, 107, 142, 144, 155, 114, 130, 158, 84, 107, 140, 92, 131, 175, 103, 159, 217, 92, 134, 183, 74, 73, 57, 88, 77, 16, 109, 119, 111, 125, 142, 150, 120, 167, 223, 113, 168, 233, 110, 162, 222, 106, 154, 211, 107, 153, 205, 95, 129, 173, 90, 106, 123, 81, 89, 101, + 74, 58, 11, 81, 72, 19, 57, 54, 7, 52, 52, 7, 54, 55, 2, 76, 73, 8, 74, 65, 0, 78, 64, 15, 84, 64, 29, 91, 68, 26, 116, 92, 50, 124, 101, 57, 120, 90, 42, 139, 109, 46, 150, 125, 62, 136, 137, 129, 124, 125, 110, 122, 119, 84, 126, 121, 91, 120, 142, 165, 95, 88, 78, 98, 66, 8, 113, 81, 24, 112, 78, 20, 122, 90, 24, 110, 78, 29, 112, 74, 38, 102, 73, 52, 95, 56, 23, 116, 71, 27, 140, 92, 39, 123, 76, 24, 110, 69, 24, 124, 77, 26, 141, 95, 36, 118, 74, 19, 101, 60, 19, 135, 90, 31, 163, 118, 51, 176, 127, 56, 172, 122, 54, 187, 134, 62, 181, 129, 58, 174, 112, 44, 177, 119, 53, 183, 128, 59, 170, 111, 42, 164, 100, 33, 172, 108, 39, 177, 117, 48, 178, 120, 52, 170, 111, 51, 174, 122, 61, 197, + 140, 76, 196, 145, 80, 185, 131, 63, 174, 119, 59, 141, 87, 35, 134, 81, 30, 171, 112, 50, 190, 132, 66, 170, 112, 47, 176, 116, 50, 165, 114, 55, 62, 30, 2, 66, 30, 3, 139, 77, 15, 160, 95, 21, 186, 123, 43, 180, 118, 41, 192, 144, 70, 163, 134, 78, 111, 99, 71, 28, 26, 17, 6, 7, 3, 2, 2, 2, 0, 0, 0, 12, 5, 0, 127, 70, 32, 161, 93, 54, 137, 74, 40, 171, 97, 53, 102, 62, 37, 5, 5, 3, 7, 6, 3, 16, 14, 10, 36, 32, 26, 66, 57, 47, 124, 102, 71, 181, 135, 70, 217, 153, 68, 225, 155, 67, 228, 158, 75, 210, 138, 56, 177, 115, 48, 175, 116, 49, 192, 131, 63, 204, 140, 71, 210, 151, 83, 214, 155, 85, 202, 136, 64, 185, 119, 49, 201, 139, 68, 201, 139, 66, 193, 135, 69, 205, 150, 83, 196, 141, + 76, 196, 136, 67, 191, 129, 65, 177, 115, 53, 183, 115, 48, 193, 123, 55, 195, 125, 51, 195, 127, 55, 198, 128, 57, 197, 126, 57, 200, 141, 76, 183, 122, 62, 202, 137, 68, 201, 141, 66, 208, 146, 72, 205, 138, 65, 185, 119, 45, 169, 98, 32, 173, 104, 33, 180, 107, 39, 179, 108, 38, 172, 102, 36, 159, 93, 36, 168, 106, 50, 142, 100, 56, 114, 95, 29, 105, 96, 18, 113, 96, 30, 114, 94, 30, 134, 103, 36, 150, 114, 41, 140, 108, 49, 88, 64, 17, 75, 54, 7, 112, 77, 24, 148, 119, 91, 140, 130, 123, 115, 116, 119, 88, 99, 112, 82, 104, 131, 71, 97, 135, 72, 83, 96, 65, 56, 26, 75, 64, 17, 91, 89, 59, 99, 116, 128, 100, 131, 167, 100, 142, 193, 99, 137, 186, 100, 126, 153, 88, 97, 98, 74, 74, 65, 69, 73, 79, 86, 109, 146, + 75, 64, 8, 72, 66, 16, 78, 70, 13, 88, 78, 25, 86, 71, 14, 89, 77, 16, 85, 70, 6, 80, 66, 8, 86, 68, 12, 89, 67, 15, 104, 81, 37, 104, 78, 26, 117, 89, 28, 132, 104, 46, 129, 106, 36, 126, 107, 39, 122, 112, 55, 122, 127, 113, 124, 133, 142, 109, 142, 187, 93, 75, 45, 103, 70, 13, 111, 76, 23, 108, 72, 23, 113, 77, 22, 112, 77, 23, 112, 79, 47, 114, 78, 46, 127, 77, 28, 139, 87, 37, 123, 76, 28, 115, 70, 24, 143, 92, 35, 150, 98, 36, 128, 79, 21, 101, 56, 13, 132, 84, 29, 147, 101, 35, 171, 117, 48, 171, 119, 50, 176, 122, 56, 186, 129, 59, 177, 122, 49, 167, 108, 42, 184, 133, 68, 187, 133, 61, 162, 96, 31, 168, 106, 41, 180, 115, 45, 189, 125, 54, 177, 114, 50, 188, 130, 64, 182, 131, 67, 195, + 140, 74, 196, 141, 79, 182, 125, 63, 180, 125, 62, 172, 116, 52, 136, 82, 33, 143, 88, 38, 171, 111, 48, 167, 113, 50, 170, 113, 49, 123, 74, 25, 69, 35, 7, 44, 13, 0, 113, 56, 8, 121, 66, 14, 152, 89, 19, 187, 120, 40, 205, 152, 71, 209, 171, 100, 187, 165, 111, 140, 129, 94, 110, 105, 84, 65, 64, 54, 52, 50, 47, 9, 8, 7, 112, 56, 23, 156, 87, 45, 114, 54, 23, 168, 92, 47, 76, 47, 27, 46, 45, 41, 75, 72, 64, 99, 90, 76, 127, 114, 88, 153, 130, 88, 180, 147, 93, 222, 169, 93, 230, 161, 71, 229, 159, 72, 206, 136, 56, 194, 122, 43, 172, 102, 32, 174, 115, 52, 196, 140, 74, 204, 150, 83, 213, 159, 89, 203, 142, 69, 182, 107, 39, 183, 116, 49, 197, 131, 63, 203, 141, 70, 201, 143, 78, 201, 143, 75, 188, 132, + 64, 181, 119, 57, 194, 130, 59, 198, 138, 66, 183, 118, 52, 185, 117, 52, 192, 122, 52, 195, 127, 55, 196, 127, 57, 203, 135, 61, 199, 136, 64, 198, 139, 77, 197, 137, 70, 193, 124, 56, 205, 143, 67, 208, 146, 73, 194, 124, 49, 182, 111, 37, 175, 104, 36, 181, 110, 38, 177, 107, 35, 182, 112, 42, 163, 93, 34, 157, 93, 34, 166, 110, 50, 144, 110, 48, 108, 88, 23, 95, 79, 17, 113, 94, 22, 130, 101, 24, 146, 115, 36, 124, 97, 32, 75, 56, 9, 63, 47, 5, 93, 58, 17, 110, 72, 35, 129, 91, 52, 104, 80, 56, 64, 54, 35, 57, 51, 43, 61, 58, 52, 58, 46, 22, 71, 59, 23, 91, 78, 28, 81, 72, 41, 80, 75, 61, 84, 93, 108, 85, 94, 105, 81, 90, 103, 78, 81, 80, 74, 66, 41, 73, 67, 47, 81, 89, 95, 83, 94, 108, + 73, 65, 4, 93, 82, 9, 106, 90, 13, 122, 98, 31, 120, 94, 25, 107, 81, 21, 91, 72, 16, 73, 61, 2, 84, 73, 7, 105, 85, 15, 114, 87, 30, 134, 103, 45, 144, 124, 71, 128, 105, 46, 117, 98, 22, 121, 109, 38, 109, 102, 68, 117, 118, 111, 122, 130, 146, 98, 106, 125, 92, 64, 19, 104, 68, 18, 105, 69, 22, 108, 70, 30, 109, 72, 25, 121, 84, 31, 123, 83, 49, 130, 80, 32, 134, 82, 31, 132, 81, 31, 119, 74, 28, 142, 91, 35, 149, 95, 35, 140, 85, 24, 145, 90, 29, 139, 87, 32, 149, 100, 36, 150, 103, 38, 170, 119, 49, 157, 105, 41, 183, 127, 57, 190, 132, 61, 172, 114, 45, 194, 138, 69, 190, 134, 64, 163, 106, 37, 166, 105, 39, 174, 109, 39, 185, 120, 49, 186, 126, 53, 180, 120, 50, 203, 145, 73, 191, 140, 68, 197, + 146, 80, 190, 136, 69, 195, 142, 82, 182, 126, 65, 186, 128, 60, 166, 104, 40, 121, 67, 23, 113, 63, 23, 151, 96, 45, 156, 105, 41, 88, 45, 8, 65, 31, 6, 40, 15, 0, 60, 30, 1, 130, 78, 20, 142, 77, 14, 167, 99, 22, 191, 128, 46, 221, 177, 98, 228, 193, 122, 206, 184, 128, 197, 181, 138, 160, 150, 120, 124, 121, 106, 28, 23, 17, 106, 50, 18, 131, 70, 39, 96, 47, 20, 167, 86, 41, 104, 58, 30, 89, 86, 78, 156, 142, 110, 183, 168, 125, 189, 168, 118, 167, 142, 97, 210, 175, 107, 235, 176, 88, 223, 144, 54, 216, 134, 46, 210, 150, 69, 179, 115, 44, 176, 103, 30, 159, 96, 36, 185, 128, 62, 193, 135, 69, 198, 141, 75, 179, 109, 42, 178, 110, 41, 203, 139, 66, 212, 151, 82, 212, 153, 88, 210, 154, 85, 203, 148, 84, 188, 128, + 57, 192, 136, 73, 178, 114, 50, 173, 107, 40, 192, 127, 56, 186, 120, 54, 188, 122, 51, 194, 127, 53, 196, 130, 55, 195, 132, 63, 198, 131, 62, 206, 155, 84, 195, 135, 64, 193, 131, 65, 198, 134, 58, 204, 144, 64, 190, 122, 45, 187, 118, 39, 189, 115, 44, 185, 113, 38, 182, 110, 40, 182, 112, 42, 175, 103, 39, 164, 97, 36, 169, 107, 46, 153, 109, 49, 133, 110, 48, 101, 81, 19, 115, 93, 17, 132, 100, 28, 120, 93, 24, 82, 62, 13, 54, 40, 5, 54, 37, 5, 55, 36, 3, 70, 46, 7, 82, 56, 21, 66, 50, 29, 64, 59, 53, 72, 73, 73, 74, 90, 106, 78, 91, 95, 78, 75, 44, 85, 79, 42, 91, 76, 23, 82, 68, 16, 89, 80, 42, 92, 80, 38, 88, 78, 38, 75, 67, 29, 76, 70, 35, 76, 79, 69, 84, 89, 88, 87, 86, 65, + 100, 91, 16, 100, 92, 6, 111, 95, 8, 124, 100, 20, 131, 105, 34, 122, 102, 44, 91, 79, 16, 80, 68, 2, 93, 80, 7, 105, 87, 11, 111, 88, 20, 145, 115, 68, 153, 127, 87, 129, 108, 54, 120, 100, 24, 123, 107, 47, 109, 103, 85, 117, 101, 52, 115, 105, 80, 90, 68, 33, 92, 59, 11, 97, 62, 17, 100, 62, 21, 100, 65, 24, 103, 66, 22, 118, 79, 27, 134, 89, 40, 140, 88, 36, 147, 94, 35, 146, 94, 40, 134, 85, 35, 136, 86, 30, 149, 97, 35, 161, 104, 37, 152, 99, 36, 148, 99, 35, 138, 87, 30, 148, 101, 40, 160, 108, 39, 141, 93, 35, 177, 126, 53, 179, 120, 49, 188, 130, 61, 194, 138, 68, 166, 104, 40, 175, 115, 45, 179, 116, 44, 180, 123, 53, 166, 110, 47, 177, 117, 46, 184, 124, 53, 188, 129, 60, 199, 143, 75, 190, + 137, 68, 200, 141, 73, 177, 121, 60, 178, 121, 56, 191, 133, 66, 198, 143, 71, 178, 114, 46, 108, 62, 20, 109, 61, 24, 107, 63, 21, 62, 26, 1, 56, 24, 1, 80, 42, 11, 51, 22, 2, 98, 54, 10, 131, 75, 17, 142, 86, 22, 157, 98, 28, 190, 135, 58, 235, 192, 114, 237, 208, 140, 230, 210, 152, 219, 205, 153, 203, 192, 149, 110, 105, 88, 51, 31, 14, 95, 51, 25, 60, 33, 16, 99, 54, 26, 67, 48, 27, 114, 97, 65, 195, 173, 118, 217, 195, 136, 184, 160, 112, 157, 132, 93, 211, 170, 103, 233, 169, 83, 214, 141, 56, 209, 134, 49, 205, 132, 48, 209, 150, 70, 181, 109, 33, 162, 98, 33, 184, 124, 58, 184, 125, 61, 176, 113, 45, 178, 109, 36, 191, 123, 51, 205, 141, 71, 202, 142, 69, 200, 141, 72, 209, 156, 89, 206, 154, 86, 189, 130, + 66, 204, 147, 75, 183, 129, 66, 167, 105, 44, 174, 105, 39, 186, 116, 46, 190, 127, 61, 188, 122, 52, 197, 134, 65, 198, 135, 70, 201, 139, 71, 202, 140, 65, 195, 141, 78, 201, 137, 64, 195, 131, 57, 202, 140, 61, 178, 112, 40, 181, 108, 34, 187, 115, 40, 182, 109, 38, 183, 112, 40, 177, 104, 35, 178, 110, 43, 173, 106, 41, 166, 101, 43, 160, 107, 51, 128, 90, 39, 102, 71, 25, 83, 58, 10, 78, 53, 8, 70, 49, 3, 73, 51, 5, 61, 43, 6, 59, 42, 5, 62, 39, 9, 61, 43, 10, 63, 45, 15, 65, 55, 38, 63, 61, 49, 70, 69, 51, 82, 89, 84, 89, 94, 83, 85, 86, 55, 87, 89, 58, 81, 74, 18, 81, 71, 10, 93, 82, 21, 99, 95, 37, 102, 102, 66, 102, 104, 81, 95, 104, 96, 100, 117, 122, 102, 121, 129, 105, 115, 101, + 101, 96, 16, 94, 93, 12, 101, 95, 13, 107, 94, 20, 111, 93, 26, 109, 92, 32, 87, 77, 9, 89, 80, 7, 105, 94, 17, 107, 95, 18, 95, 75, 5, 121, 91, 33, 128, 102, 53, 119, 92, 33, 107, 85, 10, 123, 102, 33, 113, 99, 40, 119, 104, 49, 100, 86, 49, 85, 54, 3, 91, 56, 9, 95, 58, 12, 98, 62, 17, 96, 59, 16, 108, 71, 25, 140, 96, 40, 151, 97, 35, 135, 81, 32, 153, 101, 46, 125, 75, 25, 118, 70, 24, 148, 96, 38, 176, 119, 51, 158, 101, 39, 157, 104, 43, 131, 84, 23, 105, 64, 16, 138, 91, 38, 155, 104, 40, 127, 77, 24, 154, 101, 32, 189, 130, 57, 191, 141, 68, 171, 111, 44, 177, 114, 43, 182, 121, 50, 185, 124, 53, 176, 125, 59, 173, 118, 53, 181, 123, 57, 189, 130, 59, 185, 124, 52, 198, 144, 72, 184, + 122, 54, 203, 145, 72, 183, 117, 52, 177, 119, 57, 179, 115, 56, 197, 140, 71, 196, 136, 63, 133, 83, 28, 51, 16, 1, 74, 32, 9, 51, 16, 0, 67, 31, 6, 89, 52, 19, 67, 39, 8, 118, 71, 22, 169, 112, 40, 191, 132, 51, 203, 144, 66, 202, 150, 70, 230, 186, 109, 232, 195, 124, 236, 209, 141, 237, 215, 154, 233, 215, 159, 215, 199, 152, 128, 121, 98, 36, 24, 16, 28, 17, 5, 64, 47, 28, 151, 132, 88, 221, 193, 126, 237, 214, 149, 234, 202, 134, 232, 199, 126, 239, 200, 126, 243, 201, 119, 241, 189, 96, 235, 171, 78, 226, 161, 74, 205, 139, 59, 198, 129, 50, 198, 127, 46, 173, 104, 35, 175, 113, 43, 170, 106, 42, 164, 92, 30, 194, 116, 41, 211, 150, 74, 208, 150, 79, 204, 147, 78, 205, 149, 82, 201, 141, 68, 216, 157, 87, 217, 160, + 86, 201, 139, 71, 201, 135, 63, 195, 134, 69, 155, 90, 34, 158, 98, 42, 167, 96, 30, 195, 136, 67, 206, 143, 75, 194, 131, 65, 202, 138, 70, 205, 145, 69, 204, 142, 70, 194, 136, 67, 194, 130, 54, 199, 136, 58, 190, 125, 49, 170, 98, 27, 185, 113, 41, 188, 118, 44, 184, 114, 41, 178, 105, 36, 184, 113, 43, 170, 103, 36, 173, 108, 44, 161, 103, 45, 150, 97, 45, 114, 79, 30, 96, 65, 23, 83, 61, 12, 94, 75, 20, 97, 78, 22, 73, 54, 13, 60, 41, 5, 58, 41, 7, 61, 42, 13, 66, 47, 11, 68, 53, 18, 70, 64, 39, 74, 67, 30, 80, 74, 31, 81, 75, 22, 91, 89, 41, 91, 95, 68, 85, 92, 66, 83, 87, 44, 89, 82, 19, 98, 95, 39, 105, 106, 74, 110, 116, 106, 107, 117, 118, 98, 126, 153, 96, 141, 183, 90, 132, 173, + 78, 78, 17, 87, 91, 23, 91, 92, 20, 92, 89, 20, 104, 92, 18, 109, 95, 31, 88, 77, 6, 89, 79, 7, 99, 89, 13, 103, 94, 13, 105, 92, 15, 99, 76, 14, 102, 78, 14, 98, 74, 9, 99, 74, 10, 108, 84, 14, 110, 89, 20, 107, 88, 23, 89, 64, 11, 87, 51, 3, 90, 54, 8, 112, 72, 19, 137, 110, 35, 109, 71, 13, 128, 85, 39, 139, 95, 52, 146, 91, 37, 150, 95, 39, 139, 88, 36, 118, 69, 23, 134, 82, 33, 172, 119, 52, 160, 105, 39, 150, 99, 40, 146, 90, 28, 119, 67, 12, 80, 41, 8, 123, 80, 27, 160, 110, 45, 128, 81, 29, 158, 103, 38, 192, 135, 62, 190, 136, 63, 184, 131, 59, 191, 131, 59, 190, 127, 55, 179, 118, 52, 179, 122, 53, 171, 112, 47, 173, 117, 49, 183, 123, 52, 182, 126, 60, 194, 136, 63, 181, + 121, 54, 201, 139, 65, 182, 114, 44, 187, 129, 63, 168, 116, 57, 163, 100, 40, 180, 119, 53, 164, 107, 49, 85, 45, 12, 35, 7, 0, 55, 19, 4, 126, 72, 18, 128, 80, 21, 107, 61, 12, 136, 83, 21, 163, 105, 30, 171, 111, 33, 191, 135, 54, 182, 126, 50, 198, 146, 71, 197, 151, 82, 220, 190, 124, 215, 180, 113, 223, 199, 138, 224, 206, 152, 204, 192, 150, 77, 71, 61, 22, 14, 5, 155, 145, 117, 217, 202, 154, 231, 214, 160, 236, 214, 153, 232, 199, 126, 220, 177, 108, 226, 176, 93, 228, 170, 81, 234, 171, 74, 235, 166, 71, 230, 156, 60, 221, 152, 61, 198, 134, 55, 192, 120, 45, 163, 94, 28, 162, 100, 37, 151, 84, 21, 195, 124, 49, 210, 141, 66, 196, 133, 64, 195, 138, 67, 192, 132, 66, 201, 148, 82, 213, 156, 81, 193, 130, 59, 202, 136, + 62, 202, 135, 57, 197, 128, 49, 193, 121, 47, 186, 115, 48, 171, 110, 52, 178, 115, 54, 195, 141, 82, 202, 143, 77, 205, 146, 74, 209, 147, 74, 200, 134, 64, 201, 139, 66, 204, 141, 66, 201, 138, 65, 197, 132, 56, 190, 125, 51, 170, 106, 40, 170, 99, 27, 188, 121, 50, 189, 122, 46, 178, 108, 36, 174, 105, 33, 175, 108, 41, 171, 105, 40, 168, 105, 46, 160, 103, 44, 125, 86, 36, 97, 72, 22, 93, 74, 21, 88, 71, 15, 79, 65, 11, 73, 58, 8, 74, 59, 5, 73, 60, 9, 68, 51, 10, 74, 58, 12, 80, 72, 40, 82, 87, 80, 77, 80, 65, 78, 75, 29, 85, 78, 16, 89, 87, 43, 94, 108, 98, 92, 108, 103, 87, 102, 90, 88, 94, 63, 90, 96, 68, 95, 104, 95, 93, 101, 95, 101, 124, 138, 100, 139, 178, 106, 153, 200, 108, 156, 203, + 75, 72, 29, 69, 70, 10, 80, 81, 12, 96, 90, 13, 111, 97, 27, 101, 85, 10, 101, 84, 5, 97, 85, 8, 91, 83, 13, 97, 86, 12, 107, 94, 6, 118, 101, 28, 106, 84, 28, 101, 75, 7, 105, 84, 11, 101, 81, 14, 98, 79, 15, 93, 73, 9, 86, 54, 1, 94, 61, 10, 103, 69, 19, 126, 96, 35, 135, 104, 31, 122, 79, 24, 139, 94, 50, 145, 96, 50, 145, 91, 36, 140, 87, 32, 134, 79, 28, 146, 91, 41, 171, 117, 53, 155, 101, 37, 151, 100, 41, 160, 107, 46, 134, 81, 21, 91, 46, 5, 70, 33, 8, 120, 74, 25, 147, 99, 44, 127, 79, 25, 161, 109, 48, 178, 122, 54, 186, 130, 56, 191, 135, 65, 194, 135, 64, 181, 119, 48, 174, 114, 45, 171, 109, 41, 169, 112, 48, 179, 122, 53, 176, 118, 57, 179, 121, 56, 184, 121, 52, 182, + 115, 44, 192, 126, 51, 196, 127, 59, 197, 140, 69, 182, 132, 71, 130, 77, 32, 146, 86, 35, 183, 131, 66, 110, 63, 20, 53, 26, 11, 54, 27, 12, 70, 30, 4, 60, 24, 1, 71, 36, 5, 113, 64, 15, 130, 77, 16, 150, 100, 37, 156, 104, 38, 184, 136, 65, 209, 166, 91, 224, 184, 111, 230, 198, 128, 232, 207, 141, 227, 206, 145, 236, 220, 167, 232, 221, 178, 126, 125, 109, 62, 55, 45, 206, 194, 162, 234, 222, 175, 238, 222, 169, 242, 219, 157, 245, 218, 146, 246, 212, 134, 242, 200, 114, 227, 174, 88, 212, 145, 59, 217, 147, 57, 224, 151, 58, 217, 147, 55, 221, 159, 73, 221, 154, 67, 201, 138, 58, 166, 104, 38, 173, 103, 34, 202, 133, 56, 205, 138, 63, 189, 125, 57, 197, 142, 77, 201, 147, 84, 198, 143, 76, 199, 138, 71, 204, 141, 68, 186, 119, + 54, 179, 106, 36, 193, 122, 44, 190, 115, 39, 186, 108, 37, 180, 105, 34, 184, 124, 60, 195, 136, 76, 200, 140, 69, 212, 154, 81, 217, 156, 79, 203, 143, 76, 198, 135, 59, 208, 146, 70, 201, 138, 63, 196, 131, 57, 186, 123, 51, 175, 110, 43, 163, 98, 35, 179, 108, 37, 189, 119, 47, 183, 111, 41, 175, 104, 35, 176, 105, 38, 175, 108, 40, 168, 107, 43, 161, 104, 45, 141, 95, 42, 89, 62, 11, 82, 61, 11, 75, 60, 4, 74, 65, 9, 82, 73, 13, 89, 78, 10, 85, 70, 9, 75, 59, 7, 86, 68, 15, 88, 81, 44, 84, 92, 84, 83, 96, 101, 86, 112, 122, 86, 107, 111, 97, 109, 94, 104, 112, 94, 95, 110, 97, 81, 90, 50, 73, 79, 46, 77, 89, 84, 82, 90, 78, 72, 93, 98, 99, 144, 180, 109, 167, 228, 110, 162, 220, 104, 144, 182, + 79, 82, 58, 82, 86, 30, 95, 94, 28, 101, 88, 10, 95, 82, 13, 85, 68, 5, 101, 80, 4, 101, 84, 3, 89, 82, 7, 98, 91, 21, 104, 94, 19, 117, 101, 17, 115, 96, 40, 101, 79, 7, 103, 84, 2, 96, 76, 5, 93, 71, 9, 84, 56, 3, 92, 59, 4, 128, 94, 28, 141, 116, 54, 105, 72, 19, 107, 66, 20, 119, 75, 29, 135, 91, 50, 149, 100, 58, 137, 85, 33, 146, 93, 37, 147, 94, 43, 176, 125, 67, 158, 107, 47, 135, 83, 34, 170, 118, 56, 161, 108, 45, 134, 80, 23, 87, 42, 5, 72, 35, 5, 135, 87, 35, 144, 95, 40, 117, 69, 21, 142, 89, 35, 165, 105, 42, 186, 128, 56, 195, 140, 69, 197, 141, 70, 182, 119, 49, 181, 118, 48, 175, 114, 48, 188, 124, 51, 170, 109, 45, 180, 121, 55, 183, 124, 54, 181, 120, 52, 167, + 102, 33, 191, 127, 50, 189, 124, 51, 193, 129, 57, 189, 134, 67, 143, 95, 42, 90, 42, 8, 137, 79, 28, 119, 67, 24, 70, 34, 8, 37, 12, 2, 40, 12, 0, 125, 80, 26, 147, 100, 40, 169, 118, 46, 182, 125, 51, 195, 140, 62, 194, 145, 73, 200, 154, 78, 207, 168, 94, 214, 178, 107, 225, 191, 121, 233, 212, 148, 240, 221, 162, 236, 215, 154, 229, 217, 168, 168, 165, 145, 134, 132, 115, 212, 198, 155, 227, 200, 135, 238, 217, 151, 243, 223, 159, 246, 217, 146, 233, 191, 108, 250, 217, 142, 245, 196, 105, 242, 190, 100, 227, 161, 73, 224, 162, 76, 200, 133, 54, 191, 119, 40, 192, 118, 39, 168, 95, 21, 185, 117, 44, 198, 131, 58, 203, 135, 64, 173, 104, 37, 195, 138, 71, 200, 149, 84, 206, 154, 90, 196, 134, 69, 200, 137, 67, 185, 117, 47, 196, 118, + 41, 194, 119, 45, 169, 96, 28, 177, 101, 28, 189, 115, 43, 180, 105, 40, 196, 139, 72, 183, 122, 64, 194, 134, 69, 214, 152, 77, 210, 143, 67, 221, 164, 86, 205, 144, 74, 186, 120, 46, 196, 133, 58, 201, 138, 62, 186, 124, 52, 184, 122, 49, 171, 110, 42, 171, 107, 38, 177, 108, 34, 193, 126, 51, 180, 109, 39, 172, 102, 34, 176, 105, 38, 172, 104, 42, 171, 115, 52, 153, 108, 44, 131, 95, 27, 106, 81, 16, 92, 74, 11, 88, 71, 16, 97, 79, 16, 96, 80, 5, 83, 71, 2, 80, 66, 0, 104, 87, 9, 96, 86, 19, 89, 91, 58, 82, 96, 99, 76, 111, 138, 82, 133, 185, 94, 134, 169, 95, 120, 125, 87, 103, 94, 74, 76, 27, 57, 61, 36, 57, 67, 65, 60, 63, 49, 79, 99, 109, 99, 149, 197, 113, 170, 232, 110, 164, 217, 95, 137, 165, + 98, 90, 36, 81, 76, 12, 71, 65, 4, 82, 76, 10, 89, 85, 24, 75, 65, 7, 85, 63, 4, 96, 69, 3, 94, 72, 7, 112, 98, 32, 103, 92, 18, 108, 94, 15, 106, 85, 12, 98, 77, 5, 90, 69, 0, 89, 67, 0, 93, 69, 8, 99, 69, 10, 109, 79, 9, 131, 103, 28, 120, 92, 39, 102, 64, 17, 102, 62, 19, 116, 74, 32, 125, 83, 46, 144, 91, 41, 148, 94, 36, 158, 108, 50, 169, 119, 60, 166, 116, 54, 143, 91, 34, 157, 108, 46, 176, 122, 59, 154, 98, 37, 118, 66, 18, 81, 38, 3, 75, 35, 5, 119, 75, 27, 144, 96, 31, 107, 58, 18, 129, 78, 30, 163, 106, 44, 180, 122, 52, 197, 138, 62, 191, 125, 51, 180, 116, 45, 164, 103, 42, 186, 121, 49, 181, 121, 49, 181, 122, 57, 175, 116, 53, 187, 128, 62, 186, 125, 54, 176, + 111, 39, 189, 121, 45, 180, 117, 43, 191, 129, 54, 202, 143, 70, 185, 131, 66, 135, 86, 35, 66, 27, 4, 84, 38, 6, 85, 43, 13, 66, 37, 20, 59, 32, 17, 99, 55, 12, 153, 101, 38, 166, 119, 49, 181, 132, 55, 179, 129, 58, 173, 130, 62, 180, 140, 70, 200, 165, 99, 207, 173, 109, 216, 181, 111, 231, 203, 134, 230, 200, 130, 220, 192, 131, 217, 204, 158, 152, 148, 122, 137, 130, 108, 195, 182, 140, 220, 200, 142, 233, 203, 130, 236, 202, 125, 240, 216, 144, 241, 220, 155, 238, 209, 137, 233, 189, 107, 233, 181, 98, 238, 180, 85, 234, 172, 81, 228, 166, 80, 217, 155, 73, 204, 138, 68, 173, 112, 48, 180, 120, 55, 202, 145, 79, 176, 112, 44, 188, 132, 69, 199, 148, 82, 204, 155, 91, 198, 140, 72, 192, 130, 60, 191, 124, 51, 189, 119, 48, 176, 101, + 35, 181, 107, 30, 190, 117, 39, 177, 102, 32, 184, 109, 35, 180, 110, 42, 196, 140, 76, 185, 123, 58, 192, 131, 66, 209, 150, 77, 210, 146, 71, 201, 137, 58, 211, 151, 72, 201, 139, 67, 194, 131, 54, 199, 133, 53, 196, 131, 55, 179, 113, 46, 183, 120, 50, 176, 112, 46, 175, 109, 44, 181, 110, 41, 184, 116, 46, 176, 107, 39, 177, 106, 37, 182, 113, 45, 176, 111, 47, 157, 107, 44, 142, 101, 36, 116, 85, 18, 115, 88, 25, 114, 86, 30, 110, 84, 33, 105, 82, 19, 85, 70, 4, 89, 77, 0, 109, 96, 2, 107, 93, 11, 95, 87, 27, 80, 89, 75, 84, 114, 139, 94, 132, 169, 85, 105, 108, 68, 74, 52, 64, 70, 55, 58, 71, 69, 62, 92, 112, 78, 120, 151, 84, 122, 149, 82, 118, 144, 96, 143, 187, 106, 145, 187, 97, 119, 131, 79, 93, 85, + 93, 79, 20, 63, 53, 1, 63, 58, 3, 76, 73, 13, 75, 72, 20, 77, 68, 21, 70, 52, 2, 89, 64, 8, 107, 86, 31, 96, 79, 30, 107, 88, 22, 106, 86, 18, 121, 99, 28, 119, 97, 33, 102, 76, 12, 91, 68, 2, 88, 64, 1, 117, 85, 16, 125, 94, 16, 123, 94, 24, 112, 80, 27, 104, 66, 21, 101, 64, 24, 116, 78, 35, 145, 95, 43, 146, 90, 31, 153, 99, 42, 170, 120, 57, 167, 118, 54, 153, 102, 43, 162, 114, 58, 182, 130, 63, 161, 107, 44, 127, 74, 23, 111, 63, 16, 80, 37, 2, 73, 33, 5, 122, 75, 28, 136, 91, 33, 105, 59, 14, 103, 53, 14, 164, 106, 42, 190, 133, 62, 190, 126, 49, 177, 110, 34, 167, 101, 33, 184, 114, 39, 185, 119, 45, 181, 118, 48, 175, 112, 45, 182, 121, 52, 179, 120, 53, 194, 127, 53, 181, + 114, 44, 182, 113, 39, 165, 94, 24, 183, 114, 39, 196, 132, 59, 192, 135, 63, 178, 128, 62, 116, 79, 40, 100, 62, 32, 98, 55, 21, 79, 45, 22, 64, 38, 24, 71, 43, 25, 90, 55, 26, 105, 71, 32, 122, 81, 31, 136, 90, 30, 151, 108, 42, 156, 114, 51, 195, 160, 94, 200, 160, 89, 223, 188, 118, 223, 192, 125, 223, 205, 151, 216, 202, 161, 206, 197, 161, 125, 120, 99, 87, 80, 63, 179, 167, 135, 212, 196, 150, 217, 199, 143, 240, 214, 145, 242, 205, 119, 240, 202, 123, 238, 200, 118, 237, 197, 112, 222, 166, 80, 227, 171, 84, 234, 172, 82, 229, 165, 77, 226, 164, 79, 211, 146, 63, 201, 138, 59, 198, 153, 93, 169, 117, 68, 165, 106, 46, 204, 151, 85, 203, 152, 85, 208, 156, 88, 175, 113, 53, 183, 118, 51, 185, 113, 43, 194, 121, 49, 166, 97, + 36, 182, 109, 34, 193, 126, 46, 189, 120, 45, 181, 110, 37, 181, 114, 42, 201, 138, 71, 196, 132, 60, 192, 128, 60, 204, 143, 70, 208, 149, 75, 200, 138, 65, 206, 143, 66, 209, 150, 74, 197, 135, 60, 191, 122, 45, 193, 124, 46, 182, 116, 52, 185, 120, 55, 179, 116, 52, 174, 106, 43, 171, 100, 32, 187, 118, 48, 178, 108, 39, 180, 109, 42, 185, 117, 45, 180, 116, 52, 165, 112, 48, 141, 100, 39, 125, 87, 25, 128, 94, 30, 124, 93, 32, 134, 99, 42, 116, 88, 30, 87, 67, 5, 92, 81, 0, 104, 96, 1, 105, 93, 7, 92, 80, 28, 70, 69, 40, 67, 71, 64, 64, 65, 52, 63, 64, 50, 50, 73, 95, 72, 119, 164, 89, 144, 189, 85, 136, 185, 76, 131, 171, 88, 153, 206, 96, 161, 216, 102, 168, 225, 96, 149, 202, 90, 106, 93, 81, 92, 43, + 99, 91, 38, 73, 68, 8, 84, 82, 19, 99, 103, 51, 91, 114, 129, 81, 81, 75, 75, 56, 16, 101, 76, 25, 94, 75, 16, 75, 54, 3, 87, 70, 14, 110, 89, 24, 126, 106, 49, 141, 119, 70, 135, 114, 65, 111, 90, 16, 98, 74, 6, 122, 97, 26, 133, 105, 38, 130, 102, 47, 113, 77, 28, 105, 67, 23, 111, 76, 25, 149, 107, 43, 147, 95, 33, 148, 95, 37, 170, 117, 56, 176, 123, 54, 158, 104, 39, 164, 114, 55, 176, 126, 64, 172, 120, 50, 151, 96, 35, 151, 96, 36, 122, 72, 24, 82, 41, 6, 88, 46, 13, 126, 78, 32, 139, 92, 36, 110, 62, 17, 106, 58, 15, 156, 97, 37, 171, 111, 42, 184, 117, 39, 177, 110, 35, 194, 124, 44, 195, 125, 46, 189, 124, 49, 187, 122, 49, 190, 127, 49, 185, 120, 46, 185, 115, 41, 190, 122, 43, 181, + 111, 36, 179, 109, 32, 167, 96, 26, 170, 103, 31, 190, 128, 56, 179, 122, 52, 186, 131, 63, 128, 85, 44, 85, 55, 32, 107, 67, 38, 106, 66, 33, 73, 36, 13, 64, 32, 8, 109, 68, 23, 132, 91, 36, 163, 122, 53, 178, 137, 66, 189, 148, 73, 182, 140, 74, 199, 159, 88, 205, 167, 93, 211, 183, 123, 212, 196, 151, 197, 186, 148, 196, 187, 153, 143, 138, 115, 46, 42, 36, 14, 14, 8, 88, 78, 59, 191, 178, 145, 204, 193, 154, 225, 209, 159, 246, 230, 169, 247, 222, 148, 245, 214, 136, 244, 205, 121, 245, 208, 125, 235, 184, 98, 217, 157, 75, 213, 152, 71, 194, 134, 58, 170, 105, 44, 173, 114, 52, 205, 146, 74, 189, 136, 69, 180, 130, 71, 187, 132, 70, 193, 130, 64, 205, 146, 73, 190, 129, 58, 167, 105, 41, 178, 110, 42, 186, 114, 40, 183, 116, + 46, 177, 108, 39, 179, 111, 45, 189, 125, 52, 180, 111, 45, 188, 119, 46, 199, 132, 62, 202, 136, 65, 193, 127, 60, 188, 120, 46, 210, 149, 74, 211, 148, 71, 201, 137, 64, 203, 143, 67, 202, 139, 64, 193, 130, 56, 180, 108, 36, 198, 134, 59, 184, 119, 52, 182, 120, 52, 183, 118, 52, 168, 100, 36, 179, 109, 40, 180, 111, 42, 181, 111, 42, 182, 112, 43, 175, 109, 46, 162, 103, 43, 147, 98, 42, 121, 84, 28, 125, 91, 38, 126, 89, 38, 115, 79, 26, 87, 62, 10, 72, 53, 1, 84, 70, 0, 85, 74, 1, 85, 73, 12, 78, 76, 57, 79, 95, 107, 73, 90, 91, 69, 87, 85, 72, 102, 117, 79, 130, 180, 89, 144, 195, 96, 149, 197, 99, 154, 190, 101, 159, 193, 104, 176, 232, 116, 193, 245, 111, 188, 248, 99, 167, 220, 93, 149, 188, 101, 130, 122, + 105, 92, 43, 91, 88, 25, 109, 111, 60, 124, 152, 144, 100, 150, 205, 97, 108, 117, 87, 81, 61, 102, 87, 41, 89, 67, 18, 72, 52, 2, 81, 62, 6, 108, 88, 28, 123, 101, 40, 139, 114, 52, 145, 121, 63, 121, 98, 36, 103, 79, 8, 102, 72, 5, 125, 95, 30, 118, 96, 44, 108, 73, 24, 119, 89, 27, 134, 98, 27, 152, 101, 33, 146, 94, 35, 165, 114, 52, 175, 120, 54, 168, 111, 46, 167, 112, 51, 179, 127, 62, 172, 119, 56, 160, 108, 44, 163, 112, 52, 164, 111, 49, 137, 89, 35, 92, 48, 9, 86, 47, 10, 100, 55, 16, 124, 78, 29, 107, 62, 17, 107, 60, 17, 147, 91, 33, 170, 107, 36, 179, 112, 38, 192, 122, 45, 186, 116, 38, 187, 115, 38, 191, 126, 47, 200, 130, 48, 197, 129, 51, 193, 131, 56, 196, 131, 53, 201, 139, 57, 183, + 115, 42, 177, 107, 37, 158, 88, 28, 157, 94, 32, 186, 125, 56, 184, 129, 61, 188, 129, 60, 149, 99, 42, 79, 48, 27, 58, 33, 16, 60, 26, 7, 62, 26, 6, 50, 21, 8, 84, 46, 19, 115, 70, 23, 156, 104, 41, 173, 123, 52, 183, 138, 66, 178, 135, 64, 186, 141, 69, 199, 169, 108, 200, 186, 141, 177, 166, 133, 179, 170, 138, 101, 94, 74, 21, 17, 12, 41, 36, 29, 120, 120, 112, 48, 48, 44, 107, 99, 79, 170, 164, 129, 206, 193, 155, 234, 219, 171, 239, 214, 148, 242, 209, 123, 247, 207, 124, 243, 195, 103, 241, 193, 105, 244, 193, 103, 234, 177, 87, 237, 181, 93, 211, 152, 69, 176, 116, 52, 173, 118, 58, 177, 118, 53, 195, 139, 77, 172, 112, 52, 184, 120, 54, 191, 127, 58, 198, 138, 68, 186, 121, 54, 168, 104, 36, 183, 115, 44, 197, 131, + 56, 193, 126, 52, 192, 126, 57, 180, 118, 51, 172, 106, 39, 189, 119, 46, 198, 133, 59, 203, 134, 58, 196, 130, 57, 185, 117, 49, 192, 126, 52, 209, 147, 68, 201, 139, 62, 202, 138, 61, 194, 130, 57, 187, 124, 52, 173, 104, 37, 191, 123, 44, 192, 124, 52, 176, 107, 39, 186, 119, 52, 180, 115, 49, 168, 97, 34, 173, 101, 36, 176, 106, 38, 179, 110, 42, 183, 116, 51, 166, 105, 44, 153, 98, 43, 113, 72, 27, 93, 61, 13, 101, 67, 19, 98, 70, 18, 83, 59, 12, 69, 49, 0, 89, 76, 0, 106, 97, 6, 105, 99, 40, 90, 94, 82, 92, 122, 146, 92, 139, 168, 90, 126, 138, 85, 110, 111, 83, 139, 179, 94, 159, 219, 96, 160, 218, 97, 154, 192, 105, 140, 140, 102, 152, 174, 104, 176, 229, 101, 175, 238, 105, 180, 235, 116, 189, 244, 102, 152, 185, + 105, 93, 55, 77, 73, 33, 95, 90, 36, 117, 142, 148, 116, 139, 172, 116, 130, 146, 105, 101, 75, 94, 79, 28, 99, 75, 27, 84, 62, 9, 90, 69, 11, 98, 81, 20, 103, 84, 10, 129, 109, 47, 125, 103, 35, 109, 87, 21, 97, 69, 8, 105, 76, 12, 121, 94, 28, 128, 100, 44, 132, 106, 28, 130, 104, 29, 133, 98, 37, 140, 93, 32, 155, 107, 42, 175, 123, 59, 174, 119, 55, 177, 125, 60, 175, 122, 56, 166, 111, 43, 170, 120, 54, 177, 125, 62, 178, 126, 61, 157, 109, 47, 113, 66, 25, 105, 59, 14, 75, 35, 0, 83, 46, 10, 107, 63, 23, 111, 65, 17, 108, 58, 13, 142, 84, 26, 175, 109, 38, 186, 116, 40, 180, 111, 38, 173, 104, 33, 186, 120, 43, 188, 121, 43, 197, 130, 50, 194, 129, 49, 186, 119, 42, 181, 115, 38, 180, 116, 43, 141, + 80, 24, 99, 46, 8, 146, 82, 27, 170, 106, 36, 189, 130, 60, 163, 106, 41, 174, 107, 36, 144, 91, 36, 52, 21, 8, 32, 17, 8, 63, 40, 26, 79, 42, 17, 67, 28, 6, 56, 21, 3, 112, 66, 24, 145, 85, 23, 173, 115, 42, 166, 108, 34, 174, 125, 48, 177, 143, 76, 179, 160, 112, 168, 156, 116, 124, 110, 79, 49, 44, 32, 19, 13, 8, 21, 16, 8, 29, 24, 18, 146, 140, 131, 66, 62, 61, 22, 16, 11, 85, 77, 61, 165, 150, 121, 190, 175, 132, 223, 201, 146, 239, 209, 138, 241, 203, 117, 243, 190, 97, 236, 179, 88, 223, 154, 65, 200, 133, 58, 164, 98, 37, 198, 138, 62, 184, 129, 66, 173, 118, 56, 179, 123, 58, 180, 125, 58, 165, 102, 41, 173, 108, 47, 179, 112, 47, 197, 136, 61, 185, 123, 54, 168, 107, 47, 180, 114, 49, 196, 130, + 60, 197, 132, 62, 195, 129, 57, 204, 146, 76, 167, 106, 44, 182, 114, 45, 188, 120, 50, 193, 118, 41, 201, 133, 53, 177, 111, 44, 192, 128, 58, 187, 124, 55, 192, 127, 52, 197, 134, 55, 193, 127, 53, 177, 111, 41, 187, 121, 58, 171, 100, 35, 191, 123, 49, 183, 115, 42, 178, 109, 39, 183, 116, 49, 181, 116, 50, 167, 98, 32, 180, 112, 46, 180, 109, 40, 183, 116, 47, 177, 117, 52, 147, 93, 36, 122, 78, 33, 86, 54, 16, 79, 55, 12, 97, 69, 22, 90, 66, 17, 71, 52, 8, 72, 56, 0, 91, 83, 8, 86, 85, 49, 84, 95, 97, 96, 123, 150, 101, 152, 204, 91, 139, 182, 83, 121, 142, 96, 149, 182, 84, 138, 173, 79, 139, 185, 90, 145, 181, 101, 131, 132, 93, 122, 108, 76, 130, 153, 87, 155, 203, 124, 198, 244, 119, 195, 249, 88, 128, 153, + 118, 102, 51, 82, 80, 36, 77, 68, 19, 113, 95, 55, 92, 86, 66, 93, 84, 62, 110, 90, 25, 104, 82, 21, 92, 71, 15, 80, 61, 13, 77, 58, 9, 81, 64, 6, 93, 82, 2, 110, 93, 14, 125, 106, 41, 118, 91, 32, 111, 84, 25, 120, 89, 31, 131, 102, 24, 150, 126, 39, 134, 113, 30, 122, 97, 26, 120, 81, 16, 145, 100, 31, 170, 118, 50, 175, 119, 50, 177, 122, 56, 176, 124, 55, 172, 115, 45, 172, 117, 48, 181, 127, 60, 187, 132, 65, 177, 120, 56, 140, 87, 35, 115, 68, 22, 111, 65, 17, 68, 31, 1, 86, 45, 12, 114, 69, 23, 126, 77, 26, 119, 68, 20, 158, 97, 33, 176, 114, 45, 160, 96, 31, 152, 85, 27, 166, 104, 36, 183, 116, 39, 197, 128, 51, 202, 132, 52, 193, 119, 40, 169, 102, 33, 180, 116, 46, 164, 102, 41, 151, + 96, 38, 161, 108, 48, 185, 127, 54, 172, 111, 44, 189, 129, 61, 151, 92, 33, 161, 92, 25, 158, 96, 29, 90, 51, 9, 19, 6, 0, 17, 2, 0, 36, 11, 0, 67, 27, 4, 74, 32, 10, 109, 59, 16, 168, 108, 36, 183, 123, 49, 190, 132, 54, 180, 138, 66, 173, 149, 97, 136, 118, 80, 89, 78, 48, 54, 46, 25, 94, 85, 59, 111, 97, 66, 111, 100, 67, 77, 65, 45, 108, 93, 66, 90, 78, 57, 110, 96, 64, 102, 88, 62, 82, 67, 44, 132, 117, 79, 184, 166, 118, 228, 202, 137, 245, 208, 123, 239, 185, 91, 240, 181, 92, 222, 159, 70, 197, 128, 50, 172, 102, 33, 196, 136, 63, 181, 128, 64, 179, 131, 74, 191, 138, 75, 188, 129, 63, 178, 114, 48, 172, 105, 41, 167, 99, 33, 184, 112, 37, 192, 130, 58, 173, 111, 45, 171, 106, 45, 190, 124, + 50, 201, 138, 63, 207, 142, 64, 207, 147, 72, 190, 128, 64, 182, 113, 42, 196, 129, 57, 192, 126, 53, 195, 124, 49, 192, 127, 61, 180, 119, 55, 181, 121, 50, 194, 132, 58, 195, 131, 57, 196, 131, 56, 186, 117, 45, 179, 112, 42, 177, 107, 40, 181, 114, 43, 190, 123, 51, 180, 109, 41, 177, 106, 37, 184, 118, 48, 174, 109, 42, 168, 98, 32, 176, 109, 42, 184, 117, 47, 178, 115, 45, 166, 114, 48, 139, 100, 37, 101, 76, 17, 98, 71, 16, 90, 68, 13, 82, 64, 8, 71, 53, 4, 71, 55, 9, 68, 56, 7, 74, 69, 31, 68, 65, 41, 67, 68, 69, 80, 93, 107, 72, 87, 91, 69, 78, 69, 61, 78, 70, 50, 63, 48, 41, 60, 55, 46, 70, 74, 64, 80, 74, 66, 81, 68, 54, 85, 89, 91, 145, 184, 115, 182, 228, 113, 182, 236, 89, 149, 202, + 117, 98, 38, 79, 69, 10, 99, 79, 22, 100, 78, 18, 75, 61, 2, 81, 64, 5, 88, 70, 15, 111, 97, 18, 108, 97, 23, 87, 71, 10, 75, 58, 4, 68, 51, 4, 80, 68, 3, 100, 86, 8, 115, 89, 18, 114, 90, 34, 100, 73, 8, 120, 95, 22, 145, 126, 28, 145, 128, 51, 96, 70, 8, 94, 61, 8, 114, 77, 23, 165, 116, 50, 169, 114, 51, 171, 114, 47, 168, 117, 48, 164, 109, 40, 172, 118, 49, 181, 126, 56, 186, 128, 58, 184, 128, 59, 145, 92, 34, 134, 82, 29, 161, 110, 51, 96, 51, 11, 67, 31, 3, 85, 44, 11, 112, 67, 26, 130, 80, 27, 148, 95, 34, 149, 92, 32, 145, 86, 26, 128, 72, 19, 129, 74, 24, 147, 88, 33, 179, 115, 41, 189, 119, 39, 174, 102, 26, 185, 122, 43, 186, 123, 50, 194, 130, 58, 189, 127, 56, 188, + 132, 62, 188, 129, 63, 196, 134, 61, 188, 130, 60, 172, 113, 55, 150, 93, 37, 158, 92, 27, 164, 98, 28, 120, 68, 20, 27, 8, 1, 17, 3, 1, 20, 6, 0, 56, 24, 3, 83, 35, 7, 73, 33, 8, 126, 74, 18, 160, 105, 37, 147, 96, 29, 121, 84, 32, 104, 78, 37, 55, 45, 25, 53, 43, 24, 164, 141, 88, 183, 163, 115, 162, 131, 76, 162, 136, 81, 146, 126, 88, 135, 116, 80, 161, 141, 99, 176, 142, 81, 163, 127, 67, 173, 149, 97, 94, 77, 51, 117, 100, 69, 175, 147, 92, 200, 152, 82, 229, 179, 91, 223, 159, 73, 201, 134, 58, 171, 112, 51, 186, 125, 60, 191, 136, 66, 180, 130, 71, 185, 137, 77, 178, 122, 55, 193, 134, 65, 183, 121, 54, 182, 114, 43, 186, 116, 41, 184, 118, 46, 195, 131, 52, 183, 119, 55, 175, 116, 52, 173, 110, + 47, 202, 139, 66, 203, 139, 66, 213, 150, 77, 213, 153, 84, 180, 113, 49, 187, 123, 51, 197, 129, 53, 196, 127, 53, 202, 141, 65, 173, 114, 49, 192, 134, 65, 190, 133, 59, 195, 133, 56, 198, 132, 56, 197, 130, 58, 182, 116, 41, 189, 122, 48, 173, 105, 35, 189, 120, 53, 193, 124, 51, 174, 104, 33, 178, 107, 38, 185, 118, 45, 176, 107, 38, 173, 106, 39, 182, 114, 45, 184, 118, 55, 169, 114, 49, 154, 111, 47, 127, 100, 30, 120, 99, 28, 117, 98, 29, 104, 88, 16, 103, 87, 13, 103, 86, 26, 90, 80, 46, 71, 83, 91, 62, 81, 103, 58, 71, 83, 70, 99, 134, 77, 121, 168, 75, 121, 162, 66, 118, 156, 65, 117, 157, 58, 100, 131, 44, 87, 115, 58, 92, 105, 50, 66, 57, 49, 56, 31, 79, 86, 66, 101, 115, 106, 94, 116, 117, 97, 119, 120, + 124, 98, 34, 82, 70, 4, 123, 97, 35, 91, 75, 13, 85, 69, 6, 87, 67, 12, 78, 69, 31, 106, 95, 45, 101, 105, 42, 105, 98, 22, 93, 72, 12, 71, 54, 6, 83, 69, 10, 108, 90, 17, 121, 102, 23, 125, 106, 33, 124, 107, 29, 110, 91, 16, 86, 66, 6, 66, 40, 0, 81, 51, 11, 98, 70, 20, 128, 89, 30, 159, 110, 43, 158, 105, 39, 176, 122, 51, 164, 114, 47, 173, 120, 53, 182, 127, 59, 186, 128, 58, 190, 130, 58, 156, 103, 41, 139, 86, 30, 164, 111, 51, 144, 93, 34, 97, 49, 11, 78, 39, 6, 81, 41, 6, 98, 53, 16, 126, 77, 26, 117, 66, 19, 117, 67, 18, 106, 56, 9, 115, 62, 15, 143, 91, 28, 154, 95, 36, 181, 115, 38, 192, 123, 44, 194, 124, 46, 197, 130, 50, 184, 121, 47, 202, 139, 64, 202, 137, 61, 180, + 121, 55, 197, 135, 63, 194, 129, 54, 206, 142, 66, 188, 126, 59, 158, 100, 39, 151, 89, 26, 166, 101, 30, 146, 94, 29, 49, 20, 3, 25, 9, 1, 17, 6, 0, 28, 14, 4, 82, 43, 18, 57, 24, 8, 78, 51, 28, 90, 51, 16, 75, 42, 9, 65, 44, 24, 66, 55, 38, 129, 117, 85, 187, 168, 124, 211, 183, 121, 196, 158, 92, 192, 157, 94, 177, 150, 92, 138, 119, 80, 160, 142, 99, 162, 140, 90, 190, 159, 99, 210, 175, 108, 224, 188, 113, 213, 190, 130, 111, 96, 65, 83, 70, 49, 113, 82, 38, 179, 124, 54, 195, 136, 60, 177, 117, 42, 176, 107, 32, 205, 142, 60, 194, 146, 79, 183, 136, 78, 168, 116, 58, 178, 124, 60, 178, 121, 58, 169, 106, 44, 184, 119, 48, 184, 114, 38, 200, 133, 59, 187, 124, 51, 201, 136, 59, 198, 141, 69, 177, 120, + 61, 181, 121, 55, 203, 139, 69, 208, 146, 71, 211, 146, 69, 204, 141, 72, 186, 124, 58, 193, 124, 53, 197, 131, 58, 194, 135, 60, 183, 122, 57, 180, 123, 53, 187, 124, 52, 197, 135, 58, 192, 126, 49, 195, 124, 47, 187, 119, 44, 185, 117, 43, 181, 112, 39, 182, 114, 43, 185, 116, 44, 190, 121, 46, 174, 102, 34, 182, 113, 40, 180, 111, 43, 174, 105, 36, 181, 116, 50, 184, 120, 52, 173, 120, 55, 155, 114, 47, 135, 109, 34, 124, 105, 19, 123, 102, 20, 112, 94, 15, 116, 100, 17, 113, 99, 24, 103, 103, 71, 100, 131, 156, 114, 170, 226, 113, 180, 235, 96, 157, 216, 78, 132, 185, 82, 147, 204, 101, 171, 231, 114, 188, 243, 112, 190, 245, 105, 183, 241, 111, 188, 243, 97, 159, 195, 76, 106, 92, 63, 102, 118, 67, 111, 141, 84, 144, 190, 93, 144, 178, + 107, 85, 24, 88, 75, 1, 123, 93, 35, 96, 75, 18, 76, 58, 11, 85, 65, 20, 99, 80, 38, 97, 86, 50, 110, 103, 41, 109, 102, 31, 115, 95, 37, 103, 88, 24, 116, 99, 31, 116, 100, 25, 107, 90, 14, 81, 65, 3, 68, 55, 0, 50, 37, 0, 52, 33, 4, 102, 75, 33, 104, 77, 31, 97, 69, 25, 126, 83, 28, 150, 98, 39, 160, 105, 39, 160, 107, 41, 169, 113, 48, 186, 128, 59, 182, 121, 50, 187, 123, 51, 165, 103, 37, 147, 91, 32, 167, 110, 43, 164, 110, 48, 140, 86, 33, 98, 52, 13, 82, 41, 8, 91, 50, 13, 84, 40, 5, 98, 53, 12, 102, 55, 15, 110, 62, 17, 115, 67, 18, 136, 84, 27, 149, 92, 35, 159, 103, 38, 181, 120, 45, 183, 115, 38, 189, 123, 44, 182, 119, 53, 175, 113, 47, 192, 125, 50, 205, 143, 68, 172, + 114, 53, 193, 131, 58, 205, 141, 63, 206, 139, 60, 197, 140, 70, 175, 120, 57, 149, 95, 35, 170, 106, 37, 176, 118, 51, 88, 51, 18, 30, 11, 1, 24, 9, 1, 37, 25, 12, 33, 13, 3, 50, 26, 14, 23, 11, 6, 25, 17, 7, 11, 4, 0, 36, 30, 19, 127, 113, 80, 193, 171, 121, 219, 196, 140, 210, 181, 121, 208, 170, 104, 202, 172, 108, 196, 166, 105, 192, 172, 123, 185, 162, 120, 214, 187, 133, 197, 167, 113, 204, 174, 113, 238, 207, 135, 240, 216, 147, 210, 191, 138, 124, 114, 93, 77, 64, 48, 88, 56, 25, 133, 91, 45, 99, 54, 15, 147, 90, 36, 191, 132, 56, 177, 127, 60, 186, 136, 72, 177, 126, 69, 171, 113, 50, 180, 123, 63, 163, 103, 41, 185, 117, 43, 181, 115, 43, 187, 126, 51, 182, 125, 55, 191, 127, 59, 205, 145, 73, 186, 126, + 60, 183, 122, 57, 201, 139, 65, 211, 148, 74, 207, 148, 74, 209, 147, 71, 189, 129, 62, 192, 125, 55, 199, 132, 58, 197, 135, 63, 191, 134, 65, 168, 105, 35, 186, 128, 54, 192, 132, 53, 191, 122, 50, 184, 113, 37, 189, 116, 39, 186, 116, 42, 179, 109, 35, 183, 112, 39, 179, 107, 38, 185, 117, 44, 188, 119, 45, 179, 107, 37, 182, 111, 43, 175, 105, 36, 182, 114, 45, 187, 124, 56, 180, 125, 53, 164, 117, 49, 136, 107, 32, 120, 102, 18, 120, 104, 22, 120, 99, 28, 110, 92, 21, 93, 82, 7, 95, 99, 66, 102, 137, 159, 113, 170, 222, 115, 182, 233, 107, 169, 221, 94, 159, 210, 83, 155, 217, 87, 154, 214, 91, 159, 217, 94, 166, 227, 92, 163, 224, 94, 163, 225, 82, 141, 175, 65, 102, 95, 49, 85, 96, 60, 117, 165, 100, 171, 221, 102, 166, 219, + 104, 89, 38, 101, 87, 35, 117, 90, 41, 95, 70, 26, 73, 55, 12, 78, 62, 13, 88, 67, 17, 67, 51, 8, 89, 74, 21, 68, 53, 5, 87, 68, 16, 119, 96, 34, 131, 111, 43, 91, 74, 10, 62, 49, 0, 37, 27, 0, 42, 28, 2, 64, 50, 9, 75, 62, 17, 123, 98, 41, 94, 73, 28, 88, 56, 16, 126, 82, 28, 140, 90, 31, 162, 107, 41, 174, 115, 48, 184, 125, 56, 184, 122, 48, 183, 120, 46, 162, 97, 29, 162, 99, 35, 177, 119, 50, 171, 114, 46, 163, 104, 43, 143, 91, 34, 110, 63, 21, 110, 66, 22, 95, 50, 13, 77, 38, 3, 80, 42, 5, 89, 44, 5, 122, 72, 23, 130, 82, 31, 144, 93, 37, 161, 106, 45, 171, 113, 48, 171, 113, 45, 176, 113, 41, 178, 110, 44, 178, 121, 53, 190, 129, 62, 190, 128, 54, 192, 131, 56, 157, + 98, 40, 187, 123, 52, 196, 127, 50, 208, 139, 62, 200, 138, 63, 179, 119, 49, 155, 98, 32, 154, 91, 27, 186, 120, 48, 139, 92, 34, 44, 17, 0, 49, 25, 8, 22, 10, 2, 33, 23, 16, 41, 20, 12, 17, 7, 2, 42, 37, 25, 73, 66, 44, 144, 130, 95, 209, 192, 148, 216, 194, 141, 219, 193, 132, 217, 190, 125, 202, 174, 116, 195, 171, 114, 209, 176, 111, 225, 202, 147, 189, 168, 126, 193, 170, 126, 217, 181, 114, 211, 188, 126, 232, 196, 117, 244, 222, 159, 241, 224, 170, 204, 186, 140, 117, 105, 77, 51, 41, 26, 52, 38, 26, 49, 25, 10, 94, 47, 11, 156, 105, 47, 153, 100, 44, 168, 115, 52, 170, 117, 55, 179, 120, 54, 189, 124, 54, 157, 96, 36, 176, 107, 34, 181, 114, 45, 195, 135, 63, 188, 126, 57, 197, 137, 62, 199, 138, 67, 205, 145, + 74, 186, 127, 61, 196, 139, 67, 211, 147, 74, 207, 143, 68, 204, 143, 70, 189, 125, 56, 184, 119, 44, 196, 132, 56, 193, 133, 58, 192, 133, 64, 176, 115, 46, 190, 129, 57, 192, 134, 59, 181, 111, 38, 184, 111, 34, 186, 111, 35, 192, 124, 47, 186, 115, 42, 179, 105, 35, 186, 115, 44, 176, 103, 37, 183, 113, 41, 185, 114, 45, 177, 108, 37, 177, 107, 38, 173, 102, 37, 186, 120, 50, 187, 129, 57, 166, 121, 49, 145, 106, 34, 121, 100, 30, 115, 97, 25, 107, 88, 22, 75, 60, 6, 74, 64, 0, 84, 80, 24, 87, 99, 73, 88, 114, 109, 83, 114, 113, 78, 122, 139, 76, 144, 198, 95, 169, 230, 111, 188, 245, 126, 200, 247, 133, 206, 248, 116, 193, 249, 84, 163, 229, 53, 98, 119, 35, 61, 54, 62, 94, 94, 83, 129, 148, 96, 145, 161, 96, 142, 154, + 96, 78, 20, 90, 74, 15, 108, 93, 46, 77, 58, 12, 73, 66, 18, 82, 73, 10, 85, 67, 12, 58, 44, 4, 78, 67, 10, 101, 89, 20, 135, 117, 36, 128, 98, 31, 89, 69, 12, 46, 34, 0, 34, 22, 1, 61, 49, 13, 94, 79, 32, 104, 89, 41, 91, 86, 29, 102, 80, 32, 97, 76, 35, 94, 66, 18, 124, 80, 28, 135, 87, 33, 172, 116, 49, 178, 122, 52, 182, 121, 48, 184, 123, 48, 154, 91, 28, 164, 101, 36, 180, 125, 55, 171, 114, 48, 171, 110, 42, 161, 103, 37, 146, 94, 36, 119, 74, 25, 118, 72, 27, 88, 46, 9, 74, 34, 3, 77, 38, 4, 98, 48, 14, 125, 78, 28, 130, 87, 31, 157, 105, 43, 160, 108, 43, 161, 105, 42, 166, 111, 43, 176, 113, 45, 188, 128, 56, 191, 133, 59, 167, 110, 44, 194, 134, 60, 192, 130, 60, 146, + 87, 25, 171, 111, 42, 195, 131, 57, 208, 140, 59, 202, 140, 64, 173, 113, 43, 178, 116, 45, 150, 87, 24, 183, 118, 44, 175, 120, 49, 96, 57, 18, 55, 25, 5, 45, 20, 6, 18, 5, 0, 26, 11, 3, 32, 16, 5, 117, 94, 56, 151, 132, 97, 187, 174, 137, 214, 197, 155, 219, 200, 151, 216, 195, 145, 219, 188, 127, 211, 178, 111, 216, 191, 132, 216, 186, 123, 209, 188, 137, 229, 208, 160, 218, 196, 148, 213, 180, 116, 230, 209, 153, 232, 211, 159, 237, 219, 171, 241, 220, 162, 236, 220, 174, 199, 184, 144, 137, 127, 96, 141, 121, 85, 110, 77, 43, 114, 63, 20, 148, 98, 47, 138, 87, 30, 140, 82, 22, 154, 96, 33, 161, 104, 46, 167, 105, 38, 159, 96, 34, 168, 101, 36, 189, 125, 55, 194, 131, 60, 194, 132, 63, 201, 141, 67, 205, 141, 66, 216, 157, + 83, 195, 136, 68, 200, 147, 77, 205, 142, 70, 217, 155, 79, 201, 138, 66, 186, 119, 57, 180, 115, 39, 188, 121, 45, 196, 137, 60, 189, 130, 65, 179, 121, 53, 185, 127, 54, 193, 133, 54, 181, 115, 42, 192, 120, 42, 182, 108, 33, 193, 120, 45, 192, 120, 46, 181, 109, 40, 180, 108, 34, 182, 109, 39, 176, 103, 34, 181, 113, 41, 188, 120, 48, 175, 103, 33, 167, 98, 33, 176, 108, 38, 192, 134, 62, 179, 127, 57, 148, 110, 38, 128, 103, 36, 103, 85, 19, 80, 70, 11, 64, 56, 1, 70, 63, 1, 76, 70, 4, 63, 63, 1, 59, 69, 5, 59, 77, 34, 60, 96, 101, 72, 130, 169, 89, 158, 210, 113, 190, 242, 131, 206, 249, 121, 195, 248, 100, 170, 225, 75, 131, 169, 47, 82, 88, 53, 86, 83, 86, 120, 117, 111, 142, 112, 113, 137, 92, 106, 142, 131, + 89, 74, 7, 88, 78, 10, 108, 96, 43, 91, 75, 26, 74, 69, 19, 77, 74, 20, 84, 70, 5, 103, 90, 9, 120, 111, 15, 132, 118, 10, 135, 117, 12, 114, 83, 30, 48, 30, 1, 36, 24, 1, 67, 56, 4, 115, 102, 28, 114, 99, 40, 102, 88, 40, 72, 65, 26, 94, 83, 24, 123, 104, 47, 115, 85, 32, 132, 87, 34, 158, 107, 43, 168, 112, 43, 165, 105, 42, 177, 115, 43, 155, 96, 30, 157, 98, 34, 186, 128, 55, 180, 125, 52, 167, 110, 41, 168, 110, 39, 161, 104, 38, 147, 99, 39, 110, 63, 17, 115, 67, 21, 93, 51, 9, 73, 33, 1, 85, 44, 8, 97, 53, 11, 126, 80, 35, 140, 94, 38, 160, 108, 48, 159, 108, 43, 157, 104, 42, 173, 116, 49, 185, 125, 55, 191, 133, 59, 189, 128, 58, 167, 110, 45, 195, 136, 65, 188, 127, 58, 164, + 106, 45, 167, 107, 44, 165, 105, 38, 197, 133, 54, 205, 143, 62, 172, 109, 40, 190, 128, 55, 160, 96, 28, 169, 101, 34, 183, 120, 45, 155, 107, 47, 68, 38, 12, 45, 16, 3, 35, 13, 0, 29, 13, 2, 53, 26, 9, 138, 102, 57, 182, 163, 116, 195, 178, 137, 212, 191, 146, 214, 193, 145, 220, 198, 149, 233, 206, 147, 230, 203, 145, 221, 198, 146, 223, 197, 144, 236, 215, 163, 231, 212, 164, 213, 188, 141, 222, 198, 141, 210, 188, 134, 232, 210, 154, 237, 225, 177, 242, 222, 166, 241, 222, 175, 229, 215, 172, 216, 194, 145, 196, 170, 120, 139, 99, 56, 130, 80, 32, 167, 110, 50, 170, 118, 54, 161, 101, 41, 184, 122, 48, 180, 120, 50, 194, 134, 66, 172, 108, 47, 168, 105, 41, 189, 124, 53, 190, 122, 53, 192, 128, 58, 198, 142, 74, 206, 142, 66, 217, 156, + 80, 201, 140, 65, 210, 153, 82, 199, 136, 64, 215, 151, 79, 202, 143, 69, 175, 112, 53, 179, 117, 46, 188, 125, 60, 195, 130, 58, 196, 140, 69, 193, 136, 67, 180, 120, 46, 195, 130, 52, 182, 115, 41, 178, 108, 36, 186, 115, 44, 177, 103, 29, 192, 119, 45, 187, 113, 37, 185, 114, 42, 186, 111, 40, 176, 102, 35, 173, 105, 38, 182, 107, 38, 182, 112, 43, 172, 103, 37, 167, 100, 35, 182, 115, 44, 184, 126, 57, 165, 114, 53, 113, 85, 23, 96, 83, 21, 68, 65, 5, 59, 58, 0, 63, 63, 2, 50, 51, 2, 39, 45, 0, 45, 62, 7, 42, 62, 24, 49, 72, 58, 65, 105, 118, 85, 148, 192, 106, 176, 236, 103, 173, 229, 89, 151, 194, 65, 98, 104, 31, 64, 69, 23, 69, 89, 49, 87, 98, 71, 95, 83, 77, 95, 42, 82, 101, 49, 82, 114, 103, + 100, 87, 28, 90, 84, 33, 92, 89, 60, 118, 91, 37, 87, 76, 23, 105, 98, 31, 138, 122, 21, 157, 141, 22, 141, 124, 15, 95, 85, 11, 62, 48, 4, 101, 69, 28, 42, 24, 2, 89, 81, 16, 123, 114, 13, 129, 116, 40, 114, 96, 38, 100, 87, 37, 71, 63, 15, 92, 81, 27, 130, 120, 43, 146, 120, 49, 147, 107, 45, 137, 95, 41, 150, 100, 40, 165, 108, 41, 152, 96, 32, 148, 93, 31, 182, 123, 52, 195, 133, 59, 176, 117, 46, 175, 115, 42, 172, 115, 43, 164, 111, 45, 136, 83, 27, 136, 84, 29, 108, 61, 16, 84, 43, 6, 72, 36, 3, 82, 42, 6, 88, 45, 10, 113, 70, 27, 133, 85, 33, 157, 104, 43, 158, 108, 44, 158, 104, 38, 174, 119, 45, 179, 125, 56, 175, 119, 50, 188, 131, 64, 170, 114, 50, 199, 143, 69, 186, 127, 58, 152, + 89, 28, 164, 108, 45, 143, 82, 26, 195, 129, 53, 206, 139, 58, 179, 115, 45, 148, 84, 24, 178, 111, 37, 169, 102, 36, 181, 113, 39, 170, 113, 48, 128, 88, 37, 63, 33, 9, 41, 16, 1, 39, 17, 5, 54, 26, 8, 114, 78, 43, 171, 149, 106, 199, 183, 143, 217, 195, 152, 205, 183, 138, 217, 193, 142, 208, 174, 111, 214, 187, 130, 218, 194, 140, 218, 192, 136, 227, 202, 147, 221, 195, 146, 211, 188, 134, 217, 189, 134, 229, 201, 143, 227, 195, 131, 242, 227, 185, 242, 227, 185, 236, 220, 169, 236, 222, 181, 223, 200, 148, 188, 150, 95, 126, 78, 30, 161, 108, 51, 171, 107, 41, 178, 119, 52, 165, 104, 40, 173, 106, 36, 196, 133, 58, 194, 133, 59, 196, 133, 59, 191, 130, 60, 186, 121, 50, 197, 130, 54, 201, 136, 60, 192, 128, 58, 194, 132, 62, 210, 148, + 69, 201, 141, 64, 204, 148, 76, 201, 137, 65, 213, 150, 69, 197, 136, 60, 186, 122, 53, 177, 114, 44, 191, 132, 59, 190, 127, 52, 194, 135, 64, 192, 136, 65, 179, 117, 45, 192, 123, 50, 185, 113, 39, 183, 109, 38, 183, 110, 37, 173, 100, 28, 181, 108, 35, 179, 104, 31, 188, 113, 38, 177, 106, 36, 182, 112, 40, 170, 101, 37, 173, 104, 35, 179, 109, 39, 179, 110, 39, 168, 101, 37, 176, 114, 42, 183, 125, 53, 176, 124, 53, 144, 105, 34, 109, 88, 25, 74, 67, 8, 61, 66, 0, 64, 74, 0, 46, 61, 2, 34, 46, 0, 35, 59, 1, 43, 72, 15, 49, 79, 42, 68, 108, 108, 82, 127, 143, 82, 119, 134, 68, 100, 106, 52, 70, 54, 30, 46, 33, 15, 43, 45, 21, 59, 73, 35, 71, 77, 45, 71, 57, 53, 70, 24, 50, 67, 34, 45, 64, 59, + 67, 52, 5, 90, 78, 27, 101, 97, 68, 116, 100, 38, 148, 125, 50, 152, 136, 35, 158, 146, 51, 129, 116, 33, 75, 62, 0, 43, 32, 0, 35, 22, 2, 110, 81, 38, 104, 96, 18, 118, 111, 10, 128, 121, 12, 139, 125, 45, 119, 101, 38, 94, 81, 26, 90, 79, 26, 75, 63, 12, 102, 90, 21, 139, 124, 47, 122, 95, 34, 128, 90, 36, 146, 97, 35, 152, 99, 35, 135, 85, 29, 186, 129, 55, 196, 136, 63, 176, 119, 44, 174, 113, 44, 167, 109, 38, 182, 125, 54, 165, 108, 45, 148, 93, 36, 113, 67, 19, 100, 54, 10, 80, 38, 4, 75, 36, 4, 72, 35, 2, 94, 53, 16, 91, 53, 12, 123, 79, 31, 162, 110, 50, 160, 108, 48, 165, 113, 49, 184, 131, 60, 177, 125, 58, 169, 114, 46, 180, 123, 54, 178, 120, 56, 197, 142, 68, 183, 127, 58, 166, + 107, 46, 163, 106, 47, 147, 88, 25, 180, 115, 46, 203, 136, 55, 185, 122, 48, 128, 75, 22, 174, 110, 37, 171, 103, 32, 183, 117, 40, 178, 115, 47, 154, 101, 42, 119, 75, 30, 66, 34, 10, 43, 15, 3, 41, 17, 5, 79, 53, 27, 186, 168, 129, 213, 198, 160, 216, 198, 159, 202, 183, 140, 217, 198, 151, 216, 189, 131, 225, 200, 151, 217, 194, 143, 227, 206, 158, 213, 188, 136, 228, 208, 159, 226, 205, 158, 220, 194, 146, 233, 213, 160, 223, 200, 145, 233, 215, 168, 239, 224, 182, 218, 193, 142, 226, 209, 165, 230, 214, 169, 191, 152, 94, 170, 120, 59, 181, 124, 54, 174, 116, 49, 177, 115, 43, 171, 104, 36, 181, 118, 48, 189, 122, 52, 200, 135, 61, 205, 139, 63, 208, 139, 59, 198, 131, 54, 203, 135, 57, 210, 145, 67, 205, 148, 76, 199, 141, 70, 199, 138, + 62, 196, 138, 63, 200, 146, 76, 203, 140, 65, 209, 148, 68, 199, 140, 70, 193, 132, 63, 177, 119, 54, 191, 132, 62, 189, 130, 60, 198, 136, 64, 188, 126, 54, 167, 104, 37, 186, 121, 43, 183, 115, 38, 180, 108, 34, 179, 106, 32, 182, 112, 44, 178, 108, 36, 184, 116, 46, 180, 106, 32, 182, 111, 40, 178, 108, 34, 186, 119, 46, 171, 101, 36, 177, 108, 38, 181, 111, 42, 177, 110, 44, 169, 108, 40, 175, 113, 46, 172, 125, 53, 152, 110, 40, 135, 104, 35, 96, 83, 15, 69, 74, 2, 66, 78, 1, 52, 67, 1, 46, 64, 0, 54, 79, 9, 59, 91, 36, 75, 106, 72, 87, 119, 108, 83, 134, 161, 82, 138, 179, 67, 118, 146, 60, 90, 93, 48, 85, 98, 36, 71, 82, 27, 67, 84, 40, 94, 127, 68, 113, 127, 83, 109, 75, 79, 101, 55, 58, 74, 42, + 65, 58, 13, 88, 74, 20, 78, 63, 7, 96, 81, 16, 141, 121, 44, 147, 128, 26, 113, 96, 9, 80, 71, 2, 28, 24, 0, 34, 26, 3, 102, 92, 24, 152, 131, 63, 120, 109, 21, 122, 115, 12, 139, 126, 15, 145, 130, 46, 118, 99, 38, 75, 60, 15, 78, 64, 13, 63, 57, 4, 73, 62, 13, 115, 96, 34, 113, 86, 30, 141, 97, 39, 154, 105, 42, 120, 70, 21, 144, 91, 36, 196, 139, 61, 179, 121, 53, 171, 113, 44, 165, 107, 37, 172, 114, 46, 188, 130, 56, 172, 116, 50, 136, 87, 34, 82, 43, 7, 108, 64, 15, 82, 45, 6, 76, 36, 3, 65, 29, 4, 86, 48, 12, 84, 49, 12, 123, 76, 31, 167, 119, 54, 169, 119, 57, 174, 123, 58, 192, 137, 67, 171, 120, 51, 175, 121, 51, 184, 131, 62, 174, 119, 55, 190, 136, 69, 187, 130, 64, 183, + 124, 52, 173, 117, 56, 168, 114, 46, 165, 102, 40, 202, 137, 57, 188, 124, 50, 140, 83, 28, 157, 94, 34, 170, 106, 43, 188, 122, 45, 185, 123, 49, 171, 110, 42, 144, 99, 40, 141, 91, 29, 60, 29, 5, 29, 8, 1, 96, 75, 50, 197, 178, 138, 208, 193, 156, 184, 163, 125, 201, 182, 144, 216, 196, 153, 187, 158, 109, 199, 175, 134, 208, 183, 134, 209, 187, 141, 196, 172, 122, 221, 206, 160, 195, 172, 125, 199, 171, 124, 221, 207, 164, 218, 198, 154, 222, 196, 144, 234, 219, 178, 221, 203, 163, 217, 200, 156, 230, 215, 175, 192, 153, 100, 184, 129, 62, 192, 133, 63, 181, 120, 51, 179, 112, 39, 190, 123, 46, 167, 104, 35, 193, 124, 51, 205, 140, 64, 204, 138, 60, 215, 149, 74, 200, 134, 58, 207, 143, 66, 208, 141, 66, 207, 151, 75, 211, 151, 78, 195, 132, + 54, 205, 152, 76, 207, 146, 70, 208, 142, 66, 206, 142, 65, 198, 137, 63, 198, 144, 71, 194, 138, 65, 188, 124, 51, 195, 141, 69, 197, 133, 59, 185, 123, 50, 170, 110, 41, 166, 104, 31, 173, 105, 33, 180, 110, 36, 176, 104, 34, 185, 110, 32, 183, 113, 40, 187, 119, 46, 177, 108, 39, 185, 115, 43, 169, 99, 29, 183, 113, 44, 176, 107, 39, 172, 100, 32, 182, 115, 45, 183, 115, 44, 178, 112, 45, 174, 109, 44, 166, 114, 43, 137, 102, 30, 126, 98, 23, 117, 98, 24, 79, 77, 7, 60, 72, 1, 59, 77, 1, 61, 82, 5, 69, 91, 40, 79, 108, 88, 88, 122, 109, 97, 135, 134, 103, 159, 193, 98, 174, 238, 96, 174, 235, 94, 160, 207, 89, 154, 202, 78, 147, 209, 62, 127, 175, 56, 119, 159, 81, 130, 145, 101, 126, 84, 106, 130, 74, 85, 109, 51, + 100, 88, 13, 113, 96, 18, 118, 103, 28, 100, 85, 15, 78, 62, 6, 100, 80, 20, 93, 82, 20, 70, 64, 7, 71, 63, 15, 132, 124, 48, 154, 146, 46, 151, 136, 51, 104, 94, 13, 111, 107, 14, 128, 118, 10, 144, 129, 41, 103, 86, 25, 43, 37, 1, 60, 60, 7, 85, 80, 11, 82, 75, 20, 86, 77, 26, 103, 73, 26, 126, 81, 34, 148, 101, 44, 117, 70, 24, 177, 123, 52, 194, 134, 61, 171, 117, 48, 161, 103, 34, 172, 110, 45, 188, 130, 58, 181, 123, 53, 164, 108, 44, 115, 68, 19, 101, 57, 13, 114, 67, 16, 83, 42, 4, 76, 38, 3, 63, 30, 3, 87, 51, 10, 78, 45, 9, 134, 85, 35, 168, 121, 58, 174, 123, 60, 177, 123, 57, 184, 137, 68, 174, 119, 52, 178, 125, 54, 189, 135, 63, 178, 130, 66, 191, 140, 72, 182, 126, 60, 190, + 133, 61, 171, 117, 57, 158, 101, 38, 151, 92, 27, 182, 119, 41, 189, 126, 49, 164, 108, 39, 149, 85, 25, 180, 114, 40, 177, 110, 38, 187, 119, 41, 189, 124, 47, 170, 115, 47, 143, 92, 30, 91, 47, 9, 36, 12, 0, 98, 76, 57, 165, 147, 114, 169, 151, 120, 183, 161, 129, 185, 167, 131, 210, 192, 153, 178, 158, 113, 180, 158, 117, 198, 181, 140, 193, 169, 129, 177, 153, 104, 206, 187, 143, 211, 191, 150, 205, 181, 137, 218, 199, 155, 209, 186, 143, 190, 166, 119, 214, 194, 147, 203, 183, 139, 203, 184, 144, 210, 189, 145, 198, 167, 115, 197, 139, 69, 197, 135, 62, 193, 133, 58, 182, 116, 45, 190, 126, 48, 192, 126, 49, 197, 129, 50, 211, 143, 60, 207, 141, 60, 211, 144, 65, 201, 137, 59, 198, 132, 61, 213, 151, 73, 205, 147, 74, 213, 153, 77, 190, 126, + 50, 200, 142, 76, 185, 120, 54, 200, 135, 61, 201, 139, 63, 201, 139, 63, 201, 144, 69, 200, 146, 73, 190, 130, 60, 193, 135, 63, 198, 137, 63, 184, 119, 46, 183, 119, 48, 177, 114, 47, 165, 101, 37, 176, 107, 38, 176, 105, 37, 173, 99, 29, 179, 109, 36, 182, 113, 41, 179, 108, 38, 172, 102, 32, 175, 104, 36, 169, 96, 31, 181, 110, 41, 182, 114, 45, 175, 105, 34, 178, 109, 40, 184, 115, 48, 176, 111, 43, 166, 113, 40, 138, 109, 31, 116, 101, 21, 103, 90, 16, 83, 79, 6, 69, 78, 2, 60, 75, 1, 61, 80, 15, 60, 82, 31, 66, 93, 67, 83, 124, 122, 101, 150, 168, 103, 166, 205, 110, 180, 239, 112, 190, 246, 115, 192, 246, 120, 197, 247, 111, 188, 245, 83, 152, 209, 55, 112, 150, 67, 125, 166, 96, 128, 118, 104, 132, 103, 107, 133, 84, + 127, 109, 21, 115, 101, 13, 81, 67, 11, 71, 60, 6, 47, 39, 2, 60, 43, 6, 43, 32, 5, 105, 94, 27, 154, 145, 52, 137, 127, 27, 115, 101, 20, 119, 102, 49, 69, 66, 16, 69, 69, 21, 99, 91, 11, 105, 94, 2, 73, 64, 0, 46, 42, 4, 90, 85, 8, 93, 82, 1, 89, 81, 8, 94, 77, 23, 88, 59, 17, 126, 90, 42, 134, 87, 36, 164, 113, 49, 181, 126, 54, 183, 130, 60, 163, 107, 43, 160, 102, 37, 188, 131, 57, 186, 128, 54, 176, 120, 50, 151, 99, 38, 109, 62, 16, 131, 80, 24, 103, 54, 8, 87, 46, 8, 76, 40, 4, 80, 44, 11, 98, 57, 13, 74, 41, 7, 143, 93, 39, 164, 118, 55, 177, 128, 64, 178, 127, 64, 186, 135, 68, 165, 109, 48, 174, 118, 51, 187, 134, 66, 173, 128, 62, 189, 139, 72, 184, 127, 61, 197, + 138, 68, 182, 127, 57, 165, 102, 40, 151, 91, 35, 174, 111, 34, 185, 119, 42, 165, 108, 44, 163, 103, 41, 179, 109, 35, 165, 97, 28, 183, 112, 36, 183, 115, 37, 189, 126, 47, 148, 95, 29, 107, 60, 17, 42, 17, 0, 91, 68, 54, 133, 117, 91, 137, 124, 94, 112, 102, 77, 148, 135, 109, 200, 184, 151, 183, 164, 129, 156, 133, 94, 178, 161, 130, 198, 178, 142, 197, 174, 132, 199, 179, 139, 198, 176, 140, 191, 167, 132, 188, 169, 129, 180, 155, 118, 187, 168, 130, 192, 174, 136, 159, 141, 109, 175, 152, 113, 192, 161, 113, 201, 160, 103, 205, 145, 73, 196, 131, 59, 182, 118, 48, 194, 128, 54, 199, 131, 50, 197, 130, 54, 212, 146, 60, 212, 140, 55, 211, 140, 55, 219, 152, 71, 209, 148, 74, 190, 119, 52, 204, 139, 64, 203, 141, 68, 213, 152, 77, 186, 123, + 50, 193, 134, 64, 184, 121, 56, 203, 140, 64, 203, 141, 66, 207, 147, 71, 210, 153, 78, 201, 148, 79, 190, 133, 64, 191, 130, 59, 194, 132, 58, 171, 106, 38, 179, 107, 38, 188, 121, 51, 188, 130, 66, 151, 83, 26, 160, 91, 23, 175, 101, 31, 172, 97, 31, 171, 98, 31, 168, 99, 34, 175, 107, 39, 178, 111, 45, 170, 98, 34, 174, 101, 34, 186, 114, 44, 181, 109, 39, 180, 112, 42, 180, 114, 43, 184, 122, 48, 180, 120, 49, 147, 110, 37, 108, 91, 15, 99, 88, 15, 86, 83, 15, 95, 95, 33, 72, 79, 21, 53, 68, 3, 52, 68, 3, 52, 75, 25, 75, 117, 108, 99, 152, 178, 111, 176, 216, 112, 184, 238, 119, 194, 246, 137, 208, 248, 139, 209, 250, 119, 197, 253, 87, 151, 199, 51, 106, 137, 65, 134, 186, 91, 149, 176, 102, 146, 147, 114, 145, 126, + 102, 87, 17, 74, 63, 12, 55, 46, 3, 37, 26, 0, 38, 28, 4, 84, 69, 25, 96, 87, 27, 72, 67, 16, 51, 46, 0, 37, 37, 0, 58, 44, 11, 66, 50, 18, 23, 23, 1, 17, 20, 0, 22, 25, 1, 30, 30, 0, 21, 22, 0, 15, 18, 2, 41, 39, 1, 54, 51, 0, 61, 57, 12, 66, 47, 14, 100, 69, 30, 153, 110, 43, 132, 90, 38, 166, 113, 48, 186, 133, 63, 168, 117, 48, 164, 107, 39, 182, 124, 52, 192, 135, 60, 172, 110, 38, 173, 117, 51, 137, 88, 28, 126, 77, 23, 131, 79, 20, 96, 50, 7, 101, 56, 13, 75, 38, 6, 103, 61, 18, 93, 55, 15, 91, 52, 13, 143, 91, 40, 164, 116, 52, 180, 129, 66, 178, 128, 63, 179, 129, 62, 164, 112, 45, 171, 118, 51, 189, 139, 71, 175, 128, 65, 187, 138, 73, 187, 135, 65, 183, + 130, 60, 182, 128, 59, 170, 108, 43, 149, 88, 29, 157, 97, 29, 176, 111, 38, 150, 93, 34, 161, 101, 37, 176, 106, 36, 161, 94, 26, 167, 103, 30, 188, 120, 40, 191, 127, 50, 178, 121, 46, 122, 77, 25, 43, 16, 1, 59, 34, 18, 110, 94, 75, 96, 84, 64, 121, 111, 93, 108, 98, 77, 186, 178, 151, 160, 144, 115, 169, 153, 125, 125, 112, 89, 149, 136, 101, 185, 164, 125, 179, 163, 126, 189, 169, 132, 190, 169, 132, 158, 139, 105, 149, 127, 97, 159, 138, 108, 152, 135, 106, 161, 147, 116, 179, 151, 107, 191, 144, 84, 208, 156, 88, 207, 155, 87, 199, 138, 64, 192, 130, 62, 188, 117, 41, 199, 128, 48, 190, 119, 43, 211, 140, 58, 204, 133, 52, 208, 138, 59, 212, 146, 62, 210, 146, 66, 196, 129, 56, 210, 149, 70, 202, 145, 71, 217, 156, 78, 194, 131, + 57, 194, 134, 68, 193, 134, 61, 195, 133, 60, 202, 140, 65, 200, 140, 63, 207, 147, 71, 198, 142, 72, 187, 129, 59, 192, 131, 60, 180, 118, 48, 170, 109, 43, 166, 99, 32, 187, 117, 42, 193, 131, 60, 185, 125, 61, 149, 87, 33, 141, 77, 21, 169, 99, 31, 175, 105, 35, 159, 90, 25, 165, 94, 28, 171, 105, 39, 183, 116, 44, 175, 105, 35, 185, 115, 41, 184, 114, 41, 182, 112, 40, 180, 118, 48, 177, 116, 50, 182, 123, 55, 156, 111, 40, 139, 111, 43, 116, 99, 37, 108, 102, 57, 105, 114, 100, 91, 105, 90, 63, 78, 19, 50, 68, 0, 56, 77, 1, 75, 99, 46, 99, 141, 141, 107, 167, 198, 115, 185, 239, 125, 199, 245, 140, 212, 251, 138, 212, 251, 126, 203, 254, 91, 159, 208, 59, 108, 125, 65, 134, 184, 87, 153, 195, 107, 152, 153, 107, 132, 97, + 53, 41, 4, 39, 28, 0, 37, 26, 0, 30, 22, 1, 42, 36, 7, 56, 51, 16, 41, 35, 2, 17, 18, 0, 17, 16, 0, 17, 17, 0, 51, 40, 8, 45, 57, 48, 38, 80, 106, 19, 42, 57, 34, 52, 65, 16, 21, 9, 37, 37, 9, 65, 58, 25, 69, 58, 30, 54, 44, 12, 54, 44, 12, 59, 39, 16, 129, 96, 46, 126, 86, 31, 145, 100, 44, 177, 124, 53, 172, 118, 48, 175, 124, 52, 165, 108, 39, 188, 134, 64, 187, 128, 56, 173, 115, 45, 160, 108, 42, 145, 93, 32, 154, 99, 33, 132, 78, 19, 127, 78, 22, 86, 47, 8, 62, 30, 3, 103, 61, 17, 92, 53, 14, 100, 59, 16, 146, 96, 44, 172, 120, 54, 178, 125, 60, 178, 125, 59, 177, 124, 57, 160, 107, 44, 177, 123, 55, 184, 135, 68, 185, 137, 72, 178, 133, 65, 178, 128, 63, 181, + 126, 55, 186, 135, 66, 188, 131, 64, 149, 95, 35, 163, 103, 36, 171, 108, 36, 154, 102, 45, 170, 113, 48, 167, 107, 40, 160, 95, 30, 138, 74, 17, 189, 122, 44, 191, 126, 52, 187, 125, 50, 137, 87, 37, 56, 21, 1, 63, 35, 19, 47, 31, 16, 74, 59, 43, 68, 57, 44, 72, 57, 45, 172, 157, 139, 115, 104, 81, 143, 131, 114, 77, 66, 50, 123, 108, 88, 179, 161, 121, 145, 124, 95, 166, 146, 115, 163, 141, 112, 147, 132, 102, 120, 105, 81, 148, 129, 105, 119, 97, 78, 142, 117, 89, 175, 125, 72, 202, 149, 72, 199, 135, 63, 196, 139, 71, 193, 131, 61, 198, 131, 58, 184, 114, 39, 201, 136, 55, 178, 110, 45, 207, 137, 50, 198, 122, 46, 207, 139, 59, 203, 133, 54, 206, 143, 66, 203, 135, 52, 211, 147, 66, 198, 136, 60, 213, 153, 75, 196, 134, + 66, 200, 141, 76, 194, 138, 64, 196, 136, 65, 201, 139, 65, 198, 138, 64, 202, 146, 71, 195, 140, 69, 188, 128, 58, 182, 122, 50, 172, 113, 46, 155, 95, 32, 152, 86, 24, 169, 101, 27, 185, 117, 44, 203, 143, 71, 183, 122, 60, 139, 80, 33, 149, 84, 24, 175, 106, 38, 176, 104, 34, 157, 86, 23, 162, 92, 27, 177, 109, 40, 175, 103, 35, 180, 109, 34, 184, 111, 40, 182, 116, 41, 176, 107, 39, 171, 112, 42, 170, 117, 53, 157, 112, 48, 141, 115, 53, 135, 114, 59, 105, 100, 63, 101, 111, 102, 88, 102, 89, 52, 64, 9, 40, 59, 0, 54, 72, 0, 72, 93, 23, 97, 127, 108, 98, 151, 169, 106, 168, 201, 111, 184, 231, 126, 202, 248, 132, 206, 248, 123, 202, 254, 98, 165, 209, 77, 116, 111, 65, 116, 141, 75, 128, 159, 101, 134, 121, 106, 122, 48, + 32, 22, 0, 40, 30, 2, 70, 62, 24, 40, 40, 20, 19, 19, 0, 17, 16, 1, 21, 15, 1, 51, 45, 11, 60, 58, 13, 68, 73, 12, 98, 97, 31, 78, 113, 86, 88, 156, 206, 73, 137, 194, 59, 83, 112, 35, 50, 48, 66, 60, 16, 126, 115, 68, 142, 124, 82, 128, 114, 69, 76, 66, 35, 79, 55, 28, 105, 72, 29, 135, 93, 38, 151, 107, 42, 148, 99, 38, 173, 117, 51, 165, 112, 43, 165, 111, 44, 194, 142, 65, 184, 122, 49, 174, 116, 49, 164, 113, 47, 162, 107, 41, 161, 103, 30, 154, 98, 34, 131, 82, 20, 78, 42, 5, 63, 32, 0, 98, 59, 15, 96, 53, 13, 115, 68, 22, 146, 97, 41, 157, 107, 39, 173, 120, 51, 178, 123, 57, 176, 125, 56, 164, 110, 50, 180, 129, 60, 168, 118, 54, 191, 138, 73, 178, 133, 67, 177, 129, 66, 166, + 113, 43, 190, 136, 67, 179, 123, 52, 158, 99, 39, 157, 96, 33, 163, 106, 42, 146, 98, 42, 173, 112, 46, 166, 102, 38, 158, 98, 37, 157, 92, 31, 159, 97, 34, 185, 121, 51, 189, 128, 52, 155, 89, 29, 98, 47, 9, 60, 21, 2, 46, 13, 0, 53, 32, 15, 47, 32, 21, 49, 30, 19, 147, 131, 109, 100, 88, 70, 99, 85, 65, 91, 76, 63, 66, 43, 26, 154, 134, 99, 156, 137, 111, 161, 142, 115, 152, 130, 104, 137, 112, 86, 112, 79, 53, 139, 102, 75, 113, 79, 53, 113, 79, 40, 165, 103, 38, 201, 143, 65, 191, 126, 49, 204, 132, 55, 194, 124, 49, 211, 141, 58, 195, 124, 45, 204, 137, 64, 185, 113, 40, 222, 151, 66, 197, 127, 43, 212, 145, 63, 200, 129, 57, 216, 151, 74, 193, 123, 41, 205, 141, 61, 199, 139, 65, 208, 152, 74, 199, 143, + 69, 199, 142, 75, 194, 134, 59, 202, 146, 74, 199, 139, 66, 197, 138, 66, 201, 146, 72, 193, 137, 65, 182, 121, 45, 185, 128, 54, 163, 103, 39, 147, 87, 26, 149, 86, 26, 152, 87, 26, 160, 92, 25, 189, 124, 46, 201, 140, 63, 173, 112, 53, 132, 68, 16, 164, 97, 35, 183, 114, 49, 171, 100, 36, 160, 91, 30, 172, 105, 41, 177, 107, 42, 176, 103, 33, 179, 109, 34, 183, 118, 39, 183, 119, 46, 158, 106, 36, 150, 108, 46, 148, 107, 48, 145, 118, 60, 138, 115, 56, 97, 86, 37, 74, 75, 41, 66, 75, 26, 44, 56, 3, 28, 48, 6, 37, 59, 5, 61, 86, 31, 86, 112, 79, 95, 123, 91, 92, 132, 121, 101, 165, 197, 112, 185, 235, 118, 197, 249, 118, 195, 250, 103, 165, 202, 88, 111, 76, 73, 91, 68, 73, 90, 82, 77, 96, 73, 92, 108, 60, + 72, 56, 22, 64, 60, 20, 33, 34, 10, 18, 16, 1, 22, 17, 1, 31, 28, 7, 68, 61, 18, 76, 88, 56, 74, 101, 93, 90, 113, 93, 110, 128, 100, 87, 118, 101, 97, 154, 176, 97, 168, 231, 73, 134, 191, 23, 50, 66, 47, 51, 13, 114, 101, 39, 146, 122, 71, 159, 142, 104, 78, 68, 45, 93, 68, 30, 80, 53, 23, 143, 103, 48, 141, 98, 42, 141, 94, 39, 173, 123, 53, 156, 105, 40, 178, 126, 61, 193, 131, 56, 176, 118, 45, 179, 127, 52, 152, 102, 40, 170, 112, 40, 167, 110, 42, 151, 98, 32, 99, 58, 12, 96, 59, 15, 73, 40, 4, 100, 57, 14, 113, 65, 18, 124, 76, 21, 151, 101, 42, 144, 97, 35, 174, 124, 55, 180, 127, 59, 175, 127, 59, 156, 106, 43, 182, 131, 62, 171, 123, 56, 186, 136, 69, 170, 125, 61, 175, 126, 64, 182, + 129, 60, 187, 136, 66, 172, 126, 58, 159, 103, 41, 152, 94, 28, 168, 110, 41, 133, 79, 25, 177, 118, 50, 176, 117, 50, 167, 107, 43, 176, 113, 44, 173, 106, 40, 190, 125, 50, 197, 136, 65, 173, 112, 44, 136, 77, 23, 128, 77, 26, 74, 30, 2, 65, 27, 5, 52, 25, 8, 47, 20, 10, 67, 46, 32, 100, 84, 69, 102, 85, 67, 64, 35, 21, 53, 23, 8, 125, 96, 69, 120, 91, 68, 146, 126, 93, 134, 94, 54, 135, 99, 62, 109, 69, 34, 144, 87, 42, 128, 80, 38, 148, 94, 43, 172, 106, 38, 197, 138, 62, 206, 139, 61, 217, 144, 61, 204, 130, 51, 201, 131, 49, 195, 128, 49, 195, 128, 49, 177, 106, 35, 197, 127, 49, 190, 120, 41, 212, 143, 62, 214, 149, 70, 208, 145, 69, 196, 132, 54, 194, 132, 56, 202, 141, 64, 210, 155, 81, 200, 145, + 72, 194, 135, 74, 196, 140, 73, 196, 142, 69, 198, 138, 66, 204, 148, 75, 198, 140, 66, 186, 126, 52, 183, 120, 46, 186, 119, 44, 190, 126, 52, 158, 95, 38, 150, 89, 31, 152, 90, 31, 133, 69, 14, 159, 91, 22, 191, 123, 49, 201, 138, 64, 183, 120, 56, 170, 105, 44, 175, 106, 42, 181, 113, 46, 170, 100, 39, 164, 94, 29, 174, 103, 38, 165, 98, 33, 179, 107, 35, 178, 111, 39, 182, 125, 54, 153, 103, 36, 127, 95, 32, 132, 103, 38, 127, 101, 38, 101, 85, 27, 65, 62, 16, 52, 54, 8, 54, 63, 6, 52, 72, 18, 49, 81, 64, 54, 95, 98, 69, 105, 94, 77, 105, 75, 90, 110, 61, 98, 132, 120, 107, 171, 203, 116, 193, 242, 116, 195, 249, 108, 180, 239, 87, 138, 160, 72, 89, 37, 70, 79, 18, 68, 77, 30, 72, 85, 48, 78, 87, 23, + 99, 76, 31, 26, 22, 0, 14, 10, 0, 27, 22, 4, 71, 61, 17, 67, 64, 28, 30, 35, 13, 63, 96, 77, 77, 129, 142, 103, 154, 179, 112, 170, 211, 102, 153, 187, 110, 143, 131, 107, 180, 234, 83, 152, 216, 39, 75, 102, 60, 65, 32, 98, 89, 22, 126, 114, 64, 127, 114, 73, 77, 60, 34, 57, 36, 9, 73, 47, 21, 155, 111, 50, 116, 78, 30, 156, 107, 42, 173, 118, 51, 180, 130, 60, 181, 131, 58, 197, 135, 58, 180, 122, 46, 171, 121, 52, 171, 117, 49, 176, 121, 53, 178, 123, 52, 131, 78, 22, 127, 80, 31, 111, 68, 17, 80, 44, 6, 88, 50, 11, 119, 70, 18, 127, 77, 21, 152, 104, 41, 141, 92, 33, 173, 123, 51, 176, 120, 50, 175, 125, 57, 165, 114, 49, 178, 127, 55, 176, 125, 59, 187, 142, 76, 159, 116, 52, 179, 131, 64, 172, + 119, 54, 185, 133, 65, 170, 121, 58, 173, 117, 51, 149, 86, 25, 164, 106, 40, 136, 84, 30, 182, 123, 53, 188, 129, 59, 168, 106, 38, 181, 117, 48, 189, 127, 54, 186, 124, 57, 194, 135, 60, 177, 119, 45, 176, 114, 45, 163, 102, 40, 113, 65, 17, 100, 53, 13, 87, 40, 10, 64, 28, 9, 41, 12, 0, 101, 63, 36, 78, 45, 19, 91, 48, 20, 68, 33, 9, 117, 79, 41, 133, 86, 42, 160, 116, 76, 172, 122, 64, 155, 111, 58, 110, 64, 20, 163, 104, 48, 166, 107, 48, 174, 118, 52, 173, 111, 46, 202, 140, 65, 204, 138, 62, 211, 145, 66, 204, 133, 52, 193, 124, 50, 204, 142, 59, 190, 125, 57, 185, 112, 40, 195, 128, 56, 201, 131, 54, 201, 134, 54, 213, 152, 75, 210, 146, 69, 207, 145, 71, 191, 128, 58, 207, 143, 66, 211, 154, 82, 201, 147, + 73, 194, 140, 73, 201, 148, 79, 196, 139, 70, 193, 132, 58, 205, 149, 73, 191, 133, 58, 189, 129, 55, 187, 121, 46, 183, 114, 40, 190, 122, 43, 193, 132, 57, 165, 105, 44, 164, 102, 41, 150, 85, 30, 132, 72, 13, 169, 103, 36, 192, 127, 53, 205, 141, 66, 193, 132, 59, 187, 126, 63, 179, 116, 52, 177, 112, 48, 160, 91, 31, 152, 85, 26, 167, 101, 34, 165, 97, 30, 176, 110, 40, 178, 118, 47, 154, 101, 43, 124, 85, 19, 112, 86, 26, 103, 86, 22, 82, 74, 19, 44, 51, 19, 42, 58, 47, 48, 68, 51, 58, 80, 37, 69, 104, 86, 73, 122, 129, 78, 121, 121, 70, 95, 61, 68, 90, 46, 93, 141, 150, 116, 184, 229, 122, 196, 245, 108, 177, 223, 81, 137, 175, 61, 79, 53, 49, 57, 6, 57, 67, 7, 66, 81, 12, 68, 84, 16, 68, 85, 21, + 109, 91, 39, 30, 21, 6, 28, 24, 3, 66, 58, 6, 98, 81, 9, 88, 85, 43, 56, 61, 38, 36, 48, 32, 67, 104, 101, 99, 158, 194, 104, 169, 218, 96, 155, 196, 98, 124, 119, 100, 143, 158, 71, 124, 166, 46, 73, 83, 58, 60, 30, 85, 78, 26, 94, 86, 29, 91, 88, 38, 55, 44, 16, 48, 32, 11, 102, 71, 34, 135, 95, 37, 120, 78, 30, 149, 98, 41, 175, 124, 58, 171, 123, 56, 188, 136, 65, 169, 113, 42, 167, 109, 39, 166, 118, 56, 162, 112, 47, 185, 127, 58, 152, 96, 30, 139, 88, 32, 148, 95, 33, 112, 67, 19, 79, 44, 6, 90, 50, 12, 137, 86, 28, 117, 66, 15, 144, 91, 30, 158, 108, 43, 159, 109, 40, 185, 129, 56, 174, 125, 55, 161, 106, 43, 179, 128, 58, 178, 130, 62, 186, 140, 70, 162, 113, 51, 177, 127, 61, 179, + 129, 58, 185, 136, 70, 181, 130, 63, 180, 124, 55, 161, 105, 40, 165, 109, 46, 164, 113, 48, 188, 127, 54, 188, 129, 55, 176, 115, 45, 189, 129, 56, 191, 129, 56, 178, 116, 51, 204, 147, 74, 187, 130, 61, 195, 136, 66, 174, 114, 52, 152, 104, 51, 143, 92, 40, 170, 111, 49, 100, 52, 20, 85, 41, 7, 90, 48, 20, 111, 55, 10, 140, 86, 32, 112, 61, 20, 131, 81, 34, 163, 108, 45, 167, 111, 50, 181, 127, 58, 152, 98, 40, 148, 101, 50, 180, 118, 53, 183, 121, 46, 180, 117, 52, 192, 128, 56, 204, 139, 63, 185, 127, 53, 200, 139, 66, 199, 134, 54, 192, 127, 52, 202, 140, 66, 200, 135, 61, 189, 123, 49, 187, 121, 49, 203, 135, 56, 199, 129, 51, 212, 151, 72, 205, 143, 67, 209, 148, 71, 190, 129, 59, 200, 139, 61, 201, 144, 71, 211, 154, + 80, 195, 139, 71, 201, 144, 79, 204, 149, 77, 199, 137, 59, 204, 145, 72, 200, 141, 65, 192, 129, 54, 184, 119, 44, 180, 115, 37, 188, 114, 38, 183, 112, 37, 185, 119, 47, 157, 94, 34, 161, 98, 37, 150, 88, 30, 149, 83, 25, 172, 103, 38, 201, 135, 61, 201, 137, 56, 195, 131, 60, 187, 119, 51, 171, 100, 35, 183, 122, 59, 169, 107, 46, 158, 90, 25, 164, 95, 31, 174, 109, 44, 184, 123, 57, 173, 117, 52, 130, 88, 29, 119, 94, 36, 92, 71, 14, 73, 66, 15, 68, 72, 40, 50, 80, 84, 49, 97, 121, 66, 100, 91, 65, 93, 63, 74, 116, 110, 75, 111, 98, 55, 76, 45, 47, 69, 33, 81, 122, 124, 110, 165, 185, 120, 162, 163, 90, 126, 111, 57, 80, 62, 33, 40, 7, 35, 38, 0, 45, 55, 0, 58, 76, 9, 62, 88, 21, 75, 101, 39, + 83, 73, 27, 113, 97, 46, 99, 90, 34, 110, 101, 30, 131, 115, 42, 148, 125, 47, 107, 104, 67, 59, 75, 66, 25, 33, 19, 55, 83, 74, 56, 100, 114, 56, 80, 80, 54, 68, 50, 58, 72, 51, 37, 59, 56, 38, 50, 40, 62, 66, 36, 90, 80, 20, 119, 108, 40, 105, 97, 33, 39, 32, 14, 57, 42, 19, 98, 69, 32, 89, 59, 18, 127, 87, 36, 149, 100, 45, 174, 122, 56, 164, 116, 51, 193, 140, 67, 160, 107, 39, 175, 122, 56, 171, 124, 57, 174, 122, 51, 177, 122, 49, 139, 82, 28, 159, 108, 50, 149, 100, 40, 122, 76, 26, 76, 43, 8, 98, 58, 20, 131, 79, 22, 126, 75, 19, 134, 81, 24, 158, 108, 42, 164, 112, 44, 179, 124, 51, 179, 130, 57, 166, 114, 48, 171, 119, 51, 176, 127, 58, 180, 130, 63, 183, 135, 65, 183, 131, 62, 191, + 140, 71, 186, 135, 74, 189, 138, 73, 185, 128, 62, 168, 107, 42, 162, 106, 47, 187, 131, 64, 188, 130, 59, 186, 130, 59, 178, 118, 51, 194, 134, 60, 179, 118, 50, 178, 119, 55, 195, 139, 66, 190, 135, 66, 206, 146, 71, 180, 123, 59, 152, 100, 44, 165, 110, 48, 174, 118, 62, 134, 74, 22, 158, 96, 29, 135, 86, 40, 86, 40, 13, 156, 98, 36, 143, 87, 28, 136, 79, 25, 173, 116, 47, 183, 127, 57, 183, 126, 58, 170, 114, 53, 172, 118, 57, 172, 109, 47, 189, 127, 52, 174, 115, 49, 187, 124, 50, 210, 146, 70, 187, 130, 61, 194, 135, 58, 187, 124, 51, 181, 122, 51, 195, 136, 62, 194, 132, 61, 193, 127, 52, 194, 129, 59, 197, 126, 52, 199, 133, 60, 210, 147, 69, 207, 145, 68, 206, 146, 77, 194, 133, 63, 204, 143, 70, 201, 146, 77, 207, 150, + 78, 195, 138, 70, 199, 146, 71, 205, 149, 78, 192, 134, 60, 199, 138, 60, 195, 133, 57, 189, 126, 49, 195, 129, 53, 172, 100, 29, 183, 108, 35, 181, 109, 38, 199, 130, 50, 191, 123, 49, 169, 104, 36, 157, 88, 30, 161, 96, 34, 150, 81, 23, 172, 107, 40, 199, 128, 53, 194, 124, 47, 195, 129, 56, 186, 121, 52, 172, 104, 38, 188, 126, 56, 168, 103, 40, 160, 95, 30, 178, 113, 49, 173, 112, 47, 176, 118, 54, 142, 101, 45, 125, 96, 42, 92, 71, 14, 89, 78, 29, 77, 77, 43, 70, 87, 80, 58, 101, 115, 66, 104, 103, 72, 109, 101, 80, 136, 162, 82, 139, 166, 72, 91, 48, 60, 73, 7, 90, 111, 59, 109, 131, 85, 103, 124, 58, 72, 90, 32, 47, 65, 15, 34, 49, 5, 28, 36, 0, 39, 51, 0, 52, 67, 4, 58, 80, 16, 74, 95, 33, + 27, 23, 8, 81, 66, 34, 120, 97, 57, 108, 97, 51, 110, 94, 45, 201, 157, 91, 164, 140, 74, 68, 76, 50, 67, 74, 39, 51, 63, 39, 57, 62, 8, 35, 49, 5, 18, 36, 15, 32, 61, 55, 25, 60, 60, 43, 53, 28, 88, 85, 28, 110, 102, 30, 97, 83, 16, 70, 62, 26, 30, 22, 10, 50, 39, 22, 72, 47, 19, 78, 52, 24, 141, 98, 43, 172, 118, 56, 165, 117, 53, 169, 119, 56, 178, 124, 56, 149, 100, 35, 179, 128, 60, 174, 123, 53, 190, 135, 59, 168, 113, 44, 155, 105, 46, 170, 116, 52, 159, 107, 47, 125, 81, 32, 70, 41, 10, 102, 58, 17, 136, 82, 26, 130, 74, 22, 141, 88, 26, 152, 100, 35, 156, 106, 35, 180, 123, 53, 174, 126, 56, 164, 114, 48, 163, 111, 46, 174, 126, 61, 181, 130, 63, 189, 140, 71, 183, 128, 57, 190, + 136, 65, 183, 134, 70, 182, 133, 65, 187, 132, 61, 176, 121, 52, 148, 94, 38, 179, 121, 53, 194, 143, 68, 174, 118, 54, 187, 127, 62, 184, 123, 51, 179, 118, 45, 177, 119, 55, 184, 127, 63, 175, 119, 58, 205, 151, 80, 166, 115, 56, 164, 112, 58, 171, 119, 55, 187, 129, 67, 166, 97, 28, 203, 136, 55, 177, 114, 44, 124, 72, 28, 119, 68, 22, 192, 136, 66, 162, 101, 36, 174, 110, 38, 194, 135, 58, 185, 132, 65, 175, 115, 50, 179, 125, 57, 175, 116, 50, 183, 119, 47, 177, 120, 51, 193, 128, 52, 219, 156, 74, 176, 115, 46, 168, 106, 35, 184, 123, 54, 184, 133, 73, 181, 122, 54, 200, 140, 71, 180, 113, 41, 206, 141, 62, 189, 118, 46, 200, 137, 67, 205, 147, 68, 205, 146, 65, 202, 142, 69, 201, 143, 65, 205, 151, 72, 204, 149, 76, 211, 157, + 89, 195, 138, 71, 201, 148, 75, 201, 142, 71, 191, 131, 54, 195, 132, 59, 181, 115, 43, 185, 118, 44, 192, 126, 53, 173, 103, 36, 179, 107, 34, 184, 113, 41, 185, 115, 41, 199, 129, 45, 188, 118, 42, 184, 115, 45, 147, 82, 26, 140, 77, 25, 155, 87, 24, 181, 112, 37, 194, 124, 48, 187, 114, 37, 200, 134, 59, 192, 129, 52, 187, 122, 45, 186, 126, 58, 166, 101, 34, 171, 108, 44, 185, 129, 64, 167, 114, 52, 151, 107, 50, 107, 83, 31, 103, 82, 29, 98, 87, 49, 92, 90, 61, 67, 75, 47, 58, 75, 56, 61, 79, 50, 65, 98, 85, 81, 141, 174, 89, 154, 195, 91, 116, 92, 87, 102, 24, 100, 118, 47, 105, 120, 52, 88, 101, 37, 65, 84, 28, 56, 80, 15, 48, 72, 12, 32, 49, 3, 34, 45, 0, 49, 61, 3, 61, 76, 9, 72, 83, 9, + 18, 21, 5, 16, 13, 3, 24, 21, 8, 25, 25, 5, 46, 38, 14, 150, 117, 55, 78, 72, 14, 33, 48, 7, 57, 69, 23, 65, 81, 45, 58, 69, 28, 44, 60, 22, 35, 59, 42, 42, 64, 52, 80, 89, 55, 94, 92, 26, 67, 66, 11, 31, 33, 0, 28, 32, 2, 41, 38, 9, 32, 23, 11, 43, 33, 16, 57, 36, 13, 88, 60, 28, 152, 105, 45, 179, 130, 61, 146, 99, 39, 142, 90, 32, 174, 122, 56, 149, 102, 44, 188, 136, 67, 186, 131, 58, 191, 135, 65, 157, 105, 42, 171, 119, 60, 170, 115, 52, 156, 102, 44, 108, 64, 20, 72, 40, 6, 119, 75, 23, 138, 86, 23, 127, 75, 19, 151, 95, 34, 135, 83, 27, 154, 104, 33, 178, 121, 51, 169, 121, 51, 160, 108, 42, 147, 96, 35, 173, 125, 55, 172, 119, 52, 189, 138, 66, 183, 129, 58, 191, + 137, 67, 184, 133, 68, 177, 127, 60, 186, 132, 61, 177, 125, 61, 160, 104, 42, 187, 136, 68, 194, 141, 68, 177, 125, 59, 183, 125, 56, 183, 123, 53, 178, 118, 51, 187, 131, 68, 172, 122, 57, 173, 119, 57, 185, 128, 56, 161, 106, 44, 181, 127, 68, 178, 128, 68, 187, 127, 56, 174, 108, 39, 204, 134, 50, 209, 142, 60, 179, 119, 52, 144, 90, 40, 157, 97, 39, 172, 112, 44, 190, 131, 55, 189, 136, 63, 175, 123, 55, 183, 120, 46, 197, 141, 65, 157, 93, 30, 176, 111, 44, 199, 138, 65, 190, 126, 54, 220, 158, 75, 188, 127, 52, 177, 115, 49, 188, 130, 62, 154, 97, 38, 168, 114, 57, 200, 139, 65, 188, 124, 51, 193, 131, 55, 195, 131, 57, 195, 134, 64, 193, 130, 55, 205, 142, 64, 202, 140, 70, 203, 145, 67, 207, 151, 81, 199, 143, 72, 212, 160, + 88, 196, 141, 70, 197, 140, 69, 200, 142, 68, 194, 131, 56, 192, 126, 53, 180, 115, 49, 168, 103, 36, 189, 125, 53, 187, 118, 43, 183, 111, 35, 174, 102, 32, 185, 118, 47, 198, 131, 56, 194, 127, 51, 183, 109, 34, 183, 117, 45, 158, 95, 37, 133, 66, 16, 158, 86, 20, 190, 118, 39, 200, 128, 49, 195, 123, 46, 188, 119, 44, 192, 125, 45, 199, 134, 59, 185, 124, 55, 160, 94, 31, 175, 117, 51, 171, 119, 59, 154, 111, 50, 107, 85, 33, 90, 75, 25, 73, 65, 21, 68, 66, 26, 58, 68, 29, 59, 76, 44, 64, 78, 52, 63, 85, 58, 71, 109, 114, 76, 127, 148, 71, 107, 91, 84, 106, 38, 99, 119, 59, 100, 116, 67, 87, 102, 40, 67, 83, 21, 63, 84, 18, 61, 82, 14, 41, 54, 4, 36, 42, 0, 61, 67, 0, 81, 90, 10, 86, 91, 13, + 11, 11, 0, 28, 32, 4, 25, 31, 7, 21, 31, 9, 36, 37, 9, 13, 17, 1, 12, 25, 1, 16, 37, 0, 31, 45, 1, 52, 63, 6, 59, 67, 5, 77, 82, 45, 109, 104, 50, 115, 110, 56, 119, 106, 40, 86, 84, 34, 66, 65, 31, 33, 34, 7, 24, 26, 4, 33, 31, 14, 30, 22, 9, 37, 27, 14, 69, 47, 21, 146, 99, 42, 179, 127, 58, 166, 116, 53, 134, 83, 27, 136, 86, 32, 160, 113, 47, 179, 130, 64, 191, 136, 67, 193, 138, 61, 176, 126, 57, 172, 121, 55, 182, 133, 68, 175, 122, 56, 149, 95, 33, 102, 55, 13, 58, 30, 5, 137, 84, 30, 150, 93, 30, 128, 75, 22, 147, 89, 27, 124, 74, 21, 156, 102, 35, 175, 121, 49, 175, 123, 51, 145, 94, 33, 145, 95, 34, 164, 113, 50, 175, 123, 55, 186, 130, 58, 185, 131, 57, 194, + 144, 72, 181, 131, 65, 190, 141, 74, 193, 140, 70, 177, 128, 62, 158, 104, 38, 181, 130, 61, 197, 142, 71, 173, 121, 54, 183, 123, 53, 176, 115, 46, 174, 118, 52, 178, 121, 58, 145, 91, 33, 183, 127, 62, 180, 119, 47, 176, 113, 47, 184, 127, 65, 154, 101, 46, 193, 137, 66, 174, 109, 46, 190, 131, 52, 210, 148, 66, 203, 141, 66, 151, 97, 35, 155, 95, 30, 169, 107, 35, 198, 141, 66, 195, 137, 66, 164, 115, 51, 209, 146, 64, 205, 145, 71, 175, 108, 39, 186, 120, 48, 203, 142, 75, 187, 120, 43, 217, 154, 69, 203, 139, 60, 197, 131, 58, 185, 129, 63, 146, 91, 36, 166, 116, 57, 193, 131, 59, 193, 128, 55, 193, 132, 62, 200, 137, 60, 193, 130, 61, 200, 140, 60, 204, 141, 61, 205, 141, 69, 206, 146, 71, 204, 152, 76, 199, 139, 68, 214, 161, + 89, 195, 139, 68, 197, 139, 65, 194, 132, 58, 196, 132, 60, 195, 129, 55, 190, 126, 56, 172, 108, 40, 192, 128, 53, 181, 115, 39, 185, 113, 34, 186, 112, 37, 174, 106, 37, 193, 128, 61, 193, 127, 55, 182, 109, 32, 192, 121, 47, 180, 113, 42, 154, 88, 26, 115, 50, 7, 148, 77, 13, 198, 123, 44, 207, 137, 54, 177, 108, 41, 163, 95, 25, 188, 123, 46, 206, 142, 68, 176, 110, 44, 171, 110, 41, 172, 122, 60, 159, 116, 55, 123, 95, 38, 95, 85, 38, 46, 47, 13, 38, 45, 18, 51, 74, 59, 65, 97, 93, 82, 107, 94, 70, 86, 51, 51, 74, 59, 51, 86, 82, 56, 73, 21, 73, 84, 13, 98, 110, 54, 105, 112, 52, 98, 106, 32, 74, 90, 27, 74, 97, 40, 85, 104, 40, 72, 87, 7, 63, 69, 1, 77, 80, 1, 98, 100, 13, 96, 94, 8, + 55, 53, 27, 36, 47, 10, 26, 37, 11, 82, 84, 34, 101, 91, 40, 63, 55, 23, 9, 16, 0, 27, 39, 3, 57, 67, 5, 92, 94, 21, 102, 100, 27, 119, 114, 34, 108, 101, 29, 98, 93, 27, 64, 56, 7, 70, 76, 51, 79, 103, 110, 62, 70, 61, 44, 44, 18, 42, 36, 19, 52, 40, 20, 77, 56, 29, 136, 97, 43, 166, 116, 54, 175, 122, 52, 144, 97, 32, 105, 60, 15, 125, 80, 29, 167, 114, 48, 185, 133, 60, 181, 127, 55, 188, 131, 59, 164, 108, 36, 177, 121, 50, 175, 124, 56, 176, 120, 55, 149, 94, 35, 103, 63, 18, 52, 26, 4, 152, 99, 35, 150, 95, 32, 133, 81, 24, 142, 90, 30, 112, 65, 15, 147, 93, 31, 164, 110, 42, 171, 117, 41, 152, 101, 36, 141, 92, 31, 164, 113, 46, 179, 129, 56, 179, 124, 54, 184, 126, 54, 191, + 140, 71, 183, 131, 65, 190, 139, 72, 199, 144, 76, 162, 107, 41, 163, 107, 42, 186, 134, 63, 187, 132, 64, 187, 133, 64, 185, 126, 59, 173, 116, 47, 176, 120, 52, 166, 109, 43, 150, 90, 33, 182, 126, 57, 194, 133, 57, 187, 125, 53, 198, 144, 79, 137, 83, 33, 189, 131, 66, 169, 108, 44, 183, 119, 45, 213, 153, 75, 208, 150, 75, 186, 132, 63, 163, 101, 37, 181, 122, 55, 200, 140, 67, 209, 146, 71, 181, 123, 53, 217, 155, 77, 214, 154, 80, 176, 108, 36, 188, 119, 43, 199, 141, 70, 176, 111, 42, 221, 158, 74, 199, 134, 58, 198, 134, 58, 180, 124, 54, 162, 108, 51, 161, 112, 57, 188, 128, 61, 197, 134, 57, 196, 133, 58, 205, 141, 66, 193, 128, 53, 203, 138, 64, 204, 140, 61, 206, 147, 72, 207, 148, 73, 204, 146, 75, 200, 140, 68, 212, 159, + 87, 198, 138, 67, 199, 139, 65, 191, 131, 55, 187, 123, 53, 186, 120, 44, 183, 115, 43, 187, 122, 48, 182, 113, 44, 195, 126, 54, 177, 104, 33, 188, 116, 39, 174, 101, 33, 186, 120, 49, 202, 139, 71, 195, 129, 57, 181, 106, 33, 194, 122, 44, 185, 117, 44, 152, 84, 21, 138, 68, 9, 153, 83, 16, 201, 129, 51, 205, 134, 56, 175, 102, 36, 170, 101, 37, 183, 115, 43, 185, 124, 51, 177, 113, 47, 174, 118, 55, 150, 101, 40, 128, 97, 43, 91, 76, 29, 68, 63, 22, 57, 63, 41, 54, 80, 80, 66, 102, 107, 69, 97, 77, 53, 70, 32, 52, 88, 91, 64, 116, 144, 76, 93, 61, 78, 81, 13, 84, 86, 23, 97, 97, 25, 88, 93, 25, 80, 93, 43, 96, 114, 85, 103, 122, 81, 95, 110, 24, 95, 101, 7, 99, 105, 12, 110, 115, 19, 103, 95, 5, + 76, 76, 34, 31, 43, 8, 44, 45, 20, 96, 90, 35, 76, 70, 18, 127, 106, 54, 71, 67, 18, 87, 85, 26, 98, 97, 26, 97, 91, 24, 93, 84, 8, 94, 95, 1, 92, 104, 21, 109, 120, 90, 119, 112, 58, 104, 94, 28, 101, 119, 113, 47, 73, 83, 33, 39, 28, 41, 35, 19, 65, 47, 21, 137, 100, 45, 129, 86, 38, 179, 130, 59, 177, 123, 52, 130, 84, 27, 89, 51, 16, 151, 98, 42, 170, 119, 51, 188, 139, 68, 178, 123, 52, 183, 128, 59, 163, 103, 33, 181, 125, 58, 183, 128, 61, 180, 119, 51, 162, 112, 49, 70, 39, 11, 70, 41, 19, 169, 114, 42, 151, 98, 35, 131, 76, 18, 130, 79, 19, 97, 56, 13, 149, 98, 38, 158, 104, 36, 156, 99, 28, 156, 102, 35, 142, 93, 31, 167, 110, 42, 173, 122, 51, 180, 125, 54, 185, 124, 54, 188, + 135, 65, 192, 138, 72, 204, 151, 83, 198, 143, 73, 150, 92, 31, 167, 111, 46, 185, 127, 57, 176, 122, 56, 188, 131, 62, 188, 131, 61, 179, 124, 55, 184, 125, 56, 159, 102, 42, 159, 102, 40, 185, 129, 61, 193, 133, 59, 197, 135, 63, 200, 149, 81, 151, 97, 41, 192, 133, 63, 177, 122, 55, 163, 100, 32, 205, 146, 70, 193, 137, 66, 159, 104, 43, 178, 120, 56, 173, 112, 46, 193, 136, 68, 205, 142, 66, 199, 138, 63, 215, 157, 81, 213, 157, 83, 202, 142, 69, 194, 130, 56, 192, 135, 65, 200, 139, 62, 221, 160, 76, 205, 139, 59, 205, 144, 64, 184, 122, 57, 176, 120, 59, 170, 111, 51, 190, 129, 61, 196, 132, 56, 200, 134, 63, 204, 140, 64, 199, 135, 62, 199, 134, 56, 202, 135, 59, 209, 149, 73, 209, 147, 72, 211, 152, 80, 199, 141, 68, 206, 152, + 78, 191, 130, 58, 199, 139, 63, 191, 131, 57, 184, 119, 45, 184, 115, 41, 177, 106, 39, 175, 105, 30, 177, 107, 39, 184, 111, 38, 188, 117, 44, 183, 113, 41, 194, 124, 51, 171, 101, 30, 199, 133, 63, 207, 143, 72, 178, 107, 37, 194, 121, 45, 202, 132, 60, 165, 98, 37, 161, 90, 28, 154, 82, 18, 179, 111, 42, 195, 126, 51, 194, 125, 53, 169, 98, 33, 180, 113, 43, 191, 127, 55, 166, 102, 42, 166, 106, 45, 164, 113, 50, 129, 93, 41, 96, 77, 27, 75, 68, 14, 66, 74, 34, 54, 70, 58, 51, 72, 49, 55, 75, 22, 43, 65, 27, 51, 95, 102, 69, 125, 149, 82, 116, 111, 83, 88, 31, 86, 88, 29, 78, 78, 17, 69, 75, 24, 67, 76, 45, 79, 95, 68, 86, 103, 60, 86, 100, 14, 91, 97, 6, 104, 108, 8, 111, 117, 16, 96, 93, 8, + 64, 60, 9, 50, 51, 6, 120, 102, 43, 88, 79, 18, 70, 71, 16, 105, 95, 34, 58, 51, 10, 35, 36, 2, 55, 56, 17, 51, 54, 5, 79, 78, 8, 109, 112, 7, 87, 96, 1, 84, 96, 70, 131, 129, 98, 134, 122, 69, 129, 126, 87, 86, 90, 75, 64, 60, 43, 40, 29, 17, 78, 56, 27, 107, 73, 32, 155, 110, 50, 197, 142, 65, 159, 110, 43, 69, 37, 5, 86, 48, 16, 146, 98, 46, 158, 115, 54, 183, 131, 59, 177, 122, 52, 165, 106, 36, 150, 92, 31, 190, 136, 68, 182, 126, 60, 179, 120, 54, 136, 88, 37, 60, 27, 2, 117, 71, 24, 151, 100, 33, 132, 81, 24, 138, 81, 23, 123, 77, 27, 89, 52, 15, 127, 81, 24, 156, 101, 33, 159, 105, 36, 133, 81, 27, 157, 106, 42, 158, 100, 37, 163, 108, 40, 173, 118, 48, 187, 130, 59, 195, + 140, 66, 195, 141, 69, 201, 149, 75, 190, 133, 64, 155, 95, 32, 172, 113, 47, 187, 129, 58, 178, 122, 53, 189, 135, 65, 197, 143, 68, 187, 132, 64, 173, 112, 45, 170, 113, 43, 165, 104, 37, 196, 143, 72, 204, 148, 82, 195, 137, 67, 200, 150, 89, 164, 107, 49, 187, 121, 49, 178, 119, 54, 166, 106, 44, 203, 141, 66, 178, 123, 56, 152, 95, 40, 159, 94, 28, 192, 137, 67, 185, 129, 60, 192, 128, 52, 193, 135, 70, 223, 168, 91, 212, 153, 79, 208, 145, 71, 181, 121, 55, 163, 102, 37, 208, 146, 68, 216, 153, 66, 210, 145, 67, 208, 145, 68, 189, 130, 60, 192, 137, 71, 168, 113, 53, 186, 127, 59, 199, 136, 61, 197, 132, 61, 201, 133, 58, 202, 137, 68, 195, 129, 53, 202, 134, 61, 205, 142, 64, 207, 146, 71, 211, 149, 74, 199, 138, 65, 211, 154, + 81, 195, 135, 62, 198, 135, 57, 185, 124, 51, 181, 115, 41, 177, 103, 29, 183, 112, 42, 163, 88, 18, 190, 120, 46, 173, 102, 27, 186, 114, 39, 191, 126, 51, 199, 130, 53, 189, 122, 58, 199, 133, 61, 196, 124, 54, 197, 128, 57, 186, 112, 34, 211, 144, 65, 192, 128, 62, 157, 87, 30, 157, 89, 27, 166, 99, 35, 169, 104, 39, 190, 121, 46, 162, 93, 32, 166, 97, 31, 192, 125, 50, 191, 131, 58, 156, 100, 41, 160, 114, 57, 133, 98, 42, 87, 73, 24, 76, 71, 17, 71, 79, 32, 67, 82, 62, 56, 76, 54, 51, 73, 21, 44, 67, 7, 41, 67, 28, 59, 97, 62, 73, 100, 43, 79, 88, 14, 70, 79, 8, 65, 67, 6, 47, 55, 6, 40, 58, 31, 50, 71, 35, 54, 67, 7, 56, 65, 0, 62, 70, 0, 78, 84, 0, 85, 92, 3, 80, 79, 4, + 59, 60, 4, 48, 55, 12, 135, 107, 52, 110, 96, 29, 59, 69, 5, 79, 82, 22, 91, 84, 34, 44, 50, 16, 42, 45, 7, 32, 38, 5, 65, 69, 8, 114, 117, 4, 81, 89, 0, 50, 60, 32, 123, 128, 122, 118, 126, 124, 95, 95, 68, 93, 86, 29, 51, 46, 20, 71, 52, 28, 117, 84, 39, 148, 107, 48, 184, 130, 59, 148, 100, 41, 75, 43, 12, 41, 19, 6, 90, 55, 18, 149, 107, 50, 150, 103, 45, 177, 124, 51, 176, 120, 51, 140, 88, 30, 154, 98, 44, 188, 134, 63, 184, 127, 57, 182, 126, 58, 103, 61, 18, 92, 51, 13, 141, 92, 37, 147, 97, 39, 141, 87, 29, 140, 85, 23, 112, 68, 25, 85, 45, 10, 110, 64, 18, 153, 99, 34, 143, 90, 26, 135, 85, 28, 158, 105, 40, 163, 107, 39, 147, 94, 30, 160, 105, 38, 184, 126, 56, 194, + 137, 65, 195, 140, 69, 198, 142, 70, 197, 142, 72, 166, 106, 41, 174, 117, 48, 172, 118, 50, 177, 121, 54, 192, 136, 63, 188, 131, 61, 164, 104, 41, 183, 127, 58, 165, 105, 36, 186, 127, 58, 201, 147, 78, 193, 141, 71, 189, 130, 61, 189, 132, 67, 158, 103, 44, 179, 120, 48, 193, 131, 59, 175, 110, 37, 205, 142, 64, 199, 138, 66, 164, 100, 40, 166, 94, 26, 209, 150, 77, 192, 128, 58, 198, 128, 54, 212, 152, 80, 228, 174, 98, 216, 155, 79, 201, 139, 66, 191, 136, 69, 168, 111, 47, 197, 135, 58, 205, 144, 63, 213, 148, 69, 201, 140, 64, 199, 140, 67, 191, 136, 64, 160, 102, 41, 193, 132, 59, 195, 130, 55, 193, 127, 51, 201, 135, 59, 197, 130, 57, 196, 131, 55, 201, 137, 63, 202, 137, 58, 208, 148, 69, 203, 141, 65, 200, 137, 63, 209, 153, + 79, 196, 134, 60, 198, 133, 57, 186, 124, 52, 169, 99, 27, 187, 117, 41, 191, 123, 48, 170, 97, 28, 186, 114, 37, 195, 126, 48, 190, 116, 40, 199, 129, 49, 204, 135, 55, 196, 129, 55, 195, 125, 52, 205, 135, 61, 198, 128, 57, 190, 114, 38, 209, 140, 62, 214, 145, 68, 179, 115, 54, 141, 72, 22, 162, 91, 29, 163, 97, 34, 170, 106, 42, 184, 119, 48, 159, 92, 31, 175, 110, 44, 183, 119, 51, 163, 109, 46, 150, 102, 43, 132, 94, 35, 73, 59, 14, 67, 64, 12, 67, 70, 11, 63, 75, 24, 50, 71, 23, 51, 70, 10, 47, 66, 2, 42, 61, 0, 47, 67, 0, 56, 75, 0, 61, 75, 4, 53, 63, 3, 39, 46, 2, 23, 39, 0, 25, 47, 4, 33, 57, 15, 48, 60, 0, 60, 68, 4, 59, 66, 1, 48, 59, 0, 47, 56, 0, 49, 50, 1, + 57, 58, 3, 50, 53, 12, 126, 107, 44, 124, 107, 47, 123, 111, 44, 84, 79, 21, 87, 79, 21, 44, 50, 14, 20, 31, 8, 15, 22, 7, 35, 38, 6, 96, 104, 23, 84, 90, 29, 46, 47, 15, 87, 86, 69, 75, 81, 75, 94, 90, 43, 118, 117, 58, 40, 35, 15, 104, 74, 32, 148, 107, 52, 194, 142, 71, 121, 78, 26, 59, 36, 8, 37, 21, 3, 51, 31, 11, 101, 60, 24, 145, 102, 46, 136, 89, 38, 174, 121, 49, 159, 105, 41, 138, 88, 30, 159, 104, 48, 187, 130, 59, 189, 131, 61, 157, 107, 41, 92, 50, 16, 111, 66, 22, 111, 64, 23, 150, 98, 34, 154, 97, 36, 146, 94, 35, 96, 53, 11, 112, 62, 19, 116, 69, 20, 131, 83, 26, 132, 83, 28, 130, 81, 25, 157, 97, 35, 154, 101, 35, 151, 98, 31, 162, 101, 43, 181, 124, 52, 189, + 132, 66, 199, 142, 68, 200, 143, 72, 198, 144, 70, 165, 104, 36, 176, 120, 50, 148, 97, 34, 174, 115, 43, 187, 127, 52, 172, 115, 49, 155, 97, 39, 192, 135, 65, 178, 121, 53, 197, 143, 74, 193, 140, 73, 191, 134, 67, 194, 134, 63, 172, 114, 54, 144, 93, 43, 172, 114, 44, 188, 125, 53, 175, 109, 38, 204, 139, 62, 209, 145, 65, 174, 110, 44, 163, 96, 28, 194, 131, 54, 204, 138, 63, 190, 125, 51, 212, 159, 83, 225, 175, 103, 192, 133, 64, 206, 151, 77, 188, 131, 69, 187, 122, 51, 197, 131, 55, 199, 130, 53, 197, 128, 51, 214, 153, 75, 197, 138, 64, 196, 139, 66, 157, 97, 34, 190, 129, 55, 193, 127, 53, 201, 135, 61, 204, 139, 62, 197, 131, 57, 197, 130, 54, 194, 129, 54, 201, 132, 55, 203, 140, 58, 203, 142, 70, 198, 136, 59, 208, 148, + 70, 190, 127, 53, 196, 130, 55, 186, 121, 46, 174, 102, 33, 192, 122, 48, 191, 120, 48, 188, 115, 39, 187, 113, 39, 188, 113, 36, 197, 128, 50, 198, 125, 45, 206, 135, 53, 191, 124, 56, 194, 123, 53, 203, 132, 50, 206, 139, 62, 188, 108, 35, 200, 124, 42, 212, 138, 63, 203, 136, 59, 179, 115, 52, 150, 81, 22, 154, 86, 31, 173, 110, 47, 178, 110, 41, 181, 112, 48, 157, 94, 36, 169, 106, 46, 168, 114, 49, 143, 96, 37, 127, 92, 33, 99, 76, 26, 66, 60, 11, 54, 55, 6, 52, 61, 0, 54, 70, 4, 51, 66, 0, 51, 67, 0, 46, 63, 3, 44, 57, 0, 53, 68, 2, 53, 61, 2, 44, 50, 2, 33, 46, 4, 29, 48, 8, 27, 44, 2, 33, 48, 0, 61, 71, 9, 77, 81, 15, 56, 64, 3, 41, 53, 0, 33, 45, 2, 34, 38, 0, + 45, 51, 3, 45, 53, 7, 93, 85, 28, 52, 57, 2, 84, 84, 26, 101, 86, 34, 88, 78, 23, 41, 58, 20, 28, 50, 27, 22, 43, 35, 25, 27, 12, 77, 83, 36, 58, 67, 49, 25, 26, 12, 56, 52, 23, 130, 125, 69, 135, 132, 61, 85, 77, 21, 57, 43, 18, 107, 79, 34, 185, 135, 63, 126, 84, 28, 78, 50, 14, 46, 28, 7, 62, 39, 16, 64, 38, 9, 115, 76, 33, 104, 67, 21, 151, 102, 45, 174, 118, 49, 172, 122, 53, 147, 95, 37, 160, 111, 52, 188, 129, 58, 193, 134, 60, 171, 119, 51, 127, 82, 32, 118, 69, 24, 145, 90, 29, 164, 112, 46, 158, 100, 36, 125, 76, 23, 131, 85, 30, 137, 88, 34, 114, 67, 21, 114, 68, 20, 127, 80, 23, 115, 61, 11, 149, 88, 29, 153, 94, 35, 145, 88, 28, 157, 98, 35, 171, 112, 41, 176, + 119, 51, 201, 144, 68, 208, 155, 82, 195, 136, 63, 174, 109, 35, 174, 115, 47, 153, 98, 36, 183, 120, 51, 184, 126, 56, 150, 93, 33, 169, 107, 42, 197, 140, 67, 188, 133, 66, 202, 149, 79, 191, 135, 67, 185, 123, 57, 196, 137, 68, 167, 113, 53, 150, 94, 37, 171, 111, 44, 190, 127, 55, 180, 117, 48, 193, 124, 54, 207, 142, 66, 189, 121, 46, 161, 92, 22, 184, 118, 47, 195, 126, 55, 192, 132, 67, 214, 155, 84, 218, 162, 92, 206, 146, 73, 202, 147, 74, 174, 123, 62, 174, 106, 44, 204, 139, 63, 213, 148, 72, 194, 122, 44, 213, 147, 70, 198, 136, 62, 209, 154, 76, 169, 108, 47, 190, 124, 54, 198, 132, 59, 198, 131, 56, 202, 134, 56, 201, 136, 59, 205, 140, 63, 197, 132, 57, 198, 131, 58, 201, 135, 56, 206, 148, 74, 193, 132, 56, 204, 147, + 67, 188, 122, 48, 185, 117, 40, 183, 117, 44, 171, 100, 26, 188, 119, 43, 191, 124, 52, 186, 114, 42, 191, 121, 47, 179, 105, 32, 189, 117, 41, 197, 127, 48, 203, 135, 55, 210, 142, 66, 189, 119, 51, 191, 121, 50, 205, 134, 53, 199, 129, 55, 184, 107, 29, 206, 133, 54, 208, 138, 65, 199, 139, 67, 170, 104, 38, 156, 92, 35, 158, 91, 30, 176, 113, 52, 178, 111, 40, 165, 102, 41, 160, 104, 40, 171, 118, 59, 167, 120, 55, 117, 86, 31, 99, 74, 21, 81, 70, 18, 50, 50, 12, 38, 51, 0, 46, 65, 0, 58, 76, 0, 65, 76, 5, 54, 70, 12, 56, 73, 19, 50, 70, 14, 51, 62, 4, 46, 59, 4, 50, 69, 38, 40, 59, 46, 39, 50, 20, 39, 46, 4, 47, 51, 3, 54, 54, 6, 43, 47, 3, 38, 44, 1, 37, 46, 2, 34, 40, 6, + 53, 54, 11, 59, 65, 14, 78, 75, 13, 74, 84, 15, 67, 77, 12, 72, 65, 16, 130, 109, 56, 45, 60, 11, 31, 53, 15, 21, 34, 12, 33, 34, 16, 39, 40, 14, 44, 45, 13, 66, 65, 27, 112, 106, 36, 125, 118, 49, 96, 93, 26, 33, 31, 10, 46, 39, 20, 130, 99, 53, 139, 97, 40, 122, 91, 45, 72, 47, 15, 62, 40, 16, 72, 44, 13, 86, 54, 17, 115, 78, 31, 97, 59, 22, 164, 107, 41, 165, 103, 34, 176, 128, 57, 141, 95, 42, 168, 121, 54, 183, 126, 55, 196, 134, 63, 173, 124, 60, 128, 78, 30, 119, 71, 23, 168, 110, 41, 168, 115, 44, 151, 92, 29, 139, 90, 35, 144, 93, 36, 148, 98, 44, 120, 70, 22, 130, 81, 26, 124, 77, 25, 126, 71, 19, 149, 92, 29, 125, 74, 24, 128, 77, 25, 164, 108, 41, 175, 116, 49, 165, + 107, 41, 197, 139, 64, 207, 152, 77, 195, 134, 61, 178, 111, 38, 168, 108, 40, 167, 108, 41, 179, 119, 46, 170, 114, 50, 156, 100, 38, 174, 117, 48, 199, 143, 71, 189, 132, 65, 193, 137, 64, 187, 130, 64, 183, 120, 52, 194, 138, 65, 165, 108, 51, 153, 94, 35, 176, 115, 47, 182, 119, 45, 179, 115, 41, 185, 117, 48, 202, 137, 60, 190, 121, 45, 168, 102, 37, 181, 119, 47, 185, 118, 48, 197, 134, 68, 212, 155, 84, 215, 152, 84, 211, 151, 78, 202, 146, 75, 165, 109, 48, 180, 115, 47, 191, 123, 50, 215, 150, 69, 196, 125, 48, 211, 146, 68, 196, 131, 53, 212, 151, 75, 178, 116, 54, 188, 123, 53, 197, 129, 56, 196, 130, 52, 198, 130, 51, 197, 130, 54, 202, 138, 60, 190, 126, 53, 190, 123, 51, 200, 132, 54, 206, 149, 71, 192, 127, 53, 204, 144, + 66, 187, 123, 49, 177, 105, 33, 186, 118, 44, 173, 101, 27, 185, 119, 48, 201, 135, 56, 181, 112, 44, 193, 123, 48, 180, 108, 36, 178, 107, 35, 191, 123, 47, 200, 134, 58, 213, 146, 65, 187, 122, 55, 191, 123, 54, 197, 125, 50, 205, 136, 59, 191, 124, 48, 188, 117, 40, 209, 137, 59, 200, 133, 59, 184, 121, 53, 156, 93, 38, 148, 78, 26, 163, 100, 38, 170, 103, 39, 176, 116, 50, 157, 97, 39, 165, 112, 55, 168, 117, 53, 142, 104, 40, 82, 68, 11, 81, 70, 11, 68, 64, 15, 46, 52, 7, 52, 66, 9, 55, 77, 17, 57, 79, 39, 56, 77, 60, 48, 70, 50, 42, 65, 16, 41, 55, 0, 44, 60, 7, 50, 65, 33, 43, 57, 23, 35, 45, 8, 24, 37, 0, 28, 41, 0, 35, 46, 0, 34, 46, 1, 30, 43, 1, 25, 35, 2, 26, 34, 3, + 74, 63, 15, 87, 78, 24, 87, 90, 41, 85, 98, 27, 46, 57, 0, 65, 65, 16, 145, 103, 37, 66, 60, 18, 53, 56, 21, 77, 76, 38, 92, 91, 37, 103, 103, 33, 111, 106, 29, 92, 89, 15, 79, 72, 15, 44, 41, 9, 35, 31, 3, 31, 29, 14, 53, 43, 27, 152, 108, 47, 130, 97, 49, 128, 91, 43, 75, 50, 20, 65, 43, 18, 93, 60, 24, 124, 83, 40, 96, 62, 23, 98, 57, 19, 167, 106, 41, 163, 103, 41, 169, 120, 57, 167, 118, 55, 167, 119, 57, 191, 132, 56, 202, 142, 71, 176, 130, 62, 141, 92, 32, 135, 79, 22, 188, 129, 50, 151, 97, 33, 125, 78, 26, 150, 100, 45, 168, 120, 56, 149, 99, 42, 142, 90, 33, 142, 90, 33, 128, 74, 19, 122, 69, 15, 148, 90, 33, 125, 78, 27, 116, 67, 21, 156, 98, 35, 159, 103, 44, 171, + 111, 43, 205, 146, 72, 203, 148, 73, 187, 130, 57, 178, 111, 34, 175, 117, 48, 183, 121, 49, 182, 123, 51, 161, 105, 43, 170, 112, 49, 165, 102, 38, 201, 142, 71, 190, 132, 65, 188, 129, 56, 195, 138, 67, 182, 118, 50, 205, 148, 75, 156, 104, 51, 155, 99, 37, 175, 114, 46, 169, 112, 47, 158, 99, 29, 189, 128, 55, 205, 143, 69, 190, 124, 48, 172, 106, 34, 193, 128, 61, 199, 132, 63, 190, 124, 58, 211, 158, 81, 200, 139, 68, 204, 144, 69, 217, 155, 82, 184, 122, 58, 182, 117, 47, 163, 96, 35, 220, 158, 84, 210, 142, 65, 213, 153, 73, 208, 146, 67, 202, 138, 59, 180, 119, 51, 183, 118, 47, 195, 130, 57, 195, 123, 49, 196, 128, 54, 191, 123, 45, 201, 136, 56, 193, 130, 54, 186, 118, 45, 197, 131, 55, 213, 153, 79, 190, 121, 49, 202, 142, + 61, 188, 125, 49, 174, 106, 34, 178, 108, 35, 170, 104, 30, 179, 112, 42, 203, 133, 61, 192, 122, 51, 202, 132, 61, 191, 120, 46, 166, 93, 26, 180, 112, 39, 192, 121, 48, 204, 139, 59, 200, 130, 54, 180, 110, 47, 197, 128, 58, 201, 128, 47, 190, 116, 43, 186, 122, 56, 189, 117, 44, 204, 139, 61, 198, 135, 65, 152, 94, 46, 127, 69, 24, 148, 80, 21, 167, 107, 46, 175, 117, 53, 160, 101, 41, 159, 100, 42, 168, 119, 59, 159, 113, 51, 121, 94, 32, 94, 79, 12, 64, 59, 6, 54, 62, 33, 57, 71, 45, 73, 86, 52, 50, 72, 61, 45, 76, 75, 46, 72, 57, 43, 57, 8, 47, 60, 5, 57, 71, 11, 61, 80, 19, 68, 84, 39, 46, 59, 18, 29, 40, 1, 24, 45, 0, 39, 63, 6, 47, 69, 15, 39, 57, 4, 28, 39, 6, 22, 34, 21, + 69, 64, 15, 88, 76, 19, 106, 94, 36, 111, 109, 54, 101, 101, 43, 93, 87, 27, 132, 112, 53, 118, 104, 47, 101, 95, 26, 121, 110, 33, 103, 95, 30, 63, 55, 0, 78, 71, 16, 38, 34, 0, 25, 21, 0, 20, 18, 0, 26, 24, 7, 31, 26, 14, 62, 47, 26, 125, 89, 47, 154, 115, 54, 118, 83, 33, 76, 50, 16, 97, 69, 28, 116, 76, 31, 103, 65, 24, 102, 65, 27, 137, 87, 35, 169, 111, 46, 132, 85, 29, 168, 121, 59, 169, 118, 50, 173, 121, 56, 190, 129, 53, 204, 143, 72, 176, 124, 53, 146, 91, 26, 162, 104, 36, 186, 127, 49, 141, 89, 26, 106, 65, 20, 152, 103, 49, 170, 121, 60, 157, 107, 45, 156, 101, 39, 136, 84, 25, 138, 81, 18, 118, 65, 15, 149, 95, 36, 123, 74, 27, 124, 71, 22, 155, 101, 39, 137, 88, 38, 169, + 111, 44, 200, 144, 71, 200, 139, 69, 192, 133, 66, 182, 115, 45, 182, 122, 51, 180, 118, 48, 178, 117, 46, 174, 118, 49, 138, 76, 20, 164, 104, 37, 194, 137, 66, 186, 129, 61, 199, 139, 64, 195, 137, 66, 189, 131, 59, 205, 144, 70, 170, 115, 52, 160, 98, 36, 179, 119, 50, 170, 113, 50, 163, 107, 48, 187, 125, 55, 206, 145, 73, 194, 129, 55, 190, 130, 59, 178, 108, 42, 202, 134, 63, 181, 113, 47, 210, 151, 78, 210, 147, 80, 202, 139, 66, 212, 150, 76, 197, 133, 61, 171, 108, 47, 153, 87, 31, 201, 140, 67, 214, 145, 72, 203, 136, 61, 210, 150, 69, 198, 135, 57, 191, 129, 61, 174, 112, 41, 197, 131, 57, 190, 118, 43, 197, 129, 53, 195, 125, 51, 197, 130, 52, 194, 130, 57, 190, 126, 49, 197, 130, 53, 203, 142, 68, 186, 120, 45, 197, 135, + 55, 180, 118, 46, 176, 110, 37, 182, 116, 43, 168, 104, 38, 187, 120, 46, 195, 127, 48, 199, 132, 60, 196, 127, 58, 189, 119, 48, 187, 117, 44, 175, 106, 40, 170, 105, 39, 189, 123, 53, 192, 127, 51, 174, 106, 40, 178, 104, 36, 191, 117, 39, 195, 123, 45, 183, 113, 37, 176, 111, 42, 183, 113, 43, 205, 138, 60, 191, 130, 63, 153, 96, 48, 119, 58, 16, 145, 79, 24, 170, 106, 44, 166, 104, 47, 151, 91, 32, 154, 103, 46, 153, 104, 43, 149, 111, 49, 111, 91, 26, 83, 72, 22, 68, 70, 37, 73, 80, 42, 115, 117, 44, 67, 70, 19, 49, 51, 6, 46, 51, 8, 45, 56, 5, 61, 81, 34, 71, 96, 59, 79, 105, 69, 74, 97, 66, 68, 80, 52, 59, 74, 45, 54, 72, 24, 49, 72, 36, 51, 74, 49, 49, 66, 34, 36, 48, 19, 37, 49, 12, + 94, 90, 26, 84, 79, 22, 65, 59, 7, 100, 83, 25, 137, 122, 62, 130, 120, 57, 121, 103, 42, 113, 88, 33, 45, 37, 4, 25, 20, 0, 13, 9, 0, 14, 13, 0, 47, 41, 13, 46, 42, 13, 15, 16, 1, 28, 37, 6, 27, 31, 14, 34, 28, 14, 56, 42, 20, 90, 62, 30, 150, 107, 49, 88, 56, 10, 100, 67, 27, 118, 73, 29, 109, 68, 26, 130, 89, 40, 92, 54, 21, 155, 106, 42, 163, 109, 41, 135, 91, 31, 151, 108, 46, 169, 120, 49, 169, 117, 54, 186, 128, 52, 199, 145, 72, 173, 119, 53, 162, 104, 36, 177, 118, 44, 163, 109, 36, 131, 80, 25, 117, 74, 31, 177, 127, 66, 185, 138, 72, 179, 124, 55, 169, 116, 50, 152, 94, 33, 147, 89, 25, 120, 67, 16, 150, 98, 38, 137, 89, 36, 121, 71, 21, 144, 88, 31, 121, 75, 25, 177, + 124, 57, 197, 143, 69, 198, 139, 66, 198, 139, 70, 187, 127, 53, 181, 118, 45, 172, 109, 40, 182, 118, 52, 161, 100, 33, 135, 73, 19, 166, 103, 41, 190, 130, 59, 189, 130, 60, 205, 146, 74, 197, 137, 66, 199, 140, 66, 199, 137, 58, 185, 126, 61, 156, 94, 31, 192, 138, 66, 173, 114, 50, 168, 109, 47, 189, 132, 62, 203, 144, 71, 190, 129, 59, 189, 126, 57, 171, 99, 31, 190, 122, 52, 191, 125, 57, 203, 140, 67, 199, 136, 66, 191, 127, 55, 203, 134, 56, 201, 137, 63, 193, 133, 61, 140, 77, 21, 174, 108, 44, 209, 141, 66, 202, 132, 56, 211, 149, 71, 192, 126, 51, 193, 129, 58, 164, 101, 33, 191, 128, 52, 192, 122, 46, 194, 129, 51, 196, 129, 50, 198, 128, 48, 197, 135, 62, 186, 123, 46, 194, 130, 50, 190, 130, 58, 190, 128, 52, 195, 132, + 56, 183, 122, 56, 167, 101, 32, 187, 119, 44, 159, 91, 26, 187, 118, 42, 187, 120, 47, 189, 122, 53, 183, 114, 46, 192, 127, 58, 184, 115, 48, 186, 121, 54, 153, 92, 36, 179, 119, 54, 184, 120, 52, 171, 107, 43, 169, 98, 29, 172, 98, 24, 195, 125, 48, 178, 103, 30, 172, 101, 33, 175, 110, 46, 184, 116, 40, 189, 125, 51, 189, 123, 59, 148, 89, 40, 114, 55, 9, 153, 87, 27, 156, 90, 35, 154, 91, 36, 154, 93, 34, 151, 99, 38, 144, 94, 33, 130, 95, 36, 104, 82, 30, 78, 68, 16, 74, 66, 13, 111, 102, 37, 66, 64, 13, 42, 42, 0, 41, 43, 5, 46, 54, 23, 56, 73, 46, 66, 82, 62, 62, 79, 53, 68, 82, 52, 99, 106, 74, 103, 115, 101, 95, 106, 70, 54, 70, 38, 52, 64, 44, 45, 51, 22, 31, 39, 0, 39, 47, 0, + 93, 93, 40, 71, 72, 26, 69, 66, 19, 68, 68, 24, 61, 55, 6, 107, 94, 30, 94, 87, 38, 145, 124, 60, 110, 108, 44, 99, 100, 42, 91, 84, 36, 62, 57, 16, 39, 35, 5, 24, 22, 0, 22, 31, 2, 26, 44, 5, 26, 30, 13, 41, 32, 18, 35, 26, 10, 92, 72, 47, 153, 108, 46, 95, 60, 16, 130, 87, 37, 111, 69, 29, 100, 61, 22, 90, 57, 12, 83, 51, 19, 167, 111, 48, 162, 108, 42, 148, 99, 40, 141, 96, 37, 174, 124, 53, 172, 122, 52, 198, 139, 61, 204, 152, 77, 176, 121, 44, 182, 122, 49, 161, 101, 34, 157, 100, 38, 128, 76, 23, 131, 87, 34, 188, 131, 65, 188, 138, 66, 179, 123, 51, 133, 83, 27, 162, 104, 37, 125, 71, 15, 132, 78, 21, 154, 98, 36, 147, 101, 45, 143, 91, 38, 134, 78, 22, 123, 73, 24, 159, + 115, 57, 192, 137, 64, 176, 121, 53, 180, 120, 52, 184, 121, 47, 173, 111, 40, 176, 111, 41, 167, 110, 44, 152, 93, 32, 143, 78, 17, 162, 97, 36, 182, 124, 53, 194, 135, 65, 208, 149, 76, 194, 135, 62, 204, 145, 73, 198, 136, 59, 189, 130, 58, 158, 92, 29, 194, 135, 63, 172, 111, 47, 180, 120, 58, 192, 133, 63, 197, 131, 57, 184, 122, 55, 189, 127, 58, 178, 107, 38, 171, 105, 40, 169, 100, 34, 206, 137, 65, 200, 135, 62, 192, 128, 54, 188, 122, 43, 198, 131, 57, 197, 134, 59, 161, 97, 34, 177, 111, 44, 195, 129, 54, 198, 132, 57, 201, 137, 63, 198, 129, 54, 193, 131, 61, 142, 79, 22, 187, 122, 51, 196, 125, 51, 186, 115, 38, 192, 126, 49, 198, 129, 51, 192, 129, 58, 186, 120, 47, 193, 128, 51, 193, 133, 60, 193, 133, 57, 193, 129, + 59, 170, 107, 43, 166, 101, 36, 186, 117, 42, 150, 78, 15, 181, 109, 40, 186, 117, 42, 181, 111, 39, 176, 105, 38, 186, 117, 46, 178, 112, 44, 164, 99, 40, 180, 117, 54, 149, 86, 34, 175, 115, 56, 174, 110, 44, 158, 87, 25, 159, 87, 21, 182, 112, 39, 190, 120, 45, 174, 104, 32, 164, 98, 34, 169, 104, 37, 173, 104, 38, 184, 117, 46, 171, 114, 56, 142, 87, 40, 123, 63, 18, 140, 83, 33, 136, 72, 22, 141, 79, 25, 142, 88, 31, 128, 81, 29, 124, 88, 29, 120, 89, 27, 107, 84, 27, 81, 67, 14, 92, 98, 66, 59, 59, 20, 51, 50, 5, 50, 50, 3, 44, 53, 4, 53, 64, 15, 52, 61, 19, 43, 51, 15, 73, 77, 42, 110, 117, 97, 129, 139, 132, 104, 108, 80, 65, 68, 36, 55, 59, 17, 43, 49, 7, 32, 36, 0, 28, 31, 0, + 88, 84, 33, 56, 55, 8, 36, 33, 2, 49, 46, 8, 36, 34, 5, 46, 43, 9, 85, 84, 13, 104, 92, 32, 34, 28, 4, 69, 68, 17, 90, 98, 20, 99, 106, 28, 108, 109, 45, 109, 107, 45, 103, 100, 40, 70, 72, 28, 29, 28, 15, 60, 49, 28, 48, 36, 20, 78, 55, 30, 125, 82, 34, 126, 86, 33, 106, 67, 21, 104, 66, 28, 98, 61, 22, 81, 45, 9, 109, 67, 28, 166, 110, 48, 156, 106, 39, 128, 82, 25, 145, 93, 37, 179, 127, 54, 193, 138, 65, 202, 146, 67, 203, 145, 64, 188, 131, 55, 173, 111, 38, 162, 99, 33, 160, 106, 40, 135, 83, 25, 148, 101, 38, 197, 144, 73, 191, 135, 62, 177, 120, 49, 139, 82, 27, 163, 107, 38, 137, 82, 27, 148, 93, 30, 137, 83, 24, 154, 102, 47, 148, 97, 35, 128, 71, 17, 104, 53, 11, 154, + 106, 49, 186, 136, 72, 195, 138, 72, 169, 113, 48, 184, 127, 53, 170, 104, 36, 174, 107, 36, 157, 100, 37, 144, 85, 28, 145, 81, 23, 164, 100, 38, 175, 113, 43, 198, 138, 66, 211, 152, 80, 199, 139, 66, 192, 132, 59, 202, 140, 63, 194, 137, 70, 149, 90, 30, 175, 114, 42, 187, 124, 51, 189, 124, 51, 182, 117, 47, 184, 120, 52, 183, 122, 51, 178, 119, 51, 183, 109, 39, 174, 107, 38, 151, 85, 23, 198, 129, 56, 205, 138, 67, 189, 120, 47, 192, 127, 56, 186, 118, 45, 186, 120, 46, 182, 116, 46, 165, 101, 40, 191, 123, 53, 190, 123, 52, 198, 134, 61, 197, 129, 52, 193, 127, 56, 139, 79, 21, 159, 94, 30, 196, 127, 52, 192, 124, 48, 186, 116, 43, 195, 126, 51, 197, 135, 64, 192, 127, 52, 194, 129, 56, 192, 125, 57, 190, 126, 52, 188, 124, + 50, 162, 99, 35, 160, 92, 27, 171, 101, 29, 163, 92, 25, 173, 106, 37, 189, 118, 43, 180, 107, 37, 152, 84, 20, 161, 95, 28, 184, 118, 50, 174, 113, 48, 170, 107, 47, 148, 87, 30, 156, 95, 37, 165, 101, 43, 164, 94, 29, 151, 78, 15, 165, 92, 24, 180, 109, 33, 179, 109, 38, 176, 109, 41, 163, 94, 34, 162, 99, 36, 169, 105, 41, 164, 103, 41, 144, 89, 42, 138, 81, 34, 137, 74, 23, 129, 71, 27, 114, 54, 13, 134, 73, 21, 131, 80, 30, 124, 76, 26, 125, 90, 28, 105, 81, 23, 99, 78, 23, 99, 96, 49, 63, 63, 24, 44, 48, 14, 42, 47, 5, 43, 51, 0, 53, 62, 1, 57, 63, 3, 49, 58, 5, 76, 75, 23, 88, 88, 53, 92, 96, 70, 87, 88, 59, 85, 82, 37, 76, 78, 33, 52, 54, 14, 35, 41, 2, 27, 35, 0, + 81, 76, 16, 76, 75, 15, 61, 64, 8, 73, 71, 18, 73, 73, 15, 87, 92, 23, 87, 94, 24, 70, 74, 7, 85, 84, 16, 118, 115, 48, 106, 117, 41, 80, 97, 20, 91, 99, 25, 91, 95, 27, 88, 96, 59, 54, 59, 37, 41, 37, 20, 59, 43, 23, 37, 26, 15, 67, 42, 18, 82, 52, 17, 102, 68, 24, 105, 66, 25, 108, 71, 30, 89, 53, 12, 80, 47, 10, 134, 88, 41, 156, 104, 40, 135, 86, 30, 120, 72, 19, 150, 99, 43, 187, 132, 57, 200, 144, 64, 205, 149, 70, 181, 126, 52, 183, 122, 44, 163, 104, 35, 167, 106, 37, 165, 108, 34, 146, 93, 30, 162, 108, 45, 197, 140, 67, 197, 138, 59, 169, 110, 35, 154, 98, 43, 155, 99, 34, 142, 90, 31, 155, 99, 32, 144, 90, 27, 146, 96, 44, 143, 91, 31, 128, 75, 24, 100, 52, 9, 144, + 94, 41, 169, 119, 60, 190, 142, 75, 147, 93, 36, 193, 139, 66, 175, 111, 41, 174, 108, 33, 166, 103, 40, 146, 86, 28, 145, 84, 29, 162, 97, 35, 179, 112, 43, 180, 119, 50, 203, 143, 69, 201, 140, 71, 185, 122, 53, 204, 140, 65, 204, 147, 75, 141, 89, 29, 170, 108, 39, 175, 109, 40, 180, 110, 40, 177, 112, 41, 175, 112, 41, 183, 120, 47, 174, 112, 43, 180, 108, 40, 188, 121, 47, 159, 90, 26, 183, 111, 40, 204, 137, 66, 189, 117, 43, 191, 126, 51, 177, 112, 38, 200, 138, 65, 180, 112, 40, 168, 105, 42, 191, 128, 55, 182, 116, 44, 191, 129, 58, 198, 133, 56, 199, 134, 64, 147, 83, 32, 155, 96, 37, 190, 122, 49, 196, 132, 56, 181, 110, 34, 180, 106, 33, 192, 129, 55, 191, 128, 61, 197, 135, 60, 195, 132, 61, 182, 112, 40, 187, 118, + 40, 163, 97, 33, 165, 94, 25, 162, 93, 25, 166, 98, 26, 154, 83, 18, 185, 108, 33, 166, 94, 26, 149, 83, 24, 133, 68, 13, 163, 102, 38, 178, 111, 37, 171, 105, 37, 169, 106, 42, 154, 87, 23, 159, 95, 42, 164, 95, 35, 144, 71, 8, 157, 83, 17, 176, 104, 32, 176, 105, 37, 183, 118, 47, 181, 113, 43, 172, 108, 42, 169, 106, 43, 169, 110, 49, 164, 107, 47, 138, 88, 38, 127, 76, 34, 113, 56, 15, 116, 56, 21, 114, 52, 13, 128, 70, 21, 132, 84, 30, 134, 92, 39, 108, 76, 26, 105, 81, 25, 108, 104, 63, 71, 71, 43, 47, 57, 40, 43, 45, 9, 40, 43, 4, 56, 57, 6, 58, 61, 0, 55, 67, 0, 60, 66, 4, 60, 59, 8, 72, 69, 28, 97, 101, 84, 113, 114, 82, 99, 110, 96, 71, 79, 59, 42, 41, 3, 35, 41, 0, + 28, 26, 0, 29, 29, 1, 29, 29, 0, 33, 36, 3, 48, 64, 3, 69, 90, 13, 64, 88, 15, 71, 75, 13, 32, 49, 1, 85, 85, 24, 108, 103, 37, 98, 96, 34, 95, 98, 26, 44, 58, 7, 55, 69, 37, 74, 79, 64, 39, 31, 17, 61, 45, 25, 29, 18, 6, 52, 32, 15, 78, 50, 22, 100, 63, 20, 105, 61, 22, 97, 57, 18, 97, 60, 18, 88, 53, 18, 138, 90, 40, 155, 107, 45, 138, 88, 30, 92, 52, 14, 146, 93, 33, 175, 119, 49, 197, 140, 64, 192, 138, 64, 177, 121, 48, 166, 106, 34, 184, 121, 47, 172, 112, 41, 163, 103, 36, 145, 89, 32, 172, 119, 54, 197, 140, 64, 188, 124, 47, 171, 111, 40, 156, 100, 34, 140, 83, 24, 143, 82, 19, 154, 96, 31, 140, 88, 28, 128, 81, 35, 154, 101, 37, 94, 56, 27, 116, 66, 18, 137, + 83, 29, 153, 98, 44, 194, 142, 76, 157, 107, 47, 178, 119, 51, 172, 103, 34, 199, 136, 60, 164, 103, 37, 148, 85, 32, 157, 94, 35, 174, 111, 45, 174, 108, 44, 173, 105, 39, 186, 123, 51, 195, 134, 62, 188, 125, 50, 203, 138, 63, 204, 146, 73, 158, 98, 36, 151, 90, 28, 156, 90, 26, 163, 94, 28, 173, 106, 40, 174, 106, 35, 189, 126, 54, 187, 123, 51, 181, 110, 40, 192, 121, 50, 170, 98, 27, 176, 106, 35, 201, 135, 59, 184, 116, 41, 186, 117, 44, 185, 119, 46, 193, 126, 54, 184, 117, 45, 196, 133, 60, 190, 125, 56, 191, 126, 56, 194, 130, 58, 197, 130, 55, 203, 142, 67, 146, 82, 27, 146, 83, 24, 180, 109, 40, 188, 123, 52, 187, 119, 45, 175, 103, 30, 186, 122, 48, 181, 119, 49, 187, 124, 50, 193, 130, 54, 181, 111, 35, 180, 109, + 36, 167, 96, 34, 160, 88, 25, 172, 102, 32, 146, 76, 16, 151, 80, 17, 174, 104, 31, 171, 100, 30, 149, 82, 19, 129, 64, 10, 130, 68, 19, 153, 87, 26, 157, 88, 26, 158, 92, 33, 145, 78, 23, 136, 72, 14, 160, 89, 27, 142, 74, 18, 150, 80, 16, 173, 97, 25, 175, 101, 32, 180, 105, 36, 176, 106, 38, 170, 101, 36, 166, 101, 32, 174, 113, 47, 174, 112, 49, 157, 97, 40, 121, 68, 27, 120, 66, 29, 81, 33, 8, 104, 49, 14, 108, 52, 19, 112, 65, 22, 107, 71, 23, 120, 82, 40, 100, 72, 37, 99, 85, 57, 65, 83, 81, 57, 66, 45, 36, 35, 0, 43, 40, 1, 57, 51, 0, 59, 58, 0, 60, 71, 8, 63, 78, 7, 54, 59, 3, 62, 59, 14, 101, 99, 54, 112, 116, 86, 104, 119, 97, 74, 79, 36, 42, 41, 3, 37, 36, 0, + 31, 39, 1, 47, 62, 3, 58, 69, 5, 47, 56, 0, 57, 75, 3, 67, 90, 7, 74, 105, 32, 64, 76, 13, 19, 41, 0, 72, 78, 32, 69, 65, 24, 98, 90, 15, 130, 122, 51, 84, 87, 42, 47, 60, 14, 39, 47, 15, 41, 33, 21, 58, 38, 16, 29, 19, 3, 73, 44, 17, 77, 48, 15, 75, 44, 12, 93, 55, 19, 123, 79, 31, 101, 63, 21, 104, 60, 22, 154, 103, 42, 150, 97, 35, 136, 89, 32, 110, 65, 24, 134, 86, 34, 168, 112, 51, 190, 134, 56, 186, 134, 54, 167, 107, 39, 184, 120, 46, 175, 110, 43, 165, 105, 35, 169, 107, 41, 136, 82, 28, 195, 136, 64, 194, 134, 56, 181, 123, 50, 171, 114, 43, 150, 94, 34, 125, 68, 11, 142, 83, 16, 163, 103, 41, 154, 96, 33, 117, 75, 26, 159, 108, 44, 102, 58, 17, 137, 83, 25, 136, + 81, 36, 158, 102, 49, 161, 114, 63, 162, 109, 49, 163, 101, 38, 179, 111, 43, 206, 140, 60, 178, 115, 46, 156, 97, 44, 167, 104, 38, 178, 116, 48, 173, 112, 45, 168, 103, 36, 182, 115, 42, 199, 136, 63, 179, 114, 41, 198, 133, 58, 199, 139, 66, 176, 116, 49, 147, 82, 26, 154, 96, 40, 168, 102, 34, 164, 95, 30, 192, 130, 56, 182, 114, 45, 164, 98, 31, 165, 101, 35, 183, 115, 46, 176, 105, 37, 179, 106, 39, 187, 118, 47, 179, 111, 39, 183, 116, 46, 198, 131, 55, 187, 119, 46, 190, 124, 51, 200, 136, 65, 181, 114, 50, 188, 124, 50, 183, 117, 48, 192, 124, 53, 202, 140, 67, 154, 91, 32, 150, 88, 26, 182, 115, 46, 173, 108, 41, 189, 123, 49, 174, 102, 32, 178, 114, 41, 178, 116, 43, 187, 125, 52, 189, 121, 41, 175, 106, 34, 175, 106, + 41, 167, 100, 38, 156, 87, 24, 178, 107, 35, 174, 109, 36, 156, 88, 21, 164, 96, 26, 162, 89, 26, 124, 58, 13, 112, 52, 11, 94, 38, 5, 102, 45, 13, 129, 68, 12, 149, 84, 21, 154, 89, 30, 142, 79, 20, 160, 88, 25, 159, 89, 27, 132, 65, 12, 153, 84, 19, 156, 84, 18, 167, 92, 23, 178, 107, 34, 168, 99, 29, 179, 114, 39, 166, 102, 37, 169, 106, 39, 178, 120, 57, 151, 93, 36, 133, 82, 37, 101, 57, 31, 67, 23, 4, 109, 59, 25, 102, 54, 26, 79, 47, 25, 97, 75, 57, 101, 87, 78, 104, 82, 58, 88, 91, 82, 72, 81, 62, 39, 42, 3, 42, 39, 0, 61, 50, 0, 68, 62, 0, 64, 70, 18, 69, 81, 13, 70, 73, 10, 61, 55, 0, 81, 79, 22, 86, 91, 51, 71, 75, 17, 44, 50, 3, 38, 40, 1, 37, 33, 0, + 50, 61, 6, 50, 67, 1, 50, 68, 0, 51, 61, 3, 69, 83, 3, 45, 60, 0, 63, 84, 17, 65, 97, 27, 39, 68, 3, 28, 47, 1, 81, 68, 9, 117, 94, 23, 86, 63, 3, 71, 63, 13, 108, 102, 19, 69, 67, 34, 22, 18, 6, 33, 21, 11, 24, 15, 4, 78, 49, 22, 72, 41, 14, 78, 49, 23, 109, 70, 31, 119, 77, 28, 105, 67, 26, 128, 76, 31, 144, 89, 32, 149, 96, 34, 116, 72, 24, 86, 45, 10, 124, 80, 36, 180, 127, 58, 187, 131, 53, 162, 110, 39, 178, 120, 48, 185, 124, 46, 145, 89, 29, 176, 115, 47, 158, 96, 29, 120, 71, 26, 193, 132, 61, 199, 137, 59, 193, 137, 60, 169, 110, 41, 161, 97, 29, 132, 79, 21, 144, 78, 15, 172, 108, 37, 151, 92, 32, 144, 92, 31, 158, 102, 35, 114, 62, 22, 134, 81, 29, 126, + 77, 26, 147, 91, 32, 132, 77, 31, 147, 98, 47, 150, 92, 32, 175, 117, 50, 193, 120, 46, 192, 125, 50, 167, 101, 33, 179, 119, 52, 185, 126, 59, 173, 109, 43, 153, 85, 23, 173, 101, 30, 189, 124, 52, 188, 127, 52, 191, 124, 53, 187, 126, 53, 192, 132, 62, 138, 75, 19, 137, 79, 25, 162, 96, 35, 174, 109, 41, 177, 110, 45, 158, 87, 22, 167, 100, 34, 155, 91, 28, 162, 93, 29, 179, 108, 37, 183, 113, 46, 188, 118, 45, 179, 112, 39, 173, 104, 30, 172, 107, 37, 176, 109, 38, 182, 113, 40, 195, 126, 59, 173, 106, 38, 192, 125, 56, 178, 110, 42, 190, 124, 49, 196, 133, 62, 165, 99, 38, 159, 94, 31, 184, 120, 51, 175, 107, 41, 185, 115, 41, 178, 108, 37, 176, 110, 39, 167, 103, 34, 184, 120, 44, 190, 124, 49, 169, 103, 36, 165, 102, + 37, 176, 113, 47, 171, 107, 46, 180, 112, 41, 186, 117, 46, 179, 113, 44, 168, 100, 35, 150, 79, 17, 146, 83, 26, 150, 93, 37, 144, 89, 34, 134, 74, 29, 121, 55, 11, 131, 61, 13, 142, 72, 18, 147, 79, 25, 142, 73, 16, 172, 99, 31, 176, 106, 37, 150, 84, 26, 139, 74, 18, 159, 87, 23, 157, 84, 21, 164, 94, 31, 173, 102, 32, 184, 117, 47, 172, 112, 43, 172, 111, 42, 179, 117, 53, 152, 94, 42, 130, 79, 41, 83, 37, 10, 84, 35, 11, 113, 64, 31, 88, 53, 34, 81, 75, 71, 94, 96, 104, 104, 88, 69, 99, 74, 46, 80, 71, 29, 42, 44, 3, 43, 41, 0, 65, 51, 0, 83, 70, 9, 81, 77, 22, 84, 89, 30, 78, 85, 17, 68, 69, 5, 62, 60, 7, 75, 74, 27, 66, 64, 10, 38, 44, 4, 24, 26, 0, 36, 30, 0, + 52, 63, 2, 48, 60, 0, 41, 54, 0, 68, 86, 17, 79, 102, 30, 39, 51, 0, 36, 42, 6, 64, 88, 27, 57, 83, 16, 51, 64, 5, 91, 73, 11, 147, 121, 48, 113, 88, 17, 45, 36, 0, 44, 39, 1, 49, 49, 2, 22, 19, 6, 30, 22, 5, 48, 32, 14, 77, 44, 13, 71, 43, 17, 95, 60, 32, 125, 83, 35, 138, 93, 41, 112, 70, 26, 137, 86, 33, 138, 83, 29, 142, 92, 37, 96, 56, 15, 67, 38, 13, 134, 88, 37, 179, 126, 55, 165, 112, 43, 166, 115, 46, 187, 130, 59, 178, 117, 44, 165, 109, 46, 171, 107, 40, 163, 101, 30, 119, 70, 26, 184, 124, 49, 195, 134, 56, 185, 130, 56, 170, 112, 46, 165, 102, 33, 134, 81, 24, 124, 68, 19, 171, 107, 37, 149, 92, 29, 166, 105, 41, 162, 104, 35, 131, 80, 27, 110, 59, 15, 139, + 84, 30, 118, 67, 19, 149, 82, 23, 146, 91, 39, 155, 98, 37, 170, 111, 42, 186, 122, 46, 176, 116, 44, 179, 108, 34, 188, 130, 58, 182, 123, 51, 163, 99, 33, 166, 95, 30, 179, 114, 42, 178, 115, 44, 187, 119, 45, 181, 113, 44, 194, 130, 55, 185, 122, 53, 160, 98, 37, 144, 84, 27, 146, 83, 24, 172, 112, 46, 143, 79, 17, 161, 90, 28, 168, 100, 33, 158, 92, 29, 141, 74, 13, 177, 105, 35, 184, 115, 45, 186, 116, 45, 180, 113, 43, 175, 110, 42, 167, 100, 34, 170, 103, 41, 164, 94, 28, 189, 123, 52, 180, 112, 42, 181, 112, 43, 172, 104, 36, 181, 112, 40, 194, 133, 58, 168, 104, 42, 163, 95, 32, 180, 118, 50, 161, 95, 29, 181, 111, 36, 181, 113, 40, 178, 114, 46, 171, 102, 34, 170, 101, 33, 187, 123, 48, 169, 102, 34, 189, 129, + 61, 213, 161, 93, 219, 164, 91, 217, 157, 84, 214, 152, 76, 207, 142, 68, 203, 140, 67, 199, 139, 65, 205, 151, 84, 211, 161, 92, 213, 160, 88, 212, 155, 83, 189, 127, 63, 164, 96, 39, 154, 84, 27, 165, 95, 34, 163, 94, 31, 166, 92, 26, 184, 110, 39, 183, 109, 35, 164, 92, 31, 138, 74, 17, 154, 87, 25, 153, 83, 23, 154, 80, 17, 174, 105, 37, 181, 114, 45, 170, 107, 43, 179, 115, 50, 157, 100, 41, 142, 80, 36, 97, 45, 13, 102, 51, 22, 105, 53, 24, 111, 69, 42, 87, 69, 56, 93, 80, 54, 98, 76, 41, 86, 60, 36, 91, 69, 30, 58, 48, 7, 38, 35, 3, 59, 52, 9, 76, 71, 38, 87, 84, 48, 77, 80, 47, 78, 85, 21, 63, 72, 6, 61, 63, 10, 82, 80, 26, 77, 75, 20, 38, 41, 10, 20, 20, 0, 46, 38, 0, + 36, 50, 0, 37, 54, 0, 46, 59, 1, 75, 97, 14, 75, 92, 13, 40, 46, 0, 30, 32, 0, 47, 57, 11, 70, 85, 31, 102, 95, 30, 87, 83, 20, 91, 83, 9, 130, 105, 15, 119, 100, 25, 94, 74, 3, 50, 50, 0, 22, 21, 6, 32, 22, 6, 69, 46, 23, 76, 44, 12, 81, 51, 22, 122, 82, 36, 136, 89, 35, 123, 76, 26, 118, 72, 28, 121, 69, 22, 141, 89, 40, 119, 70, 27, 78, 43, 13, 96, 60, 23, 151, 101, 41, 180, 130, 57, 161, 111, 45, 161, 113, 46, 197, 137, 61, 177, 118, 49, 174, 116, 45, 174, 114, 41, 159, 102, 41, 127, 76, 31, 181, 123, 52, 190, 130, 52, 188, 130, 60, 184, 121, 53, 173, 113, 45, 150, 93, 30, 150, 95, 37, 169, 107, 40, 150, 90, 25, 167, 104, 34, 184, 124, 57, 119, 67, 18, 111, 62, 20, 140, + 82, 29, 118, 64, 14, 175, 108, 29, 129, 67, 14, 148, 84, 24, 153, 88, 25, 192, 130, 53, 181, 116, 41, 166, 97, 31, 188, 130, 58, 190, 130, 59, 164, 99, 33, 171, 105, 36, 184, 119, 50, 182, 117, 46, 184, 115, 43, 172, 107, 36, 182, 125, 53, 182, 127, 58, 151, 93, 27, 148, 86, 26, 162, 95, 30, 150, 88, 28, 146, 81, 21, 141, 74, 16, 147, 86, 27, 138, 80, 25, 148, 76, 14, 165, 92, 26, 181, 111, 41, 191, 121, 51, 179, 112, 42, 178, 112, 41, 158, 95, 30, 136, 72, 13, 146, 79, 17, 160, 94, 30, 179, 112, 43, 168, 102, 34, 154, 83, 17, 165, 94, 29, 188, 119, 49, 183, 117, 51, 170, 106, 41, 165, 102, 37, 153, 84, 25, 183, 114, 39, 179, 112, 38, 165, 102, 35, 159, 93, 26, 166, 98, 31, 164, 99, 32, 191, 133, 67, 215, 160, + 86, 220, 158, 81, 223, 160, 83, 211, 145, 69, 203, 136, 58, 207, 135, 55, 203, 126, 47, 193, 114, 36, 191, 116, 41, 184, 109, 35, 183, 110, 36, 188, 118, 46, 196, 132, 62, 195, 127, 56, 178, 107, 40, 180, 109, 44, 173, 101, 34, 163, 89, 23, 182, 107, 34, 193, 119, 43, 203, 127, 51, 180, 112, 39, 146, 77, 17, 154, 82, 21, 148, 80, 18, 156, 87, 25, 183, 116, 47, 175, 105, 41, 160, 104, 42, 160, 104, 40, 152, 94, 43, 117, 63, 25, 102, 51, 22, 105, 51, 22, 90, 42, 15, 87, 63, 32, 89, 70, 32, 94, 91, 80, 79, 64, 45, 92, 67, 27, 77, 61, 16, 38, 38, 10, 40, 45, 34, 52, 57, 52, 66, 58, 23, 65, 55, 4, 74, 72, 0, 69, 77, 6, 75, 74, 8, 78, 72, 10, 70, 72, 14, 39, 40, 6, 29, 26, 0, 65, 53, 0, + 70, 69, 6, 44, 58, 0, 53, 78, 2, 55, 86, 0, 43, 59, 0, 37, 40, 0, 45, 39, 2, 36, 36, 3, 62, 70, 15, 92, 91, 23, 99, 97, 26, 105, 97, 16, 168, 136, 46, 180, 146, 64, 145, 117, 33, 70, 62, 0, 26, 19, 4, 43, 27, 13, 69, 41, 17, 77, 48, 18, 111, 72, 36, 131, 81, 31, 141, 93, 35, 113, 68, 18, 119, 71, 24, 147, 97, 40, 144, 97, 45, 102, 59, 20, 84, 51, 19, 115, 74, 30, 131, 84, 35, 159, 107, 39, 131, 87, 31, 164, 116, 48, 181, 123, 49, 171, 114, 48, 169, 111, 47, 177, 120, 52, 141, 86, 31, 110, 62, 22, 186, 128, 59, 183, 127, 49, 189, 129, 55, 191, 128, 55, 171, 112, 43, 153, 95, 36, 162, 111, 49, 168, 107, 39, 155, 93, 31, 163, 104, 37, 192, 132, 57, 142, 86, 28, 122, 75, 27, 126, + 70, 19, 126, 70, 21, 194, 126, 45, 156, 92, 28, 162, 94, 28, 153, 87, 21, 189, 123, 49, 160, 92, 27, 165, 102, 41, 196, 137, 66, 204, 144, 70, 170, 105, 41, 167, 103, 39, 170, 108, 40, 174, 106, 35, 180, 112, 39, 166, 100, 31, 189, 127, 57, 190, 130, 57, 132, 71, 17, 139, 82, 27, 146, 76, 15, 162, 95, 32, 140, 72, 17, 153, 87, 27, 152, 93, 36, 138, 82, 26, 134, 67, 12, 165, 93, 27, 177, 110, 42, 181, 109, 40, 181, 114, 42, 175, 107, 38, 167, 106, 42, 138, 72, 17, 128, 64, 9, 152, 87, 23, 171, 105, 36, 178, 110, 42, 158, 89, 26, 167, 96, 31, 182, 113, 44, 181, 114, 49, 166, 99, 35, 161, 93, 28, 154, 85, 25, 183, 116, 43, 172, 104, 30, 159, 92, 27, 162, 98, 33, 167, 100, 31, 186, 125, 55, 210, 155, 87, 219, 162, + 91, 221, 159, 81, 230, 165, 88, 225, 159, 77, 217, 148, 68, 210, 136, 53, 202, 124, 47, 203, 122, 45, 196, 111, 33, 187, 99, 17, 175, 91, 14, 172, 89, 14, 173, 100, 23, 184, 113, 44, 183, 111, 40, 181, 109, 39, 180, 101, 32, 173, 92, 27, 184, 105, 34, 196, 123, 43, 208, 135, 55, 206, 134, 56, 153, 87, 29, 134, 65, 9, 142, 75, 16, 142, 77, 20, 158, 93, 29, 168, 102, 35, 160, 97, 37, 156, 96, 38, 165, 107, 53, 131, 75, 30, 102, 53, 14, 111, 54, 21, 91, 38, 9, 95, 61, 21, 94, 69, 29, 79, 61, 33, 62, 46, 10, 79, 50, 14, 95, 73, 31, 68, 60, 29, 29, 33, 17, 23, 26, 10, 33, 27, 0, 57, 44, 0, 68, 61, 0, 80, 77, 11, 88, 86, 20, 89, 85, 19, 74, 78, 20, 72, 75, 17, 84, 84, 22, 95, 93, 28, + 145, 127, 40, 74, 68, 0, 37, 52, 0, 34, 62, 0, 26, 47, 0, 49, 49, 5, 76, 69, 21, 76, 67, 19, 52, 45, 4, 62, 61, 3, 48, 53, 0, 76, 69, 7, 151, 110, 27, 161, 126, 36, 125, 108, 20, 62, 57, 0, 29, 20, 4, 49, 32, 17, 78, 48, 21, 97, 63, 27, 91, 47, 16, 134, 84, 34, 114, 66, 14, 95, 49, 10, 133, 85, 29, 141, 95, 43, 131, 83, 33, 92, 52, 14, 131, 88, 44, 109, 63, 24, 131, 82, 33, 166, 112, 45, 134, 88, 29, 161, 110, 45, 175, 120, 43, 162, 108, 44, 182, 125, 60, 183, 124, 57, 143, 92, 31, 112, 66, 28, 191, 132, 63, 182, 123, 51, 189, 128, 52, 194, 131, 56, 150, 92, 32, 155, 102, 45, 159, 112, 56, 171, 113, 46, 160, 98, 34, 163, 104, 37, 188, 127, 56, 157, 103, 39, 153, 102, 42, 124, + 68, 17, 129, 79, 26, 197, 130, 45, 188, 121, 48, 158, 89, 26, 167, 96, 28, 180, 112, 41, 155, 83, 20, 175, 104, 31, 196, 128, 56, 216, 150, 72, 179, 116, 49, 179, 118, 53, 135, 72, 23, 171, 101, 28, 171, 97, 24, 176, 112, 41, 178, 113, 37, 184, 119, 48, 157, 93, 26, 137, 71, 11, 160, 92, 27, 178, 107, 39, 160, 95, 28, 163, 101, 35, 161, 103, 41, 157, 98, 37, 124, 66, 15, 154, 83, 16, 182, 114, 44, 163, 94, 25, 181, 112, 44, 186, 118, 52, 178, 112, 43, 145, 79, 19, 145, 82, 23, 159, 94, 27, 161, 97, 33, 187, 121, 48, 170, 104, 36, 175, 104, 35, 175, 106, 37, 182, 115, 45, 168, 103, 37, 157, 87, 26, 167, 94, 26, 184, 116, 42, 164, 98, 27, 138, 78, 21, 161, 98, 31, 171, 115, 53, 218, 167, 94, 224, 167, 91, 226, 166, + 89, 230, 166, 85, 232, 168, 87, 227, 162, 79, 221, 149, 66, 209, 130, 51, 208, 130, 52, 210, 130, 53, 202, 120, 46, 192, 103, 25, 178, 91, 11, 167, 83, 8, 167, 83, 9, 169, 87, 14, 177, 97, 23, 175, 97, 25, 178, 99, 28, 178, 93, 21, 179, 100, 26, 193, 117, 42, 204, 129, 52, 213, 138, 57, 201, 131, 55, 151, 83, 21, 154, 88, 28, 143, 82, 24, 152, 93, 33, 163, 101, 32, 170, 111, 43, 156, 93, 38, 168, 105, 47, 127, 73, 28, 119, 67, 26, 113, 59, 28, 101, 47, 18, 81, 51, 16, 71, 53, 16, 65, 51, 7, 58, 46, 0, 63, 43, 9, 97, 76, 41, 98, 80, 40, 59, 53, 27, 28, 28, 3, 38, 37, 2, 64, 57, 4, 79, 76, 24, 95, 95, 38, 110, 114, 51, 108, 110, 44, 93, 99, 30, 98, 100, 17, 128, 118, 24, 108, 90, 2, + 159, 136, 45, 95, 87, 5, 35, 50, 0, 17, 36, 0, 20, 30, 0, 36, 40, 4, 93, 83, 33, 101, 91, 42, 74, 65, 12, 64, 59, 6, 53, 49, 0, 62, 58, 4, 91, 81, 9, 80, 79, 3, 62, 67, 0, 42, 42, 0, 66, 44, 17, 74, 41, 17, 83, 47, 21, 88, 50, 19, 107, 62, 26, 116, 66, 21, 103, 55, 13, 93, 51, 13, 142, 93, 42, 147, 96, 44, 120, 75, 29, 133, 92, 41, 131, 88, 42, 106, 66, 24, 141, 91, 37, 150, 97, 37, 128, 82, 33, 162, 106, 41, 184, 128, 53, 158, 105, 45, 174, 120, 54, 180, 125, 61, 155, 106, 48, 123, 71, 24, 178, 122, 54, 185, 122, 53, 194, 135, 59, 192, 128, 52, 112, 66, 22, 145, 88, 34, 139, 95, 44, 168, 110, 46, 152, 96, 35, 162, 109, 44, 179, 123, 55, 175, 117, 50, 145, 91, 37, 161, + 105, 47, 151, 94, 32, 193, 130, 50, 191, 128, 52, 151, 87, 25, 168, 98, 29, 172, 103, 33, 184, 117, 46, 190, 127, 49, 180, 110, 36, 199, 130, 52, 190, 127, 52, 195, 133, 60, 151, 85, 27, 155, 80, 14, 171, 91, 17, 187, 117, 40, 170, 99, 29, 186, 112, 34, 192, 116, 41, 173, 98, 21, 191, 121, 44, 191, 124, 46, 179, 112, 38, 173, 106, 39, 179, 111, 37, 166, 100, 30, 126, 67, 16, 164, 96, 29, 175, 104, 37, 180, 110, 38, 169, 97, 30, 172, 100, 31, 187, 120, 46, 168, 97, 32, 154, 86, 25, 154, 88, 23, 141, 79, 20, 171, 104, 34, 187, 122, 49, 177, 108, 40, 169, 98, 28, 181, 116, 42, 170, 104, 38, 153, 86, 23, 165, 91, 23, 168, 101, 29, 166, 104, 37, 133, 74, 20, 164, 113, 53, 215, 165, 93, 220, 161, 83, 223, 160, 80, 231, 170, + 88, 229, 164, 83, 229, 162, 84, 224, 151, 70, 217, 145, 63, 208, 133, 53, 203, 127, 50, 203, 122, 43, 198, 116, 39, 189, 106, 30, 185, 99, 21, 182, 97, 21, 171, 89, 16, 164, 80, 6, 169, 87, 13, 165, 84, 15, 166, 83, 13, 173, 90, 15, 181, 99, 23, 194, 120, 39, 207, 137, 57, 207, 137, 57, 207, 134, 54, 180, 113, 42, 156, 89, 23, 165, 106, 42, 151, 98, 42, 135, 81, 31, 139, 82, 23, 170, 107, 47, 156, 92, 37, 149, 90, 43, 111, 60, 19, 114, 57, 20, 126, 67, 31, 119, 72, 32, 85, 66, 25, 84, 74, 29, 81, 71, 19, 86, 72, 23, 91, 75, 24, 105, 93, 32, 119, 109, 54, 84, 85, 21, 64, 71, 15, 56, 57, 6, 64, 63, 9, 71, 71, 4, 94, 93, 14, 96, 103, 17, 74, 83, 13, 75, 70, 9, 130, 122, 52, 128, 113, 18, + 117, 101, 19, 60, 59, 0, 29, 44, 0, 20, 39, 0, 15, 25, 0, 21, 29, 1, 41, 44, 5, 69, 68, 15, 58, 55, 6, 72, 70, 19, 75, 74, 21, 62, 69, 10, 55, 60, 0, 40, 49, 0, 36, 44, 0, 53, 45, 6, 69, 40, 13, 96, 55, 25, 100, 60, 23, 89, 45, 18, 110, 60, 21, 90, 44, 6, 100, 56, 19, 89, 51, 15, 138, 88, 40, 138, 85, 34, 117, 69, 28, 147, 102, 46, 132, 87, 37, 119, 77, 28, 144, 90, 38, 145, 97, 42, 117, 71, 23, 165, 107, 44, 185, 127, 50, 151, 97, 39, 171, 116, 50, 169, 118, 57, 143, 91, 36, 117, 67, 22, 171, 114, 46, 189, 126, 53, 194, 131, 54, 176, 117, 47, 88, 47, 10, 126, 74, 29, 147, 100, 45, 158, 98, 42, 165, 105, 42, 161, 110, 51, 163, 107, 42, 169, 111, 50, 165, 113, 52, 166, + 111, 52, 182, 118, 49, 168, 103, 35, 190, 127, 50, 143, 84, 27, 143, 82, 22, 154, 85, 23, 188, 121, 44, 197, 129, 54, 166, 97, 27, 195, 128, 53, 202, 139, 60, 184, 123, 49, 169, 101, 32, 146, 72, 13, 175, 96, 22, 197, 123, 44, 184, 108, 28, 193, 117, 36, 176, 90, 15, 188, 106, 25, 197, 117, 35, 196, 120, 39, 201, 128, 51, 197, 129, 50, 189, 115, 36, 184, 114, 36, 167, 98, 30, 158, 92, 29, 148, 82, 17, 172, 108, 38, 170, 102, 34, 164, 92, 23, 187, 120, 44, 175, 108, 40, 158, 91, 26, 150, 83, 22, 142, 81, 22, 152, 82, 20, 194, 127, 49, 169, 101, 29, 162, 92, 25, 177, 110, 38, 174, 108, 39, 160, 93, 28, 159, 87, 20, 170, 100, 27, 167, 99, 30, 155, 102, 47, 214, 163, 91, 228, 165, 83, 228, 166, 85, 230, 165, 82, 228, 158, + 76, 226, 157, 73, 225, 152, 70, 217, 146, 66, 217, 144, 63, 210, 133, 50, 196, 115, 37, 192, 109, 30, 193, 105, 25, 192, 105, 26, 201, 112, 34, 197, 115, 35, 192, 111, 32, 169, 89, 18, 163, 80, 9, 168, 86, 12, 167, 84, 14, 161, 79, 8, 175, 89, 16, 189, 111, 30, 212, 142, 60, 211, 145, 68, 209, 142, 62, 196, 128, 52, 167, 100, 29, 187, 126, 54, 177, 124, 61, 152, 98, 41, 118, 65, 17, 153, 96, 37, 153, 92, 33, 149, 88, 34, 130, 77, 32, 120, 64, 23, 121, 64, 23, 122, 72, 29, 112, 71, 30, 68, 47, 7, 61, 47, 0, 69, 52, 5, 63, 48, 3, 82, 69, 20, 96, 75, 29, 79, 70, 29, 34, 38, 1, 26, 39, 1, 32, 42, 0, 48, 54, 0, 79, 82, 2, 94, 106, 19, 86, 97, 19, 91, 77, 2, 127, 111, 45, 133, 125, 46, + 33, 35, 0, 21, 33, 0, 17, 29, 0, 23, 36, 4, 26, 38, 2, 27, 47, 1, 26, 55, 0, 28, 56, 0, 33, 53, 0, 52, 61, 10, 61, 75, 27, 64, 68, 9, 54, 52, 0, 59, 51, 2, 71, 48, 4, 75, 48, 8, 111, 71, 24, 102, 53, 17, 86, 45, 17, 76, 38, 11, 101, 52, 17, 102, 60, 21, 89, 53, 18, 71, 36, 12, 129, 77, 28, 106, 53, 19, 143, 95, 38, 134, 86, 33, 119, 79, 35, 118, 75, 29, 134, 84, 32, 132, 86, 33, 120, 74, 25, 161, 109, 40, 170, 112, 45, 157, 109, 45, 171, 115, 55, 159, 106, 50, 147, 93, 45, 120, 72, 24, 157, 101, 45, 178, 116, 48, 184, 117, 47, 176, 119, 49, 105, 66, 25, 108, 64, 23, 152, 100, 37, 141, 89, 38, 183, 124, 50, 162, 104, 36, 158, 100, 37, 164, 108, 37, 141, 88, 32, 134, + 84, 37, 193, 132, 59, 162, 100, 36, 191, 128, 54, 151, 90, 27, 156, 92, 29, 166, 104, 39, 182, 114, 42, 197, 127, 51, 150, 81, 19, 190, 122, 44, 190, 118, 41, 190, 116, 38, 187, 119, 46, 176, 104, 31, 171, 90, 15, 198, 117, 36, 202, 126, 43, 185, 106, 25, 183, 103, 24, 183, 100, 20, 190, 105, 24, 195, 111, 32, 194, 110, 28, 202, 124, 42, 196, 118, 40, 188, 113, 37, 178, 103, 32, 173, 109, 42, 155, 93, 30, 157, 88, 27, 166, 101, 31, 173, 102, 31, 174, 106, 34, 188, 119, 45, 169, 100, 32, 168, 101, 35, 141, 78, 20, 124, 62, 11, 182, 106, 35, 179, 107, 33, 170, 100, 31, 176, 106, 34, 183, 117, 40, 174, 106, 36, 160, 91, 26, 161, 91, 23, 149, 85, 26, 201, 146, 75, 219, 157, 74, 234, 172, 87, 234, 169, 87, 236, 167, 80, 234, 162, + 74, 219, 144, 62, 216, 139, 57, 214, 146, 65, 217, 144, 62, 211, 133, 51, 210, 129, 48, 202, 120, 35, 199, 113, 32, 193, 108, 30, 208, 125, 45, 197, 115, 37, 198, 120, 41, 189, 113, 38, 164, 86, 17, 167, 93, 18, 171, 95, 25, 163, 81, 9, 168, 86, 12, 184, 104, 27, 199, 124, 41, 214, 147, 69, 217, 155, 77, 207, 143, 65, 190, 126, 53, 200, 140, 61, 200, 147, 75, 166, 119, 59, 120, 77, 38, 113, 61, 20, 151, 91, 40, 134, 76, 27, 106, 57, 20, 118, 60, 21, 129, 75, 31, 108, 60, 20, 103, 61, 23, 88, 53, 12, 77, 56, 12, 59, 40, 5, 67, 47, 11, 79, 64, 26, 67, 51, 18, 98, 82, 48, 58, 54, 12, 24, 34, 0, 24, 40, 0, 37, 53, 3, 47, 62, 3, 67, 81, 6, 79, 88, 12, 99, 86, 2, 137, 110, 40, 126, 105, 39, + 15, 26, 1, 12, 26, 0, 13, 25, 0, 26, 35, 1, 41, 50, 0, 32, 48, 0, 29, 53, 1, 43, 68, 4, 62, 77, 4, 62, 65, 4, 52, 59, 8, 58, 61, 8, 61, 54, 3, 75, 53, 6, 82, 56, 7, 105, 64, 16, 109, 59, 21, 75, 34, 9, 67, 33, 11, 80, 40, 14, 84, 42, 17, 86, 50, 15, 66, 33, 8, 75, 42, 18, 120, 70, 26, 129, 77, 34, 146, 99, 42, 112, 68, 28, 116, 77, 31, 113, 73, 30, 126, 79, 32, 120, 75, 29, 109, 62, 17, 160, 105, 39, 162, 100, 36, 165, 107, 48, 141, 90, 40, 150, 97, 40, 129, 83, 37, 113, 62, 19, 153, 96, 39, 181, 119, 48, 176, 115, 46, 173, 122, 58, 116, 72, 31, 103, 57, 23, 117, 70, 30, 117, 67, 21, 167, 109, 42, 155, 92, 29, 157, 94, 31, 165, 103, 38, 166, 100, 31, 165, + 107, 38, 180, 121, 50, 165, 102, 40, 178, 119, 47, 164, 98, 32, 156, 91, 31, 166, 104, 39, 175, 107, 38, 183, 117, 43, 172, 106, 39, 175, 100, 27, 192, 122, 45, 203, 130, 49, 202, 129, 48, 196, 122, 45, 200, 123, 41, 201, 120, 37, 210, 128, 42, 204, 120, 37, 206, 127, 44, 205, 127, 44, 194, 113, 36, 186, 103, 24, 183, 97, 19, 197, 119, 39, 204, 131, 50, 198, 125, 48, 194, 123, 47, 193, 123, 47, 185, 115, 43, 174, 108, 40, 170, 102, 35, 182, 110, 41, 169, 99, 32, 181, 115, 48, 179, 110, 40, 181, 116, 42, 163, 97, 30, 141, 76, 16, 173, 102, 29, 190, 122, 44, 177, 109, 37, 166, 97, 28, 181, 109, 33, 171, 102, 30, 170, 103, 34, 161, 94, 32, 186, 137, 72, 219, 163, 84, 229, 169, 84, 239, 177, 91, 240, 179, 92, 240, 172, 85, 235, 165, + 76, 226, 153, 66, 223, 147, 62, 220, 142, 58, 222, 148, 68, 220, 143, 62, 220, 142, 60, 218, 136, 51, 212, 129, 46, 208, 125, 46, 206, 126, 47, 203, 123, 44, 198, 122, 48, 199, 122, 48, 176, 108, 36, 170, 101, 28, 179, 110, 42, 177, 103, 28, 178, 100, 23, 189, 112, 36, 197, 123, 43, 213, 145, 64, 217, 157, 78, 211, 151, 76, 205, 146, 71, 209, 150, 75, 203, 151, 80, 183, 136, 74, 135, 96, 52, 113, 72, 36, 126, 80, 35, 120, 67, 31, 94, 49, 18, 108, 60, 22, 124, 73, 27, 121, 74, 30, 97, 62, 21, 95, 66, 22, 95, 64, 20, 90, 60, 20, 73, 51, 25, 55, 44, 17, 62, 48, 21, 67, 47, 10, 86, 78, 36, 30, 34, 3, 20, 30, 2, 23, 38, 14, 29, 45, 12, 39, 52, 0, 65, 71, 4, 98, 88, 5, 128, 109, 40, 132, 116, 59, + 8, 25, 0, 20, 32, 0, 20, 33, 0, 28, 36, 0, 41, 51, 1, 25, 41, 0, 21, 37, 0, 33, 51, 1, 50, 60, 2, 51, 54, 0, 29, 35, 0, 20, 25, 0, 39, 33, 8, 50, 39, 3, 79, 54, 15, 104, 52, 16, 58, 21, 3, 51, 23, 5, 76, 39, 14, 78, 38, 13, 96, 54, 19, 68, 33, 4, 66, 33, 10, 93, 53, 22, 99, 52, 16, 161, 104, 43, 144, 94, 40, 99, 61, 25, 109, 71, 30, 111, 70, 28, 120, 78, 32, 86, 48, 13, 111, 64, 16, 137, 84, 27, 172, 114, 43, 167, 113, 51, 151, 98, 42, 149, 102, 46, 102, 59, 13, 104, 56, 15, 140, 86, 28, 180, 120, 48, 169, 108, 43, 167, 116, 57, 103, 62, 24, 106, 62, 25, 94, 51, 14, 75, 35, 9, 118, 66, 24, 164, 104, 33, 156, 96, 37, 143, 86, 33, 136, 72, 21, 162, + 105, 44, 175, 113, 48, 170, 113, 46, 154, 91, 32, 130, 73, 21, 120, 58, 11, 122, 65, 19, 171, 107, 39, 172, 103, 32, 160, 92, 30, 164, 90, 25, 196, 124, 47, 190, 114, 38, 190, 110, 29, 197, 124, 43, 207, 125, 42, 194, 103, 18, 197, 103, 20, 209, 122, 38, 211, 130, 45, 218, 137, 51, 214, 135, 49, 194, 109, 27, 169, 88, 12, 188, 107, 29, 193, 117, 35, 197, 123, 45, 203, 132, 52, 199, 131, 53, 196, 128, 54, 199, 135, 62, 190, 123, 54, 170, 102, 33, 167, 99, 34, 175, 110, 44, 170, 99, 28, 186, 118, 39, 178, 105, 32, 161, 84, 19, 176, 106, 32, 180, 111, 37, 189, 122, 47, 165, 95, 27, 170, 100, 28, 173, 105, 32, 170, 102, 33, 170, 114, 52, 198, 150, 82, 224, 169, 93, 238, 177, 98, 241, 177, 97, 246, 188, 100, 242, 182, 96, 235, 169, + 85, 233, 160, 74, 229, 153, 65, 225, 150, 65, 226, 155, 73, 227, 151, 66, 222, 145, 65, 220, 146, 63, 216, 140, 56, 217, 136, 56, 210, 128, 48, 210, 130, 51, 203, 131, 53, 204, 132, 56, 184, 119, 51, 195, 129, 59, 175, 111, 41, 185, 121, 49, 187, 118, 42, 199, 132, 55, 197, 126, 47, 201, 129, 48, 211, 147, 69, 213, 156, 80, 212, 153, 77, 211, 155, 82, 206, 156, 87, 188, 143, 84, 143, 106, 62, 84, 52, 21, 94, 59, 25, 113, 66, 35, 88, 46, 19, 93, 54, 23, 114, 74, 36, 98, 55, 23, 103, 66, 24, 84, 65, 19, 76, 57, 14, 94, 69, 20, 85, 63, 25, 67, 43, 14, 67, 47, 14, 59, 41, 6, 91, 77, 31, 66, 63, 19, 25, 33, 0, 24, 38, 2, 18, 29, 0, 36, 37, 0, 66, 62, 0, 89, 83, 12, 114, 104, 38, 123, 111, 54, + 7, 21, 0, 26, 42, 3, 33, 50, 0, 24, 31, 0, 20, 29, 0, 10, 23, 0, 8, 20, 0, 15, 28, 1, 27, 44, 1, 21, 39, 0, 11, 20, 0, 13, 18, 0, 34, 32, 3, 86, 64, 16, 97, 57, 13, 74, 33, 4, 56, 25, 9, 65, 36, 13, 77, 36, 11, 83, 44, 14, 88, 47, 17, 63, 29, 11, 66, 34, 12, 74, 34, 9, 118, 66, 25, 168, 112, 48, 126, 83, 34, 104, 59, 22, 106, 64, 24, 120, 78, 36, 106, 65, 26, 88, 51, 18, 96, 51, 13, 117, 64, 18, 147, 90, 33, 151, 96, 39, 156, 100, 37, 138, 93, 41, 98, 55, 15, 104, 55, 14, 128, 79, 25, 169, 105, 40, 173, 116, 47, 168, 120, 57, 104, 61, 22, 105, 61, 21, 115, 69, 21, 74, 31, 1, 72, 26, 4, 102, 49, 11, 159, 92, 31, 119, 61, 11, 121, 67, 25, 110, + 59, 20, 121, 68, 25, 160, 100, 35, 152, 89, 29, 144, 78, 24, 130, 63, 11, 135, 82, 30, 174, 111, 46, 153, 81, 24, 163, 91, 26, 170, 96, 26, 183, 108, 34, 184, 105, 28, 180, 103, 28, 197, 124, 45, 204, 118, 35, 203, 109, 22, 205, 110, 22, 205, 107, 17, 213, 118, 30, 213, 126, 37, 213, 126, 40, 214, 130, 48, 200, 126, 47, 188, 117, 42, 196, 136, 62, 200, 145, 74, 203, 144, 72, 202, 136, 61, 200, 134, 60, 198, 127, 51, 200, 133, 55, 184, 118, 44, 181, 115, 45, 159, 93, 27, 159, 88, 21, 170, 98, 27, 179, 109, 38, 165, 92, 24, 172, 103, 33, 179, 110, 37, 182, 118, 44, 172, 106, 38, 162, 92, 24, 158, 90, 23, 156, 97, 29, 190, 145, 83, 203, 152, 83, 225, 171, 91, 238, 180, 96, 237, 173, 92, 243, 184, 101, 242, 184, 101, 240, 171, + 84, 239, 172, 86, 235, 161, 76, 230, 155, 69, 229, 156, 74, 226, 151, 68, 223, 149, 64, 222, 145, 66, 221, 142, 61, 212, 132, 50, 211, 132, 53, 212, 136, 57, 206, 132, 53, 202, 126, 46, 194, 127, 51, 210, 151, 77, 183, 122, 51, 183, 119, 48, 189, 121, 44, 206, 143, 69, 210, 146, 74, 209, 141, 59, 216, 154, 76, 211, 153, 76, 216, 160, 86, 217, 161, 89, 214, 166, 97, 196, 154, 92, 130, 97, 65, 78, 53, 23, 95, 60, 30, 100, 59, 26, 113, 74, 43, 93, 59, 28, 99, 66, 31, 111, 82, 49, 97, 76, 50, 76, 64, 41, 97, 71, 34, 86, 66, 28, 63, 49, 10, 61, 46, 9, 73, 54, 19, 81, 62, 21, 58, 44, 6, 77, 67, 28, 36, 43, 4, 32, 46, 0, 34, 45, 1, 56, 49, 0, 93, 76, 3, 98, 90, 22, 105, 94, 37, 135, 120, 66, + 9, 22, 0, 30, 45, 3, 38, 56, 0, 16, 24, 0, 4, 10, 0, 10, 20, 0, 14, 26, 0, 13, 23, 0, 23, 42, 2, 25, 46, 0, 23, 27, 0, 19, 19, 3, 79, 56, 17, 85, 51, 13, 74, 35, 7, 68, 32, 5, 64, 34, 10, 73, 41, 10, 76, 34, 9, 93, 53, 22, 78, 40, 18, 54, 19, 3, 47, 21, 7, 87, 48, 20, 138, 82, 31, 137, 87, 32, 93, 52, 17, 104, 60, 24, 117, 73, 31, 108, 68, 27, 101, 62, 28, 75, 42, 12, 86, 45, 12, 95, 55, 14, 130, 74, 26, 145, 89, 36, 150, 95, 40, 119, 72, 28, 97, 55, 18, 96, 56, 16, 96, 53, 15, 157, 95, 32, 182, 123, 60, 176, 125, 59, 112, 64, 22, 94, 51, 16, 130, 76, 25, 108, 60, 16, 81, 35, 3, 76, 30, 1, 102, 44, 8, 146, 82, 27, 130, 78, 27, 116, + 71, 28, 90, 44, 11, 110, 57, 18, 168, 104, 35, 139, 76, 17, 128, 65, 13, 139, 83, 31, 172, 107, 40, 175, 105, 30, 172, 93, 19, 182, 102, 29, 187, 108, 38, 177, 95, 19, 183, 108, 33, 188, 104, 26, 200, 107, 22, 204, 103, 17, 198, 94, 7, 202, 97, 8, 209, 115, 24, 211, 121, 32, 204, 117, 30, 201, 116, 33, 199, 125, 48, 197, 135, 61, 203, 146, 72, 199, 145, 78, 198, 147, 82, 203, 150, 84, 197, 135, 64, 185, 115, 39, 199, 128, 51, 197, 131, 56, 180, 112, 43, 173, 104, 37, 159, 91, 23, 161, 90, 20, 171, 101, 34, 167, 96, 27, 168, 98, 27, 176, 107, 35, 180, 114, 42, 168, 102, 36, 153, 88, 22, 160, 92, 26, 168, 117, 49, 213, 168, 98, 227, 177, 105, 228, 172, 93, 237, 177, 95, 241, 179, 96, 242, 179, 96, 241, 179, 97, 244, 180, + 93, 241, 174, 89, 239, 171, 83, 236, 166, 80, 234, 163, 81, 228, 153, 69, 226, 147, 60, 219, 139, 57, 220, 139, 58, 221, 143, 63, 217, 136, 55, 216, 141, 58, 209, 134, 53, 202, 134, 59, 202, 129, 51, 198, 131, 50, 190, 127, 51, 188, 128, 59, 186, 121, 48, 193, 135, 62, 210, 148, 74, 211, 145, 67, 211, 148, 70, 218, 163, 90, 217, 162, 90, 221, 171, 99, 227, 179, 111, 208, 164, 101, 129, 94, 59, 73, 51, 30, 33, 14, 1, 95, 62, 30, 133, 96, 53, 93, 63, 33, 82, 59, 36, 91, 68, 45, 99, 96, 85, 78, 89, 90, 61, 67, 59, 66, 54, 35, 79, 65, 35, 48, 42, 9, 72, 56, 16, 92, 73, 39, 45, 40, 8, 28, 24, 1, 38, 42, 12, 39, 48, 4, 39, 47, 0, 74, 65, 0, 106, 87, 7, 103, 92, 20, 94, 88, 41, 142, 126, 78, + 13, 26, 1, 28, 40, 2, 29, 46, 0, 14, 23, 0, 5, 11, 0, 23, 27, 1, 32, 41, 0, 22, 30, 0, 25, 39, 2, 28, 40, 2, 20, 26, 0, 40, 34, 5, 74, 50, 13, 77, 42, 6, 65, 31, 3, 61, 36, 7, 69, 44, 10, 73, 40, 10, 84, 45, 15, 97, 55, 15, 62, 27, 7, 45, 16, 0, 47, 25, 11, 100, 59, 27, 140, 88, 32, 97, 54, 16, 82, 46, 17, 100, 57, 21, 104, 58, 21, 96, 62, 31, 84, 51, 22, 67, 36, 9, 85, 46, 13, 108, 57, 18, 120, 72, 25, 136, 82, 28, 128, 75, 27, 114, 63, 18, 100, 58, 12, 98, 59, 27, 74, 43, 9, 156, 95, 42, 172, 116, 53, 173, 124, 62, 115, 60, 26, 87, 46, 11, 126, 73, 28, 132, 82, 31, 102, 54, 11, 79, 32, 5, 111, 54, 11, 125, 63, 12, 133, 69, 18, 161, + 100, 35, 139, 80, 22, 143, 74, 16, 148, 76, 16, 172, 96, 29, 157, 89, 22, 155, 84, 23, 202, 136, 55, 201, 127, 45, 187, 102, 20, 179, 94, 17, 188, 108, 29, 175, 93, 20, 178, 102, 29, 190, 106, 29, 193, 93, 13, 201, 108, 22, 204, 107, 21, 204, 105, 16, 204, 108, 20, 196, 108, 26, 179, 93, 15, 179, 94, 17, 179, 100, 21, 195, 122, 43, 201, 131, 53, 200, 138, 65, 199, 142, 70, 201, 150, 79, 202, 153, 85, 205, 144, 72, 194, 129, 56, 197, 129, 57, 198, 136, 61, 179, 116, 43, 164, 96, 28, 160, 92, 28, 158, 89, 24, 156, 86, 23, 166, 94, 27, 163, 92, 21, 174, 108, 36, 165, 99, 31, 154, 92, 28, 167, 117, 53, 217, 170, 98, 223, 171, 97, 215, 158, 84, 224, 164, 86, 233, 172, 94, 240, 176, 93, 235, 173, 90, 241, 177, 93, 236, 170, + 86, 238, 172, 87, 238, 171, 85, 234, 166, 78, 237, 164, 80, 232, 160, 77, 225, 147, 61, 223, 140, 54, 222, 142, 60, 228, 155, 72, 225, 150, 68, 216, 145, 63, 215, 144, 60, 210, 141, 66, 206, 133, 57, 201, 131, 49, 197, 132, 55, 194, 134, 67, 194, 135, 67, 190, 128, 57, 207, 149, 76, 209, 148, 73, 213, 154, 80, 217, 167, 96, 215, 163, 90, 221, 172, 102, 225, 179, 115, 206, 160, 95, 146, 111, 69, 81, 59, 34, 39, 23, 8, 88, 59, 27, 122, 83, 40, 115, 82, 46, 85, 66, 42, 66, 57, 46, 82, 79, 76, 83, 96, 95, 62, 88, 102, 54, 66, 65, 64, 62, 46, 21, 28, 13, 35, 33, 7, 73, 63, 15, 56, 53, 6, 32, 38, 5, 20, 22, 0, 33, 36, 5, 35, 37, 1, 71, 57, 0, 98, 85, 15, 80, 81, 19, 72, 65, 11, 131, 111, 65, + 19, 35, 1, 22, 38, 0, 20, 36, 0, 9, 18, 0, 8, 16, 0, 24, 31, 0, 33, 37, 0, 22, 31, 0, 22, 34, 0, 30, 38, 0, 37, 35, 2, 51, 33, 4, 51, 28, 2, 58, 34, 5, 58, 39, 5, 73, 47, 13, 65, 40, 10, 47, 27, 6, 89, 49, 18, 95, 49, 15, 61, 25, 6, 55, 27, 13, 55, 29, 15, 111, 65, 28, 120, 70, 27, 86, 43, 12, 79, 45, 17, 98, 57, 22, 106, 61, 25, 97, 61, 28, 77, 46, 18, 70, 35, 9, 77, 38, 12, 98, 51, 13, 103, 52, 14, 134, 78, 25, 133, 82, 31, 104, 58, 17, 89, 50, 17, 96, 54, 24, 93, 55, 14, 160, 103, 45, 166, 110, 50, 168, 114, 52, 134, 80, 32, 93, 51, 18, 97, 52, 18, 148, 93, 33, 128, 71, 18, 107, 59, 15, 129, 74, 23, 137, 68, 11, 142, 75, 16, 123, + 58, 7, 142, 66, 9, 176, 93, 17, 168, 88, 14, 165, 90, 18, 134, 66, 11, 153, 81, 15, 188, 110, 32, 198, 118, 39, 189, 105, 26, 186, 99, 21, 192, 105, 21, 184, 101, 25, 190, 110, 27, 203, 117, 31, 205, 112, 25, 199, 112, 25, 202, 119, 36, 209, 130, 49, 205, 132, 53, 201, 133, 61, 194, 121, 46, 184, 110, 31, 191, 113, 33, 198, 123, 42, 203, 129, 52, 206, 139, 59, 206, 141, 65, 200, 134, 57, 193, 131, 60, 199, 144, 76, 202, 145, 73, 193, 130, 60, 191, 131, 58, 201, 143, 68, 187, 127, 55, 162, 94, 28, 166, 97, 30, 156, 87, 24, 151, 85, 20, 161, 93, 23, 172, 109, 37, 167, 107, 41, 167, 125, 67, 207, 160, 89, 215, 162, 92, 219, 159, 83, 218, 155, 78, 219, 156, 76, 226, 159, 80, 224, 155, 75, 231, 161, 77, 234, 167, 82, 234, 167, + 80, 231, 164, 81, 234, 165, 83, 237, 168, 85, 233, 160, 78, 232, 162, 78, 229, 152, 67, 222, 141, 58, 223, 144, 61, 228, 153, 69, 226, 154, 70, 220, 149, 66, 221, 153, 72, 210, 142, 64, 207, 136, 57, 208, 140, 62, 199, 138, 62, 196, 140, 72, 197, 143, 75, 185, 127, 60, 205, 149, 77, 211, 154, 80, 215, 164, 91, 213, 163, 94, 215, 159, 87, 219, 170, 102, 219, 175, 107, 195, 145, 79, 169, 131, 78, 72, 50, 24, 24, 11, 0, 67, 45, 14, 102, 67, 32, 110, 80, 42, 92, 77, 48, 72, 73, 68, 91, 101, 106, 85, 104, 106, 78, 100, 99, 50, 78, 80, 51, 57, 42, 29, 34, 19, 30, 33, 6, 62, 60, 0, 79, 87, 5, 65, 74, 9, 26, 33, 5, 9, 16, 3, 19, 21, 0, 62, 48, 0, 90, 82, 18, 77, 82, 31, 48, 45, 4, 88, 67, 26, + 16, 30, 1, 17, 33, 0, 15, 31, 0, 8, 22, 0, 17, 27, 0, 26, 34, 0, 24, 30, 0, 21, 33, 1, 14, 29, 0, 20, 26, 0, 27, 26, 2, 35, 29, 0, 41, 27, 0, 65, 48, 15, 89, 71, 27, 72, 53, 19, 50, 30, 7, 46, 28, 10, 91, 52, 16, 68, 29, 5, 59, 23, 7, 55, 24, 11, 70, 39, 19, 92, 55, 24, 104, 56, 18, 90, 49, 22, 95, 51, 18, 124, 78, 34, 93, 52, 19, 115, 76, 35, 81, 47, 13, 80, 40, 11, 68, 33, 8, 73, 37, 9, 96, 49, 17, 131, 79, 27, 109, 55, 12, 113, 64, 22, 73, 34, 7, 72, 35, 8, 101, 62, 23, 157, 97, 43, 167, 114, 50, 162, 109, 54, 169, 111, 50, 111, 67, 22, 109, 61, 23, 141, 84, 25, 143, 82, 20, 139, 78, 17, 133, 78, 26, 133, 65, 14, 129, 64, 14, 133, + 64, 11, 150, 78, 17, 156, 78, 9, 162, 83, 13, 145, 71, 12, 144, 78, 17, 174, 101, 26, 182, 109, 31, 192, 122, 46, 198, 125, 44, 183, 101, 23, 186, 104, 26, 192, 109, 26, 196, 116, 28, 211, 134, 45, 200, 119, 36, 200, 125, 45, 190, 117, 38, 184, 107, 30, 193, 127, 51, 206, 151, 84, 210, 154, 84, 200, 148, 78, 204, 153, 82, 204, 145, 73, 204, 134, 58, 208, 136, 53, 201, 129, 49, 202, 129, 45, 200, 131, 53, 190, 122, 47, 198, 139, 66, 199, 141, 70, 184, 128, 59, 173, 122, 60, 197, 145, 72, 181, 122, 57, 160, 93, 28, 158, 90, 24, 159, 94, 27, 158, 96, 28, 173, 111, 42, 180, 130, 67, 205, 154, 81, 206, 147, 71, 211, 151, 76, 225, 161, 86, 225, 160, 79, 224, 157, 75, 224, 160, 77, 226, 156, 74, 230, 160, 75, 229, 157, 72, 225, 147, + 63, 223, 147, 63, 229, 159, 77, 231, 157, 77, 231, 155, 78, 226, 155, 74, 227, 153, 71, 225, 146, 62, 230, 154, 67, 231, 156, 69, 228, 159, 71, 224, 158, 74, 226, 163, 86, 218, 154, 72, 213, 143, 63, 207, 140, 62, 202, 143, 65, 201, 147, 79, 191, 139, 72, 188, 135, 65, 204, 155, 86, 203, 148, 79, 212, 160, 94, 210, 160, 91, 202, 143, 69, 205, 155, 84, 204, 157, 87, 196, 147, 75, 161, 121, 70, 67, 46, 24, 16, 9, 1, 53, 34, 9, 110, 79, 35, 107, 78, 34, 102, 78, 32, 73, 72, 58, 91, 95, 91, 77, 88, 72, 58, 77, 46, 53, 78, 63, 46, 53, 26, 35, 41, 15, 33, 36, 6, 54, 62, 10, 95, 111, 21, 100, 115, 20, 63, 73, 12, 17, 21, 3, 26, 24, 0, 58, 50, 0, 91, 83, 10, 80, 81, 19, 50, 50, 6, 53, 36, 0, + 10, 19, 1, 19, 31, 0, 18, 30, 3, 11, 25, 5, 13, 26, 1, 17, 26, 0, 21, 28, 1, 26, 33, 0, 25, 29, 0, 33, 35, 1, 34, 32, 0, 60, 53, 11, 83, 66, 14, 96, 78, 13, 73, 59, 9, 59, 42, 3, 34, 22, 2, 53, 32, 10, 74, 41, 12, 73, 31, 7, 62, 26, 10, 49, 24, 12, 56, 29, 13, 71, 39, 17, 87, 44, 17, 67, 31, 12, 105, 62, 27, 124, 75, 33, 93, 55, 20, 99, 55, 23, 82, 42, 11, 68, 30, 6, 75, 35, 7, 67, 27, 4, 88, 44, 19, 123, 66, 25, 123, 62, 21, 112, 62, 18, 72, 35, 14, 76, 33, 8, 118, 68, 28, 133, 81, 32, 158, 105, 47, 159, 102, 46, 145, 88, 34, 142, 92, 37, 115, 65, 21, 120, 62, 11, 138, 75, 17, 154, 89, 25, 176, 106, 31, 135, 72, 10, 89, 36, 3, 111, + 51, 6, 124, 62, 11, 126, 60, 9, 125, 58, 7, 145, 78, 16, 155, 90, 21, 177, 105, 33, 185, 120, 48, 192, 127, 52, 193, 125, 47, 187, 115, 36, 183, 108, 30, 192, 117, 37, 192, 115, 36, 182, 109, 31, 173, 100, 28, 172, 95, 21, 184, 109, 32, 191, 119, 40, 190, 124, 46, 175, 112, 47, 176, 113, 46, 164, 99, 37, 176, 115, 50, 183, 128, 65, 189, 138, 70, 203, 140, 64, 206, 137, 58, 198, 130, 50, 200, 133, 57, 201, 136, 58, 197, 133, 54, 194, 133, 60, 192, 141, 73, 168, 124, 67, 141, 91, 42, 173, 120, 56, 159, 100, 37, 144, 79, 18, 149, 84, 21, 150, 90, 27, 179, 128, 63, 198, 143, 69, 209, 148, 70, 213, 143, 61, 213, 139, 55, 219, 151, 69, 223, 156, 76, 222, 150, 69, 215, 139, 53, 223, 154, 70, 230, 160, 77, 224, 152, 72, 215, 136, + 53, 209, 127, 45, 217, 143, 68, 223, 148, 72, 226, 150, 69, 221, 145, 65, 227, 155, 74, 233, 157, 73, 232, 156, 71, 232, 160, 73, 231, 162, 74, 227, 160, 80, 226, 165, 89, 221, 155, 76, 221, 154, 76, 205, 146, 66, 200, 148, 77, 195, 145, 80, 182, 134, 72, 183, 135, 68, 194, 145, 79, 191, 143, 73, 201, 154, 88, 199, 144, 71, 197, 142, 63, 191, 140, 71, 193, 151, 85, 181, 134, 63, 145, 108, 64, 74, 51, 26, 37, 25, 11, 49, 32, 11, 96, 71, 27, 96, 76, 30, 89, 71, 19, 88, 73, 26, 63, 57, 33, 72, 75, 42, 65, 73, 13, 57, 71, 7, 61, 70, 10, 54, 61, 26, 43, 51, 31, 48, 64, 50, 84, 95, 8, 108, 123, 18, 90, 105, 16, 49, 56, 7, 47, 40, 0, 72, 61, 0, 85, 76, 4, 91, 86, 15, 71, 65, 7, 41, 34, 0, + 12, 17, 2, 26, 38, 6, 22, 37, 12, 13, 28, 14, 18, 30, 1, 22, 32, 0, 21, 29, 1, 28, 34, 0, 33, 35, 1, 76, 72, 23, 104, 99, 59, 95, 83, 31, 74, 61, 7, 40, 34, 0, 37, 33, 1, 40, 29, 1, 32, 23, 3, 65, 37, 14, 76, 41, 17, 83, 41, 14, 53, 22, 5, 37, 15, 6, 59, 30, 14, 57, 27, 11, 78, 39, 15, 82, 42, 17, 94, 53, 22, 110, 68, 30, 71, 34, 6, 95, 47, 17, 78, 38, 10, 77, 36, 8, 77, 37, 10, 64, 26, 5, 81, 44, 16, 109, 58, 21, 113, 58, 20, 115, 64, 23, 75, 37, 8, 80, 37, 8, 106, 53, 15, 127, 76, 36, 163, 109, 51, 160, 100, 45, 143, 83, 31, 143, 83, 34, 132, 73, 21, 120, 64, 12, 116, 59, 10, 142, 75, 16, 159, 85, 19, 155, 86, 20, 74, 27, 1, 74, + 29, 1, 103, 51, 6, 100, 49, 7, 146, 82, 21, 165, 98, 30, 161, 99, 31, 176, 114, 40, 186, 130, 56, 195, 134, 59, 193, 127, 49, 205, 134, 55, 202, 128, 51, 204, 135, 55, 186, 115, 36, 169, 98, 25, 171, 102, 30, 176, 105, 32, 195, 127, 50, 202, 137, 60, 203, 138, 59, 178, 108, 38, 181, 111, 37, 172, 101, 30, 171, 105, 34, 182, 123, 54, 190, 141, 76, 194, 144, 74, 210, 153, 77, 205, 140, 64, 200, 137, 60, 196, 137, 64, 198, 141, 68, 202, 142, 67, 185, 132, 61, 183, 135, 69, 177, 134, 73, 133, 86, 40, 138, 87, 36, 141, 82, 21, 136, 76, 14, 158, 105, 42, 194, 142, 72, 205, 142, 65, 210, 146, 64, 216, 146, 64, 215, 141, 58, 225, 158, 74, 227, 161, 82, 219, 151, 71, 220, 150, 68, 223, 153, 71, 221, 148, 71, 221, 150, 71, 216, 139, + 62, 211, 130, 49, 210, 131, 51, 214, 136, 56, 221, 143, 62, 224, 148, 69, 230, 160, 77, 234, 160, 75, 229, 156, 73, 232, 160, 74, 232, 161, 75, 229, 169, 89, 226, 166, 84, 226, 166, 85, 219, 162, 88, 213, 163, 91, 191, 143, 76, 176, 130, 69, 177, 136, 76, 184, 144, 82, 175, 125, 59, 180, 132, 66, 192, 143, 78, 187, 131, 59, 182, 126, 52, 187, 143, 76, 184, 140, 76, 171, 124, 58, 139, 99, 52, 72, 51, 26, 32, 23, 6, 62, 42, 18, 85, 64, 23, 88, 72, 24, 63, 52, 7, 66, 56, 7, 53, 52, 9, 66, 63, 27, 64, 67, 13, 64, 77, 5, 63, 77, 10, 56, 74, 37, 35, 50, 32, 24, 31, 5, 41, 48, 0, 83, 96, 0, 101, 117, 10, 99, 104, 14, 86, 79, 9, 81, 68, 4, 69, 63, 0, 95, 90, 14, 79, 74, 14, 43, 35, 1, + 7, 13, 0, 20, 30, 4, 16, 33, 7, 12, 23, 11, 31, 41, 2, 51, 61, 6, 26, 34, 0, 25, 28, 2, 67, 63, 22, 119, 107, 64, 100, 89, 44, 47, 43, 1, 29, 28, 0, 25, 29, 0, 31, 31, 3, 29, 25, 5, 56, 44, 24, 73, 48, 25, 82, 49, 22, 76, 39, 18, 47, 23, 9, 43, 20, 8, 56, 27, 12, 73, 42, 23, 62, 30, 12, 95, 49, 19, 89, 45, 16, 103, 63, 25, 66, 31, 8, 73, 33, 7, 74, 36, 10, 69, 29, 5, 63, 28, 7, 63, 24, 2, 75, 33, 10, 107, 56, 21, 108, 55, 18, 102, 54, 19, 78, 41, 10, 74, 31, 8, 102, 46, 13, 123, 67, 25, 154, 100, 46, 147, 99, 46, 151, 91, 38, 119, 64, 26, 121, 67, 24, 71, 32, 3, 112, 54, 10, 115, 55, 6, 134, 72, 12, 141, 74, 12, 121, 66, 13, 92, + 46, 7, 96, 47, 7, 70, 27, 0, 138, 82, 27, 169, 110, 43, 165, 107, 43, 175, 123, 56, 185, 128, 57, 195, 137, 63, 207, 144, 67, 204, 136, 56, 175, 101, 26, 179, 112, 38, 179, 117, 44, 190, 134, 61, 199, 139, 69, 188, 125, 51, 202, 139, 64, 206, 143, 67, 199, 132, 58, 193, 126, 52, 188, 122, 45, 189, 120, 44, 195, 130, 56, 197, 139, 62, 188, 133, 66, 195, 147, 78, 196, 147, 77, 214, 158, 84, 210, 151, 74, 191, 141, 73, 184, 137, 75, 199, 146, 75, 206, 154, 80, 189, 139, 69, 162, 112, 48, 179, 137, 72, 163, 121, 62, 147, 97, 37, 138, 86, 31, 186, 138, 69, 201, 143, 69, 212, 145, 65, 216, 147, 66, 215, 142, 61, 222, 152, 70, 228, 162, 83, 221, 154, 76, 217, 150, 71, 216, 151, 71, 222, 154, 76, 222, 153, 71, 221, 152, 74, 210, 136, + 56, 220, 142, 61, 215, 136, 56, 208, 126, 48, 212, 133, 55, 221, 143, 66, 224, 151, 69, 234, 166, 86, 239, 173, 87, 236, 169, 82, 235, 173, 87, 236, 176, 95, 232, 171, 92, 228, 168, 92, 218, 167, 99, 181, 136, 74, 146, 103, 46, 149, 112, 56, 156, 120, 60, 162, 118, 56, 159, 105, 38, 164, 115, 50, 165, 113, 49, 172, 117, 47, 173, 123, 54, 170, 128, 62, 169, 123, 58, 165, 119, 53, 142, 106, 56, 86, 61, 34, 47, 34, 12, 71, 52, 29, 72, 53, 11, 71, 61, 12, 51, 43, 0, 39, 37, 2, 30, 38, 0, 55, 55, 21, 50, 50, 13, 49, 55, 9, 54, 65, 7, 46, 62, 28, 29, 44, 15, 14, 34, 0, 21, 33, 0, 48, 59, 0, 97, 110, 8, 126, 131, 38, 124, 118, 33, 93, 78, 12, 75, 71, 0, 88, 93, 25, 76, 80, 20, 40, 34, 0, + 8, 18, 0, 10, 23, 0, 13, 22, 0, 15, 21, 8, 22, 26, 3, 57, 61, 18, 50, 59, 19, 42, 43, 15, 64, 56, 22, 36, 30, 2, 21, 25, 0, 19, 26, 1, 17, 22, 0, 26, 27, 5, 44, 41, 14, 53, 45, 17, 53, 33, 13, 88, 55, 25, 83, 45, 20, 78, 42, 12, 59, 28, 10, 41, 17, 4, 42, 19, 7, 62, 33, 16, 56, 25, 8, 95, 50, 21, 102, 58, 20, 89, 49, 13, 70, 31, 7, 64, 26, 4, 77, 38, 12, 74, 37, 12, 75, 36, 9, 63, 25, 2, 85, 39, 11, 106, 58, 21, 108, 60, 21, 95, 52, 17, 67, 31, 11, 82, 38, 10, 102, 54, 18, 106, 55, 18, 129, 82, 37, 142, 88, 41, 144, 84, 31, 111, 60, 18, 97, 45, 12, 55, 18, 2, 66, 23, 1, 88, 38, 5, 125, 64, 12, 139, 74, 17, 152, 93, 30, 157, + 99, 38, 142, 86, 29, 65, 25, 2, 155, 102, 46, 161, 108, 48, 156, 110, 48, 178, 124, 56, 186, 130, 58, 198, 140, 67, 203, 144, 67, 202, 138, 59, 203, 141, 61, 209, 153, 80, 217, 172, 102, 192, 146, 83, 219, 175, 109, 198, 147, 81, 201, 145, 77, 204, 144, 71, 203, 141, 67, 193, 131, 60, 195, 135, 60, 185, 121, 45, 198, 135, 58, 195, 138, 61, 195, 144, 76, 194, 148, 84, 185, 139, 76, 209, 159, 87, 214, 162, 88, 195, 147, 80, 168, 123, 67, 165, 119, 62, 208, 163, 93, 204, 161, 90, 181, 133, 65, 164, 113, 46, 178, 138, 76, 152, 112, 54, 171, 124, 59, 199, 145, 73, 210, 147, 71, 219, 153, 68, 219, 148, 67, 216, 144, 63, 221, 154, 74, 226, 160, 82, 218, 151, 72, 221, 157, 77, 223, 158, 79, 218, 150, 73, 211, 143, 67, 216, 146, 68, 222, 154, + 73, 217, 143, 64, 224, 149, 72, 225, 151, 72, 216, 138, 60, 210, 130, 49, 219, 141, 61, 226, 158, 75, 237, 171, 87, 238, 171, 87, 234, 170, 85, 234, 173, 89, 234, 176, 97, 223, 174, 106, 163, 121, 72, 91, 52, 16, 81, 46, 6, 121, 86, 40, 159, 121, 65, 161, 109, 41, 160, 110, 42, 163, 116, 51, 161, 109, 39, 163, 111, 43, 157, 115, 52, 163, 121, 57, 157, 113, 50, 168, 130, 66, 147, 109, 55, 102, 75, 43, 71, 54, 35, 68, 54, 26, 81, 69, 19, 61, 55, 4, 60, 52, 3, 29, 33, 6, 20, 31, 0, 33, 40, 3, 40, 41, 11, 39, 38, 0, 43, 45, 5, 36, 45, 15, 35, 50, 32, 29, 47, 12, 23, 37, 0, 33, 41, 0, 74, 86, 6, 110, 124, 40, 114, 119, 36, 89, 87, 12, 80, 85, 9, 80, 101, 26, 63, 87, 23, 50, 58, 17, + 17, 25, 3, 20, 27, 2, 13, 19, 2, 43, 47, 33, 66, 70, 50, 87, 90, 69, 67, 71, 24, 36, 35, 0, 6, 9, 0, 9, 16, 0, 7, 16, 0, 6, 15, 0, 14, 21, 2, 25, 25, 6, 27, 23, 4, 38, 29, 8, 55, 39, 18, 114, 72, 38, 85, 45, 19, 69, 32, 7, 72, 32, 10, 52, 22, 3, 44, 19, 7, 69, 30, 13, 63, 31, 14, 85, 45, 15, 102, 56, 22, 82, 41, 9, 68, 28, 5, 65, 27, 3, 65, 29, 8, 68, 34, 12, 57, 24, 5, 55, 18, 4, 83, 31, 6, 108, 56, 21, 113, 64, 26, 89, 44, 10, 71, 31, 6, 80, 38, 13, 85, 39, 12, 97, 46, 8, 124, 77, 39, 128, 80, 35, 145, 86, 33, 126, 70, 24, 110, 52, 15, 63, 21, 0, 55, 19, 2, 79, 36, 4, 110, 52, 9, 143, 83, 31, 137, 83, 29, 151, + 94, 31, 147, 93, 30, 61, 22, 1, 120, 73, 31, 130, 82, 28, 127, 82, 32, 156, 103, 46, 198, 148, 75, 189, 136, 61, 187, 130, 58, 177, 115, 40, 184, 122, 49, 168, 119, 60, 195, 151, 86, 195, 152, 88, 196, 153, 99, 176, 136, 83, 187, 139, 80, 204, 152, 81, 203, 151, 79, 196, 141, 71, 205, 153, 78, 198, 139, 63, 204, 144, 66, 199, 145, 70, 179, 129, 60, 168, 121, 57, 193, 155, 96, 177, 132, 69, 212, 166, 93, 212, 163, 89, 163, 118, 60, 124, 83, 37, 179, 136, 80, 214, 178, 111, 204, 156, 87, 203, 155, 81, 183, 139, 76, 178, 136, 71, 197, 147, 78, 205, 148, 71, 213, 150, 70, 214, 144, 63, 217, 143, 61, 221, 148, 65, 227, 160, 82, 220, 154, 75, 221, 153, 76, 220, 150, 72, 215, 146, 63, 218, 151, 71, 219, 153, 77, 222, 153, 77, 229, 162, + 89, 218, 151, 75, 217, 144, 71, 224, 151, 71, 221, 149, 70, 217, 142, 59, 225, 154, 72, 231, 159, 73, 230, 163, 78, 238, 175, 92, 238, 178, 93, 237, 175, 92, 230, 173, 93, 179, 141, 91, 79, 45, 10, 73, 39, 0, 89, 53, 9, 139, 100, 44, 141, 94, 39, 132, 81, 19, 150, 103, 42, 144, 94, 40, 132, 82, 25, 139, 95, 39, 141, 98, 40, 148, 104, 41, 155, 114, 52, 179, 140, 75, 152, 111, 57, 112, 82, 46, 96, 72, 45, 85, 68, 30, 70, 63, 9, 60, 62, 6, 52, 53, 5, 27, 37, 3, 16, 36, 0, 21, 39, 0, 43, 47, 9, 52, 52, 6, 63, 60, 15, 48, 49, 7, 34, 39, 12, 24, 36, 11, 22, 41, 0, 32, 47, 0, 51, 64, 0, 86, 97, 17, 86, 101, 20, 77, 87, 16, 70, 80, 10, 64, 85, 15, 49, 71, 12, 38, 47, 8, + 50, 55, 28, 38, 42, 15, 17, 24, 10, 30, 33, 17, 36, 36, 12, 23, 21, 3, 31, 35, 4, 25, 29, 0, 10, 11, 3, 10, 14, 2, 21, 27, 5, 39, 42, 15, 60, 58, 26, 71, 68, 37, 73, 63, 42, 69, 57, 36, 97, 74, 45, 100, 57, 24, 89, 47, 16, 65, 33, 7, 65, 28, 6, 40, 13, 1, 52, 23, 10, 58, 25, 7, 64, 32, 14, 88, 45, 13, 111, 67, 25, 74, 36, 11, 58, 22, 3, 51, 19, 4, 73, 32, 9, 45, 20, 5, 48, 17, 0, 54, 20, 2, 84, 38, 7, 108, 62, 25, 102, 54, 15, 72, 33, 6, 77, 35, 5, 92, 46, 16, 98, 50, 20, 81, 38, 11, 96, 54, 23, 132, 89, 43, 115, 60, 19, 94, 45, 13, 125, 74, 33, 80, 36, 9, 61, 20, 0, 78, 31, 2, 99, 47, 7, 84, 36, 3, 81, 38, 3, 91, + 45, 7, 90, 44, 8, 60, 21, 1, 74, 36, 9, 84, 40, 10, 82, 42, 9, 116, 72, 22, 170, 115, 45, 174, 124, 55, 145, 92, 34, 145, 86, 27, 156, 99, 31, 130, 79, 22, 153, 101, 41, 181, 140, 82, 206, 167, 103, 205, 165, 104, 180, 136, 81, 199, 158, 91, 214, 170, 99, 205, 154, 81, 204, 153, 81, 196, 142, 66, 203, 147, 70, 212, 165, 93, 202, 155, 87, 143, 99, 46, 177, 142, 89, 187, 150, 92, 198, 157, 89, 215, 170, 99, 192, 151, 84, 132, 90, 40, 125, 76, 36, 195, 158, 100, 175, 135, 79, 171, 123, 60, 182, 144, 80, 189, 145, 81, 204, 151, 79, 211, 146, 68, 213, 142, 61, 210, 133, 50, 210, 133, 49, 221, 150, 68, 221, 154, 74, 219, 152, 74, 220, 153, 74, 220, 151, 70, 218, 144, 62, 211, 142, 61, 208, 138, 59, 214, 146, 72, 214, 145, + 70, 214, 146, 71, 222, 156, 77, 226, 155, 75, 225, 158, 77, 221, 148, 69, 231, 161, 77, 234, 166, 81, 234, 167, 80, 234, 168, 83, 238, 181, 99, 235, 183, 102, 199, 152, 89, 91, 51, 20, 82, 44, 1, 87, 47, 1, 115, 69, 15, 132, 84, 28, 106, 56, 12, 99, 48, 4, 86, 40, 4, 76, 38, 4, 91, 54, 12, 104, 64, 20, 120, 74, 20, 141, 96, 36, 163, 121, 60, 178, 134, 72, 160, 115, 56, 129, 97, 59, 108, 83, 52, 78, 65, 27, 51, 48, 4, 54, 60, 14, 41, 47, 9, 27, 39, 1, 19, 41, 0, 22, 40, 0, 38, 39, 0, 58, 56, 15, 75, 74, 43, 70, 68, 36, 47, 49, 5, 34, 39, 3, 21, 30, 5, 19, 31, 1, 34, 43, 1, 53, 59, 5, 47, 53, 6, 38, 42, 2, 49, 50, 2, 50, 59, 9, 27, 33, 5, 16, 22, 2, + 30, 33, 5, 22, 23, 1, 23, 27, 3, 45, 49, 19, 45, 52, 24, 24, 26, 5, 42, 42, 10, 60, 59, 17, 45, 46, 17, 35, 40, 11, 52, 53, 16, 63, 58, 15, 71, 60, 15, 71, 57, 10, 79, 55, 13, 65, 48, 13, 89, 58, 29, 91, 47, 21, 87, 51, 21, 62, 30, 4, 61, 24, 5, 38, 16, 0, 54, 23, 7, 45, 18, 4, 73, 37, 15, 89, 43, 15, 103, 63, 19, 66, 31, 7, 52, 19, 3, 53, 21, 5, 83, 38, 13, 45, 20, 5, 49, 20, 6, 63, 28, 4, 70, 28, 6, 113, 65, 30, 124, 72, 28, 66, 28, 5, 68, 30, 4, 97, 47, 16, 86, 42, 7, 91, 45, 13, 76, 42, 9, 105, 64, 32, 111, 62, 22, 65, 32, 11, 110, 70, 39, 77, 38, 9, 42, 14, 0, 42, 13, 1, 50, 17, 0, 53, 23, 0, 43, 13, 0, 37, + 10, 0, 22, 7, 0, 36, 11, 0, 52, 20, 1, 60, 23, 1, 60, 25, 1, 81, 39, 5, 129, 78, 28, 129, 81, 29, 118, 72, 22, 121, 66, 14, 154, 98, 34, 147, 95, 35, 152, 101, 42, 135, 93, 42, 169, 130, 76, 190, 150, 92, 196, 157, 97, 189, 152, 93, 208, 168, 104, 209, 163, 97, 209, 166, 96, 192, 140, 71, 198, 148, 75, 211, 168, 99, 196, 154, 88, 146, 101, 49, 154, 115, 66, 185, 149, 91, 169, 128, 68, 209, 170, 101, 204, 165, 101, 160, 121, 64, 124, 80, 34, 162, 120, 67, 158, 127, 77, 101, 58, 23, 181, 141, 82, 197, 152, 84, 209, 147, 68, 210, 138, 58, 204, 124, 42, 199, 111, 29, 205, 123, 41, 210, 137, 56, 212, 144, 67, 215, 149, 73, 216, 148, 68, 214, 146, 67, 209, 140, 61, 212, 146, 68, 215, 145, 74, 213, 142, 65, 211, 135, + 56, 213, 139, 63, 218, 151, 75, 224, 157, 81, 225, 156, 78, 224, 157, 77, 230, 164, 83, 240, 175, 91, 239, 177, 91, 236, 173, 87, 234, 181, 96, 224, 178, 111, 208, 173, 115, 99, 58, 21, 95, 52, 5, 97, 52, 5, 74, 37, 6, 43, 20, 4, 27, 13, 2, 51, 26, 9, 41, 18, 2, 44, 19, 0, 62, 32, 0, 104, 66, 15, 117, 76, 24, 144, 103, 45, 171, 130, 67, 173, 128, 68, 152, 108, 50, 135, 103, 62, 106, 82, 50, 98, 80, 40, 58, 52, 8, 48, 54, 11, 35, 47, 12, 25, 40, 0, 24, 46, 0, 25, 37, 1, 37, 37, 0, 63, 58, 11, 80, 69, 21, 81, 70, 13, 71, 63, 2, 62, 59, 11, 46, 50, 27, 25, 29, 9, 46, 43, 0, 72, 66, 4, 65, 61, 13, 48, 48, 19, 84, 83, 35, 96, 98, 40, 41, 39, 8, 22, 25, 0, + 39, 41, 7, 29, 31, 3, 39, 40, 9, 52, 53, 12, 74, 75, 16, 82, 83, 26, 81, 75, 20, 64, 58, 5, 49, 44, 4, 25, 31, 0, 26, 34, 5, 19, 19, 1, 35, 22, 4, 55, 38, 9, 65, 45, 7, 63, 47, 15, 82, 48, 23, 75, 35, 14, 82, 50, 20, 47, 24, 2, 52, 21, 5, 57, 24, 5, 43, 14, 2, 47, 16, 4, 71, 34, 12, 94, 47, 17, 71, 33, 8, 67, 28, 6, 58, 23, 3, 62, 28, 7, 75, 33, 8, 57, 27, 6, 43, 23, 4, 66, 32, 6, 68, 28, 5, 94, 45, 19, 124, 75, 27, 74, 34, 7, 79, 35, 5, 89, 47, 13, 94, 48, 14, 103, 53, 16, 112, 70, 25, 133, 86, 37, 94, 57, 16, 104, 63, 24, 98, 58, 24, 68, 41, 16, 32, 15, 2, 12, 1, 0, 6, 1, 0, 4, 1, 0, 4, 1, 0, 2, + 1, 1, 0, 1, 0, 3, 0, 0, 18, 6, 0, 37, 15, 0, 43, 15, 0, 45, 17, 0, 88, 43, 8, 106, 55, 14, 91, 47, 7, 103, 58, 10, 124, 78, 22, 143, 96, 36, 145, 96, 35, 127, 78, 26, 128, 78, 23, 137, 90, 35, 181, 141, 89, 197, 160, 99, 193, 150, 94, 220, 184, 115, 219, 180, 113, 191, 145, 78, 187, 142, 73, 202, 161, 95, 198, 158, 97, 143, 100, 49, 129, 86, 39, 175, 136, 80, 169, 132, 76, 182, 141, 82, 199, 162, 102, 171, 135, 72, 160, 124, 68, 156, 117, 61, 174, 139, 84, 157, 123, 72, 197, 156, 92, 207, 149, 76, 213, 146, 67, 208, 135, 56, 210, 131, 51, 199, 113, 32, 202, 123, 44, 203, 131, 53, 211, 143, 67, 215, 147, 70, 213, 145, 64, 214, 150, 72, 216, 154, 79, 216, 152, 75, 210, 144, 67, 207, 139, 62, 208, 139, + 60, 212, 139, 62, 215, 142, 65, 219, 153, 76, 219, 152, 72, 220, 155, 75, 226, 164, 83, 233, 170, 87, 238, 176, 90, 237, 182, 97, 226, 177, 96, 215, 179, 117, 218, 185, 127, 110, 74, 32, 70, 36, 8, 26, 10, 1, 21, 10, 2, 79, 58, 25, 160, 126, 71, 180, 141, 80, 161, 124, 73, 93, 67, 33, 98, 61, 19, 98, 59, 14, 127, 86, 28, 154, 113, 56, 169, 129, 66, 176, 134, 71, 165, 121, 64, 124, 89, 48, 112, 86, 53, 89, 69, 29, 51, 48, 1, 45, 50, 1, 37, 44, 3, 27, 38, 0, 25, 37, 0, 21, 29, 0, 41, 40, 0, 64, 56, 0, 81, 64, 1, 86, 69, 5, 81, 69, 5, 72, 66, 20, 49, 55, 37, 21, 31, 15, 39, 41, 4, 60, 58, 5, 66, 61, 14, 65, 60, 19, 66, 53, 8, 61, 49, 2, 62, 50, 0, 59, 49, 1, + 11, 15, 0, 27, 36, 3, 22, 24, 2, 17, 23, 0, 39, 35, 5, 49, 41, 4, 50, 45, 3, 49, 43, 5, 68, 52, 22, 27, 28, 0, 26, 29, 1, 41, 33, 7, 38, 30, 10, 41, 32, 12, 66, 48, 16, 73, 51, 26, 79, 41, 14, 85, 48, 20, 87, 52, 21, 53, 29, 5, 66, 28, 8, 52, 21, 4, 55, 22, 6, 52, 21, 2, 80, 40, 14, 97, 46, 13, 69, 27, 5, 69, 27, 6, 69, 30, 8, 58, 25, 6, 73, 32, 7, 41, 14, 0, 36, 20, 8, 69, 36, 8, 70, 33, 3, 97, 49, 15, 117, 65, 27, 95, 50, 12, 89, 49, 9, 84, 45, 11, 99, 55, 16, 106, 57, 15, 116, 74, 25, 151, 101, 45, 145, 101, 40, 131, 90, 32, 120, 83, 29, 144, 96, 37, 102, 75, 23, 98, 71, 24, 71, 54, 17, 49, 39, 12, 17, 14, 4, 3, + 3, 0, 6, 2, 0, 5, 1, 0, 6, 3, 0, 13, 3, 0, 18, 5, 0, 22, 7, 0, 47, 19, 0, 90, 45, 8, 90, 43, 4, 104, 59, 14, 111, 65, 16, 124, 78, 28, 140, 92, 36, 140, 91, 35, 146, 98, 37, 147, 99, 41, 145, 100, 44, 176, 137, 80, 200, 164, 106, 210, 175, 111, 220, 184, 117, 207, 167, 107, 189, 147, 85, 188, 149, 89, 192, 160, 100, 156, 115, 63, 145, 105, 55, 179, 142, 85, 199, 164, 101, 155, 118, 64, 172, 133, 73, 154, 113, 57, 157, 119, 65, 143, 104, 51, 162, 126, 72, 186, 149, 91, 201, 154, 84, 214, 155, 80, 212, 149, 72, 214, 150, 72, 204, 137, 59, 198, 126, 50, 199, 128, 52, 201, 129, 53, 200, 130, 53, 202, 132, 55, 205, 135, 57, 209, 143, 65, 214, 152, 78, 213, 149, 73, 211, 142, 66, 209, 143, 65, 205, 136, + 58, 206, 136, 60, 213, 143, 68, 220, 154, 76, 220, 155, 77, 216, 149, 68, 223, 159, 77, 226, 161, 79, 234, 173, 88, 234, 181, 99, 222, 177, 105, 228, 197, 132, 205, 182, 132, 55, 43, 29, 19, 11, 1, 58, 42, 16, 146, 116, 61, 181, 143, 86, 186, 146, 88, 194, 153, 92, 197, 154, 97, 193, 152, 97, 182, 142, 88, 149, 108, 56, 116, 76, 28, 142, 104, 51, 155, 112, 54, 154, 109, 50, 147, 105, 54, 87, 53, 23, 112, 79, 44, 99, 77, 37, 63, 57, 12, 50, 52, 3, 35, 38, 1, 25, 28, 0, 20, 26, 1, 17, 24, 0, 32, 33, 0, 53, 46, 0, 64, 54, 1, 64, 55, 1, 55, 51, 3, 39, 40, 3, 30, 40, 11, 26, 35, 6, 48, 49, 0, 57, 54, 1, 59, 50, 0, 70, 54, 0, 62, 48, 1, 70, 60, 0, 70, 60, 1, 62, 55, 0, + 36, 40, 13, 34, 39, 6, 26, 28, 2, 39, 38, 6, 65, 55, 13, 78, 63, 23, 69, 59, 15, 79, 68, 30, 90, 68, 34, 65, 56, 30, 52, 44, 24, 62, 49, 23, 65, 50, 24, 73, 49, 22, 81, 48, 15, 69, 42, 21, 94, 51, 22, 75, 36, 12, 77, 45, 22, 66, 32, 9, 68, 33, 11, 72, 33, 7, 85, 38, 9, 64, 26, 3, 77, 37, 9, 81, 38, 9, 85, 38, 9, 87, 40, 11, 81, 39, 10, 59, 25, 3, 64, 27, 7, 29, 9, 1, 31, 13, 6, 62, 32, 14, 88, 45, 10, 94, 46, 11, 112, 60, 20, 97, 57, 15, 88, 55, 11, 117, 77, 20, 127, 88, 34, 112, 72, 22, 121, 80, 25, 142, 101, 39, 170, 114, 45, 181, 134, 56, 170, 130, 54, 176, 133, 57, 172, 138, 53, 173, 144, 57, 171, 143, 59, 179, 145, 66, 166, 140, 61, 94, + 81, 30, 51, 44, 17, 37, 29, 13, 26, 18, 8, 22, 13, 3, 29, 14, 3, 31, 17, 2, 36, 17, 1, 51, 22, 2, 88, 47, 7, 100, 56, 9, 107, 66, 20, 98, 57, 10, 116, 70, 20, 137, 90, 33, 142, 98, 38, 155, 108, 52, 138, 95, 41, 153, 112, 58, 189, 159, 106, 190, 158, 102, 219, 185, 125, 213, 175, 116, 199, 160, 99, 185, 147, 86, 195, 162, 100, 177, 143, 85, 141, 105, 56, 187, 150, 92, 188, 151, 94, 179, 145, 87, 176, 139, 78, 197, 167, 104, 186, 154, 97, 128, 88, 40, 182, 151, 97, 196, 156, 93, 211, 160, 89, 214, 159, 88, 211, 151, 77, 206, 146, 71, 200, 135, 61, 197, 130, 54, 202, 133, 59, 202, 132, 57, 204, 137, 61, 204, 136, 59, 208, 140, 63, 207, 139, 60, 204, 139, 67, 207, 142, 66, 204, 138, 60, 200, 131, 56, 203, 131, + 59, 205, 137, 62, 212, 145, 71, 219, 158, 84, 217, 151, 78, 215, 141, 62, 217, 147, 64, 228, 162, 80, 231, 169, 89, 234, 179, 96, 216, 175, 106, 225, 195, 129, 164, 145, 109, 71, 56, 36, 142, 116, 62, 170, 136, 75, 171, 137, 80, 175, 138, 84, 186, 146, 93, 187, 149, 93, 196, 158, 103, 201, 166, 110, 198, 158, 104, 197, 156, 101, 190, 152, 98, 169, 134, 82, 163, 125, 68, 143, 103, 52, 106, 67, 27, 98, 65, 29, 83, 53, 21, 97, 69, 33, 78, 60, 12, 71, 67, 16, 42, 48, 2, 32, 36, 1, 19, 27, 1, 18, 26, 0, 28, 33, 0, 39, 38, 0, 37, 34, 0, 36, 37, 0, 31, 36, 1, 16, 30, 1, 16, 24, 0, 39, 36, 0, 70, 57, 0, 75, 61, 6, 54, 42, 0, 59, 46, 0, 59, 52, 0, 54, 51, 6, 28, 27, 2, 20, 17, 0, + 51, 42, 6, 64, 57, 20, 81, 76, 34, 45, 45, 15, 37, 36, 10, 56, 47, 15, 84, 73, 34, 123, 109, 64, 121, 104, 56, 103, 85, 44, 53, 42, 14, 38, 24, 4, 60, 39, 7, 92, 61, 25, 73, 38, 12, 54, 30, 11, 70, 33, 12, 68, 33, 4, 64, 36, 8, 59, 32, 12, 84, 44, 16, 96, 47, 14, 77, 29, 2, 35, 12, 0, 78, 40, 13, 83, 39, 11, 95, 44, 15, 98, 50, 17, 79, 37, 12, 76, 38, 13, 59, 32, 7, 65, 44, 15, 61, 43, 10, 60, 40, 12, 77, 47, 12, 103, 58, 14, 119, 69, 24, 114, 70, 19, 124, 81, 26, 138, 95, 33, 155, 117, 47, 142, 111, 39, 130, 93, 30, 154, 109, 40, 168, 119, 47, 174, 134, 57, 181, 141, 61, 176, 142, 63, 177, 150, 67, 173, 146, 66, 177, 145, 67, 171, 141, 64, 174, 142, 68, 170, + 143, 67, 160, 134, 63, 164, 133, 71, 150, 121, 66, 131, 103, 52, 125, 94, 49, 97, 70, 33, 45, 26, 8, 42, 22, 2, 54, 26, 4, 80, 44, 9, 97, 56, 14, 109, 67, 21, 122, 83, 36, 125, 81, 35, 147, 105, 54, 133, 90, 38, 129, 88, 35, 122, 80, 33, 154, 122, 70, 180, 147, 93, 202, 167, 107, 227, 195, 132, 225, 193, 128, 206, 171, 109, 189, 153, 95, 164, 126, 74, 127, 92, 51, 95, 61, 29, 121, 84, 42, 149, 109, 57, 151, 110, 57, 189, 153, 89, 189, 150, 87, 167, 135, 81, 171, 136, 80, 192, 142, 72, 208, 155, 80, 211, 156, 79, 207, 150, 75, 203, 140, 66, 200, 134, 59, 209, 144, 66, 207, 141, 66, 206, 138, 64, 207, 138, 65, 204, 134, 56, 208, 137, 59, 202, 134, 58, 199, 132, 58, 197, 127, 52, 190, 118, 46, 193, 120, 47, 199, 125, + 51, 205, 135, 59, 211, 144, 67, 214, 149, 74, 215, 147, 71, 216, 146, 68, 220, 151, 72, 222, 157, 75, 229, 169, 85, 227, 170, 90, 214, 176, 109, 207, 186, 132, 152, 131, 91, 144, 117, 58, 166, 132, 74, 169, 134, 76, 171, 136, 80, 174, 137, 81, 172, 136, 79, 176, 139, 84, 180, 144, 89, 187, 150, 95, 183, 148, 92, 186, 151, 93, 191, 152, 98, 190, 153, 101, 195, 154, 102, 187, 149, 97, 173, 138, 88, 168, 132, 84, 123, 93, 57, 98, 66, 36, 120, 82, 41, 108, 85, 38, 53, 51, 6, 34, 37, 1, 24, 32, 0, 25, 32, 0, 31, 37, 0, 41, 46, 0, 39, 45, 1, 38, 46, 0, 43, 48, 0, 44, 43, 0, 46, 42, 1, 65, 49, 0, 99, 75, 0, 80, 59, 8, 52, 39, 0, 35, 28, 5, 19, 26, 0, 19, 32, 0, 11, 27, 1, 4, 15, 0, + 86, 75, 21, 81, 76, 39, 91, 84, 40, 68, 64, 29, 49, 49, 24, 76, 72, 37, 104, 93, 44, 92, 82, 24, 54, 44, 0, 52, 39, 7, 22, 16, 0, 52, 42, 7, 84, 64, 18, 98, 64, 23, 46, 36, 12, 45, 34, 11, 69, 36, 11, 70, 39, 6, 58, 35, 6, 83, 50, 18, 106, 58, 23, 102, 47, 14, 55, 20, 2, 34, 19, 8, 90, 44, 12, 82, 37, 8, 88, 38, 9, 94, 41, 12, 89, 44, 10, 130, 79, 32, 150, 113, 49, 148, 117, 49, 146, 119, 50, 125, 97, 38, 97, 73, 25, 93, 59, 13, 99, 60, 17, 121, 74, 21, 132, 84, 29, 147, 103, 37, 154, 119, 47, 166, 131, 54, 155, 124, 49, 158, 123, 47, 154, 117, 40, 154, 116, 42, 165, 127, 50, 167, 135, 62, 172, 142, 69, 172, 144, 71, 173, 141, 72, 171, 141, 72, 170, 141, 70, 169, + 140, 71, 167, 136, 71, 168, 135, 74, 175, 139, 79, 187, 145, 84, 178, 137, 79, 179, 138, 79, 134, 99, 57, 76, 51, 27, 55, 31, 10, 49, 24, 6, 68, 38, 6, 97, 62, 24, 150, 117, 64, 151, 114, 60, 144, 104, 55, 127, 88, 40, 129, 94, 45, 96, 57, 15, 119, 77, 36, 161, 126, 73, 184, 151, 94, 219, 185, 122, 221, 187, 121, 210, 172, 110, 189, 155, 98, 159, 122, 68, 118, 84, 40, 112, 78, 38, 141, 104, 53, 178, 132, 70, 186, 140, 78, 188, 142, 82, 188, 144, 86, 169, 133, 81, 169, 129, 68, 195, 141, 67, 201, 145, 72, 201, 146, 71, 204, 143, 69, 198, 134, 56, 201, 136, 62, 205, 140, 67, 205, 143, 69, 203, 137, 62, 205, 137, 60, 206, 135, 58, 202, 132, 54, 200, 131, 56, 195, 122, 46, 185, 114, 39, 180, 106, 35, 194, 122, 47, 203, 133, + 59, 207, 138, 63, 211, 143, 66, 213, 145, 67, 213, 145, 69, 216, 150, 73, 219, 155, 80, 225, 163, 82, 228, 167, 84, 224, 173, 93, 204, 168, 111, 181, 160, 116, 162, 134, 82, 157, 127, 66, 163, 130, 73, 166, 130, 77, 164, 129, 75, 167, 132, 79, 166, 134, 82, 167, 134, 80, 170, 135, 82, 170, 135, 83, 173, 140, 85, 176, 144, 85, 178, 144, 87, 178, 145, 90, 179, 145, 94, 180, 144, 94, 179, 144, 94, 181, 146, 94, 181, 147, 93, 180, 145, 95, 173, 138, 89, 165, 133, 79, 153, 128, 71, 129, 111, 59, 75, 71, 29, 34, 39, 3, 39, 45, 0, 51, 57, 0, 48, 53, 1, 39, 45, 1, 45, 47, 0, 61, 56, 1, 75, 62, 0, 88, 69, 0, 93, 73, 2, 67, 54, 4, 48, 40, 5, 12, 13, 1, 6, 14, 0, 12, 30, 0, 16, 37, 0, 10, 27, 1, + 79, 78, 54, 100, 95, 55, 118, 105, 48, 87, 80, 26, 33, 34, 13, 42, 37, 6, 102, 84, 30, 111, 105, 57, 47, 44, 18, 48, 37, 14, 50, 38, 8, 54, 42, 9, 114, 81, 27, 47, 40, 2, 43, 38, 5, 47, 41, 13, 66, 40, 7, 50, 28, 0, 50, 28, 6, 82, 44, 17, 123, 68, 31, 91, 42, 14, 63, 36, 12, 47, 27, 13, 81, 42, 13, 92, 45, 13, 79, 33, 5, 106, 45, 9, 128, 77, 28, 148, 103, 38, 148, 113, 42, 153, 124, 54, 163, 135, 57, 163, 134, 64, 146, 119, 50, 129, 104, 38, 104, 79, 28, 104, 72, 19, 140, 94, 33, 137, 91, 35, 163, 123, 51, 173, 137, 61, 168, 135, 53, 169, 137, 59, 167, 138, 54, 148, 118, 45, 150, 114, 43, 169, 136, 64, 170, 136, 69, 169, 136, 70, 170, 140, 74, 169, 137, 73, 170, 135, 76, 175, + 137, 81, 177, 140, 82, 182, 143, 86, 186, 147, 90, 178, 141, 83, 184, 142, 86, 180, 141, 82, 173, 132, 77, 179, 137, 81, 161, 123, 69, 100, 73, 38, 62, 38, 14, 87, 56, 26, 149, 116, 67, 151, 113, 58, 156, 118, 63, 157, 116, 67, 157, 121, 64, 146, 105, 53, 170, 123, 60, 178, 130, 67, 193, 143, 83, 193, 147, 88, 193, 145, 85, 192, 142, 80, 184, 142, 79, 184, 139, 80, 180, 138, 79, 173, 133, 74, 165, 127, 69, 168, 126, 68, 172, 130, 71, 170, 134, 75, 162, 129, 71, 161, 127, 77, 185, 138, 72, 191, 138, 68, 201, 146, 74, 201, 145, 73, 199, 138, 65, 189, 132, 59, 198, 141, 72, 200, 140, 71, 197, 136, 70, 199, 133, 64, 204, 138, 64, 206, 136, 61, 195, 122, 45, 192, 121, 46, 198, 130, 55, 191, 124, 50, 193, 125, 50, 198, 129, 55, 207, 136, + 59, 205, 135, 57, 209, 138, 60, 212, 144, 69, 214, 148, 71, 220, 157, 78, 217, 156, 80, 218, 157, 77, 227, 168, 87, 228, 179, 105, 192, 162, 109, 161, 132, 85, 156, 128, 71, 159, 127, 66, 159, 128, 72, 164, 131, 76, 165, 132, 76, 170, 137, 79, 165, 133, 78, 170, 135, 80, 170, 140, 84, 164, 133, 76, 164, 135, 77, 168, 135, 81, 169, 137, 80, 168, 136, 85, 168, 137, 89, 169, 139, 88, 170, 141, 87, 170, 138, 84, 169, 137, 86, 169, 137, 84, 175, 138, 86, 179, 144, 90, 181, 146, 92, 191, 151, 94, 176, 144, 80, 127, 114, 57, 76, 75, 21, 41, 50, 1, 31, 40, 1, 26, 35, 0, 31, 34, 0, 48, 43, 0, 76, 65, 0, 90, 76, 1, 83, 71, 2, 71, 68, 9, 56, 55, 11, 18, 22, 4, 8, 15, 0, 17, 33, 0, 25, 46, 0, 19, 37, 1, + 39, 37, 4, 30, 27, 0, 35, 31, 1, 39, 35, 1, 16, 20, 0, 12, 15, 1, 30, 28, 6, 35, 26, 7, 70, 60, 30, 77, 64, 33, 66, 56, 21, 82, 58, 19, 60, 47, 14, 43, 38, 2, 22, 22, 0, 41, 38, 8, 67, 42, 10, 56, 35, 4, 63, 40, 10, 92, 54, 21, 96, 49, 15, 52, 23, 9, 68, 39, 11, 45, 26, 11, 72, 36, 9, 91, 44, 12, 105, 53, 15, 115, 59, 16, 142, 92, 29, 142, 101, 33, 149, 119, 44, 149, 123, 47, 156, 130, 56, 161, 135, 57, 152, 130, 51, 156, 134, 53, 120, 95, 35, 127, 93, 37, 141, 102, 41, 164, 122, 55, 169, 131, 60, 173, 141, 62, 168, 139, 57, 165, 137, 57, 165, 135, 57, 149, 123, 48, 153, 124, 48, 165, 131, 63, 175, 142, 71, 165, 132, 68, 166, 132, 73, 162, 127, 70, 167, 130, 74, 180, + 139, 84, 176, 139, 84, 171, 131, 79, 177, 138, 85, 181, 139, 85, 177, 139, 85, 177, 139, 85, 170, 134, 81, 176, 136, 82, 172, 133, 78, 165, 127, 75, 167, 131, 74, 166, 129, 75, 159, 122, 73, 162, 125, 75, 158, 119, 66, 160, 122, 69, 178, 130, 75, 179, 135, 77, 182, 132, 74, 179, 134, 77, 180, 138, 79, 172, 132, 74, 176, 134, 75, 180, 135, 75, 174, 137, 74, 174, 136, 75, 171, 135, 74, 171, 129, 68, 175, 131, 71, 186, 138, 76, 185, 139, 78, 168, 136, 72, 147, 117, 67, 177, 138, 78, 193, 145, 76, 199, 151, 81, 196, 145, 76, 202, 145, 76, 192, 138, 69, 193, 145, 80, 200, 155, 92, 198, 152, 89, 201, 149, 82, 203, 143, 73, 202, 137, 65, 200, 133, 59, 197, 129, 56, 193, 124, 52, 188, 124, 51, 192, 125, 51, 196, 129, 55, 203, 136, 63, 203, 132, + 56, 199, 123, 47, 206, 135, 61, 210, 143, 67, 213, 150, 72, 218, 158, 82, 218, 159, 83, 221, 161, 83, 222, 159, 78, 220, 174, 100, 177, 145, 92, 152, 125, 69, 154, 125, 64, 156, 125, 64, 157, 126, 64, 161, 132, 72, 164, 135, 75, 165, 138, 76, 161, 135, 72, 163, 134, 74, 165, 136, 79, 162, 133, 78, 161, 132, 81, 169, 137, 87, 169, 137, 84, 168, 136, 85, 167, 135, 83, 167, 134, 83, 166, 136, 82, 164, 134, 79, 165, 135, 83, 170, 137, 88, 171, 139, 94, 171, 141, 87, 175, 141, 87, 180, 150, 89, 158, 136, 61, 168, 142, 72, 178, 148, 92, 148, 133, 83, 94, 90, 44, 44, 50, 7, 41, 43, 0, 46, 43, 0, 70, 64, 1, 92, 86, 13, 88, 91, 25, 97, 105, 38, 82, 89, 20, 38, 47, 7, 13, 26, 0, 17, 31, 0, 23, 43, 0, 19, 34, 2, + 3, 5, 0, 4, 7, 0, 12, 14, 4, 23, 25, 9, 6, 12, 0, 6, 10, 0, 19, 20, 1, 12, 13, 1, 2, 5, 0, 44, 34, 9, 84, 67, 26, 112, 88, 42, 68, 57, 15, 29, 24, 0, 12, 15, 0, 24, 25, 6, 55, 37, 13, 87, 53, 11, 99, 63, 21, 83, 43, 9, 49, 20, 1, 56, 28, 12, 59, 25, 5, 65, 31, 7, 80, 40, 10, 101, 58, 16, 126, 79, 22, 126, 78, 17, 157, 111, 40, 149, 113, 35, 150, 124, 45, 165, 140, 50, 158, 137, 53, 156, 135, 52, 160, 142, 56, 163, 140, 57, 151, 127, 53, 140, 114, 45, 159, 131, 54, 154, 122, 49, 169, 135, 57, 163, 131, 50, 157, 131, 52, 164, 133, 59, 168, 136, 62, 157, 129, 60, 163, 134, 59, 163, 131, 65, 161, 133, 69, 149, 125, 60, 133, 107, 50, 154, 123, 67, 164, 127, 72, 169, + 132, 76, 183, 143, 88, 179, 140, 85, 180, 141, 86, 168, 134, 83, 163, 129, 77, 167, 128, 77, 168, 131, 78, 165, 128, 75, 161, 125, 72, 155, 120, 65, 157, 122, 68, 154, 118, 70, 144, 113, 63, 153, 120, 72, 149, 115, 64, 151, 116, 64, 171, 130, 74, 175, 133, 76, 181, 138, 77, 180, 135, 76, 178, 136, 76, 161, 122, 68, 168, 122, 62, 174, 127, 65, 176, 132, 74, 167, 127, 70, 178, 130, 73, 178, 131, 69, 168, 124, 68, 175, 136, 83, 183, 138, 80, 135, 102, 55, 142, 112, 74, 178, 135, 68, 189, 144, 74, 187, 139, 66, 190, 135, 66, 196, 145, 78, 193, 148, 84, 195, 153, 90, 191, 153, 95, 199, 150, 87, 201, 140, 70, 198, 130, 58, 201, 134, 61, 194, 129, 59, 196, 131, 61, 190, 128, 59, 194, 134, 58, 191, 122, 48, 195, 126, 50, 194, 125, 50, 193, 123, + 50, 197, 125, 50, 200, 136, 60, 211, 145, 72, 208, 143, 71, 213, 151, 77, 218, 161, 84, 216, 158, 85, 215, 154, 75, 217, 176, 103, 176, 144, 85, 156, 131, 65, 159, 131, 69, 159, 129, 69, 160, 127, 68, 169, 136, 79, 169, 138, 78, 167, 139, 77, 167, 140, 78, 165, 138, 79, 164, 137, 80, 166, 136, 81, 165, 135, 84, 168, 137, 86, 167, 136, 82, 163, 135, 78, 161, 130, 75, 162, 129, 77, 157, 121, 63, 164, 132, 76, 159, 129, 69, 162, 132, 78, 172, 137, 89, 148, 125, 58, 138, 114, 46, 168, 143, 83, 172, 149, 75, 165, 142, 71, 167, 139, 78, 161, 133, 74, 163, 134, 78, 151, 128, 80, 94, 88, 40, 57, 58, 15, 72, 76, 19, 90, 101, 39, 92, 104, 38, 91, 101, 22, 69, 76, 8, 37, 48, 2, 24, 40, 1, 25, 39, 0, 25, 37, 0, 19, 28, 0, + 3, 4, 0, 5, 9, 0, 4, 7, 0, 14, 17, 5, 5, 11, 3, 2, 5, 0, 21, 20, 6, 6, 9, 1, 3, 8, 0, 36, 29, 4, 73, 59, 22, 87, 60, 15, 56, 50, 14, 49, 44, 14, 43, 46, 22, 30, 29, 4, 43, 32, 3, 60, 36, 9, 93, 47, 14, 55, 30, 7, 55, 22, 4, 61, 33, 13, 48, 20, 3, 49, 23, 6, 99, 60, 21, 148, 100, 35, 121, 75, 19, 137, 88, 22, 165, 125, 40, 165, 130, 45, 161, 135, 50, 165, 140, 54, 165, 140, 54, 157, 138, 53, 163, 141, 59, 159, 135, 55, 164, 141, 56, 151, 129, 48, 159, 132, 46, 160, 132, 52, 166, 135, 57, 155, 130, 54, 152, 125, 55, 157, 126, 56, 161, 130, 62, 166, 135, 69, 158, 129, 59, 155, 124, 61, 155, 125, 67, 162, 130, 71, 155, 126, 65, 158, 130, 68, 169, 135, 78, 172, + 138, 80, 164, 130, 76, 170, 131, 80, 168, 136, 81, 165, 131, 74, 164, 130, 73, 161, 129, 73, 162, 130, 73, 160, 127, 69, 160, 125, 71, 164, 130, 73, 155, 125, 63, 120, 91, 42, 142, 108, 56, 141, 108, 53, 129, 96, 45, 124, 93, 41, 168, 130, 75, 164, 128, 69, 172, 132, 77, 154, 120, 61, 163, 124, 64, 157, 121, 66, 151, 117, 60, 144, 110, 53, 162, 122, 67, 170, 126, 71, 166, 126, 72, 159, 123, 68, 161, 124, 73, 166, 131, 80, 166, 128, 73, 70, 48, 22, 109, 81, 41, 170, 128, 66, 183, 136, 66, 156, 98, 33, 167, 111, 43, 188, 139, 70, 185, 141, 78, 187, 149, 93, 198, 155, 93, 201, 148, 81, 196, 133, 64, 184, 109, 36, 184, 108, 33, 191, 123, 52, 195, 131, 63, 192, 133, 64, 186, 120, 46, 193, 122, 49, 190, 118, 46, 190, 117, 43, 188, 119, + 42, 197, 130, 57, 195, 129, 55, 194, 125, 55, 198, 130, 60, 203, 141, 67, 210, 151, 78, 217, 163, 91, 216, 164, 91, 214, 169, 96, 171, 142, 75, 158, 131, 66, 163, 133, 69, 167, 137, 73, 163, 135, 70, 165, 134, 69, 162, 132, 68, 160, 132, 70, 165, 136, 78, 166, 138, 80, 163, 138, 76, 159, 130, 69, 141, 114, 54, 160, 131, 69, 159, 129, 60, 159, 126, 62, 169, 133, 74, 167, 132, 73, 163, 125, 70, 166, 127, 72, 167, 127, 71, 165, 131, 73, 171, 139, 82, 142, 119, 55, 107, 88, 32, 153, 129, 59, 154, 130, 62, 151, 130, 60, 143, 122, 54, 139, 120, 52, 142, 122, 59, 143, 120, 64, 142, 122, 64, 139, 121, 63, 118, 109, 54, 89, 93, 33, 60, 65, 12, 37, 44, 4, 28, 33, 0, 23, 31, 0, 25, 37, 0, 29, 38, 0, 28, 39, 1, 21, 33, 1, + 6, 10, 0, 8, 11, 0, 0, 3, 0, 1, 1, 0, 6, 11, 5, 5, 10, 2, 17, 17, 5, 5, 9, 0, 3, 9, 0, 35, 32, 8, 94, 76, 40, 53, 37, 4, 12, 17, 2, 34, 32, 5, 88, 81, 37, 80, 77, 46, 59, 49, 16, 57, 42, 11, 62, 34, 7, 67, 40, 8, 48, 25, 4, 50, 30, 10, 63, 39, 15, 94, 72, 35, 147, 113, 49, 151, 109, 40, 147, 103, 32, 138, 97, 29, 154, 119, 40, 172, 141, 53, 167, 140, 51, 166, 141, 52, 165, 141, 52, 158, 136, 52, 157, 135, 58, 162, 141, 61, 160, 138, 57, 153, 131, 51, 152, 128, 46, 159, 135, 56, 153, 130, 53, 155, 131, 58, 162, 137, 66, 172, 139, 72, 175, 143, 76, 163, 135, 70, 157, 131, 67, 153, 127, 58, 136, 112, 47, 154, 127, 67, 167, 132, 74, 169, 138, 81, 171, 135, 78, 169, + 134, 76, 160, 128, 72, 158, 129, 70, 162, 130, 70, 155, 127, 65, 157, 128, 66, 151, 123, 61, 158, 124, 66, 157, 123, 63, 164, 128, 73, 166, 131, 74, 159, 130, 65, 143, 117, 55, 144, 117, 52, 140, 109, 51, 137, 106, 52, 116, 89, 39, 165, 130, 70, 149, 121, 55, 151, 120, 56, 146, 117, 53, 147, 119, 56, 160, 124, 68, 142, 112, 51, 139, 109, 54, 144, 111, 61, 157, 118, 62, 164, 122, 68, 166, 126, 69, 168, 124, 68, 163, 124, 70, 82, 57, 30, 38, 28, 15, 111, 85, 49, 180, 140, 76, 181, 134, 63, 173, 116, 51, 187, 136, 69, 196, 152, 85, 189, 150, 95, 198, 159, 98, 205, 152, 83, 200, 144, 75, 192, 130, 58, 184, 113, 39, 178, 106, 36, 192, 128, 57, 203, 147, 78, 195, 134, 64, 190, 115, 44, 188, 119, 43, 189, 120, 43, 191, 120, 48, 194, 125, + 53, 195, 132, 63, 190, 124, 56, 188, 122, 48, 196, 129, 54, 202, 138, 65, 206, 145, 73, 206, 152, 79, 211, 160, 88, 208, 164, 96, 170, 144, 77, 164, 136, 72, 170, 142, 79, 168, 138, 75, 168, 140, 75, 167, 139, 74, 167, 138, 76, 163, 135, 73, 168, 137, 75, 167, 132, 72, 168, 138, 72, 161, 131, 65, 159, 129, 62, 163, 130, 63, 167, 132, 68, 161, 124, 62, 169, 127, 66, 176, 136, 76, 179, 138, 81, 184, 142, 84, 178, 135, 80, 175, 136, 78, 179, 147, 84, 142, 127, 49, 144, 124, 52, 155, 136, 58, 144, 128, 48, 145, 129, 52, 146, 129, 54, 142, 123, 55, 137, 119, 53, 130, 116, 50, 128, 114, 49, 127, 110, 51, 123, 109, 53, 119, 106, 55, 87, 82, 43, 32, 37, 9, 22, 28, 2, 12, 18, 0, 17, 21, 0, 24, 27, 0, 29, 35, 0, 31, 38, 0, + 22, 21, 2, 16, 16, 0, 0, 2, 0, 0, 0, 0, 1, 2, 0, 8, 13, 6, 9, 12, 3, 5, 9, 1, 2, 9, 1, 31, 29, 7, 94, 74, 40, 42, 28, 4, 3, 11, 0, 5, 13, 0, 15, 19, 0, 33, 32, 6, 106, 89, 38, 75, 67, 39, 59, 45, 14, 67, 41, 3, 74, 49, 18, 136, 113, 56, 157, 129, 60, 157, 124, 56, 159, 126, 57, 145, 119, 48, 163, 130, 50, 187, 158, 63, 174, 147, 60, 168, 142, 56, 174, 148, 60, 159, 136, 52, 150, 130, 52, 155, 134, 52, 166, 140, 64, 161, 136, 62, 159, 136, 58, 153, 130, 55, 151, 129, 56, 163, 136, 66, 156, 132, 60, 165, 137, 72, 163, 135, 71, 167, 137, 78, 177, 144, 83, 168, 138, 76, 157, 132, 63, 154, 126, 62, 152, 126, 62, 157, 128, 67, 160, 126, 67, 155, 126, 66, 162, 130, 70, 163, + 132, 69, 159, 128, 66, 160, 129, 66, 144, 117, 52, 157, 127, 69, 154, 124, 59, 140, 114, 47, 145, 119, 53, 160, 125, 66, 162, 126, 70, 159, 128, 67, 156, 126, 65, 159, 131, 68, 160, 134, 69, 155, 127, 61, 160, 128, 63, 164, 127, 66, 160, 128, 67, 149, 122, 56, 160, 132, 58, 144, 117, 49, 144, 118, 56, 148, 121, 59, 138, 112, 46, 140, 109, 52, 157, 126, 68, 141, 107, 53, 140, 107, 54, 148, 114, 53, 145, 113, 50, 107, 88, 43, 15, 15, 3, 23, 19, 9, 146, 119, 68, 186, 142, 72, 174, 127, 57, 201, 151, 82, 207, 159, 91, 201, 158, 96, 192, 157, 99, 204, 154, 85, 209, 150, 76, 204, 148, 78, 199, 138, 67, 197, 133, 62, 196, 139, 74, 197, 148, 83, 193, 140, 73, 203, 143, 74, 193, 123, 48, 189, 115, 39, 194, 123, 47, 192, 123, 51, 193, 137, + 71, 184, 133, 72, 193, 141, 75, 186, 124, 51, 191, 124, 51, 198, 131, 58, 204, 141, 66, 204, 146, 71, 208, 158, 84, 199, 160, 94, 161, 130, 72, 163, 129, 70, 163, 132, 70, 159, 129, 67, 167, 134, 74, 178, 144, 78, 168, 133, 73, 167, 133, 70, 162, 127, 59, 174, 134, 74, 183, 142, 81, 179, 139, 78, 192, 156, 83, 180, 145, 76, 183, 145, 80, 181, 140, 76, 179, 138, 73, 185, 147, 82, 173, 134, 75, 188, 147, 76, 167, 122, 65, 150, 114, 58, 181, 142, 86, 170, 139, 75, 161, 136, 62, 153, 138, 54, 151, 136, 50, 146, 131, 44, 145, 132, 48, 140, 124, 51, 132, 115, 46, 125, 110, 43, 119, 106, 41, 118, 104, 41, 111, 98, 40, 113, 96, 45, 114, 95, 55, 95, 86, 52, 26, 26, 3, 13, 16, 0, 15, 17, 0, 27, 29, 0, 39, 45, 0, 48, 51, 2, + 22, 19, 2, 26, 23, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 5, 7, 3, 13, 16, 5, 9, 12, 3, 3, 7, 0, 16, 16, 3, 73, 56, 24, 36, 29, 5, 15, 17, 5, 13, 15, 4, 7, 13, 1, 22, 27, 3, 39, 32, 3, 60, 47, 13, 67, 58, 15, 93, 75, 24, 150, 124, 59, 162, 137, 62, 155, 131, 54, 159, 130, 66, 159, 131, 59, 165, 139, 57, 166, 140, 55, 173, 149, 59, 175, 151, 65, 162, 140, 60, 157, 134, 58, 151, 128, 52, 151, 130, 50, 153, 130, 50, 155, 132, 52, 151, 130, 54, 159, 132, 64, 161, 135, 67, 157, 134, 64, 159, 135, 64, 158, 133, 63, 171, 144, 77, 162, 137, 69, 162, 132, 72, 174, 144, 79, 158, 132, 66, 157, 131, 66, 155, 128, 66, 159, 130, 70, 167, 138, 77, 162, 133, 70, 160, 133, 70, 160, 132, 67, 161, + 134, 69, 157, 131, 64, 151, 125, 56, 154, 125, 61, 156, 126, 62, 158, 131, 61, 148, 125, 53, 147, 121, 55, 153, 122, 61, 159, 128, 68, 159, 129, 66, 154, 125, 63, 152, 123, 62, 157, 123, 63, 164, 123, 61, 171, 126, 63, 172, 134, 72, 162, 131, 65, 154, 122, 58, 151, 123, 58, 157, 124, 62, 158, 127, 62, 149, 123, 56, 147, 124, 56, 155, 122, 61, 153, 117, 53, 151, 116, 55, 129, 101, 47, 149, 116, 59, 156, 129, 65, 113, 96, 49, 23, 22, 10, 125, 107, 65, 176, 141, 81, 184, 141, 75, 185, 139, 73, 196, 151, 85, 206, 164, 98, 191, 153, 96, 198, 152, 86, 201, 141, 69, 207, 144, 70, 207, 146, 76, 193, 132, 61, 185, 126, 55, 193, 143, 79, 190, 144, 85, 197, 148, 84, 202, 141, 69, 200, 136, 60, 201, 132, 58, 204, 135, 61, 198, 133, 61, 189, 142, + 81, 182, 138, 81, 195, 142, 78, 191, 135, 64, 191, 132, 63, 195, 134, 61, 204, 146, 70, 205, 151, 80, 209, 167, 97, 187, 151, 93, 167, 129, 73, 168, 133, 72, 165, 129, 67, 159, 124, 65, 171, 135, 75, 178, 142, 83, 175, 140, 81, 171, 136, 75, 163, 129, 63, 171, 130, 65, 179, 136, 71, 187, 146, 78, 191, 148, 85, 195, 158, 85, 184, 145, 77, 179, 137, 69, 199, 155, 86, 182, 143, 78, 185, 146, 79, 166, 129, 65, 152, 117, 55, 179, 139, 71, 167, 127, 66, 149, 120, 64, 163, 134, 70, 155, 133, 60, 153, 136, 52, 153, 139, 51, 144, 131, 46, 145, 125, 54, 133, 116, 43, 131, 115, 41, 127, 109, 44, 123, 107, 40, 120, 102, 44, 106, 90, 43, 110, 91, 46, 105, 89, 55, 40, 39, 12, 24, 25, 0, 27, 26, 0, 40, 35, 0, 47, 43, 0, 43, 40, 0, + 17, 17, 2, 28, 27, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 10, 12, 1, 14, 17, 6, 9, 14, 3, 22, 26, 11, 51, 45, 22, 26, 20, 0, 2, 4, 0, 11, 12, 3, 6, 11, 1, 13, 14, 2, 9, 13, 1, 27, 27, 5, 115, 95, 42, 156, 131, 61, 151, 127, 57, 161, 135, 61, 152, 131, 54, 169, 140, 78, 165, 135, 59, 182, 155, 65, 165, 142, 56, 165, 142, 58, 162, 140, 56, 165, 141, 60, 159, 137, 61, 156, 134, 56, 153, 130, 49, 154, 131, 53, 152, 130, 48, 147, 126, 51, 158, 131, 64, 175, 144, 75, 173, 145, 74, 162, 137, 64, 165, 138, 73, 166, 140, 72, 165, 138, 73, 160, 136, 69, 159, 135, 70, 161, 133, 72, 170, 135, 76, 181, 145, 86, 173, 139, 81, 165, 137, 75, 166, 135, 77, 173, 139, 79, 166, 135, 75, 161, + 131, 69, 157, 131, 62, 154, 131, 53, 154, 128, 58, 148, 122, 49, 158, 129, 62, 159, 132, 63, 160, 135, 70, 156, 129, 67, 161, 128, 71, 161, 130, 71, 161, 130, 71, 158, 124, 66, 149, 116, 58, 160, 124, 65, 168, 131, 72, 183, 142, 73, 170, 133, 69, 144, 115, 50, 148, 117, 57, 166, 128, 70, 170, 133, 77, 159, 128, 65, 154, 124, 58, 145, 110, 44, 145, 109, 49, 125, 100, 44, 122, 105, 44, 99, 82, 29, 162, 126, 69, 116, 94, 52, 60, 51, 31, 181, 156, 101, 177, 141, 77, 165, 131, 76, 180, 137, 75, 197, 156, 90, 185, 146, 86, 180, 142, 82, 206, 148, 69, 208, 143, 63, 206, 139, 68, 204, 144, 73, 203, 150, 81, 186, 138, 76, 184, 140, 80, 185, 139, 76, 193, 135, 65, 197, 131, 53, 203, 138, 58, 209, 146, 67, 211, 146, 72, 201, 144, 75, 183, 139, + 83, 185, 148, 89, 200, 151, 85, 196, 144, 72, 190, 134, 62, 195, 139, 68, 203, 147, 77, 203, 155, 83, 208, 171, 109, 173, 135, 81, 177, 136, 80, 174, 136, 77, 174, 135, 78, 169, 133, 75, 164, 129, 67, 173, 136, 79, 174, 138, 78, 172, 133, 74, 154, 116, 50, 169, 131, 50, 157, 120, 51, 167, 126, 61, 190, 147, 82, 191, 150, 85, 193, 154, 79, 189, 152, 78, 170, 132, 62, 181, 144, 72, 195, 156, 77, 138, 112, 55, 193, 157, 87, 193, 156, 88, 159, 127, 73, 143, 117, 54, 157, 130, 61, 164, 137, 69, 153, 130, 58, 157, 134, 59, 149, 128, 52, 146, 118, 53, 132, 109, 46, 139, 119, 43, 136, 115, 52, 121, 106, 45, 113, 97, 41, 105, 80, 37, 108, 82, 46, 89, 73, 40, 47, 43, 13, 28, 36, 0, 38, 40, 0, 46, 41, 0, 32, 32, 2, 21, 25, 0, + 9, 12, 2, 22, 22, 0, 4, 4, 0, 1, 1, 1, 0, 4, 0, 1, 5, 0, 11, 13, 1, 4, 5, 0, 2, 2, 0, 21, 20, 6, 52, 48, 29, 25, 21, 4, 9, 8, 0, 1, 6, 0, 3, 8, 0, 12, 13, 3, 8, 12, 0, 43, 42, 12, 100, 82, 35, 151, 119, 57, 167, 142, 61, 161, 137, 64, 168, 140, 72, 168, 143, 72, 176, 143, 67, 177, 150, 66, 162, 140, 59, 160, 137, 59, 168, 144, 65, 166, 142, 63, 177, 154, 70, 166, 147, 60, 164, 142, 59, 154, 132, 55, 154, 134, 56, 145, 125, 52, 181, 148, 76, 167, 140, 70, 157, 133, 63, 156, 133, 61, 166, 141, 63, 160, 133, 65, 164, 138, 73, 155, 130, 66, 155, 127, 68, 155, 127, 71, 167, 135, 77, 165, 133, 73, 163, 132, 72, 158, 129, 64, 155, 126, 62, 157, 125, 66, 159, 130, 69, 163, + 131, 70, 160, 132, 67, 157, 131, 60, 150, 126, 52, 151, 124, 55, 161, 132, 61, 159, 131, 63, 159, 136, 68, 156, 131, 63, 160, 127, 69, 163, 131, 71, 159, 125, 69, 166, 130, 68, 160, 128, 65, 158, 123, 63, 184, 141, 81, 175, 140, 76, 183, 147, 76, 148, 119, 51, 173, 136, 66, 151, 114, 48, 156, 118, 59, 167, 131, 70, 146, 112, 50, 142, 114, 55, 176, 148, 82, 161, 136, 71, 153, 133, 57, 113, 94, 33, 120, 97, 43, 57, 44, 25, 93, 82, 52, 144, 121, 79, 148, 121, 66, 165, 138, 88, 180, 143, 83, 187, 150, 91, 180, 138, 78, 190, 138, 64, 202, 140, 62, 203, 137, 61, 202, 138, 68, 204, 145, 71, 190, 141, 75, 168, 126, 71, 176, 129, 71, 191, 134, 66, 193, 129, 53, 194, 125, 46, 199, 130, 50, 206, 141, 66, 205, 142, 68, 194, 143, 79, 177, 135, + 78, 189, 151, 93, 202, 154, 87, 204, 149, 77, 201, 147, 74, 202, 149, 77, 200, 150, 81, 203, 162, 91, 208, 174, 111, 181, 140, 84, 176, 136, 78, 177, 135, 78, 177, 136, 79, 174, 135, 76, 168, 132, 71, 179, 141, 83, 174, 137, 78, 172, 135, 75, 161, 126, 66, 179, 141, 74, 166, 134, 58, 176, 141, 64, 176, 139, 72, 164, 127, 72, 115, 89, 34, 148, 115, 47, 166, 129, 60, 155, 119, 61, 160, 130, 71, 148, 118, 58, 196, 159, 90, 196, 160, 94, 181, 148, 87, 151, 127, 64, 158, 134, 60, 168, 143, 68, 151, 125, 56, 153, 127, 50, 141, 117, 42, 153, 124, 49, 131, 108, 44, 124, 102, 41, 109, 88, 32, 111, 87, 35, 101, 76, 32, 102, 79, 35, 90, 71, 31, 86, 65, 30, 50, 47, 19, 29, 35, 3, 31, 38, 1, 30, 33, 1, 16, 22, 0, 12, 23, 1, + 4, 14, 0, 10, 18, 0, 2, 4, 0, 0, 2, 0, 0, 7, 0, 3, 9, 0, 19, 23, 5, 4, 10, 0, 0, 6, 0, 15, 15, 2, 47, 44, 25, 11, 12, 0, 4, 6, 0, 5, 10, 0, 5, 13, 0, 10, 10, 0, 23, 25, 4, 91, 80, 32, 77, 65, 20, 138, 114, 54, 158, 130, 66, 169, 138, 81, 172, 143, 84, 177, 146, 82, 167, 138, 64, 162, 140, 60, 164, 139, 66, 174, 148, 74, 166, 145, 68, 167, 144, 67, 168, 149, 66, 170, 148, 72, 166, 146, 71, 164, 142, 71, 168, 142, 71, 177, 147, 81, 190, 153, 90, 184, 150, 85, 184, 150, 81, 165, 139, 69, 141, 118, 50, 149, 127, 56, 145, 121, 55, 135, 114, 53, 133, 113, 51, 156, 127, 68, 165, 134, 73, 159, 129, 66, 162, 130, 66, 163, 134, 70, 154, 127, 63, 151, 123, 58, 151, 122, 56, 154, + 127, 60, 157, 128, 64, 160, 131, 66, 157, 128, 59, 158, 130, 61, 158, 131, 65, 154, 127, 61, 160, 133, 66, 173, 140, 78, 171, 134, 70, 163, 129, 67, 153, 124, 61, 161, 131, 61, 162, 132, 66, 157, 128, 58, 167, 135, 67, 169, 137, 70, 172, 139, 67, 159, 130, 59, 153, 123, 53, 145, 112, 42, 106, 75, 25, 152, 117, 56, 146, 117, 51, 159, 137, 69, 154, 134, 65, 149, 128, 57, 152, 130, 58, 137, 118, 53, 75, 62, 21, 20, 15, 4, 115, 103, 67, 103, 82, 51, 126, 99, 57, 148, 117, 70, 171, 139, 84, 187, 154, 99, 152, 107, 49, 188, 135, 61, 206, 150, 74, 193, 137, 64, 205, 150, 76, 197, 141, 70, 182, 139, 76, 162, 121, 63, 185, 134, 68, 195, 133, 58, 197, 133, 59, 198, 130, 53, 200, 128, 52, 209, 147, 68, 206, 149, 76, 188, 142, 77, 176, 139, + 82, 191, 156, 98, 210, 165, 99, 206, 155, 82, 205, 155, 84, 204, 156, 84, 202, 156, 85, 207, 169, 102, 206, 173, 114, 183, 144, 90, 177, 133, 74, 179, 137, 77, 171, 134, 74, 162, 126, 67, 166, 131, 70, 183, 147, 80, 172, 135, 76, 161, 127, 70, 159, 124, 66, 176, 139, 79, 179, 144, 81, 177, 139, 72, 170, 137, 70, 150, 117, 57, 112, 90, 39, 87, 72, 18, 106, 82, 18, 190, 151, 76, 205, 167, 93, 175, 141, 80, 205, 167, 86, 186, 154, 84, 188, 155, 89, 172, 146, 70, 183, 154, 80, 169, 142, 67, 142, 120, 51, 155, 131, 58, 143, 121, 52, 127, 107, 40, 112, 97, 31, 105, 87, 31, 88, 75, 22, 83, 68, 19, 83, 64, 19, 79, 60, 23, 72, 53, 15, 81, 59, 24, 44, 41, 13, 21, 28, 0, 30, 38, 3, 23, 24, 2, 16, 21, 0, 8, 19, 0, + 5, 15, 0, 13, 20, 0, 3, 7, 0, 0, 6, 0, 0, 6, 0, 5, 9, 1, 23, 27, 6, 6, 21, 0, 1, 22, 0, 10, 17, 2, 40, 40, 16, 7, 9, 0, 1, 6, 0, 9, 11, 0, 12, 15, 0, 16, 17, 3, 73, 70, 29, 75, 63, 25, 92, 79, 28, 141, 115, 49, 128, 102, 47, 154, 119, 64, 163, 127, 71, 181, 146, 91, 166, 142, 70, 154, 132, 60, 183, 155, 72, 188, 163, 77, 177, 155, 74, 162, 142, 67, 173, 151, 76, 185, 162, 89, 165, 144, 74, 169, 141, 76, 179, 148, 83, 191, 159, 89, 180, 149, 85, 186, 151, 86, 182, 148, 85, 185, 151, 88, 178, 147, 84, 162, 135, 68, 146, 123, 56, 140, 119, 51, 122, 104, 43, 152, 119, 61, 171, 136, 72, 155, 127, 59, 158, 131, 61, 154, 128, 57, 148, 123, 53, 149, 123, 52, 149, 123, 55, 153, + 128, 58, 162, 134, 67, 161, 134, 67, 164, 138, 71, 164, 139, 71, 152, 127, 60, 153, 122, 58, 162, 134, 65, 156, 132, 60, 156, 131, 53, 158, 127, 60, 163, 135, 65, 165, 137, 61, 167, 138, 66, 149, 122, 53, 147, 118, 53, 162, 135, 66, 168, 140, 64, 154, 126, 58, 149, 122, 52, 156, 129, 56, 132, 106, 47, 148, 119, 56, 147, 123, 55, 155, 135, 61, 143, 125, 50, 164, 139, 62, 163, 141, 65, 136, 116, 48, 56, 51, 20, 19, 17, 7, 103, 94, 63, 70, 63, 41, 106, 80, 47, 123, 93, 53, 174, 145, 97, 167, 135, 80, 169, 121, 54, 201, 152, 78, 204, 153, 83, 198, 147, 77, 214, 164, 89, 210, 161, 89, 193, 154, 94, 187, 146, 86, 200, 147, 80, 200, 139, 68, 200, 141, 68, 202, 136, 61, 207, 142, 64, 214, 157, 81, 216, 169, 95, 198, 157, 92, 189, 153, + 94, 204, 170, 116, 210, 169, 104, 209, 165, 93, 209, 167, 97, 208, 166, 98, 204, 164, 97, 206, 173, 109, 197, 167, 111, 174, 136, 81, 173, 135, 74, 167, 130, 72, 171, 136, 77, 164, 132, 69, 171, 137, 74, 185, 147, 84, 180, 142, 81, 173, 141, 83, 179, 146, 90, 181, 148, 93, 201, 163, 99, 186, 148, 81, 172, 141, 76, 140, 114, 53, 114, 92, 37, 158, 127, 69, 150, 122, 68, 138, 107, 52, 188, 154, 79, 178, 145, 77, 204, 168, 91, 183, 149, 83, 176, 143, 78, 162, 141, 70, 185, 155, 78, 157, 135, 64, 141, 120, 52, 165, 136, 62, 148, 123, 60, 164, 139, 69, 120, 104, 37, 121, 97, 36, 137, 109, 42, 114, 96, 38, 82, 65, 17, 96, 76, 24, 82, 63, 19, 53, 33, 5, 44, 34, 6, 36, 33, 0, 119, 110, 50, 111, 94, 27, 51, 47, 11, 6, 15, 1, + 4, 10, 0, 12, 18, 0, 5, 11, 0, 0, 7, 0, 0, 3, 0, 9, 10, 2, 25, 30, 6, 8, 25, 0, 1, 21, 0, 9, 14, 1, 30, 30, 9, 1, 3, 0, 0, 3, 0, 4, 8, 0, 20, 21, 5, 90, 76, 39, 95, 76, 31, 53, 48, 16, 84, 72, 27, 137, 111, 48, 110, 93, 38, 101, 85, 35, 128, 105, 47, 157, 129, 68, 153, 131, 63, 166, 141, 72, 161, 139, 67, 165, 140, 66, 162, 140, 65, 169, 146, 69, 170, 148, 72, 168, 150, 66, 158, 141, 61, 160, 137, 71, 184, 150, 87, 187, 159, 86, 179, 155, 78, 170, 147, 74, 168, 143, 74, 185, 151, 86, 182, 151, 85, 167, 141, 72, 164, 139, 70, 151, 128, 57, 121, 103, 40, 124, 101, 34, 142, 119, 47, 151, 126, 54, 142, 119, 49, 149, 125, 53, 156, 129, 61, 161, 131, 68, 174, 138, 73, 186, + 146, 83, 181, 148, 78, 179, 146, 81, 184, 150, 83, 178, 150, 77, 164, 140, 64, 162, 135, 59, 159, 131, 59, 152, 128, 57, 166, 138, 64, 163, 136, 65, 168, 139, 67, 156, 131, 58, 158, 135, 60, 151, 126, 58, 152, 123, 53, 160, 130, 61, 171, 142, 69, 161, 133, 62, 167, 141, 63, 166, 141, 63, 146, 124, 52, 153, 133, 60, 148, 126, 58, 164, 139, 74, 155, 133, 66, 163, 140, 62, 169, 146, 62, 153, 132, 60, 61, 53, 20, 11, 11, 3, 28, 26, 15, 67, 57, 37, 94, 69, 40, 139, 114, 72, 185, 157, 103, 171, 134, 77, 166, 122, 56, 175, 136, 74, 161, 123, 67, 183, 141, 78, 212, 165, 97, 207, 163, 96, 204, 169, 106, 196, 161, 96, 200, 154, 85, 211, 162, 90, 215, 167, 89, 218, 160, 82, 212, 153, 75, 217, 161, 87, 222, 179, 106, 184, 147, 89, 178, 141, + 85, 200, 169, 113, 202, 165, 102, 212, 173, 107, 214, 178, 113, 209, 172, 106, 211, 175, 112, 205, 173, 116, 180, 150, 96, 158, 125, 68, 159, 124, 65, 168, 129, 71, 160, 123, 64, 168, 131, 70, 174, 135, 75, 174, 137, 77, 179, 139, 76, 177, 138, 79, 174, 137, 82, 186, 149, 87, 169, 135, 72, 149, 119, 51, 145, 117, 53, 161, 130, 69, 158, 129, 67, 188, 150, 76, 185, 149, 79, 180, 146, 80, 177, 141, 74, 186, 148, 81, 171, 138, 64, 164, 135, 69, 165, 137, 76, 163, 137, 70, 181, 156, 79, 157, 138, 65, 163, 138, 64, 156, 130, 61, 144, 123, 54, 145, 123, 57, 148, 124, 60, 116, 92, 40, 137, 109, 44, 140, 119, 59, 80, 66, 17, 73, 59, 15, 68, 52, 11, 43, 30, 5, 70, 45, 1, 106, 80, 21, 93, 74, 32, 78, 63, 19, 81, 67, 29, 59, 57, 25, + 1, 10, 0, 9, 16, 0, 5, 16, 0, 0, 13, 0, 2, 5, 0, 13, 13, 3, 30, 33, 10, 8, 22, 0, 1, 11, 0, 10, 11, 2, 26, 26, 10, 3, 4, 0, 12, 16, 4, 19, 25, 12, 77, 73, 35, 103, 92, 38, 116, 102, 40, 103, 93, 32, 71, 63, 20, 92, 76, 30, 115, 98, 36, 98, 92, 28, 116, 105, 37, 133, 116, 48, 144, 125, 56, 141, 121, 52, 134, 116, 47, 139, 122, 54, 143, 125, 56, 158, 134, 63, 169, 146, 71, 168, 147, 69, 153, 137, 60, 170, 145, 82, 188, 156, 94, 205, 169, 90, 187, 165, 84, 182, 158, 80, 176, 152, 77, 171, 147, 76, 177, 148, 80, 173, 145, 77, 171, 145, 71, 170, 145, 69, 157, 138, 56, 155, 131, 57, 162, 137, 62, 163, 138, 62, 176, 144, 78, 175, 147, 82, 171, 138, 78, 177, 144, 78, 176, 137, 72, 198, + 160, 88, 193, 155, 81, 194, 153, 77, 187, 152, 79, 173, 144, 73, 169, 142, 65, 178, 149, 69, 151, 124, 54, 170, 141, 73, 163, 139, 71, 162, 138, 67, 168, 141, 71, 172, 142, 74, 162, 136, 65, 149, 123, 48, 148, 120, 49, 145, 119, 50, 166, 141, 73, 155, 131, 60, 153, 129, 58, 158, 133, 64, 159, 137, 68, 157, 135, 67, 155, 132, 65, 162, 135, 67, 152, 132, 61, 161, 138, 64, 168, 146, 65, 163, 142, 65, 42, 39, 15, 8, 9, 1, 9, 9, 1, 97, 78, 47, 122, 95, 54, 157, 131, 84, 170, 137, 82, 172, 128, 65, 172, 139, 78, 155, 125, 71, 154, 121, 71, 178, 143, 82, 210, 173, 104, 201, 165, 105, 201, 170, 109, 206, 174, 113, 209, 164, 95, 213, 169, 99, 218, 176, 99, 221, 173, 92, 222, 167, 87, 216, 163, 94, 222, 182, 117, 184, 149, 89, 187, 157, + 102, 189, 157, 103, 197, 161, 96, 207, 175, 109, 210, 178, 114, 211, 177, 114, 214, 178, 116, 206, 176, 117, 175, 146, 90, 157, 126, 70, 155, 124, 68, 153, 125, 63, 158, 130, 71, 158, 128, 68, 168, 136, 79, 168, 136, 73, 173, 137, 70, 169, 128, 71, 162, 134, 70, 170, 138, 80, 173, 143, 79, 146, 121, 61, 166, 136, 74, 182, 150, 84, 188, 155, 92, 165, 131, 70, 162, 126, 64, 139, 106, 55, 166, 129, 61, 186, 150, 84, 202, 168, 86, 175, 145, 72, 165, 136, 68, 173, 143, 73, 165, 143, 71, 180, 151, 76, 180, 151, 84, 166, 140, 72, 160, 135, 69, 119, 101, 41, 129, 109, 51, 119, 97, 39, 143, 116, 48, 131, 112, 55, 79, 72, 20, 63, 55, 8, 57, 47, 9, 34, 26, 3, 62, 56, 0, 72, 74, 7, 32, 32, 5, 22, 25, 4, 17, 15, 0, 54, 45, 14, + 0, 10, 0, 3, 13, 0, 3, 16, 0, 0, 14, 0, 0, 4, 0, 17, 16, 6, 26, 23, 6, 4, 9, 0, 0, 4, 0, 16, 16, 7, 53, 49, 25, 79, 68, 40, 124, 103, 50, 153, 126, 63, 157, 135, 52, 142, 122, 53, 126, 110, 45, 95, 82, 24, 101, 89, 28, 84, 78, 39, 118, 105, 40, 96, 87, 30, 132, 112, 44, 132, 116, 42, 132, 116, 46, 118, 104, 37, 144, 126, 50, 151, 135, 52, 134, 120, 48, 155, 136, 55, 168, 149, 63, 157, 139, 63, 160, 142, 66, 179, 152, 82, 190, 160, 92, 193, 162, 95, 193, 166, 88, 182, 158, 85, 173, 149, 79, 185, 158, 95, 175, 149, 89, 183, 154, 90, 176, 151, 82, 169, 148, 71, 173, 149, 78, 179, 150, 84, 177, 147, 83, 180, 151, 86, 174, 144, 79, 159, 139, 72, 167, 141, 71, 163, 141, 61, 165, 135, 61, 180, + 156, 69, 168, 149, 72, 154, 130, 49, 159, 132, 55, 169, 142, 61, 174, 146, 69, 185, 155, 79, 156, 131, 55, 157, 129, 60, 161, 136, 66, 170, 144, 74, 166, 138, 70, 176, 144, 80, 165, 140, 73, 155, 129, 61, 147, 122, 50, 153, 128, 58, 161, 138, 66, 162, 140, 69, 157, 136, 66, 148, 127, 56, 152, 130, 61, 158, 134, 67, 166, 140, 64, 149, 129, 56, 141, 122, 54, 159, 137, 69, 172, 149, 73, 147, 126, 60, 21, 21, 6, 11, 10, 4, 15, 14, 5, 94, 76, 38, 128, 99, 49, 141, 107, 60, 172, 138, 78, 175, 138, 76, 153, 126, 73, 120, 84, 51, 139, 102, 55, 184, 147, 89, 211, 177, 111, 200, 171, 112, 192, 163, 105, 205, 176, 116, 190, 151, 87, 207, 167, 96, 211, 169, 99, 221, 175, 101, 218, 169, 94, 210, 164, 94, 223, 187, 116, 190, 158, 101, 188, 160, + 108, 185, 157, 109, 191, 160, 102, 195, 164, 103, 200, 164, 104, 215, 180, 118, 211, 179, 115, 210, 181, 117, 178, 151, 94, 157, 129, 70, 162, 131, 72, 164, 136, 74, 164, 132, 76, 168, 136, 79, 173, 142, 80, 162, 129, 67, 166, 132, 71, 164, 130, 70, 160, 128, 69, 166, 136, 80, 173, 144, 84, 175, 148, 83, 181, 150, 85, 179, 149, 78, 195, 161, 94, 186, 156, 92, 160, 135, 74, 123, 103, 48, 163, 132, 64, 183, 149, 79, 173, 143, 74, 160, 135, 68, 163, 140, 80, 171, 142, 72, 158, 134, 66, 155, 133, 64, 174, 149, 81, 167, 139, 72, 179, 148, 80, 133, 112, 50, 113, 97, 37, 116, 94, 36, 117, 97, 40, 103, 87, 34, 84, 73, 22, 65, 59, 14, 56, 47, 12, 64, 56, 22, 52, 48, 17, 31, 31, 8, 14, 17, 0, 11, 16, 0, 13, 14, 0, 23, 16, 0, + 0, 8, 0, 1, 10, 0, 1, 12, 0, 0, 9, 0, 1, 1, 1, 13, 13, 3, 15, 15, 1, 0, 0, 0, 16, 17, 10, 113, 94, 52, 152, 125, 57, 85, 72, 30, 132, 105, 43, 133, 110, 43, 113, 95, 38, 124, 103, 43, 82, 69, 23, 103, 88, 33, 96, 89, 28, 68, 61, 24, 113, 98, 31, 40, 42, 12, 91, 78, 23, 140, 122, 46, 140, 125, 54, 92, 84, 27, 120, 106, 38, 157, 137, 51, 138, 127, 47, 146, 132, 48, 149, 133, 50, 148, 131, 54, 151, 133, 59, 174, 149, 77, 185, 156, 81, 185, 157, 87, 180, 155, 83, 176, 151, 81, 171, 150, 78, 162, 142, 74, 168, 140, 78, 182, 151, 84, 177, 149, 83, 166, 137, 74, 171, 132, 75, 172, 132, 77, 180, 141, 80, 159, 126, 70, 168, 138, 76, 165, 141, 75, 165, 145, 78, 161, 141, 69, 159, 135, 62, 173, + 143, 64, 166, 144, 59, 171, 144, 61, 165, 137, 60, 146, 120, 45, 166, 140, 67, 167, 141, 66, 156, 129, 55, 171, 137, 68, 164, 141, 71, 158, 135, 66, 166, 139, 71, 167, 136, 73, 163, 136, 71, 159, 133, 66, 157, 134, 64, 147, 124, 53, 153, 128, 61, 162, 137, 70, 168, 144, 77, 162, 137, 68, 157, 130, 64, 148, 125, 55, 156, 132, 56, 145, 128, 54, 153, 134, 57, 156, 136, 62, 155, 135, 62, 105, 95, 48, 19, 18, 11, 14, 14, 5, 11, 12, 4, 40, 30, 7, 120, 92, 44, 182, 152, 90, 198, 165, 101, 153, 123, 69, 134, 111, 68, 76, 49, 21, 144, 105, 58, 195, 162, 97, 203, 169, 108, 195, 167, 114, 167, 134, 84, 199, 169, 118, 171, 133, 78, 202, 165, 100, 206, 171, 101, 221, 183, 110, 221, 177, 102, 211, 170, 100, 211, 177, 112, 177, 153, 102, 184, 157, + 105, 175, 148, 104, 181, 147, 92, 195, 167, 106, 199, 167, 103, 214, 184, 122, 210, 181, 121, 201, 173, 118, 172, 143, 89, 167, 133, 78, 174, 141, 83, 171, 143, 79, 164, 135, 72, 160, 129, 69, 162, 131, 70, 153, 125, 61, 158, 129, 59, 165, 132, 70, 144, 110, 52, 155, 121, 62, 169, 136, 74, 161, 133, 70, 158, 134, 67, 166, 139, 68, 158, 130, 64, 173, 146, 81, 169, 142, 80, 184, 155, 87, 169, 149, 67, 186, 156, 84, 167, 137, 70, 156, 131, 63, 163, 134, 73, 158, 130, 64, 159, 135, 63, 179, 151, 77, 189, 163, 88, 158, 134, 67, 146, 123, 58, 117, 96, 35, 120, 102, 39, 118, 98, 40, 109, 87, 34, 107, 87, 40, 82, 70, 23, 64, 55, 16, 61, 52, 16, 63, 53, 20, 59, 54, 23, 44, 40, 10, 14, 16, 3, 8, 12, 0, 10, 9, 0, 8, 8, 0, + 1, 8, 0, 3, 9, 0, 0, 7, 0, 1, 2, 0, 1, 1, 0, 11, 12, 5, 4, 7, 0, 12, 13, 9, 138, 114, 53, 160, 129, 59, 142, 122, 43, 61, 58, 16, 84, 66, 27, 155, 137, 61, 137, 123, 52, 121, 103, 38, 54, 50, 15, 124, 109, 47, 98, 94, 31, 65, 63, 24, 95, 89, 29, 63, 58, 7, 46, 45, 16, 128, 108, 30, 141, 126, 49, 106, 98, 27, 92, 88, 35, 139, 122, 44, 141, 133, 44, 117, 113, 32, 135, 115, 45, 150, 136, 59, 141, 126, 57, 150, 133, 62, 186, 159, 84, 178, 154, 77, 178, 153, 79, 184, 155, 75, 172, 146, 64, 166, 142, 65, 166, 143, 75, 164, 132, 80, 161, 129, 72, 156, 122, 67, 170, 135, 75, 158, 124, 67, 157, 122, 62, 126, 99, 46, 143, 120, 53, 157, 136, 59, 155, 136, 61, 154, 136, 67, 159, 136, 67, 165, + 142, 64, 168, 144, 63, 191, 153, 74, 159, 131, 58, 163, 137, 63, 164, 135, 63, 178, 146, 67, 166, 137, 61, 141, 116, 52, 160, 132, 65, 161, 132, 68, 173, 143, 79, 166, 138, 74, 168, 139, 73, 169, 139, 72, 157, 132, 66, 159, 132, 62, 148, 127, 59, 157, 133, 69, 151, 130, 63, 145, 124, 53, 149, 122, 58, 161, 132, 64, 148, 127, 54, 147, 130, 60, 150, 133, 59, 148, 129, 57, 139, 119, 43, 95, 81, 36, 19, 20, 8, 13, 12, 4, 8, 9, 1, 25, 22, 9, 117, 94, 48, 191, 165, 104, 197, 170, 109, 158, 132, 78, 109, 83, 46, 76, 45, 22, 154, 121, 73, 199, 168, 108, 187, 156, 102, 155, 136, 93, 155, 124, 73, 163, 134, 85, 121, 88, 47, 194, 161, 99, 212, 184, 120, 210, 177, 109, 221, 186, 113, 210, 173, 102, 204, 170, 107, 150, 129, 85, 154, 126, + 78, 182, 151, 101, 173, 135, 84, 173, 147, 92, 165, 137, 77, 182, 155, 96, 177, 149, 97, 161, 132, 83, 153, 117, 66, 158, 125, 68, 162, 127, 71, 158, 129, 65, 167, 135, 68, 148, 118, 58, 153, 124, 60, 151, 125, 60, 153, 127, 59, 142, 114, 49, 148, 119, 53, 158, 127, 65, 149, 122, 57, 149, 125, 57, 149, 127, 59, 151, 126, 56, 135, 106, 57, 143, 120, 54, 163, 141, 64, 175, 149, 75, 126, 106, 38, 179, 153, 76, 200, 171, 94, 185, 154, 82, 192, 156, 76, 167, 136, 71, 140, 123, 50, 165, 140, 67, 185, 157, 81, 170, 144, 67, 158, 132, 64, 125, 107, 38, 143, 117, 49, 129, 106, 44, 121, 95, 36, 110, 87, 41, 86, 70, 29, 73, 59, 24, 65, 51, 19, 64, 55, 24, 59, 54, 23, 35, 29, 3, 40, 36, 11, 8, 10, 2, 2, 4, 0, 9, 13, 0, + 0, 4, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 13, 14, 3, 8, 9, 1, 54, 48, 26, 121, 94, 42, 146, 120, 47, 145, 130, 43, 96, 90, 27, 35, 35, 18, 139, 117, 51, 137, 115, 39, 81, 69, 19, 49, 42, 8, 86, 79, 41, 118, 111, 48, 95, 89, 31, 99, 90, 27, 113, 97, 33, 42, 38, 12, 90, 80, 20, 143, 127, 53, 138, 127, 52, 74, 72, 24, 114, 105, 34, 142, 133, 41, 125, 119, 34, 132, 120, 44, 149, 136, 53, 157, 143, 64, 145, 130, 51, 173, 148, 69, 170, 147, 73, 170, 148, 75, 179, 154, 79, 177, 150, 84, 167, 142, 81, 148, 123, 68, 115, 93, 40, 134, 109, 51, 141, 110, 54, 156, 122, 62, 147, 118, 57, 135, 106, 50, 112, 88, 34, 118, 101, 34, 140, 120, 48, 165, 137, 68, 169, 144, 69, 168, 142, 72, 160, + 137, 66, 167, 138, 64, 170, 141, 65, 171, 143, 68, 175, 144, 71, 178, 148, 69, 168, 140, 61, 156, 127, 56, 136, 108, 45, 148, 118, 54, 167, 138, 72, 167, 140, 73, 174, 145, 77, 170, 142, 75, 172, 144, 78, 172, 144, 80, 162, 138, 71, 149, 126, 59, 143, 121, 52, 152, 129, 60, 146, 124, 58, 152, 124, 63, 162, 135, 64, 141, 119, 48, 147, 126, 52, 164, 140, 56, 159, 136, 60, 136, 119, 48, 146, 121, 55, 57, 48, 20, 15, 14, 8, 10, 11, 3, 29, 25, 9, 73, 58, 32, 145, 121, 72, 123, 105, 65, 148, 130, 78, 106, 84, 42, 93, 63, 31, 168, 139, 90, 179, 153, 99, 181, 157, 105, 144, 126, 84, 150, 123, 74, 121, 87, 49, 104, 71, 30, 189, 159, 102, 195, 167, 109, 201, 171, 109, 225, 193, 122, 224, 193, 124, 212, 182, 117, 184, 164, 114, 110, 84, + 43, 169, 139, 85, 184, 157, 103, 91, 72, 40, 62, 42, 13, 103, 78, 34, 129, 102, 51, 146, 116, 59, 152, 122, 61, 155, 126, 62, 148, 119, 55, 154, 127, 55, 153, 125, 57, 143, 117, 51, 149, 124, 59, 143, 121, 55, 150, 127, 53, 153, 128, 62, 153, 128, 59, 156, 131, 63, 151, 130, 61, 150, 127, 59, 155, 130, 67, 156, 132, 66, 166, 140, 77, 168, 140, 72, 170, 144, 72, 164, 139, 77, 166, 140, 76, 170, 141, 75, 189, 160, 86, 185, 159, 86, 138, 115, 63, 133, 109, 50, 139, 117, 51, 150, 124, 61, 184, 155, 86, 148, 124, 54, 144, 118, 51, 132, 113, 45, 127, 107, 39, 113, 91, 35, 136, 108, 43, 109, 86, 39, 75, 59, 23, 76, 57, 21, 70, 53, 20, 82, 63, 28, 76, 63, 26, 63, 55, 29, 47, 34, 6, 54, 45, 14, 21, 25, 1, 25, 33, 0, + 17, 19, 4, 14, 15, 0, 1, 1, 0, 0, 0, 0, 8, 7, 4, 58, 54, 31, 143, 121, 68, 142, 114, 53, 120, 103, 41, 139, 124, 46, 139, 128, 40, 125, 117, 30, 44, 42, 14, 110, 91, 32, 124, 107, 30, 93, 84, 20, 42, 36, 10, 45, 42, 21, 86, 77, 30, 71, 63, 14, 68, 61, 15, 51, 45, 12, 23, 21, 2, 62, 57, 19, 117, 106, 43, 145, 133, 52, 60, 60, 16, 76, 74, 18, 124, 116, 33, 131, 123, 37, 122, 112, 38, 129, 119, 39, 138, 127, 44, 160, 139, 60, 155, 133, 60, 169, 140, 73, 171, 145, 75, 175, 148, 78, 165, 141, 73, 139, 116, 60, 122, 94, 46, 119, 99, 39, 122, 102, 41, 127, 106, 42, 126, 103, 42, 138, 110, 52, 126, 100, 47, 122, 98, 38, 108, 91, 30, 128, 112, 41, 158, 131, 59, 183, 156, 79, 183, 155, 82, 164, + 138, 64, 165, 138, 68, 175, 139, 69, 172, 143, 70, 174, 142, 68, 181, 151, 76, 168, 142, 68, 133, 108, 46, 148, 117, 50, 143, 114, 50, 179, 146, 79, 176, 143, 76, 173, 144, 78, 165, 140, 73, 181, 151, 84, 169, 144, 78, 162, 139, 73, 165, 141, 76, 153, 130, 61, 143, 122, 51, 145, 121, 57, 170, 141, 71, 173, 146, 69, 141, 121, 49, 131, 113, 43, 161, 137, 56, 168, 142, 58, 171, 144, 60, 145, 122, 50, 59, 51, 25, 12, 11, 5, 13, 12, 5, 9, 9, 1, 13, 13, 5, 22, 21, 10, 28, 23, 12, 128, 110, 71, 105, 84, 44, 98, 70, 33, 167, 145, 93, 177, 154, 100, 151, 128, 74, 114, 95, 51, 137, 108, 54, 141, 108, 51, 149, 118, 66, 179, 151, 91, 193, 167, 109, 191, 161, 98, 215, 182, 113, 217, 185, 118, 208, 179, 115, 202, 181, 129, 112, 93, + 51, 107, 84, 40, 126, 106, 58, 111, 87, 40, 133, 102, 50, 142, 108, 53, 153, 122, 66, 158, 126, 67, 152, 125, 58, 157, 132, 60, 160, 134, 58, 153, 127, 53, 144, 120, 52, 144, 122, 66, 179, 167, 112, 192, 180, 126, 153, 130, 61, 146, 125, 54, 155, 132, 63, 155, 131, 61, 165, 138, 65, 162, 134, 59, 156, 131, 58, 147, 126, 54, 156, 132, 68, 161, 136, 69, 177, 150, 81, 182, 154, 82, 174, 151, 81, 173, 144, 79, 184, 156, 84, 178, 154, 81, 182, 157, 89, 158, 133, 66, 180, 146, 75, 110, 93, 40, 152, 127, 64, 166, 136, 63, 147, 117, 54, 143, 119, 51, 128, 110, 43, 132, 110, 43, 106, 82, 32, 45, 35, 12, 76, 56, 19, 103, 80, 38, 77, 65, 30, 85, 69, 24, 75, 61, 27, 75, 64, 23, 96, 81, 27, 156, 144, 68, 76, 71, 17, 26, 34, 1, + 120, 118, 64, 100, 102, 59, 52, 54, 10, 25, 25, 9, 84, 68, 34, 128, 102, 51, 131, 105, 47, 133, 107, 42, 120, 115, 32, 138, 129, 43, 134, 130, 40, 102, 100, 29, 54, 51, 18, 82, 70, 18, 119, 105, 36, 97, 89, 16, 39, 40, 12, 49, 44, 14, 85, 77, 26, 103, 95, 32, 93, 86, 32, 107, 99, 43, 48, 45, 15, 38, 38, 15, 125, 113, 46, 143, 132, 49, 88, 85, 23, 80, 76, 18, 100, 96, 29, 119, 113, 32, 109, 102, 30, 106, 97, 29, 109, 100, 28, 88, 75, 21, 144, 121, 49, 154, 129, 57, 136, 115, 49, 159, 133, 68, 171, 141, 74, 153, 126, 64, 115, 93, 42, 128, 106, 45, 129, 110, 42, 123, 106, 38, 123, 96, 36, 130, 99, 42, 132, 99, 42, 121, 98, 35, 99, 81, 19, 116, 97, 28, 154, 125, 57, 164, 136, 63, 136, 111, 46, 170, + 138, 60, 163, 132, 54, 154, 127, 50, 166, 137, 60, 176, 146, 76, 192, 157, 79, 185, 153, 80, 142, 118, 55, 119, 99, 37, 169, 140, 64, 168, 141, 70, 165, 140, 77, 166, 142, 73, 166, 140, 68, 157, 133, 66, 176, 148, 78, 172, 146, 76, 174, 149, 74, 168, 144, 69, 153, 135, 65, 140, 122, 52, 161, 136, 57, 177, 147, 67, 166, 141, 63, 149, 129, 56, 159, 136, 57, 153, 129, 50, 171, 143, 64, 143, 123, 58, 25, 24, 10, 11, 10, 2, 11, 11, 2, 9, 8, 0, 8, 7, 0, 5, 4, 0, 7, 5, 0, 53, 44, 26, 60, 49, 28, 114, 93, 47, 172, 150, 92, 153, 127, 71, 152, 125, 71, 136, 113, 61, 163, 136, 81, 157, 124, 71, 175, 148, 94, 174, 146, 91, 198, 170, 109, 190, 161, 100, 194, 158, 95, 201, 168, 105, 186, 153, 96, 187, 163, 110, 119, 100, + 64, 97, 73, 19, 139, 112, 46, 120, 95, 39, 148, 116, 62, 165, 134, 78, 153, 126, 63, 151, 125, 55, 155, 128, 58, 150, 124, 53, 160, 132, 60, 154, 127, 54, 141, 117, 53, 161, 143, 82, 179, 162, 102, 169, 149, 89, 156, 132, 66, 144, 122, 57, 146, 123, 55, 151, 126, 57, 143, 118, 48, 144, 120, 46, 166, 138, 56, 141, 118, 43, 142, 118, 52, 152, 128, 59, 172, 146, 70, 173, 148, 75, 164, 138, 69, 173, 148, 80, 172, 149, 78, 192, 165, 87, 166, 141, 72, 154, 133, 68, 147, 123, 67, 127, 105, 52, 157, 130, 69, 143, 121, 59, 134, 111, 53, 126, 106, 46, 101, 89, 41, 85, 73, 30, 87, 72, 30, 60, 47, 18, 83, 64, 21, 86, 68, 28, 83, 71, 29, 88, 71, 27, 80, 66, 23, 92, 77, 26, 101, 85, 25, 159, 140, 56, 92, 76, 22, 24, 23, 3, + 113, 105, 27, 155, 148, 66, 140, 138, 69, 81, 77, 34, 147, 119, 52, 115, 93, 35, 93, 74, 19, 117, 104, 32, 121, 115, 32, 133, 124, 44, 147, 138, 45, 126, 116, 37, 110, 99, 25, 56, 52, 7, 59, 51, 21, 111, 102, 26, 51, 50, 7, 48, 46, 18, 97, 87, 38, 141, 127, 48, 148, 137, 60, 105, 97, 42, 53, 47, 13, 18, 17, 0, 77, 66, 27, 137, 121, 33, 103, 96, 26, 80, 75, 23, 104, 98, 27, 126, 117, 36, 121, 114, 36, 111, 102, 32, 106, 101, 28, 62, 54, 21, 164, 139, 69, 165, 142, 67, 143, 119, 54, 139, 115, 53, 114, 90, 36, 142, 114, 52, 122, 100, 41, 120, 104, 36, 123, 108, 33, 124, 107, 34, 108, 86, 27, 105, 74, 28, 120, 85, 37, 119, 96, 32, 117, 98, 32, 86, 70, 17, 129, 109, 36, 159, 131, 55, 149, 125, 54, 159, + 129, 62, 144, 120, 50, 129, 112, 45, 128, 105, 46, 163, 135, 63, 183, 150, 75, 184, 152, 71, 161, 132, 61, 150, 123, 57, 160, 134, 56, 186, 154, 71, 185, 156, 78, 163, 140, 63, 172, 145, 72, 181, 152, 84, 172, 147, 74, 173, 150, 76, 180, 152, 76, 166, 143, 70, 160, 138, 68, 155, 133, 63, 155, 132, 58, 146, 126, 49, 152, 129, 56, 159, 136, 65, 154, 131, 58, 159, 132, 53, 160, 133, 52, 123, 107, 47, 39, 37, 15, 10, 10, 4, 7, 7, 0, 7, 6, 1, 7, 6, 0, 7, 5, 2, 6, 5, 1, 3, 2, 0, 17, 12, 2, 101, 84, 48, 123, 105, 62, 144, 121, 69, 145, 118, 62, 88, 68, 35, 163, 138, 87, 179, 157, 103, 130, 117, 83, 110, 94, 56, 139, 120, 78, 147, 126, 77, 121, 99, 52, 119, 97, 50, 97, 76, 36, 84, 64, 27, 50, 39, + 15, 102, 78, 25, 148, 120, 56, 144, 120, 55, 163, 133, 72, 173, 144, 75, 162, 137, 64, 163, 139, 64, 148, 125, 54, 138, 116, 45, 145, 121, 52, 136, 114, 47, 147, 121, 55, 151, 126, 58, 146, 122, 51, 152, 128, 63, 152, 127, 63, 147, 122, 60, 146, 122, 56, 141, 119, 49, 161, 135, 68, 145, 125, 51, 166, 139, 59, 157, 131, 53, 161, 131, 58, 157, 128, 65, 156, 133, 65, 181, 152, 73, 170, 141, 69, 182, 152, 80, 177, 150, 83, 193, 163, 91, 164, 139, 69, 136, 114, 57, 90, 73, 30, 150, 126, 62, 158, 133, 70, 156, 133, 70, 149, 127, 68, 133, 113, 57, 133, 112, 60, 110, 92, 44, 99, 84, 37, 71, 58, 23, 79, 65, 23, 57, 49, 15, 74, 62, 21, 65, 52, 12, 90, 74, 29, 111, 92, 34, 104, 86, 27, 92, 73, 26, 80, 64, 29, 49, 38, 6, + 22, 24, 7, 65, 59, 8, 111, 100, 23, 65, 54, 21, 105, 81, 35, 97, 80, 28, 99, 81, 21, 123, 111, 35, 144, 133, 46, 130, 123, 43, 136, 131, 40, 114, 105, 30, 122, 116, 34, 63, 62, 14, 37, 35, 7, 70, 67, 25, 95, 85, 22, 45, 39, 6, 69, 63, 28, 134, 118, 48, 148, 134, 68, 116, 105, 44, 53, 48, 14, 19, 17, 2, 34, 32, 9, 100, 87, 28, 101, 91, 24, 69, 66, 15, 117, 106, 32, 105, 99, 35, 120, 112, 36, 114, 104, 34, 120, 111, 35, 58, 49, 14, 119, 96, 39, 129, 105, 44, 122, 93, 45, 125, 96, 43, 125, 96, 42, 124, 102, 46, 118, 104, 38, 108, 88, 25, 122, 105, 27, 131, 113, 34, 113, 95, 31, 93, 67, 26, 119, 87, 40, 116, 92, 31, 130, 110, 37, 98, 78, 18, 124, 106, 29, 141, 119, 42, 153, 130, 50, 158, + 130, 54, 145, 122, 48, 156, 126, 56, 157, 125, 54, 165, 132, 59, 152, 123, 53, 176, 145, 68, 164, 139, 66, 155, 132, 55, 150, 129, 48, 153, 131, 50, 189, 160, 82, 173, 148, 68, 178, 151, 74, 198, 168, 87, 175, 147, 73, 161, 139, 67, 166, 143, 74, 174, 147, 74, 168, 144, 69, 152, 130, 60, 149, 126, 59, 139, 119, 52, 149, 127, 56, 169, 145, 69, 158, 137, 66, 149, 129, 53, 151, 127, 48, 147, 127, 51, 126, 109, 39, 64, 55, 21, 16, 17, 5, 6, 8, 1, 5, 6, 0, 2, 5, 0, 5, 6, 0, 2, 3, 0, 7, 5, 0, 28, 25, 12, 21, 17, 5, 66, 54, 30, 89, 75, 41, 14, 11, 4, 25, 21, 12, 32, 29, 20, 13, 10, 9, 6, 5, 1, 10, 8, 3, 9, 8, 3, 5, 3, 0, 5, 3, 0, 23, 17, 0, 61, 50, 10, 119, 97, + 32, 139, 118, 48, 168, 140, 70, 164, 138, 69, 171, 145, 69, 168, 145, 69, 162, 139, 66, 160, 137, 66, 154, 132, 61, 160, 137, 62, 154, 132, 56, 159, 136, 62, 152, 130, 57, 145, 120, 50, 163, 137, 66, 159, 128, 66, 147, 122, 58, 145, 122, 56, 144, 120, 55, 147, 123, 59, 162, 136, 71, 154, 133, 57, 168, 139, 56, 174, 144, 63, 154, 130, 54, 170, 139, 65, 187, 153, 79, 164, 142, 68, 163, 139, 74, 163, 136, 70, 163, 137, 71, 161, 136, 65, 150, 130, 62, 140, 118, 61, 107, 87, 48, 141, 114, 59, 146, 124, 60, 151, 128, 66, 139, 119, 58, 135, 115, 54, 128, 110, 54, 108, 92, 41, 92, 79, 31, 75, 62, 22, 73, 65, 24, 65, 59, 21, 63, 57, 18, 60, 51, 10, 86, 74, 25, 112, 92, 27, 123, 102, 38, 118, 96, 36, 76, 61, 25, 44, 32, 0, + 5, 8, 1, 5, 5, 0, 29, 25, 9, 80, 64, 23, 135, 111, 50, 85, 73, 30, 89, 80, 17, 106, 100, 30, 132, 126, 42, 132, 125, 40, 106, 100, 29, 90, 80, 27, 131, 119, 43, 116, 107, 35, 104, 98, 43, 83, 77, 20, 62, 60, 10, 74, 67, 25, 36, 36, 14, 82, 68, 27, 129, 111, 46, 96, 84, 34, 62, 53, 15, 25, 20, 7, 66, 59, 18, 81, 70, 13, 85, 77, 17, 58, 56, 16, 121, 110, 36, 129, 120, 43, 121, 114, 41, 120, 111, 36, 103, 94, 26, 46, 34, 7, 93, 72, 25, 151, 122, 52, 114, 89, 43, 138, 108, 51, 159, 131, 66, 138, 115, 51, 124, 108, 38, 121, 104, 32, 123, 109, 30, 140, 122, 41, 132, 112, 43, 113, 86, 36, 109, 79, 33, 113, 91, 26, 117, 97, 25, 99, 83, 18, 110, 88, 29, 134, 112, 38, 130, 108, 31, 135, + 109, 39, 140, 113, 46, 143, 114, 50, 141, 111, 46, 149, 117, 47, 143, 110, 45, 155, 118, 53, 166, 132, 57, 164, 135, 60, 164, 135, 62, 159, 136, 59, 207, 178, 90, 176, 154, 73, 177, 152, 74, 174, 150, 67, 161, 141, 59, 165, 143, 69, 175, 148, 78, 180, 155, 79, 161, 143, 69, 156, 137, 65, 156, 136, 67, 142, 123, 56, 141, 122, 52, 143, 124, 49, 149, 127, 53, 154, 131, 56, 146, 125, 46, 155, 136, 55, 148, 129, 50, 130, 111, 42, 86, 76, 27, 88, 78, 30, 28, 27, 8, 11, 12, 0, 13, 12, 2, 8, 7, 0, 7, 5, 0, 6, 4, 0, 6, 5, 0, 12, 8, 0, 11, 8, 1, 2, 1, 0, 1, 0, 0, 3, 1, 0, 2, 1, 0, 3, 2, 0, 5, 4, 0, 8, 7, 0, 14, 12, 6, 25, 21, 8, 91, 75, 13, 167, 141, 63, 165, 143, + 77, 166, 143, 77, 167, 142, 67, 153, 135, 54, 164, 141, 61, 184, 156, 78, 182, 156, 77, 168, 144, 70, 145, 125, 53, 139, 123, 47, 158, 136, 56, 184, 154, 79, 164, 138, 62, 154, 130, 60, 171, 141, 63, 163, 134, 67, 154, 127, 59, 154, 129, 60, 147, 121, 58, 154, 123, 66, 164, 133, 72, 163, 140, 62, 168, 142, 61, 162, 137, 57, 163, 140, 63, 172, 144, 72, 177, 147, 82, 176, 147, 76, 177, 148, 77, 163, 135, 65, 154, 128, 61, 167, 142, 72, 144, 123, 59, 147, 129, 71, 137, 118, 68, 99, 78, 35, 112, 91, 43, 143, 122, 66, 132, 112, 54, 127, 109, 55, 129, 109, 53, 117, 100, 49, 103, 88, 41, 87, 72, 31, 72, 64, 25, 66, 61, 22, 68, 62, 22, 75, 65, 22, 92, 77, 24, 107, 89, 31, 108, 89, 30, 114, 96, 38, 71, 57, 18, 39, 29, 2, + 1, 4, 0, 1, 1, 0, 23, 18, 6, 48, 38, 16, 141, 118, 50, 136, 118, 46, 98, 95, 26, 117, 107, 35, 143, 135, 45, 135, 128, 44, 92, 89, 25, 124, 112, 34, 74, 73, 23, 104, 98, 46, 87, 82, 31, 46, 46, 18, 49, 47, 6, 62, 59, 31, 84, 76, 42, 39, 37, 19, 98, 86, 38, 65, 61, 20, 49, 42, 10, 27, 25, 9, 28, 28, 7, 52, 48, 2, 69, 62, 13, 40, 39, 11, 111, 97, 36, 135, 120, 50, 143, 127, 50, 101, 92, 27, 62, 50, 7, 40, 27, 1, 70, 51, 15, 112, 87, 30, 121, 91, 36, 121, 90, 39, 133, 97, 43, 140, 110, 45, 110, 93, 27, 125, 105, 37, 122, 104, 32, 137, 123, 43, 112, 99, 31, 104, 76, 28, 90, 61, 21, 108, 86, 28, 104, 85, 22, 109, 93, 27, 123, 105, 43, 142, 123, 54, 133, 113, 39, 147, + 114, 50, 131, 97, 41, 136, 107, 49, 149, 119, 53, 129, 103, 40, 118, 92, 34, 126, 102, 48, 133, 104, 47, 178, 144, 71, 142, 116, 51, 184, 157, 76, 207, 179, 96, 210, 182, 95, 169, 144, 64, 170, 147, 65, 150, 136, 51, 163, 143, 66, 176, 151, 80, 183, 158, 88, 183, 159, 84, 162, 145, 77, 171, 158, 90, 165, 148, 82, 153, 133, 69, 133, 116, 45, 139, 118, 49, 156, 134, 56, 164, 143, 61, 158, 136, 51, 166, 144, 62, 146, 125, 41, 147, 127, 48, 155, 131, 54, 62, 52, 17, 23, 23, 6, 22, 22, 9, 11, 9, 0, 10, 8, 0, 8, 7, 0, 6, 5, 0, 9, 7, 0, 10, 7, 0, 10, 8, 0, 20, 16, 3, 25, 22, 8, 44, 41, 19, 38, 38, 17, 82, 71, 25, 124, 109, 48, 165, 140, 69, 183, 154, 80, 129, 112, 49, 166, 141, 74, 188, 158, + 92, 200, 169, 92, 147, 128, 48, 144, 127, 45, 154, 138, 57, 156, 135, 63, 173, 148, 75, 187, 160, 79, 158, 137, 63, 134, 118, 45, 156, 134, 54, 177, 146, 61, 160, 135, 56, 134, 112, 40, 159, 131, 55, 159, 132, 63, 146, 120, 53, 169, 139, 63, 163, 133, 65, 153, 129, 66, 160, 138, 74, 159, 140, 62, 173, 145, 65, 161, 136, 61, 178, 151, 75, 166, 142, 77, 174, 147, 75, 187, 157, 82, 173, 145, 70, 142, 117, 50, 124, 104, 37, 134, 114, 47, 139, 116, 54, 142, 122, 61, 146, 129, 71, 119, 97, 51, 112, 95, 42, 136, 118, 58, 143, 119, 66, 125, 110, 64, 131, 113, 66, 118, 100, 49, 101, 86, 41, 103, 87, 46, 85, 73, 36, 81, 74, 34, 70, 63, 24, 72, 60, 16, 87, 72, 22, 75, 64, 15, 88, 74, 25, 110, 93, 36, 108, 94, 39, 59, 51, 17, + 6, 8, 0, 1, 3, 0, 8, 8, 0, 16, 12, 1, 57, 47, 16, 128, 112, 38, 102, 94, 21, 96, 90, 28, 153, 135, 52, 124, 119, 35, 43, 41, 12, 112, 97, 31, 152, 134, 47, 72, 67, 22, 125, 114, 43, 105, 99, 37, 76, 73, 18, 24, 25, 11, 99, 86, 48, 104, 89, 38, 128, 112, 51, 118, 106, 39, 60, 53, 15, 26, 22, 4, 42, 36, 9, 41, 41, 11, 60, 52, 12, 32, 30, 11, 58, 53, 16, 114, 103, 41, 142, 125, 45, 124, 108, 35, 48, 39, 9, 44, 30, 2, 48, 33, 4, 69, 50, 11, 78, 54, 19, 111, 79, 31, 121, 87, 35, 138, 109, 45, 117, 101, 30, 120, 102, 34, 115, 98, 31, 136, 118, 41, 132, 115, 42, 102, 79, 29, 83, 56, 20, 110, 87, 28, 125, 106, 40, 117, 100, 39, 118, 99, 30, 144, 126, 48, 145, 121, 55, 153, + 117, 57, 144, 114, 55, 137, 108, 45, 145, 118, 50, 169, 140, 70, 148, 120, 57, 133, 111, 49, 123, 101, 44, 159, 126, 57, 135, 113, 52, 180, 156, 83, 200, 172, 92, 181, 162, 81, 188, 165, 88, 183, 161, 80, 162, 146, 60, 163, 142, 61, 191, 164, 84, 163, 145, 72, 183, 163, 83, 182, 164, 92, 186, 172, 99, 185, 165, 94, 176, 155, 84, 152, 132, 58, 135, 119, 48, 175, 155, 81, 168, 145, 67, 162, 142, 62, 166, 147, 66, 154, 133, 53, 153, 133, 55, 139, 117, 39, 127, 107, 41, 101, 87, 35, 118, 104, 52, 57, 50, 17, 102, 86, 38, 83, 74, 35, 59, 52, 20, 48, 42, 12, 87, 72, 27, 106, 88, 40, 151, 125, 64, 170, 145, 70, 180, 151, 74, 173, 146, 66, 181, 151, 73, 182, 149, 75, 175, 144, 76, 157, 127, 62, 142, 119, 60, 180, 149, 79, 213, 178, + 99, 213, 176, 91, 152, 127, 55, 145, 121, 46, 148, 124, 50, 158, 133, 60, 181, 154, 77, 173, 150, 78, 157, 133, 63, 152, 131, 55, 161, 137, 57, 159, 135, 52, 144, 122, 50, 154, 129, 51, 142, 119, 39, 150, 121, 46, 161, 133, 62, 155, 128, 60, 157, 129, 62, 156, 130, 65, 177, 150, 85, 180, 156, 83, 172, 143, 67, 162, 135, 62, 162, 136, 69, 168, 143, 74, 191, 162, 91, 163, 135, 65, 164, 135, 66, 141, 118, 52, 117, 101, 40, 138, 114, 52, 116, 98, 42, 146, 125, 60, 157, 136, 72, 145, 125, 65, 139, 121, 60, 142, 120, 58, 122, 102, 47, 115, 99, 52, 120, 101, 62, 116, 100, 54, 102, 87, 39, 114, 95, 49, 102, 87, 48, 96, 81, 48, 74, 64, 32, 83, 72, 24, 94, 82, 30, 95, 84, 23, 117, 99, 36, 111, 94, 31, 114, 100, 37, 108, 93, 39 +}; \ No newline at end of file diff --git a/examples/app_single_model_on_two_tiles/src/main.xc b/examples/app_single_model_on_two_tiles/src/main.xc new file mode 100644 index 000000000..fc0d19ae4 --- /dev/null +++ b/examples/app_single_model_on_two_tiles/src/main.xc @@ -0,0 +1,34 @@ +#include +#include +#include +#include "tile_ram_server.h" + +#define NUMBER_OF_MODELS 1 +#include "model_weights.h" + +extern void model_init(chanend f); +extern void inference(); + +int main(void) { + chan c_flash_or_tile[NUMBER_OF_MODELS]; + + par { + on tile[0]: { + flash_t headers[NUMBER_OF_MODELS]; + tile_ram_server(c_flash_or_tile, headers, NUMBER_OF_MODELS, tile_server_weights); + } + + on tile[1]: { + unsafe { + c_flash_or_tile[0] <: FLASH_SERVER_INIT; + + model_init(c_flash_or_tile[0]); + + inference(); + + c_flash_or_tile[0] <: FLASH_SERVER_QUIT; + } + } + } + return 0; +} \ No newline at end of file diff --git a/examples/app_single_model_on_two_tiles/src/model_weights.h b/examples/app_single_model_on_two_tiles/src/model_weights.h new file mode 100644 index 000000000..7b1b7ef0b --- /dev/null +++ b/examples/app_single_model_on_two_tiles/src/model_weights.h @@ -0,0 +1,4128 @@ +#ifndef TILESERVERGEN_H +#define TILESERVERGEN_H + +const int8_t tile_server_weights[] = { +1, 2, -2, -3, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, -13, 21, 34, -4, -15, -38, -21, 16, 10, 29, -10, 10, -7, -14, 32, -17, 14, 20, 15, 41, -10, 5, -3, -12, 18, -14, 11, 20, 7, 30, -11, -31, 18, -24, -23, 50, 17, 2, -35, 7, -4, 25, -6, 16, -7, 2, 2, -7, 82, -31, 31, 16, -56, -39, -25, 67, 43, 12, -31, +-6, -15, -28, 13, 10, 5, -6, 44, 1, -48, -9, -34, 11, 6, -32, 7, 40, 8, 10, -32, 6, -27, -37, -22, -4, 71, -9, 0, 56, 19, -3, -11, -11, -41, -5, -20, -39, 12, 8, -7, -20, -16, -48, -23, 18, -22, 3, 5, 38, 40, 34, -10, -18, 1, 10, 18, -45, 25, -34, 48, 23, -2, -8, -27, -19, -49, 16, -20, -35, -32, 43, -17, 22, -15, -39, -17, 28, -22, -3, -30, -52, +-36, 13, -20, -4, -5, 38, -22, 21, 74, 9, 38, 21, -5, 15, 26, -5, -32, 19, -3, 33, -33, -19, -13, 14, -12, 8, 30, -21, -45, 36, -40, 39, -32, -4, -31, -44, 5, 96, -11, -24, 2, -22, 6, -25, -10, 32, 75, -26, 14, 59, 6, -19, 10, -4, 0, -17, -26, -6, -3, -21, -11, 127, 1, -3, 5, -5, -3, 62, 11, 47, 13, -62, 10, -30, 7, -24, 5, 19, -9, 13, -6, +-12, -9, -14, -12, 10, -5, -17, -38, -7, -13, 15, 23, -6, -26, -25, 41, -6, -2, -7, 11, -11, -28, -19, -1, -11, 21, -19, 2, -10, 5, 19, 31, -3, 13, -36, 34, -12, 22, -7, -64, -18, 75, -16, -8, -50, 20, 0, 80, -4, -4, -38, -10, -33, -2, -22, 4, -61, -9, -15, 3, 7, 14, 36, -53, -29, 6, 37, -56, 11, 25, -6, 18, -11, 79, -38, -49, 92, 7, -34, 5, -37, +-30, -7, -11, 11, 52, -21, 13, -17, 20, -26, 53, 32, -43, -40, -43, -29, 6, -11, -28, -18, -28, 9, 15, 4, -1, -17, 30, 5, -11, 6, 12, -21, -22, -14, -13, -13, 35, -29, -13, -42, 18, -8, -24, -23, -9, 60, -31, 30, 6, -19, -35, 20, -9, -13, -13, -17, 9, -1, 18, 19, -13, 11, 34, -33, 22, -28, 0, -11, 23, -19, -17, 1, 22, -38, -14, -45, 7, 19, -26, -1, -23, +-3, 6, -9, -35, 4, -3, -17, 15, -1, -11, 65, -50, 14, 16, 5, -8, 22, -23, -20, 18, -40, 7, 27, 34, 16, -48, -9, -14, 4, -31, 38, 15, -15, 17, 18, -20, 62, 23, 1, 36, 22, 23, 7, 13, 48, -29, -15, 26, 35, -65, -38, 20, -34, -15, -19, -15, 50, 105, -8, -17, -2, -24, 11, 28, 1, -21, -14, -13, -17, -25, 8, -15, 8, 2, 3, 34, 21, -19, -22, 2, 9, +4, 18, -15, 37, -37, 22, -4, 16, 13, 42, -22, 81, -25, -2, -16, 0, -13, -34, -17, -15, -36, 77, 5, -54, -1, -18, -5, 45, -69, -52, 20, -1, -21, 15, 15, 16, 8, -21, 34, 15, 15, -12, 51, -32, -17, -3, 50, 68, -17, 25, 60, -26, 2, 19, -5, -5, 26, -17, -18, 36, 26, 2, -35, 5, -23, 8, -26, 42, -6, -17, 0, -66, 42, -29, 58, 5, 2, 17, 11, 14, 21, +11, 9, 48, 11, -3, -4, 15, -43, 6, -37, 1, -32, -6, -17, 1, 8, 63, -31, -42, -30, 71, -26, 11, 106, 58, -29, 35, -5, -12, 111, -20, -20, -37, -10, -16, 9, 27, 4, 12, 23, 15, -48, 7, 0, 6, 38, 35, -22, -21, -6, 47, -61, 10, -26, 2, 10, 51, -18, -20, -34, 41, -29, 58, 43, 7, 10, -12, 30, -31, 1, -19, 19, -7, 30, -10, -25, 15, -43, -8, -22, -33, +3, -31, 16, 29, 33, -10, -18, 32, 42, -22, -26, 11, -56, 13, -10, -6, -6, -59, 6, 34, -1, -16, 37, -2, 14, -19, 127, 30, 10, -31, -1, -8, -34, 11, -11, 5, -22, 2, -5, 19, 32, -33, 46, -30, -20, -25, 1, 7, -28, -15, -7, 25, -9, -14, 42, 45, 17, 5, -13, -1, -4, 14, 3, 0, 15, -12, -46, -25, -25, -24, 1, -2, -18, -11, -13, -28, -4, 32, -20, 9, 12, +-9, -11, 38, -29, -17, -11, -26, -26, 44, -6, -5, -27, 0, 10, -20, -3, -19, -21, -25, 32, 57, -12, 9, 30, 2, 13, -21, -12, -7, -3, -6, -8, -14, 21, 5, 62, -9, -19, 11, -11, -26, 15, -5, -32, 7, 41, 12, 19, 14, -17, 15, 127, -10, 24, -6, -29, -3, 54, 18, -51, -31, -20, -11, 4, -42, 91, -28, -53, -43, -9, 19, 0, -20, 33, -24, 20, -41, -29, 32, -20, -25, +-48, -42, 30, -60, 5, 48, -2, -24, -27, 28, -100, 72, 26, 64, -43, -17, -1, -98, -18, -10, -46, 28, -26, 14, 20, 15, 21, 1, 14, -36, 17, -14, -35, -33, 34, -36, 85, 42, 10, 59, -66, 20, -24, 28, -2, -48, 9, -13, -5, -6, -31, 3, -27, -31, -41, -33, -11, 25, 8, -10, 1, -4, -12, -5, -2, -4, 44, 2, 4, 30, -33, 9, 23, 10, 2, 0, 32, -21, -2, -42, -23, +3, -19, -3, -63, -25, -35, -60, 11, -6, -4, -25, 1, -9, 16, 35, 14, 2, -13, 12, 12, 2, -21, 32, -9, -9, 18, 23, -11, -7, 12, -16, 48, -10, 0, 2, -30, 21, -42, -25, 9, 11, -9, 13, 22, -12, -25, -12, 1, 29, 10, -12, -9, 8, -14, 14, -13, 18, 31, -19, 26, 9, 6, -17, 31, 9, -36, 29, -26, -9, 13, -8, -15, 5, -6, -2, 21, 13, -39, -36, -7, 10, +8, -26, 127, 42, -28, 25, 19, -32, -26, -9, -30, -4, -14, 11, -43, -6, 15, -13, 110, -11, -34, 12, -38, 22, -15, 12, 14, -11, -29, 18, 32, -6, -15, -12, 39, -20, -4, 5, -29, -16, 6, -20, 39, -24, 59, -25, -28, -53, -26, -27, 14, -32, 47, 10, 0, -16, 24, -39, 1, -5, -4, 3, 0, 60, 50, 66, 33, -41, 51, -18, -26, 11, -32, 58, -8, -18, -24, -1, -35, -26, 13, +-1, -11, -24, 9, 90, -17, 14, 3, 30, 23, -12, -13, 60, 14, -43, 44, -15, 10, -20, 18, -33, -8, -8, 6, -29, -11, 7, -25, -26, 0, 0, -9, 18, -21, -38, 1, 16, 15, -11, 27, 21, -13, -13, 22, 69, 45, 19, 2, -10, 1, -21, -13, -7, -42, -26, 1, 10, -21, -54, 32, -16, -30, 60, 54, -32, -17, -18, -32, -19, -11, 29, -6, 47, 11, -5, -4, -36, 29, -6, -29, 24, +14, -19, -37, -20, -57, -2, 2, 27, 33, -40, -6, -51, -8, 7, -10, -26, -27, -15, 7, -32, 2, 0, 18, 21, -30, -21, -5, -57, 31, 0, -6, 2, -24, 2, 10, -22, -8, 38, -19, 21, -9, -27, -2, -6, 4, 14, -15, -41, 1, 20, -36, 31, 14, -33, -55, -36, 83, 10, 12, -16, -7, -6, -1, 1, -5, 22, 23, -32, -23, 27, -20, 31, -14, 20, 67, -27, 105, 19, -21, 10, 7, +-4, 21, -9, 22, 2, -28, 6, -25, -6, -30, -8, -14, -18, -21, 19, -38, -42, -11, 17, -24, -23, -9, -21, 8, -45, 22, 0, 13, -25, 6, 6, 4, 54, -10, 49, -42, -13, 11, -2, -11, 11, 12, 27, 9, -44, 10, 55, -1, 2, -1, -25, -23, 12, -23, 1, -3, -7, -20, -6, 13, 11, -20, 5, -3, 32, -10, 1, -34, 3, -4, 17, -22, 45, 11, -28, -27, 33, 71, -11, -25, -21, +-6, 7, -6, -8, 89, 38, 25, -41, -29, -21, 79, 8, 104, 31, 15, 127, -9, -13, -19, 36, -5, 20, -9, 1, -4, 38, 15, -29, 4, 27, 99, -53, 24, -47, -56, 2, -82, -26, 1, -5, -4, -1, -21, -38, 36, 50, -16, 14, -21, 57, -52, -2, 11, 29, 39, -18, 12, 62, -2, -26, 17, -19, -69, 39, 47, 39, -84, -4, 16, 24, 21, -43, -1, 20, 66, -13, 8, -12, -17, -11, 53, +25, 38, -6, -10, 25, -6, 3, -10, 19, -45, -24, 18, -10, -12, -24, 0, -32, -21, 33, -13, -23, -17, -25, -13, 1, 94, -2, 18, 5, -7, -21, 71, -39, 55, 28, 19, -2, 20, 32, -17, 13, -21, 20, 36, -8, -4, -16, 49, -7, 8, 50, 27, -12, 16, -2, 11, 59, 76, -4, 15, -10, -10, 5, -33, 33, 103, -19, -10, 5, -44, -32, 5, -22, 28, -29, -16, -10, 3, -21, -20, 14, +-8, 14, -11, 31, 3, 6, -4, -44, -28, -13, 23, 4, -33, -46, -26, -2, -29, -17, 47, -6, 0, 0, -14, 70, 62, -20, 40, 28, 51, -16, -5, 27, -45, -37, 17, 6, 12, -9, -20, 74, -27, 32, 14, 2, -19, -7, -19, -1, -18, -11, -2, -4, -11, 37, 26, -7, 6, -16, 12, 11, 11, -10, -18, 44, -28, -43, 16, -35, -29, -18, -12, 8, -1, 17, -24, 13, -39, -2, 11, -20, -19, +-5, -8, 10, 47, -3, 29, -25, -26, 6, -29, 14, -15, -40, -9, 6, -6, -19, 67, 7, -6, 11, -30, -28, -8, -6, 32, 20, 24, 24, 59, 85, 28, -26, -19, -25, 13, -44, -48, 23, 8, -18, 5, -9, -35, 11, -25, 16, 30, -26, 30, -9, -41, 3, 40, -23, 29, -5, 24, 29, -28, 127, 19, 10, 6, 56, 15, -29, -3, -4, 30, 15, -3, 13, -22, -41, 13, 0, -16, -22, -1, -22, +37, 3, 12, 11, -25, 18, -42, -29, -32, -10, -26, 60, 9, 35, 46, -53, 0, -5, 17, -39, -25, 15, -3, 10, -18, -34, -4, -1, 67, 30, 10, 3, 4, -30, -27, -15, -4, 2, 5, -33, -16, 16, 17, -22, 20, 32, 22, -43, 0, -17, -16, 3, -14, -15, -24, 39, -4, -28, -6, 3, 38, 6, 11, -38, -23, -34, -7, -3, -43, 1, -31, 36, -16, 117, 7, -4, -10, -48, -37, 70, -18, +12, 13, 6, -21, 3, 14, -1, 7, -10, 15, -10, 94, -25, 9, -12, -14, 16, -19, -7, 27, 17, -52, -73, 125, -2, -29, 19, 26, 0, 10, 25, -29, 56, -6, -5, 9, -5, -12, 24, -12, 56, -8, -11, -28, -10, -19, -9, -40, 2, -7, 10, -29, 3, -5, 32, 77, 6, -19, -12, -13, 3, -1, -8, -12, -3, -13, 46, -17, -6, -47, 12, -11, -34, -9, -21, -53, -7, -19, -12, 17, -29, +-19, -4, 15, 11, -9, -6, -16, -1, 18, 8, 64, 3, -4, -10, -3, 0, -28, 10, -35, -16, 24, 40, -17, -2, -17, -24, -8, -2, -15, -11, 7, 89, -8, 44, -27, -1, -29, -68, -7, -3, 54, 50, -22, 33, 21, -22, 10, -23, -5, 29, 48, -26, -12, 15, -16, -24, -50, 78, 79, -25, -39, -25, -22, 127, 13, 13, -35, -10, 34, -15, 7, 58, 59, -58, -34, 13, -18, -21, -13, -5, 2, +-15, -28, -56, 29, -3, -20, 5, 7, 76, 57, -16, 24, -16, -17, 7, -15, 10, 8, -16, 18, -28, 31, 64, 13, -10, 14, 14, -40, -6, -24, 33, -2, -15, -29, -7, 20, -3, 77, -14, -60, 2, 13, -2, 7, -13, 12, 23, 12, 8, 28, -4, -35, -15, 22, 9, -12, 15, 12, 14, -19, 18, 1, -17, 1, -36, -22, -5, 6, 0, 17, -30, -50, -5, 19, -27, -20, 6, -16, 4, 17, 23, +19, -41, -8, -24, 3, -35, 10, -14, -13, -18, 21, -6, 44, 20, -8, -23, 29, 8, -8, 5, 7, -16, -6, 0, 13, -36, 9, 28, 34, -81, -60, 35, 31, -26, -35, -17, 41, -4, -6, 117, 23, 39, 12, 90, 20, -16, 0, -13, 19, -19, -8, 4, -59, -13, -75, -5, -3, 2, -22, -29, 48, 8, 5, 8, 22, -19, -15, 7, -9, 3, 29, -32, -17, -11, -1, -31, -24, -22, 12, -9, 59, +-4, 15, -22, 77, 15, 4, 1, -5, 28, -7, -5, 7, -2, -1, -2, -36, 24, -1, 31, -14, 49, -7, -4, -9, -8, -25, -25, 64, 58, -36, 44, -19, -18, 17, -3, -14, -42, 23, 127, -36, 7, -17, -5, -29, -46, -23, 52, -15, -35, 17, 16, -4, -7, 5, -14, 1, 48, -23, 5, 18, -67, 27, -12, 20, -11, -58, -18, -13, 10, 12, -32, 10, 52, 0, -31, -27, -3, 21, -4, 2, 28, +12, -33, 16, 0, 6, -17, 48, 13, -17, 14, -6, -16, -43, -21, -13, -59, -36, 24, 17, -7, -61, -12, -23, 12, -12, 23, 2, -2, -39, 63, -54, -2, -28, -40, 20, 12, 103, -24, -19, -40, 116, 48, -8, 11, 2, 110, -8, -9, -17, -39, -45, 24, -39, -16, -39, -63, 31, -2, 27, -27, -30, -1, 26, 24, -28, 12, -16, -26, 4, 33, -15, 36, 63, -36, 127, -2, 24, 23, 10, -19, 13, +45, 8, 42, -21, -8, -19, -4, 67, 18, -2, -27, -29, 6, 7, -1, 14, -9, -10, -7, 8, 19, -22, 19, 10, -20, -12, 11, -11, 18, -8, 9, 12, -1, -11, -14, 4, -52, 3, 45, 18, 30, -5, -30, -11, -33, 15, -43, 59, 2, -1, 46, 1, -21, -6, 12, 6, -20, 16, -35, -40, -15, -18, 59, 7, 2, -38, -25, 4, 13, 2, 28, 8, 1, -17, 10, 19, 31, 106, -21, -56, -23, +-23, -9, 36, -14, 18, 20, 37, 20, -15, -11, 13, 1, -9, 33, -19, -22, -15, 14, -8, -18, -4, 5, -7, 20, -6, 14, 0, 10, 9, -2, -24, 12, 4, 15, -16, 24, 0, -2, 34, -12, 3, -14, -1, 15, -28, 2, 12, 41, -8, -1, -1, -8, 5, 6, 6, -10, 29, 8, -30, 40, -2, -15, -27, 79, 11, 45, -37, 41, -23, -30, 30, -78, 63, -9, -28, 40, -6, -10, 55, 57, 64, +-49, 44, 20, 17, -30, 58, 21, -10, -27, 46, 30, 0, 16, 79, -33, -36, 32, -5, -42, 2, -5, -5, 26, 64, -25, 39, 67, 50, -24, -35, 32, -12, -14, -11, -41, -13, 1, 34, 88, 12, -19, -15, -19, -3, -25, -3, 27, -38, -29, -31, -32, 13, 10, 76, 31, 11, -13, -27, -47, 127, 1, -7, 16, -4, 84, -8, -2, -18, -8, -8, 8, 24, -8, -17, -1, -3, -3, 7, 13, 3, -34, +-28, 32, 7, 70, 82, 30, 16, 11, 15, -5, 24, 31, -43, 49, -3, 127, -7, 3, -14, -40, 14, -26, 19, -16, -26, -10, 2, -2, -34, 20, -9, -1, 15, -2, -8, 15, 62, -14, -12, 52, -17, 18, 29, -49, -8, 30, 37, 127, -14, -22, 2, -5, 18, 7, -24, -20, 3, -21, 45, 17, -16, 79, -3, -26, 17, 12, 7, 47, 14, 41, 11, 37, 25, 4, 15, -21, -27, -7, -71, -42, -10, +12, -11, 72, -32, 12, 17, -29, 7, 2, 2, 5, 6, -3, 34, -18, 127, -14, 23, 0, -22, -31, 2, -23, 41, -20, 36, -25, -16, -14, -31, 8, -2, -34, -25, 42, -7, -17, -17, -21, 33, 18, -28, -20, -34, 17, -13, -10, -19, 11, -30, 1, 39, -3, -20, -21, -17, -22, -29, 13, -15, -2, -5, 3, 15, 25, -29, -23, -21, -7, -1, -17, 16, 23, -13, 51, -28, -26, -5, 87, 13, -15, +-4, -6, -22, 8, 18, -14, -23, -24, 3, -12, -21, -37, -4, -52, 9, 9, -12, -8, -3, 14, 6, 11, 45, -37, -23, 3, -22, 85, -33, -16, 6, -50, -10, 11, -14, 66, 1, -8, 8, -23, -4, -41, -41, -29, 11, -25, 13, 10, -13, 44, -9, 0, -28, -64, 58, 20, 4, -33, 37, 15, -9, 50, -33, -11, 21, 16, 25, 42, 22, -58, -54, 50, -10, 127, -30, 7, 52, 50, -29, -21, -26, +-4, 7, -15, 15, 18, 8, -17, -12, -42, 48, -28, 10, -1, -8, 70, 9, 0, 41, 29, 14, 14, -39, 9, -6, 47, -34, -31, 35, -15, 24, -29, -19, -19, -53, -20, 10, -11, -46, -16, -8, -4, 24, 35, 0, -2, -12, -29, 3, -28, -68, -11, -37, 8, 19, -16, -6, 36, -33, -1, -17, 2, 6, -54, -10, -17, -8, 7, -8, -19, -15, -38, -26, 68, 11, 9, 24, 6, -21, -4, 4, 28, +-28, 17, 39, -24, -30, -8, 32, -5, -17, 36, -9, 16, -18, -19, -33, 5, 22, -66, 1, -19, 8, -12, 4, 49, -7, 6, -34, 18, 7, 11, 3, -10, 34, 11, -11, 24, -2, 37, -18, -14, -32, 47, 2, 2, -2, 44, 4, 12, -7, -40, 1, 33, -7, -6, -46, 54, -1, -10, 46, 8, 35, 14, -20, 29, -35, -17, -7, 16, 2, -6, -9, -19, 11, 18, 28, 20, -27, -38, -11, -3, -5, +25, -49, 74, -12, 55, -12, -51, -22, -32, -50, -15, 64, -5, 36, 31, -23, 33, 3, 6, 14, -4, -9, 11, -24, -33, 37, 13, -31, -20, -30, 8, -50, -43, -33, 7, 7, -2, 33, 18, -25, 59, -33, -69, 25, -19, 9, 46, 70, 2, 84, 6, -69, 0, -21, -32, 3, 0, 12, -72, 20, -11, 66, -33, -26, -64, -5, 9, 30, -47, 16, 1, -16, 16, -27, -33, -15, -6, 3, 21, -14, 18, +8, 10, -30, 12, 14, -45, 15, 0, 22, 31, -37, 28, -2, -7, 35, 13, -6, 7, 63, 33, -18, 28, -9, 12, 4, 21, -15, -47, 57, -6, -28, -12, -24, -4, -13, -32, 4, -55, 5, 3, 20, 6, -12, 36, -25, 26, -1, 29, 15, -4, -14, 14, 2, 2, -3, 43, -9, 2, -19, 35, 5, 47, 1, -14, -10, 2, -11, -3, -13, 8, -8, 8, -21, -22, 4, 18, -21, -16, 48, -20, -48, +-19, 52, 61, -11, -22, -16, 46, 4, -37, -9, -57, 1, 6, -13, 54, -26, -35, -17, -11, -4, 46, -29, -7, -4, -37, 3, 70, -9, 29, -31, -41, -15, -15, -8, -17, 35, 21, -31, -17, -5, 37, 37, -14, 42, 15, -4, 18, 14, 6, 31, -9, -2, -13, 29, -12, 21, -37, 61, -45, 38, -38, 27, 31, -43, -12, 14, 6, 2, 33, 31, -10, -29, 10, -25, 11, 22, -78, -22, -16, 14, -19, +-10, 3, -12, -6, -26, -30, 33, 36, -10, -22, -1, -2, -6, -13, 6, -38, -18, 9, -5, -10, 57, -3, -18, -6, -12, 24, 17, -39, 5, 9, -9, 127, 57, 12, -26, 0, 19, -23, 8, -11, -37, 12, -18, -54, -7, 30, 12, -28, 8, 11, 42, -29, 48, 15, -22, -34, 4, 15, 6, -34, 5, 4, -20, -44, 1, 8, 1, -6, 1, -14, -1, -9, 15, -21, -41, 15, 32, -17, 19, -45, -9, +21, -41, 5, 3, 15, -17, -1, 11, -46, -5, -44, 30, -19, -18, -21, 41, -2, 117, -22, -44, -42, 60, 10, 69, 20, -18, 29, -14, 10, 3, 40, -13, 43, 5, 40, -25, -23, 19, 14, 4, 18, -29, -63, 12, 50, -27, -18, 37, -50, 8, -47, 8, 1, 23, 19, -26, 25, -8, 27, 30, -19, -33, -9, -24, 45, 33, 28, -5, -1, 99, 29, 40, -6, 4, 25, -7, -6, -9, -6, -12, -24, +8, -12, 19, -12, 33, 8, -23, -6, -21, -6, 33, -15, -7, 23, -28, -11, 9, 41, 2, 0, 27, -19, -59, -17, 3, -28, 84, -50, -13, -16, 7, 4, 37, 49, -35, -1, -26, 39, -17, -17, 86, -1, 26, 28, 15, -16, -13, -35, 3, -4, -26, 3, 12, -14, 48, 15, -31, 2, -9, 24, -9, -23, 13, -13, -21, -25, -9, 21, -11, 14, -3, 26, 20, -5, 31, 8, -15, -19, -29, 42, -19, +-5, 8, 40, -15, -4, -34, 13, -3, 28, -5, -2, 22, -6, -8, 15, -16, 9, -17, 42, -3, 28, 16, -25, -13, -1, -16, -12, 16, -4, 25, 42, -59, 11, -42, -13, 51, 7, -36, 2, 33, -8, 10, 24, -37, -37, -36, 18, 31, 72, -15, 70, -31, -9, -31, 47, -17, -12, -30, -1, 72, 42, -3, -3, -32, -47, 11, -29, -38, 65, -50, -56, 11, -13, -29, -38, 9, 7, -53, -1, 21, 80, +-52, -32, -39, -41, 43, 28, 25, 125, 104, -28, 26, -19, 3, -4, 39, -3, 38, 58, 0, -1, -35, -22, -8, -5, 2, 77, 6, 30, 33, 9, 31, 3, 8, 2, -1, -3, 7, -3, -10, -29, 2, 32, 59, -6, -17, 37, 21, -13, -45, 33, -2, 12, -25, -7, 0, 16, -26, 51, -15, 19, -5, -8, -8, 23, 22, -19, -53, -3, 14, 40, -8, -21, -23, 11, 18, 16, -4, 11, -7, -23, 5, +17, 22, 45, -47, -28, -12, 13, 31, 85, -12, 5, 52, -30, 9, -38, -11, -19, 0, 1, 1, 30, 9, 51, -40, 46, -5, 42, -12, -18, 37, -14, 28, 9, -12, -20, -22, 6, 8, -33, 4, 50, 9, 1, -56, -3, -40, -3, 59, 5, 12, 12, 1, 21, 12, 8, -5, 9, -15, 11, -37, 53, -36, 34, 15, -13, 11, -6, -26, 33, -2, 0, 15, 9, -3, 10, 31, -35, -18, -28, -8, -22, +-2, -13, 7, -25, 7, 2, -12, -46, -28, -2, -4, -38, -17, -9, 100, -11, -7, 6, -11, -24, -1, -40, -28, -17, -45, -18, -7, -20, -22, -10, -2, -14, -11, 42, -16, 17, 75, 1, 29, -5, -20, -13, -43, 49, -14, -19, -7, 10, -65, -49, -3, 3, -28, 14, -3, 32, 17, 5, 49, 29, -14, 33, -19, 37, -7, 13, 1, -13, -14, 3, -14, 21, 0, 15, 62, 23, -3, -9, -25, -15, -5, +-34, -15, -27, 36, 52, -2, 14, -10, -15, -14, 13, -42, 9, 20, 60, -1, -19, 20, -4, 46, -54, 39, 1, 19, -7, 30, 69, -17, -21, -14, -17, 12, 11, -54, -29, -3, 17, -38, 5, 4, -13, -5, 5, 90, 51, -6, -72, 32, -15, 10, -24, -40, 3, -8, -9, -13, 4, -4, -3, 17, 58, 43, -35, 23, 7, 25, -15, -29, 25, -21, 46, 30, -9, 30, 4, 17, 21, 5, -14, -20, 13, +16, -18, -28, 30, 1, 10, 8, 54, -42, 6, -17, -6, -4, -43, 2, -20, 70, -25, 18, -10, -16, 7, 65, 7, 0, -26, 31, -19, 11, 16, 30, -22, 4, -23, -13, -15, -22, 22, 19, -4, 19, -24, -19, 24, -34, 24, -5, 17, 127, -13, -8, -23, -9, 18, -2, 6, -18, -32, 8, 1, -61, -4, -21, 58, 58, -38, -10, -6, 23, -9, -28, 50, 4, -25, -27, 33, -22, 5, -5, 7, 7, +1, -15, -6, -15, -12, -2, 5, -32, 8, 29, 21, 57, -3, -16, 16, 35, 33, -3, -31, -1, 13, 14, 7, -14, -38, -31, -22, 11, 18, -6, 16, -19, 12, 1, 10, -30, 10, -8, -11, 21, 4, 17, -3, -2, -3, 34, 50, -26, -16, 5, -29, 31, 10, 7, 6, -20, 73, -30, 114, 22, -35, 32, 21, -28, -43, -5, 15, -9, -25, -7, -57, 0, -12, 24, 42, -27, 14, -18, 7, -33, -20, +0, -3, -8, -3, 41, -7, -97, 5, -39, 24, 6, -36, -30, -89, -5, -1, 13, -5, -68, 34, 37, -16, -48, 87, -55, -5, -41, 17, 44, 101, 53, -27, 2, -62, -33, 16, -24, -19, 31, 66, 22, 28, 19, -12, -32, -19, 8, 14, 6, 4, 1, 10, -1, 23, -23, 38, -23, -14, 0, -15, -10, -51, 19, -21, 9, 1, 19, -32, 22, -10, 52, -13, -8, 49, -16, 1, -33, -23, -23, -25, 32, +-13, -23, 21, -25, 18, -2, 20, -25, 16, 8, -12, -27, -19, 19, -22, -8, -20, -2, 22, -8, 29, 11, 32, -6, -24, 33, 17, 44, 6, 10, 15, -9, 23, -9, 0, -8, -25, -38, 0, 28, -27, 9, -21, -36, -1, 4, 0, -54, -35, -30, 11, -3, 5, 1, 19, -7, -35, -12, -2, 76, 48, 6, 7, -34, -5, -5, 1, -70, -21, -20, 17, 3, 13, 28, 52, -29, -15, -3, -35, 19, -34, +-40, 8, -17, -1, -15, 20, -21, -14, -6, -1, 53, -12, -5, -3, -14, 48, -11, 24, 5, 20, 38, 22, -30, -14, -2, -41, -36, -5, -10, -14, -28, -21, -19, 16, 14, -1, -10, -18, -13, -17, 26, 30, -10, -1, 10, -40, -6, 6, -13, -23, 37, 4, 11, 30, -31, 9, -7, 13, -4, 46, 0, 54, -24, 18, -41, -14, -8, -15, -17, 11, 2, -9, 8, 9, 39, -3, -30, -38, 13, -27, 34, +-11, -22, 8, -6, 7, 19, -17, 22, -31, -15, 32, -11, -30, -27, -38, -18, 75, -23, -10, -15, -13, 16, -9, -13, -34, 0, -11, -23, 10, -22, -29, 5, 32, -16, -23, 19, 15, 2, -17, 53, -35, -42, 4, -10, 9, -14, 15, -1, 52, -20, -11, -19, 24, -8, -9, 23, 6, -21, 26, -6, 9, 8, -32, -6, 13, -21, -19, -13, -20, 38, -20, 2, 23, 44, 27, 21, -43, 16, -1, -25, -24, +-36, -53, 37, 11, 13, -49, -13, 9, 16, 8, -14, -35, 6, 7, 7, 24, 41, -25, 34, -8, -6, -1, 21, -13, -38, -24, -3, 18, -14, 1, -44, -12, -6, 3, -18, -17, -22, -24, -24, -37, -35, 12, -21, 18, -10, 9, -15, -14, -22, -39, 29, -17, -19, -35, 35, -14, 1, -12, -14, -29, 16, -8, 3, -1, -10, 34, -32, 25, -17, -25, -8, -26, -3, -8, -13, -2, 80, 18, 6, -11, -37, +-58, 57, -30, -13, -57, 43, -1, 27, -26, -44, -15, 18, -19, -34, -31, 26, -30, -15, -24, 9, -48, 1, 90, -9, -54, 29, 15, -39, 7, -12, 5, 39, 17, -24, 55, -10, 64, -5, 23, -28, -13, -39, 76, 60, -56, -43, -2, -10, -6, 24, -54, -3, -34, 20, -41, 12, 16, 4, -1, -33, 8, -53, 26, -27, 10, -4, -22, 36, 32, -13, -35, -8, -27, -9, -10, -42, 20, -44, 7, -1, 34, +-7, 24, -5, 55, -14, 24, -42, -17, -28, -21, 3, -17, -16, 12, -8, 6, -23, 8, -32, 7, -17, -7, 95, 127, 42, -6, -14, -19, -33, -38, -2, 33, 0, 9, 6, -3, -4, -55, -8, 85, 5, -54, -25, -2, 15, -21, -44, 2, 9, 1, 28, 6, -13, 46, -6, 3, 40, -19, 1, -7, -13, 9, 12, 0, -13, 15, -9, 17, -18, -40, 18, 29, 45, 45, 65, 8, -39, -12, -17, -24, 50, +-3, -61, -42, -39, -21, 12, -20, 19, -3, 15, -14, -36, 44, -17, -6, -34, 27, 7, -40, 26, -2, -33, -18, 9, 13, 52, -10, 1, -17, -5, -46, 36, 31, -23, -53, -13, 13, 57, -12, 41, -1, 10, -31, -36, -37, -23, -26, 27, 32, -35, 9, 19, -21, 39, -34, -9, 30, 8, -4, -45, -18, -8, -23, 26, 26, 15, -19, -43, 32, -19, -26, -22, -31, 36, -8, -16, 42, -10, 30, 20, 33, +-6, 72, -20, 5, -44, 18, -9, 34, -10, 61, -19, 45, -30, 30, 51, 15, 26, 54, -32, 10, 19, -22, -4, -18, -49, -5, -54, 127, 127, 44, -35, 20, 6, 10, -27, -25, -26, -27, -19, 32, 31, -12, 5, -26, -14, 9, -19, -28, -7, 22, 29, -16, -10, -4, -37, 7, 24, 12, -31, -9, -12, -18, -23, 4, 0, -17, 37, -19, -26, 2, 11, 3, 27, -10, -6, -37, -26, -31, 81, 17, 2, +-43, -14, -20, 19, 13, 41, 1, 56, 8, -44, -22, 1, 21, -56, -29, 22, -28, 53, -29, -20, -26, -11, 14, 18, 49, -14, -5, -40, -8, -22, -7, -23, 65, -39, -5, -9, 13, -58, 12, -25, 0, 3, 37, -11, -23, 6, -30, 1, -51, 45, -21, -4, -18, 20, 29, -35, 21, 4, -7, -11, 13, -3, -31, 14, 61, 1, 18, 11, 2, -41, -8, 19, -7, 8, 127, -5, 2, 26, 13, -59, 17, +36, -3, 3, 7, -16, -20, -29, 25, 15, -18, -14, 7, -7, -8, -11, -10, -35, 22, -33, -3, -3, -9, -9, -9, -24, -28, 21, 18, -21, 50, 60, -42, 3, 2, 1, -13, 17, 10, 75, 16, -11, -28, -18, -8, 26, 46, -58, -15, -26, 18, 87, -12, 17, -17, -27, -24, 19, 13, -7, -15, 39, -4, -18, 1, 59, 27, 12, -17, -12, 7, -21, -32, -45, 18, -4, 6, 44, -7, 115, 17, -6, +45, 52, -2, 6, 7, -38, -7, 127, 47, -51, -13, 20, 17, 3, -21, 24, 36, -16, -37, -10, -15, -31, -32, -90, -35, 25, 17, 51, -28, 30, 35, -4, 92, 63, -28, -13, 16, 14, -28, 98, -11, -27, 25, -20, 7, -3, 7, -49, -22, -5, -14, -29, 52, -21, -32, -30, -79, -34, 10, -21, 5, -15, 32, 49, -8, -8, -23, 33, -17, 49, -15, 7, -22, 28, 4, 5, -25, 19, -45, 32, 7, +-32, 12, -51, -36, -25, 19, 31, 21, 4, -1, -22, 60, -13, -23, -4, 25, 2, -5, 110, -26, -38, -55, -7, 2, 33, 44, -13, -4, -5, -19, 24, 43, 1, 46, 48, -18, -24, -16, -41, -15, -39, -15, -8, -2, -6, 1, -20, -37, -14, 34, -14, -23, 12, -13, 6, -9, 43, -28, -20, 10, 2, 13, 33, 9, -8, 36, 15, -10, -19, 12, -48, -23, -3, -8, 42, 9, -11, 6, -6, -17, 2, +-19, 14, 2, 13, -37, -12, 0, 18, -31, 32, 1, -21, -23, 8, 0, -6, -29, 38, -25, -17, 9, 3, -6, 46, -38, -58, 18, -18, 9, 26, 2, 11, -18, -41, -40, 47, -74, 17, 56, -22, 3, -9, -27, -27, 20, -11, -36, 6, -3, 19, 12, -20, -16, -21, -18, 26, -9, 3, -29, -24, -1, 16, 10, -19, 32, -3, 21, -14, -9, -40, -23, 8, -9, 54, 43, -33, -24, -36, 39, -24, 21, +-12, -19, -52, -22, 32, -7, 17, 34, -29, -7, -46, -3, -13, -42, -11, -28, -28, -56, -28, -3, 29, -12, 13, -12, -34, -11, 70, 5, 63, 28, -14, -67, -2, -46, -4, 38, 10, 59, -30, 29, -10, 24, -15, 72, -6, -60, -50, -47, 28, 26, 38, 17, -5, -35, -25, -12, -15, 19, -29, 37, -32, 26, -39, -13, 42, 40, -18, 9, 49, 1, -28, -2, -8, 11, -29, 40, -31, -19, -22, -41, -29, +-6, 9, -18, 50, 42, -21, -7, -24, -22, -30, 44, 17, -38, 29, -7, 89, 4, 6, 7, -29, -29, 17, 26, 45, -27, -3, -21, -3, 3, -14, -9, 39, 27, -25, 10, -22, -5, 40, 35, -12, 23, 13, 14, 17, 30, 25, 70, 7, 31, -10, -66, 17, 20, 15, -24, 58, -15, -31, -7, -31, 38, -20, 12, -7, 25, 9, -13, -7, 30, -16, 31, -6, -9, -13, 13, 45, -19, 16, 1, 18, 26, +2, 3, -25, 53, -16, 1, 38, -18, 3, -15, -7, -11, 3, -33, -3, 2, 30, -25, -31, 39, -7, -11, -23, -21, 46, -18, -6, -6, 2, 23, 22, -39, -30, -9, -9, -14, -20, -9, -19, 1, -42, 48, -25, -7, 31, -20, 0, 12, -18, -38, -18, -12, 1, -19, -10, -27, -14, -13, 15, 19, 102, 15, 11, 72, -10, 16, -56, -36, -44, 5, 30, -4, -12, -98, 37, -20, -29, 16, 56, -9, 19, +12, -60, -7, -35, 0, -3, 10, 8, 8, -12, 12, -22, -2, -12, 66, -30, 34, 4, -5, 1, 10, -19, 23, 25, -32, -14, -13, -10, -3, -11, -11, 2, 26, -42, 28, -20, -15, -17, -22, 4, 1, 7, 36, 1, -37, 6, 89, 1, 26, 127, -22, -32, -12, 47, -14, 113, -18, -37, -16, 17, 17, -9, -33, 42, 27, 35, 38, -20, -37, -49, -30, -20, 72, -5, 11, -19, 49, 10, -15, 20, 4, +15, -3, 0, 27, -20, 19, -46, -3, -11, -18, -24, 61, -16, 5, -26, -33, -5, -21, 68, 72, 4, -17, -7, 46, 10, -98, -13, 16, -7, -13, -55, -25, 11, 13, -26, -18, 17, -29, -24, 60, 56, 8, -20, 14, -1, -37, -26, -12, -50, -22, 27, 57, -5, 0, -13, 68, -15, -32, -2, 69, -60, -36, 26, -12, -11, -33, -7, 71, 45, -1, 25, 14, 97, 11, -22, 46, 12, 21, 20, -13, 55, +20, 6, -17, -54, -9, 5, 7, 21, -32, -31, 21, 15, 25, 8, 41, -22, -17, -10, -6, -12, -1, -6, 44, 36, -23, -28, -44, -4, -1, 5, -4, 52, 6, -3, 42, -25, 6, -33, -32, -15, -63, -3, -41, -12, 23, 42, 9, 0, -38, 1, -23, -42, 2, 20, 8, -43, -47, -23, -43, -9, -25, -24, -30, 29, 83, -8, 29, -6, -6, -8, -3, -11, -35, 11, -27, 12, 50, -9, -11, 59, -8, +16, 15, -7, -6, -4, -17, 7, -18, 56, -1, -29, -11, 19, 21, -33, 4, 1, 8, -27, 1, -37, 56, 7, -2, 9, -26, 2, 127, 0, 40, 84, 4, 10, 14, 12, -15, -13, -54, -25, 5, 52, 9, -34, 35, -44, 8, -20, 15, 26, -2, 68, -46, 2, -2, -30, -23, 5, -43, -5, -68, -35, 64, -5, -5, 24, 17, 18, 12, -20, 19, -11, -29, 22, -11, -8, 38, 52, -33, 26, 37, -13, +-1, -9, 47, 20, -35, 30, 54, -9, -24, -44, -28, 47, 24, 19, 65, 24, 21, -36, -31, -8, 8, -16, -26, -19, 2, -28, 70, -46, 90, -8, -50, 12, 9, -18, -34, 6, -25, -16, -30, -9, -34, -23, 7, 1, 3, 61, -11, -16, 34, 6, -15, 28, 30, -26, -39, 54, -9, -36, -7, 16, 38, -23, 22, 71, -3, -39, 55, -19, 116, -9, -13, 7, -7, 13, -15, -42, -47, -12, -55, 2, -28, +17, 44, 30, -9, 4, -1, -23, 3, 15, -3, 34, 9, -70, -43, 36, 27, 18, 8, 11, 66, -48, -16, -30, -5, -16, -4, 0, 14, -1, -24, -1, 6, -6, 46, -8, -12, 20, 43, -17, -9, 1, -40, 1, 1, -25, -18, 30, -28, 1, 40, -6, -19, -20, -12, 59, 6, -4, 40, -8, 30, -17, 28, -28, -19, 19, -15, 19, -27, 11, -19, 0, -24, 47, -7, -35, -25, -2, -18, -5, 16, -7, +21, 20, -29, -17, -26, -23, 61, 21, -19, -4, -10, 45, 3, 9, -2, -4, -21, -44, 2, -14, -85, 3, -2, 0, 13, 10, -31, 18, -20, 9, -36, 0, -13, 80, -19, -15, -39, 13, -1, -30, 0, 37, -12, -5, -8, 1, -4, -2, -29, -5, 35, 23, -5, -20, -17, -27, -8, 17, -11, -23, 40, -26, -7, 57, 1, 69, -6, -37, -66, 1, 17, -45, 10, 49, 12, -5, 35, 4, -57, -14, -4, +-24, -1, 46, -27, -28, -15, -21, -42, 0, -5, -13, 51, -42, 14, 9, -24, 6, -14, -8, 30, -61, 58, 20, -19, -43, 28, -15, -14, 37, 4, -13, 10, -20, -7, -19, -2, -36, -12, -35, 42, -31, -11, -22, -38, 2, -22, -18, -21, -25, -11, -11, 17, -28, -6, -33, 18, 16, 6, 20, -50, -26, -56, 8, 21, 30, 6, -43, -57, 86, -37, 126, 15, -35, 6, 66, 34, 8, -15, -17, -35, -33, +30, -30, -11, -14, -3, -17, -25, -10, -37, 5, -23, 24, -18, -34, -24, -34, -7, 10, -1, 7, -18, 5, -29, 30, -39, -25, 18, 5, -7, 23, -19, -45, 14, -28, 40, 3, 14, 17, 2, 6, -1, 18, -18, -8, 20, -10, 16, 36, 13, -2, -23, -18, -16, -33, -5, -10, 4, -3, 17, 5, 89, 39, -25, 12, -58, -26, -30, 16, 33, -22, 41, 13, -1, -2, 116, 37, -26, 18, -7, 12, -20, +-4, -41, 63, 25, -27, -62, 19, 6, -44, -9, 34, 4, 59, -11, -5, 19, 25, 14, 54, 11, -20, -20, 8, -33, -11, -36, -22, -31, -19, -15, -42, 6, -14, -3, 8, 4, 43, -12, 0, -4, -16, -29, -24, -29, 6, 9, -53, 36, -27, 10, -10, -17, -69, -75, 20, -27, -12, 0, 77, -26, 24, 4, -10, -8, -44, -20, 16, 13, 28, 85, -46, -5, -36, -7, 65, -29, 16, -8, 39, 10, -52, +8, 27, 11, -23, 11, -29, -10, 25, 15, -28, -49, 19, -8, -2, 41, 9, 21, 43, -17, 12, -24, 39, 13, -7, 119, -24, -9, -5, -25, 44, 2, -51, -46, 26, 10, -2, -43, -8, -19, -16, 43, -10, 23, 19, 62, -4, 6, 7, 35, -1, 3, 41, -14, 9, -23, -10, -26, 60, 72, 124, -6, 5, 12, 4, -3, 5, 23, 12, -15, 26, -13, -33, -15, -11, -16, -14, -24, 28, -16, 0, 23, +-4, 3, 68, 21, -3, -39, -13, -28, -21, -1, -42, -29, -44, 26, -29, 26, -14, -19, -6, -21, 31, -14, 24, -47, 4, -7, -46, 63, -35, 38, -25, 79, -20, -23, 10, -19, 49, 19, 5, -23, -21, -26, 0, 8, -37, 15, -27, 11, -7, -2, -13, 11, 19, 29, 21, -36, 7, -36, -46, 25, -33, 50, -6, 77, -2, 4, -2, -15, 12, 1, -20, 19, 7, -27, -2, -19, -20, -17, 1, 25, 8, +-13, -5, 11, 22, 38, -6, 28, 31, -8, -10, -13, 20, 55, -5, 16, -22, 17, -18, -16, -13, -11, 10, -16, -5, -35, -30, 0, -9, -28, -47, 17, -26, 22, -12, 11, -17, 1, 92, 29, 92, 27, -42, 64, -24, -34, 8, 31, 3, -4, 64, -80, 6, 1, -52, 27, 9, 68, -24, -3, 17, -23, -48, 30, 7, -4, -12, 37, 60, 30, -28, -28, -6, 30, -14, 15, -14, -31, -5, 10, -17, -6, +-1, 6, 25, 4, -44, -31, 25, 29, -44, -26, 31, -29, -70, 21, 21, -11, -23, 14, -25, 23, -3, -60, -26, 7, -6, -12, -50, -50, 6, 20, -15, -24, 9, 18, -10, 7, -11, -53, 71, 23, -12, 32, -9, -23, -2, -21, 2, -40, -35, -7, -32, -48, -3, -46, 16, 18, -18, 33, 2, 30, -51, -4, 90, -51, -45, 23, -5, 45, -20, -10, -1, -23, -28, 26, 14, -29, -28, -25, 12, -7, 22, +-18, -2, 14, 59, -48, 10, -6, -9, -1, 100, 82, -9, -43, 88, 17, -8, -29, 4, 51, 63, 8, 2, -33, -30, 37, -12, -17, -6, -24, -10, -25, 34, -61, 4, 46, 34, 41, -1, -7, -23, -2, -19, -39, -60, -2, 7, 24, -4, 0, -26, -1, -36, -33, -9, 31, -14, 65, -8, -1, 37, 16, 11, -29, 35, -15, 20, 48, -35, 40, 7, 20, -25, -17, 1, -22, 13, -15, -5, -20, -28, -28, +-12, -2, 34, -15, 102, -1, 74, -29, 114, 18, -18, -10, -16, -62, 1, -69, 37, 41, 75, 48, -36, -22, -55, 65, -9, 41, 36, 3, 29, 68, 33, 5, -65, -12, 40, -11, -3, 32, 7, -5, 15, 37, -40, 2, 9, 1, -17, -14, -11, 34, -34, -12, 24, 0, -5, -14, -23, 18, 9, -3, 75, -2, -15, -23, 54, 0, 4, -24, -33, 20, -30, 43, 41, 14, 10, 93, -36, -6, 21, 40, -13, +-70, -26, 52, 49, 3, 3, -72, -36, 40, -42, 19, 26, 3, 0, -57, -56, 24, 38, 1, 19, 18, -17, 20, -37, -41, 45, -29, -27, -10, 0, -22, -4, 51, -14, -49, 35, 29, -27, -4, -15, 17, -26, -9, -9, -7, 44, -43, 11, -75, 45, 1, -3, -16, -20, 22, 0, -56, 41, -37, 33, -14, -45, 31, -7, 16, -36, -52, 11, 8, -19, 21, 24, -35, 33, -34, 4, -3, -35, -2, -12, -6, +-22, -7, -1, -2, -18, -2, -6, 47, -43, 38, -1, -24, 17, -48, -24, 0, -36, -26, 45, 14, -5, -4, -21, 12, -20, -16, 73, 0, -11, 3, 8, 40, 13, -30, -19, 127, -6, -35, -40, 42, 55, 21, 4, 1, 50, 30, 1, -34, -9, 17, -26, 7, 17, -50, -42, -31, -27, 13, 15, -28, -25, -27, 40, -7, -19, 8, -24, 49, 20, 12, -1, -11, 4, 7, 7, -13, 0, -26, -7, 10, 15, +-20, -33, -8, 40, -23, -8, -18, 3, -1, 66, -39, -22, -31, -30, -46, 5, 27, -28, -20, 6, -8, 12, -14, 18, -9, -31, -29, 36, 5, 4, -22, 24, 52, -38, 13, -2, -9, 4, 13, 67, 6, -28, 37, 50, 24, 10, 7, 9, 22, -18, 82, 72, 5, -48, -31, -30, 15, -6, 24, 33, 13, -21, 36, 6, 34, -18, -19, -12, 26, -23, 16, 23, -29, 11, -11, 16, -19, 0, 82, -42, 6, +-49, 82, -10, -9, 1, 17, 5, -9, 47, -6, -23, -26, -20, 42, -28, 0, 32, -4, -1, -33, -3, -26, 4, -9, 11, 14, -21, 12, 20, -27, -8, -8, -41, 32, 13, -6, -9, 2, -21, -16, 73, -22, -21, -32, -49, 65, -16, -2, 60, -14, -10, -3, -4, -32, 17, 25, 48, 33, 1, 38, 38, -9, -13, 27, -5, -10, -18, -28, 22, -5, 67, -15, 14, -3, 14, -21, -2, -1, -6, 62, -46, +-21, -28, -1, 33, -37, -4, 2, 23, -21, 14, 13, 127, 3, -16, -24, -9, -17, 24, -17, 0, -10, -38, 127, 19, 32, 37, 15, -15, 21, 42, 110, 39, -27, 2, 58, -55, -59, 0, -13, 57, -54, 21, -57, 1, 22, 6, -48, -24, 8, 13, 9, 0, 21, -24, -15, -28, 43, 8, 54, -27, 4, -33, 5, 53, 7, 2, -1, -5, 49, 16, 57, -33, -17, -23, -50, 10, 16, -56, 11, -11, 17, +-8, -15, -2, -34, 23, 2, 4, -1, -6, 28, -25, 4, 33, -22, 11, -3, 31, -20, 8, 6, -1, -10, -5, 7, -17, -27, 6, 8, 20, -20, 6, 27, -74, -41, 4, -30, -43, 2, 46, -1, -14, 8, 18, 58, 14, -34, 48, -7, -26, -5, -4, -66, -32, -37, -22, 5, 7, 14, -21, 11, 42, -17, -27, 6, 13, -20, -5, -9, 6, -23, 5, 7, 9, -25, 14, 76, 72, -8, -31, 7, 17, +-22, -15, 9, -17, -2, -32, 9, 21, 30, 68, -15, -11, 29, -7, 23, -36, -34, 49, -18, 49, 4, -19, -37, -41, -27, -9, 12, 78, -10, 25, -21, 7, -56, 14, -10, -11, 76, -20, 12, 15, -38, 66, 28, -34, -36, -17, 9, -42, 38, -29, -39, -73, 80, -30, 16, 65, 1, -7, -1, 2, 6, -42, -21, 17, -33, 18, 8, 12, -17, -16, -37, -5, -10, -38, 10, -49, -32, -12, 99, -17, -1, +0, -2, 28, 48, 56, -17, -13, 37, -9, 5, 59, 22, 56, 9, -40, -3, 15, 1, 41, -22, 31, -56, -2, -38, 18, 0, 3, -33, -19, -9, 4, -4, 11, -5, 6, -22, -24, 18, 3, -43, 36, 22, 57, -15, -30, -19, 18, -18, 5, 49, -24, -14, -20, 11, 51, 28, 66, -32, 25, 40, 43, 16, -21, 39, 13, -18, -21, 2, 54, 0, 1, 11, -1, -40, -11, 47, -8, 19, -10, -8, 29, +-53, -25, 46, 6, -29, -17, -7, 0, 0, 0, 48, -25, 0, 31, -6, 20, -22, -15, -31, 5, -33, -10, 27, -19, -17, -11, 10, -21, -30, -12, 20, -12, 4, -5, 57, -15, 6, 17, 6, 2, -36, 13, 23, -13, -24, -37, -23, 25, -24, 24, 15, -2, -12, -1, -37, 17, 3, -7, -19, -17, 25, -25, -17, -4, -12, 31, 29, 7, 42, -24, -48, -11, 7, -13, 32, 36, -8, -18, 35, -15, -23, +-9, 11, 14, -9, 29, -21, 5, -12, -17, 23, -27, 43, -17, -24, -15, -27, 37, 127, -12, -55, -31, -17, 37, -35, -37, 27, -28, -10, -15, 51, -37, 15, 19, 32, 2, 74, -12, 11, 9, 0, -39, -5, 43, -12, 7, -17, 2, 3, -29, 5, -23, -2, 2, -14, -21, 18, -9, -19, -6, -12, -1, 3, -75, -18, 55, 35, -25, -43, 0, 27, -14, 22, -43, -31, 36, -16, 13, -8, -2, 1, -59, +-30, -13, 32, 5, -1, 11, -8, -30, -42, 14, 4, -55, -32, -7, 74, 47, 17, -5, 95, 10, -15, 56, 9, 58, 16, -18, -19, 30, -33, 52, -26, -12, -39, -12, 18, -15, 32, 14, -22, 25, 13, -33, 4, -44, -7, -26, 4, 93, -17, 31, -28, -22, 17, 68, 6, -1, -1, 76, 10, 48, 22, -11, -21, -28, 25, 38, -21, -66, -31, -6, 0, 2, 19, -53, 39, -17, 14, -10, -24, -9, -20, +20, -2, 37, 22, 95, -3, -35, 2, -1, 16, 17, -1, 30, 29, -44, 1, 0, 7, 19, 24, -19, -33, -46, 56, -17, 22, 6, -19, 28, 10, -27, -5, -26, -6, -5, -4, 12, 20, -36, 21, -19, -1, -6, 27, 18, 1, 2, 22, -7, 15, 0, 127, -13, 3, -18, 8, 121, -8, -14, -4, -46, -32, -32, 36, -2, 61, -31, 12, 0, 29, -16, 16, -8, -3, -16, -19, -3, -40, 44, 12, -3, +18, 6, 43, -11, -38, -13, -59, 13, -20, -1, 10, 51, -23, 8, 0, 33, -20, -14, -24, 14, 30, -2, -11, 2, -14, 30, 2, -13, -24, -11, 15, -31, 26, 18, -20, -19, -16, -9, -23, 5, 0, -28, -19, -30, -60, 63, -58, 60, 19, -22, 44, 24, -18, -53, 1, -21, 18, 5, -24, -6, 83, -11, 23, 6, 64, 50, 5, 31, 21, 23, -59, 24, 23, -52, 19, 14, -8, 106, 55, -1, 8, +-26, 49, 25, -17, -26, 12, 92, -8, 38, 46, -36, -22, -17, -2, 71, 12, 46, -8, -1, -7, 22, 58, -33, -48, 22, -37, 12, 85, -2, 55, -27, -55, 61, 5, 21, -26, -21, 2, 19, -25, -35, -3, 23, 4, 16, -11, -16, 37, -1, 36, 35, 52, 99, 37, -45, -17, 7, -4, 22, -5, 28, 26, 21, -13, -34, -8, 30, -27, -4, -7, 29, -36, 17, 4, -31, 12, -2, 23, -20, 22, 13, +-9, 5, -28, -32, -11, -1, -10, -37, 31, -22, 56, -35, -15, 11, 68, -55, 45, -15, -4, 4, -10, 10, 47, 13, -20, 17, -19, 38, -16, 3, 52, 20, 20, 1, -29, -43, -28, 3, -7, 16, 55, 16, 61, -8, -16, -21, 40, -39, 5, -4, -15, -3, 23, 7, 7, 42, 29, -19, -23, 30, -20, 4, 56, 28, -1, -15, -36, 2, -6, 1, -12, 13, 15, -15, -3, -23, 114, 28, 27, -21, -9, +-39, -54, -23, 4, -22, 14, 18, 31, -23, -3, -16, 127, -6, -43, -17, -15, -20, 4, -14, 48, -34, 43, 27, -14, 5, -19, -12, 13, -37, 34, -46, 52, -17, 35, 8, 69, 2, 78, -13, 17, 6, 8, -27, -6, -8, -22, 11, -1, 30, -32, 86, -34, -21, -4, 41, -12, -13, -9, -4, 4, -24, 10, 19, -12, 13, 75, -30, -3, 5, 22, 24, 41, -1, -20, -3, -32, -11, -7, -17, -6, 10, +-26, -1, 1, -28, 22, 39, -35, -10, -24, -20, -5, -13, 42, 6, -17, 28, -11, -29, 13, 39, 0, -6, 25, 21, 45, 23, -39, -14, 5, -2, 30, 1, -35, 25, 7, -11, -48, 4, -1, 33, 25, -21, 32, -4, 55, 37, -12, 38, -15, -13, 7, 21, -15, -38, -31, 7, 16, -6, -2, 56, 40, 0, 15, -39, -29, 2, 12, -35, -8, 20, -19, 11, -69, 32, -61, -15, 19, 17, 38, 0, 17, +-30, -28, 9, 15, -60, 50, -44, -8, 40, -6, -46, -1, -42, -14, -12, 75, 47, 33, 51, -33, 25, 22, -33, 7, 76, -5, 15, 11, 16, -11, -15, -21, -54, 4, 28, 1, 24, 49, -14, -24, 44, 54, -45, -19, 17, -3, -32, -33, -20, -28, 26, 6, -12, 11, 21, -20, 67, 14, -18, 8, 14, -13, -28, 6, -3, -5, 6, 1, -10, -34, 3, 18, -20, 5, -18, -6, -12, 2, -11, -9, -10, +14, -28, 9, 18, 33, -14, 76, -13, 0, -47, 12, -5, 45, 127, -58, -27, 37, -15, -3, 12, 69, -5, -3, -18, -12, -24, -32, 19, 2, -18, -12, -22, -49, 26, -6, 28, -47, -52, -28, 8, 127, 9, -5, -10, -1, 9, 3, -29, 25, 0, 6, 21, 56, 8, 51, -13, 38, -31, -21, 0, 21, -27, 1, 24, 1, -10, 6, 20, -21, -55, 81, -50, 50, -37, 20, -25, 2, 14, -14, -19, -9, +16, 23, 15, 23, -5, 77, 10, 24, 2, 47, -9, -32, -19, 46, 0, 22, -11, 33, -68, -56, 7, -26, -23, -24, -21, -21, -42, -25, -3, -36, -1, 21, 10, -30, -35, 39, -4, -25, 2, 0, -14, -36, -44, -49, -35, 25, -54, 83, 25, 76, -16, -56, -26, -18, -24, -4, -44, 9, 50, -32, -42, 7, 23, 26, -22, -25, -8, -14, 36, 19, -6, -7, -5, 3, 42, -6, -18, 7, -12, -27, 42, +5, 8, -3, -32, -39, 28, 127, 71, -19, 0, -7, 11, -12, -20, -16, -41, 4, 8, 41, 9, 46, -33, -12, -18, -44, -24, 19, -30, -24, 2, 18, -35, -14, -9, 4, 23, 53, -21, -11, 58, 8, -16, 95, 41, -7, -36, 6, -15, -30, -16, 40, -80, 73, 103, -60, -33, -34, -7, 73, -14, -38, -3, 54, 3, -1, 11, -25, 4, 11, 10, 13, -9, 6, -16, -6, -10, 24, 16, 17, -30, -3, +11, 18, -12, -29, -11, 1, -1, 1, -24, -8, 7, 28, -8, 17, 56, -8, -3, -8, 15, -29, -35, 41, 48, 21, -65, 20, 12, -22, 10, 24, 59, -41, 16, -19, 47, 2, 22, 29, -45, 16, -34, 16, 1, -22, -23, -21, 103, 22, -21, -51, 6, 0, -30, -34, -48, 24, 1, 18, 62, 49, -38, 69, -21, -8, -15, 11, -4, 40, -33, -50, 14, -11, 61, -39, -7, 6, -15, 20, -8, -13, 52, +24, 31, 23, 3, -5, 38, 42, -11, -2, -2, -12, -6, 43, -18, -41, 0, -22, -4, -18, -1, -26, -34, 29, -23, -38, 27, 18, -6, -5, 6, 28, -13, -23, -24, -4, -25, -21, -5, -3, 14, -32, -34, -41, -4, -44, -1, 8, -2, -33, -12, -56, 45, 10, 15, 20, -7, 1, -23, 1, -13, 42, 7, 19, 9, -30, 19, -4, -13, -9, 14, -13, 15, 29, 24, -37, -19, 12, -13, 13, 4, 4, +-38, -51, 88, 47, -7, -9, -20, -36, -13, 2, -81, 110, 76, 58, -16, -7, 6, 29, -16, 38, -40, -22, -1, 70, 42, 6, -40, -14, -45, 7, -49, -31, 6, -32, 84, -11, -6, -37, -7, -1, 84, -17, -25, -9, 17, -38, -11, 63, 6, 37, -20, -24, -42, -16, -20, -42, -8, -33, 3, -16, -44, -39, 11, -17, -14, -66, -39, 27, -16, 32, 21, -2, 60, -13, 35, 43, 12, -41, 12, -9, 26, +6, 4, 10, 28, -28, -15, 35, -6, 11, -34, -8, 23, 10, -9, 9, -1, 40, -15, -29, 2, -2, -4, -5, 21, -22, -11, 20, 28, 13, -7, 30, -17, 38, -32, 0, -25, -12, -34, -44, -18, 33, 7, 18, 33, 21, -32, 49, -39, 27, 64, 15, -10, 16, 2, 37, -11, 2, 81, 1, 94, 28, -40, 6, -22, -59, -5, 24, 31, -21, -50, 82, 23, 25, -86, 24, 15, -46, 10, 94, 67, 78, +70, -40, -56, -1, 22, 22, 120, -35, -26, 68, -3, 49, -70, -33, -49, 61, -57, -30, 19, 23, -61, -4, 46, 2, 36, 9, -18, -3, -35, -36, 56, -37, 58, 0, 60, -62, -13, 61, 14, 42, -39, 20, 39, -13, -18, -2, -6, 6, 14, -77, -7, 2, 9, 122, -10, -15, -31, -6, 89, -60, 34, 5, 1, -62, 20, 40, 52, -5, -2, -28, -53, -24, 58, 3, 38, -15, -5, -5, -3, -4, 20, +-24, -2, 4, -15, -16, -21, -22, -3, -11, -38, 1, 3, -34, 18, -19, -5, -26, -3, 1, 22, -2, -15, -15, -8, -1, 53, 20, -40, 87, 6, -29, 21, -1, -8, 16, 22, 48, 51, -17, -8, -25, 32, -4, 5, 11, 14, -65, 53, -17, -2, 87, 16, 18, 29, -32, 11, -60, -26, -9, -44, -25, -8, 42, 11, -41, -7, -21, 34, 20, -59, -14, 33, 55, 30, 72, -29, -18, -13, 64, -4, -48, +-29, -30, -7, -49, -10, -7, -13, 18, 53, 50, 1, -35, -22, -1, 22, -6, -10, -17, -9, 8, 15, -7, 1, -2, 20, -17, -3, 10, -21, -9, -19, 6, 20, 12, -2, -6, -16, -24, -1, 41, -40, -3, -43, 58, -52, 47, 66, 12, -11, -6, -23, -19, -1, -4, 27, 15, -12, -6, -38, 84, -22, -42, -23, 76, 9, -14, -13, 15, 7, 44, -88, 15, 74, -21, -6, 43, -15, 0, 18, 5, -46, +-6, 2, 26, -41, 12, 18, 7, 18, 1, 10, 46, -40, -39, 69, -4, 76, -8, -21, -51, -26, -21, 35, 68, 3, 24, -34, -9, -6, -24, 14, 9, -22, 12, -3, -18, -39, 52, 13, -10, -36, -30, 9, -7, 20, -65, -30, 4, 14, 0, -19, 72, 23, 25, 10, -30, 73, -18, -26, 9, 0, -8, 1, 17, 14, 28, 11, -19, -43, -38, -44, 21, -28, -25, -24, -7, 22, -12, -26, -3, 12, 1, +-25, -13, 0, 22, 36, 29, 99, -31, -34, -34, 21, 4, 45, 22, -11, 7, -30, 18, -62, -44, -71, -35, 9, 7, -24, -34, -21, -55, -27, 56, -18, 57, 41, -17, 23, -9, 87, 26, 6, 15, -34, 42, -48, -19, -15, 9, -28, -16, 31, 76, 13, -16, 21, -23, -33, -68, -15, -35, -7, 9, -35, 18, 5, -30, 2, 29, -20, 42, -48, 40, -22, 27, 43, -22, -44, 45, -18, -13, 26, -8, 0, +-20, -2, 84, -6, -15, -12, 106, -11, 73, -18, -29, -17, 22, 61, -47, -16, -18, -19, 10, 40, -11, 6, 25, 2, -25, 9, -8, -34, -22, -12, 13, -13, 32, 2, -10, -5, 51, 18, -1, -23, -22, -11, -2, -25, 23, 33, -26, 1, -7, -7, 21, -6, 13, 16, -9, -10, -18, 61, 15, 7, -9, -15, -20, -4, 21, -30, 16, 69, 19, -10, -12, -7, 15, -9, -10, -32, 2, -11, -20, 49, -8, +-24, -11, -22, 13, -51, -27, 4, -5, -28, -31, -32, 48, -47, -4, 20, 83, -12, -27, -21, -45, -58, 6, 34, -40, -77, 14, -40, -35, 61, 46, 15, 25, 56, 13, 2, 30, -52, -1, -15, -23, 22, 24, 47, 43, -12, 11, -31, -45, 90, -49, -27, 15, 2, -33, -46, 40, -13, 8, -50, -22, 30, -17, 51, 34, -41, -50, -46, -13, 11, 11, 13, 3, -10, -38, 54, -8, 97, -40, -14, -11, -29, +95, -30, -20, 1, 1, -7, -30, 3, 7, -11, 26, 38, 18, -20, 45, 6, -12, -10, 3, -20, 12, 52, 0, -22, 0, -24, -12, -32, -13, -7, -30, -24, 2, 8, 4, -18, 40, 13, -25, 44, 12, 35, -32, 1, -26, -6, -6, -11, -20, 25, -27, -63, -21, 7, -29, 40, -16, 0, -45, -34, -4, 45, -11, -19, -22, 21, -43, -11, -20, 7, -52, 10, -29, 1, 33, 97, -36, -17, 33, 31, -22, +14, -29, -22, 58, 51, -15, 47, 8, 48, -10, -50, 4, -69, -45, -47, -3, -27, -2, -13, 4, -34, 5, -47, -2, 24, -9, -6, -40, -16, -10, -25, -36, -35, -5, -12, 17, -12, 2, -10, 4, -16, 3, 7, 24, -11, -14, -6, -7, -2, 20, 7, 2, 37, 1, 5, -13, 16, -18, 5, -5, -14, -17, 34, 32, 9, -24, -9, -56, -38, 104, 18, 48, -30, -1, -17, 0, 17, 118, 22, 31, -47, +12, -61, -5, 95, -14, -29, 23, 61, -22, 40, 34, -26, 6, 40, -6, -59, 38, -28, 17, -21, -60, -20, -4, -42, -10, -17, -33, -24, -18, -16, 1, 5, -31, -14, 19, 15, -33, -2, -14, 44, 23, -35, -9, -49, -17, -25, -10, -2, 57, -15, 14, -16, -10, 9, -4, 21, 41, 4, 0, -5, -14, -7, 9, -27, 6, -41, 5, -14, 15, -14, -3, 4, 8, 23, 31, -18, 40, -6, -26, 10, 0, +-22, -11, -59, 4, -14, 31, -28, 3, 50, 67, 17, -46, 76, 3, -4, 23, -19, 60, 64, -15, -12, -30, 1, 17, -52, -18, -7, -1, -16, 11, -15, -23, 8, -24, -41, 2, -6, 89, -47, -9, -2, 49, 94, -67, 71, 4, 74, -11, 2, 41, 64, 7, 8, 12, -16, 42, -13, 15, -53, 7, -63, 1, 28, -35, -34, -66, 7, 56, 127, -34, 76, 18, -6, -27, 3, -10, -26, 35, 66, 48, 15, +23, -5, 6, -51, -1, 41, -42, -28, 20, -40, -7, -21, 56, -89, -2, -25, -46, 10, -14, -5, 19, -1, 13, 42, 44, 91, 34, 7, -10, -23, -13, 37, 14, -26, 12, 13, -23, -15, 7, -20, 18, 92, 40, 6, -13, -6, 115, 17, 3, 11, -15, -9, 16, 18, -7, -2, -19, 127, 8, -10, 24, -4, -11, 29, 10, -8, -8, 1, 27, -6, -31, 0, -12, -5, -1, 38, -1, -20, -3, 24, -2, +29, -13, -13, -26, -1, -6, 8, -15, 1, -11, -18, 26, 47, -4, 18, -36, 35, -4, -13, -6, 7, 10, -23, 29, -28, -34, -3, -12, -18, -27, -14, -48, 8, 0, 47, 17, 12, 32, 28, -12, -2, -33, -36, 16, 49, -48, -28, -4, 19, 5, -28, -9, 59, -28, 9, 36, -36, 4, -20, 35, -55, 0, -6, -49, 81, -3, 11, 60, 29, -28, -17, -65, -20, -62, -55, 40, -68, 12, -41, -21, 47, +-11, -39, -14, 14, -40, -25, 21, 15, 30, -2, -5, -37, 6, -63, -6, -63, 6, -16, 93, -26, -38, 34, 31, 6, 88, -43, 21, 45, -40, -29, 11, 103, 42, 23, 18, -38, -17, -12, -39, -5, 23, 12, 30, 33, 40, 36, 1, 33, 5, 17, -21, -11, 14, -7, -13, 18, -24, 4, -22, -20, 4, -16, 6, 24, -13, 13, 20, -22, -24, -17, -12, 20, 42, -15, 2, -9, 24, -26, 9, 18, -36, +42, -20, 4, 2, 46, -13, 0, 31, 31, 35, 125, -26, 19, -15, 1, -14, 52, 1, 26, -29, 24, 15, -9, -35, 62, -19, -3, 35, 30, -33, -17, -5, 31, -21, -15, -12, 7, 58, -25, -3, 9, 5, -28, 43, -14, 38, 40, 66, -17, 75, 22, 76, 29, 19, 19, -24, 1, -32, -9, -24, -5, -1, -9, -5, 27, -15, -27, -7, -21, -13, -4, 127, 4, 0, 26, 4, -13, -8, 2, 25, -20, +15, 3, 3, -15, -1, 8, -18, 12, 7, -21, 13, -54, 53, 4, 14, 107, -17, -45, 12, -12, 31, 69, -36, -46, 91, -19, -16, -2, -41, 13, 60, -13, 37, 7, -77, 75, 23, 18, -8, 3, -8, 21, -30, 48, 120, 42, -28, 76, -31, 18, 38, -11, 21, 41, 42, 31, -45, 23, 97, -34, 6, -8, 0, -34, -1, 22, -47, 45, -16, -6, 78, -2, -4, -56, 2, -32, -18, 42, -5, 8, -12, +-17, -37, 4, 32, -3, -2, -16, 10, 18, -41, -51, -25, -18, -34, 8, -28, 20, 4, 4, -25, -5, 28, -3, -19, -20, -13, 31, 77, 49, -24, -44, -48, -77, -41, -23, 0, -26, -26, -14, 28, 42, 6, -13, 1, 7, -11, -6, 2, -25, 31, 37, -17, -9, -30, -40, -22, 9, -22, 61, 97, 75, -22, -13, 12, -127, -30, 4, -31, 29, 57, -27, 59, 34, -15, 18, -51, -2, 11, 16, -28, -36, +-26, 62, -23, 38, -23, -9, 9, -52, -24, -47, 20, 42, -24, -10, 15, -57, -103, -1, 41, -37, -18, -29, -12, 17, 22, -72, 22, 34, 30, 96, 23, -17, -17, 59, -15, 23, -41, -25, -31, -41, 8, -9, -1, -71, 0, -28, 38, 24, -25, 31, -41, 9, -18, 1, -15, 20, -70, -23, 13, -29, 39, 0, 27, -12, 56, 29, -7, -30, 28, -59, 10, -14, -11, -18, -1, -7, 5, -26, 49, -30, -8, +-26, 7, 14, -23, -28, -25, -7, -7, 0, 39, -9, 2, -30, -29, 12, -23, 55, -5, -7, -11, -29, 24, 0, 15, -1, 20, -6, -48, -23, -4, 56, -28, 10, -16, -6, 4, 3, 3, -14, -28, 47, -16, -11, -7, -24, 18, -9, 16, 14, 1, -5, -2, -12, -20, -38, -16, 15, 48, -8, -32, 9, 29, -92, -89, 7, 38, -25, -9, -26, -45, 42, 73, -36, 7, 66, -31, -36, 46, -3, 20, 1, +-41, -50, 10, -70, -12, -6, -12, -50, 127, 30, 0, 60, 90, 28, 37, -49, 7, 7, 19, 25, -33, 52, -55, 44, -27, 13, 79, 0, 64, 8, -24, -37, -78, -12, 13, -16, -5, -14, -3, -30, 16, -30, -59, -9, -28, -51, -33, -44, 116, -28, -58, 9, -24, 16, 74, 78, 52, 6, 11, 33, 23, 36, -10, -14, 17, 30, -26, -71, -2, -69, -73, 16, -27, 16, 18, -15, 30, -3, 8, 50, -11, +3, 12, 3, 34, -15, -6, 1, -9, -28, -20, 39, -6, 37, 6, 3, -29, 19, -18, -20, -5, 3, -34, -47, 66, 127, -31, 15, 52, -5, -19, -22, -32, 6, 16, 49, 20, -37, 6, 3, -30, -13, -16, -8, -11, -18, -40, 39, -21, -8, -16, -41, -14, -33, 43, -20, 67, -32, 27, -15, -17, -35, 27, 38, -16, -48, -2, 127, -24, -13, -27, -13, 29, -12, 13, -8, -19, -23, -52, -60, -25, -31, +40, -28, 3, -1, -9, -1, -7, -3, 29, 22, -29, -24, 6, 2, -1, 6, -13, -12, -10, 25, -22, 1, -7, -29, -38, 27, -5, 9, -11, 21, 10, -12, -30, 11, -23, -11, -28, -12, 39, 15, 17, -46, -45, -40, 7, -56, 7, -24, 27, -33, 22, -11, -39, -105, 59, 19, 45, -34, -45, -41, -36, -5, -30, -34, -28, 127, -22, 89, 20, 27, -29, 22, -20, 96, -26, -28, 11, -14, -24, -10, -22, +-12, 69, -3, 31, -37, 17, -49, 33, 3, 127, 7, -25, -44, -28, 17, 17, 17, -8, -22, 10, -12, -6, -4, 46, -2, 10, -12, 50, -7, -28, 14, -39, 16, 49, 13, -30, 19, 6, 1, -26, -13, 16, -2, -13, 5, -41, -13, 6, 5, 15, -14, 1, -5, -1, -20, 127, -14, 34, -30, 1, 10, 50, -20, 1, 33, 17, -18, 42, 50, 11, 37, 5, -3, -23, 50, 47, 13, 27, -32, 3, -12, +-2, -46, -24, 3, 7, -38, 25, -6, 48, -2, -31, 22, 15, -18, 15, -26, 8, -12, 33, 58, 20, 3, 40, 0, 5, -45, -32, 27, 91, -30, 17, 32, -5, -96, 12, -28, -49, -18, 8, 2, -67, 108, -25, 17, 62, 13, -10, 9, 19, -53, -18, -2, -65, -53, -42, -23, 54, 96, 44, -71, 46, 0, 20, -20, -51, 8, 29, -46, -25, -17, -18, -46, 7, -6, 50, -15, -22, -33, 90, 22, -24, +-19, 19, 45, -11, 127, -21, -64, 15, -27, -3, -10, -29, -38, 12, 29, -23, 15, -8, 23, 17, 0, 4, 22, -28, 8, -23, -14, -12, 7, -23, -13, -10, 24, -5, -18, 13, 1, 26, -17, -28, 51, -41, -13, 14, 43, -1, 3, 16, -10, 31, 32, 14, -25, 14, -26, -51, -46, -6, 13, 4, -31, -4, 6, -4, -15, -6, 37, 11, -3, 25, -17, -31, -29, -38, -1, 7, -17, 56, -14, -14, -29, +19, 79, -29, -56, -17, 26, -20, 8, 6, -43, -17, -7, -5, -10, -6, -19, 6, -27, -51, 34, -1, -41, -14, 81, 23, 25, -26, -35, -58, -14, -9, -36, 35, 17, -29, -43, -18, -20, 59, -16, 55, -45, 41, -1, 8, -46, 20, 126, -55, 29, 1, 1, -24, -32, -39, -2, -59, 17, -39, -6, -10, -61, -31, -20, 24, 74, 11, -16, -48, -39, -1, -54, -25, 18, 36, -24, 127, -41, 1, 1, -20, +-39, -29, -26, 14, -12, 28, -19, 4, 30, -23, -40, 42, -61, -33, 4, 9, -12, -39, 35, 10, 36, -19, 8, 37, 7, 1, 32, 34, -7, -7, -14, 9, -4, -21, 127, -30, 15, 7, 2, -8, -6, -17, -18, -18, 36, -9, -40, -21, -5, 26, -16, 8, -14, -21, -3, -37, -5, -11, -35, -10, -2, -28, 19, -11, -15, -2, 1, -8, -5, 17, 24, 8, -27, 0, 30, -10, 0, 66, -4, 17, -15, +38, -40, 23, -47, -28, 46, 81, -7, -10, -1, -19, -25, 30, -13, 21, 54, -21, 47, -32, 103, -25, -19, 5, -36, 5, 4, 16, 71, -44, -8, 34, -6, -4, 8, -39, -13, -19, 2, 18, 35, 10, -16, 27, -11, -5, -13, -9, 22, -15, 7, -7, -7, 34, 10, 24, -9, 2, -6, 17, 4, -1, -3, 10, -1, 41, 24, 21, -34, 26, -25, 42, 6, -25, -10, 4, 50, 23, -18, 21, 41, 13, +-12, -9, -18, -67, 20, -30, 55, -26, 39, -1, 31, 10, -21, -24, 42, -8, -28, -29, 3, 6, -36, -9, 5, -48, 11, 28, -49, 27, -8, -33, 73, 0, -28, -12, 54, -61, 0, -2, -62, -2, -28, -9, -36, 20, -28, -36, -12, 34, 48, -43, -34, 44, 38, -12, 22, 5, 26, 7, -27, 37, 32, 21, 19, 29, -11, 10, -21, -17, -2, 13, 24, -7, 26, -32, -31, 38, 1, -6, -11, -25, -3, +-17, 36, -19, 15, 83, -7, 64, -24, 100, -15, -29, -14, 14, 72, -44, 5, -72, -42, 32, -16, 85, -14, 21, -29, 2, -40, 6, -43, -14, -34, 11, 28, -4, 15, -23, 18, 104, -57, -8, 42, 13, 2, -12, -35, 50, 75, -46, -4, -33, -49, -15, -36, 76, 23, 43, -51, 19, -2, 17, -34, 32, -22, -7, -42, -5, -39, 44, -5, 5, 23, 17, -7, -10, -21, 27, -13, -1, 47, 12, -14, 37, +83, -36, 21, -3, -6, -64, 15, -3, 2, -12, -30, -73, 4, -10, -47, 27, 1, 20, 40, -35, -53, -60, -3, -41, 79, 116, -4, 50, -1, 33, -10, -52, -16, 7, 115, -3, -6, 54, -41, 36, 17, -3, -1, -42, -7, 21, -37, 3, -12, -2, -17, -9, -13, -33, 13, -11, 0, 0, -11, -19, 8, 32, -2, 23, 17, -19, -23, -46, 30, -16, -4, -1, 55, 13, -14, -2, -28, 25, 54, 3, 8, +-2, 7, -6, -29, -17, -14, -17, -26, -27, -24, 29, 34, -5, 4, -5, -6, -19, -25, -15, -21, 2, -11, -23, -9, 8, 10, 127, -64, -34, 34, -13, -51, 68, 64, -7, 14, -41, 15, -12, -54, 80, -1, 0, 37, -11, -2, 72, 50, 0, -38, 53, -59, -20, -16, 8, 45, -37, -20, -23, 27, 100, 19, -16, -47, -9, -49, 27, 1, -40, -15, -3, -7, -60, -4, 9, -20, 91, 43, -27, 28, -26, +6, 10, 22, -31, 60, 0, -18, -25, -1, -29, -15, -23, 7, 10, 12, 46, -44, 25, 12, -8, 8, 37, -3, 50, 20, -45, -19, 20, 14, 15, -9, -13, -12, 16, -8, -11, 23, -40, 16, 49, -1, 23, 28, -11, -10, -14, 24, 56, -10, -17, -9, -9, -14, -9, -44, -8, -8, 37, -16, 1, -36, 11, -22, -36, 75, -28, -6, -4, 8, -19, -9, 34, -2, 0, 18, -6, 8, -24, 22, -25, -1, +5, -26, -24, -51, -43, -12, 59, -32, 40, 7, -4, 1, 48, -5, -33, -9, 50, 16, -12, 27, 31, 34, -58, 15, 12, 7, -53, 21, 30, -6, 18, -23, 2, 28, -41, -19, -50, 22, -65, -57, 47, -38, -14, 10, 5, 23, 50, -8, -4, -62, 37, 1, 8, 72, 27, 37, 18, -14, 0, -14, 28, 11, 24, -18, 9, 23, -26, 31, -17, 4, -18, -4, -13, 17, 5, 16, -10, 25, -15, 1, -7, +-11, 2, -7, -11, -19, 7, -13, -12, -36, -29, 9, 31, -13, 44, -58, 22, -9, 12, -21, -50, 19, -47, -40, 66, -10, -28, -20, -26, 0, 66, -6, 13, -55, -16, -60, -6, -6, -18, 1, -12, 79, 6, 49, -19, -60, -11, 4, 1, -5, 10, -15, -34, -16, 31, 24, 47, 29, 21, -50, -10, 43, 20, -51, 3, -5, 5, -22, 62, 37, -5, -25, -8, 20, -11, 37, 37, 9, 29, 6, -7, -10, +-45, 9, -40, 11, -24, -20, -1, -24, -22, -22, 26, 32, -27, -28, -16, 14, -24, -25, 110, 26, 18, -13, 37, 62, -1, -21, 92, 7, 12, -31, -9, -21, -31, 38, -5, 22, 56, 9, 30, 8, -17, -20, -14, 45, 19, -60, -12, -33, -18, 34, 26, -2, -4, 8, -21, 72, -40, -35, 78, -25, -49, -54, -5, 32, 8, -61, -1, 50, 60, -27, 48, -23, 24, 16, 36, 40, 16, -3, 13, 50, -19, +-3, 23, 31, 9, -29, -6, -69, 37, -37, -48, -79, 81, -46, 112, 17, -22, 9, 10, 28, 5, 125, -46, -14, -16, 17, 20, 53, -2, 24, -45, -55, 36, 9, -3, 101, -55, 92, -27, 3, 18, 41, 13, -34, 1, -46, -29, -76, -11, -50, 50, -12, 62, -14, -20, 23, -16, -32, -15, -22, 16, -6, 34, -38, -16, 86, -22, 10, -55, -18, 38, 1, -7, 6, -15, -28, -14, -14, 32, -14, 5, 1, +-12, 14, -11, -5, -17, -18, -15, 28, 30, 28, -4, 0, 54, 6, 9, -21, 24, 15, 6, 86, -42, 4, 15, -25, -21, -28, 27, -3, -26, -3, 18, -4, 39, -71, 33, 63, 3, -18, -41, 34, -6, -13, -6, 25, -21, 73, 6, 39, -30, -16, -11, 10, 1, 25, 13, -17, -4, 46, 50, 35, 51, 18, -66, 5, 15, 58, -55, 123, 0, 40, -29, -5, -17, 72, 13, 38, 19, 17, 122, 12, 21, +101, 14, 36, 74, 10, 12, -11, 5, -21, 12, 54, 19, 94, -28, -72, 24, -31, 9, -35, -55, 44, -22, 45, 4, -7, 125, 23, 14, -19, 29, -9, 62, 60, -29, -8, 37, 2, -33, -20, -9, -51, -41, -4, 34, -39, 1, -12, -33, 26, 12, -13, 24, 49, -38, -45, -64, 26, 17, 34, -25, -63, -23, -25, 9, -43, -15, -60, 18, -9, -26, -44, -1, -2, -18, 57, -2, 11, -18, -28, 23, -27, +6, 14, 18, -10, 15, -20, 1, 11, -29, -24, -32, 15, -21, 14, 0, 51, -28, -31, -11, -13, 10, -34, -7, -76, 8, 4, 39, -29, -18, 6, -3, -25, 48, -6, -8, 39, -26, 54, -2, 19, -39, -27, 9, 1, -39, 20, -5, -13, -21, 4, -39, 25, 51, -21, -70, 2, 24, -47, -44, -21, 36, 32, -5, -9, -21, -27, -19, 17, -22, -24, 4, -18, -29, 28, -11, 3, -11, -12, 1, -21, 13, +12, -22, 27, 2, 1, 27, -1, 3, -7, -10, -22, 58, -12, -44, 10, -14, -5, 20, 24, -34, -26, 34, 22, 15, -7, 10, 8, 9, -3, 5, 8, 0, 4, 10, 85, -17, -40, 55, 24, -18, -2, 45, -89, -26, -32, -32, 26, 0, -45, 22, -42, -4, -11, 16, -64, 15, 25, -46, -16, 0, -33, 18, 12, -6, 45, 98, 0, 25, -24, 23, -32, -12, 37, -20, 12, -28, 13, 61, 15, -15, -21, +19, -3, 11, 26, 16, -20, -70, -53, 39, -36, 20, 14, 31, -5, -59, 7, -33, -24, 25, 3, 31, -19, 17, 61, -15, -6, 12, -21, -8, -31, -14, -37, -3, 28, 0, 38, 30, 44, -51, -17, 127, -10, 14, -2, -15, 9, -13, 36, 88, -43, -38, 20, 22, -24, 50, 28, 54, -8, -10, 21, 53, 91, 11, -31, -16, 42, 2, 54, 18, 4, 69, -9, 30, -29, 28, -16, 16, -16, -2, -22, -5, +-8, -2, 82, -35, 20, -42, 16, -35, -40, -41, 6, 101, 73, -15, -28, -10, -54, -50, 19, 37, 28, 82, -22, -4, -48, 66, -6, -32, -41, 11, -12, 5, 74, 40, 12, 46, -16, -11, -46, -37, 10, 49, 101, -25, -41, -4, -10, 9, -36, -3, 24, -10, 12, 6, -12, -29, -41, 8, 54, 6, 46, -3, -19, -10, -35, -10, -63, 38, -47, 99, 46, -57, -10, 28, -31, 7, -67, 3, -44, 5, -27, +11, -12, -4, 47, 47, 35, -14, 85, 97, -20, 40, -8, 4, 75, -50, 12, -1, -12, 4, -14, -35, -38, -7, 41, 13, 17, 8, 10, -18, -10, -1, 30, 17, -1, 10, -12, 24, 25, -28, -4, 27, 34, -21, 10, -3, 35, 25, 29, -10, -12, -25, -9, 30, 2, 0, 45, -13, 62, 29, -8, -10, 29, 29, 12, -31, -19, -55, -39, -17, -22, -1, -4, -8, 13, -8, 72, -22, -15, -2, 53, -16, +0, -43, -12, -35, -65, -57, -16, -20, 127, -10, 47, 1, 44, 31, -37, 35, -23, -74, -30, -63, -28, -41, 15, 102, 51, -26, 6, -23, 69, 33, 1, -30, -30, 4, -8, -7, -20, -18, 33, -79, -3, 44, 12, -4, 41, 1, -29, 20, -36, 36, 37, -30, -23, -30, -56, -1, 2, -9, 35, 26, 26, 42, 127, -2, -2, -27, -47, -17, 53, -20, 21, -3, 5, -25, 23, -7, -11, -8, 18, -50, 26, +85, 17, -9, -15, 77, 4, 24, -35, 16, -29, -10, 70, -43, -8, 31, 7, 28, -25, -32, 8, 35, -23, 12, -24, 19, 13, -27, 9, 5, -15, -26, 52, 41, 4, -3, 16, 10, 7, 59, -12, -3, 4, -30, 20, 43, 15, -11, -13, -11, -18, 5, -25, 32, -2, 0, 7, 20, -41, -24, -4, 21, 86, 16, 7, 70, -15, 11, 53, -23, -15, 1, -9, 29, -36, -20, -39, -7, -3, 55, 30, -52, +-30, 5, 14, -39, 31, 21, -53, -7, -50, 99, 21, -27, -52, -35, 11, 15, -6, -30, -8, -8, 32, 39, -24, -62, -23, -11, -33, 10, 46, -26, -13, 102, -41, 27, 49, -28, -20, -60, -24, 65, -68, -19, -46, 30, -25, -22, -42, -41, 52, 43, -18, -4, 22, -11, 5, 48, -18, 20, -4, -58, -10, 55, -1, 14, -31, 73, 4, 7, -30, 3, -29, 21, -27, -31, -21, -5, -25, -11, 14, -22, -11, +28, -3, -32, -32, -29, -22, -14, -4, 2, -52, 3, -13, -3, -20, 14, -21, -27, -32, -22, -16, 73, 16, 5, -13, 23, 1, 57, -42, 45, -2, -11, 57, 50, 87, 67, 26, 16, 33, -18, -44, -26, -5, 96, 0, 22, -38, 19, -11, 16, 33, -3, 38, 17, -6, -18, 2, -39, -21, -24, 1, 13, 4, -6, -38, 14, 24, -22, 11, 127, 55, -22, 3, -21, -20, -21, 16, 39, -4, 5, 31, 19, +25, -8, -64, 18, -27, -27, -34, 11, -5, -48, -6, 28, -25, -20, -19, -18, 47, -1, 1, 50, -22, -13, -15, -6, -25, 19, 21, 12, -15, 97, 68, -19, -62, -46, -6, 4, -15, 41, 21, 9, -72, -27, 15, -2, -52, 9, -36, 31, -19, -38, 6, 10, -24, 61, -33, -44, -30, -13, 67, -50, -14, 35, 81, 102, 30, -29, 20, 22, -11, 66, 42, 50, -54, -23, 44, -33, 71, -7, -16, -105, 0, +64, -12, 31, -18, -14, -17, 19, -2, 50, 6, 40, -16, 58, -8, 57, -22, 2, 30, -48, -18, 10, -64, -26, -34, 33, -33, -28, 102, 0, 19, 43, 93, -4, 60, -30, -39, 48, 12, -4, -32, -4, -8, 50, 2, 32, -20, -28, 2, 33, 8, -42, -30, 35, -21, -2, -33, 7, -10, -15, -17, 29, 28, 20, 49, 16, 3, -24, 1, 54, 49, 31, -19, 41, 19, 34, -46, 23, -28, 19, 16, -15, +89, 49, 40, -12, 64, -29, -21, -45, -36, -7, 40, 45, -4, -19, -3, 10, 32, -34, -32, 0, 26, -52, -1, -43, 5, 10, -17, -2, -10, -17, -15, -29, -27, 7, 127, 0, 28, -32, -34, -26, -7, -13, -23, -20, -29, -7, 15, -19, 23, -21, 23, 9, -13, 2, -12, 10, 0, -42, 58, -31, -26, -7, 43, -22, 11, -51, 33, -27, -35, -11, -18, -24, -22, -41, -19, -9, 42, -18, -6, 25, 4, +29, 40, -17, 13, -15, -24, -25, -35, -15, -16, -33, -43, 15, -23, -13, -29, 16, -55, 0, -30, 9, 42, 40, -5, -28, -15, -6, 111, -42, 10, -28, 20, -15, -24, -33, -38, 43, -41, 11, 57, -3, -12, -12, 7, -15, -7, -28, 4, -8, -28, -1, -13, -38, -19, 2, -4, -37, -19, -29, -31, -31, 3, -8, 19, 15, -10, -26, -2, -4, -6, -8, -24, -7, -44, 60, -18, 12, 29, -19, -39, 69, +-18, 25, 66, 35, -47, -38, -17, -19, -8, -23, -29, -57, -17, -16, -25, 30, -52, -3, 9, 12, -22, -20, -43, 0, 16, 20, 12, -21, -27, -8, -30, 10, -20, -7, -17, -35, -47, -21, 2, 15, -35, 6, 13, -19, -15, -17, 77, -18, -42, 85, -13, 1, 59, -19, -14, 49, -1, -11, 9, 23, -51, 46, -52, -18, 41, 16, -7, 21, -54, 19, -32, 25, 38, -10, -73, -26, 33, 42, -10, -15, -38, +26, 24, 62, 52, 127, 3, 9, -9, -40, 31, 54, 13, 9, -13, -45, 15, 4, 17, -34, 40, 60, -19, -22, -5, -27, 47, -48, -30, -50, -6, -57, -9, 37, 36, 6, 29, 2, 76, -38, -41, -11, 50, 9, -39, 23, -34, -33, -28, -20, -18, 24, 16, -6, -11, 31, 24, 21, -17, 75, 22, -3, -39, -59, 19, -20, -67, -50, -40, -29, 29, 4, -10, 22, 31, -13, 18, 6, 11, 22, -4, 3, +-53, -33, 11, -11, -10, 7, 21, -35, -21, -5, -16, -7, 54, -6, 46, -7, -3, 0, 12, -9, 103, 16, -10, -6, -1, -45, -35, -2, -9, -1, 25, 10, -51, -3, -32, 8, -5, 31, -9, -11, -28, 36, -35, 44, 74, 40, -20, 11, -34, -54, 3, 1, -6, 0, 19, 10, 16, -35, -41, -12, -7, -33, 79, 52, -41, -4, 20, -2, 8, 26, -14, 5, -7, 6, -12, -48, -24, -10, 24, 62, 0, +-15, -12, -22, 6, 32, 55, 38, 46, 66, 16, -59, -11, -32, -36, -55, -19, 50, -26, -11, -48, 100, 29, 14, 30, 21, -45, -2, -7, -20, 48, 59, -35, -40, -6, 127, -43, 1, 15, -21, -43, 94, -28, 73, -21, -5, 16, -18, 3, -13, 79, -16, 57, -17, 15, 2, -49, 118, 6, -3, -80, -48, 9, 10, 1, 1, 29, 11, 6, -9, 59, 8, 23, 19, -29, -2, -10, -15, 5, 20, -4, -7, +-36, -19, 13, 6, 22, -32, -10, -6, -38, -30, -27, -31, -10, -9, 25, 127, -26, -24, -4, -28, 78, -21, -34, -23, -22, 23, -35, -5, 20, -25, -57, -18, -7, -13, 55, -8, 5, -45, 7, -42, 14, -41, 12, -27, -10, 17, -6, 1, 52, -46, -2, 20, -14, 24, 8, 24, 7, 34, -19, -20, -13, -17, -6, -6, -25, 18, -32, 13, 15, -3, -28, 49, 50, 5, -1, -11, 34, -1, 7, 20, 27, +-4, -47, 20, -46, 14, -15, 1, 67, 9, -55, -8, -22, -31, -46, -22, -20, -9, -23, -34, -54, -10, 13, -37, 38, -3, -14, -5, 4, 13, -16, 1, 51, -13, -19, -36, -13, -63, 80, -24, 103, 28, -29, 1, 26, -9, -30, 13, -23, 12, 14, -32, -14, -37, -67, -30, -32, 9, 36, -21, -21, 32, 14, -16, 33, -24, -26, 16, 18, 17, 3, -1, -3, -8, -15, -14, -29, -20, -19, -1, 18, 11, +21, -27, 6, 0, -3, -4, 27, -26, -4, -11, -7, -26, -25, 48, 2, -46, -18, -13, -5, -35, -37, -31, -15, 38, -30, -40, 6, -4, -34, -18, -17, -14, -33, 59, 49, 1, 127, 64, 8, -3, -23, -32, 51, -6, 12, 8, 4, -22, 9, -68, 33, 26, -34, 1, 37, 30, 35, -17, -25, 2, -22, -51, -39, -4, -14, -2, -63, -10, -15, 40, -13, 14, -27, -42, 7, 26, 7, 23, -8, 21, 64, +-29, -3, -37, 76, 54, -4, -28, -2, -43, -37, -66, -24, 82, 25, 38, 31, 67, -15, 3, 18, -17, -12, -34, -22, -16, 17, -31, 97, 69, -8, -71, -15, -34, -37, -13, 32, 8, 34, -6, -49, -20, 3, 59, 14, 1, 49, -2, 58, -11, 67, -23, -26, -33, -25, -35, 23, 103, -11, 96, -19, 7, 1, -13, -2, 19, -41, -17, 19, 29, 3, 11, 70, -11, -10, -30, -24, 21, -7, -45, -41, 1, +79, -23, -2, 41, 25, -18, -3, -4, 28, 10, 33, -17, -1, 14, -42, -12, 27, 16, -25, 14, -10, -29, 11, -5, 37, 5, 15, -9, -18, -14, -13, 39, 23, -5, 0, -31, -42, -28, 17, 6, 34, -35, 36, -27, 7, 21, -6, 10, -15, 24, -38, -1, 1, 8, -39, -24, -15, -19, 19, -6, -17, 49, -4, 33, 1, 8, -4, 5, 13, 6, -17, -2, 7, -18, -33, -12, -5, -35, -45, 55, -25, +23, -22, -5, -50, 12, -42, 30, -17, 8, 55, -14, -56, 46, -56, 20, -14, 24, 0, 11, 121, -15, 8, -32, 9, -8, 56, 10, 7, -26, 37, 38, 19, -2, -22, 29, -53, -40, -23, -77, 99, 96, 46, -25, 65, 33, -37, 2, -43, -14, -56, -37, 34, -1, 64, 0, 12, 12, -7, -39, 17, 11, -29, -5, -57, -10, 34, 71, 43, 62, -17, -15, -15, 20, -19, 1, -28, -12, 19, -6, -23, 11, +-10, 27, 8, -13, -13, 35, 18, 43, -9, 29, 47, 30, -31, 16, -49, -7, 78, -19, 7, 4, 53, -5, 2, -17, -12, 45, 8, -6, -19, 0, 9, -26, 5, -14, -32, 3, -14, -4, -41, -41, -3, 0, -36, -8, -36, 13, -28, 44, -64, 51, -4, 48, -19, -31, 2, 127, -35, 11, 103, 13, -26, 9, 9, -13, 99, -3, -13, -7, 41, -20, 27, -38, 39, -8, 4, 74, 51, -8, 17, -27, -15, +-18, 27, 7, 4, -4, -22, -23, -15, 8, 7, -5, 21, 35, 5, -10, -5, -34, 9, 31, -38, -2, 10, -2, -12, 6, -5, -31, 38, -28, -15, -11, 3, -26, -6, -33, -7, -7, 98, 97, -6, -8, -29, -9, -14, -79, 39, -35, -51, -10, -37, -19, -26, -9, -22, -13, 20, 24, 38, 46, 6, 24, 34, -60, -14, -35, 47, -44, 1, -18, -38, 59, 42, 53, 3, -37, -9, -23, -3, 27, -11, -18, +-37, -22, -19, 43, 20, -37, -4, 14, -57, 39, 5, 11, -29, -10, 20, -3, 20, 17, 6, -14, 0, 93, -29, 0, 6, -12, -11, -8, 29, -15, -4, 20, -25, -7, 22, -8, -12, 39, 53, 9, -11, 11, -26, 38, 44, -22, -10, 79, 12, -31, -12, -13, 13, 124, 2, -48, -36, 1, -31, -27, -9, -27, 69, 2, -45, 14, 4, 47, 35, -28, 10, -19, -52, 5, 15, -32, -42, 0, -50, -28, -5, +-59, -20, -14, -9, -45, -34, -8, 47, 25, 40, -4, -30, 13, -63, -30, -6, -17, -9, -28, 4, -32, 71, -14, 42, -21, -23, 73, -12, -21, 83, 8, 14, 26, -40, 29, 2, -28, -21, 37, 62, 25, -41, 68, -36, -43, -49, 8, 14, -26, 83, -102, -18, 63, 5, 9, -49, -23, -3, 27, -12, -10, -10, -13, -26, -26, -21, -29, -33, 16, -26, -49, -16, 69, 10, -36, 16, 16, -46, 12, -2, -6, +25, 23, -23, 13, 58, -2, -2, 91, 78, -32, -11, -7, -18, 52, -59, -26, 17, -28, -2, -22, -36, -51, 40, -51, -34, -8, -35, 25, -40, 107, 8, -8, -10, -2, -30, -49, 60, 0, 2, 103, 39, -14, 97, -18, 31, 35, -32, 11, 1, 10, 24, -7, -16, -16, -14, -16, 34, 4, -12, -19, 29, 26, 23, -9, -33, -35, 35, -26, -23, -25, -1, 34, 68, -8, 11, -15, -28, -39, -45, 40, 12, +-7, 13, 0, 31, 24, 9, 21, -7, -4, -8, -32, -8, 26, 9, 64, 6, -13, 45, 8, -42, 10, 32, 9, 22, -16, -16, -16, -31, -4, -8, -8, 31, -21, 22, -19, -47, -25, -67, -1, -22, 23, -2, -31, -53, -61, -6, -17, -67, 11, 70, -50, -11, 12, 70, -1, -48, -35, 69, 8, 25, -19, -35, -56, -78, 78, -9, 0, -5, -24, 25, 4, -44, 8, -33, -27, 125, -12, -62, -59, 47, 55, +111, 15, -36, -41, 1, -25, 28, 20, 36, 12, -47, -3, -57, 20, -3, 37, -33, -1, -10, -46, 17, 27, -74, 15, 38, 22, -19, -8, -86, 16, -54, -31, 53, -28, -22, -21, -3, -11, -33, 15, 11, -8, 17, 3, -32, -38, -30, 33, -4, 10, -15, -36, 21, 29, -30, 5, 1, 28, -35, 43, -18, -7, 9, -11, -19, 3, -18, -13, -37, 0, -11, -24, 22, 3, -15, -46, -17, -22, 43, -39, -5, +-48, 87, -32, -4, 9, 13, -54, 51, -18, 2, 110, 17, 26, -25, -36, -9, 9, -11, -1, -31, 25, 15, -31, 1, 25, -22, 18, -10, -11, 39, -18, -19, -31, -2, -4, -11, 11, -34, -28, -14, -14, -43, -8, 40, -31, -5, -10, 2, -17, -8, 18, 51, -9, 22, 60, -22, 30, -2, 14, -22, -13, -7, -24, 34, 6, 34, -9, -3, 17, -8, -16, -11, -5, 52, 2, -85, -21, -8, -1, -47, -30, +-25, -17, -26, 32, -7, 22, -21, 4, 46, -23, -9, -23, -50, 15, -31, -36, 14, 47, -40, -2, -50, 1, -38, 36, 23, 18, -2, 37, 127, 13, 5, -17, 37, -36, -9, -25, -6, -39, -32, -27, -15, -13, -11, -22, 43, 17, 28, -28, 10, -15, -8, -5, 46, -11, 4, 1, -20, -26, -10, -1, 16, -28, 8, -25, -54, -19, 26, 37, -43, 12, -20, -3, -2, 41, -14, -30, -6, 21, -3, -12, 45, +-17, 7, 56, 67, 12, -11, -14, 15, 28, -12, -19, -17, -19, -29, 10, -14, -12, 9, 33, -17, -14, -45, 59, -26, 38, 2, -27, -16, -61, -14, 21, 12, -3, -17, 44, -13, -25, 7, 3, -40, -31, -10, 86, -23, 73, -23, 14, 38, 13, 25, 27, -67, -15, 42, 30, -6, -49, -27, -36, -17, 1, -46, 44, -16, 14, 32, -64, -37, -7, 47, -13, -24, -11, 28, -3, 34, -9, 61, -37, -37, 110, +16, -29, -56, -20, -12, 59, -27, -9, 14, 45, -7, 3, -15, -21, -39, -31, -7, -46, -29, 43, -16, -20, -27, 15, -27, -3, 33, 58, 4, 7, 2, -11, 1, -23, 39, 70, -28, -13, 8, 8, -5, -20, -58, -5, 86, -14, 66, 32, 53, -4, 14, -30, 1, 0, -15, -1, 20, -31, -3, -14, 11, -29, -36, -70, 13, -7, -19, 17, -3, 26, -17, -24, -4, -39, -9, 17, -9, -16, 10, 22, -17, +-8, 11, 6, 10, -40, 46, -3, 7, -18, -9, 11, 4, -9, 5, 14, -25, 28, 53, -6, 52, 124, -13, 22, -16, 20, 6, -27, 64, 23, -17, -10, 43, 47, 39, 0, 10, -10, -19, -33, -25, -3, -33, 16, -5, 0, -47, 8, 20, 23, 40, 23, 21, -33, -20, -23, 62, -18, 4, 11, 14, 18, -21, -30, 64, -54, -39, 2, -4, 8, 38, -2, 93, 3, 12, -63, 21, -29, 40, 55, -19, -30, +10, -16, -55, -27, 9, -15, -6, -53, -27, -48, -1, 5, -33, 35, -6, -1, -12, 11, 0, 117, -21, 34, -1, -16, -27, -23, 11, -34, 92, 33, 24, -2, 16, -12, -51, -26, -42, -16, 7, -54, 34, -17, -13, -15, -8, 12, 56, 21, 3, -43, -38, -32, -34, -9, -24, -36, -8, -29, -36, -68, 44, 8, 44, -7, -11, -42, -20, -16, -21, -28, 40, -38, 7, 6, -13, 1, -5, -21, -13, -6, 1, +-14, -39, -1, 1, -20, 18, -1, -22, 11, 0, -16, 2, 46, -2, -27, 36, -29, -18, -4, 21, 12, -44, 9, -4, 16, -26, -6, -7, 18, -21, 1, -31, -12, 27, 20, -33, -26, 4, -9, -3, -2, -22, 13, -6, -2, 4, -31, -11, 2, 24, 29, -15, 30, -13, -6, -9, -13, 64, -13, -36, -25, -4, -29, -4, -2, 6, -4, -19, -23, -2, -25, -7, -3, -11, -21, 0, -20, 2, -29, 10, -12, +0, -14, 31, -4, -26, -31, 13, -16, 0, 29, 23, 8, 2, 42, -17, 11, 71, -14, -38, 42, -1, 47, 36, 40, -2, 43, -38, -46, -55, -15, 58, 26, -19, -5, 17, -28, -34, 0, 6, 7, -30, 3, 32, -2, 45, 2, -27, 38, -4, -15, 60, 23, -59, -8, -23, 84, -39, -8, 15, -16, 81, 18, 13, -17, 20, -18, -19, -23, -16, -11, 4, -48, 6, 31, -2, -15, -37, -4, -3, -9, -25, +2, -17, 18, -32, 39, -2, -30, 25, -17, -2, 2, 14, -3, 41, 64, -11, 46, -9, -24, -55, 39, 2, -31, -16, 2, -6, -10, -35, -15, 34, 12, -3, 3, -60, 17, -14, -43, -25, -8, -6, -26, -26, -46, -32, -26, 33, -14, -8, -42, 3, 16, 64, -52, 60, -22, -1, 83, -17, -17, -12, 62, -61, 28, 4, -10, -44, 77, -20, 33, -4, -27, -22, 74, -7, 56, -5, 50, -31, 7, 7, -8, +-2, 37, 47, 17, 17, -29, -6, -3, -47, -85, -15, -10, 27, -44, 9, 4, -33, -120, -3, 22, 91, 19, -2, 16, 1, 18, 1, 8, -4, 127, -49, 3, -43, -17, 20, -13, 2, 6, -6, 42, 33, -15, 4, -14, 92, 16, -24, 18, 4, -25, -12, -6, 6, -23, -10, -57, 11, 3, -10, -26, 22, -20, -26, 110, -34, -22, -12, 39, -30, -31, 9, 12, 5, 27, -2, 39, -61, -6, 4, -18, -18, +-8, -21, 10, -10, -46, 7, 6, 10, -27, 15, -28, 16, -14, 2, 42, 2, 0, -6, -6, -22, -27, -3, -2, -42, 31, -40, -14, -3, -16, -25, -3, 3, -28, 14, 39, -53, 5, 4, -3, 38, 26, -21, 5, -31, -22, -2, -54, 12, 22, 16, -18, 36, 127, -5, 40, 7, 13, -19, 24, 23, -43, -43, -15, -20, 97, -24, 4, 20, 44, 10, -27, -35, 40, 21, 2, 49, -35, 23, -39, -7, 31, +26, -12, -72, 7, -32, -26, -18, -15, -23, -25, 26, 7, 96, -37, -51, 11, 60, 9, -36, 7, 90, -67, 86, -32, -5, 29, 32, 54, -22, -12, 29, -45, 51, -4, -3, -26, 25, -2, 7, 106, -11, 4, 35, -12, 27, -21, 29, -52, 70, 4, -85, 100, -13, 107, -26, -11, -28, -4, -10, 79, -59, -8, 6, 4, 49, 43, 22, -18, -19, -24, 6, -19, -13, -66, 124, -12, -30, -27, -51, -18, -36, +-28, 38, 23, -24, -57, 1, -21, -39, -37, -29, 40, -19, -8, -4, 10, -1, -3, 1, -16, -23, 13, -3, 20, -14, 3, 23, -16, -11, -20, 9, -17, -5, -9, -6, -13, -11, 0, -6, -18, -5, -18, -33, 30, -35, 5, -1, 1, -7, 54, -20, -6, -11, -11, -32, 71, -15, 1, 46, -8, 4, -21, -44, -30, -32, -9, -26, -6, -21, 1, -8, -12, 4, 4, 68, 8, -5, -3, 15, 9, -18, -3, +-18, 44, 13, 12, 46, 10, 71, 13, 33, -4, -26, -28, 9, -20, -2, -10, -4, -38, -32, -16, 0, 25, 3, 13, -15, 75, -15, 21, -58, 11, 40, -36, 17, 53, 21, 41, 12, 9, 26, 4, 57, -2, 4, -19, -40, 5, -12, 56, 14, 27, -8, 5, -33, 12, 4, 6, -28, 48, 95, -15, -10, -7, 9, 28, 13, -6, -8, 44, -7, 35, 10, 17, -35, 11, 36, -2, -21, 1, -9, -36, 26, +61, -24, -53, 42, -38, 7, -15, 3, -16, -23, -14, -27, -20, -41, 14, 56, 3, -8, 34, 15, -32, -13, 17, 15, -2, -8, -5, -6, -10, 127, 25, -1, 7, -9, 53, -5, 35, -1, -8, -14, 81, 94, 0, 6, -8, -4, -31, -48, -24, 39, -18, -43, 88, 1, 12, 2, -57, -9, -25, -19, -5, -8, 0, -16, 20, -11, -21, -31, -10, 20, 1, 26, 26, -50, -1, 0, -37, -19, -32, 57, 9, +32, 62, 16, -37, -12, 92, -39, 10, -16, -5, 127, -40, -25, -26, 7, -21, -42, 30, -20, 23, 8, -32, 23, 9, -58, -6, -23, -19, -49, -77, -18, 119, 5, -28, -25, -1, 111, 59, 92, -30, 70, 21, -34, -60, -4, 4, -39, 21, -5, 6, -28, -13, 102, -10, 23, -25, 20, 60, 85, 41, -20, 32, -24, -48, -6, -21, 41, 1, 4, -21, -13, 9, -15, -9, 56, 14, 45, -41, 2, 65, 42, +25, 26, -37, 17, -13, 87, -20, 3, 8, -12, -2, -7, 49, -81, 13, -24, -26, 15, -50, -19, -22, 73, -52, 24, 102, 13, -3, 0, 8, 49, -30, 52, -6, 3, 30, -10, 12, 10, 15, -9, 20, -31, 4, -10, 7, -49, -13, -34, 20, 43, 24, 0, 32, -8, -30, -29, -9, -33, 14, -22, -1, 37, 41, 20, 12, 10, 31, -25, 1, 32, -10, -35, 27, -3, 22, 32, -8, 14, -23, 58, -21, +-15, -64, -2, 5, -18, -25, 1, -12, 92, -20, 1, -15, 9, -41, 9, -11, -12, 20, -12, 8, -10, -20, 14, -17, 19, -21, 12, -34, -11, -15, 22, 44, 21, -45, -44, 19, 56, -9, 5, 47, 43, -57, -16, -29, -3, 73, 51, 32, -24, 127, 116, 21, 88, -28, -41, -41, 69, -44, 0, 3, -33, -1, -25, -63, -37, 11, -4, -44, 50, -51, -4, -18, 48, 64, -51, 10, -59, -88, 35, 10, 24, +-79, -17, 1, 6, -59, 14, 20, -55, 30, -49, 8, 97, -54, -4, -49, -41, -43, -49, 34, 47, -38, 28, -12, 43, 16, 53, 70, 12, 17, -15, -17, 8, -37, 52, 22, 19, 13, -8, 1, -13, 23, -21, 72, 31, 92, 4, -50, 27, -23, 73, 0, 56, -33, 34, 37, 5, 18, 42, 3, 8, 20, 16, -11, 48, -2, 13, 16, -4, 15, -1, 80, -20, -15, 71, -50, -5, -28, -20, -2, 38, -72, +-55, -22, 14, -19, -3, -13, -17, 6, 7, 34, -59, 16, -21, -57, 23, 61, 20, -30, 32, 94, -11, 34, 24, 2, -8, -8, -12, 2, 23, -8, 18, 41, -39, 5, 13, -20, 14, -10, -37, -14, -10, -23, 31, 2, -21, 0, 23, -2, -28, -24, 17, 32, -5, 12, -25, 26, 36, -2, 23, -5, -26, 33, -36, -1, -25, 127, -2, 21, -40, -38, -8, 0, 21, -7, 40, -30, -1, 87, 21, 37, -11, +-15, 48, 24, 3, 70, 3, 59, 38, 56, -32, -47, -34, -37, -2, -35, -30, 113, 12, -22, 0, -8, 6, 4, 44, 27, -14, 25, -14, 1, -29, -11, 0, 37, 9, 21, -7, -10, -12, 3, 5, 7, -25, 22, 11, 19, -18, -22, -19, 17, -16, 16, -37, 4, 6, -16, -6, -5, -26, 45, 18, -38, -4, -16, -13, 14, -2, 13, -1, 83, 45, 105, 15, 22, -56, -33, -22, 7, 17, -21, -4, -2, +32, -5, -4, -5, 32, -27, -18, 29, -50, -8, -26, -11, -13, -16, 7, -29, -10, -18, 73, 47, -1, 25, -19, -18, 20, -35, 20, 1, 11, 90, -46, 42, 99, 19, 23, -21, 47, 16, 4, -20, 19, 27, -2, -44, 31, -50, 40, -21, 56, -16, 46, 114, 4, -12, -53, 56, 52, 8, -6, 4, 50, -29, 50, -6, -19, -15, -48, -31, -24, 16, 32, 9, 53, 12, 91, -17, 10, 65, 102, -1, -4, +57, 55, 12, -5, -9, -1, 12, -40, 11, 17, -23, -27, -7, -18, 35, -42, 10, -27, -19, 0, 12, -6, -24, -31, -31, 36, -19, -34, 5, -46, -24, 26, -9, -22, -8, -26, -33, -3, 5, -13, -16, -40, -8, -48, -52, 21, 25, 45, -56, -43, 21, -18, -2, -24, 39, -14, 42, 1, -51, -60, 13, -9, 127, 12, -7, -12, 48, -14, 10, 67, -7, 40, 18, -5, 7, -33, -16, -14, 10, -1, 34, +-3, 26, 0, 38, -8, -1, -10, 30, 1, 12, -17, -18, -5, 25, 0, -17, -31, 13, -3, 34, -13, 23, 20, -12, -2, -17, 47, 33, -2, 25, 0, -42, -1, -3, 48, 41, 2, -5, 11, 56, -7, -8, -50, -7, -65, 23, -18, 16, 27, -37, -65, 20, 83, -32, -23, -16, 21, 9, -15, -32, -44, -15, -5, 13, -4, -65, 8, -53, -8, 7, 41, 1, 73, -29, 13, -29, -20, -5, -86, -18, 51, +52, 33, 7, -15, -32, 70, -3, -22, -54, -21, 38, 16, -9, -34, 4, -1, 7, 1, -18, 68, -10, 3, 7, 12, 47, -51, -43, 68, -45, 0, 127, 51, -15, -17, 33, -32, -18, -41, 23, 31, -39, 5, 0, 13, -49, 51, -15, -23, -27, -14, 6, -21, -14, -21, 12, 40, -2, -8, -8, 10, -9, 6, 47, -21, 4, -5, -6, -12, 37, 18, 6, 80, -11, 1, -16, 11, 0, -34, -41, -29, -23, +-26, 17, -37, -35, 58, -2, 1, -33, -20, -4, 12, -13, -31, 3, 19, -5, -10, 14, -18, -25, -36, 26, 4, 4, 10, 72, -7, 31, 85, -51, 51, 17, 22, 48, 31, 35, -7, 53, 29, 4, -16, 10, -22, -8, -16, 18, -18, 15, -10, -5, -19, 50, -3, 2, -24, -21, -22, 60, 9, 6, -19, 12, 31, 12, -22, -9, 12, 61, 53, -7, -15, 28, -16, 0, -19, -1, -1, -3, -42, 31, -32, +31, 34, 62, -29, -3, -27, 31, -38, -10, -46, 49, 0, -58, -8, -19, 19, 29, -4, 7, 22, 33, 0, 16, -27, -76, -12, 50, -36, -5, 59, -22, -9, 19, -9, -19, -26, -33, 2, 25, -29, -9, -28, 26, 6, -10, -45, 23, -28, -39, -19, -21, -18, -60, -29, 5, 18, 46, 100, 8, -19, 28, 7, -32, -21, 9, -6, 12, -28, 50, 8, -3, -12, -19, -23, -18, 13, 12, 89, -4, 15, 33, +9, -17, -8, -14, -21, -18, 2, -3, 48, 28, -31, -26, 48, -26, -10, -24, -21, 1, 0, -28, -11, -1, -10, -23, -14, 57, 29, 8, -56, 27, -25, 67, 90, -6, 4, 8, 1, 42, -2, -22, -38, -20, -15, -26, -47, 39, -6, -26, 14, -6, -20, 23, -27, 32, 127, 51, -25, -51, -17, -34, 19, -43, -35, -57, 16, -37, -14, 13, 7, 75, 1, 16, -11, -23, -5, 47, 10, -6, 28, -23, 46, +25, -15, 18, 3, -4, 6, -55, -41, -46, -30, -3, 15, -41, -74, -7, -6, 25, 61, 10, -13, 35, -28, 68, -43, -33, -7, 51, 43, 2, -6, -7, -42, -46, 33, -17, -9, 51, 10, -31, -61, -52, 89, 13, 40, -47, 35, -63, 27, -14, -40, 24, -24, 2, 6, 25, -26, 30, 12, 26, -23, 109, 32, -53, -14, -65, 31, -47, -16, 57, -11, 58, -40, -26, 40, -54, 70, 127, 11, -7, -25, 16, +-10, 112, 51, 57, -6, 6, -17, -22, -26, 1, 4, -54, -23, 72, 7, -27, -22, 64, -27, -18, -50, -25, -18, -19, -24, -24, 14, 63, -96, 83, 47, -23, 17, 27, -9, 2, 25, -58, -36, -16, -32, -24, 56, -24, -3, 0, -34, -44, 9, 74, 8, -57, -44, -5, 37, 127, 68, -45, -16, 40, 42, 33, 14, 41, -38, 23, 48, -27, 31, 17, -23, -7, 5, 45, 19, 28, -11, 103, -2, 45, -3, +15, -22, -25, -82, 10, 21, -7, -13, -42, -48, 91, -41, 46, 21, 58, -33, 11, -23, 65, 5, -48, -54, -6, 5, -7, 23, 25, -9, 21, -5, -2, 37, -3, 6, 37, 13, -36, 34, -8, -9, -5, 6, 17, 69, -30, 7, -18, -3, 5, -7, 5, -49, -3, -24, 0, -16, 12, -27, 38, 12, 38, -26, -9, -56, -25, -43, -15, -67, -49, 7, 54, -10, -63, 4, -18, -48, 64, -12, 41, 9, 87, +-57, -21, 2, -10, 11, 60, -10, 1, 15, -39, -3, 12, -6, -7, -57, -5, -19, 16, -6, -76, -19, 3, -28, 8, 32, 19, 19, 39, -1, -27, -16, 15, -1, -40, 27, 44, -57, -34, -21, 76, -16, 50, -15, 62, -58, 22, -28, -25, -5, -34, 27, 39, -11, 7, -20, 11, 55, -20, -44, 86, 35, -4, 20, -38, -5, -29, 43, 77, -34, -5, 6, 10, -13, 14, -14, 33, 18, -65, 0, -16, -8, +-24, 23, 61, -26, -2, 31, -8, 17, -35, -27, 7, -6, 1, 4, -16, 2, -13, -9, 92, -31, -6, -11, -13, -32, -14, -19, -32, -11, -47, -9, -19, -41, 23, -30, 37, -33, 1, 23, -28, 33, -23, 16, -11, -12, -34, -31, -34, 40, -19, -12, -1, -58, 1, -31, -35, 50, 14, 35, 25, -36, 2, -25, 29, -14, -35, 12, 55, -22, -33, -12, -13, -11, -10, -28, -29, 35, -18, -24, -7, -6, 15, +3, 2, -51, -5, -43, -3, 18, 72, -10, 16, -62, -39, 13, 8, -13, 47, -28, -32, -38, 10, 22, -96, 72, 24, -30, 35, 51, 32, 47, -36, 16, 42, 46, 70, -38, 6, 2, -42, -27, 7, 16, -33, 60, 17, -37, 12, -12, -26, -1, -18, 6, -11, -14, -16, -8, -1, -33, -37, 9, 10, 1, -12, -7, 23, -13, 31, -21, -14, 43, -21, 8, 12, -18, 47, -12, -8, -2, -24, 80, -5, 61, +46, 40, 58, -17, 6, -20, -4, -19, -2, 38, 5, 82, 60, 6, -9, 26, -16, -6, 31, -33, 28, -49, -22, 0, -11, 20, -5, -44, -3, 115, -16, -12, 76, -29, -6, -31, 16, 31, 6, -7, -41, 34, -5, -23, -9, 100, -8, 48, 38, 3, -19, 103, -3, -10, 44, -5, 77, 43, 14, 21, 55, 4, -21, -54, -30, -49, -20, 60, 2, 1, 57, 31, -81, 19, 31, 3, -25, 38, -22, 30, 1, +-4, 35, -22, -7, -6, 71, 53, 6, -24, -8, -26, -49, 5, 23, 20, 10, -26, -77, 39, -42, -28, 9, -63, -4, 9, -11, -20, 16, 85, 26, -9, 23, -19, -12, -13, 3, -20, 14, 29, 80, 20, 42, 6, -25, -10, -21, -26, -25, 122, -13, -51, -9, -47, -1, -33, -7, 13, 42, 0, 13, -34, 2, 65, -4, 83, 4, 12, -30, -6, 4, 8, 26, 3, -4, -48, -49, 16, -14, -30, 5, -31, +-44, 3, -33, 7, -39, 26, -23, -17, 12, 1, -10, 26, 35, -10, -1, 12, 4, 13, 5, -38, -3, 46, 10, 6, 63, -7, -47, 49, -40, -15, -11, 69, 14, 34, 20, -33, 11, 2, -45, -47, -33, -41, -48, 22, -24, -4, -22, -4, 2, -6, 9, 38, -11, -44, -23, 0, -6, -28, 5, 11, -35, -21, 7, -55, 0, -29, -24, 31, -2, 2, 34, -17, 124, -5, 38, 29, 4, 28, -9, -20, 4, +-32, 20, 0, -8, 47, -21, -36, 53, -7, 1, -5, 46, -12, 1, -46, 6, 32, -19, -27, -17, 5, 28, -24, -75, -7, -31, -26, -15, 38, -41, 21, -15, 22, -29, -30, -14, 16, -49, 49, -5, -38, -7, -35, -32, -15, 43, 3, 71, -29, -17, 17, 7, -2, 104, 11, 10, -17, 6, -9, 26, -35, -31, 4, 18, -15, -13, -31, 9, 69, -13, 4, 63, -27, -17, 20, 8, -37, 2, 127, -20, -55, +21, -2, -5, -1, 64, -44, -51, 4, -18, -33, 0, -80, -23, 73, 24, -32, 47, -28, -9, 6, -6, 9, 51, 7, 19, 11, -20, -71, -6, 6, 25, -52, 19, -19, 3, 19, 21, 75, -27, 11, -15, -42, -6, 15, -8, 19, -17, 14, -24, -14, -13, -20, -46, 76, 38, -6, 7, -9, -9, -29, -6, 11, -27, -45, 3, 16, -2, 22, -11, 68, 9, 29, -22, -42, -10, 17, -14, 16, 66, 110, -33, +-41, -9, 4, -32, 6, -9, 32, 35, -9, 19, 0, -9, -10, 36, 48, 23, 35, 2, -28, 10, -27, -29, 14, 30, 33, 52, -12, -5, -2, 0, -60, 1, -5, 9, 35, -21, -22, -4, -24, -25, -9, -19, -67, -57, 34, 68, -29, 43, -16, -43, -22, -36, -6, 44, -28, 69, -33, -63, -2, 12, 12, -25, -24, 14, 2, -7, 1, 40, -6, -22, -8, -8, 10, -13, 11, -17, 8, 42, 32, 22, 12, +-9, -4, 0, -6, 50, -21, 46, -15, -13, 48, 22, 50, -4, -5, -30, -13, -39, -12, -26, 5, 32, -47, -3, 2, 21, -9, 49, 25, -7, 10, 37, 4, -46, 44, -12, 17, -27, -50, 1, -18, -21, 14, 25, -12, -1, 55, -28, 80, -21, -6, 34, 26, -24, 23, -10, 7, -60, 11, -10, 4, 6, -12, 10, -25, 4, -1, 86, 17, -2, -34, 83, -2, -17, 38, -45, -30, -19, 12, 20, 4, -24, +28, 26, -19, 16, -10, -40, 7, 57, 31, 40, -19, -28, -10, -4, 0, -8, 19, -35, 20, 10, 9, 33, -9, -18, -38, -15, 70, -48, 52, 9, -22, -6, -55, -69, 38, 75, -29, -11, -30, -30, -49, -7, -59, -27, 23, 21, 105, 5, -35, -11, 24, -4, -55, 120, -21, -61, 9, 7, 2, 37, -48, -19, -73, -13, -2, -24, -14, 60, -43, -37, -31, 20, 33, 32, -50, -37, -32, -34, 101, 22, -31, +35, -19, -23, 39, 88, -7, 82, -32, 1, 30, 72, -16, 30, -43, 5, -26, -11, 3, 6, 30, 35, 40, 36, 1, -11, 62, -10, -25, -2, 13, -18, -22, 43, 28, -18, 29, 4, 27, 19, 51, -20, 39, 14, 43, 20, -47, -26, -44, -5, -5, 53, 57, -30, 6, -9, -24, 18, -28, -20, 5, -3, 93, -24, -23, 30, 11, -26, 3, 18, -26, -8, -11, -13, 23, -37, -49, -43, 9, -29, 36, 8, +67, 47, 1, 6, 7, -9, -5, 18, 127, 41, 23, 19, -33, -22, -15, 16, 49, 2, 8, -26, -19, -1, 7, 0, -18, 16, 0, 30, 38, -44, -3, -34, 66, -32, 99, -20, -14, 53, -8, -41, -16, 10, -26, 52, 86, -27, 1, -49, 11, -46, 1, 127, 1, 4, 13, 36, -10, 25, 98, 19, -21, -30, -16, -20, -25, 15, -22, 38, 76, -35, -6, -29, -35, 24, 0, 19, 44, 6, -8, 45, 2, +-21, -3, 9, 29, 32, 12, 16, -17, -19, -32, -37, -17, -26, 26, 0, 69, 62, -64, -22, 15, -14, 23, -7, -28, -23, -31, -4, -47, 17, 39, 6, -21, -16, -6, 11, -65, 121, -24, -12, 61, 7, 72, 25, 6, -2, 11, 62, 8, 24, 5, 84, -35, -15, -9, -32, -13, 51, -4, 11, -24, 47, 67, -33, 7, 65, -6, -13, -13, -15, -1, 45, -34, -64, -41, 1, 7, 16, -7, 3, -21, 12, +-4, -23, 9, -29, -32, -1, -30, -56, 17, 26, 22, 32, -22, -26, 14, 1, -22, -26, -33, 5, 10, -13, 52, 43, 8, 12, -55, -5, -5, 26, -3, 12, 68, -26, 4, -12, -50, -5, -10, 84, -20, 36, 79, -26, -4, -29, 40, -24, -11, -3, 46, -15, -24, -34, -56, -20, -24, -1, 0, -10, 7, 0, -13, 73, -20, 42, -55, -31, 42, 31, -12, -17, -16, -64, -14, -32, 15, 16, 21, -19, 3, +-93, 71, 21, -31, 8, -12, -71, -26, 31, 11, -8, -18, -34, -4, -7, 5, -36, 10, 23, -5, 0, -13, 28, -15, 0, -15, 3, -7, 4, 38, -27, 6, 75, -1, -9, 4, -16, -24, 23, 12, 10, 76, 58, 1, -16, -23, -13, -22, -19, 3, -4, 18, -13, 20, -16, -17, -5, 8, -16, -45, -27, -49, -20, -8, -2, -26, 6, 39, 17, -1, 34, -5, 12, -54, 73, -9, -34, -6, -18, -49, 2, +-8, -42, -17, -42, -59, -44, 25, 1, 56, 6, -31, -36, 27, -15, 26, -30, -15, -19, -2, 26, 7, 16, -6, 115, 61, -16, 40, -26, -85, 3, -10, 23, 68, 15, -28, 21, -27, -41, -36, -52, -36, -36, 97, -93, -56, -39, 93, -38, 12, -13, -2, -43, 85, -26, -8, 22, 45, -28, 8, -4, -20, -71, 10, 18, -3, 72, -3, -40, -52, 20, -35, 33, 62, 13, -13, -8, 8, 3, -23, -20, 9, +40, 13, 3, 30, -1, -44, -22, 33, -27, 8, -13, -35, 49, -10, -3, 12, -23, 18, 20, -71, 118, -55, 11, 10, -10, -24, 1, -8, 10, 38, 40, 41, -16, 75, -57, -1, 26, -3, 3, 1, -37, -25, -24, -60, -5, -21, 3, -10, 0, 22, -36, 65, -43, -12, 24, -11, 28, 24, -2, -12, -47, 31, -33, -22, -49, -20, 16, 42, 23, -30, 21, -29, -27, 112, 8, -30, 8, 36, -28, 21, -9, +1, -43, 16, 127, -67, -16, 17, -6, 1, -17, -10, -23, 50, 11, -3, -36, 5, -10, 6, 45, 6, 9, -6, 43, 60, -25, -16, -21, -7, -24, -1, 14, -13, 40, 26, -60, -5, 57, 20, -1, -55, 28, 80, -27, 72, -48, 20, -6, -4, -24, 11, 5, -21, -5, 31, -22, 2, -56, -40, 21, 16, -12, 58, 12, -27, 16, 26, -51, 39, -10, 8, 45, -13, 33, -12, 15, 49, -92, 21, 18, 19, +9, -6, -54, 41, -47, -38, 17, 28, 13, -39, 9, -11, -32, -22, -12, 64, -11, -29, -31, 49, -29, 9, 7, -8, -70, 26, -15, 102, -4, 18, 1, -20, -13, 47, 3, 59, -39, -55, -48, -30, -59, -15, 15, 38, -12, -3, -73, -22, -36, -52, 21, -16, 61, 37, 22, -32, -9, 51, 37, -61, -7, 16, 12, -10, -35, -71, 20, 13, 6, 20, 14, -7, -7, -25, 13, -47, 13, 54, -38, -32, 37, +-15, -53, 14, -22, 7, 7, -34, 25, -24, -17, 54, 10, 16, -2, -16, 10, -34, -9, 39, 124, 27, -11, 6, -13, -29, 4, -38, -15, 18, 18, 10, -13, 1, 74, -23, 18, -14, 2, 40, -5, -16, -54, 52, -41, -8, 2, -11, 19, -70, -14, 48, 21, 0, 25, -12, 21, -27, 32, -22, -20, 25, 42, -3, 3, 32, -25, 15, -33, -11, -40, -14, 6, -19, -40, -23, -9, -6, -12, -5, 12, -15, +-1, -30, 29, -63, -44, -41, 17, -9, 8, 10, -27, -51, 13, -12, 8, 30, 25, -36, 31, 26, -17, -47, 53, -34, 98, -35, -18, 12, -18, -66, -7, -30, 56, 9, 2, 45, 12, -21, -17, -11, -20, -33, -3, -17, -18, -8, -19, -21, 6, 7, -39, 3, -6, 6, -10, -17, -18, 3, -30, 37, -7, 5, -7, -29, -13, -19, 10, -17, 40, -21, -45, 6, -19, -34, -4, -48, -49, -5, -12, -5, 60, +-17, 11, 0, -3, 2, 22, 10, -29, 7, -18, 14, 28, 80, 4, 21, 17, -11, 4, 43, -45, -29, -53, 5, -4, -9, -40, 106, -23, -19, 56, -51, -7, -14, -27, 6, -4, 75, 21, -29, -6, -34, 29, -13, -62, -53, -26, 7, 7, 13, -17, -56, 7, -26, 34, 26, -27, 12, -45, 33, -35, -16, 12, -27, -2, 6, 6, -1, 35, -10, 7, 12, 22, 127, -48, 15, 36, -12, -20, -2, 32, -38, +-21, -40, -63, -26, -36, -12, -11, 8, -6, -42, -27, -21, -15, -40, -16, -7, 1, -51, 32, -38, -8, 9, -2, 75, -20, 3, -30, -61, -5, -5, -31, -60, -21, -16, -14, -29, -48, 17, 64, -16, 22, 32, 1, -22, 16, 36, -38, 1, -6, -5, -31, -22, -12, -4, -10, 127, -49, 1, 12, 7, -28, -16, -47, 32, -7, 5, -1, 18, 4, 30, 49, -2, 4, 24, 14, 68, 6, -31, -46, 5, -3, +-40, -3, -35, 13, 24, 2, -31, -10, -8, -23, 20, -18, -62, -39, -20, -8, -20, 25, -43, -1, 33, 5, -9, -1, -58, -12, -28, 9, 51, -32, 19, -17, -13, -14, 3, -29, 36, 13, -10, 2, -36, -4, -33, 0, -23, -3, -41, 0, -21, -43, -16, 5, -43, -5, -5, 5, -41, 70, -26, -20, 23, 28, 47, 48, 27, 49, -37, 18, -17, 18, 72, 22, -28, -2, -26, 18, -26, -20, 76, 50, 1, +8, -34, 22, 0, -82, -4, -8, -18, -28, 21, -30, 30, 72, -20, -10, -50, 25, 27, 86, -26, -13, -34, 111, 14, 5, -38, -70, -7, 29, 28, -68, -15, 28, 15, -12, -48, 76, -46, -26, 40, -4, 15, 33, 12, -48, -17, 20, -42, 19, 9, 20, -19, -10, 1, -44, 8, -16, 22, -3, 4, 59, -50, 17, 40, -35, -26, -23, -16, -52, 60, -25, 15, -1, -38, -68, 11, -12, 1, -18, -51, -16, +23, 2, -63, -30, 10, -53, -44, 42, -49, 40, -20, 39, -22, -32, 34, 36, 16, 2, 11, -3, 42, -33, 127, -50, -10, -59, -19, -26, 21, -1, 82, -24, -27, 8, -28, -7, -27, 6, -21, -21, -20, -3, -16, 2, -5, -29, 127, -4, 49, 8, -37, 6, -4, -43, -13, 17, 9, 91, 15, 15, -22, 38, -14, 7, 21, 111, 77, 4, -37, -68, 42, 41, 5, -2, -9, 2, -21, -20, -36, 58, -45, +-26, -33, -33, 18, -8, 56, -12, -15, 0, 89, 50, -50, 6, 6, 127, 39, -46, -35, -12, -18, -26, 16, -18, -87, -39, 73, 9, 21, 127, -7, 28, -42, -29, -15, 17, -4, -44, -46, 30, 119, 5, 21, -41, -34, -25, -58, -5, 19, 24, 3, -46, -6, -33, -18, 0, -8, 54, -37, -16, -4, 28, 5, -19, 29, 4, -43, -4, -8, -18, -18, -37, -7, -17, -23, -18, 4, -1, 12, -5, -15, -35, +33, -8, 44, -14, 25, 10, 2, -11, -8, 1, 6, -1, -50, 5, 1, -35, 23, 10, 51, 1, -16, 17, -6, 13, -19, 50, 33, 1, 1, -41, -19, -51, -18, -11, -1, -50, -10, -14, 53, -26, 8, -28, 8, -6, 44, -24, 25, -13, 15, 22, 34, 32, 9, 60, 8, 39, -1, 37, -57, 9, -30, -14, 1, 22, -4, -7, 48, 88, 28, 4, 68, 29, 18, 30, -24, 50, -7, -13, 12, 6, -35, +31, -36, -5, 23, 14, 45, -28, -19, -41, 79, 38, -2, -12, -7, -12, 16, -14, 17, -11, -42, -23, 50, 15, 1, -27, -6, -12, 76, -2, -26, 4, 11, -1, 14, 24, -8, 1, -12, -22, 4, -18, 30, -23, -25, -44, 103, 8, -44, -1, -4, -42, -50, 15, 29, 41, -16, -17, -27, 52, 63, -28, -54, -1, 41, -17, -7, -1, -45, 13, 15, -18, 10, 9, 16, -62, 14, -20, -10, -59, -6, -25, +-8, 13, 2, -66, -11, 9, -1, -5, -34, 14, -7, -26, 9, -43, -6, -50, 25, -34, -14, 27, -13, -23, 46, 17, -9, 18, 28, -19, 24, 19, -27, -30, -22, -5, -61, -8, -19, 22, -35, 18, -9, 41, -4, -4, -80, 40, 24, -4, -4, 13, -49, -14, 29, -22, 25, 47, -1, -10, 8, -9, 18, -16, -25, 11, 18, 26, 0, -9, 4, -49, -19, -54, 16, -12, -37, 4, -5, 13, -3, 38, -27, +1, -14, 17, -14, -19, 26, -16, 2, 41, -13, 26, -22, -42, -25, 28, -12, 11, 17, 38, -28, 10, -5, 17, 30, 53, 43, -45, -4, -28, 31, -7, -44, -27, -17, 19, -50, -8, 14, -24, 56, -17, 23, -9, 3, 39, -40, 48, 23, 47, 59, -74, 55, -17, -23, -37, 11, 46, -21, 49, -42, -9, -16, 10, 32, 55, 1, 28, 44, 6, -28, -2, 8, 56, 79, 13, 22, -32, -4, 20, -14, -41, +50, -24, 9, -20, -11, 15, -12, 121, -42, -16, 7, -31, 93, 35, 52, 1, 43, 1, 41, 4, 96, -18, 99, 13, -10, -1, 16, -33, -57, -2, -1, -19, -51, -11, 71, -6, 67, 0, 42, 21, 7, -20, -5, 33, -13, -38, -46, 54, 38, -30, 6, 35, 5, 23, 31, -26, 44, 12, 7, -43, 21, 5, 17, -39, -25, -55, 0, -32, 22, 60, 63, -5, 10, 20, -14, -14, -26, -1, -45, 3, -28, +54, -23, 81, -6, 3, 12, 4, -9, -1, 3, 3, 28, -6, -27, -48, -22, 28, 5, 51, 20, -31, -17, -45, 26, 28, -6, -19, 17, 46, -20, 27, -40, -39, 4, 18, -26, 17, 11, 50, -50, 81, -14, 46, -41, -1, 61, 89, -59, 4, -11, 47, -3, 2, -11, 23, -26, -6, -49, -45, 32, 67, 30, -4, 54, 37, 7, 69, -11, -23, 17, -25, -54, -54, 89, -8, -31, 36, -57, 12, 57, 8, +97, -3, -19, 9, 7, -13, 8, 0, 13, 24, 41, -12, 1, -5, -7, -2, 5, 17, -5, 28, 17, -16, 10, -26, 13, -11, 5, 19, 0, -12, 28, 11, 69, 2, 14, 20, -14, 54, -22, 69, -20, 34, 14, 46, -5, 16, -17, 51, -42, -16, 21, -8, 5, 30, -23, -7, -41, -28, -11, -30, -4, -15, -38, 17, 8, -1, -9, -26, -24, 6, -35, 51, 6, 43, -6, -17, -11, 28, -24, 23, -22, +31, -29, -4, -34, 29, 39, -14, -22, -62, -42, -41, 53, -27, 10, -19, 17, 27, 17, -18, 5, -7, -38, 23, 81, 40, 23, -24, -32, -31, 44, -37, -22, 20, -12, -12, -2, 41, 0, -25, 86, 21, -9, 38, 55, -52, 14, 111, -30, 17, 6, 14, -13, 7, -27, -30, 24, -27, 12, -15, 123, -34, 1, -8, -7, -29, 88, 13, -43, -5, 15, -39, 52, -44, -35, -15, -22, 0, 40, 3, 14, 42, +59, -32, -7, 14, 4, 24, 27, -20, -1, 93, 9, -15, -39, -32, 21, 50, -19, -23, -27, 42, -8, 19, -20, 4, -5, 0, 31, -19, -21, -11, 12, -12, 35, -18, -6, 16, 60, 12, 47, -23, -53, 61, -37, 8, 32, 12, 28, -23, -19, -32, -21, -21, -22, 41, -39, 19, 1, 49, -25, -26, -43, 104, -30, 23, 26, 39, 10, -68, 11, 12, 6, -18, -11, 63, -23, 11, -9, 3, -4, -1, -35, +-5, 0, -7, -8, 17, 3, 43, 16, -2, 41, -34, 41, -3, -17, -36, -31, -52, 36, -38, -10, 1, -35, -29, 17, 5, 12, 6, 21, -1, -56, 29, 2, 127, -16, 7, -3, -17, -20, -46, -24, -7, 6, -12, -24, 20, -11, 61, -33, 77, -38, -22, -8, 42, -35, -1, -21, 0, -6, -22, -34, -29, 46, -58, -46, 29, -5, -36, -30, -26, -21, 33, 76, 59, -31, -27, -26, -31, 14, -9, 33, 29, +127, -32, -9, 29, -18, 67, 2, 34, 20, 30, -7, -21, 21, -57, -33, 35, 19, 6, 23, -15, 29, -30, 1, -51, -3, -33, -2, 49, 5, -28, -47, -13, -13, -54, -12, 24, 35, 19, -17, 76, 36, -22, -39, 16, 13, -36, -56, 40, -23, 8, -29, -15, 30, 56, -40, 29, -28, 61, -21, -3, 34, -17, 27, 10, -33, 31, -71, 4, -8, -25, -8, 37, 12, -17, -26, 18, 13, 68, 7, -4, 17, +9, -3, -6, -54, -31, 26, -35, 48, -38, 22, -36, -29, 6, 1, 10, 50, 5, -7, -17, -10, -21, -12, -22, -4, 10, 40, 7, -21, 41, 2, 71, 36, 16, -5, -36, 101, -2, -16, -11, -5, 22, 18, 60, -23, -32, 0, -5, -24, -40, -28, 61, -27, -12, 4, 39, 11, 20, 5, -4, -38, -22, 34, 0, 2, -9, 34, 19, 34, -21, -30, -52, 5, -33, 65, -7, -35, 21, -4, 13, 35, -71, +34, 86, -16, -54, 25, 69, 28, -30, -30, -42, -17, -76, -70, 29, 2, 8, -23, -25, 72, 58, -8, 5, -28, -27, 97, -14, 121, 38, -26, -25, -16, 3, -21, -1, 127, 43, -1, 6, 36, 12, -11, 5, 7, 21, -6, -18, 16, 12, -31, -11, 11, 3, -7, -10, -9, -10, -4, 8, 8, -7, 41, 8, -9, -12, -4, -5, -25, 31, -13, -10, -50, -30, 22, -48, 62, -6, -9, 89, -23, -24, -17, +58, 120, 17, 8, -16, -7, -17, -48, 5, -13, -38, -34, 3, 31, 26, -5, -29, -5, 29, -63, 80, 14, 0, 49, -23, -30, 50, -8, -20, -25, 15, -4, 3, -3, 11, -2, 127, 1, -12, 9, -2, -52, -16, 35, -52, -25, -29, 6, -32, -24, 18, 57, -20, 23, -10, -3, 29, -7, -15, -41, -36, -29, 29, -28, 37, 9, 32, 37, 0, -36, -21, -1, -38, -69, -21, -35, -24, -10, 0, -35, 72, +-30, -20, -21, -2, 82, -44, -1, 23, 112, -16, -52, 26, -24, 16, 5, -64, 24, -7, 0, -20, -25, 26, 10, 24, -31, -23, 0, -40, -25, 8, 69, 14, -46, 12, -9, -9, -17, 20, -10, -2, 28, -31, 10, -48, -7, 9, -9, -48, -22, 4, -7, 14, -10, 4, 8, -35, -47, 17, -19, 0, 28, -6, -16, 0, -31, 14, 2, 96, -17, -26, -26, 61, -20, -45, 19, -39, 8, 10, 7, -37, 3, +32, 31, -5, -20, 2, 14, -16, -41, -22, -13, 32, 33, 48, 11, -46, -27, -26, 70, -10, 38, -3, 4, -16, 50, -14, 5, 6, 5, -26, -16, -20, 19, -24, -11, -29, -13, -19, -35, -28, -15, 11, -10, 31, 27, 22, 75, 34, 0, -5, 2, -11, -32, 3, -19, -1, -17, -22, 1, -16, -19, 9, -1, 22, -17, 5, 15, -18, -46, 40, 21, -8, -27, -14, 13, 1, -41, 7, -14, -38, 19, 105, +-77, -1, -15, 86, 4, 30, -41, 23, 10, 24, 23, -52, 3, -44, -3, 13, 36, -15, -23, 15, -24, -2, 27, -3, -21, 25, -57, -12, -60, -9, 3, -30, -23, 40, 43, -19, 43, -24, -2, 25, -10, 2, -19, -76, -15, 27, 4, -40, -4, 14, -5, 20, 4, -8, 8, 49, -49, 57, 32, -7, 116, -33, -14, 52, -21, 1, -35, 28, -4, -58, -33, -51, -55, -26, 31, -34, 2, -54, -3, -6, -8, +-21, -12, -33, -1, -36, 36, -46, -2, -86, -47, -36, -29, -47, 16, -21, 10, 19, -16, -8, 13, 19, -13, 42, -15, -4, -6, -5, 27, 10, -20, -25, 30, 2, 40, -43, -13, -6, -13, 14, -17, 17, -20, 11, -12, 26, 4, 0, 49, -13, -4, 20, -18, 48, 67, -16, -36, 51, 24, -3, -20, 44, 2, -3, -21, -7, -31, 18, 40, 11, -44, -49, -9, -12, 48, -10, -1, 25, -3, -48, -22, -24, +8, -17, -23, -32, 5, -27, -12, -4, -20, -20, -11, 2, 96, 87, -21, -26, 8, 46, -4, 4, -52, -32, 16, 12, -19, 28, 90, -24, -65, 84, -85, -57, -26, 44, 28, -8, 25, -6, -31, 17, -10, -30, 14, -37, -31, -5, 47, -9, -8, 30, -14, 92, 76, -8, 108, -17, -37, -11, 66, 32, -16, -11, -12, 28, -2, -10, -8, -9, -32, -18, -15, 2, -30, 5, -10, 16, -29, 29, -9, -9, -3, +-21, -24, 5, -11, 12, -3, -30, 3, 49, -42, -14, -16, 2, -39, -7, -67, 73, -42, 26, -25, -38, -40, -43, 8, -13, -26, -30, -24, 11, 73, 11, -37, -37, -31, 51, 53, 21, -40, -28, 14, -25, -3, -18, 7, 46, 81, -15, 58, 20, -2, -10, 8, 20, 2, -44, 19, -12, -78, -3, -37, 1, -32, 56, 0, 56, -48, 10, -12, -1, -33, -29, -49, -16, -7, -20, -3, 4, -13, -10, -6, 25, +-16, -7, -21, -7, 22, -3, -13, -8, -45, -12, 5, -14, -15, -37, 2, 41, -3, 9, -12, 6, -28, 26, -4, -9, 29, -7, -37, -72, -34, -23, -28, 28, 1, -5, 14, 54, 103, 41, 19, 16, 88, 36, -20, -95, 29, 1, 87, 1, 18, -46, -5, -43, -38, -65, 16, -4, 21, -12, 24, -18, 12, 11, -26, -6, 26, -14, -10, -35, -13, -17, -1, -11, 1, -26, -2, -26, -18, -30, 17, 31, -8, +-8, -13, -8, -9, -8, -19, -7, 1, -11, -19, 0, -11, -5, -53, -20, -30, -14, -9, -24, 11, -1, -42, -10, 7, -27, -27, 1, -44, -78, 4, 38, 25, -19, -3, -23, -24, -9, -17, -29, 38, -6, 3, -13, 1, -37, -2, 17, 20, -20, -27, 4, -36, 21, -29, -49, 14, -18, 4, -47, -12, -30, -2, -5, -7, -37, -38, 14, 2, -17, 81, 0, 39, 10, -16, -9, 56, -56, -23, -8, 36, -17, +-9, 19, -60, -14, -3, -43, -24, 59, 127, -34, 25, 25, -18, 37, -32, -20, 60, 31, -4, -43, -11, 5, 52, 2, -48, -2, 6, -14, 12, 21, -12, -8, -28, -4, 5, 38, -36, -30, -17, -18, 6, -7, -12, -6, 7, 6, -4, -12, -29, 19, -46, -34, -15, -24, -30, 34, 19, -3, -33, -23, 8, 19, -19, 8, -20, -5, -12, 24, 5, -4, 7, 0, 3, 46, 40, -2, -2, -26, -30, -12, 22, +28, -28, -16, -13, -9, 21, 12, 33, -5, -6, -14, -8, 13, 33, -9, -32, 26, 0, -37, -16, -25, -4, -23, 43, -26, -2, -29, 14, -6, 14, 0, -15, -6, 1, -8, -27, -27, -7, -18, 11, -11, 68, -21, 10, -10, -2, -31, 3, 28, -55, 17, -16, -59, -17, -22, 3, -37, 36, -8, 12, -23, 10, -14, -20, -6, -3, -15, -17, -12, -15, 17, 7, 5, -21, -29, -10, -6, -22, -32, -25, 9, +-35, -21, -15, 2, 6, 36, 11, 3, 13, 13, -39, 72, -23, 103, -23, 63, -37, -15, 10, -4, 16, -27, 0, 9, -34, 4, 4, -48, -19, 93, 9, -20, 13, -20, -16, 72, -13, 38, 7, -45, 6, -36, -3, -10, 4, 41, 2, 2, -19, -12, 33, -10, 16, 8, -24, 13, 22, -39, -28, 0, -15, 2, -1, -18, -36, 17, 64, -5, -22, -29, -7, 46, 49, 3, 62, -33, -6, 17, 53, 18, -43, +-7, 7, -5, -8, 22, 27, -16, -37, 8, 24, 24, 15, 82, 4, -57, -20, 18, 5, 13, 10, 8, -38, 17, 1, -3, -23, 16, -36, 66, 8, -30, -3, 30, -28, 1, -42, 34, 22, 39, -17, -8, 5, -20, -36, -8, -2, -47, 106, 35, 4, 7, 20, 13, -1, 12, -3, -48, -12, -49, -1, -19, -11, -8, 23, 5, 49, 127, -3, -40, -8, -39, 12, -6, -10, -26, 16, -10, -30, -16, -31, -10, +-7, -15, 49, -23, 7, -43, 9, -27, 0, -5, 63, 52, -15, -29, 35, 40, 56, -6, 4, -14, 29, -2, 5, 9, 3, -16, 17, 5, -45, 18, 16, -15, 9, 57, -11, 6, -33, 48, -26, 55, 20, 8, -21, 26, -17, 28, -14, 41, -51, 37, 6, 20, -23, 52, 52, 44, 23, -48, 30, -49, -25, -9, 18, 10, 40, -45, -14, -16, -22, 20, -10, -8, 63, -49, -16, -39, 13, -36, -58, -68, 13, +46, 24, -5, 5, -6, -30, -11, -18, -19, -4, -25, -34, -35, -31, 11, -6, 18, 1, -36, -4, -8, 7, -8, -20, 0, 6, -14, -3, -3, 3, -51, 57, -47, 18, 51, 32, -41, 51, 5, 3, -49, 17, 26, -11, -17, 61, -13, -36, 42, 49, 12, 127, 56, -45, -23, 71, 25, 37, -2, -11, -19, 57, -27, 25, -22, -11, 44, 61, -50, 44, 14, -1, -53, -16, 9, 43, 31, -25, 6, -6, -38, +-16, 19, 13, -62, 25, 0, 64, -1, -40, 41, 68, 7, 17, -8, -33, -7, 14, 83, 27, 40, 30, -55, 5, -9, 2, -2, -45, -33, 26, 9, -7, 10, -25, 1, -32, -5, -32, -21, -50, -1, 0, 0, -41, 43, -45, -29, 40, 14, -32, 12, 8, -6, 41, -9, -10, 21, 43, -16, 27, -11, 4, -7, -11, 23, -4, 12, -8, -47, -3, 11, 18, -1, -10, 23, 16, 27, -1, -31, -20, 26, 7, +16, 9, -24, -2, 3, 1, -26, 35, -16, 17, -9, 127, -12, -41, 12, -35, 38, -28, 40, -17, -24, 4, -14, -15, -28, -20, -8, 44, -19, 30, 3, -26, -30, 30, 7, 27, 11, 8, -28, -3, 1, -13, -25, -11, 5, 12, -3, 17, -1, -22, -37, -8, -15, 14, -18, 10, 9, -26, -6, 6, -8, -41, 0, 50, 17, -17, -2, 1, -10, -32, 1, -27, -46, -13, 13, 25, 6, -11, -43, -6, -7, +2, -35, -3, -23, 5, -30, -4, 35, -34, -17, -22, -19, 37, -13, 24, 27, 86, 11, 17, -26, 19, -18, 50, -32, 15, 12, -1, -83, 14, -25, -9, -31, 102, -25, 22, 15, 55, -26, 57, -51, 5, -57, -54, 36, 43, -14, 13, 10, 35, 11, -27, 70, -24, 26, 4, -15, -17, 28, 8, 56, -25, -25, -16, -3, 6, -36, -49, -4, 3, -16, 8, -2, 66, 15, 27, -10, -57, -8, -38, -10, -40, +24, -74, 44, 27, -33, 11, 5, 20, -25, 74, -3, 9, 4, 22, 35, -41, 64, -42, 9, -43, 7, -7, 36, -19, 39, 48, -35, -22, -24, -44, 28, -52, 58, -39, -63, -39, -28, -44, -2, -32, 13, -19, 127, 77, -20, -5, -21, 33, -36, -24, 2, 33, -25, -30, 19, 2, -40, 11, 5, -22, 24, -27, -16, 39, 2, 58, -2, -29, -8, -7, 8, 25, 27, 12, 2, 30, -8, 40, -30, -18, -46, +-33, -29, -1, 73, -54, 79, -23, 23, -10, 2, -9, 80, -40, -6, 18, 13, -7, -6, 12, -32, -28, -25, 13, -32, 9, -12, 4, 58, 14, -34, -10, -29, 2, -2, -24, 56, 15, -23, -4, 47, 8, -40, 2, 18, 17, -30, -26, -20, 23, 34, -22, 22, -17, 22, -26, 34, -33, -7, 15, 48, 14, 20, -25, -28, 1, 54, -8, -22, -16, -36, -16, 8, -20, -49, -94, -38, -45, 13, 43, -21, -30, +24, 86, -83, 57, 122, -29, 29, -13, -33, -4, -71, 127, 1, -27, -119, -20, -54, -18, -4, -11, -32, 14, 16, -57, -44, -8, -6, 14, -16, 42, 45, -22, 24, -7, 29, 13, 15, -15, -16, -12, -23, 3, 4, 6, -14, -22, -4, -20, -27, -5, -20, 5, 52, 10, 5, -9, -23, 9, 24, -6, -71, 1, 4, 23, 4, -20, 30, -24, 63, -35, -34, -7, 11, -37, -12, -7, -37, -18, -7, -23, 67, +-39, -17, 3, 21, -63, -4, 6, 20, -7, -2, 40, 7, -6, -1, 41, 0, -4, 2, 11, -40, -14, -13, 6, -12, -3, -1, 11, 0, 8, -9, 10, -28, -39, -10, 14, 19, 43, 36, -26, -20, 33, -35, -23, -17, -3, 41, 58, -17, 32, -60, 3, 82, -8, 4, 95, 9, 59, -19, 11, -2, -8, 23, -12, -32, -19, -56, 16, 11, -23, -20, 12, 54, -26, 34, -25, 91, 11, -42, 30, 29, -40, +16, -50, -3, -12, -15, 21, 8, -42, 59, 8, 16, -9, 5, 37, -5, -9, -18, 9, -28, -22, -34, -1, 21, -5, 33, -14, -20, -12, -26, -8, 31, -43, -12, -18, 16, -24, 56, 30, -15, 25, 14, -35, 44, -11, 13, -12, -7, -3, 24, -12, 67, 11, -29, -21, 5, 28, -9, 4, 38, 29, -2, 43, 14, 8, -3, 7, 57, 30, 0, -25, 1, 3, 44, -19, -21, -3, 2, 31, -18, -33, 10, +-9, -14, 0, 30, -46, -15, -15, 5, 52, -5, 20, 10, 7, 15, -4, 10, -17, -35, -1, 19, -10, 17, -9, -4, -16, 18, 21, -8, -7, -11, 4, 6, -13, 5, 27, -20, 9, -11, -49, -11, 28, -48, 10, -69, 10, -16, -34, -28, -3, 76, 5, -4, 33, -12, -10, 33, -37, -13, 11, -22, 127, -28, 12, 16, 23, -5, 19, 21, -28, 14, -28, -36, 3, -19, -12, -5, -3, -1, -10, -9, 17, +34, -10, 26, -10, 47, 37, 0, -24, -19, -7, -12, -11, -3, 7, 66, -39, 1, -3, 8, -15, 0, 27, -9, -49, -28, 21, 44, -36, 33, 2, -31, 10, -52, -35, 14, 22, -19, -25, 21, 28, -30, -10, -30, -19, -3, 9, 8, -8, -5, 56, -2, -24, 8, 25, 25, -13, 19, 56, -40, 10, 49, 4, 38, 37, 38, -17, -26, -9, -5, 49, 35, -37, -5, -13, -14, -6, -13, 38, 26, 17, -1, +-12, 23, 16, 15, 19, 57, -31, -22, 61, -32, -47, 42, -7, 40, 3, -20, -1, -19, -14, 13, 47, -3, -10, 20, 27, 4, 44, -3, -3, -35, -19, -1, 33, -39, -21, 10, 21, 20, -3, -16, 56, -18, -37, -3, 4, 41, -20, 6, -7, -17, -27, -41, -28, -32, -45, -12, 14, 6, -28, 6, -56, -5, 3, 15, -11, -33, 4, 3, 28, 21, 20, 16, -28, -22, -20, 4, 6, 8, -30, -9, -5, +39, -13, -36, -20, -10, 15, 3, -8, 24, -23, 68, -1, 0, 14, -9, 7, 18, -10, 0, 28, 70, -23, -13, -2, -54, -56, -55, -39, 34, 114, -17, -55, -3, 88, 21, -7, -3, 39, 33, -62, -13, -39, -37, -79, 17, 56, -56, -18, -14, -41, -5, 2, 4, -39, -11, 17, 5, 11, -9, 40, -12, -5, -39, 6, 10, 4, -18, 12, -3, -2, -29, -9, 0, 8, -43, 4, 34, 26, -11, -9, 7, +-15, -1, -5, -14, -58, 72, -9, -27, -5, -56, 10, 31, 47, 27, -29, -4, 26, -7, -23, -28, -1, 2, 99, 11, 16, 15, -42, 6, 16, -14, 9, 17, -49, -33, -5, -13, -21, 32, 31, 13, -15, 8, -4, 29, -17, -20, -9, 15, -36, -48, 37, -32, -22, -10, -5, -5, 2, -35, -19, -29, 8, -15, 30, -19, 9, 2, -16, 55, -13, -32, -23, -8, -81, -40, 3, 11, -36, 0, 27, -23, 17, +31, 40, 19, 13, -11, 15, 2, -40, -48, 44, -34, 82, -22, -52, -4, -9, -36, -32, -25, -17, -48, 20, 1, -23, -14, 16, 85, -29, -37, -15, -6, 1, -18, -32, -26, -12, 20, -16, 44, -28, 10, 1, -43, 5, 64, 8, 5, -9, -20, -14, 11, 3, 8, 3, -10, 5, 27, -45, 4, -22, -12, -25, -9, -23, 9, 15, -13, 0, 19, -1, 11, -22, 34, -4, -1, -1, -19, 6, -23, 2, 31, +-12, -33, -18, 18, -21, -41, -1, 1, 39, 15, 6, -27, 48, 10, -18, -23, 18, -19, -10, -16, 22, 18, 22, 28, -23, -16, -17, -33, -43, 9, -27, 3, -1, -27, -3, -13, -9, -9, -15, 5, 35, 35, 35, -1, -1, 39, 51, -18, -12, -2, 11, 2, 37, 17, 12, 26, 14, -35, 23, 4, 6, 3, -17, 28, 0, 9, -6, -26, 29, -2, 16, -26, -20, 15, -35, -14, -16, -77, -37, -43, -32, +-27, -29, -30, 44, 2, -12, -14, 32, -2, 9, 51, 9, -5, -26, 17, -25, -2, 11, -9, -22, 2, -18, 16, 34, -3, -10, -33, -22, -19, -20, 7, 3, 22, 4, 41, -5, -18, -2, 9, -30, -5, -9, -27, -39, -11, -50, -23, -5, -45, 1, -3, 24, 62, -28, 47, -1, 56, -15, 7, -20, -26, -13, 43, -52, 35, 16, 73, -79, -10, 43, 28, 30, -37, 1, -7, 59, -11, 46, -15, -47, -10, +-13, -13, 56, 10, -55, 70, -49, 20, 44, -26, 9, -12, -1, 13, -42, 63, 2, 55, -42, -21, 22, 9, -6, 1, -1, -30, -34, -19, -10, -20, -44, 2, -18, 16, -39, -24, 92, 2, 20, 41, -27, -15, 127, -60, 12, 17, -8, 24, 26, -38, 15, -7, -35, 1, -18, 5, -42, 7, 36, 7, -19, 17, 5, -18, -32, -12, -38, 68, 20, -34, 13, -72, 0, -18, -28, -31, -10, -48, -33, 20, -46, +18, 43, -30, -5, -1, 76, -4, 41, -16, 52, -8, -29, -19, 54, 19, 9, 50, -7, -30, -39, -15, -16, -17, 37, 59, -5, -18, -1, 28, 25, 13, -29, 26, -35, -18, -16, 33, 9, -24, -2, -16, 27, 35, -39, 1, 19, 83, -14, 59, -33, -44, -5, 35, -24, -10, -63, 66, 31, 25, 58, -25, 32, 4, 28, 66, 58, 17, -42, 81, -44, -1, -12, -37, -46, -16, 13, 106, -7, -40, 24, -32, +-3, 32, -14, 26, -8, -21, 15, 42, -10, -11, -26, -6, 33, 3, -8, -18, -11, 7, -14, 0, -4, -23, 4, -49, 6, 35, -4, 9, 49, 63, -22, -36, 27, 5, -25, 55, -13, -20, -10, 52, 27, -3, 34, 2, 3, 9, -39, 80, 53, -28, -5, 53, 21, 44, 9, -9, -1, 3, -59, -4, 1, -24, -25, -46, -11, 77, -42, -9, -35, -22, 3, -3, -16, 42, 13, 2, -13, 13, -18, 49, -11, +-34, -29, -6, -15, -26, -36, -8, 1, -12, 30, 18, 35, 34, -50, 5, 119, -24, -27, 62, 6, 4, 44, 2, 17, 14, -41, -40, -21, -37, 94, 37, 5, 19, 15, -14, 7, 58, -30, -39, 103, -57, 20, -43, 33, -22, 52, 71, 3, 46, -53, 15, -16, -40, -10, 6, 7, 28, -13, -17, -15, 65, -16, -19, 52, -14, -12, 32, 13, 22, -20, -22, 8, -13, 2, -33, 19, -29, -17, -23, -36, -17, +33, 54, 36, -3, 9, -24, 22, -34, 14, 2, -15, -12, -13, -8, -36, 26, 29, -13, -18, -56, 6, -23, 6, -2, 10, -16, -16, -2, -9, 18, 12, 50, -33, 8, -7, 5, 18, 6, 7, 56, 38, -37, 11, 45, -23, -7, -23, -11, -19, 1, 27, 94, -33, -33, -9, -27, -8, 11, 16, 5, -19, 14, -28, -3, -15, 2, -10, -15, 4, 5, -13, 52, -10, 28, 39, -1, 28, 34, -26, 17, 3, +65, -3, -37, 20, 8, -15, 19, 6, -18, 21, 10, -26, 8, -49, 17, -35, 60, -34, 14, -2, -17, -15, -38, -7, -5, -25, 78, -55, 5, 20, -9, 32, 5, -31, 44, 7, 55, -29, 9, 8, 15, -9, 20, 0, -5, 127, -34, -28, 22, -18, -24, 53, -30, 18, 7, 9, 71, -13, -38, 5, -9, -21, -5, -7, 6, -11, -9, -12, -45, -1, -17, -9, -19, -14, 21, 30, 26, -29, -37, -48, -18, +23, -32, -24, 7, 44, 55, 7, 0, -6, -24, -28, 72, -13, -18, -16, -18, -2, -8, -6, -55, 127, 39, 60, 26, -10, 16, -16, -19, -4, -29, -28, -3, -52, 22, 76, 4, 3, -35, 8, -18, -3, -1, 62, 25, -19, -9, -15, -40, 13, -6, 46, -16, -4, 54, 28, 9, -3, 112, -27, -43, -42, -40, 47, 48, 44, -45, -27, 26, 25, 3, 29, 51, 61, -15, 12, 13, 27, 22, -45, -17, -11, +-13, 9, -25, 38, 39, -18, -44, -8, -15, 38, -10, 19, 18, -6, -3, 34, 71, -3, 67, 36, 5, 28, -3, 75, -55, -39, 0, -10, -41, 20, 39, -13, -22, 29, -33, 41, -30, -15, -2, -8, 3, -11, 12, -8, -6, -48, -3, 34, 127, 20, -11, -17, 8, 25, 57, 20, -10, 6, -15, -23, 48, -40, 18, 24, 27, 1, 11, 32, 1, 8, 3, 2, 96, 1, -101, -93, 51, 16, -7, 40, -21, +12, 25, 6, -55, -73, 49, 90, 35, -41, 12, -22, -17, 19, 6, 4, -56, 9, 32, 33, 28, -56, 18, -5, 4, -25, -18, 12, 0, 22, 39, -2, 16, -21, -20, -21, 14, 2, 29, 4, -12, -7, 15, -1, 5, 127, 29, -7, -22, -1, 81, -3, -1, 0, 22, -8, 84, -5, -13, 33, 65, 39, -24, 39, 31, -9, 54, -36, 11, -11, 1, -11, -29, 20, -43, -4, -51, -28, 12, -18, -2, 22, +11, -13, -5, -18, 25, -5, 21, 7, -17, 21, 28, -47, 15, 34, 127, -28, 91, 10, 56, 29, 91, -12, 20, -20, 3, -6, 42, -2, 29, -34, 1, 13, 7, -16, 45, 0, 3, -13, 22, -48, 11, 21, 6, -49, -8, -24, -5, 3, 5, -27, -5, 52, 35, -5, 21, 12, -21, 14, -6, -33, 15, -8, -23, 1, 7, 32, 25, 37, 6, 11, 10, -27, 4, -6, -41, 127, -6, -6, 32, -8, 116, +-1, -16, 18, 22, -8, 13, 19, -18, 13, 43, -30, 92, 15, 7, -8, 5, -46, -16, -8, 1, -28, 46, 12, -41, -24, -6, 24, 69, -10, -35, 49, -26, 25, 5, -12, 29, 46, -13, 12, 0, 4, 28, 3, -11, -25, 16, -22, 8, -1, -7, -21, -18, -14, 1, -22, 0, 14, -16, -6, 7, 3, 127, -3, 50, 0, 27, -15, 27, -13, 23, -15, -32, -8, -29, -9, -24, -13, -11, 7, -13, -30, +-11, 0, 8, -8, 6, 19, 25, 19, 6, -18, -14, 37, 127, -25, -21, -2, -7, 5, -8, -44, 25, 2, -12, 23, 55, 27, -1, 2, -5, -9, 40, -18, -7, -8, -8, -4, 24, -38, -11, 33, -26, 8, -3, -8, 33, -39, 12, 16, -7, -11, -4, 81, 8, -21, -32, 17, 33, 0, 97, -34, 0, -12, -25, 19, -22, -1, -21, 4, -33, 17, 12, 52, 45, 9, 20, -15, -8, 33, 0, -19, -25, +64, 6, 15, 21, -14, 40, 5, -2, -15, 60, 1, 19, -19, 21, 19, 27, -9, -35, 2, -21, -10, -25, -16, -8, -16, 42, -36, -28, 9, -50, 13, 12, -35, -10, -28, -23, -19, -3, -46, 18, -11, 64, 11, -28, -8, -39, 19, 19, 0, -11, 14, 0, -59, -38, 61, -5, 19, 2, -7, 36, -2, -11, -26, 33, 3, -6, 18, -17, -2, 51, 42, -3, -23, 46, -14, 6, -7, 81, 59, -25, -28, +-29, 48, -13, -28, 8, -32, -24, 35, 1, -19, -14, 4, 0, -13, -29, -34, -12, 22, 42, 36, -39, -4, 0, 54, -14, 18, 38, -13, 26, 53, -49, 4, -48, 7, 41, -38, 15, -7, 24, -14, 34, 59, -9, -25, 10, -20, -19, 18, -9, -13, -18, 14, 2, -56, -19, 16, -14, 31, 47, -19, -3, 19, -28, -16, 75, 29, -17, -4, 7, 14, 12, -32, -7, 42, -6, -27, 42, -24, -37, 10, 5, +-11, -1, 17, -13, 12, 11, -37, -23, 13, -15, 10, 18, -25, -1, 10, 1, 19, -38, -42, 54, -16, 30, 0, 36, 64, 3, -74, 69, -32, -61, -41, 6, 50, 41, 16, -61, 45, -45, -7, -16, -65, 25, -63, -52, 9, -26, -27, -1, 4, 6, -24, -11, -28, 11, 6, 13, 29, 26, -13, 21, 2, -8, 22, 9, 22, 15, -21, 21, 7, 4, -8, 1, -9, -25, 39, -1, -1, -8, -20, 1, 6, +-21, -6, 20, 3, -25, -2, 33, 37, 22, -46, 7, -76, -40, -26, -9, 18, -28, -21, -34, -28, -10, -10, 72, -13, -20, 31, 3, 15, -6, -42, -17, -13, -19, 6, -3, -16, -29, 2, 9, -12, 38, -40, -5, 3, -3, -26, 0, -2, 28, -25, -51, 46, 21, 5, -6, 9, -4, 7, 16, 1, -11, -48, 52, 2, 1, -11, -31, 17, 72, -11, 38, -36, 18, -34, 5, 36, -3, -48, -31, 11, 11, +35, -21, -41, 35, -41, -25, 84, 49, 15, 53, -32, -21, -39, -4, 25, -20, 33, -5, 28, -1, 15, -11, 22, -30, 49, 9, 1, -11, -11, -4, -18, -4, 65, -15, 33, -37, 1, -26, -20, -5, 22, 86, -30, -2, -20, -21, -5, -28, 2, -2, -21, 15, 11, -8, 29, -20, 1, -33, -12, -18, 0, -18, 9, 18, 6, 22, 12, 2, -15, -17, 9, 79, 1, 40, -1, 22, -18, -20, -10, -18, 27, +1, -37, 14, -20, 20, 11, 10, -8, -9, -6, -26, 9, -12, 25, 17, -10, -6, 27, -16, -29, -11, 29, -24, 6, 80, -24, 28, -29, -12, -9, -3, -30, 2, -16, 48, -9, -16, 22, -15, 49, 3, -23, -24, 20, -16, -4, -14, 17, -29, 40, 17, 24, 6, 2, 11, 1, 20, 3, 23, 14, -8, -50, 18, 16, 25, 6, -16, -13, 34, -7, -26, -81, 15, 26, -26, -27, -25, 1, 23, 28, -9, +73, 5, 2, 0, 50, 81, 15, -28, 22, 31, 46, -31, 6, -24, -12, -16, -9, -25, -7, -1, 23, -16, -2, 26, -3, 10, -24, -15, -1, 0, 10, -11, 6, -10, -8, 18, 32, 57, -6, 56, 8, -14, 36, -7, -30, -35, 1, 119, 18, -30, -27, -8, 124, 13, -44, 14, -7, -11, -19, 24, 34, -33, 49, -35, 9, 23, -13, -13, 16, 19, -6, -5, -55, 19, 10, -23, -10, 2, -30, -55, -4, +-55, 9, 10, 1, -18, -29, -2, 53, -13, -46, 4, -20, 29, 4, -21, -17, 78, -12, -13, 29, -37, 10, -2, 24, -16, 96, -38, 58, 94, 54, -38, -7, -11, 23, -43, 6, 12, 52, 23, -30, -4, 59, 3, -21, -31, 13, -53, 0, 29, -30, -45, 21, -6, 53, 26, 24, -13, -6, -16, 40, -4, 17, 17, 39, -39, -29, -9, -14, -24, 21, -6, -21, 34, -26, 7, -15, -4, -29, 29, 25, 105, +-1, -34, -7, -12, -40, -29, -6, -29, -23, 40, 10, -14, -28, -11, 8, 81, 14, 12, 30, -23, -31, -6, -1, 18, -14, 4, -36, -49, 18, -3, 52, 27, 25, 17, 11, -2, -13, -6, -27, 3, 4, 35, -55, -50, -6, 31, -41, 23, -12, -73, 6, 104, 3, 102, 68, 5, -36, 37, 12, -9, -19, 44, 32, -54, -71, 3, -14, -16, -2, 14, -64, -33, 88, -36, -5, -5, 17, 5, -13, -20, 1, +70, 1, 52, 20, -17, -32, -42, 0, 7, -10, 4, 76, -14, 35, -6, 8, 0, 0, 3, -5, -17, -6, -25, 32, -4, 30, -15, -27, 22, -7, 19, 38, -22, -16, 92, 3, -18, 4, -4, -1, 15, -1, 22, 0, -48, 62, -47, -22, -12, -28, -16, -29, -7, -2, -23, -29, -42, -16, 15, 18, -29, 9, 44, 22, 31, -25, -9, 6, -12, -2, -29, -24, 31, 30, 29, 8, 44, -9, -4, 23, -25, +43, -12, -34, 1, -16, -8, 4, 107, -9, -4, 30, 41, -5, -64, 11, 46, 10, 47, -31, 36, 2, 4, -18, -19, -23, -21, -17, 3, 16, 96, -18, 20, -30, 13, 12, 14, -16, 37, 17, 35, -12, -10, -32, -10, -7, -1, 44, 13, -61, 1, -19, 5, 19, -11, -41, -4, 44, 31, -29, 19, 38, 60, -23, -14, -45, 25, 13, -35, 31, -25, 11, 46, 3, -43, 6, -14, -3, 20, -14, -21, 2, +-17, 27, -20, 6, 9, -11, -17, -5, -4, -7, 15, 7, 3, 3, -11, -16, -19, 10, 16, 9, 2, -24, -6, -28, 3, 12, -5, -8, 101, 2, 30, 8, -15, 13, 2, -2, 20, -22, 13, 19, 21, -15, 23, 32, 11, 20, 15, 26, 21, 22, -6, 4, -6, -19, 26, -34, 5, 4, 9, 10, -34, 59, 19, -13, -9, -25, 17, 0, 12, -13, 5, -5, 4, -13, -10, -7, -4, 39, -11, 10, 21, +26, 2, -39, -29, 0, 52, 15, -28, -27, -23, -32, -25, 22, -38, -9, 84, -27, 21, -38, -66, -33, 20, 20, -6, -46, 37, 9, 44, 14, 7, -26, -46, 36, -5, -3, -17, 20, -31, 1, 17, -15, -31, 1, 58, -1, 34, 3, -9, 5, 0, 25, -7, -28, 3, 4, 10, 0, -7, 1, 9, 15, -23, 4, -10, 31, 7, 2, -7, -3, -33, -21, 65, -28, -20, -4, 12, -16, -57, -1, 2, 35, +52, 32, -7, -31, -16, 51, 24, 0, -25, -28, -18, 6, 3, 11, -28, -5, 16, -58, -42, 5, -8, 4, 17, 44, -29, -1, -40, 7, 54, 31, 42, -16, -26, -28, -2, -28, -26, -3, -6, -37, -74, 27, -52, 23, 9, 1, 10, 14, 2, -13, -16, 5, -10, -32, -16, -25, -18, -7, -60, 0, 9, 127, 14, -7, 20, -8, -49, 74, -3, -23, 12, -12, -38, 34, -61, -20, 31, 28, -38, -15, -5, +-48, -11, 19, -9, 61, -27, -14, -19, 10, -26, -14, -2, -5, -17, 44, 8, -21, 21, -32, 40, 1, 2, -29, -4, 16, 44, 4, -15, -8, -10, 79, -37, -56, 11, 9, -16, 6, -7, -37, -29, -24, 5, 16, 61, -30, 4, -13, 19, 61, -18, -23, 22, 7, 6, 21, 4, -43, 96, 64, -81, 25, -1, -31, 24, 40, -5, -19, 3, 7, 18, 0, -4, 11, -8, 48, -9, -21, 5, -30, 18, -11, +-13, 17, -4, -6, -3, -24, -38, 22, -23, -15, -5, 20, 10, 6, 37, -27, -21, -18, 3, -37, -30, -4, 26, -48, 39, 13, -23, -9, -2, 25, 7, -9, 16, -18, -19, 4, 16, 12, 16, -12, -2, 55, 27, -4, -44, 15, -45, -3, 41, -21, 37, -3, -20, 20, 4, -8, 6, -17, -15, 83, 17, -35, 22, -51, -42, 22, 14, -22, -50, -37, -38, 2, -82, -11, -4, 1, 29, -24, 19, -9, 50, +-43, 14, -12, -22, -32, -59, -9, -5, -4, -45, 27, 24, -20, -54, 8, 9, 21, -56, -1, -20, 21, -37, -22, 10, -19, -2, 17, 51, 82, -8, -16, -12, -17, -43, -3, 49, 18, -33, -20, 31, -24, -21, -14, 34, 36, 3, -28, -5, 24, -1, 41, -13, -30, -15, 6, -3, -18, 7, 39, 62, 0, 127, -50, 64, -24, -7, 6, -28, -42, 50, -3, 87, 20, -11, -12, -33, -12, -21, 59, 44, -11, +0, -2, 12, 21, 28, -11, 73, 112, -36, -47, 78, -26, 13, -13, 41, 79, -16, -5, 23, 48, -36, 7, -6, -29, -25, -11, -3, 6, 38, -1, -9, 30, -37, -7, 56, -5, -29, 10, -1, -3, -16, -11, 15, -30, 17, -2, -31, -40, -28, 24, -4, -12, -22, 17, 12, 46, -7, -3, 20, 3, -1, -2, -30, -35, -25, -5, 23, 10, -17, -14, 16, 3, -1, 25, -8, -24, 10, -17, 39, -38, 25, +62, -21, 17, -20, -25, 4, 0, -42, 19, -31, 3, 14, 23, -39, 3, 11, -2, -26, 53, -21, 49, 40, -32, -52, 29, -13, -24, -21, -10, 24, -47, -42, 36, 22, 13, -15, 5, -24, -15, -27, 23, -34, 24, -14, 2, -36, 2, -5, 2, 6, -2, -14, 15, -23, 36, -31, -7, 5, -23, -14, 16, -18, 5, -39, 15, -2, -26, 6, -19, -8, 15, -3, -17, 73, -22, -24, 31, 13, -16, -39, 32, +-27, -1, 41, -35, -39, 9, -5, 11, 29, -29, -19, -24, -14, -18, -17, -21, -29, -18, -18, 28, 9, 31, -17, -28, -6, -2, -2, -27, -20, -13, 35, 12, -10, -19, 0, 8, -4, -22, -23, 9, 30, -17, 17, -19, 25, -24, -21, -3, 15, -8, -24, -3, -35, 9, 12, -6, 18, -17, -37, -5, 5, 40, 8, -5, 25, -36, 4, 32, 28, -14, 0, 20, 24, -9, -13, -46, 54, -31, -21, -9, 20, +-27, 1, -2, -10, -26, -26, 8, 19, 83, 16, 6, -10, -38, -11, -5, 47, 29, 2, -3, 3, -13, 23, 70, 12, -16, -17, -46, -1, 26, 13, -20, -20, 17, -11, -22, -34, 13, -21, -41, -2, -20, -31, 10, 13, 3, 10, -8, -35, 54, -8, 0, -26, -30, -28, 29, 20, 0, -26, -22, -4, 9, -10, -17, -9, -33, 36, -45, 59, -24, 4, 5, -19, 5, -20, 63, -51, 127, -7, 30, -37, -13, +17, -12, 103, 20, -19, -32, 26, -7, -9, -29, -20, 57, 12, 15, -4, 37, -16, -29, -11, -30, -10, 1, 32, 12, -34, 12, 51, -12, 1, 42, 25, -17, 33, -36, -24, -38, 8, 0, 25, 45, -18, -4, 19, 13, -20, -31, 7, 2, -4, -32, 3, -47, -3, 50, -34, 0, -12, -1, 0, -12, 42, 16, 19, 28, -52, -29, -25, -22, -13, -19, -13, 20, 5, -15, 30, -20, 127, 47, -16, -33, 56, +24, -35, 31, 5, -35, 16, 69, -8, 49, 16, -50, 33, -16, 1, -30, 48, 37, -35, -58, 9, 50, -7, -34, -12, -77, -27, 6, 27, -34, 16, -28, 62, -41, 7, -13, 14, -28, -41, -27, -4, -45, -18, -3, 17, 40, -29, 15, -11, 127, 27, -15, 11, 82, 36, -61, -15, -14, -10, -12, -23, -18, -13, -1, 71, 35, 1, 42, 10, -43, 22, -12, 8, -20, 8, 5, -13, -18, -23, -7, 33, 48, +-2, -58, 81, -12, -11, -4, -2, 106, 64, -42, 38, 3, -46, 15, 66, 42, -30, -20, 28, -62, -35, -36, 20, 3, -22, 74, 8, -23, -3, -19, -1, 9, -8, -28, 18, 18, -16, 25, -47, -13, 4, -3, -6, -6, -2, -35, 21, 3, 10, -19, -27, 7, -25, 45, -19, 1, -13, -13, 21, 6, -24, -18, -7, 52, -23, -28, 8, 7, -35, 10, -40, 20, -13, -4, 12, -6, 29, -43, -22, 10, 12, +4, -7, -15, 21, 127, -17, -11, 26, -18, -21, -36, 1, 6, 24, -6, -5, 13, 24, 17, 10, 53, -14, 3, 22, 1, -8, -50, 127, 12, -14, -14, 26, 15, -12, -34, 42, 16, 16, 52, -24, -18, -25, -4, -28, 12, 8, 61, -21, -18, 40, -43, -18, 21, 29, 6, -2, -29, -7, 0, 36, -31, 18, 9, -36, -22, 0, 15, 14, -26, -16, -6, 0, 10, -47, -16, -9, 31, -4, -6, 17, 16, +-2, -13, -10, -33, 35, -32, 42, 2, 31, 0, -3, 22, -38, 2, 1, -2, 18, -4, -27, 8, 7, -12, 1, 1, 59, -2, 14, 1, -6, 127, 49, -1, -11, 20, -26, 0, 24, 16, 10, 48, 45, 28, 47, -7, 22, 24, -10, -20, -20, -3, 11, -35, 30, 1, -2, 37, 7, -22, 4, -16, 33, -37, 17, 0, -28, 2, 5, -15, -10, 17, -35, -2, -15, 26, 4, 8, 15, 8, -4, 72, -12, +21, -5, 45, -14, 57, 11, -18, 31, -9, 17, -10, 36, 9, -25, 7, -11, -5, 0, 31, -31, -31, 6, -17, -10, -30, -13, 9, -20, 9, -18, -17, -3, 0, -19, -4, 21, -8, -30, -28, -17, 21, 21, -28, -5, -7, 0, -56, 4, 1, -53, 12, 6, -4, 9, 46, 6, -11, 88, -35, -43, 17, 2, 7, 6, 86, 17, -3, -23, -22, -29, 14, 10, 3, -11, 27, -1, -9, -33, -12, -37, -26, +-13, -2, -12, 0, 0, -25, 56, -13, -35, -30, 12, -7, -3, 17, 18, 1, -24, 21, -1, -7, 37, 27, -33, 8, 12, 6, 12, -37, -1, -32, 3, 33, -24, -26, 37, -7, -3, -12, 22, 38, -28, 4, -14, 17, -21, -11, 26, 13, 28, 29, 3, -8, -24, -4, -4, 6, -45, -6, 9, -21, 10, 48, -20, 23, 8, -1, 10, 12, -23, -41, -18, 2, 11, -25, -13, -9, 21, 7, 24, 17, -24, +10, -20, 12, 40, -18, -5, -16, -7, -5, -19, -7, -37, 23, 13, 28, -25, 20, -36, 10, -13, -6, 25, 86, -44, -32, -1, -27, -31, 0, -30, -3, -48, -3, -23, 7, 85, 39, 5, -34, 42, 21, 10, 23, -27, -60, -44, -13, -27, -1, -67, 90, 80, -42, 41, -54, 24, 12, 18, -11, -24, 38, -16, -7, -15, -5, 76, -4, 13, -43, 0, -37, -10, -12, 49, 22, -15, -40, -20, -41, -3, 1, +50, 71, 35, -3, 19, -9, -22, 40, -7, 49, -25, 22, -14, -53, 22, 1, 16, -4, -28, 28, -16, -26, 40, -14, -28, 2, -32, 72, -33, -15, -7, -7, -17, -18, 45, -8, -27, -12, -6, 49, 5, -16, -25, -35, 8, -16, -13, 32, 37, 20, 33, 102, -2, 23, 14, 85, -4, 11, 19, 14, 12, 26, 17, 9, 109, -19, -2, 52, -68, -8, 3, -2, -26, -34, 2, 11, 20, 27, 39, -40, -1, +39, 6, 8, -8, 10, 21, -30, -2, -13, -14, 8, 2, 31, 23, 32, -20, -14, -30, -39, 8, 68, -37, 77, -26, -3, 52, -17, -7, -6, 22, 57, -62, -9, 21, -7, 25, -11, 2, -23, 14, 0, 66, -6, 6, 7, 59, -3, 1, 16, 4, -14, -39, 15, 14, 39, -7, -33, -1, 27, 46, -33, 1, 21, 21, 16, 40, 5, 69, 46, 24, -9, -13, -30, 1, 36, -15, 19, 3, 70, 0, 20, +-13, -12, -33, -23, 31, -29, -43, 30, -47, -22, -8, -17, -24, 63, 33, -15, -20, -7, 39, 17, 28, 2, -1, 40, 19, -41, -23, -14, -21, 17, 35, 43, -7, 68, 38, -35, 37, -1, -14, -7, 16, -20, -7, -21, -21, 2, 66, -21, -19, -37, -4, -15, -14, 4, 3, 14, -6, -27, 5, 11, 13, 3, -25, 14, -23, -22, -7, -1, 2, -8, 16, -37, -9, -3, 1, -3, -12, -17, -14, -41, -12, +27, -5, -13, -5, -6, 13, 23, 32, -16, 2, -5, -3, 4, -25, -26, 11, -12, -8, -50, 4, -4, 110, -15, -66, 38, -24, -37, 8, -22, -51, 6, 29, 29, 49, -57, 41, 9, -6, -35, 4, 26, -13, -8, -49, 33, -27, 12, 15, 0, 15, -22, 31, 0, 13, -4, 4, -49, 1, 79, 21, -22, 17, 40, 1, 26, 8, 7, 25, -39, -47, -29, -8, -21, 14, 51, -15, 2, 18, -68, -41, 11, +24, 28, -49, -32, 5, -35, 34, -31, 6, -5, -2, -35, -9, -9, -34, 32, -9, -8, -29, 24, 25, 38, -35, -13, -19, 42, 7, 36, 9, -37, 9, 8, 19, -2, 7, 14, -42, 8, -7, 0, 21, -34, 25, 1, -41, -51, -23, -43, 27, 40, 10, 59, -3, -35, -22, 19, -18, 0, -9, 20, 29, 52, -15, -7, 24, 44, -3, 0, 5, 30, -19, -4, -14, -7, -15, -27, -27, -41, -23, 14, -10, +-32, -45, 4, -24, -19, -2, 88, 32, -19, -20, -14, -4, 16, 19, -3, -33, 26, 11, -25, -52, 18, 3, -54, 2, -50, -43, -13, -38, 28, -33, -25, -11, 18, 15, -5, -10, -20, 20, -68, -30, 65, -18, -27, -13, 8, -39, 38, -3, 32, -26, 98, -26, 62, 11, -64, -46, 57, 3, 10, 17, -11, -50, -24, 107, 43, -15, -35, -31, 28, 23, 39, -39, -66, -30, 18, 52, 30, 14, -6, -35, 37, +30, -40, 10, -13, -45, -57, -42, 50, 81, 27, 15, 87, 1, 28, 3, -4, 9, 42, -9, -69, 52, -4, -5, 16, 4, 18, -33, 16, -55, -39, 16, 26, 6, 5, 0, 0, -32, -37, -18, -11, -14, 24, 32, -45, 0, 4, 0, -20, -20, -4, 4, 37, -3, 12, 0, 98, -7, 57, -17, 3, -19, -32, -16, -14, -34, 45, 8, -40, 16, -43, 53, 42, -10, -39, -22, -21, -37, 2, -4, -38, 4, +-12, -16, -16, -2, -41, 40, -23, -52, -8, 15, -58, -11, -35, -23, 4, -11, 65, -19, -38, -9, -1, 28, 54, 17, -3, -2, -27, 12, 11, -13, -28, -4, -15, 59, 32, 13, 8, -23, 17, -25, 39, 7, 6, 35, 11, -28, -16, 13, -7, 40, -3, -1, -22, 17, -20, 5, 1, -5, 10, -13, -16, -26, 23, 3, -12, -24, 53, -15, -3, 14, 96, 10, -11, -19, -15, 6, -16, 2, -26, 48, -9, +-61, -11, -21, -17, -87, 4, 25, 1, 84, 3, 26, 11, -28, -30, -5, -20, 7, 2, 14, 7, 40, 2, -45, -18, 89, 75, -38, -17, -18, 1, -19, 17, 6, -23, 2, 28, -2, -50, -18, 1, -16, 17, -13, 0, -32, 24, 30, -28, 37, 19, -31, -25, 19, 22, -57, 30, 10, -55, 12, 27, 5, -40, -5, -8, 38, -6, 2, -15, 4, -3, 1, -12, -11, 5, -7, -14, 24, 23, -1, -1, 45, +-6, 23, -7, -7, 27, -29, -6, 6, -21, -24, 16, 32, 2, -40, -33, 2, -3, -14, -25, -9, -19, 10, 9, 61, 4, -2, -5, -17, 1, -18, -14, 12, -59, 22, -22, -14, -21, 24, -2, -6, 25, -15, 10, -37, -13, -28, -34, -28, 38, 1, -64, 39, -7, 54, -26, 41, -13, -4, 2, -40, 6, -26, -47, -3, 61, 43, -47, -51, -17, 12, -23, 84, -4, -9, 23, -12, 3, 0, -32, -43, -19, +-9, -45, -3, 3, -42, -54, 40, -18, 26, 10, -22, -55, 6, 33, 35, 18, 5, -24, 67, 4, -23, -30, -27, -57, -17, 19, -42, -30, -19, -13, -23, -27, 3, -5, -27, -27, -16, 127, -70, -31, 48, -7, -13, -16, 32, 11, -12, 83, 7, -2, -3, 4, 22, 10, -48, -37, -78, -8, 33, 36, -7, -15, -29, 11, -20, 14, -5, 19, -29, 2, 13, 12, -14, 34, -34, -24, 13, -12, -39, -50, -15, +-20, -11, -12, -57, -47, 1, 26, 25, -50, -35, 19, -29, -10, 8, -27, 32, -15, 5, -15, -39, 54, -19, -18, -2, -48, -5, -13, -9, -21, -4, -43, -25, -32, 6, -5, -12, 21, -23, -20, -21, 13, -2, 7, -17, 0, -25, 10, 20, 0, 33, -12, -7, -28, -26, -17, -12, 9, 57, -2, 21, -25, -28, -13, 8, -1, -4, -4, -16, 19, -8, -4, 2, -36, -28, -10, -22, 43, -63, 25, -10, -47, +20, -44, -22, -4, -47, -24, -33, 66, -40, 9, -58, -2, 67, -23, 0, 63, 8, 37, -27, 28, -10, -22, 44, -77, 64, 15, 36, -34, -31, 16, -17, -3, 56, -31, -7, 6, 84, 10, 45, 39, 10, -49, -3, 8, 27, -15, -41, -14, 112, 16, 16, -12, 56, -31, 22, -80, 32, 6, 14, -9, -14, -21, -18, -9, 11, -21, 13, -38, -32, 15, 4, 37, -3, 41, 12, -5, -1, -31, -51, -43, 56, +12, 74, 20, -7, 11, -70, -45, -32, -19, -6, -22, -8, -16, -55, 21, -2, 39, 18, 8, -17, -6, -56, -26, 45, -28, -11, 5, -5, 8, -26, -31, 2, -8, 3, -44, 35, -13, -18, 43, -37, 16, -11, -47, -15, -45, 41, -1, 70, -34, 3, -24, 2, 11, -34, -18, -8, -6, 33, 10, -17, -11, -8, -29, -25, 39, 29, 7, -32, -27, 12, -2, -6, -3, -16, 19, -20, -4, -33, -11, 17, -4, +-30, 44, 16, -16, -5, -15, -21, -29, -18, 9, 7, 44, 28, -26, -28, -6, -6, 1, -22, 7, -5, -21, -27, 51, -39, 36, 15, -26, 9, 35, 27, -4, 2, -23, -13, 23, 32, 67, 27, 30, 15, 32, 69, -50, -43, 39, 15, 27, -30, -26, -26, -31, 50, 1, -6, 37, -52, -11, 6, 15, 5, -32, 25, -19, 41, 51, 50, -9, 26, -42, 88, -9, 31, 41, 9, -3, 7, 1, -18, 0, 39, +-22, -42, 45, 26, -11, -19, -5, 68, -5, 25, 3, 5, -42, 6, -15, -1, -6, -25, 1, 28, -12, -13, -18, -5, -9, 9, -40, 33, -1, -7, -22, -22, -5, -10, -20, -5, -25, 10, 14, -3, -26, -10, 1, -5, -20, 16, -8, -17, 27, 17, -11, 25, 23, 19, -17, -24, -28, 32, 44, -10, 5, 16, -14, 17, -3, -14, -8, 39, -24, 26, 61, -56, 30, 62, -3, 53, -35, 5, 0, -16, -19, +-36, -7, -10, 15, -44, -29, 48, -38, 64, 11, 16, -11, -21, 8, 23, -10, -14, -24, 1, -35, -25, 38, -32, -27, 36, -33, 51, 25, 18, 15, 39, 27, 11, 37, 5, -1, -9, 46, 33, -37, -4, -4, 21, 45, -53, 39, 12, -10, 85, 11, -51, 18, -5, -5, 1, 16, -32, -56, -11, -9, -26, 11, 40, 18, 13, 19, 4, -34, 42, -9, 29, 10, -20, 14, -8, 101, -16, 2, 2, 0, 15, +-12, 30, -15, 12, -25, 105, -44, -38, -27, -41, 52, 44, 1, -33, 2, -36, 36, 7, 1, -49, 40, -43, 33, -20, 12, 48, -10, -30, 58, -30, -22, -53, 5, 11, -29, -16, 2, 8, -3, -31, -18, 18, 31, -15, 0, -3, 62, -19, -3, 56, -30, 126, 33, -8, -3, -32, 13, 20, 127, 1, 11, 13, -23, -13, -33, -54, 13, 8, -15, -3, -3, 93, 8, -6, -14, 33, -13, -17, 21, -27, 5, +23, 34, -53, -1, 59, 67, -19, 14, -45, 19, -45, 44, 17, 70, 15, -3, 12, -8, -16, -3, 50, 57, 84, -24, 39, -53, -35, 21, 5, -16, 35, 46, 43, -41, 32, 1, -14, 38, 4, -20, -4, 38, -26, -9, -22, 54, 15, 54, -19, -5, 3, -41, 60, -13, -35, -13, 25, -10, -9, 16, 20, -38, 37, 8, -41, -58, -17, -12, -63, -1, -9, 22, -3, 57, -7, -8, 11, 31, -63, -12, -6, +61, 25, -5, 37, 34, -1, -10, -2, -26, -50, -24, 2, -2, 52, -53, -9, -33, -23, -14, 11, -12, -24, -6, -30, -25, -15, -14, 33, 6, 5, 12, -13, 34, -25, -20, -19, -34, -6, -39, -4, -8, 101, 3, 30, -27, -19, 15, 39, -31, 5, 48, 35, 4, 45, -18, -11, 13, -30, 18, 4, 18, -57, 14, 33, 64, -21, 3, -55, -13, -20, -48, 19, 83, -37, -8, -32, -19, -24, 7, 28, 8, +4, 45, -23, 8, -19, -38, 22, -38, -18, -29, -4, 48, -20, -30, -24, 22, -19, 2, -18, 6, -41, -14, -11, 21, 2, -17, 43, -23, 41, -9, 23, -9, 37, -27, 19, -13, 3, -5, 5, -10, -38, 3, 35, 22, -4, 41, 27, 8, 16, 7, 41, -17, 34, -35, -31, 50, 9, 1, -46, -28, 33, 53, 16, 55, 22, -4, -21, -40, 7, 29, 25, -33, 15, 22, -30, -1, 25, -2, -5, -36, 9, +-2, 21, 32, 28, 54, 58, -36, -29, -7, -32, -6, -13, -37, -24, 59, -11, -15, -41, -4, 20, 0, 1, -36, -22, 3, 9, -13, -4, 62, -5, -10, -4, -2, 62, 14, -10, -24, -6, -9, -9, -22, -28, 1, -10, -1, 39, -5, 28, -1, -17, -16, -8, -34, -6, -2, 23, -8, 49, 4, -5, 25, -13, -4, 6, -7, 54, -14, -11, -9, -17, -8, 32, 20, -20, 5, 19, -14, -23, -35, 127, 4, +54, -2, 1, 12, 37, 25, -11, 18, -16, 19, -40, 7, -16, -11, 6, -22, 20, -15, -16, 24, -32, 15, 32, 1, 11, -30, 105, 3, 14, 5, 90, -16, 1, 16, 6, 77, 57, 34, 127, 13, -27, 6, 1, -2, -10, -46, -3, 2, 41, -22, 12, -20, -13, 43, -29, 8, 1, 19, 38, -32, 76, 15, -83, -7, 16, 11, 6, -13, -34, -37, -36, -19, 46, 15, 2, 62, -19, 28, 45, 12, -43, +-42, 31, 3, 16, 50, 28, -18, 24, -36, -1, 4, 35, -2, -10, -11, -39, 16, -2, -18, -27, -7, 19, -18, 48, 10, -29, -16, -3, 12, -18, -39, -54, -3, 46, -1, -27, -30, 20, 102, -5, -44, -17, 78, 2, -8, -49, -11, 13, -46, -10, 17, 4, -31, 28, 22, 29, -10, 63, -2, -34, 21, -20, 24, -13, -3, 21, -16, 0, 8, -5, -25, 0, 1, 12, -11, 15, 6, -26, -9, -17, -11, +-29, -4, -39, -15, 11, -13, 12, -6, 23, -3, 2, -2, 16, -57, 39, 6, 4, 100, 20, 35, -50, -22, -27, 21, -25, -9, 0, 8, -3, -29, -13, 54, -27, -25, 26, 80, 38, 12, -12, 15, 19, 4, 56, -16, -7, -66, 4, -8, -2, -44, 33, 19, -27, -50, 95, -9, 19, 8, -36, -13, 11, 20, 93, -27, -40, 47, -24, 17, 27, 22, -16, -11, 13, 29, -43, -7, -4, -17, -39, 12, 76, +62, 17, -39, 50, 9, 18, -32, 68, -26, -43, -6, 42, -55, 23, -30, -30, -24, 43, 58, 9, -10, -41, -19, -47, -3, 5, -55, -25, 9, 21, -15, 0, 96, 30, -21, 55, -63, -29, -79, -27, -25, -37, 14, 111, -30, 30, -19, -18, 7, -25, 19, -21, -15, -24, -30, 34, 9, 0, 4, 11, 17, -43, -20, -16, -60, 3, 14, 26, 22, -28, 13, 22, -42, -43, -25, -12, 19, 39, 12, -14, -16, +-52, 43, -21, 53, -5, 23, 9, 23, -39, 44, -22, -36, -7, 0, 44, 42, -5, 13, -22, 18, 19, 38, -11, -12, -19, -7, -14, -22, -2, -23, 100, 50, 11, -30, -40, -14, -17, 24, -34, -27, -33, -11, 60, -22, 24, -18, 25, 16, 32, 16, 29, -14, -12, -12, 18, -9, -32, -21, 0, -11, 4, 60, -28, -29, -30, -41, -11, 22, -27, 3, -43, -10, -1, -12, -12, 6, -5, -36, 23, -69, 5, +44, 19, -7, -43, 6, 10, -33, -76, -9, 8, 5, -5, -14, 19, 27, 45, 0, -26, -19, -14, 27, 2, -17, 16, 17, 34, 6, -7, -5, -13, -23, -1, -5, 16, 10, 55, -22, -13, -42, -23, 10, 127, -21, 24, -33, 30, -19, -10, -53, 27, -26, 6, -12, 4, 53, -4, -20, -3, -4, -4, 8, 61, 18, 55, -15, -30, -13, -1, 1, -10, -4, 3, -26, 10, 38, -17, -16, 3, 17, -35, -10, +-8, -12, -11, 16, -6, -21, -31, 8, -4, 28, -34, -9, -2, -40, 8, 27, -10, 40, -19, -18, 3, -27, -6, 25, -35, 4, 9, 32, -4, 15, -13, -5, -1, -4, 50, -19, 15, -9, 6, -22, 28, -8, -24, 0, 24, -14, -5, 33, -24, -18, -61, 113, -40, 22, -1, -9, -27, 0, 47, 43, -16, 19, -61, 18, -19, -11, 31, -2, 9, 12, -8, -19, -9, -10, 27, -32, -29, -57, -11, 39, -46, +1, 77, -27, 11, -17, 7, -17, 16, -12, -4, -12, 36, 41, 26, 69, -7, 16, 107, -12, -13, 20, 18, 15, 37, -16, 29, 31, -11, -23, -4, 72, 58, -22, -7, -14, 3, -22, -6, -13, 39, 127, -7, 15, 33, -2, -20, -16, 68, -13, 23, -9, -43, -4, -31, 19, -27, -8, -7, -2, 22, 10, 24, -53, -25, -3, 35, -27, -6, -42, -18, 33, -31, 11, -19, 10, -26, -4, -14, -27, 15, -17, +-20, 42, 37, -3, -22, -28, 19, 49, 19, 22, -13, 77, -1, -14, 2, 41, 30, -7, -2, 26, 75, -1, 2, -17, 22, -20, -12, -21, -54, -2, 88, -26, -24, 17, -16, -16, -12, -9, -38, 27, 68, -7, 4, -42, -22, -20, -2, -24, 27, -25, -38, -33, -14, -13, 59, 79, 8, 25, 18, -30, -28, 49, 15, -40, 7, -4, -25, 0, -36, -15, 12, 4, 9, -10, -34, -49, 18, -4, -4, 8, -29, +-44, -4, -2, 127, -25, -14, -49, 9, 58, 71, -21, 1, -40, 22, -56, -32, 2, 53, -1, -19, 102, 22, -27, -31, -16, 0, 17, 39, 4, -15, 17, 113, -25, -14, -16, -16, -10, 35, -30, 24, -3, 51, 31, -9, -55, 24, -58, -25, -1, -19, 32, 8, -18, -39, -8, -12, 68, 1, 33, -11, 4, -7, -39, 5, 21, 33, -17, -54, -7, -2, -25, 88, -8, 16, 13, 74, 21, -34, -51, 14, 23, +-23, -32, 26, 33, -8, 25, -42, 30, 37, -37, -6, 11, 10, 10, 16, -4, 8, 26, -38, -6, -9, 51, -1, -6, -65, -37, 9, 10, -32, 13, -46, -19, -32, 56, 127, -25, -56, -7, 30, 44, 21, -32, -9, 56, 3, 23, 7, 15, 21, 89, 37, -13, 0, -27, 18, 21, 13, -21, 0, -23, 127, -24, -15, 48, -30, -17, -2, -3, -21, 34, 7, -7, -42, -9, 2, -22, 83, 19, 8, 19, 0, +-5, 6, -33, 5, -25, -16, -11, 25, -3, -18, 9, 69, -10, -7, 20, 13, -24, -7, 55, -26, -20, 8, -1, -4, -4, 28, 48, -15, -24, 1, 5, -24, -26, -25, -46, 16, -17, -9, 39, -21, -7, 14, -45, -6, -49, 5, 36, -12, -10, -11, -44, 14, -50, 32, 10, -11, 26, 9, -46, 24, 2, 6, -58, -13, 8, -1, 14, -44, -15, -14, -46, -44, 16, 32, 28, 0, -55, 102, 5, 19, 18, +-3, 7, 4, -17, -9, 59, -15, -15, -2, 4, 3, -13, -32, -5, -14, -2, 4, -21, 3, 16, -6, -18, 48, -4, 27, 44, -11, 13, 2, 5, 11, 11, -2, -37, -17, -3, -2, -18, -3, 7, -38, 43, -22, -20, -12, -15, -11, -8, 32, -19, 26, -24, -6, 5, 0, -5, 42, -5, 3, -18, 1, 7, 5, 14, 40, -9, 6, -19, -36, 13, -33, -44, 0, 63, -20, -84, -16, -60, -11, 6, -35, +1, 11, -13, 91, -23, -15, 43, 54, -23, 23, -30, 5, -16, -50, 25, -27, -17, 57, -50, -39, 0, 41, 5, 52, -4, -65, 6, -18, -40, -6, -54, 1, -54, 16, -22, -22, 6, 81, -32, 20, 65, -30, 26, -12, -24, 74, 36, 16, -6, -15, -28, -25, -23, -10, 30, -10, -20, 42, -33, -9, 15, -6, -58, 2, 39, 30, -23, -26, -34, -7, -26, -51, 2, 11, 3, 39, 14, -4, -6, -22, -28, +-10, 16, 75, -19, -37, -18, -4, -2, 50, 54, -41, -36, 45, -2, 24, -40, -28, 10, -39, -6, 47, 10, 21, 65, -10, 4, 6, 11, 4, 24, 6, -36, 59, 5, -15, -16, 54, -25, -14, 26, 6, 12, 40, -7, 78, 62, 14, -14, -19, 25, -7, -24, 105, 24, -24, 20, -4, 47, 19, 10, 29, 25, -32, -32, 5, -49, 15, -11, 2, -50, -50, 26, -42, -44, 15, -4, -70, -26, -19, -63, -22, +14, -20, -33, 3, -44, -95, -4, -6, 83, 51, -26, 84, -24, -31, -20, -18, -20, -35, -9, 12, 17, -50, 3, -15, -27, -2, -70, -16, -10, -33, 73, 20, -33, 0, 34, 76, 54, 3, 0, 10, 10, -41, -19, -24, 37, 9, 12, 26, 10, 72, 22, 40, -7, 4, -7, -19, -19, 104, -11, -24, 12, -23, -18, 2, -37, -11, -19, 29, -9, -1, 21, 18, -20, 2, 11, -8, -29, -16, -30, -23, 76, +7, 0, 23, -19, 7, -5, -26, -40, 20, -12, -11, -34, -1, -2, -3, 24, -19, 11, -34, 5, -31, -13, 12, -11, 50, -38, -60, 24, -22, 24, 20, 81, -22, -53, 18, 17, -10, 10, -24, 33, -6, 14, 45, 25, -18, 5, -60, -21, -28, 32, -60, -4, -32, 13, -6, -3, 12, -13, -19, 1, -2, -19, 24, -30, -29, 20, -1, -15, 6, 5, -23, -19, 4, -18, 31, -32, -22, -12, 4, 8, 18, +-24, -10, 22, -44, 29, -11, -18, -4, -5, 16, -16, 7, -44, 5, -31, 17, 25, 15, 27, -39, -34, 13, -13, 14, -21, 29, 32, -2, -1, 10, -30, -7, 14, 10, -29, -23, 57, -26, 45, -9, 16, -11, -10, 41, -39, -18, -10, 25, -65, -16, -27, -45, 32, 19, 12, 3, 18, -37, -43, -42, 6, 51, -55, -14, -37, -44, 14, 69, -55, -40, 40, -31, -29, -14, 36, 36, -65, -16, 12, 7, -9, +15, -14, 40, 41, -9, -30, 25, -14, -3, 15, -8, -37, 12, -13, 17, -28, -13, 59, -16, -31, -39, 11, 8, 18, -11, -52, 7, -51, -12, -8, -5, 18, 15, -3, 34, 28, -27, -1, 10, -10, -1, -7, -15, -16, -8, -12, 39, -41, -19, 18, 1, -25, -4, 45, 37, -13, 8, -27, 61, -38, -9, -29, -12, 26, -44, -2, -25, 23, -16, -35, 35, 1, -6, -52, -34, 33, -4, -17, -39, -12, -4, +8, -23, -26, -8, -29, -26, 16, -11, -4, -22, -22, -12, -20, 17, -17, 37, -13, 119, -20, -27, -14, -78, -17, 13, 68, 26, -3, -8, 16, 37, 23, -43, 14, 48, 37, -21, 43, 70, 4, -5, -1, 8, -27, -3, 8, 19, 8, -1, -8, 30, -18, 51, 9, -40, -26, 3, -1, 25, 22, -31, 22, -36, -19, 21, 16, 87, -17, 35, 14, -1, -6, 16, 20, -28, 66, 48, 4, 1, 59, 12, 20, +5, 28, -8, -29, -35, -18, -13, -11, -3, 27, 4, 23, -9, 13, 11, -38, 29, 8, 75, -1, -46, 5, 24, -32, 44, -24, 94, -14, -38, 11, 34, -15, -13, -15, 18, -41, -21, 52, 48, -19, -14, -32, -11, -10, -15, -64, -25, -19, 16, 8, -2, 16, -41, 11, 5, 24, 9, -24, -51, 48, -7, 7, -7, -38, -8, -13, 59, 21, 26, -24, -6, -28, -35, 6, 53, -35, 19, 38, -19, -22, -41, +-6, 19, 37, 2, -5, 67, 50, 8, -5, -53, -99, 73, 127, 17, -35, -34, 21, -12, 19, -59, 7, -36, -17, 24, 26, 3, -22, -25, 26, -20, -36, -40, -11, 24, -6, -33, -36, 56, -87, 45, -4, -25, -43, -32, 22, 46, -44, -25, -43, 17, -27, -89, -40, -21, -43, -5, 10, -10, 59, -1, -25, 74, -31, 41, 34, -18, 76, 82, -54, 43, -43, 32, -20, 15, 19, -16, 12, 1, -3, 17, 29, +9, 2, -36, 71, 5, -36, 21, 102, -6, -37, -4, -16, -8, -34, 10, -43, -20, 17, -11, 44, -13, 14, -40, 28, 0, 62, -37, 12, -11, -39, -31, 21, 29, 59, -31, -53, 8, -35, -20, -11, -21, -68, 27, 33, -8, 68, 34, 9, 1, 98, 48, -32, 5, -27, 12, 124, 23, -28, -3, -6, -23, 77, 85, -14, -26, -11, -14, 125, -28, -29, 29, 4, 68, -40, -44, 4, -4, 3, -8, 56, 17, +12, -25, 12, -7, -33, 19, 21, 102, 19, -1, 55, -40, -8, -16, -22, 6, -14, 48, 7, -12, -55, 2, -5, 9, -43, -15, 2, 0, -22, -4, 15, 22, -17, 18, 3, 53, 12, -2, 31, -2, 17, -8, 6, -37, -2, -11, 40, 43, -34, -24, -18, -10, -35, 23, -15, -6, -23, -5, 2, -36, -1, 1, -25, 3, 13, 23, -20, 10, 83, 12, 10, 22, -66, 110, 46, -6, -32, -32, -12, -20, -57, +-26, 0, 31, 15, -7, 37, -12, 0, 5, 24, -46, 127, -74, -39, 42, -3, -36, -42, 6, -34, 43, -32, -2, 14, -1, 0, -6, 5, -23, 66, 39, -16, -13, -59, -1, 1, 14, 21, -46, -29, 0, -1, 34, -30, -1, -48, 14, -53, 18, -3, -6, -12, 29, -24, -24, -7, -4, 5, 20, -5, 19, 30, 12, -47, 14, -6, -14, -17, 36, 12, 34, -21, -21, 1, 5, -14, -17, 4, -38, -33, -4, +23, -27, 25, 3, -8, -1, -29, 14, -20, -8, 39, 8, 19, 25, 5, 45, 21, -22, -10, 17, -16, 4, -6, 17, 17, -13, 72, -22, -55, 48, 127, -18, -15, -1, -36, -17, -6, -15, 43, -11, 37, 16, 103, 1, -12, 44, -36, -15, -41, -21, -44, 34, -28, -11, -42, -2, 30, 10, -35, 57, 9, -49, 31, 32, -21, 15, 43, -24, 37, -4, 34, -9, 70, -13, -14, -3, 74, 6, -35, -32, -18, +-52, -64, 6, -20, -41, -8, -25, -9, 35, -12, 47, -21, -29, 111, 13, -14, -33, 69, -36, 28, 76, 16, -11, -3, -22, 0, -9, 64, 23, 38, -9, 9, 83, -56, -26, -7, -5, -19, 14, -4, -2, -12, -45, -16, -9, -39, 43, -12, -25, 15, -45, -26, -15, -3, -6, -24, 55, -12, 4, -3, -31, 18, -43, -12, -47, -6, 32, -13, -26, 71, 0, 69, -4, -44, -11, 14, -28, -26, -1, -16, -11, +23, -26, -44, 4, -5, 14, -4, -14, -20, 1, 49, 37, 7, 30, 13, 59, -18, -31, 18, -17, -10, 18, 4, -35, 15, -13, -24, -28, -16, 127, -37, -13, 14, -19, 29, -5, 7, -41, 20, 62, -73, -4, 3, 45, 89, 2, 10, 58, 42, -24, -23, 54, -10, 8, 0, -16, -1, 13, 41, -7, 38, -24, -15, -19, -23, -14, -38, 89, 16, -3, -5, -22, -3, -40, -21, 22, -26, 93, 77, 1, -30, +-32, -69, -22, -5, 35, 17, 40, -53, 4, -50, 45, -62, -14, 4, -45, -17, -56, -2, -6, -5, 15, -36, -45, -24, -23, -2, -13, -33, -12, 20, 6, -15, 33, -11, -18, 43, 32, 93, -37, -7, -27, -27, -7, 3, -26, 6, 79, -10, -24, 17, -12, -25, -14, 12, -5, -3, 0, -8, -4, -10, -22, 12, 77, 31, -25, -41, 0, -11, 16, -34, 29, 25, -29, -36, 56, 13, 24, -55, 15, -13, -10, +25, 51, -3, -41, -33, 64, -36, 31, -23, 32, -6, -7, 37, 50, -14, 51, 3, 41, -6, 11, -10, -38, -17, 60, 54, -2, 14, -14, -1, 18, 81, 6, -9, -7, 20, 22, -9, 88, -7, -15, 12, 50, -15, 7, -17, 9, 21, 23, 3, 19, 19, 35, 2, -14, 8, -3, 98, -41, 10, -23, 1, -22, -1, -13, 26, 37, 31, -31, -53, -12, 18, -8, -42, -29, -22, 6, -37, 42, -15, -11, -11, +-10, 10, -13, -42, -9, -6, -13, -14, -8, 52, -1, -15, -17, -7, 51, -11, 15, 1, 6, 61, -59, -2, 3, -11, 8, -46, 100, -11, -38, 59, -20, -17, 115, 45, 70, 52, 15, -18, 65, 59, 15, 9, -54, 22, 46, -13, -14, 11, -61, 10, -22, 26, -55, -24, -33, -32, -7, -12, 79, 8, -69, -13, -18, -2, -10, -24, 24, 32, 36, -12, 18, -5, 9, 2, -37, -20, -20, 18, -26, 26, -29, +47, 62, 6, -2, -4, -14, -37, -42, 0, -15, -13, 1, -23, -22, -4, 16, 17, 23, -10, -15, 10, 51, 13, 2, 1, -3, -2, -30, -2, -39, -10, 7, 58, 12, -37, 0, -39, -19, -31, 29, -39, 42, 18, 102, -43, 70, 8, -21, -43, 6, 36, -24, -30, -22, 1, 40, -6, 8, -16, 7, 10, 3, -6, 24, -5, -23, 127, -19, -10, -8, 23, -87, -44, -24, 1, -28, -30, -18, -2, -29, -34, +29, 80, -9, 1, -18, -60, 20, -9, 59, 13, 115, -35, -4, 6, -18, -23, -15, -9, -27, -34, -9, -34, -26, -32, 51, -38, -14, -1, -2, -71, 72, -41, 1, -30, 16, -33, -47, 7, 24, 1, 23, -36, -63, 57, -37, -23, -36, 9, -5, 28, 60, -28, -21, -51, -6, 33, 42, -40, -1, 9, -13, 55, 7, -14, -33, 2, 9, -17, 33, -18, 14, -16, -13, -1, 10, 91, -28, 5, 4, -4, -15, +-19, 19, 10, 3, -47, -69, 22, -21, -29, 21, 2, -23, -43, 41, -47, 23, 18, -5, 6, 49, -65, 2, 9, -21, 4, 4, -2, -29, -30, 35, -31, 35, 69, -21, 10, 17, -27, -18, 52, -3, -21, -33, 54, 27, 20, 5, -7, 4, 9, 42, -51, -4, -24, -9, 16, -30, 21, -61, -48, -10, -21, 14, 22, -25, -93, -29, -37, 53, -1, -100, -35, -74, 70, 11, -3, 106, 20, 5, -6, -43, 41, +-23, 104, -57, -7, 69, -27, -47, -50, -35, 22, -43, -14, 26, 15, 69, 0, -19, -26, 13, -62, -12, -6, -11, 74, 96, 11, -39, 24, 24, -60, -20, -35, -15, -45, -20, -8, -50, 22, -33, -54, -41, 10, -7, -93, -41, 11, -23, -30, -14, 73, -42, -33, 95, -26, -18, 39, 13, -40, -22, 5, 97, -12, -4, -2, 20, -31, -31, 10, 2, -1, -43, 3, -20, 85, 4, -48, 48, -15, -13, -9, -4, +-1, 17, -7, -67, 11, -23, 20, -37, 53, -43, 8, -12, -59, -51, -22, -1, -27, 50, 24, 2, -9, -10, 29, -15, 24, -46, 4, -51, -32, 27, 28, 26, 41, -71, -4, -46, -8, 1, 16, 7, 22, 127, -17, -44, -47, -16, 2, -18, 3, -4, -13, -25, 112, -56, -20, 31, 15, -4, 64, -15, 18, 56, -28, 8, -24, -16, 15, -31, -9, -2, 60, 2, 1, -1, 16, 18, -33, -23, 18, 4, -61, +-13, 7, -7, 5, -38, 27, 20, -19, 6, -13, -5, 10, 4, -10, -39, 39, -17, -14, -9, -27, -13, 64, -9, -9, 16, 38, 20, -10, -9, -2, 29, -4, -14, 17, 22, 14, 4, -15, -30, 4, 19, -21, 4, -3, 0, -12, 64, 0, 55, 66, -78, 47, -12, 23, -29, -4, 62, 36, 35, 19, -48, -15, 11, -6, -26, 18, 14, -70, -64, 17, 38, 14, 20, -13, -56, 69, -85, -54, 6, 25, 11, +-42, 16, 16, 39, -24, 39, -14, -49, -3, -13, 4, -2, 18, 4, 82, 21, 9, 21, -52, 1, -15, -32, -30, -3, 36, 3, 12, -13, -26, -53, -29, -48, -40, 13, 9, -27, 27, -25, -23, -8, 3, 3, 33, -19, -13, -33, -37, 5, 12, -22, 28, -9, 7, -24, -19, 13, -6, 0, -49, -7, -15, -1, 67, -18, -23, -40, 6, 1, 8, 49, 0, -18, 38, 19, -13, -5, 2, 8, 6, 1, 18, +21, 23, -9, 19, -4, 12, 39, -33, 22, 30, -16, 88, -18, -44, -44, -3, 21, -3, 58, 47, -24, -8, -36, -24, -27, 36, -27, 3, -17, 56, 28, -24, -23, -2, -12, 11, -5, 1, -22, -3, -27, 9, -36, -1, 60, -9, -2, -27, 20, -17, -22, -1, 47, -28, -14, 9, -52, -15, 31, -31, 31, -10, -45, 4, -45, -59, -14, -45, -1, 8, 101, -15, -16, 20, -28, -46, -13, -13, 44, 5, 37, +-10, -22, 9, 23, 2, 24, -5, 5, -11, -1, -4, -2, -41, -44, 1, 69, -12, 127, -33, -40, 16, 41, 43, 13, -14, 12, -12, -38, -14, 8, 86, -19, 9, 7, -28, -36, -25, -3, -6, 3, -24, 11, -27, 22, -2, 34, 56, 16, -16, -28, -32, 32, -31, 50, -20, -10, -9, -16, 1, -3, -12, -11, -34, 11, 37, 7, 4, -2, -35, -9, 8, -21, 11, 0, -20, -27, -21, -22, -28, -12, -34, +-14, -4, -22, -18, 7, -14, 1, -29, -21, -5, 67, -5, 3, 1, 15, -15, -49, 27, 31, 10, 58, -40, 14, 6, 27, 9, 40, -55, 31, 19, 64, -24, -28, 17, 61, -6, 71, -28, 42, 67, -9, -14, -8, -2, -42, -12, -35, -45, -37, 5, -16, 32, 110, -38, -70, 64, 7, 9, 52, 4, 58, -62, 60, 3, -10, 42, 63, 44, -22, -59, -39, -23, -41, -30, 4, -18, -51, 59, -7, -8, -23, +-15, -23, 26, -17, 65, -29, -3, -24, 13, -52, 18, -44, 47, -35, 36, -3, -6, -6, 17, -22, -60, -29, 45, 90, -22, 11, -34, -26, -44, 30, 16, -26, -30, 57, 57, 16, -16, 3, -45, 27, -60, 24, -24, -22, 3, 47, 48, -46, 22, 5, 33, -16, -27, 36, -26, 13, 17, 24, -12, -29, -31, -8, -43, -25, -34, 27, -26, 29, 26, 26, 41, 67, 14, 19, -24, -10, -34, 4, 38, 6, 16, +-47, 20, 15, 5, 13, 14, -19, 8, 75, 55, -30, -12, 32, -44, -28, 4, 26, 25, 35, 40, -5, 17, 1, -23, 20, 19, 61, 36, -24, 36, -1, 39, -1, -24, 12, 42, -13, -8, -20, -11, -14, -10, -16, -12, -2, 0, -39, 127, -51, -23, -24, -38, -4, -54, 8, -3, 9, 8, 3, 23, -4, 4, -12, -32, -29, -26, 15, 10, -21, 36, 7, 72, -19, -1, 32, 0, 56, 8, -7, 31, -29, +-39, 38, -37, 36, 91, 42, 69, 47, -33, 12, 48, 26, -18, 12, -71, -31, 35, -20, 33, -51, -4, -13, -42, -17, -43, 11, 0, 4, -12, -37, 16, 64, -24, 86, -7, -9, 36, -5, 4, -12, 6, -19, -65, -18, 9, 15, -45, -6, 5, -10, -2, 53, -26, -16, 47, -16, -23, 15, -2, -39, 12, -48, 48, -42, -10, -19, -8, -27, 26, -20, -6, -15, 37, -21, -2, 22, -5, 30, 1, -2, 39, +5, 13, -12, 30, 0, -39, -41, -21, 36, -86, 11, -19, -6, 3, 38, -32, 66, 43, -2, -21, 33, -22, 10, -6, -21, 22, 29, -25, -7, -19, -42, -25, -15, -5, 38, -44, -36, -22, -28, -24, -10, -41, -18, 19, -28, -3, 5, -3, -23, -16, -64, 19, -13, -14, 34, -23, -34, -2, -15, 6, -4, 4, -1, 9, -8, 48, -36, -6, -23, -1, -9, 3, 42, 60, -4, -12, 24, -30, -61, -21, -33, +10, -3, 3, -7, 26, -19, -11, 12, -44, 8, 5, -1, 7, 0, -32, -18, -10, 35, -10, 33, -10, -18, 50, 2, 35, -20, 34, 36, 35, -4, 21, -13, 20, 32, -49, -10, 33, -34, -17, 3, 50, 25, 9, 77, -2, 14, -26, 31, -18, -25, 68, 18, -36, -15, -23, 34, 22, 34, -24, -15, -12, -38, -40, 55, 7, -24, 27, -5, 7, -19, 37, 19, -44, -19, -9, -29, -14, -20, 2, -43, -9, +-22, -6, 9, -42, -11, 21, 81, -5, 7, -6, 18, -29, -21, -21, 57, -25, 2, -36, -16, -28, -24, -58, -3, -26, 77, 24, 30, -49, -4, 45, 90, -13, -7, -59, -8, 38, -1, 0, -66, 49, -60, 22, -37, 5, 102, -45, -34, 33, -19, -56, 65, -39, -29, -46, 109, 36, 109, -46, -47, -16, 49, -55, -18, -12, 1, -52, 110, 9, -47, -17, -26, -29, -46, 48, 127, 87, -22, 55, -15, 103, 25, +13, -24, -7, -4, -3, -49, -17, 2, -31, -29, 29, -7, -19, -44, 7, 38, -9, 127, -14, -15, -37, -13, -28, 2, 17, -49, 21, 25, 32, -28, 73, 50, 42, 0, 30, 15, -13, -4, 29, 65, -47, -24, -29, -38, 0, -2, -4, -26, -50, 16, -34, -49, 15, 78, 8, -3, 52, 42, -5, -13, 0, 10, -47, 27, 35, 17, 4, -27, -15, -46, 46, 8, -36, 50, 14, 43, 20, -14, -38, 8, -21, +-27, -63, -2, -15, 22, 13, 5, -29, -39, 18, -13, 15, -20, -27, 14, -8, 9, 19, -37, -37, -109, 5, 26, 15, -18, 20, 59, -9, 52, 16, 18, 10, -11, 10, -15, 21, 0, 16, 40, -7, 12, -50, 68, -12, 11, 33, -35, -7, -5, -34, 11, -7, 21, -29, 25, -3, 9, -5, 16, -1, 2, -10, 6, -28, 19, -17, 18, -24, 9, -15, 21, 3, 64, 3, -2, -24, 7, -44, 13, -22, -14, +78, -18, -21, -11, 39, -13, 39, 19, 10, -19, 39, -2, 70, 68, -48, -27, -12, 72, -42, -44, -4, -44, 4, 14, 8, -2, -30, 8, 69, -6, -20, -47, -27, 64, -1, 23, 15, -4, -26, -68, 23, -32, 54, 66, -12, -14, -34, 98, -4, 20, -7, -4, -21, 5, -44, -39, 49, -17, -3, -31, -3, 85, -8, -5, 31, -41, -29, -27, 34, 12, 41, -44, -13, 39, -27, -40, -11, -19, 6, -5, 2, +-9, 10, -3, 19, 47, -12, 52, 2, -37, -3, 16, -5, -2, 29, 12, 34, 8, -16, -17, 50, -17, 45, 127, 9, 65, 36, -44, -10, -8, -45, 43, 43, -49, -31, 9, 22, -12, 8, -47, 12, 35, 10, -14, 51, 79, 0, 15, 74, -12, -1, -29, 35, -43, 22, 51, 4, 44, -15, -36, -18, -3, 30, -15, -33, -26, -33, -14, -26, 75, 5, 4, -14, 2, -11, -16, -52, 24, 54, 6, 41, -13, +20, -25, 8, 12, -25, 18, 4, -8, 24, 15, -8, -10, 19, -24, 8, 70, 85, 3, -38, 39, 127, 3, 5, -28, 65, 2, -37, -10, -7, 22, -20, 34, -5, -54, -27, 1, 69, -15, -14, -28, 5, -29, 40, -44, 74, -28, 22, -14, -3, -39, -19, 3, 31, 26, -15, 22, -1, -1, 21, 35, 10, 6, 5, -14, 50, -5, -21, -28, -62, -7, -28, -7, 28, 16, 12, -15, 47, 21, -21, 17, 16, +-3, 29, -11, 38, 49, -20, -8, -12, -41, 94, -10, 8, -15, 2, 14, -6, 29, -30, 16, 52, 46, 29, -21, 23, -2, 13, -9, 12, -17, -26, -21, -39, -48, -26, -2, -13, -7, -31, -7, -9, -47, -54, -14, -4, -3, -43, -3, 20, 7, 2, -1, 35, 12, -65, 24, -12, 8, 102, -26, 63, 11, -69, 21, -44, 46, -41, -11, 102, 17, 122, 0, -16, -59, 21, 47, 15, 51, 71, -51, 65, -52, +-9, -20, -18, 1, -7, -7, -31, 60, -35, -8, 38, 47, 25, 100, 26, -1, -31, 0, -60, -37, -22, 3, -6, -12, -4, 74, 24, -30, -53, -2, 25, -7, -47, -9, 20, 27, -8, 68, -1, -8, -63, 22, -16, 1, -7, -9, -47, -8, 10, 10, -14, -20, 21, 27, 26, 20, -9, 6, -34, -3, 4, 38, 1, 87, 58, -23, -2, -30, -28, 53, -5, -4, 14, 2, -21, 21, -11, 64, 2, -16, -30, +59, -37, 28, -52, 58, 38, 25, -26, 5, 28, -14, -10, -25, -19, -34, -35, 29, 4, -16, 38, -63, -39, -25, -38, -9, 5, -32, -4, -3, -12, 27, 46, 36, -7, -47, -12, 20, 8, -59, -19, 46, -9, 8, -7, -27, -40, 12, -46, -20, -15, -4, 3, 1, 23, -2, -9, 10, 41, -13, -48, 6, -9, -6, -3, 20, 19, -39, 127, -56, -28, 4, -1, 77, -26, -7, -38, -45, 29, -3, 17, 22, +-44, 23, 13, 50, -14, -25, 8, -23, 17, 12, -20, -33, -46, -21, 31, 72, 0, 13, -1, -20, -6, -58, -30, 24, -23, -23, -23, 2, 0, 1, -37, -23, 40, -12, -16, -8, -30, 44, -4, 10, 30, -99, -22, -15, -49, -5, 8, -54, 0, -15, 65, 40, 4, -43, 31, 16, -1, -87, -21, 24, 28, 93, -13, -34, -11, 29, 36, -6, 50, 36, -39, 26, 60, -2, -16, 22, -20, -27, 99, 22, 2, +7, -11, -26, 26, 15, -11, 1, 42, -20, 20, 84, -6, -1, 7, -3, 80, -26, -24, 37, -31, 59, 3, 31, -11, -21, -29, 20, 13, 2, 19, -23, 46, 15, -29, 22, 2, 12, 15, -30, -14, -7, 19, 40, -11, 18, 20, -11, 9, -10, -13, -26, -9, 43, -4, 2, -26, -1, 13, 19, -14, -4, -41, -42, 10, -9, -47, 30, -4, 10, -15, 40, 4, -41, 22, -12, -5, 42, -43, 65, -1, 12, +28, -6, 1, -38, -11, 12, -21, -52, -24, 22, -35, 61, -52, -6, -51, -32, 11, 25, 33, -10, -13, 5, -28, 33, 33, -15, -5, 0, 37, -11, 16, 32, 24, -63, 19, 4, 40, 14, 37, -42, -23, 34, -2, 27, -30, -8, -45, -27, 43, 27, 17, 26, -21, 15, 54, 16, -28, 0, -26, -10, 3, 54, 39, -3, -16, 10, -36, -40, 22, 35, -8, -6, -16, 37, -10, 43, 38, -12, -10, -16, 17, +0, -44, 37, -35, -20, 0, 13, -45, -11, 25, 4, 21, -1, -41, 4, 13, -13, -17, 11, -18, -14, 45, 127, 41, -45, 0, 14, -2, -19, 34, -12, 59, -33, 20, -16, -2, -16, -14, -5, -4, -33, 8, 11, -42, -6, 81, 4, -12, 0, -8, 33, -29, -9, 6, 19, -25, 56, 13, 50, -18, -10, 24, 44, -5, 1, 46, 28, -23, -22, 14, -32, -29, 6, -15, 31, 16, 16, -6, 14, -10, -10, +-13, -2, -23, -48, -56, -28, 19, -5, 1, -7, 55, -7, 31, -4, 25, -1, 62, 122, -8, -40, 48, -37, 12, -31, -27, 30, 17, -29, -58, 62, 15, -42, 2, 26, 6, 28, -10, -20, -3, 8, 32, 111, 15, 17, 46, 1, -13, -32, 5, 25, -10, -10, 27, -25, 28, 20, 71, -24, -77, 99, 56, 32, 17, -30, 25, -67, -36, 20, 33, 58, -32, -29, 38, 23, 38, -12, 30, 21, 20, 35, -29, +-12, -6, 0, 7, -7, -41, -35, -1, -8, -9, -8, -38, -37, -19, 26, -24, -12, -36, -16, -15, 36, -14, 0, -50, 13, 15, -2, -1, 127, -19, -17, 59, -6, -42, 14, 69, -19, 62, 27, 17, -41, -10, -26, 21, 80, -10, -45, -44, -13, 117, 29, -2, 43, 41, -27, -37, -34, -17, 24, -16, 6, 14, -1, -4, -26, -13, 25, 33, -11, -32, 68, -20, 45, 34, 28, -35, 8, 23, -33, -21, 21, +-14, 25, -7, 7, -17, -3, -21, -44, 65, 21, -28, 5, -29, 41, 58, -10, -56, -26, 27, 26, -14, 5, -16, 16, -61, -38, -38, -26, 9, -3, 0, -29, 12, 41, 6, -20, -24, -45, -10, 11, 40, 75, 22, 8, 21, -1, 3, 69, -8, -44, -9, -3, 71, 24, -3, -52, 27, -44, 17, -4, -16, 46, 11, -26, -10, 22, -22, 56, -1, 72, 4, -22, 14, -10, -41, 5, -19, 29, 114, -44, -45, +11, 65, -70, -17, -18, -60, -16, -46, -46, 88, 47, 27, -19, -19, -42, -62, 16, -3, -14, -37, 26, 14, -1, 23, 25, -20, 32, 15, 25, 5, 12, -43, 48, -50, 15, 4, 43, -23, -4, -22, 127, -53, 0, 10, 2, -9, 75, 9, 1, 38, 37, 26, -56, 10, -29, -18, 34, 3, 10, -27, 41, 2, 46, -19, 42, 47, 3, -10, -1, 3, 18, 5, 40, -24, -15, -3, -13, -13, -5, 19, -18, +-26, -9, -31, 56, 2, -5, 27, 1, -34, 17, 40, -46, -15, -12, -19, 70, 21, 24, -25, 16, 4, -6, -52, -25, 17, -12, 25, 26, 39, -27, 63, 5, 35, 75, -2, 44, -43, -13, 19, -20, 0, 8, -15, -7, 47, -15, -6, 28, 31, 6, -29, -23, -40, -23, 47, -26, -21, 6, -14, -43, -27, -16, -11, -27, -10, 13, 10, -21, -14, -15, 13, -31, -1, -7, 29, -4, 0, -11, -10, 49, -42, +24, 4, -3, 24, -20, 8, -30, -9, 29, 1, 9, -2, 16, -12, 22, -12, -5, 16, -7, 5, -41, -35, 5, -11, -7, -26, 31, 10, 1, 18, -14, -11, -15, 3, -16, 9, -16, 13, 32, -11, 2, 11, -43, -14, 64, -7, 20, -72, -8, 49, -39, 1, -9, 26, -18, 35, 18, -36, -6, -26, 1, -81, -82, -38, -7, 20, -13, -34, -44, 10, 3, 11, 6, 20, -45, 17, 23, -41, 46, -4, 2, +-47, -20, -29, 90, -45, 7, 38, -29, -11, -24, 28, 11, -18, 30, -34, -18, -2, 39, 19, -21, -27, -1, -10, -2, 11, -26, -33, 1, -8, 1, -6, -13, 9, 1, -1, 0, 10, 37, -19, -24, 16, -9, -34, -6, -23, -16, -14, -11, -6, -3, -3, 43, -23, 39, -10, 45, 27, -5, 9, 6, -8, -16, -2, -11, 17, -4, -8, 6, -1, 36, -12, -30, 13, -7, -37, -14, -8, -22, -17, -1, 4, +-21, 0, 42, -7, 38, 5, 50, 17, -13, 1, 11, -13, -16, -10, -51, 8, 29, 63, 66, -38, -20, -5, -22, 9, -3, 8, 10, 31, 49, 23, 20, 4, -2, -43, 37, -29, -19, 20, -40, 28, -15, -1, -9, 5, -9, 16, 1, 16, -19, 8, 14, 3, -67, -22, -40, -28, -23, 28, -25, -23, 33, 25, -21, 27, 3, -9, -7, -31, -9, 17, 73, -6, 3, 91, 22, -10, -8, -6, 79, -6, -29, +4, -43, -42, -15, 3, -14, -53, -26, 65, -22, -4, -36, 81, -43, 2, 8, -9, 5, -6, -67, -7, -26, 24, -11, 23, -3, -44, 38, 9, -23, 13, 52, -25, 9, 19, 9, -5, -18, -25, 109, -34, 12, -26, -27, 9, -28, -7, -27, -15, 64, 67, 0, -57, 12, -1, 47, 18, -11, -45, 12, -27, 18, 46, 5, -56, -64, 6, -32, 37, 10, -30, -17, 3, -35, 95, -1, 71, -69, -8, 97, 48, +-44, -45, -16, 31, -18, 7, -26, -21, 8, -26, -92, 14, 39, -20, 19, -15, 3, 3, -45, -31, 26, -1, 25, 44, -9, -54, -21, 67, 9, 26, -25, -11, -45, -15, 4, 51, 13, -41, 3, 21, 35, -34, 14, -63, -35, 63, -1, 13, -3, -1, 5, -5, -11, 15, 7, 14, 4, -24, -20, -27, 9, -43, -57, 24, -3, -5, 4, 6, 4, 34, 13, -13, -37, -35, 9, 1, -10, -4, -7, 0, 81, +18, 5, -7, 38, -15, 1, -9, -4, -11, -2, -3, 1, -10, -35, -1, -6, -28, -27, -18, 55, 60, 38, -3, -6, -18, -16, -24, -6, 12, -30, 84, -13, 10, -40, -8, -14, -1, -1, -29, 22, 19, -29, -17, -7, -21, 0, 11, -29, -24, -17, 21, 37, 1, -55, -13, -36, -1, -4, 43, 24, -25, -48, 6, -12, -45, 53, 8, -19, -18, 60, 5, 7, -63, 19, -28, -12, -38, 15, 12, -9, -26, +-24, 14, 18, -9, 36, 64, -10, -3, 89, 16, 14, 46, 42, -12, -29, 18, 15, -9, 14, -6, -23, 2, -2, 2, -1, 14, 9, -3, -7, -24, 25, 13, -20, -40, -24, -2, 50, -19, -1, -41, -2, 72, -13, -12, -32, -1, 55, 17, -3, -4, 30, 15, -11, -26, -14, 4, -10, -23, -47, -3, 12, -4, -52, 24, 23, 127, -15, -17, -56, 21, -12, -60, 15, 52, -20, 16, -4, -10, -56, 109, 44, +43, -4, 9, -22, -33, 67, -13, -16, -16, -8, 16, 14, -48, -29, 12, 70, -44, -41, -45, 40, 32, 13, -18, 28, 19, 20, -6, -36, -24, -8, -30, -41, 19, 1, 12, -44, -22, -7, 24, -13, 41, 48, -35, 10, -47, -23, -12, -11, 69, -27, 4, -34, 4, -17, 22, -39, -52, -4, -8, -23, -17, -10, 15, 2, 13, 3, -16, 25, -25, 32, -7, 14, -24, 4, 37, -23, -2, -24, -6, 6, 5, +16, 12, 0, -4, 6, 27, -16, -54, 4, -18, -13, -26, -13, 16, 14, 4, 5, -17, 18, -40, 38, -16, 15, -15, -11, 25, -15, -2, -29, -14, 15, -2, 12, 3, 14, 6, 22, 36, -5, -36, -22, 43, 59, -14, -24, -60, 22, 6, -22, 7, 15, -12, 18, -32, 2, 44, -9, 59, 28, -7, -26, -22, -34, 55, 0, 27, -17, -27, 32, -13, -8, 37, -22, 9, -36, -17, 25, 10, -21, -47, -11, +66, -21, -62, 0, 20, 11, -7, 6, 10, 50, -27, -27, 8, 42, -15, -33, 39, -3, -30, -37, -30, -20, -23, -53, 66, 60, -34, -75, 80, -63, -26, 1, -54, 37, 20, 22, -51, 18, -51, -6, 13, -3, 26, -25, -65, -11, 18, 5, -36, 13, -66, -34, 37, 5, 35, -17, 0, -6, -16, 44, -28, -1, 3, 44, -7, -29, -8, 19, 83, 127, -2, -7, -37, 25, 24, 2, -24, -25, 52, -39, 36, +-21, 32, -24, -20, -15, 19, 10, -10, -7, 42, -9, 47, 35, -32, -36, -46, -6, -63, 19, -25, 42, -57, 6, -27, -16, 28, 91, -16, 47, 38, -1, -24, -42, -53, -80, -63, 52, -6, -10, 1, -18, -8, -22, 51, 25, -26, 27, 21, -23, -54, -38, -6, 46, 14, 3, -21, 17, 47, 52, -39, 17, 37, -43, -16, 41, -15, 36, 43, 20, -20, -12, -5, 5, 25, 1, 40, -26, -11, -20, 2, 14, +-19, -34, -3, -16, -4, -38, 10, -25, -30, -42, -29, -12, 21, -14, 29, -23, -37, 6, -13, -30, 65, -18, 0, 15, 2, -21, -6, -17, -17, 11, 17, -7, 0, -10, -27, 5, -17, 0, -27, 17, -12, -24, -11, -17, -12, -13, 70, 44, -12, 15, 13, -12, -42, 41, -35, 27, 40, -3, 3, -2, -46, -19, -25, -20, -34, -25, 2, 0, -1, -10, -32, -27, -7, -44, -13, 34, 15, -12, -8, 21, -22, +70, -18, -8, -7, -24, 59, -29, 26, -13, -14, 32, -12, -42, 21, 23, 5, -34, -13, -29, 15, 8, 13, -19, -29, 11, -71, 1, 32, 9, -22, -7, -12, -1, 4, 30, -24, -34, 10, 31, -8, -25, -24, 33, 21, -15, -19, -57, -28, -38, 54, -9, 43, 16, 4, 4, 11, 52, 43, 14, -8, 33, 27, -8, 29, 0, -26, -21, -21, 2, -23, 7, 43, 37, -23, 0, -5, 21, -16, -43, -24, 50, +100, -6, 5, 42, -8, -19, 8, -18, 11, -5, -23, -24, -16, -29, -8, -24, -1, -53, 22, -22, 20, 34, -9, -16, 22, 13, 18, 50, -45, -59, -26, 3, 31, -7, 12, 78, 24, -2, 21, 39, 34, -39, 24, -5, -34, -41, -26, 15, -38, -25, 4, -36, -31, 56, 2, -31, -6, -22, 20, -1, 87, 32, -4, -14, -34, -32, -5, -15, 48, -44, -12, -33, -33, -11, 23, -12, 35, -14, -9, 23, -25, +-45, 45, 10, -29, -25, -8, -10, -7, -12, 0, 22, 4, -13, -6, -16, 3, 54, -4, 57, 21, -17, -17, 38, 7, -33, 31, 11, 7, -4, 13, 36, 14, -15, 38, 7, -25, -20, -8, -22, 2, -13, -6, 11, 14, -28, -5, -10, 4, 37, -4, -1, 19, -5, -4, 55, 16, -38, 28, -8, 3, 6, 25, 36, 8, -30, -29, 7, -42, -36, -33, 15, 48, 7, -24, -42, 15, 53, -27, -18, 33, 13, +-26, 49, -27, -22, 44, 10, 26, -20, -21, 27, 52, -13, 28, 8, -8, -9, 73, 0, 11, -41, -9, 34, 57, -20, -22, 1, -5, 54, 8, -20, -6, 30, -25, -2, -44, 5, -17, -5, -18, 3, 19, 21, -35, 11, -44, 56, -9, 5, 77, -24, 98, -59, -7, -5, -13, -47, 101, -43, 50, 62, 2, -4, -63, -29, -24, -41, -24, 12, -5, 23, -62, -14, -51, -40, -19, -13, -87, -49, -15, 23, -35, +-20, -2, -5, 17, 28, 26, -38, -37, 43, 81, 19, 22, -27, -20, -42, 21, -13, 14, -25, -1, 13, -11, 2, 46, 88, -37, 51, -37, 23, 0, -32, 120, 8, 34, -42, -5, -39, -106, 37, 70, 29, 75, 93, -17, -108, -17, -46, 11, 14, -24, 2, -8, -60, -63, 26, -1, -30, -42, -31, -29, -16, 3, 37, -63, -4, 1, 0, 13, 16, -30, -30, -10, -28, 67, 82, -19, 6, 40, 39, -9, -6, +48, 29, -7, -59, 32, -19, -14, -70, 39, -21, -1, -41, 16, 52, -16, 11, -9, 21, 15, -10, 45, -13, -7, 2, 17, 94, -35, 30, -9, -32, 17, -44, 34, -30, -22, 28, 23, 5, -4, -16, -13, 10, 43, 12, -1, 12, 28, -17, 25, -12, -29, -24, -35, 15, -27, 11, -16, -30, -28, 35, -31, -6, -12, -20, -45, 30, 31, 56, 18, -22, 33, 5, 17, -17, -44, 13, -19, -5, -13, -3, -10, +27, 5, 14, 2, 5, -38, -27, -6, 33, -9, 9, -34, -1, -34, -14, 24, 6, -15, 1, 2, -26, -35, -4, -21, 14, -19, 37, -26, 4, 79, 52, -51, 5, 72, 20, 6, 46, 20, -23, -54, -8, -67, 43, 17, -41, -14, -15, 3, 4, -14, -40, 14, -22, 8, -7, -32, -33, 26, 36, -20, -27, -11, 1, -8, 25, -3, -53, -22, -15, 21, -40, 19, 23, 13, 12, -4, 13, -2, -1, -21, 29, +-46, 17, -12, -25, 69, -47, 23, 1, -47, -9, 9, 44, -7, -31, 56, -44, 28, -28, -29, -5, 24, 5, 42, -34, -14, -41, 57, -8, -40, -22, 3, 5, -31, 6, 5, 46, -18, -18, 18, -33, -9, 16, -28, 8, 48, -10, -40, -37, -13, 23, -68, -3, 104, -22, 45, -16, -29, 25, 54, -28, 9, -39, -13, -33, 62, -27, -24, -69, -7, 10, -76, -31, -56, -37, 30, 48, -46, 127, -25, -4, -3, +32, -12, 3, -33, 14, -6, 19, -18, -35, -4, -14, -49, -2, -38, 26, -67, 62, -35, -29, 64, -22, 19, 23, -34, -13, 22, 6, 6, -7, -19, 52, -10, 11, -22, -31, 40, 1, -9, 13, -14, -13, -24, -11, 16, 16, 15, -1, 45, -17, 21, 0, 8, 14, 13, -13, -7, -6, 13, 7, 26, -25, -18, 69, -15, 10, -28, -37, 32, -10, 4, 4, -17, -3, -28, 0, 8, -4, 11, 2, -13, -24, +13, 6, 16, -2, 20, -23, -6, 5, 4, 8, 4, 11, 46, -1, 24, -1, -26, 52, -9, 41, -58, -54, -37, 25, -41, -38, -5, -2, 23, -20, -67, 127, 42, 17, 44, -33, -3, 39, -42, -8, -3, -17, 1, -24, -23, -40, -36, -32, -24, -18, 31, 34, -11, 58, -26, -11, -32, 34, 20, -52, -16, 34, -30, -31, -8, -6, 5, -10, 125, 10, 74, -4, -39, -71, 54, 94, -1, 36, 5, 25, 19, +-31, -2, -9, 24, -36, 9, -30, 85, 56, -3, -22, 10, -4, 104, 18, -23, -31, 54, -22, -53, -39, 47, -34, -85, -53, -30, 50, 12, -29, 79, 10, -51, -40, -31, 26, -49, -45, 3, -4, -24, -27, 51, 9, 5, -6, 48, -25, -18, 8, -34, -1, 25, 79, -36, 11, -56, 61, 106, 80, 78, 30, 20, 4, -41, -4, -3, 15, 44, 76, 28, -27, -30, 8, 70, -49, -15, -11, 67, -72, -18, 33, +30, 34, -4, -36, -17, -54, -4, -35, -55, 71, 22, -33, 71, -56, -57, -21, 4, -18, 6, 2, 77, -19, -2, -27, 9, -14, -47, -27, -24, -18, 33, 29, 11, -26, -28, -68, -45, -39, -11, 8, 34, -14, -28, 78, -26, -17, -31, -9, 12, -8, 35, -28, 34, -16, 3, -8, 21, -8, -29, 23, 54, -5, 27, 18, -11, -8, -23, -22, -35, -29, -34, -49, 38, -34, -55, 2, 11, -12, 8, -6, -17, +-16, -13, 127, -7, 0, 31, 54, -7, -36, -11, -20, 4, 5, 1, -1, -49, 13, -48, -16, -12, 12, -5, -14, -21, -9, -14, 8, -3, -8, -40, -27, -2, 2, 40, -12, 25, 11, 6, -27, 4, -17, -25, -29, 2, -22, -8, 37, -17, 0, -5, -26, -3, 27, -12, 22, 14, -25, -37, -31, -3, 16, -40, -50, -3, 100, -34, -28, -26, 13, -17, 33, 0, 18, -2, -1, -44, 47, 19, -8, -5, -27, +-9, -24, -12, 11, -1, -40, -11, 10, -11, -18, 23, -26, -50, 40, -28, -12, 35, -19, -25, 36, 27, -8, -20, -24, -7, -26, 19, -36, -32, 4, 12, -4, 1, -23, 8, 3, -7, 6, -4, 15, -19, 82, -17, 12, 3, -19, 20, -16, -41, -25, -39, -1, -3, -29, 16, -11, -53, -40, -8, -50, -13, 1, -41, -15, -30, -17, 22, -7, -11, -21, -26, 105, -33, 39, -7, 73, -34, 37, -59, -5, 56, +-44, -35, 67, 14, 86, 3, 67, 9, 16, -38, -58, -23, 20, -49, -33, -35, 62, 4, 5, 125, -72, -33, -19, 13, 9, -23, 31, -8, -12, 16, 14, -23, 24, 38, -13, -11, -12, -20, -23, 10, 48, 5, 2, -9, -36, -40, -27, 29, 0, 12, 13, -6, 7, -8, -9, -15, 12, -25, -1, -6, -24, -17, -11, -4, -26, 8, 85, -32, 22, 7, 26, 5, -21, 48, -15, -7, 8, 13, 14, -5, -18, +18, -13, -11, -9, -11, 1, -3, 13, -10, 12, 4, -6, -12, -15, 16, -23, 11, 84, -37, 15, 20, 40, -2, -19, 53, 2, -20, 10, 8, 18, -17, -45, 18, -12, -5, -1, 73, 38, 51, 29, -11, -29, -6, -20, -20, -2, -10, -59, 20, 27, -34, 19, -15, -28, -23, 9, -20, -9, 11, -22, -52, 16, 4, -6, -12, 55, -6, -29, 53, -40, -35, -35, -16, -8, -22, 22, -9, -39, 39, 8, -7, +15, -26, 39, -5, -3, 37, 34, 28, 86, 127, -2, 31, -53, 15, -24, 41, 16, -33, -23, -16, 3, -47, -66, 4, -19, -89, 89, -20, -17, 28, 13, 4, -27, 6, -62, 15, -65, 4, 70, -10, -42, 29, 77, 27, 14, 38, -53, -2, 2, 74, -25, -29, -24, 28, 110, 46, 22, 5, 16, -41, 12, -48, 13, 53, -18, -10, 125, -15, 5, 3, -45, -18, -10, 7, -63, 8, -52, -9, 28, -50, -28, +-3, 25, 31, -24, -74, 23, 13, 16, -65, 54, -18, -20, -15, 19, -4, 27, 60, 13, 7, 64, 16, -2, 13, 40, -4, 93, -89, 43, 24, 46, -61, -6, 14, 37, 43, -33, -8, 3, 14, -27, -66, -16, -36, 25, 30, 58, -17, 113, 15, -48, 16, -18, 27, 53, -63, -25, -22, 20, -49, 51, -1, 15, 60, 33, -1, 122, -20, -2, -12, -28, 15, 36, -31, -28, -18, 7, -17, 8, 0, 29, 57, +-22, -9, -7, 0, -5, -21, -18, -25, 56, 21, 127, -11, -38, 2, -40, -21, 2, -26, 0, -26, -25, -16, 37, -30, -21, -18, -16, 5, -15, -2, 9, 5, 23, 4, -4, -21, 53, 5, -24, -3, 8, -30, -61, -39, 11, 0, 19, 12, -40, -6, -12, 7, 55, 18, 11, -25, -21, -18, -30, 2, -10, -7, 17, 18, 66, -14, -26, -18, -38, -30, -19, -41, 46, 16, 89, 21, -13, -6, 21, 8, -20, +-10, -1, -12, -13, -26, -47, 55, -13, -12, 26, 12, -79, -32, 9, 25, -17, -52, -30, 44, -10, -26, 32, 3, 0, 4, -2, -23, -43, 23, 16, 10, -29, 8, -9, 19, 127, -1, -4, -34, -5, -22, 28, 38, -2, 73, -17, 0, 24, -15, 17, 25, 60, 19, -36, 0, -25, -17, -28, 9, 35, -1, -7, 20, 22, -20, -12, 8, -28, -3, -60, 37, -17, 31, 6, -4, -6, 6, -1, -4, -18, 75, +45, 1, -14, 0, -53, 0, 56, -6, 43, -4, -42, 95, -31, 22, -15, -32, -20, 10, 66, 39, 72, -9, 80, -51, 64, -20, 109, -29, -25, 121, -19, 24, 25, 93, -44, -6, 73, -26, 50, -5, 32, -10, 24, -19, 2, -7, -25, -14, -2, -2, 9, -21, 50, 52, -17, -26, 1, 18, -21, -15, -18, 4, -5, 22, 59, -8, -21, -32, -20, 75, -14, -11, 0, 11, 0, 39, 52, 9, -36, -1, -6, +7, -3, -6, 5, 14, 18, -8, 9, 3, 17, 4, 34, -21, 8, -20, -18, -27, -3, -17, 22, 37, -26, -11, 12, 5, 12, -9, 9, -13, -12, -19, 2, 6, -9, -13, 11, 7, 24, 5, 11, 8, 20, -3, 34, -20, 23, -18, -26, -17, -9, -6, 26, 32, -29, -13, 14, 17, 4, -3, -4, -22, 7, -41, 43, -19, 10, 9, -22, -20, 50, -34, -28, 36, -16, 26, -7, -26, 28, 29, 7, 14, +-34, -8, -20, 16, 46, 3, -36, 26, 20, 51, 8, 24, 30, -1, 44, -6, 64, -1, 8, 22, 51, -55, -42, 34, 46, 30, 13, -45, 114, -9, -2, 16, -9, -17, -3, 95, -1, 48, -32, 31, 52, -53, 40, 7, -17, -89, 80, 15, 7, -49, -2, 62, -12, 77, -33, -34, 30, 63, -13, 34, -20, -34, -13, 89, -18, -35, -37, 50, -64, -3, -22, 33, -39, -34, 4, -64, 43, -36, 19, -18, -35, +6, -6, 39, 38, -41, -43, -48, -23, 41, -54, 23, -60, 79, 17, -35, 21, 89, 37, 11, 47, -24, -23, -48, -77, 91, -13, -33, -42, -21, 74, 1, 14, -43, 41, -11, -42, 59, 127, -3, 14, 103, 2, -13, 2, -62, -48, -52, -14, 0, 22, -22, -8, 63, -51, -32, 0, 19, -11, -33, -5, -20, 127, 13, 1, -1, -8, -35, -32, -66, -57, 43, -32, 28, 14, 32, 38, 26, -24, -16, -71, -6, +-2, -29, -10, -31, 39, -31, -26, -23, 6, -4, -37, 10, 3, 15, 15, 28, -37, -12, 28, 52, -7, 3, 37, -29, 17, 6, 10, -17, 34, -25, -14, 0, -15, -6, 8, -19, 23, 9, 6, -17, 11, 28, -1, -16, -15, -13, 12, -8, -7, -12, 27, 26, -29, 16, -41, -5, 42, -58, 91, 4, -23, -1, -32, -5, 35, -19, -12, -2, -10, 13, 13, -13, -14, 8, 5, 1, 31, -18, 34, -28, 17, +-2, -11, 26, 127, 12, 37, -2, 7, 16, 54, -10, -18, 34, -13, -1, 20, 7, 7, 47, 37, -26, 12, 18, 29, 4, 15, -21, -23, 20, -11, -21, 93, -1, 50, 80, -4, -11, 9, -30, 49, -23, -23, 21, -14, 28, 1, 14, 31, -25, -48, -24, 70, -36, 1, 36, 46, -7, -28, -13, 21, -23, 38, -28, 40, 34, 3, -6, -10, 0, 14, 0, -7, -4, -22, -10, -26, 32, 9, -7, 1, -17, +-18, 34, -8, 3, -7, 9, 60, 1, 21, -27, 100, -27, 48, -9, 43, -11, 35, -51, 21, -3, -32, -3, 24, -4, -20, 40, -8, 1, -28, -27, -1, 0, -5, 20, 24, 27, -9, 40, 18, -26, -8, 28, -15, -50, 39, 65, -1, -35, 26, 7, -42, 57, -78, -17, 14, 11, -3, 22, 7, -43, -52, 39, 16, -50, -17, 26, -19, 21, 81, 22, 1, -30, 17, 24, 12, 79, -26, -43, -7, 39, -9, +-8, 42, -32, -9, 3, 53, 10, -16, -1, -1, -18, 21, 23, 36, -24, 84, -15, 30, 66, -4, 1, -13, 17, 41, -9, 23, -20, 14, 12, 7, -12, -10, -7, 15, -4, -5, -20, 15, 41, 0, 1, -7, 9, -12, -10, -19, 7, -9, 25, -7, 7, -20, -24, 32, -1, 6, 6, 19, -18, 27, 7, 16, -12, -14, -5, -9, -11, -10, -7, 19, 41, -11, 8, -3, 2, -7, -12, -5, 25, 6, 33, +-2, -1, -38, -25, 26, -8, 16, -4, -41, 22, 14, -35, 0, -4, -4, 24, -16, 7, 9, 3, -15, -12, 21, -4, 8, -38, -2, -22, 14, -7, 51, 11, -47, -16, 58, 20, 28, -12, 68, 22, -8, -46, 65, 11, -16, 14, 7, 0, 33, -15, 21, -24, 17, -19, -15, -28, -22, 7, 5, -11, 39, -16, 28, -24, -6, -31, -30, 23, -3, -58, -39, 2, -9, 17, 63, -23, 3, 45, 19, 109, -39, +-7, -14, -19, -24, 25, 80, 24, 0, -46, -23, 40, -42, 80, 18, -37, 27, -89, 96, 24, 6, 60, 29, 51, -19, 15, 31, 17, -14, 26, -34, -34, -28, -17, -3, -46, -8, -67, 21, 21, -23, 40, -80, -4, 22, 48, -22, 33, 10, 72, 27, 36, -48, 15, -29, 81, -71, -36, -12, -41, 23, 13, 41, -2, -15, 51, 9, -49, -109, 10, 92, 5, 12, -67, -20, 22, -29, -46, -34, -32, 19, -21, +102, -25, 20, 16, 7, 16, -20, 2, 124, -12, 20, 84, 8, -13, 55, 17, -18, -19, -42, -35, 8, 6, -31, 4, 0, 41, -11, -42, 10, 1, 28, -21, 19, -35, 2, -14, -11, 30, -21, -1, -27, -6, 11, -32, 40, 17, 12, -32, -21, 6, -13, 17, 47, 17, 42, 80, -14, -28, -23, 27, -8, 15, -44, -11, 53, -32, 69, -46, -23, -4, 4, 2, 16, 10, 1, 33, 13, 3, -15, 2, -3, +-29, -3, -2, 64, 12, -18, -25, 2, -5, -40, 5, -17, 11, 20, 6, 38, -19, 21, -11, 21, 12, -3, -25, 30, -9, 11, -8, -6, 11, -1, -43, 15, 14, 5, 1, 94, -8, -11, -28, -8, 68, -38, 10, -8, 23, -28, 26, 67, -30, 6, 14, 2, -5, 58, -10, -10, -9, -50, 4, 32, 43, -3, -14, -28, 12, -30, 80, -36, 39, 25, -13, -9, 17, 16, -20, 10, 39, 42, 19, 16, 74, +27, 84, 28, -22, -2, -1, -23, -2, -51, -6, -4, 42, -16, -11, -15, -26, 3, -29, 16, 33, 54, -19, 7, -45, 15, 73, 9, 9, 4, 7, -13, -17, -15, -1, 60, -33, -7, 21, -17, 5, -29, 10, -24, 0, 25, -63, 30, 97, -48, -13, 9, 13, -12, -13, 30, 55, 109, 18, 27, -13, -13, -32, 1, 50, -56, 72, 17, -7, 32, -30, 4, 4, -67, 127, 57, -67, 8, 7, -11, -27, -34, +-39, -9, 14, 33, -31, 24, -20, 90, 32, 11, -26, -23, -13, -35, -48, -27, 10, 72, 30, 6, -10, 26, -8, -4, 18, -8, 32, 43, 9, 5, -33, -34, -32, -25, -46, 15, -43, -64, -21, -7, 45, -2, -8, 63, -30, 23, -18, -22, 3, 36, -8, 7, -2, -6, 5, -15, -27, -18, -3, -6, 19, -21, -1, 26, -9, -16, 8, 22, -4, -8, 6, 17, -2, 127, -9, 3, -34, -8, -11, -17, 0, +4, -17, 14, 7, -8, 6, 19, -30, -2, 8, 2, 10, -27, 5, 23, -5, -2, 20, 10, -9, -19, -11, 24, -5, 127, 3, -17, -27, -18, -1, -7, 3, -5, -20, 93, -7, 24, -25, 98, -18, 4, 42, 17, 10, -33, -37, -11, 5, -15, 84, -29, 12, -55, 10, 19, -7, -38, 37, 49, -13, -4, 10, -31, 16, 44, -10, 12, -1, -22, -24, 7, -62, 25, 32, 40, -19, -30, -2, -17, -42, 28, +15, -1, 75, 0, -11, 23, -9, -1, -10, 10, -29, 14, -13, 4, -10, -26, 53, -29, -52, 58, -30, 7, 10, -41, -80, 39, 21, 127, -45, -5, -18, 66, 13, 104, 28, -54, 19, 56, 66, 0, 33, -14, 27, -9, 35, -26, -6, 8, -33, -49, 59, -32, -46, -34, -20, -18, 18, -29, 81, 26, 23, -17, -28, 9, -37, -48, -22, 31, -10, 69, -9, -33, -17, 25, 26, 20, 24, 0, -16, 52, -24, +-37, -53, -7, 26, 36, 50, -28, 14, 21, 51, 86, -12, -52, -24, 71, -11, 27, 18, -28, 30, -33, -38, 46, -16, 34, 7, -7, -7, -50, 21, -5, -6, 29, 7, 35, 52, 22, -27, -36, -16, 26, -10, -13, -31, 35, 6, 4, -38, -10, -27, 52, -27, -21, -43, -16, 12, 24, 39, 64, 23, -58, 10, 22, -10, -19, 47, 17, -39, 98, -12, 71, 28, 34, -10, -11, -21, 51, 4, -2, 4, -7, +22, 28, 55, 6, 34, -4, -9, 52, 27, 4, 3, -18, -37, 31, -9, -8, 9, -8, 27, -1, -11, -20, 98, 5, 4, -22, -2, 24, -18, 34, -9, 21, 9, 3, 23, 34, -39, 9, -17, -16, -5, 20, 24, -28, -11, 12, -32, -12, -1, 7, 18, 34, 34, 12, 28, -20, 5, -7, -45, 21, -21, 12, 28, -21, 42, -26, 16, -2, 3, 18, 37, -9, -4, 19, -11, -35, -13, -4, 51, -38, 21, +54, -18, 11, -20, 0, 13, -17, 127, -27, -19, -20, -23, 11, -52, 20, 30, -43, -9, -47, -56, -22, -45, 27, -2, -35, -12, -12, 30, 24, 9, -6, -43, 3, -51, 12, -8, -51, 0, -6, 14, -22, -65, -21, -27, -51, 19, 6, -52, 47, 56, -48, -18, -43, -7, 16, 3, 23, -25, -21, -27, 13, -31, -26, 6, -18, -3, -20, 55, 20, -27, -20, -5, -12, -21, 3, -20, 16, -6, 9, 49, -3, +-22, -9, -26, -29, 27, -3, 34, -29, -11, 33, -31, -22, -21, -9, -37, 26, 7, 26, -9, -5, 37, -18, 81, 59, -21, 35, -32, 5, -81, -67, -46, 1, -8, 19, 36, -20, 40, -5, -33, -6, 2, -31, -27, -34, -26, -26, -8, 47, 29, 64, 13, -1, 7, -14, -14, -36, -5, 23, -31, 30, -11, -10, 2, -16, 22, 46, -7, -3, 1, -31, 28, 60, 74, -23, -10, -8, 14, -5, -21, 2, -2, +32, 18, -19, -23, -20, -3, 31, -4, 19, -8, 0, -6, 6, 20, -36, -10, 5, -21, 21, -15, 14, 6, -4, -4, 6, -20, -7, -32, 2, 12, -45, -14, 14, 30, -8, -26, -18, -40, 8, 25, -10, 8, -11, -5, -8, 53, 26, -26, 66, 36, -52, 32, 2, 23, 44, 21, 12, -13, 94, -7, 3, -4, 49, -20, -11, 7, -14, -30, 5, 34, 6, -30, -25, -15, 37, 7, -14, -21, -26, -30, 21, +-12, 27, -5, -20, -22, -15, -31, -25, -13, 0, -22, 34, -2, 25, 16, 33, -35, -25, -7, -52, -69, -22, 44, 3, -1, -13, -27, -13, 34, 0, 47, 56, -23, 23, 5, 4, 81, -17, -11, -7, -65, -35, -20, -1, 1, 11, 37, -18, 50, -8, 19, 4, -6, 36, -37, -2, -2, -5, -18, -27, 22, 5, -22, -14, 24, -4, -9, 13, -42, 3, -32, -32, -27, 19, -33, 18, -48, -34, 19, -42, -45, +-26, -27, -26, 8, -14, -3, -17, 31, 30, -10, 9, 14, 23, 1, -84, -67, -30, -32, 25, -16, -56, 16, -4, 1, 8, -24, -2, 21, 26, -18, -30, -23, 14, 8, 127, -45, -35, -11, 0, -96, 43, 16, 21, -33, 10, -14, 25, -34, -11, 26, 53, 9, -32, 105, 46, -21, -33, 42, -15, 13, -6, 11, -11, -1, -38, 7, -8, -18, 18, 3, 14, 1, 11, -2, -18, 22, 49, 2, -46, -51, 27, +11, -1, 12, -22, -39, 32, -4, -6, 7, -15, -3, 21, -15, 27, -38, -29, 28, 50, -29, -5, -52, -39, 10, -16, 2, -9, 13, -9, 64, -72, 31, -48, 9, 8, -10, 12, -19, -38, -30, -54, 5, -22, -15, 74, -10, 53, -27, 42, 46, -12, -54, -29, -19, -10, -82, -18, 27, -19, -30, 63, 53, 72, 17, 17, -13, -8, 28, 17, 7, -23, -30, -9, 44, 26, -10, -7, 29, -35, -5, -37, 9, +75, -3, -3, 3, 6, -16, -4, -1, 14, -15, -7, 17, 52, -14, 13, -5, -42, -39, 98, -25, -1, -27, -4, 16, 6, 97, -15, 72, -11, 6, 0, -30, -44, 13, 2, -2, -43, 19, -47, -48, -51, 7, -38, -21, -18, -34, 16, -8, 7, 53, -20, 0, 8, -34, -20, 71, -17, 19, 6, 14, -19, -22, -9, -10, -32, 39, -3, -10, -15, 1, -30, -27, 29, 29, -14, -10, 33, 79, -33, -36, -7, +58, 35, 13, 32, 34, -36, 9, -23, -19, -10, -12, -15, -9, -3, -4, 1, -30, -21, -5, -28, 33, -12, -33, -2, 22, -10, 13, -38, 17, -4, -33, -26, -24, 30, -19, 9, -28, -11, -35, -23, -37, 106, 21, -21, -53, 43, -23, -53, 48, 17, -70, -38, 44, 3, -41, -3, 23, 0, 0, 1, 22, 0, 80, -76, 52, 2, -24, 31, -34, -17, -1, -18, -19, 38, -28, 127, -25, 70, -35, -8, 5, +22, -3, -12, 116, -44, 6, -19, 8, 17, 4, 69, -10, -28, -15, 4, 19, 7, -8, -2, 34, -1, -2, -3, -3, -30, -14, -1, 6, -4, 30, -19, 40, -18, -18, 24, -23, 8, -21, 11, 14, 11, -11, -15, -5, -7, 26, 20, 20, -3, -8, 11, 43, 3, -7, -26, -20, 22, 10, 127, 34, 43, -24, -7, -9, 13, -1, -25, 58, 7, -27, -13, 15, -21, -2, 75, 19, -58, -49, -31, 22, -17, +-14, 11, 43, -30, 25, 18, -6, -7, 23, 34, -2, 8, -22, 57, -25, -1, 9, 36, -27, -6, -13, 37, -10, 9, -19, 11, -57, -28, 56, 8, 28, 10, -40, -6, 26, -17, 6, -7, -18, 21, -7, -25, -41, 23, -16, 5, 13, -11, -37, -24, 52, -33, -19, -18, -44, 18, 7, 91, 69, 50, -1, 26, 15, -28, 55, -17, -27, -28, -5, -15, -14, 9, 26, -28, 38, -29, 13, -52, -48, -1, -16, +49, -23, 32, 25, 63, 12, 4, 49, 75, 1, 21, 12, 0, -56, 3, 9, -34, -17, 29, 57, -22, -20, -43, 32, 33, 55, 4, -25, -80, 52, 26, 1, -2, -12, -22, -57, -8, 1, 19, -10, -10, -18, 43, 72, -21, 2, 8, 46, 32, 12, 83, -32, -29, -12, -13, 24, 45, -41, -13, -31, 11, 49, 40, 62, -3, 17, -28, 52, 8, -9, 43, 45, -29, 37, -26, 4, 22, -45, 11, 48, 4, +22, 21, -9, -7, 15, 17, -3, -39, 14, 54, -1, -42, -9, -18, 16, 12, 0, 5, 7, 15, 12, 1, 1, -21, -16, -16, -29, -18, -17, -17, 35, 17, -38, -36, 0, -49, -6, 0, -47, -33, 43, 3, 11, -28, -55, 16, -63, -38, 29, -40, -33, -16, -40, -63, -33, 21, -23, -7, -13, -5, 14, -12, 3, 16, 27, -17, 34, 36, -29, -59, -56, -41, -1, -50, -13, 18, 25, -24, -11, 14, -1, +17, 125, 53, 11, 9, 21, -6, -24, -14, 116, -14, -14, -34, 15, 3, -33, 24, 64, 41, 3, -27, 27, 7, -5, -25, -18, 7, 60, -17, -8, -13, -20, -5, 22, -3, -10, -15, -16, -10, -24, 2, -24, 37, 65, 6, -9, -32, -7, -15, 0, -48, 25, -3, -44, -25, 1, -12, -40, -17, 0, -14, 27, -19, -9, 53, -18, -35, 35, 29, 40, 9, 14, 0, -8, -11, 32, -14, -16, 48, -37, 79, +-24, -22, 52, -40, -13, 67, 28, -12, 11, 15, 20, -33, 14, 84, 127, -40, -13, -3, -53, 18, -3, 13, 3, -12, -6, -3, -24, 8, 68, 13, 46, 23, 1, 33, 6, 3, 19, -52, -10, 9, 11, 75, 5, -38, 29, -20, 13, 22, -4, 7, 2, 10, 14, 58, 23, -6, -22, -8, -5, -7, 1, 24, 8, 7, -36, -42, -11, 62, 26, -23, -42, -27, 13, -23, -9, -15, 39, -47, -15, -9, -11, +-19, 25, 7, -40, 48, 51, 14, 51, 1, -37, 21, 85, -10, -6, -42, -28, -59, 20, -16, 7, 54, 6, -15, 35, -6, -6, -10, -10, -7, -42, -24, -17, -5, 8, -22, 18, 0, -25, -26, 59, -12, 0, 60, -5, -32, -22, 86, 61, -21, 2, -19, 15, 18, -9, -16, -12, 35, 3, -31, -12, -15, 17, 23, -15, 2, -3, -15, 1, 70, 15, -16, 26, 0, 23, 4, -1, 50, -11, -38, 0, -40, +1, -20, -16, 20, 52, 28, 19, -22, -25, -10, -5, 4, -27, -24, 20, -5, -10, -28, -8, -17, -10, -10, 73, 45, -18, 59, -25, 37, -27, 47, 59, -38, 26, -12, -54, -15, 35, -29, -43, -39, -8, 18, -14, -12, 5, -19, 6, 41, -4, -36, 16, -14, -27, -5, 17, 4, 28, 34, 3, -14, -33, 15, 67, 61, -18, 10, 4, -18, -40, -73, -9, -39, -40, -7, -13, 0, 42, 90, 26, 19, 17, +-18, -42, -6, 18, -4, 86, -34, 10, 33, 16, -74, -42, 3, -21, -27, 19, 6, -9, 43, -2, -32, -34, -12, -4, 91, -22, 17, -1, 40, -12, -23, -20, 27, 14, -18, -19, -21, -39, 8, 35, -28, 19, 22, -17, 54, 7, 26, 0, 57, -52, 34, 13, 3, 3, 19, 36, 50, -46, -12, -52, -25, 21, 39, 47, -17, -31, 67, 33, -17, -48, -17, -15, -29, -23, 64, -42, -38, -28, -22, 5, -10, +33, -46, 33, 30, -30, 42, -19, -50, -4, -23, 32, 23, -27, 27, -45, 3, -15, -29, -49, -24, 50, 22, -28, 4, 5, 45, -3, -70, -5, 23, -14, -32, 21, -9, 101, -30, 34, 0, -14, 127, 10, 55, -23, -26, -27, 15, -9, 0, 18, -18, 17, -18, -40, -26, 69, -16, 41, -1, -31, 28, 16, -18, 2, 27, 112, -16, 83, 10, 1, 9, 30, -18, 47, -22, 127, -49, 23, -16, 4, 6, 23, +21, 15, -31, -18, -13, -29, 4, 44, 18, -17, 16, -19, -19, -47, -32, -28, -21, 36, -16, -50, 15, 17, -2, -36, 76, -33, 0, -15, -7, 1, -26, 7, -33, -20, -41, -4, 7, 2, -38, 21, -24, 25, 2, -62, 29, 14, 21, 28, 15, -20, 0, -7, 2, 32, -50, 26, -2, -4, 15, -7, 43, -24, -9, 1, -9, 55, -13, 10, 26, -24, -17, -26, 75, -11, -14, -70, -15, 13, 37, 13, -12, +-29, 40, 46, 40, 58, 57, 45, 1, 4, -29, -36, 27, 25, 12, -48, 49, 25, -60, 26, -16, 5, -33, 13, 5, -4, 0, 5, 58, 20, 51, 37, 7, -24, -34, 45, -46, 51, -14, 38, -4, -13, 24, 24, -6, -8, 6, -66, 9, 52, -39, 13, -52, -33, -12, -40, -12, 8, -10, 1, -46, -9, 10, -33, -33, -15, 35, 15, -9, -19, 35, -26, 11, 16, 5, 12, -2, -10, -14, -7, 1, 19, +6, -19, 2, -41, -20, 10, -31, -27, 12, -51, -18, 54, -7, 81, -19, -46, 18, -50, -14, -42, -33, -30, -17, 33, 17, 16, -6, 17, 45, -23, -1, -6, 68, 7, 26, 4, -85, -39, -7, 61, -33, -13, -55, -27, 17, -36, -28, -6, 12, -22, 37, 28, -30, -13, -39, -17, 85, -21, 22, -5, 14, -26, 2, 24, -31, -36, 16, 4, -28, 57, -26, -20, -30, 15, -14, -32, 51, -5, 30, -4, -10, +-8, 26, -20, -12, -8, 12, -6, 23, 0, -20, 8, 7, -37, -8, 2, -14, -2, 17, 25, -22, 13, -8, -19, 9, 19, -27, -17, -20, -26, -13, -30, -9, -5, -18, 70, -22, -41, -15, -9, 68, -29, 52, 20, 48, -37, 4, 45, 21, -27, -4, -26, -39, 56, -31, -5, 13, -20, 25, 0, 0, -25, -2, -25, 31, 32, -16, -30, -15, -31, -6, -9, 71, -6, -14, 3, -27, 75, 28, 9, 31, 22, +-10, 8, 45, 8, -20, 14, -2, 26, 0, -35, -68, 16, 8, 33, 54, -36, -4, 48, -35, -23, 41, 26, -4, -20, -14, -9, -7, -43, 83, -48, 91, 33, 4, 27, -22, -17, 13, -38, 88, 14, 7, 39, -13, -2, -23, -25, -29, -25, -25, -12, 31, 2, -7, -24, 25, 35, -8, 28, -11, 18, 18, -18, -13, -40, -38, -19, -13, -15, -19, -13, -9, -15, -5, 53, 0, 19, -43, -18, -29, -67, -14, +-6, -12, -27, 34, -42, -40, 10, -20, -19, 29, -70, -10, 4, -3, -23, -42, 11, -42, -2, 4, 13, 127, -17, 15, 4, -39, 19, -19, 36, 25, -30, 33, -21, -39, -8, 24, -30, -33, 3, -8, -14, -25, -25, 17, -21, -1, 19, -35, 15, 64, -3, 19, -53, 5, -20, 44, -21, 25, 14, 27, -24, -76, 23, -24, -10, 3, 12, 5, -16, -41, -33, 3, -13, -13, -5, 22, 9, -41, -3, -18, 76, +-10, -16, -21, -14, -22, -3, 57, -6, 25, 2, -22, -21, -9, 46, 32, -24, 6, -26, 24, 39, 49, 28, 11, 54, 22, 13, 68, -11, -36, -12, -42, -15, -5, -13, 5, -10, -81, -25, 52, -18, -2, -47, 93, 28, 18, 2, 15, -9, -30, 25, 2, -38, -29, 9, 33, -31, 0, 19, -6, 9, -77, -12, -1, -66, -29, -16, 27, -9, 49, -1, 9, -10, 5, -46, -2, -7, 15, 127, -39, -17, -23, +-4, -5, -24, -31, -12, 15, 8, -1, 8, -26, -2, 5, 4, -6, -5, -15, -34, -6, -9, -26, 10, -4, 67, -43, -49, 29, -23, -50, -8, -10, -33, -68, -53, -7, 79, -3, -26, -3, -16, 3, -2, 42, -5, -34, -8, -24, -20, -30, 35, -11, 33, -13, -14, 0, 24, -20, 53, 3, -24, 46, -5, -24, -17, 48, -2, 70, 101, 29, 16, 22, 9, 58, -16, 120, -1, 26, -6, -6, -6, -33, -1, +-18, 8, 32, 7, 0, -10, 16, 1, 3, -9, 28, 54, 7, 14, -32, -35, 25, -11, 37, 2, -13, 127, 3, -15, 1, 19, 25, -8, 10, -20, -13, 11, 53, -3, 0, -23, -38, -19, 80, -9, 82, 95, -21, -15, -7, 22, 47, -55, 36, -30, 13, -2, 12, -30, -48, -28, 0, 93, -46, -24, 51, -47, 70, 4, 1, 18, -18, -5, -18, -29, 6, 7, 4, -6, -42, -55, 14, 8, 26, -12, -15, +26, -27, 1, -22, 1, 2, 4, -30, 2, -32, -21, -16, -23, -50, -10, 55, -34, -28, -49, -27, -21, 21, 0, -12, -17, -11, 12, -16, 23, 23, 7, 15, -8, -13, -10, -8, 13, 3, 11, 26, -17, 0, 5, 0, 12, -11, -10, -12, -7, -10, -38, -46, 18, 38, -45, -13, -17, -39, -37, -18, -12, 28, -10, 40, -8, -13, -19, -6, -12, -7, -37, -9, -19, 2, 33, -23, -40, -24, -14, -2, -37, +5, 26, 0, -4, 21, 0, -9, -10, 13, -35, -16, -14, -50, -12, -27, 51, 2, -15, 27, -42, -14, 43, 82, -19, -14, 7, 127, 9, -22, -36, -20, -16, -10, -25, -20, -28, 23, -14, -35, -21, -30, 27, -10, 122, -65, 26, 17, -46, -40, -33, -78, -30, -8, 3, -69, 5, -24, -5, -9, 11, -2, 1, -15, -11, -19, 45, -62, -13, -37, 23, -8, -20, -6, -20, -19, -18, 13, 0, 21, 13, -2, +-15, 13, -7, 21, -23, 26, -23, -14, -34, -33, 19, 28, 8, -6, -18, 9, 31, -62, 8, 32, -36, 15, -48, 15, 52, 6, 28, 14, 2, 47, 24, -21, -7, 19, -12, 58, -9, -50, 1, -10, -44, 85, -84, -24, 51, 58, 90, -9, -13, -27, 47, 5, 16, -33, 32, -30, -27, -25, -9, 23, 15, -7, -43, 5, -18, -19, 9, -17, -18, 77, -26, 4, -15, 49, 19, -35, -8, 47, -40, 15, 2, +-21, 11, -27, 45, 8, -42, 48, 0, -14, -28, 24, -5, -35, 8, -35, 44, 17, -1, 3, 3, -33, -15, -1, -7, 2, -9, -5, -10, -6, -18, -4, -7, -4, -26, 38, 39, -15, -5, 19, -14, -35, 15, 50, 17, 50, 117, -35, 1, 58, -23, 38, 89, 49, -28, 15, 11, 99, -24, -27, -37, -18, 16, -31, 49, -2, 35, 13, -35, 48, 17, 44, 13, 11, -41, -7, 68, 16, 30, -14, 1, -15, +127, 52, -48, -44, 4, 6, -47, -13, 12, -37, -60, -39, -1, 6, 8, -19, -11, -25, -26, -43, 30, -27, -11, 32, 72, -36, 10, 4, -3, 9, 25, 28, -3, 1, -23, 3, 65, -33, -4, 18, 4, -36, -20, -9, 33, -11, 41, -49, 10, 102, 18, 34, -42, -3, -4, -5, -8, 21, 90, -12, -1, 33, 53, -7, -5, -33, -61, 3, -23, 115, 20, 26, 6, -24, -30, 37, -4, 33, 15, -20, -33, +-19, -30, 36, -32, 25, -22, 22, -33, -1, -25, 41, -33, -33, -29, -7, -18, 27, -15, -49, -38, -3, -47, 39, 4, 78, -9, 10, -20, 20, -2, -35, -2, -2, 32, 43, -36, -30, -13, 10, 6, -12, -21, 0, 18, 44, -2, 16, -2, -19, 30, 36, 92, -3, 38, 1, -15, 7, -1, -36, 25, 10, -29, 57, -59, -54, -27, -36, 11, 127, -13, -50, 40, 91, 32, -8, 31, 8, 38, 1, 11, -32, +2, 106, 5, 9, 38, 28, -12, -56, -15, -16, 25, -32, -21, -27, -11, 51, -32, -15, 57, 42, 5, -6, -38, -8, -8, 7, 12, 6, 24, -19, 30, -24, -27, 29, -21, -12, 0, 4, -43, -21, -10, -25, -16, -4, -3, -5, -14, -26, -2, 2, 19, 3, -10, -7, -1, 19, -24, 24, -23, 94, 28, -4, -4, -15, -10, -14, 60, -19, -6, -11, 23, -8, -13, -36, -3, 7, -26, 13, 29, -4, 9, +-11, 32, -20, -20, 58, -14, -13, 22, 41, -16, -3, 62, -23, -15, -24, -22, 8, 5, -9, -17, 0, -23, -13, 24, -45, -4, -2, -5, -45, 20, -30, -6, 43, 10, 51, -31, 0, 43, 23, 12, 33, -26, 27, -14, 29, -36, -28, 12, -26, -13, -30, 25, -25, -14, 38, 16, -4, -17, -25, -28, 10, -10, -46, 30, 25, 43, 70, 2, 95, 80, 18, 7, 9, 34, 98, 19, -25, 57, 35, -4, -38, +5, -24, 47, 2, 24, -19, 7, -41, -38, -33, 12, 49, 5, 4, -44, 7, -30, -8, 11, -31, 5, -20, -18, 109, 7, -45, 18, 11, -4, -19, -17, -34, 28, 2, -10, 0, -31, 10, 23, -29, 3, 23, -13, 63, 16, 0, -15, 63, -6, 2, -27, 123, 17, 114, 8, -51, 35, 54, 20, 4, -37, -16, -28, 67, -45, 8, -36, -3, 28, -38, -64, 83, -31, -23, -21, -38, 14, -5, -37, 7, 12, +-8, -17, -11, -1, -65, 8, -26, -14, -8, 16, -17, -21, 20, 11, -8, 40, 51, 61, -13, -52, -39, 1, -15, -43, -3, -22, 4, 34, -34, 32, 9, 12, -12, 1, -2, 3, -11, -6, 55, -26, -35, -8, 30, 9, -39, -42, -17, -32, -4, 26, -19, -29, 29, 1, -17, -23, -10, 30, -34, 0, -11, 0, 2, 36, 51, 72, -10, -14, 37, -6, -4, 4, -53, -13, 14, -6, 7, -2, -40, -24, 2, +-15, -2, 13, -34, -32, -23, -28, 19, -27, 50, -17, 11, -24, -1, 78, -36, -14, -43, 4, 16, -49, 22, 16, -47, -16, 50, 12, 12, -21, -13, 124, 13, 53, 49, 30, -77, 54, -12, -15, 4, -30, -3, 11, -31, 1, 28, 62, -12, -10, 20, 2, -8, -15, -32, 37, -13, 5, 12, -26, 17, -2, -11, -11, -4, 43, -40, 4, -23, -26, -32, 31, 2, -40, -11, -8, -10, 23, -20, 45, -62, 28, +-9, -15, 47, -5, -34, 41, -34, -54, -37, 80, 15, -42, 68, -4, 35, -24, 127, -1, -34, 58, 68, -2, -48, 83, 3, -11, -21, 18, -27, 16, 27, -57, 1, -26, -29, -38, 25, 10, 57, -16, 45, -33, 19, 5, -31, 4, -33, -42, -21, 13, 85, -18, 0, -37, -27, -7, 26, 0, 16, 7, -3, 24, -6, -12, -36, -14, 9, 13, -11, 36, -24, 0, -23, -30, -13, -22, 18, -20, -2, -43, -40, +67, -3, -5, 12, 0, 18, -31, -13, 11, 3, -1, -40, 22, -16, -29, -31, 17, 26, 26, -24, 4, -15, 102, 34, -62, -2, 80, -34, -25, 12, 59, -2, 2, 76, 0, -3, 94, 14, 13, -39, 17, 39, 89, 13, -13, 39, 70, 24, -36, 28, 82, -25, -39, 14, 6, 5, -14, -1, -20, -48, -1, 59, -3, -5, -27, -16, 6, -12, 10, -12, -20, 20, -22, 29, -27, 15, 24, 31, 5, -14, -12, +-6, 8, 2, -13, -5, -17, 20, -11, -19, -8, -47, 19, 17, 19, -4, -10, 19, -15, 24, -8, 35, 15, -45, 71, 40, 75, -16, -37, 25, 38, 22, -50, -30, 77, -4, -47, -13, -3, -5, 7, 8, -15, -40, -13, 26, 34, 11, -38, -23, -1, -45, 49, -21, 37, -40, 22, -14, -4, -22, 28, 37, 4, -2, 11, -4, 34, -6, 17, 44, 23, 73, 3, 1, 5, 7, 11, -23, 18, -24, -24, 80, +28, 38, 5, -6, 34, -20, -42, 54, 16, -89, 45, -51, -22, -24, -32, -13, 25, -27, -8, -13, -6, 115, 11, 48, 17, -24, -21, 15, 81, 9, -54, -20, 49, 85, -14, -18, 17, -20, -6, 32, -59, -23, 61, -6, 17, 127, 11, 3, 7, -8, -27, 2, 26, -24, -5, -36, 9, -11, 36, 13, -35, 0, 9, 23, -15, -16, -18, -11, 22, -35, -33, 66, -10, 84, -58, 56, 9, 28, 36, -29, -12, +-11, -70, 38, 11, -5, 10, 6, 80, 48, -50, -23, -27, -51, 14, 80, -34, 30, -35, 92, -33, -16, 2, -37, 44, 22, 51, -27, -47, -5, 17, 33, 29, -20, -61, 12, 11, -3, -28, -36, -43, -16, 30, -26, 59, -10, 8, -8, 8, 22, 75, 6, -10, -7, 35, -24, -56, -33, 44, 25, -17, -26, -10, -15, 33, 9, -23, 35, 45, 3, -22, -6, 6, 0, 37, -28, -1, -24, -42, 49, 5, 28, +-1, -27, 84, -12, -6, -24, -16, 6, 60, 35, -23, -3, 13, 17, -33, 15, -11, 82, -51, -37, -29, 1, 31, -7, -3, -6, 10, -64, -3, 61, -28, -25, -26, -33, 21, 26, -50, 33, 34, -54, 36, 8, 5, 23, 17, -90, 63, 123, -72, -10, 29, -15, -26, 17, -40, -26, -38, -33, 46, -1, 92, -15, -22, -44, 18, 31, 21, -2, -20, 20, -12, 40, -14, -4, 4, 11, 0, 50, 9, -23, -52, +-8, -25, -3, -37, 16, -22, 26, 41, -32, 85, 1, -16, -18, -22, 60, 88, -4, 35, 40, 31, 32, -12, 5, -46, -32, -23, 8, 60, -36, 5, -14, -34, 32, 41, -29, -31, -33, -66, 23, -34, -48, -43, 43, 59, 73, 16, 16, 9, 11, 10, 67, 20, 14, -29, -37, -1, 14, 71, 38, -3, -14, 70, -90, -40, -25, -4, -25, -17, 40, 16, -21, -17, -4, 17, 42, 31, -38, -54, 14, -7, 8, +-21, 26, -14, 29, 23, -23, 10, -2, 39, 10, 5, -12, -1, 17, 7, 11, -15, 6, 26, 55, 32, -12, 13, -33, 3, -3, -22, -26, -19, -23, 14, 38, 12, -41, -34, 21, -29, -1, -49, -42, 124, 36, 109, -9, 10, 115, -24, -35, 5, 20, -26, 19, 11, -51, -19, -32, 18, 0, 91, -30, -36, 53, 6, -42, 6, -15, -23, 28, -8, 27, -33, -41, 0, 57, 57, 11, 1, -10, 2, 2, 79, +56, -28, -31, -62, -4, 1, 8, 10, -37, -3, 0, -4, -14, -25, 49, -8, 5, -8, -32, -14, -9, -11, 13, 8, -2, -2, -9, 2, -29, -8, 4, 1, -16, -8, 3, -4, 7, 15, 127, -24, -8, 15, -16, -13, -16, -14, 1, -6, 10, -8, 19, -14, 24, -24, -10, -17, 35, 39, 19, -25, 21, -28, -28, 31, 27, -25, -14, -72, -16, -3, -8, 8, -7, 2, -14, -28, -3, -20, 29, 2, -19, +4, -20, 11, 11, 2, 4, 15, -6, -1, 18, -43, 24, 0, -16, -17, 1, -20, -3, -2, 8, 2, -36, -54, 46, 12, 14, -12, 4, -61, -2, 37, -82, -20, 27, -22, 42, -39, -17, -35, -4, -4, -4, 20, 127, -14, 27, 9, 26, 66, -6, -10, -40, -12, -28, -56, 49, -9, -27, -22, 42, -13, 30, -14, 10, 12, -25, -9, 15, -34, 14, 2, -47, 7, -15, 31, 21, -5, 32, -31, 28, 4, +71, -46, -23, 12, -7, -39, 48, -47, 7, -11, 4, 9, -30, -16, 16, -32, 25, -4, 65, -1, 10, -36, -33, 28, -67, -10, 9, -13, 14, 19, -87, -3, 42, 48, -11, -29, -20, 40, 7, 24, 22, -29, 26, -9, 118, -60, -19, 10, 31, -16, -11, -64, 3, 17, -28, -7, 33, -43, 62, 1, -7, 22, 43, -4, -31, -47, -22, -27, -39, -31, 50, 60, 4, 19, 12, -29, 55, -24, -28, 21, 21, +-29, -18, 12, -10, 19, -36, 68, -12, -3, -4, -9, -8, -6, -24, 7, 25, -14, 20, -33, -3, 0, 31, -7, 35, 23, -28, -33, -18, 37, 6, 79, 7, -11, 71, 60, 79, -30, 39, -30, 10, 28, 37, -15, 5, -17, 35, 1, 50, -28, -16, -21, -21, 18, -2, -10, 12, 19, -7, -26, -19, 10, 22, 108, -10, 14, -31, -9, -19, 11, -44, -35, -6, -3, -9, -29, 18, -8, -25, -23, 3, 11, +5, 36, 17, -12, 96, -6, -4, 17, -23, -16, 19, -6, 4, 21, 17, 9, 12, 0, 7, 9, -27, -21, -3, 16, -21, -64, -10, -19, -2, -22, 0, 13, -22, -11, -35, -34, -10, 79, 21, -10, 19, 18, 13, -10, -22, -17, -2, 12, 0, 81, 41, 26, -15, -17, 21, -13, 3, -13, -24, -31, -38, -1, -37, 55, 78, -32, -13, -11, 54, 65, -21, 16, 7, 18, 14, 32, -1, 48, 60, -38, 29, +-22, -53, -24, 28, -10, 8, 6, -16, -13, -20, -28, 7, 112, 12, 19, 55, -9, -64, 12, -42, 38, 36, 10, -24, -17, 73, -77, 15, -30, -54, 39, -14, 23, 71, -101, 50, 3, -25, -66, -53, 69, -19, 42, -38, -90, -35, 17, -85, 10, 54, 9, 111, 53, -32, 41, -33, -16, -3, -30, 8, -9, 28, -11, -22, -30, -52, -51, 43, -2, -2, -49, -2, 14, 16, -24, -64, 2, -56, 24, -36, -15, +-4, -15, -29, -24, -21, -23, -13, 28, 52, 9, -26, -36, 50, 24, -62, -5, 118, -3, 90, 5, -47, -16, 37, -44, 15, 14, 58, 6, 35, -25, 57, 14, 92, -8, 48, -13, 106, 73, 15, -32, 15, 4, 8, -32, 41, -12, 47, -29, 44, -30, -7, -41, -16, -52, 39, -16, -16, 35, 33, -23, -4, 25, 66, -23, -24, 32, -31, 43, 37, 29, 2, -6, -8, 32, 24, 36, 102, 7, 107, -44, -6, +6, 3, -51, 15, 66, 2, -36, 43, -54, 4, 14, 4, -52, 28, -13, -53, 24, 7, 27, -15, 6, -3, -48, 6, 45, -32, -1, 11, 31, -26, 99, 53, -44, 10, -20, -24, -12, -35, -42, -26, 14, -7, 41, -2, -35, -41, -12, 7, -6, -47, -6, 93, -20, 43, -24, -9, 0, -16, -1, 53, 5, -13, 5, 2, 2, -28, -11, 34, -4, -14, -29, -9, -8, -10, 1, 0, -13, 11, 20, 11, 9, +-15, 13, -17, 40, -11, 6, 10, -18, 33, -1, 27, -7, -14, -17, -13, -9, -4, 15, 7, 14, 46, 11, -6, -18, -10, -17, 4, 8, -10, 6, -25, -12, -20, 2, -21, -38, 52, -13, -15, -39, 6, -32, -19, -17, 19, 46, 1, 22, 29, 7, 37, 46, -7, -13, 48, -32, -16, -50, -9, 63, 15, 8, -29, -7, 33, -19, -59, -28, -10, -35, 1, 29, 32, 2, 79, 11, 97, -22, -18, -27, 13, +-25, -12, 38, -9, -22, 9, -19, 13, -34, 14, -42, 28, -10, -59, 26, -8, -2, -16, 17, 2, -28, -20, 25, 5, -28, -6, -15, -27, -11, -16, -4, 14, 6, 0, 5, 12, -9, 3, 5, -13, 38, 1, -3, -15, 13, 11, -6, 5, -13, -17, -15, -3, -7, 22, -30, -19, -25, 19, 19, -6, -17, 28, -7, -34, 0, 19, -17, 15, -22, -21, 18, 1, -24, 2, -17, 11, 13, -10, 7, -39, 31, +3, 20, 32, -3, -2, 15, -14, 1, 8, -56, -25, 23, -48, -6, 70, 42, 10, -30, -24, 13, -77, -15, 6, 14, -15, 27, -67, -45, -34, -9, -20, 27, -42, 23, -8, 0, -2, -21, 1, -25, -6, -27, 81, 21, -30, 0, -6, -28, -28, -42, 36, -43, -22, -7, 14, 48, 61, -41, 40, 103, -40, -53, 37, -9, 13, -4, -31, -43, -39, 10, -26, -29, 85, -8, 5, 14, -28, -50, 31, -16, -65, +2, -56, -3, 51, -4, -48, 32, 15, -1, 85, 78, -7, 1, -43, -23, 22, -15, 2, -23, 8, -2, -32, 11, 22, 81, 37, -18, 50, -7, -16, 19, -13, -14, 25, 90, -19, -23, -16, 4, -7, 48, 17, -2, -9, -66, -12, 20, -14, -20, -33, 84, -41, 15, -55, -15, 87, -48, -13, 42, 40, 109, 24, -25, -62, -45, -37, -24, -1, 21, -68, -57, -5, -37, -19, 20, -12, 67, 40, -30, -55, -29, +16, -64, 37, -26, -26, 21, -14, -17, 2, 55, 44, 64, 19, -56, 22, -55, 12, -30, 30, -55, 1, 48, -25, 48, 26, 9, 51, 127, -23, 11, 5, -50, 5, 79, -2, 22, -8, -13, -8, -8, 127, 39, -39, 47, -10, 35, -12, -1, -58, -14, 90, -16, -21, 23, -39, -36, 10, 18, -27, 41, 15, 79, -21, -46, -10, 6, 78, 12, -4, -28, 25, 3, -9, 1, -43, -42, 6, -33, -6, 12, 37, +-26, 36, -5, -21, -59, 51, 2, -17, 26, -31, -20, 10, 30, -2, -25, 2, -9, 32, -47, -20, -24, -30, 8, -9, 5, 24, -39, 8, -37, -12, -41, -8, 101, -25, -31, -11, -2, -9, -28, -34, 9, 13, 7, 19, 54, 13, 12, -1, 44, 21, -17, -23, -47, 11, 9, 60, -9, -56, 15, -14, 44, -17, 13, 15, 9, 62, -17, 10, -5, -23, -32, -17, 1, 54, -22, 11, 66, -56, 38, 25, -10, +8, -3, 12, 5, 5, 28, 4, -18, -1, 3, -15, -6, 4, 2, 43, 2, -7, 18, 6, -18, -14, -12, -2, 0, 7, 2, -48, -18, -9, -28, 31, 4, 30, 2, -15, -14, 53, 78, -3, 15, -18, -22, -9, -17, 8, -36, 8, -14, -28, -10, 7, 26, 1, -23, 14, -16, -13, -9, -1, 18, 8, 27, 12, -5, -20, -16, 17, -62, -4, -24, -31, -9, -4, 26, 45, -32, 1, -10, 24, -7, -10, +-22, -1, 2, 52, 23, 7, 95, -16, -53, -20, 69, 20, -75, 71, -24, 37, -21, 27, -14, -17, 28, 0, 10, 20, -30, -7, -29, 2, -24, 28, 70, -13, -40, -16, -16, 12, -27, -13, -8, 9, -19, -4, 67, -18, 19, 0, 37, 61, -21, -23, 44, 19, -26, -6, 5, 42, 15, -25, 10, 20, -13, -16, -27, 27, 0, 18, 26, -10, 127, 17, 4, 5, 35, 4, 4, 26, 4, 7, 84, 17, -22, +4, 16, 0, -10, -18, -33, -11, -11, -17, -15, 20, 16, -10, -12, -4, 36, -12, -12, 12, -52, 7, 17, 21, 14, -7, 50, 30, 18, -22, -14, 8, -91, 7, -10, -18, 9, -16, 36, -28, -29, -40, 23, -27, -27, -7, 33, -55, 11, -28, -22, 32, 9, 86, -25, -17, 103, -16, -35, -37, 4, 35, 43, -27, -33, 20, 12, 42, 34, -34, -18, 7, -42, 25, -23, -3, -19, 20, 106, 13, -75, 24, +-3, 19, 40, 81, 0, -23, -64, -9, -29, -33, 45, -27, 94, -17, 7, -30, 25, 24, -48, 23, -31, -22, 28, -15, -5, 50, -30, -22, 24, 44, 8, -15, 1, -21, 26, 85, 0, -31, -27, -47, -9, -22, 39, -29, 2, -1, -44, 11, 12, -43, -27, 32, 3, 109, 36, -56, -37, 17, -13, -11, -51, -71, -30, -19, -11, -11, -31, -25, -5, -23, 42, 5, -16, 43, 2, 18, 27, 42, -68, 79, -1, +-25, -52, 16, 33, 59, 32, 23, 8, 106, -20, -9, 11, -38, 31, 71, 50, 3, -47, -55, -43, -83, -11, -34, 9, 37, 21, -1, 55, 4, -2, 6, 14, 31, -30, -28, -28, 23, -26, 22, -2, 69, -10, -32, -43, -4, -6, 39, -4, 24, 0, -40, -36, 31, -19, -21, -33, -55, 23, -40, -29, -6, -8, -1, -16, -30, -24, 11, -23, -19, -34, -13, 74, -38, 15, -54, -22, 8, -48, 6, 56, -20, +-7, -12, -4, -24, -9, 11, 23, 31, 0, -24, -20, 95, 9, -16, 127, -17, 19, 28, -15, -20, 21, -12, -6, -16, -16, 9, 22, 19, 11, -25, 90, -4, 19, -28, -24, -4, -59, -19, 23, 103, -9, -50, 9, -9, -13, -9, 54, -13, -11, 0, -46, 26, -4, -26, -34, -39, -39, -13, -66, -49, -25, 5, 116, -10, 6, -7, -24, -40, -44, 52, 30, 82, 26, -5, 8, -6, 1, 31, -12, -8, 96, +-41, -1, 2, -21, -38, 33, 7, 30, -34, 1, -4, 6, -5, -15, 25, -48, -42, -24, -64, -19, 19, 23, 10, 21, 3, -27, 48, -31, 53, 11, -1, 13, -27, 18, 5, 3, 12, 36, -14, -6, 26, 8, -7, -16, -14, -13, 8, -20, -11, 28, -18, -7, -21, 11, -5, 23, -25, -19, -6, -52, -3, 4, -17, -21, 28, 6, 11, -12, -16, -7, -6, 13, -12, -19, -5, -26, -2, -18, 2, -18, -1, +22, -14, 64, 8, 14, -1, -6, -10, -24, 11, -50, -30, -20, -13, -33, -18, -2, -20, -39, 30, -35, -7, 106, 57, 99, -7, 20, 28, -46, 16, -2, 40, -3, -1, -22, -41, -17, -43, 51, 25, 56, 18, 0, -14, 114, -16, 19, -7, -28, 6, -21, -53, -10, -30, -1, -5, -49, -17, -9, -7, 127, -29, 10, -24, -21, -35, -49, 25, 51, 108, 17, -22, 31, -10, -11, -19, 7, -2, 7, -7, -6, +-3, -22, -10, 6, 71, -1, 14, -16, -8, -5, -4, -15, 9, -14, -14, -32, 7, 7, -4, -27, -7, -15, 8, -17, 13, -2, 24, -31, -31, -18, 5, 12, 30, 5, -10, 10, 17, -65, 38, -10, 1, -17, -8, -12, 3, -20, -19, -20, -5, -12, 1, 21, 4, 12, -14, -37, 21, -35, 70, 21, 58, -8, -46, 5, -42, 0, -23, 65, 127, -5, 45, -39, -28, 6, -54, 81, 36, -79, -43, 0, -42, +-40, 55, -25, -27, 73, 22, 8, -10, -7, -48, 56, 0, 40, -23, 16, -12, 10, -38, 8, 39, -25, -40, 63, -55, 0, 38, 84, 5, -17, -45, -58, -18, -9, 47, -26, 127, -25, 2, -10, 46, -30, 18, 21, -11, -12, 29, 44, 70, -17, -26, -12, 22, -4, -26, 13, 30, 5, 2, -1, -11, -27, 1, 6, -18, 3, -21, -10, 37, 58, 18, 30, 20, -6, -38, -71, -40, -16, -20, -30, -13, 7, +-12, -16, -63, -60, -78, -76, 61, -6, 8, 13, -7, 92, 8, 11, 47, 1, 50, -24, -44, 37, -20, -10, -33, 70, -44, -1, -39, 60, 6, -20, -56, -5, -31, -51, -29, 3, 55, 38, 78, 39, -60, 43, 22, 66, 68, -25, -18, 26, 66, 38, -16, 83, 38, -43, -54, -3, -38, -18, -15, 52, -37, -44, -27, 17, 24, 90, 114, 30, 5, 7, -28, -17, -49, -28, 3, -40, -2, 16, 1, -59, -20, +-7, -29, 7, -31, -4, -4, 13, -28, 10, -49, 5, -34, -39, 0, 32, 89, 0, 5, -28, -84, -14, -52, 6, 3, -22, -34, 34, -4, 27, -38, 5, -34, 1, -30, -17, -17, 27, 17, -11, 49, 54, -7, 21, 1, -13, 15, 10, -43, 48, 10, -31, 32, -40, -32, 4, 5, -15, -24, 7, 7, -17, 16, -7, -20, -19, 21, 22, -1, -43, 79, 20, -21, -38, -11, 44, -12, -32, 33, 3, -26, -23, +27, -1, 47, -24, 29, -43, 15, 2, 23, 26, -5, 39, 2, -2, 24, 16, 3, 69, -14, 2, 20, -3, 12, 92, -5, 21, 19, 7, -23, -8, 0, -5, -24, -40, -25, -12, 17, -6, -14, -11, 1, -41, -11, -11, -36, 21, -4, -3, -4, -19, -20, -18, 4, -10, -8, -16, -5, -25, -9, -12, -3, -18, 37, -3, -7, -40, -7, -28, -8, 14, 39, -10, -23, -14, 7, 3, -9, 0, -23, 40, -21, +-28, 16, 11, 10, 50, -13, -1, -6, 4, -20, -13, 17, 45, -33, -13, -17, -27, 11, -25, 0, -15, 4, -43, 8, -15, 11, -17, 15, 46, 19, 4, -14, 10, 13, 7, 7, -6, 114, -26, 52, 43, -66, -41, -33, -43, -37, 21, -53, -15, -40, 52, 2, -28, -16, 0, 12, 28, -19, 2, -40, 8, -57, -2, 64, -34, -45, -14, -23, 11, 20, 4, -20, 72, 2, -39, 39, -9, -23, -29, 38, -19, +10, -12, -21, -1, 22, -13, 14, 25, 10, 18, -17, 10, -17, 3, -4, 38, -12, -3, 7, -22, -34, -2, -16, 47, 0, -25, -10, 6, 3, -19, 4, 23, 21, -16, 21, -13, 9, -30, -26, -24, 4, 9, -20, -11, -33, -4, -41, 23, -22, -6, 24, -20, -1, 2, 6, -7, 4, -22, 6, -20, 6, -16, -15, 8, 7, -22, -36, -10, 44, -38, 24, 57, 5, -28, 18, 24, -4, 23, 44, -32, -17, +-4, 13, 3, -45, 8, 0, -19, -39, -62, -47, 31, -10, 8, 21, -22, 2, -25, 22, -53, 51, -31, 60, 35, 57, 16, 31, -16, -43, 5, -37, -14, 1, -49, -17, 10, 1, 45, 15, 30, 22, -14, 68, -17, 42, 16, -61, 18, -12, -36, 19, -24, -2, 53, -10, -32, -59, -23, -11, 31, -38, -12, -27, 29, -26, 7, -3, -24, -20, -43, -11, 34, -12, -18, 30, -35, -31, -9, -12, -39, -32, -27, +45, 13, 29, 15, 16, 56, 11, -19, -5, -14, -20, -10, -47, -5, -17, -16, -47, -71, 23, -33, 32, -49, -27, -23, -71, 33, -14, -39, 74, -57, -5, 15, -24, 1, -2, 1, -51, -7, 10, -72, -17, -40, -65, -42, 6, -17, 18, -52, 8, -39, 38, -57, -78, -17, -18, -91, 92, 74, -39, -53, -76, -55, -9, -16, -4, -14, -25, 61, 3, 23, -90, 11, 76, 93, 21, -46, 38, 58, 59, 35, 7, +-10, 21, -29, 4, 33, -12, -24, 53, 13, -4, -24, 42, -1, 84, -18, -6, -19, 31, -20, 33, -3, -27, 10, 59, -15, 36, 81, -12, -22, 33, 0, 38, 14, 63, -23, 18, -4, -33, -8, -11, -44, -60, 90, -1, 7, 35, -70, -33, 3, 14, -54, -4, -4, -48, -31, -60, -19, -48, 16, -24, -33, 34, -5, 6, 72, 15, -29, 54, -10, 5, 16, -19, -5, -11, -23, -5, 1, -35, 28, -25, 40, +-4, 3, 21, 0, -15, -27, -42, -20, 3, -23, -20, -6, -12, 11, -10, 89, 13, -26, -27, -37, -2, 15, -11, -22, -23, 4, -34, 18, 19, 34, 9, 20, -29, -13, -9, -7, -29, 27, 2, 2, -31, -2, -23, 22, -15, 4, -31, -21, -33, -31, 7, 36, -18, -45, -15, -21, -23, -4, -28, -27, -15, -50, -23, 10, 1, 8, 14, -1, -12, -28, -34, 78, -3, 12, 6, -15, 32, 10, -6, 0, 38, +-23, 16, -16, -7, -2, 27, -15, 8, 0, -11, -18, 0, -10, 3, -14, -10, 10, -20, -8, -34, 97, -16, 12, -16, 55, -20, -5, 0, 2, 17, -21, 2, -25, -16, -12, -5, 21, 34, -2, -11, 54, 0, -11, -10, 11, -11, -23, -17, 43, -3, 10, -12, -12, 9, -15, 5, -18, 7, -24, 43, -32, 12, 24, -57, -24, -12, 50, 70, -49, 20, -24, -30, 4, 67, 11, 11, 100, 32, 5, 12, -2, +-37, -37, 109, 29, -21, 13, 42, -19, -48, -21, 39, 50, -3, 73, 22, -34, -33, -19, 14, 19, -19, -14, 12, -18, -30, 23, -6, 73, -28, 48, 4, -9, -1, 4, -25, -1, 0, -10, -24, -31, -33, 12, -21, 23, -21, 6, 65, -11, -31, -12, -7, -3, -7, -5, -21, 7, 58, -21, 6, -16, -16, 1, -4, 0, -8, -23, 25, -12, 6, -9, -34, 21, -15, -8, -20, -5, -6, 45, 47, 12, 2, +-11, -22, 11, 14, -11, -5, 10, -7, 11, 10, 7, -33, -22, 1, -9, 16, 2, -11, 6, -22, -3, 2, -3, 10, 13, 20, 16, 1, 13, 43, -79, 62, 6, 27, -53, 41, -26, 24, -21, 82, -56, 109, -23, -29, 24, 9, -45, 102, 19, -9, 87, 67, -21, 35, -41, 60, 34, 18, -57, 40, -18, -28, -54, -21, -41, -20, 28, -7, 30, 30, 2, -19, 6, 16, 68, 14, 29, -14, 22, 37, -34, +-44, 10, -47, 11, -24, -5, -3, 55, 6, 45, -49, -37, 21, -10, -12, 1, -33, -9, -2, -1, 9, -21, 4, -3, 8, -35, -11, 15, 35, -1, 37, 0, 23, -19, -26, 0, -21, -27, 5, 44, 1, -15, 25, 27, 89, -51, 30, 8, 3, 17, -16, 31, 2, -25, -15, 40, 24, 12, -1, 124, -34, 26, -38, -7, 43, -23, -30, -39, -28, -32, -27, 96, 4, 52, -12, 70, 36, -63, 16, -28, -28, +127, -45, -42, -74, 17, -48, -31, -51, 17, -12, -38, -42, -7, -25, -73, 120, -19, -57, 47, 56, -8, -43, -34, -58, -41, -30, -10, 37, -36, 67, -20, 76, 16, 33, 47, -12, 4, -46, -45, 11, 20, -15, 39, -26, -12, 28, -20, -7, 4, -28, 2, 29, 12, -29, -23, -11, -14, -4, 11, -14, -4, 40, 20, 61, 15, 3, -30, -29, -16, -11, 51, -31, -26, -12, 74, -10, -8, -25, 48, -19, -18, +-4, -42, 0, 71, -11, -31, -4, -60, 81, -26, -22, -33, 14, -23, 8, 31, 42, 32, -25, -14, 69, 24, -14, 0, 26, -9, -14, 41, -34, 10, -26, -6, -7, 19, -18, 18, -21, -14, -30, -26, -13, 10, -2, 15, 10, -11, 40, -22, 127, -10, -15, -16, 9, 8, -4, -32, -16, -5, -44, 33, -23, -7, 12, -19, -15, -38, -9, 37, -11, -27, 26, 10, -27, -26, -50, -41, -2, -5, 8, 27, 8, +29, 21, 0, -36, 8, 21, 0, 38, 19, -49, 9, -51, 42, -3, 15, -6, -14, 5, 24, -3, 35, -12, -25, -2, 0, -7, -6, 24, -28, 16, -8, -40, 8, -7, 35, 9, -13, -5, -7, -15, 25, 15, -7, -17, 9, -26, -11, -52, 22, 7, -15, -5, 50, -19, -8, -4, -14, -2, -28, -16, 17, 27, -4, -31, 28, 59, -3, -7, -6, 7, -25, -9, -22, -19, 11, -21, -1, 28, 31, 9, 10, +-20, 18, 9, 26, 2, -28, 19, -10, -13, -15, 81, -7, 29, -17, 10, -22, -34, -23, 127, 2, 44, 16, -35, 46, -11, 4, -16, 1, 53, -12, 42, 12, -32, -16, 44, -21, -25, 22, -5, -4, -19, 3, 28, -46, 13, 18, 90, -8, -5, -14, 14, -2, -7, -45, 21, 9, 9, 21, -31, 14, 30, -17, -15, -25, 15, 25, -1, -11, -22, -24, -19, -16, 59, 4, -4, 6, 9, 10, 5, 35, -13, +-26, -10, -20, 27, -21, 20, -11, -13, -10, 0, 9, -20, -8, -12, 13, 10, 0, -21, 14, 17, 20, 13, -28, -16, 3, 8, -11, 9, 46, -31, -24, -26, -5, 2, 5, -23, -30, -26, 23, -8, -23, 2, -14, 11, 3, -23, 44, -12, 17, -22, 84, -11, 33, 15, -70, 67, 2, -9, -29, 9, -4, -17, 65, -40, -4, 6, -38, -11, -4, 68, 13, -64, 94, 33, -9, 7, 17, 5, -7, -4, 37, +-21, -3, -57, -10, -7, -29, 6, 4, -44, -53, -17, -4, 34, -18, -21, 3, -77, -3, 5, -37, -14, 68, 7, -14, -30, 28, 14, -14, -37, 3, -35, 11, -7, -6, 2, -27, -36, -16, -8, 96, -30, -18, -7, 45, 31, -34, -20, -31, -47, -15, 33, 26, -34, 109, -21, -11, 48, 1, 37, -15, 48, -13, 27, -10, 2, 127, -31, -8, 15, 43, -51, 24, 13, 61, 17, 17, 87, 63, -11, 17, -39, +64, -37, -43, 15, 6, 36, -56, 2, -21, 17, -18, 16, -92, 67, 30, -20, -35, -14, 92, -17, -15, -79, 94, 23, -50, -2, 15, -26, -28, -62, -33, -26, -22, 43, 22, 13, -15, -37, -36, 0, 94, 60, 73, 24, -6, 16, 3, -67, 101, 52, -46, -6, -27, -12, -8, 11, 0, 32, -5, 41, -8, 5, -25, 3, -8, 26, -30, -2, 57, -1, -3, 18, 4, 6, -17, 5, 1, 18, 28, -13, -33, +-18, -20, -13, -43, -27, -13, -21, 2, 49, 94, -5, 20, 8, -23, 1, 72, -49, 1, -17, -6, -40, -42, -82, -47, -8, 54, 13, 30, -10, -31, -19, -26, -43, 55, -60, 9, -75, -5, 8, 1, -14, -10, 17, 7, 6, -18, 5, 48, 10, -33, -11, -13, 18, 48, -32, 7, 12, -10, -33, -30, 10, -18, 0, -10, 12, 0, -35, -44, -15, -24, 15, -16, 33, 37, 25, -10, 24, -41, 38, 46, -32, +-5, 37, 13, 53, 83, 30, -1, -26, 30, -37, 26, 5, -12, -16, -11, -11, 51, -13, 34, 7, -54, -29, 108, 35, 35, -26, -1, 40, -27, 26, 21, 19, 2, 5, -8, 13, -13, -27, -1, 11, 8, 6, -20, 27, -14, -27, -29, -18, 14, 4, -43, 4, 7, -25, 1, -39, 4, -18, -11, -12, -2, -8, 11, -2, 14, 16, 14, -11, 37, 20, 56, -31, -14, 5, 5, 16, -2, 22, -23, 12, 127, +5, 13, 18, -16, 69, -20, -11, 55, -28, -11, 10, -1, 22, -21, 18, -21, -21, -9, 127, 107, 28, -19, -23, -26, -40, 51, 7, 17, -2, 0, 15, 19, 10, -18, -14, -26, -6, 19, -32, 28, 46, -35, 42, 13, 44, -19, 1, 0, 51, -6, -5, 88, 24, -15, -18, 19, -1, 48, -48, 40, 58, 55, -10, -8, 9, -47, -44, 1, 14, -42, -8, 45, 17, -5, -3, -54, 29, 25, -19, -10, -1, +-15, 54, 66, 11, 31, -27, 25, -20, 13, -10, 5, -18, -15, -39, 2, -18, -5, 12, 8, 18, -44, 15, 2, 22, 1, 52, -11, -1, -2, 1, -33, 8, 18, -28, -17, -8, 5, 10, -43, -9, -15, -13, 3, -5, 1, -18, -1, 6, 42, -13, -9, -47, 15, -25, 27, -31, -17, -24, 28, 5, 31, -15, -5, 20, -17, -3, 44, 21, 19, -50, -28, -2, 4, 46, -10, 27, 22, -23, 127, -39, -2, +3, -28, 26, 5, 6, 3, 54, 25, 41, -57, 43, -16, -21, -40, -15, -65, -2, 5, -16, 10, 57, -6, 40, -3, 0, -18, -18, 12, -31, -59, 0, 8, -37, 0, 102, -58, -1, 37, -40, 90, -39, 2, -38, -44, -26, -5, 8, -35, -26, -25, -12, -23, 22, -8, -1, 41, 32, -1, 19, 2, -17, 44, -20, 5, -34, 39, -19, 40, 47, 54, 59, 20, -31, 14, -18, 32, -15, -42, 13, -3, -11, +-29, 34, -2, -3, 20, -5, -20, -38, -4, -11, 15, -36, 58, -29, 8, 7, 127, 26, -45, 80, 7, 6, -33, -17, 22, 12, 7, -31, -47, -49, 29, 28, -14, -63, -75, -13, -2, 4, -52, -16, -15, 26, 22, -19, 13, 28, 68, -12, 90, -41, 57, 85, 59, 9, -15, 50, 105, -24, -77, 27, 6, 5, -2, -9, -23, -54, 69, 101, -23, 17, -37, -8, 22, -63, 77, 5, 93, 34, 8, -19, 13, +-62, 8, -22, 14, -5, -11, 54, 3, -1, 16, 51, -21, 33, 42, 8, 42, 36, 5, -4, -11, -11, 42, -12, -27, 6, 12, -73, -3, 13, -14, 41, 37, -3, -4, -13, 47, -49, 31, -38, 103, -31, -25, -12, -15, -14, 40, 66, -14, -14, 19, 14, -23, -22, -28, 68, 12, -14, -4, -25, 100, -106, 14, 21, 9, -12, -14, 22, -30, -32, -18, -23, 7, -9, -16, -6, 11, 14, -18, -5, 10, 3, +6, -9, -11, 71, -7, -27, 6, 7, 34, 24, -45, -23, -2, 32, -7, -8, -9, 13, -15, -52, 13, 23, -44, 53, 39, 5, -42, 22, -9, 14, -20, -38, -27, 15, 16, -26, -18, -17, -4, 21, -25, 15, -1, -42, 3, 16, 74, 16, 15, -8, -17, 127, 12, 0, 3, -18, -26, -30, -24, -22, -14, 1, -19, 50, -40, -6, -13, -6, 11, -4, -32, 57, -8, -1, 12, 7, 1, -13, 5, 22, -26, +-15, -17, 29, 106, -10, 11, -2, 5, 4, -12, -19, -7, -15, 3, 2, -9, 35, 33, 24, -6, 29, 24, -7, 7, 41, 6, 31, -3, -17, -27, -10, -30, 12, 8, -12, -27, 10, -21, -1, -10, 33, -40, 30, 57, 84, 31, -26, 6, -11, 7, -32, -5, 31, -13, -9, -20, -23, -30, -31, 17, -20, -25, 86, 13, 21, 11, -5, -25, -20, -15, -38, -44, -57, -29, 2, 5, 7, 42, 38, 17, 27, +-26, -1, -63, -19, 18, -55, -24, -29, -68, -20, 0, 10, -16, -9, -13, 30, 3, -33, 7, 31, -20, 54, 20, 16, -16, 21, -14, 2, -25, -14, -31, -3, -6, -9, -20, -13, -11, -7, -21, 26, -33, -20, -2, 1, 13, -15, -16, -6, -6, 9, -5, 16, -6, -20, 29, 5, -9, -6, 18, 23, 5, 22, -12, -13, -5, 1, 3, 22, -12, 8, 0, -11, -8, -13, -49, 1, 10, -3, 4, -9, -29, +-2, 118, 18, 20, 0, -22, 16, -13, 9, -1, -7, 13, 6, 1, 67, 18, -13, -5, 6, 21, -20, -15, 25, 12, -14, -18, -70, -7, 21, 4, 109, -31, -14, -5, 61, 0, -16, -38, 106, -8, 57, -38, -32, 76, 79, 22, -83, -69, -12, -26, 5, -10, -14, 41, -67, 39, -4, -11, 34, 30, -13, -25, -29, 35, -24, 28, 15, -22, -10, -32, -10, -15, 50, 78, -6, -15, 29, -24, 4, 24, -52, +1, -12, -4, -6, -21, 3, 29, -4, -29, -15, 41, -25, -22, 6, -21, -24, -17, -3, -4, -13, 12, -25, 7, -45, 14, -20, -21, -73, -25, -6, 5, -4, -7, 34, 48, 35, -7, -18, 34, -22, -60, 4, -13, 17, 17, 3, -54, 21, -76, -24, 30, 13, -5, -9, -1, -30, 13, -50, 51, -32, 40, -28, 41, -24, 67, 12, 14, -9, 5, 35, -7, -50, -10, 6, -13, -22, 37, 77, 22, -5, -43, +-40, -21, -15, 91, 48, -24, 9, -13, 13, 50, -8, 7, 119, 118, -39, -18, 93, 17, 27, 20, 46, 119, -42, 16, -17, -3, -25, 23, -8, 34, -18, -12, 6, 37, -21, 32, -20, -28, -12, -9, 36, -25, 1, -46, -3, -24, -3, 38, 5, -2, 36, -28, 67, -9, 8, -8, 4, -31, 9, -30, -16, -33, -16, 18, 3, -15, -8, 6, 2, -13, 8, 8, -15, 51, -4, -25, -25, 12, -14, 18, 16, +-18, -26, -3, -10, -12, 2, 2, 4, -40, 47, 43, -64, 30, -7, -7, -19, -9, 36, 24, -18, -19, 13, -29, -50, -20, -2, 6, -74, 32, -34, 28, -23, 29, 1, -11, -11, 13, 13, 3, 34, 8, 23, -33, 24, 22, -27, -4, -24, -8, -22, 9, 12, -10, 8, -12, 13, 29, 21, 3, -42, 3, -12, -6, -49, 29, -29, -12, -35, -11, 40, -53, 66, -20, 2, -32, 31, -36, -35, 96, 2, -66, +-55, -14, -53, 4, 41, 29, -1, 47, 16, -15, -17, -10, 32, -29, 9, 27, 21, 14, -14, -10, -9, -39, -8, 21, -16, 66, -11, -7, 5, -51, -12, -72, 45, 8, 55, -59, 2, -35, -69, -35, -6, 8, -60, -20, -9, 30, -10, 14, -45, -22, 18, -100, 57, 37, 17, 11, -15, 20, 4, -11, -38, -46, 13, -1, -29, -31, 68, 5, -8, -20, -3, 3, -30, -17, -77, 82, -56, 3, 102, 2, -64, +-16, 5, -53, -4, -1, -41, 15, 39, 11, 16, -8, -16, 27, -12, -15, -14, 39, -35, -12, 13, 26, -5, -40, 18, 11, 26, 22, -37, -33, -9, 6, -7, 29, 29, 3, -15, 47, 2, -22, 12, -1, -11, -1, -58, -19, 7, -4, -22, -15, 5, 16, -48, 10, -42, 15, -45, -14, -11, -17, 6, 10, 36, -41, -22, -2, -13, 8, 21, -30, -16, 28, -33, 62, 16, -6, -21, -1, 6, -14, -10, -23, +-28, 21, -28, 2, -20, -25, -5, 13, -38, -2, 18, 64, -15, 9, -52, 34, -2, -25, 1, 45, 4, 14, -5, 29, -6, 44, 9, -2, 14, 65, -34, 10, -14, -21, -3, 7, -29, -44, -28, -32, -12, 12, -12, 20, -19, -24, -23, 27, 4, -33, 3, 24, 27, -2, 30, 17, 2, -31, -12, -24, -38, 9, -11, 15, -38, -24, 22, -39, 10, 13, 35, -9, -10, -14, -12, 31, -47, 58, -9, -15, -25, +-20, -3, 4, -41, -26, 23, -70, -50, 13, -28, -20, -40, -39, -50, -7, -2, 97, 15, -9, -2, -2, 3, 5, -17, -7, 5, 28, 6, -14, -32, 42, 39, -45, -36, -45, -18, 0, 1, 21, 6, 27, -45, 15, 30, -31, -20, -28, 33, 6, 12, 26, 3, -11, 66, 3, 45, 42, 6, -59, 15, -27, -44, 42, -38, 127, 11, 24, 2, -58, 25, 75, -32, 34, 21, 41, -12, -24, 22, -30, 9, -14, +67, 53, -36, -23, 76, -15, 88, -37, 87, 2, 4, -18, -14, -23, -28, -14, -13, 26, -6, 5, 41, -11, 3, -9, 37, -24, -17, -64, -5, -8, -38, 110, 41, 3, -2, 34, -52, -19, -8, -9, -38, -23, -47, -8, -48, -12, -14, 12, 19, -2, 56, -42, -28, 21, 11, -8, -28, -35, -25, 127, -18, -13, 43, -8, -7, -37, -6, 12, 51, -14, -18, 17, 2, -31, -17, 63, -32, -26, 15, -3, -24, +15, -12, 4, 21, 17, -35, 0, 18, 24, -26, -24, 39, -30, -18, -29, 31, -7, 44, 15, -10, 30, 53, 20, 52, 22, -44, 19, -10, -2, 36, 18, 114, 43, -29, -14, -38, -7, -29, -68, -47, -5, -30, -11, -51, -24, 39, 55, 6, -2, 70, 52, 14, -14, -21, -33, -45, 83, 34, 16, 93, -68, -3, -8, 16, -7, -20, -10, -19, 21, -37, 18, 27, -15, -22, -35, -1, -29, -13, 14, 47, 26, +-20, -3, -25, -21, 36, -12, -30, 12, -19, -4, 20, -17, 3, 4, -31, -21, -64, 43, 27, 16, -23, -43, 46, -39, -22, -8, -33, -27, -31, 20, 71, -55, 36, -17, -33, -7, 34, -34, 17, 31, -20, -23, 17, -8, 22, -13, 35, 96, -23, -13, 1, -12, -36, 1, 20, 7, 63, 98, 15, 43, 1, -18, 23, 58, -6, -9, -24, -55, -12, -35, 40, 38, 20, -21, 32, 58, -36, -41, 13, 126, 38, +-27, -39, -10, -37, 28, -3, -18, 21, 8, 13, -43, -27, -26, 37, 58, 53, -43, -19, -19, 16, -35, 30, 63, 77, -27, 28, 18, -18, 27, -17, -9, 31, -9, -28, 40, -38, -60, 31, -30, -13, 54, 14, -38, 20, -3, -4, 5, -5, -44, 0, 26, -15, 26, 24, 21, -16, -16, -15, -53, 26, -1, 32, 45, -23, 0, -30, -31, -34, 33, -9, 28, -19, -48, 10, -46, -18, 4, -12, -42, 21, 24, +-3, 75, 19, -11, -2, 127, 24, -28, -1, 4, -4, 113, 13, -3, -7, -10, 18, -16, 24, 53, -1, 61, 13, 41, -2, 8, 16, -28, 23, 14, -28, -1, -25, -11, -6, -56, 75, -5, -14, -18, -24, -49, -4, -20, -39, -52, 57, 10, -56, 6, 12, -10, 7, -56, -6, -48, -25, -50, -17, 9, -23, 17, -48, 27, 19, -7, 0, -5, -1, 16, 39, 51, 1, -30, 6, -41, -12, -4, -23, -37, -58, +-23, 15, 49, 27, 16, -5, -71, 34, -9, 53, -21, -31, -14, -22, -2, -19, 35, 45, -19, 35, 0, 39, 75, 59, -60, 3, -1, -5, -21, 13, 12, 12, -41, -29, 43, -21, -55, -6, -8, -9, 70, 22, 27, -2, 25, 22, 7, -4, 48, -82, 43, -27, 37, 46, -14, 84, 13, 0, -30, 2, 41, -41, -39, -14, -9, -20, 55, 41, 28, 9, -9, -31, -1, 46, 36, 42, -17, -20, 1, 55, -10, +37, -2, -42, -34, 14, 34, -6, -66, -27, -31, -56, 66, -27, -11, -17, 2, -29, 0, -27, -21, 52, 20, -53, -32, 36, -14, 29, 31, -38, 29, 14, -27, -18, 45, 44, 20, 12, 15, -10, -18, 4, -79, 4, -6, 57, 78, -27, -38, 7, 0, 8, 19, -67, 34, 14, 36, 18, 92, -76, -8, 19, -26, 19, 5, 61, 43, 61, 21, 84, -74, 53, -66, -26, 20, -74, 55, -39, 82, -17, 8, 55, +-2, -21, -10, 14, 20, -42, -6, 7, -34, 38, -13, -25, -24, 11, 3, 70, 12, 3, -8, 62, -8, -33, 10, 0, -13, -11, 6, 26, 29, -22, 4, 28, -26, -21, -33, -12, -1, 62, 16, -16, 16, 31, -16, -10, 35, -6, 10, -16, 1, -9, -18, 6, -2, -30, -14, -19, -7, 16, 3, -28, -46, -51, 10, -7, -4, -20, 5, 3, -6, 61, -30, -2, -36, -13, -25, -6, -48, -9, -25, -22, 2, +-48, 47, -35, -3, 18, 3, 56, -20, 12, -6, 12, -13, 30, -15, -1, 20, -10, 37, -33, 8, 31, -39, -33, 5, -34, -40, -2, 23, 16, -2, 3, 6, -21, -6, -11, -44, 54, 1, 18, -6, -9, -32, 76, -58, -5, 62, -37, 11, 14, 35, -17, -15, -7, 9, -18, 0, 17, -40, -44, 39, 22, -7, 37, -29, -7, -43, -30, -16, 31, 10, -11, -47, 68, 38, -1, 21, 65, -28, 0, -43, -26, +32, -28, -3, -75, -50, 31, 65, 2, -8, -32, 69, -8, -46, 7, 33, -1, -9, -47, -18, 10, -5, -8, -21, -55, -37, 9, -34, 0, 15, -13, -17, 34, -29, 21, 0, -1, 2, 3, -50, 82, -25, -1, 12, -12, -22, -36, 7, 10, -14, -11, -6, -32, -61, 13, -20, -14, -32, -3, -1, 14, -9, -17, -33, 55, -30, 39, -29, 19, 16, 17, 0, -12, -15, 25, 3, -11, -25, -23, 55, -45, -20, +-14, -47, -8, 5, 64, -2, -19, 15, -23, 13, 14, -15, -15, -11, -9, -30, -18, 32, 78, -6, 0, -22, -30, 15, 19, -30, 4, 20, -39, -17, 24, 7, -17, -36, -9, 15, -6, 16, 23, 47, 9, 12, 8, 49, 4, 27, -29, -24, 11, -33, 31, -38, 37, -7, -17, -12, 22, -11, 31, -9, -49, -13, -14, 24, -42, -7, 9, -5, -30, -39, -8, 37, 32, 45, -12, 16, -38, -14, 34, 14, 18, +15, -27, -5, -10, 1, -13, -3, -18, -33, -15, -17, 53, -7, -11, -27, -20, 18, 30, 5, -9, 8, 9, 64, -7, 1, 35, -17, -35, 7, -3, -49, 45, -24, -63, -34, -2, 13, -11, -4, 1, 61, 45, -27, 20, 60, 51, 17, 7, 24, 52, -53, 55, -53, 14, -26, 42, -9, 108, -40, -37, 16, -2, -27, -55, 58, -44, -22, 43, 34, -4, 36, 38, -8, 45, -9, -7, 48, -8, 36, 23, 46, +2, 25, -18, 0, -18, 10, 43, -33, -19, 11, 38, -22, 10, 6, 17, -28, -49, 7, -53, 13, 69, 25, -6, 23, 24, -8, 61, 0, 33, 47, -13, -7, -8, 0, 49, -40, -50, 21, -13, -13, -4, 59, 16, -8, -44, 14, -19, -16, 7, 40, -33, -16, -16, 41, -10, 34, -9, 65, -36, 34, -18, 57, -28, 35, -35, -22, -62, 46, -2, -24, 9, 20, 19, 14, -13, -24, 52, 48, 7, -63, 15, +1, 38, -59, -85, 3, 0, -26, -41, 27, 10, -43, 5, 24, -68, -46, 43, -47, 14, -4, -36, 15, -27, -26, 7, 18, -49, -8, 15, -17, -15, 6, -33, -2, 9, -43, -20, 0, -21, 3, -20, 109, -8, -3, -8, 86, -3, 28, -16, -23, 33, -5, 10, -22, 4, 23, -2, -3, 39, -37, -48, 1, -16, 24, -12, -24, 5, -3, -22, 18, -14, -8, 19, -12, 38, 16, -3, -36, -11, 10, -21, -32, +-16, 18, -24, -33, 2, -14, 43, -10, -46, -2, -14, -4, 45, 4, -29, 10, 8, 20, 15, -46, 51, -45, -7, -2, -1, -18, -19, 90, 16, -40, 37, -13, 13, -35, 7, -12, 48, -28, 23, -17, -47, 17, -31, 24, 5, -21, 18, -15, 15, 39, 11, -8, -19, -9, -29, 54, -28, 27, -6, 11, -16, 8, 27, 6, -18, -14, -19, 48, 24, -18, -7, -16, 32, -41, 18, -35, 4, -12, 11, -43, -7, +4, -34, -36, -17, -23, -8, 1, 53, 26, 3, -5, -28, -62, -29, -4, -28, -27, 6, -31, 16, -24, 14, -7, -2, -4, -36, 25, -33, 22, 99, -18, 62, -18, 5, -52, -4, -17, -8, 103, 76, 48, 6, -37, 48, -6, -14, -22, -64, 48, 5, 0, -33, 9, 34, -48, -13, -84, -10, -52, -24, 27, -11, 8, -13, 72, 4, 0, 29, -36, -50, 47, -11, -19, 112, -4, 1, 23, -27, -9, 29, -11, +-7, -28, 4, -19, -18, -17, -14, -14, 11, 3, -9, 17, -39, -15, 7, -6, -5, -3, 10, 11, -23, -45, 21, -28, 34, -18, -34, -16, 29, -29, 1, 17, -25, 20, -33, -21, -15, 33, 11, -20, -28, -37, -14, 42, -22, 66, -13, 3, 9, -21, -39, -19, -8, -53, 22, 36, 7, -19, -34, 21, -29, -3, -8, -14, -9, -32, 2, 27, 69, -37, 6, 5, -17, 73, -7, 13, 34, 5, 28, 65, -27, +4, 5, 35, -36, 85, -56, 34, -7, -16, -10, 9, -27, -3, -15, 2, -33, -27, -6, 15, 35, -26, -1, -8, -2, 10, -43, 82, 4, -19, 38, 19, -39, -10, -10, -36, 25, -71, 4, 33, -13, 19, -19, 51, 21, 24, -3, -67, -50, 99, -39, 48, 26, 60, -30, -53, 5, 2, 33, -26, 78, 36, -44, -25, -16, 12, -36, -11, 16, 121, 20, -30, -4, 3, -19, 38, -22, -84, -39, -68, 17, -34, +39, 8, 56, 26, 10, -40, -83, -18, -7, -18, -9, -14, -15, 8, -30, 0, -50, -49, -30, 32, 9, -14, -14, 9, -43, -4, 120, 57, -18, -4, 3, 32, -27, 8, 8, -17, 26, -30, 9, 18, -25, 3, -12, 30, -52, -17, -32, 55, -16, -23, 42, 29, -12, 16, -34, 3, -5, -8, 11, 23, 23, -15, -27, 6, 2, -37, -44, -34, 2, -45, 92, 1, -25, 7, -10, -17, -60, 57, -11, -17, 48, +-11, 69, 3, -50, -67, -16, -43, -32, -29, -38, 95, -30, -6, -16, 3, -45, -11, -13, -37, -83, 40, 14, 21, 26, -8, -14, -56, -41, -15, 25, 21, -19, 13, -5, -23, 16, 21, -2, -21, -28, -7, 97, -34, -11, 37, 16, 24, -24, 21, -24, 0, -18, -17, 15, 16, -20, 86, -9, -6, 10, -16, -27, -6, -8, 14, 17, 65, 18, -39, -9, -21, 7, 7, -23, 16, -29, -7, -14, 17, 2, -20, +7, -14, 9, -2, 0, 6, -16, 4, 31, -36, 9, 19, -9, 22, -10, -28, 12, -16, 7, -25, -4, 19, -33, -19, -24, 22, 34, -21, 38, 18, -39, -10, 51, -23, 20, -48, -54, -57, -23, -3, -11, -33, -22, -2, 32, 45, 127, -24, -19, 28, 24, 2, -28, 42, -14, 30, 38, 90, 20, 11, -35, -30, -27, -5, -18, 26, 1, 4, 32, 6, 57, -23, 29, -27, 32, 37, -7, -10, -5, 10, 9, +5, 30, -24, 12, -26, 127, -14, -3, 47, 11, -19, 39, -2, 42, -32, 37, -48, 58, -29, -22, 6, 50, -39, -27, -28, 8, 106, -52, -48, -59, -2, 74, 19, 61, 9, -6, 36, -44, 50, -13, -1, -33, -13, -17, -12, 7, 56, 9, -12, 127, -40, 73, -36, -59, 76, 89, 7, 38, 66, 45, 18, 18, -49, 85, -16, -57, 20, 103, 37, -23, 42, 59, -42, -8, -28, 41, -7, -35, 10, 66, -71, +-40, 2, -22, 8, -21, 10, 13, -10, 1, 75, 12, 127, 20, -11, -44, -10, -65, -7, -19, -23, -10, -27, -31, -92, -13, 36, 31, 30, 38, 6, -11, -27, 38, -3, 33, 2, 21, 38, 94, 0, -17, -24, -30, -4, -60, -24, -11, -38, -4, 67, -28, -30, 23, -23, 16, -23, -3, 36, 1, 5, 90, -36, -3, 1, -40, -11, 34, 17, -16, 20, 59, 66, 14, -30, -31, -31, -22, -82, 17, -23, -9, +33, 56, 43, -30, 1, 2, 2, 5, -29, -10, 22, -24, 9, -31, -2, -2, -4, 42, -26, -28, -33, 1, 7, -25, 86, -9, -4, -37, -28, 5, -3, -23, 11, -6, 28, 127, -42, 22, 10, -3, -34, 11, 30, -12, -27, -20, -14, -11, -9, 57, 8, -29, 21, -15, -8, 37, -10, 27, 127, -31, 29, 39, 53, -14, 60, 57, 2, -21, 1, -63, -8, -15, -3, 9, 95, -54, -17, -49, 9, -11, 14, +97, -22, -9, 50, -34, -38, 102, 78, -35, -34, 75, 104, -34, -5, -4, -11, -32, -42, 16, 51, -61, -16, -10, -40, -78, 15, -49, 38, 67, 6, 0, -8, 45, -15, 3, -46, -8, 24, -47, -18, 45, -22, -18, -1, -32, -43, 2, -21, 40, 34, 14, -54, -7, -39, 47, 77, -9, 4, -33, -48, 7, -4, -5, 20, 73, -24, -27, -10, 35, -7, 15, 17, 0, 33, 21, -13, 63, 58, -4, 39, 12, +-9, -28, -7, 44, -54, -4, 36, -18, -16, 7, -50, 65, -51, -54, 10, 35, 42, 85, -25, 22, 19, 62, -8, -8, -17, 30, 1, -44, 42, 21, -4, -8, -18, 2, 98, -27, 19, -25, -69, 18, -36, -6, -28, -3, -46, 59, -30, 82, -40, 23, 14, -42, 13, 3, -63, -53, 18, 26, 8, 45, 0, -23, 88, 14, -58, -1, -31, -17, -14, 27, 101, -49, -17, -31, 37, 6, 4, 15, 10, 4, -11, +31, -24, 16, -19, 29, -4, 64, -6, 25, -32, 1, -5, -28, 8, -25, 21, 33, 22, -27, 58, 22, 15, 9, -29, 127, 37, 22, -15, 4, 3, -5, 73, 5, 35, -10, 0, 5, 3, 4, -22, -24, 33, 6, 30, -26, -24, 5, 12, -23, 21, 63, -43, -17, -4, 32, -25, -2, -11, -9, -14, -25, 23, 5, 52, -11, -13, -21, -19, -40, -27, -20, 30, -27, -43, 45, -33, 0, -2, 1, -6, 23, +-28, -6, 72, -9, -15, 2, 17, 9, -13, -16, -25, -2, 0, 19, 55, -34, 6, -15, -14, -12, -16, 44, 2, 5, -9, -12, 35, -34, -19, 28, 7, -6, 30, -35, 5, -24, 10, -4, -44, 16, 2, -50, -32, 34, -8, 5, 4, -41, 9, 96, -1, -39, 0, -25, -21, -11, 90, -16, 21, 31, -11, -3, 52, -3, -26, -24, 2, -57, 3, 37, -33, -35, 53, 32, -21, -17, -7, 11, -1, 115, -27, +-6, -52, 16, 73, 46, 26, 104, -8, 9, 3, 33, -22, -55, 10, 114, 3, 63, -54, -5, 4, 7, -13, -4, 9, -36, 17, 2, 33, -52, 52, 110, 2, 52, -58, 23, -22, 10, 63, -53, -76, 24, -14, 110, -33, -28, 54, 19, -22, -28, -8, 61, 5, 2, -4, 30, 22, -18, 11, -4, 40, -12, 14, 15, 11, -13, -37, -3, -18, -14, 26, 15, -7, -33, -44, -22, 33, 18, 24, 7, -6, -5, +9, 25, -28, 6, -27, 11, -14, -19, 1, 80, -20, -2, 51, 24, -11, -12, -9, 7, -13, 14, 31, -34, 25, -28, -9, -39, 3, 13, -37, 22, 3, -28, 2, 19, -9, 24, -11, -5, -36, 29, -5, -21, -7, -4, -33, 100, -14, -28, -24, -16, 39, 16, -2, 51, 25, -36, 8, 40, -11, -46, 9, 38, 59, 15, -10, -20, -31, -11, -27, -2, -8, -6, 8, -12, -12, -26, -11, 19, -21, -32, -17, +-37, 34, 16, -34, 28, -13, 26, 7, 10, 39, -22, -26, -18, -44, 49, 15, 12, -12, 12, 53, 46, -23, 68, -16, -29, -9, -41, 12, 127, -30, -14, -14, 6, -70, 84, 38, -8, -30, -20, -4, 79, -10, -32, 2, -4, 51, -49, -20, -68, 19, -25, 36, -10, 39, 9, -47, -8, 68, -49, 10, 15, -22, 127, -13, -26, -13, 17, -68, -24, -51, -28, 65, 8, -5, 26, -2, -40, -70, 16, 21, 77, +-14, 0, 29, 61, 27, 93, -45, -43, 7, 38, -3, 4, -14, -5, -9, -21, -36, 19, -45, 43, -21, 1, -3, 66, -4, 14, 43, -1, -31, -7, -13, 13, 18, 5, 97, -32, -37, 43, -2, 47, 37, 17, 5, 0, -4, -43, -14, -15, -44, 37, 29, 23, -2, -28, 9, 4, -7, -9, -15, 2, -47, -36, 20, 28, -35, 38, 14, -19, 20, -52, -11, 44, -29, -16, 80, 48, -7, -20, -23, 0, -67, +-38, -1, 56, 60, -61, 5, -10, 54, 9, 65, 27, 25, 43, -15, -50, 40, -44, -39, 32, -18, 19, -15, -1, 23, 10, 17, -1, -9, 43, -17, -18, 5, 4, -24, 16, 67, -11, -47, -43, -18, 2, -19, -29, 19, -31, -9, -6, -16, -29, -19, -22, 33, -10, -7, -48, -14, -17, 29, -7, 0, 16, 1, -23, -25, 10, -20, -21, -1, 7, -11, 53, -14, -9, -8, 7, -13, -5, -9, -13, -39, -22, +8, 12, -18, 54, -39, 34, -10, 36, -8, -59, -44, -20, 20, -36, -10, -10, 20, -28, 17, -27, 9, 6, -7, 33, -43, 25, 2, -2, 37, -10, 87, -42, 15, -34, 1, -6, -21, -10, -3, 7, -5, 12, -2, -5, -3, -25, -8, 16, 8, -18, -20, -10, 29, 27, -19, 12, 14, -23, 17, 13, -14, 19, -7, -33, 81, -2, -18, 11, 8, 79, -43, -5, -14, -24, 32, -30, 4, 2, 15, 36, -2, +-39, -20, 20, -16, -36, -5, 89, -17, -18, -1, 24, -6, -36, -30, -8, -53, 32, 18, -37, 68, 80, 7, -21, 72, -53, -31, -24, -54, -40, -30, -3, -21, -13, 3, 11, -18, 70, -95, 44, 63, 29, 13, 9, 6, 7, -16, -33, -8, -35, -31, 53, -27, -5, 31, 18, 85, -6, 59, -76, -19, -21, 31, -5, -41, -29, 17, -32, 123, -39, -43, -38, 76, -13, -17, 60, 26, 114, -53, -17, 1, -24, +5, -10, 1, -32, 33, 6, -11, -21, 45, 25, 5, -16, -21, 0, 30, -2, -38, 11, -8, -58, -24, -23, 14, 41, 35, -10, 8, -21, 121, -34, -35, 4, -3, 53, -26, 40, -17, 36, -29, 25, -47, 57, 9, 16, -22, -1, 7, -15, 12, 6, 5, -27, -6, 44, -12, -21, 16, -54, -10, -9, -13, 1, -18, -30, -49, -3, -18, 22, 19, 32, 16, -5, -5, -16, -11, 12, -14, 88, 27, 77, -56, +-34, -14, -28, -12, -1, -9, -1, 11, 41, -27, -12, -30, -4, 25, 34, -33, 54, -39, -2, 28, -38, 22, -8, 31, -25, -13, -47, 37, 14, 36, 5, 51, -7, 9, 48, 18, -22, 78, -28, -24, 23, 22, 4, -6, 45, 35, -21, -103, 19, 0, -28, 67, 90, 11, 6, -68, 79, -11, -46, 0, -71, -29, 5, -1, 2, 39, -49, 27, -44, 40, -29, -32, 9, -28, 9, 3, -11, 16, 19, -6, 27, +-18, -40, 41, -47, -36, -24, 70, 30, -44, -55, -3, -17, 25, -36, 99, -31, -8, 9, -29, -18, 2, -37, 54, 46, 63, -11, 12, -17, 34, -1, -34, -17, -33, 11, 6, 63, 4, -1, -3, -30, 1, 31, -3, -40, 17, -46, -3, -15, 45, 25, -17, 23, -34, 3, 45, -64, -11, 18, -36, 23, -4, -31, -48, -3, 18, 23, -9, 127, 89, -92, 27, 10, -41, 4, -29, 1, -32, -53, -10, -13, 51, +-83, -24, -43, -17, 37, 4, 5, -4, 124, -14, 46, 34, 10, 59, 22, -19, -28, -6, 20, -7, -11, 13, -67, 24, -46, 8, 3, -7, 22, -4, -60, -6, 8, 47, -85, -27, -67, -24, -42, 50, 127, -8, -40, 3, -11, -3, -23, -1, -31, -39, 59, 20, 14, 24, -12, -29, 5, -34, 24, -47, -17, -13, 33, -10, -15, 14, 77, -13, -14, -5, 6, -17, -43, 20, -1, 25, -37, 11, 38, -14, -4, +-9, 22, 17, 59, -7, -15, 40, -19, -3, -4, -9, -11, -21, 20, -16, -7, 6, -15, 5, 22, -31, -36, 11, -8, 24, -16, 52, 31, -25, 8, -5, -7, 5, 2, 104, -74, -48, 1, -41, -48, -37, -7, 10, -14, -3, 70, 49, 68, 56, -30, 27, -15, -64, -24, 40, -54, -1, -9, -38, 10, 45, 13, 4, 30, 13, 5, -18, -28, -20, 37, 11, -16, -30, -15, 6, -14, -14, -12, 40, 5, -27, +2, -15, 27, 7, 13, 13, 46, -1, 52, -54, -34, -35, 15, -28, 127, 13, -18, 7, 77, -17, 12, 8, -21, -22, 8, 13, 52, -40, -17, 3, -60, 19, -20, -5, 17, 4, 12, -9, -14, 19, 16, 6, -10, -49, -24, 15, -16, -19, -13, 11, 5, -3, -45, -8, -7, 10, -2, -6, 21, -11, -34, 10, 93, 102, -32, -67, 16, -51, -25, -42, -3, -44, 52, -11, 26, -14, 25, -5, 35, -32, -4, +-6, 12, -23, -23, -4, 93, -10, 33, 21, 12, -15, 21, 98, -14, 6, -26, 25, 53, -5, -19, -52, 32, -16, -16, -13, -18, -69, 127, -18, -31, -2, 0, 73, 15, 13, -11, -17, 26, -1, -6, -33, -22, 14, 1, -2, 56, 11, -32, -8, -25, 36, -28, 23, -6, 36, -17, -1, 6, -12, -3, -62, -3, 15, -9, 3, 71, -30, -21, 52, 12, -30, 8, 45, -11, 63, 16, 27, -26, -32, 18, 1, +38, -10, -39, -42, -34, 75, 9, -27, 18, 17, 23, -18, 86, 17, 110, 70, 37, -20, -32, -56, -12, -2, -47, -29, -67, 29, 7, 20, -10, 32, -60, -17, 13, 15, -21, -23, 17, -31, 2, -24, -33, 11, -25, 29, 19, 40, 6, -40, 12, 11, 45, -51, 23, -40, -11, 17, 9, -11, -12, -10, -15, 13, -9, -14, 53, 14, -4, -29, 1, -10, -40, 30, -8, -54, -76, -39, -23, 16, 104, -5, 24, +17, -59, -28, -14, -41, 52, 64, 76, 10, 57, -73, -61, 44, 39, -40, -14, -13, 13, -55, 43, -3, 16, 45, -33, 30, 17, 71, 37, 64, 1, -75, -33, -3, 76, -14, -58, -17, -51, -24, -19, 59, -1, 33, -14, -35, -40, -55, 17, 40, -18, -15, -70, 5, 73, 44, -10, -8, 13, -3, -31, 26, 20, -11, -7, -29, 2, -16, -16, -10, 51, -21, -46, -34, -12, 38, 37, -42, 4, 33, 10, -11, +12, 31, 8, 1, 7, -46, 1, 79, -9, -4, 69, 4, -4, -20, -1, -5, 75, -3, 56, -24, 56, -6, -15, 34, -62, 46, 37, -100, -55, -18, 14, 34, 13, -13, -12, -52, 51, 35, -50, -41, 63, 39, 127, 15, 37, 12, 7, 19, 20, 16, -36, -11, -14, -1, 6, -30, 107, 16, 72, 98, -28, 44, 39, 17, 16, 44, -14, -30, 2, -10, -1, -18, -2, -58, 44, 6, 0, 50, -6, -31, 38, +-34, -39, -20, -3, -1, -68, 16, 63, -18, 99, 34, -18, -6, -5, 15, 127, -5, 4, -47, 73, 0, -2, 26, 93, 0, 82, 7, -7, -5, -11, -40, -1, -3, -35, 53, 43, -6, 4, 12, 3, -33, 12, -58, -54, -6, 16, -46, 18, -8, 2, -55, 22, 21, -49, -12, 39, -24, 70, 42, -27, 3, 19, -31, 0, 118, -35, 40, -9, 32, 24, -30, 91, -37, 56, -17, -49, -14, 30, -51, 33, -16, +66, -45, -40, -3, 28, 67, -22, -8, -21, -29, -19, -13, 9, -34, 25, -9, -15, 42, -42, 2, 52, -4, -15, -10, -11, 12, 3, 7, 47, -16, 17, -13, -15, -22, -12, 74, -19, -53, -23, 24, -11, 10, -9, 16, 33, -49, -12, 31, 8, -55, -15, 33, -21, 7, -39, 19, 35, 0, -4, -12, -2, -13, 32, 29, -20, 11, 33, 44, -6, 21, -17, -35, 2, -34, -18, 54, 21, -23, 22, -21, -61, +5, -18, 2, -3, -12, -40, 6, -63, -24, -26, 21, 27, -9, -16, -26, -62, 28, -4, 8, 9, -6, 3, 13, 0, -1, 0, -30, 7, 10, -17, -3, 2, -16, -35, 0, 32, 11, 17, -29, -21, -10, 12, 2, -1, -22, -31, -27, -12, 4, -16, -21, -34, -7, 51, 1, -5, -9, -2, -3, -7, -6, 54, 2, 21, -28, 24, 13, -10, -3, 43, 0, 27, -2, -11, 32, 0, 39, -4, 25, -28, -17, +-22, -8, -15, 1, 1, -27, 16, 39, -27, -18, 62, -30, -20, 7, -21, -32, -7, -32, -5, 1, -59, 33, -59, 17, 27, 103, 22, 31, -49, 12, 74, -66, -39, 19, 48, 4, -68, 18, -23, 77, 54, -33, -53, 20, 26, -14, 10, 91, -16, -23, -49, -3, -57, 18, -26, -30, 15, 23, 57, 35, -33, -28, 33, -56, -36, 52, -10, 92, 17, -7, -31, -22, -38, 29, -52, -14, -19, -33, -31, 39, 38, +-37, 10, -17, -7, -5, -29, -37, -53, -1, -38, -58, -2, 5, 35, -38, -37, -22, 58, -69, -22, 23, -36, -24, -5, 64, -47, -59, 47, -12, 0, -31, -21, 5, -40, -53, 50, -23, 10, 26, 16, 0, 25, -7, 23, 76, -9, -10, 0, -5, 96, 47, -1, 17, -40, 24, 21, -3, -91, -36, -45, 2, 20, -46, -34, -18, 12, -35, 92, 52, 86, 5, 8, -12, 42, 6, 55, -8, 26, -38, 13, -30, +-4, 42, -31, 17, -61, 18, -38, -22, 24, 21, 28, 5, -35, 14, 29, 4, 30, -26, 1, 5, -95, 7, -2, 29, 41, 10, -5, -18, -27, -5, -8, 3, 7, -1, -20, 91, -57, -50, 30, -10, -23, -12, 34, -25, 16, -16, -8, -74, -43, -25, -12, 70, -9, -44, 25, 58, -44, -27, -29, 37, -35, -28, 8, -60, -20, 30, -16, 22, 36, -19, -65, -44, -51, -26, 37, 2, -22, -39, 32, -24, -38, +1, -11, 59, 34, 26, 9, 107, -30, 24, 41, 86, -45, 58, -20, -24, -14, -20, -37, 23, 64, 0, -20, -5, -46, -15, 33, -50, -37, 60, 68, 64, 50, -14, -35, 25, 94, 15, -21, -11, -34, 4, -34, 80, -13, 27, -18, -43, -65, -7, 1, -8, 1, -40, 51, -57, 15, -34, 15, -19, 17, 6, 50, -66, -1, 15, 14, -10, 58, -49, -11, 41, 0, -34, -80, -2, 7, -31, 12, 23, 57, 25, +-24, -43, -20, 13, 0, -1, -32, -4, -17, -14, 11, 30, -26, 9, 93, 2, -14, -14, -48, 11, -25, 121, 1, -3, -33, -43, -47, 43, 75, -13, 18, -26, -11, -6, 8, 7, -29, -9, -10, 26, 1, -29, -40, -23, 10, 27, 7, -8, 13, 30, -20, -34, -3, 31, -15, 5, -54, 10, -25, -16, -6, 32, -12, 71, -41, 100, 43, -7, 40, -13, -42, -60, 44, 20, 21, 18, 26, 2, 30, -15, 51, +-51, -28, -3, -18, -47, 13, 25, -76, -28, -44, -30, -43, 7, -5, 32, 4, 27, -43, 24, 48, -10, -25, -43, -27, 17, 52, 19, -9, 31, -14, 10, -88, 16, -26, 22, 39, 8, -37, 37, 4, -78, 45, -2, -19, 80, -11, 15, 10, 12, 2, 23, 3, 2, -18, -2, 7, -18, -14, 25, -11, -40, -19, -19, -12, -9, 35, -32, -28, -3, -5, 23, -20, -3, -9, -15, 8, -5, 36, 2, 7, -49, +-31, -36, 6, -24, -5, -9, 30, -8, 29, -27, -15, 23, -21, -27, -14, -76, 12, -7, 6, 8, -5, 46, -11, 21, -17, -3, 48, -11, 16, -34, -23, -8, -22, 22, 20, 41, -27, 4, -31, -21, 56, -14, 29, -47, -22, -2, -47, -5, -2, 6, 29, -30, 31, 7, 9, -13, 46, 4, -23, 1, -46, 65, 17, 80, -51, 46, 1, -31, -83, 9, -23, 15, 54, -23, -21, -13, -18, 18, -8, -43, 22, +-41, -26, 13, -10, -15, 40, -9, -41, 35, 1, -34, 3, -9, -46, 2, -37, -2, -33, -46, 14, 20, 53, 84, -4, -12, -34, 6, 18, 4, 50, 0, -16, 12, -42, 43, -22, 4, 39, -26, -23, 13, 1, -31, -29, -14, 127, 24, 1, -14, -10, -23, 7, -42, 33, -23, -1, 31, -41, 21, 5, -44, 15, 9, -6, -25, -18, -64, -39, -35, 37, -25, -14, -4, 23, -6, -32, 17, 27, 38, -12, 12, +33, 7, -44, 58, -1, 2, -28, -1, -17, -22, -23, -14, -16, -36, -2, 43, 24, 23, 17, 0, -31, -26, 10, -11, -12, -28, -42, 12, 66, -32, -11, -32, 49, -20, -60, -2, -56, -33, -21, 13, -36, -32, -14, 7, -11, -7, -22, -15, -53, 2, -8, -41, 19, -1, -2, 6, -60, -56, 11, -7, -60, -28, -15, 66, 40, 18, -82, 0, 108, -28, -18, -14, 16, -54, 30, 73, -34, -16, -4, 76, 20, +-43, 62, 98, 5, -16, 72, -36, 8, -34, 39, 33, -31, -7, 4, -39, -25, -11, -29, 62, 81, 20, 22, 81, -22, -9, -43, 44, -5, -29, -3, -4, -39, -41, 59, 49, -35, 49, -1, 33, 18, 43, 63, 52, -3, 7, 20, 65, 25, -40, -3, -71, -42, -46, 15, -48, -5, -23, 70, 25, -19, -15, 27, 38, -15, 38, 39, -3, 39, -24, 48, -51, 24, 13, -21, -3, -1, -26, -29, 45, 24, 46, +25, -21, 28, -7, 20, 122, 51, -19, 16, 15, -30, -17, -6, 61, 5, 13, 26, 33, -4, -30, 2, 2, 63, 6, -64, -4, -3, -16, 20, 19, -32, -19, 48, 19, 53, -27, 8, 40, -60, -15, 80, 89, -45, -27, 8, -13, -6, 63, -21, -58, -5, -7, 22, 4, -40, 20, -14, -7, -15, 6, 3, 1, -11, 33, 58, -26, 25, 27, -3, 2, 2, 4, 62, -12, 0, 0, -16, 8, -15, 40, 43, +-19, -21, 0, -24, -37, -9, 22, 25, 45, 107, 40, 28, -5, -25, -24, 31, 49, -12, 48, -24, -17, 3, 12, 52, 66, -35, -20, -3, 0, -27, 13, 9, -8, -3, 32, -35, 17, -3, 31, 4, 14, 8, -19, -44, 69, -2, -21, -29, 4, 43, 26, -24, 8, 29, 30, 3, 0, -8, -15, 6, 8, -32, -18, -30, 47, 32, 29, -33, -7, 26, -1, 5, -14, -1, -22, 25, -14, 13, 42, 34, 3, +-40, -10, -4, -5, -22, 15, 30, 52, 17, 1, 5, 34, 6, -7, -3, -4, 7, 24, 20, 15, -49, 20, 28, 10, 11, -22, -6, 19, 13, -16, -1, 21, -30, -38, 21, -13, -16, 19, -1, 6, 14, 2, -7, -21, -13, -14, -20, 22, -15, -26, -18, -24, -1, 87, 38, -11, -26, -39, 8, -10, -81, -13, 24, -31, -22, -15, -23, -10, 10, 5, -34, -49, -16, 6, 96, 8, -6, 34, -6, 2, 53, +12, 4, -42, -47, -47, -13, -8, 78, -8, 23, 40, -20, -30, 59, 34, 2, 40, -19, -7, -4, 10, 39, 13, -26, -41, -13, 20, 13, -31, -2, -45, -5, -20, -18, 29, 16, 27, 5, -4, -21, -10, 35, 50, -12, -29, -37, 41, 58, -19, -46, -9, 13, 73, 32, 41, -12, -22, -2, 38, -25, 11, 15, 84, -55, -38, -24, -18, -51, 0, 7, -6, 11, 18, 3, -23, -26, 11, -16, 37, 15, 37, +32, -45, -10, -56, 14, -15, -12, 104, 21, 8, -17, 101, -16, -21, 28, 21, 30, 1, -11, -6, 9, -3, 13, -2, 26, -20, -13, -17, 39, -12, -49, 47, 20, -17, -7, -1, 2, 108, 5, -6, -22, 5, -35, 14, -17, -5, -54, -31, -16, -18, -26, -50, 4, -8, -24, 45, -28, -9, 57, 96, 0, 6, 82, -10, -35, 3, 3, 77, 2, 13, -2, 9, -2, -28, -18, 27, -45, 12, -10, -6, -35, +-2, -43, -53, 8, 26, 3, -6, -6, -46, 18, 51, 127, 50, 14, -25, 58, -25, -101, 47, 27, 17, -6, -18, 41, 31, 15, 9, -23, 20, 13, 116, -9, -45, 119, -73, 17, 31, 27, 63, 25, -43, 73, -12, 0, -11, 18, -14, 3, -48, -48, 23, 6, -25, 66, -30, -12, 16, -2, -14, -48, 28, -14, -57, -40, -25, -65, 24, -65, -30, -24, -18, -4, -36, -3, 36, 41, 1, -2, 12, -19, -25, +-1, -17, 82, 41, 60, -2, 45, 8, 72, 16, 39, -12, -54, -2, -35, -32, -17, 50, 49, 3, -29, -59, 6, -49, 1, 7, 97, -35, 20, 11, -10, 27, -25, 16, 4, 26, -4, -19, 58, 28, -32, 11, -25, -29, 9, 7, -8, -61, 0, 15, 45, 62, 26, 39, 11, -49, 91, 5, -36, -44, -29, -15, -42, -26, -75, -61, 8, -17, -17, -18, -15, 47, -22, -19, -61, 8, 0, 88, -41, 7, -11, +-25, -5, 124, -44, -52, 21, -11, 11, 58, -16, -36, -17, -37, -11, 29, -37, -26, -9, -4, 86, 47, -23, 16, -3, 36, -32, 70, -13, 12, 39, 9, -14, -5, -2, -18, -2, 11, -1, -34, -26, 94, 68, -10, -4, -19, -21, -12, 13, -6, 57, -22, 71, -1, -32, -21, -34, 44, -45, -50, -38, 2, -32, 70, -5, -46, 49, 33, 43, 24, -72, 20, -29, 26, 11, -60, 11, 27, 42, 7, 23, 26, +-48, -23, -46, -25, -30, 9, 70, -13, 4, 27, 4, 62, -49, 27, -51, 8, 5, -33, -20, -40, -17, -5, -11, 4, -2, -37, -3, -1, 27, -30, -33, -27, -20, -30, -11, 80, -20, -3, 21, -31, 15, 8, -13, -18, 19, -1, -23, -29, -16, -39, -5, 4, 20, -28, -12, -29, 7, 0, -56, 10, -9, -4, -9, -12, 70, -28, 40, 7, -26, -18, 24, 15, -14, -3, -10, -24, -8, 16, -6, 8, -7, +-31, -64, -21, 24, -18, -3, 37, -16, 52, -8, -8, -14, 5, 16, -19, -30, 23, -44, 12, 57, 35, -26, 14, 21, -22, -8, -19, -16, 12, -26, 9, 66, -54, -27, 12, -26, -84, -36, 104, -7, 32, 16, -19, -19, 31, -4, -6, 3, -28, 7, -33, -14, -12, -70, -18, -77, 32, 42, -52, -26, -19, -50, 15, 16, 25, 5, -55, -34, -30, 5, 12, 38, 34, 7, -12, 52, 38, 30, 31, -47, -23, +-7, -9, 47, -17, -1, 1, -13, -28, 113, 78, -50, -43, -57, -9, 34, 9, -26, 25, 31, -59, -24, -3, 34, -12, -48, -18, -9, -30, 30, -20, -15, -10, -25, -8, 54, -32, -7, -26, -50, -14, 32, -24, -38, -8, -50, 7, -3, -8, -10, 47, -5, -70, -17, 51, -52, 32, 50, 11, -30, 16, 53, -11, 9, 57, -8, 19, 2, 24, -8, 17, -31, -33, 12, 10, 19, -7, 68, 46, 38, 2, -27, +-43, 24, -93, -49, 55, 21, -3, -38, 28, 39, -20, -22, 17, -32, 26, -20, 10, -56, 47, -13, 39, -23, 91, -5, -43, -8, -14, -17, 80, -41, -28, 41, -55, 27, -26, 5, 5, -5, -28, 19, -23, -13, 64, 6, -5, -11, -46, 64, 48, 1, -31, 15, -28, 49, 13, -11, 3, -2, -22, -30, -35, 53, -32, -31, -14, -23, -45, -15, -5, -14, 10, -5, -42, -22, 4, -67, -39, -40, -21, 18, 13, +-9, -12, -23, -4, -28, -11, -14, 61, -46, 6, 8, -22, 62, -37, 56, -62, -8, -47, -11, -17, -33, -33, 25, 98, -13, 47, -30, 20, 46, -35, -18, 9, 18, -22, -39, -61, 46, -39, 1, 2, 19, -28, 14, 20, 14, -19, 47, -26, 21, -9, -37, -8, -3, -15, -58, 51, -4, -8, -33, -7, -13, -4, 37, -60, -34, -26, -26, 6, 17, 127, -27, 23, 45, 8, -19, 19, -7, 41, 76, 23, 39, +13, -48, 3, -45, 1, -69, 32, 2, -21, -41, 37, -22, -41, 54, -4, -3, -9, 19, -3, -41, -32, -12, -40, 25, 82, -29, -1, -39, -37, 30, -54, 83, -3, 46, -25, -4, -68, -35, 23, -16, -19, -2, 4, 25, -5, 7, 1, -30, -45, -15, 14, 19, -19, -16, -37, 31, 13, -6, -30, 26, 13, 17, 2, 21, 75, 34, -53, -22, 22, -63, 50, -45, -45, -43, 0, 30, -32, -22, -41, -8, 11, +-6, 0, -10, 58, -13, -12, 28, -28, -43, 7, -47, 42, -21, 15, 24, 16, -20, -40, -13, 11, 15, -28, 96, -26, 5, 45, 11, 92, -17, -55, -13, -11, -22, -11, 127, -44, 51, -1, 6, 8, 83, -3, -26, -22, 45, 61, 21, -34, 5, 44, 5, 31, 11, -15, 3, 9, 0, 4, -3, -20, 10, 1, -8, -24, 6, 15, -9, 34, -40, 26, 43, -45, 11, -8, 21, 3, 9, 0, -17, -9, 3, +-5, 24, 26, -6, 13, -21, 22, -6, -7, -32, -8, 20, -22, -13, 31, -13, 9, 4, 34, 10, 11, 23, 13, -23, -55, -24, 66, -23, -23, -16, -36, 7, 20, -36, 127, -44, 21, -34, -27, -3, -9, -7, 46, -15, 34, -73, -4, 4, -1, 2, -37, -62, 8, -10, 25, -8, -21, -13, -19, 118, 4, -27, -40, 40, 13, 0, -23, 7, -22, 5, 36, 17, -68, 14, 66, -23, -26, 18, 23, 67, 127, +91, -54, -25, -38, 56, -7, 8, -16, -2, 39, 9, -20, 29, -23, 127, 40, 14, -33, -6, -56, 19, 18, -29, 27, 5, -7, -1, -70, -3, 53, 18, 28, -33, -28, -12, 15, -44, 12, 7, -25, 7, -12, 14, -49, 27, 76, -47, 17, 45, -12, -25, -62, -3, -15, -53, -22, -15, -15, -42, -5, -31, -30, 31, 50, -32, -35, -54, -58, -24, 42, -5, 6, 11, -28, 14, -1, 21, 31, 11, -30, -62, +-49, -10, -22, 31, -62, -4, 10, 11, -15, -34, -38, 20, 7, -6, 26, -26, 0, -28, 9, -9, -34, 24, 14, 11, -12, 6, 53, -24, -56, 8, 3, -40, 38, 40, 10, -6, 31, 33, 33, -21, -10, -39, -5, -6, -54, 92, 25, 32, 61, -8, 26, 18, -40, 30, -7, 109, 7, -72, 23, -9, -68, 21, -6, 54, 101, -49, -49, -37, 18, -53, 30, -37, 74, -37, -66, -60, -18, 10, -17, -7, -29, +-54, 54, 37, -52, -27, -1, -52, -5, -6, 12, -12, 3, -11, 1, 7, -11, -12, -28, 14, -39, 11, 25, -17, -19, 41, -30, -35, 16, -19, -9, 16, -4, 15, 90, -64, 16, -54, -38, 65, 32, 35, -24, -56, -4, 47, -23, 5, 15, -27, -34, 43, -31, 10, 62, -14, 15, -26, 94, 6, -37, 21, -7, 47, -33, -6, 91, -84, -11, -23, -9, 47, -31, 60, 10, 13, -17, 89, 6, -31, 30, 41, +28, -31, 9, -25, -3, -46, 8, -12, -39, -29, 17, -15, -21, -6, -21, 6, 11, -14, -25, 0, 29, -38, 4, 47, -66, -38, 19, 7, -17, 6, -36, -53, -8, -78, -22, 2, -9, -23, -44, -39, -3, 27, 20, 53, 12, 107, 28, 23, 127, -44, 15, 34, 2, -60, 13, -25, -34, -3, 88, -43, 0, -18, -19, -5, -47, 61, -6, -38, 54, -12, 4, -27, -38, 28, -28, -22, 18, 32, 35, -32, 13, +-39, 77, -25, 38, 22, 21, 23, -1, -15, -35, 3, -9, -10, -1, -33, 21, 9, 93, -4, -9, -81, 29, -38, 15, -58, 73, -16, -16, -49, 105, -45, -49, -4, -25, 30, 2, 6, 21, 25, 36, -56, 24, -15, -50, 3, -22, 0, -21, 7, -21, 16, 28, 16, -6, -42, -43, 26, 25, 29, -10, 0, 4, 13, -20, 66, 123, 55, -17, -40, -16, -6, -6, -29, 7, 1, 49, 103, 40, -1, -7, -11, +39, 50, 28, -60, -13, 28, -19, -1, 9, -11, 29, 22, 5, -20, 93, -6, -17, 4, -13, 9, 4, 0, 2, 42, 50, -20, 19, -3, 19, -13, -25, 3, -26, -32, 14, -11, 2, 5, -39, -15, -18, -30, 30, -17, -6, -32, 37, 18, -6, -3, -46, -2, 14, -44, -7, 37, -21, 41, 34, 59, -18, -7, 1, 74, 96, 15, -3, 26, 21, 20, -25, 17, 68, -22, 17, 46, 58, 93, 48, -41, -32, +17, -2, -17, -28, -8, -24, -80, -20, -22, -34, 41, 16, 121, -28, 5, -16, -12, -15, -6, 39, 24, -1, 120, -7, 105, -20, 9, -25, 88, -5, -5, 23, 37, -2, 16, 28, 109, -19, -4, 2, 5, -12, -30, 29, 13, 63, 11, -11, 8, 20, 39, -33, -14, -10, -23, 40, 8, 23, 21, -33, 38, 15, 37, -19, -11, -12, -12, 18, -13, -31, 36, 45, 37, -12, -16, 15, -6, 5, -11, -15, -12, +1, -13, -26, -27, 8, 12, 9, 23, -6, 28, -33, -45, 54, 16, -21, -44, -7, -24, 22, -31, -10, -14, 7, 10, 11, -15, -21, 42, 28, -44, 5, -20, -42, -18, -41, -49, 39, -8, 32, 127, -30, 17, -22, -68, 12, 35, -27, 22, 23, -1, -31, -44, -24, -27, 20, 38, 80, -62, -18, -13, -6, -76, -14, 63, -19, -4, -18, 6, -31, 6, 79, 28, -11, 14, 5, -5, -35, 15, 10, 4, -9, +42, -10, 3, 8, 17, -34, -40, -8, -44, -1, 4, 36, -35, -51, 62, 31, -35, -75, -43, 2, 7, -26, 42, -69, -6, -1, -33, 25, -54, -18, 87, -10, 8, -40, -5, 43, 5, 35, -1, -71, -17, 37, -17, 17, 50, 31, -27, -53, -18, -17, -25, -9, -17, -11, -9, 1, -21, 10, 11, 16, 7, 55, -87, -9, -63, 51, 42, 15, -49, -26, -30, 67, -30, 30, -61, 47, -57, -62, 22, 29, -7, +-12, 26, 20, 20, 4, 33, 15, 13, 3, -46, 48, -37, 75, 5, -8, -63, 19, 15, 53, -16, 27, -10, 53, 1, 26, 2, -1, -30, 12, 7, -10, -61, 3, 22, -26, -3, -42, 2, 14, -3, 20, 12, -12, -10, 34, 114, 2, 68, 31, -31, -26, 10, -13, 38, 12, -22, -20, 12, -25, 7, 0, -70, 2, -17, -40, 37, -36, -20, -64, 32, 45, 9, 115, -4, 28, -34, 66, -63, -32, -61, 32, +34, 1, 6, 34, -13, 2, -3, 63, 18, -45, 3, -6, -40, 4, 0, -41, 106, 30, 18, -27, -45, -16, -31, 2, -24, -17, -17, -33, 59, -30, -17, -53, -22, -48, -46, 22, -1, 20, 25, -39, 20, 26, 18, -25, -25, 27, -62, -5, 51, -10, -22, -28, -31, 33, -14, -10, -41, -19, 38, 21, 48, -23, 10, -2, 1, -27, 7, 63, 101, -43, 38, -11, -35, -30, 20, 22, -40, 4, -1, 10, 0, +-6, -14, -8, -15, -21, -25, 14, 58, -60, 25, -44, 8, 39, 43, -8, 11, -2, 0, -26, -34, -4, -31, -10, -25, 2, -42, 10, 14, 8, 1, 30, 5, 25, 4, -32, -45, 19, -22, 48, 12, 56, 18, -3, 19, 1, -17, -24, -50, -5, 1, -19, -29, -6, -24, -18, 33, 23, -12, 19, 23, 15, 10, 24, -1, 41, -42, -12, 30, 7, 43, -2, 17, 24, -19, 127, -24, 9, 25, -38, 19, 20, +-45, 50, -13, 18, -35, 47, -20, 7, 81, 18, -28, 1, -14, -21, -35, -19, -38, -8, 44, 46, 17, 22, -32, -19, 3, 0, -11, 27, -9, -7, 22, -65, -30, 12, 25, 1, -41, 22, 49, 48, 1, -41, 66, 23, -6, -21, -18, 78, -81, 7, 26, -68, -18, -23, 4, 34, 32, -30, 32, 32, 8, -25, 3, -56, -33, 16, 32, 65, -9, -7, 10, 32, -30, 27, 25, -18, -51, -12, 13, 18, 42, +27, -17, 35, -16, -6, -39, 23, -49, -78, -1, 55, 45, -2, -12, -41, -29, -38, 121, 4, 32, -11, -62, 13, 21, 117, -22, 9, 21, 14, 1, 28, -12, -28, 20, -36, 28, 43, -10, 19, 1, 7, 4, -15, 67, -6, -20, -56, 7, 23, 4, 29, -12, 25, -27, 45, 10, 98, 7, -20, 22, 42, 10, 6, 27, 55, -45, 37, -66, 26, -18, -18, -5, 11, -19, -24, -25, -9, -41, 58, 6, 11, +12, -34, 78, -66, 28, -9, -16, -12, 23, -5, 7, -2, -47, -17, -21, -5, 6, 0, 100, 4, -42, -31, 66, -17, -73, 0, 41, 33, -9, -15, 82, -64, -26, -40, 61, -34, -44, -62, 21, -12, -18, -27, -20, -17, -24, 55, -22, -20, -32, -10, -7, -29, -29, 89, -57, 26, -25, -32, -10, 5, -8, -70, -4, 10, -13, 2, -23, 26, 1, -16, -9, -24, 0, -13, -36, -100, -25, -20, 39, 34, -44, +16, -6, -11, -3, 19, -6, 4, 3, 4, 38, -46, -50, -19, 83, -40, 7, -7, -36, 41, -6, -27, -28, -31, 9, -5, -40, -12, 13, -83, -9, 63, -32, -21, -37, 9, 24, -16, -19, 22, -18, -16, 30, -24, 23, -13, 59, 8, -5, 69, 41, 23, 39, -11, -28, -28, 0, -11, -53, 28, -41, -21, -18, -18, -20, 3, 11, 10, -17, 25, 10, -30, -5, -11, 5, -6, 21, -47, 2, 3, -7, 44, +-28, -1, 46, 20, -66, 50, 3, -25, 21, -24, -74, 37, 10, 22, 25, -24, -53, -26, -23, -46, -41, -14, 61, -29, 55, 12, 33, -31, -1, 55, 1, 46, -12, 30, 31, 116, 25, -42, -28, -24, 14, 35, 39, -37, -6, -30, 127, 1, -22, 26, -11, -13, 10, -54, -19, 127, 52, 18, -57, 21, 5, 52, -25, -35, 9, 43, -14, -1, -34, -17, 39, -35, -11, -9, -46, 10, 11, 2, -21, -10, 3, +95, 0, -40, 16, 8, 38, 9, -32, 43, 37, -26, 21, 3, 102, -66, -39, -27, -31, -49, 15, -36, 22, 59, -17, -28, 100, 26, 10, 25, -41, -3, 32, 6, 11, -19, -17, 35, 39, 37, -22, -38, 22, -31, -23, 42, 37, 39, -6, 0, -31, 20, -26, -20, -11, -45, 2, 12, -6, 14, 127, -12, -19, 7, 12, 18, -26, -17, 15, -12, -1, -25, 24, 4, 36, -21, -21, -14, 35, 92, 41, -32, +33, 16, 12, -10, 4, -14, -7, -15, 7, -6, 71, 31, -15, 9, 21, 27, -32, 10, 2, 36, -20, 5, 29, 61, -43, -14, -1, 15, 98, -13, 38, 12, -9, -18, 104, -29, -14, 29, -53, 28, 18, -38, -18, 1, 57, 2, -55, -7, 27, -30, -24, 3, -28, -4, -2, -37, 8, 29, 17, -2, -14, -18, 18, -12, -2, 50, -30, -76, -43, -10, 9, -7, -18, 50, -3, 13, -17, -3, 49, -3, 1, +-11, -10, 16, 23, -20, 14, 0, 4, -13, 65, 17, -55, 27, 27, -22, -28, -4, -61, -5, -31, 13, 1, 4, -50, 39, 16, -12, -23, -43, 23, -6, 9, 16, 71, 2, -1, 53, 98, 19, 21, -26, 9, -23, 2, -5, -12, 4, -23, 29, 17, -4, 9, -45, 2, -20, -37, 36, 11, 33, -8, 78, 6, -39, -18, -23, -3, 43, 62, -63, 64, -29, 4, 2, -11, 21, -17, 12, -50, 33, -62, 125, +20, -1, 54, -16, 31, -4, -48, -12, 55, 21, 58, -37, -6, 6, 1, -29, 6, 50, 26, -17, 45, 76, 28, -65, 127, 8, 50, -42, 41, -8, 7, -46, 11, -15, -24, -42, 28, -12, 5, 33, 36, 45, 20, -17, 45, -5, -29, 5, 18, 90, -2, 11, 16, 44, 17, 60, -15, -7, 8, 0, 7, 0, -9, -40, -14, 31, -14, 34, 17, -28, -24, -4, 9, -37, -18, 11, 11, -20, -32, 10, -63, +-40, -41, -5, -8, 28, 10, 3, -3, -1, -32, 9, -13, -5, -22, 3, 8, 2, 4, 21, -16, -12, -7, 1, -12, -28, 37, -18, 35, 6, 8, -25, 26, 4, -16, 17, -19, 0, 33, 46, 32, 36, -37, 24, -26, -16, -5, 16, -5, -4, 0, -17, -5, 32, -4, -33, -24, -12, 14, 28, 16, 13, -28, 27, -20, 2, 24, -48, 16, 31, 21, 45, 2, -13, -27, 6, 14, 33, 22, -7, -58, 23, +32, 19, -3, 16, 6, 19, -29, -13, 12, 12, -1, -14, -11, -2, 15, -29, 5, -22, -63, 91, 24, 29, 34, -41, -33, 20, 55, -24, 51, 127, -35, 3, -2, -39, -17, 10, -37, 37, 8, 48, -31, -2, 6, 55, -70, -31, 35, -23, 33, 57, -18, -36, 1, -22, -7, -27, -24, -2, -50, 4, 22, 18, 16, -44, -15, 9, -28, -36, 64, 40, 12, 2, -35, -52, -24, -9, 114, 96, 15, -2, -57, +-1, 12, -6, 12, -33, 79, 12, -20, -21, 24, -16, 10, 8, -34, -31, -21, -3, -23, 28, -22, -36, 70, 104, 14, 59, 26, -61, 24, 29, -8, -18, -30, 15, 8, 15, 48, 35, -12, -20, -30, -35, -23, -13, 23, -19, -9, 55, 8, -19, -4, -27, 33, -57, 25, 64, -8, 48, -16, 25, 5, 25, 27, 3, -10, -40, -20, 38, 36, 2, 16, -15, -48, 48, -28, -13, 50, 30, 127, -30, -1, -28, +5, 22, -40, 42, 25, -53, 27, -59, 36, 72, -8, -53, -24, -28, 67, 4, -37, 26, -16, -16, -45, 2, 7, -33, 11, -23, 41, -65, 36, 34, 21, 2, -38, -24, 13, -9, -44, 11, 5, -6, 10, 21, 19, -12, -10, -19, 21, -7, -27, -33, 15, 15, -10, -20, -28, -35, -16, -1, -45, 18, -10, -12, 12, 5, -1, 6, 17, 34, -56, -35, 0, 12, -32, -20, -40, 66, -22, -1, 3, 1, -35, +-8, 14, 19, -8, 4, -40, 23, -24, 21, 7, -29, -29, 19, -16, 13, -10, -3, -8, 89, -30, -10, -13, -3, -6, 3, -3, -10, -47, 17, 11, -3, -23, 72, -24, 23, 7, -11, 27, -2, -20, -2, 22, -22, -2, 35, -44, 4, 30, -23, -34, 39, -60, 66, 2, 7, 31, -5, -6, -40, -4, -8, 11, -44, 57, 41, -33, 24, 7, 61, 8, 72, 28, 21, -9, 1, -41, 60, 33, -21, -59, -5, +-34, 11, -71, -23, -5, 44, 25, 12, -18, -9, -13, -18, 39, -6, 22, -10, -2, -4, -52, 25, -40, -10, -16, -39, -35, 3, 10, -1, 38, -16, -54, -20, -25, 12, -52, 18, 29, 53, 42, 22, 24, 55, -7, 0, 14, 19, -8, -41, 58, -31, 43, -7, -12, 13, 27, 0, 37, -30, -58, -65, 38, -13, -2, 19, 15, 20, 74, -18, -31, -8, -4, -20, -61, 27, 56, 1, -27, -24, -2, -29, 67, +-11, -32, -10, -17, -29, -6, -39, -16, -26, 8, -23, 39, -14, -5, 22, 17, -8, -15, 17, -35, -22, -34, 10, 40, -70, 65, 18, -12, 22, 5, -33, -9, -8, -16, 22, 18, -6, -38, -14, 34, -41, -16, 10, 16, -30, -18, 8, -25, -22, 0, 22, 7, 54, 26, -6, -31, 18, 5, -49, -24, -11, 15, 27, -29, -33, -10, -23, -48, -25, 4, -33, 1, -14, -12, -7, -33, 24, 17, 5, -16, -33, +-51, 29, 16, -14, -35, -7, -19, -42, 0, -2, -56, -39, -17, -38, -17, 11, 2, 27, 16, -29, -46, -34, -6, -2, 2, 4, -10, 4, -24, 47, -13, -18, -9, -43, 75, 1, -13, 45, -34, -39, -21, -18, 18, -17, -1, 17, -2, -76, -15, 75, 52, -8, -25, -59, -19, 73, -22, 9, 10, 24, 23, 43, 8, -56, -33, -33, 20, 12, -4, -83, 43, -23, -1, -100, -33, 11, -16, 6, 79, 33, 42, +-42, 40, -32, -26, 47, 59, 24, 17, 11, 13, 37, 1, -4, 16, 80, -58, -51, -17, 22, 11, 27, 61, 89, 14, -6, 85, -42, -35, -15, 51, -25, 25, -17, 41, 28, -2, 86, -21, 44, -19, 127, 3, 9, -1, 24, 1, -25, 69, 6, -57, -43, -19, -13, 24, 21, -31, 59, 10, -47, -26, -2, 25, -9, -38, -55, -35, -31, -15, -20, 46, -18, -9, -32, 7, 59, -14, -3, 15, -25, 55, -11, +-13, -51, -6, 7, -8, 15, 15, -38, 36, 22, 34, -17, -35, 45, -74, -6, -33, -50, 62, 42, 41, -29, -35, -12, 23, -21, 3, 4, 57, -80, 26, 32, 54, -51, 15, 34, -31, -3, 27, -42, -17, -7, 14, -28, -22, 12, 3, 28, -23, -22, -21, -9, -25, -60, -60, -10, -25, 4, 5, 28, 25, 5, -6, 7, 22, 33, -4, -34, 6, -36, 9, -23, 7, 35, -5, 33, -30, 3, -24, 34, 23, +12, -32, 2, -33, -23, -1, 23, 3, -49, 25, 1, -23, -3, 32, -22, 7, 85, 14, -24, -19, -17, -4, 37, 8, 20, -19, 10, -9, -13, 4, 18, 31, -19, -5, -19, 17, -39, 8, 11, 35, 27, 6, 29, -44, -5, -42, 2, 9, -11, -5, 10, -53, 8, -28, -18, -31, -41, 1, 2, -18, 4, 8, 24, -24, -58, -20, -3, -9, -62, 4, -12, 3, -1, -5, 6, -35, 6, -9, 0, 16, -40, +-24, 0, 18, -44, -1, -39, 23, -79, -29, 9, 0, 13, -10, 11, -33, -114, -40, 3, 7, -30, -35, 29, 34, 31, 10, 17, -17, -70, -9, -58, -27, 14, -18, -8, -29, -14, -2, -18, 18, -25, 37, 22, -33, -11, 27, -21, 18, -40, -11, 2, -13, -28, 36, 7, -19, -36, 29, 22, 52, -30, -32, 11, -34, -5, -20, -27, 23, -7, -39, 19, -37, -42, 22, -22, -16, -17, 7, -31, -32, -23, 34, +-8, -31, -32, 127, -20, -40, -36, 5, 2, 0, 16, -25, -15, 64, 36, -22, 21, 17, 9, 1, -23, -4, -57, -54, 70, -4, -29, 41, -2, -4, -61, -13, -14, -36, -71, 8, -21, -4, 15, 26, 14, -27, -11, 80, 83, 10, 34, 0, 9, -55, 69, -26, -17, 33, 11, -14, -8, 32, -3, -9, -26, -2, 26, 29, 49, 18, 30, 2, 20, -6, 2, 33, 11, -10, -3, -29, -18, -25, -6, 21, 8, +-17, 43, -20, -9, -27, -45, -37, 0, -21, 44, 14, -12, 2, 22, -24, -5, -17, 60, -33, 40, -5, -3, -2, 29, -13, -40, 22, -25, -15, 13, -40, -6, 33, 30, -17, -31, 20, 23, -6, -19, 17, -20, -1, 36, 34, 23, 5, -20, 67, 2, -72, -35, -25, 1, 40, -24, -21, 25, -8, 4, -22, 9, -21, -24, 22, 27, 0, 23, -23, 49, 0, -34, 15, 23, -20, 32, -37, 2, -13, 10, -7, +-62, -41, 37, -34, 4, 11, 29, -5, 13, 42, 20, -14, 46, -42, -3, 28, 118, -18, -1, -5, -28, 52, -8, -26, 14, 13, 21, 28, -37, 13, -11, -20, -14, 4, 68, 39, -20, 12, 11, 23, -9, 15, -18, -12, 41, -13, -43, -4, -3, 29, -16, -48, -65, -1, -51, -24, 1, 22, 36, 38, 15, -21, -33, 44, -36, 46, 8, -43, -63, -3, -43, -28, 36, -3, -19, 7, 8, 38, -37, 72, 59, +-14, -32, 10, -6, 44, -19, 17, -6, -36, 0, -1, 10, 10, 25, 4, 6, -18, 95, 9, 3, 49, -9, -11, -15, -46, -22, -7, 34, 30, -11, -15, 16, 7, -27, -11, 68, 48, -15, -45, -16, -13, -39, -71, -33, -46, 6, -49, -44, 118, -26, -31, -6, 114, 44, -9, -34, -5, 74, -13, 54, 24, -4, 9, -31, -67, -22, 11, -17, -40, -46, 18, 3, 55, -27, 17, 77, 8, 60, -70, 39, -18, +127, 4, -15, 30, 25, 19, -5, -11, -22, 24, -23, 10, 16, -30, 28, 4, 42, -55, 3, -27, -33, -4, -20, 42, 0, -6, -22, -31, 5, 127, -10, 26, 24, 0, 2, -5, -31, 2, -46, -16, -8, -4, -1, 8, -51, -18, 24, -2, -34, 77, 20, -7, -2, 1, 104, 35, -46, 6, -5, 40, 42, 9, 10, -31, -27, -30, -22, 3, -18, 7, -21, -17, 0, 8, 7, 5, -44, -27, -21, -1, 48, +48, 14, -5, -5, -13, 44, 39, 44, 18, -8, 5, 31, 99, -48, 21, 18, 8, 27, 22, 8, -24, -23, -13, 14, -48, -37, 28, -30, -3, 32, -9, -12, -34, 17, 9, -10, -31, -4, -27, 55, 6, 11, -23, 23, 57, -22, -9, -23, -55, 27, 74, -53, 44, -9, -72, 4, -5, -59, 39, -5, -2, 1, -35, 44, 10, 32, -17, 40, -21, 14, 91, 2, -31, 5, 2, -15, 17, -12, 8, -9, -4, +-36, -3, 25, -3, -27, 4, -33, -60, 8, -2, 21, 39, -12, 1, 20, -3, 37, -62, -24, 55, -10, 54, -70, -34, 15, 24, -10, 73, 68, 70, 73, -9, -18, 21, -8, -11, -12, -18, 38, -19, 9, -47, 27, 34, 36, 20, -40, 42, 5, 49, 57, -28, 39, -14, -34, 23, 127, -13, 30, -29, 14, 69, 62, 3, 22, 47, -55, 26, 34, 6, 14, -22, -1, -18, -40, -22, -63, 7, 67, -11, -22, +5, 57, 4, -14, -18, -11, -2, 0, 17, 4, -19, -13, -18, 11, -34, -37, -26, 27, -15, -6, -4, -24, -10, -6, -1, 8, -9, -12, 3, -16, 18, -23, -8, -22, 13, -29, 27, -32, 24, 81, 15, -12, -28, 94, -33, -25, -26, 0, -23, -28, 8, -70, -47, -19, -7, 32, -29, 104, 16, -31, 24, 25, -16, 21, 32, 7, 36, -4, -13, -45, -51, 5, 19, -31, -54, -38, 10, 45, -10, -16, -21, +9, 5, -6, 6, 8, 34, -18, -14, 15, 11, -25, -37, -21, -57, -12, -29, -26, 22, 45, -37, -89, -30, 70, -32, -20, -27, 105, 0, 4, -2, -32, -14, -23, 87, -53, 33, 13, -46, 70, 43, 74, -21, 34, 13, 14, -21, 5, -17, 1, -30, -47, -6, -55, -23, -18, 13, -41, -74, -40, -51, -13, -4, -36, 14, -8, -70, -18, 3, -1, -5, 16, -50, -37, 47, -25, 11, -70, -35, -7, -16, -2, +22, -41, -6, -10, 2, 19, 102, 36, 6, -13, -35, -32, 82, 22, 47, 33, -28, -71, -51, 49, -10, 7, 2, -32, -2, 85, -31, 23, -11, -30, 4, -45, -2, 16, 30, -21, 75, -10, 3, 2, -28, -6, 5, 3, 0, 1, 12, -13, 14, -22, -1, 5, -21, -23, -20, -4, -16, -2, -17, -28, -19, 101, 57, -1, 4, -27, -12, 11, 32, -33, -11, -20, 10, -29, 23, 11, 6, 13, -23, -5, 9, +49, 30, -4, 57, 58, -19, 25, 3, 63, 5, 44, 44, 39, 23, -51, 46, 6, -3, -41, -57, 29, -3, 21, 112, -31, 43, 42, -17, -4, -33, 8, -10, 78, 23, -3, -43, -13, 60, -25, -36, -25, -47, -13, 11, -23, -48, 20, -42, -13, -25, -20, -24, 1, 34, -31, -24, -30, -4, 12, 84, 40, -41, 20, 81, -19, 6, 67, 12, 7, 7, -8, -8, -35, -9, -35, 30, 5, 64, 12, 30, -49, +-8, -25, -17, -24, -16, 11, 39, 8, -9, 7, -22, -11, -4, 48, 24, 72, -10, 23, 1, -5, -10, -23, -14, -3, -5, -12, 4, 46, 30, -25, 0, -37, -12, -53, -16, -37, -3, 19, -13, 54, -14, 26, -44, 39, 3, -14, -20, -51, 14, 39, -17, 8, -44, 6, -23, 27, -10, 0, 1, 0, 15, 15, 6, 64, -60, -18, -97, 125, 31, 4, 14, -8, 15, 78, 32, -13, -73, -1, -32, -68, -8, +-18, -41, 35, 49, -7, 44, 55, -3, -1, 6, 12, -44, -42, -20, -12, -34, -43, -33, 127, 20, -5, 39, 7, -15, -26, -17, -14, -5, -3, 27, -112, 22, 1, 116, 6, 21, 35, -24, -16, 17, 2, -1, -28, 4, -4, 30, 40, -12, -18, -8, -74, 1, -38, -12, -16, 46, -7, 5, -17, -31, -6, 10, 90, 21, 9, 11, 72, 10, -12, 37, -44, 33, -16, -16, -8, 5, -22, -20, -45, -5, 22, +-19, -19, 20, -4, -31, 58, 10, -6, -14, -9, 88, 7, 34, 30, -29, -48, 12, -2, -38, -49, -17, -1, -20, 31, -12, -24, -9, -28, -36, 16, -15, -18, 23, -17, -11, -12, 22, 2, 40, -1, 38, -11, 30, 4, -35, 11, 21, -30, 6, 16, -4, -14, 26, 1, -30, -23, -16, 17, -2, 11, -32, -9, 25, -23, -39, 3, -40, 9, 38, -21, 67, -25, 19, 11, 36, 1, 26, 0, -3, -51, 27, +9, -49, 19, -1, 50, -27, -8, 1, 2, -5, -31, -24, 43, 19, -19, 8, -33, -22, -49, -27, 21, -35, 25, -44, -2, 19, 5, -25, -10, 10, -25, 73, -7, 127, -49, 2, 7, -33, -16, -3, -39, 36, -56, 43, 15, -29, -55, 20, -34, -56, 34, -37, 25, 0, 40, 37, -1, 26, 4, -48, 49, 106, -66, 82, -16, -73, 4, 52, 23, -1, -33, 1, -6, 48, -9, 23, -35, 0, 28, -24, -1, +0, -9, -31, -8, 34, -33, -30, 21, 26, -70, 35, -22, -48, -43, 29, -23, 38, 29, -75, 39, -24, -20, -17, 11, 27, -9, 24, 2, -52, -19, 9, -44, -14, -25, 8, 58, -5, 55, 66, -28, -16, -30, 19, -21, -46, -3, -44, -60, -47, -47, -32, 40, 65, -19, 22, 15, 16, 48, 59, -22, 38, -34, 25, -6, 12, 4, -19, 3, -11, -35, -18, 27, 2, 17, 14, 2, -33, -15, -22, 59, -4, +12, -36, 50, 51, 30, -27, 42, -23, -30, -14, -42, -35, 19, -21, -34, -55, 73, -8, 7, 5, -16, 1, -27, -50, -24, -87, 25, 8, 72, -16, 31, -31, 32, 38, -5, -37, 19, 45, -5, -19, -15, 31, 20, -17, -31, 57, -16, 11, -19, -32, 47, -8, -11, 6, -11, -18, -12, -4, -27, -43, 16, 90, 1, -77, 2, -64, -47, -32, -51, -2, 7, -17, -8, 4, -37, -18, -43, -13, 5, -6, -15, +-47, -27, -39, -32, -18, -36, 10, -44, 33, 10, 18, 5, -6, -10, -16, -11, 11, -21, -27, -5, -18, -33, 2, -11, 24, 10, 11, -25, 29, -15, -4, -7, 6, -6, -32, 63, 34, -7, 38, 13, 75, 12, 23, -28, -25, -12, 1, 22, -8, -35, -20, 3, 9, 10, -20, -43, -3, 4, 15, -25, 15, -28, -25, -17, -9, -2, 32, 12, -3, 17, 20, -19, -25, -11, -13, -3, 30, 9, 91, 0, 3, +-6, -27, 4, -15, -17, -26, 26, 71, 25, 22, -70, 79, -45, -36, 6, 47, 18, 33, -13, -23, -14, -7, -44, 29, 34, -8, -40, 92, -1, 76, -85, 46, 105, 34, -91, 127, -41, 18, -2, 10, 9, -12, -57, 46, 13, -41, -1, 47, -9, 33, -12, 74, -26, -7, -2, 13, -31, 21, -3, 72, 27, 6, 37, -44, 54, 17, -19, -17, 24, -2, -7, -52, -42, -15, -14, 0, -9, -24, 21, 32, -19, +-6, 25, -13, -28, 28, 3, 35, -35, 5, 13, -34, -33, 51, -7, -27, 12, -43, -24, -72, -33, -33, -27, 18, 82, 33, 3, 22, 12, 37, -52, -25, 12, 14, 43, -56, -33, -19, -5, -10, -23, -39, 92, 39, 15, 33, -7, 18, 58, 10, -11, 19, 13, 4, -5, -2, 11, -8, 16, 0, 14, 9, -6, -10, 2, 8, 56, 5, 11, -5, 40, -26, -11, 18, 3, -21, 1, 52, -39, -23, -15, 5, +1, -25, 6, 2, 4, 17, 0, 20, -34, 10, 8, -26, 14, -14, 16, 16, -32, 67, -3, 5, -27, -2, 11, -20, 127, 7, 20, 4, 14, 88, -4, 6, 8, 22, 35, -14, 6, -49, 13, 48, -17, -17, 60, -38, 28, -6, 24, -12, 34, 19, -26, -2, 12, -38, -3, 15, -15, 14, -7, -22, 64, 4, 8, 2, -25, 9, -27, -25, -17, 56, 24, 48, -28, 65, 6, -8, -4, -40, 34, 23, 86, +-32, -83, 51, -3, 28, 41, -27, -45, -67, 17, 27, -32, 91, -22, 24, 45, -17, -56, -4, -33, 4, 7, 14, 6, -32, 54, 21, -33, -18, 62, 87, -17, -1, -2, 12, -34, -9, 43, -38, -2, 29, 61, -19, -39, 10, 81, -2, -27, -53, -29, 40, -52, 19, -24, -9, 2, 25, -14, -17, 16, -47, 69, 31, -19, -15, 50, -20, 13, -8, 7, 7, -32, -1, -24, -39, 30, -4, 21, -22, -9, -37, +-2, -4, -9, -10, 24, -9, 26, -1, 51, 4, -14, -30, -26, -51, 16, -34, 5, -5, 1, 4, -13, -39, 6, 15, 0, -14, -23, 59, 127, 10, 27, 39, 36, -45, -13, 8, -41, -20, 12, 11, 72, 38, 48, -5, -63, 25, 19, 43, 3, 36, -26, 67, -36, 17, -31, -10, 38, -44, -37, -12, 5, 20, -41, -54, 11, -26, 31, -4, -12, -46, -26, -35, 29, 32, 7, -35, 26, -17, 3, -38, 0, +7, 12, -33, -31, 10, 98, 25, -19, 17, -6, 53, 28, -9, 17, -10, -29, 45, -48, 26, 14, 1, 6, 20, 9, 41, 27, 20, -27, 66, 15, -10, 61, -6, 40, -27, -50, 52, -5, 48, -19, -14, 2, -17, 22, -11, -6, -10, -21, -36, -38, 0, -2, 56, -2, -12, 50, 12, -4, -24, 3, -13, -8, 26, -2, 6, 26, -27, -36, -19, -36, 2, -23, -1, -3, 7, -13, -31, 8, -11, -34, -8, +10, -23, -12, 16, 15, 40, 54, 6, 12, 4, -49, 32, 31, 23, 1, 33, -32, 20, -9, -31, -25, 17, 6, 35, 2, 24, -35, 16, -5, 6, 8, 88, 9, 34, 88, -22, -16, 14, -1, -73, 58, 57, 39, -6, -41, 29, -46, -21, -37, 29, -52, -15, -41, 1, 70, -3, 17, 105, 15, 42, -15, 47, -13, 46, -38, 28, -23, -33, -11, -19, 4, -42, -10, 21, -2, -21, -39, 36, 3, 2, 19, +-16, -40, 83, 72, 33, 58, 29, -30, 108, -27, -43, -19, 25, -15, -4, -33, -10, 11, 24, 10, 9, 41, -33, 32, 33, -26, -56, 20, -13, 31, 12, -25, -31, -52, -11, 4, 51, 39, -63, 62, -10, 54, 32, 13, -28, -13, 30, -57, -9, -18, 35, 7, -24, 20, -31, 80, 35, 2, 13, 12, -6, 44, -58, 68, 16, -18, 8, 11, 47, 5, 69, 49, 11, -31, 63, 64, 8, -6, -3, 44, 28, +12, 1, -21, 32, -24, -21, 34, 42, 7, 10, 2, -5, -17, -29, -22, 127, 1, -12, -2, -9, -11, -8, 0, 68, -11, -17, -26, -12, -25, 4, -35, 3, 86, 27, -11, 26, -45, 1, -15, -16, 13, -10, -21, -8, -10, 4, 12, -23, -3, -32, 11, 43, 2, 17, 8, 39, 15, 9, -17, -55, 61, -5, 6, -14, -18, -39, 32, 66, 8, 2, -21, -54, 11, -4, -21, 51, -18, 70, -2, 8, -37, +-25, 34, -12, 24, -52, -16, 61, -28, 47, -7, -30, -23, -61, 4, 7, 82, 16, 4, 4, -17, 16, 34, -7, -18, 54, 2, -4, 1, 57, -5, 15, -24, 35, 2, -2, 47, -30, -32, -27, 3, 2, -9, -6, 12, -17, -24, -38, 8, -16, -14, 64, -21, -6, 58, -54, 7, 11, 102, -1, -57, 5, -79, 10, 94, 17, -32, -15, 34, 62, 4, 45, 81, 27, 127, 32, 4, 16, -2, 51, -18, -3, +-8, -6, 99, 42, 34, 3, 37, 1, -40, -38, 5, 1, -27, 19, -25, -39, -9, 14, 42, -23, 29, 33, -27, -16, 29, -4, -11, 39, 6, -22, -19, 36, 37, 57, -20, -13, 27, -9, 9, 14, -24, -5, 0, 55, -16, 22, -22, -28, -10, 15, -32, -51, 2, -14, 49, -21, -7, 20, -38, -35, -35, -21, -13, -34, -15, 0, 61, -43, -27, -23, 3, -65, -4, 38, 118, -12, 88, -43, -49, -22, -45, +20, -9, 53, -23, 3, -10, 54, -15, -22, 13, 0, -6, 57, -23, -19, -8, 12, -12, 26, -24, -1, 4, -4, 25, 95, -24, -37, 37, -6, 10, 35, -56, -33, -26, 6, -21, -12, -1, 19, -3, 19, -49, 9, -16, -51, -20, -21, 65, 15, 21, -8, -35, 46, 79, -28, -33, -62, -10, 61, -4, -21, -11, 3, -3, 39, -4, 15, -2, -23, -21, 47, -8, 0, 40, 24, 10, 58, -23, -23, 12, -10, +-26, -2, -7, 12, -28, 19, 13, 127, 2, 19, -35, -2, 2, -31, -9, 81, -25, -19, -6, 20, -26, -3, -42, -20, 0, -4, -16, 7, -10, 27, 7, -17, -7, 18, -30, 54, -14, -29, 33, 127, -16, 16, 96, -33, -40, -10, 22, -7, 27, -9, -25, -15, 4, 44, -23, 16, 6, 8, -14, 13, 12, 10, 60, -81, -22, -18, 40, -10, 20, -87, 9, 15, 6, -26, -4, -9, 64, -19, -35, 31, 6, +11, -36, 55, 53, 29, -6, 30, 24, -4, -1, 1, 15, 51, -12, -9, 6, 8, -24, 48, -31, -8, 0, -22, -27, 33, -51, -15, 47, -34, 19, 25, -32, 5, 7, 8, 4, 51, -53, -32, 44, -32, -24, -39, 30, -24, 2, -28, -35, 24, -12, 51, -18, -27, -17, -8, 21, 41, 10, 55, 6, -51, -41, -37, 3, 58, 27, 40, -6, 23, 103, -11, -10, 79, -43, 62, -32, -16, 78, 19, -27, -37, +-36, -28, -42, -66, 5, -14, 3, -18, -46, -16, -12, -41, 17, 30, -28, 7, 5, -41, -10, -37, -27, 67, 2, 14, -10, -9, -3, -17, 19, 12, -9, -2, -3, 16, 81, -5, -15, -9, 30, 11, 14, 20, 21, -1, 10, 21, 33, -16, 17, -15, -22, -6, 44, 17, -7, 29, 97, 26, -11, -26, -35, 49, -32, 33, -12, -25, -9, -12, 8, 30, -14, -13, 40, 44, 20, 2, -5, -5, 12, 22, -46, +30, -13, 5, 122, -39, 16, 23, 18, 9, -21, 47, 42, 17, 5, -32, -15, 26, -34, 7, -11, -31, 10, -13, -1, 7, 31, 18, -3, -31, 7, 79, 56, -5, -8, -18, -72, 62, 44, -8, -27, 34, -62, -34, -47, -24, -55, -4, 4, -13, -14, -63, -11, -15, 19, -45, 40, 10, 11, 35, 8, -18, -92, -46, 31, -30, -52, -29, -40, 57, 14, -10, 51, 0, 8, 17, -56, 27, 4, -5, 57, -34, +40, -24, -12, 14, -34, 2, 16, -60, -22, -40, -8, 19, 15, 36, 26, 3, -29, -35, 39, -44, 12, 49, -27, 0, -28, 18, -20, -36, -4, -13, -4, -37, -9, -18, -7, 3, 82, -13, -33, -57, -9, -5, -22, -26, -4, -8, -3, -18, -39, -5, -38, 60, -42, 26, -45, 20, -10, -4, 21, -11, 77, -19, -24, -5, -64, 15, -28, -18, 3, -16, -5, -45, -22, -25, 13, 4, -4, 57, -2, -18, 30, +-5, 39, -18, 32, -38, -10, 67, -26, -65, -8, -27, 44, -74, -3, 3, 30, 38, -45, -16, 105, -10, 21, -10, -92, 26, 42, -33, -18, 17, -37, -11, 7, 33, 0, -18, 40, 8, -13, -16, -2, 36, 57, -35, -21, 17, -7, -24, -20, -6, -55, 23, 15, 52, 37, 13, 10, -19, 6, 0, -24, 31, -2, -36, -28, 4, -11, 66, -19, -30, -24, 32, 2, 17, -46, 33, -32, 1, -17, 6, 21, 96, +-41, 29, 9, 1, -4, 20, 33, -40, -39, 32, 31, 8, -7, -23, -6, -36, -27, 21, 42, -1, -31, 33, -22, -33, 6, 57, -7, -1, 18, -9, -7, 13, -32, -5, -7, -9, 25, -17, 13, -5, -32, 11, -9, 83, -6, -53, -14, 2, -9, 51, -13, 10, 23, 25, -12, 64, -1, 22, -1, -21, -1, 0, -34, 12, -12, -16, 41, 7, 19, 1, 22, 14, 17, 15, 17, 52, 28, 31, -24, -48, 40, +-14, -27, 27, 24, -23, 12, 48, 27, -42, -54, -20, -90, -75, 74, -52, -44, -68, 56, 20, 10, -15, 78, 27, 23, -7, -63, 28, 66, -20, -3, -33, -10, 109, -10, 15, 30, 37, 3, -44, 16, 72, -13, 29, 0, -12, 6, 50, -35, 17, -19, -27, 71, 2, 45, 20, 6, -17, -3, -3, 16, -21, -66, -14, 13, 18, -9, -34, 21, 52, -27, -70, 5, 30, 43, -15, -17, 34, -17, 25, -12, 20, +34, 8, -9, 6, 8, 80, 43, 5, -12, -4, 83, -12, 45, 21, 97, -24, 23, -26, -7, -25, -4, 2, 1, 14, -23, -41, 47, 1, 20, 28, 17, -12, -22, -36, 33, -7, 65, -42, -21, 5, 23, -22, -24, -33, 17, 3, -40, -50, 27, 42, 92, 82, 11, 83, -9, -42, 12, -45, 71, 23, -31, -24, 9, -11, -49, -9, -65, 42, -19, 3, 56, -16, -16, 0, -52, 12, -4, -6, -20, -4, 9, +4, 76, -39, -5, 25, 2, 10, 19, -13, -5, 87, -11, 30, 35, -38, 18, 37, -26, 22, -29, -34, -15, -16, -1, 33, -10, -12, 33, 39, -15, -9, 35, -13, -17, 39, 8, 2, 2, -44, -23, 36, -21, 8, 52, -13, 21, -18, -36, -24, 15, 18, -29, -44, -28, 86, -28, -13, -15, -18, -44, -9, 3, -6, 37, -23, -33, -11, -10, -19, -3, -3, 22, 4, 26, -3, 10, -4, -21, -28, -8, 6, +23, -14, -22, 45, 1, -21, 4, 9, 33, -2, -31, 26, -17, -1, -13, 63, 2, 59, -33, 23, -20, -14, 16, -56, -22, 36, 12, 21, -16, 68, -17, -13, 66, 34, -35, 66, 16, -28, -31, -36, 52, 38, 6, -9, -20, 101, 53, 7, 2, 38, 27, 6, 8, -47, 20, 15, -45, 2, -19, -14, -31, -10, -5, 6, -24, -47, -15, 42, 7, -15, -31, 4, -37, 45, -16, -19, -28, -27, 5, 19, 29, +28, -53, -9, 34, -32, 31, -6, -30, -40, -54, -21, -10, 60, 8, -41, 18, -10, 5, -12, 102, 45, -2, -8, 22, -18, -1, -9, -23, 27, -11, 55, -3, -52, 2, 38, -17, -32, 24, 11, 41, -39, -13, -4, -57, -63, -72, 50, -22, 17, 30, 16, -26, -14, 12, -39, 38, 5, -43, 7, -20, 20, -8, 54, 3, 13, -58, -34, -39, 9, -65, 19, -19, -14, 2, 1, -20, -14, 20, -8, -30, 3, +-19, 43, 108, 35, 4, 12, 35, 33, 64, -25, 48, -26, 0, -15, -22, 47, 3, -28, 83, -13, 27, -15, 54, -1, 48, -17, -21, 8, 46, -59, 6, -57, 35, -49, 26, 51, -8, -23, 37, 20, 37, 1, -19, -29, -10, -18, 79, -4, 29, 55, 70, 1, -13, 39, 36, -26, 13, -36, -37, 34, -20, 19, 14, -35, -14, 8, -20, -32, 37, 32, 15, -10, 49, -5, -25, -1, 16, -12, -37, -8, -32, +14, -7, 2, -12, 5, 0, 35, 3, -15, -60, -6, 52, -23, 3, -38, -2, 23, 23, 9, -26, -10, -13, 9, 42, -47, -15, 1, -13, -40, 47, 0, -11, 0, 30, 28, -31, 42, -12, 5, -30, 60, -22, 41, 5, -33, -62, -41, -11, -56, -36, 68, -15, 38, -8, 70, -19, -46, -58, -7, -2, -11, 10, -5, 21, 21, -12, -7, 18, -9, 40, -7, -1, -8, -27, -16, 12, -5, -55, -39, 38, -30, +2, -26, 11, -10, -7, -26, -3, 68, -34, 13, 53, 10, -18, -74, 5, 6, -1, 13, 50, -49, -42, 76, -15, -20, -17, -17, -27, 24, -32, 17, 19, -18, 57, -21, -42, -17, -33, 37, 55, 17, -10, 28, 77, 2, -25, -25, 7, 17, 41, 1, 57, 60, 31, -9, 11, 6, 2, -19, 3, -16, -30, -9, 15, -3, -37, 72, 118, 29, -15, -24, 11, -8, -3, -6, -101, 22, 80, 7, 7, 5, -34, +-78, -29, -12, -41, -29, 6, 21, -2, -12, -49, -12, 71, 34, -29, 1, 54, 16, 2, -14, -23, 5, -49, 46, 20, -44, -26, -28, -35, -34, -6, -1, -26, -31, -2, -14, 43, 1, -35, -19, 23, -8, 6, -2, 25, -19, -5, -3, -58, -24, -10, -34, 13, 0, 28, -17, -33, -17, 11, -11, 1, 1, -10, 19, 3, 32, 43, -17, 38, 35, 13, 37, -28, 46, -31, -13, 36, -6, -43, 24, -13, 36, +45, 1, -29, -30, 50, -15, -5, 5, 15, 12, -33, -14, 28, -40, -1, 32, -11, 31, 7, -36, -19, -6, 15, 19, -27, -25, 14, -23, 0, 2, 30, 8, -22, -30, 16, 28, -19, 10, -3, -34, -15, -10, -28, -1, -17, 86, -55, 66, -13, -21, 21, -34, -41, -29, 104, -35, 18, -14, -32, 5, -9, 95, 1, -9, -33, -32, -14, -32, -35, -7, 79, 51, -7, 48, -46, 17, -9, -17, -14, 16, -14, +-15, 24, -7, -13, -7, -26, 6, 21, -2, 0, -6, 7, -14, 9, -35, 21, 6, -2, -24, -22, -10, 22, 5, -32, -49, -48, 18, 78, -30, -31, 40, -69, -59, -82, -2, 25, 29, 39, -25, 48, 23, -2, 25, -13, 92, -30, -19, 52, 0, 10, -52, -9, 59, -43, 7, 59, -17, -24, 14, 24, -79, 52, 50, 7, 62, 78, -40, -59, 3, -16, -22, -6, -21, 41, -26, -7, -11, -33, 28, 35, 13, +20, -9, -2, 96, -38, -26, 10, 3, -16, 34, -11, -11, -4, -2, -7, -7, -6, -58, 8, -34, 63, 1, -8, 30, 23, -12, -18, 4, -51, -11, -1, -14, -4, -26, -5, 51, -18, -4, -42, -26, -59, 22, -32, -16, 0, -7, -22, -31, -77, -37, -3, 44, -48, -4, 0, 38, 45, -39, -44, -24, 30, -11, -3, -27, -23, 29, 26, -22, 10, -28, -7, -62, 4, -8, -25, -7, -2, 36, 13, -10, 74, +-9, 50, -9, 17, 25, 3, 1, 23, -21, -35, -15, -14, -31, -23, -35, -19, -46, 8, 26, -54, -28, -18, -17, 4, -9, 84, 41, -39, 16, -38, -19, 16, 27, -36, 6, -11, -1, 24, 0, -10, 1, 2, 37, 18, 15, 28, -38, -21, 6, 11, -3, -1, 29, 13, -25, 0, 20, 5, -11, -7, 44, -28, 79, 60, -19, 66, 32, 56, -26, -43, 3, -24, 0, -12, 1, -17, -29, -10, 6, 6, 42, +-49, -39, -53, -70, -27, 12, 22, -50, -30, -30, -1, 7, -27, 20, 32, -28, -26, -15, -20, -21, -13, 12, 8, -4, -7, 28, 0, 22, 1, 7, 12, 19, 6, 5, 15, 14, 13, 7, -56, 11, -25, 11, 6, -23, -27, -4, 54, 55, -33, -18, 66, 12, -2, 5, -13, -6, -17, -13, -1, -50, -48, -30, 91, -11, -11, 52, 0, 13, 9, -1, -30, -25, -23, -4, -4, -41, -51, 79, 17, 63, -7, +52, 70, -8, 7, 48, -51, -22, -16, 11, -20, 38, -10, 60, -16, -17, -20, -4, -59, 39, -22, -33, 11, -9, 1, -4, -58, -41, -30, 1, -11, 18, 77, -13, 90, -27, 0, -64, -7, 32, -32, -41, -4, 51, 72, -29, -3, 14, -25, -21, -7, 81, 20, -56, -57, 21, 39, -46, 57, 2, 28, -12, -9, -3, -20, -4, -40, -5, -17, 24, -22, -5, -10, 20, -6, -33, 11, -4, -27, 3, -16, -13, +-7, -6, -3, -9, -25, 6, -1, -64, -6, 0, -20, 31, 18, -16, -10, 12, 54, 10, -30, 58, -9, -12, 27, -3, -24, -30, -2, 48, -28, 9, 16, -14, 23, -55, 42, 79, -2, -12, 1, 2, 22, -6, -7, 16, 14, -17, -44, -22, 23, -7, 30, -12, -16, 6, 24, 54, 10, -20, 3, 3, 4, 31, -11, -8, -7, -31, -16, -17, 80, -12, -4, 79, 61, 88, -26, -18, -8, -2, 3, -2, -31, +10, -13, -31, 30, 20, -31, -10, 12, -19, 28, -27, 3, 93, 5, -19, -40, 51, -19, -12, -17, 3, -35, -15, 31, 23, 8, -10, -3, -8, 31, -18, -20, 40, -4, 21, 1, 0, -16, 10, 109, -7, -6, 23, 18, 5, -15, 1, 1, -15, -19, 22, -26, -39, -27, 40, 79, -52, -26, -21, -8, 127, -9, 60, 34, -34, -45, -8, 31, 20, -34, 27, -34, -20, -22, 54, -49, 3, -45, 28, -46, -33, +-25, 32, -80, 17, 10, -9, -13, 45, -11, 62, -8, 15, 74, 80, -10, -1, -36, 17, -5, 25, 33, -2, 99, -33, 20, 20, 69, -3, 43, 7, -28, 54, -10, -12, -32, -12, 0, -4, 35, 2, -29, -31, 39, -2, 44, 19, 15, 9, 12, 30, 40, -24, -19, -30, -5, 10, 88, 4, -33, 41, 2, -9, 0, -51, -7, 32, -38, -62, -64, 59, -7, -46, -27, 25, -22, 127, -2, 60, -33, -29, -38, +18, 39, -18, 3, -18, -13, -45, -4, -33, 22, 24, 45, -14, -29, 1, 39, 11, 37, -33, 61, -20, -21, 4, -17, -36, 19, -3, 12, -72, 34, 17, -20, 35, -3, 11, -31, -97, 1, -32, -22, -18, -1, 13, 28, 4, 11, 28, -20, 52, 23, -19, -11, 27, 9, 31, -11, -23, 63, -15, 33, 43, -26, -33, 35, 7, 27, -14, -22, 19, 9, -18, 18, -25, 26, 2, 27, 13, 11, -8, 55, 3, +21, 42, -29, -43, 65, -23, -56, 12, -22, 122, 14, 49, 47, -19, 0, 5, 13, 16, 29, -42, -1, 31, 37, -22, -15, -26, -13, -58, 71, -7, 24, -33, -6, -1, 16, -1, 62, -12, 5, 18, -22, -5, 53, 10, 80, -13, 14, -8, 17, -7, -5, 20, -4, -31, 15, 23, 14, -2, 22, -17, -16, 23, -59, -43, -17, 19, 57, -48, -24, 29, 13, -30, -33, -67, -51, 4, 19, -23, 4, -2, 12, +25, 2, 8, -2, 1, -14, -25, -52, 12, -15, -24, -60, -46, 2, 99, 127, 22, 67, -19, 10, -39, 26, -34, -46, -26, 19, -19, 31, 78, -11, -37, -13, 38, 61, -9, -11, -34, -19, -40, -5, 65, -7, -14, -51, -16, -66, 50, -33, 35, 57, -6, -25, 95, 42, -3, -34, 55, -6, -6, 16, 96, -64, 53, -33, -24, 6, -16, 8, -25, 26, 5, -79, 3, 17, -15, 53, 9, 22, -24, 11, -9, +-2, 9, -7, -16, 35, -47, -3, -13, -47, 4, 3, -29, -2, 3, 10, -7, -44, 18, 45, 47, -9, -13, -14, -5, -1, -28, -20, 15, 1, -13, 26, -2, -20, 1, -31, -13, 33, -9, -8, -16, 19, -19, 43, -42, -39, -41, -25, 20, 13, 1, -32, -27, 16, -32, 44, -1, -9, -4, -15, 21, 19, -53, 17, -4, 9, -3, -24, 18, 26, -20, 3, -51, 12, 1, 14, -26, -11, 6, -9, -15, -11, +-13, 3, -3, 93, 6, 25, -10, -9, 54, -11, -17, 15, -18, 2, -44, 0, 16, -25, -40, 50, -10, 26, -35, -6, -34, -43, 75, -47, 14, 22, 28, -32, -12, 27, -15, -28, -11, -12, -15, 6, 3, -51, 4, -34, -2, 33, 36, -2, 0, -27, -17, -11, -12, 12, -43, -7, 21, -12, 8, -21, -20, 39, 24, -4, -26, 22, 18, -19, -42, -21, -4, -33, -1, 47, -31, -25, 27, 20, 46, -1, -20, +-50, 2, -38, 14, -11, -10, 83, -10, 15, -34, 5, -27, -3, -34, -42, -25, -14, -66, 14, -26, 15, -37, 79, 11, 41, -15, -12, 102, -60, 22, -2, -29, -5, -11, 55, -33, -10, 36, 0, 0, 17, -63, 5, 29, -30, 31, 64, 9, -11, -16, 43, 17, -38, -31, 38, 2, -27, -11, -20, 11, 56, -49, 60, -20, -14, 45, 33, 7, 44, 46, -22, 10, -34, -62, 58, -5, -26, -36, 2, -9, 33, +70, 4, -50, -16, 25, -11, 2, -5, 16, 0, 13, 77, -41, -5, -13, -13, -23, -33, 18, -8, -44, 21, 51, 20, 17, -26, -30, 17, -31, 105, 19, 50, 30, -40, 21, 81, 0, -59, -19, -27, -28, 23, -28, -15, -71, -15, -28, 39, -19, 44, -3, -13, -34, 60, 26, 11, -7, -6, -22, 34, 25, 77, -19, 20, -36, -4, 22, 41, 21, -23, 24, 27, -16, -37, 10, -40, 9, 22, 33, -33, 1, +-15, 37, -23, -33, -26, -29, 51, -5, 10, 26, -18, 18, 26, -6, 7, -34, -25, -4, -61, -17, -28, -18, -1, 68, -21, -74, -14, -9, 59, -25, -17, -51, -34, 2, -39, 34, -31, -40, 127, 9, 37, -38, 24, -2, 98, 34, -51, 66, -87, 30, -23, 45, 31, 16, -33, -11, -27, 15, -17, 29, 2, -11, -13, 3, 0, 34, 11, 3, 15, 8, -7, -4, 12, -4, 16, 12, -55, 6, 49, -26, 29, +-26, -25, 8, 22, -3, 7, -43, -7, -41, 0, -37, -25, -21, -14, -10, 17, -47, -17, 10, 27, 12, -6, 41, -43, 24, 12, -24, 28, 0, -62, -44, 45, -32, -55, -13, 12, 6, 33, -7, 18, -1, 46, -9, -8, 3, -34, -39, 10, -26, -43, -14, -58, 0, 99, -27, 21, -1, -9, 11, -15, 15, -20, -30, -18, 8, 16, -28, -36, -26, 5, 8, -15, -31, 49, 33, -12, -50, -59, -4, -60, 39, +127, -18, -29, 45, 9, -3, 14, 24, 60, 50, -58, 103, 5, 14, 3, 64, -8, -51, -32, -27, 34, -25, 8, -5, -28, -8, 42, 4, -26, 10, -20, -26, 24, -2, -26, 15, 32, 19, 10, 17, -11, 0, -19, -19, -5, 34, 77, 127, -30, 0, 12, -24, -12, 37, -23, 27, -20, -31, -37, 2, -31, 25, -28, -19, -31, 18, 2, 0, -7, 34, -5, 11, -10, -23, -2, 11, -5, 33, -36, -3, -18, +82, -25, 2, 50, -18, -8, -19, -11, 30, -12, 17, 6, 24, 22, -11, 70, -10, -25, 15, 2, -12, 4, 6, 127, -11, 40, -18, -6, -30, -25, 2, 4, -32, -16, 42, -19, 0, 6, -40, -3, -41, -38, -16, -57, -15, -40, -36, -8, 3, 28, -8, -28, -4, 24, 6, 4, -59, -57, -35, 2, -7, -25, 26, -19, -24, 3, 7, -14, 0, 14, 50, 6, 22, -11, 38, 48, 2, -6, 16, -16, 38, +35, 35, -22, -26, 22, 53, 19, 9, 25, -29, 55, -2, -10, 40, -17, -37, 4, 23, -16, -24, 61, -20, -14, -74, -42, -6, -22, -23, 4, 9, 51, -29, 29, 37, -42, -9, 6, 30, -18, 55, 28, -24, -49, 115, -28, -55, -38, 37, -13, -1, -17, 97, -1, 1, -23, 84, -43, -19, -27, 36, -27, -19, 74, 34, 16, 9, 32, -22, -19, -14, -30, -62, -21, -44, 50, -49, -15, 39, -64, 43, -9, +18, 1, -24, 64, -27, 18, -7, -48, -33, 40, 30, -12, 25, -38, 3, 127, -34, 23, -18, -8, -6, 5, -3, -1, -9, -17, -27, 5, 7, 1, 54, -22, -3, 73, 29, -9, 9, 23, 77, -11, -19, -15, 38, -3, -31, -51, -70, -28, 12, -22, 37, 21, -39, -29, 42, 4, -28, -6, -64, 49, -48, -16, -9, 17, 40, -21, 32, -29, 0, 2, -21, 49, -41, -39, 58, -53, 3, 103, 2, -5, -19, +-47, 19, 3, -34, 12, -19, -37, 45, -11, 15, 83, 30, -15, -62, -24, 6, 14, -19, 3, 26, -26, -8, -19, 4, 14, -41, -20, 3, 49, -23, -12, 34, 14, 1, 1, -3, 21, -3, 7, -4, -28, -30, 1, -17, 127, -7, 4, 44, 20, -9, -28, 10, -2, -4, -9, 44, -67, 38, -15, -44, -22, -65, -40, 19, 26, -52, -8, -13, -23, -19, -1, -23, -10, 29, 7, 10, -11, -41, 13, 97, 18, +48, -12, 19, -21, -20, -8, -32, -34, 34, -14, -32, -24, 19, -10, 48, 82, 35, 17, 31, -27, -16, 127, 48, -36, 27, 28, 56, -14, 4, 2, 2, -7, -24, 37, -9, -43, -45, -36, -16, 69, -30, 17, 48, 46, -36, -29, -18, -8, -48, -1, 37, -7, 1, -34, 76, 81, 77, 25, -4, -17, -12, -35, 16, -18, -2, -27, -8, 68, -2, 5, -8, -3, 49, -1, 20, -15, 63, -38, -5, -52, -17, +35, 52, 29, 15, -7, -17, 0, 18, -5, 10, 49, -13, 15, 6, -14, -22, -25, -9, -1, -4, 98, 78, -14, -3, -4, 1, -17, -17, -62, 46, -1, -36, -17, 5, 4, 16, -15, -82, -41, 22, -27, -70, -12, 95, 22, 8, 15, -37, 24, -14, -13, -7, -17, 17, 37, 49, -48, -2, 33, 11, -6, 29, 31, 39, -20, 34, 7, -36, -11, -4, -21, -1, -12, -7, -29, -11, -22, 17, -31, -4, -27, +-9, 3, -16, -15, -6, 71, 4, -36, -1, -1, 23, 29, -7, 86, 7, 5, 7, 27, -14, -17, -37, -44, 6, -20, -1, -56, -33, 35, -4, -7, -23, -2, 8, -10, -30, 6, 13, 1, 4, -9, 6, 18, -37, 8, 41, 11, 45, 38, 12, -8, -3, -4, -33, 64, -26, -17, -2, 4, 9, 15, 9, -16, 5, -44, 9, -2, 5, -20, -22, 71, -9, 28, -12, 9, -19, -2, 11, -7, 3, 38, -23, +-6, -21, -33, 51, -9, -32, 40, 13, -48, -36, 24, 21, -12, -15, -40, 21, 8, -7, -7, 3, 51, -27, -30, 38, 5, 33, -25, 0, -9, -30, 23, -4, 19, -11, -27, 49, -10, 42, -2, -19, 53, -52, -13, -24, 6, -2, -25, 105, 33, -22, -18, -75, -40, -31, 10, 89, -61, 30, -6, 0, -31, 66, -43, -65, 65, 77, 10, -2, -4, -20, -31, 37, 36, -33, 42, -36, 76, -12, -1, 19, 9, +-21, 17, 27, 31, 37, -13, 84, -5, 115, -15, 61, 109, -21, 18, -8, 10, -56, -29, 10, -66, 14, -22, -56, -20, -15, 30, 25, 9, -11, -31, 80, -37, -18, -37, -21, 9, 69, 1, -50, 16, 44, 21, -11, 16, -19, 5, 22, -44, 64, 31, -12, 39, -24, 75, -54, -17, -34, 7, -17, -23, 3, -35, -7, 50, -3, -29, -17, -18, 27, 52, -46, -4, -33, 25, 74, -4, -57, -14, -33, 1, -19, +-63, -30, 17, -19, -17, -53, 27, 88, 20, -22, -32, 21, -6, -58, -22, 15, 7, -3, 3, 86, -37, 64, -36, -54, -3, 1, -12, 12, -24, 33, 4, -45, -10, 22, 66, -15, -7, -17, 73, 37, -56, 69, 47, 15, -33, -14, -18, -12, -5, 10, -38, 20, -13, -28, 3, -6, -23, -15, 22, -33, 43, -29, 21, -36, -7, 4, -23, -1, -8, 31, -5, 16, 63, -18, -13, -19, 44, 48, 3, 27, 19, +-34, 48, 16, -23, -37, -46, 19, 0, -20, 1, -24, -39, -27, 17, 10, 8, 66, 10, -19, -55, -26, -9, 31, 29, -2, -16, -42, -22, -41, 50, 1, -3, -15, -2, 24, -17, -10, 12, 3, 33, -18, 5, -1, -10, 10, -24, -4, -4, -38, 2, 7, -11, -10, -15, 62, -13, 33, -2, -18, -46, -17, -37, -5, -35, 46, 39, -1, 11, 36, -16, 2, -4, 25, -12, -15, 44, -19, -29, 13, 26, -51, +-34, -52, -22, -40, -1, -27, -39, -36, 20, 5, 10, -22, -35, -20, 0, 14, 8, -13, -48, 7, -13, 4, -29, 29, -53, -2, -35, 4, -54, -32, -7, -30, 26, -10, -27, 8, -8, 40, -37, -21, 9, 1, -20, 50, 17, 9, -11, 25, -1, -10, -20, -18, 2, 18, -2, -4, 28, 29, 2, -44, 39, 3, -4, 40, 22, 17, -22, -26, 27, 100, 29, 23, 31, -20, -10, -26, 25, 25, 28, -27, -27, +42, 12, -14, 2, -1, 10, -13, 34, 116, 1, 11, 46, 7, -1, -43, -12, 26, 47, -25, -4, 1, -7, 50, 5, 2, -38, 30, -40, 47, 18, 11, -6, -2, 53, -10, 28, 72, 10, -4, -26, -8, 16, -12, -37, 12, -28, -21, -9, 45, 14, -3, -32, 30, 4, -37, -11, -16, -25, 34, -18, 13, -29, -19, 12, -1, 9, 10, -22, 32, 14, 25, 11, -21, -13, -3, -21, -10, -27, -12, 26, -12, +6, -15, -6, -16, 0, -5, 12, 34, 6, -53, -7, -6, 127, -26, 33, 57, 36, 3, -23, 51, 63, 1, -15, -2, -8, 5, 8, 24, -8, -21, -40, 75, 27, 24, 17, -48, -6, -41, 28, 7, 16, 3, 32, 6, 38, -20, 22, -11, 37, -32, 36, -16, 13, -34, -10, -4, 17, -16, -17, 58, 34, 24, -3, -14, -21, 5, 10, 39, 43, 72, 89, 45, 33, -3, -32, 102, 93, -50, -42, -64, 7, +12, -35, 32, 17, -74, -47, 13, -64, 2, -26, -22, 80, 41, -39, 50, -16, 19, -17, -13, 28, -40, -45, -37, 26, -7, -9, 2, -40, 31, 29, -22, -40, -80, 127, -78, 64, -19, -51, 11, 19, 45, 13, -5, 19, 18, -7, -47, 36, -4, 13, 101, -15, 8, -28, -8, 0, 60, 10, -3, -53, -14, -15, -10, -24, 1, 33, -5, 8, -2, -9, -45, 7, 0, 41, -37, 32, -2, 0, -28, 44, 26, +8, 32, 41, 18, -11, -16, -5, 21, 6, -9, 10, 34, -23, 82, 4, 63, -13, -41, -8, -49, -19, 83, -18, 10, -32, -21, -28, 29, 53, -9, -66, -24, 29, 48, -4, 30, -21, 5, -39, -24, 32, 14, 21, -39, 17, 50, -32, 90, -25, 38, 25, -31, -35, -10, -11, 22, 29, 9, -3, 15, -47, -17, 6, 73, -3, -66, -28, 28, 31, -16, -19, 19, -39, 4, 6, -7, 74, 12, -13, -12, -25, +-36, 22, -2, 4, -22, -18, -12, -1, 27, 49, 5, -24, -3, 5, -43, -10, 34, 8, 16, 86, 0, -33, 33, -34, -52, -29, 55, 25, 6, -14, -33, -29, -7, -77, -11, -9, 65, -29, -44, 72, 3, 116, -58, -9, 10, -1, 11, -26, 12, -13, 1, -14, -49, -12, -6, -18, -13, 96, 37, -5, 21, 2, 11, -21, 13, -14, 15, -19, 46, -26, 83, 39, -9, -23, 29, 11, -17, 3, -9, -4, 28, +11, -6, -20, 45, -56, 76, -54, -12, 42, -62, 67, 73, 71, -4, -21, -3, 37, -59, 82, -10, -2, -7, 51, 5, 61, 46, -15, 40, -2, 69, 32, 9, 57, -10, 127, 25, -12, -8, 8, -25, 51, 20, -10, 13, -12, 2, -19, -1, 25, -10, -44, -8, 22, -44, -12, -32, -19, 19, -5, 59, 0, -26, -15, 29, 21, -19, -27, -34, 46, 26, -38, 33, -23, -35, 38, -65, -31, 35, -66, -36, 31, +-16, -53, -35, -41, 63, -48, -15, -33, -4, -5, -29, -26, 48, 25, -4, -41, 14, -19, -10, 11, 67, -4, -16, 15, 70, -3, 6, 46, -25, -2, 7, 0, -7, -15, -20, -26, -28, 0, 21, 17, -19, 38, -23, 7, 67, -1, -9, -33, 5, -32, -5, -29, 23, 29, -36, -33, -13, 72, -40, -6, 5, 80, -15, 127, -10, -14, -6, 66, -13, -6, 24, 7, 41, 17, 7, 56, 24, -19, 1, -20, -5, +-17, -18, -11, 18, -33, -18, -2, -6, -22, 20, -2, 18, -10, -8, -8, 2, 9, -9, 18, -2, 19, 31, 31, 1, -3, -4, -23, -1, -24, -2, -28, -29, -7, 0, -7, -36, 7, 43, -20, 80, -12, -32, -31, 51, 46, 1, -4, -34, -27, -27, 2, -3, 12, -8, -37, -30, -26, -17, -21, 25, -15, 9, -19, -3, -60, 0, -23, 29, -20, 2, -4, 27, 20, -7, -8, -26, 7, -23, -19, 2, -10, +-21, -25, -20, 6, -9, 45, -18, 17, 127, 2, 14, 52, -26, -7, 0, -24, -17, -24, -14, -46, 36, -31, 84, -17, -59, 21, 2, -91, -7, -18, 1, -17, 3, -8, -33, -50, 10, 10, -43, -56, 40, -14, 0, -17, -10, -8, -80, 122, 45, -22, 7, 1, 53, -29, 23, 72, 5, -44, 34, -47, -43, -24, -39, -46, -4, 39, 18, -27, 66, 39, 32, -16, 37, -33, -60, 41, -24, -7, -62, -27, -10, +5, 64, 41, -20, -18, -15, 18, -12, -2, -7, -11, -15, -47, -3, -7, -5, 11, -12, -4, -4, -13, 13, -30, -31, -35, -15, 12, -3, 10, -28, 5, -19, 103, -8, 18, 35, -32, -23, 54, 9, 74, -39, 21, 58, 13, -7, -36, -7, -31, -43, 7, 56, 22, 46, 65, -17, -15, -21, 16, 5, -8, -21, 38, -6, -14, 39, 3, 4, 14, 110, 6, 127, -21, -23, 4, -27, -28, 18, 27, 11, -11, +8, -39, 13, 27, -2, 36, 8, -44, 15, -26, -8, 19, -11, 4, 10, 49, -40, -3, 13, -44, 9, 7, 28, 8, 31, 7, 6, 36, -9, 6, -25, -2, -9, -27, -6, 2, -25, 32, -15, 14, -23, 44, -19, -3, 34, 17, 55, -10, 11, -65, 8, -13, 8, -1, -15, -12, -9, -11, 28, -14, 39, -71, 12, 5, -8, -8, 31, 53, 41, 11, 29, -72, -45, -7, 31, 16, 17, 47, -3, 34, 0, +57, 59, 4, -32, 0, 0, -63, -2, -14, 12, 5, 11, -18, -14, -38, -15, -16, 17, -41, -23, 37, -16, -22, -19, 21, 0, -21, -6, 1, -11, 113, 17, -5, -87, -8, -2, -13, -59, -23, -30, 33, 8, 76, -23, -23, 30, -5, -14, 45, 5, -33, 29, 46, -13, 30, 30, 16, 13, 28, 67, 23, 12, 46, -50, 1, -27, -30, -18, -29, 0, 5, 37, 46, 26, -23, -51, -33, 39, 63, -53, -37, +-1, -48, 6, -49, -3, 21, -9, 30, 3, 53, -40, -39, 8, 0, 11, -20, 0, -3, -40, 5, -43, -14, 1, -34, 46, 11, -27, -19, -5, 1, -32, 36, -38, -3, -25, -18, 8, 15, -16, -18, -35, 3, -38, -31, -5, 36, 6, 33, 15, -9, -21, -2, -10, 8, 18, -47, -21, 10, -35, 5, 12, -24, -25, 23, -21, -2, -48, -1, -37, 60, -44, 51, 8, 16, 7, 1, 0, 9, -4, -12, -15, +46, -6, -20, 4, -1, -6, -63, -15, -13, 32, -34, -3, 24, 2, 20, 34, 5, 6, -46, 2, -20, -4, -21, 7, -36, 19, -40, 36, 24, 53, 67, 56, -28, 59, -13, 78, -6, 36, -50, 26, -30, 9, -11, 20, 1, -18, -76, 17, -30, 3, 27, 77, -26, -20, -29, 50, 15, -10, -39, 15, 18, -17, -40, 86, -3, -26, 36, 30, 10, 17, -14, -12, -3, -14, -6, -16, -13, -11, -28, -30, -49, +-55, 38, -14, 20, 8, 40, 26, 6, -6, 11, 21, -41, 3, 1, -3, -45, -33, -5, 3, 13, 4, 29, 21, -25, 2, -10, 5, -27, 3, 23, -12, 1, -43, 23, 0, 10, 5, 22, 50, -15, -35, -9, 0, 20, -7, -11, -8, -7, 15, 14, -55, 9, -46, -7, -49, -13, 19, -18, 1, 20, -13, -8, -22, -4, -39, 31, -1, 41, 49, -7, -13, 44, 15, -7, -8, -10, -69, 39, -42, 20, -6, +2, -57, -19, 53, 4, 34, -2, 18, -1, -39, 47, 21, -4, -26, -11, -59, -64, -26, -9, -41, -39, -30, 20, -26, -32, 77, -16, 34, 0, -30, -14, 38, -14, -8, -30, -54, -24, 18, 27, 30, -15, -8, 2, -3, 18, 51, 11, 14, 7, -9, 23, -2, -10, 4, -21, -11, -2, -1, -12, 5, 5, 36, -28, -26, -14, -24, -52, 9, -18, 1, -8, -46, -10, 21, -22, -6, 27, -11, -6, -87, -4, +-33, -16, -25, -3, -21, 2, 42, -24, -24, -37, -22, -27, 37, 9, 19, -9, -14, 28, -23, 68, 53, -7, 9, -68, -2, -73, -63, -28, -5, -4, 34, 39, -34, 36, -17, -42, -13, 21, -29, -21, -27, -60, -31, -36, 23, 4, -6, -27, 52, 9, 17, -46, 124, -10, 9, 11, -16, 27, -70, -42, 19, 12, -17, -36, 26, 38, 34, 36, 57, 19, 9, -23, 4, 70, 10, 27, 17, -16, -34, -15, -59, +-14, 56, -7, -44, 45, -13, -31, 24, -37, -29, 5, -45, 33, -67, -7, 16, 8, -26, -32, -57, 56, -61, 81, 37, -25, -39, -24, 35, 7, 9, 23, 17, 11, 26, -4, 39, -5, -11, -1, 5, -7, 26, -22, 4, -8, -39, -14, 10, -32, 11, 23, 36, -28, 14, -13, -9, 11, 50, 2, -10, -38, 1, 35, -23, 22, 54, 5, 7, -22, -22, 28, 22, -18, -56, -23, 26, 6, 5, -58, -14, -39, +-49, -10, -38, -60, 0, -54, 16, 11, -1, -10, 84, 43, -13, -23, 7, -5, -44, 12, 47, -40, 12, -7, -3, 4, 33, -23, -9, -17, -5, 4, 50, -2, 0, 32, -48, 25, 13, -42, 48, -30, -24, 1, -1, 17, -9, 58, 41, 1, -52, 34, -2, -26, -22, 1, 6, 14, 89, 0, -2, 13, 73, -14, 29, 21, -9, -32, -24, -25, 12, 20, -5, -38, 29, 16, -13, -7, 2, 27, -38, 5, -32, +11, -18, 29, -11, -34, -19, 20, 33, 16, -19, 0, 24, 31, -15, -3, 10, 7, -15, -50, 28, -19, 1, 42, -28, -28, 16, -23, -5, -1, 9, -20, -46, -18, 61, -31, 43, -22, -5, -51, -22, 41, -2, -26, -40, -8, 42, 21, 2, -37, -6, 35, -15, 3, -15, -10, -26, -35, -19, -60, 32, -14, 73, -29, -60, 29, -26, 6, -46, 127, -4, 19, 34, -12, 2, -54, 13, -41, -20, -16, -38, -43, +3, -57, -41, 44, -16, -25, 18, 1, -47, -11, 8, -2, -27, 5, -13, 47, -4, 14, -34, -27, -4, 52, 1, -6, -11, -24, -23, 5, 56, 3, 7, -31, -11, -10, 27, 70, -12, 2, -16, 127, 28, 37, 14, 1, 0, -27, 14, -13, -24, -34, -42, -4, -1, -8, -6, 13, -10, -47, 1, -34, 29, 22, 12, -7, 22, 0, 11, 4, -11, -33, -6, 2, -31, -7, 7, -35, -25, -26, -7, 17, -38, +-46, -9, 17, 0, 1, 20, 13, 31, -23, -21, 12, -30, -19, -30, 20, -7, -3, -12, -23, -38, 65, -47, -46, 8, -2, 10, 21, 31, 45, 40, 67, 27, -76, 1, -45, 16, 26, 10, 64, -29, 2, -15, -28, 48, 18, -40, -23, -38, 111, -33, -2, -37, 20, -17, -7, -4, -17, 35, 10, 8, -36, -44, -32, -24, -18, -5, -8, 27, 49, 4, -19, 40, 11, 33, -29, 37, 15, -9, 11, -2, -39, +27, -39, -13, 12, 6, -11, -50, 16, -41, 5, 11, -33, -20, 10, -5, -41, 27, 24, 28, 17, -48, 10, 35, -25, 95, -30, 35, 37, -20, -51, -4, -41, 31, -16, 80, -18, -16, -28, 95, 17, -29, -41, 43, -34, -30, 60, 15, -74, -40, 50, 15, -30, 1, 11, 24, -16, -10, 14, -15, 90, -45, 51, 9, -19, 33, -44, -7, 91, 4, -19, -21, -29, -15, -47, -62, -59, 13, -65, 19, 67, -55, +-4, -4, -48, -29, -25, 8, -17, 27, -2, -12, 14, 29, -4, 18, 51, -80, -41, 2, -8, -13, -18, 44, 38, -71, 84, -2, -24, -59, 41, -22, -49, 33, 0, -37, -74, 64, -2, -55, -4, 40, 4, 12, 127, 12, -59, -23, -56, 19, 29, 13, 48, 52, -36, 17, -35, 2, -24, -17, 1, -5, 53, -26, 16, -21, -13, -16, 50, 91, -21, -6, -21, -7, -16, 5, 8, 15, -19, -6, 14, 3, 36, +10, 50, -24, -42, 24, 27, -4, 116, 34, -13, -34, 38, 12, 96, 51, -2, -50, -6, -36, -4, -14, -38, -5, -6, 7, 75, 0, -59, 2, 49, -31, -3, -22, -10, -25, -38, 28, 23, -37, -43, 12, -29, -49, 22, -9, 43, 57, 30, 10, -43, 31, -5, 7, -26, 30, -39, -55, 2, -2, -44, -27, -9, 28, 12, -9, -11, 77, -13, -16, -26, -29, 2, -35, -21, 8, 46, 88, -6, 17, 10, -10, +-3, -16, 45, -44, 0, -29, 4, 3, -56, -5, 17, 20, -11, 15, -18, -2, 47, -11, -54, -5, -22, 62, -6, -7, 37, 0, 20, 36, -41, 7, 52, -40, -6, 22, 19, -8, -21, -46, 39, 14, -15, -29, 50, 8, 49, -26, -6, -20, 10, -19, -22, -4, 28, 10, 22, -12, 4, 0, 72, -30, 8, -15, 32, -5, -25, -9, 48, -17, 0, 39, 8, -18, 13, -5, 7, -11, -25, -19, 68, -31, -11, +11, 8, 17, 7, 6, -22, 17, 67, -46, 28, -10, 8, 19, -26, -44, -7, 10, 49, -40, -31, 70, 37, -1, -23, 9, 19, 21, -11, -24, 3, -20, -37, -17, -28, -20, 13, 11, 8, 10, 29, -13, 23, 18, -22, 17, -34, 34, 46, 17, -4, -8, -28, 13, -27, 0, 21, -17, -31, 26, 39, -27, -20, -57, 29, -43, 0, 3, 7, -23, -22, 17, 1, 23, -51, 29, 71, 22, -13, 6, 4, 23, +-30, -14, -13, -44, 12, 39, -15, -46, -42, -40, 0, 7, -10, 26, 62, 7, 7, -17, -15, 48, 13, -32, -5, 4, 1, 51, -13, 6, -16, 18, -14, 3, -31, 23, 9, 12, -26, -29, 6, -14, -14, 32, -9, 9, -12, 9, 29, 1, 7, 36, -47, 47, 101, 127, 63, -31, 97, -25, -3, -84, -23, 10, -67, 95, -2, -6, -26, 9, -9, -5, -32, 112, 48, -47, -38, 29, -1, -43, 4, -11, -26, +53, 3, -52, -41, 20, 66, 11, -12, -4, 6, -7, -11, 2, -17, -20, 79, 17, -43, -1, -34, -12, -45, -2, 19, 5, -29, -15, 55, -9, 40, -3, -15, 10, -6, 7, -21, -28, -22, -44, -5, 102, 29, -7, 32, 20, -14, -21, -3, 18, 4, 2, 42, -23, -30, -17, -61, 48, 21, 24, -37, 15, -22, -36, -11, 76, 19, 7, -37, -19, 44, -4, -34, -12, 38, -47, -12, 15, 9, -17, 21, 9, +-22, 37, 22, 28, 49, 24, -34, 33, 80, -11, 0, -39, -16, -20, 14, 28, -53, 31, 36, 66, -25, 30, 34, 25, -75, -13, 47, -5, 12, 46, 12, 13, -26, -20, 24, 45, 62, 118, 111, -11, 76, 7, -34, -22, -21, -24, -11, 40, -66, -8, 39, -41, 3, -49, -26, 118, -34, 17, -11, -43, 105, -6, 4, 7, 8, -17, -16, 16, -18, -12, -46, -61, 36, -36, -66, 103, -20, 14, 4, -35, -8, +-4, -6, 16, 8, 1, 30, 13, -27, -10, -21, 23, 2, -16, 3, -5, 33, -17, -21, -18, -36, 0, 36, 22, -2, 12, -2, -1, -71, -58, -23, 14, -23, 20, 55, 38, -21, 10, 8, 4, -65, -30, -22, -4, -4, 12, 14, -47, -40, -25, -2, 14, -50, -32, 27, 14, -31, 46, 47, 8, 34, 59, -23, -28, 81, 12, -30, 8, 0, -29, -3, 8, -6, 98, 52, 3, -17, 41, -31, 14, -24, 14, +-25, -13, 29, 2, -23, -59, 14, -28, -45, 27, -22, 0, 15, 10, 63, -62, -28, -22, -21, -16, 15, 47, 40, -26, -22, -21, -10, -25, 22, 53, -66, 35, 24, 50, -11, -66, 16, -15, 15, -23, -18, -29, -14, -2, -42, 24, 5, -37, -16, 0, -36, 29, -19, -15, -4, -16, 21, -49, -55, -26, -27, 30, 11, -10, 19, -16, 7, -41, 28, 22, 32, -27, -5, -28, 56, 37, -18, 14, -45, 6, -2, +-1, -15, -21, 11, 31, -2, 19, 17, 30, 8, -26, -3, -37, -16, -34, -30, 6, -18, -10, -14, -38, -18, 35, -24, 22, 24, -20, 27, -31, -17, 16, -17, -13, 51, 52, 7, -9, -15, -28, -39, 93, -42, 13, 37, 3, 4, 15, 28, 38, 3, -23, 10, -31, 24, -25, -20, -29, -1, -23, 18, -24, -40, 5, -4, -20, 58, 78, 2, -62, 87, -38, -12, -30, 1, 0, -27, -1, 11, -59, 5, -20, +24, 18, 33, -5, -2, 10, -24, -25, 5, -54, -6, -5, 14, 2, 12, -34, -6, -11, 31, 3, -2, -4, 40, -1, 44, -26, -33, 20, 24, -25, 5, 14, -2, -47, 51, 5, 19, 41, 46, -1, 10, 1, -12, -20, -29, -20, -40, 13, 47, 18, -17, 35, 3, 6, -12, -8, 5, -17, -9, 8, -42, 8, -2, -13, 21, -19, 70, -16, 48, -20, -11, -32, 40, 5, 14, 95, 65, 30, -70, -32, 7, +-68, 15, 31, -60, 12, -86, 50, 14, 37, -4, 38, 101, -64, 31, -14, -4, -51, -14, 37, -1, -64, 23, -52, -9, 64, -12, 1, 57, 28, -21, -21, 24, 1, 16, 21, -6, -60, 31, -7, 34, -12, -17, -4, 26, 13, -25, -16, 14, -3, -23, -14, -11, -31, -37, 17, -34, 16, 11, -16, 20, -22, -42, -27, -42, -16, -37, -32, 8, 17, -6, 8, 4, -28, -13, 81, -37, -14, 21, -1, 30, -28, +-35, -12, 86, -1, -15, 15, -43, -5, 35, 1, 85, -26, -31, 24, -45, -36, -39, -27, -24, 3, 42, 28, 22, -27, 21, 45, 23, -8, 0, 67, 19, 15, 0, -71, -50, -23, 57, -48, -6, -36, -14, 23, -40, 39, -48, -65, -35, 19, 7, -75, 19, -25, -4, -55, -5, 59, -69, 90, 127, 54, -28, -5, 110, 25, 60, 53, -60, -23, -61, 56, -61, -60, 45, -10, 24, -56, 25, -10, 7, 52, -25, +-9, 26, -11, -18, 46, 31, -24, 3, 107, -83, 19, 78, -10, -22, 11, -22, -46, 22, -41, -20, 2, 16, -28, -31, 2, 13, 22, -36, -31, 23, 15, 22, -49, -12, -19, 2, -24, -16, 2, -1, -18, 46, -17, -1, -1, 74, 28, 30, -19, -22, 33, -33, 2, -14, -7, -10, 12, 53, -3, 3, -2, 18, 9, 28, -11, -77, 51, 1, -12, 52, -18, 19, -6, 28, 49, 35, -49, -44, -56, 39, 15, +48, -19, 27, -26, 25, 38, -46, -35, -15, 21, 99, -10, 0, 16, -3, -4, -12, 6, -21, -35, 10, 0, 34, -10, 1, -9, -58, -32, 14, -23, -26, -3, -18, 1, 11, -22, 26, -4, -39, 64, -4, -13, -33, 27, 19, 19, 36, 69, 3, 47, 64, -23, -31, -17, 24, 42, 6, -31, 127, 26, 35, 31, -36, -13, 33, 14, 12, 35, -2, -5, 74, 54, 17, 39, -34, -19, -4, 7, 20, 36, -50, +37, 21, -10, 45, 16, -15, 18, -40, -13, -20, 21, 9, 9, -17, 21, 87, 44, 19, 17, -16, 43, -45, 11, 28, -8, -9, 5, -12, -26, 47, -18, -17, -3, -34, 12, 37, -1, -7, 98, 53, -36, 21, 13, -12, -5, -17, -9, 41, 3, 23, -37, -10, -34, -19, -29, 11, -26, 7, -21, 16, -6, -22, 8, -29, 22, 38, -67, -37, 10, -14, 8, -49, -45, -2, 9, -5, 9, 9, -17, -1, -2, +18, 4, -2, 1, 2, -29, 56, -24, -14, -26, 2, -39, 26, -37, -10, 17, -14, -27, -8, -14, 39, 42, -33, -27, -7, 2, -28, -22, 15, -24, 23, -21, 6, -1, -25, -32, -12, 2, -1, 3, -1, 9, -50, -27, -12, -3, -10, 22, -30, -12, 1, -29, 18, -7, -16, 2, 29, 36, -28, 23, 27, -42, -39, 30, 17, 3, 30, -10, -28, -35, 9, 19, -18, 38, 10, -16, 27, 42, -25, 11, -27, +25, 10, 9, 26, 17, 2, 35, 127, 80, 9, -52, 41, -25, 26, 1, -58, 2, 88, 62, -34, -33, -64, 61, -70, -14, -14, -7, 73, -19, -48, 122, -84, 94, -1, 29, -55, -20, -90, 25, 94, -48, 74, 83, -45, -19, -17, 21, 36, 47, 1, -32, -29, 40, -14, -37, 0, -9, -12, -7, 3, -16, -25, 40, -3, -13, 35, -14, -4, -8, -3, 22, -19, 36, -4, -26, 11, 9, 22, 24, -37, 19, +2, 24, -18, -25, -33, -12, -42, 8, 25, 19, -55, 28, -14, 83, -1, -59, -42, -2, -32, 42, -18, 10, -46, 17, -45, -42, -35, 30, 38, -4, 52, 76, -32, -36, -15, 86, -31, 100, 101, -34, -27, 0, 11, 52, -31, 52, -45, 9, -2, 7, -29, -27, -37, 1, 73, -26, -7, 79, -29, 40, -9, 3, 27, -26, -25, 53, -5, -47, -57, -20, -46, -37, 3, 59, -17, 30, -13, -5, 43, -28, -45, +10, -22, -20, -26, -47, 112, -11, 38, -10, -4, -39, 75, -27, 17, -24, 40, -9, -3, 34, 22, -7, -66, -29, 12, -2, -46, -47, -23, -9, -28, -14, -28, 8, -15, 59, 34, -11, 36, 15, 18, -49, 8, 46, -36, 13, 6, -25, -22, -4, -12, -6, -24, -36, -15, -8, -16, -29, -19, 45, 37, -24, -29, 25, 38, -4, -9, -6, -12, -20, -16, 35, 3, 35, 7, -19, 8, -14, -7, 4, 48, -12, +-6, 5, -9, 63, -59, 30, -10, -20, -5, 15, -7, 11, 15, -38, -40, 43, -24, -20, -13, 12, -11, -10, -33, -6, -53, -31, -5, -24, 44, 14, -31, 0, -28, -21, -24, -4, -29, 26, -34, -23, -53, 9, 2, 21, -10, -3, 19, 47, -36, 17, -28, -20, 21, -58, -4, -7, -38, -20, 24, 58, 12, 18, -51, 90, 26, -7, -2, 15, -49, 11, -5, -20, 23, -17, 25, -5, -1, 33, -8, -41, 36, +14, 17, 16, -25, 17, -8, 43, -5, -8, -12, -4, 14, -11, -11, -15, 11, -29, -15, -27, -24, 36, -16, -13, 127, -7, -33, 50, -18, -4, 2, 15, -16, 57, 0, 31, -25, -12, -33, -27, 13, -10, 56, 34, 19, 13, 8, -28, 19, 3, -34, 15, -4, -22, 20, -18, -24, 27, 59, -38, -8, 14, -22, 24, 34, -2, -14, 25, -7, 48, -3, 13, -1, -35, -6, 0, 45, -22, 20, 38, 9, 28, +-31, -12, -6, 32, 16, -16, 25, -45, 14, -33, -28, -7, -49, 12, 22, -32, -9, 37, -22, -23, 3, -11, 0, -33, 38, -57, 25, -27, 4, 33, -22, -25, -32, 17, 38, 43, -23, -24, 20, -6, -2, 87, -34, 44, -58, -31, -25, 22, 37, -2, 109, 0, 0, -24, 66, 64, 72, -1, -4, 18, 5, 24, -30, -34, 36, -6, -15, -12, 58, 6, -10, 26, -1, -21, 6, 22, 9, 10, -24, -30, -30, +-20, 11, 19, -26, -29, -9, 20, 6, 8, -5, 20, -22, -5, 0, 78, -20, 2, -4, 10, 0, -35, 31, 6, 10, 32, 1, 67, -4, 20, 4, -30, 3, 16, 66, 20, 28, -13, 11, 86, -31, 13, 31, 11, -34, 7, -2, -30, 9, 27, 90, 90, -84, -24, 1, -11, -45, -14, 65, 97, 14, -11, 56, -55, -79, -23, -33, -34, 7, 30, 1, -5, 1, -38, 23, -2, 30, -11, -7, -11, -26, -31, +-10, -15, -23, 11, 19, 24, -14, 33, 29, -16, 12, -32, -2, -13, -48, -24, 19, 17, 13, -19, -6, 3, 3, 9, 22, 65, -36, 73, 20, -28, 4, -23, -23, 39, 63, -29, -6, -7, 25, 11, -18, 25, 61, -58, -11, -4, -28, 46, -12, 42, -13, 2, 26, 46, 2, 6, -13, 15, -21, 63, -47, -44, -25, -40, 15, 127, -6, -29, 41, 73, 59, -1, 8, 5, 27, -4, 33, -15, 11, 96, -11, +46, 26, 17, -14, -44, -25, -17, 24, -28, 7, -20, 24, 25, 23, 61, 15, 23, -25, 63, 36, -5, -31, 33, -14, -51, -33, -8, -50, -80, -73, -26, -41, 64, 22, -25, -26, -21, 73, 19, -49, -24, 33, 91, -18, 45, -11, -54, 28, 64, 13, 31, 60, -69, -65, 96, -23, 7, 78, -30, 10, 9, -14, 18, 18, 54, 2, 5, 3, 25, 24, 4, 3, 32, -30, 10, -11, -12, -18, 43, 9, -7, +20, -26, 0, 15, 17, 21, -20, 15, -2, -5, -17, -22, 19, 18, 127, -36, -22, -17, 9, 18, -2, -20, 26, -11, 14, 102, 2, -16, -7, -9, 54, 48, 1, 98, 43, 49, -3, 37, 63, 127, 2, 17, 114, 15, 5, 50, -35, -32, 4, 40, 32, -29, 14, -8, -20, -24, 6, -12, -28, 7, 28, 57, 19, 49, 11, 28, 2, 69, 14, -20, -49, -34, -46, 7, -27, -6, -34, 60, 21, -12, 20, +-17, -23, 25, 12, 16, 127, 6, -13, 7, 10, 66, 4, -26, 9, 9, 41, 10, -11, 15, -19, -60, -44, 24, -9, -42, 10, -15, 11, 37, -7, 80, -18, 7, -18, -15, -7, -30, -8, 0, 0, 5, 37, 16, -19, 5, 28, -7, 70, 9, 2, -18, 41, 36, -16, -31, -7, -6, -18, 34, -9, 21, -7, -39, 10, 10, 21, 15, 18, -18, -22, 4, -23, -22, -10, 33, -7, 8, -35, 50, 2, -16, +31, 9, -28, -15, -48, 1, -35, -23, -38, 127, 14, 13, 13, -7, -40, 5, -39, 22, -8, -1, -13, 47, -22, -12, -4, 46, -11, 0, -1, 30, 73, 4, 25, -9, -13, 10, -78, -3, 15, 17, 39, 44, 28, 16, 5, -24, 45, 52, -28, -55, -11, 19, -15, -13, -25, 40, -33, -2, 127, -12, 31, -7, 19, 13, 15, -10, -28, 105, -29, -55, -1, 50, 34, -12, -43, -56, 1, -11, -39, -3, 11, +-4, -12, -11, -17, -2, -24, 3, 8, 3, 17, 26, -1, -7, -23, 36, 43, 18, 27, 10, 1, 72, 5, 24, -33, 0, 41, -28, 4, 0, -1, -32, -28, -1, 6, 13, 9, -1, 26, -5, -25, 35, 33, 10, -7, 8, -6, 15, -20, 13, -33, -14, 5, 6, 2, -21, 11, -13, 2, 27, 12, 4, -21, 3, -38, -10, 28, -30, -44, -38, 35, -76, -39, -22, -8, 43, -9, -41, -7, -8, 52, -40, +39, -18, -26, 28, 52, -31, -33, 54, 56, -11, -33, -29, 42, -55, -3, 120, 56, 42, 15, -1, -4, -1, -28, 42, 3, -13, 27, 31, 2, 3, 33, 2, -35, -23, -15, 17, -28, -10, -51, 127, -52, 20, -42, 45, -4, -11, 11, 103, -27, 18, -7, -13, 22, -10, -35, 16, 1, 18, -5, 5, 3, 127, -15, -42, 66, 1, -43, -3, -14, -1, 39, 0, 36, 60, -11, -21, -23, 51, 40, -8, 3, +-34, -27, -8, -16, 2, -2, 13, -18, -45, 6, -33, -20, -36, 35, 21, 13, -53, -4, -12, 113, 44, -46, 9, 73, -28, -30, -10, 60, 11, -11, 117, -25, -18, 80, -2, -1, -27, -11, -20, -11, -86, -20, -18, -64, -32, -15, -48, 79, -34, -19, 0, -10, -1, -95, 27, 90, 90, -32, 17, -43, -11, 1, 14, 111, -17, 94, -54, -54, -11, -42, 48, -1, -32, 84, 31, 23, 53, -33, 20, 25, -23, +-56, -55, -3, 27, -28, 11, -49, -1, -42, 13, 5, 46, -8, -17, -3, 1, -47, 4, -22, -18, -4, -8, -8, 8, 36, -1, -15, 7, -30, 29, -13, 46, -16, -16, -6, 18, -19, -9, 18, -50, -26, 19, -24, -22, -1, -22, 12, -12, -11, -4, -4, -73, 40, 15, -13, -3, -2, -6, -38, -44, -26, -67, -28, 9, -59, 24, -29, -14, -38, -22, 60, 7, -19, -46, -53, 47, 42, -11, -33, -48, -29, +58, 119, -20, 58, 27, 7, -22, -32, -58, -30, 17, 69, 29, -29, -13, -5, 3, -29, 3, -12, -51, 44, -15, 9, -21, -21, 45, 19, -25, -11, -6, -3, 62, 12, -54, -3, 4, -16, 47, -20, -6, -5, 7, 9, -30, 13, 26, -28, 77, -11, 24, -13, 53, -14, 25, -10, -16, -5, 4, 6, 10, 10, -31, 8, 19, -56, -11, -12, 9, 9, -34, 17, 6, 8, 15, -40, -6, 8, -27, -34, 1, +-51, 5, -8, 23, 10, -17, 20, -4, -19, 60, -4, 46, 52, -34, 58, -30, 16, 6, 2, -17, 26, 21, -2, 1, -5, 19, -17, -14, 46, -22, -16, 20, -10, 5, 6, -17, 8, -26, 35, 62, -14, -13, -19, -39, -36, -50, 57, 33, -3, 53, 10, -2, 14, 40, -6, -27, 17, 26, 32, -50, -23, 19, 14, -8, 77, -15, 16, -1, -4, -35, 4, -58, -35, 21, -25, -44, -42, -15, -28, -7, -40, +2, 66, -2, -14, -25, -32, 63, -4, 47, -33, -55, -12, -17, 2, 26, 36, -18, 1, 44, 16, 34, -29, -10, -29, 55, -31, 10, -1, 12, 18, -12, -1, 7, -56, 40, -3, 14, 32, -3, -21, 17, 21, -16, 11, 54, -16, 9, 1, 9, -26, 7, -13, 34, -11, -25, 61, -17, -3, -20, 20, -29, 27, -16, 6, 15, 16, -1, -7, -6, -50, 17, 23, 63, -8, -9, -29, -19, -19, 0, -7, -10, +32, -2, 14, 23, -13, -16, -12, -9, -11, 21, -21, -26, 13, 23, -8, 78, 52, -36, -60, 65, 96, -20, -17, -24, -47, -35, -60, 91, -46, 52, -36, 9, -23, 91, 12, 14, -10, 46, -63, -16, -33, -22, -24, -48, -42, 48, 10, 16, -8, 0, 23, 22, 5, -11, -9, -4, -23, 8, -18, -19, -16, 8, 9, 1, 1, -8, -8, -7, 23, -14, -16, 17, 3, -24, 3, 49, 3, 28, -37, -22, -42, +-16, -40, 30, -28, -6, -33, -2, 54, -14, -7, -17, -9, 32, 18, 13, 14, 62, -21, -27, -26, 4, -21, -26, 6, 14, 12, 60, 47, 24, 8, -43, -36, 11, -18, -4, -32, -51, 110, 39, 122, -6, -2, 105, -34, -42, 41, 17, -56, 27, -2, -50, -21, -35, 30, -15, 89, -41, -33, 62, -8, -48, 69, -29, 4, -20, -18, 81, 63, -24, 31, 63, 22, -26, 23, -14, -34, -16, 23, -31, 19, 20, +-68, -19, 7, 55, -3, 25, -3, -6, 20, -4, 10, -4, -20, -53, -23, 12, -18, 62, -30, -21, -54, 42, -15, -19, 72, 12, -32, 50, 69, 27, 45, 60, 62, -89, -48, -6, 55, -25, -41, -1, -65, -75, 19, 121, 5, 28, -3, 1, -45, -25, 46, -25, 47, 30, -8, -4, 7, 16, 37, 8, -24, 8, -20, 31, 26, 66, 37, -14, 17, 49, -27, -17, -10, 2, 3, -44, -16, 45, 21, 2, 34, +66, 64, -29, -45, 5, 26, -14, -52, -38, -7, 29, 61, -28, -50, 48, 7, -6, -26, 25, -48, 86, 6, -11, 11, 31, 38, -34, 12, 4, -32, -7, -32, -22, -23, -6, 67, 10, -33, 12, 3, -7, -18, 58, -30, -4, 52, -26, -19, -46, -33, 27, 10, -1, -26, -36, 7, 52, -56, 41, -27, -13, 49, -20, -10, 57, 2, -4, -48, 42, 6, -24, 16, 31, 20, 107, 6, 5, -5, -16, 27, -20, +-5, 5, 41, 23, 90, 36, 40, -7, -26, 8, 14, 6, -63, 25, -11, -13, -31, -48, 36, -17, -13, -17, 8, -24, 71, -9, 9, -31, -46, -5, -1, -27, -16, 32, 12, -3, 36, 38, 14, 28, 0, -5, 13, 7, 17, 26, -1, -42, -17, -68, -11, 78, -43, -63, 22, 56, 6, 27, -19, 26, -9, 8, 41, 47, -15, 31, -35, -33, -30, 0, -11, -15, 27, 96, 13, 46, 30, -38, -14, 8, 26, +-23, 7, 13, -20, 21, -11, 1, 48, -15, 0, -34, -53, -47, -26, -95, -23, 17, 57, 12, 21, -23, 4, -32, -42, -7, -26, 5, 15, -19, 16, 7, 17, -20, 15, -9, -31, 63, -3, 5, -18, 23, -74, 24, 21, -35, 4, -7, -24, -24, -17, -35, 24, -18, 11, -9, -31, 20, -16, 16, -3, 40, -13, 51, 22, -34, -27, 14, -23, 49, 8, -16, -12, -16, 23, 1, 36, -17, 57, 37, 38, -23, +19, 127, 31, -22, 15, -21, -28, -55, 3, 0, 6, 7, -19, -6, 18, 1, 0, 19, -30, -36, -36, -30, 12, 5, -17, 14, -8, 9, 22, 59, 21, -1, 17, 19, -4, -14, -34, 3, -45, -9, 6, -39, 47, -48, -35, -20, 29, -8, -66, 50, 47, -32, -19, 21, -5, 55, -18, -11, -42, -1, -2, 14, 100, -7, -28, 20, -50, 2, -82, 34, -46, -69, -33, -32, -36, 48, 41, -35, 3, 32, -5, +-1, 31, 84, 67, -31, 33, -16, -33, 19, -64, 80, 11, -28, 109, -15, 4, 71, 19, -33, -12, 17, -29, 22, -76, -20, -25, 24, 3, -19, 2, 3, -63, 50, -23, 10, -20, -17, 58, 40, 10, -26, -5, -11, 7, -27, -26, 0, 17, 25, 22, -4, 1, -41, 29, -20, 41, -19, -21, -16, 35, -25, 38, 0, 3, -38, -43, 49, 0, -27, -3, 2, -20, -46, 46, -34, -69, -23, 0, 18, 1, 21, +-18, 0, 14, -8, 8, -13, -6, 2, -6, -12, -42, 13, -11, -31, -12, 32, -13, -7, 31, -78, 18, 25, -38, -10, 33, -42, 36, 17, 31, 29, -13, -22, 7, -6, 51, 19, -33, -5, 64, 26, -8, -47, 30, -19, 28, 20, 9, 0, -47, -49, 49, -22, 25, 21, -23, -4, 25, -16, 48, 42, 61, -23, -14, 17, -5, 1, 31, -8, -52, 5, 16, -34, -14, 10, -16, 25, 6, 8, -3, 49, -8, +-52, 2, 5, 3, 26, 3, -36, 71, -10, -3, 107, 46, -14, 65, -36, 27, 67, 39, -35, -27, 82, -17, 4, -13, 63, -13, -27, 16, -20, -46, 34, 22, 35, 55, -3, -11, 33, -44, -4, -21, 42, -41, -3, -21, 1, -12, -38, -21, -56, -62, -34, -18, -13, 2, 2, 2, 39, 36, -44, 48, -13, -28, -30, -11, 20, -41, 29, -25, -11, 37, 41, -12, -8, -12, 25, -19, -34, -34, 13, -49, 17, +4, 27, -40, -10, -28, 3, -10, -10, 13, 8, 32, -9, -14, -46, 7, -29, -18, 3, -62, -9, -40, -30, 3, 26, -10, -52, -46, 82, 9, -36, 102, -15, -27, -16, -19, -13, -11, 39, 2, 19, -69, 24, 40, -19, -11, -15, -8, -5, -21, 1, -58, 14, 11, 70, 11, -12, -16, 27, 0, -42, 55, 19, 4, -50, -76, -17, 30, -2, 80, -12, -11, -8, -4, 10, 18, -7, -40, -3, -5, -3, -34, +8, 5, -26, -3, 22, -27, 12, 7, -23, 11, -19, 10, 16, -8, -30, 10, -6, 18, -16, -62, -33, 25, -1, 68, -34, -10, 0, -61, -68, -3, -18, -44, 16, -10, -10, -3, -1, 30, -44, -17, 1, -7, -16, 59, -3, -13, 60, -4, 20, 16, 11, 59, -10, -4, 14, 13, -31, 107, 30, 37, -62, -29, -31, -2, 36, -63, 9, 8, 59, -10, -13, 56, 19, -11, 1, 35, 0, -19, -7, -26, -32, +-12, 88, 17, -10, -26, -42, 29, -41, 18, -20, 29, 36, -12, -2, -6, 18, 63, -21, -40, -3, 17, -20, 33, -48, 18, -29, -1, 26, 38, 10, -28, 25, 47, 6, 92, -3, -6, 5, -14, 5, -13, 7, -2, -21, 50, -35, 34, -23, -17, 18, -38, 0, 21, 10, -22, -3, -6, -24, 87, 18, -31, -2, -3, -2, -53, -17, 90, 20, 2, 98, -1, -29, 7, -13, -1, -25, 5, -6, 50, 15, 2, +-35, -13, 7, -9, 57, 15, 39, -31, -33, 101, -45, -30, 55, 35, -48, -4, 13, -6, 1, -6, -53, 81, 35, -15, 2, -5, -32, 23, -5, -1, -14, 9, 72, -39, -67, 5, -29, 34, -50, -16, 55, 55, 29, 7, 15, 99, 17, 105, 51, 29, -19, 26, 9, 6, 6, 39, -2, 48, -25, 14, -15, -41, -16, 4, 2, -21, -43, 13, 13, 7, 2, -23, 50, 127, 4, -6, -5, -21, 6, 26, 13, +-15, -1, 44, -5, -14, -40, 24, 97, -1, -10, -46, -44, -13, 35, 46, -41, -15, -18, -28, 0, -17, -32, 6, -55, -10, -10, 5, 13, -1, -2, -30, 37, 6, 11, -39, 15, 67, 3, -5, 12, -59, -53, -23, -19, 6, -14, -33, -2, 71, -19, -26, 79, 31, 86, -8, -20, -11, 33, -43, 28, -60, -19, 32, 4, 11, -15, -46, -8, 50, 15, 54, -15, -27, -13, 13, 37, -20, 11, -26, -18, -5, +-5, -28, 31, -10, -16, -7, -23, 10, 35, -26, 49, -31, -4, -1, -17, 2, -18, -14, 36, 27, 61, -16, 37, -24, -12, -24, 19, 2, -19, 45, -20, 0, -37, -9, 18, -1, 127, -3, -50, -44, -50, 27, 2, -12, -21, -4, -18, 20, 7, -1, 7, 16, -26, -15, -25, -19, -36, 29, 43, -7, -16, -37, 36, -13, -31, 0, -33, 3, -28, -32, 61, 13, -25, 58, -38, 26, -30, 4, -40, -1, -7, +-2, -7, 21, -42, -20, -16, 39, -17, 16, 127, -8, 3, 59, -26, -3, -31, -23, 50, 15, -15, 8, -15, 38, 76, 60, -12, 102, 39, -33, 59, 32, 80, -2, -19, 8, -48, -15, -17, 5, 60, -26, -31, 30, 28, -36, -3, -36, -17, 95, -1, 22, 66, 12, -39, 3, -15, 48, 29, -18, -16, -16, -7, -27, -3, -16, 88, -26, -58, -10, 29, -7, 1, 15, 10, -37, 69, 7, 11, 48, 50, 46, +-3, 0, -26, 7, 4, -35, 42, -17, 3, -9, 8, -20, 10, 53, 8, -19, 32, 16, -13, -28, 26, 44, 16, 25, -47, 42, 7, -5, -7, -10, 9, 71, -33, -27, 5, -9, -14, 6, -28, 10, -22, 22, 16, -44, 25, -5, -37, -5, 88, 44, 37, 23, -26, 22, 67, 45, 32, -21, -38, -14, -28, -20, 40, 2, -28, -26, -46, 3, -69, -4, -12, -12, -9, 2, 16, -13, -16, -21, -3, -26, -26, +5, 20, -12, -43, -67, -48, -40, 34, -7, -13, -19, 9, 53, 10, -18, -12, 5, 41, 19, 61, -38, 81, 40, 10, 3, 4, -1, 100, 8, -7, 7, -5, -2, -16, -10, -60, 22, -28, -13, 6, 38, -44, -5, -33, 2, 48, 4, -37, 5, 23, -55, -11, 11, 15, -12, -1, 56, -35, -52, -9, -7, -9, 17, -40, -22, -49, -17, -10, -32, 3, -7, 20, -40, 11, 7, 26, -10, 6, 11, 3, 10, +-8, 21, -3, 10, 14, 27, -7, -22, -27, -15, -16, 8, -41, -1, -26, -13, -21, -34, 75, -12, -18, -4, 20, -43, -77, -25, -3, -40, 27, 36, -35, -16, 38, -24, 17, -32, 12, 65, 34, 6, 34, 17, -13, 21, -3, 20, -37, 3, 3, 33, -17, -3, -31, -9, 42, -37, 49, 72, -17, -5, -12, -34, -11, -26, -7, 52, -25, -18, 63, -33, -37, 16, 2, -4, 32, 8, 40, -45, 10, 10, -8, +-32, 7, 23, 22, -28, 19, -6, -13, -22, 82, -31, -20, -11, -12, -3, -42, -22, 32, -13, -7, 19, -42, 18, 9, -49, -45, 2, -35, -18, 35, 80, 17, 53, 13, 45, 13, 23, 127, -14, 78, -30, -33, 72, 6, -3, 23, -20, -24, -20, -28, -39, 34, 86, 11, 22, -9, -55, 94, 62, 24, 1, -29, -66, 5, 27, -10, -24, 29, -44, 85, 20, -21, 42, -33, -1, 18, 37, 16, -41, 43, 3, +7, -51, -3, 15, 0, -48, -33, -15, -30, 11, -14, -18, -24, 3, 26, 33, -2, 28, -42, -23, -35, 33, -10, -51, 20, -33, 8, 9, -40, -22, 5, -8, 11, -9, -18, 19, 14, -40, -22, -14, -20, -24, 8, 17, -41, -21, 35, 24, 56, -26, -40, -36, 28, 34, 37, -62, -17, -12, -53, -46, -7, -32, 13, -13, -22, 23, 42, -9, 58, 82, 28, -4, 63, -40, -49, -50, 26, -20, 86, 18, -23, +-66, -7, -9, -29, 22, -17, -39, -18, 28, -13, 0, 34, -4, -3, -27, -3, 23, 1, -5, 54, 26, -67, 8, 64, -9, 34, -4, -11, 11, -7, -19, -26, -15, -38, -20, 22, 22, -8, 6, -21, -7, -38, -18, -1, 24, -24, -15, 16, 5, -2, -30, 28, 63, 5, -11, -11, 9, -70, -33, 12, -24, 50, -12, 25, 3, -37, -56, 106, 12, 48, 39, 115, 35, -20, -7, -14, -29, 10, 18, 1, -54, +-62, -20, 23, -64, -23, -7, -3, -13, 19, -15, 11, 6, -32, -4, -37, 20, -26, -35, -27, -49, 26, 54, -20, 20, 33, -3, -46, -45, 80, 17, 55, 17, 14, -30, 22, -57, -9, -9, -25, 18, -4, -20, 21, -25, 15, -43, -55, 29, -22, 0, 40, -7, -8, 2, 9, 7, -3, -10, 20, -27, 1, -51, -31, -2, -24, -25, -42, -34, 0, 9, 17, -28, -34, -48, -17, 8, -8, -18, -70, 127, -23, +6, 6, 16, 45, 69, -8, 7, -38, 17, -52, -30, 9, -18, -11, -18, 13, 2, -25, -117, -13, 8, 44, 5, -45, 30, -12, -10, -40, -17, 15, -32, -34, -14, -37, -30, 17, 8, 19, -43, -1, 25, 8, 21, -11, -33, 22, -5, 3, 28, 7, 54, 5, -12, -36, 21, 7, 121, -1, 34, 61, -32, 18, -12, -53, 56, 61, 19, -17, -16, -15, -36, -33, 12, -6, -13, -9, 15, -51, 8, -42, 14, +2, -11, -26, 28, 8, -31, -20, -28, 9, 51, 4, -28, 54, -13, 25, -6, 31, 4, 12, 37, -23, 21, -63, -18, -22, -37, 11, -16, 28, -3, -40, -19, -9, 13, -12, 37, 25, -14, 13, -68, 7, -6, 1, -11, 50, -47, -6, -40, 20, -37, 25, -21, -80, -1, -25, 13, 17, 75, 47, -42, -13, -78, 5, -15, 8, 76, -5, 26, -1, -43, 88, 54, -9, 6, 3, -42, -14, 3, -19, 10, -3, +-2, 9, -27, -5, 7, -21, -19, 63, -11, -9, -34, 2, -31, -34, 1, -34, -62, -41, -31, 6, -23, -17, -12, 5, 0, -28, -18, -11, 27, -9, 7, 62, 6, -8, 41, 21, -37, -25, 2, 2, -48, 7, -4, 89, -17, -1, -26, -10, -22, -22, -42, 21, -9, -66, -13, -2, 20, -29, -34, -24, 33, -8, -33, -51, 16, 5, -23, -5, -15, 0, 30, 47, -21, 10, 3, -12, -1, -15, -4, -59, -10, +-10, -33, -28, 8, 6, 7, 17, -3, -1, -80, -29, -64, 13, 27, 9, 25, -17, -18, 53, 12, -12, -10, -27, -35, -27, 42, 3, -20, -64, -29, -34, 1, -26, -24, -11, -29, 41, 5, -11, 30, -28, -32, -6, 4, -20, -11, 7, -34, 50, 4, -20, -18, 5, -4, 16, 23, -2, 13, -4, -30, -5, -9, -3, 17, -15, 12, -21, 28, -5, -36, -25, -25, -18, -49, 11, -16, -41, 10, -10, -53, -5, +-30, 75, 14, 29, 22, 19, -65, 50, -2, 0, -38, -3, -6, -21, 73, 6, -30, 23, -28, 118, -35, 41, -40, 27, -41, 78, 57, -19, -29, 23, -25, -62, -38, 41, 18, -5, 43, 36, -33, 18, 38, 1, -16, -5, 40, 1, 85, -23, 21, 14, 30, 9, 57, -40, -21, -2, -19, 21, -52, -14, 10, 49, -45, -62, 8, -7, -5, 6, -37, 35, -39, -12, -56, 18, -16, -34, 13, -17, -12, -69, 65, +24, -14, 19, -14, -19, -19, 4, -10, 3, -30, -31, 8, -56, 6, 19, 3, -11, 10, -4, -9, 33, -25, -28, -44, 14, -42, -20, -7, -16, 41, 23, -13, -26, 62, 22, 7, 124, -42, 44, -40, 56, -29, 19, -27, 31, -31, -24, -2, -20, -28, -3, -40, -19, -19, -29, -21, 62, 35, 4, -18, -14, 45, 2, 13, -37, -13, 34, -23, 41, -18, 22, 34, 1, -11, -18, -17, 6, 106, 36, -11, -6, +30, 14, 22, 57, -13, 14, 10, -16, 6, -22, 32, -21, -12, -10, -6, -13, 12, -27, -63, 108, 57, 37, -46, 59, 27, -5, -21, 46, 49, 12, -28, 49, 14, -19, -26, -35, -39, 40, -16, 84, 4, 26, -72, 14, -52, 7, 125, -17, 9, 9, 127, 52, 85, -27, -17, -13, -64, -16, -5, 11, -20, 1, 12, 56, -12, 21, -35, -6, 15, 56, 13, -51, -54, -32, 55, 4, 63, 7, -10, 13, -30, +24, 19, 37, -27, 10, -16, -12, -2, -33, -34, 4, -36, -10, 12, 5, 39, -25, 6, 8, 73, -6, -12, 8, 43, -2, 27, -22, -24, 17, 13, 25, 71, -34, -21, 47, 11, -13, 23, -40, 17, -37, 37, -30, 24, 14, 1, -20, -37, -20, -8, -6, -36, -11, 62, -27, 32, -6, 9, 21, 11, -8, -7, 7, 55, -53, -83, 38, -1, 0, 3, -31, -45, -72, 68, 43, -35, 20, 65, -6, -65, 48, +3, -28, -14, -23, 34, 31, -20, -33, -30, -49, 8, -7, -12, 47, -8, 36, 4, -33, 10, -16, -38, -26, 1, -19, 41, -17, -81, -28, 56, 37, -10, -42, -6, 6, -6, 27, -9, -7, -62, 0, 31, -68, 46, -35, -26, 33, 40, 19, -24, 0, 9, 8, -25, 39, 5, -32, -7, 62, 19, 35, 70, -25, -9, -21, -28, 50, -20, -16, 15, 59, 2, 24, -19, -17, -17, 20, -44, 28, 29, 9, -9, +-43, 96, -35, -34, -41, -4, 1, -22, 24, 10, 13, 7, 17, -10, -6, -14, 4, -4, -17, -25, -44, -7, 9, 32, 7, 11, -5, 7, -19, 88, -66, -25, -93, -36, -19, 9, -38, 27, -33, 39, -36, -33, 32, 28, -33, 28, 29, -59, 67, -17, -5, -49, 89, 21, 55, -4, 57, 68, -12, 86, 67, -39, -15, -38, 19, -13, 6, 14, -2, -13, -17, 10, -7, 2, 20, 57, -11, -15, -8, -16, -8, +-4, -20, 53, 27, -13, 28, 52, -14, 12, -52, 12, -16, -52, -3, 3, 45, -39, -43, -2, -75, -31, 9, 6, 18, 11, 27, -36, -31, -26, 31, -15, 28, -26, 2, -29, -31, -42, 0, -27, -43, -31, -58, -4, 18, 39, 22, -54, -1, 14, 22, -41, -17, -48, 19, -26, 13, 4, 23, -7, -8, 28, -29, -30, 41, -5, 106, -9, -24, -30, 127, 58, -2, -7, -4, 20, 74, -10, 34, -11, -43, -1, +3, 24, 11, 22, -29, 49, -1, 69, 8, 6, -2, 14, 18, 54, 21, 20, 33, -21, 4, -7, -4, -26, -14, 33, -20, 32, 10, -18, -20, 51, 17, -39, -26, -25, -49, 32, -32, 81, -32, 14, 24, -51, 41, -14, 33, 18, 33, -34, 41, -42, -38, -28, 6, 9, -9, -7, 46, -21, 9, -13, 18, -24, 49, 13, -77, -42, 11, 127, 1, 1, 15, 55, 0, 3, 15, -13, -4, -3, -41, -1, -8, +78, 31, 31, -3, 4, 1, -26, -17, -3, 19, -19, -1, -38, -2, 31, 25, 18, 18, -3, -9, 23, 32, -6, -47, 2, 2, -22, -8, 39, -7, -35, -5, 4, -1, -16, 35, 15, -24, -3, -12, -45, -15, -54, 20, -6, -5, 17, -25, 16, -34, 47, -48, 50, 90, 24, -32, 1, -9, 5, 11, 18, -19, -28, 61, 13, 31, 49, -12, -21, 66, -31, -34, -44, 64, 76, 58, 45, -22, -20, -5, 25, +41, 2, -40, 23, -52, -24, 15, -13, -26, 16, 13, -14, 27, 7, 15, -36, -30, -52, -30, -16, -6, -5, -14, -1, -13, 3, -6, -8, 21, -16, -7, -28, -33, -27, 1, -23, -48, -25, 15, 4, 7, 0, -33, 12, 30, -12, -26, 7, 42, -16, 10, 22, 10, 70, -39, 23, -4, 33, 51, -14, -32, -7, -68, 124, -32, 27, 31, 25, 9, 18, 31, -10, 94, -35, 5, -5, -16, 5, 117, -18, 79, +-13, 10, 0, -45, -42, 48, -19, -3, 24, 49, -43, -5, 37, -13, 126, -4, 46, 26, 47, -34, 63, -4, 78, 117, -66, 21, 6, -37, -5, 127, -21, -5, 0, 28, -23, -18, 4, -4, 28, 8, 6, -33, 33, 10, 23, -22, 53, -12, -32, 7, 10, -44, -1, 16, -49, 40, 3, 14, -4, 44, -39, -18, -17, 31, -7, 40, 8, 20, 34, -51, 47, 38, -44, 44, 45, -5, -20, 19, -31, -32, 41, +35, 35, -13, -39, -12, 45, -36, -19, -9, 55, -2, 6, 8, 31, -3, -11, -4, 0, -21, -28, 12, -31, 27, -28, 6, 53, -10, -37, 6, 10, 23, -29, 39, 38, 10, -27, 28, -26, -35, -10, 15, 29, -24, -10, 22, 11, 16, 7, -15, -1, 33, 68, 16, -9, 40, -35, 124, -14, -87, -12, -43, -60, 9, 45, 76, 94, -16, 11, -11, 0, 85, -44, -14, 38, 14, -13, -56, 7, -56, -42, -13, +47, -8, -6, -19, 23, -2, -9, 127, 20, 12, -22, 13, 20, -11, -29, -9, 17, 22, -8, 7, -1, 21, -22, 43, 21, -38, 68, 2, 23, 43, -13, 4, 2, -12, -6, 21, -22, 15, -46, 50, 78, -12, -23, 2, 48, 44, 16, -19, -18, 3, 26, 9, 3, -29, 117, -18, -27, -9, -33, 53, 22, 2, -62, 46, -5, 9, 77, -32, 32, 12, -26, -40, -16, -3, 22, 21, -41, 64, -33, -31, 56, +11, -47, 44, 12, 39, 50, 19, -48, -2, 12, -19, -7, 60, -54, 1, 7, 30, 99, 6, 39, 43, 41, 4, 9, 46, -21, 4, -2, -108, 44, 44, -49, 9, 54, -34, -2, -21, -18, -2, -45, -42, 52, 3, -45, 51, -56, -36, -41, 27, 23, -4, -59, 26, -48, -4, 24, -10, 46, -18, -34, 41, -12, 4, -18, 46, 4, -33, -20, 47, 10, -30, -19, 8, 0, 3, 24, -41, -2, 44, 61, -23, +-37, -9, 9, 0, -17, 22, 31, -6, -37, 43, 9, 22, -2, -44, 31, 63, -3, -41, -30, -25, -2, -10, -39, 28, 65, -33, -48, 49, -20, -15, 3, 1, 12, -6, -4, -20, 14, 4, 6, 17, 40, -16, 1, 54, -17, 0, -49, 2, 0, -17, -29, -9, -12, -21, -28, 127, -42, -30, 16, -16, 83, -11, -3, 36, 7, -5, 58, 12, -22, -52, -34, 31, 24, 9, -4, -9, 25, -13, 7, 31, 27, +3, 16, 22, -5, 37, -7, -22, 44, -28, -45, -16, -25, 54, 1, 74, 18, -12, -28, -16, 78, 13, -16, 50, 23, -37, 37, -1, 23, 31, 27, -33, -19, -19, 9, 7, 37, 42, -1, -15, 14, 35, -10, -26, 21, -43, -21, -17, 4, -1, -42, -22, 0, 15, 22, -8, 5, 6, 2, 23, -33, -75, -29, 0, 24, -12, -5, -30, -6, -28, -8, -13, 4, 15, -21, 3, -2, 22, 65, 1, 18, -10, +-15, -15, 19, 16, -41, 7, 5, -4, -43, 25, -17, -38, 41, -30, -7, -60, -18, -15, 10, 22, -25, -29, 127, -27, -16, 7, 12, 16, -16, -2, 36, 21, -45, 40, -7, -59, -22, -12, -41, -48, -25, 11, 24, -84, 36, -10, -35, -58, 17, 10, -32, 104, 17, -19, 95, -57, 35, -16, -44, 55, -11, -6, 13, 23, -28, -6, -39, -19, -13, 35, -35, -9, -34, 22, -60, -14, -11, -7, -28, 21, 3, +7, 18, 7, -7, -5, 56, -59, 7, 26, 48, 6, 5, -30, 15, -27, 127, -35, -18, -11, 10, 16, 9, 7, -27, 36, 63, -10, -21, 8, -10, 0, -18, -27, -21, -29, 5, -29, -6, -29, -20, 31, -30, -5, 5, 17, -9, 59, -12, 37, 13, 34, 20, -56, -10, -18, 72, -29, -30, -40, 29, -21, 69, -14, 11, 52, 21, -7, -41, -47, -11, -6, -12, -8, 10, 23, -4, 15, -34, 35, -36, 27, +24, -18, -32, 92, 0, -4, 38, -63, 31, 4, -13, -28, -24, -41, -28, 15, -25, 61, -37, 5, 127, 9, -42, 41, -10, 65, -32, 37, 10, -18, 13, -1, -11, -8, 17, -13, -24, -3, -3, 2, 69, -8, 96, -26, 30, -2, 20, 7, 14, 54, -1, 48, 54, 33, 14, 54, -5, -16, -20, 57, -32, -7, -33, 57, -16, -19, 4, 18, 61, 22, 51, 37, 57, -35, -17, -2, 74, -33, -77, -38, 20, +3, -52, -13, -21, -22, 18, 33, -1, 54, 11, 29, -6, -16, 43, -16, 30, -12, 19, 3, -37, 18, 19, -6, -51, -22, 33, -35, 74, -8, -11, -5, 4, 49, -19, -11, -24, 22, 40, 9, 6, 5, 23, 116, 63, 60, 11, 8, -5, -20, 30, 59, -34, 69, -1, -24, -53, 13, -29, 1, -49, -14, 18, -24, 60, -54, 13, 21, -2, -4, -2, 6, -16, 20, -31, 24, -14, 54, 52, -27, 10, -7, +-1, -10, 15, -15, -24, 39, 127, -27, -30, -41, -14, 11, -11, 35, -64, 10, -26, 32, 55, -39, -27, 26, -32, -9, -18, -33, -14, -55, -4, 4, 14, 7, -26, -9, -44, 80, 47, 67, -19, 46, 24, 14, -4, 64, -45, -32, -52, -3, 41, 3, 12, 69, 45, 34, -8, -2, 16, -64, -6, -42, -24, 15, 5, -29, 9, 0, -13, 19, -4, 7, -25, -21, -20, 8, -54, -18, 18, -7, 37, -23, 12, +-4, 0, -20, -1, 80, -10, 27, -23, -17, -35, -1, -22, 15, -18, 47, -11, -16, 1, 61, -9, 10, 27, -9, -7, 10, -13, 35, -44, -27, 34, 24, 43, 7, 42, 44, -16, -19, -21, 57, 43, -34, -39, 17, -8, 32, -32, -30, 64, 13, 62, 25, 68, -42, -18, 6, 6, 6, 23, 11, -40, -24, -10, -39, -37, 13, 21, -96, 87, 26, -46, 5, -17, -4, -7, 5, 61, 33, 41, -2, -16, 60, +-10, -23, 29, 27, -17, 3, -29, -10, -50, -20, -25, 12, -4, 16, 3, 51, -42, 49, -2, 3, -5, -41, 6, -17, -18, -37, 28, 28, -15, -19, -48, 37, -16, -35, -40, -16, -7, -18, 29, -14, 58, 34, -11, 14, 51, -20, -34, 5, 5, -6, -21, -28, -41, -8, 0, -16, -10, 120, -24, 14, -34, -4, -41, -20, -2, -67, 69, -52, 1, 26, -3, -74, 67, 6, -13, -10, 49, 14, -41, 18, -14, +31, 19, -7, -42, 28, 4, -30, -9, 69, -10, -37, -27, 54, 18, -1, -21, 92, -67, -19, 14, -2, 22, -9, -7, -41, -30, 4, 14, 34, -24, 34, -5, 52, 43, -11, -26, -7, -31, -2, -9, 3, -34, -34, -46, -30, 8, -10, -54, 24, -1, 14, 11, 63, 25, 22, -2, 71, -10, 43, -4, 54, 5, 36, 24, -47, -4, 7, 6, 31, 2, -5, -23, -22, -26, -22, -2, -15, 71, -5, -9, 3, +66, 30, -20, -46, -37, -21, 5, 80, -40, -7, -26, -17, -7, 28, -6, -35, -55, 64, 19, -19, -28, -10, -26, -11, -5, -16, -46, -13, -48, -15, -4, 45, -17, -50, 20, 6, -26, -30, -37, -5, -8, 7, -29, 3, -36, 43, 19, -14, -15, 66, -1, 33, 11, -20, 74, 17, -4, 30, -30, 3, -1, 7, -8, -14, 10, -19, 4, -34, -13, 6, 4, -9, 28, 7, 39, 19, -60, -22, 40, 0, -1, +-7, -16, 3, -19, -17, 10, -13, -25, 27, -19, -34, 25, -24, -36, -2, -26, -44, -41, -45, 21, -9, -11, -26, -2, -37, 9, -27, -22, -36, -98, -37, 19, 12, 2, 78, 12, -20, -16, 0, 17, -29, -25, -1, -8, 42, -11, -18, 22, -24, -74, 54, -17, -1, -16, 21, -33, 7, 5, -52, -52, -54, -9, -3, 28, -6, -20, -9, -43, 9, 20, 24, -73, -6, -40, -12, -40, -39, -13, -36, 2, -31, +-29, 4, -21, -49, 38, -33, 8, 75, -5, 36, 56, 10, 50, 76, -52, 7, -7, -6, -26, 36, -62, 5, -32, 79, -5, 4, 30, -7, -47, -14, -23, -11, -19, -2, -30, -14, -13, -35, 56, 4, 10, -15, -31, -55, 35, -47, 23, -27, 14, 34, 9, 0, -22, 54, -8, -11, -15, 19, -37, -81, -18, 40, 43, -60, -6, -42, 37, -81, -13, -2, 14, 35, 10, -84, 15, 17, -7, 7, -22, 14, 58, +13, 8, 73, 101, -7, 16, -22, -45, 22, -2, -5, 26, -18, -8, -12, -52, 1, -51, -31, -38, -2, 14, 9, -28, -23, -23, -2, -9, -86, -23, -24, 41, 10, 41, -64, -65, -29, -69, 7, 32, -31, -20, -21, -44, -9, 8, -33, -33, -4, -54, -2, 21, -30, 84, 14, -57, 18, 23, -4, 19, -61, -21, -7, 48, -19, -44, -37, 6, -33, -47, 22, 21, -2, -17, -15, -9, -5, 14, -29, 33, 21, +2, -17, -10, 3, -19, -15, 9, -23, 26, 2, -8, -19, 30, -12, -18, 3, -1, -26, -8, -5, -3, 13, -1, -1, -48, 5, -21, -40, -58, -8, 25, 49, -59, 13, 2, 9, -36, -19, -16, 42, 54, 20, 5, 13, 2, -7, 2, 2, -39, 15, -5, -27, -33, -26, 36, -6, 7, -40, 42, 1, -27, -8, -8, -53, -45, 7, -52, -12, -34, 7, -38, -30, -21, 19, 35, -1, 34, 25, -16, 50, -42, +36, 70, 14, -20, 40, 22, 57, -11, -25, -18, 47, 28, 1, -10, -7, -15, -15, -6, -46, -6, -29, 11, -8, 17, 73, -27, 54, 15, -13, -13, -19, 0, 58, -22, 23, -10, 45, -25, 22, -4, 7, -30, 7, -7, -21, 117, -16, -37, 27, -26, -58, 44, -32, 58, 24, -28, -17, -1, -55, -17, 11, -50, 24, 12, 10, 41, 65, -54, 119, -29, -34, -49, -78, 9, -28, 10, -10, -24, -32, -4, -27, +29, 29, -55, -3, -26, -21, 8, -27, -2, -17, -27, -39, 38, 49, -35, 59, -20, 2, -6, -19, 17, -30, -19, -22, 8, 46, -4, -4, -53, 8, 46, -30, 5, 47, -15, 24, -16, 3, -70, -1, -9, -27, 10, -12, -31, 18, 23, -56, -2, 73, -54, -11, 29, -27, -3, -26, -9, 10, 1, 18, -5, -20, 15, 35, 9, -40, -37, -31, 34, -7, 34, -54, -42, 64, -41, -16, 31, -19, 20, 30, 38, +93, -35, -20, 1, 3, -2, 4, -5, 73, 21, 11, -10, 45, -14, -19, -36, -12, -16, 28, -2, -7, -18, -36, 27, -20, -10, 23, -9, 50, 86, 33, 22, -14, -24, -17, -22, -36, 40, -16, 0, 11, 50, -44, 28, 11, -4, 78, -16, -20, 82, 27, -20, -31, 2, -21, -11, -56, -9, 49, 49, 36, -22, -13, -15, 55, -32, 38, 12, -59, -6, 19, -11, -2, -14, -30, -30, 2, 17, -54, -24, 0, +44, 22, -36, -33, -33, -35, 18, 71, -32, -22, 4, -9, 22, 12, -26, -27, -20, -30, 127, -29, 45, 10, -1, -31, 8, -18, 0, 48, -18, -24, -41, -52, -24, 7, 29, -20, 34, 48, 16, -3, 19, -75, -65, -2, 44, -43, -64, -23, 9, 3, -7, 11, 18, 30, -11, -14, 37, 7, -4, -11, -35, -3, 37, -7, -33, -47, -27, 74, -13, 14, -31, -23, 14, 38, 55, -14, -7, 50, -8, 1, -48, +24, 14, -36, -3, -35, 32, 10, -20, 76, -20, -36, 20, 44, -25, -39, -7, -12, -26, -23, -3, 18, 34, 48, 10, -5, 8, -37, -5, 28, -1, 15, 38, 14, 29, -35, -10, -36, 7, -30, 41, 48, 1, -22, 16, -17, 21, -48, 37, -13, 7, -8, 8, 28, -41, -23, 4, 3, 30, -29, -35, 57, -37, 59, -37, -31, -20, 74, 22, 46, 12, 10, 40, 11, -51, -26, -38, -14, 38, -24, 61, -9, +-10, -20, -21, -20, 38, -8, 30, -57, -34, 44, 14, 127, -33, -21, -42, 1, -23, -22, 31, 26, -21, -5, 26, 33, 48, -31, 7, 34, -27, -25, -44, 23, -25, 35, 35, -28, 127, 27, 3, 25, 49, -8, 21, -6, -6, 8, 91, 30, 13, -22, -13, -1, -31, -21, -4, 18, -9, -16, -2, 31, -42, -27, -2, 15, -8, 6, 23, -10, 72, -1, -65, -25, -17, -42, -33, -36, -36, -17, 9, -9, 5, +-12, -34, 22, 35, -17, -23, 8, -8, -23, 99, 34, -36, -24, -7, 51, -12, -7, -18, -48, -51, -28, -31, -32, -35, 32, 66, -12, 15, 5, 28, -3, 2, 6, 9, 31, -5, 98, -35, 87, -1, 23, -19, -1, -6, -11, 67, -35, 37, 17, 18, -10, -2, 81, -11, -22, -8, -28, -1, 15, 21, 1, 6, -32, 32, 70, -8, 6, -27, 18, 127, 14, -26, 2, -38, 10, -20, 48, 8, -34, -48, 14, +-11, -64, -8, 90, -57, 34, 24, 23, 29, -30, 24, 57, 18, 28, 26, 36, 35, 82, -9, -37, -36, -66, 6, -16, 1, 12, -4, 26, -40, -25, -5, 24, -20, 53, -32, -11, -10, -16, -28, -12, 50, 7, -95, -11, 29, -18, 127, 83, -23, -66, -5, -34, 50, 32, -9, 7, -47, 27, 7, -19, 2, 2, -8, 79, -18, -18, -19, 0, -56, -21, -6, 27, -22, 23, 51, -50, -33, 55, -34, -2, -13, +-64, 9, -21, 51, -3, -9, -4, 55, 21, -16, 7, 8, 21, -24, -5, 85, 29, -29, -23, -11, -52, -73, 8, 56, 5, -5, 27, 13, 11, -23, -8, -38, 8, 16, -8, 22, -25, -22, -17, -15, -22, -17, -1, -19, -5, -16, -34, -26, 53, -33, -17, -12, 8, -16, -31, 64, -1, 0, 8, 14, -13, -50, -10, 40, -37, -25, 15, -4, 5, -39, -45, 13, -24, -68, 63, -5, 19, 6, -26, -41, 16, +-62, -31, -16, -9, -35, -10, 49, 16, 23, 7, -9, 15, -55, 13, 33, -34, -28, 3, 47, 0, 1, 19, 20, -32, -35, 10, 47, -21, -20, -69, 30, 4, 9, -32, 18, 11, 4, -12, -13, 68, -30, -24, -51, 36, -1, 63, -10, 4, -18, -2, 5, -26, 26, -42, 38, 3, -30, 49, 56, 13, -17, 14, 30, 15, -4, -14, 2, -30, -7, 49, 4, -45, 18, -15, -3, -24, 11, -28, -24, -7, -11, +-35, 32, -4, -21, -34, -17, 54, -47, 46, 68, 1, -13, 7, 26, 12, 35, 28, 11, -39, -41, 13, -6, -24, 108, 11, -7, 42, -39, -43, -11, 20, 2, 20, 19, 26, -22, 22, -26, -14, -29, -8, -6, -7, -21, -4, 50, -41, -27, 22, -13, -2, 76, -30, 45, 11, -3, 33, -29, 100, -3, -14, 71, 63, -17, 32, 82, 44, -4, 32, -15, 34, 8, -27, -20, 14, 20, 37, 1, -27, 40, -8, +80, 40, -3, -49, 21, -35, -8, 8, 1, 32, 13, 35, -16, 124, 17, -38, -15, -3, -17, 39, -37, -3, -66, 37, -17, -40, -11, 15, 20, 27, 0, -36, 27, -19, -49, 16, 36, -7, 23, 2, 43, 31, -28, -7, 11, -15, 15, 9, -3, -8, -21, -22, 4, 88, -14, -16, -27, -8, 4, 5, -17, -11, -23, 6, -23, 3, 0, -23, -20, -4, -14, 6, 5, 18, 18, 21, -21, -22, 14, 55, 69, +-35, 86, -39, -42, 62, -28, -26, -31, 45, -27, -14, 0, -11, -33, -23, 6, -6, 28, -95, -28, -36, -35, 25, 39, -28, -56, -65, 8, -18, 36, -16, -33, 12, -19, 19, -32, -29, 4, 17, -15, -46, -22, -13, 1, 0, -6, -31, 18, 0, 0, -14, -30, -11, 7, -12, -52, 29, -11, 36, -35, -36, -7, 18, 37, 37, -29, -20, -5, -11, -45, -14, 5, -17, 40, 14, 0, -8, -75, -27, 3, -38, +22, 51, 21, 32, 26, 63, -10, -13, 19, 49, -13, 24, -80, -7, -69, 18, 59, -17, 24, 99, -23, -37, 13, 13, -19, 32, -34, -30, -25, -22, 72, 23, 8, 22, 7, 37, 10, 9, -39, 42, 5, -52, -29, 37, -54, -39, 75, -26, 21, -27, -31, 8, 2, 39, -41, 45, -25, -22, -30, -7, 15, 39, -8, 13, 19, 4, 7, -31, -28, -3, -26, 6, -5, 2, -44, -8, 5, 11, -29, 38, -40, +-49, -16, -26, -24, -24, -11, 115, 48, 96, 41, -33, -30, -38, -15, -27, -45, -3, -3, -8, -51, 10, -6, -23, 14, -43, 69, -48, -29, 24, -7, -70, 7, -5, -6, -33, 47, -13, 33, 21, 25, -23, -7, -11, 12, 40, 6, -15, 7, -4, -24, -42, -10, -16, 11, -26, 36, -10, 11, -34, 2, -30, 8, 1, -27, 21, -54, -42, -5, 12, -15, -9, 11, -10, -3, 17, -40, 72, 26, 38, 33, 5, +49, 8, -32, 12, -22, -22, -24, -15, -14, 22, 24, 77, 51, -19, 22, 42, 28, 32, -64, -8, 10, -4, 5, 35, -12, -26, 8, -39, -21, -50, -3, 24, -40, 8, 0, 13, 49, 1, -12, -8, 24, -11, 23, -25, 13, 50, -30, -30, -16, 9, 22, 3, -27, -51, -29, 19, -2, 67, -9, 6, 61, -24, -10, -14, -15, -23, -7, -21, -12, -17, 4, 106, -62, -40, -18, 77, -22, -25, 37, -21, 57, +40, 42, -12, 18, -50, 9, -48, -25, 5, -8, 43, -16, -31, 113, -57, 54, 18, -17, -11, 27, 35, -4, -4, 42, 10, 75, -6, -50, 17, 21, 108, 2, -12, 7, -2, -13, -12, 33, -51, -34, -21, -38, 20, -24, -30, -47, -11, 4, 8, 91, -21, -28, -30, 20, -55, -12, 24, 6, -59, -28, -4, -30, 6, 54, -28, 18, -31, -17, -14, -52, -18, -55, 18, -26, 33, 46, -4, -32, -9, -13, -35, +58, -6, -15, -5, 16, 2, -84, 3, -3, -1, -30, -17, 33, -19, 95, 13, -40, 13, 13, -30, 18, -22, 44, 12, -26, 42, 27, -25, 39, -18, -11, -7, 31, -43, -46, -31, -2, 70, -28, 41, 60, 27, -31, -70, -30, -2, -17, 20, -14, -29, 63, -46, -34, -55, -1, -14, -7, 22, 41, 8, 83, 6, -25, 87, 1, -20, 26, 35, -9, -46, -4, -10, 46, 28, -15, -13, 12, 13, -21, 8, 14, +5, -27, 26, -12, 2, -27, -23, 36, 8, 16, -22, -14, -9, -9, -26, 7, -32, -10, 12, 24, -6, 46, -2, -9, 27, -14, -5, 27, -26, -3, 0, 22, 47, -25, -18, -31, 5, -37, -24, 40, 11, -34, -1, 8, -53, 4, -69, -43, 26, 0, 23, 18, -12, -37, -5, -16, -7, -18, -55, 18, -27, -17, -12, 2, 28, 18, -10, -28, 9, -1, -4, 9, -31, -30, -34, 9, -16, -19, -20, -2, -8, +37, -16, 20, -13, -2, -1, -26, -23, -32, 7, -6, 56, 10, -12, -19, -13, -24, 14, -33, 30, 28, -47, -22, 16, -54, -16, -36, 18, -19, -24, 12, -20, 12, -20, -24, 88, 24, -7, 49, 16, -86, -32, 26, 2, -65, -13, -1, 50, 24, -14, -25, -6, -6, -3, -67, 1, 40, -51, 101, -55, -28, 80, 29, -44, -24, -52, 3, -23, 29, -31, -21, 5, -65, -44, -33, 19, 50, 30, -24, 74, -19, +31, -27, -29, 21, 12, -4, -22, -26, 96, -17, -17, -31, 36, 23, -14, 9, 12, 47, -16, -18, -6, -8, -24, -43, -29, -56, -9, 3, 65, 17, -5, 38, 8, -4, 2, -18, -32, -14, -25, -1, 46, -55, 0, 11, 24, 17, 23, -5, 32, 62, -59, -26, 44, 4, -54, -62, -27, 49, 10, -49, -53, -40, 7, -16, -35, 46, -23, 6, -31, 27, -14, 42, -24, -7, -11, 54, 11, 3, 29, -32, -21, +26, -10, 9, 56, 8, 14, -1, -10, 6, 14, 29, 127, 5, 35, 38, 42, 11, -29, 10, -19, -43, -24, -9, -12, -62, -5, -29, -16, -11, 14, -10, 4, 14, 26, -21, 57, -9, -13, -32, -53, 13, 11, -22, 4, -6, 30, 33, -32, 19, -16, 43, -24, -41, 3, 5, -7, 25, -18, -21, -47, -21, -49, -3, 71, -17, -41, -35, 43, -16, -33, -17, 21, 51, 24, 86, 23, -11, 33, 44, -12, -12, +10, -10, 0, 47, 75, 9, 5, -6, -14, 15, -3, 101, -7, -25, -44, 15, -19, -66, -63, -39, -11, 11, 19, 19, -5, 34, 81, 62, 28, 26, -10, -33, -26, -31, 31, -8, -20, -5, -28, 60, -56, 15, -30, -36, 4, 75, 58, 18, -45, 26, -26, -1, 27, -34, -26, 8, 10, -43, -72, -21, -20, 30, -5, 55, -40, -14, -8, -13, -14, 66, 3, 10, -31, -12, 7, -9, -34, 43, 49, -17, -13, +-33, -40, -49, 127, -54, 9, 12, -39, -28, -31, 3, -2, -29, 6, 19, -5, 39, -8, 50, -14, 21, -25, -22, -3, 1, -18, 43, -27, -35, -12, -26, 25, -5, 127, 48, -24, -31, 0, -11, -1, -41, 54, 36, -17, -5, 7, -67, -14, -30, -40, -21, -27, -1, 50, 55, 39, -30, 0, 20, 85, -18, 24, 20, -31, 20, 96, 1, 10, -19, 40, -21, 31, -25, -51, 13, -27, -7, 2, 21, -21, -23, +-61, -41, -25, 5, 34, -24, 16, -66, 14, 10, 20, 119, 7, -2, 46, -26, -28, -10, 6, -1, -14, -15, -6, -1, 60, -6, 13, -22, -9, 16, 8, 14, 8, -7, 36, 1, 1, -4, -36, 3, -11, -13, -1, -18, -15, -20, 9, 10, -26, -20, -28, 1, -32, 70, -33, 5, -8, 30, 10, -19, -15, -23, -6, -33, 3, -41, -10, 53, -35, 18, -41, 24, -23, 1, 26, -25, 6, 21, -3, -14, -4, +13, -9, 74, -37, -28, 15, 74, -22, 4, -14, -11, -13, 30, 37, 1, 4, 8, 32, 53, 4, 24, -13, -37, -28, -20, 31, 3, 0, -17, -5, -31, 55, -52, -38, -7, -31, 20, -10, -6, -16, -7, 65, -7, 10, -6, 5, -11, -60, 1, -2, -24, -16, -44, -31, 29, -30, -25, -2, -25, -14, 13, -33, 8, -2, 47, -41, -26, 35, 2, -3, -35, -9, -12, -22, -1, -26, -18, 21, 19, 115, -27, +24, 39, 20, 42, -21, -2, -39, -7, 33, -31, 30, 13, -24, -29, 18, -33, 36, -16, -1, 26, -8, 42, -50, 1, 16, 7, 11, -1, -1, -34, 55, 12, -62, 9, 39, -41, 38, 22, 40, 11, 43, -16, 34, -5, -16, -9, 29, -49, -39, -27, -47, -1, 10, 10, 34, -25, 7, 80, 45, 69, -11, -18, 3, 14, -27, -24, -19, -55, -19, 24, 4, -77, -15, 35, 7, -3, 2, 23, -1, -13, -13, +23, -5, 15, -31, 44, -14, -10, 32, -49, 14, -6, -12, 3, 6, 50, 7, -22, 16, -6, 43, -13, -28, -4, -51, -15, -35, -14, 32, -15, -39, -10, 4, -28, 53, -16, -17, -11, -34, -4, 15, -9, 23, 11, 17, -24, 19, 17, -53, 0, -1, -32, -16, 23, -53, -16, 45, -10, 17, 22, 27, -31, -15, 9, 14, -28, 51, -52, -28, -29, 40, 5, 7, 83, 7, 15, 27, 3, -13, -28, 4, -33, +53, -5, 127, 20, 29, -41, -15, 12, 39, 28, -11, -27, 68, 39, -39, 3, 10, -8, 47, 53, 36, -5, -10, 23, 37, 15, -3, 26, 41, -43, -25, 16, 61, 12, -8, 16, -34, -12, 45, -11, -38, 56, -2, 35, 0, -17, 20, -3, 88, -32, -33, 21, -6, -24, -25, 37, 44, 88, 24, -15, 35, -8, -25, 75, 15, 4, 14, 22, -18, -5, 65, -26, -44, -16, 29, 35, -14, -14, -38, -26, 11, +47, 14, 50, -1, 36, 33, -3, -24, 59, -21, -11, -7, 12, 2, 8, -27, 39, 36, 9, 13, -39, 24, 4, 1, 19, 21, 22, -21, 8, 11, 2, -31, -29, 76, 11, 17, 19, -61, -20, 32, -42, 40, -20, 22, 13, -17, 18, -40, -2, -18, 26, 21, 14, -12, -22, -6, -26, 60, -9, -44, -30, -4, 116, 0, 34, 97, 34, 97, 6, 4, 16, 15, 7, -31, 99, -15, 6, 98, -52, -9, 18, +-47, -44, -16, -76, 12, -18, -22, -50, -3, 24, -29, -64, -1, 70, -17, 87, -37, 10, 103, 25, 26, 15, 37, -43, 38, -45, -30, 26, -25, -4, -22, 23, -22, -39, 26, 19, 33, -7, -12, -20, 102, 5, -14, 26, -21, -2, 10, 42, -7, 1, -7, -26, 27, -34, -12, -8, -13, -13, 8, -7, -12, 23, -31, 22, 28, 11, -18, 39, 4, 15, 11, 0, -22, 27, 26, -32, 84, -38, 12, 72, -14, +44, -78, -29, 1, -40, -24, -39, -18, 72, -39, 57, 2, -11, 1, 45, 7, -18, -14, 1, 31, 5, -34, -47, -25, -30, -4, -24, 49, 19, -18, -5, 30, -28, -38, -30, 33, 2, -4, -13, -4, -1, -3, 76, -34, 14, -19, 12, -30, -7, -37, 14, -26, 21, 10, 4, 59, 51, -18, -33, -9, -15, -20, -18, -26, 44, -8, -24, -1, -8, 2, 56, -9, -6, -27, -6, 6, -38, -7, 45, 24, -22, +-33, -2, -52, -5, 16, -18, 26, 26, -2, 14, -23, -8, 10, 30, -35, -47, 5, 9, -13, -21, -4, 48, 17, 29, 19, -10, 67, 4, 43, 35, -75, -16, -10, 32, -41, -31, 0, -21, -29, 34, 30, -37, -16, 46, -15, 44, -48, 48, 61, -30, -22, -13, 81, -17, 99, -30, 12, -17, 46, 23, 127, -51, 1, 49, -18, -28, 0, -14, -17, -24, -5, -10, -36, -30, 21, -22, 10, 37, 23, -32, 39, +34, 7, -4, 47, 75, -49, -2, 107, -30, 25, -36, -34, 40, 39, -14, -6, -6, -17, -4, 19, -8, -20, 21, -7, -28, 24, 7, 66, -50, 29, -36, -14, 30, 25, -25, 85, 33, 43, -35, -20, 17, -7, 89, -40, -5, 53, 38, 52, 0, -10, -14, -2, -14, 7, 2, 39, -7, 1, -45, 20, 39, -23, 20, -4, 30, 25, -37, 84, -12, -46, -1, -13, -21, 38, -13, -9, -11, -35, -15, 59, 2, +20, -16, -37, -23, -37, 66, -7, -3, 35, -42, -6, -47, -14, 44, 5, -21, -16, 71, 63, -48, 93, 25, 7, 7, -90, -31, 56, 74, 20, -30, 58, -10, -36, 61, 11, 0, -62, 71, -9, -36, -7, 51, -1, -8, 19, 18, 17, 65, 18, -14, 8, 65, -12, -7, 7, -4, 7, 3, -14, -15, -45, -34, 50, -49, 26, 4, -42, 7, 58, -42, -13, -52, -8, 59, -30, 32, -24, -3, 22, -11, -45, +-10, -23, 72, 3, 100, 68, 29, 15, 1, 35, 102, -31, 30, 22, 1, -5, -28, 87, -19, -27, 1, -10, -12, 11, 2, -9, -3, 7, -56, -28, 38, 4, -17, 18, -24, -18, 34, 13, 29, -13, -49, 39, -6, 49, 1, -9, 12, -26, -36, 12, 103, 20, -25, -9, 21, -2, 20, 24, -4, 13, 45, -11, 9, 15, -7, -37, -12, 23, -15, -43, 9, -37, -8, -14, 20, 8, -44, 27, -2, 10, 1, +0, 13, 22, 23, -1, -36, 2, -2, -25, 18, -24, 72, -15, -7, -5, -11, 32, -4, 6, -65, -6, 92, -9, 22, -43, -28, -18, 26, 35, -2, 50, -31, 8, 8, -14, 5, 5, 27, -10, 58, -48, -12, 5, 1, -23, -2, -70, 41, 9, -29, -10, -7, -28, -28, -1, -4, 32, 45, 8, 0, 70, 19, -2, -35, -55, -20, 7, 14, 5, -18, 9, -6, 20, 12, 98, -22, -4, 18, -11, -28, 5, +23, -16, -10, -11, -17, -12, -46, -12, -25, -7, 21, -5, -4, -26, -17, -12, -5, 16, -16, 70, 14, 48, -27, 25, -46, -24, -28, 90, -40, -8, -66, -40, 47, -24, -25, 106, 56, -5, 27, 85, -7, 45, -1, -2, 67, -31, 113, 18, -59, 37, -28, -28, -4, -43, 79, 70, 74, 63, -17, 10, 20, -13, 109, -2, -8, -8, 20, -32, 118, 46, 17, -4, 30, 98, 17, -19, 56, -19, 127, 10, 17, +-37, -1, 24, 5, -61, -44, -46, 72, 18, -14, -45, 15, -33, -49, 30, 8, -12, -5, -6, -27, 23, -27, 31, 9, 7, 49, -7, 17, -49, 76, 15, 56, -17, 0, -7, -39, -1, -6, 11, 17, -32, -42, 12, 1, -26, -47, 18, 1, 78, -46, 24, -32, 4, 83, 30, 42, -43, -28, 10, 1, -20, 34, 13, 33, 34, -7, -33, 9, 12, -16, -23, 68, 15, 77, 0, -19, -48, -6, 16, 0, -3, +102, 14, 74, -33, -16, 1, 0, -35, -15, 33, 0, 30, -18, 20, 0, -3, -65, 29, -21, 24, 27, 18, 62, 5, -18, 13, 13, -27, 19, 3, -4, -3, 58, 25, 66, 9, -24, -10, 1, -21, 13, 4, -16, 39, -35, -30, -2, 33, -20, 22, 14, 1, 23, -37, 11, 27, -10, 31, -8, 43, 27, -2, 17, 55, 18, -30, -44, -23, 20, 24, 48, -28, -9, -27, -17, 76, 5, 13, 0, 51, -1, +-19, -7, 32, -7, 11, 0, -29, -16, 1, -6, -34, -4, 53, 10, -22, -29, -11, -17, -14, 39, 4, -3, 10, 31, -23, -7, 36, -12, -24, -26, 5, 5, -27, 44, -20, -11, 41, -33, 19, -28, 25, 14, 27, 36, 95, 8, 89, -8, 38, 4, -42, -9, 89, 29, -30, 41, 42, -20, 1, -6, 1, 28, -8, 9, 88, -12, 8, 37, 8, -39, 26, 20, -35, -25, -39, 26, 6, -10, 35, -12, -52, +-1, 31, -16, -30, -21, -6, 31, 8, 8, 22, 22, 14, -31, 19, 65, 19, -30, -65, -7, -57, 13, -3, 21, 41, -46, 29, -44, -13, -8, -5, 3, 40, -13, 27, 67, -74, -29, 18, -6, -72, -37, 52, -7, -38, -27, -8, 65, -11, -8, 14, -25, 19, -31, 12, 65, -10, -13, 0, -14, 32, 24, -19, -20, 38, 4, 9, 21, -28, 3, -43, -18, -17, -14, 31, 127, 23, -54, 13, -11, -7, 6, +-4, 9, 37, -17, 25, -16, 24, 6, 5, -32, 17, 39, 24, -31, 32, 14, -70, -23, -14, -1, -8, -36, -5, -29, -39, 14, 19, -50, 39, -34, 25, 80, 28, 65, -14, 18, -25, -14, -3, 34, -21, -36, 27, 23, -16, 9, 39, 37, -43, 23, -67, -25, 26, 50, -42, 19, -11, 11, 42, -19, -30, 43, 77, 45, 12, 57, -28, -15, -39, -2, 11, -47, 4, -21, -35, 66, 2, 42, -18, 62, -11, +-35, -16, -70, 122, 39, 10, 21, -33, -1, 28, -26, 5, -8, -2, -8, -8, -16, 14, -6, 27, -7, -17, 32, -6, -2, -2, 7, 19, 8, 33, -30, -22, -12, 0, -13, 39, -17, -9, -11, -3, -3, -12, 50, 24, 42, -73, 28, 127, -8, -33, -53, 79, 51, 3, -13, 23, -13, -14, 24, -32, -63, 24, -66, -33, 53, 17, -25, 8, 28, -7, 42, -26, 61, 2, 72, -30, -29, -81, -37, -3, -49, +-35, 3, -60, 91, -5, 89, -5, -36, -16, -26, -2, 51, -40, -47, -4, 37, -12, 60, 24, 7, -25, 46, 27, 29, -41, 58, 127, -5, -70, 4, 7, -20, -14, -11, 2, 34, -4, 46, 14, 23, -22, -40, 9, -18, -33, -24, 110, 42, -12, -12, -10, 47, 4, 17, -16, -3, 4, -25, 6, 4, -6, -33, 89, 40, -5, -57, 88, 26, 79, 0, 32, -36, -12, -21, 2, 67, 21, -8, 0, -5, -2, +27, -15, -32, 6, -29, 94, 112, 12, 7, -5, 54, 33, -20, -31, 64, -11, -4, -8, 20, 8, 24, 91, -22, -16, -24, -30, -20, 7, -8, -16, -7, -33, -44, 16, -25, 6, 2, 15, -27, -9, 87, 12, 25, 3, -4, 3, -29, 10, -20, 7, -21, -68, -18, 49, -19, 3, -39, -7, -4, 12, 116, 104, -26, -60, -7, 3, -1, -44, -23, -24, -20, -18, -5, 10, 28, -50, 9, 8, -38, -1, -29, +12, -24, -21, 47, 62, -20, -6, -27, 13, 39, 5, -21, 17, 2, 127, -51, 15, -13, -26, -36, -46, -21, -27, -9, -15, -3, 2, 4, -4, -28, 17, 70, 13, 6, 8, -35, -23, -6, 32, -51, -20, 2, -7, 21, 34, -7, 39, -19, -3, -10, -28, 15, -19, 16, 14, -59, 20, 1, 37, 4, -47, -26, 11, 26, -55, -4, 88, -27, 9, -30, 2, 9, 23, 16, -5, -47, 20, -24, -12, -74, -21, +-8, 11, -38, -30, 46, 85, -29, 18, 30, -27, 54, 34, 127, 55, 16, 55, -19, 15, -1, 2, -14, -39, -27, -20, 46, -13, 34, 3, 14, -77, -55, -5, 3, -1, -14, -15, -12, 25, -9, 68, -10, 37, 7, 56, 1, 24, -14, -33, -11, -12, -20, -37, -17, 33, -20, -31, -44, -3, -67, 57, 87, 33, 2, -7, -60, 55, -42, 9, -34, -1, 42, 25, -3, 35, -14, 62, 16, 55, -24, -49, -13, +-36, 24, 4, -60, 38, -10, 53, 15, 32, -25, 74, 53, 32, -12, -25, -23, 24, 13, 16, -42, 0, 1, 30, 4, -34, -28, -25, 97, 127, 24, -24, 8, 1, 41, -18, -17, 2, -24, -14, 15, 39, 7, 26, -20, 29, -27, -1, 26, -52, -4, -7, -11, 0, -20, 12, -7, -53, -32, -65, 28, 59, -31, 66, -6, 56, 17, -52, -20, -46, -20, 49, 8, 16, 54, -86, 44, -21, -31, -38, 18, 20, +-43, 45, -53, 88, 25, -1, -16, 59, -7, 42, 9, -22, -19, 0, -39, 17, -34, 19, -17, -37, -17, -7, 18, -20, -29, 34, 32, -4, 22, 18, 37, 22, -20, -11, 6, 56, -14, -28, -61, -34, -6, 27, -21, 7, 101, 22, -34, -34, -4, -28, 23, 3, -25, -29, -7, -4, 31, -28, -37, -6, 62, 33, 18, 5, -6, 29, -8, -4, 15, 29, -47, 42, 31, -11, 49, 34, -11, 55, -43, -94, -15, +-3, -60, -19, -8, -16, -2, 18, -15, 16, -21, -12, -31, -29, 19, 15, 29, -1, -14, 40, 7, -13, -22, 33, -24, 0, 14, 6, -35, -8, 11, -25, -19, 2, -11, -12, -16, 17, 22, 78, -11, 63, 19, -17, 21, 11, 10, -30, -11, 15, -17, -2, 19, 28, -1, -21, 6, 70, 5, 54, -36, -42, 2, -11, -35, -2, -36, 25, -10, 30, 21, 7, 22, 74, -5, 62, 65, 19, 59, -12, -30, -45, +-32, -2, 71, -54, -29, 25, -7, -6, -3, -19, 22, -56, -40, -75, -3, -14, -35, -16, 6, -35, -47, 8, -50, -86, -41, -82, -9, 4, -54, 5, -13, 127, -20, -38, -10, 2, -6, -4, -10, -11, 15, 20, 48, 12, -25, -17, 3, -24, -12, -3, -21, 1, 3, -16, 23, -22, -11, 5, -19, -7, 23, -34, -10, 5, 6, -6, -4, 34, -8, 10, -35, 12, -1, 27, -8, -36, 13, -21, -17, -42, -23, +-12, 24, 12, 2, 8, -23, 41, -34, 22, 13, 2, 23, -36, -31, -14, -23, -8, 11, 0, -26, 28, 29, 121, 33, -4, 19, -45, -29, 58, 54, -51, -11, -13, 22, -19, 112, 31, -3, 2, 19, -51, 51, -39, -33, 55, -4, -8, -26, -15, 39, -16, 7, -2, -21, 82, 23, -49, -14, -36, -5, 43, -17, -26, -29, -27, -16, 24, 29, 29, 61, -52, 0, 2, 3, 43, 1, -6, 32, -22, -32, -62, +-1, 13, -26, 53, -27, -20, -21, -15, -49, 28, -11, -8, 31, -49, -24, 5, 6, -9, 24, 45, -4, -8, 14, -17, 29, -3, 2, 22, -24, 26, -3, 0, 4, 3, 45, 3, 14, 59, -35, -3, 55, 28, -43, 86, 19, 37, -17, 18, -8, 127, 0, -18, 19, -101, -45, -14, 16, 40, 33, 13, 49, -10, -13, 23, -17, -19, -25, 28, -24, 8, -13, -4, 9, -46, -37, -14, 32, -9, 71, 14, -33, +9, 18, 15, -27, 90, -13, 1, -20, -24, -1, -21, -57, 17, 25, 50, 5, -12, -20, -7, -12, 22, -17, -2, -29, -52, 40, 19, -6, 9, 74, 19, -19, 10, -21, -1, -17, 11, -15, 6, 25, -6, 3, 22, 29, -7, 22, 9, -41, 46, 13, 22, -33, -10, 25, 14, -40, -30, 47, 71, -23, 21, -20, 18, -10, -49, 9, 21, 31, 92, -19, -17, -14, 3, -4, -28, -1, 15, -8, 17, 60, -51, +-26, 33, 12, -19, 72, 123, -31, -11, 12, 46, -19, 66, -34, 58, 46, 32, -10, -13, 87, 5, -94, -11, 26, 43, -24, 56, -14, 11, 16, 45, 14, -21, 38, 22, -46, 55, -32, -15, -71, 44, -33, 19, -33, 13, -13, 81, -7, -25, -7, -3, 73, -20, 50, -17, -15, -43, -3, -18, 93, -16, 16, -8, 57, -16, -9, 30, -39, 0, 25, -18, -15, -12, -39, 2, -20, 10, -15, -10, -4, 87, -2, +-41, -20, -18, 16, 6, 17, -19, -13, -18, -14, -21, -16, -8, -34, 18, -3, 26, 19, 39, 83, -17, 53, -37, 66, 38, -63, 33, -33, 35, -69, -19, -4, 9, -37, -20, 8, -7, -43, 2, 19, -63, -12, -38, 8, -11, 31, 33, -10, -2, 26, 6, 6, 4, -11, 21, -8, -15, -49, -11, -13, 31, -11, 9, -2, -12, 10, 43, -6, 7, -49, -38, 25, -5, -46, -14, -43, -3, 52, 4, -22, -13, +-4, -2, 1, -26, -38, -4, 25, -7, -17, 12, -50, -4, -23, -22, -28, -12, -60, -14, 20, 9, -55, 23, 29, 61, -12, -17, -12, 33, -33, -6, 1, 10, -8, 0, 11, -32, 43, -1, -41, 10, -48, -2, -35, 7, -37, -13, 7, -33, -45, -65, 24, 45, 12, 61, -28, -4, 90, 45, -41, -26, 22, 13, -7, 73, -7, 43, 46, 7, 12, -27, -9, -6, -27, 26, -16, -19, 6, -1, 6, -28, 7, +19, 17, -23, -12, -20, -19, -10, 59, 13, 10, -29, 64, 13, -6, -8, -8, 1, 7, 17, -19, 28, 14, -36, 24, 17, 8, 27, -52, -7, -37, 12, 0, 17, 5, 3, -19, 11, 11, 46, -29, 21, -8, 4, 9, -40, 12, 14, -11, 21, 8, 55, 37, -34, -18, -18, -7, -10, -9, 1, 5, 17, -15, -5, -7, -15, -40, 13, 34, -26, -25, 12, -27, -24, 26, 36, 8, -13, -34, 71, -18, 32, +11, 17, 1, -41, 40, 29, -24, 36, 20, 9, 20, -19, -29, 6, 21, -49, -31, -27, -43, -25, -13, 8, -11, -3, -23, -33, -22, -2, -12, -22, -25, -1, -11, -9, -10, -2, -13, -24, 3, -36, 1, 70, 6, -34, 47, 23, 76, -8, -2, 0, 14, 10, -34, -8, 26, -1, 17, 29, 20, -35, -39, 2, 56, -4, -73, 46, -38, -28, -2, -52, -48, 53, 27, 13, -47, -44, 15, 66, 35, -72, -52, +-1, 21, 0, 102, 73, 44, 18, -6, -21, -35, 6, -27, 8, 56, -15, 39, 4, -27, -39, 3, 14, 12, 0, 36, 7, 2, 20, -20, 8, -1, -15, 15, -26, -3, 53, -3, 57, -1, 3, 35, -28, 61, 29, -51, 20, -7, -5, -27, 16, 3, -40, -10, -30, -19, 11, -16, -3, 12, -22, 96, 1, -2, 4, -11, -24, -26, 71, 11, -23, -8, -38, -8, -32, -8, -16, -41, 3, 96, -12, -43, 30, +-21, -17, -22, -47, -4, -22, -16, 6, 41, -22, 52, 5, -33, -6, -12, 22, 16, 29, -19, -10, 1, -18, 47, -4, -40, -9, -59, -27, -56, 18, 39, 5, 34, -61, -22, 92, -3, -75, -57, -12, -56, 4, -5, -79, -18, -16, 72, 9, -37, 83, -48, -26, 2, 32, -35, -6, -22, -42, 27, 9, 48, 27, -8, 16, -41, -14, 15, 112, -7, -21, -29, -37, -7, -1, -28, 36, 6, 3, 49, -26, -6, +107, 127, 26, 14, 1, -6, 35, 10, -33, -38, 51, -27, -22, 31, 27, 17, 0, -17, 77, 30, 5, -29, -10, -31, -10, 14, 5, 23, 31, -25, -19, -9, 13, 13, -3, -25, -10, -18, -19, -18, 0, -11, 2, -46, 15, -53, 13, -8, 56, -16, 10, 3, -29, -15, 15, 10, 6, 34, -20, 1, -84, -11, -26, 1, 40, 14, 34, -70, -9, -39, -26, -3, 23, 4, 43, -7, -20, -48, 8, -9, 46, +-7, -26, -16, -59, 23, 8, -24, 1, 8, 12, -4, 33, 8, -3, 36, 38, 12, -26, -8, -34, 6, 11, -2, 14, -3, -22, 20, -13, 2, -18, 19, -14, -25, -27, 21, 12, -21, 13, 10, -2, 79, -5, -4, -37, 39, 4, -43, 41, 8, -39, -12, -1, 8, -18, -64, -33, -30, -83, 85, 56, 13, -40, -23, 8, -12, 24, 14, -32, -14, -8, 44, 32, -30, -11, -4, -39, -38, -17, -10, -20, 91, +5, 36, -29, -8, 15, -7, 5, 25, -12, 127, 4, -12, 4, 1, 15, 18, -9, -23, 24, -18, -27, -2, -6, -5, 38, -3, 68, -2, -26, 3, 8, 51, -5, -16, -35, 6, -30, -22, 2, -36, 1, -7, 22, -2, 0, -7, -13, -20, -27, 47, -7, 1, 29, 3, 27, -7, -23, 26, -20, 73, -29, 18, 27, 14, -30, 16, -22, 24, -33, 2, -16, -42, -37, -17, -8, 9, -47, 25, -48, -5, 27, +-9, -3, 71, -22, -53, 48, 94, -18, 4, 5, -25, 4, -37, -11, 3, 14, -24, 19, 13, -36, -3, 19, -22, -39, -30, 46, 8, -43, -13, -13, -8, 20, -1, 21, 95, -15, 7, 33, 30, -16, -5, -6, 24, -9, 0, 28, -30, -9, -26, 41, 9, 0, -16, -5, -4, -26, 1, -8, -25, 29, -27, 6, 10, 52, 4, 4, -16, -3, 1, 11, 8, -14, 30, -3, -11, -11, 5, 67, 75, 1, -2, +-13, -8, -20, -18, -25, -20, -20, 21, -49, 15, -14, -50, 56, -52, 56, 7, 86, -58, 29, -2, 15, 11, 19, -34, 54, 16, -51, 36, 97, -18, -25, 31, 15, -7, 8, 11, -14, 16, 21, 29, -43, -23, -42, -27, 26, -47, -10, -48, -42, -4, 11, 15, 0, 20, 2, 7, -34, -17, 21, -15, -22, -22, 20, 19, -41, 14, 21, 20, -29, -20, -66, 52, -11, -15, -35, -15, -30, 33, -21, 40, -15, +-24, 69, 11, -27, 19, -17, 4, 73, 6, 2, 14, -34, 6, -31, 10, -34, -25, 92, 45, -59, -25, 37, -9, -9, -1, 26, 79, -5, -32, -14, -16, -2, -36, -71, -8, 23, 34, 3, -47, 14, 41, 12, 72, -1, 13, -60, 15, -59, 32, 27, -10, 24, -12, 56, -9, 28, -49, -22, 127, -46, 34, -46, -2, 2, -55, -57, -24, 61, 73, 25, 30, 44, -50, -3, -37, -49, 64, -25, 23, 10, -63, +67, -36, -17, -4, 1, 31, 33, -42, 13, -4, -12, -19, -19, 44, -24, -43, -15, -14, -17, -4, 57, -26, 9, -13, -12, -20, -26, -5, -47, -54, 1, -56, 13, -28, 125, -25, -6, -15, -36, -56, -40, -40, 16, 1, -27, 1, 50, 13, -13, 37, 16, 17, -5, 59, 30, -52, 61, -4, 7, -24, -6, 18, -5, -10, -26, 86, -36, -12, -27, 24, -43, 34, 14, 63, 25, 11, 46, 15, -57, -51, 17, +-4, -23, -21, -13, 0, -3, 77, 106, -24, 11, 59, -9, -19, 25, 23, -4, 59, -5, -4, -6, -2, -3, -12, -15, 8, -16, -46, 4, 30, -9, -10, -37, 14, -27, 6, 1, 44, 14, 7, -23, 34, -19, -13, -25, -34, -22, -17, 40, -7, -31, 4, -41, -5, 6, -8, -68, 43, 19, -38, 5, 4, -20, 28, -4, 23, -25, 9, -9, 16, 1, 11, 26, -1, -12, 15, -38, 4, 18, 22, 4, -41, +13, 25, 38, 41, -36, -56, -18, 55, -19, 41, -15, 26, -17, -65, -26, -2, 9, 9, 21, -58, 38, 25, -12, 1, 32, -1, -22, 1, 9, 11, -20, 28, 11, -8, 39, -27, 1, 7, 25, 9, -2, 8, 15, -9, 14, 27, 9, -21, 14, 3, -34, 26, 14, -2, -11, 34, -38, -13, 7, -1, 1, -3, 73, 16, -26, -28, -45, 26, -31, -25, 15, 25, -6, 7, 37, 5, 11, 8, -29, 37, -11, +-17, -25, -23, -3, 19, -28, 38, -22, -29, 38, 35, 28, -27, -12, 17, -28, 24, -3, 5, 4, -34, 41, 54, 21, -75, -51, -25, -10, 29, -8, 7, 58, 1, -34, -22, 27, 43, -15, -18, -24, 11, -35, 94, -50, -46, 8, 31, -28, -2, -24, 2, -32, -15, -1, 57, 9, -23, -1, -30, -14, -11, 21, 33, -2, 1, -2, 23, 5, 34, -23, 11, -25, 23, -11, 57, 18, -17, -57, -25, 0, -2, +8, 10, 7, -13, 10, -28, -5, 22, -33, 41, -13, -10, -8, -16, 13, -31, 10, 62, -1, -31, -13, 30, 35, -2, -46, -38, -11, -11, 10, -7, -68, -36, -1, 41, -22, -34, -36, 31, -4, 11, 97, 14, 15, 3, 86, -13, -47, 0, 24, -55, 22, -22, 34, -62, -14, 6, -79, -36, 5, -35, -23, -5, -2, 22, 25, -17, -20, -27, -73, 8, -31, 6, -32, 11, -47, 30, -18, -25, -7, -17, -25, +3, -14, -19, -48, -8, -21, -59, 73, -14, 14, 48, -15, -8, 9, -31, 13, -14, -29, -37, -18, -32, -38, -43, -9, 1, -25, 25, -6, 41, -1, 24, -5, -5, -27, 16, -34, 40, -42, -5, 23, -31, 3, -36, -41, 83, -4, -18, -8, -33, 14, 50, 62, -36, 4, 22, -10, -23, 3, 82, -18, -30, -11, -54, 27, -13, -49, 70, 14, -14, 6, -19, 11, -42, -3, 29, -14, 32, 21, -34, -85, -14, +14, -67, -85, 32, 6, 25, -34, 35, -65, -20, 48, 20, -34, -66, 19, 50, -61, -9, -46, 42, -32, -5, 16, 8, -22, -6, -11, -36, 41, -37, -22, -16, -14, -36, -49, -25, -12, -15, 52, -19, 19, 17, -20, -19, -5, -36, 22, -11, -28, 28, 7, 59, -15, -22, 18, 54, -19, -4, 9, -13, -1, -13, 17, -16, 14, -7, 0, -30, 20, -2, -27, -27, -26, -28, -23, -34, -15, 44, -2, -13, -26, +-22, 49, -6, 29, -59, -14, -17, -8, -23, 46, -33, 33, 1, -11, 2, 7, -58, 59, -16, -73, 119, -9, 2, 1, -65, 22, -74, -39, -43, -55, -50, -29, -32, -30, -97, 83, -21, -38, -35, 54, 7, -22, 17, -16, -23, 22, 14, -2, -49, 2, -19, -4, 72, -41, -20, 35, 7, 12, -22, -54, 65, -25, 10, 2, -4, -26, 8, 38, 74, -6, 53, -14, -8, -18, 31, 26, -26, 73, -35, -17, -55, +3, -16, 21, -11, -16, 30, -8, -35, -11, 32, 22, -7, 4, 4, -32, -8, -47, -1, 16, -4, -21, 1, 11, -48, -13, -1, -14, 12, 5, -24, 43, -32, -25, 4, -43, 87, -14, 6, 45, 21, -17, 15, 7, 23, 24, -35, -7, -12, -53, 96, 45, 2, 39, 14, 30, 7, 34, 12, -21, -12, -21, 12, -4, -19, 13, 14, -30, 9, 12, -19, 6, -18, -22, 5, -28, -6, -12, 3, 37, -25, 19, +21, 3, 25, 22, -33, -9, -16, 11, 24, -13, 21, 72, -44, -50, -1, 62, -35, -20, 0, 4, 49, 20, 18, 23, -43, -32, -42, -33, 23, 59, 37, -52, 7, 10, -17, -31, 9, 20, -24, -23, 8, 35, 3, -2, 16, -21, 35, 50, -4, -30, 32, -13, -1, -55, -2, 22, -16, -19, -38, 12, 8, 17, -2, -43, -13, 77, -30, -44, 48, 18, -38, -25, -51, -3, -11, -10, 48, -22, -36, 127, -32, +-31, 52, -15, -15, -32, -17, 13, 7, -13, 60, 29, 3, 104, 45, 21, -15, 2, -52, -9, 83, 14, 51, -14, 8, -19, 8, 1, -21, -10, -31, -35, -28, -5, -20, -4, -53, 17, -11, -29, -32, -19, -21, 6, 12, 10, -10, 45, -7, -4, 2, 16, 19, -22, -8, 5, 8, -14, -4, 13, 12, 11, -87, 27, -28, -14, 26, -49, -39, -6, 11, 23, 21, -37, 54, -47, -33, -65, -53, -2, -27, -44, +-28, -46, 48, 42, -14, -7, 13, 84, -43, 28, -54, -21, 35, 19, -40, -25, 20, -23, 37, 12, 38, 25, 56, -16, 32, -45, 19, 7, -6, 1, 35, -54, -21, -66, 25, -7, -22, 127, 2, -16, 28, -30, -8, -22, -32, 89, -9, -27, -28, -35, 29, -22, -28, 58, 51, -15, 54, -47, 2, 44, -33, -15, -22, -24, 11, -21, -12, 24, -28, 127, -11, 17, -36, 57, -68, -4, -2, 19, -17, 30, 32, +-4, 70, 18, -41, 24, -20, -50, 14, -11, 45, 38, -14, 24, -10, -37, 24, -33, -25, 6, -30, -38, 29, 114, -51, 36, 2, 19, 16, 37, -24, 74, 115, -26, -32, -49, -37, -5, -93, 4, 15, -55, -3, -41, -21, -84, 23, -37, -14, -12, -36, -30, -3, -44, -2, -43, 34, -14, -18, -3, -7, -8, -28, -10, 10, -42, -54, 20, 1, -27, 1, -1, -23, 19, -18, -2, 4, 48, -8, 19, -8, -28, +47, -19, -24, -19, -4, 26, 15, -10, 0, 9, 19, -29, 127, 34, -9, -2, 4, -8, -33, -1, 8, 7, 13, -50, 14, 19, 21, 82, -21, -1, -12, -31, 7, 37, -30, 12, 5, -5, 4, -52, -15, 16, 15, -21, 10, 29, 29, -46, 34, 17, 37, 87, -7, 36, 7, -61, 73, 54, 66, 24, -46, -22, 127, 37, -34, 38, -21, 36, 11, -7, 30, 46, -26, 7, -7, -12, -44, -4, 60, -5, 113, +2, -22, 7, 45, 26, 49, -15, 25, -25, 19, -33, -11, -22, 24, -8, -18, -6, 3, 66, 29, 29, 35, -21, -43, -25, -24, -1, -23, -37, 5, -7, 16, -18, -10, -1, 26, -27, 25, -35, -19, 23, -9, 99, -15, -21, -8, -43, -15, 7, -29, 127, -24, 29, -16, 51, 23, 82, 50, -35, -11, 44, 13, -42, 75, 77, 12, 48, -22, 2, 4, -33, -65, 15, 28, -25, -3, -31, 18, 93, 42, 56, +0, 1, -39, 11, -11, -21, -8, -3, -9, 12, -35, 44, 0, 18, 37, 47, -9, 17, 10, -10, 3, -22, 0, -16, 41, -4, 1, -59, 26, 11, -2, 74, -21, 8, -1, 28, 3, 9, -18, 13, 25, 29, -55, -32, -2, 55, -17, 22, -18, 51, 6, -30, 24, 30, 23, 21, -12, 127, 14, -31, -21, -33, 5, -3, -19, 121, 16, -34, -37, -30, -33, 4, -37, 0, -15, 31, 1, 3, -1, 15, 35, +16, 29, -27, -8, 1, -2, -6, -9, 8, -54, 6, -56, -32, -23, 51, 20, 32, 0, 10, 3, 97, -16, -2, -6, -27, 19, -3, -26, 10, -6, 18, -27, 58, -8, 29, 9, 21, 17, -40, -42, -7, 14, 32, -15, 22, -35, 51, 32, -33, -24, -25, -24, -28, -24, 15, -25, 1, 16, 0, -17, -31, -39, 65, -2, -5, -23, 8, -11, 20, -28, -18, 16, 52, -17, 34, -12, 13, 10, -18, -21, -5, +8, -38, 59, 63, -13, 94, 24, -11, -37, 45, 17, -16, -4, 45, -55, 11, 6, -6, -23, 27, 13, 20, -87, -8, 26, -3, 51, 88, -24, 67, -4, -9, 45, -24, -1, 41, 24, -32, -18, 1, 52, 36, -5, -21, -58, -23, 44, -6, 25, 23, -7, -24, -3, -10, 11, -6, 17, 17, 35, 16, 34, 7, 21, -20, -10, -39, -15, -25, -16, -8, 0, -20, -14, 16, -23, 51, -53, 22, 17, -3, 27, +-4, 16, -35, -30, -54, -19, -12, 35, 2, 3, -29, -24, -19, 10, -22, 72, -7, -31, -52, 14, 0, 11, -22, -9, -31, 17, -51, 8, 14, 52, -2, 8, -12, 18, -24, 8, -49, 32, -34, -18, -22, 38, -39, -15, -7, -7, 26, -22, -36, -45, -10, 16, -14, -13, 119, 78, -43, -23, 51, 63, 57, -52, 26, 12, -9, 23, -40, 36, -59, -78, 71, 42, -22, 31, 6, 69, -78, -49, 13, -19, 6, +-17, -30, 44, 21, 6, 26, -26, -13, 11, 24, 37, -25, 49, -11, 10, 11, -40, 1, 11, 31, -7, -5, -39, -32, 25, -14, 0, 3, 11, -13, 53, -9, -32, 29, -25, -10, 40, 48, 53, -35, 21, 65, -51, -47, -28, -23, -2, 31, 12, -14, 89, -28, -7, -9, -26, -25, -23, 44, -10, -12, -19, -32, 5, -12, -48, -35, 96, 35, 69, -7, -12, 0, -11, 24, 23, 70, -15, -31, -13, -24, 18, +-21, -64, 10, -32, -20, 13, -25, -71, 13, -3, 20, 1, -28, -42, -3, -19, 47, -13, -25, 34, -17, -30, 3, 16, 15, 0, -29, 10, -13, -12, -19, 16, -18, 9, -27, -18, 8, -4, -15, -24, -1, -4, 84, -18, 18, -3, 36, -26, -2, -10, 21, -14, -11, 13, 8, 10, -12, -17, -3, 15, -7, 37, -7, -1, 16, 46, -23, -49, -6, -18, 11, 3, 54, -20, 1, -1, 20, 75, 2, -13, -4, +57, -22, -36, 1, -60, -9, -4, 17, 38, -52, -2, 38, -1, 56, -56, -39, 43, -42, 5, -4, -65, -2, 21, 31, -8, -65, -34, -49, 15, 9, -20, -11, -19, 36, -12, -8, -47, 18, 9, -4, 9, -12, -10, -13, -17, -28, 32, -6, -18, 9, 4, -10, 1, -9, -20, -31, -33, -12, -16, 26, -13, 28, 12, 2, -7, 15, 37, -14, -17, 6, 78, -6, 13, 13, 21, 20, -14, 0, -57, -14, 42, +16, 11, 2, -15, -29, 17, 37, -49, -4, -8, -1, -16, -16, 13, 9, -33, -22, 28, -9, -35, -18, -4, 9, 56, 45, -22, 1, 2, -11, -6, -23, 29, 9, -6, -3, -15, 18, 35, -35, 42, -2, -3, 1, 35, 25, 2, -25, -11, -6, -22, 1, -3, -6, -11, 5, 4, -16, -44, 5, 29, -34, 2, -34, -25, 46, -12, 35, -7, 43, 16, 1, -25, -26, -9, -30, -10, 7, -25, -40, 31, -6, +-3, 48, -22, -36, -21, 29, -7, -4, -5, -14, -9, 19, -11, 35, 2, 127, -16, -5, -9, -17, 23, 14, -20, 9, 13, -24, -18, 16, -31, -7, -37, -56, -4, 0, -17, -29, -40, -3, -18, -15, -8, 70, 16, -43, -45, -3, -2, -41, 37, -6, -13, 41, -1, -11, -3, 28, 17, -52, 31, 112, 13, -3, 0, 3, -19, 10, -16, 31, 57, -8, -2, -10, 37, -31, -3, -48, -1, -22, -29, -8, -18, +-53, -29, -17, 21, 12, -28, -33, 77, -25, -14, 28, 1, -10, 16, 27, 11, -4, 16, -7, 24, 5, 5, 5, 62, 39, -30, -30, -17, -14, -5, -15, -27, -74, 10, 19, 36, 5, 22, -14, 51, -7, -65, -15, -32, 15, -20, -16, 52, -37, 23, -26, 21, 40, -12, -14, -70, 20, -33, 53, -46, -46, 1, -3, 46, 121, -36, 29, 0, 90, 4, -13, -32, 23, -39, 16, 43, 10, -30, -37, -38, -24, +32, 94, -60, -48, -25, -41, -15, 32, 18, -7, -37, 19, 55, 68, 102, -44, 65, 48, 11, 41, -38, -25, 8, -10, -23, 1, 16, -29, -23, 8, 5, 10, -62, 0, 33, -29, -30, 31, -35, 5, 3, -25, -34, 49, -18, 17, 7, -1, -8, -59, 14, -30, 14, 16, -4, -27, 21, 21, 9, 12, -37, -15, 14, 46, -10, 92, 4, 26, 6, -13, -34, -29, 2, 2, 32, -4, 5, 5, -21, -5, 6, +-47, -2, -56, -7, -15, 17, 18, 55, 20, 8, -21, -40, 51, 25, 44, 47, 34, 30, -12, 19, 75, -76, 64, -20, 1, 21, 81, -29, -15, -17, -29, -38, -42, -57, -26, -2, -26, 14, -75, 7, 38, -58, -21, 13, -55, -18, -19, 26, 21, 34, 6, -11, -27, -23, 52, -9, -8, -7, 48, -13, -21, 8, 4, -36, -15, -19, -13, 27, -18, 6, 127, -42, 22, -2, -7, 54, 32, 1, -23, 8, -24, +52, 18, 4, 23, -23, 34, 7, 19, 7, 5, -16, -9, 27, 10, -8, -8, 8, -26, -3, -10, 16, 23, -33, 45, 46, -33, -20, -42, 4, 84, -19, 37, 50, -32, 27, 56, -10, -1, 14, -20, -31, 20, -19, -8, 12, 44, -21, 74, -18, 11, -3, 23, -65, 2, -5, 15, -29, -30, -11, 20, -6, 44, -25, -19, -19, -16, 4, 14, -25, -26, -17, 22, 34, 53, -32, -17, 6, 28, -29, -4, -14, +-9, -26, -28, -9, 74, 7, 4, -29, 14, -24, 6, 52, -47, -22, 35, 43, -17, -20, -33, -49, 33, -14, 19, -38, -6, 4, 20, -17, -1, -44, -30, -2, 26, 35, -16, 5, 54, 127, 45, 50, 35, 30, -31, 71, -5, 11, 36, -15, -23, 27, -48, -1, -11, 11, 2, -3, -4, 41, 27, -38, 20, -25, 23, -45, -4, -7, -27, -2, -30, 92, 62, -17, 7, -1, 43, 19, 2, 35, 23, 35, 22, +36, 7, -30, 3, -27, -9, -34, 8, 13, 31, -27, 44, -21, -10, -43, -1, 10, -9, -19, -1, -31, -41, 20, -24, -55, -8, -7, 33, -31, 34, 19, -31, -1, 57, -28, 12, 20, -25, -19, 43, 17, 105, 33, 9, 12, -27, 42, -34, -14, -1, 31, -3, -54, -6, 47, -71, -7, 63, 23, -46, 32, -1, 4, -6, -8, 10, -28, -8, -5, -22, -2, 20, -8, -21, 41, 62, -21, 16, -56, -36, 60, +-2, -31, -32, 26, 30, 11, -12, 63, -28, -5, -23, -31, -57, -18, -48, -40, -7, -7, -56, -4, -29, 32, -27, -19, -60, 7, -5, 8, 13, -5, -22, -26, -12, 7, -41, 43, -28, 3, 16, 0, 0, -8, -19, 6, -11, 6, -7, -3, -24, -21, 49, 28, -5, 2, -7, 22, -9, -19, -24, -35, -2, -7, -6, -10, -14, -27, 16, -10, 12, 13, 49, -10, 24, -14, 20, -22, 18, -21, -2, -25, 2, +-8, 32, -8, 0, -41, 4, -27, 12, 12, 33, -3, 3, -16, 26, 11, -20, -16, 10, 0, 7, 8, -3, 44, 35, 69, -28, -7, -11, -34, -38, -28, 1, -1, -26, 0, 1, 21, -48, 29, -28, 10, -22, 37, -17, -11, 21, -13, -31, -5, 14, 64, 28, -35, -11, 37, -1, 39, -3, 127, -14, -7, -19, -7, -48, 44, -29, 73, 13, 23, -18, 22, 15, 6, -11, -3, -7, -24, 52, -2, -2, -2, +-34, -21, 40, 8, 24, 17, -21, -2, 61, -11, -40, -16, -25, -14, 16, -52, 26, -11, -1, -41, 45, 32, 34, 61, 31, 5, -2, 4, 46, -3, -23, -27, 60, -73, -29, -15, -11, -1, -23, -6, -7, 12, -24, -10, -4, -38, -16, 0, 21, -6, -26, -5, 6, -8, -33, -17, -13, 5, 16, 22, -32, -7, 8, -33, -32, -10, -30, -12, -86, 51, -22, -16, -38, 10, -29, 30, 77, 32, 3, -37, 59, +-21, 5, -10, -4, -20, 13, -2, -53, 11, -6, 23, -24, -6, -80, -41, 36, 28, -27, 4, -13, -12, 29, 13, -6, -29, 109, -33, -17, 32, -13, -5, 14, 4, -32, 52, 12, 12, -54, -21, -40, 3, -13, -3, -12, 9, -2, 59, 20, 0, -13, -32, 0, -33, -25, -46, -9, -24, -20, 5, -31, -52, -34, 7, -6, -12, -16, -14, 5, -1, -20, 46, 16, -9, -14, -1, -2, 12, -40, 15, 30, -4, +-19, -19, 9, 1, 2, -10, -23, -18, 2, 7, 2, -3, -12, -5, -6, -8, -15, -15, 33, 22, -31, 16, -3, 6, 16, 13, -18, 26, -25, -20, -2, -2, 11, -17, 41, 4, 15, -6, -9, 13, -8, 4, 28, 8, 4, 3, -17, 33, 18, 3, 22, 24, -8, 11, -11, -1, 7, 19, -7, 21, -5, 21, 31, 84, -32, 41, 22, 3, -36, -31, 0, 34, 58, -6, 0, -7, -47, -58, 7, 29, -2, +4, -25, 2, 48, -26, -2, 20, 13, -5, -9, 62, -32, -6, -31, 21, 11, 8, -18, -15, 37, 50, -3, -20, 19, -47, -18, 6, 0, 3, -18, -18, 5, 54, -43, -28, -31, -13, 15, -2, 15, 28, 13, -22, 12, -24, -44, -25, -25, 35, 2, 12, -4, -33, -28, -13, 71, -25, -16, 1, 41, 8, 27, -25, -26, 8, -14, 39, 13, 34, 28, -19, -22, -2, -31, 23, -23, 23, 81, -61, -30, 6, +-46, 6, 22, -14, -4, 2, -25, -22, -26, 18, -4, 33, 3, -33, -28, -8, 20, -3, -56, 7, 2, -31, 4, 20, 11, -48, 0, -30, 26, 102, 54, -50, -38, -7, 4, -34, 11, 15, -21, -50, 61, -12, 29, -32, 66, 13, 27, -19, 19, -14, -19, -67, -21, 10, 79, -30, -3, 2, 37, 40, 93, -13, -52, -37, 3, -15, -4, 54, 1, -37, -12, 12, 19, -21, 22, -2, 28, -32, -18, -12, -21, +9, -6, 6, 32, -4, -9, -24, -7, 22, 21, 2, 127, -13, -28, 9, -19, -39, -15, -16, 46, -14, -24, 10, -15, -3, -23, 127, 8, 18, -7, 16, 8, -11, -18, -25, 14, -19, -12, -19, 26, 5, -3, 37, -30, -60, 0, -48, 33, -18, 10, -61, 9, -2, 59, 19, -56, -36, -15, -49, 20, -27, -40, 46, 6, 18, -61, -19, -50, 7, 2, -17, -39, -16, -30, -1, -35, -20, 4, -9, 15, -6, +-15, -4, -43, 19, -26, -6, -6, -22, 11, -20, 2, 10, -13, 24, -1, -19, -24, 11, 2, 41, -38, 59, 10, -16, 11, -26, -6, -20, -25, 26, -3, -8, 7, -21, 23, -26, -19, 49, 24, -56, -21, -28, -18, -30, 2, 24, -21, -40, -2, 23, 8, 1, -28, -5, -6, 20, -21, -12, -19, 29, -5, 52, -5, 16, -43, 23, 46, 4, -71, 13, -30, -9, 2, 47, -3, -17, -2, 10, 21, -42, -10, +41, 27, 17, -24, -24, 31, 5, -16, -10, 22, -58, -10, 2, 35, 38, 39, -40, 34, -25, -38, 13, 37, -34, 29, -23, 27, -5, 40, -10, 14, 9, -25, 18, 17, 34, -67, 62, 9, -41, 26, 1, 29, 8, -57, -14, -5, -8, -29, 62, -33, 50, -16, -25, -5, -19, 7, -34, 14, 3, 4, -10, -18, -12, 8, -6, 3, 42, -35, 7, -22, -37, -1, 35, 73, -9, -14, -31, -38, 10, -13, 22, +-5, 46, -20, -18, 3, 0, 40, 50, -14, -17, -5, 38, 62, -18, 12, -36, -1, 127, -2, 51, 32, -33, 14, 74, -12, 15, -20, 5, 9, -4, 5, -24, 4, -11, -13, 4, -7, -19, -23, -25, -6, -6, 5, -8, -32, -25, -12, 9, -1, -5, 36, 13, -10, -17, 20, 22, -27, 62, 98, -24, 31, 76, 4, -12, 2, 6, 25, 59, 0, -15, 20, 13, -38, 22, -4, -12, 9, -21, 7, -11, -24, +-8, -49, 46, 17, 98, -14, -10, -7, 45, -32, 2, 20, 6, 41, -1, -26, -9, 19, -38, 62, -58, -16, -35, -13, -61, -1, 41, -26, -28, 47, -25, -9, 56, -25, 60, -1, 16, -46, -54, -3, -11, 10, 9, -8, -24, 7, -4, 16, -30, -2, -51, -9, 9, -3, -25, -16, -21, 1, -12, -13, 21, -36, 36, 68, 8, -24, 84, -4, 3, 20, 11, -27, 34, -41, -30, -2, -11, 3, 12, -11, 5, +-45, -35, -13, -20, 25, -44, -15, -49, 8, 19, -45, 18, 3, 2, -7, 25, 23, 12, -18, -32, 1, -46, 6, -48, 11, 34, -24, 60, -5, 34, 21, -17, 4, -7, -21, -60, -16, 2, -3, 14, -20, 4, -22, -30, -56, -6, 27, -11, -49, 9, 18, -22, 9, -69, -30, 20, -33, -38, -48, 51, 46, 13, 17, -22, 26, -21, 30, -8, 28, -24, 9, 22, 22, 60, -14, -30, -13, 1, 2, -40, -64, +-17, -6, -10, 63, 39, -37, 65, -8, -14, 18, 7, -13, 6, 2, 9, 0, -1, -1, 5, 34, 11, -34, -23, 15, -5, 1, -14, -4, 33, -52, -13, 21, 11, 22, 38, 23, 0, 1, -12, -6, 44, -28, 5, -2, 6, -12, 17, -36, 19, 4, -1, 14, -29, -19, 6, 6, 55, -9, -1, -13, -7, -20, -14, 12, 9, 20, 8, -23, -20, 2, -29, 23, -26, 39, -31, -9, -10, -4, 0, 85, -47, +-4, 37, 1, 13, 56, 59, -28, -35, -21, 27, 4, 73, 34, -44, -16, -20, 68, -31, -38, 1, -14, -2, -6, 12, 14, 29, 4, 7, -25, -45, -8, -24, 49, -2, 16, 6, -12, 19, 2, 45, 13, -2, 18, -15, -25, -7, -3, 13, -24, 3, -18, 36, -25, 7, 12, -34, 66, -32, -28, -36, 34, 22, -13, -19, -34, 23, 8, 61, -32, -8, -16, 23, -23, -11, -7, -7, -45, -36, 5, -38, -26, +13, -27, -24, 39, -31, 3, -17, 99, -20, -28, 49, -2, -7, 73, 2, -30, -21, -5, -9, 27, 14, 23, 5, -9, -14, -31, 44, -10, 19, -9, 13, -62, 31, 2, 66, 50, 52, 25, 38, -22, 54, -57, 21, 7, -15, -7, -34, -61, -41, -6, -3, -7, -18, -37, 17, 8, -50, -5, 48, -7, -35, 20, -14, 9, 11, 12, 41, 14, -3, 7, -11, 9, -23, 52, 12, -9, -36, -16, 22, 51, -40, +-10, -10, -28, 30, -9, 34, 29, -4, -24, -11, 4, -26, 4, 9, 18, 57, 5, -7, 22, 35, 7, -29, -16, -20, -25, 46, -25, -12, 4, -16, 74, -20, 1, -19, -8, -24, 1, -10, 24, -19, -60, 25, 32, 80, 38, -7, -8, 6, 27, -21, -13, -25, -3, -8, -7, -13, -6, -3, 1, 13, -7, -9, -7, 44, -1, 45, -8, 16, 0, 5, -9, -12, -2, -11, -11, -16, 8, -7, 1, 15, 47, +127, 41, -1, 14, -24, -4, -27, 19, -62, 13, 16, 5, 4, -25, 17, 127, -23, 13, -10, 29, 12, -28, 0, 54, 20, -24, 30, -17, 14, 10, -4, 18, -13, -34, -30, -37, 1, -8, 80, 53, -27, -10, -53, -32, 98, 39, 55, 39, -50, 13, -29, -29, 8, 10, -45, -31, 5, -50, -41, 29, 9, -2, -4, -6, -9, -8, -30, -25, -5, 4, -22, -46, 5, -13, -1, 86, -71, -44, 24, -22, 8, +-16, 19, -30, 12, -18, 7, 127, 11, -10, 36, -29, -6, 26, 73, 13, -9, -24, 35, 19, -18, -25, 13, -30, 0, -25, 14, 21, 41, -2, -26, -27, -43, -27, -32, 66, 79, -20, 14, 48, -20, -19, 13, -61, 13, 24, 36, -9, 32, 17, 48, 49, -5, 30, -15, 42, 16, -21, -70, 16, -36, 81, -20, 45, -8, 15, 34, -31, -32, 14, -9, 39, -37, -22, -37, 4, 84, -4, 59, -44, 13, 38, +3, 0, -34, -25, -11, -14, -45, -71, -71, 22, 7, -10, -32, 17, 26, -31, -36, 127, -22, 66, -47, -26, 84, 15, -52, -34, -9, -51, -19, 58, 5, 73, 29, 27, 33, 19, 16, -24, 5, 12, -33, -21, -16, 7, -9, 32, -2, -24, 12, 27, -21, 4, -2, -21, 5, -11, 6, -4, -2, -35, 9, -20, 42, 6, 7, -23, 4, -6, -38, 3, -3, 4, 3, 50, 1, 1, -20, -48, -16, 102, -37, +9, 21, 37, 17, 29, 18, 24, 15, -3, 20, -20, 44, -28, -16, -15, -14, 72, -16, 30, 22, -42, -20, -35, 41, 30, 31, -12, -27, 43, 24, -21, -29, -32, -4, -9, -81, 41, 38, 49, 1, -25, 20, 38, 44, -36, 23, -23, -21, -12, -6, -5, -10, 17, 0, -1, -28, -17, 25, -49, -35, -21, -13, -35, -14, 0, 9, 65, -30, -7, -24, -15, 19, -20, -7, 11, -15, -22, -10, -3, -19, 7, +-21, -2, 32, 25, -35, -76, -5, 37, -1, 17, 32, 6, -29, 97, -36, 5, 34, -21, 18, -7, 15, -1, 6, -4, 13, -8, 11, -39, -39, 33, 76, 102, 0, -16, -22, -30, -35, 39, 20, -40, 43, 25, -22, -6, 16, 29, 26, 0, -5, 16, 66, 24, -9, -86, 70, -20, -60, -17, -43, 17, -47, -16, -30, 22, -52, -34, 23, -47, -11, -27, -43, 44, -55, -18, -15, -17, 35, 11, -6, 72, 0, +29, 24, 5, -15, 20, 31, 13, -34, -49, 12, -4, 37, -70, -8, 48, 5, 12, 37, -21, 25, -14, -26, 44, 6, -10, 8, 8, -26, 8, -24, -45, 5, 52, 41, -18, -56, 11, 13, 3, 38, 3, 4, -11, 22, -2, -5, -13, -27, 58, 1, -9, -51, -12, -42, 9, -7, 24, 77, -1, -4, -29, 8, -12, -49, 18, 59, 12, 34, 8, 14, 19, -4, -10, -6, 0, -24, -42, 30, 72, -7, -16, +15, 24, -17, -22, 10, 5, 38, 13, 17, 4, 28, 32, -11, -12, -21, 12, -45, 25, 24, -28, 20, -6, 0, -21, -10, -19, -2, -5, 35, 60, 1, 14, -33, -20, -30, -46, 73, 56, 18, 23, 22, 92, 14, -21, -4, -24, 9, -54, -16, -9, -17, -38, 41, -8, -45, -7, -30, 0, 40, 0, -54, 127, 16, -26, 19, 35, 15, 10, 5, -8, 45, -30, -1, 5, 46, 13, 19, 3, -24, 13, 76, +-2, 83, 24, 37, -75, 11, 18, 4, -52, 14, -10, -16, -27, -32, -10, 11, -20, -34, 30, 53, -17, -26, 101, -8, 24, -4, -9, 17, -28, 4, 4, -39, -1, 29, 19, -29, 9, -52, -2, -54, 2, -54, -18, -34, 37, -56, -49, -53, 4, -19, 2, 44, -13, 21, -5, -46, -40, 19, -39, -22, 3, -15, 52, -11, -36, 9, -3, 61, 38, -27, -18, -24, -25, 24, 10, -41, 18, 8, 69, 11, -41, +-6, -39, 22, 22, -14, -6, -19, 42, -19, -48, 5, -8, -13, -19, 19, 17, 12, 3, 57, 27, -17, 5, 22, -17, -12, 8, 0, 23, 31, -10, -60, -21, -41, 4, 39, -10, 112, 5, 23, 12, 4, -20, 13, 22, -4, -24, 30, -10, -15, -20, -27, -43, -28, -23, 6, -28, -8, -16, -20, -3, -25, 8, 16, -1, -20, 26, -22, 15, -11, 22, -24, -25, 27, -8, -21, 10, -1, 41, 26, -21, -23, +7, -1, -11, -27, -21, 24, 10, 17, 7, 4, -18, -21, -24, -5, -36, 13, -1, 3, -2, 27, 6, -20, 35, 31, -40, 0, 7, -28, 15, -7, -3, -1, 12, -13, -3, 21, -27, 14, 36, 4, 14, -11, -17, -37, 104, -2, -14, 23, 17, 30, -17, 3, 3, -12, 23, 46, -17, 10, -29, 39, -48, -14, 8, 43, 24, 17, -29, -41, -3, 20, -20, 21, -39, -5, 14, 35, -19, -1, -7, -21, 0, +4, 40, 13, 44, -32, 20, -15, -18, -40, 24, -22, -5, -26, -2, 13, -27, 9, 10, 17, 8, -4, -14, 39, 36, -1, -2, -25, 6, -40, -43, 65, 26, -8, -7, -55, -41, -16, 19, -47, -6, -18, 26, 7, 32, -15, 3, 17, -1, 3, -8, -27, 90, -6, 59, -21, -4, 8, -23, 70, 127, 69, -18, -48, 38, -59, -20, -15, 24, -11, 73, 4, 21, -37, 33, -24, -9, 6, 47, 27, 2, 19, +5, 13, -15, -1, 78, 5, -62, -40, 26, -25, 11, -48, 92, 54, -7, -18, -30, -27, -32, -24, 66, -30, 27, 0, 28, -24, -17, 7, 8, 64, -14, -6, 28, -15, 13, -40, 12, 17, -18, 3, 3, 39, 45, -13, -4, -25, -4, -7, -10, -5, 1, -17, 32, -4, -55, -11, -7, -30, 14, 1, -13, 6, -10, 26, 62, -51, -15, 127, 6, 17, 59, 23, -6, -23, 4, 41, 3, -23, -11, -43, -9, +-4, 19, 5, -15, 25, -8, 29, -32, -10, 40, -7, 0, 7, 30, -6, -10, 40, -5, 35, 1, 12, 15, -3, -5, 1, -11, 61, -2, -16, 15, -7, -13, -17, 14, -11, 40, 79, 32, -3, 3, 19, -1, -8, 56, 14, 48, -9, 8, 22, 10, 32, 3, -1, -23, -17, -11, -29, 5, -13, 9, 2, -28, -1, 3, 19, 3, -24, 31, -48, -13, 36, -43, 22, -8, -26, -43, 0, 12, -25, 17, -30, +-22, -18, 32, -17, -21, -34, 44, -29, 18, -20, -37, 19, -59, -2, -1, -31, 54, 5, -26, -24, -15, -29, 15, 43, -54, -19, -31, -69, -8, 16, 4, -70, -72, 84, 124, -23, -25, -16, 0, -2, -11, 7, 9, -16, 26, 60, -7, 6, -36, -19, 34, -24, -2, 19, 5, 90, -18, -10, -27, -2, 39, -5, -15, -26, -41, 24, 23, 24, -15, 1, 1, -5, 43, -33, -10, 62, 83, -32, -11, 17, -16, +89, 91, -61, 8, 24, 77, -11, 21, 17, -36, -49, -31, -1, -53, -12, 10, -8, -31, -33, 9, 3, -34, 4, 15, 19, -5, -43, 41, -30, -3, -14, 22, 8, 35, 78, -13, 8, 19, -1, 26, -8, -12, -19, -26, 20, 100, 3, 10, -48, -21, -8, 18, -25, -28, 6, -32, -32, 95, 44, 28, 53, 26, 0, 27, -6, -63, 20, 25, 84, -42, 17, -18, 14, -60, -76, -9, -3, 14, -23, 14, -21, +14, -23, -25, -12, 70, 14, -11, 3, 6, 4, 24, -19, -42, 1, 11, 25, 8, -8, 59, 26, -8, 7, 2, -23, -13, -33, 17, 6, -4, 35, 9, -10, 32, -49, -23, 0, 20, -13, 17, -38, -17, -8, 45, 9, -21, 10, -31, -14, -4, -33, -9, -8, -1, 6, -16, -8, 23, -12, 2, -2, -9, 9, -24, -7, -30, -3, -11, -47, 7, 11, 8, 15, 31, -11, -16, 14, -48, -18, 67, -10, -17, +5, -9, -2, 75, 5, -34, 1, -65, 7, 35, 33, -48, 31, 26, -36, 28, 12, 34, -19, -7, -7, -32, 38, 6, -38, -10, 39, -22, -34, 1, 7, -2, 44, 9, -8, 3, -21, 24, -24, -11, 41, 8, 0, -3, -23, -4, -7, 5, -14, 13, -9, 24, -25, -32, -37, 8, 22, 18, -16, -21, -25, -12, -19, -22, 2, -40, -9, -4, 45, -67, 50, 68, -10, -44, -5, -8, -3, -44, 25, -21, -17, +-18, 18, 31, 5, -54, -11, 3, -16, 13, -53, 76, -18, 85, -26, 35, 14, -20, 4, 12, 3, 4, 16, 88, 29, 67, 11, -4, 10, 0, -11, -36, -35, -51, -34, 24, -8, -15, -10, -19, -54, 72, 12, -20, 51, 36, 31, 5, -46, -32, 48, -21, 0, -5, -24, 64, 3, -17, 44, 29, -4, -19, 4, -12, 26, -19, 21, 58, 33, -17, 17, 27, 14, -5, -9, 13, 42, -25, -11, 32, 20, 6, +11, 33, 17, -15, -32, 31, -25, 32, 7, -16, 35, -22, -5, 24, 13, 0, 13, 17, -21, 6, -17, 80, 33, -19, 71, 18, 66, -8, -24, 35, -40, -12, -11, -2, -9, -26, -20, -10, -27, 58, 12, 13, -31, -19, -26, 1, -28, 4, -2, -24, 31, -8, -4, -42, -21, -3, 11, 2, -11, 15, -17, -22, -23, -32, -20, -7, 14, 14, 1, -27, 8, 10, -16, 21, -8, 3, -3, 8, 11, -7, 10, +-8, -20, -6, -20, 30, -55, -24, -7, 18, 0, 3, -8, -16, -20, 18, 11, -14, 4, -30, 4, -8, 8, -28, -23, -45, -12, -3, -2, 24, 17, -13, 9, 17, 37, -5, 32, -1, -29, 93, -8, -33, -44, 12, 18, -9, -32, 8, 45, 13, -8, -2, -3, -27, 11, 62, 19, 49, -38, -48, 100, -29, 35, -14, 5, -9, -15, -29, -3, 35, -24, -5, -21, -35, 10, -13, -13, 28, -4, 62, -6, -4, +20, -15, 17, 0, 60, -7, -4, -1, 9, 4, 2, -25, 13, 9, -28, 21, 25, 3, -5, -6, -13, 38, -26, -1, 71, 4, 9, -23, 54, 5, -21, -40, -5, -20, 3, -27, -37, -32, -9, 23, 2, -14, -16, 2, 34, 6, 6, -3, -48, 25, -13, 3, 3, 13, -43, -17, -22, 3, 11, 55, 56, 16, -43, 80, -49, -45, -13, -42, -24, -20, 49, 17, -5, 51, 10, -19, 30, -7, 30, -26, -32, +96, 52, 84, -10, 23, -9, 29, -26, 5, -18, 0, -59, -32, 110, -10, 26, 6, 73, 112, 3, -20, 47, -16, 2, 50, 24, 13, 75, 0, -1, -5, 31, 27, -35, 10, 6, 43, 35, 23, -13, -5, 11, -22, 4, 3, 36, 11, -7, 44, 30, 19, -8, -20, 0, -6, -39, 55, -16, 18, 3, 20, -23, 12, -32, 50, 21, 5, -7, 5, 61, 17, 12, -11, 5, 5, -42, 18, 15, -10, 12, 4, +19, -14, 31, -11, 28, 13, -17, -41, -23, 0, 8, -13, 25, -19, -58, -31, -4, -26, 10, -19, -16, -3, 103, -13, -1, -26, 1, 10, 35, -13, 29, -43, -1, 55, 9, 2, -46, 12, 3, 35, -9, -8, -51, -18, 33, 8, 17, 68, 1, -8, 46, -17, 4, 22, -10, -15, 48, 31, -5, -3, 42, 11, -24, -1, -7, -3, -12, -23, -21, -28, 12, -29, -32, -4, -40, 8, -17, 48, -17, -23, -11, +13, -11, 18, 59, 65, -27, 57, -38, 17, 127, 10, 56, 3, -8, 29, -2, -14, -3, -13, 34, 6, 50, -37, -34, -7, 15, 13, 27, 24, -27, 2, -68, 1, 27, 56, 13, 10, 89, -26, 11, 31, -13, 91, -1, -20, -21, -42, 83, -44, -6, 38, -43, 1, 34, 1, -44, 30, -3, 4, 27, 26, -56, 40, -1, -25, -37, 10, -6, -27, -8, 28, -28, -19, 17, -61, -24, -18, -59, -50, 39, 16, +1, -49, -6, 81, -19, 37, -21, -33, 28, -49, -29, -26, 21, 18, -28, -57, -40, 10, 12, 76, -35, -4, -1, 6, -8, -7, -21, 2, -1, -14, -27, 26, 7, -22, 4, 18, -10, -18, -18, 23, -26, 37, 5, -43, -40, 80, -4, -2, -2, 41, 28, -3, -42, 22, -27, -6, -5, 1, 12, 23, 6, 14, -1, -7, -24, 57, 24, -3, 7, -11, 50, 25, -25, -16, 48, 0, -14, -15, 6, 5, -22, +-3, -24, -10, 32, 14, -11, 39, -29, 57, 0, 4, -8, -6, 4, -13, 2, 16, -4, -10, 3, 45, -9, -9, -22, -8, 20, -13, -15, 23, -12, 66, 53, -27, -31, 5, -2, 18, -14, -6, -22, 11, -18, 22, -8, -13, -12, -16, 25, -2, -8, 20, -6, 42, 5, -39, -23, 17, 3, 22, -11, 16, 27, 38, 6, 64, 44, 21, 4, 45, -34, 16, -50, 23, 43, -8, -7, 22, -9, 43, -45, -8, +3, 5, -26, -46, 7, 37, 64, 54, -8, 52, 1, -6, 36, -36, -10, -13, -56, -28, -10, 9, 6, -26, 33, 28, 13, -14, -22, 24, -11, 1, -6, -22, -25, -11, 14, 49, -4, 42, 19, -22, -2, 4, 13, 36, 98, -34, 31, 63, -4, -38, 12, 13, 36, 4, 16, -13, -4, -18, -15, 127, -79, 5, -1, -22, 68, 15, 5, -42, -21, -11, 17, 53, -6, 3, -18, 16, 34, -28, 0, 17, -13, +19, -17, 7, 5, 11, 4, 59, -36, 52, 127, 64, 23, 36, -13, 4, 2, 15, -23, 2, 13, 36, -38, 24, 5, 32, 62, -30, -38, 49, -5, -22, 3, -33, 47, -33, 3, 23, 4, -20, -17, -30, -6, -1, 58, 2, 23, 48, 20, 8, -12, 77, -40, -3, -27, -24, -4, -3, -8, 2, -16, -4, 36, 20, -1, -23, 2, -7, -23, -15, -6, 16, 41, -20, -52, 9, 25, -5, 10, -17, -24, 9, +29, -12, -31, -18, -3, 21, 6, 56, -32, 0, 0, 2, -16, -8, -2, -9, 35, -26, -5, -7, -5, -6, 75, 9, -17, -17, -13, 8, 18, -26, -9, 5, -4, -21, -23, -30, -34, -6, -10, -37, 17, 34, 34, 1, 30, 4, 2, -66, -16, -46, 30, 1, -40, -42, 100, -2, -14, -5, 52, 12, 48, -15, 37, -12, 14, 11, -9, -15, 6, 127, 40, -3, 31, 8, 75, -17, -9, -26, -21, -27, -23, +-21, -12, -20, 66, -2, 2, -8, -14, -31, -16, -39, 11, -13, -12, 31, -9, -18, -8, -16, 8, -11, 8, 14, -10, -12, -9, 16, -45, -18, 53, 26, 80, -22, 27, 16, -1, -39, -39, 5, -36, -71, 29, -11, 0, -20, 78, 3, 29, -40, -20, -35, -19, 7, -38, 16, -52, 11, -26, -14, 59, 29, -18, 20, -28, 5, 57, -50, -56, 22, -10, -7, -5, 65, 25, -30, -20, -12, -50, -34, 28, -5, +-52, -48, 12, 68, -16, -31, -3, 32, -24, 30, 33, 0, 95, 15, 127, 20, -21, 118, 20, -22, -1, -53, -8, 10, -9, -29, 8, 15, -30, -82, 76, 17, 6, 14, 55, -14, 2, 3, 14, -14, -20, 60, 19, 1, 9, 4, -19, -26, -26, 5, -13, 3, -5, 8, -4, 52, -20, -2, -4, -66, -3, -33, -17, 26, -23, -20, -18, 39, 0, 16, -15, -29, -23, -28, 22, 13, -47, 1, 7, -6, 21, +-12, -20, -22, -30, 21, -8, -11, 49, -33, 15, -15, -8, 73, -12, -44, 8, -18, 94, -7, 2, 35, -7, -3, -23, -17, -8, -14, -6, 3, -5, 34, 35, -17, -23, -4, -10, 28, 6, 6, -6, -19, -9, 10, -10, 2, 11, -22, 6, 14, -19, -15, -24, -6, -1, 44, 2, -24, -20, 39, -1, -65, -13, -33, 2, -26, -6, -4, 29, 39, 31, 18, -16, 25, 4, 15, -14, 13, -7, 0, -22, -4, +34, 11, 46, -89, 17, -10, 23, -14, 28, -52, -52, 21, 82, 72, -7, -11, -37, -36, -8, -8, -8, -50, 27, 1, 35, -16, -31, 10, 24, -45, -32, 14, 71, 39, -13, 3, 20, 25, 3, -4, -6, -10, 61, 34, 6, -27, -12, 33, 15, 46, -10, -25, -9, 44, 24, -4, 0, 23, -15, 17, 0, -13, -22, -25, -2, -2, 40, 22, 16, 13, -2, 15, 7, 19, -57, 12, -45, 78, -54, -34, 21, +-11, 47, -6, -16, -6, -35, 3, 39, 49, 11, -2, -25, -8, -40, -39, -27, -8, 10, 10, 45, 54, -36, 36, -7, 14, 29, 14, 41, 4, 30, -8, 0, -18, 39, 10, 21, 43, -35, -40, 8, -17, -30, 5, 25, -11, 13, -25, -48, 18, -30, -27, -12, 8, 12, 72, -22, -3, 32, 30, -28, 13, -22, -21, 41, 48, 8, 31, -30, 47, 4, 56, -31, 69, -4, -24, -18, -1, 22, -28, -5, -49, +28, 43, -29, 16, 73, 40, 29, 2, 3, -25, -41, 10, 38, 0, -8, 26, -11, -6, -32, 16, 22, 10, -10, -13, -11, 41, 82, 43, 15, 59, -5, 6, -20, 45, -50, -50, -24, -13, 19, 29, 78, -72, 6, 106, -43, 67, -59, 42, -44, -33, -7, 76, 46, 17, 65, -26, 7, -30, -6, 56, 30, -21, -30, 20, 25, -2, -33, -37, 36, 5, -23, 31, 21, -16, -7, 34, 32, -19, -37, -15, 10, +28, -36, -17, 34, 23, 11, -32, -11, -29, -1, 1, 64, -31, -23, 19, 0, -22, -35, 72, 22, 3, 18, -1, -4, 12, -14, 7, -2, -3, -33, -42, 24, -9, 0, -12, -63, -41, 7, -21, 8, 28, -9, -11, 28, -11, -11, -20, 28, 92, -25, 4, -35, -15, -36, -12, -43, 1, -46, -52, 80, 58, -1, -12, -42, 4, 24, -42, 35, 27, 27, 4, 9, 74, 4, -29, 23, 11, -46, 64, -9, -16, +3, 9, -15, 78, -1, -13, 43, -37, -22, 75, -14, -9, -25, 8, 35, 0, 21, 48, -51, 61, 68, -31, -21, -9, 32, 44, -47, -15, -22, 127, 19, -36, 4, 12, 5, -18, 34, -26, 72, -11, -46, -12, -6, -62, 18, 37, 30, -25, -23, -2, 5, -64, 22, -27, -55, 51, -7, 6, -38, -11, -47, 3, -26, -73, -25, 34, 90, -24, 28, 4, -30, 43, -21, -23, 66, 3, -7, -22, -18, -25, 46, +10, -38, -51, 24, -38, -45, 36, 31, -27, -29, 23, -12, 101, -38, 9, 28, -28, 8, -26, 34, -4, 127, -12, -39, -38, 61, -52, 39, 29, 5, -54, 51, 26, -5, -26, 2, -67, -48, 10, -19, -28, -51, -50, -60, 91, 46, -12, -5, 48, 11, 6, -28, 3, 22, 33, -6, -10, -11, -15, -22, 29, 6, 34, -6, 27, 46, 69, -2, -36, 46, -32, -10, 22, 67, 7, -13, -35, 14, -2, 51, -1, +3, -26, 1, 13, 47, -1, 38, -1, -5, 13, -18, -29, -23, -9, 23, -8, -32, 0, -37, -11, 25, -22, 37, 21, -12, 38, -39, 3, -22, 17, -35, 38, -4, -20, -17, -14, -33, 6, -63, -14, -14, -13, 21, 18, 7, -73, 7, -18, 33, -78, -28, 3, 65, -8, 37, 7, 15, 13, -39, -75, 21, -9, 38, -27, -8, 12, 19, -11, -53, -20, -7, 73, 23, -19, -9, 36, 21, -24, -10, 0, -5, +21, 19, -6, 4, 46, 16, -58, -18, -7, -28, 27, 23, -26, -21, 7, -23, -37, -8, 2, -10, -39, 4, 45, 12, 4, -30, -53, 33, 27, -5, -7, 10, 5, -33, 45, -33, -24, -6, 127, 106, -17, -41, -22, -26, 53, -9, -3, -58, 47, -15, -23, 39, 8, 28, 85, -16, 14, -15, 28, 21, -23, -33, -5, -19, 40, 75, -18, -28, -36, -33, 68, 11, 15, 7, -22, -34, 16, 56, 71, -43, 8, +-33, -2, -33, 26, 62, -24, 22, 116, -23, 10, 4, 13, -4, 3, 20, -31, -3, -9, 105, 10, 58, -19, 11, 30, 30, 0, 12, -47, 24, -52, -59, -23, -7, 2, -41, 4, -50, -11, 19, 23, -23, 12, -17, 6, 16, 9, 38, 23, -42, -14, 45, 27, -24, -31, 87, -14, -8, -27, -41, -5, 4, -40, -8, -81, -20, 15, -14, -11, 74, 58, 25, -79, -84, -26, -18, -38, -25, -47, 54, 4, -37, +-19, 31, -36, -5, -51, -17, 23, -30, -48, 4, 13, -11, -29, 9, -16, -30, -18, -11, 35, 29, 24, 28, 4, 29, -38, -11, 32, -24, 20, -24, -30, -12, 42, 37, -10, 51, -4, -17, 17, 8, 19, -10, -6, 4, -35, -24, 39, 10, -33, -8, 21, -18, -12, -25, -17, 18, -4, 22, 20, 12, -14, -5, -27, 20, 81, 37, 30, -23, 22, 36, 33, 37, -7, 127, -34, -35, 17, -7, 60, 94, 56, +-26, -36, -4, -35, -15, -15, 7, -46, -49, -13, -38, -2, -13, 1, -20, 7, 58, -19, 21, -34, 62, 0, -7, -33, 22, -16, -12, -12, 0, 85, 3, 41, -37, 5, -9, 37, -58, -35, -94, -56, 34, -34, 54, -5, -31, 98, 9, -8, 7, 6, 24, 5, -3, 6, -32, 31, 35, -19, -5, -4, 6, 4, 39, 2, 10, -32, -8, -15, -37, 6, 3, -12, -67, -26, -7, 23, 3, 0, -3, -40, -13, +-12, -13, 23, 30, -24, 34, 27, -3, -11, 55, -35, 10, -84, 15, -4, 5, -12, 15, -25, -1, 93, -3, -25, 98, 8, 58, 40, 34, 43, -9, -13, 79, 47, -25, 19, -24, -23, 19, 127, -17, 9, -21, 21, 2, -38, 70, -1, -53, -21, 38, 17, -11, 20, -27, -38, -7, 2, -7, -29, 33, 69, -39, 9, -15, -17, -4, 37, -2, -25, -8, 18, -13, -2, -12, -27, -9, -3, 1, -53, 8, -1, +-14, -13, 18, -22, 21, -10, -7, 47, -9, 39, 21, -4, 26, -6, 17, 9, 8, 17, -5, 1, 1, -1, -1, 5, -32, -52, -19, -57, 5, 24, -40, -11, 33, -5, -32, 37, 1, 6, -21, -13, 19, -8, 11, 22, 61, -36, -5, -11, 14, -14, -21, -11, 8, -26, 63, 47, -9, -14, -10, -36, 63, 39, 34, 22, -38, 25, -56, -1, -2, 0, -29, -41, 26, -10, 10, -26, 29, 45, 79, 45, -39, +60, 1, -29, -20, 12, 58, -15, 8, -3, 7, 27, 22, 0, 1, 46, -28, 14, -45, -28, -69, 0, -25, 27, -11, -17, 23, -44, 0, -22, -26, 21, 12, -14, 13, -3, 25, 33, -28, -26, 24, 57, 4, 109, -19, 2, -6, -18, -21, 48, -4, 1, -3, 15, 8, 4, -6, 10, 21, -40, 31, -56, 10, -12, -71, 43, 63, -37, 7, 19, -26, 12, -21, -33, 10, -34, -10, -13, -26, -19, -13, -13, +-17, -15, 39, -17, -16, 24, 10, 14, 17, -20, 56, -21, 15, -3, -32, -36, 2, 12, -31, -40, 31, -25, -3, 1, -45, -28, -12, -30, -9, -14, 9, 29, 57, 71, 2, -34, -33, -6, -16, -2, -27, 34, 9, -28, 12, -1, -10, -1, -7, 47, -20, -11, 46, -32, 5, -25, 25, -10, -8, 53, -34, 37, -23, -26, -58, -32, 11, 60, -44, -14, -57, -1, -60, 16, -24, -7, 127, 4, -18, 25, -19, +-26, -11, -6, -32, -53, 3, 54, -49, 4, 63, 16, 30, -48, 17, 21, 49, 45, -31, -32, -16, 47, 6, -29, -21, -36, 3, -23, -34, 60, -61, -21, -30, -22, 14, -46, 36, 30, 4, 26, -19, -1, -16, 1, 25, 50, 10, 24, -21, 62, -3, 0, 31, 15, -9, 7, -6, -1, 1, -21, 9, -24, -21, -5, 59, -1, -16, 6, 3, 12, 5, -15, -10, -23, 10, 4, 31, 6, -4, 42, -40, 17, +4, 25, 11, 9, 0, -27, -4, 26, -21, -25, 15, 16, -9, 6, 48, 16, -22, -30, -19, -33, 28, 3, -3, -35, -48, -19, 2, -19, 25, -37, 11, -33, 29, -1, 58, 51, 52, 29, -16, -18, -76, -24, 11, -6, 16, 30, 32, -16, -12, 4, -32, 77, 66, -10, 24, 43, 114, -23, -16, 2, -64, -33, -8, -65, -59, -27, -19, 42, -28, -11, -15, -21, 2, -21, 5, 61, -4, -100, -52, 44, -30, +-24, -13, 57, -14, 1, -1, -36, -16, -50, 5, -19, 57, -30, 13, 32, 3, -6, -11, 51, 18, -16, -11, 25, 51, -52, -25, -12, -9, -8, 12, 41, 14, 61, -44, -14, 0, 17, -73, 53, -47, -47, 0, 16, 15, 116, -29, 78, -1, -7, -18, 28, -8, -25, -47, -25, -15, -15, 12, -19, 26, 4, 19, -69, -31, 61, 78, 17, 30, -6, 8, -14, -4, 24, 120, 82, -18, 7, -57, -43, 5, 1, +-34, 10, 49, -1, -16, -31, -17, 28, -33, -32, 69, 20, -32, -27, 10, -3, 1, 24, -39, -12, -8, -47, -16, -10, 3, 14, -7, -8, -2, 7, 36, 30, -13, 20, -50, -6, -4, -8, -34, -32, 127, 16, -12, -6, 22, 2, -12, -24, 60, 23, 8, -24, -27, -4, -2, 3, -29, 63, -9, -38, -16, 21, -1, 20, 34, 2, 10, -2, 39, 32, 20, -22, -2, -13, 3, 11, -15, 19, 13, 7, 37, +-8, -26, -72, -6, -25, -23, 2, 4, -49, -47, 16, -8, 37, -67, -6, -48, 8, 29, -13, 7, -29, 43, 46, 28, -15, -11, 34, -41, 29, -41, 11, -9, 25, -29, -31, -25, 76, -32, -36, -2, -59, -13, -44, -15, -3, -42, 23, -14, 27, -20, 11, -15, 19, 46, 1, -51, -16, 0, -16, -35, 6, -8, -15, -4, 6, -29, -3, -19, -3, -17, 22, -21, -2, 6, -48, 26, -30, 29, 40, 20, 37, +-26, -19, -7, -18, -53, -32, -4, -10, -16, -24, 31, 26, 20, -31, 70, 40, 18, 29, 13, -22, 11, -32, -25, 8, -43, -3, -14, -5, -4, -30, 6, 12, 41, 10, -35, -16, -4, 41, -20, -5, -29, -1, -31, -17, 24, -44, 42, 127, -48, -27, 33, 33, -20, -2, -33, -35, 10, 15, -17, 48, 71, 16, 12, -3, -14, -29, -12, 30, -2, -28, 63, 1, -5, 47, 14, -20, -21, -44, -18, -41, -47, +-39, 26, -4, -61, 47, -71, -56, 22, -50, -10, 61, 56, -7, -30, -28, -27, 15, -38, 16, -23, -13, 43, 44, 19, -40, 17, 24, -7, 2, -12, 6, -21, 19, -4, -3, 13, -37, -42, -19, -52, 25, 43, -31, -35, 7, -30, 3, 10, 33, -19, -12, 29, 18, 23, -47, -27, -4, 34, 9, 46, -16, -2, -3, -38, 57, -2, 1, 6, 0, 40, -9, 11, -26, -12, 14, 4, -5, 19, 28, 24, 17, +-35, -22, -37, -4, 0, -23, -12, 14, -29, -6, 38, -1, -37, 14, 79, 22, 9, -29, -6, -5, -1, 16, -34, -60, 54, -11, -15, 30, -25, -14, -33, -10, 63, -29, 6, 19, -23, -9, 24, -24, -7, -14, 1, -4, -21, -5, 83, -64, 1, -3, 19, -10, 36, -3, -11, -7, 4, 11, -9, 43, -29, -16, 12, 16, 54, 35, 12, 81, -36, -50, 89, -12, 16, -20, -45, 47, 58, -38, -5, -25, 17, +-13, -31, -19, 1, 32, 4, -22, 38, -20, -40, 97, -31, 75, 60, 64, -28, 42, 46, 61, 23, -8, -20, -73, 33, -17, -5, -23, 36, 50, 0, 7, 2, 8, 38, -21, -3, -35, 9, -34, -12, 54, -19, 17, -26, -10, 9, 3, -31, 43, -14, -32, 37, -51, -2, 1, -21, -25, -11, 4, 21, 40, 28, -27, 50, -13, -24, -11, -84, 26, 53, -52, -29, 3, 57, 93, 25, 4, 45, -7, -15, 30, +35, 30, 36, -19, 21, 47, -44, -50, -20, -60, 70, 38, 5, 68, -12, 65, -24, -30, 5, 43, 74, -14, -69, -59, 38, -48, -11, -34, 10, 3, 46, 63, 22, -21, 59, -17, -14, -28, 99, -34, -93, -39, -16, -12, 17, -18, -31, -16, 9, 65, -26, 3, -6, -14, -10, 47, -13, -26, 34, -14, -24, -20, -4, -10, 15, 52, -35, -18, -47, 68, -5, -30, -13, -23, 34, -52, 0, 51, -23, -14, -11, +12, 2, -36, 0, -22, 17, 10, 19, -9, 12, -11, -25, -21, -28, 4, 38, 26, 17, 0, 45, -24, -34, 8, -34, -24, -22, 3, -28, -38, 3, -41, -61, -36, 50, -49, 127, 27, -10, -42, 13, -19, 6, -38, -30, -22, 6, 12, 15, 30, -22, -45, -3, -32, 88, -21, -43, -57, 15, 111, 127, -6, -24, -23, -2, -12, 42, -46, 9, -7, 3, -28, -1, 67, -8, -17, -24, 11, 5, -8, 14, 19, +39, 12, 49, -36, -57, -22, -12, 18, -1, -43, 2, -20, -16, 10, -27, 33, -5, 78, 6, -45, -7, -17, -17, 19, -11, 33, 9, -57, 67, 0, 11, -7, -45, -26, -16, 13, -29, -20, -40, 21, -3, 15, 12, -25, 5, 6, -18, 17, -32, 14, -30, -22, 7, -10, 35, -4, -4, 36, 2, 53, -32, 34, 7, 100, -3, -14, 30, -24, 6, 3, 15, 0, -7, 27, -11, -28, -4, -16, -40, -28, -20, +-22, -7, 53, -19, -38, -13, -31, 27, -42, 7, 56, -43, -14, 66, -7, -11, 41, -66, -46, -19, 36, 9, -11, -58, -39, -52, -24, -9, 48, -5, 14, 43, -49, 104, -58, -25, -21, -47, -8, -15, 30, 70, 43, 31, 4, -31, -11, -49, 9, -22, -26, 50, 88, 1, -38, 12, 16, 15, 47, -48, 46, 58, -9, -29, 10, -16, -20, -20, 25, -7, -23, -32, -38, 15, -19, -60, -15, 94, -13, -11, 53, +4, 51, -21, 64, 9, 9, -4, 0, 9, 1, 7, -62, 11, -33, -3, 27, -6, -21, -14, -9, 15, -25, 18, -36, -13, -30, -1, 0, 45, -49, 24, -20, 14, 18, -14, -41, 0, -1, -4, 18, -9, 48, 30, 58, -45, -32, -7, -16, -12, -20, -42, 9, -27, -12, -9, 6, 37, 43, 2, 53, -26, 7, -9, -15, -13, -27, 13, 58, 1, -6, -29, 78, -6, 35, -23, 3, 0, 49, -29, -32, 11, +-2, 26, -47, -11, 31, 42, 2, -21, 26, -20, -65, -20, -31, -23, 21, -43, -22, -20, 50, 41, -54, -26, -45, -9, 0, -54, -23, -57, 7, -8, -9, -6, 5, 22, -15, 19, -29, 9, -17, -13, 68, -21, -5, -9, -5, 12, 39, -24, -22, -43, -10, 19, -15, 35, 3, 4, 31, 26, 17, -22, 25, -74, -50, 4, 48, 15, 39, 73, 32, -4, -33, 18, 48, 21, 54, -28, 21, 20, 17, 42, -2, +58, 19, 127, -42, 76, -59, -7, -17, 20, 0, -17, -23, -20, -21, -41, 1, -38, -13, 33, 7, -27, 6, -17, 23, 2, -18, 2, -32, -20, 37, 16, -28, 31, -72, 43, 55, 4, -10, -32, -62, -21, -23, -60, -1, -9, -1, -17, -20, 45, -20, 23, -17, -28, -34, -41, 91, 1, 63, -47, 86, -17, -36, 2, -63, 17, -18, 12, -72, -16, 13, 30, 19, 42, -44, -11, -8, -10, -34, -35, 41, 32, +-38, -17, 23, 21, -1, 6, 2, -10, 18, -2, -47, -28, -19, -25, -38, -53, 8, -6, -9, 26, -43, 7, -9, 26, 19, -17, -18, 40, -22, 87, -21, -8, -25, -19, -16, 19, 16, 127, -15, 23, -20, -20, -2, -27, 7, 3, -39, 19, 17, -22, -31, 16, -41, -35, -59, -17, -36, -37, -10, -27, -83, 121, 1, 18, 54, 17, -25, 24, 34, 30, 116, 40, -14, 27, 48, -4, 13, 18, -27, -34, 19, +59, 24, -47, -19, 7, -3, -41, -10, -29, -22, 38, 5, -9, 33, -61, 35, 3, -50, -50, -11, -11, 46, 10, 64, -17, -44, -39, 17, 18, -24, -32, 30, -40, 30, -26, 19, -14, -19, -1, -13, 29, -56, 6, 1, 3, 38, -13, -15, -7, -42, -4, -36, -28, 60, -7, -16, -22, -21, 18, 34, 95, 31, 0, 10, -29, -17, -40, 5, -38, 35, -27, -36, 31, -17, 24, -26, -26, -7, 27, 5, -13, +-3, -11, 7, -26, 6, 7, -21, -11, -63, -34, -5, -24, -7, 2, 6, -16, 10, -19, 12, 5, -12, 8, -14, 32, 3, 28, -44, 23, 32, -13, -37, -47, -55, -15, -4, 6, -41, -9, -59, 84, 37, 19, -13, -4, -4, 15, 5, 9, -46, 15, -36, -11, 6, -10, -16, 8, -34, 4, 35, 12, -14, -25, 55, -39, 54, 38, -46, 31, -30, -54, -34, 41, -23, 0, 45, 18, -22, -34, -7, -2, -21, +-42, -35, -36, -4, -59, 30, -6, 121, -16, -9, 34, 5, -61, 35, -37, 23, 27, 19, -18, -23, 69, 15, -5, -58, -14, -27, -32, -15, -8, -29, -14, -45, 7, -5, -20, -39, -16, 12, 43, -28, 68, -15, -5, 25, -19, -47, -29, -11, 36, 22, 17, 7, -21, -21, -8, -22, -1, -45, -12, -18, 86, -12, 29, 68, -6, 16, -12, -28, -10, -2, 29, -20, -25, -9, 12, -52, 31, 93, -25, 58, -28, +-23, -27, -15, -6, 38, 23, 8, -20, -11, 54, 27, 59, 0, 8, 18, 10, 13, -14, -50, 38, -41, 77, 1, 6, 5, 1, -37, 7, 27, -23, 42, 8, 52, -24, 16, 47, 61, 17, 50, 6, 35, 23, -17, 43, -69, 37, -5, -8, 45, -42, 8, -17, 24, -10, -14, -27, 13, -29, -37, -16, 12, -30, -37, 117, -31, -14, -56, 67, -32, -11, 15, 16, -31, -13, 15, 75, -15, -4, 9, -29, 33, +16, -39, -10, 49, -23, 17, 2, 45, -24, 33, -10, 11, 21, -11, 13, 23, -4, -10, -32, -29, -20, -1, -5, -15, -23, 7, -51, 5, 13, -4, 59, 42, 12, 17, 16, -31, 48, 15, -7, -41, -35, 38, 8, 62, -2, -12, 25, 41, 11, -52, 25, 28, -2, 12, 10, 5, -14, -8, -20, -54, 13, 16, -34, 89, 29, -7, 16, 24, 8, -11, 57, -68, 56, 16, 29, -25, 37, 22, -16, 25, 39, +19, -6, -13, -21, -5, 26, -41, 17, 2, -13, -45, -39, 30, 27, -2, -12, 16, -12, 46, -12, -31, -41, -40, 1, -10, -9, 1, -38, -13, -11, -25, -5, 17, 7, -5, 13, 44, 15, -16, -17, -7, -10, 23, 9, -9, 13, 17, -14, 15, 12, 34, -39, -7, -7, 31, -7, -16, 2, 58, 4, 39, 68, -13, -15, 3, -6, -17, 114, -16, 8, -14, -15, -29, 1, 8, 0, 15, -14, 42, 7, 35, +-2, 22, 14, -56, 9, 103, 19, 102, 36, -22, 8, 12, -39, -38, -12, -33, -2, 48, 61, -3, 50, -10, 5, -21, -28, -46, 15, 47, 14, -23, 24, -28, 31, -2, -9, 95, -13, 9, -18, -9, -36, -11, 14, 30, 49, 4, 37, -51, -38, -23, -17, -35, 40, 25, 16, -26, 33, -15, -20, 9, -24, -5, -9, -2, 5, 7, 14, -32, 71, -29, -37, -15, 70, 21, -5, 0, -11, 1, -6, -11, 24, +6, 36, -13, 30, -15, -47, 10, 55, 12, -24, -38, -9, 65, -24, -31, -32, -22, -8, 75, -1, -12, 36, -17, -8, -11, 19, 52, 85, 18, -5, -27, 69, 0, 0, -21, -27, 27, -2, -27, 43, 11, 34, -6, -8, 24, 3, -3, 9, 19, 64, -13, -7, 14, -3, 34, -52, 124, -16, -26, 34, -7, -28, 15, 43, -33, -20, -14, 21, -3, 6, -39, -8, -27, 83, 67, 15, 14, -37, 92, -10, 3, +56, -23, -27, 30, 8, 47, -4, -32, -19, -19, -23, -44, -14, -6, -13, -33, 0, -14, -19, 41, -17, -37, -25, 64, -34, -7, 29, 62, -26, -13, 43, -7, 64, -68, 7, -27, 53, -38, -15, -29, 113, -10, 34, -57, 63, -4, 72, -20, 5, 56, 17, 59, 3, 18, 76, -49, 21, -7, -3, -9, -18, -15, 4, -34, -4, -28, -14, -44, 2, -9, 17, -44, -60, -9, 18, 13, 41, -9, -30, -50, -26, +-4, 12, -30, -13, 23, 8, -8, 94, 6, -12, 31, -17, -2, 127, 4, 46, -24, 46, -31, -5, -10, 6, 21, -14, -40, 1, -23, 29, -5, -45, -13, 5, -11, -2, -25, 2, -1, -33, -39, -4, -29, -57, -16, -21, 10, -10, -41, 60, 7, -21, -50, -8, 17, 40, -20, -60, -43, -8, 26, 9, -5, 2, 21, -50, -57, 82, -18, 2, -54, 5, 27, -15, -45, -22, -17, 43, 21, 58, -46, -26, -4, +25, 1, -27, -29, 43, -45, -70, 24, 46, 18, 22, 24, 14, 6, 41, 4, 19, 18, -3, -34, 42, -17, 86, 2, 58, 21, -17, -20, -48, -1, 13, 5, 3, -6, 56, -4, -14, 21, 7, 79, -19, 3, -5, -17, 45, 4, 36, 57, -25, -11, -61, 8, -9, -57, -40, 17, -3, 0, -7, 2, 38, 4, -20, -35, -24, 13, -48, -34, 25, 29, -26, 50, 74, -25, 37, -50, -4, 47, -26, 50, -44, +-3, -8, 4, 14, -6, -8, -19, 3, 3, 7, 38, -62, -57, -65, 26, 0, -10, 24, -17, -24, 3, -49, 17, -3, -45, 60, -7, -15, -36, 14, 16, 21, -47, -24, -17, 30, -6, 0, 77, 13, -25, -25, -24, -6, -49, 37, -27, -51, -16, 14, -3, 3, 9, -4, -25, 20, -2, -9, -24, -55, 22, 14, -39, 2, -9, 39, 6, 76, -1, -3, -35, -8, 52, -29, -5, -24, 7, 64, 12, -5, 5, +-35, 51, 9, 32, 30, 5, 4, 23, -13, -28, -8, -33, -16, 15, -23, -42, -2, -4, -6, -8, -15, 12, 63, 8, -9, -5, 9, -23, -56, 57, -35, -29, -25, 7, -18, -47, -52, 86, -2, 30, -46, -90, 27, 53, 15, 16, 1, 28, -8, 37, -36, 14, -16, 16, 41, 8, -16, 32, -33, 20, -13, 57, 8, -43, -10, -25, 28, 18, -4, 75, -7, -18, 17, 24, -1, -16, -4, 24, 32, 19, -8, +3, -20, 7, 48, -32, 13, -14, -24, 15, 33, -14, -37, 61, 8, -9, 2, -24, 44, -22, 28, -9, -47, -42, -36, -25, 65, 24, -15, -20, 13, 20, 24, 17, 26, 10, 65, 39, 23, -45, 17, 100, -7, -28, 6, -53, -32, -24, -2, -42, -11, -51, -37, 18, 127, -13, 24, -42, 21, 30, -13, 13, -5, -24, -6, -8, 31, -25, 9, -2, 45, -27, 3, 5, -20, -12, -26, -14, -35, -9, 20, 0, +15, -6, -43, 36, -16, 6, 21, -76, 50, 19, 62, -45, -6, 1, 18, -24, -11, -5, 23, -6, -43, -56, -43, -73, 49, -47, -15, -1, -46, 3, 19, -1, -68, 118, -27, 80, -2, 22, 96, 6, -5, -21, 41, -35, -6, -33, -33, -26, 16, -27, -42, 48, 18, -8, 83, -31, 0, 42, -37, 25, 51, -32, 127, -37, -3, -17, -35, 74, 3, 4, 51, -51, -25, -34, -36, -28, 1, 4, -20, -49, 49, +21, 16, 10, 18, 2, -15, 27, 33, -12, -23, 38, 127, -5, 35, -22, 5, -26, -8, 6, 10, 51, -16, -3, 32, 23, 10, -16, -25, 12, 11, -10, -7, 3, 34, 31, 32, 15, 55, -23, -29, -17, -26, 47, -17, 12, -27, -9, -7, -23, -5, 10, -14, 17, 17, 20, -11, 20, 7, -5, -18, -3, 1, 9, -34, -5, 75, 11, 69, 49, 25, 20, -33, -35, 71, -13, 83, 9, 60, 42, 6, 42, +-33, 29, -63, -70, 6, 30, -23, -54, -42, -1, 53, -22, -23, 28, 14, 21, -7, -26, 24, 40, -56, -51, 24, 13, -44, -4, -13, 25, 21, 22, -22, -64, -39, -18, -25, 1, -12, -24, -23, 21, 19, -21, 57, 7, -35, -55, -19, -36, 4, -25, 14, 17, -23, 55, 51, -30, 63, 12, -12, -6, -33, -3, 71, -16, -28, -30, -34, -38, -60, 27, -26, -25, -34, -24, -6, 19, 37, -13, -73, -37, -14, +29, 7, -13, 47, 47, 14, -7, 12, -31, 10, -21, -24, 5, 22, -11, -33, 79, -13, 40, -42, 26, -12, -61, 23, 1, -2, 45, 12, -16, -39, -25, 19, -31, -35, -9, -22, 84, -26, 33, -4, -30, 6, 77, 116, 50, -43, -50, -24, -11, 8, 54, 57, -12, 18, -10, 43, 15, -2, 29, 54, -28, 47, -5, -54, -38, -26, 12, -5, 11, -10, 5, -5, -31, 1, -23, -17, 58, -24, -5, 4, -5, +14, -16, -38, -60, -46, 5, 10, -28, 6, 41, 7, -3, 22, 20, -4, -12, 12, -5, -23, 15, -14, -34, -24, -6, -16, 2, -35, 4, 5, 23, 30, 20, 25, -8, -4, 1, -17, 17, 19, -12, -15, 32, -9, -19, -50, -27, -20, 6, -50, 28, -46, 47, 10, -23, 8, 8, -41, 50, -4, 86, 52, 41, -48, -29, 13, -7, 83, -21, 9, -37, 22, -18, -12, -51, -7, -15, 19, -13, 2, 19, -49, +22, -6, 25, -10, -16, 40, -14, -25, 0, -2, 47, 75, 3, -38, -21, -21, 19, -1, -8, 68, 4, -1, 3, -37, 38, -50, 7, -3, -5, -19, -6, 47, -13, -11, 29, -12, -18, -45, -21, 46, -13, 52, -17, 51, 72, 11, -9, -7, -19, -44, -43, -13, 9, 1, -15, -4, -10, -3, -25, -12, -14, 30, 31, -15, 3, 25, 5, -14, 13, 1, 0, 6, 0, 17, 10, -7, -24, -20, 29, 2, 8, +-7, -17, -12, -7, 46, -32, 41, -7, 50, 36, 18, 40, 42, -36, -7, 11, -22, -10, 5, -8, 7, 4, 12, 23, 29, -4, 20, 9, -13, -28, 19, -12, 3, -15, -22, -21, -5, 10, 12, 38, -9, -15, -40, 6, -4, -7, -21, 50, -7, 0, -12, 22, -1, -48, 14, -18, 24, 17, -36, 16, -24, 11, -25, 2, -7, 56, -3, -13, -7, 7, 16, 1, -34, -26, -13, 8, -62, -38, -19, -12, -34, +-5, -45, 16, -16, 22, 12, -19, -7, -11, -14, -55, 5, -33, -13, 23, -44, -52, 38, -25, 44, -8, 45, -24, -46, -49, -12, 55, -18, 19, -18, 25, 11, -5, 5, -31, 23, -50, -36, 46, -28, 37, 26, -24, -5, 17, -5, -13, -31, -37, 22, -70, 21, -16, 41, 3, -55, -18, 7, -21, -30, 48, -40, -24, -13, 37, 19, 2, -18, 9, -6, 1, -10, 28, -17, -12, -27, 21, -9, -42, -11, -26, +-11, 54, 49, 7, -15, -48, -7, -4, 19, -8, -11, 2, 77, -31, -46, 24, 60, 18, 34, -3, -7, 39, 17, 98, -6, 0, 1, -45, 19, -31, 36, -12, 18, -69, -3, -20, -9, 24, 8, -36, 23, 34, 12, 27, -24, 27, -13, -29, 26, -32, -28, -35, -23, 1, -43, -39, -29, -12, 34, 30, -16, 46, -15, -45, 30, -80, -15, -20, 74, -3, -36, -125, -45, 2, -21, -7, -7, 16, -44, -57, 25, +-39, -20, -44, -29, -36, 29, -51, 89, -19, 40, -7, -14, 13, 25, -16, -34, -21, -30, -36, 1, -40, 3, 11, -47, 24, -22, 16, 15, -13, -22, -65, 17, 54, 0, -69, -18, 35, 4, 59, 26, -23, 18, -35, 14, 4, -20, -44, 44, 68, -12, -4, 1, 51, -12, -15, 12, -2, -68, -32, 7, 12, 15, -7, 7, 7, 17, 32, -23, -24, 3, 15, -3, -4, -21, -6, 21, -25, -2, 7, 8, 38, +-24, 43, 4, 33, 13, -21, 23, 27, -7, 15, -19, -11, 5, -15, -5, 25, -45, -8, -17, 1, 11, 8, 17, -17, 6, 21, 12, -4, 9, 11, 31, 20, 2, -37, -17, 22, 46, 4, -12, 14, -6, -8, 1, 54, -32, -9, 18, 6, 12, -25, -7, 5, 26, 14, -24, -21, -12, 40, -19, 10, -6, -33, 25, -42, -37, -10, 7, 31, 29, -5, -57, -7, 3, -29, 29, -26, -39, -38, 13, 4, 2, +20, 1, -38, -11, 15, 2, 26, -25, -33, -13, 58, -26, 39, -5, 26, -7, -19, 14, 8, -12, 127, 59, -12, -26, -32, -23, -6, 25, 0, 23, 20, 5, 51, -19, 11, 25, -14, 22, -1, -6, -20, -30, -22, -3, -5, 37, 81, 0, -30, 5, 22, 18, -1, 42, -4, -2, -6, -19, -34, -22, 24, -9, 14, 24, -24, 6, -11, 36, 4, -43, -28, 21, -24, 4, -9, -7, -10, 20, 44, -28, 32, +30, 8, 19, -4, -10, 22, 1, 19, -7, -33, -8, 0, -7, 5, 10, -18, 1, -26, 17, 17, -42, -28, 43, -3, -9, -28, 3, -10, 10, 46, -23, 36, 17, 25, 28, -6, -11, 9, 3, 19, 26, -20, 7, 7, -23, 4, 6, 23, 3, -21, 6, 16, -25, 17, -25, 28, -21, 47, 16, -4, 127, 23, -21, 14, 4, 8, 16, -19, -9, 7, -6, 26, -14, 26, 0, -46, -27, 19, 5, 23, -7, +9, -17, -13, 53, -4, 39, -35, 2, 14, -16, 26, 10, -13, 89, 26, -18, 14, -4, -2, -21, 13, 13, -17, -29, 18, 7, -53, -28, -9, -37, -24, -32, 21, -22, -36, -49, -59, -14, 43, 17, -8, 5, -5, -7, 36, -16, -22, 57, -23, 5, 17, -41, 41, 19, 3, -6, -29, -15, -12, -25, -24, 23, 47, -6, -50, 15, -10, -61, 13, 0, -10, 12, 100, 7, 5, -26, 78, -14, 51, 50, 13, +-16, -48, 8, -16, 2, -12, -34, 3, -8, -32, -3, 19, -30, -8, 0, -38, 29, -44, -31, -7, 127, 42, -18, 3, -27, 35, 30, 5, -14, 13, 37, -38, -11, -10, -25, -15, 40, -7, -46, 5, -26, -59, 103, 127, 16, -33, 9, 26, 123, -23, -51, 16, -14, 96, 14, -49, 20, -39, 5, 28, 19, 44, 29, -50, 16, 12, -62, 11, 38, 40, -12, 14, -51, 13, -40, 4, 35, 23, -9, -27, -27, +-14, -50, -4, -13, 1, -22, -11, 20, 2, -57, -8, 0, 43, -15, -35, -35, -33, -1, -2, -14, -6, -67, -11, -3, -24, 12, -49, 20, -10, -54, 2, -41, 14, -77, -28, 12, 23, 75, -53, -19, 60, -18, -18, 46, -23, 36, -7, 13, 5, -23, 23, -24, -17, 34, 20, -7, 10, -56, 73, 20, -55, 2, -11, 13, 4, 11, 6, -13, -13, -25, 3, 5, -9, -3, 5, 8, 32, 42, 35, 22, -4, +-20, -35, 30, 42, -24, -6, 34, -45, -13, 15, 38, 4, -12, -17, 7, 7, -17, 4, -9, 32, -35, -42, 21, -18, 19, 6, -8, -23, -24, -1, 23, -11, 1, 12, 13, -12, 5, -7, -5, 9, -16, -4, 17, 20, -18, 29, -8, 3, -4, -10, -1, 14, -12, -14, -17, -6, 8, 4, -14, 14, 8, 12, -34, 9, -13, -8, -45, -18, 2, 12, 6, 6, -14, -13, 38, -10, -30, 6, 51, -13, -56, +-23, 3, -5, 6, -14, 40, -20, -12, -7, 0, 12, -22, 7, -11, -31, -4, 29, -8, -34, 16, 13, 3, -9, -25, -27, -32, -8, 26, -7, 18, 5, -14, 34, -29, 10, 25, -18, -5, 10, 59, -46, 26, 4, -17, 12, 58, 17, 39, -22, -30, 81, -1, -17, -14, 2, 10, -2, 51, 3, -10, -2, -21, 3, -39, -25, -31, -1, 29, -31, -10, -15, -15, -9, -25, 14, 14, -8, 8, -37, -22, 8, +0, -13, 13, -15, -12, 5, 39, 18, 5, 14, -63, -24, 8, -17, -15, 38, -1, 1, -30, -11, -5, 40, 30, 48, 1, -16, -4, -12, 19, -5, -4, -2, -16, 24, 7, -22, -15, 8, 12, 15, 18, 10, -57, -31, 1, -15, -16, 26, 5, -15, -37, 0, 15, 45, 19, 39, 2, 7, -16, -1, 34, -7, -14, -3, -11, 20, -27, 11, 27, -20, 10, 17, 10, -8, -8, -6, 46, 41, -26, -8, -7, +-24, -28, 49, -4, -23, 5, -9, -33, -10, 0, 3, -2, -37, 6, -14, -6, 0, 0, -21, 30, 5, 27, -1, -6, -24, 20, 78, -48, 11, -14, -21, -9, 13, -2, 37, 7, -24, 24, 49, -8, 49, 20, -58, -27, 27, 3, -24, -6, -9, 90, 71, 4, -33, 30, 21, 45, 3, 17, 13, -24, 38, 57, 34, 60, 12, 6, -2, 31, -3, 21, 49, -43, -29, -1, 48, 14, -23, 44, -35, -39, 18, +14, 23, -13, -43, 22, -1, 4, -17, -25, -34, 66, 123, -13, 14, 34, -10, -23, -21, 65, -8, -8, -22, -14, -17, -34, -1, 4, -5, -22, 13, -64, 18, -9, 24, -13, -3, 18, -12, -10, -4, -4, -16, -32, 2, 2, 62, 73, -23, 17, 9, -17, 31, -33, 4, -22, -5, 26, 15, -25, 30, -11, -18, -25, -20, 53, 8, -35, 84, -45, 5, -38, 4, 1, -27, 46, 76, -29, 43, 50, 45, -20, +2, -9, -23, -12, 91, 61, -27, 49, -25, -6, -3, 101, -16, -40, 24, -12, -24, -10, 117, 38, -1, 91, 74, -33, 31, -20, 20, 9, 27, -48, -7, -33, 37, -4, -13, -19, -24, 8, 26, -25, -21, 4, -22, 1, 30, 79, 22, 52, 25, -35, 39, 2, -77, 71, -17, -25, 48, 32, 83, -23, 67, 25, -11, -28, 10, -12, -39, -37, -55, 17, -3, -20, -30, 127, -5, 55, -39, -17, -58, -25, 10, +1, -3, 13, -14, 44, 22, -19, 5, -55, -18, 39, -22, -4, -8, 6, 72, 55, -2, 1, -10, 27, -45, 4, 42, 26, 19, 7, 40, 6, -35, -55, -13, 0, -17, -9, 30, 2, -7, -17, 3, 19, -27, 2, -25, -17, 40, 0, 11, -1, 25, -19, 39, -2, 46, 17, -37, -2, 22, -21, -17, 12, -13, 53, 90, -39, -11, -17, -1, -37, -6, 66, 33, -3, -27, -33, -36, 20, 1, -6, 16, -17, +20, 6, -23, 13, -22, 18, -12, 3, -15, -23, 16, -10, -5, -3, -28, 81, -22, -32, -4, -1, -25, 6, 1, 2, -5, 71, 26, -7, 0, -16, 48, 7, 8, -23, 34, 85, -25, -22, -3, 64, 19, 1, 36, 50, 18, 1, 5, 43, -18, 10, -21, 91, 6, -30, 18, -17, -35, 28, -30, 24, 37, 17, 11, -29, -10, -32, -45, -13, -11, -14, -23, -16, -6, -10, 5, 23, -18, -35, -13, 0, -4, +13, -7, -28, -3, 20, -12, -1, 68, -37, 15, -3, -6, -11, -25, 55, -2, -24, -3, -9, -7, 14, -27, -24, -35, 34, 36, -4, 4, -11, 18, -22, -63, 33, -7, -41, 10, -1, -19, 43, -31, -9, 1, 37, -27, 5, 29, -20, -9, -6, 5, 0, -30, 4, 22, 15, -9, -41, -1, -8, 7, -2, 19, -15, -24, 30, -24, -41, -20, 24, -25, 56, -35, -8, -23, 40, -20, -2, 21, -5, 17, -8, +-6, 3, -13, 14, 36, -8, -17, -25, -9, 19, -3, -9, -54, 19, 24, -13, -5, -34, 14, 8, 0, -12, 54, 36, -19, -20, 46, 4, -9, -22, -14, 8, 6, 4, -37, -4, -17, -11, -17, 5, -16, 15, 25, 9, -30, 1, -22, -19, -38, -44, -5, 24, -10, -10, -25, 37, 67, -23, -1, -21, -16, -5, -11, -41, -39, 30, -27, 127, -6, -12, -18, 11, -39, 9, 25, -23, -13, -7, 7, -4, -15, +24, -12, 59, 63, 35, -22, 32, -32, -41, 53, -1, 25, -2, -22, -71, -2, 3, -18, 62, -39, -12, -11, 29, -28, 27, -13, -23, 49, -24, -11, 8, -18, -33, -14, -54, 4, 27, 12, -14, -41, 17, 11, 27, 6, -11, 49, -23, 35, 43, 20, -16, -50, 8, -34, -25, -18, -7, 5, 2, -4, -18, -24, 23, -11, 3, 24, -46, -2, -18, 4, 17, 18, -5, 33, 41, -17, -24, 7, 5, 40, 12, +1, 5, -20, 10, 13, -42, -21, -7, 2, -60, 32, 57, -1, 73, -57, 7, -48, -19, -53, -43, -5, 32, 110, -1, -33, -58, -23, -3, -50, 108, 13, -15, -35, 102, -49, -41, 3, 61, -10, 70, 26, -21, 13, -30, 42, -33, 34, -2, -3, -3, -3, 33, -42, -12, -1, 31, 7, 7, 5, -14, 26, -78, -21, 29, 15, 53, -62, 29, -6, 22, -25, -14, -81, 1, 18, -16, 20, 10, 25, -25, -44, +-27, -2, -27, 19, 7, -7, 43, -7, 3, 14, 12, -16, 18, 29, -20, 48, -3, 10, 36, 47, 46, -34, -28, -22, 61, 7, -3, 1, 15, 32, -4, 10, 64, -14, 17, 13, -31, 3, -41, -21, 3, 25, -20, 8, -20, -3, 16, -30, 24, -57, 111, 27, -22, -27, 3, -16, 27, -10, 12, 34, -4, 3, -20, -9, 32, -13, -25, -27, -20, -3, -1, 20, 18, 6, 7, -16, 17, -23, 14, -6, 42, +-16, 13, -3, 7, 7, -31, 12, 42, -29, -17, -3, -40, 27, -17, 8, -26, -34, 20, -13, 5, -18, 8, -16, -13, -23, 10, 7, 50, -13, 19, -13, 61, 19, 27, 5, -6, -1, -22, 8, 17, 13, -13, 22, 77, -38, -12, -46, 42, 29, -13, -3, -11, -9, -21, -29, 46, -10, -12, 8, -16, 5, 36, -2, -27, -46, 11, 25, 31, 48, -94, 17, 8, -31, -9, 9, -6, -11, 16, 28, -24, 6, +-36, -14, 27, -17, 5, -23, -13, 21, -5, -23, -34, -14, 25, -6, 6, -45, 12, -4, -8, -27, -20, -25, 13, -32, -31, 48, -4, -3, 15, 24, 55, -16, -17, -35, 43, -7, -10, -3, 7, -28, -21, 29, 43, -3, -8, 11, 0, -2, -9, -22, -34, -2, -35, -27, -6, -33, 42, 49, -32, 0, -13, -20, 56, -19, 33, 62, 0, 8, -21, -17, 1, -6, -18, 18, -61, 14, 8, -23, -23, 9, 15, +-12, -9, -12, -16, 59, -14, -43, 21, 45, -16, -20, -25, -16, 46, -17, 23, 73, -4, 15, -35, -5, 6, -9, -8, 31, -12, 15, -1, -17, -33, 21, 15, -8, -12, -2, -17, 64, -5, 40, -2, 1, 3, -8, -12, -40, 2, -19, -18, 42, -4, 2, -4, 10, 3, -9, 32, 40, -48, 39, 18, -8, 4, -4, -16, -19, -2, -12, -40, -23, 42, -3, -47, -2, 25, 12, -16, 35, 8, -1, 4, -26, +15, 11, -40, 31, -32, -3, 9, 14, 18, 0, -21, 32, 45, 3, -20, 32, 48, -42, -18, -18, 0, 25, -18, -1, 8, 17, -8, 46, -43, -32, -23, -37, 10, 62, 98, 17, 2, -81, 13, -22, 102, 63, 93, 42, -6, 15, 5, 24, 0, 0, -42, -18, 18, -20, -13, 73, -17, 2, -33, 7, 7, -32, 4, 50, 3, 27, 44, -42, -29, 9, -25, 76, 21, -53, 50, 22, -4, -3, -22, -18, 44, +-27, -34, 54, -9, -12, -6, -23, -15, -27, 27, 32, 29, 26, -5, -22, -13, -24, -28, -9, -38, -15, -8, -12, -14, 15, 53, 15, -21, -34, 5, 21, 20, -13, -24, 17, -28, -20, 5, -23, -15, -43, -36, -56, -55, -12, -49, -5, -63, 18, -9, -15, 39, 69, -26, 26, -59, -22, 16, 10, 19, 14, 11, -61, -15, 14, -20, -11, -26, -17, -2, 127, 11, 10, -81, 56, -31, 6, -39, -11, 15, -10, +24, -31, -22, -33, -28, -41, -29, -23, 12, 55, 21, 76, -64, 39, -23, -2, -2, 1, 14, -56, 7, -13, -16, 31, -60, 28, -8, 4, -60, 35, -5, 33, 86, -33, 19, 2, -17, 25, -16, -66, 11, 58, 53, 18, -60, 2, -15, -11, 17, 83, 2, -24, -18, -4, -24, 36, 43, 30, -27, -29, -9, -31, 49, 5, 27, -48, -5, -48, -24, 4, -23, -2, 127, -34, 71, -30, -2, -34, -23, 15, 9, +-11, -10, -19, -21, -18, -9, -26, 11, -3, -14, -3, 19, -8, 2, 30, 10, -5, -19, -20, -14, -8, -11, -11, 7, 3, 18, -19, -18, -5, 8, 5, -3, 3, -12, -29, -30, 20, -21, -16, 0, -4, 3, -23, 127, -80, 6, 24, -25, -16, 1, -15, 20, -3, 55, 17, -21, -18, -24, -10, -18, -37, -8, -9, -8, 14, 1, 13, 72, 52, -45, -36, -5, 99, -5, -9, 9, -3, -52, -19, -22, -39, +-25, 20, 77, -25, -21, 5, 42, 0, -17, 19, -32, -36, -17, 61, -14, -4, 15, -1, 2, -10, -27, -41, 4, 17, -28, -34, -8, 6, -33, 22, 32, -2, -7, 16, -16, 21, -18, -12, 1, -20, 12, -5, -10, 13, 57, -15, -3, 8, 4, 4, -8, 11, 1, 40, -19, -11, -10, 32, 13, -4, 14, 23, 45, -7, 4, 2, 6, -25, 5, 2, -21, 28, 29, 87, -3, -40, -3, -6, -48, -16, 6, +-3, -3, 26, -3, -32, -3, 4, -22, -20, 11, -10, 15, 34, -5, -25, -3, 53, 17, 39, -12, 16, -10, 13, -7, -32, 28, 44, 1, 9, 19, -72, -3, -13, -22, 28, -8, -33, 1, 13, -8, -21, 19, -35, 9, 35, 19, -11, -11, 57, 9, 56, -10, 37, -12, 5, 15, -42, 18, 35, 1, -9, 9, -62, -8, 96, -7, 8, -19, -21, -4, -16, 9, 4, 36, -4, 2, 44, -18, -27, 3, 2, +-23, -22, -12, -14, -1, -23, 2, 17, -2, 5, 13, -6, -13, 1, 4, 5, 91, -43, 9, -26, -8, -33, -2, -8, -21, -16, 49, -36, 38, -19, 7, 20, -23, 46, -12, -29, 6, -15, 31, 29, -12, 26, -14, -32, 23, 18, -40, -38, 64, 0, 6, 37, 23, 31, -34, -22, 30, -20, 10, 5, -3, -29, -30, 63, -39, 1, -6, -91, -12, -16, -15, -7, -30, 66, -29, 34, 28, 4, -51, 90, 68, +6, 5, -30, -10, -8, 7, -18, 27, -6, 31, 9, -36, 0, -23, 21, 35, -28, -1, 39, -4, 7, 23, 9, 15, 8, -6, -25, 20, -4, -40, 12, 17, -38, -26, -2, 7, 81, 7, -6, 32, 35, 29, 12, -43, 31, 14, 2, 21, 2, -8, 36, -10, 7, -22, 10, 2, -17, 2, 4, -18, -22, -2, -19, -63, -7, -19, -13, 0, -7, -26, -65, -9, 57, 10, 15, 43, 1, -10, 47, 18, -7, +-9, -75, 5, 31, 40, 4, 8, 38, -12, 46, -35, -5, -9, -20, 8, -48, 4, 20, 92, 14, 102, 123, 22, 101, -5, -45, -20, -9, -58, -30, 28, -11, 58, 48, -19, -68, -15, 1, 12, -22, -23, 8, -34, 8, -24, 115, 14, -5, -39, 32, 8, -54, -39, -48, 71, 3, -25, 12, -4, 42, 9, 41, 52, -9, -48, -43, 6, 13, 32, -10, 45, 2, 18, -18, 6, 20, -5, -13, 4, -29, -15, +-18, 59, -55, 1, 75, -27, -62, 17, -25, 37, -6, -3, -25, -9, -18, -35, 13, -23, 6, -8, -20, 33, -22, 10, -32, -6, -6, -15, -5, 37, -17, -20, 7, 34, -3, -2, -8, -5, -19, 0, 11, 44, 107, -17, -3, -15, -13, 4, 1, 88, -22, -13, 7, -10, 4, -12, 28, -3, -12, 5, -11, 12, -12, 9, -13, -3, -25, -26, 44, 39, -13, 15, 31, -31, 69, 23, 9, 38, -39, 0, -22, +86, 3, -26, -6, 21, 14, -15, -4, -3, 15, -54, 25, -28, 2, -3, -20, 15, -22, 15, 25, 47, 44, -20, 36, -17, 14, 9, 53, 35, 53, -9, 33, -7, 73, 5, -27, -8, -42, 6, 127, -31, 2, -32, 57, -55, 13, -4, 10, -12, -10, 37, 3, -20, 9, 21, -5, -20, -3, -1, 14, -9, -26, 27, -12, 4, -12, 19, -45, -31, -34, 45, -34, -42, -9, -2, -7, -28, 9, -5, -40, -30, +33, 19, 94, 12, 5, 8, -2, 1, 12, 1, -17, 17, -36, 28, 17, 11, 19, -3, -12, 11, -28, -30, 3, -21, -21, -23, -13, 41, 51, -42, -2, 1, 4, 32, 126, -52, -2, 127, 19, -26, 31, 16, 1, -6, -24, 26, 60, -20, 33, 3, -21, 13, 13, -10, 40, 23, 5, -24, -16, 34, 55, -31, -18, 2, 6, 22, 127, -46, 7, 125, 1, -40, 32, 16, -2, 1, -17, 37, 60, -47, 37, +16, -20, 22, -1, -11, 21, 16, 2, 7, 23, 15, 23, -24, 30, 1, 20, 12, 68, 1, 16, 20, -22, -27, -7, 48, -19, -5, 5, -3, -20, -31, -31, 8, -9, 17, 0, 29, -39, -4, -12, 11, -25, -21, -4, 42, 43, 21, 10, -48, -52, 12, 19, 13, -17, 4, -20, -4, -29, -6, 8, -25, 11, 40, 21, 31, -26, -21, -24, -11, 7, -8, -33, 41, -12, -13, 1, 64, -5, 12, 25, -7, +2, -13, -13, -18, 5, -2, 42, -3, 66, 30, 6, 13, -7, -3, -28, 16, -61, -15, 9, -1, -42, -13, 25, -33, -29, 4, 63, -18, 16, 23, 16, 7, 6, -61, 30, -25, -31, -11, 5, 9, -10, -33, -50, 60, 23, -35, 127, 1, 17, -40, -10, -14, -4, -31, 2, 9, 0, 5, -4, 13, -13, 6, -22, 58, -19, 50, -65, 19, -22, -36, -5, 70, 22, 5, -5, 9, 15, -10, -20, 15, 52, +-16, 16, 42, -13, -13, 2, -18, -23, -31, -4, 21, 31, 33, 20, -10, -27, 17, 33, 21, -70, -2, 65, 44, 40, -12, -36, -58, -26, -21, -22, -37, -19, 23, -15, 35, 21, -14, 12, 25, 16, 94, 16, -29, -32, 13, -20, -25, -23, 88, 6, 18, -26, -13, 81, 19, 60, 9, -7, 113, -47, 5, 11, -1, 24, -39, 17, 0, 44, -26, -14, -24, -16, -23, 7, -32, 49, 86, 2, 12, -3, -89, +43, -2, -72, 20, 18, -8, -30, 34, 4, 14, -14, -18, 55, 43, 54, -73, 22, 45, -54, -63, 4, -23, 25, 32, -15, 64, -13, 19, 31, 35, -23, -41, -21, 32, 27, 14, -41, 12, -13, -23, 55, 9, 56, 20, -24, -9, -53, -8, -13, -19, -38, 31, 63, -7, -12, -37, 20, -6, -17, -8, -7, 22, -14, -7, -8, -4, 33, 32, -8, 18, 43, -1, -6, -12, -27, 9, -20, 34, 18, 4, -2, +-19, -5, 23, 14, -19, -13, -31, 16, 35, -16, 29, 8, -25, 53, 2, -8, 13, 2, 9, 10, -10, -35, 21, -10, -21, -12, -1, 12, -18, 30, -4, -14, -25, -10, 11, -8, -9, 10, -23, -17, -25, 23, -17, 1, -32, -16, 61, 4, 71, -18, -10, 26, 70, -8, -1, 7, 9, 45, -9, -54, -41, -12, -18, 3, 24, 17, 2, 31, 8, 25, -11, 23, 6, -17, -10, 40, 3, 5, 46, -47, 44, +-48, -9, -3, -41, 26, -8, -20, 31, 49, -3, -9, 15, 65, -4, 29, 31, -13, 40, 38, 32, 5, 14, -42, -33, 23, -21, 7, 34, 22, -39, -27, -9, 23, 20, 3, 1, 23, 2, -28, -12, -6, -17, -3, 44, -28, -16, 74, -38, 53, -30, 5, 74, 5, -18, 10, -8, -17, -9, -29, -36, -36, -4, 5, -13, -15, -1, 57, 17, -9, -18, -16, -1, -41, 12, -6, -22, -7, -4, -11, -35, 25, +-10, 9, 70, 19, -18, 15, 2, -13, -3, -32, -34, -26, 3, 0, -14, -26, -11, 32, -3, -7, -18, -19, 4, -33, -21, -11, -7, 0, -4, 12, -29, 30, 19, -4, -4, -4, -24, -6, -22, -7, -8, 4, -10, 12, -6, -4, 23, -19, -7, -1, 44, 8, -3, 39, -10, 17, 6, 23, -9, 22, -9, 17, 7, -7, -8, -6, 29, 14, -9, 41, 8, -32, -27, 7, -55, 10, 0, 15, -12, -38, -13, +-33, -42, -28, 44, 24, -12, -4, -11, -3, 60, -28, 23, 24, -20, 14, -4, 23, -12, 24, -8, 127, -3, -23, -5, -7, -8, -7, -2, 29, 4, -9, -2, 14, 40, -7, -32, 54, -20, 29, 29, -8, -31, -29, 16, -21, -16, 12, -10, -34, 22, 3, -14, -20, 8, 77, -29, -66, -28, -1, -20, 33, -42, 28, -23, 44, -29, 5, -8, 51, 30, -21, -34, -3, 34, 7, -16, 34, 19, -37, -4, 27, +-28, -22, -36, -14, 15, 4, -54, -21, -2, -4, 63, -22, 15, -2, 9, -3, -25, 0, 4, -5, 13, 15, 18, 10, 3, 8, 45, -9, 3, 40, 17, -43, -44, -5, 88, -19, -52, -45, -6, -4, -61, -1, 36, -23, -13, -8, -12, -3, 24, 5, -66, 58, -6, 53, 34, 19, -13, -44, 28, -18, -35, 12, -36, 0, 35, 17, -16, -17, 46, 109, 17, 105, 31, -41, 29, -3, -65, 39, -25, -24, 42, +30, -6, 45, 76, -74, 24, -39, -34, 67, 64, -43, 15, 4, -62, 42, -22, 1, -14, 35, -26, 46, 37, 5, -56, 72, 10, -29, -44, -23, -14, 51, 17, -16, 86, -32, 39, -25, -35, -32, -44, 36, 15, 42, 0, -24, 27, -13, -35, 25, 9, -59, 15, -27, 52, 14, 33, 36, -39, -28, -1, -55, -14, 27, -10, 21, -38, -57, 32, 31, -1, 14, -24, -52, 28, -10, -52, 14, 32, -39, -2, 4, +-1, -3, -1, 16, -27, -2, -11, 25, -3, -20, 15, 3, -25, -34, -25, 28, 49, 4, -11, -12, -24, 127, -31, -4, -15, -7, -16, 18, -5, 2, -2, 59, -4, 8, -3, -8, 28, 44, 9, 3, -2, -22, 10, -13, -13, 28, 72, -10, 74, 40, -16, -30, -2, -21, -12, -11, -11, -11, 4, -27, -10, -13, 30, 36, -4, 11, -48, 58, 26, 7, -21, 29, 7, -11, 6, -6, -46, -16, 15, -19, -9, +19, -30, -39, 8, 9, -1, 2, 19, 19, 7, -46, 6, 7, 32, -27, 36, -32, 3, -13, -26, 4, 75, -7, 32, -7, 29, -13, 22, -11, -15, 50, -17, -13, -40, -14, 8, -28, 3, 7, -6, -10, 10, -27, 44, -17, -35, 9, 14, 15, -17, 127, -8, 49, 19, 17, -2, 12, 8, 34, -20, -12, 14, 2, 25, -11, 28, -3, 34, 74, -8, 32, 23, -21, -1, -50, -46, 41, -18, 0, -26, -21, +14, -13, 11, -9, 21, -5, -13, -13, 0, 51, -32, 24, 82, 117, -58, -10, -25, 21, -14, 37, -1, 15, 8, -6, -41, -33, -5, -27, 2, -3, -17, -8, -1, -29, 17, -12, 21, -12, 4, -14, 11, 52, -47, 28, 84, 111, -58, -29, -16, 1, -24, 53, -11, 16, 3, -2, -27, -23, -8, -28, -3, 17, -26, 35, 11, 28, 15, 30, -29, -1, -11, -16, -23, -2, -23, 21, -39, -39, 86, 13, -1, +55, 58, 21, -17, -39, -23, 25, 30, 17, -14, -16, 9, 33, -34, -12, -23, 29, -1, -2, -20, 57, -23, -1, -38, -31, -30, -11, 53, 5, -49, 13, -16, 51, 82, 11, -45, -38, -6, 11, 11, 3, -13, -55, 23, 37, -23, -17, -1, 11, -17, -48, -14, -22, -34, 127, 8, 23, -20, -5, -6, 121, -5, 3, 8, -71, 6, -6, 39, -20, 0, 21, -1, 6, 9, 4, -5, 51, 25, 26, 47, 40, +-29, -7, -42, 6, -11, 31, 14, -16, -26, 23, -69, -27, 54, -25, -63, 70, 83, 10, 43, -32, -54, 44, 34, 29, -36, -31, 20, -25, -17, 58, -11, 33, 75, -35, 10, 8, -66, 15, 20, 12, -73, 24, -55, 94, -77, -46, -14, 48, -26, 22, 17, -31, -52, 46, 26, 42, -49, -3, 18, 33, -26, -6, 119, 26, -15, -16, -9, -20, 13, -28, 3, -51, -2, 7, -46, 15, 23, 12, -6, 37, -28, +-40, 30, -11, -7, -11, 24, 77, -27, -24, -39, 23, -23, -33, -55, 20, -23, -32, 47, -28, 18, -17, 32, -44, -21, -73, 3, 40, -6, 37, 75, -46, 25, -7, -26, -31, 85, -63, 5, 27, -16, 8, -5, -18, -19, 8, -3, 8, -13, -30, 24, -3, -25, 127, 16, -16, -46, -21, -37, 95, -2, 21, 66, -68, 9, 9, 19, -20, 16, -1, -9, 2, -10, 3, 2, -3, 15, 6, 30, 1, 19, -52, +3, 28, -29, 31, -5, -4, 25, 2, -41, -22, 57, -45, -4, -47, -22, 58, -38, -10, -19, -27, 4, 39, -35, 90, 68, -29, 1, -12, 18, -23, -27, 26, 3, -48, -19, 47, -13, 18, -19, 19, -43, -20, -6, -48, 3, 48, -40, -68, 12, 35, 7, -33, 39, -21, -16, -4, -1, -62, 11, 72, 27, -15, -20, -64, -5, -4, 23, 59, 42, -3, -52, -45, 1, -5, 5, -36, 51, -51, 27, -53, -28, +62, 34, -3, -9, 62, -17, -41, -26, -15, -22, -23, -4, -27, -24, -21, -35, 94, -19, 23, -19, -29, -37, -30, -9, -39, 5, -32, -21, 18, 78, 37, -52, -52, -43, 22, 59, 7, -17, -12, 5, 6, -14, 7, -4, 44, 5, -14, -28, 10, 33, 28, -17, 3, 32, 6, 32, -44, -24, -20, 5, -35, -57, -13, -11, -19, 19, -1, -13, -18, -4, 11, 91, -19, 25, 78, -26, -37, 39, -33, -20, -21, +0, -13, 8, 6, -53, 18, -3, -50, 20, -31, -6, -57, 12, 31, -20, 31, -11, 11, -73, 4, -11, -11, 53, -26, -42, -51, -32, 21, 55, 45, -11, -9, -27, 60, 1, 22, -36, 46, -16, -24, -26, -69, 40, 71, -15, -7, -25, -5, 8, 17, 68, -48, -10, 1, -30, -43, 27, -1, -23, 14, -39, -12, 26, 7, -13, -39, -24, 6, -5, -33, -2, -23, -3, 32, 7, 2, -21, 47, 26, -4, -13, +-16, -23, -15, 127, 56, -44, -8, -8, 19, 67, 1, -36, 47, -2, -48, -19, 30, -7, -41, 98, 0, -20, 4, -5, 20, -5, 24, 47, -34, -33, -14, -24, -34, -45, -21, 38, 60, -5, -18, -25, 33, 54, 15, 7, -15, 30, -32, -31, 30, -4, -48, 121, 45, 2, -4, 27, -5, -18, -1, -19, -53, -22, -49, -30, -57, 6, -37, 33, 29, 6, -7, -22, 15, 13, -8, 3, 57, -14, -14, -29, 4, +-24, 48, 16, -5, -16, -16, 9, -13, 5, -35, 19, 13, -11, 19, 0, 8, 34, -11, -38, -21, -65, -40, 11, 45, -43, 14, -46, 53, -4, -25, 67, -35, 5, -52, 127, -16, 16, -10, -20, -1, -5, 42, -34, -39, -17, -23, 35, -13, -25, -70, 73, 15, -74, 92, -2, -13, -66, -60, -9, -26, -31, 75, -16, 10, 10, 64, -7, 17, -9, -26, -16, 17, 48, 35, -30, -53, 15, -89, 7, -20, -26, +-4, -10, 4, 55, 54, -4, 18, 111, -15, 22, -29, -47, -20, -51, -46, 23, 50, -9, -9, -19, 45, 16, -51, 4, 19, -12, -22, -2, 47, 18, 15, -31, -16, -29, 127, 8, 16, 26, -32, 4, -22, 98, 11, 81, -7, -31, -11, -17, 15, -36, -15, -25, -70, -22, 44, -48, -52, -28, 46, 29, -6, 8, -40, -28, 92, -9, 24, 27, 2, 12, 12, 30, 10, 2, 74, 9, 21, 13, -15, -32, 40, +-8, 17, -19, 18, 21, 6, 26, -36, -31, 1, 24, 0, 12, -2, 85, 19, -29, -14, -8, -61, 9, -70, 48, 45, 23, -11, -6, -81, -36, 0, -27, -9, -45, 4, 38, 43, -48, 18, -16, 20, 58, -9, 67, 9, -24, 84, 31, 2, 11, 42, -50, 31, 19, -31, 0, -43, -46, -79, 15, -15, -21, 45, 17, -5, -9, 73, -33, -44, -48, 11, -8, 73, -48, -10, 88, -33, 75, 22, 58, 49, -5, +-47, 2, 79, 15, -45, 18, -41, 6, -64, -13, 56, -11, -14, 7, 64, 104, -16, -6, 92, 24, -10, 2, -36, 1, 74, -7, 17, 17, 2, -7, -17, 52, 41, -21, -7, -32, 41, 55, -5, 56, 2, -24, 31, -22, 3, -16, -42, 96, 12, -60, -43, 12, 15, 17, -2, 10, -50, -4, -54, 10, -5, 15, 21, -9, -41, -31, -11, 14, -12, 37, -20, -7, -7, -35, -51, 51, -14, -18, -30, 8, -25, +-26, -27, -20, 34, -7, 15, -8, 27, -20, -9, 11, 6, -18, -3, 41, -8, 33, 62, 13, -31, -7, 11, 47, -53, -16, -29, -17, 8, -23, 31, -16, 102, -9, 86, 29, -14, -8, 83, -30, 18, 46, 106, 70, 2, 17, -9, 38, 127, 0, -14, -11, 45, 68, -51, -13, -60, -61, 8, 6, -52, 90, -33, -10, 64, -29, -52, 23, 56, 18, 52, 45, -21, 6, 0, 38, 4, 5, 4, -12, 8, 16, +-22, -36, -53, 31, 29, 8, 27, -4, -58, -22, 21, -10, 61, -24, -10, -18, 4, 5, -17, 1, 3, -1, 5, 25, -3, 1, 21, -4, 53, -22, 27, -13, 1, 51, -28, 33, 46, 4, 50, -42, -52, -12, 18, -36, 12, -42, -41, -10, -11, 4, -9, -47, -10, -24, -19, 4, 9, -56, 57, 37, 12, 13, -12, -10, 33, 1, -21, -3, 26, 28, 6, -12, -7, -4, 46, 39, 11, 20, -16, 39, 53, +32, -3, -18, -56, -19, -36, 18, 36, -14, 127, 4, -15, 9, -32, -7, -11, 7, -23, 61, -24, 10, -15, -10, 68, -24, 64, 1, 25, -38, -17, 40, 64, 4, 28, 2, -14, -20, 24, 6, 56, 5, 4, 23, -39, -10, -3, -48, 20, -17, -41, 38, -2, 73, 71, -19, -60, -2, 2, 51, -3, 0, -35, 19, -21, -22, -32, -8, 18, -48, -29, -6, 10, -13, 86, 22, 15, 38, -7, -6, -31, -22, +-9, -11, -29, 1, -10, 80, -8, -34, -62, -32, -27, -11, 60, 67, -13, 11, -8, -22, 33, 75, 5, 34, -65, -40, 10, -85, -3, -2, -16, 43, 12, -13, 71, 0, 7, -6, -23, 78, -50, -16, -59, 44, 5, 40, 8, -42, -5, -81, -4, -18, -22, 71, -42, 17, 80, -69, -15, 10, -32, -36, 26, -6, -52, -27, -8, -15, -47, 5, -9, -14, 63, 62, -4, 55, 5, -12, 3, 0, 2, 41, -6, +19, 20, -3, -41, -9, -29, 41, -20, 86, -8, 38, 87, -12, -26, 4, 3, 9, 8, 2, -10, 17, 20, 18, 75, -23, 22, -38, -11, -8, 37, -23, 33, 27, -16, -14, -7, -29, 102, 21, 0, -16, -7, 1, -41, 37, 65, -10, 0, -10, 44, 92, -23, -43, -32, 10, 29, -54, 24, -67, -47, 7, 24, -34, -9, 17, -19, 0, -18, -7, -35, -24, 6, 30, -22, -9, 104, -24, 59, 9, -58, -21, +-15, -27, 45, -60, 29, 86, 36, -28, 22, -43, 4, 43, -15, 12, 4, -52, 0, -39, 16, 51, -22, -7, 105, -19, -18, -21, -63, 90, 35, 17, -47, 19, -57, -24, -38, 47, -21, 8, 33, -1, -14, -16, -3, -7, 23, -28, -35, -10, 52, -29, -32, -12, 39, 32, -13, -58, 2, 13, -9, 6, 24, 29, -33, 6, 8, 40, -1, -11, -15, -8, 14, 58, -13, 26, 8, 38, 43, 23, -16, 29, -45, +-29, -8, 17, 16, -64, 127, -24, 33, -37, 18, -33, 2, -17, 42, -28, -9, 46, -22, 32, 9, 1, -1, -32, 13, -26, -27, -6, 21, 11, 1, 16, 13, -30, -5, -22, -2, -17, -5, -15, 16, -14, -12, -7, 6, 3, -45, 6, 56, -10, 26, 2, 52, 28, -1, 1, 43, -44, 27, 0, -18, -15, -33, -28, 1, -19, -35, -26, -17, 110, -5, -11, -14, -14, -60, 55, -5, 54, 21, -36, 14, 13, +22, -4, 26, 83, 33, 49, -15, -32, -4, 18, 31, -14, 16, 13, -11, 20, 40, 9, 22, -28, 8, -44, -16, 17, -18, 15, 2, -28, -1, 16, -23, 3, -11, -5, 75, 68, -14, 46, -33, -12, -28, -22, -16, 17, 15, -18, -36, -23, -14, 29, -9, 15, 25, 17, 1, 37, -34, 44, 16, -61, -15, -40, -49, -37, 27, -12, 43, -40, -28, -17, -52, -8, 23, -42, 18, 8, -23, 27, 19, 15, 77, +-12, -28, -21, -8, -3, -25, 4, 7, 52, 47, -21, -42, 68, -20, -30, 31, -2, 72, -4, 52, -11, 14, -53, -22, 0, 4, -9, -9, -4, -9, 19, 40, 37, -73, -14, 33, 10, -42, -12, -6, -13, -22, 24, -21, 13, 24, -34, -25, 93, 5, -34, -18, -2, -9, -23, -9, -42, 8, -24, 48, 14, 15, -11, 18, 16, 3, -14, -43, -23, 11, -36, -12, 14, -8, 24, -16, 4, -42, -13, 28, -2, +46, -11, -63, 6, -40, -39, 85, 1, 20, 35, -7, -4, -29, 25, 15, -20, 10, -18, -20, -19, -15, -43, 38, -77, 9, -36, -29, 2, -33, 3, 58, 39, -40, -20, 9, -4, 62, -48, -10, -45, -6, -9, 44, -87, 41, -28, -25, 46, -5, 27, 32, -45, 13, 55, 43, 54, -5, -26, -58, -41, 38, -33, -68, 71, -3, -32, -50, -30, -29, 2, -21, -10, 15, 20, -28, 26, -24, -8, 2, -2, -1, +4, -32, 32, -5, 28, 6, 1, 127, -15, 38, 11, -17, -32, -40, 7, 35, 2, 57, 18, -5, -24, 24, -56, -1, -26, 2, -26, -21, 43, 3, 27, -28, 21, -9, 8, -53, -51, 25, 9, 9, -11, -5, -18, 2, -7, -56, 26, -22, 26, -27, -13, -9, 18, -11, -34, -38, -27, 26, 115, 19, -22, 29, -13, -30, -7, -25, -29, -21, -13, 8, 28, -43, 53, 0, -28, -77, -63, -15, 9, 78, -7, +67, 5, -25, -53, 21, 27, 24, 41, 61, -48, -4, -8, -36, 51, 14, 64, -26, 63, -3, -50, -20, -36, -74, -53, 24, -28, -32, 6, 28, -19, 29, 78, -48, -11, -26, -56, 57, -30, 19, -32, -27, -59, -7, -53, 27, 2, -12, 25, 39, -44, -37, -47, -11, 37, -11, 112, 63, -28, 6, -27, -65, -13, -33, -36, -13, 2, -12, -8, -12, -64, -19, -32, -8, 25, -32, -30, -37, 73, -27, 34, -11, +29, -14, -10, 7, -21, 86, 16, -15, 21, -11, -29, 54, 15, 38, -7, -10, -6, 9, -13, -12, 61, -22, -8, -18, 110, 50, 26, -24, -27, -15, -1, 6, 13, -38, -23, 11, 21, 0, -9, 33, -20, 34, -29, -25, 21, -2, -23, 20, 17, 41, 7, -11, -20, -38, -4, -18, 16, 16, -26, -15, 9, -19, 37, -9, -2, -10, 18, 95, -1, -33, -3, -14, -22, -6, -40, -53, -2, 70, -12, -31, -50, +-42, -11, -44, -50, 19, -52, 50, 78, 17, -15, -10, 5, -27, 2, -55, -32, -7, -26, 32, -29, -57, 15, -11, -10, 12, -41, 41, -25, -11, 12, -66, 1, -3, -1, 26, -28, 72, -15, -72, -9, -27, -27, 22, -3, 2, 24, -3, -29, -18, -18, -18, 11, -37, 2, -16, -24, -3, -20, -6, -5, -37, 4, -2, 30, 11, 35, 4, -23, 8, 26, -5, -9, -28, 23, -39, 8, -13, -9, -8, -38, 21, +-3, 6, -30, 76, -30, 36, 6, -28, 31, -52, 40, -10, -50, 8, -16, 16, 34, 2, 63, 24, 24, -21, -15, -27, 6, -8, -39, -15, -31, -5, 8, 4, 11, 2, 5, -7, -20, -18, -83, -19, 70, -41, 13, 19, -16, 2, 38, -56, 95, -11, 17, -8, 10, -41, -3, 20, 73, -27, -31, -20, -35, 18, 42, -5, 39, 6, -23, 36, -25, -21, 70, 16, -62, 38, -22, -34, 24, -13, -34, 56, 25, +11, 7, -15, -5, -4, -15, 19, -3, -15, -28, 18, -1, 3, -3, -24, -16, -1, 3, -9, -25, -40, -41, -10, -8, -42, 24, 15, 20, -4, -47, -29, 53, -34, -18, -7, -25, -35, -44, -46, 3, -19, -4, 4, -32, -12, 32, 46, 11, 7, -26, 53, -11, 35, -9, -34, 14, -24, -1, -30, -20, 0, -9, 50, 7, -57, 81, -34, -13, 27, -79, -11, 33, 2, -46, 19, 66, -2, -26, -9, -47, -5, +-13, -28, -11, -11, -40, -3, -4, 38, -47, -29, 59, 13, -5, 76, 39, 1, -22, -28, -35, 6, -41, -34, 89, 9, -66, 7, -7, -42, 5, -12, 12, 8, 67, -9, -70, -26, -25, 1, -8, -11, 44, -44, -23, 17, -1, -28, 91, -10, 9, -33, 27, 47, -3, 38, -10, -46, -2, 2, 34, 65, -20, 6, -69, -4, 21, -21, -28, 13, 94, 0, -33, 10, -10, -4, 19, -12, -37, 33, -10, 27, 9, +-36, -16, -3, 9, -15, 11, -25, -40, 5, -7, -31, 6, 6, -17, 3, 45, -52, 42, 78, 25, 0, -27, 24, -14, -23, -13, 5, 29, 31, 65, 25, -24, -8, -27, 55, 6, 11, -31, 1, 3, 16, -27, -11, -38, 44, -22, -28, -10, 30, 72, -2, 71, 25, 8, -6, -21, -5, 0, -26, 25, 1, 85, -55, -9, -53, 9, -38, -18, -35, 5, -14, -69, 25, -10, -56, 116, 2, 51, -6, 5, 43, +42, -19, -34, -14, -40, -16, -32, -3, -21, -34, -20, 8, -26, 41, 62, 2, -12, -13, 61, -19, 35, -11, 64, 54, -36, 17, -22, 4, -30, 13, 11, -21, -19, 32, -62, 4, 108, -28, 21, 17, -6, -47, 58, -5, -4, -2, -4, -19, 8, -20, -4, -15, -8, -57, -53, -18, -28, -1, -10, 5, 5, -1, -12, -54, -27, 0, 14, 6, 17, 28, 31, 19, -29, 40, -23, 12, 28, -8, -4, 1, -11, +8, -9, -27, -12, 43, -15, 127, -51, -19, 30, 56, 22, 14, 6, -16, -29, -23, 10, 8, -15, -16, 0, -18, 69, -38, -3, 53, -8, -15, 7, 29, -40, 36, -6, 45, -4, -25, 32, -50, 0, 0, -6, -27, -46, 6, 20, -15, -13, 4, 17, 34, -8, -42, -24, 41, -15, -38, 1, -17, -15, -31, -15, -12, 115, -19, -46, -21, 4, -57, -6, -7, 5, -41, -47, -40, -17, -24, 9, -9, -5, -1, +24, -30, 13, 45, -17, -14, 13, 1, 30, -30, -33, 87, 6, 20, -4, -15, 35, -13, -20, -5, 8, 7, -20, 5, -8, -12, 16, -17, 11, 127, -21, 67, -25, -14, 11, -2, 14, -12, -18, -5, -31, 30, -21, -16, 69, -40, 21, -34, -35, -46, -36, 2, -16, -35, -27, -53, 86, 14, 8, 35, 14, 113, 23, -24, -31, -29, -9, 71, -3, -13, 16, -2, 15, -6, 28, 16, 52, 10, 7, 3, 26, +-31, -32, -15, -3, -31, -22, -43, 30, 8, -39, 13, -47, 16, 51, 8, 20, 65, 16, -3, -41, 29, -23, 11, 42, -25, 79, 4, 15, 37, -17, 25, -29, -4, -49, 27, 15, -20, -13, 80, -26, 13, 13, -9, 30, 126, -21, 45, -73, -52, 68, 15, 6, -44, 40, 50, 32, 11, 4, -25, 66, -16, 30, -17, -9, 11, -22, -26, -18, -95, -19, -61, 48, -24, -19, 7, -28, 37, 28, 45, -52, -43, +-7, -49, 18, -13, 87, -17, 39, -12, -52, 40, 66, -7, 4, 7, -69, 9, -28, 28, 20, -53, 60, -19, 1, -43, -37, 26, 21, 36, -41, -42, 22, -10, 30, 30, 44, 51, 32, 73, 26, -51, -5, 14, 4, 38, 22, -43, -12, 17, -43, -7, -47, 77, -37, -16, 16, -26, 7, -28, 25, 26, -9, 5, -14, 5, 9, 3, -21, 0, -4, 28, 20, 104, -39, -60, -10, -67, 16, -14, -13, -24, 34, +26, -11, 5, 13, 81, 112, 47, 47, -29, -12, -3, 41, 31, -29, 20, 8, 17, -8, 45, 24, 5, -5, 5, -30, 21, 9, -5, -9, 10, 1, -3, -26, 24, -5, -25, 20, -1, 10, 19, -15, -31, 18, 52, 4, 15, -35, -26, -20, 27, -8, 13, 56, -37, -11, 77, -9, -26, 1, 16, 14, -16, -29, -72, 15, 1, -13, -8, -24, 95, 7, -42, 81, 20, 9, -43, -50, 17, -92, 48, -9, 40, +-45, -46, 30, -30, 17, -3, -31, -2, 12, -13, -59, -5, 26, 5, -14, 80, -15, -16, -18, -14, 102, -14, -15, -42, -14, 21, -42, -49, -7, 31, 20, -12, 0, -21, 28, -32, -48, -60, -19, -12, 80, -2, 9, 28, -44, -24, -22, 16, -21, -53, -2, -5, 82, -35, 11, -10, -15, 49, 28, -29, -32, -27, 49, 77, -19, -47, -23, 26, 20, -7, 19, 22, 108, 29, -16, 37, 37, 0, -29, -2, -15, +2, -3, -22, 25, 6, -35, -33, -31, -29, 23, -4, 5, 37, 16, -11, 23, -44, 32, 12, 19, -8, 12, -4, -2, 1, 3, -8, -11, -14, -25, -2, 8, -11, 5, 31, -55, 40, 7, 20, -15, -5, 5, -14, -9, 23, 4, -35, 24, -18, 80, -14, -42, -60, -18, 48, 7, -25, -32, -16, 14, -86, -15, 21, -11, 46, -9, 2, 83, 23, 56, -12, -33, -24, -49, 4, -4, 44, 14, -42, -30, 1, +28, -56, 37, -13, -24, 38, 50, -14, 21, 33, 1, -30, -26, 127, 1, -8, -38, 0, 49, 103, 12, -26, 15, 49, -3, 25, -21, -9, -19, -58, 17, 6, 2, -14, 24, -3, 9, 17, -25, -11, 47, -7, 12, -14, -26, -10, 6, 40, -23, -1, -13, -5, 2, -25, 45, -62, 5, 35, -30, -12, -10, 104, 69, -41, 83, -24, 14, -32, -74, 18, 27, 37, -62, -4, 58, 8, 5, 55, -10, 81, 13, +19, -16, 11, 25, -15, 5, -58, 15, 33, -35, -33, -25, 9, -5, -31, -32, -7, -4, -24, -51, -23, -12, -9, 34, -51, -3, 7, 2, -30, 32, 30, 32, 15, 20, -41, 13, -60, 3, -26, -29, -2, -1, -28, -29, -25, 7, -32, -13, 19, 0, -13, -36, -10, 35, -21, 24, 6, 2, 11, -8, 17, 31, -5, -22, -36, -18, -33, 28, -18, 35, -38, -4, 48, 29, 40, -49, 69, 107, -53, 26, -30, +17, -31, -70, -17, -6, 3, 19, -4, 18, -16, 42, 69, 45, 65, 9, 45, 18, -5, 10, -43, -29, -39, -35, 39, 81, -29, 33, -10, -1, -36, 40, 30, 44, -38, -8, -14, -59, -50, 25, 50, 29, -24, 75, -45, -22, 7, 21, -33, -24, 99, 127, -53, -2, -43, -33, -15, -17, 5, 7, 60, 13, -7, 24, -2, 30, -22, -9, 25, 51, -47, -12, 95, 14, -12, -21, -18, 94, 11, 4, 36, 38, +-11, 33, 51, -61, -3, -16, -24, -50, -21, 105, 34, -26, -34, -55, 31, 88, -75, 9, -3, -45, 115, -9, -7, 71, -34, 32, -34, -12, 40, 30, 51, -30, 7, -79, 83, -8, -4, -36, 15, -6, -58, -15, 33, 15, -1, -6, -12, -12, -18, 6, 33, -34, -15, -12, -13, 1, -8, -5, 4, -28, 17, 9, 4, -21, -15, 81, -29, -28, -43, 33, 26, -15, -44, -4, 47, 57, 50, -20, 50, 4, -3, +2, 35, 12, -55, -12, -45, -15, 3, 25, -20, -32, 12, 8, 0, -28, -2, -20, -36, -25, 40, -19, -21, -32, 23, 60, -63, -17, -5, -8, -14, -8, -14, -68, -12, -16, -34, 30, 31, 12, -31, 5, -35, -27, 52, 127, 24, 9, -63, 10, -9, 5, 1, -38, 17, 41, 127, -13, -62, -29, -68, -47, 26, 14, 0, 4, 8, -28, -70, -12, -2, 22, -45, -21, -23, 27, -38, -6, -2, -15, -29, 10, +-29, 29, -23, -4, 41, -9, -15, 22, -2, 9, -24, 8, -25, -41, -62, -11, -4, 22, 40, 23, -63, 14, 56, 16, 2, 45, 54, 2, 27, 30, 7, 14, -25, -16, -15, -8, -7, -1, 2, -14, 58, -32, 16, 24, 16, 1, -18, 4, 55, -7, -31, -16, 33, 20, 20, -19, 55, 4, -17, -17, 47, 0, 23, 2, -49, 2, -18, -24, 56, -27, 31, -48, -35, -12, 3, -8, 13, 0, 52, -62, -6, +-23, -43, -1, -8, 38, -67, 4, -42, 4, -28, -6, 48, 13, -4, 25, 8, -28, -5, -7, -56, 34, 124, 16, -7, -12, -22, -2, 29, -9, -18, 3, -24, -28, -23, 39, -47, -21, 31, -22, 9, -5, -27, -6, -22, 31, -10, 69, -26, 9, -23, 62, 29, 78, -10, -14, 3, -21, 0, 21, -14, -7, 21, -15, -29, -19, -25, -6, 96, 15, 64, 58, -6, -5, 3, -30, 98, 35, 11, 0, 33, 2, +25, 105, -69, -11, 37, 8, -5, -7, -49, 20, -43, -12, -30, 1, -18, 12, -28, 49, -35, -34, -32, -14, -20, -30, -29, 20, -52, 25, -20, -20, -7, 7, 58, 92, -13, -34, -10, 21, -34, 13, 14, -6, 20, -12, 51, 38, -11, 13, -9, 11, -15, -36, 9, -20, -23, -1, -23, 22, -14, 20, -28, -62, -38, -2, 37, 17, -29, -27, 42, -20, -18, 16, -10, -5, 27, -8, -10, -14, -9, 4, -11, +27, -14, -15, 22, 58, 20, -27, -20, -26, 20, -31, 38, -8, 2, 18, -1, 14, -28, 29, 49, -48, -39, 5, 15, 67, -53, -17, -28, 19, -9, 6, -17, -35, -49, -9, 0, -24, -50, -63, 12, -18, 33, 10, 4, -11, 23, 17, -2, 32, -2, -12, -21, -16, -3, 47, 30, 27, -46, -33, 34, -23, 5, 3, 29, -24, 46, 9, -11, 69, 6, -35, 58, 54, -13, 13, 39, -18, 9, -32, 55, -7, +104, -22, -14, 3, 91, -23, 30, -4, -14, -13, 24, -37, 23, 52, 23, -52, -24, 6, -34, -5, 6, -68, -3, 29, -9, -37, -24, -5, -35, -33, 7, -6, -32, -37, -42, -61, 35, 10, 116, 1, 21, 6, -29, -3, 20, -54, 79, 70, 52, -24, 17, 14, -16, -17, 12, -37, -36, -7, -40, -88, 44, -53, 3, 3, -14, -14, 91, -22, -5, -2, 32, 6, -34, 9, -12, -55, -12, 4, -27, 16, -10, +25, 40, 16, -4, 10, 25, -5, -5, -17, -10, 1, -7, -29, 28, 26, -32, -3, -15, -2, -52, -40, -3, -11, -30, 17, -45, -19, -39, 38, -58, -4, 79, 4, -35, -14, -17, -46, -16, -30, 3, 17, 7, 65, 127, -16, 20, 49, 26, 51, -20, -34, -57, 104, 29, -18, 27, 28, -4, -57, -11, -19, 10, -76, -63, 41, 111, 15, -19, 0, 118, 41, -11, 25, 23, 28, -28, 5, 69, 58, 63, -30, +-15, 42, 0, 73, 18, 1, -22, -2, -30, 12, -9, -58, 21, -20, 29, -65, 93, 89, -11, 3, -55, -1, 10, -3, -11, 63, 58, -12, 77, 106, 37, -22, -25, 10, -10, -5, -31, 36, -36, -24, -12, 5, 14, 2, -27, -18, -27, -12, 41, 54, -35, -19, -12, 35, 15, 22, 45, 5, -32, -23, -14, 67, -3, 38, -21, 14, 0, 28, -47, -19, -8, -18, -52, -36, -39, 4, -30, 18, -28, 21, 22, +23, 5, -48, 47, 7, 10, -11, 12, 50, 58, -23, 49, 31, -46, 1, 6, -6, -1, 44, -47, 1, -3, 16, 20, -3, -27, 29, 32, -28, 38, -57, 91, 85, 21, -18, 4, -27, 24, 15, 12, 17, -59, 9, -32, -2, 50, 22, 71, -1, -42, -1, 56, 21, -33, 6, -43, -16, -33, 32, 1, 33, 11, 8, 47, -32, 2, -35, 18, -22, -7, -14, -5, 39, -60, 42, 35, -9, -26, -4, 22, 37, +41, -25, -30, -33, -10, 13, -25, -2, 10, 15, -34, 5, -7, -12, -3, -18, 6, 48, -7, 8, -44, -30, -11, -13, 14, 22, 3, 34, 24, 67, 45, -3, -70, 28, 12, 33, 3, -18, -27, -33, -43, -36, -35, -61, -15, 43, -35, 50, -21, -6, 8, 0, -22, -13, 31, -23, 71, 16, -13, -62, 37, 1, 30, 12, -30, -48, 100, -44, -7, -2, -32, -28, 5, -39, -30, 56, 5, 13, -48, -51, -17, +26, 2, -19, 10, 6, 62, -26, 25, -29, -31, -16, -24, -22, -18, 1, -32, 12, 8, -18, 8, 127, -12, 36, -38, -13, -31, -13, 1, -43, -37, 6, 6, 36, 3, -33, 90, 6, 1, -19, -16, 15, -24, -45, 21, 24, 109, 6, -2, -32, -13, -47, -8, -53, 36, -34, 8, 5, -1, 31, -32, -10, 59, -34, -42, -25, -71, 18, 41, 14, 5, -19, -25, 53, -30, -42, 59, 3, 33, -22, -56, 10, +-16, -22, 37, -15, 12, -33, -19, 32, 12, -1, -12, 13, 27, -26, -36, 7, -6, 22, 30, 4, -14, -14, 4, 35, 3, -1, -35, -90, -20, -37, -20, -23, -24, -17, 2, -52, -4, 47, -5, 13, -33, -29, 40, 22, -34, 39, -29, -8, -32, 15, -27, 28, -33, 3, 7, -45, -28, 23, 78, -16, 10, -30, 1, -9, 19, -36, 119, 11, 8, -39, -2, -26, -24, -35, -8, -45, 7, -32, 17, 23, 27, +1, 20, 32, -60, -52, -50, 2, -7, -25, 15, 2, 10, 3, -2, -9, -29, 12, -49, 57, -16, -32, 2, -3, -5, -11, 53, -26, -2, -13, 25, -8, 27, -2, -14, -25, -23, -3, -27, -4, 32, 25, 22, 44, 45, -25, -26, -32, 1, 3, -30, 9, 37, -4, -32, 20, 25, -24, -66, -21, 8, 38, -23, 15, 113, 10, 27, -9, -33, -50, 26, -28, 4, 16, 23, 4, 64, 4, 8, 49, 23, -11, +41, -66, -73, 0, 34, -20, -14, 33, 38, -19, 44, 40, 0, -7, -4, 5, 11, -12, 1, -1, 84, -10, -36, 4, 66, -18, 27, -28, 4, -8, 0, -5, 5, 2, 17, -24, 16, -10, -2, -8, -5, 0, 15, 12, -1, 7, -33, 56, -8, 16, 23, -15, -1, 16, 30, -35, 11, -34, -5, -3, 25, -6, 1, -50, -6, -14, -27, 27, 5, 7, 25, 18, 47, -13, 22, -20, -18, 37, 70, -17, 28, +55, -30, -38, -39, 19, 39, 1, -16, 0, -36, -38, -8, -14, -35, -29, -1, 29, 7, -47, 5, 20, -13, -13, -10, 51, 43, 78, 19, -12, 39, -28, 79, 51, -43, -21, -19, 26, 49, -14, 42, 12, 110, -7, -4, 6, 28, -47, -5, 6, 7, 13, -28, -36, -22, 2, 5, -41, 11, -30, 18, -22, -25, -4, -8, -10, -25, -39, -19, -6, 23, -32, -4, -9, 17, -7, -17, -5, -7, -21, 16, 3, +-13, -2, -3, 12, -9, 0, 6, -15, 36, -13, -21, 3, 22, 17, -22, 2, 54, -10, -12, 38, -9, 23, -16, -34, -25, 29, -11, -5, -16, 50, -16, -44, -58, -24, -2, -26, -16, 50, -8, 44, -53, -18, -5, -1, 42, 47, 28, -37, -5, -50, -13, -40, 23, 76, -25, -37, -26, -8, 6, -10, 20, 54, -38, -44, -4, -9, -25, -17, 52, -7, -30, -9, 13, -23, 59, 3, -10, -12, 21, 13, 29, +-19, 3, 57, 29, -31, -33, -14, -24, 49, 32, -21, -22, 108, -3, -49, 27, 12, 1, -41, -40, -32, -15, -16, -2, 0, -9, 65, 3, -6, 22, -2, -29, 12, -30, 79, -7, 72, -53, -63, 0, -29, -17, 8, -26, 15, -14, -25, 77, -12, -7, -40, 117, -20, -20, -5, 24, 21, 15, 92, -11, -27, 7, -10, -13, -6, 23, 28, 36, -21, 30, -3, -10, -11, 1, -42, 43, -34, -10, 10, 17, -22, +29, 6, -18, -24, -19, 1, -15, 0, -2, -23, 2, -8, -17, -10, -1, -31, 24, 45, 23, 45, 12, 95, 108, -5, 16, -2, -11, -25, -1, 12, 39, -28, 61, -15, 9, 5, -6, -13, -29, -43, 9, 0, 6, -12, -14, 6, 65, -20, -12, -8, 34, -14, -38, 32, -47, 31, -15, 50, 6, -4, -10, -17, 17, 63, 9, -27, 8, 49, 39, -33, 4, -64, -47, 127, 11, 45, 42, -33, -19, 76, 29, +58, -27, -10, 11, -18, -26, 31, 22, -25, 14, -37, 24, -23, -77, -73, 24, 19, -33, -16, -2, 23, -26, 9, -44, 90, -39, -56, -18, 85, 58, -46, -13, -88, -18, -6, -17, -3, 9, 11, -30, 34, -4, 51, -20, -18, -26, -17, -1, 3, 19, 12, 8, -24, 7, -22, 58, -50, 7, -17, 10, -5, 43, -3, 27, 91, -6, -35, -32, -24, -57, 30, 32, -15, 21, 29, 16, -42, -22, 7, -6, 43, +36, -32, -18, -20, 65, -43, -5, -48, 7, 32, -1, -8, -24, -50, 52, -23, -17, -6, 4, 32, 100, -15, 74, -10, -37, 10, 27, 22, 3, 21, -41, 53, -42, 38, 19, -24, 102, -33, 0, -6, 23, 3, 9, -32, -13, -16, 5, -8, -28, 14, 14, -2, -43, -34, 9, 5, -39, -20, -26, -2, 23, -27, -41, 40, 25, -28, 2, -20, -2, 11, 19, -11, -14, 6, -16, 14, -25, -15, 16, 13, 27, +12, -34, 7, 39, -3, 20, -45, -31, 107, 17, 1, 53, -20, -12, -2, 12, -43, 10, -11, 30, -7, -14, 58, 9, 15, -9, -7, -2, -24, 25, -31, -27, -20, -8, 38, 13, -13, 25, 1, -5, 70, 16, -13, -40, -42, -10, -11, -20, 25, -14, -23, -49, -26, 67, 17, 56, -7, 3, -15, -18, 92, -14, 31, 42, -31, 31, -15, 18, 29, 27, -11, -11, -3, -9, -23, 76, 58, -21, -19, -17, 12, +-17, -4, 6, 13, 41, -3, 33, -27, -1, -23, -4, 14, 3, 6, 1, -5, -6, -26, -50, 11, 18, -20, -20, 31, -14, -21, 24, -29, 5, -20, -5, -8, 17, -11, 18, -17, 15, 16, 23, -33, -8, -3, -8, -27, -6, 65, 8, 83, 12, -66, 8, -2, 15, -48, -19, -2, 20, -67, -32, -31, 30, -19, 63, 7, 1, 3, -9, 5, -29, 29, 2, -41, 23, -9, -36, -13, -1, 57, -47, 32, 22, +7, 3, -38, -7, -55, 18, 4, 4, 3, 43, 108, -29, 40, -10, -35, -14, -16, 16, 24, -30, 30, 51, -10, 24, 31, -55, 12, 1, 25, -33, -12, -13, -19, 34, 5, -20, -25, -7, -14, -15, 34, 15, -53, -3, 10, 13, 90, -47, 21, -27, 47, 6, -7, -23, 20, 9, 22, -1, 0, -3, -63, -36, -21, -36, -34, 41, 2, 48, 12, 64, -11, 39, -36, 90, 22, -47, -17, 27, -32, -15, 117, +-56, 4, -22, -39, -11, -5, -7, 51, 33, -16, -35, 22, 17, 121, -35, -22, -6, -20, -9, -6, 3, -8, -2, -7, -4, 0, -2, -13, 16, 25, 13, 14, -56, 24, -24, -43, -22, 24, 92, 1, -11, 5, -1, -15, -27, 27, -15, 4, 2, 2, 5, -9, 4, 127, -32, -12, -12, -6, -6, -9, 81, -3, -6, -15, 38, 38, -29, 16, -34, 20, 26, 27, 20, -19, -5, 30, 22, -47, -38, -50, -57, +8, 2, 19, 16, -21, 67, -17, -15, -17, -1, -32, 6, -17, 55, 0, -78, 80, 13, 65, 8, -29, 4, 19, 11, -24, 6, -15, 8, 54, 10, -14, 99, 6, -26, -41, -49, -32, 45, -17, 19, 66, 6, -29, 2, 5, -10, -13, -36, -7, -30, 52, 127, 6, -48, -33, 68, -42, 28, -13, -24, -24, -40, 39, -17, -15, -36, -9, 45, -26, 34, -4, 33, 4, -21, 22, 37, -30, 4, -20, -26, -4, +-26, -5, 43, 27, -10, 13, -1, 25, 41, -36, 12, -38, -10, -29, 17, -55, 44, 31, -60, -44, -6, -59, 13, -33, 7, 58, 63, 29, 1, 22, -41, 87, -1, -26, 26, 20, -24, -39, -19, -44, -20, -30, 95, -13, -23, 40, 38, 43, -8, -14, -21, -37, -11, -24, 2, 19, -7, -43, 34, -28, 19, -25, -16, -10, -8, 32, 10, -22, 24, -58, 27, 34, -51, 42, -33, -3, -8, -11, 16, 24, 12, +-13, 27, -6, -10, 20, 7, -7, -6, -30, 3, -1, -11, -7, -19, -1, -11, -7, 10, -7, -28, -15, -29, -2, 9, -9, 2, 120, -21, -5, 38, -11, -15, -30, 22, 7, -29, -4, -16, -37, 33, -24, 14, 30, -36, -2, -15, 41, 15, -52, -21, -13, -28, -11, 35, 20, -19, -18, -48, -51, 24, 27, -2, -28, 39, 13, -13, -27, -37, -25, -21, 26, -14, -18, -15, 18, -10, -10, 7, 23, -21, -19, +-19, -38, -5, 25, 28, -6, 21, 20, 35, 112, -54, -4, -8, 24, -4, -5, -6, 9, -30, 18, -20, 6, -25, -16, 70, 86, -10, -13, -13, -62, -19, -1, -41, 7, 127, 9, -9, 5, -19, 54, 13, 18, -10, -13, 30, -37, -14, -27, -9, -10, -13, -28, -10, -37, 39, -24, 11, -17, 38, -28, 30, -16, -1, 53, 29, -12, -13, -3, 44, -18, -40, 19, 6, -2, -33, 51, 29, 41, 28, 22, -7, +62, 47, 12, 47, -44, -25, 28, 42, -1, 19, 16, -18, -12, -3, -1, 15, 33, 13, 15, 28, 38, 43, -35, -16, -46, 16, 27, -23, -32, -15, 26, -24, -3, 17, -17, 8, 22, -36, -5, -16, 24, -12, -7, 3, 66, -48, 39, -7, -54, 19, -2, -29, -2, 7, 22, -19, -2, -32, 86, 5, -11, -16, 1, -5, 29, 60, -2, -56, -49, 45, -10, -31, -59, 23, -52, -7, 41, 10, -16, -38, 4, +-26, 73, 3, -26, -22, -11, 6, 84, 17, -9, -6, -2, -7, -35, -33, -5, -44, 79, 6, -14, -29, -1, -44, 44, -28, 55, -49, -51, -3, -52, -39, -8, 15, 34, 25, 17, 6, 4, 76, 25, 0, -25, -19, -26, 30, 18, -3, -3, 46, -18, 38, -17, -18, -5, 15, -9, 46, -8, 5, -3, 31, -5, 15, -40, -3, 83, 54, -22, 19, 8, -2, -10, -27, -30, -34, -77, -20, 81, 86, 39, -35, +-37, 29, -7, -5, -4, 67, -10, -21, -52, -4, -11, -11, 29, -15, -22, 36, -5, 55, 36, -22, -24, -13, 7, 43, 6, -17, -75, -22, -52, 19, 0, 25, 91, 18, 1, -50, -11, -13, -37, 43, 46, 3, 36, 38, 5, -6, 8, -6, -21, 12, -19, -57, -32, -21, 50, -8, -36, 9, -79, 21, 17, 50, 2, 9, 30, 8, -64, -45, -43, 1, 34, 54, 15, -4, -9, -9, 51, 2, -7, 14, -6, +-52, -18, 49, -13, 54, 27, 62, 0, 11, -18, -3, -20, 24, -6, -7, 5, -5, -30, 12, -55, -2, -32, -17, -38, 21, 13, 0, -5, 21, 19, 13, 24, 5, -35, 6, 48, 63, -16, 5, -59, -15, -18, -18, -18, -4, -6, -34, 1, 7, 76, -90, -28, -34, 15, -9, -23, -5, -16, 83, -20, -25, 3, -27, 61, -11, 69, -8, 55, -36, 32, -5, -44, -30, -19, 8, 17, 4, -15, 3, 4, -39, +-53, 63, -73, 23, 41, 90, -21, 59, 59, 17, -15, -21, 33, -1, -33, -19, -14, -5, -22, 22, -1, 2, -20, -15, 5, -23, -15, 77, -2, -4, -23, -15, -20, -29, 3, -13, 0, 3, -14, -35, -12, 3, 2, -28, 21, 9, -36, 6, -30, -7, -8, -12, -30, -19, 26, -12, -34, 22, -31, -10, -3, -70, 53, 19, -10, -35, 53, -5, -46, 4, 5, -62, -17, 3, 62, -26, -7, -27, 26, -25, -44, +-15, 12, -17, 12, -1, 22, 22, -22, -43, 7, 47, -48, -35, 3, 3, -3, 34, -32, -3, -2, -14, 18, -6, 50, -3, -62, -1, -24, 4, -21, -34, 28, -38, -15, -3, 58, -27, 38, -35, -33, 36, 16, 0, 7, 56, -6, 76, 1, -59, 1, 9, 0, -9, -1, -32, -7, -14, 30, -29, -20, 1, 58, -11, 21, -28, -16, -9, -20, -36, -23, -6, -13, 10, -52, -16, 12, -14, -16, 14, 5, 0, +3, -7, -1, -12, 36, 54, -1, -16, 33, 24, 34, -22, -6, 15, -2, 13, -22, 56, -24, -16, 16, 56, -7, -7, 19, 18, -7, 15, 36, 21, 4, 1, -39, -19, -2, 6, -48, -31, -33, -3, 25, -43, 91, 40, 9, -8, -24, -5, -49, -28, -26, 0, 27, -33, -36, 20, -7, 43, 56, 46, -46, 27, 52, -6, -25, 75, 15, 21, 33, 29, -40, 44, 70, 105, -2, -36, 15, -10, -38, 11, -6, +12, -51, 0, -21, -5, -59, 17, -22, -43, -19, -16, 31, 26, 29, -23, -28, -2, -17, 45, 5, -44, 47, 19, 31, 86, 21, 24, 38, 23, 3, -10, 29, -13, -4, 78, -55, -40, -24, -47, -29, -24, -19, -16, -52, -31, -6, 70, -7, 27, -38, -2, -3, 18, -31, 7, 9, -22, 27, 57, 103, 9, 7, -7, -3, -20, -15, 8, -22, 8, -3, 21, -10, -23, 18, -14, -18, -8, -13, -27, 65, -35, +2, 108, 13, -28, -23, -7, -33, -31, -37, -26, 20, 3, 5, -51, 3, 8, -28, 57, 8, -19, 41, 2, -7, -3, 31, -6, 31, 29, -27, 3, -47, 24, -19, -19, -32, -20, -6, 2, -14, 6, -13, -19, -34, -22, 20, 23, 42, -33, -18, 5, 8, 7, -15, 6, -43, 16, -25, 16, 14, -59, 52, 22, 42, -39, -28, -4, -5, 18, -10, 21, 16, -29, 6, -11, 56, 9, 59, 50, 95, -18, -27, +23, -17, 37, -8, 52, -48, 39, 34, 10, -19, 4, 39, -19, -10, 14, -27, 32, 12, -74, -36, -8, -1, 42, -53, 58, 41, -41, -18, 30, 10, -8, -12, -32, 23, 23, -32, 75, -46, -22, -5, 14, -9, 24, 61, -13, 4, 33, 19, 21, 12, 60, -6, 0, -7, -2, -18, 26, 14, 27, -6, 0, 38, -16, -42, 58, -53, -71, -32, -63, 24, 13, 127, -28, -11, -40, 43, 18, -5, 24, 14, 109, +-24, -20, -14, -39, -45, 30, -11, -1, -35, -13, 68, 11, -33, -41, -16, 50, -4, -30, -20, -18, 8, 10, -29, -14, -65, -7, -20, -12, -29, -17, -38, 56, -10, -46, 65, -1, -16, -14, -8, -29, -37, -27, -33, 7, 46, 0, 3, -11, -11, -10, -14, -28, 13, -3, 15, 6, -6, -8, 9, 3, 12, 7, -18, 5, -23, -15, -15, -10, -7, 4, -13, -8, -17, -29, -5, -22, 71, -3, -23, 0, -6, +23, -26, -13, -10, -39, 13, -35, 21, 34, 35, -27, -2, 45, -21, -24, -26, -14, -43, -1, 20, -14, -28, 8, 35, -25, 18, 42, 8, -11, -4, 14, -26, -7, 54, 21, -16, -21, -22, -1, 4, 2, 2, 14, 18, -6, -17, -15, -17, -44, 90, 7, -7, 18, -27, 16, -9, -12, -13, 14, 4, -10, -28, -15, -23, 10, 23, 30, -4, -8, -54, -2, 25, -3, 47, -37, 59, -38, -3, 24, 31, -32, +19, 12, 0, -8, -23, -36, -6, -32, -6, -17, -21, -2, -13, 8, -3, -6, -22, 11, 6, -31, 127, -19, 7, -8, -10, -10, -23, 0, 14, 10, 14, -14, -49, 17, -22, -1, -27, -29, 25, -49, 6, -2, 10, -15, -39, -12, -7, -9, -25, 34, -15, -5, -22, 80, -17, -5, 32, 29, 36, -6, -33, 15, -13, 67, -44, 35, -36, 5, 11, -2, 6, 30, -9, 5, 1, -21, 56, -4, 51, 24, -20, +85, -28, -23, 46, 45, -55, -24, 25, -1, -4, 16, -13, 10, -50, -56, -27, 40, -23, -52, -5, 127, -28, 44, 3, 8, 6, 54, 10, 78, 5, 9, -17, 52, -5, -14, 64, 59, -21, 50, 51, 41, 59, 8, 35, -12, -37, 58, -12, -22, -23, 16, 3, -24, 33, 17, 10, -10, -30, 29, -37, -27, 6, -24, 33, -23, 84, 20, -7, 25, 12, 10, 42, 43, 55, 36, -16, -45, 9, -20, -40, -45, +-8, -4, 0, 21, 106, -38, -12, -3, -12, -11, 9, 19, -16, 7, 34, 35, 3, -41, -35, 64, -23, -3, -15, 26, 22, 13, 32, -47, -9, -51, -26, 12, -25, -6, -26, 26, -8, -3, -2, -29, 6, 5, 4, -69, 33, 20, 0, 4, -23, 14, -38, -2, -19, -7, -5, 26, 5, -6, 3, -43, -40, -58, 42, -23, 22, -9, 44, -2, -2, 9, -21, 13, -5, 11, -39, 7, -40, 82, 37, -34, 65, +-4, 77, -29, -11, 83, -67, -5, -1, -12, -3, 6, -17, -15, -56, 50, -14, 18, -10, 7, -8, -3, -22, -6, -3, 13, 8, 18, 14, 26, 67, 76, -5, 15, -35, 15, -55, -21, -62, 24, -8, 22, 57, -7, -101, 11, -38, -57, 93, 32, -49, -51, -7, 86, 7, -35, -4, -46, -2, -23, 6, 11, 19, 29, -4, 19, -36, -8, 16, 76, 86, -41, -25, -50, -5, -31, 22, -8, -15, 49, -4, -10, +-30, -30, 70, -10, -42, 77, -39, -58, 54, -25, -6, -45, 26, 14, -36, 63, -40, 38, 26, 38, 14, -15, 30, -51, -32, 71, -15, 107, -18, 18, 97, 1, -17, -29, -12, -53, -7, -32, -43, 10, 1, -18, -24, -10, -12, -32, -14, -12, 6, -25, 14, 19, -42, -8, 94, -22, -32, -49, -25, -26, -24, 14, 52, -11, -27, -18, 33, -11, -17, 26, -29, 15, -33, 14, -9, 26, 2, -19, 7, 3, -24, +-12, 45, -17, -6, -13, 45, -23, -7, 13, -5, -13, 13, -39, 21, 0, -41, -21, 27, 42, -38, -13, -24, 127, -6, -19, 12, 6, 62, 13, 13, 2, 47, 107, 25, -10, 81, -8, 12, 22, -1, -24, 8, 26, -7, 15, -50, -15, 17, -33, -41, -14, -7, -5, 7, -30, -13, -6, -22, 23, 15, 44, -12, -26, -13, -41, -23, 20, -11, -21, -17, -25, 13, -48, 41, 27, 9, 21, -28, -22, 22, -31, +-26, -28, -5, 1, -7, -12, -2, 15, -34, 27, 6, 34, -24, 1, -37, 26, 6, -18, 40, 32, 38, -8, -17, 31, -5, -24, -4, -13, 1, 17, -3, 7, 17, -32, 21, -6, -2, 28, 1, -2, -15, -6, 22, 22, -10, 26, 14, -5, -12, 43, -15, 35, -2, -3, 47, -2, -4, 5, 26, 7, 22, -8, 35, -20, -3, -1, 34, 7, -38, 0, 42, 22, 5, 5, 37, 20, 24, -44, -6, -34, -40, +2, -9, 38, -12, -13, 0, 3, -17, 10, 50, 24, -6, -2, -42, 119, 13, 16, 14, 36, -40, 18, -29, -25, 105, 82, -33, 35, 9, 17, 17, 10, -23, -15, 15, 42, 7, 126, 125, 18, -27, -1, -23, -24, -9, -32, 24, 61, -8, 64, 13, 97, 17, -31, -12, -52, 5, 26, -22, -2, -38, 5, 63, -39, 50, 2, -11, 22, 3, -12, -28, -24, 12, 13, 43, -10, -42, -8, -2, -6, 4, -20, +-37, 41, 9, 89, -9, 77, -42, 0, 56, 43, -12, -36, -53, 36, 13, -88, -14, -52, -9, -63, -10, -16, -63, -46, -8, -31, 7, -8, -55, 36, 6, -16, -29, -6, -10, -39, -16, 21, -7, -33, -6, 20, 24, 9, -31, 29, 8, -2, -33, 1, -28, -16, 39, 38, -7, -17, -12, -30, 18, 26, -5, -1, -6, 32, 32, 19, -37, 16, -10, -6, -5, -19, 23, -28, -12, 4, -14, 38, 45, 16, 49, +-28, 9, 15, 0, -10, -29, 61, -4, 37, -12, 12, 2, -33, -17, -20, 39, -5, 33, -67, -40, 111, -10, -28, -15, 52, 35, 4, -69, 11, -57, -9, -31, 47, -25, 44, -15, -17, -2, -44, -11, 63, 0, 31, 34, -1, 81, 35, -22, -34, -36, -18, 17, 18, -28, -26, 22, -22, -87, 1, 56, 46, 36, -37, -44, 46, 25, 49, -66, -73, 6, 60, -5, -15, 17, -18, 83, -22, 40, 72, -14, -12, +13, 30, 5, -2, -29, -23, 0, -15, 18, -5, -11, -8, 59, 57, 0, -8, -6, -27, 4, 20, 9, -11, 1, -12, 57, -13, 34, -2, 4, -12, -3, -38, 35, 20, -14, 55, -19, 12, -10, 27, -4, -38, 43, -16, -14, -35, 4, -3, -29, -14, 16, -31, 104, 31, -46, -38, 70, -27, 37, -8, -57, 48, 3, 19, -24, -27, 28, -15, 127, -51, -12, -3, 59, -44, -24, -48, 42, -38, -68, 21, 45, +-3, -18, 1, 31, 22, 48, -21, 1, 7, -14, -5, 22, -29, 84, 20, -13, -18, -9, -1, -19, -10, 36, 5, -10, -18, -31, 38, 16, -3, 25, -14, -18, 64, -45, 14, 1, -25, -1, -7, 19, 48, -7, 47, 11, -35, 127, -10, 7, 23, -12, -5, 25, -14, -2, -19, 9, -32, -18, -4, 30, -42, 0, -14, -8, -8, 5, 16, -3, 51, -48, -18, -21, -7, -53, 31, -3, 7, -41, 19, -42, 24, +-9, 9, -28, -36, 67, 3, 38, 8, 30, -5, 38, -25, 88, 2, 7, -36, -63, -2, 47, 5, 30, -18, 26, 127, -9, -22, -9, 17, 53, 38, -35, -30, 0, -7, -25, -32, 1, -2, 25, -23, -22, -29, 15, 10, 5, 2, -16, 30, 10, 14, 24, 35, 31, -8, -14, -24, 33, -10, 11, -12, -14, -55, 4, 39, -38, 7, -16, -10, 19, -11, -3, -34, 0, 9, 11, 17, 6, 3, -3, 3, 10, +2, -23, -16, 11, 16, 2, 14, 11, -16, -37, -13, 11, -17, 14, -20, -33, -52, -48, 2, -23, 5, 18, 20, -55, -2, -61, 48, -49, 48, -2, 48, -7, 34, -50, -33, 4, -22, -10, -13, 23, 67, 23, -64, -56, -12, 9, -1, 48, 60, -25, -44, -47, -40, -50, 4, -17, 29, -13, 47, -47, 10, 11, -22, -4, 11, -41, -35, 42, -35, -25, 3, 48, -9, -47, 13, -37, 23, 10, 27, -47, -25, +-9, 127, 12, -27, 49, -14, 6, -19, 9, 47, -44, 61, -1, -9, -67, 95, 32, -29, -22, 9, -43, -33, 12, 12, 0, -25, 16, 5, 11, -14, 93, 9, -27, 43, -67, -33, -19, -42, -81, -19, 22, 16, -42, 47, -19, -25, 20, 59, 94, 35, 60, -1, 20, -8, -30, -33, -17, -68, -61, 17, 39, 17, 10, 11, -37, 3, 14, -32, -16, -18, 14, 13, -13, -17, -10, 22, 0, -16, -8, 18, -22, +-16, 14, 127, 17, 7, 18, 6, -5, 18, -33, -38, 10, 57, 28, -1, 6, -11, 12, -18, -24, -47, 42, -10, -29, -2, -35, 36, 13, 93, -18, -17, 31, 26, -18, 53, -38, 36, -14, -8, -30, 20, 37, 10, 2, -4, -23, -33, 14, -22, 34, -3, -43, -24, 14, 26, 5, 32, -28, -8, -21, -5, 25, -5, 69, -13, 27, -18, -7, 108, -24, -23, -4, 17, 110, -18, 3, -43, -9, -46, -1, 12, +50, -8, -14, 16, -37, -13, 12, 59, -37, -13, -8, -16, -27, 49, 1, -50, 26, 30, -29, 19, -4, 17, -48, -37, -52, -23, 0, -20, 23, -22, -43, -21, -28, 35, -14, 40, 58, -24, 78, -9, 5, 8, -19, 40, 45, 11, -14, 13, 12, 127, 25, -32, -42, -1, -19, -26, -38, 62, 8, -7, 43, 51, -20, 4, 46, 2, 32, -27, -27, -8, 46, 24, -68, 10, -2, 37, -2, -2, 109, 70, -22, +-46, -7, 4, -30, 10, -71, 6, 9, 73, 19, 25, -36, -29, 8, 25, -37, -20, -25, 35, 32, -27, -16, -21, -25, -17, 17, -2, -22, -35, -13, -6, 1, -19, 18, 4, -71, -55, 0, -16, -18, 7, -20, 25, 36, 52, 15, -16, 6, 2, 65, 37, 32, -7, -8, -23, -24, 0, -7, -7, -24, -4, 20, 38, 34, -16, -33, 6, 59, -31, -5, 24, 5, 23, -15, -1, -20, 5, -1, 29, 56, -32, +-20, -31, -18, -9, -13, 0, -6, 65, 16, -28, -15, 48, -22, -26, -1, -49, -26, 22, 35, -20, 43, 0, -16, 59, 34, 2, -34, -9, -12, 44, -3, 9, 38, -4, 78, -35, 30, 94, 1, -38, -44, -12, -12, -52, 2, -48, -10, -35, 16, 5, -2, -19, 7, -22, 51, 32, 33, 19, 33, -1, -28, -19, 42, 4, 0, 11, -24, -14, -22, -30, -8, 0, 5, 12, -14, -16, -34, -17, 27, 49, -21, +-18, -14, -39, -31, -2, -47, -37, -10, -14, -24, -24, 5, -21, 8, 4, 3, 10, 23, -24, -8, 58, -11, 11, 20, -5, 59, 4, -12, 18, -9, -1, -19, -29, -4, 8, 1, 5, -5, 12, 2, 25, -16, 13, -68, -7, 8, 8, -18, 22, 12, 14, -18, -61, -2, -7, 12, 0, 23, 13, -1, 34, -7, 59, -29, 48, 11, -18, -14, -2, 127, 5, -34, -2, 11, 0, -15, 8, 21, 27, 10, 15, +43, 13, -16, -24, -14, -8, 21, -6, -28, -41, 74, 30, -4, -66, 45, -6, -4, -28, -19, 81, -51, 31, -21, -3, 36, 2, -6, 5, -20, 12, 37, 35, 24, 27, -13, 9, 38, 2, 46, 5, 22, -11, 9, 21, -29, -4, 27, -7, -3, -13, 35, -5, -16, -15, -4, 30, -4, 63, -8, -24, -8, -54, 21, -62, 43, -2, 20, -19, -27, -25, 76, -24, 13, 3, -65, -23, -31, -3, -37, -31, 13, +-9, -31, 5, 32, 77, -27, -22, 23, -6, 21, -15, -6, -47, -6, -34, -24, -49, 20, -35, 6, 26, 11, -75, -64, 64, -17, -85, 52, -7, -25, 49, 5, -19, -34, 6, -33, -41, -5, -20, -10, -21, -45, -14, 21, 14, 46, -29, -52, 10, 21, 39, -51, 19, -14, -54, 6, -5, -3, 7, 15, -19, -2, 11, -10, 39, 32, -14, -27, -2, 5, 26, 25, 36, -38, -16, 12, -10, -29, 10, -6, 22, +43, -12, -35, 1, -5, -30, -20, -60, 26, -44, -53, -3, 18, -29, 25, 8, -1, 90, -30, -7, 15, 3, -32, -19, -35, -36, 36, -72, 16, -15, -21, 3, 29, -3, 6, -4, -2, -76, 4, 4, -4, -19, -34, 42, 45, 59, -16, -9, 17, -14, -22, 21, 32, 21, -53, 26, 3, -2, -43, -41, 22, -63, -11, 3, 22, -28, -38, 2, 36, -15, -13, 16, -48, -34, -15, -9, -24, -16, -27, -18, -37, +45, 21, 60, -49, 15, -13, -1, -16, -17, 11, -32, -43, -3, -10, 3, 11, 2, 7, -8, 6, -49, 17, 47, 30, -59, -25, -60, -34, -39, 7, -25, 11, -2, -58, -5, 2, -26, 7, -14, -5, -47, -18, 22, -27, -25, 11, 20, 16, 23, -8, 34, -36, -8, -8, 48, 34, 21, -26, -41, -17, 24, -12, 25, 15, -5, 11, 54, -5, 2, -33, 2, 10, 0, 11, -20, -21, 4, 18, -13, 5, 20, +14, -19, -1, 1, -2, -2, 2, -11, 4, -3, 9, 18, -3, 39, -8, 5, -13, 4, -4, 12, 34, 7, 0, -18, -33, 21, 8, -2, 3, -13, -13, 37, 2, -12, 50, 34, -28, 17, -6, -25, 59, 7, -17, -32, 73, 121, 105, 45, -11, 7, 10, -4, 35, 46, 39, -5, -33, 1, -40, 6, -25, 27, -9, -1, -11, -37, -23, 9, -4, 11, -19, -14, -7, 0, 30, 16, 6, 30, -35, 99, -62, +4, -1, -30, 4, -60, -16, -18, -33, -21, -31, 49, -38, 57, 27, 15, -55, -8, -6, 19, 43, -45, -31, -22, -93, 10, 7, -8, 61, -15, -37, -8, -7, 31, -25, 3, 50, 4, -42, -23, 23, -102, 9, -7, -14, -70, 17, -3, -63, -36, -6, -3, 15, -98, -11, -84, 30, -20, 8, 40, 24, 126, 36, 61, 10, -20, 0, 1, -13, 10, 26, 7, -5, 10, 22, -7, -19, 20, 36, -2, -62, -3, +16, -47, -34, 5, -3, -10, 7, -25, -4, -23, 49, 26, 21, 31, -19, -21, 35, 6, 18, -84, -33, -34, 49, -10, -18, -3, 14, -13, -36, -6, -14, -1, -27, -11, -18, -31, -17, 9, 6, 9, 25, -2, 7, 48, -14, -5, -3, -8, -7, -18, -14, -20, -9, 0, 23, -11, -15, -47, 5, -22, -9, 17, -4, 12, -14, -2, 37, -37, -19, -11, -34, -6, -6, -20, 35, -15, -42, -17, -31, -6, 19, +-24, -41, -3, -25, -50, 54, 27, 42, -14, 14, -19, -11, 26, -36, 30, 99, -51, -27, 56, -15, 57, -2, 37, 47, 14, 20, 41, -34, 25, 8, 1, -56, -36, -8, -46, -40, -64, 49, -19, 10, 7, -24, 28, -36, 39, -50, -25, 24, -17, 11, -12, -49, -41, 35, 79, 5, -62, -44, 79, 62, 20, -55, 0, -45, -51, -26, 6, -13, -16, -48, 37, -10, -31, 6, -12, 10, -30, -12, 48, -16, -11, +-23, -32, 7, 37, -43, -7, 47, -16, 3, -18, -5, 4, -7, -46, 12, 25, 30, -14, -26, 16, 16, -2, -52, 5, -19, -13, -33, 23, 15, 8, 34, 3, 2, 39, -59, -49, -9, 21, -36, -18, -16, 41, 66, 18, 24, -16, -34, 50, 28, 14, -14, 15, -19, -28, -25, 1, -48, -33, -55, -26, -3, -23, 40, 53, -11, 5, 9, -44, -9, 4, -23, -36, 0, -4, 19, -25, 20, -16, -15, -8, 67, +94, -43, -21, 26, -36, -63, -28, -40, -15, 6, 86, 4, 54, -57, 25, 14, -22, -10, -45, 0, 6, 12, -42, 13, -16, 27, 64, -26, -4, 28, -5, -26, -37, 12, 16, 62, 16, 2, 10, -6, 7, -44, 2, 47, -16, -23, 24, -24, 24, -51, -17, 7, -3, 63, -27, 5, 10, 1, -16, 28, 26, -15, -19, -8, -24, 29, 31, 16, -24, -26, -11, 0, -4, -44, 9, -15, -29, -23, -37, 4, -18, +13, -42, -4, 14, 1, -45, -1, -1, -28, -39, -3, -21, 51, 11, -12, 5, -20, -1, 3, -7, -22, -2, 6, -15, 31, 25, -18, -10, -2, 31, -13, 0, -10, -2, 5, 23, 29, 18, -31, 12, -25, -31, -2, 0, -27, -35, 22, 49, -36, 70, -36, -5, -5, -29, 40, 14, -3, -7, -52, -68, 38, 32, 9, 43, -5, -7, 9, -21, -34, -44, 31, -34, 127, -33, -34, 35, 21, 34, -43, 14, 15, +9, 27, -41, -9, 3, 30, 14, -43, -44, -18, 9, -32, 20, -40, -40, -27, -17, 34, -11, -58, 25, 3, -24, 2, -34, 15, 9, 50, 31, 12, 59, 9, -37, 14, 84, -41, -39, -49, 35, -30, -39, 17, 39, 53, -13, -5, 4, 78, 10, -21, -34, 4, 2, 8, 25, -6, -11, -32, -25, -10, 40, -26, -65, -15, -15, -29, -99, -49, 7, 44, 34, -88, 77, -39, 62, -17, 11, 48, 39, -56, -28, +-4, 54, -27, -3, 24, -50, -40, 96, 12, 23, -33, -10, 24, 3, 14, -21, -21, -33, -21, -36, -38, -24, 48, 9, -8, 17, -1, -8, -29, -3, -20, -2, 3, 52, 11, 36, 29, 20, -30, 9, -16, 10, 39, -3, -11, -14, 49, 27, 90, -7, -36, 17, -16, 25, 46, 8, 59, -20, -8, 10, 4, -9, 18, -6, -13, -55, 4, -25, 1, -40, 29, -45, -14, 40, 4, 20, -30, 29, 53, 18, 49, +-8, -12, 16, -22, 34, -47, -14, -27, -11, -40, 31, 7, -34, 6, -8, -2, -30, -7, -40, 14, 18, 3, -2, -7, -15, 21, -50, 15, 1, -37, -10, -50, -10, -6, -7, -28, 121, -27, -3, 80, -33, -21, 24, -27, 66, -15, 14, 8, -46, 5, 14, 11, -13, -8, -33, -10, 103, -40, 8, -57, -21, 10, -24, -5, 15, -63, -49, -7, 86, 52, 111, 21, -12, 10, 56, -2, 25, 7, 22, 23, -55, +-52, 19, 100, 38, 63, 3, 41, 54, -15, 13, 52, -42, -6, -15, 11, 18, 45, -32, 44, -26, 4, -35, -5, -2, -29, 7, -1, -10, -34, -21, 12, -26, 16, -33, -12, 9, 43, 22, 34, -8, 7, 37, -20, 14, 7, 68, -11, 2, -29, -27, 35, 127, 25, -24, -6, -42, 10, -37, 43, -19, 56, 17, 16, -18, 3, 28, 96, 1, 69, 9, -50, -5, 22, 15, 12, -2, 8, 66, 15, -16, -6, +-16, 13, 82, -11, 9, -6, 3, -14, -1, -22, 36, 27, 14, -39, -3, -12, -14, -10, 41, -22, 20, 17, -2, 20, 14, 4, 7, -58, 5, -63, 9, 71, -73, -30, 27, -14, 4, -28, 20, 39, 10, -12, 21, 7, -25, -5, 1, -14, -13, 54, 31, 14, 17, -12, -42, -3, -2, -8, -12, -7, 17, 3, -38, -41, -21, 104, 44, -41, 12, -68, 103, -9, 15, 18, -8, 19, -21, -11, 8, -24, 3, +-30, 12, 10, 18, -11, 45, 59, -8, -19, -18, 12, 29, -23, -14, 34, 6, 35, -56, 70, 6, 1, -14, 11, -6, 6, -14, -7, -1, -34, -12, 0, -15, 6, -28, 50, -2, 10, -40, -24, 14, -42, -20, -7, 6, -2, 12, 0, -3, 1, -8, 10, -19, -1, 3, 27, 37, 7, -24, -1, -21, 43, 8, -15, -13, -1, 3, 13, 35, -17, -15, -42, -64, -4, 11, -48, -7, -23, -28, -43, 67, -14, +-32, -35, 1, 48, -37, 3, 63, -40, 32, -11, -54, 5, 8, 12, 31, -33, -21, 2, -8, -35, 21, 17, 38, -11, -34, -6, 21, 16, -14, 16, -15, -38, 16, -39, -14, -3, 16, 20, -25, -33, 18, 39, 29, 14, 6, -26, -21, -8, -43, 15, -16, 7, 1, -34, 0, -42, -28, 54, -58, 45, -15, -1, -1, -50, 89, 2, 74, -4, 0, 4, 0, 35, -57, -30, -1, -26, -19, 6, 127, 72, -48, +9, 24, -45, -14, 39, -36, 16, -27, -52, 6, -29, -78, 46, 45, -12, -17, -29, 57, -15, 63, -13, -55, -8, 76, 97, -37, -8, 2, -45, 8, 16, 37, -37, 13, 18, -25, 1, 4, 8, 15, 4, 17, 39, 1, 4, 17, 61, 6, 0, 2, 9, 15, -2, 7, -14, 5, 6, -19, -15, 7, 7, -2, 21, 6, 2, -8, -3, 1, -20, 1, -6, 43, -2, -21, 19, -18, 33, 57, -9, 29, 18, +-25, -28, 8, 12, 3, 28, -18, -17, 22, 65, -5, 37, -45, -40, -9, 28, 5, 5, -34, 16, -3, -28, 18, -6, -9, -28, -28, 50, 7, -47, -17, 7, 2, -9, -26, 16, -5, 41, -6, -46, -5, 102, 52, 21, -54, 13, -6, 20, -21, -11, 3, -30, 108, -26, 2, 0, -57, -45, -4, 10, 127, -4, -8, -18, -37, -50, 61, -20, -12, 19, 17, -62, -40, 68, 60, 1, 6, -28, -37, -23, 0, +-11, -39, -44, 127, 42, 46, 11, -6, 23, -40, -35, 35, 13, 35, 13, 102, -68, 55, -57, -23, -50, 8, -54, -4, 18, -24, 49, 23, 35, 47, 43, -70, -33, -28, -6, -15, -39, -5, 87, 4, 20, -8, -4, 22, -48, -24, 29, 3, -10, 52, -29, 49, 39, 69, -39, -18, 17, 10, 5, -15, -19, -19, -46, 4, 82, -12, -58, -11, 0, 3, 19, -6, -28, -28, 31, 48, -44, 9, 48, -10, -11, +-9, 20, -44, 4, -55, -15, 32, -10, -8, 14, -38, 11, -15, -37, -37, -14, -39, 26, -40, -35, 15, -58, -18, -46, -34, 83, 0, -1, -5, 16, -5, -16, -16, 3, -17, -8, -50, -37, 11, -19, 2, 12, 0, 29, 4, -12, -20, -6, 32, 40, 108, -33, -11, -25, 80, -74, -55, -17, -53, 112, 10, -31, 41, 7, -37, -23, 31, -31, 5, 11, 3, 0, -3, 60, 66, -33, 10, 16, -43, 26, -14, +19, 37, 0, -10, 39, -4, -48, -23, -55, -33, 0, 14, -17, -7, 3, 127, -19, 2, -41, 43, 45, -10, -33, -49, 44, -13, -4, -35, 43, -5, -49, -24, -9, 3, 1, 14, -39, 7, -5, -15, 40, -6, -19, 10, 3, 2, 6, -7, 29, -29, -26, 42, 6, -10, -26, -10, -11, -13, -32, -3, -19, -9, 3, -9, -5, -25, -20, -18, 15, -5, -29, 3, -3, -16, 23, 127, -31, 18, 11, 14, -1, +0, 9, 0, -18, 31, -27, -5, -17, -7, -16, -14, 34, -2, -4, 18, -19, -4, -11, -8, -14, 4, -19, 78, -6, 76, -38, 25, -3, -9, -32, -6, -22, 49, -7, 53, -42, -21, -13, 38, -55, -22, 3, 42, -46, -2, -12, -49, 30, 11, -15, -50, -4, -6, -38, -46, 15, 4, 46, -7, 0, 40, 3, -33, 4, -17, -12, -6, 5, -11, 4, 10, 114, -46, 10, 7, -22, -23, 10, 12, 1, -14, +-54, -37, -57, -7, -4, -7, 65, -31, 0, -14, 28, -11, -21, 3, -27, 46, 31, 43, -39, 42, 22, 16, -7, -35, 43, -27, -35, -13, -16, 55, 17, -43, -29, -24, -44, -5, -15, -8, -14, -4, 37, -60, -10, 34, -14, -46, 2, -45, -18, -17, 120, -14, 67, 22, 32, -42, 69, -21, -22, 54, 1, -104, -37, -1, -6, 12, -5, 6, -24, -17, -29, 39, 50, -48, -24, -8, 2, -9, -18, 2, -11, +34, -3, -44, -6, -7, 54, 7, 8, 41, -4, -15, -41, 13, -4, -17, -24, -34, -2, -8, -27, 24, -33, -27, -30, -27, -3, 44, 77, 64, 21, 23, -47, -13, 127, 38, -19, 35, 0, 123, -24, -11, -35, -36, -52, 1, 1, 16, -33, -22, 20, 17, -28, 20, -24, 8, 18, -49, -10, 17, 33, 2, 7, -12, 17, 10, 9, -16, -8, 10, -9, 127, -25, -14, 4, -5, -15, 7, 77, -10, -23, -31, +-48, 9, -27, -54, 10, -39, -7, 23, -8, -45, 48, -35, -15, -31, -33, 102, -17, 39, -9, -7, -32, 36, -18, -43, -16, -3, 122, 27, 12, -1, -7, -52, -20, 29, -29, 25, -39, -13, 0, 22, -3, -22, 89, -76, 50, 35, 37, 16, -23, 10, 40, 4, -40, -20, -25, 46, 34, 24, 42, 83, -26, 9, -14, 18, -1, 37, 94, -26, -13, -17, 31, -4, -5, 23, -39, -3, 24, -10, -17, 2, -28, +-8, 46, -32, -13, -36, -10, 32, -27, 25, 37, 14, -2, -1, 34, -1, -2, 12, -63, -18, -3, -9, 10, -11, -20, -10, -35, 10, 7, 46, -45, 21, -13, -16, -25, -26, 77, -36, 25, -6, -33, -10, -18, -22, 13, 1, -14, -46, 6, -27, -17, 20, 2, -48, -23, 85, 4, 33, -22, 45, -9, -2, -19, 5, -22, -37, -24, 95, -12, -53, 36, 21, 19, -9, -73, 50, 30, 3, -18, -13, 4, -45, +-27, -19, 5, 9, -42, 14, -7, 42, 31, -3, -38, -18, -33, 66, -29, -46, -12, 74, -23, 9, -46, -127, 18, 3, -26, -27, 2, -45, 25, -7, 120, 1, -35, -18, 18, -4, -29, 6, 40, 41, 37, -16, -45, -15, -33, 45, 3, -47, -5, -3, -15, -44, -6, 55, -6, 40, -23, -23, -13, 36, -10, -19, -15, -4, 14, 16, -6, 8, 40, -25, 7, 46, -21, -13, -20, -12, 5, -14, -39, -3, -19, +15, 6, -5, -9, -22, -11, -19, -21, -21, 10, 3, -26, -31, -22, -41, -2, -40, 21, -16, 25, -15, -19, 8, 39, 23, -22, 25, -4, -52, 22, -10, 36, -8, 31, -6, -5, -15, -11, -1, -20, -2, -4, 53, -11, 55, 11, -49, 25, -43, -29, -16, -10, 63, -5, 27, -8, -13, 31, -5, -8, -22, 19, 0, -24, -33, -23, -39, -14, -28, 70, 31, -39, -43, 12, -34, 9, -35, -17, 28, -40, -2, +0, -34, 127, -28, 15, -29, -39, 5, 18, 0, -28, 1, 99, -2, -22, -33, -20, 14, -28, -37, -74, 63, -47, 22, 33, -31, -29, 6, 84, 4, -34, -43, 5, -22, -7, 8, -26, 18, -19, 36, 34, -28, -24, -7, -10, -71, -15, -50, 22, 4, -16, 13, -10, -30, 20, 19, -26, -45, 14, 53, -48, 12, 70, 13, 34, -27, 118, -15, -12, 31, 54, 14, -12, 1, -8, -26, 30, 18, -59, 0, -17, +62, 52, -53, 30, 16, -26, 39, 2, -3, -10, 2, 1, -8, -7, -32, -27, -21, 18, -12, -33, 19, 29, 12, -8, -3, -5, 25, -7, -24, -2, -27, -20, -4, 14, -12, 28, -28, -9, 20, -31, -29, 47, -9, -6, -9, -9, 77, -4, -5, -26, -13, 33, 12, 16, -3, 3, 28, -33, 2, -11, -80, 23, 15, -4, 0, -36, 46, -4, 16, -30, -20, -26, -16, 10, -33, -30, 34, 2, 43, -35, 8, +3, -8, -5, 18, 22, 54, -24, 40, 4, 5, 3, -22, -9, -19, -13, 12, 16, -7, -2, 13, -25, 3, -26, -8, -11, -22, -34, 7, 18, 12, 8, 54, -16, 7, 24, 76, -45, -19, -2, -40, 3, -1, -30, -21, -33, -24, 15, 38, 66, -27, 30, -30, 14, 22, -9, -44, -63, 51, -28, 42, 15, 15, -47, -4, -76, 22, 16, 94, 40, -38, -13, 14, -15, -35, 0, -17, -1, 1, 38, 17, -13, +-6, 55, -25, -33, 64, -18, -1, -49, -12, -38, -22, 14, 127, -24, -11, 7, -8, 6, -3, -18, -17, 36, 11, 51, -28, -33, 19, 66, -16, 11, -35, -38, -32, -30, -28, -4, 4, 12, 13, -61, -12, -23, 28, 15, -26, 5, -12, 14, -51, -19, 37, -16, 16, -4, 11, 19, -29, 21, 42, 6, -31, -60, -31, -5, 12, 9, -17, -6, -2, 2, -1, -1, -11, -31, -12, -2, 4, -16, -59, 8, -1, +31, -5, -6, 127, -5, 39, 26, -23, -18, -17, 100, 23, 36, -12, 1, 123, 10, 21, -15, -2, -81, 118, -9, -22, 3, 7, 29, -4, -43, 6, -23, 32, -14, 44, -7, -19, 13, -17, -4, -27, -33, -73, 39, -9, 49, -35, -48, 42, -23, 9, -8, 1, 34, 38, -2, 26, 15, 51, -10, -2, -17, -26, 9, 7, -52, 33, -27, 25, -19, 78, -13, -47, -15, 20, -10, 1, -5, 21, -28, 7, 6, +72, -18, 11, -10, -6, 16, 13, -22, -16, 54, 28, -3, -14, 12, 42, 30, -25, 11, 6, 19, -11, 15, -12, -33, 0, -14, -34, 31, 12, -11, -37, -41, -25, -23, -2, 3, 3, -15, -16, 1, -27, -2, -8, 10, 24, 0, 15, -12, 8, 19, 9, 17, -34, 8, -17, -2, 48, -24, 2, 33, 10, 1, -7, -10, -2, 11, 12, -26, -27, 12, 56, 0, -6, -3, -48, -14, -22, -45, -41, 126, -14, +-25, -17, -11, -42, -19, 29, -13, 1, 30, -55, 46, -20, -48, -16, 70, -31, -33, 13, 5, -15, -26, -34, 6, -2, 14, -26, -4, 66, 33, -6, -20, 7, -28, 10, -4, 35, -22, 75, -29, -15, 92, 6, 66, 2, -12, -12, 95, -1, 83, 23, 68, 47, 40, -3, -40, 80, -45, 11, 10, 33, 12, 0, -33, -24, -43, 13, -4, 28, -14, -48, -39, -70, -20, -10, 10, 18, -13, -30, 59, 44, -8, +-2, -31, 15, 49, 29, 1, -1, -18, 3, -63, 39, 66, -36, -60, 81, -28, 127, 30, 16, -16, 26, -11, 9, 127, 53, 0, -67, 43, 38, 36, -1, 9, 44, -19, 7, -12, 26, 4, 26, 27, -7, 2, -20, 4, -5, -15, -20, -6, -22, -3, -3, -5, 11, 8, -11, 6, -21, 35, 3, 24, 9, 38, 10, -20, -21, 21, -18, -10, -10, 82, 10, 12, 60, 7, 29, -34, -5, 15, 14, -5, 78, +-35, 103, 76, -32, 9, 6, -18, -34, 65, -38, -56, 50, -12, 1, -33, 66, 18, -23, 12, 3, -7, -6, -3, 28, 2, 14, -4, -2, 5, 40, 7, 81, -11, 76, 32, 4, -12, -10, -35, 15, 28, -35, -27, 51, -7, 62, -10, 22, -22, -6, 7, -41, -14, -35, 67, -31, -3, 58, 5, -6, 91, -20, -31, 3, 3, -5, -28, -9, 45, -16, 36, -8, -17, 56, -19, -46, -45, 14, 1, 55, 21, +29, 6, 11, -20, -30, 43, 2, -9, 6, -34, -17, 45, 24, -53, 26, -7, -2, 15, 43, 7, -25, -18, 43, -3, 20, -36, 40, -5, 19, -36, -39, 8, 27, -55, -33, 18, -5, 14, -14, 41, -13, -15, 14, -62, -13, -65, -1, 33, 6, -25, 15, 50, 15, -8, -16, 46, 73, -11, -12, -3, 22, -20, -8, -15, 44, -15, 12, 60, 4, 78, 9, 15, -27, -5, 0, 48, -6, -34, -10, 20, 37, +-32, -29, 22, -19, -15, 12, -23, -14, -23, 63, -14, 16, -14, -31, -16, -13, -12, 66, -7, 4, 47, -2, 6, -1, -36, 44, -42, -40, 20, -17, -29, -6, -52, -18, 41, -29, 15, -11, -27, 30, -4, 8, 9, -8, -10, -31, 21, 101, 20, 36, -12, 13, -8, 28, 3, -32, -5, -20, 4, -59, -44, 31, 45, -50, -11, 30, -6, -35, -1, -16, 15, 4, -51, -23, 121, -42, 46, -49, 9, 16, -37, +28, -48, -30, 3, -26, 11, 10, 10, 13, -7, 4, 13, 70, -3, 24, -15, -36, 17, 10, -1, 48, 2, -18, 47, -6, -49, -5, -28, 29, -23, -2, 22, 50, 4, -11, 16, 20, 11, -2, 11, -33, -47, -27, 23, -3, 23, 1, -16, 127, 15, 18, 40, -25, 62, 2, 15, 0, -16, -2, 15, 30, 12, 33, 3, 25, -9, -5, 31, -26, 6, -23, 3, -24, -5, -8, -12, 9, 3, -6, 1, -9, +46, 3, 6, -6, 6, -5, 1, 3, -1, 14, -14, -2, -32, -43, -42, 9, -15, -24, 53, -24, -13, -24, 46, -5, 92, -46, -22, 48, 26, -50, -60, -33, 41, -11, -53, -24, 9, -23, 5, 59, 3, -21, 95, -30, -13, -26, -25, 9, -6, 12, 11, 25, 44, -14, -56, 35, -8, -32, 20, -4, -6, 1, 47, 23, 22, 0, 31, 16, 75, -50, -1, 8, -35, -6, 10, -8, -26, -12, 23, 21, 28, +-37, 33, 15, 54, -31, -10, -18, 101, -39, 21, 53, 34, -45, -9, -43, 2, -11, 20, 13, 2, -22, 0, -12, -15, 34, -19, 24, 57, 2, -21, 78, -5, -12, 9, -58, -39, -40, -12, 4, -59, 32, 31, -29, -46, -16, 76, -56, -91, -65, -36, -39, -83, 14, -27, -37, -19, -22, -12, -31, 13, -17, 6, -24, 7, 2, 12, -2, 3, -8, 3, 6, 34, 31, 8, 5, -3, -10, -17, -11, 2, 2, +-20, 17, -17, -18, -11, 25, 9, -19, 127, -67, 18, 2, 70, 61, -1, 38, -4, 7, -32, -16, -8, 7, 18, -20, -8, -30, -20, -4, 0, 39, -41, -22, -24, -23, -30, -44, 15, 1, -20, -11, -14, -6, 1, 2, -41, -16, -8, 64, -9, 27, 51, -23, -24, 5, -2, -2, -14, -30, -11, -18, -10, 22, 25, -3, 20, -13, -8, 54, 25, -3, -15, 6, -40, 1, -31, -2, -39, -4, 26, 22, 14, +43, -45, 33, -28, -39, -62, -22, -43, -13, -30, 49, 18, 44, -11, 17, 20, 49, -18, 21, -51, -15, -43, -20, 5, 5, 20, -12, 54, -37, -36, -24, -11, 10, -16, 60, 102, -28, -21, -7, -10, 0, -26, 38, 52, 40, 23, 36, 11, 13, -14, -7, -10, -10, 12, 9, -54, -19, -6, -15, -1, 58, 26, 43, 55, -5, 13, -9, 58, 0, -3, -12, 14, 15, 26, -18, -12, -3, -11, -12, -25, -34, +-44, 7, 91, -17, -5, 79, -17, 0, -48, 1, 37, -2, -42, -29, -8, -37, 4, -50, 0, -7, -21, 49, 0, 26, -13, 0, 30, 48, -39, 51, 78, 34, -12, -27, 22, -10, 64, -35, -6, -18, -6, 7, 69, 8, -21, -14, -27, 7, -32, 21, -25, -14, 20, -21, -23, 15, -41, -29, 7, -12, 30, 11, -34, 5, 3, 26, -15, -28, -41, -12, 56, 21, 2, 14, -11, -40, -30, 52, 69, -43, -18, +71, 60, 91, -44, -40, -51, -17, 87, 26, 96, 65, -70, 29, 99, -6, 6, 31, 40, -24, -17, 5, -13, 99, 15, -8, -14, 52, -17, 13, -6, 5, 7, 54, 1, 78, 1, -31, -10, 24, 3, -10, 34, 35, 7, -27, 0, 5, -38, -22, 14, 30, -12, -14, 43, 43, 1, -5, 25, -6, 25, 7, -11, -1, -16, 44, -43, 0, -4, -35, -15, -24, 41, -24, 30, 62, 2, 48, -10, 96, -24, -9, +1, 28, -16, 1, -9, -1, 11, 4, -17, 29, 15, -13, 7, -6, -10, -6, -8, -18, 49, -8, -41, -17, -9, -22, -45, 15, 37, 23, -6, -16, -16, 19, 4, 2, -19, 26, -16, 10, -12, 6, -81, 5, -21, 22, -24, -28, 63, 47, 31, 35, -1, 30, -23, 4, 51, -6, -41, -33, -8, 43, 29, -19, 7, 6, 13, 3, -3, 4, -12, -68, -32, 12, 2, -21, -27, -35, -1, 12, 43, 27, -16, +2, 1, 54, -14, -3, 13, 40, 7, 48, -15, 39, 101, -74, 9, -31, -29, 12, -9, -40, 0, -13, 13, 59, 20, -14, -14, 90, -11, 10, -68, 11, -31, -10, -11, 42, -21, 26, -2, 13, -46, 6, -2, -69, 93, 36, 18, 15, -4, 20, -31, -3, -39, -2, 0, 49, 24, -32, 31, -61, -66, 17, -10, 16, -49, -26, 4, -7, 16, 37, 20, -6, 31, -19, -26, 32, -5, 12, -116, 118, -54, -5, +-70, -71, -4, -21, -10, -15, -8, 9, 5, 2, 7, 30, 80, 0, 16, -6, -4, 4, -16, -6, 3, 40, -6, 21, 4, 43, -1, -23, 1, 1, -22, 0, -20, 17, -8, -10, 46, -23, -34, -63, -7, 17, -8, 41, 2, 29, -14, -13, 3, 30, -42, 57, -34, -7, 27, -31, 23, 71, 16, 19, -2, -19, -29, -18, 31, 29, 15, -4, 38, 52, -13, -55, -10, -29, -32, -4, -17, -45, -45, -27, 23, +-22, -8, 20, 20, -4, -57, 22, 78, 24, 36, 19, -14, 51, 11, 24, 61, -23, -4, 17, -14, -36, -72, -59, -26, 26, -20, -26, 28, -71, -17, 17, -15, 5, -71, -14, -37, -5, -37, -25, 40, 15, 66, 25, -69, 30, -22, -5, 122, 12, 3, 61, 1, -64, 43, 38, 4, -35, -2, -14, -4, 67, 7, 45, -33, -25, 19, 15, 19, 9, -6, 51, 54, 75, 27, -50, 5, 15, 31, 48, 70, 48, +4, -15, 19, -16, 20, -16, -15, 19, 54, -55, -16, -51, 9, -25, -5, -33, -40, 23, -48, -16, 9, -26, 53, -31, -23, -25, -14, 11, 31, -13, 4, 28, -22, 57, -99, -11, 26, -26, -18, 4, 63, -38, 20, -4, -42, 32, 6, 27, -32, -60, 89, -39, 15, -9, 15, -52, -49, 9, 19, 18, 74, 23, 15, 11, -62, -34, 7, 29, 5, -22, 6, -18, -20, -53, -23, -22, -23, 17, -19, 10, -35, +-2, -4, -15, 15, -9, 12, -19, -8, -22, -17, 31, 4, -24, -23, 6, -25, 2, 27, -11, -41, -50, 3, 54, -16, 27, 27, -35, -19, -3, 43, 3, -47, 20, 4, -11, 9, 24, -37, 9, 45, -16, -28, 5, 20, 75, 24, -28, -10, 5, -22, 10, 127, -5, 5, -2, -1, -4, 22, -1, 13, 43, 25, 25, 17, -22, 0, 8, -40, 23, -7, -20, -7, -31, -33, 12, -7, -16, -2, -12, -42, 40, +3, -11, -5, 22, 41, -15, 12, -23, 7, -14, -15, 8, 17, -30, -13, -6, 7, -21, -29, 3, -7, -34, -56, -7, 24, -4, 29, 62, -15, 10, -23, 29, 41, -24, -36, 88, -26, -42, 46, -32, 15, -18, -8, -4, -4, -30, -19, -31, 42, -41, 4, -3, -35, -52, 78, -55, -5, 32, 20, 8, 3, -4, 11, -16, -16, -32, -37, 41, -14, -35, 20, -41, 80, -29, -5, -7, -38, -1, -9, -8, 96, +-13, -17, -16, -49, 16, -14, 2, -10, 71, 9, 54, -9, 9, -15, -7, -3, -23, 3, 16, 32, 11, 39, -65, -15, 1, 123, 20, 15, -12, -41, -55, -52, 18, 27, -53, -2, -32, -6, -50, -3, -2, 46, 4, -19, 42, -32, 7, -48, -27, 40, -49, 41, -5, 3, -70, -14, -18, 9, 21, -32, 18, -2, -15, -36, -2, 5, -24, 7, 19, -25, 22, 36, 30, -13, -54, 17, -31, -55, -47, 24, -39, +49, -3, 0, 16, 22, -25, 34, 1, 34, -5, 8, 13, -31, -49, 0, -27, -36, -14, 23, -3, 11, -16, 5, -35, 22, -55, -13, 25, -46, 62, 2, -16, 38, 48, -10, 2, -16, 7, -37, 9, -12, -7, -20, -18, -13, 22, -10, -4, -25, 7, -40, -7, 18, -19, 42, 44, 47, 33, -1, -19, 0, 22, 8, -25, -25, -42, 6, 74, -36, -42, -8, -20, -15, -12, -16, -21, 17, 115, -2, 17, 25, +-17, 8, 61, -19, 29, -2, 6, 4, 26, -35, -30, -21, 30, -7, -24, -8, 19, 81, -22, -20, -24, 2, -26, 127, 13, -17, -37, -24, -1, 10, -11, 49, -9, -37, -50, 13, 3, -27, 8, 44, -12, 10, 19, 19, -32, -52, -27, -84, 51, -30, -8, -30, -25, -32, -35, 54, 105, 76, 28, -5, -34, 27, 34, -15, 68, -22, -19, -19, 8, -40, -31, 49, -21, 30, 95, 0, 22, -27, 12, 5, 52, +-25, -42, -36, -55, -16, -23, -22, 7, -2, -17, 15, -37, 26, 57, -23, -15, 18, -1, -6, -3, -47, -19, 58, -16, -30, -4, -25, 7, -13, -30, -8, -3, -35, -24, -1, -24, -17, 14, 14, -15, -44, -9, 2, 4, 15, -24, 15, 2, 4, 10, 70, 8, -33, -9, -7, 7, -22, -10, 12, -31, 68, -4, 25, -42, 33, -59, -24, 21, 37, 14, 36, -38, 28, 14, 67, 13, -57, -23, 25, -9, -53, +9, 23, 36, -33, -52, -39, 38, 12, 42, -1, 1, 46, -21, -1, 3, 13, -23, 42, 46, 15, 37, -26, -25, -24, 15, 23, -30, -26, -20, 10, -20, -4, 1, 44, 15, 31, -42, -9, -15, 36, -20, 8, 58, -24, -6, -40, 22, -36, -8, -67, 48, -13, -43, 8, 18, -21, -39, -26, 30, -20, 0, -12, -7, 31, 10, 4, 16, 127, -33, 52, 31, -18, 37, -29, 60, -22, -8, 8, -25, -9, -25, +-12, -12, -25, -6, 26, -25, 8, -32, 2, 8, -17, -20, 4, -8, 20, -42, 10, 32, 8, -21, 46, 22, 18, -19, 4, 25, 75, -27, -42, -14, -40, -31, 28, 10, -28, 28, 11, -28, -37, -20, 58, -15, -12, -36, 29, -13, 29, -16, -28, -10, 4, -20, -9, -37, 127, -6, 14, -20, -18, -8, 38, 13, 61, -8, -31, -22, -32, -8, 0, -25, -11, 0, 14, 127, -9, 34, -14, -24, 69, -23, 45, +20, 9, 9, 11, -5, 55, 12, 56, 39, -13, -14, 11, 81, 13, 40, -22, -45, 1, 10, -24, -21, -15, 5, -31, 85, -47, 55, 24, -35, 88, 17, 0, 2, 13, -22, 9, 17, 49, -17, -10, 41, 4, 29, -52, 28, 42, -8, 67, 5, 35, 37, 49, -7, -34, 5, -11, 20, -12, 10, -1, -12, -31, 5, 127, 1, -12, -30, -1, 14, -18, -23, -6, 13, 42, 33, -25, -16, -3, -4, 39, 11, +-42, -59, -46, -4, 13, 7, -3, -9, 1, 9, 33, -5, -43, 22, -69, 39, 22, -23, -64, 28, 5, 23, -23, 8, -7, -19, 0, -35, -25, -25, -44, -1, -15, 12, 34, -26, 41, -51, -19, 15, -4, -21, -47, 16, 12, 19, -32, 27, 0, -51, 12, 5, -21, -12, -5, -11, -37, -19, -6, 17, 53, -25, -17, 8, 2, -32, 15, 44, -20, 2, -3, -53, -32, -1, -11, -1, 30, -16, 4, -9, 2, +36, -20, -28, 41, -14, -37, 28, 37, 89, 26, -22, -26, 21, 19, -7, 19, 65, 94, 3, 20, -8, -25, 19, -19, -7, -28, -33, -16, 30, 16, -34, 21, 31, -13, -11, 37, 4, 4, 27, -29, -66, -37, -10, 40, -19, -50, 12, 19, -32, -15, -21, -6, 9, 0, -38, 14, -11, -24, 2, 34, -25, -16, -45, -31, 18, -52, -16, 21, 22, -26, 55, 15, -24, -37, 15, 69, -30, 82, 15, 39, -7, +-7, -53, 48, 13, 23, -35, -2, 59, -30, 14, -29, -9, 8, -35, 13, -17, -40, -28, -20, -68, 15, -63, -24, 69, -5, -21, -35, 24, -12, 23, 2, -7, 127, -10, -28, 2, 57, -23, -6, 8, 49, -17, 8, -20, -27, -11, 59, 21, -19, -32, 16, 4, -31, -25, 36, 21, 4, -7, -8, -36, -12, -27, 22, 96, -16, 24, 10, 21, -12, -7, 39, -4, -19, 16, -10, -13, 12, 9, -17, -17, -15, +102, -22, 5, 13, -32, -42, 4, 0, 50, -94, -61, 3, -9, 18, 102, -45, -52, 96, -13, 49, -32, 2, 4, 3, -9, 32, -20, 53, -28, 30, -38, 6, -50, -16, -17, 96, 42, -43, 43, -13, 50, 1, -29, -10, 18, 5, -26, 10, -16, -1, 5, -30, -45, 13, 15, -8, -8, -25, -8, -9, -6, -31, 2, -14, -15, -25, -25, 59, 37, -7, 16, 14, -16, -27, -16, -22, 13, 38, -26, -7, -40, +48, -31, -8, -8, -8, -6, -19, 3, -25, -38, -50, -40, -18, -49, -10, 44, 21, 11, 20, 55, 0, -57, 0, 29, -14, 3, 61, 2, -5, -39, -2, 34, -5, -23, -22, -11, 4, -16, -21, -13, 6, -3, 53, -27, 9, -25, -12, 19, -12, 5, -32, 12, 19, -6, -23, -14, -6, -13, -32, 58, -49, 20, 1, 5, -72, -27, 12, 53, 4, -29, -39, 17, -6, 62, 18, 59, 52, -2, -31, -7, -33, +-16, -14, 28, 7, -23, -12, -19, 5, 32, -31, 80, -19, 8, -33, 82, -32, -26, -35, 14, 9, 3, -11, -2, 3, -12, -6, -18, 9, -49, 85, -12, 76, -2, -18, 1, -23, 10, -16, 25, 55, -8, -36, 45, -50, -24, 21, 127, -6, -13, -22, 3, -10, -6, -24, 28, -1, 13, -30, 14, 5, 37, 121, 3, -17, -15, 6, 91, -14, -31, -62, 16, 60, 15, 20, 20, -29, 17, -8, 8, 68, -5, +-13, 20, -1, -19, 5, 17, 59, 10, 41, 25, 10, 9, -28, -3, 5, 39, 4, -29, 32, 62, 33, 12, -9, -14, 51, -4, -10, 16, 17, 15, 24, -22, -62, -29, -13, 51, 62, 26, 21, -30, 52, -30, -20, 24, -7, 14, 33, -23, -51, -17, 90, -1, -19, 12, -10, -48, 31, -51, 45, -45, 1, 45, 12, 2, 89, 4, -4, -10, 11, -32, 38, -20, 22, -15, 23, 31, 3, -15, -12, -5, 32, +10, -12, -9, -12, 41, -7, 33, 3, -7, 29, 35, 25, 12, -3, -5, 9, 1, -5, 59, 1, -21, -10, -5, 70, -17, -33, -37, -29, -30, 38, -30, 9, -28, 56, -21, 33, -11, -21, 9, -13, 17, 34, 56, -4, -13, -11, -26, -19, 31, 20, 29, -6, -10, -33, -3, -17, -22, 12, -44, -60, -3, -26, -18, 3, 6, -1, 1, -28, -31, 5, 26, -34, -28, -10, -16, -43, -2, -34, -30, 40, 10, +-2, 12, -17, 9, 73, 6, -26, -11, -76, -9, -12, -9, 18, -29, 11, -71, -10, 0, -33, -63, 47, 7, -75, -67, -29, 20, -1, -38, 10, -56, -58, 28, 67, -28, 35, -45, -31, 36, 17, -9, -61, -54, -17, 31, -72, 12, 26, -68, -38, -29, 40, 1, 16, 30, 19, 83, -22, 13, 45, -42, -9, -9, -19, 13, 4, -33, -16, -9, 46, 2, -17, -12, -46, 28, -63, 13, -38, 9, -24, -1, 28, +-48, 0, -22, -54, -11, -43, 7, 69, 11, 23, -54, -15, 42, -4, -25, -6, -15, -30, -31, -15, 2, 27, -3, 22, 0, 20, -42, -63, -29, -27, -39, 1, 108, -63, -58, -18, -41, -69, 28, 13, -8, 29, 83, -28, -15, 101, 56, -12, -20, 3, 17, -127, 12, -72, -63, 13, -22, -7, -18, -103, -10, -13, -64, -3, 114, 31, -35, 23, -25, -3, -13, -18, -16, 26, -9, 16, -4, -14, 61, -29, 6, +-29, -15, -39, 16, -19, -53, 50, -31, -3, 6, -21, -3, -27, -7, -14, 15, -44, -24, 79, 14, -33, -35, -12, -2, -32, 28, 1, -10, -20, 3, -43, -10, 12, 52, -51, -24, 32, 31, -12, -15, -31, -41, -46, 10, 23, -6, 15, -48, -5, -34, -5, 0, -11, -13, -18, -12, -15, -27, 12, 2, 3, -2, 25, 19, -26, -10, -45, 0, 23, 41, -7, 4, -8, -6, -2, -45, 18, -43, -4, -53, -24, +-10, 1, -40, -12, -16, 25, 33, 8, 1, 28, 12, 38, -13, -46, -10, -20, 40, 100, 9, 7, 6, -9, 32, -17, -24, -33, -4, -3, 6, -18, -13, 14, -16, 26, -15, -31, -6, -1, -21, 47, -11, 12, -12, -49, -7, -26, -18, 33, -16, 28, -19, 15, -39, -35, -36, 65, -32, 5, 21, 0, 12, -1, -35, -26, -28, -20, 68, -38, -28, -37, -33, -12, -32, 56, -36, -13, -21, -53, 49, -8, -13, +-22, 13, 15, -35, -21, 14, 4, -12, 4, -6, 23, 35, -36, -29, -9, 27, -14, -35, -51, -13, 19, -27, 9, -18, -4, 39, -1, 1, -10, -17, -19, -23, -41, 30, 0, 14, 22, -36, 28, -41, -27, 33, -19, 78, -22, -9, -36, -26, -27, -10, -1, 18, 45, -20, 42, -54, -14, 9, -8, -38, 13, -38, 17, 5, 89, 12, -23, 51, -14, 5, -31, -18, 62, 0, 1, 6, 31, 18, -13, 79, 3, +-19, -36, -22, -39, 5, -18, 4, 16, -5, -8, 29, 34, -5, 6, -1, 82, -37, -10, -6, 63, 66, -28, 3, 37, -35, 8, -8, 18, -11, -27, 19, -18, 34, -17, 35, -31, 19, 20, -23, -14, -20, -23, 10, -24, 60, 10, -31, -33, 1, -3, 8, 80, -10, 12, -44, -7, -5, 15, 29, -28, 0, -24, 5, -11, -13, 15, -14, -4, 6, 75, 6, 3, -28, -47, 17, 2, 16, -58, 11, -58, -12, +18, -9, -8, 22, 37, 23, 20, -41, 15, 10, 11, -26, -4, 4, -28, -3, 59, -46, -18, -19, 35, 14, -51, 37, -8, 7, 1, -13, -6, 44, 17, -1, 65, -29, 88, -27, -14, -21, -31, 43, -20, 2, -80, 90, 44, 52, 9, -91, 27, -24, -9, 2, -6, 10, 10, -48, 30, -64, -38, -22, -11, -29, -49, 36, 58, 74, 32, 5, -8, 5, -61, 51, -45, 22, -9, 16, 55, 110, -11, 40, 23, +11, -59, -15, -49, -12, 43, -11, -15, 6, 3, -26, 4, -5, -26, -59, -20, -81, 68, -19, -6, -57, -24, 46, 14, 17, -1, 1, -11, 22, 23, 25, 64, 31, 54, -10, 79, -21, -25, 54, -33, 19, 20, -10, 127, -20, 22, 20, -11, 59, -1, -5, 13, -40, 28, 13, 0, -35, 28, 5, 54, 92, 31, -26, -13, 7, -31, -15, -15, -11, -12, 102, 24, 99, 19, 45, 28, -26, -7, 97, 2, 48, +51, 55, 94, -60, -21, 67, 52, -20, -26, -22, 51, -14, 26, 19, -33, -19, -17, -25, 32, 14, -10, 94, 21, 3, -26, 3, -34, -25, 21, 127, 10, -3, -12, -57, 42, 34, 12, 10, 14, -9, -7, -9, 11, -7, -18, 26, 86, -38, -8, -13, -10, 81, -14, 5, -18, -34, 15, -6, -29, -11, 8, -12, -17, -17, -30, -24, -33, 41, -14, -14, -12, 1, -3, 2, -6, 38, 17, 29, -26, -7, -11, +9, -5, -13, -16, 53, -18, -15, -15, 8, -13, -11, -21, -13, 17, 43, 63, 117, -38, -4, 16, -13, 29, 7, -43, -26, -2, -25, -43, 34, -20, 38, 31, -57, 31, 10, 13, 31, -20, 29, 11, 87, 3, -23, 31, -21, 13, -3, -19, -37, -28, 13, 67, 47, 0, -48, -16, -29, 6, 36, 10, 37, -31, -17, -2, -13, -10, 0, -19, 8, 15, -43, 0, -9, -35, 11, -5, -1, 4, 8, 5, 8, +-28, -38, 62, 9, 6, -29, 5, -64, -19, -32, 7, -15, -21, -11, -40, -37, -16, 51, 11, -25, -38, 46, -1, -35, 5, -30, 4, 10, -8, 34, -33, -16, 29, 19, 81, -7, 89, -1, 15, -22, -29, -27, -12, 21, -38, -15, 1, -38, 25, 2, -20, 16, 18, -38, 24, -30, 29, -33, -32, -39, -35, 16, 60, -6, -2, -27, -9, -2, -9, -16, 54, -52, 40, -14, -45, 40, -28, 117, -31, -27, -2, +32, -7, 44, 42, 21, 42, 26, -19, 51, -14, 1, 32, 45, -17, -22, -23, 3, -9, 100, -47, -22, -1, -2, -37, -14, -16, -42, -58, 26, -31, -12, -18, -7, -38, 21, 84, 3, 0, 27, 34, -11, 43, 45, -40, 14, 38, 127, -34, -6, -27, 12, -6, -18, -36, 8, -8, -4, -15, 11, 39, -6, -9, 30, -18, -29, -4, 32, -14, 23, 0, 52, -16, -29, -6, -1, -24, -41, -10, 27, 20, 15, +-33, -40, -8, 6, -15, 3, -30, -46, -5, 5, -21, -20, -46, -20, 34, -13, 30, -36, -26, -22, 69, 5, -5, -19, 0, -9, -16, 11, -2, -33, 9, -28, 60, 19, -34, 75, -53, -46, -24, -41, -28, 22, 11, -28, -42, -28, -18, -35, -5, 13, 26, -5, 69, -24, -13, -37, 79, -46, -11, 9, -19, 1, 11, -13, 3, -32, 59, -11, 46, -4, 63, -35, -32, 4, 73, 69, -59, -22, -55, -29, 53, +24, -23, -4, -9, -14, -40, 9, 36, -23, 37, 7, -18, 8, -87, -65, 27, -4, 5, -27, 33, -7, 44, -6, 3, -19, 34, -54, 8, -30, -17, 42, -19, -27, -12, -17, -26, -6, -29, -27, 18, -20, 12, 41, 2, 0, -64, -12, 116, 8, 48, 13, -9, 27, -19, 12, 13, 53, -38, -56, -27, 13, -15, -55, -48, -11, 8, 76, 22, 73, -24, 0, 36, -42, 50, 32, 6, -31, 8, -26, -27, 20, +19, 11, 1, 3, 53, -37, 60, 18, 24, 17, -67, 43, -31, 112, -44, 43, 32, -115, 9, -5, -43, 1, -14, 115, 16, 107, -41, 22, 6, 58, -22, 20, 7, 3, 42, -13, 2, 26, 11, -18, 18, 32, -15, -6, -26, 29, -38, 79, -13, 2, 24, 45, -14, 35, 23, 12, -18, -19, -28, -12, -22, 36, 15, 77, -10, -57, -9, -9, -24, 22, -52, 1, -24, 23, 6, -25, -5, 22, 5, -3, -12, +-23, 35, -4, 46, -15, -40, -7, 59, -28, -25, -13, -21, -8, 31, -6, 15, 38, 17, 13, 34, -18, -7, 38, -20, 41, 28, -37, 12, 16, -33, -11, 8, -4, -5, -2, 39, -29, -10, 39, 7, 31, -9, -10, 2, 17, 32, 50, -20, 4, -16, -13, -7, -19, -35, 0, -36, -14, -12, 16, -29, 56, -32, -12, -12, 33, -19, -13, 0, -17, -39, -20, 115, -10, -11, 21, 50, 43, 30, 23, 29, 25, +-32, -30, 6, -20, -27, -11, -7, 24, 4, 37, -7, -40, -46, 59, 8, -4, -29, 7, -23, 10, -55, -7, -17, 8, -2, -26, -32, 6, 23, 2, -9, -1, -44, -29, 20, -32, -28, -21, -8, -20, -7, 28, -9, -10, -6, 61, 39, -29, 17, 8, -25, -38, -44, 40, 12, 17, -1, -24, -29, 19, 38, -5, -25, -31, 42, -15, -7, 12, 14, 6, -47, 17, 20, 89, -2, 7, 3, 4, 26, 51, 31, +-4, 1, -30, -13, -62, -46, -18, 23, -61, 34, -17, -31, 77, -23, -1, -21, 3, -6, -25, 4, 5, -18, -21, 40, 127, -12, 1, 4, -17, 56, 75, -21, 68, -46, -16, 8, 96, 35, 30, 30, 11, 1, 8, -23, -16, -23, -8, 4, -26, 53, -3, -29, 27, 11, 72, 12, -35, 13, 16, 39, -13, 38, -45, -9, 24, -13, -31, 5, -19, 24, 17, -1, 35, -15, 11, -9, 80, -14, -30, -9, -27, +25, 0, -5, -11, -10, -9, -10, -19, 47, -5, -33, 28, 27, -6, 28, -8, -5, 4, 4, -17, -4, -6, 3, -10, -28, -30, -14, -25, -36, -10, 10, -28, 6, -9, -7, -14, 55, 26, -18, 0, -34, -49, 55, -17, -26, -30, -29, -9, -24, -53, -23, 60, -17, 18, -10, -49, 35, -8, 6, -35, 59, -73, -28, 47, -22, -28, 44, 12, 53, 71, 55, 49, 7, 9, -1, -32, 91, 23, 29, -1, -71, +-10, 33, 12, 19, -19, 41, 32, 34, -6, -5, -12, 81, 45, 43, 57, -10, -47, 28, 29, 11, 36, -8, -9, -47, 16, 96, 26, 78, -67, 32, -47, 33, 15, 32, 3, 26, 71, 76, 49, -9, 8, 127, 0, 46, 24, 15, -12, 7, -21, -39, 25, -7, -20, -27, 10, -16, 52, -14, 10, -35, 21, 22, -15, -4, 30, 25, 35, -21, 24, -49, -47, 77, 14, 81, 32, -15, -26, -21, 4, -39, -3, +13, -12, 53, 23, -13, -20, -30, 39, 7, -14, 19, -21, -46, 1, 21, -31, -28, 0, -41, -10, -8, -1, -11, 37, -27, 22, -18, -14, 69, 2, -42, 18, 11, -45, -14, 27, -5, -69, 113, -20, -42, 19, 10, 107, 9, 3, -54, -32, 40, -16, 44, -10, -61, 0, 56, 64, -11, 27, -22, -1, 51, 10, -13, -3, -44, -9, -2, 33, -15, -1, 7, 6, -3, 40, -23, 37, 116, 13, 0, -13, 38, +4, -50, -3, 10, 2, 8, 64, 8, -42, -29, -17, -18, 24, -39, -36, 32, -31, 118, 25, 10, -47, 6, 41, 1, 46, -42, 14, 9, 4, 24, 17, 12, 2, -20, -44, 62, 54, -15, 25, -43, 34, -24, 11, 49, 5, 29, 43, -17, -27, -5, 49, 7, -37, -6, -18, -12, -15, 3, 101, 5, -22, 51, 1, -14, -48, -13, 6, 43, -44, -41, -7, -8, 32, -35, 8, 24, 38, -19, 8, -25, -12, +5, -30, -18, 35, -4, 48, -9, -60, -26, 30, -14, -24, 38, -24, -7, -2, -31, 36, -27, -24, -3, -18, -25, 65, 19, -27, 16, 10, -18, -16, 25, 15, -19, 25, 0, 10, -34, 6, -31, -54, 6, 14, -48, -36, -17, 28, 4, 32, 61, -25, -24, -33, -21, -4, 18, 11, 45, -30, -17, -15, 5, -55, -9, -32, -26, 43, -10, 47, -22, 10, -24, -47, 31, -27, -15, 5, -20, 42, -28, 16, -8, +-9, -61, -22, 26, -53, 39, -22, 33, -16, -19, 20, -13, 26, -40, 102, 2, 13, -28, 30, -2, -9, 7, -18, 34, 7, -32, -24, -14, -23, -11, 0, -22, 15, 64, -26, -14, -11, 3, 31, -5, 17, 25, -48, -34, -2, -13, 78, 11, 13, 7, -36, -70, 4, 15, -38, 25, 46, -10, -12, 10, -20, 52, 9, -29, -30, -4, -35, -52, 35, -12, 40, -17, 9, 1, -44, -20, -15, 20, 34, -24, 36, +5, 20, -26, -1, 19, 14, -1, 45, -8, 91, 101, -13, -41, 2, -10, -46, -2, -42, -7, 43, -18, 45, -39, -14, 54, 8, -27, -12, 9, -42, 30, 28, -18, -11, -42, -21, 2, -31, -20, -2, -4, 3, 8, -9, 34, 28, -39, -17, 1, -20, -19, 26, 67, -9, 127, 17, 19, -22, 127, -9, -11, -4, 10, 20, -55, -56, 72, 25, -17, -33, -2, -16, 3, 1, -6, -3, -28, 89, -4, -9, -8, +0, -16, 29, 37, -1, -8, -62, 7, 17, -24, -8, -30, 38, 6, -27, 22, -43, 54, -7, 80, 48, -54, -29, -33, 7, 42, -64, -6, -9, -26, -41, 39, 24, -40, -4, 35, -12, 41, -14, 87, -76, 15, -39, 54, 2, -39, -26, -50, -36, 8, 4, -42, -42, -1, 48, 5, 9, -19, -73, 76, 91, -37, -50, -67, 30, -11, 119, 5, -14, -1, 61, -51, -1, 17, -1, 13, -13, 39, 26, 7, -47, +-7, -15, 19, -20, 28, 38, -5, 43, -8, -58, -9, -25, 15, -9, -34, 14, 8, 7, 11, 16, -30, 16, -2, 12, -18, -6, 58, 2, -44, 25, -13, 47, -11, 13, -25, -22, -3, 22, 11, -27, 14, 6, -18, -23, 21, -1, 2, 76, -7, 6, -41, 40, -17, 48, -59, -36, -89, 17, -16, -18, 41, 21, -14, 47, -31, -51, 110, -22, -77, -65, -75, 30, 28, 40, -24, 91, -51, -17, -50, -11, 17, +-22, -39, -52, -32, -13, -4, 4, -10, 20, -10, -17, -5, -19, -43, 37, -7, 42, 51, -3, -56, 42, -5, 5, -36, 22, 37, -16, -9, 15, -8, 12, 33, 29, -30, -32, 9, -28, 15, 3, 7, 47, 2, 43, 42, 31, 8, -29, 73, -39, -10, 9, 20, -25, 15, -4, -25, -48, 0, -1, -13, -31, 21, 14, 69, -22, -32, 61, -22, 11, 35, -20, -4, 6, -27, 26, -3, 5, 69, -17, 29, -2, +-19, 8, -15, 42, 0, 32, 25, 23, 45, 24, -6, -36, -31, 52, -2, -12, -42, 13, -38, -21, -18, -12, 6, 8, 64, -2, -24, 0, -9, 23, -18, -22, -29, 64, -30, -9, 15, 7, 48, -1, -21, -17, 18, -76, -19, -10, -40, -35, 17, 39, -17, -3, -38, -14, 3, 9, 0, -28, -24, 38, 2, 43, 0, -27, -26, -9, -29, 8, 5, -19, -55, -12, -22, 38, 19, -14, 8, -15, -21, -8, 7, +-10, -19, 26, -39, -33, -11, 63, 73, -41, 4, 5, -23, 32, 19, -52, 0, -7, 13, -19, -55, -26, -28, -30, -50, -8, 30, 13, 21, 59, -7, 2, 1, -19, 0, -27, -50, -15, -55, -14, 39, -3, -39, 54, -21, -50, -11, -18, -3, 15, -68, 18, 61, 25, 17, -5, -46, -14, 93, 55, 28, 11, -1, -9, -54, -19, 4, 68, 0, 45, -16, -13, 9, 20, 71, 40, 7, 17, -6, -7, -33, 61, +-55, -5, -22, 19, -20, -64, 28, 38, 36, -49, -32, 69, 17, 12, 15, 11, -49, -7, -7, -20, -21, 39, -12, 53, -13, 17, 7, -16, -8, -50, -10, -7, -17, 38, -26, -18, -13, -9, -45, 21, 35, -25, -36, -4, 4, -20, -37, 17, -13, -48, 78, -15, 8, 9, -8, 27, 4, -17, -13, 9, 32, -10, 0, -8, -17, -27, -10, 9, 20, -27, -6, 19, -5, -18, -17, 1, 46, -20, 26, -17, -5, +60, -17, 12, 36, -2, 31, 22, 50, 1, 56, -52, 8, 81, -1, -23, 16, 3, -49, -43, -9, -6, 6, -35, 13, -20, 16, -29, -5, -53, -14, -54, -33, -19, -23, -1, 25, 19, 5, -3, 39, -17, 10, 8, -8, 51, -24, -18, -28, -16, -7, -49, -5, -24, 29, -21, 9, -2, -7, 1, -8, 41, 0, -17, -14, 16, -58, -31, -2, -19, 63, 22, 37, -29, 35, -15, 23, 45, -26, -69, 44, -26, +-16, -8, 22, 16, 52, 73, -42, -80, 33, 2, 24, -93, -9, 23, 20, -19, -27, -7, 6, 14, 25, 11, -7, -10, 11, -12, 29, 23, -16, -8, 12, -17, 5, -5, 0, 16, 36, -21, -10, 6, -24, 11, -8, -29, 29, 7, -25, -9, -81, -63, -3, 2, 38, 22, -41, -5, -23, -20, 28, 4, 5, -27, 76, -1, -50, 16, -16, 18, 96, -49, 13, -41, -37, 18, -15, -10, 9, -36, -49, 44, 11, +-3, -24, 20, -5, -41, -22, -14, -46, -9, -18, -5, 16, -8, -3, -11, 15, -11, 7, 18, -11, -38, -23, -4, 9, 18, 13, 8, 19, -26, -21, 6, 19, -39, -9, 22, 6, -18, -15, -14, -17, 2, 14, 3, 16, 8, 17, -13, -7, -3, -1, 25, -1, -12, -6, 21, 21, 17, 1, -10, 38, -11, -11, 14, -39, 2, -13, -16, 49, -29, -9, -19, -48, -9, 8, -11, 0, -4, 35, -32, 22, 2, +-9, 6, 11, -73, 23, 13, 20, 51, -17, -2, 22, 16, -20, -36, 11, 13, -24, 49, 9, -54, 5, 12, -14, -40, 56, 45, 3, -10, 31, -31, -20, -3, -2, 2, 20, -42, 26, 38, -24, -17, 2, -32, 4, 12, -29, 6, 44, -8, 3, 24, -13, -35, -8, -12, 14, 7, -18, 24, -10, -29, 5, -20, -24, -11, -3, -19, -12, -21, -5, -16, 16, 1, -19, -15, -21, -36, -17, -2, 33, -11, -4, +-33, 14, -26, -2, -20, -18, -8, 29, -6, -1, -18, -60, 12, 29, 25, 17, 66, -4, -47, -44, 0, 1, 1, 42, 14, -47, 2, 27, 1, -6, -13, -44, 89, 69, 41, -46, -11, 17, -52, -5, 41, 28, 32, -51, -10, -33, 27, -19, -14, -70, 6, -20, -40, 0, 1, -29, 36, -45, 20, -17, -78, -11, -14, -29, 44, -31, 34, -15, -30, -17, -33, 26, 56, -18, -36, -7, -13, 31, 52, -21, 11, +-22, -3, -14, -21, -4, -29, -18, -19, -12, 14, 2, -21, -50, 9, -8, 18, -2, 18, -24, 49, 17, -10, 6, 29, -43, 33, 68, 19, 20, -3, -26, 11, 64, -39, -35, 0, 35, 14, -7, -15, -25, 17, -1, 18, 1, -41, -1, -44, -9, -40, -3, -49, -20, -21, 32, 94, -24, -4, -62, 2, -2, 31, 10, 64, 19, -75, -67, 6, 68, 6, 14, 2, -55, -36, 43, -36, 63, 11, -7, -12, 22, +-42, 3, -38, -12, -35, -28, 30, 56, -35, -26, 20, 6, -24, -27, -40, 24, -13, -6, 5, 3, 21, -21, -28, 1, -3, -3, -2, -3, 9, 19, 8, -5, 31, -5, 43, 11, 28, -64, 11, 19, -19, -21, -27, 32, 8, 10, 16, 47, 2, 13, -18, 26, 23, 18, -25, -22, 22, -26, -41, 1, 14, -11, 6, 25, 11, 11, 22, -40, -23, -23, -8, 2, -7, -7, -28, 43, 8, 7, -15, -4, -1, +35, -22, 12, 34, -31, -19, -16, 40, -6, -7, 21, -12, -76, -43, 56, -24, -12, 28, -7, -23, 10, 3, -33, -42, 27, 0, -19, -17, 49, 2, -29, 18, -22, 105, 26, -43, -30, -1, -22, 75, -43, -49, 7, -12, -24, 8, 4, 31, -19, 23, -30, -22, 2, -3, 11, 22, 16, -10, -22, -18, 2, 19, 5, -28, 27, -4, -13, -31, -3, 8, -3, 49, -21, -14, 3, 17, -12, -21, -42, 56, -55, +11, -24, -50, -22, -28, -39, 0, -16, -14, 13, 6, 6, -12, -5, -66, -31, 39, 5, -18, 67, -9, -13, -23, 2, -16, 29, 0, -13, 16, -32, -17, 23, 23, -1, -7, 49, -46, -35, -5, -15, -15, -16, -13, -13, -17, -10, -21, -3, -8, 10, 23, -15, -14, 19, -8, 18, 1, -6, -36, -18, 24, -20, -22, -9, -16, -38, -6, 4, -40, -4, 9, 18, -7, 26, -3, 17, -10, 2, -30, 0, -2, +-13, -10, -6, -25, -28, 30, 20, -37, -22, -19, -32, 4, 28, 5, -30, -28, 8, -41, 26, 5, 4, -37, 7, -29, 28, -27, -4, 8, 31, -19, 106, -34, 1, -7, 32, -53, -3, 26, 26, -12, 42, -17, -8, 27, -20, 11, 10, 12, -30, -35, -6, -50, -9, -25, 7, -28, -5, -16, 26, 33, 31, -18, 43, 2, 24, -9, 2, -4, 15, 1, 5, -48, 25, -11, -2, -21, -4, 4, -10, 39, 5, +-20, 34, -17, -2, -5, 8, 19, -20, -7, 9, 15, 5, -15, 1, -22, 25, 6, -19, 12, -8, -11, 6, -22, 65, 38, -20, -34, 36, 25, -40, 41, 0, -4, 22, -13, -44, -1, -27, -26, -13, -8, -11, 16, -24, 9, 29, -6, -7, 34, -22, 40, -7, 20, -19, 34, -63, -54, -24, -10, -57, -12, -57, 45, -50, 49, -24, 22, -22, -36, 8, -54, -15, -59, 35, 16, 109, -22, -23, -54, 2, -10, +-51, -63, -52, -25, -4, 74, -14, 23, 5, 9, -3, 29, -42, -13, -18, -7, 32, 4, -25, 42, -24, 4, 16, -15, 2, -44, 21, -3, 16, -52, 18, -25, -29, -2, -17, -11, -5, 22, 15, -31, -27, -31, 3, -31, 0, -4, 32, 13, -3, 8, -3, -26, -50, 19, -18, -69, 17, 3, 24, 2, 35, 61, 127, -2, -23, -29, -38, -5, 27, 14, 17, 52, 33, -41, 34, 72, -11, 71, -11, 22, -3, +47, -15, 7, -33, -24, -1, -8, -9, 25, -4, -8, 30, 45, -7, 44, -34, 60, 17, -39, -37, 16, -7, -6, 7, 8, -4, -10, 87, 90, 13, -13, -14, 23, -21, 45, 22, 31, 17, 33, 43, 40, 66, -1, 2, 4, -16, -18, -23, -14, 48, -6, 10, 30, -25, 45, 6, 22, -11, -27, -17, -8, -10, -19, -79, -15, -59, 76, -29, 6, 6, -20, 32, -53, 51, 30, 55, 59, 3, -7, -30, -14, +8, -9, 59, 58, -4, 4, 0, 6, 22, 4, -26, -10, -10, 28, -3, -22, -20, 30, -16, -26, -4, -27, -7, -13, 46, -17, 8, 58, -13, -7, -10, -16, -22, -18, 29, 35, -46, 10, -27, 30, 20, -12, 93, 3, -32, 17, -62, -43, -20, -4, -16, -2, -30, 6, 47, 36, -12, 1, 9, -78, 1, -24, 8, 7, 32, 35, 47, 53, 5, 18, -16, -29, 11, -24, 4, -28, 17, 15, -5, -5, 7, +51, 48, -3, -53, -25, 18, -26, -31, -5, 16, 7, -23, 17, -23, 4, 16, -6, 42, 55, 18, 61, 38, -11, 44, -5, 57, -26, -13, -19, 23, -25, 30, 40, 123, -28, -39, -62, 6, -16, -17, -15, 44, 24, -40, -22, -18, -6, -22, -44, 43, 65, 8, -10, -21, -17, 12, -4, -12, 33, -2, -26, -16, -9, 16, 3, 0, 8, 38, -31, 18, 8, 15, -13, -1, -20, -20, -6, -24, -8, -30, 13, +107, 59, -11, -2, -7, -5, 31, -25, -34, -40, 4, -9, 7, -30, 35, 15, 0, -19, 5, -43, -2, -11, -27, 4, -6, -8, -26, 17, -11, -25, 15, 33, 127, 75, 14, 9, -13, -25, -13, -31, 2, 23, 10, -7, 30, -24, 31, 14, 56, 26, 50, -53, 4, -8, -14, -33, -11, -6, 1, -27, -42, 26, 16, -24, 127, 101, 4, 10, 1, -22, 22, -42, -10, -10, 43, 32, 10, -31, -6, 48, -51, +5, 40, -35, -8, -35, -17, -18, 19, -2, -27, 11, -44, -4, 83, -3, 108, 105, -9, 17, -19, -9, 55, -26, -5, 1, 6, -20, -22, 26, 5, 1, 14, -18, 21, 14, -23, -4, -20, -17, -12, -8, -14, -16, -2, -5, 2, 0, -15, 26, -19, 17, -4, -23, 16, -21, 4, -10, 26, -15, 23, 96, -14, -8, 3, -4, 9, 4, 13, -5, -13, -18, -25, -14, 29, 20, 10, 19, 14, -5, -2, -34, +-22, -2, -16, -7, -60, -28, 47, -2, -48, 1, 27, -27, -43, -49, -41, 34, -14, -12, 20, 17, 4, 54, 1, -29, -46, -32, 7, -44, -11, 3, 17, 5, 12, -21, -13, -9, -7, 26, 19, 6, -1, -4, 17, 9, -41, -3, -13, 104, -26, -10, 23, -35, -37, -16, 44, 5, 13, -20, -10, 0, -14, 7, 4, -20, -6, -15, -25, -29, 21, -34, 7, 8, 34, -53, -18, 34, 31, -24, -37, -16, 6, +41, -49, -44, -6, -13, -20, 16, -12, -1, -28, -1, -20, 9, -37, 31, 3, -41, -19, -37, -10, -21, 0, 9, 114, 3, 1, 127, 9, -9, -28, 8, 84, 29, 94, -11, -41, -21, -19, -36, 0, 34, -46, 26, 21, -32, -26, -35, 23, 0, -15, -25, 4, -16, 0, 30, 22, -1, -7, 112, 19, 43, -32, -24, -27, -34, -10, -9, 13, -8, -45, -10, -5, -21, -42, -22, 3, -23, 34, -5, -1, 52, +-5, -29, -21, -32, -38, 23, 7, -35, 50, 1, -3, -14, 35, 9, 35, 25, -1, -59, -23, -2, -55, -36, 0, -13, -11, 6, -39, 13, -29, -33, 14, -21, -6, -6, 8, -16, -1, 7, 2, -22, 4, 26, -4, -3, 18, -6, 12, 4, -3, -20, 43, -3, -39, 31, -2, -7, 0, 24, -28, -7, -14, -27, 54, 4, -13, 53, -3, 13, -11, 62, 71, -24, -12, -18, -13, 73, 3, -33, -27, -10, -17, +15, -64, -16, -4, 48, 73, -18, -17, -39, -3, 57, -23, -5, 29, 36, -24, -39, 16, -2, -6, -21, 7, -7, 9, -5, -3, -18, 7, 5, -12, 17, -14, 28, -48, 25, -24, -23, 14, 15, 3, -36, -5, 19, -21, 18, 4, 44, 6, -54, 3, -54, -24, 9, 16, 41, 60, -20, 4, -44, 9, 62, -21, 76, -19, 47, -19, 9, -53, -27, 91, 26, 28, -64, -34, -25, -45, 32, 12, 71, 21, -20, +19, 2, -8, -12, -15, 31, 3, 6, -2, 9, 10, 72, -30, 4, -25, 27, 49, -4, -33, -28, 28, 23, -4, -4, -2, -14, -23, 9, 18, 66, -9, -42, 23, 17, -6, -38, -17, 47, 41, 14, 34, 14, 17, 11, -24, 1, -5, 4, 53, -2, -27, -25, 26, 22, 24, -20, 7, -30, 8, 25, 24, 38, -20, 1, 30, 17, 22, 5, 40, -14, 1, -10, -1, 19, 28, 9, 4, -8, -21, 15, -27, +24, 64, -24, -7, -11, -24, -42, -40, -7, -29, -7, -31, 66, -13, -48, 41, 1, -41, 32, 7, 6, 19, 30, 43, 34, 29, 24, -2, -19, 8, 0, 18, -8, -20, -54, 4, -10, 1, -38, 12, -18, -28, -9, 2, 21, 4, -7, 11, -14, -24, -10, 0, -23, -20, -16, 15, 1, -25, -1, 44, -13, 28, 11, -28, -2, -37, 6, -5, -20, 4, 20, -19, -11, 7, -21, -14, 47, 2, -18, -8, 21, +-22, -12, -26, -25, -10, -31, 29, -2, -7, 14, -6, 25, 20, -46, 55, 0, -22, -4, 11, 36, 59, -10, -42, 9, 37, 23, 29, 28, -8, -39, 18, -7, -68, 3, -15, -14, -47, -15, -6, 47, -50, 16, -38, 48, 60, 85, -37, -40, 8, -3, 29, -7, 49, -3, -37, -53, 36, 7, 29, 32, 68, -24, 22, -6, -28, 1, 30, -41, -15, 0, -26, 33, -24, -6, -28, -10, 1, -24, -14, 50, 23, +19, -1, -40, -33, 15, -7, -13, 4, -23, -2, -23, -19, 31, 15, 35, -17, -13, -29, -19, -1, -39, 21, -18, 41, 9, 118, -29, -12, -6, -21, -25, 2, -41, -10, 45, -17, -11, -36, 12, -2, -31, -8, 44, -10, -44, 30, -21, -46, -37, 43, -21, 2, -45, 36, -1, -6, 17, 10, 39, -5, -15, 124, 26, -33, -14, 18, 19, -4, -39, -49, -23, 82, -23, -33, -8, -21, -7, -19, 17, -36, -25, +36, 42, 4, -26, 19, -19, -16, 32, 60, 16, 33, 16, -21, 4, -11, -35, -8, -35, -37, -33, -5, -8, 8, 37, 3, -14, 127, -39, 35, -49, -40, 42, 15, -17, 17, 12, 1, -26, 8, 124, 21, -11, -33, -33, -32, -15, -18, 36, 14, -11, 21, 12, -31, -45, -36, -5, -26, 15, 127, -18, 68, 16, -23, 18, 3, -15, -10, 12, 24, -7, -25, 82, -6, 6, 8, 7, -22, 21, -5, 28, -35, +11, 5, -29, 8, 10, 18, -1, 22, -5, 47, -7, -35, 88, 1, 2, -25, -33, -12, 119, 16, -27, 1, 52, 10, 10, -39, -73, -65, 37, -22, 32, 20, 28, -39, -39, -68, 88, 0, 41, -21, -3, 127, -12, 19, -15, -7, 13, 15, -10, -14, 8, 31, 7, 24, 18, 35, -3, 9, 8, -21, 9, 24, 33, -6, 42, -19, -3, 20, 14, 15, -15, -18, -55, 112, -36, 85, -20, -24, -6, 59, 4, +-11, 30, -16, -44, 18, 73, -25, -31, 3, 85, -34, 54, 16, -21, 12, 46, 4, 68, 4, 61, -10, 30, -18, -8, 21, -23, 127, -3, -29, -11, -9, -11, 3, 14, -11, 12, 60, 37, -38, 4, -11, -10, -8, 60, 30, 19, -10, 10, 46, -18, 8, -15, 22, -20, -22, -42, -15, -33, 41, -7, -30, 19, -9, 3, -6, 17, -9, 24, 99, 33, 10, -1, 0, -13, -9, 24, 17, 50, 10, 28, 13, +10, 5, -11, 25, -1, -6, -21, 109, -33, 102, 23, 29, 16, -8, -34, 25, -11, -8, -11, 23, 12, -10, -47, 9, 73, -19, 59, 18, 42, 11, 4, 4, -49, 36, 1, 5, -35, -8, -44, 127, -46, 66, -16, -34, 39, 13, -27, -19, -2, -32, -17, 15, 51, -3, 1, 22, 43, -17, 11, 0, 66, -14, 1, 14, 7, 0, 36, -15, 35, -22, 24, -15, 27, 17, -14, -3, -32, 31, 4, -14, 24, +-12, -22, 22, 24, -25, -9, 12, 7, 17, -19, -9, 51, -20, -25, -4, -8, -11, 22, -2, 3, -20, -1, 0, -13, -39, 23, -3, 30, 17, -18, -4, 70, -31, 31, -24, -2, -55, 0, -23, 1, -16, -16, -49, 56, 21, 7, -10, -23, 6, -25, -45, -9, 12, -15, -20, 38, -54, -10, -18, 0, -39, -11, -18, -4, -12, 68, -6, 71, 13, -23, -38, 68, -24, -2, 37, -47, -84, -1, -12, -32, 17, +20, 2, 1, 26, 43, -17, -5, 14, 15, 8, 4, 27, 10, -5, 12, 9, 72, 1, 44, -1, -33, 14, -13, -55, 9, 5, -4, -32, -24, -32, -23, -18, 31, -30, -21, 10, -17, -43, 39, -58, -12, -33, -18, -14, -44, -13, 40, 34, -16, -25, -1, -8, -7, 29, -26, 20, 36, -4, 59, 11, -26, -19, -25, 21, -3, 5, -31, -12, -3, -25, 18, 5, -39, -69, -7, -12, -45, 17, -8, -13, 41, +-7, -58, -28, -19, -9, -37, -22, -49, -37, 4, 27, -17, -23, -50, 11, -42, -19, -20, 43, -11, -18, -3, -26, -30, -4, -16, 18, -20, -23, 12, 69, -7, -1, 8, 1, -25, 35, 0, -26, -43, -41, 19, 11, -48, -7, -46, 28, -10, -24, -32, -7, -16, 26, 60, 6, 86, -20, -1, -45, -31, 9, -31, -17, -15, 19, -17, -7, -40, -39, -6, -46, 2, -37, 21, -51, 55, -6, 14, 35, -13, -2, +-19, 13, -17, 6, -29, -18, 43, -11, 25, -12, -26, 28, -7, -25, -1, -13, -3, -5, -3, -23, -4, -25, 0, 3, 42, -6, -15, 29, 1, -1, -14, -13, -3, 4, -21, -13, 4, -31, -28, -47, 13, 1, 127, 2, -7, -43, -12, 67, 49, -11, -36, 14, -32, 7, 36, 68, 102, -2, 89, 12, -24, 12, -5, -10, -2, 6, -22, -16, -14, 29, 9, 5, 5, 1, -11, 5, 5, -21, -56, 16, 5, +-22, 34, 10, 9, -28, -21, -9, -12, -16, -9, -7, 7, -19, -34, 34, 31, 17, -39, 26, -46, 38, 40, 20, -13, 9, 26, -30, -27, -40, -21, -38, 19, -76, 13, 34, -25, -12, -39, -28, 6, -53, 79, -25, 13, 27, 14, 88, 70, -1, 18, 20, 5, 28, -66, -3, 53, 0, -8, -21, 5, -26, -32, -29, 7, -9, 6, 2, 23, -6, -45, 2, -11, -22, 1, -18, 8, -7, -16, 5, -29, 14, +-27, 20, -11, -2, -20, -4, -1, 9, -11, -8, -7, -12, -2, -29, -13, -9, -28, 13, -2, -10, 15, -17, -14, -11, -11, -3, 1, -7, -18, 11, 2, -4, -10, 6, -43, 64, 23, 3, -1, 11, -23, -13, 11, -10, -36, 1, 4, -42, 49, 0, 7, 0, -21, -12, 6, -29, 13, -13, 10, -6, -11, 20, -18, 43, -34, 17, 7, 16, -30, 2, -3, 8, -46, -9, 7, -50, -59, -17, -30, -30, 10, +-3, 25, -36, 26, -12, 10, -20, -4, -5, 25, -5, -2, 26, 70, 42, -18, 20, 17, 4, 13, 19, -1, 127, 5, 12, -3, -7, -19, -15, -19, -10, 0, -4, -12, -9, -3, 44, -7, -12, -3, 14, 45, -1, 8, -4, -14, 10, -10, -9, 0, -32, -29, 21, -15, 127, 61, 18, 18, 27, -48, -20, 7, 5, -26, -10, 10, -28, -25, 75, 22, 9, -23, 67, 11, -10, -1, -14, -11, 21, 127, 82, +-10, 55, 17, 23, -52, -14, -41, -18, -20, 102, -9, -12, 4, 58, -51, 94, -15, -5, -41, 14, -7, 37, -16, -25, -85, 15, 42, -37, 52, -39, 46, 4, 14, -32, -11, -10, -16, 2, -10, -24, 32, -4, 1, -39, -12, 7, -23, -35, -28, -31, -21, 33, 16, 26, -27, 29, -32, 26, 0, -11, 26, -9, -30, 81, -2, 11, 56, -29, 4, 100, 30, 23, 15, -13, 16, -53, -20, -13, 58, -8, -55, +14, -35, 77, -2, -12, -5, 31, -8, -24, -15, -49, 20, 67, -6, -37, 0, -24, -22, 10, 5, 108, 12, 24, 13, 65, -4, 0, 14, -1, -37, 1, 10, 0, -28, 85, 63, -24, -43, 107, 85, -41, 8, -49, -80, 8, -4, 9, -7, -15, -40, -40, -2, 127, 22, -15, -8, 8, 4, -20, -29, -23, -24, 27, 6, -23, 9, 11, -37, -13, 32, 29, -5, 17, -6, 1, 40, -27, 29, -33, 38, 35, +-14, 46, -52, 0, 39, 6, -25, -31, 18, -19, 10, 23, -5, 4, -17, 1, -12, 45, 60, -23, -31, 14, 65, -21, 47, 3, -14, 16, -11, -27, 17, 15, -4, 14, 25, -7, 6, 19, 3, -29, 5, -23, 6, -36, -10, 16, 8, -10, -16, 32, -17, 7, -20, -26, 25, -10, 19, 0, -20, 43, 13, -40, 4, -16, 46, 29, -5, -39, 28, -26, -18, -34, 50, -16, 34, -22, -49, -51, 2, -18, -1, +45, -12, 56, -8, 12, 13, -37, 11, -8, -10, 0, -7, -9, -1, -11, -8, 3, 0, 13, -16, -15, -11, -12, 9, 2, 47, -24, 28, -16, 0, -16, 24, 7, 3, -10, -14, -5, 2, 8, 24, -19, 14, -57, 32, 5, -16, 19, -14, -22, 42, 3, -20, 8, -37, -3, 10, 14, 127, -37, -56, -18, 1, -39, -12, 34, -15, -49, -27, -12, -16, -8, 101, -47, 4, 53, -14, -10, 41, -36, -10, -8, +6, -2, -3, -6, 20, -35, 53, -16, 53, 42, 18, 4, -22, 9, 7, -11, 25, -3, -25, -17, 22, -25, -12, -23, -28, 40, -16, -8, -4, -47, -14, -22, -22, -35, -21, -8, 2, -14, 38, -25, 18, 47, -13, 14, 10, 26, -21, 2, 28, 1, 15, -20, 23, -6, -5, -2, -9, 22, -12, -43, -4, -50, -30, 9, -10, -36, -32, -27, -30, -25, -13, 14, 30, -9, -20, 5, 13, -2, -35, 24, 2, +-38, 49, -55, 68, 21, -7, -28, 0, -13, 7, -25, 48, -48, -57, 3, 5, -8, 12, -25, -19, -54, 23, -48, 53, -7, 0, 0, 3, 25, -20, 3, -1, 17, 21, -15, 10, 40, -44, -7, 4, -7, -39, -25, 0, 6, -28, 38, 4, -16, 13, -30, -22, -6, 2, -12, 31, 8, -5, -9, -8, -5, -22, -2, 18, -13, -10, 6, -15, -40, 12, -6, 1, -36, -20, -19, -2, -3, -6, 0, -7, -7, +-1, -36, 59, -8, -34, -14, -23, 9, -3, 10, 1, -25, -54, -2, -9, -24, 40, 68, 5, 11, -7, -13, -11, 13, -2, -20, 5, 38, -48, 16, -38, 26, -5, 29, -23, -7, -20, -46, 75, 41, 13, 6, 78, 47, -5, 5, 6, -45, 69, 62, 91, -24, 37, 95, 67, 0, -22, 1, 4, -7, 14, -20, 17, 12, -15, 20, -2, 17, -45, -17, 26, 9, 6, 14, 21, 7, -22, 2, 28, -8, 75, +24, -20, -29, 31, 127, 46, 51, 22, -25, -16, -3, -2, -3, 7, -1, 9, -13, 31, -29, 23, -6, 13, 17, -1, -34, 16, 29, -24, 44, 4, -29, 9, 41, 7, -20, -9, 31, -43, -16, 9, -8, 10, -29, 21, -31, -36, -1, -7, -69, 50, 25, -24, -23, -3, 64, -42, 44, -40, 4, -63, -27, -36, -33, 84, 66, -26, -21, -42, 1, 21, -13, -13, 14, 37, -4, 64, 6, 0, -4, 14, -32, +14, -37, -30, -9, 0, 9, -35, -8, -34, 3, -54, -24, -9, -9, -6, 7, -32, -4, -8, -5, 5, 8, 3, 17, -19, -23, 22, -6, 34, -31, 12, -34, 58, -27, 4, -22, -16, 21, 18, -4, 24, -23, 13, 0, -37, -22, 5, -17, 20, 2, -24, 20, 12, -24, -2, -21, 12, -16, 3, 19, 11, 17, -21, -20, 3, -14, 31, -10, -20, -7, -10, -17, 25, 8, 15, -11, -5, -21, -11, -13, -14, +-13, -18, 21, 3, -38, 63, -27, 35, 51, -7, 49, 54, 18, 6, -38, -22, -47, 72, -25, -32, -38, -47, 10, -44, 10, 27, 32, -16, 14, -25, 71, 2, -60, -62, -17, 65, -7, -1, -29, 1, -15, -11, 20, 40, -3, -23, -1, 19, 16, -5, -42, -6, -12, -1, -15, 36, 23, 8, 1, 7, -26, -22, 0, 2, -23, 20, -6, 11, -50, 9, 54, -26, -48, -36, 0, 78, 5, -68, -7, 49, -22, +-55, -35, -41, 41, 42, -35, 77, -10, -9, -48, 45, -42, 48, 11, 33, -13, 37, -23, 83, -13, 17, -8, 2, -33, -4, -6, -16, -27, -23, -2, 32, 57, -21, -31, -29, 0, 6, -15, -13, 13, 6, 24, -10, -17, -28, -16, 31, -14, 9, -16, -14, 10, 30, -14, -18, -4, -27, -10, -15, -34, 15, -16, 19, -3, -25, -14, -45, -2, 30, 15, 9, -14, -15, 4, -13, -22, -15, -3, -32, 19, 19, +-3, -33, 37, 7, -23, -7, -18, -10, -25, -51, -9, -8, -29, -21, 28, 5, -37, -5, 18, 67, 1, 39, -25, -1, -15, -43, -41, 12, 8, 28, -29, -21, 8, -14, -5, 4, -9, -32, 8, -17, 9, -17, -20, -15, -16, 17, -10, -19, -51, -64, 14, 57, 13, 39, 2, -5, 17, -34, -37, -32, -5, -36, 33, 51, 16, -24, -11, 12, -7, -25, -16, 24, -4, 12, -14, 63, 1, 5, 3, 42, -27, +17, -6, 41, -6, 8, 3, 31, 27, 30, -28, -1, -29, -2, 3, -5, -8, -23, 0, -7, 9, -23, -28, 80, 26, -22, -20, 25, 7, -5, -12, 9, -27, 11, -34, 16, 1, 5, 36, 12, 40, 7, -4, -16, -4, 2, 39, 52, 37, -11, -25, 22, -6, -28, 26, 13, 29, 2, -5, 39, 83, 10, -36, -24, -11, 41, 2, -7, -7, 19, -8, -12, -4, 8, 5, 5, 41, -54, 33, 1, 1, 38, +-2, 28, -4, 29, 13, 122, 3, -23, -38, 24, 12, -34, -25, -51, -40, -33, 37, 5, -20, -15, -16, -17, 11, -21, -10, -12, 19, -9, 35, 18, -28, -9, -11, -3, -11, 1, -25, -17, -28, 1, -27, 100, -17, -5, 6, 2, -35, 20, -2, 3, -16, 10, 36, -4, 9, -21, 8, 62, -13, -37, -16, -23, -27, -20, -9, 8, -13, -52, -20, -52, -9, -26, 4, 48, 4, -14, -6, 6, -30, 13, -2, +2, -14, -54, -17, 58, 43, 31, 38, -63, -49, -16, -19, 74, 8, 32, -28, 1, 29, -59, -21, -21, -19, 3, -1, 64, -33, -26, 5, -4, -16, -11, 13, 10, 0, -49, 12, 1, -2, -14, -8, 11, -14, -49, 50, 7, -6, -29, 49, -24, 23, 17, 11, -3, 78, -14, 40, -21, -15, 23, -21, -9, 76, 20, -8, 27, -30, -59, 9, 15, 1, 11, -15, -35, 26, -38, 37, -22, -4, -30, 96, -51, +-20, 41, 1, -50, -45, -15, 10, -34, -4, -29, -31, -35, 79, -14, 21, -10, 16, -31, -15, 38, 73, -40, 37, -4, -40, -25, -3, -19, -3, 34, 1, -17, 82, -28, 4, 3, -10, 14, -19, -14, 20, 25, 2, -14, 3, -27, -58, -22, -11, -28, -16, -28, 2, -4, -4, 5, 18, -1, 10, 54, -10, 28, 16, -8, -34, 39, 23, 18, 0, -35, 39, -14, -81, -6, -2, -49, 47, -30, -46, -5, 19, +-7, 38, 22, 63, -18, -5, 24, 6, -28, -12, 22, -43, 57, -40, -8, 20, 7, 22, -29, 12, 11, 18, 13, 31, 7, -48, -21, -33, -52, -20, -16, -4, -12, 0, -34, -4, -6, -35, -37, -5, -37, 17, 41, -36, 22, -28, -27, 71, 11, -18, 27, 57, -5, 15, -10, 70, 20, 8, -4, -11, -35, -41, -31, 20, -50, -26, -12, -13, -20, -33, -6, -1, -6, 32, 27, -64, -4, -39, 35, 41, 26, +5, 15, 83, -32, -2, -13, 39, 26, 5, -6, -13, -6, -22, -13, -31, 31, -16, -26, 11, -39, -39, -57, -24, 3, 26, -15, -45, 61, -48, 6, 45, -11, -22, -13, 21, -25, -13, -12, 51, -7, -6, -28, -38, 6, -45, -24, 1, -13, 4, -23, 31, 20, -45, -25, -1, -26, 24, 6, -7, 18, -30, 22, -4, 3, 3, -19, 31, -5, 2, 10, 12, 9, -15, -14, -15, -40, -25, -24, -32, -13, 8, +0, -13, -1, -39, -24, 7, 15, 26, 30, -12, 39, -7, -32, -30, -37, -24, 0, 13, -19, 41, -2, -18, 28, 18, -2, -24, -14, -47, -28, -9, -3, 0, -2, -35, -22, -26, -21, 30, 14, -11, 5, -15, -18, 36, -25, -18, 5, -11, 38, -22, -3, 47, -20, 2, -47, 10, -29, 9, -13, -41, -19, -27, 32, -13, -13, -38, -7, -15, 14, 0, -44, 28, -23, -33, -7, -7, -13, 52, 0, -3, -17, +72, -1, -32, 2, -9, 7, 30, -28, -42, -16, -11, -3, 24, -11, 44, 20, 5, 14, -17, -37, 19, 2, 24, -29, -9, -1, -21, -24, -7, 0, -14, -6, -11, -8, -8, 2, 43, -12, -18, -34, -9, -9, 3, -8, -1, 8, -14, -38, 37, -17, -28, 13, -3, -35, -5, -3, -26, -13, -25, 45, -23, 8, 29, 13, -22, -25, 3, -21, -14, 34, -6, -11, 8, -20, -17, -26, -41, 17, 29, 8, 0, +7, 5, -29, -18, 5, 17, -22, -20, 64, -8, 12, 9, 37, 23, 17, -40, -10, 4, -33, 36, 11, -16, -26, 24, -28, 9, -8, -27, 8, 13, -17, 5, -6, -4, -28, 12, -18, 25, -23, -4, 17, -4, 25, -2, 13, -13, 38, 10, -5, 25, -7, -42, 69, -23, -27, 8, 7, -34, -16, -39, -3, 28, 38, 9, -15, -15, -45, -11, -33, -7, 4, -12, -8, -30, 4, 1, -12, 110, 61, -28, -29, +17, 23, 40, -6, 27, -4, 37, 60, -3, -16, -9, 9, 15, -24, 26, -32, 9, 32, 0, -12, 111, 15, 2, 17, -37, -25, 127, 8, 65, -42, -2, 1, -2, -8, -15, -21, -39, 10, -45, 22, -1, -25, 11, -40, 81, -46, -58, -5, -30, -26, 22, -16, 11, 38, 14, 7, -32, 7, -4, -5, -16, -6, -1, 20, -9, 43, -28, -19, 18, -49, 15, -7, -22, -6, 2, 6, 27, -1, -10, 3, -43, +11, -18, -27, -33, 37, -37, -19, -50, -35, 51, -25, 21, -41, 23, 18, 32, 57, -37, -1, -19, 37, -44, 16, -13, -58, 8, 19, 33, -59, -50, -53, -4, 7, 31, -16, 45, 20, -45, 42, -37, 0, -46, 24, -32, 13, 1, 4, 20, 67, -11, -22, -17, -30, 12, 1, -11, 21, -23, 67, -9, -38, -23, 10, 3, -4, -5, -7, -8, 33, -16, -29, -64, 5, 32, -20, -1, 14, -22, 31, 31, 82, +15, -11, 41, -17, 36, -18, -29, -5, -45, -28, -49, 13, -1, 32, -6, -37, -13, -5, -29, 59, 15, -32, -29, 42, 26, -28, -57, 3, -25, 1, 48, 54, -25, -38, -10, -36, -15, -30, -25, 33, -21, 38, 6, -35, 8, -5, -23, -11, 9, -22, -2, 30, -27, -34, -15, 37, 7, -13, -4, 18, 25, 17, 8, 62, 5, -15, -20, -51, -15, -60, -23, 21, -23, -15, -16, -20, 54, 9, -2, 1, -10, +-23, -12, 44, 27, -50, 4, -15, 16, 2, -21, 2, -6, 7, 16, 53, -20, -12, 34, 2, 7, -26, -45, 40, -27, 57, -8, -8, -5, -21, 15, 10, 9, 3, 3, -9, -15, -29, -1, -19, 43, 10, -26, 29, 36, 37, -1, -31, -13, -12, -5, -45, -18, -5, -44, -20, -9, 19, 26, 3, 107, -23, -19, -7, -15, 11, -2, 43, -43, -16, -20, -35, 62, 14, -18, 52, 64, 11, 15, -1, -10, -22, +-5, -47, -21, 16, -40, -48, 26, 37, 12, -20, 85, -9, -12, -19, -8, 31, 42, -35, -38, 9, 16, -4, 63, 5, -15, -15, 65, 34, -4, -44, 0, -15, -24, 1, -5, -18, 15, -27, -2, -2, 15, -39, 42, -47, -20, 15, -18, -24, -42, 13, -18, -24, -16, -11, -24, 3, -20, 15, -29, 6, 7, -27, 6, -9, -26, -17, 35, -8, -18, -7, 16, 46, 30, -15, 37, 1, 1, 8, 9, -6, -2, +-6, 5, -20, 17, 27, -44, -12, 3, 12, -37, 19, -19, -22, -28, 21, -16, -11, -2, -10, -17, 12, -13, -35, 2, -16, 24, 1, 9, 4, -21, -19, -27, 37, -3, -45, 8, -5, -30, 4, 113, -28, -23, 34, 0, -45, -31, 12, -23, -8, 53, -12, -21, -5, 11, -6, 4, 16, 3, -16, -10, 15, 9, -23, -17, 12, -14, -4, 46, 70, -26, -26, -20, 1, -16, 30, 9, -16, -16, 3, 57, 21, +-12, 2, -3, 1, 19, -8, 47, -7, -20, -5, 1, 6, 24, 15, -30, 33, -22, 0, -26, 41, -47, 33, -1, -32, -21, -5, -37, 10, 24, -14, -6, 42, -18, 18, 15, 27, -23, 1, 7, 30, 43, 49, -30, -9, 12, -14, 23, -2, -2, -59, -7, 15, 21, -5, -26, -16, -39, -64, -15, -31, -2, 5, 23, -18, -30, 37, 19, -21, -30, -49, -33, 34, -6, 42, 34, -53, -40, 12, -42, -9, -7, +-34, -33, 5, 7, -5, -6, 33, 18, -11, 17, -38, -25, -5, -11, 39, 5, -1, 55, -11, -25, -2, 18, -35, 20, -27, 42, 25, -38, -24, 21, -21, 6, -11, 9, 27, -7, -94, -15, -39, -24, -13, 47, -34, 14, 21, -2, -11, -31, 93, 21, -10, -12, -76, -33, -41, -20, 42, 106, -26, -57, 56, -59, -27, -20, 10, -39, 13, -2, 106, -2, 8, -10, -34, 19, 29, -55, 7, 41, 48, -21, -12, +23, -67, -1, -17, -5, -96, 4, -21, 26, 18, -30, 29, 2, 21, 22, 38, -36, 58, 13, 47, -32, 9, 12, -17, 26, -6, -29, -35, 29, 5, -23, -39, 41, -4, 13, -21, -9, -54, -24, 17, 37, -5, -8, -25, -17, -1, 63, 18, -58, 28, 7, -28, 18, 127, -36, 53, 40, 38, 23, 0, -3, 30, -20, 12, 12, -18, -10, -37, -20, -24, -24, 10, 36, 14, -14, 12, -3, -17, 59, 9, -8, +19, 35, 0, 14, -9, -23, 27, 8, -28, 16, -20, 0, 14, -32, -6, 15, -34, 1, -18, -4, -44, -25, 28, 11, -32, 6, 1, -26, 16, 127, 16, 18, -2, 11, 98, 9, -10, 25, -35, 6, -22, -19, -27, 9, -7, -46, -35, 2, -43, -45, -7, 12, -30, -13, 0, 11, 3, 9, 31, -14, 2, 22, 22, 9, -13, -27, -36, -2, -32, -16, 16, 10, -9, 118, 24, -10, 38, -11, -29, 9, -5, +15, -8, 5, -13, -26, 68, -18, -4, 6, 43, 10, -10, 14, 23, -33, -2, -28, 43, -25, -14, 18, -5, -17, -37, 42, -6, 1, 58, 41, 18, 46, -38, 4, -8, -21, 44, -39, -24, -13, 23, -6, -19, 4, -36, 52, 54, 13, 2, -44, -38, -14, -2, -4, -10, -28, 16, 10, 37, -19, 16, -11, -3, 7, -37, 3, -4, 22, -26, -17, 55, 1, -6, 0, 29, -22, -6, 80, 8, 13, 13, -12, +-8, -22, -24, -3, 1, 11, -6, 15, -14, -3, 17, -19, 23, -9, -37, 25, -14, -21, -24, 7, 59, -21, 24, -8, -3, 28, -11, 85, 76, -24, 6, -25, -21, 9, -33, 2, 5, 29, 19, -22, -9, -2, 2, -22, -1, 37, -19, -23, -27, -9, -34, 11, 10, -10, 9, -15, -29, -7, 11, 47, 62, -30, 16, -25, -12, -3, -20, 16, -19, 11, 5, 55, -18, -5, 27, -9, 16, 17, -34, -6, -42, +-5, -9, 9, -21, -8, 20, -18, -13, -25, -20, 33, 45, -28, 47, -25, 0, -3, 20, -8, -21, 4, -13, -26, -4, -8, -1, -8, 16, 34, 18, 11, -30, 15, 3, 10, 65, 3, -23, 9, -34, -33, -10, -9, 71, 50, 38, 17, -18, 37, 31, -14, -9, 1, 17, -6, -24, -25, 127, 19, 3, -30, 16, -26, -50, -32, 18, -55, -29, 64, -35, 9, -9, -42, -7, 9, 16, -16, -15, 37, -40, -4, +28, 17, 52, 102, -42, 35, -13, 2, 33, -57, 5, -4, 25, 26, 7, 70, 27, 41, -57, 53, 14, -6, -20, -10, 43, 62, 59, 24, -29, -20, 49, 8, -24, -16, 7, -30, 0, 11, 56, 16, -6, -27, 14, 0, -9, -31, 5, 16, -29, 61, -28, 13, 16, -9, -16, 50, -23, 6, -10, -28, 15, 13, -4, 27, 22, 63, 51, 23, -60, 8, -64, -29, -19, -50, 17, -29, 32, -52, 1, -5, -17, +54, -51, 15, -5, 57, -18, -72, 12, 45, 64, 15, 29, -16, -8, -16, -26, -32, 15, -43, -1, 24, 6, 0, 22, 3, -7, -10, 18, -13, 11, -22, 11, 104, 1, 18, -34, 19, 40, -51, -8, -13, -32, -17, 4, -38, 122, -30, 4, -47, 14, -27, -12, -51, 85, -39, 10, 15, -15, -15, -29, -22, -24, 6, 44, 18, -14, -35, -69, -39, -14, -33, 29, -31, -16, 57, 15, -23, 30, 14, -1, -56, +26, -46, -26, -3, 36, -37, -27, 4, 27, 9, 2, -29, -16, -12, 4, 80, -37, 21, 3, -2, 2, -34, -4, -37, -40, 14, -12, -20, 102, -22, 10, -50, 36, -28, -10, 2, 48, -9, 25, -3, 8, 12, -18, -32, -11, 70, 56, 46, -31, -38, -31, -21, -43, -7, 16, -4, -33, -4, -7, -33, 13, 34, -1, -41, 13, -41, 13, -12, 20, 5, 20, 9, -18, -17, -19, -10, 13, -24, 5, 68, -12, +-1, -11, 9, 0, -16, -19, -27, 21, 10, -20, -1, -35, -13, 40, 53, 37, -8, -6, -12, -24, -2, 9, 11, 25, -8, -51, -8, 33, 26, -11, 82, -22, 25, -17, 21, -26, -21, 52, 2, -36, -15, 32, -7, -26, -26, 10, -30, 53, -58, -13, -28, -19, -7, 3, 37, 16, -39, 10, -24, -4, 2, -5, 106, -71, 10, 37, -37, -48, -31, 60, -63, -10, 75, 9, -25, -25, 27, 1, 45, 62, -62, +2, 5, -55, -19, -14, -7, -4, -30, -30, -24, -30, 30, 19, 89, -34, 7, -15, 38, -40, -39, -10, 32, -17, 60, 22, 13, -30, -3, 15, 16, -6, -10, 1, 42, 16, 9, 19, -1, -1, 8, -14, -33, 16, -44, -14, 7, -32, -6, 3, -10, -38, -22, -16, -58, -34, 26, -8, 0, -9, 2, -7, -34, -5, 10, 4, -13, 71, 5, 23, 37, -12, -18, 15, 13, 7, -3, -36, -36, 77, -16, -7, +41, 4, -17, -22, -29, -24, 26, -4, -5, -10, 10, 5, 4, -13, 23, 3, 2, -5, 2, 10, 9, 15, 18, 31, -32, -26, -41, -10, -30, -11, -10, -7, 18, -7, -27, -7, -10, -10, 20, 50, 18, 1, -17, 10, -33, -1, -3, 4, 46, -17, -31, -20, 26, 20, -40, -20, 9, -10, 8, -3, -55, -23, -25, -3, -18, -32, -24, -27, -47, -21, -65, 2, 69, 28, -10, -21, 1, 9, 4, -7, -55, +-15, 11, 27, 3, 87, -57, -13, -9, -14, -35, 6, -35, 12, 6, -7, 71, -4, -7, 8, 15, -39, -36, -7, -8, 16, -47, -27, -12, -32, -36, 35, 3, -30, -58, -61, 10, 36, -16, 18, -6, -49, -28, 5, 22, 7, 64, 16, -6, -12, -22, -5, 57, -43, -11, 29, 5, -42, 22, -13, -32, 35, 2, 127, -9, 39, 12, -21, 22, 56, -22, -43, 7, -40, 15, 81, 9, 70, -23, -1, -13, -41, +-4, 17, 31, -14, -21, 45, 54, -28, 13, -5, -17, 40, -64, 25, -33, -62, -46, -19, -9, 86, 0, 48, 33, 41, 1, 11, 48, 98, 57, -9, -9, -21, -16, 49, 58, -11, -6, -34, 90, 35, 76, 76, -25, -13, 22, 104, -9, 19, -8, -1, 4, 62, -18, -31, -34, 10, -47, 6, -22, 104, -32, -20, 5, -58, -24, 44, -24, -15, -4, -36, 60, -77, 65, -12, -55, 17, -35, 46, -17, 20, -24, +-4, 19, 107, -2, 2, -73, -12, -19, 75, -10, 75, 4, 48, -40, -57, -20, 57, 15, 16, -41, -5, 101, -39, 53, -24, 23, -17, -24, 73, -29, 14, -26, 4, -24, 48, -25, -4, -28, -62, 23, 92, -3, 82, -3, -57, 30, -16, -68, 3, 60, -3, -10, -2, 40, -21, 52, -40, -30, -40, -30, 61, 29, 7, -32, 14, -27, 79, -33, 2, -22, 0, -6, 65, 10, 33, 10, 12, 5, -34, -5, 28, +5, -11, 7, -4, 78, 11, 36, 81, -18, -26, 17, 87, -5, -10, -7, 57, 14, 31, -21, -2, 54, -9, -22, 7, 16, 66, -5, 5, 26, -43, -32, 23, 6, -7, -24, -36, 127, -52, 47, -19, 27, 1, 33, 33, 17, -9, -10, -23, 124, 11, -19, -13, 17, 36, -1, 59, 25, 34, -1, -17, -31, -28, -3, -23, -3, -7, -24, -42, 83, -13, 34, -18, -8, -15, 20, 57, 33, -43, 60, -32, 102, +24, -32, -19, 75, 20, 23, -24, 4, 19, -22, 8, 31, -21, -38, -18, -5, 12, -13, -30, 57, -36, -19, -18, -10, 9, 11, -23, 3, -27, -2, 4, 4, 18, -23, -8, 7, 10, -46, -19, 15, 29, -16, -28, 5, -49, -28, -7, -12, -22, 2, -41, 127, -19, 66, 4, 34, -4, 38, -7, 6, 3, -4, -3, 25, 8, -13, -15, 12, 48, -29, 51, -9, 34, 22, 34, -8, -16, 3, 11, -16, 4, +1, -11, 127, 7, 31, 48, -42, 6, 17, -14, 12, 8, -11, -8, 14, 77, 14, -14, -16, -4, -12, -6, 3, 22, -2, 4, 32, 17, -12, 25, 16, -1, -11, 0, 127, -5, 59, 10, -12, 1, 8, -5, 14, -11, -8, -16, 10, 44, -6, -19, 3, -26, -20, -17, -15, 14, 2, 24, 76, 53, -12, -19, -12, -9, 12, -34, 100, -23, 34, 43, -28, 45, 0, 41, 8, -12, 3, -46, 43, 92, 32, +16, -3, -32, -55, 27, 11, 28, -14, -10, -21, -45, -24, -17, -11, 3, -5, -20, 18, -18, 94, -3, -45, 18, -24, -25, 13, 33, -32, -35, 39, 0, -35, -47, -28, -25, 114, -51, -9, 55, 17, 8, 14, 40, -11, 49, -2, -12, 25, 26, 13, -11, 121, -50, 6, -5, -1, -13, -27, -4, -19, -14, -38, -40, -4, 0, -17, 69, 56, -27, -36, 43, -30, 2, -20, -53, -2, 75, -24, -61, -35, -1, +20, 12, 53, 40, 1, 26, -11, -27, 16, -22, -24, -9, 70, -1, -11, 9, 16, 20, 51, -18, -8, -40, -41, -28, 59, 34, -3, -11, -35, -27, 10, 57, -50, -39, 127, -33, -8, 4, 32, -20, 69, 12, -39, -31, -27, 18, -54, 8, -59, 84, 11, -29, -31, 37, -17, -9, -1, 2, -8, 64, 10, -24, -21, -6, 15, -11, 87, 13, -6, 29, 34, -27, 19, -31, -15, -46, 48, 43, 35, -24, 0, +5, 16, 3, -3, 30, -17, -47, 21, 36, -16, -5, -13, 51, 108, -4, -50, -47, 64, -15, 15, 74, 8, -32, -56, 1, -1, -22, 4, -28, -26, -16, -49, -5, 84, 93, 44, 50, 63, 10, -26, 1, -26, 27, 41, -46, 78, 7, 47, 6, 72, 44, -30, 49, -40, -18, -10, -27, -53, -8, -15, -6, -12, 2, 19, -17, 26, -23, 27, 12, -7, -29, 40, 16, -32, -15, -15, 7, 41, 0, -32, -12, +57, -10, -3, 35, -14, -26, -41, -31, 8, -37, 0, -42, -1, 31, 16, -1, 40, 22, -16, 34, 3, -13, -13, -32, 7, 41, -20, -41, 4, 4, -16, -31, 100, 18, 42, -21, 3, -2, -22, -5, -20, 18, 4, 35, -10, -4, 1, 18, 9, 34, 12, 29, -16, -7, 32, 19, -19, 20, -28, 0, -10, 8, -12, -26, 124, -14, -17, -33, -11, -8, 12, -27, -45, -26, 22, -1, 1, 21, -13, 30, 57, +-21, -55, -53, -39, -4, -6, 23, 7, -40, -25, 13, -19, 5, -8, -16, 127, 8, 33, 8, -26, -6, -6, 30, -71, -15, -6, 2, -34, 18, -15, 24, -41, 16, -49, 2, -5, 40, -6, 25, -35, -41, -4, -6, 39, 13, -29, -12, 127, 29, -12, 45, -17, -7, 10, -12, 49, -11, -26, -19, -6, 68, -26, -4, 43, -35, -8, 22, -22, 20, 22, 16, -9, 59, -27, -23, -2, -16, 0, -7, 29, -21, +21, -2, 1, -26, 13, 12, -29, -63, 53, -1, -12, 28, -11, -22, -15, -2, 1, -4, -13, -6, -39, 3, -2, -6, 0, 23, 15, -19, -20, -28, -11, -26, 8, 4, 6, 0, -7, -18, 9, -28, 11, 4, -25, -9, 7, -2, -26, 13, -10, 2, -8, 32, 30, -19, 5, -15, 9, 3, -22, -14, -5, 29, -2, 15, -10, 11, -32, -6, -4, -9, -10, -31, -4, -22, -22, 34, 0, -5, -27, 5, -17, +26, -34, -6, 40, -22, -12, 6, 8, -11, 20, -19, 44, 90, -28, 16, -20, 54, -3, 1, -24, -56, 55, -38, 44, 27, 28, -40, -19, 38, -37, 1, 7, -12, -13, -9, 6, -1, 13, 9, -25, -15, -18, 34, 15, -1, -25, -59, 0, 1, -16, 30, 8, -15, 73, 27, -34, -26, -8, 9, -32, -30, -7, 24, 24, 31, 13, 0, 11, 16, -35, -14, -6, -14, 36, 4, 31, -11, -12, -21, -60, 20, +-3, 47, -4, 17, -14, 11, 10, -7, -28, -19, -13, -26, -21, -39, -42, -12, 12, 14, -25, 14, 3, 1, -42, 2, -36, -18, -15, -38, -70, 22, -39, -46, -10, 21, -23, -1, -21, 15, -4, -3, 0, -21, -3, -14, -15, 11, -12, -18, 19, -17, 6, 11, -21, 17, 3, 47, 106, 16, 27, 2, 20, -32, 58, -17, 16, 70, 23, -22, -14, -8, -17, -3, -17, 33, -32, -43, -4, -56, -11, -13, 3, +1, -5, -42, -9, -15, -49, 2, 16, 49, -43, -19, -6, -9, -23, -15, 19, -29, 2, 52, -21, 21, -22, -22, 13, -26, 2, 5, 3, 30, 13, -19, 39, 18, 81, 127, -9, 0, -38, -22, 7, 47, -6, -9, 23, -52, -33, -7, 18, -33, 3, -20, -19, 4, -16, 21, 44, -5, -14, -23, 0, 22, -1, -29, -10, 4, -3, 63, -57, 31, -19, -23, -16, -21, 3, -25, -75, -3, -10, -50, 43, 9, +-1, 18, -5, -5, -19, 25, -6, 39, 15, -21, 32, -6, -29, 17, 44, -6, -35, 101, -27, 5, -27, 0, 10, 11, -32, 20, -4, -45, -5, 25, -10, 30, -5, -13, 27, 8, -1, -9, 17, 5, 10, -42, 14, -13, 17, -48, 15, 35, 1, 126, -23, 13, -15, -5, 1, 15, -5, -8, -13, -4, -27, 9, 26, 16, -18, 46, -18, 9, -8, -36, -12, 21, -22, 0, 3, -17, 0, 8, -5, 37, 33, +127, -10, 10, -45, 5, 1, -21, -41, -7, 41, -6, 14, 0, 4, 6, 36, 22, -8, -47, -31, 35, -12, 1, 6, -6, -35, -31, -20, -33, 25, 15, -1, -55, 10, 2, -29, 7, 33, 17, -35, -31, 15, 13, 30, -21, 18, 19, -5, -5, -22, -17, -13, 37, 8, 19, -19, -23, -35, -24, -26, -20, 0, 47, 26, -34, -29, 23, -35, -4, 30, 6, -35, -11, 32, 16, 51, 9, 10, 64, 10, 2, +-24, -8, -41, 19, -31, 7, 23, -5, -57, -35, -11, -53, 36, 4, -9, 27, 31, -15, -19, 19, 27, -3, -29, 16, 2, -15, -8, -28, -15, -8, -12, 6, -5, 24, -38, 56, -2, 18, -13, -11, -3, -7, -20, -19, -6, 16, -19, 20, -5, 10, 1, 12, -22, 12, -32, 13, 15, 37, -29, -20, -34, 37, -40, 12, -36, 2, 3, 25, -14, 33, 0, -18, -39, -19, 33, -14, -16, 7, 44, 25, -42, +13, -17, 16, 0, -13, -30, -13, -1, 0, 1, -9, -28, 13, -9, -20, -17, -13, 7, 25, -9, 9, 3, 9, -14, -4, 37, -1, -25, -6, 30, 25, -23, 44, -8, -10, -31, 30, -29, -8, 12, 42, 23, -5, -33, 7, -21, -33, -9, 5, 2, 1, -13, 10, -19, 1, -22, 6, 15, 48, -19, -24, 127, 0, -6, 16, 8, 14, 13, 4, 109, -3, -3, -9, -33, -16, -3, -60, -8, 51, -12, -6, +40, -47, -14, 9, 5, -25, -36, 23, -58, -2, -30, 50, 21, -39, -33, 15, 15, 39, 3, -42, -1, 13, 37, -19, 24, 36, -18, -16, -39, -2, 16, -51, 35, -32, -15, -59, -37, -40, -38, -19, 84, -9, -32, 51, 77, 36, 31, 39, -36, 74, -9, 93, -14, 1, 5, -21, -4, -19, -5, -1, -17, -6, -18, 14, -10, 5, 1, 45, -39, 6, -38, -3, 4, -24, -32, -16, 11, -21, 2, -13, -26, +9, 46, -53, -49, 29, 5, -47, -18, -32, -25, -25, -6, 63, -13, -40, 3, -37, 13, -28, -8, -13, -61, -8, 90, -1, -24, -58, 47, -15, 24, 34, -28, 1, -20, 22, -21, -11, 80, 13, 16, -18, 19, -9, -27, 33, 4, 4, 46, -22, -30, 52, -18, -3, -59, -12, 3, -35, 3, -56, 0, -5, -31, -34, -29, 29, 14, 127, -28, -37, 9, -29, -26, -13, 26, 13, -58, 5, 14, -48, -9, -33, +-24, 67, 78, 15, -54, 36, 5, -9, -34, -11, 22, -17, -12, 36, 13, 8, -16, 103, -40, -53, -3, -14, 5, -47, -1, -3, -21, 47, 6, -32, -1, 22, -33, 73, 3, 23, -30, 11, 28, 8, -66, -45, 11, -7, -11, -12, 1, -23, 5, 114, -36, -27, -5, 1, 8, 24, 9, 1, 9, 3, -2, 29, 8, -17, -10, 28, 42, 28, -23, 40, 16, -9, 9, -12, -6, 27, -7, 32, 20, 12, -17, +64, -24, 4, 55, -13, 12, -26, -5, 10, -34, 55, 21, -14, -39, -11, -24, 11, 4, 10, -23, -24, 4, -9, -26, -32, -13, -3, -49, -40, -3, -18, 4, 29, -15, -16, -3, 64, -27, 44, -18, 42, -3, 51, -5, -21, -57, -26, -22, -20, -23, 24, -15, 4, -1, 13, -3, -22, 32, -9, 9, -14, -5, 15, -12, 12, -32, 7, 24, -5, -10, -21, 4, 11, -7, 0, 20, -20, -39, -43, -16, -16, +-10, 3, 33, 27, -5, 32, 76, -9, 16, -22, 8, 4, 1, 34, 72, -17, -10, -37, 11, 8, -38, 66, 4, 8, -10, 48, -21, -11, -33, -2, -3, 8, -21, 8, -33, 2, 40, -23, -31, 83, -17, -16, -23, -11, -10, -15, 8, 32, -10, -10, -23, 6, -16, 36, -10, -17, 36, 23, 13, -12, -47, -35, -3, 23, -21, 35, 12, 6, 5, -22, 10, -27, 27, 15, 2, 30, 2, -13, 4, 17, 17, +4, -22, -3, -17, 22, 8, 12, -3, -11, -25, 79, -24, -8, 3, 64, 2, 16, 33, -5, 3, 3, 5, -10, -8, 0, 9, 0, 12, -3, 23, 20, -1, -12, -8, 5, -15, 13, 1, -5, -40, 34, -13, 6, -40, -28, -12, 29, -11, 44, 0, -6, 7, 5, -2, -33, -20, 23, -10, -8, 57, 6, -7, 10, 11, 8, 24, 36, 4, -8, 6, 1, -11, 6, -21, -39, -33, -2, 12, 40, -17, 6, +-23, 15, 27, -10, -7, 46, 7, -10, -25, -72, 10, -5, -9, 0, -23, -13, 4, 0, -14, -16, -33, -5, -31, 18, 1, -29, 32, -14, -30, 4, -12, -11, 0, -44, 28, -11, -30, 3, -24, -33, -35, -17, -10, 33, -28, -21, -2, 3, 9, -10, -16, 0, 7, -8, 36, 12, -8, -39, 16, -19, -14, 2, 11, 7, -4, -57, 12, 3, -28, 24, 26, 0, 5, -9, -5, -15, -21, -25, -35, 3, -41, +-7, 9, 3, 25, -9, 47, 38, -30, -45, 52, -13, -5, -5, -18, -92, 2, -79, -22, 28, 27, 37, 20, 3, -54, -35, 0, -55, -9, -16, 19, -3, -2, -14, -11, 1, 7, -22, 23, -1, -3, 14, 19, -26, -25, 0, 20, 10, 13, -28, 20, 35, -5, -12, 4, -12, 25, -4, -18, 7, -23, -13, -16, 14, -22, -28, -10, -10, -24, -8, -24, -14, -12, 7, 24, -21, -35, -7, -11, 14, 12, -21, +36, 28, -24, -4, -7, -21, 24, 21, -1, -23, 24, 0, 13, 28, -29, -10, -14, 39, 2, 105, -20, -22, 6, -8, -36, -56, -31, -46, -12, -38, -69, 29, -42, 56, -46, -9, 13, -2, 57, 8, -60, -66, 14, -47, 83, -17, 36, -2, -42, -37, -98, -5, -19, -7, 15, -59, 45, -47, -27, -14, -52, -11, 7, -41, 98, -46, -34, -66, 2, -15, 0, -22, 1, 120, -30, 13, 1, -15, 29, 15, -28, +-17, 3, -7, -25, 22, -22, -6, 15, 33, -2, -13, -18, 25, 18, -33, -16, -19, 2, -15, 48, -14, -9, 8, -15, 85, 30, -27, -12, -13, -6, 23, -25, -20, 24, -6, 3, 10, -6, -10, -23, -32, -5, 72, -31, 7, -16, 11, -8, 3, -4, 9, 5, -30, -20, 29, -15, -30, 8, -6, 42, -24, 14, 3, -42, -14, 35, -25, -28, 47, -28, -27, -18, -46, -16, 1, -15, -4, 38, -45, -6, -3, +-23, -44, -11, -51, 20, 22, -20, 127, -31, -29, -62, 20, -20, 51, -105, -72, -79, -32, 9, 89, -21, -32, 24, 19, -27, -46, -31, -22, 2, -26, -21, -22, 5, -21, -6, 77, 11, -21, 28, -9, -16, 6, 51, 9, 27, 17, 34, 17, 16, -11, -8, 8, -11, 19, 12, -25, -32, -25, -5, 18, 12, -25, -16, -19, -38, -21, 2, -8, -10, 11, -24, 26, 15, -25, 113, -5, 17, 37, 7, -10, 9, +3, -24, 24, -8, -19, -18, -31, -23, 42, -29, -21, 4, -21, -19, -15, -18, -8, 27, -28, -10, -20, -26, 20, 21, -39, 89, 8, 19, 3, -23, -19, 24, -26, -6, 41, 5, -23, -10, 6, -36, 20, -13, -10, 10, -8, 0, 14, -3, -33, 16, -29, 11, -11, -28, 21, -25, -54, 51, -4, 34, 23, -19, -13, 19, -15, -15, 28, -29, -36, 31, -6, -40, -52, -35, -16, 2, -47, 13, -10, -61, -26, +26, -8, -5, -37, -20, 32, -33, -15, 36, 32, 23, 21, -15, -19, 19, -15, 17, 3, -17, -7, -14, -20, -58, 23, -15, 17, 5, -18, 24, 26, 15, -2, 42, -24, -17, -3, -41, 13, 19, -8, -11, -10, -34, 15, -16, 26, 12, -33, 15, -21, -33, -8, -29, 23, 10, -13, 8, -42, -13, -5, 9, -24, 11, 13, -2, -11, 1, -9, 12, -2, -15, 10, -7, -5, -3, 15, 0, -11, -14, -27, 20, +-31, 0, -21, 8, -17, 53, 20, 0, 45, 12, -22, 65, -5, -12, 30, -16, -13, 1, -25, -4, -5, 34, -13, -52, -15, -5, -42, -57, 59, -27, -24, -15, -17, 4, 16, 15, -19, 24, -24, 7, -45, 8, 13, 84, 6, 0, 7, 13, -2, -8, 51, 69, -48, -18, -3, -17, -3, -8, 13, -2, 26, -23, -23, 0, -31, 8, -12, 17, 8, 13, -14, 9, 40, 0, -15, -17, 5, -1, -15, -4, 3, +9, 13, -6, -15, -32, -11, -41, 4, -9, 31, 13, -6, -16, 21, 9, -1, -30, -23, 41, -37, 17, -18, -12, -70, 22, -33, 79, 20, 13, -25, -6, -12, -4, -7, 52, -55, -16, 33, -28, -6, -16, 76, -68, 29, -58, -29, 1, 50, -3, -31, 9, -22, 105, 47, -21, -10, -84, -34, 54, -31, -47, 58, -33, -29, -42, -36, 49, 81, -37, 66, -17, 29, 42, -6, 12, 30, 26, 40, -28, 9, 17, +-20, 47, -20, -45, -3, 66, -29, 5, -10, -33, -27, -53, -14, 81, 54, 14, 13, -36, 33, -5, 8, 17, 9, -27, -5, 18, 27, 34, -7, -2, 7, -22, -25, -13, 46, 38, -30, 0, 39, 16, -32, 43, -24, -10, 5, -14, -8, -21, -4, -3, -8, -20, -22, 19, 10, -12, -9, 27, 14, 6, -11, -14, -8, 12, 5, -6, 18, -36, -4, -22, 56, 8, -7, -17, 21, 3, -35, -24, -19, 43, 7, +1, -1, -20, -7, 34, -21, 5, -16, 10, 40, 33, 14, -12, 11, 40, 19, -26, 24, -36, -20, -11, 26, 12, -12, 6, 2, 3, -21, 87, 31, 2, 72, 19, 1, -18, -43, 87, 24, -34, -39, -4, 21, 33, 22, -37, -6, -49, -15, -4, 16, -61, -20, 6, -55, 3, -14, -63, 10, -5, -18, -24, 92, -33, 52, -13, -11, -4, 7, 16, -5, -15, -9, -6, -8, 34, 43, 20, 7, 1, -9, -18, +8, -14, -29, -15, 39, 37, -21, 20, -11, -32, -13, 6, -28, -28, 55, 11, -15, -17, 10, 30, 29, -2, 17, -10, 50, 7, 1, -28, 5, 13, 6, -11, 47, -17, -23, 12, -8, -12, 9, -47, -11, 22, -4, 42, -13, -13, 127, -11, -9, -33, 35, 22, 19, -5, 28, -18, 36, 21, -13, -32, -12, 11, 11, -30, 35, -13, -26, -4, -43, -12, -13, -63, -8, 19, -21, 49, -3, -1, 127, -5, -4, +-37, -6, 38, 28, 5, 4, 41, -22, 22, -19, 40, -19, 11, -23, -74, -6, 11, -63, -14, 70, 19, -31, -61, -4, -41, 0, -2, -27, -37, 64, -14, -11, -30, -15, 95, -14, -34, -6, 5, 38, 14, 78, -44, -30, -4, 6, -6, 11, 28, -31, -10, -29, -5, 34, -24, 2, 39, -12, 17, -16, -7, 85, -42, 5, -26, -21, 38, 6, 32, 0, 19, 33, 4, -39, 56, -20, -15, -23, -4, 13, 9, +-13, -31, -26, 42, -6, 3, 26, -25, -8, 12, -1, -4, -6, 127, 68, 4, 0, -12, -32, -16, 31, -16, -16, -3, 14, 28, -5, -9, 26, -8, -10, 22, -40, 6, -7, 28, -8, -11, -12, -24, -1, 11, 4, 19, -45, 105, 100, -39, 22, -23, -32, 11, 1, -6, -19, -36, 25, 113, -17, 23, 11, -49, -37, -22, 1, -48, -37, -15, -117, -17, 69, -25, 3, 18, -12, 0, -23, 70, 67, 18, 4, +-19, -6, -27, -13, 1, -10, 34, 14, -14, -4, 14, 12, 24, -20, -42, -36, -3, 26, -2, -14, 34, -2, 4, 11, -18, 15, 0, 0, 24, 47, -17, 53, -6, -2, -6, -16, -2, 23, 6, -30, 61, -14, 17, 26, -42, -13, 53, -41, -17, -30, -2, -28, 11, -2, -21, -30, -5, 8, 26, -3, 127, 57, 12, -7, 5, -3, 29, 11, -8, -66, -11, 66, 57, 18, 40, -10, -4, -21, -27, 104, 35, +12, 51, -42, -50, 7, -12, -16, -24, 98, -42, -18, -26, -43, 49, 27, 83, -12, 46, -55, -67, 91, 14, -103, 80, -6, 19, 47, -17, 108, -39, -39, -48, -70, 57, -17, 26, 70, 44, 22, -40, -66, -43, 24, 42, 46, -42, -13, 27, -11, 38, -20, -25, -8, 7, 5, 28, 39, 19, 41, -23, 96, -27, -23, -10, -33, 19, 34, -3, 33, 33, 28, -19, 47, 2, -15, -12, 18, 0, -15, 42, 3, +51, -21, -22, -1, -2, -9, 31, 25, -15, 5, -8, -18, 22, -35, -18, -19, 53, 20, 15, 30, 15, -7, -1, -13, -26, 27, 5, 62, -23, -57, 13, 70, -13, -6, -45, -17, -11, 2, -54, 2, 55, 48, -30, 44, 11, 28, -19, -34, -48, 13, 37, -11, 26, -12, -21, -6, -22, 20, -26, -27, -43, -22, -31, -38, 29, -17, 0, -13, -33, -42, -6, 3, -9, 58, -12, 66, -19, 20, -3, -46, -15, +122, -37, 4, -26, -10, -31, 76, 3, -32, -20, 40, 21, 4, 85, 49, 4, -20, -33, -7, 2, -3, 23, -1, -4, 21, -2, -9, 34, -6, -32, -17, -8, -37, -17, 18, 39, -18, -25, 9, -31, 4, 9, 18, -27, -4, 37, 13, 26, -26, -25, 14, -44, -28, 19, 5, 9, 59, 8, 0, -46, -27, 37, 14, 8, -11, -16, 14, 17, -4, -23, -7, -26, -12, 48, -19, -18, 1, 34, 15, 24, -21, +-11, 17, -57, -29, -5, 8, 24, 49, -22, 25, -12, 5, 74, -13, 24, 7, -11, -13, 16, 13, -22, -22, -35, -21, 59, -13, 32, 29, -32, -22, 3, -33, -26, 2, 18, -47, 56, 24, 25, 34, 77, -26, 50, -8, 11, -8, 46, 79, 13, -33, -49, 41, -3, 30, -27, -50, -4, 88, -20, 64, 15, 61, -15, -29, -9, 9, -16, -20, 25, 4, -28, 93, 12, 11, 4, -54, 17, -36, -12, -53, -2, +56, 53, 20, -25, -59, -66, -28, 66, 76, 24, 56, -2, -17, -7, -7, -3, 22, -1, -39, 11, 35, -7, -25, 37, 44, -9, -9, -18, -22, -44, -1, -50, -5, 49, -6, -24, -6, -14, -15, 21, -21, 27, -23, -12, -4, -1, -6, -21, 20, 12, 1, 11, -2, -3, 11, 20, 6, -13, 34, -4, 10, 10, -14, -26, 6, -29, -10, 16, -24, -18, -1, -42, -20, -1, 105, -12, 57, -9, -3, 15, -48, +-10, 3, -1, 39, 17, 7, 57, -1, 39, -21, -1, -10, -36, 44, -40, -13, -9, -3, 19, 33, -74, 51, -34, 4, 13, 30, -9, -16, 4, 11, -12, -9, -10, -3, 22, 24, 4, 1, 9, 20, 0, 19, 12, 4, -11, -4, -57, -26, 23, 6, 15, -32, 16, 4, -27, 32, -6, 49, 9, -21, -7, 51, 2, 17, -10, -14, -5, -11, 1, 20, 24, 5, 41, -20, -25, 8, -38, 60, 4, -42, -4, +-20, 5, -80, -30, 1, -53, 6, -15, 17, -59, 21, -31, -38, -127, 64, -21, -45, -38, -52, -6, 12, -42, -15, 118, 31, -17, -9, -62, 16, -26, -55, -35, 0, 15, 22, 16, -64, -11, -49, -36, -11, -37, -37, -33, 2, -34, 46, -5, -58, -13, 12, 9, 37, -21, 23, 17, -26, -37, -28, -75, -17, -29, -19, 21, 6, -53, 69, 69, 92, 47, -32, 14, -42, -5, 7, -10, -18, 4, 56, -21, 2, +41, 16, -43, -21, -11, 2, -7, -10, -16, 24, 29, -1, 25, -43, -15, 9, -11, -22, -31, 15, 52, -54, 47, 31, -2, -23, 7, -29, -22, 38, -10, 5, -2, 2, -21, 22, 4, 14, -13, 7, -9, -21, -5, 34, 21, -2, -47, -22, 9, 14, -21, -19, -6, -24, -52, -35, 3, 35, -3, -40, -61, 117, -4, 41, 66, -30, -4, 11, -9, 9, -11, -2, -60, 30, -35, -17, 30, 1, -23, -36, 7, +-39, 26, 0, -10, -36, -14, -12, -32, 27, -40, -4, -45, 103, -33, -9, 7, 11, -31, -33, -10, -1, 32, -17, -13, 82, -51, -4, -9, 10, 20, 86, 37, -56, -49, 82, 127, -61, 26, -6, -13, -15, -7, -6, -43, 60, -2, -17, 0, -1, -19, 15, -4, 7, -31, -5, -20, -4, 5, -17, 25, -4, -8, 7, 0, -1, -14, 1, 10, -5, 66, 3, -15, 14, -19, 50, -58, 41, -42, -8, 43, -12, +18, 5, -3, 4, -16, 3, 19, -20, -3, -27, 9, -15, -20, -28, 8, -20, -58, 35, 9, -3, 33, 10, -10, 15, 1, 70, -22, 32, -7, -14, 26, -18, 8, 20, 5, 7, -26, -14, 14, -19, -42, -32, -45, -6, -4, -37, -6, -7, -35, 21, 20, 2, 60, -25, -4, 7, -27, 0, -92, 57, 60, -39, -4, -35, -7, 40, -13, 16, -31, -4, -10, 42, 36, 49, -22, -26, -30, 14, 1, -27, 33, +45, 82, -36, 10, -12, -21, -16, 19, -22, -38, 25, -36, -9, 26, -30, 14, 12, 2, -46, -2, -16, -29, -36, 8, -46, 79, -8, 19, -40, -31, -28, 35, -12, 35, -43, 12, -6, 73, -31, 106, 19, 32, -24, 35, -14, 1, -2, -42, -12, -8, 46, -10, 8, -23, 30, 7, -11, 10, 20, -15, -23, 6, 15, 0, -8, -9, 19, -17, -11, 127, -10, 71, 2, -9, 25, 0, -18, -19, 25, 22, -34, +22, 44, -15, -19, 3, 21, -16, 37, -24, 34, -22, 2, 5, -24, 5, -10, -16, 16, 9, -1, 127, -25, 56, 12, 9, 43, 5, -20, -10, 46, 12, 26, -38, 94, 38, 7, -32, 16, -36, 82, -5, 49, -43, -9, -6, -42, -38, -28, -34, -5, -8, -9, 127, 12, 16, -20, -26, 3, 11, -6, -20, 26, 14, 26, 27, -3, 24, -1, -7, 13, -18, 7, -3, 27, -2, 37, -17, 5, 2, -1, 39, +11, -20, -19, 66, -30, -12, 18, -30, 11, -2, -23, 21, -30, -39, 11, 56, 42, 9, 15, -36, 32, 0, 18, 29, 56, -9, 33, 14, -11, 15, -40, -24, -7, -6, 26, -8, 46, -52, -39, 49, -29, 47, 22, -5, -1, 78, 51, -23, 14, 14, -32, 106, -27, -24, 3, -15, -24, -61, 9, -32, -17, -73, 58, 23, -13, -49, 67, 42, -38, 64, -64, -19, -28, 9, 90, -15, -27, -63, -13, 65, 127, +-22, 2, -41, 29, -17, 34, 32, 73, 34, -81, -6, -34, -96, 18, 115, 6, -9, -10, 30, -25, 61, -4, 8, 27, -3, 127, 18, -7, 18, -14, -21, 33, -4, 22, -22, -26, -12, 42, 30, 29, -16, -19, -22, -9, -24, 17, -9, 61, -32, -3, -8, -12, 6, -10, -15, -6, 25, 103, 2, -29, 26, 75, -23, 127, -10, -18, 21, -18, -19, 17, -1, 23, 17, 28, -15, -17, 64, -8, -11, -7, 41, +13, 55, -60, 9, 51, -20, 13, -5, 16, 1, 11, -19, 24, 25, 22, 4, 21, -8, -10, 29, 8, 3, 54, 12, -34, 12, -21, -20, 19, 14, -13, -21, 11, 45, -30, 123, 19, -32, 26, -58, -18, -22, -35, -29, -9, 29, 104, -24, 13, -36, -45, -21, 14, 15, 17, 25, 1, -19, -40, -113, -14, 71, -4, -21, 34, -5, -21, 67, -31, -11, -8, 11, 127, -26, 2, 12, 9, -32, 53, 9, -16, +-21, -39, 1, 14, -4, 47, 59, -22, 9, -10, -13, 28, 54, -31, 15, 38, 40, 35, 11, -20, -18, 25, -6, 84, -33, 22, 0, 15, -31, 106, 10, -13, -18, 37, 1, 7, -7, 44, 6, -17, -14, -31, -15, 4, -3, -17, -25, 53, 24, 19, 35, -13, -13, 28, 6, 65, -3, -2, -18, 33, -50, 81, -16, -5, -21, 4, -21, 18, -3, 51, -13, -29, -32, 4, -22, 3, -16, -13, -28, -27, 89, +-22, 110, 24, -24, 8, 12, 37, -16, 51, 9, -55, 46, 104, -43, 16, -8, -11, -39, -13, 42, 37, -16, 19, -72, -41, -38, 65, -14, -46, -40, 127, -15, 17, 36, -39, 31, 47, 32, 75, 7, -1, 0, 11, 26, 88, -25, -23, -13, -10, -29, 33, 8, 58, 3, -15, 17, -34, -29, 52, 30, -12, 27, 9, 18, -36, -26, 46, 17, -28, -11, -6, -11, 4, -12, -7, -4, 34, -13, -17, -19, 10, +-14, -16, 57, 12, -31, 17, -9, 33, 62, -34, -11, -11, 16, 5, 3, -13, 3, -7, 2, 16, 16, -20, 2, -1, -13, -19, 25, -4, -17, 10, -15, -3, -25, 5, -19, 22, -26, -3, 8, -2, 28, -29, 33, 7, -12, -17, -12, -30, -6, -8, 6, 46, -2, -27, 30, 33, -7, 9, 7, 1, 23, -22, -43, -6, -18, -4, -26, 65, -14, 30, -14, -21, -4, 63, -8, -10, 16, -15, -7, 3, 13, +14, -12, -3, -7, -17, -5, 3, -20, -27, 5, 0, -24, -4, 6, -19, -17, -15, -2, 4, -7, -7, 9, 10, -17, -19, 30, 33, 17, -16, 21, -10, -11, 5, 1, -2, 4, -25, 0, 20, -27, -33, -11, -6, -4, 78, 12, 62, -24, 2, -23, 21, -29, 20, -12, -18, -8, 123, -26, 15, -67, -3, 85, -12, -51, -44, -42, 0, -10, 20, 15, 16, 44, -48, -4, 30, -32, 31, -3, 71, 28, -67, +-35, 24, 100, 27, -28, -60, 14, 85, 13, 10, 63, -68, -14, -42, 102, 95, -61, -25, -28, -47, -24, -59, -19, 30, 118, -51, -7, 21, -31, -87, 18, -37, 10, 29, 4, 9, -97, 57, 0, 5, -17, -41, -43, -23, 21, 19, 57, -3, -13, -14, -4, -24, -19, 5, -25, -25, 50, -34, -2, 9, -12, 17, -5, -34, -45, 11, -24, -23, -23, -12, -24, 10, 26, 0, 10, -10, -28, 1, 20, 9, 15, +-18, -31, -19, 11, -13, -5, -30, -13, -2, 59, 42, -22, -12, -23, 12, -23, 14, 30, 30, 26, -22, -14, 42, -19, -25, -11, -71, 13, 5, 55, 43, 46, 31, 23, 13, 6, -50, -6, -24, 27, -7, 15, -12, 31, 51, -12, 5, -10, 49, -44, 3, 72, -10, -23, 8, -14, -10, 64, -28, -48, 16, 123, 77, -17, 16, -48, -14, 38, -8, -26, -33, 19, -15, 7, 20, -18, 22, 26, -25, -56, 20, +5, 5, -56, -5, 9, 29, -52, -11, 3, -2, 6, -7, 65, 23, 13, 14, -10, -29, -16, 36, -17, -3, 3, -37, -5, 26, -22, -10, -4, -24, 3, 38, -30, -9, -24, -4, -30, 4, -14, -4, -9, -11, -27, -32, 58, -2, 19, -30, -25, 2, -28, -19, 9, -28, 29, -19, -16, 45, 31, -33, 20, -41, -2, -7, -7, -6, -30, 48, -1, 32, -26, -10, 41, -12, 8, -24, 31, -11, 6, -50, -22, +-14, -4, -11, -3, -34, 27, -9, -4, 43, 25, -22, 5, -45, -5, 3, 17, 23, -32, 26, 7, 33, -34, -28, 19, -33, -21, 27, 64, -24, -26, -39, -7, -34, 22, -8, -34, -2, 62, -20, 2, 44, 3, -23, 15, -45, -11, -19, -20, 22, -64, 33, -11, 49, 9, 0, -24, 23, 21, 55, 53, 16, 10, -12, -15, 22, 48, -29, -27, -11, 70, -16, -17, -29, 23, -61, -13, -77, -15, -10, -25, 2, +-44, 25, -11, 26, 5, -10, -8, -31, -14, 23, 27, 15, -6, -5, -40, 1, 18, 1, -11, 48, 2, 10, -43, 14, 9, -10, -7, -28, 11, -29, 1, -14, -9, 10, -33, 6, 9, 19, -6, -9, -15, 6, -13, -12, -2, -21, 20, 11, -7, -8, -18, 20, -27, 18, -2, -15, 18, -29, -8, 14, -25, 2, -12, -2, -8, 26, 27, -3, 3, 8, 43, -18, -22, 44, 54, -67, 57, 6, -38, -2, -22, +-17, -5, 31, 55, 66, 2, 14, 10, 20, -37, -33, -1, -4, -43, -7, 18, 99, 32, -6, -21, -9, 2, 6, -6, -26, -27, -10, -6, -3, -6, -20, -8, -21, -14, 11, -19, 35, -19, 17, -7, 1, -23, 19, -16, 13, 14, -15, 14, 2, 19, 22, -11, 4, 28, 0, -13, 30, -15, -10, -1, 1, -29, 10, 15, -4, -35, 39, -12, 38, -5, 16, 18, 12, 8, -22, -9, -40, -22, 27, 11, 29, +-9, -10, 5, 4, 28, 35, -23, -24, 65, -31, 40, -60, -71, 19, 41, 65, -22, 16, -119, 34, 29, -9, 34, 64, 16, -28, 60, 9, 66, -13, -19, 93, 49, 13, -20, 9, -13, -15, -3, -21, 11, -49, 0, -11, 0, 3, -27, -62, -54, 16, -3, -46, -30, -23, 16, -62, 54, 15, 37, 39, -7, -8, -46, 84, -54, 9, 40, 2, -12, 6, -20, 9, 9, -29, 1, 1, -18, -2, 14, -14, -23, +5, -17, -29, -19, 4, 7, -20, 1, -28, -19, 24, 5, 15, 15, -14, -8, -4, -27, 0, -18, 9, 4, -16, -10, -11, -1, -15, -37, 2, 17, -5, -23, 29, 3, -17, -28, 3, 33, -41, -16, -41, 18, 9, 5, -7, -30, -12, -14, -11, -2, 15, -23, 48, -15, 0, -21, -47, -23, -53, -9, -33, -20, -25, 2, -14, 11, -25, -12, 17, 24, 2, -4, -20, 74, 37, 21, -3, 26, 72, 13, -39, +-12, -14, 36, -42, 7, 9, 21, -23, -18, -9, -17, 11, 17, 110, -30, 14, -12, -63, -54, 2, 81, 17, -35, -48, 84, 56, -32, -28, 7, -17, 57, 26, -3, -34, -7, 7, -18, 12, -13, -31, -35, -13, -9, 36, -8, -42, -19, 0, 4, 6, -22, 24, -10, 9, 11, -3, -21, 15, -6, 1, -6, 57, -55, -22, -11, 3, 10, -4, -30, -2, 8, -27, -6, -15, -29, -9, -36, -35, -28, 15, 23, +30, -39, -38, 47, -20, 20, -9, 63, 29, 8, -36, -20, 80, 29, -10, 9, 13, -4, 11, -17, 11, 3, -21, 4, -36, -35, 4, -37, -26, -35, 38, -2, 36, -27, -13, 24, -29, 4, -2, 59, 58, 12, 2, -10, 80, 11, 0, 5, -2, -7, 46, 32, -19, -4, -33, -68, -21, -36, 53, -9, -3, -13, -7, -2, -33, 11, -19, 71, -9, -55, 9, 40, 127, 27, -29, -51, 5, -7, -19, -12, 45, +-29, -17, -25, -3, 1, 6, -20, -25, 0, -4, -10, -16, -12, 47, -14, -42, 22, -41, 16, -46, 29, -17, 3, 42, 17, 4, 47, 85, -2, 42, -4, 7, -24, 39, 3, -31, -8, -2, -15, -7, -5, -6, 0, 0, -25, 7, -28, -17, -5, 90, -11, 34, -12, 14, -29, 19, -6, 48, -17, 35, 21, 3, 51, 22, 1, 2, -14, -12, -29, -8, -3, -23, 26, 32, -24, 13, 3, 0, -18, -37, 2, +19, -15, 27, 17, -2, 4, -17, -11, -10, 9, -16, -5, -6, 16, -21, -22, 22, -37, -25, -23, -31, 11, 62, -23, -23, 13, 37, 23, -49, -82, -7, 20, -33, 27, 32, -27, 23, 10, 13, -11, 69, 4, 23, -37, -52, 3, -34, 1, -28, -1, 3, -24, 23, 7, -27, 10, 15, -13, 2, 22, -15, -42, -13, -11, 2, -38, 21, 23, 4, -1, -18, -20, -1, 4, 9, -37, 30, -4, -11, -16, 58, +-10, -19, 9, -26, -23, 12, -33, -24, -10, -15, -30, -50, -25, 17, 3, 78, -3, 25, 0, 14, 30, 56, -5, 7, 14, 27, 36, 19, -25, -6, -21, -14, 21, 4, 14, -25, -31, 11, -6, 30, 54, -16, -81, -21, 22, -25, 119, -5, 17, -59, -19, 64, -22, 45, 14, 32, 93, -7, -52, -16, -39, -4, -10, 4, 12, -13, -32, -54, 23, 2, -35, 11, -47, -82, -32, -33, 65, -64, -26, 86, -15, +-22, 51, -23, 22, 50, -70, -5, 16, -23, -47, 104, -11, 33, -14, -15, -41, -21, -10, 8, -14, 7, -18, 15, -5, 50, 29, -28, -5, -30, -21, -9, 30, 14, -29, -6, 79, -3, -18, -28, 7, -14, -30, -2, -38, 20, -53, 20, -29, -28, 0, -1, -22, 60, -7, -28, -27, -7, -8, 5, 9, -20, -21, -15, -5, 13, -7, -40, -3, 28, 27, -18, 17, 16, 8, 56, -3, -7, -4, 90, -7, -10, +1, 9, 20, 27, 13, 19, -10, 51, 8, 12, -26, -39, -49, -19, 35, -12, -38, 35, -7, -33, -41, -66, 9, -27, 27, 13, -11, 0, -76, 58, -20, 39, 37, 29, -3, -22, -35, 42, 11, 18, 25, 86, 17, -1, -33, 3, 29, -2, -86, -10, 50, 13, -64, 1, 51, 10, 32, -3, -6, -16, 2, 0, 28, 5, 9, -20, 24, -6, 3, -13, -7, -5, -1, -25, -37, -7, -7, 40, 2, -4, 2, +1, 7, 5, -34, -13, 18, -23, -39, 52, 6, 0, -5, 78, -15, -24, 9, -1, 12, 37, -14, 12, -56, -26, 13, -30, 13, -12, -31, -26, -48, -2, -29, -25, 14, -10, 29, -18, 30, -15, -32, 88, -26, -7, 1, 126, -4, -31, 19, -13, 0, 44, -9, 43, -39, -21, -9, -25, -2, -3, -27, -18, -32, -19, -29, -14, -9, -9, 18, -30, 24, -21, -9, 51, -7, -6, -33, 64, -11, -24, 81, -15, +3, 33, -29, -47, -39, -50, 20, -40, -17, -44, -35, -41, -38, -19, -78, -3, -47, -38, 38, 10, 27, 14, 11, 34, 15, 17, 6, -19, 2, -45, 5, 43, -2, 33, -28, 64, -35, -32, -32, -51, 4, -28, -21, 7, -13, 6, -23, 27, -21, -2, -26, -32, 0, -17, -15, 17, -17, 2, -8, -12, -2, -19, -1, -4, -16, 127, 12, -22, 10, -6, 3, -1, -26, 2, -5, 67, -16, -16, 47, 61, -7, +-16, -7, -9, 19, 70, 72, -27, -21, -9, 54, -36, -19, -46, -19, -6, -12, 86, 42, -25, 20, -16, -1, -17, -21, -14, -27, 5, -4, 10, -33, 62, -7, -18, -11, 8, 5, 38, 127, -38, -11, -30, 62, -40, -41, -88, -9, 21, -8, 83, -10, -67, 1, -51, 26, 4, -105, -29, -25, -83, -1, 25, 27, 86, 2, -40, -41, 24, 19, 127, 116, -15, -2, -28, -4, -6, -33, -54, -15, -8, -20, 107, +24, 1, 7, -25, -22, 46, -41, 8, -15, 6, -29, 11, -17, 37, -19, 1, -3, -10, -5, 17, 127, -31, 1, -10, 66, -20, -24, 12, -16, -41, -12, 91, 13, -9, -10, -29, 14, -3, -16, -22, -51, 11, -18, 65, 9, 93, 41, -44, -27, 27, -6, 56, 109, -43, -19, -21, -28, -22, 1, 39, -17, 7, -23, 48, -16, -15, -2, 9, -8, -2, -17, 4, 18, -20, -15, -21, -5, 25, -13, -32, -5, +-1, 0, 5, 27, 9, -16, 15, 27, 0, -14, -15, -15, 31, -13, 14, 29, -42, -1, -45, -19, 12, -47, -3, -3, 30, -18, 5, -21, 32, -16, -19, 0, -14, -9, 2, -1, -12, 18, -13, -10, 39, -16, -21, -6, -24, -21, 113, 26, -15, -19, -13, -15, 11, -94, -26, 13, 70, -9, 21, -14, 15, -13, -17, 17, -37, -3, 12, 127, 44, -8, -32, 38, -5, 21, 61, -8, 14, 7, -40, 26, 0, +30, 6, -60, 33, 29, -92, 56, 33, 27, -34, 101, 8, -24, 3, -2, -9, -11, -81, -9, -14, 2, -19, -9, -18, -7, -32, 10, 6, -8, 127, 23, 14, 14, -2, -2, 24, -26, 21, -11, 3, 3, -15, 21, 40, 7, 4, 20, -29, 20, 33, 50, -12, -16, -3, -19, -44, 55, 3, -30, -36, 32, -46, -9, 32, 38, 66, 35, -28, 27, -35, -26, -21, -32, -38, 42, -60, -38, -8, -48, 47, -10, +-17, 9, -40, -39, -38, 2, -18, -26, 19, -31, 27, -5, -24, 11, -42, 32, 14, -68, -32, 19, -25, -7, -42, -21, -42, 50, -31, 9, -14, 36, -8, -19, -43, -3, 34, -35, -41, -32, 4, 25, 6, 12, -14, 25, -21, 27, -13, -44, 49, -10, -1, 75, -34, -11, 6, -25, 15, 8, -40, -28, -39, 39, 14, -13, -32, -31, -24, -44, 14, 2, 29, 65, -1, -11, -6, -9, -8, -11, -1, 17, 39, +10, 43, 32, -10, -53, -10, -30, 13, 32, 3, 19, -42, 15, -12, -27, -31, -28, -7, -45, 46, -19, 32, -27, 33, 16, -32, -23, -12, -10, -13, 32, 2, -7, -20, 29, 13, 9, -20, 15, 4, 39, -28, 53, 21, -3, 46, -16, -10, -3, -21, -15, 0, -44, 34, 10, -14, 16, -22, 7, 7, -22, 10, 43, -42, -19, -28, 27, -61, 29, -47, 1, 53, 2, -46, 23, -23, -5, 1, -8, -24, -19, +-28, -36, 0, -24, -16, 3, -28, -2, -28, 6, -36, -18, -11, -32, -4, -5, 29, -15, -26, -20, -6, -37, 9, -17, -10, 33, 52, 4, -18, 45, -31, 23, 13, -18, 30, -21, -6, 28, -17, -16, 7, -40, 48, -27, 9, 8, 27, 16, -11, -2, 9, -45, 11, 30, 12, -8, -20, 34, 20, 14, 29, 2, 20, -16, -16, -13, 31, -3, -24, -10, -30, -34, -12, -39, 51, -38, -46, -47, 73, -10, -28, +-6, 0, -52, -6, -25, 27, -3, 5, 18, -19, 11, -20, -23, -2, 2, -16, 10, -41, -17, -10, -26, -11, 22, 18, -10, 31, -7, 5, 18, 43, 60, -32, -16, -11, -18, -28, -14, 24, -16, 17, 67, 72, -28, -3, -2, -41, -25, 3, -34, -18, -12, -38, 9, -49, 3, -24, -29, 12, -41, -12, -34, 68, -5, -54, -41, 14, -12, -17, -44, -15, 2, -3, 27, -50, -26, -47, 26, 0, -15, 4, 24, +8, 17, -19, -35, -12, -1, -3, -26, 16, -17, 2, 27, 12, 14, 16, -6, -18, 5, 32, 4, -20, -24, -4, 28, 12, -3, 14, 11, -8, 23, 7, -21, 0, -42, 0, 31, -23, 15, -4, -14, 25, -4, 8, -29, 97, -4, -13, 26, -10, -20, -6, 0, -11, 20, -17, 50, -4, 2, -26, -13, 12, -13, -32, 8, 9, -15, -11, 4, -23, 6, 16, -4, 10, -29, 19, -13, 27, 56, 10, -29, -43, +-34, 4, -17, 13, -60, 31, 93, 23, -25, 25, -13, -26, -7, -19, -1, 2, 22, 8, -32, 1, 22, 105, -33, 0, -53, -73, -23, -22, -15, 73, -12, 26, -48, -23, 4, -80, 4, -39, -37, 18, -22, -16, -17, -28, -65, -9, -49, -40, 18, 8, 2, 4, 1, -3, 3, -12, -23, -14, -12, 15, -7, 22, -19, 5, 5, -32, -23, 14, -46, 3, 26, -11, -8, -10, 40, -19, -5, 15, -14, 28, -2, +-16, 1, 46, 9, -23, 12, 44, -29, -57, -27, -60, -48, 12, 7, -35, -37, -58, -3, -52, -9, -40, 32, 79, 39, 14, -32, -15, 10, 49, 9, -28, -19, 6, 43, -48, -15, -39, -15, -17, -29, -30, -65, -28, -36, -58, -39, -20, -22, -33, 14, -9, 5, 56, -1, 19, -9, 17, 32, -29, -60, 36, 0, 12, -22, -27, 16, -1, -11, -84, -36, -29, -58, -44, -79, -6, -10, -6, -8, 17, -20, -25, +24, -19, 26, 67, -16, 6, 3, -15, 4, -22, 14, 29, -10, -1, -22, -18, 0, -18, -36, -20, 32, -3, -30, -53, -5, -38, -2, -36, 0, 15, -2, -25, 18, -15, 2, 19, 18, 59, 16, -27, 33, -18, 51, -15, -21, 30, 13, -9, -25, -10, 24, 17, -36, 14, -8, -13, -25, 34, -4, 17, 28, 2, 51, -34, -14, -32, 7, 6, 55, 17, -9, -25, -4, -36, -28, 16, 26, -47, -27, 13, 3, +-17, 65, -24, 7, 22, -28, -9, -14, 14, -20, 12, 33, -2, 47, -8, -19, -81, -13, -22, 4, -32, 13, 95, -26, -36, -12, 8, -8, -10, -8, -16, -13, -18, 14, -19, 11, 9, -9, 12, 35, -26, -8, -12, 16, -7, -8, -8, -5, 4, 11, -18, 19, -22, -2, 48, -14, 16, -20, -10, -9, -28, -36, -3, 0, -16, 13, 18, -17, 15, -13, 13, -2, -8, -2, -6, -14, -6, -18, -6, 30, 18, +-23, -7, 22, -4, 21, -33, -17, 30, 9, 23, 45, -57, -45, 9, -5, 11, 5, -1, -30, -12, -11, 41, 39, -28, 13, -22, 12, -6, -5, -58, 41, -9, -39, 24, 17, -15, 16, -44, -22, -42, 34, -19, 90, -60, -19, -18, -18, -2, -8, -13, 18, 30, -22, -6, 14, -30, 14, 9, -30, -1, -10, 3, -29, 37, 23, -13, 44, -16, -5, 17, -27, 6, -2, 10, -4, -33, -15, 23, -3, -26, -8, +-4, 24, -13, 18, -24, 27, -9, -19, -26, 37, -17, -11, -25, 0, -16, 1, -57, 39, -13, 63, -29, 27, 17, -21, 54, 20, -72, 10, -5, -4, 14, 34, -7, -16, -4, -6, -6, 6, -10, -17, -15, -16, 0, -13, -12, 6, -17, -11, 5, -7, -4, -2, -7, -16, -5, 33, -5, -3, -15, -30, 31, -9, -27, 38, -21, -12, 6, -20, -7, -7, -21, 40, -4, -33, -3, -1, -5, -14, -3, 15, 28, +-6, 9, -14, -24, -13, -7, -10, -19, -5, -52, 10, -39, -7, -13, -15, -29, 13, 33, -24, 35, -3, -43, 6, -8, -1, -20, 48, -1, 27, 24, 27, -27, -11, -8, -2, -28, -7, -14, 8, -28, -22, -47, 27, 10, 18, 29, 127, -8, 33, 18, 6, -67, 20, -44, 19, -51, -7, -12, 54, 69, -8, -3, 4, -31, -8, -1, -40, -17, 51, -52, -15, 15, -13, -39, 1, 34, 11, 3, 28, -25, -12, +7, 11, 3, -5, 15, -8, -14, -14, 14, 12, -5, 28, 15, 1, -11, 7, -17, -23, -18, -4, 1, -11, 3, 0, -4, 81, -2, 49, 53, 24, 18, 84, 16, 11, -27, 37, 8, 37, 11, 57, 5, -56, -60, -1, -52, -57, 17, 12, -28, -38, -37, -48, -32, -9, 1, 83, 31, 36, -58, -52, -29, 24, 2, 106, 34, -13, 13, -5, -37, 75, 50, 127, 6, -26, 88, 22, -23, -2, 25, -28, -14, +22, -55, 11, -15, 84, -8, 11, 58, 18, -14, -54, -14, -8, 10, 19, 5, -61, 8, -34, -2, 91, 5, 25, 23, -34, -31, 3, -44, 62, 27, 42, -16, -29, -27, -16, -19, 76, 3, 59, 97, -3, -27, -31, 5, 24, -5, 101, 42, -22, -50, -20, 29, 12, -46, 17, 33, 20, -36, -54, 10, 2, -3, 55, -4, -27, -32, -8, -11, -20, 5, 22, 22, 12, 23, -14, -29, -6, -11, 18, 7, 4, +-2, -4, -56, -5, 22, -5, 25, 44, -11, -21, -51, -23, -34, -25, 33, -13, -9, -20, 19, -8, 4, 81, 83, -11, 26, 0, -26, 19, 2, -15, 2, 6, 1, 46, -41, 16, 49, -13, -26, 20, -39, -3, -53, 60, -34, -8, 64, -5, 2, -10, -26, -5, -39, 117, 90, -4, -6, 12, -21, -13, 5, 20, 33, -18, -23, -6, -21, -6, -5, 27, -6, -27, -10, -21, 14, 12, -1, 20, -13, -10, -34, +-10, 11, -33, -7, -18, -10, -23, 18, 38, 13, 4, 6, -47, -26, 36, 6, -10, 13, -3, 34, -10, 44, 32, -5, 28, -28, 79, -2, -18, 12, 7, -23, -2, 6, -40, 10, -12, -30, -36, 20, 41, 70, 44, 16, -43, -51, 40, 28, -25, 4, -42, 6, -65, 1, 74, -38, -13, -53, 32, 4, -36, -5, 50, -12, -6, 21, -44, 9, 1, -9, -25, -3, 19, -21, -19, -7, -49, 8, 19, 37, 9, +-7, -4, 5, -18, -28, 7, 8, 24, -11, 20, -3, -16, 21, -23, -30, -3, 12, -52, -9, 11, -33, -55, 17, 23, 41, -22, 27, -7, 25, -17, -39, -19, 44, -36, 7, 43, 0, -48, 30, 21, -38, 66, 1, 4, 5, -9, -59, -57, -3, -11, 48, 11, -5, -6, 8, 22, -2, 20, 6, -7, -20, -2, -18, -4, -13, -16, -10, -2, 22, 5, 16, -2, -33, 25, -3, -8, -14, -16, -28, -11, 40, +-27, 4, -8, -7, -19, 11, 10, -22, 22, -6, -28, 7, 10, 4, 4, -3, 2, 20, 30, -12, -31, 9, 24, -18, 16, 1, 12, -17, 15, 4, -18, -59, -12, 2, -17, -4, -30, -7, -23, -11, -36, 7, 10, -2, -15, -31, -4, -8, 20, -16, -21, -30, 29, 4, 22, 14, 0, -13, 16, 35, -36, -48, 8, 47, 23, 26, -15, -32, -19, 13, 16, 74, -45, -14, -38, -24, 84, 16, -21, -33, 24, +32, -29, 4, -1, 53, -16, 60, -2, -51, 75, -1, -48, -54, 26, 23, -33, -11, 21, -18, -7, -17, 28, 0, -13, 6, -14, 12, -9, 2, -6, -23, -3, -19, 35, 11, 12, 11, -20, -22, 19, -6, 28, 15, 9, -16, -6, -3, 6, -1, -19, 31, 16, 63, -12, 92, 92, -41, 24, -44, 16, 70, 50, -48, 18, -12, -25, 65, 20, 78, -5, 80, 106, 6, -55, -7, 33, -2, -9, -67, 16, -44, +-68, -1, 24, 35, 14, 4, 53, -22, 43, -53, 42, -23, 28, -19, 73, -1, -19, 77, -25, 26, -13, -37, -71, 10, 28, -43, 13, -32, -71, -18, 44, -40, -9, -7, 59, 127, -4, -10, 116, -78, -43, -64, -21, 39, 37, -25, 31, -37, 11, 48, 2, 26, 7, -28, -40, -5, -48, -30, 63, -7, -22, -8, 34, -25, -20, -22, 11, -2, 34, -4, -2, -28, 3, -30, -38, -36, 38, 3, 39, 6, -4, +-44, 17, 79, -12, -4, -41, 11, -38, -15, 8, -8, 9, 9, 9, -52, 15, -22, 1, 13, -25, 5, -17, -21, 9, 17, 10, -12, -33, 9, 10, 25, 9, 1, 7, 1, -24, 17, -23, 9, -10, 64, 1, 37, 7, 15, -33, 12, -3, -27, 27, 40, 0, -18, 3, -2, -13, 5, -3, -55, 22, 6, 12, 0, 18, 41, 1, -3, -28, 22, 20, 9, -16, -33, 27, 29, 28, -32, -23, 22, -31, -44, +18, 41, 7, 3, -12, -21, 4, -7, 16, -40, -14, 42, -12, 6, 2, -15, -1, -5, 11, -12, -10, 19, -4, -22, -25, 5, 5, 0, -29, 41, -4, 0, -27, 49, -18, 30, -39, -34, 19, 26, -13, 2, -12, 38, 13, -1, 6, -29, -12, 8, 5, 28, -25, 9, -29, 61, -10, -1, -21, 41, -27, 12, 3, -28, -18, 78, 18, 26, -62, -25, 52, -21, -28, -20, 13, 39, 45, -16, -1, -33, 29, +14, 107, 111, -31, -30, 3, 85, -5, -12, -3, 69, 22, 58, -17, -36, 0, 29, 17, 19, -41, -70, 20, -23, -14, -31, -10, 52, -7, 1, -18, -36, -6, 30, 12, -17, -25, 16, -39, 3, 7, 7, 5, 8, -17, 19, -24, -10, -17, 25, -7, 9, -15, -25, 21, -18, -5, -14, -19, -11, 27, 41, -15, -22, -14, -29, 60, 11, 4, 17, -1, 51, -9, 0, 11, 26, -38, 5, -13, -13, -8, 0, +15, 22, 7, -17, 27, -17, -4, -11, -2, 46, 3, 12, -5, -4, 19, 26, 2, -10, -20, 8, -23, -12, 13, -1, -16, 7, -16, -2, -20, -16, -11, 70, 36, -6, -5, 9, 37, 19, -3, 25, -15, 47, 31, 13, 19, 25, -28, 2, 37, 13, -6, -9, 5, -26, 26, -16, 34, 8, 26, 20, 18, -19, 9, -7, 28, 3, -16, -39, 10, -12, -19, -19, -8, 30, -23, -2, -25, -33, -30, 20, -5, +-19, -21, 43, -6, 39, 23, -6, -2, -5, -58, 24, -34, -25, 32, 95, 27, -6, -55, 9, 14, 8, -11, -19, 57, -4, 25, 2, 43, 39, -27, -34, -23, 46, -8, -29, -9, 9, -39, -28, 105, -26, 10, -23, 90, -10, 4, 42, 43, 10, -3, -21, -8, -12, 9, -9, 5, 29, -8, 9, -21, -3, 12, 11, 2, -8, 5, 7, -15, -52, 8, -2, 24, -1, -21, 44, 1, -6, 16, -58, -6, -22, +13, -13, 6, -39, 12, 10, -7, 31, -13, -36, 91, 105, 53, -34, -9, 83, 27, 63, -4, 15, 53, 127, -29, -32, 27, -25, -23, -27, 57, -23, -17, 19, 14, -22, 19, 1, -12, -41, -18, 67, 23, 70, 92, 44, 53, 4, 24, 11, 25, 57, -35, 65, 10, 95, -1, 20, -33, -18, 11, -42, 23, -86, 21, -18, -25, -47, -17, 24, 3, -19, -9, 91, 40, 45, 100, 91, 46, -3, 45, -54, -17, +31, 12, 36, 20, 85, 1, -5, -39, -54, 43, -27, 32, -23, -17, -26, -4, -5, -25, -44, -8, -5, 14, 20, -18, 48, -16, 20, -12, -7, 2, 24, -33, 15, 67, 38, 68, 68, 19, 0, -18, -4, 12, 6, 17, -28, 127, -42, 60, -14, -32, 13, 13, -26, 8, 50, -51, -18, 13, 23, 47, 8, -71, 31, -30, 8, -8, 31, -40, 24, 24, -19, -5, 2, 37, 9, -8, -27, 94, -39, 127, -12, +23, 22, 25, -41, 8, 48, -37, -12, -6, 46, -3, -18, -33, 15, -1, 52, 42, 26, -13, 10, -9, -25, 70, -32, 8, -5, -7, -9, -12, -17, 12, 12, 23, 0, 5, -20, -9, 2, 0, -34, -29, 3, -20, -17, -12, 4, -1, 9, -9, -18, 9, -13, -14, -15, -5, 13, 20, 0, -31, -28, -15, -7, -13, 64, 26, -5, 15, -4, -31, -17, 7, 9, -23, -40, -21, -8, 17, 37, -21, 2, -20, +-9, -9, 26, -21, 16, 15, -31, -26, -11, -66, 25, -37, -16, -9, 17, 22, 41, -60, 24, 50, -28, -2, -24, 11, -50, -12, -2, 39, 5, -56, -27, -37, -26, 19, 69, -17, 14, -5, 46, 18, -39, 4, -12, -22, -26, 2, 30, 30, -19, -3, 7, -7, -33, -40, 46, -32, -28, -24, -6, -38, 38, 8, 5, -12, 1, -2, -11, -27, 5, -5, -9, 0, -8, -35, -29, -4, -18, 0, 5, 35, -23, +-20, -36, -8, -44, -26, -34, -19, -11, 13, 1, -24, 18, 0, 28, -20, 42, -35, 28, 9, 36, 75, 5, -6, 36, -6, -12, -2, -5, -18, -9, 0, 15, 16, 0, -2, -23, -16, -16, -7, 2, 1, -9, -14, 5, 3, 11, 10, 2, 21, 21, -17, -23, 15, -3, 9, 8, -2, -11, -25, 8, 73, 23, -21, -24, -2, -8, 22, -9, 1, 5, -2, -27, 1, 13, 30, 38, -14, -3, -11, 5, -6, +6, 11, 15, -23, 38, -12, -13, -17, -17, 1, -18, -3, 40, 58, 1, -50, 5, 15, 21, -8, -1, -22, 25, -32, -31, 37, 1, 5, -35, -13, -4, -21, -27, -21, -37, 2, 6, -5, 4, -43, -42, -70, 29, -23, -8, 13, 12, -47, 82, -50, 15, 66, -42, 110, -21, 49, -54, -8, -46, -19, -46, -29, 22, 8, 25, -27, 42, 66, -28, 0, -19, -14, 11, -32, -10, -19, 3, 24, 7, -5, 1, +-4, 13, 6, -46, -30, -19, 21, -15, 8, 2, -5, -10, -4, 5, -19, -20, 11, -22, -1, 15, -9, 97, 30, -39, -18, -21, 38, -15, -63, 13, -40, 5, 49, -19, -13, -60, -10, 5, -33, -22, 27, -42, 11, -39, -9, 59, -37, 29, -35, 18, -24, -29, 5, 20, -24, -42, 106, 4, 17, 48, -16, 29, -29, -35, -20, -36, 56, -37, -34, -33, -26, 22, 23, -9, -34, -37, -5, -11, -10, 31, -29, +69, -27, 31, 9, 34, 3, -32, 58, -9, -60, 48, -38, -5, -9, -42, 21, -18, 18, -56, -41, -6, -2, -17, 14, -47, -19, -67, -20, 42, -51, 24, 12, 9, -45, 48, 76, -48, 12, -15, -32, 6, -1, 22, -29, -1, 22, -1, 1, 22, -34, -19, 6, 0, -25, -13, 45, -16, -20, -3, -23, 29, -34, 14, 44, 28, -11, -3, -8, -1, 49, -46, -4, -36, 32, -32, 1, 47, 9, 18, 7, -5, +12, -66, -8, 18, -47, -5, -12, -33, -3, 7, -5, 69, -9, 10, -21, 17, -23, -47, -21, -2, 39, -17, 10, -7, 4, -44, 3, -2, 11, -42, 17, -17, -40, -58, -21, 4, -36, -17, -2, -35, 11, -10, 31, 33, -22, -5, -35, -4, 78, 3, -19, -5, -5, 5, -22, -30, -3, 16, 18, -19, 14, 15, -9, -2, 68, -18, 4, -8, -29, -50, -25, -39, -16, -11, -19, -23, -12, -8, 0, 3, 4, +-3, 33, 19, -26, 3, 30, -36, -19, 9, -4, -7, 9, 16, -18, 22, 36, 55, 77, -32, 6, 8, 5, 12, 10, -26, -9, -31, -3, -1, -23, 6, 24, -5, 42, 31, 69, 7, 59, -61, -13, 38, 9, -14, -25, -14, 2, -1, 15, 99, 118, -21, -19, 50, -72, 61, 15, -33, -22, -30, 14, -15, -20, -17, 55, 5, 32, -6, -10, 39, -35, -25, 0, 12, 29, -26, -10, 34, -26, 19, 88, 0, +75, -6, -45, 31, -12, -13, -7, -12, -24, -19, -23, 52, -28, 1, 49, 18, 0, 6, -15, -1, -5, -50, -13, 107, -33, 21, -30, -2, -11, -13, 117, 7, 127, -25, -31, 29, -34, -5, 3, -30, -13, -13, -39, -9, 25, 29, 47, 14, 48, 38, -13, -30, 26, 1, -22, -10, -15, -16, -19, 34, -7, -9, 5, 14, 13, -9, 127, -17, -8, -28, -22, -13, -1, -7, 12, -5, 5, -13, 4, 25, 14, +-2, 1, -2, 28, -22, -15, -21, 9, -24, -7, -6, -16, 2, 3, 15, 27, 7, -8, 0, 19, -5, 7, -59, -8, -5, -22, 5, 26, -11, 13, -23, -23, 6, 8, 36, -23, -19, -22, -5, 66, -18, -7, 53, -33, -4, 70, -70, 30, -17, -13, 10, 3, -39, -16, -42, -1, -30, -35, 51, -1, 5, 53, 37, 44, 11, 55, 12, 11, 44, -8, 14, 22, -49, 8, 54, 4, 21, -41, 36, -4, 118, +11, 1, -36, 41, -8, -8, 10, 116, 61, -14, 5, -30, -56, 7, 7, 22, -13, -14, -14, -22, -20, 7, 10, -2, 14, -5, -9, -3, 32, -13, -42, -14, 21, -18, -7, -6, 7, -24, -31, -16, -8, 33, -16, 7, -7, -3, 17, 9, 78, 24, 33, 23, -24, -24, -32, 5, -14, -3, -33, 1, -10, 55, -6, 103, -21, -22, -15, 2, 14, -15, 76, 18, -4, 17, 65, 75, -47, 69, -19, 50, 78, +-13, -18, 52, -18, 8, 1, 36, -18, 30, -50, 28, -49, 25, -18, 79, -42, -5, -18, 9, -7, 19, 32, -15, -25, -31, 22, 20, -7, -15, -19, 39, 68, 27, -5, 32, -88, -32, -25, -15, -2, 14, -5, -5, 7, 19, -10, 111, -42, -21, 28, 21, 39, -10, 25, 20, 8, -47, 42, 44, -11, -32, -19, 22, 71, 15, 3, 6, -15, -14, 6, 44, 29, -13, -7, -6, -23, -2, -13, 127, 8, -6, +17, -33, -22, -45, -22, 0, 32, -38, -9, 9, -20, 30, -33, 62, -6, -30, 0, 58, 24, -22, -9, 18, -3, 21, -17, -3, -45, 13, 20, 28, -51, 4, 11, -31, -19, -25, -8, -9, -42, -12, -42, -7, -16, 9, 8, -5, 9, -23, -11, 15, 16, 51, 0, -24, 0, 9, -19, -25, -17, 13, -16, 40, -54, 3, 7, -19, -1, -9, -27, -14, 13, -4, -26, 34, 20, -18, -10, -4, 3, 20, 0, +15, 6, 24, -10, 21, -24, -32, 31, 18, 16, 15, 23, 29, 30, -2, 9, -24, -25, 2, 27, -16, 25, 8, -44, 11, -7, 7, 8, -5, 10, 18, -24, 22, -26, -18, -20, 17, -11, 5, 26, -1, -18, 7, -8, 20, 29, -17, -12, -25, -62, -32, 22, 38, 8, 21, -23, -65, -2, 3, 1, 28, -34, -22, -24, -28, -66, 10, -36, 23, -13, -30, 76, -50, 30, -3, -3, -6, 12, -27, 27, -68, +-30, 5, 1, 89, -22, 32, -18, -41, -30, -33, -11, -7, 6, -29, -20, -7, -7, 0, -12, -28, -2, -25, 56, 5, 17, -15, 11, 28, 39, -22, -29, -17, -51, -13, 16, 2, -7, 10, 29, -24, 2, -3, 19, 11, -8, 27, -54, 18, -33, 51, -36, -5, -33, 6, 73, 8, 47, 57, 56, 25, 7, -25, -61, -68, -66, -6, 73, 7, 44, 50, 4, -39, -2, 9, 26, -25, -17, -13, 39, 53, -7, +-7, -2, 11, -23, -21, -6, -4, 6, 10, 11, 5, 2, 0, -11, -20, -36, -1, 19, 4, 30, -16, 51, 8, 1, -3, 1, -15, 11, 30, -7, -10, 2, -14, -21, -31, -15, -26, -10, 6, -12, 10, -17, -1, -24, 4, -9, -33, -16, -38, 9, -4, -2, 43, 13, 127, -25, -1, 15, 10, 11, -8, 7, -14, 30, 11, -7, -11, -5, -10, 38, -16, -5, 7, 9, 10, 24, -33, -32, -51, -52, -11, +38, 35, 16, 23, 15, -7, -3, 29, 13, 31, 72, -38, -34, -36, -36, -13, -48, 36, 10, 3, -31, 9, 6, 0, -29, 22, 34, 23, 21, -24, 1, -43, 21, -28, -30, 0, 48, -23, -72, -48, -36, 9, -24, 19, 11, -14, 14, -1, -16, -9, -9, -23, 42, -13, -8, 0, 27, 26, 13, -2, -8, -11, -13, -17, 11, 5, -4, 17, -25, -26, -15, 0, -32, -3, -14, -5, 22, -14, -30, -1, -31, +93, 38, 21, 9, 38, -62, -1, -24, -4, -25, 32, -76, 21, -12, 36, -24, -43, -74, -29, 43, 26, -9, -49, -9, -22, 45, 21, 83, -19, -32, 10, -28, 1, -35, 2, -32, 3, 21, -20, -18, -22, -50, 33, -7, -9, -48, 30, 50, 2, -47, 7, 56, -21, -66, -15, 33, 28, 23, -12, 47, -93, -32, 34, 7, 22, -28, 0, -24, -5, -10, -44, -16, 9, -28, 7, -10, 17, -17, -32, -24, -43, +6, -37, 39, -2, -39, 26, 43, -19, 99, -7, 16, -14, -20, 23, -26, 6, 44, 14, 5, -5, 12, 9, -38, 14, -7, 37, 17, 12, 19, -5, -14, -22, -35, 29, 11, -8, -24, 2, -24, -58, 4, -3, 12, 17, -70, 5, -31, 56, 12, 8, -42, -23, -17, 27, -20, -21, 7, 24, 10, 33, 32, 12, -8, -10, -34, -16, 0, 25, -4, -3, 47, -5, -11, -22, -6, -21, -31, -12, 3, 22, -12, +-12, -22, -1, 44, -33, -46, -20, -3, 35, 36, 34, -30, 8, 16, 15, -23, 26, -11, 5, 8, 49, 13, -30, 16, -10, 15, -38, -8, -51, 29, -21, -26, -16, 21, -23, 38, -7, 36, 4, 6, 120, -12, -29, -13, -28, -25, 27, -15, -12, -52, -21, 1, -86, -31, 7, 50, 0, 16, -5, -14, -22, -30, -3, 16, -34, 15, -17, 17, 1, 39, 1, -9, 37, -43, 10, -18, 6, -3, -7, -6, -9, +-30, -37, -30, -25, -25, 43, -20, -41, 31, 26, -9, -7, -34, 1, -13, -27, 12, 3, -19, 0, 26, -29, 6, 58, -68, 15, -42, 17, 5, 4, 54, -10, -7, -37, -10, 11, 15, 0, 32, -18, 14, -33, 37, -24, 54, -5, 47, -1, -15, 16, -14, -16, 50, -38, -17, 25, -33, -15, -3, -4, 9, 6, -12, -44, 27, -29, 5, -4, 8, -3, -11, 28, 21, -20, -25, -3, -6, -24, 54, 3, -11, +-18, -9, -15, 68, 21, -33, 66, 14, -32, -13, -28, 7, 4, 8, -18, 29, -27, -34, 39, 6, 0, -4, -19, 43, 69, 41, 24, 25, -26, 19, -21, 48, -68, 35, -19, 37, -34, -32, 33, 31, 1, -34, 12, 26, -15, -14, -2, -12, -4, -13, -36, -34, 54, -16, -31, 127, -2, 88, 2, 67, -28, 18, -15, 0, -31, 9, -11, 72, -9, -26, 1, 18, -22, -28, 8, -15, -21, 33, -30, 5, -53, +28, -4, -5, 42, -20, -21, -3, -13, 53, -10, -3, 7, -16, 7, -22, -38, -7, -2, 45, -16, -25, 6, -8, -19, -14, -1, -30, 17, -2, -25, -15, 4, -3, 0, -5, 11, -4, -29, -30, 4, 17, 32, 26, -13, 1, 10, 10, 10, 17, -34, -8, 7, -29, -38, -15, 16, 9, 28, -20, -2, -50, -23, 10, -15, 21, 68, 2, -19, -17, -69, 92, -7, 127, -18, 60, 15, -29, -32, -12, 4, -18, +-38, 59, -37, 16, 39, 0, 27, -4, 3, -27, 22, -76, -22, -46, 12, -37, 80, -28, -29, 17, -12, -10, 15, 68, 31, -77, -3, 42, -26, 63, 7, -24, -60, 82, 40, -19, 77, -18, -31, 10, -30, 46, 27, -29, 7, -10, -29, 7, 6, -18, -34, 0, 7, -16, -17, 3, -12, 12, 2, 3, 32, -6, -1, -18, -12, 37, 12, 32, 5, 0, 7, -13, 16, -2, -10, -13, 0, -3, 29, 40, -15, +-17, -12, 28, 16, -29, -28, -63, -18, -7, 50, -3, -23, 15, -31, 13, -31, -80, -24, -37, -17, 24, 16, 32, 19, 66, 11, -35, -7, -20, 4, -4, -27, -22, -33, -23, 87, 2, 24, 14, -49, 43, -16, -31, -21, 66, 22, -3, -33, -23, -16, -36, -22, -34, 24, -46, -26, -4, 12, 45, 53, 22, 64, 2, 34, -42, -9, 9, -45, -3, -33, 3, -6, -27, 45, 31, 53, -19, 5, -44, 38, 27, +12, -33, -14, 6, 20, 16, 12, 3, -9, 38, -24, 6, 6, -49, -35, -35, -18, 56, 9, 22, -28, 1, 29, 20, 127, 4, -19, 82, 8, -17, 5, -31, 21, -24, -33, 1, -11, 8, 45, -42, -23, -23, -28, 3, 43, 48, -30, -29, -15, -58, -25, 35, 19, -37, -19, -43, 1, -2, 31, 10, -9, 7, -51, 20, -9, -29, -31, -20, 25, 19, -46, 11, -42, 33, 38, -1, 22, 24, 52, 68, 1, +-33, 1, -1, -4, 10, 14, -22, -21, 22, -6, 2, -7, 3, 30, 7, 2, 0, 2, -11, 2, 2, -33, -4, 6, 17, -8, 4, 10, -21, 5, 4, -4, -40, 8, -9, 48, -47, -5, -42, 6, 19, 43, -1, -31, 14, 8, 49, -1, 7, -32, 4, 31, 89, -54, 10, 20, -6, 79, -10, -25, 13, -20, -34, -17, -17, -5, -7, 0, 86, 31, -20, -32, -9, 5, 9, -23, 4, 8, -1, 20, -26, +-4, -25, -23, 10, -5, -16, -15, 12, 37, -3, -5, 70, -16, 10, 15, -56, -7, 22, 0, 18, -9, -20, -39, 2, 23, -13, -4, -23, -32, 15, -17, -4, -1, -15, -7, 28, -25, 34, -20, -16, 1, -22, -7, 0, -3, 12, 31, -21, -28, 61, 16, -33, -27, -18, -5, 10, 54, -27, 3, -57, -28, -1, -57, -47, -5, 45, 7, 52, 30, -21, -31, -46, 16, 13, -39, 17, -3, -22, 23, -2, -55, +-9, -6, -4, -31, -40, 2, -31, -17, -11, -20, 1, -26, -8, -63, -53, -28, 35, -38, 0, -14, 31, -24, 14, -10, -2, -46, 7, -13, -11, -42, -26, -28, -15, 3, 28, -27, 23, -14, 15, -2, 20, 32, -18, -32, -1, -33, 20, 4, -2, -13, 20, 19, 20, -12, -13, -3, -22, -40, -16, 3, 19, -16, 21, -54, 4, 3, -3, -1, 14, -4, 9, 17, -20, 27, -30, -35, 46, 8, -27, -4, -32, +-34, -26, -8, 29, 9, -23, -30, -32, 32, 1, -14, -28, -1, -28, -11, -15, -4, -21, -16, -25, -45, -11, -6, -3, 35, 27, -25, 0, -60, -29, -11, -32, -50, -6, -42, -40, 17, 37, 6, -17, 14, -13, 16, -27, 19, -36, -37, 91, -42, -32, 10, 39, -12, 7, -17, -20, -2, -27, -8, -22, 15, -25, -9, -17, -27, -16, -23, -32, -15, -26, -35, -13, -26, 41, 75, -27, 12, -12, 12, 19, 14, +-30, 5, -19, -26, 11, 3, -1, 19, 5, -1, -29, -7, -13, 20, -34, -6, -6, -4, -26, -18, 1, -1, 2, -21, -3, -7, 2, 24, 7, 2, -35, 6, -9, -42, -9, 0, -21, -24, -11, 127, 64, 2, 24, 15, -11, -40, -17, 33, -30, 34, 51, -46, -4, -58, -25, -35, -16, 40, 8, 31, 37, 39, -46, -16, -30, 30, 9, -3, -67, 6, 71, -46, -11, 79, -23, -2, 21, 58, -23, 8, -14, +16, 32, -48, -41, 74, 21, -67, 104, 12, -32, 19, 51, -29, 1, -8, -11, -5, -6, 29, -37, 16, -15, 17, -11, 28, -13, -10, -20, 56, -39, 2, 28, 20, -18, -5, -41, -25, -6, -19, -11, -9, 1, 9, 5, 7, -15, -34, -15, 8, -41, -28, 13, -12, 57, 28, 30, 21, 6, 37, -27, 47, 72, -7, 3, 7, 62, 60, -41, -34, 12, 26, 0, 0, -43, 33, -18, 68, 48, -4, 25, -34, +-52, -38, -26, 24, -9, -35, -39, 77, -13, 30, -38, -9, 52, -47, 7, 27, 17, 10, -38, -41, -43, 8, 9, -26, -41, -71, -20, -10, -24, 49, 17, -36, 1, -13, 7, 20, -14, -13, 9, -22, -13, 21, 47, 14, -4, -15, -4, 44, -30, 32, -5, -18, -19, 11, -29, 26, -13, -35, -37, 29, -34, -23, 12, -28, -17, 7, -45, 15, 10, -37, 8, -7, -14, 103, 52, -41, -17, 20, 79, -17, 20, +85, -41, -19, -29, 18, -16, 20, -36, -67, -23, 6, -58, 17, -22, -21, -33, -4, -43, -7, 37, -25, -7, 46, -3, 28, -19, 10, 19, -25, -19, 42, 36, -6, -30, -19, -6, -2, -7, -39, 1, -42, -7, 26, -27, -17, -38, -38, -8, 24, -15, -24, 51, -36, 16, 5, 10, -11, 4, 11, 6, -8, -5, -21, 10, 49, 13, -41, -32, 38, 26, -14, -18, -59, 62, -12, 60, -22, -62, -38, -27, -1, +-23, -36, 5, -14, 19, 60, -34, -32, 19, -34, -39, -32, 27, -10, 17, -20, 7, -44, -15, -25, -62, 23, -21, -26, -43, 10, 39, 20, 37, -68, -12, 37, 22, -20, -11, -5, -12, 29, -32, 9, 27, 4, -20, -8, -12, 14, -11, -53, 6, -39, -13, -9, 13, -6, -12, -64, -23, -12, 8, 35, 19, -5, -46, -29, 11, 17, -19, -5, -15, 7, 9, 21, 9, 8, -17, -38, 6, 72, 4, -28, 2, +24, -12, 12, -27, -13, 10, -27, -32, -6, -24, -4, -27, 25, 4, -9, -2, 25, -37, -56, 30, 8, -17, -25, -27, 21, 31, -18, -8, 4, 5, -23, 17, -14, -11, -37, 11, -11, 22, 63, 59, 40, -4, 1, -1, -29, -56, -33, -8, -31, -17, -22, 16, -26, -27, -39, 48, -19, 18, -19, -2, -74, -23, 7, 95, 36, 5, 12, -29, 23, -28, -26, 18, -11, 16, -60, 12, 2, 6, -22, -3, 37, +-7, 3, 50, -11, 12, -9, -29, 18, -53, 11, 28, 64, 80, -41, 0, -77, 10, 10, 35, -54, -14, 27, -4, 3, -4, -8, 0, -38, 16, -12, -2, -1, 27, -4, 12, 16, -7, 3, 2, -4, -23, 25, -17, -27, 4, -22, 20, -4, -9, -28, -15, 17, -12, -3, 27, 12, 13, -24, 60, -28, -20, 3, -23, -61, -49, -40, 70, -33, -40, 9, -18, 17, 111, -23, 8, -29, 3, -28, -5, -51, 4, +-17, -39, -13, -17, -44, 64, -26, 56, -65, -6, -11, 1, 55, 24, -36, 33, -15, -25, -2, 10, -22, -11, 5, -69, -80, 12, 1, -22, -31, 13, 81, 10, -2, -1, -80, -52, 60, -1, 2, -40, -19, -17, -23, -28, -65, 51, 42, 9, -41, 13, 9, -8, -19, -14, 58, -9, -27, 1, 26, 13, -10, -20, -21, 6, -11, 2, -72, 31, -14, 7, 85, 84, 14, 45, -45, -24, 33, -12, 17, 70, -13, +21, -13, -29, -5, -12, 9, -4, -26, -30, -11, 13, -10, 7, 44, -22, -26, 9, 10, -30, -32, 28, 43, -34, 16, 30, -19, 41, -31, -32, 5, -37, -82, 81, 86, 83, -63, -39, -11, -26, 6, 96, -76, -36, -33, 109, 42, -9, -47, -14, -26, 44, 9, 21, 13, 4, -27, 11, 18, 4, -35, -21, 11, -23, -24, -6, 39, 15, -10, 20, -13, -7, 26, 9, 7, -26, 4, 17, -12, -16, -4, -14, +17, 9, 36, -26, -25, -19, 5, 15, -39, 24, -11, -43, 4, 8, -11, -3, 127, 39, -3, 31, 61, -16, -12, 70, -8, -29, -44, -16, 81, 12, -49, -10, 7, -39, -26, 60, 17, -5, -15, 44, 13, 1, 1, 38, 32, -12, 2, -30, 101, 11, -10, -6, 26, -21, -13, -15, 14, -62, -40, 16, -39, 4, -27, -15, -4, 13, 46, -23, -24, -4, 14, 45, 2, 2, 5, -38, -4, 8, 2, 0, 21, +1, -25, -18, 2, -21, 26, -14, 41, -34, -2, -5, 9, -25, -25, -7, 10, -35, -3, 62, -55, -22, 14, -17, 6, -35, 10, 0, -2, -21, -1, 38, -6, 29, -60, -47, -6, -13, -21, 16, 5, -28, -34, -8, -16, 24, 28, 5, -17, 47, -23, -2, -51, 5, 8, -16, -5, -23, 23, -8, -19, 68, -43, 12, 12, -9, -6, -11, 11, -3, 35, 11, -38, -58, 2, -6, -25, 12, -18, 85, 10, 42, +0, 40, -36, -10, 18, 25, -35, 19, -25, -44, -21, 11, 9, 4, 27, 20, -12, -26, -18, -13, 29, -15, 10, -13, -11, -11, -23, -16, -12, 9, 8, 47, -3, 20, 41, 22, 11, -25, -9, -37, 21, -14, -9, -18, 45, 33, 44, 16, 28, 1, -6, -42, 36, 21, -15, -33, 55, 3, -24, -17, -4, -29, 11, 23, -7, 47, 27, 33, -16, 20, -25, 19, 76, -71, -25, -20, 24, -38, 2, -86, 45, +17, 10, -17, 82, 49, -38, 29, -18, 33, -12, -40, -73, 28, 62, 77, -24, -13, -14, 17, -18, -1, 3, -46, 36, 23, -9, 25, -45, -2, 72, -38, 15, -45, -16, 38, -22, -3, -10, -16, -26, 46, -22, -6, -27, -4, 39, 22, -14, -10, 7, -14, -5, -14, -10, -14, 41, -23, -9, 11, -21, 6, 38, 8, -3, -4, 21, 4, -18, -15, 2, -2, 26, -4, -4, -22, -27, -31, -10, 13, 7, 19, +-7, -36, 4, 28, 31, -42, 27, 4, -5, -25, -16, 9, -29, -18, -29, 4, 18, 46, -12, -26, -4, 34, -14, 51, -26, 34, -44, 1, -2, 52, 59, -61, 36, -18, 90, -30, -63, 10, 56, -37, 13, 32, -10, -9, 33, -41, 4, 33, -37, -5, 4, -86, -9, -12, -28, 5, -27, -15, -13, -20, 9, -39, 40, 50, -14, -58, -26, 20, 62, 3, -33, 9, 13, 19, -6, 10, -19, -6, -9, -34, 1, +-53, -26, -3, 23, 4, 26, 23, -3, -1, -23, 40, 35, -8, 20, 20, -2, 41, -59, -6, -18, -19, 1, -41, -9, -26, -28, -14, -17, -8, 14, -6, 21, -19, -30, 17, -23, 11, 2, 13, -16, 4, -8, -28, 11, 5, 4, 20, 1, 105, 1, -15, -18, -16, 10, -10, 10, -5, -37, 9, 8, -16, 64, -75, -1, 19, 4, -72, -39, 7, -5, 45, -16, 6, -18, -60, 10, 3, 12, -20, -33, 86, +8, -23, 59, -20, -1, 19, 19, 17, -7, -27, 26, -12, 46, -42, 4, -9, -24, -29, 5, 21, -36, -14, 15, -3, -21, -3, 48, -4, 21, -22, -27, 54, 16, -15, 0, -40, 15, 41, -8, 10, -1, 30, -43, 9, 44, -16, -21, -24, -16, -47, 81, -2, 12, -16, -29, -38, -29, -8, 7, -9, -31, -25, 17, 61, 8, -10, -3, 5, -19, -5, 0, -34, -14, -16, -21, 14, 90, -34, -29, 0, -19, +-32, -17, -29, -30, -13, 16, 40, 5, -6, -21, -16, -14, -2, -22, 105, -6, -38, 1, 8, -10, -17, -17, -9, -3, 6, 2, 57, 70, -30, -25, 36, 4, -6, 69, -7, -20, 100, -18, -12, -16, -24, 24, -42, -4, -16, 2, 35, -29, 2, -42, -5, 27, 9, 82, 63, 5, 7, -30, 7, 75, 0, -20, 5, -60, 14, 22, 44, 65, -1, -47, -18, -42, -42, 49, 127, -9, 10, 28, 37, -32, -14, +-68, 29, -13, -4, 81, 8, 6, -33, 11, -31, 100, -27, -6, 0, 24, -21, 17, 23, -56, 6, -49, -18, -13, -11, -20, 64, -31, 20, 4, 10, -29, 7, -21, 3, 5, 5, 127, 1, 16, 27, -25, -36, 43, 13, -5, -17, -52, -34, 12, 10, 17, 29, 14, -25, -15, -50, 41, 87, 2, 10, 23, 8, -19, 116, 79, 1, -17, -7, 42, 2, 31, -5, -38, 17, 72, 9, -6, 38, -1, 6, 41, +27, 30, -18, 3, 20, -14, 47, 15, 2, -18, -19, 1, 4, -21, -34, -31, -20, -13, 41, 17, -14, -4, -41, -47, -52, 92, -8, 58, -8, -18, -4, 20, 10, -25, -12, -22, -5, 5, 12, -40, -19, -39, 1, 10, 4, -36, -35, -17, 20, -80, -21, 22, -37, -23, -28, -36, -30, 24, -29, -36, 21, -22, -13, -33, -21, 11, 11, -18, 21, -4, -48, 7, -4, 12, -16, -12, -8, 4, -26, -28, 14, +-19, -25, -19, -19, 20, 57, 9, -11, -14, -10, 33, 54, 22, -4, -5, -10, 12, -2, 6, -16, -2, -22, 8, -4, -18, 35, 35, -9, 26, -12, 54, 16, -14, -6, -9, 3, -61, 11, 0, 60, 6, -34, 2, 5, -13, -11, -13, -29, 22, 6, 1, -16, -4, 3, -14, 14, 18, -77, -30, 3, -2, -17, 4, 12, -17, 1, -75, 89, -43, -23, -53, -2, -24, 16, 65, -21, 29, -10, -29, 6, 20, +54, -19, -23, -30, 29, 0, 12, -32, -27, -32, -30, -12, -19, -26, 11, -10, -20, -7, 94, -30, 9, 70, -39, -25, 47, -22, -2, -11, 15, -13, 31, 22, 1, -4, 14, -13, 36, -12, -23, -2, -26, -52, 31, -16, -23, -16, 35, -6, 32, -15, -6, 46, 8, 7, -20, 36, -6, 45, -46, -30, -34, 27, -49, -12, -38, -23, 92, 5, -22, -10, -38, 10, -20, 50, 16, 28, 82, -22, 8, 35, -14, +8, 16, -47, -8, -68, 17, -42, -21, 25, -90, 46, 127, -8, 0, 68, -16, 54, 5, 10, -45, 2, 96, 32, 38, -23, 30, 34, 36, 4, 20, 3, -9, -26, -7, 9, -9, -38, 13, 4, 6, -19, -13, -10, 127, -6, -13, 16, -12, 20, -13, -5, -21, 8, 13, -61, 2, -38, -31, -23, 55, -21, -24, 41, 8, -36, 60, -25, -21, -20, 43, 20, -18, -6, -60, -5, 122, -26, -31, 19, 16, -21, +-12, -9, -29, 30, 40, -23, 65, -23, -3, -1, 53, 1, -37, 29, -21, -30, -7, 15, -51, -24, 54, 20, -15, -2, -15, -19, 127, -60, 6, 13, 33, 16, -25, 9, -1, -5, 17, -45, 2, -9, 15, -18, 65, 6, -12, 18, -14, -15, -16, 3, -29, -42, -9, -19, -22, -2, -9, 27, 127, -21, -15, 35, -11, 5, 19, -15, -3, 63, 33, -1, 26, 15, -2, 34, 88, 23, 36, 46, 13, -23, 22, +-46, 41, -9, 67, -58, -1, -48, -25, 67, 64, -5, 11, 14, -40, -44, 10, -7, -4, 14, -29, -9, 1, -48, 1, 61, 100, 29, 37, 23, -18, -37, -62, 17, 36, 3, 96, -29, -37, 74, 68, 11, 40, -4, 27, 16, -57, -14, -12, 62, -10, 21, -38, 24, 3, -10, 22, 8, 95, -2, 43, 32, -14, -17, 40, -21, 32, -28, -3, -47, -40, -22, -15, 24, 7, 17, -24, 7, -16, 25, -22, 16, +-34, 13, -32, -27, 43, -19, -32, -11, 30, -6, 20, -13, 78, 35, 6, -18, -9, -28, 95, -18, 9, -35, -43, 5, 39, -2, -19, 4, -21, 21, -13, 22, 0, 30, -32, 3, -6, -17, -40, 67, 93, 1, 1, -27, 19, 4, -16, -50, -76, -48, -1, -51, 5, -19, 63, -33, 75, -30, 4, 13, -26, 5, 34, 37, -10, 3, -6, -25, 35, -26, -4, 32, 127, 72, -27, -56, -1, -12, 1, 19, -13, +-25, -27, -28, -48, -35, 62, -17, 28, 11, 1, 24, -49, 13, 88, 28, -3, 31, -10, -3, 28, -3, -2, 1, 50, -32, 9, -20, -18, 5, -6, 1, -6, 0, 18, 34, -6, -15, 0, -23, -28, -1, -9, 0, 1, 17, -2, 73, 3, -28, 12, -19, -37, -23, -94, 54, -7, 28, -29, 29, -34, 23, 16, -21, 36, 13, 17, -5, 6, -23, 37, -25, 45, 33, -1, 27, 7, -21, 18, 20, -31, 3, +-24, -3, -14, -12, -43, -12, 84, -35, 54, 8, -42, 45, 31, -25, 3, 2, 25, -16, -52, -37, -15, -16, -67, 38, -32, -35, 43, 126, -11, 47, 47, -16, 39, 7, -21, -15, 9, -21, 0, 29, 26, 24, -4, 12, 6, 17, -12, -31, 1, -7, -17, -23, 97, -16, -45, -17, -26, -22, -5, 4, 30, 1, 2, -24, 37, -56, 14, -5, -27, -28, 2, -4, 32, -5, -1, 6, -28, -36, -47, -18, 28, +11, -7, -14, 54, -17, 14, -5, 8, 8, -40, -7, -48, -10, -32, 15, 12, 13, 12, -7, 38, 41, -17, -23, 35, -32, 31, -22, 15, -17, 70, 7, 14, -91, -40, 77, -22, -19, 17, 18, 18, 29, 10, -25, 9, -2, -23, -72, 23, -41, 2, -25, 32, -20, 4, 7, -5, 59, -24, 0, 53, 2, 22, -8, 1, 14, -10, 21, -8, 4, -12, 2, 22, 25, 0, -16, -1, -20, -38, 0, 6, 2, +-13, -20, 60, -14, -51, 42, 5, -24, -20, 1, -1, -18, 4, -6, -14, -26, -15, -19, -47, -18, -13, -18, -20, -38, -5, 14, 52, -27, -14, -34, 13, 44, 2, 12, 36, -3, -21, 7, -8, 0, -17, 79, 28, 10, 49, 35, -37, -26, 24, -21, -16, -11, -22, 28, 0, 97, -7, 20, -27, 20, -7, -1, 3, -9, 56, 35, 28, -7, -30, 21, -24, -23, -4, -6, -7, -10, 61, -11, 7, 3, -34, +26, 11, 6, 27, 37, -45, -13, -26, 93, 59, -12, 54, -20, -30, 29, -18, 90, 33, -13, 16, 27, 32, -57, -42, -10, 5, -49, -14, -3, -30, 31, -5, 16, -24, 25, -44, -12, 34, -42, 23, 24, -13, 121, 49, -23, 3, -13, -19, 9, -49, -24, -54, -3, -70, -69, -40, -15, 5, -15, 25, 36, 28, -34, 21, -22, -5, -29, 26, 63, 47, -62, 26, -24, 7, 18, 19, -7, -14, 9, -42, 59, +11, -3, -11, 12, -9, -39, -6, 35, 48, -34, -11, 16, 7, -1, 27, -9, 9, 7, -11, 3, -9, 15, -1, 26, -4, 101, 19, -19, -4, 2, 42, -3, -3, -30, -4, -13, 3, -11, 14, 19, -8, 127, -6, -10, 0, 42, 1, -12, 42, -13, -17, -33, -1, 43, -1, 23, -33, 13, 31, -7, -10, -24, -27, 29, 1, 23, 20, 60, -48, -41, -22, -30, 0, 14, 4, -12, 7, 4, -18, 33, 10, +-11, 17, -39, 44, 12, 56, 12, 40, -6, -36, 20, -3, 39, -44, 72, 47, 52, -8, -37, -20, 37, -6, 25, 4, 2, 14, -35, -25, -4, -30, -3, -1, 13, -19, 12, -33, 36, 21, 38, 1, 43, -3, -24, -9, -23, 6, -19, -38, -29, 1, 4, -5, -16, -1, 20, 1, 1, -12, -15, -33, 3, 8, -3, -6, 1, -2, 7, -39, 13, -12, -14, 21, -16, 59, 8, -8, 3, 36, 26, -16, -2, +-2, 35, 6, -21, -16, -15, -10, -44, 69, -15, 24, 33, 53, 3, 21, -5, 18, 19, -30, 10, -11, -46, 2, -7, -26, -13, -45, 47, 13, -36, -26, 98, 9, 56, 30, 33, 12, 94, -35, -40, -5, -28, -17, -39, -18, -14, -13, -27, 23, -48, -45, -42, 61, -21, 29, -7, -15, -70, 50, 7, 4, -45, -15, 15, 5, -15, -18, 40, -16, -5, 3, -27, -6, -18, -8, -16, 8, 19, -2, 127, -9, +6, -10, -34, 18, 17, 17, -34, -22, 49, -16, 30, 15, -15, 34, 14, -42, 0, -10, -27, -42, -8, -15, 23, 77, -24, -12, -20, 74, -19, -15, -24, 2, -21, -61, -8, 6, -15, -27, -7, -25, -31, 35, -20, -35, -60, -7, 22, -4, -27, 5, -30, -13, 23, -55, 96, -24, -29, 14, -52, -23, 75, 100, -35, -38, 61, -13, 21, -29, -5, 35, -22, -55, 94, 46, -33, -2, 11, 8, -11, -16, 13, +-17, -5, 26, -16, 10, 26, -24, 58, 15, -24, -3, 9, -16, -2, 6, 7, -23, 2, -25, 8, 17, -3, 12, -11, 25, 34, -12, 32, -2, -7, -41, -21, -18, -45, -30, -27, 1, 17, -13, -16, 29, -17, -55, 80, 16, -22, -16, -4, -8, 21, -5, 0, 14, -25, -11, -5, 54, 93, 3, 58, 108, -37, -6, -9, -6, -7, -5, -41, -1, 38, -11, -9, 35, -19, -24, 37, -24, -25, -40, 6, -36, +-19, -15, 49, 10, -19, -10, -24, -5, 29, -43, 57, -22, -17, -22, -6, -4, 2, -20, -29, -29, 23, -9, 7, 8, -25, 26, -27, -8, -20, -21, 4, 1, 24, -25, 23, 32, 14, 5, -46, 14, -3, -9, -58, -42, -44, -4, -3, 47, -17, -22, 16, -12, 68, -13, 31, 24, -36, -25, 28, -39, -6, -16, 19, -33, -30, 19, 24, 12, -27, -39, -23, -17, -29, -11, 21, 15, -14, 107, -25, 88, -3, +-26, -5, -7, -17, -19, -21, 51, -15, -27, 43, -28, -1, -51, -2, -25, -13, 33, 36, 57, -61, -25, 28, -43, 36, 6, -29, -21, -18, 28, -36, 48, -6, -17, 33, -21, 35, 9, -45, -39, -28, 3, 26, 0, 7, -31, 10, -34, -3, -30, 8, 21, -12, -41, 40, -25, 9, -32, 50, 29, -13, 29, -19, -11, 45, 30, 39, -35, 6, 3, 30, 52, -2, -14, 23, -15, 1, 5, 29, -2, -14, -20, +26, 22, -19, 18, -48, -18, -25, 8, 73, -31, 75, 98, -31, 41, 8, -1, 0, -33, -27, -5, -49, 25, -33, 69, 59, -11, 29, -27, 6, -29, -37, -42, -3, -18, -48, -62, -15, -7, -51, -28, 34, -21, 19, 36, -10, 2, 35, -3, -22, -9, 21, -35, -32, -13, -5, -5, -41, 22, -6, -27, -14, -57, -52, 6, 80, 32, -31, 7, -40, -44, -4, -9, 127, -3, 3, 5, 3, -4, -2, 8, -14, +10, -17, -1, 10, 21, -11, 26, 0, 11, -34, -9, -3, -4, 18, 2, -5, 39, -20, -1, 18, -15, 12, -23, -6, -4, 10, 41, -21, 6, -27, 72, -42, -16, 31, -49, 18, -23, 76, -26, -22, -21, -19, 43, -53, 25, 16, -32, -42, 37, 123, 5, 56, 12, 35, -35, -2, -7, -22, 4, -13, -57, 75, 15, 0, 79, 1, -54, 77, 37, 85, -29, 68, -64, -51, 75, 35, -26, 17, 0, -45, -14, +28, -19, -16, 127, 27, 36, 39, 10, 20, 20, -8, -19, -19, 5, 9, 19, -4, 16, 0, -12, 13, 65, -8, 24, -29, 24, 26, -4, -21, -18, 5, -18, -20, 2, 2, 17, 53, 1, 21, 68, 39, 14, 1, -54, -50, -42, -19, 35, 2, 14, 0, -15, 1, -15, -30, 2, -24, 32, -22, 26, 15, 41, 14, 57, -54, -29, -6, 5, -30, 27, 18, 48, -76, -59, -14, -47, -11, 23, -40, 42, 17, +10, -90, -28, 0, -10, 3, -41, 28, 17, -46, -33, -18, 31, 49, -27, 7, -43, -62, 48, -35, 8, -43, -7, -16, -6, 18, 8, -14, 1, -1, 9, 10, -16, -40, -4, -17, -34, -31, -9, 18, 7, 50, -31, 3, -45, -30, 5, 13, 23, 52, -17, -34, 31, -51, 32, 7, 18, -9, 28, -24, 12, -13, 44, 31, 11, 0, 38, -8, -9, 61, -17, 5, -25, 14, -13, -7, 39, -23, 19, -20, 4, +-18, -33, 3, -7, -3, 32, 11, -4, -29, 78, -46, 28, -35, -16, -36, 12, -20, -12, -15, 15, 116, -23, -18, 55, -5, 22, 14, -31, -46, 12, -3, -9, -15, 2, -31, 8, -17, 4, -42, 32, -48, -35, 11, -36, -10, -53, -44, 2, 2, 24, -10, 80, -33, -14, -106, 31, -24, -28, 58, 53, 44, 20, 15, -17, 71, -17, -17, 28, -54, 20, -2, 8, -6, 21, 4, 19, 6, -19, 22, -17, -35, +62, -22, -10, -28, -38, -35, -30, 23, 15, -7, -16, -42, -35, 43, -19, -9, -8, -13, -5, -7, -2, -14, 115, 32, -33, -45, 36, 7, 32, 23, 55, -21, -12, 12, -18, -15, -22, 46, 35, 10, 31, 12, 38, 23, 23, -51, 45, 29, 3, 5, -49, 14, 18, -64, 43, 31, 18, -16, 26, 70, 32, -17, -28, -34, 62, 7, -31, -3, 21, 13, 0, -31, 95, -15, -22, 15, 24, -46, 58, -19, 54, +-11, 45, -18, 30, 8, 1, -23, 46, 18, -8, -6, -18, 42, 45, -57, 16, 4, -16, 51, 2, -45, -14, 19, 11, -45, 17, -68, 83, 38, 59, -16, -27, 23, -48, -17, -7, 0, -19, 13, 24, -11, 10, 14, -63, -40, 38, 11, -21, -17, -30, 0, 26, -20, -6, 21, 4, 0, 41, -30, -22, -29, -6, 1, -19, 68, -50, 8, -21, 28, 10, -15, -22, -8, -61, -37, 36, -21, 35, 34, -17, -3, +1, -17, -8, -34, 47, -8, -12, 32, -17, 4, -27, 10, -54, -38, -11, 11, 11, 76, -35, 2, -2, -58, -21, 5, -32, 10, 28, 0, -31, 33, -17, 64, -16, 9, -8, 28, 20, -5, -8, 80, -33, -17, 47, 37, 14, -50, 11, -12, -26, 101, -2, 42, -10, -54, -56, -37, 28, 47, -36, -16, 31, 24, -8, 0, 39, -73, -37, -28, -118, -27, 25, 48, -51, -16, 5, 8, 66, -22, 59, -23, 23, +-1, 20, -18, -4, -23, -47, 21, -14, -26, -32, 55, 8, 26, 8, 31, -2, 17, -39, 47, 29, -30, -11, 60, -18, -21, -1, -32, 3, 8, 43, -2, 19, 32, -3, 24, 29, -2, 1, -1, -22, 81, -24, 22, -16, 99, 26, -39, -27, 19, -21, -32, 5, 19, -28, -19, 28, -7, -23, 7, 8, -8, 22, -4, -47, -7, 19, -14, 14, -6, 63, 44, -70, 15, 21, -43, -8, 118, 60, 7, 1, -29, +-39, -49, 101, 20, -67, -17, 14, 22, 3, -58, -41, -60, -28, -12, -5, -44, 35, -34, 39, 11, -31, 31, -23, -33, 49, 1, 3, 46, -4, -66, 28, 16, 73, -31, -38, 30, -1, -5, -22, 96, -58, 83, -16, 30, -29, 123, 15, -10, 17, -24, 96, 77, 7, -27, 0, 79, -9, 3, 0, -52, -9, 66, -1, 20, 36, 8, 19, 4, 38, 7, -9, -2, 45, -28, 22, 29, -7, -36, -17, -49, 63, +2, -2, 6, -8, 10, 27, 20, -36, -18, -14, -14, 7, 98, -32, 35, 53, -18, -18, -10, -8, 20, -22, 10, 43, -10, -6, -19, -3, -35, -41, 3, 71, 9, -29, 19, -37, -8, -16, -27, -7, -25, -20, 39, 12, 88, -39, 2, 12, -22, -15, 23, -23, 22, 19, -31, 45, 15, -4, -13, 21, -26, 24, 10, 86, 50, 26, 7, 25, -63, -22, -19, 21, -5, 51, 45, -40, 17, -30, 3, -10, -84, +-45, -50, -7, 10, 33, -61, 5, 84, -26, 57, 125, 35, 41, -2, -48, -22, 62, -8, 3, 19, 70, 71, -26, -28, -26, -10, 70, -27, -4, -23, -54, 12, 42, 33, -24, 17, -21, 61, -9, -8, 0, 35, -33, -16, -5, -22, -4, -49, 34, -9, -37, 36, 15, -26, 11, -7, -34, -46, 38, -34, -40, -28, -28, -8, 127, -51, -23, 87, 40, -7, -4, 31, -56, -15, -37, -35, -31, -14, -4, -14, 127, +24, 28, 5, -11, -17, 32, 13, -66, -11, -28, -4, -26, -16, -37, 13, 86, -2, -49, 53, -1, -33, 8, 31, 14, 84, 41, 1, -38, -13, -11, -27, -14, -25, 92, 127, -12, -1, -37, -32, 111, -9, -34, -28, -85, 64, 28, -6, 38, 10, -32, -37, -36, 0, 39, 84, -89, 35, -89, 40, 36, -3, -29, -27, -6, -7, -4, -15, 23, 37, 2, 127, 5, -25, -11, 24, -1, -9, 28, -17, -31, -36, +20, 45, -18, 12, -9, 16, 43, 1, -47, 0, 26, 3, 54, 10, 20, 7, 30, -13, -11, -11, -31, 28, 12, 14, -33, -25, -31, 4, -7, -15, -43, 11, 39, -22, 6, -22, -3, 5, -8, -11, -6, -24, 31, 20, -26, -24, -53, -12, -12, -7, 6, -6, 10, -19, 15, 88, -21, 27, -37, 24, -29, -13, -45, 10, 24, -28, -43, 42, 6, 64, 81, 3, -15, -42, -25, -14, 78, -12, -71, 11, -16, +118, -49, 1, -17, -8, -52, -22, -34, -53, 83, -24, -40, 100, 59, -1, 118, 23, -11, 12, -23, -1, 12, -13, 21, 64, -30, 33, 28, 12, 37, -31, -7, 77, 46, 57, -43, 2, -15, 40, 63, -18, -21, -9, 13, 5, 3, 41, 17, 0, 0, 34, 24, -28, 14, -33, -8, -22, 12, -27, 54, -1, -29, -25, 8, -7, -2, -39, 13, 55, -30, 3, 54, -55, 34, -11, -1, 1, -12, 35, -28, -3, +-28, 21, -10, -13, -46, -6, 11, 31, 13, -4, -10, -14, -25, -17, -43, -23, -25, -26, -29, 9, -23, 43, -18, -34, -68, 11, -24, -39, -39, -43, -39, 12, -4, 76, 26, -36, -58, 17, 59, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 67, -58, 50, -125, 47, 46, 58, -58, 52, 81, 58, 102, 38, -89, 40, -1, 73, -115, 51, 126, 55, -93, 55, 1, 52, -113, 47, 50, 56, 110, 53, -54, -28, -105, -6, 45, 0, -75, 0, 68, -4, 48, -5, 83, -5, -1, -4, -20, -4, 125, -6, 111, -14, -81, -15, -18, -3, -74, -5, 76, -5, +93, 0, 6, 57, 25, 54, 94, 46, -36, 39, 113, 61, -26, 47, 84, 74, 26, 41, -11, 40, -99, 53, -73, 45, -116, 57, 7, 52, -116, 60, 66, 59, 70, 50, 94, -2, -30, -5, -63, -2, 104, -8, 105, -10, -124, -9, 77, -3, 36, -6, -73, -8, -73, -15, 30, -14, -7, -13, -83, -3, -128, -15, -2, -7, 30, -7, 87, 52, -41, 68, 13, 46, 83, 44, 7, 33, -117, 68, 41, 73, 12, +39, 19, 44, 97, 36, 100, 44, 41, 59, 55, 49, 1, 41, 39, 95, 69, 51, 123, -4, 27, -14, -27, -7, -80, -11, -17, -3, -127, -13, 36, -1, -50, -2, -67, -11, -109, 4, -9, 0, -116, 0, -27, -4, 62, -4, -80, -4, -26, -20, 126, 48, 46, 55, -1, 45, 88, 47, -67, 66, -43, 42, 98, 74, -77, 44, -10, 38, 12, 43, 49, 47, 8, 66, -128, 52, 122, 53, 29, 36, -63, 42, +-106, -21, 31, -17, 99, -11, -108, -9, -106, -7, 26, -8, 99, -15, -92, -14, 74, 2, -28, -10, 71, 4, 50, 0, 30, -7, -91, -12, 107, 5, 35, -10, -25, 84, -61, 43, -43, 53, -87, 48, -97, 51, 0, 42, 23, 46, -35, 45, -122, 47, 93, 53, 24, 57, -117, 51, -105, 53, -91, 38, 54, 46, 65, 55, -39, -14, -84, -12, 114, -7, 71, 0, -37, -8, -90, -18, -109, -3, 125, -9, 70, +3, 78, -18, -70, -8, 60, -17, 11, -14, 87, 0, -92, -3, 115, -8, -47, 52, -77, 48, 91, 53, -119, 48, 72, 64, -84, 58, -126, 69, 97, 41, 76, 44, -54, 55, 11, 49, -29, 61, -30, 37, 61, 61, -8, 57, 3, 46, -86, -6, -75, -9, 62, -3, 118, -10, -28, -1, 66, 0, -77, -16, 81, -1, 81, 2, 110, -4, -105, -12, -111, -10, -58, -17, -79, 4, -79, -12, -33, -6, 2, 37, +76, 68, 0, 71, -2, 49, 81, 36, 51, 61, 54, 61, 87, 46, 60, 53, 8, 44, -25, 39, 8, 60, 121, 57, -32, 50, 21, 53, -90, 51, 33, -3, 122, -15, -124, -14, -70, -4, 105, 1, 120, -1, -33, -11, -26, -7, -54, -6, -52, -10, -15, -3, -13, -13, 93, -10, -4, -18, 90, -12, -105, -3, 43, 53, 58, 48, 29, 65, 53, 53, -69, 36, 81, 53, 74, 48, 108, 43, -86, 38, 53, +48, -35, 39, -29, 28, -19, 48, -121, 56, -78, 49, -120, 49, -8, -14, 126, -6, -47, -5, -16, -8, -69, -3, 74, -12, -42, 2, -14, 0, 29, -2, -9, -9, 38, -8, -73, -8, 25, -7, 123, -13, 107, 1, -73, -12, 102, 50, 3, 66, -43, 61, -114, 45, 0, 38, -90, 32, -95, 40, 121, 32, 122, 40, -58, 46, -72, 63, 104, 74, -114, 52, -40, 34, 98, 55, 35, 54, -100, -11, -49, -7, +92, -13, -87, -4, 79, -4, 19, -3, -41, -5, 78, -8, -101, -3, -61, 3, -61, -2, -36, -3, -24, -15, -87, -1, 1, -12, 125, 0, -114, 40, -87, 63, -55, 44, 34, 42, -125, 62, 77, 52, -60, 38, 66, 59, -32, 39, -15, 54, -22, 51, 46, 70, 36, 48, 75, 41, 15, 59, 41, 42, 89, 1, -90, -8, 35, -3, -46, -2, 106, -22, -82, -17, -115, 1, 103, -16, -95, -2, 122, -4, 78, +-13, -3, -7, -127, -10, 10, 0, -97, -7, 102, -2, -76, 46, 120, 50, 84, 32, -15, 60, 22, 69, -117, 53, 78, 42, -9, 68, 125, 75, -59, 53, 117, 51, -17, 61, 116, 44, 48, 49, -80, 29, 57, 42, 21, -10, 26, -17, 60, -8, -42, -7, -125, -10, 67, -9, 47, 0, -28, -7, 23, -4, 76, -13, -115, -6, 5, -10, -85, -10, -81, -6, 84, -3, 52, -16, -73, 50, 52, 39, 38, 35, +88, 55, 84, 49, -30, 48, 19, 61, -30, 40, 16, 37, 108, 50, -99, 68, -42, 49, 45, 74, -104, 53, 78, 41, 110, 40, -77, 4, 121, -4, -122, -4, 92, -7, -68, -8, -3, -11, -70, -13, -116, -5, -39, 4, -51, -19, -4, -8, 2, -19, 102, -7, 62, -8, 34, -4, 15, -5, 20, 33, 78, 44, -77, 55, -18, 47, -120, 33, 25, 44, -89, 57, 94, 62, 116, 38, -13, 48, -76, 53, 116, +39, 13, 53, -80, 40, 60, 40, -4, 36, -84, -8, -48, -2, -27, -15, -65, -4, 107, -3, -126, -6, 94, -6, -5, -3, 18, 3, 68, -6, 116, -9, 113, -6, -74, -1, -76, -5, 121, -15, -71, -11, -28, 43, -26, 41, -61, 33, 28, 52, -30, 51, -82, 51, -127, 48, -50, 51, 31, 54, 46, 46, 121, 39, -119, 37, 44, 54, 14, 52, -43, 78, 77, 48, 111, 3, -15, -4, 55, 1, 99, 0, +20, -7, -1, -20, -23, -10, 82, -5, 28, -4, -106, -11, 19, -7, -102, -6, 87, -9, -101, -5, 99, -1, -105, -4, 77, 46, -21, 52, -93, 44, -87, 59, -71, 35, -36, 46, -31, 50, 71, 31, 75, 42, -56, 47, 51, 48, 85, 69, 54, 68, 90, 52, 116, 38, -57, 53, 75, -10, 10, 1, -22, -13, 22, -3, -52, 1, 28, -11, 63, -2, -88, 2, 106, -18, -27, 4, 111, -14, 66, -4, 123, +-8, -61, -4, -98, -4, -40, -9, -63, 36, 90, 59, 47, 33, 75, 34, 87, 40, -23, 49, -49, 73, -22, 32, 29, 52, -22, 57, -111, 51, -45, 48, 0, 64, -34, 55, -19, 44, 49, 54, -11, -5, -59, -7, -31, -9, 61, -4, 2, 4, -56, -11, -93, -8, 73, 1, -88, -4, -41, -5, -67, -6, -53, -14, -83, -8, -18, 0, -124, -1, -29, -11, 123, 41, -13, 43, -102, 61, 127, 41, 98, 46, +-4, 52, -59, 40, -48, 39, 4, 44, -116, 55, -89, 52, 42, 39, 122, 63, 45, 39, 70, 49, -89, 46, 7, 0, 40, -13, 58, 3, -100, -10, 124, -10, 83, -4, -75, -4, -71, -8, -105, -6, -110, -5, -49, 0, 11, -4, 28, -5, -91, -1, -70, -12, 2, -7, 80, 50, -54, 42, -14, 57, 11, 47, 91, 46, 95, 42, 16, 42, -16, 56, 63, 46, 1, 48, 96, 60, -85, 39, 118, 34, -69, +48, -33, 54, -83, 41, 77, 2, -64, 4, -7, -8, -72, -6, 98, -9, -62, -7, 83, 11, -103, -12, 96, -13, -119, -14, 97, -8, 44, 0, -72, 0, -8, -14, -47, -4, -12, 6, -76, 37, 1, 56, -93, 53, -99, 45, 14, 48, -91, 71, 26, 42, 8, 60, 103, 56, -85, 36, -1, 54, 114, 41, -113, 37, -6, 50, 111, 58, 109, 55, 1, -7, -46, -15, -99, 3, 27, -4, 59, 0, -63, -5, +104, -9, 79, -6, -14, -4, -75, -8, -85, -13, -38, -14, -120, -13, 120, -5, 102, -15, -32, -13, -102, 46, -43, 51, 64, 54, 29, 43, 38, 61, 93, 62, 7, 55, 44, 51, 12, 58, 52, 40, 60, 51, -69, 58, 98, 49, -97, 67, 2, 62, -26, 40, 36, 1, 119, -5, -46, -9, 30, 1, 96, 3, 109, -3, 63, -4, -27, 2, -108, -10, 121, 3, 107, -14, -10, -12, -90, -7, -81, -15, 82, +2, -116, -2, -26, 65, -100, 52, -16, 54, -75, 37, -25, 51, 9, 58, 57, 40, -109, 44, 20, 43, 57, 44, -53, 39, -118, 56, 106, 65, 126, 43, -114, 40, 122, 49, 26, -10, -54, -13, 103, -7, -62, -7, 46, -4, 22, -21, 33, -5, 127, 4, -23, -3, -33, -13, 3, 1, 45, -3, -53, -4, 93, -12, 30, -16, 60, 2, -30, 55, -117, 52, 102, 55, 22, 64, 59, 48, -82, 55, -112, 79, +-107, 50, -67, 37, -16, 33, -100, 39, 15, 67, 46, 40, -42, 46, 110, 56, -57, 68, -20, 2, 92, 2, -85, 1, 35, -10, -106, 6, 21, -6, -128, -2, 58, -5, 74, -7, -85, -2, -36, -2, -54, -11, -79, -8, -27, -2, 11, -8, -15, -4, 49, 59, -17, 48, 19, 46, 11, 59, -111, 45, -92, 42, 8, 43, -118, 39, -121, 50, 81, 37, 125, 46, -18, 46, 116, 39, -5, 47, -121, 44, -92, +49, -110, 3, 58, -9, 117, -8, -19, -4, -100, -3, 12, -8, -115, -15, 96, -3, 32, -5, -18, -2, 87, -1, 68, -12, -87, -13, 40, -4, 31, -8, 14, -13, -86, 41, -29, 69, -5, 53, -59, 57, 116, 52, 77, 73, -103, 56, -53, 42, -7, 51, 62, 44, 61, 47, -81, 47, -18, 53, 38, 44, -32, 38, -93, 39, -56, 2, 52, -13, 12, -7, 5, -13, 55, -5, -19, -20, 9, -22, -4, -3, +-108, 2, -12, -12, 64, -3, 80, 5, 108, -7, 87, -14, -65, 0, 107, 6, -55, 65, -93, 32, -35, 44, 66, 49, -24, 49, -106, 88, -6, 72, 77, 50, 54, 39, 42, 44, -117, 50, 50, 54, -60, 38, 117, 44, 53, 49, 114, 38, 64, -5, -35, -12, 127, -12, 124, -7, -84, -18, 22, -8, -9, -15, 77, -4, 41, -6, 107, -13, 118, -13, 44, -13, -123, -2, 43, -8, -115, 0, -23, -1, -56, +67, 78, 50, -38, 38, 111, 46, -98, 39, -22, 49, 114, 55, 37, 53, 96, 58, 97, 52, -10, 30, 30, 44, -45, 45, 37, 37, -94, 53, 101, 57, 35, -11, -29, -7, -13, 0, 55, -5, -127, -12, -118, -16, -35, -13, 59, 0, 112, -12, 8, -2, 49, 0, 106, -7, 54, -2, 52, -11, -74, -17, -66, -10, -11, 52, 91, 37, 67, 55, 18, 58, 33, 48, 107, 54, 127, 71, -59, 42, -7, 46, +-97, 63, -120, 60, 64, 40, 52, 66, 81, 35, 61, 65, 45, 47, 75, -19, 23, -12, -58, -14, -116, -13, -116, -11, -76, -2, -123, -18, -106, -9, 104, -12, 63, -15, 120, -15, 120, -8, 42, -6, 63, 0, -128, -12, 49, -11, -41, 55, 118, 72, -74, 64, -31, 58, -123, 52, -109, 52, -68, 52, -79, 58, 81, 51, 48, 49, 126, 41, -104, 44, 122, 46, 88, 60, 61, 45, 31, 46, -109, -4, -30, +-19, -20, -10, -40, -13, -112, -11, 111, -11, -22, -12, 103, -2, 19, -3, -61, -12, -87, -10, -109, -5, -21, -14, 28, -17, 21, -21, 47, 1, -25, 46, 14, 43, -2, 52, -61, 52, 2, 70, -57, 41, -119, 50, -44, 71, -28, 63, -8, 36, -123, 37, -56, 54, -55, 82, 8, 37, -38, 61, -51, 60, -15, -7, 3, -13, -81, -7, -115, -7, 93, -11, -114, -14, 62, -2, -100, -10, -21, -11, 11, -15, +82, -10, -63, -10, 55, -7, 14, -7, -35, -12, -7, -12, -105, 50, 115, 54, -100, 55, 32, 43, -34, 38, 118, 39, -45, 72, -7, 40, -15, 52, -120, 60, 42, 95, -119, 36, -4, 55, -107, 33, 17, 51, 103, 68, -56, -15, -52, -11, -62, -4, -38, -14, -82, -4, -114, -3, -98, -10, -7, -4, 20, -18, -38, -13, -71, -22, -74, -8, 59, -23, 107, -12, -92, -7, -51, -21, -124, 56, 45, 63, -121, +39, 1, 47, 4, 94, 111, 50, 39, 55, -27, 53, -110, 61, -49, 48, -35, 48, 29, 58, -53, 55, -105, 53, -26, 73, 5, 40, -14, -15, 94, -11, 109, -7, -119, -12, -118, -18, 83, -21, 58, -26, -60, 8, 118, -13, 84, -17, -55, -13, -74, -12, -34, -11, 18, -23, 3, -4, 123, -12, -70, 40, 56, 49, -79, 52, -92, 32, -116, -7, 25, -7, -6, 3, -122, -2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, -41, 38, -2, -47, -12, 9, 42, 3, -12, 26, -4, -34, 18, 55, 30, 34, -22, 7, -23, -2, -17, 7, 34, 34, 22, 2, -24, -22, 27, -9, -9, -14, -32, -38, 4, 1, -19, -40, 37, -29, -26, -16, -23, -2, 127, 30, -7, -21, -19, 29, -31, -5, -5, -25, 8, -24, -5, -9, -42, -52, 61, -16, +-32, -18, 46, -27, 5, -44, -19, 27, 118, -19, -44, 10, -12, 29, 33, 46, -4, 57, -27, -25, -58, 4, -19, -41, 9, 31, -24, -16, -12, -2, 58, -68, -55, -16, -45, -28, -6, 106, -50, 43, 96, 35, -9, 11, -26, -34, 74, 58, -26, 26, -1, 70, -51, 13, -13, -55, -8, -2, -25, 7, -36, -12, 37, -40, -12, 8, 11, 7, 22, 49, -26, -67, 40, -18, -33, 16, -27, 6, 105, 51, -23, +-45, -16, 7, -8, 12, -25, -24, -29, 39, -13, 4, -19, 7, 47, -25, 34, 20, 22, 12, 14, 8, -49, 23, 93, -9, -39, -16, -29, 27, 10, 52, -71, 20, -32, -5, -44, 27, -7, -8, 16, -34, -4, -24, -23, -5, 40, -30, 20, -9, 9, -27, -23, -25, 6, 9, -5, 0, 57, 16, 34, 12, 11, 46, -19, -20, 4, 0, 30, -38, 20, -6, -34, -26, -56, 14, 51, 25, -8, -7, -22, 72, +30, -3, 4, 65, -4, -10, 39, 19, 49, 2, 21, 87, -12, 13, -5, -15, -9, -46, 20, 16, -19, -27, -14, 2, -14, -65, -24, -40, -12, -22, -65, 48, 13, -3, 1, 80, 6, -7, 34, 2, 33, 34, 33, 127, -24, 31, -26, -43, 10, -46, 30, 2, -18, -29, -12, -10, -35, -52, -4, -39, 15, 2, -44, -25, -7, -10, -27, -6, 34, -27, 79, 7, -19, -2, -27, -25, -1, -41, -14, -10, -11, +-10, -41, -16, 27, -16, -24, 21, 4, -6, -14, 2, -30, -27, 7, -3, -23, 28, 10, -4, 9, -52, 59, -36, 4, -48, -8, -64, -15, -51, -34, 16, 46, -3, -52, -22, -21, 12, -28, -38, -7, 23, -39, -31, -35, 26, -47, -57, -40, 4, -46, -37, -4, -1, 49, 58, 11, -41, 38, 16, 6, -32, -16, 13, -40, 86, -17, 5, -7, -50, -36, -9, 3, -3, -21, -45, -24, -22, -23, -45, 6, -17, +-41, -18, -9, -20, 71, -2, -8, 17, -26, 15, 6, -27, 22, 47, -15, 47, -15, 16, 39, -35, -16, -11, -28, 17, -21, 13, 5, -25, 20, -53, 43, -3, -46, -6, -18, -17, 96, 87, -30, 65, 29, 2, -15, -42, -12, 31, -18, 54, 0, -38, 27, -3, -25, 55, -12, -33, -3, -13, -22, -17, 97, -22, 89, 78, 18, 98, -50, 115, 22, -18, -56, 44, -22, -7, -44, 75, -74, -16, 53, 29, -5, +-4, -59, -34, 30, -3, -52, -85, -17, -33, 15, -56, -38, -4, 20, -15, -22, 5, -7, 6, -37, -24, 12, -8, -46, 10, -36, -5, -45, -26, -19, -1, 51, 3, 52, 9, 1, -45, -29, 14, 49, 19, -30, -46, -39, -51, -21, -36, -60, -4, -30, -60, -23, 27, 3, -7, 21, -48, 40, -15, -21, 60, 28, 34, -28, 33, 77, 11, -4, 10, 35, 37, 2, 5, -27, -47, -3, -30, -41, -13, -23, -31, +8, -27, -39, 3, 21, -1, -52, -13, -16, 0, -26, -17, 31, 34, -65, 3, 22, -5, 25, 11, 22, 21, -13, -1, -13, -16, 1, -47, -28, 11, -78, -62, 9, -72, -52, 7, 71, -23, -30, -8, -18, -15, -18, -25, 24, -43, -66, 25, 75, 8, -16, -14, 86, 45, 1, 18, -30, -31, -9, -59, -47, 8, -24, -14, -20, -56, -53, 94, -17, -4, 8, 27, -11, -11, -53, 11, 17, -15, -66, 22, 58, +-2, 23, 2, 86, 7, 17, 10, -22, 25, -23, -48, -21, 29, -10, -16, 11, -38, -21, 15, -26, -20, 15, -17, -11, -46, -28, -9, 22, -1, -23, 55, 21, 17, -18, -7, 67, -13, 19, -16, -53, 65, -12, -44, -25, -1, -59, -49, 38, -38, -47, -8, -37, -9, -11, -16, 18, -47, -4, 25, 34, -15, -36, 28, 45, 22, -32, 50, 80, 1, 39, -18, -31, -11, -30, -20, -13, 66, -38, -17, -4, -40, +-2, 6, -22, -32, -3, -42, 11, -67, 63, 54, 41, -6, 35, 44, 51, 30, -28, -48, -21, -30, -31, 55, 21, 69, -12, -43, 15, -11, 0, 2, -14, 2, -3, 69, -18, -12, -13, 22, -18, -23, 27, 26, 9, 24, 13, 55, -15, -30, -23, -32, -13, 82, -16, -6, 0, -1, 3, -7, -21, -4, 11, -7, -38, -23, 21, 23, -3, 1, -5, 14, 2, -66, 12, -14, -7, 15, -9, -1, -37, -43, -2, +-45, -19, 18, -9, 5, 8, 26, 4, 44, -8, 21, -62, -16, -41, -64, 67, 12, -11, 16, 59, 21, -7, -18, 2, 44, -46, -3, 11, -56, -17, 1, 8, 26, -38, -9, -39, -17, 24, 16, 49, 19, -6, -44, -43, -17, -42, 22, 28, 1, -24, 4, 127, 38, -72, -49, 47, 73, -20, 9, 23, -31, -28, 88, 8, 19, -21, -12, -28, 12, 31, 3, 17, 19, -32, -12, 53, -54, -36, -21, 3, -6, +89, 2, 127, 93, -30, -35, 33, -12, -72, 15, -64, -29, 4, 9, -6, 64, 9, 36, -65, -13, 53, -34, 41, -10, -4, 7, 49, 0, -78, -26, 11, 1, 12, -34, 97, 49, -10, -9, 12, -24, -45, -15, -22, -30, 35, -23, -6, 34, -13, 33, -16, 11, 26, -21, 28, -13, -22, -9, 64, -6, -48, -39, -10, -34, 16, 22, 127, 56, -21, -53, -3, -12, -52, -22, -2, 14, -8, -29, -7, 0, -12, +-8, 16, 20, 32, -24, -2, 19, -59, -34, -30, 37, 7, 35, 8, 2, 1, -42, 64, 65, -47, 70, 14, -54, 18, 114, -63, -51, 96, -11, -11, -10, -92, -13, 18, 71, 1, 30, 53, 79, -45, -30, 13, -2, 0, -9, -47, 27, 27, -15, 2, 26, -5, 18, -23, -16, 8, 0, 38, -5, 53, -39, -11, 8, 3, -17, 7, 8, -5, -4, 3, -65, -9, -1, -47, 25, -12, -66, -46, 77, -18, -4, +20, -19, 12, 21, -30, 44, -23, -21, -4, -27, -28, -44, -41, -13, 55, -5, 3, -49, -4, -2, -16, -1, -10, 8, -3, -31, -24, 14, -50, -20, 21, -36, 52, 39, 1, 2, -16, 14, -34, -9, -41, -37, -10, 6, 9, -15, 3, -12, 13, -12, 3, 40, 15, -44, 45, -26, 47, -12, -4, -2, -79, -26, -30, -26, 0, 20, -1, 54, -55, -4, -5, -2, -19, -5, -8, 25, -41, -13, 20, 12, -15, +-64, 20, 16, -32, 28, -1, 41, 13, -4, 48, -15, -26, -40, -29, -4, 80, 45, 51, -1, -14, 14, 3, -1, -37, -39, -15, -5, 27, -1, 47, 5, 19, -8, 84, 37, 11, -6, 32, 32, -20, 6, 7, -10, -15, -68, -63, -17, 15, -8, -24, 33, -23, 26, -18, 12, -13, -80, -35, -4, 71, 9, 32, -4, 7, -38, 21, 26, -48, -53, 75, -11, -25, -16, 16, -32, 4, 25, -5, -25, 6, -60, +-1, 24, -7, 59, -17, 23, -18, -54, -11, -8, 8, 3, 31, -35, -59, -33, -16, 14, -29, -7, 14, -41, 29, 20, -3, -18, -13, -9, -10, 127, -1, 85, -22, 11, 94, 4, -17, -33, 17, -47, -35, 99, -15, -32, -2, -49, 78, -41, -55, 18, -34, 51, -16, 48, -28, 0, 55, -54, -4, -19, -19, -8, 19, -16, -27, 38, 25, 88, 22, -35, 36, 50, 36, 5, 79, -36, 22, 27, 52, 27, 86, +7, -6, 53, -76, 58, 2, 25, 66, -80, -2, -7, -10, 6, 1, 16, -24, 57, 31, 85, 31, -35, -6, 16, 56, -21, 10, -38, 14, 9, 64, 35, 55, -13, -15, -34, 42, -5, 29, 22, -11, 9, -37, 40, -53, 64, -37, 43, -30, -2, 56, 47, -9, -33, 33, 19, 24, 26, -1, 25, 44, -19, -24, 30, -7, 25, -39, -30, 40, 2, -22, 25, 8, -56, 7, -42, -62, 86, -30, 86, -12, -1, +18, 26, -41, -45, 7, 61, 28, -17, 28, -10, 15, -4, -39, -5, 38, -25, -37, 11, 15, -43, -9, -24, -4, -25, -2, -14, -13, 4, -33, -26, -18, -15, -11, 21, 17, -57, 37, -1, -12, 11, -7, 73, -43, -23, -15, 50, 2, 18, 7, 10, 28, -18, 64, -3, -35, -39, 0, -6, 9, -21, -35, -23, -7, 23, 24, 6, 85, 3, -24, 13, -42, -22, -8, 47, -27, -15, -11, -24, 1, -16, -27, +-23, 26, -26, 58, 14, 13, -41, 13, 20, -3, -9, -12, -40, -3, -4, -38, -39, 13, -8, -19, -2, -16, -11, 33, 51, -17, -27, -45, -19, 34, -4, -26, 3, -27, 11, 33, 81, -22, -26, -74, -58, -74, -13, -20, 7, -24, -10, 12, 34, -27, -54, 49, 51, 2, 12, 37, 40, -63, 6, -19, 51, 27, -25, -19, 53, 15, -26, 8, 28, -12, 17, 0, 14, 7, -21, -13, -52, -28, -32, -5, -2, +-26, -27, -12, 21, -2, 2, 12, -7, -29, -19, -19, -26, 11, -16, 17, -33, -25, -6, -26, -25, -16, 29, -3, -52, -25, 99, 22, -52, -3, -18, 10, -19, 8, -21, 13, -19, -37, -97, -36, -6, -29, 6, 2, 44, 95, 80, -20, -54, -7, -32, 46, -26, -10, -49, -14, 72, -13, 112, 3, -23, 38, -23, 33, 13, -13, -22, -23, -24, 6, 118, -41, -6, -35, -1, 30, 49, 80, 83, 37, -31, -1, +-21, -1, -11, 0, 43, -19, -43, -59, 127, -8, -21, 26, -22, -17, -26, 6, -27, -36, -60, -9, -18, -34, -21, 17, 4, 5, 9, 87, 68, -4, -57, -26, -22, 12, 27, -30, 79, -6, -24, 14, 127, -6, -33, 32, -41, 49, -12, 19, -47, -36, -64, -32, -70, -54, -26, -43, 34, 12, 47, 70, 91, 0, -60, -26, -17, -10, 4, -26, -1, -7, -62, -34, 100, 33, -41, 9, -43, 47, -29, -3, -18, +-41, -60, -52, 5, -19, -24, -30, 24, 10, 25, 127, 66, 17, -65, -25, -26, -3, 42, -8, 86, 17, -49, -60, 127, -21, -3, 12, -6, 56, -15, 10, -38, -25, 71, -9, -38, -40, -38, 1, 9, -1, 12, 90, 65, 34, -8, -5, 30, -16, -42, 66, 119, 4, -36, 56, -34, 46, 35, -56, -44, 42, 72, 91, -47, -64, -26, -12, -5, 20, 19, -31, -13, 73, 52, 36, -11, 2, -19, -13, -1, 17, +-26, -17, 63, 12, -4, 50, 7, -7, 16, 6, -15, -29, 19, 74, -56, -2, -37, 18, -21, -43, -48, -14, 6, 46, -3, 127, 10, 4, -35, -39, 20, 11, -14, 33, 45, 9, 47, 34, -20, 44, 5, 4, -31, -42, 25, 119, -48, 0, -30, 65, -42, -39, -55, -9, -30, 21, -48, 127, 26, -9, 48, -8, -8, 80, 46, -55, 0, -36, 4, -9, 35, 78, 7, 16, -55, -13, -33, 3, 65, -59, -43, +32, 33, -69, 32, 60, 81, 16, -31, 28, 56, -2, 17, 42, -19, 16, 7, -68, 57, -43, -48, -7, 4, 51, -5, 77, 21, -4, 5, -5, 28, 4, 71, 25, 49, -39, 25, 34, 33, -34, -37, 33, 83, 16, -2, -5, -27, 11, 50, 19, 40, 1, -29, 53, -35, 41, -1, 79, -20, -10, -33, 12, 53, -11, -24, -33, 47, -10, -37, -35, 48, -20, -16, 10, 99, 30, 45, 0, -2, 11, 73, -19, +20, 4, -26, -1, -47, -12, 5, 67, -38, -1, -27, -11, 39, -33, -2, -23, 65, 31, -36, -25, 47, -24, -53, 57, 84, -20, 47, -2, 50, 21, 3, 5, 27, -18, -51, -33, -18, -47, 34, 16, -47, -19, -34, 25, 70, -12, -54, -35, 77, 2, -34, -6, 15, -20, -11, 46, 51, 6, -6, 5, -39, -24, 11, 32, -42, -32, 4, -53, 31, 24, -13, 58, -65, -25, -48, -12, 96, 40, 9, -22, -103, +27, -51, 28, -29, -70, -30, 14, 121, -30, 2, 29, 20, -40, 5, -47, 1, 51, 1, -26, -16, 36, -9, 70, 43, -1, -58, -31, 24, -18, 49, 25, -4, 19, 54, 50, 61, 3, -15, 4, 38, -2, -17, 59, -7, -2, 12, 32, 27, -61, -11, 62, -14, 28, 38, -8, -14, 24, -33, -26, -12, -12, -33, -5, -2, -36, 4, -6, -22, -3, -29, -1, -13, -14, -39, 118, -9, -12, 9, 23, 4, -13, +13, 63, -36, -6, -22, -24, 5, -45, 10, -28, 7, -11, -33, 8, 5, -2, -6, 29, -13, -26, -31, -50, -38, -29, -60, 61, -12, -27, -17, -1, 8, -51, 45, 74, -3, -4, -9, -14, -5, -28, 39, -34, 4, -4, -30, 17, 0, -21, -26, 12, -25, 61, -26, -29, -35, -55, -70, 65, -31, 1, -24, 1, -22, -44, 39, 92, 10, -4, -17, -8, 9, -10, 11, -37, -16, 9, -37, 12, 1, -22, -89, +68, -9, -28, -56, -30, 11, -18, -33, 38, -37, -32, -18, 26, 9, -26, -16, 73, -16, 16, 18, 3, 4, 38, 27, -29, 12, -6, -5, -5, -21, -26, -34, 75, 7, 53, 26, 17, 4, -31, -24, 63, -3, -5, -10, 10, -6, -14, 86, 79, -32, 23, 13, -63, 7, 17, 16, -3, -1, -40, 0, 45, 0, -51, -12, 50, -3, 29, -41, -2, -27, -34, 91, -33, 5, -21, -31, 6, 49, -38, -7, -8, +-10, 9, -2, -7, 46, 7, -54, 8, 41, -17, -36, 28, 31, -23, 63, -12, 12, 19, 70, -63, -8, 1, 58, 25, -27, -11, -1, -1, 15, -42, 23, -2, -64, -27, 32, -22, -33, 45, 5, -26, -43, -43, -25, 55, 6, -65, 33, 27, -10, -17, -14, 59, -19, 73, 105, 29, 20, -1, -20, 15, 2, -58, 0, -2, -23, -30, 2, -11, -41, 92, 22, -31, -19, -48, -38, 18, -13, -50, 60, -21, -34, +-9, -3, 26, 27, 29, -37, -7, -35, -51, 0, -49, 20, 60, -19, 0, -19, -5, 19, -36, 35, -4, -39, 62, -39, -13, 58, 11, 23, -3, 7, -57, 71, 4, 10, 25, -28, -40, -2, -22, -4, -19, -34, -41, 7, 61, -36, -1, -12, 6, 8, 10, 31, 74, -36, -1, 12, -34, 45, 51, 22, -28, 17, -4, 104, 0, 3, 2, -35, -30, -29, 23, -16, -3, 22, 42, 17, -31, -36, 29, -33, -13, +37, -44, 58, -26, -12, -31, -13, -42, 36, 14, 101, -31, -21, 7, 104, 4, -6, -49, -44, -22, -53, 24, -2, -27, 1, 19, -9, -19, -3, 43, -16, 5, -35, -11, 21, 0, 13, -34, -9, -15, 11, -5, 0, -11, 1, 11, 127, 70, 27, -7, -23, -20, -36, -43, -29, -23, -18, 22, 3, -21, -2, 22, -12, 56, -8, -51, 28, 25, 12, -46, -20, -40, -3, 22, -2, -30, 24, -12, 98, 51, -14, +-38, -16, -11, 6, 22, 18, -52, -4, 123, 8, 52, -22, -27, -24, -10, 26, -41, 21, 16, -61, -41, -55, 13, -33, -27, -19, -39, -9, -19, 102, 105, 38, -43, -41, 68, -15, -26, 27, -39, 30, 100, 18, -25, 26, -21, 15, -31, 6, -2, -3, 13, -4, -43, -29, -2, -20, -13, -6, -4, -9, -6, 127, 32, 24, -27, -28, 32, 127, -19, -49, -32, -5, -21, 1, 11, 0, -27, -28, 28, -6, 12, +-7, -9, -8, 73, 78, -27, -13, -15, 4, 33, -20, 75, -25, 40, 17, -4, -64, 15, -53, 3, -10, 12, 25, 29, -18, -20, 15, -22, -13, -7, -51, -41, -24, -28, -26, 12, -23, -12, -21, -20, 3, 25, -10, -6, -20, 31, 27, -19, -36, -47, 11, 0, -17, -23, -14, 18, -30, -43, 29, 8, -7, 55, -27, -28, -4, 27, -37, 20, -59, 32, -18, 28, -2, 28, -3, 120, -36, 8, 26, -2, 15, +34, 90, 11, 7, -19, -14, -48, -14, -50, 2, 2, -29, 29, -57, -19, -63, -12, -23, 83, 35, 43, -46, -6, 13, 30, -15, -100, -42, 14, 80, -12, -82, -6, 102, -10, 73, 33, 39, -13, -20, -15, -31, 1, -66, 38, -41, -20, -15, 28, -26, 56, 78, 5, -40, 4, -32, -7, -25, 10, 10, 33, 8, 7, -24, -13, 113, 0, -20, -17, -9, -1, -25, -9, -32, -18, -22, 29, -26, 3, -10, 4, +-42, 6, 63, -12, -42, 31, -11, 4, -29, 24, -41, 5, 0, -10, -5, 41, -34, -44, 10, 27, -31, -29, -31, -26, -57, -23, -10, 103, 33, 26, -58, -12, -2, 22, -3, 44, -13, -7, -34, -16, 9, 40, -7, -40, -19, -12, 4, -44, 66, -39, -52, -27, 35, 2, -8, 15, -29, 58, 23, -26, -54, -4, -16, -53, -13, 61, 27, 25, 30, 22, 22, -5, -11, -29, -50, -20, -9, -7, 50, -5, 102, +-18, -36, -7, -22, -7, -45, 1, -24, 72, 33, -32, -32, -12, -15, -52, 6, 43, 23, 0, 28, 15, -18, -3, 3, -59, 35, -5, -2, -24, 31, -33, -46, -62, -44, -15, -13, 44, -31, 21, -28, -13, -30, -30, 19, -5, -5, -24, -39, -14, -27, -52, 23, 12, 54, 15, -4, -29, -53, -43, -27, 23, 5, 13, -4, -40, -53, -22, 6, 57, 0, -8, 39, -36, -12, -17, 4, -3, 29, 18, -15, -1, +-14, -46, -52, 60, -1, 7, -20, -35, -17, -55, -5, -32, -38, 1, -70, -25, -16, -18, -59, 5, -3, 18, -23, -28, 1, 27, -2, 3, 23, -8, -5, -10, -33, -51, 15, 78, -5, -19, 21, -14, 16, 4, -21, 29, 86, -13, -60, -14, -27, 22, -32, -23, -17, 25, -10, -34, 22, 5, -5, 8, -28, -34, 27, 18, -40, -53, -4, 7, -4, 10, -39, 4, -20, 46, -18, 19, -20, 2, -21, -17, 0, +17, -49, 17, -1, 24, -38, -22, 7, -4, -10, 30, -33, -12, 28, 7, -12, -10, 45, 22, -27, -19, 3, 23, 0, -15, -22, 34, -23, -25, 127, -47, 32, -65, 67, 54, 91, -9, -34, -37, -12, 69, -48, -31, 31, -37, -5, 123, 80, -50, -3, 33, -12, -34, -49, -93, -40, 91, -4, -27, -21, 13, 19, -24, -20, -40, -29, -13, -3, 30, -6, -42, -4, -50, 15, 14, -16, -2, -15, 63, -8, -35, +44, 34, 8, 13, -11, -6, 21, -11, -26, 6, -23, -1, -12, 12, 18, -35, 11, -25, -1, -13, -47, -19, -21, 39, -16, -10, -22, 2, -8, 55, 15, 14, 36, 15, 45, -11, 1, -15, -25, -26, 9, 32, 4, 4, -16, -14, 12, -26, -4, 10, 8, 12, -8, -5, -15, 17, -18, 14, 4, 13, 33, 35, -2, 10, 21, 28, -46, 13, -10, 41, -13, -26, 15, 19, 3, 21, -43, 14, 56, -16, -12, +4, 76, 18, -4, 45, -31, 0, -22, -5, 19, -20, 5, 65, -57, 10, 77, 45, 1, 18, 6, -4, -22, 5, -47, 44, 8, -20, -7, -6, -17, -18, 20, -56, -4, 29, -11, -3, -34, 27, -30, -31, 17, -2, -10, 13, -52, 29, 66, 21, -67, 52, 36, -2, 2, -1, -8, 58, 13, -13, -53, 2, -13, -18, -10, -37, 17, -20, 19, 18, -52, -22, -18, -17, -6, -8, 15, 26, -45, 39, 69, 4, +41, -30, -8, 42, 17, -26, -26, 112, -6, -2, -9, -13, 32, 7, 1, -15, -38, 9, -19, 8, -51, -11, -13, -45, 47, -47, 10, -5, -36, 16, 66, 35, 70, -33, -25, 19, 55, -46, -16, 109, 37, -6, -7, 4, -36, -3, 0, 59, -29, -27, 36, -32, -22, -9, -76, -37, -8, -9, 56, -24, -4, -26, -52, 31, -36, -84, 29, 19, 5, -36, -9, 31, 2, 46, -47, -8, 31, -10, 41, -6, 14, +34, -49, -8, -31, -5, -23, -7, 4, 4, -18, -32, -5, 38, 11, 57, -28, 13, 36, -3, -9, -41, -27, -37, -3, 37, -27, 25, 37, -32, 22, 29, -13, 11, -28, -14, -29, 16, -36, -8, -9, 17, 6, -31, 10, 56, 14, 42, -49, 38, 19, -10, -32, -52, -8, -24, 7, 35, -24, 45, 56, -47, -32, -20, 81, -58, -30, -14, 15, -14, -11, 91, 39, 39, 24, 37, 13, -26, -7, 5, -9, 47, +23, 2, -20, -35, -25, -23, -13, 39, -27, 68, 102, 47, -72, 0, 81, -31, -34, 25, 100, -33, 27, 99, 19, -3, 32, -17, -5, -24, 7, 5, -30, 95, -10, -11, 48, -44, -39, -27, -46, 80, -31, 53, 45, -17, -79, -24, -5, -9, -25, 15, 39, -14, 28, 21, 20, -55, 26, 0, 14, -39, 10, -32, 26, -34, -11, 27, 0, -28, -21, -32, -73, 15, 1, 31, -17, -11, -11, 19, 30, -37, -16, +46, 23, -41, 28, 50, 56, -6, -2, 18, 10, -18, 61, -32, -25, -29, 11, -15, -4, -14, -34, 27, -29, -36, -1, 15, -5, -11, 1, 9, -8, -58, -20, 15, -4, -23, 20, 53, 46, -23, -1, -8, 37, -36, 16, 30, -12, -40, -6, 10, 4, -5, -48, 27, -10, -6, -31, -5, -11, -14, 75, -13, -18, -12, -59, 66, -8, -3, 7, 61, 14, 0, 51, -1, 1, -26, 15, 9, -55, -46, -26, -68, +-30, -5, 5, -29, -15, -4, 27, 73, -2, -16, 1, 24, 0, -20, -38, 25, 7, -1, 40, 81, -11, -19, -7, -9, 23, -33, 24, 10, 49, -31, -67, -48, -1, -13, -23, 0, 6, 6, 30, -55, -17, 0, 4, 14, 10, -27, -6, -30, -12, -37, 46, 6, 83, -10, -40, 23, -3, -44, 5, -45, -12, -22, -12, 14, 25, 16, 58, 33, -6, -26, 56, 2, 0, 36, 11, -23, 35, -4, -13, 8, -25, +-41, 37, -13, 69, -37, -26, 44, 4, -26, -43, -3, -9, -18, -21, 10, 35, -7, 96, 41, -14, 39, 9, 9, -25, 12, -7, -17, 5, -42, -16, 11, 0, 35, 36, -13, 47, 0, -69, 76, -44, -25, 5, 29, -18, -9, -30, 3, 23, 3, 118, -6, -3, 47, 21, -41, -9, 71, -22, -35, 42, -48, -11, 44, -17, -47, 84, 13, 61, -51, -67, 18, 11, -32, -22, -46, -33, -17, -34, 9, 44, -3, +2, -1, 3, 40, 1, 13, -19, 51, 33, 2, 36, -31, -14, 22, -9, -6, 13, 24, 72, -73, -72, 22, -14, -28, -13, -53, -12, 2, 13, -16, 32, 13, -55, 9, 15, -11, -8, -98, -25, 15, 20, -15, 41, -28, -24, 10, -1, 11, 31, 9, 67, -39, -65, 46, -11, -31, 20, -17, -24, -7, -54, 25, 15, 30, 12, -7, -44, -1, -13, -27, -28, 45, -16, -19, 9, 1, -26, -3, -48, -2, -33, +41, 61, 6, 10, -35, 1, -27, 0, -7, -18, 36, 94, -33, 62, -4, 24, -47, -16, 10, 10, -27, -24, 67, -50, -28, 17, -19, 50, -31, 24, 1, -43, -24, 27, 48, -9, 8, -27, -31, 13, -33, -53, -34, 13, 9, 0, 6, 0, -27, -18, 35, 37, -26, -27, 87, -15, -20, 20, -19, 23, -15, 4, 15, -20, 5, 12, 52, 50, 10, -19, -18, 17, -27, -53, -17, -26, -3, 1, 13, 51, -21, +-12, 30, -60, -60, -34, -2, -1, 5, -21, -11, -9, -45, 2, -30, 48, -51, -11, -32, -22, 68, 39, -34, 22, -10, -2, 51, -33, -9, -48, 127, 33, 0, 28, 13, -97, -65, -39, 41, 10, -18, -22, 25, 22, -64, 44, -10, 6, -51, -31, 12, -27, 71, 26, -60, -24, -33, 7, -33, -29, -19, -5, 92, 3, 30, 31, 33, -31, -41, -23, 76, -23, 14, -54, 3, 25, -22, 27, 13, -18, -18, -9, +42, 25, -19, 66, -18, 34, -67, -49, 3, -9, -26, -30, 67, -4, -19, -23, -4, -6, -36, 3, 5, -6, 37, -33, 1, 49, -29, 31, -25, 9, 18, -24, -14, -6, -16, 59, 5, 36, -42, -11, -5, -5, -22, -40, 76, 15, -9, -24, -11, 22, -10, -11, 23, -13, 14, 36, -7, 35, 4, 21, 5, 17, -14, -45, -29, 76, -2, 11, -7, 48, -25, -30, -20, -11, -13, -32, -15, 20, 10, -25, -7, +-29, 107, -15, 81, 15, -23, -31, 22, -20, -23, -69, -29, -19, -26, -25, 15, -16, -75, 25, -73, -40, -40, -20, 2, -57, 7, -55, 106, -43, -3, -40, 24, 0, -25, -42, 49, 27, -6, -8, -22, 4, 8, -21, -11, -14, -8, 19, -43, 16, -20, -11, -46, -33, -38, 21, -7, -43, -8, -16, 26, 11, 11, 0, -44, -26, 47, -42, -36, 14, -18, -11, -38, -1, -2, 2, 3, 27, 10, 71, -20, -33, +24, -7, 47, -20, -32, -22, -24, -8, 6, -43, 19, -47, 11, -39, -12, -15, -17, 11, -25, -47, -15, -22, 23, -11, -4, -7, 13, 11, -18, 55, -33, 38, -1, 39, 22, 26, -18, 40, 25, -11, -4, -7, 4, -54, -67, -34, -13, -11, -7, -16, 20, -1, -38, 44, 6, -74, -9, 30, -26, -34, -29, 39, 1, -25, -4, 25, -10, -17, 3, -67, 33, -21, -13, -15, -16, 34, -28, -43, -3, -1, 41, +-10, -12, -14, -27, -15, -22, -27, 11, -9, -8, 0, -63, 17, -9, -12, 43, 3, -24, -14, -38, -14, -10, -25, -1, 8, -16, -33, -6, -15, -30, 21, 73, -26, -13, 38, -22, -3, -38, -22, -32, -5, -21, -24, -53, 64, -48, -17, 106, -4, -39, -33, 9, -63, -50, -25, -31, -23, -38, -15, -24, -6, -33, -1, 34, -4, -2, -36, -33, -16, -20, -12, -14, 16, -43, -1, -61, 35, -48, 13, 18, 8, +-34, -40, -4, -32, -37, -27, -3, 2, -31, -14, 8, -19, 0, 7, 101, 8, -20, -44, -11, -17, -32, -32, 3, -8, -10, -1, -47, 38, -21, -49, 42, 24, 52, -23, -20, -15, -3, -22, -8, -12, -25, -33, 1, -1, -1, -2, 8, -56, 1, -52, -40, 12, -20, 49, 11, -24, -15, -22, -46, -12, 42, 127, 54, 40, -25, -14, -8, -26, -12, 62, -29, -15, -44, -31, 49, -10, -40, -31, -42, -6, -23, +-26, -21, 46, 3, 2, 14, -37, -11, -45, 13, 13, 2, 6, 11, -32, 41, -15, -8, 1, 34, 3, -35, 1, -30, -20, 35, 17, -53, -16, 42, -22, -25, 24, -16, 17, -1, 3, -35, 17, -14, -10, 19, 10, 16, -12, 21, -4, 39, 19, -8, -7, 25, -19, -27, 15, -26, -18, 20, -24, -41, 11, 31, 15, -1, -45, -44, 45, -4, 15, 16, -22, -11, -14, 15, 7, 38, 19, 5, 18, 42, 9, +1, -42, 14, -27, -16, 2, -60, -4, 5, -13, -44, -27, 30, 26, -5, 50, -33, 13, 121, 18, 0, -17, -26, -9, -56, 75, 69, 4, 39, -38, 1, 26, -13, 1, 26, 17, 19, -45, -22, -85, -30, -40, 2, -18, 13, -23, -14, -61, -33, 40, 33, -1, -24, 25, -1, -6, 25, 55, 127, -31, 17, 50, -29, -9, 2, -23, -22, -16, -6, 12, 16, -11, 52, -56, -6, 16, 16, 17, 0, -73, 16, +-42, -6, 25, 10, -21, -14, 30, 43, 34, 109, -31, -5, 13, 56, -20, -18, -28, 26, -29, 19, -32, -2, -42, 13, 3, -28, -35, -9, 36, -16, -58, 1, 8, 24, -2, -15, -9, -16, 4, 38, 23, 47, 54, 28, 13, -18, -22, -1, -31, -18, -31, -10, -3, -41, -7, 24, -37, -16, 13, 61, 8, -11, -49, -27, 33, 35, 0, -30, -28, -16, -1, 6, 40, 36, 61, -31, 34, -43, 15, -6, -61, +4, 12, -9, 2, -17, 4, 39, -28, -22, -12, 35, 3, -15, -17, -28, -44, -6, -47, 25, -33, 15, 87, -11, 40, 23, -36, 10, 53, 40, -26, 127, 18, -62, -75, 49, -31, -42, -77, 38, -29, 1, -14, 8, 2, -42, -2, -63, -51, -40, 43, -29, 56, 11, 77, 15, 41, -32, 17, -19, 25, 58, -14, 104, -8, -56, -68, 84, -50, 16, -68, -18, 2, -1, -20, 48, 24, 99, 5, -15, -19, 47, +-12, 42, -3, -1, 56, -5, 7, -37, 13, 2, 16, 9, 5, 38, 48, -31, 4, 19, 1, 31, 7, 7, 22, 49, 3, 80, -7, 19, -25, 31, -3, -19, -30, -3, -7, -16, 66, -13, -21, 7, -8, -24, -40, 14, -6, -4, -32, -49, -10, 33, 11, 10, 28, 0, -16, 19, -51, 90, 0, 37, -22, 1, 1, -63, 5, -28, 4, 4, 88, -22, 1, -31, -8, -20, 83, -9, -22, -35, 38, -8, -14, +62, 19, -38, 65, 28, -47, -20, -25, 127, -1, 38, 6, 8, -32, -25, -4, -1, -15, -21, 50, -21, -4, -26, 31, -13, 35, 1, -28, 11, -2, -23, -24, 17, 3, 12, 36, 41, -31, 8, -17, 84, -28, 14, -19, 45, 2, -24, -35, -35, 11, -37, 60, 14, -14, 12, -3, -17, -2, 40, -23, 14, -11, -23, -22, 37, 9, 5, 19, -11, 4, 5, -5, 37, 12, -19, 24, 17, 30, 1, 13, 10, +-6, -19, 13, 15, 25, 2, 61, -21, 18, 20, 15, -4, -4, -8, -30, -3, -11, -13, 15, -23, -44, -18, -25, 22, 52, -12, 13, -4, -8, 9, 4, 18, -50, 9, 39, -23, -8, 22, -5, -1, -4, 29, 6, 12, 12, -8, -10, 11, 35, -6, 6, -20, -10, -30, 15, 11, 59, -7, -7, 5, 22, 6, 4, -1, 0, 8, 24, -4, -14, 9, -5, 31, 5, 58, -1, 44, 13, -11, -28, -31, 38, +-28, -35, -12, -21, -16, -16, 12, 54, 20, -35, 12, 8, -22, -17, 23, -30, 24, 14, -5, -1, 17, 44, -30, 40, 46, -17, 76, -26, -24, -13, 11, 8, 8, 24, -10, -32, -24, -30, -36, -50, -5, -41, -17, -12, -49, 49, 40, -20, -55, -18, -33, -27, -21, 5, 3, -24, 7, 44, 5, 59, -3, -24, 80, 0, -13, 55, 3, -10, -12, -42, 5, -16, -13, -26, -20, -32, -52, -44, 32, -12, 5, +-44, -15, -15, 15, 6, 8, -12, -33, 31, 8, 13, -10, -29, 71, -8, -5, 21, -30, 35, -14, -32, -37, -1, -17, -47, -14, -34, -45, -22, 15, -5, 4, -26, -29, -40, -3, -10, 31, -68, -34, 55, -2, 42, -40, -7, 36, 29, 17, 23, -58, 1, -14, -6, -20, -24, -8, 3, -18, 3, -34, -15, 33, 5, -38, 2, -2, -22, 20, -17, 26, 9, -31, -10, 21, 4, -18, 0, 30, -3, -9, 23, +7, -33, 5, -41, -6, -26, 11, -11, -34, 0, -18, -11, 32, 16, -1, -17, 3, -19, 2, 41, -15, -16, -21, 13, -34, 14, -13, -27, 42, -18, 17, 5, 23, -4, -26, 37, -61, -29, -59, -47, 19, -41, 14, -30, -32, 9, -75, -16, -3, -19, -28, 35, -34, -9, -12, 2, 6, -17, -49, 38, 1, 74, -15, -45, 27, 21, -19, 70, -59, -81, -92, -12, 13, -65, -46, 22, -9, 14, -45, 27, 5, +11, -33, 40, -27, -15, 10, 40, -11, 31, -38, 6, -25, -16, 8, -35, -24, 18, 23, 30, -16, 1, 18, 45, -17, -48, -15, -11, -23, -47, -12, 5, -34, -24, -3, -28, -24, -6, 93, 12, -46, 0, 23, 7, -8, 24, 26, 96, 9, 27, -22, 37, -5, -9, 44, 15, -19, -6, -16, -32, -24, -31, -18, -7, 8, -25, -1, 38, -26, -27, -5, -12, -4, -15, 4, 19, -47, -23, -22, -20, -7, 14, +7, 2, -18, -38, 22, -13, -3, -49, -15, -19, -38, -3, -41, 12, -44, -14, -7, 61, -14, 11, -27, -26, -30, -34, -24, 68, 1, 2, 38, -46, 32, -6, -23, 14, -7, -48, 17, 21, 2, -27, -30, -5, -16, -44, -20, 15, -17, -38, 2, 43, -31, -21, 21, 18, -30, -6, -11, 63, -20, -9, 10, -44, 27, 20, -8, 23, 6, -18, 13, 1, -21, -23, -16, -41, 6, -21, -23, -15, -11, -22, 6, +63, 4, 3, -23, -19, -30, -6, 22, -11, -8, 4, -11, -20, 5, 1, -44, -59, -52, 46, 12, -42, 22, -23, -26, 60, -16, -53, -16, 8, 11, -20, 71, -43, 6, -20, 36, -11, 70, -23, -42, -36, 13, 37, 2, -10, 9, 8, -3, 32, -16, -13, 52, -21, 43, -21, 7, 17, -2, 73, -5, 4, 7, -19, 43, 7, -2, 0, 6, -14, -24, -30, 0, -35, 29, -6, 9, 60, 31, 2, -43, 25, +-11, 22, 43, -34, 23, 25, 14, -1, -42, 20, 2, 36, -13, 0, 64, -34, -17, -37, 10, 2, -42, -35, -24, -14, -40, -4, 3, 60, -32, -17, -16, 11, 1, 57, 60, -20, 33, 25, 5, -31, -48, -9, -21, -12, -40, -7, 37, 1, -24, -21, -13, 28, -16, -49, -23, -9, -11, -18, -11, 19, -23, 6, -34, -15, 36, 24, 60, -30, 24, -23, -18, -41, -27, -11, -46, 16, -37, 47, 3, -55, 26, +-28, 4, -18, -14, 26, -26, -30, -34, 25, 2, -58, 29, 5, -63, -29, 21, 13, 6, -15, -2, 3, -47, -12, 20, -25, 40, -31, -33, 41, -32, -17, -10, -35, -28, -47, -14, 11, 29, -14, 27, -7, -16, -28, -18, 24, -25, 8, 15, 23, -8, -16, 5, -56, -1, -9, 37, -37, 40, -39, 0, 11, -5, -22, 1, -32, 46, -15, -16, -40, -20, -21, 19, -8, -47, -31, -25, -14, -8, -38, 3, 3, +-10, -20, -12, -20, -16, 42, 23, -37, 41, -27, -5, -5, -18, -12, -17, 9, -13, -27, -17, -13, 50, -14, 26, 5, -14, -28, 15, 3, -24, -4, -4, -10, 5, -35, 17, -17, -36, -27, -12, -7, -16, -27, 11, 8, -27, -26, -28, -4, 2, 32, -10, -11, 31, 22, 7, 11, 16, -42, 17, 6, -12, -30, 0, -3, -16, -4, 20, 51, -59, -8, -39, 21, -1, 43, 21, 51, -21, -20, 13, 11, -43, +-18, 5, 54, -28, -22, -31, 35, 8, 89, -11, 12, 55, -25, -20, 13, 107, 14, 14, 87, -53, -34, -13, -19, 26, 58, 26, 51, 48, -44, -17, 127, -57, -24, -20, 4, -20, -7, -35, 59, -9, 114, -33, 2, 24, 24, -36, -6, 62, 5, 20, -35, -7, -25, -9, -36, -11, -20, 12, -54, -22, -39, -12, 3, 43, 62, 73, -10, 41, -14, -10, -62, -24, 6, -16, 76, -17, -25, 9, -3, 97, 60, +32, 37, 6, 34, 1, 24, 47, 21, 18, 37, 27, 3, 30, 15, -5, 38, 49, 8, -15, -36, -5, -1, 10, -27, -27, 17, 32, 2, -10, 8, 127, 79, 17, -2, -24, -32, 25, 11, 40, -36, -38, 52, -5, 7, 36, 23, -39, -14, 67, -68, 6, -7, -16, -21, -11, 44, -27, 28, -1, -25, 2, -3, 127, 65, 43, 22, -20, -31, 16, 13, 19, 6, -23, 21, -12, -23, 37, 54, -22, 66, 44, +-5, -9, -14, -30, -40, -9, 45, -42, 30, 20, -45, 11, 8, 49, 31, 14, 26, -18, 27, 0, 0, 17, 47, 27, 28, 21, -4, -10, -13, -32, -7, -15, -9, 23, -3, -14, -35, 2, 6, -18, -23, 63, -25, -23, -16, -12, 9, -9, 46, 20, -66, -21, 15, -16, -45, 15, 1, -46, -9, -33, 5, 30, -49, -68, -36, -26, -15, -3, 8, 18, 14, 62, 65, 27, 3, -34, 3, 55, -12, -8, 34, +21, -14, -7, 10, -3, -11, -32, -27, -19, 19, 28, 6, -6, -28, -45, -18, 8, -8, 15, 4, 35, 6, 127, 51, 77, 14, -17, -6, -6, -8, -19, 12, -6, -24, 55, 21, -16, -6, -17, -34, -18, -17, 19, 9, 33, -26, -24, -43, -17, 14, -23, -10, 6, -4, 127, 42, 25, -7, -27, 0, -33, -16, 21, 50, 7, -69, 19, 37, 3, -14, -4, -39, -18, 7, 6, -16, 48, 14, -52, -46, -21, +-24, -13, -16, 10, -27, 127, 53, 63, -35, -7, -14, -17, 21, -50, 27, -12, -26, 4, 127, -26, 44, -30, -33, -24, -72, 52, 72, 2, 7, -20, -8, -5, 8, -34, -11, 38, 74, 97, 71, -26, -45, -20, -29, 22, 14, -2, 43, -28, -34, 5, 95, -2, -6, 27, -40, -9, -40, -28, -35, -38, -73, -19, -8, -24, 3, 5, 16, 30, 5, 72, 50, 3, -33, -2, -18, 1, -37, 3, -12, -1, 20, +42, 85, -27, 4, -22, -13, 14, 34, -13, -32, -28, -53, -24, 35, -5, -17, -32, -21, 27, 49, 127, 79, -19, -42, -11, -13, -14, 27, 25, 15, 10, 85, 8, 104, 10, 63, 18, -3, 24, 1, -5, -48, 9, -53, -15, 127, -20, -28, -2, -5, 25, 17, 110, 41, 40, -10, -18, -13, -34, -18, -6, 35, -34, -13, -35, 77, -31, 63, 20, -36, -3, 3, -36, -28, -15, -25, -29, -47, -27, -34, -13, +-32, -9, 45, 111, 41, -16, -39, 77, 57, -40, -12, 25, -40, -24, -67, 65, -28, 38, -8, -13, 8, 21, 2, -37, 17, -50, 36, -11, 4, 34, 24, 30, 76, -17, -24, 60, -33, 31, -33, 30, 46, -8, -26, 15, -28, -57, -5, 59, -34, -8, 24, -64, -16, 20, -17, -5, -33, -26, 36, 30, -6, -64, -33, -19, 90, -33, -46, 16, 7, 77, -44, -4, -10, -34, 21, 89, -29, -73, 33, -10, -57, +-12, 30, -5, 87, 26, -8, -20, 13, -2, -18, 28, 60, -42, -11, -4, 58, 79, -31, -37, -14, -9, 5, 5, 30, -21, 36, 3, -32, -43, -16, -3, 18, 12, 21, -31, -21, -27, 127, -41, -41, 3, -5, -10, -8, 32, 23, -7, 79, 64, -13, 0, -30, 21, -56, -18, 43, -24, 22, 58, -8, -36, -30, 29, -19, -7, -15, -15, 22, 11, -27, -18, -3, -24, -10, -31, -52, 38, -9, -2, 57, 26, +-30, 7, -35, -10, -7, -17, 11, -22, 38, 45, -5, -31, 0, 39, -16, 8, 16, -35, 1, 9, 38, -25, 11, 0, -8, 1, -15, -5, -2, -25, 109, 13, -21, 3, -25, 18, -17, 24, 47, -28, 29, -19, -2, -43, -15, 15, -7, 14, -16, -13, -18, -12, 107, -22, -6, 0, 11, 2, 0, 11, -22, 4, 66, 5, -21, 3, -17, 20, -44, 7, 8, 10, 21, 4, 58, 47, 66, 56, 6, 7, -35, +-39, -58, -61, -16, -32, 29, -19, -15, -6, -20, -33, -12, 32, -20, -15, -32, 37, -72, 46, -19, 9, -23, 4, 0, 1, 15, -39, 38, 13, 4, -21, -12, -39, -6, -34, -6, -20, -17, -10, -30, 2, 1, -22, -3, -16, 10, 28, 1, 15, -16, 39, -38, 27, -2, 24, 8, 14, 35, -35, 39, 28, -19, -5, 13, -14, -35, -14, -6, -8, -21, 3, -35, -33, -1, 3, 23, 10, 21, 7, -19, 1, +-15, -9, -15, 21, -13, -10, 29, 15, 34, -28, 32, 31, 2, -6, -5, -57, -36, -23, -12, -11, -5, -4, -21, -12, 15, -14, 13, -14, 16, 19, 3, 22, -26, 1, -15, 78, 13, 3, 5, 13, 68, -28, 17, 23, -17, 38, -23, 27, -52, 17, -3, -6, -22, -23, -17, 35, -57, -42, 11, -18, -43, -48, -17, -39, -27, -66, -69, 42, -9, -2, 4, -9, -13, 1, 29, 52, 6, 0, 12, 21, -6, +-31, 2, 20, -34, 4, 14, 51, 46, -4, 6, 32, 2, 73, 14, 9, 2, -23, -56, 13, 2, 6, 55, 18, 20, -56, 43, 29, -28, 38, 37, 43, -17, -28, 42, 19, 2, -29, -2, 29, -62, -51, -3, 43, -43, 55, -25, -12, -32, 7, -16, 56, -12, -12, 18, 27, 18, 40, -7, 48, -19, 3, 5, -6, -6, -48, 80, 4, 8, -2, -9, 32, -6, -19, 23, 3, -32, 44, 9, -40, -22, -33, +-7, 18, -4, 11, 20, 20, 7, -21, 19, 79, -3, 11, 8, -15, 12, -46, -5, 10, -42, 22, -13, 1, 28, -11, 15, -5, -2, 13, -5, -5, -10, -20, -2, -36, 28, -41, 40, 37, -16, -14, -19, -28, 37, 30, -1, -23, -4, -67, -46, 126, 4, 28, -9, 66, -17, 18, -21, 17, 50, -15, 22, -34, -8, -12, -35, -60, -27, -76, -1, 32, -8, -2, -43, -34, 38, 53, -10, -11, 12, -49, 14, +95, -11, 72, -8, 32, -3, -52, -39, 20, -98, 27, -44, -67, -29, 5, -28, -35, 31, 18, 45, 70, -23, -29, 16, 6, -22, -21, -79, -11, 51, -22, 3, 127, -28, 22, -19, 20, 3, 4, -84, -9, 21, 35, 0, -49, 38, 12, -32, -7, 54, -29, 20, -29, 57, 1, -1, 3, -44, -32, -11, -14, 81, -20, -33, 41, 74, -3, 64, -14, 16, -22, -6, -16, 2, -21, -13, -9, -13, 2, 99, -1, +73, 21, 14, 4, 45, -6, 49, -23, 7, -30, -24, -22, 73, -16, 9, 59, 36, -28, 105, 49, 25, -17, -24, 8, -29, -28, -43, 10, -11, 9, 22, -8, 32, -10, 30, 39, 36, -18, 32, -24, 2, -38, -17, 7, 49, -25, -33, 39, 17, 4, 59, 12, 2, -5, -18, 3, -15, -37, -21, -28, -12, 24, -16, -25, 28, 1, 41, -41, 63, -19, 11, -14, -15, -22, 5, -38, 42, -43, -31, 20, 127, +-33, 75, 38, 6, -20, 4, -10, -24, -21, -21, 7, -25, -6, -30, 3, -1, 15, -49, -32, -2, -25, -12, -21, 60, -40, 97, -14, 3, -43, -15, 30, 50, 35, -11, -12, 22, -11, -41, 8, -23, -16, -1, -39, -41, 41, -17, -13, 38, 22, -15, -38, 6, 5, 2, 1, 94, 12, 5, -24, -3, -31, -32, 33, 1, 47, -27, 16, -11, -7, -29, -25, -21, 0, 23, -22, 20, -8, -15, -20, 9, -17, +-28, -26, -10, -21, 10, -17, 41, -17, 1, -21, -36, -13, -11, 13, 8, 27, 24, 3, -9, -6, -46, -27, -35, 13, -16, -11, 12, 5, 27, -16, 4, 6, -39, -17, -15, 26, 10, 8, 46, -25, -14, -7, 7, 30, -10, 36, -7, 32, -11, -21, -19, -14, -38, -25, -34, 10, -24, 13, 69, 6, 25, -15, -32, -33, -53, 7, -18, -37, 19, -30, -14, 6, 24, -28, -9, -17, -41, 25, -55, 33, 77, +27, -17, -20, -30, 82, -43, -13, -22, 10, 33, 33, 75, -1, -47, 26, 13, 41, 21, -38, 9, 14, -36, 19, 80, -8, -34, -19, -13, -39, -88, -6, -50, 9, -9, -3, -29, 113, 5, 31, 12, 29, 4, 44, 4, -18, -59, 10, 26, -36, 23, 5, 0, -16, -20, 66, 71, -16, -9, -11, -39, -28, -52, 16, 0, -13, 3, -30, -22, 59, 19, 32, 1, -17, 30, -21, -8, -18, -19, -4, 19, -9, +-5, -22, 4, -9, -19, 11, -2, 8, -23, 4, -17, -43, -68, -16, -15, -12, -7, -17, -26, 12, -21, 15, 49, 20, -20, 7, 47, -21, -15, -9, 10, -9, -4, 12, 16, -29, -25, -13, 12, -11, -50, -2, -16, 24, 14, 26, -19, -9, -12, 15, 11, 127, -10, 35, -5, 14, 19, 4, -5, -28, 12, -11, 7, -9, -36, -53, -23, 38, -34, 91, -19, 4, 5, -46, -13, 0, -52, 5, 22, 17, 68, +-39, -30, 76, -36, -53, -13, 26, -14, 40, 9, -28, 47, -50, 62, -1, 1, -42, -38, 40, -17, 94, -8, 15, 61, 11, 60, 62, -68, 24, 6, 55, -18, 76, -22, 82, -27, -45, -15, -4, -24, 37, -16, -16, 5, 3, 63, -25, -38, 46, -14, 35, 16, 7, 3, 52, 32, -33, 21, -55, -19, -22, -2, -27, 32, -32, -17, -63, -30, -13, -2, -30, -2, -29, 0, -2, 65, -10, 16, -30, -21, -12, +17, 8, 5, -8, -5, -22, -9, -24, -10, -39, 6, -24, 0, -10, -34, 60, -38, 6, -42, -18, -7, -15, -18, -32, -36, 39, 54, -9, -10, -18, 4, 20, -48, -34, 48, 24, -18, -17, -30, -5, 6, 1, -11, -44, -3, 49, 22, -15, -56, 38, -52, -18, -52, -12, -28, -31, -19, 18, 57, -20, -27, -22, 2, -1, 13, -21, 48, 48, -3, -29, 18, -1, 17, -9, -25, -30, -19, 14, 29, -26, -16, +3, -15, -7, -10, -13, -24, -28, 4, -12, 61, -1, 4, -53, -18, -15, 22, 0, 15, 6, -12, -16, 2, -8, -1, 3, -11, -24, -29, -11, -42, 2, -12, -18, -13, -6, -15, 1, -6, -11, 15, 23, -32, -32, -21, -7, -22, 5, -21, 0, 47, 36, 5, -25, 12, -7, 18, -16, -47, -13, -7, 55, -52, 68, 26, 9, 2, 8, -1, -32, 32, 24, -21, 84, 4, -36, -42, -40, -38, -39, -3, -26, +-23, 34, -14, 1, -23, -18, 1, 23, 18, 23, -26, 59, -30, 4, 33, 8, -42, -25, 15, -29, 33, 67, -42, 45, -25, -27, -27, -28, -18, 7, 9, -25, -16, -7, 11, 0, 1, -26, 8, 25, -16, 9, -6, 56, -44, 17, 36, -4, -43, -34, -7, -8, 29, 43, -50, 76, -35, -51, -41, -36, 2, -24, -12, -20, -12, 19, -19, -36, -24, -6, 7, 53, -37, 16, -3, 30, -34, 54, 5, -4, -38, +-40, -12, 23, 18, 49, -74, 21, -24, 5, -20, 7, 91, 49, -14, -56, -45, 54, -24, 10, 40, -9, 12, 57, 6, 30, -22, -6, -86, -12, -33, -40, -55, -29, -26, -4, -33, 15, -48, -39, -14, -29, -19, -47, 32, 1, 15, -16, -50, 36, -13, 39, -5, -23, 0, 53, -39, -1, 38, 19, 51, -27, -27, -35, 27, -18, -11, 71, 8, -21, -50, 65, 0, -43, -38, -1, -25, 50, 2, -27, -4, 19, +-18, -15, -9, -15, 11, 108, 14, 31, 36, 21, -35, 24, -31, -1, -21, -29, -17, 42, 29, 17, -39, 0, 17, -1, -27, -2, -5, -23, 6, -2, -3, 18, -15, 14, 14, -20, 12, 55, 1, 16, 40, 14, 37, 9, -40, -28, 7, -18, 12, 38, 36, -3, -41, -4, 0, -25, -20, -20, 4, -9, 13, -33, -9, 29, -24, -1, 3, -16, 5, 86, 51, 35, 9, -13, 22, 19, 25, -18, 2, -29, -16, +21, 17, 19, -44, -15, -7, -20, 101, 29, 9, -4, -23, -16, 6, 20, -20, 92, 5, -63, 41, 10, 67, 13, 5, 28, -50, -8, -29, -24, 16, -43, -40, -14, 30, 0, -41, -30, -19, 2, 16, 9, -15, -29, -36, -54, -28, 15, -59, -31, -7, -35, 49, 56, 14, -48, 59, 43, 31, -1, -54, -20, -58, 7, -60, 19, -22, -66, -11, -16, -8, 23, 40, -26, 3, 18, -8, -19, 0, 10, 17, 4, +-20, -24, -37, 37, 35, -19, -71, -11, -16, -5, -10, -40, -34, 60, 49, 48, 16, -27, 6, -22, -12, -24, 55, 22, -31, -25, -11, -35, -22, 25, -4, 1, 6, 63, 5, -9, -28, 11, 5, 0, 9, -17, -19, -12, -7, -27, -3, 35, -19, -33, 15, 17, -4, -28, 63, 47, -35, 45, -4, -6, -25, 1, -19, 20, 8, -42, -21, -33, 52, -49, 7, 17, -10, -24, 14, -23, -3, -5, -31, 13, -16, +-5, 9, -23, 11, -4, 38, 7, -25, 14, 4, -19, -2, 18, -2, 18, 9, 51, 17, -51, 32, -51, -12, 17, -4, -27, -19, -29, 5, 30, -39, 54, -10, -18, -12, -2, 26, 15, 56, 1, -18, -10, -24, -37, -20, 28, -20, 17, 24, 41, 27, -32, -14, -9, 18, -2, -22, -14, 5, -20, -5, 3, -42, 56, 1, -52, 5, -31, -36, 23, 9, -15, -17, -25, 60, 19, -28, -6, 68, -26, 78, -48, +-20, 17, 21, -26, -24, -8, -29, -20, 23, -12, 13, -11, 25, 3, 8, 34, 1, -6, -27, 38, -21, 29, -20, -9, 14, -38, -10, -4, 26, 6, 42, 38, 27, -5, 8, -51, -11, 3, -34, -11, 17, 10, 40, -8, -8, 9, 12, -23, -1, -12, -29, 34, -12, -8, 3, 18, 45, -32, -36, 34, 17, -9, 60, 34, 0, -5, 5, -36, 8, -42, -36, -4, 25, -1, 22, -23, -28, 17, 14, 16, 31, +-15, -54, 39, -23, -31, 8, -16, 30, -52, 6, 1, 68, 0, 55, -27, 19, -41, 30, -58, 8, -10, 0, 9, -14, 16, 57, 15, -9, 26, 11, -7, 69, -31, -26, 13, -6, -14, 3, 4, -40, 3, -18, 74, 1, -39, 14, -38, -28, 21, -27, -15, -22, 15, 21, -5, -27, 11, 13, 23, -4, 51, 52, -3, 37, 3, -23, 4, -3, -14, 54, -35, -23, -1, -11, 59, 53, -11, 35, -24, -27, -38, +-49, -27, 13, 30, -4, -30, -21, -17, 39, 14, 66, -16, -2, -31, -21, 18, -58, -6, -3, -2, -30, -11, -4, -14, -39, 5, 39, -20, 89, 89, -22, 48, -10, -20, -42, 42, -17, 14, -30, -23, 29, -2, 38, -11, -16, 15, 21, -3, -23, -1, -3, 14, -10, 7, -20, -44, -26, -15, 53, -30, 74, -20, -38, 19, -44, -27, -15, 7, -10, -20, 4, -19, 10, -15, 48, 23, -3, -19, -8, 28, -15, +-4, -14, -16, -6, -20, -15, -43, -8, 0, 43, -19, 41, -28, -16, 43, -37, -20, 24, 23, -22, -19, -6, -6, 26, 19, 26, 26, -8, -7, -4, -12, 10, -29, -17, -42, 12, -9, -8, -18, -48, -23, -46, 5, 29, -26, -11, -11, 127, 12, 4, 15, -9, -75, -24, 2, 24, 12, 14, 10, -44, -42, 14, 47, -14, -3, 42, -7, -28, -12, -25, -35, -27, -48, -21, -2, 91, -60, -23, 11, 34, 12, +-55, -27, -46, -48, -20, -1, -20, -5, 8, 7, -51, -30, 1, -31, 22, -40, -22, -3, -44, -6, -9, 5, -25, -10, -4, -22, -8, -28, -57, -20, 30, 64, -47, 1, -79, 41, -80, -13, 44, 27, 21, -32, -3, 5, -10, 16, -15, -7, 23, 14, -17, 6, -16, -30, -16, 4, -25, -15, 50, -26, 35, 1, 32, 2, -4, -4, -54, -14, -8, -1, 24, -36, -18, 8, -30, -34, 8, -52, -31, -23, 22, +15, 28, -23, -18, 9, 43, -10, 52, -17, 34, -3, 36, 24, 127, -6, -28, -10, 0, -17, 13, 10, -48, 21, -1, 46, -33, -6, 31, 0, -57, -54, 35, -1, -35, 32, -24, -13, -5, -39, 22, 59, 58, -27, -3, 3, 55, 56, -59, 5, -42, -44, 39, 12, -41, -46, -19, 43, -63, -21, -15, -25, -16, -52, -4, -8, -23, -12, -42, -28, 25, -17, -12, -37, 25, -25, 43, 48, 40, -20, -19, -6, +-59, -5, 2, -1, -20, 16, -37, 4, -5, -9, 3, 45, 10, 5, 50, -9, -20, 0, -54, -10, -25, -52, 11, 9, 74, -37, 14, 5, 22, 1, -38, -16, -83, -41, -9, -15, -27, 23, 4, 25, -41, -9, -16, 2, -24, 8, -11, 46, 6, 7, 13, 4, -10, -3, -27, -41, 56, 14, 8, 27, 57, 30, -40, -2, 8, 31, 3, 11, -69, 16, 13, -18, -35, -54, -2, -21, -8, -31, -4, -3, -12, +-3, -33, -8, -4, -22, 23, 34, 25, 0, 27, 19, 47, -4, -21, -35, -2, -43, -12, -1, -1, -23, -13, -2, -4, -7, 0, -4, 0, -7, -34, 7, 7, 20, -39, -11, -39, -15, 28, 15, 44, -39, 9, 20, 71, 14, -16, -1, 27, 14, -20, -4, 24, 8, -34, -35, -10, 3, -26, -16, -7, -38, -18, -25, 15, 0, -20, -28, -13, -14, 26, 23, 44, 24, 15, 0, 47, 38, -30, 8, -6, 9, +10, -2, -5, 3, -21, -23, -23, 13, -30, 1, 6, 2, -34, 0, 1, 11, -17, -7, -30, -18, 58, 38, 76, 23, 13, 10, 57, 31, -19, 12, -9, -19, -24, 1, -4, -11, -3, -52, -28, 36, 6, -108, 58, -47, 31, 38, 9, 111, 7, 42, 26, -100, -20, -7, -22, 21, 54, -48, 37, 23, -10, 2, -13, 0, 34, -28, -25, 2, 14, -14, -57, 49, -23, -28, 39, -24, 16, 40, 6, 44, 11, +-2, 0, -18, 5, 29, -15, -4, 26, 2, 32, -3, 5, -2, -13, 1, -25, 3, -14, 0, 3, -23, -24, 41, -9, 3, 4, -52, -17, 16, -27, -37, -7, -8, -3, -20, 42, -4, 23, -20, -28, 22, 83, 15, 37, -11, 6, 24, 10, -31, -11, -11, -42, -37, -37, -3, 9, 68, -4, 70, -4, 55, -8, -17, -23, 38, 25, -27, 39, -11, 20, 6, 13, -35, -6, -39, -3, 3, 16, -31, -16, 38, +-15, 11, -51, 14, -16, -4, -2, 127, 37, 47, -63, 30, -43, -53, -84, -9, 21, -30, 113, -28, -13, 19, -22, -19, 43, -65, -28, 81, 27, -17, 1, 22, -3, 9, 3, 34, -41, 2, -8, 40, 10, 12, 14, 36, -18, -18, -23, -11, 35, -19, 31, -14, -59, -17, 15, -34, 10, 53, -6, 9, 12, 0, -22, 36, -11, 29, -15, -3, -15, -23, 10, 127, 32, 27, 0, -2, -24, -19, -26, -2, 1, +6, 64, -9, -52, -14, 19, -21, -2, -8, -8, 55, -17, -23, 2, 7, -1, -17, -12, 30, 1, -30, -8, -6, 41, 6, -44, -39, 20, -24, -18, 42, -20, 25, 17, -39, -26, 50, -44, 4, -12, 45, -13, 0, 33, 18, -14, 43, -3, -7, -56, -12, -18, 2, -24, 70, 37, 33, -50, 9, -28, -42, 0, -6, 47, -93, 55, -28, -48, -12, -54, -36, 6, -7, -1, 31, 39, -10, -24, 90, 13, 26, +-4, 8, 66, -25, 4, 127, 38, -28, -16, 45, -22, -16, -53, -14, 37, -11, 8, 10, -28, -35, 40, -52, -28, -48, -17, 41, -13, -23, 51, 8, 23, 32, 12, 9, -34, -4, -21, 115, 9, 20, -39, 28, -47, -41, -80, -25, 16, -8, 127, -47, -25, 26, -31, 1, 19, -23, -25, 68, 30, 15, -1, 44, -1, -17, 19, 43, -22, -22, -3, 60, 91, 50, -24, 17, -34, -22, -11, -26, 28, 14, 67, +27, -19, -17, 3, -18, 16, 0, -9, 37, 2, 18, -21, 15, -19, 34, 3, -25, -33, -8, -10, 127, 33, 102, -20, 8, -1, -30, -45, -6, -9, -13, 67, -36, -57, 9, 1, -8, 19, 8, -17, 41, 49, -36, -5, 20, -29, -19, -16, -38, -1, -23, -16, 15, -32, 24, 28, -6, -36, -6, -21, 1, -10, -17, 28, 5, -7, 39, 10, -7, -7, -3, -1, 4, -25, -2, -25, 0, -34, 31, -10, 35, +14, 1, -12, 42, -1, 38, 30, -29, -9, -8, -35, 1, -12, -2, 28, -17, -7, 17, -2, 28, 25, 51, -37, -4, 12, -14, -36, 23, -36, 47, 1, 46, 40, -11, -10, 22, -31, 63, 25, -32, -32, -27, -29, -1, -6, -16, 43, -29, -6, 62, -23, 17, -13, 61, -20, 4, -12, -17, -20, 23, -33, 27, -2, 50, 2, 20, 55, 42, -13, 14, -5, 62, 6, 44, 10, -71, -42, 65, 43, 0, -48, +-54, 26, 15, -55, 101, 6, -14, 7, -49, -37, -67, -61, 59, -27, 18, 97, 38, 3, 94, -23, 12, -10, -1, -17, 16, -15, -33, 9, 127, 39, -5, 12, 1, 43, 21, 19, 28, 12, -5, 29, -37, -16, -52, -49, 26, -12, 27, 26, 10, -30, 65, 1, -36, -18, -51, -15, -22, -17, 31, 10, 19, 62, -1, 38, 7, 16, -25, 6, 52, -29, 104, 22, -19, -69, 48, -50, 31, -13, 41, -16, 9, +13, -33, -45, -44, 19, -8, -3, -11, -26, -1, 0, -20, 3, -23, -24, 56, -2, -32, 13, -1, -17, 40, -32, 2, 23, -2, -14, -4, -27, -16, -15, -13, 15, -49, -46, 31, -43, 11, -21, -41, -17, 4, -22, -36, 37, -27, -21, -23, 4, -59, -26, 12, 9, 48, -46, 4, 80, -8, 90, -2, -24, 20, 5, -24, -37, 15, -17, 5, -5, -58, 3, -59, -7, 25, -52, 6, 29, 0, -9, 101, 12, +-12, -36, -11, -49, 101, -24, 5, -33, -3, 4, -24, 0, -26, -45, 69, 15, -10, -40, 12, -29, 9, -13, -9, 32, 22, -5, -30, 32, -11, -12, -12, 21, -29, -33, 15, -28, 51, -27, -12, 15, -19, 18, -33, -9, 9, -2, -6, 35, -21, 65, -6, 33, -22, -24, -2, -47, -12, 24, -26, 46, 43, 5, 13, 17, -24, -18, 3, -12, 109, -14, -6, -25, -9, -15, -23, -35, 48, 5, -5, 61, -52, +-48, 25, -21, -6, 21, 20, -28, 19, -19, -21, 57, 0, 18, 13, 48, -8, -42, 11, -45, 28, -18, 28, 57, -66, 22, -40, -32, 18, 25, -48, 47, -35, -70, -4, -23, 7, -49, -20, 1, 19, -14, -50, -25, 18, -6, -43, -48, -19, 20, 23, -23, 27, -21, -5, 6, -34, 3, -20, -41, 58, 5, -27, 10, -33, -31, 36, -41, 13, -6, -47, -23, -25, -9, -39, 20, -8, 17, -33, -28, -48, -17, +4, 11, 27, -45, -3, 81, 34, 66, -17, -11, 11, 18, -41, 58, -51, -51, -41, 8, -24, -3, 15, -19, 34, -41, -5, 40, -11, 10, -37, -4, -16, -15, 18, -33, 45, -13, 4, 16, -51, -4, -16, -13, 27, -25, -2, -9, 15, -31, -5, -5, -3, -8, 28, -1, 7, -20, -43, 22, -2, -36, 36, -19, -20, -55, 2, -13, 24, -33, 29, 39, -6, 18, -25, 28, -24, 9, -36, -14, -43, -47, 1, +46, -21, 2, -1, 1, 13, 127, -33, 41, 7, -37, 45, 55, -21, -44, -7, -32, 75, -23, 2, -7, -15, 30, -73, -5, 3, -17, 46, -4, -9, -35, -16, 72, -42, -26, 16, 11, 12, 127, -1, 36, 9, -29, 10, 2, -26, -37, 29, 14, 104, -9, -2, -23, 3, 25, -33, -21, 25, 22, 15, -19, -36, -44, -11, 64, -4, -37, -6, -3, 2, 127, -57, 18, 3, -28, -4, 42, -24, -41, 51, 16, +81, -16, -11, -18, -1, -1, -40, -38, 6, -7, -7, 6, -38, 30, -42, 90, -14, -5, -5, -17, 3, 61, -43, 13, -15, -8, -17, -10, -11, 12, 48, -38, 44, -1, 8, -19, -25, -30, -4, -36, 10, 5, -51, -31, -28, 1, -33, 83, -36, -12, 29, 29, 8, 72, -40, 56, -25, -36, 28, 21, -14, -54, 19, -2, 42, -16, 1, -19, 9, -5, -33, -5, -32, -1, 1, 50, -42, -56, -40, 1, 6, +-41, -31, -19, -12, 23, -49, 1, 2, -26, 39, 10, -14, -52, 7, 24, 9, -14, -15, 5, -17, 11, -3, -4, 8, 13, 14, -42, 30, 6, 53, -12, 17, 26, -29, 21, -16, 3, -22, 32, 17, 51, -12, -23, 45, -13, 13, 65, -29, 32, 30, -35, -25, -35, 33, 62, -6, 5, -8, -33, -7, -13, 9, 15, 17, -11, -42, 31, 31, 6, -27, 19, 8, 49, 33, 73, 35, -8, -31, -46, -28, 108, +23, -49, -34, 0, 35, 50, 3, 23, 4, -62, -7, 3, -7, 8, -18, 51, -29, -88, -46, -34, 32, -6, -9, -30, 26, 41, 19, -46, 18, 16, -69, -9, 21, -24, 10, -66, 40, -24, 49, -20, 87, -29, 28, -9, 117, 20, 40, 73, -17, -46, 28, -7, 3, -17, 15, 45, 29, 9, -11, -20, -2, 9, 27, -41, 0, -17, -48, -17, 8, 1, 15, -20, -7, 18, 16, 8, 30, 26, -8, 44, -24, +-1, 28, -4, -45, -16, 38, 38, -36, 0, -13, -26, -29, 103, -30, -29, -26, 19, -17, -36, 88, 7, 16, -22, 25, -32, 5, 7, 12, 37, 32, 41, -51, 88, -31, 19, -24, 16, -1, 38, 10, 82, -56, -39, -14, 14, -26, 87, 10, 19, -44, -30, 48, 92, 13, -71, 23, -28, 17, -36, 122, 25, 33, 83, -35, -18, 60, 14, -6, -23, -25, 18, 19, 65, -1, -17, -20, 73, -11, -2, -15, -15, +-54, -43, 41, 41, 47, -24, -5, -27, 1, 6, 32, 4, 13, -7, -38, 26, 52, 5, -3, -5, -13, 58, 31, 46, -17, 5, -25, -47, -20, 71, 25, -35, -27, -9, 25, 74, 18, 38, -37, 10, -14, -14, -7, 10, -9, 60, 21, 1, -20, 1, -32, -26, 2, -30, -26, 14, -6, 11, -13, -9, -6, 23, 32, -41, -12, -22, 41, -1, 0, 4, 39, -49, 10, 18, 64, 11, 61, 68, -7, 6, -16, +-24, -15, -33, 19, 33, 17, 42, 5, 12, -15, 59, -7, -34, -16, -30, -2, -28, 9, -15, -4, 1, 3, 41, -27, -13, 69, -23, -14, 60, -20, 11, 29, -24, -9, 2, 9, 16, 32, 12, 0, -4, -7, -31, -23, -52, -45, 6, -23, -21, -7, 5, -25, 30, 21, 29, -26, 4, 62, -6, -46, 54, -26, -5, 1, -24, -29, 2, -20, 29, 44, -10, 2, 85, -17, 2, -57, -24, -28, 5, -5, -6, +26, 27, 12, 23, -4, 31, -16, -13, 85, -2, -28, 47, -20, -28, 16, -19, -30, -33, -6, 31, 4, -4, 6, 83, -33, -6, -67, -42, -26, 12, 5, 13, 10, 26, 14, 9, 8, -32, -18, -46, 91, 43, -29, 65, -56, 5, 58, -38, -19, -45, -26, 1, 15, 62, -22, 53, 25, 10, -97, 62, -52, 46, 19, -30, -5, 36, -11, -12, 26, -33, -22, 3, 64, -12, -18, 78, -3, -22, -11, -23, -32, +0, 22, -15, 39, 9, 15, 38, 50, -7, -48, 4, -54, -5, 15, 8, -5, 20, -4, 53, 21, -64, -13, 48, 127, -2, 3, 51, -66, -13, -2, -9, 10, 48, 7, 56, 2, -7, -6, 38, -46, 86, 14, 13, -11, -9, -16, 26, -11, 90, -11, -42, 20, -35, 41, 25, 0, -32, 9, -2, -6, 7, 52, 8, -58, 0, -4, -27, 14, -18, -25, 26, -9, 26, -1, -9, -6, 11, 4, 45, -9, 20, +12, 26, 50, -20, 74, -25, -21, -5, 45, -45, -43, -11, 90, -52, -10, -3, -32, 2, 29, -18, -37, 12, -3, 69, -14, -72, 32, -26, 46, 32, -9, 78, -17, -1, 113, -27, -9, 52, -24, -5, 6, -32, -67, 5, -3, 26, -31, 12, -36, -8, -52, 127, -18, -10, -14, -10, 43, 11, 32, -34, -41, 48, -19, -49, -3, 39, 21, -20, 21, -21, 26, 39, -10, -33, -16, 25, 41, -44, -1, -6, -42, +-5, 1, 39, -18, -24, 70, -7, -6, -12, 12, -19, -21, 53, 12, -15, -21, -11, 21, -53, 39, 30, -3, 10, -8, -13, -47, 32, 8, -18, 29, 48, -34, -31, 19, -19, 40, -17, 24, 28, -45, -39, -36, 19, 25, 29, 24, 6, -5, -14, 110, -32, 108, 12, -10, 18, 54, -2, 16, -8, 30, -8, 4, 73, -46, -33, 20, 14, -55, 52, 18, 31, 14, -62, -26, -28, -19, 4, -35, 58, -63, -19, +119, -44, 26, -13, -15, 53, 25, -11, 4, 34, 16, -26, -20, 35, -30, 1, 42, -22, -45, -13, 71, 23, 0, -18, 1, -6, -27, 51, -7, 46, -34, 15, -22, -22, 57, -11, -16, 10, 39, -47, -24, -14, 82, -29, 9, 13, -24, -14, 40, -11, -10, 7, -7, 53, -23, -50, 29, -16, 1, 48, -19, 87, -38, -6, 74, -54, 61, 9, 14, 1, 34, -2, -66, -24, 49, -4, -15, 41, -20, -32, 20, +-25, -11, -17, 29, 5, 20, -11, -11, 32, 1, 15, -26, 35, -50, -24, 127, -29, 21, -27, -19, 27, 27, -42, 23, 43, -23, -13, 2, 22, -44, 13, 20, 74, 3, -7, 8, 9, 17, 2, 26, -25, -44, 69, -3, -15, 30, -3, 41, 5, 8, 2, -14, -11, 5, -20, -48, 50, 17, -22, 0, 3, -22, -30, -36, 19, 31, -47, -26, 7, -14, -13, 4, -41, -22, 69, -24, -36, -6, 23, 48, -5, +15, -12, -4, 15, -3, 2, -22, 59, -1, 8, 5, 21, -34, 4, -33, -23, 55, -46, 13, -8, 7, 11, 16, -37, -58, 65, -31, -27, -27, -36, 49, -5, 16, 3, -18, 24, -32, 9, -21, 63, 17, -10, 9, 17, -20, -35, -13, -10, 50, -63, 3, 10, -19, 2, -11, -43, -22, 69, -28, -50, -1, -46, 36, 6, -17, -2, -74, 0, -3, 52, 25, -22, -24, 42, 41, 66, -58, -46, 10, -86, 42, +-39, -21, 18, -37, 12, 22, -49, -47, 88, -7, -69, 13, -39, -45, -23, 18, 5, -37, -6, 19, 1, 19, 10, -2, 7, 15, -10, -48, 5, 24, -25, 62, -51, -19, -4, -18, 26, -1, -31, -26, 63, -31, -8, 7, -35, -17, 11, -6, 37, -39, -3, 18, -9, -44, 6, 41, -28, 23, 14, -46, -28, 33, -6, 14, -12, -32, 26, 42, 4, -9, -12, -11, 96, -18, -56, 26, -41, 32, 74, -18, -17, +15, 21, 40, 0, -20, 33, -2, 12, -3, 6, -11, -7, -20, -29, 11, -19, 6, -26, 60, 12, 11, -23, -46, -17, 6, 19, -24, -26, -15, 76, -48, -41, 5, 62, 39, -17, -21, -41, -6, 7, 20, -50, -47, -17, 19, -37, 14, -63, 23, 2, 43, -5, -17, 11, -29, 3, 20, 49, 7, -32, 24, -33, -5, 8, -24, 10, 82, -1, -57, 19, -12, 51, -42, -51, -13, 47, -37, -18, 6, 21, 11, +35, 49, 44, -24, -13, -44, -26, 0, -10, -16, -5, -38, -10, -6, 2, -7, 28, 60, 36, 4, 5, -7, -1, -40, -40, -18, -5, -6, -49, -4, -24, 22, 37, 23, 39, -9, -11, 0, -18, -13, 5, -25, -22, -11, 70, -32, -22, -15, -11, 17, -42, -23, -31, 31, -6, -23, 25, -4, -28, -24, -14, -47, -26, 32, 8, 32, -38, -20, -5, 38, 2, -11, -22, -26, -41, -29, 111, -34, 14, 18, -6, +36, -4, -51, -2, 20, 17, -17, -71, 23, -15, -37, -50, -10, 31, 19, -2, 64, -8, -57, -50, -47, -32, 1, -3, -2, -17, -29, 17, -2, -15, -28, 37, 18, 34, -24, 2, -20, 22, -12, -65, -6, -16, -44, -36, -13, -8, 77, 26, 65, 21, -28, -25, -41, 2, 7, 1, -48, -22, -11, 90, -57, -44, 4, 54, 50, -4, -34, -39, -15, 19, -1, -50, -49, -56, -9, -15, -2, -48, 13, -21, 43, +-14, -2, -31, -38, 15, -17, 53, 10, -31, 11, 53, -29, -51, -20, -13, -17, -60, 7, 5, -3, 87, -51, -8, 17, -18, -5, -12, 53, -46, 33, -10, 31, 9, -32, -5, -8, -9, 7, -10, -21, -36, 3, 38, -9, 8, -27, -5, 21, -18, -6, 19, -28, -7, -31, -31, -15, 48, 0, -7, 47, -38, 27, 30, 39, 38, -16, -34, -11, -2, -23, 8, -20, -53, 6, 2, -11, -31, -41, 45, -14, 24, +58, -18, -30, 15, 8, 3, -5, 17, -31, -41, 80, 37, 7, 61, 11, 6, -6, -40, -47, -56, 34, -13, 25, -12, -10, -36, -31, 14, -33, 35, -22, -1, 14, -30, -51, -26, -11, -54, 3, 24, -42, -52, 60, 39, 6, 24, 39, -30, -5, -13, -36, -34, -13, 4, 36, -7, -10, -30, -17, 1, -33, 29, -7, 13, 49, -11, -21, -3, 23, -26, -40, 0, -40, -34, 54, 35, -4, 50, 65, -18, -4, +-13, -3, -44, 16, -39, 14, -19, -2, -20, -15, 7, 26, 23, 40, 19, 55, -2, -39, -39, 16, -78, -41, -22, -15, -28, 47, -56, -39, 10, 18, 41, 5, -37, 24, -39, -11, 22, -43, -31, -33, -1, 0, 11, -28, 17, -4, 15, -2, -2, -6, -14, -5, -20, 35, -2, -15, -10, 55, -34, -15, 7, 24, -15, -5, -28, 13, -23, -11, -3, -17, 8, -10, -9, -44, 39, -67, 42, 72, 10, 5, -10, +-28, 23, 29, -21, -24, 20, -56, -25, 34, -9, 61, 19, 49, 1, -21, -24, -15, -21, -22, -14, -28, -26, -13, -18, 21, 9, 4, -6, 43, -4, 20, -12, -23, 2, 56, -15, 36, -10, -25, 12, -49, -38, -27, -8, 32, 61, -52, 1, 62, -41, -46, 40, -24, -31, -3, -51, 36, 40, -7, -38, -40, -15, -18, -35, 6, 42, 92, -36, 3, 47, -14, -33, -25, -13, -8, 30, 6, 40, -25, -8, 47, +-33, -74, -11, 19, -3, -35, -27, -53, 91, 10, 62, -11, -14, -37, 62, 45, 33, 32, 10, -21, -16, -21, -4, -28, 38, -39, -35, 18, -50, -1, 23, -75, 62, 15, 4, 3, -25, 2, -37, -12, 73, -21, -17, -27, -24, 0, -18, -15, 18, 51, -18, -26, 27, -29, 14, -23, 5, -26, 13, -5, -7, -19, 13, 12, -34, 3, 40, -16, -26, -3, -73, 37, -6, -47, -23, -12, -12, -42, -34, -44, 47, +81, 3, 18, 24, -25, 28, -3, -29, 17, -23, -23, 33, -35, -13, 68, -24, -50, 51, 31, 47, -24, -60, -61, 24, -29, -23, -20, -62, -48, -48, -36, 94, 84, -15, 0, 17, -37, -6, -49, 12, 12, 0, -2, 11, -19, -36, 30, -44, -11, 14, 17, 26, -44, -11, -7, 95, 2, -16, 7, -8, -10, -21, -57, 69, 47, -50, -22, 8, -28, 47, 11, -12, -28, 0, -3, -9, 16, 16, 5, 56, -24, +-1, 6, -18, 11, -30, 31, -5, -9, -44, -25, -23, -2, -3, -2, 32, 74, -60, 11, 51, 4, 6, -26, -8, -4, 50, 6, 46, -24, 12, 52, -40, -71, -31, 6, -26, -32, -34, -2, 28, -25, -5, -10, -31, -28, -39, -51, 29, 42, -13, 22, 36, -50, -14, -8, 2, 20, -25, 23, 75, -33, 6, 56, -54, -6, 61, -32, -16, -14, -9, 26, 43, 20, -20, 22, -20, -11, -28, 4, 33, 17, -7, +-51, -2, 47, -20, -40, 41, -15, 29, -16, 29, -11, 7, -5, 48, -45, -12, 29, -28, -12, -15, 0, 75, -58, 35, -41, 29, -6, 26, 19, -4, 15, -17, 0, 17, -23, -17, -1, 8, -15, -15, -14, -7, 13, -24, 8, 12, -22, 30, -23, -18, -31, 15, -26, 35, -27, -3, -25, -2, 19, 8, -19, 17, 31, 10, 16, 1, -13, -6, 16, 17, 15, -13, -38, -2, -10, -17, 2, 34, -37, 19, -17, +-32, 7, 14, -19, 75, -41, 24, -38, 45, 15, 20, 12, 15, 52, 5, 7, 16, -6, 7, -2, 3, 5, -33, -17, -7, -12, -15, -28, 9, -13, 33, -35, -31, -8, 11, 20, 100, 58, 18, -9, -33, -46, 15, -14, -17, 10, 14, 100, 37, -56, -70, -20, 30, -70, 2, -53, -27, 15, -22, -4, 37, 8, -15, 13, -26, -48, 47, -16, 43, 10, 2, -31, -7, -42, 12, 20, 24, -19, -9, 36, 21, +-29, -52, 11, 7, -15, -38, -23, 32, -15, -21, -9, 19, -19, -5, -6, -19, -38, 3, -31, 46, -7, 12, 9, -5, -35, -34, 6, -13, 84, 2, -15, 22, -29, 23, 9, -48, -33, 4, 28, 26, -5, -17, 88, -12, -18, 7, 3, -28, 7, -30, -42, 4, -19, 30, -6, -6, 3, -3, -24, -15, -10, 25, 15, 23, -50, 4, 49, 25, 14, -13, -2, 8, 1, -17, -50, 14, -18, -7, 42, -44, 58, +33, -53, 4, -11, 56, -1, -48, -37, -23, -54, 3, 1, 6, 34, -3, -58, 49, 21, 19, 5, -22, 12, -24, 2, -35, -44, 1, -40, 23, 76, -2, -24, -7, 26, 17, -31, 27, 27, 26, -16, -7, -37, -8, 36, -11, -4, -4, -28, 20, 34, 6, 38, 40, -15, -14, -15, 0, 2, -13, 69, -8, 55, -38, -28, 47, -30, 6, -11, 51, 14, -19, 10, -38, 6, -26, -26, -2, 16, 2, -33, 21, +-10, -8, -32, -5, 7, 5, 20, -24, -10, -3, -10, -1, 66, -15, -11, -42, -26, -18, -24, 4, 2, -30, -44, -54, -14, -3, 27, -2, 67, 37, -18, 13, 52, 17, 12, 24, 19, -50, -5, -58, -14, -8, -19, 14, 22, -34, 33, -14, -43, 14, -2, 54, 3, -46, -37, -12, -89, -4, -38, -20, -2, 21, -38, 21, 47, 27, -35, -35, -25, -53, -22, -49, -37, 25, -5, -34, 127, -28, -4, 27, -35, +19, 29, 50, -8, 16, -14, -22, -62, -18, -27, 8, -9, -25, -63, 53, -11, 15, -56, -29, 14, -39, 18, 4, -48, -1, -9, -20, 109, -28, -19, 22, -41, 2, -15, 69, 7, -52, -31, -19, -28, -9, -19, 28, 69, 1, -54, 33, -13, 14, -7, -11, 14, -45, 1, -38, -40, 5, -50, -21, 62, -19, -22, 2, -23, 11, 13, 6, -28, 6, -20, -14, -38, -7, 33, -18, -15, -12, -17, 29, 76, -19, +16, 35, -6, -8, 4, -30, -19, -26, -27, 56, 72, -56, -3, -30, -20, -33, -20, 52, 27, 9, 43, -11, -30, -7, -28, -17, 35, -5, -57, -15, -20, 5, -25, -41, -6, -17, 7, -14, 12, 22, -6, -11, 46, 8, -3, 4, -4, 3, -10, 5, -23, 43, -12, 4, -5, -31, 50, 0, -13, 31, -8, 17, 32, -13, -31, 19, -8, 108, 18, -45, -28, -15, -6, -21, 21, 4, -33, 36, -13, -11, -3, +-3, -40, 13, -38, -10, 9, 41, 75, -18, 2, 20, -12, -20, 27, -10, -26, -28, -18, 105, 8, -31, -10, -14, -1, -14, 34, 0, -45, 30, -4, 9, 4, 11, -44, 15, -31, 37, 9, 12, 60, -12, 34, 22, -1, 11, 36, -14, -35, -25, -5, 115, 53, -23, -14, -15, -10, -10, 62, -7, -55, 67, -31, -49, 44, 58, -60, 127, -14, 19, -65, -40, 10, -7, -34, -17, 16, 23, 12, 36, 46, -45, +-84, 58, 66, -40, -21, 50, -8, 93, -4, 1, -34, 5, -35, -50, 35, 13, -38, 30, 3, -4, -37, 3, 25, -33, -33, 5, -18, 33, 8, -23, -21, -4, -21, 41, 32, -17, -22, -5, 62, -9, 1, -18, -6, -49, -8, -22, 0, 67, 7, -8, -17, -12, -40, -17, -1, -53, -5, -3, -24, 28, 35, 34, -5, 24, 29, -1, 19, -48, -22, -35, -16, -10, 20, -11, -17, 7, -20, -10, -13, 27, 19, +-41, 19, 56, -23, 5, -21, -48, 5, 33, -56, 60, -3, 10, 10, 56, -13, -2, -3, -29, -21, -17, -24, -10, 15, -40, -16, -18, -30, 10, 3, -12, 10, -29, 14, -21, -10, -11, -32, -9, -25, 10, -22, -14, 0, -28, 8, 15, 17, 14, -21, 7, -7, 25, 9, 2, 22, -24, 47, 1, -17, 21, -32, -3, -12, -60, -10, 5, -11, -35, 0, -27, -32, 43, 2, -18, 11, -21, 33, 33, -2, -8, +-20, -7, -20, -19, -2, -1, 41, -47, 34, 0, 2, 3, -22, 2, 7, -23, 0, 4, -3, -28, 0, -3, -12, 30, -20, -7, 15, -1, -29, 22, -19, -11, -17, -22, -9, 6, 20, -31, 18, -19, -7, -8, 26, 0, -5, 14, -41, -27, 2, -9, -10, -44, -14, -22, 50, 95, -40, 16, 42, -27, -15, 27, -5, -3, -45, -17, -15, -10, 13, -22, 68, 14, 12, 31, -10, -8, 6, -13, 8, -11, 28, +10, -7, -6, 8, -23, -19, 13, 7, -8, 17, 25, 3, -3, -5, -7, -36, -28, -10, -1, 9, -4, -16, -23, -7, -14, -2, -28, 11, -24, 17, -29, 12, -6, -46, 1, -25, 1, -19, 48, -24, 12, 24, -38, -29, -36, -11, 7, -56, 0, 29, -37, 19, -8, 23, 4, -11, 19, 44, -17, 4, -5, -1, -56, 10, 13, -50, 5, 7, -24, 12, 55, 42, -20, -18, 3, -2, 11, -1, -17, -31, -9, +-36, -1, 4, 1, -8, -16, -32, -35, 78, -23, 0, 51, -18, -37, -8, 93, -51, -68, -33, 25, -3, 101, -44, -9, 24, -37, 57, 3, -14, -8, -63, -57, -60, 20, -4, 26, 72, 8, -23, 8, 19, -24, 33, -18, 6, -15, 28, -2, -8, -16, -4, -15, -5, 21, 17, -36, 0, 5, 7, 16, -5, -19, -33, -28, 4, 23, 0, -18, -1, -15, -17, 16, 39, -43, 13, -36, -15, -17, 22, -19, -20, +-44, 2, -6, -7, 39, 9, -7, 31, 27, -39, -29, 10, -19, -45, -25, 2, -7, -18, 1, -3, -6, 6, 4, 6, -29, -3, -20, -11, -21, 3, -16, -27, -19, -7, -11, -16, 44, -23, -11, 41, 5, -44, -38, -5, -8, -28, -10, -6, -9, -2, -21, 10, -25, -27, -16, -15, -18, 14, -24, -11, -1, -25, -11, -6, -16, -2, 42, -11, -88, 46, 53, 29, 20, -11, 39, 13, 56, 83, -4, -62, 77, +15, 82, -19, 30, -35, 33, -15, 11, 53, -11, -4, -49, 28, 43, 9, 24, 52, -10, -49, -21, 46, 4, 6, 14, -41, -16, 1, -15, 6, 25, 17, -4, 3, -60, -23, -59, 18, 0, -33, -41, 16, -27, -12, -46, 47, 38, -13, 29, 1, -35, -59, -5, 1, -16, -31, 30, 0, -4, 33, -7, 35, 56, -11, 8, 17, -82, -46, -25, -33, 18, -21, -3, -1, 9, 46, 37, 39, -9, 2, 17, -2, +9, -53, 36, -26, -13, -14, 46, 80, -31, 1, -28, 61, -30, 46, -15, -16, -35, -33, -42, -14, 34, 122, 40, -39, 16, -21, -23, 19, 0, 41, -49, -35, -24, 5, 23, -65, -1, 42, -28, 54, 17, 2, -75, 38, -7, 38, -40, -26, -9, -40, 79, 24, 27, 116, 13, -11, -7, -42, -1, -17, -25, -6, -6, -8, 4, -2, 31, -36, -25, 33, -55, 78, 0, -19, 2, -9, -19, 36, -4, -15, -6, +-12, -6, 13, -22, 118, -28, -16, -15, -32, -12, -10, -17, -18, -32, 22, 60, 32, 18, -49, -57, 8, -20, 127, -5, -11, 12, 17, -18, 52, 7, -58, 13, -16, 6, 43, 43, 127, 39, -3, -7, -41, -27, 0, 2, -24, 6, 0, 7, -16, 11, -11, -4, 3, 12, 13, 36, 21, 15, -23, -13, 41, -16, -12, -29, 21, -4, 23, -12, 127, 3, -37, -49, -43, -40, -25, -9, -39, -1, -10, 17, -26, +18, 7, 24, -13, 17, -18, -16, 3, 31, -18, -2, 1, -33, 5, -6, 29, -11, 14, -14, 100, 23, -11, -3, -44, -26, -40, -10, 10, 0, -28, 30, -6, 5, -34, 3, -8, 1, 50, 11, -6, 1, -15, -15, 65, -6, 21, -25, 5, 9, -5, -14, 127, 12, -22, -5, -31, -32, -28, -26, -19, 11, -10, 13, -18, 5, -31, 78, 13, -21, 11, -10, 4, -26, -36, -19, 19, 10, 61, 5, -18, -6, +-30, -37, 127, 7, 18, 20, 1, -22, -36, -54, -31, -22, -23, 29, -23, 1, -14, -28, -17, -3, 92, -13, -28, -6, -11, -36, 38, -19, 4, -29, -38, 40, -9, -17, 127, 16, -57, -2, -40, -68, -18, -1, -73, 11, -1, 92, -5, 25, -9, -53, -50, -3, 25, -9, 3, -5, -35, -5, 3, 4, -17, -17, -6, -44, 44, -10, 127, 53, 10, -8, -9, -22, -34, 1, 34, 0, -3, 6, -13, -9, 7, +-13, -7, -14, 49, 2, 2, 6, -15, -15, 30, -1, -10, -28, -11, -34, 19, -10, 127, 17, -18, -10, -12, -33, -36, -50, 9, -5, -18, 27, -24, 22, 1, 1, 0, -11, 62, 13, 8, 19, -18, -17, 24, -18, -7, -16, 21, -23, -17, 23, 127, 10, -34, -4, -28, -25, -23, -26, 2, -23, -11, 27, -28, -4, 10, 0, -6, 17, 14, 7, 21, 23, -20, -11, 38, -10, 13, -3, 11, -2, -26, -6, +28, -17, 5, 52, 9, 67, 27, 13, 30, -69, -57, 78, -26, 43, -16, 8, -15, 13, 43, 80, -24, -8, 21, -54, 27, 45, 31, 31, 6, -74, 52, 36, 55, 16, 17, -30, 2, -30, -30, 2, -37, 35, -5, 63, -37, -35, -25, 69, 8, -19, 42, -51, -28, -10, -12, -4, 50, -8, 52, -12, -45, 13, 24, 33, 75, 15, 4, -41, -8, -30, -36, 16, -63, 13, -17, 57, -43, -56, -25, 61, 21, +-5, 31, -21, -35, 48, -38, -26, 79, -7, 6, -33, -25, -12, 25, 5, 19, 26, -21, -17, 60, -46, -29, -1, -37, -10, -45, 101, 12, -31, 3, -24, 25, -67, 15, 17, -19, -18, 37, 14, -6, 3, 24, -20, -16, -8, 26, 19, -17, -54, 98, -5, 40, -13, -14, 38, 43, -64, 1, 15, -6, 11, 22, 36, -32, -38, 13, 10, 74, 12, -1, 19, 1, -58, -5, -27, -6, -16, 5, 14, -7, -20, +45, 4, -40, -4, 44, 13, -27, -14, -32, -8, 1, -17, 27, 18, -38, 7, 29, 31, 48, 5, -16, 15, 10, -29, 14, -14, 43, -2, 1, 33, -39, -3, 57, -18, -22, 32, 40, 40, -9, -6, -34, 14, -20, -6, 26, -13, -40, 55, 17, 21, 34, -1, 40, 35, 44, -25, 67, -14, -3, -13, 34, 5, 22, -6, 33, -46, -6, -6, 31, 7, -1, -31, -9, -14, 27, -25, 42, 10, -10, 3, 29, +14, 36, -2, -11, 19, 13, -4, 9, -7, 9, -6, 14, -21, 12, -17, 57, -23, -12, 5, 45, 9, 2, -49, -41, 72, 23, -28, 9, -2, -47, -29, 28, 12, 49, -6, -21, 45, -8, -4, 38, -61, -15, -19, -12, -25, 28, -19, 28, 23, -20, -46, -3, 38, -3, -22, -40, 9, -22, -7, 5, 45, -22, -47, -5, -25, 23, -5, 10, 10, 2, -18, 7, 1, -16, 39, -8, -37, 0, -20, 54, -1, +-7, -23, 14, 6, 21, -24, -30, -22, -3, -24, -20, 49, -37, 27, 14, -41, 13, 12, 30, 16, -20, 13, 38, -15, 9, -3, -39, -16, 12, -18, 35, -48, -24, 3, 12, 41, -22, -29, -19, -10, 1, -19, -9, 17, -7, 1, 41, -25, 64, -20, 15, -11, 4, -3, 15, 0, 17, -12, 16, -65, 47, -48, 6, 66, -50, 9, 53, -20, 7, -62, -52, 58, -11, -43, -33, 0, -79, -15, 0, 32, 76, +-18, -11, 59, -34, -12, 15, -48, -24, -9, -36, -45, 40, 41, 42, 18, -19, -42, 29, 31, -31, -73, -27, 0, 24, -7, 88, 24, -23, -7, 23, -17, 71, 24, 6, -5, -10, -12, 10, 1, -1, -1, 5, -41, 46, -12, 32, -18, 3, -14, 2, 24, 19, -45, -2, -14, -8, -19, -21, 25, -31, -34, 24, -38, 31, 20, 18, 38, -16, -6, 19, 5, 6, 31, -26, -22, 41, -22, 17, -1, 16, -32, +-13, 18, 8, -27, -22, 22, -10, -23, -12, 10, -25, -7, -6, -6, 18, -12, 12, 46, -12, 7, -3, 1, 18, 38, -32, -5, 33, 19, -74, -21, -30, -38, -16, -23, 98, 18, 25, 34, -26, -94, -43, -14, 0, -32, 21, -54, 36, 33, 38, -11, -16, -48, 3, -21, 28, -35, -40, 34, 18, -14, 5, 28, -7, -26, -15, 0, 27, -27, -36, 23, -37, 8, -35, 2, -8, -5, 63, -87, 80, -13, -43, +-26, -22, -21, -17, -5, -5, 27, 2, 25, 1, -9, -7, -26, -21, -29, -20, 0, 14, 8, -39, 3, -60, 15, -24, 2, -12, -28, 36, -54, 106, 6, -42, -18, 9, -16, -22, -40, -12, 3, -51, 11, -43, -21, -3, 32, -6, -23, -23, 5, 14, -37, -2, 45, -19, -30, -33, -16, -21, -28, 20, 1, 60, 10, 31, -19, 25, -11, 1, -38, 14, 10, 11, 1, 33, -20, -51, 127, 21, 54, 9, -56, +27, -13, 62, -13, -44, -8, 12, 28, -28, -14, 5, 79, -55, -15, 3, -33, -55, 8, 20, 26, 31, 14, 105, -13, 32, 35, 74, -1, -28, 127, -12, -3, 29, -8, -4, -29, -8, 47, 29, 13, -8, -23, -20, 72, 26, -20, 15, -29, 7, -14, 13, -22, -11, 8, -39, -36, 30, 20, 49, 19, -46, 112, 15, -45, 10, -14, 9, -39, 23, 75, 32, 8, -27, -19, -29, -24, 43, -36, -5, -45, 0, +2, 11, -20, 17, -60, -18, -11, 27, 2, 50, 12, 2, 73, -14, -27, -1, 1, 20, -30, -1, 39, -11, 21, -23, 1, -25, 10, 11, -30, 10, -25, -20, 5, -21, 5, -29, -4, 1, -9, 1, 2, -11, 1, 49, 17, 24, -4, 21, 41, 12, 10, 11, 31, 8, 10, -44, -12, -25, 90, -2, 74, 18, -68, -25, 26, -10, 37, 11, 77, 1, 14, 26, 15, 3, 18, 12, 67, -2, -31, 16, -1, +7, -3, -8, 17, -3, -17, -16, 127, -18, -24, -14, -24, -3, -18, -20, -20, -7, 15, -17, 19, 5, 25, -10, -3, 90, 31, -6, 65, -8, -10, 26, -5, 18, -9, 3, 50, 21, 1, -24, -10, -1, 6, -35, -24, 11, -1, -38, -21, 20, 15, -18, 6, -16, -36, 0, 8, 66, 20, -17, 56, 3, -26, 3, 1, 26, -3, -22, 15, 8, 25, -29, -16, -6, -8, 4, -31, 1, -10, -30, -27, 10, +-30, -2, -6, 12, 3, -10, 27, -9, 77, 0, 27, -3, 14, 50, 28, 98, 38, -8, 51, -29, -25, -29, -36, -8, -21, -11, 106, 14, -16, -48, 41, 2, -4, -30, 66, 19, 0, 51, 13, 107, 34, -20, 96, -19, -27, -6, -16, 37, -9, -35, 63, 12, 52, -12, -31, 22, -17, -9, -24, 19, -20, -39, 14, -24, -1, -13, 2, -2, -31, 25, -13, 109, 27, 0, 38, 3, 10, -28, -17, 20, -8, +-8, 42, -2, 8, 6, 27, -4, -10, -23, -34, -12, -16, -16, 2, -17, 34, -5, 27, -13, -7, 14, 0, 84, 51, 28, 56, 7, -27, 16, -27, 42, 7, -8, 36, -37, 5, -7, -19, -14, 22, 2, -42, 13, -25, -12, 0, -25, 10, -18, 13, -14, -31, 1, 62, 9, 67, -72, 11, 80, -15, -89, -76, -16, -36, 101, 1, 42, -20, -10, -42, 127, 28, 105, 14, -26, -51, 40, -39, 57, -58, 41, +7, -58, -16, -32, -9, 54, 40, -14, 105, 9, -32, -46, -4, 15, -25, 19, 16, 66, -25, 15, 127, -24, -56, 17, 10, -18, -4, -34, -12, 44, -19, -19, -23, 8, 2, -49, -31, 12, 45, 0, 70, -17, -61, -16, -32, 29, -35, 10, 24, 81, 26, 24, 127, -30, -12, -12, 21, 12, -20, -13, -46, 109, -46, -11, -4, -19, -31, -37, -16, -58, 37, 15, 109, 22, -10, 38, -12, -16, -4, -31, 2, +28, 25, -28, -24, -67, -6, -23, 41, -4, -36, 21, -56, 115, -29, -6, 6, 127, -48, -46, -31, -64, 0, 28, 0, 38, 15, -17, -37, -26, -4, -27, 30, 17, -46, 85, -31, 43, -8, -56, -16, -7, -18, 36, 36, -39, 112, 67, -29, 25, -21, 3, 3, -14, 1, -24, -13, -38, 25, -3, 16, 8, 16, -42, 0, 41, 43, 52, 14, 19, 9, -29, -24, -42, -26, -34, 31, 8, 91, -3, -22, -30, +10, 2, -6, -37, -13, 4, -17, 6, -8, 7, 22, -12, 15, -50, -19, 32, 68, 103, 60, -10, -18, -3, -18, -25, -53, -8, 61, 34, 83, -8, -13, -69, 13, -1, -11, -40, 23, 12, -12, -14, 13, 24, 20, -1, -13, -37, -16, 21, 44, 62, -11, 27, 4, 13, -16, -23, -5, 3, 11, 5, 42, 33, -2, -9, 11, 5, -15, -56, 26, 34, -5, 24, -37, 62, -31, -25, 26, -36, -9, 44, -34, +27, -48, 68, 3, -40, 4, -19, -37, -16, 29, 27, 34, 63, -3, -26, -18, 19, -9, -12, 4, 38, 21, 15, 13, 40, 1, -15, -7, -14, 11, -4, 6, 18, -5, 26, 8, -6, -8, -17, 4, -38, -3, -38, 66, 4, -29, -20, -27, -18, 22, -40, 30, 17, -4, -15, 10, 10, 15, -7, 5, -20, -17, -1, 9, 13, -1, 97, 7, -24, -33, -21, -20, -21, 21, -15, 15, 32, -24, -5, -14, 24, +-49, -27, 23, 33, -35, 33, 48, 11, 39, -5, 24, -8, 4, 45, 83, 45, -41, 19, 5, 25, 2, -2, 0, -32, -4, -15, 49, 46, 41, -19, 24, 33, 4, -41, -13, 97, 35, 2, -34, 78, -1, -41, 28, -44, 5, 64, -64, 30, 19, 71, 28, -5, -44, -10, -50, -24, 30, -15, 88, 121, 50, -12, -18, -16, -17, -54, 0, 32, 4, -2, 30, 3, 22, -39, -24, -10, -15, 37, 31, 50, -6, +21, 4, -5, -20, -23, -27, -30, 25, -22, 74, 37, -3, -13, 10, -18, -28, -45, 15, 47, 6, 20, -24, 14, 22, -1, 12, 19, -9, 23, -12, -5, -27, 25, 7, -3, -20, 6, -22, -46, 28, -27, 75, 52, -16, -42, -12, -20, -12, -30, 15, 37, -1, 14, -4, 14, 23, 3, 0, -1, 22, 34, -25, 8, -1, 63, -2, -17, -12, 21, -25, -33, 42, -6, 80, 54, -5, -18, -59, 37, 17, 24, +-42, 7, -45, -43, -21, 63, 115, -45, 9, -59, 11, -32, 30, 36, -27, -24, 104, -46, 90, -16, 49, -35, 9, -30, 5, 16, 7, -9, -32, 40, 27, -10, 6, 67, -20, -39, -4, 10, 15, -40, -13, -61, -10, 19, 0, -17, 15, -7, -26, -22, -23, -30, -47, -15, 50, 22, 31, 4, -47, 0, -20, 34, 1, -2, 6, 44, 21, -57, -15, 4, 19, -45, -6, -72, 8, 51, 27, -14, -4, -4, -6, +-40, -28, 35, -26, -42, 65, 13, 25, -24, 8, -5, -10, -17, -21, 15, -47, 54, 3, -89, -16, 33, 9, 18, 9, -19, -16, -2, -50, -33, -10, 49, 69, -16, 5, -16, -28, 0, 49, -25, 10, -28, -7, 114, -23, -33, 28, 0, 12, -14, 4, -11, -14, -27, -19, 61, -12, 12, -2, 19, 14, -14, -27, -13, 49, -14, -4, -7, -59, 23, 23, 1, -37, -7, 22, -24, -27, 1, -11, 13, -25, -5, +-14, -8, -22, -4, -5, 16, -24, 4, -1, 6, 0, -35, -13, 5, 14, 37, 13, -12, -2, -11, -14, 6, 7, 30, 1, -27, -36, -9, 15, 29, -51, -32, 18, 3, -25, 10, 34, 7, -44, 61, -16, 0, -17, -50, -31, 38, 24, 46, -1, 15, -29, -26, -14, 60, -12, 8, 11, -24, -13, 0, 7, 22, -10, 21, -1, -2, -17, -5, -16, 11, 3, -7, 6, -10, 15, -32, 10, 16, 22, 6, 24, +17, -2, 25, 17, -20, -8, 2, -13, -26, 43, -30, -21, 51, 20, -17, 13, -30, 6, -6, -44, 66, 22, -21, -25, -21, -13, 3, 14, -36, 32, 1, -9, 42, -12, -15, 26, 8, -4, -13, -11, -31, -31, -5, -28, 3, -6, 0, 20, -6, -24, -16, -1, 30, 12, -17, 38, -23, -14, -18, -3, 8, 21, 8, 25, -10, -3, -5, -4, 15, -22, -37, -10, -12, -21, -16, -9, 8, 43, 33, 10, -26, +-19, -22, 15, 35, 28, -8, 12, -26, -20, -18, 13, 33, 65, -9, 18, -39, 21, 40, -16, 14, -3, 0, 9, -22, -11, -11, 8, 9, 36, -9, 28, -13, -52, 2, -14, 5, -16, -20, 24, -26, -40, -16, 45, -14, 55, 36, 50, -3, 28, 49, -2, -30, -11, 29, -13, -24, 32, -4, -7, 31, 13, -29, 31, -5, -24, 15, 25, 81, -13, -10, -37, -41, -20, 82, -17, -32, 27, 7, -22, -11, 7, +-21, 65, -4, -10, -36, -7, -30, -46, -6, 25, 5, 32, 44, -37, -32, -15, -12, -13, 19, -17, 13, 16, -40, -14, -30, -7, 12, 68, 6, 41, 8, 9, 8, -30, 14, 2, 18, -18, -38, 1, -3, 23, 43, 16, -3, 7, -16, -22, 20, 15, 62, 33, -19, 58, -26, -35, -30, 78, 3, 58, 14, -1, 21, 8, -4, 17, -2, -26, 15, -17, -2, -42, 13, -8, 25, 11, -3, 28, 1, -10, 7, +11, 53, 33, -31, 22, -31, -25, -21, -9, -1, 52, 2, -2, 6, -1, 4, 6, -2, -45, 0, -7, 1, 2, -41, -45, 127, -22, -50, 44, 94, -16, 17, -33, 35, 46, -1, -25, -45, 48, 97, 15, 32, -77, 15, 0, -47, 1, -54, -37, -35, 14, -10, -13, -5, -62, -34, -55, 4, -26, 13, -23, -31, 18, 13, 34, -26, -20, -10, 15, -6, -17, 25, -45, 27, -21, 26, 11, 9, -30, 20, -40, +0, -51, -5, -31, 16, -16, -30, -3, -30, 5, 56, -53, -9, 24, 7, 39, -32, 6, -7, -20, -8, -26, 7, -6, 45, -34, 41, 14, 10, -45, 4, -33, -27, -16, -52, -33, -19, 31, -49, -22, 11, -25, 60, -30, -17, -10, -2, 41, -23, -9, -32, -47, -57, 5, 25, -9, 67, -28, 47, 21, -34, -44, -22, -2, 21, -27, -64, -30, -41, -24, -47, 78, -34, 37, 9, -24, 32, -13, -33, 36, -26, +-37, 35, -17, -28, -34, 28, 13, -9, -27, 0, 2, -4, -16, -24, -46, -20, 8, 35, -24, 51, -27, -32, 60, -19, 29, -35, -32, 16, -2, -23, 9, 56, 25, 44, -8, -15, -9, -21, -13, -24, 22, -6, -7, -58, -25, 5, -27, -27, -27, 5, -21, 11, -11, -43, 33, 3, 12, -5, -35, 0, 0, -23, -10, 46, 7, 46, -1, -40, -23, -40, -12, -21, 43, -60, -8, -66, -44, 34, -45, -40, -28, +-20, -8, -34, -13, 2, 65, -8, 13, 1, -14, -11, -22, -7, 15, 35, -8, 4, 16, -19, -21, -22, 0, -4, 1, 6, -24, -17, -6, -9, -22, 8, -1, 9, -25, -2, -23, -18, 8, -1, -28, 12, -5, -44, -34, -17, -14, 79, -4, 53, -35, -7, -1, -49, -15, -60, -42, 29, -15, -56, -22, 27, 13, -11, -9, 68, -5, -29, 13, -11, 17, -14, 7, -4, 17, -20, -15, -6, 41, 38, -8, -10, +-7, -4, 10, 4, -7, -22, -28, 4, -31, -9, -33, -11, -1, 9, 4, -5, -30, 0, 25, -3, 57, -19, -4, 7, -22, -30, -11, -47, -9, 50, -29, -11, 19, 19, 3, -15, -31, -25, -6, -7, -22, -56, 5, 2, 17, 23, -49, 17, -24, -19, 11, 4, 70, 13, 27, -18, -34, 2, -34, -23, 27, 19, -13, -7, 8, -36, -25, -33, 10, -6, -24, -28, 22, -15, -31, -48, -16, -28, -33, 25, -26, +-12, -76, -1, 66, -20, -14, -45, 37, -59, -11, 5, 9, 83, 3, 36, -12, -55, -13, -58, 5, -46, -5, 67, -11, -4, -36, -33, -37, 23, -32, 58, -38, 8, -11, -38, 103, -13, 18, 19, -8, -5, -27, 9, 7, 48, -2, -9, 19, -49, -14, -34, -9, -36, 7, -9, -5, -80, -27, 14, -45, 10, 8, 22, -32, -31, -6, -6, 82, -46, 0, -28, -9, -17, 7, -22, 7, 22, -7, -21, 0, 9, +-3, -13, -19, -53, 7, 19, -12, -10, -10, -30, 13, 27, -29, 12, -35, -15, -12, -6, 78, -49, -4, -41, 10, -4, -8, -7, 6, 55, -9, -26, 9, -18, 3, -17, 1, -12, -13, 8, -12, -23, -18, -34, -11, 66, -28, 27, -26, -9, 9, 3, -13, 19, -5, 44, -8, -10, -9, -35, -1, 1, 15, 83, 11, -60, 72, -11, -60, -4, -12, -11, -25, -13, -38, 94, -16, -29, -24, -40, -36, -12, -31, +-6, 13, -11, 15, 6, -21, -14, -16, -16, 60, 62, 39, 47, 72, -15, 5, -32, -12, -17, -26, 8, -4, -85, -2, 34, -28, 6, 69, 12, -73, 29, -24, 26, 25, -18, 63, 60, -2, -22, -8, -25, 42, 41, 57, 60, 18, -33, -10, 12, -22, -24, -10, 19, 27, -40, 31, 35, -53, -37, 65, 18, -55, -9, -52, -32, 43, -14, 101, -40, 9, -45, 14, -27, 42, 60, 25, 26, 26, -40, -15, -2, +-15, -11, -24, -1, 6, 17, -33, 32, -64, -4, 19, -14, -14, -53, 17, -5, -7, -28, -9, 34, -11, 34, 7, -28, -6, 19, 1, 41, 20, 10, -6, 9, 28, -34, -36, 26, -53, -13, -56, -21, -8, -10, 24, -37, 0, -4, 23, 17, 4, -1, 25, 0, -11, 1, -22, -31, -10, -9, 25, -5, 12, -32, 21, -10, 1, 24, -11, -6, 57, 8, -34, 30, -22, -2, -8, -18, -24, 17, -15, 1, -2, +12, 47, -27, -3, 25, -7, -7, -5, 3, 12, 5, 24, -63, -18, 3, 14, 26, -4, 44, 27, -6, -32, 44, -19, -5, -5, -27, -4, 13, -8, -20, -15, 11, 37, 22, -13, 4, -24, -35, 22, 22, 3, -36, -26, 2, -7, 5, 24, -4, -35, 19, 3, 5, -18, 46, -9, -15, -21, -35, -19, 8, -19, -47, 26, -15, 15, 30, -39, 19, -48, -24, 5, -39, 53, -39, -38, -62, 24, -4, 43, -14, +-79, 41, -28, -25, -48, -3, 9, -42, -34, -10, -22, -39, 50, -21, -13, -46, 11, 33, -34, 13, -25, -52, 21, 26, 4, -26, -20, -21, 38, -34, 1, -33, -9, -17, 5, 5, -10, 11, -34, 27, -6, 7, 3, -10, 71, -45, -33, -13, 32, 34, -3, 3, -15, -62, 25, -6, 52, -23, -29, -12, 11, -16, -5, -10, -15, 2, -12, 0, -16, -26, -11, -9, -27, -3, -14, -30, -27, -7, -10, 0, 7, +57, 9, 8, -7, -48, 24, -9, -7, -18, 19, -13, -5, -44, 16, 28, -21, 21, 9, -3, -9, 76, -3, 13, 6, 12, -7, 18, -53, -68, -2, -34, 13, 59, -50, -2, -43, 0, -25, 11, 61, -41, -6, -76, 13, -53, 16, 26, -39, 34, -19, -9, -4, -4, -1, -28, -10, -34, -16, -9, 30, -7, 13, -29, 17, 10, -34, -18, -24, -47, -39, -29, 34, -21, -14, -5, 4, -2, 16, -13, -3, 7, +-22, 33, -7, 37, 8, -27, 7, -25, -6, -2, 0, -17, 19, -6, 18, 10, -25, 6, -14, -29, 11, 26, 30, -25, -21, 16, 12, -15, 0, -19, -13, -29, -13, -12, 33, 6, -6, -20, -1, -27, 10, -8, -9, -43, 12, -20, 28, 28, -26, 11, -19, -25, 6, 19, 16, -30, -32, 3, 10, -23, 7, -38, -18, 8, -9, 12, -11, -13, 1, -28, -12, -29, -2, -10, -19, -35, -50, 118, -15, -26, -8, +-32, -70, -65, -53, -46, 31, -75, -18, -29, 23, -22, -31, 107, -33, 44, 31, 18, -54, -33, 5, 12, -88, 97, 16, 64, 31, 13, -39, 0, -23, -4, 9, -4, -18, -6, -5, -35, -33, -18, 70, 19, 50, 72, 21, 3, 12, -26, 58, 10, -45, -24, -27, 6, 27, 74, -23, -70, 48, -18, -12, 3, -22, 53, -18, -15, -26, -22, 4, -15, -46, 7, 50, -10, 18, 37, 22, -10, 17, 5, 53, 27, +-30, -15, -49, -43, 13, 35, 1, -63, 10, -33, 23, -29, -25, -21, -21, 32, 3, -22, -7, 15, -18, -20, 29, -30, 86, -7, -17, -14, -1, -50, -7, 5, -41, -35, 2, 15, -2, 76, -14, -51, 52, 83, -63, -25, -3, -40, -64, -55, -28, -39, -25, -23, -6, 6, 34, -53, -29, 100, -26, -42, -77, -39, 58, -41, -64, -56, 14, -27, 10, 2, -4, -68, 77, 10, -14, -46, 5, -39, 1, -29, -9, +-43, 8, 2, 88, -33, -3, -12, 7, -5, 17, 19, -29, -52, 81, 16, 1, -33, -1, -31, -17, 12, -22, 26, 23, -12, -4, -10, -12, -29, 3, -34, -3, 9, 10, -25, -19, -9, 16, 2, 40, 19, -19, -6, -3, -30, 68, 2, 21, -18, 5, 5, 4, -9, -6, -10, 22, -33, -21, -9, -30, -87, 49, 10, -21, 2, 4, -41, -18, -24, 19, -28, 71, 21, 7, -15, -20, -29, 23, 6, 14, -27, +-19, -5, 10, -22, 11, 24, 38, -9, -11, -39, -55, -38, 1, -10, 24, -30, 41, -21, 1, -68, 51, -37, 73, -9, -8, 6, -3, -21, 85, 3, 13, -2, -10, -8, -11, 11, -10, -14, 13, 44, -31, -12, 9, -18, 21, -39, 118, -21, 34, 0, 13, -22, 61, -3, 40, -6, 40, -10, -5, -3, 22, -22, -6, -5, -27, 28, 1, -14, -10, -3, 32, 19, -23, -24, -6, -17, 42, -36, 105, -20, 39, +-7, 14, -2, 14, -8, 35, -21, 16, -22, 19, -4, 43, -9, 15, -12, -4, 16, 2, -20, -3, -8, 25, 55, -37, -2, -30, -36, 4, -52, 126, -21, 19, -8, -37, -48, 70, -3, 26, 0, 51, 14, 24, 0, 17, -43, 29, -1, -25, 50, -20, -23, -18, 33, 45, 3, -53, -26, 2, -37, 43, -36, -59, -2, 32, -4, 10, -62, 24, -44, -26, 36, 52, 25, -10, -40, -21, -28, -14, -54, -29, -22, +-26, -13, -18, -11, 14, 36, -19, -22, 24, 1, -18, -3, 21, -10, 5, -23, -5, 0, 57, -10, 37, 11, -9, -26, -6, -20, 55, -25, 28, -2, 2, 8, -8, 16, -25, -28, -41, -41, 8, -14, -1, -6, 39, 25, -9, -28, -3, -43, -41, -30, -1, -6, -3, 1, -12, 0, -8, -42, -24, -18, -9, -15, 37, -45, -1, -45, -18, -21, -20, -17, -6, -10, -31, 17, 16, 32, 45, -3, -19, -23, -27, +10, 17, -1, 19, 24, 6, 35, 60, -15, -44, 7, -11, -24, 37, -2, -27, 7, -45, -15, -13, -12, 18, 9, -26, 30, -15, 27, 11, -18, -24, -2, -43, 8, 34, -13, 11, 20, 28, 36, 30, 16, 9, 7, -38, -22, -9, -11, -1, -23, -27, -36, -26, -35, -10, -22, -13, 13, -3, 30, 21, 31, -27, -28, -10, -6, 36, 13, 17, 6, 1, 10, 61, -17, -47, -16, -12, -9, 54, -4, -30, 9, +-23, -12, 18, -26, 8, 2, -18, 33, -21, 3, 24, 0, -5, -5, 9, 10, -20, 19, -6, 58, 22, -17, -21, 1, 2, -13, -24, -16, 7, -15, 4, -12, -2, 0, -9, 30, -19, 4, 37, -27, -17, 3, 66, -41, -53, -45, -14, 16, 90, -31, 30, 14, -13, 27, -16, -43, 30, -38, -23, -54, -2, -5, 12, 49, 12, 15, 4, 103, 84, 107, -58, -26, -19, 9, -6, -32, -23, -20, 8, -46, -31, +-24, 20, 9, 0, -26, -11, -2, 1, 25, 28, -2, 24, 20, 37, 47, -23, 4, -25, -45, 29, -43, 0, -23, -22, -9, 30, 10, 24, -3, -72, -1, 4, -73, 64, -1, 23, 48, -2, -8, -43, -42, 12, 17, 0, -15, -26, 42, -18, -9, -29, -14, 66, 64, -18, -35, -31, -35, -32, -30, 16, 4, -15, -31, 3, -13, -10, 5, -26, -27, -13, -7, 14, 3, 24, 15, -17, -5, -37, 24, 3, 6, +-33, -60, 80, 62, 49, -42, -38, 7, -29, -40, 15, -1, 3, -10, -11, -31, -14, -14, -26, -14, -40, -53, 5, -21, 22, -15, -9, -12, -13, -29, 3, 24, -16, -30, 20, 9, 13, -26, -20, -33, -12, -31, -13, -5, -49, -3, -29, -20, -35, 2, -9, -16, -30, -18, 69, -13, 45, -5, 16, 19, -34, 13, -24, -12, -28, -14, 0, 75, 5, -20, -33, -25, -24, -30, 8, 18, -11, -16, 10, -36, -2, +-14, -21, 5, -14, -42, -11, 36, 15, -35, -11, 4, -17, -18, -8, -8, -8, -22, 13, 51, 29, -23, -12, -36, -17, -38, -2, -10, -13, 14, 20, -13, 14, 6, -16, -15, -15, -45, 7, 15, 36, -8, -3, -6, -10, 5, -13, 24, -24, 3, 17, 55, 0, -19, -27, -28, 0, -11, 13, 12, -46, -20, -33, -40, -8, -25, -18, 42, -27, -48, -5, 45, 9, -10, -19, 20, 6, -27, -27, -12, -26, 119, +-42, 79, -4, 12, -4, -13, -38, -66, -15, 29, -18, -37, 37, -1, -24, -33, 57, 30, -19, -39, 19, -9, 1, 35, -6, 12, -41, 7, -2, 12, -2, -22, 66, 17, -28, 20, 13, -5, 6, -9, -1, 23, -30, -4, 15, -29, 28, 6, -11, 1, 2, 0, 11, -13, 24, 17, -7, 5, -21, 36, 0, -13, -18, -20, -2, 18, 7, 7, -25, 53, 10, -19, -17, 18, -26, -30, 25, -37, 22, -26, -18, +22, -32, 10, 70, -18, 10, -13, 15, -8, -10, 15, 28, 9, -1, 127, 51, 16, -10, -53, 1, -14, 2, -6, -21, -35, 28, 11, -8, -9, -12, -22, -49, 32, 18, -21, 12, -15, -19, 41, -12, 35, 10, 7, 24, 18, 50, 127, 56, 21, -12, -36, -32, -6, -16, -35, -2, -34, 32, 25, -8, -19, -26, -14, -32, 59, -7, -5, 20, -29, -15, 46, -33, 60, 5, -13, -13, 66, -19, 114, 42, 40, +-9, -69, 21, -3, 9, -20, -7, -25, 41, -13, -13, -16, -10, -37, -47, 38, 17, -26, 16, 1, -32, 59, -10, 41, -8, 25, 10, 8, -1, 127, 28, -19, 20, -31, -22, 10, 18, -27, -4, 81, 7, -18, -5, -17, -12, -17, 7, 41, 21, -5, 58, -2, -8, -14, -18, -5, -23, 9, -8, 16, -21, 85, 12, 17, -20, -75, -44, -44, 20, -3, -26, 1, 79, -15, 24, -18, -52, -41, -25, -23, 13, +45, 22, 6, 32, 18, 38, -33, -27, -18, 13, 37, -6, 39, 40, 26, -1, -3, -18, -8, -21, 34, -47, 28, 5, 23, -18, -54, 64, -32, -32, -14, -2, -18, 27, 13, -9, -40, 15, -35, 17, 8, 27, 62, 36, -9, 78, -20, 35, -6, -37, 13, 2, -48, 12, -22, 32, 18, -28, 53, -16, -18, 7, -11, 50, -46, -42, -8, -33, 18, 27, -10, 36, -13, 15, -26, -3, -12, 71, -5, 28, -24, +51, -4, 15, -25, 13, 17, 15, -12, -6, 57, 32, -12, 14, 18, -8, 0, -36, -29, 41, 36, 41, -6, -1, -38, 37, 10, -2, 11, 127, -27, 74, -35, 25, -3, -37, 5, 37, -9, 33, -35, -27, 23, 62, -38, -2, 41, -17, -6, -21, -14, 40, 1, 41, 11, -7, -21, 38, 97, -6, -23, 10, -26, 23, -10, 0, -3, -54, -22, -5, -7, 14, 34, -14, 32, 20, -8, 63, 22, -35, 15, 5, +16, -1, 13, 27, 4, 7, -33, 69, -30, -22, -25, 79, -24, 49, 5, -6, -5, -6, -4, -19, 3, 18, -19, -28, 66, 17, -42, 31, -1, -20, -26, -42, -11, 42, 23, 31, -30, -14, -20, 60, -33, 2, -10, 64, -24, 50, -15, -4, -9, -17, -21, -5, 5, 17, -8, -1, 41, 12, -18, 21, 0, -26, 1, -23, -22, 48, 19, 51, -15, -13, -27, 41, -24, -26, -20, 58, -14, 41, -11, -2, -24, +26, -1, -4, -2, 29, -8, -30, 88, -6, -47, 52, -25, -24, -29, -36, -10, 35, 10, 32, -15, -10, 13, 72, -15, 50, 34, 33, -30, -1, -15, -35, 21, -37, 0, -48, -21, 20, -21, -5, 8, 44, 8, 1, -33, -10, -19, -14, -20, 7, -20, 64, -51, 20, -49, 4, 24, -51, -7, 40, -16, -14, -17, 25, 46, -9, -16, -31, -31, 2, 0, -24, 38, 23, -17, -27, -14, 9, 11, -6, -1, -13, +5, 28, -3, 15, -36, 22, -19, 18, 41, -23, 10, 38, -8, -55, 3, -27, 102, -13, 32, 7, 22, 16, 14, 14, 22, 1, 22, -7, 11, -15, 32, 13, -35, -9, -25, -27, 19, -11, 25, -3, 51, 24, 65, -32, -9, -15, 30, -18, 0, -30, 2, 13, 57, -48, 80, 0, -16, 3, 20, 15, 31, 18, 12, -18, 14, -19, 31, -12, -43, -26, -25, -7, 46, 26, 44, -30, -19, 20, 35, -7, -30, +-32, 0, 25, 53, -18, 91, -34, -9, -37, 52, -16, 31, 22, 7, -7, -16, 7, 3, 2, -38, 2, 11, 9, 42, 16, 71, 2, -21, -9, 42, -17, 15, -48, -12, 19, 70, -33, 57, -8, -29, -9, 0, 19, 32, 6, 21, -16, -15, -31, 52, -14, -27, -32, -12, -21, 8, -28, 26, -12, -12, 6, 5, 9, -21, -35, -5, 49, 2, -37, -15, 25, -24, -26, -9, -10, 33, -6, -3, -10, -30, -34, +-15, -3, -28, 7, -21, -63, 22, -36, 44, 1, -48, -13, 47, -16, 35, -22, -37, 72, 8, -35, 44, 31, -55, 13, 6, 47, 49, -3, -35, 35, 1, -13, 10, -68, -44, -16, -39, 33, 30, -28, 44, 24, 43, 28, -31, 2, 13, -2, 58, 13, -16, 37, -22, 2, -13, 42, 0, -3, 0, -40, 42, -24, -49, -13, 24, -56, 16, 127, -53, 29, 7, 30, 19, 2, 20, 20, -50, 9, -16, 32, 49, +-32, 7, 28, -38, 15, -31, -14, 12, 43, 13, -24, -16, 21, 52, -28, 4, 33, -43, 37, -15, -50, -15, 11, 6, -11, 54, -2, -37, -15, -2, 20, -3, -27, -22, 50, 15, -1, -6, 6, 14, -23, -13, -37, -25, 17, -8, -17, 24, 29, -31, -1, 11, -36, 27, -26, 90, 8, 43, -11, 12, -26, 10, -3, -12, -5, 28, 42, 0, -11, -26, -46, -1, -17, 7, -18, -19, 50, -7, -8, 21, -38, +-40, -19, -26, -19, -14, -10, -19, 25, 27, -17, -42, -34, 13, 18, 0, -23, -3, -14, 19, -6, -18, 30, 36, -6, -5, -23, 34, 2, -8, -2, 3, 32, -8, 28, -43, 5, -14, 5, -10, -26, 23, 33, -16, -9, -19, 27, -16, -32, 2, -26, -1, -3, -10, 19, 59, -36, -9, -20, -35, 21, -25, -10, -16, 2, -40, 33, 13, -7, -9, -19, -13, 5, 23, 30, -33, -1, 15, 11, -13, -38, 5, +-10, 1, -7, -14, 9, 43, 73, -15, -23, -14, 18, -5, 3, -12, 0, -49, 25, 10, 1, -22, 16, -12, -21, -12, 41, -28, -27, -22, 42, -24, -22, 3, -31, -6, -6, -23, 18, 35, 0, 4, -15, 9, 21, -39, -3, -2, -1, -23, 68, 22, -35, 48, 14, 55, 43, 71, 41, -22, -55, 24, 55, 107, -71, -12, 30, 26, 24, 8, 27, 73, 5, 0, 71, 60, 4, -11, 10, 24, 19, 9, 57, +-4, 9, -23, -19, -23, -18, 6, 29, -11, -20, 1, 52, -11, -32, -9, -1, -10, 24, 10, -2, 45, 7, 11, -14, -6, -1, -32, -19, 15, 11, -52, 24, -39, 26, 6, -5, 14, -4, -36, 18, 15, -48, -35, 2, 127, -1, 45, 58, 17, 27, -21, -27, -7, 18, -13, -14, 29, 32, -24, 38, 69, -23, 36, 45, -9, -20, 45, 12, 47, 5, -30, 115, -6, -72, -16, -31, 35, 37, 21, 58, -1, +67, -16, -49, -20, 78, 5, -38, -16, -24, -3, -29, -32, 28, -54, -13, -22, -11, 31, 9, -3, 36, -18, 79, 1, -34, -39, -25, 29, -14, -14, 38, -9, 52, -36, 24, -16, -38, -14, -17, -11, 2, 9, -16, -17, -13, -6, -37, -24, -19, 55, 5, 5, 2, -22, 127, -1, -69, -2, -35, 28, 61, 50, 78, -12, 74, -8, -28, 1, 77, 16, -25, 3, -68, -40, -28, 2, 50, -33, -10, -19, -31, +-1, -3, 7, -8, 13, 12, 17, -9, 1, -7, 8, -13, -7, -4, 13, 8, -19, 44, -2, 29, -10, 47, -20, -27, -4, -43, -17, -11, -7, 38, -30, 16, 8, 14, -63, 58, 7, 10, -8, -4, 49, 30, 98, -44, -9, 47, 7, 16, -38, -20, 0, 66, -2, 83, 45, -38, -73, 26, 29, 11, -62, 80, 36, -39, 5, 11, -10, -4, -13, -38, -53, -25, -11, 1, 7, 21, -27, -3, 18, 82, -21, +4, 23, -10, -30, -16, 24, 21, 15, 32, -12, -40, -26, 73, -40, 26, 54, 84, -2, -33, -35, 16, -44, 17, 4, 0, 36, -35, 24, -2, 36, -40, -25, -1, -49, 9, -25, 47, 45, 9, 6, -37, 5, -13, -24, 27, -33, -16, 11, 93, -15, 1, -46, -31, -32, -1, 35, 19, -2, 12, -18, -8, 17, -40, 50, -1, 2, 1, -3, 1, 2, -34, 16, 6, 19, 11, -4, 73, 42, -7, 24, 78, +-6, -2, -12, -42, -32, 92, -12, 21, 7, 40, -10, -21, -36, 33, 98, 18, -17, -52, 2, 31, 20, -11, -5, -13, 20, 6, -25, 95, 3, 14, -23, 43, -11, 15, -27, -8, -12, -15, 56, 39, 12, -10, 40, -18, -14, -71, -13, -5, 49, 4, -24, 8, -2, 22, -5, -45, 9, -13, -16, 56, -48, -17, -18, 64, -30, -15, -12, -22, -18, -18, 15, 3, -20, -27, 24, -10, 11, 25, 26, -26, 39, +8, 14, 73, 3, 3, -21, -21, -11, -20, -12, 51, -20, -23, -9, 80, -20, -19, -31, -18, -3, 0, -3, 14, -3, -8, 41, -5, -10, 10, 18, 13, -4, 6, 13, 66, 4, 10, -14, -44, -1, -23, -32, 53, 1, 4, -24, 54, -8, 36, -24, -30, -28, -27, 39, 0, -14, -28, -4, -20, -9, 48, 16, -44, 60, 29, -10, 44, -4, 11, -28, -29, -3, 11, -37, 46, -39, -29, 76, 47, -28, 18, +-54, -4, -23, -7, 6, -10, -24, 70, -32, 26, -8, 6, -27, -49, -48, 26, 4, 16, 20, -21, 18, 40, 12, -74, -58, -9, -30, -29, 31, 18, -8, 7, -17, -15, -6, -13, 32, 10, -27, 16, 28, 2, -3, -45, 24, 7, 31, 25, 9, 30, -14, -14, -4, 9, -6, -25, -3, 13, -14, -13, 7, 11, 57, 19, -41, 0, 16, -13, -15, -2, 26, -8, -35, 0, -8, -15, 2, 38, 12, -7, -9, +4, 12, 29, -44, 7, -33, 24, -25, 82, 2, -27, -16, -35, -20, 49, 18, -5, -5, 9, 33, -25, -54, -13, -41, -10, 36, -12, 46, 20, 32, 2, 60, 32, -23, -9, -20, -7, -4, 68, -5, -27, -5, -9, -25, -55, -7, 47, 10, -26, -5, 50, 23, -9, -28, 2, -59, -55, 22, 7, 52, 1, 12, -23, 16, -21, -25, -29, -9, 0, 11, 52, 29, -11, 12, -5, -16, -12, -34, 30, 21, 10, +-21, -13, 51, -3, -42, 0, -48, -1, 59, -9, 41, 39, 29, -7, 68, 67, -13, 5, 15, -14, 5, 70, -15, -23, -2, 6, 4, -11, -19, 4, 3, 19, 12, 35, -10, 5, 0, -11, 22, 12, -11, 90, 23, 5, 53, 28, -6, 8, 22, 6, -10, 14, -23, 42, 51, -15, -25, -14, 44, -22, -54, 27, 127, -11, 21, -33, 82, -13, -69, 15, -32, -38, 23, -40, 57, -28, 72, 8, -36, -40, -10, +-60, -33, 33, -22, 125, 64, -8, 43, 9, 27, -7, -48, 1, 6, 6, 31, 29, -39, -19, -22, -14, 14, 36, 58, -61, -11, -6, 6, 36, -61, 5, -12, 16, -7, 22, -51, -13, -13, -32, -3, -19, -42, 23, 56, 5, 11, -13, 0, 27, -23, -9, -57, 15, 23, 39, -33, -17, 2, -28, 4, 19, 20, 15, -16, -31, 22, -6, -12, -25, 11, -12, -18, -42, 4, -3, 72, 14, 21, -19, -26, 44, +-8, -22, -11, -26, -22, -10, 16, -32, -32, -43, 56, -5, 5, 7, 2, -29, -4, -9, -20, -17, -27, -8, -1, 3, -16, 17, 107, -25, -14, 1, -28, 23, 23, -10, 37, -23, -5, 4, 18, -17, 1, 5, 49, 25, -16, 15, -7, -12, -11, -26, -16, 17, -7, -45, 3, 48, -7, -41, 60, -14, -17, -16, -4, -14, -10, -43, -2, 50, -34, 62, -4, -21, -15, 112, -15, 20, 7, 26, 24, -20, -50, +0, -36, -8, -11, 3, -30, 39, -23, 6, 40, 37, 2, -17, -22, 6, -17, -31, 18, 4, -14, 6, 4, -12, -3, -27, 23, -12, 12, -2, -1, 0, 10, 3, -6, 13, 5, -23, -9, 40, 0, -6, 69, 2, 2, 4, -24, 0, -23, -31, -7, -4, -10, 23, -10, -17, 4, -22, 41, -25, 17, 18, -10, -20, -1, 10, -29, 4, -27, -19, -12, 42, -25, -26, 19, 44, -55, -37, -13, 23, -13, -33, +32, 43, -22, 7, -18, -22, -34, -1, -20, -4, -18, -19, 14, 10, -2, 20, -29, -5, 16, -20, -3, -12, -8, 34, -14, -37, -75, -8, -45, 26, -12, -10, -72, 0, -5, 61, 37, -44, 68, -44, 40, 0, 6, -34, 7, -54, -7, 8, 10, 29, -40, -14, -13, -17, -5, -9, -21, 39, 13, -21, -18, 19, -15, -26, -15, 0, -14, 15, -7, -27, -3, -1, 20, -9, -38, -1, -20, -8, -2, 0, -25, +-35, -16, 0, 0, -1, -14, 31, -12, -44, -82, 17, -28, 34, -49, -13, -1, 31, -27, -6, -19, 0, 22, -32, 34, -35, 4, 17, -17, -37, -34, -29, 2, 6, 36, -8, -15, -27, 18, 3, -13, -14, 73, -11, -40, 4, -9, 5, 9, -3, -4, -8, -10, -9, -30, 8, 7, 23, 11, 51, 1, -19, 10, 7, -27, -7, -4, -33, -32, -59, -41, 10, 0, -9, 86, -26, -10, -2, -18, -18, 17, 13, +40, -12, -4, 4, -1, -15, 23, 61, 5, 56, 9, 2, -32, -16, -26, -8, -14, -49, -17, 6, 11, -14, 8, -18, 78, -3, -51, 19, -12, -23, -15, -16, 18, -10, -15, -19, -62, -17, 12, 11, 22, 66, -10, -32, 56, 24, -13, -3, -13, -34, -21, -24, 20, 29, -16, 44, -13, 29, -28, -31, -14, -24, 28, 22, 15, 41, -3, -34, -33, -3, -1, -23, -4, 25, 21, -21, -8, 28, -31, -7, -10, +-19, -21, 29, -27, 9, 44, -4, -54, 45, -25, -24, -13, -28, 88, 2, 24, -7, -12, -19, 3, 16, -15, 39, 16, -29, -3, 11, 19, 40, -8, -3, -41, -32, -37, 2, 2, 114, -45, -17, -47, -44, -8, -8, 50, 49, -30, 26, -26, 33, -8, -8, 2, -27, -14, -36, -29, -28, -66, 22, -20, 15, -18, 88, -28, -10, -32, -22, -45, 13, -33, -13, 37, 41, 34, 46, 27, -11, 18, -23, -42, 30, +-1, 12, 21, 7, 4, -2, -25, -9, -32, -5, -51, -7, 5, -33, -16, -7, -51, 26, -21, 40, -15, 15, -2, -1, 16, -4, -15, 20, 27, 1, -50, 45, -32, 26, -31, 11, -25, -25, -4, -11, 0, 23, -42, 32, -18, -8, 0, -35, -16, 1, -13, 67, -8, -5, -34, -37, -26, -20, 8, -20, -24, 60, -2, 22, -13, -12, -67, 29, -12, -33, -48, -25, -20, 1, -36, 22, -6, -39, -4, -45, -33, +-8, -58, 70, -22, 16, 23, 18, 45, 25, 13, 1, -54, 0, -19, 10, 15, 55, -40, -32, -64, 29, 9, -19, 46, -12, -16, 41, 12, 0, 20, -55, -26, -5, -32, -14, 33, -23, -12, -1, 1, 29, 19, -9, -7, 22, -31, 24, -4, 49, -18, -28, -12, -21, -21, -17, -11, -17, -20, 28, -16, -1, 2, -33, -20, -12, -49, -6, 67, -20, -16, -2, 16, 21, 16, -10, 15, 23, -39, 24, 3, 26, +-27, -13, -9, -10, 7, -9, 0, -11, 0, 22, -26, -3, -8, -22, -4, -5, -42, 27, -2, -23, -20, -11, 26, 59, 21, 25, -14, 15, -15, 16, 16, 60, -18, -16, -50, -21, -32, -6, -18, -12, -30, 70, -42, -23, 10, -51, -9, -4, -34, 68, 5, -10, -16, -17, 61, -30, 22, 37, -21, -14, -26, 25, -22, -19, -2, -6, 11, -9, -93, 10, -33, 24, 13, 22, -41, -19, 31, -60, -40, -22, 8, +9, 1, -5, -26, 49, 7, 33, -12, 3, 0, -33, -9, 17, 6, -12, 5, -16, -9, -26, 72, -20, 5, -19, -13, 2, -3, 24, -18, -32, -17, -41, -14, 34, 13, 16, -14, 4, 0, -12, 58, -20, -59, -14, 20, 12, 21, -41, 12, -8, -25, -43, -21, -42, -59, -11, -6, 5, -46, 40, -33, -17, 27, 8, -17, 79, -25, 9, 21, -6, -29, -24, -10, 5, 18, -25, -3, 4, -46, -17, -27, 0, +-17, -30, -4, -39, -46, -21, 36, -39, -20, -9, 3, -19, -14, 13, -15, 68, -15, 38, 4, 27, -13, -42, 25, 12, -9, -13, 7, 33, -43, -4, -3, -6, -21, -26, -22, 7, -57, -30, 8, -14, -25, -29, 6, -54, -6, 10, -42, 90, -12, 29, -29, -19, -25, -25, 11, -12, 11, -30, 0, -24, -61, 10, -14, -5, -45, -9, -9, -43, -49, -27, 32, -37, -22, 0, 5, -20, 1, 38, 4, 50, -17, +8, -24, -25, 15, -36, -44, 37, 1, -11, 9, 15, -1, -13, -19, 3, -1, -26, -36, -13, -17, -5, -36, -46, 11, -18, 22, -32, -6, -39, -34, 22, -54, 36, -3, -2, -35, -58, -7, -1, 42, 16, 43, -3, -26, -11, -73, -2, -34, -53, 72, -20, -15, -47, -42, 12, -30, 18, 60, -8, -16, 97, -37, -22, -38, 99, 54, -5, 46, -45, -16, -97, 61, -20, 1, -29, 40, -29, -58, 62, -2, 19, +0, -13, 33, -2, 17, 3, -6, 1, 8, 8, 0, -28, -39, -8, -18, 127, 5, 32, 69, -22, -10, 16, -3, -15, -17, 12, -19, -30, 50, 37, -19, -27, -5, 10, 1, -19, 28, 36, -1, 64, -46, -46, 20, -1, -16, -9, 29, 127, -31, -6, 9, 8, -6, 26, -16, -21, -32, -1, -18, 6, -2, 60, 12, -30, 1, -15, 5, 30, -38, 12, -20, 58, 14, -25, -45, -44, -4, -40, 42, 107, -22, +11, 22, -13, -26, 54, -56, 3, -50, -2, 40, 8, -24, 32, -20, -14, -19, 9, -24, 87, 22, 14, 9, 94, 29, -13, -51, -20, -45, 9, 25, 127, -36, 21, 30, -6, -1, 19, -9, -8, 2, 22, 79, -27, 54, 28, -24, -17, 7, -61, -6, -14, -25, -15, 8, 80, -6, -20, -43, -6, -4, 38, -3, 127, 24, -25, -12, -6, -12, -9, 7, -2, -6, 42, 4, 4, 11, 33, -11, -12, -27, 5, +3, 4, -4, 3, -27, -10, -2, -6, 14, -12, -19, -8, 24, 127, -14, -3, -13, 8, -31, -2, -8, -11, -29, 35, -17, 10, 31, 52, -27, -19, -5, -11, -5, 18, -11, 15, -39, 11, -4, -14, -22, -2, -18, 50, -4, 127, 20, -41, -29, -19, -39, 14, 8, 1, 24, 47, 11, 10, 16, 4, -10, -24, -25, 8, -13, 7, -21, -12, -32, -45, -10, -28, 3, 102, -4, -19, 36, 97, -18, -15, 24, +30, 4, -55, -25, -15, 68, -43, 51, -21, -59, 60, -15, 41, 10, 27, 28, -19, -11, 22, -12, 127, 27, -27, -24, 26, 8, 9, 4, 127, -16, -15, 4, 15, -21, 9, -9, -18, 16, -9, -26, -26, 4, 44, 12, -27, -4, -3, 2, -21, -13, -13, -26, 2, -27, 33, -1, 38, -12, -32, -44, 70, -13, -34, -34, 49, 20, -46, -31, -11, 42, -35, -16, -22, -16, 42, 37, -13, -3, 15, -7, -62, +3, -4, 7, 44, -23, 13, 30, -14, -2, 13, -39, 47, -17, 7, 11, -4, -72, -18, 11, 6, -54, -21, -18, 9, 33, 56, -13, -23, 9, -17, -5, -47, 53, 7, -5, -21, -28, -5, 28, 32, 32, -17, -34, 24, -3, -8, 20, -11, -45, -34, 38, 12, -25, 25, -24, -14, 31, 33, 3, -4, 9, -40, 15, -43, 21, -14, -13, 1, -11, -29, 25, -33, 7, 25, -33, 46, -28, -10, 16, 14, -33, +-29, -12, 0, -50, -32, -10, 19, 18, 71, 3, -34, 12, -15, 2, -45, 53, -3, 3, -36, -51, -10, 6, -4, -44, -36, -11, 17, 57, -29, 2, -13, -25, -4, -5, -4, -18, -31, 31, -24, -30, 32, -33, 0, 3, 8, 3, -25, 45, -14, 87, 6, -5, -18, -15, -9, -50, 29, 3, -16, 24, -75, 15, -51, -51, -7, 5, 26, -2, -24, -47, 12, -28, 39, -13, -39, 46, -7, -3, -30, -45, -13, +-44, -17, -5, -16, -37, -45, -46, 12, -35, -42, -32, -36, 41, -6, -31, -9, -2, -25, 8, 90, -52, -30, -1, -1, -67, -44, -8, 33, 0, -5, 43, 23, -53, -25, 71, -41, 40, -66, 23, -1, 6, 17, -66, -13, 39, -3, 19, -17, -39, -14, -3, 61, -21, 8, 12, 78, -30, 9, -15, -32, -10, 20, -18, -30, -20, -7, 12, -29, -21, -47, 20, 4, -12, 82, -8, 30, -6, 24, 9, 0, 23, +-9, 57, 20, 7, 22, 30, -5, 53, -39, 0, -37, -16, 16, -4, -45, -33, -23, 14, -26, -20, 0, -28, 25, -6, 86, -31, 43, 19, 5, -36, -11, -37, -7, 12, 32, -69, -28, -11, 69, 5, -17, -7, -36, -34, 53, 43, 8, -45, -19, 46, -52, 12, -14, -18, -15, -16, -50, -19, 12, 3, -4, -35, -12, -5, -19, 67, 32, -83, 1, -5, -16, 10, -31, -12, -34, 22, 48, 11, 1, -4, -3, +21, -48, -49, -17, -21, 10, 30, -5, -10, -16, 0, 11, -26, 25, -4, 7, 52, 34, -62, -4, 0, -25, 55, -17, 14, -14, -5, -1, 29, -8, -1, -12, -1, -15, -34, -12, -24, 15, -22, 58, -33, -11, -4, 8, 13, 6, 50, 3, -30, 13, 70, 1, 39, -6, 54, -45, 0, -32, 28, -10, 8, -27, -11, 12, 14, -47, -44, -26, -8, 12, -11, 17, -25, -29, -18, 15, -18, 27, 21, -20, 9, +19, 13, -8, 38, -29, 0, -29, 2, -34, -17, -1, 12, 25, -17, -23, 33, -29, 26, 29, 64, -30, -12, -12, -29, 36, 34, 23, 49, 5, 24, -12, -20, 28, 125, 69, 10, 4, 29, 24, -7, -34, -20, 19, -8, 20, 0, 4, 8, -20, 9, 18, -24, -40, -22, 31, -3, -21, 43, 2, -12, -2, -6, 33, -9, 25, -36, 72, 6, 24, 55, 5, -1, -30, 53, -17, -28, -29, -26, -16, -23, -38, +-25, 35, -54, 7, -8, -47, -10, -56, 51, 25, -23, -4, -2, 14, -4, 11, 14, 19, 5, -3, -3, -6, 22, -24, 33, -31, -33, -25, 9, -16, 1, -26, -38, 29, -64, 34, 32, -65, 34, -13, 16, -11, 42, -23, 23, 40, 13, 3, 39, 25, 15, -43, 55, -18, -1, -30, -12, -64, 27, -25, 10, -52, 7, -9, -25, 84, -28, -10, -53, 4, -40, 82, 29, 25, -39, -7, -11, 30, -30, 18, -31, +89, -39, 15, -7, 7, -7, -18, 53, -19, -70, -13, -37, -4, -31, -2, -9, -6, -16, -21, -14, 6, 0, -41, 66, 0, -11, -11, 24, 47, -9, 22, -30, 103, 28, 45, 34, 28, -20, -27, 36, -15, -22, -44, -37, -13, -3, -68, -55, 54, -42, -17, -50, -21, 44, -33, 90, 14, -26, -21, -12, 35, -64, 33, 60, 4, 24, 15, 30, -9, -7, 41, 39, -3, -18, -46, -37, 13, -35, -47, 6, 48, +-19, -27, -25, 29, -42, 9, 38, -3, 13, -24, -8, 38, 29, 16, 7, 8, -16, -2, 44, -7, 8, 31, 40, 2, -14, -50, -26, 0, -16, -11, -55, -14, -26, -7, -6, -90, -14, -24, -81, 19, -31, 9, -35, -7, -23, -20, -31, 45, -35, 22, -31, 95, -9, 1, 6, -44, 26, -47, 19, 40, 0, -29, -25, -53, -42, 46, -41, -10, -11, -20, -25, 32, -22, 20, -32, -42, -49, 9, -5, -18, -1, +5, -63, 29, 6, 14, 41, -48, 5, -24, -13, 58, 23, 3, -32, 2, 13, 9, -25, 4, -20, -19, -7, 15, 15, -3, -7, -5, -11, -21, 79, 21, 7, -30, -12, 24, -13, -33, -39, -15, -2, 13, 15, -29, -12, 46, -37, -41, -23, -12, -26, -31, -15, -22, -27, -28, 8, 36, -21, -47, -46, -31, 30, -26, -14, -25, -27, 51, 22, 29, -12, -1, 27, -17, -14, 44, 24, 14, -18, -12, -18, -10, +-21, -13, -2, 21, -37, 33, -17, 21, -41, -24, -16, -15, -15, -33, 29, -31, -28, 24, -9, -5, -35, 13, 75, 6, 12, 32, -21, 2, -31, -13, -23, 13, -14, -39, 3, -1, -23, 13, -24, 21, -29, 12, -5, -15, -15, 5, 2, 71, -13, 30, 17, 10, 9, -7, -19, 4, 8, -16, -36, -37, -9, -14, 9, 44, -6, 22, -39, -1, -6, 4, -3, 2, -5, 62, 26, -8, 45, -13, 6, -33, -22, +29, 13, 43, -35, -13, -42, 9, 41, 24, 2, -10, -25, -16, 5, 21, -1, 10, -13, 6, -27, -29, -17, 17, -15, 19, -7, -14, 13, -22, -7, 45, -2, 18, 20, -4, -15, -14, -33, 5, -5, -8, -23, -10, -7, 1, 12, 4, 5, 31, 11, -2, -3, 46, 9, -36, -44, 4, -26, -7, -13, 38, -16, 15, -8, 14, -24, 28, 0, -42, -42, -15, -19, -10, -9, -26, -19, -25, -26, -35, -63, -17, +-15, -9, -21, -14, 38, 17, -29, -39, -9, 20, -19, 43, -13, 17, 4, 30, -5, 11, -4, 2, 56, 18, 46, 12, 23, -19, -30, -32, -43, -11, -39, -2, -11, -14, -42, -12, 19, 11, -15, 22, -11, 42, -2, 41, -4, 20, -1, -41, -9, 15, -11, 35, 12, 3, -10, -7, 0, -20, -4, -28, 27, 0, -11, 8, 12, -30, -21, -10, -22, -21, -45, -30, 1, -32, 32, -22, 51, 69, 1, 11, -43, +-17, 17, 19, -15, 10, 11, 58, 38, 25, -16, -20, 3, -7, 11, -24, -35, -2, -33, -12, -24, -6, -21, 6, -31, -16, -20, 43, 33, 14, 28, -20, -18, -28, -15, 12, 93, 51, 34, 10, -11, 39, -34, -7, -17, -8, -45, -12, -22, 13, -21, -44, 5, 13, -35, -20, 16, 30, -35, 71, -4, 8, -15, -3, -36, -9, -1, -4, 47, 24, 44, 21, 10, -29, -14, -28, 53, -9, -19, -34, 12, 21, +-44, -8, -14, -9, 11, 41, -10, 16, -2, 59, -33, 13, -33, 53, -74, -1, -21, -20, 84, 3, 66, -2, 13, 2, -29, 3, -3, 28, -20, -31, -10, 0, -36, 1, -5, 1, -48, 33, -28, -3, 29, 8, 15, -46, 13, 44, -18, -7, -31, -1, 102, 62, 1, 4, -14, -7, -12, -46, 3, 14, 33, 6, 60, -22, -62, 24, -33, -44, -14, -1, 30, -3, 39, 100, -32, -40, -14, 3, 64, 27, -48, +55, -46, -26, 12, -40, -69, 11, -12, -40, -40, 28, 50, -34, 4, 37, 35, 11, -20, -34, 12, -13, 84, -5, -28, -9, -20, -49, -17, -5, 51, 8, -32, -17, -12, 19, -29, 32, 2, -12, 7, 21, -28, -26, -5, -5, 13, -49, 53, 27, 6, -4, -11, 14, -21, -23, 37, -7, -8, -4, 6, -36, -45, -32, -1, -3, -7, 7, 32, -26, -12, 4, -11, -54, -23, 18, 16, -42, 18, 54, -34, -28, +-15, -20, -15, 20, -8, 10, -29, 67, -12, -25, -12, 37, 3, -20, 55, 68, -21, -15, -29, -54, -38, 45, -54, -26, 35, -10, 44, 15, 14, -32, -5, -20, -16, -40, -19, 15, -22, 43, -25, 23, -41, -60, 23, 57, 1, -49, 43, -4, 10, -9, 20, -7, -22, 13, -5, -35, -21, 1, 0, 3, -30, 16, -29, -28, 54, -34, -7, -6, 11, 0, 16, 65, -3, -1, -49, 20, -8, -39, -2, 20, 5, +16, 22, -37, -6, -2, 22, -15, -33, 18, -11, -1, -18, -15, -4, -1, 14, -25, 8, 65, 10, -5, -36, -44, -21, -11, -22, -34, -33, -46, 74, 5, 43, -8, -2, 66, -35, -1, -10, -7, -27, 27, -43, -9, 18, -3, -19, 24, 25, -14, -8, 20, 18, -12, -2, 18, 0, 20, -6, 17, -27, 2, 37, 22, 20, -1, 29, -14, 30, 5, 1, -26, -9, -7, 17, -12, 2, 24, -12, -33, 3, 18, +28, -1, 46, 14, -22, 4, 17, 8, -11, -29, -11, -9, -65, -14, -16, 3, -10, -9, 45, -20, 5, 1, 2, 0, 3, -3, -29, -9, -27, 32, 13, 8, 22, -18, -24, -5, 11, -25, -20, -34, -12, -13, 19, -19, 7, -32, 35, 13, -8, 7, 34, 5, -12, -9, 12, -11, 32, -37, -3, -6, -34, 4, -33, 9, 60, -54, -32, 36, -14, -8, -28, -15, -33, -24, 27, -24, -17, -28, 1, 20, 4, +-10, 26, -12, -9, 20, -10, 13, 46, 18, -36, -26, 47, 23, 12, 4, 9, -32, -13, -11, 25, 45, -8, -10, -3, 4, -5, -7, -18, -57, 37, -6, -2, 26, -37, -1, -26, 68, -30, -42, 45, -38, -19, 9, -54, -34, 24, -9, 2, -37, 54, 11, 8, 56, -14, 17, 11, -61, 26, -40, -13, -41, 31, -8, 13, -5, 8, -27, -28, 19, -34, 1, 2, -36, -49, -30, -29, 47, 7, 22, 9, -32, +12, 17, 41, -22, -23, -41, 25, -10, 49, -43, -8, -74, 10, 15, -12, 70, 77, 0, -2, 8, -22, -30, 46, -25, -10, -19, -38, 16, -23, 19, -15, -14, 4, -26, 78, -28, -11, 16, 52, 19, -7, -17, 21, 16, 27, -21, -7, 44, 5, -52, -61, 67, -20, -32, 22, -26, -40, -16, -2, -69, 24, -19, -7, -22, -1, -14, 23, -26, 1, -5, 47, 22, -9, -24, -31, -40, 1, -5, 46, -5, -7, +-37, -17, -21, -37, 36, 25, -50, 66, 6, -49, 36, -21, 82, -22, -6, 3, -57, 3, -22, -47, -29, 26, 86, -22, 18, -34, -46, -58, -35, 72, 93, 107, 92, -39, 3, -28, -34, -16, -12, -13, 98, -26, 20, 11, 55, -23, 66, 24, -27, 14, -10, -12, 10, 35, -42, -16, -10, -52, -17, -40, 4, -27, 61, 87, 86, -19, -36, -38, -14, 14, -17, 18, 32, -3, -30, 105, 41, 6, -13, -11, -20, +-40, 34, 11, 2, 7, -28, -59, -1, 15, -19, 15, -21, 33, 54, 127, 30, -12, -38, -14, -8, -27, -15, 9, 24, -32, 50, 73, 92, -29, 30, 32, -35, 19, 73, 3, -5, -25, -20, -44, 52, -13, -26, -52, -10, 36, 39, 127, 84, -26, -10, 8, -39, -60, -13, -28, -25, -21, 5, 41, 53, 20, -24, -5, -41, -1, 39, -27, -3, -24, -5, -33, -31, -26, -28, 3, -49, -2, 68, 127, 33, 3, +-9, -18, 2, 35, 4, -7, -49, 16, 49, 1, 41, -22, -34, -4, -37, -15, 2, -10, -11, -13, -10, -6, 8, 10, -27, -7, -5, 22, 12, 108, 43, 46, -4, -36, -28, 23, -15, -21, 4, 24, 30, -4, 21, 27, 39, 7, 19, -60, -26, 9, -2, 18, -61, -22, -38, 8, -32, 55, 8, 1, -6, 127, 63, 7, -37, -16, 13, 3, 10, 20, -24, 12, 72, 1, 10, 0, -36, -17, -23, -17, 4, +0, -2, -19, -24, -16, 26, -16, -18, 36, 4, 44, 8, 127, 51, 32, 15, -19, 1, -10, -10, 18, 19, -7, -10, -18, -1, -16, -16, 1, -13, -25, -24, 1, 9, -29, -32, -25, 15, -9, -26, 34, -2, -14, 0, 127, 35, 60, 3, -10, 5, 3, -20, 6, 90, -4, -10, 15, 33, -24, -14, -19, -23, 0, 14, 78, -46, -5, 17, -8, -33, -15, -26, 7, -27, 10, 25, 127, 54, -4, 2, 14, +-13, -2, -21, -11, 77, -8, -19, 20, 73, 21, 16, 7, 0, -3, -7, 8, -52, 19, -36, -22, -33, -32, -27, -24, 4, 39, 27, 127, 78, -17, -32, -15, 5, 11, -26, -10, 39, 25, 109, 5, 4, 35, -23, -33, -12, 3, 42, 34, -42, -36, -19, -29, 109, -24, -3, -40, -25, -1, 62, 127, 21, -38, 26, -13, 5, 8, 28, -33, 49, -13, -33, 42, 41, -6, 0, 36, -30, -21, 38, 81, -25, +3, 70, -13, -13, -34, -39, -2, 8, -49, 52, 106, -1, 5, -2, 7, 23, 20, -6, -4, 127, -14, -43, 8, 49, 1, 9, -48, -61, -10, -5, 39, -67, 15, -41, 0, -12, -27, -41, -6, -27, -3, 41, 110, 59, -10, -62, 2, -18, 11, -26, 7, 43, -5, -41, -4, 56, -9, -37, -27, -4, 16, -4, 48, -25, -22, -22, -41, 13, -21, -54, -19, -31, -6, -13, 90, 46, 22, -11, 26, -46, -53, +0, -6, 18, -16, 8, 44, 47, 18, 4, 1, -23, -30, 29, 65, -15, -19, 103, -16, 36, -51, -8, 30, 22, -8, 39, 127, 34, 7, -13, 64, -18, 26, 13, 39, -10, -27, 127, 118, -29, -36, -54, -56, -11, 0, -64, 29, -36, 3, 28, -8, 19, -7, -36, -26, 34, 56, -62, -18, -13, -16, -62, 29, 1, -16, -39, 51, -10, 11, 79, 63, -31, -3, -61, -50, 42, -65, 8, 65, -45, -19, 25, +-21, -16, 1, -23, 67, 21, 37, -9, -11, -52, -36, -1, 6, 24, 30, 4, 32, 12, -31, 47, 68, -39, -21, 4, -12, 12, -2, 4, 36, -26, 15, -21, 13, -43, -12, -52, -13, 54, 37, -31, 24, 18, 11, 13, 63, 4, -33, 6, 4, 29, 4, 64, 58, -10, -16, 0, -32, -29, 8, 11, -13, -4, -18, -35, 7, -28, -33, -42, -12, 6, -6, -10, -9, -1, -49, -65, 77, 8, 4, 2, 46, +15, -65, 62, 68, 7, -24, 20, -13, 12, -59, 13, 41, -43, -1, -25, 5, 13, -51, 20, 7, -20, -5, 13, -28, -6, 15, -8, 71, -16, -25, 5, 31, -15, -6, 24, 102, -9, -4, -12, -15, -19, -14, 6, -15, -8, -8, -12, 24, -6, 2, -2, 25, 3, -29, -10, -11, 20, -2, -29, -5, -2, -13, 12, 4, 28, -21, -32, 72, -3, 13, 15, -25, -25, -60, 29, -26, -33, 27, 4, -37, 31, +-29, 17, -13, -37, 25, -20, -7, -13, -1, -2, 57, -7, -8, 6, 22, -5, -5, 11, 43, -13, 10, -2, 0, -24, -8, -30, -5, -6, 28, -41, -4, -32, -2, -9, 5, -22, -8, 19, -14, -13, 10, 0, 24, -8, -7, 17, 49, -25, -12, 39, 35, -17, -9, -33, 29, 0, -25, -22, -18, -46, -21, -4, -12, -12, 26, 22, 5, -10, 26, 36, -14, -29, 45, -9, 59, -15, 34, 19, 24, 16, 17, +9, 11, -28, 0, 14, 28, -30, 22, 12, -36, -7, -71, -14, 15, -22, -58, 7, -6, 30, 16, -2, -10, 13, -32, -5, 64, -13, -4, 9, 15, 6, -24, -19, 15, 3, 13, 29, 55, 11, -15, 26, 11, -13, -28, -20, -27, 33, -40, 78, -28, -23, -47, 23, -8, -22, -51, 47, 34, -5, 78, 2, 10, 1, -42, 5, 25, -13, -13, -17, -5, -21, 35, -42, -19, 27, 8, -13, -9, -7, -28, 66, +-12, 14, -23, 1, -30, 17, 37, 16, 33, -14, 7, -8, -16, 89, 1, 51, -14, -31, 1, -14, 1, -41, 41, 7, 20, 0, -44, 20, 1, 19, -58, 40, -10, -9, 9, 24, -16, 16, -10, -14, 45, 0, 67, 5, 29, 5, -9, 37, 47, -40, -4, 6, 62, -69, 14, 23, -15, -31, -72, -42, 10, 3, -92, -14, -10, 4, 0, -4, -12, 23, -6, -12, 73, -3, -12, 6, 12, -15, -32, 5, -6, +-39, 9, -3, -25, -3, 16, 27, -19, -22, -30, 1, 28, -34, -37, 55, 12, 16, 38, -39, -33, -16, 15, -42, 80, -21, 30, 0, 20, 41, -21, -10, -9, -4, 1, -17, -11, 0, -21, 22, -18, -17, -37, -8, 29, -52, -16, 41, 7, -1, 54, -10, -3, -22, -27, 85, -25, -77, -16, 14, 40, 20, -5, 21, -10, -29, 33, 40, -32, -85, -8, -36, -92, 7, -59, -25, -3, 5, 2, 62, 76, -65, +-12, -10, 5, -27, -6, 18, -35, -68, 4, 52, 32, -11, 1, -28, -80, -31, 14, 38, -4, -14, -10, -33, -43, -7, -5, -63, -58, 17, -7, -29, 34, -10, 53, 32, -6, -25, -20, -4, -17, -27, -23, -18, 8, -37, -2, -4, -29, 30, 8, 22, -15, -23, -27, -29, 19, 83, 0, -23, 5, 0, 0, 17, -57, 0, 19, 3, -24, -10, -35, 66, -41, -6, 24, -26, 8, -17, -31, 46, -8, 9, 5, +29, 24, -87, -7, -52, -61, 112, -53, -33, -47, -9, 1, -15, -39, -37, 15, -49, 7, -82, -4, 91, -15, -47, -42, -3, -7, -22, -3, 9, 23, -11, 9, -1, -7, -34, -19, -1, 10, 17, -15, 16, 45, 2, 27, -9, 54, 22, 54, -25, 6, 27, -24, 43, -16, -9, -29, -1, -25, 1, -23, -4, -5, -8, -17, -7, -19, -2, -8, -3, 73, 127, -19, 19, 8, 17, 6, -29, -2, -38, 14, 38, +12, 7, -6, -3, -21, -5, -27, -22, 3, -12, 22, -15, -40, 1, -21, -18, -29, 4, 0, -12, 62, -26, -35, -18, 6, -19, 7, -49, -7, 18, 9, 13, 1, 53, -15, 61, -12, 32, -33, 5, -29, 15, -9, -11, -14, 41, -4, 37, 4, 6, 1, -12, 25, 38, -15, 5, 15, -5, 5, -11, -35, -9, -17, 19, -28, -25, -21, -12, -16, -1, -7, -32, -35, 37, -32, -4, 1, 20, -15, -5, 54, +49, 3, 9, 102, -20, -16, -18, 20, -17, -34, -59, 7, -27, 20, 3, 0, -17, 4, 52, -23, 50, -16, 6, -4, -7, 81, -17, -13, 37, 3, 8, 18, 10, -49, -5, 93, 11, 46, 5, 0, 8, 18, -8, -35, 37, 15, -23, -42, 0, 34, 56, -16, 32, 1, 35, 3, -10, 41, -20, -17, -2, 6, 39, 21, -3, -35, -5, 94, -24, 47, -5, 8, 1, -7, 11, 17, -66, 23, 31, -9, -8, +-31, -34, -15, -12, 5, 27, 2, -6, -7, -34, -39, 2, 3, 7, 16, -13, -22, -11, -1, 29, -13, 12, 31, -7, -13, -29, -21, -65, 11, 12, 62, 27, -6, 45, -7, 36, 11, 33, -1, -33, 8, 34, -19, -11, 12, 47, 87, -44, -65, -16, 65, 127, 86, 17, -6, 0, -25, 5, 13, -34, -30, 11, -23, 37, 7, 52, -47, 36, -26, 30, 30, 7, 71, -15, -9, 32, 3, -12, -13, 0, -62, +-13, 102, -30, 84, 11, -11, 26, -19, -31, -29, 36, -3, -26, -78, -31, 61, 38, -21, 3, 1, 4, 43, -24, 0, -26, -30, -40, 8, -57, 19, 24, -44, -27, 31, 6, 60, 14, -8, 3, -3, -23, -19, 12, -25, -19, -50, 127, 47, 26, -12, 61, -25, 23, 9, -22, 67, 8, -52, -18, 15, -19, 25, 3, -37, -21, 51, 85, 48, 11, 37, 6, -18, -34, -43, 21, -33, -32, -18, 5, 23, -46, +-1, 9, -19, 18, 10, -28, -29, 12, -26, 84, 26, -11, -62, -31, 16, 61, 90, 45, -35, -36, 33, 1, -49, -33, -53, -38, -23, 5, 53, -10, 24, 18, 14, 12, -1, 9, 16, -14, -26, 4, -49, 31, 49, -31, -17, 7, 27, 2, 68, 67, 11, -1, 9, 24, -4, 20, -44, 10, -2, 42, -38, -9, -12, -25, 37, -4, -23, -23, -27, -15, -6, -22, -33, -19, 23, -6, -13, -9, -13, -19, -21, +66, -5, -21, 18, -23, 31, -16, -18, 37, -12, 3, 56, 6, 52, -28, -20, 48, -7, -31, -25, -21, -27, 15, -25, 4, 48, 2, -26, -25, 19, 23, 47, 59, -7, 6, 9, 33, -24, 9, 5, 3, -20, 24, 46, 8, 37, -27, 43, 10, -10, -39, -26, 32, -11, 31, -12, 4, 54, -24, -30, -29, 18, 22, 45, 35, 4, -14, -6, 16, -15, -9, -22, -4, -15, 28, -50, 18, 32, -4, 2, 5, +-22, -14, -11, -11, -23, 3, -25, 11, 11, -26, 1, -11, 6, -14, -6, -10, -8, -11, 9, 3, -29, -7, -50, -23, 10, 17, -14, 9, 24, 32, 35, -12, -18, -14, -10, -43, 34, -15, 14, -15, -39, -15, 39, -7, 24, -34, 41, -22, 26, -27, 9, -8, 13, -4, -4, -14, -31, 13, 7, 22, 5, 12, 0, -26, -18, -13, 40, -19, -27, -8, -20, 18, 7, 1, 17, -13, 6, 0, -18, 6, -7, +-21, 1, -16, -39, -14, 10, -10, -38, 0, -29, 15, 16, 9, -17, -31, -23, 17, 20, -2, 4, -2, -2, 15, 9, -52, 15, 10, 7, -44, 4, -24, 0, 5, 17, 15, -20, -30, -4, -15, -28, -29, -53, 5, 45, -32, 6, 40, -12, -6, 3, -13, -8, -34, 32, -5, 21, -43, -12, 25, -12, -14, 45, 50, 18, 23, 24, -20, 30, -12, -14, 25, -12, -13, 25, 23, -1, 8, 5, 38, 6, -6, +15, -11, 16, -47, 16, 8, 41, -46, 8, 0, -21, -8, 39, -5, 47, 42, -10, -66, -10, 4, -13, 11, -28, -17, 19, 11, -18, -5, 17, 4, -40, 15, 42, 9, 6, 2, 26, 20, 29, -23, 24, -3, -39, -11, -33, 52, 17, -6, -7, -26, 52, -14, -10, 12, -21, 33, 5, 54, -8, -22, 7, 27, -35, 42, -42, 5, 14, -18, 12, 21, 27, -4, 2, -37, -6, 39, -23, 70, -21, 0, -19, +-3, -4, -6, -31, 42, -3, 1, -3, -9, 39, -31, 11, 21, -39, -1, -16, -3, -2, -62, 38, -22, 46, -42, 0, 39, -19, 36, 48, 65, 30, 27, 55, 5, 5, -21, -34, 27, -13, 24, 47, 21, 0, -12, 4, 41, -11, 41, -19, 50, 19, -32, 89, -3, -11, -15, -61, -7, -59, -61, 77, 88, 35, -28, 72, -31, -19, -14, -2, 0, -48, -50, 38, -8, -12, 0, 20, -2, -15, 17, -2, -3, +29, -5, 3, -6, 18, -17, -25, -17, -29, 52, 2, 31, 30, -14, 15, -79, -12, -16, -30, -11, -25, -37, -7, 13, 9, -8, -13, 11, -37, -24, 3, 6, -5, -25, -61, -21, 16, 95, -43, 24, 19, 17, 77, -34, -44, -15, -23, -34, 24, -18, 23, 1, -1, 13, 25, -34, 50, -16, 127, 12, 5, 35, -11, 65, -27, 6, 71, -4, 5, 26, -17, 33, -20, 7, 14, -29, -29, 21, -29, -3, -13, +4, -11, 44, -19, 26, 30, -6, -15, 6, 55, -8, 31, -9, -14, -31, -31, -7, -1, -11, -7, 8, -14, 65, 53, -74, -6, -24, -36, -22, 24, -38, 11, 29, -31, 10, -9, 7, 35, -12, 12, 48, -47, -49, -9, -3, -7, 15, -49, -46, -34, -6, 0, 64, -32, 75, -59, -12, -10, 42, -40, -27, -21, -22, -28, 6, 16, 41, -9, 3, 0, 0, -45, 75, -11, -26, 33, -10, -5, -15, -34, 16, +-83, -12, 10, 7, -10, 78, -9, -40, 37, -15, -37, -4, 0, -58, 0, 26, -10, 10, 21, 52, 26, -15, 14, 50, 23, -12, 8, -11, -26, 4, -6, -15, 8, -6, 36, 32, -23, 32, -45, 4, -4, -17, -32, -5, -30, -13, -11, -13, -12, 32, -9, -9, 22, 5, 18, 50, -31, -11, -25, -14, -46, 15, 15, -7, -2, 16, 35, 53, 14, 36, -62, -44, -5, 18, -23, 22, -14, -32, -24, -46, -6, +42, -37, -2, 43, 18, 0, 28, 20, -25, -5, -9, -21, 16, -14, -18, 22, -10, 21, 42, -12, 22, -19, -5, -15, 14, 0, -31, -15, -33, -19, -17, -18, -5, -11, 7, 22, -4, 12, 75, 22, -14, 8, -42, -45, 21, -9, -14, 0, 12, 17, 18, 16, 14, -11, -7, -42, -45, 19, -35, -10, -30, -28, -19, -22, -11, -17, -11, 31, -17, -21, 84, -54, -35, 14, -29, -24, -25, -13, 23, -40, -43, +-9, -15, -24, 59, -35, -1, -11, 20, -30, -26, -11, -32, -28, -2, -2, 7, 11, -5, 6, -35, -32, 51, -13, -34, -29, -21, 32, -10, -5, -6, -25, -16, -13, 55, -13, 56, 10, -40, 19, -3, -21, -41, -9, -14, -22, 21, -1, 2, 5, 81, 18, 11, -18, -12, -38, -7, -11, 7, -41, -31, -21, 16, -31, -25, 6, 15, 22, 45, -23, 18, 32, -45, -46, -5, -19, -13, -13, 10, -13, 9, 7, +-14, 6, 17, -19, 19, -28, 4, 34, 10, -43, 31, -42, 50, -52, -17, -5, -49, -12, 87, -11, -9, 27, 75, -31, -5, -13, -40, -21, -28, 36, -15, 46, 27, -22, -29, -41, 47, -41, -10, 46, -41, -10, -15, -35, 40, -49, -76, -10, -4, 5, 74, -8, 6, 3, 36, -52, 1, -35, -52, -31, 14, -12, -24, -6, -21, -7, -21, -43, -5, -55, -26, 34, 8, -24, -6, 20, 9, -66, 114, 8, -21, +-49, 89, -52, -16, 62, 3, -34, 11, -42, -19, -33, -14, 17, -13, -1, -39, 23, -13, -10, 6, -52, -23, 52, -8, -16, -2, -38, 7, -30, -26, -9, -47, -10, 111, 71, -25, 46, -30, -20, -40, -4, -42, -14, -39, 26, 23, 29, 65, -2, -26, -24, 11, 10, 33, -31, -19, -24, 26, -1, -32, -37, 39, -61, -8, -11, -44, -15, -5, 6, 28, -68, 0, -22, -6, -34, 16, -28, 12, 27, -60, 60, +10, -24, -63, 5, -36, -40, -8, -24, 16, -4, 37, -41, 64, -43, 9, 4, 18, 25, -45, 127, -57, 12, -58, -22, 50, -59, -58, 32, -34, 4, -105, 15, 28, -12, 13, -19, -6, 2, -24, 2, 4, 23, 31, -23, -24, -38, -2, -14, -48, -30, -8, 39, 12, 10, -47, 43, -28, -1, 3, -34, 39, -6, -18, -4, -17, -8, -14, -28, 19, 10, 14, 0, -23, 20, 56, -20, 31, -69, 1, 17, -29, +-35, -2, 67, -2, -28, -15, -9, 6, -34, -5, -29, -4, 10, -7, -22, -15, -23, 6, -78, 59, -47, -1, -28, 38, 39, -6, 14, 64, -59, -26, -29, -33, -24, 33, -28, -19, -54, -19, 2, -2, -9, 1, -10, 42, 1, 16, 40, -7, -19, -23, 1, 6, 16, 8, 5, -10, 10, 21, 48, -4, -2, 50, 9, -35, -9, 30, -25, 11, -13, -7, 21, -16, 24, 17, -49, -10, 9, -37, -18, 32, -14, +-53, 27, 1, 72, -10, -36, -57, -17, -19, -3, -15, -25, -20, -24, -57, 47, 111, 3, 19, -16, -17, 14, -24, 0, -12, -13, -49, -5, -2, 7, 38, -18, 27, -37, 58, -13, -1, 1, 10, 24, 6, 64, -33, 20, 13, -7, -23, -11, 102, -10, 83, 12, -17, 20, -18, 49, 13, -43, -18, -17, -36, -8, 51, -5, 2, -38, -13, -11, -3, -19, -33, 19, 51, 71, 6, 25, -17, 2, 1, 16, 0, +6, 66, -4, 20, -22, -51, 29, -21, -14, -10, -21, -15, 14, -14, -49, 28, -21, -46, -49, -50, 57, 11, 36, 50, 2, -3, -23, -21, -42, -28, -48, -54, 4, 15, 12, -19, -8, -9, 31, -14, -20, -50, 18, 30, -12, -14, -7, -7, 27, -14, -52, -21, -36, 74, -44, 8, -31, 13, -40, -24, 24, -49, -6, -44, 53, -12, 27, 127, 69, 51, 77, -28, 67, 102, 31, 81, 11, 54, -59, 18, 50, +15, 23, -9, -26, 22, 32, 8, 42, -22, -1, 59, -13, 23, 34, 45, -22, -9, 48, 24, -15, 3, -32, -17, 19, -23, 5, -15, 44, 0, -16, -14, -5, 38, 18, -9, -15, 65, 8, 10, 34, -26, -26, 47, 25, 9, 26, -1, -17, 0, 29, 22, 3, -37, -25, -36, -36, -36, 15, -21, 3, -32, -2, 11, 0, 43, 25, 51, -19, -26, 103, 6, -15, 23, -30, 47, 3, -5, 78, -7, -18, -24, +-61, 64, -33, -39, 46, -16, -58, -43, -13, 14, -25, -52, -15, -36, 23, 37, 19, -51, 9, -35, 80, 14, 3, -31, -11, 31, 58, -3, 17, 3, 6, -38, 10, 62, -2, -23, -10, -38, -15, -59, -9, -18, -20, -5, -5, -26, 0, 46, 12, 75, -21, 19, -14, 18, 13, -5, 41, -19, 83, 10, -30, -23, 43, -25, 62, -12, -7, -26, 2, 20, -32, -23, -32, -25, 8, 3, -8, -27, 50, -2, -19, +-23, -27, 2, -4, -23, -9, -23, -8, -40, -24, -46, -27, 26, -13, 17, -46, 17, 28, -4, -24, -50, -24, 38, -23, -28, 19, 5, 88, -18, 73, 14, -2, -33, 17, 17, -15, 48, 27, -51, 6, 2, -25, 17, 12, 2, -71, 104, 25, -27, -63, 26, -70, -38, 91, 54, -5, -38, 49, -45, -6, -2, 47, 31, -23, 17, 24, -1, 6, 23, 19, 1, 70, -11, -12, 36, 62, -6, -12, -11, -6, 27, +-12, 54, 12, 22, -24, -42, 16, -17, -29, 11, -3, -37, -8, 72, -18, -10, 0, -11, 18, 6, -2, -32, 4, -8, -7, 23, -15, 7, -16, 4, -9, 42, 6, 25, 13, -2, -6, -4, 18, 13, -13, 2, 7, -2, 8, -7, -3, 13, -5, -1, 28, 29, 53, -4, 115, -25, -7, -2, -12, -4, 30, 39, -28, -2, -23, -33, -11, -27, -6, 24, -25, 6, -33, -41, 43, 45, -13, -28, -5, 14, 10, +17, -25, 114, 15, -23, 12, 19, -38, 2, -10, 103, -14, -28, 23, 1, 5, 32, -14, -38, 26, -15, 6, -24, 24, -23, 54, 29, 1, 1, -39, -34, -12, -15, -9, 23, 47, -22, 20, 33, 3, -39, -55, -11, 40, 12, 17, 20, 61, 118, -9, -18, -19, 29, 22, 2, 10, 2, -38, 45, -9, -43, 46, -3, -37, -25, -19, 39, 28, -17, -50, 29, -47, 4, -62, 54, 32, -41, 35, 31, 44, 4, +13, -27, 22, -23, -6, 34, 46, -8, 14, -7, 9, 12, -23, 61, -7, 73, -12, 70, 39, 5, -41, 19, -35, -17, -3, 29, 14, 25, 48, -11, 33, 0, -35, -16, 28, 2, 2, -14, 22, -53, 82, 19, -32, 65, -7, 76, -21, -6, -5, 51, -39, 20, -14, -17, -18, -11, -14, 78, -43, 28, 40, 17, -1, -44, 7, 8, 11, -29, -13, 79, 19, 56, 26, -8, 67, 17, -43, -25, -11, -33, 41, +111, -17, -28, -42, 105, -80, -3, -38, 6, -2, -41, 25, 20, -36, -22, -41, -29, -19, 17, -32, 0, -54, 6, -14, -21, 13, -13, -14, 23, -34, -11, -21, 8, -28, -5, -18, 9, -32, -24, 3, 30, 12, 21, 19, 79, -36, 16, 3, -9, -8, 1, -7, -47, -3, 30, -1, -20, -35, 12, -43, 2, 6, -10, -11, -18, 30, -15, 1, -22, -16, -23, 8, -10, 16, -13, -18, 27, -49, -30, 0, 10, +9, 6, 17, -11, -6, 17, -10, -23, -47, 30, -8, -15, -42, 30, -44, 5, 39, 26, -16, -3, 11, 21, -15, -11, 5, -5, 24, 127, -48, -15, 3, -39, 89, -36, -10, 24, -19, 43, -1, -29, -37, 2, -15, -62, -25, -33, -16, 24, 63, -17, -16, -31, -23, -19, 21, -26, 4, 35, 19, 71, -57, 5, -21, -4, 59, -8, 47, -30, -27, 42, 12, -11, -20, 11, 9, -1, -22, 3, -29, -9, 25, +-31, -29, -45, -42, 3, 76, -39, 15, 4, -35, 14, 18, 0, 0, -2, -10, 9, -6, -59, -30, -20, -31, -5, 11, -2, 127, -10, -37, 26, 17, -21, -14, -19, -18, 48, -5, -35, -15, 14, 70, 13, 0, -11, -8, -47, 8, 9, -23, -13, 36, -64, 18, 51, -6, 50, 28, -25, 27, -15, -36, -66, 17, -41, -9, -18, -49, 21, 77, -36, 23, -53, -52, -21, 43, 38, 12, -33, 21, 6, -18, -17, +46, 27, 15, 13, -63, -36, 9, 13, 32, 60, -10, 0, -16, -8, 21, 63, -17, -18, 2, -32, 30, 13, 11, -33, -7, 35, 45, -33, 28, -42, -1, -20, -2, -10, -6, -7, -19, -26, 28, 65, 38, -2, 0, -20, -11, -7, -12, -20, -14, 54, 35, -23, -26, 15, -25, -21, -22, -8, 5, 27, -3, 73, -25, -15, -5, 50, -24, -33, -68, 4, 4, 34, 23, 87, -2, -40, 24, -44, -37, 10, -15, +27, 21, -21, -67, 42, 21, -49, 1, -32, -51, 23, 47, -35, -19, 8, -11, 42, -15, -1, -67, 18, 14, -13, 65, 63, 75, 10, -35, -33, -3, 42, -28, -17, -29, -50, 5, -15, -23, 47, -31, -7, -32, -21, -25, 6, -2, -9, -30, -39, -67, -21, 77, -78, -20, -1, 16, 77, -57, 13, -13, -32, 18, -18, -32, 35, -26, 15, -35, -33, -6, -11, -20, 16, -33, 17, -45, 33, 4, -17, -12, -28, +-26, 17, 19, 4, -30, -51, 46, -25, -20, -88, 57, -61, -46, 71, -40, 1, -43, -63, -39, 2, -16, -45, 12, 72, -3, -27, -60, 20, 16, 56, -55, 86, -47, -14, 10, -7, 2, 5, 14, -7, -27, 8, 25, 23, -8, 3, 13, -8, -26, 16, -21, -24, 5, -48, 20, 62, -32, -43, -6, 15, 5, -36, -2, -55, 7, 16, 31, -38, 20, -24, 35, -21, -2, 5, -12, -26, -8, 18, 12, 42, 10, +-29, 53, -56, -25, -6, 8, 6, 18, -17, -3, -11, 9, 1, -35, -52, -1, -24, 55, -42, 22, 13, -3, 6, -24, 64, 37, -51, 76, 31, -4, 55, -26, -16, -28, -5, -5, -20, -6, -21, 61, 44, -23, -13, -56, 18, -14, -50, -11, -14, -44, 1, 39, -1, 67, -1, 1, -29, -21, -35, -16, -19, 2, 51, -9, -36, 29, -25, 4, -28, 71, -41, 2, 35, -31, 5, -13, 4, 19, 21, 4, 1, +-41, -20, 28, -5, 33, -17, -19, 4, -8, -42, 41, 21, -9, -32, 10, -1, 2, -19, -6, -39, -11, 19, -11, 22, 2, 11, 20, 15, -11, 13, -1, -13, -17, -31, 28, 7, 7, -13, -3, -17, -38, 4, -30, 4, -33, -41, 16, -13, 23, 5, -7, -26, -44, -32, -23, -13, -33, -21, -32, -5, 0, -57, 47, -21, -36, -30, 15, 17, -22, -7, 6, -54, -9, -37, 29, -29, -26, -32, -11, -12, -1, +-2, -24, -26, -16, -7, 41, -27, 7, -36, 1, 4, -33, -12, -4, -24, -30, 7, -49, -3, 73, -6, 29, -8, 27, -8, 6, 5, -9, -18, -26, -22, 57, -31, -11, 12, -12, -19, -63, -18, -63, 20, -13, 28, 26, 46, -9, 25, -2, -35, 47, -2, -6, -8, 40, 10, -33, -5, 13, -48, -6, -18, -15, 24, -44, 39, 38, 31, 1, 82, 44, 45, 46, -56, 16, 7, -59, -39, -65, 22, -34, -52, +-20, -19, -7, 6, -21, 0, 12, 58, 52, -17, 83, 31, 36, -31, -29, -3, 43, 12, -40, 38, 6, -27, 64, -30, -30, 104, -48, -6, 3, -40, -10, -15, 31, -6, -6, -19, 12, -67, 2, -13, -1, 9, 5, -13, -24, 47, -36, 2, -10, -15, -1, 15, -23, 16, -45, 14, 4, 8, -28, -3, -13, -5, 33, -14, 14, -12, -12, -8, 29, -27, 53, -2, 34, 8, -19, 5, -1, 10, -15, -19, 4, +-3, -10, 3, -25, -1, -24, 8, -24, 12, -8, -18, 27, 11, -10, 33, 56, -29, 19, -31, 20, 9, -23, 26, 11, -27, 52, 7, 42, 11, -36, 6, -10, 41, -5, -3, 12, 35, -28, -4, 2, -2, -16, -44, -2, 68, -3, 36, 13, -38, 80, 5, -23, 34, 13, 4, 13, 6, -27, 40, 25, 0, -29, -4, -14, -31, -17, -15, 101, -2, 9, -7, 127, 42, 52, 17, -50, -5, 8, -14, 23, -2, +-4, 50, -33, -13, 67, 15, -38, -3, 18, 3, 8, 2, 23, -14, -37, -28, -23, -46, 22, -10, -11, -7, 121, 73, 37, -26, -31, 42, 13, -18, -16, 5, 97, 23, -21, 59, 54, 11, -12, -20, -29, 14, -29, 37, -13, 10, -12, -10, 13, -49, 76, -2, -16, -30, 127, -23, 66, -11, -24, -32, -38, -32, 11, -13, -16, 3, -37, 54, -28, -8, 1, 7, 12, -26, 81, -26, 62, 2, -11, 127, -9, +45, -8, 11, 11, 1, 41, -33, -13, 21, -41, 25, 32, 45, 0, -16, 28, -23, -8, 18, 6, 1, -18, 67, -37, -4, 4, -14, 7, 36, 2, -30, -25, 11, -7, -31, -61, -17, -3, 63, 64, 22, 27, -77, -26, 24, 3, -64, -60, 52, 40, 33, 32, -31, -23, -36, -2, -28, 69, -16, -25, 31, -9, 22, -18, 51, -51, 10, 11, -28, 51, -28, 40, -14, 40, -22, -37, 20, 33, 37, -26, 10, +-22, 41, 19, -37, 88, -37, 71, -11, -29, -18, -10, 16, 29, 127, -4, -14, -25, -1, 28, -27, -18, 27, -1, 9, 102, 1, 5, 43, 19, 31, 43, 13, -29, 48, 25, -44, 77, -4, 14, -28, 23, -14, 6, 12, 50, 79, 11, -15, -6, -13, 12, -29, 4, 5, 2, 18, 127, 8, 3, 4, -6, 29, -40, -25, -41, 67, -18, -21, 59, 3, -13, -22, -12, -39, 11, 2, 9, 124, 42, 59, -9, +-19, -13, -47, 12, -33, -16, 34, 114, 35, -84, 42, 39, 4, 3, -7, -41, 45, 19, 5, 72, -20, 3, -40, 14, -49, 8, 7, 13, 123, 36, -30, -5, -3, -31, -8, -30, 11, 7, 74, 127, 5, 44, -41, -27, -1, 31, 9, 3, 13, 5, 6, 122, 21, 15, -52, -21, -27, -31, -6, -11, -2, -42, -18, -31, -21, 12, -46, -18, -6, 27, 58, 117, 35, -51, -8, -26, 17, -23, -16, 23, -26, +28, 0, 8, 7, 44, -18, -18, 61, 33, 5, -24, 19, 62, -6, -17, -10, -6, 20, 18, 57, -12, -8, 23, -3, 17, 9, -18, 8, 9, 28, 16, 54, -52, 8, -36, 20, -17, 38, 78, 92, 40, 75, 12, 92, 22, 43, -23, -20, -101, -2, -28, 77, -67, -14, 93, -33, -25, -35, 49, 29, -19, -15, 34, 12, 0, 4, -12, -12, 22, -7, 56, -8, 62, -9, -6, 80, -40, -32, 22, -2, -11, +-6, -23, 15, 14, 40, -22, 14, -42, -24, 49, -5, 0, -13, 45, -10, -24, -30, -34, 11, -26, 19, 19, 52, 31, 22, -28, -6, -24, -18, 24, -25, -25, 27, -1, 6, -16, -3, 7, -17, -20, -41, -15, 16, 0, -25, -41, -25, -7, 15, -47, -17, -5, 19, -35, 30, 28, -9, -11, -6, -10, 1, 31, 10, -25, -9, 0, 58, -36, -15, 0, -9, -24, -14, 3, 22, 22, -14, -38, 29, -23, 11, +24, -3, 24, 17, -30, -27, -20, -20, -45, 34, -25, 49, 65, -28, 3, 65, -7, -20, -34, 1, 8, -18, 0, 72, -35, -11, -6, -29, 17, -12, 9, 96, 127, 8, -6, 11, -21, -15, -40, -29, 46, 48, -14, -21, -17, -14, -36, 15, -9, -2, 3, 31, -40, -15, 12, 67, 5, 22, 10, 4, -53, 35, -16, 37, -18, -16, -33, -2, -14, -1, -35, 14, -27, 54, -16, 52, -41, -9, -28, 21, 27, +-55, 35, -3, -38, -29, -9, -9, 27, 2, -32, -4, 19, -17, -15, 58, -15, -17, 64, -23, -16, 18, -31, 0, -23, 29, -2, 21, -37, 15, 13, 8, 7, 29, 75, -42, -28, 11, -60, 33, -21, -2, 54, 6, -12, -25, -25, 56, -5, -29, -17, -27, 45, -20, -46, -27, -15, 23, -41, -9, -42, -22, 9, 127, 19, -21, 21, -28, 15, 101, 7, 3, -40, -23, 53, -7, 28, 71, -26, -21, 25, 56, +40, -26, 53, 21, -26, -69, 109, -14, 3, 31, -26, -4, 20, -53, -8, -5, 11, 56, -35, 86, -4, 3, -7, 16, -25, -3, 31, -8, 11, -21, -3, -6, -34, 0, 6, -23, -50, -29, -36, -20, -26, -12, 34, -4, -7, -16, -10, -3, 3, -16, -4, -29, 4, 9, 23, -14, -8, 23, -8, 18, 0, 32, 4, -2, 23, 39, 12, -14, -11, -7, -25, 8, -29, 13, -1, 9, -22, 13, -5, -2, 23, +19, -17, -7, 50, -19, -28, 5, -19, 31, -58, 36, 15, 2, -21, -4, -28, -8, 23, -8, -17, 34, 15, 33, 17, -31, -19, -34, -6, -31, 1, 50, 53, 8, -94, 10, -17, -33, 16, -4, -10, 25, 24, 21, 9, -25, 1, -10, 17, 9, 73, -27, 9, 39, -19, 18, -34, -9, 25, 30, -43, -11, -10, 6, 42, 4, -13, 11, 22, -14, 54, 4, -1, 0, 54, -19, -40, 15, 121, -31, -31, -1, +-20, -13, 52, -2, 10, -14, -2, 21, 26, -11, -24, -23, -10, 21, 7, 4, 54, -20, -15, -17, -3, 4, 35, 2, -4, 4, -27, 28, -45, -1, 21, 20, 9, 31, 13, -22, -29, -22, 10, -34, 13, 13, 31, -21, -21, 11, 7, -28, -16, 1, 14, -4, -55, -20, 13, 90, -6, -6, -11, 10, -16, 9, -17, 35, -22, 126, 39, -36, -28, 42, -2, -77, 49, 19, 43, -36, -21, 26, 5, -25, 31, +-31, -51, -16, -14, -19, -1, 11, -7, -12, -38, -33, -21, 85, 60, -62, -16, 36, -17, 11, 40, -9, 16, -32, -4, -12, -36, -22, 5, -1, -28, -1, 110, -22, -10, -14, -11, -9, -3, 52, -32, -6, -16, -24, -12, 16, -20, 31, -51, 3, -25, -24, 21, 10, 36, -28, -23, 5, -8, -5, 23, 60, -38, -53, 104, 1, -25, -30, -29, -44, -43, 29, -5, -31, 0, -27, -28, -42, 0, 9, -9, 61, +-19, -33, -7, 16, 14, -41, -2, 6, -31, -18, -9, 4, 31, -41, -24, -53, 24, -41, 13, 4, -8, -51, -22, -28, 11, 37, 7, -15, -7, -6, -37, 2, 14, -41, -3, 10, 68, 17, 18, -28, -41, -2, -13, -21, -28, -2, -39, -9, -45, -23, 15, 29, -13, -43, 0, 9, 9, -1, 15, 1, 13, -26, -23, -24, -23, -21, 45, -38, 65, 10, -45, -35, -10, -20, 62, -2, 20, 35, -29, -41, -15, +24, -8, 15, 48, -14, -10, -17, -26, 14, -24, -12, 82, -25, -68, -16, -61, -6, -3, -31, 61, 9, -23, -12, -24, 44, 9, 9, -4, -31, -3, 41, -40, -22, -17, -18, -18, -10, -28, -18, -12, -40, 35, -6, -21, -32, -12, -1, -16, -5, 32, -41, 18, 8, 42, -1, -21, -47, -11, -28, -31, -16, 30, -39, -13, -8, -13, -18, 10, 8, -15, -25, -6, 11, 25, -47, 11, -11, -42, -4, -6, -11, +39, 2, 85, 70, 44, 10, 4, -8, -3, -62, -28, -20, 24, -3, -46, -53, -39, -22, -37, -3, 19, -15, 4, 6, -24, 92, 1, 12, -35, -18, -38, 36, 20, -15, -23, -43, -18, -11, -7, -5, 21, -55, 23, 17, 8, -55, -24, 2, -34, 9, 45, 0, -5, -3, -10, -28, 3, -39, 18, 23, -44, 21, -16, -26, 29, 64, 10, 14, -27, -13, 29, 23, 39, -39, 0, -33, 60, -15, -17, 12, -30, +21, 42, -18, -29, 7, 14, -37, -5, -73, 17, 9, -27, 0, -27, -39, 52, -10, 27, 4, -7, -16, 9, 48, 50, -27, 38, -18, 19, 18, 11, -10, -25, 11, 35, -52, 3, -35, 35, -16, 5, -50, 11, 12, -26, -7, -14, -29, 1, 87, -20, 25, -21, -23, 6, 8, 125, -22, -21, -4, -8, 17, -22, -22, -27, -16, 64, -17, 3, -14, 13, -28, -30, -26, 23, 8, -9, 52, -1, -9, -20, 31, +17, -5, 5, -41, 24, 38, 30, 10, 2, -33, 4, 36, 9, -2, -28, 22, 26, -1, 13, -1, 4, -6, -11, -3, 20, 71, -15, -27, -3, -20, 1, 127, -1, -18, -14, 6, 28, 41, -25, -1, 20, -15, 9, 2, -10, -12, -35, 11, 39, -25, -6, -18, -43, -16, -6, -7, 23, -50, -39, 1, -31, 4, -27, -32, -9, 23, -10, -28, 27, -31, -19, 36, -4, -2, -28, 19, 12, -27, 79, 61, 13, +-48, 14, -19, -33, -39, 37, -41, -8, 32, -65, -3, 20, 57, 15, -45, -15, -24, -43, 46, -44, -6, -11, 68, -28, -22, -43, -15, -25, -23, -22, 50, -39, 27, -31, 51, 18, -17, -22, -22, -18, 14, 43, 33, -22, -16, 25, 34, 17, -13, -44, -17, -20, -43, -16, 51, -15, -39, -24, -5, 19, 6, 42, 40, 6, -11, 29, -6, -5, -41, 17, -29, 23, 12, 47, 11, 4, -4, -2, 4, -27, 7, +-19, 9, 11, -11, -12, 21, -3, 44, -6, -2, -25, -29, -15, 39, 127, -16, -15, -62, -24, -27, 8, -16, 34, 30, 14, -45, 22, -14, 19, -36, -54, -33, -13, -39, -9, -7, 6, -2, 24, 95, -45, -11, 58, -44, -38, 65, -32, 64, 33, 18, -46, -12, -26, -2, -13, -11, 30, -13, 1, -43, -2, -2, -14, -17, -14, 4, -31, -7, -7, -57, 6, 18, -8, -18, 6, -22, -8, -6, -36, 1, 47, +-1, 26, -47, 12, -21, 35, 14, 6, 14, -35, 12, -19, -24, -2, -51, -29, 43, 6, -30, -2, -49, -10, -48, -15, 5, 34, -70, -51, 58, -20, 44, 48, -38, -32, -8, 67, -20, 27, -48, 53, 9, 3, -44, 15, 72, 34, 28, 18, 84, -50, -29, -24, -33, -65, -17, 13, 7, 5, 11, 10, 10, -24, -29, 38, -42, 20, 26, -12, 2, 18, -5, 6, -12, 29, -20, 3, -36, -33, -1, -37, -9, +-48, -45, -40, -34, -38, -29, 6, -10, -11, 7, 6, 113, -10, -22, 13, -54, -20, -16, 76, 27, -10, -20, 25, -30, -8, -22, -40, 1, -1, -29, 1, -35, 20, -23, -16, -18, -21, -21, -7, -5, -49, -22, -8, -1, 0, -25, 46, 18, 2, -18, 6, -1, -33, -4, 8, -13, -24, 45, -6, -3, -48, -45, -2, -13, -16, -14, -12, -30, -2, -28, -31, 33, -8, 5, 15, -16, -34, 17, 56, -6, 2, +-7, -20, 0, -42, 17, 29, 13, -12, -32, -67, -47, 9, -30, -40, -13, -33, 75, -5, 24, -12, 28, -9, -25, 10, -27, 50, -5, -28, 15, 14, 8, 20, -9, -9, -6, -12, -12, 15, 24, -37, -23, -24, 21, 17, -11, -28, 9, -19, 47, 11, 29, -35, 2, -31, -16, -25, -20, 26, -8, -34, 13, -12, -38, 66, 1, -38, 21, 35, 3, 27, 54, -21, -13, 32, 78, 29, -13, -2, 22, 11, 4, +-6, -18, 2, 16, 37, 6, -64, 27, 39, -5, -33, -13, -18, -22, 15, -11, 9, -45, -2, 16, 7, 9, 15, -51, 29, 9, 9, 39, -16, 23, 16, 45, -10, 32, 4, -20, 3, -34, -39, 40, 5, -27, -27, -22, -52, -5, -12, -28, -52, -12, 0, -9, 25, -8, -24, 5, 20, -14, -9, -11, -13, -23, -8, -12, -17, -5, -17, -22, 1, -7, 56, 78, -8, -15, -4, 1, -25, -9, -2, -2, -24, +52, 22, 31, 8, -32, 2, 9, -24, 31, -6, -50, 12, -3, 28, -18, 29, -40, -17, -24, -6, -20, -24, -17, -70, -7, 22, 56, -10, -22, -36, -3, -43, -16, -54, -23, 51, -68, -22, -63, -24, 23, -58, -10, -22, 10, 52, -13, -41, 27, 114, -15, -14, -28, 19, 7, 25, 14, -40, 31, -54, -22, -17, -49, -57, 15, 30, -12, -25, -15, -33, -41, 9, -22, -32, -24, -27, 20, -10, 7, 51, 4, +127, -27, 18, 15, 14, -6, 37, -26, -36, 26, -24, -11, 19, -5, -12, -19, 5, -38, -21, -42, -30, -45, -23, 19, -2, 6, -32, 1, 12, 11, 4, -6, 127, -3, -32, 1, -12, 113, 8, 5, -32, 11, -20, 50, 16, -25, -27, -9, 27, -19, -8, -27, -10, -36, -10, 28, 11, 22, -32, 12, -2, -5, 27, 12, 28, 4, -9, -24, 71, -26, 1, -19, -14, -21, -27, -48, -31, -35, 4, -24, 2, +-11, -23, 16, -31, -21, -12, 11, -1, -18, -28, -8, 23, 0, -44, -36, 2, 38, 11, -30, -37, -38, -5, 16, 48, -22, -28, -55, -28, -29, 30, -5, 26, 15, -23, 32, -23, -52, 38, -45, 20, 77, 13, -51, -6, 47, -29, -47, -52, 37, 31, 23, -51, -46, 31, -20, -23, -28, -9, 12, -54, -25, -9, 57, -61, 24, -16, 26, -27, -37, -5, -22, -36, 38, -23, 1, -21, 34, -36, 26, -33, 48, +-11, -38, -7, 13, -25, -17, -8, 11, -14, 5, -14, 45, 10, 36, 28, -7, -13, -12, -18, 1, -44, -15, -22, -8, -46, 12, -14, -49, -13, -35, 44, -22, 72, 8, -41, 1, -6, -25, -61, -19, -1, 14, 11, -30, -34, 0, 17, -7, -32, 43, -38, -29, -37, 0, -20, -14, -30, 7, 17, -31, -13, -7, 39, 11, -11, -12, 32, 28, -24, 36, -7, -15, -22, -42, -11, 12, -4, -36, -54, 4, 7, +76, -5, -31, -10, 80, -7, -7, -32, -2, -4, -71, -32, 1, 35, 19, 40, -5, -14, 9, 39, -46, -40, -28, -23, 0, -20, 24, 1, -8, -40, -23, 44, 43, 41, -17, 8, -24, -49, 52, -20, -53, 8, -20, -26, 10, -11, 50, -21, 25, 0, 33, -6, 4, -29, -32, -6, 23, 24, 36, 14, 11, -21, -17, -7, 43, -8, 19, -15, 0, -49, 34, -19, -26, -14, -17, 14, 28, -1, 6, -1, 25, +2, -8, -51, -26, 2, -7, 1, 25, 20, -43, -29, 30, 11, 11, -24, 61, 26, 18, -32, -12, -26, -33, 6, -13, 26, -15, 27, -1, -10, 7, 6, 14, 103, -16, -47, -13, -28, -34, -47, 52, 3, 40, 0, 22, -15, 15, 0, 52, -25, -4, -12, -6, -38, 27, 12, -37, 9, -33, 14, 1, -4, 16, -7, 12, 68, 55, 15, -9, -62, 5, 27, -11, -4, -34, 35, -23, -23, 35, -26, 44, 76, +-29, 35, -58, -17, -8, 5, -4, -13, 10, -19, 9, 6, -24, 29, 20, -53, -2, 94, 74, -2, 18, -20, 29, -23, 1, 18, 16, -5, -15, 8, 3, 58, -45, 28, -35, 42, -6, 1, 8, 8, -44, -20, 5, -15, -19, 37, -29, -14, -52, -31, -44, -26, -12, -41, 10, -35, 14, -26, 40, -39, -2, 14, 8, -14, -21, 50, 53, -29, -36, -13, 37, -33, -11, -46, 1, -48, -38, -51, -40, -12, -10, +65, -33, 10, -7, -11, -5, 18, -28, 14, -1, -37, -15, 16, 55, -13, 52, 32, 48, -21, 19, 19, 4, 67, 12, -28, -7, -24, 4, -28, -27, -10, -27, 68, 4, 16, -2, -17, -37, -11, -47, -21, 15, -6, -10, -47, 15, 6, 20, -8, 13, 19, -10, 6, 16, 41, -45, -6, 39, -38, 16, -27, -28, -22, -11, 85, -16, -11, -22, 30, -14, -22, -22, -39, 23, -35, -26, -2, -22, -44, 30, 57, +-24, -28, -17, 8, 67, 16, -10, 9, 42, 22, -8, -20, -15, -41, -32, 100, -27, 24, -9, -9, -41, -19, -41, -35, 24, 6, -42, -34, -12, -42, -9, -8, 4, -6, 7, -1, 18, 48, -40, 2, -12, -54, 15, -22, -43, -6, -38, 94, -49, 2, -15, 2, -40, -10, 12, -13, 38, 1, -30, -9, -23, -45, 2, -6, 7, -21, 16, 26, 12, 5, -6, 0, -6, -40, 22, -13, -33, 12, 8, 105, 64, +-51, 40, -35, -25, -3, -2, -56, 8, -16, 31, 22, 27, -41, -17, 74, -5, 40, -28, -44, 99, 88, -43, -23, 18, -30, 48, -24, -31, 33, -40, 111, -66, 13, 20, -12, -45, 28, 10, -11, 9, -86, -45, 0, 23, -53, -16, 87, 51, 21, -10, 14, 26, -17, -34, -16, -10, -40, 53, -57, -57, -93, 1, 101, -18, 16, 32, -16, -48, -19, 7, -25, 33, 55, -14, 3, -10, -46, -12, -16, 29, -2, +42, 33, 18, -17, 18, -11, -15, -51, 35, -42, -20, -10, -24, 31, 43, 4, 27, 1, 3, 18, -38, -26, -7, -32, 12, -4, -32, -4, 18, 37, -2, 6, -3, -20, -29, 27, -58, -28, -3, -11, -21, -8, -35, -15, -70, -34, -7, -23, 22, -26, -14, 31, 52, -25, -17, -81, -35, 15, 24, -36, 1, 83, -14, 4, 40, -30, -19, -59, -44, -8, 6, -29, -27, -9, -18, 40, -14, 22, 19, -32, 35, +-69, -17, 18, 51, 3, 38, -59, -12, -27, -6, 9, -22, 90, -13, -26, -16, -5, 24, -54, -65, -7, 3, 0, -59, 4, -38, 18, -9, -12, 37, 6, 18, -29, -22, -28, -53, -13, -7, 0, -5, -70, 59, -42, -13, 42, -22, 14, -31, -47, -23, -24, 29, -16, -5, -76, -8, 36, -77, -19, -14, -49, 9, -31, 21, -6, 29, 25, -17, 4, -90, -41, 18, -2, 78, -86, 7, 26, 6, -20, -75, -18, +-46, -77, 23, -19, -10, -33, -9, 14, -109, 27, -27, -12, 51, -27, 53, 52, 29, 87, -19, 26, 28, 37, 18, 18, -57, -21, 66, -31, 41, -29, 24, 70, -30, -7, 69, -27, 1, -43, 61, 4, -82, -28, 13, -48, 25, 46, -27, -17, -14, -32, -1, 14, 7, -2, -38, -21, -27, -38, 30, 19, 1, 19, 52, -51, -1, -26, 8, -46, -20, 6, 3, 10, 43, -13, 25, 14, -30, 25, 39, 71, 20, +81, -38, -51, -12, -15, -45, -32, 31, 1, 26, -2, 16, 26, 13, -2, -23, -15, -8, 46, -21, -22, -31, 48, -8, -21, -33, -40, -34, -4, 107, -7, -37, -12, -7, -49, -18, -4, -61, -58, 24, 12, -16, -21, 27, 44, 21, 2, 0, -9, -26, 5, 10, -20, -38, 41, -92, -1, 2, 14, -3, 4, -2, 22, -20, -17, -10, -27, 5, -8, -33, -6, -24, -22, -19, -9, -13, 54, -16, -22, -5, 18, +-9, -13, -35, -38, 40, -1, -5, 20, 8, 58, 38, -28, 2, -17, 34, -3, 10, -34, 19, 48, -42, -26, -29, -36, -14, -9, -11, 39, -7, -34, 33, 20, 35, 10, -19, 4, 31, -14, -16, 47, -2, 24, -7, 11, 4, 16, -1, 4, 12, -37, -14, 14, -20, 6, -39, -16, -13, -5, -4, 60, -20, -23, -20, 22, 5, -37, -51, -3, 33, -12, -38, 21, 45, 16, 24, 16, -7, -49, -19, 8, -17, +-15, -13, 42, -33, -23, 32, 2, -23, 12, -19, 20, 6, -7, -28, -8, -4, -15, -11, -67, 9, -18, -23, 9, -10, -58, 14, 55, 14, -54, -18, -67, -16, -84, 9, -30, -56, -62, 25, -73, -105, 8, -33, 59, 65, -11, 44, -35, -33, 38, -58, 47, -31, -28, 92, -60, -16, 42, 62, -7, -1, -5, 25, -22, -15, -50, 44, 8, -30, -26, 45, -32, -22, 1, 0, 111, -2, 13, 26, -45, -21, -36, +1, -5, -50, -12, -3, -41, 21, 12, 30, -1, 32, -20, -6, 10, -22, -33, -7, 42, -38, -3, 12, -21, -59, -25, 7, 59, -25, -15, -19, -2, -29, -37, -15, -51, 5, 6, -19, -24, -1, -23, 124, 20, 58, 8, 23, -1, 61, 8, 17, 50, -2, -45, 12, 27, -21, 11, -28, -22, 9, 7, 19, -10, -19, -5, 40, -55, 0, -8, -71, 41, 1, 2, 21, 24, -17, -7, -2, 4, 10, -37, 26, +-8, -23, -16, 13, -15, 45, -18, 27, 14, -2, -27, 17, -18, -63, 23, -50, 3, -38, -6, 2, -30, -38, 48, 65, 33, -29, -37, -3, -13, 15, -13, -2, -2, 21, -12, 3, -24, -6, -48, 46, -57, 12, -29, 53, -50, -5, 87, 26, 32, -18, 18, -24, 17, -47, 83, -13, 27, 35, 2, -16, 11, 72, -64, -43, -30, 52, -29, -79, -20, 64, -11, 24, 2, 37, -7, -42, 1, 57, 51, 64, 7, +9, 56, 7, -23, -25, -11, -37, 4, -7, 10, -19, -5, 57, -43, -6, 10, -1, -12, -50, -21, 54, 3, -2, -20, 72, -2, -1, -101, 38, 61, -19, -7, 36, 63, 43, -19, -11, -37, -64, 26, -5, -40, -20, 20, -22, -53, -7, 100, 58, -14, -24, 19, 24, -28, 61, -81, 17, 19, -27, -33, -69, -25, -5, -18, -27, -4, -32, -15, 40, 61, 33, 9, -56, 7, 20, -31, 0, -25, 11, 2, 17, +12, 22, -30, -33, -13, -27, -4, -26, -8, -2, 37, -18, -10, -2, -2, 18, 2, -12, -38, -11, -4, 38, 79, -4, -11, -35, 36, -21, 42, -30, -11, 40, -4, -16, 17, -16, -23, -14, 0, 25, 11, 0, 29, -7, 18, 1, -44, 32, -23, 18, 44, 28, -1, 127, -40, 24, 4, -41, -17, 0, 13, 17, -14, -1, -14, -25, -4, 57, -57, 11, -3, -43, 68, 4, -16, -32, -34, 27, -23, 51, -54, +18, -27, -25, 15, 39, 6, -33, -57, 16, 18, 15, -9, -27, 9, 20, -14, 6, 47, 75, 1, -18, -17, 13, -8, -2, -3, -23, -34, 6, -18, -14, 0, 15, 127, -31, 33, 71, -17, -52, -23, -13, -21, 30, 33, -44, -1, -3, 2, 20, 0, 15, -32, 9, 30, -19, 44, 14, -9, -37, -37, 10, -28, -5, -27, 13, 100, 5, 23, 26, -10, -28, -47, 40, -14, -1, -9, -43, -27, -22, -11, -26, +16, 56, -15, -16, 20, -8, -37, 12, 54, -42, 2, 7, -13, -9, 41, 15, 127, 23, 34, 35, -22, 10, -44, 10, 7, 33, 27, 32, -5, 13, -1, -20, 31, 14, -12, 20, 11, -27, -34, -17, 13, -31, 16, 1, -12, -15, -8, 10, 74, 28, 9, 16, -72, 13, -40, -8, 24, -14, -27, -54, -35, -15, 23, -12, 12, -6, -27, 20, -3, -40, 1, -28, -35, -46, -48, 40, -29, 0, -33, -7, 26, +26, -16, 54, -13, 10, -44, -31, 88, -9, -29, 49, -48, 14, -20, 12, -9, 30, -18, 58, 20, -14, 15, -73, 14, 27, -5, 59, -40, 5, -12, 4, 87, 16, 12, -10, -15, 24, -22, -12, 19, 23, -1, 70, 54, 6, -5, -28, 7, 16, -19, 16, 19, -16, -52, -14, -13, -5, 7, 21, 6, -5, 0, 11, 75, 6, 4, 113, -8, -16, -12, -48, 21, 24, 10, -49, 12, -31, 74, -27, 7, -3, +-6, -66, 17, 14, 81, 2, 14, -24, 19, -6, 16, 112, 37, -11, -32, 6, -5, -14, -17, 19, -13, -39, 51, -4, 50, -9, -25, 0, 24, 15, 14, -38, -8, -14, 12, 26, 17, 3, -29, -20, -9, -12, -22, -29, -19, 7, 9, 29, 7, 6, -1, -3, -66, -34, 63, -21, -24, 14, -33, 0, 23, -19, -12, -11, -21, 10, -10, 18, 27, -16, -8, 1, -16, -20, -4, 98, -9, 17, -17, -77, 56, +-25, 88, -8, -45, -38, -5, 33, -91, -78, -40, -21, 24, -20, 21, 16, -40, -42, -8, 40, 59, -33, 0, 28, -27, 56, -18, -5, 20, 6, -53, -2, 40, -30, -38, 10, 9, 7, -37, 45, 72, -80, -20, 42, 28, 7, -34, 20, -25, -71, -1, 50, 76, -14, 11, -19, -56, 87, 6, 44, -93, 29, -31, 32, 9, -24, 7, -17, -2, -31, 6, -1, 35, -1, -75, -10, 36, 57, 19, -22, 42, 0, +-38, -52, 93, 49, 55, -12, -30, 26, 19, 77, -53, -28, -42, -10, -22, 32, -26, -33, -30, 56, 8, -19, -3, -10, 17, -23, -54, 17, -37, 51, 96, 20, 9, -21, -38, -25, -8, 15, -12, -9, -7, -11, 127, 46, 31, -57, -7, -5, -4, -47, 36, 62, -22, -59, -20, -6, 61, -3, 27, 38, -34, 20, 19, 34, 40, 89, 63, -10, 67, 27, -5, 3, 8, -42, 15, 99, 3, 39, -12, -69, 127, +-41, -31, 58, -4, 12, 85, -44, 10, -1, 21, 83, -21, -5, -14, -34, -15, -20, 8, -48, -53, -14, -10, -19, -35, 41, -20, 78, 38, -15, -15, 12, 44, -3, 50, 19, 3, 8, -11, 32, 0, -6, 19, 69, 25, -19, -21, 13, 7, -50, 12, 19, 8, -12, -7, -17, -33, -14, -19, 73, -28, -14, -23, 31, 7, -21, 28, -4, 39, -4, -27, 0, 5, -29, 1, 34, -27, -13, -24, -7, 17, -13, +18, 10, 14, -7, -3, -39, -11, -47, -11, 62, -9, -29, -3, 22, -48, 29, 27, -22, -10, 17, -37, 11, 47, -11, 44, 72, 34, -9, -14, -5, -15, 68, 15, 13, 23, -22, -31, -39, -50, -43, -34, 72, -51, -7, -10, 24, -17, -49, 31, -4, -3, 5, 2, 13, -18, -19, 11, 29, 18, -25, -1, -1, -9, 20, -11, -18, -40, 20, -14, -16, -32, -19, -9, 20, -15, -13, -60, 23, 122, -43, 47, +85, -70, -14, 87, -16, -13, 51, 7, 56, 3, 56, 17, 21, -19, -4, -37, -32, -84, -38, -59, 22, -23, 59, -24, 82, 29, -11, -20, 25, 79, -67, -5, 27, -28, -10, 23, 24, -32, -17, 30, 83, 4, -41, 13, 3, -34, -25, -21, -39, -42, 28, -13, 10, -8, 45, 8, 58, -13, 26, 3, 11, -24, -68, -24, 2, -5, -38, -2, 19, -12, -8, 56, 39, 24, -7, 19, -10, -37, -24, -30, -12, +-24, 21, -3, -29, -29, -7, 31, 43, -44, 9, 80, -10, 40, -34, -47, 8, 62, -17, -28, 65, 1, -57, 7, 39, 12, 1, -19, 5, 35, 67, -25, -14, -36, -66, -10, -15, -3, -23, -7, 110, 5, 20, 28, -18, 54, -7, 4, 21, 50, -30, -29, -23, 78, -16, -4, 69, -78, -42, 68, -3, 12, 20, -36, -17, 88, -23, -10, 48, -17, -38, -23, 6, 26, -3, -38, -24, 18, -14, 37, 21, 9, +95, 23, -26, 39, 69, 47, 22, -10, 14, 9, -40, 9, 4, 4, -11, 67, -30, -18, 76, -38, -3, 15, -12, 31, 34, 17, -24, -35, 23, 0, 37, -55, 3, 15, -17, 85, 4, 18, 46, -25, 14, -1, -24, 24, -49, -11, -17, 10, -13, 26, 48, -41, 11, 30, -12, 13, 65, 38, -36, -1, 37, -7, 54, -46, 3, -64, -60, 35, 15, -6, 52, -49, -30, -15, -18, 25, -10, -41, -67, -90, -46, +-1, -15, -15, 75, -56, 101, 15, 34, -20, -42, 10, -44, -75, -25, -46, -57, -23, -40, 28, 53, 76, 48, -28, -8, -93, -31, -13, -25, -45, -92, -17, -75, 13, 47, -18, -20, -35, 52, 30, 17, 7, -2, -21, 50, -22, 35, -44, -43, 26, 14, -24, 41, -1, 0, -34, -33, -13, 4, -25, 1, -10, -44, -33, 17, -16, -20, 38, 12, -41, -35, -34, -40, -8, 40, 35, -19, -14, -37, -14, -2, 14, +7, -28, 41, -25, 21, -27, -55, -31, -28, -32, 8, 4, 45, 20, 9, -3, 42, 33, -33, 20, 19, -20, 22, -38, 100, -50, -25, 28, 55, -5, 68, 47, -13, 6, 63, -15, 24, 0, -74, 90, -22, -48, -56, 57, -11, 39, -13, -53, 2, -44, -2, 0, 65, -43, -7, 23, 48, -18, 49, -4, 4, -14, -3, 3, 9, 4, -27, -35, 23, 46, -45, 25, -19, -38, -6, -11, 37, -8, -34, 27, 13, +-9, -4, -14, 30, 2, -37, 43, 52, -25, -6, -34, -2, -15, -26, 9, -7, -33, -50, -27, 46, 29, -30, 5, -33, -21, -2, -15, 50, -10, -31, 11, 25, -26, -7, -47, -13, -24, -17, 19, 86, -8, 47, -17, -22, 5, -16, 9, -2, 1, -15, -24, 35, 45, 7, 1, -10, -76, -23, -9, -9, -13, -59, -18, 18, -24, 18, 1, 32, -13, -3, 26, 127, 10, 31, 40, -8, -9, -12, 1, 15, -24, +-17, 8, 17, 35, -14, -2, -11, -22, 13, 6, 2, -18, -5, -13, 15, -11, 5, -20, -8, -9, -38, 12, 62, 5, -30, 16, 49, -68, -2, -2, -12, -61, 44, -31, 110, 57, -83, 6, 21, 0, 4, -2, 67, -1, -43, -71, 29, 10, 0, 27, 23, -85, -7, 56, 127, -54, 17, -29, 42, -28, -35, -31, -28, -20, 56, -67, 18, 79, -25, 41, -36, -69, 23, 22, 23, 7, -1, -12, 76, -33, -44, +-9, 9, -47, -14, 47, 127, -47, 57, 18, 3, -8, -38, -19, -23, 7, -24, -15, 26, 51, 3, -14, 4, -58, 8, 15, -17, 12, -24, -6, 56, 8, 3, -33, -16, -21, -52, 4, 32, 23, 6, -45, -2, -37, 81, -36, -7, 5, -21, 18, -39, 38, -26, 10, -34, -48, 50, 5, -7, 28, 14, -1, -2, -37, -23, -35, -8, -41, 8, -18, 54, -41, 16, 48, -28, 7, -28, 27, -33, -16, 4, -29, +39, 40, -25, 23, 3, 17, -24, 20, -11, -19, -11, -28, 56, -21, -21, 27, 23, -17, 11, 0, 49, -3, 27, -5, 57, 6, -20, -47, -28, -24, 23, 59, 84, 32, 21, -5, 21, 4, 6, -7, 17, -55, -2, -19, 53, -31, -26, 82, 12, -12, -14, -11, 49, 14, -7, 82, 23, -10, 35, 80, -37, 55, -50, 51, 16, 22, 13, -9, 38, 10, -33, -29, 56, 6, 10, -63, 15, 6, -50, 50, 2, +-64, 48, -4, 14, -14, -48, 7, 14, 6, 42, 121, -6, -2, 49, -15, 16, -31, -67, -3, -5, -15, 61, 10, 89, 41, 76, -67, 23, -8, -36, 75, 112, 4, 19, -83, 52, -30, 15, -1, 64, 1, 17, -20, -17, 37, 16, -52, 84, 19, -33, -53, -26, -35, 76, 12, 23, 72, 18, -82, 82, -31, 6, 118, 75, 33, -15, -13, -2, 21, -51, 23, -31, 4, -13, -5, -12, 39, 7, -3, -28, -8, +-41, -28, -33, -29, 17, -10, -43, 36, -42, 6, 29, 5, -26, -7, 75, -5, 0, -25, 18, -13, 12, -16, 3, 10, 4, -67, 9, -21, -40, -3, 12, -28, -38, 68, -61, 37, -19, -25, -43, -41, -78, 24, 55, -30, 8, 24, -16, 4, 29, -37, 1, 49, 7, -20, 41, 67, -3, -8, -5, -87, 6, -1, 51, -29, -26, 33, -43, 56, -38, -8, -46, -53, -27, -36, 52, -34, -3, -26, -31, 16, -8, +-35, -29, 7, -18, -7, 23, 11, 20, -15, 8, -39, -15, -5, -15, 20, -39, 51, -41, 70, -19, 15, -34, -36, -33, -17, -8, 5, 9, -3, 25, 18, 8, -7, -1, -38, -39, 0, 70, 42, 17, -28, -12, -42, 4, 3, 29, 46, -53, 60, -48, 109, -36, 4, -13, -45, -30, 12, -37, -12, 8, -70, -7, 28, 2, -36, -13, 11, -19, -9, 15, 67, 33, 9, -8, -48, 6, -12, -25, 62, -31, 62, +-30, 68, -25, 32, -1, -17, -44, -18, 9, -10, 13, -107, 24, -27, 54, -11, -8, 12, -6, 4, 32, 36, 13, -14, -10, -10, 21, 32, 15, 17, -25, 4, -17, 95, 0, 21, -5, -7, -20, -7, -21, -17, 37, -23, -11, -4, 31, -38, 29, 98, 2, 21, 10, -38, 8, 4, 3, -10, -2, -21, 10, -35, -67, 53, 9, -14, -28, 80, -21, 36, -31, 68, -16, 34, -38, 2, -19, -43, 58, -35, -16, +33, -25, 30, 27, 24, -26, -12, -2, -73, -25, -41, -14, -6, -33, 49, -27, 11, 10, 70, -25, 18, -19, 68, -4, 9, 21, -43, -6, 10, 42, -29, -3, 13, -22, -15, 35, 31, -4, -22, 56, -45, -11, 12, -20, 13, -48, 8, -4, 67, 7, 45, -48, 13, -29, 15, 8, 7, 2, 7, -10, -16, -29, -27, -59, 0, -10, 19, -29, 52, -7, -24, 47, -8, 47, -9, -10, -40, 4, 25, 9, -9, +-98, -37, 22, -18, -15, -28, 87, -39, 25, -7, -36, -49, 32, -24, 66, -2, 0, -35, 37, -7, -28, -17, -8, -48, 35, -31, 27, -54, -13, -13, -33, 11, -35, -17, 5, 25, -26, 5, 38, -41, -64, 2, -11, -25, -14, -28, -35, 8, 74, -47, -16, 22, 13, 12, -5, 10, -44, -45, 107, -38, -55, -5, -20, -13, -51, 21, 12, -6, 2, 7, 19, -13, -16, 1, 62, -47, 14, -13, -21, -12, 72, +18, 37, 38, 5, -20, 9, 10, -28, -47, 47, 4, -45, 18, -63, -42, 127, 36, -17, 7, -53, 0, -28, 13, -49, 3, -11, -10, 39, -16, -47, -59, 73, -2, -28, 49, 19, -17, 28, 11, 5, -40, 1, -61, -61, 20, -23, 18, 42, 22, -21, -39, -14, -44, 26, 47, -36, 76, -37, -12, 55, -40, -47, 13, 127, -28, -5, 84, 9, 23, -4, 8, -23, 30, -50, -7, 1, 4, -73, 20, -8, 1, +-17, 29, -81, -4, 3, 66, -25, 21, -21, 15, -19, 68, -33, -6, -22, -1, -13, -16, 16, -35, -2, 11, 5, -2, -29, -40, 7, 2, -18, 12, -20, -3, 2, -10, 7, 2, 6, -38, 24, 8, 75, -13, 10, 25, 54, 32, -48, 11, -33, 27, -31, 72, 62, -20, 0, 7, 4, -5, -11, 19, -50, -28, 3, -31, -33, -23, -14, -17, -33, 54, 39, 34, -35, -25, 15, -63, 103, -59, -7, 55, -34, +-29, -74, 53, 7, -16, 35, -23, 43, -44, -18, 41, 27, 14, -1, -9, 1, 18, -51, -7, -50, 7, 52, -13, -41, -20, 23, 28, 58, -20, 2, 9, -29, 37, -3, 7, 4, 25, -6, 29, 20, -9, 24, 26, -4, 8, 56, -11, 10, -21, -26, 8, -20, 12, -2, 8, -37, -25, 29, 9, 42, -12, -11, 31, -21, 19, -35, 7, 74, 48, -16, 47, 26, -9, 13, -2, 5, 10, 3, 49, -10, -7, +-16, 0, 1, -7, 26, 11, -44, -12, 3, 36, 3, -32, 7, 16, -33, 15, -1, -26, -6, -14, -18, 42, 20, 37, -20, 5, -13, 4, -23, 14, 92, -23, -17, -21, -2, 2, 16, -8, 5, -8, 7, 16, 9, -8, -28, 50, -37, -17, -22, -4, 26, 3, 3, 45, 39, 10, -26, 18, -14, -4, -8, 3, 7, -23, -9, -9, 31, -23, -26, -36, -14, -18, -29, -36, 114, -27, -40, 11, -49, 46, 9, +10, -70, 71, 25, -31, 26, -97, -41, -40, 1, -6, -5, 48, 95, 13, 19, 57, -38, -47, -49, 47, -30, -27, 26, -23, 56, -42, -30, 40, -64, 19, -42, -16, -18, 40, -5, -4, 49, -60, -48, 8, -43, -50, -24, -36, 28, -20, 25, -3, 32, -41, -37, -16, -11, -28, 20, -31, 36, -39, -42, 22, -64, 15, -12, -4, -25, 23, -6, 42, 26, -6, -5, 2, -24, -9, -15, -26, 39, -24, -18, -15, +81, -30, -28, -36, -30, -11, -16, 7, -5, 4, 1, 11, -29, 11, -45, 63, -29, 54, 33, -20, 16, 28, 17, -35, -24, -32, -22, -41, -29, 8, -39, -53, 127, 48, 16, 45, -41, 11, -45, 4, 107, -25, -22, -7, 33, 24, 7, 107, -61, -35, -15, 21, 8, -36, -10, -5, 4, -11, -65, -54, -35, -12, -7, -57, -70, 45, 44, 64, -41, 12, -2, 45, 65, 9, -29, -16, -53, 5, 30, -12, -17, +39, 94, -7, 11, -7, 6, -17, -14, 2, -13, -13, -4, 18, -24, -2, 120, -16, 34, -16, -26, -35, -22, 61, 112, -25, -6, -30, -25, -15, -32, 3, 57, 37, 18, 18, 21, -93, 29, 7, -33, -8, 17, -4, 65, 4, -52, -87, 38, 32, 26, -19, -22, 8, -16, 62, 86, -26, 8, -40, -3, 26, -19, 29, 116, -12, -13, -21, 43, -42, 32, -3, 10, 9, 71, -41, 99, -20, -17, -91, 44, 83, +25, 11, -49, 3, -3, 55, 100, 12, -42, 45, -34, -41, -12, 83, -84, -88, -25, -33, 20, -45, -35, 88, -29, 18, -81, -24, 54, -41, 65, 48, -30, 73, 58, -1, -21, 6, 39, -45, -24, 31, -15, 21, -17, 50, 4, -15, -13, 44, -14, -13, 83, 5, -16, -5, 3, -34, 37, 18, -31, -14, 28, 21, 67, 13, -28, -24, 17, -9, 50, 1, 6, -17, 127, 12, -12, -17, 47, 31, -8, -35, -2, +103, -44, -28, -47, -31, 25, -23, 23, -48, 108, 3, 11, 38, 33, 36, 41, -17, 5, 21, 9, -78, 39, -8, 67, -34, -2, 29, -15, -24, -17, 50, -18, -25, -79, -56, 31, 6, 20, -34, 59, -1, 6, 7, -25, -22, 38, 80, 25, -48, -57, 8, 15, 58, -10, -3, 123, 7, 11, 2, -1, 0, -26, -48, -41, 34, -2, 3, 9, 17, 20, -18, 22, -41, 27, 3, -23, -8, -38, 32, 16, 41, +-41, 1, 22, -8, 30, 7, 127, -15, -12, -9, 23, -24, -30, -37, 6, 21, -26, 8, 19, 27, -5, -4, 19, -10, -12, 2, -50, -46, -39, 107, -28, -12, -23, -8, 31, 87, 13, 47, 105, -10, 19, 22, 54, 24, -49, -55, -4, 42, -30, 59, 10, 29, 31, 0, 29, -55, 17, -25, -24, -34, -44, 15, 33, 68, -26, 9, 12, 40, 7, 5, 57, -18, -8, 10, -1, 17, -22, 21, 6, -7, 2, +-8, -10, 25, -12, 16, -31, -1, -9, -30, -3, 7, -4, 22, 29, -36, 15, -37, 0, -23, 32, -50, 127, 13, 44, -3, -62, -53, -7, 17, -71, 60, -56, -77, 59, 8, 55, -31, -37, -49, -2, 20, -27, 25, -25, 49, 1, 19, -63, -54, 41, -34, 61, 15, 123, -21, 33, -43, -53, -43, -67, 64, -34, -11, -50, -17, 0, 36, 0, -35, -14, -66, 44, 13, -29, -50, 23, 43, 42, 10, -55, -97, +6, 7, 4, -5, 65, 10, 11, -12, 16, 54, -6, 13, 13, 59, -6, -20, 5, 13, 15, 6, -29, -18, -5, -4, -19, -25, -40, -3, 41, -38, -3, -45, 17, -58, 10, -21, 13, -43, -30, 26, 2, -1, -2, 45, -2, -43, -62, -30, -45, 22, 18, -7, -13, 9, -28, -7, -39, 31, -24, 68, -7, -71, -38, 94, 42, -7, -25, -33, 41, -46, -9, -28, 10, 53, 9, 60, -19, 95, -55, 19, -2, +-23, -8, -51, 49, -5, 127, 31, -23, 17, 22, 89, 0, 20, -25, -47, -29, 5, -7, 47, 18, -41, -53, -25, -36, -25, -6, -3, -38, -22, -30, 20, -55, -33, 1, -56, 1, -49, 12, 12, -16, -18, 45, 127, -63, 18, 23, 4, 18, 9, -38, -14, 112, 21, -8, 22, -7, -71, -46, 30, -30, 15, -17, 72, -13, -32, -16, -56, -29, -14, -14, 23, -40, -35, 24, 9, -29, -8, 9, 26, 13, -18, +-55, -27, 84, 6, 38, -28, -35, -28, -26, 127, -46, -33, -29, -53, 25, -5, -2, -51, -15, -7, 115, -11, -60, -12, 39, 18, -62, -44, 113, 29, 36, -41, -35, 28, 73, 24, -2, 47, -33, -13, -9, 37, -11, 33, -39, -20, -11, 59, -32, -27, 29, 16, 63, 28, -82, 97, 18, 35, -33, -6, 76, -50, -6, 63, 39, 3, -56, -12, 34, 85, -15, -38, -52, -28, -37, 74, 18, 48, -26, 14, -45, +-13, 21, 6, -25, -8, -10, -17, -18, -31, -8, -36, -10, -44, 35, -62, 116, -6, 12, -23, 14, 59, 12, -23, -53, 9, 28, -17, 9, 25, 77, -38, 13, -26, 23, -6, -27, -30, -63, -50, -19, -38, 18, -31, -53, -46, 46, 127, 42, -10, 11, -9, 8, 106, 11, -55, -15, -4, -17, -38, 13, 52, 96, 8, -3, -46, 8, -35, -43, -42, -35, -62, -60, -57, -25, -25, -53, -27, 0, -74, 48, -35, +96, -18, -20, 91, 22, -33, -43, -49, 49, -30, 37, 33, 45, -16, 26, -37, 27, 8, -28, -29, -5, -48, -35, -20, 15, -28, -30, -11, 8, 90, 11, -14, -52, 14, -22, 127, -9, -23, -37, -18, -19, -6, 45, 11, 7, -1, -3, -46, 7, 12, 6, -43, -56, -42, -39, -17, -17, -12, -26, 7, 28, -15, 0, -49, -30, -11, -13, -2, 13, -6, -19, -2, 2, 3, 13, 36, 24, 3, -15, -18, -5, +-10, -17, -17, -40, -41, -17, 20, -2, -3, -39, 0, 5, 30, 18, 4, -18, -12, -30, 51, -17, 6, -37, 25, 17, 59, 6, 57, 43, -33, 7, -28, 24, -14, -15, -35, -7, -8, -24, 9, 14, -20, -12, -7, 5, 41, 4, 15, 26, -29, -26, 19, -26, 20, -29, 9, -4, 82, 13, 17, 26, -37, -2, -4, 26, -6, -15, -10, -9, 1, -13, -11, -27, -14, -11, -16, -9, -11, 33, 11, 3, 2, +-28, -18, -8, -3, -39, 15, -8, -29, 24, -29, 34, 33, -8, 8, 6, -23, -46, 17, -4, -21, 6, 3, 17, 9, -13, -40, -17, -46, 48, -2, 22, -14, 59, -24, 16, 14, -6, -23, 17, -19, 23, 63, 6, 36, 19, 56, -18, -4, -19, -9, -8, -28, 28, 50, -23, 28, -22, 7, -38, 27, 34, -10, 9, -47, -23, -9, -7, -29, 0, 26, 5, -16, 58, -38, 90, -12, 25, 8, 30, -22, -47, +25, -68, -46, -62, 50, -59, 40, -25, -52, -22, -16, 57, 4, 29, -21, 20, -15, -27, -46, 3, -1, -13, -23, 40, 67, -11, 17, 35, 0, 25, -24, -18, 8, -23, -43, 6, 18, -12, 43, -27, -47, -20, -17, 37, -10, -25, -24, 41, -11, -33, -33, -17, 3, -23, -3, 35, 122, 12, 21, 2, 32, 29, -25, -10, -9, -4, -14, 4, 8, -37, 26, -34, -26, -9, 40, 127, -27, 98, -27, 38, -17, +-14, -5, -8, 8, 20, -19, 20, -37, -37, 38, -10, -36, 42, 17, -37, -20, -36, -50, 24, 24, -47, 13, -68, -8, -23, -60, 87, -28, 29, -14, 60, -29, -48, -37, -34, -21, 19, -31, 24, 26, -13, 40, 24, -2, 39, -18, -19, 6, -52, -21, 61, -17, -20, 5, -13, -19, -23, 74, 57, -3, -55, -24, 41, 5, -18, -11, -8, -13, -52, 30, -2, 15, -22, 44, -47, 78, 31, 5, -41, 4, -14, +5, -9, 0, -34, 0, -4, -19, -22, -39, 11, -9, -18, -17, 11, -33, 12, 52, 5, 10, 5, -22, -33, -7, 1, -6, 14, -17, 60, -41, 33, -12, -25, 28, 16, 65, 15, -29, -14, -35, -11, -42, -23, 21, -18, -2, -15, -34, 63, -24, 11, -10, -87, -20, 5, -3, 65, 38, 8, 52, -8, -19, 36, 4, 20, 124, 43, 70, 45, -9, 57, -33, -27, -12, -25, -2, -19, 14, -11, -26, 35, 31, +-48, -27, 1, 18, -25, 11, 38, 11, 77, 39, -3, 15, 37, 13, -30, 65, -25, 32, 48, 15, 2, -24, -14, -56, 9, -28, 4, -6, 10, -32, 127, 12, -25, 11, -29, -14, -36, -43, -19, 31, -97, -15, -31, 11, 27, -17, 11, 59, 0, 54, 67, -55, 21, -50, -31, -7, -3, -23, 8, 4, 18, -39, -5, -24, -17, 27, -28, -1, -34, -27, 0, 10, 37, -19, -12, -12, 37, -42, -11, 49, -9, +78, 16, -7, -13, -22, -15, 7, 32, -54, -17, 3, -21, -7, -25, 9, -17, -11, -3, 8, 6, 13, 18, 29, -6, 31, 20, -16, 11, -16, -9, 16, -44, 0, 28, 17, 23, -24, -8, -25, -4, -53, 3, -10, 2, -39, 3, 78, 2, 2, 37, -16, -26, -1, -5, 14, 8, 50, 55, -28, 5, -20, -7, 110, -25, 28, -17, 6, -36, -23, -35, -29, -35, -8, -13, 0, -18, -19, 43, 47, -7, -39, +23, -7, -20, 6, -10, -10, 41, 17, 37, -19, 16, -36, -25, 67, 7, 25, -9, 22, -68, 3, -23, 8, 21, 16, 45, -38, 29, 5, 24, -41, 11, 9, -40, -38, -22, -21, 79, 6, -10, 47, 1, -3, -39, -4, 16, 12, -29, 44, 38, -7, 60, -24, -24, -24, 30, -14, 36, -29, -16, -21, 28, 17, 7, -9, -12, 8, -17, -5, 6, 45, -70, -34, 55, -39, 3, -21, -37, -5, 12, -12, 34, +14, 0, -9, -20, 6, -51, -17, -16, 30, -54, -11, 41, -23, 29, -2, -56, -83, -10, -19, 47, 2, -4, 4, 32, 22, -65, -53, -22, 106, -48, 46, 16, -13, -5, -28, -18, 18, 15, -7, 20, -18, 8, -23, 0, 39, -2, -6, -25, -18, -21, 39, -20, 40, -36, -22, 54, -24, -9, -17, -1, -28, -55, 1, -8, -15, -8, 17, 2, -14, -15, -7, -5, 0, 19, -15, 47, 80, -5, -39, 12, -7, +-14, 4, 1, 11, -33, -19, 38, -33, -17, -26, -19, -8, -50, 2, 6, 5, -25, 8, 9, 26, 0, -39, 56, -2, -11, 2, 4, -6, 15, -26, -15, -54, -41, -17, -14, 15, 35, -53, 66, -20, -44, 15, -27, -65, -30, 9, -9, 34, 38, -3, -7, -27, 49, 30, 60, -17, 15, -9, 13, 15, -8, -5, -34, -14, -36, 1, -6, 39, 24, -57, 54, 13, 4, -29, -28, -22, -2, -5, -2, -31, 3, +-20, -20, -21, 27, 46, -28, -18, 2, -20, -5, 14, -6, -24, -17, -37, -18, -35, 58, 9, -7, 21, 39, -23, 21, -11, -16, -3, -45, 6, -22, -15, 27, -17, -28, 50, -5, 40, -24, 1, -19, 2, -3, -10, 5, 6, -11, -6, -16, 22, -11, -13, -15, 38, 36, -33, -17, -33, 19, -21, 18, 40, -56, 19, -6, -39, -21, 111, 29, 45, -42, 2, -8, -45, 49, -2, -6, 0, -31, 17, -8, 14, +-36, -14, -24, -49, -69, -25, 10, 12, -26, -6, 17, -43, -38, 51, -14, -29, -31, 122, 6, 52, -27, -2, 2, -54, 26, -33, -23, -6, -25, 15, 31, -10, -55, -26, -23, 22, 24, 52, 40, -24, -11, -28, 0, -18, -41, 73, -16, -38, 3, 101, 10, 68, -42, -4, -13, 22, 3, 14, -20, -10, 3, 56, -66, 2, -37, -15, -31, -16, -3, 2, 0, 5, 14, -45, 44, 2, -55, 58, 14, 0, -7, +24, -16, 32, -29, 22, 2, 15, 44, 11, -5, -7, -23, -16, -10, 42, -16, -12, -18, 23, -19, -41, -5, -28, 3, -13, 18, 6, -21, 29, -16, -33, -18, -7, -10, 21, -3, 6, -6, -18, 34, -22, 28, -43, 7, -25, -2, 33, -27, -5, -37, -19, 6, -15, 9, 3, -19, 13, -41, -15, -25, -88, -8, -22, -40, -3, -3, 40, -9, 17, -1, 4, -23, 19, 31, -25, 3, 5, -13, -34, -28, -5, +-51, -6, -43, -12, 7, -23, -15, 53, 2, 0, -32, 22, -9, -1, 7, 9, 5, 49, -18, 7, 10, 20, -20, 20, 21, -41, 1, -12, -15, -20, -4, -26, -43, -3, -30, -9, 21, -24, 9, 11, 1, -19, -25, 27, -36, -17, 0, 120, 26, 45, -2, 43, 3, 4, 64, -53, -16, -4, 65, -22, -48, 63, -29, -42, -38, -10, -7, 43, 9, -12, -38, -49, 13, -11, -31, 71, -13, -30, -11, 64, 20, +27, -34, -6, 13, -4, -7, 28, 29, -46, 78, -2, -4, -9, 54, -18, -49, -49, 1, 0, 59, -17, 15, -5, 4, 27, -18, -57, 11, 32, -62, 27, -8, 40, -28, 85, -57, 18, 21, -66, -55, -24, 110, -30, 18, 5, -51, -10, -72, -26, 21, -32, 8, 60, 31, -21, 10, -19, -45, 3, -10, -54, -8, 36, 11, 39, 4, -5, 24, -13, -5, -36, -12, -36, 101, -27, 16, 10, -12, -6, 1, 24, +-14, -28, 37, 36, 4, -3, -11, -21, 82, -51, -2, -31, -51, 72, 12, 53, -26, 14, -8, 1, 40, -53, 34, -20, 96, -33, -18, -21, 25, -24, -28, -37, -45, -29, 24, -18, 3, -4, 0, -9, -35, 8, 18, -62, -13, 64, 16, 8, -13, 63, -32, -35, -8, 21, -67, -20, 54, -55, 21, -33, -46, -21, -18, -4, -38, 17, 119, 100, -3, -41, -15, 35, 60, -53, -12, -72, 18, 65, 50, 38, -17, +-1, 19, 11, 2, 9, 2, -37, 59, -21, -16, -34, -29, -7, -17, 15, -49, 3, 11, 73, -30, -5, 3, -29, 29, 51, -7, -48, 18, 49, 11, -7, -26, 32, -5, -5, -2, -16, -1, -18, 2, -9, -13, 5, 42, -20, -22, -21, -6, -11, 46, -32, 1, -15, 29, -8, -2, 55, 1, -44, -18, -11, 50, -22, 5, 60, 21, -15, -3, 35, -9, -45, -37, 3, -38, -30, 38, 120, 75, -9, -23, -39, +-58, 5, 11, -46, -5, 4, 20, 127, 53, -25, -5, -50, 40, -36, 28, -15, 53, -16, -14, -60, 47, 1, -17, 43, -21, -28, 28, 98, 127, -4, 19, -44, -57, -7, -5, 8, -8, 3, 54, 126, 99, -14, -5, -27, 8, -30, 14, 28, 79, -33, -3, -38, 12, -46, -21, 42, -45, -31, 22, 122, 119, 46, -44, -46, -55, 3, 11, -52, -29, -32, 15, 81, 100, -31, -12, -34, 45, 89, 48, -36, 64, +-19, -2, -39, 37, -20, -44, 32, -17, -19, -3, 92, 84, -5, -8, -41, -24, -41, 1, -49, 0, -28, 29, 87, 80, -27, 25, 12, 36, 17, 36, 58, 25, 3, -11, -23, 18, -25, -4, 7, 12, 15, 30, 83, 55, 22, -24, -15, -36, 11, 1, -13, -7, -10, 39, 77, 75, 15, -6, 14, 58, -12, -3, 6, 78, 10, -19, 17, -31, 61, 4, 19, 4, -11, 78, 83, -20, 15, -10, -7, -2, 13, +-9, -8, 7, 29, 38, 127, 20, 1, -10, 28, 16, -28, 21, 0, 27, -20, -19, 26, 14, 5, -14, 5, 13, -6, 21, 41, 127, -10, -24, -29, 16, -11, -11, 26, 2, -19, 35, 115, 15, -14, -18, 1, 17, -26, 23, 31, 27, -9, 40, 3, -5, -29, -4, -26, -13, 7, 28, 96, 105, 5, -18, 7, 69, -23, 13, 2, 1, -1, 19, 127, 57, -8, 30, -4, 10, -25, -19, -29, 61, 2, -3, +3, 9, 29, 4, -33, -68, -37, 26, 127, 80, -11, 36, -23, -47, 10, -48, -5, 20, -15, 46, 117, 51, 19, -31, 21, 66, 3, -15, 2, 50, 18, 9, 32, -15, 32, -5, -13, -21, -4, 53, 116, 83, -17, -30, -34, 13, 66, -41, -6, 5, 30, -6, 127, 71, -9, 38, -13, 16, -47, -2, -18, 78, -13, -12, 69, 33, -27, 3, 18, -65, -17, 48, 127, 62, 58, -32, 5, -56, -16, -30, -41, +30, -45, 20, 71, 53, -53, 5, 30, 18, 12, -7, -26, 20, 26, 2, 44, 34, 9, -10, 17, 11, -11, 35, 127, 69, 4, -16, -42, 1, 33, -57, -8, 2, -9, 43, 112, 68, -27, -30, 5, 34, -42, 4, -4, 30, 0, 27, 51, 49, 31, -18, -25, -9, -38, 48, 117, 106, 0, -25, 9, 64, 42, -46, -29, -3, 18, 58, 127, 75, -16, 11, 18, 122, -29, -24, -10, 22, 6, -18, 30, 30, +58, 6, -2, -28, -25, 11, 117, 97, -21, -57, -46, -67, 5, -48, -13, 52, 55, 20, 124, 13, 29, 26, -9, 64, 12, -11, -59, 35, 3, 3, -10, 9, 22, -5, 8, -10, -22, 5, 127, 64, 16, -26, -36, -29, 17, -27, -29, 9, 31, 44, 110, 59, 35, 26, -4, 53, -25, -31, -19, 55, -9, -10, 10, -25, -6, -8, -56, -20, -47, 28, 108, 49, 30, 53, -47, -5, 18, -26, -19, -14, 27, +27, 127, 57, 15, 18, -6, 39, -26, 21, 35, 33, -6, -55, -20, -5, 29, 29, 16, -29, -41, 40, -21, -4, 8, 5, 16, -30, -16, -35, -12, -9, 45, 5, -48, -43, 12, 4, 20, -49, -47, -13, -70, 35, -12, -1, 9, -25, -23, -20, -44, -9, 50, -18, 65, -19, -65, 46, -22, -77, -17, -12, -8, 24, -13, -15, -45, -14, -32, 11, -15, 7, -30, 9, -32, 65, -10, -64, -4, -27, 0, -12, +-2, -36, -20, -30, 35, 30, -32, 20, 5, -55, -7, -12, -3, -23, -42, 37, -12, -33, -20, 10, 42, -35, -15, 39, -52, 46, -33, 107, -34, -21, 9, -7, -35, -40, -35, 28, 17, -40, -6, 17, -14, -42, 18, -42, -5, -3, -15, -17, -59, -50, 18, -4, -4, 5, -32, 28, -25, 33, -36, 101, -27, -8, 18, 40, -24, -51, -6, 57, 64, 0, -28, -23, -4, -3, -30, -31, -7, 3, 3, -9, -34, +8, 6, 30, -4, -18, -5, 7, 0, 27, 1, 22, -9, 1, 16, 15, -14, -25, 12, 33, -10, -3, -10, -21, -29, 6, -23, 48, 29, 52, 24, 34, -42, -11, 29, -25, 6, -19, 2, 1, -9, 3, -24, -44, 33, 16, -5, -10, 13, -21, -45, 28, -28, 7, -4, -4, 53, 9, -5, -4, -24, -15, 24, -23, 0, -12, -9, 7, 83, 14, -1, 1, 21, 10, -25, -16, 43, -22, 9, 12, 7, -18, +-18, -32, -44, 26, -31, 4, 36, -20, -11, -8, -31, -29, -35, -24, -16, -22, -17, 18, -12, 5, -5, 15, -15, 14, -27, -27, 23, -3, -23, -7, 26, 0, -38, -41, -21, -28, -26, -24, 11, -16, -9, 49, -25, -12, 2, -23, -59, 0, 55, 60, -12, -44, -11, 14, -37, 8, -41, 41, -15, -4, 2, 27, 66, -7, -20, -16, -30, 27, -54, 28, -38, 1, -10, 43, -25, -31, -10, 9, -51, -6, 29, +35, 31, 15, -32, 52, -10, 46, -42, 38, 39, -20, 48, -17, -40, -16, 41, 12, 86, 112, 44, 58, -18, 12, -79, -11, -41, 40, -13, -41, 10, -21, -25, 18, -18, -18, -3, -1, -52, 46, -11, -36, 26, 2, 43, -16, 25, -11, -32, -2, -30, 25, -4, 37, -34, -33, -12, 20, -24, -45, -10, -2, -12, -29, -18, 10, 33, 8, -15, 7, 2, 41, -7, -36, 22, -1, -13, -26, 46, -37, -23, -8, +-12, 41, -44, 8, -8, -7, -28, -13, -19, -66, -41, -12, -33, -47, 11, 9, 37, -5, -27, -11, -19, 16, -56, -51, -19, -37, -28, 3, 48, 1, 25, -27, -29, -10, -22, 2, -46, -6, -1, -31, -34, -6, -27, -36, -40, 13, 35, 7, -14, 21, -9, -2, -15, 27, -9, -11, 75, -23, -12, -2, -51, -8, 3, 18, 31, -4, -17, -1, -46, -45, -7, 14, -9, 4, -8, -1, -1, -2, 30, 23, -11, +-4, -7, 2, 13, 6, -33, 9, 24, 5, -20, 7, 35, -16, -27, -23, -4, 21, -20, 18, -5, -41, -36, 0, -2, -4, 45, 6, -25, -17, 27, -8, -39, -16, 17, 0, -1, -50, -27, -13, -42, -31, 30, 41, -23, 29, -23, -32, -3, 123, 27, 16, -13, -19, 32, -42, 41, -12, 24, -33, -9, 103, -11, 12, -33, 35, 16, -35, 83, -19, -37, -32, 6, 8, 41, 37, -26, -20, -62, -9, -46, -55, +74, -2, -45, -23, 65, 13, 3, -100, 48, -23, 23, -44, 38, 1, -19, 15, 13, -35, 21, -44, -31, -23, -22, -28, 50, -36, -18, -17, -10, -7, -49, -38, 44, 5, -18, -21, 81, -18, 17, -60, 71, 0, -16, 11, -8, 47, -18, 40, -11, -32, 78, -19, -46, -33, -2, 9, 60, -22, -22, -1, -20, -10, -34, -8, 70, -4, -40, -18, 58, 4, 4, -45, 67, -7, -11, -3, 9, 55, 2, -19, -15, +-23, 11, -8, -36, -8, -19, -4, 9, 28, 13, 44, -21, -33, -54, -44, 41, 8, 9, -12, 1, -14, 9, -6, 49, 5, 6, 67, -22, 39, -10, -34, -10, -11, 17, -24, -8, -47, 19, -18, 52, -5, 0, -25, -20, -46, 24, -44, -3, -4, -19, -8, -1, -5, 11, -16, -21, -28, -10, 25, -17, -39, -31, 40, -17, -4, -16, 36, 24, -19, 1, -44, -12, 14, -24, 14, -4, 3, 16, -44, 48, -2, +-13, -19, 5, 60, 71, -22, 9, -49, 21, 3, 0, -17, -11, 24, 14, 26, -36, -22, 39, 4, -26, -32, 17, -9, -13, 3, -6, 11, -10, 46, 29, 12, 6, -3, 6, 15, 10, -8, 34, -31, 17, -27, -12, -23, 0, -49, -20, 15, -12, -35, 42, -32, 5, 15, 45, -19, -33, -24, -28, -9, -12, -25, 45, 4, -16, -12, 36, -36, -17, -3, 35, -35, 22, -37, 15, 68, -32, -2, -5, 15, -12, +-29, 0, -24, -9, -27, 66, 34, -15, -21, -36, -21, -14, 47, 6, -1, -31, -17, 37, -28, -4, 17, 11, -30, 17, 39, 5, 4, -9, -53, 0, -15, -30, -14, 26, -53, 28, -5, 19, -27, -9, -23, -57, 47, 66, -55, 35, -7, -32, -3, 43, -36, 13, -6, 57, -16, 18, -59, 9, -9, -33, -36, -26, -21, 20, -10, -27, -13, -28, 15, 12, 21, -51, 12, -7, -13, -59, -11, -19, 29, -13, -15, +18, -45, -33, 22, 35, -5, 2, 105, 3, -39, -20, -6, -21, 25, 4, -12, -18, -7, 14, 23, 32, -1, -42, 29, -17, -18, -29, -84, 10, 4, -18, -11, 48, -37, -12, 14, 75, -18, 7, -12, 16, 33, -27, 33, 34, 9, 16, 29, 16, -34, 16, -41, 17, 21, -83, -9, -53, -42, 37, -1, -25, 27, -41, 11, 20, 11, 41, 70, 3, -36, 22, 2, -38, 44, -19, -47, -12, -11, -30, -25, 16, +0, -39, 1, 71, 18, -35, -23, -29, -39, -43, -17, -50, 25, -40, -5, 1, -33, 1, 68, 47, -6, -8, 55, 2, -14, -27, -22, -11, -19, -12, -10, -12, 23, -15, 13, 42, 17, -21, 8, -13, -25, -52, -10, -20, -8, -33, -11, 4, -39, 14, 12, 0, -27, -18, 72, -23, 1, 59, -2, -22, 33, -11, -33, -3, -40, -6, -2, 7, 1, -19, 14, -28, -24, 70, -31, 30, -11, -26, -49, 42, -10, +29, -43, -21, -1, -3, -11, -56, -38, 81, -8, -14, 43, 2, -24, 25, -23, 13, 55, 44, 0, -26, 82, 3, -24, 34, -47, 33, -33, 10, 35, -30, 8, 2, -34, -2, -53, -4, -27, -14, -7, 26, -12, -48, 16, -8, -12, 9, -10, -25, 33, 70, -12, 3, 22, 10, -9, 60, -17, 17, -11, -16, 61, 21, 16, -14, -40, 9, -38, -18, -2, -36, -46, 45, -18, -1, -9, 0, -20, 67, -14, 47, +-18, 34, -13, -31, 32, -17, -12, 34, -55, 24, -16, -21, 20, 26, -27, 43, -18, 0, -19, -15, -26, -27, -29, 33, 1, -20, 16, 26, -40, 5, -34, 30, -11, 17, -21, -27, 37, -34, -35, 32, 19, 19, 3, -34, -22, 32, 10, 31, 4, -26, -35, 16, -11, -34, -10, 26, 4, -27, -7, -43, -9, 10, 3, -4, -5, 39, -34, -25, -34, 14, 14, -26, 63, -11, -46, 12, -4, -9, -7, 29, -23, +-23, -15, 29, -29, -20, 20, 12, -4, -41, -17, -35, 39, -21, -7, -47, -8, 18, -10, 18, 11, -35, -19, -3, -21, 37, -3, -13, -10, 26, 15, -33, 21, 23, 17, -37, -25, -18, 24, 24, -4, -25, -34, 18, -11, -19, -18, -26, -24, 17, -23, -4, 14, -18, -3, -20, -2, 13, -8, -4, -34, -15, 3, -9, 14, 14, 16, -24, -20, 6, -22, 78, -7, -12, 2, 11, -26, 5, -27, -54, 46, 59, +-17, -18, -6, -29, 8, -64, -27, 4, -85, -25, -23, 26, -20, -19, 8, -34, 3, -41, -15, 15, -13, 65, -19, 0, -6, 14, -29, -5, -10, -20, 9, -11, -34, 3, -6, -40, 7, -8, -30, 21, -15, -23, -21, 5, -6, 3, -14, -21, 9, -29, -2, -22, -44, 36, -4, -8, -19, -12, -6, -17, -64, 46, -1, 106, -11, -28, 42, -20, 11, 7, -23, -3, 25, -31, 49, 28, -37, 41, 55, -69, 1, +-34, -28, 16, -29, 36, -14, 24, -39, -19, -15, 40, -29, 7, 34, -21, 17, -5, 19, -27, -8, 31, -6, 2, -40, 2, 15, 21, 3, -9, 4, -51, 29, -18, 16, -7, -16, 10, 6, 11, -43, 17, -7, -11, -28, 4, 49, 25, -2, -4, 21, -2, -14, 18, 17, -8, 5, -27, -12, -25, -34, -24, -10, -43, -18, -36, -16, 15, -43, 56, -27, 12, 15, 31, 36, -8, 5, -9, -4, -32, -22, 20, +12, -34, -73, -40, -64, 17, -2, -13, -17, -22, 109, -47, 24, -15, -38, -28, -36, -9, -17, 55, -9, 3, -1, -41, -27, -16, -34, -42, 34, -41, 21, 15, 26, 4, -10, 7, -19, -13, -16, -2, 37, -35, 7, 8, -39, -12, 11, -48, -14, -20, -8, 69, -15, -32, 4, -1, -28, -5, -10, -35, 35, 31, -16, -19, -9, -25, -7, -17, -4, -1, -18, -28, -28, 12, 14, -24, -36, -1, -3, 11, -5, +8, -29, -36, -21, -25, -15, -23, 21, -1, -11, 6, -11, -66, 9, 19, 39, 46, -22, 83, 1, -27, 16, 3, -6, -6, -6, 17, 22, -3, 16, -29, -3, 15, 8, -18, 7, 46, 49, -5, -5, -20, 11, -47, -36, -12, -11, 23, 33, -55, -51, 28, 14, -45, 43, 20, -2, 19, -23, 79, -31, -1, -12, -16, 4, 17, 55, -11, -16, 9, 9, -8, 1, -5, -24, -16, -15, -14, -1, -30, 67, -63, +-20, -19, 8, -21, -10, -38, -23, -17, -4, 40, 31, -23, 19, -40, 21, 20, 34, -5, -3, 1, 27, -32, -21, -1, 8, -15, 13, 66, 17, -17, 41, -62, -53, 52, 5, -20, 40, -2, 10, 5, -31, 79, -34, 0, 20, -14, -25, 34, -22, -55, 4, -30, 10, -23, -3, -17, -10, 4, 0, 10, 25, 0, -19, -14, -9, 40, -16, -37, -8, -15, -16, -26, -7, 9, 4, -9, -2, -30, 8, -7, 24, +-27, 17, 76, 14, 19, -3, -3, -30, 3, 3, -7, -27, -14, 96, -28, -24, -8, 49, 0, -17, -7, -35, -2, 18, -21, 5, 16, 25, -14, 5, -15, 17, -7, -3, -38, -13, -13, 39, 25, 17, -26, -10, 7, -25, -41, 55, 2, -13, 24, -28, -31, 0, 8, -5, -4, -9, 16, 2, 4, 26, -19, 3, 30, 70, -30, -48, 7, -18, -23, 35, 28, 11, -31, -14, -20, -1, -14, 72, -24, -28, 27, +-14, -10, -3, 11, -1, 12, -7, -30, -26, -17, 34, -21, -6, 12, 37, 9, -24, 79, -3, -24, -15, -20, 24, -39, 12, -26, -12, -5, 70, 3, -48, 20, 25, -48, 11, 20, -68, 17, 1, 5, 4, 30, -1, -3, 0, 40, 56, -64, -40, 13, -26, 15, 28, 0, -16, 0, 39, 2, 7, -8, 87, -12, 3, -9, -1, -36, -17, -35, -19, -24, -29, 0, 32, -12, -42, -8, -4, 50, 88, -49, -63, +98, -47, -47, -18, -25, -40, -97, 14, -25, 7, 23, 95, -1, 5, -31, 2, -7, -20, 22, -44, 23, -28, -12, -5, 1, -14, -51, 9, -68, 66, -34, -41, 1, -24, -11, -27, -11, -32, -13, 23, -25, 21, 1, 63, -54, -32, -20, 4, -37, 7, -5, -13, -26, -23, 21, 18, -36, -26, -21, 12, 17, 114, 9, -22, 0, -29, -27, -14, -17, -5, -33, 19, -31, 14, -14, 89, 7, -15, -41, 14, -25, +-19, -12, 9, 11, 8, -8, -20, 9, 6, -25, 26, -10, 3, 77, -45, -67, 0, -12, 35, 87, 11, -3, 45, 1, -54, -14, 46, -20, 0, -56, 1, -27, 31, -13, 33, 20, -9, 36, 3, -7, -62, -18, 18, 20, 38, -17, -14, -5, -19, -18, 4, 35, -7, -24, 29, 17, 31, 44, 69, -60, -31, 7, -22, -58, 60, -5, -8, -13, -19, 7, 39, -33, -30, -16, 33, -23, 2, -27, -18, -9, -13, +-10, 3, -20, -31, -1, -6, -13, 11, -14, 57, 43, -2, 50, 40, -25, 25, -10, -23, -7, 12, -7, 59, 26, -12, -33, 15, 1, -5, 40, 42, 10, 32, 12, -11, 11, -1, 26, -15, 12, 3, -13, 6, -43, -21, 8, 1, 31, 4, 60, 18, 57, -22, 68, 3, -4, 15, 31, 127, 63, -13, -19, 28, -4, -13, 34, -32, 3, 29, 9, 13, -7, -23, -35, 28, 14, -24, -14, 2, 20, -8, -9, +42, 6, 18, 46, 28, -17, -19, -30, 127, -1, 8, -8, -12, -4, 21, -20, 26, 6, 6, -11, 52, 17, 1, -37, 15, 26, -72, -19, 0, -57, -37, -7, 3, -23, 9, -45, 13, 22, 11, 5, 103, -49, -16, -19, -39, 1, 74, 34, 10, -6, -37, 22, 41, 9, -19, -21, 1, -14, -1, -4, -31, 7, -11, 11, 27, 10, 33, -35, -30, 16, -1, 12, 126, -18, -4, 54, -13, 20, -28, 49, -7, +16, -4, 36, 127, 0, 22, -53, -15, 27, -14, -12, -29, -22, -17, -12, -33, -15, 4, 14, -32, 10, 1, -1, 61, -2, -22, 42, -8, 41, -41, 43, 10, -13, -15, 40, 116, -8, 38, -58, -23, 1, -4, -25, -18, -3, -40, -4, 25, -10, 17, 3, -22, 19, 8, -13, 73, -28, 36, 27, -27, -4, -42, 36, -12, 4, 23, 24, 127, -9, 21, -32, 4, 77, -22, -23, 12, -4, 0, -33, -16, -19, +11, -1, -22, -12, 35, 2, 26, -29, -35, 6, -1, 15, 31, 6, 10, -16, -22, -10, 88, -23, 9, -1, 10, 55, -11, -8, -2, -19, -12, 8, -14, -20, 3, -27, -8, 17, 20, 30, 68, -52, -9, -1, 13, 8, 49, 9, -11, -24, -9, -16, 6, -26, 44, -24, 14, -2, -9, -6, 10, -13, -22, -28, 0, 18, 5, 41, -16, -37, 29, -55, 127, -58, 9, -50, 46, -12, 14, -4, 27, 117, 64, +-66, 14, 39, 35, 39, -51, -12, -40, 1, -9, 46, 1, 35, -35, 50, -14, 61, -93, -25, -13, -11, 10, 13, -40, 65, 36, -76, -33, -24, -5, 59, 44, 17, 9, -17, -32, 17, -53, 29, -1, -22, 5, 51, 28, 15, -4, 40, -4, -21, -25, -10, 15, 18, -56, -7, -31, -8, 53, -44, -63, -74, -4, 47, 10, -59, 58, 53, -51, 37, -54, 23, 0, -18, 31, 93, 81, 20, -10, 92, -1, 19, +-24, 25, -21, -45, -22, -14, -65, 15, 0, 3, -27, -44, -10, 35, 59, -56, 5, -59, -80, 42, -68, 49, 20, -13, -32, -14, 55, -16, -5, 20, 59, 7, -16, 31, 9, 25, -36, -25, 11, 28, 50, -42, 101, -5, 46, 89, -22, -4, -45, -34, 9, 40, 2, 44, 6, -8, -36, -49, 11, -15, -17, 0, -15, 12, -21, -31, 30, -32, -36, -20, 14, 14, 31, 10, 40, -12, 4, 32, 4, -11, -1, +-2, 2, 18, 30, 25, -14, -9, -13, -4, -13, 8, -27, 29, -3, -20, 18, -6, -2, 1, -12, -6, 4, 17, 30, -7, 39, -31, 68, -8, 28, -22, -13, -18, 73, -17, -25, 52, -19, 30, -9, 20, 23, 23, -38, 12, -5, -18, -11, 25, -9, 4, -42, -5, -8, -46, -27, -29, -17, 70, -32, 24, 42, 26, -8, -9, 46, 78, 14, -3, -37, 0, 40, -18, 5, 0, -21, -15, 33, -13, 7, -27, +18, -12, -21, -37, -16, -22, 4, 11, 54, -19, 10, -14, 36, 79, 2, 2, 45, 88, -2, 41, 19, -13, 18, 16, 15, 18, -11, -14, -35, 3, -30, 9, 6, -10, 2, -4, 1, -21, 75, -18, 17, -25, 26, -40, -31, 29, 24, 25, 19, 32, 8, 14, -29, -7, -2, -29, -32, -26, -7, 42, 2, 50, 26, 89, -5, -31, 34, -42, 10, -1, -10, -18, 14, 30, 38, -34, -24, 48, 15, 21, 3, +7, 27, 4, -14, -15, -6, -27, -7, 10, 6, 34, -2, 8, -18, 5, -11, -34, -6, -31, 9, -26, 12, 0, 24, 16, -4, 1, 26, 22, 9, -9, -3, 18, -17, 6, 16, -12, -50, -28, -20, 18, 6, 1, 13, -28, -25, -30, -41, -20, -3, -14, 38, -20, -5, -50, 33, 3, -11, -12, 22, -27, -6, 1, -7, 12, -31, 9, -21, -14, 3, -34, -29, 49, -42, 1, 5, -1, -21, 22, -38, -14, +-37, -9, 11, -23, -11, -14, -46, 33, 4, 10, 68, 36, 13, 5, 18, 6, -9, 22, 32, -3, -21, 2, -10, -3, 5, 14, 12, -2, 4, -61, -21, -4, 4, 5, -16, -5, 0, -26, 31, 52, 37, -15, -59, -22, 27, -6, 9, 13, 21, 0, -11, -8, -8, -51, -53, 41, 2, 9, -27, -2, -18, -15, -39, -32, 17, -30, -4, 23, -44, 13, 70, -10, 31, -13, 23, 44, -19, 11, -7, 69, 9, +21, -25, -35, 5, 21, 6, 61, -19, 8, -7, 11, -5, -18, -10, 17, -18, -2, -51, -69, -15, -32, -4, 29, -11, 45, 111, 121, 14, 127, 15, 6, -15, -21, 24, 4, 16, 2, 2, -23, 39, 2, 8, -42, 60, 13, -23, 37, 8, -26, -12, -18, -12, -6, 90, 35, -17, 55, 70, 70, 6, 126, 101, -4, 27, 25, 83, -7, -21, -26, 29, -38, -30, -4, -2, -62, -34, -17, 10, 38, -53, 27, +-45, -4, 7, 30, 48, -47, -19, 37, -19, 39, 77, 127, 32, -42, -24, 27, -2, -5, -52, -43, 10, -29, -18, -11, 9, -35, 13, -5, -42, 35, 96, -10, 16, 0, 14, -10, 14, 11, -5, 11, 35, -39, 93, 94, 44, -17, -30, -27, 46, -8, -48, 10, 12, -39, -12, -27, -20, -79, -14, -36, 22, 60, 40, -6, -45, -21, 31, -7, -37, 48, 4, -33, -12, 29, 5, 42, -24, -13, -11, 10, -25, +-16, -46, 8, 17, 18, 25, -18, 26, -38, -14, -29, -18, -37, 26, -42, -15, -13, 3, -35, -15, -10, -2, -5, 22, 40, 20, 5, 5, -18, -10, -11, -3, 7, -23, -3, 18, -17, 11, -7, 13, -3, -16, 14, 7, 11, 32, 6, -26, -42, 31, -39, 7, 0, -1, 10, -28, 57, 11, 14, -9, -45, -24, -5, 12, 29, -33, 6, 14, -15, -11, -37, -39, -36, -36, 20, -14, -45, 88, -5, -17, -29, +-5, -52, -64, -19, -11, 10, -6, 7, -20, -28, -48, -7, 15, 25, 55, 19, 9, -28, 74, 7, 8, 92, 7, -33, 17, -18, -30, -20, -26, 5, -31, -21, 16, -3, -14, 6, -18, -15, -25, -37, 14, -61, -49, -37, 1, -20, 88, -2, 48, -20, 9, 12, 1, 21, 28, -23, 16, 4, 37, 9, -5, 15, -26, -5, -28, -28, -71, -12, 0, -53, 6, -48, -12, -2, -16, -26, -21, -39, 49, -13, -9, +-6, 53, 19, 15, 82, -24, 27, 46, 41, 16, 103, 31, -17, -5, 4, -7, -27, -21, -33, 19, -31, -20, -47, -9, 6, 17, -36, -56, 31, -70, -12, -9, -40, 55, -10, 24, 123, -34, -10, 31, 26, -37, 87, 21, 4, -15, -1, -20, -4, 8, -5, 26, -20, 49, 23, -25, 18, -11, -14, -7, -24, -45, -8, 0, -2, 10, -19, 28, 90, -13, -2, 0, 44, -12, 14, -8, -8, -22, -1, -4, -26, +-8, 21, 11, -31, 90, -3, -10, -12, 25, -14, -44, -41, 45, 8, 1, 66, 19, 9, 5, 97, -26, 1, 10, 8, 59, 74, -15, -4, -1, -16, 12, -12, 29, -11, 34, 4, 47, 13, -15, -14, -16, -32, -4, -43, -34, -32, 22, -21, -60, -21, 35, 81, -23, -32, -21, 31, 86, -23, 4, -17, -7, -4, -2, -21, -50, 0, -14, -53, 23, -7, -34, 1, -21, -3, -8, -4, -9, -5, -23, 11, 6, +2, 12, 85, -1, 40, 39, 40, 1, 94, 3, -23, -61, -38, -40, -16, 12, 21, -29, 18, -5, -28, -28, -23, -45, -23, 22, -34, 6, 8, 45, -7, -2, 13, 33, 71, 16, 4, -2, 19, 45, 30, -23, -8, -48, 1, -33, 95, 18, -18, -27, 58, 38, -53, -71, -9, -34, -21, -23, -11, -17, -42, -69, -13, -10, 1, -16, 19, 24, 45, -61, 6, -26, 27, -15, -36, -6, -57, -21, 86, 36, -34, +-6, 3, -30, 19, -15, -11, 7, 13, -49, 29, -55, -31, -22, -38, 1, -26, -21, 60, 55, -56, -16, -16, -4, -1, -7, -22, -45, 5, -42, 49, 13, -12, -58, 8, -5, -19, -21, -23, -34, -35, 7, 7, -27, 28, 10, 26, -38, -14, -16, -45, 81, 1, -45, 15, -60, 21, -46, -17, 7, 17, 3, 102, 38, 2, -65, 8, 25, -47, -14, -13, -2, -27, 36, 35, -54, -1, -11, 46, -36, -30, -62, +-17, 7, -48, -16, -20, -34, 31, -2, 21, -16, 32, 8, 55, -22, -30, 41, -1, -5, 31, -11, -21, -21, -17, -15, 58, -33, -6, -8, -10, 58, -3, -50, -30, 56, 22, -12, -10, 43, -28, -28, 7, -38, 20, 2, 7, 6, -15, -12, -23, -21, 3, -14, -29, 17, -7, 10, -15, -19, -14, 18, -7, 27, -3, -32, -7, 70, 2, -24, -13, -35, -8, 6, -16, 22, 63, -10, 13, -4, -6, -11, -20, +21, -4, -5, 5, 47, -22, -11, 24, -16, -13, -9, 6, -11, -12, 17, -32, -5, -26, 2, -1, 50, -3, -11, -16, -36, -14, -2, 11, -11, 33, 45, 14, -4, 6, -14, 1, 43, -18, -17, 7, 10, -24, 26, -30, 7, -21, -15, 2, -3, 12, -17, -31, -27, -6, -17, 23, -27, -3, 57, 38, -17, 75, 30, 16, 2, -17, -22, -20, 114, -11, 34, 1, -8, -21, -18, 87, 54, -17, 29, 5, -34, +54, 0, -31, -10, 10, -20, -40, -32, -28, -55, 12, -38, 30, 26, -2, 16, 10, -24, 43, 71, -32, -2, 13, -13, 25, -12, 90, 6, -58, 7, -45, -15, 24, -12, -23, -16, 16, -51, -54, -28, 4, -13, -26, -14, 47, 15, -3, 35, -10, -2, -21, -52, -23, 14, 9, 5, 14, 12, 12, 20, -66, -30, -17, -37, -36, -7, -33, 4, -26, -23, 13, -22, -10, 19, -37, -35, -19, 60, 20, 36, -5, +-22, -14, -4, -27, 5, -11, -12, -11, 10, 0, -13, -77, 5, -1, 14, -22, -16, -8, -48, -3, -51, 2, -37, -27, -12, -18, -36, -38, 35, 23, 5, -10, 6, -20, 21, -4, -28, 16, -1, -13, -28, -24, 16, -70, 14, -23, 3, 71, -2, -21, 15, 2, -46, 3, 16, -27, -6, -29, -32, -55, 33, 11, 19, 12, -9, -6, -23, -37, 13, -25, -11, -16, -36, -26, -9, -52, -30, 2, 26, -18, -2, +-16, -47, -10, -39, 29, -23, -11, -33, -27, -26, 38, 31, 10, -13, 13, -20, -27, 2, -39, -27, 5, -8, 29, -12, -23, 89, -42, 5, -45, 2, 28, -34, -35, -3, 35, -39, -26, -29, 4, 1, -19, -43, 36, 46, 9, 50, -14, -13, 1, 100, 9, 52, -16, 5, 21, -37, 63, -26, -43, -10, -5, -15, 43, -8, 0, -12, -5, -29, -6, 14, 1, 30, 43, 29, -62, 81, -32, -15, 32, -54, 4, +-10, -75, -4, -39, -8, 11, 56, -30, -8, -51, -7, -37, -37, 106, 9, 106, -45, 9, 44, 30, -36, 4, 16, 12, 80, -46, -6, -26, -27, -34, 1, -51, -30, 41, -33, -77, -11, 0, 57, -29, 108, -17, 82, 79, -19, 84, -19, -17, -47, 11, 54, 9, 23, -6, 21, 28, 6, -70, -12, -15, 3, 39, -55, -12, 3, -38, -31, -3, -19, 44, 30, -38, 40, -39, 65, -17, -23, -20, -19, 6, 15, +63, 19, -49, 26, -28, 14, -30, -5, -50, 13, -71, -18, 3, -30, -12, 23, -40, -62, -37, -29, 24, 27, 9, 76, -17, 120, 4, -15, -11, -56, 9, -40, 25, 9, 21, -11, 5, 26, 57, 27, 5, 47, 20, -25, 64, -4, 35, -22, -17, 12, 30, -20, 57, 37, 44, -7, -43, 39, -10, -4, -18, -40, -36, -11, 127, 22, 17, 12, -4, -28, 44, 17, -36, -3, -25, -15, 29, 9, -1, -7, -16, +-18, -33, -16, 31, 0, 6, -6, -23, 4, 23, -18, 39, -17, 23, 19, 40, 10, -18, 28, -11, -2, 41, 26, -25, 38, -22, -15, 8, -16, 36, 12, -24, 7, -15, 4, 37, 61, 25, -31, -14, -21, 27, -46, -24, -8, 27, 36, 127, -11, 9, -45, -32, -2, 7, -13, -36, 37, 0, -25, -28, 13, -3, 16, -26, -13, -33, 26, 4, 27, -15, 100, 9, -26, -1, -14, 1, 11, -14, 38, -1, 12, +70, 22, -44, -4, -17, 16, -28, 1, -11, -6, -34, -36, -59, 27, 25, -34, -7, 19, -9, 21, -19, 115, -37, 74, 7, 15, -3, -26, 67, -8, 10, -27, 42, -3, -35, 4, -12, 30, -29, 24, 38, 63, -51, -17, -42, 47, 4, -4, -37, 42, 39, 2, 20, -33, 16, -26, 29, -45, -53, -37, 87, -25, 25, 28, -14, -30, -13, -6, -6, -28, -15, -6, 33, 127, -45, 10, 61, -4, 3, 10, -21, +56, -27, -1, -35, -32, 10, -49, 0, -28, 11, -37, 60, 5, 5, 64, 14, -34, 28, -14, -22, -5, 17, 4, 40, 43, 0, -26, 4, -6, -14, -18, -21, -7, 63, -20, -22, -14, 47, 25, 0, -17, -33, -10, 17, 38, 2, 105, -63, -38, -7, -21, -20, 14, -19, 0, 25, -4, -15, -25, 15, 24, -48, -36, -60, 22, -4, 30, -37, -6, 28, 17, 38, -11, 0, -29, 78, -18, -11, 60, -95, -29, +25, -23, -15, -2, 19, 43, 11, -21, -14, -23, -25, 18, -18, -13, -25, -10, -8, -41, -15, -14, 30, 3, 5, 20, 3, -25, -9, 2, 9, 3, -34, -28, 41, -16, -12, -1, -7, 4, 41, 57, -25, -6, -6, 16, -22, 1, -18, 45, 38, 16, -14, -12, 5, 8, 2, -21, -17, -18, 52, -13, 27, 55, -39, 46, -28, -7, -10, -11, -34, 5, -25, 23, -50, -12, 18, 27, -26, -70, -14, 20, -33, +42, -17, 85, -17, 46, 23, 2, 14, 2, 46, -15, -17, 42, 44, -51, 42, 5, -26, 47, 20, 12, -10, -24, -31, 38, 69, -25, 40, 7, -17, 18, -20, 3, -18, 16, -46, -5, 25, -4, -1, 79, -13, -15, 5, 31, 107, -27, 11, -29, -45, -29, 15, 28, -27, -65, -2, 9, 64, 25, 70, 21, -48, -36, -10, -13, -2, -3, -37, 17, -34, 7, 18, 107, 10, 3, -7, 18, -35, -53, -26, -14, +24, -16, 21, 38, -22, -1, 0, 23, 70, -35, 52, -7, -6, -55, -12, 14, -78, -2, 16, 19, 14, 23, -37, 46, 73, -15, -29, 10, -26, -8, -45, 67, -3, 11, 15, 113, -25, -21, -8, 26, 127, -53, -30, 21, -3, -4, 10, 3, -28, -14, 10, -53, 12, -43, -17, 66, -27, -20, 19, -8, 4, 21, -13, -23, -21, -1, 52, 55, -57, -23, -15, -1, 30, -9, 15, 4, -8, -7, -6, -18, 32, +26, 66, -29, -65, -9, 26, -10, -15, -6, -52, -36, -14, 47, 3, -5, -8, 17, -18, 21, -46, -12, -24, 9, 13, 27, 56, -17, -4, 51, -19, 16, -7, 36, -1, -33, -5, -10, 29, 14, 8, 22, -1, -20, -30, 25, 14, 16, -41, -8, -15, 35, -44, -4, 21, 0, -21, 5, 18, 15, 29, 0, -37, 55, -18, -32, 9, -32, -2, 26, -2, 26, 2, 31, -20, -24, 37, 2, 44, 1, 23, -33, +10, -24, -5, 8, 26, 14, -20, -29, 14, 17, -11, -7, 6, -30, -15, -24, 35, -3, -13, -15, -39, 81, 21, -32, -2, -68, 11, -3, -31, -6, -10, -9, -5, -18, -48, 2, 16, -77, -27, 36, -22, 6, 18, -16, 3, 25, -21, 6, 10, -4, -21, -26, 26, 32, -6, -35, 31, 101, 1, 15, -56, -6, -26, -9, -27, -26, -38, 46, 39, -45, -22, 26, -60, -22, 17, -8, 17, 17, -53, -2, -13, +-11, -50, 9, 47, 45, -29, -32, -64, 127, 26, 24, -46, 17, -16, -10, -34, -22, -8, 17, 30, -24, -38, 46, -22, -25, 12, 1, 16, -37, -25, 16, 9, 4, 10, 41, -37, 26, -4, 0, -19, 108, -2, 11, -29, -9, -20, 11, 4, 54, -25, 13, 51, -35, -11, -24, 18, 4, 10, -27, -17, -27, -42, -11, -6, -2, -4, 33, 9, 18, -2, -16, 24, 63, -2, 13, -7, 36, 53, -11, -1, 0, +-39, -7, 17, -20, -2, -15, 10, 8, -11, -20, 39, 15, -68, -9, -26, 34, 9, -19, -54, -10, 3, -12, -42, 46, -2, -11, -15, 72, -66, 27, -2, 10, -22, 0, -1, -27, -18, -22, 49, 11, 26, -12, -8, -9, -12, -11, 0, 2, -35, 61, 14, 41, -1, -12, 49, 54, 13, 3, -31, -13, 16, -6, -17, 0, -43, 46, 29, -31, -42, 3, -19, -36, -5, -16, 33, -38, -36, -8, -36, -11, -21, +8, 49, 56, -17, -20, -42, 127, -17, 18, -50, 55, 17, 4, -21, 8, -31, 24, 28, -34, -7, 23, -21, 20, 27, -41, 35, -47, -4, 2, -30, 18, -12, -34, -14, 34, 16, 2, -36, 43, 1, 6, -7, 32, -21, -15, 5, 66, 37, 7, 2, 40, 35, -52, 31, -22, 49, 56, -56, -33, 46, 3, 3, -51, 13, -8, -15, -13, -24, -26, 76, -63, -4, -67, -15, -32, 36, -52, 39, -14, 50, -24, +-25, 97, -34, -33, -26, 100, -27, -18, -48, -13, -25, 14, 19, -41, 27, -22, -25, -13, -3, -41, 7, -39, -38, -28, -61, 3, 25, 1, 82, 24, 36, 0, -37, -11, 0, 33, -3, -1, -26, 60, -18, -18, -45, 49, 34, -15, -45, 76, -22, -42, -30, -28, -27, 40, -25, -27, -23, 33, 3, -21, 4, -41, 52, 0, -38, 18, -24, 28, 105, -18, -4, 11, -27, -16, -3, 112, 33, -28, 1, 27, -38, +7, -42, -13, -47, -61, -45, -41, -26, 27, 35, -11, -10, -16, 14, 4, 3, -58, 68, 22, -26, -3, 6, -52, -1, -45, 76, 96, -23, -24, 13, -1, 22, -38, -45, -32, -13, 112, 16, -8, -19, 12, 26, 7, 36, 18, -13, -8, -14, -17, 15, 39, -10, -10, -13, -4, -21, 127, 51, 1, -10, 1, 8, 13, -18, -38, -11, -27, 9, 15, 16, -29, -13, -21, 23, -11, -21, 7, -16, -31, -29, -20, +86, 9, -5, -33, -26, -46, 10, -6, -5, 16, -44, -18, 29, -16, -13, 16, -14, 15, 0, 43, -14, 83, -10, -13, 15, 1, 26, 26, -10, -2, -41, -19, -28, -25, -13, 8, -40, -19, -20, 19, 40, -45, -15, 30, -4, -2, -40, -22, -7, -27, -27, 20, -19, -43, -15, 4, -55, 17, 1, -39, 26, 18, 43, -21, -27, 14, 25, 18, -28, -45, -16, 50, 27, -1, -30, -22, 12, -21, -40, -35, 6, +37, -20, -10, -30, -17, 30, 10, -37, 41, -40, -25, 35, 19, 63, -15, -40, -6, 67, 6, 10, 61, -50, 44, 45, -40, 15, -10, 73, 11, -56, 31, 9, -54, -10, 8, 6, 29, -18, -9, -17, 52, -71, -30, -27, 23, 0, -8, -3, 17, 44, 7, -18, 32, 7, -27, -15, -15, -1, -14, 67, 29, 7, 16, 9, 2, 5, -12, 20, -3, -9, 21, -8, 15, -43, -46, -13, -7, 18, -4, -16, -9, +16, 11, -15, 0, -17, -17, -11, 2, 20, 5, 80, 23, -20, -16, -4, -11, 33, 11, 30, -2, -22, 20, 17, 21, -25, -7, -1, -19, 36, -18, -28, -27, 55, -6, -40, 39, -27, -24, -34, -23, 33, 29, 86, 16, -9, -3, -4, -23, 12, -7, 26, 6, -51, 1, 11, 25, -19, -4, -22, 4, -7, 2, -36, -8, 45, 20, 21, -10, -30, -21, -50, 3, 42, -18, 97, -35, -3, -12, -41, 6, 38, +-42, 12, -1, 38, -7, -6, 34, -75, -31, 15, -11, 35, -26, -11, -17, 50, 9, -13, 77, 8, 5, 12, -22, 17, -44, 59, 21, -14, 3, -5, -11, -3, -33, 8, -16, -10, 15, 21, 22, -3, -31, -9, 51, 15, -25, -11, -10, 54, 2, -18, -4, 9, 20, 26, -16, -21, 54, 17, -24, -15, 24, -21, -23, -26, 2, 8, 0, 27, -19, -2, 34, 32, -35, -32, -21, 30, -23, -39, -7, -13, 19, +0, 44, 37, -28, 16, 7, 15, 47, 18, 59, -10, -28, -38, 37, 35, -24, -32, 29, -4, -15, 24, 33, 34, 60, -9, -37, 83, 33, -20, -14, 44, 29, 9, 76, -30, 1, -14, -45, -16, 18, -49, -24, -92, 2, -44, -4, -21, -48, -29, 16, 75, -28, -12, -43, 52, 13, 18, -14, 43, -19, -2, -51, -13, 82, 0, 23, -7, 25, 29, -43, -15, -24, -34, -14, -17, 74, -32, -49, 17, 3, -5, +-10, 2, -33, -31, -2, 12, -20, 9, -3, 16, -7, 20, 8, 34, 122, 5, -2, -42, 5, 23, -29, -54, -18, 16, 2, -15, 12, -26, 16, -8, -23, -9, -7, 40, 3, -26, 19, -22, -5, -31, -14, 2, -3, 9, 1, -16, 53, -50, 20, 26, -43, 5, -23, 18, -54, -20, 37, 21, -26, -26, 0, 13, -41, -7, -1, 18, -11, -17, -6, 6, 2, 10, -44, 63, 10, -1, 15, -9, 10, 18, 2, +12, 6, -15, -13, -16, 19, -15, 54, -13, -3, -16, -5, -8, 1, 23, -31, 50, -23, 2, 10, 38, -35, -1, -10, -2, -8, 34, 5, 32, 52, -20, 19, -11, -37, 26, -4, -29, 29, -31, 61, 46, -27, -31, 4, 1, -6, 19, -10, -22, -3, -7, 20, -13, 26, -3, -12, -30, -17, 6, -12, -1, 43, -47, -20, -42, 61, 13, 8, 27, -39, 31, -63, -16, -12, 19, 50, -14, -5, -38, -33, -1, +-4, 26, -11, -12, 67, -4, -12, -4, 0, -70, -13, -30, 25, 94, -33, 25, -25, 33, -30, 10, 6, -14, 9, -2, -28, 4, -13, -23, -6, 0, -23, -19, 17, 51, -7, -5, 100, 12, -13, 1, 68, -63, -12, -28, 40, 14, 49, -20, -80, 27, -49, -10, -21, -31, 108, -6, -49, -14, 21, -14, -5, 75, -12, -43, -9, 1, -9, -14, 4, 21, 18, 6, -18, 11, -15, 10, 27, -19, 64, -21, -52, +42, -5, -19, -18, 9, 88, 9, -15, -2, -36, -47, -7, -10, -22, -16, -28, -2, -15, -31, 24, 32, 57, -9, -2, 38, -7, -11, -9, 11, 65, 11, -6, 30, -11, 0, 9, -14, 107, 5, -32, 5, 52, -21, 15, -3, -22, 7, 17, -9, -28, -3, 24, 27, 46, -14, 4, -3, 3, -18, -12, -28, 70, 48, 34, 45, 1, 0, 0, 18, 127, -4, -40, -11, 68, -55, 15, -27, -5, -27, -36, 52, +4, 2, 26, 73, 56, -31, 31, -19, -6, -9, 12, -21, 58, -27, -6, 29, -5, 12, -3, -21, 116, -36, -36, -2, -5, -26, 17, -22, -34, -5, 0, 32, -4, 3, 24, 48, 34, -31, -2, -37, 0, -5, 25, 91, 78, 52, -12, -3, -39, 13, 3, 22, 82, 13, 0, -1, 11, -21, -5, -6, -48, 3, -10, 41, 12, -10, 33, 33, -16, -14, 15, -20, -9, -31, -5, 75, -42, 3, -1, 18, -20, +4, -14, -6, 30, -63, -29, 7, 19, 1, -28, -11, 20, -97, -32, 17, 15, -28, -17, -29, 13, -72, -16, 3, 49, -33, -64, 40, 35, -43, 2, -93, -14, -65, -48, -23, -89, 75, -58, 18, 2, 23, -6, -25, 10, -51, -19, -40, 3, -19, 7, 28, -7, -8, 26, -33, 15, 3, -39, -65, 16, -39, 49, 10, -9, -42, 28, 10, -63, -25, -45, 127, -33, 14, 23, 26, 14, -11, -33, 4, -15, 14, +11, -38, 30, -1, -7, 30, 60, 4, -5, 36, 31, 44, 34, -42, -10, -40, -2, -16, 4, -30, -41, 11, -40, -18, -23, -22, -13, 43, -11, 22, 27, -26, -21, -17, 4, -40, -9, 3, 39, -8, -22, 4, -31, -19, -9, -45, 30, -48, 46, -43, -20, -39, -7, -18, 14, -14, 3, -9, -5, -2, -55, -21, -2, -8, -1, -38, 10, -41, -30, 33, -45, -7, 56, -4, 18, 2, 20, -35, 21, -15, -25, +-25, 19, -26, 71, -13, -28, 27, 13, -37, -20, -26, -6, -15, -31, -9, -8, -45, 26, -21, 11, -23, -5, 38, -12, 32, -11, 24, -8, -7, -40, -30, 6, -27, 5, -4, -3, 14, 9, -9, -9, -31, 14, -19, -18, 6, -3, -14, -10, 14, -27, -22, 8, -8, 0, 8, 7, 6, -5, -32, 9, -39, 53, 16, -27, -23, -24, 23, 66, -6, 16, -15, 6, -6, -33, -11, -43, -9, 29, -47, 9, -33, +12, 70, 76, -13, 1, 105, -15, -22, -2, 4, 19, 14, -5, 21, -25, -11, -18, -34, -41, 2, -22, 27, 90, 41, 3, 22, 2, 1, -51, 5, -44, -14, -8, 17, -61, -8, 22, 13, -30, 54, 74, 21, -9, 14, -17, 22, 9, -19, -11, -34, -10, -10, 12, -39, 103, 3, 12, -4, 16, 12, 110, -6, -1, 0, -7, 3, -58, -25, -61, -24, -3, -14, -3, 14, -6, 14, 27, 30, -31, 22, 34, +78, 46, 13, 8, 9, 127, -3, 18, -21, 44, 11, 6, -29, 21, 26, -55, 54, -52, -4, -43, -16, 7, 33, 11, 0, -6, 23, 8, 22, -53, 43, 29, 48, 62, -13, -17, 21, 127, 45, -2, -10, 0, 12, -5, 13, -16, 29, -22, -12, -36, -21, -31, -1, 21, 60, -13, -19, 24, 8, -17, -18, -12, 26, 18, 46, 47, -2, 0, -15, 127, 11, 3, 18, -18, -7, -18, -1, 21, 13, -7, 43, +21, -4, -15, 44, -15, 24, 8, 18, 30, -20, 7, 35, -29, 4, 11, 0, 48, 6, -7, -6, 114, 8, 9, -21, 11, -14, 20, -35, -17, -8, -43, 42, -13, -20, -71, 31, -27, 40, -20, -3, 6, -26, 7, 13, 26, 8, 22, -15, 59, -19, 33, 23, 100, 8, -41, 13, 19, 3, 23, -2, -28, 20, 0, 8, -17, 22, -6, 51, -35, -25, -5, 6, 10, 8, 7, 30, 40, 19, -10, 58, 4, +3, 23, 43, 127, 60, -14, -25, 42, 17, 122, -7, -46, -8, 21, 33, -30, 4, -35, 93, -10, -34, -20, 2, -16, 37, -13, 20, -9, -3, 47, 26, -5, -7, -16, 14, 127, 43, -28, 6, 48, -2, 80, -2, -43, -6, 4, 17, -18, -6, -39, 78, -10, -5, -28, 30, -14, 39, 2, 16, 29, -12, 53, 33, -9, -4, -8, 3, 93, 48, 6, -2, 23, 32, -29, 7, -44, -21, -10, 25, -14, -18, +18, 36, -33, -29, 50, 17, -21, 19, 17, 11, 15, -10, -8, 58, -6, -1, 9, 45, 127, 76, 22, -24, 36, 24, -20, -9, -19, -3, -21, 49, 33, -13, 5, 68, -25, 0, 16, 18, 28, -6, 18, 22, 9, -33, 127, 1, 6, 44, -11, -10, 112, 87, -21, 7, 65, -3, 9, 15, -45, -17, -10, 30, -28, -6, 41, 71, 6, -29, 3, -3, -24, 17, -5, 38, -29, 10, -52, 36, -29, 7, -23, +73, 127, 50, -9, 3, 19, 19, 77, 17, -23, 14, -19, 29, -57, -6, 22, 93, -31, -21, 2, -6, -53, 25, -4, 7, 7, -17, 48, 41, 2, -1, 1, -38, 127, 32, -10, -23, 64, 19, 62, 21, -65, -4, -22, 30, -8, -11, 71, 83, -32, -23, -20, -8, -49, 28, 47, 14, 1, -4, 47, 44, -26, 23, 5, 63, 127, 26, -14, -19, 26, -14, 16, -9, 52, -3, -3, 57, 59, -4, -29, -9, +-36, -18, -25, -8, -33, 11, 14, 7, -24, 31, 12, -16, 2, 10, -16, 35, 82, 8, 17, -37, -3, -9, -20, 30, -3, 26, 89, -12, 4, -2, 7, 9, 19, -13, 73, -28, 11, 3, 15, -34, 26, 15, -24, 5, -7, -13, 18, -4, 40, -24, -17, -22, -50, 44, 42, -3, -5, -1, 50, 31, -5, -5, 34, 9, -1, 23, -20, -14, -16, -8, -6, -18, -1, 27, -24, 3, 30, -25, -1, -28, 47, +13, -4, -31, -18, 44, -6, -11, 2, 18, 20, 50, -10, 2, 46, 48, -13, -49, -9, -13, 24, 15, -10, -23, -13, -19, -42, -44, 19, -9, 4, 9, 22, -22, 3, -13, 16, -33, -13, 12, 11, -4, 24, 30, 4, -15, 49, -1, -22, -39, -22, -7, -11, -24, -30, 15, -20, -11, -33, 32, -40, -41, 13, 2, -13, -7, -13, -16, -10, -26, 18, 12, -20, 13, 20, 96, -12, -9, 38, 33, 1, 3, +-38, -12, 8, -1, -36, 65, -12, 19, -26, -12, -56, -31, 43, 5, -4, 7, 15, -9, -8, -25, 4, 14, -6, 21, 85, 1, -13, -15, 70, 5, 21, -44, 57, 7, -30, -21, -6, -29, -16, -10, -37, -12, -4, -45, 28, -28, 13, -11, 38, -43, 7, -22, 5, 35, -5, 20, 31, -5, -6, -7, 58, 2, 13, -18, -14, -2, -2, -25, -18, -23, 13, -9, -28, -5, -30, 18, 9, -17, 36, 2, -2, +-31, -19, -24, -23, 77, -29, 10, 51, 52, -15, -14, 75, 87, 13, -19, -17, -13, 57, -32, 3, -11, -25, 27, 1, -23, -18, -51, -15, 4, -23, -29, -5, -44, 4, -15, 7, 36, 4, 1, 2, 77, -27, -31, 40, 42, 5, -12, -13, 8, -6, -3, -7, 26, -1, -3, -11, -13, 6, -6, -2, -7, 48, 5, 0, -32, 0, -10, -19, 40, -9, -12, -12, 75, -24, -8, 45, 44, -28, 7, -3, -7, +-12, 22, -6, 12, 5, 5, -25, -9, -14, -20, -1, -2, 56, 25, 37, -39, -7, -35, -5, 57, -9, 41, 51, 111, -24, -9, 25, 43, -7, 11, 4, -13, 91, 12, -5, -9, -24, -31, -11, -34, -14, -12, 18, -4, -19, -6, -23, -26, -7, -36, -23, 81, 0, 51, 2, 97, -49, -3, 25, 46, -11, 11, 16, 6, 18, 46, 50, -25, 41, 30, -28, -28, -28, -9, -25, -10, 74, 0, 7, -34, -20, +-32, -15, 30, -12, 36, 93, 29, 3, -17, 5, 9, 0, -26, -40, -17, 66, 18, 11, 28, -55, 32, -26, -15, -7, -8, 11, -9, -24, -5, -10, -24, -19, -4, -12, 58, -22, -11, -42, 99, -30, -1, 6, 55, 8, 14, -16, -27, 2, 14, 5, 52, -45, 53, -19, -14, -8, -19, -30, -8, 21, 26, -3, -30, 1, -16, 7, 40, -43, 28, -3, 124, -8, 29, 35, -57, -9, -14, -27, -11, 17, 14, +11, 32, -31, 73, -5, -8, -3, 10, -20, -15, -12, -5, 16, -19, -27, -41, -12, 9, 2, 41, 68, 19, 47, 6, 24, 30, 8, 23, -30, -14, -11, -10, -18, -26, -28, -32, -51, -17, -2, 4, 25, -39, 20, -29, 76, -26, -12, -9, 1, -4, 50, -35, -28, 15, -31, 0, 46, 7, 53, -13, 13, -10, 4, -48, -13, -14, -6, 60, -30, -30, -13, 16, -3, 3, 4, 31, -1, -8, -13, -34, -59, +14, 3, -26, -15, 101, -4, -6, -23, -31, 12, 19, -18, 0, 10, -38, -43, 22, -4, -10, -4, 23, -4, -39, -18, -1, 25, -5, 34, -1, 4, -7, -4, -4, -5, 6, -52, -40, -29, -39, 2, -27, 18, -17, -24, -16, 2, -19, 71, -55, -20, 91, 26, -6, 21, -1, 12, 4, -19, 3, -7, -1, -10, 15, -15, -34, -4, 9, 7, 21, -9, -36, -16, 6, -23, 46, -46, -17, 27, 21, 69, -33, +-8, 73, 4, -4, -8, 27, -4, -17, 19, -5, -23, -5, -12, -3, -8, -12, -7, 36, -16, -9, 1, -43, -25, -20, -5, -6, -37, -5, 28, -14, 42, 8, 37, 20, 8, -5, 9, -8, -50, -5, 18, -15, 39, 3, -17, -4, 20, 5, 15, -7, 0, -4, -3, -35, -1, 10, 28, 17, -33, -9, -2, 5, -37, -32, 23, 8, -34, 25, -4, 3, 13, -15, 24, 15, 56, 29, 19, 29, -8, 11, 4, +-7, -11, -1, -13, -16, -19, -22, 48, 16, -23, -21, -26, 28, 26, -36, -10, 83, -65, 29, 21, 10, 37, 24, 7, -24, -12, -9, 40, -38, -60, 17, -17, -14, 5, -19, -29, -20, -34, -27, 31, 2, 90, -19, 23, -22, 122, 51, -14, 110, 1, -29, 18, 29, 6, 52, 8, 35, -21, -22, 4, -4, -26, -38, -8, -1, -20, 5, -17, -11, 16, 15, 42, -20, 12, -14, -13, -37, 86, -15, -22, 43, +63, -20, 31, 8, -29, 46, 2, 9, -11, -37, -20, -14, -34, 4, 0, -30, -30, -7, -18, -14, -16, 11, 19, -24, 30, 5, 30, -47, 44, -25, -23, 40, 38, -18, 48, -6, -29, 57, 19, -6, -13, -14, -5, -27, 9, 13, -12, 47, -4, 11, -20, -28, -7, -25, 12, 17, 106, 40, 38, 52, -33, 12, 9, -38, 13, -33, 22, 16, 12, 60, -26, 24, 1, -33, -1, -28, -40, -27, -10, -38, -55, +-2, -15, 6, -28, -8, 57, -9, 28, 28, 21, 15, -27, 38, 5, -22, -21, -38, 45, 6, -7, 41, -3, -7, 21, -5, -20, -26, -35, 10, 7, -43, -21, 46, -14, -19, -9, 7, 54, -7, 64, 58, 3, -18, 46, -2, -32, 67, -22, -24, 8, -8, -7, 55, -4, 33, -46, -13, -42, -4, -26, 15, 10, 4, 13, 23, -6, -15, -10, 6, -24, -55, 20, 9, 13, -45, 75, -25, -13, 66, 27, -47, +53, -39, -30, 47, 7, 27, 26, 11, -37, -23, -46, 2, 11, -10, -1, 42, -43, 19, -7, -12, -15, -6, 3, 11, 26, -64, 72, -15, -38, 45, 1, -20, 42, -17, -3, 86, 22, 7, 31, 18, 10, -16, -34, 39, 8, -35, -5, -6, -17, -48, 31, 6, 15, -26, -37, 22, -25, 90, 32, 41, -22, 64, -24, 33, -10, -12, 10, 59, -18, -8, -7, -21, -14, -39, -12, 71, 21, -3, -20, -20, -30, +-8, -44, -17, -20, -30, -7, -4, -24, -25, 57, -31, -7, 22, -3, 24, -32, -22, -12, -19, -1, 20, 2, 4, -35, -23, -39, 75, 74, 46, -40, -5, 5, -24, 68, 19, -15, -7, 12, -11, 10, -18, -1, 49, 39, -26, -12, 127, -3, -1, -8, -1, -32, 7, 58, -7, 70, -19, -14, 68, 39, 10, 24, 18, -6, -24, 61, 10, 5, 12, 24, 2, -2, 52, 1, 12, -17, -5, -26, -14, -27, -5, +-37, 5, -9, 30, -42, 21, 105, -21, -18, 97, 117, 35, 6, 37, -17, 5, 4, 13, -4, 54, 35, -10, 16, -19, -38, 35, 28, 9, 3, -32, -33, 0, -55, -4, -17, 15, -24, 34, 77, -6, -9, 55, 84, 46, 20, 12, -10, 12, 27, 23, 20, 42, 4, -17, -8, -8, -16, 5, 4, -42, -10, -14, -16, -23, -42, 31, -25, -10, -13, -20, 31, -9, -5, 63, 49, 15, 9, -29, -5, -4, -22, +-15, -28, 7, 2, -28, -24, -14, 1, 6, 7, 41, -9, -20, -40, -2, -22, -39, 1, 18, -9, 10, 1, -5, -22, 113, 67, 8, -7, 47, -12, 0, -54, -26, -16, 90, 18, 30, -6, -51, 4, 21, 31, -16, -25, -8, -39, -2, -40, -8, 9, -13, -52, -14, 29, -29, 8, 1, 55, -5, 48, -16, -17, 6, -48, 2, -7, -14, -20, -19, 54, -17, 79, -30, -38, -28, -28, 47, -13, -17, -16, -8, +-25, 41, -22, -7, 26, -47, -31, 85, 53, -7, -13, -17, -7, -11, -36, -13, -9, 26, -2, 5, -1, -21, 80, -39, -28, -37, 21, -3, -17, -25, -23, -1, -30, 6, -15, -2, 21, -25, -13, 89, 70, 17, 0, -5, -21, 5, -27, 1, -22, 7, 14, 7, -13, -19, 46, -31, 3, -14, 10, 2, -28, -2, -17, 8, -18, -4, -47, -3, 45, -2, -33, 34, 80, 5, -6, -9, -25, -14, -48, 4, -6, +2, 15, -2, 4, -29, 72, -7, -14, 0, 0, 73, 3, -8, -9, -9, -38, 20, -1, 4, 24, -24, -46, 70, 83, 4, 1, -3, -27, 12, -33, -26, 47, -21, 17, 17, -25, -17, 45, -10, 58, -20, -3, 0, -39, 13, 5, -23, -17, 36, -69, 3, 20, -31, -17, 52, 75, 9, -6, -12, -23, -3, -54, 8, -10, -35, -6, -9, 14, -13, 26, -42, -6, 6, 15, 10, -11, -24, -11, -30, -28, 53, +-41, -7, -29, -38, -48, 47, 68, 7, 20, -17, -5, -9, -41, -10, 16, -34, 6, 36, -1, -35, -46, -60, 3, -16, 25, -16, 1, -22, -8, -16, -30, -22, -37, -26, -7, -59, -18, -14, 114, 29, 31, 12, -2, 19, -71, 33, 0, -40, 10, 37, -11, -32, -24, -32, -34, 17, -31, -39, -28, -26, -45, -30, 2, 3, -18, -34, -36, -10, -9, 9, 17, 23, -11, 29, 6, 24, -58, 3, 2, 10, 24, +-33, -15, 4, 14, 38, -32, 74, -17, 3, -3, -16, 6, -11, 19, 73, -37, 2, -13, -11, 6, -10, 40, 17, -6, -17, -18, 8, -11, -19, -22, -9, -14, 26, 16, -22, -26, 5, 33, -27, -4, -11, 4, 44, -4, -4, 5, 11, 14, -8, -1, 14, 2, -34, 25, -17, -31, -28, 9, -14, -20, -50, -28, -41, -39, -36, 11, 40, 10, -9, 40, -1, 34, 11, 4, 77, -8, 11, -7, -2, 21, 0, +8, -1, -28, -24, 44, -1, 55, -23, 11, 7, 18, -32, 14, 25, 33, -30, 23, -11, 64, -29, 38, 6, -25, -10, -3, 20, 24, -23, -3, 36, 84, -12, -19, 9, 18, -11, 50, -10, 80, -42, -32, 13, 20, 10, -16, -54, 8, 49, -40, 4, 60, -10, -24, -8, 33, -9, 16, 23, -2, -2, -9, 53, 51, -19, -10, 18, -15, 0, 17, -21, 18, -37, -27, 12, 29, -2, 0, -20, 4, 13, 2, +-7, 73, 17, -32, -7, 8, 26, -13, 40, 13, -15, -3, 108, 5, 6, -18, -12, 31, -24, 13, -12, -40, -6, 23, 3, 0, -17, -1, -14, 2, 39, 29, -6, -1, -32, 4, -16, -16, -7, -9, 26, 25, -4, -21, 24, 30, -30, -29, -32, 18, -24, 54, -17, 52, -44, 4, 35, -12, -39, 24, -21, 21, 40, -51, 9, -45, -18, 6, -28, 2, -7, 23, 40, 7, 25, -7, 53, -45, -22, -13, 26, +-16, -22, 17, 3, -51, -10, -36, 0, 68, -21, -32, -48, 5, -36, 25, 1, 85, -12, -3, 29, -14, -4, 19, 8, 15, -40, 16, 102, -9, -30, -14, 5, 8, -10, 40, 30, 81, 22, -2, 10, -7, -12, -2, -25, -18, -6, -13, -6, 65, 12, -4, -23, -20, -20, -28, 61, -4, -8, -6, 36, -30, -8, -8, 1, -9, -14, 13, 41, 51, 17, -23, 3, 6, 0, -4, -39, -13, 16, 7, -28, 65, +2, 1, -1, -26, -21, -25, 41, -1, -16, 19, 64, -30, -3, 4, 2, -2, -31, 33, -23, -30, 0, -22, -13, 43, -36, -46, 9, -1, -18, -6, -16, 59, 14, 12, 5, -17, -15, 12, 72, 5, -15, 4, 50, -35, -36, -9, -16, -29, -39, 21, 23, 100, 3, -24, 15, 0, -73, -31, -34, -26, -16, -28, -7, 93, 10, -4, -1, -19, 27, -34, 46, -28, -29, 5, 25, -37, -6, 12, -15, -14, -44, +17, 13, -9, -31, 5, -19, 43, -41, -22, -22, -6, -6, -11, 8, 21, 17, -5, -12, -5, -36, -37, 16, 11, -7, 12, -11, -35, 1, -39, -30, -10, -11, 20, 41, 100, 19, -39, 21, 20, -42, -20, -28, -28, -24, 13, -6, 79, 28, -4, -7, -17, -10, -47, 88, 6, -57, 21, 73, 22, -3, -28, -13, -32, -8, 29, 30, 88, -28, -25, 26, 39, -42, -23, -39, 33, -42, -22, 6, 32, 71, -35, +-19, -40, -35, -29, 50, 20, -24, 49, 55, 4, -24, -29, -28, 23, -1, 37, -28, -16, -28, 62, -18, 0, -18, -9, -38, 11, -13, 1, 29, 13, -12, 3, -3, -17, -17, 14, 53, -17, -8, -38, 41, 14, 27, -8, -14, 5, 1, -23, -13, -3, 3, -30, 11, -43, 33, -13, -1, 12, -53, 0, 24, 10, -12, -1, -14, 116, -15, -5, -24, -42, 82, -20, -10, -11, 63, -20, 33, -7, -26, -28, -51, +-1, -15, -23, -55, -10, 11, 13, 10, -1, 21, 4, -40, 7, 7, 3, -22, -32, 1, 2, -7, -11, -19, -6, 51, 16, -41, -18, 0, -21, 9, -16, -44, -9, -34, -24, 6, 0, 6, 7, 6, -4, -19, -16, -22, -7, 15, -13, -10, -10, -11, 50, -2, -13, -13, 93, 21, 40, -33, 32, 38, -7, 0, -9, -21, -19, -51, -24, -21, -12, 29, 24, -3, -23, -11, -37, 16, -11, 7, -19, -5, -64, +-26, 73, -18, -8, -11, 83, 83, -10, -21, -5, 17, 12, 18, -14, -15, -18, -9, -26, 4, 7, 19, 5, 21, -19, 1, -6, -5, 14, -8, -10, -39, -35, 9, 75, -3, -32, 10, 37, 13, 20, 27, -21, 25, -12, -25, -14, -16, -27, 7, -45, -17, -24, 25, -1, -5, -14, -26, 32, -6, -8, 5, -1, 1, 36, 3, -34, -15, -21, 39, -26, 39, 23, -32, -35, 38, -23, 30, -20, -42, -17, -15, +-11, 18, -55, 2, -1, 3, 14, -18, 3, -44, -1, 10, -16, -13, -2, -17, -23, 25, -10, -10, 86, 19, -27, 43, -15, 1, 2, -15, -21, -18, -18, -14, 0, -15, -20, 46, 6, 17, -17, 0, -62, -29, -2, 25, 11, -20, 8, -16, 89, -17, -9, -28, -83, -2, 37, -6, 9, -1, -1, -14, -22, -19, -1, -5, -14, -27, -2, 4, -8, -14, 0, -31, 12, 5, 14, 20, -22, -21, -14, -23, 7, +-1, -15, -2, 127, 1, 44, -19, -2, -16, -2, -21, -2, -26, -6, 12, 7, -30, 17, 24, 2, -5, 0, -18, 0, -34, 23, 33, -7, -3, -19, -17, 12, -38, 2, -28, 127, 1, 7, 14, -23, -39, 4, -33, 0, -9, 23, 4, -1, -17, -27, 9, -5, -15, 10, -11, 17, -72, 15, 8, -14, -11, -1, -14, 67, -31, 6, -24, -67, 18, 6, -2, -5, -50, 12, -15, -22, -21, -30, 4, -27, -47, +54, -3, 11, -55, 18, -7, -4, -23, 20, -6, -10, -15, -31, 27, 14, -31, -17, -22, -58, 12, -6, 40, -24, -13, 12, -23, 28, -28, 12, -4, 35, -43, -34, 41, -27, -14, 8, 7, -35, -3, -6, 33, 5, -12, 11, -24, 40, -14, -12, 1, -26, 2, 72, -30, 22, 22, 19, -35, -37, -51, -13, 14, 48, -24, 2, 24, 23, -16, -5, -4, -33, -38, 4, 26, -5, -2, 18, -24, 15, 13, -20, +-13, 105, -1, 57, 4, -46, -8, 6, -16, -3, -49, -31, -20, 40, -72, 16, 19, -35, -20, 10, -7, -28, -31, 2, -11, -6, -8, -1, -16, 41, 7, -8, -34, 98, 6, -17, -13, -10, -10, -29, 10, 27, -66, -17, 0, -44, -9, -15, 38, 7, -58, -10, -42, -15, -7, 23, -10, -28, -28, 111, -23, 28, 10, -33, 0, 11, -4, 22, -24, -27, -17, -7, 7, 8, -13, -11, 12, 78, -45, -10, 16, +48, -13, -40, -26, -15, 1, -49, 33, 10, 17, -11, -7, -15, -23, 10, -10, 6, -1, -42, -33, 24, -18, -18, -15, -19, -41, 12, 30, -25, 22, -3, 11, 48, -5, -8, 6, -10, 1, -15, 2, 78, 22, 22, -25, 20, -13, -5, -8, -4, 49, -42, -34, 9, 9, 18, 0, -35, -16, -5, -10, -1, -27, 10, 7, -7, -13, 5, -7, 32, 22, -33, -30, 17, -31, -23, 2, -26, -10, -24, -54, 17, +-48, -25, -43, -28, 20, 0, 16, -42, -57, 36, 45, -32, -6, 12, -11, 14, -12, -6, 16, 60, 46, -32, -2, 34, 13, 12, 60, -57, -12, -16, -35, 1, -57, -14, -28, -9, -14, 11, 6, -27, -2, 15, -7, -33, -21, -7, 1, -6, -26, -11, 6, 74, 51, -7, -3, 29, -38, -32, -1, -41, 7, -2, -16, -13, -28, 15, -8, -25, -2, 0, 8, 15, -24, -11, 4, 0, -6, -2, 6, 1, -8, +-51, -4, 27, 19, -35, 36, 38, -20, 3, 16, -44, -31, -15, -40, 17, -19, -16, -13, -30, 8, 12, 17, -25, -29, 3, 73, -10, 23, -5, 37, -10, 1, 6, -20, 74, 19, -27, 53, 2, -54, -3, 31, -35, -39, -44, -51, -21, 18, 90, -2, -14, -10, 8, 21, 1, 0, -4, -31, -16, -68, -25, -17, 43, -50, -9, -5, -14, -13, -34, -10, 17, -2, -10, 8, -17, -9, -58, -22, -3, 8, 81, +-22, -50, -15, -7, -2, 33, 6, 0, 46, 20, -33, -19, -23, -3, 0, -20, -33, 18, 15, -42, 27, -22, -18, 18, -17, 8, -24, -3, -46, 19, 14, 60, -2, -19, -27, -8, 16, -4, 3, 1, 33, 13, -14, -8, -25, 8, -19, -28, -5, -21, -11, -24, -7, -44, 1, -10, -25, 0, -15, -17, -23, -11, 12, 59, -30, -6, -40, -29, 39, -27, 10, -3, -15, 13, -3, -41, -14, -6, -24, -28, -18, +-51, -30, -30, 5, -76, -1, -49, -13, 4, -33, -33, -42, -15, -13, 37, -43, -37, -61, 14, 4, -23, -9, 0, -19, 51, 21, 13, 9, 18, -26, -26, 1, -40, 1, -7, -7, -18, 27, -19, -3, 7, -31, -53, -35, -21, -7, 53, 3, -19, 8, -13, 9, 0, 1, 3, -18, 25, -15, -18, 8, 24, -45, -17, -8, -33, -7, -23, 21, 5, 1, -19, -1, -16, -7, -30, -28, -8, 10, 75, 9, -2, +-24, 13, 5, 2, 0, 38, 80, 7, -44, -5, 3, 20, -24, -52, -38, 4, -16, -14, 7, -13, -25, -7, 5, 32, -3, -23, -57, -31, 14, 5, 6, -3, -49, 16, 27, -21, -42, 25, 12, -13, -26, 16, 0, -18, -18, -18, 1, -24, 1, -29, 37, 2, -19, -19, -14, -33, -17, -59, -58, -7, 13, -20, 3, -18, 6, -34, 7, 11, 11, -40, 15, -5, 32, -7, -14, -26, -27, -11, -25, 46, 44, +-31, 16, 16, 8, 36, 30, 10, -18, -4, -47, -19, -11, -15, -4, -5, -23, -37, -17, 21, -17, 54, 0, -23, 35, -7, -24, 3, 9, 60, -73, -15, 7, -9, 25, 30, 6, 127, 11, -29, -16, 1, -4, 18, -37, -37, 33, -8, 19, -12, -1, 44, -38, 9, -15, 6, -32, -25, 7, 2, -55, -15, 35, -49, 75, 9, 40, -25, 1, 39, -15, -40, -4, 99, -8, -23, -43, 9, -24, 0, 31, -1, +-13, 6, 16, -25, 4, -30, -13, 2, 6, 38, -31, -30, -4, -14, 18, -13, -51, -8, 11, 6, -10, -22, -4, -28, -30, -3, -24, -2, -15, -40, -22, 2, -35, 35, 22, -2, -22, -40, -49, -34, -15, 35, 2, -28, 0, -32, 56, 11, 6, -11, 15, -67, -62, -26, -24, 37, 15, -13, -33, -7, 30, -15, 1, -1, 4, 33, 18, -20, 14, -17, -54, 0, -21, 16, -34, -52, 2, -13, 54, 27, -15, +-54, -1, -85, -36, -9, 0, 9, 9, -15, -28, 14, 6, 1, -15, -2, -1, 34, -26, -11, -3, -6, 7, -1, -4, 5, -49, 15, -24, 0, 14, 27, -24, 30, -5, 127, -17, -19, -8, 58, 24, -14, -27, -20, -10, -9, -43, 26, 5, 33, 68, 1, 10, -3, -35, -17, 5, 16, 30, -53, 13, -33, 9, 40, -6, 12, 1, 127, 3, -37, -4, -10, -14, -18, -12, -22, -33, -17, -14, 1, -27, 11, +23, -6, -26, -24, -4, -31, -17, 41, -30, 13, -55, 55, 65, -27, -15, -22, 29, -75, -22, -44, -8, 41, -14, -32, -33, -5, -40, -40, -41, -15, 25, 42, 20, 8, 1, -9, -4, -36, -19, 26, 2, 24, -26, -53, -26, -50, -27, -21, 30, -50, 17, -32, 3, -11, -4, 27, -17, -14, -48, -35, -5, -31, -15, 50, 14, -6, 18, -2, -13, -27, -8, 28, 25, 25, -33, -38, 31, -9, -26, -22, 15, +-58, -7, -18, 9, -22, -30, -8, -32, -4, -25, 10, -11, -12, -6, 19, -17, 36, -9, -8, -6, -25, -30, 20, 93, 21, -27, -48, 37, -28, 20, -7, -4, -56, -12, -2, 24, -1, 2, 10, -32, -40, -14, -17, -12, -17, -28, 37, 21, 16, -6, -4, -34, -28, -12, 54, 93, 41, -28, -63, 39, -17, 4, -52, 25, -60, -2, -22, -1, 12, 4, 28, -47, 31, -24, -5, -29, -24, -16, -5, 6, 41, +-30, -4, 2, -42, -9, -2, 36, 43, -35, 20, 19, 2, 10, 7, 42, -19, -7, 1, 20, 67, 5, -8, -26, -20, -18, -38, -2, -30, 16, 29, 16, 21, -24, -10, 1, -23, -57, 3, 48, 47, -50, -44, 39, -30, -16, -19, 19, -37, -23, -28, 4, -29, -28, -15, -37, -28, -2, -14, 3, -26, -5, 4, 17, 36, -9, -29, 26, -54, 0, -35, 80, 43, -40, -41, 45, 46, -7, -21, -3, -38, -31, +-29, 1, 9, -49, 9, -17, 10, 10, 29, -21, -7, -24, -22, 24, 29, 2, -14, 24, -3, 3, -4, 8, 15, 17, -36, -17, -10, -7, 3, 11, 127, 18, -12, 13, 59, -19, 7, 12, -34, -28, -39, 34, 2, 32, 6, 7, 5, 45, 77, -14, -37, 127, -28, -57, -5, -7, -31, 39, -19, 40, -7, 4, -32, -9, -25, -36, -6, -40, 104, -16, -4, -19, -1, 5, -5, 3, 23, -7, 23, 24, 99, +16, 66, 20, -38, 41, -41, 14, -54, 14, -16, 10, -46, 10, 37, 9, -60, -13, -18, 40, 103, 2, -20, 16, 5, 22, 44, 64, -32, -2, 17, 43, 121, -27, 4, 88, -6, -17, 13, 0, -34, 40, -24, 17, -24, 12, -2, 4, -16, -64, 57, -43, 88, -48, -23, 9, 10, 0, 84, 13, -27, -24, 65, 42, 118, -1, -23, 83, -32, 55, -34, -43, -25, 21, -12, 29, -40, -22, 47, -27, -52, -34, +19, -31, 125, 7, -25, 3, -6, 13, 27, 27, 13, 1, 25, 38, 127, -15, 12, -16, 1, -14, -24, -16, -32, 4, -5, -28, -27, 29, 40, -17, -31, -2, 18, 34, 125, -40, -34, 36, -47, 14, 27, 40, 9, 12, 20, 8, 127, 14, 63, 51, 35, -48, 33, -2, -39, -19, 30, -20, -13, 4, -44, -7, -6, -1, 29, -16, 107, -16, -12, 25, -66, -12, 12, 44, 15, -24, 44, 28, 108, -21, 56, +37, 19, 4, -30, 21, -26, 4, -6, 4, -42, 15, -10, -21, -29, -14, 43, -25, 127, -17, -6, 23, -30, 7, 28, 22, 24, 3, -3, 14, 79, -22, -9, 26, -8, 5, -15, 8, 22, -10, -8, 24, -12, 12, -41, 52, -6, -40, 3, -32, 127, 10, 16, 9, 11, 11, -19, 10, -15, -11, 1, 32, 101, 4, -24, -9, 3, 6, 17, -1, -27, -17, 11, 1, 9, 37, 11, -4, -47, -33, -1, -7, +47, -15, -19, 48, -6, -15, -75, 48, 23, 8, 7, 44, 95, -6, 21, 1, -26, -49, 38, -5, -20, 0, -13, 26, -50, 12, -30, 8, -29, -26, 23, -84, 127, 4, -38, 51, 34, 18, -17, 9, -11, -20, 4, 12, 68, 9, -35, 32, 10, 82, 23, -27, -2, 11, -21, -17, -43, 1, 29, 27, -10, -44, 4, -14, 47, -5, -10, 8, 3, 4, 13, 7, -24, 1, -24, 33, -10, 0, 30, -11, -9, +28, -35, 3, -5, 31, 20, 16, -20, 35, -22, 30, -2, -3, 13, -18, 127, 30, 4, 17, 14, -26, 14, 16, -26, -24, 1, 22, -29, -2, 55, -19, -1, 33, -40, 1, 13, 68, 9, 7, -11, 64, -21, 15, -12, -15, 2, -30, 127, 19, -12, -10, -11, 35, -28, -7, -7, -3, -23, -7, -16, 10, 0, 16, -1, 48, 12, -12, 2, 7, -27, 41, -3, 2, -11, 67, -18, 19, -1, 30, 116, -46, +4, 4, -33, 7, 11, -46, 41, 2, 2, 51, 25, -25, -34, 46, -11, 71, 26, 5, 68, -31, -6, 34, -35, 7, 24, -16, 59, 26, 5, -28, 100, -5, -19, -27, 21, -3, 8, -35, 45, 5, -23, 45, -25, -27, -48, 15, -3, 37, 53, -9, -18, -7, 21, 31, -11, 3, 28, 79, -9, -8, -10, 35, 127, 14, -8, 2, 0, 19, 17, 47, -30, -9, 81, 18, 29, -24, 22, 35, 20, -17, 91, +-6, 42, 11, 41, -21, 56, 9, -28, 21, -6, -18, 19, -19, 46, -14, 66, -13, -5, 5, -40, 26, 48, 22, 60, 59, -5, 7, 57, -22, 11, -60, 87, -13, -21, -28, -11, -7, 33, -38, -23, -6, 79, -13, 21, 21, -11, -29, 14, -46, 23, 58, -11, 24, -13, -12, 69, -13, -12, -6, 13, 46, 10, -41, 127, -17, -2, -27, 37, -10, 77, -27, -1, 19, -2, -22, 21, -1, 68, -47, 1, -59, +22, 26, -22, 30, -17, -2, 53, 59, 11, -20, 54, 24, 38, -37, 117, -12, -36, -11, 4, -9, 75, 8, -11, 68, 12, 4, 37, -9, 107, -4, 6, -48, 19, 45, 32, 4, 16, -34, 67, 48, 38, -4, -14, 52, 74, 26, 73, 22, -4, -21, -14, -6, -34, -9, -9, 0, 5, 8, -35, -4, 6, -35, 41, -33, -1, 64, -27, -31, 11, -44, 96, 15, -6, 17, 33, -4, 41, 5, 101, 1, 16, +-7, -34, 13, -23, -9, -23, 30, 64, -18, 37, 4, 29, -22, 24, -32, 23, -11, -22, 66, 31, -21, 54, 3, -27, 27, 84, 42, 17, -10, 94, 0, 23, -3, -19, 18, -55, -6, 19, 14, 19, -18, 7, 29, -13, -8, -7, -23, 5, 20, 5, 19, -19, 17, 58, 11, -18, -14, 55, 47, 33, -18, 85, -23, 47, 6, -3, -5, -7, 1, -32, 10, -10, -2, 46, -5, -17, 4, 43, -19, -31, -8, +-9, -8, -5, -8, 45, -9, -28, -13, 34, 21, 1, 2, 97, -6, -12, -17, 2, -29, 84, -11, -14, -9, -1, -1, 20, -23, 56, -14, 17, -45, 37, -21, 63, 97, -4, -23, 71, 49, -34, 16, 55, 62, 22, -19, 104, -29, 53, 26, 20, 28, -23, -26, -25, -10, -5, -75, 40, -32, -51, -12, 58, -25, 14, -2, 48, 11, -10, 18, 57, 75, -4, -12, 54, 3, 51, -54, 47, 4, -31, -27, 15, +-23, 94, 7, -18, -10, -57, -21, 1, 24, 21, -12, -7, -8, -18, -3, -18, 24, 1, 2, 28, 22, -18, 0, 58, 45, -6, -8, 10, -4, -5, 2, -21, -6, -15, -4, -1, 12, -21, -10, -26, -3, -6, -11, 7, -19, -39, -34, -22, 38, -10, -12, 45, 42, -34, -23, 67, 56, -18, 0, -11, -23, -31, -11, -23, 7, -12, -7, -22, 15, -15, -29, -13, -16, -29, -13, -5, -43, -22, -12, -23, 75, +-26, 26, 51, 127, -21, 12, 62, 67, 10, -38, -14, -7, -26, -31, -15, -13, -15, -33, -11, -26, -27, -37, 6, 28, -18, 2, 33, -11, -9, -16, 5, 7, -4, -6, 103, 2, -42, -19, 78, 30, 21, -30, 44, 28, -34, -19, -14, -32, 26, -33, -2, -8, -1, -28, 16, -7, 16, -12, 14, -14, 10, 9, -21, -9, 8, 55, 11, 41, 15, 11, 50, 25, -9, 11, -58, -20, 3, -7, -60, 2, -39, +-22, -18, -3, -10, 14, 12, -41, 18, -26, -7, -2, -6, 11, 10, 27, -1, -13, -11, 18, -17, -40, -28, -2, 24, -9, 111, -13, 10, -39, -34, 19, -9, 44, 6, -26, -6, 26, -35, -51, 23, 28, 82, -15, -10, 6, 54, -14, 16, -5, -12, 15, -17, 15, -25, -31, -37, -1, -13, -20, 4, -34, -82, 9, 11, 94, -25, 1, -31, 6, 81, -15, -18, -29, 16, -7, 19, 11, 34, -6, 15, -19, +-30, 41, -20, -17, -20, -28, 9, 23, 5, -28, 18, 35, -43, -21, -5, 120, -33, -39, 19, 35, -28, -63, -2, 41, 39, -6, 14, -2, 19, -39, -9, -50, -45, 45, -16, -13, -38, 10, -30, -17, -5, 19, -14, -61, -28, -45, -9, 66, 9, -12, 28, 24, -30, -13, 17, 7, -17, -26, -32, -11, 40, 20, 23, 8, 22, -34, -9, -30, 13, -20, 1, -28, 80, -25, 0, -34, -57, -7, 27, 11, -31, +-43, -21, 26, -2, -44, 17, 3, 27, -26, 3, -33, -5, 46, 22, -28, -35, 42, -19, 16, -22, -1, -47, -16, 32, 18, 0, -52, 26, -3, 17, 103, -27, 2, -14, 30, 9, -48, -11, 58, 43, -8, 32, -36, 5, 45, 36, -16, -14, 53, -13, 37, -32, 8, -68, -54, 35, 10, 14, -57, 50, 6, 26, 94, -19, -16, -13, -1, 14, -51, 6, 29, 42, 12, 41, -7, -11, -27, -16, -34, -9, 30, +18, -29, -40, -5, 10, 19, 49, 13, -22, -36, 66, -14, 5, 74, 5, -24, 0, 22, -15, -44, 3, 61, 57, 19, 20, 4, -2, -26, -10, -33, -29, 30, -23, 5, 5, -17, -9, 20, -19, 15, -11, 127, -25, 33, -10, -21, -20, -37, -9, 26, 15, -2, -8, 23, 0, -46, 24, 4, 11, -5, 13, -17, 18, 72, -21, -19, -56, 3, 4, -32, -3, 4, 37, -45, 26, 32, 47, 11, -51, -55, 2, +32, -19, -8, 17, 59, 5, 11, -5, 12, 10, -42, 10, -19, -13, 24, -4, -6, -43, -11, 0, -9, -29, -1, -12, -6, -44, 0, -30, 10, -23, -5, -11, 26, 18, 127, 19, 11, -13, 0, -3, -14, 27, 12, 1, 21, -34, 2, -23, -18, -46, -14, -6, 38, -7, 1, 44, 39, 61, -13, 23, 41, 17, -14, -1, -1, 22, -49, -8, -3, -38, 4, 1, -27, 26, 11, -16, 12, -31, 22, -16, -25, +-37, -32, -32, 54, -20, 20, 17, 102, 73, -28, 29, 36, 9, -6, -6, 5, 38, -63, -14, 0, 17, 0, 15, -31, 32, -1, 17, 44, -22, 8, -26, -11, 1, -3, 19, 10, -30, 23, 14, -60, -33, -6, 16, 18, 29, -21, 12, -11, -43, 0, 16, -26, 48, 20, 28, 13, 34, 16, 23, 5, -7, -16, -26, -13, -4, -16, 39, -15, -18, 7, -26, 46, -19, -45, 21, -104, -11, 13, -1, -10, -7, +8, -1, 16, 9, -3, -4, -5, -39, -13, 11, 38, -17, -12, -23, -6, 4, -26, 44, -28, -18, -8, -8, 19, 41, -13, 16, 69, -27, -43, -17, 36, 40, 85, 39, -2, -21, -14, -22, -44, -28, 48, 29, 36, 21, -30, 8, -17, -16, 1, -47, 7, -17, -28, -21, -11, -19, 16, 0, -47, 38, -15, -23, -44, 13, -33, -33, 22, -18, -7, -11, -10, -31, -127, 39, -10, -17, 7, -25, 10, -55, -39, +-7, -2, -7, 23, -9, -34, 78, -15, -5, 67, 7, -7, -15, -7, -21, -11, -2, 30, -26, -25, -37, -69, -27, 59, 62, 34, 17, -35, 4, -23, 2, -18, -32, 28, -35, -10, -14, -47, 25, 27, 5, -14, 11, -43, -34, -14, 16, -47, -20, -1, -31, -21, -8, -7, -17, 57, 70, 65, 9, -27, -6, -19, 33, -13, -56, 39, -17, -13, -7, -8, 72, 18, 23, -13, 14, -40, -28, -34, -42, -65, -39, +-47, -18, -3, -7, 33, -23, 23, 47, 33, 65, -7, -19, 10, 104, 6, 4, -28, -1, -7, -19, 17, 4, -34, -37, 17, -1, -24, 12, -29, -21, -20, -22, 9, -21, -7, -61, -31, -45, -46, -25, 24, 22, -7, -17, 13, 85, -9, -26, -13, 3, -10, -45, -9, 5, 15, -34, 26, -54, 34, -14, -22, 5, -8, -34, -13, -24, 3, -26, -2, -33, -55, 21, 13, 17, 3, -8, 12, 42, -4, 1, 26, +27, 10, -24, -68, -26, -29, -39, 26, -49, 24, 26, -34, -5, -33, -12, -14, -34, 0, 9, -27, -17, 36, 5, 10, 28, -32, -2, -15, 19, -5, -31, 16, 0, -18, -6, -30, -26, 1, -12, -5, -23, -14, -36, -26, 16, -21, -28, -2, -29, -21, -25, -5, 1, -22, -6, 7, 4, 3, 5, -11, -9, -27, 1, -11, -13, -5, -8, -29, 42, -7, 22, -29, -34, -10, -11, -28, -10, -24, -16, -28, -54, +-9, -30, 15, -32, 84, 33, 1, 40, -24, -24, -62, 84, -53, -8, 28, -19, -12, 2, -34, -63, -54, -22, -3, 14, 35, -19, -21, 8, -41, -62, 20, -1, 3, 0, 16, -4, 81, 56, 18, 24, 28, -10, -46, -52, 17, 17, -28, -41, 0, 8, -7, 24, 31, 5, -5, 25, -2, -44, -11, -32, -32, -39, 62, 19, -10, -11, 10, -6, 9, 31, 28, -9, -19, -2, -10, 59, -21, -26, -17, -10, -20, +1, -29, -7, -1, -4, 17, -1, -10, 4, 5, -35, 5, -4, 3, 31, -1, 2, 18, -6, -3, 29, 32, -4, -24, -37, -6, 42, -17, -16, -2, -10, -29, -1, -38, -14, 14, 4, 30, 13, 2, -1, -10, -32, -3, 2, 7, 53, -16, 23, -24, 15, 44, 92, 30, 10, -31, -1, -4, -36, 32, 35, -20, 3, -12, 34, -21, -39, -10, -13, -16, 2, 3, -3, -18, -24, 12, -37, 16, -13, -21, 77, +1, -14, 68, 78, 12, 12, 13, -8, 18, -16, -26, 15, 14, 2, -26, -35, -29, -10, 17, 12, 24, 12, -25, -47, -16, -1, -39, 17, 18, -14, -16, 36, -25, -34, 105, 76, 19, -10, 68, -9, 13, -42, 3, 16, 23, 31, 22, -22, -35, -3, 6, -19, -42, 6, -43, -16, -2, -32, 8, -39, 39, -33, -23, 2, 9, -31, 18, 16, 13, -8, -26, 11, 0, -12, -40, -14, -3, -48, 11, -22, -23, +69, -10, -11, 16, 24, -3, -42, 45, -5, 2, -43, 50, -63, -35, -45, -27, -19, -12, 61, 23, -31, 25, -24, 10, -21, -27, -18, -3, -16, 88, -40, -17, 37, 62, -13, 5, 67, -33, -18, -13, -30, 6, -19, -8, -19, 7, -26, -2, -50, 38, 21, 12, -16, -6, -4, -14, 23, -41, 3, 21, -46, 41, -30, -17, 110, -2, 11, 11, 63, -45, -39, 11, 3, 23, -10, 9, 40, -2, -16, 17, -60, +27, 24, 1, 40, 12, 36, -37, -12, -25, -15, 4, -59, 66, -31, -17, 98, -24, 15, -29, 22, -69, -61, 0, -27, 41, -15, 33, -32, -3, -14, -32, -19, -23, 5, 41, 18, -59, -25, -63, -3, -17, 8, -2, -14, 51, 2, 12, -28, 11, -1, 26, -9, -33, -10, 51, -29, -14, 9, -38, -9, 5, -19, 20, -18, -8, 17, 16, -13, -4, 53, -32, 6, 3, -38, -38, 2, 30, 46, -4, 37, 53, +62, 43, -16, -15, -28, -5, -11, -27, -48, -13, -30, 8, -44, -28, -18, 0, 15, 10, -22, -3, -3, -9, 2, -11, -20, -10, 10, 50, 37, -28, 20, 37, 58, 29, -20, 28, -29, -9, -20, -21, 0, -27, 4, 6, -1, -5, -19, 27, 11, 20, -42, -35, 8, -7, 9, -8, -17, 12, -13, 63, 10, -5, 76, -11, 16, 10, 5, -28, -34, -25, -8, -28, 4, 5, 10, -49, -7, -19, -49, 49, 28, +-23, -14, -21, 4, 13, 48, -31, 9, -12, -18, 71, -21, -20, 40, -22, 1, 20, 47, -6, 23, -34, -18, 21, -6, -26, -5, 15, -23, 17, -5, -2, 3, -16, -5, -24, 2, -24, -10, -46, 15, -45, -56, 70, 17, -47, 103, -23, 67, 14, -38, 15, -67, 8, 10, -20, 18, -41, -13, 11, -42, -3, -21, 26, 54, -27, -40, -12, 15, -9, -7, 17, -1, -4, -29, -44, 1, -12, 68, -18, -18, 2, +80, -23, -17, 7, 18, -3, -27, 11, 15, -11, -8, 25, -6, -11, 5, 32, 25, -14, -19, 22, 34, -19, -1, -4, -10, 4, -9, -10, 82, -10, -23, -9, 13, -2, 14, 2, -3, -20, -2, 28, 16, 2, -5, 31, 5, -12, 6, 22, 24, -28, -39, 27, 28, -18, -20, -19, 4, -3, 14, -16, 89, -7, -21, -8, -3, -17, 8, -8, -32, -15, 25, 9, -37, -18, -36, 35, 0, -32, 34, 21, -27, +-30, -9, 34, 19, -1, 2, 8, 19, 12, 17, 8, 51, -13, -25, 16, 38, -8, -12, 7, 15, -28, 10, 105, -31, -18, -37, -6, 58, -17, 42, -32, -12, -35, -7, -3, 1, -37, 6, -23, 37, 43, 4, 20, -40, -42, -11, -29, -20, 16, 12, 28, -21, -20, -28, 45, -10, 7, -16, -49, 21, -8, 56, -20, 19, -21, -6, 12, -1, -27, 22, -8, 6, 23, -7, -8, 13, -16, -29, -23, -28, -20, +-7, 48, 21, -39, -41, 74, -3, 54, 49, -2, -43, 5, -33, -30, -3, -31, -15, -20, -40, -25, -15, -43, -12, -30, -1, 35, -3, -3, -19, -17, 80, 3, -16, -14, 17, 47, -49, 33, -30, 12, 53, -39, -8, -27, -48, -44, -30, -9, -2, -10, 23, 8, 14, 49, -7, -8, 23, -18, -12, -62, -33, -39, 115, 13, -29, -4, 0, 50, 83, -5, 6, 19, 23, -6, -6, -10, -12, -22, 17, -19, -18, +-32, -27, -2, -9, -16, -13, 10, -32, -1, 18, -29, -19, -28, 113, -9, -21, 14, 0, 56, -13, -9, 51, 4, 54, -29, -17, 15, 4, -56, 7, -22, -39, -18, -33, -26, 2, 27, -37, -29, -36, -6, 15, -5, -18, -21, 127, -10, -18, -6, -15, 44, 127, -19, 22, 22, 70, -72, 34, -24, -63, -7, -8, 26, -8, -13, -47, 15, -34, -28, -27, -19, -21, 24, -8, -15, -1, -1, 17, 0, 50, -5, +-1, 51, -43, 17, 35, 12, 39, -30, 39, -22, -11, -33, 27, -4, -33, -17, -30, -52, -27, -20, -25, -30, -26, 40, -11, -34, -15, -11, 81, -23, -35, 15, -41, 45, -48, 11, 6, 27, 50, -34, 21, -25, -28, -11, 9, 0, -31, -11, -33, 6, 6, -25, -4, -19, -8, 47, 15, -29, -24, -27, 44, -47, -31, 16, -6, 66, -58, 33, 1, 41, 42, 6, -29, -1, -44, -30, -25, -7, -54, -29, -41, +4, 33, -16, -2, -37, -28, 46, 3, 8, -26, -18, 72, -6, -27, 4, -1, 63, -38, 30, -11, -15, -4, 0, -6, -10, -18, -28, -22, -7, -1, -39, -22, 4, -3, 16, 41, 9, 25, -18, -15, -17, 8, -5, 114, 38, -11, 3, -1, 51, -7, -9, 80, 66, 49, 68, 14, -23, -20, -25, -47, 7, -52, -11, -51, -6, 42, -32, -24, -66, -50, 28, 18, 5, -9, 25, 18, -67, -39, 29, -23, 75, +-58, 31, -11, -20, 34, 32, -38, -7, -12, -22, -34, -22, -51, -33, 3, 16, -31, 10, -27, -30, -4, 22, -13, 12, -16, -24, 81, -3, -3, -10, 1, 11, 18, 27, -1, 15, 22, 12, -12, -16, -11, -1, 8, -15, -17, -21, 6, 7, 12, -16, 13, 40, -14, -8, -1, -11, -11, -19, -27, -7, 44, 15, -16, -5, 48, 3, 14, 30, 48, 7, -10, 2, 4, -9, 59, -9, -40, -29, -2, 5, 11, +20, 6, 49, -10, -30, 7, -12, -10, -16, -22, -15, 47, 6, -15, -17, 47, 5, -10, 14, -63, 4, -20, -20, -27, -6, -18, -43, 57, -29, -4, 42, 3, -7, -15, -31, -3, 46, 11, -1, -2, -27, -13, -60, 69, 34, -27, -1, -29, 31, 25, 9, -36, 10, -27, -23, -47, -30, -45, 13, -61, -15, -24, 44, 16, -13, 6, -41, 23, -2, 10, 12, -29, -9, 47, -26, -31, -19, -43, 78, -48, 31, +9, -16, -11, 9, -21, 7, -26, -34, -4, 32, -34, -4, -15, 47, -17, -23, 50, -26, -3, -23, -19, 32, -7, -12, -4, -26, 54, -9, -29, -24, 28, 20, 66, -17, -28, -24, 4, 15, 0, -4, -38, -33, 56, -34, 36, -24, 34, -7, -44, 16, -16, 11, -34, 29, -1, -22, 6, -28, 2, -18, -10, -18, -34, -4, 12, -65, 8, 26, 78, 21, 19, -8, -25, -48, 40, -12, 3, -7, -3, -21, -49, +11, 14, 18, -29, 86, -48, -55, -13, 3, -22, -57, 19, -19, -8, -39, 54, -26, -16, -2, -23, 14, -12, -57, -8, -30, 51, -26, 35, 25, 26, -12, -63, 18, -40, 63, -41, 2, -15, -39, -15, 2, -18, -33, 21, -6, -23, -41, 37, -56, -19, -1, 5, 13, -36, -10, -20, 36, 52, -57, -17, 7, 30, -17, -36, 11, -1, 60, -33, -10, -20, -61, 5, -24, -3, -31, 23, -14, -8, -19, -6, -17, +14, 0, 1, -33, -10, -9, -15, -8, 15, -4, -18, 2, 27, 1, -37, -29, 9, 51, -24, 0, -44, 51, 1, -41, 14, -21, 32, 43, 8, -11, -3, -23, 39, 21, 24, 1, -14, -27, 28, -29, 18, -37, 22, 43, 25, -14, -50, 22, -15, 67, -60, -7, 23, 46, 25, 39, 2, -25, -5, 26, 34, 25, -8, -31, 21, -10, 21, -30, 15, -31, 9, -12, 21, -22, 2, -26, 1, -3, -74, 9, -37, +52, -52, 12, 6, 63, 7, 10, 19, -3, -28, 4, 1, -3, 29, -17, -22, 28, 20, -1, 5, -4, -35, -57, 16, -59, 20, 12, 15, -35, -48, 22, 0, 50, -38, 0, 50, -22, -14, 21, -15, -2, -9, -25, -5, -10, 33, -4, -34, 8, 22, -19, -26, 12, -9, -35, 38, -14, 7, 6, 16, -3, -38, 10, 29, 60, -24, 11, -11, 3, -20, -2, 11, -26, -6, 5, -11, -27, 65, -21, -35, -3, +5, -27, 44, -3, -1, -21, 52, 12, 3, 5, 8, 1, -70, 26, -17, 16, -44, -12, 77, 56, -14, 8, -9, -6, 1, 1, -1, -5, 2, -12, -3, 19, -19, -17, -11, -43, 10, 11, 30, -25, -11, 20, 3, -6, -15, -37, -13, 8, -3, 63, 15, -54, -9, -13, -10, -26, 29, -21, -8, -45, 31, -4, -10, -2, 20, 0, -18, -5, 6, -3, 0, -1, -4, 19, 9, -25, -7, 28, -6, 24, -6, +-4, 3, 2, -21, -21, -39, -14, -10, -4, 1, 5, 31, 0, -1, -17, -2, 14, -43, 10, -2, -14, 3, 24, 0, 23, 17, -19, -25, 45, -1, 50, 11, 18, 1, 2, -26, -9, -52, 2, 6, -8, -19, -1, 61, 1, -18, -35, -7, 33, 7, -33, -28, -9, -8, -8, -3, -25, 4, 6, -11, -18, 8, -23, -33, -7, 22, 13, -7, -8, -39, -44, -46, -42, 27, -41, 16, -9, -32, -6, 9, 17, +-20, 1, -36, -9, 16, 11, 0, 25, 16, -11, -36, 8, 35, 24, -55, 24, 12, -59, -9, 18, -43, -31, -7, -19, 4, -41, -26, -38, -8, 11, -24, 9, -7, -48, 8, 67, -10, -1, -11, -24, 19, 9, -37, -39, 46, 46, -52, 41, 30, -2, -12, 39, -29, -23, -27, -58, -12, -45, 15, -19, -28, -24, -23, -2, -11, -23, -12, 1, -13, 9, -27, 32, 17, 94, -22, 4, -2, 40, 20, 22, -39, +5, 104, -34, -14, 16, -27, -17, 1, -42, 10, 5, -22, -20, -18, 11, 38, 49, -22, 15, -9, 4, 35, -13, -26, 7, -17, -9, -6, 30, 21, 21, -20, -41, 101, -18, -39, -14, -24, -33, 77, -29, 9, -13, -15, 9, -9, -2, -2, -4, -17, 27, -19, 44, -35, 33, 6, 70, -65, -15, -5, 51, 9, 21, -23, -4, 122, -30, -50, -14, -26, 0, -13, -23, 26, -1, -25, 8, -30, -8, 42, 14, +-10, 43, 0, 25, -23, 40, -4, 2, -34, 26, -25, 17, -9, 14, 6, -32, 106, -9, -27, 25, -66, -21, -16, -19, -39, -19, 4, 66, -17, -7, -8, 0, 38, -11, 5, -40, 4, 40, -6, 83, 37, -21, -24, 13, -9, -14, -23, -14, 99, -22, -19, -27, -16, -20, 33, 0, -13, -34, -39, 71, -30, -21, 11, -38, 14, -22, -12, 9, 17, 0, 10, 37, 6, -45, 22, 36, 14, 6, -50, -16, 78, +-44, -47, -51, 34, -32, 4, -29, -16, -32, -37, 54, -17, -30, 14, -19, 2, 19, 7, -16, 11, -12, -12, 15, 5, -31, 0, 32, 20, -3, -10, -38, 100, -34, -26, -39, 16, -41, 18, -14, 24, -30, -21, 6, -6, -9, 4, -17, -9, -4, -5, -25, 0, 5, 31, -19, -22, -27, 37, 63, 9, -13, -32, -5, 107, -37, -43, 5, 21, -19, -2, -41, -4, 19, 12, -44, -19, -19, 22, -21, 0, 17, +-18, -16, -16, 3, 33, -5, -10, 15, -24, 5, 16, -10, -15, -9, 36, -5, -16, -11, 73, 11, -25, -26, -12, -40, -44, 9, -12, -29, 39, -17, 10, 11, 25, 1, 12, -1, 43, -8, 37, -53, -61, 52, -8, 0, -41, 31, 76, -29, -65, 15, 116, 9, -30, -40, 7, -2, -19, -42, -12, -1, 16, -41, 20, -6, -46, 49, -1, 23, 12, -62, -36, -25, 17, 18, 0, 10, 0, -10, 50, -2, 8, +-2, -34, 5, -1, 1, -24, -17, -25, -17, -4, -20, 4, 20, 15, 17, -24, 13, -14, -2, 14, -8, -8, 33, 13, 10, 6, 4, 4, 19, -46, -33, -38, 5, 40, -3, -20, -2, -38, -1, -30, -21, -3, -13, 2, 26, 12, -13, -11, 12, -32, -3, 21, 37, 2, 42, 17, -3, -14, 9, 24, 24, -60, -44, -31, 24, 67, 7, -32, -8, -35, 15, -19, -12, -5, -4, 20, 31, 31, -2, -46, -23, +13, -42, 16, -61, -28, -31, 17, 48, -7, -2, -29, 31, -41, -5, -11, 5, 14, 10, 8, -11, -11, 11, -25, -1, -5, -5, 28, -54, -3, 13, -24, -2, -9, 25, 9, -26, 7, -42, -19, 28, 25, -19, 20, -20, 127, -45, -24, -10, 63, 0, -13, -31, 11, 13, -21, -18, 26, -10, 25, 46, -15, -20, -18, 34, -14, -26, 37, 97, 45, -42, -6, -29, -13, -14, -24, 24, 68, 14, -22, 14, -34, +-13, -4, -46, -13, 5, -34, -17, 12, 31, 17, 15, -17, 6, 7, -16, 5, 33, -2, -22, -6, 5, 27, 5, -10, 33, 29, 29, -16, -2, -8, -20, 16, 22, 95, 3, 38, 10, -44, 12, 20, -6, -7, 30, -24, 4, 19, -2, 17, 5, -26, 0, 23, 7, 7, 19, -4, 18, -26, 35, -18, 58, 33, -32, -11, -2, 65, 4, -27, 11, -8, 0, 0, -9, 16, -2, 14, -6, -20, -36, -8, 46, +2, 17, 1, -20, 20, -12, -32, 15, 0, 39, 7, 14, -11, -10, -31, 8, 99, -17, -25, 20, -31, 16, -5, 10, -3, 20, 7, 38, 102, -24, 26, -35, 10, 50, -11, -11, -20, 3, 4, -14, -41, -24, 4, 2, -43, -18, 14, 9, 54, 7, 20, 18, -74, 25, -48, 41, 8, 0, 15, 20, 127, -8, 38, 19, -18, 120, -44, 28, -23, 31, -28, -25, -88, 29, 73, -15, 60, -28, 45, -30, 86, +-32, -34, 11, 12, 26, -13, 59, -20, 19, -14, 55, 127, -25, -16, 33, 3, 28, -40, -31, -58, -10, 16, 23, -29, 17, -8, -10, 14, -29, -6, 4, 98, 24, -24, 0, -17, 15, 32, 20, 2, -5, -20, 35, 127, -10, 43, 37, -1, 28, -20, 0, -52, 34, -27, -16, -31, -2, 33, -25, -12, -18, -22, 13, 105, 8, -5, 4, -5, 11, -27, 24, -3, 5, -3, 47, 123, -6, 19, 5, -18, 40, +-38, -14, -6, -20, -10, 27, -21, -19, 13, -28, -48, 12, -25, 23, 68, 42, -2, 35, 1, 4, -13, 30, 15, -3, -20, 9, 65, 20, 9, 11, -33, -2, 0, 2, -47, 15, -17, 8, -1, -5, 13, -8, -27, -6, 22, -2, 76, -43, -7, 5, 25, 18, -7, 14, 25, -15, -17, 43, 95, 13, 1, -37, 11, 23, 57, -5, 6, 0, 21, 29, -16, -13, 46, 51, -27, -14, -17, 7, 120, -18, 5, +24, 14, 9, 15, 15, 10, -20, -20, 25, 71, -9, -33, 8, -6, 13, 29, 1, -2, 24, 18, 40, -9, -5, -2, 30, -10, -16, -4, 19, 106, -31, -1, 21, 7, 8, -50, 18, 10, -8, -35, 18, 127, -26, 17, -48, 14, 45, 56, -5, -41, 10, 18, -10, 3, -15, 19, 18, -16, -29, 8, -16, 120, -21, -6, 17, 30, -7, -60, -1, -47, -8, 7, -8, -40, -3, 32, -2, 9, 35, -42, -4, +17, 7, 5, -31, -35, 35, -22, 44, 46, 24, 15, -60, 127, 25, -18, -2, -14, 22, 1, 9, -5, -19, 7, 43, 93, 0, 65, -10, -4, 35, 7, -20, -45, -17, -17, 0, -31, 6, 36, 21, -13, 1, -14, 17, 99, 8, -11, -17, -15, 13, 22, 59, 52, -3, 20, 37, 103, -21, 35, 55, -26, -17, -31, 15, -29, 37, -12, 3, -37, 20, 8, -49, -44, -15, 5, -19, 127, -15, -20, 38, -2, +26, 11, 35, 24, 8, 9, 38, 127, -9, 45, -9, -21, 17, 6, -13, -19, -17, -3, 8, -30, -17, 12, -20, -26, 21, 38, -31, 112, -17, 1, -17, -16, -53, 4, 39, 8, 25, 19, -24, -9, 21, 46, 47, 11, -2, -35, -11, 14, -26, -15, 13, -29, 5, -14, 10, -3, -8, 18, -6, -13, -5, 15, -10, -16, -27, -31, 53, -1, -1, 67, -16, -36, -16, 52, 52, -9, -33, 0, 21, -12, -4, +6, -44, 63, -5, 18, 7, 4, -27, 10, -9, 44, -34, 14, -3, -29, -18, 6, 60, 7, -2, 40, 22, -28, -17, 65, 62, 20, -28, -57, 8, -20, -32, -27, -36, -31, -17, -8, 11, 19, -11, 4, -30, -15, -42, 10, -34, -10, -18, -15, 22, 4, 9, 52, 20, 13, 5, 24, 3, -19, 5, 0, 11, -36, -39, -30, 12, -1, -4, 14, -31, -15, -16, -31, -18, -17, 16, 59, -52, -47, 88, -77, +-41, 10, -15, 68, 39, -7, 42, 40, -20, -13, -12, 70, 7, -33, 19, -6, -15, -23, -7, 32, -25, 42, -2, 19, -18, -16, 9, 20, -47, 12, -15, -4, 18, 36, 1, 108, -18, 7, 8, 30, 28, 20, -40, 82, 1, -23, -34, 15, 44, 45, -7, -26, 32, -45, 0, -28, 9, 7, -59, -12, -18, -24, 48, 25, 9, -16, -12, 48, 9, 10, -14, -29, 23, 37, -3, 75, 0, 25, -24, -32, -13, +-9, 11, 17, -31, 28, 38, -7, -6, 14, -31, -5, -7, 3, 6, -29, 47, 31, 10, 37, -17, 21, -13, 22, 8, -8, -5, 53, -3, -43, -49, -17, -10, 3, 8, -22, -23, 17, -7, -46, -19, 17, -19, -7, -15, -10, 15, 6, -41, 5, -17, 52, 4, 13, -18, 18, -22, -5, -23, 44, -3, -21, -34, -17, -34, -2, -7, -5, -19, 33, 17, 30, -7, 6, -2, 17, -41, -12, 18, 16, -10, 4, +-7, 39, 64, -8, -3, 41, 53, 11, -4, 56, 2, -53, -20, -22, -9, 17, -18, -3, -10, 7, 29, 9, -13, -23, -8, 10, -27, -6, 28, -24, 0, 4, -28, 69, 14, 3, -24, 44, 48, 4, -13, 62, 1, -49, -34, -29, -27, 8, -33, -8, -6, 1, 12, 13, -28, -7, -30, -8, -19, -11, 20, 39, 16, -13, -1, 35, 65, -1, -28, 22, 74, 24, 18, 33, -18, -29, -32, 1, 6, 18, -22, +-12, -28, -1, 15, -16, -25, -12, -14, -12, 52, -37, -3, 65, -3, -2, -1, -21, 78, -6, 2, 59, 41, -18, -1, -17, -14, -39, 31, -22, 24, 0, -11, 2, -21, -1, -23, -34, -3, -6, 24, 73, -10, -37, -15, 45, -32, 12, -4, 30, 62, -39, 3, 25, -38, 30, -40, 77, -8, -12, -5, -7, 12, -6, -21, -11, 0, 6, -42, -9, 33, -9, -26, -13, -5, -13, 68, 10, -5, 4, -13, 82, +28, 0, -12, 13, 25, 13, -9, 79, 12, 34, -2, -40, -17, -37, -10, -26, 0, 51, 19, 3, 2, 36, -31, 2, -47, -4, 34, -18, -35, 3, -11, 62, -39, 17, 9, 25, 47, 25, -31, 91, 15, -22, -63, -10, 10, -39, -13, -12, -20, 25, 1, 7, -12, 0, -28, -12, -7, 28, -40, -50, 6, 17, -12, 24, 32, -18, -13, -22, 2, 8, 6, 13, 17, -18, -13, 58, 7, -10, 127, -37, 4, +-1, -28, 36, 25, 1, -14, -4, 12, -10, -19, 13, -25, 5, 23, -48, 17, -36, -17, 9, 1, 23, 32, -11, -3, -20, 127, 55, -1, -23, 6, -34, -28, 0, -1, -28, 72, 8, 2, -11, 20, 15, -18, -18, 15, -6, 53, 7, 15, -2, 2, -11, 15, 19, 32, -5, -8, 9, 127, 24, 10, 11, -23, -32, 7, 2, -22, 29, 61, -7, 16, -37, -8, 35, -22, 8, 33, 22, -18, 70, 42, -20, +-2, 51, -30, -8, -3, -55, -22, 8, -37, -15, -29, 9, 95, -39, 8, -9, 47, 18, -8, 5, -14, 57, -29, -20, 1, 54, -20, 13, -9, 10, 8, -29, -40, -36, -8, -25, -34, -68, 4, -15, -85, -60, -41, 33, 111, 3, -17, 14, 29, 73, -81, 7, -29, 63, -2, 24, 8, 7, -6, -27, -36, 28, 65, -13, -17, -1, -30, 24, 7, -32, -15, -9, -86, 21, 31, -51, 120, -10, -11, 5, 40, +52, -24, 7, 11, 14, -21, -5, 11, 4, 38, 20, -51, -19, -11, 3, -11, 12, -19, -12, 16, 55, -48, -12, -26, -24, -12, 4, -13, -8, -36, 0, 48, 21, -28, 17, -18, 24, 1, 12, -25, -24, 2, 31, -19, 32, 32, -34, -45, 21, -22, 35, 2, -24, -5, 12, 45, 18, -20, 24, 76, -14, 7, -3, 38, 12, -37, 4, -5, 35, -37, 10, -4, 6, 6, -15, -3, -21, 13, 26, -15, -28, +-10, -34, 32, -28, -5, 0, 127, 10, 23, -14, 8, -5, 6, 18, 9, 55, -26, -8, 4, 47, -15, -32, -39, 28, -1, -18, 7, 46, 15, -3, -16, -29, -5, -5, 19, -3, 5, -12, 20, -16, 14, 15, -49, -33, -36, -23, 12, -28, -45, 8, 23, 18, -17, -13, -23, 9, -18, -16, 23, 13, 44, 1, -24, -9, -4, 2, 46, 2, 5, -5, 127, -14, 7, -16, -51, -34, 0, -9, 22, -7, -56, +4, -3, 8, -43, -24, -32, 17, 2, 6, -6, 4, -12, -1, -27, -38, -11, -30, 1, -39, -5, 16, 33, -24, -2, 25, -25, -15, -24, -3, 30, -4, -62, 6, -11, -5, -51, 6, -27, 2, 25, -12, 27, -28, 6, -22, -25, -70, -13, -35, 18, -58, 0, 52, 32, -2, -9, 7, -30, 10, -15, 21, 17, -46, -39, -1, -9, 11, -26, -28, 13, 48, -7, 45, -41, 19, 24, -24, 6, 5, -5, -23, +-32, -20, -33, -15, -47, -9, -24, 2, 42, -11, 24, -46, 44, 80, 9, -6, 30, 11, -37, -12, -2, 8, 71, 20, -28, -19, -44, -15, -32, -23, -24, -13, -24, 73, -29, -11, -51, -7, -16, 28, 21, -40, -35, 15, 2, 4, -49, 7, 71, 20, -16, 8, 13, 15, -2, -7, -13, -8, 15, 20, -34, -13, 29, -40, -6, -57, -17, -16, 73, 25, 12, 9, 94, -8, -19, -9, 25, 49, -16, -17, 18, +-41, -3, -20, -20, -40, -4, 14, 4, 0, -22, -4, 9, -46, 5, 12, -22, -21, 12, 46, -11, -5, -1, -14, 5, -13, 45, -9, -20, -25, 2, 1, 42, 60, -8, 20, 12, -26, 19, -11, 1, 23, 8, -29, 13, -28, 0, 15, 27, 18, -10, 54, -36, 43, 6, 14, -20, 5, 43, -7, -49, 17, 19, -12, 2, 58, -15, -3, -4, 15, 1, 7, 9, 9, 1, -17, 1, -31, 7, 14, 7, 4, +-11, 59, -21, -34, 22, 18, -11, -20, 43, -19, -27, -12, 17, -8, 24, -6, -33, 8, -42, -23, -46, 47, 37, -1, -1, -10, -21, -13, -21, 23, -13, -24, -17, -13, -7, -27, -63, -26, 0, 3, -24, -13, -19, -31, -11, -40, -17, 29, -11, 15, -34, -22, -77, 55, 1, 24, 24, 31, 13, 97, -53, -31, -59, -35, 12, -20, 43, -63, 30, 1, 27, -15, -18, 1, -33, -13, -30, -9, 43, -39, -13, +16, -44, -21, -8, 1, 35, -5, -65, -2, -6, -11, 10, -32, -2, -14, -38, -30, -47, -31, -36, -10, -3, -51, 4, -37, -24, -4, -11, -13, 17, -9, -19, -11, 8, -40, 6, 53, 29, 26, 34, 12, 19, 76, 6, 19, -18, -3, -2, -21, 22, -33, -27, -28, 18, -30, -16, 12, -18, -30, -39, -12, 18, -42, -14, -6, -11, -32, -25, -9, 48, -10, -15, -57, -39, -28, -29, -18, -13, -4, -36, 3, +7, 30, -59, -13, 16, 3, -1, -28, -9, -26, -12, -7, -3, -8, -24, 14, 0, -2, -21, -2, 16, 3, -3, -9, 23, 56, -6, 18, -16, -1, 7, 0, 10, -6, 34, 14, 38, -19, -5, -20, -34, 4, 0, -3, -10, -33, 23, -15, -14, -2, -32, 20, 8, 5, -21, 7, -21, 35, -37, 12, -16, 19, -24, -30, -19, 10, -27, 39, 17, -20, -19, -8, -7, -39, -4, 10, -31, 8, -22, -13, 5, +18, 19, 3, 21, 1, -1, -13, -22, 21, -43, -11, -14, -4, -24, -1, -20, -31, -4, 16, 10, -25, -24, -16, -23, -3, -16, 0, -38, -50, 14, -38, -27, -40, 16, 20, 23, 14, -1, 15, 18, 46, -26, 38, -8, -18, -19, -24, -7, -30, -27, 26, 32, 18, -25, -31, -6, -37, -8, -14, -45, 44, 5, 19, 6, -17, 33, 1, 19, 15, -11, -30, -24, 115, -31, 8, -15, 25, -12, -8, 59, -28, +-60, 25, 31, -19, -18, 9, -26, 4, 33, -41, -13, -89, -17, -1, -27, -19, -73, 40, -3, -7, -27, -38, 9, -54, -18, 28, -34, 2, 21, 3, -28, 59, -71, -13, 65, 18, 29, -3, -28, -42, -44, -17, 47, 0, -1, -39, 19, -19, -12, 26, 26, 54, -3, -7, 24, 83, -1, 2, -40, 7, 24, -36, 11, 21, -1, 7, 24, -33, 17, 2, -40, -28, -4, 9, 21, -10, 0, -9, 2, -6, -30, +44, 34, 23, -13, -8, -8, 111, -10, -21, -33, -27, -37, -25, 25, -42, -23, -1, 46, -32, 19, -7, 1, -1, -23, -33, -9, -28, -28, -19, -12, 16, -28, 17, 28, -24, -11, -1, 38, 31, -13, 2, -2, 21, -42, 7, -19, -15, -27, -11, 6, -27, 47, 10, 33, -4, -11, -16, 56, -42, -24, -2, -8, -8, 35, 46, 1, 20, -14, -50, 0, 44, 5, -11, -18, -25, -27, 0, -14, 5, -48, -33, +6, 38, 6, 13, -5, -37, -7, -8, 60, -24, -4, 11, 1, 5, -18, 32, 10, -39, -22, -30, 50, 24, 7, -22, 20, 5, -27, -20, -36, -34, -3, -8, 4, 15, 22, 7, 28, 19, -16, 4, 67, -51, 31, -47, 5, -14, -7, 15, 19, 19, -9, -11, 19, 22, -22, -22, -44, -4, 52, -5, 6, -5, 33, 31, 16, -28, -22, -15, 5, 6, 27, 70, -64, 8, -25, 21, 21, -23, -19, 42, 0, +-35, 17, 13, 29, 2, -54, -5, -60, 15, -17, -14, -18, 39, 7, 39, 58, 60, -52, -20, -23, 12, -13, 2, -29, -22, -2, -24, -35, 5, 29, 8, -19, -40, -21, 1, 4, -5, -2, -39, -81, -32, 43, -22, 18, -5, 7, 62, 7, 62, -9, 2, -42, 28, -7, 74, -18, -31, -30, -24, -41, -12, -20, 15, 22, -8, -41, -17, -6, 5, -5, 20, -35, -40, 18, 12, -15, -30, 33, 2, 21, -12, +-26, -27, 36, -16, -2, -9, 26, -38, 13, -31, -11, 9, -15, 37, -1, 25, -13, -5, 5, 11, -30, -13, -41, -18, 42, -14, 6, -20, 37, 14, -2, -19, -8, 20, 22, 4, 49, 54, 1, -19, -24, -14, -1, -27, -12, 18, -3, -41, -23, -10, -12, 4, 6, -15, -3, -20, -23, -13, -12, -12, 33, 33, 18, 9, -2, 6, -1, 6, -17, -13, -14, -21, 8, -12, -10, 8, 23, 37, 4, -6, -6, +-14, 40, -4, -24, -30, 33, -40, 75, 0, 11, 19, -8, 14, -24, 22, -32, -1, 21, 8, 4, -5, -40, -26, -20, -1, -14, -13, 35, 30, 4, -30, -20, 2, 13, 27, -13, -5, -7, -42, 30, -13, -23, 4, -18, 34, 5, 13, -20, 5, 24, 9, -4, 23, -4, -20, 13, -42, -34, 3, 15, 26, -3, 9, -18, -40, 20, 22, -19, -28, 38, -28, 83, 4, 4, 40, -6, -5, -6, 25, -43, -6, +29, -8, 6, 3, -42, 8, -11, -5, -17, -6, -15, 13, 42, 82, -30, 19, 16, 26, -12, -24, -3, -10, -26, 0, -7, 45, -10, 34, 17, -5, 4, 13, 45, 8, -13, 74, -28, -35, -13, -20, 0, 25, -11, 23, 12, 18, -15, 10, -24, -48, -17, -27, -24, 4, 26, -19, -13, 2, 73, 42, -17, 34, 5, 7, 36, -5, -74, -24, 5, 2, -15, -10, -6, 2, -44, 7, 30, -8, -38, 0, -45, +-7, -18, -7, -22, -9, 14, 21, -3, -9, 24, 52, -7, -11, -27, -30, 55, -12, -35, -31, 8, 10, -18, -26, 12, -3, -31, 11, -4, -44, -30, -4, -48, 2, -4, -11, -61, -2, 35, 13, 10, 3, -8, 66, 18, 2, -8, -4, -1, -23, -11, -22, -44, 1, 29, 26, 5, 0, -41, -26, -5, -9, 23, -35, 16, -14, 20, 35, -1, -12, 3, -23, 22, -14, 7, -5, -42, -4, -35, -3, -11, -30, +-28, -9, 10, -17, 9, -61, 35, -7, -13, -3, -34, -12, -23, 27, -12, -29, 6, 57, 8, 35, 25, -2, 37, 2, 23, -17, -28, 11, 27, 5, -22, -5, 0, 13, 1, -14, 4, -36, 12, -13, -32, -30, -25, -16, 10, -24, -29, -32, 19, 28, 3, 19, 6, -1, 8, -9, 4, 10, -25, -8, 2, 19, -2, -12, -6, -26, 14, 15, 27, -6, -33, -3, 9, 28, -38, 0, 35, -29, -13, -40, 40, +24, 1, -1, -7, -6, -45, -16, -29, 8, -8, 45, -3, 28, 2, -8, 53, 20, 2, -4, 48, 47, -54, 3, -28, -7, -35, 11, -17, -65, -31, -42, -5, -31, -7, 24, -21, 56, 15, -21, -5, -35, -44, 71, -1, -8, -1, -25, 73, 59, 22, 42, 41, 22, -37, -28, -22, -11, -60, -31, 12, 0, -16, -25, 5, 5, -16, -14, -47, -2, 14, 7, -18, 12, -26, 95, -62, -19, 6, 24, 55, -23, +-31, 4, -1, 14, -38, 15, -20, -44, -19, 0, 26, -21, -11, -37, 27, -26, -3, 12, 0, -33, 31, 15, -6, -4, -35, -7, -9, 52, -3, -2, 78, -38, 1, 25, 11, -16, -50, -9, -33, -18, -25, 24, 22, -5, -12, -4, 14, 9, -11, -2, -14, -12, 34, 20, -24, -17, -6, 89, 18, 36, -5, -32, 43, 68, -14, -15, 16, -5, -5, 13, -27, -24, -28, -1, 14, -6, -14, -20, -14, 0, 5, +5, -13, 20, -31, -10, -27, 7, -33, 50, 7, -12, -2, -9, 36, 26, -1, -6, 43, -23, -4, -13, -8, -5, -22, 3, 20, -12, -51, -27, 26, 6, -11, 22, -23, 18, -32, -10, -8, -18, -2, 127, 15, 20, 13, -26, 59, -1, 4, -13, 44, -34, -20, 3, -12, -25, -17, -18, 24, -4, -26, -39, 36, 25, -6, 41, -18, 4, -38, -15, -9, -8, -10, 99, -1, 14, -12, -25, 61, 8, 14, -9, +30, 18, -14, 15, -18, -13, -12, -19, 16, 7, -14, -19, 3, 7, -6, 2, -26, 12, -29, 1, -29, -26, -40, 105, 25, 25, -6, -8, 67, -12, -10, 23, -13, -16, 37, -1, -38, -7, -52, -31, 15, -30, -44, 97, 19, -44, 0, -16, 40, -46, -17, -2, -16, -20, -19, -9, 43, 44, 23, -23, -5, 102, 9, 22, 39, 46, 18, -3, -10, -6, -17, -31, 19, -41, -17, -15, 15, -23, 26, -30, -65, +-14, -22, -2, 1, -4, -36, 58, 33, -53, -18, -15, 86, -17, -9, 18, 7, 32, 7, 8, -19, -27, -24, 7, 18, -25, -45, -34, 20, -35, -20, -18, -8, -39, 31, -23, -26, 5, -11, 23, -31, 47, 7, -16, 38, -15, 18, 52, 29, 25, -7, 4, -28, -16, 5, -30, 1, -63, -9, -37, -9, -28, 10, -4, -30, -3, 17, -6, -12, 10, -16, 41, -15, -17, 15, -15, 53, -64, 7, 55, -9, -20, +-9, 19, 0, 27, -41, 6, 42, 27, -29, 11, 30, 9, -12, -37, -22, 6, -8, -15, 47, 19, -13, 2, 29, 3, -18, -9, -5, 4, 2, 43, 24, -23, -11, 30, 22, 18, 6, -15, -19, 38, -13, -37, -10, 0, -5, -26, -32, 14, -6, -33, 15, -30, -9, 4, -24, -11, -13, 5, 0, -25, -15, 40, 30, -3, -25, -14, 1, -22, -18, -25, -25, 30, 2, -23, 9, 14, 0, -60, -25, 14, 21, +-35, 18, -32, -22, 10, -5, -14, -24, 12, -41, -10, 8, -16, -10, 1, 6, -2, -38, -20, -16, -3, 20, -5, -23, 10, 27, 22, -19, -15, -18, -29, -22, 1, 25, 26, 80, 9, 1, -18, -17, -10, 35, 5, 23, 2, -54, 35, -7, 79, 45, 1, -23, -17, -26, 28, -45, 86, 81, 10, -42, -19, -3, -48, 1, -41, -10, -11, 3, -46, 12, -28, 5, -35, 29, 2, 5, 60, 12, -23, 19, 14, +11, -30, -41, 22, 3, 49, -45, 7, 30, 9, -34, -67, 5, -22, 15, -37, 14, 40, 20, 5, 27, -35, -31, 3, -11, -6, 4, 16, -14, 14, 3, 0, -42, 17, -3, -16, -28, 26, -9, -27, 12, 65, 2, -28, -36, -8, 17, -17, -7, 18, 34, 6, -21, 10, -38, 25, -3, 30, 20, 10, 15, -12, -3, -17, -24, -38, -12, -13, 19, -12, -8, -4, -2, 16, -35, -12, -31, -16, 11, -5, 30, +3, 32, 1, -4, -12, -16, 41, 16, 10, 6, -7, -2, 25, -7, 26, -4, -16, -16, -19, -43, 3, -8, 11, 34, -10, 15, -18, -1, 45, 42, -11, -5, -11, -23, 2, 12, -17, -14, -8, -3, 6, 10, 1, -17, 10, -26, -2, 9, -22, -44, 7, 17, 23, -14, -10, 14, 9, -7, -46, 51, -6, 42, -20, 8, 28, -37, 1, -6, 25, -28, -12, 31, -8, 4, 29, 3, 5, -1, -1, 6, -16, +-15, 10, -23, 20, -36, -4, 30, -3, 9, -8, 7, -3, 24, -33, 5, -21, -13, -4, 21, -13, -14, 3, 9, 2, 6, -12, -24, 9, -26, 10, 19, -16, -53, -9, -10, 14, -14, 27, 22, 20, -24, -59, 43, 17, 54, -24, 6, 7, -33, 6, -6, -12, -17, 16, 24, -2, -14, 19, 13, -15, -38, 32, -8, -42, -10, 19, -29, -10, -14, -16, 26, -1, -38, 2, -1, 31, -9, -11, -20, -26, -22, +-22, -31, 6, 1, -22, -35, 14, 16, 29, -17, 17, 41, 38, 23, -6, -53, 18, -15, 95, -23, -16, 35, 36, -6, -3, -29, 6, -6, -18, 84, -11, 58, 7, 52, -13, -18, 8, 43, 19, -46, -5, -5, 7, -19, -7, -29, -1, -6, -24, -9, 44, -19, -9, 17, 27, -17, -43, -15, -7, 53, -28, 2, -4, 64, 21, -13, -9, 8, 0, -5, 41, 27, 2, -28, 38, 3, 9, -27, -5, 7, 8, +18, 8, -32, 10, 49, 16, -38, -49, -6, -1, 56, -60, -1, 52, 62, -16, 5, -18, -2, -6, -12, 16, 16, -11, -9, 5, -17, -7, -8, 16, 10, -5, 0, -8, 32, -3, -30, 24, -18, 13, -38, 18, 0, 2, 16, 0, 11, 121, -16, -23, -20, -28, -20, 1, -20, -32, 11, -47, -41, -3, -23, -11, -2, -3, 19, -24, 18, -19, -27, 42, 58, -28, -23, 4, -10, 1, -12, 12, 23, 1, 8, +-8, 2, -8, 25, -12, -37, -12, 24, -27, -14, 6, -33, -5, -7, -13, -17, -2, 3, -12, -6, 54, 54, 43, -32, 20, 1, -25, -18, 26, -13, 76, -11, -29, 22, 11, 15, -15, -8, -28, 7, 1, -7, -12, -13, -7, 31, 67, 4, -4, 47, -5, -7, -10, 3, 51, -18, 20, 38, 17, -10, 30, -18, 127, -10, -40, 8, 67, -33, 25, 0, 13, -10, 8, 85, 9, -19, 19, 35, 40, -6, 0, +-35, 8, 19, -24, 13, -36, -43, -36, 75, -20, 29, -24, -35, 119, -53, -80, -36, 0, -13, 20, -21, -2, -23, 4, -42, -7, 8, 6, 30, 4, 36, 1, 74, -5, 1, 7, -24, -11, -20, -33, 52, -7, 22, -4, -9, 111, -28, -39, 22, 61, -31, 32, -17, -70, -28, 1, 15, -3, -15, 7, -16, 7, 21, 0, -9, -9, 14, -5, 24, 26, -40, -39, 43, 8, -14, 22, -16, 82, -14, -39, -21, +16, -21, 26, -22, -8, -12, -16, 8, -19, -12, -1, 22, 73, -25, -15, 59, -19, -24, -8, 70, 50, -56, 38, 3, -24, 15, 1, -5, 127, -4, -29, -13, 14, -31, 58, 29, 16, 10, 9, 18, -13, -3, 17, 19, -7, -13, -10, -3, 13, 38, -6, 34, -18, -27, -11, 21, 19, 12, 10, -8, 78, -30, -40, 8, 33, -5, 4, -36, 3, -2, 7, -62, -6, -25, 1, -20, 31, 20, -10, -48, 0, +-53, -10, 1, -10, 7, -47, 15, 0, 25, -42, -16, 95, -20, -22, -5, 49, 13, 45, -26, 13, -2, 17, -50, -16, -9, -17, -20, 22, 12, 9, 2, -3, -39, -7, 50, -6, -17, 9, 19, 6, -11, -4, -5, 53, -18, -41, 27, 60, 2, -1, -20, 0, 16, 17, -28, -13, -18, 31, 6, 4, 13, 12, -12, 16, -10, -15, 7, -26, -5, -35, 31, 18, -13, -21, -8, 104, -19, -29, -22, 41, -5, +64, -36, -27, 59, 20, -13, -20, -23, 26, -13, 22, -3, 4, -17, -18, 3, 21, 24, -26, 85, -33, 26, -1, 13, -30, 2, -21, -43, -20, 7, 60, -18, -3, -43, -6, -5, -53, 7, -22, -30, -18, -31, 49, -28, -35, 34, -9, -19, 9, 7, 26, -26, -44, -11, -5, 5, 15, 13, 127, -39, -12, -27, 5, -26, 58, -14, -25, -10, 5, 53, -30, 14, 9, -25, 23, -15, -51, -21, 10, 26, 5, +53, 38, -25, 52, 37, 27, -9, -20, -17, 113, -34, -41, 9, 8, -62, 23, -18, -38, -40, 1, 63, -5, -28, 11, 26, 3, -8, -2, -25, 17, 40, -7, -40, 21, 11, -48, 70, 6, 6, -30, 21, 100, -26, -67, -15, 97, 0, -4, -36, 4, 30, 22, -2, -19, 15, -45, -12, 27, 8, -29, -18, 23, 64, -16, 8, -9, -17, 36, 21, -39, 9, 1, 3, 31, -28, 58, 41, 19, -80, 69, -51, +8, 7, 5, 16, -22, -25, -4, -8, 11, 20, -19, -10, 15, 12, -10, 64, -18, 2, 35, -23, -26, 46, -8, 22, -4, 6, 46, -10, -3, -42, 69, 43, -4, -8, -47, 31, 3, 11, 12, 13, -18, 19, 49, -18, 6, -36, -25, -9, 10, -14, -39, -14, 21, 11, -16, 28, -36, 51, 12, -19, 3, -13, 30, 22, -43, -33, -17, -34, -8, 22, 17, -20, -8, 29, 58, -29, 68, 27, -4, -11, -8, +-8, -20, 21, -2, -23, 10, 29, -18, -10, -30, 17, 4, 47, 114, -6, -32, 0, -25, -36, 15, 43, -3, -9, -16, 34, 89, -23, 3, 8, -19, 34, -5, -8, -40, 28, 4, 16, 16, 2, 19, -18, -24, -2, 7, 14, 123, -1, -21, -23, -15, -28, 72, -2, 7, 12, -15, 41, 39, -14, -16, 30, -6, -36, -37, -8, -43, 39, -4, 24, 51, -14, 51, -29, -25, -5, -5, 6, 120, 7, -2, -12, +-6, -8, -49, -2, 19, 4, 2, 30, 54, 5, 0, 54, -9, 41, -54, -4, -23, 13, 21, 17, 9, -23, 22, -35, -22, 15, 4, 1, 127, 3, -15, -35, -45, -37, 36, -12, -10, -10, -6, 33, 59, -14, 55, -8, -18, 10, -24, -22, 22, 18, -24, 3, 10, 10, 7, -5, -27, -7, -26, 34, 127, 20, -19, 2, -23, 6, 112, -9, -8, -6, 7, 17, 19, -13, -30, 0, 1, -34, -37, -11, 29, +10, -3, 19, 52, -3, 63, -23, -16, 10, -11, -33, 127, 11, -24, -28, -18, 11, -55, -4, 24, 7, -13, 26, 59, -3, 9, 17, 6, -39, 10, -11, -38, -4, 7, 29, -30, 8, -2, -7, -14, 5, -3, 12, 113, 44, -9, -41, -13, -29, 0, -5, 6, 1, -22, 20, 23, -27, -15, 43, 10, -22, 11, -19, 12, 33, -25, 22, 41, 45, -57, -5, -6, -11, -10, 22, 126, 3, -36, -18, -1, -15, +5, -24, -6, -3, -17, 59, 62, -30, 0, 74, -16, 62, 8, 0, 0, -28, 18, 35, 10, -25, 53, -6, 6, 2, -5, 30, 127, 54, -11, 66, 10, 36, 50, -4, -15, 11, -18, 24, -8, -17, 15, 28, 7, -21, -12, -5, -18, 16, -36, 50, -14, 39, -31, 90, -21, -36, 0, 35, 127, -27, 6, -3, 32, 12, -10, 2, -27, 19, 7, 13, 33, -17, -15, 13, -23, 25, 25, -6, 30, 2, 16, +3, 17, -5, 127, 7, 1, 8, -33, 4, 78, 28, 11, 11, -36, -4, 7, 5, -16, 26, 20, 30, -3, -15, 22, -3, -59, -33, 60, 16, 34, 34, -11, 39, 17, 32, -17, 50, 1, -21, -7, -32, 127, 1, -17, 2, -6, -13, 37, 12, -12, 1, 0, 11, -21, 12, 13, 8, -6, -13, 7, 7, 11, 23, -18, 18, 17, 14, -7, 35, -22, -8, 0, 8, 86, 9, -16, -8, -73, 19, 16, 8, +21, -31, 46, 22, 21, -7, 59, 26, 6, 42, -26, -13, -25, -55, -26, -14, -44, 6, -11, -27, 25, -34, 7, 3, 1, -5, 37, -5, -20, -47, 4, 34, 3, -15, 48, -32, -16, 3, 54, 24, 22, -31, 8, 38, -30, -33, -4, -14, 81, 9, -32, -20, 9, 2, 13, 1, 30, -6, 47, -9, -24, -26, -32, 3, 1, 17, 53, -8, -12, 0, 38, 20, -10, -39, 34, 15, -1, -11, 14, -13, 74, +-6, -13, 4, -29, -6, -17, -30, 43, -1, 46, -23, -29, -19, -16, 27, 15, 39, 22, 50, 9, -7, 31, 2, 22, 4, -26, -18, 30, -45, -16, -52, 0, -18, -23, 8, -6, -18, -11, -25, -12, -19, -3, -21, -27, 0, -1, 18, 3, 35, 25, -6, 11, 4, 27, 24, 17, 16, -45, 18, -14, -53, -8, -3, 31, 28, -21, 20, -24, -3, -15, -44, 2, 4, 13, -40, 7, -2, 19, 29, -21, 14, +-23, 75, -1, 23, 60, 44, -3, -1, -36, 5, 6, -38, -10, 13, 12, 36, 3, 25, -10, 4, -28, -47, 6, -33, -4, 9, -22, -10, 2, 51, -16, 1, -40, 54, 13, 15, 27, 44, 32, -16, -20, -21, -36, -25, -16, -31, 8, -3, -26, -18, -3, 16, -25, -43, 24, 17, 66, -35, -3, -29, 27, 61, 40, 40, 49, 26, -26, 10, 100, 49, 26, -34, -13, -11, -29, 11, 28, -22, 6, 11, -29, +14, 2, -6, -21, -29, -27, -41, 12, -35, -22, -21, -35, 109, -4, -5, -42, 77, -24, 9, 68, 94, 1, -24, -10, 10, -20, -17, -11, -1, 32, 15, -21, 19, -7, -36, -40, -46, 41, 5, 42, -26, -42, 6, -9, 16, 19, 23, 53, 53, 4, 1, 18, 63, 31, -6, -18, -2, 127, -37, -7, -36, 12, -47, -16, 6, -2, 10, 2, -39, 2, -39, 18, -18, -27, -9, -9, 23, -28, 23, 31, 48, +2, -8, 68, 64, 43, 14, -14, -25, 83, -24, -20, -18, -22, 6, -25, 18, 1, 10, 15, -27, -23, -25, 10, -42, -28, -23, 6, 48, 17, 35, 20, -2, -10, 4, 42, 72, 31, -32, 12, -24, -4, -69, -6, -19, 14, 30, -27, -47, 18, 19, -28, 1, 35, -20, -1, -44, -19, 10, -34, 94, -37, 40, 61, 9, 2, -14, 55, 95, 21, -27, -24, -13, 50, 1, 4, -64, -35, -2, 4, -7, -14, +-34, 13, -33, 12, -20, 2, -24, -1, 0, -3, 66, -9, 27, 10, 66, -28, 4, 58, 56, -3, -18, 23, 11, -48, -10, 29, -33, 39, -9, -16, 11, -9, -27, 3, 3, 44, -25, 19, 1, -36, -18, -36, 70, -25, 6, 64, -3, -13, 8, 96, 41, -18, -51, 13, -2, -5, -31, 28, -31, 13, -3, 11, 13, 3, -64, -14, 10, 22, -18, -5, -8, -9, -33, -3, 46, 0, 11, 34, 26, -15, -3, +23, 41, 4, -9, -10, -2, -31, -21, 2, 2, -42, -7, -6, 6, 6, -19, 15, -9, -11, -11, 12, 13, -14, -3, 4, 15, -5, 50, 9, 21, 21, -27, -45, -2, 15, -9, -28, 3, 46, 127, 25, -1, 7, -39, -22, 13, -10, -41, 11, 13, -10, 3, 10, -10, 10, -23, -64, -61, 20, 0, 23, 89, -34, -21, 19, -15, 44, -47, -33, -11, -14, -37, -56, 5, -7, 127, -23, 32, 8, -24, 45, +0, 6, -23, 16, -1, -6, -7, -26, -21, -5, 11, -8, 6, -30, -15, 52, 1, 22, 17, -4, -31, -2, 127, 97, -4, -35, -34, -30, -23, 11, -20, 4, 94, -3, 22, 3, -8, 2, -31, -23, -18, 35, -27, 21, -10, -19, -9, 3, -32, -18, 86, 51, 6, -30, 3, 100, 11, 3, 5, -12, 2, 20, 8, -9, 78, -15, 49, -16, -11, 12, -26, -7, -10, 13, -22, -24, -2, -3, 4, -29, -14, +-10, 51, 14, 39, -21, 63, 42, 39, -1, 127, -30, -13, 28, 23, 22, 66, -38, 4, 21, -2, -5, -10, -53, -34, 12, -41, -32, -36, -14, 4, -7, -37, -30, 46, -17, -17, -37, -69, 113, -26, -32, 89, -15, 12, 34, -26, -55, 66, 2, 2, 32, -8, -23, 3, -35, -30, -5, -50, -48, -27, -28, -10, -27, -24, -19, 59, -39, -13, -13, 22, 49, -30, -10, 22, -17, 14, 50, 9, -43, 56, -13, +12, 36, -46, -26, -43, 15, -18, 36, -26, -29, 5, -17, -4, -24, -46, 5, 3, -19, -7, -15, -26, -88, -18, -23, 124, -29, 35, 18, -39, 63, 91, -16, -14, 46, -24, 10, -15, -54, -3, 23, -18, -74, 5, -14, 0, 28, -7, 16, 13, -40, -16, -16, -29, 55, -44, -10, 105, 9, -15, 80, -17, -19, 60, -22, -15, -12, -13, 16, -34, 13, 4, -11, 13, -12, -44, 23, -15, 14, -34, 12, 55, +101, -12, 17, 114, -52, 26, 4, -42, -16, -27, 11, -13, 40, 60, -19, 19, -11, 30, 49, -37, -30, 21, -9, -24, -3, -41, -20, -6, 7, -21, 8, 58, 86, 18, -23, -38, 127, 8, -25, 15, -31, -18, 24, -28, -13, 67, -5, 38, 13, -24, 38, -7, -6, -10, -30, -36, -25, -33, -24, -15, -19, -37, 33, 72, -30, -3, -13, -26, -78, 20, -24, 76, -30, 14, 32, -1, -1, 71, -17, -9, 7, +-27, 3, -20, -29, -17, 2, -5, 22, 38, -75, -24, -48, -12, 23, 39, 29, 24, -7, -61, 95, -6, -27, 122, 31, -11, 23, -8, -20, 79, -14, 22, -4, -33, 19, -37, -45, -30, -7, -35, -21, 5, -26, -13, -7, -16, 23, 42, 11, -23, 11, 30, 49, 12, -6, -10, 0, -11, 20, -7, 15, 23, -11, -9, 2, -16, 15, 0, -39, 23, 0, 20, -29, 68, -21, -8, 12, 14, 42, 68, 12, -18, +-6, -30, 101, -61, -11, 25, -3, -7, 29, -40, 1, 3, 10, 10, -21, 0, 7, -34, -12, -10, 7, 9, -7, 33, -4, -7, -15, -9, 5, 9, -16, -2, 6, 127, 7, -2, -11, 75, -1, -4, 8, -23, 62, -14, 3, -7, 54, -8, -25, 34, -23, -20, 9, 16, -22, -17, -11, 8, 87, 9, 52, -10, 32, -18, 20, -8, -15, 39, 25, -4, -25, 81, 37, -1, 60, -1, -31, -14, -36, -20, -6, +-28, -41, 10, 11, -2, -16, -20, -18, 1, -66, -9, 22, -5, 1, 6, 24, -47, 3, -6, -5, 0, -5, 84, -10, 6, -5, -2, 0, 56, 28, -13, -25, -30, -6, 29, -4, 1, 23, -7, -3, -7, -9, 10, -13, -1, 19, -17, 51, -21, 52, 2, -46, -5, -14, 39, -8, -55, 5, -22, -22, 58, 53, 10, -18, -10, 37, -39, 26, 4, 2, -11, -26, -34, -38, 19, 13, -20, 7, 17, -2, 1, +55, -8, -21, 31, -40, 43, 10, -53, -7, -26, -36, 40, -16, -14, -8, -20, -3, -19, 38, 12, -14, -33, -12, 13, -38, 9, 61, -8, -12, -6, -15, 8, -23, -20, 16, 21, -26, -40, 25, -33, 2, -19, -18, 46, 63, -19, -28, -32, -11, 64, 69, -1, 14, -19, -21, -3, -41, -28, 35, -1, -6, 26, 22, 21, -21, -13, -8, -20, -28, -45, -12, -35, -3, -37, 10, 35, 85, -5, -9, 2, -10, +47, 66, 14, 18, 1, -16, -54, -25, -15, 15, -11, 32, 6, 29, -2, -55, -26, 10, 0, -35, -26, 13, -26, 20, -20, -19, -24, 52, -5, -33, -8, -2, -52, 70, 11, 26, -58, 13, -49, -25, -16, 61, -7, 15, 15, 18, -15, 22, -20, -1, 48, -16, 2, -16, -23, 1, -32, -4, 57, 103, -21, -6, -9, -18, 82, 64, -12, 42, -22, 0, -24, 23, -3, -7, -3, 3, 7, 25, 12, -12, -30, +5, -53, -16, -4, -15, -26, -34, -25, -15, -33, -10, -24, -13, -13, -25, 27, 33, 2, -5, 3, -12, 17, -33, 24, 31, 11, 8, -16, -20, -12, -40, -13, -20, -2, -44, 37, 23, -40, -6, 8, -9, 43, 9, -17, 6, -25, -11, 49, 25, 13, 21, -19, -13, 7, -38, 27, 34, -9, 14, -27, -13, -12, -31, -19, -6, -22, -55, -2, 8, -42, -22, -10, 8, 20, 29, -22, -2, -14, -44, 54, 73, +22, 4, -22, -6, -23, -49, -20, 8, 10, 24, 43, -11, -31, -27, 21, 9, -8, -21, -24, -20, -22, -5, -1, 17, 48, 77, -21, 6, -16, 13, 35, 37, 39, 6, -31, -38, -27, -50, 45, 8, 18, 5, 13, 59, -44, -12, -10, -31, -24, 2, 29, -10, -65, -6, -4, -25, 28, 84, -8, 22, -9, -4, 37, 61, -7, 15, -4, -20, -21, 2, -18, 33, 1, 12, -3, 10, -16, 34, -23, -19, -22, +7, 3, -9, -23, -22, -8, -36, -40, 111, -27, 19, -45, -4, 17, 52, 10, 28, 14, -9, -34, -17, 5, 10, -1, -18, -23, 73, -29, -30, -14, -20, 11, -9, 46, -29, -25, -14, 16, -28, -2, 10, 1, -3, 3, -6, 1, 27, 13, 10, -6, -9, -14, -12, 1, 19, -3, -4, 4, 25, -34, -13, -17, 4, -7, -1, 50, -6, -6, -13, 1, -10, 14, 32, 14, 15, -6, -1, -35, 23, -10, -43, +9, -31, 17, 3, -8, -2, -13, -21, -69, 33, -35, 1, 17, 42, 30, 56, -10, -36, 40, -15, -6, -12, 16, -39, -32, -20, -8, 23, 12, 30, 11, -24, -17, -14, 15, -23, -15, 13, -49, -16, -63, -32, -26, -7, -21, -39, -8, 23, 27, -36, 33, -12, -11, -46, 55, 18, -30, -7, -12, -33, 36, 50, -12, 10, 3, -25, -26, 37, -3, -8, -18, -25, -35, 17, -13, -26, -15, -33, 4, 36, -3, +39, -7, -9, -44, 12, 35, -21, 5, -17, 5, -30, -26, 34, 60, -17, -40, -5, 60, 11, -33, -38, -6, 29, -36, -25, -15, -15, 38, -10, -10, -25, 1, -5, 11, 12, 17, 30, 12, -11, -31, -18, -49, -23, -7, 25, 35, 30, -14, -5, 61, 19, -45, -36, -6, 15, -51, 19, -53, -22, 5, -15, -16, -30, -2, -11, -4, 9, 2, 24, 56, -39, -36, -28, 6, -18, -11, 48, 47, 127, -1, -5, +43, 15, -17, -12, 8, 66, -24, -22, 8, -12, 21, -2, 0, -27, -26, -7, 18, 22, 21, 68, 62, -58, -3, -23, -6, -30, 7, 32, 49, 87, -23, 2, 58, 26, 25, -22, 2, 9, -11, -10, -27, -25, 1, -13, 4, 14, 18, -4, 36, -8, 10, 19, 50, -73, -19, -27, -18, -29, -26, 45, 26, 37, -28, -20, 42, 21, 8, -36, 41, 4, -22, -25, -8, -13, 27, 19, -13, -37, 17, -6, -12, +2, 22, 14, -19, -38, -36, -16, -22, -27, -12, 45, 74, 121, -9, 0, 22, 43, -21, 51, 16, 59, 23, -5, -18, 1, -22, -35, 4, -42, -10, -32, -4, -4, 7, 48, 70, -26, -19, -25, 10, 8, -35, 42, 23, -3, -15, -24, 35, 15, -10, -28, 6, -14, -52, -32, -45, -33, -13, -21, -22, -20, 2, -4, 38, 12, 10, -27, 45, -23, -8, -5, -9, -6, -22, 23, 31, -45, -49, -25, 49, 17, +-3, -8, -15, 26, -23, 4, -22, -18, -2, -25, -13, -34, 19, 15, 23, 12, -13, 13, 78, -51, -31, -20, -6, 22, -3, 33, 20, 49, -38, -42, 62, 12, 14, 17, -2, 26, -10, -58, -36, 3, -5, 11, -14, -1, -19, 33, 7, -8, 13, 13, 64, -65, 4, -4, 8, -30, -30, 33, 17, -43, -30, -42, 0, 40, -32, -28, 11, 12, -10, 48, 2, 95, 2, -18, 9, 9, -12, 14, -28, -2, -19, +31, 62, -39, -34, 8, 12, -27, -26, 40, 36, 17, -14, -33, 36, 5, -18, -14, -14, 9, -11, -24, -6, 28, 7, -12, 3, 17, 3, -15, -21, -7, -6, 32, 56, -44, 16, 8, -10, -8, -7, 42, 30, -51, -24, -29, 11, 37, -36, 1, -29, -31, -31, -10, 6, 31, -37, -33, 0, 39, 48, -25, 14, -11, -31, -8, 51, -43, 0, -10, 8, 11, -15, 13, 20, -42, -25, -7, 15, 25, -29, -26, +-2, 0, -19, 16, 0, 32, 3, 0, 3, -4, 16, -2, 3, -9, -1, 20, 44, 22, -13, -43, 17, 14, -4, -27, -66, -11, -4, -40, -52, -35, -4, 19, 6, 24, -20, 50, 4, 14, -8, -2, -48, -13, 18, 59, -6, 15, -22, -39, -2, -43, 18, -18, 63, 10, -16, -17, -37, 26, -3, -5, 5, 25, 16, 32, 28, 0, 10, 33, 35, -10, 9, -17, -8, -5, -28, -37, 15, -17, 9, 66, 50, +-15, -30, -69, 26, 1, 11, -8, -15, -13, -4, 17, -16, 2, 4, 2, 0, 26, -26, 2, 33, -4, 16, -17, -26, 95, 16, -19, -35, 3, 19, -12, -9, -24, -17, -15, 16, 5, -11, -36, -16, 43, -19, -3, -18, 7, -3, -39, 5, 19, -31, -35, 53, 5, 7, -19, -7, 38, -15, 17, -24, -18, -1, 46, -15, -2, 12, 1, 24, 19, -27, -46, 4, -29, 3, -15, -18, 41, 30, -1, 8, -3, +-22, -9, 36, -14, 6, -11, -3, 50, -13, -9, -13, -10, 10, -10, 4, 6, -16, -22, -4, -18, -41, -29, -47, -2, -15, 0, -51, 27, -6, -66, -24, 17, -68, -13, 2, 29, 35, -23, -39, 43, -22, -11, -2, -10, -7, 102, 0, 12, -45, -71, -14, -7, -25, -14, -28, 2, -9, 23, -31, 57, -4, -3, -29, 13, -50, -18, 17, 25, 19, -34, -19, 27, 35, 6, -12, -21, -24, 116, 10, -27, -39, +-6, 29, -25, -39, 3, -6, 19, -43, 22, -22, -25, 14, -61, -7, 43, -39, 20, 39, 16, 7, -2, -31, -6, -31, 6, 14, -43, -33, 69, 1, 12, -39, -43, -57, -42, -34, -30, -38, 9, 3, -4, -28, 12, -5, -6, -6, 22, -20, -1, -4, 41, 29, -12, -1, -41, -32, 19, 8, -2, -51, 102, 12, 10, -4, -34, -34, -17, -44, -27, -17, 20, 11, -13, -16, -20, 16, 14, -2, 14, -8, 5, +-50, 7, 41, -18, -12, 32, -11, 15, -8, -8, -16, -24, 19, -33, 3, -10, -22, -22, -30, -6, -3, -2, 15, -26, -4, 12, 2, -11, 4, 11, -30, -33, 25, 2, 22, -10, -26, 14, -47, 27, -26, -1, -27, -3, 10, -10, -27, -4, -35, -29, -10, -22, -17, -3, 20, 25, -15, 28, 21, 31, -28, 5, -23, 0, 4, 24, 13, -24, -13, -12, 2, -1, -33, -8, -33, 22, 24, -3, -3, -14, 7, +-18, -7, -41, -10, 32, -13, 63, -13, -62, -4, 7, -21, -15, -2, -28, 11, -1, 50, -4, -32, 14, -60, 92, -4, -26, 10, -71, 11, -15, -11, -7, -25, -14, 22, -18, 4, -29, 6, 19, -38, 4, 8, 13, -21, 17, -12, 18, 16, 16, 44, -23, -2, -14, 28, 44, -8, -28, -25, -2, 8, -6, 30, -55, 29, -40, -41, -31, 1, -23, -15, 36, -16, -21, 11, 62, -22, -10, -26, 5, 40, 41, +9, -12, -40, -23, -47, 11, 3, -25, -9, -44, 34, -3, 25, 4, 4, -9, -14, -29, -22, -5, -9, -1, -4, -28, 16, 37, -8, -1, -11, 7, 0, -1, 5, -8, 1, -20, -22, 10, 6, -25, -3, 21, 25, -57, 2, 25, -26, -51, -20, -39, -8, 23, -58, -4, -25, -5, 41, 27, -23, 24, -3, -40, 17, -7, 1, -17, 9, -2, -22, -3, -30, -36, -31, -3, 50, 40, -18, -16, 30, 30, 16, +30, -25, -7, 50, 34, -1, -9, 71, 8, 16, -11, -30, 12, -22, -17, 61, 12, 10, 21, 25, 1, -30, -34, -18, 0, -7, -33, 22, -16, -26, -11, 32, 2, -19, 6, -7, 29, -6, -18, 9, 0, 3, -9, -15, 8, 24, -26, 12, -35, 40, -7, -5, -8, -9, 9, 3, -28, -1, 6, 13, -14, 9, 20, -25, -8, -6, -24, -28, 26, -7, -21, 5, -13, 4, -62, 23, 27, 30, -32, 2, -5, +16, 15, -43, -2, -10, 18, -17, -3, 8, 1, 0, -19, -26, 14, -43, -45, -9, -8, -19, 19, -26, 23, 21, 5, -5, -3, 30, -27, 12, -27, 30, 26, 45, -12, 1, -10, -11, 11, 6, -9, 1, 0, 26, -8, -12, 33, -18, -31, -11, 29, 19, -4, -27, -6, 8, -7, -2, 1, -2, 32, 6, -36, -11, 5, -10, 17, -47, -23, -6, -18, -64, 3, 16, 7, 14, -9, -41, 12, -26, -30, -1, +-2, -3, -6, 0, -6, -11, -10, -16, -9, 16, -1, 15, -17, -8, -3, 28, 17, -32, -39, -9, -28, -37, -15, -3, 39, -12, -5, 19, 32, -63, -44, -21, -19, 12, 25, -5, 9, 4, -2, -18, -57, -26, 38, -2, -38, 50, -25, 35, -9, -47, -4, -6, -17, -73, -13, 1, 41, -30, -2, -27, 30, -36, 0, -25, -25, 17, -4, -26, -4, -16, 13, -14, 18, -13, 43, -17, -35, -25, -26, -5, 9, +-24, 8, -42, -19, -37, -8, 31, 56, 26, 15, -32, -6, -3, -6, 1, -19, -53, 26, -27, -3, -1, 13, 1, -53, 1, 3, 11, -19, 38, -42, 9, 16, 15, -17, -19, 14, -29, -27, -19, 36, 36, -13, 11, 7, -2, -17, 14, -16, -42, 39, -28, -6, 7, 17, -14, -30, 15, 25, 19, -51, -5, -29, 2, 29, 11, -43, -13, 0, -6, -22, -9, 22, -26, -26, -16, -14, -28, -53, -34, -23, 0, +33, -22, 42, 33, 2, -31, -34, 25, 44, -19, -50, 39, 14, -17, -2, 11, -17, -29, -33, -48, 1, -9, 63, -5, -11, -34, -32, 5, 32, 13, -19, -105, 18, -18, 3, -24, 13, -38, -25, -24, 44, 0, -38, -23, 28, 5, -15, -13, -60, -10, -59, -40, -24, -17, 51, -8, -36, -50, -7, -7, 7, 16, -22, -33, 39, 35, 6, 7, -2, 6, -20, 17, 15, -2, -20, -13, -16, 19, -7, -32, -17, +-32, -24, -10, -18, -1, 79, 7, -25, -43, 7, 23, 26, -2, -1, -27, 6, -22, 18, -15, 43, -7, -4, -18, -6, -12, -32, -9, 24, 5, 19, -11, -39, -26, -39, -25, -21, -11, 46, -7, -26, -11, -12, 7, 9, -9, 5, 19, 12, -3, 15, 19, 24, -1, -32, -13, -28, -8, -14, 13, 14, -1, 3, -1, 7, -23, 0, -14, -4, 2, 30, 17, -1, -17, -25, -28, 27, -21, -31, -21, 26, -60, +-9, 13, 19, 50, -39, -18, -5, 50, -28, 36, 1, -28, 37, -3, -31, 13, 17, -36, -42, -21, -11, 7, 4, -41, 2, 0, 4, 49, -27, 21, 31, 40, -56, -13, 4, 5, -28, -47, -28, -17, -2, -2, -2, -19, 92, -28, -25, 4, -36, 23, 2, -23, -11, -10, -18, -57, -6, -12, 13, -25, 19, 19, -9, 59, -28, -8, 31, 10, 9, 9, -34, 33, 28, -25, 14, 0, 68, 11, -20, -5, 7, +35, -24, -6, 25, 1, 0, -43, -15, 2, -9, -10, 70, 14, -12, -5, 24, -4, 15, -25, 49, -5, 31, -5, -19, -34, 29, -10, 127, 3, -17, 17, -9, -2, 3, -54, 2, -3, 3, -52, -22, -29, -7, 36, 54, -4, -22, 8, 10, 5, 5, 104, 10, -25, -5, 16, 19, 11, -2, 10, 105, -14, -21, 8, 7, -25, 21, -20, -5, -28, -46, -13, -15, -16, 25, 8, 0, 23, -11, 4, -19, -3, +32, -63, 42, -14, -60, 39, 17, -25, 21, 22, 89, -6, -23, -6, -29, -44, 21, 13, -18, 13, -14, -25, -22, -16, 27, -19, 19, 3, 1, -20, -22, -6, 15, 8, 9, 34, -52, 51, -5, -22, 15, 33, 63, -22, -26, 15, -8, -27, 16, 12, 2, 5, 63, -72, -10, -19, 1, 59, 64, -6, 30, 26, -20, 0, 63, -31, 62, -14, -34, 16, 24, -8, 72, 6, 122, -4, -28, -5, -37, -35, 25, +-21, -21, -46, -21, -15, -11, -29, 46, 30, -13, 13, 15, -14, -2, -11, 50, -56, 49, -46, -41, 39, -17, -28, 28, 0, 68, 3, -46, -1, -12, -25, -4, 30, 2, -36, -12, -57, -14, -40, -20, 3, 34, -16, -9, 37, -7, -11, 56, 99, 45, -39, -19, -7, -21, -4, 10, -3, 74, -21, -14, 22, 16, 29, -2, -15, -1, -24, -6, -36, -10, -12, -19, -2, 8, 5, -12, 12, -2, 10, 32, -26, +36, -38, 21, 18, -19, -41, 5, -20, 109, -9, -21, -7, -16, -8, -13, -11, -41, -6, -8, -12, -2, 6, 34, 69, 25, -11, 20, 26, -19, -24, 53, 41, 48, -43, -56, 36, -9, -3, 36, -7, 86, -17, -48, -6, 5, 9, -7, -4, -58, -28, -22, -1, 25, 12, 0, 0, 8, -7, -19, -53, -7, -40, 60, -33, -18, -24, 112, 39, -42, 0, 52, 46, -26, 0, -40, -9, -43, -7, -18, -21, -32, +-10, -19, -19, -5, -6, 43, -40, 19, 25, 1, -44, -7, -30, 47, -20, 24, -17, 10, 21, -37, -4, -16, -8, -62, 37, -15, 9, -2, 24, -5, -28, -18, -52, -42, -20, 20, -34, 33, 19, -7, 4, -32, -29, -11, -26, 22, -37, -21, -38, 43, 98, -4, -23, 7, 18, -7, -7, -50, -10, 6, -9, -43, -21, -18, 13, -19, -6, -8, -4, 18, 18, 17, -9, 3, -7, -1, -23, 13, 54, -1, -19, +9, 22, -10, 26, 12, 1, -13, -7, -7, 6, -3, 1, 8, -17, 3, 40, -28, 12, -14, 9, 16, 21, 2, 55, 35, 2, 37, 57, -14, -35, -37, -26, -45, -25, 8, 49, -44, 36, 10, -42, 19, 42, -16, -38, 101, 40, -9, 55, 2, 37, -34, 15, -16, 3, 23, 37, -25, 14, 17, 22, -8, -49, -31, -5, -27, -6, 10, 55, -55, 21, -9, 22, 16, 19, 0, -44, 113, 82, 2, 14, 14, +25, -61, 10, -43, 12, 1, 2, -24, -44, 22, -26, 3, -14, 5, -7, -10, 32, -22, -19, 5, 24, -6, 30, 24, 8, 18, -30, 127, 16, 6, -4, 33, 40, -45, -6, -32, 17, -19, 17, -21, -5, 6, -3, 4, -22, 12, 0, -3, 48, -6, 29, -8, 30, -2, 61, 25, -2, 0, 14, 127, 36, 1, -13, 60, 25, -20, -5, -25, -24, -9, 48, -44, -15, -4, 69, -33, -21, 31, -3, 17, 38, +-6, 39, -3, 4, -32, -31, -21, -6, 11, -21, 84, 44, 20, 1, -9, 37, -45, 0, -42, -11, 28, 35, -26, -14, 26, 10, -19, -28, 19, -3, -4, 50, -22, 28, -5, 18, -24, 19, 8, 6, -8, -34, 127, 59, -2, 46, -8, 44, 36, 3, -27, 2, -5, 69, 95, 13, -21, 36, -22, 2, 25, -3, -2, -6, 18, 42, -26, 44, 1, -10, 12, -21, -11, -10, 43, 6, 9, 7, -33, -3, -52, +-19, 6, 5, -3, 27, 7, -19, -4, 59, 12, 47, -64, 8, 16, -30, 7, 27, 0, 19, 15, -34, 9, -3, 13, -38, 116, -5, 18, -19, -3, 16, 44, -20, 49, 13, -13, 21, -18, -4, 19, 49, -5, 23, -57, -8, 5, -20, -26, 21, 10, -21, 21, -26, 27, -6, 18, -28, 96, 56, 30, -12, -28, 1, 60, 4, 22, 23, 9, 39, 23, 7, 13, 21, -15, -7, -28, -4, -31, -13, -34, 3, +1, -6, 24, -45, 26, 12, 4, -33, 61, 14, 14, 44, -12, 21, -26, 1, 8, 1, -2, 51, 62, 35, -5, 111, -39, 85, -28, 0, 5, -13, -18, 4, -11, 7, -4, -12, -6, -6, 15, -17, 31, 30, 36, 25, -26, 60, -31, -19, 27, 15, 21, 64, 110, -22, 12, 57, -38, 79, -49, -18, 15, 14, -16, 18, -14, 29, 16, -21, -21, -4, -14, 58, 64, 6, 12, -9, 6, 22, -23, -17, -14, +2, 23, 35, -30, 0, 23, 6, -30, 4, -18, -15, 11, 30, -3, 47, 24, 18, 21, 9, 30, -5, 13, -41, 127, -9, 0, 3, -12, 2, -30, 18, 45, 15, -7, 47, 90, 10, -20, 36, -19, -13, -44, -23, -30, 2, -10, 55, -35, 1, -23, -37, 10, 20, -14, 31, 78, 28, 5, 27, 70, -1, -55, 34, -12, -19, 11, 35, -45, -3, -33, 13, -34, -57, 49, 22, 4, 65, -24, 54, -16, 42, +-20, -9, 31, -35, -27, -51, 119, 39, 15, 7, 5, 9, -23, -24, 30, -20, -4, 18, -26, -14, 0, 66, 13, 7, 8, 2, 11, 11, -27, 29, -31, 17, 10, -34, 44, 14, 20, -6, 53, -20, 28, 3, -22, -6, -24, 40, 41, -21, -24, 31, -1, 12, 39, 47, 13, -15, -1, -37, 127, -2, -21, 6, -19, -2, -36, -26, -12, 26, -44, -6, -55, -23, 21, -1, -37, -24, -43, 46, -4, -8, -42, +84, -14, 13, 62, 52, -4, -23, -22, -38, 120, 34, -40, 1, -34, -16, -20, -17, 4, 19, -38, 11, -41, -4, -13, 13, -20, 41, 39, 2, -33, 9, 37, 84, -8, -16, 19, 72, 4, 47, -11, -14, 100, 8, 20, 18, -26, -14, -29, -9, -12, -34, -10, 5, -29, -8, 16, -21, -30, 4, 14, 19, -19, 14, 31, 93, 7, -12, 40, 76, -2, -8, 11, -19, 110, 14, 0, -10, -26, -43, -12, -28, +7, -6, -3, -8, -20, -28, 31, -31, -67, 56, 32, 5, -25, 4, 44, 33, -36, 3, -4, 27, 7, 6, -9, 6, 34, 14, -13, 26, -43, 15, -23, -11, 54, 31, 28, -33, 23, 5, 21, 3, -20, -37, 11, 48, -8, -8, 37, 72, -12, 4, 40, 69, -22, 4, 5, -2, 108, 7, -11, 3, -35, -40, -18, -15, 6, -15, -18, -14, -3, -25, 41, -30, -43, -11, -43, 7, 20, -25, 101, -21, 14, +-4, 28, 12, 14, 1, 127, -25, -53, -10, -15, 1, 87, -13, -28, -29, -7, -29, -8, 7, 16, -20, 1, 17, -22, -12, 16, 39, 17, 0, -37, 6, -28, 24, 58, 50, -14, -1, -7, 8, -42, -20, -54, -5, -52, -9, -27, 13, 10, 39, -22, -15, 34, -3, 17, -4, 6, -21, 18, 41, 26, 18, 23, -11, 6, 24, 51, 25, 11, -6, -16, 4, -12, -23, -43, -26, -34, 6, -47, -8, 28, 42, +-3, -26, 23, -30, 18, -39, 45, -11, 9, -5, 25, -7, 3, 6, -3, 9, 22, -5, -3, 5, 17, -20, 3, -33, -39, -30, -43, 29, -41, -40, 17, 34, 6, 3, 42, 1, 28, 5, 8, -19, -27, 30, 19, 35, 76, 12, 3, 4, 3, 5, -6, -59, 71, -6, -36, -6, -27, 23, 41, -11, -41, -26, -29, -44, -6, -5, 47, -3, 87, -55, -30, -31, -33, -24, 15, 14, 93, 26, 44, 14, 45, +-33, 44, -57, 98, 10, -22, -51, -9, -42, 124, 24, -47, -9, -14, -7, -16, -99, 91, -7, -11, -11, -65, 14, 30, -13, -2, 14, 26, 63, 9, -3, 35, 21, -25, 23, 4, -3, 30, 12, -5, -24, -27, -2, -31, -12, 33, 5, -9, 4, 16, -41, 42, -36, -25, -10, -15, -18, -1, 32, 72, -21, 25, -20, 8, 1, 32, -9, 74, -53, 4, -54, -9, 13, -11, -21, -17, -9, 9, -4, 8, -34, +12, -39, 2, -22, -68, 56, 32, -13, -19, 4, 62, 46, -12, -22, 11, 44, -9, -3, -16, 10, 36, -27, -30, -14, -62, -5, -4, -31, 40, 18, 31, -27, -26, -23, 9, -25, -34, 30, -19, 2, 18, -5, 56, -12, 23, -29, 66, -3, 6, -23, -13, 11, 5, -20, -55, -38, -31, 0, -13, -2, 39, 37, -1, 14, 14, -10, 33, -8, -4, 1, -42, 50, 28, 31, -24, -32, -7, -15, 5, 6, 34, +-2, -44, -42, -5, 80, -15, -5, 18, -40, -25, 39, 22, 15, 2, 37, 11, 5, -1, 11, 41, -17, -2, 26, 9, 21, -43, 6, -26, -4, 6, 5, 31, 9, -59, -38, 24, 22, -10, -34, 17, -4, -2, -9, 39, -13, -23, -14, -1, 14, -42, -7, -8, -35, 16, 40, -16, 22, 7, 2, 32, -39, -41, -9, 11, -40, 84, 8, 57, -18, -33, 30, 8, 0, 18, -14, 1, -17, 16, -2, -18, 21, +5, -10, -9, -2, 16, 26, -7, 65, -15, 0, 20, -28, -31, -15, -13, -7, 90, -14, 42, -18, -39, 11, 32, -54, 26, -19, 11, -11, 17, 2, 3, 3, -1, -24, -12, -11, -34, 40, -24, -16, -16, 57, -3, -26, -32, -11, -15, -9, 87, 46, 14, -16, 0, 9, -12, 30, 1, -18, 6, -40, 21, -2, -3, 13, -50, -18, -6, -17, 50, 28, -8, 59, 6, 28, -6, -10, -20, -27, 18, 0, 111, +-13, 22, 34, -60, -11, 2, -55, -20, -3, 8, -32, 50, -39, 0, 10, 77, -4, -19, -9, 12, 13, 2, -23, 22, 61, -22, -11, 42, 1, 28, 45, -6, -1, -25, 126, 1, -20, -31, -72, -26, -31, -16, 2, -16, -59, -22, 22, 8, -24, -4, -29, -27, 24, -11, 13, -3, 5, -7, 4, -30, -29, -2, -25, -24, 5, -16, 66, 31, -11, 10, 7, -24, -8, 13, 2, -2, 2, 19, -21, 9, 19, +-8, -9, -55, 46, 15, -6, 16, -8, 26, -17, -26, -32, -16, -2, 76, 11, -32, 59, 28, 6, 14, 46, -32, 10, 11, -9, -79, 14, 1, -19, -4, -6, -10, 0, -63, 58, 22, -7, -2, -34, 57, -4, -6, -22, -21, -27, 104, -28, -28, 16, 32, -13, 18, 23, -12, 38, 1, -2, -94, 18, 10, 0, 33, -29, -4, 6, -25, 18, 44, -32, -15, 17, 2, 8, 33, -33, -3, -33, -27, -5, -7, +-32, -42, -14, 12, 14, -2, 6, -16, 21, 42, -55, 17, -18, 16, 23, 89, 22, -48, -48, -6, -28, -6, 17, 18, -2, 115, -34, 14, 4, -74, -4, -21, -46, -105, 5, -17, 97, -25, 26, -36, -22, 86, 25, 13, -18, -30, -8, 5, -24, 1, 13, -19, 45, -31, 5, 3, -2, -23, -15, 39, -10, 31, -3, 24, 28, 35, -22, 8, -14, 16, -11, 26, -24, 3, 14, 3, -10, 38, -5, -8, 3, +-18, -11, -12, -24, 14, 30, -16, 8, 34, -14, -15, 28, 12, -11, -38, 49, 25, 37, -23, 90, -23, 19, -22, -8, -44, -31, 4, 1, 16, -8, 4, -29, -42, -20, -18, -43, -57, 94, -33, -14, -32, -8, 14, -26, 13, -28, 12, -9, 102, 30, -18, 82, 0, 12, -16, -22, 13, -11, -22, 15, 49, -4, 37, -7, 1, 17, -5, 57, 21, -1, 24, -14, -37, 7, 17, -14, -25, 39, -7, 127, 55, +-7, -4, -48, -19, -7, 16, -25, -16, 51, -5, 29, -53, -25, 3, 12, -63, -42, 9, 33, 0, -26, -3, 15, -76, -32, 14, 7, 5, -33, 5, 6, -46, -35, -33, -15, -32, 19, -27, -26, -20, 10, -22, -3, -22, -37, 24, -33, -58, -9, 50, 30, 7, -24, -5, -12, -42, -4, -17, -11, -2, -18, -11, -20, -28, -39, -3, 13, -19, 26, -20, -18, -28, -8, -18, 0, -24, -18, 41, 1, -57, 22, +20, 22, 9, -10, -13, -11, 62, 1, 45, 0, 31, -36, -26, 41, -19, -19, -1, -1, -28, 37, -14, -9, 8, 2, -24, 3, -6, -36, 17, -5, -39, 15, 55, 40, -3, 16, -15, -6, 26, 9, -2, 45, 23, -41, 1, 3, -4, 16, -27, 0, -13, 43, -15, -5, -17, 12, -5, 13, -26, 24, 1, -38, -36, 75, 43, 22, -14, -12, -2, 12, 127, -24, 14, 0, 32, -11, -8, 14, -15, 4, 5, +-15, -3, 92, -27, 1, -30, -10, -20, 9, 6, -16, 1, 0, -29, 10, 16, 37, -31, -8, -14, -5, 5, -33, 30, 10, 43, -17, 23, -30, -33, -9, -21, 17, 10, 80, 18, -1, -33, -8, -6, 10, -12, -26, 2, 13, 14, 29, -25, 5, -20, -37, 7, -36, 16, -7, -7, -9, -11, -38, -11, -15, 0, -35, 17, 43, -30, 7, -17, -12, 0, -44, -30, -11, 18, -1, -10, -32, -50, 25, 12, 20, +3, -41, -18, 35, 45, -20, -2, -4, 32, -3, 20, 19, -14, 12, 20, -1, -12, 11, -26, -14, -50, 25, -22, -16, -23, -5, -11, -34, -19, -4, 19, 42, -9, -28, -13, 31, 24, -27, -33, 16, -7, 9, 13, -31, -37, 19, -6, 8, -20, 38, -39, -13, -49, -6, -17, -20, -50, -14, 9, -23, -34, 4, 58, 51, 19, -29, -5, 60, 22, -20, -4, 34, -10, 26, -23, -18, -42, 40, -20, 8, -12, +23, -31, -21, -39, 9, -35, -1, 9, -11, -5, -19, 2, -25, 14, 8, -9, -51, -16, -20, -64, -37, -49, -25, -26, -36, -14, -1, -1, -55, 18, 7, 4, 0, -23, -12, -35, -16, 6, 48, 0, -5, -34, 0, -20, -23, -44, -6, -30, -20, -31, -5, -62, -4, -67, -45, 56, -36, -50, -4, 94, 23, -15, 19, -12, 27, 4, -10, -29, -31, -30, 42, 40, 4, 5, -17, -31, 23, 35, 10, 0, 5, +-13, -16, 107, 1, 30, 0, 21, 0, -6, 51, 1, 36, 14, 8, -1, 81, -15, 3, -30, -12, -30, 9, -29, -16, -14, -19, 11, 9, -11, 29, 2, -8, -38, 16, 10, -24, -45, -28, 10, -33, -14, -11, 20, -19, 3, 39, -36, -9, -19, -41, 7, -8, -1, -22, -3, -10, 35, -22, -37, 60, 11, 39, 3, -4, -13, -16, 120, -13, 1, -10, 16, -9, 23, 8, -38, -3, -1, -28, -32, 127, -30, +-9, -3, 14, -37, -5, 35, -3, -13, 27, -13, 22, -11, 36, 12, -18, -19, 10, 40, 7, -12, -13, 1, -14, 15, -13, -16, 57, 11, 7, -27, 94, -8, -10, 4, 16, -28, 2, -14, -34, -18, -37, -16, 6, 23, 33, 96, -9, -18, 46, 5, -33, -11, -7, 17, -47, -7, -15, -16, -15, -13, 1, 19, -12, -32, 99, -28, -11, -11, 20, -21, -51, 2, -24, -9, -24, 33, 32, 104, -27, -31, 42, +13, -24, 3, -14, 8, -39, 16, 2, 69, -2, -20, 1, -5, -25, -15, 90, 4, -26, -7, 9, 30, -19, 18, -15, -3, -24, 2, -11, 19, -14, -26, -1, -10, -28, 3, -1, -14, -17, 17, 0, 74, -4, 23, -11, 2, 12, 1, 42, 36, -31, 2, 55, 8, -37, 22, 13, -1, -25, 32, 2, -18, -9, -30, 33, 24, -23, -30, -15, -23, -23, -24, -5, 40, 19, 25, -6, 32, 22, 27, 41, -1, +-35, 2, 60, -12, -40, 27, -22, -8, -24, 42, 6, -9, -19, -17, -11, 5, -29, -26, -31, -13, -4, 0, -15, -23, -12, 44, -10, -8, 39, -3, 90, -18, -36, -40, -9, -57, -14, 34, 9, 8, -8, 36, 7, -27, -14, -29, 22, 17, -47, -25, 44, -23, -24, 15, -25, 53, -11, -16, -10, 2, 18, -1, 32, -15, -13, -18, 2, -2, -55, -24, 5, 14, 27, 51, -3, -20, -8, 2, 9, -1, -29, +-9, -28, -26, 8, -32, -6, -29, -6, 3, -15, 48, -6, 20, 0, -2, 12, 33, 14, 11, -26, 12, -11, 25, -19, 46, 34, 76, -9, -25, 49, -1, 2, -21, -4, -5, 33, 11, -28, -20, -25, -9, 23, -4, -9, 1, 85, -15, -18, -14, 69, 42, -43, -13, -15, 21, -20, 36, 40, 55, -8, -23, 27, 16, 16, 23, 52, 30, 69, -2, -24, -28, -15, -21, -3, -15, -32, 0, 100, -29, -2, -16, +52, 59, -58, -7, -11, 2, -13, 37, 54, 75, -25, -33, -17, 19, -6, 41, 17, 15, 50, -18, -24, -8, -19, -46, 23, -22, -52, -31, 127, -2, -19, -4, 47, -25, -32, -34, -44, 4, 0, 46, -17, 47, -8, -13, 6, 13, -45, -25, -7, -22, 15, -2, 6, -7, 4, -9, 9, 29, -18, 11, 101, -11, -2, -19, 21, 29, -42, -1, 14, -16, -4, 65, -31, -37, -16, 0, -35, -9, -15, -42, -81, +-23, -90, 43, 1, -22, -36, 23, -9, 29, -21, 21, -17, -24, 53, 8, 43, -17, -15, 6, -5, -5, -34, 35, 9, 16, -21, 0, 23, 29, -16, -21, 6, 6, -41, -8, -11, 59, -29, 16, -5, 4, 16, 13, 28, 1, -31, -16, 42, -24, -14, -36, -3, 24, -3, 18, -10, -51, -13, -9, -11, 23, 32, -13, -57, 0, 37, 6, 9, -37, 12, 30, 7, 30, 3, 77, 50, -20, 30, 1, -6, 13, +-25, 38, -27, -17, -38, 44, 14, -37, -41, 29, 7, 38, -32, -41, -67, 12, -17, -19, 3, 49, -20, 70, 1, 24, 41, 0, 65, -30, -28, -9, 3, 47, -8, 25, -11, 9, -30, 31, -3, -64, -20, -26, 2, 6, 11, 10, -6, 3, -11, -4, 2, -57, -2, 1, 8, 38, -11, -9, 55, -9, -23, -20, 28, 14, -31, -33, -34, -2, -19, -7, -30, 9, -5, 13, 46, 58, 6, -30, -36, 0, 0, +-8, -29, 5, 2, -30, -25, 13, 79, 1, -18, -14, -10, 98, -5, -1, -27, -50, -42, 15, -22, 2, -28, -7, 3, 21, 9, 60, 15, 12, -18, 25, 12, 12, -7, 7, 19, -21, -1, -4, 33, 42, -10, -18, -20, 101, 1, 1, -27, 2, -14, -5, -15, -28, -39, -15, 0, -13, -11, 14, 12, 7, 15, -3, 17, 5, -18, 6, -16, -4, -38, -22, 17, 61, -1, 0, 11, -80, 9, 6, 6, -53, +-8, -25, -19, -33, -12, 2, -3, -12, 1, -59, 24, 15, 13, -10, -8, 33, -21, -15, 0, 15, -27, -26, -17, 56, 4, -18, -2, -44, 15, 6, 66, -24, 51, 8, -5, -12, -31, 8, -17, -41, -21, -42, 21, 7, -14, -6, -66, -31, -59, -7, 29, 13, -4, -9, -6, 0, -6, -3, -20, -52, 18, 0, 58, -32, -15, -1, -32, -1, -7, 3, 13, 12, -14, -38, 21, 10, -15, 2, -6, 28, -57, +-7, 10, -5, -6, -34, 41, 36, -5, -14, -7, -52, 20, -13, 40, -23, -34, -6, -26, -2, -19, 0, 27, -34, 2, -25, -5, -5, -23, 36, -36, 18, -33, 2, -17, -5, -10, 123, -4, 10, -47, -19, 60, -14, -6, -12, -8, -24, -20, -7, -6, -17, -53, 23, -23, -35, 11, 31, 2, -14, -20, -11, -4, -6, 2, 11, -17, -30, -37, -3, 77, 24, -11, -25, -22, 127, -12, 3, -15, -18, -22, 19, +-18, 35, -47, 11, -2, -31, 21, 8, -37, -32, -44, -7, -14, -38, -28, -5, 14, -33, -6, 5, 53, 26, -23, -21, -9, 82, 5, 8, -22, -46, -26, 3, -20, -13, -44, -5, 27, -18, 37, -9, 13, -24, -14, 15, -41, -34, -49, 6, -18, -47, -34, 0, 39, 47, 10, -21, -34, 82, 13, -39, 3, 29, -41, -19, -3, -4, -37, 4, 2, -40, 15, -10, 20, -15, 11, -31, -15, -13, -17, 7, -30, +-24, -11, 127, 10, -18, 4, -29, 89, 68, 5, -43, -56, -3, -17, -36, -36, 4, -44, -4, -15, -12, -9, -25, -11, 1, -5, -3, 41, 56, 114, -3, -24, -7, 10, 127, 9, -68, -53, -12, 113, -10, 23, 2, -10, -26, 17, 31, -13, -25, -28, 21, 19, -40, 4, -12, -10, 3, -5, -10, -7, 24, 20, 11, 6, 6, -15, 1, 3, 25, -10, -3, -24, -32, 8, -24, 57, -39, -31, -14, -14, -12, +-34, -4, -1, -36, -13, 2, 13, -5, -19, -17, -35, 27, 5, -12, 4, -2, -22, 123, -27, 6, -37, -47, 50, -9, 9, 66, 64, -33, 72, -30, -12, -15, -54, -8, -21, -43, -25, -3, 8, -1, -17, -6, -48, 18, -72, -16, 31, 0, 10, -10, 52, 42, 10, -16, 9, -110, 25, -9, -19, -40, 5, 4, -21, -24, -29, 12, -12, -72, -27, -47, -17, -6, -10, 29, -19, 13, -38, -8, 3, -7, -33, +20, 47, 40, -1, -25, -36, -10, 23, 68, 7, 11, -67, 15, -39, -19, -4, 35, -64, -4, -34, -16, 60, 9, -22, -1, 12, -28, -33, -31, 21, -21, 0, 8, 26, 11, -31, -13, -23, 14, -31, 96, -7, 14, -45, 16, -22, -28, 4, 54, -48, -28, -49, -6, 24, -5, -21, -25, 3, -20, -18, -36, -4, -11, -23, 12, 2, -5, -27, -35, -64, 14, -32, -6, -7, -18, -35, 1, 5, -19, 13, 25, +-30, -20, -5, -7, 29, 17, -22, -30, 7, 37, 28, -24, -22, -5, -22, -33, -22, -39, -1, -39, -26, -14, -1, 17, -10, 3, -19, -12, 56, -22, 21, -33, -48, 4, -27, -10, 11, 6, 5, -21, -2, 18, 14, 4, -15, -49, -21, -11, -8, -27, -21, -42, -33, 0, -31, -9, 14, -7, -12, -9, 31, -41, -21, -13, 47, 31, -5, -8, 20, 21, -44, -41, -54, 3, 46, -6, -25, 45, -20, 11, -45, +20, -18, -4, -8, 6, -4, 61, -6, 0, -44, -5, 37, -36, 8, -12, -39, 36, 7, -24, 22, 11, 16, -53, -9, -34, 3, -9, -7, -10, 27, 2, -57, -1, -39, -18, -10, 0, -10, 12, 8, -10, -4, -32, -4, -41, -26, -33, -13, 26, -23, -24, 25, 12, -7, -20, -1, -18, 33, 14, 18, -37, 36, -3, -13, -9, -23, 8, 39, -1, 16, -1, 45, 5, -33, 18, 2, -34, -27, 13, 16, -13, +-17, 3, 26, 0, -19, 27, 15, 15, 30, -51, 18, -3, -4, -12, 14, -7, 19, -7, -26, 5, 39, -51, 24, 12, -36, 2, -4, -22, -2, 9, 78, -38, -23, 9, 42, 3, -14, 52, 5, 18, 54, -27, 14, 64, -14, -8, -4, -3, -14, -34, -29, 8, 32, -34, 20, 31, -14, 16, -10, -14, 11, -13, 69, -26, -33, -14, 61, 5, -13, 75, 3, 13, 37, -35, 3, 14, 37, -5, 14, 6, -8, +-24, -41, 33, 19, -16, -6, 1, -20, -8, -1, -14, -25, -14, 3, -8, -32, -3, 23, -3, -25, 60, -58, 15, -33, 20, 57, -24, -28, 16, -48, -3, -32, -1, 8, -5, 35, -35, -24, -23, 8, 25, -21, -16, -16, -27, 4, 36, -10, 0, 32, -21, 2, -6, -48, 40, 14, -16, 87, -8, 25, 13, -85, 4, -29, 38, -19, 34, -21, -41, -12, 16, -28, 1, 24, -30, 2, 19, -7, 4, -15, -22, +28, 14, -19, -22, 3, 7, 10, -17, -21, 7, -31, -30, -11, -7, -5, -34, -8, 10, -1, -15, 16, -10, 18, -7, -18, -42, -11, -10, 6, 5, -19, -10, 16, -13, -20, -49, -60, -13, 47, 1, 6, 78, 5, 15, -1, -14, -31, 6, -25, 6, 8, -18, -29, -2, 3, -22, 17, -26, -10, 14, -4, 1, 20, -2, 16, 41, -47, -43, -31, 34, 44, -32, -29, 97, 4, -11, -34, -5, -21, -4, -41, +20, 10, -32, 9, 28, -25, -47, 19, -28, -24, 0, -12, 25, 1, -6, 26, 3, -18, 11, -22, -8, 14, -16, -12, -39, -11, 4, 13, -10, -4, 5, -20, -13, 32, 10, -31, -3, -27, -18, -10, -20, -59, -4, -6, -39, 86, -14, -20, 1, 126, -24, 6, -40, 25, -13, 7, -13, -16, 79, -24, -18, -6, -16, 2, -3, 16, 20, -21, 8, 7, -27, 7, -19, -38, 30, 10, -11, 31, -10, -15, 16, +127, 12, -5, -2, 23, -9, 17, -46, 33, -21, -27, 1, -4, -14, -10, 6, 8, -33, -19, 28, 17, -5, -22, 25, -4, -20, -11, 32, -18, -6, -8, 12, 120, -44, -3, 0, 20, 2, 5, -2, -22, -55, -32, -23, 33, 0, -12, 11, -33, -24, -43, 40, -32, 5, -23, -6, -3, 3, 19, -10, -16, -6, -28, 5, 80, -24, -20, -10, 22, 8, 16, -44, -20, -50, -22, -18, 9, 3, -8, 6, -48, +-15, -26, 18, -12, -18, -14, 38, -5, -5, 8, -1, -10, -13, 24, 18, 60, 16, 15, -33, 3, 28, 3, -19, 42, 65, -44, -16, 28, 57, -10, -2, -33, -13, -51, -18, -14, -26, -16, -3, -27, 21, 7, 8, 41, -27, -19, 28, 126, 27, -17, -37, 27, -1, 23, 15, 18, -31, -13, -22, 2, 24, -40, 5, 6, 1, 3, 34, -70, -12, -15, 13, -9, 33, 22, -23, 20, -40, -3, -4, -15, -8, +23, -15, -4, -7, -29, -14, 1, 107, -23, -58, -3, 85, -3, -21, 2, -11, 18, 17, -9, -9, -14, 23, -24, -42, 23, -53, -22, -12, 5, 36, 90, 2, 53, -19, -2, -3, 12, -9, 27, 113, -41, -32, -14, -2, -22, -5, 25, -12, -13, 1, -3, -4, -26, 16, -9, -31, 38, -25, -9, -12, 33, 2, 90, -14, 26, 30, -2, 9, -15, -41, -11, 127, -32, -14, 1, -39, -52, 3, 10, 8, -37, +37, -9, -8, -10, 30, -12, -49, 35, -17, -38, -17, 21, -25, 26, -12, -3, -28, 64, 18, -33, -28, -27, 121, -43, -25, 6, 1, -52, -23, 13, 21, 21, 6, -5, -2, -21, -5, 28, 27, -5, -52, 76, -30, -1, -19, -14, 20, -26, 10, 19, 10, 16, 18, 2, 124, -19, -71, -9, -28, 2, 26, 1, 8, 2, 60, -10, -37, 11, 41, 52, 16, 12, -15, 63, 0, -28, -27, -10, 86, 16, -38, +42, -16, -5, 16, -4, 71, -12, -34, -3, 26, -27, 19, -12, 4, 1, 10, -8, -20, -19, 16, -4, -19, 0, -7, -1, -26, 15, 3, 76, 2, -1, 29, 24, -4, 7, -16, 17, 25, -7, -43, 1, -12, 6, 2, -21, -17, -2, 9, -3, -18, -28, 2, 13, 45, 19, -7, 52, -33, -6, 12, 34, 34, -16, -39, 15, 6, -22, 27, 13, 127, -9, -40, 5, 65, -4, 27, 56, -4, -57, 14, -3, +-7, 22, 43, -20, -24, -1, -16, -26, -17, 16, 30, -86, -38, 15, -39, 66, 9, -18, -37, 23, -15, -45, -49, 53, 126, 56, 3, -56, 9, 6, -13, -45, -9, -10, -18, -7, -34, 2, -5, -35, 0, 42, 22, 38, -7, -17, 4, 13, -1, 13, 10, -14, 90, -1, -12, 7, 16, -6, -3, -21, 2, 19, 29, -11, 3, -11, 4, 10, -18, 46, 4, -44, 0, 24, 9, -20, 16, 31, 19, -25, 13, +43, 33, 67, -20, -21, 4, 1, -52, -13, 73, 19, -7, 45, 22, 0, -31, 29, -15, -3, -40, 43, -10, -15, 51, 22, -5, 14, 11, -12, -5, -12, -32, -14, 8, 14, -21, 29, -19, -33, -4, -29, 127, 63, -7, -7, 35, -7, 73, 10, -7, 9, 1, 12, -39, 10, -24, -23, 21, -8, -24, 2, -28, 21, 6, 16, -9, 26, 72, 45, 27, 7, -4, -22, 127, 29, -7, 14, 6, 28, -13, 7, +-8, -25, -18, 7, 94, -26, -4, -18, -1, -8, -13, -14, 26, -22, 4, -8, -8, 18, -5, -4, 1, 14, 2, -9, 57, -8, 11, -14, -6, 9, -19, 5, -34, 2, 40, 54, -4, -14, -20, 28, 15, 119, 37, -19, -17, 6, 12, 27, 52, -4, 69, 12, 32, -11, 10, -1, 116, 127, 22, -31, -2, 21, -7, 36, -29, 17, -6, 39, -81, -25, -28, 29, -33, 75, 127, 7, -28, 11, -56, 39, 30, +-23, -18, 5, 17, -17, 9, -53, 78, 23, 37, -46, -58, -3, -34, -1, -39, 29, -15, 65, -81, 20, -13, 29, -22, 89, 127, 13, -45, 12, -60, 51, 49, 4, -22, -32, -5, -18, 21, -39, 90, 40, 28, -59, 6, 20, -15, 23, -11, 16, 5, 37, -84, -23, -4, 51, 1, 62, 123, 16, -37, 17, -58, 35, 47, -6, -29, -7, -18, -21, 21, -42, 108, 25, -1, 21, 70, 28, 15, 8, -12, 4, +2, 44, -3, 19, -16, 49, -35, -39, -40, -17, 9, -55, -36, 43, 69, -3, -6, -28, -22, -1, -30, -41, 120, 120, -6, -4, 54, 7, 13, -10, 12, -8, 10, 12, -19, 13, -32, 22, -3, 67, -5, -5, 14, -29, 4, 50, -14, 9, 2, 32, 29, -23, 12, 19, 127, 60, 15, 5, 50, -10, -7, 53, -53, -9, -9, -5, -9, 16, 60, -2, -30, 25, -11, -4, 16, 28, -9, 3, -20, 28, -16, +24, -21, -20, 8, -27, 127, 1, -6, 9, -22, 81, -27, 3, 1, 5, 19, -2, -10, -3, 46, 68, -34, -21, 5, -7, 13, -54, -1, 47, 39, 40, -6, -14, -34, 2, -25, -10, 116, 49, -8, 7, 55, 3, -3, 11, -36, 8, -23, 36, -6, 14, 23, -14, -12, -25, 6, -3, 20, 16, -14, 33, 0, 32, -30, 46, 7, -11, 16, 3, 127, 55, -1, 9, 48, -8, -18, 6, -18, 14, -9, 33, +5, 3, -16, -34, 5, -17, -47, -8, 7, -1, 17, 38, -12, 30, 7, 40, 26, -11, 3, -17, 127, 52, 3, 64, -13, 33, -43, 10, -13, 10, -2, 69, -24, 22, 28, 27, -1, -44, -22, -3, -45, 17, 31, 37, -33, 40, -2, 31, -8, 40, 1, -59, 127, 67, 13, 63, -33, 16, -40, -6, -15, 0, 9, 27, -8, -17, 30, 4, 19, -4, -43, -6, -35, 12, 12, 69, -24, 64, 0, 9, -15, +41, -19, -53, 125, 80, 41, -24, -12, -56, 10, 78, 5, 22, 20, -20, 15, 12, 41, 20, -2, 27, -32, -10, -2, -22, -5, -9, -4, -12, -44, -1, -1, 37, -13, -28, 2, -26, 7, -1, -22, -44, -5, 47, -2, 2, -6, 0, -12, 16, 43, 41, 7, -16, -37, 6, -27, -46, -22, 71, -5, 12, -14, -1, -9, -38, -26, -26, -6, 14, -29, -8, 6, 42, -32, -17, -1, -12, -11, 46, -6, -6, +47, 83, -30, 8, 15, -41, 42, 12, -13, 8, -6, 35, -5, 16, 9, 1, -6, 8, 14, 12, 1, -27, 13, -27, -22, 9, 10, -18, 31, -16, -28, -27, 21, 52, 24, 5, 57, 3, 0, -45, -22, 11, 10, -6, -20, -16, -4, -12, -38, -2, 5, -17, 1, -11, -13, -58, 10, 48, 34, 16, 4, -14, -18, 28, 8, 51, -9, -11, 8, 8, -22, -8, -46, 17, -57, 51, -24, -67, 5, 12, -43, +5, -24, -5, -3, 38, -58, 66, 14, -29, 27, 5, -1, 11, -4, 7, 21, 15, 32, 57, -6, -21, -30, 21, 3, -60, -28, 18, -40, -19, 16, -31, -11, -16, 21, 32, 21, -8, -30, 75, 6, -13, 25, -4, 14, -11, 7, -9, 31, 8, 53, 58, -19, -42, -58, 0, 32, -76, -82, 5, -51, 8, 27, -1, -21, -27, -3, 27, -4, 46, -57, 86, 30, -21, 21, 13, -15, 9, 1, -7, 23, 16, +20, 75, -34, 0, -51, 60, -9, -92, -42, 11, -42, -5, 24, 4, -27, -2, 24, 33, 16, -9, -22, -35, 31, 62, 25, 1, -51, -16, -21, 24, 71, 12, 10, -61, -19, 29, -19, -8, 18, -37, 24, 26, -10, -43, 7, 18, -13, -23, -35, 9, -7, -19, -12, -14, -1, 9, -15, 22, 47, 4, -8, -7, 53, 36, -20, -25, 13, 16, -29, -31, -10, -4, 24, -16, -9, -30, 12, 0, 13, -2, -27, +-3, -24, -2, -45, 27, 8, -31, -10, 5, 41, 36, -11, 12, 65, 25, -28, -21, -6, -2, -24, -22, -2, 30, 10, -24, -17, -29, -47, -21, -37, -18, -23, 3, 26, -9, -8, -66, -1, -8, 0, 22, 12, -1, -18, 8, 25, 20, -10, 8, -7, -35, 43, 12, -19, -5, 9, 28, -36, -30, 23, -20, -16, 15, 13, 23, -3, -5, -11, -39, -6, 65, -19, 17, 44, -14, -15, 2, 44, 50, -3, -19, +-29, -3, 10, -14, -4, 12, 11, -7, -10, 8, 22, -14, -1, -20, -8, -25, -15, 3, -12, -26, -8, 66, 1, 4, 4, 12, 8, -5, 75, 64, -15, -7, -15, -10, 48, 11, 2, 11, 5, -1, -17, -16, -5, 9, -26, -25, -33, 5, 38, 17, -23, -61, -51, 52, -1, -4, -45, 105, 11, 12, 57, 56, -12, -27, 5, -20, 117, 60, -51, 37, -29, -21, -28, -32, 8, 19, -39, 33, -43, -5, 29, +-7, -14, -39, -33, 52, 37, -16, -28, 109, 19, -12, 61, 83, -22, -24, -14, -58, 110, 39, -41, 17, -19, -8, -8, 0, 28, 35, -19, -3, -35, -25, -12, 28, 2, -13, -41, 12, 24, -45, -9, 73, -3, -15, 29, -43, 73, 26, 15, -4, 0, -49, 82, 41, 3, 14, -34, 20, -18, -15, -20, 59, -10, 38, 0, -23, -22, -1, 0, -4, -33, -31, 72, 100, -28, 30, -29, -19, -6, 47, -56, 7, +20, 62, -61, 1, 18, 56, -22, -22, -25, 7, 15, -25, 15, 1, -6, 14, -40, 13, -49, -8, -10, 17, -10, -9, 7, -43, -17, -33, -29, -4, 30, 12, 31, 25, 85, 6, -16, 67, 29, -14, 14, -5, -58, -24, -10, 20, -3, -11, 31, 2, -9, 10, -4, -9, 74, 21, -18, -7, 28, -19, -4, 17, -27, -10, -16, 127, -19, -5, 14, -22, -17, -17, -28, 1, -5, -16, -7, 2, -28, -29, 10, +-2, -15, -11, -43, -22, 39, -24, -28, -5, 21, 17, 21, 78, -45, 20, 51, -21, -55, -9, -4, 34, 8, -25, -3, 10, 30, -11, -15, -4, 20, 1, -13, -13, -41, -4, 6, -11, -1, 49, -6, 13, -29, -25, 15, -30, -71, -21, 13, -50, 58, -30, 19, 43, -11, -16, 10, -39, -48, -53, 24, 24, -11, -9, 4, -20, -95, -23, 36, -11, 19, 46, -27, -28, -15, -9, 6, -16, -46, -9, 5, -46, +16, -37, 21, 10, -31, -10, 18, -7, -54, -13, 14, 20, 18, 11, -17, 9, -48, -8, 33, -30, -10, 54, -19, -23, -58, -16, 54, -38, -72, -7, 53, -40, 3, -33, 30, 45, -1, -9, 28, -42, -9, -38, 2, 38, 34, -31, -5, -46, -22, -24, 17, -58, -23, 54, -30, -36, -6, -12, 38, -14, -72, 1, -27, -5, 107, 4, -20, 96, -13, 55, 28, 28, -54, 22, 7, 0, 9, -22, 24, -23, 13, +9, -4, 18, -3, 15, -26, -30, -38, 4, -8, 29, -11, 23, 19, 40, 44, 29, -1, 23, 12, 11, -5, 18, -16, 9, -10, -8, -33, -42, -6, -19, 16, 15, -32, -22, -12, 34, -25, -31, -49, -34, -40, 58, -28, 7, 38, 122, 31, -19, -1, 47, -9, 0, 10, 33, 78, -18, 17, 18, -14, 11, 3, -52, -14, -9, 53, 38, 62, 71, -20, -24, 56, -15, 54, -6, 31, -21, 29, 101, 4, -13, +45, 66, -14, -13, 1, -17, 9, 75, -4, 34, 16, -26, -26, -36, -14, -7, -20, -14, -5, 48, -35, -14, -47, 24, 5, 64, -14, 29, 5, 42, 31, -2, 2, 76, -39, 10, 3, 6, -9, -36, -1, 0, -24, -58, -18, -10, 10, -8, -14, -9, 28, 9, -38, -35, -41, 7, -35, 44, -3, 35, 37, 48, 103, -5, 8, 50, 8, 22, 31, 23, 29, -26, 1, 0, -15, 12, -2, -16, -49, 37, -14, +26, -1, -12, 4, -22, 8, 2, -8, -33, -29, -28, 8, 6, -18, -42, 22, -53, 4, 0, 39, -15, -33, -3, 17, -4, -5, 28, 17, -41, -30, 21, 25, 36, -12, 12, 5, -25, -12, 1, 9, -30, -14, -15, -6, 51, -3, -31, 39, -38, 3, 10, 38, -13, -25, -22, 5, 2, 49, -1, -83, -65, -16, 41, -8, 32, -8, -13, -6, -24, -21, -23, 26, 1, -14, -17, 16, -22, -27, 2, 6, 39, +-23, 120, -33, -1, 9, -29, -14, 22, 4, 15, -1, 24, -3, 18, 41, 28, 8, -9, -1, -39, 12, -47, -46, -8, 8, -1, 9, -22, -53, -18, 17, 6, -8, 61, 11, -18, 3, -5, -44, 4, -14, 4, 13, 14, -19, 40, -20, 22, 5, -30, 0, -9, 67, -6, -6, -3, 3, 8, 4, 26, 15, 43, 0, 17, -22, -23, 4, -12, 3, 20, -43, -28, -6, -19, -20, 25, 5, 3, -6, 34, -4, +5, -2, -3, 31, -14, -21, -9, -14, -16, -7, 11, 70, -40, 10, 18, -23, 34, 17, -36, -22, -20, -3, -22, 9, -23, 14, -26, -43, 66, 22, 35, -23, -24, -38, 14, -42, -22, -1, -4, 50, -29, 15, -29, -74, 53, 8, -10, -36, -7, -16, -12, -37, -6, 15, 65, 11, -1, 6, -22, -32, 64, 63, 20, -13, -11, -1, -24, 62, -9, -34, -14, 6, 4, -15, -54, -43, 49, 40, 36, 3, 115, +-20, 2, -12, -20, -43, -10, -36, 11, -20, -7, -59, 81, 79, 46, -25, -20, 14, 9, 43, -15, -52, -11, 19, 1, 7, -56, -44, 30, 43, 18, 27, 127, -18, 22, -30, -32, -4, -9, -5, -12, 2, -24, -45, 81, 71, 43, -13, -7, 7, -1, 87, -12, -49, -27, 19, -15, -15, -38, -27, 53, 48, 44, 30, 127, -20, 19, -33, -22, -26, -16, 3, -28, -20, -12, -3, 73, -7, 10, 2, -39, -7, +-26, -75, 21, -19, -16, -2, -5, 6, -22, -15, -48, -28, -9, 5, 21, -15, -3, -6, -22, -7, -33, -21, -43, 45, 13, 8, 58, 47, 7, -4, -18, -14, -20, 4, -10, -3, 28, 6, -29, 0, -5, 9, 3, 6, -1, -5, -15, -26, -3, -26, -2, -11, 5, 4, -25, -27, 36, -3, 5, 29, 4, -7, -20, -24, -35, 112, -33, 39, -18, -25, -9, 15, 36, -41, -37, 6, 48, 6, 29, 17, -23, +-9, -12, -27, -26, -33, -26, -16, -2, -29, 39, 14, 23, -31, 30, -15, -3, -50, -24, -15, -39, 13, -15, -20, -41, -11, -3, -13, -9, 8, 127, 8, 27, -26, -36, 1, 33, 0, -12, -19, 23, 6, 30, 7, 5, -26, 16, -21, -11, 28, -23, -28, 0, -13, -7, 14, -24, -9, -28, -2, 16, 9, 31, -13, -3, -17, -12, -11, 9, -2, -38, 8, 28, -19, 24, -6, 6, 7, -19, -12, -25, 27, +-19, -14, 5, -21, -13, 18, -13, -25, -45, -19, 18, -11, -35, -16, -15, -16, 0, -10, -3, -45, -19, 21, -12, -72, -31, 31, 38, 11, -24, -21, 3, -36, 1, -7, 15, 20, 8, 9, -35, 70, -34, -2, 19, -2, 49, -17, -12, -32, -16, -6, 45, -44, 8, 2, -19, -73, -12, 29, 31, -18, -14, -22, -30, -28, -11, 32, 29, 6, -16, 6, -23, -41, 9, -4, -12, -2, 41, 6, -6, -29, 0, +1, 5, -43, 9, 10, -12, 51, -12, 31, -34, -69, -28, 45, 27, 4, -24, -38, -74, 11, -14, -35, 21, -47, -15, 2, -29, -18, 28, -26, 82, 11, -6, 26, -21, -22, -38, 2, -14, -24, -7, -17, -16, -25, -15, 14, -13, 29, -52, -40, -43, -7, 37, 41, 13, 29, -9, 44, -7, -13, 17, 36, 2, -5, -6, 78, -74, 42, -18, -14, 15, 4, 1, 19, 23, 50, -7, -13, -27, 15, 15, -13, +-1, 14, -46, 4, -5, 62, -7, 30, -11, -9, -7, 1, 68, -3, 0, -7, 45, -11, 17, -11, 5, 2, 2, -5, -17, -16, 0, -16, -45, 4, -19, 11, -15, -21, 70, -21, -12, -9, 23, 11, 10, 5, -9, -35, 45, 3, 7, 18, -39, -58, 7, 71, -23, -45, 11, 41, -5, 23, -21, 5, 34, 26, -24, 29, -27, 62, -29, -11, -59, 34, -3, -9, 9, 21, 0, 26, 44, -6, -34, -5, 68, +46, 13, -6, -36, 11, -28, 10, 17, 24, -18, -2, 17, -20, -52, 0, -16, -40, -39, 11, -11, 11, -7, -34, -34, 44, -26, -24, 85, -8, -67, -3, 49, 43, 33, -5, -47, 2, -5, 26, 20, 29, -24, 18, -1, -22, -50, -2, -17, -33, -35, 39, -13, -7, -12, -49, 4, 17, 18, -10, 103, -17, -42, 20, -32, 47, 14, 8, -31, 16, -9, 18, 15, 24, 3, 31, 15, -5, -45, 1, -4, -34, +-46, 21, -21, 0, -18, -24, -29, 38, -12, -58, 94, 19, -62, -11, 39, -64, -31, -22, 5, 3, -11, -7, 40, 115, 4, 44, 55, 32, -8, 1, -75, 24, -5, -12, 6, 21, -16, -5, 15, -30, 24, -15, 70, -10, 26, 69, -69, -26, -29, 16, -6, -17, -4, 5, 30, 11, -10, 22, 4, 4, -9, 1, -9, 28, 18, -8, 6, 64, -9, 31, 12, 6, 3, 20, 12, 6, -23, 13, -3, -17, 10, +-9, 8, -24, -38, -4, 34, 4, -3, 14, -15, 21, -37, -41, -20, 3, -29, 20, -7, 59, -13, 51, 16, 30, -25, 9, 8, 20, 15, 58, -79, -32, -12, -8, -18, 23, -22, 28, 36, 10, -32, -2, -7, -12, -45, -45, -31, -11, -62, 2, -26, -26, -25, -31, -13, 4, 21, -8, 90, 22, -15, 2, -23, -53, -22, 19, 27, -17, -28, -1, 20, -25, -11, 17, -10, 38, -19, -19, -33, 11, 9, 5, +25, 63, -5, -8, 10, -20, 11, -13, 4, -8, 13, 28, -53, -10, -28, -9, 22, 2, -9, 12, 40, 37, -9, -12, 3, 15, -19, -15, -37, 14, 6, -11, -4, 72, -10, -15, -16, 17, -9, -3, 7, -12, 0, 37, -66, -48, -27, -20, -8, 23, -1, 23, 22, 88, -29, -28, 52, -6, -31, -1, 0, -9, -20, 9, -28, 75, -1, -24, -7, -27, 8, -46, 116, -15, -18, -5, 35, -46, -3, -22, -6, +32, 10, 15, 3, 104, -35, -43, 34, 22, -25, -1, 12, 1, -35, 20, -9, 62, 3, -23, -6, -16, -13, -37, 86, -19, 29, -3, 28, 7, 66, -27, 31, -10, -25, 11, -32, -7, 10, -43, -10, -6, -13, 12, -8, 28, -13, -2, -48, -2, -6, 34, -8, 29, 7, -5, -13, -34, -16, -59, 18, 10, 13, 12, 31, -4, -21, -12, -43, 16, 30, 49, -8, 31, 16, -9, -5, -3, 74, 26, -18, -4, +-17, -17, 4, -9, -28, 44, 53, -15, 57, 38, 4, 12, -54, 16, 2, 0, -12, -12, -36, -11, -18, -40, -18, 9, 1, -53, 0, 0, 23, -42, -3, -3, -3, -34, -19, -12, -6, 35, 6, -9, 2, 71, 9, -7, -11, -8, -15, 1, -31, 5, -15, -4, 40, -17, -1, -37, -19, 2, 17, 0, -8, 17, -23, 2, -22, -2, -2, 51, -8, 2, -22, -15, 38, 5, -15, -18, 7, 84, 10, 3, 16, +-9, -27, -10, -2, -2, -20, -12, 52, 52, -20, 10, -7, -9, 35, 19, 13, 0, -8, 3, 34, 10, -4, -21, -40, 57, 17, -36, -26, -62, 58, 22, -12, -32, -29, 7, 3, -49, 33, -11, 26, 8, -15, -12, -26, -4, -37, 18, 26, -14, 7, -4, 31, 8, -9, -19, -19, 112, 78, -48, 0, -39, 59, 39, -19, -11, -8, 42, -25, -31, 33, -17, 60, 29, -8, -2, -39, 10, -41, 30, 3, -15, +-22, 23, 55, -14, -47, -37, -31, 66, 76, -35, -6, -48, 56, 12, -11, -6, -37, 7, -12, -52, 20, -9, 16, 25, -24, 14, -19, 9, -32, -2, -10, -22, 14, -27, 39, -15, -30, -29, -30, 120, 126, 63, 30, -41, 41, -17, -23, -8, -59, -22, -9, -11, -18, 84, -19, -17, -37, 16, -36, -9, -59, 16, -10, -11, -22, -2, 64, 38, -6, 9, -31, 127, 43, 2, 20, 12, -3, -10, 50, 6, 2, +0, -13, -13, -37, -2, 22, 37, -5, 24, -28, -5, -15, -11, 6, -12, -16, -31, 14, 46, 16, -24, -29, 30, 24, 16, -3, 37, 69, 1, -23, -10, -21, -18, 13, -2, -34, 53, 10, -26, 13, -2, 75, -7, -13, -25, -20, -29, -6, 0, 4, 16, 15, -28, 2, 71, -17, -12, 49, -20, -15, 22, -28, 19, -11, 42, -7, -58, -3, -19, 0, -1, -31, 34, -14, 2, -9, -3, 28, 12, -5, -22, +49, -16, -11, -25, -28, -23, 4, -1, 58, -6, 30, -4, -24, -26, -27, 3, 13, 36, -31, -13, 17, -4, -32, -10, 31, 41, -28, -6, -12, -15, -9, -15, -3, 52, 19, -23, 15, 4, -18, 20, 17, 23, 37, 0, -20, -10, -19, -18, 7, 41, -20, 13, -2, 9, -22, -23, 40, -9, -50, -18, 0, 7, -14, -25, 1, 61, 5, -7, -24, 59, -6, 4, -41, -23, -25, 35, 2, 9, -43, 12, 3, +-9, 22, 58, -2, -12, -20, 6, -20, 18, -7, 2, 4, 7, -11, 21, 65, 54, -1, -32, -7, 75, 15, 13, -28, -13, -40, 16, -15, -8, -44, 21, 0, -25, 24, 52, 26, -28, -6, 15, 1, -7, -45, 3, -2, -18, -3, -13, 51, 40, 7, -26, -10, 70, -7, 41, -15, -39, 28, 0, 0, -23, -14, -21, 34, 19, 11, -33, -18, -1, -34, -11, -17, 21, 30, -31, 7, 76, 26, 48, -4, -15, +-16, -22, -25, -8, 31, 10, 16, -34, 3, 1, -34, 0, -12, 26, 13, -8, 1, 21, -2, 34, 8, -29, 25, -32, -1, 8, 3, 80, 72, 2, -44, -19, -29, -19, -9, 21, -16, -13, -12, -14, -19, 27, 1, -34, -11, 22, 32, -24, -53, -9, 11, 17, -28, 3, -8, -5, 37, 8, -28, 24, -6, 14, 2, -5, 6, -19, -16, 8, -12, 4, 10, 18, -2, -2, -45, -8, 7, -13, -42, 8, -8, +-10, 23, 6, -7, -32, -9, -14, 24, -22, 19, -17, 67, 13, -26, -14, -19, 20, -11, -10, 13, 48, -15, -30, 19, -2, -25, -22, -26, 13, -1, 51, -2, 22, -6, 13, -4, -24, -3, 8, 0, -36, 24, -19, -23, -38, -28, 46, -17, -37, -8, 6, -54, -30, -4, -12, -6, 17, -2, -50, -35, 60, 102, 18, -22, 27, 47, 49, -15, 29, -6, -4, -16, -17, -24, 44, -41, 20, 0, 92, -2, -4, +-6, 34, -20, -42, -27, 0, 24, 8, 23, -28, -64, 52, 74, -29, -18, 17, 40, 49, -10, 36, -11, 12, -9, -20, -3, 80, -54, 37, -19, 94, -14, -6, -15, 4, -13, -64, -35, -23, -16, 11, 3, -56, -51, 51, 96, 15, 0, -11, 42, 50, -9, 27, -5, -16, 6, -12, -47, 70, -52, 36, 28, 83, -12, 17, -4, 0, -5, 93, -16, -53, -23, 17, -29, -38, 34, 20, 51, 18, -43, -29, 52, +18, -55, -5, -19, -10, -32, -8, -19, 58, -25, -7, -16, 32, -29, 9, -51, 7, 48, 48, -13, -13, -28, -10, -9, -25, -38, -19, -1, -1, -23, 4, -1, -11, -16, -1, -19, 29, 20, -23, -8, -5, -49, -24, 14, -11, -22, -16, -16, -12, -7, 7, 19, 5, -21, 22, -24, -47, 13, -4, 13, -23, 28, 19, 40, 12, -30, -17, -17, 23, 4, 5, 12, 13, -16, -4, -43, -4, -26, -5, -19, -15, +7, 37, 11, 12, -14, -3, 24, -22, -39, -7, 15, 17, -23, -26, 20, 29, -26, -25, -41, -34, -13, 0, 45, 9, 75, 2, -36, -22, -46, -6, 12, -15, -4, 99, -23, -24, -1, 10, -9, 2, -24, -10, 7, 18, 26, -1, 12, 19, -33, -2, -4, -31, 17, -6, -3, 34, 37, -8, -44, -10, -13, -7, -21, 19, 15, 77, -3, -10, -10, -1, -12, -24, -3, 18, -27, -4, -1, 2, 12, 20, -32, +-5, 25, -11, -9, -4, 18, 23, 16, -11, -22, -23, -13, -3, -40, -2, 11, 79, -10, -9, -46, -3, 11, -4, -4, 66, -36, -5, -22, -5, 31, -1, -27, -46, -6, -19, -12, -35, -24, -49, -5, 12, -18, 17, 12, -42, -31, 19, -42, 77, -3, -12, -39, 1, -15, -10, 3, 61, -44, -24, -48, 6, 48, 4, -11, -16, -12, -18, 19, -53, -24, -47, 0, 33, -6, -6, -16, -22, -32, 2, -32, 2, +-17, -19, -25, -8, -11, -25, -49, 34, -5, -9, 8, -16, -16, 4, -50, -37, 25, -41, 4, -34, 0, 2, 11, 127, 10, -20, 15, 121, -21, 2, -24, -57, 26, -23, 12, 3, -12, 40, -23, 33, -4, 14, -12, -11, -33, -19, -35, -39, 74, -33, 26, 12, 11, 11, 0, -70, -15, -3, 21, 120, -19, -21, -26, -2, 18, -29, 31, -32, -30, 26, -14, -25, 31, -36, -24, -17, -36, 10, 61, -37, -2, +29, 54, -16, -24, -25, -16, -52, -27, -28, 2, -26, -26, 0, 0, -29, -5, -4, 31, -20, -13, 6, 19, 30, -5, 12, 0, -2, 7, 1, 14, -5, 17, 14, 6, -9, -6, 14, -5, 80, -15, -14, 2, 43, -1, -20, 10, -55, 48, 1, -6, -12, -39, -19, -14, 19, -22, 1, 8, -7, -47, 7, -16, -11, -36, -27, 22, 0, 23, -29, -6, -82, -67, -40, -6, -1, 93, -16, -51, 4, -9, -1, +-36, -17, 24, 31, 14, -23, -1, -22, 8, -10, 33, 12, 78, -40, -60, -15, 39, 5, -12, -14, 14, 69, -51, -56, -10, -27, -23, -29, -1, -6, 9, 19, -20, -34, -26, 35, -19, -3, 35, -22, 57, -24, -12, 28, 30, -36, -71, -41, 35, 26, -14, -20, -5, 123, -41, -65, -30, -11, -2, -15, -2, -3, -16, -5, -62, -28, 23, 38, 4, -17, -4, 16, 47, -23, 15, 29, 71, -39, -73, -15, -21, +24, 2, -24, 26, 111, -70, -41, -10, -22, -21, -22, -12, -43, -26, -30, -20, -37, 16, 16, -25, 36, 23, -29, 9, -32, -22, 3, -72, -15, -22, -61, 6, -3, -21, -18, 32, 72, 7, -6, 11, 73, -43, 5, -33, -20, -21, -19, -17, -5, 4, -3, -17, 8, -4, 4, -31, -8, -24, 6, 15, -26, -6, 4, 0, -9, 9, -8, 15, -55, -32, -16, 17, 40, 10, -1, -15, -23, 30, 8, 15, -23, +-24, 2, 22, 34, -17, 13, 2, -2, -20, -6, 35, -34, 34, 21, 14, -3, 26, 33, 14, -64, -30, -30, 3, 48, -16, -31, 0, -15, 4, -7, -45, -26, -36, -41, -12, 41, -10, -20, 53, -10, -17, -16, 96, -1, -38, 3, -32, -7, 9, 24, 26, 115, -1, -33, -34, 10, -21, 43, 45, 5, -36, -12, -3, -5, -8, 8, -7, 24, -9, -14, 5, -10, -23, 19, -98, -21, 13, 9, 14, 9, 17, +14, 39, -63, -26, -34, 10, 106, -13, -9, -20, -23, -45, 18, -4, -19, -7, 4, -4, 22, 5, 9, -1, -7, -2, 22, -82, -32, 14, 7, 30, -6, -3, -14, 19, -65, -22, -40, -6, 113, -11, -3, -25, 20, 6, -4, -11, -24, -4, -24, -50, 22, 3, -21, 30, -45, -4, 19, 118, 15, 6, -9, 0, -18, -11, -25, 5, -37, -8, 1, 6, -45, 28, 13, -1, 0, 10, -17, 2, -10, 8, -43, +-35, 21, 16, -17, 4, -15, -34, 33, 127, -4, 1, -3, -4, -12, 29, -33, -8, -30, -9, -15, 16, -41, 16, 15, 27, -40, -77, 68, -9, 7, -36, 29, 17, 3, -32, -27, -36, -49, -18, -2, -61, 69, 1, 59, -69, 4, 17, 17, 101, -18, -67, 127, -15, -78, -39, 103, 8, -22, -40, 51, -10, -33, 35, 25, 44, 48, -16, -62, -6, -41, 37, 24, 72, -4, 95, 36, -60, -22, -11, 6, 22, +-33, -4, 111, -4, 12, -1, 63, -45, -10, -32, 35, 9, -20, -15, 6, 41, 9, 17, -82, -7, -36, -27, 17, 21, 80, 60, -3, -63, -12, 0, 36, 13, -21, -1, 50, -14, -38, -19, 84, -15, -17, -8, 18, -5, 5, 20, 36, -10, 13, 0, -5, -17, -2, -33, 14, 61, -40, -13, 9, 16, -2, 23, -40, 32, -4, 38, 19, -26, 14, -41, 127, -24, -3, 21, -27, 34, -5, 2, 6, -7, -24, +19, 42, 1, -8, 27, -18, 44, -9, -11, 11, -24, 18, 8, -31, 8, -15, 16, 1, -32, -3, -22, 44, 34, -28, 31, -23, 25, 12, 25, -31, -18, -8, 12, 127, -40, 20, 6, 14, 41, -35, -39, -13, -36, 16, -35, -28, 20, -20, -17, -1, -37, 3, -41, 31, -8, -21, 30, -20, 17, 9, 29, -55, -40, -3, 12, 127, -30, 13, -18, 9, 46, -16, -28, -10, -16, 27, -11, -6, 11, -23, -32, +-15, -21, 6, -44, 29, -13, -25, -8, 20, -20, 32, 19, -26, -8, 5, 34, -44, 5, 65, 25, 1, 8, -7, 6, -32, -16, -7, 27, -27, -3, 24, -29, 28, 33, -23, -60, 101, 12, -10, 3, -16, 9, 106, 35, 6, 8, 8, 59, -21, 7, 71, 17, 6, -67, 50, 17, -63, -41, -19, 59, -8, -27, 27, -13, 29, -1, 10, -75, 118, -19, -25, 10, -7, 41, -11, 10, -9, -6, -31, 6, 32, +-41, 31, -34, 1, -15, 19, 5, 13, -10, -30, 7, 19, 18, -34, 60, -37, -23, -4, -1, 127, 18, 4, 38, -26, 12, -39, 12, -8, -5, 24, 16, 12, -13, 22, 30, -66, 54, 30, -11, -23, 25, -30, -11, 27, -29, -5, -46, -4, 13, 22, -18, 42, -50, -14, -6, -18, 14, 69, 25, -18, -19, 24, 8, 21, -33, 70, 37, -31, -27, 7, -11, 10, -14, -11, 10, 31, -3, -13, -36, -23, -4, +41, -22, 87, 27, 31, 6, -13, 25, 53, 26, -1, -5, 34, 2, 82, -25, 39, -17, -54, -11, 4, -10, 9, -23, -41, -12, 0, -51, -1, -30, 10, 19, 38, -30, 37, -41, 31, 4, -50, 10, -9, 22, 15, 23, 38, -2, -20, -25, 32, 29, -13, 82, -20, -20, 13, -20, -20, 19, -2, 8, -18, -22, 28, -7, 28, -37, 37, -21, 24, -11, -29, 6, -22, -22, 5, 6, 14, 25, 6, -18, 26, +43, -14, 54, -41, 12, 11, -24, -37, 22, 17, -4, -18, -7, 46, 0, -23, -7, 87, 28, -1, 25, -30, -2, -5, -4, 14, 15, 17, 48, 8, -8, 40, 84, -8, 28, -24, -14, -4, -2, -22, 35, 21, 34, -17, -22, -26, -8, 22, 39, 106, 28, -43, 20, -14, 115, 15, 5, 52, -20, 33, -72, 27, -12, 15, -1, -29, 52, -7, 32, 11, 20, 14, -16, 22, 50, -22, 11, -13, -27, 23, -25, +-8, 52, 31, -31, -13, 38, -16, -43, 95, -33, 25, -66, 5, 12, 95, -49, 30, -9, 49, 42, -10, 3, -50, -51, 9, 18, -67, 21, 22, -16, -7, -12, 50, 16, -16, -12, -16, 101, 11, -20, 56, -29, 58, -54, 5, -7, 46, -34, 25, 9, 68, 8, -43, 45, 2, -60, 14, 54, -61, 30, -7, 17, -20, -41, 32, 51, -14, -23, 6, 20, 30, -3, -29, 14, 111, 102, -13, -20, 50, 74, 4, +-14, -10, 15, -36, -1, 44, 21, 16, -4, 10, -20, 7, -7, 37, 7, -36, -11, 5, -21, -29, -18, -3, -21, -44, 22, 37, 30, -22, -5, 52, 2, -17, -21, 47, 14, -17, 4, 13, -20, 90, -3, -37, 17, -44, -18, 7, -14, 30, -6, 37, -37, -19, -20, 43, -7, -41, 11, 59, 32, -41, -10, 54, 4, -24, -7, 65, 7, -27, -31, 27, -8, 103, 14, -14, 12, -67, -23, -21, -13, 41, -12, +16, -17, -48, -36, 34, -22, -31, -1, 65, 17, -28, -16, 47, 13, -2, -17, 49, 2, -30, -24, 27, 7, 121, 21, -22, -1, -61, -25, -1, 3, 28, 2, 5, -12, -28, 4, 39, -11, 43, 1, -22, 30, -34, 17, 45, -13, -10, -3, 1, -7, -12, -8, -37, -6, -16, 55, -27, -2, 24, 2, -51, -13, -33, -2, -10, -37, -61, 55, 29, -3, 40, -11, 16, -5, -17, -23, 49, -6, -18, 8, -26, +11, -1, -17, 4, 71, -85, 85, -33, 2, 6, -15, -42, 2, -33, -44, 24, -28, 9, 4, 43, 17, 50, -17, 13, 58, -19, -5, 35, 106, 14, 9, 42, -11, 90, -8, 3, 48, -27, -25, 11, 11, -7, -26, -54, -24, -22, -34, -1, -11, 14, -10, 34, -10, 20, -26, 61, 35, -25, 14, -7, -18, 43, 8, -19, -12, -3, -57, -50, -33, -22, 11, -12, -3, 14, -18, -10, -49, 35, -22, 17, -14, +-27, -13, -43, 7, -2, 24, 37, -46, -16, 27, 85, -14, 13, 12, -25, -4, 28, -41, -1, -11, 20, 33, -23, 46, -18, -25, -62, -8, -20, -5, -9, -12, 23, -41, 1, -40, -2, -21, 22, -25, 12, 4, -14, 4, -5, 40, -31, -5, 14, -31, -1, 27, -42, 15, 2, 4, 17, 24, -11, -22, -13, -20, 26, -20, -40, -2, -45, -11, 15, -29, 28, -30, -10, 16, 41, -24, 21, 24, 14, 25, 2, +-8, -42, -28, 20, -10, -5, -27, 32, -26, -28, -21, 12, -9, 36, -16, -20, -52, 1, 33, 38, 1, 35, -25, 17, 9, 73, 8, 30, -15, -12, 9, -21, -2, -20, -11, 6, 6, -18, -24, -27, -29, -5, -16, 3, -7, 20, -28, 2, -53, -11, 25, 28, 14, 72, -42, -10, -11, 70, 7, 7, -5, -21, -17, -43, -57, -41, -38, 13, -27, -26, 0, 15, -20, -25, 12, 47, -24, 9, -62, 71, -24, +11, 86, 2, 12, -28, 5, 8, -27, -23, -51, 66, -29, 23, 10, -61, -31, 43, -10, 17, 81, -20, -16, 46, -31, -65, -42, -4, -30, 37, -58, 39, 16, -30, -16, 24, 13, -55, -6, 38, -11, -30, -35, 44, -10, -39, -20, -33, -39, -127, -10, 14, 109, -50, 8, 48, -20, 76, 8, -6, -23, 33, -42, -11, 27, -2, 19, 16, 10, -4, 20, 19, -31, 1, -24, 38, -16, 24, 0, -54, -28, -41, +-5, 44, 23, -62, -15, 12, -43, 26, 39, 1, -37, -27, -14, -24, 12, -3, 0, -19, 51, 12, -21, -46, -31, -22, 8, 31, -27, -19, -18, -4, -38, -24, 26, 6, -21, 19, 27, -12, 22, -64, 11, -23, 8, -8, -10, 19, -46, -23, -15, -4, 8, 0, 57, -17, -31, -3, -17, 17, 4, -22, 2, -31, 110, 31, 1, -46, 99, -28, 5, -2, 24, 33, 127, 11, -24, -14, -9, -7, -24, -23, -29, +15, -11, 8, 53, 3, -12, 9, -27, 21, 65, 0, -22, -3, 88, 32, -28, -42, 86, -17, -33, -16, 44, 73, 118, -23, 31, -32, -8, 3, -17, 2, -11, -11, -3, 30, 44, 7, 13, 28, -24, 1, 49, 12, -6, 15, 75, 28, -20, -28, 118, -27, -36, -11, 43, 48, 122, -8, 16, -51, 20, -21, -7, -43, 51, -27, 23, -26, 39, -26, -11, 4, -37, -50, 30, 4, -24, 2, 44, 81, -45, -45, +24, -20, 35, 38, -3, -46, -15, 9, 8, -62, -6, 11, -22, -85, 45, -22, 23, -20, 24, 6, 0, 6, -63, -22, -81, 13, -27, -25, -59, 98, -20, -43, 108, 1, -2, 73, -18, -57, -15, 45, 7, -12, -9, 19, -11, 1, 20, 11, -14, 103, 40, -38, -7, -51, -28, 29, 13, 56, 8, 15, 38, -8, 38, 0, 75, -15, -38, -39, 6, -8, 21, 1, 25, 33, 16, -2, 5, -57, 36, 30, -25, +54, 64, 14, 4, -11, -12, -26, -32, -30, -23, -8, -35, -43, -2, 36, -26, -35, 45, 1, -25, -20, 16, 17, 16, 19, 1, 42, -26, -41, 15, 20, -13, 54, 61, -33, 1, 15, 2, 23, -24, 39, 14, -8, 75, 32, 18, 5, 127, -28, 3, 14, -59, 14, -2, 8, 50, 23, 34, 14, -6, -39, 51, 22, 9, 75, -5, 0, 0, -17, -4, -28, -45, 39, -7, -4, 70, 0, -7, 33, 125, 0, +19, -7, 22, 2, -3, 9, 26, 31, 7, 17, 2, -70, -30, -1, -20, 9, 13, -7, 3, -33, -52, 27, -13, -52, -8, 17, -17, -65, -8, 13, 109, -24, 46, 0, -23, 74, 5, 14, 12, 5, -14, 14, -33, -48, -44, 16, 5, 18, 28, -10, -12, -1, -19, 33, -27, -22, -28, 4, -51, -57, -2, 22, 109, 0, 37, 1, -18, 69, 43, 7, -12, -27, 20, 18, -43, -21, -5, -14, 13, 39, 56, +-9, -17, 34, -18, 17, 12, -19, -4, 3, 127, 75, 14, -40, -1, -29, 20, -3, -12, 4, 57, -4, 18, -39, -33, 27, -55, 24, -8, 39, 78, -38, -25, -17, 34, 65, -26, 64, 28, 13, -40, -39, 32, 17, 78, -19, 27, -10, 123, 9, 47, -2, 22, -14, 10, 26, -26, 21, -65, -15, 56, 52, 36, -66, -44, -36, 29, 71, 18, -59, -38, 29, -23, -38, -1, -40, 91, 32, 51, 8, 123, -13, +60, -20, 0, -14, 2, -9, -16, 8, -50, 13, 83, 115, 86, -80, -43, -11, -6, 63, -35, -42, 20, 17, -26, -9, -4, -5, 80, 49, 51, 25, 127, -24, 55, -20, -11, -23, 3, -16, -16, 70, 33, 2, 37, 48, -14, 26, -13, -15, 6, 67, 7, -2, -3, -4, -10, -7, 51, 63, 20, 1, -24, -21, 8, 1, -9, -37, 11, -11, 3, -35, -43, -2, 34, 7, 45, -16, 22, -3, -1, -8, -11, +-43, 3, 5, -16, -12, -19, 14, -38, 11, 15, 8, 2, 51, -24, -33, -26, 12, -6, -30, 32, -19, -35, -42, 21, -29, -3, 6, 51, 30, -23, -10, -4, -27, -16, 22, -23, -11, -24, -11, -22, -6, -5, -9, 2, 41, 0, -29, -42, 30, 1, -45, 37, -21, -36, -39, 6, -23, -5, -11, 42, 19, -21, 10, -12, -26, -5, 5, 14, -28, -25, -24, -24, -14, -14, 15, -1, 38, 6, -24, -47, 16, +3, -55, 9, -37, 5, -14, -14, -13, -61, 34, 23, 22, 4, 2, 37, 70, -21, 50, 15, 1, 10, 25, 61, -24, -23, 20, 54, -4, 44, -12, -58, -39, -21, -22, -22, -94, 2, -46, -29, -53, -114, 13, 50, 51, -17, -10, 85, 93, -13, 67, 12, -7, 22, 18, 53, -80, -20, 15, 47, 30, 88, 9, -54, -28, 6, -40, -42, -40, 12, -30, -25, -10, 1, -21, 19, -31, 14, -23, -22, 40, -13, +-2, -10, -4, -24, -10, -49, 19, -73, 7, -3, -3, 75, 37, -24, -5, -10, -36, 7, -20, 2, -16, -16, -47, 14, 62, 36, -20, -24, 27, 0, 52, -9, -31, 12, -13, 8, -10, -44, -35, 37, 14, -4, -34, 127, -31, 4, 6, -16, -11, 11, -14, -20, -31, -5, -12, -31, -20, 28, -20, -11, 15, 42, -16, 0, -37, -56, -25, -7, -5, -66, -21, -10, 23, -26, 7, 112, 1, 5, -14, -12, -35, +-24, -7, -27, -29, -8, -49, 6, 12, 50, 9, -3, 5, 46, 40, -12, -23, -7, -11, 2, -22, -33, -28, -33, -8, -35, -3, 127, -7, 16, 27, -9, -35, -10, 26, -37, -39, 17, -26, -12, -20, 31, -9, -22, 2, 53, -30, -47, -47, -48, -6, -7, 6, -43, -49, 54, -11, 0, -16, 127, -12, -2, -13, -29, -18, -14, -22, -25, -18, -7, -3, -17, 11, 27, -33, 3, 13, 33, -93, -28, -22, -10, +-4, 17, 5, -57, -36, -5, -3, 12, -7, 84, -17, 2, -17, -7, -34, 32, 40, -26, -29, -12, 34, 6, 0, 35, -3, -15, -22, 2, -49, 4, -24, -8, -8, -26, 37, -34, -39, 31, 2, 33, -16, 78, 4, -20, -13, -4, -34, -27, 24, 4, -23, -27, 9, -47, 32, -42, -19, 24, 22, 30, 15, -28, 9, -63, -15, -19, -13, -10, -18, -35, 0, -35, -45, -1, 11, 88, 5, -9, -51, 15, 37, +-2, -31, -3, 6, 7, 46, -32, -47, -1, -12, -16, -34, -33, -1, -41, -40, -34, -2, -17, -36, -22, -16, -27, -29, 1, -1, 30, 10, -20, -50, -4, 31, 34, -13, -4, 21, -32, 29, -27, 12, -2, 7, 8, -24, -42, -10, -41, -49, -9, -19, -47, -29, -11, -32, -52, -29, -2, 16, 83, 7, -27, -57, -1, 3, -29, -1, 26, 24, -4, 0, -39, -33, -21, -25, -33, 26, 19, -29, -30, 25, -33, +-14, 8, 90, -34, 58, 36, 47, -17, 18, 16, 18, -35, 37, 34, 71, -37, -7, -2, -10, 28, 27, -5, -9, -10, -2, -25, 27, -7, -25, -13, -10, 2, -3, 41, 12, -23, -4, -16, 41, 6, 6, -3, 1, -29, 4, 20, 56, 7, -32, 6, -44, 34, 21, -2, -14, -3, -9, -39, 55, -16, -28, -18, -20, 6, -8, 42, 20, -8, 26, -3, 43, 8, 7, -46, 7, -29, 0, 31, 22, 6, -50, +-7, -11, 27, 10, -31, -4, -19, -4, -45, 43, -20, -34, -27, -9, -1, -8, 24, 19, 7, 3, 30, 69, -13, -12, -22, 27, -27, 3, 42, -3, -38, 8, -10, -2, -43, 46, 30, 99, -21, 3, 12, 16, -47, -44, -6, 19, -36, 18, -28, 31, 44, 2, -21, -19, -14, 2, 127, -16, -5, -11, 66, 49, -44, -17, -34, -7, -46, 23, 69, 92, -50, -12, -52, 15, -58, -78, 4, 39, -56, 20, -17, +30, 62, -19, 0, -17, 5, -64, 126, -28, -19, -27, 66, -5, 44, -2, -1, -3, 3, -32, 11, -44, -49, -21, -22, 4, -10, -21, -32, -7, 69, -3, -31, 52, -1, 62, 15, -39, 45, -19, 22, -5, 26, 72, -92, 62, -13, -30, 23, 30, -27, 27, -29, -39, 3, -23, 3, -11, -43, -49, -24, -10, 34, -24, -14, -35, -2, 9, 2, 43, -18, -12, 110, -25, 23, -8, -34, 56, -23, -59, 30, 0, +-8, 15, 37, -31, -26, -2, -33, 33, -53, -41, -55, -31, -58, -6, -27, -29, -20, -43, 4, -7, -10, -4, 52, -11, 16, -9, -47, 88, -16, -35, 28, 9, -13, 24, 15, -29, -21, -48, -3, 12, -29, -28, -9, 11, -28, 37, -7, -9, 2, -30, 32, -10, -25, -12, 52, -25, -26, -41, -29, 68, -6, -24, -4, 9, 2, 47, -12, -34, -6, -19, 9, -24, -29, 14, -58, -6, -58, -4, -10, -43, 11, +-43, 23, 59, -20, -20, 51, 22, 2, -20, -21, -15, -26, -42, 1, 7, -12, 29, 26, -24, 4, -5, 39, 4, -29, -7, -42, -30, -42, -2, 3, -40, -15, -16, 4, -8, 16, 6, 29, 14, -20, -9, -10, -37, 30, -11, 11, -13, 13, 41, 29, -48, -5, 16, 3, 4, -13, -37, 2, 14, -45, -15, -2, -42, 0, -15, 4, -15, -1, -6, 33, -4, 0, -5, 9, 47, 0, -43, 19, -8, 39, -48, +-50, -6, -28, -55, 42, -10, -24, -37, 1, 6, -55, -51, 10, -18, -8, -38, -9, -29, 26, 47, 7, -30, -16, -32, -17, 11, -3, 13, 84, -1, -5, -42, -37, -5, -38, -35, 6, -15, -33, -17, -18, -40, -24, -5, 30, -10, -19, 5, -25, -42, 51, -3, -5, -45, -62, 43, 84, 6, 17, -53, 59, -18, -12, -1, -43, -10, -12, -46, -3, -27, -62, -11, -25, -16, -47, -7, 5, -1, -39, -28, 1, +-40, 29, -41, -18, -36, -67, 1, 95, 4, -27, 1, 24, 16, 1, -4, 28, -1, -3, -31, -6, -24, 4, 10, 22, -6, 15, 11, 13, -23, -8, -18, -26, 4, 24, 28, 20, -32, 22, -36, 12, -15, -13, -17, 7, -8, -13, -26, -23, -25, -8, -23, -46, 0, 4, -19, 3, -3, 4, -10, 13, 1, 3, -24, -8, 67, 17, -32, 14, -3, 19, 33, 20, -9, -55, 18, -7, 6, -24, -16, -20, -21, +-12, -18, -27, -37, -2, -14, 34, 35, 7, -25, 41, -24, -13, -19, -42, 85, 16, -26, -39, -12, 23, 2, 7, -8, -47, 17, -15, 16, -24, -9, -23, 17, -4, -49, -38, -7, -3, 2, 22, 1, 1, -13, 17, -11, -17, -6, -27, 86, 27, -23, -14, -6, 29, 21, 7, 10, -25, 20, 38, 31, -1, -4, -44, 11, -28, -15, 45, 31, 18, -38, -27, 12, 29, -52, -27, 12, -2, -37, 3, 10, 29, +-21, 7, 30, -41, 84, 5, 19, -39, 50, 12, 36, 2, -47, -60, -12, -5, -17, 84, 13, 11, -3, 5, -26, 28, -38, -40, 23, -5, -15, -15, 18, -8, 3, -7, -16, -28, 100, 3, 15, -18, 29, 36, -7, -33, 33, -47, 27, 46, -39, -25, 24, -23, 0, 0, 10, 51, -6, -26, 12, -10, -10, 0, 10, -31, -16, 8, -16, 56, -37, -6, -3, 32, -2, 14, 14, -6, -23, -19, -7, -10, 9, +-35, -36, -7, 1, -5, 9, -47, 3, -23, 0, -5, 42, -25, -6, 11, -4, -1, -10, -47, -40, 33, -2, 35, 64, 4, -5, -43, 8, -22, -3, -16, -23, -26, -12, -25, -38, 1, 11, 13, -71, 4, -19, -28, 19, 1, -5, -3, -25, 0, -6, -41, -19, -9, 5, -51, 7, -40, 31, -16, -40, -14, 11, 12, -21, -27, -19, -26, -13, 2, -23, 19, -51, -36, -4, -4, 6, -43, -4, 0, 19, 11, +-28, -64, 4, 31, -48, -19, -4, 16, 14, -3, -21, -10, -12, -11, 11, 9, -4, 16, 2, 11, -1, 11, 31, 10, 37, 13, -8, -17, 4, 26, -7, 17, -13, -16, 86, 62, -46, 21, -9, 43, -10, -10, 16, -17, 3, -26, -8, -1, -4, 55, 31, 3, -16, 1, -5, 7, 2, -7, -13, -28, 3, 29, 10, -8, -7, -22, 78, 43, -25, 32, -30, -3, -14, -29, -7, -35, -14, 13, -29, -10, 0, +5, -10, -19, 5, -16, -1, -3, 29, 1, -4, -40, 55, 85, -9, -23, -32, -28, 53, 11, -33, -48, -2, 28, -12, 39, -16, -58, 51, -36, -16, -8, 2, 38, -5, -16, 22, 1, 14, 10, -51, 18, 67, -67, -21, 38, -13, -28, -13, -13, -34, -18, -46, -49, -29, 3, 33, 46, -15, -18, 24, 47, -18, -49, -4, 74, 18, 12, 23, 79, -59, -1, -21, 67, 30, -7, -61, 81, -45, -31, -39, -13, +-5, 0, -30, -45, -11, -9, -6, 64, -26, -38, 37, 68, -12, -30, -1, 34, 21, 5, -16, 23, -24, 12, -38, 10, 51, -35, -4, 75, -29, -25, -16, -10, -15, 14, -23, 3, 3, -22, -14, 4, 18, -24, -26, -27, -16, -31, -42, 13, -7, -34, 21, -19, 45, 14, -4, -6, 5, -11, -47, -32, -9, 38, -3, -24, -26, -14, 0, 2, -28, 3, 10, 9, -39, 9, -10, 3, 18, 12, -33, 33, 15, +2, 52, -15, -7, 4, -32, 53, 12, 47, 17, -16, -20, -20, 5, 18, -11, 32, 4, -5, 0, 4, 17, -24, -35, -23, 27, -10, 7, -35, -13, 23, 36, -25, -9, 1, -7, 13, -28, 35, 31, 99, 5, 6, -25, -29, 10, 44, -24, 11, 8, -5, -2, -3, -1, 6, -31, -17, -4, -52, 34, -25, -16, 25, 13, -1, -15, -33, -14, 10, -24, 37, 13, 97, -13, -12, -29, -47, 9, 34, -26, 20, +-36, 28, 8, -39, 43, -19, -62, 4, 28, 19, -14, -4, 21, 27, 2, -11, -32, -24, 35, 41, -19, 22, 34, -72, 17, 3, 6, 7, -16, -13, -25, 33, -21, 9, 27, 7, 42, -16, -46, -40, 75, 51, -1, -44, 0, 93, 37, -12, 17, -36, -15, 24, -30, -21, 75, -59, -61, 58, 27, 4, -29, 6, 9, 32, 20, -5, 2, -17, -11, -59, -28, -10, 6, -26, 11, -1, -9, -2, 15, 10, -40, +80, -9, 32, -36, 1, 31, 50, 21, -55, -49, -24, -18, -1, -14, 6, -43, -33, 26, 17, -12, -7, -16, -33, -7, 61, 7, 7, -10, 46, 9, -5, 100, -23, -2, 4, -38, -15, 19, 83, 15, -35, -12, -3, -10, 6, 7, 56, 6, -23, 20, 2, 24, -8, -47, 0, 24, 1, -5, 10, -35, 57, 9, -19, 100, 2, -18, -20, -21, 34, 22, 85, -9, -22, -25, 5, -15, 45, -25, 62, 1, -5, +29, 10, -11, -7, -34, -7, 41, 7, 9, -13, 2, 85, -9, 5, 108, -17, -52, 13, -6, 17, 50, 97, 13, 13, -1, -5, -27, 44, -13, 0, -4, -34, 5, 23, -8, 20, -24, -37, -3, 28, 17, 6, 22, 79, 4, 10, 102, 3, -6, -33, -17, 41, 30, 25, 31, 8, -26, -9, -19, 17, -2, 33, 56, -32, -11, -7, 30, 8, 12, -18, 5, 45, 29, -18, 8, 96, 4, 7, 23, -7, 32, +-33, -3, 49, 15, 38, 6, 3, 24, -50, -32, -24, 9, 17, 58, 34, -2, -13, -12, -12, -38, -40, -15, -2, -8, -23, -6, 40, 13, 6, -19, -7, -19, -25, -16, 24, -26, 58, 11, -38, 7, -27, 26, -13, -19, 47, -41, -3, -15, 47, -27, -61, -5, -89, -2, 37, 22, 40, -35, 26, 94, -73, -5, 1, -1, -59, 30, -45, -31, -5, 42, -21, -21, 55, -6, -24, 4, 17, -8, -37, 40, -5, +-26, -17, -16, -26, -38, 64, 24, 24, 6, 30, 52, -54, -51, -40, 22, -63, 33, 3, -15, 4, 77, -9, -22, -10, -24, 12, 8, -6, -37, -47, 13, 7, -35, -29, 0, -4, -22, 60, -11, 43, 15, 29, 58, -18, -2, 2, -22, -65, 50, -6, -22, 28, 53, -12, 0, -13, -6, 3, -2, -23, -13, 21, -22, 29, 4, -4, 26, -27, -13, -4, 1, -14, 5, -15, 25, -36, -19, -28, 1, 11, -22, +-33, 22, -16, -30, -24, -13, 10, 45, 58, -5, -7, 1, 22, -12, -34, -4, -38, 25, 5, 7, 2, 16, 46, -40, 6, 24, 43, -16, -29, 28, 2, 14, 19, -12, 9, 55, -6, -10, 18, -23, 17, 5, 18, -20, 0, -31, -22, -4, -46, 34, 43, -8, -41, 21, 40, -31, 0, 32, 36, 14, -15, -15, 34, 7, 10, -5, -13, 90, -18, -24, 0, -44, 2, 0, -14, -19, 2, -22, -7, 1, -26, +37, 51, 7, -36, 55, 23, -17, 18, 9, 47, 32, -11, 12, 29, 6, -1, -7, -7, 98, -27, -38, 1, -9, -33, 4, 32, 0, 7, 16, 21, -30, 6, 35, -9, -34, 4, -33, -12, -32, 1, 2, 54, 27, 32, 7, 47, 10, -27, -22, -3, 35, -56, -33, -2, -27, -20, 6, 2, 23, 13, -10, 15, -42, 13, 3, -43, -9, -28, -38, -10, -20, -23, 7, 127, -21, -59, -28, 85, 10, -66, -72, +-21, 55, -38, -28, -4, -57, -58, -13, 3, -32, -17, -16, -1, -20, -13, 4, -27, -30, -26, 9, -28, -2, -26, 35, 44, -37, 63, 23, 7, -21, 28, 34, 36, 33, -31, -17, -4, 85, -19, 2, -21, -46, 22, 10, -12, -22, -25, 19, -44, -17, 8, -42, -40, -8, 6, -16, -77, -15, 12, -35, 64, -3, 17, 10, 6, 90, -11, -29, -15, 114, -12, 3, -26, 4, 5, 10, -27, -26, -20, -4, 9, +-16, 32, -18, 60, -19, -2, -1, -6, -69, 23, 45, 16, 14, 2, 0, -2, 80, 8, -22, -7, 72, -65, 18, 0, -48, -8, -25, 6, -45, -19, 41, 14, -19, -31, 28, -41, -33, -16, 19, 31, -34, -14, 15, 53, -30, 1, -23, -27, 92, -22, -23, 3, 46, -27, -5, 28, 22, -2, 30, 10, 6, -20, 53, 20, -5, 11, 3, 26, -26, 37, -14, -11, -61, -18, 14, 32, -13, 15, -30, -6, 91, +-31, -37, -6, -32, -7, 0, 6, -13, -11, 13, -22, -4, -21, 29, 40, 3, 14, 11, 26, -2, -14, 6, -23, -28, -25, -32, 12, 23, 5, 3, -23, 127, 0, -46, -11, -13, -17, -32, -22, -7, -8, -20, -55, -9, -14, -8, -45, 58, 22, -10, 11, -33, -12, -4, 77, -9, -44, 2, 0, -4, -4, 68, 31, 116, -8, -22, -7, 42, -28, -26, 30, -19, -12, 33, -8, -34, 25, 6, 28, 63, 37, +49, 32, -3, -11, 20, -45, 127, 73, 17, -33, -7, -2, -43, 27, 19, -45, -11, -48, -72, -28, 10, -63, 6, -29, 11, -48, -12, -6, -6, 42, 11, -17, 19, 29, -20, -17, -4, -37, 101, 11, 2, -32, 18, 30, -4, 5, -25, 3, 9, 22, 0, -7, 55, -36, 1, -22, -25, -8, 40, 4, -21, -17, 32, 50, 6, -7, 21, -27, -5, 67, 111, -40, 30, -40, -28, -5, -42, 30, 2, 3, 13, +-10, 20, -28, 33, 19, 17, -32, 55, 24, -82, 6, -8, -20, -29, 3, -14, 2, 44, -34, -25, 0, 43, -15, 32, -33, -40, -27, 4, 55, -66, -12, 21, 10, 2, -13, 81, -41, 27, 15, -26, 66, -36, 17, 34, -48, 7, 27, 110, 7, 10, 22, -53, 49, 127, -21, 8, -12, -4, -35, -42, -2, 13, -22, -39, -8, 11, -52, 11, -34, -11, -6, -2, -13, 39, 11, 39, -7, -6, 51, 37, -28, +34, -20, 1, -27, 127, 40, 26, -38, -24, 23, 3, 26, -8, -12, 6, -11, -14, -51, 16, 60, -9, -23, 16, -22, 13, 31, 9, -17, -19, 47, 40, -12, 49, 13, -30, -6, 127, -14, 22, -29, -26, -26, -9, 14, -9, -39, -39, 11, 0, -34, 11, -2, 23, -46, 72, -23, 32, 2, -27, 29, -1, 15, -3, -28, -29, -48, -5, -47, 58, 17, 39, -59, -7, 9, -59, 55, -28, -20, 25, 34, -45, +-9, 71, -39, 7, -33, 13, -51, -94, -34, 0, 77, 17, -63, -31, -7, -6, 5, 47, 77, -15, 32, 37, -47, -36, -42, 12, 26, -77, -25, 44, 8, 9, -32, 44, -58, -4, -39, 87, -27, 20, 28, -20, 15, 30, -11, -2, -36, -31, -1, 33, -23, 35, -2, 47, 9, -13, -16, -13, 99, 1, -60, 14, -1, 8, -38, 52, -13, -9, -26, 115, -26, 75, 50, 11, 34, 50, 26, 3, -3, 5, -44, +25, -74, 56, 55, 81, -22, 6, 3, -24, 113, 20, -72, 43, 10, -22, -48, 46, -6, -7, 13, 45, -68, 24, 34, -32, 41, -6, -5, 7, -66, -20, 19, -34, -40, 66, -58, 65, 21, 16, 43, -39, 74, -9, -29, 127, -15, -16, 26, 82, -8, -2, 1, 95, -28, -14, -15, -48, 5, 7, 10, -20, -20, -11, -18, -19, -22, 3, -10, -51, 18, 32, 33, 18, 42, 23, -20, 70, 16, -36, -26, 127, +29, -12, 24, 53, 18, 42, 29, -17, 32, 43, -6, 2, -49, -18, -15, 23, -80, 28, 35, 15, -13, 7, 16, -6, 49, -7, 57, 67, 4, -60, -21, 72, -39, 27, -4, 79, -24, 78, 28, -9, 25, 16, -16, -70, 8, -15, -3, -41, -40, 54, 65, 12, -19, 5, 17, 16, 7, 0, 42, 59, -28, 18, -2, 95, -19, 12, 16, 37, -11, 19, 37, 19, 24, 9, 1, -49, -33, -61, -8, -4, -18, +102, 28, 26, -21, -35, 1, -10, 41, -29, -28, 33, -20, -40, -20, 65, -37, -3, 16, 45, 34, -48, 3, 65, -15, 8, -21, -11, 22, 51, 52, 36, 44, 44, -11, -27, 41, -44, 79, 59, 118, -73, 10, -33, -27, -37, 24, -60, 3, -29, 20, -35, -10, -13, 12, -3, -10, -1, 26, -35, 4, 73, 34, 11, 7, -51, 12, -22, -4, -35, 12, 1, 100, -40, 27, -39, 1, -36, -24, -23, -2, -42, +24, 75, 29, -40, -6, 15, -25, 75, 6, 6, 0, 2, 66, 10, 14, 7, -1, -19, -16, 26, 59, -4, 121, -31, -11, -12, -46, -45, 32, 18, 9, -28, 28, 47, 35, -25, -22, -5, -4, 44, 126, -19, 21, -10, 36, -21, 37, -49, -15, -18, -50, 38, 43, -12, -1, -32, -38, 22, 13, -8, 35, -6, 4, -15, -16, 101, -21, -53, -3, 89, -41, 66, 53, 9, 42, -25, 20, 7, 17, -53, -13, +-10, -34, -50, 23, 31, 64, -30, -21, 3, -23, -71, 63, -34, 13, 4, 27, 55, 3, -32, 6, 10, 5, 37, -34, -7, 9, -3, 34, -20, 39, -21, 3, 16, -1, -11, 39, -19, 89, -13, 22, 12, 46, -44, 70, -10, -29, -39, 28, 81, 22, -4, 7, 18, -14, 57, -33, -20, 7, -12, 56, 20, 43, -26, -20, 7, 2, -2, 64, -19, 116, -36, -10, -1, -4, -37, 19, -13, -3, 21, -34, 16, +126, -23, 28, 43, -59, 8, -29, -9, -27, -3, 52, 32, 32, 48, 39, 34, 44, 24, 23, 36, 44, -8, 12, 12, -5, 52, -22, 12, 12, 50, -17, 54, 65, -6, 14, 84, -63, 28, 18, -21, 6, 61, -11, 74, 36, 4, 6, 25, -32, -49, 11, 29, 35, -69, 20, 51, 2, 53, 0, 15, -2, 10, -9, 36, 112, -34, -19, 47, -54, 22, 0, 16, -19, -27, 21, 9, 8, 0, 23, 15, -20, +4, 66, 24, 39, -19, 37, 7, 6, 64, 16, 27, -13, 17, -41, 40, 115, -56, -31, 98, -61, 16, -10, 3, -26, 5, 22, 16, 27, -3, 31, 8, 13, 16, 67, -15, 56, -26, 42, 20, 12, 80, 6, 21, 39, 25, -40, 13, 67, -13, -67, 18, 4, -17, -33, -5, -53, 29, 74, 16, 26, 55, 34, -58, -71, -35, 98, 48, 37, 21, 39, -42, -30, 47, -44, 20, 27, -25, 0, -25, 32, 9, +-19, 15, -18, 5, 2, 26, -34, -7, 32, -31, -5, -32, 17, -36, 3, -21, -2, -6, 9, -15, 47, -1, 16, 28, -1, -8, 38, -6, -65, 8, 54, -35, -51, 25, -45, -22, -7, 26, -19, 85, 4, -21, 51, 5, 7, 25, 12, 30, 40, 0, 47, -21, 63, 15, -3, 17, -16, 1, 44, 22, -40, -3, 61, -7, -5, -4, -1, -18, -20, -35, -13, 60, 31, 7, 12, 15, 20, -9, -26, -20, -16, +-12, 62, -21, 8, 27, 26, -4, -8, 4, 35, -29, -16, 29, 100, -29, 21, 40, -3, 15, -68, -18, 4, 63, 14, 25, 4, 82, 29, 37, 19, 29, -34, 59, 45, -25, 68, 29, -22, 16, 14, 51, 12, 27, -52, -38, 19, -76, -19, -11, 39, 5, 31, 51, -28, -30, -12, 36, 21, -22, -27, -83, -11, 72, -37, -38, 37, -29, 16, 8, 12, 43, -56, -30, 23, -28, -17, -49, -5, 8, -23, -11, +26, 9, 6, 1, -46, 0, -8, -11, -22, -41, 4, -45, -33, 92, -31, -8, 53, -19, 38, 0, -14, -53, -34, -16, -13, -19, -61, 1, 19, -10, 51, -17, 11, 23, 73, 21, -29, -23, -11, 37, 27, 38, 24, -62, 7, 16, 4, 0, -23, -41, 39, -5, 17, -19, -29, -15, 1, -37, -18, 27, 66, -33, 3, -28, 26, -18, -12, 6, 11, -47, 19, 22, -25, -22, -28, -25, 5, 2, 37, -9, 88, +-13, 46, -15, -42, -36, -39, -6, -16, -21, -3, 42, 20, 9, 75, 1, -7, 17, 1, -20, 24, -14, -24, -33, -53, 25, -12, -6, 30, 19, -12, 42, 71, -28, 37, -8, 39, 13, -67, -8, 20, -8, -22, -37, 51, -21, -7, -32, -19, 47, 74, 1, 4, -3, 7, -24, 25, 20, 3, 4, 44, 13, -48, -20, 43, -29, 31, 10, -12, 13, -26, 19, -4, -2, -23, -4, 40, -46, 31, -20, -13, 24, +52, 11, -1, -29, 16, -11, 32, 25, -5, -37, 45, -10, -16, 8, -10, -32, 21, -2, -6, 7, -52, -2, 6, -28, -19, 29, 4, -20, -7, -9, 4, 34, -67, 10, -41, -18, -57, 6, -75, 52, 29, -63, -16, -89, 66, -6, -35, -52, 7, 17, -2, -45, -9, -1, -26, -58, -60, 65, 82, -13, -25, 37, -3, 56, 6, 80, -8, -30, -47, -78, 8, -26, -10, -32, -38, -89, -21, 22, 56, -39, 21, +37, 26, 29, 35, -19, -58, -16, -23, 68, -19, -22, 19, 23, 56, 9, -42, -2, -12, -25, -30, -13, -54, 27, -18, -37, -11, -19, -6, -3, 56, -21, -41, 16, 1, -33, -8, -4, -36, -39, 7, 53, 9, -81, 4, -5, 72, 21, -40, -24, -26, 33, -48, 24, -67, 31, -26, -52, -34, 27, -4, -25, 70, -31, -12, 72, -2, -67, 1, -6, -13, -2, -19, 29, 54, 25, 27, -79, 27, -41, 72, -28, +-46, 5, 32, 20, 77, 2, -17, -34, -4, 57, -21, -10, 19, -36, -66, 0, 14, -35, -5, -51, -17, 14, -11, 38, 14, -13, 5, -8, -7, -56, 18, -44, -5, -24, -16, 32, 44, 18, -12, 32, 2, 28, -20, 44, -27, -28, -46, 22, 3, -42, -35, -10, -52, 49, -4, 3, 8, 4, 4, -43, 14, -1, -25, 1, 10, -46, -33, 22, -24, 50, 33, -42, -26, 127, -37, 8, 10, -11, -31, 38, -10, +-40, -10, -24, 2, -17, -29, -7, 28, -71, -27, -35, 24, -68, -12, -24, -25, -36, -28, 41, -94, 29, 25, -42, -4, 74, -14, 8, 103, -9, -30, 37, -2, 3, 36, -10, -4, 38, -12, 30, 35, -33, 14, -40, -30, -20, 16, 15, -17, 3, -50, 41, -36, 15, -12, -34, -73, -52, -4, 31, -43, -22, -17, 38, -22, -30, -5, -33, -25, -43, -8, -10, 23, -10, 53, 109, 31, -74, -35, -29, -35, 84, +-29, -50, -3, -33, -13, -19, 39, -52, 95, -15, 47, -33, 91, -10, 86, 28, -20, -4, -78, -48, -38, -7, -21, 6, 48, 54, 32, -20, -8, -11, 13, 127, -7, 19, 17, 22, -4, -17, -5, -17, 53, 1, 48, 4, 108, 6, 88, -24, 7, 8, -26, 11, 15, -20, 6, -2, 11, 92, -7, -28, 15, -30, -30, 127, -5, 15, 14, 25, -55, -13, 49, -33, 32, -8, 21, -39, 79, -1, 15, -5, 14, +-6, -38, 28, 44, -32, 24, 49, -38, 38, -1, 28, -20, 18, -9, 127, -14, -41, -2, -21, -11, 12, 45, -28, -21, 15, 12, -23, 104, 3, 25, 43, 0, -44, -20, 43, -22, -5, -32, 26, -31, 99, 25, -24, -27, -6, -44, 75, 10, -49, 17, -37, -32, -4, -24, -55, -68, -28, 17, 15, 24, -44, 3, -43, -10, -68, -49, -10, 11, -28, -32, -11, 20, 64, 23, -20, -13, -26, -18, 80, -29, -20, +7, -22, -26, 9, 30, -33, 39, -26, 38, -22, 34, -37, 30, -25, -10, -25, -9, 8, 40, -6, -5, -7, 10, 96, 20, -15, -7, -32, -41, 100, -8, -28, 18, -15, -31, 2, 31, -33, 12, -17, 31, -22, 42, -23, 33, -7, -11, -35, -48, -30, 16, 5, -9, -30, 28, 72, -3, -21, -43, 3, 42, 106, -71, 36, 27, 18, 12, -43, -8, 27, 26, 10, 8, -4, 127, 2, 33, 3, -22, -1, 26, +-7, 11, -16, 13, 0, 44, 72, 15, -100, -15, -10, 12, 65, -43, -28, -23, -11, 4, -8, -70, -20, 96, 42, 16, -1, 127, -16, 50, -14, -23, -41, 8, -17, 10, 23, -49, -3, -28, 35, 6, -46, -42, -51, 12, 92, -32, 48, 31, -7, 16, -18, 27, 18, 47, -17, 35, 4, 127, -5, 47, 3, -10, -35, -17, -34, 39, 20, -42, -16, -19, 29, -20, -32, -37, -60, 14, 105, -49, 24, 32, -35, +-3, -15, 30, -19, 52, -26, 55, -10, 116, -10, 36, 7, 1, -25, -59, -33, -14, 43, -15, -1, 5, 76, -12, 2, -13, -58, 46, 108, -32, -40, -3, 44, 3, -18, 36, -46, 45, 57, 88, -46, 58, -42, 72, -42, -11, 31, -24, 3, -4, 80, -30, -15, 42, 59, -21, -57, -6, -16, 1, 88, -25, -3, 15, -4, -4, -25, 62, -3, 46, 31, 36, -9, 58, -34, 64, -33, -10, 21, -13, -39, -17, +57, -34, -10, 15, 29, 9, -28, -12, -27, 3, 63, -38, 8, 4, 9, -6, -12, 11, 25, 47, 8, 24, 3, 85, -25, 52, -50, -17, -3, -34, -35, -6, 8, -19, -45, 66, 77, 22, -1, 28, -16, -9, 98, -11, -28, 16, 18, -7, 4, 33, -5, 60, 14, 37, 9, 127, -24, 40, -18, -10, -18, -61, -32, -4, -16, -48, -28, 90, 101, 47, -55, -34, -36, -3, 93, -4, 29, 30, 44, 22, -8, +78, -23, 54, 13, 52, 14, 127, -18, 9, -28, -23, -5, -14, -14, 17, -44, -25, 0, 81, 35, 7, 15, 24, -62, -18, -29, -62, -39, 9, 30, -20, -5, -26, 65, -13, 56, -39, -11, -26, -43, -20, 10, 6, -52, -85, 9, -16, 1, -13, 31, 9, -13, 15, -18, 1, -5, 29, 7, -31, -31, -23, -28, -20, 18, -18, 46, -18, -32, -30, -31, -14, -3, 17, 39, 25, -3, -88, -30, -30, -29, -6, +24, -3, -3, -6, 54, 3, -22, 6, -32, -46, -23, -19, 35, -65, 38, 5, 33, -11, -21, 10, 46, 3, 1, -33, -7, -10, -16, -42, -37, -22, -6, 15, -16, -54, -27, -33, 12, -5, 20, 2, 11, -3, -26, -47, 30, -21, 24, -5, 40, -30, 78, 12, 33, -11, -15, -23, -5, 32, 29, -39, 25, 18, -50, -7, 1, 6, -27, -36, 2, -2, 7, 18, -13, 4, -44, -13, -13, 18, 28, -36, -28, +25, -60, 47, 38, -11, -17, 43, 22, -29, 9, -83, -4, -2, -26, 30, -29, 22, 8, -10, 80, 18, 4, -29, -30, -20, -18, 13, 55, -6, 63, -25, 25, -17, -39, -12, 14, 12, -46, -24, 4, -13, 14, -52, -27, -20, -20, 11, -9, -3, -6, -10, 78, 13, -12, -4, -16, -72, -29, -6, 0, -46, 79, -34, 16, -5, -52, -12, 26, 24, -20, 4, -7, -15, 19, -29, 28, 27, -6, 34, 5, 13, +26, -56, 67, 14, -41, -37, -30, -32, 21, -35, -48, -63, 34, -30, -22, 9, -41, -18, 0, -23, 9, 6, -25, -11, -26, -51, 19, 15, 1, -7, 7, 28, 47, -34, -17, -1, -51, 5, -40, -13, 30, -39, -9, -30, 25, -32, -16, -14, -51, -27, -22, -74, -17, -35, -23, 14, -16, -42, 43, 4, -39, 16, -7, 24, 29, -31, 42, -31, 4, -10, 9, -52, 42, -58, -24, -14, -5, -34, -14, -9, -5, +-40, 28, -39, -8, -14, 12, -39, -3, -21, 54, -5, -29, 51, 11, -13, 47, -36, 70, -7, -6, -31, -13, -38, 36, -46, -39, -52, -7, -60, -18, 8, -11, -50, -14, -37, -6, 1, -4, -23, -12, -20, 42, -127, -57, 12, 22, -12, 82, -10, 8, -21, -38, 4, 17, -69, -67, -70, 19, 41, -46, -8, -27, -40, 33, -4, -10, 20, 95, -27, -46, -9, -50, 24, -43, 4, 3, -3, 12, -26, 43, -22, +29, -37, 39, -41, 33, -61, -25, -64, 104, 55, -3, 5, -9, 2, 41, -50, -29, -1, 9, 22, -26, 14, 48, 21, 41, 24, 30, 5, -53, -7, 18, -24, 26, -25, 0, -54, 1, -4, 3, -54, -7, -42, 9, 5, -38, 0, 6, -69, -47, -3, -16, 75, 17, -27, -31, -7, 44, -37, -21, -15, -14, -30, 25, -21, -1, -11, -20, 18, 13, -32, -42, -38, -17, -29, 0, 3, 49, -32, 3, -4, -88, +0, -27, 41, -7, -28, -43, 41, 42, -37, -30, 24, -32, -58, 50, 0, 38, 8, -11, -5, -33, -48, 6, -45, -59, -36, 5, -39, -3, 13, -39, -42, -28, -14, -16, 114, -18, -72, -33, -8, 12, -6, -68, 63, -36, -5, 17, -27, -29, -9, 79, -40, -10, -5, -7, -33, -13, 23, -1, 121, 5, -37, 18, 3, 31, -72, -21, -20, -33, -43, -27, 42, 24, -8, -30, 20, 0, -19, -5, -18, -25, 29, +-18, -49, -20, -28, 25, -15, 3, -38, 6, 27, 9, -14, -8, -9, -2, -1, -17, 1, -8, -17, -29, 0, -8, -35, -30, 7, -25, -1, -2, -23, -26, -2, 32, -2, 5, 39, 7, 9, -14, 76, 31, 39, 9, -10, -20, -23, 10, -13, -15, -24, -26, -47, 13, -3, -39, -19, 38, 20, -16, -13, -29, -75, -28, 37, -50, -4, 53, 19, -2, 22, -4, -30, 65, -7, 7, 13, -7, -31, -3, -10, -4, +34, 9, -1, 80, 26, -2, -60, -46, -33, -27, -41, 60, -47, 7, 15, 22, -40, 3, -9, 2, 19, -8, 22, 26, 17, -20, 27, -8, -19, 38, 13, -43, -17, -19, -68, 55, 5, 19, -5, -51, -6, -21, -50, 9, -13, -19, -9, 47, -33, -14, 38, -13, 3, -11, 120, -7, 30, -4, 4, 15, -43, -25, -3, 18, 7, -2, -43, -3, -12, 0, -29, -34, -8, -27, -34, -16, -39, -35, -11, 31, -17, +7, 56, -27, 3, 7, 84, 6, 38, -12, -5, -12, 3, 3, -11, -26, -1, -20, -33, 11, -1, 82, 7, -75, 54, 14, -18, -31, -52, -34, -19, -54, -2, -9, 5, -44, -29, -48, 59, -26, -2, -9, -2, 6, -1, -5, -16, -21, 21, -11, -12, -34, -22, -5, -10, -2, 43, 11, -29, -35, -37, -6, -31, -56, -22, 2, -35, 12, -22, -55, -70, -43, 25, 51, 0, -17, -33, 0, 46, -6, 15, 14, +-29, 78, 116, 88, -66, 15, 63, 4, -30, -29, -32, -36, -14, -19, 1, -21, 11, -34, -14, -12, -19, -36, 24, 9, -2, -20, 13, 5, -4, -23, 9, -6, -10, -44, -4, 116, -79, 12, 89, -21, -32, -27, -49, -60, -17, -45, 13, -52, -31, -56, 13, -54, -31, -45, 19, -7, 7, -28, 13, -1, -6, -44, 75, 3, -17, -64, 49, 72, 41, 114, 52, 19, 14, -41, -19, -66, -27, -24, -26, -10, 10, +31, -34, -4, 0, -24, 75, -13, -6, -64, -49, -46, 24, -82, -35, -45, -58, -86, -44, 41, 2, 85, 10, 7, -21, -1, -18, -27, 16, -29, 21, 3, -16, 11, -27, 1, -47, -13, -7, 17, 26, -10, -5, -38, 21, -16, -10, 2, -49, -50, -20, 75, -9, 32, 13, -44, -2, -21, -22, -13, -40, -89, 3, -48, -46, -17, -11, 5, 2, -82, 19, -25, 13, 21, -22, -40, -55, -24, 16, 3, -46, 8, +-27, 63, 14, 49, 90, 28, -13, -26, -20, 0, -4, -63, 0, -33, -7, 23, -6, -21, -27, -46, 7, 31, 11, -12, -32, -28, -13, 11, -45, -11, -39, -15, 32, 41, -16, -28, 52, -25, -26, -60, -25, -42, -32, -30, -11, -36, -58, -54, 10, -37, -28, -27, 52, -10, -48, -10, -13, -41, -15, -60, -13, -18, -56, -32, 53, -32, -29, -4, -39, 19, 37, -14, 17, -21, 68, 75, -25, -9, 7, 2, 7, +32, 45, 31, 8, -11, 76, -3, -5, -31, 34, 44, -3, -24, 27, -39, -6, 4, -31, 4, 7, 23, 76, -18, 1, -25, 42, 20, -70, -3, 12, -8, -11, -33, 23, 25, 15, -13, 53, 31, -7, -71, 50, -9, -15, -25, 46, 6, -2, -61, 12, 8, -2, 56, -15, -39, -14, -24, 7, 13, -27, -11, -2, 3, 8, -14, 19, 18, 21, 17, -24, -20, -30, -19, 20, 58, -36, -35, 14, 4, -12, -44, +-2, 0, -22, -9, -15, -8, -11, -5, 19, -12, -41, -17, 71, -10, -49, 43, 51, 13, -5, -23, -26, 44, 78, -26, -45, -3, 4, -52, 11, 1, 5, -29, -12, 13, -31, 55, -49, -43, -25, -34, -12, -16, -18, -13, 68, -6, -1, 116, 45, -9, -20, -34, 53, -48, 88, 7, -22, -7, -36, -1, 24, -50, 0, -20, -26, -6, -35, 28, -7, -21, -26, -44, 28, 29, -20, 17, -3, 15, -12, 3, 6, +4, -28, -22, 5, -23, -29, 12, -2, 43, -1, 17, 13, -17, 9, -31, 3, 12, -50, 45, 1, -5, -14, -51, 13, -14, -12, -8, -5, 23, -27, 19, -3, 32, -10, 6, -2, -31, -41, 24, 5, 61, 0, -18, 29, 2, 3, -24, -12, 49, 25, -3, 87, 9, -4, 55, -7, 46, -21, 10, 64, 1, -3, 13, -34, 10, 21, -10, 25, 80, -41, -26, 49, 6, -1, -36, 57, -18, -9, -49, -25, 2, +21, 49, -45, 31, 2, 41, 43, 16, -26, 42, 34, 4, -6, 73, 20, -44, -29, 16, 88, 50, -39, -32, 62, -26, -23, -6, 31, -31, -22, -19, 2, 43, -7, 20, 33, -10, -22, 48, -28, 6, -26, -16, 45, -9, -9, 17, -26, -11, 13, -9, -6, 64, -9, 21, 61, 1, 1, -15, 25, -32, -24, -18, -16, 17, -8, -9, 44, 44, 8, 69, -1, 5, -17, -18, 69, -22, -31, 35, -38, 21, 10, +-24, 4, 45, -22, -9, 49, -19, 0, -18, 15, 16, -39, -38, -53, 18, -24, 33, 26, -59, -25, 22, 0, -18, -38, 32, 1, -5, -26, 6, 33, -64, -30, -66, 35, -105, -14, 33, 53, 22, -27, -16, -114, -49, -15, -63, -32, 23, -50, 5, -41, -7, -50, 0, 8, -49, -7, 2, 49, -16, -16, 10, -18, -19, 9, -26, -5, -65, -18, 37, -44, 14, 0, 1, -65, -8, -20, -55, -25, 17, -35, -7, +7, -28, -8, 2, 20, -4, -3, -11, 22, -7, -19, 13, -2, -20, 30, -47, 13, 48, -6, 30, -18, -42, 3, -49, 0, -10, -39, -28, -10, 7, 1, 35, 25, -54, -20, 41, 48, -23, -57, 36, 80, -5, -9, -72, -11, -52, 25, -26, -29, 75, -45, -22, 39, 7, 4, -12, 8, -12, -58, -26, -8, 0, 3, -30, 19, -36, -17, 20, 11, 25, -4, -30, -14, 17, -12, -22, 5, 14, -5, 0, -22, +58, -28, 11, 76, -23, -35, -38, 8, -31, 0, -34, -48, 96, -76, -33, -32, -11, -4, 43, -41, 17, -28, 6, 28, 96, -53, -3, 66, 29, 10, -14, -39, -21, -36, 34, -18, -38, 6, 33, -53, -14, -37, 11, -51, 60, -18, -18, -29, 2, -23, -4, 12, 17, 21, -2, -8, 46, -12, 17, 41, 13, -19, -22, -6, -36, -22, -33, -5, -4, 34, 19, -23, 1, 14, -38, -19, 27, -4, -12, -7, 1, +0, -24, -56, -22, -38, 33, 27, 21, 32, 14, 32, -3, 37, -17, -18, 30, -22, -10, -18, -12, 13, -45, -1, -22, -14, -18, 5, 4, -15, -26, 23, 25, 23, -19, 20, -4, -36, 23, -15, 12, -111, 9, 54, -60, 71, 11, 22, -26, -46, 14, 1, -37, 26, 3, 18, 17, -52, -15, 22, 60, -17, -40, -35, -15, 48, -53, -33, 46, -63, 8, 40, -1, 4, -14, 88, 51, 47, -9, 8, 61, -31, +108, 16, -4, -4, -4, 14, -10, 8, -6, -16, 69, -11, -19, -16, -8, -30, -10, -28, 8, -35, -8, 11, 64, 23, 21, 22, -3, 23, -6, -37, 0, -25, -1, 6, -33, 10, -13, -25, 9, 6, -23, 15, 33, -14, 22, -22, 12, -50, -18, -45, -6, -19, 36, 33, 21, 7, 21, 32, -11, 41, 17, -44, 39, -26, 7, -1, -23, -17, -29, -11, -9, -3, -21, -77, -6, -11, -57, -13, -15, -40, -10, +2, -1, -14, 24, 12, 76, -60, 5, -54, -9, -24, -29, -55, -31, -13, 15, -23, -30, -3, 11, 75, -15, -27, -14, -36, -8, -28, -25, 31, -18, 24, -53, 53, 46, -8, 0, -10, 43, -103, -17, -31, 57, -68, -11, 11, 26, -23, 39, -19, -39, 29, -2, 29, -19, 27, -16, -26, 11, 38, -14, -17, -6, -8, 4, -5, 7, -15, -16, 18, 113, -63, -25, -50, 15, -41, -31, -60, -44, -10, -19, -20, +-41, 24, -43, 54, -38, -3, 6, -38, 13, 5, -26, 0, -7, -30, 2, -14, 21, -21, 0, 1, 127, -92, -26, -75, 29, -50, -36, -60, -36, -21, 0, -32, -19, 13, -72, 43, -24, -14, -31, -25, -26, 28, -29, -21, -19, -6, -46, 44, -34, 31, 17, -24, 100, -82, -23, -38, 59, 2, 27, -23, -30, -36, 40, -63, 4, -13, 80, 57, -8, -27, -35, -14, -18, 54, -33, -11, -3, -40, -28, 36, 11, +35, 17, -28, 69, -43, 2, -25, -22, -10, 19, -34, -27, -3, 28, -48, 14, 16, 31, 103, 24, 1, 13, -32, 12, 18, -33, -4, 1, -18, -53, 23, -2, 20, 3, 15, 80, -21, 2, 40, 69, -33, 8, -44, -33, -2, 36, -18, -31, 26, -11, -1, 36, 20, -5, -43, 8, -20, -33, -32, -32, 2, -17, 31, -5, 26, -3, -17, 55, 31, -5, -9, 44, -49, 12, -12, -31, 33, -18, -42, -19, -18, +-42, -5, 11, -26, -61, -43, 31, -7, -10, 2, -8, -18, -25, 1, 10, 35, 7, 11, 109, -26, 31, -6, 21, -39, 26, -28, -25, -11, 7, -11, -19, -12, -3, -18, 8, -17, -1, 0, -19, -8, 11, -18, 16, -20, 9, -16, 13, -24, 17, -29, 45, 13, 20, -5, -30, -3, 7, -24, 41, -12, 6, -12, -38, -32, 0, 21, -3, -14, -2, 16, -29, -6, -14, -12, 9, -23, -21, -25, 0, 2, 9, +-34, 8, 22, -12, 17, -3, 22, -10, -21, 28, -3, -6, -29, -15, -46, -1, 4, -12, 14, 43, -4, 0, -44, 41, -37, -9, 12, -3, 3, -7, 4, 42, 28, 76, -24, -17, -10, -21, -4, -16, -4, 89, -10, 39, -35, -18, 28, 11, 23, -4, 82, 11, -17, -33, -15, -28, -10, -12, -19, -16, -13, -1, -2, -18, -16, 16, -17, 23, 32, -39, 17, -6, -17, 33, -9, -2, 2, -9, -25, -33, -20, +-2, -29, -15, -1, -42, -60, -61, 20, 4, 72, -10, -10, -19, -22, 23, -23, 8, -2, 33, -31, 88, 10, -47, -6, -52, 38, -55, -10, -37, 46, -9, 23, 22, -29, -25, 2, -55, -40, -8, 13, -5, 51, -34, -64, 0, -41, 34, -21, 42, -36, -18, -37, 68, 17, -48, -37, -40, 101, -45, 6, -46, 3, -24, -12, 2, -36, -11, -2, -32, 3, -9, 26, 3, 16, -22, -16, 34, 19, -7, 65, -18, +-15, -42, -13, -21, -12, -20, 9, 13, 35, 7, -27, -3, 13, -33, 4, 27, 2, 8, -26, 21, 4, -37, 18, 42, 76, 46, -29, -6, -21, -46, 50, -4, -7, -65, -1, -35, -21, -3, -5, -24, 44, -54, -24, 28, 0, -17, 53, 69, -18, -20, -22, -40, -29, -36, 19, 7, 17, 3, 0, -19, -19, -32, 127, -22, -29, -35, 31, -52, 0, 18, 13, 12, 74, 36, -41, 18, -12, -38, 10, 53, 9, +19, 8, -9, -32, 59, 19, 21, 81, -5, -12, -32, -48, 3, 65, -29, -24, -53, 19, -38, 28, 23, 43, 28, 106, -18, -23, 6, -34, -43, 14, 103, 10, 38, -5, -74, -37, 18, -20, -51, 41, 49, 13, 0, 5, 0, -11, -9, -57, 97, -21, -20, -7, 1, 4, -8, 15, 3, -1, 1, -7, 3, -16, 40, 75, -48, -32, -18, 5, 2, -23, 37, 25, 24, 6, 24, 3, 5, -19, 3, -8, 100, +33, -11, -5, -10, 14, 24, 49, -11, -35, 11, -6, -32, -20, 48, 89, -28, 16, -36, -20, 18, 1, 49, 49, 27, 6, 5, -24, -6, 69, -11, -61, 21, -9, -17, -38, 27, 26, -1, 72, -16, 52, 10, -34, 13, -9, 103, -10, -8, -43, 2, 10, 28, 36, -47, 33, 28, -30, 9, 29, 32, -41, 22, -31, 75, 22, -6, 17, 35, -9, -12, 51, -15, -3, -15, -4, -11, -45, 36, 88, -35, -45, +-16, 25, -53, 0, -56, 50, 74, 5, 7, 6, -5, -7, 15, 9, 127, -1, -26, -45, -25, 4, -29, 19, 2, -27, -2, -5, -10, -14, 37, 74, 3, -34, -41, -4, 45, -12, -42, 6, 42, 0, 7, 12, -20, -34, 15, -37, 102, -9, -47, -14, -17, -9, -25, 28, -10, 10, -32, -19, 3, -32, 10, 30, -10, -29, 15, 33, -1, 80, -12, 7, 7, -26, -10, 5, -37, -23, -31, -25, 13, 5, -7, +33, -37, -17, 0, -31, 29, 33, -16, -6, -35, 27, 0, -20, -21, -37, -29, 48, 36, -1, 12, -18, 34, 6, -2, -24, -34, -22, -28, -7, -2, 15, 6, 70, -13, 7, 19, -24, 26, 20, -30, 1, -13, 34, 2, -22, -26, -3, 26, -29, 8, -8, -14, -7, -34, -4, -15, 37, -32, -29, 7, 21, -20, 5, -10, -38, -8, -77, 18, -28, -14, 52, 5, 2, -9, 41, -24, -17, -2, -1, -24, 34, +-21, 21, 16, -17, 23, -4, 12, -7, -54, -2, -8, -2, -23, -9, -34, 34, -6, -29, 1, -16, 17, 30, -22, 24, -25, 26, -6, -1, -17, 19, -17, -63, 13, 38, 48, -19, -44, 42, 4, 1, -19, 53, 10, -7, 55, -86, 81, 1, 24, 36, 18, -22, -18, 24, -20, 13, 127, 21, 31, 28, -21, -27, -15, 1, 5, 81, 25, -32, 25, 8, 62, -18, 56, 72, 10, -38, 33, -25, 26, 36, 18, +22, 70, -10, 6, 43, -39, -2, 98, 25, -11, 49, 6, -16, 15, -19, -16, 15, 14, -38, 26, 24, -9, -27, 20, -24, 41, -33, 2, -21, -1, -26, 6, -25, -31, -4, -13, 15, -4, -23, -16, -1, -30, 24, 47, -56, -8, -41, 47, 77, 74, 2, 50, -43, 27, 42, 65, -23, 32, -33, 23, 53, 5, -59, 8, -18, -1, 50, -11, -27, -49, -30, -1, -21, 15, -5, -11, -22, -34, -12, -11, -5, +47, -16, 101, 37, 15, -27, 63, -43, 8, -56, 31, -7, -3, -12, -12, -13, -5, 22, -34, 45, -34, -7, -8, 9, -12, 32, 8, -19, -19, 19, -11, 31, 26, 8, 69, -29, -2, 9, 66, -23, -28, -50, 89, 14, -2, -9, 1, -67, -3, 61, -57, 32, -2, -26, -5, -16, 39, 40, 52, 4, 47, -7, -32, 16, 63, 0, 2, -54, -34, -13, 74, -11, 26, 11, -39, 16, -14, 50, 48, 8, -15, +127, -48, 56, -13, -24, -11, -39, 52, 26, 20, -2, 52, -34, -38, 5, 52, -29, -58, -47, 12, 24, 25, 34, -46, 30, -44, 4, 16, 25, -32, 22, -54, 104, -37, 5, -11, 66, -44, -56, -45, -3, -34, -2, 56, -33, -58, 42, -22, 14, -4, -34, -1, -21, 63, 23, -10, -11, -36, 66, -7, -14, -18, -26, 5, 75, -31, 85, -13, 0, -29, -22, -1, 25, 11, 23, 15, -19, -43, 42, -3, -27, +-12, 47, -51, 1, 72, -16, -53, 5, -11, -13, -42, 17, -1, 27, -44, 126, -25, -20, -14, 51, -31, -25, -12, 39, -17, 4, 16, 26, -21, 25, 25, -28, -9, -49, -5, -23, 15, 29, 9, -1, 37, -22, -3, -8, 2, 40, 62, 127, -48, -29, -26, -30, -37, -40, 0, 8, -6, 12, 66, 3, -55, 48, 29, 7, -6, -56, -31, -4, 90, -8, -15, -28, -20, 2, -7, 44, 9, 37, 11, 127, -35, +-25, -23, -15, -26, -57, 39, 26, -11, 4, 26, -37, -33, -17, 11, -13, 3, -9, -3, -26, 21, -38, -16, 13, 13, -11, 1, 15, -17, 11, -22, 3, 14, -34, 20, -7, 3, -20, 29, 6, 2, 11, 20, -10, -3, 17, -24, -20, 1, -26, 0, -5, -16, -19, -16, -11, -9, 3, 8, -7, 24, 20, -12, 4, -13, -2, -8, -20, 4, -7, 38, -21, 5, -51, 31, -14, 10, 3, -23, -18, -2, -32, +23, -24, 8, 22, -18, -34, 38, 17, 0, -10, -3, -25, -21, -1, 41, -8, -6, -13, 10, -38, 22, -49, -23, 1, 5, -15, -33, 7, -5, -5, 12, -15, -23, -12, -21, -28, -38, -38, -3, 5, 19, -9, 12, -5, 9, -2, -11, -12, -7, -5, 9, -15, 25, -19, -72, -27, 32, 74, 35, -6, 1, -32, -44, 20, 0, -13, -54, -6, -40, -22, -28, -10, -36, -60, -1, 63, 2, 7, 25, -70, -40, +-58, -51, 5, 3, 14, -70, -2, 1, 121, 57, -6, 31, 16, -1, 12, -5, -8, -30, -8, -4, -71, -3, -25, -66, -5, 11, 73, -10, -6, 47, -51, -38, -61, -66, 9, -15, 6, -1, -9, -18, 26, 17, 20, 28, 9, -12, 5, 49, -11, -3, -20, -2, -3, -34, -8, -38, 86, -30, -21, -5, -39, -4, 2, 6, -19, -31, -2, 7, -15, -32, -6, -5, 53, 49, -13, -5, -21, -23, -21, -29, 31, +-53, -1, 25, -14, -66, -7, -48, -42, -88, 5, -57, 113, -2, -36, -36, -29, 61, -48, 4, -50, -8, -28, -25, 26, 22, 16, 12, 48, -14, 16, 47, -35, -17, -32, 2, -2, -25, -25, -26, 104, -28, -33, -26, -43, -19, -18, 34, -12, -9, -22, -4, 15, 7, 0, 4, 27, 24, -2, 46, 45, -19, -14, 24, -18, 13, 17, -23, 25, -45, -31, -37, 17, 58, -34, -62, 43, 11, -66, 3, 2, -2, +-39, -16, -15, 7, -3, -32, 11, -55, -45, -26, -13, 9, 6, -32, -18, -1, 1, 30, 7, 7, -25, -38, 2, 5, 3, 0, -18, -26, 28, 34, 4, -43, 31, -19, 39, 21, -24, -48, -6, -13, -23, -40, -18, 127, 94, -33, 2, 9, 19, -16, 13, -8, -3, -26, -28, 40, -42, 2, 29, -27, 23, 17, -17, 1, -24, 14, -39, 45, -29, -57, -23, -16, -7, -22, 30, 40, 8, -20, -12, 14, -41, +3, -47, 22, 17, -35, -34, 42, -76, -11, 55, -37, 3, 9, 9, -7, 34, -20, -46, -73, -21, -49, 16, 18, -1, -41, 12, 55, 25, -7, -23, -13, 26, -4, 81, -55, -19, -22, 36, 73, 39, -10, -49, -12, 0, 1, 23, -27, 57, -5, -7, 16, -26, -22, 44, 1, 16, -23, -5, 69, -12, 16, -29, 3, -22, 6, 97, -9, -12, -49, -13, -34, -27, -6, 3, -24, 22, -13, 11, -36, -24, -14, +0, -29, -18, -25, 14, -12, -5, -34, 4, 10, -3, -52, -19, -51, -23, 26, 52, -2, -5, -10, 34, 75, 16, -20, -53, 5, 4, -32, 32, -36, 33, -21, -9, -48, -16, 5, -9, -1, 9, -8, -23, -12, -10, 23, 63, -10, 22, 0, -18, 20, -20, -5, -6, -11, 20, -15, 32, 17, -4, 15, -1, 37, -17, -8, -22, -20, -2, 16, 32, -11, 13, -23, -28, -7, 27, 5, 47, 9, 16, 29, -21, +31, -8, 4, -6, 31, 17, 12, -14, 4, -24, 12, -17, 60, -20, 25, -16, -54, -6, 5, 7, -21, -2, -28, -23, -21, 27, -2, 24, -12, -9, 28, -13, -5, -7, -2, -17, -33, 1, -21, 8, -2, -24, 17, 19, 61, -2, 25, 60, -33, -16, 26, 1, 0, 33, -18, -23, 28, 3, 28, 43, 13, 23, 24, -4, 47, 9, 24, 10, 9, 33, 27, 28, 29, -23, -10, 11, 42, -19, 33, 11, -31, +-15, -23, -20, -50, 5, 110, -18, -47, 1, 0, -14, -71, -16, 7, 61, 72, -19, -15, -34, 22, -89, 3, 25, 4, 67, -14, 109, 50, -2, -11, 80, 36, 14, -46, -37, 22, -4, 93, 24, -29, 5, -13, -35, 48, -25, -18, 3, 61, -4, -37, -36, 23, -28, -21, 9, -20, 102, 16, 93, -17, -40, -26, 78, 20, -8, -19, -17, 4, -14, 3, 22, -16, 11, 3, -22, 1, -7, -26, 19, 15, -12, +-23, -7, 20, -37, 35, 15, 9, 58, -16, 127, 6, -22, 37, 8, -37, -20, -11, -28, 11, -27, -27, -35, -62, 6, -8, 41, 2, 4, 19, -18, -21, -15, 36, 5, -41, -18, 80, -16, -36, 105, 1, 127, -71, -57, 29, 60, 53, 18, -10, -3, 12, -1, -14, 34, -29, -1, -1, -11, 57, -20, 13, 21, 32, -12, 4, -9, -20, -12, 19, 29, -10, 96, 29, 100, -25, -34, 21, -9, -6, 17, -64, +-65, 58, -72, 0, 25, -20, -58, -32, -18, 39, -36, -29, -16, -26, -8, 39, -45, 56, -43, 4, 31, -4, 120, 23, 127, -17, -38, -24, -1, -54, -17, 5, -9, -21, -13, 85, 55, -34, -5, -26, 23, 9, -25, 1, -5, 40, -2, -26, -45, -13, 88, -9, -59, -18, 21, -5, -28, 24, -4, -16, 11, -24, -25, -29, -6, 40, -18, 41, 52, -35, -13, 16, -42, 27, -62, -39, 22, 5, 10, 12, -9, +15, 51, -22, 19, -53, 55, 18, 88, -61, -15, -13, 15, -47, 17, 3, -21, 8, -3, 69, 31, -29, 11, -30, -25, 60, -17, -30, 15, 3, -6, -49, 8, 16, 81, -10, 8, 9, 54, -22, 78, -24, 7, -27, -53, -28, -32, -33, -16, -12, -28, 11, 33, -31, -14, -29, -32, 46, -55, -66, 19, -5, -10, -2, 3, 36, 70, 17, 5, -41, 47, 0, 93, -62, 25, -16, -7, -15, -26, 20, -17, -32, +7, 83, 15, -90, -15, 4, -7, 51, -31, -24, 58, -24, -30, -31, -34, -30, 93, 40, 19, -37, 45, -6, 112, -29, -10, -31, 47, -24, -10, -14, -14, 5, -36, 60, 10, -35, -38, -13, -9, 81, -34, -28, -1, -1, -8, -38, -30, 11, 91, 20, -15, -36, 16, -16, 67, 6, 14, 9, 27, 5, 61, 28, -9, 19, 5, -36, -29, 3, 30, 28, 5, 2, 6, -7, 5, -5, -11, 30, 20, 59, -1, +57, -5, -57, 22, 9, 25, -33, -23, -4, 12, -1, 8, 15, -18, 13, -18, 0, -43, -1, 40, -6, -5, -5, 70, -17, -26, -25, 13, -1, -28, 30, -11, 21, 1, -11, 18, 7, 35, 14, 11, 43, -18, -8, -6, -16, 25, -4, 8, -28, 64, -11, 67, 22, 31, -3, 32, -37, 14, 9, -7, 13, -34, 11, -30, 7, 7, -34, -34, 1, 46, 9, 23, 32, -15, 7, 12, 26, -17, 9, 24, -1, +-24, -29, 6, -15, -27, 23, -1, -16, -19, -18, 18, 1, -9, 10, 13, -9, -25, -25, 13, 32, 17, -13, -4, 18, -10, -5, -41, 25, -7, -17, 9, -19, -1, 31, 41, -29, -33, 5, -40, -12, -46, 22, -10, 73, -28, 25, 8, -36, -19, 63, 41, -31, -57, -38, -38, -44, 54, -26, 24, 5, -4, 1, 26, 5, -34, 58, 58, -35, -55, -51, -18, -5, -17, 0, -23, 94, -32, 46, -42, -27, -21, +28, 13, -38, -54, 32, 24, -3, 99, 29, -27, 13, -5, 28, -1, -4, 0, -10, 37, 11, 27, -38, -1, 4, 29, -13, 25, 14, -19, -4, -7, -11, -41, 7, -35, -19, 12, 16, -34, 7, 20, 33, -13, -37, 9, 16, 36, 20, 34, -36, -58, 11, 77, -40, -5, -1, -19, -7, -62, 29, -2, 8, -15, -41, -11, -19, 13, 28, 17, 7, 1, -14, -7, 65, -23, -6, 16, 1, 6, 33, -33, -20, +33, -15, 15, -28, 1, -44, -12, -11, -52, 3, -12, -15, 0, -2, -20, -17, -36, -17, -11, -14, -3, 15, 2, 48, -30, -15, 6, -27, -35, 49, 37, 18, -6, 10, 51, -50, 6, -46, -51, -42, 28, 80, 6, -37, -43, -36, -19, -45, 32, 16, -20, -11, 16, 49, 59, 1, -46, -15, 21, -13, 40, 74, 34, 14, 4, -57, -64, 19, -52, -16, 21, 73, 31, -27, -53, 1, -46, -43, -13, -4, 16, +9, -30, 44, 41, -49, -33, 16, -17, 8, -4, -45, 30, 37, -9, 51, 23, 7, -41, -16, -10, -22, -8, 47, 0, 18, -13, 25, -20, -45, -49, -3, 14, -36, 5, 21, -18, 37, -34, 47, -16, 14, -7, 13, -14, 18, 28, -39, 11, -13, -52, 8, -15, -31, 1, -13, 67, -15, -29, 75, -36, -29, -29, -50, 24, -12, 40, 12, 39, -26, -98, 10, -63, -4, -7, -64, 40, 30, -8, 20, 29, -1, +-15, -38, -23, -34, 7, 107, -20, -43, -80, 71, -52, -37, -37, 31, 13, 9, -34, 23, -8, 11, 3, -39, -49, -39, 0, 5, 34, 24, -19, -28, 42, -48, -11, 5, -26, 2, -23, 52, -26, -57, -32, -5, -2, -15, -23, 35, -7, 47, 2, -22, 26, -27, -56, -25, -47, 11, 17, -47, 50, 50, -3, -10, 102, -30, -60, -7, 3, 0, 22, 55, -5, -37, -37, 57, -42, -33, -54, 35, 23, 17, -51, +39, 18, 9, -23, -14, 5, 4, 34, 48, -9, -7, -30, 49, -26, 3, -35, -23, -46, 19, -25, -41, -23, 13, 13, 3, 9, 12, -39, -3, -12, 1, -13, -48, 35, 21, -5, -25, -18, 4, -1, 43, -18, -20, -26, 51, -6, 4, -40, -33, 4, 19, -24, -1, -18, -8, 9, 40, 29, 5, -12, -34, 12, 7, 14, -34, 11, -10, -1, 75, 7, 25, 18, 122, -9, -24, 5, -21, -29, -58, -17, -19, +-5, 49, -35, -34, 18, 127, 14, -4, -3, 21, -10, 13, -38, 24, 2, -30, 24, 8, -10, -17, -6, 34, -7, 31, -30, -15, 4, 32, 9, -26, -30, -26, -2, 28, -2, 14, -17, 65, 17, 11, -5, 21, -10, -18, -21, -3, -4, -26, 12, 0, -10, 38, -35, 31, 14, -14, 30, 18, 20, -2, -23, -35, 49, 73, -16, 61, -2, -47, 37, -88, 97, -16, 3, -62, -36, -44, 42, -9, -4, 7, -37, +-6, -36, 57, -17, 1, 11, -31, 16, -54, -33, -21, -35, -7, 2, 48, 27, 39, -56, -27, 97, -19, 127, 29, 51, -46, -51, 32, -37, 16, 21, -20, -50, -21, -72, -26, -26, -27, -37, 11, -12, -10, 12, 6, 11, -4, 22, 28, -35, -33, -27, 2, -9, -23, 26, 14, -2, 11, -33, 5, 68, 3, -7, -1, -19, -18, -38, 23, 13, 77, -7, -28, -40, -21, -21, -7, -41, -21, -21, -11, -27, 27, +-3, -12, 14, -47, 14, 17, -2, -7, 2, 73, 1, -24, -17, -45, -28, -18, 57, -30, -33, 22, -23, -8, -18, -5, -16, 10, -19, 8, 11, -10, -65, -13, -12, 12, 17, -21, 21, -1, -43, -1, -39, 25, 48, -28, 11, -16, -49, -32, -15, 14, 23, 120, 22, -2, -53, -8, 15, 36, -7, 11, -12, -47, -60, -65, -25, -3, -31, -35, 111, 11, -45, -39, -22, 35, -75, -55, -11, -29, -41, -32, 46, +23, 2, 70, 50, -33, 77, -21, -27, -28, -18, 82, 10, 46, -18, -1, -39, 5, -22, -14, 82, 23, -9, -22, 1, -18, -13, -58, -26, -13, -48, -38, -37, 77, 11, -34, -1, -48, -50, 8, 21, -17, -1, 34, -20, -60, -8, -7, -12, -22, 90, -13, 35, -8, -20, 40, 8, 1, -41, 58, -10, -5, -33, -18, -4, 18, 7, 11, 2, -29, -36, 14, -6, -22, 2, 29, -59, -10, 6, -63, -43, -1, +19, -31, 37, 10, -10, 0, 12, -7, -35, 16, -7, -42, -32, -15, -53, 74, -27, 9, -9, -17, 127, -65, -40, -57, -15, 80, -30, -63, -12, 13, -33, -8, 29, -24, 99, -9, 19, 5, 1, -2, -6, -55, -36, -41, 9, -45, -23, -21, 3, -34, 7, 4, 92, 4, -35, -2, -13, 63, -13, -4, -19, 10, -4, -51, -18, 30, 67, 16, -7, 13, -13, 3, -17, -54, -20, -21, -47, -36, 8, 51, 4, +61, 14, -48, 124, -20, -29, -49, -12, 75, -45, -47, -44, -29, -35, -11, 5, 14, 67, -8, 30, 19, -35, 7, -15, -20, -40, -71, -51, -13, 17, 21, 24, 15, -6, -12, -10, -28, 16, 73, 24, 20, 23, -42, -32, -2, -10, 4, -12, 48, 9, 10, 26, -22, -13, -6, -37, 17, -22, 37, 36, -19, -12, -1, 13, 53, -15, -35, 23, -38, 10, 49, 7, 0, 34, -13, -27, 16, 1, 1, 16, 3, +0, 30, -6, -34, 23, -34, -24, -14, 7, 26, 33, -27, -10, -1, -41, 41, -34, 25, 6, 23, -2, 50, -25, 35, -10, -40, -14, 40, -14, 5, -19, -13, -24, -32, -20, -54, 76, -21, -11, -6, -42, 26, 36, -28, -8, 18, 7, 61, -23, -9, 23, -9, -8, 44, 26, -11, 0, -29, -39, -12, 0, -19, 4, 25, -16, 5, 25, -23, -25, -20, 0, -40, -17, 31, 21, -29, -11, -33, -52, 59, 4, +24, -48, -7, -66, -50, 0, -15, 2, 10, -13, -44, -11, -20, 60, 60, 12, -34, 14, 54, 24, 24, 52, 54, -39, -37, 14, 1, -56, -58, 17, 99, -39, 40, -18, -25, -94, -21, -51, 44, -12, -22, -28, -10, -6, -68, -23, 31, -21, 9, 26, 44, -18, -2, 33, 9, -10, -38, 22, -25, -44, -21, -24, 5, 4, -12, 47, 3, -5, -1, -12, -15, -16, -16, -1, -19, -19, 34, 15, -9, -32, 9, +30, -32, -40, -23, -4, 7, -10, -18, -24, -17, 19, 4, -27, -57, -29, 17, 70, 30, -36, -20, 40, -29, -39, 26, 6, 18, -4, -4, 67, -25, 13, -27, 45, 99, -48, -40, 38, -24, -29, -47, -14, -11, -9, -32, 31, 22, 13, -19, 70, -10, -9, 26, -24, 1, -32, -41, 3, -5, -6, -40, 62, 29, 6, 5, 32, -64, -38, -77, -25, 11, -10, 21, -46, -24, 20, -31, 22, -34, -21, 6, 36, +-41, -17, 32, 11, -10, -44, 16, -25, 7, -4, -74, 117, -39, 20, -20, -15, -39, 22, -55, -70, -7, -42, -22, -65, 13, 56, -45, 8, 7, -15, 19, 37, -29, 42, -32, 18, 93, -32, -24, 10, -51, -3, -55, -30, 16, -4, -27, 1, -76, 54, -36, 9, 49, -55, -10, -5, -1, -43, -2, -12, 8, -21, 28, 13, -62, -24, -39, 44, 17, -20, 31, -31, 38, -9, -23, -16, -14, -4, -18, 47, 1, +-26, -18, -10, 77, -13, 19, -40, -30, -3, 4, -2, -6, 8, -8, 55, -12, -30, -43, 69, 34, -81, -1, -14, -14, -28, 1, -11, -31, 8, -21, 23, 35, 75, -13, 16, -46, -8, -28, 3, 29, -14, -29, 10, 8, -40, 8, 53, -63, 14, -15, 38, 56, -20, 14, -16, -39, -28, -22, 7, 18, 1, -34, 58, -32, 10, -72, -44, 101, -38, -10, -21, 11, -39, -26, -19, -21, -43, 16, 37, -50, -36, +-40, 25, 56, -55, -3, -39, -1, -13, -11, 2, -28, -17, -43, 84, -27, -16, -15, 22, 43, -9, -31, -18, 3, -31, -79, 27, 7, -28, -10, 28, -19, 13, -46, 20, 77, -23, 44, -20, -37, 3, -15, 21, 19, -19, -55, 43, -18, 21, -29, -27, 96, -36, -13, -15, 28, -14, -9, 21, 52, 12, 127, 0, -31, 5, 23, -6, 11, -10, 3, 40, -21, 3, -27, -28, -2, -15, -24, 4, 3, 0, -10, +0, 31, 13, 37, 61, 12, -25, -6, -1, 0, -19, 127, -39, -14, 9, 5, -10, -24, 7, -3, 19, -13, 56, -19, -7, -8, -34, -24, -13, 11, 4, -12, 9, 29, 11, 46, 45, 8, -18, -23, -8, -17, -8, 67, -22, -14, 32, -27, 17, -25, 30, 16, 7, 16, -4, -6, -15, -20, -18, -15, 22, -37, -10, -6, -14, 60, 13, -42, -23, -37, 0, -22, -28, 41, 7, 127, 13, -13, 12, -13, -19, +-2, -15, 2, 20, -12, -4, -18, 21, 7, -4, -6, -1, -22, -4, 8, -7, 17, -8, 20, 41, 14, -9, 10, -4, -36, -10, -39, 27, -57, -8, 47, -26, 30, -29, 13, 97, 18, -52, -5, -39, -13, 0, 2, 1, -9, 7, 123, -23, 35, 1, 28, 12, 13, -91, 16, -13, -69, 2, -33, 13, -31, -5, 19, -15, -6, -36, 19, 41, 82, -37, -69, -41, 80, -14, 9, -42, -55, 7, 58, 1, -12, +-7, 1, 30, -36, -5, -16, -18, 3, -4, -20, -10, -17, 27, -22, 19, 8, 51, 19, -21, 34, 36, -18, -39, -20, -39, -2, 10, 27, -5, 81, -16, -20, 11, 11, 5, -1, -18, 20, -20, 64, -10, -23, -37, -34, -39, -18, -27, 20, 67, 1, -7, 23, 13, -7, -40, 26, -58, 46, -9, -36, 11, 11, 16, -25, 56, 31, 36, 4, -29, -9, 0, 39, 7, -27, -43, -2, 22, -8, 18, -21, 13, +-1, -12, 81, 63, -3, -20, 24, -56, 1, -39, 6, -4, 4, -4, -24, 34, 36, 1, -8, 11, -15, -33, 45, 22, -48, -32, -27, -38, 0, 45, -24, 19, -1, -25, 80, -3, -2, -32, 26, -38, 63, -36, -51, -50, 27, -7, -27, 23, -22, 31, 13, -10, -45, -32, 31, -10, -4, -28, -11, -25, -43, 17, -10, 13, 37, -32, 108, -38, -24, 12, 71, -22, -26, -4, -30, -11, 10, -1, 19, 23, 17, +55, -3, -29, -15, -62, 106, -27, -8, -39, -21, -40, -33, -21, -4, -4, 4, -15, 46, -56, 30, 46, 14, -10, 15, 4, -15, -14, -19, -11, -30, 30, 39, -31, 14, 20, -14, -24, 16, -8, -26, -18, -46, -20, -61, 29, 7, 14, 3, -14, 92, -14, 17, 82, 127, -55, 42, -36, 20, -11, 73, 1, -5, 18, -9, -39, 19, 42, -45, -47, 94, -56, -27, -39, 6, -40, -23, 36, -6, 21, 14, -61, +79, 17, 13, 85, -52, -41, -5, 22, -46, -18, -50, 2, -52, 67, -16, 43, 2, 36, -36, -34, 56, 4, -7, -23, -10, -30, -27, 22, 7, 9, 11, -11, 49, -49, -8, 60, -17, -36, -5, -21, -5, -14, 48, -15, -16, 19, 8, 46, 7, -22, -12, -61, 55, -11, -14, -32, -21, -35, -21, -21, 10, -12, 9, -31, 106, -7, -2, 57, 5, -25, -8, 5, 23, -7, 37, 4, -33, 15, -14, 44, -20, +-2, 106, 29, 19, -52, 4, -28, -2, 51, -59, -37, -30, 53, -11, 1, 100, -2, 103, 8, 39, 22, -8, -32, 113, -30, 30, -16, -18, 13, -46, -16, -17, -14, -32, 54, -17, -67, 52, -2, -4, 18, -20, 4, 14, -19, 1, -22, 66, -8, 123, -29, 27, 3, -4, -41, 73, -25, -25, -55, -7, 23, 6, 48, -4, -29, -25, 22, -39, -42, 5, -11, -27, -25, -9, 36, 18, -20, 3, 21, 62, -16, +-4, -32, 4, 29, -2, -20, 23, 10, -1, 5, -17, 2, -21, 46, -8, -9, -4, 23, -17, -19, -5, -14, 29, 12, -35, -4, -12, -12, 28, -22, 80, -42, -6, 19, 33, 19, -16, -2, 37, -21, -22, -24, -39, 41, 21, 54, -3, -26, -7, 20, -3, 13, 31, 1, -16, -46, -20, -23, 9, -71, -56, 1, 127, -4, 4, -1, -29, 30, 10, 5, -35, 10, -34, 51, -1, -18, 8, 25, -38, -7, 10, +9, -36, 6, 38, -22, -20, -33, -24, -9, -7, -20, 8, -10, 25, -30, -42, 21, 0, 4, -11, -25, 48, -4, -38, -16, 5, -27, 9, 17, -45, 9, -10, 41, -13, 6, -10, -25, -32, -49, -32, 5, -15, -64, -36, 51, 77, -43, -16, 52, -18, -64, -17, 21, -7, -37, -6, 55, -22, 5, 9, 37, 14, -4, -11, 12, -24, -17, 21, -13, 2, -44, -3, -12, 10, -7, 37, -13, 65, -44, 34, -8, +12, -20, -16, -20, 42, -16, -13, 30, 6, 3, -11, 8, -21, -8, -14, 11, -31, -9, 21, -20, -28, -36, -12, -12, 5, -19, -12, 2, 80, -27, 16, 4, 33, -26, -33, -22, -6, -27, -8, 32, 5, -8, 4, 36, -20, 16, 24, 15, 33, -29, 23, -37, -4, -22, 20, -8, 26, -26, 0, -44, 71, -8, -20, 17, -16, -16, -1, -26, 66, -24, -10, 7, -36, 7, 1, 2, -6, 12, 43, -7, 44, +-15, 18, -33, -15, 7, 9, 5, 61, -54, 3, 13, 80, -40, -6, 16, 27, -48, 49, -14, 64, -13, 15, -46, -28, 17, -26, -9, -13, -6, -3, -7, 19, -8, -7, -6, 28, 3, -23, 20, 39, -17, -25, -23, 61, -33, 41, 1, 33, 18, 5, -29, 26, 11, 15, -25, -11, 9, -23, -5, -11, -20, -11, 11, -5, -16, 2, -26, 9, -36, 15, 7, -17, -9, 30, -28, 40, 0, -9, -22, 14, 32, +30, -13, -3, -12, 15, -28, -7, -17, -23, 21, -1, -10, -17, -40, -3, -7, -19, -32, 4, -38, -20, -32, -16, 15, 65, -37, 49, 6, -18, 11, 7, 19, -42, -8, 37, -36, 6, -24, -55, -23, -4, 27, -12, 3, 8, -24, -32, -6, -41, 0, 27, 16, 11, -8, -5, 28, 34, -29, 47, 5, -36, 17, 21, 34, -18, -6, 30, 44, -38, -21, -24, 27, -70, -39, -42, -10, 5, 4, -42, -27, 31, +-29, -10, -12, 22, 19, -11, -17, 92, 1, 99, -44, -37, -27, -7, 38, 0, -5, 99, -14, 3, -50, -17, 6, -22, 38, -26, 84, -33, 20, 113, -9, -47, 47, -16, 25, -64, -15, 10, -8, -89, 23, -83, -17, -26, -24, -32, -5, -1, -49, 5, -14, -29, 2, -1, -5, -32, 14, -36, -14, -32, 12, 35, 21, 19, 89, -11, -25, -47, 11, -9, -40, -87, -26, -34, -45, 80, 38, 0, -46, -12, -31, +-37, -14, 25, 38, -47, -56, 5, 127, -21, -22, -29, -13, -33, 1, 0, -30, -36, -46, 35, -35, -25, 6, -43, 3, -25, -36, 16, 0, 17, 0, -12, -19, -7, -41, -4, 53, 7, -2, 0, 96, -25, -6, -25, -63, 13, 31, 13, 41, -35, -42, 35, -24, 29, 12, -24, 38, -51, -16, 41, 1, 1, 40, -7, -8, 12, -32, -15, -11, 4, 1, -38, 12, -25, -27, -65, -15, 35, 82, -25, 69, -59, +-13, 9, 18, 13, -29, -31, 22, -4, -19, -62, -13, -1, -54, 8, -19, 25, -16, 14, -5, 45, -9, 40, 48, -14, -19, -18, -8, -37, 65, 21, 51, -2, 3, -2, -25, 16, -8, -50, -7, 1, -22, -44, -1, 6, 44, -36, -1, -3, -22, 14, 20, -2, -10, 59, 59, -19, 1, 7, 33, 47, 125, -36, 25, -29, 28, -36, -11, 0, -31, -83, -45, 7, -4, 11, -6, -23, -42, -54, 2, 37, 30, +57, -16, 16, -18, 7, 4, -47, 27, -10, 23, -4, 54, -32, 18, -1, -9, -5, -25, -6, 1, -34, 4, -18, 4, -6, -16, 11, 4, -16, 6, -4, -18, 11, 56, 42, 18, 10, 75, 18, 5, -3, 22, 19, 58, -62, 45, -16, -17, -4, -8, -16, 9, -25, 20, -11, 3, 11, -3, 0, 20, -42, 14, -4, 3, 5, 38, 60, 12, 38, 72, -6, -6, -26, 9, 18, 31, 23, 2, 31, -24, -29, +-1, 35, 41, -55, 8, -22, 20, -15, 0, -8, 0, 12, -34, 22, -16, -9, 25, -16, -8, -14, 32, 0, -7, -22, -14, 61, -7, 60, -1, -40, -19, 21, 6, 0, 44, -54, -7, 1, -9, -21, -35, 16, -31, -46, -19, -34, -51, 0, 20, -28, 25, 41, 26, 10, -1, -33, -37, 31, -14, 16, 5, -1, -3, 46, -23, 23, 24, -71, 18, -50, -27, 6, -19, -28, 12, -3, -47, -48, -13, 56, 18, +-59, 5, -17, 58, -22, 0, -13, -24, -7, 47, -1, 39, 14, 13, 10, -50, -16, 17, -22, -47, 3, -34, 11, 20, 5, 34, -26, -50, -8, -31, 15, 48, -7, -17, 20, 54, 29, 8, 8, -17, -64, 39, 4, -10, 18, 38, 0, 19, -13, -13, -14, -36, -56, 54, -4, 48, -38, 88, 0, -13, 48, 16, -3, 15, 5, 9, -23, -12, 12, -10, 2, -55, -48, 64, -2, 12, -2, -23, -3, 0, -10, +-38, -41, -33, -17, 9, -21, -1, -40, 83, -12, -17, 86, -9, 12, 80, -31, 2, 3, 27, 8, -33, -20, -28, -27, 27, 20, 19, -42, -54, 8, -2, -14, 25, -72, -54, -3, -30, -17, 51, 5, 53, -32, -26, 35, -30, 23, 53, -10, -2, -9, 110, 35, -31, 6, -24, 41, 2, 78, 12, 0, -60, -22, -35, -78, -22, 25, 18, -42, -10, 92, -35, 27, -35, 69, 48, 58, 0, 14, -6, -45, -57, +-31, 53, 4, -13, 4, -68, 109, 31, -4, -38, -8, -36, -42, -14, -22, -67, 28, -48, -39, -31, 25, -63, -19, -28, 11, 8, 9, 27, -27, -42, 47, -28, -31, 49, 11, -58, 15, -26, 71, 9, -14, -1, -11, -3, 3, -17, 8, -40, 52, -11, 5, 1, 1, -46, -16, -6, 9, 23, -17, 17, 18, -31, 8, -29, 4, 35, 63, -59, 6, -40, 60, 22, -11, -60, -58, 2, -10, -25, -31, -42, 28, +41, 20, 48, 49, -18, -9, -28, 17, 1, -13, 7, 14, 36, 59, -34, -8, -2, 9, -31, -30, 30, -1, -14, 8, -52, -5, -1, -44, -22, -58, -59, 52, -4, 37, -1, -8, -48, -43, -43, -6, -35, -2, 13, 19, -26, 75, -26, -12, 19, 8, -50, -24, 10, -13, 7, -3, 4, -1, 7, 18, 24, -14, 13, 2, -12, -49, 17, 47, 3, -38, -19, 36, 1, -43, -4, -41, -42, 57, -15, 18, 11, +31, 18, -84, 23, -32, -32, -21, -12, -8, 0, -27, 24, -4, -33, 51, -6, 0, -2, 15, -19, -30, 2, 5, 11, 11, 28, 60, 13, 51, 15, -12, -41, 32, 39, -33, 5, 15, -28, -24, -34, 13, -1, -19, -11, -24, -27, 27, -27, -6, -18, 23, -14, 2, -25, 19, 16, -11, -7, 19, -22, 34, -17, 18, 8, 27, -8, -40, -35, 19, -30, -32, -40, 20, -18, 3, -14, -2, -34, 35, -4, 13, +-2, 13, -22, 11, -25, 9, 9, -18, -4, 27, -9, 54, 2, 28, 17, 14, -9, -8, 28, 38, -26, 12, -46, -12, 10, -23, -39, -13, -7, 1, -8, -12, -23, 38, -6, -5, 5, -14, -1, 10, -9, 0, 0, 24, -4, 64, -42, 47, -26, -6, 13, 31, -43, 27, -15, 37, -11, 22, 41, 8, -39, 0, 0, -5, -28, 30, -28, -33, -2, -2, 46, 25, -56, 1, 11, 6, -28, 55, 72, 26, 36, +13, -48, 6, -37, 12, -30, -19, -16, 41, -11, -35, -29, 19, -32, -34, -4, -4, -2, 32, 2, 3, 42, 49, -60, -9, 5, -4, -43, 46, -5, 44, -48, -16, -10, 15, -18, -19, -7, -6, 2, 25, -20, 14, -21, -1, -27, -26, 20, -20, 3, -9, 1, -2, 23, -23, 12, 9, 25, 22, -11, 13, -13, 43, -18, -8, -41, 53, -25, -37, -13, -16, -23, -28, -14, 13, -15, 11, -21, -19, -26, -22, +-44, 41, 11, 32, -10, -8, 15, 55, 23, 53, -26, 2, -34, 39, 64, -21, 3, -18, -33, -8, -13, -35, -19, -45, -47, 38, -27, -7, 13, -30, -5, 1, -6, 8, -5, 49, 11, -26, -14, -37, 11, -6, -9, -20, -33, 31, -16, 2, -21, 32, -30, -2, 4, -29, -9, -2, 6, 18, -33, -12, -17, -39, -55, 33, -12, 18, 12, 26, -6, -49, 16, 6, -29, -2, -26, -6, -36, 25, -36, -7, -14, +-7, -19, -7, 29, 3, -29, 9, -45, -15, -17, 32, 36, 51, -33, 43, -53, -11, 11, -17, -39, 24, -1, -35, -2, 13, -34, 56, -8, 32, -4, 14, 1, 46, -16, -68, 17, 27, -53, -37, -36, -11, 46, -13, 11, 46, -1, 24, -15, -5, 12, -16, -30, 64, 39, -28, -54, -21, 23, 0, -63, 30, -9, 17, -21, 14, -17, -24, -8, 10, -5, 10, -17, -20, 23, -9, 7, 24, -15, 8, 12, -5, +-32, -23, 6, 6, 15, -44, -16, 33, 29, 45, -5, 18, 52, -5, -14, 30, 59, -34, -20, 10, -46, 11, -7, 16, 37, -10, 6, 43, 16, 54, 8, -27, -4, -28, -22, -31, 57, -32, -15, 28, 19, -2, -13, 23, 32, 75, -30, 24, 0, 38, 44, 33, -31, -16, -26, -17, -26, 10, 12, 9, -59, 10, -38, -55, -4, -17, -36, 25, 68, -7, -36, 10, -5, 77, -41, 108, 49, 3, -7, 3, 30, +-19, 0, 25, -37, -24, 14, 30, 50, -16, -6, 37, 7, 44, 6, 22, 26, -7, 3, -49, 20, 35, -41, 13, 12, 21, -7, 42, -47, 29, -11, 23, 74, -39, 0, 17, -9, 2, -39, -1, -70, 2, -3, 75, -27, 26, -29, -8, -33, -39, -17, -21, 76, 11, -22, -22, -8, 7, -50, 105, -27, 12, -7, 7, 23, 10, 14, 14, -32, -24, -10, -7, -29, -9, -17, 50, -18, 17, -27, -5, 11, -33, +-34, 11, 34, 18, 4, -2, 13, 45, -24, 49, -12, 19, -20, 22, 16, 25, 9, 10, -41, -14, -41, -20, -50, -21, -20, 44, -19, 0, 4, -2, 9, -39, 14, -1, 41, -5, -19, -14, -6, 46, -24, 42, -11, -1, 3, 33, -21, 2, 0, 35, -29, -10, 14, 0, -2, 34, -6, 25, 10, 27, 16, -18, -15, 5, 4, -21, 29, 7, -8, -5, 4, 13, 1, 58, -36, -57, -26, 6, -46, -21, -14, +38, 16, 14, 12, -28, 9, 14, 10, 35, 1, 1, -32, -3, 15, -38, 11, -5, 55, 7, 31, 6, -6, 93, -1, 55, -24, -53, -46, 45, -39, -33, 10, 14, -26, -36, 5, 10, 21, -1, -3, 65, -11, 19, 18, -4, 7, -26, 21, -10, 34, -9, -4, 57, 9, 90, 22, 66, 28, -44, 2, 29, -25, -15, 12, 23, -5, -21, -4, 0, 10, 1, -4, 11, -11, 18, -13, -3, -19, -22, 15, -12, +-7, -10, -14, -19, 13, 76, -3, 8, 26, 44, -57, -35, 33, 23, -20, 18, -8, 20, -31, 10, 15, 17, 17, 50, -13, 28, -6, -5, -28, -18, 6, -52, 2, -26, -19, 6, 13, 112, 15, 8, -10, -21, -18, -27, 101, -47, 51, -22, -36, 18, -10, -4, 6, -24, 4, 13, -25, 59, 13, -20, -33, -9, 3, 43, -37, -11, -17, 1, -47, 127, 29, 40, 32, -24, -4, 8, -35, -31, -1, -26, -22, +-6, 6, -7, 74, -46, -16, 9, -33, 15, -19, -7, -27, -43, 24, 18, -11, 4, -29, -5, 15, 94, 23, 26, 6, 71, 43, -14, -11, 9, -21, -54, 9, -34, 54, 21, 28, -13, 13, -74, -22, -7, 76, 3, -10, -79, -23, -34, -1, -43, -16, -30, 18, -25, -5, 18, -54, 54, -11, -1, 40, 0, -31, -33, 29, -49, 34, -10, 21, -42, -46, -17, 19, -24, -2, 59, 0, -10, -9, 27, 23, -19, +-14, 84, 1, 64, -12, -34, -17, -13, 25, -9, 13, 4, 28, -26, -14, 13, 30, -26, -17, 13, 3, -9, 28, -23, 18, -7, -17, -27, -8, 14, -23, -67, 12, -2, -14, 8, 58, -28, -36, 33, 5, -29, -16, -32, -41, -42, -9, 6, 56, -22, -2, 1, -8, -28, -10, -50, 38, -29, 9, -20, -12, -18, 22, -47, 38, 12, -27, 46, -18, 19, -37, -4, -10, 50, -54, 4, 0, -22, -14, -52, 9, +-47, -48, 41, -25, 2, 51, -6, 44, -19, -15, -3, -4, -24, -17, -38, 7, -37, -109, 33, -17, -24, 42, 4, -23, 30, -30, 0, -6, -16, -44, 6, 24, -19, -21, -27, -12, -13, -23, -35, -1, -18, -20, 9, 0, 45, -2, -22, -10, 19, 43, 15, -13, 53, 0, 13, 2, 40, -11, 19, -49, -20, -43, -27, 66, 15, -6, 12, 27, -58, 44, -8, 35, 58, 79, -17, -10, 4, -3, -29, 23, -22, +-69, 21, 16, -46, 24, 0, 22, 22, -9, -11, -11, -23, -26, -19, 25, -4, -16, 15, -28, -5, 13, -18, 18, -8, -23, 28, 26, 29, -15, 13, 8, -3, 18, 0, -27, -7, -5, -16, 41, 9, -3, 1, -6, -6, -31, -8, 43, -4, -2, 22, -17, -24, 24, 7, -2, -5, -34, 30, 31, 45, 5, -13, -21, -12, -1, 25, -9, -23, 0, 3, 17, -6, 18, -19, 6, -15, -9, -62, 40, 2, 4, +25, -3, -9, 30, -11, 31, 40, -32, 30, 4, -28, -23, -6, -20, 0, 17, -48, 33, 42, -19, 12, 6, 2, -13, -29, -77, -44, -27, 21, 15, 28, 6, -11, -63, -39, -3, -17, 34, 40, -28, -19, -6, 1, -5, 9, -4, -19, 24, -12, -35, 86, -34, -9, 9, -10, -1, 28, -23, -32, -7, 4, -14, 5, 64, 1, -29, -28, 10, -46, 15, -28, -17, -34, 3, -12, -13, 30, -27, -15, 36, -8, +-49, 57, -55, 0, 20, 31, -5, -5, -9, -25, -2, 25, 32, 8, -15, 1, 2, -15, -8, -20, 16, 13, -39, 30, 2, 3, 18, -6, 5, 19, -25, -11, 0, 31, -7, -2, 42, 33, -34, 26, -19, -29, -50, -13, 47, -4, 45, 10, 12, -36, -17, -16, -12, -19, -18, 45, 12, 17, 6, 5, 52, -13, 46, 8, 3, 20, -55, -31, -25, 1, 2, -28, -25, -6, -40, -13, 42, -5, -20, 6, 56, +-39, 11, -55, 22, -1, -28, 46, -18, -8, 41, -23, 39, -30, 29, -22, -7, 66, -29, -12, 4, 27, 4, 4, -12, -60, 29, -4, 83, 46, 14, -58, 24, -21, -7, -29, 11, 26, -43, 35, -7, 16, -12, -24, -5, 33, 15, 8, 19, 57, 4, -6, -31, 41, -7, 63, -49, -38, -23, 108, -20, 2, 44, 34, 36, 14, -19, -54, 16, 2, 37, 4, 6, 45, 34, 0, -11, 6, -15, -56, -27, -18, +-5, 49, -16, 6, -56, 124, 34, -30, -17, 41, -33, -20, -40, 35, 29, -9, -39, -57, -16, 19, -24, -40, 66, -20, -4, -1, -7, -34, 1, -68, -26, -22, 42, -12, -18, -11, -20, 53, -11, -20, -31, 27, -15, 0, 1, -31, -1, 7, -14, -34, 24, 26, -7, -36, 65, 4, 3, -8, 13, 40, -31, -34, -29, -9, 1, -12, -3, -19, -35, 71, -43, -7, 17, 25, -19, -8, -40, -50, -32, -8, -50, +-45, 67, 25, 4, -16, 65, -40, -11, 11, 16, 11, -15, -30, -19, -8, -22, -9, -42, 14, -8, 35, -31, -26, -25, -39, -42, -23, 46, -4, -30, -13, 29, -57, -8, 28, -9, 1, 40, -3, -73, -38, -26, 46, 10, 72, 7, -20, 5, 27, -25, -27, -15, -15, -40, -10, 18, 10, 3, -30, -45, -22, 4, -10, 2, -26, 23, 37, -3, -2, 2, -5, -30, -18, 4, 46, 7, -13, 19, -2, 8, -17, +-39, -16, -22, 31, -47, -15, 25, 28, 22, -31, 20, -10, -45, -33, -13, -29, -59, -34, -11, 17, 28, 4, -32, 3, 3, -4, -12, 20, 18, -19, 6, -19, -8, -20, -32, 34, -16, -24, -12, 21, -29, -10, -20, -3, 2, -14, -33, -16, 38, -9, 31, -7, 21, 12, -24, -18, -14, -2, -24, -1, -10, -10, 9, -15, -3, -3, -25, 57, -15, -33, 1, -2, -29, -18, -24, -21, -20, -27, -30, -15, 22, +-16, 56, -15, 45, -6, -22, -20, 16, -9, -22, 12, 7, -14, 6, -4, -25, 33, 0, 59, 15, -4, -22, 2, 2, -44, -27, 8, -8, 31, -31, -43, -13, -25, 24, 7, -14, 13, 29, -32, 11, 21, -3, -18, -3, -10, -15, 45, -1, 33, 50, 127, -19, -17, -22, -3, -21, -28, -5, -23, -28, 3, -54, -47, 18, 23, 20, -9, 45, -28, -11, -18, -3, 43, 65, -34, 24, 68, -4, 24, -5, -33, +-26, 105, -39, -29, -12, 10, -40, 15, -45, 17, 38, -11, -81, -28, -24, 85, 17, -11, 38, 3, -27, -12, 1, 17, -11, -39, 1, 23, 10, 9, -2, 9, 28, 37, 19, -21, -29, 23, -19, 2, 17, -5, -18, 30, -34, -17, -1, 0, 20, -17, 16, -1, -24, -44, -3, -29, -8, -13, 9, 1, 0, 13, -39, 25, 58, -10, -2, -11, 20, -15, -9, -12, -6, 46, -37, 12, -18, -37, -4, -18, -32, +21, 80, -23, -23, -23, 0, 25, 23, -14, 0, -46, 0, -29, -30, 4, 36, 64, 22, -8, -8, -8, -23, 59, -19, 18, -19, 60, -42, 10, -11, -1, 56, 20, 10, -10, -19, -21, -18, 28, 9, 4, -5, -39, -41, 33, -21, 26, 38, 123, -10, -24, -5, 22, -5, -36, -36, 19, -9, 49, -61, -18, 1, 82, -15, -12, -7, 49, -31, -29, -4, 29, 4, -42, 45, 14, -49, -43, -6, 38, 19, -19, +18, -3, -8, 45, -33, 116, 16, -15, 29, 16, -41, 21, 48, -77, -32, -8, -50, -19, -1, -61, -16, 8, -3, 50, 18, -26, 20, -44, 5, 34, 71, -72, 5, -3, 34, 16, 59, 58, 78, -9, 16, -1, -17, 0, 10, 5, 10, 39, 1, -24, -32, 9, -3, -7, 29, 80, 21, -32, 6, 1, -12, -28, -9, -31, 2, 4, -5, 45, 76, -31, 52, -10, 4, 26, -14, -25, 47, -22, -22, -39, -21, +-16, -2, -30, 40, 39, -30, 17, -18, -16, -16, 16, -2, 12, -50, -27, 24, -38, 33, 21, 70, -45, 62, -18, 10, 41, -15, -21, -9, -2, 18, -66, -13, -12, -9, -38, 21, 11, -46, 74, 12, -12, -15, -19, 8, 36, -27, -33, 57, -47, -14, 26, -27, 5, 108, -43, -34, 36, -18, 54, 17, 75, 20, 56, 62, -10, -48, 34, 22, 26, -3, -59, 2, 2, -42, 10, 29, 40, -37, -3, -8, -50, +23, 8, 12, -29, 5, 17, 22, 24, 11, 0, 38, -13, 10, -16, -6, -16, -2, -6, 18, 0, 44, 50, 17, -34, 29, -16, 54, 0, -33, -15, -23, 21, 4, -9, -28, 72, 17, -39, 25, 30, 15, -6, -26, 3, -19, 57, 40, -27, -13, -3, -17, -32, -21, 12, 24, -42, -29, 32, 36, 43, -35, -3, -13, -24, 5, 48, -5, -8, 61, -22, -12, 28, -20, -12, 9, -7, 13, 19, 8, -11, -17, +5, 32, 11, 5, 7, 12, -25, -24, 44, 18, 26, -67, -22, -59, -23, -10, 35, -11, -1, 70, -29, -9, 39, -10, 22, 32, 28, 22, 41, 4, -14, -20, 7, 58, 15, -33, 16, 11, -33, -36, 0, 23, 69, -42, -26, 21, 1, -8, 36, -3, -8, -17, -16, -35, 31, 34, -33, -34, -6, -15, 23, 4, -44, -9, 13, -43, 7, 5, 20, 21, -31, -38, -17, 21, -3, -34, -62, -8, -52, 1, 12, +12, -37, -14, -58, -47, 2, -5, -11, 38, -3, -5, -34, -23, -81, 0, -15, -27, 11, -16, 46, 20, -20, -21, -25, 3, -11, -51, -63, 50, -14, 24, 42, -6, -54, 29, -48, -38, 10, -17, -26, 22, -2, -10, -5, -19, -6, 7, -7, -20, 15, 18, 122, -14, -26, -17, -9, 17, 3, -9, -34, 31, -44, -5, 12, 32, 18, -6, -15, -64, 3, -43, -12, 15, 17, -27, 16, -40, -31, 10, -35, -22, +-6, 9, 14, 17, -25, -36, -19, -6, 46, -51, -25, 17, -40, 3, 22, -23, -53, -32, -20, 17, 13, 22, 17, -10, 30, -10, -32, -72, -3, 11, -44, -32, -21, -5, 34, -5, 12, -31, -11, -40, 127, -23, -6, 35, 24, -11, -10, 5, -11, 12, -20, -45, -14, -29, -10, 30, -22, -42, 0, -14, -65, 33, -28, -28, -51, 10, 21, -12, -34, 0, -39, -25, 13, -73, -6, -2, -14, -18, 89, 14, 16, +-20, -26, -16, 8, -31, 3, 18, 33, 24, 11, -19, -36, 38, -40, 4, 13, -9, 45, 31, -46, 17, 22, -23, 49, 51, 127, -60, -3, -36, -2, -12, 12, 38, 31, 11, 4, -38, 21, -11, 11, -22, 10, -18, -20, -23, -62, -5, 14, -26, -6, 28, -22, -8, 63, -2, 48, -41, 125, -57, -37, 47, -7, -61, -31, -31, -4, 105, -12, -29, -32, -27, -7, -24, 43, -51, 41, 0, -42, -22, 35, 0, +-64, 27, -33, -12, 18, 4, 41, -31, 127, 8, 0, -11, 38, 1, -7, 37, 17, 84, -12, -32, -51, -7, 8, -13, -18, 29, 19, -34, -18, 8, 33, 43, -44, -44, -24, 12, 47, -30, 74, -16, 127, -18, 7, 25, 41, -9, -31, -15, 43, 85, -37, 14, -14, 39, -45, -16, 30, -24, 35, -14, -26, 8, 19, -15, 37, -22, -10, -6, 52, -1, 23, -46, 119, -27, -62, 9, -38, 32, 26, 21, 11, +68, -39, -19, 51, -47, 28, 13, 43, 1, -38, -25, -42, -36, 12, -13, -17, -63, -38, -19, -20, -33, 30, -37, 127, 15, 23, -7, -7, -7, -25, 17, 8, 80, -36, 32, -21, -5, 38, -5, 42, -5, 21, -12, -28, 43, 11, 23, 33, -28, 2, -19, 77, -52, 1, -14, 127, 0, -41, -1, -11, -16, 40, -28, -1, 48, -10, -80, -27, -45, 29, -4, -21, -27, 8, -46, -12, -38, 27, -31, -34, 18, +-15, -29, 19, 18, 48, -5, 127, 1, -10, 28, 23, -12, -3, -4, 8, 28, -15, 1, -4, -12, 6, -10, 6, 1, -11, -34, -39, -27, -1, 2, 46, -3, 17, -44, 30, 8, 68, -28, 127, -19, -17, 2, 30, 2, -18, -3, 23, 69, -31, -36, -2, -36, 22, -12, 19, 1, -8, -37, -25, -25, 0, 11, 19, -3, -14, -31, -44, 36, 19, -16, 127, -12, 3, 55, -36, -19, 14, 7, -1, 33, -37, +22, -17, -23, 23, 5, 19, -4, -28, 14, -25, 12, 45, -10, 92, 49, 1, -31, -56, 77, 34, -37, 87, 3, -29, 27, -46, -38, -25, 12, 7, 26, -12, -30, 10, -34, -2, -15, 34, -7, -37, 34, -2, 32, 51, 15, 91, -2, -16, 8, -7, 41, 46, 18, 127, -13, -28, 11, -29, -24, -26, 13, 18, -9, -39, -8, 30, 3, -18, -23, 2, -11, -42, -9, 21, 0, 60, 43, 52, 22, 15, 4, +24, 23, 35, 5, 127, -35, -10, 14, -23, -9, 28, -1, -3, 7, -1, -7, -5, -4, 9, -12, -20, 12, 12, 2, -1, -20, 55, 27, 27, 58, 7, 25, -1, 13, 73, 43, 127, -23, 12, 28, -9, -15, -14, 78, -4, 52, 4, 54, -46, 8, -3, -30, -1, -8, -14, -11, -32, -49, 48, -13, 83, 57, 20, -16, -2, -35, -8, -31, 39, -22, 12, 21, 2, -3, -34, 88, -1, -50, -29, 73, -23, +13, 15, -55, 14, -1, -8, 7, -13, -4, 29, -18, 68, 62, -18, 0, -6, 7, 27, -28, 127, -13, -19, 43, -22, 10, 1, 63, 5, 28, -13, 35, 19, -15, -1, -32, -10, 37, -12, -9, -17, -1, 72, 35, -3, -19, -7, 38, 2, -18, -15, 27, 14, -30, 35, 28, 27, -12, 24, -24, 36, -43, 28, -7, 46, -8, -55, -32, -33, -28, 10, 20, 18, -26, -28, -6, 1, 52, -9, -31, 40, 19, +10, 5, -26, 40, 28, 35, 46, 18, 39, 7, -9, 26, -33, 11, -29, 2, 34, -13, -27, -43, -61, 20, -13, -56, -57, 37, 9, 26, -12, -35, 4, 49, -20, -19, -6, -34, -5, 4, -9, -38, 61, -11, 19, -46, 9, 37, 31, 18, -42, -25, 4, -36, -7, -42, 47, -15, -19, 9, 56, -9, -60, -11, 23, 27, 38, 32, 35, -13, -28, -52, -3, 35, 82, 63, 5, -45, -57, 21, 57, -23, -45, +-12, -1, 18, 1, -56, -1, -15, -31, 24, -13, -31, -28, -48, 56, -4, 57, -59, -49, -5, -11, 30, 26, 21, -13, -28, 34, -7, 27, 6, 86, 19, -9, -5, 9, -11, -4, 32, -15, -13, -25, -9, -54, -40, -2, -43, -35, 23, 81, -89, 48, 63, -1, 31, 8, 32, -29, -32, 38, -41, -4, -54, 123, 6, -19, -13, 13, 1, -1, 22, 6, -18, -42, -7, -82, -45, -56, -26, -34, -16, 8, -37, +7, 39, -35, 11, 60, -31, 20, -44, -7, -44, -35, -43, -47, 31, 1, -27, -13, 5, 44, -52, -16, -12, 36, -34, -39, -19, -22, -8, -12, 15, -18, -22, -32, 6, 10, 8, 25, -52, 21, -31, -31, 32, 25, 2, -3, 47, -28, -1, -35, 7, 50, -17, -13, -36, -43, 40, 18, -4, -43, -27, 30, -11, -8, -27, -1, 8, 20, 44, 40, -18, -7, -57, 11, -21, -16, -30, -9, 58, 2, -16, -34, +20, -14, -25, 14, -7, 3, -6, 18, -12, -19, -21, -9, 11, -45, -16, 1, -38, 41, 32, 25, -5, -16, -23, -5, -11, 127, 58, 93, -20, 20, -7, -36, -25, -7, 0, 1, -22, 30, -22, -44, -56, -2, 16, -8, 24, 13, 12, 43, -12, -51, 21, -23, -41, -3, -12, -39, -5, 58, -40, 70, 22, 15, -16, -29, -18, -1, -9, -37, -5, 14, -15, -7, -40, -25, -45, -14, -12, -28, -21, 12, 2, +-39, 18, -55, -18, 4, -11, -34, -46, 61, 127, 74, 14, -2, 19, -9, -31, -6, 0, -31, -20, -14, 5, -30, -29, -26, 23, 47, -43, -81, 5, 3, -20, -27, -35, 35, -52, -2, -23, -52, -26, 87, -27, 97, 62, -14, 36, -44, 15, 38, 51, -5, -47, -18, -11, -38, -25, -26, 62, -11, -8, 9, -14, -1, -10, 17, 27, 19, -54, 24, 40, -26, 26, 72, 10, 78, -15, 31, -24, -17, -11, 15, +-18, 43, -42, -10, -12, -50, -58, -56, -17, 13, 58, -41, -8, -51, -3, 20, 16, 3, -28, 29, -23, -32, 21, 42, 7, 7, -4, 1, -18, -11, 3, 42, -28, 14, -22, -20, -17, -27, -27, 6, 4, 77, 42, -7, -46, -62, -11, -49, -16, -77, -5, -5, 13, 20, 8, 98, -8, 127, -1, 5, -11, -11, -31, 96, -31, -34, 5, -33, 23, -12, 18, -3, -23, -20, 15, 61, 28, -1, -58, -14, -29, +22, -4, 35, 7, 66, 52, -7, 7, 92, 13, 54, 49, 40, -26, 55, 5, -37, 36, -19, -29, -22, -15, 19, -10, -4, -30, 97, -26, 48, -22, 24, -24, 112, -54, -36, 16, -74, -19, 12, -20, 46, -11, 26, 18, 8, -32, -61, -33, -39, 10, -31, -26, 31, 21, 89, -27, -78, -28, 24, -11, -70, -6, 14, -3, 98, 57, -32, 42, -12, -29, -9, 42, 18, -31, -10, 25, -27, 5, -5, -14, 18, +12, 14, -30, 29, 19, -21, -2, 58, -41, 15, -12, -47, -65, 22, 0, 58, 36, -16, 12, 1, -34, -16, -12, 37, -23, -31, -13, -12, 0, -1, -17, -26, -45, -42, 13, 3, 40, -19, -41, -12, -69, 63, 23, -32, 12, 23, -43, 42, 42, -12, -2, 11, 23, 12, -47, 105, 15, 15, 70, 3, -9, 6, 8, -13, 19, -69, 84, 46, 55, 10, -3, -42, -43, 23, 23, 38, -45, 72, -18, 18, 39, +21, -2, 35, 43, 27, 18, 90, 13, -13, 47, -10, 19, 34, -34, -33, 44, -95, 35, -20, 63, -12, -6, 61, 56, -3, 4, 4, 6, 3, 8, 31, -21, -25, 99, 10, -2, -6, -21, -12, -15, -2, -2, 9, -21, 58, -7, -42, -12, 56, -50, -38, -8, 19, 9, -20, -51, 122, -4, -30, 35, -23, 0, 13, -33, -51, 34, -37, 13, -38, 8, 13, -39, -13, -10, -4, -49, 23, -14, -42, -10, -27, +34, -40, -6, 14, 41, -3, 106, 28, 18, -27, -25, -24, 33, 0, -26, -38, 26, -9, -16, -9, -10, 33, -30, 27, -28, 51, -39, 40, 9, -28, -44, 10, -23, -26, 36, -24, 0, -19, -55, 44, 20, 12, 26, -8, -4, -21, -25, 61, 32, -27, -5, -21, -28, -15, -27, -6, 79, -20, -2, 4, 23, -32, 84, -50, -32, -16, 98, -31, -23, 4, -34, 78, 0, 7, 29, -37, -13, 6, 24, 64, 24, +-43, -9, 18, -1, 14, -10, -20, -16, -40, -15, -21, -4, -28, 32, -50, 53, 3, 28, -5, -28, -23, -37, 70, 17, -11, 22, 1, -8, -21, 49, -4, 13, -59, -10, -11, 13, 1, 5, -21, -50, -4, -6, -33, -5, -38, 23, -36, -4, 7, 38, 4, -11, -12, -55, 61, 7, -40, 0, -16, -31, -29, -17, 32, 18, 7, -45, 0, -23, -42, -41, -6, 44, 5, -12, 22, -44, -16, 21, -32, 78, -46, +15, -25, -47, -8, -14, 87, -26, 27, 44, -30, -23, -6, 12, 51, 29, -22, -37, 24, -8, -19, -33, -48, 96, 11, 1, 1, -11, -23, 68, -27, 1, -18, 92, -17, -43, -18, 20, 35, -17, -2, 3, -33, -11, -39, -48, 5, 12, -3, -22, -25, 9, -16, -11, 33, 95, -18, -42, 20, -18, 7, 14, -15, 16, 6, 23, -16, -29, -29, 46, 60, -11, -10, 16, -39, -35, -53, -23, 32, 5, -87, 32, +-44, -36, -28, -26, -15, -13, -46, -7, 4, 3, 13, 21, -20, 17, -67, 29, -30, 1, 15, -29, -34, 15, 2, 10, -24, -1, -25, -31, -6, -3, -2, -33, 4, -50, 77, -20, -3, -40, -41, 20, -41, -44, 1, -44, 9, 0, -52, 9, -25, 1, -15, 14, 22, 18, -1, 27, -1, -53, -6, -58, 68, -12, 56, -12, -20, -33, -43, -13, -18, 86, 13, 13, -29, -42, -11, -37, -1, -33, -4, 18, -5, +24, 6, 0, -32, 52, 38, 127, 5, -14, -25, 5, 2, -6, 1, 17, -60, -30, -3, -21, -10, 21, 18, -36, -23, 30, 6, 25, -18, -30, 18, -60, -6, 3, 58, -25, 34, 2, -7, 75, -45, -36, -6, -21, 52, 6, 27, -30, -13, -26, 5, 1, 10, 3, 2, -26, -16, 61, 25, 53, -9, -19, 33, 13, 5, -10, 100, -50, 35, -10, 15, 29, -56, -41, 6, -72, 31, -6, 13, -10, -38, 29, +65, -9, -52, -37, 48, -45, -33, -30, 26, 33, 21, -39, 71, -73, -4, -3, 96, -79, -5, -26, -24, 46, -68, -65, -2, -31, 34, 20, 1, 33, -46, -34, -3, 4, -70, 9, 45, -55, -40, -84, 52, -10, 7, -40, 29, -40, 5, 22, -9, -4, 11, 92, 3, -19, -2, -25, -24, 9, -45, -22, 38, 5, -7, 33, 20, -32, 1, 22, 7, 51, -6, -5, -15, 4, -22, -1, -29, 4, -4, 51, 14, +0, 101, 22, -5, -7, -49, -29, -43, -4, 102, 10, -1, -18, -26, -4, -23, -27, -20, 7, -47, 90, -22, -13, -22, -38, -16, -6, -28, 9, -4, 8, -25, 16, 41, -6, 2, -12, -11, -24, -14, 36, 1, -35, -16, -19, 22, 35, 9, -5, 20, 2, -24, 86, -53, 2, 56, -23, 10, 9, -1, -12, -10, -9, -33, -52, 24, 17, -18, -13, -35, 5, 0, -21, 38, -41, -39, -41, 31, -12, -24, -21, +18, -12, 23, 45, 3, -32, 5, -20, -16, 34, -8, 48, -12, -32, 27, -56, 27, 16, 29, 10, -19, -10, -21, -6, 38, -54, 22, -45, 22, -14, -7, -40, -29, -27, 18, 33, -18, -13, 32, -25, 6, 30, -41, 26, 19, 1, 47, -48, 61, 35, 34, 26, -14, -6, 22, -20, 15, -36, 18, -40, 5, 16, 15, -30, -20, -20, 9, 34, -2, -34, -5, -33, 1, 18, 8, 26, 20, -20, -17, -39, 34, +-4, -18, -8, -53, 7, 36, 25, 35, -42, -32, -40, 29, 101, -44, -41, 48, -55, -8, 98, -24, 1, -8, -29, -8, 48, -22, 53, 15, -8, 17, -62, 39, 14, 17, 18, -22, -56, 24, -17, 31, -58, 7, -55, 26, -15, -18, -18, -54, 17, 75, 46, 15, -15, 2, -4, 3, 4, -9, 38, -7, -32, -8, -20, 9, -22, 7, -8, 33, -32, -18, -6, 24, 2, -12, -20, -8, 36, -28, -31, -20, 5, +37, 19, -18, -25, -6, 6, 31, 25, -17, -18, 0, -17, 15, 5, 34, 29, 6, -1, 9, -43, -20, -19, -55, -39, -16, 3, -33, -47, 32, -47, 28, -26, 27, -20, 48, 31, 4, -47, -16, -8, -33, 82, 49, -46, -10, 4, -19, -17, -13, -24, 73, 8, -11, -21, 63, -2, 43, -8, -16, -29, -40, -13, -17, -5, 107, 15, 4, -36, -98, 127, 43, -29, 46, -36, -14, 31, 3, -10, -14, 66, -20, +-10, 45, 9, -23, -17, 11, 8, -40, -16, -9, -25, -19, -30, -32, -32, 15, -3, -9, -40, -31, 74, 45, 89, 21, 16, -31, 73, 57, 32, -6, 24, -45, -18, 65, -37, 49, -7, -16, -6, 37, -19, 2, -70, 10, -13, 36, -47, -58, 81, -2, -36, -9, 108, 9, -39, 3, -33, -7, -41, 31, -34, 4, 19, -31, -49, 2, 12, 0, 47, -13, -12, -6, -9, 32, -10, -14, -50, -29, 49, -30, 24, +-9, 18, 15, 72, -26, -12, 25, -7, -51, -78, -3, -15, -26, 16, -35, 14, 40, 20, -53, 48, -34, -23, -71, -40, 73, -33, -7, 39, -33, 65, 26, 61, 29, 38, -33, 79, -38, -33, 127, 38, -67, -93, 5, 0, -54, 122, -24, -33, 91, 8, 8, 22, -34, 19, -45, -32, 104, -35, -25, 76, -64, 102, -2, 77, 15, 14, -76, 127, -29, -52, 85, -4, -49, -73, -45, 3, -24, 71, -27, 4, 27, +-9, -28, 49, -4, 17, 21, 21, 12, -27, -14, 33, 18, 2, -47, -2, 6, 91, 5, -19, -8, -33, -51, -24, 26, 5, 10, -10, -20, 111, 5, -10, -71, 41, -22, 7, 17, -12, -35, 13, 127, -14, -11, -36, 39, -25, -8, -43, -29, -67, 103, -15, -12, -21, -65, 5, -1, 29, 0, -9, -19, 45, 14, 50, -50, -12, -35, -17, -28, -9, 1, 33, 30, -1, -11, -5, 18, -29, -54, -20, -7, -29, +23, 28, -65, -17, -6, -23, 29, 4, 99, -36, -46, -3, -39, 14, -7, -20, 0, -37, -7, 5, -3, 40, -27, -47, 20, -25, 13, 29, 16, 7, -26, -49, -43, -19, -1, 8, 9, -37, 61, 36, 66, -39, 3, -38, -13, -39, -57, -16, 20, 2, 6, 25, 8, 68, -18, -41, 48, -6, -10, 46, -19, 80, 16, -13, -31, -28, -6, 11, -19, -16, 37, -9, 71, -53, 22, -23, -20, -20, -50, 5, 10, +-3, 8, 21, -6, 47, -18, -23, 32, -9, -22, 33, -13, 26, -1, -23, -43, 19, 11, -7, -23, 6, 0, 13, 78, -40, -10, 11, -21, -22, -25, 56, 39, 0, 69, -36, -35, 12, -52, -44, -14, 11, 6, -20, 10, -41, -65, -34, -26, -22, -25, -28, -26, 9, -47, 1, 120, -43, -4, -19, -11, 31, -39, -33, -31, -8, -4, 38, -15, 69, -20, -23, -14, -30, -1, 28, 7, -5, -60, -16, -29, 18, +-7, -6, -8, -26, 24, 27, 76, -30, 19, -2, -34, 3, 8, -1, 18, 1, 21, 7, -2, 10, 16, -4, 25, -11, 5, -18, -25, -24, -34, -13, 28, 0, -21, 24, 8, -2, 11, 62, -16, -3, 19, -5, 19, 38, 16, -20, 47, 13, 28, -9, 35, 19, 20, -81, 57, -29, -19, -35, -22, -2, 61, -29, -24, -20, 62, -43, 62, -37, 0, -12, 25, 18, -12, 21, -3, 24, 14, -10, 54, 81, -28, +-74, 2, 15, 0, -4, -3, -35, 41, -22, 25, -11, -1, -44, 27, 29, -14, 8, -38, -14, -41, 19, 11, -3, -3, 27, 2, 20, 35, -15, 35, 89, -24, -26, -35, -15, 23, -8, -33, 4, 32, -26, -2, -60, -14, 5, 88, 17, 7, -3, -49, -66, 59, 9, -20, 27, -19, 19, 25, 18, -22, -16, 88, -50, -36, -3, 27, -35, -17, -6, -5, 41, 15, 14, -1, 28, -44, 23, 24, 42, -19, 59, +-35, 3, 1, 38, -46, -14, 2, 3, -4, 0, 45, -21, 68, -6, -23, -24, 5, -61, 3, -17, -31, -2, -11, -26, 9, 88, -10, -3, 55, 15, -21, 20, 30, 16, -21, -60, -29, 26, -36, -6, -11, -47, 58, 2, 62, -9, -43, -53, 2, -66, -33, 9, -39, -14, 15, -49, 19, 29, 49, -42, 32, 33, 54, 25, -51, -37, -51, 62, -82, 23, -34, -2, -37, -54, 63, -27, 95, 33, -31, -83, 25, +-37, -54, 8, -53, -32, 36, -38, 13, 59, -12, -21, 42, 85, 28, 45, -26, -49, -36, 78, -3, -26, 61, -2, 13, 106, -7, 14, 7, 2, -28, -41, -22, 10, 20, 20, 38, -17, 65, 23, -30, -18, -1, -3, -28, -27, 82, -27, -76, 18, -33, 11, -44, -20, 13, 43, 9, 13, 46, 91, 25, 9, -41, -18, 4, -16, -5, 34, -50, -12, 47, -30, 16, -25, -9, 3, 30, -41, -51, 4, -28, -10, +67, 5, 54, -24, 25, -13, -17, 89, 9, -26, -29, 5, 14, 17, 6, -37, 11, 37, 8, 9, -19, -15, 2, -34, 0, 28, 0, -27, 3, -39, 5, -11, -10, -11, 11, 71, 20, -27, 10, -17, -25, 37, -41, 32, -5, -13, -18, -50, -5, 5, 50, -33, -64, 99, 23, 37, -12, 1, -43, 5, -45, 31, -35, 69, -58, -41, -12, 46, 29, -20, -41, -21, -35, 49, -24, 37, 20, -25, 2, -52, -12, +19, 31, -24, 7, 12, -9, 9, 39, -7, -6, -30, -15, 20, -3, -29, -25, -24, 47, 26, 21, -1, -32, -33, -38, 21, -52, 41, 6, -28, -20, -24, -11, -31, 31, 3, 46, -6, -43, -8, 42, -12, 5, -24, -5, 4, -22, -49, -20, -16, -9, 13, 4, -58, -8, -19, -10, -15, -56, 90, 8, -13, -39, -1, -37, 12, 64, -1, -27, 29, -13, -2, 21, -29, -52, -14, 27, -4, -31, -13, -47, -20, +-3, 50, 11, -1, -16, -31, -43, 71, -17, 54, 24, -21, -39, -2, -47, -20, 41, -33, 12, 29, -41, 31, -1, -27, -5, -35, 21, 73, -26, -31, -50, 47, 23, 22, 14, -2, -13, -34, -29, -5, -40, 48, 3, 23, -2, -12, -26, -26, 82, -20, -20, 11, 10, 37, 7, -23, -15, 7, -3, 29, -7, 52, -17, -28, 127, 51, 30, 11, 82, -4, -50, -15, -11, 33, 19, -15, -10, 28, -49, -18, -29, +28, -12, -29, -70, 16, -47, -17, -25, -34, 6, 17, 11, 28, -31, -22, 55, 33, -38, -9, -25, 12, -31, -19, 5, -6, 3, -53, -33, 17, -4, -4, -38, 67, -55, 8, 23, 43, -41, -19, 51, 89, -33, 8, 27, -34, -7, 24, -21, -18, -21, -24, 10, 127, -26, -2, -26, 36, -47, 42, -30, -12, -8, -31, 5, -69, -11, 87, 5, 95, -34, 39, -19, -46, -54, 26, -57, -19, -41, -22, 23, -7, +34, -31, 46, 36, 11, -45, 5, -34, -6, 14, -2, -48, 68, 22, -14, -13, -30, 18, -31, -18, -23, 1, 5, 58, -17, 25, 10, -16, -5, 33, -32, -19, -53, 56, 25, 12, 19, -54, 25, -15, -9, 31, 15, 4, 90, 44, -27, -16, -9, -19, 1, -14, 5, 20, -29, -9, 13, -25, 5, 10, 55, 31, 22, -32, -20, 76, -25, -18, -20, -44, 62, -64, 12, 80, 29, 19, 26, 18, -30, -36, -62, +77, 7, -17, -19, 2, 63, -4, -44, 2, -53, -11, 61, 19, 10, -21, 1, 8, 4, 52, 6, -71, 9, -31, -52, 66, 23, 78, 11, 3, -19, 17, -43, 104, 16, -34, -3, -1, 40, -13, 10, 2, -5, -42, -6, 1, 22, -14, -20, 4, 32, -13, 10, 9, 29, -27, 23, -38, 1, 2, 76, 17, -38, -4, -14, 0, -15, -2, 1, 40, -36, -9, -1, -48, -16, -4, -37, -28, 1, -2, 49, 23, +42, 15, 42, -10, 25, 30, 6, 6, -20, 23, -5, -9, -44, 39, -14, 43, -10, -10, -26, 6, -38, -27, -48, -26, -73, 23, -27, 3, 28, -26, -4, 127, 10, 23, -13, -15, 56, 7, -16, 6, -17, 6, 19, 11, -25, -23, -35, -8, -38, -44, 29, -31, -11, 13, -3, 18, -18, -4, 18, -5, 65, -30, 5, -32, 110, 66, -9, -38, 27, -3, -63, -31, 15, -2, -18, -44, 12, 52, 16, -15, 0, +-31, 22, 0, -41, 10, -12, 7, -42, 31, -14, -17, 85, -34, 17, -56, 127, 7, -61, -7, 20, 12, -21, -52, -23, 3, -39, -22, -5, 53, 18, -9, 21, -20, 20, 48, 18, -1, 22, 29, -35, 8, -37, -18, 18, -37, 27, -25, 126, 20, -60, -27, 31, -17, -33, -51, -3, -15, -9, -39, 0, -13, -27, 23, 9, -26, 3, 26, -45, -3, 38, 51, 12, 19, 40, -10, 109, -37, -32, -14, 127, -64, +57, 8, 47, -15, -63, -12, -21, -1, 19, -9, -41, 4, 57, -8, -13, 8, 21, -19, 10, -10, 88, 32, -49, -51, -9, -22, 77, -22, 40, -60, 127, 12, -13, -16, 23, -7, -22, -38, 0, 4, -54, -74, 0, 73, 24, 42, 22, -24, 39, 10, -23, -29, -9, 14, -50, 9, 2, -18, 127, -26, 18, 12, 126, 9, -34, -8, 10, -18, -44, -39, 49, -2, -20, -6, 16, -10, 74, -7, 9, -11, -15, +-19, -20, -18, 3, 14, -19, 9, -12, -14, -37, -30, -28, -17, 92, -9, -18, -36, 96, -12, 4, 32, 22, 6, 14, -42, -51, -27, -3, -1, 6, 59, 18, 46, -4, 27, 2, -35, -53, 14, -22, -7, -35, -18, 6, -32, 44, 7, -9, -7, -45, -2, 18, -47, -29, -23, -35, -23, 30, -19, -40, 44, 25, 23, 71, -1, -48, 51, -40, 14, 13, -1, 46, -9, -40, -5, 45, -27, 20, 15, 8, 27, +-24, 44, -20, -31, -14, 78, -42, 6, 14, -5, -10, 17, -65, 64, -21, 3, -37, -48, 14, -11, 36, -11, 50, 9, -28, -44, 1, -30, 50, -34, -11, -7, 0, 25, -28, -37, -49, 16, -25, 32, 61, 39, -55, 40, -10, 10, 57, -21, -17, 77, -63, -1, -16, -10, -13, 6, -62, -38, 14, -3, 34, -9, 33, 31, -97, 18, -13, -8, 32, 100, -22, -12, 101, -29, 22, -13, -4, 50, -44, 35, 10, +-24, -32, -15, 6, -18, -47, -24, -25, -21, 24, -60, 63, -24, -5, -11, -114, 46, -8, 38, -42, 6, -9, 17, -25, -34, 97, 5, 34, -27, 52, 1, -38, 76, -22, -48, -12, 3, -32, 2, -43, -35, 40, -17, 91, -66, 25, -35, -76, 24, 29, 33, -35, 44, 8, -1, -29, -124, 83, -25, 33, 0, 38, 13, -42, 95, 21, -20, -41, -5, -27, -9, 3, 72, 127, -27, 0, 16, -34, -13, -35, 32, +21, -3, 0, 18, -2, -17, 19, -16, -22, 8, -34, 7, -5, -37, -25, -20, 9, 46, 50, 2, -9, -27, -21, 60, 89, 8, 10, -30, 41, 4, -31, 41, 25, 14, -14, 3, 24, -29, -6, 51, -28, 2, -20, -57, 0, 77, -7, 0, -27, 52, 43, -21, 2, -13, -26, 8, 80, -32, -3, -24, -30, -28, 16, -11, 37, 14, 43, 58, 68, -2, -1, -9, -8, -16, -34, -24, -29, 10, 13, 52, 37, +0, 3, -14, -1, -59, -29, 19, 54, 22, -38, 19, 33, 31, 10, 21, 1, -5, 13, -33, -27, 19, -33, -54, -10, 2, -20, -66, 7, -1, -4, -2, 12, -44, -3, -30, -5, 7, 9, 47, 54, 8, -23, -21, 106, -11, -25, 10, -30, -25, -32, -4, -44, 25, -20, -37, 22, 7, -4, 18, 35, -5, -1, 3, -37, -76, 29, -10, -35, -20, -2, 28, 17, 22, -24, -9, 114, 44, 10, 5, 0, 2, +-12, -6, -16, 2, -10, 3, 26, 7, 4, 11, 49, -16, -11, 14, -20, -31, 10, 11, -9, -33, -6, 53, 32, -11, -40, 41, -53, -62, -15, -40, 0, 14, -38, -6, 9, 18, 36, 13, 86, -8, -32, -21, -17, -17, -14, 19, 124, -48, 106, 41, 19, -23, -33, 20, 59, -15, -3, -22, 17, -35, -14, -15, -14, 23, -48, -1, -26, 57, -21, -16, 1, -23, 29, -4, 26, 36, -15, -17, -36, -34, 40, +-23, -27, -4, -11, 12, 28, -20, -8, 6, 8, 5, -5, -14, -12, 11, -33, -7, -8, 8, 20, 8, 7, 23, 29, -37, -11, -20, -10, 8, -30, -39, 35, 43, 4, -5, -9, -4, 30, 29, -6, 8, 0, -5, 21, -37, 91, 50, -15, -16, 1, -13, -26, 13, 14, -35, 36, -58, 12, -73, -14, -3, 0, -4, 85, 49, -39, 17, -33, -28, 2, -24, 0, 7, 7, -26, -31, -29, -14, -53, 63, 4, +87, -18, -12, -4, -11, -47, 31, -25, -7, -5, 44, 16, -26, -29, -43, 58, -1, -8, -42, 26, -19, 24, -25, -12, -25, -11, -44, -41, -59, -18, -7, -33, 36, -47, -9, -32, -10, 0, 10, 4, -48, 1, 74, -8, -21, 34, 81, 13, -3, 17, -5, 72, -45, -13, -30, -7, -26, -11, -16, -30, 4, -18, 6, -3, -23, -11, -10, -28, 4, 26, -27, 35, 12, 2, 66, -53, -19, 80, 17, 42, 6, +22, -6, 29, -52, 41, -49, -9, -17, 17, -33, 60, 44, -39, 26, -20, 19, -45, 3, -24, -4, 11, -30, 31, 34, -28, 127, -9, -34, -5, 89, 23, 42, -26, -60, -15, -73, 37, 1, -21, -23, -16, -46, 21, 82, -33, -27, -24, 92, -11, -85, -26, 41, 1, -20, -29, -8, 15, 50, -45, 0, -16, -12, -18, -11, -41, -38, -30, -60, 35, -12, -42, -37, -30, 2, -18, 30, 0, -16, -66, 99, -48, +-84, -26, 19, 13, -2, -42, -32, 31, 42, -67, -39, -22, 42, -21, -39, -42, -14, 2, -25, 22, 10, -25, -11, -34, 3, -16, -30, -15, -58, 34, -16, 1, -31, -32, 2, -49, 18, -41, -5, 25, 22, 3, -6, 127, 0, -2, -31, 31, -56, -14, -12, -34, 46, -26, -24, 38, -80, 2, -44, 42, -7, -31, -29, 28, -37, -11, -14, -18, -20, 16, 20, 44, -14, 48, -4, 108, 8, -8, 27, -12, -4, +6, 26, 85, 17, -50, 24, -10, 10, -37, -32, -2, -35, -84, 15, -52, 32, 20, 11, -32, -9, 11, -27, 24, -7, 16, -31, 40, -5, 8, -6, -37, 50, -18, 0, 78, 78, -27, -25, -17, 15, -16, 35, 0, 30, -33, -18, -34, -46, 22, -35, 4, 8, 25, -22, 5, -7, 15, 53, -8, 30, -65, 23, 95, -8, 49, -11, 11, 66, -17, -1, -13, 7, -10, 86, 2, -13, -3, 35, -16, -10, 32, +9, -20, 33, 38, -46, -1, -21, -13, 41, -20, -26, 20, -7, 43, -30, -10, 3, 22, 65, -34, -11, -11, 17, -44, 26, 53, 13, 12, 28, -16, -23, 19, -2, -3, 60, 10, -24, -15, -43, 16, 38, 33, -37, -2, -11, -18, 63, 1, 84, 42, 37, -30, 12, -20, -20, -41, -8, 10, 10, -14, 10, -15, 8, -14, -5, -23, 19, 42, -26, 34, -15, -6, 68, 14, -9, -85, -32, 15, -21, -12, 4, +58, 61, 48, 0, -14, 26, -27, 5, -37, -13, -4, 28, -7, -32, -10, 11, -11, 43, 16, -31, 45, -37, 29, 23, 9, 60, -50, 18, 55, -2, -17, -30, -42, 23, 16, -26, -16, 4, -19, -17, -49, 31, -6, 23, 27, -34, 9, -14, 1, 63, -23, -23, 12, -13, 11, 57, 18, 18, -52, 2, -58, 58, -12, 21, 0, 118, -9, -34, 36, -25, -9, 54, -15, 5, 22, -1, -24, -43, -35, -35, -18, +-10, -19, -30, -28, -27, -16, 20, 2, -2, -50, -2, 53, 14, -45, 58, -83, -43, -46, 85, -10, -15, 1, -5, -61, 2, -70, 0, -51, -38, -9, -54, -10, -14, 62, -25, 40, 12, 56, 10, 27, 29, 9, 77, -27, 39, -46, 34, -32, -18, 10, 37, 127, -7, -13, -41, -42, 64, -47, 27, 14, -39, 64, 22, -23, -7, 39, -13, 13, 19, 45, 62, 17, -2, -2, 121, -63, 11, -26, 25, 11, -3, +24, 40, 88, -18, -4, -32, -59, 21, -43, -12, 44, -31, 58, 4, -19, -15, 20, 7, 14, 1, 58, 44, 1, -8, -32, 127, -66, 55, 9, -10, 19, -2, -62, 49, 81, 10, 13, -14, 11, 88, -54, -23, 25, -37, 35, 26, -52, 1, 25, -5, -21, -23, 44, 42, 4, -26, -63, 127, -18, -18, 20, 9, 17, -12, 9, 66, 42, -11, 13, 43, 20, 53, 39, -37, -34, -51, 3, -20, 88, -44, 79, +11, 32, 16, 17, 32, 18, 35, -6, 77, -53, 16, 8, 11, -31, 0, -40, 117, 29, -55, -9, -13, 4, 127, 58, -42, 33, -37, 9, -17, 58, 39, 52, 24, 24, -24, 65, 58, 54, 33, 15, 95, -37, 2, -19, 14, 5, 66, 12, 80, 25, -15, 27, 32, -7, 116, 85, -8, 19, -18, -15, -38, -17, 28, 62, 80, -22, 27, 74, 46, -13, 34, 4, 125, -25, -43, -33, -20, -7, 6, -42, -54, +38, 23, -7, 14, 24, 7, -25, -19, -11, -25, -26, -15, 5, 29, 23, -21, 54, -20, 50, 24, 32, -51, 23, 69, -10, -2, 3, 25, -11, -35, -17, 41, 6, -41, -11, 21, -39, 55, -59, -14, 48, -16, -20, 63, -26, 12, 41, 1, 60, -11, 72, 63, 87, -40, -20, 105, 24, 6, 18, 27, 40, -7, -14, -24, 15, -5, -30, 34, 7, 117, 17, -17, -37, 3, 39, 98, 18, -11, 59, 13, 72, +-1, 35, 99, 104, -60, -24, 62, -26, -9, 4, 7, 17, 22, -71, -10, -2, -29, 7, 6, 59, 99, 20, 2, -23, -9, 3, 32, 3, -17, 34, -13, 44, -31, 39, 54, 96, -56, -31, 47, -20, -18, -82, -8, -12, -7, 0, 5, -11, -31, 6, 50, 8, 22, -20, -10, 26, 120, -12, 38, -3, -25, 31, -11, -9, 3, -17, 34, 106, 72, -50, 4, 89, -6, -64, 35, -8, 62, -66, 50, -49, -16, +43, 21, 18, 8, -1, -48, -32, 5, 6, -36, 11, 101, 62, 7, -15, 55, 40, 57, 51, 60, 8, 127, 42, 1, 50, -35, 34, 61, -45, -40, -14, -27, -7, 30, 15, 85, -47, -21, 46, -30, -29, -35, -18, -9, -42, -5, -9, -11, 51, -23, 41, -23, 21, 4, 9, -7, 16, -21, 42, -25, -1, -1, 31, 38, 15, -6, 5, 4, 31, 4, -16, -18, 11, 6, 3, -2, 3, -15, 13, -5, -11, +-18, -11, -2, -9, 13, -6, 34, -42, -32, -36, -40, 12, -5, 127, 39, -11, -31, -31, -7, 12, 21, 65, -52, 20, -33, 19, -34, 7, -55, 46, 24, -38, -60, -11, -1, -49, -19, -42, 25, 43, 12, 58, -15, -83, -23, -18, 56, -1, -5, -6, -24, -14, -37, -45, -9, 56, 48, -45, 8, -43, 11, 4, -28, -28, -27, 1, 108, -33, 19, -27, 21, 71, 14, 37, -19, 20, 0, -15, 0, -17, -20, +20, -1, -44, -15, -31, 34, -5, -14, -16, -6, -9, 39, 53, -50, -21, -3, 23, 78, 11, -2, -43, -13, 73, 0, 2, 15, -17, 12, -8, 38, 28, -1, 13, 29, -16, -16, 34, -36, 12, -13, -21, 25, -28, 37, 5, -11, -5, -15, -23, 23, -18, -10, -19, -27, 111, -46, -20, 40, 23, -18, 6, 22, 17, -9, 14, 48, -21, -30, 20, -8, 30, -35, -34, 8, -36, 49, -17, -25, 5, -15, -24, +-1, -46, 17, -38, -15, 63, -17, -25, 71, 6, -10, 2, 54, -76, 21, 9, 44, -58, -12, -21, 30, 29, -19, -53, 24, -36, 60, 16, -15, -8, -61, 6, 24, -29, -9, 33, 29, 113, -59, -73, -6, -50, -23, 18, 50, 22, -9, -52, 56, -41, -43, 23, 6, 19, -13, -51, -25, -59, 1, -45, -16, -21, -20, -40, 59, -30, 0, -30, 14, 69, -18, -36, -34, -12, -15, 56, 8, -21, -17, -28, 31, +-92, 22, 8, 18, -5, 49, -50, -9, -52, -18, -42, -59, -45, 22, -33, 4, -2, -32, -5, 1, -19, 4, 12, 66, 48, -25, -13, 32, 35, 36, -10, 88, -42, 5, 10, 39, 59, 8, 22, 23, -25, -25, 11, -43, 25, 18, -3, 17, -5, -51, -18, 33, 2, -20, -48, 18, -40, -39, -1, 50, -10, -34, -6, 127, -47, 13, -13, 58, 57, -24, -38, -9, -37, -38, 30, -5, 74, 30, -20, 94, -65, +-48, -3, 39, -50, 36, -33, 96, -27, 15, 15, 91, 43, -24, -82, 127, -75, 75, -51, 112, 19, -26, 0, 58, -64, -72, 49, 29, 53, -46, 14, 100, -75, -54, 81, 34, -16, -5, 18, 29, -16, 15, 23, 90, 35, -21, -1, 95, -63, 57, -52, 53, 12, -32, -6, 22, -34, -56, -12, -34, 13, -11, 6, 62, -34, -43, 11, 12, 35, 79, -12, -28, -23, -59, -16, -17, 34, -8, -17, 0, 0, 28, +-27, 55, 55, 1, 59, -15, -22, -22, -14, -13, -29, -7, 108, 27, 1, 20, -55, -5, -2, -15, 43, -18, -85, -43, 13, -28, -30, 1, -7, 99, -66, -15, 37, 12, 20, 39, 31, 9, -47, -23, 21, -6, -23, 17, -39, 15, -46, -17, -11, -2, 52, 52, -51, -35, 41, 33, 1, 78, 66, -7, 102, 116, -76, -12, 56, 28, 12, 44, 15, -62, 8, 8, -20, -35, 32, -64, 31, -32, -37, 18, -16, +-7, -21, 14, -29, 10, 3, 17, -25, 93, -6, 13, -12, -6, -41, -9, 6, 70, -11, -14, 44, -3, -7, -20, -1, -15, 69, -23, -1, 3, -13, 9, 13, -13, -49, -26, -33, 19, 53, 10, -37, 56, 47, 26, 24, 19, -12, -44, 33, 63, -25, 38, 1, -11, 25, 30, 18, -11, 43, -25, 9, 25, 11, 35, -28, 64, -29, 9, 34, 25, 23, -48, -19, 13, -29, 25, 2, -21, -23, 32, -25, 49, +-35, -14, -17, 61, 6, -2, 53, 39, 36, -11, -16, -32, -54, -50, -60, 126, -14, 16, 2, 33, -8, 1, 50, 37, -29, 44, 12, 55, -55, 6, -12, -21, -25, -45, -25, 63, -26, -29, 14, 23, -24, 31, -8, -18, -11, -41, -31, 45, 3, 52, -18, -9, 15, 24, 45, 67, 18, 4, 2, 11, -11, 32, -27, -20, -32, -42, -19, -29, -28, 13, 27, -3, 16, 27, 15, -29, 20, -23, -7, 12, -22, +67, -7, -2, 25, -21, 34, 108, 52, 16, 24, 58, 14, 33, -35, 18, -15, -62, 19, -21, -11, -6, 40, 11, 34, 23, -11, 5, 8, -38, 19, 43, -2, -40, -7, -13, 13, -36, 17, 2, -10, 31, -31, 31, 37, 8, -37, -19, -13, -42, 81, 71, -21, 29, -54, -39, 16, 5, 18, -7, -22, -20, 50, 22, 79, -19, 12, 20, 31, 0, 43, 23, -82, 60, -20, 78, 35, 39, -54, 11, 3, -34, +37, -32, -3, 43, -54, -58, 76, -42, -22, -50, -71, 38, -36, -20, 67, 2, 46, -4, 56, -24, 24, 17, -69, 55, -39, 99, 43, 50, -43, -24, 8, 39, 127, 51, -47, 10, 46, 43, 48, -21, 30, -84, -42, -20, -48, -8, -10, -36, -19, 40, 58, -32, 16, -8, -10, 40, 26, -8, -38, -32, -69, 45, -8, -53, 1, -64, 13, 31, -59, -44, -24, -28, -28, -40, -24, 10, -47, 50, -1, -75, -40, +63, 42, -23, 74, -78, -14, 3, 10, 41, -25, 10, -65, -16, 7, -16, 22, 0, 12, -19, -43, -60, -26, -31, -17, -37, -1, -17, -20, 11, -29, -10, 11, -8, 12, 0, -23, -57, -23, 93, -8, -24, 8, 15, -16, -16, -41, -68, 92, 33, 27, 14, -13, -28, -13, 19, -39, -41, -83, -4, 33, -6, -28, -3, 22, 5, 47, -43, -23, -31, -35, 13, -35, -5, 5, 8, 3, -30, -7, -11, 86, -27, +2, 3, 55, 1, -19, -15, -28, 31, -27, -10, 21, 16, 0, -40, -20, -17, -23, -64, 2, 11, 125, -14, 38, -44, 13, 37, -60, -40, 17, 28, -6, -56, 35, 26, -8, -34, 19, -32, -30, 23, 9, -1, 13, 77, -6, -12, 6, -32, 100, -30, 65, 3, -44, -16, -53, 18, -18, 34, -23, -17, -56, 48, -38, 126, -8, 3, 92, 43, -19, -2, -5, -46, 56, 29, -27, -7, 10, -26, 30, 1, 103, +-18, -35, -43, -11, -22, -2, 47, 24, -9, -29, 28, 4, 32, 111, 33, -21, -46, 38, -23, 17, -52, -24, 27, -20, 25, 21, 0, 12, 6, 40, 38, 28, -7, 11, -10, -45, 21, 5, 46, 0, -10, 3, 3, -4, -21, 5, 24, -4, -10, -22, -11, -9, -6, -11, -14, -17, 23, 10, -17, -22, 13, 64, 46, 27, 40, -11, 65, -58, 25, 2, -8, -3, -15, -28, 9, -33, -8, -15, -14, 49, -29, +19, 75, -32, -43, -42, -37, -21, -27, 2, -26, -46, 39, -32, -6, -9, 25, 11, -78, -74, -43, -7, -47, 17, -13, 41, 83, 47, -33, 22, 69, 26, -19, 82, 36, 23, 27, 2, -8, -5, 8, 40, 12, 40, 56, -32, -19, -57, 58, 14, -72, 66, -38, 39, -64, -32, -52, -7, 5, 3, -52, 44, 45, 76, -16, 64, -15, 46, -9, 37, 41, 1, 7, -63, -26, 30, 31, -51, -46, 3, 54, 15, +-24, 20, -41, 38, -31, 15, 20, 38, 31, 38, -31, 24, 25, 61, -13, 75, 17, 4, -16, 27, 13, -6, 18, -30, 4, 16, 29, -33, -47, -33, 41, 41, -25, 90, -11, 53, -27, 8, -1, 4, 50, 38, -39, -1, -50, 88, -8, 72, 57, 34, -31, 25, 17, -10, 24, -38, -43, -40, -30, -31, -43, -9, -60, -5, -9, -40, -52, -22, -41, -25, -29, -10, 36, 52, 8, 10, -39, 64, 0, 7, -9, +59, -4, 28, -5, -11, -27, -40, -3, -30, -30, 19, 24, -36, 43, 77, 0, -19, -57, 38, -4, 14, 24, 40, 29, 59, 125, -9, -71, 85, -7, 15, 59, 15, -64, 59, -56, 16, 31, -54, -54, -48, 37, 39, -9, -37, -22, 40, 17, -6, -74, 43, -23, 74, -47, -33, 19, 15, -26, 5, 51, 115, -52, 57, -1, -14, -73, 94, -53, -2, -19, -47, -26, 5, -44, -3, 35, -40, 74, 24, -23, 19, +-50, 14, 13, 10, 21, 37, 9, 25, 127, -8, -28, -15, 24, 7, 11, -7, 13, 77, -27, -11, 24, 12, -28, -30, -7, -9, 42, -64, 91, 24, -31, -72, -64, 54, 9, 34, -23, -49, 60, -7, -20, 47, -37, 46, 10, 69, 30, 27, 58, 64, 19, -43, 23, -4, -11, -13, -57, 13, -3, -61, 77, -40, -39, -56, -74, -29, 25, -31, -14, -37, 6, -8, -25, 31, 17, 57, 48, 64, 23, 80, 9, +113, -1, -17, -50, -36, -17, 20, -15, 127, -45, -34, 35, -47, 18, -44, -51, -41, 49, 2, -9, -20, 19, 1, -19, 33, 12, 38, 16, 37, 18, 81, 10, 59, -26, -38, -25, -35, 56, -37, 30, -32, 20, 30, 26, 46, -54, -15, -20, -16, 13, -44, -97, 1, 73, 54, -14, 10, -29, 1, -38, -17, 3, -25, 8, 60, -50, -15, -28, -17, 47, -16, 47, -17, -55, -6, -59, 54, 39, -3, -37, -4, +-12, -23, -51, -21, 71, 17, -49, -24, 60, 22, -27, -39, -6, -11, -3, 28, -9, 14, -27, -58, 80, 14, 29, 41, 16, -32, -68, -33, 56, -60, -46, 33, -16, -27, 65, -67, 25, -23, 2, -59, -93, 7, -56, -5, 29, 85, -26, -17, 25, 35, -34, 16, 20, 22, -8, 17, 21, -5, 5, -9, -11, -20, -18, 5, -37, -6, -9, 15, -29, 1, 127, 3, 31, 0, 8, -21, -16, 44, 18, 23, 15, +-3, -30, -20, -30, -7, -18, -56, -18, -13, 40, 54, -43, -15, -3, -21, -34, -25, 3, -38, 5, -21, -43, -41, 9, 0, -36, -1, -16, 77, -1, 63, 57, -55, -43, 17, -14, 0, 44, -17, 34, -40, 75, -17, -34, -13, -28, -21, 11, -9, -37, -14, 6, -19, -1, 1, 85, 29, 68, 5, -53, -12, 26, 84, -4, -19, 12, 5, 0, 81, 60, 37, 55, -25, 27, -45, -19, -20, -34, -12, 8, -9, +-46, -57, 35, -73, 14, -10, 41, 39, 112, -74, -16, -2, -9, 60, 15, -41, 29, 17, 0, 38, 8, 41, 12, -38, 22, 9, 9, -21, -59, -11, -10, -2, -25, -42, -3, -16, 1, -29, 16, 16, -37, -27, 0, -6, -23, 42, 6, -23, 29, 32, -6, 25, 23, 21, 19, 2, 48, 5, 25, -15, -62, 3, 9, 16, -36, -44, 12, 9, 4, -40, 13, -13, -64, -44, 5, 10, -38, 29, -28, -9, 37, +-20, 25, -35, 0, 41, -4, -33, 11, -14, -50, -21, -41, 26, 7, -14, -12, -19, -14, -54, 29, -11, 21, -2, -1, 12, 6, 39, -9, 94, -29, 31, 41, -17, 46, -39, -14, 7, -6, -72, 43, -12, -67, 29, -57, 57, 19, -53, -43, -44, -5, -33, -12, -34, 39, -34, -8, 13, -60, -5, 7, 95, 24, 0, 46, -42, 37, -5, 38, -47, -24, -55, 52, -25, -16, 10, 12, 35, 30, -47, -17, 0, +-4, -12, 65, -23, 16, -6, 33, 3, -37, -4, -1, 84, -20, 16, 65, 14, 7, -3, 27, -11, -15, -23, 9, 4, -37, -22, -11, -23, -14, 17, 18, 31, 12, 17, 0, -52, 8, 14, -42, -6, -19, 9, 2, 53, -20, 39, 31, 11, 16, -50, 30, -29, 4, -24, 89, -43, -21, -37, -5, -29, 66, -8, -23, -12, -8, 88, -6, -18, 1, 20, -4, -39, -45, 8, -29, 8, -7, -21, 2, -3, -15, +-1, -3, 4, 6, -42, 68, -51, 50, 5, -6, -44, 76, 5, -6, -27, -77, 13, 49, -54, 2, -10, 12, -77, -50, -11, 9, 9, -63, 65, -38, -4, -14, -2, 32, -3, 4, -12, 38, -7, 30, -11, 4, -18, 82, -21, 22, 59, -48, -3, 34, -38, -8, 14, -15, -60, 5, -16, 15, 11, -7, 1, -5, -34, -32, -4, 66, -40, -19, -29, 105, -67, 40, -43, -9, -43, -29, 127, -6, -34, 37, -6, +-12, -25, 47, -35, -3, -13, 42, -16, 1, 12, 87, 10, 55, 21, 66, -23, 18, 28, 24, -33, 16, 9, -1, -15, 6, -17, 72, -12, -46, 34, 29, -27, 24, 0, 26, 12, -57, -44, 23, -32, 2, 39, -50, -46, 62, 45, -26, 27, -31, -29, -54, 10, -46, 25, 98, -9, -18, -13, -6, -9, -28, 44, -4, 49, 71, -8, -71, 72, -61, 16, 5, 10, -47, 48, -21, -26, -3, -32, 16, 53, -21, +0, -17, -10, -8, -7, 29, -5, 31, 7, -4, 5, -15, -11, 1, 7, 43, 12, -30, -15, 7, -5, -6, 6, -5, 9, -7, 10, 8, -17, 36, 32, 46, 1, -3, 14, 7, -24, 38, -2, -10, 32, -18, -15, -37, -7, -23, 69, 55, -32, -7, 14, -7, -52, 14, 46, -6, -37, -33, 48, -11, 57, -3, -15, -7, 24, -15, -24, -5, 21, -54, -9, -7, 100, 33, 2, -56, -47, -13, -23, 30, -31, +-5, -48, 10, -24, -10, 6, 36, -19, -19, -24, -48, -3, 2, -9, -31, 82, -75, -23, -44, -33, -29, 6, -4, 32, 43, -12, -33, -31, -23, -74, -42, 58, 39, -66, 31, -39, 5, -79, 1, 17, -35, -35, -39, 14, -24, -13, 8, 49, -22, -7, -18, -21, -30, 6, -6, -4, 84, -29, -30, -23, -36, -21, -15, 58, 11, -39, -19, -39, -35, -51, -50, -9, -13, -3, -6, 16, -35, -28, -14, 69, -6, +-13, -44, -30, -40, -16, 39, -10, 95, -3, -30, -18, -20, 19, -20, 51, 16, -58, -54, -32, -13, -36, -62, -15, -13, 22, 43, 27, 27, 7, 38, 58, -41, -26, -25, -1, 11, -2, 127, -10, 8, -41, -36, -27, 25, 17, -34, 28, -69, -27, 0, -26, -37, -39, -17, -29, -38, -16, -25, 11, -74, -21, 8, 77, -7, -28, -26, -10, 8, -5, 113, -57, 11, -10, -16, -31, -25, 32, -38, 38, -28, 7, +-21, -57, -35, -36, -37, 25, -41, 18, -67, -37, -52, -54, -38, 47, -23, -13, 3, 59, 65, 35, 114, -9, 49, 2, -34, -35, 8, -5, 2, 28, -13, -28, -29, -19, -52, -22, -18, 5, -37, -46, 80, -2, -12, -7, 6, -30, -22, -18, -20, 17, -20, 27, 89, -7, -24, 34, -9, -8, -14, 38, -36, -6, -17, 19, -27, -18, -21, -8, 23, -15, 0, 18, -32, -26, -39, -38, -30, 93, 6, -20, -24, +-20, -27, 59, -49, -37, -16, -16, -51, -34, 25, 49, 14, 31, -30, -44, -54, -33, -35, -18, -8, 19, -11, -23, -32, -63, -39, -62, 35, 104, -62, -27, -10, 4, -27, 1, -48, -48, -57, -60, -66, -45, -16, 35, -32, 96, -29, -28, -50, -68, -9, 32, 21, 27, -62, -17, -41, 55, -4, -32, 26, 82, -44, -24, 27, 27, 22, -1, -4, -14, 6, 0, -4, -13, 19, 0, -47, 40, 15, -12, -28, -19, +-22, 21, 12, 3, -32, -20, 56, 7, -11, -31, 18, 39, -32, -43, -32, -44, -74, 16, -1, -14, -12, -7, -6, -44, 5, 82, -18, 100, -69, -29, 62, 2, -26, -17, 54, -38, -27, 32, -48, -4, -60, -26, -58, 23, -21, -29, -7, 51, -4, 23, -40, -3, -17, 34, -34, -1, -4, 15, -40, -36, -48, -21, -20, -13, 15, 22, 32, -51, -11, -12, 30, -9, 60, -45, 11, 60, 24, 79, -4, -63, 2, +14, -112, 3, 39, -21, 12, 34, -27, -9, -13, 30, 56, 20, 2, 8, -68, 6, 49, 29, -50, -9, 127, -2, 17, -5, 33, -41, -13, -31, -18, 8, -16, 22, -27, 24, -55, -23, -8, -35, 6, -8, -9, 41, 3, 33, -12, -1, 26, -13, -43, 16, -27, -1, -10, 9, 87, -6, 16, -6, -2, -42, -11, -32, -42, 3, -34, 3, 6, -36, -9, -31, -15, -13, -39, 48, 12, 34, 0, -12, 25, 68, +-54, -12, 24, -43, -30, -2, -34, -13, -11, -6, -30, 40, -28, -20, 15, -18, -51, -18, -24, 22, -33, 3, -13, 2, 127, -14, 21, -33, 90, -28, 13, -55, 22, 7, 7, -57, -7, -45, 15, -17, -2, -14, -16, 57, -47, -36, -11, -35, -91, -60, -13, -11, -31, -57, -51, -34, 62, 6, 49, -50, 63, -22, -30, -21, -10, -46, -7, -40, 28, 27, -42, -36, -10, -1, -17, 16, -11, -23, 7, -45, -40, +-28, -26, -23, -32, -25, -31, -11, 75, 23, -26, -28, 29, 48, 0, -16, -39, -3, -4, -18, 32, -2, -33, -49, -30, -11, -4, 18, -49, -16, 9, 35, -34, -35, 11, -22, -49, -25, -22, 13, 52, 39, -12, 19, 14, 48, -7, -14, -48, 4, -4, -49, 1, 12, -14, 19, -21, -11, 0, -7, -15, -29, 7, -13, -16, -32, -67, 8, -51, -7, 7, -27, -63, -4, -46, 1, -21, -1, 43, -75, -21, 15, +13, 14, 10, 82, -38, -34, -11, -6, -27, 89, -43, -32, 15, -49, -8, -4, -18, 28, 8, -16, -3, 13, 4, -19, -22, -3, 0, -37, 7, 0, -42, -24, -13, -65, 20, 23, -38, -22, -16, 9, -17, 27, -29, -34, 31, 50, -20, -50, -34, -26, -41, -25, -35, 57, 7, -34, -8, 11, -10, -18, 12, -5, -16, -43, -43, -42, 12, 4, 10, -2, -9, -46, 21, 37, -38, -25, -12, 7, -25, -15, -11, +46, 66, -40, 19, -4, -16, 18, 41, 60, 27, 20, -4, -61, 6, 17, -16, -18, -3, 1, -69, -20, 59, -10, 24, 26, -25, -3, -2, -4, -46, -44, -37, 49, 3, -28, -63, 15, 9, -15, -33, 37, 18, 19, -24, 8, -51, -6, -4, -55, 3, -35, -35, -9, 85, -16, 23, -15, -6, -74, 41, -4, -54, 8, -26, 68, 34, -31, -41, 82, 9, -13, 3, 39, 8, -8, 3, -17, 60, -22, -37, -50, +-8, -29, 0, -23, 48, 33, 34, -23, 17, -50, 6, -22, -20, -20, 6, 20, 7, -27, -26, 45, 5, -14, 15, 46, 1, -3, 6, -48, 22, -22, 10, 2, -34, -15, -16, -22, -18, 53, -3, 93, -72, 20, -32, -13, 30, -50, -23, -35, -7, -52, -3, -8, 4, 49, 24, 0, -32, -56, 40, -15, 100, -42, -4, 35, 11, -59, -17, -39, -12, -21, -31, 22, -54, -28, -6, -17, -20, -22, -62, -5, -11, +-11, 7, -26, 25, 60, -4, -28, 14, -28, -31, -11, -50, 27, -40, -14, 33, 10, -80, -75, 60, -37, 126, -66, 81, -56, -94, 57, -40, -21, -35, 10, -16, 16, 46, 106, -38, 62, -18, 68, -14, 21, 11, -40, -68, -6, -4, -44, -37, -6, -21, -23, 32, -23, 32, 23, -32, -7, -21, 12, 21, 16, -4, 0, 5, -11, -21, 44, -45, -16, -24, 14, 3, -32, -41, -2, -6, -34, 36, 4, -13, 22, +-18, -51, 49, 9, 36, -56, -23, -19, -52, -30, -10, -8, -25, -64, -31, -15, 8, 57, -21, -16, -23, -19, 56, 14, -7, 4, -64, -23, 42, -37, -12, 49, -10, -25, 5, -49, 28, -27, -1, -14, -26, -5, -31, 25, -32, -2, 57, 11, -8, -11, 66, -27, 22, -24, 13, -33, -12, 7, 16, 20, 26, 61, -15, -23, 68, -45, -20, -3, 0, 0, -45, -29, -16, -9, 7, -37, -1, 28, -5, 7, -63, +3, 17, -49, 25, -5, -33, -9, -39, 16, 45, 9, -12, 53, 4, 3, 13, -22, -41, -5, 5, -17, -17, 1, -25, 1, 42, -22, -22, 12, 32, -30, -34, -10, -1, -20, -5, 4, -45, -19, -59, 9, 16, 8, -12, 59, -11, 72, 1, -37, -35, -16, -31, -34, -2, 9, -60, -9, 26, -8, -16, 45, 27, -1, -50, -12, -2, -14, 33, -5, -58, -24, -11, 10, 33, 18, 9, 38, -13, 37, 21, -30, +21, -12, -22, -14, -12, 1, -43, -23, 50, -2, -3, 12, 69, -44, 15, 2, 58, -69, 11, -55, -68, -13, -6, 11, -4, 3, 77, 76, -31, 50, 12, 3, 5, -32, -9, -37, -29, -5, -45, -17, 9, 66, -48, -31, 48, -9, -9, -9, 49, -53, -14, 10, 19, 4, -14, 19, -5, -16, 94, 111, 25, -11, 15, -19, 34, -45, -18, -53, -12, 15, -13, 29, 34, 24, -47, -9, 40, -34, -11, -8, 1, +-57, 7, -25, 3, -32, 53, -34, -1, -11, 77, 66, 19, -19, -18, -56, 25, 13, -51, -14, -35, -1, -8, -49, -4, -15, 4, 5, 15, -14, -15, -19, 48, -25, 60, -39, 17, -7, -25, 19, -21, 18, -25, 32, -11, 32, 4, -17, 49, 69, -6, -14, -31, -19, -30, -31, 23, -29, 1, 6, 73, -40, 11, -33, 100, -1, 31, -12, 20, -17, -32, -19, -15, -23, 63, 53, 20, 31, 37, -27, -29, 90, +-26, -21, -41, -25, -28, 4, -24, -7, -33, 23, 60, -51, -36, -52, 30, -46, 12, -40, 8, -24, 12, -44, 40, -7, 62, 62, 29, 59, -22, -19, -11, 60, -17, -38, 0, 43, -25, -21, 1, 2, -24, 6, 30, -21, -31, -40, 33, -29, -8, 11, 8, -10, -3, -27, -2, -7, 48, 1, 5, 36, -18, -23, 33, -53, 2, -35, -8, -38, -32, -21, -11, -14, -24, -33, 27, -43, -25, -21, 80, -28, -25, +-18, -29, -27, -16, 29, 4, 22, 34, 32, -15, -18, -22, -34, 100, 23, 12, -22, 19, -31, -21, 13, -28, 22, -10, 0, 15, -56, 35, -21, 57, -26, 55, -48, -29, 8, -24, -17, -6, 10, -35, 40, 17, -57, -27, 32, -65, -25, -27, -15, -6, 19, -43, 10, -4, 22, 60, 31, 16, 31, -52, 3, 46, 15, -10, 3, -5, -9, 106, -14, -35, 39, 76, -45, 41, 2, 18, -26, -35, -18, -7, -5, +-3, -7, -1, -30, 2, 22, 23, -21, 28, -23, 7, -30, 11, -20, 12, -20, 14, -14, -6, -2, -31, 0, 31, 13, -15, 10, -3, -15, -18, -12, -43, -5, -7, -20, 10, -26, 25, -1, -6, 16, 50, -26, -29, 6, -8, -29, 68, -26, -42, -37, 49, 19, -6, 0, 39, 26, -10, -65, -17, 10, -50, -55, -37, -19, 51, 42, -34, -4, -55, -13, -29, 79, 11, -13, -81, 4, -14, -22, 18, -8, 7, +55, 14, -44, -10, 20, -38, -12, 1, -31, -24, 68, 3, -31, 2, -20, 70, 28, -23, 20, 1, -9, -37, 63, 14, 36, -31, 7, -53, 6, 19, 17, 29, 63, -37, 31, -52, 11, -63, -3, -18, 7, 0, -29, 20, -54, -28, -24, 59, -7, 9, -20, 5, -13, -19, 31, -35, -59, -33, 13, -40, -20, -23, 3, -13, 61, -5, -41, -20, 39, -37, -2, -13, 12, -21, 62, -22, -57, 6, -28, 83, -2, +-5, 19, -28, -14, 7, -24, -20, 1, 22, 43, 27, 9, 4, -12, 6, -23, 28, -31, -26, -1, -5, 3, 46, 28, -38, -34, -14, 8, -11, 1, 2, 8, -28, -24, -3, 2, 18, 2, -22, 39, 10, 3, 72, 26, -23, -21, -54, 119, -21, -60, 1, 15, 23, -42, -30, -78, -1, -16, -10, -47, -22, 7, -44, 35, 29, 49, -2, -17, 16, 2, 4, 69, 3, 10, 13, -19, -32, -16, 38, 81, -35, +-37, -1, 22, -46, -26, 26, 73, -28, 0, 10, -37, -53, 6, -24, -13, -2, 24, 64, 11, 39, -3, -11, 127, -46, 14, -9, -5, -17, -30, 9, 75, -37, -41, -52, 36, 5, -39, -10, 10, 25, 14, -41, 38, -11, -9, 1, 73, 43, -13, 17, -13, 45, 5, 5, -11, 4, 5, 38, 12, -9, -15, -9, 58, -37, 36, -53, -25, 10, -19, 32, -12, -22, 39, -12, -45, -42, 4, -1, 22, -7, 27, +23, 17, 3, -29, 7, 33, -8, -25, 15, -25, 2, -38, 0, 83, -48, -31, -22, 7, 10, -32, 25, -33, -24, 11, -41, -36, -47, -6, -3, 34, 4, 14, 6, 1, -18, 10, 0, 24, -37, -4, -9, 13, -15, -39, 15, 62, 1, -35, -5, -1, -21, -41, -1, -30, -38, 6, -45, -19, -88, 20, -7, 70, 21, -54, 45, 22, -12, 58, 49, -25, -27, 4, -4, 0, -5, -16, -13, 50, 4, 6, -33, +4, 6, -39, 0, -46, -21, -6, -12, -41, -33, 18, -15, 50, -6, -4, 4, -9, 9, -15, 31, 10, -10, 16, -19, 4, -7, -20, -15, 48, -3, -9, -30, 8, -8, -22, -22, -41, 6, -18, 33, 8, -50, -59, 28, 29, -10, 48, 2, 33, 46, -2, -4, 31, -22, -17, 18, -29, -30, 58, -29, -44, -15, -30, 87, 22, 48, -45, 100, 58, 29, -48, 17, -56, -4, -21, 28, 41, -43, 23, -34, 16, +-41, -27, -67, -49, -15, 37, 22, 8, 29, 57, -21, -5, 11, 52, 29, -14, 92, 9, 127, -18, 40, -6, 59, -21, 30, 18, 32, 26, -8, 45, -40, -21, -13, -50, 10, -5, -5, -15, -85, -4, -14, 26, -3, -2, 13, 70, 59, 0, 0, 5, 60, -24, 20, 3, 77, -32, 28, 4, 59, -13, -23, 0, -46, -36, -31, -39, 23, -40, 52, 0, -69, -32, -19, 68, -33, -30, -10, 59, 77, -38, 11, +36, 45, -21, 20, -13, -10, -29, 16, -5, -21, -19, 17, 120, -1, -29, 53, -31, 36, -27, 22, -9, -43, -18, 18, 7, -36, 7, -39, 25, -29, -52, 19, -36, -51, -27, 13, -8, 5, -38, 24, -68, -29, -26, 4, 101, 21, -64, 58, -42, 18, -8, -10, -7, -85, -58, 37, 100, -11, 12, -72, 4, 8, -35, 58, -27, -44, 8, -2, 10, -41, 15, 0, 15, -43, -26, 3, 75, 34, -12, 61, -47, +14, 5, -22, -22, 83, -53, 56, 4, -60, 44, -22, -33, 39, -7, 1, -38, -40, -35, -8, 7, -17, -4, -16, -15, 3, -6, 41, 35, -22, 18, -3, -18, -22, -8, 63, -16, -13, -2, 50, -16, 6, -36, -21, -13, 30, 1, 22, -18, -16, 29, 38, 17, -40, 56, 114, -8, -29, 7, 19, -10, -5, 3, 6, -14, -14, -23, 26, 10, 2, 0, -2, 1, -42, 9, -30, -6, -16, 21, 13, -15, -2, +-4, -8, 0, 5, -35, 106, 18, 27, 8, 15, 14, -26, -14, -31, -25, -48, -11, 59, -5, 1, 22, -9, -28, 12, -22, -15, 15, -15, 47, 37, -34, 66, 21, 1, 30, 58, -8, 33, -20, 6, 43, 2, -10, 0, -3, -27, -13, 7, 16, -5, -13, -7, -26, -31, -12, -20, -10, -7, -11, -10, 21, 23, -13, 50, -10, -44, -11, 10, -27, 16, 22, 53, -6, 72, 74, 22, 15, 32, -11, -19, -32, +27, 21, -63, 11, -17, 12, -16, 1, -30, 62, 4, -32, 25, 18, 18, 21, -63, 23, -15, 14, 43, -42, 8, -14, 122, 68, -9, -1, -25, 57, -21, -3, -11, -40, -38, -14, 3, -1, -40, -28, -15, 46, -3, 10, 21, -32, -14, -7, -28, 5, -7, 16, 42, -31, 29, -22, 122, 66, -19, 13, -35, 11, -20, 2, -18, -34, -19, -15, 6, -22, -43, -11, -6, 26, -29, -8, 32, -29, -11, 20, -47, +-50, 31, 3, -17, 0, 39, -77, 127, 55, 12, -15, 46, 7, 2, -8, -1, -17, -29, 17, 15, 3, 20, 3, -50, 52, -12, -5, 28, 22, -16, -16, -40, -13, 10, 4, 3, -23, 24, -30, 76, 65, 26, 4, 38, 57, -11, 23, -25, -26, 6, 15, -21, 22, 19, -2, -38, 36, 4, 0, 26, -13, 1, -15, -3, -15, -48, -8, -48, -30, -48, 44, -71, 16, -32, 0, 23, 25, -14, 51, 19, 73, +-4, 6, -23, -28, 33, -30, -5, -48, -2, -3, 60, -8, 35, 7, -31, -14, -5, 18, 4, -16, -37, 31, 14, 14, -58, -30, 35, -53, -64, -17, 3, 42, -27, 22, 54, 25, 16, -44, 1, -10, 4, -9, 54, -9, -22, 40, -16, 13, 86, 54, -16, -4, -1, 13, -36, 43, 5, -13, -38, -37, -5, -15, -13, 41, -3, -9, 12, -4, -4, -12, 8, -29, -4, 49, 98, 11, -5, -28, 6, 67, 23, +37, -23, -37, -16, -15, -8, 17, 35, -17, -22, -16, 2, -14, -11, 80, 38, -21, -34, 3, 12, -35, -2, -1, -36, 58, 127, -23, -45, -15, 38, 2, -43, -37, 79, 42, 10, 48, 70, -22, 16, 22, 17, -20, -1, -19, 50, 0, 19, 77, -18, -16, 36, -57, -5, -12, 29, -9, -25, 25, -2, -7, -14, 45, -15, -78, 54, -15, 22, 49, 77, 59, 11, -11, -10, 16, -9, -1, -4, 24, 14, 49, +45, 0, 20, -95, -35, -21, 54, -46, -24, 84, -5, -1, -47, 11, 2, -18, 46, 6, 28, -34, 73, -37, 29, -1, 40, 19, -10, -6, 34, 7, -22, -28, 127, -8, 1, -5, -45, -25, 32, -2, -33, 47, 12, 22, 29, -21, -3, 18, 11, -30, 15, -19, 20, 22, -24, -17, -7, -4, 9, 25, -27, -5, -20, -10, 45, -21, -21, -12, -28, 29, -19, 5, -8, 8, -1, 26, -5, -41, -47, 19, 0, +-2, -29, -11, -46, 19, 87, -10, 21, -24, -16, -46, -16, 19, -52, -46, -59, 127, -16, -35, -25, 9, 17, -50, -2, 4, -2, 51, -1, -37, 23, 30, 10, 71, 73, 74, 14, 24, 33, 1, 26, -1, -5, -29, -44, -7, -32, 2, -17, -39, -24, 1, 0, -12, -3, -52, -76, -58, 4, 29, 25, 0, 5, 96, -10, 20, 41, 67, -33, 55, -9, 4, 32, -8, -8, -29, -15, -20, -9, 101, -38, -30, +-15, -10, -32, 11, 1, -58, -15, 2, -13, 17, -3, 2, 45, 62, 50, 0, 16, 39, 49, -78, -38, 13, -13, 11, -15, 8, -55, -15, -22, -15, 22, -4, -14, -31, 29, -14, -14, 14, -22, -5, -3, -37, -1, -9, 24, 127, 47, 123, 45, 62, 83, 1, 15, 4, 2, 9, 0, -12, -62, -28, 6, -34, 28, -45, 2, 33, -18, -10, -34, -27, 19, -43, -16, 31, -5, 22, 9, 127, 59, 88, 80, +49, 83, -16, -7, 4, -16, -7, -20, -30, 1, -34, 7, -11, 77, -14, 2, 24, -2, -20, -28, -16, 25, -48, -3, 41, -55, 53, 29, 122, 23, 68, 22, 44, 94, -58, -15, -27, 28, 1, 12, -30, -1, -20, -43, 56, 71, 4, -37, -7, 56, 13, -8, -18, -11, 1, -10, -9, -53, 11, -5, 127, 20, 63, 42, 38, 68, -22, -9, -22, -5, 20, 2, 3, -18, -23, -18, -4, 42, -40, -10, 37, +33, -30, -28, 2, 17, -43, 9, -4, -1, -11, 72, 75, 46, -6, -27, 15, 33, 25, 44, 13, 45, -33, 46, 11, 6, 1, 0, 29, 77, -18, -22, 33, -38, 92, -32, -34, 43, 32, -20, -1, -17, 113, 51, -9, 84, 37, -72, 52, 0, 16, 81, -7, 17, -12, 37, -45, 16, -25, 35, -49, 27, 17, 30, 28, -10, 65, -30, -14, 10, 9, 31, -45, -44, 5, -27, 0, 1, -1, -46, 29, -1, +7, -2, -28, -24, -15, 53, -39, -13, -3, 12, -18, 80, -26, 18, 38, 9, -1, -20, -13, -1, -26, -14, -40, -38, 6, -18, -1, -28, -2, -59, 27, -2, -14, 42, -24, -27, -31, 69, -34, 16, -16, -14, -15, 96, -9, -4, 31, 33, 65, -30, -18, 3, -50, -33, -69, 5, -6, -2, -46, 11, 26, 28, 42, -43, 26, -1, -31, 25, -36, -18, 4, -13, -15, -22, -6, 6, -40, 27, -49, -53, 77, +-7, 104, -14, -7, 18, 13, -59, -30, -27, -37, 8, 2, 29, 64, -29, -47, 15, -39, -60, -75, -26, 2, -5, -7, -34, -1, -31, -22, 58, -32, -54, 123, 32, 127, -22, -33, 14, -51, -23, -41, 30, -50, -13, 12, 4, 68, -22, -27, 5, -16, 7, -28, -23, -1, -23, -25, -29, 9, 17, -22, -33, -24, -49, 84, 28, 103, -44, -5, 11, -37, -16, 5, -15, 3, 6, -17, 67, -4, -30, -8, 33, +-9, -19, 27, -33, -12, 0, -5, -22, 18, 56, -17, -2, -28, -28, 11, 26, 17, 23, -42, 24, 41, -17, 26, -58, 8, -32, -28, 79, 4, -31, -30, -42, -20, 4, 6, 36, 21, 59, -19, -40, 35, 27, 30, -27, 2, 41, -3, -8, -40, 46, 7, 54, 20, -17, -3, -31, -25, 13, -17, 66, -25, -49, 9, -22, -26, -19, -6, 10, 23, 19, 15, -41, -30, 15, -51, 23, 15, 20, 127, 25, 26, +47, -2, -19, 9, 4, -15, 19, 32, -5, -14, 2, 2, -19, -41, -10, -26, -21, 23, -34, -2, 15, -15, -11, -19, 22, 9, 1, -16, -10, 72, 3, 9, 52, -58, 22, -13, -29, 34, -40, -42, 41, -45, 77, 5, -1, 18, -49, 0, -20, -35, -11, 7, -27, -1, 127, -1, 13, -29, 18, -42, -24, 61, -8, 59, -34, 18, -25, 46, 31, 34, -27, 23, 11, -67, 95, -28, 60, -13, 6, -10, 40, +-15, -22, 47, 28, -17, -12, -48, 53, -6, -13, -49, -42, 121, 20, -21, 39, 0, -53, 45, 26, 16, -26, 44, 20, 1, 71, 1, -6, -17, -7, -6, 25, -2, 22, 12, 23, -6, -26, -33, 63, 17, 5, -32, -32, 100, 2, 9, 56, -5, -19, 39, 30, 22, -6, 35, 30, -25, 29, -24, -12, 52, -5, -15, 36, -30, 5, -46, -3, 34, 76, -51, 39, 27, -25, -31, -54, 110, 29, 22, 11, -23, +-27, 21, 24, 14, -8, 15, 0, -19, 53, -38, -15, 13, -8, -25, 48, -20, 5, -2, 0, 19, 7, -40, 34, 6, -7, -27, -29, 100, 9, -16, 29, -27, -28, 15, 5, -39, 30, -26, -55, -18, 21, 14, -4, -29, -45, -4, -38, -32, -23, 67, 103, 33, -53, 36, -35, 66, 2, 20, -34, -1, 20, 51, -17, -2, 0, -25, 3, -25, 37, -49, -1, 18, 59, -18, 45, -43, -42, -6, -9, 16, -43, +63, 103, 70, -57, -28, 21, -23, 9, -31, -7, 29, -13, 42, -43, -4, -39, 35, -35, -33, 70, -11, -19, 39, 52, 16, -50, 13, -29, 45, -60, 26, -19, 26, 62, 75, -45, 73, 35, 36, 5, 25, 0, 17, 1, 46, 10, 9, -16, -30, -31, -20, 58, -41, 6, 28, 73, 54, -71, -20, -14, 28, -65, 57, -17, 85, 76, 90, 2, 60, 15, 65, -33, 46, 7, 15, 10, -4, -26, -13, -39, -35, +52, 19, -21, 24, 1, 17, -8, 33, -50, 51, -17, 12, -11, -37, -17, 15, 13, 11, -38, 21, -19, 25, 6, -29, 0, -7, -20, -65, 57, 15, 17, 3, 92, -30, -23, 32, 15, 28, -4, 23, -65, 57, 27, 50, 6, -25, -26, -71, -8, -60, 3, 45, -40, 29, 9, -26, -1, -65, -20, -66, -28, 10, -1, -9, 20, 28, -27, -3, 18, -7, -39, 10, -56, 54, -13, 38, 32, -49, 42, -18, 11, +-26, 18, -26, -50, 0, 28, -15, 42, -53, -53, -34, 47, -8, 30, -36, -24, 35, 2, 11, 0, -6, -50, 2, -2, 127, 1, 14, -20, 5, -27, -19, 1, -16, 47, 8, -39, 40, 31, 3, -10, 9, 31, -10, -7, -8, -5, 32, -23, -16, 26, 12, 24, 11, 21, -5, 38, 42, -4, -35, -23, 12, -38, 20, -50, 13, 13, 0, 83, -60, -25, 17, -1, -45, -7, 48, 57, 52, 59, -24, -41, 3, +25, -27, 1, -5, 4, 1, 74, -5, -21, 52, -59, 0, 36, -20, -4, 49, 33, -19, -20, 0, 1, -10, 27, -13, 70, -47, -46, 43, -35, 34, -58, -32, 20, -2, 20, -21, 3, -17, 87, -25, 1, 3, -42, 36, -15, -12, 32, 27, 36, -41, -42, -4, 0, -27, -14, -3, 11, 37, -23, 2, 18, -25, -46, 65, 16, -19, -22, 15, 7, 0, 36, -15, 12, 13, -20, 40, 8, 10, -16, 41, 47, +-25, -26, -12, -18, -20, -20, 38, -17, -17, 58, 27, 3, -2, -43, 36, 21, -7, 20, 36, -31, -44, 48, -19, 14, 24, 15, -33, 14, 39, -25, 61, 50, -29, 19, -16, -8, 11, 50, -1, -30, -10, 2, -20, 29, 85, -28, 63, -8, -23, 6, 28, -28, -32, 29, -10, 24, 23, -11, -14, -28, 3, -26, 38, 50, -7, -3, -2, -13, -4, 49, -11, -8, -6, 1, 24, 34, 56, -49, 95, 40, -8, +18, 35, -16, -40, 14, 15, 8, -32, -36, 0, -24, -28, 8, -30, 36, -25, -5, -30, -29, -7, 49, 30, -36, -34, 19, 3, -7, 43, -15, 19, 2, -17, 13, 48, -16, -31, 28, 12, 6, 10, -9, -2, 16, -3, -1, 23, 40, -22, 16, 2, 1, -2, 29, 7, -8, -26, 4, -22, 5, 39, 37, -81, -43, 8, 11, 60, 0, -8, -9, -1, -15, -5, -1, 1, -20, -43, -1, -23, 16, -18, 14, +-17, 50, -14, 65, 34, 6, -33, -13, -16, 21, -26, 38, -7, -2, 3, -22, -14, -17, -34, -28, -5, -20, -30, -12, -51, -48, -42, 7, 85, 32, 13, 1, -16, -36, 2, 19, 4, 4, -30, -3, 66, 38, 15, 19, -4, 0, -23, 21, 7, 77, -28, 23, -3, 1, -11, 30, -1, 7, 6, 29, -44, 15, -35, 55, 21, 127, -16, -39, -9, 14, 49, 19, -29, -11, 23, 17, 22, -15, -12, -19, -4, +51, -3, -13, -27, 15, -32, 4, -16, 16, -20, 28, -19, -11, -14, 111, 20, 104, -20, -62, -19, 37, 62, -24, -25, -6, 26, 3, -28, -29, 18, -20, 57, -13, -29, -20, 49, 127, -12, 0, -1, 19, -13, -5, -50, -43, -39, -39, -16, -15, -13, 9, -23, -8, -13, -20, 6, -25, -10, 14, 15, -39, 26, 36, -19, -33, -18, -24, 35, 102, -28, -10, -19, 25, -2, 6, -55, -69, -3, -36, -35, -3, +-55, 70, -35, -38, 11, -27, -8, -48, -15, -2, 31, -80, -12, -1, 25, -17, -56, -37, 60, 66, 59, -3, -19, 40, -3, 2, -12, -50, -8, -13, -22, -3, -45, 4, 21, 42, -19, 13, 23, -27, 16, -9, -14, -4, 31, -22, -37, 0, -20, -25, 44, -41, -10, 66, -40, -12, -20, -13, 3, -14, 14, 3, -21, -17, -2, -14, -39, -40, 32, -13, -10, -34, -33, -80, -38, -12, -2, 6, 45, 0, -30, +-5, -42, 36, 6, -33, -20, -13, -32, 0, 77, 0, 59, 18, -22, -50, -30, -9, 28, 11, 26, -6, -64, -47, -15, -26, -58, -19, 81, 20, 8, -17, -26, 10, 18, -42, 51, 115, 11, -31, 0, 14, 56, -40, 12, 18, -24, -33, -3, -45, -17, -8, -1, -17, -28, -11, -37, -3, -29, -8, 49, 22, -5, -28, -25, -27, 35, -51, 30, 35, 0, -22, -10, 18, -32, -7, -13, 20, 37, -9, -17, -40, +0, 70, 27, -4, -7, -16, -23, -10, -44, 52, 13, -16, -36, -21, -3, -26, 37, 24, -25, -48, -28, -10, -10, 9, -54, -26, 76, 25, 15, -17, 8, 12, 13, -29, -7, -43, 16, -21, 12, 5, -48, 52, -53, -7, -20, -22, -45, -29, 42, -55, -28, 44, -12, -15, 10, -25, -68, 3, -36, 2, 2, -4, -14, 10, -28, 46, -20, -17, 9, -16, 51, 7, -27, 36, -57, 13, -24, -29, -25, -4, 12, +-38, -9, 40, -12, -14, 20, -17, -66, -23, 25, 39, 30, -8, -8, 25, -45, 18, -4, 9, -7, -13, 22, 13, -50, 3, -19, 9, -49, -41, 0, 14, -16, -47, -25, -42, -37, -25, -17, -1, -54, -35, 87, 44, 75, -3, 5, 22, -48, -60, -38, -34, 17, 47, 8, 27, -36, 50, -29, -10, -29, -26, -24, 3, 15, -44, -18, 2, -7, -17, 13, -30, -41, -34, 57, 48, 18, -17, -13, 31, -27, -3, +-11, -18, 11, 60, 29, 10, -28, -12, 127, -30, -27, -9, -50, -56, 19, -12, 83, 31, -26, 39, -35, 1, 6, 7, 71, 25, 7, -31, -20, 77, 20, -45, -48, -29, 56, 83, -5, -39, -9, 48, 70, -37, -46, -26, 19, -17, 41, 63, 3, 16, 30, -58, -25, 33, 8, 29, 66, -50, -23, -44, -20, 22, -19, -18, -42, -2, -29, 19, -1, -7, -50, -25, 77, -9, -1, -14, -39, -7, 29, -35, 80, +40, -21, -14, -34, -13, -72, -35, -16, -36, -65, -21, -8, -21, -18, 18, -25, -46, -31, 44, -29, -3, -37, -40, 39, 18, -23, 8, -14, -40, 38, -50, 125, 21, -23, -12, -18, -15, -36, -10, -19, -10, -56, -17, -28, -4, -2, 31, -24, -38, -24, -55, -26, -14, -1, -26, -32, 17, 3, -65, -3, -45, -9, -17, 8, -22, -28, -10, -9, -14, -19, -14, 0, -4, 27, -35, -17, 6, -15, -9, -27, -1, +19, -14, 80, -14, -20, -15, -8, 26, -20, -54, -27, -34, -11, 7, -8, -10, 8, -6, -17, 3, 38, -57, -34, -13, 10, -57, 15, -1, -10, 7, -16, -34, 60, -10, 85, -47, -6, -7, -13, 1, 23, 10, -23, -20, -13, -22, -55, 16, -28, -24, 14, -12, -62, -28, -2, 35, 34, -11, 23, -9, 12, -26, -2, -6, -15, 3, 26, -25, 38, -23, -21, 71, -24, 17, -10, -24, -13, 3, 7, -24, 23, +1, -18, -18, -14, 7, 10, 9, 3, -8, 23, -11, -10, -13, -30, -8, 16, -9, 9, 7, -31, 119, 14, 14, 10, -8, -4, -6, -1, 29, -2, 38, 41, 26, -55, -36, 1, 46, -5, 55, -19, 16, 10, -52, -18, -35, 54, 58, -38, -40, -31, -20, 5, 42, -35, 19, 63, -14, 16, 2, -18, -27, 24, 29, 66, -33, -2, -16, -8, -43, -10, -6, -17, -20, -22, -36, 11, 56, -22, -12, -26, -37, +-12, -11, 47, 64, -39, -36, -20, -28, -33, 5, -31, -33, -14, 12, 29, -7, -1, 41, -66, -18, 10, -28, 19, -34, 0, -6, -20, 32, -20, -28, -26, 0, -20, -22, -27, 10, -28, 19, 9, -11, -4, 5, -27, 27, 6, 3, -12, 22, 16, -44, 25, -42, -3, 0, 53, 3, 3, 0, 17, -15, -29, 8, 37, -27, -17, -31, -23, 30, 13, 12, -7, -43, -35, 49, -20, 49, 13, -17, -1, -6, -16, +4, -27, 7, -27, -9, 28, 30, -26, -1, 9, 6, -6, 12, -32, -17, -3, -27, -14, 67, 20, -1, 17, -32, -21, 43, -29, 20, 21, -27, -22, -17, -15, 12, -28, 0, -9, -26, -2, -16, 3, -25, -20, -1, -2, 1, -2, -14, 3, 14, -5, 28, 4, 8, 29, -58, -25, 4, -44, 29, 20, -14, -59, 11, 4, 26, -36, -9, 16, -41, 59, 11, -32, -5, 4, -17, -34, 36, 1, -34, -14, -46, +-22, 28, 11, 4, 7, -31, -6, 32, -16, 50, 8, -21, -15, -9, -26, 3, -24, 19, -22, -31, 43, 33, -22, -3, 17, -23, -34, 21, 1, -11, -2, 37, 28, -33, -11, -13, 67, -34, -20, -43, 14, -24, -85, -26, 35, -42, -25, -26, 1, 83, 21, -15, 44, 80, -45, 10, -9, 23, -70, 7, 55, 7, 22, -35, -8, -16, -11, 20, 50, 10, -5, -39, -31, -15, -50, -39, -22, -21, -33, -66, 2, +43, 9, -51, 32, 64, -38, 27, -12, 35, -43, 7, 10, -9, 38, -41, -23, 18, -1, -4, 58, -11, -10, 5, -11, -62, -11, -22, -7, -21, -27, -39, -49, 29, -3, 59, 8, 96, -22, 13, 3, 42, -17, 1, 35, -28, -44, -15, -8, 19, -42, -32, 90, -17, -31, -12, -27, -57, -48, -35, 9, 2, -4, -23, -30, 62, -1, 61, -3, 101, -31, 13, -14, 57, -26, -10, 29, -8, -53, -8, 2, 9, +7, 12, -24, -36, -17, -31, 7, -3, -17, 28, -22, 74, 74, 44, 60, 15, -30, -8, -12, 21, 18, 54, -39, -5, 33, 30, 52, 8, 10, -15, 22, 34, -17, -15, 3, -40, 4, 41, -22, -7, -41, 10, -64, 74, 2, -33, -8, 55, -51, 11, -8, 3, -36, 52, -30, -16, 50, 63, 113, -8, 52, -31, -59, 45, 6, -9, -17, -11, -14, 2, 3, 0, 47, 30, -8, 65, 2, 61, 10, 80, -72, +44, -93, 53, 47, 70, -16, 18, 3, 29, 27, 22, -7, -47, 11, 2, -10, -31, -6, 21, 15, 33, -15, -10, 6, -4, 6, 13, 17, 44, -23, -19, -1, 26, -26, -41, -12, 43, 18, 9, -24, 37, 20, 10, -29, 51, -29, -34, -32, -10, -15, 38, 20, 2, -16, -44, -21, 6, 19, 74, -55, -15, -20, 40, -4, 17, -16, -14, 27, 21, -34, -16, -12, 9, 26, -2, 5, -16, 0, -20, -14, -14, +13, 1, 14, 22, -30, -52, -59, -40, 14, 63, -58, -36, -27, -26, -10, 13, -19, -36, -26, 44, -1, 9, 1, -29, 11, -2, -56, 5, 35, -25, 34, -21, 31, -4, -1, -29, 0, -42, 3, -29, 11, 49, -23, -28, -41, -18, 38, -10, -7, -1, 13, 45, -3, -32, 15, 39, 14, -14, -20, 26, -34, -40, -24, -4, -19, -8, -32, 19, -50, -15, 50, 11, -47, -1, 19, -6, -26, 5, -13, 15, -19, +-11, -17, -15, -4, -56, 39, -15, 33, 21, 10, -21, -16, -35, -23, -15, -4, 22, -4, -18, 40, -19, 54, -6, -60, 18, -80, 23, -40, -46, 31, -24, -48, -23, -23, 64, -15, -46, 5, -62, 51, -21, -48, -12, 11, -42, -13, -18, -23, -19, 28, -20, 14, -18, 60, -25, -64, 56, -58, 6, -50, -46, -13, -37, -23, -23, -19, 53, -24, -13, 13, -40, 38, -9, -42, 0, -52, -34, -32, -2, 21, -9, +13, -45, 41, -31, 20, -22, -41, 25, -7, -18, -45, -2, -31, -33, -39, 1, 3, 14, -6, -31, 9, -27, 33, 7, 35, 35, -12, -38, -21, 14, 32, -9, -12, -12, -1, -11, 17, -11, -29, 41, -17, -17, 14, 4, 26, -29, -22, -26, -12, 47, -7, -8, 10, -49, -9, 5, 5, -55, -39, 26, 88, -64, -1, -26, 8, -52, -15, 3, 73, -18, 0, 27, -8, 14, 49, -29, -31, 14, -32, -38, -66, +97, -10, 28, 7, 58, -19, -3, -48, -42, 17, -60, 48, -19, -5, -40, -9, -47, -21, -1, 36, -9, 18, -5, 7, -14, 57, 45, -50, 49, 19, -42, 4, 53, -36, 27, -51, 11, 42, -20, -70, 34, -21, -40, -69, 27, 11, -43, -20, -57, -32, -14, 5, -42, 3, 76, -12, 13, 16, 61, -16, 10, -18, 10, -8, -22, -12, 1, 14, -15, -13, -10, -33, 36, -29, -67, -96, 59, -8, -48, 12, -29, +-57, -27, 20, -34, -25, 116, 5, -4, 26, 66, -42, 5, -38, 11, 8, -24, -9, 22, 6, 8, -34, 8, 21, -11, -8, 5, -17, -70, -24, -23, -5, -7, 35, -3, 55, -31, -3, 15, 105, 98, 15, 16, -7, -28, -18, -12, 11, 7, -23, 29, 8, -15, -8, 11, -43, 11, 16, -18, -35, 1, -8, -28, -12, 21, -4, 5, 2, -34, -21, 26, -57, 89, 48, 34, -39, -15, -6, -6, 23, -41, -15, +-9, -10, -10, 37, -14, -15, 3, -36, 8, -39, -19, 1, 46, -2, 48, -25, -22, 3, -24, 41, 7, -44, 16, 21, 56, -12, 14, 16, -16, 47, -22, -10, -19, -14, -18, 15, -11, -14, 0, -3, 8, -17, 9, -24, -4, -20, 9, -26, 5, -21, -8, 18, 32, 1, 10, 27, 57, -59, -2, -28, 6, 15, 16, -23, -26, 7, -8, 41, 28, -23, 2, -4, 36, -36, 9, -33, 17, -46, 31, -46, -43, +-33, -37, 101, 10, -21, -14, 42, 42, -29, 3, -5, 12, 41, 25, -22, -26, 1, -6, 13, 30, -29, -2, -36, 28, -39, 26, 27, -22, 5, 45, -40, -2, 10, -38, 124, 14, -12, -23, 58, 29, -34, 5, -44, -15, 100, -29, -41, 9, 4, 4, 36, 22, -42, -5, -8, -25, -7, 23, -50, -28, 11, 6, -16, 47, 9, 6, 8, 37, 49, -14, 1, 71, -15, -8, -50, -21, 0, 16, -25, -40, -2, +1, 52, -3, -53, 7, -66, 30, -24, 127, -7, 93, -12, 5, -54, -27, -14, -38, -11, 9, -7, -7, 57, -8, -53, 3, -12, 11, 4, 82, -2, -21, -2, -2, 28, -25, -38, -50, -13, 4, -26, -52, -40, 39, -2, 19, -33, 24, -6, -34, 38, -8, 127, -28, 46, -6, 26, -35, -9, -1, 31, -30, -41, -32, 39, -8, 24, 11, -19, 12, -10, 2, -11, 24, 1, 47, 3, 46, -29, -15, -1, -41, +21, 5, 57, -21, 27, 58, -30, -4, -13, -36, 14, -21, 20, -38, -22, 9, 86, 12, -39, -4, -14, -61, -17, 57, 30, 25, 62, 16, 37, -32, -27, -23, 6, 8, -10, 36, 57, 18, -40, 0, -3, -38, 28, -13, 5, -15, 10, 27, 36, 43, -19, -7, -20, -90, -55, 38, 21, 57, 39, 29, -19, -42, -44, -32, 9, -6, -7, 20, -3, 26, -12, -8, 25, -41, 49, -37, -3, -13, 10, -6, 4, +32, 16, 38, -14, -46, -50, 69, 41, 68, 15, -9, -7, 27, -33, -72, -32, 4, -38, 47, 25, 18, -35, -38, 23, -5, 26, 20, 30, 7, 30, 5, 45, 23, -17, 13, -16, -21, 2, -22, 19, 19, 22, 1, -30, -5, 8, -43, -21, 37, 27, -10, 19, 12, -18, -40, 0, -25, 63, -51, 17, -11, 25, -21, 55, 13, -16, -25, -4, -39, -49, -53, -13, 45, -41, -2, 13, -44, -5, -50, 101, 5, +2, -32, 19, -9, -7, -15, -15, -15, 59, -12, -30, -54, -1, -7, -10, -4, -38, -47, -8, 0, -25, -4, -7, 19, -31, 34, -1, -37, -22, -39, 65, -10, -20, -41, 51, 45, -33, 10, -2, 10, 13, -2, 2, -32, 1, -24, 21, 19, -55, 7, 79, -4, -11, 33, -43, 30, -42, -81, 75, 18, -8, 4, 32, 13, 37, -22, 11, -37, 27, 20, 50, 38, 16, 0, -27, -14, 14, 18, 11, -15, 0, +0, 23, -21, -22, 9, 31, 23, -51, -47, 55, 1, 12, 1, 9, 6, -8, 23, 11, 89, -12, 20, 13, 7, -8, -14, -7, -27, -2, 37, -25, -65, -13, -15, 15, -12, -26, -21, -4, -30, -43, -22, 84, 19, -7, 18, 9, 2, 18, -42, 22, 32, -45, 18, 58, -14, -38, -41, 9, 31, 4, 45, -19, -7, -4, 2, 19, -5, -22, 12, -2, 5, -40, -2, 38, -9, 7, -4, -13, -10, -8, 2, +-1, 27, -20, 28, 55, 61, -4, -22, -13, -33, 2, 57, -4, -31, 22, 1, 5, 5, -23, -10, -1, -4, -2, 19, 33, -11, -10, 18, -34, -27, 2, 27, -17, 4, -15, 16, 67, -20, 15, -18, 1, 10, -32, 19, -17, -20, 2, -5, 3, -17, 47, -13, 1, 28, -32, 11, 76, 5, 0, -7, -5, -2, 29, -17, 16, -25, -22, 1, 79, 14, -25, -27, 70, -25, -6, 59, -50, 29, -3, -28, 22, +1, -18, -15, 2, 48, -16, 30, 48, -56, -6, -27, -36, -21, 24, 27, 18, -14, 7, 24, -16, 81, 1, 3, -20, -41, -19, 24, -36, -34, 30, -3, -5, -8, -44, -29, 28, -2, 31, -23, 72, -10, -6, 10, -17, -33, -12, 35, 18, -58, -11, 70, 66, -14, 21, -12, 32, 4, -1, 16, -5, 34, 41, 7, 74, 4, -16, -28, -78, -20, -25, -64, 117, 10, -16, -14, -4, -8, 67, -42, 1, -26, +-52, 20, 69, -13, -43, -25, -15, -7, 11, 71, -50, 6, -10, -8, 28, 7, -27, -24, -48, -22, -11, -73, 127, 0, 1, -9, -6, -6, 32, -2, 46, -25, -12, 10, 88, -36, -50, -9, -25, -5, -21, 59, -20, 13, -13, -16, 3, -6, -42, -20, -3, 27, -20, 19, 105, -9, 12, 13, 11, 41, -38, -5, -5, -66, -28, 66, 55, 23, -16, -4, 54, -50, -53, 53, -8, -20, -5, -25, 4, 20, -19, +-29, -32, 3, 3, 2, 93, 24, -16, 24, 2, 33, -31, 19, 12, 10, -26, 84, 33, 40, -7, -9, 33, -8, 10, 59, 3, -16, -11, -12, -8, -18, -46, -5, 3, 30, -37, -62, 105, 15, -27, -3, 2, 4, 0, 34, -7, -40, -19, 63, 64, -14, 13, -25, 13, -12, 9, 86, -31, 12, -9, 0, 26, 5, 10, -17, -9, 2, -66, -60, 70, -5, -21, -3, 1, -27, -1, -22, -20, -38, 27, 56, +51, -8, -19, -16, 6, -16, -11, 77, -37, -12, 7, 13, 15, -23, -35, -13, 14, -17, -48, -37, 121, 24, -38, 32, -46, 16, 17, -29, -7, -22, -72, 35, 15, -17, -17, -42, 2, 22, -9, 48, 3, -40, -10, 24, 38, -19, -48, 9, -66, -35, -41, -60, 112, 14, 20, -32, -67, 3, 49, -23, 5, -6, -42, 32, 47, -41, 1, -34, -36, 4, 28, 88, -20, -31, -24, -27, -26, -23, -14, 16, -30, +-7, -14, 19, 17, 30, -11, 15, -15, -16, -34, -35, -4, -54, -51, 55, -34, -30, -20, -7, -8, -25, 7, -33, -21, 13, -36, -72, -11, 25, -6, 65, -4, 47, -43, -11, 2, 6, -27, 0, -10, 9, -60, -3, -43, -35, -77, 23, -42, 21, -20, 9, -3, -9, 0, -4, -18, -9, 36, -24, -8, -9, -38, 26, 16, -11, 8, 19, -36, -32, -51, 17, -3, 3, -29, 16, -35, -31, 31, 7, -33, 9, +16, -2, -5, -9, 23, -13, 37, 31, -4, -12, -37, 4, 9, 34, 3, 23, -37, 38, -4, -9, -57, 14, -10, 9, -20, 16, -47, -34, 25, 50, -14, 4, -30, 34, -2, -32, 13, -4, 1, 8, 5, -32, -32, -21, -19, 34, 2, -3, -16, 14, 9, -13, -68, 28, 10, -6, 15, -7, -28, -24, 31, 36, -30, -19, 5, -31, -27, -5, 6, -13, 21, 14, 3, -32, -45, 37, 17, 53, 31, 53, 43, +2, -9, -32, -35, -15, 4, 14, -2, -24, -52, -4, -27, -18, -49, -6, 13, 21, -10, -10, 1, 13, -36, 16, -10, 37, -16, -26, 36, 14, 23, 55, -30, -12, -11, -15, -36, 43, -37, 15, 22, 31, -34, -2, 11, 1, 31, 1, -21, 4, 1, -10, 41, 17, -23, -10, -20, -27, 12, -30, -46, -17, -25, 18, -8, -28, 21, -25, -29, 9, -8, 15, 22, 38, -6, 21, -25, 55, -32, -39, 39, -10, +-23, 6, 9, -35, 10, -1, -50, -53, -33, -23, 21, 59, 3, 6, 10, 5, -13, -23, -28, -11, -2, -13, 26, -22, -13, -16, 3, -11, -31, -15, -52, -19, -21, -27, -12, -29, -37, 42, -17, -19, 0, -5, -11, 10, 1, 6, 2, -50, -59, 12, -19, 2, 8, -1, 23, -2, -25, 11, -1, -10, -17, 15, -15, -20, -32, -29, -15, 19, 2, 25, -60, 21, 8, -24, -29, 9, 23, 40, 12, -52, -63, +12, -24, 40, 12, -2, -36, 17, -9, -14, -42, 38, -52, 9, -20, 2, 2, 32, -11, -41, 29, -12, -51, -2, 26, 0, -33, 14, 26, 58, -3, -52, -30, 29, -16, 2, 6, 30, 6, 6, -16, -15, -10, 36, -5, -33, -64, -21, -31, -20, -22, 59, 6, -8, -6, -10, -9, -48, 5, 14, -32, 25, -20, -14, -65, -20, -35, 32, -28, -6, -10, -29, -31, -26, -32, 55, -38, -4, 7, -18, 30, -31, +14, -66, -14, 1, -38, -28, 0, -32, 15, 12, 13, 9, 34, -6, -31, -12, -22, 5, -12, -11, -39, 9, -21, 1, 6, 19, 6, 20, -40, -17, 12, -2, -5, -50, -18, 8, -22, 28, -5, -34, -23, 11, 1, -35, 40, 45, -5, 20, -10, 17, -14, 12, 7, -34, -27, -14, 101, -46, -10, -12, -52, -3, -1, -20, 5, -16, 72, -5, -14, -25, -19, 12, -41, 18, -27, -16, 5, 65, -6, 12, -5, +9, 2, 30, -8, -47, -5, -23, 101, -12, -65, 5, 115, 19, -29, -14, 9, 31, 50, 46, -7, -25, 3, -11, -43, -6, -16, 49, 38, -27, -39, 17, -25, 28, 1, -6, 33, 21, -5, -4, -51, -7, -64, 42, -20, 13, 109, -32, 85, -5, -28, 22, 25, -16, -29, 22, -33, 5, 2, 76, 13, -48, -13, 11, -42, -28, 5, -7, 9, -41, -23, 0, -22, 9, -61, -33, 25, -23, 127, 3, 36, -9, +-16, -17, 14, -5, -17, 38, -10, -5, -11, 26, 42, -38, -37, 5, 5, -48, -29, -34, 2, -31, -17, -6, 7, -1, -48, -13, -15, -19, 127, -6, 59, 22, -22, -34, -10, 1, -16, 1, 18, 10, 21, 29, 28, -40, 23, 2, -36, -14, -26, -20, -12, -33, -6, -9, -25, 60, -53, -21, 5, -15, 102, 15, 40, 1, -24, -36, 63, 7, -21, 33, -8, -1, -26, 7, 40, -19, 14, 24, 9, -21, -26, +-30, -11, -20, -8, -7, -17, 3, -12, -17, 7, -19, 92, 10, 39, 29, -36, 0, -30, 35, -18, -10, -52, 40, -5, 67, 19, -12, -13, -5, 17, -13, -37, -56, -27, -24, -31, -7, -14, -8, -10, -24, 4, -26, 110, 22, 15, 24, 12, -59, 39, 58, -23, -31, 48, 39, 23, 9, 1, -21, -23, -5, -26, 3, -17, -21, 4, -35, 2, 2, -13, 17, -42, -21, 29, -35, 117, -6, 60, 34, -1, -23, +61, -28, -1, 51, -30, 57, 16, 24, 38, -52, 8, -8, 24, -45, -26, -17, -25, 13, 7, -8, -8, 66, -30, 3, 13, -20, 76, 55, 47, -27, -4, 3, -16, 20, -13, 53, -33, 18, 18, 19, 41, -28, -1, -7, -17, -18, -21, -34, 3, 17, 13, -28, -30, 40, -19, 11, 37, -11, 74, 19, 72, 5, 13, 53, -17, 3, 19, 54, -34, 24, -3, 17, 47, -50, -74, 2, -1, -31, -29, -36, 2, +28, -5, 11, -2, 28, -55, 1, 31, 4, 109, 1, 60, 19, -26, -12, -10, -1, -10, 17, -14, 33, 10, 63, 54, -10, -37, 20, -41, 1, -13, -23, 11, -9, -20, 31, -17, 4, -17, -11, 47, -19, 127, -4, 68, 12, -26, -36, 7, -27, -30, 37, -20, 20, 52, 16, 34, -36, -30, 11, 32, -61, -24, -50, -42, 26, -31, 2, -35, 8, -10, 15, 38, 17, 127, 5, 70, 44, -29, 2, 61, -42, +-19, 27, -57, 2, 44, 24, 56, 3, -6, -4, -8, -31, -20, -14, -9, 41, 9, -40, -52, 105, -61, -11, -7, 12, 127, -13, 103, 43, 3, -13, -11, -35, -14, 27, 4, 47, 10, 16, 27, -10, -14, 10, -31, -15, -53, -41, 2, -6, -29, -7, -37, 36, -53, 17, 30, 3, 127, 6, 54, 10, 33, -18, 16, 4, -2, 5, 8, 41, -1, -28, 59, -23, 33, -12, 1, -56, -9, -15, 30, 27, -5, +-1, 52, 14, -52, 40, -56, -38, 117, 33, 83, 19, -4, -11, -72, -58, -12, 7, -25, -3, -10, 26, 55, -49, 7, 26, -16, -54, 28, -7, -33, -10, -19, 1, 63, 31, -57, -26, -63, 1, 119, 1, 78, 45, -42, -15, 11, 43, -18, -9, 12, -34, 8, -18, 5, 59, 70, -14, 11, 2, -22, -1, -95, 127, -27, 16, -20, 29, -20, 26, -27, 26, -65, -31, -17, 31, 2, 4, 35, 62, 47, 1, +-2, 9, 33, -26, -6, 34, 100, 0, 17, -9, -2, -5, -35, -40, -1, 35, -6, 1, -7, -16, -9, -12, -10, -4, -39, -12, 11, 3, 10, 98, 5, 30, -21, -5, 16, -15, -18, 23, 81, -9, 1, -13, -26, -9, -28, 13, 24, 7, -4, 21, -17, 31, -11, 15, -34, -17, -44, 6, -3, 17, -5, 43, 61, -14, -1, 5, 26, -38, -15, 61, 127, -14, 3, -39, -10, -20, -25, -1, -5, 35, -7, +-6, 5, -7, -29, -11, 27, 0, -26, -22, -22, 28, 7, 54, 38, 13, -2, 34, 37, -32, -9, -15, 127, -2, 17, -18, -24, -4, -5, -3, -6, 27, 0, -35, -13, 20, -26, -8, -17, -9, -32, 10, -7, 19, 30, 85, 35, 23, 11, 9, 40, -31, -16, 47, 127, -29, -38, -18, -8, -41, 2, -41, -4, 21, 5, -28, -31, 12, -40, -12, -15, -19, -26, 2, 10, 36, -13, 8, 73, 22, -13, -28, +52, -35, 15, 81, 127, 21, -12, -26, -53, -36, 31, 30, 8, -15, -40, -17, -23, -1, -21, -27, 59, 26, -14, -25, -33, 33, -6, 76, -27, -9, 6, -13, 18, -14, -9, 10, 105, -24, -19, 10, -14, -25, 30, 35, -4, 10, -8, -13, -21, 5, -24, -17, 8, -25, -42, -11, -6, 10, 26, 70, -56, 8, 9, 52, 8, -17, -37, 50, 109, 12, -42, 9, 57, -16, -4, 8, 38, 3, -11, 6, -27, +-20, -5, 8, -1, -49, -52, 23, 8, 21, -38, 88, -1, 24, -12, 0, 20, 5, -11, 43, 57, 2, -36, -3, 10, -8, 12, 13, -9, -28, -26, -12, -38, 10, 1, 18, -6, -4, -23, -18, 0, -2, -9, 107, -29, 12, -25, 9, -12, 3, -7, 30, 84, -14, -11, -7, -12, -10, 8, 17, 7, 17, -37, -18, -12, -11, -37, -9, -5, -27, -77, -20, -21, 12, -34, 99, -58, 1, -5, 18, -16, 23, +-3, 14, 19, -9, -9, 9, 13, 32, 8, 3, -3, 10, -8, -27, -42, -1, -10, 13, -10, -37, -58, -21, -25, -10, -31, 94, 20, -2, -19, 12, 25, -13, -31, 47, 57, -10, -8, -8, -2, 16, -23, 10, -5, 13, 12, -26, -19, -32, -71, -22, -10, -36, -27, -21, -20, -22, -68, 80, -12, -24, -6, 37, 44, -12, -21, 95, 62, -18, -16, -4, 11, -15, 3, 7, 33, 23, -22, 9, -15, -9, -20, +23, -16, -14, -21, -3, -5, -9, -40, 114, -10, 16, 3, -10, 24, -4, 41, -2, 90, 3, 0, 1, -38, -66, 31, -12, 16, -18, -31, -33, 16, 19, -49, 32, -47, -39, -14, 43, -34, 19, 0, 127, -25, 15, -5, 45, 75, -9, 52, 36, 66, -14, 22, -24, -10, -34, -17, 26, -2, 21, -25, -30, -4, 41, -7, 33, -15, -2, -40, 12, -42, 36, -6, 64, -17, 15, -14, -17, -12, 18, 4, -9, +-6, -27, 7, 19, 13, 29, -21, -26, 31, 11, 45, -29, -31, -8, -35, -10, 0, -45, -27, -5, -2, 24, -21, 103, -28, -8, 12, -34, -35, -1, 28, 5, 25, 46, 9, 58, -30, 50, 16, -64, 23, -31, -16, 32, -12, -28, -23, 17, 99, 13, 38, 35, 49, -5, -6, 41, 0, 6, 16, -29, -19, 11, -23, -17, 34, -15, 25, 19, -36, 3, -7, -39, 1, -15, -38, -26, -11, -5, -5, -5, 29, +14, 35, 9, -4, -20, -17, 61, -30, 3, 20, -29, -21, -4, -3, 9, 3, 22, 3, 5, -39, 5, 9, -29, 8, -36, -5, 16, 2, -3, -4, 16, 50, 29, 10, 13, 26, 43, -12, -6, 45, -38, -11, -21, 2, -9, -42, -24, 6, 22, 16, -1, -41, -4, -43, -35, 5, -49, -14, -9, 13, -21, -20, 15, 8, 28, 48, -16, 5, -20, -12, 21, -12, 10, -14, -28, -6, -1, -18, -6, 39, 43, +-8, 25, -32, 4, 9, -53, -33, -78, -11, 17, -7, -23, -16, 11, -21, 6, 20, -2, 28, -19, -14, 53, -31, -51, -30, -37, -6, -11, -13, -16, -1, 11, -7, 17, -19, -13, -33, -37, 7, -26, 39, 9, -7, -2, 4, -52, -1, 29, -23, 8, -7, 20, -15, 79, -2, 38, -24, -24, -17, -17, -45, 6, 52, 44, 6, -26, -48, -32, -35, 7, 4, -8, -53, -12, -35, -12, -26, -8, -26, -24, 80, +-16, 3, -15, -1, 1, -26, 2, -15, -14, -11, -37, -16, -53, 40, 13, -11, 68, -13, -51, -50, -21, -52, -29, 12, -22, -14, -23, 9, 2, -18, 58, 60, 11, -29, 5, -28, 25, -11, 53, -17, -21, -10, -27, -22, -43, 50, 1, 19, 7, -30, -30, -34, -25, -16, -11, -11, -30, -38, 2, -6, -33, 2, 30, 49, 9, -16, -32, -10, 40, -30, 3, 25, -57, -44, 6, -6, 16, 11, 60, 0, -32, +-41, -11, 0, -38, -19, 15, -13, -19, -27, -27, -28, -6, -47, -11, 24, 5, -13, -26, -21, -18, 2, -22, 8, -11, -20, -57, -33, -14, 14, 19, -24, 44, -59, -37, -16, 0, -8, 15, 36, -36, -56, -28, -27, 20, -11, 10, 11, -2, -44, -29, -30, 102, -37, 9, 6, -24, -40, 0, -25, 5, 12, 45, 0, -8, -30, 2, -10, -63, 8, 8, -20, -21, -29, -30, 0, -10, -19, -5, -10, 5, 19, +22, -51, 44, -20, -25, 22, -14, 11, -23, -11, -23, 22, 74, 15, 31, -11, -20, 3, -38, 6, 50, 4, -18, -6, -1, -9, 2, 1, -9, 25, -23, 27, 25, -26, 18, -53, -71, -44, -17, 4, 28, -41, -11, 36, 45, 29, 24, -42, 17, -17, -14, -18, -94, -10, -30, -18, 12, -3, 3, 5, 9, -5, 11, -2, -50, -31, -7, -29, 30, -7, -60, -26, 24, -51, -20, 19, 6, 19, 70, -36, -45, +-3, -40, -2, -62, -29, -10, -38, 31, -20, 3, -38, -14, 7, 3, -18, -31, -39, -40, -12, -1, -28, 40, -25, -48, -34, -3, 36, -16, -22, -13, 38, -17, -27, -3, 3, 7, 8, -28, 54, 44, 10, 0, 29, 11, 1, -6, -10, -10, -3, -52, -17, -4, -31, -19, 4, -8, -36, 39, -36, -11, -18, -23, 29, -15, -11, 9, -21, -19, 22, -4, 56, 110, 87, -2, 19, -3, -30, -29, -13, -6, 17, +-36, 8, 7, -23, -12, -14, -3, 5, 0, -12, -9, 16, -16, 22, -8, 1, 6, -29, -4, 1, -17, 39, 49, 61, -1, -3, 6, -33, -7, -25, 1, 34, -30, -12, -6, -21, -30, -23, -44, -44, 20, -33, 11, -25, -22, 22, 2, -29, 41, 11, -44, -7, -1, 32, 32, 65, -23, -11, -5, -32, -2, -19, -15, 27, -12, 15, 13, -37, -8, 2, 11, 18, 27, -23, -8, -16, -3, 2, -11, -12, 9, +10, -28, -13, -17, 12, -4, 9, -13, -29, -2, -22, -27, -9, 4, 59, -11, 37, -1, -39, -41, -37, 15, -9, 29, -67, 2, -4, -11, 17, -8, -1, 80, -19, -31, -15, -37, 34, -44, 60, 4, -36, -11, -52, -58, -21, -28, 37, -18, -71, -5, -49, -3, -59, -33, 4, -13, -26, -8, -13, -18, 9, 35, 2, 78, 59, -34, -7, -36, 81, -25, 82, 9, -45, 10, -36, 15, -9, -27, 20, 0, -2, +-26, -50, -13, -21, 26, 16, -6, 57, -14, 14, -20, -5, -8, -29, 26, 67, -33, -3, -22, -11, 65, -19, -2, -16, 9, -21, -27, -4, -1, 9, -26, -22, -24, -10, -8, -31, -6, 27, -2, 73, 13, -28, 6, -3, -7, -4, 63, 56, -6, 1, -40, 17, -2, 32, -18, -33, 0, -29, -27, -40, 35, 18, -61, -25, 10, -46, -42, -16, -10, -39, -22, 37, -26, -29, 17, 14, -7, -20, 60, 62, -34, +12, -48, 50, 72, 43, 16, 4, 10, -17, -25, 15, 27, 11, -17, -12, 14, -45, -14, -29, -21, -3, -18, 46, -1, -46, -24, -12, 27, -14, 48, 6, -64, 7, -8, 4, 31, 32, 37, 8, -22, -39, 0, 12, 15, 23, -43, -18, 32, -47, -31, 46, 11, -35, -32, -19, -24, -10, -14, 0, 17, -1, 53, 45, -5, -11, -27, 33, 22, 30, 60, 10, -5, -17, -9, -31, 2, 34, -52, 5, 16, -25, +-10, 9, -9, 5, 0, 64, -12, -11, -11, -11, 8, 9, 0, 72, 7, 3, -15, 38, 92, 47, 0, 26, -17, -17, -31, 1, -9, 26, -38, -7, 7, -28, -20, 48, -14, -5, -12, 35, -3, -13, 6, -2, 20, -5, 41, 60, -48, 15, -4, 42, 22, 24, -25, -9, -58, -8, -37, -22, -3, 27, -13, -12, 6, -14, 17, 14, -27, -19, -39, -55, -22, -12, -20, -19, 6, -11, -22, -58, -32, 5, -14, +21, -29, 22, 34, -8, -21, -3, -20, 9, 0, 98, -7, -13, -21, -32, 25, -29, -45, -46, -30, 8, -19, -16, 2, -11, -28, 9, 69, -30, -77, -15, -46, 56, 67, 46, 27, 31, -1, -6, -26, 11, 9, 31, -42, 1, -8, -15, -10, 70, -18, -22, -13, -18, 12, -41, 41, 17, 61, 13, -20, -6, -55, 2, 11, 12, -15, -27, 24, 17, 8, 0, -9, 49, -18, -39, -32, -50, -15, -12, -2, -7, +-21, -24, 19, 55, -18, -29, 63, -11, 28, 21, 10, -25, -70, -8, 12, -23, -44, 18, 49, -28, 19, -23, -13, 52, -24, 38, -17, -25, -4, 10, 0, -29, -29, -24, 10, 39, -7, 3, 30, -24, 24, 65, 9, 14, -38, -29, 10, -11, -8, 17, 38, -22, 12, 4, 29, 37, 13, 35, -18, -27, -29, -35, -3, -13, 2, -20, -1, 19, -16, -3, 59, -8, 12, 2, 8, -2, 15, 1, 13, 3, -35, +2, 62, -18, -6, -13, 41, 38, -6, 34, -36, 0, -9, -4, -2, -37, -5, -29, 25, 22, -18, 10, 14, 2, 3, 108, 17, -8, 32, -35, 13, -31, -15, 31, 29, -19, -2, 8, 59, 0, -1, 37, -23, -7, -5, 17, -13, 3, -10, -6, 22, 35, -34, 9, -3, -4, 13, 35, -1, -4, 36, -21, 13, -24, 7, 25, 18, -34, 14, -16, -38, 70, -13, -20, -16, -24, -43, 9, 8, -42, -13, -36, +-17, 49, 11, -13, 53, 2, 1, -3, 49, -42, 16, -7, -26, 35, -28, -11, 48, -23, -18, 2, 33, 34, -18, 31, 20, -46, -26, -38, -7, -27, 21, -25, -4, 30, -48, -25, 16, -19, 24, -18, -12, -1, 66, -26, 18, -50, -23, 11, 8, -27, -3, -11, -42, 39, -11, 2, -23, -10, -16, -3, 8, -25, -32, -6, 2, 59, -26, -20, 27, -17, 13, 77, 59, 2, -50, -33, 5, 5, -45, 3, 58, +-29, 34, 7, 91, 18, 0, -9, -18, -9, 0, 26, 25, 5, -24, -44, 63, 31, -47, -29, 73, -8, 25, 12, 42, -7, 29, -45, 22, 9, -30, -19, 74, -18, 21, -22, 49, 45, -11, 17, -21, -50, 6, 3, -19, -10, -18, 2, 42, 30, -3, -38, 77, 4, 19, -9, -16, 65, 35, -32, 17, -3, -4, 4, 103, -16, 5, -28, -9, 11, -2, 61, 26, -46, 2, 7, -16, 0, -45, -7, -6, 14, +-22, -9, 59, -27, 59, -36, -17, -42, 66, -17, 17, -24, -21, -19, 79, -31, 5, -5, 69, 82, -12, 15, -24, -22, 13, -43, -6, -22, -16, -20, 26, 48, 25, 4, 36, -15, 71, 1, -20, 16, 20, -4, 18, -9, -33, -19, 70, -27, 1, 5, 43, 28, -22, 24, -10, -15, -28, -7, 5, -32, -13, -35, 17, 44, -9, 15, 60, -27, 31, -35, 0, 12, -30, -25, 1, -2, -11, 7, 30, -19, -2, +4, 29, 40, -4, 29, -25, 1, 19, 16, 6, -46, -33, -11, -9, 26, -22, 25, 40, -12, 82, 127, 39, 3, -11, -20, -11, -2, 8, 1, 82, -49, 20, 9, 69, 20, 33, -13, 3, -17, -7, -1, -21, 16, -39, -39, 4, 36, -37, -21, 20, -4, 70, 67, 6, -42, -8, -52, 54, 21, -59, 51, 116, -32, 29, -22, 78, 17, 47, -25, 63, -26, -40, -2, -48, 5, 4, 10, -23, -20, 6, 10, +-27, 17, -30, -33, 0, -37, -60, 65, -42, -7, -36, 10, 14, 9, 16, 17, 19, 103, -40, -6, -63, 20, 27, 2, -35, 46, 21, -29, -33, 29, -15, 41, 1, -18, 45, 9, -29, -26, -35, -40, -10, -25, -25, -63, -73, -71, -39, -32, 3, -5, -50, 3, -16, 6, 8, 27, 18, 10, -17, 41, 0, 0, 15, -12, -16, -15, 14, -28, 78, 49, -12, -23, 4, 28, 35, -49, -17, -39, -44, -46, -18, +14, -48, -17, 23, -23, -17, -30, 4, 17, -17, 13, 35, 10, 45, -29, 7, -10, 0, 11, 33, 40, -7, -9, 2, -3, -2, -12, -17, -25, -3, 43, -42, 10, -9, -25, -9, -13, -1, -44, 1, -31, 11, 14, -3, -11, -4, -41, 10, -1, -6, -14, 28, -32, 19, 4, -19, 50, -8, -12, 21, 7, -15, 10, 24, 33, -24, -15, -52, -26, 14, -18, -17, -12, -17, 36, 16, -22, -15, -63, -19, 19, +-30, 19, -31, -35, 27, -5, 26, 59, -25, -29, 20, 14, 3, -7, 36, 28, 3, -27, 0, -2, 0, 1, 44, -21, -2, 30, 43, -38, 19, -47, -7, 8, -20, -10, -5, 24, -18, -3, 6, 12, -10, -8, -9, -8, -3, 6, -33, -36, -3, -6, 18, -2, 18, 6, -36, -3, -16, 2, -13, -43, 46, -22, -30, 114, -19, -35, 17, 86, 20, 8, 21, -26, -28, 10, 15, -9, -14, -11, -23, -22, -33, +9, -31, 17, -6, -69, -28, -33, -45, 9, 7, -39, -25, -28, 21, -41, -29, 19, -25, 9, -19, 7, 58, 75, -37, -23, 36, -34, 14, -18, 27, -25, -8, 39, 7, -16, 5, -37, -18, -8, -1, 13, 1, -5, 12, -37, -19, 12, -13, -21, 12, 79, -17, 2, 4, 10, -25, -19, 2, -10, -15, 3, -42, 23, -61, -37, -23, -23, 36, -17, -9, -34, 14, -9, -6, 21, -30, -41, -8, -16, -37, -20, +-9, -39, 12, 21, -1, 47, 10, -10, 14, -18, -9, 8, 38, 5, -1, 4, -26, 26, 31, 18, -24, 9, -26, -2, 2, -1, 28, 31, -4, 127, -28, 32, -30, 22, -22, 57, 3, -1, 7, 50, -28, -17, -12, 0, -14, -11, 1, 16, -30, 9, -14, 19, 96, -15, -20, 29, 20, -4, 51, -2, -12, 79, 11, -33, 16, -5, -24, 46, -15, 3, 34, 35, 8, -33, 21, -16, -40, 4, -15, -24, -16, +2, -19, -47, 25, -36, 117, -25, 1, -56, 24, 32, -25, 35, -57, 16, -8, 13, -17, 2, 79, 81, 8, 73, -42, 68, 119, 46, 70, -2, 64, -61, 49, 7, 0, -40, -43, -25, 49, 11, -19, -45, -15, 17, 2, 8, -51, -46, -36, 27, -47, 20, 85, 58, 54, 75, -40, 36, 95, 59, 31, 21, 90, -52, -19, -6, -1, -1, -68, -59, -48, -32, 3, 21, -18, -29, -34, 61, 3, 97, 47, 71, +-1, -18, 5, 24, 32, 3, -1, -20, -22, -22, -22, 17, -25, -34, 4, -12, 6, -27, -4, 16, -15, 6, -35, 18, 58, -25, -1, 23, -36, 35, -65, -6, -38, -11, 4, 18, -3, -32, -1, -1, 27, -15, -12, -16, -30, -31, 34, -54, -25, -33, -7, 16, -20, 10, 11, 35, 2, -16, -56, 24, 25, -1, 20, -15, 18, -32, 1, -13, -46, -7, 47, -32, -12, 40, 1, 20, -19, 53, 9, -27, 33, +-15, -16, 14, -7, 10, 7, -5, -42, 96, 67, -50, 11, -24, 2, -3, -7, 13, -11, 56, -5, -49, -15, -34, -61, 7, -2, -41, -14, 19, -10, -14, 77, -23, 9, -22, -21, 7, -16, -17, 23, 61, 1, -17, -2, -26, 3, -16, -6, 12, -6, -8, 12, -15, -1, -21, -25, 67, -25, -9, -15, 22, 48, 50, 9, -9, -14, 3, 25, -14, 14, 17, 4, 9, -21, -21, 2, -12, -10, -14, -27, -5, +-11, 28, -1, -9, 35, -11, 8, 17, 43, -7, -10, 59, 77, 56, -29, 21, -17, 2, -33, 25, 19, 12, -51, 6, -7, -19, -16, -16, 8, -43, -28, -1, 8, -9, -13, -16, 24, -20, -13, -15, -2, 42, -21, 37, -45, 5, 11, 4, 12, 6, -27, -28, -2, -1, -28, 19, 13, -7, 2, 15, -7, -32, 24, 0, 41, 27, 49, -14, 6, -34, -18, 15, -27, -37, 0, 9, -23, -13, 1, -10, 11, +27, 6, -17, 20, -31, -16, 56, 13, -44, -13, -4, -23, -6, 89, 6, -6, 86, 56, 5, -16, -17, -31, 18, 6, -54, 3, 12, 63, -26, -24, 8, -14, -7, -16, 13, 29, 56, -40, 2, -21, 20, 9, -13, -41, 6, -9, 14, 4, 30, -32, -11, 31, 8, -40, -16, 3, 30, 11, 1, 36, 36, -13, -55, 5, 30, -5, 9, 49, 35, -17, 33, 47, -24, -24, -12, 7, -1, 18, 16, 14, 2, +19, -39, -16, -17, -13, 77, -9, -19, -15, 34, 81, 30, -3, 28, -25, 3, -2, 4, 20, 30, -42, -7, 26, -25, -7, -15, -6, -5, 16, 12, -4, 12, -3, 2, 11, -10, -3, -16, -9, 31, -29, 8, 15, -7, -13, 8, 39, 7, -2, -11, -44, 54, 13, -10, -25, -21, -28, 19, -37, 1, 3, -34, -6, -37, -11, -13, -28, -23, -6, -29, -26, -11, 31, 5, 8, -5, 6, 17, 34, -2, 69, +-57, -11, -18, 1, 10, -18, -12, -11, 26, -35, 27, 6, -11, 18, -17, -17, 40, 16, -37, -4, -41, -13, -22, -34, -39, -16, 38, 32, -72, 1, 17, -27, 38, 88, -43, -17, -19, 127, -95, 42, -19, 6, 15, -28, 9, 2, -53, -23, -8, -24, -31, -31, -55, 10, -59, 9, -70, -18, 54, 29, -54, -4, -13, -49, 63, 104, 29, -46, -47, 127, -84, 20, -16, 41, 1, -59, -15, 18, -33, -31, 11, +-17, -29, -7, -14, -14, -53, 4, -13, 17, 33, 16, -26, 2, -22, -19, -26, -31, 80, -2, -15, -11, -6, -9, 22, 8, -1, -13, 4, 30, 31, 50, -23, -45, -1, -12, -10, 68, 1, 24, 22, 36, 8, -11, 20, -24, 27, -22, 44, -5, -14, -23, 31, -32, 6, -21, 36, -31, -30, -21, 41, 3, 36, 28, -42, -16, 42, -2, 15, 12, 42, -12, 6, -42, 44, -14, -12, -10, 3, 47, -16, -12, +1, -32, 117, -33, 20, -14, 87, -31, 44, 10, -13, 16, -7, 65, -17, 59, 4, 5, -33, 0, 43, -62, 15, -4, -15, 29, 66, 19, 4, 2, 36, 12, 1, -27, -18, 30, 27, -41, -24, 29, -12, -38, -6, -37, 36, 18, 26, 5, -6, -13, -30, -19, 6, -23, 5, -20, -21, 62, -40, 19, 5, -12, 32, -50, 7, -38, -12, -14, 24, 12, 5, -7, -6, -25, -12, -8, 73, -18, 18, -7, -4, +-28, -4, -1, -25, -10, -42, 27, -24, -45, 33, 9, 7, -16, -26, 28, -13, -12, -36, 2, 19, -15, -7, 10, -9, -16, 1, -5, -23, 17, -21, 6, 8, -46, 16, -51, -6, 26, 31, 72, -6, 13, 35, 22, 4, -35, -19, 12, 13, -4, -49, 9, 24, -30, -9, -11, -6, 10, -5, -22, -73, 28, -15, -3, 4, -16, -9, -39, -28, 34, 33, 9, 19, 35, -8, -25, -4, -5, 3, -27, -15, -28, +-20, 33, -9, -6, 16, -10, -24, -9, 8, -1, -6, 5, -14, 84, -5, -4, 7, 11, -16, -2, -35, -26, -53, -33, -14, 7, 9, -20, -16, -44, -7, -7, -24, -9, 25, -12, 3, 5, -21, -10, -2, -45, -17, -29, -21, 24, -1, -28, -7, 10, 6, -22, -74, 85, -19, -4, 12, -12, -8, 6, -20, 88, -35, -44, -40, -3, 28, 13, -10, -11, -6, -29, -32, 0, -35, 28, -15, 0, -16, -47, -3, +-40, 3, 33, 29, -26, -5, -47, 65, -15, -3, -24, 19, -28, -23, -31, -33, 9, 12, -28, 10, 4, -14, -50, 3, 14, 15, -1, -21, -6, -6, -40, 4, -63, 5, -1, 9, 70, -33, -8, 22, 13, 7, -4, 5, 26, 35, -32, -25, -5, 33, -6, -21, -3, -12, -31, -17, -11, 9, 18, -34, 7, 7, -39, -7, -28, 1, 19, 24, -26, -29, 5, 16, -10, 8, 25, 39, -8, 16, -3, -5, -60, +-11, 9, 7, -40, -22, 13, -32, -56, -6, -26, 30, -4, -28, 11, 27, 82, -33, -8, 1, 1, -26, -28, 76, -3, 6, 63, 45, -15, 6, -7, -22, -16, -3, -2, -19, -22, -15, -32, -23, 127, -48, -26, 30, 3, -34, 10, 24, 23, -23, -15, 31, -45, 32, -27, -55, 17, -43, 41, 57, -65, 66, 48, 60, 73, 22, 10, -39, 10, -9, -38, 24, -20, 49, 20, 44, 3, -33, -55, -14, -31, 19, +4, -61, -32, 41, 11, -10, 26, 6, 81, 0, -24, 43, 50, 39, 52, 5, 11, -38, 5, -17, -11, -11, -55, 73, 42, 17, -3, -47, -31, -31, -50, -16, -7, -35, -63, -39, -6, -24, 3, -30, -6, 2, 24, 47, -22, -41, -24, -6, 8, -24, 5, 7, -48, -12, 2, -29, -6, 20, -19, 14, -2, 6, -40, -21, 18, -39, 43, -18, -26, -40, -12, -9, -33, -6, -30, 47, 30, -35, -25, -17, 32, +19, 10, -23, -17, -15, 74, -21, -30, -1, -24, 9, -19, -29, -55, 35, -2, 18, -4, -15, -7, -8, 1, -27, -20, 13, 64, -35, 21, -14, -3, 16, 56, -22, 7, -7, -38, 5, -19, -24, -21, 47, 42, -93, 21, 44, -66, -16, 18, -97, -10, -25, -27, 0, -17, -4, 61, -4, 15, -40, -7, 27, 6, 30, 3, 39, 3, -13, 19, 11, -35, 19, 29, -39, 20, -29, 55, -20, -11, 24, 71, 55, +30, -41, -22, -4, 6, -9, 21, 14, 16, -31, -4, -16, -19, 44, 15, -20, 8, -13, 2, 38, -11, -20, -2, -30, -26, -18, -31, -25, -39, -6, 15, 15, 0, -31, -20, 3, 11, 26, 9, -11, -28, -23, -9, -6, -9, 49, 22, 1, -34, -35, 70, -11, 14, -16, 38, 13, 17, -34, 28, 13, -29, -10, 73, 19, 36, -26, 17, -40, 54, 46, 37, -33, -36, -24, -25, 24, 4, 32, -21, -2, -42, +-9, 72, -8, -7, 25, 34, 3, 11, -21, 37, 5, -36, 12, 35, 37, -8, -17, -24, 13, -19, 5, -27, 11, 26, -14, -14, 7, 0, -13, 18, -5, -14, -8, 5, -2, -35, -11, -20, 1, -33, -16, 8, -43, 20, 15, -13, 8, 30, -6, 11, 11, 12, -2, -28, 14, 25, -16, -14, 48, -11, 5, -17, -4, -14, -21, 5, 31, 105, 22, 8, -4, -54, 16, 17, -39, -4, 35, 30, -4, -11, -35, +-15, 2, 6, -17, 44, -9, -42, -41, -12, 9, -21, 59, -11, 25, -60, -47, 49, -22, -44, 15, 50, 6, 11, -20, 68, 10, -36, -4, 72, 46, -31, 6, -15, -6, 45, 18, -19, 2, -6, 40, -9, -3, 12, -21, -9, -16, -9, -45, 11, -30, 10, 27, 17, -10, -64, 29, 4, 9, -10, 20, 27, 85, -7, 3, -2, -45, 19, -31, 33, 18, -26, -24, -25, -7, -27, 68, 18, 7, -34, -33, 54, +-18, 27, 15, 17, 1, 30, -12, 73, -26, -24, 4, 61, 19, -21, -3, 2, -18, 18, -22, -42, 25, -15, 8, 13, -17, -19, -43, 5, -8, -12, -25, 2, 10, -28, 15, -9, -11, 18, 95, 35, 69, -5, -5, -3, -1, 0, -27, 1, -54, 12, 6, -50, 34, 0, 3, 13, 45, 36, -34, -17, 7, -34, -34, -18, -46, 4, 35, -41, 0, -5, 124, 5, 113, 46, -54, 23, -20, 20, -11, -43, -43, +24, 2, 30, 50, -31, -16, -20, 1, 7, 55, -38, -49, 71, 24, 27, -4, -4, -36, -25, -12, -39, 62, -31, 68, -45, 11, -28, -47, -28, 33, -53, -32, 39, 27, 37, 36, -2, -41, -29, -20, -13, 37, -23, -39, 22, -17, 37, -29, 10, -60, -37, 1, -59, 57, -10, 90, -22, 5, -8, -25, -12, 37, 4, -1, -9, -15, 9, 15, -25, 1, 33, -21, 76, 16, 0, 10, 4, -18, 2, -17, 71, +-60, 10, -21, 2, 127, 53, 22, 21, -29, -25, 28, -23, -19, -14, 7, -11, 14, 14, 0, -17, -24, 127, -38, -22, -7, -22, -14, 15, -69, -18, -10, 90, -21, -44, 8, -9, 20, 27, 1, -23, -12, -46, -15, -22, 49, -31, 58, 39, 46, -28, -7, 38, 3, -50, 57, -17, 21, 27, 15, 28, -31, -34, 2, 7, -6, 15, 3, 78, -55, -21, -48, 94, -17, 19, -27, -24, -19, -18, -12, -7, 29, +14, 6, 24, 0, -38, -45, 2, 7, 34, 37, -46, 2, -2, -41, 11, 21, 32, -9, 0, 6, 47, 13, 30, 8, -6, 20, -9, 55, 16, 10, 19, -27, 5, -4, -5, 4, -25, -28, 2, -25, 34, 10, -27, 0, -21, -5, -3, 17, 44, -17, 22, -1, -11, 25, -14, -24, 30, -2, 35, -12, 17, 7, 20, 55, 31, -10, -4, 5, -3, 9, -5, -1, -25, 14, -11, -42, 18, 25, -25, -19, 45, +7, -20, 2, 127, 26, 20, -25, -26, 9, -8, 16, 29, -8, 33, 77, 21, 1, 12, 1, -14, 20, -3, -47, 7, -14, 2, 4, -18, -24, -20, -20, -4, -21, -14, -3, 127, 25, 39, 5, 0, -11, -25, 34, -38, 4, -5, 12, -3, 1, -42, 7, -1, -21, 10, 36, 31, 65, 12, -7, 28, -32, 0, 8, -14, -35, -8, -22, -4, -3, -21, 35, -3, -19, -14, 15, 31, -13, -6, -6, 26, -4, +-30, 9, -28, -8, 7, 66, 2, 39, -24, -19, 20, 8, 22, 27, -13, -42, 4, -10, 1, 54, 44, 45, -16, 28, 17, -1, 68, 3, 28, 84, 25, -43, 6, -18, 9, -41, -13, -25, 14, -19, -18, -29, 9, 22, -13, -25, 15, 7, 2, -12, 127, 29, 19, 14, -27, 15, 17, -11, -1, -36, 4, 65, 13, 4, 2, -25, -49, -22, -11, 0, 50, 60, 19, -4, 9, 91, 1, 6, -34, -13, -18, +-40, 57, 21, 20, 49, -14, -3, 3, 1, 33, -5, 30, 48, 0, -30, 33, -10, 12, -20, 1, -28, -10, -3, -21, -45, 11, 32, -2, -32, 16, -5, -34, -4, 127, -23, 12, -12, -25, -5, -16, -17, -20, -5, 12, 13, 1, -13, 31, 64, -8, 7, -22, 32, -24, -30, -5, -14, 23, -19, -22, -6, 11, -16, 57, -9, -16, 42, -2, 47, -24, 4, -23, -2, -25, 28, -15, 87, -18, -48, 68, 95, +6, 36, -26, 36, -36, -29, -23, -42, 34, -26, -16, -1, -21, -5, 18, -45, -29, -15, 3, -12, 86, -26, -29, -11, -36, 18, -18, 20, 71, -43, -70, 30, 50, 35, -51, 10, -44, -26, -49, 89, 1, 71, 28, -31, -61, 32, -32, -38, -19, 11, 47, -40, 120, 14, -25, -62, -10, 20, -48, 40, 31, -11, -68, 28, 63, 52, -46, 26, -14, -4, -63, 82, -20, 24, 45, -17, 0, 49, -3, -29, 7, +9, 73, -34, 67, 2, 41, -35, 18, 5, -1, 2, -39, -2, 73, 126, -2, -3, 17, -12, 8, -43, 83, -10, -1, 2, 0, 11, 29, -43, 30, -34, -6, 16, 12, -3, 4, 62, 3, -15, 21, 9, 32, 2, -43, 10, 36, -2, 31, -22, 82, 8, -24, 14, 18, 6, 25, 8, -27, -57, 14, -27, 30, -66, 41, 21, 21, -16, -2, 32, 12, -41, 102, -22, 22, 104, 33, 16, 37, 14, 14, -52, +-58, 28, 109, -53, 5, -11, -4, -58, 10, -4, 20, -28, 33, 3, 7, -34, -33, -44, -11, 21, -25, -11, 21, 4, 30, 42, -7, -55, -8, -10, 28, -3, 3, 17, 24, -12, -15, 39, 41, 51, -49, 45, -11, 10, -43, 24, -63, -44, -9, 61, -29, -7, -18, -14, -7, 0, 18, -21, 17, 14, 3, 10, -13, 12, -12, -27, -2, -25, -11, 47, -15, 40, -56, -7, 12, -24, -11, -7, 9, -13, -8, +17, 14, 10, -45, -7, 18, -9, -57, -10, 5, 3, -6, -33, -7, -11, -6, 11, -38, 1, 44, 11, 10, -12, 38, 29, 15, -6, -21, -13, -24, -15, -13, 2, 50, 8, -21, -13, 4, -18, -49, -10, -6, -7, 41, -47, -6, -38, 16, 48, 0, 17, 33, 26, 58, -12, 35, 10, -5, -10, -11, -31, 0, -36, 31, -17, 30, -9, 6, -12, -16, 2, 75, -18, -4, -5, -20, -11, -5, 3, 76, -50, +12, -7, -20, 5, 94, 25, -3, -12, -4, 10, -2, 27, 55, -40, -15, 69, 1, -17, 8, -11, 8, -2, 59, -25, -14, -36, 21, -20, -32, -23, 59, -17, 8, -36, 52, 13, 84, -28, -21, 18, 6, -29, 2, 13, -32, -16, -17, 9, -32, 0, -7, -17, -12, -37, -76, -6, 15, -14, -1, -38, -1, -33, 29, 63, -47, 24, 24, 45, 51, -11, 58, 23, 28, -10, -23, -64, -10, -39, -9, 39, 2, +12, -8, -20, -4, -8, 45, 45, 6, 8, -26, -30, 14, 43, -25, -23, 4, 20, -6, 13, -15, -17, -35, 32, 15, -8, -26, 10, 63, -14, -11, -2, -25, -12, -11, -19, -19, -40, -37, -15, 19, -13, -24, -25, -3, -42, 19, 50, -21, 5, 17, -11, 14, 5, 64, 26, -6, 2, -25, 15, -19, -48, 2, 13, 13, 4, -25, -14, 76, 23, 22, -8, 0, -16, 6, 24, -32, 6, 101, -12, -17, -20, +-16, 5, -49, 62, 19, -3, -13, -19, 18, 6, -21, 7, -14, -4, 39, 21, 99, -16, 67, -25, 21, -42, -13, -17, 12, -19, -11, 18, 3, -25, -17, -21, -14, -14, -21, 46, 19, 15, -13, -48, 19, -38, -22, 28, -14, 12, 7, -27, -47, -33, -2, 9, 12, -26, -20, -34, -35, -51, 126, -11, -13, -53, -26, -33, 26, 8, -27, -6, -63, -36, -9, -6, 20, -4, -63, -5, -19, 29, -8, -72, 2, +-46, -16, 31, -26, 7, 2, 36, -25, -30, 115, -24, -17, -20, -4, -38, 48, -2, 14, -32, -44, -19, -40, -18, -1, 7, -79, -15, 3, 0, -2, -44, 46, -4, 27, -29, -14, -37, -9, 2, -12, -6, -38, 3, 53, -34, 3, -41, -9, 38, 6, -3, -34, -6, 10, -2, -10, -26, -32, 16, -31, -33, 15, -4, -8, -15, -16, 111, 9, -31, 24, -66, 34, -7, -24, 40, -28, 13, 17, 6, -4, -10, +-15, -26, 5, -44, -19, -33, 35, -33, 19, 0, -14, 51, -40, -24, 8, 3, -29, 3, 3, -5, -26, -7, -10, -7, -27, -10, -43, -3, 21, 39, -31, -12, -34, 5, 7, -6, -51, -43, -26, 6, 40, 127, -7, 50, -8, 2, -1, 47, 70, -17, -19, 0, 1, 54, -20, 29, 44, -79, 1, 26, -8, -19, -53, -26, -20, -23, 18, -6, -24, 8, -20, -10, 7, -42, 19, -16, -31, 21, 33, 5, 23, +11, -8, 11, -37, -4, -20, 15, -11, -8, 27, 14, 21, -25, -14, -25, 15, 28, -5, -20, 10, 29, -15, 8, 49, -7, 46, 0, 2, -34, -20, 10, 15, -25, -44, -15, -10, 16, 0, -6, 88, -8, 32, 21, 34, -42, -24, -6, 35, -36, 82, -4, 64, -7, -23, -9, -8, -18, -26, -7, -43, 38, 2, 24, 30, 2, -2, -1, 31, 3, -4, -12, 50, -16, 24, 48, 29, -21, -35, -4, -5, -37, +52, -3, 7, -7, 36, -30, -3, -40, -34, -8, -21, -12, 12, 22, -11, 0, 30, 9, 28, 30, -48, -20, -24, 22, -18, 27, 30, 22, 13, -19, 10, -23, -8, -49, 29, 7, -5, 19, 2, 13, 11, -9, -27, -20, -1, -12, -4, 21, 17, 12, 74, -27, -14, 38, -18, -25, -6, -3, 13, 33, 10, -12, -7, -26, 13, -21, -33, -39, -21, -2, -8, -33, -24, -15, -22, 2, 29, 62, 39, -8, -9, +-9, -3, 9, 4, 62, 40, 7, 75, 35, 50, -40, -13, 0, 19, -17, 59, 1, 82, -38, -20, -34, 12, -52, -35, -32, -41, 14, -2, -3, 43, -28, 53, 16, 49, 7, -18, 2, 65, 37, -22, 14, 14, -39, -32, -27, 31, -7, -7, -10, 7, 37, -31, -54, 31, 9, -10, 15, -1, 18, 0, 47, 12, -21, -18, -20, -15, 2, -13, 27, 81, 51, 68, 41, 51, -5, 1, -8, 39, -11, 57, 2, +52, -6, -26, -26, 17, -24, -43, 12, -10, 4, -22, -19, -7, 1, 50, 16, 39, -33, 28, -50, -19, 17, 8, 15, -17, -30, 34, 27, -23, -8, -7, 17, -32, 15, -27, -37, 29, -13, -13, -16, -10, -10, -38, -28, 8, -5, 4, 92, -10, -40, 66, -34, -8, 10, 11, 46, -34, -31, 27, -3, -26, -12, -28, 34, -21, 22, -53, 4, 46, -15, -30, 2, 18, 1, -42, 1, -21, -12, -31, 42, 57, +-2, -27, -35, 0, -39, -36, 27, 12, -5, 12, -25, -8, -23, -24, -17, -12, -4, 12, -21, -30, -36, -29, 14, 43, 6, 39, 8, -21, -15, -5, 71, 15, -16, -33, -15, -2, -26, -31, 21, 18, 15, 32, -29, 27, -23, -26, 19, -26, -11, 17, -4, -40, -22, -14, -9, 10, 0, -50, 28, -18, -17, 18, -7, -12, -31, -17, 13, -14, -6, -17, -2, 13, -26, 48, -8, 11, -5, -49, -5, 53, 17, +-22, -12, -9, -22, -41, -29, 4, 13, 6, -41, 15, -17, 10, -24, -19, 7, 69, 8, -8, -49, -49, 21, -7, 87, 21, 27, 39, -8, -25, -3, -14, -29, -34, 19, -23, 8, -1, -4, -25, 11, 25, 28, 1, -34, -2, 8, 100, 39, -28, 42, -54, -26, 76, 62, -45, 54, 2, -44, -33, 3, 88, 59, -13, 33, -27, 99, -15, -35, 9, 41, 45, 0, -53, -18, -12, 12, -17, -24, -22, -12, -48, +-26, -5, 20, -25, -30, -43, -59, 14, 69, -17, -30, -32, -11, -38, -12, -27, -7, 5, 127, 13, 7, -14, -8, 72, -12, -13, 2, 49, -24, -5, -15, -8, -24, -30, 19, -16, -40, -35, 8, -20, -13, -10, -14, 13, -9, -26, -12, -61, -19, 9, 127, -15, -8, 23, -8, -16, -10, 27, -8, 20, 17, -47, 8, -1, -22, -29, -27, 58, 21, 0, -10, 21, -20, -3, -28, -20, -23, 2, 28, -34, -39, +-52, 74, 28, -14, -8, -20, -8, -22, -19, -5, 12, -19, -57, 13, -3, -11, 13, -19, 33, 67, -19, -29, 13, -8, 9, -35, -17, -7, 9, 0, -17, -28, -34, 66, 22, -15, 4, 12, -2, 22, -7, -39, -10, -7, -8, -3, -5, -17, -21, -26, -38, 1, -14, -29, -20, 2, -10, 8, 27, -29, -9, -7, -11, -1, 19, 127, -16, -24, -10, -24, 9, 54, -23, 44, 32, -4, -18, -7, -20, -21, -18, +-27, 7, -12, -12, -5, -39, 2, 5, -41, -4, -23, -10, 16, -32, 18, -8, 127, -8, -21, 15, 1, -34, -11, -2, 4, 21, -12, -29, -28, -8, -19, -32, 17, 15, 60, -10, -6, 14, -25, -18, -23, -22, -65, 22, -53, -31, 4, -50, 35, 12, -14, -44, -39, -14, -50, 4, 23, 14, 28, -48, -31, -5, -47, 25, 9, 6, 5, -36, -43, -16, 16, 60, -29, -7, -21, 0, -28, -28, 2, -11, 127, +-30, -11, -2, -12, -29, -26, 7, 6, -7, 12, -14, 29, -9, 2, -7, -24, 9, 27, 15, -14, 5, -7, -11, -60, -24, -11, 9, 11, -38, -5, -29, 20, 21, 6, -35, -32, -29, -36, -17, -4, 15, -17, -47, -21, -11, 0, -39, 22, 16, -8, 59, -34, -33, -20, -54, -37, 47, 11, -29, -19, 25, -33, -5, 61, -25, 58, 8, -53, 9, -67, 21, -5, 8, -2, -33, -5, -7, -60, -42, 74, 18, +-26, 75, -26, -62, -41, -75, -42, -15, -61, -81, -7, 22, 1, -15, 58, -20, 31, -32, -25, 35, -13, 39, 29, -6, 4, -17, -32, -19, -11, -26, 6, 35, 23, 50, -3, -25, -37, 87, -12, 7, -34, -27, -10, -50, -39, -6, 20, 12, 75, -35, -31, -7, -39, 26, -10, -8, -2, -23, -31, 25, -19, -38, -30, -1, 18, 48, -21, -45, -3, 72, -45, 2, -18, 18, -34, -38, -18, -7, 0, -10, 62, +-20, -20, -13, -29, 0, -15, -11, 32, -11, -46, -9, -24, -4, -36, -15, 5, 29, 70, -16, 7, -4, -48, 32, 54, -22, 8, 49, 6, 0, -20, 27, 32, -2, -12, -10, -21, 8, 15, 5, 14, 26, 3, 0, -13, 9, 127, -1, -11, 0, -14, -45, 21, 3, -7, 16, -46, 14, -23, -16, 0, -7, 10, -4, -13, -8, -2, -29, 13, 10, -9, -44, 68, 4, 5, -46, 10, -50, -32, 22, 10, 6, +74, 56, -48, 94, 50, -1, 31, -25, 15, -3, 47, 18, 0, 50, 76, -20, 52, 14, -24, -32, -5, -53, -3, 16, -11, -26, 16, -11, -32, -52, -41, 9, 8, 1, 20, -8, 21, 36, 44, 17, -14, 23, 16, -26, -48, 17, 2, -17, -13, 5, 8, 11, 43, -24, 62, 11, -13, -3, 36, 58, 29, 15, 33, -31, 57, -25, 5, 17, 8, -56, 41, -22, 25, 36, -17, -48, -62, -6, 21, -9, -6, +-1, 27, 10, -19, -27, -25, 12, -33, -13, -19, -6, 17, 21, -5, -31, -22, 54, -17, 15, -30, -31, -5, -26, -33, 46, 7, -15, -27, 19, 26, -18, -28, 65, 2, 60, -40, 4, -46, 28, -57, -11, 19, 38, -45, 22, -45, 13, 42, 8, 5, -28, 33, -9, 68, -10, -48, -37, -19, -20, -29, -14, -2, -14, 27, 7, 67, -18, 38, -48, -57, -10, -21, 60, -29, -45, 67, 23, -34, 0, 71, 42, +-3, 16, -22, -47, 52, 1, -19, -59, -57, -11, -81, 28, 13, -32, 73, -13, 6, -34, 6, -32, 7, 15, 5, -9, -39, -32, 14, -24, -9, -28, 10, -5, -22, 40, 34, 2, 52, 55, 11, -25, 17, 6, 0, -2, -28, -33, -28, -16, 124, -20, 52, 11, 25, -21, -37, -10, -26, -64, 24, 51, 9, 12, -3, -44, -47, 78, 16, 2, 81, 21, -11, 41, -18, 29, 65, -42, -24, -37, 116, -13, 13, +-12, 57, 24, -2, -20, -26, -25, -44, 14, 27, 4, -19, -36, -17, 25, 32, -54, -12, -4, -85, 10, -26, -6, 21, 40, -10, -48, 69, 4, -12, 13, -15, -23, -5, -21, -44, -14, -10, -11, -2, -12, 12, 15, 8, -81, -9, -33, -13, -38, 94, -7, -4, 17, -6, 21, -18, 12, -13, 26, -31, 3, 89, -41, 6, -15, -9, -22, -27, -30, -19, 37, -41, -12, 32, 49, -28, -81, 45, -7, -20, 44, +41, -21, 12, -22, -3, -16, 26, 28, 48, 30, -22, -13, 50, 8, 3, -22, -35, -44, 27, -14, 33, 63, -35, -10, 11, -19, 33, -34, 28, 9, -16, -19, -37, 11, 20, -39, -37, 2, -9, 1, 37, 87, -57, -13, -23, 29, -36, 2, -19, -11, 7, 0, 0, -36, 3, 17, -3, -9, 46, 31, -27, -24, -2, 3, 14, -25, -26, -16, -7, -16, 2, -17, 16, 9, 17, -30, 29, 34, -42, -2, -14, +50, 50, 34, 8, -32, -17, -32, 0, -13, -6, 13, 2, -63, -14, -9, -6, -11, -17, -39, -7, -5, -18, 9, -12, -18, -35, -23, 4, -31, 46, 74, 46, -26, 13, -25, -25, 3, 3, -3, 5, 69, 13, -10, -9, -7, -12, -25, 6, -12, -16, 6, 14, -29, -19, 8, 3, -44, 56, -29, -8, 13, 0, -14, -4, 33, 20, -16, 54, -40, -20, 1, 8, 0, 27, 3, -10, 11, 22, -25, 1, 1, +-35, -20, -26, 25, 27, 20, -23, 54, 16, -15, 0, -38, -27, -60, -19, 13, 6, 42, -13, -65, -56, 34, -25, -84, -80, 20, 34, -24, -1, 3, 59, -14, -72, -41, -64, -22, 26, 31, -27, -43, -28, -15, -49, 85, -5, -29, 7, -5, 3, 7, 0, -25, -30, -1, -20, 28, 15, -4, -5, -11, -14, -13, 8, -10, 32, 36, -27, 96, 18, -33, -6, 17, -16, -46, -10, -26, 20, 15, 39, 3, 11, +9, 25, 0, -40, -33, 19, -11, -2, -10, -15, 0, -30, -2, 5, -7, 5, -37, -7, 36, -10, 6, -34, -11, 62, 14, 2, 16, 2, -18, 8, -17, 5, -4, -5, -17, -46, 77, -4, -4, 23, -24, 25, 9, 28, 28, -11, -15, -34, -16, -8, 6, -26, 40, -18, 21, -1, 10, -70, 78, 0, 14, -25, -27, -14, -49, -72, 9, 5, -5, 12, -24, 22, 60, -25, -23, -7, 1, -13, -27, 21, -46, +-35, -1, -62, 1, 1, -10, -37, 42, 6, -35, -16, 75, 78, -50, -56, 96, -18, -56, -56, -22, 34, -25, 94, -69, 64, -39, 43, -12, -14, 38, -29, -14, -13, 28, -62, -17, 21, -28, 22, -19, 97, -26, -1, 4, 18, -12, 38, -4, 9, -3, -3, 14, 13, -5, -7, 90, 20, -5, -9, 52, 37, -2, 62, 3, -2, 21, -47, -7, -12, -28, -18, -14, -41, 17, -11, -13, -19, -34, 126, -33, 127, +-9, -2, 54, -18, -54, -13, 86, -43, -38, -47, -75, 8, -12, 104, -10, -3, -77, -40, 3, -26, -4, -3, 90, 33, -20, 43, -22, -9, -29, -6, -69, -60, -29, -36, 18, -5, -2, 34, 7, 43, 26, 44, 10, 31, -26, -28, 12, 16, -21, 12, 13, 39, -23, 4, 20, 44, -17, -12, -44, 3, 92, -41, -61, 7, -4, -13, -60, 52, -8, -32, -18, 0, 19, 66, -13, -11, 3, -9, -23, 31, -14, +-27, -83, -19, 27, 32, -43, -48, -9, -26, -26, -13, 58, 20, -72, 57, -22, -6, 20, -24, -29, -27, -46, 44, -28, 46, -2, -57, -3, -19, -26, 18, 58, -36, 104, -49, -6, 45, -18, -47, -18, 36, 4, -12, 16, -22, -47, 73, -41, -3, -11, 17, -15, -41, -4, -25, -38, -27, -12, -30, -46, 36, -56, -16, 29, -42, 5, -23, 32, 22, -37, -55, 61, 60, 0, -44, -29, -9, -24, -14, 1, -17, +6, -2, 23, -15, -7, 0, 23, -17, -1, -17, -10, 7, -12, 8, 38, 0, -18, -1, -34, -26, -5, 15, 116, -36, 11, -44, -18, 26, 1, -2, -7, -12, -14, -1, -2, -57, 29, -12, 26, 14, -29, 21, -33, -3, 11, -13, 35, 69, -46, -20, -28, -18, 51, 45, 12, -14, -10, 57, 57, 22, 18, -49, -18, -15, -17, 11, -7, -16, -40, -19, -25, 4, 32, -2, -21, 38, 7, 2, -18, 30, 26, +-9, 32, -29, -14, -39, 11, -6, -13, -14, 27, -9, -36, -11, -14, 36, -21, 38, -4, 73, -39, 18, 3, 9, -23, 3, 12, 13, 7, 7, 14, 46, 9, 11, 1, -21, 14, 23, 29, 39, -39, -64, -39, 34, -7, -16, -33, -15, -36, -26, -16, -5, -16, 3, -41, 22, 89, 41, -12, -25, -40, -4, 41, -12, -46, 35, -41, -9, -41, 35, 39, 1, 2, -28, 5, -22, -12, -19, -39, -4, -14, -14, +-45, 10, 14, 47, 31, -5, 0, -2, -32, -25, -10, -12, -9, 12, 38, -19, -2, -28, -31, -30, 2, -39, -31, -4, -43, 59, 14, -37, 7, -39, 1, 46, -23, -6, 96, -28, -29, 28, 7, -5, -17, -21, 4, -9, 1, -7, 21, -29, -8, -50, -15, 15, 40, 22, -2, -18, -8, 30, 29, 3, 13, -1, 17, -9, 8, -9, -45, 10, -8, -18, -28, -27, -11, 51, -27, 5, 4, 0, 1, 14, -12, +-23, -3, 29, -10, -35, -55, -9, 14, 6, 3, -2, -35, 14, -7, 114, -21, -55, -6, 22, -4, -32, -50, 9, 13, 12, -37, -30, -35, -43, -14, -13, -28, -38, 58, 111, 36, 46, 35, -12, -37, -9, -39, 5, 65, -45, -37, 65, -64, 6, -18, 45, 8, 60, 7, 32, -13, -23, -16, 20, 4, -17, 36, 57, 27, 12, -9, 35, 6, 20, -42, -1, 19, 8, -1, 48, 44, -11, -9, -34, -23, 60, +51, -28, 16, -4, -21, -5, -4, -13, -11, -16, 2, -4, -17, 127, -4, 15, -19, -10, 29, -22, 88, -13, -9, 40, 46, 74, -63, -30, -27, -26, 47, 24, -16, -38, -29, 5, 16, 6, -47, 74, -11, -35, -11, 13, -5, 90, 29, -18, -10, 68, 21, -19, -22, -15, -17, -13, 49, -15, 31, -21, 18, 89, -31, 48, 20, -4, 57, 16, -59, -20, -6, -12, -16, -37, -22, -67, -16, -18, 24, -6, -8, +-7, -3, 8, 23, 60, -25, -17, -28, 3, 30, -53, 23, -14, 106, -30, -52, -5, -41, 127, 5, -12, -38, -8, 9, -16, -45, -25, -27, -35, 43, 13, 34, -49, -30, -1, 15, -29, -36, 24, -19, -2, 42, -42, -41, -50, 28, -2, -6, 7, -45, -20, -7, -11, -20, 2, -15, -34, 10, -19, -34, 42, 46, 20, 43, -15, -47, 4, 24, -5, 33, -2, -1, 74, -4, -48, 5, -37, 4, 7, 16, -36, +-27, 5, -3, 5, 15, -18, -33, -26, 17, -29, -43, -44, 8, -42, 0, -45, -33, 3, -28, -13, 6, 54, -13, 11, 0, 51, 4, -16, -11, -6, -12, -3, 9, 34, 40, 7, 8, 0, 32, -14, 5, 10, -16, -1, 16, 38, 9, -31, 1, 36, -36, -32, 17, 11, 9, -10, 53, 24, -29, 16, -18, 27, 15, -5, -7, 71, 39, -20, 18, -56, 6, 14, -25, -11, 17, -36, 0, -15, -27, -50, -47, +24, -3, -24, -34, 71, 28, 37, -24, -26, -26, 2, 11, -38, -7, -10, -42, -1, -24, 35, -31, -18, 30, -28, 82, 4, 6, 2, -10, -17, -9, -4, -6, -2, 16, -14, -21, -2, -10, -7, -7, -12, 22, -27, 3, -12, -22, 6, -11, -16, -8, -2, -17, -13, -15, -7, -17, -16, 22, -11, -31, 7, -28, 7, 29, -59, 29, -14, -4, -29, -27, 48, 53, 40, -66, 53, 16, -24, -24, 21, 11, -43, +5, 0, -101, -43, -5, -58, 56, -16, 127, -66, 29, 40, -71, -6, -5, -3, -26, -6, 30, 23, -25, 46, -30, 49, -18, 27, -13, 0, 19, -17, 31, -32, -23, -6, 32, 20, -16, -6, -8, 3, -27, -24, 1, -7, 18, 32, 4, 108, -29, -9, -10, 6, -21, 20, 25, 34, -56, -6, -21, -16, 12, 64, -17, 12, 19, -12, -40, 49, 29, -16, 49, -17, 13, 29, -30, -9, -14, 1, -2, -35, 2, +-3, -17, 3, -23, 36, 33, -48, -29, 34, -16, -10, 1, 23, 24, -15, 44, 14, -46, 11, -11, 13, 51, -23, 34, 8, -16, -8, 9, -9, 19, -20, 44, -99, -32, -37, 13, 61, -3, -11, -44, -73, 31, 9, 85, 74, 14, 0, 39, 65, -15, -10, -21, 21, 20, -22, -19, 47, -51, -6, 14, 11, 60, 107, -48, -25, -2, 125, -76, -66, -46, -35, 98, -23, -23, -19, 16, -103, -14, 6, -60, 2, +56, 78, 33, -50, 19, 43, -27, 0, 51, -34, -11, -17, -11, -14, -38, -20, 45, -16, -7, -13, 17, 45, 32, -33, -13, -25, 0, 42, 13, 32, 49, -9, 17, 11, -1, -7, 0, 22, 37, -16, 2, -14, -15, 9, 26, -47, -23, -21, -29, 18, -35, -6, 39, -4, 6, -31, -42, -31, -78, 59, -9, 38, 25, 37, -44, 15, -45, 10, -34, 9, -16, -37, 16, -31, -11, 15, -23, 9, -13, 0, 2, +5, -37, -45, -9, 25, 0, -15, -11, 16, -7, 20, -24, 29, -32, 15, -14, -26, -9, -26, 117, -14, 10, 2, -9, -3, -15, 31, 16, -28, -3, -16, 71, -24, -43, -57, 43, -45, 41, 16, 13, 23, -15, 24, -25, 63, 18, 89, -9, -46, -15, 9, 26, -15, -30, -32, -19, 9, 13, 21, 33, -26, -64, -11, 106, -8, -68, -75, 27, 18, -33, 2, -22, -20, -10, 38, -71, 105, 70, 94, 11, -60, +57, -24, 11, -30, -84, -60, -19, 49, 52, 25, -6, -37, -15, -6, 30, 36, -28, -81, -54, -1, -43, -13, -36, 26, 3, 50, -79, 21, 39, -5, -42, 14, 46, -15, 25, 13, 11, -44, -34, 58, -2, 75, -22, -7, -5, 8, 58, 25, -22, -3, -31, -32, -3, 127, -6, 2, 19, 21, -16, -8, -8, 21, -12, 8, -24, 7, -13, -24, -10, -15, 9, 3, -9, 8, 127, -30, 6, 12, 10, -32, -38, +7, 11, -22, 9, -11, -18, 6, 9, -18, -1, 24, -10, -2, -22, -3, 1, -4, 72, -36, -1, 47, -22, 12, 2, -4, 68, 2, -30, -37, 2, -31, -5, 5, 66, -19, -15, -26, -11, 42, -43, 3, -36, 0, -14, 18, 70, 14, -35, 50, 74, -14, 25, -16, -26, -10, -18, -17, -1, 9, 59, -4, 92, -13, -29, 32, -14, -28, -9, 11, -25, -1, 26, 78, 21, -13, 10, -27, -14, -1, -11, -4, +-34, 7, -5, -43, 33, 2, -36, 13, 35, -24, -41, -80, -12, 18, -33, -2, -4, -45, 47, -46, 10, 41, -76, 43, 23, -18, 7, -2, 48, 77, 12, -20, -41, -13, 11, -11, 32, -24, -47, 59, 58, -18, -27, 31, 4, -8, 6, -3, 6, -29, 8, -44, 25, -20, 8, -29, -53, -30, -28, -11, -34, -9, 41, -19, 6, -17, -23, 7, 13, -22, 18, 3, 39, 10, 5, -21, 7, -15, 9, -4, -21, +-34, 26, -11, 9, 49, -34, 15, -4, 0, -22, -9, -34, 43, -5, -3, -15, 127, -12, -32, 12, 3, 25, 4, -42, -41, 32, -44, 21, -2, -28, 47, -2, -41, 38, -50, 1, 17, -54, 56, -3, 10, 22, -13, 104, 18, -2, -40, 15, 32, -4, -37, -1, -23, -2, -4, -8, 51, 50, 28, 1, -2, -25, -51, 11, -33, 2, -47, 61, -41, -32, 96, -5, 13, 7, -55, 19, -17, -13, -38, 6, -4, +7, 24, 18, -22, 28, -10, 41, 7, -41, -8, 11, -65, -40, 21, -12, 8, -12, 14, -14, 8, 58, -5, -49, -47, -11, 89, -61, -40, -4, 87, -8, 11, -28, -78, 61, 16, -35, -61, 7, -21, -34, 21, -28, -27, 37, 43, 0, 28, 30, -36, 0, -15, -27, -17, -35, 29, -8, -22, -16, 42, 15, 16, -19, -7, -21, 55, -11, 22, -48, 12, 4, -8, -28, 11, -33, -22, -5, -46, -54, -38, -21, +-2, -7, -3, -25, -25, 13, -36, -16, -32, -44, 0, -25, -34, -48, 12, -23, -40, -23, 31, -22, 14, 6, -38, -13, -2, -24, 1, -29, 34, -25, -47, 7, -32, -19, -27, -17, -11, 45, 26, -4, 28, 2, 29, 33, -18, -4, -29, -25, -9, -15, -27, -10, 20, 10, -3, -61, 10, -15, 124, 80, -51, -25, -25, -7, -30, 19, 31, -39, 1, 25, 0, -39, 12, -57, 37, -20, -45, -28, 16, 22, 26, +-14, 49, 18, -21, -40, 60, -33, 7, -27, 64, 84, -9, -46, 23, -52, 53, -27, 55, -25, -15, 0, -25, -34, -11, -8, -58, 15, -37, -36, -8, -28, 64, 83, -7, -31, 10, -25, -23, -30, 15, -18, 13, 31, 41, -35, 38, -16, 10, -30, 33, -22, 12, 5, -30, -4, -31, 6, 17, 39, 2, -65, -32, -23, 8, -48, -46, -11, -7, -7, -18, -26, 0, -26, -43, -19, 23, 19, -34, 11, -12, -2, +15, -22, -15, -12, 29, -31, -8, 3, -18, 11, 0, 14, 22, 1, -24, 12, -6, 14, 24, -21, -18, -20, 49, 11, -43, -26, -49, 3, -2, 6, -6, -14, -32, 14, 39, 22, -25, -44, 9, 38, -19, -50, -4, 10, -35, -4, 23, 120, 37, 12, 18, -26, -22, -14, -12, -29, 16, 29, 16, 16, -52, 97, -30, -8, -39, 1, 14, -30, -40, 0, 24, 2, -44, -29, -8, -12, 9, -7, -11, -25, 51, +11, 32, 34, -24, 35, 3, -8, 5, 21, 7, -20, -28, 25, -26, -35, -12, 40, 2, 18, 11, -12, 62, -9, -1, 9, 4, -3, 9, -9, 14, 5, -9, 35, 6, -24, 74, 13, 47, 9, 8, 4, -6, -22, -33, 35, 46, -54, 53, -66, 111, 53, 11, 11, -25, -25, -48, 70, 61, 31, -16, 82, 48, -31, 14, -21, 49, 32, 33, -12, -18, 1, -57, 95, -10, 33, 45, 0, -1, 9, 17, -16, +79, -19, 8, 20, -7, 11, 59, -10, 41, 28, 4, 49, -2, -27, 8, -31, -13, -8, -19, -22, 22, 31, 19, 21, 42, -31, -37, 25, 14, -6, 34, -33, -3, 5, 1, 0, -59, -9, -26, 2, 39, 49, -8, 28, 24, 56, 30, -4, -3, -22, -16, -1, -26, -8, 16, 21, -6, -20, 17, -13, -10, 28, 25, -20, 86, 25, 10, 5, 2, -7, -8, 127, -21, 18, 48, -9, 67, 39, 2, 4, 6, +4, -43, 21, -46, -1, 107, 11, 39, -11, -18, 1, -5, 61, -43, 0, 37, 109, 11, -10, 12, -25, -3, -38, 47, -17, -1, 47, -10, 78, -30, 42, 62, -69, 127, 4, 23, -47, 0, 17, -2, -12, -5, -14, 73, -9, -12, -32, -85, -22, -20, 14, -24, -16, -53, 27, -31, 82, -59, -15, -5, -33, -78, -44, 44, -10, -19, 13, 10, -16, -23, 31, 30, -47, -30, -14, -38, 18, 13, -2, -13, 48, +-33, -22, -32, -1, 21, -59, -15, 7, 11, -1, -43, -5, -25, -2, -21, 16, 60, 40, -9, -3, -36, 79, -10, 18, 33, -2, 5, 23, -3, -5, -40, 59, -47, 18, -25, -67, 63, -9, 4, 16, 86, -29, -30, 41, 1, -64, -5, -3, -2, -45, 1, 34, 47, 69, -31, -18, -2, 1, -12, 0, 8, 3, -40, 75, -15, -19, 52, -28, -50, -23, 33, 4, 7, 10, 59, 41, -15, 46, -22, -33, -23, +6, 29, 5, 18, -6, 78, 23, 2, -25, -43, 3, 5, 14, -10, 11, 19, 38, -9, -26, 71, -22, -46, -1, -14, 11, -18, 9, 4, -26, 12, -4, -34, 0, 29, -68, 7, 1, 50, 31, -14, 27, -10, 43, 26, -13, 10, -8, -28, 41, -22, 5, 23, 34, -76, 12, 52, -18, -63, 10, -31, 8, -17, -11, -9, -31, 8, -59, 109, 29, 63, 27, -23, -8, -52, 32, 43, -19, -20, 59, 12, 50, +44, 19, 53, -7, 40, -41, -22, 10, 6, 70, 28, 40, -67, -9, 10, -4, -44, -5, -14, -20, 25, 25, 5, -26, 3, -13, 8, -21, -27, 13, -44, 11, -8, -15, 51, 23, 41, 18, 6, -5, 28, -6, -8, 19, 14, 37, 54, 16, -8, -12, -47, -21, 5, 60, 48, 9, -20, 22, -5, 6, 51, 54, -59, 2, -7, -44, -21, -22, -9, 32, 16, -6, -20, 9, -20, -29, -18, -5, -3, -27, -10, +23, 22, 3, -73, 36, 90, -10, -4, -29, 23, -43, 5, -32, -5, 24, -17, -40, -43, 19, -16, 53, -22, 50, -30, 60, 0, -8, 17, -18, 11, -25, -1, 15, 11, -3, -8, 16, -5, 12, -32, -24, 17, -9, 44, 4, 12, -6, -10, 2, -2, 11, -14, 10, 7, 31, 9, -1, 10, 87, 3, 21, 5, -24, 34, 61, -11, 47, 7, -36, 0, -2, -1, 17, -4, -14, -44, -30, 6, -4, -20, -1, +-1, -13, -4, -12, -25, -49, -48, 25, 1, -48, -31, 13, 42, -20, 20, 29, -9, -4, 22, -21, -3, 54, -19, 8, -33, -13, -20, -10, 28, -11, -14, 127, -34, -14, -10, 11, 22, -30, -14, 48, -1, -30, 22, 10, -45, 19, 7, -36, -14, 5, -20, -1, 9, -31, 13, 33, 0, -1, 10, -21, 5, -43, 7, -17, 30, -7, 43, 2, -10, 17, 33, 47, 22, 2, 15, -1, 8, -54, 20, 26, -26, +21, 2, -10, 27, -5, 18, 9, -16, -27, 31, -6, 53, 27, -16, -9, -18, -4, 44, -20, -13, -7, -46, -14, 8, -44, 5, 17, 38, 28, -38, -43, -19, 32, -8, -4, 18, -28, 2, 1, -15, -36, 45, -16, 17, -51, -33, -26, 16, 3, 22, -18, -39, -10, -41, 6, -5, 0, -45, 61, 104, 5, 111, 42, -30, -23, 18, 20, -15, 39, -17, 6, -90, -33, 81, 60, -32, -2, 54, -12, -32, 24, +24, 62, 26, -64, -56, 121, -9, 124, -48, -20, 46, 22, -1, -10, -31, -13, 0, 35, 17, -25, -37, 8, -9, 80, -9, 36, -7, 17, -15, 6, -7, -11, -38, 41, 44, 25, 9, 48, -23, 5, 5, 0, -29, 2, -14, 127, 32, 2, 26, 55, -19, -11, 24, 108, -24, -51, -22, 32, 74, -17, -3, -38, -11, -50, 79, -53, 103, -14, 8, -12, -31, 13, -22, 4, 6, -44, -8, 14, 1, -31, -1, +2, -26, 16, 14, 32, 6, -5, -13, 46, -57, 0, 36, 41, -45, -17, 20, 27, -34, -21, 31, -2, -68, 100, -28, -29, 13, -25, 15, -3, -86, 36, 3, 6, 52, -39, -25, -11, 6, -32, -54, 58, 83, -21, -17, 31, 2, -36, -23, -4, 51, 3, -1, 16, -10, 98, 51, -21, -9, -49, -25, 45, -47, -21, 41, 24, 12, 26, 10, 0, -7, -85, -5, 5, -31, -38, 31, 75, -21, -34, -45, 80, +120, 8, -9, -49, -1, -17, 6, 6, 46, -32, 2, -37, 31, -3, -16, 63, -26, -7, -9, -28, -13, 81, 2, 10, -37, 85, 43, 18, -18, 3, 8, -4, 79, -10, 35, 95, 0, 5, -12, -4, 17, -23, 43, 28, 22, -1, -28, 0, -28, 30, 2, 2, -7, -11, -1, 15, -14, 56, -23, 56, 6, 15, -53, 0, -17, -9, -21, -18, 18, -7, -13, 7, 15, -49, 46, -23, 29, -26, 70, 110, -19, +-35, -16, 12, -40, -16, 27, -4, -4, 38, 4, -7, -6, -18, 31, 29, -1, 64, -19, 27, 11, -4, -33, 38, 24, 11, 118, -53, -10, 64, -22, -6, -33, -49, 24, -24, 8, -31, -22, 3, 127, 110, 10, -18, -23, -19, -52, 76, -17, 43, -39, -24, 15, 24, 13, -25, -6, -13, -34, -19, 80, -27, 12, -12, -9, -3, 30, 3, -7, -49, -1, 0, 41, -15, 19, 3, 1, 3, -14, -7, -5, 16, +6, 7, -32, 15, -3, 58, 45, 17, -12, -3, -4, -76, 6, 115, 52, 0, 4, 0, 32, -27, 53, -2, -7, 6, 55, -4, -2, 52, -14, -22, 23, 4, 35, 43, 5, -20, 40, -20, -25, -47, 49, -1, -19, -9, -34, 7, -30, 19, 16, 36, 41, 4, 22, 33, 6, -39, 13, 8, -23, -12, 17, -32, 10, 3, 0, -13, 102, -23, 30, -15, 34, -3, 13, -6, 56, -8, -23, -17, 10, 4, 29, +40, -16, -22, 4, 17, -11, -6, -24, 45, 0, 2, -30, -49, 3, -18, 9, 9, -33, -11, 21, 37, 21, 7, -37, -23, 31, -24, 59, 5, 41, -17, -24, -8, 16, -20, 18, -6, -23, 35, 31, -47, -15, -29, 88, -6, 6, -12, -4, -21, -42, -33, -55, -33, 13, 2, -41, -16, -27, 8, -3, -10, -1, 66, -1, 64, 27, 38, -38, -14, -15, -3, -54, 76, 61, -53, -27, -18, 127, -17, 8, -24, +-13, -21, -8, 12, -26, 1, -27, -4, 49, 21, -50, 13, 54, 75, 88, -51, -43, -48, 14, 67, 33, 119, 29, -49, 73, 112, 16, -47, 11, 15, -36, -37, -34, -13, 51, 26, 8, -12, -14, -18, 32, -74, 18, -7, 62, 56, -22, 1, -19, -4, -4, -12, 88, -43, -5, -10, -5, 14, -2, 16, -35, -3, -12, -14, 7, -23, -31, -17, 91, 6, 19, -34, 39, -26, -13, -11, 54, 49, 10, -18, -27, +9, -53, -11, -30, -7, -21, -85, -44, -18, 36, -47, 40, 32, -32, 0, -6, -26, -67, -2, 18, 46, 15, -12, -31, 51, -3, 127, 18, 22, 9, -3, -21, -8, -19, 7, 10, 56, 59, -27, 17, 81, -19, 16, -22, -10, -4, 4, -6, 31, 5, 73, -7, 3, -15, 1, 33, 48, -46, 26, -28, 22, -29, -60, 69, -14, -12, 44, -55, 46, -44, -12, -7, 44, -47, -27, 24, 74, 10, -26, 8, 6, +13, 16, -5, 52, 67, 1, 47, 28, 0, 21, -18, 91, 21, -11, -26, 22, -46, 46, 7, 23, -8, -10, -16, 2, -41, 14, -17, 127, 3, 12, 77, -21, 42, 2, -50, 31, 70, 19, -4, 8, -31, -19, -37, 127, -7, -53, 35, -4, 20, -10, -8, 35, -29, 16, -61, -8, -19, -2, -8, 24, -61, 46, 56, 37, -27, 69, 17, 1, 32, -19, 17, 7, -14, -25, 48, -31, -29, 25, -21, -29, -1, +30, -54, -21, 32, 16, 21, -13, -18, -3, 27, 5, 6, -25, 27, -20, 11, 11, -11, 18, 16, 16, -44, -28, -21, -78, -51, -27, -27, 8, 97, -28, 13, -40, -23, -29, 12, 72, 35, 15, -8, -7, 21, -26, 5, -26, -10, -30, -3, -4, 8, -66, 4, -36, -38, -3, -21, 1, -5, -53, -16, -8, 59, -24, 50, 76, 62, 12, -41, 4, -17, 18, -38, -43, 3, -31, -29, -9, -12, -18, -46, -5, +-19, -24, 6, 0, -11, 39, 5, -15, -3, 11, -12, 33, -20, -3, -9, -3, -20, 31, -8, -9, -34, -27, -4, 47, 0, 41, -4, 18, 9, -2, -13, 13, -32, 8, 5, 1, -27, -10, 9, -21, -20, -16, -39, 2, -5, -8, -20, 1, 45, 5, 31, 38, -24, -5, -28, 8, -1, -6, 19, -28, -8, -4, 44, -19, -17, 8, -11, 3, -40, -34, 19, 69, 51, -36, -12, -40, 10, 16, 0, -3, -21, +-6, -1, -2, 39, -24, 13, -7, -25, -6, 9, -13, -26, -21, 19, -28, 14, -37, 92, -52, 60, 12, 10, -38, 18, -30, -30, 73, 3, -43, -5, -16, 30, 40, 13, -52, -4, -43, 10, -4, 108, 16, 26, 34, 1, -16, -20, -25, 11, 30, 32, -9, -21, 18, 5, 39, -2, 4, 30, 48, -16, -30, 17, -13, -6, 8, 58, -5, 15, -8, 13, -3, -50, 48, 3, 3, 4, -17, 16, 21, 30, 14, +7, 4, -22, -16, -31, 74, 3, 23, 4, 12, -35, -26, 8, 8, -28, 7, 21, 36, 1, -6, -28, -45, -35, 19, 15, -20, 36, -25, 74, -16, -27, -23, 15, 17, -12, 59, 33, -23, 50, 10, 23, 19, 42, 1, 57, 1, -7, -61, -42, 2, -33, -42, 47, 26, -5, -19, 8, 50, 14, -2, -6, 4, -22, 3, 34, 20, 28, -10, 13, -3, -21, -34, 41, 45, 16, 32, -19, -24, 10, -33, -18, +37, -53, 39, -30, 13, 39, -14, -14, -9, -18, -19, -16, 1, -16, -36, 40, 43, 26, -14, -22, 30, 0, -24, 55, 0, -19, -30, -28, -25, 35, -50, -11, 81, -63, 34, -31, 62, 71, 0, -26, -10, 16, -16, -43, -9, -3, 34, 61, 19, 42, -27, 8, 8, 4, -52, -34, -8, 2, -3, 8, -14, 4, 16, -43, -5, -47, -18, -5, -26, 7, -17, 2, -5, 40, -17, -39, 20, 21, -5, 14, 47, +35, -4, -25, 26, -32, 5, 58, -15, -45, 12, -15, 12, 11, -6, -3, 4, 42, 3, 3, 2, -35, 36, 82, -35, -26, -39, -22, 67, -40, -45, -19, 0, 14, -17, -9, -44, 14, 3, 13, -14, 12, 8, -17, -24, -6, -45, 6, -1, -15, -10, 39, -27, -10, -41, -29, -6, 30, -43, 44, -40, -19, -43, -44, 5, -7, 21, 2, -29, 0, 17, -12, -8, -52, 40, -35, -17, -4, -35, 44, 48, -2, +-38, 20, 1, 51, 42, -52, -16, -16, -26, 24, -2, 16, -42, -34, -5, -9, 14, -31, -28, -22, -48, -13, -57, 84, 56, -14, 16, -45, -28, -52, 34, -61, -15, 25, 81, 73, 40, -36, -27, -32, -42, 62, 41, -21, 15, -5, -3, -19, -8, 3, 38, 10, -52, 7, -11, -9, -71, -42, 34, -20, -10, -3, 35, 4, 4, 20, -52, -22, 23, 57, 37, -7, -14, 77, 5, -8, 52, 10, 20, -19, 7, +-39, -11, 19, -13, -26, -30, 1, 23, -26, -1, 48, 16, -20, -47, -28, 1, 43, -50, 39, -9, -24, -32, 2, -14, -19, -13, 12, -14, 14, -18, 39, 21, -9, 25, -15, 56, -16, -22, 6, -4, -7, 2, 28, -3, -11, -13, -13, 15, 2, -8, -10, 40, -10, -29, -3, -4, -24, 9, -24, 2, -16, 24, 1, -19, -20, -32, -9, -7, -1, -16, 26, -20, -18, -12, -6, -16, -15, 25, -7, -20, -16, +9, -50, -20, -12, 8, -12, -46, -5, 54, -37, 2, 20, 9, 15, 19, -5, -12, -3, -4, 9, -24, 54, -24, -17, -16, 17, -39, 10, -10, 0, -4, -10, -24, -1, 6, -31, -6, -28, 2, 7, 56, -31, -17, 28, 16, -27, 2, -22, 11, -3, -15, -24, -36, 12, 54, -36, -56, -25, 7, -12, -2, -18, 3, -27, 80, -9, -42, -29, 53, 26, 12, 22, 9, -23, -7, -25, -2, 0, 22, 14, -12, +-31, 17, 8, -25, 24, -9, 29, -5, 6, -13, 6, -42, -52, -24, 31, -9, -17, 49, 1, -22, -10, 17, 37, -8, -8, 17, 20, -28, 0, 47, -17, -24, 20, -9, 17, 6, 46, -18, 21, -37, 22, 13, -9, 23, -5, -36, 19, 40, 3, -20, -11, 11, -24, -14, 8, -37, -26, 68, 43, 6, 20, -14, -12, 30, -23, -17, 41, 1, -35, 57, 127, 16, 29, 12, 14, -39, 3, -6, -2, -2, 27, +1, -12, -20, -4, -38, 53, 58, -18, 16, 21, 28, 1, -12, 64, 19, 57, 3, 21, -38, -30, -10, 16, 25, -23, 17, -9, 15, -27, 17, 0, 16, -32, -4, 8, 42, -16, 36, -6, -8, -47, -31, -29, 7, -36, 62, 64, -3, 85, -37, 7, -21, -5, 35, 3, -26, -52, -22, 42, -8, -6, 54, -29, 32, -4, -23, -16, 64, -20, 77, -2, 17, 27, -38, 1, -14, -15, 1, 20, 1, 11, 6, +14, -36, -4, -23, -13, -1, -1, 1, -12, -29, -50, -31, 0, 3, 0, -7, 14, 24, -29, 64, -19, -23, 32, -30, 52, -26, 10, -54, -40, -36, 8, -5, -18, -2, -25, 69, -2, -36, 24, 31, -29, 37, -15, 31, -23, 58, -11, 20, 28, 4, 41, -56, 18, 116, 45, -39, -41, -5, 37, -3, -15, 2, 10, -53, -8, -31, -3, -8, -38, 9, 1, -30, -21, 30, -13, -34, -9, 2, 10, -32, -17, +-42, -68, 15, 62, -6, -33, 13, 14, 0, 23, 76, 71, -41, -5, -35, 0, -20, 20, -23, -25, -2, -9, -15, 0, -7, 44, -2, 28, 0, 11, 7, 5, -46, 40, -25, -10, -28, -7, 37, -6, -21, -73, 26, 7, -65, -26, -16, -43, 4, -2, -35, -2, -37, -15, -6, 8, -3, 2, 11, -31, 64, -31, -64, 75, -23, 29, 36, -43, 4, -20, 6, -2, 37, -3, -29, 8, -24, -15, -43, 38, 2, +-20, -2, 8, -27, 22, 22, -15, -34, 0, -22, 55, -20, -17, 13, -9, -1, -13, 10, -5, -27, 22, -13, -5, 33, -6, -1, -9, -10, 0, -3, 28, -12, 24, 3, 27, -29, -4, -2, -1, 3, -30, -17, 5, 33, -7, -20, -16, 1, 4, -39, -20, 15, -14, 0, -18, -22, 14, -28, -23, -1, -16, -11, 8, 1, 23, 18, -27, 17, 0, 17, -3, -15, 18, -34, -23, 26, 11, -5, 6, -13, -6, +-20, 17, 35, -6, 4, -19, -16, 15, -12, -38, 77, 7, 51, -17, 36, 0, -13, 13, -10, -1, 44, -23, 5, 17, -22, -26, 13, -28, -2, -11, -5, -4, 14, -25, 18, 18, -43, 10, -18, -49, -21, -10, 33, 45, 10, 1, -3, 2, 11, -52, -13, 21, 5, -16, -9, 51, 4, -7, -13, -3, 10, -22, 43, -19, 29, -14, -46, -45, 18, -76, -37, -41, 4, 3, -8, -63, -18, -58, 103, 56, 62, +-51, 0, 60, 29, -5, 20, -74, -44, -10, 17, -20, 23, 127, -35, -7, -35, -9, 0, -17, -24, -11, -23, 82, 6, -9, 11, -1, 39, -40, 29, -32, 10, -10, 29, 28, 12, -3, -30, -14, -39, -17, 77, -5, -25, 112, -16, 0, 2, -5, 16, 1, -5, -10, -9, -14, -49, 9, 59, -33, -11, 61, -41, 17, -25, -4, 5, 14, -40, -7, 18, -20, 3, -12, -13, 17, 70, 36, -54, 18, 9, -35, +45, 38, 21, 18, 7, 20, -15, -32, 3, -47, 89, 15, 5, 33, -21, 7, -5, 89, -10, -30, -18, -29, -67, -7, -26, -34, 16, -1, -14, 50, -35, -79, -21, -14, -6, 11, 30, 17, -3, -36, 5, -12, 14, 22, 16, -5, -12, -4, -27, 51, -44, 26, 11, -9, -17, 24, -12, 79, 4, -6, -26, -55, -24, 7, -32, -39, -30, -5, -10, 9, 15, -36, -8, -16, 33, -24, 10, -4, -34, -17, -32, +27, -27, -29, 24, 16, -33, -24, -37, 99, -7, -30, -15, -22, -18, 21, -30, 18, -19, -3, -2, 6, -8, 35, 61, 11, -35, -28, 11, -3, -7, -5, -12, 18, -42, 23, 21, -16, -21, 16, 30, 69, -41, 46, 7, -24, 24, 4, -58, 7, -15, 6, -30, 26, -52, 13, -25, 0, -78, 46, 17, 0, 27, 46, -11, 41, 68, -15, 44, -15, -17, -17, 11, -7, -26, 29, 46, 85, -39, 1, 6, 19, +-39, 67, 47, 13, -37, 24, -5, 55, 65, 1, -8, -58, -13, 10, 2, 38, 41, 11, 17, -12, 63, 30, 1, 28, -4, -4, 17, 15, 15, -23, -22, -38, -19, 23, 16, -21, 14, 41, 14, 15, -2, 92, -30, -48, -18, -32, -30, 68, 27, 2, -17, 17, -39, 7, 4, -32, -32, -21, -6, 4, 19, 7, 38, -83, -10, 98, 82, 30, -10, -38, 19, -37, -63, 32, -25, -89, 3, -28, -13, -7, -52, +-5, 4, -56, 15, -11, -24, -11, -34, -5, 19, 15, -40, 7, 14, -66, 7, 49, -10, 32, -12, 22, 12, 12, 54, 6, 48, 1, 84, 7, -3, -1, -21, -6, -32, 29, -62, -30, -13, 1, 0, 3, 34, -56, 19, -4, 26, 21, -28, -32, -11, -25, -6, -1, -4, 12, -26, 33, 16, -19, 7, 21, 8, 32, -30, -17, -23, 4, -15, -39, 52, 15, -33, -5, -15, 4, -26, -23, 34, 63, 123, -17, +-7, 28, -20, -10, 6, 36, -7, 11, -6, -3, -24, -5, -8, -17, -9, -8, -6, -15, -2, -4, 8, 0, 68, 10, -6, -21, -22, -3, 26, -4, -18, -45, 15, -10, -14, -34, 18, -29, 8, -4, -17, 10, 30, -10, -1, 8, 11, 21, 16, 15, 0, -35, -28, -22, -17, 0, -9, -33, -2, -29, 54, 3, -37, -13, 40, 18, -39, -27, 8, -1, 8, -19, 1, -8, -9, -11, -4, -17, -57, -16, -26, +5, -29, -34, -7, -15, 0, -23, -11, 36, 45, 10, 33, 45, 65, -18, 81, 12, -16, 93, 51, -82, -34, 46, -27, -3, -23, -34, -10, -9, 8, -59, -47, 25, 13, -6, 49, -5, -20, 68, 100, -48, 22, 53, -10, 34, -22, -1, -12, 44, -34, 19, 32, -22, -24, 4, 3, -25, -38, 77, 15, -42, 6, -14, 28, 0, 7, 53, -5, -9, -1, 38, 17, -47, 8, -14, 29, 49, -20, -23, 16, 18, +-38, -23, -33, -32, 25, -8, 1, 20, 14, -14, -14, -22, -16, 10, 47, -2, -2, -5, 40, -8, -24, 2, 9, -26, -23, -51, -59, -28, -7, -12, -11, 2, -59, 64, -35, -43, -11, -8, -23, -41, -16, -6, 16, 72, -29, -53, -58, 57, -44, 0, -37, -47, -11, 25, 12, -37, -1, -11, -8, -8, 18, 8, 36, 14, -13, -45, 29, -23, 40, -23, -3, 8, 1, -9, -11, -14, -17, 6, 6, -9, -7, +5, -23, 0, 19, -2, 16, -1, -27, 11, 4, 6, 120, -13, 79, -46, 4, -58, -12, 4, -30, 4, 34, 43, -22, -26, -10, -11, -18, -1, -4, -29, -7, -44, 38, -57, 18, 59, 127, -32, 1, 18, -10, 58, 48, 9, 4, -5, -43, -58, 14, 0, 3, -16, -23, -2, 24, -43, -57, -23, -9, 15, 20, 23, -5, -2, 34, -33, -25, -1, -21, -13, 0, -8, -9, 39, 85, 20, -25, 39, 1, 27, +6, -19, 9, -30, 22, -44, -32, -28, -19, -15, 19, -27, 13, -11, 38, 45, -10, 19, -38, 47, 17, -6, -17, -4, 86, 106, -12, 12, 50, -8, -43, 36, -11, -71, 81, 104, -20, 23, 10, 29, -51, 1, -18, 40, -45, 43, -25, 18, 11, 4, -16, 3, -26, -22, -31, 22, -5, -68, -17, 99, -24, 1, 36, -14, 83, 1, -2, 54, -22, 13, 50, -16, -7, -56, 0, 3, 23, 47, -20, 44, -29, +19, 1, -49, -65, 9, 2, -5, 7, -77, -22, -15, -80, 11, -1, -63, 109, -69, 4, -67, -16, 21, 50, -2, 36, -40, 22, 32, 2, -34, 13, 19, 30, 8, -7, -65, 13, -66, 12, 73, 3, 36, -61, 31, -6, -24, -32, 0, 87, -43, 39, -44, -38, -5, 47, -10, -38, 127, -30, 71, -30, -36, -10, -63, 58, -38, -29, -28, -41, -45, 13, 2, -15, -23, 12, -5, 38, 59, -4, -30, 52, -14, +-30, -27, -27, 0, -13, -35, -39, 23, -10, 101, 23, -36, 15, 60, -27, -25, -28, 11, 1, 45, 17, 3, -6, 7, 2, -20, 0, 23, -22, 20, -9, 3, 31, -47, 6, -4, -23, 11, 16, -25, 21, -12, -24, 13, -21, -23, 15, 10, -11, 15, 21, 16, 13, -16, -18, -7, -25, -23, -20, 8, -13, 14, -17, 12, 26, -27, -40, 29, -28, 42, 12, 5, 18, 33, -21, 11, -14, 36, 27, 3, 24, +11, -17, 6, 1, -12, 17, 17, 35, 22, -8, 3, 32, 3, -50, 0, 60, -7, 10, -3, -8, 37, 78, -8, -16, -35, -4, 14, -8, 14, 19, -11, -22, 11, 39, -25, 7, -33, -23, 8, -20, -20, -39, -41, 80, 70, 54, -20, -30, 4, 52, 8, -13, 53, -15, -33, -51, -11, 55, 88, 5, -40, 48, -43, 57, 11, -29, 23, -23, -11, 50, 35, -17, 5, 14, -8, 11, -20, -35, 9, -28, -6, +20, -12, -9, -2, -9, 4, 0, 12, -5, 76, -11, -33, -18, 79, 27, 11, -39, 0, 0, 8, 18, -27, -10, -30, -60, -31, -6, -18, -24, 13, -6, -15, -4, -15, 38, -55, -21, -27, 18, 61, -10, -1, -3, 46, 39, 10, -10, -20, -8, -35, 7, -24, -61, 36, -43, 24, 10, -20, 81, 2, -18, -27, 4, -29, -25, 35, 33, -29, -9, 7, 40, -11, 31, 19, -91, -28, -24, -4, 1, -23, -17, +73, -27, -3, 15, 2, 5, -63, -22, -1, -14, -9, -22, -34, 17, -24, -36, -13, 19, 27, 14, -46, 15, -42, -1, 1, -2, -33, -10, 6, -17, -11, 103, 20, -17, -16, -7, 34, 12, -52, -53, -11, -26, -15, -57, -22, 10, -41, -9, 3, 26, 22, 58, -64, -40, -4, -8, -11, -22, -43, -27, 17, -38, -5, 29, 62, -18, -38, 39, -2, -3, 45, -14, -18, -7, 32, -19, -28, -10, -6, -8, 17, +-17, -6, -19, -18, 42, -1, -41, -7, 29, -7, 17, -27, 16, -7, -1, -4, -11, -22, 35, -11, -12, 52, -34, 40, 16, -18, -20, -16, -16, 27, -16, -4, 52, -16, 15, -11, -31, 62, 42, -35, -77, -9, 3, -5, 18, -16, 58, 15, 4, 67, 10, -34, 5, 9, -30, -26, -15, -3, 20, -30, 28, -18, 3, -40, -38, -53, 36, -28, -44, 19, -6, -53, -2, -34, 12, -18, 2, -1, -2, -46, -32, +-64, -51, 9, -11, 16, -38, 60, -34, 26, -27, -16, 4, -53, 19, 15, 3, 84, -12, -10, 11, -48, -11, -35, 1, 58, 28, 41, -2, -41, -10, 39, 3, 0, 9, -20, -31, 76, -35, 60, -13, 4, -76, -68, -15, 66, 63, 39, -56, 64, 11, -8, -6, 14, -33, -21, -24, 102, -15, 47, 24, 56, -18, 49, 122, -37, -15, 88, -15, -23, 3, 4, 85, 16, 7, -19, -7, -43, 17, -20, -30, -23, +-19, 41, -34, -68, 14, -16, -37, -54, 24, 7, 2, -25, -54, 42, 12, -9, -5, -51, -17, 34, -48, 64, -8, 33, -1, -45, -33, 27, 4, 33, -38, 28, -36, 9, 33, 1, 16, -13, 15, -4, -4, -25, 5, -31, -17, -26, 57, 12, -26, 15, 0, 6, -6, 14, -5, -30, -20, -8, 11, -9, 52, 21, 23, 1, -19, 14, 0, -15, 23, 16, -14, -24, -18, -2, 34, 3, 35, -14, -7, 31, 21, +-1, 8, 12, -30, 14, 4, 2, -28, 7, 42, 33, -22, 25, -16, -13, 46, -9, -11, 3, -21, -17, -32, -11, 33, 29, 41, -10, -27, -20, 7, -33, 20, 8, 7, -18, -18, 3, 11, 14, 4, -4, 96, 19, 42, -21, 31, 12, -11, -53, 33, 12, 0, -6, -36, -20, -30, 25, 7, -18, -2, 44, -22, -44, 22, -21, 1, 2, 9, 57, -31, 100, -46, -66, 15, -20, 28, 27, 33, 11, 37, -61, +-7, 33, 39, 27, 7, 41, -42, 21, -41, 35, 61, -8, -11, -2, -7, 11, 25, -30, -3, 6, -11, 50, -8, -28, 37, -12, -24, -5, -25, 3, 16, -19, -20, -12, -27, -38, -19, 56, -3, 6, 56, -22, 33, -2, 2, 20, -42, 56, 13, -47, -1, -17, 10, 4, 55, -5, -10, 10, -1, -18, -7, -19, -11, -31, 47, -21, -29, -4, 8, 11, -17, -45, -43, -17, -19, -53, -26, 37, -4, -71, 4, +-53, -13, -35, 30, -10, -42, -35, -75, -10, 1, -22, -5, 6, 78, -13, -20, 17, -19, -8, 23, 74, -34, 9, -34, -3, 113, -3, -6, 95, 7, 1, 28, 12, 4, 7, 51, 7, -38, 124, 21, -29, -10, 32, 64, 11, 17, -3, -30, -28, -4, -21, 41, 10, 8, 8, 22, -25, 42, -25, 17, 18, 5, 10, 53, 65, -17, 28, 10, -4, 24, 63, 24, 0, -14, 45, 30, 61, 13, 4, -38, -12, +-3, -53, -31, -26, 5, 24, 42, -20, 53, -25, 40, 15, 25, 41, 21, -26, -61, -5, 25, -1, 24, -5, 29, 14, 12, 72, 27, -2, 64, 33, 6, -27, -38, -12, 3, 0, 25, -2, 37, -33, -41, 0, 42, -15, -23, -27, -23, 8, -20, -1, 38, 21, -48, -67, -9, 27, 26, 70, 21, -38, -22, -44, -30, -34, 13, -46, -8, 38, 52, -8, -42, -10, 127, -25, -20, -11, -24, -19, 22, -33, 42, +-29, 41, 68, 63, 29, -15, 63, -18, 13, -47, 2, -16, -43, 18, -38, -24, 22, -20, 87, 44, -13, -16, 7, 15, -24, 9, 43, 53, -24, -34, -6, -58, -51, -34, 39, 3, 127, 34, 27, 13, -54, 12, -22, -20, -21, 13, -65, 22, 31, 101, 37, 32, 30, 3, -3, -18, -16, -49, -31, -7, -25, -45, 5, -72, -70, 87, -52, 44, -26, 15, 110, 30, -16, 69, 40, -38, 27, -59, -46, -6, 94, +-14, 33, 16, -11, -27, 118, -45, -28, -46, 6, 22, -1, 40, -16, 68, -14, -16, 33, -16, -28, 19, -14, 13, 9, 91, -10, 18, -27, 34, -67, 11, -49, 11, -29, -16, 34, 62, 15, 3, -15, -28, 11, -15, -14, -3, 20, -60, -17, 41, -49, -6, -26, 31, 19, 5, 29, -2, 28, 34, -19, 6, -29, -6, -17, -15, -8, -48, -1, -13, 19, -15, -20, 34, -26, -24, 8, -37, 8, 3, 7, 26, +8, -3, 16, -17, -12, 23, 19, -9, 2, 7, -9, 7, -5, -11, -8, 2, -7, -28, 11, -24, -13, -20, -4, -14, -2, -23, -9, -14, 23, 27, -30, 20, 4, -11, -25, -11, -8, -32, -2, -17, -4, 3, -6, -12, 127, -23, 7, 28, -3, 71, 13, 38, 44, 8, -3, -8, 40, -6, -26, 65, 25, 35, -27, -34, 48, -16, 43, 27, -3, -2, -30, -11, -8, -10, -2, -13, 127, -7, 28, 18, -47, +-2, -10, -12, 107, -5, -5, -27, 20, -27, 51, -1, 6, -74, -33, -10, 52, 14, -27, -7, 31, -9, -3, -12, 28, -11, -29, -30, 14, 13, 59, 63, -36, 2, 20, -10, 36, 12, -27, -2, -36, 36, -22, -3, 9, -11, -6, 37, -9, -48, -18, 5, -11, 27, 21, 14, 38, 20, -19, -15, 16, -5, -4, 13, 12, 10, -17, -6, 127, 54, 56, 11, 1, 28, -1, -3, 28, -16, -4, 10, 15, 38, +-5, -6, -9, -4, -11, -30, 41, 35, -38, -7, -3, 10, -37, 66, -35, 18, -16, 30, 60, 19, -22, 42, -16, 1, -10, -20, 11, 10, 29, 35, -44, -48, -57, 46, 7, -16, -26, -24, -9, 23, 26, 24, -2, 22, -19, 12, 37, -40, -13, 5, 0, 90, 0, 87, -13, 10, -21, -8, 27, -26, -16, -10, 5, 7, -23, -38, -2, 0, -72, -49, 32, -11, -9, 0, -16, 10, -54, -22, 9, -5, 16, +58, -15, -11, -26, 77, -22, -12, 17, 17, 44, -47, -16, 14, -2, -38, -31, -31, 5, 80, -50, -32, 7, -7, -4, -8, -12, -11, -41, -9, -16, -23, 3, -8, 12, -57, 79, 17, -7, 54, -7, 39, 19, 5, 15, 0, -31, 13, -31, 9, -34, 44, -20, -19, 5, -8, 14, -28, 15, 50, 16, 1, -3, -5, -32, -17, 50, -9, -24, 22, 46, 26, 10, -27, -13, 23, -14, 26, -10, -20, -51, 58, +8, -16, -79, 1, -39, 14, 32, 23, 42, 51, 48, -61, -19, -30, -72, 64, 64, -11, 14, 17, 45, 17, -50, -15, 56, 9, 18, -28, 70, 15, -40, 89, -1, 3, -15, -4, -13, -21, 12, 76, -25, 123, -54, 18, -50, 50, -21, 0, 21, -14, 23, -12, -42, 9, 5, 55, -13, -6, 0, 63, 12, -22, -19, 17, -17, 9, -18, -18, -1, 24, -18, -18, -17, -31, -37, 11, 31, -46, 55, 13, 10, +-74, 42, -18, -20, 2, 0, -30, 29, 40, -4, -11, -9, 59, 41, 39, 31, 25, -51, -24, 0, 27, 86, -22, -23, 127, -42, -26, -7, -20, -42, 3, 47, -5, 54, -25, 15, 28, 28, -52, 26, -29, -17, 16, -19, 17, 9, -7, 2, 17, -9, -47, 18, -8, -33, -15, 10, 26, 30, -23, -13, 42, -4, -36, 20, 18, 20, 71, 69, -3, 6, -26, 28, 23, 11, 5, 2, 32, 2, 45, -33, -47, +-19, -27, -35, -10, -8, 22, 87, -22, -16, -9, -20, -8, -28, 8, -48, -26, 24, -44, 44, 44, -15, 22, 22, -41, -44, 30, 127, 55, -19, -2, -11, 19, -23, -10, 8, -26, -17, 24, 29, -4, -10, -18, 1, -17, -27, 1, 10, -33, -11, -13, 22, 52, -10, -7, -12, 9, -13, 11, -28, -1, 3, -11, -40, -30, -22, -24, -16, 10, -15, 14, 25, -7, 9, -18, 79, 19, -25, -12, 28, -18, -9, +1, 26, -10, 7, -24, -6, -4, -22, 7, 14, -47, -5, -28, 32, -3, -7, 10, -2, 50, -26, 20, -12, 12, 31, -5, -5, -16, 12, -19, -40, -25, -7, -3, 0, 30, 53, 41, -13, -19, -18, 21, -25, 102, 30, 24, -16, 38, 56, 14, -7, 0, 72, -5, -49, 10, -1, -25, 1, -37, -38, -9, 8, 17, -59, -45, -48, -31, -11, 5, 10, -15, 4, 15, -23, -30, 31, -34, 10, 4, 14, 5, +-25, 12, -40, 10, 29, -21, 33, 15, -17, -37, 29, -9, -32, -15, 29, -25, -5, 32, -44, -28, 40, -11, 44, 36, -3, -9, 49, 17, 127, -36, -3, -23, 10, 6, 38, 47, 32, 51, 42, 48, -16, -8, 15, 26, -20, -34, 39, -10, 6, 5, 61, 12, -54, -22, 50, -46, -33, 63, -3, 16, -22, -31, -20, 64, -22, 52, 26, -28, -46, -19, 37, 7, -34, -60, -22, 37, 11, 18, -23, -21, -17, +-14, 3, 14, -29, -29, 127, -9, 4, -22, -4, 4, -15, 11, -15, -16, -24, -23, -27, 23, -2, 9, -19, 25, -39, -28, -12, -41, -14, 7, 38, -10, -13, 27, 48, -29, 19, -25, 6, 0, 16, -18, -6, -19, -22, 30, -55, -28, 12, -10, 5, -3, 5, -20, -2, 14, -42, -39, -10, 5, -2, 10, -4, -4, -6, -19, -3, 29, 6, 4, 26, 90, -8, -3, -19, -11, -3, -23, -13, -25, 14, 32, +5, -3, 7, 27, -30, -3, 127, -22, -14, 6, -9, 20, -12, 23, 65, 29, -5, -34, -10, -11, -8, -17, -15, 62, -45, 13, -8, -4, -10, -59, 12, 6, -32, -28, 84, 17, 5, 16, -20, -11, -24, 20, -26, -5, -20, 43, -28, 115, 11, -12, 53, 5, 0, -13, -49, -25, 61, 4, 127, 15, 0, -27, -24, 21, -66, 13, 46, 15, 49, -42, -8, 28, 10, -20, -6, -6, -13, -49, 16, -31, -36, +43, -10, 10, 53, 49, 101, 43, 11, -15, -36, -67, 16, -36, -33, 4, -26, -33, 8, 21, 34, 24, 16, 7, 20, 35, -24, -41, 0, -49, 19, -16, 26, -28, -11, 50, 63, -18, 19, 7, -6, -12, -18, -8, 46, -33, -13, 58, -27, -30, -3, 52, -31, 34, -20, -3, 30, 38, -48, -40, -38, -5, -18, 109, 65, -38, -43, -25, 4, 33, -12, -39, 35, -2, -26, -49, -17, -52, 18, 15, -23, 21, +-6, -10, 28, 44, -15, 9, 12, 61, -26, -30, 1, 33, 66, -20, 31, -12, -27, 6, 22, -22, 21, 4, 18, 90, 1, 107, 25, -4, -19, -27, -10, -2, 44, -41, 19, -27, 127, 7, -24, 18, -5, 2, -8, 8, -28, -20, -26, 9, 37, -13, -15, 23, 18, -20, 3, -19, 3, -37, -22, 6, 29, 47, 16, 11, 19, 36, 59, -26, -25, 6, 10, -52, 12, 60, -49, -36, -34, 117, -41, -9, 17, +-37, -27, 7, -25, 12, 15, 13, -9, -8, -18, 13, -6, 8, -57, -13, -1, -20, -64, -22, 65, 31, 42, 26, -31, -14, -41, -13, 9, 8, -7, -15, -15, 7, -4, -17, 29, -23, -32, 17, 8, -24, 11, -12, -12, 3, -7, -16, -17, 6, 48, -22, 15, -21, 66, 9, -18, -1, 11, -20, -15, -6, 34, -31, 37, -35, 88, -5, -18, -43, -1, -24, -20, -30, 48, -25, -18, -1, 31, -41, 25, -4, +43, 27, -38, 29, -28, 15, 20, 37, 1, -17, -3, 9, 4, 45, -10, 21, 1, 6, -17, -17, -19, 14, 8, 11, -9, -27, -5, 41, -13, 8, 1, 9, -21, -8, -20, 26, -17, -23, -31, 18, 2, 4, 2, 29, -18, 0, 50, -6, -12, -27, 6, 1, -20, -24, 24, -40, 67, -46, -10, 21, -3, 3, -29, -7, 10, -13, -13, -14, -15, 13, -7, 6, -18, -38, 15, 1, -38, 20, 2, -18, -10, +-28, -25, 21, 11, 10, 69, 9, -8, 52, 35, 5, 15, -22, -25, 80, 11, 46, -45, -25, 60, -7, 12, 37, 25, -22, 16, 12, -15, 83, -30, -24, 10, -51, 32, -3, 1, -1, 67, -7, 28, 31, -33, -6, 27, -24, 51, 6, -15, 5, -27, -34, 16, 5, -19, 47, 29, -33, -9, -6, 23, -31, 51, 2, 37, -26, -48, 4, -11, 18, 30, 3, 127, 22, 13, -18, 11, 3, -33, 7, 23, -10, +-3, -10, 17, 93, -5, -14, -25, -31, -16, -16, -4, 13, 22, -11, 12, -44, -8, 27, 26, -21, 28, 3, -11, 27, -25, -25, -17, -3, -19, 38, -46, 9, -22, 38, 39, -32, -7, -11, -8, -24, -38, 62, -9, -31, -1, 3, -16, -46, 61, -8, 2, -31, -36, -13, -11, -19, -22, -7, -16, -14, 11, -10, 7, 11, 2, -10, -44, -24, 8, 28, -48, -19, 38, -25, -40, -17, 31, -1, 13, 42, -13, +-8, -15, 7, 6, -34, -65, -15, -15, -24, 1, -3, -3, -4, 34, 52, -7, 52, -22, -22, 28, 31, -4, -23, -2, 9, -1, -32, 24, -13, -8, -21, -1, -6, -34, 0, -62, 46, -13, -27, 31, -27, -6, -32, 79, -36, -41, -12, 17, -30, 46, 15, 5, -33, -22, -39, -20, -3, -27, -34, 36, 35, 9, -26, -16, 12, -11, -8, -37, -27, -20, -5, -12, -28, -33, 33, -29, -1, -31, 16, -36, -5, +7, -12, 9, 9, 20, 16, 55, -26, 13, 10, 20, 57, -26, -37, 45, 5, -45, 45, 34, 6, 19, 28, -29, -2, -25, -13, -9, 5, 48, -12, 60, -10, 9, 53, -20, -38, 6, 14, -1, 7, 11, -28, -8, 39, 13, 4, -25, -55, -1, 0, -38, 36, 42, -9, -20, -25, -19, -18, -15, -7, -56, 36, -23, -18, 74, 4, -26, -27, 40, -27, -18, 4, -25, -35, -9, 25, 47, 26, 9, -43, -13, +52, 31, -10, 32, -45, 21, -4, 32, -15, 17, -20, 42, -14, -32, 32, -26, 2, -8, -67, -5, -26, 21, -48, 88, -10, -7, -37, 42, 46, 9, -10, -26, 9, 26, -31, -66, -40, -6, -6, 3, 11, -27, -6, -19, 18, 21, 17, -12, -56, 17, 42, 50, -9, -14, -76, 33, -5, -10, -28, 5, 3, 14, -33, 2, 8, 15, -33, 29, 4, -9, -1, -8, -10, -20, 1, -33, 3, 12, -20, -14, -12, +14, 5, 10, 23, 5, 23, -6, -16, 2, 8, -14, 14, -7, -31, -6, -30, -12, -12, -17, 14, -6, 9, -3, -34, 1, -13, 9, -1, 33, -4, -23, 23, -39, 29, -6, -8, 41, 9, -19, -12, -1, -12, -3, -9, -20, -5, -18, 48, -11, -14, -1, 11, 21, 14, 3, 19, 7, 14, 4, -8, -21, -14, -4, 29, 5, -13, -24, -11, -30, -30, -16, -13, -9, 31, -38, -25, 4, -36, -16, 29, 16, +60, 42, 3, -9, 8, -11, -16, 22, -43, -11, -9, -36, 15, -29, 53, 15, 11, -20, -9, 36, 20, -14, -11, 12, -11, -37, -2, -19, -28, -30, -32, -5, -48, -16, 4, -30, -26, -54, 86, -34, -2, -7, -29, 64, -9, -18, -16, 2, -7, -3, 6, 14, -15, -16, -35, -38, 5, -15, -21, -4, -14, 9, 54, -6, 25, -10, 17, 18, -2, -22, 37, 14, -4, -15, -33, -26, -42, -49, 22, 21, -17, +-25, -45, 6, -4, 13, 18, -4, 27, -46, -4, -19, -16, 40, 11, 1, -33, 1, 2, -41, -9, 0, -29, -3, -14, 30, -2, 21, -16, -37, 45, 7, -26, -11, -38, 2, 36, -51, 6, -18, -40, -4, 2, -18, -25, -27, 84, 19, -47, -22, 51, -20, -33, -64, 26, -31, -24, -31, -1, 69, -21, -7, 7, -32, 60, -1, -36, -20, -77, -34, -18, -5, -6, 12, -24, 12, -20, -40, 15, 52, 24, 66, +-20, 2, -20, 10, -2, 7, 45, -3, 23, -38, 1, -4, 45, 14, 7, 11, 0, 52, 9, 5, -30, 24, -27, 80, -18, 35, -8, -9, 3, 6, 12, -37, 127, -18, 14, -64, 9, -2, 3, 92, -16, -31, 38, 23, -17, 24, 5, -24, 55, -27, -80, -9, 3, -38, -17, -8, 23, -32, 24, -13, 55, -5, -9, -22, -20, 4, 11, 22, 21, -3, -17, -18, -18, 72, -37, 3, 4, 2, -20, 32, -10, +7, -7, 21, 18, -26, 16, 35, -10, 2, 19, 21, 7, 7, -40, 31, 16, 14, -30, 41, -2, -11, -49, -42, 32, -28, -57, -68, 5, -8, 6, 29, -2, -30, -50, -24, -24, 37, 33, 41, 26, 20, -33, -17, 12, 30, -25, -29, -18, 27, 2, 38, 0, -42, -21, 23, -7, -60, -12, -51, -3, -31, 25, -36, 4, -47, 122, 21, -26, -37, -6, -13, 29, -22, -2, 27, -10, -9, -21, -59, 1, 46, +10, 54, -20, -12, 1, 6, -22, -36, 22, 52, -16, 10, 20, -23, -1, -25, -26, 19, -10, -44, -51, -14, 23, 17, -11, 4, -26, 34, 45, -33, 5, -27, 42, 26, 44, 4, -20, 29, 30, 24, 2, -14, -19, 76, -2, -10, -19, 1, -29, 16, -23, -42, 7, 9, 24, 10, 2, -51, 26, 127, -29, -38, 42, 1, -23, -19, -16, 24, -42, -8, 4, -37, -3, 15, 34, 26, 8, -3, -29, 57, 9, +-16, -35, -32, -18, -21, 6, -35, 17, -18, -10, -23, -14, -14, 4, 15, 8, 60, 20, -6, -11, 52, 39, -15, 35, -34, -14, -4, 14, 64, -8, -32, 2, -5, 95, -9, 4, 13, -24, 35, -2, -14, -19, 10, -14, -9, 5, -10, -6, 17, 127, -8, 13, -7, -47, -27, -34, -2, 5, 108, -8, -29, 32, -21, 44, 111, -10, 30, -7, 16, 5, -6, -1, 4, 16, -2, -25, -27, -23, -10, -15, -5, +0, -5, -29, 5, -19, -19, 0, 0, -8, -4, 10, -11, -22, 30, 66, 7, 37, -15, -25, 12, 28, -17, 44, -7, 36, 25, -54, 45, -21, -25, -20, -15, -24, 4, -48, -49, 33, 12, 25, -10, -21, -1, 14, 47, -14, 28, -12, -26, -38, 29, 50, -17, 90, 25, 62, -8, -16, -20, -2, -1, 95, -7, 29, 0, -23, -9, -17, -17, 8, -39, -49, -23, -8, -25, -26, -16, 35, 29, 0, -55, -28, +54, -34, -12, 80, 15, 68, -4, -18, 18, -20, -13, -6, -33, 31, -27, 7, 12, 3, 39, 19, -5, -24, -19, -14, -25, -29, -5, -16, 15, 8, 7, 39, 5, -25, 10, -41, -2, 10, -27, -9, -46, 12, 17, -3, -27, -28, -12, 38, 42, -24, -3, 8, -17, 1, 3, 16, -20, -10, 1, -25, 8, -31, -11, 28, 24, 127, -21, 61, -5, -48, 24, -17, 30, 17, -70, 81, 1, 3, 10, -1, -9, +25, -28, -13, 10, -39, 5, -43, -8, 0, -32, -35, 24, -18, 20, -17, 55, 4, -39, 26, 21, 17, -1, -9, -11, -37, 11, -33, 6, -33, 42, 1, -11, -18, 20, -12, -16, 9, -12, -50, 22, 19, -61, 5, -27, -55, -30, -23, -22, 2, 60, -18, 28, 17, -28, 26, -11, -23, 25, -28, -33, -30, 2, 4, -7, 38, -3, -11, -5, 12, -28, -19, 89, 8, -35, -46, 18, -26, -18, -35, -44, 49, +-25, -21, -38, -6, 34, -48, 36, 16, 42, 6, -14, 37, 29, -39, 11, -5, 14, 2, -20, -31, 29, 37, 20, 23, 17, 31, 62, -2, -2, -3, -52, -17, 7, -55, -31, -24, 76, 15, 49, 6, -5, -32, -12, -3, 44, 27, 17, -22, -19, -18, -43, 44, -19, 5, 29, -10, -18, -57, -1, 10, -2, -15, -10, 7, -13, -15, 22, -18, 25, 11, -7, -11, -16, -11, -9, 4, 27, 13, 3, -24, -15, +14, -8, 22, 0, -22, -29, -4, -58, 4, 5, -73, -23, -23, 6, 7, -3, 11, 21, -45, -8, 15, -8, 66, 1, -27, 79, -6, 17, 42, -26, 29, -59, -4, -32, -30, 30, 5, -6, -44, -1, -33, -21, -46, 18, -8, 41, -8, -19, -25, 34, -20, 2, -4, 16, 36, 40, -20, -37, 4, 0, 5, 10, -11, -15, 6, -13, 86, -23, -13, -18, 47, -17, -31, 41, 7, -5, -16, -58, -46, -4, -5, +-10, 78, -49, -7, -63, 65, -13, -53, -46, 59, -60, 21, -40, 103, -34, -35, -70, -23, -8, 37, -51, 42, -40, 42, -32, 40, -35, -23, 70, -2, 26, -6, -31, 51, 9, 34, -18, -5, 21, -34, 1, 7, -6, 21, 17, -18, -7, 8, 16, -14, 3, 20, -20, -9, -13, -29, 20, -35, 15, 94, 0, -34, -12, -37, 42, 25, -54, 44, -12, -5, 24, -22, -56, 11, -13, -11, -22, 14, -5, -3, 18, +-26, -29, -43, -37, 18, -33, -45, 76, -2, 35, -21, -2, -6, 2, -38, 7, 44, 2, 15, 45, -4, 9, 13, -11, -3, 1, -9, 18, -29, 7, 4, -10, -6, -28, 50, 8, -15, -19, -16, -14, -36, -8, 7, 4, -18, 12, -12, -5, -10, -50, -27, -13, -15, -26, -5, -43, 5, 63, -11, -3, -2, -35, -20, -19, 69, -35, 31, 32, -8, -33, -6, -18, 3, 23, -20, 33, 40, 14, -22, -35, -22, +19, -22, -30, 10, -8, -5, -15, -3, 49, -1, 30, -42, 0, -32, 1, 9, -42, 9, -6, -16, -32, -15, -3, 4, -40, -22, -21, -10, 18, -28, -6, 19, -13, -25, 3, -22, -1, -12, -29, -5, -1, 8, 14, -37, 5, 0, 50, -1, 8, -11, 9, 10, -29, 12, 7, 47, -19, -21, -9, 9, -19, -6, -30, -13, -26, 31, -12, -22, 28, 1, 17, -24, -15, -10, 13, 40, 7, -17, 35, 45, 8, +32, 13, 16, -9, -6, -62, -2, 32, -1, 0, -29, -31, -8, -69, -26, 27, -32, 32, -55, 46, 39, 58, -19, 27, 44, 36, 61, 36, 61, 19, 10, -47, 9, 7, 9, -5, -22, -56, -22, -2, 30, -18, 25, 7, 8, 16, -31, 80, -21, -24, -3, 9, -72, -1, 12, 46, 13, -94, 3, 30, -6, 30, 33, -13, -3, -19, -10, -11, -1, -4, 5, -50, -8, -3, -4, 7, -6, 15, 10, 90, 17, +0, 3, -37, -25, 80, -7, 55, 21, -15, -49, -21, 6, 32, -9, -18, -14, 6, 90, -9, -10, -8, 1, 32, 60, 58, 12, -2, -26, 5, -38, 35, 6, -7, -8, 15, -67, -25, -41, -15, -55, -6, -30, 9, 16, 29, -9, 25, 14, 4, 2, 1, -42, -1, 22, 7, 6, 50, -29, -7, -6, -7, 36, 12, -6, -31, 1, -30, 17, -3, 5, 36, 15, -26, -32, 1, 10, -23, -28, -14, 32, 14, +-29, 2, -13, -6, -9, -4, -22, 42, -4, -12, 2, -29, 79, -36, 20, -15, -46, 8, 17, -53, -21, 1, 34, -13, -11, 30, 3, -10, 32, -13, -7, -6, -11, -13, -24, 127, 50, -30, -1, 39, -41, -30, -52, -1, -5, -42, 45, -27, 32, -39, 29, -18, -15, 32, 3, -25, 36, 7, -57, 74, -10, -6, 13, -21, -56, 32, 16, 20, 18, 13, 16, 26, -5, 0, 11, 13, -26, -14, 16, 1, -21, +40, 1, -36, -27, 127, -4, 13, -58, 6, -52, -14, -36, 58, 15, 1, 9, -28, 52, 28, -24, 15, -36, 61, -19, -30, -41, -8, -17, -54, -46, 66, -22, -22, -32, 74, 19, 26, -8, 22, -3, -3, -69, 79, -5, -15, 37, 2, -29, -10, 54, 65, -19, -14, -21, 33, -21, -5, 6, 43, -24, -4, 8, -22, 11, 71, -26, 0, 3, 23, -20, -17, 34, 9, -18, -5, 9, 23, -11, -28, -8, -13, +-13, 4, 67, 8, -13, -18, -9, 81, 5, -20, -40, -5, -43, -9, -5, -35, -6, -22, 72, 13, 7, 56, 5, -19, -48, -14, 15, 15, -13, -37, -6, 0, -8, -10, 4, -25, -21, 36, -3, -29, -20, 9, -9, 5, 3, -60, 6, 0, -14, 22, 42, 46, 46, -4, -6, 24, -15, -17, -8, 9, -33, -21, 23, 8, -19, -3, 55, 16, 11, -2, -16, 25, -30, 17, 6, 22, 16, -37, 8, 11, 18, +-28, -37, 32, -28, -8, -14, -44, 37, -53, -25, -9, -26, 12, 19, -33, 0, 33, -12, -14, 17, 3, -36, 12, -14, -15, 9, -18, 37, 31, -55, -18, 48, 13, 29, 13, -7, 45, -6, 7, -17, 5, 63, 127, 27, 6, -14, -50, -21, 18, -6, 6, -13, 31, 12, 21, -21, 12, -3, 3, -25, -20, -6, 18, 19, -25, 18, 2, -10, 1, -40, -22, -8, 39, 84, 127, -20, -17, -22, -22, 30, 17, +-9, 1, -12, -4, -18, -21, -6, 0, -3, 6, 53, -22, -18, 16, -41, -10, 12, -1, 22, 24, 3, 27, 7, 3, -25, 28, 16, -3, -4, -2, -26, 20, 5, -35, -47, 19, -17, -3, -35, 15, -16, -6, -23, 49, 22, -18, 81, -4, -34, 64, -38, 62, -5, 30, 31, 16, 93, 123, 10, -16, -42, -68, -22, 1, 32, 24, 14, 7, 16, 22, 44, 5, -26, -8, 21, -11, -8, 41, -17, -33, -5, +30, -24, -6, 32, -28, 31, -8, -46, 0, -6, 14, 8, -27, -7, 28, -1, -29, -6, -9, -10, 19, -13, 4, -55, 7, -19, 46, 13, -15, -12, -7, 2, 47, -15, 45, -32, -19, -25, -24, -33, -14, -10, -10, -5, 30, -30, 12, 3, -34, 8, -23, 6, 24, -50, 69, -2, -14, 9, 19, 14, 0, 71, -16, 9, 63, 9, 25, 13, 66, -15, 10, -18, 19, -35, 23, -12, 21, 5, 21, -13, 2, +3, 25, 9, 44, 3, 29, 24, -41, 23, 11, -4, -21, -20, -8, -5, 7, 103, -28, -7, 18, 11, 13, -1, 18, -11, -11, -41, -2, 12, 59, 30, 24, -1, 48, -33, -1, -10, 22, -51, -27, 35, -19, -19, 87, -18, -19, 6, -55, 13, -6, 23, 17, -18, -15, -38, 7, 12, 4, 29, -6, -4, -20, -2, -2, -38, 75, -30, -43, -9, -43, 25, -2, -27, -9, 1, -10, 36, 46, 6, 19, -5, +25, 34, -48, 56, -14, -8, 26, -5, -35, -46, -23, 2, -28, -3, 16, 56, -37, 1, 72, -46, -28, 14, 90, 80, 28, 40, 37, 23, 122, 0, 25, 30, -9, 46, 36, -28, -13, 5, -14, 40, -24, 39, -23, 2, -22, 10, 46, -28, -8, -27, -34, 7, 1, 2, -45, -26, 26, 19, -31, 13, 98, 12, -22, -8, -7, -21, -18, 83, 13, 23, -19, 37, 90, 29, 61, 23, -10, -24, 1, -18, -14, +-6, -9, 26, 57, 21, 37, -24, 9, 21, 14, -22, 34, -31, -40, -17, 0, -2, 29, 3, -8, -3, 47, 8, -27, -6, 10, -20, 10, -4, -39, 5, -24, -30, 11, 48, 77, -12, -31, -5, 73, 2, 2, -35, 34, 23, 22, -17, -19, 26, -16, -15, -3, -33, -2, -30, -19, -47, -14, -14, -10, -1, -5, 7, 26, -9, -17, -35, -2, -30, 23, -4, -25, 43, -14, 29, 13, 7, -4, 7, -3, -6, +-8, 127, 16, 19, 12, 14, 61, -1, -2, 30, -9, 3, 31, -23, 27, -7, -3, -33, 12, 24, 17, -48, -48, 31, -37, -22, -41, 45, -17, -31, -32, 16, -5, 38, -14, 14, -45, -13, -40, 40, 6, -26, -2, 11, -36, -21, -5, -43, -1, -8, 15, -22, 50, 27, -2, 7, -42, -10, 33, -17, -9, 59, 8, 11, -28, -1, 64, -20, 17, -13, -35, -51, 11, -25, 7, 22, 0, 17, -43, -5, 48, +5, 28, -23, -1, 46, 45, -18, 19, -4, 33, -24, -9, 37, -39, -17, 25, -2, 6, -3, -7, -25, -19, 4, 51, -10, 46, 34, -2, -4, -15, 1, 11, -14, 10, 45, 48, 5, 7, -8, -8, -27, 42, 22, -2, 21, -2, -54, -17, -8, -8, 28, 108, -15, -36, -4, -22, -6, -19, -35, -37, -8, 0, -17, -1, -19, 25, 76, 43, -4, 32, -30, 16, -20, -41, 34, 15, 8, 9, -23, -67, -14, +-11, 27, -30, 23, -42, -30, -7, -16, 7, 3, -32, 0, -33, -7, -18, 3, -7, -11, -22, -8, 1, -84, 12, 4, 29, 15, 0, 23, 40, 62, -20, -16, 11, -1, -13, -13, -21, 56, -20, 46, -9, -11, -44, 6, 20, -25, -32, 55, 45, -17, -22, -15, -38, -17, 20, -11, 37, -18, -43, -8, -9, -11, 44, -11, -32, 11, -12, -9, -40, 15, -42, -3, -10, -12, -54, -17, -22, -38, 8, 7, 44, +5, 37, -47, -6, 35, 89, 93, -50, -20, -54, 16, -19, -6, -6, -17, 30, -6, 11, -13, -20, 66, -27, -45, 77, 5, 9, 6, -19, 63, -53, 10, -66, -11, 95, 3, -19, 2, 38, 25, 77, -6, 3, -20, -15, -27, 13, 84, 43, 11, -27, 20, -6, 1, -16, -7, 32, 22, 10, -15, 7, -18, -3, 16, 40, 43, 42, 24, 18, 0, 28, 21, 26, -34, -43, 2, -14, 22, 26, 40, -73, 7, +-53, -19, -30, -12, 7, -1, -5, -23, -22, -17, -55, 10, -18, 3, 1, 16, 49, -6, 119, -2, 21, -27, 17, 46, -19, -61, 17, -5, 21, -50, 5, 39, 35, -52, -24, 0, -7, -15, -7, -7, -4, -37, -50, -28, 14, -5, -35, 77, -20, -51, -54, -17, -62, -10, 45, 9, -13, -34, 2, 46, -13, -46, 10, -21, -4, -34, 97, -35, -35, -19, 36, 3, -46, -26, 10, -37, 8, 50, 16, 40, 1, +-68, 28, 5, -14, -35, -27, -33, -47, 0, -5, 101, -19, -9, -38, -8, 24, -4, -8, 7, -37, -22, -16, -15, 6, -19, -21, 9, 15, -16, -12, -10, 2, -19, -24, -21, 37, 60, -11, 3, -5, -10, -7, -24, 23, 54, -14, 37, 1, -6, -25, -48, 18, 12, 20, 7, -20, -6, -7, -35, 25, 2, -1, 16, 14, -59, 23, 10, 20, -28, -5, -7, -2, 16, -24, -13, 27, 5, -11, 2, 0, 36, +-30, -4, -20, 12, -14, 8, 6, -21, 11, 0, -8, -6, 11, 19, -9, -12, 4, -35, 9, 14, 26, -8, 6, -19, -13, -16, -28, -2, 0, -34, -3, -2, -29, -4, -21, -29, -2, 5, 29, -1, -3, -4, 21, 41, -16, -14, -34, 17, -5, 25, -4, 29, -37, -33, 18, 18, 0, 11, -19, -3, 9, 43, 64, 15, -1, 26, 43, 127, -30, 49, -5, 6, 19, -23, -13, 10, 3, 21, 18, -46, -25, +-14, 44, 17, 106, 11, 18, 8, -33, -10, -14, 36, -3, -8, -20, 0, 27, -28, 78, -11, 80, 9, -4, 67, 41, 27, -62, -9, 35, 32, -22, 7, -1, -18, 6, 6, 113, 21, 8, 62, 12, -30, -66, 5, -3, 17, -31, -34, 8, -17, 48, 12, -23, 9, 2, -17, 13, -26, 0, 10, 4, 5, -1, -25, 20, -24, -43, -4, 1, -6, 1, 28, 32, -13, -4, 13, -26, 50, -39, -17, 28, 10, +27, 22, 11, 21, -20, 23, 20, 26, -1, 53, 80, -56, -22, 24, -2, -64, -9, -9, 122, -24, 45, 3, 15, 46, 27, -17, 61, 11, -62, -22, 56, -26, 72, 0, -81, 79, 11, -13, -29, -1, -8, 27, 45, -24, 8, -6, -11, 25, 21, 34, -11, 55, -12, 55, 23, 26, -31, -4, -40, -13, -2, -47, -7, 42, 52, 98, -10, -53, -27, 8, 35, 41, -2, -21, 23, 116, 25, -28, 14, 56, 1, +-9, 12, -18, -8, -15, 8, 0, -30, 6, -12, 25, -8, 15, -34, -19, -22, 8, -30, 21, 32, -8, -5, -14, -38, 15, -7, 36, 9, -23, -10, 73, 42, -9, -28, 15, 0, 3, 12, 3, -7, 3, -12, -9, -7, 25, 2, -27, -39, -14, -51, -19, -26, -40, -29, 42, 45, 45, 11, -3, 11, -13, 26, 0, 3, 46, -23, -36, 16, -15, 12, 6, -5, 23, 12, -39, -32, 18, 7, -22, -3, -35, +-10, 5, -31, -33, 14, -17, -29, 30, -38, -36, 2, 24, -16, -15, 10, 78, -1, 24, -16, 40, 10, -28, 14, -8, -2, 71, -14, 16, 0, -18, 49, -22, 17, 37, -12, -32, 60, -7, 21, -8, 37, 87, 18, 40, -39, 7, 11, -3, -27, -34, 20, -7, 0, 127, -22, -38, -10, 60, -14, -42, 6, 16, 77, -72, 55, -36, -2, -10, 32, -45, -8, -2, -23, -13, -8, 1, -42, -35, -3, -1, 28, +24, 67, -25, -23, 75, -29, 3, 40, 11, 36, 9, -14, 22, 5, -25, 24, -30, 18, 37, 55, -22, 60, -33, 5, -40, 22, 33, -3, 69, 60, -42, 72, -14, -24, 12, -14, 23, -26, -30, -29, -1, 19, -20, -80, -47, 7, 78, 4, -32, 23, -11, 13, 19, -14, -20, 1, 19, -5, 0, 10, -7, -2, -12, -3, 6, 10, 10, -41, -15, 16, -13, 127, 18, -10, 1, 7, -19, 0, 11, 5, 44, +6, 3, 14, 10, -3, 61, -42, -47, 11, 15, 0, -13, -8, -7, -6, -6, -5, -4, -17, 0, -13, 6, 115, -11, -17, -1, -22, 40, 26, 41, -8, 12, 1, -29, -16, -16, -23, -16, 71, -1, 33, -11, -12, -9, -2, -5, -10, -14, -14, 52, 23, -10, 5, -14, 4, -19, -10, -21, -26, -20, 13, -5, -17, -15, -12, 18, 15, -10, 4, -18, 3, 115, 54, 27, -1, 3, 34, -4, -6, 6, 28, +16, 16, 2, 44, 31, -16, -23, -39, 82, -9, -15, -8, 30, 17, -3, 39, 37, -31, -5, 49, 18, 19, 13, -7, -15, 11, -24, -40, -2, -18, -50, 3, 14, 45, -11, 0, 27, -50, -52, 5, -5, 0, -32, -27, 15, -15, 21, -3, -25, -1, 9, 34, -12, -16, 49, -9, 5, -16, -41, -15, -38, 21, -41, 11, -4, 37, 28, 2, 44, -25, -24, 68, 0, -46, -53, 1, -32, -20, -9, 63, -4, +50, -20, -41, -17, -30, -11, 29, -32, 5, -11, 4, -10, 1, 7, -14, 8, -43, -18, 8, 20, 0, 24, 42, -3, -31, -3, -22, 5, 53, 45, 42, 97, -12, -30, 76, 16, 37, -21, 6, -15, -4, -1, -29, -15, -23, -4, 5, -3, 21, 42, -53, -59, -2, -5, 28, 8, 42, -32, -19, 5, -19, 48, 14, -59, 33, -22, 21, -37, -19, 127, 41, 12, -14, -13, 33, -24, -11, 11, -52, -29, -12, +-38, 20, -27, 1, 40, 3, 56, -23, 33, -8, 34, 17, -3, -5, -59, 46, -8, -7, -13, -22, -3, 36, 44, -4, -25, -8, -10, -10, 91, 32, -21, -40, -6, 4, -4, -9, 32, -24, -2, -4, -33, -35, 22, 32, -10, -15, 13, -43, -14, -18, -9, 33, 14, 45, 64, -20, 47, 10, 15, 12, -14, 41, 60, 9, -15, 5, -7, 127, 18, -36, -43, -11, -11, -8, -30, 78, -14, 6, 38, -12, -12, +46, -3, 127, 12, 12, -26, -55, -22, 4, 3, -10, -46, 52, 87, 35, -14, 5, -14, 39, -12, -3, -9, -14, 14, -14, 43, 33, -3, 4, -55, -16, -19, 52, -37, 32, -8, -54, -13, 8, -4, -23, -17, 9, -27, 77, 44, -1, -18, 2, -12, 113, -33, 8, -11, 49, 5, 6, 1, 125, 22, -6, -41, 25, 4, 61, -29, 3, -9, 1, 12, -57, 17, 77, -39, 43, 42, -22, -10, 50, 55, 32, +-10, -38, 26, 47, -17, -26, -49, 34, -26, 27, 19, 9, -34, 3, -31, 23, -27, 22, -43, -15, 89, -11, -42, -39, -36, 17, -43, 5, -21, -6, 25, -4, -59, 13, -34, -6, -9, -63, 38, -34, -4, 10, 39, 58, -59, -58, -11, 56, 109, -25, -12, -29, -37, -32, -47, -45, -37, -57, 4, 30, 18, -32, -4, -18, -32, 1, -28, -30, 15, 23, -48, -4, -21, -38, -8, 2, 43, -51, -3, -28, 28, +-25, 12, 21, 8, 15, -22, -24, -30, 30, -26, 0, 7, -41, 28, 0, -18, -9, 9, -19, -25, 15, -51, 34, -58, -8, 42, 28, -25, 22, -14, 13, 18, 97, 16, -33, 1, -32, -3, 23, -61, 6, -17, -3, -12, 83, -4, 29, -48, -36, -19, -24, 16, 70, 127, -29, -24, 10, -23, -11, 51, -21, -12, -34, 3, 3, 20, -12, 34, 3, -32, -34, -23, 42, -6, -28, -56, -27, -7, -1, -9, -1, +9, 95, -31, -32, -22, -6, -6, -28, -3, -20, 17, -12, -10, 40, 0, 0, 30, -12, -16, 10, 8, -42, -56, 6, 21, -5, -13, 27, 13, 60, -33, -16, -23, 2, -12, 0, -12, -7, -28, -53, -23, 21, -1, -9, 3, -7, -8, -31, -4, -33, -14, 11, 48, -40, 3, -7, -18, -1, -41, 26, 11, 5, -21, 5, 53, -6, 50, 2, -12, 0, -25, -22, -29, 36, -25, -5, 43, -8, 47, -32, -34, +22, -37, -7, -43, -11, -7, -43, -8, 22, 0, -22, 12, 81, -6, -15, 3, 37, 3, -32, -35, 18, -38, 25, -5, -64, 38, -15, -67, -30, -40, 29, -36, -35, 29, 1, 34, -28, 115, 8, -7, 75, 21, 75, -27, -77, 96, -36, 46, -27, -34, 23, 44, -5, -29, 22, 27, -12, 6, 28, -20, 27, 56, -2, -3, 13, 15, 115, 7, -27, -24, 25, -28, 73, -31, 72, 102, -35, -4, 17, 41, -18, +32, -30, 26, 6, -27, 30, 7, -3, -69, 24, -55, 4, 59, -23, -1, 33, -29, 67, 11, 37, -29, -18, -21, 42, 21, 20, 25, -50, -19, 17, 51, -5, 45, 39, -13, -43, -29, -3, -19, 7, -18, 18, -20, -23, 7, -42, 24, 23, 31, 14, -22, 23, -18, -7, 22, 40, 127, 23, 4, 4, -26, -28, 45, 9, 42, -33, 15, 39, -39, 25, -11, -17, -20, -57, 7, -32, -50, -45, -30, -44, 68, +-3, -1, 3, -60, 21, 45, 5, 35, -60, 10, -19, -2, -52, 9, 67, 68, -30, -43, 13, -48, 4, 22, 53, 6, 0, -13, 41, -15, -7, -53, -38, -41, 18, 18, 10, 0, -1, -28, 25, -5, 41, -44, 30, 67, 31, -36, -22, -12, 98, -64, -22, -18, 34, 44, 1, -7, 3, 51, -98, 65, 25, -11, -59, -34, 16, 45, 59, 14, 4, -45, 25, 1, 39, 48, 82, 66, -34, -46, -9, -40, 12, +46, -33, -10, 9, 31, -65, -33, -9, 52, 31, 27, -71, -13, -23, 49, -32, -55, 127, 31, 37, 8, 57, -32, -114, -5, -11, -10, -11, 30, -34, -64, -53, 0, 70, -53, 26, 27, -30, -19, 41, 24, 17, 31, 13, 27, -39, -37, 10, -27, 6, -30, 46, 22, 14, 11, 30, -19, 2, -23, 0, -4, -14, 21, 5, -6, 15, -20, 6, 83, -29, 12, -14, -11, -3, -5, 49, -27, 4, 62, -10, -9, +-3, -14, 48, -88, -15, 18, -25, -45, 14, -25, 19, -22, 3, 17, -60, 18, 33, 0, -25, 62, -14, 24, -14, 1, -48, 4, -5, -22, 27, -45, -8, -28, 12, -5, 10, 31, -17, -48, 38, -22, 5, 30, 25, -19, -11, 103, -32, -39, -14, 4, -6, -28, 9, -56, 41, -54, 0, -62, 9, -55, -26, -8, 82, -10, -6, 9, -24, -60, 7, -31, 41, 40, -27, 13, -28, 29, -38, 6, 3, 8, -35, +-11, -21, -47, 1, 8, -29, -11, -26, 4, 23, -51, -20, 5, -6, -34, 46, -42, 17, -11, -1, -13, 9, 9, -47, 46, 13, -47, 5, 10, 7, 3, 57, 19, 0, -21, -13, -23, -33, -47, 7, -76, -27, 42, -21, 40, -42, 5, 22, 13, 2, -32, 71, 3, 46, -18, 7, 13, 18, 33, -19, -11, 12, -11, -44, 9, -18, 49, -1, -12, 2, -32, -47, 2, 25, -13, 1, -18, -28, -13, -2, -36, +35, -7, -2, 13, 10, -3, -17, -15, 9, -44, 12, 34, 1, 73, 22, -2, 23, 103, -6, 2, 34, -18, 44, 13, -21, -7, 13, -13, -25, -24, 8, -50, 81, 1, -11, -19, 8, -20, 15, 1, -11, -9, 10, 25, -1, -20, 1, -38, -22, -28, -23, -90, -27, -53, 7, -41, -57, -52, -51, -39, -18, -16, -6, 78, 15, -36, -30, 13, 39, -45, 7, -63, -27, 35, 45, -27, 20, 15, 28, -1, -15, +9, 0, 2, -7, 29, 36, -18, 71, -35, 21, -18, 15, -33, 20, 18, -10, -73, -7, 10, -16, 11, -54, 3, 19, 65, 41, -2, 55, 58, 16, -19, 5, -33, -1, 0, -34, -41, -21, -13, 27, -20, 0, -7, 8, -7, -2, -1, 7, -22, 71, 29, -43, -32, -9, 7, -29, -51, -4, -55, 78, 21, 46, -4, 3, 21, 63, -11, 8, 36, 28, -12, 10, -55, 3, -36, -44, -38, 35, -10, 42, -15, +40, 4, -13, -47, -2, 49, 86, -30, -39, -8, -3, -26, 12, -22, -55, 42, 20, 21, -83, -60, 36, -36, -6, -4, -58, 23, -8, -8, 7, -33, -2, -18, 8, -18, 21, 7, 9, -18, -20, -27, -38, -16, 18, 40, -26, -19, -6, 51, -7, -22, -1, 12, -40, -16, 8, -8, -28, 28, 8, 7, 36, 0, -30, -25, 24, 9, -6, 22, -36, -2, 21, 10, -41, -17, 11, -4, -21, 19, -40, -55, -40, +20, 65, 17, -17, -34, 47, -17, -36, -58, 10, -25, -34, 1, 70, 33, -2, -9, 38, -24, 68, 12, 22, -18, -15, 15, -15, 19, -29, -24, -7, -76, -40, 5, 59, 31, -50, -89, -61, -24, 17, 34, 17, 41, 43, 35, 94, 83, 0, 47, 34, -52, 82, -76, -24, 22, -19, -17, -62, 2, -67, -51, -24, -22, -79, -57, -42, -40, 35, 47, -58, 21, 20, 30, -30, 53, -27, 125, -40, -41, 108, -1, +13, 5, -22, -54, -61, -2, -21, 3, 8, 46, -34, -10, 33, -1, -16, 75, 7, 22, -18, -27, -10, -10, 48, 13, -12, 37, 41, 27, -18, -36, 21, 41, -1, 6, 36, 52, 0, 13, 41, 53, -9, 35, 22, 41, -30, 46, 56, -15, 19, -26, 30, -1, -50, 40, -6, 11, -33, -53, 4, 21, 8, -38, -11, 17, -32, 2, 43, 22, -7, -29, 17, -7, -43, -26, 8, -14, -20, -37, 31, 6, 59, +-5, -6, -20, 18, -45, -40, -19, -29, 18, 26, 27, 5, -7, 31, 45, 4, -7, -30, -17, 25, 115, -62, -73, 24, 32, 2, -16, -70, 0, 54, -16, -5, 6, -44, 39, -8, -28, 3, 63, -21, -4, -15, -6, 38, -8, 4, 5, -18, -15, 70, 34, -20, 29, -30, 32, 86, 3, 40, -42, -15, 36, 30, -25, -10, 19, -3, -21, -39, 4, 2, 31, 100, -15, -12, 34, -11, -5, -23, 23, -31, -14, +-17, -25, -12, 17, 1, 33, -16, -7, 18, 1, -25, 25, 44, 38, -19, 25, 3, 17, 66, -48, 18, 1, -13, -22, -42, 34, 49, -16, 47, -12, -1, -26, 74, -18, 7, 65, 8, 11, -5, -15, -27, -36, 5, -38, -23, 3, -28, -1, 4, 22, -20, 0, -12, -16, -45, 67, 9, 2, -6, -8, -12, -24, 36, -8, -26, 28, -7, 9, 28, -4, -11, -2, 4, 0, -21, 53, -57, -16, 11, 7, -14, +-40, 17, 101, -8, 99, 10, 3, -45, -64, -23, -13, 37, 18, -28, -26, -11, -26, -82, -41, -6, 101, 28, 16, -43, -49, -70, -47, -12, -10, -11, -11, 26, 65, 51, 18, -4, -16, 66, -26, 13, 11, -25, 31, 26, -22, 49, -28, -4, -21, -20, -7, 127, -11, -15, -38, -19, -26, -17, -32, 45, 22, -51, -20, 14, 80, 24, 64, -4, 1, 89, 9, -21, 29, -15, -30, 6, 15, -2, 62, 1, -52, +-21, -20, 15, 36, -22, 39, 5, -33, 15, -8, -28, 29, -13, 30, 31, -61, -28, -6, 0, 21, -34, 14, -20, -23, -50, 36, -2, 21, -12, -2, 110, 4, -20, 67, -4, -46, 25, 33, -21, -24, 33, 42, -16, 64, -24, -14, -15, -18, 79, 19, 4, 6, -10, -50, 8, 18, 37, 0, -30, 41, 25, -4, 25, 127, 17, 7, -40, -27, -32, -25, -22, -8, -13, 34, -32, -36, 4, -10, -22, -24, -54, +83, -25, -22, -66, 5, -44, -37, 3, -25, -8, 77, -17, 16, 60, -15, -20, 14, 80, 3, -90, 8, -51, -17, -43, 10, 87, -13, -34, -30, 37, -7, 27, -2, 38, 93, 18, -38, 14, 57, 8, -24, 21, -25, -43, -45, 31, -9, -26, -53, 59, -25, 4, -28, 82, 40, -34, 65, 28, -62, 22, -57, -10, 20, -38, -16, -45, 2, 87, -35, 15, 3, 46, -5, 46, -5, -25, -11, 63, 40, -35, 54, +-85, 6, 10, 8, 87, 0, -34, 27, 115, -3, -8, -20, -20, -19, -4, 69, -27, -75, -17, -26, -23, 12, 79, 18, -43, 27, -39, -45, 24, 55, -45, -15, -17, 37, 92, 17, -8, -1, -3, 57, -64, -17, 9, 64, -16, -25, -19, 64, 0, -39, 15, -16, -62, -6, -41, 43, 15, -60, -22, 23, -46, -24, -5, -2, -22, -18, 48, 25, -32, -29, -45, -15, -52, -29, -7, 1, -14, -27, -6, 2, -9, +-22, 14, 21, -14, 12, -29, -54, -43, -1, 11, 37, -11, -26, -36, 112, -32, 127, -1, -42, 18, 74, 32, -48, 38, 4, -35, -19, -33, -3, -46, -6, -17, -16, -10, 0, -43, -57, -70, 1, -10, 7, -70, -60, -23, -6, 32, 16, -25, -49, 65, -26, -24, -19, 9, 29, -34, -12, 60, -18, 0, -20, -29, 2, -19, 25, 11, -35, 0, -19, -13, -10, 27, -3, 19, 11, -13, -3, -6, -45, -4, 73, +-23, -21, -46, -17, 18, -8, 58, -36, 4, -26, 11, 3, 28, -48, 17, 36, 2, 21, 10, 19, -2, -32, -20, -9, -4, -46, 8, -7, 18, 74, -39, -10, 47, -14, -2, 8, 26, 54, -65, -24, -9, 27, -34, -19, 11, 18, -19, 12, -13, 37, 31, 31, -57, 0, -27, -32, 8, -58, -23, 4, -35, 41, 25, -3, -2, -35, -16, -20, 32, -2, -21, -2, -8, 22, 1, 5, 17, 30, 20, 16, -12, +-21, 35, -49, -28, 13, -41, 1, 38, 30, -27, -30, 7, -16, -44, 30, -13, -18, -60, 3, 6, 126, 121, -53, 38, -18, 107, -32, -40, 88, -4, 63, -6, -94, -16, -3, -6, -74, 40, 15, 32, -19, 15, 32, 16, 33, -35, 47, -40, -30, -35, -125, 13, -29, 15, -7, -54, -28, 46, -49, -43, 70, -22, 1, -11, 110, -1, -22, -9, -32, -24, -1, 25, -82, -20, -30, 18, -7, 20, 11, -10, -80, +-10, -13, 7, -22, 25, 40, 11, 30, 13, 22, -20, 55, -30, -34, -27, 127, -9, -10, -20, -25, -8, 9, -27, -22, 18, -55, -15, -14, 28, 41, -12, -25, 8, -26, -8, 117, -44, 29, 13, 4, 9, -13, 25, 45, -18, -14, -11, -45, 79, 28, -34, -23, -23, -14, -26, -23, 38, -11, -22, 32, -38, 80, -33, 38, 36, -18, 57, -3, 50, -70, -18, -12, 44, -12, 0, 23, -11, 100, -19, 58, 91, +34, -57, 2, -50, -10, 62, 116, 9, -13, -29, 38, 13, 52, 38, 89, 0, -38, -4, -1, -32, -7, -35, 13, -18, -33, -27, 51, -60, 4, 20, 65, -57, -12, 100, -13, 1, -1, -7, 38, -12, 25, 68, 23, -24, 67, -37, 39, -14, 0, 17, -40, -6, 51, -22, -7, 5, -63, 22, -2, -49, -38, 7, -53, -6, -35, 5, -54, 37, 46, -52, -19, -3, -12, 9, -30, -20, -67, 23, 15, -58, -5, +-43, -14, 34, 84, -16, 2, 2, -55, 55, 36, -49, -32, -35, -70, 60, -82, -50, -6, 47, -43, -1, -58, 92, -9, -73, 115, -40, -10, 43, -7, -14, 46, -37, 58, -5, -15, -15, 34, 11, 76, 106, -16, -25, -9, -1, 52, 16, 11, 9, -17, 48, -42, 28, 15, 109, 50, -19, 22, 127, -2, -43, -64, 13, 41, -29, -34, 62, -36, 56, 15, -42, -12, 126, 1, -23, -1, -25, -54, 4, -31, -20, +-30, -30, 91, -9, -14, 8, 59, 39, 59, 11, 12, -43, -38, 45, -26, -6, 17, -19, -14, 31, 26, -24, -34, -19, 0, -44, 30, 25, 4, 0, 54, -5, -3, 17, 17, 6, 121, 53, -7, -29, 60, -13, -21, 12, -13, 28, 36, 4, 24, 27, 23, 10, 29, -28, 26, -30, 22, -59, 9, 55, 22, -4, -12, -12, -7, 23, -5, 19, -34, 4, -34, 46, 29, -20, -58, 16, -39, -17, -58, -14, -28, +40, 4, 7, -8, -35, -29, 46, -12, -18, 35, -51, -3, 74, -26, -13, -1, -1, -14, -7, 56, 51, 38, -9, 23, -15, 16, -50, -12, 10, 6, -26, -8, 2, 7, -14, -35, 2, -5, -16, -13, 9, 11, 31, 10, -17, -9, -25, -28, 3, 55, 11, -22, 41, 15, -2, -18, -27, -4, -62, -31, -20, -30, -10, -7, 22, -27, -11, 13, -2, -10, 37, -5, -32, 47, -12, 13, 11, -23, 17, -14, 6, +-26, -38, 1, -61, 9, -1, -14, -34, 21, -14, 12, 69, -11, -48, 37, -7, -36, 25, -3, -30, 5, -36, -3, -22, 48, -28, 41, 17, -7, 33, 21, 18, 29, 97, 7, -53, 127, -19, -2, 13, 12, -3, -42, 46, -45, 22, 12, -28, -13, -77, 40, 18, -10, 12, -29, 11, -11, -16, 11, 13, 31, 64, 105, -28, 112, -46, -42, -29, 27, 65, -61, -33, -21, 17, -12, 20, -37, 6, -2, -28, -25, +-25, 46, 21, -72, 5, 27, -17, 1, 3, -35, -5, 10, -33, 42, -52, -24, -14, -28, 21, -27, 11, -54, -29, 24, -61, -28, -4, 1, 14, -1, -10, 24, 8, -24, 23, -57, -3, 28, -17, -20, -22, -31, -38, -24, -25, -3, 36, -7, -9, -28, 4, -7, -40, -9, -30, -5, -27, -8, -11, -51, -16, -19, -43, -11, -25, -39, -40, 1, -25, 35, -33, 6, 78, -40, -14, -26, 29, 0, -77, 109, 1, +30, -12, 6, 10, -19, -79, -14, 19, 35, 37, -22, -53, -25, 12, -45, 54, -42, -8, -5, 5, 86, -69, 7, 21, -30, 2, -47, 56, 42, 7, -39, 110, -16, -33, 63, 49, -15, -49, -40, -22, 15, -6, 6, -30, -20, -8, -15, 42, -48, 11, -47, 45, -34, -10, -26, -33, -54, 1, 29, -3, 38, 29, -38, 22, -13, 18, -29, 27, 31, -30, -43, 35, -19, 42, -13, -51, -32, -3, -19, -16, 1, +-5, 50, 60, -21, -26, -35, -19, -69, 40, -31, -34, -35, -4, 45, -5, 39, -43, -17, 0, 14, -27, 7, 19, -16, 8, -43, -25, 10, -49, 6, 8, -12, 6, 24, 62, -3, 36, -51, -8, -54, 35, -45, 40, -28, 9, -16, -57, -29, -34, -24, 9, 37, -6, -47, 24, -44, -13, -31, 36, 16, -75, -5, -6, 17, -10, -9, 48, -20, 15, -12, 56, 14, 8, 13, 12, 44, -29, -2, -11, 14, -94, +-33, 10, 40, 33, -29, 29, 20, -12, 10, 6, -9, -3, -16, -13, -11, -2, -5, 23, 51, -15, 5, 37, -19, 45, -6, 35, 1, -11, 2, 127, 11, 18, -29, 115, 5, 40, -19, -18, 25, 39, -29, 36, 5, 2, -8, -18, -10, -24, -18, 107, 14, 26, 48, 0, -1, 23, 16, 95, 22, -10, 2, 41, -39, -29, -5, -12, 51, -46, 6, -14, 0, 24, 27, -50, -62, -4, 2, -14, 12, 71, -14, +-25, -8, -10, 3, 7, -34, 80, 6, -3, -35, -19, -17, 36, 89, -20, 0, 38, -7, 21, -37, 3, 126, 10, 72, 7, 5, -10, -20, 5, 21, 8, 21, 37, 51, 45, -19, -11, 4, 22, -26, 32, 12, 28, -1, -16, -13, -22, 45, -12, -11, 1, -4, -15, 6, 1, 7, 10, 3, 7, -4, -21, 18, 30, 3, 19, 127, -17, 20, -10, -19, -3, -15, -34, 15, 4, -18, -16, 0, 37, 44, 35, +-7, 9, 18, 7, 16, 61, -4, -18, 11, -19, 21, 108, -7, -3, -9, -39, 5, 77, -24, -67, -11, -4, 15, 70, 3, -23, -21, -11, -19, 127, 125, 16, 6, 39, -5, 5, 0, -23, 65, 33, -14, 18, -18, -7, -9, -17, 68, 10, 56, 16, -17, -19, -18, 24, 0, 33, -23, -21, 16, 15, -28, 48, 30, 4, -1, 82, -10, -45, -32, -29, 3, -11, 45, 61, 0, -15, -54, 27, -25, -39, 11, +24, 50, -28, -25, -15, 35, 12, -58, -17, 29, -59, 34, -62, 7, -50, -77, -5, -42, 77, 3, 53, -20, -13, -2, -6, -24, -18, -35, 56, -4, 23, 12, 42, -23, -10, 2, 43, -15, 4, 28, -33, -57, 50, -30, -23, -43, 84, -17, -2, 6, 15, 34, 92, -8, -8, -23, 13, 4, -10, 23, -4, -3, 14, 7, 12, -30, -7, -44, 69, -2, -26, -5, 22, 26, -46, -28, -10, -21, 22, -10, -51, +-33, 10, -3, 19, 12, -4, 4, 25, -17, -2, 68, 47, -63, 12, -19, 92, -12, -4, 46, -21, 43, 28, -20, -1, -39, -29, -23, -4, 70, -21, -41, -64, -20, 27, 21, 9, 50, 46, -22, 73, -6, 83, -24, -7, -49, -13, -42, 51, 22, 47, -23, -31, -18, 24, -23, 20, 33, -68, -43, 31, 42, 42, 39, 26, 8, 9, -5, 70, 20, -15, 29, 3, 23, -34, -14, -37, -19, 79, 21, -53, 9, +-22, 55, -5, -27, -30, 3, -14, 2, -35, -17, 69, -28, 2, -15, -1, -8, -34, 89, 15, -37, 73, -46, -66, 75, -73, 2, -20, 37, -30, -23, -60, 3, -29, -3, -26, -53, -6, 28, -62, -11, -18, 5, -14, 13, 34, 26, -24, -11, -16, 119, 0, -28, 21, -75, 53, 52, -95, 21, 26, 11, 3, -51, -71, -72, 15, 71, -62, 24, -18, 12, -5, -13, -10, 38, -81, -9, 28, 47, -3, -38, 75, +88, 22, 5, 56, 59, -8, 9, -47, -70, -17, 13, -12, 28, 6, -10, -15, 37, 10, -11, 78, -30, -14, -7, 19, -17, 57, 60, 18, -38, -20, 1, 99, 21, -5, -11, 1, -8, 83, 1, -9, -61, -5, -22, -22, -37, 5, 103, 6, 54, -20, -37, 3, -1, 9, 0, 47, -5, 12, 8, 15, -3, -27, -33, 2, 65, 26, 12, 12, -19, -12, -22, -2, -18, -16, 74, 17, 39, 13, 9, 15, 62, +-1, -22, -12, 40, 8, 21, 27, -13, 10, -32, 7, 57, 9, -35, 0, -15, -23, 0, 11, 50, 0, -17, -47, 7, 13, 9, -33, -14, -19, 34, -35, 14, 40, 107, 2, 48, -1, -2, 57, 42, -47, -4, -21, 0, 69, -10, 23, 118, 51, -12, 60, 14, 0, -1, 0, 8, 32, 1, 22, -25, -24, -10, 8, 6, 25, 7, 8, 16, -3, -7, -5, -5, -6, 19, 4, 28, 7, 6, 15, -1, -1, +-20, 11, 40, -38, 22, 6, -28, 23, 34, -16, -9, 33, -33, 11, -20, -13, 16, -7, -4, -24, 19, -5, -10, -9, -4, -11, -16, 4, -17, -21, -23, -24, 18, 31, 56, 28, -49, 19, -19, -24, 0, 11, 11, 13, -15, 0, 14, -61, 2, 13, 18, -27, 37, -14, -8, -35, -14, -1, 17, -3, 25, 5, -16, 60, -22, 12, -2, 52, -9, 58, -16, 17, -1, -2, 18, -2, 45, -3, 11, -30, -20, +6, 26, -13, 27, 25, 28, 78, -14, -21, -15, -25, -14, -22, 25, 27, 0, 74, 33, 16, 77, -18, 57, 16, -52, -5, -22, -27, -6, -41, -16, 0, -5, 117, 34, -3, -26, 18, -2, -42, 29, -20, 34, 13, 7, 74, 127, -56, -41, 41, -1, -26, -7, 13, -15, -39, -40, 9, -16, -9, -29, 30, -18, -12, -64, -23, 42, 6, -17, -9, 29, 11, -18, -21, 2, 9, -37, -20, 0, -35, 91, -26, +13, 12, 3, -13, 18, 5, 11, 31, -28, -15, -29, 17, 11, -18, -43, 0, 7, -18, -14, 8, 26, -30, 6, -15, -11, -6, -34, 19, 13, 104, 11, -35, -54, -17, -42, -5, -54, 81, 76, 9, -58, 42, -5, 17, 5, -35, 41, 21, -19, 19, 0, 9, -25, -14, 6, -8, 10, 6, -14, 41, 6, -45, -66, 66, -6, 26, -25, -14, -55, -15, -31, 59, 73, -12, 49, -4, 18, -9, 4, -33, 3, +-31, 46, -45, -6, 82, -55, -53, -26, 7, -50, 39, 71, -22, -64, -19, -30, 3, -15, 4, -6, 6, -30, -4, -21, 101, -25, -25, -50, -4, -23, 0, 14, -17, 15, 1, -14, 13, 22, -30, 75, -23, -21, -30, -10, -27, 29, -20, 12, 1, -21, -4, -23, 96, 81, 30, -10, -47, 0, 35, 104, -39, 127, 21, -47, -4, 7, -60, 20, 15, 0, -11, -51, 13, 26, -9, 58, 5, 28, 54, -40, -7, +-20, -57, 29, 44, 64, 1, 47, -31, 13, 21, 8, -42, -22, -9, 28, 2, -13, 40, -8, 42, 20, -23, -9, 18, 2, -3, 86, 20, 69, 21, 69, 87, 17, 1, 15, 11, 34, 3, 27, -27, -5, -43, 89, -33, 11, -3, -30, 59, 2, 23, -2, 21, -28, 53, -2, 36, -32, -48, -1, -43, -70, 37, 28, -18, -21, 35, -34, 83, 45, -18, -14, 15, -56, -44, -15, 6, -32, 25, -35, -7, -52, +-13, -9, 23, -1, -9, -1, 3, 32, 21, -56, -14, 30, -7, -29, -28, 17, -15, -12, -87, 25, -50, -2, 14, -4, 30, -17, 16, -4, 11, 0, 5, -41, 37, -60, 4, 64, 17, -35, -1, -27, -50, -20, 66, 16, -5, -9, -51, -15, 19, -35, 72, -32, 13, 82, -18, 41, -16, 20, -8, 21, -17, -16, -12, -70, -33, -5, -15, -19, -55, 53, 52, 86, -9, 61, 1, 38, -32, -17, 13, -25, 23, +15, -33, 5, 45, -3, -16, -28, -8, -16, -25, -31, 30, 21, 13, -9, 4, -45, 37, 13, 127, 26, 8, -27, -21, -25, 23, -11, -36, -23, -21, 30, -6, -27, 109, 7, -37, 17, 56, -8, -22, -18, 10, -20, -43, 16, 0, -29, -36, -18, -6, 34, -28, -6, 34, -10, 33, 38, 5, 52, 2, -26, -21, -14, -7, 17, -44, 9, -15, -40, 0, -4, -33, -11, 61, -25, 10, 31, 47, 55, 33, -35, +22, 43, -18, 3, -27, -14, -17, -13, -18, -6, 9, 24, -11, -30, -9, 59, 10, 0, 44, 1, -27, 3, 11, 42, 0, -19, 17, 12, -26, -16, 20, 6, -1, -14, -5, -35, 21, -20, -26, -9, 43, 0, 21, 25, 6, 6, -38, 29, 124, 18, -12, 25, 41, -46, 121, -7, 47, -53, -48, -18, -30, 41, 47, -32, -18, 57, -26, 41, 98, 65, -67, -47, -27, -103, 20, 4, 4, -14, -2, -39, 126, +-19, -17, -3, 27, 5, -5, -4, 17, -58, -22, 20, -18, -22, -18, -1, 75, 17, -17, -7, -41, -14, -2, -45, 1, -31, -1, 30, -31, -17, 33, -30, -32, -29, -9, -56, -7, -38, -14, 6, -4, -52, 39, -10, -13, 10, 41, -37, 63, 3, -11, 8, -15, 45, 2, -32, -9, -35, 2, -10, -19, -15, 35, -16, -31, -22, 69, -8, 4, 12, -47, -24, -2, -27, -24, -47, 10, 25, 2, -14, 4, -10, +6, 6, -40, 4, -12, -19, -37, -14, 77, -4, -44, -21, 48, 22, -10, 62, -7, 6, 29, -2, 6, -21, 17, -60, -51, 26, 50, 48, -15, -37, -42, -11, -79, -20, 15, 10, -54, -29, -27, -17, -4, 0, 48, 22, 6, -3, 59, 31, 22, 127, -6, 43, 29, 31, 3, -28, 41, 23, -30, -23, 32, -39, -41, 6, -14, 36, 13, -14, 11, 18, -3, 8, -9, -14, 10, -32, -22, -52, 62, -51, -36, +91, 8, 52, -14, 66, -38, 54, -5, -14, 32, -43, -69, -41, 13, 23, -62, 77, 56, 23, 23, -4, 2, 9, -26, -7, 48, -65, -9, -10, -5, 10, 38, 64, -13, -49, 22, 24, -44, 80, -44, 52, 58, -17, 25, 109, -6, -20, -67, -47, -16, 34, -12, 41, -24, 19, -5, -16, 6, -35, 9, -45, 50, -36, -27, 5, 40, -20, -30, -26, 12, -9, -24, 36, -17, -34, -15, -19, 47, 58, -3, 57, +-15, -8, 100, 40, 44, -36, 13, 24, -3, 15, 34, -14, -6, -17, -29, -6, -14, 18, -12, -7, -24, -23, -19, 5, -31, 32, 24, 14, -4, -25, 44, 19, -11, -27, -33, 31, -53, 20, 23, -14, 39, 13, 11, -2, -10, 37, -7, -57, 14, -58, -44, -44, -1, -21, 42, 16, -37, 43, 17, 18, -40, 5, 63, 49, -40, 69, -23, -8, 20, -14, 27, -11, -26, -6, -4, -5, 7, -24, -35, -10, -11, +-29, 86, -12, 19, -8, 13, 27, -2, 15, -17, -24, 12, 1, 2, 1, -14, -46, -22, 28, 14, 11, 6, -15, 0, -19, 33, -2, 55, -3, -69, 4, -10, 16, 40, -40, 3, 111, -28, 42, -30, 37, -15, -62, 36, 20, 67, 12, 52, 28, 71, 107, 0, -10, -13, 20, -11, 11, 7, 10, -15, 25, -1, -16, -2, 17, 5, -6, 10, 0, 2, 3, 6, 1, -37, 30, 17, -26, -2, 18, 2, 31, +-18, -11, 64, -8, -6, -36, -86, 34, -38, -64, -15, -63, -23, -56, 26, 21, -8, -5, -8, -13, 88, 31, -3, 3, -3, 22, -52, 62, 9, 48, 6, -9, 28, -27, -33, -40, -37, 5, 99, 13, 26, 48, -83, 7, 61, 20, -31, -59, -53, 39, 45, -35, -8, 18, 35, 8, 57, 45, 89, -38, -18, 9, 73, -20, 54, 15, -19, -45, -2, -11, 12, 13, 39, -22, 16, -44, 11, 17, 67, 33, 64, +-12, 47, -8, 37, 12, -31, -54, 23, -17, 96, 35, 15, -20, -20, -47, -2, 73, 26, -15, -21, -20, -14, 30, 14, 97, 14, -4, -18, 26, -30, 44, 35, 11, -30, -6, -22, -30, -47, 10, -7, 14, -66, 35, -4, 18, -18, -7, -25, 22, 0, -24, -21, 19, 26, -21, -1, 23, -2, 10, -32, -48, -2, 32, 31, 114, 20, -12, 23, -24, -13, 13, 10, -37, -13, -9, -26, -14, 14, -12, -6, -6, +2, -23, -28, 18, 72, 17, 127, -21, 51, 7, 1, 4, 5, -14, 32, -14, -66, 18, -17, -2, 66, 0, 13, 0, 21, 50, -7, 20, -19, -17, 89, 10, 10, -17, 15, -21, -10, 26, -51, 53, -31, -29, 6, -28, -10, -23, 74, 27, 24, -6, -17, -36, -3, 2, -12, 13, -39, -2, -7, -50, 20, -37, 7, -32, 103, 13, -24, 6, 11, -37, 2, -48, -27, 4, 8, 15, -14, -18, 127, -12, 20, +-4, 40, -9, -23, -21, 32, -26, 32, 18, 0, -27, -39, -5, 65, -42, -26, 0, 34, -3, -9, 40, -22, -14, 12, 45, -40, -37, -30, -2, -40, 6, -13, -33, 5, 14, 35, -29, -12, 57, 11, -29, -10, -4, -34, 7, -16, 6, -7, 7, -18, -20, -1, -14, -55, -28, 12, -7, -61, 12, 11, -16, -12, -4, -7, 15, -41, -13, -34, -15, -51, 30, -57, -3, 2, 44, 79, -29, 3, 41, -5, -2, +-23, -19, 5, -25, 2, -54, 17, -5, 46, 29, -9, -13, -17, 10, -18, 59, 72, 8, -9, -30, -7, -13, 25, -28, 13, -19, 12, 10, 51, -25, 16, 29, -20, 23, -13, 26, 62, 57, -41, -33, 25, -19, 14, -6, -28, -16, -45, 30, 27, 23, -16, -29, -14, -40, 2, 8, -3, 5, -26, -50, 8, -16, 89, 15, -51, -24, -35, -11, -80, 37, -28, 40, 7, -29, 24, 28, 18, -37, -22, 36, 12, +0, 37, 0, 55, -65, 5, -35, 59, 27, -44, -39, 78, 32, 2, -45, -36, 27, 41, 2, -3, -12, 9, -16, -14, -7, 4, -23, -15, -10, -31, -2, 30, 51, -9, -5, -3, -19, -7, -11, 16, -22, 79, 0, 5, 13, -11, -23, 20, -77, -16, -5, 15, 40, 44, -59, 12, -59, -12, 3, 20, -22, -36, -29, 53, -30, -2, -12, 56, 69, 47, 60, -39, -38, -31, -26, 1, -26, -35, -4, 73, 12, +29, -15, 14, -47, 8, -16, -8, -31, -11, -32, -3, -16, 0, 34, 45, 22, 10, 1, 5, 42, -24, 47, 33, 6, -32, -2, 7, -13, 11, 7, -42, -32, 4, 36, 8, 45, -21, 39, -1, -20, 8, 29, -18, 61, 58, -11, 41, 6, -43, 10, 13, 5, -23, -19, -30, 6, -18, -21, 25, 0, -19, -39, -28, 3, -47, -15, 26, 33, -33, -30, -24, -2, -65, 25, 4, 1, -26, -37, 5, 1, -29, +11, -29, -38, -48, -9, 8, 71, -20, 47, -19, 3, -19, -27, 5, -14, -24, 45, 46, 34, -17, -79, -49, -47, -3, 13, 19, 54, -2, 114, 17, -10, -13, -55, 34, 64, -44, -19, -36, 81, -1, 20, 31, -31, -41, -29, 8, 79, 0, -6, 39, 1, -52, -4, -1, -16, -34, 11, -30, -36, 33, 11, -26, -2, -33, 10, -8, -32, 14, 15, 32, 15, 5, 19, 12, -42, 11, -24, 111, 52, -36, 4, +-5, -21, -5, 5, 29, -16, 17, 32, -19, 6, 13, -28, -12, -12, 37, -2, 44, -20, 26, 11, 27, 9, 5, 12, 25, 40, -14, 14, 7, -26, 4, -26, -2, -23, 89, -44, 110, -16, 8, 51, -5, 0, -22, 87, -32, -12, -34, 20, -18, -57, 57, 5, 5, 27, -31, -30, 47, 15, -12, 69, 14, 22, -6, -28, 5, 12, 8, -21, 60, 4, 25, 14, -5, 2, -1, -10, 17, 17, -3, -22, 13, +-28, -17, -12, 30, 15, 4, -18, 23, 67, 0, 9, 4, 18, -27, 4, -16, 20, 18, -6, 22, -28, -25, -10, 19, 4, -3, -47, 38, 34, 56, 15, -10, -2, 56, -18, -17, 45, -39, -1, -3, -9, 41, -36, -23, 50, -33, 8, -41, -14, -63, 3, -5, -63, -13, 21, -29, -34, 9, 115, -4, -25, 68, 2, -6, -3, 6, -26, 12, 5, 31, 26, -36, 4, 12, -42, -35, 10, 8, 22, -30, 4, +30, 28, -58, 11, -41, -69, -6, -33, -68, -13, 16, -2, 59, -19, 67, -10, 5, -14, -48, -57, 11, -21, 13, -33, -30, -25, -4, -37, -36, 71, -4, -25, 0, -27, 29, 26, -7, -17, -21, -15, 13, 13, -14, -43, -7, 44, 10, -7, -51, -43, -45, -5, -26, 28, 45, 25, -7, -26, 23, -9, -17, -11, -18, -33, -4, 6, 4, -9, -6, 5, 127, -13, 3, 59, -13, -22, 0, 12, 25, -26, -21, +-5, -42, 38, 22, -36, 24, -41, -5, -34, 8, -20, 14, 56, -17, -22, -7, 46, -19, 2, -21, -20, 84, -25, -26, -13, 25, -18, 5, 18, 8, 2, -43, 21, 20, 16, -37, -12, -18, -26, -26, -31, 28, 3, 4, 28, -6, 10, -13, -21, -8, -13, 1, 42, -42, -17, 27, 2, 2, -4, 15, 41, 3, 22, 27, 56, -1, -12, 127, -10, -13, 13, 18, 2, 13, -73, -88, 64, 30, 26, 17, 10, +-13, -8, -55, 7, -1, -33, 49, -15, -47, -8, 22, 61, -16, -68, -44, -36, -20, -12, -11, 4, -19, -28, -6, 21, 99, 28, 82, -21, 17, 33, -5, -29, -1, -18, 57, -3, -34, -12, -37, -37, -14, 10, -17, -47, -2, 29, 3, 4, -19, 16, -12, -6, -13, -6, 30, -28, 12, 35, -6, 61, -22, -10, -7, 1, 4, 19, 12, -51, 4, -4, -57, -23, -27, 29, 27, 4, -20, -13, -29, 8, 31, +-2, 13, -15, -30, -1, -8, -8, 14, 37, -37, 49, -11, -31, 9, -2, 1, -2, -16, -6, -34, -10, 37, 19, -33, 35, 28, 74, 15, -3, -5, -63, -47, -29, -14, 0, 16, -37, 0, -32, 25, 16, -14, 84, 50, -39, -37, 7, -46, 2, -9, -35, 23, 85, -25, -42, -25, -2, 13, 10, -9, -4, 88, -79, -33, -11, -2, -50, 88, -11, -53, -36, -8, 42, 11, 9, 34, -9, -36, 52, 7, -45, +-24, -10, 25, -29, 16, 31, 31, -4, -28, 2, -10, -30, -28, 64, -32, 15, -40, -13, -12, 62, -31, -15, 8, 21, -53, -7, -4, -14, -11, -2, 31, 4, 25, 10, -25, -3, 10, 30, -2, 1, 24, -34, 1, 1, 2, 4, -10, -24, 24, -4, -27, -12, 8, 41, 23, 3, -12, -43, -31, 36, 47, 69, 33, -14, -15, 17, -26, 8, 37, 2, -8, 0, 34, 73, -1, -34, -42, 2, -1, 27, -54, +7, 47, 4, -17, -38, 14, -32, -24, -24, -2, -18, 0, -12, 30, -18, 29, 5, 54, -33, 5, -26, 22, 28, 18, -40, -25, -2, -12, 24, 33, 7, 39, -19, -20, -16, -10, 17, 32, 5, 8, 97, 7, 48, -9, 28, -15, -33, -17, -17, -85, -55, -36, -9, 2, -11, -32, -3, -18, -24, 20, -6, -24, 11, 43, -12, -53, 40, 1, -21, 13, 113, 112, -16, 24, 24, 6, 8, 9, -28, 20, -13, +-24, -39, -32, 17, 98, 49, -12, 20, -2, -39, 13, -8, -17, 61, -6, -36, -27, 17, -41, -10, 73, -5, -18, -2, -17, -50, 17, 22, 84, 66, 6, -11, 7, -6, 34, -40, 22, -40, 11, -6, -8, -49, 29, 34, -13, -9, 22, -14, 10, -3, 12, -32, 15, -42, 91, 27, -23, 12, 41, -11, 11, -13, 51, -11, -22, -31, -11, 7, 40, 4, 11, -12, 58, -24, 23, 3, 23, 4, 2, -48, 6, +34, 7, -7, -27, -27, -33, 12, 17, -17, -3, 33, -8, 57, -12, -27, -41, 40, -19, -5, -7, 72, -39, -6, 29, -56, -27, -32, 22, -5, 19, 31, -4, -61, -3, -4, -12, -15, -43, -74, -25, 35, -4, -21, -54, -7, -14, 15, 18, 17, -4, 9, 4, 7, 21, 21, -13, 5, 65, 25, -19, 19, -41, 43, 22, -23, -13, -41, -9, 26, -14, 15, 6, -7, 10, -38, -33, 50, 34, -15, 23, -2, +14, -14, 51, -42, 72, 10, 19, -7, -15, -13, 5, -21, -18, 39, -44, -17, -2, -20, -18, 41, -9, -4, 0, -20, -38, -62, 53, -16, 25, -85, 127, -23, 0, -34, -25, -27, 38, -19, 11, -4, -1, 26, -70, -39, -17, -5, 10, 40, -28, 11, 28, -2, -42, -9, -5, -25, 28, -30, 30, -1, -63, -4, -26, -42, 12, 17, -13, -4, -26, -21, -1, -39, 33, 26, -6, 35, -29, 19, -16, 19, 12, +-48, -19, 24, 44, -22, 27, 5, -28, -53, -57, 38, 4, 8, -29, 11, 37, 81, 25, -24, -59, -16, 78, 31, -3, -40, 54, -30, -26, -24, -36, 37, -35, -51, -34, -3, 22, -21, 32, 47, -11, -62, 30, 17, -48, -39, 17, -5, -44, -19, 65, -6, -3, 56, -45, -16, 17, 12, 7, -12, 17, -4, 14, 23, -13, 32, 42, -71, 34, 15, 12, 99, 29, -54, 71, -61, -9, -8, -3, -50, -63, -34, +-20, 7, -44, -23, 2, -69, 99, 9, 31, 80, -22, -35, 93, -51, -90, 21, -15, -18, 43, -4, 3, 28, -15, -29, -35, 11, 37, 6, -12, 39, -33, 35, 61, -9, -12, 10, -18, 9, -8, -3, -19, 53, -28, 6, -25, -1, -8, -30, -18, -27, 68, 13, -11, 13, -6, -24, -21, -22, -13, -3, 21, -14, -4, -8, 46, -38, -11, -33, -5, 28, -3, 0, -40, 43, -48, 47, 41, 46, -9, 14, -7, +2, -60, 4, -48, -16, -17, -55, -43, -13, 71, -31, -10, 6, -37, -54, 74, -33, 17, 48, -3, -21, 4, -8, 2, -28, 7, -15, -25, 52, -25, 25, 44, -17, 7, 8, 5, -5, -24, -19, -28, 24, -8, 6, -11, -10, 13, -23, 38, -6, -13, -31, 80, -11, 6, -4, 23, -21, -24, 20, 2, -43, -6, -14, -17, 38, -13, -5, -5, -19, -3, -26, -25, -13, 62, 42, 40, -33, -12, -14, 102, -38, +-22, 17, 103, 12, -5, 15, 24, -1, -14, 13, -55, -8, -9, -3, -29, -47, -55, -13, 17, -41, 23, -37, -28, -64, -17, -51, 42, 60, -4, 34, 24, 26, -10, 0, 8, 97, 24, 7, -36, 0, 19, 99, -56, -49, 6, 7, 29, 34, 34, 50, 42, -49, 42, -50, 29, -13, -23, -24, 2, -1, -29, 60, 4, -38, -7, -22, 52, -29, 40, -29, -37, 40, -55, -17, 32, 127, 11, -37, 26, 26, -5, +-28, -38, -25, 22, 21, 14, 11, 29, -7, 13, 30, 52, 29, -29, -30, -25, -2, 24, -18, -51, 9, -5, 5, -17, -42, -49, 49, 49, -21, 12, -28, -15, -31, -8, -7, 39, -20, 77, 17, -27, -13, 23, -32, -23, -54, 17, -13, 21, -20, -17, -17, 29, -26, -3, 34, 17, -8, -27, -30, -31, 24, 42, -12, 32, -25, 82, 42, 6, -43, 33, 13, -14, 12, 48, 9, 13, 28, 8, -32, -33, -31, +30, 10, 15, -13, 27, 62, 6, -11, -29, 33, 19, -47, 3, -2, 11, -7, -15, -2, 11, -20, -12, -7, 13, -11, -4, -24, 14, 38, -5, 5, -17, 14, 11, -10, -13, 60, -26, 15, -35, 25, -12, -2, -18, 15, 26, -3, -6, -35, 6, -3, 22, -25, -30, 18, -32, -11, 6, -46, -40, -7, -16, -27, -55, -4, 100, -9, 19, 36, 27, -8, -71, 1, -8, -30, -14, -16, -57, -12, -41, -7, 10, +14, 38, -11, 0, 29, -27, 79, -43, 4, 53, -19, -2, 21, 19, 127, -4, 23, -19, -38, -6, -32, -16, -25, -4, 16, 6, -10, 5, 30, -10, -41, 41, 6, 66, -19, 0, -17, -35, 21, 18, -19, 33, 39, -42, -24, 17, -43, 13, -10, -17, 9, 29, -49, 127, -6, 35, 16, 42, 21, 7, 32, -38, -41, 0, -2, -1, 33, 48, -19, -26, -35, -7, -18, 6, -21, -15, -20, 5, 4, 76, -53, +-28, 14, 13, 14, -44, -35, -26, -17, 45, -10, -13, -10, -32, -4, 62, -34, 61, 14, -43, -38, -41, -2, 33, -49, 49, -10, -25, -47, -56, 8, -6, -40, -8, -1, -5, -51, 8, -26, 29, -38, 0, 61, 40, -37, -60, 5, 74, 3, 59, -39, 38, -37, 9, -10, 79, -20, -28, 35, 31, 50, -7, -2, -1, -33, 43, 11, 15, 11, 127, -17, -73, 13, 11, -36, 25, 9, -41, 1, 7, 56, -14, +-6, -4, -4, -36, 7, 1, -10, 39, 45, 15, -25, -24, -11, 7, 4, 127, 57, -17, -6, 5, 42, 12, -15, -2, -23, -31, -5, -50, -59, -20, -14, 7, -67, 2, -59, -23, 16, -10, -47, 13, 10, -9, -2, -5, -9, -27, -45, 5, -1, 23, -34, -31, -13, -35, 52, 75, -33, 24, -8, 6, 86, -37, 121, -19, -36, -1, -17, -36, 56, -20, -45, -1, -15, 52, -8, 0, 5, 3, -40, -20, -4, +-26, 95, -52, -14, -22, 11, -15, -34, 10, 0, -11, -29, 55, -35, 19, -57, -16, -21, -27, 5, -20, 74, 23, 0, 10, -14, 10, -3, -19, -50, -10, -6, 7, -10, -5, -3, 9, 40, 25, -19, 16, -26, -29, -6, 4, -24, -16, -31, -50, -18, -29, 17, -104, -9, 38, -75, -18, -14, -25, -33, -4, 78, 95, -36, -68, -34, 43, -9, 3, 12, 4, -4, -33, 28, -19, -19, -8, -43, 27, -57, 74, +47, -18, 35, 21, -23, 64, 44, 37, 68, 41, -11, 48, -34, 25, -77, 59, -76, -61, 31, -17, 19, -3, -13, -21, -18, 61, 6, 34, -7, -31, -35, 11, 10, -37, -12, -28, -3, -18, 13, 14, 8, 30, 9, 15, -26, 7, -15, 7, -9, -30, -1, -27, -1, 57, -5, -14, -23, 22, -30, -11, 19, 0, -4, 25, 74, 30, 0, -22, 4, -12, -14, 21, -1, -17, -16, -32, -31, 3, 27, 11, 10, +19, -32, 11, 16, 25, 16, -8, -13, 97, 9, -29, -53, -35, 127, -30, -17, -47, 19, 55, 46, -24, -32, 79, 30, 0, 62, -14, -12, 58, 7, -7, 0, 37, -8, -36, -37, -37, 19, -45, -33, 9, 11, -13, -21, 3, 24, 8, 2, 41, 4, 7, -5, -55, 16, 1, 14, -9, 17, 23, -10, -20, -16, -19, -21, -35, 46, 1, -8, -7, 23, -13, -39, 27, 48, 33, -84, 23, -29, -28, 16, 2, +20, -22, 110, -62, -5, -22, -26, -35, 7, -36, -29, 33, -33, 27, 37, 11, 41, -28, 43, -16, -13, 51, -16, 17, 21, -33, -1, 9, -5, -15, -17, 34, 42, 5, 13, 35, -17, 68, 33, 21, 24, -14, -9, -13, 82, 7, -18, 29, -57, -9, -16, 17, -4, 6, 0, 12, 2, -16, -42, -40, 0, 12, 21, -24, 33, 67, 37, 38, 12, 14, -28, 30, 9, 30, -10, 67, 22, 22, -14, -21, 1, +-26, -1, -19, 9, -12, -47, -29, 1, -8, -11, -20, -11, 60, 7, -26, 13, -19, 49, -51, -6, 10, -44, -36, -3, -37, -13, -9, 26, 77, -8, 8, -13, -25, 39, 17, -52, 41, -11, 44, 58, -56, -25, 34, 6, 127, -24, -56, 7, 61, 54, 33, -3, 65, 43, 77, -53, -31, -46, 16, 5, 17, -1, -30, 58, 7, -8, 2, 29, -40, -53, -38, -42, 50, 65, -26, -3, 18, 54, 42, 19, -17, +-11, -34, 7, -3, -62, 38, 28, 30, -22, -81, 13, 43, 9, 126, -22, 7, -28, 1, 3, 10, -8, -18, 12, -7, 11, -3, 13, 21, 8, -22, 40, 37, 20, 8, -13, -19, 58, -16, -5, -8, 23, -38, -9, -8, -35, -26, -42, 29, -19, 21, -25, -18, -29, 4, -25, 19, -51, 36, -7, 10, 20, -31, -28, -8, -15, -37, -6, 9, 17, -23, -8, -22, -32, 53, 3, -11, 4, -33, -32, -36, -14, +-32, -38, -8, 2, -27, -32, 1, -2, 3, 56, 3, 10, 6, 38, -17, 26, -16, -6, -7, 38, 34, 42, 127, 36, 2, -16, 34, -18, -7, -29, 10, 41, 22, -10, -16, -44, -41, 15, 6, -16, 19, -8, 86, -18, 22, 3, -13, -1, -2, 4, -30, 0, 1, 31, -15, 47, -12, -10, -1, -6, -14, -21, -19, 63, -20, 23, 43, -33, 84, 36, -59, -31, -59, 40, -1, -2, 5, 33, -30, 54, 3, +-28, 117, 20, -20, 28, 3, -9, -31, 78, -13, 16, -7, 44, -2, -9, -2, 3, -32, -10, 46, 74, 91, -35, 21, -9, 21, -25, -57, 31, -27, 21, -30, -63, 82, -4, 68, 51, -5, 30, 24, 51, 33, -13, -17, -16, 18, -32, 56, -35, -5, 9, 15, 1, 59, 21, -15, 8, -10, 127, 39, -12, -5, 41, -3, -12, -13, -7, -41, -28, -11, -47, -18, 2, -14, 7, -1, -18, 37, 42, -2, 10, +-66, -7, 40, -17, -30, 4, -16, 45, -16, 20, 6, -32, 13, 55, 16, -1, -38, 6, 75, 10, 22, -1, 23, 16, -9, -20, 23, 34, -36, -13, 22, -20, 17, 3, 16, 6, 43, -44, 31, -21, 13, -32, -38, 7, -1, -55, -20, -17, -6, -16, 3, -15, -32, 26, 6, 5, -11, -33, 39, 28, 1, -37, 57, -34, -39, -24, -12, -44, -24, 7, -10, 9, 16, -14, -8, -6, 26, -2, 25, -16, -12, +3, 10, -30, 19, -26, -9, 27, -4, 0, 36, 13, -12, 7, -16, 18, -18, 46, -19, -16, 7, 77, -4, 44, 34, -9, 11, -34, 30, -5, -23, -33, 37, 19, -40, -20, 9, -21, -18, -31, -25, -11, -8, 20, -4, -21, -41, 11, 45, -38, 35, -28, -13, -24, -19, 66, 27, 21, 8, -13, -8, 8, 43, 9, 10, -5, -23, 21, -23, -21, -37, 25, 43, -55, -19, -4, -26, 5, -14, -24, 3, 31, +23, 15, -12, 0, 60, -6, 26, 0, 2, 18, -1, -9, -48, 4, 57, -32, 25, 10, -31, 39, -14, -5, 20, -34, 19, -27, 14, -39, 51, -51, -6, -33, 52, 15, -17, 35, 38, 15, -38, 59, 9, 24, -33, 44, 4, 97, 35, -7, 34, -31, -20, -16, 7, 83, -30, 46, -40, 45, -26, -9, 96, 20, -16, -29, -35, 12, 9, -16, 35, 47, -56, -24, -50, 34, -42, -3, -62, -4, -36, 84, 6, +-43, -6, 77, 10, -40, -29, 44, -39, 46, 67, -11, -33, -23, 30, 5, -15, -30, -13, 40, -35, 36, -11, -25, -2, 34, -11, -8, 66, -13, 22, 55, -58, -41, -1, 10, 18, -1, -10, 25, -1, 17, 60, 14, 5, -3, -27, 66, 14, -12, -8, -11, 5, -2, 10, -33, -10, 7, -6, -1, 60, 23, 34, 59, 22, 0, -38, 2, 61, -33, 42, 8, 2, 10, 67, -2, -20, 4, 25, -26, -51, 4, +24, 63, -26, -28, -12, 64, -20, -78, -21, 66, 12, -31, 7, 23, -39, 9, -8, 6, -44, 5, 18, 20, 2, -1, -13, -8, 14, 83, -13, 9, -28, -36, -28, -11, -43, -21, -8, -9, 4, -10, -8, 8, 31, -16, 7, -12, 29, -16, -29, 13, -9, 12, -21, 39, 30, -23, -13, 7, -17, 20, 24, -10, -38, -31, -5, 47, 19, -9, 19, -8, -8, -20, 31, 35, -24, -50, -6, 1, 27, -7, -2, +26, 12, 6, 25, 12, 27, -26, -18, -6, -12, 12, 11, 17, -47, -52, 12, 8, -34, 127, 11, -16, -23, 26, -53, 40, -34, -34, -24, -12, -14, 73, 4, -31, -20, -63, -44, 41, 38, -36, -44, 10, 40, -4, -9, 50, 11, -75, 3, -49, -14, 67, 28, -8, 5, 5, -27, -26, -19, 32, 0, -31, -27, -92, -20, 42, -37, -49, 44, -39, -2, -9, 9, 19, 19, -15, -6, 13, 39, -23, -33, -3, +-6, -48, -27, 20, -51, 42, -46, -34, 30, -39, -10, 53, 78, -36, -7, -35, -20, -9, -14, 0, 2, 37, -6, -42, -32, -21, 18, 21, 50, -2, -15, -43, 74, -50, 6, -10, 29, -28, -7, -2, 44, -47, -17, 36, 12, 19, 40, -25, 21, 32, -27, 16, 34, -2, 5, -13, -4, 14, 24, 45, 19, 9, 38, -19, -20, 34, -57, 3, 5, -12, 3, -16, -20, -39, 51, -15, -48, 4, 10, 39, -1, +-11, -31, -33, 37, -33, -74, -16, -41, 19, 19, -36, 1, 59, -20, -14, -13, -9, 8, 2, 1, -23, -17, -34, -18, -13, -11, -24, -31, -24, -9, 2, 49, 42, 22, -7, 5, 20, -1, -4, 3, 28, -8, -45, 7, -49, 4, 17, 18, -16, 10, -62, -15, 55, -14, 26, -3, -28, 41, 112, 17, 7, -17, 27, -31, -8, 22, -39, -32, -30, -43, -6, -16, 10, 30, 4, 9, 24, -40, 34, -45, -11, +10, -42, 30, 8, -22, 0, 9, 9, 37, 46, -17, 41, 24, 10, -4, 15, 19, -32, 8, -36, -35, -34, 1, 23, -24, -19, 27, -6, -22, -3, 18, 82, -31, -22, -26, -17, 27, 43, 45, -53, -13, -27, -29, 39, 29, -19, -7, 4, -40, -31, -20, 9, 26, 7, 12, -3, 32, -25, 71, -16, 5, -9, -9, -33, -41, -1, -6, 89, -56, 127, -34, 29, 30, -38, -19, -35, -50, -41, 33, 62, 65, +-40, -6, -10, -3, -26, -41, -18, 9, 1, -23, 56, 44, -23, -30, -10, 35, 60, 19, 71, -67, 19, 2, -54, 31, 32, -22, -46, 2, 29, -43, 35, -69, -24, -18, 66, -22, -24, 89, 21, 22, 16, 22, 30, 43, -34, -26, 16, -13, -24, -8, 2, 40, -33, 42, -30, 8, 67, 49, -14, 25, -56, 10, -3, -12, -48, 12, 17, 17, 44, -24, 30, 33, 21, 5, 13, -6, -8, -30, -9, -19, 16, +20, -6, 8, 21, -43, -5, -5, -23, 7, -21, 3, -29, -15, 7, -22, -49, -30, 2, -4, -9, -14, -47, -3, 43, 111, -63, 63, -22, 37, 24, -42, -18, 44, 72, 8, 32, 39, -3, -26, 77, 7, -24, -48, -24, -1, 5, -58, -15, 51, -32, 4, -13, -41, -52, -6, -32, 9, -3, -57, -12, 101, 4, 18, -26, -6, 0, 4, 37, 12, -35, -14, -30, 2, 3, -15, 0, 3, 18, 5, -7, -36, +-32, 38, 26, -37, 55, -26, 2, -51, -23, -33, -5, -12, -9, -3, -44, 43, 69, -12, -2, -8, -35, 5, 38, 6, -12, 13, -42, -34, -44, 13, 2, -26, -32, -26, 0, 3, -4, -5, 9, -61, -60, 14, 2, 5, -36, -1, -4, 38, -29, 3, 21, 8, -35, 19, 26, 3, -20, 4, -55, -29, 31, 3, 5, -4, -32, -30, 24, 87, -31, -15, 8, 3, 70, 34, 8, -32, 27, -28, -21, 45, -33, +13, -6, 15, -30, -13, 8, -47, -24, -4, -9, 14, 44, -9, -22, 97, 3, -16, 12, 5, 14, -31, -22, -14, -34, 71, -4, -68, -4, -12, -46, 34, -33, 9, 42, -32, -32, -5, 17, 3, 22, 44, -24, -62, -19, -29, 22, -6, 33, 11, -23, 41, -42, -14, 27, 3, 32, -31, -10, -47, 2, -42, 17, -41, -36, 11, -15, 1, 82, -13, 52, 40, 55, -58, -15, 7, -27, -52, 68, -8, 10, -27, +-8, -45, -76, 3, 44, -20, -24, 8, 0, 15, 1, -23, -20, 40, -8, 19, 69, -11, -12, 4, -13, 19, 91, -8, -33, -58, 30, -20, -24, -32, 21, -38, 10, 7, 15, -19, 30, -7, 9, 0, -37, 20, 13, -10, -5, 11, -24, 1, -12, 3, -22, -1, -16, -7, 1, -17, 13, -54, -20, 33, 12, -60, 1, -16, 54, -39, -28, 4, 41, 41, -26, 25, -35, 17, 47, -8, 14, -2, 13, -37, -58, +-30, -41, -13, -18, 50, -26, -45, 26, 37, 8, 20, -21, -7, -15, -11, -25, 50, -49, 65, 104, 19, -28, -19, 4, -41, 34, -38, 8, -5, 30, 25, -9, -12, 14, -2, 19, -42, -38, -29, -7, 33, -10, -58, 28, -10, 5, 40, -19, 22, -37, 3, 30, -32, 24, 7, 6, 50, -44, -67, 60, 5, -26, 17, -29, -66, 76, 38, 6, -39, 75, 10, -35, -4, -4, -66, -20, 13, -14, 41, 39, 54, +-47, -12, 102, 17, 32, 23, -30, -16, -29, -33, 13, -5, -15, -8, -11, -41, 39, 62, -37, -6, 6, -1, 1, 18, -40, -21, -7, 22, -21, -4, 9, 42, -44, -13, -31, -16, -61, 17, 9, 18, -5, 11, -24, 10, -12, -39, -24, 31, 20, -27, -9, -39, 7, -11, 39, 32, -28, -33, 46, 40, 49, 20, -27, -24, -9, -5, 8, -23, -43, 8, -16, 14, 12, 2, -33, -11, -2, -5, 25, 30, 1, +-27, 1, -2, 6, -5, -9, -24, 8, 24, 8, 59, 6, 58, -16, 18, -36, -3, 7, 14, 28, 29, -8, -39, 14, -39, -40, 27, 19, 46, 33, 25, -16, 28, -52, -15, 36, -20, -13, -80, -7, -37, 29, -28, -49, -25, 56, -49, -19, 40, 29, 15, 22, -64, 11, -22, -20, -14, -9, 2, -23, -7, 34, -9, -62, 15, 10, -48, 2, -5, 59, 46, 117, 40, -13, 44, -11, 51, 39, -45, -11, 43, +-11, 14, -1, 63, 50, -36, -46, 78, 8, 34, -58, 6, 11, 15, 5, 4, 55, 27, 6, 18, -45, -13, -19, -24, -11, -33, -13, 49, 74, -47, -34, -21, -30, 2, 13, -18, 13, -12, -4, -32, -45, 29, -11, 66, 35, -16, -21, 39, -47, -38, -7, -18, 4, -42, 35, -5, 44, -6, -46, -21, 31, -16, -43, 37, -17, 24, -24, 13, -20, -19, 17, -37, -23, -18, 21, 22, 28, -13, 10, 15, 4, +11, -24, -10, 31, -44, -17, -15, 17, -8, -9, -42, -8, -8, -35, 26, -4, 9, 6, 12, 20, 36, 45, -50, -15, 9, -21, 13, 33, -15, -32, 1, -1, 2, -15, -28, -3, 5, -54, 25, -8, -27, 13, 19, -23, 19, -19, -24, -25, -5, -27, 14, -31, -27, 22, 2, 23, 2, -2, 5, -43, 38, -23, 27, 2, 32, 17, -14, -67, -32, -1, 7, 9, -27, 9, 4, -4, -45, -19, 3, -52, -42, +-83, -14, -8, 77, 32, 15, 2, 59, 49, 4, 4, -7, -46, 19, 60, 18, 51, 28, 44, -47, -12, 10, 38, -33, -2, 40, -14, -4, 10, 24, -36, -13, 47, -31, -38, -36, -40, -39, -19, -30, -3, -33, -46, 33, 19, -1, 25, 86, 1, -7, -39, -23, -13, 38, -48, -27, 14, -34, -8, -5, -4, 15, -17, 27, 10, -7, 21, 3, -14, -26, 15, -14, 12, -3, -40, 17, 15, 12, 63, 53, 2, +39, -36, -28, -48, -6, -41, -15, -61, -7, -24, -2, -29, -14, 101, -19, -63, 43, -17, -67, 104, 20, -21, -41, -14, -54, -1, 44, 28, 38, 18, 26, -86, 19, -6, -58, -14, -27, -40, -37, -105, -4, -36, -85, -53, -13, 58, 26, -47, 7, 13, -14, 17, -3, 73, 39, -20, -35, -35, -63, 2, -45, 4, 0, 32, 53, 35, -10, -20, -24, -8, -38, 35, 60, 4, -59, 25, -9, -48, -2, -115, 84, +-9, -2, -70, -42, 23, -18, -34, 33, -43, -7, -46, -20, 50, 34, -2, 2, 17, 4, -14, 41, -13, -26, -13, 61, -26, -42, -20, 17, -28, 92, -27, -20, 16, -31, 10, -6, -5, 67, -18, 5, 37, -32, 32, -17, 1, -30, -10, -7, 73, 11, -8, 45, 1, -2, -9, 37, -7, 0, -24, 4, 94, -16, -16, 52, 22, -22, -3, 10, -67, -40, 48, 3, -53, -13, 46, 9, -42, -36, 45, -10, 105, +89, -40, 21, 80, 24, 46, 54, -13, -17, -8, 1, 47, 9, -18, -27, 3, -1, 23, -5, -30, -10, -15, -23, 46, -11, -51, -23, 12, 17, -14, 4, -14, -33, 9, 31, 25, 8, -31, -20, -21, -56, -1, 17, 3, -12, -43, -14, -12, -41, 37, 5, -4, -50, 27, -12, -56, 47, -36, 8, 3, 105, -39, -1, 19, 127, 7, 11, 62, 44, -18, 34, -70, -21, -25, 16, -4, -4, -2, 10, 40, 7, +-28, 11, 6, -44, 81, 51, -3, -27, -41, 19, -22, -22, -26, -27, -36, 0, -30, 58, 6, 69, 7, -2, -47, -20, 64, -19, -28, 35, 34, 39, -13, -81, -51, -6, -8, -38, 29, 56, 39, -43, -16, -37, -6, -14, -8, 63, -57, -65, 63, -2, 5, 49, 29, -11, 11, -63, -24, 70, 13, -33, -5, -6, -9, -32, 32, 26, -2, -33, 1, -18, -43, 16, -13, 11, 11, 97, 0, 23, -13, 90, -33, +-7, 57, -12, -23, -46, -10, -42, 13, -34, -7, 0, 21, 12, -37, -12, 15, 27, -13, -37, -3, -21, -24, -4, 19, 29, 18, 84, -16, -15, -10, 22, -20, 21, 29, 15, -32, -20, -22, -22, -27, -23, 91, -29, 8, 19, 28, -33, -33, 73, -36, -22, -33, 18, -25, 33, -11, 0, -32, 60, -21, 5, 91, 49, -30, -43, 67, -18, -2, -15, 43, 9, -18, 58, -23, 48, -1, -59, 108, 40, 17, -33, +18, -28, 11, 127, -2, 51, 94, -35, -58, -13, -22, -4, 107, -33, 70, -38, 8, 66, 107, -13, 47, 1, -22, 22, -5, 21, -55, -3, -6, 14, 31, 0, -52, -40, -1, 2, -8, 63, -1, -48, -28, 2, -9, 31, 34, -59, 92, 32, -34, 3, 61, 20, -7, 3, 16, -29, 14, -30, -34, -24, -24, 92, -38, -16, -44, -26, -5, 96, -13, 53, 124, 34, 1, -18, -27, -33, 94, -11, -15, -15, 69, +9, 39, 45, 76, -14, 14, 40, 24, -35, -8, 17, -7, 8, 11, -29, 10, -63, 2, 127, -11, 40, 119, -14, 4, 23, -15, 4, 46, 33, -10, 14, 44, 1, -16, 25, -10, -16, 48, 49, 19, -38, -1, -8, 11, -62, 59, -47, 3, -28, -2, 12, -22, -25, -7, -17, 91, 44, 47, -41, -37, -28, -65, 15, -14, -28, -15, -32, -56, 14, 25, -34, -16, 72, -13, 47, 39, -4, 26, -29, -10, -32, +-13, -2, 12, 4, 19, -24, -6, 15, 39, 7, -14, 85, 11, -39, 11, 13, -16, 45, -21, -10, 39, -32, -29, 74, -10, -34, -17, -53, 1, 25, 61, -21, 92, 31, -13, -55, 18, -19, 28, 53, 24, 9, 1, -60, -32, -29, 28, 39, 10, 20, 12, 22, -22, -59, -18, 6, 25, -52, -45, -14, 36, 49, -15, -24, 76, 5, 26, 35, 9, 4, 78, 31, 26, -3, 17, 19, 27, 4, 22, -10, 2, +-9, -4, 10, -8, -39, -21, 66, 4, -34, -3, 1, 17, 4, -14, 35, -11, 111, -40, -18, -64, 24, -7, -18, 17, -19, -34, 3, -40, 39, -19, -6, 6, -19, -36, -5, -32, -19, -8, 12, -5, -12, 15, 54, -3, 2, -7, 22, 22, -13, 26, 6, -22, -10, 40, 44, 44, -20, 8, -30, 30, 23, -16, -4, 7, -10, 18, 39, 1, -13, 14, 14, -21, -16, 15, 4, -21, -7, -50, -41, 51, 101, +-14, -3, 29, 11, -42, -24, 123, -23, -23, 30, -31, 0, -8, 29, 5, -59, 0, 23, -37, 19, -25, -57, -21, 74, 33, -4, -43, 21, 29, -22, -41, -3, -26, 13, 26, 0, -2, -14, 21, -18, -33, -13, 35, -34, -25, -37, -40, -9, 38, 39, 9, 21, 23, 8, -8, 6, -21, -24, 117, -23, -1, -15, -4, 0, -116, 14, 52, -33, 15, 49, 25, 12, -39, 21, -43, -17, -55, -12, -11, 12, -98, +-75, -16, -64, 44, 7, 13, -37, 19, -14, -7, -5, -33, -34, 27, 92, -4, -7, 24, -26, -27, -3, 56, 7, 1, -30, -3, -34, -40, 7, -6, 18, -45, 2, -32, 13, -4, 11, 8, -17, 19, 0, 25, -9, -2, -47, -2, 73, 6, 48, 0, -24, -12, 2, 2, 11, -47, -36, -23, -16, -10, -3, -24, -20, 0, 5, -4, -25, -10, -33, 8, -26, -14, -15, 0, -25, -28, -21, 15, 78, -10, -26, +-31, -1, -22, -11, -9, 20, -22, 12, 19, 23, -17, 102, 93, -13, 58, -5, -2, 70, -29, 3, 1, -10, 5, 83, -26, -48, -19, -7, -15, -21, 92, -36, -2, -21, 7, -10, 23, -44, -33, 1, -31, -28, -10, 8, 47, -30, -28, -12, 3, 32, -3, 114, -11, -26, -18, 13, -22, 37, 8, 8, 65, -5, -28, 64, -62, -7, -17, -63, -40, 14, 91, -32, -26, 13, 125, -76, -22, 16, 23, -49, 84, +-43, 24, -41, 51, -7, -21, -29, -34, -19, -19, 15, 5, -19, 63, -46, -14, -12, -20, -19, 39, -9, 127, 93, -43, -20, -24, -3, 51, 9, -27, -30, -3, 3, 5, -23, 28, -10, -26, 5, -28, -34, -6, -23, -44, -6, 15, -27, 28, 4, 8, -3, -10, 36, -29, -16, -28, 1, 17, -57, 52, 54, 34, 13, -25, 8, 42, -26, -30, -48, 35, -34, -64, 87, -1, 66, 6, 3, -3, 24, 32, 19, +51, -36, 3, 2, 82, 34, -40, 41, -93, -19, -43, 102, 85, 45, -41, 33, 24, -23, 4, 34, -9, 36, -8, 12, -48, -3, 7, -23, -9, -35, 71, -40, -66, -50, -24, -23, 89, 26, -46, 82, 31, -43, 12, 7, -15, 63, -8, 98, 0, -46, 31, 42, -33, 1, 26, 52, 7, -16, 109, -74, -42, -35, -19, -2, 9, -25, -79, 24, 37, 77, 19, 56, 13, -68, -6, -10, -78, -48, -75, -4, -20, +-1, -16, 4, -53, 8, -15, -15, -9, 34, 54, -42, -35, 9, 35, 20, 6, -18, 14, -1, -3, 19, 4, 16, -26, -46, 21, 70, 29, -37, -55, -35, 51, -60, -62, 60, -47, -25, -28, -27, -5, 32, 7, 81, 9, -7, 11, -38, -28, -39, 9, 14, -45, 14, -18, 41, -77, -29, -25, -34, 52, 1, -84, -22, 12, -37, 4, -22, -9, -16, -41, -10, -33, -32, -7, 127, -38, 22, 7, -20, -5, 3, +-9, -12, 10, 32, -30, -8, 3, -17, -31, -15, 32, -2, 14, 47, -38, 113, 7, -16, 11, -8, -15, -19, -2, -28, 92, 43, -16, -16, 33, 26, 33, -44, 11, 63, -73, 37, 67, 38, 39, -52, 3, -35, -12, -5, -35, -30, -22, -32, 15, 19, 2, 4, -16, -31, 2, 17, -45, -37, -14, -9, 25, 57, 15, -14, -18, -23, 10, -7, 69, 13, -61, -26, -36, 1, 19, -21, 5, -44, -26, -5, -30, +6, 24, 1, -39, 55, -34, 2, 3, 11, 47, -7, -1, -29, 9, 60, 7, -3, 7, 20, 7, -24, -15, -57, -3, 36, -40, -7, 46, 22, -27, 3, -22, 10, -19, -3, -33, 7, -9, 6, 15, 7, -3, -42, -29, 9, 22, 1, -11, 30, 107, 19, 50, 4, -12, -52, 7, -43, -26, -18, -12, -19, 35, 1, 22, 29, 0, -44, -22, -28, 7, 23, 38, -19, -40, -14, 9, -13, 10, 41, 14, -27, +17, 46, -5, 17, -3, 11, -6, -4, 29, -11, 31, -27, -24, 15, -35, -10, -50, 33, -10, -25, 42, -5, -1, -30, -17, 14, -38, -13, 11, -30, -24, -27, 2, 35, 34, -24, -13, -39, -22, -35, -30, 24, -29, 12, -18, 3, -15, 28, -15, -33, -33, 14, -24, 8, -64, -23, -28, -7, 18, -38, -5, 30, -24, 30, -21, -1, -22, -62, -4, -12, -20, -33, -19, -36, -12, -18, 12, -77, -52, 127, -6, +24, 36, -11, -16, 22, 28, -58, -8, 11, 11, 20, 66, 31, -34, 41, -31, -70, -12, 5, 83, -1, -29, -13, -7, 2, -30, 6, 60, -5, -13, 29, 52, -38, -18, -75, -12, -27, -2, 12, -25, -4, 17, -2, -41, -19, -29, 57, 4, -19, 2, -5, -14, 4, -15, -23, -54, -42, -16, -5, 4, -4, -28, -11, -7, -18, -14, 21, 9, -23, -15, 27, 10, -8, -47, -10, 7, 9, 0, 5, 21, 4, +-7, 33, -25, -45, 17, -15, -22, 27, -4, -16, -39, 6, 6, 38, 25, 24, -62, 127, -52, 19, -12, -72, 69, -2, -9, -36, 3, 0, -6, -36, 57, -9, 21, -50, -10, -28, -56, 119, -17, -4, -25, -8, 1, -32, -37, -31, -27, 16, -30, 20, -2, -21, 108, -45, 96, -15, 37, 12, 32, -58, 63, -19, 80, -34, -13, -1, -25, 39, 41, -39, 82, -51, -9, -38, 16, 54, 29, -9, -7, 19, -12, +-8, -32, 48, -36, -64, 79, 33, 16, 50, -7, 9, 41, -36, 9, -17, 17, -55, -38, 54, -35, -29, 127, -5, -36, -7, -12, -16, 63, 3, 1, 47, 12, 58, 24, -23, -9, -23, 17, 25, 11, 37, 127, 17, 10, 34, -24, -27, 9, -25, 9, 6, 21, -16, -20, -23, 6, -21, 9, 84, -26, -71, 49, -25, -10, 42, -7, -11, 48, 74, 17, 26, 26, -25, -37, 51, 33, 127, -27, 4, -10, 57, +23, 88, -46, -15, -14, 21, -74, 23, 13, -2, -39, -41, -32, -32, 12, -41, 37, -29, -32, -10, -16, 10, 15, 35, -44, 29, -8, -37, 31, 32, 10, -17, 23, -2, -13, -13, 0, -33, -13, -15, 7, 22, -20, 109, -13, -25, -60, 4, -11, -22, -29, 51, 13, 49, 108, -63, -26, 0, -16, 86, -3, -33, 29, 9, -9, -19, -15, 16, -11, -46, -60, -3, 22, 16, -41, 6, -43, -4, 60, 4, -26, +-42, -15, -8, -3, -21, -23, -18, 11, -33, 1, 12, -38, -21, 94, 29, 0, -16, -31, -6, -15, -29, -12, 1, -50, 25, 45, -7, -9, -35, 21, 7, 2, 16, -26, -7, 15, 27, 15, -33, -39, -21, 17, -13, 28, -3, -29, -12, 54, 32, -27, 56, -35, 73, -22, -1, 15, -19, 0, 55, -21, -8, -38, 8, -4, -30, -5, 22, 27, 25, 84, -44, -10, 13, -10, 80, 38, -48, 127, 31, -23, 19, +-33, -11, 50, -27, -47, 59, 7, -20, 25, 41, 21, -5, -33, 32, 1, -18, 7, 36, -22, -20, 4, -30, -7, -5, -1, 2, 7, -25, 4, 56, -8, -41, -14, 17, 14, -61, -1, 127, 55, 30, -41, 5, -29, 36, -32, -33, -16, -5, 7, -15, -16, -24, 24, -23, -15, -38, 13, 49, 6, 107, 3, 38, -38, -35, 17, -12, -17, -23, -17, -33, 9, 43, 74, -31, 9, -7, -4, 18, -39, -8, -20, +-62, -19, 51, -12, 29, -6, 5, -6, 8, -5, 6, -37, -50, -9, -62, 4, 79, -52, -83, -15, -8, -40, 10, 21, 3, 42, -52, -46, 66, -23, -25, -40, -25, 9, -35, -30, -21, 56, 17, -52, -34, -24, 0, -3, 32, 57, -34, -62, 58, 56, -20, -23, 4, 8, 18, 11, -29, 4, 1, -9, 30, -12, -31, -45, -20, -14, 73, -15, 10, -10, 22, -8, -49, -13, 34, -23, -36, -57, -46, 3, -7, +18, 24, 19, 46, -14, -10, -48, -2, -16, 11, 46, 29, -49, -26, 36, 3, 21, -13, -4, 45, -36, -21, 31, -32, 21, 18, -3, -4, 42, 7, -2, 61, 22, -19, 1, 1, 37, 64, 24, 73, -1, -40, 4, 22, 83, -39, -6, 33, 57, 19, 26, 42, 57, 86, 89, 31, 69, 5, -10, -9, 78, 17, 24, -28, -3, -38, -51, 10, 2, -30, -23, -1, -20, 38, -52, -1, 11, 65, 6, 23, -25, +-22, 10, 96, 127, 17, -25, -30, -39, 54, -9, -52, -14, -40, -16, 1, -30, 99, -30, -22, 20, -44, 2, 49, 43, -6, 0, -64, -44, -7, 1, 63, 32, -57, 8, -19, 47, -16, -37, -24, 25, -61, 13, 44, 32, -15, 41, -9, 21, 47, -5, 6, -21, 14, -18, 44, -77, 13, 27, -25, 4, -25, -3, -21, -7, -4, 64, -11, 18, -21, -28, 26, 18, 64, 14, -35, -1, -31, -52, 15, -25, 40, +-36, 17, -26, 66, -11, 3, 22, 14, -42, -14, 48, 120, 81, 19, -47, 9, 14, -12, 8, -2, -25, -30, -4, 20, -13, 8, -28, -21, 10, -17, -24, 29, 16, 18, -10, -23, -5, 1, 14, 1, -10, 49, 23, 29, -15, 57, -19, 9, 25, -2, 49, -39, -22, -45, -34, 21, -50, 23, 72, -1, 22, -7, -33, -27, 8, -5, -55, 120, 16, -40, -8, -62, -63, -48, 36, -11, 85, -5, 36, 1, -36, +-12, -27, 12, 52, -39, 20, 40, 20, 32, -39, -9, 15, -29, -26, -28, -41, 17, 43, -26, -34, -9, -28, 36, 15, 20, -9, -4, 16, -39, -48, 15, -11, -14, 12, -50, 55, -32, 18, -2, 13, 0, -27, -18, 32, -3, -3, -37, 12, 4, -28, 1, 54, -24, -47, 39, 54, -26, -27, -26, 16, -20, -59, -118, -1, -3, 7, -10, -8, 14, -13, -27, 1, -13, 40, 21, -4, 9, 40, -30, 5, 61, +-44, 97, 90, 21, -19, -67, -10, -21, -7, -15, 40, -23, 41, -10, -32, 3, -49, -11, 48, -6, -16, 29, 3, 14, -9, 40, 11, -33, -13, -41, -19, 22, 3, 82, 3, -30, -24, -34, -32, -1, -17, 10, -56, 4, 69, -21, -52, 18, -49, -63, 24, 17, 0, 36, 29, 3, 3, -5, 34, 1, -16, -19, -23, 13, 0, 101, -41, 24, -25, 0, -34, 19, 12, 19, 23, -3, -33, -2, -19, -24, 51, +-11, 39, -14, -66, 7, 7, -31, -4, 24, 16, -59, 3, -30, -22, -35, -7, 104, -5, -6, 65, 68, -1, 112, -20, -25, 4, 11, 66, -12, -7, 14, -6, -36, -37, -19, 4, -11, 31, -13, 23, -25, -40, 24, 50, -14, 11, -30, -18, 21, -55, -15, 51, 32, 48, -47, 17, -33, -69, 26, -2, -14, 7, -26, 19, 47, 22, 22, 83, 22, -44, -23, 26, 30, 66, 120, 48, -21, 50, 43, 17, 75, +-41, -3, 5, 28, 37, -8, 29, -25, -14, -10, 22, 10, -26, 16, 4, -18, 5, 11, -19, -5, -12, 115, -41, -43, -22, 16, 1, -3, 6, -15, -42, 32, -35, 13, -3, -47, 41, -41, 60, -28, -26, 14, 18, 9, -32, 8, 7, -17, -55, 28, -5, 24, -20, 36, -8, -24, 9, 1, 10, 30, -9, -27, -37, -56, 27, 2, -12, -41, -25, 46, 76, -71, 104, -51, 27, 25, 3, -47, -61, 48, -23, +-22, 23, -7, 31, -91, -48, 44, 42, -46, -8, -23, 54, 37, -28, 1, -43, -8, -32, 8, 118, 27, 18, 15, 7, 0, -5, 20, -9, 25, 28, -21, 14, -19, 1, -23, 26, -55, -16, -39, -4, -29, 22, -15, -40, 13, 49, -8, -26, -26, -14, -40, 41, -1, -30, 56, 31, -35, 17, 18, 5, 24, 26, -26, -79, 36, 16, 127, 5, -33, -44, 7, 32, -12, 87, -49, -6, 32, -17, -27, -27, 6, +-27, -19, 15, -5, 4, -28, 22, 39, 11, -34, 2, 47, -4, -50, 4, -6, 65, 3, -18, -23, -19, -17, 30, -6, -6, 27, -14, 10, 3, -34, -2, 30, -11, 17, -40, 47, 44, 13, -1, 33, 13, -56, -18, 14, -2, 5, -28, -3, -31, -6, -36, 90, 11, -44, -18, -35, -4, 28, -59, -25, -20, 65, -7, 32, -15, 7, 23, -52, -7, -31, -16, -15, 19, -18, -13, -22, 0, -20, 39, 7, 51, +-19, 36, -7, 32, -11, -1, -27, -8, 13, 3, -30, -67, -2, -25, 80, 35, -7, 33, 13, 24, -5, -34, 18, -11, -49, -36, -8, -35, 15, -20, -29, 39, -31, 53, 108, 40, -3, -29, 15, -14, -52, -42, -26, -39, 43, -23, -23, 3, -16, 48, 20, 53, -14, -6, -30, 5, -27, 107, -27, 7, -8, -71, -15, 28, -10, 9, -20, 25, 127, -36, -10, -16, 34, 70, 44, 71, 23, -54, -59, -23, -30, +46, -69, 24, -37, 23, 22, 69, -68, 23, -24, 69, -62, 95, -23, 46, -52, -32, 19, -11, 119, -12, 72, 53, -42, 127, -13, -39, 7, -15, 50, 15, 9, 31, 23, -20, 48, -45, 21, -28, -23, -15, 10, -14, -26, -28, -67, 56, 19, 9, 108, 10, 31, -21, 22, -1, -27, -43, 7, -36, 4, 20, 34, -9, 75, -20, 35, -5, -20, -50, 41, 17, -58, 11, 11, -6, -25, 6, -28, 49, 37, -41, +63, -2, 67, -22, 9, -15, 1, 3, -21, 3, -26, -1, -46, -48, 33, -1, -8, -6, 1, -9, -1, 44, -55, -39, -27, 26, 7, -1, -35, -29, -48, -20, 49, -32, 1, 28, -16, -15, 27, 3, 1, 2, -30, 20, 61, -21, -32, -34, -35, 31, -42, -16, 85, -59, -16, -51, 44, -27, -29, -57, 82, -5, 32, 124, -9, 0, -54, 30, -17, -11, -61, -32, -22, -49, -38, -7, -33, -60, -15, 87, -50, +115, -16, -4, -12, -50, -54, -34, -4, -69, 30, -13, 32, 34, 38, 41, 15, -53, 1, 40, -17, -42, -19, 28, -6, -66, 6, 65, 26, -3, -30, -9, -18, 18, -22, 7, 19, -43, 57, -8, -16, -16, -24, 26, 41, -28, 75, 115, -7, -37, -48, 18, -40, 13, 4, 2, -5, -17, 13, 29, 10, 10, -28, -52, 14, -15, 8, 4, -3, -23, -19, -16, -10, 42, 15, 24, 37, 18, 55, 62, 12, -5, +7, 0, 13, -7, 55, 31, 64, -35, 43, -41, 0, -25, 98, 27, -28, -5, -36, 7, -39, 5, -22, 43, 28, -5, -28, -57, 21, 10, -29, -37, 0, -43, -51, 64, 16, -3, -18, -5, 20, -64, -21, 1, -5, -27, -23, -15, -86, 60, 53, -3, 3, -16, 32, -13, -56, 26, 20, -43, -8, -38, -31, -20, -16, -24, 95, 14, -2, -24, 51, -20, 15, -33, 19, 97, 27, 14, 76, 23, -36, -17, 45, +-27, -9, 6, 1, 41, -6, -45, 43, -22, -83, 45, -50, 37, -13, 2, 19, 39, -33, 6, -22, 4, -31, -31, -1, -24, -24, 0, -9, -10, -23, -17, 21, -15, 12, -2, -16, -10, 11, 36, -5, -11, -31, -28, -38, -33, 33, -29, 85, 22, 4, 19, 18, -8, -2, -20, -34, -64, -30, -28, 85, 40, -8, 19, 66, -17, 1, -38, 10, 3, 36, 6, 42, 22, 1, 63, -44, 10, 47, -35, 37, 4, +-6, 20, 5, -57, -37, 27, 31, -25, 1, -12, -18, -5, -26, -13, -15, -2, -25, 49, -20, -20, -11, -10, 12, -48, 23, 73, 20, 6, -16, 0, 8, -5, 6, -9, 27, -35, 17, -4, -17, 34, -47, -30, 110, -49, -67, -20, 12, 11, 32, 5, -10, -25, 63, -8, 30, 79, 96, -37, -71, -55, 11, 8, -24, -24, 4, -25, -71, -39, 20, 61, 11, -37, 4, -14, 36, -29, -11, 25, -13, 68, -46, +22, 111, -24, -37, -25, -3, -32, -68, -10, -55, -33, 21, 0, -33, 8, 40, 23, -22, 45, -10, -64, 7, 12, 9, -47, -14, -51, -3, 123, 50, 36, -26, 30, 21, -10, -38, -21, -28, -8, 7, -29, 37, 18, -9, -8, 47, 8, -29, 33, 27, 43, -5, 43, 20, -10, -8, 16, 85, -38, -68, -30, 1, -6, -5, -38, 27, -11, 34, -18, 5, -3, 61, 28, -29, -10, 0, 20, -47, -23, 27, 23, +-40, -23, -19, -43, 3, -10, 8, 19, 48, 14, -5, -25, 48, -23, 16, -56, 62, 0, 16, -20, -15, 0, 20, 47, -4, 12, 11, 16, -9, 11, -2, -24, -18, -8, 18, -8, -10, 30, -41, -43, 127, -30, -18, 22, 47, -17, 5, -18, 25, -19, -47, 46, -30, -1, 4, 37, -19, -18, 5, 50, 21, -12, -2, 1, 6, -2, 26, 10, -27, -22, 31, 11, -93, -34, 3, -38, -20, -15, -4, 0, 7, +-23, 40, -14, -65, 28, -40, 42, -40, 18, -25, 25, 40, 45, 5, -44, -17, -54, -61, 43, 20, -26, 73, 20, 21, -31, -7, -17, -8, -18, 21, 66, -6, -37, 11, -11, -11, -27, -20, -22, -13, -19, -11, -47, 3, -5, -41, 30, 2, 5, 30, -1, -24, 8, 36, 5, -35, -9, 22, -16, 0, -25, 18, -16, 21, -2, 24, 24, -4, -7, 5, -11, 24, -1, -17, 11, 2, 18, 10, -25, 19, -20, +-16, -2, 11, -9, -18, -3, 5, -29, -23, -2, -4, 27, 3, -57, -3, -22, 37, -36, 30, 58, -19, -2, -40, -12, -23, -11, 26, -23, -9, -27, -1, -23, 15, 66, 14, 7, -71, 28, -30, 44, 15, 47, -6, -26, -14, 53, -18, 27, -7, -24, -8, -15, -14, -22, -17, -9, -16, 9, -33, 34, 33, 44, -6, -15, -24, -2, 14, 28, -22, 21, -38, -5, 31, -7, 11, 18, 18, 2, -27, 4, 3, +-5, 2, 17, -21, 44, 8, 19, 21, 75, -25, 23, 2, 33, -15, 49, 85, -32, 7, 4, 27, -27, -44, -20, 3, -5, -19, -3, 30, 28, -17, -3, 29, 0, 24, 0, 23, -22, 1, 19, 21, 4, 18, 36, 54, 9, 16, -16, 37, 5, -20, 5, 44, 33, -28, -10, -9, 2, 28, -32, -35, 3, 98, 27, -51, -31, 11, 48, 18, -29, 4, 0, 49, -33, -21, 51, -29, -22, -18, -29, -34, 14, +-53, 46, 127, -28, -29, 68, -24, -29, -13, -35, 8, -16, 4, -32, 11, 77, 13, -1, 2, -32, -26, 16, -44, -1, -18, 4, -17, 27, 0, -16, 25, 20, -11, 5, -30, 4, 9, 24, 19, 73, -8, -34, 13, 1, 30, -39, -2, -22, 8, -11, 25, -5, -24, -6, -9, 55, -42, -6, -13, -3, 23, -21, -42, 3, 6, 15, 5, -17, -6, 37, 8, 18, 16, 43, 24, -46, 21, 3, 1, 41, 51, +-19, -31, -18, -5, -19, -19, -10, -22, -17, 5, 31, 11, -29, -26, 32, -21, -26, 8, 8, -8, 55, 1, 35, 41, -51, -42, -6, -21, 0, 10, 5, -50, -2, -6, -18, 27, -17, -6, 19, -34, 9, 9, 8, 5, -1, -14, 25, 33, -36, -33, -4, 11, -32, -5, -26, -32, -17, -12, -35, 13, -8, 81, -12, -69, 4, 39, 59, 29, -33, -28, -14, -34, -81, 46, -7, -35, 40, -4, -40, -11, -17, +32, -59, -21, -5, -20, 40, -7, -3, -13, 4, 15, -14, -12, -44, 44, -11, 14, -37, -9, -21, 14, 0, 18, 29, -50, -17, -23, -33, -18, -44, 3, 9, -13, -28, -6, -38, 7, -19, -22, -17, -32, 28, -23, -20, -30, -11, 43, -7, 21, -27, -21, 1, -5, 43, -4, 7, -10, -2, -17, -8, -14, 32, 38, -41, -26, -16, -41, -46, -2, 73, 18, -11, 127, -3, 42, -38, -23, 7, 0, 24, -13, +-25, -5, -38, -6, -17, 3, -28, -1, -30, 28, -6, -29, -5, -22, 42, -4, 71, 32, -42, 7, 12, -38, 2, 102, 11, 7, -29, 2, 30, -23, -35, -25, 31, 62, 12, 56, 35, -3, -42, 50, -32, 94, -10, 5, -19, 35, -6, -9, -13, 1, -41, -19, -5, -8, -8, 1, -4, -19, 0, 2, 49, 25, 8, 30, 4, 6, -15, -13, -35, -52, -6, -30, 6, 24, -20, 16, 39, 25, -15, 5, 38, +-12, 37, 15, -40, -17, 7, 8, 4, 12, 23, -16, -28, 26, -7, 15, 13, -27, 30, -26, 13, -17, -1, -16, 10, 19, -1, 38, 51, -21, -15, -16, 6, 9, -45, 74, 40, 15, 29, 17, -34, 6, -26, 32, 19, -25, 57, -32, 13, -47, 32, 28, 100, -33, -59, -9, 64, 39, -13, -17, -34, 5, 54, -42, 28, -24, 28, 24, -35, 98, -12, 42, -25, -19, 7, 88, -13, 12, 7, 33, 21, 69, +48, 124, 34, -34, -8, 44, 7, 4, -24, -3, -8, -3, -37, 3, -8, 30, 10, -34, -3, -29, 22, 1, -10, -6, 14, -14, 30, -38, -5, -62, -17, -50, 24, 12, -20, 51, -17, -43, 63, -2, -35, -21, -2, 2, -29, -23, -11, 3, 26, -15, -50, -17, -24, 4, -21, -58, -22, -1, 50, -13, -24, 31, -20, -25, 28, -5, 13, -18, -1, -3, 53, -15, 43, 37, -11, -17, 1, -57, 15, 20, 0, +59, -67, -34, -38, -30, -6, 17, 29, 53, 7, -32, 4, -4, -13, -56, 126, -3, 35, 19, -11, 57, 44, -14, 5, 10, 42, -5, -26, 12, -47, 9, 57, 34, -38, 33, 74, -28, -28, -10, -33, 21, 18, 36, -43, -20, 48, -58, 0, -16, -43, -24, 15, -10, -23, 35, -16, 20, 2, -21, -32, 41, -37, 8, 16, 43, 15, -10, -39, -4, -42, 9, -49, 50, -33, -57, 41, 12, 67, -25, -32, -37, +18, 94, 58, 25, 11, 2, 127, -20, 27, 18, -21, -15, -6, -20, 11, -10, -10, -21, 53, -4, 29, -8, -20, -14, 56, -26, 43, 13, 12, -30, -11, 10, -6, 24, 8, -1, 23, -2, 108, -52, 10, 16, 0, 48, 10, -2, -47, 14, -84, -34, -17, -15, -13, -7, 10, -23, -8, -10, -28, -3, -36, -1, 8, -5, 17, -13, -15, -51, 19, 97, -12, 23, -18, -30, -61, -54, -9, 21, 57, -10, -37, +9, 8, 24, -6, 12, -7, -24, -1, 28, 14, 30, 24, -2, 7, 17, -77, 4, -35, -5, 33, -20, 42, -40, 60, -12, 51, 13, -6, 63, -38, 14, 19, -25, -6, -26, 5, 38, -58, -26, -14, -18, -22, 26, 18, 28, 40, -5, 66, 22, -19, 18, -3, 39, -12, -16, -4, 19, 5, -6, -22, -3, -37, -31, 127, 1, 17, 2, 18, -8, -5, -16, -7, 16, 2, 29, 10, 50, 45, -24, 7, -18, +21, -14, -23, -18, 12, -18, -61, 44, 83, 28, -18, 3, -22, -1, -9, 58, -12, 1, -48, -38, -19, -38, -25, -19, -15, 70, 70, -13, 2, -33, 11, -19, 8, -3, -42, -26, -52, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, 61, 70, 36, 120, 54, 62, 52, 86, 42, -12, 40, 23, 46, -15, 52, 22, 52, -112, 53, 112, 51, 52, 53, 94, 46, -110, 50, 29, 59, 57, 56, 4, -18, 60, -16, -116, -15, 25, -14, -122, -17, 75, -8, 33, -12, 123, 0, 100, 0, -97, -8, -88, -20, 18, -15, 117, -15, -15, -21, 77, -23, 86, -21, +65, 64, 48, 63, -86, 52, -24, 58, 75, 50, -96, 57, -69, 77, -50, 64, 89, 55, -33, 61, 120, 54, -110, 46, -23, 61, 49, 53, 59, 42, -60, 43, 25, -16, -35, -12, -84, -17, 20, -16, -68, -26, 70, -14, 63, -19, 10, -5, -102, -20, 88, -19, -78, -10, -85, -19, -15, -17, 17, -8, -98, -19, -85, -15, 56, 49, -126, 59, -115, 41, -121, 50, -15, 52, 78, 59, 84, 56, -85, 54, 56, +44, -20, 48, 107, 42, 98, 53, -127, 55, 111, 48, -121, 40, -104, 59, -79, -11, 11, -9, -4, -13, -6, -7, -27, -7, -128, -14, -84, -11, -67, -14, -95, -16, 0, -19, -8, -19, -117, -10, 90, -15, 53, -20, -73, -14, -61, -11, -97, 48, 65, 46, -50, 45, 13, 42, -105, 59, -103, 61, 67, 49, -52, 40, 121, 54, 93, 62, -32, 61, 21, 44, 72, 63, -9, 45, 66, 51, 107, 49, -8, -22, +51, -21, -29, -14, 76, -7, 119, -16, 90, -10, 81, -9, 56, -14, -28, -10, 105, -22, 72, -16, 120, -17, 125, -3, 44, -9, 70, -9, -99, -8, -32, 41, -81, 62, -49, 43, -42, 51, -93, 46, -97, 59, 70, 73, 33, 46, 40, 53, -95, 64, 50, 59, -83, 55, -126, 51, -126, 58, 87, 54, 12, 43, -80, -14, 89, -12, 16, -9, -91, -13, -106, -13, 67, -19, 118, -20, 26, -8, 10, -20, 46, +-8, -33, -16, -6, -15, 89, -9, -83, -11, -58, -10, -82, -14, 125, 53, 89, 55, 109, 44, 53, 48, 3, 65, 105, 58, -77, 52, -89, 65, 117, 83, -67, 62, -67, 73, -59, 56, 45, 51, 98, 64, 116, 53, 30, 47, -118, -12, 75, -17, 13, -10, 78, -3, -51, -5, -112, -11, 10, -8, 101, -13, 50, -14, -11, -17, 17, -16, -104, -19, 16, -25, -105, -12, -61, -14, 105, -28, 17, 61, -13, 61, +84, 53, 79, 71, 23, 67, 4, 49, 14, 51, 97, 58, -22, 43, -21, 53, -117, 52, -116, 54, 37, 56, -94, 58, -55, 43, 74, 58, -128, -13, -7, -9, -44, -15, -59, 1, -10, -9, 40, -15, 117, -20, -47, -18, 52, -12, -26, -20, -9, -19, -4, -20, 76, -18, -16, -16, 48, -15, 80, -19, -82, 33, -64, 35, -45, 36, 34, 48, 0, 47, 94, 47, 27, 57, 92, 38, 73, 39, 49, 66, -43, +50, -42, 51, -10, 52, 33, 40, 1, 49, -68, 63, 73, -2, 65, -7, -33, -10, -50, -10, -61, -19, 27, -14, 5, -12, 0, -18, -54, -19, -89, -10, -84, -10, -42, -13, -3, -4, -35, -15, 11, -4, -25, -18, -32, 69, 76, 57, 95, 51, -1, 54, 20, 59, -37, 42, -33, 57, -39, 56, -23, 67, 52, 70, 123, 67, -49, 62, 3, 50, -116, 50, 121, 44, 103, 59, 79, -19, -106, -13, 79, -17, +-94, -18, 112, -17, 113, -21, -109, -3, 107, -17, 69, -14, 47, -13, -28, -17, -126, -17, 37, -14, -122, -22, -71, -16, 6, -19, 125, 65, 120, 96, 35, 58, 101, 44, 123, 46, -126, 38, -60, 39, 67, 44, -59, 51, 108, 50, -72, 49, 18, 54, -103, 51, 110, 43, -52, 48, 61, 47, -25, -6, -49, -8, -35, -14, -74, -22, -38, -15, 100, -14, 29, -4, 114, -1, -9, -10, 19, -14, -100, -10, -116, +-8, -68, -12, -43, -8, 117, -1, -86, -8, -53, 57, -22, 46, -67, 44, -21, 54, 31, 50, 103, 46, -79, 54, -29, 49, 111, 40, 35, 52, 29, 62, -92, 50, 92, 45, 25, 54, -93, 54, -18, 51, 45, -5, 54, -14, 10, -13, -1, -11, -98, -13, -62, -11, 71, -11, -123, -10, -17, -11, -15, -4, 74, -8, -12, -6, 127, -3, 77, -8, -80, -11, 86, -12, 73, 52, 1, 53, -122, 52, -67, 55, +-128, 67, 39, 58, 71, 41, 117, 58, 100, 48, 81, 44, 80, 41, -90, 48, 39, 40, -109, 42, 105, 44, 5, 50, 15, -6, 13, -12, -15, -14, 98, -3, 117, -3, 89, -10, -34, -8, -35, -12, -47, -7, 8, -6, -41, -5, -54, -9, 29, -6, 35, -7, 82, -13, 56, -13, 43, 46, -119, 47, 124, 52, 51, 51, -99, 55, -87, 55, -8, 58, 49, 68, 84, 55, 77, 57, -126, 43, -88, 39, -68, +51, -109, 56, 42, 57, -107, 55, 7, -7, 19, -5, -124, -11, -128, -8, -74, -13, -57, -9, -73, -7, 85, -7, 85, -7, -19, -13, -120, -9, 46, -8, -33, -10, 44, -8, -21, -5, -32, -8, 4, 73, 25, 47, 73, 69, 124, 42, -107, 49, 124, 54, 83, 52, 104, 46, -114, 47, 27, 55, -17, 49, 13, 55, 51, 55, -58, 55, 25, 49, -117, 50, 68, 1, -96, -12, -21, -8, -29, -13, 36, -7, +62, -13, 81, -12, -43, -12, -77, -12, 102, -14, -80, -15, -69, -3, -113, -7, 4, -7, -99, -8, 10, -10, 100, 57, -71, 42, -123, 54, -36, 57, 70, 41, -53, 54, -114, 48, 76, 50, -9, 49, -71, 47, -38, 50, -63, 53, 15, 54, 78, 53, 47, 49, 44, 49, -10, -7, -112, -10, 112, -10, -1, 1, -40, -8, -25, -16, 105, -9, 127, -3, 71, -6, 0, -10, 10, -8, -121, -7, -25, -10, 14, +-8, 59, -13, 120, -18, -4, 46, 103, 47, 25, 58, 81, 58, 94, 52, -94, 55, -98, 69, -54, 46, -66, 38, 70, 42, 78, 45, -84, 49, 19, 62, -111, 56, -13, 51, -43, 56, -119, -8, 122, -9, 117, -6, 56, -5, 15, -7, 24, -3, 31, -3, -73, -15, 14, -3, 91, -10, 25, -7, 75, -7, 53, -13, -10, -4, 108, -2, -115, -11, -65, 45, -102, 47, 26, 48, 106, 46, 81, 52, 10, 56, +-87, 52, 121, 34, 72, 49, -94, 47, 64, 50, 21, 60, 89, 58, -46, 43, 39, 42, 13, 45, -21, -6, 113, -8, 92, -8, -101, -11, 97, -13, -20, -20, 109, -4, -114, -12, -26, -5, 73, -4, 101, -7, 117, 2, -19, -5, 2, -14, -50, -15, -2, -19, 90, 43, -21, 41, 105, 51, -13, 56, 18, 41, 108, 40, 123, 51, 25, 42, -2, 45, -21, 47, 117, 53, -81, 40, 42, 49, 22, 46, -32, +55, -51, 40, -18, -21, 37, -10, -32, -17, 90, -17, 73, -21, 39, -13, -85, -17, -25, -13, -91, -16, 29, -9, 109, -3, -119, -11, -39, -8, 61, -4, -34, -16, 40, -10, 19, 47, 20, 50, 68, 44, 63, 50, -96, 46, 16, 50, -28, 42, -30, 50, -46, 47, -89, 72, -118, 37, 62, 44, 36, 81, -76, 56, -18, 64, -29, 62, 15, -17, 126, -25, 108, -19, 74, -15, -59, -15, -121, -17, -33, -20, +60, -18, 100, -19, 55, -24, 50, -12, -74, -14, 84, -18, -32, -11, -15, -8, 112, -6, -124, 47, 59, 50, -63, 49, -35, 68, 11, 54, -22, 48, 52, 53, 84, 55, -105, 60, -75, 41, 11, 55, -15, 43, -125, 54, -46, 58, -26, 43, 60, 44, -64, -5, 44, -20, -4, -8, 124, -11, 77, -16, 9, -10, 112, -4, -49, -10, 108, -9, -5, -19, 37, -3, -66, -21, 81, -12, 24, -17, 81, -16, 66, +-15, -101, 47, -113, 69, -119, 53, -66, 42, 73, 60, -8, 54, -59, 51, 67, 57, 1, 48, -22, 49, 37, 39, -41, 42, -86, 48, 122, 47, -8, 45, 98, 50, -110, -18, -70, -17, -118, -12, 38, -24, -121, -16, 11, -17, -67, -18, -46, -14, -18, -15, -41, -12, 29, -15, -104, -12, -98, -10, -79, -9, -39, -15, -49, -13, -99, 49, -33, 66, 92, 39, 111, 49, 7, 43, -89, 47, -109, 33, 65, 44, +62, 56, 84, 40, -8, 40, 125, 51, 42, 51, 64, 61, 123, 48, 82, 52, -72, -23, -79, -9, -30, 0, 15, -15, 38, -15, 63, 0, -83, -11, -102, -19, 97, -12, -50, -1, -93, -12, 56, -18, -44, -6, 88, -14, -50, -15, 124, -21, -75, 44, 40, 51, -63, 48, -4, 45, -99, 52, 61, 44, -4, 48, 92, 44, 15, 52, -54, 55, 43, 53, -70, 46, -57, 67, -5, 49, 86, 43, 99, 48, 5, +-13, -40, -10, 25, -6, -116, 5, 87, -3, 112, -11, 1, -8, 12, -10, -109, -7, -2, -16, 44, -14, -80, -12, 119, -11, 116, -15, 83, -21, 82, -14, 69, 47, -27, 47, 16, 57, -41, 46, -77, 51, -128, 48, -123, 55, 106, 53, 47, 61, 23, 53, 118, 52, -86, 60, -45, 54, 50, 57, 79, 51, -84, 54, 67, -12, -104, -19, 77, -9, 10, -11, -126, -12, 120, -10, -17, -10, 108, -16, -57, -18, +-30, -9, -60, -13, -94, -14, 120, -5, 126, -10, 110, -10, 25, -13, 83, 57, 41, 47, 100, 45, -98, 53, 92, 63, 88, 64, -80, 54, 1, 55, 54, 60, 40, 72, -46, 64, -18, 61, -91, 69, 76, 57, -20, 41, 97, 50, -46, -13, 7, -14, -61, -21, 92, -19, 91, -19, -116, -8, -127, -10, 19, -14, -58, -17, 51, -22, -111, -8, 70, -5, 97, -24, -97, -16, 50, -4, 65, -18, 76, 52, -118, +50, 21, 76, -56, 52, 71, 45, -58, 48, 15, 47, -118, 37, 46, 61, 45, 30, 27, 53, 7, 52, 73, 44, 125, 56, -114, 36, -11, 59, 16, -13, -34, -9, 67, -7, -62, -17, -87, -11, -111, -11, -95, -8, -78, -11, 25, -7, 88, 1, -51, -12, 32, -7, -78, 3, 32, -6, -125, -7, -127, 1, 37, 61, -102, 47, 121, 34, 99, 39, -112, 44, -76, 38, -81, 66, 24, 51, -60, 61, 31, 46, +37, 54, 49, 55, 7, 34, 41, 70, 16, 82, 59, 76, -105, -15, -62, -6, -24, -12, -106, -6, 125, 0, -34, -1, -99, -1, -26, -16, 124, -6, 0, -14, 124, -6, -112, 6, -116, 3, 101, -7, -67, -18, -88, -6, -122, 46, -17, 58, 98, 50, -36, 50, -2, 48, 75, 57, -89, 43, 49, 78, 56, 50, -95, 50, 49, 53, 100, 73, -68, 58, -50, 64, -104, 37, -111, 52, 72, -6, -96, -2, 46, +-1, -52, -1, -77, -15, 47, -3, 20, -2, -85, -4, -35, -4, 17, -3, -63, -6, -47, -12, -77, -13, -40, -8, -87, -11, -87, 5, 3, 37, -24, 39, 67, 55, -89, 43, -104, 43, -82, 49, -91, 41, -111, 33, -76, 49, 87, 49, 13, 58, 65, 59, 93, 39, -53, 43, -118, 42, -20, 33, -25, -7, -5, -13, -108, -10, 6, -7, -65, -4, -7, -20, -15, -11, -40, -6, -111, 2, 27, -1, 24, -9, +32, -3, 119, -8, 89, -4, 27, -1, 58, 5, -33, 37, 27, 44, 0, 62, -89, 52, -34, 43, 47, 57, -70, 45, -99, 39, 74, 45, 25, 42, -38, 58, -108, 44, 45, 83, -121, 42, 3, 49, 70, 51, -52, -6, 2, -16, -98, -17, -85, -7, -106, -10, 76, 3, -49, 6, -79, -3, 15, -6, -99, -4, 8, -6, -54, -15, 62, -4, -60, -11, 32, -5, -97, -8, -70, 45, -42, 54, 101, 41, -1, +42, -117, 53, 51, 35, 75, 70, 35, 40, -5, 51, -59, 35, -82, 46, -17, 35, -35, 47, -48, 41, -93, 40, -48, 41, -121, -14, -74, -9, 57, -9, 1, -9, 56, -16, -71, -10, -85, -14, -111, -1, 24, 2, 12, -2, -103, -2, -33, -7, 13, -4, -3, -13, 80, -1, -52, -20, 2, 48, 101, 64, -39, 54, 120, 39, 10, -14, 98, -2, 69, -6, 96, -2, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -20, +81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, +-20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, +-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -20, 81, -20, 81, -20, +81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, +-20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, +-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +-1, -1, -1, -1, -1, -1, -1, -1, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -20, 81, -20, 81, -20, 81, -20, 81, -20, +81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, +-20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -20, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +-1, -1, -1, -1, -20, -16, 4, -6, -53, 8, -40, 25, -11, 34, -19, -2, -35, -3, 35, -35, -8, 16, 4, 9, -6, -1, -10, 21, 28, 14, 26, 18, -15, 17, 15, 33, 11, -18, -9, -17, -1, 0, -8, 14, -11, -1, 9, 8, 15, 11, -16, -4, -4, 4, 10, -1, 5, 1, -8, 9, 11, -1, -4, 39, 6, -2, -6, 5, 6, 16, 10, 0, -9, 9, -3, -9, -2, -4, 2, 1, -13, +-10, 40, 54, 17, -22, 9, 3, -16, -1, -6, 68, -29, 6, 0, 9, -29, -21, 2, 5, 36, -44, -23, 16, -50, 25, -60, 8, 7, 14, -6, 50, -37, 41, -21, 49, -30, 52, 38, 6, -30, 16, -5, -6, 46, 5, -59, -31, 4, 21, -58, -21, -40, 4, 17, -7, 5, 9, -2, -26, -11, -28, 10, -12, -10, 6, -8, 4, 8, 15, 5, 18, -4, -7, 15, -13, 12, 21, 8, 11, -3, 21, +-12, 8, -66, -29, 27, 68, -9, 13, -34, -33, 15, 24, -24, -29, -31, -1, 64, -54, 35, -1, 7, 20, 43, 30, 48, -13, 51, -62, 22, -16, 2, 32, -6, 42, -16, -29, -41, 4, -21, -21, -8, -11, -5, 14, 3, 34, 26, 19, -5, 3, 10, -9, 15, -6, 39, -52, -33, 8, -33, -6, -8, 16, 33, -1, -32, -7, 38, -11, 7, 17, 31, 72, 21, 9, -18, 4, 34, 19, -41, 13, -26, +14, 26, -50, 21, 4, 1, -3, -14, 23, 24, 1, 58, -2, -20, -7, -12, -32, 9, -40, -9, -6, -6, -27, -31, 10, -16, -21, 8, -28, -20, -1, -18, -9, 22, -74, 3, -5, 23, -39, -8, -33, -6, -58, -6, -29, -25, -32, -16, -8, 1, -10, -6, 12, -80, 18, -61, -127, 8, -32, 1, 21, 45, -3, -8, -29, -1, -23, -10, 5, 63, -8, -24, -55, -33, -31, -5, 26, -8, -27, 22, 15, +-22, -25, -3, -21, -23, -28, -19, 67, -10, -74, 3, -27, -33, -32, 28, 13, 6, -6, 16, 10, -19, 54, 24, -4, -27, 45, 8, -31, -28, 23, 5, 37, 21, 15, 23, 19, -28, 4, -30, -1, -13, -64, 3, 34, -26, -127, 14, 6, 17, 13, 24, 16, 25, -6, -29, 4, -11, 0, 56, 19, 15, 24, -13, 14, 6, 64, -74, 1, 23, -11, -47, -8, 9, 20, -45, -28, 74, 18, -44, 13, 15, +12, -18, -9, 54, -15, -53, 44, 42, 17, 16, 40, -21, 31, -35, -8, 35, 45, -37, 6, -84, -25, -35, 33, -7, -41, 9, -16, 24, -27, -9, -12, -2, 0, 32, 18, 45, -17, -12, 79, 6, -63, 61, -13, -96, -122, 6, -52, 43, 6, 22, 26, -4, 14, -12, 21, 3, -10, 2, -18, 11, -127, -18, -35, 2, 17, 16, -3, -7, 123, -53, 58, 20, -32, -3, -13, -10, 8, -8, 29, -13, -42, +38, -5, 53, -8, -21, 2, 1, -34, 11, -26, 32, -12, -105, -20, 24, 6, 21, -4, -89, -29, 2, 27, 22, 1, 44, 7, 26, 88, -46, 34, 10, 16, -46, -58, 46, 1, -1, 52, 4, -25, 9, -42, -7, -47, -19, -28, -71, 18, -18, 2, -61, -51, -3, 38, -16, -23, 9, 42, -47, 5, 37, 3, 12, -5, -6, -37, -1, -15, -2, -2, 19, -10, -1, -5, -2, -21, 8, 7, 8, -3, -8, +0, -13, 0, 7, 10, 21, 1, -18, 4, -8, 28, -5, -14, -3, 6, -5, -4, 32, 40, 5, 7, -5, -17, -15, 21, 1, -17, -14, 34, -9, 6, 9, 5, -33, -29, -8, 11, -127, 19, -24, 0, -23, -24, 20, 3, -3, 49, -127, 10, 27, 20, -87, -27, 36, 1, -34, 32, 89, 17, -14, 50, 8, 38, 3, 31, -29, -71, -31, 27, 16, 21, -24, -28, 10, 33, 2, -50, 10, 11, -15, 11, +13, -5, 0, 13, 8, -16, -21, -6, 13, 15, -12, -5, 13, 2, 0, 5, -21, -7, -8, -5, -24, 5, 6, -10, -35, -10, -4, 4, 10, -22, -26, 13, -48, 15, -50, 27, -48, -3, 6, 38, -26, -14, 11, 33, -2, 11, -15, -22, -41, -8, -9, 3, -17, 19, 12, -10, -96, -59, 22, 5, -1, -55, -42, -8, 7, 0, -38, 2, 42, -127, 7, 32, -20, 12, 22, -9, -20, 17, 22, 21, 1, +-26, 26, -33, -15, 2, -20, 20, 2, 11, -16, 1, -18, -20, 26, 45, 23, -23, 27, 55, -33, -16, -114, -90, -22, -43, -36, -21, 12, -30, 26, 5, 19, -26, 13, -47, -20, -30, -69, 7, 19, 54, -18, 21, 19, -40, 20, 1, -11, 3, -34, -5, 9, -10, -15, -3, 37, 27, 15, 2, 13, -1, -26, 9, -30, 8, 33, -33, -12, -13, 38, -11, 22, -29, 28, -2, 1, -20, 3, -25, -27, -38, +0, 10, 4, 7, -24, 18, -14, 59, -20, 3, 10, 11, 48, 12, -34, -16, 32, 11, -9, -39, 11, -26, -14, 27, -32, -24, 6, -47, -23, 67, 25, 3, -84, 25, 73, -48, 47, -29, -3, -24, -53, 6, 1, 16, 14, 17, -7, -33, 7, 30, 27, 1, 4, 67, 25, 13, 25, -19, -10, -26, 13, -6, 38, -5, -4, -31, -26, -23, -26, -22, 1, -22, -2, 5, 21, 6, 4, 0, -14, 12, -34, +3, 56, -27, -25, -3, -17, -7, 28, 32, 0, 80, -1, -32, 45, 16, -39, 21, 12, -4, 15, -19, 4, -60, -36, -42, 8, 34, 35, -12, -8, 4, -28, 2, 37, 17, -40, -14, 41, -13, 12, -10, 33, 29, -20, 9, -49, -35, -23, 0, -16, 8, -29, 111, -32, -47, -46, -64, 2, 14, 61, -15, -116, -1, 17, 103, -20, 29, 15, -17, -10, -34, 45, 59, 30, 0, -38, -43, -14, 4, -79, -20, +-44, -10, 4, -13, -26, -3, -19, 3, -7, 10, -22, 7, -45, -14, -16, -5, -47, -58, 6, 31, -29, -27, -75, -13, 41, -51, -24, -14, -28, -12, -43, 18, 67, 20, 47, -46, 34, -26, 31, 12, -15, 1, -27, 56, -34, -27, 10, -25, 6, -31, 16, -5, 15, -21, 16, -18, 12, -19, 23, -12, 15, -20, 0, -12, 97, -30, -34, -7, 15, -22, -16, -7, 3, 13, -60, 0, -58, -28, -15, -34, 13, +-8, 16, -7, -27, 5, 60, -23, -10, 7, -5, 1, 3, 11, -15, -16, -3, -2, 8, -3, -2, 23, 5, 12, -1, 1, -19, -8, -8, 5, -49, -16, 0, -15, -19, 9, 0, -7, -16, 1, 35, -4, -7, -12, 8, 2, -4, 44, 5, 9, 5, 11, 6, 13, -2, -4, 3, 9, -40, -3, 5, -15, -6, -20, 20, 24, -24, -4, -11, -4, -8, 17, -6, -37, 10, -92, -11, -45, -10, 2, 17, 7, +-7, -19, 62, -5, -17, -43, -87, -37, 54, -46, 14, -48, 33, -33, 3, -9, 21, -71, 48, -39, -31, -30, -25, -30, -19, -10, -19, 6, 8, -29, 8, -1, 10, 32, 0, -5, -6, 5, 14, 3, -4, 14, -19, -9, -23, 26, 10, -11, 5, -8, -1, -20, 20, -15, -67, 1, 2, 21, 10, 43, 51, -22, -14, 5, -37, -58, -34, 12, 43, 4, -11, 26, 36, 9, 12, -16, 14, -9, 1, -7, -22, +-18, -14, 18, 8, -7, 0, -3, -18, -8, 28, 14, 22, 9, -2, -10, 50, 4, -21, 46, -7, -17, -13, -46, -16, 13, -37, 0, 6, -7, 9, -24, -30, 33, 50, -6, 0, 12, 32, -11, 6, -11, -5, -14, 8, -18, 4, 10, -9, 11, 32, -30, -37, -12, -4, -10, 18, -25, 3, -111, -23, -48, -7, 81, -35, -3, -48, 22, -13, -16, -38, -25, -3, 27, -5, 4, 1, 7, -6, -50, -4, -20, +24, -31, -3, 31, -3, 32, 15, -34, -28, -31, -6, -32, -4, 29, -4, 30, -45, 0, 6, 1, -10, -14, -11, 48, 17, -50, -72, -8, 33, -32, 26, 0, 31, -22, 13, 10, 8, 14, 18, -17, -23, 52, 10, -3, 16, -14, 11, 12, 34, 43, 41, 37, -2, -14, 9, 21, -19, -5, 0, 15, -33, -17, -58, 22, -4, 14, -10, 27, -6, 7, -7, 6, 9, -53, 1, 21, 19, 27, 4, 8, -30, +-14, -11, 8, -27, 16, 6, 17, -21, 2, -25, 10, -83, -28, -19, -11, -45, 10, -7, 0, -26, -16, 5, -28, 58, -49, 1, -48, 28, 22, -32, -14, 0, 34, -58, 27, -39, -121, 25, -70, 60, 91, -51, 89, -25, -59, 58, 2, -34, 43, 32, 56, 11, -32, 35, 91, 23, 31, -27, -4, -11, 8, 79, 29, -83, 74, -9, 37, 6, -56, 15, 40, 13, 13, -43, 32, 5, -9, -24, 21, 22, -13, +-79, 4, 7, 12, -18, 35, 55, 39, -29, 34, 7, 0, -97, 22, 6, -36, -49, -39, -7, 9, -14, -15, -13, 62, -96, -1, 62, -24, -1, 3, 19, 11, -2, 1, 17, -23, 10, -2, 3, -72, 12, 2, -4, -22, 24, 36, 51, 70, 14, -20, 33, 27, -4, 17, 37, -42, -1, 13, 15, -2, -1, -113, -24, 108, -28, -8, -16, 18, 11, -16, 11, -62, 10, 1, 19, 44, -35, -4, 45, -7, 11, +38, 3, -10, -13, -20, 27, -6, 17, 47, -26, -3, -20, 14, 18, 16, 24, -37, -27, -3, 71, -1, -18, -2, 0, -49, 24, 1, 55, 1, 12, 15, 6, 11, 10, -2, -7, -11, 8, -7, 17, 0, 7, 0, -7, 6, 4, -3, 1, -5, -1, 20, 10, -9, 9, -2, 0, 0, 19, -9, -30, 13, 1, -12, -8, -21, 16, -9, -3, -5, 16, 0, -7, -5, -3, 15, -4, 15, 15, 15, 12, -13, +13, -15, 46, 6, -36, 1, 0, 15, 32, 7, 6, 32, 7, 5, -8, -13, -5, 98, -18, 29, -31, -32, 40, 24, 24, 90, 39, 63, 35, 7, -22, 21, -4, 28, -18, -3, 10, 6, 0, 13, -4, 58, -47, -8, 4, -14, -50, -1, 3, 17, 10, -19, -17, -12, 14, -13, 5, -15, -28, 3, -25, -3, -6, -81, -8, -24, -12, -4, 15, -17, 0, -14, -19, -7, 14, 15, -5, 14, 15, -3, -15, +16, -4, -36, -65, 0, -11, 7, -23, 14, 11, 39, 0, 38, 30, -127, 10, 8, 20, 19, 38, -3, 0, -65, -6, -34, -41, -12, 26, -7, 5, -43, 26, -16, -31, 35, -27, 20, 3, 38, -24, 12, -8, -4, 7, 15, 6, -6, -9, 9, 19, -19, 5, -41, 0, -22, 14, 7, 25, 1, 9, -32, -17, 11, 11, 10, -34, -46, 19, -14, -21, 1, 34, 1, -25, -7, 32, 5, 14, -127, 61, 9, +-8, -18, -36, 17, 0, 29, 23, -11, -50, -1, 13, -32, -30, 24, 5, -30, 3, 43, -17, 0, 5, -7, 1, -63, -21, 5, -52, 4, -11, -127, -16, -14, 3, -19, -5, -44, 0, 23, -5, -22, -8, -7, 9, 17, 0, 11, -15, -26, 25, 27, 31, -15, -3, 11, 24, -12, 12, -26, 4, -1, -1, -49, 5, 12, -42, -36, -4, 10, 0, -9, -21, 16, -7, -24, 16, 31, 12, -31, 7, 24, -3, +3, -12, 36, 0, -5, 25, -9, 12, 21, 2, 1, 9, 18, -6, 7, 2, -22, -65, 24, 0, 0, 9, 18, 16, 35, 8, -21, -19, 38, 24, -31, 7, 11, -6, 17, -31, 45, -2, 20, 32, 19, -20, 9, -26, -51, -21, -20, -11, -18, -51, -3, 0, -24, 3, -10, 71, -54, 1, -31, 1, -41, -46, -118, 10, 27, 35, -15, 5, 61, -20, 35, 25, -28, -8, 0, -37, -120, -23, -33, 35, -3, +-12, -49, 0, -8, -41, -44, -63, -57, 7, -61, -17, -20, 2, -24, -52, 5, 37, -4, -40, 93, -39, -127, 23, -48, 126, 13, -58, -116, -20, -86, 9, 44, -19, 39, 0, -36, -45, 42, 27, -18, 11, -15, -33, -10, -8, 50, -10, -38, -25, 12, 7, 18, -15, -21, -4, -3, -14, 14, 2, -6, -39, -16, 105, 11, -31, -19, 0, -1, 32, -17, -38, 17, 16, -17, 4, 41, 13, -11, 10, -61, -70, +22, -39, 1, 51, 41, 6, -10, -3, -1, 8, -127, -35, -109, 28, -7, 6, -19, 0, 25, 31, -25, -38, -78, -12, 6, 18, -100, -10, 20, -7, -43, -37, 3, -2, -7, -56, 15, 46, 11, 14, -54, -127, -7, 55, -3, 5, 14, -3, 22, 9, -42, 26, -78, 17, 9, 30, 80, 10, -45, 9, 19, 3, -21, -17, 1, 8, -1, 7, 3, 10, 2, 7, 20, 1, -6, 3, 7, 8, 9, -12, 4, +17, -12, -3, 11, -3, 8, -11, -24, 18, -28, -19, -17, 50, 15, 17, -13, 3, -5, 4, 2, 15, 9, -12, 18, 15, 3, 35, 14, 17, 4, -26, 8, 21, 14, -4, -26, 17, 5, 1, 9, -31, 18, -87, -21, -10, -12, -2, -49, 7, 67, -16, 36, -47, 4, -88, -20, -8, -19, 10, 33, -37, 22, -8, 36, 26, -1, 45, 56, -1, -18, 61, -20, 4, -19, 36, -16, 21, 25, 8, 43, 19, +6, 8, -11, -11, 1, -11, 5, 10, 2, -3, 16, -21, -5, -3, -127, 18, -35, -2, -2, -8, 8, -7, 13, 19, 19, 34, -2, 30, 13, -25, -29, 22, -46, -32, 37, 16, -6, -23, 8, -14, 18, -13, 8, -30, -31, 54, 18, -58, 28, 26, 1, -18, -16, 21, 26, 40, -10, -83, -2, 38, 36, 9, 13, -16, 3, 6, 21, 11, -49, -4, 14, -29, 31, -3, -16, 30, -17, -11, 18, -7, -20, +42, -30, -24, -4, -15, -17, 26, 4, 10, -40, -25, 26, 0, -41, -20, -37, 61, -45, -27, 12, 37, -3, -23, 11, -7, -2, -29, 5, -21, -14, -5, -9, -10, -1, 25, 15, -22, 35, 2, 62, -48, -25, 1, -11, -39, -50, 11, 11, -6, 21, -24, 25, -20, 4, -18, -19, -15, 4, -50, 24, -4, 35, -35, 10, 27, -35, 59, 30, -16, -5, 49, 17, 22, 23, -35, 14, -13, 23, -14, -11, -9, +-19, -27, -9, -39, 25, 20, -12, -5, 16, -44, 42, 2, 6, 18, 15, 47, -19, 15, -26, 53, -6, 4, -13, -127, 11, -44, -71, -43, -1, -19, -26, 57, 12, -23, -54, 0, -4, 42, 28, -8, 22, 33, 27, 7, 25, 2, 21, 7, -9, -26, -20, -31, -48, 59, -9, -7, 11, 79, -23, -10, -18, -12, 64, 0, 10, -11, -11, 2, 76, -41, 6, 5, -4, 11, -5, 17, 24, -3, 6, -4, -23, +26, -12, 27, -21, 26, 17, -12, 35, -58, -19, 16, -80, 21, -32, -18, 52, 12, -47, 10, -12, 31, 40, -15, -1, 64, 11, 19, -98, -26, -26, -18, 13, -59, 29, 29, 40, 39, -75, -7, 9, -96, -32, -32, 64, 19, 6, 37, -115, 7, -36, 37, 3, -27, -5, 5, 27, 11, 12, 18, 54, -32, 51, 9, -3, 46, -104, -39, -119, 16, -71, 29, 12, 55, 17, -20, 91, -11, -26, -7, 17, -15, +2, -24, -5, -12, -9, -2, 42, 8, 6, 7, -21, 38, -20, 34, -24, 21, -34, 15, -23, -21, 21, -35, -28, -17, -61, 15, -16, 49, 26, 35, 62, 7, 40, -23, 9, 41, 29, -16, 26, -56, -38, -18, -17, -37, -21, -68, -23, -23, 3, -41, 48, 74, 39, 17, 1, -35, -52, -8, -14, -2, -6, -45, -12, -47, -31, 25, 1, -20, -33, 6, -16, 17, -7, 12, -30, -12, 28, 4, -27, -6, -4, +34, 13, -16, 50, 7, -15, 6, 7, -1, -10, 19, -11, 6, 18, -9, -24, 9, 17, 22, 0, -8, 2, 28, -15, 7, 16, -8, 10, 6, 11, -1, 1, -3, 23, -6, 2, -7, -18, -11, -42, 8, 1, -11, -10, 6, -9, -9, -16, -32, -5, -1, 31, 12, 5, -1, 6, 1, -41, 17, -8, 5, 0, -22, -8, 16, -4, 9, 42, 5, -20, -33, -16, -4, 12, -7, 10, 1, -24, 27, 8, -54, +-44, 14, -15, 31, -26, 1, 29, -1, -15, -4, -51, -5, 50, 10, 10, -18, 2, -15, 24, 7, 6, -20, 29, -2, -8, -4, -7, -15, 19, -71, 12, 20, 10, -2, 2, -3, 10, -20, -15, 10, 8, -15, -1, 1, 15, -15, -7, -2, 14, 12, 31, -1, -35, -46, -61, -26, -27, -25, 25, -47, 5, -12, -6, 30, -22, -18, -54, -15, 25, 6, 6, 6, -3, 41, -14, -33, -14, 31, -33, -95, 23, +26, 55, 7, -27, -5, 5, 8, 8, 18, 33, -31, 2, 17, -10, 9, -4, -4, -16, 11, -26, -1, 8, -17, 17, 13, -4, 4, 0, 0, 24, 29, 3, -8, 18, 40, -25, -35, -26, 0, -43, -16, 5, -25, -43, -46, 7, -48, 17, 6, 9, 27, -9, -49, -32, 8, -50, 11, -56, -20, 79, -3, -39, -45, -1, 40, 46, 22, 23, -18, 10, -1, 9, -39, -17, 86, -9, -69, -8, -53, 16, -44, +13, 6, 0, 0, -34, 3, -14, -12, 19, -13, -16, -17, 17, 2, 28, -16, 45, 30, 0, -51, -77, 14, 15, -40, 12, 36, 16, -66, 39, -12, 62, -38, -19, -3, 12, 11, 13, 62, 52, 36, -27, -14, 24, -18, 32, 26, 6, 36, 39, -1, -56, -23, -22, -27, -41, -24, -18, 47, 34, 43, 87, -8, -44, -25, -2, -6, 23, 6, 25, -23, 29, -15, -13, 10, -11, -8, -29, -35, 1, -9, 1, +-5, -30, -6, -36, -31, 37, -41, 25, -49, -1, -32, -4, 22, 16, 4, 6, 19, 27, -23, 11, 6, -8, 5, -38, 36, -22, -11, -5, 3, -7, 2, 43, -27, -49, 3, -5, -91, -38, 49, 8, -61, -22, -118, 2, -60, -17, 20, 6, 33, -39, -24, 24, -18, -51, -51, 25, -11, 41, 61, -54, -29, -3, -48, 59, 2, -18, -25, -98, 24, -13, -30, 41, -16, -19, 5, -63, 17, -1, -14, 39, 101, +-43, 18, 38, 7, -4, -63, -30, 59, -19, -36, -1, -24, 19, 71, 48, 20, -23, -19, -50, 23, -20, 3, 18, 22, -18, -48, 27, -1, 2, -17, -10, -28, 44, -21, 19, -38, -56, -22, 22, 1, 68, -4, -44, 31, 35, -27, 43, 29, 3, -24, -94, 17, 28, -1, -13, -4, 33, -49, -46, -50, -32, -23, -9, -23, 9, -44, -3, 23, 36, 7, -13, -21, 44, 7, 33, 15, 14, -4, 73, 41, -1, +13, 16, -39, -20, 39, -33, 11, -19, 15, -20, 10, -16, 10, 17, 0, 0, 22, -46, 10, 2, -8, 13, -34, -44, -6, -11, -25, 4, 10, 3, 13, -127, -13, 4, 5, -14, -18, 0, -3, 6, 16, -1, -11, -4, -25, -5, 8, 0, -4, -12, -1, 13, 17, 2, -22, 16, 16, -2, 19, 1, 3, -4, 13, -6, -5, 4, 6, 12, -6, -51, -10, -11, -12, -29, 12, -8, -2, 14, 4, -6, 2, +2, -7, 17, 3, 0, -6, -20, 25, 5, 14, 8, -19, 6, -23, 0, 30, -46, 35, 9, 11, -10, 31, 34, 0, 64, -15, -10, -60, -3, -10, -15, -37, 41, -4, -10, 11, 2, 12, 32, 8, 23, 4, -8, -26, -16, 13, 4, 21, -15, -20, 18, -5, -1, -10, -7, -27, -11, 5, 4, -16, 19, -10, 5, 9, 17, 2, 3, -17, -6, 15, -77, -13, -6, 4, -17, -25, -13, -63, -49, 10, 31, +24, 2, 77, 6, -3, -8, 11, 34, -19, -32, -37, -3, -26, -15, 11, -20, -5, -8, 43, 48, 3, -81, -14, 5, 5, 0, 10, -29, 2, 11, -23, 2, 26, -19, 33, 4, -9, 5, -3, 9, -4, -3, -2, 2, -22, -7, 18, 40, -8, 31, -21, 2, -6, -1, -12, -3, -7, -27, 14, 14, 23, -43, -41, 5, -102, -45, 90, 37, 53, -43, -11, 70, -58, 17, 39, -8, -8, -8, -16, -49, 10, +29, 76, -16, -26, -123, -65, -17, 40, 8, 23, -29, -36, 18, 10, 23, -15, 5, 22, 42, 5, -27, -12, -15, -19, 39, -35, -7, -24, 3, 18, -18, 8, 23, -17, 5, -5, -95, 49, 56, 11, 4, 24, 0, 33, 14, 41, 57, -38, -38, 18, -16, 9, 9, -37, -71, -7, 28, -52, 31, -29, 19, -22, 19, -7, 21, -11, -9, 31, -36, 27, 4, -3, -43, 30, 34, 34, 16, -14, -25, 6, -23, +-62, -35, 11, -30, -46, -38, -27, -12, 7, -18, -37, -19, 16, -35, -5, 0, -21, 38, -3, -19, -14, -24, 2, -7, -5, 1, 17, -17, -5, -14, 10, 3, 13, -53, 16, -45, 8, -3, 9, -6, 34, 0, -8, 16, 4, -5, -5, 1, -14, 23, -21, -17, 14, -8, 47, 30, -14, 13, -58, -67, 1, 17, -35, 114, 50, -14, 15, 1, -99, 0, 1, -30, -14, 9, -24, -8, 4, 43, -12, -26, -43, +20, -70, -127, 1, -31, 45, 17, 10, 20, -28, -77, 4, 0, -65, -17, -13, -31, 63, -47, 66, 84, 19, 49, -34, 80, -7, 22, -7, -55, -4, -6, 10, -99, -7, -85, 15, -26, -66, -41, 101, -85, 5, -12, 40, -13, 32, -31, -42, 7, 17, 29, 24, 5, 0, -3, 17, -37, -17, 4, 18, -20, -13, -9, -8, 64, 14, -30, -6, 3, -18, -20, -18, -27, 41, 1, 20, 0, -58, -13, 93, 0, +25, -29, 62, -8, 5, 16, -8, 10, 53, -17, 50, 68, -12, 38, 23, -34, -27, -61, 57, -7, -52, 31, -18, -9, 15, 20, -16, 52, -14, -42, -6, 54, 4, 7, -28, -3, 13, 28, -27, -43, -14, -30, 33, 15, -38, -27, 16, 18, -23, 4, 2, -5, -2, 37, 23, -20, -5, -41, -10, -15, 5, -4, -19, 15, 14, -2, -12, 5, -18, 6, -16, -18, 19, -6, 10, -25, -1, -1, 6, 24, 4, +-4, -6, -19, -10, 5, -5, -3, -7, -11, -25, -40, 0, -12, -16, 4, -10, 33, -31, 9, 21, 0, 5, -33, -3, -41, -5, 23, -31, -13, 24, -13, -20, -22, 1, -32, 14, 3, -4, -5, 28, -13, 20, -2, 44, 11, -22, 37, -6, 2, 45, -46, -22, 24, 17, 1, 25, 48, -3, -40, -5, -21, 17, 25, -1, -5, -20, 12, 46, 8, 48, -11, -16, -33, 7, 29, -4, -10, -14, 34, 20, 14, +5, -13, 14, 23, 5, 34, -7, 1, -2, 0, 25, -10, -10, -11, -11, 22, 6, -20, -1, -19, -11, 20, 13, 32, -35, -9, 21, -59, 5, 9, 9, 36, 23, -52, 21, -20, -15, 13, 35, -53, -10, 42, 19, -79, -96, 11, 0, -18, 38, -38, -4, -8, -25, 54, -11, 22, 40, 7, 25, 22, -21, -32, -6, 0, -29, -12, 22, -6, -1, 9, -1, 14, 19, 19, 8, 1, -24, 2, -18, -67, 26, +6, -7, -4, -9, -3, -12, -57, 9, -23, 2, 41, -9, 34, 34, 28, -3, 3, 25, 13, -3, 37, 8, -10, 6, 10, -45, 12, -27, 0, 30, -33, -26, -59, 17, -13, 2, 37, -16, -17, 12, -23, -9, -10, -7, 28, -2, 19, -25, 26, -25, -1, 6, -65, -13, -8, -4, 33, -25, -34, 15, 18, 35, 50, -2, -4, -9, -9, -16, -12, 39, -2, 25, -27, -20, -68, 13, -36, -36, -18, 6, -53, +-10, -25, -40, -11, -17, 4, 11, -9, 42, -81, -18, -17, 8, -14, 22, 9, -16, 29, 22, -48, -21, 27, 21, 28, -29, -23, 7, -13, 14, -7, -6, -21, 38, 0, 17, -1, 13, 1, 16, 41, -36, -24, 10, 13, 33, 3, -17, -23, 1, -34, -10, -31, 0, -14, 46, -23, 40, 23, 1, 7, -25, 3, -11, -9, 5, 11, -36, -5, 2, -2, -21, -20, -12, -28, 51, -111, 1, -21, 43, 3, 7, +19, -12, -7, -6, -56, 82, 37, 15, -48, 28, 0, -42, -15, -29, 21, 81, -17, -11, -70, -41, -6, -37, 37, 17, -7, -34, 8, 2, -10, -22, -49, 10, 0, 14, -1, -27, -86, -3, -32, 31, 44, -55, 25, -30, 78, 4, 95, -8, 22, -89, -120, -40, -9, -79, 1, -29, -33, -73, 15, -15, 21, -41, -71, 18, -33, 27, 5, 2, 23, -40, 58, 21, 10, 5, -14, 9, 15, 6, 28, -16, 0, +-14, -7, -12, 16, -26, 24, 17, 6, -29, 48, 28, -9, -23, -19, 13, 3, -9, 2, 26, 10, 52, -92, -24, 1, 12, 9, 17, -39, -64, -15, -5, 28, 5, 3, 35, -5, -6, -3, -34, -7, -51, 6, -17, -42, -50, -11, -1, -33, -8, 18, 13, 38, -15, -24, -14, -13, -13, 15, -7, -10, 27, 17, -60, -7, 3, -66, -23, -51, 22, 13, 10, 9, -31, 16, -40, -43, 107, -10, 9, -23, -37, +-39, -9, -17, 19, -5, -39, -6, -58, 11, -3, -9, -16, 7, 15, 4, -2, 4, -34, -8, 12, -4, -8, -6, -16, 17, 50, 22, -1, 23, 10, -22, 11, -19, 16, 21, 26, -7, -81, 7, -17, -10, 18, -30, -5, 4, 32, -13, -27, 27, 65, 43, -7, -12, -7, 10, -28, -38, -19, 3, 28, -45, -12, -21, -68, 38, 80, -18, 47, -14, 1, -80, 14, 38, 6, -2, -34, -28, 69, 30, -22, 48, +-13, 33, -1, -30, 59, 21, 53, -20, 78, -40, 50, -27, -72, -21, 79, 38, -14, -45, -39, -25, -33, 13, -30, -61, -55, 23, 51, 15, 16, -15, 16, -62, 27, -85, 50, 11, 22, 26, -6, 0, 21, 77, 49, 1, -4, 1, 36, 39, -5, -38, 25, -19, 16, 29, -25, -43, -6, -5, -17, 3, 5, -19, 31, -6, -27, 53, -6, 5, 4, 10, 33, -83, 16, -10, -2, 50, -13, -59, -7, 5, -8, +34, -35, -35, -21, 4, -35, -42, -13, -16, -21, 0, -1, 26, -20, 44, -75, 59, 9, -34, -33, 7, 48, 27, 11, 48, 38, -18, -1, -29, 46, 54, 45, -6, 17, 127, -15, 26, 45, -21, -18, -55, -29, -14, 4, -52, -44, -64, 6, 14, 19, 17, -79, -1, 18, 49, -35, 0, -11, -35, -41, -5, -55, -7, 30, -6, -39, 8, 1, -65, 78, -52, -16, -22, -4, -23, 2, -16, -22, -70, 22, -15, +-37, 20, 84, 51, 106, 34, 51, -41, 48, -19, -9, -8, -71, -4, -9, 53, -26, 24, 43, 13, 17, 16, -8, 29, -7, 17, -8, 12, -33, 37, 3, 24, 28, 6, -8, -29, 12, 11, 37, -29, 6, 3, 27, -5, -17, 10, 28, -32, -9, 14, 8, -29, -27, -27, -2, 18, 29, 29, -2, 14, 29, -1, -2, -21, 18, 3, -26, 8, -20, -2, 5, 42, -16, 15, -47, -28, 14, 5, 32, 29, 8, +-29, -36, -8, 83, -63, 31, 34, 27, -35, -64, -18, 64, 41, -20, 0, 16, 10, -1, -27, 13, 31, 9, 27, 59, 24, 20, 8, 10, -74, -40, -38, -43, 34, -36, 70, 15, -25, -4, -29, 18, -13, -28, 10, -24, 44, 17, -13, 14, 43, 27, -47, -40, -9, 65, 44, 45, 1, 26, -27, 51, 13, 7, 3, -13, -64, 1, -21, 2, -57, -9, -10, 9, -8, -27, 3, -9, 37, -81, 3, 6, 22, +-14, -16, -6, -20, 38, -11, -28, -30, 16, -32, -6, -32, 18, -15, -46, 6, 28, 12, -21, 28, -14, -6, 5, -2, 16, -11, -13, 8, 4, -31, 40, 11, 16, -34, 15, 14, 31, 72, -9, 41, -15, 32, 18, 9, -8, -9, 24, -8, -1, 12, -46, -7, -6, -3, 2, -31, -35, -39, -18, -9, -11, -9, 10, 26, 37, 29, 53, -11, -36, -24, 53, -17, 8, 2, -18, 12, -25, 29, -35, -38, -19, +3, 3, -27, 12, 16, -28, -26, 4, 1, 68, 56, 20, 29, 4, -3, -42, -46, -4, -12, 4, -4, -5, 12, 7, -127, 41, -60, -2, -5, -18, 20, 39, -6, 26, 13, 2, -33, -25, -6, 10, 5, 17, -4, 15, 12, -16, -15, -29, -21, -3, -23, -3, -16, 6, -24, -44, -8, -19, 4, 16, 49, -36, 18, -50, -10, 24, -45, -54, -27, -28, -41, -33, 5, -27, -8, 49, 2, -2, -6, -13, -17, +-9, -7, 20, -15, 33, 1, -19, -54, -9, 55, 16, -13, 15, 53, -6, -66, 19, 13, 16, -23, 18, -48, 8, -30, 25, 34, -21, 13, -28, 5, 62, -25, 15, 29, -23, -53, -28, 42, 39, -32, 18, 28, 15, 51, -26, -17, -5, -33, -24, -3, -5, -47, -3, 22, 58, 45, -15, 49, 5, 8, 13, 25, -1, -22, 37, 91, -22, 13, 27, -51, 15, -49, -23, -40, 10, -35, -15, 44, 92, -7, -78, +19, 28, 36, -29, -39, 1, -9, -39, -2, 1, 32, -20, -28, 32, -75, 4, -122, -14, 12, -5, -17, -49, 65, 34, -12, -11, 42, -89, -105, -15, 38, -27, -52, 25, -20, -74, -102, 2, 33, -40, 37, 75, 4, -19, -18, -86, -51, 22, 19, 10, -9, -4, 19, 29, 12, 5, 13, 1, -29, -67, 82, 46, -17, -46, -40, -2, 6, -82, 20, -36, 16, -18, 7, -20, 10, -35, -10, -31, -42, -29, 1, +41, 22, -2, -48, 39, 86, -1, -36, 0, -26, -85, -15, -51, -37, -45, -27, -19, -9, 42, -31, 2, 48, 1, -66, 9, -15, -48, -30, -87, -63, 7, -7, -55, -24, -18, -22, 8, -42, 61, -13, 36, -8, -8, -43, 23, -9, -22, 6, -5, -56, 16, -27, -8, -17, 10, 20, 14, 23, -52, 31, -48, 7, 48, -31, -15, 18, -18, -41, -8, 35, -9, -16, 6, -4, 18, -49, 17, -4, 13, 8, 1, +-35, -11, -18, 26, 8, 11, 33, -48, 2, -4, 17, 16, 2, 8, 9, 1, 3, 0, -8, 1, 1, 6, -25, 15, 60, 12, -18, -14, -23, -104, -51, 24, -41, 16, -18, -49, 42, 35, 2, 20, 16, 30, 0, -24, -33, 36, -44, 24, -48, -5, -24, -9, 74, -14, 34, 15, 42, 7, 65, 10, 3, 1, 8, -31, -20, 24, -9, -5, -8, -11, -14, -10, 13, 0, 38, -71, -23, 9, -14, -51, -16, +-17, 99, -4, 35, -30, -127, -19, -63, -56, 110, -42, -9, 3, -55, 54, 19, -46, 58, 65, -48, -37, 38, -28, 12, -127, 37, -59, -32, -16, 84, 8, 24, 18, -9, 19, 0, -30, -100, 3, -27, -1, 41, 30, -5, 15, -62, 85, 54, 22, -26, 12, -12, -44, -35, 19, -5, 1, 31, 40, -33, -7, 42, -10, 10, 15, 18, 2, 5, -31, -19, 40, -8, -23, 5, -14, 12, 13, -25, 8, 26, 25, +-39, 7, -18, 3, 11, -11, 22, -10, 47, -54, -30, 13, -14, 22, -8, -27, -18, -34, -14, -29, 31, -76, -22, -2, -35, 33, 36, 19, 36, -30, 13, -30, -28, 47, 17, -47, -2, 21, 2, -11, -8, 13, -61, 26, -63, 9, -45, -60, 21, -30, -44, -54, -39, -24, 14, -7, 9, 21, -1, -7, -16, -13, 20, 7, 23, -17, 28, -10, -3, 8, 6, -22, 8, 4, -11, -2, -7, -9, 0, -61, -5, +-19, 7, 11, 6, -19, -9, -7, 4, -2, -32, 4, 63, 42, 48, 57, -36, 38, -2, 79, 5, 61, 53, 31, 6, 20, -12, 5, 30, 13, -42, -12, -43, -17, -1, 37, -4, 27, -39, 4, 15, 7, -29, 39, -16, -2, -18, -16, -71, -38, 13, 50, -4, -4, -44, -5, 28, -18, -16, 27, 25, -12, 54, -1, 42, 49, -21, 70, -32, -47, -53, -19, 29, 70, -18, -17, 78, -32, -24, -8, -21, 5, +-57, -43, -3, -6, 21, 40, 54, -43, -37, 14, 29, 25, 21, 0, 2, 43, -30, -31, -82, 15, -10, 1, -22, 75, -18, 0, -63, -26, 8, -24, -10, 28, 15, -26, 22, 16, -26, 20, -9, 48, -6, 19, -17, 11, 51, 49, 13, -17, -51, -3, 16, -127, -24, -72, -7, -31, -63, 21, -15, -27, -11, -7, 3, -15, 12, 3, 24, 11, 6, 4, 1, 4, -60, 25, 16, -16, 0, -16, 40, -39, -26, +-4, -38, -76, 16, -34, -44, 40, 3, 31, 22, 22, -26, -14, -28, -18, 15, 38, -34, -62, -1, -15, 6, -28, -3, -29, -1, -4, -10, 23, 55, -106, -7, -43, 24, -11, -4, 1, -4, 56, -17, -57, -55, -54, -26, 1, -6, -54, 73, -4, 21, 2, -14, -15, 23, 15, 39, 0, 7, -2, 42, -83, 26, 48, -28, -21, 44, 22, -23, 10, -46, 19, 1, -19, -6, -13, 10, 27, -8, -3, -40, 3, +-21, 20, 25, -26, 10, 37, -38, 18, -41, -8, -24, -62, -16, -43, -45, -42, 2, -13, -64, -5, 4, 35, 27, -27, 28, -10, 19, -31, -4, -15, -84, 1, 0, -1, 26, -50, 21, -1, -10, -3, -37, 1, 22, -1, -14, -19, 13, 22, -35, -18, -34, -38, 18, 10, 48, -5, -34, 46, -83, 45, 28, 18, 10, 22, 0, -26, 54, -3, 60, 41, -28, 14, -2, 13, 8, -6, -46, 39, 10, -7, -97, +-113, 0, 34, -40, -12, -19, 11, 24, 29, -21, 10, -16, 2, -24, -24, 61, -23, -19, -27, 42, 71, 8, 42, -49, 34, 41, -21, -14, -5, 1, 15, -33, 2, -13, 56, 1, -45, -92, -73, -62, 5, 12, 44, -40, 19, -9, 19, 19, 45, 1, 21, 90, -34, 12, 20, -31, 7, 59, 50, -34, 12, -4, 1, -20, -51, -61, 30, -11, 1, 18, -29, 4, -15, -9, 15, -41, -14, -32, -29, 6, 21, +20, 5, -15, 16, -3, 11, -25, 17, -11, 44, 22, 0, 35, 1, 34, 12, 1, -5, -28, -25, -22, -14, 3, 9, -2, -3, -27, 2, 41, 16, -34, 16, -2, 12, 15, -56, -50, -8, -37, -1, 1, -63, -16, -11, -2, 51, -53, 34, -12, -13, -28, 2, -41, 37, 10, -1, 17, 15, -11, 4, -2, 33, -94, -19, 8, -41, 38, 34, 1, 0, 31, 13, 25, -37, -78, -9, -23, -13, 30, 10, 11, +-8, -20, -26, -24, 9, -29, -12, -16, -3, -6, 41, 38, 4, -127, 7, -6, -6, -10, -23, 5, 0, 7, -10, 23, 7, -12, 24, -13, -4, -1, -9, 16, -13, -7, -2, -35, 29, 47, -28, -68, 12, 15, 37, -5, -7, -127, -82, -42, 24, 26, 11, -8, 0, 9, -12, 28, -13, 31, 11, -24, 43, -22, -14, -34, 18, -7, -38, 7, -39, -1, -5, 2, -127, -10, -105, 26, -23, 17, -18, -7, 57, +-40, 23, -28, 0, 4, 25, -23, 4, -5, 18, 4, -11, -62, 42, -33, -18, 29, -15, -13, -23, -54, 23, -52, -43, 40, -52, 11, -89, -84, -90, -40, 39, -9, -42, 15, 0, -49, -26, -15, 1, -20, 7, 4, -3, 35, -11, -52, -3, 59, -17, -2, 45, -24, -8, 12, -11, 23, 88, -11, 17, -127, -4, 2, 4, -11, -21, -13, 0, -25, 43, 21, -77, 38, -2, -15, -10, 0, 6, -9, -38, 30, +-68, -35, -36, -69, -8, -42, 0, -50, -27, -21, 83, -86, -87, 20, -14, 29, -10, -1, 0, 18, 24, 38, 30, 4, -11, -22, -8, -50, -14, -19, 26, 8, -3, -26, -26, 5, -31, 42, -32, 29, -36, 1, -3, -59, 28, 16, -54, 71, -25, 44, 0, -74, 43, 7, 22, -2, 10, 1, 4, -68, -1, 25, -15, -39, 11, 11, 14, 5, 5, -79, 127, -29, -83, 14, 53, -63, 9, 10, -47, 11, 23, +-53, 0, 5, -12, -33, -37, 27, 6, 42, -2, 22, 15, 13, -20, 1, -54, 24, -5, -83, 31, -37, 8, 23, -24, -4, -19, -38, 39, -5, -4, 13, 30, 24, 0, -35, -45, 3, 12, 13, -1, 0, -17, 8, 10, -47, 18, 8, 5, 5, -19, 13, -14, 15, 1, 9, 9, 3, 32, 18, -16, -21, -23, 21, 48, -107, 0, 13, 38, 33, -1, 11, 3, 12, 17, 2, 12, -21, -4, -34, 10, 111, +37, 2, -32, -46, 27, -65, 40, -2, -38, 16, 6, -17, 5, 13, 13, 8, 0, 1, 53, 15, 2, -21, -2, -18, -46, 37, -12, -22, 24, 29, 24, 2, -8, -11, -16, -2, -24, 2, -43, -8, 40, -52, 35, -39, -6, -5, 21, -16, 0, -5, -43, -46, -21, -83, -10, 0, 14, 34, 28, -73, 24, 56, 41, -2, 11, -6, -19, 103, 37, -91, 36, 9, -24, -86, -89, -42, 22, -34, 7, 5, 0, +3, 15, -14, 19, -30, 6, 1, -33, 20, 13, -12, -18, -15, -3, 0, 16, -16, -20, -2, 25, -28, 47, -3, 22, -27, -6, -15, 44, -19, -11, -127, 0, -26, -22, 25, 11, 10, -9, -13, 10, 16, -24, -12, 5, 20, 48, 5, -26, -22, 20, 9, 3, 31, 3, 10, -4, -65, -19, -40, 32, -45, -28, 1, 0, -73, 127, -50, 28, 11, 10, -2, 36, -6, -23, -73, -17, -28, 9, 0, 23, 28, +29, -19, -11, -13, 1, 41, -7, 27, 9, -25, -3, -42, 7, 4, 52, -48, -7, 37, -37, -32, 93, -28, -9, -28, -41, -1, -11, -6, 21, -21, 17, 1, -43, -16, -15, -9, 7, 6, 11, 4, 14, 5, 9, -12, 49, 40, 10, 19, -21, 9, 21, -9, 27, -11, -22, 10, 30, -29, 18, 40, -11, -122, -16, -7, 28, -20, 40, -5, -14, -9, 39, -41, -35, -16, 34, -22, 51, -32, -97, -7, 19, +6, -37, -20, -35, -51, 24, 24, 3, -42, 29, -86, 78, 41, 61, -29, -31, -3, -3, 16, 20, -4, 37, 10, 28, -17, -53, -37, -75, 6, -30, 17, 12, 19, -43, 19, -53, 37, -13, -14, -33, 9, 10, -1, 3, 32, -3, 7, -17, 8, -57, 40, 5, -14, -48, 1, -4, 11, -2, -31, -22, -13, 24, 82, -3, -49, 12, -67, -6, 69, 19, 61, 44, -18, -11, 15, 1, 14, -38, -22, -12, -18, +56, 7, 4, 4, 28, -6, -15, 27, -1, -17, 22, 13, -32, -78, -14, -3, -23, 17, -13, 34, 25, 53, -61, 29, -15, -14, 4, 65, 22, 17, 3, -69, 5, 29, -65, -3, 45, -2, 20, 41, 26, -4, 54, -9, -29, 4, -87, -79, 47, -103, 15, -64, -36, 97, 9, -83, 60, 5, 22, 22, 22, -30, 10, -64, 31, -37, -27, 78, -23, 32, -31, -10, 9, 0, 11, -15, 11, -1, -1, 7, 7, +4, -42, 99, -24, -35, -112, 14, 14, 44, -14, 97, 19, 24, 52, -39, 22, -11, -14, -8, -4, 29, -30, 38, -50, -87, -20, 4, 69, -14, -17, -31, 4, -35, -93, 12, -33, -4, 7, -27, -13, -26, -27, 14, -15, -35, -5, 9, -11, -28, -7, 31, 7, -10, -18, 23, -34, -7, -23, 8, -3, -127, -27, -31, 17, 14, 38, -37, -66, -25, -33, 12, -7, -29, -7, 11, -26, 18, 13, 36, 2, 2, +-27, 21, 9, -8, 5, -1, -18, -15, -5, 17, 2, 34, -19, 13, -12, -34, 26, -30, -2, 26, 9, 9, -11, 79, -56, -18, 18, -57, 57, -44, 2, 91, -15, -12, -22, -25, 3, 7, -63, 6, -7, -10, 12, -6, -39, -5, 13, -40, -24, -15, 22, -9, -51, 22, 17, -28, -25, 25, 11, -8, 29, -38, 20, 52, 24, 10, 13, -9, 15, 45, -12, 9, -32, 2, 26, -2, -29, -22, 6, 11, -21, +55, 1, -20, -33, -60, -48, 28, 15, -38, -4, 30, 2, -47, 41, -19, -41, -15, 48, 1, -19, -50, 59, -14, -55, -16, -20, -37, 13, 38, 61, -66, -54, 49, -62, 35, -3, -13, 1, 39, -11, 8, -28, -26, 39, -20, -28, -25, -20, 13, -7, -26, 28, 16, -36, -2, 21, 7, -18, 12, 2, 35, 10, 33, -8, 10, 26, -17, 53, 25, -3, 27, -61, 11, 30, -7, 7, -41, 48, -18, 5, -6, +-3, 5, -22, -72, 39, 7, 32, -42, 4, -38, 22, 12, 40, -3, -3, -20, 42, -33, -27, -14, -18, -81, -3, 19, 27, 2, 32, 0, -103, 1, 46, -15, 12, -29, 19, 40, -13, -1, 55, 37, -53, -32, 34, 84, -11, -4, 39, -15, 14, 49, -3, -21, -96, -35, 14, 2, -13, -2, -2, -24, -31, 8, -21, 0, -14, 8, -3, -10, -54, 9, -19, -1, -8, -7, 2, -16, -4, -5, 14, 12, -9, +36, -15, -74, -36, -58, -20, -20, -4, -41, 5, -43, -2, 23, -2, 76, 41, 2, -36, 37, -55, -24, -9, 60, -11, -56, -42, 58, -41, 8, 19, 3, 8, 18, -13, -17, -20, 22, 8, 34, 13, -13, 34, 12, 1, 24, 4, 4, 1, -45, -13, 36, -17, 21, 76, -20, -2, -40, -25, -64, -74, 53, -21, -2, 47, 12, 23, -6, 17, -62, -7, -32, 36, 28, 26, -19, -127, 62, 47, 44, -20, 58, +-14, -3, -52, -70, 10, 8, -31, 16, 16, -38, 6, -62, -40, 39, -27, 47, 5, -28, -107, -6, 18, -13, -65, 31, 28, 7, -31, 23, 44, 8, -10, -4, -13, -21, 12, 16, -9, 7, 45, -23, 32, -23, -4, -23, -29, 10, -28, 43, -20, -10, -42, -88, -40, 49, -30, 24, 21, -12, -65, -68, 4, -20, 55, 31, -21, 9, -45, 3, 66, -5, -20, 8, 17, -18, 75, -20, -31, -6, -40, 60, 25, +-11, -38, -12, 6, -19, 31, 35, 19, 14, -64, 11, -26, 5, -17, -1, -23, -13, 1, -4, 16, -28, -9, -1, 3, -34, 62, -8, 18, 22, 33, 16, 8, 44, -34, -92, -27, -24, -2, 23, -11, 23, -14, -12, 0, -80, 23, 26, 45, -40, -75, -22, -96, 45, 27, 37, -11, -62, 37, -59, 44, 10, -55, 47, -16, 1, -31, -63, 15, -46, 8, 16, -63, -44, -57, 59, -47, 56, 50, -5, -27, -4, +-34, 23, 74, 4, 12, 72, 25, -42, -7, -19, -14, 40, 7, 57, 3, -7, 27, -7, 25, 0, -3, 44, -3, -19, -24, 0, -21, -13, -4, -14, -12, 9, -37, -20, 6, -12, -12, 3, -21, 9, 27, -6, 12, 10, 4, 37, 26, 31, 20, -39, -47, -6, -2, -13, -11, -75, 39, 22, -66, -66, -37, -30, 33, -35, -19, 7, -9, 24, 21, -6, 31, -32, 20, 16, -7, 10, 18, 9, 0, 36, -28, +-55, 13, 11, -7, -37, -21, -25, -65, 88, 0, 31, 59, 23, 20, 34, -8, 27, -8, 48, 33, -32, 0, 32, 0, 57, -17, 10, -26, 30, 52, 5, -42, -70, -7, -49, -65, 71, 4, 22, -33, -17, -26, -56, 28, 47, -45, 112, 19, -5, -28, -31, 2, -13, -19, 24, -40, 30, 33, -21, 13, 31, 3, -42, -4, 17, -9, -8, -15, -19, 12, 27, -38, 13, 17, 12, -5, -22, 22, -7, -18, 11, +3, 46, -33, -28, 6, -16, 9, -9, -14, -12, 32, 24, 76, 17, -48, -19, -11, 18, -7, 53, -26, -30, -49, -18, 43, 18, 19, -8, 36, 2, -63, 2, 64, -50, -17, 16, -46, -91, 23, -2, -31, 43, -10, 82, 14, -23, -56, -5, -53, -14, 7, -22, 6, -19, 36, -1, 22, 50, -31, 4, -41, 2, 10, -67, 10, 1, 76, -26, -13, -82, -2, -53, 4, 20, -29, 33, 31, -18, 17, 13, -21, +32, -4, 11, 18, -2, 8, 3, -9, 14, 41, 0, -4, 2, -4, 0, -6, 5, 8, -2, -20, -86, -19, 12, 9, -25, -12, 0, -74, -33, -23, 29, -1, -90, -67, -32, 19, -45, 68, -69, 10, -76, 38, -48, 14, -30, -65, 23, 47, 22, -56, -65, -21, -109, 37, -10, -10, -18, 15, -1, -53, -3, 22, -7, 25, -21, 5, -16, -34, -1, -2, 78, -16, 25, 19, 62, 61, 27, 14, 40, 6, 11, +-16, 29, 69, -62, -41, 1, 9, 16, -100, 0, 26, 17, -30, 34, -36, -40, 16, 8, -14, -15, -18, 42, -17, -9, -42, -32, 5, 14, -31, -21, 1, 67, -48, -10, 55, -97, 20, -2, 26, 3, -69, -21, 20, 38, 46, -95, -56, -62, -12, -8, 1, 10, -4, -89, 13, -9, -46, 41, 16, 25, 21, -18, 2, -13, -48, -17, 12, -71, 33, -16, -31, -41, 23, 14, 10, -14, 64, 40, 13, 25, -73, +9, 3, 50, -28, 0, 2, 1, -6, -16, 20, -25, 12, 106, 4, -24, -24, -13, 39, -89, 91, -26, 31, -45, -63, 42, -49, 6, 7, -22, -29, 35, 30, 11, -24, 27, 16, -20, -18, -46, 31, 12, -13, -22, 33, -22, 18, -20, -54, -26, -26, -102, -45, 29, 19, -11, -2, 13, -32, 22, 4, 49, 18, -31, 34, -35, 12, 31, -1, -20, 2, -10, 2, 19, 16, 11, -12, 25, -20, -3, 8, -65, +-27, -94, 27, 2, -16, -1, 59, 117, 33, -3, -23, -27, -18, -36, -55, -10, -25, 9, 43, 19, -15, -51, -4, -22, -10, 6, -43, 35, 8, -6, 36, 1, 4, -33, -8, -22, 27, 31, -12, -31, 6, -7, -14, -17, -4, 9, -10, 17, -1, 9, -24, -19, -14, 15, -35, -24, 7, -11, 10, -20, 16, 7, -14, -11, -5, 14, 13, 27, -4, -36, -14, -11, 14, -43, 21, 127, -23, -11, 35, -32, -8, +11, -15, 52, 7, -3, 1, 54, 15, 4, -66, -69, 31, 12, 12, -28, -92, 3, 84, -21, 28, -1, 22, 74, -30, 18, 7, 74, 7, -4, 4, -27, 9, -59, 12, 9, -13, 6, -14, -9, 11, -14, 28, -14, 5, -4, 37, 4, 13, -23, 39, 28, 0, 7, 16, -43, -1, -9, 47, 85, -43, -92, 4, 43, -11, -16, 57, -67, -28, -59, -35, -45, 26, -6, -89, 97, 0, 8, -1, 16, 40, -80, +69, 18, -45, 8, 86, -15, -24, 9, 20, 53, 10, -34, 49, -6, 40, -20, -31, -21, -13, -7, -31, 20, -5, 20, 3, 2, 17, 8, -17, -24, 44, 52, -27, 36, -22, -6, 22, -25, 53, -32, 64, 31, -59, 14, 4, -13, -6, 0, -15, 8, -12, -13, 16, 55, 28, -21, -5, -14, 8, -11, -45, -28, 6, -72, 29, -12, -11, 49, -22, 28, -31, -9, 6, -11, -30, 5, -33, 4, -29, 69, -44, +-31, 1, 32, 22, 70, -31, 12, -53, -41, -65, 90, -113, 52, -9, 41, -40, 67, -57, -15, -18, 22, -15, 18, -10, 13, 38, 23, -11, -19, -21, -6, -11, 13, 16, 10, -1, 24, -4, -12, 1, 9, 20, 0, 15, 14, -1, -13, 9, -16, 9, -8, 1, 1, -35, -25, 30, 5, 1, -54, 21, 81, -65, -24, -8, -60, 17, -33, -24, -23, 10, -82, 41, 85, -57, 6, -38, 11, 38, 46, 4, 27, +7, 13, -27, 10, -35, -122, 66, -17, 39, -9, -62, -45, 6, 13, -7, -45, 40, 0, -12, 15, -21, 19, -23, 56, -16, 3, -38, 2, -61, -9, -19, -25, 16, -23, 31, -44, 23, -42, 9, -22, -16, -20, 10, -13, 19, -26, -54, 27, -5, 24, -4, 17, -34, -12, -23, 16, -60, 35, -51, -15, -38, -50, 10, 34, -15, -30, -3, -51, -7, 47, 27, 20, -22, -20, -2, 24, -36, -41, -3, -9, 12, +-10, -31, -19, 8, 21, -29, -65, -6, 21, -23, -66, -33, -37, 3, -45, 51, 8, -2, 11, 1, 13, -9, 14, 3, -31, -14, -32, -68, -46, 18, -1, -2, -21, -81, 57, -51, -4, 1, 12, -1, -73, -24, 38, -57, -46, -39, -67, -15, 55, 31, 25, 76, 11, -15, -12, 28, -81, -39, -41, -1, 8, -82, -31, -29, -16, -1, 16, -14, 21, 25, 47, -30, -26, -53, -36, -69, -24, 7, 20, -2, 20, +-59, 22, 4, -17, -5, 74, 23, 0, 19, 44, -52, 17, -34, -34, 29, -29, -23, 78, 8, -24, -33, 22, -44, 12, 44, 12, 1, -17, 46, 34, 35, 18, 9, 65, 47, -58, -2, 10, -18, 4, -37, 10, -31, 9, 20, 15, 15, 20, -19, -18, -66, -46, -75, -18, -9, -13, -27, 37, 27, 16, -6, 6, 19, 10, 16, 50, -6, -127, 13, 20, 2, -10, -18, 16, -27, -10, -16, 22, 30, -7, 38, +25, -30, 11, 7, -30, 8, -22, 3, 12, 15, -16, 12, -2, -20, -11, -27, -19, 28, -21, 32, 9, -19, -5, -12, -31, 64, -100, -12, -20, 24, -6, 2, -7, 12, 50, 23, 43, 50, -55, 22, -12, 17, 101, -30, -17, -15, 12, -42, 47, 24, -18, 8, -18, -2, 31, -9, -40, 19, -29, -36, -48, 43, -24, -20, -8, -35, 7, -43, -17, 69, 12, 35, 11, 3, -19, 10, 18, 7, -13, 11, -19, +-13, 23, -24, -30, 29, -44, 4, 20, -26, -37, 47, 27, -21, 10, 5, 28, 72, 55, -49, -42, -61, 16, -31, 14, 17, -41, -24, -33, 7, -29, -100, -41, 25, -5, -20, 26, -23, 12, -17, 39, -3, 24, -24, -38, -32, -10, 11, 0, -60, -59, -14, -22, 3, -29, 9, -16, -17, 31, 13, -21, 35, -5, 2, 83, -28, -80, -23, 105, -2, 58, -12, 0, 31, 12, 29, -2, -3, -29, -1, -9, 15, +-24, -79, -11, 6, 6, -27, -5, -12, -59, 69, -22, 20, -39, -21, -4, -72, 51, 61, 23, 7, -25, 4, -14, 10, 4, -19, 55, 34, -13, -22, -105, 41, -39, 4, 54, -72, -11, 25, -20, -45, -44, 68, -9, -91, 41, 80, -90, 49, -36, 36, 34, 76, -8, 14, 31, 13, 4, -6, 27, 46, 33, 12, -19, -43, -57, 27, -22, 26, -32, -45, 14, -28, 26, 18, 44, 27, 15, 75, 15, -5, -87, +-34, -36, 22, 9, -1, -31, -14, -20, -24, -18, 93, -13, -20, 7, -36, 15, 27, 22, -101, 19, -54, 23, 44, 7, 11, -10, 35, 30, -15, -57, 41, -58, 55, -21, -50, -13, -22, 21, -18, -46, -14, -2, -2, 28, 31, -23, -44, -3, 31, -18, 69, -19, -56, -126, 62, -48, 77, 39, 10, -77, -31, -14, -14, 26, 45, -39, 1, 5, 1, -15, -24, -21, -30, -5, 19, -13, 38, 5, -11, -24, -5, +-6, 35, 24, -13, 11, -30, 57, 34, -29, -27, 24, -18, 50, 9, -5, 54, -15, -39, -41, 2, -6, 18, 19, 63, -20, 85, -1, -5, -113, -19, 14, 2, 24, -9, 20, 57, 54, 9, 10, 41, -33, 2, 24, 66, 87, 43, 14, 21, -3, -11, -43, -72, 9, -15, 3, -38, -24, -16, -42, 11, 8, -69, -62, 12, 23, 76, -53, -37, 77, 19, 10, -7, 47, 14, -56, 19, 23, -31, 12, -22, -36, +-14, 21, -121, 0, -6, -4, 19, 29, 25, -30, -6, 33, -14, -37, 16, -6, 3, 18, -27, 27, -24, -45, 48, 4, 27, -4, 0, -38, -76, 51, 31, -4, -98, 40, 13, 60, -5, -47, 47, -24, -62, -47, 64, -61, -80, 20, 20, 17, 15, 81, 3, 11, -19, 54, -36, 22, -2, -23, 52, -80, -8, 117, -16, -11, 8, 4, 43, -16, 8, -10, 39, 42, -5, -8, -61, -41, -9, -11, -4, 0, 20, +110, 17, 10, -56, 32, -20, 1, -8, -10, 5, 12, 18, 8, -28, -10, -88, -64, -21, -29, 3, 5, 19, 73, 5, 21, -14, -31, 27, -9, 29, 17, 44, -2, 55, 14, -14, -27, 24, -5, 50, -52, 17, 18, -6, -54, 40, 17, -21, -28, -27, 55, -5, -6, 51, 2, 5, 13, 18, -54, -65, -1, 26, 20, -43, -16, 33, 11, -48, -8, 55, 6, -19, -9, -5, -9, 22, -10, 8, 20, -36, -34, +22, -23, -6, 31, 11, 30, -45, 0, -39, 20, -15, -44, 12, -9, 34, 32, -1, -12, 15, -32, 64, 28, 9, 19, 10, -3, -56, -91, 36, 30, -69, -10, -28, -104, 3, 13, -31, 4, 49, 11, 56, -43, -24, -11, -41, -4, 40, 13, 10, -13, -75, -62, 91, -18, -33, -72, -85, 37, 43, -37, 42, 9, 14, -27, 24, -11, 8, -2, 19, 10, -28, 30, -45, 18, 30, -8, -6, 3, 18, -18, -5, +-19, -33, -20, 45, 32, -31, -46, -1, 62, 12, -6, -19, 11, 56, 5, -100, -33, -9, 4, -17, 10, -22, -23, 40, 33, 10, -15, 3, 10, -3, -1, -49, 5, 23, 24, -5, 3, 10, -40, 13, 26, 17, 45, 11, 32, -43, 16, 30, 9, 16, 48, 17, -36, 19, -25, 76, -45, 45, 43, -5, 28, 60, -85, 0, 110, 23, -22, -37, 8, 42, 60, -33, -88, -18, -32, -40, -21, -19, -28, -97, -7, +-52, -8, 58, 6, -3, -6, 5, -52, 12, 61, 3, -4, -53, -39, -15, 0, -19, 28, -29, -18, 31, -21, 2, -14, 16, -6, -21, -1, 24, -25, -10, 30, 22, -18, 42, 52, 27, 1, -93, 50, 1, 55, -45, 39, -100, -48, 34, -48, 4, 9, 20, 8, -22, 22, 31, -2, -18, 78, -66, -39, 37, -30, 5, 19, 10, -50, -27, -37, 23, -48, 45, 9, 9, 34, -16, 24, -24, -86, -56, 59, 48, +22, -34, -37, 0, -7, -54, -3, -2, 23, -24, -5, -31, -4, -13, -44, 48, -31, 5, 1, 36, -51, -18, 11, -127, -5, -5, -4, -15, 28, 6, 1, 7, -31, 15, -7, 29, 12, -11, 32, -8, -33, -29, -26, -15, 3, 28, -31, -7, 50, -12, -23, 23, -1, 18, 2, -15, 18, -72, 56, -77, -37, 12, 22, -12, 23, 32, -25, -21, -53, -27, -18, 27, -6, -74, -59, 6, 0, 27, 3, 3, 24, +61, -31, -18, -44, 18, 6, -2, 25, -14, -29, -98, -47, -34, -7, -47, -6, -8, -27, -30, -10, 6, 28, 15, 10, 2, 38, -22, 15, 15, 19, -28, -27, -33, 7, 8, 34, -24, -5, -9, -4, -2, 18, -34, 8, -47, -36, 3, -7, -27, 17, -127, -42, -8, 26, -16, -21, -30, 92, 19, 1, -26, 3, 104, -127, -11, -22, 10, -27, 32, -25, -4, 16, 23, 38, 32, -32, -42, -14, -17, -40, -52, +28, 39, -54, 29, -4, -13, -8, -46, 46, -16, 15, 25, 8, -21, 28, 6, -19, -25, 58, -20, 27, 27, 21, 11, 20, -55, -59, 9, 2, -3, 59, -5, -22, 60, 20, -12, -21, 0, -21, -8, 7, -35, -8, -35, -27, 17, -3, -16, -17, -11, 22, 56, 71, -1, 25, 42, 55, -57, -18, -29, 10, -13, 43, -43, 0, -3, 63, 6, -36, -9, -10, 38, -61, -19, 9, -16, -50, -18, 0, 72, 16, +28, -11, -41, -13, 24, 31, -25, 53, -28, -14, 27, -65, -34, 8, -80, 18, 55, 9, -31, -127, 24, 18, -7, 68, -4, -6, -21, 21, 21, 8, -1, 13, -35, -24, -66, 9, -14, -8, 17, 14, -43, -27, -30, 13, -23, -1, -45, 14, 10, -16, -2, -29, 53, -20, -36, 14, -38, -6, 17, -32, 24, 72, 59, -22, 0, -30, -50, 4, 13, -13, 28, 13, -74, -2, -72, 28, -21, -4, -98, 38, -21, +30, -12, -10, -9, 15, -8, -20, 6, -41, -19, -20, 29, 13, -19, -27, -11, 14, -15, -9, 28, -6, -15, -8, -34, -39, 38, 40, 5, -7, -4, 12, -56, 0, -21, -23, -4, -30, 9, -2, 11, -2, -19, -40, 5, 2, 8, 13, -8, -33, -19, -6, -26, 12, -23, 7, -57, 7, -2, -7, -15, 18, 26, -2, -32, 35, -24, -8, 20, -35, 80, -2, 50, 58, -5, -41, 24, 39, 54, -40, -27, -34, +39, -65, 19, 59, 7, 17, 24, 3, 1, 89, 31, -10, 16, -5, 85, 19, -9, 25, 83, -38, -6, -7, -9, 13, -38, -59, 12, -5, -32, -21, -47, -25, -7, 12, 44, 14, -56, -1, -23, 31, -12, -3, -7, 21, 8, -91, 43, -1, 15, 15, -41, -59, 18, -14, -41, -56, -21, -49, -3, -52, 15, -3, -48, 65, -28, 29, 15, 41, 7, 4, -22, -30, 7, -53, 42, 0, 6, -41, 20, -30, 35, +-38, -4, 8, -51, -7, 71, -49, -33, -5, 32, -32, -60, -63, -13, 4, 7, 7, 5, 76, -47, 17, 40, 20, 21, -78, -19, -71, -2, -35, -21, 13, 91, -35, -2, -27, 25, 29, -61, -1, -10, 22, 20, -13, -33, -113, 13, -23, 26, 37, 2, -56, 38, 8, 9, 17, 1, 3, 8, 8, -30, -12, -8, -47, 16, 8, -11, 1, -57, 51, 32, -59, -1, 108, -23, -42, 19, -21, -19, 63, 2, 48, +-35, -51, 30, 10, 27, -64, 17, -35, -12, -41, 9, 44, 7, 26, 13, -13, -59, 6, 21, 27, -46, 28, -29, -29, 53, -57, 38, -10, -12, 3, -22, -8, 8, 84, -9, -21, -16, 9, 6, -52, 16, -77, -4, -17, -19, 11, -23, -61, 18, 45, -3, -26, 14, 26, -9, 1, 10, -47, 1, -60, -46, 12, -10, 30, -13, -21, -17, 15, -56, -29, -9, -49, -22, -22, -26, 8, 8, -30, -69, 14, -24, +-53, -20, -44, 3, 76, 57, -13, -25, 19, -81, -9, 14, -61, -18, 10, 9, 36, -30, 30, 30, -7, -42, -48, 18, -4, 12, 65, -25, -51, 4, -70, 25, 17, 26, -1, 12, -24, -5, -63, -70, 45, -48, -68, -29, 40, -55, 16, -25, -10, 38, 24, -9, 6, 127, -25, 5, 16, -38, 22, -16, 15, 30, 22, -1, -4, -46, -59, 20, -30, -23, 37, 3, 31, -41, 2, -6, 46, -4, -23, -1, 19, +12, 74, 17, -21, 17, -77, 18, 12, 0, 23, 10, 5, 19, -14, -23, -34, 74, 10, -57, -13, -38, 13, -29, 2, 12, -48, -42, 1, -3, 17, -23, -104, -20, 40, -6, -17, -8, -22, 20, 66, -30, -22, 3, 1, 7, -23, 53, -11, 5, -76, -4, -33, -11, -28, -17, -76, 19, -19, -5, -41, -30, -1, -1, 19, 27, 17, -37, -34, -51, 6, -21, -4, -8, 35, -20, 29, -3, -81, -8, 6, 3, +18, -21, -27, 52, -107, 20, 66, 11, -50, -41, 59, -5, 39, 27, -5, 51, -19, -4, 6, 22, 5, 3, -55, 4, 43, -4, 6, 28, -101, -33, 1, 1, 33, -10, 3, -47, 13, 40, -3, -13, -22, -37, -3, 15, -11, -12, 12, -3, -31, -14, 18, -25, -25, 20, 22, 55, 1, 9, -12, 22, -33, -26, -67, -13, 12, -6, 38, 7, -23, 24, 29, -33, 16, -23, 30, -17, -18, -20, 4, -15, -10, +20, -10, 10, -15, 4, 1, 0, 14, -25, 16, -12, 6, -18, -14, -10, -12, 19, 5, 48, -109, 37, -51, -17, 65, 15, 1, 87, 45, -55, -17, 15, -54, -13, 24, 0, 12, 49, -75, 35, -8, 15, 49, 51, -68, 1, 38, 37, -60, -5, -35, -55, -15, 35, -53, 33, 28, 30, 7, -44, -127, -41, -32, 30, -39, 53, 20, 0, -49, 27, 13, -10, 61, 11, -61, -22, 20, 2, -15, -33, -34, -6, +-33, 8, 7, -40, 32, 12, 1, 105, -2, -45, -74, -22, -63, 24, -89, -21, -22, 0, -42, -15, 36, -26, -5, 2, -29, 23, -53, 16, -61, 11, -39, -22, 19, -61, -18, 7, -79, -6, 46, -59, 24, 61, -97, -56, -21, 35, 3, 2, -15, 0, -90, 16, 63, 33, -46, 23, 27, 25, 9, 6, -13, 15, -4, 47, 15, -4, -18, 0, -16, -56, -16, 13, 5, 59, -3, 1, -4, 54, -26, 0, 0, +0, 17, -1, 13, -8, 29, 13, 40, 22, 0, 19, 9, -33, 8, 0, 6, -104, 16, -44, -16, 44, -6, -44, -3, 12, -127, -42, -61, 8, -28, 12, -45, 0, 36, -23, -82, -4, 18, -18, 39, 31, -83, -53, 34, -42, -1, -32, 30, -28, 15, -50, -27, -14, -7, 18, 11, 18, -108, 56, 17, -43, 2, -49, 22, 0, 4, -25, -36, 11, 16, 26, 34, -18, -35, 17, -15, 25, -21, -43, 7, -12, +35, 7, -29, 4, 18, -57, 26, -47, -92, -32, -53, 58, -23, 62, 28, 0, 27, -25, 56, -30, 9, 25, 33, -33, 1, 19, -11, -21, -13, -21, 13, 9, -19, -21, 14, -21, -19, -10, 1, -40, -7, -38, -9, 6, -43, -37, 2, 0, 17, 11, -5, -36, -21, 9, 10, 1, -4, 8, -13, 0, -24, 25, 34, 6, 31, -18, -24, 31, 7, 21, 4, 53, 11, -28, -39, -8, -4, 37, 21, 0, -4, +47, 16, -6, -5, 12, -29, 26, 46, 7, 47, 19, -24, 39, -2, 16, -10, -33, 3, -4, 3, -12, -4, -2, -33, -60, 1, -13, 10, 32, -21, 0, -13, -42, -26, -1, -50, -10, -48, 58, 40, 35, 8, 0, -5, -89, 15, -10, -12, 3, 9, -6, 48, 57, 2, 6, -96, -49, -48, -25, 45, 15, -17, 0, -26, 38, 100, -51, -81, -8, 10, 58, 14, 22, -21, -7, 3, 80, 9, 49, 27, -30, +6, -2, 29, -6, -14, 12, -43, -12, 10, 0, -46, 39, -23, 0, 5, 22, 64, -18, -52, -2, -2, 25, -10, -30, -63, -23, 8, 111, 37, -2, 5, 44, 84, 10, -57, -12, -6, -50, -127, 21, 4, -19, 28, -43, -24, 0, -24, 7, -49, -3, -33, 16, 11, -16, -28, -20, -8, 20, -39, -1, -36, -19, 13, -12, 32, -37, 8, 6, -18, 61, -127, -16, 28, 24, -16, 11, -9, 0, -35, 18, -56, +-51, -14, -12, -26, 81, 33, -5, -14, -10, 21, 7, 0, 4, 19, 4, -21, -7, 0, 47, 4, 3, -106, 1, -10, 7, 4, 17, -11, 0, 8, -15, -2, -6, -3, -1, -19, 4, 11, -22, -1, -21, -6, -33, -39, 11, -13, 25, 17, -25, -1, 14, 38, -42, -52, 11, 19, 11, 42, -20, 22, 85, -10, -17, 6, -8, 24, 6, -20, -19, -73, -60, 5, -11, -4, -9, -19, -34, -63, -10, 13, 31, +-22, -61, 15, 39, 1, 38, -25, -48, -21, 5, -66, -23, -124, -44, -17, -33, 19, -87, -11, -100, -46, 86, -39, 8, -18, 11, -74, 10, -17, -58, 25, 0, -4, -64, -53, -19, 0, -29, -11, -1, 19, 127, 5, -104, 10, 52, 12, 58, -19, -50, 22, 18, -40, -52, -76, -45, 30, -3, -68, -22, 56, -121, -14, -42, -5, -9, -12, 49, -6, -10, -42, 0, 6, 76, 31, 17, 9, -13, -6, 9, 2, +28, 11, -14, 53, 3, 5, 19, 16, -44, 1, -40, 4, -24, 18, -14, 56, -27, -10, -13, -29, 13, -10, -15, -7, 0, 31, 14, -9, -22, 6, -37, -1, 49, 11, 18, 3, 62, 37, -24, -15, 12, 31, -4, 58, 7, 45, 10, 27, -4, 14, 13, -73, -30, -42, 48, -1, -21, -46, -16, 2, 18, -51, 72, 32, -17, 24, 20, -13, -32, 7, -28, 1, 52, -2, 15, 74, -11, -8, -51, -11, -27, +-2, -36, 2, -32, 52, 26, 44, 50, 49, -66, -4, -10, -33, 6, -44, 41, 9, -79, -60, -66, -19, -13, 42, -8, 29, -20, -2, -37, 1, 6, 6, -9, 17, 63, -14, 66, 25, -37, -2, 50, 40, 5, 17, -4, -11, 46, -3, -35, 33, 15, 10, 111, -49, -23, -54, -95, 76, 27, 110, 20, -12, 18, 29, 33, -30, 29, 41, 6, 1, 66, -32, 24, -67, -36, 10, 7, 20, -48, 27, 23, 28, +-20, 13, 29, 33, 34, 7, 99, -9, 73, -30, -50, 67, 6, 14, 35, 5, -10, -27, -34, 20, -9, 18, 6, 35, -27, 0, 6, 6, -43, -9, -18, 45, -49, 24, 26, -40, 3, -15, -51, 46, 5, 68, -22, -27, -25, 9, -12, 7, -4, -1, 23, -27, -17, -14, 73, 12, 48, 17, -13, -46, 17, -39, 21, 5, 75, -12, -52, 38, -79, 5, 33, 36, 27, 110, 28, 58, 16, 33, -16, 10, -16, +20, -22, -23, -31, -5, -61, -16, 29, -33, -9, -11, 24, -32, -26, 21, -64, -5, -16, 15, 36, -9, 11, 3, 24, 45, 0, 0, -12, -4, -38, -47, -30, -26, 25, 30, 14, -38, -17, -48, 16, 8, 1, -123, 23, -64, -20, 49, -108, 39, 0, 2, 17, 34, -3, 20, 20, 19, -72, 55, -41, 8, -1, 41, -12, 18, -52, 24, 11, 51, 30, 10, 31, 16, -17, -9, 24, -93, -15, -31, 27, -15, +36, 38, -14, 25, -26, -50, -40, -26, -24, 42, 7, 23, -23, -23, 4, -4, -2, 12, 20, 52, 6, -27, -17, -21, 5, 1, -7, -35, 12, -65, 22, 12, 26, 19, -12, -25, -49, -15, 11, -3, 1, 3, -18, -6, -22, 2, -2, -13, 9, 7, -22, -13, 17, -12, 36, 7, -22, 2, 5, -24, 8, 5, 22, -29, -9, -6, -22, -58, 14, -42, -25, -4, 15, 16, -12, -48, 75, -24, -74, 3, 46, +36, -73, 31, 14, -60, 29, -29, -3, -76, 6, -32, 31, 27, 5, 41, -8, -93, -49, -73, 36, -56, -31, -16, -14, -56, -60, 122, -9, -30, 42, 28, 15, 87, 13, 57, -72, 27, 1, -9, 17, -32, -18, -6, -22, -21, 25, 25, -15, 60, -79, -26, -2, -44, -49, -18, 27, -15, 14, 25, 4, 40, -9, -25, -13, -18, 24, 12, -72, 1, -5, -13, 11, -22, 14, -6, -26, 19, -17, 49, -3, 21, +-125, -127, -4, -7, -16, 22, 16, -38, -58, -27, -75, -32, -2, 27, -27, -30, -57, -7, -45, -57, -37, -14, -21, 98, -9, -32, 22, 3, 36, 76, -9, -2, -49, 8, -26, 10, 3, 19, 79, 12, 38, -45, 31, 23, -28, 11, 21, -31, -37, -11, 24, 30, 12, 31, 5, -1, 4, -3, -5, 7, -8, -1, 1, 9, 14, -67, 80, 24, -3, 37, 17, 2, -42, -8, 51, 9, 67, -75, 20, -33, -17, +14, 22, -14, -6, 60, -22, 38, -17, -61, -9, -30, 22, 42, -10, -45, -69, -124, -3, 30, -29, -80, 93, 3, -22, 18, 75, 6, -98, 8, -49, -49, -28, 9, 42, 27, -1, -24, -25, -16, -43, -24, -27, 34, 23, 47, 18, 35, -21, 9, -18, 9, -36, 22, -13, -11, -43, -17, 21, 11, -20, 13, -19, -10, 2, 5, -12, 45, -58, 2, -20, 1, -1, 15, -7, 28, -17, 39, 19, -13, -28, -24, +9, -61, -47, 2, -74, 53, -16, 39, 42, 44, -6, 48, -17, 21, -26, 2, 13, 65, -57, -6, -28, -11, -93, -1, 75, -9, -5, 45, 57, -10, -3, -34, -26, 17, 8, 31, -20, 9, 36, -17, 20, -7, -4, -6, 38, -23, -83, 9, -1, -4, -30, 2, 2, 21, -9, -3, 21, -8, 4, 11, 0, 17, 5, -57, 30, -57, 8, -48, 1, 32, -81, -17, 43, 19, -6, -44, -127, 10, -73, 34, 10, +17, -18, 8, 7, 13, 28, -71, 2, 5, 27, 61, 33, -12, -39, -53, -27, 39, -28, 1, -5, -8, 20, -27, 18, -13, 15, -35, 6, 58, -21, -12, -25, -60, 37, -88, -5, 40, -56, -60, -30, -7, 6, 60, -4, 3, -52, -14, -57, 14, -2, 127, -37, -14, -38, 3, -2, -39, 42, 41, 78, 19, -21, 19, 15, 14, 32, -21, 38, -42, 17, -14, 15, 16, 47, 33, -27, 53, -49, -102, 12, 11, +-26, 10, -40, 12, 20, -30, 71, 15, -17, 10, -29, -15, -28, 11, 10, -50, -35, 21, -2, -49, 17, 5, 8, 49, -12, 53, -28, 1, -28, -21, -17, -45, 4, 10, -31, -11, -47, -22, 0, -4, -65, 33, -3, 32, 12, -21, -26, -22, -22, -13, -17, 34, -11, 21, 12, -13, -12, 30, 11, 2, -23, -8, -6, -7, -127, 8, -26, -8, -27, 5, -12, 18, 25, -24, -4, 1, 3, 3, -15, 37, 0, +-13, -2, -17, -18, -3, 7, -4, -3, 38, 59, -11, -34, -13, 28, -19, -32, -9, -26, 10, -85, 45, -1, 16, 14, -12, -16, 10, 31, 6, -14, 24, -124, -59, -81, -18, -127, 26, -30, 41, 38, -2, -41, -19, 37, 2, 4, 26, -58, 12, -31, -5, 22, 4, -16, -28, 26, 43, 8, -8, -62, 8, -11, -10, -41, 52, 22, -77, -68, 0, 22, 51, -24, 3, 12, 31, -21, -37, -15, -2, 0, -6, +16, -65, -33, -21, 31, -6, 15, -28, -35, -6, 78, 10, -1, 29, 5, 9, 16, -99, -5, 1, 80, 0, -46, 65, 25, -2, -9, 46, -6, 43, 28, -44, 28, -19, -11, -64, -60, 0, -10, -19, 14, -6, 24, 57, -12, 20, 16, 40, 7, -69, 75, -12, 51, 2, -36, 17, 3, 14, -11, 18, 7, -15, 20, 1, -4, -1, 6, -9, 11, 49, 52, 6, 30, -6, 1, 22, -15, 15, -4, 19, -39, +-2, 9, -13, 14, -50, 3, -23, -23, -12, -15, 53, 2, -54, -7, 20, -2, 62, -27, -83, -26, 8, 32, 16, 4, -13, -46, -22, -21, -10, 14, -54, 36, -94, -35, -22, -3, -14, 83, 17, 8, -37, 20, 34, 6, 34, 20, -29, 30, -19, -27, 23, -12, -21, 31, -21, -5, -28, -17, 65, 15, -39, -68, -12, -13, -68, -11, 50, 26, -30, -53, 68, -41, 40, -13, -23, -16, 30, 46, -28, 4, -11, +-19, 19, -48, -1, 14, -5, 41, -10, 3, 0, -7, 4, -28, -38, 37, -78, -30, -4, 20, -10, 7, 2, -7, 40, 14, 2, 9, -16, -47, 28, 32, -29, -78, -31, -35, 12, 24, 8, 65, 17, 16, 36, 37, 29, -6, 56, 55, 9, 37, -70, -21, -50, 3, 24, 16, -66, 41, 29, -3, 25, -12, -14, 3, -31, -22, 17, -1, 31, 40, -21, -41, -16, -2, 1, -15, 14, -39, -12, -74, 30, 30, +2, -10, -8, -12, -17, -43, 21, 35, -83, -11, -4, 8, -67, -40, 22, 31, 10, -11, -21, -19, -9, 41, -12, 58, 17, -14, 11, 2, 6, -21, -36, -29, 13, 22, -27, -24, -38, 89, 0, 54, -55, -39, 33, -4, -53, -55, -12, -43, 38, -20, -49, -105, 96, -12, 30, 5, -12, 5, 34, 1, 0, -42, -33, -12, 28, -16, -38, 38, 13, -30, -15, -42, -54, -52, 21, -76, -25, 59, 2, -13, -64, +-5, -35, -32, 15, 10, 26, -23, 43, 5, -20, 28, -20, -31, -39, -89, 2, -29, -13, -16, -29, -12, 21, -80, -17, -59, -39, 87, 7, 16, -46, 3, 7, -6, 42, -65, -23, -8, 21, -15, -58, -18, 22, 27, 112, 31, -110, 23, -31, 25, 45, 54, 1, 24, 8, -5, 43, -59, -29, -6, -63, -18, 20, -13, -6, -10, -8, -13, -23, 3, 0, -23, 32, 26, 19, 24, 16, 8, -88, -16, 18, 38, +-31, 1, 2, -16, -17, 11, 0, -5, -36, 12, 4, -4, 16, -32, -28, 2, -8, 17, -8, 12, 4, 15, 47, 4, -13, -28, -29, 17, -73, -6, -4, 6, -25, 5, 59, -6, 0, -26, 32, -42, -19, 21, 43, 27, 47, -11, -24, -66, -10, -93, -12, 12, -21, -50, 2, 14, -3, 11, 5, -22, 72, 74, -3, 12, -16, 41, 20, -21, 18, 35, -31, 68, -23, -43, 7, 8, -76, 6, -21, -36, -11, +45, -23, -33, 10, -26, 49, -127, 17, 16, 41, 71, 22, -27, 69, 63, -35, 36, 14, -37, -27, -56, 35, 23, 32, 48, -61, 55, -1, 14, -52, -10, 2, -20, -3, -6, -33, 5, -39, 16, -49, -8, 21, -10, 68, -24, 44, 53, -24, -22, 24, -3, 2, -18, -15, 20, 40, -21, -62, -16, -5, 72, 37, 10, 49, -49, -66, -75, -63, 2, 25, -13, -99, -22, 76, 11, 76, -59, -15, -32, -8, -4, +12, 12, -57, -19, -40, 49, 6, -43, -1, -6, 18, -27, -41, 11, 44, -28, 52, -35, 5, -40, 10, 37, 16, 22, 13, 41, 8, -18, -4, 24, -24, -21, 55, -22, 6, 71, -14, 53, -27, 22, -52, 17, -13, 2, -6, -15, 14, 47, -16, -37, -7, 8, 72, -108, -32, -5, -20, 46, 35, -21, 20, -65, -10, 27, -32, -63, 23, -18, -43, 6, -25, 25, 19, 27, -4, -6, 127, 1, 21, -50, 35, +-2, -7, -4, -3, -35, 18, 59, 7, -15, -62, 45, 89, 15, 4, -29, -30, -50, 98, 9, 14, 46, -37, -13, -37, -44, -56, -32, 17, 7, -25, -58, 35, -61, -36, -41, -17, 46, -27, -80, 1, 69, -24, 6, 1, 0, -30, 14, -57, 21, -8, -14, -24, 18, 39, -23, 74, 0, -26, -115, 27, -27, 1, -38, -2, -23, -31, 4, 8, 90, 7, 14, -5, -39, 41, -1, 6, -9, 3, -44, 51, -4, +35, -66, -14, 1, 20, -5, -34, 23, 6, 8, -7, 3, 63, 32, 23, -24, 8, 20, 26, 0, -14, 5, 23, 53, 4, 30, -6, 20, -18, -31, 17, -20, 16, 5, -18, -2, 63, -20, 14, 29, 7, 23, 7, -20, 11, 40, 8, -14, 11, 53, 31, 16, 7, -24, -6, -12, 16, 9, -30, -24, 7, 13, -21, 18, -9, -62, -28, 65, -20, -28, 41, -17, 11, -45, -15, 66, 1, -73, -8, 2, -55, +-40, 27, -15, -12, -24, -52, -32, 3, 3, 54, -38, 13, -59, 56, -13, 14, -66, -53, -38, 14, -13, -81, -74, 18, 32, -34, -47, -6, -24, -3, 1, 5, 9, 19, 50, -8, -44, 17, -46, 11, -15, 23, -78, 76, -5, -25, 3, 13, -23, 3, -10, -20, -20, 53, -44, -37, 7, 11, -69, 46, 2, -48, -20, 36, 36, 54, -40, -21, -33, 3, 28, 0, -4, -77, 38, 6, 9, 13, 3, -2, -4, +-20, -20, 3, 28, -29, 28, 36, 22, -15, -35, 0, 15, -24, -7, 20, 2, -8, 40, -35, -38, -13, -50, -26, -6, 8, 2, -107, -10, -6, -13, -57, 26, -12, 0, 1, -8, 62, 9, 45, -4, -5, 3, 18, 7, -19, -3, -7, 8, 10, 22, -43, 31, 5, -29, -46, -19, -9, -16, -6, -3, -22, 7, 24, 38, 77, 35, -12, -43, -31, 7, -58, 55, -65, 77, -23, -41, 13, -25, 23, 35, -19, +73, 6, -11, -103, 12, -73, 67, -64, -1, 24, 31, -7, -77, 11, -35, 6, -15, 17, -22, -7, 35, -42, 25, -4, 68, 10, -16, -62, -12, -6, 7, 10, 69, -10, 68, -6, -19, 7, 40, 8, 22, -17, 21, -36, 9, -2, 25, 20, -18, -7, 11, 28, 2, -3, 21, -4, 37, 18, -70, -31, 1, -12, -22, 6, 23, 17, 26, -11, -52, -10, 70, -49, -22, 5, -1, 1, -55, 29, -11, 39, 27, +-15, -112, -17, -68, -5, -24, -8, 64, 36, 24, -64, 38, -40, 56, 20, -39, -56, -8, -97, 62, -74, 14, 22, -67, -27, -6, -14, -6, -12, 7, -13, -1, -9, -29, -74, 24, 9, 33, 7, 40, -6, -44, -8, -3, -31, 10, 30, 9, 0, -19, -53, 34, 18, -18, -8, 29, 18, -29, -20, 19, 7, 7, -4, -27, -10, 6, 7, 0, 0, 13, -8, -18, 0, -5, 28, 24, -19, 3, -7, -83, 9, +-17, -7, 0, -28, 2, 13, 7, 21, 36, 4, 8, 23, 13, -7, 33, -40, -33, 23, -5, -51, 31, -48, -2, 3, 48, -31, -9, 46, 1, -3, 23, -88, -10, 7, -7, 3, 10, 23, -37, -14, 11, 64, 3, 36, 5, -52, -25, 20, -23, 13, 11, -25, 18, 12, -89, 19, -12, 60, -49, -30, 25, -17, 59, 24, 82, -15, -21, -15, 36, 79, 24, 61, 17, 8, 29, -2, -3, 54, -20, -18, -8, +-18, -9, -3, 14, -19, 7, 28, 26, -28, -5, -9, 15, -8, -38, 19, 16, -49, -3, -61, 33, 18, -2, -76, -27, 7, -55, -14, 41, -5, 25, -6, 13, -14, 9, 21, 0, -7, 55, 5, 23, -45, -36, -2, -8, -9, 15, -62, 15, -21, -9, -48, 17, -20, -8, -16, -1, -23, 6, 21, -11, 13, 20, -1, 2, -28, 10, -8, -4, -4, -27, -4, -55, -26, 7, -48, 22, -5, 5, 11, -3, -25, +-20, 19, 54, -4, -16, 0, 29, 20, 1, 7, 13, 43, -18, -23, 8, 20, 17, 16, 60, 13, -28, -32, -48, 18, 5, -15, 51, 33, -13, 14, -16, 14, 16, -71, 46, 8, -75, 2, 57, -26, -39, 17, 18, -8, 52, -41, -16, 16, 12, 22, -22, -42, -7, 18, -8, -7, 23, -33, 4, -5, 26, 4, -71, -13, -34, -12, 38, -12, 10, -38, -34, -23, -18, -5, 5, -20, -25, 22, -33, 6, 0, +1, -6, 12, -34, -127, -31, 5, 4, 2, -3, -1, 14, 5, -24, -26, -1, -6, 38, -2, 16, 1, 19, -49, 69, -7, -38, 38, -29, 0, 21, 23, 66, 15, -1, 28, 49, -27, -53, 112, -1, 55, -11, -7, -12, 19, 7, 22, 13, -58, 64, -27, -21, -4, 10, 30, -8, -84, 38, 3, 39, 32, -24, -52, -9, 2, 14, 24, 25, 6, 36, -103, 53, 30, 31, 16, 55, -40, -75, 68, 10, -90, +-3, -14, -24, -3, -16, 51, -9, 10, -27, -13, -4, 38, 44, -32, 127, 67, -10, 48, -2, -26, -19, 5, 45, -16, 13, 6, 66, -19, -12, -14, -73, 34, -55, -34, 65, -33, 1, -28, -7, 6, -44, -8, -49, 11, -71, -24, -19, -16, -39, 38, -40, 9, -34, 27, 15, 32, -127, 33, 9, 44, 13, 68, -57, -61, 2, 30, -23, -5, -29, 30, 43, 17, -37, 15, -27, -16, -2, -9, 11, -42, 30, +37, 0, 45, 13, -5, 20, -15, -11, 25, -82, -6, 2, 29, 27, 48, -19, 34, 2, -11, 7, -15, -20, -53, -20, -9, -40, -20, 8, 33, 25, 56, -65, 21, 9, 45, -24, 22, 0, 17, -93, -2, -116, 2, -19, 45, -10, -15, -27, 44, 83, 18, 32, 12, -1, -13, 15, 127, -11, -40, -4, 38, 44, 22, -113, 20, -20, 0, -7, 16, 28, 12, -41, 17, -17, -25, -17, 17, 14, -54, -52, -7, +37, -51, -15, 19, 3, -13, 3, -1, 5, 15, 11, 1, 21, 2, -1, -2, -6, -2, -15, 5, -12, 1, 25, -7, -14, -20, 1, 31, 4, -1, -25, -10, 12, -14, 8, -4, -13, 39, -3, 26, -3, 1, -25, 24, -20, 92, -34, -6, 27, 22, 23, 17, -13, -12, -26, -17, -88, 10, 10, -12, 4, -32, -15, 22, 34, 4, -6, 37, -23, -38, -82, 6, -17, 17, -127, -17, 30, 44, 12, -17, 74, +20, 21, -3, -15, 45, 21, 20, 4, -28, -21, -8, -5, -21, -39, -12, 54, 68, 83, -16, 10, -36, -24, -28, -49, 26, 16, 3, -50, -17, 11, -19, -3, -34, -13, 30, 14, 7, -65, 19, -29, -14, -11, 17, 21, -31, 16, -31, 31, -65, 36, 36, 2, 3, 7, 2, -11, 5, -1, -2, 21, -10, -29, 92, -19, -16, -1, 25, -13, -13, 31, -2, -5, -11, 43, -40, 21, -34, 13, 9, -96, 6, +8, 22, 10, -11, 17, -20, -6, 46, -20, 24, 11, 44, -41, 45, -4, -10, 44, 31, -25, 8, 6, 35, -6, -14, -18, 45, -25, -26, -25, 25, -32, -33, 15, -9, -1, -41, 1, 42, 12, 75, -10, -22, 0, 51, -31, -8, -9, -76, -8, 65, -56, 7, -50, 55, -73, -44, 47, 48, -56, -29, 10, -42, 17, 54, -5, -28, 16, 40, -26, -118, 33, -14, -13, 11, 17, 3, -84, -60, -32, 14, 6, +11, -26, -10, 11, 33, -52, -40, 83, -15, -62, -16, 11, -8, -7, -21, -40, 26, -8, -13, -50, 27, -2, 35, -5, 12, 8, -3, 28, 61, -13, 25, 3, -7, 10, 16, -22, 21, 13, 16, 10, -21, -3, 49, -3, -4, 17, 35, 18, 7, 10, -54, 6, -50, 21, 0, 18, 41, 8, -28, -26, 50, 33, -28, -66, 1, -51, -12, -14, 65, -6, -58, 4, -7, -24, 46, -5, -27, -20, -75, -36, -122, +9, 10, -88, 31, -1, -39, -14, 9, 4, -30, 9, 89, 20, 10, 23, 21, 29, 25, -83, 19, -80, -80, -64, -23, 6, 13, -21, 57, -41, -5, -34, -29, -8, -24, 36, -14, -39, -7, 37, -18, -2, -17, 18, -3, 9, -60, -19, 44, -29, 6, -28, -25, 33, -43, -29, -6, 11, 21, -47, 20, 72, -9, 93, 24, 29, -54, 22, 72, 56, -12, -2, -108, 28, -87, -60, 36, 19, 14, 29, -27, 30, +6, -1, 11, -35, 18, 6, -39, -1, -9, 17, -45, -45, 4, -9, 47, 18, 49, -8, -3, -22, 16, 8, -32, 31, 15, 51, 11, -27, 22, -3, 17, 0, -29, 15, -27, -25, 23, 7, 13, 7, 36, -30, 4, 7, 28, 13, 18, -14, -11, 30, 36, -81, 56, -67, -96, -36, -27, 66, -4, 91, -36, -60, 0, 23, -45, -11, -25, -1, 19, -37, 2, -11, 79, 7, 15, 14, -57, 6, -4, 1, 35, +-10, -24, -35, -16, 23, 5, 9, 10, -26, 63, 53, -63, -4, 7, -40, 40, -33, 3, -44, -17, -30, -5, 24, 19, -19, 5, 48, -22, 23, 2, 12, 7, -10, 7, -17, -10, 1, -14, 14, 18, 16, 21, 5, -2, -16, -3, 7, -4, -6, 16, -7, -18, 8, -7, -9, 19, -9, 16, -7, -6, -5, 10, 17, -4, 53, 5, -19, -2, -52, -21, 10, 38, 1, -36, 32, -22, -27, 50, 4, -59, -50, +46, -61, 6, -39, 31, 8, 12, 19, -11, -18, 1, -5, -4, -10, 30, -33, -29, 12, 23, -15, 21, 39, -69, 46, 47, 1, -44, 30, 1, 23, -28, 9, -33, 16, -103, 10, -29, 12, 54, -26, 104, -12, -22, 17, 20, -39, 5, 17, 33, 55, 52, 4, 20, -47, -7, 3, 0, -16, 17, -18, 18, -51, 1, -39, 43, 43, -40, 3, -2, 10, 10, -23, -20, -55, 48, 0, 6, 13, -2, 27, 10, +11, 12, -12, 62, 19, -27, 46, -18, -1, 27, 11, -12, -37, 34, 22, 3, -29, -33, -35, 1, 4, 38, 15, -3, -43, 11, 5, 2, 35, -27, -11, 12, -30, 14, 12, -87, -28, -14, -22, 29, -12, -2, 36, 11, 12, 2, 15, 32, 31, -26, -21, -19, 12, -30, -22, -21, 8, -3, 9, -4, -17, -27, 27, 68, -62, 76, -23, 15, -30, 26, 2, -25, 17, 11, 19, 38, -3, -24, -3, 4, -21, +6, 25, -12, 18, -8, -23, 42, 13, 6, -37, -23, -30, -37, -25, -9, 5, 44, 10, -10, -13, -32, 34, 28, -65, -41, 19, 16, -20, 27, -72, 21, -20, -55, 10, -53, -4, 75, 60, -6, 57, 13, -3, -64, -18, -20, -9, -1, 27, -12, -18, -2, -52, 36, 15, -25, 4, 6, -4, 1, 24, 28, -28, -18, -8, -63, 4, -9, 8, -1, 16, -2, 47, 43, -20, -17, -4, -7, 20, 32, -38, -37, +-16, -31, -45, -18, 85, -21, 38, 42, -41, -43, 20, -42, 17, 14, 24, -23, 0, -3, 33, -4, -36, 34, -24, -58, -19, 27, -47, 16, -21, -14, 75, 22, -74, -38, -10, -62, 42, -10, 30, 95, 2, -16, 72, -10, -44, 15, -74, -33, 10, -4, -1, 32, -44, -21, 22, 0, -85, -25, 3, -2, 13, -4, -21, 9, 28, 0, 41, 0, -34, -54, -48, -8, -39, -25, -40, -61, 65, -19, -25, -21, 0, +45, -72, -28, -39, 10, 9, -11, 10, -28, -9, 4, 36, -14, -76, 78, -19, 19, 15, -37, 10, 39, 52, 22, 19, -94, -7, 6, -8, -51, 58, -34, 0, 43, -41, -17, 35, 33, 5, -86, -60, -19, -24, 2, -46, 13, 44, 17, -11, 32, 24, -30, -15, -9, -4, -9, -6, -127, -34, -23, 41, -52, -31, 16, 0, -44, 14, 12, 10, 1, 1, -8, -11, 13, 45, -82, 10, -15, -57, -22, 4, 80, +36, 29, -10, -23, 34, 16, -87, -89, 43, -60, -33, 112, 30, 5, 0, 60, 10, 97, 54, -127, 29, -90, 102, 0, -10, 8, 11, -32, 6, -2, -12, -82, 24, -56, -37, 17, 44, -1, 11, -105, 3, 57, 9, 61, -25, 6, 0, -65, 9, -8, 27, -32, 14, -9, -5, -35, 0, 3, 5, 2, 8, -3, -24, -1, 10, -8, -13, 1, -3, 1, -14, -52, -19, 9, 0, -20, -1, -4, 0, 2, -22, +-13, -1, -5, -3, -33, -9, 6, -2, -34, -3, 50, 22, 3, -11, 9, -14, -45, 52, 0, 30, 11, 4, -7, 4, -41, -4, -25, 33, -18, 0, -6, 13, 7, 16, -61, 8, -55, -10, -19, 24, 57, 34, -17, 24, 26, -34, 29, 51, 5, -39, -53, 54, -13, -25, -83, -81, -17, 5, -57, -40, 13, 0, -20, 27, 65, -28, 5, -2, -18, 68, 7, 22, -62, 11, 62, 34, 37, -8, 5, 0, 99, +6, -127, -8, -10, 34, -95, 12, -2, 15, -13, 33, -5, 0, -5, -16, -4, -14, -28, -6, 5, -31, 13, -14, 2, -20, -10, 41, -13, 14, 30, -35, -24, -33, 19, -31, -6, 38, -127, 18, -25, -23, -42, 29, -19, 0, 9, 5, -66, 18, 34, -7, 38, 8, 9, 24, -7, 45, -13, 41, 3, 20, -40, -8, 25, 19, -23, -15, 4, -11, -49, 11, -17, 20, -28, 6, -9, 0, -67, 53, 20, -21, +-61, 0, 9, 19, -44, 47, 2, -18, -36, -53, 36, 5, 69, -48, -102, 18, 12, -64, 8, 28, -65, 4, -65, -55, 11, -110, -54, 0, -41, -28, 16, -7, 26, 4, -16, 14, 0, -14, 53, 27, -31, 33, 41, 12, 27, 43, 49, -19, 58, -2, -23, 37, -73, -50, 31, -75, -25, 14, -32, 0, -58, -127, 4, 38, 19, -13, -31, -24, -39, -2, -4, 42, 32, 7, -15, 14, 34, 8, -25, 12, -25, +23, 1, 2, -42, -2, -19, -58, -2, -47, -2, 0, -34, -26, 6, -22, -6, 4, 39, -4, 1, -36, -37, -31, 31, 37, 44, 11, -21, -18, 27, 70, -28, -30, -33, 34, 56, -14, 26, -7, 24, 127, -38, 0, -22, -52, 2, 36, 12, -26, 38, -64, -42, 6, 22, -6, 8, -12, 36, -6, 23, -15, -82, 1, 8, -14, 41, -21, -89, 9, 66, 19, -33, -27, 7, 0, 18, -59, 1, -16, -50, 27, +-127, -5, -53, -41, -27, -23, 97, -99, 15, -19, -16, 77, -25, -33, -8, 44, -14, -10, 4, -23, -3, 39, -10, -33, -14, 30, -23, -44, 25, 15, -15, -9, -30, 9, -18, -52, -10, -18, -8, -24, -33, 19, -49, 52, 33, 23, -25, -30, 9, 12, -27, -14, 8, 7, -20, 16, -34, -3, -4, -31, -46, 25, -30, -36, -83, -28, -70, 16, -16, -2, -39, -29, -25, -36, 37, -21, 16, 3, 16, 18, -2, +24, 1, 4, -26, -32, 7, 52, 10, 30, -22, 57, -24, 18, -40, -34, -1, -48, -5, 49, -18, -1, -40, 23, 0, -49, 64, -44, -5, -62, 27, -13, 43, -7, 45, 5, 47, 4, 54, -31, 9, -57, -74, -15, -36, 26, 5, 47, 66, 17, 86, 19, 11, -50, -31, -26, 40, 55, -19, 11, 56, 7, -7, 24, 0, -8, -10, -44, -45, 18, 15, 19, 4, -24, -23, -11, -3, 27, -1, 3, -49, 67, +7, -1, -28, 10, -12, 16, 15, 8, 8, -1, -4, 9, 4, -25, -6, 0, -7, -4, 5, 16, -1, 23, 10, -19, -2, -17, -39, 2, -1, -14, -18, 4, -14, -8, -40, 23, 35, -15, 32, 31, 42, 7, 58, -49, 4, 16, 12, -23, 62, -16, -3, -3, 14, -2, 11, 47, 12, -12, -15, 47, -25, 7, -1, 18, 18, 2, 39, -24, 2, 2, -24, 4, 90, -11, 25, 8, -5, -51, 29, 34, -5, +-1, -29, 12, -58, 18, -52, -62, 8, -88, 9, 37, 17, -1, 38, -3, 17, -42, 7, 47, 7, 38, -49, 12, -24, 22, -9, 9, 3, 28, -6, -3, -1, 35, 13, -2, 5, -12, -10, -11, -47, -11, -8, 9, 7, -17, -12, 7, -17, 29, 59, -21, -39, -58, -10, -26, 17, -13, 4, 23, -1, -20, 8, 15, 7, 2, -12, -24, 7, 42, 26, 41, -7, -35, -30, -17, -22, -15, 23, -12, 17, 15, +-21, -24, -2, 0, -9, -19, 11, -31, 8, 48, 8, -127, 22, -20, 1, -33, -4, 20, 40, -1, -2, 14, -13, 24, -18, -10, 6, 59, 0, -21, -23, 33, 0, -16, -23, -14, 21, 37, 8, -4, -11, 51, 6, 3, 35, -2, -16, -57, 21, -19, 48, -39, -53, 16, -8, -8, -6, 56, -18, 35, 12, -19, -17, -61, 5, 88, 6, 43, 52, 9, 73, 73, -72, -35, 9, -31, -34, 31, -27, 24, -7, +34, -53, -21, -36, 54, -80, 26, 16, 9, -2, -13, -19, 26, -11, -48, -5, 36, 23, 1, -4, -20, 68, -19, 27, 19, 4, 17, 3, 54, -11, -19, 43, -20, 10, -3, 19, -21, 26, -15, 0, 14, -2, 6, -34, -15, 7, 9, 12, 7, 17, -65, -14, 52, -2, -43, -59, -67, -1, -32, 3, -20, 38, -10, -24, -6, 39, -66, -75, -31, -45, 12, -16, -54, -14, -7, 48, 11, -47, 32, -34, 10, +2, -31, 35, -19, 30, -91, 70, 30, 9, 10, 5, 14, 11, 9, -43, 45, -18, 41, 16, -105, 10, 15, -26, -20, 17, 4, 21, -41, 14, -9, -26, -5, -9, -54, -34, 57, -15, 5, 34, -5, -37, -17, 3, -26, 48, 19, -19, 12, 2, 4, 10, -9, 9, 24, 25, -9, -54, -87, 10, 33, 21, 53, -30, -1, -107, -83, 32, -26, 1, -47, -74, -76, 27, 23, 47, 10, 42, -34, 39, 7, 69, +2, 26, 1, 17, -23, 19, 41, 13, 28, -40, 16, 12, 20, 7, -21, -63, 0, 27, -32, 5, -19, -13, -56, -4, -1, 26, 75, -14, 45, 19, 38, -6, 17, -32, 16, -2, -34, -6, -25, 34, -26, 23, -34, 16, 44, 22, -32, -28, -73, -52, 36, 48, -9, 10, -47, 78, -40, 33, -87, -10, -13, -4, -13, -24, 56, -7, -20, -72, 18, -97, -26, 40, 7, 21, -4, 63, -6, 26, -21, -94, -10, +44, -15, -46, -28, -25, -17, -31, -24, 4, -7, -6, 25, -17, -23, 11, -44, 33, 15, -19, 7, -71, 49, -48, 49, 21, -2, 39, -4, 8, -16, -39, -13, -8, 17, 10, 8, -8, -9, 3, 10, -22, -1, 14, 17, 4, -12, 6, 14, 12, 8, 15, 6, 14, -10, 11, 11, -5, 14, 19, 10, -30, 13, -10, 72, -19, -49, 36, -4, 7, 27, -5, -7, 7, 2, -23, -40, -12, -25, -14, 21, -7, +26, -127, -18, -26, -48, 2, -17, -5, -13, 11, 21, 66, 8, -120, 68, 66, 50, -19, -2, -2, -120, -45, -6, 18, 38, 32, -18, 16, 82, 31, 61, 2, 25, -26, 50, 7, 18, 72, -9, -1, -7, 63, 18, -36, -34, -6, 11, -35, 18, 92, 43, -21, -33, -22, -19, 73, -53, -47, 17, 32, -28, -2, 8, -7, -26, -35, 8, -19, 17, -17, 14, 2, -27, 5, 4, 5, -100, -47, 6, -52, 20, +23, 62, 5, -37, 37, 7, 25, 18, 38, -28, 21, -25, -11, 13, -18, 7, -8, -7, -7, -20, -14, 17, -9, -4, 60, 12, -36, -36, -34, 16, 8, -47, -40, -16, -16, -62, 9, -20, 7, -2, 22, -33, 34, -36, 28, 56, 2, -35, 50, -6, 13, -12, 11, -64, -8, 32, 44, 31, -26, -48, -77, -28, -59, -72, 43, -2, 22, -67, -34, 29, 20, -22, 51, -36, -18, -18, 11, 97, 4, -22, -31, +3, 9, 62, 39, 14, 4, -10, 58, 38, -15, -33, -33, -47, 21, -27, 19, -6, 22, -48, 16, -25, -59, 18, 30, 24, -19, -28, 48, 26, 50, -16, 8, 21, -4, 2, 2, -10, -5, 26, 46, -12, -5, -20, -65, 16, -9, -33, 0, -3, -11, -56, -22, -38, -2, 9, 22, -5, -17, -1, 7, -6, -13, 23, 14, -1, -22, 13, 16, 5, -4, 10, 14, 20, -34, -14, -6, -1, 51, -83, 25, 72, +15, -10, -5, 13, -26, -6, -18, -54, -87, -26, 25, -24, 75, -60, -7, -23, -26, -22, 77, 17, -28, -41, 6, 43, 30, -40, -39, -38, -31, -37, 13, 23, -45, -86, -1, 10, -74, 26, 31, 52, -55, -74, 2, 57, -1, -21, 29, -25, 63, -25, 48, -17, 6, 51, 90, 6, -76, -1, 27, 13, 4, -100, 50, -10, -32, -7, -46, -3, -35, 32, -20, 10, 31, -30, 85, -13, 41, 58, 28, 81, 25, +26, -13, 67, 45, -31, -1, -31, 58, 94, -48, -72, -19, -8, -18, -3, -17, 24, -59, -19, -36, -25, -38, 14, -6, 29, -88, 17, -24, -59, -33, -19, -94, -60, -33, 57, 2, 25, 39, -22, -20, 18, -9, 3, 51, 22, -12, 11, 12, 46, 12, -12, -32, -31, 2, -20, -9, 16, 56, -1, 0, -37, -51, -14, 25, -37, -31, 23, -3, 10, 6, 3, -21, 36, -6, -56, -34, 58, -45, 65, -36, -12, +-39, -60, 65, -92, 46, 59, 40, 2, 26, -4, 12, -41, -77, 6, -100, -56, 13, -49, 17, -29, -55, -43, -53, -35, -14, -48, 38, 40, -23, 35, -22, 30, -13, -1, -19, 29, -21, -1, 36, -26, -83, 9, 34, 34, -11, -23, -64, 58, -15, 27, 13, -19, 12, -12, 12, 14, 127, 5, 28, 9, 13, 3, 14, -22, 12, -7, -14, 15, -38, 12, 0, -30, 5, -8, -9, 3, 11, -2, -14, -21, -1, +2, -13, -15, 11, -10, -49, 8, 23, -14, 36, -5, -11, -55, 1, -15, -19, 15, -30, 5, -1, -30, -14, -8, -11, -10, -1, -19, 21, 35, 65, 0, 40, 51, 25, 23, 23, 1, 43, -3, -24, -13, -36, 108, 20, 25, -8, -1, -38, -11, 27, -23, 16, 19, 10, 26, 9, 24, 13, -16, -43, -36, -110, -54, -96, -7, 32, -9, -21, 21, 13, -28, 19, -7, -21, 14, 5, -8, 16, -36, -8, -7, +-52, -3, -18, 17, 1, -35, 4, -5, 24, -49, -59, -43, -80, 10, -7, -4, 1, -10, 25, -4, 0, 24, 20, 9, 27, -14, 0, -16, -18, 35, 17, -8, -18, -34, -9, 4, 14, 9, -2, 1, -4, 13, 39, 2, -42, -7, 60, 7, -26, -59, -44, -51, -19, 48, -54, -12, 3, 9, -43, -5, -22, 11, 60, -12, -35, -49, -47, -23, -6, -16, -19, 0, 14, -51, 28, -44, -54, 10, 0, 7, -28, +19, 42, -13, -12, -66, -55, -12, -10, -33, -19, -8, -36, 47, -31, -35, -8, -13, -22, 62, -1, -21, 73, 4, 35, 18, 73, -22, -8, 36, 4, -5, -17, 12, 98, 8, -23, 51, -7, -23, 41, 6, -28, 41, -31, -3, -70, -27, 27, 21, 28, 11, 12, 50, -95, 1, -26, 56, 16, 26, -56, 77, 23, 39, 61, 23, 79, 3, -37, 23, 14, -39, -20, 29, 19, -10, 12, 17, 12, -29, -24, 37, +-1, -11, -4, -49, -5, 3, 21, 7, -32, -11, -37, -17, 15, -19, 6, 1, 60, -8, -1, 94, -7, -95, 16, 72, 29, 74, -76, -12, -32, 46, 73, -3, 67, 19, -11, -81, 68, 4, 36, 6, -24, 85, -55, 21, 1, -10, -42, 66, -28, 4, -43, -19, -59, -31, 22, 26, -118, 8, 6, 32, -51, -29, 52, -31, 39, -43, 17, -7, 83, -22, -9, 28, -39, 19, -92, 72, 15, -41, -7, 21, 53, +38, -54, -2, -18, 47, 39, -24, 11, 10, -31, -33, -6, 3, 14, 12, 22, -46, -34, -15, 0, 89, 18, 14, -48, 47, -3, -49, -28, -28, -15, -29, -16, -18, -54, 42, -51, 4, -101, 0, 50, 31, 37, -40, 50, -22, 19, 22, -11, -19, 3, -15, 4, -46, -18, 42, 14, -57, 21, -116, 15, 13, 34, 10, 13, -10, -37, 12, -35, 16, -38, 4, 36, 9, 47, -29, -19, 4, 4, 40, 6, 9, +13, -17, 16, 19, 25, 4, 17, 54, -18, -49, 27, 8, 42, -17, -26, -16, -12, -70, 45, 38, 52, 8, 34, 38, 8, 36, 20, -91, -30, -54, -39, 69, -22, -21, -12, -27, -80, -3, -15, -17, -47, -122, -5, 7, 6, -18, 87, -26, -1, -53, -21, 4, 21, -22, -12, -6, -24, -14, -66, -44, 36, -11, 25, 35, -26, -4, 42, -80, 3, 24, -2, -11, 6, 11, 49, -6, -17, 20, 40, 8, -8, +13, 30, 2, -6, -6, 18, 3, 12, -2, 9, -9, 4, -5, -17, 0, -12, -2, 13, -19, 5, -12, 5, 5, -7, 0, 4, -6, 8, -4, 7, 26, 5, 14, -1, 9, -13, -4, -23, 16, -40, -32, -3, -23, -9, -1, 42, 26, -41, 21, 37, 3, -15, 1, -24, 21, 10, -26, 23, 14, -17, 36, -52, 53, -26, -6, 6, 16, 56, 5, 37, 35, 103, 13, 31, -17, -10, -80, -18, 7, -20, -26, +13, 43, 48, -39, -57, -1, 34, 59, 38, -10, -18, 57, -9, -33, 17, -16, 19, 0, 2, 1, -26, 25, 21, -32, -30, 15, -19, -45, 21, 23, -7, -17, 10, 5, 9, -25, -30, 8, 90, 7, -36, 21, 2, 7, -12, 18, 2, 23, 25, 17, -41, -4, -15, -1, 50, -16, 27, -23, 19, -8, 58, -9, -100, 19, 3, 41, -37, -8, 11, 4, -23, 1, -100, 15, -24, 9, 30, 6, -12, 6, -61, +2, -16, 2, -7, -36, -18, -37, 33, -9, -28, -54, 18, -18, 6, 30, -20, -18, -15, -18, 54, 7, 35, 24, -31, -6, -46, -6, 9, 13, -51, 3, 113, -70, -64, 21, 30, 33, -21, 20, 6, -60, -48, -16, 71, 13, 17, -62, -9, 127, -18, 37, 13, -5, 27, -100, -27, -7, -29, 19, -8, 58, 5, -6, -34, -27, -25, -30, -18, -28, 11, -43, 8, -35, 25, -32, -68, -32, -97, 12, -6, -42, +-14, -48, 6, 12, -12, -16, 28, -23, -17, -5, -33, 5, -10, 5, -13, -13, -9, 6, -3, 0, 39, 5, -20, -6, 18, -5, 28, 3, 18, 4, -2, -26, -7, 9, -10, -57, 15, -3, 17, 10, -12, 19, 4, 21, 6, 19, -68, -21, 5, -17, -44, 33, 18, 93, -17, -40, 22, 33, 18, -63, 2, -83, -7, 29, 16, -21, -23, -40, -6, -15, 65, 46, -1, 56, 6, -20, -3, -43, 55, 49, -48, +-5, -1, 14, -37, 43, -19, 21, -27, 74, 14, -37, 55, 11, -18, 52, -24, -24, 37, -6, -12, 36, -40, -26, -33, 17, 30, 22, -63, 28, 27, -48, -12, -13, -50, 0, -12, 17, 16, -32, 16, 37, 58, 0, -23, 7, 25, -12, 15, 52, -7, -16, 8, 47, -26, 21, -24, 16, 62, -1, 19, -26, -25, -8, -4, 28, 1, 10, -20, 17, 30, 24, 11, 17, -32, -7, -26, 15, -22, 41, 12, -2, +-66, -4, 11, 26, 3, -24, 25, -79, -60, -48, 24, 26, 22, 12, 39, -13, 28, 26, -19, -27, -32, -59, 6, -34, 2, -127, 3, 26, -43, -4, -29, 67, 22, -23, -8, 18, -20, 0, 70, -4, 8, -10, -86, 54, 34, 10, 42, 25, -10, 59, -19, 21, -18, -92, -35, -28, 93, -19, -72, -7, -2, 22, -63, -27, -1, 8, -21, 105, 36, -46, -33, 23, -63, -20, 26, 17, 0, -11, 6, 10, -13, +-6, -13, 10, 0, -1, 4, 0, 21, -15, 21, 11, -9, -18, -3, 3, 21, -2, -14, 9, -1, -4, 41, -7, -8, -15, -12, 57, 36, 11, 2, 22, -26, 5, -3, -19, 39, -16, 3, 32, 44, 9, -109, 48, -14, 65, 12, 43, 7, -11, -15, -43, -27, 30, -5, -36, -26, -1, -16, 36, 24, -64, -1, 8, 4, -28, 28, -17, -1, 34, -29, -13, -4, -18, -28, 32, 3, -49, -19, 66, -80, 37, +5, 34, -35, -5, -37, -7, 76, -60, -43, 9, -15, 41, 10, -18, -25, 10, -21, -17, 31, -20, 10, 39, -66, -31, -46, 18, -9, -20, -2, 1, 56, 15, 33, -17, -21, 27, -40, -28, -8, -33, 14, 28, -41, 16, 36, -43, -9, -30, -70, 15, 19, -10, 41, -31, -8, -31, 21, 20, 38, -35, 50, 20, -56, 49, -10, 61, 31, 22, -26, 8, -31, -80, 53, -13, -4, 0, 39, 36, 24, 35, 23, +36, 11, -35, -9, 46, -89, 59, 37, 10, 13, -17, -2, 67, 12, -47, -24, 69, 65, -22, -17, -6, 27, -9, 3, 14, -30, 17, -8, -29, -67, -20, -20, -17, 55, -56, 11, -66, -20, 35, 57, 6, -24, 2, -7, 24, 70, 28, 9, 41, -28, -15, 35, 8, 26, 50, -40, 0, -27, 0, 16, -38, 31, 10, 40, 42, 70, 47, -62, -46, -50, 21, -11, 5, 11, 52, 49, -67, -35, -57, -44, 23, +-58, 12, -53, -3, 14, -1, -20, -2, -10, -16, -29, -44, 22, -39, -19, 12, -12, 5, 7, -58, -39, 17, 50, -8, 35, -12, 1, 56, -16, -13, -108, 65, 4, -17, -41, 11, 44, 1, -7, 34, -68, -54, -8, -8, -18, -23, 29, -20, -15, -35, 3, -20, -40, -13, -11, 22, 10, -14, 27, -7, -17, 18, -48, 10, 44, 10, -19, 77, 7, -16, 103, 65, -28, 5, -66, -6, -3, 14, -6, 28, 81, +-4, 8, -18, -44, 22, -86, 29, 24, 6, 54, -33, 14, -28, 22, 22, 24, -71, -12, 2, -12, -32, -23, -14, -9, 10, -24, 7, -10, 15, -8, -28, 24, -20, -37, -31, 19, 30, -76, 8, 46, -24, -31, -3, -17, -27, -21, 7, -6, -5, -50, -6, -88, 16, -13, -40, 39, 31, -5, 4, -64, -39, 8, -24, 72, -3, 8, -31, 17, 3, 0, 33, -15, -44, -19, -22, -24, 12, -33, -10, -33, 20, +11, 11, -6, -20, 6, -83, 30, 29, -21, -16, -23, -4, 28, 28, 27, 11, 22, -34, 23, 12, 1, 6, -7, -52, -40, -36, -77, -21, -36, 19, 8, 19, -71, -2, -6, -14, 42, 21, -51, -17, 18, -78, -29, -63, -62, 24, -25, 77, 28, 0, -28, -5, -3, 54, 22, -84, -32, 53, -41, -19, -51, -14, 49, -10, -85, 64, -21, 30, 60, 45, -81, -94, -17, -22, -10, 28, 34, 96, 37, 9, -46, +-35, 37, 0, -14, -83, -2, -43, -65, -86, 35, 38, 54, 33, 32, 58, 9, -86, 44, -8, -21, 6, 11, -23, -2, -1, -11, 6, -24, 14, 6, -7, 37, 13, -5, -13, 6, 12, 3, -36, 12, 27, 3, 0, 9, 15, -1, -3, 17, -17, -14, 7, -21, -19, -29, -28, -6, -4, -42, -41, 17, 20, 21, 32, 74, 14, -25, -40, 39, -25, 29, -11, -8, -12, -60, 18, 30, 7, 16, -18, -25, 36, +13, -36, -56, -66, 8, 3, 13, 27, -35, 4, -65, 21, 21, 9, -8, 32, 17, 7, 11, 4, -34, -73, -63, -1, 86, -4, 48, -25, 34, 23, -24, 17, 28, -3, -19, -12, 19, -48, -26, -10, -16, -22, -21, 2, -75, -11, -12, -9, 9, 16, 24, 31, -24, -46, 15, 40, -13, 29, -20, -16, 16, -6, 17, 22, 23, -3, 1, -108, -43, 48, 9, 0, -90, -73, 21, -10, 7, 62, -12, 28, -25, +39, 13, -63, -20, 81, -12, 30, 39, -127, 2, -40, 47, -2, -10, 39, 33, -3, -25, -20, 71, 41, -21, -18, 5, 3, 40, 11, 19, -6, -22, 23, 31, 42, 25, -27, -5, 38, -127, 37, 3, 0, 57, 29, 28, -16, 16, 15, -3, 14, 15, -99, -7, -34, 13, -3, 24, 10, -14, 72, -6, 35, 36, -11, -25, 13, 31, -38, -1, -42, -45, -66, -68, -62, 6, 0, -21, 37, -53, -15, 11, 4, +0, -41, -24, -5, -46, 33, 34, 37, 38, 24, -16, 43, -12, -14, -41, -5, 4, 11, -4, -89, -18, 8, -12, 35, 26, -4, 39, 10, 35, 7, 33, -9, -14, -68, 66, 31, 3, -3, 6, -40, -19, 61, 27, -15, -50, -42, -30, -8, -14, 11, 3, -80, -33, -52, -44, -36, 7, 40, 26, -3, 27, 29, 6, 54, 33, -114, 1, 42, 12, -40, -40, 12, -15, 18, 39, 35, 3, -41, 24, 16, 17, +6, -4, -39, 18, -19, -52, 21, -12, -15, 57, 35, -12, 44, -4, -20, 3, 20, -4, -11, -25, -11, 10, -7, 21, -17, -41, -1, 10, -5, -22, -12, 9, -27, 28, -63, -21, -32, 2, 33, -13, 36, -35, 22, -71, -25, -12, 12, 15, 14, -34, -35, -4, 5, 8, -5, 12, 65, -20, -3, 18, 12, 11, 14, 37, -31, 12, -68, -19, -74, 55, 7, 1, 58, 1, 1, -16, 30, -33, -29, 6, -44, +33, 14, -31, -45, 1, 29, 21, -41, 31, -1, 44, 4, -25, 1, 0, -61, -9, 28, 13, -25, -50, 21, 8, -53, -4, -11, 12, -5, -34, 36, 22, -20, 19, 30, 50, -28, -103, -16, -21, 48, -24, 26, 23, 28, -37, 100, 6, -35, -35, 27, -1, -3, 6, -5, -12, -52, 5, -15, 13, 26, -16, 16, -14, -28, -30, -45, -94, 2, -76, 10, -41, 56, -6, -41, -91, -27, 13, -17, -77, -8, 16, +21, 52, 3, 22, -16, 82, -45, -49, -34, -4, -2, 24, -3, 53, 83, 90, 11, 45, -15, 52, -25, 91, 1, 44, -24, -82, 108, -17, -10, -14, -23, -47, -68, -38, -25, -89, 7, 29, 34, 37, 15, 114, -100, 81, 19, -21, 7, 0, 17, -12, 4, 16, 13, 8, 7, -4, -15, 3, -14, 1, 8, -2, 0, -2, 6, -26, 11, 20, 0, -22, 3, 9, 11, 8, 20, -21, 34, 17, 15, -16, 43, +-80, 64, -5, 0, 54, 40, -47, -3, -59, -6, -11, 1, 21, -8, -47, 24, 30, 38, 39, -14, 11, 8, -4, 51, -38, 14, 50, 19, 15, 0, 28, 39, 42, -54, -3, 1, -32, 11, 9, -42, 43, -2, 20, -18, 16, -31, 36, 13, -4, -35, 13, 19, 15, -35, 17, 17, -33, -9, -52, 7, -44, -33, -25, -17, 26, -27, 38, -20, 16, 24, -18, 62, -8, 28, -26, -6, -47, 36, -1, -40, -1, +-20, -19, -18, -31, -8, 18, -5, -28, -51, 69, -34, -3, 35, 44, 46, -6, 23, -88, -35, -43, 23, -52, 18, 10, 5, 7, -51, -12, -8, 67, 33, 20, -11, -6, 18, 25, 45, -10, 49, -22, -15, 37, -20, -44, 36, -74, 3, -46, -14, 8, 36, 34, -27, 11, -30, -18, 62, -23, 23, 12, -16, -3, -28, -40, -44, -30, 33, -46, -65, 8, 83, -17, 31, -1, 32, 40, 78, 3, 28, -20, -40, +-32, -51, 43, 24, 50, 54, 15, -18, -15, -10, -2, -12, -33, -42, -38, 2, 45, -14, -22, 47, 62, 0, 34, -5, -14, -53, -18, 43, -47, 33, -25, 36, 54, 0, -47, 19, 52, -10, -6, 6, -2, 5, 31, 67, 1, -51, 29, -50, 2, 14, -22, -98, 10, -79, -35, 28, -51, -2, 5, 40, 11, 12, 45, 8, -53, -13, -15, 29, -96, -15, 3, -46, -3, 16, 34, 46, -37, -24, -68, 8, -24, +20, -11, -17, 1, 5, 17, 20, 7, 46, -11, 18, -6, -6, 23, 24, 47, 0, 4, 1, 49, 3, -30, 7, 11, -50, 5, 15, -35, -8, -4, 24, 26, 14, 4, 6, 12, 27, -8, -13, 19, 19, -27, 19, 30, 72, 27, -13, 9, 0, -27, 20, -43, 56, -26, -29, 1, -13, -106, 35, 21, -6, -8, 8, -23, 19, -22, -9, 11, 7, 25, -3, -37, 40, -24, -16, -30, 2, 34, -15, 3, 43, +21, 38, -15, 36, 7, 42, -38, -31, -35, -32, 2, -3, 3, 9, -16, 30, -45, -23, 19, -55, 5, 11, 9, -5, -44, -2, -10, 6, 23, -43, -19, 40, -30, -8, 39, 9, -21, 14, -80, -12, -37, 23, -11, 48, 18, 0, 48, -61, -30, 39, 0, 1, 12, 17, 23, 6, -68, 12, -35, 29, -1, -32, -23, 27, 20, 22, 33, 16, -9, -23, -65, 30, -6, -3, -29, 18, -16, 0, 3, 7, -4, +7, 24, 3, -16, -2, 96, 1, -15, -13, -34, -39, 45, 31, 43, 26, 34, -5, 37, -123, -14, -31, -94, -32, 14, -31, 79, 33, -3, 0, 60, -26, -40, -19, 1, -8, 57, -26, 48, -36, 30, -31, -64, -77, 13, -28, 65, -9, 17, -15, -11, -2, 4, -31, -65, -65, -74, -15, -44, -3, 0, 0, 57, 45, -23, -64, -43, 28, 33, 13, 76, 35, -7, 2, 10, -10, 28, 11, 17, 23, -19, 6, +-16, -30, -1, -4, -127, -3, -29, -4, 1, -17, -14, 0, -8, -14, -2, -4, 0, -4, 8, -12, 6, -20, 8, -9, -4, 14, 40, -12, -38, 0, 87, -26, 3, 33, -2, 17, -127, -25, -52, 36, -50, 25, 34, 0, -41, 24, 22, 13, -28, 8, 49, -25, -50, -7, -10, 42, 5, 17, 22, -3, 2, 8, -16, 7, 22, 74, 6, 8, -127, -23, 22, -5, 19, 31, -42, 0, -13, 70, -20, 87, 16, +2, -67, -29, -11, -34, -1, -14, -11, -22, -15, 27, -22, -1, -26, -6, -19, 5, 0, 9, -33, 12, -53, 31, -10, -10, -29, 0, -51, 53, -62, -22, -12, 11, 43, -3, 13, -14, -97, 8, 16, 10, -11, 3, -9, 16, -18, 2, -40, -15, 18, -2, -9, -79, -3, 19, -47, -42, 14, 0, -5, 102, -25, -1, 39, 8, 32, -17, 29, 18, 45, -52, -2, -28, -22, -34, 6, -23, 29, -28, 14, -14, +18, -23, -96, -7, -9, 23, -34, 22, 1, 0, 17, -14, 19, 45, -27, 25, -46, -62, 94, 33, -25, 12, 19, -24, 0, -9, 4, -27, -18, -6, -1, 17, 30, 34, -48, -23, -62, -60, 31, -59, -12, 0, -46, 5, 35, -40, -9, 16, -65, 53, -25, -18, 46, 13, -41, -73, 3, -3, -7, -15, 10, 7, -22, 14, 1, 23, -101, -64, -33, -31, 48, 8, 4, 0, 12, -36, -39, -3, 7, 7, -38, +-16, 6, -4, -67, 37, 14, 24, 2, -25, -6, 15, -7, 4, -14, -18, 17, 45, -127, -31, -30, -28, -45, -16, -7, 0, -32, 49, 11, -15, -76, 1, 20, 14, 15, -15, 28, -52, -18, 17, 5, 5, -25, 29, -26, -5, 70, 15, -1, 4, -88, -44, -10, -22, -17, -52, 13, 0, 0, 14, 23, 7, 16, 12, -45, -25, -54, -15, -12, 16, -28, -33, -15, 16, -13, 10, 28, -21, -13, -4, -19, 7, +-25, 26, 20, 1, -27, 9, 25, 0, 31, -14, -1, 83, -84, -11, -16, -16, -55, 5, -53, -15, -18, -11, 18, -12, -42, -14, -21, -23, 38, -16, 2, 83, -80, 18, -5, 9, 106, 14, 18, 0, 9, 13, -18, 10, -76, -8, -34, -12, -53, -6, 18, 7, -4, 31, -10, 39, -10, -40, 37, 79, -20, -5, 16, 41, -23, 51, 33, -33, -16, -9, 6, -17, -36, 27, -45, 38, -17, 34, -12, 26, -6, +-10, 37, -18, 12, 1, 83, -3, -26, -76, -17, -21, 10, -125, -4, -6, 13, 28, -5, -43, 39, 25, -2, -6, -32, 0, 15, -10, 50, -24, -9, 29, 23, 9, -44, -63, -26, -21, -1, -12, 6, 72, -52, -13, 23, -78, 11, 3, -13, 0, -46, -80, 76, 41, 45, -103, 32, -9, -29, -28, 31, -5, -22, 45, -86, 31, 23, -44, -4, 21, 64, -74, -15, -102, -21, 26, -34, -1, 29, 43, -25, -33, +45, -13, 20, -10, 50, 46, 57, 86, -98, 29, -70, 31, 31, 30, -127, -1, 14, 1, -32, -6, -3, -17, -13, -15, -9, -13, -8, -53, 1, -8, 15, -9, -5, -19, -21, -7, -108, 2, 2, -16, -13, 3, -21, -9, 4, -9, -37, -55, -52, -10, -19, 6, -19, -4, 48, 66, -29, 42, 2, 33, 7, -4, 43, 21, 70, 8, -26, -34, -36, 46, 4, 23, -60, 14, 3, -9, 25, 46, -45, -14, 6, +59, -9, 83, -41, -21, -85, -74, -12, 25, 14, -31, -12, -14, 31, 33, -10, -32, -67, 11, -3, 11, 0, -8, -11, -5, 8, 48, -14, -54, 24, -15, 16, 17, 32, -7, 38, -15, -16, -57, 4, -25, 15, -11, -6, 18, -24, -1, 24, -17, 17, -31, 16, 30, -45, 35, -9, 41, 3, -32, -3, -26, -8, -19, -7, -42, 20, -21, 35, 2, 15, 28, -11, 1, -9, 13, 10, 9, -71, 48, 108, 66, +77, -27, -29, -13, -31, 6, -17, -50, 4, -63, -40, 20, -15, 18, 43, 48, 14, -18, 31, 38, -13, 2, -82, -35, 17, -100, -1, -50, -38, 75, 16, -18, -45, 1, -127, 16, -24, 35, 1, 33, 21, -25, -19, -82, -23, -30, 3, -17, 57, 18, 15, -6, -61, 25, 16, 23, -5, -10, 20, 27, -36, 4, 29, -14, 15, -16, -62, 52, -9, 8, -10, -16, -43, 26, -47, -1, -47, 21, 51, 83, -60, +-21, 61, 29, -16, 71, -8, -30, 6, -5, -13, 18, 45, 66, 50, -20, -27, -56, 8, 57, -11, 15, -35, 20, -21, 17, -16, 30, -44, -18, 43, 57, 20, -40, -51, 21, -32, 37, 19, -10, -9, -7, 40, -43, -18, 34, 59, 33, 55, -65, 13, -20, -35, 33, -29, 55, -76, -14, -58, 52, 40, -77, 28, -48, -1, -40, 16, -8, 12, 9, -37, -9, -14, 2, -13, 22, 13, -19, -4, -12, 32, 7, +25, 8, -37, 18, 26, -9, -29, -8, 5, 30, -10, -40, -17, -42, 23, -40, 81, -21, -12, 0, 24, -30, 15, -45, -18, 7, -12, -8, -25, -1, 27, -29, -25, -12, 34, -26, -127, 6, -35, -35, -54, 26, -56, 13, 8, -19, 5, 27, -44, 26, 11, 36, 0, -30, 12, -33, -2, -41, -27, -29, 73, 10, -39, 68, 7, 64, -15, 18, -127, 7, 0, -7, 6, -29, 35, -19, -3, -47, -39, 2, -10, +-35, 20, 26, -7, -44, 23, 9, 3, 48, -16, 14, -24, -35, -22, -40, -60, -15, 9, 10, -37, -9, 0, 5, 35, -3, 41, 5, -1, -19, -120, 49, 15, 15, 0, 43, -17, -38, 41, 15, 1, -13, -73, 5, -28, -33, -2, 13, 56, 16, 39, 9, -54, 8, -26, 2, 11, 0, 45, 18, -29, -49, -70, 43, -10, -25, -5, 20, -7, -63, -62, -76, 37, -27, -47, 46, 57, -18, 35, -19, -23, -29, +-26, 27, 42, 47, -12, -16, -11, 11, 28, 16, 54, -2, -82, 5, 20, 16, -9, 50, 1, -9, -16, 9, -33, 64, -60, -107, -8, -64, 11, 33, 74, -43, -107, -16, -92, 76, -16, -30, 49, -23, 98, 14, -7, -15, -18, 11, 5, 12, 13, -7, 7, -32, -24, 18, 6, -5, 10, -3, -1, 8, 7, -10, -12, -14, 2, 37, -2, 9, 11, -6, -3, 26, 27, 45, -33, 62, -97, -48, -23, 48, 2, +24, 22, -125, 30, -14, 3, 18, -65, 32, 25, -66, 61, 35, 13, -37, -25, 16, 8, -41, 64, -58, -9, 45, 64, -6, 5, 34, -81, 67, 7, -31, 11, 62, -58, -17, 4, -91, 19, 31, -24, -17, 9, -36, -5, -25, 47, -37, -6, 22, -69, -66, -54, -7, -15, -46, 62, -17, 108, 13, -44, -28, -22, -44, 15, 28, 9, -40, -40, -42, 28, 39, 22, -20, -8, 20, 37, -31, 56, -13, 10, 40, +-2, -12, 52, -61, 10, -9, 48, -13, -57, 24, -10, -30, 32, -11, -15, -18, -21, -75, 95, -46, 14, -20, 8, -7, 69, 37, -17, -4, -83, -65, 51, -11, -10, -18, 55, -10, 6, -22, 13, 11, 46, -6, 32, -37, 40, 40, -29, -20, -50, -40, 2, -17, -7, -54, 48, -53, -18, 0, -36, -55, 5, 33, 12, -24, 68, -26, 18, -10, 26, 14, 27, 3, 0, -35, -127, -16, 10, -72, 41, -10, -2, +-58, -21, -12, -9, -73, -12, -18, -36, -75, -18, -12, -36, -13, -18, -31, 40, 11, 40, 9, -8, 43, 54, 5, -4, -9, -19, -69, 16, -3, -39, 14, 41, -2, 2, 22, 6, 3, -48, 10, 61, -19, -3, 74, -38, -9, 19, -2, -51, -55, 0, -14, 17, -1, 74, 1, 66, -26, -57, -2, -30, 9, -37, 30, -5, -24, 0, 13, -10, -9, -25, 7, -31, 68, -23, 29, -17, -24, -33, -34, 38, -10, +80, 46, -13, 49, 58, 7, -12, 9, -52, -49, -11, -26, 37, -16, 4, 3, -5, 37, 127, -5, -7, -28, 29, -24, -8, -25, -57, 19, 14, 0, 28, -38, 27, 7, 54, -23, 17, 8, 11, -39, -64, 39, 31, -7, -20, -1, -15, -94, -20, -18, -3, 39, 63, 0, 30, -37, 35, 2, -69, -7, 39, 2, 29, 31, 5, -12, -23, 17, 40, -5, -37, -15, -28, 25, -8, -20, 58, -47, -33, 16, 38, +-4, -36, -2, -27, 12, -7, -32, 17, -22, 69, -16, -25, 5, -36, -48, 21, -35, 10, 40, 36, -17, 1, -43, -58, -53, -21, -29, 41, 13, 8, -38, 25, -10, 1, 4, 16, 29, 18, -1, -53, 5, 25, 17, -7, 3, -49, 71, 11, -3, -19, 38, 32, -5, -4, 7, 10, 3, 25, 23, 15, 18, -23, 22, 56, 19, -24, 15, -7, 25, -3, 26, 39, 3, -2, 16, -47, 15, -87, 18, -24, -6, +0, 25, -91, -19, 33, -59, 51, -39, -66, 31, -100, 34, -23, 78, -94, 2, 26, -15, 40, 48, 13, -61, -49, -6, 13, -49, 9, 10, -66, -15, -38, -16, 55, -33, 43, 126, 32, 29, 98, -5, -45, -33, -91, 32, -19, -34, -81, -14, -15, 85, 25, 14, 41, 11, 73, 49, -4, -42, 51, -43, -75, -81, -77, 30, -70, -15, -20, -40, 0, 20, -21, 3, 3, 41, 5, 20, -7, 27, 5, 6, -15, +6, -2, 7, 9, 1, 19, -4, 7, 23, 16, 18, -119, 34, -23, -7, -24, 15, 12, 16, 26, 66, -12, -20, 81, -1, -113, -22, -6, -15, -14, 20, 35, -15, 88, -22, -12, -72, 1, 6, -18, 38, -66, 55, -107, -14, -6, -55, -29, 19, 22, 79, -37, 13, -26, -22, -33, 85, -21, -5, -12, -35, -10, 3, -20, 4, 11, 41, 74, 30, 10, 33, -17, 12, 27, 1, -86, 30, 43, -60, 56, -39, +-11, 18, -38, -31, -43, -36, 16, 12, -80, -5, 65, -32, -7, -6, -7, 33, 22, -43, 15, -27, -33, 2, -30, -31, 40, -81, -65, 8, -8, -19, -21, 23, -44, 43, 10, -38, 15, -11, -89, 30, 20, -12, -21, -27, 32, -30, 30, 45, -20, -75, -13, -20, 21, 9, 11, -5, -14, -29, 18, 29, -18, 85, -30, 32, -11, -20, -26, 10, 4, -5, -27, 31, -24, 11, 4, -33, -27, 5, -34, -50, -30, +36, 0, 20, -3, 22, 54, -69, 89, 43, -76, 58, -39, 34, -54, -17, -3, -43, -38, 23, -41, 7, -39, -34, 5, -5, -8, 7, 50, -14, 50, -16, -6, 23, -29, -19, -12, 26, 15, 0, -23, 20, -33, 20, 60, 52, 50, 26, 46, -11, 1, 15, 9, 4, -51, 18, 12, 22, -74, -114, -4, 17, -45, -38, -29, 1, -24, -33, 42, 26, 8, -22, 5, 25, -77, -18, 9, -7, 8, 40, 1, 5, +-62, 17, -34, -27, 7, 33, -53, -25, -23, -19, 12, -18, -15, -34, 10, -52, 41, 8, -5, 10, 5, -32, -29, -27, -111, 43, -8, -12, -69, -20, -56, -20, -39, 25, 11, -4, 31, -28, 10, 31, -40, 22, -34, -17, -33, -26, -10, 4, -10, -32, 15, -5, 18, -6, -6, -27, -51, -8, -27, -35, -3, -32, -51, -34, 16, -11, 58, -29, -91, -24, -22, -9, 6, 11, 17, -30, -17, 4, 31, 31, 28, +23, 67, 8, -12, 30, 12, 12, 4, 74, -8, -14, -73, 24, -14, 14, -26, 2, 6, 14, -28, 41, -13, 18, 13, 40, -66, -15, 23, -23, 16, 2, 9, 25, 15, 31, 9, 41, 33, -15, -63, -50, 14, 43, -54, 24, -16, 2, 20, 3, 52, 7, 9, 22, -12, 25, -14, 36, -120, 14, 23, -18, 1, -15, -127, 5, 26, 66, -4, -90, 58, 54, 26, -96, -37, -3, -3, -11, 16, 59, -24, 21, +27, -34, -18, -29, 14, -31, -66, 28, 8, -24, -23, -55, -15, -6, -1, -24, -20, -73, -10, -45, -3, -127, -75, 15, -31, -2, 2, 9, -3, 22, 38, 32, 14, -36, -16, -5, -49, 49, 34, -43, 46, -4, 11, 25, -39, -36, 1, -38, -2, 16, 13, -35, 15, -1, 2, 48, -31, -54, -32, 70, 2, 17, -25, 61, -9, 61, -62, -15, 33, -24, -16, -17, 17, -17, -19, -6, -56, 70, -36, -25, 54, +-34, -76, 46, -37, -37, -25, -89, -34, -22, -5, 13, -96, 9, -11, -15, 10, 12, -24, -13, -24, -5, -30, -10, 1, -4, -4, -39, -2, -13, 12, 5, -6, 20, 0, -9, -6, -6, 17, -9, -16, 34, -4, 12, 21, 52, 12, 40, 65, 26, -31, -49, 61, -37, 29, -10, 32, -11, -14, -12, 60, -43, 6, 47, -57, 42, 29, -62, -5, 29, -52, -23, -25, -3, 71, 87, 62, 38, 33, -12, 65, -8, +47, -30, -1, 62, 64, -74, -12, 9, -39, -54, -33, -79, -30, -45, 89, 17, -40, -99, 59, 6, -86, 5, 16, 23, 11, -20, -66, -37, -8, 15, -24, 24, -29, 17, -33, 12, 77, -5, -19, 5, -11, -17, -23, -52, -68, 12, -1, -40, 5, -16, 43, -56, 112, -24, 3, 23, -127, 26, -72, -13, -18, 40, 14, -13, -8, -19, 19, -28, 72, -78, 59, -64, -24, 17, 5, -48, 31, -7, 40, 34, -62, +-54, -12, -11, 2, -47, 91, 28, 23, 21, 15, -25, 22, -63, -24, 28, -62, -53, 7, -21, 43, 6, 14, 20, 40, -1, -4, -85, 36, -4, -5, -5, -1, 7, -30, 94, -58, -48, 63, 37, -43, -14, -11, 12, -21, 44, 2, 24, 20, 4, 26, -12, -13, -51, -33, -31, 2, -22, 71, -30, 3, -23, -43, -82, 23, -48, 13, 78, -15, 28, 52, -7, 11, 17, -62, 72, -12, -63, -127, -2, -41, -19, +-10, -9, 53, 49, -38, -48, -71, -11, -77, 20, -32, -5, 4, 56, -7, -15, 93, -38, 24, -11, 14, -28, -50, 24, 91, -110, -10, -25, 26, 41, 41, 36, -72, 31, -18, 9, -7, 20, 18, 44, 7, 2, 8, -42, 46, -15, -11, -13, 25, 59, 12, -41, -13, -26, 0, -25, -12, 59, -12, 16, 13, -15, -17, -6, 16, 1, -18, 37, 22, 18, 21, 4, 10, -44, -21, 8, -8, 5, -58, -42, -5, +-17, 2, -26, -12, 4, -28, -30, 26, -4, 8, 34, 54, 68, -42, 9, 68, 18, 41, -10, 14, -3, -4, -15, 12, -6, -32, -19, 7, 63, -10, -22, -54, 6, -35, -63, -22, 84, 2, -16, -19, 16, -13, -19, 38, 7, 52, 19, -21, 21, -40, -2, 7, 4, 26, 39, -19, -20, -16, -14, 36, -33, -3, -58, -13, 44, -29, 24, -29, 1, -27, 15, -12, -67, 4, -20, -26, 1, 1, -1, -11, 24, +-15, 9, -15, -29, -12, 10, 26, 14, 20, 2, -20, -22, 33, -21, 30, 18, 3, -1, -23, 9, -7, -11, 4, 10, 23, 13, -31, -20, 40, 28, 40, 2, -10, 14, 20, -15, 1, -21, 15, -68, -11, -4, 15, 6, -66, -4, 59, -11, -72, 36, 7, 1, -1, 2, -36, 33, -27, 37, 5, -14, 6, -11, -48, -5, -6, 24, 3, 31, -9, -29, -79, -19, -37, -11, 27, -37, 6, -36, -12, -9, -80, +56, -7, -58, -19, 30, 37, -36, -66, 13, -10, -79, 11, -9, -29, -23, -5, 28, -14, 2, -3, -7, 15, -40, -17, 17, 9, 28, -31, -11, -63, 25, -39, 42, -40, 14, 17, -18, -4, 23, 7, 12, 28, 35, 19, -21, -62, -42, -33, -40, 32, -26, -13, -47, -26, -7, -26, 13, 13, 33, -13, -5, 38, -15, 1, 21, -44, 12, 28, 24, -15, 34, 20, -43, 73, -10, 7, -39, -3, -23, -40, 34, +15, -84, 2, 0, 8, 28, 54, 18, 42, -94, 29, 19, 33, -45, 1, 17, -9, 26, 21, -64, 6, -4, -57, -107, -69, -13, 72, -29, 23, 14, -51, 45, -5, -11, -35, -31, 1, -18, -1, -4, 4, 63, -6, 13, 64, 31, -6, 11, 51, -49, 30, -67, 52, -39, 1, -2, 1, -18, 12, 19, 22, -13, -17, -8, 30, 35, -4, -9, 28, -9, -6, -18, 32, 20, 9, 53, -25, -3, 6, 77, 29, +6, -47, -9, -52, -21, 0, 40, 14, -41, 7, -41, 0, 0, -4, 1, -29, 42, 39, 10, -26, -33, -25, 5, -12, 15, -3, -16, 58, 5, 10, 23, 20, 5, -12, -5, 37, -31, 5, 25, 24, 19, 23, -48, -21, -38, -7, 24, 17, 21, -6, 2, 3, -16, 33, 7, -22, -31, 3, 11, -36, -2, -15, -14, 10, -8, 20, -7, 50, 36, -18, 15, -13, -26, 20, -28, -5, -9, 22, -17, 25, 12, +-22, -44, -22, 32, -99, 4, 4, 22, -24, 33, 27, 17, -45, -3, -27, 31, -27, -29, -65, -26, 7, 26, 15, 15, 14, -4, -47, 10, -33, 26, 8, -24, 28, 22, 11, -26, -4, -2, -2, 4, 8, 4, 26, -17, -7, -13, 41, 25, -14, -12, -2, 26, -32, 25, -8, 7, 1, 2, -37, 6, -11, 9, 2, -78, -16, 0, -3, 4, 17, -3, 7, 17, 11, 21, -45, -1, -6, 20, -9, 12, -2, +4, -5, -12, 6, 18, 38, 24, 33, 2, -19, 9, -4, -32, 37, -35, -6, 56, -32, -19, 0, 44, 34, -19, 52, -20, 36, -24, 110, 2, 9, 4, -88, 33, 32, 4, 2, 11, -5, 11, 12, -4, 6, -5, -4, -5, 6, 14, 115, 10, 14, -2, 2, -2, 3, -18, 112, 11, -5, 9, 3, 6, 2, 9, -11, 5, -2, 16, 47, 36, 5, 19, -24, 5, -50, -2, 3, -20, 8, 2, -46, 20, +24, 10, -12, 16, 9, 57, -38, -89, -30, -16, 20, 55, 21, 35, 14, 29, 32, 13, -11, 9, -25, -32, -10, -69, -10, 15, -60, -13, 11, 0, 14, -11, 11, -37, 15, 19, -6, -15, -15, 20, -12, -10, 1, 27, 34, -6, 31, -19, -6, 14, 23, -13, 28, -5, 7, -19, 27, 8, 8, 30, 24, -43, -22, 8, 18, 7, 8, -26, -27, -10, -20, 40, 14, 32, 1, -12, -5, -7, 9, 15, -22, +-27, -27, 6, -11, 8, -44, -59, -11, 15, -21, 12, -29, 9, -25, 44, 127, -6, 13, 3, 11, -32, -81, 21, -13, 34, -15, -15, -13, -34, -103, -36, 19, 6, -24, -19, 8, -11, -6, 18, 8, 31, -39, -18, 42, 14, -26, -48, -2, 1, 26, -34, 30, -49, 4, 13, 31, -18, 7, -71, 57, 36, -52, 12, -12, -18, -39, -44, -2, 44, 3, -16, 22, -18, 33, 8, 27, -18, 3, 20, -2, 6, +29, -11, -7, 4, -43, -3, 62, -5, -8, -69, -1, -5, -42, -8, 28, 20, 24, -38, -22, 32, -24, 48, 71, 22, 8, 16, 66, 4, 6, 7, -1, 6, 34, -34, 23, 37, -22, 17, 44, 4, 40, 6, -44, 75, -38, -79, -41, 7, 13, -39, -48, -76, -32, 18, -43, 26, -61, -47, -7, -10, 24, -3, 35, -1, 33, 12, 23, -67, -52, 54, -44, -11, 30, -75, -67, -45, 30, 49, -51, 11, -6, +-18, -51, -9, -10, -32, 2, -14, 40, 8, -16, -29, 28, 27, 12, -1, -2, -28, -19, -6, -31, -38, 12, -6, -13, -12, -57, 51, 37, 25, 36, 6, 3, -38, -44, 29, -7, -16, 17, 23, -38, -51, -1, -13, -75, -11, 17, -3, 2, -25, -25, -58, -16, 32, -20, 17, 13, -4, 25, -39, 16, -17, 14, -22, 0, -44, 7, -2, -2, -16, -8, 18, -24, -8, -33, 27, -12, -1, -38, 9, 15, -56, +-34, -35, -8, -35, -4, 16, 8, -4, -3, -20, 22, -3, 24, -1, -18, -30, 48, -107, 1, -26, -55, -6, 0, 22, -46, 18, 0, -17, 30, -8, -3, -4, 20, -72, -48, -32, 75, 1, -24, 7, -27, 9, -17, -21, 2, 15, 6, -25, -34, 9, -4, 17, -17, 5, 7, -10, -78, -1, 43, -23, 7, 6, 22, 23, 10, -47, -56, -7, -20, 19, -37, 4, -28, -36, 3, -4, 24, -16, 19, -25, -19, +16, -2, -4, 29, -20, 3, 18, -24, 23, 127, 7, -33, -29, -1, 9, 0, -49, -16, -58, -5, -54, -7, -5, -52, -74, -24, 16, -7, 39, -1, -14, 4, 11, 28, -56, -96, 5, -54, 77, 2, -9, -33, -6, -33, -22, 68, -42, -5, -7, -45, -5, 56, -11, -3, -36, -66, -49, 6, 64, -15, 0, -7, -8, 0, -14, -18, 2, -9, -10, 9, 5, -4, -2, -1, -6, -6, 127, 4, -12, 1, -14, +6, -15, 10, 21, -13, -6, -3, -13, 9, 0, 8, 61, -27, -32, -9, -21, -17, 1, 19, -23, -17, 26, 28, -7, 8, -22, -6, -60, 17, -8, -6, -43, -13, 43, 15, 33, 31, 13, -15, -70, 30, 10, 6, 8, -56, 11, 20, 32, 20, -7, -20, -28, 1, -47, 47, -8, 12, -4, 24, 1, -20, 14, 21, 26, 6, -3, 0, 9, -35, -16, -5, 35, 15, -67, -7, -9, 1, -5, -5, 1, -5, +-20, -9, 12, -12, -33, -6, 9, -13, -16, 9, 15, -1, -16, 38, 8, -59, -6, -13, 18, 18, -2, 27, 27, 12, -7, 7, -31, 24, -13, 31, -104, 14, 0, 75, -36, -19, 32, 42, 29, -25, -14, -63, -39, -7, 9, 9, 9, 9, 42, -25, 43, -19, -29, 16, -26, 42, -26, 1, 33, -5, 61, -4, -2, -46, -16, 4, 24, -44, -114, -26, 20, -4, 7, 5, 14, -45, 23, -32, 90, 1, 25, +3, 21, -29, -6, -43, -44, 24, -25, 13, 56, -37, -25, 56, -56, -22, 17, 4, 15, 36, 54, 18, -8, -3, 3, 7, 68, 29, -13, -14, 32, 71, -1, 31, 15, 21, 23, -37, -37, 60, -19, -98, -6, -48, 18, 1, 6, -10, -27, 43, -66, -45, -34, 28, 1, 20, -1, -5, -45, -44, 31, 29, 78, -122, -20, 9, 51, -74, 106, 4, -14, 67, 60, 29, 19, -50, -76, -9, -12, 4, -6, 22, +13, 5, 1, -109, -17, -50, 9, 2, 34, -21, 38, 53, 35, 21, -23, -25, 14, 61, 48, -87, -36, -9, 43, -13, -9, -2, 16, -46, 13, -49, -39, -8, 36, -7, 27, -12, 17, -5, 15, 4, 29, 11, 16, 1, -1, 11, 12, -1, 22, -41, 33, 1, 16, 22, 2, -54, 6, 33, 28, 1, 22, 55, -29, -7, -62, -30, -25, -20, 35, 28, -2, 9, 8, 3, -28, 1, 126, 10, -9, 0, -6, +7, -19, 15, -28, 7, 54, -8, 31, -3, 16, 32, 29, 2, 9, 37, 28, 15, -17, 9, 4, 11, -14, 2, -23, 17, 22, -5, -27, -7, -1, -48, -7, 36, -41, 28, 22, 19, -7, -38, 16, 15, -11, 23, 27, 7, 51, -4, 1, 37, 51, -40, -46, 30, -13, -1, 15, 38, -45, -12, 70, 3, -27, -11, -21, -22, 47, -23, -7, 1, -72, -14, -6, 24, -3, -19, -51, -27, -13, 3, -127, -46, +15, 33, -28, -1, -10, -5, 2, -19, -15, -9, 88, -22, 16, 2, -1, -8, -8, 25, 29, -11, 24, 0, -29, 20, -17, 3, -3, -61, -24, 0, 84, -1, 35, 10, 12, 24, -14, 3, 7, 28, 36, 7, -47, -8, -14, -11, 0, 2, 4, -4, 19, 11, -47, 8, -28, -82, -50, -58, 60, -92, 33, 18, 48, -58, -28, 4, -8, 2, 93, 16, 39, 30, -4, -3, -50, -47, -28, -54, 43, 21, 14, +52, 26, 13, -10, -87, -6, 5, -1, 10, -10, 16, -6, 12, 35, 6, 9, -18, 8, 8, 3, 3, -7, 3, -1, -6, -17, -20, -23, 6, 8, 6, 5, 12, -22, 1, 2, -17, -18, 21, -9, -6, 8, 100, -48, -24, -127, -7, 62, 49, 29, -4, -16, 7, -12, 47, 0, 0, -86, 10, -27, -11, 19, 2, 20, 37, 55, 4, -45, -31, 6, 32, -25, -51, -5, 27, 28, 1, -22, -24, 13, 34, +-7, 6, 6, -96, -11, 10, -44, 19, -36, -16, 0, 8, -3, -13, -22, 15, 6, 4, -9, -1, -28, -8, 13, -19, 12, -25, 59, 38, 30, 68, 13, 12, 9, -11, 39, 10, -25, -42, -66, -24, -21, -17, 0, -7, -19, -15, -19, 41, 3, -27, 22, -26, 39, 11, 58, 14, 34, -28, 0, -18, 58, -22, -2, -7, 63, 19, 25, -95, 36, -47, 4, -7, -21, 34, 0, -91, 68, -31, 95, -26, 9, +35, -31, -55, 25, 25, 29, 19, -63, -7, 3, -30, -7, -40, 10, -7, -7, -4, -12, -127, -29, 38, 18, -10, -53, -58, 0, -22, 115, 46, 19, 3, -1, 59, 2, 50, -15, -34, -32, -33, 1, 18, -21, -44, -10, -38, -11, 90, -127, -29, 9, -88, 34, 4, -9, -11, 0, 4, 0, 13, 64, 34, 8, 23, -9, -51, -23, 12, -5, -28, 1, 13, -4, 65, 23, 14, 9, 8, -1, -37, 96, -13, +-12, 47, -20, 27, -32, -9, -127, -51, 0, -56, 84, 13, 97, -93, 13, -18, -15, -19, 32, 32, 30, 6, 7, 13, 32, -1, 0, -46, 49, 36, 24, 14, -21, -104, -63, -12, -2, -39, 23, 25, 0, -40, 61, 4, 24, 40, -1, -42, 36, -39, -26, 12, 4, -46, -10, -5, 19, -13, -88, -20, -44, -23, 1, -24, -10, -59, -11, 21, 18, 0, -34, -22, 0, 15, 24, -53, 12, 29, -1, 4, 29, +-12, 2, 11, 10, 2, -10, -14, 5, -23, -5, -54, 0, -15, 3, 31, 3, -127, 2, 29, -54, -13, -42, 27, 0, 32, 28, -4, 5, 5, 25, 0, 0, 3, 32, 32, -7, -32, 14, 26, 12, -14, -23, -21, -29, -9, 59, -2, 127, -67, -4, 6, 31, -78, -27, -14, 0, -25, -23, 40, -8, 14, 0, -33, -18, 50, -11, -10, 5, 4, -25, 11, -10, 58, 32, -8, -14, -3, -2, -15, 19, -123, +-2, 44, 11, -26, 12, 14, 0, 18, 6, -68, 10, 2, -6, -21, -7, -50, 10, 21, 10, 2, -14, 2, 17, 11, -19, 7, -20, -2, 0, 18, -16, -83, 30, -9, 23, -5, -14, 9, 0, -13, -40, 12, 18, -13, 16, 1, -8, -13, -16, 3, 4, -18, -11, 7, 14, -13, 18, -9, -7, 43, 55, 12, -18, -112, 9, -19, -27, 7, 32, -20, 0, -66, -53, -16, -4, 7, 10, -36, 22, 14, -3, +-52, -4, -40, -92, -22, 35, -98, 81, 7, 15, -39, 74, -18, 69, -86, -37, -44, 39, 22, 14, -11, 0, 48, 76, -33, 4, 58, -10, -35, 42, -44, 1, 6, 2, 4, -1, -3, -7, -7, 2, 15, 3, 1, -25, -2, -5, -9, 6, -27, -3, 12, -16, -11, 0, -7, 7, -7, 1, 1, -1, 11, 7, 4, -21, 22, -41, 10, -1, -20, -12, -91, -23, 2, -21, 23, 1, -17, -9, -83, -67, -52, +-68, 6, 41, -9, 0, 83, -19, -41, -11, 42, 6, -46, 37, -62, 30, -2, 4, -40, 38, -37, 3, 26, -21, 16, 27, 4, 9, -3, -5, -6, -7, 20, 2, -4, -1, -36, 83, 17, -35, -14, 11, -12, -19, -21, 2, -12, -16, -12, -28, 18, 36, -16, 9, -13, 16, -8, -12, 12, -10, -9, 1, -40, -31, -36, 1, -4, -7, 28, -8, -6, 45, 8, -28, -5, -9, -16, -8, 7, 65, -52, 5, +-51, -51, 24, -55, -10, 9, -98, 51, 21, -6, -38, 44, -50, -8, 25, -61, 0, 17, 23, -1, 0, -48, -76, 24, -68, -7, 72, -31, -27, -1, -4, 21, -14, -8, 18, -32, -10, 26, 59, -33, 2, -1, 15, -67, 3, 61, -22, -29, 3, -17, -3, -57, 17, -41, -94, 20, 17, -9, 88, 20, -14, -47, -12, -63, -41, 1, -25, -23, -41, 4, 13, 48, -5, 44, 20, 46, 31, 29, 22, 46, -16, +28, 27, 6, -8, 28, 44, -30, 9, -17, -35, 13, 16, -36, -50, -17, -15, -40, -82, -31, 45, -73, 12, 44, -46, 13, 26, -12, -42, 24, 0, -58, 10, 47, -110, -4, -17, -10, 5, -52, -13, -32, -3, 9, 1, 23, 24, -32, 1, 19, 10, 49, 1, 48, 73, 40, -21, -29, -15, -6, -86, 48, -17, -37, 12, -32, 1, 1, -77, 17, -9, 9, 8, -61, -49, 56, -25, -12, -34, -7, 10, 10, +-24, -17, 24, -27, -10, 17, -12, -6, 31, 34, 6, 7, -14, 7, 23, -7, -12, 8, -7, 40, -9, -22, 20, 7, 22, -1, 22, -12, -14, -22, 21, 8, -18, -4, 5, -24, -8, -6, 4, -28, -13, -7, 15, -4, -38, -43, -13, 30, 26, 15, -4, -19, -49, -7, -8, -5, -17, 24, -6, 33, -5, -12, 7, -8, 39, 30, 38, -44, 22, -36, -7, 25, -20, 20, 2, 25, 10, 15, 37, -41, -21, +8, -8, -23, 8, -5, -104, -13, -25, 53, 7, 29, -29, -89, 20, -4, 66, -5, 61, 60, -17, 0, 6, -18, -24, 33, -30, -39, -22, -20, 12, -22, -25, -25, 34, -47, 7, 22, 3, 55, 37, -21, -19, -30, -7, -37, 5, 21, -8, -1, -4, -17, -11, -3, 5, -28, 22, 49, -14, 39, -14, 23, -20, -16, 5, -1, -18, 67, -55, 17, -5, -3, -81, 2, 13, 20, 13, -22, -12, -4, -11, 11, +-34, -27, -43, 21, -14, -7, 2, 46, -8, 11, 23, 34, 31, 16, -17, 23, 0, 26, 7, 9, 0, 13, -5, -48, 11, 37, -23, -47, -32, 0, -21, 35, -49, 35, 35, -74, 20, -18, 45, 10, 40, 84, 36, -55, -19, 45, -1, 31, 11, -31, 20, 39, -94, -6, 24, -14, -20, -5, 8, -1, 0, -14, 14, -2, -4, 26, 14, -2, -3, 2, -14, -7, 4, 13, 1, -21, -4, 1, -4, -9, -8, +-4, 0, 2, -9, 14, -9, -4, 5, 22, -37, 51, -24, 7, 6, 18, 33, -2, -22, -29, 16, 28, 35, 93, -9, -51, 14, 30, 20, 3, -4, 46, -23, -62, 17, 22, 21, -9, -57, -12, -18, -8, 16, -47, 51, 11, 20, 6, 19, -20, 11, -47, -16, 9, 8, 20, -20, -9, 19, 44, 10, 2, 5, -12, 0, 13, -53, 1, 21, -28, 11, 25, 47, -26, 6, 41, -44, -12, -11, -2, -14, -1, +-33, 7, 8, 32, -18, 70, 31, -10, 0, 2, -9, 15, -33, 36, 52, -5, -31, 22, -36, -22, 33, -14, 42, 7, -71, 53, -13, 16, -44, 37, 1, 34, 4, -41, -18, 56, -11, -45, 12, -4, -22, -14, -16, -111, 20, 63, 49, 14, -9, 5, 31, 12, 2, -31, 52, -11, 11, 14, -117, -24, -4, -2, 8, 2, -6, -97, -23, -54, 29, 35, -24, -2, -20, -16, -1, 12, -53, -4, -3, 9, 63, +-3, -7, 38, -3, 12, 41, -25, -58, -84, -126, -31, 6, 21, -3, 29, -17, -102, 10, 18, 11, -43, -25, -39, 85, -11, 11, -17, 2, -21, -19, 11, 37, -18, 51, 7, -10, -29, 16, 20, 9, -56, -20, 46, -53, 1, 101, 20, -10, 20, -53, 63, 9, 45, 5, -67, 23, 50, -14, -123, 31, -7, -8, 4, -7, -25, -22, 33, 54, -25, -19, 30, 90, -59, -13, 127, -43, -28, 61, -9, 57, -108, +71, -66, 100, -25, 44, -56, 11, -78, -21, -46, 51, -77, 32, -11, -5, -20, 68, 18, 2, -26, 69, -28, 62, -39, -46, -31, 0, -40, 0, 81, 2, -127, 27, -17, 16, -39, 27, 9, 5, 35, 6, 17, 62, -25, 4, 6, 32, -1, -8, 13, 20, 48, 31, -9, 9, -75, -33, -24, -15, -90, 27, -39, -19, -20, -10, -24, -6, -7, -21, 25, -9, -24, 1, -1, 0, 35, -16, -7, 33, -8, 9, +6, 7, 3, 29, -10, -9, -7, -34, -31, 2, -35, 5, 34, 0, -56, 7, 6, -20, -13, -23, -16, 17, -46, -22, 21, 26, -29, -10, 53, -2, -30, 33, -25, -5, 46, 60, 19, -30, -48, -24, 0, -21, 1, -2, 36, 21, -52, 7, -61, 21, 29, -33, 4, 5, -3, 15, 66, -47, 3, -25, 17, 18, 36, -5, 5, 13, 8, 72, 16, -1, -19, -46, 37, 21, 14, -2, 23, -10, -11, 23, -11, +8, -21, -32, -17, 14, -16, 0, 17, -16, -14, -12, -13, -116, 14, -1, 31, 7, 7, 39, 7, 22, -12, -52, -13, -5, 19, -11, 34, 0, -55, -10, -5, -6, -2, 27, 8, -6, -8, 4, -42, -39, -60, -1, -14, -61, 7, -1, 20, 0, -25, 37, -13, 7, -64, -71, 19, 15, -19, 15, -41, 3, -92, -10, 37, -23, 64, 18, -10, 51, 29, 20, 16, 99, 35, 14, 32, -62, -64, -28, 44, 38, +-35, 93, 6, 4, 14, -3, 7, 0, -7, -5, 3, 11, 8, 11, -10, -2, 16, -12, 10, -7, -10, 3, 4, -24, -5, 0, 4, -20, 6, -24, -1, -4, 2, 2, -25, -17, -56, -69, -8, -10, -24, 0, 15, -26, -15, 29, -39, -19, -17, 41, 31, 42, 18, -25, -3, 46, -6, -5, -8, 20, 30, 3, -19, 60, -20, 12, -21, 1, -10, 16, -2, -6, 32, 5, -6, 14, 29, 9, 36, -26, -24, +-2, 33, 9, 18, 6, 8, 10, 11, -22, 26, -127, 30, -22, -12, 47, 10, 3, -47, -49, 41, -30, 16, 0, -7, -16, -3, 57, 80, -26, 5, 18, -47, -17, 127, -31, 6, 73, -33, -2, -3, -8, 56, 22, -31, -15, -5, -5, 53, 35, -12, -20, -11, 25, 47, 94, -7, -67, -93, 73, -11, 46, 5, -5, -21, -92, -15, 23, 0, 28, -19, 66, -77, 98, 4, -100, -24, -19, 38, -23, 57, -47, +-27, -27, 26, 1, -45, 21, -8, -57, 5, 10, 13, -30, -7, 8, -50, 29, -54, 43, -15, 22, -6, 28, -33, -8, -15, -71, 20, 3, -23, 43, -55, -16, -21, -36, 41, -25, 26, 20, 87, -54, 9, -9, -1, 45, -44, -26, 101, -20, -19, -31, -80, -49, -41, 3, 49, 79, -1, -15, -92, 35, -63, 28, 49, 13, 0, -45, -22, -31, -29, 31, -24, -2, 69, 36, 66, -7, 15, -52, 11, 5, 25, +-40, 4, 41, 29, 25, 19, -35, 12, -85, 46, 78, 58, -26, 16, -2, -95, -48, 47, 42, -42, 49, 63, -9, 48, 32, -71, -3, -6, 16, 42, -50, -58, -2, -41, -47, -8, 27, -22, -23, 5, -89, -35, -28, -21, -12, -63, 29, -5, 6, 14, -26, 7, 27, -18, -27, -4, -1, 23, 8, -11, 30, -5, -34, -4, 45, -31, -66, 22, -16, 10, -66, 0, -30, 21, -4, 65, -1, 55, -23, 25, -11, +28, 34, 19, -25, 2, 0, -13, -18, -4, -5, -8, 18, -20, -7, 5, 6, 11, 24, -13, 16, -7, -43, 42, -68, -22, -8, 8, 5, -5, -5, -21, 25, -28, 44, -3, -24, -20, 17, 4, -4, 15, -28, 13, -26, -16, 20, 14, 6, 8, 12, -16, -17, -23, 2, 1, -62, -26, 36, 26, 1, -47, -11, -5, -56, -24, 20, -127, -7, -49, -5, -1, -10, -28, 30, -35, -7, -5, 5, -12, -2, -45, +-18, 14, -24, -28, -22, 7, -95, 14, 51, -48, 33, 14, -21, -5, 6, 1, 10, 6, -20, -17, 4, 1, 3, 4, -34, -14, 5, -10, -13, -6, -14, 10, 4, -17, 15, -14, -35, 50, -83, 3, 2, -37, -18, -11, -14, -8, -14, -3, 12, -4, 5, 12, -5, 12, -1, -1, -31, -4, -25, 1, -1, -7, -11, -9, -13, 23, -5, 24, -3, -12, -73, 30, 15, 41, 18, -16, -25, -45, -12, 22, 16, +11, -21, -48, -3, -48, -11, 19, 0, -3, -29, 5, 37, 5, -22, -66, -100, 7, -3, 8, -67, -4, -127, 8, 5, -4, -13, -26, 98, -11, -12, 16, -11, 4, 3, 8, -1, -3, -2, -24, 14, 3, 2, 3, 9, 2, 7, -1, 0, -1, 0, -1, 4, -10, 2, 3, -10, -17, -8, -29, -9, 32, 11, -44, 21, -30, 0, 24, -62, 16, 7, -4, -8, 5, -24, 27, -33, 35, 13, 4, 29, 6, +11, -28, 0, 17, -51, 34, -7, 51, -32, -3, 8, -6, 27, -13, -67, 35, 10, -16, 7, -4, -33, -21, -7, 9, -21, -22, 17, -14, -34, 5, 1, -5, -27, -47, 12, 15, 18, -20, -1, 11, -2, -24, -49, 7, -1, -23, -16, 15, 1, 9, -18, -18, 46, 6, -14, -22, 5, 14, -4, 39, -17, -2, -16, -15, 5, -25, -35, 27, -5, 16, -17, -1, -4, -16, 16, 18, -67, 5, 22, 25, 29, +25, 14, -63, -14, 29, -32, 25, -8, -11, -26, -54, -3, 5, 55, 2, -4, -52, -40, -70, 56, -38, 41, -10, -23, 18, 39, -13, 15, 22, -35, 25, 4, -10, 29, 7, -22, -35, -9, -24, -16, -74, 26, 5, 9, 2, 9, -3, -11, -10, -13, 36, 4, 26, -29, -2, -61, 34, -60, 25, 15, 17, 24, -63, -3, -43, 36, -14, -23, -12, -24, -35, 8, -62, -51, 46, 5, -38, -2, 34, -2, -29, +23, -60, 16, 24, -22, -1, -102, -47, -45, -19, 29, -12, -63, 19, 77, -42, -18, -94, -69, 2, -31, 72, 35, -9, 46, -44, 28, -41, -37, 22, 18, -20, -27, 26, -16, -82, 2, 24, 21, 29, -1, 15, -50, 34, -24, 6, -70, -47, -15, -23, 22, -38, -36, 71, 36, -98, 81, 8, 12, -38, -57, 33, -5, 13, 16, -15, -33, -55, -16, -74, 16, 16, 47, 30, -3, -3, 12, 2, -22, 34, -11, +-13, -47, 15, -30, -27, -2, -41, -55, -11, 15, 27, -37, -13, -7, 25, -29, -63, -29, -14, -11, -6, 22, 1, 12, -11, 51, -20, 20, 18, 22, -8, 23, 18, -5, -17, 28, -13, 2, 2, 71, -5, 2, -9, 19, -7, 0, 2, -3, -66, -17, -13, -4, 9, -8, -4, -33, -10, -11, 11, 28, 12, -2, 28, 52, 19, -31, -18, 19, 5, 11, -3, -42, 30, -6, -33, -16, -41, 2, 14, 15, -21, +-20, 3, 28, 9, 16, 34, 31, 19, 18, -4, -10, -47, -19, 33, 11, -45, -52, 8, -10, -6, 11, 26, -11, -34, -104, -46, -24, -116, -58, -78, 10, -45, -13, -32, 16, -29, -1, 3, -7, -18, 5, 17, -23, 9, 25, -5, -3, 11, -17, 25, 0, 17, 24, 12, 20, 12, 29, 22, 5, 53, 8, -6, -8, 12, -35, -27, 6, 11, 26, 9, 9, 12, -24, -15, -6, 10, -7, 1, 15, -4, 8, +-5, -8, 28, 41, 37, 28, -3, -15, 20, -10, 36, -10, -64, 28, 20, -25, -25, -15, 21, 12, -12, -4, 35, 3, 57, -49, 15, 0, -45, 3, -48, 16, -10, 10, 48, 29, -40, 10, -8, -59, -53, -39, 29, -121, 55, 34, -56, -15, -22, 2, 24, -38, 48, 71, 25, -20, -2, 17, -11, 6, 1, 2, 1, -7, -13, 6, -11, -4, -8, 2, 23, -11, -9, 0, -2, -8, 16, -1, 2, -31, -22, +8, -1, 8, -2, 1, -49, 36, 14, -13, 11, -21, 2, -5, 16, 5, 8, -4, -11, -57, -30, 0, -17, -60, -8, -29, -28, 2, -3, -15, -25, 1, 22, 9, 6, -30, -12, 40, -18, 16, 23, -12, -11, -26, -26, -9, 21, 3, -11, 34, -33, -30, -17, 12, 22, 14, -7, -24, -8, -11, -25, 48, -24, -21, 4, -39, -15, 20, 25, 15, -19, -49, 44, 4, 54, -58, 98, -2, 4, 66, -36, 32, +68, 14, 2, 24, 13, -23, 15, 8, -54, 30, -14, -18, 35, 14, 77, -1, 48, -10, 45, 35, 7, -50, 26, -20, -34, 35, -39, -59, -13, 15, -2, 7, 18, 0, 24, 41, -41, 53, 18, 32, -15, -52, 39, -64, -93, 29, 28, -20, 17, -52, -5, 1, -28, 2, -7, 7, -22, -26, -26, -1, -7, -5, -2, -74, 16, 12, -9, -11, 33, 12, 2, 14, -27, 0, -5, -9, 25, -2, -8, 11, -9, +45, 15, -28, 29, 46, 9, -10, -26, 11, 36, -27, -20, -3, 0, -7, 6, 24, 22, -38, 38, 12, -8, 7, 10, -32, -25, -1, -46, 9, -6, -15, 7, -127, 32, 28, -5, 12, -20, -28, -5, -26, 21, 74, -2, -21, 16, -2, 19, -17, -44, -17, -21, -112, 17, 19, -25, -70, 4, 47, 4, -36, 14, -33, -6, -67, 49, 40, -7, -31, -4, -9, 26, 69, 8, 50, -6, 21, 26, -21, 80, 6, +-26, -40, 11, 33, 7, 29, 127, -31, 8, 6, -65, -5, 47, -13, -50, -62, -29, -60, 12, -2, -4, 11, 16, 13, -21, 25, -9, -8, 3, 11, 6, -74, 21, -58, -4, -10, -6, 6, -11, -49, 19, 19, -6, 15, 12, 27, 0, -6, -15, -11, -69, -16, -12, 23, -52, 1, 37, -86, -3, 28, 16, 63, 33, -15, 8, 10, 37, 12, 23, 14, -34, -11, -6, 56, 50, 9, 48, -91, 31, 2, 1, +38, -3, -6, 15, 0, -41, 24, -35, -68, 13, 5, -9, 5, 39, -5, -33, 11, -33, -38, 1, 1, 24, -85, 7, 76, -6, 22, 15, 36, 11, -29, 16, -31, -22, 15, 54, -19, 21, -12, 44, -11, 15, -41, -7, 29, 34, 30, 6, 85, -63, -20, 12, -6, 66, -29, -1, -67, -19, 53, 53, 41, 0, 3, -28, -70, -18, 21, 35, 32, -45, 19, 37, -39, -33, 73, -12, -14, 19, 23, -41, -34, +-9, -31, 14, 17, 38, -26, 29, -36, -6, -60, 38, -64, 14, 57, -20, 10, -19, -31, -6, -20, -24, 15, -94, -6, -8, -26, 17, 23, 56, -25, 19, 9, 22, -23, -17, 4, -31, -24, 5, -18, -2, -6, 11, 2, 29, -82, 33, 6, 13, 32, 7, -65, 33, -13, -15, -7, 7, -22, 16, 25, -8, 28, -56, 6, -2, 9, 8, -41, 63, -1, -24, 37, 9, -23, -9, -20, -3, 8, 7, -9, 79, +-49, 13, -21, 2, 21, 6, 32, 2, -24, 27, -17, 13, -10, -27, 24, -5, -107, 19, 12, 127, 13, 3, 72, 46, -5, 19, -9, 27, -103, 7, 6, 15, -13, 7, 11, -14, -22, -62, -24, -6, -10, 1, -6, -29, -1, -15, 17, -19, -50, 31, 7, -11, -28, 26, 9, -43, -17, 83, 12, -2, -62, -16, 42, 10, 14, -92, 19, -13, 18, 3, -1, -9, -4, 29, 5, -1, -2, 23, 30, 11, 19, +12, 33, -64, -30, 23, 57, -28, -14, 1, 69, 23, -26, 18, 9, -20, 64, 3, 29, -27, -7, -88, 25, -28, -11, 28, -32, -40, -71, 34, -7, 14, 24, 50, -6, -82, -26, 17, 61, 27, 59, 2, -17, 32, 0, -52, 18, 10, 10, 7, 33, 4, 30, -55, -36, 21, -4, 4, -66, 50, -16, 5, -14, 6, 24, -39, 17, -3, -9, -16, 2, -24, -7, -49, -31, -42, 37, 6, -45, 2, -19, -1, +35, -40, 3, 12, 26, -18, 10, 26, -8, 5, 18, 19, 6, 15, -5, -40, 6, -10, -15, 10, 41, 31, -18, -35, -14, 0, 8, -44, 24, 16, 12, -22, 16, -46, 4, -54, -14, 9, 48, -1, -15, -29, 12, 10, -16, -13, 26, 40, -1, -55, 2, 51, 4, -10, 5, -16, -12, -52, 7, -1, -1, -10, -17, -53, 35, 6, 22, 37, -127, -35, 59, -24, 1, -30, -20, 4, -9, 16, -13, -60, -36, +-45, -54, 12, -42, 29, 23, -15, 49, 10, -24, -17, 16, 10, -26, -1, -31, 50, 17, 3, 13, 2, 17, 22, -14, -4, 4, -10, -29, -7, 18, 8, 34, -32, -53, 11, -18, 6, 3, 10, -1, -22, -6, 18, 7, 1, 1, -9, 21, 10, 66, 9, 6, -7, -20, 2, 2, 3, 22, -6, 9, -127, 6, 0, 8, -19, -17, -8, 12, 5, 56, -10, 0, 17, -10, -12, 5, -4, -63, 44, 18, 37, +-51, -41, -4, 3, -65, -27, -18, -29, -19, 2, -15, -42, 31, -32, -8, 46, -43, -17, 21, -19, -26, 23, -14, -105, 51, 23, 32, -3, 11, -59, -28, 9, -27, 12, 11, 50, 22, -67, -8, 8, 3, -19, -7, -5, -9, -21, -38, -87, -55, 1, 19, 27, -28, -31, 15, -68, -48, -9, -35, 61, 8, -62, -5, -26, 48, -51, 44, 37, 64, -5, -21, -42, 5, 21, -23, -17, 10, -52, 5, -47, -63, +40, -16, 2, 21, 12, -24, -8, 31, 25, 52, 44, 41, -15, -5, -35, -7, -47, -54, -45, -27, -39, -20, 25, 46, -28, 21, -9, 3, -127, 17, -85, -7, 32, 38, 17, -9, 43, -18, 32, -15, -14, -6, 16, 5, -52, -16, 26, -7, 8, -63, 60, -4, 50, 0, 11, 39, -28, 5, 7, -7, -4, 21, -21, -35, -4, -31, 5, -19, -3, 19, -40, -15, 1, -1, -18, -13, -99, 25, 13, -3, -91, +-45, -30, -34, -28, 51, 21, -14, -8, -25, -15, 40, -45, 40, -49, -9, 29, -14, -10, -28, 23, 11, 35, 42, 23, 28, 7, 42, -7, 27, -49, -3, -31, 9, 18, 18, 4, 1, 11, 1, -28, -36, 8, 34, -1, 4, -30, 9, -42, -19, -13, 18, 5, 2, -23, 22, -59, -3, 5, -50, -34, -48, -33, -18, -47, 13, -12, -29, -62, -58, -20, -50, 4, 48, 14, 44, -43, 34, -54, -40, -127, -44, +-50, 9, 45, -4, 16, 16, -3, 3, -40, -25, -48, 24, 28, 12, -30, -34, 3, 28, -1, -29, 20, -11, -1, 17, -52, 3, 66, 20, -47, 5, -16, -28, -23, -5, 64, -18, -6, 2, -16, 15, 18, 45, 14, -61, -17, 56, 56, -17, -22, -1, -13, -40, 3, 46, -79, -28, -31, -48, -58, -23, 1, 0, -20, -12, 33, 59, -40, 37, 34, 58, -29, -41, -58, -42, 8, 37, 11, 49, 4, -86, -19, +-17, 41, -32, 5, -36, 7, 14, -17, -25, -28, -4, 29, -30, 26, -37, 24, 62, 18, -52, 17, -13, -103, -23, 8, 19, 5, -27, 43, -22, 32, 38, 39, 1, 5, -51, -13, 18, 22, 79, 33, 48, 69, -11, 30, -25, 21, 11, -1, -54, 2, 3, 13, 6, 16, 5, -33, -23, 4, -14, -30, 58, -21, -10, -64, 37, -5, -10, -14, -9, -6, 24, -33, -21, -11, -29, 14, -47, 12, -9, 36, 22, +27, 7, 17, -3, 31, -21, -1, -6, -10, -23, -20, 35, 18, -43, 10, 30, 80, -55, 106, 6, -7, -21, -31, -29, -32, 0, 6, 53, 23, 36, -6, -20, 0, 60, -24, -1, 4, 43, -19, -27, -57, 44, 49, -16, 6, -65, -1, 24, -9, 3, -62, -41, 12, 7, 30, -57, 40, 23, -34, 1, -28, -39, 34, -19, 8, -24, -18, 4, -3, 21, -57, 2, -2, 6, -1, -24, 3, -6, 10, -2, -2, +6, -2, 15, -5, -2, 2, -2, 0, -1, 29, -7, 10, -11, 2, 2, 8, 18, 7, 7, 1, -6, 48, -18, 17, -11, 11, -28, 33, -61, 31, 24, 34, 49, 29, 6, 27, -28, -10, -21, 65, 25, -21, 82, -35, 13, 9, 37, 18, 45, 74, -33, 26, -21, 9, 38, 26, -9, -10, 61, -5, -7, 39, 3, -27, 27, 8, 28, 30, -15, 0, 13, 15, -3, -127, -45, -10, -49, -4, 31, -6, -14, +-34, 15, 14, -4, -13, -24, -5, 8, -34, -59, 4, -52, -10, 4, 14, -19, 29, 16, 25, 19, 98, 4, 36, -20, 2, 26, 23, 62, -33, -28, -28, 78, -43, -19, -76, 1, 14, -21, -18, 9, 19, -7, -81, 3, 52, -3, -50, -6, 21, -51, -10, -8, 87, -2, 30, 48, -53, 33, 21, -26, 18, 33, -18, -28, 19, 7, -57, 35, -32, 15, -10, 30, -14, 26, -12, -19, 105, -42, -127, 46, 5, +34, 22, 20, 20, 5, 36, -12, -19, -7, -4, 10, 9, -34, 21, -7, 32, -19, 30, -24, 4, -38, -3, -65, -80, -14, -24, -83, -5, -60, 4, -51, 23, 4, 33, 3, 12, 2, 21, -2, 46, 27, 21, 29, -2, 0, -9, 110, -5, 10, 14, -46, 22, -48, -11, -7, 2, 10, 14, -43, -27, -12, -29, 19, 12, -3, -22, 22, -2, -18, 9, 5, -21, -22, 8, 5, -15, -12, -18, -31, -31, 11, +5, -10, -8, 30, 30, 53, 29, -17, -4, 56, -19, 9, -14, -59, -38, -19, -13, -14, 14, 0, 95, -17, -21, 23, 11, -39, 15, -1, -10, 4, -55, 11, -19, 19, -2, -21, 5, -31, -25, 0, -56, 10, -26, -32, -25, -58, -44, 1, 7, -34, 49, -18, -13, 9, 26, -13, 0, -51, -5, 9, 4, 66, -6, -57, 6, 41, -24, 3, 13, 9, -47, 20, 6, -20, -25, -64, 41, -5, 31, -19, -58, +-55, -17, 31, -25, 81, 73, -18, 0, -89, -48, -63, 17, -92, -15, 28, 17, 127, 11, 13, -24, -49, 19, -40, -69, -9, 7, 3, -55, 31, 33, -17, -18, -127, 38, -31, -25, 6, -32, -43, 0, 37, 11, -84, 40, 44, -14, 32, 90, -22, 11, -63, -10, 13, 33, 6, -15, -9, -28, 7, 20, -38, 4, 11, -26, -112, 28, 14, 7, -23, -68, 14, 0, 39, -43, -22, 22, -66, 6, -53, -5, 86, +-3, -8, 25, -8, -2, 13, 2, -53, 4, -32, -18, -4, 34, -17, 2, -39, -88, -27, -14, 41, -13, -72, 0, -29, -10, 24, 49, -29, 1, 5, 18, -13, -26, -3, -27, -44, 30, -29, -24, -7, 7, 45, -8, 9, -34, -6, -5, -115, 29, 8, 43, -22, -39, 22, 0, -3, -29, -37, -37, 47, 7, -60, -3, -10, 14, 59, 36, -31, -54, 14, 13, 29, -14, -59, 0, -8, -3, -21, 14, -64, 33, +-52, -14, 17, 19, -20, 0, 1, -12, 27, 25, -57, -15, -49, 50, 10, 5, 9, -6, -8, -25, 1, -4, -4, 14, -32, 3, 9, -3, 6, 8, -48, -11, 8, 28, 7, -53, 1, 0, 19, 9, -24, -3, 2, 2, 5, 15, -1, 11, -35, 22, -19, 36, -13, 8, -71, 11, -13, -2, 40, 22, 10, -6, 0, -3, -24, 3, -12, -111, -127, 0, 17, 33, 70, -26, 31, 6, 50, 6, 25, -27, -27, +41, -15, -32, 29, -10, -31, 0, -27, 37, 4, 15, 35, -15, -117, -39, -4, -21, 28, -9, 0, 0, -2, 77, 17, 14, -12, 31, -2, -10, 33, 15, 45, -23, 20, 33, -64, 53, 22, -15, -13, 23, -41, 127, 26, 10, -112, -113, 39, 24, -19, -40, -3, 0, -25, -32, -52, -44, 24, 15, 20, 4, 36, 2, 9, 28, -57, -81, 55, -4, 37, -9, -29, 40, -14, 10, -26, -22, -52, 17, 19, 34, +35, 72, -28, 0, -61, 30, 11, 10, -6, -13, 77, 24, 79, 8, -9, 27, 9, -24, -3, -19, -62, 25, 17, 15, 19, 4, -8, -2, -102, -38, -26, 3, 16, 36, -19, 0, -10, 0, 31, -3, -23, -10, 16, -2, 16, 28, 62, -7, -11, 51, 21, -23, -44, -14, -29, 8, 1, 71, -19, 7, -127, 45, -21, -16, -35, 57, 17, 0, -5, -2, -13, 73, -2, -15, -19, 20, 66, -3, -5, -5, -4, +23, 50, 20, 5, -9, -19, -21, -2, 12, -8, -8, -112, -14, -15, -24, -18, 26, -17, 0, 3, 23, -37, -28, 10, -8, 24, -2, 16, -3, -6, 9, -15, 4, 25, 6, -79, 36, -40, -45, 11, 8, -12, -16, -40, -25, 5, 55, 0, 11, 27, 0, -7, -53, -4, -63, -62, 0, 7, 23, 17, -11, 33, -10, -22, 6, -62, 18, -6, -46, 16, -4, -38, -50, 12, -13, 25, -35, -51, -18, 12, -33, +-4, 29, -5, -13, 0, 21, -29, 23, 15, 7, -7, 15, 69, -61, 19, -8, 46, -14, 67, 6, 54, -20, -4, 83, 3, -26, 117, 22, -22, 27, -9, 3, -27, -57, -31, -70, -110, -9, 5, 48, 12, -21, 35, -28, 7, -3, -23, -4, -9, 5, 53, 67, -26, 0, 16, 25, -11, -40, 58, 33, -56, -85, 9, -59, -16, 51, -17, 22, 17, 57, -51, -72, 43, 38, -56, 18, 37, -8, 20, 5, 16, +5, 14, 13, 0, -11, 0, -70, -14, -1, 11, -19, -7, 19, 18, -66, 6, 37, 49, 20, 26, 7, 38, -7, -29, -22, 10, -16, 15, -27, 30, -4, -51, -23, 11, 1, -7, 25, 2, -19, 22, 1, -2, 36, -7, 58, 14, 17, -16, -13, -21, 1, -27, 9, 7, -10, 32, -23, 20, 38, -9, 15, -40, 12, -75, 53, -19, 45, 18, -33, 14, 23, 29, -14, 8, 7, -31, 13, 65, -52, 14, -35, +33, 50, -25, 24, -31, -35, 100, 11, -38, 25, -27, 19, -70, -19, 33, 8, -39, -20, -27, 1, -4, -15, 52, 0, -1, -18, 21, 5, 40, 25, -52, 11, -9, 10, -45, 40, -66, -40, -18, 10, -23, -2, 5, -3, -14, -8, 21, 20, -4, -19, -8, -17, 6, 10, -1, -6, -1, -11, -1, -4, -2, -6, -4, 19, -18, 3, -8, 20, 14, 22, -7, -18, -11, -82, 2, -33, -41, 28, -49, -26, 51, +7, 66, -26, -43, -2, -13, -19, 50, 24, 8, -12, 42, 10, 21, 33, -45, -22, 8, -58, 28, -1, -5, 24, -6, -56, -15, 21, 32, 3, -71, 23, 39, -13, -39, 14, -13, -14, -13, 10, -27, -27, -39, 4, 38, -34, 72, -33, -47, -48, -71, 80, -30, -25, -1, 5, -77, -40, 7, 64, 66, 48, 35, 9, -69, -63, 36, 1, -27, -5, 11, -32, 33, -12, -9, 2, 6, 44, -58, -70, 17, 16, +26, 3, 3, -2, 27, 4, -77, -86, 39, -112, 3, 11, -33, -3, -24, 40, 75, -75, -10, -47, 15, 40, 23, -21, -36, 20, 17, 65, -15, 60, 45, 75, -17, -11, -36, -69, 11, 0, -57, -21, 16, 14, -23, 1, -60, -18, -4, 9, 35, 5, -11, 3, -14, 12, -16, 4, -17, -25, 1, 5, 13, -55, -29, -18, -30, 19, 11, 35, -37, 1, -44, -58, -3, -35, 60, 43, 46, -67, 79, -7, -9, +-3, -7, -31, -4, 7, -41, -30, -1, -22, 13, 41, -20, -5, -32, 40, -11, -2, -74, -25, -22, -32, -113, 49, 3, 19, -26, -5, 19, -6, 17, 27, 29, -65, 34, 37, -23, 27, -11, 13, 14, 49, 28, 1, 0, 1, 24, -36, -17, -1, 42, -31, 22, 1, -22, -28, -1, 20, -32, -1, 54, -27, 15, 73, -24, 3, -2, -7, 17, -17, -13, 79, -31, 34, 0, -15, -36, 16, -1, -22, 4, -11, +-40, 35, 27, -74, -33, 11, 55, -53, -127, 26, 1, 47, 23, -42, 4, -29, 29, -68, 5, 2, 77, -15, 69, 2, 30, -47, 11, -36, 35, -22, -32, -2, 36, 9, -25, 79, 48, -13, -1, 29, 39, 31, 99, -85, -11, -29, -24, -46, 41, 5, 9, -32, -31, 51, -7, 52, 18, -1, 31, -71, -33, 29, 21, 36, -16, -10, -11, 56, 39, 5, -20, -8, -24, 5, 21, -7, 5, -32, -12, 28, -43, +63, 48, -36, -77, -10, 9, 14, -12, 1, -19, -73, 5, 11, 27, -38, -3, 1, 14, -2, 23, 3, 4, -127, -91, 75, 39, 28, 20, -20, -1, -15, 2, -55, 27, -15, -7, 117, 0, -8, 24, 33, 32, -56, -33, 21, 31, 4, -12, 20, 10, -14, 24, -5, 27, -19, -62, -11, 48, -5, 21, 1, 11, -57, -16, 15, 10, -6, -11, -13, 40, -12, -18, 19, 29, -90, 34, 5, 10, -13, 21, 25, +16, -29, 66, 13, -42, -33, -9, 71, 3, -23, -50, -11, -6, -83, 35, 19, 3, 34, -9, -69, 27, 5, -18, -40, -18, 8, 52, -10, -59, 26, -20, -4, 17, -11, 51, -21, 9, -24, -38, -4, 86, -38, -77, -58, -29, -87, -1, -2, 47, 10, -26, 13, -20, 40, 19, -112, -4, 30, 70, 15, -51, -29, 2, 55, -1, 16, 57, -11, -18, -1, -20, -11, 13, 19, -12, -51, 3, -40, -5, -25, -16, +-9, -34, 0, 28, 15, -6, 11, 4, 13, -14, -8, -13, 10, 11, 2, 2, -14, 21, 17, -62, -43, 14, 8, -21, -24, 6, -20, 23, 7, -32, -7, -4, -40, 4, -25, 9, -68, 3, -12, -15, 12, 36, 29, -81, 122, 29, -4, 21, 16, 69, 4, -42, -40, -71, -6, -22, -26, 36, 6, -9, -23, -2, -61, -18, 4, 13, 17, -8, 32, 7, -18, -8, -30, -8, -14, -4, -14, 60, -7, 15, -27, +62, -11, -7, -43, -118, -11, -39, 6, 46, 41, -17, -48, 44, -43, -3, 12, -42, -44, -34, -8, 35, -44, -80, 12, 26, 14, -41, 20, -48, -41, 31, -27, 19, -24, -9, 15, -73, 2, -10, 6, 25, 26, 1, -72, -17, 26, -9, 33, 3, 7, -44, 48, -5, -39, 29, 7, -65, 14, 9, -17, -40, 2, 35, -75, 12, -4, -11, 7, -10, 5, 11, -45, 14, -15, -3, -60, -16, 9, 24, 14, 27, +9, -34, -24, -18, -56, 22, -54, -13, -20, 44, 12, 9, 17, 4, -2, 60, -9, -3, -21, -62, -43, 9, 67, 12, 13, 11, -39, -20, 9, -11, 14, -2, 10, 12, -48, 9, -39, -39, -40, -33, 10, -7, -22, 44, -52, -31, 52, 36, -1, -21, 14, -78, 8, 27, -23, -2, -33, 20, -76, 23, 37, -21, -1, 33, -8, 2, -47, 35, -43, -31, -40, -19, 38, -20, 30, 19, -12, 2, -18, 41, 3, +-7, -61, -33, 0, -84, -8, -6, -5, -11, -59, -3, 2, 41, -11, -60, 22, 8, -27, 1, 27, 4, 4, 27, -26, -45, -44, 7, 21, 9, 6, 40, 9, -23, 4, 60, 12, -14, -56, -21, -18, -18, -26, -37, -18, 20, -31, -11, -3, 8, 10, 18, 34, -17, -19, -31, 13, -77, -6, -1, 27, 9, 16, 1, 27, -81, -38, 50, 1, 20, 0, 2, -3, 39, -7, 39, 39, -45, -11, 83, -44, -22, +67, 12, 44, -11, -104, -17, -53, -76, 55, 28, 55, -11, -39, 82, -49, -17, 33, 4, 53, 26, -52, 28, -78, 0, 21, -46, -14, -12, -35, -31, 30, 26, 6, 53, 16, 11, -43, -34, -18, -117, 105, -9, 5, -47, -56, -70, -56, -32, -13, 6, 32, 66, 9, -44, -19, -15, -3, 54, 11, -36, 14, 3, 4, -9, -10, 6, -5, -10, -20, 4, -8, -77, 3, 32, -13, -24, -1, -50, 32, -14, 31, +73, -18, 8, 29, -22, 6, 24, 12, -3, 13, 5, 31, 4, 14, 16, -15, 18, -29, 27, 11, 34, -53, -23, -21, 14, -17, -41, -27, -30, -9, -62, -7, 39, 16, 14, -25, -31, -3, 8, -64, 22, -12, -10, -27, -6, 61, 18, -47, -60, 7, -31, -20, -27, -15, -104, -4, -33, -18, 71, 3, -9, 37, -43, -40, -86, 28, -44, 49, -43, 60, 19, -51, -72, -16, 2, 11, 6, -40, -14, -1, 40, +-4, 16, -52, -49, 12, -33, -56, 12, 7, -19, 20, -45, 10, 20, 5, 2, -15, 14, 2, 4, -14, 7, 9, 18, -4, -7, 5, -6, -7, 3, 17, -22, 10, 4, -11, -5, -32, -58, -13, 10, -1, 19, -12, -17, 6, 45, 23, 19, -5, -4, 18, 21, -34, 2, 62, -11, -8, -19, -24, -29, 15, 6, -8, -18, -16, 3, -44, 5, 78, 45, -50, -2, -8, 40, -1, -3, 75, 6, 1, -1, -31, +-12, 10, -41, 15, 13, -24, 10, -29, -35, -22, -16, -6, 3, 15, -60, 10, 0, 36, -21, 2, -77, -15, 45, 71, 12, 47, 7, 11, 93, -34, 45, -63, 0, 9, -3, -10, 25, 1, -108, 3, -7, 1, 26, -25, -18, -12, 38, 0, -42, 30, -15, 10, -46, 21, 24, -35, -12, 68, 48, -67, -11, 51, 104, -9, -59, -30, -23, -10, -26, -43, 45, -22, -7, -43, 26, 38, 26, -63, 48, 15, 14, +-59, 4, 90, -61, 19, -29, 21, -44, -64, 58, 11, 4, 12, -34, -4, -17, 11, 45, -6, 3, -3, 20, 6, 6, -67, -17, 5, 12, 27, 24, -5, 16, -32, 20, 13, -79, -13, 4, 26, -32, 14, 6, -10, 13, -3, -12, 5, 26, -39, 1, 8, 13, 68, -49, -27, -19, 8, -3, -7, -5, -25, -14, 8, 34, 37, -33, 42, -68, 29, -13, -30, -53, 24, -19, -8, 39, 14, 61, -11, -5, -21, +-5, -4, 47, 5, -5, -21, -21, 49, 16, 32, 5, 43, -1, -31, -37, 42, -45, 10, -96, -14, 12, 19, -4, 18, 45, 16, -40, 21, -7, -66, 18, 49, -23, 13, 19, 17, 30, -40, 8, -23, 3, -48, 33, 23, 11, 1, 19, -1, -4, -30, -39, -7, 29, 17, 33, 29, 3, -53, -47, 10, -8, 6, 36, -20, 2, -10, -21, -36, -29, -1, 1, 2, 13, 27, -1, -40, 5, -45, -21, -1, -25, +-23, 4, -7, -15, -36, -46, 75, -6, 36, 71, 37, 37, 43, -67, 10, 124, -2, 54, -34, -85, -57, -38, -35, -36, -55, -63, 9, 14, 27, -13, -40, 7, -41, 40, -34, -34, 28, -30, -8, 48, -11, 28, -38, -37, -1, -47, 42, -22, 11, 48, 0, 11, 2, 9, -68, -1, 16, -95, -10, 19, 74, -38, -22, -24, -5, 2, 7, 86, -6, -56, -5, 22, -53, -31, 56, -5, -6, -17, -7, -59, -23, +3, -17, 5, 22, -9, -40, 71, -82, 11, 16, -69, 50, 30, -10, 53, -57, -19, 32, 19, -30, -23, 5, -52, -33, 4, -10, 39, 36, -32, -18, -23, -15, -4, -1, -66, 10, -2, -17, 21, 6, 27, -105, 11, -111, -47, -19, -10, 13, -2, 14, -41, -23, -16, 22, -27, -13, 10, -40, -23, -23, -9, 1, 76, -11, 12, 38, -34, -9, -12, -27, 45, 21, 47, -12, 22, 5, -13, 27, -10, -7, -13, +-36, -52, -5, -14, 48, -46, 23, -26, -47, -32, -21, 26, -17, 3, -8, 6, -9, 4, -15, -38, -35, 5, -45, -5, -39, -45, -4, 12, 42, -98, -34, -24, -27, 15, -30, -2, 5, 30, -3, 17, 8, 29, -13, -7, -1, -17, 7, -16, 14, -5, -7, 3, -5, -8, 8, -18, 22, -5, 46, 3, -22, -11, -3, 13, 8, 13, 5, 0, 7, 26, 46, -65, 1, -30, 32, -24, -19, 23, -20, -9, 7, +15, -5, -14, -14, 6, -19, -52, -35, 0, -12, -7, -18, 10, -6, 22, 5, 23, -22, -34, -1, -40, -38, 18, 0, -17, 63, 39, 8, -33, 41, -40, 57, -6, 7, 17, 26, 74, 1, -22, 22, -38, 10, -17, 64, 1, -14, 17, -42, -34, -35, -26, -30, 5, 20, -62, 17, -51, 23, 30, -4, 7, -5, 109, 51, -41, -14, -5, 66, 42, 3, 6, 7, -4, -86, -43, 53, 33, 40, -25, -47, -3, +2, -12, -29, -38, -7, -12, 30, 24, -57, -21, 21, -73, 23, 62, 78, -37, -68, -8, 30, -72, 21, 28, -2, 21, 3, -59, 34, 40, -53, 29, 15, -11, -20, 4, 24, -67, -11, 19, 16, -42, 6, 6, -3, -12, 21, 35, 4, 26, -25, -10, -114, -3, -20, 26, -102, 15, -43, -17, 38, 29, -76, 2, -39, 37, 9, 19, -9, -34, -5, -49, 49, -51, -5, 0, -28, 39, 26, -74, 73, 4, -16, +19, -6, 6, 21, 20, -77, -28, -31, -49, 3, -10, -67, -49, 18, 23, 21, -4, 34, 38, -21, -17, -2, 26, -14, 45, 2, -49, 10, 21, -12, -15, 0, 4, 20, 50, 12, 9, -103, 3, 36, 1, -69, 36, 19, 7, 39, 16, -36, -18, 30, 19, -10, 15, -28, 8, -30, -30, -23, -12, -21, 4, -28, -14, 27, 7, -61, -43, -25, -35, -24, -10, -15, 10, -61, -17, -29, -75, -108, 17, -31, -126, +28, -2, 65, -46, 27, -40, -6, 45, -84, -11, -17, 13, 8, 62, 31, 0, 31, 33, -56, 24, 13, 42, 14, -2, -96, -24, 8, 31, 17, 4, 31, 25, 11, -79, -5, 11, -13, -12, 30, -23, -67, -98, 12, 8, -6, -35, -86, -25, -89, -46, -78, -10, 10, 19, 47, -20, -12, 26, -26, -48, 71, 14, -31, -54, -7, 19, -29, -3, 47, -12, 11, -3, -47, -19, -15, 4, -30, 10, -19, -36, -62, +34, -23, -25, -4, 59, 32, 13, 22, 24, -75, -45, -3, 8, -36, -96, 35, -9, -29, 12, 3, -5, -2, -12, 26, -26, -10, 4, -12, 16, 23, 6, -41, -8, -2, 32, 17, 50, 27, -7, 40, 40, -62, -23, 35, -41, 25, 31, 0, 30, 30, -30, 17, 14, 6, 18, 0, 47, 11, -24, 28, -6, -22, -9, -27, 21, 55, 58, 21, 5, 21, -19, -32, 34, 1, -34, 52, -5, 7, -26, 12, 17, +23, 8, 63, -8, 39, 26, -9, 33, 77, 17, 73, 3, -52, 33, 14, -11, 62, 68, 9, -17, 10, -39, -10, -12, -36, -19, -13, -76, 19, -11, 20, 37, 9, -8, 62, -3, 17, 5, -37, 0, 24, 1, 17, 7, -2, -11, -40, 21, 23, -18, 4, 8, 38, -9, -14, -52, 12, -64, 3, 36, 12, -18, -46, 37, 28, 2, 8, 2, 51, 20, -22, 6, 56, -1, -50, 3, 29, -5, -19, 17, 17, +-6, 54, -63, -32, 3, 26, -14, 19, 4, 32, -12, 36, 25, -50, -6, 30, 30, 33, -6, 16, 62, 6, -35, 1, 5, 24, 36, -29, -5, 23, -13, 33, 59, -52, -23, -46, -17, 3, -11, 39, -27, 13, -60, 45, 21, -20, 56, -9, 36, 3, 16, -12, 7, 13, 1, -15, -19, 15, 5, 3, 43, 1, -10, -15, -12, 13, -3, 10, 61, -3, -24, 5, -37, 8, 3, -11, 17, -12, -6, -60, 11, +9, -39, 18, -3, 20, -23, 15, -14, 17, 25, 21, 6, -38, 7, 8, -5, -6, 6, -36, -21, -2, -50, 4, -28, 45, -12, 5, 22, 53, -30, 6, -7, 10, 6, 7, 0, 3, -11, -7, -4, 0, -1, -3, 5, 5, 9, 12, -10, 9, 6, 15, -1, -7, 6, 5, 21, 9, -14, -17, 13, 1, 6, -2, 52, 98, 8, -44, -60, 20, 3, -11, 5, -15, 21, -38, -23, 59, -9, 48, -22, -15, +46, -33, -20, 7, -27, -40, -35, 45, 28, -48, -26, 21, -65, 17, 24, 32, 8, -69, 43, -9, 39, 2, -10, 9, 14, -18, -1, -2, -23, 18, 27, 23, -9, -48, -43, 25, -39, -34, 57, -26, -69, -56, -13, 25, -37, 56, -1, 18, 35, 16, 11, 19, 1, -9, 8, -37, -3, 30, 4, -64, -46, -35, 43, 3, -15, -4, 9, -21, -57, -6, -21, 44, -28, 28, 31, 30, -32, 28, 36, -29, -29, +-53, 5, 31, -26, -33, 0, -14, 31, 7, 47, -7, -18, -54, -23, 9, -5, -20, -76, -26, 4, 31, 7, 53, 52, 25, -24, -33, -7, 4, 45, 9, -20, 4, 74, -4, 20, 36, 48, -35, 50, -29, -30, -33, -12, -25, 29, 6, 15, -44, -26, 82, -55, 13, -9, -75, 41, 25, 35, -13, 37, 0, 15, 12, -103, -64, 3, 11, -7, -58, 58, 12, -20, -8, 6, -20, -18, -13, -12, -3, 31, -95, +-50, 13, -38, 32, 46, -11, -15, -33, -34, 10, -15, -30, -34, -16, 5, -26, 25, 52, 6, -5, -29, -35, -37, 13, -23, -21, -10, -36, 16, 25, -19, -79, -54, 29, 37, -58, 34, 13, 13, -61, -62, 62, -19, 11, 24, -21, -39, -2, 19, -15, 30, 37, 17, -25, 7, -6, 26, -11, 20, 20, 28, -127, 18, -70, -59, 32, -38, 0, 15, -18, 21, 7, -24, 19, -32, 3, 77, 4, -80, -33, -16, +56, -70, 25, -1, -10, 61, 13, 19, 37, -35, 16, 0, 29, 19, 1, 6, 33, 57, 5, 58, 16, 13, -104, 55, 0, 13, -25, -22, -9, -45, -16, 5, 14, -16, -5, 73, -42, -8, 15, 1, -45, -34, 27, 39, -21, 103, -88, -36, 5, -3, -9, -12, 42, -17, -9, -51, 15, 40, 2, 6, -34, 23, 1, -30, 66, 0, 10, -6, -13, 13, -8, 18, 8, -6, 8, 30, -3, 2, -67, -44, -18, +5, -2, -6, 12, 13, -75, 16, -24, 19, -1, -19, -3, -11, 73, 11, -66, -23, -4, 8, -10, -36, 17, 27, 31, -15, -1, 7, -20, -32, -61, -74, 7, -45, 19, 21, 8, 29, 48, -24, 2, -16, 11, 41, -56, 48, 3, -12, -22, 3, 22, 10, 5, 15, 17, 33, -37, 15, -4, -25, 38, 4, -48, -19, 6, -6, 10, 27, 56, 47, 24, -10, -20, 15, 2, -32, -18, -1, 15, 41, 13, 6, +8, 9, -21, -3, 3, -13, 15, -9, -127, -7, 11, 10, -23, -4, -4, -14, -13, 87, 13, 17, 5, 19, 14, -15, -9, 33, -13, -19, 5, 14, -17, 0, 16, -28, -2, 3, 3, 7, 14, -46, 24, 5, 2, 16, -42, -25, -49, -32, 3, 14, -9, -24, -11, 41, -13, 47, -2, 18, 4, -11, 9, 8, -2, -5, 13, 18, 4, 13, 1, -13, 10, -3, -6, -1, -12, 0, -11, 13, 5, -9, -6, +-5, 4, 1, 8, 21, 11, 2, 41, -24, 2, 59, -26, 44, -23, -20, 10, 82, 40, 12, 33, -32, 34, 8, 8, 10, -43, -9, 39, -32, -45, 78, -19, 27, -68, 1, 7, -50, -30, 5, -6, 98, -6, -7, 1, -5, -103, 76, -38, 6, -31, -7, -79, -57, -25, 40, 4, 28, 6, 22, -29, 21, 29, 3, -2, -15, -19, 5, -1, 8, -13, -85, -20, 60, -20, 27, -14, -1, -27, 3, -40, 1, +-25, -17, 20, -39, -3, 27, 3, 1, -49, -10, -71, 7, -24, -20, 0, 5, -11, -5, 22, 27, 4, 25, 5, -2, -43, -29, -19, 28, 2, 8, 52, -7, 40, -5, -17, 20, 8, -14, 30, -6, 29, 5, -18, -3, 22, -36, -28, 39, 29, -17, -39, -47, -5, -43, -38, 28, 70, -5, -30, 47, 38, 68, 27, -20, -42, 16, -37, 35, -2, -20, 28, -3, -21, 92, 11, -14, -57, -37, 39, -26, -31, +20, 16, 6, 69, 35, 47, 21, 42, -15, -25, 12, 57, -35, 9, 8, 9, -83, 89, -21, 75, -1, -1, 14, -68, 8, -35, -40, 20, 11, -4, 6, -65, -29, 77, -9, -69, -6, -24, -7, 28, 61, -20, -13, 23, 8, 7, -18, 14, -7, 66, 17, 14, -13, 5, 7, -2, -2, -18, -8, -40, -50, 46, -46, -36, -12, 18, 46, -35, -48, 42, 4, 14, -19, 14, -40, -16, 6, -40, -61, 56, -62, +6, -12, 26, -3, -10, 9, -38, 2, 2, -23, -21, -23, 33, -62, -8, 7, 18, 8, -19, -19, -23, -21, -8, 47, -14, 4, -115, 18, -8, 40, 89, 16, -17, -2, 30, -14, 0, 71, 3, -1, -1, -43, -34, -3, -2, -25, 9, -2, -71, -28, 31, 14, -35, 16, 20, -38, 107, 34, 12, -5, -45, -16, 6, -30, -22, 14, -57, 30, -44, -8, 26, -29, -29, -16, -1, -7, 60, -80, 25, 23, -9, +0, -62, -42, 9, 25, 30, -1, -33, -8, -47, 31, -5, -21, 6, 5, -51, 0, 2, -30, -3, 18, 22, -21, -13, 2, 66, -33, 13, -5, -23, -9, 20, -23, -19, 48, -8, -30, -4, -1, 27, 9, -4, 63, 16, 39, 17, -102, 12, 44, 18, 21, 33, -8, -32, 43, -5, 52, -30, 40, -50, -50, 18, 14, -27, 22, 87, 13, 68, -50, -7, 0, -16, 29, -9, -80, 21, -23, 26, 14, -8, 9, +-4, -11, -40, 11, -45, -18, 45, -50, -3, 8, 59, 9, -22, 0, -5, 13, -1, -50, -1, -5, 3, 22, 18, 29, -2, -16, 113, -10, 22, 6, -4, 22, 7, -1, -5, 8, -12, -6, -11, -4, 2, 0, 1, 19, 39, 10, -10, 0, -16, -11, -25, -19, -9, -9, -34, 34, -6, -24, -23, 36, 11, 0, 4, -36, 15, 8, -11, -20, 1, 23, -17, -49, -8, -11, 18, -34, -4, 12, -25, -20, 40, +5, 12, 10, 12, 8, -15, 8, -36, 7, 1, 0, -7, 18, -4, 9, 1, 8, -10, 4, 3, 5, -4, -3, 127, 1, 1, 1, -5, 2, -6, -3, 17, -1, 24, -63, -10, 5, -31, -32, -22, 24, 0, -69, -76, 65, 4, -58, -25, 47, -64, -127, 2, -28, 11, -18, 35, -25, 63, -26, -74, 4, -36, 18, -20, -39, 13, -31, -21, -1, 6, -34, -92, 4, 15, 9, -95, -18, -93, -67, 32, -32, +16, 16, 26, 28, -34, -15, 0, 32, 18, 8, -61, 11, 48, 18, -61, -85, -12, -66, -20, -89, 6, -6, -2, -11, -36, -47, -3, -9, 89, -40, -35, 36, -60, 11, -1, 2, 5, -3, -8, -29, 9, -6, -16, -1, -69, 5, -9, -31, 11, -64, 10, -26, 7, 4, -5, -38, -10, -43, -19, -54, 0, 17, -13, -39, -15, 21, -1, -38, 29, -43, 12, 35, -6, 1, -19, 72, -127, 54, -60, -20, 14, +-27, 3, 2, -51, -13, 73, 19, 32, 13, -42, -4, 45, 4, 65, -127, -62, -27, -29, -2, -13, -2, 0, 85, 59, -46, 55, -31, 0, -18, 47, 15, -34, 11, 6, 7, -122, -39, -29, -50, -19, 22, 35, 16, 28, -18, -61, -114, -57, 30, -37, -3, -53, -19, 0, 16, 24, -38, 127, -19, 7, -8, 36, 23, -14, -33, 19, -26, 1, 16, 27, -39, 46, -52, 7, 9, 20, -9, -72, -127, -13, -62, +-75, -9, -12, 62, 0, -23, 42, 27, -9, 9, 10, -23, -12, -16, 21, 10, 24, -23, 28, 6, -1, -4, 21, -55, -9, 17, -1, 0, 64, -27, -40, -39, 9, -35, 16, -2, 0, 3, -13, 19, 8, 7, 13, -77, -13, 8, 25, -22, -7, -39, -11, 7, -14, 22, 76, 21, 19, -7, -18, 13, -31, -127, -12, 30, -39, -3, -2, -34, 0, 8, -37, 2, 27, -33, 1, -2, 8, 3, -5, 27, 22, +-82, -14, -6, 0, -10, 26, -26, -20, 35, -7, -10, 62, -61, -35, -71, -11, -34, -22, 35, 0, 65, 37, -21, 20, -2, -21, -30, 13, 75, -21, -24, -2, -11, 53, 13, -16, -1, -4, -30, -3, 8, 14, 36, -5, -127, 17, -7, -75, -32, -41, 0, 0, -6, 15, 24, -15, 42, 31, 10, -11, 50, -31, -11, 15, -20, 0, 29, 25, 18, 14, 8, -9, -40, 68, -23, -23, -79, 60, -42, -27, 48, +-7, -80, 0, -43, -3, -45, 52, 1, -9, -50, 41, -26, 5, 23, -2, 15, 37, -11, 5, -90, -8, -16, -31, -9, -101, -8, 37, -127, -36, -25, 43, -4, 21, 13, 0, 8, -37, 32, -1, -34, 3, 19, -11, 53, 14, 6, -2, -13, -13, 11, -23, -29, -9, 6, -2, -12, -24, 0, -4, -43, -7, -32, -12, 2, -17, -18, 0, 14, 12, 10, 13, -1, 0, 6, -10, -5, -1, -4, -10, -33, 49, +-5, 22, 6, -28, 49, -15, 3, 32, 3, -19, -34, 19, 15, 18, 67, -18, 19, 0, 32, 43, 49, 2, -57, -3, -53, 5, 11, -2, 7, -1, 0, -10, 3, -8, 8, -3, 3, -15, 3, 2, -4, -2, -13, 3, 1, -8, 3, 26, 5, 0, -3, -6, -18, -1, 0, 0, -16, -2, -2, -11, -50, 23, -63, 23, -21, 76, -7, -18, -19, -35, 26, 36, -12, -93, -47, -46, -60, -62, 25, 19, 0, +0, -91, -45, -22, -25, -78, 0, -31, 5, 119, -8, -51, -36, 2, -17, 2, 22, 12, -7, -69, -7, 22, 127, -10, -69, 21, -44, 20, -55, 10, -24, 23, 0, 52, 26, -15, 15, 11, 4, -2, -16, 15, -24, -86, 5, -32, 16, 29, -6, -35, 8, 4, 0, -24, -60, -13, 7, -127, -36, 32, 0, -69, 80, -73, 0, -9, -18, 53, -12, 36, 1, -18, -10, 67, 13, 2, 9, -13, -8, -9, -31, +35, 7, 24, 19, 43, 53, -9, 28, 22, -25, -65, -26, -17, 43, -18, 0, 32, 50, 30, 12, -13, 14, -16, -24, 9, 4, 64, 8, 14, -60, 1, 0, 60, 11, -77, -10, 18, -39, -18, 0, -19, 51, 1, 6, -9, -34, 9, -3, 27, -30, -106, 38, 13, 15, 109, 7, -65, 82, -7, 11, -2, -95, 1, -39, 53, -2, -32, 69, -3, -25, 27, -47, -11, 78, -6, 9, 69, -37, 5, 18, -28, +-6, -30, 68, -54, 4, -17, 28, 81, -21, 43, 23, -24, -9, 2, 50, 24, 6, -5, 43, -8, 17, 35, -29, -4, 34, 21, -6, 58, -69, 24, -1, -7, 13, -3, 58, 3, 9, 25, 4, -55, -18, 41, -67, 37, -8, -42, 25, -28, 23, 22, 49, -2, -16, 23, 12, 3, 9, 15, 9, 32, 13, -7, -23, -98, -11, -4, 30, -44, 34, -42, -117, -47, -98, 29, -8, 37, -47, 10, 38, 3, -21, +-40, -34, 21, 12, 10, 4, -10, 24, 11, 58, -1, -39, -54, 32, -4, 5, -1, 7, 20, -11, -18, -30, 34, -16, -46, -16, 19, -9, 0, -51, 31, 22, -22, -28, 35, -1, 15, -17, -22, -51, 25, -33, -4, 10, 24, -22, -62, 38, -2, -6, -26, 2, 26, -44, 6, -47, 7, -37, 3, -25, -13, 34, -3, 12, -16, -30, -4, -26, -5, 4, 5, 22, 20, 9, -22, -3, 60, 9, -30, -57, 4, +25, 53, 2, 10, -36, -42, -15, 24, 6, -26, 4, 25, 21, 16, 7, -15, -3, 7, -39, 14, -30, -10, 28, -26, 50, -10, -11, -37, 48, 27, -31, 3, -27, -3, -31, -32, 27, 22, -47, 6, -66, 9, -4, 0, -15, 21, -42, 1, 3, -30, -113, -10, -14, -1, 2, 4, 11, -12, 11, 0, -45, -43, 29, -50, -17, 2, 18, -8, -46, -28, 21, 4, -2, 27, -1, -21, 7, -16, -9, -18, -12, +-3, 3, -13, 12, -6, -13, 19, -12, -1, 2, 31, 13, -30, 14, -27, 28, -4, 16, 6, -20, 17, -3, 24, -30, 14, -11, 10, 11, 8, 2, 56, -1, -16, -38, -4, -7, 10, 35, 3, -3, -3, -13, -4, 25, 65, 18, 23, 19, -9, -16, 4, -37, 30, -16, 1, 1, -4, -10, 7, -19, 4, -12, -10, 7, -2, 0, -1, -6, -25, 2, 4, 6, 11, -5, 1, -22, -10, 0, -3, 10, 1, +-3, 6, -3, 1, 36, 7, -25, 3, -30, -31, 47, 34, 37, -14, 68, -2, 27, 35, 15, -49, -70, -48, -13, 2, -42, -76, -55, 17, -79, -120, 47, 43, -8, -54, 40, 68, -18, 2, 1, -19, -55, 29, 4, -31, 52, -54, 19, 37, -84, 16, 21, -61, 3, 33, -31, -15, -14, 8, 36, -14, 57, 19, -8, -14, -33, 25, 18, 5, -38, -12, -26, -8, 5, 22, -2, 70, -63, 2, 34, -11, -72, +-1, -26, 48, -76, 55, 30, 15, -22, -40, -53, -10, 34, 36, -14, -13, 23, -22, 51, -39, -70, 16, -5, -53, -39, 15, 1, 9, 14, 74, 41, -4, 35, 3, 12, 27, -8, 13, -18, -23, -53, -27, -6, -88, 24, -13, -3, -24, -46, -23, 27, 7, 35, -68, 33, -27, 88, -19, -34, 56, -80, -16, -60, -5, -45, 18, 29, -18, 12, 18, 9, -18, 6, 53, -13, -69, 15, -22, 73, -57, 1, 27, +2, 53, 14, 18, -80, -112, 34, -10, -31, 28, 30, 9, -49, -41, -48, 47, 25, -17, 38, 15, 40, 24, -16, -13, -8, 27, -22, 50, -42, 10, -12, -3, 36, 87, 14, 55, -101, -45, -4, 0, -89, -26, 7, 17, -61, 0, 5, 14, -19, -56, 11, -9, 5, 0, -65, 62, 21, -13, 14, 85, 11, 11, 4, 9, -3, 89, 17, -8, -71, -46, 12, -22, 24, 19, 1, -6, -15, 2, 35, -16, 7, +16, -4, 22, 3, 9, -56, 69, -33, -4, 23, 15, -26, 5, 13, 51, -1, 64, 11, -49, -116, 14, -8, 4, 1, 28, 20, 32, -29, 30, 5, 19, 19, -18, 8, -32, -5, -3, 47, 39, 6, -33, 2, 3, 8, 30, -38, 2, 12, 32, 18, 19, -2, -60, -39, -66, -17, -41, 0, 30, 76, -39, -14, -3, 2, -32, 15, -26, 24, 105, 50, 25, 59, -23, 14, -100, -15, 24, 0, -57, 2, 34, +22, 3, -48, -47, 28, -45, -25, -3, 3, -24, -54, 2, 1, -24, -30, 62, 27, -9, 3, 20, -2, -15, -32, -11, -23, -38, 6, -7, 46, 15, -2, 46, -18, -2, 15, -104, -21, -5, -7, 24, -31, 25, -72, -41, 13, 20, 3, 52, -46, -2, 33, 127, 52, -29, 25, -32, 111, 28, 11, -51, 2, -10, 21, -4, -15, -22, -9, -41, -22, 31, -40, 37, 8, -14, -49, 67, 11, 21, 23, 62, -10, +21, -1, -80, 16, 13, -45, -51, -43, 44, -38, -30, 1, 3, -10, 42, -2, 19, -3, -74, 4, 2, -25, 9, 40, -7, -39, -3, -23, -6, -10, 5, 19, -7, -20, 3, 19, 28, -14, 9, 6, -18, 0, -5, 7, -2, 0, 17, -7, -33, -34, -13, 27, -4, 7, 62, 35, 7, -60, 1, -11, -8, -14, -3, 7, -4, 4, 8, -1, -41, -78, -4, -3, 17, -5, 6, 52, -12, 8, 39, 12, 5, +-8, 1, 0, 2, -13, -5, -15, 7, 18, 3, -2, -11, -6, 1, 6, 2, 0, -3, 9, -2, -1, -2, -3, -11, 0, 2, -29, -1, -3, 20, -19, -35, 0, -72, -14, -53, 2, 48, -17, -33, -75, -35, -26, -17, 32, -66, 42, -18, 22, -24, 75, 27, 58, 87, 8, 54, -31, 37, 42, 49, 7, 43, 1, -5, 50, -35, 0, 5, -12, 18, -3, -27, 19, 27, 7, 37, 49, -56, -9, -12, 11, +28, 11, 66, 19, 34, -6, -15, 24, -2, 14, -14, 40, 32, 3, -98, 0, -30, -44, 8, 54, -41, -21, -40, -93, 25, 26, -27, 5, -45, -2, -6, -51, 17, -12, -21, 19, -32, 21, -28, 41, 126, -28, -14, 45, 44, 19, 19, -70, -2, 8, -70, -34, -34, -47, -21, 63, -33, -36, -40, 6, -4, -10, -30, 21, -1, 5, -12, 71, 34, -4, -2, -3, 35, -4, 25, 20, 6, -47, -30, 15, 11, +-15, -18, 0, -94, -44, 64, -8, 9, 3, 35, -17, 26, -21, -8, -20, 4, 14, 25, -26, 42, -29, -77, -12, -3, 31, 34, -41, 16, -30, -14, -35, -6, 9, 26, 31, 54, -18, 5, 4, -49, -20, -31, -26, 35, 3, 15, -26, -39, 31, -21, 51, -50, 4, -47, -88, -50, -52, -12, 33, 56, -79, -9, 14, -3, -25, 21, 52, 30, 11, 3, 14, 21, 22, -25, -4, 8, -12, 34, -7, -13, 6, +3, 48, 12, 51, -99, 61, 29, -36, 71, 17, -28, 36, -54, -12, 21, -2, -27, -2, -74, 2, 1, 28, -1, -16, -51, -90, -2, 13, -63, 11, -4, -13, 15, 2, -25, 40, 3, 15, 12, 2, -10, 25, -14, 23, 47, -28, 2, -10, -14, 43, -2, -35, -3, 53, 1, -13, -21, -65, 33, 31, 36, -30, 10, -1, 21, -11, 5, 55, -88, 6, -44, -15, -19, -1, 36, 15, -13, -4, -13, 5, -19, +20, -3, -5, 30, 25, 60, 25, 59, -41, 33, 25, 9, -23, -35, -3, 54, -12, 32, 7, -127, -33, -49, 39, -27, 3, 10, 86, -64, 20, -8, 22, 31, -36, -15, -2, -12, -7, 12, -15, -3, -4, -9, -32, -7, 18, 9, -18, 19, 27, -6, 12, -89, -33, -6, -12, -4, -5, 38, -5, 33, 9, -13, 4, 9, -55, -18, 13, -8, 47, -5, 8, 24, 3, -28, -27, -1, -6, 45, 14, -93, 49, +-30, 37, -78, -35, -12, 2, 0, -21, 10, -21, 31, -3, -57, -15, 11, -6, 19, 34, -11, 33, -83, 0, 30, 16, -4, -47, 12, -43, -71, -48, 101, -25, -36, -3, -96, -13, 5, -30, -52, 34, -75, 9, 10, -5, 2, -9, -8, -21, -33, 3, -6, -8, 14, -18, 2, 1, -5, -17, -2, 2, -2, 7, -1, -4, 5, -14, -23, -4, -8, -6, 11, 10, 4, -25, -35, -24, 47, 4, 34, 1, -45, +11, 11, 15, 12, 13, -20, 25, 37, 24, 1, -7, 4, 21, 16, 4, -21, -15, -50, 11, 0, 43, -40, -1, -22, -3, -30, -6, 3, -13, -13, -8, -3, 3, -7, -10, -5, -3, -11, 11, -1, 4, 4, -4, -2, 3, -7, -4, -4, 25, 33, -17, 12, -4, 4, -19, -14, 15, -27, 1, 6, -13, 59, 47, -28, 15, 24, 3, 78, 25, 29, -31, 17, -12, 19, 20, -35, -1, 33, 67, -51, 6, +-47, -3, -9, 36, -17, -4, -1, -77, -28, 9, -6, -51, -13, 23, 1, -9, 24, -66, -28, 22, 28, -8, -28, -19, 7, -32, 9, 32, 6, 39, 13, -28, 9, 13, 21, -4, 50, 72, -16, -7, -3, -12, 4, -24, -22, -31, -40, 41, -33, -25, 55, 10, 27, -19, 20, -60, -10, -65, -8, 4, 1, 62, -29, -31, -112, 3, 0, -31, -2, 13, -45, 4, 49, 9, 51, 11, -13, -30, -11, 40, -12, +8, -57, -30, -4, 33, 4, -34, 12, -7, -22, 17, 12, -10, 12, 46, -7, 11, 15, -1, -17, 54, -48, 2, 3, 23, -9, -13, 8, -34, 95, 55, -81, -3, 1, -54, 40, -24, 60, -4, -51, 14, -41, -39, -41, 53, 35, -71, -43, -50, 21, -49, -22, -2, 26, 56, -73, -49, -5, -4, 1, 18, -29, 30, -15, 68, -14, -51, 35, 7, -65, -34, -26, -15, -18, -69, -63, 40, 23, 20, -10, 26, +-30, -9, 5, -16, 7, -21, -52, 4, 31, -16, -14, 65, 6, 14, 19, 18, 28, -22, 21, -90, -22, -24, 16, 4, -29, -10, -45, 34, -48, -7, -3, -11, -67, 11, 8, 11, -48, -30, -24, 7, -103, -6, -5, 11, -21, 20, 23, 11, -20, 3, -7, -39, -31, -5, 17, -42, 4, -42, -79, 9, 19, 55, 6, -28, -19, -20, -22, 31, -64, -9, -64, -13, 13, -17, 13, 10, 12, -2, 38, -25, 21, +28, -19, -49, -54, 61, 25, 36, 19, -24, -36, 14, 12, -12, 3, 30, 66, -14, -11, 6, -64, -10, -22, 9, -54, -28, -5, -27, -33, -31, -5, 26, -9, 9, -20, -9, -95, -8, 26, -5, -13, -12, -21, -14, 1, 59, -55, 53, 21, 18, -22, 11, 79, 15, 14, -23, 7, 32, 36, 18, 15, -34, 59, 2, 9, 5, -20, 20, 89, 11, 23, -33, -9, -55, -17, -9, 16, 2, -4, -20, 17, 16, +-9, -6, -30, 12, -22, 23, -15, -1, -102, 48, 32, 66, 32, -16, 6, -21, -13, 32, -47, 32, 39, -50, -27, 3, -5, -63, -23, 8, -19, 34, 37, -11, -17, 34, -64, -9, 18, 3, -52, 31, -4, -26, -14, -20, 38, 15, -7, 16, -18, -3, -34, -4, -39, 37, -1, 35, -15, -30, 6, 24, -13, 15, -8, 10, 55, 27, -11, -9, 5, -19, -18, 7, 19, -3, -17, -7, -15, -12, 4, 26, -13, +-18, 35, -10, 4, -24, -8, -30, 3, -4, 2, 5, -17, 13, 12, -9, 15, -10, 27, 17, -34, 21, 2, 30, 26, 11, -12, -61, 23, 1, -29, -4, -20, 3, 40, -34, 5, -2, -22, -7, 16, -49, -35, 41, 10, -13, -15, -43, -127, -5, 7, -4, -2, -4, 8, 8, 2, -8, 4, -3, 17, -2, -2, -16, -7, 6, -18, 17, -11, 4, -5, -6, -4, -9, -2, -6, -7, -4, 11, 0, -1, 10, +2, 5, -42, -50, -38, 32, -57, 14, 9, -47, -25, 33, 1, -36, 0, -26, 8, 24, -15, -3, 75, 66, 16, 13, 14, 66, 5, -2, 48, 17, -70, 20, 3, -27, -40, -49, -9, 3, -8, -50, -63, 39, -16, -27, -76, -18, 9, 19, 25, -12, -17, -1, 7, 51, -18, 4, -20, -2, 8, 17, 4, 16, 16, -2, 32, -29, -57, 1, 0, 6, 3, 20, 2, 49, 34, -4, -18, -6, 8, 30, -28, +13, 18, -53, -17, -29, 14, -34, -15, 79, -14, 45, -23, -47, 0, 32, 6, 20, -22, -4, -21, 17, 3, -33, 19, -8, -26, -24, 22, -32, 0, 15, -11, 7, 7, 12, -13, -19, 5, -15, -40, -21, 56, -8, 6, -24, -20, 19, -36, 64, 35, 14, -8, -23, -4, 37, 35, -3, -25, -16, -2, -15, -20, 15, 18, -11, -1, -4, -8, -10, -68, 34, -15, -3, -1, -1, 16, -5, -5, -25, 19, -81, +12, 14, 6, 14, 20, 53, 3, -13, 7, 15, -35, -21, 30, -55, -35, 6, -30, 40, 2, 55, -22, -76, -69, -3, -20, 81, -18, -7, -29, -58, -5, -55, -8, 10, -6, 25, -41, 96, 33, 14, -10, -4, 12, 12, 3, 9, -34, 8, 4, -19, 13, -17, 6, 54, -16, 23, -30, 73, 24, -16, -107, -27, -14, 10, 16, -48, -19, -62, 10, 7, 5, -18, -108, -2, -5, 3, 6, 37, 9, -35, -10, +25, -7, 21, 30, -21, -26, -15, -38, -74, 63, 66, -1, -14, 51, -47, 62, 44, 12, -56, 98, 43, 3, -5, 20, 62, 46, 31, 31, -53, 6, 38, -9, -7, 16, 27, 70, 61, 25, -47, -61, 89, -40, 18, 26, -9, -34, 21, 38, -30, -15, -35, 27, -16, -15, 18, 17, -8, 8, 26, 2, -3, 17, 3, 11, -18, -13, -3, 27, 41, 5, 9, -29, 15, -12, -38, -4, 15, -33, -3, -14, 34, +18, -45, -5, -9, 24, -14, -12, 6, -8, -29, 6, -20, 15, 11, -40, -22, 13, 51, -41, 17, 24, -40, 38, -17, -1, 4, -5, -19, 17, -10, 9, 50, 5, 25, -4, -46, 16, 2, -4, 9, 22, -66, -11, -6, 28, -1, 22, 1, 15, 49, 3, 13, 31, 2, -18, 33, -37, -4, 10, 15, 6, 28, 4, 15, 10, -15, -2, 53, 64, 14, -43, -10, 2, -25, 63, 35, -6, -24, -72, 32, 2, +-104, -2, -17, -30, -44, -15, 61, -9, 47, -35, -65, 4, -83, 11, 39, 0, 5, -37, -2, 31, 5, 20, 44, 21, -13, -32, -19, -49, -105, 6, 13, 5, -5, -32, -31, 24, 24, 2, 35, -19, 27, 32, 27, -66, 26, -68, 48, 27, 35, -24, -8, 49, -8, 12, 47, -48, -15, -9, 41, 36, 25, -70, -11, -4, -13, -11, 0, -56, -27, -6, 43, -18, -19, 20, 4, -23, 24, 42, 20, -36, 3, +22, 15, 34, 18, -45, 1, -58, -24, -51, -2, -21, -4, -20, -10, -20, 17, -31, 48, -37, 23, 3, -12, 23, -18, 13, 43, -8, -18, -29, -24, 26, -86, -7, 25, -44, -10, 9, 6, 2, 22, -2, -24, -5, -86, -26, 7, 12, -43, 15, 53, 14, -4, -63, 36, -2, -4, 71, -21, 12, 1, -7, 28, 7, 10, 34, -7, 72, -2, -5, -9, -26, 5, 3, -32, -16, -27, 28, 5, 2, 3, -12, +-12, -33, 12, -53, 31, 20, -3, 24, -21, -45, 6, 11, -8, 39, 24, -22, 53, -4, -14, 20, 22, 27, -44, 20, -34, 96, -4, 8, -6, 25, 15, -3, -13, 38, 14, -20, -23, -8, -63, -1, -29, 24, 18, -35, -24, 30, 24, 31, 17, -44, -6, -55, 26, 5, -36, 9, 19, -60, -23, -19, 14, -9, 6, 30, -23, 18, 19, -31, -7, 64, -45, 10, 19, 19, -13, 6, -20, -55, 12, -23, 34, +20, -4, 17, 18, -6, -25, -45, -10, -21, 3, -9, -10, 1, -21, -10, -24, -24, 53, -8, -20, 19, 9, 10, 30, -26, -23, -17, -65, -18, -54, 11, -72, 53, 11, 49, -19, 43, -12, -13, 18, 1, 47, 36, -26, -5, 14, -27, -70, 72, 58, 16, -40, -11, 50, 9, -14, 26, -5, 6, -71, -123, -50, 4, 11, -15, -20, 6, -43, -15, -27, 72, -36, 7, 24, 1, -47, 2, -90, -32, 24, 43, +-67, -14, 12, -26, -17, -44, 16, 18, -7, -38, -20, -74, -26, 6, 13, -16, -10, -43, -14, 42, 82, 18, -30, 39, 18, 1, 5, -4, -14, -36, 28, -3, 15, -16, -20, 2, 5, -19, -24, -3, -60, 29, -12, 6, 24, 35, 73, 36, 0, 70, 10, -88, -5, -12, -52, 91, 10, 39, 41, -26, -121, 12, 70, -105, -5, 5, -108, 59, 42, 76, 16, -89, 13, -6, -74, 42, -12, -17, 16, -42, 8, +0, -17, -71, -5, 7, -11, -3, -7, 7, -3, 5, -76, -11, 23, -3, 26, 20, -21, -1, 0, -6, -30, 79, 8, -40, -5, 16, 2, -11, -17, 17, 0, 49, 36, 17, 11, -54, 1, -6, 14, -7, -8, -10, -15, 25, 7, -21, 20, -6, -18, -36, -38, -35, -9, 22, 0, 11, -26, -21, -33, 8, 0, -23, -13, 14, -33, 88, 1, 6, -14, 15, 21, 12, 8, 0, -38, -26, -1, -29, -12, 26, +6, -36, -21, 8, -15, -14, -23, 80, -61, 5, -11, 52, -64, -7, -44, -37, 68, -85, -48, 32, 30, -12, 5, 6, 57, 5, -79, 29, 69, 77, 50, 26, 46, -5, 30, -36, -6, -54, -3, -9, -7, 2, 16, 7, -17, 12, -27, 18, -35, -16, -14, -8, -4, -2, -1, 17, -37, 16, -74, 5, -30, 28, -7, 27, -53, -46, 12, 5, -5, 31, -8, 29, -12, 25, -29, 27, -39, -60, 16, 27, 26, +-67, -39, 12, -8, -14, -18, -15, -10, 8, -14, -55, -16, 26, -7, 9, 20, 34, 34, -8, 8, -26, -8, 55, -7, 41, 0, 7, -28, 2, 30, -69, -47, -3, -2, 15, 0, -21, 41, -7, 25, -9, -52, 7, 57, 8, 26, -3, 10, 35, -2, 44, -27, 21, 14, -46, 3, -14, 34, -27, 16, -29, 35, -13, 23, 31, -23, 34, -3, 14, 22, 4, -34, 6, -72, -57, -9, -11, 34, 5, 44, 38, +-3, 41, 53, -20, 10, -19, -16, -30, 4, -20, 29, -31, 29, -33, -5, -8, 2, -1, 6, 5, 7, 2, -4, -11, -30, -19, -32, -31, -20, -14, -15, -38, -59, 10, -12, -36, 11, -10, -26, -12, -29, 75, -25, 3, 27, 36, 27, 7, 15, -26, -28, 22, -29, -3, -1, 7, -81, -26, -16, 41, 13, 50, -87, -6, -20, -26, 72, 47, 46, 6, -40, -70, -89, -25, -8, -14, 29, -23, -44, 32, -25, +-25, 35, -62, 28, 17, -31, 81, -32, -34, 28, -11, 72, -40, 65, -6, 34, -67, 2, 24, 26, 1, -12, 5, 6, 42, 38, 38, -14, -1, 7, -3, 26, 4, 9, -4, 8, 5, 29, -8, 30, 60, 17, -27, 5, 11, 7, 1, 30, 9, -18, -3, -17, -11, -17, 41, -1, 53, 58, -14, -39, -27, 28, 49, 9, -39, 27, 56, 89, -1, 42, 30, -29, -54, 18, 8, 1, -23, -75, 16, -55, -2, +-30, 73, -89, -18, 25, 4, -2, 32, -25, -26, -27, 22, 7, -9, 0, -28, 36, 15, -30, -7, -72, -50, 15, -40, 41, 5, 44, -52, 46, -10, 27, 47, -46, 74, -33, -33, -9, 42, -72, -3, 76, 35, 10, 21, 12, 10, 29, -43, -19, -46, -38, -20, -11, 78, 40, -21, -15, -17, -11, -9, 61, 21, 13, 14, 32, -66, -17, 113, -29, -11, 44, -8, -29, 6, -53, 39, -16, -85, 52, 72, -15, +25, -51, 51, -43, 3, -43, 48, -12, -8, 9, -52, -28, 72, -44, 47, 91, -5, -28, -19, -4, -9, 31, -18, 6, -22, 11, 22, -12, 25, -40, 18, -19, 28, 67, 18, -40, 1, 16, -12, 10, -7, 7, 44, 35, -44, 8, 3, 10, -1, -1, -85, -9, 20, 11, 2, -43, 25, 31, 7, 27, -24, 25, -4, -23, 4, -22, 32, -10, -10, 11, -50, -13, -6, -1, 19, -52, 8, -2, 6, 10, -30, +-36, 14, 28, 12, -2, 9, 3, 10, -31, -20, -64, 19, 22, 31, 4, 2, 14, -33, 19, -9, -6, 40, -48, -25, -5, -18, 34, -1, 8, -5, 101, 1, -16, -20, -20, 33, 35, -70, -47, 104, -32, 26, 37, 33, -30, -10, -16, -14, -36, -62, 24, -30, -58, 19, -1, -18, 7, 32, -42, -34, 74, 16, 17, -7, 37, 57, 0, 24, -8, 18, 10, 51, 34, -21, 1, -51, 16, -42, 37, -29, -44, +0, -30, -1, -23, 38, -21, 35, -11, 53, -35, 10, -47, 16, 3, -1, -9, -33, 17, 28, -3, 10, -41, -5, -42, -60, -6, 51, 56, 32, -31, -28, -2, 3, 10, 17, 8, -10, 3, 15, -7, -8, -24, -43, 5, 9, -13, -1, 7, 52, 6, -12, 26, -3, 6, 24, 7, 8, 10, 32, -38, -25, -27, 1, -25, 30, -12, 12, -25, 62, -4, 1, 1, 30, 8, 49, 36, 29, -14, 79, -18, 57, +-31, -20, -13, -18, -41, 10, -45, -28, -9, 12, 26, -1, -3, 12, -29, -15, -89, -40, -71, -51, 13, -31, 47, 11, 41, -18, 10, 16, -16, 26, -31, 11, -25, -13, 0, 32, -26, 37, -1, -45, -24, -55, -20, -12, 38, 6, 5, 5, 28, 13, 31, 17, 9, -18, 13, 44, 10, 21, 26, -16, -41, 4, -19, -1, 51, -5, -18, -65, -74, 10, 2, -22, -37, -43, 10, 66, 7, -64, -9, 2, 39, +23, 0, -27, 1, -42, -11, -50, -33, -15, 52, -10, 28, -12, 38, -47, 28, 65, -5, 3, -25, -25, 36, 15, -28, -10, -103, 9, -15, 21, 77, -3, -49, -1, 13, -54, -14, 2, 31, -23, 3, -1, 17, 12, -77, 5, -11, -18, 12, -23, -11, -18, -11, -47, 11, -20, 27, 2, -18, -19, -18, -127, 21, -17, -10, 56, -66, -23, 0, 2, -35, -10, -5, -2, -9, -1, -12, -34, 46, -19, 5, -41, +-48, 25, -22, -44, 6, -2, -1, -54, -24, 0, 13, -127, -6, 9, -59, -19, -44, 23, 0, -32, -14, -7, 13, 27, -7, 40, -23, -7, 2, -40, -7, 3, 34, -19, -18, -6, 26, -42, -19, 6, 56, -25, -13, -127, 56, 40, 14, -49, -17, -87, 0, 22, -40, -5, 44, -46, -23, 81, -17, 26, -4, 31, 54, -1, 2, 30, -41, 16, -47, -32, -12, 62, -26, -9, -41, 14, -66, -90, -37, -57, 26, +-121, 0, 35, -90, -34, 27, 5, 7, -14, -14, -25, 49, 15, -9, 37, -91, -15, 2, -76, -43, -61, 29, 88, 110, 17, -69, -59, -104, -45, 38, -38, 2, 40, 0, -96, -48, 22, -104, -9, 17, 76, -20, 59, -29, -40, -7, -27, 63, -9, 16, -12, 10, -10, -24, -30, 70, -12, 19, -127, -32, -36, -14, -6, 7, -7, 0, -18, -34, -19, -8, 16, -15, -14, -20, 8, -1, -46, -1, -34, 6, -12, +-24, 75, -10, 9, -17, 5, 13, 4, -40, -127, -6, -19, 35, -27, -38, 13, 0, -31, 1, 5, -2, 10, 6, 6, 1, 12, 4, 5, 19, -13, 25, 27, 5, 10, 38, 19, -18, 4, -72, 19, -7, -66, 4, -35, -49, 15, -8, -11, 0, -27, -50, 7, 9, 16, 12, -47, -10, -14, -10, 58, 31, -10, 54, -8, -17, -58, -41, 62, -5, 69, -14, -8, -24, -95, 12, -16, -47, -53, 7, 37, 0, +60, 8, -8, 92, -6, -12, -9, -3, 48, 0, 6, -27, -16, 14, -23, -15, -73, 87, -19, -43, -28, 45, 36, -33, -19, 10, -38, 36, 48, 19, -125, 0, 5, 29, 15, -16, -19, 16, -13, 13, -10, 13, -30, -11, -23, 12, -12, -18, 82, -50, -47, -3, 5, -35, -7, 62, -106, -16, 31, -23, 8, -51, -49, 0, -6, -12, -56, -54, 9, -6, 24, 33, 71, -9, -55, 40, -21, 12, -1, 4, -24, +-16, -3, 1, 1, -22, 5, 2, -120, 23, -17, -25, -54, -54, -20, 0, 46, 35, -33, 19, 21, 9, -32, 2, -21, -2, -74, 25, 6, 54, -3, -30, 20, 8, -54, -1, -32, -55, -7, -33, -61, -51, 54, -23, -1, -3, 5, 0, -37, -26, 6, 18, 27, 5, 25, 18, -3, -24, 12, -5, -22, -12, -38, 13, 14, -8, 7, 4, -1, -9, -21, -40, -127, -37, 36, -37, 30, -13, -4, 0, 11, -1, +6, 20, -5, -4, -41, 11, -23, -4, -127, 17, 2, 7, 6, -25, -8, -2, -5, -38, -22, -55, -5, 75, -52, -26, -2, 14, -34, -20, 28, 0, -36, -17, -18, -72, 29, 7, -34, -22, -4, 44, 21, -24, -23, 21, -14, -89, 0, -43, -52, -8, -27, 18, -11, -83, -127, 61, -42, 34, -37, -31, 25, 0, 28, 16, 30, 32, -114, -9, -51, -1, -78, 4, 26, -19, 51, 11, 6, 32, 19, 3, 48, +-1, -23, 28, 1, 27, 33, 2, 25, -23, 20, 5, -5, -8, -31, -7, 0, 19, -1, -47, 26, -44, 10, -46, 14, -29, 11, -22, 28, -68, 0, 76, 6, 43, -20, -15, 16, -18, 18, 82, -47, -21, -31, 17, -5, -20, -58, -67, -25, -2, 53, -36, -76, -26, 2, -13, -5, -22, -5, -12, 69, 27, 6, 66, 45, -61, 20, -19, 8, -46, 20, 18, 31, 12, -80, 12, -34, -74, 18, -30, -19, 16, +-12, 55, 81, -22, 32, -69, 108, 20, 27, 10, -7, 2, 6, -26, -65, 27, -30, 34, 13, -41, 127, 18, 12, -7, 2, 49, -23, 29, 18, -3, -32, -23, 9, -42, 19, -73, 19, -95, -32, -43, 11, 24, -71, -43, 4, -66, -50, 35, -9, -100, -22, -72, 10, -17, 8, -1, -53, -24, -15, -108, 72, -15, -119, -29, 70, -21, -52, 8, -3, 43, 23, -23, 35, 14, -12, 34, 18, -51, -20, -26, 9, +-28, 5, 7, -40, -2, -35, 6, -12, -19, 26, 15, -6, -40, 22, 3, -23, -44, 20, 64, -45, 25, 5, -7, 9, 46, 48, -25, -2, 13, -3, -33, -8, -14, 30, 22, -2, -14, 24, 14, -4, -3, -3, 39, -6, 56, 16, 18, -8, 18, 24, 16, 5, 24, 27, 2, -28, -14, 35, 13, -15, 20, -18, 0, 3, -20, 31, -127, 29, -7, -6, -8, 46, 16, 7, -29, 40, -18, 9, 18, -11, -14, +-8, 7, 3, -35, -20, 29, 66, -16, -23, -77, -47, -26, -4, -28, -15, -24, 31, -23, 33, -49, -29, -72, -23, 19, 3, -59, -36, -40, -30, 18, -33, 63, -3, 2, 58, -42, 8, -36, -12, -25, -38, 21, -53, -45, -42, 24, 37, -33, 3, -57, 22, 60, -12, 1, 5, 44, 69, 12, 44, -98, 21, -4, 17, -30, -18, 37, -3, 17, 73, -66, 5, -3, 1, 17, -38, 5, -16, 3, -27, -40, 47, +17, -10, -6, 24, 102, 29, -1, -61, -2, -27, -35, -21, 58, -47, -30, 20, 99, 47, 38, 2, 16, -40, 19, -72, 51, -3, -3, -8, 28, -16, 4, -4, -57, 7, -2, 20, 47, -2, 43, 21, -6, -13, 19, -15, -32, -34, -47, -20, 27, -4, -49, -18, -46, 16, 4, 65, -57, -115, -57, -4, 11, -7, 50, 17, 21, 28, 8, -12, -33, -11, -62, -66, 0, -73, 37, -16, 57, -10, -11, 6, 1, +48, -7, 9, -28, 7, -13, 47, 19, 51, -49, 6, -5, 2, 36, -23, 16, 28, 7, -11, -20, -40, -29, 48, -13, 26, 42, -9, 25, 10, -8, 1, -9, 20, 13, 43, 55, 44, -22, -25, -25, 40, 26, 19, -27, 23, -43, 24, 35, 4, 54, 18, -31, 16, 2, 34, 9, -14, 13, -58, 25, -4, 2, 14, -35, -33, -5, 9, -27, 35, 3, -26, 26, -7, -66, -69, -56, 4, -47, 15, -5, -26, +10, -23, -19, 6, 14, -9, 34, -30, -15, -53, 26, 17, -11, 15, -74, 30, -13, -10, -6, -70, -33, 25, -17, -23, 1, 9, -70, 8, -9, 8, -17, 16, 5, -15, -4, 3, 60, 6, 6, -10, 0, -19, 6, 29, -26, -20, -2, 14, -7, 57, -9, -119, -35, 16, 35, -51, -48, -29, -89, -23, 26, -3, -15, 40, -1, -31, -3, -7, -97, 20, 3, 15, 33, -14, 38, -4, 12, -29, 13, 38, 14, +-13, -13, -27, -31, -18, 29, -30, -8, 14, -125, -21, -29, -6, 70, 71, -22, 24, -4, -38, 22, 42, 28, 18, -19, -31, 49, 13, 26, -7, -13, 52, 14, -1, -9, -9, 21, 16, 5, 11, -62, -20, -8, -36, -25, -86, 3, 41, 4, -53, 69, 2, -7, 5, 48, -3, 9, -30, 29, -26, 22, 6, -34, 49, 54, 48, -9, -81, -24, -126, 49, -38, -8, 13, 10, 35, 15, 7, -7, 41, 74, 84, +80, -34, -127, -30, 30, 34, 1, -38, -1, 32, 53, -39, 1, 43, 16, 38, -26, -32, -11, -36, -12, 14, 10, -35, 22, -11, 16, -28, 26, -37, 19, 27, 11, -6, -24, -39, 35, 12, -19, 22, 19, -17, 37, -22, -10, 25, 19, -1, -19, -54, 18, 0, 4, 15, 10, -11, -83, 11, -35, 2, 16, 10, 19, 16, -42, 1, -5, 10, 3, 0, 5, 4, 14, 1, -11, 14, 20, 54, 13, -13, -89, +13, -24, -15, -35, 10, -3, 20, -29, 7, -1, -7, -35, 10, -16, 21, 1, -9, -18, 0, -18, -2, 3, -10, -26, -8, -3, 18, -37, 15, -1, -40, -6, -96, -46, 44, 76, -43, 2, -68, 30, 36, -33, -1, -41, -44, 0, -10, -15, 43, 9, -67, 13, 7, 31, -12, -15, -20, 14, -40, -18, -3, 3, -10, -15, 29, -9, -16, -56, 11, 21, -30, 37, 35, 7, -6, 31, -20, 14, 9, -127, 8, +-3, -14, -60, 16, -37, 37, -28, -22, 52, -3, -46, 22, -21, 28, -127, -65, -29, 36, -25, -9, -4, -15, -119, -24, -20, -31, -45, 34, -3, -5, -5, -22, -40, 33, 51, 17, -28, 8, 11, 52, 47, -19, 9, 37, -8, -43, -35, -27, -25, -12, -67, -49, -21, -11, -62, -13, 54, 3, -11, -18, 47, 0, -9, -3, 3, 40, -9, 24, -7, 13, -81, -13, 14, 3, 5, 27, -14, -17, -11, -66, 17, +-27, 6, 5, -10, 24, -29, 25, -77, 39, -15, 11, 6, 18, -29, -47, 11, 3, 40, 13, -19, -11, -42, -36, 11, 18, 15, 63, 9, -8, -48, -57, 11, 27, -43, 22, 14, -2, -58, -15, -52, -6, 9, -26, 5, 16, 8, -5, -1, 3, 48, -11, 0, 41, 24, 14, -13, 5, 2, 33, 24, -41, -8, -67, 2, 74, -11, 30, 35, 15, -26, 11, 6, 26, 12, 74, -60, -17, -61, -14, -5, 1, +45, -43, -22, -7, -70, 71, 11, 30, -47, 74, 46, 50, 2, -28, -46, -21, 43, 24, -2, -46, -21, -53, 70, -4, -32, 61, 0, 17, -14, -3, 75, 12, 32, 73, -10, 48, 28, 58, 38, 0, 15, 18, -3, 15, -18, 17, -10, 1, -3, -59, -9, 11, 21, -25, -7, 11, -11, -1, -21, -17, -7, 5, -1, -7, 34, -6, 22, -47, 7, -11, 30, 14, -23, 31, 11, -27, -34, 39, -2, 30, -6, +-29, 36, -23, -13, 62, 2, 0, -21, -14, 7, 9, -8, 23, 43, -15, -35, 34, 19, -80, 44, 32, -36, 14, 3, -49, 23, -2, 44, -20, -65, -25, 40, -62, -10, -18, -18, -4, 21, -62, -80, 31, -4, 0, 27, -88, 51, 35, -7, -54, -15, -73, -2, -42, -7, -17, 31, -30, 10, -25, -13, 9, -83, 10, -40, -10, 5, -11, 113, 16, -2, 50, 37, -21, -12, -7, 9, 4, -11, -14, -47, -24, +-42, 1, 42, 23, -1, 12, -7, 7, -83, 15, 41, -90, -41, 35, 26, 17, -119, 14, -66, 14, 11, 65, -27, -85, 85, -43, -10, 28, 11, 15, -21, -81, 22, -123, 31, -17, -64, -31, -41, 71, -8, -11, 22, 39, 15, -55, -29, 3, -1, -35, -27, -49, 41, 10, 13, 9, 10, -10, 35, 70, 22, -9, 27, -30, 26, -90, 16, -9, -41, 32, 3, -4, -13, -23, 46, 20, -19, -23, -12, -19, 8, +8, 48, -14, -18, -16, 10, 12, 20, 5, -1, 39, -2, -21, -6, -19, -73, -86, -41, 0, -11, -16, 71, 11, -4, -36, 38, -16, -62, -31, 16, -12, -19, -22, 30, -20, -4, -6, 22, -26, -12, 10, 25, -20, -5, 0, -99, -7, -24, -52, -13, 24, 34, 20, 34, 8, -41, -4, 36, -31, -10, -11, 33, -49, 55, 26, 26, 5, -20, -3, 3, 10, 29, -22, -38, 5, 3, -22, 14, -30, -33, -127, +34, -33, 54, -38, -45, 9, -11, -64, -10, -13, -5, 35, 17, 8, 34, -33, -42, 2, -11, 90, 42, 38, -22, -8, 27, 26, 8, 5, 13, -52, 67, 24, 40, 8, 5, 12, -70, 5, 13, 7, -19, -20, -49, 32, 15, 25, -42, 58, -19, -51, -13, -51, -79, 13, -35, -7, 60, 53, 22, 15, 8, -10, -64, -72, -53, 9, 1, 8, -52, 45, 24, 18, -30, 14, 6, -28, 47, 13, 10, 22, 69, +37, 13, -7, -103, 5, -29, 3, -28, 6, -3, 18, 16, 33, 92, -111, 2, -18, -45, -24, 38, -23, -1, 18, 1, -3, -34, 10, 62, 23, -31, -13, -17, 24, 15, -3, -27, 2, 2, 19, 2, 71, 0, 58, -22, 10, -8, -127, 28, -37, -20, 73, -13, -22, -16, 24, 20, -33, -24, -10, -7, 6, -9, 29, 44, 24, -10, -3, -45, 2, -17, -13, 25, 5, -14, 1, 34, 29, 29, -101, -17, 13, +-1, 67, 15, -1, 40, -19, 6, -37, 18, 32, -23, -13, 21, 40, 19, 33, -43, -21, -29, 25, 31, -5, 2, -57, -17, -18, 10, -46, 11, -40, 14, 2, -31, -49, 39, -15, 51, -48, 11, 9, 13, 0, -5, -71, -57, -3, 45, -18, 4, 47, -7, -34, 40, -6, 20, 7, 5, 45, -20, 85, -32, -74, 70, 13, 1, -43, 3, 38, -9, 44, -21, -18, -10, 29, 4, -35, -44, -11, 0, 33, -25, +3, -25, -3, -20, -4, -40, -4, 15, -11, -72, -26, -6, 46, 24, 10, -5, 0, 8, 53, 12, 0, -58, -63, -5, -24, -53, -63, 73, 51, 59, -45, -49, 68, -2, -28, -16, -90, -112, 41, -62, 48, -27, -42, -29, -40, -1, -1, 28, 8, -4, 5, 1, -38, -35, -11, -68, -28, 17, 0, 15, -31, -19, 2, 0, -2, -91, -59, -3, 47, -36, 36, 55, -56, -55, 29, 78, -24, 22, 15, -18, -15, +13, -55, 40, -2, -44, 24, -52, -16, 13, 7, 1, 28, -23, 10, -5, -58, -14, 24, -23, 1, -39, -1, 46, -20, 5, -6, 47, 31, 19, -8, -42, 6, -37, -7, 31, -53, -9, 58, -40, 4, -9, -62, -26, 15, 7, 44, -109, 30, 62, 57, -48, -73, 23, 45, 124, -41, -67, -38, 11, 45, -3, 42, 13, -54, 36, 56, 41, -21, 5, 18, -14, 13, 16, 26, 1, 20, -15, -10, -12, 2, -77, +-24, -4, -14, 6, 39, -55, -35, -19, 54, 12, 11, -34, 2, 15, -38, 5, -43, 11, -62, -22, -18, -2, -19, 5, 3, -6, -2, 21, -17, -12, -5, -53, -23, -14, -7, 10, 0, -33, -4, -3, -3, 5, -55, 6, -15, -1, 21, 14, 8, -29, 14, 0, 26, 22, 27, 17, -3, -63, 32, -29, -16, -4, 48, -1, 73, -4, -67, 3, -31, 23, 4, -54, 1, -41, -4, 13, 5, 30, 15, -22, 7, +-43, 19, -69, -19, -9, 4, -23, -3, -17, 32, -4, -12, 29, 15, -35, -29, -40, -6, 16, 45, -27, -49, -50, 6, -20, -34, -42, 0, -43, -43, 119, -2, -57, -57, 11, 0, 49, -20, -27, 28, -6, 23, -8, -38, 2, 7, 20, -56, -15, -18, -19, 21, 33, 21, 15, -13, 30, -31, 7, -15, -12, 19, -9, -3, -9, 44, -34, -28, -21, 18, -18, 2, -43, -21, 24, -3, -30, 0, -15, -12, 18, +-54, -15, 44, -86, 21, 16, 10, 103, -53, -68, 30, 24, 28, 0, -40, 20, 33, 7, 18, 4, -45, -44, -60, -2, 2, 24, -98, -30, -17, 15, 6, -44, -127, -16, 8, -30, 17, -6, -3, 6, 87, 14, 22, 8, 42, 19, 41, 13, 21, -9, 33, 26, -27, -15, -18, -5, -9, 11, 67, 25, 24, 4, -92, -12, 48, -38, 68, -14, 22, -20, -17, 56, 47, -21, 2, -16, -7, 8, 78, -9, 1, +-1, 52, 25, 8, 7, -4, -17, 20, 14, -55, -54, -8, -27, 9, -28, -54, 2, -1, -33, 5, -43, -26, -4, -15, -55, 85, 1, 19, 3, 44, 16, -63, 3, 62, -12, 13, -3, 61, -3, -21, -55, 41, -43, -25, -11, 14, 38, -15, -38, -11, 35, -6, 8, 6, -23, 94, 15, -24, -37, -54, 1, -29, 77, 9, -20, -32, -4, 31, -23, 27, -4, 103, 52, -54, 2, -1, 40, -20, 37, 7, -21, +-23, 93, 13, -15, 8, -13, 20, -33, 53, 42, -45, -18, 3, -53, -11, 35, -3, 58, 21, 15, 34, -9, 5, 38, -8, -31, 5, -31, -61, -1, -17, 24, 28, -15, 46, -6, -14, 26, -3, -38, 14, -50, -4, 42, -6, 77, 5, 58, -29, -127, 39, 28, -13, -3, -13, -36, -5, -56, -15, -1, 9, 10, -29, 22, 16, -32, 35, 68, 57, 53, -28, 56, 71, -3, -55, 20, -45, 5, 1, 9, 6, +-26, -25, 32, 12, -3, 15, 21, -12, 40, 63, -9, -70, 0, -49, -47, -2, -20, 6, 39, 40, 33, -7, 46, -6, -10, 18, 33, -30, 37, 6, -9, -1, 3, -7, 40, -61, -2, -15, 5, -10, 14, 19, 16, 3, 0, 7, -2, -8, 15, 22, -29, -9, 16, 10, -5, -3, 6, 13, -9, 1, 13, 3, -26, -12, -12, 4, -22, -4, -13, -1, -25, 15, 3, -23, -27, 92, 24, 7, -2, 20, 24, +-2, -48, -35, 4, -32, 32, 21, 14, -6, -56, -23, -11, -45, 2, 5, 57, 21, 17, -14, 7, 11, -7, 23, 29, 16, -17, 45, -10, -39, 12, -4, 82, 5, 12, -44, -3, 17, 49, -4, 3, -72, 32, -9, 45, -6, -23, -2, 23, -58, 29, 7, -20, 8, 12, -1, 19, 16, -22, -29, -2, 29, 34, 17, 68, 10, 14, 41, -18, -22, 28, -33, -20, 3, 9, 9, -20, -47, -42, 1, 0, -15, +-26, -65, -21, -14, -4, -24, 5, 8, 32, -57, 6, -14, 11, 33, -46, -4, 19, -14, -16, -46, 57, -15, 6, 35, -72, -43, 69, 32, 21, 7, -28, 3, 115, -53, 6, 4, -39, 88, -8, -2, 72, -70, -71, -16, 15, -3, -70, -14, -17, 3, 2, -27, 57, 38, -14, 12, -15, -56, 28, -14, 12, 23, -9, -1, 20, 23, -4, -28, 17, 41, 16, 14, 8, 3, -20, -7, 19, 5, 18, 33, 21, +27, -16, -16, 3, -20, -1, 1, -7, 52, -20, 15, 34, 25, -39, 24, -12, 48, 61, -16, -66, -21, 1, 19, 0, -2, 2, 11, 1, -14, 38, 1, 34, 86, 32, -49, 63, 14, -5, 55, -38, 63, -30, 38, 54, 54, -14, -75, -84, 38, 61, -18, -21, 74, 16, 25, 9, -2, 20, -65, 2, -6, 86, 63, -5, 9, 108, -19, 13, -64, -45, -95, -19, -26, -72, -12, 29, 20, -48, 5, 34, -22, +-18, 13, 25, 9, -41, 3, -8, -9, 25, -31, 27, -3, 46, 16, -13, 41, -26, 26, 41, 3, 33, -115, -14, -58, -8, 6, 77, 17, 28, 48, -43, 29, 7, 19, -3, 32, 6, -18, -40, -65, -50, 25, -18, -12, -2, -28, 15, -13, 19, -23, 51, -34, -10, 10, 74, -18, 22, 15, 25, 36, -4, -62, 44, -19, -22, 1, 7, -22, 22, 50, 0, -53, 16, 11, 22, 2, 54, 9, 47, 36, -26, +-27, 56, 24, -5, 8, 0, 38, 48, -1, 56, -12, -59, -39, 40, 18, -2, 6, -22, 3, 9, 42, -42, 14, 60, 37, 17, 0, 34, -6, 15, 98, -29, 13, -10, -27, 18, 9, -28, 6, -12, -41, -27, 13, -42, -22, 21, -20, 13, 13, 11, 26, -23, 30, 21, 13, 27, 37, 53, 6, -27, -41, -108, 22, 15, -10, -3, 18, 8, -47, -21, -15, -8, -16, -77, 16, 78, -10, 8, 25, -11, -46, +2, -22, 28, 18, 31, 14, 29, 31, -11, 0, -6, -24, 17, -8, 11, -2, -41, -38, -11, 7, 9, 32, -23, 36, -58, 14, 6, -22, -24, -20, 7, -11, 15, 15, 1, 16, -102, 10, 8, 9, 8, 21, -45, -9, 35, -56, -49, 5, 16, -50, -23, -36, -46, 26, 3, -2, -15, -11, 27, -6, 13, 5, 2, -25, 9, -61, 3, -29, 6, 6, -1, -9, 26, 5, -25, 11, -6, 45, -13, 8, 8, +39, -8, -42, -21, 18, 27, -18, -55, 2, 41, 10, -17, -7, -6, -1, 60, -56, 9, 64, -32, 13, 9, 2, -64, -1, 15, -54, 18, -7, -43, -28, 9, 26, 7, -58, -62, -2, -27, -19, -21, 61, 2, -38, 2, 15, -10, 15, -23, -10, 3, -15, 27, -34, 13, -19, 28, 41, -35, -23, -13, 42, 15, 1, 51, -12, 24, -17, 7, -10, 12, -7, -10, 50, 4, -2, 14, -31, 20, -19, -39, 7, +-50, 2, -8, 10, 18, 11, 11, -25, -62, 7, -34, -18, 21, -7, -50, 29, 21, 6, 8, -34, -25, 34, -21, -36, -18, -4, 36, 11, 14, -20, 34, -6, -35, 3, 7, 12, 21, 4, -6, 8, -41, -43, -6, 38, -14, 29, -44, 15, 11, 85, -15, 24, -2, 71, 22, -76, 8, 10, -95, -12, 12, -118, -40, -37, 14, 46, -25, 29, 40, 21, -31, -25, -45, 2, 38, 20, -62, -3, -7, 27, -22, +72, -34, -27, 6, 7, 27, 33, -50, -27, -4, -10, -7, 5, -13, 25, 28, 2, 6, -5, 4, -9, -61, 9, -43, -31, 26, -25, -16, -10, 33, 16, -10, 19, -7, 10, 12, -4, -44, -5, -3, 14, -63, -59, -4, 45, -5, 8, -6, 36, 6, 23, 3, 16, 1, -4, -60, -47, -7, -73, -23, -11, -60, 56, 65, -7, 31, 34, -2, -43, -24, 53, -9, -64, -1, -79, -5, 21, -30, -9, -25, 3, +-126, 24, 3, 12, -65, -35, -99, -57, -4, 13, -15, -18, 37, -12, 28, 58, -28, -16, -3, 11, -19, 1, 19, 3, -59, 16, 30, 18, -53, -17, -2, -16, 31, 4, 25, 21, 26, 11, -69, -2, -32, -25, 60, -22, 32, 49, 74, 11, 25, 12, 1, 10, -53, 54, 2, 4, -13, 21, 10, -19, -14, 0, 17, 17, 41, -8, -6, 25, 18, 19, -72, -38, 27, 2, 33, 15, 6, 12, -94, 10, -7, +-5, 22, -12, -15, 9, 37, -9, -36, 32, -7, 11, 40, 27, 6, -2, 73, 21, 14, -6, 15, -40, -13, -94, 18, 46, -37, -5, -39, -1, 48, -53, -30, 15, 2, -49, -18, -5, 50, 15, -27, 1, 5, -2, 70, -8, 30, -18, -12, 57, 4, 13, -69, 15, -50, -18, 21, -9, 78, -26, 8, -39, 20, -20, -14, 35, 46, -18, 21, 15, 51, 20, -17, 44, 1, -53, 2, 4, -72, -31, -11, 9, +30, -20, -114, 2, 20, -9, -1, -23, -3, 6, -65, -61, -3, -12, 8, -12, 14, 15, -1, -32, -15, 27, 12, -19, -23, -5, 76, -72, -18, -23, 26, 20, -11, -22, 23, 5, -10, 24, -17, 7, 17, -8, 5, -36, -43, -8, -28, 24, -7, 34, -35, -10, 26, 24, -36, 1, -21, -16, 36, -30, -8, -74, -54, 45, 51, 4, -25, 2, -15, 48, 2, -31, 16, -17, -23, 6, -22, 7, -1, 15, -22, +-5, 4, 20, -9, -10, 10, -23, -4, -10, -4, -22, 1, 29, -11, -9, 6, 12, 14, 7, -5, -27, -2, -26, 9, -6, 6, 7, 18, 9, -25, 0, 43, 7, -21, 9, -15, 57, -9, 65, 21, 40, 36, -12, 24, 7, -6, 7, 17, 36, -18, 56, -26, -32, 32, -71, 19, 33, -103, -17, 19, 32, 44, -55, -6, 22, 6, -23, -1, 75, -15, -25, 17, -1, -13, 2, -39, 29, -29, -10, -22, -4, +-12, -11, 17, -18, -8, 19, 12, -18, -31, 9, -10, -7, -15, 37, 14, -36, -12, -6, -56, 4, 22, 12, -21, 62, -15, 1, -49, -19, 57, 11, 10, 9, 6, 15, -18, 4, 18, -6, -18, -34, 16, 33, -33, -13, -12, 65, 33, -58, -3, 5, -67, 7, -18, -53, -38, -43, 7, -2, -23, 9, -23, -45, 51, 127, -27, 55, -65, -23, -2, -18, 30, -37, -57, 18, -82, -38, 22, 10, 26, 66, -39, +10, 34, 58, 32, 48, 5, -25, -63, -19, -81, 28, 113, 16, -25, 19, 6, 39, -15, 38, -104, 0, -11, 12, -32, 53, 18, 37, -73, 49, -39, 11, -9, -50, 5, 23, -7, 2, -34, -27, -3, 1, 4, 3, -10, 22, 15, 5, 14, 8, 41, -18, 2, -27, 6, -39, -9, -54, 31, 12, -16, -20, -2, -26, -4, 7, 19, 0, 0, -9, -11, 16, 73, -71, 7, -46, 11, 16, -48, 26, 55, 2, +7, -37, -7, -16, 18, -44, 24, 5, -25, 14, 89, 5, -124, -2, -30, 26, 90, -86, 0, -35, -61, -44, 97, -13, -79, 37, 93, 13, 9, 30, -27, -17, 48, -36, 46, -29, 17, -29, 26, -7, 1, 27, 43, -29, 13, -15, -7, 34, -36, -50, 62, -8, 82, -12, -16, -10, 1, 62, 8, 17, -4, 28, -16, -12, 20, -21, -13, 25, 6, -19, 1, 19, -32, -14, 25, -6, 6, 11, -33, -13, -10, +0, 49, -5, 28, -72, 38, -4, -23, -18, -50, 28, -2, -30, -4, -19, 19, 16, 18, 16, -2, 24, 38, -25, -35, 53, -41, 33, 18, -2, 30, 7, 63, -10, -4, -38, -17, -48, 34, -22, 21, -23, -14, 3, -5, 23, 8, 58, -32, 3, 23, -31, -24, 15, -32, 23, 23, -51, -54, 43, 85, -41, 3, -14, -9, -27, 14, 48, -31, 15, -3, 23, 17, -5, -2, 4, 31, 26, -12, -27, 112, -45, +2, -11, 27, 8, 48, -9, 32, -29, -12, 16, 17, 26, 15, -15, -1, -4, 10, -13, 44, -5, -10, 4, -18, -9, 26, -124, -18, -47, -27, 35, 10, -28, 0, -12, -53, 3, -22, -17, 1, 0, -26, 47, -39, -21, 17, 5, -48, 40, 3, -75, 61, 6, -44, 20, -4, 2, 36, -100, -49, -39, -1, -51, -51, 29, 0, -26, -89, 4, 51, -15, 20, 65, -47, 36, -13, -22, 3, 12, 34, -28, -29, +-26, -8, -36, 14, 3, -23, -25, 41, -94, -45, 33, 99, 66, 18, -9, 0, -17, 7, -31, 5, 24, -14, -40, -2, 1, 10, -20, 42, -10, -37, 0, 5, 14, 12, 3, -9, -21, -16, -5, 0, -74, -11, -22, 23, -8, -47, -8, 0, -14, 12, 3, -2, -11, -6, 23, -4, -13, -7, 5, -43, -19, 2, 23, -21, -40, -3, -20, -35, 17, 4, 35, 7, -47, -35, -53, -49, 15, -5, 43, 0, -35, +-41, 10, 8, 5, 28, -15, -1, -83, -10, -4, -2, -8, -43, 31, -22, -52, -13, -17, -18, 20, -35, -7, -8, -127, 54, -41, 34, 5, -11, 3, 0, -1, 26, -26, -12, -31, -4, 8, 19, -29, 19, 33, 6, 2, -23, 18, -37, -20, 19, -36, -3, 35, 100, -4, -28, -127, 8, -80, 8, 2, -24, -28, 0, 7, 23, -26, -68, 32, 0, -4, 33, 3, -4, -49, 10, -9, -56, 34, 12, -69, 15, +5, 19, -43, 59, 22, 52, -107, -24, -44, -30, 28, 9, -13, 0, 6, -9, -50, -33, -62, 10, -8, 17, -54, -4, 28, -33, 56, -28, 10, -18, 15, -15, 50, -41, -23, 36, 1, -13, 9, -18, 19, -28, -36, -11, 127, 0, 61, -38, -3, -18, 31, 10, -15, -37, -58, 20, -5, -2, 13, -37, -8, 13, 22, -1, 10, -33, 10, -5, 8, 30, 25, -40, 11, -4, 25, -4, 25, 0, 21, 40, -19, +-8, -64, 1, -11, -14, 36, -60, 19, -4, -4, -30, -42, 4, -14, -18, -47, 6, 47, -60, -1, -4, -82, 70, -61, 6, 82, -2, -9, 0, -44, 31, 5, 12, 41, 7, -88, -32, 42, -55, -82, 13, -4, -57, -26, -39, -22, -26, -43, 27, 44, 106, -1, 0, -85, -81, -84, 8, 48, 22, -25, 0, -5, 105, 89, 9, -78, 30, 16, -46, -34, 49, -55, 7, -27, 64, 3, -3, -12, 27, -14, -7, +-38, 16, -4, 50, -110, 1, -34, 34, -21, -24, -4, 0, 61, 20, 1, -64, 13, -5, -28, 29, 31, -23, 32, -25, 3, 26, 13, 6, 43, -2, 17, -9, 13, 29, 1, -9, -127, -10, -12, -33, 68, 17, -21, 0, 10, -27, -37, -17, -2, -2, 19, 13, 9, 26, -55, -20, 32, -31, -11, -22, -25, -42, -22, -12, -32, 51, 31, -2, -87, 54, -48, 86, 33, -25, -34, 0, 27, 14, 10, 15, 3, +15, -9, -38, -43, 7, -117, -10, 4, -11, -8, 10, -80, -18, 124, 18, 17, -6, -12, 48, -127, -20, -50, -33, -65, 20, -27, 0, -34, -39, -2, -34, 28, -15, 30, 20, 5, 48, -20, 38, -39, -4, -11, 14, 21, -24, -54, -20, 23, 55, -30, 6, 21, 6, 4, -35, 28, -20, -2, -31, 48, -55, 44, 37, -76, 45, 97, -51, -44, -12, -6, -1, 0, 14, 14, 28, -17, 13, -45, -15, 41, 38, +8, 49, -1, -20, 22, 22, 3, 26, -2, 92, 11, -44, 24, 11, 26, 58, -42, 54, 88, -35, 20, -28, -18, -7, -31, -22, 14, 48, 13, 64, -23, -40, 30, -47, -19, -28, 18, 4, 11, -6, -85, -60, -49, -44, -98, 17, 22, -16, -48, 71, -24, -3, 26, -12, -6, -9, 3, 0, -12, 8, -11, -10, 8, -21, -18, 18, 14, 9, 3, -13, 7, -1, 1, 26, -20, -55, 9, 9, 27, 16, -17, +35, -11, -86, -31, 21, 8, -8, -25, -28, -29, -46, 42, -16, 11, -19, 38, -65, -19, -91, 13, -34, -45, 41, -4, 99, 47, -39, -9, 55, 3, 17, -23, 14, 33, -28, 61, 6, 29, -31, -9, -44, 71, -5, 9, 34, -55, -66, 29, 12, 12, -8, -5, 36, 6, 13, 27, 26, -10, -2, -14, 21, -58, 21, -4, 80, -42, -22, -34, -1, -14, -7, -32, -9, -1, -13, -25, -4, -25, -112, 13, 12, +27, -21, 33, -19, 31, 48, 0, 4, 34, 4, 29, 34, 5, 4, 13, -2, -27, 19, 5, 7, -19, -9, 62, -24, 34, -33, 6, -15, 4, 16, -54, 31, -8, 28, 60, -26, 11, 51, -28, 17, 13, 32, -43, 15, 31, -4, 5, -51, -43, -48, 25, 22, -56, -46, -18, 87, 92, 47, 2, -11, 111, -20, -17, 18, 81, 16, 19, 39, -47, 10, -28, -11, -2, 69, -44, -4, 5, 64, -36, 9, -21, +19, -21, -41, 40, 28, -46, -4, 20, 4, 34, 0, 3, 10, -30, 28, -6, -20, -12, 9, -27, 26, -24, 14, -15, -11, -115, 26, -127, 4, -27, 10, -22, -8, 2, 48, 17, 33, 14, 5, -8, -36, 8, 34, 27, -66, 9, 22, -2, -16, -16, 72, -11, 10, 11, -2, -23, 10, -12, 14, 44, 27, 47, -6, -88, -23, 27, 48, -6, 36, -18, -42, 69, -5, -28, 6, -24, -93, -49, 29, -13, 10, +0, -25, 24, 35, 57, 113, 19, -42, -22, 34, -65, -6, -33, 39, -65, -3, 74, -27, -49, -10, -12, -41, -20, -72, -37, -14, 5, 34, -3, 24, 23, -8, -56, 18, -9, -60, -68, -45, -30, 24, -56, 6, -104, 65, -59, 26, 20, -25, -5, 1, -8, -11, -15, -17, 9, -34, 78, -75, 15, 15, 13, -31, -7, 44, 34, 28, -35, -24, -1, -41, -16, -9, -3, -11, 1, 25, -67, -39, 33, 59, 44, +25, -27, -12, 23, -55, 9, -19, 38, 4, 10, 39, -16, -31, 31, -8, 12, -80, -17, -65, -21, 24, -44, -12, -66, 1, -21, -7, -22, 13, -32, -58, 27, 13, 14, -47, -49, 49, 6, -8, 38, -21, -11, -17, 8, -69, -2, -57, 4, 27, -22, 24, 46, 19, -103, 46, -53, -10, -29, -18, 76, 6, 28, 12, 79, -27, -41, 6, -66, 50, -87, 16, 25, -119, -52, -15, 2, -22, 23, 14, 35, 23, +3, 42, 49, 48, 10, 10, -61, 8, -8, 83, 9, -24, 67, 15, 10, 40, -91, -49, -18, 22, -15, -60, -13, -48, -30, -46, 3, 7, 9, -13, 31, -34, 25, -96, 86, -34, 34, -4, -1, -29, 19, -87, 18, -7, 44, 17, 57, -11, -49, 1, 93, 45, -1, 8, 0, 14, 33, -62, -6, 34, 93, -53, -24, -21, -10, 112, -24, 8, 13, -28, 22, 32, -18, -16, -29, 18, 22, 1, -29, -40, -44, +-21, -7, 12, 22, 1, 11, -21, -15, 13, 10, 0, 7, -14, -14, 0, -12, -9, -13, -3, -17, 7, -13, -70, -2, -8, -1, -1, 36, -7, -15, -40, -67, 3, -54, 18, 29, -14, -35, -54, -26, -23, 19, 41, -2, 15, 9, -9, 6, 66, 16, -54, 30, -18, 25, -38, 26, 127, 28, -29, 78, 21, -22, -23, -11, 1, 56, 37, 11, 5, 15, -52, -24, -7, 0, -16, -12, 19, 16, -3, 31, -14, +2, -17, -9, -12, 31, 37, -38, 23, -38, -6, 36, 14, -55, 10, -106, 57, 69, 41, 36, -7, -42, -98, -73, -9, 21, 7, -12, 24, -13, 17, -38, 29, 19, -13, 11, 22, -12, -7, 39, 28, 32, 40, 48, 4, -37, 38, -56, 15, -9, -35, -78, 35, 12, -12, -2, -14, -52, 8, -4, 49, -17, -31, 47, -33, -9, -22, -8, 29, 45, 39, 71, -5, -13, 17, 30, -29, 27, -7, 40, -36, 18, +-31, 6, -44, -26, 47, 20, -4, 9, 21, -24, -13, -1, 4, 28, 3, 33, -26, -14, 19, -3, 17, -10, 1, -18, -38, 2, -1, -1, 31, -10, 3, -19, -4, 4, 3, -2, -24, 10, -4, 1, 23, -46, 44, -4, -25, 1, 52, 8, -13, -38, 1, 1, -9, -4, -25, 4, -18, 35, -2, -79, -90, -104, -52, 80, -43, 20, 2, -12, -62, -19, 5, -55, 11, -85, 31, 9, -38, 100, 6, 14, -22, +-25, 28, 12, 12, 36, -12, -23, -10, 75, 43, 2, -52, -102, 6, -4, 32, -19, 5, -29, -8, -13, 18, -8, 4, 80, -41, -42, -60, -8, 22, 27, 25, -24, -35, 21, 40, 42, 6, 0, 20, 104, 11, 58, 28, -77, 39, -46, -31, -54, -88, 2, -66, 10, 59, 9, 24, 13, -11, -9, 2, -17, 59, -3, -34, -25, 29, 0, -35, -47, 9, 11, -14, 59, 32, -30, -19, -43, -7, -37, 20, -42, +42, 15, -17, 30, 4, 14, -51, 11, 3, 17, -45, 18, 0, 47, 38, 7, -49, -83, -31, 14, -28, -38, 1, 45, -1, 19, -76, 40, -127, -5, 8, 5, 44, -11, -10, 73, -29, -23, -21, 11, -66, 4, 82, -27, -37, -54, -55, 30, 36, 46, -5, 41, -20, 39, 37, 36, -22, -28, -9, -54, 85, -3, 46, -11, 6, -18, -32, 5, 84, 0, -5, -19, -6, -6, -21, 52, 33, -64, -37, -15, 61, +51, 27, 5, 51, -4, -9, 33, -6, -9, -10, 26, -19, -13, -64, -120, 42, -24, -6, -21, -45, -17, 20, 30, -20, 5, 2, 16, 22, -13, -12, 84, -5, -71, 15, 0, 80, 31, -31, -9, 14, -8, 9, -29, 23, -45, -14, -97, -11, -23, 45, 28, -28, 1, -30, 54, -51, 20, 22, -47, 25, 3, -51, -12, 46, -79, -65, -8, -14, 24, 0, 40, -20, 10, 33, 58, 29, 2, 18, -53, -34, 26, +-11, 33, -18, -9, 27, 72, 7, -24, 3, 12, 1, 34, 3, 73, 33, -47, -103, -12, 35, -10, -37, 1, -25, -38, 25, 20, -127, -1, 45, -9, 1, -9, 13, -27, 4, 9, -20, 3, -1, -2, 12, 12, 8, 10, 7, -17, 43, -60, -32, 8, 18, -14, -23, -6, 17, -7, 27, -28, 12, 38, 24, -1, 5, 47, -39, -12, -17, -30, -13, 8, 44, 26, 6, -34, -4, 8, -14, 7, -16, -47, 37, +27, -14, -32, 7, -78, 10, 2, 1, 15, -26, -19, 23, 28, -19, -28, -15, -17, -20, -52, 3, 30, 8, 3, -18, 3, 1, 18, 34, -47, 24, -73, -15, -6, 7, 6, 1, -59, -31, -23, 31, 37, -16, -74, -38, -34, 7, 48, -22, 2, -14, -33, -1, -10, 13, -1, 71, -16, 52, -24, 64, 36, 13, -75, 51, -36, -28, 4, 29, 31, -69, -2, 11, 77, 4, -10, -12, -21, 38, -81, 38, 74, +-1, 30, 5, -57, 21, 48, 16, -24, -8, -7, -14, -35, -8, -85, -45, -3, -14, 17, -62, -37, 29, -90, -25, -20, -6, 15, -26, 104, 14, 4, 63, 26, 2, 70, -22, -18, 76, -2, -8, -7, -29, -8, -65, 20, -45, -63, 95, -51, -42, 6, -49, 18, -13, -20, 8, 15, -9, 12, 48, -19, 13, 45, -30, 30, 0, 1, -13, -29, 40, 3, 23, 17, 5, 11, -3, -32, 21, 29, -19, 13, 2, +52, -12, 12, -11, -46, 13, 116, -20, 39, -16, -9, 36, 24, -36, 40, 34, -78, -21, 2, 41, 10, -18, 1, -9, -38, 7, -2, 21, -53, 43, 24, -7, -43, 58, -6, -31, -75, 13, 75, -31, 3, -15, 43, 102, -16, 27, 101, 73, 15, 14, 74, -97, 31, -46, 30, 88, -50, -81, -127, 28, -95, -74, 64, 68, 40, 11, 30, -9, 25, -7, 63, 40, 26, 127, -37, -6, -27, 1, -28, 7, -39, +-2, -22, 31, -7, 25, -29, -25, 23, 4, -5, 24, -101, -16, -28, 6, 8, 65, 9, 51, -4, 92, 1, -113, -4, 14, -25, -6, 16, -8, 26, -16, -29, -18, -6, 7, -6, 27, -9, 15, -3, 33, 18, -114, -102, 37, 31, 5, -14, 34, -52, -10, -49, -16, 17, 34, 27, -2, -25, 10, -46, -24, -28, 26, -37, 8, 39, -30, -13, -1, -67, 16, -12, 37, 25, -13, -73, 34, 16, -2, -25, 19, +18, -35, -42, 65, 51, -63, 37, 34, 10, -2, -19, 13, 13, -7, -38, -12, -61, 3, 82, -24, 32, 11, 4, 11, 29, 8, -102, 101, -4, -24, 8, -41, 81, -38, 3, 3, -34, -16, -28, 5, -8, -1, -94, -88, 14, -12, 9, -54, -29, -7, 27, 19, -18, 0, -45, -62, 25, -45, -10, 92, 20, 11, -127, -13, 39, 22, -67, 18, -17, -1, -19, -13, 46, 26, 14, -19, 12, 25, 5, 3, -29, +3, 28, -114, -18, 8, -16, 3, 89, -7, -5, 26, 33, -32, 10, -17, -17, -22, -43, 34, -50, -57, 30, 20, 13, -127, -28, 23, -37, -73, -8, -11, -26, -8, 61, 9, 32, -38, 0, -54, 2, 17, -15, -120, 48, 4, -33, 15, -34, -45, -4, -4, 26, -4, -16, -7, -11, -5, -41, -24, -22, -17, -5, 11, -1, -23, -2, 6, 4, 9, 2, 3, 7, -6, -1, -33, 13, -1, -5, -4, -10, -23, +-40, -46, -20, 44, -40, -38, 18, 6, -37, 15, -34, 7, 9, -32, -13, -63, 45, -30, -9, -36, 5, -19, -39, 5, -10, 15, -7, 12, 4, 14, 2, -13, 19, -42, -35, 31, -8, -20, 31, -40, -12, 14, 10, 21, -34, 34, -28, -7, 6, -33, 14, -34, -9, -32, 61, -17, -16, -45, 33, -25, 18, 9, 3, -4, -23, 0, 11, -17, -37, 11, -61, 1, -55, 1, -10, -5, -3, -62, -9, -36, 8, +-28, 35, 17, -48, -81, -11, -19, -4, -72, -24, -31, 31, -44, 49, -9, -12, 22, 19, -22, -41, -21, 22, 1, 54, -34, -21, -3, 10, -27, 54, 23, -21, -14, -37, 41, 18, 16, -37, 1, 9, 19, -82, 30, 28, -22, -49, -3, 11, -14, 19, 35, -43, -22, -20, -48, 21, -6, -3, -6, 3, -22, -7, 61, 50, -21, -16, 43, 34, -44, 28, 61, 92, -18, -25, 64, -49, -3, -32, 27, 28, 10, +34, 23, -54, 1, 64, 7, 8, -4, -5, 36, -25, -1, -50, -31, 20, -15, 2, 4, -35, 8, 50, 17, -11, -10, 53, -14, -15, 35, 1, 9, -4, 36, -83, 39, -13, -38, -70, 1, 41, -18, 58, -29, 18, -6, 28, -24, 34, -75, 24, -27, 13, -42, 43, -46, -26, -64, 20, -12, 26, 127, -87, -43, -9, -47, -22, 15, 11, -14, -89, -27, -1, 6, 23, -21, 64, -102, -24, 42, -31, -82, 16, +104, -8, -23, -1, -28, 61, 78, 33, 38, -31, -19, -63, 6, 3, 7, -28, 1, -8, -6, -77, -32, -1, 62, -26, -26, -23, 54, -20, -11, -33, -115, -18, 27, -6, -22, 32, -8, 48, -23, -2, -8, -42, 5, 47, -46, 7, 43, 11, 2, -22, 28, 47, -6, 9, 19, 10, -35, -58, -4, -28, -2, -55, -9, -24, -54, 10, -61, -25, 29, 19, 0, 31, 21, 20, -14, -39, 52, 0, -27, -24, 10, +26, -26, -68, 8, -29, 37, -56, 13, 13, -40, -21, 18, -20, -19, -18, -3, -73, 3, 70, 3, -42, 31, -17, -38, -9, 15, -14, -86, 14, -15, -62, -14, 73, 5, -89, 21, -18, 57, 37, -19, 22, -33, 33, -44, 14, 34, 37, -24, -31, -48, -49, -61, -32, -83, 68, 8, -25, 26, 106, -16, -26, 43, -11, -31, 1, -28, -34, -40, -15, -15, -11, -28, -40, 49, 55, 35, -1, -34, 44, -35, 25, +29, 70, -8, 40, 35, -33, -22, 8, 19, -37, 42, -19, 2, 32, -19, -48, 34, 84, -29, 2, 13, -7, -12, 1, -49, 19, -1, -4, 11, 33, 36, 46, 33, -4, -27, -13, 20, 5, 44, -58, -42, 16, -45, -17, -25, 3, 2, -2, 4, -4, 19, 7, 16, 13, -3, -11, -25, 31, 6, -26, 9, 35, -28, -14, 2, -19, -11, -25, -11, 2, 5, -14, 2, -25, -27, -6, -5, -4, -19, -45, -11, +-27, 3, 19, -1, -1, 12, 1, -24, -59, 65, -1, 2, 21, -28, 11, 113, -31, -31, 20, 44, -10, 3, -39, -2, 6, -49, -45, -28, -24, 12, -4, 7, -42, -22, -22, -3, 38, 3, 5, -91, -34, 11, -76, 23, 14, 18, -13, -35, 37, -18, 29, 30, 10, -7, 38, -8, 12, -27, -11, 41, 7, 22, 58, 19, -111, 18, -10, 18, 24, -30, -14, -1, -22, -37, 15, -1, -4, -20, -8, -3, -38, +-1, -4, 9, -41, -60, -12, -32, -51, -21, 3, 8, -13, 7, 5, -96, -7, 18, -14, 13, -18, -10, 19, -17, -39, -17, -16, 17, -13, -21, 9, -11, -10, -12, 14, 22, 26, 5, -66, -14, 31, -30, -19, -15, 6, -17, -26, 13, 16, 1, 20, 9, 8, -21, 0, -29, -18, -11, 12, -5, -6, 20, 9, 3, 6, -9, -4, -10, 19, -5, -15, 24, 12, -11, 10, -41, -30, 19, -9, -6, 28, -9, +6, -17, -18, -48, 5, 37, 36, 39, -91, 0, 20, -24, 13, 19, 39, 10, -41, 64, -49, 6, -64, -44, -44, -63, -63, 20, 56, 22, 12, 71, -43, 28, 42, 46, 21, -52, 6, -17, -25, -5, 28, 13, 10, 54, 1, -86, -17, -31, -61, 78, -74, 13, 108, -8, -14, -57, -5, 9, -32, 74, -35, 31, 21, 9, -23, 24, -8, -29, 32, 22, 3, -6, 3, -9, 25, -17, -3, 46, -46, -35, -42, +60, 27, 17, 6, 31, -1, -64, -27, 15, -14, -27, 4, 11, -50, -4, -10, 0, -13, 19, 16, -47, 0, 7, -44, 6, -32, 10, -64, 14, -41, -24, 26, -10, 36, 6, 9, -25, -1, 25, 5, 20, -4, -66, -28, -46, 12, -4, -20, -13, -87, -1, 18, -14, 17, 14, 8, 2, -4, 113, -37, 21, -19, -25, -9, 0, -13, -49, -36, 36, -22, 0, 11, 15, 21, 16, 2, -22, 6, 31, -4, 14, +-42, -15, 17, 21, -58, -10, 32, -8, 11, -49, 26, -34, 1, -12, 1, 19, -4, -91, 10, -24, 14, -64, 16, 11, 17, 16, 1, 43, -9, -23, 1, 11, 34, 20, 17, -37, 55, -6, 11, 56, 15, 1, 30, 6, 21, -6, -6, -4, -20, 20, -11, -61, -9, -17, 6, 27, -12, 0, -10, -26, 26, 5, -45, 22, -13, -6, -102, -2, 13, -2, -22, 12, 4, 15, 6, -5, -2, -1, -27, -16, 6, +1, 8, -8, -19, -12, -20, -16, -28, -37, -2, 8, -51, -31, -6, -38, -84, 1, -26, 19, -56, -7, -4, 46, -32, -83, -36, -6, -26, -14, 18, 34, -36, -34, -13, -1, -21, 12, 33, -24, -25, -5, 2, -17, 14, -8, 12, -22, -4, -44, 73, 8, -1, -25, -3, -17, -20, -42, -46, 29, 48, 8, -20, 34, -1, 44, -41, 47, 24, 5, 40, -21, 0, -29, -15, 4, 73, -90, -23, -26, -4, 0, +38, -36, 41, 11, 5, -38, 30, -21, 3, 28, -2, 23, 21, -14, -6, -27, -98, -12, 31, -8, -2, -27, -23, -14, -19, 21, -36, -12, -3, -38, 18, 10, -10, -7, 7, -19, -3, 7, 25, -24, -22, 56, -40, 30, 7, -12, 4, 16, 0, -7, 8, -23, 40, 6, 0, 4, -9, 31, -68, -17, 20, -12, 38, -8, 6, -43, -16, 18, 26, -127, 39, -58, 6, -9, -2, 0, -13, 39, 12, 3, 30, +-10, -24, -5, 32, -12, -17, -6, 15, 37, -57, -40, 24, 24, -63, -4, -38, -5, -39, 1, 12, 3, 20, -1, -79, -18, 74, -18, -8, -7, 19, 13, -12, -34, -17, 0, 10, 1, 29, -17, 2, -2, 18, 3, -8, -39, 10, -18, 41, 1, 19, 21, 1, -48, 12, 15, -13, 25, 13, -52, -19, 30, -7, -50, -29, -12, -2, 29, 16, 1, -18, -24, 6, 8, -27, 9, -3, 11, 0, 10, 3, -2, +30, 2, 11, 5, 21, -58, 5, 16, -9, -7, 7, 9, -29, -1, -14, -21, 3, 7, -33, -49, 5, 32, -27, -65, -67, -16, -71, 28, -82, 21, -10, -21, 10, 4, 49, 20, 26, -58, 1, -63, 5, -3, -20, 19, -40, -26, -19, 39, -30, -1, -12, -14, 59, -13, -30, -2, -58, -3, 16, -50, -7, 47, -4, 73, 31, 0, 6, -11, -2, -16, -21, 18, -42, 50, -15, -55, -59, 32, -39, -3, 24, +-13, -2, 3, 127, -19, 38, -29, 13, 36, -33, -11, 8, -7, -28, 36, -15, -3, -1, -40, 32, -45, -52, -23, 0, 32, -43, -20, 30, -22, -56, -41, 6, 4, -26, -2, 2, -49, -13, 1, 61, 12, -20, 104, -25, -9, -12, -51, -30, 8, -5, -44, 16, -40, 48, 66, 4, 1, 60, -26, 14, -35, 7, 43, 8, 20, 68, -1, 32, -32, 35, -2, -24, -26, -22, -49, -14, 10, -1, 58, 19, 33, +-3, -27, 5, -24, -32, 25, 6, 6, 9, 10, -11, 56, -37, 7, -1, -6, -43, -8, 56, 8, -38, -21, 32, -4, 31, -11, 24, -17, -41, -17, -11, 25, 24, -58, -4, -100, -43, -29, -49, -19, 3, 15, 64, 4, 16, 16, 21, 10, -32, 26, 12, -47, 12, -37, -4, -7, -18, -15, -10, -21, 4, 13, 17, 9, 21, -16, 46, -59, -12, 4, 63, -26, -10, -23, 24, 13, 1, -3, -13, 0, -20, +-43, 4, -1, -33, 11, 2, 24, -21, 25, 29, -20, 6, -1, 3, 38, 22, -11, 10, -58, -30, 21, 31, -24, 6, -22, 9, -25, 5, -4, -2, -9, -68, 16, -25, 64, 28, 21, -15, 30, -14, 15, -42, 0, 6, 22, 5, -25, -1, 18, -32, -19, -32, -14, 50, 41, 31, 29, 36, 47, -14, 29, -5, 54, 20, -34, -26, 37, -36, -21, -35, -5, -15, -6, -28, 15, -39, 26, -34, -17, 12, 5, +13, -30, -18, -3, -49, 30, 12, 57, -9, 41, -17, 31, -60, -74, -27, 7, -65, 8, 85, -1, -1, 47, 4, 7, -35, -17, 73, 13, 29, 22, -45, -4, 74, -11, -18, 12, 5, 30, -22, 41, 19, -15, -44, 3, -34, -8, -20, 13, -27, -6, 56, 11, 6, -6, -35, -5, -3, 5, -19, 21, -16, 11, 35, -37, 40, -5, -67, 3, -26, 36, 28, -44, 31, -1, 27, 9, -17, 56, 29, -21, 108, +-35, -55, 11, -20, 1, 7, -15, -14, 37, 36, -61, -3, -14, 29, -16, 11, 35, 16, 1, -31, 14, 3, -6, 42, -51, 12, 10, -13, -42, 11, -3, -18, 83, 32, -44, -14, 11, -23, 32, 2, -8, -21, -13, -15, 5, -21, 44, 15, -6, -26, 16, 59, 19, -29, -3, -30, -65, 41, 21, 40, -47, -36, 12, 34, 5, 35, -6, 37, -7, 2, 15, 30, -1, -8, -7, 9, -1, -7, 24, -20, 7, +-36, 7, -22, 1, -9, 8, -9, -20, -10, -40, 13, 12, 19, -10, -18, -2, -16, -44, 4, 11, -5, 21, -28, -18, -15, -19, 2, -16, 7, 0, -12, -8, -14, -14, -17, 15, 33, -41, 32, -18, 15, -40, 16, 23, -16, 37, 34, 21, 20, -62, 14, -27, -3, -30, -8, 27, -6, 17, 3, 76, 2, -58, -20, -19, -5, -18, 11, 4, -1, 1, -14, 13, -7, 22, -63, 3, -48, 0, -127, 26, -8, +-53, 87, -3, 54, -3, 50, -24, -3, -19, 24, 30, 17, 33, 10, 11, -42, 30, 7, 29, 0, -13, 49, -37, 51, 12, -16, 6, -10, -12, -10, -35, 9, 7, 0, 28, 12, -57, 39, -13, 1, 8, 63, 3, -1, 8, 25, 38, -104, -37, 1, 19, -29, 43, 16, -7, -29, 43, -67, 22, 13, 13, -36, 7, -28, -20, 17, 8, 19, 38, -39, -23, -44, -26, 7, -6, 33, 50, 26, -3, -8, -1, +14, -14, 11, 28, -30, -28, 15, 71, 33, -24, -7, 25, 61, -75, 27, 27, 22, 10, -21, 35, -19, 10, -4, -7, 16, 1, 10, 44, -21, -9, 64, 5, -18, 5, 3, -57, 0, -56, -4, 40, -15, -21, -2, 4, -49, -6, 53, -3, -67, 48, -90, -3, -32, -23, -13, 22, 9, 2, -4, 1, -35, 81, 21, -6, -90, 25, -4, -47, 27, -50, 21, -1, -48, 59, -40, -10, 37, 9, -34, -7, 37, +-26, -38, 12, 33, 35, 11, -41, -16, 3, 9, -25, 24, -4, -43, 8, -72, 3, -21, 8, 20, -17, -23, 13, 2, -2, -34, -4, 12, -5, -33, -12, -8, -127, -11, 36, -12, 10, 12, -20, 9, 38, -19, -6, -10, -4, 11, -25, -6, 12, -1, -23, 12, 39, -24, 18, -29, -14, -54, -21, 3, 10, 8, -39, 2, 13, 18, 11, 37, 79, -25, 71, -112, -23, 35, 65, -33, 46, 34, 0, -65, -57, +-12, 4, 0, -19, -4, 15, 14, -15, -58, 19, -9, 2, 41, -14, 39, 4, 56, 41, -34, -15, -6, 28, -127, 18, 24, 37, 35, -46, 11, 0, -51, -39, 23, -13, -78, 1, 40, 5, 3, -9, -28, 2, 32, 30, -1, -27, -37, -19, -18, -54, 63, -3, -4, 11, 44, 30, -32, -34, 4, 42, 49, 0, 20, 62, 24, 14, -9, 7, 25, -21, 10, -8, 51, -18, 8, 8, -4, 26, -32, -10, -47, +-41, 1, -56, -1, -34, -40, -39, -19, 1, 1, 10, -1, 0, -25, 28, -16, -9, -10, 2, -35, 25, -2, 3, -47, -31, -13, 78, 50, -40, 77, 0, 58, 17, 19, 45, 2, -33, -119, -107, -64, -10, 54, -15, 10, 0, 2, -27, -20, 4, -65, 4, 76, -4, -27, 0, 47, 2, -12, 17, -28, -7, -55, -12, 36, -13, 9, 13, -9, -9, -42, 0, 43, 0, -61, 41, -4, 0, -35, -30, 21, 21, +32, -5, -5, 8, -32, -3, -24, 9, 6, -37, -2, 34, -13, 10, 18, -28, -2, 13, 9, -6, -127, -2, -47, -2, -34, -7, -18, 0, -12, -5, -43, 12, -29, 7, -18, 28, -58, 4, -4, 10, -6, -10, 7, 13, 14, -22, -2, -1, -4, -27, -3, 0, -56, -17, -4, -1, 24, 16, 23, 0, 30, -33, 18, 7, 3, 3, -18, 9, -16, -6, 9, -11, 15, -27, 37, -7, -55, 35, -23, 31, 73, +21, -24, -38, -79, -36, 21, -44, -10, 6, -59, 0, 28, 7, 50, -11, 0, -10, 41, 26, 43, -22, -24, 10, -5, 71, 19, -25, -40, 15, -21, 12, -20, -40, -23, -74, -88, -40, -17, -8, 13, 12, -27, 0, 26, 81, 28, 12, -12, -9, -29, 10, -97, 8, -6, 29, 45, -7, 34, 20, -14, 25, 10, -36, -9, -23, -15, -17, -126, 5, -34, 12, 64, 20, 3, 0, -23, 39, -16, 49, -20, -19, +-63, -13, 27, 15, 97, -13, -15, -43, 0, -8, -1, 29, -19, 38, 1, -45, -21, 1, -127, -15, -14, 7, 38, -10, -4, 0, -37, 6, -28, 4, 37, -10, -21, -12, -37, 16, 8, 13, -17, -10, 14, -41, -16, -11, -25, 3, 16, 28, 8, -36, -77, -55, 57, 40, 17, 7, -61, 0, -12, 29, 16, -26, -127, 6, -35, -11, -20, 2, -16, -10, -29, -9, 32, 33, -10, 6, -38, 15, 2, 34, 1, +16, -76, -3, 30, -40, -78, 0, -49, 0, 32, -5, -67, 48, 12, -1, 82, 17, 14, 52, 12, -3, -58, -8, 5, 7, -3, -39, -19, -6, -7, 37, 0, -10, -69, -34, 10, -9, 8, 50, 2, 0, 8, 10, 9, 19, -12, -6, -12, -29, -1, -5, 17, -11, 3, -26, -5, -2, -31, 14, -12, 13, -23, 23, -2, 27, -62, -11, 35, -28, -1, -41, 33, 0, -25, 43, -24, -9, 2, 6, 1, 1, +-17, -34, -18, -45, -6, 63, -23, 24, 2, 15, -18, -2, 14, -74, 22, -19, 6, -23, -31, -28, -36, 14, -2, -17, -30, -57, -13, -22, -15, -27, 7, -32, 24, -62, -30, -40, 16, -4, 12, 21, 3, 25, 36, 49, -18, 19, 17, 17, 38, 87, -28, 6, -25, -33, 34, -27, 26, -44, -6, -14, 12, 42, 6, 11, -57, 18, 8, 49, -127, -7, 32, 55, -33, -31, 47, -15, 27, 15, -8, 11, -93, +34, 5, -35, -24, -7, -41, -56, 16, 6, -18, 9, -16, 7, -2, 14, -30, -37, 15, -33, 3, -19, 13, 12, -13, 43, 18, 6, -6, 6, -1, -62, -34, -47, 10, -21, 24, 37, 4, 77, -16, 15, -25, -12, -10, 12, 20, -42, 13, 6, -11, -2, -15, -28, 41, 44, -26, 1, -4, -59, -10, 28, 9, 4, 8, -34, 13, 10, 33, -2, -19, 13, -12, -49, -21, 45, -123, 21, 11, 5, -20, 11, +33, -17, 9, -19, -57, -13, 82, -38, 4, 86, 0, 10, -11, -33, 3, 3, 25, 4, 67, -3, 46, 8, 3, -92, 0, -27, -21, -25, -53, -97, 17, 32, -1, 31, -12, -15, -15, 3, 7, 28, 53, -48, 22, 8, 1, 3, -8, 7, -1, -31, 26, -10, -6, 14, -2, 44, -30, -3, 21, -8, -26, -11, -37, -11, 8, 12, 9, 4, -39, -32, -9, -41, 7, 13, -2, 10, 5, 8, 7, -3, -9, +21, -44, -7, -57, 22, 7, -32, -6, 14, 5, -19, -5, 24, 23, 34, 64, 29, -1, -32, 37, 56, 95, 121, -47, 20, -50, -42, -1, 12, 36, -36, -32, -7, -30, -29, -36, -23, 24, 92, 36, 3, -40, 59, 75, -32, 17, -23, 12, -65, 44, 2, -6, -72, -14, -40, 3, 69, 9, -22, -1, -10, -18, 37, -38, 40, -15, 54, -62, 25, -74, -47, -16, 20, -42, 21, -21, 9, -52, -44, -8, 47, +-22, -32, -31, 37, 24, -83, 43, 43, 13, -5, -51, 11, -10, -18, -4, -4, 45, 2, -18, 59, -54, -76, -8, 26, 15, -19, -18, 24, -56, 21, -28, -6, 70, 38, 2, -37, 40, 46, 59, 36, 22, 30, 11, -17, -8, 15, 23, -44, -79, 13, 42, 44, -3, -35, 4, 38, -15, 11, 45, 74, -52, 12, 29, 21, -38, -19, -1, 27, -55, -23, 9, -15, -29, -6, -11, -30, -36, -44, -10, 5, 23, +-40, 10, 42, 23, -23, -17, 39, -21, 15, -16, -83, -38, 36, -16, 35, 28, -30, -17, 33, -34, -11, 127, 15, -7, -3, 55, 34, 4, -14, -35, 6, -49, -27, -30, 21, -22, 24, -23, -8, 38, 24, -14, -3, 19, 9, -14, -36, -31, 47, -20, -16, -12, 17, 36, 13, -23, -27, -14, 25, -18, 26, -35, -15, 0, -4, -84, 12, 49, -7, 17, -33, 13, 14, -39, -20, -2, 17, 7, -62, -8, -27, +-18, 19, -80, -37, -40, -4, 11, -28, 75, -3, -4, 22, -22, 21, 1, 7, 50, 64, -28, -10, -50, 30, -9, -9, 91, 50, 7, -31, -5, -40, -47, 4, 27, 8, 11, 45, 18, -33, 11, -11, 29, -64, -44, 4, -28, 6, -24, 62, -3, 93, 10, 3, 32, 23, -13, 16, -3, -5, 36, -12, -34, -14, -27, 22, 8, 14, 0, 27, -15, -11, -15, 0, 18, 8, -54, -54, 10, 17, -20, 17, 32, +-6, 25, -4, 85, 46, 31, 43, 27, 59, 22, -4, -25, -42, -39, 56, 27, -39, -8, -10, 9, 82, -21, 26, -10, -15, -37, -1, -18, -14, 12, 48, 8, -19, 6, -34, 20, 42, -14, 34, -4, -23, 17, 1, -39, 7, -43, 1, 1, -1, -18, -30, 21, -84, -12, 20, 4, -27, 38, -55, -9, -8, 8, 1, 25, 6, -4, -10, -15, -3, 15, 11, -16, 10, 46, 25, 4, -60, 11, -8, 31, -34, +-40, -22, -28, -20, -48, -30, 1, -47, 4, -60, 30, -33, 9, -8, 52, -4, -45, -5, -67, -12, 27, 66, -32, 4, 70, 0, -73, -34, -127, -18, -3, -26, 12, 50, 2, -49, 6, 9, 11, 15, 36, -42, 69, -13, 16, 47, 105, 17, 17, 2, 26, 10, -14, -60, -2, -1, 39, 20, -32, -50, -33, -33, -36, -64, 21, 26, 15, -33, -32, -7, 28, -17, -9, -26, 10, -43, 9, -17, 42, 13, 12, +-10, -22, 0, 26, -4, -5, 14, 19, 0, 0, 27, -33, -16, 10, -8, 14, -61, 4, -21, -2, 26, -15, -8, 7, 22, 1, 29, -8, -31, 30, 40, 23, -19, 15, -24, -4, -17, 17, -12, 30, -2, -27, -33, -76, 2, 14, -15, 37, -48, -6, -52, 1, -38, 1, -8, -12, -18, 2, -15, -5, -37, -27, 35, -48, -17, 43, -34, 90, 35, 3, 36, 65, -52, 45, 36, -105, -75, 15, -49, -4, 2, +-7, -101, 36, 15, 45, -2, -6, -3, 24, -53, 41, -88, -13, 36, 37, 39, -15, -48, -22, -40, -5, -14, 66, 32, 28, 12, -71, 7, -11, -33, 21, 15, 3, -80, 23, 42, -36, -23, -59, 51, -9, 8, 5, 40, -51, -52, 10, 7, -27, -13, -1, -6, -24, -19, 52, -13, -17, -53, -53, 4, -37, -54, 0, 67, -12, 4, -27, 44, 3, -16, -7, 8, -8, -22, -9, 11, -66, 6, -27, 14, -58, +37, -18, 36, 7, -4, 34, 8, -31, 3, -105, 27, 2, 67, 68, 16, -10, -39, -26, -17, 2, -15, 24, 23, -37, -31, 15, -18, -19, -28, 36, 25, 34, 42, -15, 64, 16, 6, 35, 15, -30, 40, -21, -42, 67, -26, -14, 25, -32, 50, -28, 68, -4, -11, 76, -59, -14, 46, 24, 13, -49, -22, -23, 9, 28, -21, 3, 10, -12, -12, 8, 4, -43, -31, -67, 3, -20, -10, 24, -15, -12, -71, +15, 18, -11, 42, 52, -24, 22, -11, 9, 3, -3, 6, 9, 27, 4, -39, 11, -1, 22, 14, 31, 17, -28, -51, -53, -4, -27, -17, -3, -13, -4, -9, -16, 2, 18, -19, -14, 25, 6, -31, -6, 22, 30, 29, -6, -16, -9, -32, -8, -16, 3, 4, 35, 19, -65, 1, -39, -2, 18, -95, -33, -1, -25, -32, -9, -16, -2, -13, -40, 9, 14, -25, -56, -5, 0, -9, -18, 17, -82, 7, -40, +1, 15, -4, -7, 9, -89, -14, 7, -16, -48, -36, -91, 15, 2, -20, 48, -14, -32, -16, 43, -23, 18, 6, 75, 3, 1, -3, -9, 20, -111, -31, -7, -19, -16, -27, -39, -18, 3, -64, -38, -13, -28, -7, 11, 14, -23, -1, -14, 0, -38, 33, 2, 37, -3, 21, -10, -3, 9, -51, -30, 11, -5, 7, 17, 2, -51, 0, 31, 22, -1, 13, -20, 11, -4, 41, -127, 69, 4, -10, -2, -3, +-18, 18, -30, 4, 26, -17, 68, -10, 26, 19, 32, 0, -23, -10, 8, -25, -24, 5, -3, -22, 2, -27, 12, 1, 19, -41, -1, 60, -42, -57, -22, 17, -25, -7, 45, -8, -3, 24, -51, -17, 12, -5, 17, 8, -47, -9, -4, -2, 17, 74, 47, -50, -11, 46, -57, -35, -47, 34, -48, 47, -41, 31, -21, 4, 1, 32, -3, -30, 29, 26, 23, 11, 23, -19, 40, -1, -100, 46, 5, 13, 30, +-4, 27, 17, 2, 19, -11, 16, -20, -18, 15, 1, -11, 20, 49, -10, -16, -3, -29, -14, -6, -10, -14, 0, 12, -39, 7, -28, -97, 1, 3, 14, 7, 13, 15, -33, -31, 11, -1, -127, 11, -10, 25, -37, 6, -30, 36, -3, -7, 43, -13, -8, 9, -5, 15, -2, 24, -10, -1, -2, -20, 7, -34, 24, -15, 11, 17, -55, 20, -127, 7, 49, 15, -32, 4, -25, 4, -2, 45, 18, -8, 52, +40, -37, 36, 43, -90, 13, 0, -35, -9, 37, -73, 9, 10, -18, -15, -26, -40, 18, 87, -39, 38, 27, 22, 20, -4, -34, 24, -74, -21, 5, 27, -50, -14, 54, 62, -4, 1, -25, 17, 23, -64, 33, -116, -14, -19, -26, 58, -19, -19, -24, 40, 41, -11, -111, -60, 35, 33, 6, 16, 5, 7, 7, 0, 29, 8, 21, -3, -5, 11, 18, -1, -14, 14, -40, -120, 13, -9, 5, -33, -7, 26, +1, -21, -56, -8, -3, 24, 4, 3, -16, 27, 33, 17, -7, -38, 5, -18, -33, -12, 33, 23, -9, 1, 1, 57, 20, -70, -27, 67, 20, -1, -50, 29, 7, 20, 41, 19, 20, 24, -100, -35, 85, -60, 63, 20, -7, 0, -2, 54, 35, -30, 4, 3, -3, 5, 10, 14, 0, -48, 32, -18, -60, 11, -14, 38, -49, -9, 45, 30, -24, 1, 19, -63, 27, -45, 47, 1, 27, -44, -14, 18, 4, +5, 10, 31, 55, 8, -29, 19, 9, -118, -47, 1, 16, 5, -21, 20, 1, -12, 3, -53, -3, 33, 9, -36, 11, -25, 40, 16, -22, -26, 3, 11, -20, -17, -11, 1, -6, 31, 10, 66, -13, -127, 52, 0, -34, -13, 32, 70, -4, -10, 13, -6, -8, -4, -22, -45, 10, 23, 21, -7, 6, -6, -7, -40, -19, 1, 7, -39, -16, 6, 23, -25, 19, 12, 15, 1, 4, -16, -18, 53, 19, 66, +-24, 20, -4, -21, 29, -17, -12, 32, 15, 43, 33, 13, -36, -1, -1, 25, -67, 58, -127, -64, -53, -11, 28, -9, 18, -8, 11, -30, -36, -1, 27, 23, -36, 75, -35, 8, -23, -52, 10, 30, -1, 13, -37, -9, -2, -69, -13, -3, -2, 27, 19, -18, -56, 5, 86, -83, -2, 39, -26, -54, 2, 12, -14, -19, 51, -59, -17, 32, -34, 34, 9, -25, 13, -33, -16, 24, -10, 45, 52, 17, -10, +6, 4, 50, 23, 33, 5, 8, -9, 22, -36, -6, 17, -39, 26, -41, 20, -17, -16, -58, -12, -4, -14, -38, 12, 34, -29, 59, 5, -49, -15, 19, -26, 2, 2, -25, 42, 60, -25, 7, -34, 40, -22, -76, 24, -7, -22, -9, -12, 46, -15, -46, 28, -41, 77, 9, -14, -8, -4, 12, 10, -10, -46, 0, -35, 79, 3, -15, 48, 9, -12, -18, 6, -9, 3, -21, -6, -29, 16, -22, 6, -14, +-10, 25, -26, 30, -57, 40, -81, -12, -23, 30, -26, 53, 25, -2, -48, -25, -36, 26, -45, -24, 12, 52, -44, -7, 25, -22, 26, -22, 20, -7, 12, 13, 1, -34, 2, 23, -18, -7, -20, -26, 8, -22, 7, -34, 43, -15, 1, -22, -16, -26, 4, 14, -20, -36, -26, -20, -41, -26, -2, -22, 24, 9, -47, -9, -2, -30, -9, 17, 7, 41, 0, 6, -2, -5, 20, 18, 28, 27, -8, 18, 39, +0, 11, 2, 17, 11, -12, 3, 26, -33, 4, -1, -11, -57, 31, -48, -68, -42, -2, 6, 5, 0, -50, -16, -13, 33, -96, 1, 10, -20, -111, 5, -48, -14, -4, 8, -35, -15, -32, -19, -28, -46, 34, -24, -27, 86, 18, 30, -33, 0, 30, -49, -13, -8, 23, 28, -39, 1, -2, 3, 14, -15, -30, 2, -61, -55, 6, 4, 62, -68, 11, -58, 0, -89, -30, -37, -3, -20, 31, -13, 11, 41, +13, 29, -28, 13, -18, 6, -9, 55, -26, 22, -39, -127, -23, -24, -31, -30, -62, -18, -20, 65, -83, -38, 0, -31, 28, 41, -4, -14, -8, -13, -21, 33, -14, 18, 2, -61, -21, -45, -23, 2, -42, -70, -20, 23, -1, 27, 38, -16, 3, -21, -33, -15, -16, 27, 44, 16, 22, -31, 76, -10, -12, 29, -9, -9, -22, 34, -50, -45, 21, -3, 24, 5, 23, -45, -11, 20, -39, -7, -18, -16, -54, +-89, 40, -37, -58, -18, -34, -8, 13, 0, 1, 2, 54, -2, 15, 80, 9, -21, 14, -1, 47, 3, -10, -6, -4, -38, -11, -25, -2, 11, -17, 1, 22, 14, -86, 30, 59, 34, 1, -71, 5, -14, -19, -23, -4, 51, 5, 31, -17, -58, -17, -6, 15, -1, -24, -25, -12, -10, -29, 12, 9, -19, 1, 0, -20, 28, 6, -20, 13, -4, 7, -38, 30, 51, -8, -37, -9, -6, 2, 30, 7, -1, +6, -3, 23, 64, -34, 10, -15, 31, 29, -56, -6, -9, -5, -30, 22, 29, 21, 40, -39, -3, 19, 3, -9, -16, 8, 17, -10, 26, 5, 27, -61, 11, 4, -28, 1, 2, 2, -26, 29, -22, 27, 8, 14, 13, -6, 68, -4, 25, -19, 22, 7, 3, 9, 0, -4, 14, 20, 10, 23, 7, 3, -11, -16, 13, -8, 3, -11, 9, 34, -10, -7, -7, 11, -15, 7, -7, 5, -19, 0, 19, -9, +10, 25, 3, 2, -3, -5, -11, 23, -79, 31, -41, -68, 31, -16, -72, 0, 20, -19, -31, -28, 4, -53, 35, -11, -26, 57, 2, 4, -3, 9, 1, -62, 53, 21, -14, 20, -9, 1, 5, -48, -11, 2, 1, 0, 12, -21, -13, -10, -10, 18, 21, -27, 7, -11, 89, -22, -54, -16, 3, 12, 12, -63, -19, 12, -5, 41, -73, -6, -8, -3, 3, 10, 16, 11, -23, -10, 2, 9, 11, -5, -8, +13, -24, -37, -16, 36, 31, 5, 12, 3, 24, -10, -30, -8, 14, 20, 12, -21, 32, 31, -1, -15, 30, 11, 20, 30, -9, -45, -29, -32, -40, -2, -9, 19, -11, -18, 1, -10, 18, 9, -42, 12, 17, 28, 49, 2, 35, 38, 39, 39, -15, 63, -37, -68, 21, 2, -23, -42, -70, 27, -89, -3, -3, -3, 28, -1, 6, 4, -29, -32, 38, -40, 13, 0, 46, 1, -8, -27, 9, -70, -50, 72, +46, -32, -32, 5, -57, 48, -15, 8, 65, 34, 44, -15, 21, -31, 3, -9, 29, 16, 9, 41, -55, 25, 58, 3, 13, -27, -2, 15, -62, -74, 7, 5, -35, 61, 56, 20, -3, -23, 21, 11, -47, 55, 20, -5, 88, -42, 8, -14, 2, 25, -59, -72, 84, 15, 7, 22, 6, 4, -56, -39, -22, -24, -24, 33, -17, -22, 76, -10, 17, 31, 31, -4, -14, 5, 39, -7, 38, 6, -22, 16, 6, +18, 12, 20, 19, 33, 6, 13, 2, 49, -16, 7, 48, 22, -41, 41, -35, -7, 13, 1, -1, 13, -37, 46, 4, -14, -17, 24, -5, 6, -12, 15, -16, 5, -6, -51, 3, 54, 11, -53, 18, 33, 7, 4, 6, -30, 5, 32, -16, 3, 11, 54, 9, 68, 15, 2, -60, -20, 16, -19, -81, 5, -42, 56, 2, 96, -31, 33, -14, 9, -47, -8, 28, 28, -2, -2, -17, -53, 40, 22, 35, 29, +-1, -6, 14, 1, -18, 9, -12, 7, 11, -10, -4, 5, 1, 3, -16, 8, 52, -25, 23, 7, -6, 7, 5, 26, -12, 17, 35, 22, -8, 20, -30, -14, 0, -20, 12, -11, 9, 16, 7, -5, -25, 8, -9, -3, -18, 6, 4, 25, -127, -3, 12, -15, -11, 6, 12, 9, 8, -1, -25, 6, -1, 11, -3, -10, 12, -4, -5, 9, -15, 30, 2, -5, 1, -11, -78, -15, -13, -16, -34, -20, -14, +-11, 62, -18, -5, 14, 29, -45, 32, -38, -32, 67, -25, 21, -47, -30, -58, -34, -8, -37, 18, -8, 49, -13, -8, -40, -11, 14, 78, 33, 34, -9, -46, 0, 20, 3, 43, -3, 20, 22, 3, -8, -22, 3, -32, 38, 16, -10, -16, -33, 21, -4, -12, 0, -25, 2, -13, 1, -15, 37, -1, 5, 8, -9, 48, -45, -4, 14, -4, -2, 9, -26, -7, 10, -2, -3, 4, 8, 34, -45, -7, -3, +-6, -15, 7, -35, -57, 27, 3, 18, -7, 28, -10, 4, 9, -14, -45, 12, 4, 17, 4, -10, -1, -26, 5, 14, -8, -8, 4, 1, -8, 3, 10, -24, -8, -24, 22, 28, 8, -35, 25, -42, 3, -1, -33, -16, 31, 8, -36, 28, 7, -7, 10, -23, -10, -52, -91, 7, 83, 1, -19, -33, -14, -48, 34, 62, 1, -16, 7, -21, -34, -22, -8, -15, -30, -33, -9, 20, 4, -1, -19, -44, 13, +13, -8, -17, 21, 56, -44, -28, 3, 12, -24, 4, -7, 27, -8, 38, 27, -3, 46, 9, 18, -8, -3, -3, -9, -27, 3, -38, 28, -20, 21, -9, 9, -1, 7, 19, 5, -24, 5, -34, 0, 5, 15, 4, 6, -32, 5, 9, -16, 23, -31, 1, -93, -10, 2, -50, -4, 7, 16, 75, 15, 9, -7, -40, 34, -5, 5, -18, 18, -20, -7, 18, 38, -1, 9, -17, -53, -11, 20, -45, 14, -34, +-20, 26, -13, -19, 24, -28, 44, 37, 84, 9, -16, 46, 64, 44, -18, -6, -16, 5, -13, 11, 9, -11, -50, -98, 6, 18, -5, 18, 25, -10, 22, -8, -29, -52, -34, 7, 13, -50, -27, 4, -39, 4, -21, -11, -27, -26, -10, 4, 25, -65, 25, -72, -42, 9, -61, -25, 10, -8, -17, 85, -54, 14, 34, -4, -19, -18, -12, -41, -11, -2, -3, 9, 32, -38, 58, 14, -31, 10, -21, -3, 1, +12, -5, -76, -60, 3, -74, -13, 6, -60, -21, -1, 69, 7, -20, 29, -5, 5, 19, 13, 3, -1, -36, -27, 21, -6, -17, -24, 37, 22, 8, -26, 20, 15, 23, -64, 1, -6, -3, -1, 1, -43, -22, 0, 28, 8, -18, 12, 30, -37, -29, -40, -15, -27, -6, -21, -51, 1, 6, 13, 34, 22, 7, -14, -26, -21, 1, -96, -44, -26, 56, -11, -8, 8, -14, 38, 39, -33, 3, -3, -42, -10, +-53, 21, 7, -99, 34, -59, -45, 10, -21, -76, -69, 42, 25, -37, 9, 14, -3, 25, 19, 10, -101, -56, 26, 19, -51, -7, -5, 69, -56, 3, -22, -52, -4, -18, -4, -14, 5, 7, -24, -59, 21, -8, 8, 23, 26, 18, 22, -35, -2, -79, 27, -58, -25, 15, -44, 11, 6, -58, 20, -53, -1, -4, -13, -5, -20, 0, -1, -8, 9, 9, -5, 0, -17, 11, -32, -4, -6, -27, -1, 2, 4, +-20, -19, 26, 0, -26, -9, 5, -15, -25, 3, 25, -4, 0, -2, -47, -70, -66, -49, 72, -75, 23, -61, 22, 37, 37, -1, -15, -21, -37, 8, -73, 18, -78, 18, 9, -30, 2, 9, -17, 15, -90, 63, 31, 3, 13, -32, 35, -18, 29, -4, -17, -3, -58, 40, 56, -35, 20, 18, 26, 17, -45, 16, -27, 63, -61, 11, -23, 9, -29, 37, -10, -33, -25, -60, 10, -10, 31, -12, -5, 4, -2, +-30, -50, 11, -34, 22, -97, -80, 13, -12, -6, 26, 28, -5, 8, 6, 2, -14, -31, 8, 11, 39, 47, 15, -69, -24, 25, -19, -27, 4, -5, -8, -6, 5, -2, -2, 24, 9, -76, -10, 8, 6, -17, 0, 14, -14, 8, 3, 15, 27, 10, 4, 8, -1, -17, -1, -17, 17, -14, 3, 2, 53, -26, -12, 41, 7, -24, 18, 17, -22, -30, 2, -1, 30, 2, 10, 14, 5, -9, -21, 27, 34, +-1, 51, 6, 24, 21, 18, -33, -6, 13, -47, -19, -66, 10, -16, -16, -21, -22, 12, 3, -39, 30, -45, -21, -19, -2, -42, -10, 15, 4, 20, 6, 38, 2, -51, 12, 19, 33, 2, -32, -24, -32, 14, -43, -58, 5, -3, 19, -9, 24, 5, 42, 50, -49, 1, 24, -1, 2, -7, -21, -6, 13, 32, 37, -18, -28, -15, 4, -12, 23, 10, -1, -19, -3, 18, -33, -13, 3, 0, 4, 23, 0, +2, -38, 25, -4, 34, 46, -18, -16, -35, 23, 22, -49, 46, 41, 11, -26, 27, 9, 76, -44, -12, 21, 23, -29, -2, -28, -41, 59, -11, 1, -27, 3, -78, 17, 32, 32, 61, 70, -7, 6, -56, -16, 115, 20, 14, -61, -13, 26, -79, 52, -24, -53, -8, 54, 26, -59, 11, -19, -14, -48, 44, -40, -67, -5, 13, -38, -71, 43, 3, -27, -2, -8, -18, -4, 52, 5, 51, 0, -71, 19, -5, +6, 23, -10, -79, -40, -56, 77, 14, -66, 47, 6, -9, 51, 26, -28, 15, -35, -1, -14, 2, 29, -23, -1, 40, -1, -62, 5, 7, 2, 91, 5, -26, 1, -13, 7, -18, 22, 2, 10, 15, 41, 2, 8, -1, -33, -46, -8, 10, -7, 10, -6, -8, -17, 36, 0, -18, -16, -16, -17, -18, 10, -31, -45, 18, -8, -13, -17, 22, 34, -5, 13, 10, 1, 4, 19, -31, 16, 21, 15, -66, 7, +-12, -5, -36, 18, 3, 17, -29, 9, -4, -19, -12, 12, -3, 11, -8, 37, -14, 50, -11, 13, -10, 0, -67, 39, -93, -10, 13, -9, -19, -116, -3, -5, -8, -21, -63, -11, -22, 17, -34, 66, -37, 19, 116, -3, 2, -35, -24, 12, -70, 1, 18, 11, 7, 34, 19, -16, -19, 13, -29, 2, 41, -27, 9, -51, -64, 16, 12, 2, 18, 14, -20, 23, 13, 8, -6, 41, -54, -22, -10, -3, 9, +-10, 34, 0, -33, 2, 38, -6, 0, -8, 7, 9, 2, 19, -10, 32, 2, -8, 6, -4, 9, -10, 14, 11, 9, -20, -6, -14, 7, 1, -3, 8, -5, -3, 0, -51, 19, -1, 3, -34, 1, 17, 29, 30, -4, 23, 62, -41, -27, 50, -7, 6, 4, 8, -35, 27, 79, 28, -56, -35, 11, -9, 37, 2, -42, -6, -8, 6, -9, 40, -60, -23, -104, -14, -51, -42, -27, -27, 26, -46, -50, -8, +-14, -12, -44, -21, -38, -3, -33, -16, 42, -7, -17, 14, -62, 29, -34, 7, 24, -37, 10, -15, -24, -9, -21, 11, -18, 14, -16, 46, -19, 16, 6, 11, -11, -52, 1, 14, 16, 4, -10, -33, 9, 29, -3, 0, -1, -16, -15, -34, 28, 1, 21, 1, -29, 0, 5, -5, -12, 2, 6, -13, -20, 8, -6, -3, -10, -17, 3, -2, -64, -4, -11, -8, 0, -18, -5, 0, -18, -17, 22, -24, 11, +3, 3, -1, 3, -7, 24, 36, 6, -47, -13, 39, -20, 7, 8, 15, 17, 6, -1, -52, -122, 25, -55, -34, 6, 1, 34, 0, 46, -12, -41, -35, -30, 2, -34, -17, -30, 20, -4, 26, -45, -10, 31, 16, -39, -8, -14, -38, -39, 30, -16, 26, -75, -15, -25, -21, 32, 5, -42, 0, 10, -25, -11, -32, 6, -19, -60, -4, -25, 0, 1, -35, -21, 16, 7, -18, 10, -39, 37, -1, 4, -3, +0, -15, -106, -4, 23, 10, 17, 2, 17, 0, 1, 21, -16, -35, 9, 2, 69, -23, 4, 1, 9, -8, -7, -19, -30, -27, -107, -55, 4, -2, -28, -13, 12, 44, -56, 9, -16, 14, -58, 43, -21, 0, 25, 31, 41, -6, -21, 21, 33, 62, -24, -8, -53, 17, -10, 4, 22, 8, 120, -44, -1, -35, 24, 8, 28, 6, -98, -23, -73, 103, 42, -25, -16, 0, -59, -54, 23, -73, -127, 29, -43, +-18, -13, -8, 63, -13, 17, 64, -4, 20, -49, -48, -23, 16, 20, 12, 5, -9, -100, -68, -3, 56, 0, -56, -26, 0, -46, 35, 0, 87, -32, 9, 16, 30, 20, 26, 20, 17, -19, 21, -10, -58, -2, 32, -28, -23, 28, -55, -12, 82, -127, -34, -14, -76, 18, -70, -12, 0, 22, 88, 32, 64, -26, -9, 14, 30, -63, -6, -42, 8, -7, -12, 1, -3, -53, -13, 9, -8, 26, 2, -24, 12, +-106, -40, 37, -23, 17, -2, -15, 0, -21, -1, -35, 41, 0, -16, -49, 6, -2, -12, -7, 4, 35, -61, -2, -11, 3, 51, 40, -8, -22, -86, -13, -29, -127, 8, 17, -19, -19, 33, 20, 0, 50, -3, 58, 59, -51, 4, -31, 17, 40, -16, -23, -12, 8, -65, 1, -2, 39, 14, 28, -18, 24, 1, -1, 8, -37, 49, -3, 0, -31, 58, -83, 0, -20, -26, 13, -73, -16, 1, -11, -18, 38, +-19, 14, -10, 1, -15, 15, 16, -8, 58, 27, -3, 23, 6, 12, -24, -113, 8, 23, -22, 43, -84, -43, 0, 9, -14, -8, -26, 19, 26, 4, 25, 24, 2, 8, -7, 0, -6, 1, 6, -4, -2, 15, -15, 8, 5, -5, -3, -24, 14, -39, -5, 4, 27, 7, 0, -2, -17, 2, -5, 1, -4, -16, -2, -14, 23, -15, -10, -10, 40, 27, -5, -17, 25, -25, -18, 4, -86, -4, 2, -60, 33, +-63, -50, -28, 40, 34, 0, -41, -12, -50, -41, 23, -1, 37, 35, 27, 9, -40, -10, -55, 11, -15, 7, 10, 20, -32, -10, 0, 18, -9, -5, -89, -48, 3, -5, -19, 54, 26, 0, -29, -15, 15, -12, 21, -10, -27, -4, 3, -55, -11, -1, -100, -64, -1, 4, 41, 37, -2, -8, -18, 44, -4, 24, -35, -3, 4, -56, -13, -10, -4, 39, 3, -22, -5, -12, 8, 5, -22, -2, 6, -6, -6, +24, -73, -5, 8, 8, -12, -17, 4, 6, 1, 2, 6, -127, 0, 23, -4, 34, -13, -6, 9, 4, 21, -6, 1, 29, 15, 3, -14, 14, -2, 38, -13, -30, -19, -6, 50, 6, 57, 10, 56, -13, -25, 5, -24, 11, 23, 68, 23, 28, 16, -46, 12, -68, 30, 103, 0, -2, 85, -21, 63, 7, 18, -12, -18, 33, -13, -11, -21, -9, 61, -23, 0, 1, -7, -33, -19, -13, -4, 7, -33, -9, +13, 19, -127, 10, 2, -37, 23, -5, -12, 29, -26, -32, 2, 45, 24, 6, -28, -30, -67, 57, 61, 30, 16, 3, 0, -24, -9, 16, 27, 14, 0, 23, 0, -2, 13, 1, -91, -14, -11, -9, -8, -31, 49, 35, -23, 16, -29, -31, 46, 0, -33, -34, 19, -33, 7, -58, 19, -1, -7, 24, -16, 38, 12, -20, -13, 18, 0, -78, -40, 37, -24, 11, 36, 0, -2, 39, -26, -1, -105, -69, -60, +-44, -32, -24, -56, -55, 6, -9, 2, 44, -113, -87, 77, 2, -27, -113, -32, -27, 0, 22, 37, -35, -89, 41, 17, 18, 20, -40, -27, -33, -44, 5, -49, 31, -13, -1, -47, 80, 5, -39, -8, -31, 6, -15, -64, -69, -4, -14, 11, -4, -69, -25, 33, -22, 14, -10, 17, -69, -23, -59, -69, -10, -31, -17, 74, -17, 3, 24, -24, 2, -40, -15, -13, 24, -32, 33, 1, -30, -17, -26, 34, -33, +5, -56, 41, 30, -26, 54, -68, 14, -13, -42, 58, -3, 34, 10, 3, -19, -37, -20, -39, 24, -16, -19, -17, -61, -6, 40, -18, -10, 1, -46, 21, -17, -39, -14, 34, -30, 8, -6, -67, -12, 35, 33, -11, -6, -12, 35, 30, 8, 5, 18, -38, -7, -55, 34, 8, -26, -8, 4, 21, 36, 24, -10, 4, -28, -19, 24, -5, -13, -14, 9, -33, 6, 21, -22, -121, -75, 64, -84, 66, 39, -38, +74, 60, -68, 60, 25, 91, 8, 36, -6, 73, -44, 2, 18, 9, -9, -30, -41, -18, 20, 17, 74, -24, -12, -6, 6, -23, 70, 14, 71, 56, -52, 1, 27, 42, -38, -14, 16, 5, 26, -64, 7, -18, 52, 27, 37, 2, -17, 4, 35, -35, -15, -32, 56, -30, 8, -28, -56, 27, 9, 19, 3, -12, -9, -7, -5, -10, 13, -1, 8, -3, -5, 41, 16, -7, -8, 0, -20, 12, -13, -1, 9, +-10, 18, -15, 6, -8, -1, 5, -8, -4, -54, 15, 58, 40, -10, 24, -48, 50, -16, 61, 30, -10, -15, 25, -4, -3, -116, -42, 21, -13, -39, 53, -39, -22, 75, -50, 26, 29, 37, -24, 67, 47, -12, -29, -25, 27, -10, 21, -43, -23, 43, -15, 36, -20, 13, 26, -14, 26, -40, 13, 8, -44, 24, -89, 53, -15, -48, 37, -23, 1, 35, 5, -49, 4, 9, 10, 17, -17, 19, -25, -15, 10, +23, -18, 17, 1, -1, 16, -15, 0, 12, 21, -11, 4, 30, -12, 33, 12, -4, -7, -19, -10, 16, 3, 1, 28, -16, 3, -63, -31, 1, -3, -27, 5, -3, -18, -44, 19, -11, -22, -17, 3, -1, 0, 2, 8, 3, 26, 8, -7, 11, 36, 14, 31, 1, -14, -1, 26, 8, 16, -43, -82, -50, -10, 8, -7, 20, 32, -79, 68, 18, -26, -1, -33, 7, 0, -9, 36, 65, -41, 30, -32, 42, +3, -2, -32, -44, -10, 3, 27, -9, -46, -8, -90, 20, -24, 21, 21, 13, 13, -111, 33, 16, 35, -11, 13, -14, 5, -48, -7, -52, -44, 16, -3, 12, 3, 36, -8, 16, -17, 20, 48, -3, -11, -15, -51, -5, 32, 14, -31, 2, 31, -32, 35, 17, -42, 0, -18, 20, 9, 7, 2, -47, 20, -49, -6, -12, -23, 58, -4, -24, 4, 23, 36, -17, 24, -99, -127, -27, -31, -56, 15, -43, 15, +-62, -17, -5, 36, 7, -38, -5, -2, -42, 10, -33, -12, -14, 15, -3, -13, 25, 41, 4, 33, 5, 25, 9, 3, 1, -3, 39, -13, -45, 17, 38, 24, -25, 4, -14, 33, 12, -2, 41, -75, -48, 32, 42, 49, -13, -11, 27, 34, 38, -38, -8, -4, -6, 82, 22, 5, -16, -119, -74, 60, -9, -2, 4, -18, -5, -7, 29, -51, -28, -26, 15, -32, -25, 1, -11, 35, -44, -43, -20, 127, 19, +40, -42, -17, 4, 34, 5, 5, 35, -80, -31, -14, 41, -43, -4, 2, -61, -7, 2, -6, -18, 24, -17, 7, 7, -8, -17, -38, 3, 21, 26, 28, 57, 6, -7, -14, -37, 48, -3, -16, -25, -43, 29, -36, 0, -19, 0, 34, 2, -6, 16, -23, 24, 17, 27, 14, -1, 15, -60, -63, -11, 31, 15, -14, -11, 2, -8, 16, -5, 35, 9, 38, -44, -60, 22, -72, 25, -1, -51, -9, -16, 45, +-30, -8, 18, 32, 8, -23, 22, -26, -41, 10, -26, 17, -24, -60, 19, -95, -9, 20, -14, 25, -46, -40, -70, 74, 24, 15, -48, 5, 6, 38, -15, 34, 27, -24, 34, 20, 33, 27, 74, 7, 16, -30, 8, -53, -11, 28, -8, 21, -34, 17, -41, 26, 49, -24, -65, -34, 2, 13, 11, 48, 32, -8, -41, -30, -23, 22, -10, 50, -2, -12, 7, 2, -33, 20, 18, 38, -9, -69, 3, 38, -22, +34, -5, 53, 2, 1, 21, -10, 11, -12, -23, -19, -12, -9, -21, -11, -12, -2, 14, -5, 0, -5, 6, 4, 0, 1, 0, 1, 7, -5, 2, 2, -4, -2, 0, 16, 58, -6, -55, -54, 25, 40, -13, -46, -51, -33, -65, 6, -1, 50, 37, 48, -10, 10, 19, -27, -47, 72, 27, 51, -2, 27, -67, -5, 50, 15, -7, 52, -1, 0, -55, -31, 45, -8, 5, 11, -29, 1, -127, 40, -16, -69, +-9, 38, 12, 28, -40, 6, 3, -6, -22, -2, -32, -4, 38, -5, -8, 12, -22, 70, -12, -17, -8, 23, 12, 15, -22, 12, 11, 14, -21, 4, 4, -45, 1, -7, 0, -20, 31, 3, 1, 3, 13, -11, -127, -12, -12, -1, -5, -7, -12, -24, 2, -5, 10, 3, -12, -4, -15, -11, -8, 18, -3, 7, 7, 6, 31, -12, -13, -13, -2, -8, 1, 8, 4, 13, -11, -44, -30, 5, 2, -20, 4, +-20, -50, 28, 6, 12, -4, -6, 54, 17, 25, -24, 26, -25, 3, 28, 48, 10, 21, -3, -15, 31, -8, -11, 56, 47, -45, -127, 6, -6, -21, 10, 44, 19, -21, -11, 24, 3, -15, 9, -17, -14, -1, -11, 18, -13, -20, 18, -16, 4, 5, 10, 2, 21, 9, 14, -2, -6, 30, -42, 2, -27, -8, 32, -11, -21, -46, -41, 55, -2, 4, 6, -7, 16, 6, -20, 7, 19, 3, 7, 38, 0, +-2, -40, 8, 1, 6, 4, 44, -11, -16, -87, -18, -46, -6, -42, 40, -3, 26, -7, -31, -19, 11, 46, 42, 5, -22, -5, -13, -58, -32, -40, 38, -8, -15, 17, -16, -33, -21, 18, 49, 19, -33, -25, -65, 26, 36, 48, 4, 38, 15, -28, -8, -45, -17, -12, -22, -47, -22, 51, -37, 2, 27, -5, -50, -83, -12, -12, 40, -5, -26, 15, 52, -46, -36, -82, 73, 28, 16, 25, 30, 60, 59, +3, 22, 1, -42, -9, -46, 17, 9, 3, -2, -27, -21, -12, 36, 14, -7, 10, 67, 59, -9, 3, -58, -36, -12, -68, 51, 43, 36, 11, 5, 19, 34, -13, 60, -13, -49, 34, 63, -27, -43, 4, -27, -79, 3, -21, 64, 15, -34, -9, 15, -115, 32, 5, -20, 6, 2, -113, 94, -60, -46, 71, 4, -99, 32, -35, -8, 41, -39, 63, 3, 5, -6, -21, -4, 16, -13, 40, 26, 28, -31, -18, +-9, 35, -5, -6, 20, -1, -8, -127, 36, -4, -40, 19, 6, -18, -24, -25, 26, 26, -10, 78, 20, -49, -17, 9, -22, -1, 14, -26, -71, 3, -23, -22, -49, 44, -5, 31, 14, -1, -1, -99, 22, 10, 29, 8, 25, -25, 74, 63, 31, 23, 34, -49, 32, 47, 39, 4, -42, -15, -15, 98, -39, -35, -15, 1, 23, 3, -12, 10, -1, -49, -45, 35, -93, 46, 14, 59, 14, 27, -5, -43, 37, +38, -44, 19, 71, -1, -28, 6, -20, 63, 13, -5, 70, 10, -44, 17, 19, 0, -5, 3, -28, 8, 25, -47, 29, -18, 21, 64, -75, 0, -5, -10, -18, 14, -4, 7, 14, -26, 2, 5, -10, 0, 3, -5, -5, 2, -9, 0, -1, 11, 4, -6, 1, -10, -18, -47, 16, 13, -14, 1, 7, -2, 39, 3, 32, 7, -67, 45, -37, -57, -30, -15, -13, 42, -5, -49, 14, 48, 45, 26, 19, 8, +44, -11, -37, 43, 11, -34, -102, -6, 6, 75, 6, 21, -21, 54, 7, 20, -26, 13, 23, -13, -27, 6, -90, 12, -19, -54, 34, -32, 19, -3, 52, 0, -9, 30, -29, 18, -36, -81, -40, -13, -7, -5, 61, 30, -15, -11, -19, 29, -5, -2, 20, -26, -7, -55, 10, 19, -9, -16, -15, 0, -3, -5, -13, 5, 25, 34, -7, -29, -5, 19, -15, 2, -6, -23, 21, 3, 15, -4, 4, 45, -1, +-6, -5, -19, 7, 7, -64, -40, -6, 41, -25, 6, 2, 2, 3, 11, 20, -17, 40, 4, -2, 19, 30, -11, 5, -16, 6, -7, 24, 36, 11, 30, -7, -38, -26, 4, -31, -26, -52, 55, -15, 3, 3, 4, -5, -56, 3, -19, 16, 32, 52, 45, -10, -45, 30, 24, -24, 8, 33, 43, 7, -43, 21, 33, -1, -2, -23, 23, 14, 29, -24, -8, 15, -16, -23, 2, -11, 13, -9, 1, 4, -16, +-38, -15, -10, -10, 19, -17, -17, 15, 3, -2, -13, 12, -31, -2, -5, -18, -19, -15, -16, -7, 11, -30, -21, 12, 1, -46, 3, -127, -10, 6, 14, -14, 9, -19, -35, 26, 37, 12, 12, -2, 37, -4, -31, 48, 4, 9, 20, -74, 20, -11, -24, 18, 38, -86, -11, 16, -32, -43, -10, 28, -49, -2, -80, -19, -29, 34, -2, -15, 31, 112, 8, -15, 17, -32, -9, -75, 1, 48, 22, 32, 3, +-9, -64, 7, -49, 9, 77, 62, -54, 8, 46, -47, -27, -42, 34, -3, 31, -21, -45, -22, 18, -74, 21, -2, 9, 10, -11, -7, -15, 39, 42, 36, 18, 40, 24, -5, -11, -3, -43, -12, -11, 9, -46, -46, 2, 19, 14, -25, -6, 35, -44, -42, -10, -27, 0, 42, -18, -20, -48, 51, 13, 50, 0, -42, 5, -6, -17, -39, -9, 39, 17, -33, -70, 20, 4, 23, 6, 42, -54, 25, -3, 44, +-26, 6, -42, -54, -2, 21, 44, -16, 8, 28, -26, 31, -26, 24, 0, -27, -39, 53, -17, 5, -12, -30, 0, -29, -1, -24, 15, -14, -3, -22, -26, -5, -60, 35, 33, 60, 30, -31, 20, -20, 7, 45, -8, -42, 27, 55, -6, 36, -39, 59, 44, 27, 22, 22, 10, -17, -38, -45, -12, 4, 19, -13, 11, 4, -21, -24, 32, -15, -11, -43, 40, 19, -29, 40, 66, 17, -3, 26, -26, 26, -37, +10, -127, -24, -56, 27, -41, -9, -111, -88, -4, -45, -1, -38, -24, 17, -56, 15, -50, -42, -47, -8, -25, 37, 17, -18, -24, -60, 8, -17, -10, 31, 11, -13, 27, -17, -33, 6, 22, 19, 26, -127, 19, -18, -16, 2, 7, -32, 41, 73, 63, -94, 5, 2, -11, -9, -17, -10, -21, 16, -6, 11, -3, -10, -28, -18, -17, -9, -11, -9, 5, 3, -23, 1, -16, 5, -6, -2, 13, 11, -1, -17, +5, 14, 1, 5, 11, -24, -22, 38, 9, -15, -10, -21, -41, -15, 91, 45, 18, -34, 35, -9, -10, -21, 26, -54, -13, 25, 47, -15, -78, 35, 33, 36, 3, -127, -13, -14, 35, -6, 8, -64, 34, 32, -20, 8, 27, -3, 2, -4, 5, 14, -15, 7, -64, -10, 6, -19, 48, 8, 1, -71, -8, 34, 52, -15, -10, 11, 12, 29, 34, 19, -96, 36, -27, -14, -25, 21, 56, -34, -27, -27, -13, +2, 36, -10, 8, 30, -9, 35, -2, 34, -55, 6, 29, 15, 38, -37, -20, -16, 4, -45, -6, 0, 52, 7, -69, -10, -50, 33, 10, 48, -17, -9, -19, -70, 19, -22, -16, 10, -63, -32, -31, 22, -38, 56, -4, 25, 9, -13, -50, 51, -42, 12, -51, -26, -2, 16, 9, -1, 34, -7, -23, -66, 17, -7, 10, -20, -40, -31, -14, -19, -9, -55, -42, -7, 69, 10, 8, 33, 8, -78, 29, 35, +51, -17, 76, -13, 52, -36, -25, -59, -29, 41, -20, -12, -18, -29, 28, -9, -12, -2, 32, -23, -14, -49, 14, -4, -22, -19, 12, -9, 34, -75, 20, -57, -7, -11, -24, 46, -39, 30, 2, -8, 46, -15, 22, -64, -25, -5, -21, -8, 0, 4, -51, 33, 14, -81, -22, -8, 34, -21, 41, 51, -83, -10, 83, -6, 9, -14, -11, -47, 3, -11, -15, -5, 15, -21, -1, 16, -29, 10, -13, 29, -12, +-9, 27, -12, -23, -6, -26, 24, 3, 15, 19, -4, 20, -42, 45, -20, -5, -20, 10, 51, 1, 20, 29, 103, 21, 19, 15, -24, 7, -5, 3, -24, 56, -24, -27, 20, -39, 29, -2, -19, -12, 44, -15, 14, -13, -27, 53, 4, 5, -8, -72, -13, -69, -25, 37, -21, 6, 26, 94, -10, 2, 6, 9, -5, -16, -38, -18, -12, -48, 12, 13, 7, -100, 8, -20, 12, -17, 0, 42, 40, 2, 32, +5, 34, -19, -2, 17, 22, 16, -11, 17, -32, -8, -5, 11, 1, 127, 3, -22, 71, -15, 8, -3, 33, -19, 26, 54, 46, 11, 23, 30, -13, 31, -3, 37, -18, -9, 12, 19, -16, -42, -26, -39, -2, 39, -18, -9, -19, -17, 24, -90, -21, -12, 40, 42, -47, 42, -6, 68, -12, -36, 12, 101, 16, -4, 64, -35, 37, -50, 5, -30, 15, 41, 18, 26, 21, 25, 33, 18, 44, -17, 19, -12, +-24, 30, -1, 11, -20, -10, -2, 25, -43, -2, 17, -4, -7, -127, 76, 16, 21, 19, -45, 25, 3, -49, -53, 20, -57, 27, -69, 38, 24, 34, 19, -42, -21, -38, 17, 9, 7, 34, 19, -26, 47, -47, -66, 10, 39, 1, -107, -35, 96, -51, 21, 10, -3, -6, 12, -18, -18, 3, 3, 7, 13, -17, -12, 2, -13, -2, 1, 9, 6, -32, 36, -22, 16, -27, 42, 20, 26, -11, -24, 10, 18, +-36, 2, 17, -32, -84, 1, 42, 24, -17, 11, 54, 11, -49, 19, 7, 23, -30, -23, -4, 19, -5, -4, -47, -84, 1, -19, 28, 25, 5, 43, 18, 21, -22, 14, 21, 8, 127, 36, -10, -33, 9, 18, -5, 10, -6, 26, -8, 11, -48, -30, -16, 0, 53, 32, 123, -22, -19, -52, 41, 10, -29, 14, 39, -14, -25, 4, 37, 16, -17, -32, 37, -22, 11, -19, -19, -16, -40, -7, -58, 12, 25, +-6, 24, 6, -4, 25, -37, 13, 5, 37, 63, -5, 8, -9, -104, -69, -13, -63, -12, -61, -7, 1, 6, 1, -34, 0, -15, 34, -23, 39, -19, -4, 28, 26, 23, -15, -62, 28, 6, -34, 6, 2, 4, 0, 32, -9, -27, 36, 18, 63, -22, 55, -72, -4, 23, -48, 0, -45, -44, -52, -1, 32, -9, 37, 23, -15, -6, -12, -51, 8, 31, 29, 37, 14, -11, -16, -43, -78, 15, -92, 20, -6, +-2, -52, 22, 21, -13, -17, 85, -34, -3, -3, 31, 20, -45, 33, 19, 38, -33, 13, 83, -32, 61, 70, -9, 59, 40, 112, -49, 50, -3, -33, 15, 45, -40, -23, -21, 12, -47, -6, -1, 35, 9, 33, 4, -127, -36, -15, 2, 12, -10, 37, 121, -1, -8, -10, 13, -26, -15, 32, -30, -20, 26, -36, -27, -39, -37, -17, -64, 34, -51, 42, 24, -1, -17, -14, 11, -1, -28, 28, -29, -25, -12, +25, -41, -34, -4, 111, -44, 19, -4, 53, -21, -71, -45, -2, -8, 5, -39, -21, -1, 10, -19, -12, 7, -3, 13, -5, 5, 1, -56, -9, -18, -14, -70, -24, -53, -28, -8, 5, -14, 17, 15, -26, 16, -27, -13, -16, 16, -72, -52, 33, -19, 25, -18, 0, 9, -19, -12, -16, 1, -25, 38, 14, 7, 15, 5, 39, -15, -34, -15, 12, 0, -6, -2, 15, 11, -24, 1, -18, 50, -41, -127, -31, +-4, 3, 8, 37, -69, 18, -16, -18, 9, -38, 40, -1, -12, 38, -43, 9, -35, -25, 64, -32, -57, 11, 8, 13, -19, 43, -7, 9, 39, -38, -92, 46, -57, 36, -60, -36, 30, -56, 65, 65, 20, -15, -13, 7, -38, 17, -1, -3, -27, -27, 15, 17, 3, -37, 7, -36, -29, 55, -2, 10, 6, -46, -27, -41, -38, -59, -20, -9, 22, 14, 12, -7, -7, 51, 36, 43, 2, 24, -24, 42, -127, +-65, -57, 38, -6, -27, -40, 4, -1, 72, -30, 15, 19, 25, 4, -13, -13, 37, -12, -16, -5, 21, -53, -12, 15, 31, -5, -38, 14, 17, -12, 28, -3, -9, -15, -40, 6, 37, 11, -10, -12, -13, 18, 2, -15, -9, -127, 10, -58, -10, -4, 1, 49, -38, 30, 18, -7, 7, 36, -19, 10, 29, 7, 62, -22, 1, 42, 34, 55, 0, -49, -6, 31, -79, 19, -52, -7, -7, -17, 13, 7, 16, +-24, -23, 17, 34, -23, -6, 17, 6, 21, -4, 32, 4, -29, 48, -47, 14, -8, 8, -98, -4, -9, 32, 21, 9, 17, -6, 30, -71, 2, 37, -39, 34, -6, 121, 31, 64, -11, -23, -16, 25, -31, 16, 19, 3, -43, 41, -13, 30, -4, -9, 23, 84, -8, -35, -56, -79, -30, -65, -28, 25, -44, -17, -16, -13, -52, -15, 6, -45, 21, -23, 9, 15, -9, -21, -10, -19, 3, 5, -33, -33, 5, +30, -9, 13, 30, -12, -9, 4, -22, -47, -28, -15, 33, 55, 43, -24, 17, 3, 15, -19, 46, -31, -17, 18, 49, 76, 17, 30, -21, 19, 30, -74, 83, -25, -76, 28, 19, 12, -12, 33, 24, -25, 18, -18, -5, -73, -30, -33, -11, -40, -10, -10, 17, 41, -8, -22, 10, 22, 24, -12, 23, 23, -13, 51, -10, -26, 18, 8, -39, 12, -69, 14, 45, 6, -18, 50, -16, -4, -19, -28, 10, -43, +-49, -44, -16, -123, 71, -18, 47, 8, 49, 16, 48, -5, -65, 11, 17, 24, 11, 2, -45, 16, -47, 7, 22, 42, 6, 31, 34, 22, 12, 10, -30, 11, 41, -23, -26, -38, -22, 13, -32, -53, -17, -18, 56, 54, -18, 45, -53, 31, 23, 75, -112, 6, -11, 68, 101, 94, -13, -74, -15, -36, 9, -7, -3, -26, -18, -36, -65, 43, -57, -28, -24, 11, -6, -3, -26, 68, -6, -1, -14, -1, 23, +6, 18, -12, 52, 36, -37, -13, 19, -7, -28, 11, -57, -50, 21, -20, -19, -9, 17, -11, 13, 1, -28, -3, -12, -34, -26, -28, -24, 6, 6, 26, -4, -38, 30, -29, -20, 1, -2, -35, 60, 13, -29, -34, -6, -11, -7, -23, -10, -16, -2, -62, -30, 46, -16, 9, -26, -24, -31, -33, -11, 39, 13, -34, 23, 8, 23, 20, 17, 54, -44, -25, 9, 41, -4, -20, 11, 67, 4, -18, 9, 5, +-63, -46, -18, 8, 0, 18, 38, -9, -8, -33, 42, 38, 34, -12, 15, 53, 0, -1, -33, -40, 30, -26, -29, 7, 7, 79, -9, -25, -34, -12, 10, 1, -29, -32, 7, 5, 9, 18, 14, 9, -42, -21, 4, -27, 13, -9, 28, 25, 25, -56, -21, -6, 0, 53, 38, 9, -5, 1, -65, -59, -11, -35, 46, 35, 37, -14, -30, -21, 35, 53, -74, -1, 2, -21, 0, -63, 25, 23, 37, -43, 8, +8, 88, -36, -124, -36, -65, 20, 67, -22, -33, 56, 23, 37, -35, -33, 17, -102, 60, 0, -25, 4, 33, -18, 10, -11, -12, -126, 21, 37, -35, 26, -21, 1, -9, -36, -25, -4, -46, -4, -27, 1, 3, 59, -8, -11, -18, -9, 13, -57, -9, 21, 23, 32, 17, 67, 5, -13, 2, 6, 5, -22, -2, 65, -33, 11, 23, -46, 6, 21, -8, -30, -44, -36, -30, -40, -31, 32, 13, 56, -77, 2, +76, 43, 9, 13, -62, 42, 13, 7, -4, 11, -5, -11, 32, 71, 5, -76, 20, 51, 60, -50, 67, -49, 3, -30, -16, -70, 1, 49, 37, -11, 26, -19, 2, -8, 7, 14, 5, 6, 1, 3, 43, -51, 19, -31, 27, -10, 11, 15, 87, -28, 15, 33, 25, -28, 26, -27, -21, -127, 18, -1, -9, 48, 77, 18, -6, -66, -13, -20, -16, 31, 40, -10, 34, -98, -14, 9, 20, 2, 12, 2, -86, +-41, 42, 9, -70, 16, -51, 18, -48, 49, -16, 16, -8, 25, -54, -40, 27, -20, 25, 1, -29, -48, 14, -34, 12, -65, 20, -74, 7, -33, -3, -4, 5, 11, -9, 11, 17, 2, -36, -85, -61, 30, -37, -8, -51, 14, -15, 16, -32, 1, 14, -21, -29, 31, 3, 9, 26, -26, -11, 36, 5, -14, 3, 22, -8, 67, -12, 14, 4, -3, 6, 5, 13, 21, -28, -54, -2, -42, -14, 0, 57, -1, +-13, -127, -20, -10, 41, -26, -21, 15, 0, 10, -40, 1, -12, 16, 6, -25, -11, -3, -9, -73, -41, -18, 62, -27, -67, -51, -36, -41, -54, -3, 65, 8, -16, 27, 23, 2, 3, 26, -48, -61, 0, -24, 16, -47, 62, -8, -2, -59, -12, 3, -17, 15, 49, -127, -34, 47, 3, -43, -36, -49, 8, -22, 36, 27, -30, -24, 83, 6, 52, 2, 12, -48, 0, 13, 55, -52, 20, 13, 26, 43, 0, +39, 14, 26, 23, -18, 24, -7, -19, 3, -3, -19, -31, 65, 42, -22, -4, -10, -9, -9, -52, -21, -5, 31, 0, -12, 29, -54, -20, 8, -13, -45, 31, -25, 15, -45, -20, -36, -8, -38, -12, 43, 24, 27, 29, 38, 48, -10, 41, -127, -11, -57, 84, 70, -33, -4, 0, 5, 13, -4, 18, -2, -12, -92, 20, -36, -10, 24, 12, 28, -20, 19, -44, -10, 1, -24, 9, -1, -30, 0, -88, -88, +-39, -5, -31, -55, -33, 2, 0, -5, 17, -40, 20, 6, 3, 14, 18, 33, 29, -13, 23, 6, -62, 1, 38, -10, 66, 18, 19, -1, -3, 12, -5, -48, -75, 15, 13, 6, -56, -43, 0, -6, 3, -8, 9, -8, 7, -48, 21, -6, 24, 36, 19, 0, 26, -97, -27, 0, -19, -16, 3, 59, 2, -3, -45, -43, -52, -25, -11, 10, 21, -5, 0, -37, 47, 29, 21, 40, 0, -51, -21, 34, 7, +7, 49, -29, -67, -10, -23, 67, 26, -50, -32, -37, -4, -20, 0, -112, 53, -10, -60, 24, -21, -2, 0, -68, 23, 43, -62, -19, -9, -65, -6, 22, -18, 1, -27, -6, 72, 12, 70, 17, -43, -119, -14, 39, 54, -13, -26, -86, 37, -59, 12, -71, -4, -15, 0, 51, 38, 4, 14, 15, -12, -89, -5, -32, -1, -72, 5, -16, -1, 11, 5, 9, 5, 9, -26, -96, -37, 3, -43, -67, -9, -6, +-9, 6, 6, 12, 0, -45, 60, 14, 50, -48, 8, -35, 6, -25, -8, -41, -11, -14, 23, -22, -3, 12, -23, -15, -22, 17, -63, 10, 43, -90, 45, 50, -31, 38, 46, -4, 0, 38, -61, -26, -13, 0, 0, -11, -6, 87, 0, -3, 6, -11, 5, 6, 8, -21, 21, 16, -5, 9, -9, -18, -33, -80, -5, 25, -9, -1, 27, 50, 0, -86, -25, 9, 7, 0, -22, -34, -15, 0, -19, -19, 16, +-27, 17, 36, 2, 9, 23, -28, 29, -4, -14, -8, -14, -30, 28, 37, -65, -7, -50, -99, 0, -58, -32, -9, -77, 5, 8, -28, -12, 5, -21, -57, 17, -52, 49, -16, -38, 5, 8, 16, 4, -23, 21, -19, -49, -59, 32, 29, 26, -9, -55, -29, 0, 14, -23, 18, 7, 49, 1, -65, -33, 42, 12, 7, -32, -20, -18, -40, 11, -84, -38, -25, -54, 29, -22, 18, 64, -103, 95, -68, -25, 72, +1, -16, 0, 18, 22, -38, 96, -81, 4, -5, -22, -41, -2, 35, -44, -27, -65, -69, -39, 34, 46, -73, -24, -6, 0, 8, 4, 13, 12, 17, 24, -20, -28, 42, 38, 10, 33, -15, 18, -8, 22, -35, 16, 13, -92, 6, 71, 42, -33, 23, 44, 64, -11, 47, 13, 127, -26, -8, -50, 19, -27, 29, -38, -26, 31, 27, 25, -6, -4, -22, 2, -43, 4, -62, -36, -50, -3, -40, -27, 28, -57, +-4, 1, -11, -1, -1, -30, 33, 64, -26, 23, -21, -20, -5, -21, -101, -28, 43, -20, 29, 34, -70, -57, 6, -12, -75, 18, -24, 17, 5, -33, -7, 26, -21, -26, -52, -42, 7, -8, 57, 25, 2, -37, 34, 4, -31, -21, -39, 8, -27, 40, -8, 16, -1, 69, 32, 15, -40, -5, -33, -5, 50, -16, 10, 33, 54, 30, 85, -42, -38, 42, -3, -45, 23, 30, 3, -30, -17, 17, 20, 9, -13, +12, -1, 75, -6, 55, -42, -89, 9, -8, -64, -29, 12, -4, 56, -3, -36, 38, 14, -38, -30, -25, 0, 27, 4, -13, -9, 24, 2, -23, -9, 53, -14, -18, 7, 2, -35, 18, -127, -31, -7, 13, -8, -79, 0, -39, -7, 19, 4, 7, 52, 3, -2, 11, 18, 10, 5, -59, 28, 4, -28, -46, -14, 19, -67, 17, -7, 12, -2, 17, 13, 0, 33, 61, 33, -10, -30, 50, 10, -25, -29, 10, +32, 22, -35, -53, 15, 5, 1, -24, -25, 48, 12, 72, -8, -21, -32, 10, -49, -31, 25, 21, -37, -17, -31, 26, 40, 17, -22, -2, -79, -75, 4, 6, 38, 87, -52, 41, 24, -48, 24, -74, -5, -17, -8, 27, -15, 28, -26, 41, -8, 56, -13, 5, 37, 1, 39, -75, 16, -1, -45, 66, -8, 37, -126, -18, -26, 15, 7, -29, -10, 7, -43, -49, -15, 54, -10, 47, 3, -15, -102, 62, 34, +39, -29, 22, -28, 79, 44, 22, -2, -9, 28, 5, 27, 5, 7, 29, 54, -67, -12, -33, 4, 20, -6, 1, -28, 45, 12, -7, -16, -36, 21, -12, -19, -24, -27, 3, -9, 6, 23, -23, 38, -84, -12, -2, 11, 46, 12, 39, -23, -27, -33, -39, -2, -67, 29, -5, -83, -13, -37, 58, -32, 21, 38, -47, -54, -48, 59, -22, -4, 14, 3, -99, -30, 26, 65, 16, 37, 58, -47, -29, -13, -15, +-3, -20, -20, -7, -21, -53, 11, 42, 34, -32, 17, -9, -33, -25, 24, -21, -12, -19, -36, -27, -7, 74, 0, -51, -48, -16, 16, 65, 87, -38, -84, 11, -34, -31, -23, -23, 16, -2, 66, -69, -9, 67, 10, 5, 21, 38, 50, -28, -42, -6, 27, 55, 76, -20, 25, 52, 26, 36, -3, 5, -42, -1, -6, 9, 56, 8, 66, -5, -14, -27, -1, -53, 23, 17, -8, -22, 11, 49, -49, 32, -11, +40, -3, -105, 13, 65, -49, -1, -2, -70, -10, 20, -19, -39, 47, 6, 25, -35, 28, 43, 1, -4, 33, 31, -24, 73, -20, 30, 31, -2, -17, -32, -38, 27, -22, 21, -1, -43, 8, 5, 5, 4, -93, 32, 37, 32, -32, 1, -37, -78, -27, 29, -3, 24, -42, -18, -31, 42, -29, 50, -45, -20, -12, -9, -25, 20, -8, -51, 12, 14, 41, 5, 38, 11, -32, 22, 25, -20, 20, 66, -18, 28, +21, 30, -22, 24, 12, -20, -23, 54, -9, -42, 3, 3, -14, -1, -62, 12, -32, -40, 14, 20, 18, 17, -61, 18, 61, -14, 4, -29, 55, 2, -60, -26, 45, -28, -36, -65, 24, -48, -16, -34, -16, 84, 46, 0, -30, -48, -35, 28, -54, 42, 4, -14, 50, 10, 34, -49, -34, -26, -7, 51, -3, 50, 4, 29, -16, -70, 9, -4, -27, -33, 6, 88, 16, -41, 14, 65, -30, 35, 3, -8, -1, +35, 7, 77, 12, 10, -18, 7, -47, 31, 19, -6, 1, 4, -14, -31, -41, -24, 59, -16, -62, -13, 0, -6, -12, -83, 50, -10, 9, -13, 17, 16, 17, -38, -17, 42, 35, -1, 3, -32, -11, -3, 12, -33, 19, 14, -32, -41, -10, 2, 1, 38, 11, 12, -9, 23, -43, 14, 11, 19, 2, -20, 40, 52, 1, -23, 8, -24, 33, 28, 34, -1, -61, -13, -34, -40, 13, 1, -3, -35, 25, 52, +-41, 51, 35, 14, 28, -19, -9, -6, 36, 2, -26, -22, -55, -4, 0, 45, -4, -8, 33, -36, 46, -19, -82, -64, -24, 28, 18, -38, -22, -44, 34, 39, 8, 47, 2, 18, 28, -46, -15, -45, -5, 26, 14, 17, -57, 27, 14, 2, 42, 70, 25, 3, -60, 14, -52, -55, 54, 7, 5, 5, 18, -8, 11, -5, 8, 41, 32, -22, 64, 11, -42, -46, -9, 0, 48, 6, 33, 9, -12, -21, 41, +5, 27, 47, -34, -17, -114, 31, 16, -45, -102, -1, -6, -44, -59, 2, 13, -107, 5, 4, 16, -15, 36, -12, -6, 0, 13, -9, 30, 62, 22, -10, -24, 8, 106, 18, -70, -11, -15, -42, -34, 8, 41, -5, 5, 25, -3, 37, 8, -19, -32, 0, 37, -46, 14, -89, -6, -38, 3, -12, -34, 25, -37, 45, 8, -2, 20, 38, 38, -15, -98, 27, -73, -95, -23, -30, -13, -64, -34, -57, 43, 40, +-18, 45, 6, 35, 2, 84, -8, -21, 16, -67, 20, 67, -2, 35, -46, 126, 50, 27, -6, 59, -34, -9, -1, -32, 27, -8, -13, -127, -3, 22, 22, 34, -9, -25, -21, 16, 25, 4, 11, 3, -31, -20, -16, 0, 9, 32, -37, 18, 25, 31, 9, 18, -66, -30, 73, -10, -7, -46, -12, -32, 52, 12, -11, 38, -7, 30, -65, 112, -10, -18, -18, -44, -33, -34, 73, -31, -15, -48, 8, 54, 3, +-13, -36, -80, -86, -58, -3, -7, -28, -6, 14, -18, -3, 28, 57, -52, -63, 12, 16, -37, 14, 31, -42, -2, 10, 15, 29, 27, 23, 23, -7, -6, 36, -3, -62, 52, -82, -53, -59, 16, -38, 5, -28, -86, -58, -60, 22, 24, -9, -8, -16, -10, 20, -45, -22, 75, 26, -15, -2, -5, -3, -59, -22, -2, 57, -24, -31, 0, 5, -16, 35, -8, -48, 15, 4, -36, 11, -32, -43, 27, 15, 17, +-3, 1, -50, 11, 7, 12, -2, -22, -33, 22, -45, -11, 19, -22, -51, -18, 27, -19, 1, -3, -3, 50, -50, -25, -4, -22, -62, 4, 44, -39, -3, 97, 34, -2, 67, 5, -25, -13, -4, -123, 5, -64, 58, 41, 19, -29, 5, -81, -4, 2, 41, -16, 82, -19, -21, -3, 67, -42, 33, 10, 46, -24, -60, 26, -18, 100, 20, -4, 34, -38, -51, -43, -47, -39, -14, -9, -16, -41, 42, -47, -21, +0, 3, -14, -36, -39, 8, 0, -29, -57, -6, -12, -29, 4, 35, 7, -5, -5, -25, -12, 21, -14, -57, 80, 22, 36, -8, -18, -42, -4, 81, 23, -12, 3, -6, -2, 53, 25, -10, -29, 34, -5, -6, 21, -70, 64, -53, -38, -61, -1, -1, 20, 10, -14, -33, -73, -96, 42, 20, 11, -10, -17, 63, 32, -5, -2, -6, -30, -31, 26, -13, -26, 25, -43, -23, -3, -25, -22, 17, 32, -8, 19, +12, 12, 0, -24, -1, 18, -37, -27, -14, 8, -41, -1, -28, 34, 4, -4, 49, -54, 13, -15, -19, -12, 16, 29, 11, 1, -37, -7, 10, 11, 25, -25, -12, 3, 52, -8, 4, 22, -63, 34, -18, -2, -16, 56, 15, 9, 7, 38, -27, -17, -3, -27, -33, -28, -2, -9, 15, 16, -21, -46, 16, -22, 4, -52, 12, -12, 51, 7, -14, 8, -62, -40, 6, -26, -35, -21, -61, -83, 11, 13, 36, +-11, 2, -28, -67, -2, -26, -38, 31, 17, 16, -10, -14, 29, 2, 21, -41, 37, 35, 49, -41, -9, -94, -91, -13, 27, -25, -43, 43, 82, 45, 30, 28, 2, 0, 54, -16, 25, 12, -23, -5, 10, -21, -39, 58, -61, -101, 16, 5, 31, -28, -31, -45, 19, -119, 8, -16, 5, -28, 36, 103, -5, -10, 6, -8, -11, 5, -32, -43, -6, -27, -30, -50, -16, 27, 13, -10, 0, -7, 40, 31, 0, +22, -12, 7, -15, 17, 23, 10, -5, -5, -22, 22, 19, -20, 55, -12, -20, 43, 33, 5, 39, -10, -63, -8, 8, -33, -15, -5, -15, 2, -126, -21, 38, 27, 23, -99, -6, -113, -18, -44, 27, -24, -46, 26, -16, 7, 8, -4, -3, 4, 4, -27, 9, 0, -26, 3, -21, 2, 47, 3, 15, 4, -29, 9, 16, 13, 22, 39, -3, -95, 29, -37, -25, 51, 26, -10, -87, -3, -4, 0, -32, 45, +-4, -83, -25, -33, 15, 47, -55, -24, -9, -52, -21, 58, -15, -50, 38, 24, -18, -30, 23, 118, -11, 47, -47, 21, -1, 27, -7, -7, -50, 74, -42, 46, 1, -15, 26, 18, 73, 22, 14, -9, 18, -27, 16, 24, -39, 43, -29, 1, -8, 39, 23, -18, -13, 23, -16, 14, -20, -15, -6, 5, 40, -35, 6, -11, -87, -38, 22, -13, -68, 9, -41, -18, 21, 10, 80, -11, 21, -40, 16, 2, -55, +35, 26, -79, 80, 2, 19, 39, 46, -4, 31, -41, -43, -7, -2, -9, -9, -45, 31, 15, -44, 44, -8, -4, -26, -46, -8, 16, -29, 20, 5, -8, 14, -21, -36, -27, 33, -1, -4, 13, 30, 58, 61, -15, -23, -82, 3, -12, -66, -22, 9, 55, 50, -20, 16, -26, -24, -18, -30, 2, -85, 18, 27, -21, 10, -7, 23, 31, 11, -21, 49, 12, -32, 51, 8, 58, 87, 0, 29, -87, -10, -61, +-35, -78, -27, -20, 71, 53, -67, 69, 37, -66, -35, -17, -66, -37, 8, -21, -2, -14, -34, -22, 10, -22, -14, -45, -14, -17, -9, -54, -92, 11, -36, 6, 15, -20, 1, -1, -24, 8, 23, 59, -1, 1, -69, 20, -73, 8, -8, 3, 7, 4, 14, 43, 11, 20, 9, 12, 6, -21, -23, 2, -21, -32, 38, -46, -9, -10, 21, -2, -1, -9, -23, 19, 49, -10, -7, 10, -28, -64, 23, -13, 74, +73, -77, 62, 4, -26, 2, 13, 8, 48, 7, 15, -18, 26, 13, -16, 4, 18, 9, -7, -3, 7, 10, -13, 5, -6, 0, 43, -45, -22, 7, 18, 20, -17, -15, -27, -3, 18, -2, -4, -37, -1, 33, -83, -18, 43, 4, 31, -34, 48, -20, 4, 13, -1, 14, -57, -11, 19, -24, 1, -10, -35, -40, 2, 127, 6, 14, 41, 15, -25, 17, 9, -19, 29, 20, -54, 17, 0, 32, 13, 27, -57, +-10, 20, 31, -5, 14, 33, 11, -16, -17, -29, -33, -5, 1, 22, -37, 33, 11, 35, 7, -14, 9, 0, -30, -23, -28, 98, -71, -33, -40, 52, 1, 59, 58, 15, -8, 36, -57, -60, -22, 37, -14, 21, -27, 32, -51, -11, -52, -22, -15, -36, 9, -1, 69, 37, -30, -37, 4, 5, -42, 40, -12, -46, 29, 1, -7, -38, -46, -24, -90, -29, -38, 62, -43, -42, -60, -68, -30, -26, 51, -34, 11, +-83, -11, -73, 33, 17, -55, -9, -56, -9, 20, -10, -7, -21, -42, 16, 31, -26, 11, -37, 27, -46, -2, -30, -36, 8, 62, -16, -21, -41, 9, -26, 97, -35, 35, -73, -3, -35, -10, -60, 68, 80, 4, -17, -28, -6, 19, -60, -68, -31, 44, 43, 15, -10, 9, -43, 1, 35, 0, -25, -53, 43, 51, -43, -30, -53, 51, -7, 23, -38, -31, -32, 38, -59, -34, -8, 23, -13, -30, -26, -79, -23, +-6, -56, -45, 4, 3, 3, -22, -7, -9, 28, 13, 7, -35, 6, -7, 20, -9, -18, 18, 28, 1, 80, -22, 67, 21, 5, -60, -35, -22, -41, -17, -13, -60, -18, -1, -60, 63, -10, -33, -16, -12, -33, -22, 5, 32, -8, -29, 16, -53, 47, 10, 4, -24, -3, 30, 20, -12, -21, -17, -47, -46, 45, 25, -8, -28, 28, -9, 34, -39, 15, 12, 3, -73, 13, 7, -5, -6, -25, 3, 5, 9, +41, 50, -5, 10, 49, -45, -36, -2, -13, -39, -54, 1, 57, -35, 36, -16, 3, 6, -14, -33, 21, -25, -31, 35, 17, -127, 46, -27, -60, -13, -118, -73, 2, 15, -30, 48, -59, -31, 46, -74, 82, 25, -15, -17, 8, 62, 35, 41, 25, 21, 32, 17, -78, -28, 48, -52, 7, 21, -5, -42, -11, 45, 36, -18, -53, -127, 85, 14, -59, 15, 16, -12, -19, -9, 4, 9, 10, 0, -6, 18, 13, +-10, -14, 23, -32, 11, -9, -4, -5, -21, -15, 20, 12, 3, -26, -5, -40, 29, 10, -39, 20, -21, -2, -19, -19, 7, -4, -32, 11, 32, -7, 23, 9, -43, 58, 1, 72, -11, 28, 47, 19, -25, 70, -34, -16, 55, -12, 6, -20, 24, 43, 3, 7, 3, -8, 41, 4, -4, -28, 7, 10, -3, 30, -44, 15, -28, -12, 13, 10, 63, -8, -50, -6, 22, 11, 28, -4, 84, -51, 16, -12, -25, +72, 4, 6, 8, -3, -22, -19, 27, 16, -7, -20, 14, 10, -5, 0, -1, 29, -10, 13, 0, 13, -1, 26, 16, 4, 34, -12, 12, -4, 4, -14, -30, 31, -94, 28, 8, 40, -91, 42, -27, -118, 2, 13, 33, 15, 24, -18, -42, -20, -52, 78, -29, -7, -5, -20, -2, 9, -35, 43, 58, 23, 9, 4, -66, -43, -91, -22, -12, -21, 45, -22, -10, -31, -48, -48, 39, -23, 30, 1, -22, 32, +-30, -8, 10, 40, 21, 25, 0, 26, -37, -11, 43, -19, -21, -27, 46, 4, 49, -10, -36, 5, 16, 25, -16, -54, -9, 22, -32, -23, -2, -5, 15, 29, 21, 9, -10, -24, -55, 27, -49, 51, -18, 71, -104, 34, -38, 1, -26, 6, -22, -22, -11, -10, 16, 3, -2, 10, -11, -11, -3, -33, 27, 6, -5, 26, -44, 23, 30, 3, 7, 17, 2, 25, 35, -46, 4, -31, -11, 34, 1, 20, -24, +31, 10, -56, 34, -27, -2, -28, -26, -16, 23, 53, 7, -51, -26, 21, 14, -10, 33, 38, -21, -23, -26, -9, 71, -29, 40, 16, 35, -1, 39, -24, -13, 44, -4, 3, -9, -41, 56, -4, -5, 3, -22, 35, 32, -4, 10, -1, 80, -39, -19, 14, -56, -6, -19, 6, -1, -2, 51, -21, 9, -5, 8, 34, -98, 10, 62, -8, -14, -38, 31, 7, 13, -34, 14, -71, -15, 23, -13, 30, -5, 14, +14, -19, -32, -18, -29, -28, 20, 18, -2, -11, 5, 30, -3, 71, -2, -4, -18, -5, 8, -37, -58, 36, -31, 21, 15, 11, 18, 1, 12, -16, -38, 26, -24, 24, -11, 2, -19, 70, 47, 77, 2, 41, 26, 73, 38, 19, 29, 21, -25, 11, -32, -32, 17, -20, 3, -8, -17, 20, -20, -18, -34, -59, -22, -14, 4, 56, 55, 4, 55, -7, 15, -4, 62, -6, -39, -8, 0, 34, 41, -12, 27, +24, -14, -91, 6, 14, 16, 39, 38, -19, 8, 12, -30, 27, 27, -5, 9, 18, -19, -5, 3, 35, 49, 21, 39, -16, -31, -6, -19, 20, 21, -9, 105, 3, -22, 30, -27, -4, 21, -33, 8, -12, 56, 6, -35, -13, 1, -6, -15, -23, 51, 13, 83, 22, -21, -91, 16, 35, 3, 38, -14, -5, 1, 18, -57, 51, 78, -6, -47, -29, 5, 28, 29, 79, 15, -15, -47, -14, -9, 19, -22, 34, +-85, -23, -25, -39, -5, 0, 29, -94, 81, 15, 4, 34, -5, 4, -8, 4, 6, 7, -9, -12, -18, 36, 5, 9, 10, -32, 2, -1, -29, 3, 5, -3, 49, -20, -7, 45, -14, -12, -7, 20, 13, -26, 27, 35, 16, 25, -31, -13, -58, -15, 9, 14, -9, 0, -11, -3, -56, -18, -2, 2, 28, 4, 23, 18, -44, -82, 76, 20, 35, -10, 0, 7, 13, 7, 26, 32, 0, 15, -17, 3, -13, +-12, 29, 11, -18, -49, 54, -105, 21, -28, 39, 9, 46, 6, -23, 40, -73, -58, 19, -48, -34, 20, -31, -18, 29, -46, -2, -8, -17, 41, -31, -16, -27, -3, 2, -42, -37, 6, 29, -31, -18, 16, -4, -5, -7, -1, 32, 10, -8, 13, -33, -28, -23, 14, -34, 6, 11, -17, 22, -10, 7, -9, 12, -58, 17, -14, 21, -44, -66, 13, -17, 85, 4, -20, -60, 18, -1, 18, -15, -15, -16, -21, +67, 61, -62, -43, 31, 2, -14, -4, -21, -30, -20, -55, 44, 29, -27, 28, -4, 7, -31, 67, -18, 45, 28, -11, -9, 26, -29, 3, -15, -27, -41, 13, -3, 107, 40, -4, -124, 85, 48, -6, 16, -6, -17, -2, 46, 20, -19, -41, -78, 12, -17, -22, 25, 24, 51, 32, -1, 57, 36, -10, 5, -1, -42, 27, -7, -13, -5, -65, -39, 7, 26, -16, 29, -37, 14, -38, -41, 4, 2, 0, -46, +19, -7, 26, -5, -15, -18, -2, 21, 50, -4, 27, 22, -2, 13, -46, -2, -17, -18, -39, -36, -5, -47, 27, 3, 5, 0, 26, -71, -10, 2, -30, -17, -22, 71, 1, 23, -35, 1, -62, -13, -11, -25, 45, -34, 53, -41, -64, -2, -10, 85, -7, 24, 21, -34, -49, 22, -50, -9, 0, -19, -37, 12, -14, -32, -64, 9, -3, -15, 13, -3, -8, 43, -4, 8, -29, 33, -11, -36, 2, -10, -12, +-21, 12, 22, 55, 22, -14, 44, -12, 1, 22, -19, -80, -53, 17, 31, -57, -43, 3, 8, 13, -32, 6, 30, -14, 11, -4, -40, 5, -76, -29, -18, 73, 3, 23, 8, -37, 12, 15, 33, 45, 26, -30, -7, 24, 82, -17, 30, -3, 20, -26, 32, 49, 14, 50, -5, -29, -9, 3, -2, 26, -77, 17, -17, 107, 12, -52, -12, -13, 23, 32, -13, 2, 21, 24, -19, -2, -40, -2, -14, -15, -24, +29, 20, -35, -17, -37, -49, -22, 10, 11, -124, 12, -47, -25, 12, -37, -11, 14, 49, -91, 18, 52, 36, 85, -8, -10, 1, 81, 31, 13, 24, -29, -4, -42, 21, -44, -16, 27, -9, -29, 2, 20, -98, 26, -52, -23, 13, -54, -3, 4, -67, 31, 6, 57, -48, -22, 10, 3, -12, -20, -23, 29, 22, 24, 9, 17, -43, -34, 30, -14, -17, -44, -12, 9, 28, 4, -37, 14, -33, 11, -22, -12, +-1, -21, 10, -12, 29, 41, -2, -88, 0, -38, 48, 75, 49, -74, 18, 22, -63, 94, -16, -3, 25, -95, 57, 65, -13, 16, 27, -13, 4, -21, -3, 64, -52, -15, 41, -42, -12, 31, -11, -26, 14, -4, -38, -2, -13, -9, 7, 20, -9, -35, 6, -51, -27, 0, -5, -5, -7, -12, -12, -32, -10, 5, -7, -1, -46, 6, -34, 6, -12, 32, -63, 1, 20, 3, -1, 52, 12, -28, 46, -27, -8, +-27, 69, 45, -26, -8, 7, 15, 37, -14, 4, -47, 26, -30, 20, 41, -51, 14, 25, -15, 25, -6, 36, 20, 47, 23, 42, 20, 78, 16, -26, -58, 37, -103, -34, -40, 7, -31, -41, -32, -4, 35, -76, -127, -41, -52, 12, 32, 5, 21, 30, -33, 52, 56, 22, -3, 18, 4, -41, -41, -20, 22, -20, -1, 6, 9, 12, -4, -7, 5, 4, -13, 16, 8, -24, -3, -7, -11, 17, 6, 32, 4, +16, -1, 31, -5, -32, -32, -16, -24, -55, -13, -3, 73, -42, -27, -6, -14, -4, -2, 3, -26, 4, 4, -1, -11, -77, -84, -12, -4, 25, -47, -11, 10, -15, 7, 10, 26, 6, -8, 14, -24, 92, -3, 38, -8, -54, -8, -18, -2, -15, -6, -42, -35, 13, 40, -36, 3, 14, -85, -17, -91, 16, 97, -57, -20, -17, 44, 3, 9, 66, -127, -8, -70, -26, 5, 8, 23, 41, -65, 9, 17, -42, +-44, -25, -19, 39, 3, 22, 1, -41, 19, -47, -91, 22, -25, 5, -1, 28, 22, 18, -45, 37, -2, 26, 17, -5, -58, 52, 59, -10, 6, 44, 16, 2, -16, -17, -25, 18, -10, 18, -7, 31, 13, 12, 21, 10, -65, -69, 27, 12, 25, -8, 5, 53, -36, -5, -9, 31, -2, -1, 1, -106, -73, -40, -16, -1, 6, -1, 1, 73, 24, -15, 35, -23, -28, 20, -55, 15, 9, 70, -3, -58, -15, +9, 5, 21, -55, 14, -67, 25, 8, -37, 16, 24, 9, 2, 18, -30, 32, 51, -11, 28, -19, 18, -1, 8, -11, -10, 14, 15, -32, -33, -16, 8, 20, 3, -18, 10, 22, 70, -52, -12, 102, -2, 51, -19, -67, 26, -52, 70, -51, -30, 48, 71, -42, 50, -38, -60, -75, 14, -46, 3, -64, 25, -11, 4, -14, -58, 97, -26, -66, 34, 15, -14, 59, 20, -26, 3, -21, -2, 16, 39, -47, 9, +23, 25, -6, 13, -11, 6, 18, 6, -33, 8, -30, -26, -30, 12, 0, -2, -48, 6, -33, -46, 64, -54, -10, 43, 18, -30, 42, 72, -30, -11, -25, -12, 52, 42, -77, -31, 24, 10, -6, -14, -77, 47, -14, -56, 41, -30, -45, 43, 29, -14, 8, 28, 2, 42, -2, -1, 30, 1, -32, 12, 23, 69, 18, 36, 19, 50, 6, 21, -19, 41, -52, -10, -66, 32, -9, -68, -21, -10, -8, -11, -18, +25, -28, 114, -1, 19, 0, -54, 5, 13, 26, -67, -39, 18, -54, -26, -11, 11, -19, 51, -26, 6, -68, -30, -16, -5, 27, -41, -37, 15, 64, 125, 50, 36, -87, -50, -51, 57, 3, 6, 93, -70, -119, -77, -48, -40, 27, -17, -77, -66, -91, 34, -34, 6, -15, 0, -12, 13, 9, -24, 20, -17, -74, 7, -2, 8, -21, -18, 3, 15, -5, 11, -22, 3, -31, -25, -17, -9, -5, -11, -127, 11, +-5, -8, -30, 11, -12, 0, -14, -25, 0, -15, -1, 5, -8, 0, -8, 20, -19, 44, 17, 1, 52, -45, 5, -25, -28, -4, -17, 44, -13, 9, -101, -6, -43, 49, -44, -28, -28, 0, 0, 4, -34, 21, -71, -7, -26, -27, -102, 23, 52, 14, -52, -42, 12, 6, -3, 16, 12, -22, 24, -25, -3, -5, -81, 1, -1, 3, 10, 13, 16, 0, 57, 80, 29, -27, 19, 8, -83, 1, -18, 0, 37, +-16, 11, -42, 8, -12, 21, -34, -10, 11, 4, -10, -3, -25, -127, 18, 29, -16, -13, 33, -33, 0, -12, 15, 7, 0, -6, -5, -16, 2, -9, 4, -3, 10, 11, 37, 19, 16, -46, 62, 7, -21, 26, -31, -13, -11, -98, 21, -58, 39, -18, 16, -85, 0, 67, 49, -69, 33, -55, -1, -50, -29, 65, 42, -77, -14, 18, 92, 29, -27, -17, 2, -127, -44, 41, -15, -12, -32, -76, 7, -44, -16, +38, 41, -39, 0, -66, 74, -2, 14, -4, -4, -35, 5, 36, 16, -24, -6, 24, -4, 3, 18, -12, 1, 47, -25, 3, -101, 0, 8, -127, -41, -18, 5, -31, 26, -13, 0, -1, -13, -27, 5, 60, -4, -6, 24, 7, 7, -40, 26, -4, -33, -1, -20, 31, -35, -91, -2, 8, 32, 11, -22, -88, 5, 7, 31, -27, -25, -7, 0, 32, -19, -30, 49, -47, 7, -13, -24, -41, 11, 10, -35, -31, +31, -5, -35, -2, -64, 13, -23, -13, -32, 17, -3, -39, 13, -16, 61, -55, -65, -14, 0, -44, 39, 3, -63, -32, 9, -3, -1, 35, -10, -15, 7, -2, -4, 14, -27, 28, -5, 18, 31, 33, 51, 15, -25, -120, 74, -31, 19, -57, -22, 15, 0, 43, -3, -41, -11, -3, 9, 6, 36, 40, 4, 8, 5, 44, 47, 4, 50, -12, 13, -17, -15, -23, -82, -23, -42, -102, -40, 24, -58, -25, 9, +15, 0, -76, 26, -19, -3, -106, -2, -31, 5, -34, 22, -32, -5, -35, 13, -3, 21, -55, -19, -21, 28, -17, -17, -7, 3, -127, -36, -33, -16, 9, 47, 8, 0, -3, -52, -11, 10, -16, -9, -6, -4, 38, -28, -33, 49, -90, 24, 28, 21, 13, -32, 30, -75, -10, 10, -8, 24, -106, 54, -60, 19, -10, 26, 5, 0, -34, 40, -109, 16, -18, -8, 7, -37, 42, 7, 23, -19, -32, -96, 13, +-20, 20, 45, -63, 20, 58, 11, -2, -127, -83, 18, -26, -35, -14, -37, -9, 0, -72, 1, 11, -68, -17, 11, -22, 74, -127, 16, -41, 16, -27, 56, -1, 8, -50, 15, -42, -17, 5, 16, 37, -50, -114, -2, 29, 48, 19, 3, 22, 0, 18, 21, -19, -5, -14, 27, 127, -4, 18, 3, 12, 4, -34, 38, -52, -42, 1, -15, 53, 5, 60, 15, 35, 31, -55, -18, 59, 61, -20, -70, 29, -55, +10, -63, 76, -6, -87, 35, 32, -36, 14, 1, -35, 29, -46, 0, 22, -4, 16, 37, 17, -4, 11, 4, 6, 18, 10, 2, -1, -35, 0, 11, -31, 7, -24, 35, 44, 6, -3, -15, -8, 13, 10, -2, 6, 5, 46, 26, -4, -25, -7, 36, 127, 14, -29, -83, 26, 13, 2, 14, -6, -23, 0, 35, -53, 22, -41, 46, 16, 36, 17, 13, 19, -79, 63, -37, 49, -14, 37, -35, -35, 6, 3, +-42, -3, 8, 15, -56, 46, 108, 41, 5, -20, 4, 21, -8, -45, 71, -2, 19, 2, 65, -23, 33, 67, -87, 8, -7, -15, -23, -3, -3, 37, 28, 14, -9, -9, 15, 7, 26, -10, -3, 3, -16, 4, 47, 26, 4, 2, 16, 11, 39, -3, 19, 10, 15, -52, 11, 43, -38, 3, 45, 55, 18, -24, -50, -1, -18, 119, 24, 48, -44, 23, 10, 46, -4, -22, -5, -41, 32, -33, -74, -109, -40, +-62, -8, -52, -56, -1, -11, -16, -7, 16, -16, 28, -38, 21, 14, -70, -13, 39, -36, 26, -9, -2, 0, -14, 42, -54, -14, -4, 49, -56, 26, -37, 16, -19, 33, -3, -49, 40, -30, -69, -9, -10, 0, 21, 1, -39, 30, -32, -27, -36, 42, 15, 14, -48, -3, 2, -72, 23, 21, 11, 22, -15, -2, -69, 34, -30, 17, 0, -36, -50, -12, 46, 28, -22, -17, 5, 27, -26, 15, -3, -32, 37, +24, -8, 4, -11, -6, 17, -38, -8, 22, 12, 31, 27, 17, -127, 43, 12, -3, 4, 10, 68, -11, -24, -50, -15, 3, 29, -5, -63, 73, 41, -15, -21, -67, -3, -55, 13, -36, 16, 0, -72, -27, -46, -6, -6, 67, -31, -3, -11, 55, -29, -62, -20, -86, -3, 0, 19, -31, 11, -40, 31, -61, -57, -24, 20, -16, -9, 3, -32, 15, 6, 46, -11, 16, 48, -9, -23, 0, 2, -9, -11, 34, +-70, -31, 47, -17, 10, -51, -41, -22, 54, -35, 13, -26, 50, 22, 47, -54, 1, 14, -10, 2, -3, -7, 6, -31, -62, -25, -60, 26, -125, 44, -27, 73, -127, -9, -4, 68, 46, -17, -29, 15, 1, -40, -19, 15, -10, -48, 44, -25, 6, -11, 6, 41, -19, 47, -22, -23, -31, 43, 4, 10, -11, 24, 8, 16, -44, -13, -12, 28, 43, 36, 39, -67, -3, 36, -46, 3, 4, 2, 25, 17, 3, +-10, 31, 36, 127, 41, -5, -19, 50, 39, -17, 33, 0, 0, -83, 46, -26, -44, -41, 3, 12, 28, -39, 35, -23, -15, -14, -18, 22, 23, -11, 37, 16, -74, -36, -14, 13, -12, 33, -5, 1, 82, 27, -60, -7, -1, -35, 59, 7, 10, 23, -14, -5, -6, -1, 49, -57, -31, -8, -44, 4, 64, 20, -6, 2, 41, -3, -79, -4, -53, 25, 2, 50, -3, -16, 61, -55, -23, -64, 46, -14, -11, +58, 29, 1, 33, -14, 44, -99, 12, -47, -30, 2, 33, -28, -43, -39, 33, -6, 25, -127, 28, -26, -83, -45, -13, 126, 5, -29, -31, 34, -100, -45, -46, -21, -18, 71, 4, 0, -26, -40, -22, 15, 27, -9, -11, 16, -77, -33, -5, -21, 14, -25, 37, -9, -8, 20, -8, -20, -4, -24, 27, 12, 16, -10, 0, 3, -20, 24, 3, -19, -8, -47, -14, -93, -32, -34, 37, -40, -30, -23, 9, -13, +-41, -33, 40, -47, 5, -45, 7, 10, -37, 22, -12, 11, 80, -5, -10, 12, 42, 27, -4, 1, -32, -43, 20, -22, 65, -10, -7, 35, -51, 15, -3, 26, -8, -75, -8, 36, -93, 6, 49, 35, 27, 70, 25, -38, -2, -5, -44, 23, 22, 68, -6, -16, 56, -75, 1, 55, 18, -9, -12, -4, -65, 1, -21, -14, -3, 30, 25, -10, -12, 0, 43, 0, -16, -10, -1, -7, -34, -13, -25, -23, -2, +20, 14, -7, -77, -97, -24, 42, -18, 55, 33, 10, -55, 30, -22, -1, 40, 37, 20, 67, -34, -20, 47, 60, 8, 14, -2, -66, 82, 43, -16, 1, -10, 65, 9, -11, -21, -65, 17, -113, 0, 42, -10, -3, -94, 6, 23, -13, 2, 2, 31, -17, 32, -25, -32, -3, -2, 4, 41, 43, -22, 65, -3, 21, -59, 34, -3, 51, 59, -20, 10, 57, -40, 67, 18, -47, -37, 24, -6, 42, 30, -30, +-16, -19, -48, 5, 0, 45, 49, 7, 6, -29, -2, 5, -7, -22, -2, 83, 3, -19, -30, -50, 28, -20, -25, -15, -15, 17, -57, 13, 11, -35, -19, -41, -16, -3, 11, 11, -29, 50, 40, 37, 16, -8, 36, -1, -24, 13, -8, 22, 73, 8, -80, -76, -4, 59, -127, 25, -38, 4, -52, -27, 27, -48, 23, 18, -31, -7, -24, 9, 44, -7, 24, 40, -26, -24, -29, 20, 0, -7, -10, 77, -3, +-20, -14, -20, -6, 9, 28, 33, 33, 11, 22, 8, 0, -27, 4, -4, -64, -52, -3, -8, 32, 37, -63, -8, -7, -5, -9, 9, -36, -1, -25, 19, 39, -36, 0, -37, 48, -8, 34, -18, -40, -42, -77, -40, -98, -10, -77, 17, 4, 22, 31, -2, 85, 79, 0, 20, 2, 112, -73, 26, -5, 2, -62, 43, 28, 44, 55, -25, 17, -32, -19, 12, 50, -15, -28, -101, -87, 7, 17, -37, -18, -28, +-98, -30, -79, -15, -17, 16, -8, 18, -2, 58, 15, 26, -22, 38, -15, -85, -33, -19, 14, 7, -38, 28, -51, -15, 6, 36, -15, -9, 7, -28, -7, 19, -26, 16, 36, -5, 1, 98, 20, 48, 67, 51, -17, 16, 38, 59, 23, -1, 27, -20, 60, 15, 26, -60, 19, 1, 31, -51, -37, -1, -4, -5, -29, -26, 6, -17, -16, -13, -16, 32, -22, -69, -8, -13, -2, -3, 14, 56, -33, 31, 12, +-73, 34, -59, 28, 18, -53, -11, -48, 33, -15, 60, 39, 62, 42, 14, -60, -3, -10, 58, 27, 17, -38, -4, -26, 19, -6, -7, -34, 75, -21, 34, 76, 114, 15, -40, -22, -53, -35, 33, -46, 34, -3, 42, 34, 9, 64, -1, -42, -17, 55, -21, 33, -3, 34, -45, -15, 1, -43, -44, -33, -23, 52, 38, -25, -54, -34, 6, 28, 2, 19, -14, 31, -34, 8, 8, -42, 37, -21, -3, 14, 8, +-4, -5, -21, 8, -4, -87, -14, 2, 18, -10, -26, 19, -4, -1, -11, 5, 29, -8, -32, 12, 31, -53, 58, -36, -1, -14, -68, -10, -19, -19, 3, 8, 25, 14, 67, -23, 39, -85, 36, -40, -1, -21, -67, -34, -11, -5, -71, -38, -38, -14, 17, 53, -54, 11, -13, -64, -8, 18, -31, -25, 4, 24, 21, -40, -3, 42, -1, 87, 6, -49, -4, 37, 38, -26, -7, 70, 11, 5, -23, -35, -27, +6, 35, -70, 0, 1, 22, 17, 1, 4, -17, 5, -2, 6, -2, 0, 2, 10, -1, 22, -21, -96, 16, -31, -4, 5, -22, -3, -23, 37, 24, 23, -45, -21, -41, 43, -14, 10, -2, 8, -20, 7, -38, -19, 7, 35, 56, 62, -33, 33, -25, -21, -47, -6, 4, 13, -26, 38, -15, -22, 7, 24, 76, 60, -15, -61, -99, 9, 13, 19, 35, -30, -24, 55, 6, -43, -36, -3, -21, 43, -55, 4, +-5, 55, -13, -34, -14, 22, 23, -58, 16, 52, -23, -1, 43, -20, 5, -38, -39, -66, -19, 48, -37, -54, -12, 18, -17, -83, 6, 13, -38, 24, -30, 40, -27, 2, -35, -118, 29, 45, 1, -27, 20, -34, 36, -24, 31, 12, -22, -22, 40, -33, 22, -20, 45, 53, 7, -11, 7, 5, -20, 16, 4, 6, -10, 2, -42, -19, -21, -84, 38, -25, -26, -14, 36, 18, -5, 13, 43, -17, 0, -46, -88, +-68, -29, -18, 42, -64, -2, 1, 46, -28, -4, -50, -17, -89, 22, -14, 35, -5, 4, -41, 64, 12, -64, 48, 11, 43, 32, -38, 32, -22, -21, -40, -41, -21, -26, 25, 51, -29, -7, 8, 30, -5, -14, -40, 13, -29, 25, 21, -20, 38, 69, -127, -113, -49, 3, -4, 10, 5, -64, -39, 5, -38, -35, 2, 56, 36, 27, 15, -66, -19, 14, 52, 2, 11, 2, -38, 5, 30, 6, -12, -4, -24, +-14, -80, 72, -41, -38, -2, -2, -16, -2, -52, -10, -7, 8, 13, 8, -35, 32, -10, -43, -4, -10, -1, -14, 9, 22, 2, 22, -29, -5, 6, -34, 11, -39, -98, -18, 34, 4, -20, 67, -18, -30, 18, -14, -10, 34, 98, -31, -15, 83, 36, -72, -55, 40, 1, -20, 7, -29, 10, -17, -22, 28, -23, -54, -22, -23, -50, 8, 9, -5, 44, -23, -13, 8, -17, -23, 13, 18, 81, 1, -48, 71, +23, -55, -98, 15, -32, -42, -30, -48, -19, -36, -7, 12, 46, -3, -15, -56, -57, 22, 10, 1, -24, -51, 13, 11, -106, -78, 9, -3, -43, 12, -19, -45, -50, -59, 52, -22, 0, -81, 21, 23, -27, -44, -59, -6, 48, -11, 40, 54, -45, 10, -5, 9, -85, -36, 42, -25, 3, -17, 10, -13, 73, 41, -9, 6, 46, 6, 8, 87, 52, 44, 19, 22, -5, 64, -20, -73, -86, 17, -1, -30, 27, +6, 71, -1, -20, -106, -34, -3, -13, -39, 23, 18, 17, 27, -18, 12, 15, 2, -10, -4, -3, 7, 18, 17, -28, 29, 31, -5, -14, -20, 4, -3, 1, -7, 25, 0, -7, 1, -31, -40, -4, -56, -45, 5, -75, 71, 30, -1, -21, 23, -37, 6, -39, 27, -24, 26, 14, 1, 9, 21, -7, -9, -16, -72, 47, 52, 57, -1, -36, -46, -18, 20, -21, -39, 57, -12, -27, -20, -13, 20, -34, 74, +-8, 0, -31, 0, -40, -27, -22, -31, 1, 21, -95, -68, -11, -39, 10, 30, 2, 26, 3, 21, 31, 3, 9, -29, -34, -31, -26, -20, 13, 45, 3, -13, 34, -20, 14, -53, -39, -29, -34, -117, -10, -20, -3, -73, 0, -42, -1, 29, 38, 20, 8, 14, -29, -5, -13, 0, 12, -19, 33, -16, -12, -2, 25, 74, -13, -2, -16, 33, 49, 16, -42, -1, 7, 25, -41, -41, -15, 17, 69, 33, 86, +-29, -127, -35, -19, 4, -30, -88, 66, 10, 13, -16, -21, -6, -35, 38, -53, 4, -9, 21, -12, 42, -57, 9, -12, -37, -61, -52, -55, 50, -11, -27, 3, 72, -11, 41, 17, -10, -42, 33, 86, -8, 13, -49, -13, -48, 14, -6, -14, 10, -14, -1, -35, 11, -68, 4, 27, -3, -29, 55, -33, -27, -40, 48, -31, 1, -19, 34, 5, 18, -1, -10, 18, 38, 18, -34, 42, -10, -8, -2, -67, -19, +8, -27, 30, 28, -34, 3, -6, 27, 30, 5, 23, 39, -37, 2, -9, -8, -91, 5, 40, -17, 5, -21, -52, -12, -59, 2, -45, -30, 42, -47, 38, 19, -28, -70, -7, 0, -29, -38, 1, 11, -18, 78, 41, -34, 47, 50, 17, 54, 17, 65, -37, -79, -5, -18, -32, 40, -54, -16, 37, -46, -35, 44, -14, 6, 26, -11, 53, -8, 19, 17, 0, 0, 22, -4, 12, 33, -2, 28, -42, -49, 7, +-1, 15, -46, 30, -25, -122, -7, 46, -22, 41, -49, 4, 45, -21, -40, -27, -50, 8, -71, -4, -12, 51, 68, -65, -30, -7, -36, 11, 44, -7, -8, -30, -28, -5, -18, -35, 30, -10, 8, 6, 1, -34, -2, -20, -20, -69, 7, -5, 9, 3, 95, -26, 9, -30, -37, -22, -10, -26, 54, -85, 11, -16, -49, -7, -16, -48, -17, -14, -24, 11, -4, -63, 25, 13, 55, 1, -33, -27, 24, 27, -47, +-47, 30, -28, -16, -53, -40, -69, 67, -4, -39, 15, -10, 29, -54, 18, -26, -4, 14, -9, 1, 24, -24, 42, -24, -51, 3, 47, 3, 48, -8, 49, 7, -34, 11, 30, -22, -38, 14, -33, -10, 2, 85, -63, 11, 26, -21, 29, -18, -50, 32, 16, 98, -75, -5, -47, 19, 0, -19, 62, -24, -70, 21, 82, 17, 29, 7, 57, -64, 46, -18, -47, -3, -16, 15, 49, -15, 65, -95, 0, -34, -56, +8, 20, 12, 1, 14, -2, -3, -3, -11, 1, -17, 4, -23, -33, -1, 18, 25, 22, -3, 6, 4, 9, -14, -40, -4, 23, 7, 7, 0, -8, 22, -6, 46, 5, -1, 18, -58, -38, -49, -127, -21, 40, -8, -5, 32, -17, 17, 44, 49, 18, 16, 17, 4, -31, -2, 35, -82, 13, 23, 11, 36, -57, 0, 5, 10, 13, 0, -14, -23, 32, -7, -19, -29, -20, 30, 20, 23, 2, 6, 23, -28, +58, -22, 39, -22, -16, -7, 51, 19, 4, 36, 8, 14, 10, 9, -35, 11, -10, -22, -41, 29, 49, -17, -47, -17, 3, -58, -6, 18, -23, -33, 45, 19, -13, 1, 76, -42, -69, -48, 62, -42, -28, 53, 59, -55, -64, 7, 9, 48, -5, 19, -33, 1, 12, 11, 72, -16, -6, -11, 41, 33, -10, -1, 21, -3, -12, 40, -8, 11, -26, -8, -69, -67, -52, -59, 12, 15, -29, 37, 17, -12, -53, +-44, 20, 25, -15, -18, 12, -16, 8, -1, -24, 18, -1, 17, 19, 4, -47, 7, 19, 31, -3, -25, 24, 39, -93, 23, -71, 20, -11, 73, 7, -13, 9, -20, 39, -25, 3, 37, 13, -17, 7, 2, 14, -9, -22, 21, -10, 19, 62, 58, 20, -43, 1, 60, -24, -15, -3, 1, -3, 18, 38, 51, -11, 3, 14, 2, 13, 25, 42, -2, 16, -2, -19, -18, -1, -8, -8, 27, -12, -2, 21, 53, +5, 39, -4, 2, -20, 1, 3, 14, 5, -23, -38, 14, -9, -21, 0, 15, -10, 14, 20, -8, -39, -10, -9, 4, -9, -10, -19, 21, 29, 43, 6, -14, -2, 12, -15, 20, 45, -6, -17, 14, 0, -1, 1, 10, 19, -36, -83, 26, -33, -15, -59, 74, -11, 26, -48, 39, -28, 43, -18, -52, 33, -44, 33, 19, 0, 13, -29, 54, 127, -15, 37, -6, 0, 8, 99, -36, -28, -38, 32, 32, 36, +0, -18, 44, -60, -2, 21, 21, 1, -27, -15, 6, 2, -2, 20, 16, 11, 11, 23, 8, 11, 21, -7, 51, 13, 1, 67, -12, 15, 34, 12, -26, -6, 28, -26, 2, -10, -2, 5, -13, 20, -3, -3, -29, -37, -11, -84, -20, 5, 4, 34, 19, 5, -18, -41, -18, 10, 7, -49, -12, -23, 15, -36, -6, 14, 31, -13, 38, -18, -2, 52, 2, -35, 34, 18, 52, -28, 41, 19, -34, 4, 65, +27, -39, -50, 0, 18, 26, 13, -74, 53, -83, -8, 54, 0, -38, 15, -35, -13, 4, -10, 17, 17, 25, 25, -29, 8, 36, -5, 56, 65, -4, -6, -27, -4, 19, 18, 19, -64, 9, 0, -17, 44, -62, -16, 12, -8, 4, -2, -13, 6, -20, 16, -3, -7, 8, 4, -18, -8, -15, -36, -15, 52, 17, -6, -34, -70, -43, -28, -23, 10, 49, 4, -2, 17, -13, 12, -18, -10, -5, -3, -75, -19, +-10, -93, -6, 13, 3, 43, 50, -30, -64, 13, 12, 7, 24, 12, 58, 21, -43, 69, 43, -2, 56, 3, 19, -8, 47, 35, 7, 7, -5, -13, 26, 10, -4, -10, -18, 16, 20, 11, -11, 45, -31, 0, -9, 4, -5, -5, -33, -37, 1, -27, -127, -18, -8, -52, 13, -1, -9, -3, -11, 7, -20, -12, 8, -12, 75, -13, -16, 43, -34, 12, -38, 13, -10, 8, -28, 9, 3, 1, 9, -26, 38, +14, -13, 12, -32, 35, 10, -27, 21, 7, -5, -7, -58, 48, 16, -32, 6, -14, -17, 42, -6, -7, -20, 20, 4, -45, 2, 5, 2, -44, -37, -68, 13, 31, 31, 18, -6, -33, -2, -70, 12, 29, -1, -43, -95, 79, -77, 19, -59, -56, 3, -19, -20, 37, -1, -51, -12, -27, -19, 4, -62, -18, -24, 16, 27, -22, 24, 37, 57, -2, -49, -75, -22, -16, -23, -24, -69, -24, -2, -29, 8, 10, +-49, 16, 32, -9, -48, -52, -16, 26, -10, 48, -56, 14, -69, -11, -28, 26, -37, -39, -24, 65, -14, 15, -72, -19, 8, 19, -15, -13, -14, 9, -57, 4, 24, -28, -7, -35, 58, 7, 11, -12, -51, 11, -14, 39, -48, 2, 41, -49, 5, -7, 6, 51, -4, -35, -21, -48, -4, 46, 25, 0, 32, -9, 13, -42, -7, 42, 26, 1, -4, 8, 27, 9, -25, 36, -30, 17, 5, 18, -27, -25, 13, +5, -21, -64, -12, 36, 37, -19, -13, 0, -4, 21, 8, -3, 9, -2, 5, -13, 2, 40, -15, -11, 12, 31, -7, 16, -4, 1, -37, -46, 18, 14, -3, -6, 28, -14, -1, -34, 1, 24, 0, -30, -32, -23, -5, 21, -14, -19, 21, 15, 10, -16, -1, 17, 9, 14, -32, 5, 16, 14, -8, 14, 29, 6, 57, 9, 6, -11, -12, 20, -14, 3, -40, -27, -51, -15, 30, 37, -53, -40, -20, 0, +-53, 36, 11, -42, 4, 58, -13, 50, -102, -1, -85, 8, 25, 19, 73, 28, 23, -33, -22, -1, 88, 35, -36, 12, -20, -11, -9, 9, -3, 38, -23, 40, -6, -5, 31, -17, -4, -3, -7, 1, 15, 8, -29, -18, 11, 32, 2, 11, -17, 30, 42, -10, -10, 16, 34, -9, -10, 7, 31, 10, -3, 30, -8, 48, 84, -31, 2, -19, 16, 7, 27, -10, -1, 1, -99, 9, -1, -13, -13, -4, -18, +24, -19, 5, 33, 18, -1, 4, 36, 80, -39, -16, 12, -49, -7, 27, -38, -25, 7, -47, -60, 57, 0, -10, -28, -3, 9, -66, -53, 89, 3, -42, 2, -35, -23, -78, 46, -106, 21, -54, -11, 9, 12, 4, 10, -1, -3, 47, 13, -53, 27, 8, 4, 21, 25, 6, 25, 39, -68, -24, 21, -36, 21, -8, -11, 7, -5, -13, -11, 28, 14, -19, -29, -18, 7, -41, -27, 2, -13, -28, -25, 45, +-7, 3, 1, -2, -23, 23, 21, 3, -41, -22, 6, 31, 27, -32, 22, 3, -19, 48, 7, 6, -14, -23, 17, 28, 7, 0, -14, 3, -32, 57, -16, -33, -13, -4, -46, 9, -33, -3, 0, 35, -127, -28, -42, -63, 13, 41, 59, 13, 4, 17, -18, 5, -25, 0, -20, -6, 0, -19, -28, -26, 64, 12, -4, 11, 4, 44, -6, -17, -10, 26, 19, -2, -65, -30, 1, -8, 13, 7, 4, 0, 30, +9, 18, 6, -59, -61, 23, 11, 47, -60, -19, -6, -19, 17, 47, 64, -7, -30, -15, 3, -13, 38, 2, -52, 27, -40, -15, 49, -11, -31, -80, 15, 43, -35, -11, -28, -2, -6, 44, -19, 77, 59, 18, -5, 28, 13, 10, -55, -14, 46, 24, 11, 38, -14, 21, -10, -9, -34, 21, 9, -2, -49, 80, -15, 19, 11, -21, -25, -45, -86, 13, 64, -14, -15, 50, -54, -1, -18, 1, -87, -6, -52, +14, 27, 16, 42, -12, 9, 4, -2, 5, -32, 30, -56, 44, 0, -46, 18, -5, 53, 23, 16, -1, -56, -26, -38, -26, 46, -49, -4, -18, -43, -40, 31, -69, -63, -16, -2, -39, -1, 43, -31, -3, -34, -4, 42, 71, 13, -13, -43, 44, 13, 77, -45, 2, -30, 21, -60, -4, -51, 20, 64, 17, -79, 47, -25, -17, 32, -21, -19, 127, 18, 34, -71, 4, -49, -8, 23, -7, 0, 6, -9, -16, +-14, 39, -6, 47, -17, 16, -9, -18, -24, 8, 25, 36, -5, 18, 1, 0, 53, -17, -30, 20, 33, -20, -42, 13, -26, 35, -44, -14, 33, -15, -40, 26, -55, -42, 9, -5, -1, -39, -25, -8, 21, 1, -25, -18, 37, -92, 11, -48, -4, 17, 3, 41, 1, -13, -63, -17, 26, 8, -64, -30, -25, -29, 21, 14, 9, -26, 20, -13, 0, 11, -9, 56, -4, -32, -4, -33, 44, -14, 8, 18, 4, +18, -3, 35, 10, 16, 28, -12, 27, 22, 14, -39, 24, -61, -2, 17, 6, -16, -21, 9, 109, -28, 20, -52, -13, 14, 43, -49, 1, 11, -8, -73, -1, -32, -46, 35, -23, -68, 4, 40, -14, 48, -49, 43, 45, -14, 15, 11, 48, 2, 28, -6, -26, -30, -8, 8, -65, -18, -3, -12, 22, -28, -26, 43, -1, 22, -18, -16, -2, -26, -19, -6, -6, 11, 39, 19, 24, -21, 17, 21, -14, -12, +26, -15, -24, -7, -11, 8, -47, 35, -45, 34, -47, 7, -32, 42, 14, -17, 3, 19, 12, 17, 13, -20, -47, 5, 3, 23, 26, -33, -23, 57, -38, -35, 36, 77, 32, -55, -34, -16, -31, 40, -29, 22, -4, 4, -75, 28, 62, -18, -122, -47, 34, -11, 4, 15, -30, -26, -52, -10, 58, -67, 38, 44, -40, -9, -20, -14, -15, 9, -3, -11, -4, -4, 33, 15, -43, -17, 8, 2, -43, 44, -14, +10, 17, 8, -5, 17, -14, -8, 32, 7, -3, -28, -27, -12, -4, 25, -49, 9, -8, -13, 5, 19, 33, -102, -20, -88, -4, -11, -15, -2, -10, 6, -5, 14, 19, -37, 26, 13, 6, -1, -15, 34, 2, 40, 4, 30, 11, -42, 33, 39, -49, -13, 48, -48, 38, -28, -51, -34, 24, 11, -48, 35, -33, -4, -24, 11, -13, 22, -56, -29, -1, 14, -4, -25, 29, 26, -8, 23, -19, -8, -14, -8, +2, 2, 3, 3, -19, -6, 20, -5, 3, 0, 2, 23, -67, -30, -17, -26, 5, -11, -8, 0, -43, -12, -12, 8, -14, 2, -46, -3, -5, -3, -57, -13, -23, -28, -42, 14, 66, 3, 31, 40, 2, 60, 3, -24, 20, -10, 5, -55, 19, 39, -35, 0, -24, 17, 25, 45, -44, 20, 4, -24, 39, 8, 19, -6, -22, 31, -44, -20, 26, -3, -61, 15, 23, 100, -4, -16, -127, -32, 10, 7, 82, +-28, -10, 0, -20, 0, -99, -59, 14, -4, -39, -38, -3, -28, -59, 2, -4, -26, -15, 3, -37, 4, -48, 16, 9, -79, 4, -66, -59, 21, -30, 6, -62, 38, 36, 0, 42, -42, -13, -54, 59, 10, 57, -6, -5, -10, -45, -30, 8, -17, 34, -30, 20, -61, 8, 31, 34, 15, 20, -20, -50, 116, 12, -82, -93, -6, -40, 0, 4, 65, -27, -35, -3, 11, -35, -31, -73, 0, -56, -37, -3, 60, +-21, -36, 0, -38, 0, -34, -43, -46, -4, 38, -104, -26, -42, 19, 18, 48, -32, 0, 6, -24, 5, -19, 19, 1, 23, 2, 73, 38, -6, 13, -29, 19, -4, -7, -9, -27, -23, -6, 7, 51, -2, 60, -113, -89, -56, 15, -40, -1, -36, 0, -16, -2, -15, -22, -37, -10, 8, 11, 12, -8, -44, 6, -10, -31, -1, 16, -13, -10, 9, -17, 3, -18, -2, -39, -91, -49, 18, 7, -7, 43, 11, +0, -2, 27, -37, -13, 27, -1, 17, 3, -100, -11, -21, 1, 29, -53, -16, -11, 45, -11, -47, 1, -12, -30, -4, 3, -127, -2, -40, 0, -4, -56, 27, 0, 18, 86, -17, 0, -9, 1, -7, 3, 6, 11, -62, 38, 23, -30, 1, 25, -41, 22, -16, 62, 4, 70, -13, -3, 40, -72, -1, -15, -66, 37, 30, 0, 84, -54, -34, 55, -11, 7, -61, -32, 37, 20, 3, -18, -4, 4, 3, -2, +11, 2, 22, -5, -16, 13, 1, 51, -117, -38, -29, -1, -5, -14, -64, 0, -90, -55, 22, -17, -48, -4, -13, -1, -22, -6, -4, 18, 22, -32, -9, -24, -26, 2, 39, -16, 17, 4, -11, -12, -127, -13, 4, 28, -2, 26, 13, 0, -15, -5, -19, 3, 1, 2, -48, -4, -16, 0, 5, -20, 14, 35, 11, 21, 5, 10, -80, 5, -18, -49, 7, -27, -112, -63, -25, -17, 39, -27, 40, 0, 91, +-19, -27, -50, -98, 10, -34, -24, 45, -7, -8, -5, -2, 11, 10, -37, -21, 36, -8, -3, -7, 18, -12, 8, -54, 60, -57, 69, 10, 10, 45, 0, 23, -21, 38, -9, -127, 0, -4, 31, -21, 1, 4, 5, -11, -4, 9, 3, 2, -24, -1, 7, -2, -3, -5, -6, -97, -2, -47, 127, 3, 79, -29, 0, -7, 31, 2, 8, -9, -18, -8, -19, -25, 35, -57, 5, -13, 41, -13, -21, 38, 67, +-51, 40, 5, -3, -17, 25, -47, 7, -30, -36, -12, 108, 44, 0, -5, 56, -17, -8, -15, -13, -1, 7, 3, 21, -4, -9, -25, 37, 2, -19, -17, 9, -24, -4, 5, 11, -2, 28, 7, 6, 38, 26, 10, -6, 20, 2, -26, -9, -74, 4, -4, 12, 70, 28, -7, -38, 34, 2, -2, -40, -42, 74, -39, 30, -5, 67, 28, 36, 22, -46, -16, -43, 56, -45, 22, 4, -16, 45, -20, -4, -25, +33, -18, 5, 55, 9, 4, 44, -2, -26, -43, -9, -12, -12, -90, 21, -45, 20, -3, -21, -6, -8, -1, 24, -31, -21, -76, -79, -32, 16, -44, -15, -10, 22, -3, -31, 28, 39, 125, 34, 14, -24, 0, -28, 8, -2, -60, -30, 29, 21, 93, -33, -13, 20, -29, 42, -36, 73, -9, -19, -40, -6, -18, 14, -36, 24, -43, -5, 43, 33, -30, 18, 38, 10, 22, -34, 13, 20, 7, 53, -127, 0, +8, 15, -14, -96, 13, 45, 0, 58, 22, -20, -28, 26, -2, -45, 15, 28, -13, 76, -79, 32, -36, 11, 30, -46, 32, -32, -3, -10, 3, 42, -77, 16, 12, -4, -10, -30, -11, -5, -53, 14, -50, 9, -27, -36, -12, -20, -38, 50, -22, -37, 5, 8, 66, 3, -68, -5, -5, 39, -6, 4, -24, 37, -40, 32, -24, -19, -20, -42, -8, 21, 26, -43, -10, 60, -127, 13, 22, -20, -3, -9, 5, +72, -70, -20, 18, 11, 5, -18, -27, 7, -8, 8, 65, -28, 35, -4, -2, 24, -16, -8, -26, -5, 24, -20, -14, 24, 9, 0, -32, 3, 23, 40, -6, -28, 13, -1, 37, 1, -80, 10, -35, -30, 27, 24, 54, -27, -27, 32, 8, 3, -19, -6, -6, -5, 18, -15, -3, -3, 28, 23, -11, -3, -6, 11, -7, 16, 51, -28, 14, -60, -27, -34, 69, 32, 38, -64, -13, -4, -17, -19, -35, -47, +33, -1, 0, 9, -52, 21, -52, 54, -38, 58, -20, -58, -64, 90, -44, 28, 4, 35, -5, -15, 21, 5, -11, 20, -29, -50, -37, -11, -27, -30, 4, -37, 19, -1, -1, 8, -27, 2, 13, 13, -24, 38, -31, 29, 27, 18, -32, 0, 25, -58, 36, -9, -21, 47, 53, -42, 30, -84, 10, -37, 8, -23, -6, 10, 0, 31, -17, -6, -30, -10, -22, -15, -9, -5, 14, 30, 20, 10, -54, 11, -6, +-16, 29, -14, 22, 119, -19, 22, -17, -10, -10, -32, 127, 11, -14, -19, -51, 28, -10, 2, 32, 43, -17, -4, -5, -39, 30, 60, -58, 36, -8, 34, -44, 93, 30, -14, -17, -25, 29, -5, -17, -53, -11, -43, -18, -13, -10, -111, -3, -6, 46, -44, -23, 44, 1, -31, -24, -1, -55, 14, -63, 7, -54, -14, -50, 3, 63, 17, -10, 0, 15, -6, -31, 16, -78, -27, 10, -3, -12, 6, 12, 62, +-17, 3, -32, -20, -5, 21, -1, -9, 38, -1, -17, -23, 3, -14, 53, 7, 5, 6, 7, 41, -3, 11, 34, -60, -11, 31, -2, 15, 19, -28, 25, 30, 9, 17, 30, 4, 73, 14, -8, -5, -13, -16, -29, 19, -13, -16, 19, -17, 4, -22, -3, -3, -56, 19, 0, -1, -22, -19, 4, -49, -21, -10, 0, 2, 3, -19, 14, 14, -7, 2, 30, 1, -2, -10, 38, -4, 7, -17, 7, 0, 32, +84, 0, 16, -92, 70, -37, -5, 19, 2, -26, 21, 31, 0, 1, -57, 25, -13, -15, -47, 2, -10, -2, 58, 27, -12, 46, 4, 31, 62, 17, -29, 6, 0, 14, -23, -106, -36, 22, -54, -3, -41, -14, -108, -5, 100, 9, 18, 14, 28, -6, 68, -63, 22, 27, 19, -7, -17, -38, -15, -15, 19, 10, 13, 32, 26, -69, 0, -1, 32, 28, -93, 29, -2, 44, -127, 12, 35, 0, 10, -16, 5, +34, 45, 8, 24, -36, 4, -36, -3, -15, -22, -50, 20, 21, -5, 82, -20, 13, 9, -110, 0, -5, -21, 35, 65, 29, -47, -36, -44, -34, 37, -34, -53, 16, -14, -5, -50, 67, 61, -24, -21, -35, 48, 33, 14, -28, -38, 44, -13, -12, -46, -65, -46, 52, 13, -13, -54, 26, -59, 48, 61, -11, -27, -4, -30, 13, 1, -3, 50, -6, 50, 41, -18, 32, -56, -49, -11, 22, 17, 79, 4, -42, +-14, -31, 4, -44, -2, 2, 39, -33, -105, 30, -8, -10, -37, 28, -36, -38, 37, 37, 32, 21, -42, 4, 64, 11, -31, 8, 61, -2, 9, 31, 3, -47, -41, -62, 17, -22, -14, -42, 12, -5, -64, 11, 4, 21, -10, 17, 51, -13, 21, 51, -15, -52, 21, -53, 44, -21, -5, 59, -46, -11, 9, 37, 1, -8, 11, -25, -3, -17, -8, -8, 4, 0, -42, 31, -12, -5, 3, -40, -3, 8, 14, +-10, 40, 8, 48, 9, -34, 51, -23, 22, -7, -21, 2, 47, 30, 64, 50, -14, 62, 76, -81, -17, 13, -36, 90, 66, 25, -12, 1, -68, -55, -87, 18, 20, 2, 38, -51, 92, 41, 38, -33, -65, 44, -7, -89, -46, -1, 23, -28, -80, 51, 5, -17, -38, -49, 12, -70, 0, 13, -31, 15, 36, 4, 25, 9, 12, -2, 17, -49, -27, 26, 14, -52, 26, -27, -27, -6, 52, 12, 11, -23, -34, +-23, -4, 9, 4, -6, -17, -51, -29, 20, 17, 50, 19, -33, -5, -12, -37, 25, 32, 23, 45, -27, 23, 0, 24, 15, 40, -12, 47, 53, 1, -100, -20, 14, 69, -26, -77, 3, -40, -38, 39, 51, -59, -6, -99, 50, 27, 17, -16, -5, 21, 11, 24, -43, -12, -6, 40, -49, -5, 13, 49, -1, -51, -6, -32, -59, -44, 8, 54, -34, 6, -69, 21, -32, 17, 31, 3, 49, -8, -47, -2, 11, +64, -16, -47, -15, 39, -9, -32, -27, 16, -30, 38, -32, 17, 1, -51, 1, -15, -17, 3, -9, 10, -62, 44, 14, -9, 11, -21, -16, 21, -22, 23, 19, -12, -4, -7, 24, 15, 1, -22, 0, -12, 3, 8, 29, -9, -15, -56, -49, 32, -1, -48, 34, -39, -44, 72, -46, 20, 42, -49, -42, -24, 27, 0, -30, -38, -11, 9, 27, 32, -45, 12, -9, 0, 4, 48, 5, 6, -36, 3, -13, 9, +20, -3, 18, 5, -15, -1, 0, -7, 9, 21, 0, 20, 0, 0, -4, -1, 4, -8, -13, -69, -15, -3, 11, -27, -6, 18, 21, -86, 56, -39, 27, -20, -14, -1, 37, 20, 68, 3, -42, -35, 94, 1, 3, 1, -25, 6, 8, -13, 9, -30, 24, 64, -18, -23, 11, -86, 8, -17, -35, -3, -3, 7, -9, -33, 27, 19, -1, 11, -99, 65, -6, -14, -13, -28, 48, 15, 47, 7, 2, -23, -19, +25, 23, -92, -3, 36, 35, -47, 14, 31, -52, -16, -6, 27, -8, 14, 25, 9, 11, 15, 37, -71, -15, -5, -64, 19, 96, 15, 19, -55, 36, -25, -21, -47, -52, -109, 69, -34, -28, -8, 53, 65, -26, -17, -65, 91, 21, 35, 0, -105, 2, -13, 23, -2, -22, 15, 33, 33, -1, -1, 31, -68, 2, 14, 2, 20, -24, -46, -37, 0, -24, 91, 20, 24, 11, 4, -53, 5, 16, 22, 53, 28, +40, -20, -19, -18, -36, -19, -67, 8, -14, -42, -51, 11, -11, 15, -35, -6, -20, -96, 9, -31, -11, -4, -25, 9, 78, 0, -3, -9, -98, -32, -3, 2, 20, 6, -45, -1, 20, 16, 52, -3, -3, -10, -9, 60, 3, 1, 19, 21, -9, -75, -12, -11, -7, -53, 30, -23, 12, 5, 23, -127, -32, -73, 12, -57, 0, 27, -44, 20, 5, 14, 10, 25, -7, -1, 20, 8, -10, -19, -67, 22, -30, +-58, -3, 7, -6, 3, 17, -16, -3, -16, 5, -4, -12, -13, -2, -14, -1, 14, -23, 28, -4, -13, -12, 2, -26, 5, -3, 83, -1, 19, 4, 13, -42, -66, 4, 8, 23, 6, -9, -26, -39, -51, 10, 74, -34, 89, -4, -62, -22, -27, 3, 27, 7, -24, 62, 63, 1, 23, -61, 103, 63, 31, 35, 10, -78, -81, 52, -36, -36, 15, -2, -15, 19, 12, -30, -21, -95, 18, -34, -9, 54, 11, +-27, 18, -6, -63, 2, 21, 38, 32, 6, -10, -7, 2, 56, -20, 34, -117, 14, -2, 21, 8, 18, -69, 54, -37, 27, 26, -16, -36, -41, -17, 9, 1, 20, 1, -2, -19, -52, -6, -15, -3, 1, 32, 12, 6, 0, -33, -1, -88, -21, 28, 4, -19, 0, 8, -3, -46, 56, -72, 1, 81, 24, -35, 36, 47, -10, -14, -18, -8, -30, -31, 24, 2, -23, 82, 9, -36, -10, 43, -26, -109, -15, +-32, 17, -59, -19, -44, 46, -34, -44, 16, 0, 53, -35, 0, -35, -14, 35, -20, -9, 2, -15, 63, -4, -20, 38, 101, 7, 23, 21, -28, -19, -79, -16, -22, -24, -28, 8, -4, -17, 35, -7, -15, -9, 12, -37, -1, 14, 3, 33, -23, -8, -12, 10, -6, 25, 16, -7, 9, 13, -15, 15, -3, -5, -86, -13, -37, -15, 26, -19, -10, -7, 20, -20, 24, -72, -8, 15, -58, -10, 15, 48, -4, +10, -3, -16, 0, -57, 22, -12, -16, -10, 10, 34, -44, 11, -50, -21, -17, -18, 11, 9, 27, -22, -14, 1, -5, -8, -11, 2, 16, 17, 6, 17, 9, 10, -2, -15, -11, 5, 8, -3, 0, 8, -1, 11, -14, -15, -8, -14, 54, 2, -13, -5, 20, -41, -83, -37, -2, 22, -33, -49, -33, 7, 24, 60, 10, -12, -32, 28, 46, -81, -48, -70, -21, -11, -5, -2, -24, -59, 71, -13, -11, -10, +10, -13, 0, -25, -44, -2, 22, 21, -3, 22, 18, 1, -36, -6, -42, -29, 30, -1, 43, -11, -31, -8, -39, -14, -53, -28, -31, 18, -27, -76, -50, 34, -30, -82, -27, 30, -90, -48, -47, -98, 22, -20, 4, -53, -16, -1, -73, 35, 8, 29, 20, 45, 8, -3, 9, 13, 23, -13, 9, 57, 13, -51, 24, -27, -45, -21, -14, -22, 31, -22, 83, 19, -92, -39, 18, -35, -32, 13, 33, 16, 18, +-17, -55, 38, 74, -49, -13, 57, 0, -45, 44, -71, -22, 28, 1, -26, -23, -22, 24, -1, -37, -18, -27, -15, -5, -23, 48, 37, 30, -9, -43, 31, 5, 9, 12, 7, 0, 20, 32, -57, -1, 7, -14, -13, 8, -38, -43, -23, -14, 96, 16, -18, 3, -6, -35, -1, 17, 4, -40, -51, -9, 5, 21, -17, -20, 75, 27, 24, -48, 10, -10, 13, -18, -34, 31, 21, 14, -46, -15, -3, 5, 16, +-88, 19, -17, -25, 45, 9, -55, -1, 41, 44, -44, -33, -7, 5, 9, -39, -10, -62, 0, -25, -12, 18, -17, -2, 14, 30, 17, 22, -6, -10, -16, -30, -48, -17, 29, 1, -4, 9, 8, -3, -8, 35, -7, -17, -18, -24, -14, -15, -19, -48, 3, -23, 12, -3, 7, -29, -11, -19, -7, 18, -9, 7, 2, -1, 20, -16, 61, -50, 5, -52, -33, -40, -37, -8, -47, 39, 0, 9, -28, -22, 51, +56, -85, 31, 51, -34, 26, 20, -14, 83, 24, 60, -26, 71, 22, 62, -58, -72, -20, -14, 21, 17, 37, 27, 29, 33, 73, -20, -25, 4, -2, -67, -13, -35, 25, 17, -8, -24, -4, -16, 3, 56, -29, -7, 1, 11, -127, 26, 44, 17, 22, 5, -83, 3, -1, -5, -19, 18, 15, 36, -49, -15, -5, -3, -46, -49, 7, 3, -14, -28, -30, 12, -11, 51, -12, 14, 10, -2, -4, 12, 31, 72, +19, -59, 76, -9, -61, 7, 10, 116, 127, 9, 35, 21, 18, -32, 62, -5, 48, 25, -23, -45, -64, 10, -12, -103, 22, 52, 42, -16, -22, 20, -9, -35, 5, 44, -50, -13, -18, -15, -23, 47, 3, 9, -17, 0, 38, -43, -39, -34, -25, -27, -43, -39, -20, -30, -43, 25, 41, -47, 1, 35, 13, -23, 1, -14, -14, -28, 10, -15, -6, -8, 8, -8, 26, -40, 27, 2, -12, -14, 28, 28, -21, +-20, 1, -24, 5, -8, -2, -11, 11, 15, -2, 21, 24, 25, 21, 1, -59, -27, -71, -45, -16, -8, -28, 17, 59, 22, -11, -36, -20, -13, 21, 40, -24, 10, 36, 13, -9, -7, 3, -21, 9, -16, -59, 2, 0, 23, 38, 20, -38, 22, -1, 31, -51, -22, -2, 2, -5, 14, 48, -11, -1, -24, 37, -4, 15, -5, 48, -21, -10, -46, 64, -14, -29, 38, -18, -55, -52, -49, 18, -24, 27, -25, +-26, -50, -2, 25, 29, 5, 61, -30, -34, 32, -1, -4, -20, -26, 45, 20, -6, -20, -4, -36, -25, -33, -37, -9, -15, -7, 61, 28, -14, 35, -67, 29, 19, -49, -21, -16, -2, 5, -26, 28, -3, 1, 3, -23, 29, -8, -23, -16, 27, 36, -63, 8, -10, -19, -9, 40, -18, -56, -10, 36, 50, -21, -19, 11, -15, -34, -45, -29, -23, -5, -11, 20, 27, 12, 0, -13, 84, -31, 81, 30, 13, +53, 32, 27, 42, 3, 3, 12, 0, 13, 16, -14, 2, -6, -69, -8, 21, -15, -53, -33, 2, 11, 8, -18, 11, 25, -13, 31, 16, 2, -32, -7, -26, 6, -73, 19, -12, -2, -4, 14, -21, 90, -4, -26, 19, -11, -13, 35, -9, -103, 31, 21, 51, -9, 25, -35, 0, 12, 13, 66, 79, -90, 53, 9, 51, -32, -20, -70, 14, -47, 24, 29, -18, -48, 57, -32, -35, 93, -19, -3, -1, 0, +57, -2, 14, -31, 22, -22, 6, 18, 30, 17, -22, 19, 23, -23, -38, 25, -5, -13, -39, 25, 18, -21, 12, -37, 73, -4, 30, 21, 10, 0, 18, 13, 23, -59, -38, 3, 4, -4, 6, 33, -7, 10, 15, -30, -8, 19, -2, 15, 1, -26, -15, -24, -35, 5, 29, 25, 11, 11, -20, -3, 1, 9, -21, 9, 7, 3, 16, -3, 22, 14, 13, 17, -14, -6, -6, -11, 18, -8, 17, -21, -18, +41, 8, -38, 14, 2, 41, 6, -32, 13, -50, 20, 69, 4, -11, -50, -4, 36, -44, 55, -3, 4, -5, 14, 4, 2, -4, -45, 34, 38, -21, -51, -50, -95, 52, -33, -13, 9, -21, 13, -3, 4, -30, 0, -31, -4, 13, 5, -12, 36, -2, -10, 3, -6, -12, 29, -16, 16, 1, 9, -8, 6, 20, 9, -127, 24, 50, -22, -9, -4, -22, -12, 11, -9, 5, -37, 28, 28, -10, 18, 27, -11, +-24, -19, 7, -7, 38, 7, 5, -19, -12, -39, -127, 4, -3, -31, -17, -45, 4, 35, -4, 42, -16, 1, 71, -21, 33, -12, 0, 19, 18, 4, -27, -24, -1, 15, -6, -8, -25, 11, 24, -6, -1, -8, 6, 2, -18, 30, -26, -5, 2, 4, -13, 32, -9, 1, -8, -4, -4, -20, -41, 37, 11, 5, -18, -10, -25, -21, -2, 11, 3, -20, -10, 3, -14, -12, 9, 19, 23, -13, 15, 9, -16, +29, -10, 52, 28, 3, 16, 19, -19, 15, -13, -14, -3, 92, 31, 65, 29, 7, -29, -5, 68, -33, -2, -80, -54, -57, -27, 53, 76, 31, 34, 52, 49, -12, -21, 41, -1, -6, -54, 127, 23, 19, 25, 77, -2, 9, 40, 47, -106, 27, -9, 2, -24, -19, -17, -6, -37, -67, -10, 31, -22, 6, -6, 105, 0, 43, -71, 16, -5, -29, -67, 45, -67, -5, -25, 38, -12, -19, 32, -39, -29, 0, +-19, 47, -32, -23, 26, -13, -15, -5, 47, 74, 16, -11, 25, -47, 50, 72, -4, -85, -40, -3, 11, 17, -34, 3, 21, -108, 47, 31, -12, -49, -33, -65, -13, -3, 38, -4, -3, 4, 30, 0, 14, -13, 29, -1, -16, -10, 46, 0, -14, -9, -15, 11, 15, -25, 69, -2, -51, -38, -71, 22, -22, 30, -65, -7, 21, 49, -67, 3, -28, 11, -30, -3, 9, -80, -24, -95, -62, -35, -2, 0, 27, +18, 25, -12, -71, 17, 30, 8, 1, -41, 47, 36, 26, 5, 3, -4, 8, -42, -33, 6, 85, -7, 11, -21, 3, -9, -25, -72, -35, -22, -6, -21, 2, -1, -13, 32, -53, 12, 1, -2, 22, -28, 11, -35, 5, 3, 48, 9, 0, -66, -10, 7, 70, 4, 0, 0, -2, 1, 5, 11, 11, 13, -17, -68, -21, 2, 28, -52, 30, -17, 57, -2, -18, -87, -54, -30, -18, 101, 5, 8, 80, 5, +0, -25, -25, -65, -19, -18, 13, -36, -43, -35, -21, 46, 54, 37, 32, -29, 42, 15, 44, 9, 10, -17, 13, -13, 8, 24, 21, -4, -18, -20, 6, 0, 48, -8, -4, 10, -8, 28, -13, -8, -17, -87, -13, 1, 53, 33, -10, -27, -33, 66, 21, 6, -8, -12, -8, -13, 0, -30, 4, 9, 39, -3, -4, -24, 3, -16, -15, 9, 5, 1, 9, -8, -5, -8, -34, 7, -4, 6, 2, 5, 12, +-47, -50, -4, 12, -1, 13, 5, 19, 46, 11, 9, 4, 14, -1, -12, 32, -20, 29, -1, 9, 13, 25, -22, -9, -38, 17, 4, 46, 2, 9, -2, -37, 3, -17, -15, 1, 5, -15, 29, -37, 48, 39, -5, 13, 3, 12, -2, 8, 26, -12, 35, 58, -32, 27, -42, 50, 30, 25, -58, 27, -58, 77, -57, -41, -65, -6, -7, -15, -7, 21, 12, 8, -23, -8, -30, 0, 19, 0, 25, -11, -14, +-16, 0, -13, 33, 19, -19, 16, -14, 2, 24, 4, 24, -9, 62, 19, 14, -23, -10, -37, 18, 8, -22, 69, -35, -21, 5, -16, -25, -6, 11, 8, 19, 5, 26, -29, 34, 3, -17, 38, -46, -54, -8, 16, 6, -34, 10, 18, 54, 1, -25, 28, 2, 16, 0, 33, -7, 9, 7, 9, 33, -71, -13, -7, -3, -6, 5, 3, 41, -12, 5, -8, 44, 9, -14, 24, 5, -11, -13, -4, 19, -15, +-4, -8, 15, -13, -37, 23, 46, -30, -39, -10, -18, 44, 28, -127, 13, 47, -35, -10, -16, -4, -6, -20, -68, -4, -52, 8, 20, -18, 30, 23, 11, -28, 6, 15, 3, -1, -49, 32, 43, 32, 1, -32, 9, 47, -28, -7, 9, 43, 24, -31, -8, 33, -43, 22, -22, -45, -47, -8, -50, 23, -98, -37, 30, -14, -17, 13, -25, -127, -45, 105, -1, 7, -68, -32, 57, -8, 39, 3, -56, -39, -12, +94, 0, 48, 28, 25, -16, -81, -9, 20, 19, -27, -44, 17, 88, -24, -9, 15, -35, -20, -3, -43, -36, -89, 19, -32, 10, 53, 73, -37, 0, -36, -12, 78, -19, -5, -41, 72, 25, -4, 22, -103, 68, 39, -24, 22, 2, 8, 51, -20, -22, -15, 2, 20, -39, 18, -22, 31, 46, -17, 16, -33, -52, 0, 7, -6, -45, 2, -8, 21, 6, 5, -15, 6, 15, -21, -84, -9, 9, 12, -37, -84, +19, -6, -3, -87, 8, 8, -12, -52, -51, -17, -41, 45, -13, -2, -3, -17, -57, 17, 58, -12, -43, -52, 17, -39, -1, 3, -19, -29, -52, -31, -35, 12, -61, 29, 37, -32, -19, 66, -45, -22, -22, -9, 18, -27, 30, 12, -4, -23, -8, 26, -26, 12, 37, -43, -29, -32, 22, 18, -11, 4, 19, -12, -20, 2, -32, -63, 51, 3, -10, -7, 23, 14, 0, -16, 19, 8, 4, 8, -5, -16, 10, +-53, -39, 49, 9, 32, 2, 37, 23, -24, -44, -18, -12, 20, -5, -45, 26, -7, -2, 31, -18, -33, 61, -43, -57, -30, -3, -127, -45, -60, 29, 3, 33, -16, 72, 18, -36, -50, 25, 2, 15, -11, -31, 82, 42, 38, -12, 12, 16, 7, -17, 1, -11, 0, 6, -24, -1, -12, 24, 5, 32, -32, -17, -21, -16, -44, 5, 15, 2, 50, -24, 20, -30, 10, 8, 11, -11, -39, -25, -18, 6, 24, +-3, 22, -15, -15, 21, 23, 1, -9, -20, 20, 4, 17, -5, -14, -6, 16, 6, 0, 5, 7, -27, 7, 3, 11, -17, -4, -29, -16, 8, 8, 24, -49, -21, 28, -26, 18, -42, -28, 2, -55, -53, -5, -35, 2, 2, 18, 9, -7, -11, 6, -6, -12, 1, -21, 10, -9, -1, -1, 9, -18, -11, -35, 22, 26, 1, -16, -20, -49, -50, -7, -3, 63, -45, 4, 20, -16, 5, 19, 15, 7, 32, +22, -10, 8, 22, 17, 24, -6, 5, 25, -28, -34, -13, 5, -26, -2, 3, 3, -13, -13, -32, -15, -8, -48, -46, -27, 18, -24, 28, 15, 7, 36, 0, 4, 85, -46, 14, -7, 16, -19, 1, 12, 15, -23, 35, 27, -7, -19, -11, -11, 19, 30, -26, -2, 26, 18, -32, -22, -30, 9, -41, -27, -2, 10, -37, -17, -11, -64, 3, -36, 32, -1, 8, 28, -33, 21, 18, -49, -10, -18, 4, 5, +24, -4, 27, 14, 1, -31, 36, -12, -15, 47, 15, 8, 0, -11, 10, -11, 20, -14, -50, -10, 9, -1, -21, 12, 0, -12, -15, -6, -14, -14, -4, -2, -34, 41, 14, -8, 16, 43, 25, -11, 21, -17, -28, 7, -7, 24, 32, -2, 52, -61, 51, -7, 6, -55, -22, 11, 5, -23, -53, -2, -1, 23, -86, -52, 9, 81, -43, 44, 9, 4, -25, 49, 35, -7, -23, 27, 97, 47, 111, 5, 7, +31, -7, -7, 47, -35, -79, 3, 19, 43, -60, -17, -53, 27, -34, 0, 13, 13, -11, 36, -27, 36, 44, -60, -42, -6, -48, -2, 10, 1, 86, -62, -2, 48, 42, -61, 2, 17, -10, -9, 15, 12, 22, -61, -4, 9, 16, 31, -4, -41, -10, 56, 20, -13, 6, -3, 52, -5, -35, -70, 3, -27, -64, 53, -1, -19, 0, 14, -23, 40, 18, -65, 7, 35, 8, -33, -12, -19, 15, -17, 2, 16, +18, -22, 8, -23, 11, 21, -43, -4, -52, 38, -9, -9, -6, -30, 10, 9, 0, -1, -35, 0, 1, 35, 3, -9, 12, -1, -10, -88, 49, 18, -68, -19, 18, 79, -29, 49, -14, 17, 8, 7, 46, -79, -2, 3, -28, -25, 75, 22, 0, 31, -70, -12, 11, 45, 22, -4, 51, 15, 37, -36, 1, -29, 21, 27, -12, 8, -7, -25, -36, 51, 52, 32, 16, -71, 15, -58, -15, -16, -15, 15, 0, +13, -23, -31, 39, -19, 28, -38, -21, -22, 2, -23, 41, -57, -35, 15, -23, -41, 27, 28, -21, -17, 0, 10, -39, 2, 46, -13, -56, 15, -67, 9, 0, -18, -13, 73, -35, -39, 8, -29, -1, 9, -5, -25, 41, 81, 69, 19, -3, -29, 25, -47, -45, -72, -69, -14, -29, 45, 67, -18, -31, 57, 63, 35, 0, 20, 72, -14, -80, 48, -6, 64, -11, -8, -5, 1, 5, -10, 22, 7, -33, 17, +-8, 44, -9, 2, 26, -9, 5, -127, 26, 98, -11, 8, 8, -9, 0, -60, -3, -13, 44, -13, -7, -6, -2, 49, 17, 2, -26, -11, 11, -7, -13, -13, -4, -5, 15, -14, -5, 54, 10, -127, 29, -8, 49, -2, -19, -4, 0, -4, -27, 13, 1, 11, 19, -27, 0, 14, -23, -15, 13, -48, 13, -9, 8, 13, -14, -21, -1, 11, 22, -2, -11, -72, -33, -5, -2, -32, -21, 9, 0, 11, -5, +4, -23, 19, 1, 24, 5, 2, -7, 18, -14, 13, 74, 4, 56, -20, 0, 26, -20, -6, -29, -8, -54, -112, 40, -36, 47, 3, 70, 25, 0, 1, -35, -44, 23, -13, -3, 51, 27, -8, -18, 14, 25, 12, 11, -1, 0, 14, 4, -10, 7, 17, -17, -11, -9, -75, 1, 7, 28, -12, 33, 1, 0, 27, 25, -12, -2, 11, -2, 6, 23, 20, 9, -19, 11, -55, -4, -23, 1, -11, 2, -57, +18, 11, -6, 12, 8, -42, -35, -21, 14, 6, -12, -24, 0, 12, -34, 11, 27, -26, 17, 9, -38, -31, 4, -13, -10, -12, -20, -14, 14, -17, -19, -6, -2, -39, -45, 13, -21, 12, -12, -12, 27, 4, 17, 127, 0, -21, -42, 7, -7, -6, 4, 10, -4, 13, -1, -63, -19, -8, 43, 5, 0, 9, 35, 8, 12, 30, 38, -12, -22, -88, -34, -30, -92, -11, 15, 2, 0, 38, 75, -18, -28, +-15, 4, 61, 10, 1, -33, 57, -12, -35, 16, 9, 15, -42, -15, 103, -30, -45, 25, -21, 0, -77, -14, -44, 36, -40, 68, -10, 0, -6, 33, 97, 29, -127, -4, -12, -15, -1, 17, 43, -62, -64, -47, -28, 47, 39, 7, 38, -34, 40, -36, -7, -64, -72, -10, -47, 25, 18, -12, -52, 0, -90, 81, 16, 71, -28, -8, -29, 54, 110, -22, -64, 14, -63, -38, -19, 12, -110, 123, 75, -12, 3, +-28, 15, -42, -28, -127, 1, 10, 52, -45, -11, -12, -9, -45, -77, 26, 4, -26, 12, -65, 6, -35, 35, -29, 27, 0, -32, 17, 127, 15, 91, 14, 5, -72, -3, -27, 56, 18, -27, 12, 42, 12, -3, -34, -26, -19, 15, 29, -25, 13, -39, -19, -15, -10, 63, -127, -6, 42, -24, 39, 30, -2, 9, 47, -12, 2, -22, -2, -57, 67, 78, 27, 9, 9, -17, 52, -94, -9, -2, 33, -26, -63, +34, -41, 63, -28, -2, -127, 6, -27, -38, 20, -5, -83, -9, -32, 4, -18, 7, 18, 2, -8, -4, -31, 10, -37, -10, 70, -35, 25, -53, 44, 5, 30, -11, 22, 35, -42, 23, -31, 14, -127, -14, -104, -48, 102, 1, -17, -6, -26, 26, 21, -11, -5, 17, -29, -32, -22, 44, -44, 13, -27, -22, -75, 24, 13, 19, 27, -32, 34, -46, -40, -14, -42, -1, -84, 1, 26, -17, 29, -4, 52, 14, +-56, -27, -58, -22, 123, -38, -46, 42, 19, -56, -38, -13, 54, -20, 36, -47, 53, 9, -4, -7, 2, 9, 12, -59, -21, -41, -36, -47, -68, 6, 24, 10, 45, 6, -10, -37, -21, 10, -50, -20, -4, -59, -21, -41, 12, 14, 10, -16, 4, 14, 15, 4, 9, -13, -12, -1, -5, -38, -52, 20, -19, 1, 41, -6, 15, 9, 19, 4, -11, -15, 30, 21, -9, 16, 16, -21, 11, -2, 11, 5, -52, +-3, 10, 3, 9, 30, -10, 36, -22, 11, -19, 10, -4, 19, -17, -2, 17, -12, 7, 20, -22, -21, -8, 28, -11, 25, -10, 4, 44, 6, 3, -1, 11, -13, -11, 48, 34, 37, 0, -55, -41, 103, -16, -65, -20, -11, -2, -37, -3, -26, 28, -32, -48, -28, 29, -68, -22, -42, 112, -15, -44, 6, 19, -8, 57, 15, 6, -19, 36, 49, 22, 39, -17, 56, -28, -12, -4, 2, 23, -23, -20, 3, +-2, 6, 32, 11, 11, -64, 24, 17, 27, -23, -8, -19, 9, -59, 4, -15, 30, -10, -25, -29, -34, 4, -53, -37, 33, -2, -25, -9, 19, -17, -30, 11, 11, 3, -4, -22, -23, -10, 39, -73, 9, 4, 27, -22, 54, -54, -20, 33, 10, -32, 3, -19, -17, 15, 28, -19, 6, -15, -9, -3, 9, -8, -23, -36, 16, 7, -27, -3, -29, 3, 19, 3, 25, 17, 0, 4, -8, 11, 19, 3, -48, +7, 96, 3, -26, -33, -5, 31, -41, 0, -25, -23, 24, 32, 51, 22, 11, -30, -7, 45, 10, -8, 6, -86, -5, -65, 11, -22, 4, -22, -62, 18, 1, -33, -45, -49, -28, -103, 2, 6, -5, 3, 66, -2, -44, 48, -32, 63, -80, -23, -17, 12, -53, -24, -19, -70, 33, 25, 50, -37, 48, -35, 70, 43, -84, 60, 40, -28, -2, -40, -26, -12, 9, 97, -4, -44, -46, -6, 11, 50, -15, -45, +47, -31, -28, 11, -3, -19, -14, -88, 18, 37, 22, -92, -51, -28, -8, 0, 29, -95, -20, -38, 42, 32, 81, 14, 40, -18, 37, 10, 30, -29, 27, 17, 7, -16, -9, -8, -65, -42, -23, 9, -33, -2, -2, -2, 31, 14, 2, 82, -22, -9, 30, -49, 4, -9, -11, 39, 58, 21, -37, 32, -17, -76, 2, -24, -8, 32, 20, -20, -8, -17, -6, 55, -19, 30, -10, -14, -43, 22, 25, -42, -55, +-55, 15, -17, -76, 20, 38, -16, -77, -64, -38, 10, -13, 86, -25, -6, -39, -23, 32, 120, -25, 49, -20, 89, 45, -32, 16, 34, 1, 74, 10, -66, -80, 11, 61, 54, 45, -11, 21, 8, -38, 25, 21, -2, 20, 39, 12, -12, -9, -29, 16, 31, 4, 48, 11, 5, -34, 2, -56, 26, -19, 58, -6, 33, -32, -23, 24, -9, -24, 60, 60, -21, 39, 16, 50, 21, 28, 16, 12, 11, -10, 14, +16, 4, 34, 8, 1, 25, 7, 7, 2, -3, -17, 36, -33, -23, -11, -116, 22, 13, 14, -42, -64, 23, -14, 88, 67, -19, 45, -75, -68, -58, 0, 15, 35, -57, 5, 16, 54, -21, 65, -21, 11, 14, 30, -33, -31, 1, 28, -68, 2, 11, -20, -3, -5, -14, -94, 9, -63, -27, -4, 34, -14, 3, 44, -1, 11, -77, 39, -9, 4, 34, -38, -23, -14, -27, -6, -13, 0, -8, -36, -39, -2, +4, 7, -3, -7, -8, -9, 27, -7, 18, 3, -18, -17, -3, -57, 7, 7, -5, 12, -25, 4, 2, 18, -4, 15, -7, -7, 51, 1, -35, -61, -15, 15, -23, -127, -26, -9, 6, -40, -2, -5, -31, 32, -10, -28, -16, -58, -5, -21, 4, 11, -16, -10, 4, 15, -25, -15, 0, -28, 33, -3, -32, 31, -86, -62, -49, 18, -22, -4, -15, -120, 4, 32, 15, 21, 55, -34, -6, 48, 55, -25, 52, +21, -1, 8, 12, 20, -5, -40, -8, -12, 36, -5, 21, -17, -49, -19, 24, 16, 3, 16, -2, -50, -11, 21, -14, -3, -6, -2, -11, 15, 16, 7, -10, -14, -35, 0, -7, 6, 5, -7, -9, 3, 27, 37, 17, -44, 2, 2, 14, -61, -7, -7, -4, -7, -3, 15, 61, -29, -43, -41, -18, 19, -5, 8, 56, -37, -36, -27, -29, 60, 47, -21, 12, -14, 28, -7, -13, 15, 4, -3, -3, -11, +17, 47, 18, -23, -22, -13, 17, 7, -3, 6, 7, 19, 8, 20, 9, 5, -5, 8, -16, -18, -11, -5, -3, -9, -2, -4, -1, -18, -25, -26, 18, -3, 31, 11, 20, -37, -40, 10, 24, 50, 54, -10, 27, 10, 11, -12, 36, -22, 35, 14, -9, -49, -24, 14, 27, 8, 51, 8, -6, -36, -24, 22, -72, 17, 24, 21, 20, -81, 24, 25, 6, 22, -48, -6, 9, -20, 55, -28, 19, 6, -46, +20, -60, -11, 40, -32, 6, 8, 22, -17, -94, -43, -53, 50, -107, -14, 9, 19, 3, -84, 8, 78, -11, 22, 48, -15, 17, -6, 44, -52, 88, 125, 12, 29, 42, -5, -26, -31, -12, 18, 106, -64, 33, -24, -127, -3, -25, -102, -81, -2, 39, 22, 61, -9, 15, 10, 66, 0, 11, -13, -4, 3, 65, -23, 86, -25, -49, 17, -22, -28, 58, -59, -18, 25, -13, 28, -36, -25, 24, 6, -8, 42, +9, -33, 15, -5, -11, -8, 22, 0, 11, -89, -41, 4, 20, 29, 8, 11, -38, 3, 20, 7, 19, 21, 41, 38, 13, -16, 8, 57, 16, -33, -25, -12, -8, -56, -14, -50, -37, -51, 34, -9, 5, -26, -35, 25, -18, -38, -11, 26, -24, 63, 0, -33, -53, 24, 30, -32, 5, 18, -13, -26, -28, 28, -77, -22, 32, -9, 23, -7, -25, -5, -39, -17, 7, 8, -31, -12, 53, -22, 9, 13, -31, +-70, 23, -122, -14, 38, 46, -27, 4, 62, 28, -59, -14, 13, -16, 33, 50, -32, -25, -21, -18, -37, -48, -12, 6, 58, 47, 23, 42, -17, -24, 65, 33, 9, 21, -33, 24, 17, -14, -19, -33, -11, 7, -60, -18, 7, 16, 80, 51, 93, 0, 25, -52, -54, -13, 27, 2, -1, -16, 37, -40, -32, 74, -26, 99, 78, -12, -51, 55, -60, -64, 7, 3, -20, 46, 6, 0, -19, -31, 6, 5, -66, +-19, -26, 22, -28, -13, -17, -6, 24, -28, -29, -14, 10, 19, -37, -101, 32, 10, 3, 4, -12, -57, 12, -30, -5, 14, 4, 23, 30, 8, 1, 7, -28, -13, -2, -1, -24, 0, -5, -17, -14, 16, -13, 18, -1, 13, 0, -92, -4, 11, -2, -33, 22, -3, -16, -10, -14, 13, 20, -8, -37, -6, 0, 18, -14, -16, 1, 24, -16, 7, -11, 14, 11, -33, 12, -17, 23, -14, -15, -59, 0, 6, +2, -22, 14, 10, -4, -20, -60, 13, -33, -58, 59, -67, 18, -12, -127, 11, 25, -12, 43, 46, -14, -4, -8, 30, 0, 30, 18, 18, 11, -66, -7, 24, 55, -38, -73, 56, -25, -5, 10, -28, -37, 11, 25, -12, 4, -14, 2, -14, 6, 20, -13, 9, -11, 3, 3, 12, -7, -1, -2, 2, -29, -17, 4, -10, 7, 8, -1, 19, 23, -18, 33, -17, -20, 18, -5, -8, -32, 12, -5, -38, -2, +54, -35, -8, 11, 37, -57, 94, -33, 44, 53, -14, -57, -58, 37, -2, -9, 23, 21, 23, -17, -6, 26, 26, 18, -17, 49, -1, 24, -23, -10, 13, 13, -39, -19, 15, 0, -1, -4, 11, 11, 0, 19, 10, 5, -62, -15, 18, 11, -2, -27, -20, -17, -26, 20, 25, 27, -4, 36, -45, -20, 15, -4, -24, -20, -19, 15, 21, -43, 19, -2, -2, 19, -6, 34, 28, 30, -69, 19, -18, 32, 7, +-16, -7, 7, 14, 6, 22, 2, 88, -33, -83, 37, -34, 44, 12, -16, 25, -16, 19, -8, -17, -6, 86, 18, -4, -30, 67, 35, -37, 52, -2, -11, -11, 16, 21, 2, -33, -57, 7, 8, -27, -26, -15, -84, -9, -21, -29, -8, -16, -6, 58, 42, -32, 30, 38, 25, 11, 6, -120, 18, -12, 39, -16, 78, -15, 13, -3, 46, -15, -30, -22, -2, -74, -39, 51, -28, -25, -8, -59, -66, 55, 33, +-30, -22, -36, -41, -45, 12, -24, -35, 59, 8, 9, -6, 4, -43, -23, 1, -53, -61, 31, 24, 1, -10, -58, -7, 35, 4, 44, 2, -13, 15, -17, 12, 33, -29, -38, 2, -17, -5, -7, -27, -5, 68, 29, 30, 40, -25, 41, 27, -15, 38, -48, -23, -16, 24, 24, 23, 42, 1, 39, 61, 8, 25, 4, 45, -32, 65, -43, -16, 27, -45, -64, -6, -33, -62, -96, 24, -36, 9, 29, 4, 38, +7, -2, -27, -17, 44, 47, -19, 25, -26, 91, -12, 11, 3, -34, -16, -15, -31, -18, 43, -19, -19, -2, 0, 80, 57, 12, -1, -43, 15, 8, -2, -44, -21, -35, -5, 36, 30, 21, 4, 15, -11, -12, 20, -4, -30, 9, -18, 19, -30, 25, -73, 2, -29, 4, 29, -10, 15, 8, -22, -17, 3, -13, -6, 69, 73, -81, -62, -14, 9, -24, 38, -53, 33, 7, 41, 11, -66, -15, 51, -34, 4, +20, 0, 2, 61, -24, -4, -54, -20, -6, 5, 48, -17, 18, -43, -97, 30, 44, -20, 31, -37, 12, -29, 5, 29, -27, -5, -63, -36, 7, 41, -7, -24, 8, -10, 6, 30, 29, 13, -13, -10, 0, 54, 33, -3, 32, 41, 30, -1, 18, 10, 2, 26, -4, 3, 19, 3, 22, 12, -44, 30, 5, 22, 93, -6, 11, 7, -2, -2, -40, -41, 6, -7, -8, -23, 15, 13, -17, -3, 18, 4, -26, +33, -28, 3, -6, 18, -2, -2, 0, -18, 4, 0, -20, 26, 21, 19, -10, -39, -17, -35, -20, 31, 19, 3, 9, -24, -5, 24, -33, -2, 13, 20, 6, -14, 15, -2, 29, 12, 22, 9, 11, -20, -6, 25, -27, 27, 5, 24, -83, -88, -4, 48, 0, -94, -14, -4, -10, -121, 59, -8, 27, -1, 28, 10, 27, 7, 27, -15, -3, -9, 0, 9, -16, 21, 17, -22, 24, -13, -27, 8, -35, 15, +12, -9, 8, -42, 19, -38, -39, 14, -27, 3, -6, 0, -25, -67, -42, 35, -20, 5, -19, -28, -47, -83, 21, 5, 5, -13, 0, 17, -6, -4, -56, -17, 73, 14, 2, -19, 13, 0, 2, -33, -35, -12, -34, 28, -39, -9, 45, 47, 34, -8, -10, -3, -3, 4, -9, 1, -20, -21, 12, -48, 36, 29, 2, -29, -5, -2, -16, 8, -2, -13, -19, -13, 3, 6, -23, 4, 4, 23, -44, -12, 4, +-6, -57, 14, 0, -9, 67, 27, 28, -38, -77, -33, -11, 8, 44, -43, -7, -18, -13, 10, 14, 56, -7, -33, -34, -36, -50, -8, -21, 75, -35, -37, 39, -38, -29, -9, -60, -73, -15, -51, 18, -77, 38, -73, 5, -67, -44, -87, -33, -53, 39, -47, 31, -5, 33, -56, -81, -19, -41, 8, -91, -13, -10, -18, -5, 66, -21, -16, 74, -2, -90, 9, 20, 32, -15, -76, 49, 110, 23, 72, -4, -66, +-18, -90, 29, -46, -44, 1, 15, -16, -22, -23, 45, }; + +#endif // TILESERVERGEN_H diff --git a/examples/app_single_model_on_two_tiles/src/support.cpp b/examples/app_single_model_on_two_tiles/src/support.cpp new file mode 100644 index 000000000..c1458ea67 --- /dev/null +++ b/examples/app_single_model_on_two_tiles/src/support.cpp @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include "model.tflite.h" +#include "image.h" + +// Simple checksum calc +unsigned char checksum_calc(char *data, unsigned int length) +{ + static char sum; + static char * end; + sum = 0; + end = data + length; + + do + { + sum -= *data++; + } while (data != end); + return sum; +} + +// Quantize float to int8 +int quantize_input(float n) { + return n/model_input_scale(0) + model_input_zeropoint(0); +} + +// Dequantize int8 to float +float dequantize_output(int n) { + return (n - model_output_zeropoint(0)) * model_output_scale(0); +} + +void init(unsigned flash_data) { model_init((void *)flash_data); } + +void run() { + printf("\nBefore model init"); + + + // Set input + int8_t *in = model_input(0)->data.int8; + int size = model_input_size(0); + for (int i=0;idata.int8; + for (int i = 0; i < model_output_size(0); ++i) { + if (out[i] > max1) { + max3 = max2; + maxIndex3 = maxIndex2; + max2 = max1; + maxIndex2 = maxIndex1; + max1 = out[i]; + maxIndex1 = i; + } + } + + printf("\nClass with max1 value = %d and probability = %f", maxIndex1, dequantize_output(max1)); + printf("\nClass with max2 value = %d and probability = %f", maxIndex2, dequantize_output(max2)); + printf("\nClass with max3 value = %d and probability = %f", maxIndex3, dequantize_output(max3)); +} + +extern "C" { +void model_init(unsigned flash_data) { init(flash_data); } + +void inference() { run(); } +} diff --git a/examples/app_yolov8_classification/Makefile b/examples/app_yolov8_classification/Makefile new file mode 100644 index 000000000..70bee71a6 --- /dev/null +++ b/examples/app_yolov8_classification/Makefile @@ -0,0 +1,33 @@ +TARGET = XCORE-AI-EXPLORER +APP_NAME = + +APP_FLAGS = -report \ +-O3 -mcmodel=large -fxscope -Wno-xcore-fptrgroup \ +-g \ +-lquadflash \ +-DSHARED_TENSOR_ARENA + +# ******************************************************* +# Include AI Tools library and headers +# ******************************************************* +# The following variables are defined for AI Tools library +# and should be included when building the app. +# XMOS_AITOOLSLIB_DEFINITIONS +# XMOS_AITOOLSLIB_INCLUDES +# XMOS_AITOOLSLIB_LIBRARIES +# +ifeq ($(XMOS_AITOOLSLIB_PATH),) +$(error Path to XMOS AI Tools library and headers not set correctly!) +endif +include ${XMOS_AITOOLSLIB_PATH}/buildfiles/aitoolslib.make + +XCC_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_CPP_FLAGS = $(APP_FLAGS) -std=c++14 $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_MAP_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_LIBRARIES) + +#============================================================================= +# The following part of the Makefile includes the common build infrastructure +# for compiling XMOS applications. You should not need to edit below here. + +XMOS_MAKE_PATH ?= ../.. +include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common diff --git a/examples/app_yolov8_classification/README.rst b/examples/app_yolov8_classification/README.rst new file mode 100644 index 000000000..9bc82987f --- /dev/null +++ b/examples/app_yolov8_classification/README.rst @@ -0,0 +1,18 @@ +YOLOv8 example with flash +========================= + +Please consult `here <../../docs/rst/flow.rst>`_ on how to install the tools. + +In order to compile and run this example follow these steps:: + + python obtain_and_optimize_yolov8.py + xmake + xflash --target XCORE-AI-EXPLORER --data xcore_flash_binary.out + xrun --xscope bin/app_yolov8_classification.xe + +In the example, we inference the model with a sample image of a LION. +Running the example should print:: + + Correct - Inferred class is LION! + +The same lion image is saved in raw format as ``lion.bin`` for inference on the host interpreter, and as a header file in ``src/lion.h`` for inference on device. diff --git a/examples/app_yolov8_classification/lion.bin b/examples/app_yolov8_classification/lion.bin new file mode 100644 index 000000000..9319435c1 --- /dev/null +++ b/examples/app_yolov8_classification/lion.bin @@ -0,0 +1,141 @@ +Ľͳžýºο»zqſ¼ŨǾûɾÿʹĿþ}ocY~wľϻĻƶ̿ĺʿȿžž¼ƿƻŻzk|vug^wd[zļ{øƸʴųĶɹķżɾįxǸ{|ozvhTLykanWKfQHgUKmXKm`wtxo±|lryɬqtrørdQ~io[kWrcZ~xoudWL8-jRGN:0`NE[F9w]Jo]r`UweWgTyg}{s{i}fTxvctj{b|hzhoĸ¹ǽ¼n_s`sUxgtc}l}lhVtTCrYr`v]KfN=cL@\F=o]PH7/W?6:(!@0)O=6U@5pUEtZJfSGy[DvZCfOsnoWp]y_JmVt^tWEgUqVnVuZDu]ýϿʼοvuSlM}aKiVjWnWF^E5mP9sQ1bI:Q=1kO;mP;yY@`K}_IeIyZBkO;fNxXDrS@iSeHaJeJlUyvtc|kvrxf~¶qndoa}k|mfToVX)I4#A)2V;#8!13"7&!I5,[B3D/"V:,fI3^?'_FcB)_ApQ5cG2rT&D.<)C,A)F03!--C1%W<-iL7H2!\<"O6#{W((:(9&mL6?(hH/P7#gC(aB)zT8kJ0bE-aD2hJ7hJ6uR;zS3e>hH[?tQ5lK0rQ7iI/sS:|_Hu\Jx`NcSdLfïƹɿŹr\nL[@rR9eD/W9'V:'V:$Y='E,4#<%Q6$kH-b?U1]=~R2zS2oL.rJ-_>$B)O9&D)E.A+?%  +3"9%^E3Y<%fI2^@bB'nJ,tP0rK/dG0eH2pP:gH3eDmBiCjEuU;`>kG+aC+[?)kI1pK2\>&bJ7rR9jQy¦ӹйѿѿw^aGtN1]='J/!F+G*O3!G+I/8"D*R6zR8^:Y2];uJ&sL/uP2mG(T6`H,Z<&U8%E+\=$W:# (B. N6#dF/J.X8mJ,|U3uL+jG0mL2_EiJ1]>iBrFe?~W6lEqL/mI-rO4dB(eC+P1\<#~V6iFvR`ʠzֺΣǧԼ˰nY^9yP1d@%I/=%B+J4&O9)Q6!S2U8!T6~T3eyINŇWƉVϑ^ljUәhˑfĖoѸξťĞʖnϖfؙf͒aёbȌȔ]zItEl>g9h9f9c9c;X4f=![;"wM3Q3a=Z4}P/Y5R0W1kAtGlE`gGvJ|KvJTXVċZϒȁ]Дb͑_ϒ`R~O‡X{NxMwKuE|KtB{FwC{GłNÀLύVяXԑZՒ[RbȤ̸»ˬjYWQ΍]֑]эT͈VˊWNsDo@qAp?i9lo=vEĂO{GǁNi:e7h8o@i;uFÂNNxMd=vKnIkBa7[3T/_8\3ÅT~QjBg]2oDh>b7qEJRÆRˌWϐ[ÄR̎\ΐ_ВaLJT{M[[ćYRvFzIp?r@vEvCzH{HĀMzGrBd;`>_?\;Y?~YBiYɹzfQjJyQrLpMb?\9zL+[6d=pA}J|JsCs@zFxGyF~HǀI{IzMS\YVɌZґ`Α^e?mB}Nn>xHg:f:rEd:g=j?qEkAe;sIxIsDMȈUÄPĆUƈWȊYӕdϏ]WZÊ^U|KvEqAq@uAvCuB{IzHuB{GyI{Mi@vMzSU_yUrTٸrZpLvK^rAf5h7oB|KxGj=RƊZqHzQpGdžWĉWƅTuL\QqBf<]4W,\5zM)e;i=`6g=mCkAzLOÃS~NPɋZŇVϐ`ĄRWĈX†VO}KzJzJwEv@xBvD|IǂO|Ir?OzKwGqEk>uJuNgBiEyQϯv[mInI]:P1}N,yJ(V1h@Z6X4W6V6wI$h;vFxFvDwGf6j;wHuEm={Lˊ[rK~SqFqCʊYӓb|QSQW.b:b9g>d:qF$Z5d8a8h?kC|MzJwGT}NŇX̎_}MÃSƈYϐaÅVRuEtCo?n@i:j9p>}Go9tArBe7g8tErCn>uAd=]6d=hAnKvQDzptPiApH`7T1R/}N,P*W/_;`;O0}L#c6[0_7f=j?i=f;c:i@i8qArCzKXRSwL‚RĄT|M~OVÊYyMi?qDpBR0V1pBn?|MlDo?sC|MQċ[SyJNɉYƇXɋ\ÄUzKpDmBe8m>h8q@p?q?xFd5_5npAN{Lo?uE…VƊZƏ]uGzLvC„QȌ\RńRTgb9zHtG}O+sESQzJwG~OćX͑aӜj{OmAlj\ņYQPʉW|OsHf9qCqBk;m;yFzF}I{Go>b6sGuDk:tAuDyJȃTÃOāNwF|NyMftUzNtGuIf>fAeBY1xI'wK/xK)V3a9f:S-tC$P+W-`6wIƇRґ\ȃLŀIǂO|JĀM~NdžYV‡YUWWVTTȋ[~O~Sk?|L|LX5~MRňW|OxKSʍ^ИjқlxPuIzOrFQ{LyJ}OrErEd7_2o>j;l>zFt@tCh9W0e:xFʂMzCqB{K~SɈWłRʃSzNuJ~QwvPDŽTɅV~KyIwJmDV2j; P1U-U0jAY0ewJf9k:g9a6`4a5g8i:d6c5i;yE}MwG|HLՍWّ[cԏZ{NyLϱϜsfʼnXɃP~LyM{QmE]9]4Z8c9T2j>i=^5l@MŃNȃQыWʅQǁNxENʉVɄQ|I|IwH̋]nj\~RYʌZyQW[‡YyIOTSĉ[|LiEXPm>}QVPTÍ`ɓfŒcYW~RuIƇXPQqCg9h;a4j8d6Y/^1tGk^3X3_;d>_9tCwEqGeN+U4M,R-@$F&D"+ E'T4vN/mD&b<S1_5mrGU6X7q?ȈVOPh=tEɸgZRiQ<ъZ~KhAnHX5nB'lA&qG'd='C#" "A&Y; lF(Y6`;uI)i>U2e?S*†TuG^9P/XWҡvƕiզz͜q֢r\ZX|P\UƎbzQvLzPlAsE{Q{TǐcҜn͖jZV˘mɘr[Ɠhԡv͘lÎb\TyMrIoDxHΉUʃM{DGk9lRC9xJ{KhC];`=W5]?Y9~P/S1%B! V4R1a8lBh?^4f;a7nCqDjAlD[fB}Xb”kک}ܪ}ʖjÎa]|SWzPɗjɒeȏaWf>evHe@X9yL/wK)oG*P0mHg@d8h?d;b8k@xR뷶{wqgZUVE;C5.bCwJa:M*M,b=g@a=R1_='=#G-:$iE%vHwGwFxFtBrCwLPTŠ\hDwSÔpff͘lʕi˗j]Tč^RњkË[~OVtKdF4,:,$YA6UrFT-xC'i7eAb=oF(d<(U9$B&$uV3Q'd8g9d7^0^1WňXT_jLʞxÔoӡx͘pōbXʕiɔhV~SZzNySgD}UZjB~T1oFc3,4*$2"5&gDǀQa;M-oA&_5qE.aB]>rP9B'%%?%T2}L{LrCPˎ]~Qd?dFoحץ|ڨ˖lКp̗kŐdXrIuJZVW~VuP}SmDsN.hAZ;yQzNuJ*^čaҚo]Î_͘n`ܧ{ۦzأwݩ|բuإxఉǙuY5a:d@S0O&a5c4mFI*@#hB(iB&X8oMoFŇ_VÃUOvF|GbzwuMHFB<:91/*"5%". 2!uPoEX5]9Z:Y?a=%Z8!3 +A*F/#$ c@%g:yFNxJ]5]:Z=pթޯ̛۪q֦{ҢvϚnќpϝr\W|PjEqIË_Z`gGaBP0e=~PSmCtY?rc|ǿxsnC<6/'",#/$.+(&Q4 ]dC&zPrMc=jCh>rD|Q|S~SΗlڦ{ܦv射ީ}ȓhΘnۦz跍纔ഐwUnC(vL1U2pFĊ[֛mwsؘc̑^ǑdʔgTvIoCyM/`C,{]EeP}ٹJDB=526+&+- 1/%7$V8 W6iG[9nFTÅTUVbAkD(P.9 F(aA(U7oSsӦΠxȚv͞xĚrhѝu˖mϕgԙlןrљlŊZÇ[zNzRpJf?YWtHrIkJ^wOvNd?mFvJ‚TʏaË_ōa֠r붊ڣtȓgϝs۩֤z縑㷐У{xUyR2W4WԘhjmnhԔ^ژ_ڗ_ӗhtET2oL3wO7Y=bJm\}oڬd^\@86;0*;,%1!.-0" +! !R8"c@yM˔d֓b֔_юY~KvKmFT3d?"T3M/lL,vQ̜t٩ӥשejiyXőeީ}Γgҗk̑bĉZSVxLzQvPe>f|SmEyPdBZtJjEeBoH}PƄWԘh̐b՚kʐbۦ|䯃ߧxИi଀ݫܫݯÛ黔ƖpsNyRǑgᮀzu֘iӎ\ЌZ͉RҎWhWpO/Y>$vU2}[>pWzdo֔RKI>4/=.&:)1*(0% 9"6"D'xQۡm՘dƆVsGuEzM^8_8F5/4#1 (% E/$D0$4!y]EeFzYXxOc?lJvM|MXkF\8^:c=zQ_ӟt௄ƙt]kʙpᰇ{؟lՙgÌ^sGOҔcQʏcɎbXqGfDY6g?wLyNVtN-{O~ToH`9a<{Nˑ`vҗhMRl?sHʎ_p볂汃鵊ޯߴ߬ףxUyO͌^xww|ޝhߟjjsәgerO0nK/mK1zT7_?qR}ٶbYS[LHT@9A-#4!)&% 1K3P8!fH}X^\wStKwL{PTɎ]ΖdSyNwOmGrNќu߮Ѥ~m_ףvڦyڠrڜjΒ`xJQϏ]ؚh{JΓgҗkɐ_tH[6kCUċ]O~SfA&|TyRpFh?nF}Mˑaw~}NƆVăT€VחhБaqu︊߳繓ݮXWxIӓbݜluohۚcۛeڟlڥvӤxˡurLfC~U5[?tUuȺ縻{gZUYGA=+!4#3!1) % +1O2}\fđfďcYYŌZ͏\͏\ȄT̈X~KQmArLuLX˚rϞwg{WbިɖcИl\˕gQҖcΎ\͏]tGՠt֞nѕe|LnDlCyLƋ^xNtLU0zSÈ\rGrFoCxK͗eߩw䱂̑e†RˆUɇXɇXŅVђbܛes䯂嵍ⴎ㱇ʏck=yHҍXo{|wۛgۛgy鳁츅اy|Rh?g?f?fòǷĻӮ|ZMERA7I3(G1&<'.( +,1z[<]ǔjϙlÎbY{R\ˍZLƇRzFsDvHsFhAnI[7gE`zVpK]ďeaĊ[‡YSTSwJąWӟrأw١pݡq͐asEoBtF~QrFsHsKnFU~S{Oe:oDT՛kߧz|ɎZĀOיh՗fyJ}Nʍ]՗g؜m嶎ᰆUqFtFzJЍZܙflݛgޞjߟkmx뷅岁ȔdJpEuQ|Ļ߷xjdcSHL9-B/$?(?%5):']C-}YǘjעuĎ_ZWŒcƍ_NJWwCqBwHlArDa9a:|S]h\sPtNX_^A~R3yR4yN0nIŕjxMYѢ|᱊ҜoДgNJ]k>zMZƋ]TQVlBwLpGmC{OwMĈX؜lz紇ٝixJwwLb9#tK/^;xP̓fœ淏ŐesIjAxJЊYՏZЎZӒ^ғ`ԔaҔ^ޟjsz|춁ןlċ\TzSqᄏs^VZE7N9+L4$G0"345\C.cBgգu]ďaΙnɔhZ{LvJoCuD}LyNX4^9h?|QyMzW|YhEqNnGd=wN.U7%W<(S8yR.[gAܬณ㵐˗kԗkyNuI}QYˑbȍZč]UzOUuJ[ˏ^}OOٜmߤr뷌إ{oBYW. \<$6Q2Z8~P՛kأv᳍ÜǒfpFf=k={KԏYٕ_hڙfזbӑ^͎Y֖dޥp}ӛgXƎ^]b黸xodNAcL:ZA0K5&='<#6?'jJ-^ПpYȔeԟqѝmÎ^ӘfԕeSQΐ_vFh=k@yOrGxLČ`\oMhGeDdAd?># 14   +_;$X3{RԦǙtďc†Z{OUT\WUUtL˔hvI{LUĈTNjZTΒbߣq居xM( +3*+I $& rH*^2zM_渒ƞܧ{U}SuG}LЊTْYaݗa֐Yۓaߤntޢnw}xŋ\UČ`͖jÔpɶͩzbUt\NhL>TA7H3$A'H-B(_D*bBf]Μiܪ}ՠnŒ[ϙg„S~P{JXxIh?i@pGwPd;{QfiEtT^@cC\4X7  +4 +" 4vYƚwvQ`|QU~R^Sƍ\QSyOÎaVʎ\~Lϑ_ϔbŌ_xKXƖixK#G! Q- D a;]4_ᰉ߱Ӣv֡wˌ]OƃNڒZڑYшPԉO֋Qߙ_lё_Ϗ\ߟmtܦs͗f˕f[j鰦k_t]Or[M^GU٩“nmMfGwXlI^='#/kA09 dE,X8sQnFsKU\URwKwKzKb9~SRQĆUϕcUrKa=Y@>#n uNmHrMxP{PzN~R‹`\j>T|PxKVƌ_wLkK[yB-"΍UȐБps]I羡T2tMҔg٢yj̞y[WvIpBɉQŀOͅOΉRĆMȃLыTՑ^ٖbߞjwvytܧsƏ`ÍehƤ짠vm|th]y]HtV?rP6uQ4rM0_>%\=%_?%_㮀}͕fљiƉXˆYQȇSя\ЊZޙhɊVvHhAi@f>dAizWbdFب}͕jĈX]ͶqSGƌYl=8 + oYqT<]A_Aa>pJuMyN~S|QwKUʏcYWxL~R{O}TcӯֽA.(8zH^[7"̶Ţ~O,nDϓcסwiȚvϡ}}]a>\3e|YuDǃQϋ[Ӑ[΋Uה^ߟhߡiߣmtxߦqКiКjckǭjVwV>zU7|X>eE/gE+X9vMΝl՞k֛f̐]LWT{O\}QT}KăSMÃPk@pFvPzUmKwVeFfGʗoәl۠tyRqN㼜־йʵǴiUH4#YB0fӢx}]cDsPuOzQ}R~PwKzOȓhQ~RUT{RnL•nױuK;1nӼڿǤ}XzTŽdϖfx鵇ǒjҠykzSeE}L.b;tDsAm<|LdžWё\͍VɉR֘_ۜcqxxszڡmңxÙtĶijhhQaE\>rM8tS7`?|UvL՛jՙeԕ]UW[ǕgϘl}Q{OŊ^͓aŅUq?ąRzLrGqI`>[>cFY>fHaZީ{ʒ`xS}V5ɞxɤտn~h\T@0_ǖmcjIlIySzQVZT{OzPT~RXUxOrNʘnڴn^x^P~۾἖m_ϝuȓhQːdĉ]ƛsȠǢŠ~вʫkTaۯɚq`BkGrMtKZX|L~PuLUxMTXxPrKđiԡzyܼĦ̭ͧpvKRuҔcΑcؤuXʘsĒmǗrVnB|MY2sDÅTƈWƇV~Mғ]Ԕ_̎Zΐ]lrxyܡks٣tӥ~ӱ϶ذwfFlHkG_=nHmGiCyOXіeГ_Ҕaʑ^ҙfܟmٟoΔcїgĉ]YV~R~R|PtEqGrIhvVgE,fE/yQ5f͘mVӘlZ\Ǣ~Ϯ|Φ޼~nQϤ|حНrfChCnH{PRŇVː^OvH|N~RTT~VqJǔl߬o޻߼ձѲаi|PŎ_ݣtۢt՜pݨ|zZǕpǕp͘oUWxJwIuGÅTВaɋZ„SąNБYܟkܞkڜeݟfry{ޣp䯁֪Χϴú忨wZnNnQnHuJoKaAeGqHŒ^Ȏ^ÈXŋZ֚g؜iʏcЖcʒfZ{TzOZɏ\Ȍaˆ_^9ˆ^ӛk`hJnI4V7#dA(|Wi[[Y\Ҧ׻ֲƞ|ڲrz\AjBb[iCjJ|V^Ŏ`[\]ˆWyIxMXXazOYΛo[̪߽ܳͤqkŏcʓeۣuȎ\ӡv՞r{[oMǚqǗjqG\}LR{IRϐXѐ\Д_ʋUǍZΓaӗerؚelwtx筁̰ݿɸóȾ}ktRoIzRUZiHxV4aAzOŒ^ŋZˆXݣrԛlҙjۡqÈZ~TZ}RȔcםlЖg{PƊZˎazMŌZȓguRiNR5\<'~^Zўu㰅aƓe̡z۷ӯqƝ{axV|[yR3mJc>tQYĎ_[TUZÉYOċ`Ya]zO~S{Wcѥ~ƚs۴忞ժǔiŎ`Ǒc՝q۠rⱉʗnhJkH̟v͡|vR}Q~NM†TjH}Qˎ]ϘdaWҕd̐^Α\ޡlޡiqvwyూ۷˻dX~UV}TjF_?eDlK|T\ÊXŋ[ЖfΙkۢuǐazNzSÏcőeƐ`VvISךhӗaPЕf̖j^]CV9#Q4[?wSjƕlΙn̛leХͧnxZzX`tSnN{O-iEX~SR}PyMnDzPRQwIP}Tcd~Se_֥~cҩ⹓ПuUǑeҜqסwŏf୆]vUŗrk͙pyNyK}POĉUĊZ~SY‰\қl^͓eלkԘdϑ]nlqtsܦrڨٺɼgW[SfAeDhEiGlIqK|PPʐ_ڠoќn̑eT{N_ǔh^[\ʎ]ʌ[̎]ޢm؜lÈZӝqghJW:&Q3qM2tSo^`Òf_ӧխbcGZl]\:hCxT}XVvKnCnDrIyOUÇXQ{L[Íae]d`ȕmZgǙsɕjXVЛq֣z̚s͜uqPjjʛ{ďgTVpDRҖaДbč^VǍ`ЙlϘkːdӘiכg՘d՗conmrt᫃קϵ˸ͭe`UlEa>kEtMfBgDiEyQUΕd͔cܧy|P}Q_Îa]|Ubآpܡm̎]ɋZovݢtϙmbwUY<(Q2b?%gIpRgjΝuÓiėrڲ_DdF_sLiHyN,nI}XhEbb=gAiDwOzPX̌ZR~N͑_ϙkɘl{Qďcʕi˗mfI_ŎbǓhʛrifcŕoḗҦѥ\̒aVzLnjW}Rʎ\͕gZTΗjΘjΔdȍ]Җfɍ]ѓaۛgۜgВ]ڝh˒c̛rѫͰƼɬ`YrPfDoKkFwLe?}X:lH,sO3lHTЙhő^YʓeƑfYƗtްՠtǒfWUƊZДdחesu؟nϚke^BkG+nK/nI-mMpN5aJ}^vQrUz[B{Z;kHd@zR3oHjH\;Q,T0U2[7iDe@rMvRsNyTXQʼnY}NPUdXeܦvɓf}UrMȎabn˟xdʙm֮ۮ֪ۯ^ݦw͒buEҒ_̏`ː_ǑeƐaa\Ιm՟nĎ\ЗcіbɋWٚeޞiݞlәgϔaÍ[Ϡ~ɭʿɹǦnyVqLvPtNoJa?{O1rL/hE)wS7qLɑ`Ζeʖd{NКl]a߲㷉̗k`zNďcڞnȌ]ϐ^ښe{xܧxnZ>uR6{X"sSpN5|YAmQlIeHkL4_?sLhKbBYiGe?yQiEdAeAmHgBxQsLiDrLWWVSΕczIףuϚlwLϜsǑdsLrN^_ȚxjƗnƔk⹒׬Ҧ׫~TQǍ]xGˏZV]e͜r~SĐcϛnZ֠n̒_؜hˍYӓ_ܜenЖbΒb\ȖlΨȳȤgtNyTqLsKrKZwR6`:gJ~W;yWA_ElPuYlO6kIoIqP6rWpM`:wOjDakJ4fL[ApRqS@yW@^@a@rN1vR7\>lCc!rK.oF~Mˏ^̐_ʔcסpџrcӢwҡvʝqܯǖn踋٤xǒf˗i̕dٟnިz緍߳ĖtmW8|R6yP4\@{V6sM3a?(gI6~[DgIbBgH/^?|WpIvQsTxPwMyRuPwRvRfApHnF~UXV_ȓgŐd˔fϗh[duQb^x[ѡ|֢zԠwڧ~Ⰸ꽗伕渕꺌~RʼnWΒ`Θj۩zץxӡtѝpϚnč_ˏ`Nj\ˏ\ӚgʏZޟg֘_ҒZߞflםibqŜ|ʪϿӽƭɩdqI_>a?V1Z3wM2oH-[:fD&tI'zR~NƊY؜kŒZ˚l^էwbÒgթ۬߬ᮁ֥yƖj˗kŠZߥs{ݰZʜw[lG)|S1[;Z9mF*_?)X:"Z=bHcApO:xS3`ʙm]ySW][}V_YS^Tčb[ebdȚo˖nҞuЛpvTњpbguXǚq䷌㸐淒迗΢~紅|Ď\Wנu`zפuբs̙j۩zϚl͕dΓ_ʋXәgNJUܜdߠgӓ[ۘ`gߤn͑agŬϻ̷ͣZvQX6`?];W4pJ/c?#_?#kG)a>oCOȍ[ƊXŽ\‘d̚lϝoe͛q乑ب}䱄ݪ}ԣx’fŔgӞmԛhעq滖ӤȚvrOkD'T3bAa@oF+T5eG/iKeIyU9eD)Y<]帑zXfnqĘpɘnϜqĔlԤ{ե{˛rӣ{˛spƛsĘpԨ٫繒ש~]Ȕj٪ndF˝w›鿛ϦΣ~ߪ|ߩxǒ`wKԝqƓiۣuئwئwެ}ќn՝lҖbʋXӘgΑ\ёZߡhۛcؕ]pܡkΒbējϫϵĮȷȡ}TpLc?fB~W6uO0mL/`?"\;iC#e>oAWnj[Pɔdȓf˗gȓfēh٪ګӤxڪݮెʛpܫ|ȓdϖg賄射ÞէhyVaBW8qOnLxN0Q3kJ1bFeIvV=cE-oTs[El\vZw˩մطֳԭ۴ڳݷܶڸԲ޼׵Χشǥ߸ڳ~V|WĕngkOʚvŝ뻐㺕Ӭڲ|Vՠr~ҝoY֡rfa籃ܨz䱂㱁٣qȌYԓb֘fٚgיc֘akܚemٝiЖgXѡ|ͻκǿӾw`e@`>_=}T4rN2eC'cB%eD'yQ0e;wIVƌ[zIҜn\\ќnΜrް٧|ݯۮ湎ը~ת̜p[ɏc췉䬀编˟xڰɝybrG'kHmJT5S5!bB(yY?xX>}[@\:$y]kP%rWDtϰػڽͱͱǪԷĬպڻѳͩ˪lUEzW}]ÑnvVpTʘu콗켐껐徚ʥϩ˝t֟rۦzɔh]ѝmզV٢u赆ףtڥwݬ|}Иeٛjטfޠmݠlԗampڛg؜hŠ[˗e˙tǾȽe[_>|U6cD}U5mH+uS7Y8gE(zR1c8VWOȏ_њl\أu˖hᮅث٦{ᴈޱ߲Уx߲֨\V굇ߨ|轗ت͟}a’p^>`=rO}R3[=(\@)jM7mQ;|V9^BsXĞ|K6*mZIs^PZG<|j]ʲʶƲȳ̷ʳzh[]J=l[rXG3%ze鼚ZjJĒp_aCޮÝǧɭЬiƘo̕h٤x]ǒhݩy㵎_Əb߬}ՠrΙkޭ~~֝jךgؚgq۞iڞhsޤnіbō^Z̙uҺǿb{VlK~Y6\;lI*{U2hF*c? sL+W4kCzM~RsFӝlˏ`ʔbΖdҞo߰اvУwޱתѤzΡwްТ{_Ìa~Қk缕͠wcfǙt}XlB hFU6U8$U8%cG0jJ5Y=gBZ<㽚:-# 70.TF8tbTn\NP?7F83 zgYȩȠpMtMc{\jPޯÝҷԷٵgПtӢwީ_ZݮⶊѤ|aӜk߮~ԟqۥtxtڡlܢpޥouqnmqӘdʔdÌ_Ēg̼ԹdwSiGyW8{S5kH*|V3mK0jF(yP-`:pFsGsH|P̑[ÆW̖dɑ_ڥvܯʙh֩|Уvڭ䷌ۮɜqԦ̛rÌaؤtءrԡrೌszUǙtk\:W5\>S6"`?*iI1fG1hM^:h@"Ԧ忠x\& uZPaUwXKwXL}^Qq[T q]Pŭ׶꺌dΙoe~_kRܴ꽗ǦӸ̤jǓr̜p֥zެ|RȓgృѤxܮƖiܤs깊ݨz՟nzxstttxsrݥnޣoʔd[^xv}_vQjHrJ'wO,rI,yO3rL-zU6vM*h@i?xKmBwIȑ\~MQŕf۩xϜmРt͠tթ|ڪ~깍ڭث庒ԤΜqئx٦vӠuةɝwY7p|wUqG%^=X=)yV=`?\A.];YdA&bメԠx|[=.  E3*|jl^tewh') g˦ٶЪ٠nҖk뵉fqRmTỜɳǥ}^jӡzcݪޫ_ћpڨwܮۭΟsܧxxޤrۡnܥury|쵃~糀zpߦoםlcemwʽ}_}WeCvN+}U2}T4zQ2{U6rM.zR/c=i@xKc:uHȑ\ɓaȒ`ԥvئuϛlΞtת}Фw浊Ѡu纏߲޴蹔Ǖkץw˗h٦|ԥ}ϣ}vUfԩguK)}R3Y8"b?&lLlGiC^jH_<ᬀѠpϝt}[qQ<,  oUK|f_k_jW) tbP˩ɨӯǞ᱅ÌbZ絊ୀőklNԧ徝Ѻ̧jʛx̚rפy䰆ޫĐiǐgԠq嵉ԣx㳉̘iy|Зd؞k|ݢos鵃{qٟi͓cϜqdoοd^oN\9jD#b?zS1]#mG&}V1_6c9nDyLǔa\ƒd\ΙkΜmԢsӢu٩{ޱث~թح߷ⵍب}㲆۫۫Ҡvbn}W9Q2iz\aC$pKƍ_ۥvءr汈Мrۨ{ݨ|Ξvெ⹒æ͸ūo[C51SD;C3.{pֻؽչȥ꼕ئ}纖ܪةƔk\ֳ˲q̢ϥ̝x^֡yzMНtƓjŽfʓgܩ|岅岄٧x굃ӝk٦qۦrՠlܣpwԝj鴀굁괁۠hަrÖkݴнǼȾ̶qh?rM+]< tO-uO1X6X6dB&zS1c;i>o@yKΙkVŐdΙkʕgcʗj˙lڧz௃ϣv溓޲ĝ٬٫岅޲޲֩ifeK\;lI3i\>[;zQČ_ĊYǓfԟrҜtbҠuϟxxQѤ~޸۽ǰѻpa/((QICϹϴۼڱƥ뿛ŢÛ콖žƝ븇ħ~yɟ{Щ΢|icǕfΛp͚oŔidݪ䲁䱅㱄ⳅؤqҜj뵃}ۢq՜gzӞmߩw}~ۣpءkܥjХ|ڷɭʶôȻʲ|[zQ1dD(P8#lL-X6M/Y<%U5pH'\4mCvH\U~R˖j\ƒdđdΛoȖiۨ|Ԥx߳ⷐ幒翙ԧޱୁ㶐ФҥmkmQwU,A+E3&\>%X;!G0>']@$gA uM)qDzPUzN]^VŽ_͘jҝoۧyݭȝu庒٭Ԩݵ帐ଂڪw輝ƛx޶npT~``@b@'fJplrhF}]Ɣgbԧ}ݴὝ¤۽DZXQKؾҺͭʧ㻓Ǟvjۣzಂѣyܭʟ~zlĞzoĖrɗtӢyݰڭgcԣyԤvܫ~鸋ެפwڨyΘj~屃yܤs{ܦt՟m관ߪvڨuSӠqӻù¹ȬmYKF2$;&* P5Z@(+ G*\8lG&sK'xKg>W}P\`X͙kZќnԠqԤw͢{ݱݱ뿘帐ک}ڭᷔ׭okY~`vWtQ6}fT|nƚxfΟ|ⶒܳ⹗⿞ܺéּ˺҃|wïԴȮǦ俚䵒۵ۯ껞ќpẒֺu›xp™spo“oڭۮ֩~Ϣwfץ}ܫ~٩{ం뼎ܮ䵅٧xۦx궅ݩw|zۥs٣ozYWĺȋ|r]I=C/#<(<(L1?*:$Q3eC$hF%qM)pEiJ6)A,"F.L05!K5R6P2aA#kJ(a:k@~SV~OX_ƒbҝoݨzԞmɜr㸎޳ݱ뿘꿘ొث֭ǝzh]iso_AkkR?{cKeDkHxWzSiŝzhܸͮ˰ɵ˼ÙǾ¨մ۲ڱ⼜鿛˨潙Ϣ{˜ttƥ¡ĢwŚvkէǕp޴ت幐̛p̙p㰃ⰃӢt峆涌ڥw٥vܧy䲃ܪ|~إqۦqywwP}WrZ௪zqZG9R>1H0$^A,K4'8!K1@(@(O4kI-pK&kFwMUSd]͙iՠrЛmb޴⸊֫~Ĝ溓߮巒ٰϣpjcвbCѱ[?)_F3_H,xZ>lvSqRj˜rʜtȫͲѺлȾ{Ϲ׮̣ͤȚtb{گr˫uurziѣ}̛u֨ݵ߲ܬ_ݩ߳ᴅ֤v軌ę۫|Κkڦxإw䲃ܪ|ެ|߬zӝm٣sݨsevS{YE{ȩzeTIYC5E.#I3"/@*C+8 +M3I-^A#iF%}V2yPV`^]ǔgўqΛnȘj߳۫|ᵉ軐軐䷊ơීҨˢ~rbßufLd]Et]\B+zcoxUnͣҥ伙ش§ŭ̼ĺ/&eUFѸèũߵ޸ڮӬƟv|uүjßiͨętϠyҥ~Ρvݰᴉۮ٨}֥z绎溍௄᱁䶍越ئy٦yݬ浊ுڧx䱀[ۧxףrңt[vZDl^žýtikVHZ@0<)' .@*A(B*H0B)N4fC"\8tK\wK}TŒeϝpҟrբu֧yڭఁ纐꽒꽒™辘׬ʡ{roqӱvUndrbIorXAiQuY_^Π{Ƞ}×rŞ|ոٽ;~8-%iYGīǮ侞㺘ݾѤ|{ͭѲktɤdṣ̌ϟwը~Ѥy㶋߲௄צz׫~߳깏㳃꽔ܫڧz˘lգw鸌㲄֣t~˗eʖfСro}]t[M~eZþtfeN;P:&?)"<, @(/G+O2:' O2]<xU5nCxOrGe`_f͜nک}ک~幌㶉꺏弔Ɯ߳ɠ{ǟzouͪkfbaEoqS8rZzdNkO4uP4{]>uM1W6^eͪԸŷνT?,:+ @0%.2#jWBʾнǮЧw}bCwR{tɯӸtp̥˜qu{ǜu̡yԨҥz湏ޱݱ஀ը}浊跌绎ೆМlzϟq幌Ⳇ۪}צwȖfc”jЩ{v_Iw_LzmxfXpXGN6)J5') -J2!* A(P38#M0\>$_?%d^C,cJ1eL8^<$c@&[;mE~^pȤ͵mgQ?k[NZJ>wg[scWO?2_M:nWF̹ܻϥÙxuaFnTy^yǥƦß~f˜sѫ^ğ}ʠz͡zʞwУxݰᵈ֣v߲ޭ䳈꾑㶉ʚl֥wԦy溍蹌㳅Ңs“e]kΪn]|qýÿsilVJD0)M7$3#' ;& E-D++ H/S7?&}Z6{QqH[X_bΠs۬զ{ܱ廐互ڭ鼑Ф~œxĜw|hszlyũuZpO7}^E{^FhK2rXA[A.:$S9%yS5eChpnmVC|gU|zl{jmWBjSֿش—uhsVzaKK2#hq{q{ƣenְljfӨm̟tҥzᴈ뾒ޮ㶊崉ݬ帋鼏ϡwϠt٩ఄ黍㴇զxeWZÎ}lwo¼όk[RE4,F.$*.& 3 ?'+ 8! O4'zY7sIkDYVaĘkɜq֩~ѣyⶌ纑ܯԧ|ԥ{ѥv›wyiƣ~qvƫgyW<`JnN7wW@rV=qU=C)>(B."U7!{V9f~\dqYt_{Ǹ}cu[tvu{^mWD1!_I;q[s[uà|plӪԮawԪͣ}ėl̟tҥzӦ{䷊ഇᰄդyҥx輏ۮcգzܫ㴆帋ΠqdxPkKo˰oeᯫvF2+F/" . & +H.6!:!- 3 A*6%nN4dvT9hF+wU;nL2bC'S3bB(wd{gƺŽͼƵ´νǼǿºİr]uVEclNwVc`tҫʠzśvө޴漘د֭Ѣ|ܰڮתΡvת}ŘkϢwת㸌׬ǜrh˞uf|ZkMeREcS@aE9I>6|wÃysl_UO=1>, ,&  /<(.  + % - Z?&mIsKb\enbǝw˜sˡ{mcկcfk™ubwU`BcE|Z=sR5kJ/pO4_=#X7iJ1oS?zŷǾȴ¸ӽ¸ùɷο÷Ļk\]C/rX~avXhjoѬĝxlԩ߹㻖խխۮڮ۰޴̞u٭Ĕghݳ׬Ө}ęnklepSfH\H9f\PcRHND;i_WЯ|uobXO=1D2&/-  :(!  + $  F2#dI-].yridVPWMDrg^ʝyjYNU@1I3%2 & :)!&   $ %\@"sP2mKwXZf~Yarsr^snt{Z_hd^>kLcGiH+gK^AlJ1Z8fD*aB*aF2s^kTBvjɽķò²´vdooZhv[FiN;oU@|^GiklqdӫϨ—tخ߷ġฑ޴֭㹑׮өڰحǜtǛt۰ҧ{ĞrvTitUrQvY@B4*yrj|rebYP|ohֹ}uk`NCVD9I7,:&(8( + %]E)sS8cCpS\wR}Yopkɟ{aq•oorQ~Zj|ZiJlNxT:hG*fIyW:lK1cB'kI/hI0U:&jN:oYGp^Qp^PweWtwbQviRBs]LxcNsr^biO:aF1T:&|^GyY?tjɠ~^gͥ}ˠ}⸔亖ģϤÜ֬Ḑ޴ٰӪҩ̡y—oȝrj`zXk|[+$01 - +   +   + :' M4cE+R9"iIuTjIaisoglhi\{[`ekIsVckMeJzYvT7mK/yX:|[>]A*J.rV@Q4B)6!VB3}jZt_P{lzgWrcs^Oyhw`Jo[Jtcw^JhTO8$uaNhPlN6eG/V@+eO=pX?gJ/dH/fJbHtWfaE.dIsX]CwU;}]hÛxilxTϧ֭ڳ彙ṕڱد志ٮݳʡyn`rjfyTkKqR?+H6*P=5B2&VI;ǸzpgYMD>.&5$<(!"  +  $ + Y>&;(G4"a@gHdGoNfšvipƜwaezVyVbrP}ZtRohJxYvWz[?dFjLcEZ>%K/iJ2S7B)5YG8J5%C1"E1!N6&`G5[D/R8$fH1jO:oU9oS:bF.kRAmUAeK4sT9pR7fHgM}]esZ~^Ez_pTdInQ}^vpizV̡ͣ{ڱ߹ܴᶋժ㿚ڮҩ~̧_yXng}]btTnNO:*UC7?2*VE>l[T~wn¼ɽvldM?48(/A/!'+  + $     +N3@-1 x\@vY=dGhG`lefq^]^\anK`buwYqQzZlQsTuWmNcG/U9!hH1S7B*>(N<.E0 :'3G/T<%U<"R7"Y?+aG1mT8T8 ]A(iQ9bI3pT>{\AwX>gJy^_ny[oO5|aqQtThI{\jĚvśv[cʡyѨڴṑ۰Хz۳۱ˢvsnLfFcfqP}]|WhL^H3Q?3A6.QE=YMEzp̯{]NGD4,4#4#H5&2&  !   +&E.7(H2cI2tX:fJ.rP^nbYg\]]zWaxTi[kc{[iL_{]}`y\cE+Z;$W:"U9!M2@)J6'W@.3 2 C,P7\?&cG1_D.Y=$`D+V:"dH/cI/\A)qU;_ClM3lNawXvrR_DevWekKkJ~\lmĘswSØnmҫ๑ڰɠvٯڳ̢yĞwgHfIjL^}`vVrTw\D\F3TB5C6.SI@{rl~ul´oc]SD=>0)I9,A1$E2#(    +  !/+4&S;(L6 s[<]@)yX9xXm_bc[cwTa]^dc_h_iNkz]egJsS9Z:%`D+_C*M0:#C/ U=+>&3 9"R8!W:!\?)Z>'X<$eI0N2aE,oS;hL3vY@dHlM3sUbgb~_fHda`wUeCuTae×oklgȠy⺓᷏ʠxФxỐ™pthJqSqY@}\hMkdIy^F]I9H6*eSHfXMWME{ȼj_YPD=?1)5%=,!@- "     +  +5#% O9%J7&bI.[A+y[>jJuVsRět]^`a]eaeh]chHpUt|]cpRtT9_>'cG0bF.N48 2 B+F.7 9 Y=&T7]@)dG.fJ1Y=$Q4nQ8pS;fI1cIlQuX>`CcdxXqsTzViaerOlJg[ebgbsرլpl۳ohjLx[-%;+">.$ + + +   0! +<, ! C05#[B(^F/uYhL3nSbletUh{Z~[`g\tPX^[^\i`׮լijөfgamPs[jLgLcEjS:I3&E1#K9/H91i[Nq^Rx|slmd]L>9F2*:)!7&9)'    %     2"-Q<&[C,uY'Q9#I1M3Y=&[@)S6nO4bF.]@(aB&|\AyYAsS<~cFfK.lQ7{[?}]ayZqRftTtQ^carM|RwT\{StPǤ{|W̤Ǥ|Ȥ|`ɟwigvUfu]DjPH9&kPV@)@-"@0#WF7RC8Q?3vxmd͍yqlg\SC5.E6/5)!."7(  "  $    +   ("M7#XB,hN2L7#x]DfJaqM_xT~Z^b˜pkdwUsQqRlQohlalQz[?Z>%iM4M5E,>%7T:$G-P5Z>%W<$T8 hI.T5rS8fD+~\CrR8rS8kOfJ0}\@~]@c|\lRqTnNrQnK{SdjhB\uOhboNytPp̫hkÝs^dBfsV@rUiO8YD1hO8\B/5%TA0D1#U>.Q@4vk]ѪXLCF70G81:/'+ ,  !        * &$P:'J8%]G/E0jN5{bHuT_a]{WfcocfzXyWqQ`Enlb}^lQtU9Z>&w[BK3I0B*D,[A)N3O4Z>%W<$Y=%aA&mM2uU:|[_DhLlP6zY<`D|\~^|^DqUdDqObAvR`˜rpJzV|VktOeF[^cljlj{YeGu[gJsZ?dM:^H5K7$U?,/<(:) N8*O=1dXJ߾h\W[PIH=7=2,:.$+  + +  +  + +! + +  +   K8&>+H4 [H1aJ.s[AhJnL^]Zi]ěub]ae}\qRkMoaB}^lQqQ6T8 dLE,J1E,K2aG0V;$Q5aE-_B*cD+vV9iG*{Z=~[=~[=wV9yX;gIrT;aCrSsStSgKlOrTz[`@oKfryVoK}YaoO|]?nN]sTd_fox\@vX;eJ/zaBkR=iQ@[C0J7'@0 ?1 ?.3";,"UC8fZPyoѷzsmrib[QJD;4B929+# "  +      5%J5&4 O<(]E,XA(w\@cD}[^_lhkhzU_luStUdFgsR3~_bGtU9aE,~bJE,S;%9! P8"eK4Y?'Z?'cG.iK3lL2kL.pO2xW:eGeFiLxV:vVrT6hKoOfvVz\iLiJz[~\mS9dL2s\B^D/;'1"8'8&<*>, L:1th`wmĒzrjtngRLETKFH=56( !  +   #  #*    + +- H3"( +?*ZC/S>)iR:rV9mM|[^jd^\`rPubB^iJdwV8bdGuU9mP6|_EG.E.P6 K2bH0aF.dI0iM3\>%tT:nN1lL/|\?aBpQbE`B\uV6{^AlLjuTdxY;pRrRgGc\{Wo~a>nIyXaI.dJ0jO8nP~aiS9t[?qPhLv]CdN8bG/I0S:$U?-U=)I4%A/$:)3$7&F2%YH>oaYph`Œ~vnfaYRLF<7?3+1"% !  +   +  $A,C/    " 8$6#L9(XB-R;'bH/eF`zWib~Y|XfvXv{[;zWyY}]bF]aDxY;kK0`E\A'D0[?'\@'eI0pT;dK/lP3nN3kK0qQ5iJ,vW9kKvWgHjKxU_?{_DgIdjH|Z}^@mReHvU8iFb|XjnQ3|\:oOeM5rX=Y?*|^}dKF2gP5mT6,(.& +   & +&. I5  +  +' - 2$N7#E.9)y]@yYoLn`ZkF`mMigGrPwW}]cH_lNqR4gG,wX<\A'WB-eI0Z>&w[CrV>\C'mQ4yY>vW;xY=kL.dF`mNkGzUtRgGuZ>jL{YmQgmN0gLcFvW;vV5|Wb[mT:rU#u[Fv\^H3;&[C-ZE/fP7aK6T=)E.C2"S9((B,M5'M4&bK<=+4#F6-^OFeWNչ{xd`WWNGME;1) . !     &5#%  "      + (H3!E/hS4eDuRcf|YwVdjJduRxYhHzYgIbiMrR7wX;aC\C&dJ4^B&iN2nR6|`D_D(jO2nP3yZ_DvV;~[pOpOrQwQlIdGmOyW`]kL,iP8hG|bE~_AsPyUlGfH^E2qT`K2T>'y_E_J2L;'J9(^G3D0>*E3%cO8?-S?.I4 =,!3$\C)X=,eM6M9-?/#G6*\J?uj\{tkǼ~|tnlkh_ZPJG:24&+ +% %    $ &   + +'        G4&B/ (K6cJ.vV}[btTrQ|YwW~^e`AkKtTgIvWjNyY>tU8vW:hO1`F/eJ-lQ4jO2}aEiM1sX;fI,|]@|]?}^CpQ6vU~aCsSuUuShHrTmOz[>e}cDaD*~eOyXt]AmR7tUtS{]uU8sW:\B+aF+gH+tV:eHlT4kR6V;!yY4G7,UE8qcVvmd뮮c\WND@?1)1&)+(" "     "  + "     +'1 ?,cF{_DgxWcDvWqPfI,y[=jL`CnPyZ>oOtT{`Ea@xY&YA*eJ.fH|_BaI0lR8lRhLiMxXsV;y]CsWVE=E5+D5(bREtl|rpke\UG=8?0).&#&1 2!1"  + )  + $! +#    $ /`I0qX=vWkMzZ;cCpSV;!rV:jNeKuU=}^CaCxYy]BbCnQ5x[@]D,_D)|^AlJfJ^G/J2R;&ZB(}aEeJnW?lU>s\EqX}bHpSzaAdK4fM4jN6iLZ?)gP7eJ4jPK9'x]D_H1>*w_EaI1aL5C0#( :&!?.!*6!" 8'6$E01E1!N9%H3$@+Q;)>(fL7^I:]LB<,$?0$^OCxpk뮮}wZUOB:29,&'&' 6&)  "   +%   +%#   +   )+ +H4!K4hI|^FmP3uZ:rX?_E+cH,fKlPcI/nQ6oR7vZkQwZ?`G,jP7_E,lQ5fJbD~bGW@)?+K6P9!iQ9x\Dw_JfM8[C-w`J~bI{bEu]@\D-jQ8]D.sX;VB/5 eLoT>qXFs[C]D09&`G0U<&V>() %)?+, +2"4";*:&E2#R;);'3 ZD2U<)A.I6$9'E2"_I7XE9;,$>0'QB9zs͂~~}t[VPD@76.'8,%/ 4$,-  $  + +%'  '1!  +'    +   + &6#3 S@)s[D[A'rX<^D*lR9U?&bL3gJdK1gK/qU9lPz\C|_D]F+O5dJ1oT7rV:jL/cHS?'7'>-O<(T@-nU?jPhO9lT>jVCt]G[G-t`F_H0fL3\E0S?*Q;(E0cIhO9jR?}eMR:&A.W>)F-K4% ++ @+% %7$-D3#-E-F0V;'D1VB5N8(bC+R<+F3!@/&)R?0O=1<.&=.%L>4gZTYRPA:43,&*-09'1%  #   % % +("  /2   + +   + + ( ) +-!P>'O9%W>%V@*H1dK4\D,qR^B*\C,|^EdKhN5dFV=&V?%oT6wZ:pV:Q9bFZE.5# ?-C0N;)K:'jQ`J5\E3[G7v]JP=*dM6lT&T=&fJ0tV;nT.M9,E4&F4&H6-?2*QICre[ΚWOJ\TNGA<));+:*6%+  ! +   +#% >,& + -!-       ! + G40!(?,B-O9&K6eL6F.tW>cM6`H/YA,O:#5$\E+oT9nS:Q;$^H4M:*I6#I7$N=)1 5'^K8J5"R<0R<+[D2YE3_F1]F4T=,gP:WB-N8 pZBVA-L9'dR)3M8%nU:@-$& +6%* ! <)A0I7'I6%H4ZC+]C0L5 ;*7"eL4T<0O8#P<(H5'K9+<, F6,@1(^WOuofᲲۇnh_mhd:1*0",-9) -*  '    +*<+,  $ 0!     +!  +  4$% )@.?-:(/O9#J5 Q;'^G/R>(K6"WC--Q=%`I0bK2pZA`L;=*M9(>,UE/<*@. RA-U>,M5(aJ:X@0M9'cK6bK8\E3dM9YC.bL5iS.\E5E1 gO:YC,_H3M7#YC0dM*L5"D15#?/ +1!2!V=-?,B/#C1"E2$<*V?,U=(hP;?+B.S:*eM6P9)<)G5)C2%=/$?/'H81[MFvkd}uoŝ=855'";,#1%4%3$'" $ & , & +( 4$  + +      + +    ) L9&5$2"* ;%M5#B/F3!O<+4"?.7$R@-I8"[K9-G7!G4"?/J:), G5#gP?`I9Q>,R?.?.`K7[E0Q:&O<*bN=YF5Q>-M:)F3":(@.E4#D2!8&>+D02 0"& 8(6#V@-N;)B. 7&@/!':'`I5R<([@+%N7&O7$XC2+8)2$>/'F70?0)C7/|oh~ysғmlh8.,)!9.(G6-1"*+*)$ +-+" ")! +"  %#       +    7&@,5&;'H4#- G5%=."G:):.;0 &@.<):+RC25(N:)gP?[C3YF4WD2E3"]G3O8$T=)bN=B/D1UA0C5%<.F6&0=,=,;(>*8$:(. <+!* 9&U?,L9&TB)3!E4&.* C+ZB4bH46&?,H4%M:+6&2"&<,$@1*D5.SJAcZQӘVRM1)$)"8/(2%5$5$,4#&04$1"! ,-'2$  +     +   +  '7&9'( ' 5%6&8):*4&)5(1!@/"B1%+1!E7)\K9eQ?aN,Q=,hT@H8&9(aP@3# *4$I4#9*=+C0 ?+E1%H5#, C1#D4$F2Q>.O<*L7#L;,8'0?-XF8G1 F3#>-D-!9(:+"4%6&=-$D8.KC=ZOFf[RnjdyxwUPM0)#=601(!1$6&1 +/+3"9'?, %))1#. 1"*          + & 8'   +2* + - :,/!5%4$H8+%/ 6(aO=]M=P@0Q>,TA/[I3\J4F3"H5#VB.?/:(?-- &3#I3"2#>,9%<(L9'@,E3%A/!9(J5&E2#L9)S>(>->-"2!@/G6(L9*8(2#I1%9)5&2#2"8(B5,^UPOHBngavo|yw\VSD=8KD>$=.#9),,0,8'J2"@, +" )-4%1# #         +  +1"#  5 1$5%  1"5%<, /!2%@4&U?0N?2K;-J7'Q>.P<)F6#9(3!:'* >/' 6'&7'4"E1"5$A/D1 >*>-;)G5%D2",I7'B-@+TA,B.!WG36#@,@,J6(M;.2!?)>-"2#)5&3%=2*@70bZUd_Y~tn}͝QLGYRL80+ 6'$ (2!,+>,@,0# 3%/ +,               +  +-& T?,%  4$  ! 8)8(*+2$H:.J7):*!B4I5&N:+H4"8(,) ;*& 6'+ 6' 8%E2"I7'0@.P<,:'H7'?.3!H6'2F5%B. C/"L:'@,8&>-7#C/">+ E2(8$E1#A-D3'(,. 6+%MB;G<6RLDzsvqk㨨jf`ga\*#%%#6%-:+!9'-/!  +*+.,%!0! +       +      -  S?-' +# +*(#,6'<- 3$M=2N>32#;+!@2D2"J6'G4!+ 7'6&1!%=.3$;+" 6$@.P=,@-D2$@-!M:(M<+6%6$9'E4(M<-A/%=+R?.>+9) C0$7$;(2"C4*4!J4'H2"S>06%,0!/#LB=YMGjd]zvo¿驪qontslQLH(&!$3#,A/#2 /..*" 3$.3$0   +      +     ! +     $  F5$*;+! 8-#! +:,"6&B3#$ J;/B1#E5)0 I9-G7*I8(A-K7%1"8).1!3#3#& C//!?+M9(UA0M8(:(9&L7)M:(4&?.1A1#G7)G3,=,M:*R?//":%2 -?-%8&;(M7(S;+L7*8'.4%5) SKD[PHd^Z}{tȬ|{tGB?%$ .#7&.B0$05#8&;)7%+( & ;,8( -  ! & ( & .    +  +1!'5#9)D4(($-. P@6>/9*"H8,>-D4'>."F6)4$C2%Q>(L8&2"2"+7'4%;+6&C.@2#G3!@-O9&\D0H3!,E/!Q>-7*B0":'2!/G3,I8*8$^J;>*I8)* + C0(3!=-#<*K4&F0$@/&2#1#0%RC8J?6[UQ~x}xȗG@;#"*A+ 6(0";)0*6&8(/")#  +,0  +( %2" +      +'   &       +  8* /"( +>0!L>/?/!#7, -MB5;+!L;,L;-=+XH,F3'R@./!I7'J9)>*/ 8*"H6+>+D6(7(VA4& 6#7&6%8&5$H4&3#I6*8)"5' .%>4,H:4LH@sje \ No newline at end of file diff --git a/examples/app_yolov8_classification/obtain_and_optimize_yolov8_cls.py b/examples/app_yolov8_classification/obtain_and_optimize_yolov8_cls.py new file mode 100644 index 000000000..83e848746 --- /dev/null +++ b/examples/app_yolov8_classification/obtain_and_optimize_yolov8_cls.py @@ -0,0 +1,76 @@ +from xmos_ai_tools import xformer +from xmos_ai_tools.xinterpreters import TFLMHostInterpreter +from ultralytics import YOLO +import numpy as np + +HEIGHT, WIDTH = 160, 160 +TFLITE_MODEL_PATH = "yolov8n-cls_saved_model/yolov8n-cls_full_integer_quant.tflite" +OPT_MODEL_PATH = "src/model.tflite" +OPT_PARAMS_PATH = "src/model_flash.params" +NAMING_PREFIX = "model_" + +############################################### +# Creating and converting an YoloV8 cls model # +############################################### + +# Load a model +model = YOLO("yolov8n-cls.pt") # load an official model + +# Export the model +_format = "tflite" + +model.export(format=_format, imgsz=(HEIGHT, WIDTH), int8=True) + +# Convert the model to XCore optimized TFLite via xformer: +# There are various ways to configure the compiler to optimize the model, +# operator splitting isn't documented yet. This configuration works well for +# MobileNetV2, reach out if you need assistance with other complex models +xformer.convert( + TFLITE_MODEL_PATH, + OPT_MODEL_PATH, + [ + ("xcore-weights-file", OPT_PARAMS_PATH), + ("xcore-thread-count", "5"), + ("xcore-naming-prefix", NAMING_PREFIX), + ], +) + +# Generate flash binary +xformer.generate_flash( + output_file="xcore_flash_binary.out", + model_files=[OPT_MODEL_PATH], + param_files=[OPT_PARAMS_PATH], +) + +####################################################################### +# Running the model on xcore host interpreter with sample input image # +####################################################################### + +# Sample image of a lion (ImageNet class 291) +with open("lion.bin", "rb") as f: + data = f.read() + +input_array = np.frombuffer(data, dtype=np.uint8) +# input image values are in the range 0 to 255 +# we subtract 128 to change to -128 to 127 for int8 +input_array = (input_array - 128).astype(np.int8) + + +interpreter = TFLMHostInterpreter() +interpreter.set_model(model_path=OPT_MODEL_PATH, params_path=OPT_PARAMS_PATH) +interpreter.allocate_tensors() + +# Interpreter.get_input_details and interpreter.get_output_details +# return a list for each input/output in the model +# MobileNetV2 only has a single input and output, so we unwrap it +(input_details,) = interpreter.get_input_details() +(output_details,) = interpreter.get_output_details() + +input_data = input_array.astype(input_details["dtype"]) +input_data = np.reshape(input_data, input_details["shape"]) +interpreter.set_tensor(input_details["index"], input_data) + +# Inference +interpreter.invoke() +detections = interpreter.get_tensor(output_details["index"]) +print(f"Inferred imagenet class = {detections.argmax()}") diff --git a/examples/app_yolov8_classification/requirements.txt b/examples/app_yolov8_classification/requirements.txt new file mode 100644 index 000000000..a2955d7a1 --- /dev/null +++ b/examples/app_yolov8_classification/requirements.txt @@ -0,0 +1,10 @@ +# python_version 3.8 +nvidia-pyindex +ultralytics +onnx +onnxsim>=0.4.33 +onnxruntime +onnx2tf>=1.15.4 +sng4onnx>=1.0.1 +onnx_graphsurgeon>=0.3.26 +tflite_support diff --git a/examples/app_yolov8_classification/src/config.xscope b/examples/app_yolov8_classification/src/config.xscope new file mode 100644 index 000000000..f79e64115 --- /dev/null +++ b/examples/app_yolov8_classification/src/config.xscope @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/app_yolov8_classification/src/lion.h b/examples/app_yolov8_classification/src/lion.h new file mode 100644 index 000000000..b05d9686b --- /dev/null +++ b/examples/app_yolov8_classification/src/lion.h @@ -0,0 +1 @@ +#define LION_IMAGE { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf6, 0xf6, 0xf6, 0xfb, 0xfb, 0xf9, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xed, 0xed, 0xed, 0xf7, 0xf8, 0xf5, 0xfe, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf8, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xf8, 0xf8, 0xf7, 0xfb, 0xfb, 0xfa, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xfe, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xf1, 0xf1, 0xf0, 0xf4, 0xf4, 0xf2, 0xfe, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfa, 0xf9, 0xf9, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfb, 0xfa, 0xfa, 0xf9, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf9, 0xf9, 0xf9, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfa, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb, 0xf9, 0xfb, 0xfb, 0xf9, 0xf4, 0xf4, 0xf2, 0xfe, 0xfe, 0xfc, 0xfa, 0xfa, 0xf8, 0xf8, 0xf8, 0xf6, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf8, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfc, 0xfb, 0xfc, 0xf9, 0xee, 0xef, 0xed, 0xf0, 0xf1, 0xee, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfa, 0xfc, 0xfc, 0xfa, 0xf6, 0xf5, 0xf1, 0xf6, 0xf4, 0xf1, 0xf1, 0xf1, 0xef, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xfa, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xf8, 0xf1, 0xf1, 0xef, 0xf8, 0xf8, 0xf6, 0xf8, 0xf8, 0xf6, 0xee, 0xee, 0xec, 0xf5, 0xf5, 0xf3, 0xfb, 0xfb, 0xfb, 0xfe, 0xfe, 0xfe, 0xf8, 0xf8, 0xf8, 0xf9, 0xf8, 0xf8, 0xfc, 0xfc, 0xfb, 0xf9, 0xf9, 0xf7, 0xe8, 0xe9, 0xe6, 0xee, 0xee, 0xec, 0xfc, 0xfc, 0xfa, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfb, 0xfb, 0xf9, 0xf6, 0xf6, 0xf4, 0xf6, 0xf4, 0xf1, 0xe8, 0xe7, 0xe3, 0xf7, 0xf7, 0xf5, 0xfd, 0xfd, 0xfb, 0xf9, 0xf9, 0xf8, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xf8, 0xf8, 0xf8, 0xfb, 0xfb, 0xfb, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xf8, 0xf9, 0xf9, 0xf7, 0xfb, 0xfb, 0xf9, 0xf7, 0xf7, 0xf5, 0xf4, 0xf4, 0xf2, 0xf4, 0xf4, 0xf2, 0xf8, 0xf9, 0xf7, 0xed, 0xed, 0xeb, 0xeb, 0xeb, 0xe9, 0xec, 0xec, 0xea, 0xe4, 0xe2, 0xdf, 0xf1, 0xef, 0xec, 0xf4, 0xf3, 0xf1, 0xfb, 0xfb, 0xf9, 0xf5, 0xf5, 0xf3, 0xf4, 0xf5, 0xf2, 0xf7, 0xf8, 0xf6, 0xf0, 0xf1, 0xef, 0xe4, 0xe4, 0xe2, 0xed, 0xed, 0xeb, 0xf9, 0xf9, 0xf7, 0xfa, 0xfb, 0xf9, 0xf8, 0xf8, 0xf6, 0xfb, 0xfc, 0xf9, 0xf8, 0xf9, 0xf6, 0xfc, 0xfd, 0xfb, 0xfb, 0xfb, 0xf9, 0xf8, 0xfa, 0xf5, 0xee, 0xf0, 0xeb, 0xeb, 0xed, 0xe7, 0xdf, 0xd5, 0xce, 0xf9, 0xf9, 0xf7, 0xf0, 0xf0, 0xee, 0xfc, 0xfa, 0xf9, 0xfd, 0xfc, 0xfa, 0xf9, 0xf7, 0xf4, 0xf8, 0xf6, 0xf3, 0xf6, 0xf6, 0xf3, 0xfd, 0xfd, 0xfb, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xf9, 0xf5, 0xf5, 0xf3, 0xed, 0xed, 0xeb, 0xfb, 0xfb, 0xf9, 0xed, 0xed, 0xeb, 0xe0, 0xe0, 0xde, 0xf8, 0xf8, 0xf6, 0xee, 0xee, 0xec, 0xe1, 0xe2, 0xe0, 0xe3, 0xe4, 0xe2, 0xe8, 0xe7, 0xe4, 0xcb, 0xc9, 0xc6, 0xeb, 0xeb, 0xe8, 0xf6, 0xf6, 0xf4, 0xf5, 0xf6, 0xf4, 0xe8, 0xe8, 0xe6, 0xf1, 0xf2, 0xf0, 0xe4, 0xe5, 0xe2, 0xe3, 0xe4, 0xe2, 0xe4, 0xe4, 0xe2, 0xf2, 0xf2, 0xf0, 0xf7, 0xf7, 0xf5, 0xf4, 0xf4, 0xf2, 0xf4, 0xf5, 0xf3, 0xf5, 0xf5, 0xf3, 0xfd, 0xfd, 0xfb, 0xf9, 0xfa, 0xf8, 0xf1, 0xed, 0xea, 0xe7, 0xe3, 0xe1, 0xd4, 0xcb, 0xc3, 0xf1, 0xef, 0xe9, 0xf2, 0xf2, 0xf0, 0xf7, 0xf7, 0xf5, 0xec, 0xeb, 0xe9, 0xf4, 0xf2, 0xf1, 0xf4, 0xf2, 0xef, 0xf1, 0xf0, 0xec, 0xf6, 0xf5, 0xf3, 0xf6, 0xf6, 0xf4, 0xf8, 0xf8, 0xf6, 0xf5, 0xf6, 0xf2, 0xf5, 0xf6, 0xf2, 0xf9, 0xf9, 0xf9, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xfe, 0xfc, 0xfd, 0xfe, 0xfc, 0xfd, 0xfd, 0xfc, 0xfd, 0xfd, 0xfb, 0xfd, 0xfd, 0xfb, 0xfe, 0xfe, 0xfd, 0xfd, 0xfe, 0xfc, 0xfc, 0xfd, 0xfb, 0xfc, 0xfc, 0xfa, 0xfb, 0xfc, 0xfa, 0xf9, 0xf9, 0xf7, 0xfc, 0xfc, 0xfa, 0xfe, 0xfe, 0xfc, 0xf9, 0xf8, 0xf9, 0xf9, 0xf7, 0xf9, 0xee, 0xed, 0xec, 0xed, 0xec, 0xea, 0xf3, 0xf4, 0xf0, 0xea, 0xeb, 0xe7, 0xde, 0xdd, 0xda, 0xe9, 0xe8, 0xe5, 0xe4, 0xe0, 0xdd, 0xd7, 0xd3, 0xd1, 0xdc, 0xda, 0xd7, 0xc5, 0xc0, 0xbb, 0xb4, 0xb1, 0xac, 0xf0, 0xef, 0xee, 0xea, 0xea, 0xe7, 0xde, 0xdd, 0xd7, 0xde, 0xde, 0xd7, 0xdf, 0xdc, 0xd7, 0xd0, 0xcc, 0xc7, 0xe5, 0xe4, 0xe1, 0xf4, 0xf3, 0xf0, 0xf4, 0xf3, 0xf0, 0xf2, 0xf1, 0xee, 0xed, 0xef, 0xec, 0xf0, 0xf2, 0xf0, 0xf8, 0xf8, 0xf8, 0xf4, 0xf7, 0xf3, 0xdc, 0xda, 0xd6, 0xcd, 0xc4, 0xbd, 0xd4, 0xcd, 0xc5, 0xf8, 0xfb, 0xfa, 0xde, 0xde, 0xd7, 0xf5, 0xf4, 0xee, 0xee, 0xeb, 0xe7, 0xee, 0xeb, 0xe7, 0xea, 0xe5, 0xe0, 0xe7, 0xe3, 0xdd, 0xf3, 0xf2, 0xed, 0xee, 0xed, 0xea, 0xe9, 0xe8, 0xe5, 0xed, 0xec, 0xe8, 0xf8, 0xf7, 0xf3, 0xfc, 0xfc, 0xfb, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xf9, 0xfe, 0xfe, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfb, 0xfa, 0xfa, 0xfc, 0xfc, 0xfa, 0xf7, 0xf8, 0xf6, 0xf5, 0xf5, 0xf3, 0xf2, 0xf2, 0xf0, 0xf4, 0xf5, 0xf3, 0xfa, 0xfa, 0xf8, 0xfb, 0xfc, 0xf9, 0xfb, 0xfb, 0xf9, 0xfa, 0xfb, 0xf8, 0xfa, 0xfb, 0xf8, 0xf7, 0xf7, 0xf5, 0xf2, 0xf3, 0xf0, 0xf8, 0xf8, 0xf6, 0xf4, 0xf2, 0xf1, 0xf5, 0xf3, 0xf2, 0xf0, 0xef, 0xed, 0xe2, 0xe1, 0xdf, 0xe9, 0xea, 0xe5, 0xe8, 0xe8, 0xe4, 0xd8, 0xd6, 0xd3, 0xd8, 0xd7, 0xd3, 0xc6, 0xc1, 0xbe, 0xd5, 0xcf, 0xcd, 0xb3, 0xb1, 0xae, 0xbb, 0xb4, 0xaf, 0xad, 0xa6, 0x9f, 0xd2, 0xcf, 0xcc, 0xed, 0xeb, 0xe7, 0xc8, 0xc5, 0xbe, 0xd3, 0xd1, 0xca, 0xd3, 0xcf, 0xc8, 0xc3, 0xbd, 0xb8, 0xdd, 0xdc, 0xd8, 0xe5, 0xe4, 0xe0, 0xf1, 0xef, 0xec, 0xea, 0xe9, 0xe6, 0xe7, 0xe6, 0xe2, 0xee, 0xed, 0xea, 0xf1, 0xf1, 0xef, 0xee, 0xea, 0xe5, 0xc2, 0xba, 0xb1, 0xca, 0xc1, 0xb8, 0xe9, 0xe4, 0xdd, 0xe7, 0xe5, 0xe1, 0xdf, 0xdc, 0xd5, 0xde, 0xdb, 0xd4, 0xe5, 0xdf, 0xd8, 0xd5, 0xcf, 0xc8, 0xd3, 0xcc, 0xc6, 0xec, 0xe7, 0xe1, 0xe8, 0xe7, 0xe2, 0xe7, 0xe6, 0xe2, 0xf2, 0xf0, 0xed, 0xf1, 0xf0, 0xed, 0xef, 0xee, 0xeb, 0xea, 0xea, 0xe8, 0xf2, 0xf2, 0xf0, 0xfa, 0xfb, 0xf9, 0xfc, 0xfc, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfb, 0xfb, 0xf7, 0xf7, 0xf6, 0xf0, 0xf0, 0xee, 0xec, 0xec, 0xea, 0xe6, 0xe6, 0xe3, 0xe5, 0xe5, 0xe2, 0xdc, 0xdb, 0xd8, 0xe8, 0xe6, 0xe4, 0xea, 0xe9, 0xe7, 0xec, 0xec, 0xea, 0xf2, 0xf2, 0xf0, 0xf2, 0xf2, 0xef, 0xed, 0xed, 0xea, 0xf2, 0xf2, 0xef, 0xe2, 0xe2, 0xe0, 0xe7, 0xe6, 0xe1, 0xda, 0xd9, 0xd4, 0xe7, 0xe5, 0xe3, 0xd0, 0xce, 0xcb, 0xdb, 0xdb, 0xd6, 0xdc, 0xdc, 0xd8, 0xd4, 0xd2, 0xce, 0xbf, 0xbd, 0xb8, 0xa9, 0xa4, 0xa1, 0xbc, 0xb6, 0xb3, 0xaf, 0xad, 0xa8, 0xc2, 0xbb, 0xb6, 0x84, 0x7a, 0x71, 0xa3, 0x9b, 0x95, 0xd9, 0xd3, 0xcf, 0xc5, 0xbf, 0xb9, 0xc7, 0xc2, 0xbc, 0xc5, 0xc1, 0xba, 0xb9, 0xb3, 0xad, 0xd6, 0xd4, 0xd0, 0xcf, 0xce, 0xca, 0xe7, 0xe5, 0xe2, 0xe5, 0xe3, 0xe0, 0xd0, 0xca, 0xc4, 0xe3, 0xde, 0xd8, 0xe5, 0xe6, 0xdf, 0xd7, 0xce, 0xc5, 0xa8, 0x99, 0x8b, 0xd7, 0xcf, 0xc5, 0xe6, 0xe1, 0xdc, 0xc7, 0xbe, 0xb5, 0xe0, 0xda, 0xd6, 0xc3, 0xbb, 0xb4, 0xd7, 0xcd, 0xc2, 0xd1, 0xc9, 0xbe, 0xe0, 0xd8, 0xd1, 0xda, 0xd5, 0xcd, 0xdc, 0xdb, 0xd5, 0xe3, 0xe2, 0xde, 0xde, 0xdc, 0xda, 0xe0, 0xde, 0xdb, 0xee, 0xed, 0xe9, 0xfc, 0xfd, 0xfb, 0xfb, 0xfc, 0xfa, 0xfe, 0xfe, 0xfc, 0xfe, 0xfe, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xfa, 0xf8, 0xf0, 0xf1, 0xef, 0xf2, 0xf0, 0xee, 0xe4, 0xe2, 0xe1, 0xde, 0xdc, 0xd9, 0xe5, 0xe4, 0xe0, 0xe1, 0xdf, 0xda, 0xd4, 0xd2, 0xcd, 0xe2, 0xde, 0xd8, 0xde, 0xd7, 0xd1, 0xdd, 0xd8, 0xd2, 0xea, 0xe8, 0xe3, 0xe5, 0xe4, 0xde, 0xe6, 0xe5, 0xe0, 0xda, 0xd9, 0xd4, 0xe8, 0xe5, 0xe0, 0xe5, 0xe2, 0xdd, 0xce, 0xc9, 0xc5, 0xc8, 0xc3, 0xbf, 0xd0, 0xc9, 0xc3, 0xd5, 0xd0, 0xca, 0xb9, 0xae, 0xa7, 0xda, 0xd9, 0xd3, 0xc8, 0xc4, 0xbf, 0x9d, 0x95, 0x8b, 0xc3, 0xbe, 0xb6, 0xa5, 0x9d, 0x96, 0x90, 0x87, 0x7d, 0xb3, 0xaa, 0xa5, 0x6f, 0x63, 0x59, 0x87, 0x7e, 0x77, 0xb0, 0xa7, 0xa2, 0xbc, 0xb5, 0xb0, 0xb5, 0xb0, 0xa9, 0xb3, 0xad, 0xa5, 0xb6, 0xaf, 0xa8, 0xca, 0xc4, 0xbe, 0xbf, 0xbf, 0xb7, 0xd7, 0xd1, 0xcd, 0xda, 0xd4, 0xcf, 0xbb, 0xb1, 0xa8, 0xd0, 0xc9, 0xc3, 0xca, 0xc4, 0xbb, 0xb5, 0xac, 0xa0, 0x9e, 0x8e, 0x84, 0xd7, 0xd0, 0xc8, 0xd3, 0xcd, 0xc5, 0xc0, 0xb3, 0xa6, 0xdd, 0xd4, 0xcd, 0xc6, 0xb6, 0xaa, 0xcc, 0xbf, 0xb0, 0xc4, 0xba, 0xaf, 0xca, 0xbf, 0xb6, 0xd9, 0xd0, 0xc7, 0xd3, 0xc8, 0xbf, 0xd1, 0xc7, 0xc0, 0xda, 0xd9, 0xd4, 0xea, 0xe8, 0xe5, 0xf6, 0xf5, 0xf2, 0xf0, 0xf0, 0xee, 0xfc, 0xfc, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfa, 0xfa, 0xfa, 0xf7, 0xf8, 0xf5, 0xf5, 0xf5, 0xf3, 0xf0, 0xee, 0xed, 0xe5, 0xe3, 0xe2, 0xe3, 0xe1, 0xde, 0xd8, 0xd6, 0xd3, 0xd8, 0xd4, 0xcd, 0xcc, 0xc5, 0xbe, 0xcf, 0xc8, 0xc2, 0xc5, 0xbe, 0xb8, 0xc9, 0xc2, 0xbc, 0xce, 0xc8, 0xc1, 0xd1, 0xcb, 0xc3, 0xcc, 0xc6, 0xbf, 0xc6, 0xc0, 0xb9, 0xbe, 0xb2, 0xad, 0xc6, 0xbb, 0xb5, 0xd6, 0xcd, 0xc7, 0xc8, 0xc0, 0xb9, 0xb6, 0xa4, 0x98, 0xc5, 0xbb, 0xb7, 0xae, 0x9e, 0x94, 0xa9, 0x9b, 0x95, 0xb9, 0xb0, 0xad, 0x95, 0x88, 0x80, 0x9d, 0x90, 0x85, 0x9d, 0x8b, 0x82, 0x87, 0x7a, 0x6b, 0x8a, 0x7c, 0x76, 0x75, 0x67, 0x5e, 0x77, 0x64, 0x5b, 0x95, 0x84, 0x7a, 0xb4, 0xaa, 0xa1, 0x9f, 0x95, 0x8b, 0x9e, 0x93, 0x88, 0xa9, 0x9e, 0x93, 0xbc, 0xb2, 0xa9, 0xc7, 0xc1, 0xb7, 0xcf, 0xc4, 0xbc, 0xa9, 0x9d, 0x96, 0xbc, 0xac, 0xa0, 0xbc, 0xb1, 0xa9, 0xb2, 0xa4, 0x9a, 0x9b, 0x8a, 0x7b, 0xa7, 0x91, 0x84, 0xcf, 0xc3, 0xb8, 0xc6, 0xb8, 0xaa, 0xbe, 0xb0, 0xa2, 0xbb, 0xa7, 0x96, 0xca, 0xb4, 0xa3, 0xc5, 0xb3, 0xa3, 0xc4, 0xb6, 0xa7, 0xc9, 0xb9, 0xad, 0xc4, 0xb7, 0xaa, 0xc5, 0xbc, 0xb2, 0xe1, 0xda, 0xd6, 0xe6, 0xe4, 0xe1, 0xe9, 0xe8, 0xe4, 0xf4, 0xf3, 0xef, 0xfa, 0xfa, 0xf8, 0xfa, 0xfa, 0xf8, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xfa, 0xf9, 0xf9, 0xf7, 0xf7, 0xf8, 0xf6, 0xf6, 0xf5, 0xf3, 0xf0, 0xef, 0xed, 0xf0, 0xef, 0xeb, 0xf0, 0xef, 0xeb, 0xed, 0xe7, 0xe7, 0xe0, 0xda, 0xd7, 0xd0, 0xca, 0xc6, 0xc9, 0xbe, 0xb7, 0xb9, 0xa9, 0x9e, 0xc0, 0xad, 0xa1, 0xc4, 0xaf, 0xa4, 0xb0, 0xa4, 0x99, 0xb2, 0x9f, 0x97, 0xbb, 0xac, 0xa2, 0xb4, 0xaf, 0xa5, 0xa5, 0x93, 0x85, 0x9f, 0x89, 0x78, 0xaf, 0x9c, 0x8b, 0xc7, 0xb8, 0xac, 0xaa, 0x96, 0x8a, 0xa7, 0x8d, 0x7b, 0xad, 0x9e, 0x94, 0x8f, 0x7c, 0x6f, 0x91, 0x84, 0x7a, 0x88, 0x81, 0x76, 0x68, 0x54, 0x4c, 0x79, 0x6b, 0x61, 0x6e, 0x57, 0x4b, 0x66, 0x51, 0x48, 0x67, 0x55, 0x4b, 0x6d, 0x58, 0x4b, 0x80, 0x6d, 0x60, 0x94, 0x83, 0x77, 0x90, 0x7f, 0x74, 0x8d, 0x78, 0x6f, 0x9f, 0x8d, 0x7f, 0xaa, 0x98, 0x8d, 0xbb, 0xb7, 0xab, 0xc2, 0xb1, 0xa5, 0xa9, 0x9e, 0x91, 0xb8, 0xa7, 0x95, 0xba, 0xb1, 0xa6, 0xa5, 0x92, 0x82, 0x8f, 0x7c, 0x6c, 0xb1, 0x9f, 0x8c, 0xb4, 0xa1, 0x8f, 0xbe, 0xab, 0x9d, 0xb3, 0x9c, 0x8d, 0xad, 0x8b, 0x72, 0xbb, 0x9c, 0x88, 0xa1, 0x88, 0x79, 0xbc, 0xa3, 0x8d, 0xbb, 0xa5, 0x91, 0xcd, 0xc1, 0xb7, 0xda, 0xd4, 0xcf, 0xdf, 0xd9, 0xd4, 0xe9, 0xe3, 0xdf, 0xec, 0xe8, 0xe5, 0xef, 0xeb, 0xe8, 0xee, 0xee, 0xe9, 0xf9, 0xf8, 0xf4, 0xf6, 0xf3, 0xf0, 0xeb, 0xe9, 0xe6, 0xe8, 0xe6, 0xdf, 0xef, 0xed, 0xe6, 0xf5, 0xf4, 0xf2, 0xfa, 0xf9, 0xf7, 0xfd, 0xfd, 0xfb, 0xfe, 0xff, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xf9, 0xf4, 0xf4, 0xf2, 0xf5, 0xf3, 0xf1, 0xf8, 0xf6, 0xf4, 0xf6, 0xf5, 0xf1, 0xf0, 0xee, 0xeb, 0xf0, 0xea, 0xea, 0xd3, 0xce, 0xc9, 0xac, 0xa2, 0x9b, 0xa3, 0x98, 0x92, 0x9c, 0x8f, 0x87, 0xa8, 0x90, 0x82, 0xaa, 0x89, 0x71, 0xad, 0x8b, 0x74, 0x99, 0x84, 0x72, 0xa7, 0x94, 0x82, 0xab, 0x97, 0x8a, 0xd1, 0xc3, 0xb8, 0x92, 0x80, 0x72, 0x81, 0x64, 0x51, 0x9e, 0x7e, 0x69, 0xaa, 0x94, 0x85, 0x8e, 0x6f, 0x5b, 0x88, 0x6b, 0x57, 0x72, 0x63, 0x5a, 0x96, 0x87, 0x7e, 0x88, 0x78, 0x6f, 0x75, 0x64, 0x57, 0x4c, 0x38, 0x2d, 0x6a, 0x52, 0x47, 0x4e, 0x3a, 0x30, 0x60, 0x4e, 0x45, 0x5b, 0x46, 0x39, 0x77, 0x5d, 0x4a, 0x88, 0x6f, 0x5d, 0x72, 0x60, 0x55, 0x77, 0x65, 0x57, 0x87, 0x67, 0x54, 0x91, 0x79, 0x67, 0x9f, 0x8d, 0x7d, 0xa7, 0x90, 0x7b, 0xaf, 0x9a, 0x8f, 0xa8, 0x8a, 0x73, 0xa3, 0x8e, 0x80, 0x92, 0x7b, 0x69, 0x7d, 0x66, 0x54, 0xa6, 0x8b, 0x78, 0x91, 0x76, 0x63, 0x9f, 0x82, 0x74, 0xa1, 0x82, 0x6a, 0x9d, 0x7b, 0x62, 0x9a, 0x7c, 0x68, 0x98, 0x7a, 0x68, 0xab, 0x8b, 0x6f, 0xba, 0xae, 0x9d, 0xcb, 0xc4, 0xb8, 0xca, 0xc2, 0xb9, 0xe0, 0xd7, 0xcf, 0xd2, 0xc9, 0xc3, 0xe3, 0xdb, 0xd6, 0xe2, 0xda, 0xd5, 0xe7, 0xdd, 0xd8, 0xdb, 0xd2, 0xcd, 0xc7, 0xbd, 0xb4, 0xe6, 0xdb, 0xd3, 0xf0, 0xec, 0xe5, 0xe8, 0xe4, 0xdd, 0xee, 0xec, 0xeb, 0xfa, 0xf8, 0xf6, 0xfb, 0xfc, 0xf9, 0xfd, 0xfd, 0xfb, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf6, 0xf2, 0xf2, 0xf0, 0xe8, 0xe7, 0xe4, 0xe6, 0xe5, 0xe2, 0xe9, 0xe8, 0xe5, 0xdf, 0xdf, 0xdd, 0xe1, 0xde, 0xdb, 0xde, 0xd6, 0xcf, 0xe0, 0xda, 0xd5, 0xdb, 0xd6, 0xd0, 0xde, 0xda, 0xd4, 0xd2, 0xcc, 0xc6, 0xc2, 0xbc, 0xb5, 0x9e, 0x90, 0x86, 0x88, 0x6e, 0x5f, 0x91, 0x73, 0x60, 0x94, 0x73, 0x55, 0x94, 0x78, 0x67, 0x92, 0x74, 0x63, 0x94, 0x7d, 0x6c, 0x96, 0x7d, 0x6c, 0x81, 0x68, 0x56, 0x74, 0x54, 0x43, 0x92, 0x72, 0x59, 0x8f, 0x72, 0x60, 0x76, 0x5d, 0x4b, 0x66, 0x4e, 0x3d, 0x63, 0x4c, 0x40, 0x5c, 0x46, 0x3d, 0x6f, 0x5d, 0x50, 0x48, 0x37, 0x2f, 0x57, 0x3f, 0x36, 0x3a, 0x28, 0x21, 0x40, 0x30, 0x29, 0x4f, 0x3d, 0x36, 0x55, 0x40, 0x35, 0x70, 0x55, 0x45, 0x74, 0x5a, 0x4a, 0x66, 0x53, 0x47, 0x79, 0x5b, 0x44, 0x76, 0x5a, 0x43, 0x84, 0x66, 0x4f, 0xa3, 0x86, 0x73, 0x9d, 0x82, 0x6e, 0x93, 0x6f, 0x57, 0x8e, 0x70, 0x5d, 0x79, 0x5f, 0x4a, 0x8b, 0x6d, 0x56, 0x96, 0x74, 0x5e, 0x74, 0x57, 0x45, 0x82, 0x67, 0x55, 0x97, 0x71, 0x56, 0x8f, 0x6e, 0x56, 0x75, 0x5a, 0x44, 0x90, 0x75, 0x5d, 0xa4, 0x90, 0x83, 0xc1, 0xb4, 0xa4, 0xb0, 0xa1, 0x92, 0xc0, 0xb4, 0xa7, 0xd0, 0xc3, 0xbd, 0xba, 0xa9, 0x9c, 0xb3, 0xa1, 0x96, 0xb3, 0xa5, 0x9c, 0xad, 0x98, 0x8b, 0xc0, 0xad, 0xa4, 0xbc, 0xa9, 0x9e, 0xcf, 0xbf, 0xb6, 0xd9, 0xcd, 0xc5, 0xe2, 0xda, 0xd4, 0xf1, 0xec, 0xea, 0xed, 0xec, 0xe9, 0xf5, 0xf5, 0xf3, 0xf6, 0xf8, 0xf5, 0xf8, 0xf8, 0xf6, 0xfb, 0xfb, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xf7, 0xf7, 0xf5, 0xed, 0xed, 0xeb, 0xef, 0xed, 0xea, 0xe5, 0xe4, 0xe0, 0xd9, 0xd2, 0xca, 0xcc, 0xc0, 0xb6, 0xd5, 0xd0, 0xcc, 0xcc, 0xc6, 0xc1, 0xca, 0xbc, 0xb6, 0xce, 0xbf, 0xb8, 0xbf, 0xb2, 0xa8, 0xb4, 0xa6, 0x9c, 0xa9, 0x9b, 0x8f, 0xad, 0x9f, 0x92, 0xaf, 0x9f, 0x93, 0x9f, 0x87, 0x76, 0xa2, 0x75, 0x53, 0x91, 0x6c, 0x4d, 0x7d, 0x61, 0x4b, 0x86, 0x69, 0x56, 0x87, 0x6a, 0x57, 0x6e, 0x57, 0x46, 0x5e, 0x45, 0x35, 0x6d, 0x50, 0x39, 0x73, 0x51, 0x3c, 0x70, 0x54, 0x41, 0x66, 0x49, 0x36, 0x59, 0x40, 0x2f, 0x49, 0x33, 0x26, 0x4e, 0x37, 0x29, 0x3c, 0x2b, 0x20, 0x53, 0x39, 0x2a, 0x3b, 0x28, 0x1e, 0x3d, 0x2d, 0x27, 0x39, 0x29, 0x22, 0x3f, 0x2c, 0x23, 0x55, 0x3e, 0x31, 0x62, 0x49, 0x3a, 0x51, 0x3d, 0x31, 0x6b, 0x4f, 0x3b, 0x6d, 0x50, 0x3b, 0x79, 0x59, 0x40, 0x7f, 0x60, 0x4b, 0x7d, 0x5f, 0x49, 0x89, 0x65, 0x49, 0x79, 0x5a, 0x42, 0x6b, 0x4f, 0x3b, 0x85, 0x66, 0x4e, 0x78, 0x58, 0x44, 0x72, 0x53, 0x40, 0x8a, 0x69, 0x53, 0x8e, 0x65, 0x48, 0x7f, 0x61, 0x4a, 0x88, 0x65, 0x4a, 0x8a, 0x6c, 0x55, 0x9e, 0x89, 0x79, 0xa2, 0x8d, 0x82, 0xbc, 0xa6, 0x94, 0xa0, 0x8b, 0x76, 0x8d, 0x74, 0x63, 0x96, 0x7c, 0x6b, 0x9e, 0x85, 0x76, 0x9c, 0x83, 0x72, 0x93, 0x78, 0x66, 0xa4, 0x8d, 0x7e, 0xb4, 0x9e, 0x91, 0xb4, 0xa2, 0x97, 0xc2, 0xb6, 0xad, 0xd2, 0xca, 0xc4, 0xe0, 0xd7, 0xd3, 0xe9, 0xe5, 0xdf, 0xea, 0xe5, 0xe3, 0xf1, 0xf2, 0xee, 0xf9, 0xfa, 0xf8, 0xf9, 0xf9, 0xf7, 0xf9, 0xf9, 0xf9, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf5, 0xf5, 0xf5, 0xf3, 0xf3, 0xf1, 0xf1, 0xf0, 0xee, 0xe7, 0xe6, 0xe3, 0xea, 0xe9, 0xe5, 0xdd, 0xdb, 0xd7, 0xca, 0xc0, 0xb5, 0xac, 0x9a, 0x8b, 0xbf, 0xb0, 0xa5, 0xcd, 0xc0, 0xb4, 0xbe, 0xb1, 0xa5, 0xa0, 0x8e, 0x80, 0x94, 0x80, 0x71, 0x80, 0x6e, 0x64, 0x82, 0x6f, 0x61, 0x93, 0x7d, 0x6b, 0x92, 0x7c, 0x6d, 0x88, 0x66, 0x54, 0x97, 0x6f, 0x56, 0x83, 0x58, 0x3c, 0x76, 0x56, 0x3f, 0x78, 0x58, 0x41, 0x7a, 0x57, 0x40, 0x71, 0x54, 0x3c, 0x6b, 0x50, 0x3b, 0x6c, 0x48, 0x2f, 0x68, 0x47, 0x30, 0x61, 0x41, 0x2b, 0x58, 0x3e, 0x29, 0x49, 0x34, 0x23, 0x41, 0x29, 0x19, 0x32, 0x1c, 0x0e, 0x56, 0x3b, 0x23, 0x38, 0x21, 0x15, 0x31, 0x1f, 0x18, 0x33, 0x22, 0x1b, 0x37, 0x26, 0x21, 0x49, 0x35, 0x2c, 0x5b, 0x42, 0x33, 0x44, 0x2f, 0x22, 0x56, 0x3a, 0x2c, 0x66, 0x49, 0x33, 0x5e, 0x3f, 0x27, 0x82, 0x5f, 0x46, 0x63, 0x42, 0x29, 0x83, 0x5f, 0x41, 0x70, 0x51, 0x35, 0x63, 0x47, 0x32, 0x72, 0x54, 0x3c, 0x66, 0x49, 0x38, 0x7d, 0x5b, 0x45, 0x7a, 0x5c, 0x48, 0x79, 0x5b, 0x49, 0x74, 0x55, 0x3d, 0x8e, 0x64, 0x43, 0x88, 0x67, 0x51, 0x87, 0x6e, 0x57, 0x92, 0x78, 0x65, 0x85, 0x68, 0x56, 0x6e, 0x52, 0x45, 0x89, 0x6e, 0x5c, 0x88, 0x6a, 0x5e, 0x8a, 0x6d, 0x58, 0x86, 0x67, 0x53, 0xa3, 0x90, 0x84, 0xad, 0x9c, 0x93, 0xb0, 0x9a, 0x8c, 0xaf, 0x9b, 0x8e, 0xae, 0x98, 0x86, 0xc6, 0xb3, 0xa4, 0xd2, 0xc7, 0xc1, 0xdb, 0xd2, 0xcb, 0xe9, 0xe1, 0xdb, 0xf4, 0xf2, 0xeb, 0xf5, 0xf5, 0xf3, 0xf6, 0xf6, 0xf4, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xfa, 0xf9, 0xf9, 0xf9, 0xf9, 0xf8, 0xf6, 0xe9, 0xe5, 0xe0, 0xe0, 0xd9, 0xd3, 0xd6, 0xcc, 0xc4, 0xd7, 0xca, 0xc0, 0xc5, 0xb8, 0xaa, 0xb7, 0xa5, 0x98, 0xa7, 0x8c, 0x7c, 0x81, 0x69, 0x5a, 0x96, 0x7f, 0x6f, 0x8c, 0x76, 0x64, 0x80, 0x68, 0x5b, 0x5f, 0x49, 0x3f, 0x6b, 0x54, 0x46, 0x5e, 0x46, 0x36, 0x4f, 0x3b, 0x2c, 0x63, 0x4f, 0x3c, 0x68, 0x4a, 0x34, 0x99, 0x70, 0x50, 0x75, 0x51, 0x3a, 0x74, 0x50, 0x38, 0x72, 0x50, 0x39, 0x67, 0x4a, 0x35, 0x77, 0x56, 0x3b, 0x6c, 0x4a, 0x30, 0x6c, 0x4a, 0x2e, 0x55, 0x38, 0x21, 0x5d, 0x3e, 0x26, 0x44, 0x2e, 0x1e, 0x3c, 0x29, 0x1f, 0x43, 0x2c, 0x1a, 0x41, 0x29, 0x15, 0x46, 0x30, 0x1f, 0x33, 0x21, 0x11, 0x2d, 0x1b, 0x13, 0x2d, 0x1d, 0x1c, 0x43, 0x31, 0x25, 0x57, 0x3c, 0x2d, 0x69, 0x4c, 0x37, 0x48, 0x32, 0x21, 0x5c, 0x3c, 0x22, 0x4f, 0x36, 0x23, 0x7b, 0x57, 0x3c, 0x61, 0x42, 0x2a, 0x70, 0x4b, 0x2e, 0x72, 0x50, 0x37, 0x65, 0x48, 0x30, 0x6c, 0x4f, 0x3d, 0x5e, 0x41, 0x2e, 0x74, 0x56, 0x42, 0x85, 0x62, 0x48, 0x70, 0x4e, 0x3b, 0x90, 0x66, 0x45, 0x93, 0x6a, 0x49, 0x8c, 0x69, 0x4b, 0x71, 0x52, 0x3a, 0x75, 0x58, 0x42, 0x74, 0x58, 0x41, 0x7e, 0x60, 0x49, 0x7a, 0x59, 0x43, 0x85, 0x65, 0x4e, 0xb0, 0x96, 0x82, 0x86, 0x72, 0x63, 0x82, 0x67, 0x58, 0x92, 0x77, 0x6b, 0x9e, 0x7f, 0x6b, 0xa8, 0x8a, 0x78, 0xdc, 0xce, 0xc4, 0xe3, 0xdb, 0xd4, 0xde, 0xd3, 0xcc, 0xe6, 0xe0, 0xd8, 0xf2, 0xef, 0xe5, 0xeb, 0xec, 0xe5, 0xf7, 0xf5, 0xf4, 0xff, 0xfe, 0xfd, 0xfc, 0xfc, 0xfa, 0xfe, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf5, 0xf6, 0xf4, 0xee, 0xe9, 0xe4, 0xde, 0xd5, 0xce, 0xcf, 0xc2, 0xb8, 0xb4, 0xa1, 0x90, 0xb1, 0x94, 0x83, 0xaa, 0x8a, 0x77, 0x99, 0x7b, 0x61, 0x83, 0x64, 0x4e, 0x72, 0x53, 0x3d, 0x6d, 0x4e, 0x37, 0x6e, 0x4e, 0x3b, 0x62, 0x46, 0x35, 0x5f, 0x44, 0x2f, 0x62, 0x47, 0x30, 0x4e, 0x35, 0x25, 0x4c, 0x33, 0x25, 0x58, 0x3c, 0x29, 0x6f, 0x4f, 0x38, 0x84, 0x5c, 0x3d, 0x7c, 0x54, 0x35, 0x75, 0x4d, 0x30, 0x6c, 0x48, 0x2f, 0x76, 0x51, 0x33, 0x6b, 0x45, 0x28, 0x70, 0x4a, 0x2c, 0x6b, 0x49, 0x2e, 0x5b, 0x3b, 0x25, 0x42, 0x2d, 0x1c, 0x45, 0x2d, 0x25, 0x52, 0x35, 0x24, 0x32, 0x1f, 0x10, 0x46, 0x2e, 0x1d, 0x3e, 0x28, 0x17, 0x1f, 0x13, 0x08, 0x28, 0x1a, 0x14, 0x3a, 0x28, 0x1b, 0x39, 0x26, 0x1e, 0x6d, 0x4c, 0x36, 0x3f, 0x28, 0x1a, 0x68, 0x48, 0x2f, 0x50, 0x37, 0x23, 0x67, 0x43, 0x28, 0x61, 0x42, 0x29, 0x7a, 0x54, 0x38, 0x6b, 0x4a, 0x30, 0x62, 0x45, 0x2d, 0x61, 0x44, 0x32, 0x68, 0x4a, 0x37, 0x68, 0x4a, 0x36, 0x75, 0x52, 0x3b, 0x7a, 0x53, 0x33, 0x97, 0x65, 0x3e, 0x91, 0x68, 0x48, 0x82, 0x5b, 0x3f, 0x74, 0x51, 0x35, 0x6c, 0x4b, 0x30, 0x72, 0x51, 0x37, 0x69, 0x49, 0x2f, 0x73, 0x53, 0x3a, 0x7c, 0x5f, 0x48, 0x75, 0x5c, 0x4a, 0x78, 0x60, 0x4e, 0x7f, 0x63, 0x53, 0x86, 0x64, 0x4c, 0xa8, 0x82, 0x66, 0xc3, 0xaf, 0xa2, 0xd6, 0xc6, 0xb9, 0xd9, 0xce, 0xc6, 0xe0, 0xd7, 0xd0, 0xe0, 0xd7, 0xd0, 0xd7, 0xc9, 0xbf, 0xe5, 0xdb, 0xd4, 0xf5, 0xf3, 0xf2, 0xfa, 0xf8, 0xf7, 0xf8, 0xf9, 0xf7, 0xfa, 0xfa, 0xf8, 0xfb, 0xfb, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfa, 0xfa, 0xfa, 0xf8, 0xf6, 0xf4, 0xfb, 0xf9, 0xf8, 0xf2, 0xf1, 0xed, 0xe3, 0xe1, 0xde, 0xc5, 0xb9, 0xb4, 0xaf, 0x94, 0x83, 0x9d, 0x72, 0x5c, 0x95, 0x6e, 0x4c, 0x85, 0x5b, 0x40, 0x72, 0x52, 0x39, 0x65, 0x44, 0x2f, 0x57, 0x39, 0x27, 0x56, 0x3a, 0x27, 0x56, 0x3a, 0x24, 0x59, 0x3d, 0x27, 0x45, 0x2c, 0x1c, 0x34, 0x23, 0x18, 0x3c, 0x25, 0x16, 0x51, 0x36, 0x24, 0x6b, 0x48, 0x2d, 0x98, 0x62, 0x3f, 0x84, 0x55, 0x31, 0x86, 0x5d, 0x3d, 0x7e, 0x52, 0x32, 0x7a, 0x53, 0x32, 0x6f, 0x4c, 0x2e, 0x72, 0x4a, 0x2d, 0x5f, 0x3e, 0x24, 0x42, 0x29, 0x16, 0x4f, 0x39, 0x26, 0x44, 0x29, 0x15, 0x45, 0x2e, 0x1c, 0x41, 0x2b, 0x1a, 0x3f, 0x25, 0x11, 0x20, 0x14, 0x0a, 0x1c, 0x13, 0x0f, 0x33, 0x22, 0x19, 0x39, 0x25, 0x17, 0x5e, 0x45, 0x33, 0x59, 0x3c, 0x25, 0x66, 0x49, 0x32, 0x5e, 0x40, 0x1f, 0x62, 0x42, 0x27, 0x6e, 0x4a, 0x2c, 0x74, 0x50, 0x30, 0x72, 0x4b, 0x2f, 0x64, 0x47, 0x30, 0x65, 0x48, 0x32, 0x70, 0x50, 0x3a, 0x67, 0x48, 0x33, 0x8e, 0x65, 0x44, 0xa0, 0x6d, 0x42, 0x95, 0x69, 0x43, 0x92, 0x6a, 0x45, 0x75, 0x55, 0x3b, 0x8b, 0x60, 0x3e, 0x6b, 0x47, 0x2b, 0x61, 0x43, 0x2b, 0x5b, 0x3f, 0x29, 0x6b, 0x49, 0x31, 0x70, 0x4b, 0x32, 0x5c, 0x3e, 0x26, 0x62, 0x4a, 0x37, 0x72, 0x52, 0x39, 0x8a, 0x6a, 0x51, 0xb0, 0x90, 0x79, 0xc2, 0xa6, 0x8d, 0xd3, 0xb9, 0xa8, 0xd7, 0xc0, 0xb4, 0xd0, 0xb9, 0xaa, 0xd1, 0xbf, 0xad, 0xdc, 0xcd, 0xc5, 0xe7, 0xe5, 0xdb, 0xe9, 0xe5, 0xde, 0xf0, 0xeb, 0xe5, 0xf1, 0xec, 0xe6, 0xf6, 0xf4, 0xf2, 0xfc, 0xfc, 0xfa, 0xfd, 0xfd, 0xfb, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfb, 0xf9, 0xf8, 0xf4, 0xf3, 0xf1, 0xe5, 0xe4, 0xe0, 0xe1, 0xe0, 0xdd, 0xda, 0xd6, 0xd1, 0xbf, 0xb4, 0xab, 0xb8, 0xa1, 0x8d, 0x9d, 0x77, 0x5e, 0x8b, 0x61, 0x47, 0x74, 0x4e, 0x31, 0x5d, 0x3d, 0x27, 0x4a, 0x2f, 0x21, 0x46, 0x2b, 0x1c, 0x47, 0x2a, 0x1a, 0x4f, 0x33, 0x21, 0x47, 0x2b, 0x17, 0x49, 0x2f, 0x1f, 0x38, 0x22, 0x13, 0x44, 0x2a, 0x18, 0x52, 0x36, 0x1f, 0x7a, 0x52, 0x38, 0x8d, 0x5e, 0x3a, 0x8a, 0x59, 0x32, 0x8c, 0x5d, 0x3b, 0x75, 0x4a, 0x26, 0x73, 0x4c, 0x2f, 0x75, 0x50, 0x32, 0x6d, 0x47, 0x28, 0x54, 0x36, 0x1f, 0x60, 0x48, 0x2c, 0x5a, 0x3c, 0x26, 0x55, 0x38, 0x25, 0x45, 0x2b, 0x17, 0x5c, 0x3d, 0x24, 0x57, 0x3a, 0x23, 0x1b, 0x10, 0x09, 0x28, 0x18, 0x0e, 0x42, 0x2e, 0x20, 0x4e, 0x36, 0x23, 0x64, 0x46, 0x2f, 0x4a, 0x2e, 0x15, 0x58, 0x38, 0x1d, 0x6d, 0x4a, 0x2c, 0x7c, 0x55, 0x33, 0x75, 0x4c, 0x2b, 0x6a, 0x47, 0x30, 0x6d, 0x4c, 0x32, 0x80, 0x5f, 0x45, 0x69, 0x4a, 0x31, 0x83, 0x5d, 0x3e, 0x9a, 0x69, 0x42, 0xa4, 0x72, 0x46, 0x8f, 0x65, 0x3f, 0x7e, 0x57, 0x36, 0x9e, 0x6c, 0x45, 0x71, 0x4c, 0x2f, 0x6d, 0x49, 0x2d, 0x72, 0x4f, 0x34, 0x64, 0x42, 0x28, 0x65, 0x43, 0x2b, 0x50, 0x31, 0x1e, 0x5c, 0x3c, 0x23, 0x7e, 0x56, 0x36, 0x96, 0x69, 0x46, 0xa2, 0x76, 0x52, 0xb4, 0x84, 0x60, 0xca, 0xa0, 0x7a, 0xd6, 0xba, 0x9c, 0xce, 0xa3, 0x88, 0xc7, 0xa7, 0x8a, 0xd4, 0xbc, 0xac, 0xe1, 0xd4, 0xc9, 0xdd, 0xd2, 0xc5, 0xe3, 0xd9, 0xcf, 0xdd, 0xd3, 0xc8, 0xe8, 0xe3, 0xdd, 0xf7, 0xf6, 0xf2, 0xfd, 0xfd, 0xfb, 0xfe, 0xfe, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfc, 0xfd, 0xfb, 0xfd, 0xfd, 0xfb, 0xfd, 0xfd, 0xfc, 0xfa, 0xfa, 0xf8, 0xfd, 0xf8, 0xf8, 0xf5, 0xf1, 0xf1, 0xed, 0xec, 0xeb, 0xe7, 0xe2, 0xde, 0xe2, 0xdd, 0xda, 0xdb, 0xd8, 0xd2, 0xd8, 0xd2, 0xcc, 0xdd, 0xd7, 0xd0, 0xdf, 0xd4, 0xcb, 0xb0, 0x9b, 0x8e, 0x90, 0x6e, 0x59, 0x8f, 0x5e, 0x39, 0x79, 0x50, 0x31, 0x64, 0x40, 0x25, 0x49, 0x2f, 0x1a, 0x3d, 0x25, 0x17, 0x42, 0x2b, 0x1d, 0x4a, 0x34, 0x26, 0x4f, 0x39, 0x29, 0x51, 0x36, 0x21, 0x53, 0x32, 0x19, 0x55, 0x38, 0x21, 0x54, 0x36, 0x1e, 0x7e, 0x54, 0x33, 0x99, 0x65, 0x3c, 0x94, 0x64, 0x3a, 0x8f, 0x5f, 0x37, 0x80, 0x54, 0x32, 0x73, 0x4d, 0x2d, 0x6e, 0x48, 0x2a, 0x67, 0x43, 0x27, 0x5c, 0x3c, 0x23, 0x57, 0x3a, 0x22, 0x60, 0x3f, 0x28, 0x57, 0x36, 0x23, 0x61, 0x41, 0x26, 0x7f, 0x52, 0x32, 0x42, 0x2b, 0x18, 0x22, 0x13, 0x0a, 0x33, 0x1d, 0x11, 0x64, 0x44, 0x2b, 0x79, 0x58, 0x3a, 0x62, 0x45, 0x2b, 0x57, 0x39, 0x20, 0x7e, 0x55, 0x34, 0x7a, 0x4f, 0x2e, 0x85, 0x59, 0x37, 0x75, 0x50, 0x36, 0x7a, 0x59, 0x39, 0x78, 0x56, 0x3d, 0x72, 0x54, 0x39, 0x8f, 0x62, 0x3c, 0xb0, 0x77, 0x4b, 0xbb, 0x86, 0x5b, 0xa3, 0x71, 0x4a, 0x9b, 0x69, 0x42, 0x92, 0x65, 0x41, 0x81, 0x58, 0x38, 0x7e, 0x58, 0x38, 0x66, 0x43, 0x27, 0x6c, 0x49, 0x2e, 0x66, 0x41, 0x25, 0x73, 0x4d, 0x2e, 0x7f, 0x54, 0x31, 0x97, 0x67, 0x45, 0x9b, 0x69, 0x3d, 0xa3, 0x70, 0x4b, 0xb8, 0x84, 0x5e, 0xc8, 0x93, 0x6b, 0xc8, 0x90, 0x62, 0xd0, 0x9d, 0x75, 0xd2, 0xb5, 0xa0, 0xd4, 0xbd, 0xb0, 0xd4, 0xbb, 0xa6, 0xdc, 0xcd, 0xc1, 0xe6, 0xe1, 0xdc, 0xf0, 0xee, 0xe5, 0xf8, 0xf5, 0xf1, 0xf1, 0xf0, 0xed, 0xf2, 0xf2, 0xf0, 0xfa, 0xfa, 0xf8, 0xfe, 0xfe, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfa, 0xf9, 0xfa, 0xf8, 0xf4, 0xf4, 0xf2, 0xf2, 0xf2, 0xf0, 0xe9, 0xe3, 0xe1, 0xe8, 0xe3, 0xe1, 0xe2, 0xde, 0xda, 0xdc, 0xd3, 0xcc, 0xd7, 0xc4, 0xbf, 0xce, 0xb8, 0xab, 0xcd, 0xba, 0xad, 0xcb, 0xb9, 0xac, 0xd2, 0xbb, 0xac, 0xb6, 0x9f, 0x90, 0xae, 0x95, 0x85, 0x95, 0x69, 0x4a, 0x93, 0x60, 0x3c, 0x7b, 0x4e, 0x2c, 0x6e, 0x48, 0x2b, 0x4f, 0x2d, 0x19, 0x4f, 0x31, 0x21, 0x55, 0x39, 0x26, 0x57, 0x3b, 0x27, 0x5a, 0x3d, 0x26, 0x5c, 0x3b, 0x20, 0x61, 0x40, 0x26, 0x59, 0x38, 0x1e, 0x57, 0x37, 0x1e, 0x67, 0x43, 0x26, 0x88, 0x59, 0x2f, 0xa1, 0x69, 0x3f, 0x9b, 0x68, 0x3f, 0x85, 0x57, 0x33, 0x79, 0x4f, 0x2e, 0x77, 0x50, 0x31, 0x71, 0x4d, 0x30, 0x60, 0x41, 0x28, 0x57, 0x36, 0x19, 0x59, 0x37, 0x21, 0x65, 0x43, 0x28, 0x78, 0x4c, 0x2b, 0x67, 0x46, 0x29, 0x3d, 0x28, 0x17, 0x46, 0x2d, 0x1d, 0x6c, 0x4a, 0x30, 0x89, 0x5f, 0x3a, 0x70, 0x50, 0x34, 0x67, 0x47, 0x2b, 0x82, 0x55, 0x32, 0x91, 0x64, 0x40, 0x82, 0x58, 0x34, 0x93, 0x6a, 0x46, 0x7e, 0x57, 0x35, 0x83, 0x5c, 0x3a, 0x97, 0x6c, 0x47, 0xa5, 0x72, 0x46, 0xc0, 0x86, 0x56, 0xb3, 0x7e, 0x51, 0xb8, 0x84, 0x56, 0xa4, 0x71, 0x48, 0x85, 0x57, 0x32, 0x92, 0x64, 0x40, 0x80, 0x56, 0x31, 0x7b, 0x52, 0x31, 0x74, 0x4b, 0x2c, 0x83, 0x57, 0x34, 0x8c, 0x5e, 0x37, 0xa1, 0x6f, 0x47, 0x9f, 0x68, 0x41, 0xa8, 0x71, 0x44, 0xad, 0x76, 0x4b, 0xb8, 0x7e, 0x4d, 0xc3, 0x85, 0x51, 0xcb, 0x90, 0x62, 0xd7, 0xab, 0x89, 0xcd, 0xa3, 0x7d, 0xca, 0x9e, 0x77, 0xd1, 0xb7, 0xa3, 0xdc, 0xcb, 0xbd, 0xe3, 0xd3, 0xc9, 0xe5, 0xde, 0xd6, 0xea, 0xe9, 0xe5, 0xf5, 0xf3, 0xf0, 0xf3, 0xf3, 0xf1, 0xfb, 0xfc, 0xfa, 0xfe, 0xfe, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfb, 0xfc, 0xfa, 0xf7, 0xf7, 0xf5, 0xee, 0xee, 0xec, 0xef, 0xea, 0xe4, 0xe7, 0xe1, 0xdb, 0xe1, 0xd8, 0xd0, 0xd8, 0xc9, 0xbd, 0xce, 0xba, 0xac, 0xbc, 0xa0, 0x86, 0xc4, 0x98, 0x74, 0xc8, 0x9b, 0x78, 0xc4, 0x94, 0x71, 0xaa, 0x80, 0x62, 0xa5, 0x75, 0x53, 0x98, 0x6c, 0x4d, 0x9b, 0x61, 0x39, 0x96, 0x5c, 0x36, 0x88, 0x54, 0x2e, 0x79, 0x4e, 0x30, 0x61, 0x3c, 0x26, 0x62, 0x3f, 0x27, 0x65, 0x43, 0x2b, 0x64, 0x44, 0x2a, 0x72, 0x4c, 0x2f, 0x6a, 0x46, 0x2a, 0x77, 0x53, 0x36, 0x57, 0x36, 0x1c, 0x52, 0x33, 0x1a, 0x5e, 0x39, 0x1e, 0x87, 0x55, 0x33, 0xab, 0x71, 0x44, 0x9b, 0x66, 0x3d, 0x97, 0x67, 0x41, 0x7b, 0x53, 0x34, 0x63, 0x3c, 0x1d, 0x6c, 0x49, 0x2d, 0x69, 0x46, 0x26, 0x6a, 0x48, 0x2c, 0x69, 0x44, 0x29, 0x6d, 0x47, 0x24, 0x7a, 0x50, 0x2d, 0x5a, 0x3d, 0x23, 0x50, 0x33, 0x1f, 0x6a, 0x49, 0x2e, 0x9d, 0x6d, 0x43, 0x78, 0x54, 0x34, 0x6c, 0x49, 0x28, 0x9c, 0x6b, 0x43, 0x91, 0x61, 0x3a, 0x90, 0x68, 0x43, 0x9f, 0x72, 0x47, 0x9d, 0x6f, 0x4b, 0xad, 0x7f, 0x54, 0xc4, 0x8b, 0x5c, 0xc0, 0x86, 0x55, 0xc8, 0x8f, 0x5b, 0xc1, 0x8c, 0x5a, 0xbd, 0x84, 0x51, 0xa2, 0x72, 0x46, 0x91, 0x61, 0x3a, 0xa1, 0x6f, 0x48, 0x91, 0x61, 0x38, 0x8d, 0x5c, 0x37, 0x99, 0x69, 0x45, 0x94, 0x61, 0x3a, 0xa5, 0x70, 0x45, 0xad, 0x74, 0x47, 0xac, 0x6f, 0x42, 0xa9, 0x6d, 0x43, 0xb2, 0x78, 0x46, 0xb7, 0x77, 0x47, 0xca, 0x86, 0x53, 0xc9, 0x8c, 0x5f, 0xd7, 0x99, 0x66, 0xd3, 0x98, 0x6a, 0xd3, 0xa7, 0x86, 0xde, 0xb8, 0x9a, 0xd5, 0xb2, 0x97, 0xd7, 0xbd, 0xaf, 0xde, 0xd3, 0xcd, 0xf5, 0xf3, 0xef, 0xf6, 0xf5, 0xf2, 0xfb, 0xfb, 0xf9, 0xfd, 0xfe, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xf9, 0xf5, 0xf3, 0xf2, 0xf3, 0xf1, 0xf0, 0xee, 0xe7, 0xe1, 0xe9, 0xda, 0xcd, 0xcd, 0xb5, 0xa2, 0xce, 0xac, 0x91, 0xca, 0xa2, 0x80, 0xc7, 0x9c, 0x77, 0xc7, 0x91, 0x61, 0xc9, 0x8c, 0x5f, 0xc9, 0x8c, 0x5c, 0xc5, 0x87, 0x5b, 0xb0, 0x79, 0x4d, 0xac, 0x74, 0x45, 0xa3, 0x66, 0x3b, 0xa7, 0x6a, 0x41, 0x9d, 0x63, 0x3a, 0x91, 0x5d, 0x36, 0x82, 0x52, 0x2f, 0x6f, 0x45, 0x26, 0x62, 0x3c, 0x22, 0x65, 0x44, 0x2f, 0x60, 0x41, 0x27, 0x70, 0x4b, 0x30, 0x7c, 0x54, 0x34, 0x7d, 0x54, 0x37, 0x65, 0x41, 0x22, 0x73, 0x4a, 0x2d, 0x77, 0x4a, 0x29, 0x89, 0x58, 0x35, 0xa3, 0x6a, 0x40, 0xa8, 0x73, 0x49, 0x9d, 0x6b, 0x43, 0x86, 0x5c, 0x3b, 0x68, 0x42, 0x23, 0x71, 0x49, 0x27, 0x73, 0x4d, 0x2e, 0x6e, 0x4a, 0x29, 0x73, 0x4f, 0x2d, 0x7a, 0x52, 0x2c, 0x7e, 0x5b, 0x3a, 0x54, 0x37, 0x1c, 0x80, 0x58, 0x35, 0xa5, 0x71, 0x48, 0x86, 0x5d, 0x3f, 0x97, 0x6e, 0x48, 0xaf, 0x7a, 0x4e, 0x99, 0x6a, 0x40, 0xad, 0x7a, 0x51, 0xb1, 0x7f, 0x51, 0xad, 0x7b, 0x51, 0xb9, 0x84, 0x57, 0xc9, 0x8f, 0x5d, 0xc7, 0x8d, 0x5b, 0xd1, 0x95, 0x63, 0xc3, 0x87, 0x55, 0xc1, 0x89, 0x5b, 0xb4, 0x7f, 0x53, 0xa4, 0x6f, 0x47, 0xac, 0x77, 0x50, 0xa3, 0x70, 0x47, 0xa1, 0x6e, 0x46, 0xab, 0x77, 0x50, 0xab, 0x72, 0x4b, 0xa4, 0x6a, 0x3f, 0xa9, 0x6c, 0x3d, 0xb7, 0x77, 0x45, 0xae, 0x6e, 0x3e, 0xb9, 0x79, 0x49, 0xbc, 0x7f, 0x4e, 0xc5, 0x87, 0x57, 0xc6, 0x89, 0x56, 0xcf, 0x91, 0x5e, 0xc7, 0x89, 0x55, 0xd3, 0x99, 0x68, 0xcb, 0x91, 0x66, 0xc4, 0x96, 0x6f, 0xd1, 0xb8, 0xa6, 0xe9, 0xe1, 0xd8, 0xf4, 0xef, 0xeb, 0xf5, 0xf3, 0xf2, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xf4, 0xf3, 0xf1, 0xe8, 0xe6, 0xe5, 0xce, 0xbe, 0xb2, 0xc5, 0xa5, 0x8b, 0xc4, 0x9e, 0x80, 0xca, 0x96, 0x6e, 0xcf, 0x96, 0x66, 0xd8, 0x99, 0x66, 0xcd, 0x92, 0x61, 0xd1, 0x91, 0x62, 0xc8, 0x8c, 0x55, 0xcc, 0x8f, 0x5d, 0xb9, 0x7a, 0x49, 0xb0, 0x74, 0x45, 0xa7, 0x6c, 0x3e, 0xa4, 0x67, 0x39, 0xa6, 0x68, 0x39, 0xa2, 0x66, 0x39, 0x9c, 0x63, 0x39, 0x99, 0x63, 0x3b, 0x88, 0x58, 0x34, 0x66, 0x3d, 0x21, 0x5b, 0x3b, 0x22, 0x77, 0x4d, 0x33, 0x7f, 0x51, 0x33, 0x92, 0x61, 0x3d, 0x85, 0x5a, 0x34, 0x7d, 0x50, 0x2f, 0x8a, 0x59, 0x35, 0x81, 0x52, 0x30, 0x8a, 0x57, 0x31, 0x9f, 0x6b, 0x41, 0xae, 0x74, 0x47, 0x9e, 0x6c, 0x45, 0x8d, 0x60, 0x3c, 0x71, 0x4a, 0x29, 0x7c, 0x51, 0x2e, 0x7a, 0x50, 0x2c, 0x7f, 0x55, 0x32, 0x7d, 0x53, 0x2f, 0x7f, 0x57, 0x35, 0x71, 0x4c, 0x2e, 0x89, 0x5c, 0x3b, 0x9c, 0x65, 0x3e, 0x92, 0x67, 0x47, 0xab, 0x76, 0x4a, 0xb4, 0x7c, 0x4b, 0xab, 0x76, 0x4a, 0xbb, 0x84, 0x54, 0xba, 0x83, 0x58, 0xb8, 0x82, 0x56, 0xc4, 0x8b, 0x5a, 0xcf, 0x92, 0x61, 0xcc, 0x8f, 0x5d, 0xd0, 0x94, 0x62, 0xcd, 0x91, 0x5f, 0xcf, 0x92, 0x60, 0xb8, 0x80, 0x52, 0xb8, 0x7e, 0x4f, 0xc2, 0x87, 0x58, 0xb3, 0x7b, 0x4e, 0xb0, 0x78, 0x4d, 0xaf, 0x77, 0x4b, 0xb1, 0x75, 0x45, 0xba, 0x7c, 0x4b, 0xb4, 0x74, 0x42, 0xbf, 0x7b, 0x46, 0xbb, 0x77, 0x43, 0xc0, 0x7b, 0x47, 0xc5, 0x82, 0x4e, 0xc3, 0x80, 0x4c, 0xcf, 0x8d, 0x56, 0xd1, 0x8f, 0x58, 0xd4, 0x91, 0x5a, 0xd5, 0x92, 0x5b, 0xbe, 0x81, 0x52, 0xc0, 0x8c, 0x62, 0xc8, 0xa4, 0x89, 0xcc, 0xb8, 0xa6, 0xdf, 0xd5, 0xcd, 0xf0, 0xea, 0xe6, 0xf9, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf8, 0xef, 0xef, 0xed, 0xde, 0xd9, 0xd3, 0xcc, 0xc2, 0xbb, 0xcb, 0xac, 0x92, 0xbd, 0x8c, 0x6a, 0xb9, 0x86, 0x59, 0xbf, 0x83, 0x57, 0xbc, 0x82, 0x51, 0xce, 0x8d, 0x5d, 0xd6, 0x91, 0x5d, 0xd1, 0x8d, 0x54, 0xcd, 0x88, 0x56, 0xcb, 0x8a, 0x57, 0xc2, 0x81, 0x4e, 0xb3, 0x73, 0x44, 0xb2, 0x6f, 0x40, 0xb4, 0x71, 0x41, 0xb0, 0x70, 0x3f, 0xa8, 0x69, 0x39, 0xa9, 0x6c, 0x3c, 0xb0, 0x74, 0x43, 0xa0, 0x68, 0x3d, 0x8a, 0x5c, 0x38, 0x75, 0x48, 0x27, 0x84, 0x57, 0x35, 0x82, 0x58, 0x36, 0x7e, 0x52, 0x30, 0x7e, 0x4f, 0x2e, 0x84, 0x56, 0x34, 0x90, 0x5e, 0x3c, 0x92, 0x60, 0x38, 0x98, 0x61, 0x37, 0xb3, 0x76, 0x4b, 0xb0, 0x75, 0x48, 0xad, 0x78, 0x4d, 0x99, 0x66, 0x3f, 0x8a, 0x5d, 0x33, 0x91, 0x5f, 0x3b, 0x86, 0x58, 0x34, 0x94, 0x65, 0x3f, 0x7a, 0x4e, 0x2e, 0x80, 0x58, 0x3b, 0x93, 0x61, 0x39, 0xa5, 0x6d, 0x41, 0x9a, 0x68, 0x40, 0xb2, 0x7d, 0x52, 0xb8, 0x7c, 0x4e, 0xc3, 0x87, 0x55, 0xc8, 0x8c, 0x5b, 0xc3, 0x87, 0x55, 0xc7, 0x92, 0x5e, 0xc0, 0x84, 0x52, 0xcb, 0x88, 0x53, 0xcc, 0x8d, 0x5c, 0xcb, 0x8d, 0x5c, 0xd2, 0x94, 0x63, 0xc7, 0x87, 0x5a, 0xc2, 0x88, 0x58, 0xc3, 0x89, 0x57, 0xb9, 0x7e, 0x52, 0xbc, 0x80, 0x53, 0xb4, 0x77, 0x4c, 0xbd, 0x81, 0x4c, 0xb6, 0x75, 0x43, 0xb8, 0x74, 0x42, 0xbd, 0x7a, 0x45, 0xb7, 0x73, 0x3f, 0xb9, 0x74, 0x41, 0xbd, 0x77, 0x44, 0xc8, 0x7f, 0x4a, 0xd2, 0x89, 0x54, 0xcd, 0x89, 0x4f, 0xce, 0x89, 0x50, 0xcc, 0x88, 0x53, 0xc3, 0x82, 0x52, 0xab, 0x75, 0x4a, 0xb5, 0x82, 0x5b, 0xb5, 0x8b, 0x6c, 0xc5, 0xac, 0x9b, 0xc1, 0xb3, 0xa8, 0xe6, 0xe6, 0xe0, 0xf4, 0xf4, 0xf2, 0xf7, 0xf7, 0xf5, 0xfd, 0xfe, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xec, 0xea, 0xe9, 0xe9, 0xe5, 0xdf, 0xd5, 0xc3, 0xb5, 0xc2, 0xa2, 0x89, 0xa3, 0x7b, 0x5a, 0x9d, 0x6f, 0x4e, 0x8d, 0x61, 0x3d, 0x9c, 0x69, 0x42, 0xa8, 0x72, 0x4a, 0xa4, 0x69, 0x3e, 0xab, 0x6f, 0x3d, 0xba, 0x76, 0x45, 0xc4, 0x82, 0x4f, 0xbd, 0x7b, 0x47, 0xc7, 0x81, 0x4e, 0xab, 0x69, 0x3a, 0xa5, 0x65, 0x37, 0xa8, 0x68, 0x38, 0xb0, 0x6f, 0x40, 0xab, 0x69, 0x3b, 0xb8, 0x75, 0x46, 0xc3, 0x82, 0x4e, 0xc0, 0x81, 0x4e, 0xb3, 0x78, 0x4d, 0x98, 0x64, 0x3d, 0xac, 0x76, 0x4b, 0x9d, 0x6e, 0x49, 0x9d, 0x6b, 0x42, 0x92, 0x61, 0x37, 0x8c, 0x5b, 0x33, 0x86, 0x54, 0x2f, 0x93, 0x5f, 0x38, 0x94, 0x5c, 0x33, 0xc3, 0x85, 0x54, 0xb7, 0x7e, 0x51, 0xa5, 0x6a, 0x42, 0x9a, 0x67, 0x3c, 0x9a, 0x62, 0x3c, 0x8b, 0x5a, 0x32, 0x95, 0x65, 0x3f, 0x84, 0x55, 0x31, 0x88, 0x58, 0x34, 0x9a, 0x68, 0x40, 0x9b, 0x67, 0x3d, 0xa3, 0x6e, 0x44, 0xac, 0x73, 0x46, 0xb6, 0x7a, 0x4c, 0xbf, 0x84, 0x51, 0xc7, 0x8b, 0x59, 0xbd, 0x81, 0x4f, 0xcb, 0x90, 0x5e, 0xcc, 0x8d, 0x5d, 0xcb, 0x88, 0x53, 0xcc, 0x8d, 0x5b, 0xc5, 0x87, 0x56, 0xbf, 0x81, 0x50, 0xd2, 0x92, 0x5f, 0xd2, 0x97, 0x6b, 0xb2, 0x78, 0x4c, 0xc2, 0x87, 0x59, 0xbf, 0x83, 0x58, 0xc2, 0x86, 0x55, 0xb7, 0x7a, 0x48, 0xb3, 0x72, 0x40, 0xb0, 0x6c, 0x3b, 0xb1, 0x6d, 0x3c, 0xb6, 0x71, 0x40, 0xbb, 0x76, 0x43, 0xc3, 0x7d, 0x4a, 0xbb, 0x77, 0x44, 0xc1, 0x7d, 0x4a, 0xb5, 0x73, 0x42, 0xbb, 0x79, 0x48, 0xb6, 0x77, 0x4a, 0xae, 0x74, 0x4a, 0xa8, 0x70, 0x44, 0xa9, 0x77, 0x4e, 0xaf, 0x7a, 0x53, 0x9f, 0x75, 0x56, 0xba, 0xa6, 0x9d, 0xe8, 0xe4, 0xdf, 0xee, 0xed, 0xeb, 0xf3, 0xf3, 0xf1, 0xfb, 0xfb, 0xfa, 0xfd, 0xfd, 0xfd, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xfe, 0xfd, 0xfd, 0xfb, 0xfa, 0xfa, 0xf8, 0xe7, 0xe5, 0xe2, 0xd2, 0xc8, 0xc2, 0xc0, 0xb0, 0xa5, 0xac, 0x94, 0x83, 0x8c, 0x68, 0x51, 0x76, 0x54, 0x38, 0x82, 0x5a, 0x39, 0x86, 0x5d, 0x3c, 0x67, 0x42, 0x26, 0x69, 0x43, 0x26, 0x80, 0x53, 0x31, 0x8d, 0x5b, 0x37, 0xb5, 0x77, 0x48, 0xbb, 0x7d, 0x4e, 0xaf, 0x73, 0x44, 0xa0, 0x63, 0x38, 0xaa, 0x6b, 0x3d, 0xb2, 0x6f, 0x3b, 0xc6, 0x83, 0x4d, 0xc4, 0x83, 0x4d, 0xc0, 0x7e, 0x48, 0xbe, 0x7c, 0x46, 0xbb, 0x7d, 0x4b, 0xc3, 0x81, 0x50, 0xb5, 0x79, 0x4d, 0xbe, 0x84, 0x58, 0xb2, 0x80, 0x55, 0xb4, 0x7e, 0x54, 0xb8, 0x82, 0x58, 0xba, 0x85, 0x56, 0xb4, 0x80, 0x57, 0x88, 0x56, 0x2d, 0x8c, 0x5b, 0x36, 0xae, 0x73, 0x45, 0xb8, 0x7a, 0x49, 0xb0, 0x73, 0x45, 0xab, 0x70, 0x41, 0xa9, 0x71, 0x43, 0x9b, 0x66, 0x38, 0x9d, 0x6c, 0x43, 0x8d, 0x5d, 0x39, 0x9a, 0x66, 0x3e, 0x93, 0x5d, 0x32, 0xa4, 0x6f, 0x44, 0xa3, 0x68, 0x3e, 0x9e, 0x62, 0x37, 0xad, 0x71, 0x45, 0xc3, 0x7f, 0x4a, 0xbf, 0x81, 0x52, 0xc3, 0x86, 0x52, 0xcb, 0x8c, 0x57, 0xcf, 0x90, 0x5b, 0xc3, 0x84, 0x52, 0xcc, 0x8e, 0x5c, 0xce, 0x90, 0x5f, 0xd0, 0x92, 0x61, 0xc7, 0x87, 0x54, 0xb5, 0x7b, 0x4d, 0xbe, 0x86, 0x5b, 0xc0, 0x88, 0x5b, 0xc4, 0x87, 0x59, 0xc1, 0x84, 0x52, 0xb5, 0x76, 0x46, 0xba, 0x7a, 0x49, 0xb1, 0x70, 0x3f, 0xb3, 0x72, 0x40, 0xb8, 0x76, 0x45, 0xbb, 0x76, 0x43, 0xc0, 0x7a, 0x48, 0xbf, 0x7b, 0x48, 0xc4, 0x80, 0x4d, 0xbc, 0x7a, 0x47, 0xb0, 0x72, 0x42, 0x99, 0x64, 0x3b, 0x8c, 0x60, 0x3e, 0x8a, 0x5f, 0x3f, 0x80, 0x5c, 0x3b, 0x83, 0x59, 0x3f, 0x7e, 0x59, 0x42, 0x86, 0x69, 0x59, 0xbc, 0xaf, 0xa8, 0xe2, 0xe0, 0xde, 0xf7, 0xf3, 0xf0, 0xfb, 0xf9, 0xf8, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xf7, 0xf7, 0xf5, 0xe5, 0xe5, 0xe3, 0xd5, 0xcf, 0xc9, 0xb9, 0xaa, 0xa3, 0x98, 0x85, 0x7a, 0x84, 0x66, 0x51, 0x95, 0x6a, 0x4a, 0xaf, 0x79, 0x51, 0xa6, 0x72, 0x4c, 0x9f, 0x70, 0x4d, 0x91, 0x62, 0x3f, 0x8b, 0x5c, 0x39, 0x7a, 0x4c, 0x2b, 0x8d, 0x5b, 0x36, 0x99, 0x64, 0x3d, 0xae, 0x70, 0x41, 0xc1, 0x7d, 0x4a, 0xc0, 0x7c, 0x4a, 0xb5, 0x73, 0x43, 0xb5, 0x73, 0x40, 0xbf, 0x7a, 0x46, 0xbf, 0x78, 0x47, 0xbf, 0x79, 0x46, 0xc6, 0x7e, 0x48, 0xc7, 0x80, 0x49, 0xbd, 0x7b, 0x49, 0xb8, 0x7a, 0x4d, 0xba, 0x7f, 0x53, 0xc0, 0x89, 0x5c, 0xb9, 0x82, 0x59, 0xb7, 0x80, 0x56, 0xc9, 0x8c, 0x5a, 0xd2, 0x91, 0x60, 0xce, 0x91, 0x5e, 0x97, 0x65, 0x3f, 0xa5, 0x6d, 0x42, 0xb8, 0x7d, 0x4e, 0xaa, 0x6e, 0x3e, 0xb4, 0x78, 0x48, 0x9f, 0x67, 0x3a, 0x9d, 0x66, 0x3a, 0xaa, 0x72, 0x45, 0x9a, 0x64, 0x3a, 0x9c, 0x67, 0x3d, 0xa1, 0x6a, 0x3f, 0xa7, 0x71, 0x45, 0xa7, 0x6b, 0x41, 0xa0, 0x65, 0x3b, 0xaf, 0x73, 0x49, 0xb8, 0x78, 0x49, 0xb1, 0x73, 0x44, 0xbf, 0x82, 0x4d, 0xc8, 0x88, 0x55, 0xc3, 0x84, 0x50, 0xc4, 0x86, 0x55, 0xc6, 0x88, 0x57, 0xc8, 0x8a, 0x59, 0xd3, 0x95, 0x64, 0xcf, 0x8f, 0x5d, 0xc0, 0x85, 0x57, 0xbf, 0x87, 0x5a, 0xc3, 0x8a, 0x5e, 0xc1, 0x85, 0x55, 0xba, 0x7c, 0x4b, 0xb5, 0x76, 0x45, 0xb1, 0x71, 0x41, 0xb2, 0x71, 0x40, 0xb6, 0x75, 0x41, 0xb8, 0x76, 0x43, 0xba, 0x75, 0x42, 0xc1, 0x7b, 0x49, 0xc0, 0x7a, 0x48, 0xbb, 0x75, 0x42, 0xbd, 0x7b, 0x47, 0xb7, 0x79, 0x49, 0xb4, 0x7b, 0x4d, 0x9d, 0x69, 0x40, 0xaa, 0x76, 0x4d, 0xb5, 0x7a, 0x53, 0xb9, 0x82, 0x55, 0xbc, 0x88, 0x5f, 0xae, 0x79, 0x55, 0x9e, 0x72, 0x54, 0xae, 0x97, 0x86, 0xe6, 0xdf, 0xdb, 0xf8, 0xf9, 0xf9, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfa, 0xfa, 0xfa, 0xf4, 0xf4, 0xf2, 0xdb, 0xdb, 0xd9, 0xb8, 0xb0, 0xa7, 0xa2, 0x8e, 0x82, 0x93, 0x72, 0x5a, 0xa2, 0x70, 0x4c, 0xaa, 0x76, 0x4b, 0x94, 0x5e, 0x3c, 0x89, 0x56, 0x35, 0x7a, 0x4d, 0x2f, 0x7c, 0x4b, 0x2a, 0x84, 0x52, 0x31, 0x8c, 0x5a, 0x36, 0x85, 0x50, 0x28, 0x9e, 0x66, 0x3d, 0x96, 0x5e, 0x35, 0x9a, 0x5d, 0x35, 0xab, 0x6e, 0x3f, 0xb0, 0x70, 0x42, 0xaf, 0x6c, 0x3e, 0xb4, 0x72, 0x41, 0xa4, 0x66, 0x35, 0xa5, 0x68, 0x37, 0xb0, 0x6f, 0x42, 0xc2, 0x7c, 0x4b, 0xba, 0x78, 0x47, 0xaa, 0x6a, 0x3d, 0xc0, 0x81, 0x52, 0xc6, 0x8a, 0x5a, 0xa7, 0x71, 0x48, 0xb2, 0x7a, 0x51, 0xa8, 0x70, 0x47, 0xc7, 0x86, 0x57, 0xc4, 0x89, 0x57, 0xc6, 0x85, 0x54, 0xa9, 0x75, 0x4c, 0xbf, 0x87, 0x5c, 0xbd, 0x81, 0x51, 0xad, 0x71, 0x42, 0x9f, 0x66, 0x3c, 0x95, 0x5d, 0x34, 0x90, 0x57, 0x2c, 0x8e, 0x5c, 0x35, 0x7a, 0x4d, 0x29, 0x9b, 0x65, 0x3b, 0x9f, 0x69, 0x3d, 0x9b, 0x60, 0x36, 0xa1, 0x67, 0x3d, 0xa7, 0x6d, 0x43, 0xa3, 0x6b, 0x41, 0xb8, 0x7a, 0x4c, 0xc0, 0x83, 0x4f, 0xc3, 0x83, 0x53, 0xbf, 0x7e, 0x4e, 0xbe, 0x80, 0x50, 0xc9, 0x8b, 0x5a, 0xc5, 0x87, 0x56, 0xcf, 0x90, 0x60, 0xc4, 0x84, 0x52, 0xc0, 0x85, 0x57, 0xc4, 0x88, 0x58, 0xc2, 0x86, 0x56, 0xbe, 0x80, 0x4f, 0xbb, 0x7d, 0x4b, 0xba, 0x7a, 0x4a, 0xbb, 0x7a, 0x4a, 0xb9, 0x77, 0x45, 0xbb, 0x76, 0x40, 0xbd, 0x78, 0x42, 0xbd, 0x76, 0x44, 0xc2, 0x7c, 0x49, 0xc7, 0x82, 0x4f, 0xc0, 0x7c, 0x49, 0xb3, 0x72, 0x3f, 0xbd, 0x7f, 0x4f, 0xb7, 0x7a, 0x4b, 0xb5, 0x77, 0x47, 0xb2, 0x71, 0x45, 0xa8, 0x6b, 0x3e, 0xb1, 0x75, 0x4a, 0xae, 0x75, 0x4e, 0x9e, 0x67, 0x42, 0x9e, 0x69, 0x45, 0xad, 0x79, 0x51, 0xbc, 0xa2, 0x8e, 0xf3, 0xf1, 0xf0, 0xfc, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfb, 0xfb, 0xeb, 0xe9, 0xe8, 0xd3, 0xd1, 0xcf, 0xaf, 0xa3, 0x9b, 0x9e, 0x76, 0x5b, 0x9d, 0x6d, 0x49, 0xa3, 0x6e, 0x49, 0x8f, 0x5d, 0x3a, 0x83, 0x50, 0x31, 0x7d, 0x4e, 0x2c, 0x79, 0x4a, 0x28, 0x89, 0x56, 0x31, 0x9e, 0x68, 0x40, 0x8e, 0x5a, 0x36, 0x8c, 0x58, 0x34, 0x8a, 0x57, 0x36, 0x89, 0x56, 0x36, 0x77, 0x49, 0x24, 0x9e, 0x68, 0x3b, 0xb3, 0x76, 0x46, 0xb7, 0x78, 0x46, 0xb8, 0x76, 0x44, 0xba, 0x77, 0x47, 0xa8, 0x66, 0x36, 0xa8, 0x6a, 0x3b, 0xb6, 0x77, 0x48, 0xb6, 0x75, 0x45, 0xad, 0x6d, 0x3d, 0xb7, 0x7b, 0x4c, 0xcb, 0x8a, 0x5b, 0xa8, 0x72, 0x4b, 0xb8, 0x7e, 0x53, 0xaa, 0x71, 0x46, 0xaf, 0x71, 0x43, 0xca, 0x8a, 0x59, 0xd3, 0x93, 0x62, 0xb3, 0x7c, 0x51, 0xb6, 0x7f, 0x53, 0xbd, 0x82, 0x51, 0x91, 0x57, 0x2e, 0x9a, 0x62, 0x3a, 0x99, 0x62, 0x39, 0xa1, 0x67, 0x3e, 0x9d, 0x64, 0x3a, 0x71, 0x46, 0x24, 0x8b, 0x5a, 0x35, 0x98, 0x64, 0x38, 0x98, 0x61, 0x38, 0xa0, 0x68, 0x3f, 0xa0, 0x6b, 0x43, 0xb6, 0x7c, 0x4d, 0xb6, 0x7a, 0x4a, 0xb3, 0x77, 0x47, 0xc1, 0x83, 0x54, 0xbb, 0x7d, 0x4e, 0xc5, 0x87, 0x58, 0xcc, 0x8e, 0x5f, 0xbd, 0x7d, 0x4d, 0xc3, 0x83, 0x53, 0xc6, 0x88, 0x59, 0xcf, 0x90, 0x61, 0xc3, 0x85, 0x56, 0xc0, 0x81, 0x52, 0xb4, 0x75, 0x45, 0xb4, 0x74, 0x43, 0xb1, 0x6f, 0x3f, 0xb3, 0x6e, 0x40, 0xae, 0x69, 0x3a, 0xae, 0x6a, 0x39, 0xb5, 0x70, 0x3e, 0xc5, 0x7d, 0x47, 0xb7, 0x6f, 0x39, 0xb5, 0x74, 0x41, 0xaf, 0x72, 0x42, 0xa3, 0x65, 0x37, 0xa5, 0x67, 0x38, 0xb2, 0x74, 0x45, 0xb0, 0x72, 0x43, 0xb3, 0x6e, 0x3e, 0xb5, 0x75, 0x41, 0x9b, 0x64, 0x3d, 0x95, 0x5d, 0x36, 0x9c, 0x64, 0x3d, 0xa0, 0x68, 0x41, 0xa4, 0x6e, 0x4b, 0xab, 0x76, 0x51, 0xc7, 0xb2, 0xa1, 0xf5, 0xf5, 0xf2, 0xfc, 0xfd, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xed, 0xec, 0xec, 0xe4, 0xe2, 0xe0, 0xc5, 0xc2, 0xc1, 0xa0, 0x81, 0x70, 0xa2, 0x74, 0x50, 0x9d, 0x69, 0x41, 0xa8, 0x70, 0x48, 0x91, 0x60, 0x37, 0x86, 0x54, 0x31, 0x80, 0x52, 0x2f, 0x7d, 0x4e, 0x2c, 0x83, 0x50, 0x2a, 0x8d, 0x57, 0x2f, 0x93, 0x5f, 0x3b, 0x94, 0x60, 0x3b, 0x82, 0x4f, 0x30, 0x7d, 0x4c, 0x23, 0x98, 0x63, 0x36, 0x93, 0x5b, 0x30, 0x96, 0x5f, 0x37, 0x9e, 0x66, 0x3d, 0xa8, 0x6a, 0x3f, 0xa8, 0x69, 0x3d, 0xa6, 0x66, 0x3b, 0xa3, 0x63, 0x3a, 0xa9, 0x69, 0x40, 0xa9, 0x69, 0x38, 0xb1, 0x71, 0x41, 0xaf, 0x72, 0x43, 0xbb, 0x7a, 0x4b, 0xbd, 0x83, 0x58, 0xbe, 0x80, 0x52, 0xc0, 0x82, 0x53, 0xb1, 0x77, 0x4c, 0xc2, 0x82, 0x52, 0xc4, 0x84, 0x54, 0xb7, 0x7c, 0x4d, 0xba, 0x7e, 0x4f, 0xc1, 0x84, 0x56, 0xc3, 0x8a, 0x59, 0xb0, 0x79, 0x4d, 0xa0, 0x69, 0x3f, 0xa9, 0x71, 0x44, 0xad, 0x70, 0x42, 0x84, 0x52, 0x30, 0x86, 0x56, 0x31, 0xa3, 0x70, 0x42, 0xa4, 0x6e, 0x3f, 0xb2, 0x7c, 0x4d, 0xa2, 0x6c, 0x44, 0xa9, 0x6f, 0x3f, 0xaf, 0x73, 0x43, 0xb9, 0x7c, 0x4d, 0xbb, 0x82, 0x51, 0xc4, 0x8b, 0x5b, 0xc1, 0x82, 0x53, 0xb7, 0x79, 0x4a, 0xbf, 0x7f, 0x4e, 0xc9, 0x89, 0x59, 0xc6, 0x87, 0x58, 0xc9, 0x8b, 0x5c, 0xc3, 0x84, 0x55, 0xb8, 0x7a, 0x4b, 0xb1, 0x70, 0x44, 0xae, 0x6d, 0x42, 0xa8, 0x65, 0x38, 0xb1, 0x6d, 0x3e, 0xac, 0x68, 0x38, 0xb5, 0x71, 0x40, 0xb4, 0x70, 0x3f, 0xb4, 0x71, 0x3f, 0xbb, 0x78, 0x46, 0xa7, 0x64, 0x35, 0x9f, 0x5f, 0x35, 0xb1, 0x6e, 0x3c, 0xb0, 0x6d, 0x3b, 0xb0, 0x6d, 0x3c, 0xb5, 0x72, 0x40, 0xb3, 0x71, 0x42, 0xb1, 0x71, 0x3f, 0xa6, 0x6a, 0x40, 0x9b, 0x5f, 0x35, 0x9f, 0x62, 0x38, 0xaa, 0x6e, 0x43, 0xa7, 0x6c, 0x43, 0xa3, 0x6b, 0x45, 0xa7, 0x75, 0x51, 0xe2, 0xd2, 0xc9, 0xfc, 0xfd, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xf9, 0xf9, 0xf7, 0xe9, 0xe9, 0xe7, 0xda, 0xd6, 0xd3, 0xb5, 0xb0, 0xad, 0x9a, 0x69, 0x4b, 0xa2, 0x6e, 0x47, 0xa7, 0x6d, 0x46, 0x92, 0x5c, 0x38, 0x99, 0x5e, 0x3a, 0x8f, 0x59, 0x33, 0x80, 0x4d, 0x2c, 0x82, 0x4f, 0x2e, 0x91, 0x5d, 0x39, 0x9b, 0x62, 0x39, 0xa1, 0x6a, 0x3b, 0xac, 0x6e, 0x3a, 0xa9, 0x6e, 0x42, 0xaf, 0x71, 0x45, 0xa0, 0x63, 0x36, 0x9b, 0x64, 0x3a, 0x90, 0x5d, 0x38, 0x85, 0x52, 0x2c, 0x98, 0x5f, 0x34, 0xa6, 0x69, 0x3b, 0xa5, 0x68, 0x3b, 0xac, 0x6e, 0x44, 0xac, 0x6e, 0x44, 0xb5, 0x78, 0x4a, 0xba, 0x79, 0x4c, 0x9f, 0x62, 0x34, 0xb7, 0x7a, 0x4c, 0xb2, 0x78, 0x4c, 0xb4, 0x75, 0x4a, 0xc2, 0x84, 0x52, 0xc0, 0x82, 0x55, 0xbc, 0x7d, 0x4b, 0xc6, 0x87, 0x55, 0xbc, 0x80, 0x50, 0xc3, 0x87, 0x57, 0xc2, 0x84, 0x53, 0xc2, 0x84, 0x53, 0xc1, 0x86, 0x56, 0xa1, 0x6a, 0x40, 0xa8, 0x6e, 0x45, 0xb4, 0x79, 0x45, 0x9d, 0x61, 0x36, 0x7d, 0x4e, 0x2d, 0xa1, 0x68, 0x3e, 0xaa, 0x70, 0x41, 0xc0, 0x81, 0x4e, 0xb8, 0x7b, 0x4c, 0xab, 0x6f, 0x3f, 0xb1, 0x75, 0x45, 0xc2, 0x85, 0x56, 0xc6, 0x8a, 0x5a, 0xc6, 0x8f, 0x5d, 0xb5, 0x75, 0x47, 0xba, 0x7a, 0x4c, 0xb4, 0x76, 0x43, 0xc2, 0x84, 0x51, 0xc8, 0x8c, 0x5c, 0xbe, 0x82, 0x52, 0xc5, 0x84, 0x52, 0xc0, 0x82, 0x54, 0xa2, 0x67, 0x3c, 0xa6, 0x67, 0x3b, 0xab, 0x67, 0x39, 0xaa, 0x66, 0x37, 0xb7, 0x72, 0x41, 0xb2, 0x6e, 0x3b, 0xa8, 0x6a, 0x3a, 0xa4, 0x68, 0x38, 0xac, 0x6f, 0x3f, 0xb9, 0x79, 0x48, 0xc1, 0x77, 0x42, 0xb6, 0x73, 0x40, 0xb3, 0x70, 0x3c, 0xb9, 0x75, 0x44, 0xb7, 0x73, 0x41, 0xbc, 0x77, 0x49, 0xbb, 0x78, 0x43, 0xba, 0x76, 0x47, 0xb6, 0x72, 0x43, 0xae, 0x6d, 0x3f, 0xb3, 0x6d, 0x41, 0xb9, 0x77, 0x49, 0xad, 0x6f, 0x45, 0xb1, 0x77, 0x4b, 0xc6, 0x9f, 0x8b, 0xfb, 0xfc, 0xfd, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xf8, 0xf8, 0xf6, 0xf4, 0xf3, 0xf2, 0xdb, 0xd8, 0xd5, 0xae, 0x91, 0x7a, 0xa5, 0x6e, 0x47, 0xb3, 0x77, 0x4f, 0xb0, 0x72, 0x49, 0xa3, 0x6b, 0x43, 0xa0, 0x67, 0x3c, 0x93, 0x5f, 0x33, 0x7f, 0x4d, 0x2c, 0x73, 0x41, 0x20, 0x89, 0x55, 0x31, 0x98, 0x65, 0x42, 0xa6, 0x67, 0x3c, 0xb3, 0x78, 0x4e, 0xb1, 0x72, 0x46, 0x9a, 0x62, 0x3a, 0x81, 0x4f, 0x29, 0x8d, 0x58, 0x32, 0xa7, 0x70, 0x46, 0xac, 0x71, 0x44, 0xad, 0x6e, 0x40, 0xb2, 0x75, 0x48, 0xb0, 0x73, 0x46, 0xb6, 0x7a, 0x4c, 0xbc, 0x80, 0x52, 0xb5, 0x75, 0x45, 0xca, 0x83, 0x55, 0xc2, 0x80, 0x50, 0xba, 0x78, 0x48, 0xba, 0x7d, 0x52, 0xb8, 0x7d, 0x51, 0xbd, 0x7f, 0x4e, 0xc5, 0x86, 0x5a, 0xb5, 0x7a, 0x4c, 0xb9, 0x7e, 0x50, 0xbf, 0x83, 0x53, 0xc3, 0x86, 0x57, 0xcb, 0x8d, 0x5c, 0xbf, 0x81, 0x50, 0xc5, 0x8a, 0x59, 0xa0, 0x6a, 0x3e, 0x9b, 0x62, 0x39, 0xb6, 0x7a, 0x48, 0xaf, 0x74, 0x47, 0x7d, 0x4f, 0x2b, 0xac, 0x73, 0x45, 0xbc, 0x81, 0x53, 0xc1, 0x81, 0x51, 0xb6, 0x7a, 0x4a, 0xb3, 0x77, 0x47, 0xbb, 0x7e, 0x4f, 0xc4, 0x87, 0x58, 0xcd, 0x91, 0x61, 0xd3, 0x9c, 0x6a, 0xb6, 0x7b, 0x4f, 0xa8, 0x6d, 0x41, 0xc7, 0x89, 0x5c, 0xc5, 0x86, 0x59, 0xbd, 0x81, 0x51, 0xbc, 0x80, 0x50, 0xca, 0x89, 0x57, 0xba, 0x7c, 0x4f, 0xae, 0x73, 0x48, 0xa5, 0x66, 0x39, 0xb4, 0x71, 0x43, 0xb5, 0x71, 0x42, 0xaf, 0x6b, 0x3b, 0xb0, 0x6d, 0x3b, 0xbc, 0x79, 0x46, 0xbc, 0x7a, 0x46, 0xbf, 0x7d, 0x49, 0xbd, 0x7b, 0x47, 0xb4, 0x6f, 0x3e, 0xa3, 0x62, 0x36, 0xb4, 0x73, 0x47, 0xb9, 0x75, 0x44, 0xaf, 0x6b, 0x3a, 0xb8, 0x74, 0x41, 0xb9, 0x75, 0x44, 0xbd, 0x79, 0x4a, 0xc8, 0x83, 0x54, 0xc3, 0x83, 0x4f, 0xc4, 0x81, 0x4e, 0xbd, 0x77, 0x46, 0xbd, 0x7c, 0x4e, 0xb8, 0x79, 0x4d, 0xba, 0x89, 0x66, 0xf4, 0xec, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xf8, 0xf6, 0xf8, 0xf1, 0xed, 0xee, 0xa9, 0xa2, 0x9e, 0xa3, 0x74, 0x55, 0xbb, 0x7a, 0x4e, 0xb5, 0x74, 0x47, 0xb5, 0x75, 0x49, 0xa2, 0x66, 0x3e, 0xa3, 0x66, 0x41, 0x9d, 0x65, 0x42, 0x8a, 0x59, 0x31, 0x78, 0x49, 0x27, 0x77, 0x4b, 0x2f, 0x78, 0x4b, 0x29, 0x84, 0x56, 0x33, 0x93, 0x61, 0x39, 0xa1, 0x66, 0x3a, 0x87, 0x53, 0x2d, 0x74, 0x43, 0x24, 0x86, 0x50, 0x2b, 0x8e, 0x57, 0x2d, 0x97, 0x60, 0x36, 0xb2, 0x77, 0x49, 0xc6, 0x87, 0x52, 0xd2, 0x91, 0x5c, 0xc8, 0x83, 0x4c, 0xc5, 0x80, 0x49, 0xc7, 0x82, 0x4f, 0xc3, 0x7c, 0x4a, 0xc4, 0x80, 0x4d, 0xc2, 0x7e, 0x4e, 0xc7, 0x86, 0x59, 0xc0, 0x85, 0x56, 0xc2, 0x87, 0x59, 0xbe, 0x82, 0x55, 0xb9, 0x82, 0x57, 0xbb, 0x83, 0x57, 0xb8, 0x80, 0x56, 0xbb, 0x82, 0x54, 0xc1, 0x84, 0x54, 0xc8, 0x8b, 0x5b, 0xb9, 0x7e, 0x4f, 0xb8, 0x7e, 0x53, 0xa4, 0x6b, 0x3f, 0xb8, 0x7c, 0x4c, 0xb9, 0x7c, 0x4c, 0x8b, 0x58, 0x35, 0xb6, 0x7e, 0x4d, 0xbd, 0x81, 0x52, 0xc5, 0x88, 0x57, 0xb8, 0x7c, 0x4f, 0xb4, 0x78, 0x4b, 0xbe, 0x82, 0x53, 0xca, 0x8d, 0x5e, 0xd0, 0x98, 0x6a, 0xd2, 0x9b, 0x6c, 0xad, 0x78, 0x50, 0xa8, 0x75, 0x49, 0xb3, 0x7a, 0x4f, 0xab, 0x72, 0x46, 0xba, 0x7f, 0x51, 0xba, 0x7b, 0x4c, 0xba, 0x79, 0x4a, 0xbd, 0x7d, 0x4f, 0xb1, 0x72, 0x45, 0xb3, 0x72, 0x45, 0xa5, 0x64, 0x37, 0xa1, 0x5f, 0x32, 0xb1, 0x6f, 0x3e, 0xab, 0x6a, 0x3b, 0xb0, 0x6c, 0x3e, 0xbf, 0x7a, 0x46, 0xb9, 0x74, 0x40, 0xb4, 0x74, 0x43, 0xa7, 0x68, 0x39, 0x91, 0x57, 0x30, 0xa4, 0x65, 0x3a, 0xc0, 0x78, 0x46, 0xca, 0x82, 0x4d, 0xbd, 0x7a, 0x43, 0xb6, 0x71, 0x42, 0xb9, 0x7b, 0x4b, 0xbd, 0x7e, 0x53, 0xc9, 0x88, 0x57, 0xc5, 0x82, 0x52, 0xca, 0x83, 0x53, 0xc0, 0x7a, 0x4e, 0xbb, 0x75, 0x4a, 0xb7, 0x7e, 0x51, 0xe2, 0xcd, 0xc4, 0xfd, 0xfd, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xed, 0xea, 0xe9, 0xc1, 0xba, 0xb9, 0x8d, 0x7f, 0x77, 0xac, 0x76, 0x50, 0xc7, 0x84, 0x54, 0xc9, 0x85, 0x56, 0xbe, 0x7e, 0x4b, 0xb3, 0x79, 0x49, 0xb4, 0x77, 0x4a, 0xa5, 0x6d, 0x44, 0x87, 0x56, 0x32, 0x6a, 0x3b, 0x20, 0x80, 0x50, 0x31, 0x88, 0x55, 0x2d, 0x88, 0x55, 0x30, 0xa3, 0x6a, 0x41, 0x91, 0x59, 0x30, 0x9c, 0x65, 0x3c, 0x99, 0x62, 0x35, 0xaf, 0x74, 0x43, 0xc3, 0x83, 0x4c, 0xd1, 0x90, 0x55, 0xda, 0x96, 0x5c, 0xd7, 0x8f, 0x56, 0xcd, 0x86, 0x4e, 0xc4, 0x81, 0x4b, 0xc0, 0x7c, 0x47, 0xc4, 0x7e, 0x4c, 0xca, 0x85, 0x52, 0xbb, 0x78, 0x44, 0xbe, 0x79, 0x4c, 0xca, 0x89, 0x5b, 0xbf, 0x84, 0x54, 0xbc, 0x81, 0x55, 0xbb, 0x80, 0x54, 0xbf, 0x87, 0x5a, 0xb8, 0x82, 0x57, 0xb8, 0x83, 0x5a, 0xc3, 0x8a, 0x5e, 0xcd, 0x91, 0x61, 0xc7, 0x8b, 0x5b, 0xc7, 0x8c, 0x5c, 0xca, 0x8f, 0x60, 0xa8, 0x6e, 0x40, 0xbf, 0x84, 0x55, 0xbf, 0x82, 0x51, 0x9a, 0x68, 0x45, 0xb3, 0x7a, 0x4b, 0xc2, 0x86, 0x57, 0xba, 0x7e, 0x4e, 0xb7, 0x7c, 0x50, 0xb6, 0x7b, 0x4f, 0xb7, 0x7b, 0x4b, 0xc4, 0x88, 0x58, 0xd4, 0x9d, 0x70, 0xca, 0x93, 0x65, 0xb7, 0x85, 0x5a, 0xb6, 0x85, 0x5a, 0xb5, 0x7e, 0x53, 0xaa, 0x73, 0x48, 0xb9, 0x7e, 0x52, 0xbd, 0x7c, 0x4e, 0xc2, 0x82, 0x53, 0xbe, 0x7e, 0x4f, 0xb2, 0x71, 0x43, 0xac, 0x6c, 0x3e, 0xb5, 0x77, 0x4a, 0xa8, 0x66, 0x39, 0xae, 0x6b, 0x3a, 0xa7, 0x67, 0x39, 0xa1, 0x61, 0x36, 0x9b, 0x60, 0x34, 0x9c, 0x61, 0x35, 0xa5, 0x67, 0x38, 0xa7, 0x69, 0x3a, 0xa5, 0x64, 0x36, 0xa6, 0x63, 0x35, 0xad, 0x69, 0x3b, 0xbc, 0x79, 0x45, 0xbe, 0x7d, 0x4d, 0xb9, 0x77, 0x47, 0xc1, 0x7c, 0x48, 0xc5, 0x7f, 0x4c, 0xd5, 0x8d, 0x57, 0xd9, 0x91, 0x5b, 0xe2, 0x9d, 0x63, 0xd4, 0x8f, 0x5a, 0xb9, 0x7b, 0x4e, 0xb7, 0x79, 0x4c, 0xcf, 0xb1, 0x9c, 0xfd, 0xfe, 0xfe, 0xff, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf4, 0xf4, 0xf2, 0xd6, 0xd4, 0xcf, 0x9c, 0x94, 0x8f, 0x89, 0x73, 0x66, 0xc5, 0x89, 0x58, 0xc9, 0x83, 0x50, 0xc5, 0x7e, 0x4c, 0xba, 0x79, 0x4d, 0xb7, 0x7b, 0x51, 0xa9, 0x6d, 0x45, 0x96, 0x5d, 0x39, 0x8e, 0x5d, 0x34, 0x87, 0x5a, 0x38, 0x63, 0x39, 0x1e, 0x83, 0x54, 0x32, 0xa7, 0x6a, 0x3e, 0xa4, 0x69, 0x3d, 0x94, 0x5e, 0x35, 0xa8, 0x6c, 0x40, 0xbf, 0x82, 0x4d, 0xc5, 0x83, 0x4e, 0xc8, 0x83, 0x51, 0xd1, 0x8b, 0x57, 0xca, 0x85, 0x51, 0xc7, 0x81, 0x4e, 0xbe, 0x78, 0x45, 0xc2, 0x81, 0x4e, 0xca, 0x89, 0x56, 0xc9, 0x84, 0x51, 0xc2, 0x7c, 0x49, 0xc0, 0x7c, 0x49, 0xbb, 0x77, 0x48, 0xcc, 0x8b, 0x5d, 0xc7, 0x8c, 0x5c, 0xb9, 0x7e, 0x52, 0xc0, 0x86, 0x59, 0xca, 0x8c, 0x5a, 0xac, 0x79, 0x51, 0xb6, 0x80, 0x57, 0xc1, 0x87, 0x5b, 0xc2, 0x87, 0x59, 0xb4, 0x79, 0x49, 0xba, 0x7f, 0x4f, 0xc0, 0x86, 0x54, 0xbc, 0x83, 0x53, 0xc4, 0x89, 0x5b, 0xb8, 0x7c, 0x4c, 0x9e, 0x69, 0x45, 0xc0, 0x87, 0x58, 0xbb, 0x7f, 0x50, 0xa8, 0x6d, 0x3e, 0xb8, 0x7d, 0x51, 0xbd, 0x82, 0x56, 0xbb, 0x80, 0x50, 0xbe, 0x83, 0x54, 0xc3, 0x8d, 0x60, 0xc9, 0x93, 0x66, 0xc5, 0x92, 0x63, 0xb2, 0x80, 0x59, 0xb9, 0x82, 0x57, 0xb5, 0x7e, 0x52, 0xaf, 0x75, 0x49, 0xc6, 0x87, 0x58, 0xbf, 0x7f, 0x50, 0xc0, 0x7f, 0x51, 0xb1, 0x71, 0x43, 0xa8, 0x67, 0x39, 0xa7, 0x68, 0x3b, 0xa3, 0x61, 0x34, 0xac, 0x6a, 0x38, 0xa3, 0x64, 0x36, 0x99, 0x59, 0x2f, 0x9a, 0x5e, 0x31, 0xb1, 0x74, 0x47, 0xaa, 0x6b, 0x3c, 0xa4, 0x66, 0x36, 0xa0, 0x60, 0x34, 0x8e, 0x54, 0x2c, 0x93, 0x56, 0x2e, 0xab, 0x6e, 0x42, 0xb6, 0x77, 0x4d, 0xb6, 0x78, 0x48, 0xba, 0x77, 0x48, 0xc2, 0x7f, 0x4a, 0xb7, 0x75, 0x43, 0xc7, 0x86, 0x54, 0xcf, 0x8b, 0x54, 0xc9, 0x83, 0x50, 0xc3, 0x80, 0x4f, 0xb9, 0x76, 0x4b, 0xce, 0xb0, 0x98, 0xfd, 0xfe, 0xff, 0xff, 0xfe, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xf1, 0xf0, 0xef, 0xc8, 0xc4, 0xbf, 0xa0, 0x98, 0x90, 0x8e, 0x73, 0x61, 0xcc, 0x95, 0x69, 0xc8, 0x88, 0x58, 0xc5, 0x85, 0x55, 0xb9, 0x7d, 0x50, 0xb4, 0x77, 0x4a, 0xb6, 0x7d, 0x4e, 0xad, 0x72, 0x49, 0x86, 0x53, 0x2f, 0x7b, 0x4d, 0x2f, 0x7b, 0x4d, 0x2d, 0x7a, 0x48, 0x25, 0x60, 0x32, 0x17, 0x6f, 0x42, 0x24, 0x72, 0x4c, 0x33, 0x69, 0x40, 0x22, 0x97, 0x63, 0x3c, 0xaf, 0x74, 0x42, 0xaa, 0x6b, 0x3d, 0xb6, 0x74, 0x43, 0xbe, 0x7a, 0x46, 0xc1, 0x7d, 0x4a, 0xc0, 0x79, 0x43, 0xc2, 0x7c, 0x49, 0xc3, 0x7d, 0x4b, 0xc2, 0x7c, 0x4b, 0xb2, 0x6c, 0x3b, 0xab, 0x69, 0x39, 0xc4, 0x87, 0x55, 0xbb, 0x80, 0x54, 0xbe, 0x83, 0x57, 0xc8, 0x8b, 0x60, 0xcb, 0x95, 0x67, 0xba, 0x81, 0x59, 0xb0, 0x7c, 0x4e, 0xca, 0x92, 0x63, 0xbf, 0x86, 0x5d, 0xa9, 0x77, 0x4e, 0xb3, 0x7e, 0x51, 0xb1, 0x78, 0x4c, 0xb3, 0x7a, 0x4d, 0xc1, 0x86, 0x56, 0xba, 0x7f, 0x52, 0xa5, 0x6d, 0x45, 0xbc, 0x83, 0x54, 0xc9, 0x8d, 0x5d, 0xb6, 0x7d, 0x51, 0xa7, 0x71, 0x4b, 0xc0, 0x85, 0x59, 0xb8, 0x7e, 0x51, 0xb8, 0x81, 0x53, 0xae, 0x77, 0x4a, 0xb4, 0x81, 0x56, 0xb6, 0x83, 0x58, 0xbf, 0x86, 0x58, 0xbe, 0x89, 0x60, 0xb6, 0x7d, 0x52, 0xb9, 0x80, 0x55, 0xa9, 0x72, 0x46, 0xbf, 0x83, 0x53, 0xd1, 0x91, 0x63, 0xbb, 0x7a, 0x4c, 0xb8, 0x78, 0x4b, 0xb1, 0x6e, 0x3f, 0xbd, 0x78, 0x49, 0xbd, 0x79, 0x47, 0xba, 0x78, 0x44, 0x9a, 0x60, 0x31, 0x92, 0x56, 0x2d, 0x97, 0x5c, 0x32, 0x9c, 0x5d, 0x30, 0xb2, 0x6e, 0x3f, 0xbc, 0x78, 0x49, 0xb7, 0x74, 0x45, 0x85, 0x4d, 0x27, 0x83, 0x4e, 0x2d, 0x9f, 0x66, 0x3c, 0xbc, 0x7e, 0x4d, 0xb6, 0x78, 0x46, 0x8f, 0x55, 0x2c, 0xbb, 0x7e, 0x50, 0xc9, 0x88, 0x57, 0xc5, 0x85, 0x55, 0xc2, 0x7d, 0x4c, 0xcc, 0x85, 0x55, 0xc4, 0x7f, 0x4f, 0xbd, 0x7a, 0x4b, 0xc2, 0xa3, 0x8e, 0xf8, 0xf9, 0xfa, 0xff, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xe1, 0xe0, 0xdf, 0xac, 0xa7, 0xa2, 0x8b, 0x83, 0x7b, 0x7d, 0x61, 0x50, 0xdf, 0xa8, 0x7c, 0xcf, 0x8f, 0x5f, 0xc1, 0x81, 0x51, 0xae, 0x76, 0x48, 0xa3, 0x6a, 0x46, 0xa1, 0x6b, 0x41, 0x94, 0x5c, 0x37, 0x70, 0x44, 0x27, 0x5f, 0x39, 0x21, 0x68, 0x39, 0x1c, 0x5f, 0x35, 0x1d, 0x3c, 0x1e, 0x10, 0x44, 0x27, 0x15, 0x7d, 0x4f, 0x2e, 0x8d, 0x5b, 0x36, 0x84, 0x52, 0x2f, 0x9b, 0x68, 0x3c, 0xa4, 0x6a, 0x41, 0xb0, 0x72, 0x44, 0xb5, 0x73, 0x42, 0xbb, 0x7a, 0x48, 0xb0, 0x72, 0x43, 0xb4, 0x73, 0x43, 0xa7, 0x66, 0x36, 0xac, 0x6b, 0x3d, 0xb4, 0x72, 0x45, 0xb5, 0x76, 0x4a, 0xbf, 0x86, 0x59, 0xc6, 0x8c, 0x5f, 0xcd, 0x92, 0x66, 0xc5, 0x8e, 0x63, 0xc1, 0x8e, 0x62, 0xbb, 0x89, 0x62, 0xcb, 0x95, 0x66, 0xc8, 0x8d, 0x5f, 0xaa, 0x78, 0x4d, 0xaf, 0x7e, 0x55, 0xbc, 0x87, 0x5a, 0xb0, 0x7a, 0x4c, 0x99, 0x63, 0x3a, 0xb6, 0x7c, 0x51, 0xb6, 0x7b, 0x4e, 0xa0, 0x69, 0x40, 0xa9, 0x70, 0x41, 0xc2, 0x86, 0x56, 0xbb, 0x83, 0x56, 0x9c, 0x66, 0x40, 0xb7, 0x7d, 0x50, 0xc1, 0x86, 0x5a, 0xba, 0x84, 0x56, 0xb3, 0x7c, 0x4f, 0xb9, 0x86, 0x5c, 0xbb, 0x88, 0x5d, 0xbf, 0x85, 0x58, 0xbb, 0x86, 0x5d, 0xbe, 0x89, 0x5d, 0xb1, 0x7b, 0x4f, 0xb3, 0x7c, 0x50, 0xae, 0x72, 0x43, 0xc4, 0x88, 0x58, 0xc3, 0x87, 0x58, 0xa2, 0x65, 0x3b, 0xa6, 0x68, 0x3b, 0xae, 0x6b, 0x3d, 0xb9, 0x75, 0x43, 0xc2, 0x7e, 0x4a, 0xb3, 0x75, 0x44, 0xa9, 0x69, 0x3c, 0x9a, 0x5c, 0x32, 0x9c, 0x63, 0x3a, 0xa9, 0x69, 0x3e, 0x9e, 0x5e, 0x33, 0x8e, 0x58, 0x33, 0x95, 0x5f, 0x3b, 0x9a, 0x64, 0x3e, 0x99, 0x5f, 0x39, 0xb2, 0x74, 0x43, 0xb5, 0x77, 0x45, 0xad, 0x71, 0x47, 0x9c, 0x65, 0x3c, 0x98, 0x62, 0x39, 0xbe, 0x7f, 0x51, 0xbf, 0x7d, 0x4f, 0xc4, 0x83, 0x55, 0xba, 0x7a, 0x4d, 0xb2, 0x73, 0x47, 0xc6, 0xa9, 0x95, 0xf5, 0xf5, 0xf6, 0xff, 0xfd, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xf2, 0xf2, 0xf0, 0xc4, 0xc4, 0xc1, 0xaf, 0xad, 0xa7, 0x9c, 0x93, 0x89, 0x77, 0x60, 0x4d, 0xd4, 0x90, 0x61, 0xd4, 0x8b, 0x58, 0xb1, 0x6e, 0x47, 0x9a, 0x64, 0x3e, 0x82, 0x4e, 0x2b, 0x87, 0x55, 0x34, 0x80, 0x4d, 0x2c, 0x52, 0x2d, 0x1a, 0x40, 0x24, 0x10, 0x46, 0x26, 0x15, 0x44, 0x22, 0x10, 0x2b, 0x16, 0x0c, 0x45, 0x27, 0x15, 0x54, 0x34, 0x17, 0x76, 0x4e, 0x2f, 0x6d, 0x44, 0x26, 0x62, 0x3c, 0x1e, 0x80, 0x53, 0x31, 0x99, 0x5f, 0x35, 0xac, 0x6d, 0x3c, 0xab, 0x6f, 0x3f, 0xad, 0x70, 0x40, 0x9e, 0x62, 0x39, 0xb4, 0x71, 0x41, 0xa3, 0x64, 0x34, 0x9b, 0x61, 0x33, 0xa0, 0x68, 0x43, 0xb1, 0x7b, 0x52, 0xc4, 0x8d, 0x60, 0xc7, 0x90, 0x63, 0xc2, 0x8e, 0x64, 0xc5, 0x99, 0x6c, 0xd0, 0x9b, 0x6c, 0xcf, 0x9a, 0x70, 0xab, 0x80, 0x55, 0x9e, 0x6b, 0x46, 0xc0, 0x89, 0x5a, 0xc2, 0x8a, 0x5b, 0xba, 0x81, 0x54, 0x8f, 0x61, 0x3c, 0xac, 0x77, 0x4c, 0xb3, 0x7a, 0x4e, 0xa2, 0x6c, 0x42, 0xa5, 0x6e, 0x41, 0xc3, 0x85, 0x53, 0xb7, 0x7d, 0x55, 0x9f, 0x6a, 0x43, 0xb3, 0x7c, 0x4f, 0xc4, 0x8d, 0x60, 0xae, 0x7a, 0x51, 0xaf, 0x7f, 0x59, 0xc6, 0x93, 0x68, 0xc5, 0x92, 0x67, 0xbb, 0x8a, 0x64, 0xc4, 0x8f, 0x66, 0xba, 0x8a, 0x61, 0xb0, 0x80, 0x58, 0xbb, 0x86, 0x5a, 0xbd, 0x88, 0x5c, 0xb8, 0x7f, 0x51, 0xc4, 0x8a, 0x5c, 0xbe, 0x83, 0x55, 0xb1, 0x72, 0x46, 0xa0, 0x61, 0x34, 0xb1, 0x70, 0x40, 0xc2, 0x7e, 0x49, 0xcb, 0x83, 0x4e, 0xc2, 0x7c, 0x46, 0xb3, 0x73, 0x44, 0xa1, 0x60, 0x36, 0x9d, 0x62, 0x38, 0x93, 0x5c, 0x34, 0x8f, 0x56, 0x2f, 0xa9, 0x6f, 0x46, 0xa8, 0x6d, 0x43, 0xae, 0x73, 0x44, 0xae, 0x6c, 0x3e, 0xa9, 0x72, 0x47, 0x8d, 0x55, 0x36, 0x89, 0x58, 0x37, 0xb1, 0x71, 0x3f, 0xc8, 0x88, 0x56, 0xbf, 0x81, 0x4f, 0xbd, 0x7f, 0x50, 0xa6, 0x68, 0x3d, 0xb9, 0x74, 0x45, 0xbc, 0xa6, 0x98, 0xef, 0xed, 0xec, 0xfa, 0xfa, 0xfb, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfa, 0xe5, 0xe5, 0xe3, 0xcd, 0xcb, 0xc9, 0xb8, 0xb0, 0xad, 0x67, 0x5a, 0x52, 0x69, 0x51, 0x3c, 0xd1, 0x8a, 0x5a, 0xc8, 0x7e, 0x4b, 0xab, 0x68, 0x41, 0xa5, 0x6e, 0x48, 0x8b, 0x58, 0x35, 0x6e, 0x42, 0x27, 0x6c, 0x41, 0x26, 0x71, 0x47, 0x27, 0x64, 0x3d, 0x27, 0x43, 0x23, 0x14, 0x22, 0x0f, 0x09, 0x22, 0x08, 0x00, 0x41, 0x26, 0x15, 0x59, 0x3b, 0x20, 0x6c, 0x46, 0x28, 0x86, 0x59, 0x36, 0x8e, 0x60, 0x3b, 0x75, 0x49, 0x29, 0x69, 0x3e, 0x1e, 0x87, 0x55, 0x32, 0x9f, 0x65, 0x3f, 0x8d, 0x53, 0x2a, 0xc2, 0x86, 0x54, 0xb0, 0x75, 0x47, 0x96, 0x5e, 0x39, 0x84, 0x50, 0x2f, 0xb1, 0x7f, 0x58, 0xb3, 0x82, 0x57, 0xd2, 0xa1, 0x76, 0xc6, 0x95, 0x69, 0xd5, 0xa6, 0x7a, 0xcd, 0x9c, 0x71, 0xd6, 0xa2, 0x72, 0xbb, 0x86, 0x5c, 0xb4, 0x82, 0x5a, 0xbb, 0x86, 0x58, 0xb1, 0x7c, 0x50, 0xbd, 0x88, 0x5c, 0xb9, 0x82, 0x55, 0xc6, 0x8e, 0x62, 0xad, 0x7a, 0x51, 0xab, 0x76, 0x4c, 0xae, 0x7a, 0x50, 0x9f, 0x6c, 0x41, 0xaa, 0x73, 0x45, 0xb0, 0x7b, 0x51, 0xad, 0x7b, 0x54, 0xc7, 0x90, 0x63, 0xd2, 0x9c, 0x6e, 0xcd, 0x96, 0x6a, 0xb7, 0x83, 0x5a, 0xb4, 0x81, 0x56, 0xcb, 0x98, 0x6d, 0xc9, 0x98, 0x72, 0xb9, 0x84, 0x5b, 0xc6, 0x93, 0x68, 0xd4, 0xa1, 0x76, 0xcd, 0x98, 0x6c, 0xc3, 0x8e, 0x62, 0xbe, 0x88, 0x5c, 0xb7, 0x80, 0x54, 0xb0, 0x79, 0x4d, 0xae, 0x72, 0x49, 0xad, 0x6f, 0x44, 0xb9, 0x78, 0x48, 0xce, 0x89, 0x55, 0xca, 0x83, 0x4d, 0xc3, 0x7b, 0x44, 0xc5, 0x7f, 0x47, 0xa5, 0x6b, 0x39, 0xa5, 0x6c, 0x3c, 0xb0, 0x6f, 0x39, 0xa1, 0x63, 0x3c, 0xa0, 0x68, 0x46, 0xa0, 0x67, 0x3f, 0xaf, 0x76, 0x49, 0xa4, 0x69, 0x41, 0x98, 0x60, 0x34, 0x8e, 0x60, 0x3d, 0xaa, 0x6f, 0x42, 0xc1, 0x80, 0x54, 0xad, 0x6c, 0x40, 0xbb, 0x7c, 0x4d, 0x9c, 0x5c, 0x33, 0xa3, 0x64, 0x39, 0xb2, 0x72, 0x46, 0xcf, 0xbe, 0xb3, 0xf4, 0xf1, 0xf0, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf5, 0xf6, 0xf4, 0xd0, 0xd2, 0xce, 0xa8, 0xa7, 0xa1, 0x6d, 0x63, 0x5e, 0x57, 0x47, 0x3e, 0x52, 0x43, 0x39, 0xaf, 0x78, 0x4a, 0xc1, 0x7b, 0x4b, 0xa8, 0x68, 0x43, 0x94, 0x5d, 0x3b, 0x94, 0x60, 0x3d, 0x88, 0x57, 0x35, 0x93, 0x5d, 0x3f, 0x86, 0x59, 0x39, 0x7e, 0x50, 0x2f, 0x53, 0x31, 0x1b, 0x25, 0x0f, 0x07, 0x42, 0x21, 0x0d, 0x56, 0x34, 0x1a, 0x52, 0x31, 0x18, 0x94, 0x61, 0x38, 0xa4, 0x6c, 0x42, 0xa1, 0x68, 0x3f, 0x95, 0x5e, 0x34, 0x9c, 0x66, 0x3b, 0x98, 0x61, 0x37, 0xa9, 0x6e, 0x43, 0xac, 0x71, 0x44, 0xa7, 0x6a, 0x41, 0xa8, 0x6c, 0x44, 0xb7, 0x82, 0x5b, 0x91, 0x66, 0x42, 0xac, 0x7d, 0x58, 0xbe, 0x8b, 0x62, 0xc2, 0x94, 0x6b, 0xda, 0xa9, 0x7d, 0xdc, 0xaa, 0x7d, 0xca, 0x96, 0x6a, 0xc3, 0x8e, 0x61, 0xbd, 0x88, 0x5d, 0xae, 0x7c, 0x53, 0xb6, 0x84, 0x57, 0xa7, 0x7a, 0x50, 0xc9, 0x97, 0x6a, 0xc9, 0x92, 0x65, 0xc8, 0x8f, 0x61, 0xb1, 0x80, 0x57, 0x94, 0x66, 0x3e, 0x97, 0x65, 0x3c, 0xa2, 0x6f, 0x46, 0xad, 0x7a, 0x51, 0x91, 0x64, 0x40, 0xa0, 0x6f, 0x46, 0xc5, 0x8e, 0x61, 0xd7, 0x9d, 0x6d, 0xd1, 0x96, 0x6b, 0xd2, 0x9c, 0x71, 0xcd, 0x98, 0x67, 0xc2, 0x8d, 0x5e, 0xb4, 0x83, 0x56, 0xc4, 0x8f, 0x68, 0xc6, 0x91, 0x67, 0xce, 0x99, 0x6b, 0xd6, 0xa3, 0x76, 0xdb, 0xa8, 0x7b, 0xb5, 0x7e, 0x56, 0xac, 0x75, 0x4d, 0x9b, 0x67, 0x3f, 0x9d, 0x65, 0x3c, 0xb0, 0x74, 0x4a, 0xb3, 0x74, 0x46, 0xbb, 0x78, 0x46, 0xc5, 0x7e, 0x49, 0xd4, 0x8a, 0x53, 0xcb, 0x82, 0x48, 0xce, 0x86, 0x49, 0xb8, 0x73, 0x3e, 0xb3, 0x76, 0x48, 0x95, 0x65, 0x40, 0x80, 0x58, 0x39, 0x79, 0x4c, 0x2f, 0x77, 0x4b, 0x29, 0x6f, 0x47, 0x2a, 0x7f, 0x50, 0x30, 0xa4, 0x6d, 0x48, 0xa4, 0x67, 0x40, 0x9f, 0x64, 0x38, 0xa7, 0x68, 0x3f, 0xa5, 0x64, 0x3b, 0xa5, 0x62, 0x38, 0xaf, 0x6b, 0x40, 0xb1, 0x78, 0x52, 0xb7, 0xad, 0xa4, 0xd8, 0xd3, 0xcf, 0xf3, 0xf3, 0xf0, 0xfe, 0xfe, 0xfc, 0xfe, 0xfe, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xed, 0xec, 0xeb, 0xb7, 0xb6, 0xb2, 0x7b, 0x77, 0x71, 0x67, 0x5a, 0x55, 0x56, 0x45, 0x3b, 0x43, 0x35, 0x2e, 0x8c, 0x62, 0x43, 0xba, 0x77, 0x4a, 0xa3, 0x61, 0x3a, 0x84, 0x4d, 0x2a, 0x81, 0x4d, 0x2c, 0x93, 0x62, 0x3d, 0x9d, 0x67, 0x40, 0x91, 0x61, 0x3d, 0x7f, 0x52, 0x31, 0x5f, 0x3d, 0x27, 0x3d, 0x23, 0x15, 0x47, 0x2d, 0x1f, 0x3a, 0x24, 0x13, 0x69, 0x45, 0x25, 0xb2, 0x76, 0x48, 0xb8, 0x77, 0x47, 0xb8, 0x77, 0x46, 0xb8, 0x78, 0x46, 0xb3, 0x74, 0x42, 0xb0, 0x72, 0x43, 0xb4, 0x77, 0x4c, 0xbc, 0x80, 0x50, 0xc0, 0x85, 0x54, 0xc2, 0x8a, 0x5c, 0x99, 0x68, 0x44, 0xa2, 0x77, 0x53, 0xc3, 0x94, 0x70, 0xc2, 0x8f, 0x66, 0xbf, 0x8f, 0x66, 0xcd, 0x98, 0x6c, 0xca, 0x95, 0x69, 0xcb, 0x97, 0x6a, 0xbe, 0x89, 0x5d, 0xb5, 0x80, 0x54, 0xc4, 0x8d, 0x5e, 0xb8, 0x81, 0x52, 0xd1, 0x9a, 0x6b, 0xc3, 0x8b, 0x5b, 0xb9, 0x7e, 0x4f, 0xb4, 0x7f, 0x56, 0xa4, 0x74, 0x4b, 0x92, 0x64, 0x3c, 0x95, 0x66, 0x40, 0x9b, 0x68, 0x3f, 0xae, 0x7b, 0x53, 0x8a, 0x5d, 0x38, 0x96, 0x67, 0x42, 0xc2, 0x8e, 0x63, 0xcc, 0x93, 0x64, 0xc9, 0x92, 0x67, 0xc7, 0x94, 0x67, 0xbe, 0x8a, 0x61, 0xbd, 0x88, 0x65, 0xb3, 0x81, 0x55, 0xcd, 0x99, 0x6f, 0xcd, 0x98, 0x6e, 0xd3, 0x9f, 0x70, 0xd6, 0xa3, 0x76, 0xda, 0xa7, 0x7a, 0xd7, 0xa4, 0x7b, 0xbb, 0x87, 0x5f, 0xaa, 0x77, 0x4e, 0x95, 0x62, 0x3b, 0x9d, 0x67, 0x42, 0xa8, 0x70, 0x46, 0xa2, 0x65, 0x37, 0xbf, 0x7f, 0x4e, 0xc0, 0x7a, 0x45, 0xbb, 0x73, 0x3a, 0xc4, 0x7d, 0x44, 0xbc, 0x78, 0x43, 0xaf, 0x73, 0x46, 0x5a, 0x36, 0x19, 0x4c, 0x2e, 0x17, 0x5b, 0x39, 0x23, 0x5b, 0x3a, 0x20, 0x77, 0x50, 0x31, 0x8e, 0x5e, 0x3d, 0xa0, 0x69, 0x3c, 0xb8, 0x7c, 0x4d, 0xc2, 0x80, 0x4c, 0x90, 0x56, 0x30, 0x9f, 0x62, 0x3d, 0x9f, 0x5e, 0x36, 0xb9, 0x76, 0x4a, 0xb4, 0x8c, 0x72, 0xbe, 0xb6, 0xad, 0xd0, 0xca, 0xc5, 0xeb, 0xea, 0xe7, 0xfd, 0xfe, 0xfc, 0xfe, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf5, 0xf5, 0xd3, 0xd0, 0xcf, 0x96, 0x90, 0x8e, 0x5c, 0x53, 0x4f, 0x52, 0x42, 0x3e, 0x46, 0x34, 0x2c, 0x3a, 0x2c, 0x24, 0x59, 0x41, 0x36, 0xc0, 0x81, 0x55, 0xb9, 0x72, 0x46, 0x8b, 0x54, 0x2d, 0x78, 0x43, 0x27, 0x69, 0x37, 0x1c, 0x99, 0x65, 0x41, 0x97, 0x62, 0x3d, 0x6f, 0x46, 0x28, 0x64, 0x3c, 0x28, 0x55, 0x39, 0x24, 0x42, 0x26, 0x18, 0x24, 0x14, 0x08, 0x75, 0x56, 0x33, 0x86, 0x51, 0x27, 0xa0, 0x64, 0x38, 0xa4, 0x67, 0x39, 0x9f, 0x64, 0x37, 0x98, 0x5e, 0x30, 0x9a, 0x5e, 0x31, 0xc0, 0x82, 0x57, 0xc5, 0x88, 0x58, 0xbb, 0x82, 0x54, 0xb2, 0x85, 0x5f, 0x94, 0x6a, 0x4c, 0xca, 0x9e, 0x78, 0xc3, 0x94, 0x6f, 0xd3, 0xa1, 0x78, 0xcd, 0x98, 0x70, 0xc5, 0x8d, 0x62, 0xb9, 0x84, 0x58, 0xca, 0x95, 0x69, 0xc9, 0x94, 0x68, 0xb5, 0x82, 0x56, 0xb1, 0x7e, 0x53, 0xb8, 0x85, 0x5a, 0xb0, 0x7a, 0x4e, 0xac, 0x79, 0x53, 0x93, 0x67, 0x44, 0xaf, 0x7d, 0x55, 0xbf, 0x87, 0x5a, 0x98, 0x6a, 0x42, 0x7e, 0x54, 0x31, 0xa1, 0x6f, 0x46, 0x93, 0x63, 0x3c, 0xa5, 0x72, 0x48, 0x96, 0x6b, 0x47, 0xb2, 0x81, 0x58, 0xc6, 0x92, 0x66, 0xd2, 0x9e, 0x71, 0xd0, 0xa1, 0x73, 0xbf, 0x8f, 0x67, 0xa6, 0x75, 0x51, 0xb6, 0x82, 0x5b, 0xcc, 0x99, 0x6c, 0xd9, 0xa4, 0x7b, 0xde, 0xaa, 0x7b, 0xd7, 0xa4, 0x77, 0xd2, 0x9f, 0x72, 0xd5, 0xa5, 0x7a, 0xdc, 0xac, 0x82, 0xbe, 0x8b, 0x61, 0x90, 0x60, 0x3d, 0x7a, 0x4d, 0x2e, 0x90, 0x60, 0x3a, 0x94, 0x5f, 0x38, 0x93, 0x5a, 0x30, 0xad, 0x6e, 0x41, 0xbd, 0x7b, 0x47, 0xba, 0x77, 0x43, 0xb0, 0x71, 0x3b, 0x97, 0x62, 0x37, 0x62, 0x3d, 0x1f, 0x4d, 0x2d, 0x14, 0x5c, 0x3a, 0x23, 0x79, 0x57, 0x3b, 0x93, 0x68, 0x46, 0x99, 0x65, 0x42, 0x9d, 0x63, 0x3f, 0x9a, 0x5c, 0x33, 0xaf, 0x72, 0x45, 0xa2, 0x64, 0x39, 0xa5, 0x61, 0x37, 0xc0, 0x76, 0x46, 0xcb, 0x87, 0x58, 0xa2, 0x8f, 0x7f, 0xb6, 0xaf, 0xa5, 0xdb, 0xd5, 0xd0, 0xdd, 0xdc, 0xd9, 0xed, 0xed, 0xeb, 0xfc, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfa, 0xeb, 0xeb, 0xe9, 0xaa, 0xa7, 0xa5, 0x64, 0x5e, 0x5c, 0x52, 0x4a, 0x47, 0x3e, 0x33, 0x2c, 0x34, 0x2a, 0x24, 0x32, 0x22, 0x1f, 0x35, 0x26, 0x1c, 0x8f, 0x67, 0x44, 0xc7, 0x80, 0x51, 0x9d, 0x61, 0x3b, 0x81, 0x4d, 0x2d, 0x6f, 0x41, 0x26, 0x5f, 0x35, 0x1d, 0x71, 0x45, 0x2e, 0x8a, 0x61, 0x42, 0x86, 0x5d, 0x3e, 0x72, 0x50, 0x39, 0x42, 0x27, 0x1c, 0x25, 0x14, 0x07, 0x25, 0x12, 0x08, 0x3f, 0x25, 0x16, 0x80, 0x54, 0x32, 0xba, 0x7d, 0x4c, 0xb6, 0x7b, 0x4c, 0xae, 0x72, 0x43, 0xc0, 0x82, 0x50, 0xcb, 0x8e, 0x5d, 0xb6, 0x7e, 0x51, 0x94, 0x64, 0x3f, 0x8b, 0x64, 0x46, 0xb7, 0x91, 0x6f, 0xd8, 0xad, 0x88, 0xd7, 0xa5, 0x7c, 0xda, 0xa8, 0x7f, 0xcb, 0x96, 0x6c, 0xd0, 0x9a, 0x70, 0xcc, 0x97, 0x6b, 0xc5, 0x90, 0x64, 0xb6, 0x83, 0x58, 0xa0, 0x72, 0x49, 0xa6, 0x75, 0x4a, 0xbd, 0x88, 0x5a, 0xb9, 0x84, 0x56, 0xb6, 0x81, 0x57, 0xb3, 0x7e, 0x56, 0xa4, 0x75, 0x50, 0xb3, 0x7d, 0x53, 0xa1, 0x6d, 0x44, 0x73, 0x4e, 0x2e, 0x94, 0x68, 0x41, 0x81, 0x5a, 0x3b, 0xad, 0x79, 0x51, 0xa6, 0x7a, 0x4e, 0x75, 0x4a, 0x2a, 0xc1, 0x8c, 0x5e, 0xc4, 0x8d, 0x61, 0xd2, 0x9a, 0x6f, 0xbc, 0x87, 0x5d, 0xc3, 0x8e, 0x5f, 0xcd, 0x98, 0x6e, 0xbf, 0x89, 0x60, 0xdc, 0xa7, 0x7b, 0xdb, 0xa6, 0x7a, 0xd8, 0xa3, 0x77, 0xdd, 0xa9, 0x7c, 0xd5, 0xa2, 0x75, 0xd8, 0xa5, 0x78, 0xe0, 0xb0, 0x89, 0xc7, 0x99, 0x75, 0x85, 0x59, 0x35, 0x8f, 0x61, 0x3a, 0x90, 0x64, 0x40, 0x87, 0x53, 0x30, 0x86, 0x4f, 0x26, 0x9e, 0x61, 0x35, 0x9f, 0x63, 0x34, 0xa2, 0x6d, 0x46, 0x49, 0x2a, 0x14, 0x40, 0x23, 0x0f, 0x68, 0x42, 0x28, 0x69, 0x42, 0x26, 0x83, 0x58, 0x38, 0x9f, 0x6f, 0x4d, 0xa7, 0x6f, 0x46, 0xc5, 0x87, 0x5f, 0xc0, 0x83, 0x56, 0xc3, 0x83, 0x55, 0xc5, 0x7f, 0x4f, 0xbf, 0x76, 0x46, 0xc7, 0x7c, 0x47, 0xb0, 0x81, 0x62, 0xb8, 0xa7, 0x9c, 0xb3, 0xa9, 0x9f, 0xbe, 0xb8, 0xaf, 0xde, 0xdc, 0xd8, 0xef, 0xf0, 0xed, 0xfc, 0xfc, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xf8, 0xd8, 0xd8, 0xd6, 0x7a, 0x77, 0x75, 0x4d, 0x48, 0x46, 0x42, 0x3c, 0x3a, 0x39, 0x31, 0x2f, 0x2a, 0x22, 0x1f, 0x35, 0x25, 0x22, 0x2e, 0x20, 0x17, 0x32, 0x21, 0x17, 0xaa, 0x75, 0x50, 0xb1, 0x6f, 0x45, 0x91, 0x58, 0x35, 0x8e, 0x5d, 0x39, 0x87, 0x5a, 0x3a, 0x82, 0x59, 0x3f, 0x61, 0x3d, 0x25, 0x5a, 0x38, 0x21, 0x33, 0x1a, 0x0a, 0x41, 0x2a, 0x1b, 0x46, 0x2f, 0x1e, 0x23, 0x1a, 0x13, 0x24, 0x15, 0x09, 0x63, 0x40, 0x25, 0xa0, 0x67, 0x3a, 0xb9, 0x79, 0x46, 0xbe, 0x80, 0x4e, 0xb1, 0x78, 0x4a, 0x8f, 0x5d, 0x35, 0x89, 0x5d, 0x3a, 0x80, 0x5a, 0x3d, 0xb4, 0x8d, 0x70, 0xd5, 0xa9, 0x85, 0xde, 0xaf, 0x87, 0xdb, 0xaa, 0x80, 0xcc, 0x9b, 0x71, 0xd6, 0xa6, 0x7b, 0xd2, 0xa2, 0x76, 0xcf, 0x9a, 0x6e, 0xd1, 0x9c, 0x70, 0xcf, 0x9d, 0x72, 0xc1, 0x8b, 0x5c, 0xbe, 0x86, 0x57, 0xb0, 0x7c, 0x50, 0xa4, 0x6a, 0x45, 0xac, 0x71, 0x49, 0xc3, 0x8b, 0x5f, 0xbd, 0x86, 0x5a, 0x8f, 0x60, 0x3c, 0xaa, 0x76, 0x4d, 0x77, 0x51, 0x31, 0x83, 0x60, 0x40, 0x66, 0x46, 0x2c, 0x9b, 0x69, 0x40, 0xa9, 0x75, 0x4a, 0x74, 0x50, 0x30, 0x92, 0x62, 0x41, 0xa6, 0x73, 0x4a, 0xa8, 0x75, 0x4d, 0xad, 0x78, 0x4f, 0xcc, 0x98, 0x69, 0xda, 0xa6, 0x76, 0xd4, 0xa0, 0x70, 0xd5, 0xa1, 0x74, 0xd8, 0xa3, 0x77, 0xda, 0xa5, 0x79, 0xcd, 0x98, 0x6c, 0xe4, 0xb1, 0x84, 0xdb, 0xa9, 0x7c, 0xe4, 0xb5, 0x8e, 0xe5, 0xb7, 0x92, 0xb5, 0x86, 0x63, 0x85, 0x5b, 0x3c, 0x98, 0x68, 0x45, 0x8c, 0x59, 0x35, 0x8e, 0x57, 0x2f, 0x9c, 0x5f, 0x35, 0x9b, 0x5f, 0x30, 0x6b, 0x43, 0x1f, 0x52, 0x34, 0x1b, 0x59, 0x37, 0x1f, 0x56, 0x35, 0x1e, 0x5f, 0x3d, 0x24, 0x67, 0x40, 0x24, 0x97, 0x69, 0x46, 0xad, 0x76, 0x4d, 0xa3, 0x6d, 0x44, 0xaf, 0x6e, 0x43, 0xc9, 0x84, 0x54, 0xd3, 0x8a, 0x56, 0xd6, 0x88, 0x53, 0xb2, 0x78, 0x4f, 0x84, 0x6a, 0x5a, 0x98, 0x89, 0x80, 0xb3, 0xa4, 0x98, 0xc5, 0xbf, 0xb7, 0xd3, 0xd1, 0xcd, 0xe9, 0xea, 0xe8, 0xfb, 0xfb, 0xf9, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xdd, 0xdb, 0xd9, 0xa1, 0x9f, 0x9c, 0x6d, 0x69, 0x64, 0x4f, 0x48, 0x43, 0x3c, 0x34, 0x2f, 0x33, 0x2a, 0x25, 0x29, 0x1f, 0x19, 0x3b, 0x2a, 0x22, 0x2b, 0x1a, 0x12, 0x29, 0x1b, 0x12, 0x44, 0x31, 0x23, 0xbc, 0x7b, 0x4c, 0x9c, 0x65, 0x40, 0x97, 0x65, 0x42, 0x8f, 0x63, 0x42, 0x6e, 0x46, 0x2e, 0x4f, 0x2e, 0x1c, 0x48, 0x2c, 0x1c, 0x36, 0x20, 0x12, 0x31, 0x20, 0x12, 0x40, 0x29, 0x17, 0x51, 0x32, 0x1d, 0x58, 0x37, 0x1c, 0x66, 0x3f, 0x23, 0x75, 0x47, 0x27, 0x85, 0x52, 0x2e, 0x9f, 0x63, 0x3c, 0x90, 0x5e, 0x3b, 0x87, 0x5c, 0x3b, 0x71, 0x4d, 0x30, 0x97, 0x71, 0x53, 0xe0, 0xb4, 0x94, 0xd2, 0xa4, 0x80, 0xd4, 0xa3, 0x7a, 0xc7, 0x9a, 0x6f, 0xcb, 0x9e, 0x73, 0xe2, 0xb7, 0x8e, 0xd9, 0xa9, 0x7e, 0xd5, 0xa2, 0x75, 0xd1, 0x9e, 0x71, 0xcf, 0x99, 0x6b, 0xc8, 0x92, 0x64, 0xc2, 0x8b, 0x5f, 0xbd, 0x86, 0x5a, 0xad, 0x71, 0x44, 0xad, 0x73, 0x4a, 0xbb, 0x82, 0x59, 0xa3, 0x6e, 0x42, 0x9e, 0x70, 0x48, 0xb1, 0x83, 0x5c, 0x94, 0x69, 0x45, 0x68, 0x50, 0x39, 0x46, 0x2f, 0x1c, 0xb7, 0x82, 0x56, 0xbd, 0x87, 0x5e, 0x77, 0x55, 0x37, 0x8a, 0x62, 0x3f, 0xac, 0x77, 0x4d, 0xac, 0x72, 0x44, 0xa5, 0x6f, 0x46, 0xac, 0x78, 0x53, 0xce, 0x97, 0x6b, 0xd9, 0xa2, 0x77, 0xe2, 0xb3, 0x8a, 0xdd, 0xa9, 0x7d, 0xd8, 0xa3, 0x77, 0xc7, 0x92, 0x66, 0xe3, 0xae, 0x84, 0xde, 0xa9, 0x7f, 0xe0, 0xae, 0x84, 0xf3, 0xc6, 0x9f, 0xe0, 0xb5, 0x90, 0xa0, 0x73, 0x53, 0x81, 0x55, 0x39, 0x87, 0x5a, 0x35, 0x8b, 0x5b, 0x31, 0x8d, 0x58, 0x2f, 0xb1, 0x74, 0x44, 0xb8, 0x7f, 0x53, 0xbf, 0x8c, 0x64, 0xbd, 0x8b, 0x62, 0xa1, 0x75, 0x51, 0x9c, 0x6d, 0x48, 0x8a, 0x5f, 0x3e, 0x93, 0x67, 0x47, 0x8e, 0x61, 0x42, 0x81, 0x50, 0x30, 0x9f, 0x65, 0x3d, 0xbe, 0x7e, 0x50, 0xc9, 0x7f, 0x53, 0xa7, 0x6d, 0x43, 0x74, 0x59, 0x3f, 0x88, 0x72, 0x63, 0x94, 0x8a, 0x7c, 0xb1, 0xab, 0xa0, 0xcd, 0xc7, 0xbf, 0xd9, 0xd7, 0xd2, 0xdd, 0xdc, 0xd8, 0xf6, 0xf5, 0xf2, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xe7, 0xe7, 0xe7, 0xc5, 0xc4, 0xc1, 0x8c, 0x8b, 0x88, 0x78, 0x73, 0x6e, 0x43, 0x3c, 0x36, 0x2f, 0x27, 0x22, 0x2c, 0x23, 0x1e, 0x2f, 0x24, 0x1e, 0x2e, 0x1d, 0x15, 0x2b, 0x1a, 0x12, 0x28, 0x17, 0x10, 0x26, 0x17, 0x12, 0x51, 0x34, 0x20, 0x90, 0x5d, 0x3c, 0x8f, 0x63, 0x44, 0x75, 0x4e, 0x32, 0x6c, 0x46, 0x2a, 0x77, 0x51, 0x34, 0x78, 0x54, 0x38, 0x78, 0x53, 0x35, 0xa2, 0x73, 0x4e, 0x93, 0x67, 0x44, 0x86, 0x58, 0x34, 0x60, 0x38, 0x20, 0x4e, 0x2e, 0x1a, 0x44, 0x29, 0x16, 0x39, 0x20, 0x0f, 0x74, 0x4e, 0x33, 0x74, 0x4a, 0x2f, 0x60, 0x3c, 0x22, 0x86, 0x6a, 0x4a, 0xca, 0x9f, 0x7b, 0xe4, 0xb7, 0x8e, 0xe1, 0xb3, 0x8e, 0xcd, 0x9c, 0x73, 0xc3, 0x95, 0x6e, 0xcd, 0x9f, 0x78, 0xe0, 0xb1, 0x8a, 0xc6, 0x92, 0x68, 0xd0, 0x97, 0x69, 0xcc, 0x94, 0x65, 0xd8, 0xa1, 0x73, 0xd1, 0x9a, 0x6d, 0xdc, 0xa2, 0x74, 0xcd, 0x93, 0x65, 0xb9, 0x7d, 0x4f, 0xa4, 0x6a, 0x41, 0x9c, 0x62, 0x3d, 0xa9, 0x73, 0x4d, 0xa6, 0x77, 0x4f, 0xb3, 0x82, 0x58, 0xb2, 0x80, 0x56, 0x88, 0x61, 0x3e, 0x64, 0x43, 0x26, 0xaa, 0x7a, 0x50, 0xa6, 0x72, 0x4d, 0x91, 0x63, 0x3d, 0x95, 0x6a, 0x43, 0x9d, 0x68, 0x3e, 0xac, 0x72, 0x44, 0xb7, 0x7c, 0x51, 0xb2, 0x7c, 0x53, 0xb5, 0x7e, 0x53, 0xce, 0x97, 0x6c, 0xda, 0xa6, 0x7b, 0xdc, 0xa6, 0x76, 0xe5, 0xb0, 0x84, 0xde, 0xa9, 0x7d, 0xc8, 0x93, 0x68, 0xce, 0x98, 0x6e, 0xdb, 0xa6, 0x7a, 0xe8, 0xb7, 0x8d, 0xe7, 0xba, 0x94, 0xe0, 0xb4, 0x90, 0xa3, 0x77, 0x55, 0x6e, 0x43, 0x28, 0x76, 0x4c, 0x31, 0x82, 0x55, 0x32, 0xa5, 0x70, 0x46, 0xc4, 0x8a, 0x5b, 0xd6, 0x9b, 0x6d, 0xe8, 0xad, 0x77, 0xe7, 0xab, 0x73, 0xd8, 0x98, 0x63, 0xcc, 0x91, 0x5e, 0xc7, 0x91, 0x64, 0xca, 0x94, 0x67, 0xb8, 0x7f, 0x54, 0xb3, 0x76, 0x49, 0xae, 0x6f, 0x43, 0x79, 0x4d, 0x2f, 0x60, 0x43, 0x2c, 0x7b, 0x5d, 0x45, 0x82, 0x65, 0x50, 0x9e, 0x8b, 0x7d, 0xae, 0xa4, 0x9a, 0xd5, 0xce, 0xc7, 0xe0, 0xde, 0xd9, 0xd2, 0xd1, 0xcd, 0xee, 0xed, 0xea, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf3, 0xf3, 0xf2, 0xda, 0xdb, 0xd9, 0xb9, 0xb8, 0xb5, 0xa1, 0x9c, 0x9a, 0x4a, 0x44, 0x42, 0x3d, 0x35, 0x32, 0x36, 0x2b, 0x26, 0x2b, 0x1e, 0x1b, 0x2d, 0x20, 0x1b, 0x31, 0x1f, 0x18, 0x2f, 0x1b, 0x11, 0x25, 0x14, 0x0e, 0x1c, 0x13, 0x12, 0x37, 0x24, 0x17, 0x56, 0x38, 0x20, 0x82, 0x57, 0x36, 0x98, 0x69, 0x47, 0x83, 0x5b, 0x39, 0xa3, 0x6e, 0x46, 0xbb, 0x87, 0x54, 0xc3, 0x85, 0x54, 0xbf, 0x85, 0x55, 0xb6, 0x7f, 0x56, 0x93, 0x62, 0x41, 0x6b, 0x44, 0x28, 0x50, 0x2e, 0x19, 0x39, 0x1b, 0x0b, 0x46, 0x28, 0x14, 0x61, 0x41, 0x28, 0x55, 0x37, 0x1f, 0x90, 0x6f, 0x53, 0xbd, 0x96, 0x73, 0xd3, 0xa6, 0x7f, 0xce, 0xa0, 0x78, 0xc8, 0x9a, 0x76, 0xcd, 0x9e, 0x78, 0xc4, 0x9a, 0x72, 0xb9, 0x8b, 0x68, 0xd1, 0x9d, 0x75, 0xcb, 0x96, 0x6d, 0xcf, 0x95, 0x67, 0xd4, 0x99, 0x6c, 0xd7, 0x9f, 0x72, 0xd1, 0x99, 0x6c, 0xc5, 0x8a, 0x5a, 0xc3, 0x87, 0x5b, 0xb6, 0x7a, 0x4e, 0xb2, 0x7a, 0x52, 0xa9, 0x70, 0x4a, 0x9c, 0x66, 0x3f, 0xb6, 0x83, 0x59, 0xb6, 0x83, 0x57, 0xa7, 0x74, 0x48, 0xa5, 0x72, 0x49, 0x96, 0x6b, 0x4a, 0xbd, 0x89, 0x5e, 0xab, 0x77, 0x4f, 0xab, 0x76, 0x4e, 0x94, 0x64, 0x3f, 0xa6, 0x6d, 0x46, 0xb7, 0x76, 0x4a, 0xc2, 0x82, 0x54, 0xca, 0x8f, 0x61, 0xc3, 0x8b, 0x5f, 0xc5, 0x8d, 0x61, 0xd6, 0xa0, 0x72, 0xe1, 0xab, 0x7f, 0xeb, 0xb6, 0x8a, 0xda, 0xa3, 0x74, 0xc8, 0x93, 0x67, 0xcf, 0x9d, 0x73, 0xdb, 0xa9, 0x7f, 0xd6, 0xa4, 0x7a, 0xe7, 0xb8, 0x91, 0xe3, 0xb7, 0x90, 0xd0, 0xa3, 0x7b, 0xa4, 0x78, 0x55, 0x79, 0x52, 0x32, 0x84, 0x57, 0x34, 0xb2, 0x7f, 0x57, 0xd4, 0x98, 0x68, 0xe0, 0x9f, 0x6a, 0xe3, 0xa4, 0x6d, 0xe8, 0xa7, 0x6e, 0xe0, 0x9e, 0x68, 0xd4, 0x94, 0x5e, 0xda, 0x98, 0x5f, 0xda, 0x97, 0x5f, 0xd3, 0x97, 0x68, 0xa7, 0x74, 0x45, 0x84, 0x54, 0x32, 0x6f, 0x4c, 0x33, 0x77, 0x4f, 0x37, 0x83, 0x59, 0x3d, 0x84, 0x62, 0x4a, 0x87, 0x6d, 0x5c, 0x8f, 0x7d, 0x6f, 0xab, 0xa1, 0x98, 0xcc, 0xc7, 0xc4, 0xe2, 0xe0, 0xdd, 0xe9, 0xeb, 0xe5, 0xf9, 0xf9, 0xf8, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xe9, 0xea, 0xe8, 0xdc, 0xdc, 0xda, 0xac, 0xab, 0xa8, 0x64, 0x5e, 0x5c, 0x40, 0x38, 0x36, 0x3b, 0x30, 0x2a, 0x3b, 0x2c, 0x25, 0x31, 0x21, 0x1b, 0x2e, 0x1f, 0x18, 0x2d, 0x1a, 0x14, 0x30, 0x1a, 0x10, 0x22, 0x11, 0x0a, 0x21, 0x13, 0x0d, 0x21, 0x17, 0x10, 0x52, 0x38, 0x22, 0x8c, 0x63, 0x40, 0xac, 0x79, 0x4d, 0xcb, 0x94, 0x64, 0xd6, 0x93, 0x62, 0xd6, 0x94, 0x5f, 0xd1, 0x8e, 0x59, 0xbe, 0x7e, 0x4b, 0xb2, 0x76, 0x4b, 0xa4, 0x6d, 0x46, 0x82, 0x54, 0x33, 0x64, 0x3f, 0x22, 0x54, 0x33, 0x19, 0x4d, 0x2f, 0x14, 0x6c, 0x4c, 0x2c, 0x9c, 0x76, 0x51, 0xcc, 0x9c, 0x74, 0xd9, 0xa9, 0x80, 0xd3, 0xa5, 0x7f, 0xd7, 0xa9, 0x83, 0xb8, 0x89, 0x65, 0xbc, 0x8e, 0x6a, 0xb6, 0x89, 0x69, 0xab, 0x79, 0x58, 0xc5, 0x91, 0x65, 0xde, 0xa9, 0x7d, 0xce, 0x93, 0x67, 0xd2, 0x97, 0x6b, 0xcc, 0x91, 0x62, 0xc4, 0x89, 0x5a, 0xbe, 0x84, 0x53, 0xbc, 0x80, 0x56, 0xb3, 0x78, 0x4c, 0xb0, 0x7a, 0x51, 0xad, 0x76, 0x50, 0x98, 0x65, 0x3e, 0xc0, 0x8f, 0x66, 0xaf, 0x7c, 0x53, 0xa0, 0x6d, 0x45, 0xae, 0x79, 0x50, 0x8f, 0x64, 0x42, 0xbd, 0x86, 0x5a, 0xaa, 0x74, 0x4a, 0xa0, 0x6a, 0x45, 0x96, 0x65, 0x42, 0xa6, 0x6f, 0x48, 0xbc, 0x7d, 0x50, 0xc6, 0x84, 0x57, 0xd4, 0x98, 0x68, 0xcc, 0x90, 0x62, 0xd5, 0x9a, 0x6b, 0xca, 0x90, 0x62, 0xdb, 0xa6, 0x7c, 0xe4, 0xaf, 0x83, 0xdf, 0xa7, 0x78, 0xd0, 0x98, 0x69, 0xe0, 0xac, 0x80, 0xdd, 0xab, 0x82, 0xdc, 0xab, 0x81, 0xdd, 0xaf, 0x87, 0xee, 0xc3, 0x9b, 0xe9, 0xbb, 0x94, 0xc6, 0x96, 0x70, 0xa2, 0x73, 0x4e, 0xab, 0x79, 0x52, 0xc7, 0x91, 0x67, 0xe1, 0xae, 0x80, 0xe2, 0xaa, 0x7a, 0xe1, 0xa3, 0x75, 0xd6, 0x98, 0x69, 0xd3, 0x8e, 0x5c, 0xd0, 0x8c, 0x5a, 0xcd, 0x89, 0x52, 0xd2, 0x8e, 0x57, 0xe3, 0x9e, 0x68, 0xc0, 0x89, 0x57, 0x70, 0x4f, 0x2f, 0x59, 0x3e, 0x24, 0x76, 0x55, 0x32, 0x7d, 0x5b, 0x3e, 0x93, 0x70, 0x57, 0x9a, 0x7a, 0x64, 0x9d, 0x82, 0x6f, 0xa2, 0x91, 0x83, 0xbf, 0xb5, 0xad, 0xda, 0xd6, 0xcf, 0xe9, 0xe9, 0xe4, 0xf6, 0xf6, 0xf4, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xd7, 0xd8, 0xd6, 0xd8, 0xd8, 0xd6, 0x94, 0x92, 0x8f, 0x52, 0x4b, 0x49, 0x3e, 0x34, 0x2f, 0x3d, 0x2e, 0x26, 0x3a, 0x29, 0x1e, 0x31, 0x1f, 0x15, 0x2a, 0x19, 0x10, 0x28, 0x15, 0x0e, 0x30, 0x1a, 0x10, 0x25, 0x12, 0x0b, 0x39, 0x22, 0x14, 0x36, 0x22, 0x0f, 0x44, 0x27, 0x15, 0xa0, 0x78, 0x51, 0xdb, 0xa1, 0x6d, 0xd5, 0x98, 0x64, 0xc6, 0x86, 0x56, 0xb4, 0x73, 0x47, 0xb1, 0x75, 0x45, 0xb2, 0x7a, 0x4d, 0x92, 0x5e, 0x38, 0x90, 0x5f, 0x3c, 0x74, 0x4c, 0x2e, 0x5d, 0x37, 0x1d, 0x58, 0x33, 0x1b, 0x7e, 0x56, 0x3a, 0xbc, 0x8c, 0x64, 0xc8, 0x90, 0x63, 0xc1, 0x8f, 0x65, 0xdf, 0xb2, 0x8b, 0xc2, 0x94, 0x6e, 0xd0, 0xa2, 0x7c, 0xb7, 0x89, 0x64, 0xbd, 0x8f, 0x6a, 0xd4, 0xa4, 0x7e, 0xd0, 0x9c, 0x6c, 0xd5, 0xa0, 0x6f, 0xcf, 0x9a, 0x6a, 0xbc, 0x82, 0x56, 0xbe, 0x83, 0x57, 0xbd, 0x7f, 0x4e, 0xc5, 0x87, 0x56, 0xcb, 0x91, 0x61, 0xc6, 0x8a, 0x60, 0xc3, 0x89, 0x5d, 0xa3, 0x6e, 0x45, 0xa5, 0x70, 0x4d, 0x98, 0x67, 0x44, 0x9e, 0x6e, 0x49, 0x8c, 0x57, 0x32, 0xa4, 0x71, 0x4b, 0xb0, 0x7c, 0x52, 0x75, 0x4b, 0x28, 0xb9, 0x82, 0x56, 0x9b, 0x65, 0x3b, 0x9c, 0x67, 0x41, 0x8f, 0x5f, 0x3b, 0x9e, 0x6b, 0x43, 0xbc, 0x81, 0x52, 0xc6, 0x86, 0x57, 0xd6, 0x9a, 0x6a, 0xcd, 0x8f, 0x5e, 0xd4, 0x96, 0x65, 0xc0, 0x82, 0x56, 0xb6, 0x7d, 0x54, 0xcd, 0x98, 0x6c, 0xdb, 0xa3, 0x72, 0xdf, 0xa3, 0x72, 0xe7, 0xb0, 0x82, 0xe1, 0xaf, 0x85, 0xe2, 0xb1, 0x88, 0xe0, 0xb1, 0x89, 0xef, 0xc4, 0x9d, 0xe4, 0xb6, 0x8f, 0xd9, 0xa5, 0x7d, 0xb7, 0x7f, 0x52, 0xb2, 0x7c, 0x52, 0xd2, 0x98, 0x6b, 0xe4, 0xb0, 0x7e, 0xef, 0xb6, 0x80, 0xf1, 0xbb, 0x89, 0xe8, 0xb2, 0x80, 0xdc, 0xa3, 0x70, 0xdc, 0xa4, 0x71, 0xdc, 0x9d, 0x68, 0xde, 0x9f, 0x6b, 0xd5, 0x94, 0x5d, 0xb7, 0x85, 0x5a, 0x62, 0x41, 0x2b, 0x6b, 0x4a, 0x35, 0x72, 0x4b, 0x30, 0x83, 0x5b, 0x3d, 0x97, 0x6d, 0x4d, 0xa8, 0x7f, 0x63, 0xa9, 0x89, 0x71, 0xa6, 0x8e, 0x7b, 0xb4, 0xa6, 0x96, 0xb3, 0xab, 0xa1, 0xed, 0xea, 0xe8, 0xf6, 0xf6, 0xf3, 0xfa, 0xfb, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf1, 0xf1, 0xf1, 0xcf, 0xcd, 0xcc, 0xac, 0xa5, 0xa2, 0x5e, 0x58, 0x50, 0x41, 0x37, 0x30, 0x4d, 0x3e, 0x38, 0x46, 0x35, 0x2f, 0x34, 0x23, 0x1d, 0x31, 0x20, 0x19, 0x28, 0x18, 0x11, 0x25, 0x12, 0x0b, 0x45, 0x2f, 0x24, 0x44, 0x30, 0x24, 0x34, 0x21, 0x11, 0x79, 0x5d, 0x45, 0x8a, 0x65, 0x46, 0xa4, 0x7a, 0x59, 0xb2, 0x80, 0x58, 0xad, 0x78, 0x4f, 0x98, 0x63, 0x3f, 0x9c, 0x6c, 0x4a, 0xad, 0x76, 0x4d, 0xb3, 0x7c, 0x4d, 0xbd, 0x87, 0x58, 0x9f, 0x6b, 0x46, 0x86, 0x5c, 0x38, 0x84, 0x5e, 0x3a, 0x8d, 0x63, 0x3d, 0xac, 0x7a, 0x51, 0xbf, 0x8a, 0x5f, 0xd3, 0x9f, 0x74, 0xe0, 0xaf, 0x84, 0xc6, 0x99, 0x74, 0xae, 0x7f, 0x5d, 0xc1, 0x8f, 0x6b, 0xca, 0x99, 0x70, 0xe1, 0xb0, 0x87, 0xe0, 0xaa, 0x7b, 0xd8, 0x9f, 0x6c, 0xd5, 0x99, 0x67, 0xc3, 0x8c, 0x5e, 0xaa, 0x73, 0x47, 0xbc, 0x7f, 0x4f, 0xd2, 0x94, 0x63, 0xc0, 0x82, 0x51, 0xca, 0x8f, 0x63, 0xc9, 0x8e, 0x62, 0xbb, 0x86, 0x58, 0xa6, 0x71, 0x47, 0x9b, 0x66, 0x44, 0x8e, 0x59, 0x36, 0x9a, 0x67, 0x3f, 0xad, 0x77, 0x4c, 0xb1, 0x79, 0x4e, 0xb6, 0x80, 0x56, 0x74, 0x4e, 0x2d, 0xb2, 0x7b, 0x4f, 0xb3, 0x7e, 0x54, 0xa0, 0x6f, 0x48, 0x91, 0x60, 0x39, 0x97, 0x61, 0x3c, 0xb5, 0x7b, 0x4e, 0xcb, 0x91, 0x60, 0xe0, 0xa6, 0x76, 0xd2, 0x97, 0x68, 0xbe, 0x7f, 0x4d, 0xbb, 0x7f, 0x52, 0xa8, 0x6c, 0x3f, 0xb0, 0x73, 0x48, 0xca, 0x8e, 0x5f, 0xe1, 0xa1, 0x70, 0xeb, 0xb3, 0x82, 0xe6, 0xb1, 0x83, 0xe9, 0xb5, 0x8a, 0xde, 0xaf, 0x86, 0xdf, 0xb4, 0x8e, 0xdf, 0xac, 0x81, 0xd7, 0xa3, 0x78, 0xbb, 0x84, 0x55, 0xb5, 0x79, 0x4f, 0xcd, 0x8c, 0x5e, 0xe6, 0xaa, 0x78, 0xe4, 0xa8, 0x77, 0xe9, 0xaa, 0x77, 0xef, 0xb0, 0x7c, 0xde, 0x9d, 0x68, 0xdf, 0x9f, 0x6a, 0xe0, 0x9f, 0x6a, 0xe2, 0xa5, 0x73, 0xd3, 0x99, 0x67, 0xba, 0x8d, 0x65, 0x72, 0x4f, 0x30, 0x6e, 0x4b, 0x2f, 0x6d, 0x4b, 0x31, 0x7a, 0x54, 0x37, 0x89, 0x5f, 0x3f, 0x9c, 0x71, 0x52, 0xaf, 0x91, 0x7d, 0xc5, 0xae, 0x9c, 0xb9, 0xaa, 0x9b, 0xcc, 0xc2, 0xb6, 0xc8, 0xc1, 0xb9, 0xed, 0xe9, 0xe3, 0xfc, 0xfc, 0xfa, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf7, 0xf7, 0xf7, 0xbf, 0xbd, 0xbc, 0x9b, 0x94, 0x91, 0x62, 0x59, 0x53, 0x5b, 0x4c, 0x48, 0x54, 0x40, 0x39, 0x41, 0x2d, 0x23, 0x34, 0x21, 0x18, 0x29, 0x18, 0x11, 0x26, 0x15, 0x0f, 0x25, 0x12, 0x0c, 0x31, 0x1b, 0x10, 0x4b, 0x33, 0x1f, 0x50, 0x38, 0x21, 0x86, 0x66, 0x48, 0xa6, 0x7d, 0x58, 0xb6, 0x85, 0x5e, 0xb6, 0x84, 0x5c, 0xad, 0x77, 0x53, 0xa8, 0x74, 0x4b, 0xab, 0x77, 0x4c, 0xb0, 0x7b, 0x50, 0xc1, 0x86, 0x54, 0xc9, 0x8e, 0x5d, 0xce, 0x96, 0x64, 0xb8, 0x7f, 0x53, 0xb2, 0x79, 0x4e, 0xaf, 0x77, 0x4f, 0xa2, 0x6d, 0x47, 0xa8, 0x72, 0x4e, 0xd1, 0x9c, 0x75, 0xdf, 0xae, 0x85, 0xd1, 0xa4, 0x7e, 0xc1, 0x93, 0x6d, 0xba, 0x89, 0x5f, 0xd7, 0xa3, 0x76, 0xda, 0xa6, 0x79, 0xda, 0xa0, 0x72, 0xda, 0x9c, 0x6a, 0xce, 0x92, 0x60, 0xaf, 0x78, 0x4a, 0xbd, 0x81, 0x51, 0xcf, 0x8f, 0x5d, 0xd8, 0x9a, 0x68, 0xb9, 0x7b, 0x4a, 0xce, 0x93, 0x67, 0xd2, 0x97, 0x6b, 0xc9, 0x90, 0x5f, 0xae, 0x74, 0x48, 0x91, 0x5b, 0x36, 0x9f, 0x6b, 0x43, 0xb5, 0x80, 0x55, 0xc4, 0x8b, 0x5d, 0xba, 0x7f, 0x4f, 0xb4, 0x7e, 0x53, 0x66, 0x41, 0x26, 0xaf, 0x7c, 0x54, 0xa9, 0x79, 0x52, 0xa4, 0x70, 0x46, 0x9c, 0x68, 0x3f, 0xa3, 0x6e, 0x46, 0xb7, 0x7d, 0x4d, 0xcb, 0x91, 0x61, 0xe1, 0xa7, 0x77, 0xe0, 0xaa, 0x7e, 0xb9, 0x7d, 0x4e, 0xc6, 0x86, 0x56, 0xc4, 0x83, 0x54, 0xc2, 0x80, 0x56, 0xd7, 0x97, 0x68, 0xd0, 0x91, 0x61, 0xe4, 0xa6, 0x71, 0xe3, 0xa8, 0x75, 0xef, 0xb8, 0x8a, 0xed, 0xb9, 0x8d, 0xdf, 0xb3, 0x8e, 0xe7, 0xb9, 0x93, 0xdd, 0xae, 0x85, 0xb9, 0x84, 0x58, 0xbc, 0x81, 0x57, 0xb8, 0x78, 0x49, 0xd3, 0x93, 0x62, 0xdd, 0x9c, 0x6c, 0xe8, 0xaa, 0x75, 0xe1, 0xa3, 0x6f, 0xe0, 0x9f, 0x68, 0xdb, 0x9a, 0x63, 0xdb, 0x9b, 0x65, 0xda, 0x9f, 0x6c, 0xda, 0xa5, 0x76, 0xd3, 0xa4, 0x78, 0xcb, 0xa1, 0x75, 0x9d, 0x72, 0x4c, 0x92, 0x66, 0x43, 0x7e, 0x55, 0x35, 0x81, 0x5b, 0x3f, 0x9f, 0x74, 0x55, 0xb0, 0x8f, 0x75, 0xb9, 0xa3, 0x91, 0xc8, 0xba, 0xb1, 0xd9, 0xd2, 0xca, 0xde, 0xdb, 0xd5, 0xd3, 0xcf, 0xca, 0xf3, 0xf3, 0xf1, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf7, 0xf7, 0xf5, 0xe8, 0xe9, 0xe7, 0xb8, 0xbb, 0xb6, 0x87, 0x81, 0x7b, 0x67, 0x5a, 0x55, 0x59, 0x47, 0x41, 0x3d, 0x2b, 0x21, 0x34, 0x23, 0x17, 0x33, 0x21, 0x17, 0x31, 0x1c, 0x15, 0x29, 0x14, 0x0d, 0x25, 0x12, 0x0a, 0x31, 0x1e, 0x16, 0x4f, 0x32, 0x1b, 0xa7, 0x7d, 0x5c, 0xbb, 0x8d, 0x66, 0xc4, 0x91, 0x66, 0xc4, 0x8f, 0x63, 0xba, 0x86, 0x59, 0xbc, 0x88, 0x59, 0xc5, 0x8c, 0x5a, 0xcd, 0x8f, 0x5c, 0xcd, 0x8f, 0x5c, 0xc8, 0x84, 0x54, 0xcc, 0x88, 0x58, 0xc4, 0x7e, 0x4b, 0xc0, 0x80, 0x51, 0xaa, 0x6d, 0x41, 0xad, 0x72, 0x4c, 0xad, 0x75, 0x4c, 0xb6, 0x81, 0x58, 0xcb, 0x9a, 0x72, 0xcf, 0x9e, 0x77, 0xbe, 0x8d, 0x67, 0xac, 0x7b, 0x57, 0xbe, 0x8b, 0x62, 0xde, 0xa8, 0x7f, 0xc9, 0x96, 0x63, 0xd0, 0x98, 0x6c, 0xc0, 0x88, 0x5c, 0xcb, 0x95, 0x67, 0xb6, 0x7f, 0x51, 0xd2, 0x96, 0x63, 0xce, 0x8e, 0x5c, 0xcd, 0x8f, 0x5d, 0xb0, 0x74, 0x47, 0xd5, 0xa0, 0x74, 0xd6, 0x9e, 0x6e, 0xd1, 0x95, 0x65, 0xb8, 0x7c, 0x4c, 0xa5, 0x6e, 0x44, 0xa0, 0x6c, 0x43, 0xb1, 0x79, 0x4c, 0xc6, 0x8b, 0x5e, 0xb1, 0x78, 0x4e, 0xa8, 0x74, 0x4c, 0x81, 0x55, 0x30, 0xac, 0x7a, 0x53, 0xc3, 0x88, 0x5c, 0xa9, 0x72, 0x47, 0xa9, 0x72, 0x46, 0xa2, 0x6f, 0x43, 0xab, 0x78, 0x4b, 0xcd, 0x97, 0x65, 0xdf, 0xa9, 0x77, 0xe4, 0xb1, 0x82, 0xcc, 0x91, 0x65, 0xc2, 0x86, 0x52, 0xcb, 0x86, 0x55, 0xc9, 0x87, 0x58, 0xc9, 0x87, 0x58, 0xc5, 0x85, 0x56, 0xd1, 0x92, 0x62, 0xdc, 0x9b, 0x65, 0xe4, 0xa7, 0x73, 0xed, 0xb4, 0x84, 0xe4, 0xaf, 0x82, 0xe5, 0xb5, 0x8d, 0xe2, 0xb4, 0x8e, 0xe3, 0xb1, 0x87, 0xca, 0x8f, 0x63, 0xaf, 0x6b, 0x3d, 0xbb, 0x79, 0x48, 0xd2, 0x8d, 0x58, 0xe3, 0xa4, 0x6f, 0xef, 0xb0, 0x7b, 0xee, 0xb2, 0x7c, 0xe6, 0xae, 0x77, 0xdb, 0x9b, 0x67, 0xdb, 0x9b, 0x67, 0xe6, 0xa9, 0x79, 0xe9, 0xb3, 0x81, 0xec, 0xb8, 0x85, 0xd8, 0xa7, 0x79, 0xae, 0x7c, 0x52, 0x9a, 0x68, 0x3f, 0x95, 0x67, 0x3f, 0x93, 0x66, 0x3f, 0xb1, 0x87, 0x66, 0xd6, 0xc3, 0xb2, 0xd5, 0xc7, 0xb7, 0xd2, 0xc4, 0xbb, 0xeb, 0xea, 0xe4, 0xe9, 0xe6, 0xe2, 0xf5, 0xf5, 0xf3, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf5, 0xf5, 0xf3, 0xd5, 0xd6, 0xd3, 0xae, 0xad, 0xa9, 0x8b, 0x81, 0x7c, 0x5a, 0x4d, 0x45, 0x52, 0x41, 0x37, 0x49, 0x33, 0x28, 0x47, 0x31, 0x26, 0x3c, 0x27, 0x1c, 0x2e, 0x19, 0x0e, 0x28, 0x14, 0x0a, 0x2c, 0x19, 0x12, 0x31, 0x1e, 0x16, 0x7a, 0x5b, 0x3c, 0xb2, 0x86, 0x5d, 0xc7, 0x94, 0x6a, 0xcf, 0x99, 0x6c, 0xc3, 0x8e, 0x62, 0xba, 0x85, 0x59, 0xb0, 0x7b, 0x52, 0xc1, 0x87, 0x5c, 0xcb, 0x8d, 0x5a, 0xbc, 0x7f, 0x4c, 0xc6, 0x87, 0x52, 0xba, 0x7a, 0x46, 0xb0, 0x73, 0x44, 0xb4, 0x76, 0x48, 0xb0, 0x73, 0x46, 0xa3, 0x68, 0x41, 0xa7, 0x6e, 0x49, 0x91, 0x5b, 0x37, 0x98, 0x67, 0x45, 0xb3, 0x85, 0x60, 0xa8, 0x7a, 0x56, 0x9e, 0x70, 0x4b, 0xb9, 0x85, 0x5d, 0xc4, 0x8f, 0x65, 0xbe, 0x89, 0x61, 0xc4, 0x8a, 0x5b, 0xc2, 0x87, 0x59, 0xb9, 0x81, 0x53, 0xba, 0x82, 0x54, 0xba, 0x83, 0x53, 0xb4, 0x77, 0x4a, 0xc4, 0x85, 0x57, 0xd3, 0x9f, 0x72, 0xd8, 0xa3, 0x77, 0xd9, 0xa1, 0x70, 0xdd, 0xa1, 0x71, 0xcd, 0x90, 0x61, 0xad, 0x73, 0x45, 0xa7, 0x6f, 0x42, 0xaf, 0x74, 0x46, 0xb9, 0x7e, 0x51, 0xa9, 0x72, 0x46, 0xa9, 0x73, 0x48, 0xa5, 0x73, 0x4b, 0xa0, 0x6e, 0x46, 0xbc, 0x82, 0x55, 0xb5, 0x7e, 0x53, 0xb2, 0x7b, 0x4f, 0x9e, 0x65, 0x3a, 0xa8, 0x6f, 0x44, 0xbe, 0x84, 0x54, 0xd5, 0x9b, 0x6b, 0xdf, 0xa7, 0x7a, 0xe0, 0xaa, 0x7c, 0xc9, 0x8e, 0x5a, 0xc4, 0x80, 0x4f, 0xd7, 0x99, 0x68, 0xd5, 0x97, 0x66, 0xb8, 0x79, 0x4a, 0xbb, 0x7d, 0x4e, 0xca, 0x8d, 0x5d, 0xd5, 0x97, 0x67, 0xd8, 0x9c, 0x6d, 0xf3, 0xbe, 0x92, 0xe5, 0xb6, 0x8e, 0xef, 0xc0, 0x9b, 0xe1, 0xb0, 0x86, 0xb5, 0x7f, 0x55, 0xb0, 0x71, 0x46, 0xb5, 0x74, 0x46, 0xc0, 0x7a, 0x4a, 0xd0, 0x8d, 0x5a, 0xdc, 0x99, 0x66, 0xe5, 0x9e, 0x6c, 0xdd, 0x9b, 0x67, 0xde, 0x9e, 0x6a, 0xdf, 0x9f, 0x6b, 0xe0, 0xa1, 0x6d, 0xe9, 0xae, 0x78, 0xed, 0xb6, 0x81, 0xeb, 0xb7, 0x85, 0xe5, 0xb2, 0x81, 0xc8, 0x94, 0x64, 0xb2, 0x7f, 0x4a, 0xa5, 0x70, 0x45, 0xaa, 0x75, 0x51, 0xbe, 0x97, 0x7c, 0xdf, 0xce, 0xc6, 0xce, 0xc4, 0xbb, 0xdf, 0xd6, 0xcb, 0xeb, 0xe8, 0xe3, 0xf4, 0xf4, 0xf2, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xe9, 0xe9, 0xe9, 0xe4, 0xe1, 0xdf, 0xb7, 0xae, 0xab, 0x78, 0x6a, 0x64, 0x63, 0x53, 0x48, 0x4c, 0x39, 0x2d, 0x42, 0x2f, 0x24, 0x3f, 0x28, 0x1b, 0x3f, 0x25, 0x17, 0x35, 0x1f, 0x12, 0x29, 0x14, 0x08, 0x3a, 0x27, 0x18, 0x5d, 0x43, 0x2d, 0xa5, 0x7d, 0x59, 0xc7, 0x98, 0x6a, 0xd7, 0xa2, 0x75, 0xc4, 0x8e, 0x5f, 0xb8, 0x83, 0x5a, 0xb6, 0x80, 0x57, 0xc5, 0x92, 0x63, 0xc6, 0x8d, 0x5f, 0xc7, 0x8a, 0x57, 0xb3, 0x77, 0x43, 0xaf, 0x71, 0x42, 0xb5, 0x77, 0x48, 0xa2, 0x6c, 0x41, 0xab, 0x72, 0x44, 0x99, 0x61, 0x39, 0x98, 0x61, 0x3a, 0xb3, 0x7c, 0x53, 0xc0, 0x88, 0x5d, 0xba, 0x8c, 0x68, 0xac, 0x7f, 0x5c, 0xa0, 0x73, 0x50, 0xa5, 0x74, 0x4e, 0xb7, 0x81, 0x58, 0xb5, 0x83, 0x5f, 0x8b, 0x5e, 0x41, 0x7e, 0x52, 0x33, 0x79, 0x52, 0x34, 0x79, 0x4e, 0x30, 0xa9, 0x6e, 0x49, 0xc5, 0x95, 0x6a, 0xb3, 0x78, 0x4d, 0xbd, 0x83, 0x59, 0xd1, 0xa2, 0x7c, 0xe1, 0xb1, 0x8a, 0xd2, 0x9c, 0x6f, 0xd0, 0x94, 0x67, 0xc7, 0x8a, 0x5d, 0xa6, 0x6b, 0x3e, 0xb5, 0x7a, 0x4d, 0xc1, 0x87, 0x5a, 0xc6, 0x8b, 0x5d, 0xc0, 0x86, 0x54, 0xb9, 0x82, 0x51, 0xb7, 0x81, 0x56, 0xa1, 0x6c, 0x42, 0xaf, 0x77, 0x4c, 0xa5, 0x70, 0x47, 0xa1, 0x6d, 0x43, 0xb7, 0x7b, 0x4f, 0xb4, 0x77, 0x4d, 0xc4, 0x88, 0x58, 0xd8, 0x9c, 0x6c, 0xe6, 0xaa, 0x7a, 0xe7, 0xb4, 0x87, 0xd9, 0x9d, 0x69, 0xb6, 0x78, 0x4a, 0xe3, 0xa6, 0x77, 0xb1, 0x77, 0x4c, 0x62, 0x39, 0x23, 0x74, 0x4b, 0x2f, 0x8f, 0x5e, 0x3b, 0xb4, 0x78, 0x50, 0xcc, 0x93, 0x66, 0xed, 0xba, 0x8f, 0xed, 0xbd, 0x94, 0xf0, 0xc2, 0x9c, 0xe6, 0xb7, 0x8f, 0xc5, 0x90, 0x65, 0xaf, 0x73, 0x49, 0xa9, 0x6a, 0x41, 0xbc, 0x78, 0x4a, 0xd0, 0x8a, 0x59, 0xd5, 0x8f, 0x5a, 0xd0, 0x8e, 0x5a, 0xd3, 0x92, 0x5e, 0xd2, 0x93, 0x60, 0xd4, 0x94, 0x61, 0xd2, 0x94, 0x5e, 0xde, 0x9f, 0x6a, 0xe7, 0xa6, 0x73, 0xe6, 0xaf, 0x7a, 0xe6, 0xb1, 0x7c, 0xec, 0xb6, 0x81, 0xd7, 0x9f, 0x6c, 0xc4, 0x8b, 0x5c, 0xb9, 0x81, 0x54, 0xac, 0x7a, 0x53, 0xb4, 0x8d, 0x71, 0xd4, 0xc1, 0xb3, 0xdd, 0xd6, 0xcf, 0xe8, 0xe6, 0xe1, 0xed, 0xed, 0xeb, 0xf9, 0xfa, 0xf8, 0xfd, 0xfd, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xef, 0xef, 0xef, 0xbe, 0xbb, 0xb8, 0x8e, 0x8a, 0x81, 0x73, 0x5e, 0x56, 0x5a, 0x45, 0x37, 0x4e, 0x39, 0x2b, 0x4c, 0x34, 0x24, 0x47, 0x30, 0x22, 0x33, 0x1e, 0x12, 0x34, 0x1c, 0x10, 0x35, 0x1d, 0x10, 0x5c, 0x43, 0x2e, 0x85, 0x63, 0x42, 0xbf, 0x91, 0x67, 0xd5, 0xa3, 0x75, 0xc0, 0x8b, 0x5d, 0xc4, 0x8f, 0x61, 0xce, 0x99, 0x6e, 0xc9, 0x94, 0x68, 0xc0, 0x8b, 0x5a, 0xb6, 0x7b, 0x4c, 0xb3, 0x76, 0x4a, 0xac, 0x6f, 0x43, 0xb3, 0x75, 0x44, 0xbb, 0x7d, 0x4c, 0xb9, 0x79, 0x4e, 0x8f, 0x58, 0x34, 0x92, 0x5e, 0x39, 0xa0, 0x68, 0x3f, 0xb3, 0x7c, 0x51, 0xb2, 0x79, 0x4d, 0xa8, 0x7a, 0x57, 0xa9, 0x7c, 0x59, 0x95, 0x68, 0x45, 0xa2, 0x71, 0x4e, 0xa3, 0x6e, 0x47, 0x95, 0x64, 0x3d, 0x77, 0x4e, 0x2e, 0x55, 0x37, 0x25, 0x57, 0x3c, 0x28, 0x53, 0x38, 0x1c, 0x79, 0x52, 0x2e, 0xb4, 0x84, 0x5b, 0x96, 0x67, 0x41, 0xdc, 0xac, 0x80, 0xe0, 0xb8, 0x93, 0xe3, 0xb5, 0x90, 0xcb, 0x97, 0x6b, 0xd4, 0x97, 0x6b, 0xb6, 0x79, 0x4e, 0xb1, 0x75, 0x49, 0xb8, 0x7d, 0x51, 0xbe, 0x86, 0x59, 0xcb, 0x91, 0x62, 0xc8, 0x8d, 0x5a, 0xc4, 0x8d, 0x5d, 0xb7, 0x82, 0x55, 0xb1, 0x7a, 0x4f, 0xb8, 0x81, 0x55, 0xac, 0x75, 0x4a, 0xbd, 0x86, 0x5b, 0xcb, 0x8f, 0x5e, 0xb9, 0x7d, 0x4f, 0xbb, 0x7f, 0x4f, 0xd9, 0x9c, 0x6d, 0xdf, 0xa4, 0x72, 0xeb, 0xb7, 0x8c, 0xd8, 0xa5, 0x7b, 0xa8, 0x6f, 0x42, 0xb6, 0x83, 0x59, 0x57, 0x2e, 0x0b, 0x5c, 0x3c, 0x24, 0x36, 0x1e, 0x08, 0x51, 0x32, 0x19, 0x8f, 0x5a, 0x38, 0xb7, 0x7e, 0x50, 0xd5, 0x9b, 0x6b, 0xd8, 0xa3, 0x76, 0xe1, 0xb3, 0x8d, 0xf2, 0xc3, 0x9c, 0xc7, 0x92, 0x66, 0xac, 0x70, 0x46, 0xa4, 0x66, 0x3d, 0xad, 0x6b, 0x3d, 0xc1, 0x7b, 0x4b, 0xd4, 0x8f, 0x59, 0xd9, 0x95, 0x5f, 0xe2, 0x9e, 0x68, 0xda, 0x99, 0x66, 0xd7, 0x96, 0x62, 0xd3, 0x91, 0x5e, 0xcd, 0x8e, 0x59, 0xd6, 0x96, 0x64, 0xde, 0xa5, 0x70, 0xe7, 0xb2, 0x7d, 0xe9, 0xb3, 0x7f, 0xd3, 0x9b, 0x67, 0xc1, 0x87, 0x58, 0xc6, 0x8e, 0x5e, 0xc0, 0x8d, 0x5d, 0xb6, 0x89, 0x62, 0xb8, 0x9d, 0x88, 0xdd, 0xd4, 0xcd, 0xef, 0xec, 0xe7, 0xf5, 0xf6, 0xf4, 0xf8, 0xf9, 0xf7, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf7, 0xf7, 0xf7, 0xe9, 0xe9, 0xe9, 0xbb, 0xb8, 0xb5, 0x88, 0x78, 0x6f, 0x64, 0x4e, 0x41, 0x63, 0x4c, 0x3a, 0x5a, 0x41, 0x30, 0x4b, 0x35, 0x26, 0x3d, 0x27, 0x18, 0x3c, 0x23, 0x14, 0x36, 0x1e, 0x12, 0x3f, 0x27, 0x18, 0x6a, 0x4a, 0x2d, 0xaf, 0x86, 0x5e, 0xd0, 0x9f, 0x70, 0xbb, 0x85, 0x59, 0xc8, 0x94, 0x65, 0xd4, 0x9f, 0x71, 0xd1, 0x9d, 0x6d, 0xc3, 0x8e, 0x5e, 0xd3, 0x98, 0x66, 0xd4, 0x95, 0x65, 0xc1, 0x85, 0x53, 0xbf, 0x83, 0x51, 0xce, 0x90, 0x5f, 0xb4, 0x76, 0x46, 0xa2, 0x68, 0x3d, 0xa2, 0x6b, 0x40, 0xb0, 0x79, 0x4f, 0xae, 0x72, 0x47, 0xb0, 0x78, 0x4c, 0xc4, 0x8c, 0x60, 0xae, 0x80, 0x5c, 0x9c, 0x6f, 0x4d, 0x94, 0x68, 0x47, 0x92, 0x65, 0x44, 0x96, 0x64, 0x41, 0x64, 0x3f, 0x1f, 0x3e, 0x23, 0x0b, 0x31, 0x13, 0x02, 0x34, 0x11, 0x00, 0x1c, 0x09, 0x07, 0x20, 0x10, 0x0a, 0x5f, 0x3b, 0x24, 0x84, 0x58, 0x33, 0xaf, 0x7b, 0x52, 0xd4, 0xa6, 0x82, 0xc7, 0x99, 0x74, 0xc4, 0x8f, 0x63, 0xc2, 0x86, 0x5a, 0xb7, 0x7b, 0x4f, 0xbc, 0x81, 0x55, 0xba, 0x80, 0x54, 0xc1, 0x89, 0x5c, 0xc0, 0x86, 0x57, 0xc1, 0x86, 0x55, 0xb7, 0x7f, 0x55, 0xaa, 0x74, 0x4c, 0xcb, 0x94, 0x68, 0xad, 0x76, 0x49, 0xb5, 0x7b, 0x4c, 0xbf, 0x84, 0x55, 0xc4, 0x88, 0x54, 0xc7, 0x8b, 0x5a, 0xc0, 0x84, 0x54, 0xce, 0x92, 0x62, 0xdf, 0xa3, 0x71, 0xe5, 0xb1, 0x85, 0xe0, 0xa9, 0x7f, 0x78, 0x4d, 0x28, 0x1e, 0x0a, 0x02, 0x33, 0x2a, 0x2b, 0x49, 0x20, 0x01, 0x24, 0x07, 0x00, 0x26, 0x18, 0x0c, 0x72, 0x48, 0x2a, 0x93, 0x5e, 0x32, 0xaf, 0x7a, 0x4d, 0xbc, 0x8a, 0x5f, 0xe6, 0xb8, 0x92, 0xf5, 0xc6, 0x9e, 0xdc, 0xa7, 0x7b, 0xba, 0x7f, 0x55, 0xbc, 0x7d, 0x53, 0xb7, 0x75, 0x47, 0xc3, 0x7d, 0x4c, 0xd0, 0x8a, 0x54, 0xd9, 0x92, 0x59, 0xe0, 0x99, 0x61, 0xdd, 0x97, 0x61, 0xd6, 0x90, 0x59, 0xdb, 0x93, 0x61, 0xdf, 0xa4, 0x6e, 0xe3, 0xa9, 0x74, 0xde, 0xa2, 0x6e, 0xe2, 0xab, 0x77, 0xe7, 0xb1, 0x7d, 0xe4, 0xac, 0x78, 0xc5, 0x8b, 0x5c, 0xb9, 0x81, 0x55, 0xc4, 0x8c, 0x60, 0xcd, 0x96, 0x6a, 0xc3, 0x94, 0x70, 0xc9, 0xb6, 0xa8, 0xf1, 0xed, 0xe8, 0xf9, 0xf9, 0xf7, 0xfa, 0xfa, 0xf8, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xf4, 0xf4, 0xf4, 0xd3, 0xcc, 0xcd, 0xa9, 0xa0, 0x98, 0x7a, 0x62, 0x55, 0x74, 0x5c, 0x4e, 0x68, 0x4c, 0x3e, 0x54, 0x41, 0x37, 0x48, 0x33, 0x24, 0x41, 0x27, 0x18, 0x48, 0x2d, 0x1b, 0x42, 0x28, 0x17, 0x5f, 0x44, 0x2a, 0x88, 0x62, 0x42, 0xbd, 0x90, 0x66, 0xbc, 0x89, 0x5d, 0xce, 0x9c, 0x69, 0xdc, 0xaa, 0x7d, 0xd5, 0xa0, 0x6e, 0xc2, 0x8c, 0x5b, 0xcf, 0x99, 0x67, 0xc2, 0x84, 0x53, 0xb8, 0x7e, 0x50, 0xb7, 0x7b, 0x4a, 0xc1, 0x84, 0x58, 0xae, 0x78, 0x49, 0x9f, 0x68, 0x3f, 0xa0, 0x69, 0x40, 0xa8, 0x70, 0x47, 0xb3, 0x77, 0x50, 0x9e, 0x64, 0x3b, 0xb0, 0x7b, 0x51, 0xc0, 0x90, 0x66, 0x98, 0x69, 0x45, 0xa1, 0x74, 0x54, 0x87, 0x5e, 0x40, 0x8d, 0x63, 0x43, 0x5c, 0x34, 0x1a, 0x58, 0x37, 0x20, 0x12, 0x0c, 0x0a, 0x1f, 0x06, 0x00, 0x34, 0x10, 0x00, 0x07, 0x06, 0x00, 0x02, 0x0a, 0x05, 0x22, 0x09, 0x00, 0x34, 0x11, 0x00, 0x9a, 0x76, 0x59, 0xc6, 0x9a, 0x77, 0xa5, 0x76, 0x51, 0xbd, 0x89, 0x60, 0xb3, 0x7c, 0x51, 0xb8, 0x81, 0x55, 0xb5, 0x7e, 0x52, 0xc0, 0x89, 0x5e, 0xba, 0x82, 0x53, 0xc6, 0x8d, 0x5c, 0xb9, 0x82, 0x51, 0xb5, 0x81, 0x53, 0xae, 0x79, 0x4f, 0xc3, 0x8e, 0x61, 0xc1, 0x86, 0x56, 0xca, 0x8e, 0x5c, 0xba, 0x7e, 0x4c, 0xcf, 0x91, 0x5f, 0xcf, 0x94, 0x62, 0xc5, 0x8c, 0x5f, 0xb1, 0x78, 0x4b, 0xbd, 0x84, 0x58, 0xc6, 0x96, 0x69, 0x78, 0x4b, 0x23, 0x47, 0x21, 0x06, 0x04, 0x04, 0x09, 0x0d, 0x0b, 0x07, 0x51, 0x2d, 0x0b, 0x44, 0x18, 0x00, 0x0e, 0x05, 0x06, 0x20, 0x12, 0x03, 0x61, 0x3b, 0x1f, 0x90, 0x5d, 0x34, 0xb8, 0x86, 0x5f, 0xe1, 0xb0, 0x89, 0xdf, 0xb1, 0x89, 0xd3, 0xa2, 0x76, 0xd6, 0xa1, 0x77, 0xcb, 0x8c, 0x5d, 0xc0, 0x82, 0x4f, 0xc6, 0x83, 0x4e, 0xda, 0x92, 0x5a, 0xda, 0x91, 0x59, 0xd1, 0x88, 0x50, 0xd4, 0x89, 0x4f, 0xd6, 0x8b, 0x51, 0xdf, 0x99, 0x5f, 0xe4, 0xa2, 0x6c, 0xd1, 0x91, 0x5f, 0xcf, 0x8f, 0x5c, 0xdf, 0x9f, 0x6d, 0xe2, 0xa8, 0x74, 0xf1, 0xba, 0x86, 0xdc, 0xa6, 0x73, 0xcd, 0x97, 0x66, 0xcb, 0x95, 0x66, 0xbb, 0x86, 0x5b, 0xbd, 0x8f, 0x6a, 0xbd, 0x98, 0x82, 0xd8, 0xcb, 0xc2, 0xf3, 0xf4, 0xf0, 0xfc, 0xfc, 0xfa, 0xfc, 0xfc, 0xfa, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xe9, 0xe9, 0xe9, 0xb0, 0xa6, 0x9f, 0x84, 0x6b, 0x5f, 0x74, 0x5d, 0x4f, 0x72, 0x5b, 0x4d, 0x5e, 0x47, 0x3c, 0x4e, 0x3b, 0x2e, 0x52, 0x38, 0x23, 0x57, 0x3a, 0x24, 0x54, 0x34, 0x1d, 0x4f, 0x30, 0x1d, 0x67, 0x49, 0x2a, 0x9b, 0x75, 0x53, 0xa5, 0x76, 0x53, 0xd4, 0xa1, 0x76, 0xe3, 0xb1, 0x7e, 0xd5, 0xa0, 0x74, 0xc0, 0x87, 0x56, 0xce, 0x93, 0x5f, 0xd2, 0x97, 0x63, 0xc9, 0x8b, 0x5a, 0xc1, 0x87, 0x59, 0xb9, 0x82, 0x53, 0xa9, 0x70, 0x47, 0xae, 0x79, 0x4a, 0xad, 0x77, 0x4c, 0xb7, 0x7c, 0x50, 0xa6, 0x6a, 0x3d, 0xa5, 0x68, 0x3f, 0xa1, 0x66, 0x3e, 0xb4, 0x7f, 0x55, 0xd9, 0xa9, 0x80, 0xc2, 0x93, 0x6e, 0x9b, 0x6d, 0x4d, 0x91, 0x66, 0x47, 0xa6, 0x77, 0x58, 0x98, 0x6c, 0x49, 0x5e, 0x3d, 0x27, 0x23, 0x1b, 0x19, 0x2f, 0x16, 0x07, 0x6b, 0x41, 0x19, 0x30, 0x1f, 0x12, 0x12, 0x06, 0x04, 0x39, 0x16, 0x04, 0x1d, 0x07, 0x03, 0x20, 0x11, 0x06, 0x64, 0x45, 0x2c, 0x7f, 0x58, 0x38, 0x9f, 0x73, 0x51, 0xa1, 0x6e, 0x46, 0xa6, 0x73, 0x4b, 0xb6, 0x80, 0x55, 0xbf, 0x88, 0x5c, 0xb8, 0x82, 0x55, 0xb4, 0x7f, 0x52, 0xac, 0x77, 0x4b, 0xac, 0x77, 0x4b, 0xae, 0x7a, 0x4b, 0x98, 0x62, 0x39, 0xb9, 0x7e, 0x53, 0xc0, 0x84, 0x52, 0xbf, 0x83, 0x51, 0xc4, 0x86, 0x55, 0xcf, 0x95, 0x63, 0xbc, 0x82, 0x55, 0xa2, 0x72, 0x4b, 0x8d, 0x61, 0x3d, 0x80, 0x59, 0x40, 0x3e, 0x23, 0x12, 0x9e, 0x6e, 0x3c, 0x65, 0x45, 0x25, 0x68, 0x4f, 0x2c, 0xb3, 0x80, 0x4c, 0x6a, 0x40, 0x1f, 0x4f, 0x4a, 0x4a, 0x7b, 0x63, 0x4c, 0x7a, 0x53, 0x35, 0xb0, 0x79, 0x4d, 0xdd, 0xa9, 0x7e, 0xda, 0xa9, 0x81, 0xd3, 0xa5, 0x84, 0xdd, 0xb0, 0x88, 0xd2, 0x9f, 0x7a, 0xb7, 0x80, 0x54, 0xb6, 0x75, 0x46, 0xbc, 0x78, 0x49, 0xc5, 0x7d, 0x4a, 0xc8, 0x83, 0x50, 0xc2, 0x7c, 0x49, 0xbf, 0x7c, 0x48, 0xbb, 0x78, 0x44, 0xbb, 0x7b, 0x45, 0xce, 0x8a, 0x52, 0xdc, 0x9d, 0x65, 0xde, 0x9f, 0x68, 0xe5, 0xa5, 0x72, 0xe5, 0xab, 0x77, 0xe5, 0xaf, 0x77, 0xeb, 0xb6, 0x7d, 0xe8, 0xb3, 0x7d, 0xd2, 0x9d, 0x6a, 0xd3, 0x9f, 0x70, 0xc6, 0x98, 0x6e, 0xbb, 0x96, 0x79, 0xc9, 0xb5, 0xa3, 0xe2, 0xd9, 0xd7, 0xf7, 0xf7, 0xf5, 0xfa, 0xfa, 0xf8, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfb, 0xf9, 0xf8, 0xdd, 0xd6, 0xd2, 0x9b, 0x89, 0x83, 0x7f, 0x74, 0x6c, 0x66, 0x56, 0x4b, 0x6a, 0x55, 0x4b, 0x67, 0x4b, 0x33, 0x6d, 0x4b, 0x31, 0x72, 0x51, 0x37, 0x60, 0x41, 0x2a, 0x5b, 0x3b, 0x21, 0x5e, 0x40, 0x28, 0x80, 0x55, 0x35, 0x9a, 0x6f, 0x4d, 0xbf, 0x8f, 0x71, 0xe0, 0xaf, 0x82, 0xd6, 0xa1, 0x75, 0xb5, 0x80, 0x55, 0xd5, 0x9d, 0x69, 0xcd, 0x8e, 0x5c, 0xcf, 0x90, 0x5e, 0xd2, 0x93, 0x61, 0xc6, 0x87, 0x55, 0xc5, 0x8b, 0x57, 0xcb, 0x92, 0x5d, 0xd0, 0x91, 0x5c, 0xb4, 0x74, 0x46, 0xa9, 0x6b, 0x47, 0x9d, 0x62, 0x3d, 0xa4, 0x68, 0x40, 0xa9, 0x70, 0x4a, 0xad, 0x7b, 0x56, 0xbb, 0x8c, 0x66, 0xa6, 0x78, 0x56, 0x92, 0x6a, 0x4c, 0xbf, 0x8f, 0x66, 0xc8, 0x94, 0x6b, 0xc6, 0x8f, 0x63, 0xba, 0x8d, 0x6a, 0x94, 0x7e, 0x66, 0x49, 0x36, 0x2e, 0xcf, 0x94, 0x54, 0xbf, 0x8d, 0x56, 0x85, 0x5d, 0x2f, 0x4b, 0x25, 0x06, 0x10, 0x04, 0x00, 0x14, 0x0d, 0x0a, 0x44, 0x31, 0x20, 0x66, 0x42, 0x2b, 0x5f, 0x3e, 0x20, 0xa4, 0x75, 0x4e, 0x9b, 0x6d, 0x48, 0xa2, 0x72, 0x4d, 0xac, 0x78, 0x50, 0xb1, 0x7b, 0x50, 0xb1, 0x7a, 0x4e, 0xb5, 0x7e, 0x52, 0xc2, 0x8b, 0x60, 0xc0, 0x88, 0x5c, 0xa5, 0x6a, 0x3e, 0xbb, 0x81, 0x54, 0xb7, 0x7c, 0x50, 0xb2, 0x78, 0x4b, 0xbd, 0x83, 0x56, 0xc6, 0x8c, 0x5f, 0xb3, 0x77, 0x4c, 0x98, 0x6b, 0x4b, 0xa7, 0x7f, 0x5b, 0xad, 0x92, 0x79, 0x42, 0x2d, 0x22, 0xce, 0x8d, 0x55, 0xfb, 0xc8, 0x90, 0xf4, 0xd0, 0x91, 0xf4, 0xb0, 0x70, 0x73, 0x5d, 0x49, 0xab, 0xa2, 0x98, 0xe7, 0xbe, 0xa1, 0x86, 0x54, 0x32, 0xab, 0x74, 0x4d, 0xd2, 0x94, 0x67, 0xd9, 0xa2, 0x79, 0xbb, 0x90, 0x6a, 0xcc, 0x9e, 0x79, 0xad, 0x7f, 0x5b, 0xb6, 0x81, 0x57, 0xae, 0x76, 0x49, 0xad, 0x70, 0x42, 0xc9, 0x89, 0x51, 0xc5, 0x80, 0x4f, 0xcd, 0x85, 0x4f, 0xce, 0x89, 0x52, 0xc4, 0x86, 0x4d, 0xc8, 0x83, 0x4c, 0xd1, 0x8b, 0x54, 0xd5, 0x91, 0x5e, 0xd9, 0x96, 0x62, 0xdf, 0x9e, 0x6a, 0xe9, 0xad, 0x77, 0xe5, 0xab, 0x76, 0xe7, 0xae, 0x79, 0xe0, 0xab, 0x74, 0xdc, 0xa7, 0x73, 0xc6, 0x8f, 0x60, 0xc3, 0x8d, 0x65, 0xbb, 0x89, 0x68, 0xc6, 0xa4, 0x8b, 0xe2, 0xd6, 0xcf, 0xf2, 0xeb, 0xe5, 0xf9, 0xf7, 0xf3, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xef, 0xed, 0xec, 0xa7, 0xa0, 0x9c, 0x80, 0x76, 0x6d, 0x89, 0x7c, 0x74, 0x80, 0x68, 0x5d, 0x79, 0x5d, 0x48, 0x74, 0x56, 0x3f, 0x72, 0x50, 0x36, 0x75, 0x51, 0x34, 0x72, 0x4d, 0x30, 0x5f, 0x3e, 0x25, 0x5c, 0x3d, 0x25, 0x5f, 0x3f, 0x25, 0xad, 0x88, 0x5f, 0xe3, 0xae, 0x80, 0xe1, 0xad, 0x7d, 0xcd, 0x95, 0x66, 0xd1, 0x99, 0x69, 0xc6, 0x89, 0x58, 0xc2, 0x88, 0x59, 0xba, 0x80, 0x51, 0xc8, 0x87, 0x53, 0xd1, 0x8f, 0x5c, 0xd0, 0x8a, 0x5a, 0xde, 0x99, 0x68, 0xc9, 0x8a, 0x56, 0xb7, 0x76, 0x48, 0xa6, 0x68, 0x41, 0xa3, 0x69, 0x40, 0x9e, 0x66, 0x3e, 0x99, 0x64, 0x41, 0xba, 0x8b, 0x69, 0xa7, 0x7a, 0x57, 0xae, 0x82, 0x62, 0x8c, 0x64, 0x46, 0xd8, 0xa8, 0x7d, 0xcd, 0x95, 0x6a, 0xc4, 0x88, 0x58, 0xae, 0x81, 0x5d, 0xe5, 0xcd, 0xb6, 0x9f, 0x96, 0x90, 0x71, 0x53, 0x47, 0xc6, 0x8c, 0x59, 0xa3, 0x6c, 0x3d, 0x38, 0x1a, 0x03, 0x0a, 0x03, 0x04, 0x1d, 0x11, 0x0b, 0x86, 0x6f, 0x59, 0x71, 0x54, 0x3c, 0x80, 0x5d, 0x41, 0x85, 0x5f, 0x41, 0x8e, 0x61, 0x3e, 0xa0, 0x70, 0x4a, 0xa9, 0x75, 0x4d, 0xaf, 0x79, 0x4e, 0xb5, 0x7e, 0x53, 0xb3, 0x7c, 0x51, 0xad, 0x77, 0x4b, 0xb9, 0x81, 0x55, 0xca, 0x8f, 0x63, 0xc0, 0x85, 0x59, 0xbe, 0x84, 0x57, 0xb3, 0x78, 0x4c, 0xb9, 0x7e, 0x52, 0xb6, 0x7b, 0x4f, 0xb0, 0x7d, 0x54, 0xb3, 0x87, 0x63, 0xd3, 0xaf, 0x8e, 0xd6, 0xbd, 0xa8, 0x41, 0x2e, 0x28, 0x38, 0x1c, 0x11, 0xab, 0x7a, 0x48, 0xbd, 0x89, 0x5e, 0x5b, 0x37, 0x22, 0x8f, 0x85, 0x82, 0xe2, 0xcc, 0xb6, 0xeb, 0xc5, 0xa2, 0x7e, 0x4f, 0x2c, 0xa5, 0x6e, 0x44, 0xcf, 0x93, 0x63, 0xd7, 0xa1, 0x77, 0xbc, 0x8d, 0x69, 0xc8, 0x9a, 0x76, 0xcf, 0xa1, 0x7d, 0xae, 0x7d, 0x5d, 0x97, 0x61, 0x3e, 0x95, 0x5c, 0x33, 0xa4, 0x65, 0x3c, 0xab, 0x6b, 0x3b, 0xb5, 0x71, 0x3f, 0xc3, 0x7b, 0x45, 0xc9, 0x85, 0x4e, 0xc6, 0x87, 0x56, 0xc0, 0x82, 0x50, 0xce, 0x8a, 0x57, 0xde, 0x9a, 0x67, 0xde, 0x9c, 0x69, 0xdc, 0x9e, 0x69, 0xea, 0xaf, 0x7a, 0xea, 0xb1, 0x7c, 0xe7, 0xb1, 0x7a, 0xd9, 0xa4, 0x70, 0xe3, 0xac, 0x7a, 0xc7, 0x93, 0x60, 0xc5, 0x96, 0x6d, 0xca, 0xa6, 0x8f, 0xbb, 0xa2, 0x91, 0xf4, 0xed, 0xe7, 0xfc, 0xfa, 0xf6, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xe8, 0xe3, 0xe3, 0xac, 0xa6, 0xa2, 0xa1, 0x9b, 0x97, 0x92, 0x7d, 0x70, 0x8c, 0x6e, 0x5f, 0x82, 0x64, 0x4c, 0x76, 0x52, 0x3e, 0x7c, 0x59, 0x3c, 0x6a, 0x4b, 0x32, 0x62, 0x44, 0x2c, 0x61, 0x41, 0x2a, 0x7e, 0x55, 0x37, 0x9b, 0x6f, 0x4c, 0xd4, 0xa1, 0x73, 0xdc, 0xa5, 0x75, 0xdc, 0xa0, 0x6c, 0xd8, 0x9a, 0x67, 0xbb, 0x7f, 0x52, 0xb9, 0x7f, 0x52, 0xb4, 0x7c, 0x50, 0xad, 0x76, 0x4a, 0xb5, 0x7b, 0x4e, 0xbb, 0x81, 0x55, 0xc5, 0x88, 0x56, 0xc9, 0x88, 0x57, 0xc1, 0x81, 0x4e, 0xc1, 0x81, 0x50, 0xb6, 0x79, 0x50, 0x9e, 0x69, 0x41, 0x9a, 0x6b, 0x44, 0xa5, 0x76, 0x50, 0xa2, 0x76, 0x52, 0xac, 0x82, 0x61, 0x99, 0x70, 0x51, 0x8f, 0x64, 0x45, 0xc5, 0x94, 0x6b, 0xca, 0x91, 0x64, 0xc2, 0x83, 0x56, 0x91, 0x64, 0x43, 0xea, 0xcb, 0xad, 0xf2, 0xd6, 0xbd, 0xcc, 0xb6, 0xa4, 0x75, 0x61, 0x4f, 0x53, 0x42, 0x35, 0x40, 0x2f, 0x24, 0x1f, 0x11, 0x0a, 0x2d, 0x1f, 0x1a, 0x83, 0x69, 0x55, 0xbb, 0x93, 0x6f, 0xad, 0x7c, 0x55, 0x86, 0x62, 0x45, 0x7d, 0x56, 0x37, 0x90, 0x63, 0x3f, 0xa1, 0x6f, 0x48, 0xa2, 0x6d, 0x44, 0xaf, 0x78, 0x4d, 0xb3, 0x7b, 0x4e, 0xae, 0x78, 0x4c, 0xba, 0x84, 0x58, 0xcc, 0x95, 0x6a, 0xbc, 0x81, 0x54, 0xba, 0x7f, 0x53, 0xb8, 0x7d, 0x51, 0xbc, 0x82, 0x55, 0xb2, 0x7b, 0x51, 0xa3, 0x77, 0x54, 0xc0, 0x95, 0x6f, 0xdf, 0xbb, 0x99, 0xaa, 0x91, 0x80, 0x4d, 0x39, 0x31, 0x56, 0x41, 0x32, 0x82, 0x71, 0x63, 0x98, 0x86, 0x79, 0xb8, 0xa8, 0x98, 0xe2, 0xcb, 0xb0, 0xf9, 0xda, 0xb8, 0x9c, 0x71, 0x4d, 0x9e, 0x6e, 0x49, 0xbb, 0x83, 0x57, 0xe1, 0xa5, 0x73, 0xeb, 0xb6, 0x8a, 0xcb, 0x97, 0x71, 0xc3, 0x93, 0x6d, 0xc2, 0x91, 0x6d, 0xb5, 0x87, 0x61, 0x8c, 0x5c, 0x39, 0x9d, 0x6a, 0x43, 0xa9, 0x6b, 0x3d, 0xb7, 0x75, 0x43, 0xb2, 0x6f, 0x3e, 0xba, 0x75, 0x44, 0xc7, 0x83, 0x51, 0xcf, 0x8b, 0x5b, 0xd3, 0x90, 0x5b, 0xce, 0x8b, 0x55, 0xd7, 0x94, 0x5e, 0xdf, 0x9f, 0x68, 0xdf, 0xa1, 0x69, 0xdf, 0xa3, 0x6d, 0xe5, 0xa9, 0x74, 0xe8, 0xaf, 0x78, 0xdf, 0xa6, 0x71, 0xd0, 0x9a, 0x69, 0xd0, 0x9a, 0x6a, 0xba, 0x8c, 0x63, 0xba, 0x8e, 0x6b, 0xc7, 0xad, 0x98, 0xde, 0xd4, 0xcc, 0xed, 0xed, 0xe8, 0xfc, 0xfd, 0xfa, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf8, 0xf7, 0xf7, 0xc7, 0xc1, 0xc1, 0x9c, 0x97, 0x92, 0xbe, 0xb4, 0xb0, 0xb3, 0x97, 0x84, 0x8b, 0x6a, 0x56, 0x77, 0x56, 0x3e, 0x7a, 0x55, 0x37, 0x7c, 0x58, 0x3e, 0x65, 0x45, 0x2f, 0x67, 0x45, 0x2b, 0x7f, 0x58, 0x39, 0xa4, 0x76, 0x4d, 0xce, 0x9d, 0x6c, 0xd5, 0x9e, 0x6b, 0xd6, 0x9b, 0x66, 0xcc, 0x90, 0x5d, 0xbb, 0x7f, 0x4c, 0xbb, 0x81, 0x57, 0xb5, 0x81, 0x54, 0xb2, 0x7b, 0x4f, 0xbe, 0x88, 0x5c, 0xb8, 0x7d, 0x51, 0xbb, 0x80, 0x54, 0xb8, 0x7d, 0x4b, 0xc4, 0x83, 0x53, 0xbf, 0x7f, 0x4d, 0xc3, 0x83, 0x50, 0xa9, 0x6b, 0x40, 0xa5, 0x70, 0x46, 0xa6, 0x76, 0x50, 0xa8, 0x7a, 0x55, 0x98, 0x6d, 0x4b, 0xa0, 0x77, 0x56, 0x8d, 0x65, 0x46, 0x92, 0x66, 0x47, 0xca, 0x97, 0x6f, 0xd3, 0x99, 0x6c, 0xdb, 0xa0, 0x74, 0xab, 0x79, 0x52, 0x9a, 0x71, 0x4e, 0xe3, 0xbc, 0x9c, 0xf1, 0xd6, 0xbe, 0xe8, 0xd0, 0xb9, 0xe4, 0xca, 0xb5, 0xc7, 0xb4, 0xa3, 0x69, 0x55, 0x48, 0x34, 0x23, 0x1c, 0x59, 0x42, 0x30, 0xb7, 0x8c, 0x66, 0xd3, 0xa2, 0x78, 0xa4, 0x7d, 0x5d, 0x89, 0x63, 0x44, 0x9f, 0x73, 0x50, 0xa6, 0x75, 0x4f, 0xae, 0x7a, 0x51, 0xb4, 0x7d, 0x52, 0xb6, 0x7e, 0x50, 0xac, 0x77, 0x4b, 0xaf, 0x7a, 0x4f, 0xc8, 0x93, 0x68, 0xba, 0x80, 0x51, 0xb9, 0x7e, 0x52, 0xbc, 0x81, 0x55, 0xba, 0x81, 0x54, 0xb0, 0x7b, 0x52, 0x9c, 0x6e, 0x4c, 0xc2, 0x95, 0x6e, 0xd7, 0xb1, 0x8e, 0x9f, 0x85, 0x75, 0x4b, 0x3b, 0x31, 0x98, 0x7f, 0x6e, 0xea, 0xd3, 0xbc, 0xf1, 0xdc, 0xc7, 0xf3, 0xda, 0xbf, 0xec, 0xc7, 0xa4, 0xaa, 0x7d, 0x58, 0xaa, 0x7a, 0x54, 0xc2, 0x8e, 0x64, 0xcf, 0x96, 0x66, 0xe4, 0xa9, 0x78, 0xe9, 0xb5, 0x87, 0xc7, 0x92, 0x6a, 0xd2, 0xa0, 0x79, 0xc0, 0x8e, 0x6b, 0xa8, 0x7a, 0x53, 0x94, 0x65, 0x45, 0x7d, 0x4c, 0x2e, 0x9c, 0x62, 0x3b, 0xb4, 0x74, 0x44, 0xb5, 0x73, 0x41, 0xac, 0x6d, 0x3c, 0xbc, 0x7c, 0x4c, 0xc7, 0x86, 0x57, 0xd1, 0x91, 0x5c, 0xcd, 0x8d, 0x56, 0xc9, 0x89, 0x52, 0xd6, 0x98, 0x5f, 0xdb, 0x9c, 0x63, 0xe5, 0xa7, 0x71, 0xea, 0xad, 0x78, 0xeb, 0xaf, 0x78, 0xe2, 0xa9, 0x73, 0xe2, 0xac, 0x7a, 0xda, 0xa1, 0x6d, 0xd2, 0xa3, 0x78, 0xc3, 0x99, 0x74, 0xc0, 0x9f, 0x82, 0xd4, 0xc4, 0xb6, 0xee, 0xec, 0xe5, 0xf4, 0xf4, 0xf0, 0xfd, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf4, 0xf4, 0xf4, 0xbe, 0xb8, 0xb7, 0xba, 0xb5, 0xb1, 0xc4, 0xb3, 0xa7, 0xa4, 0x80, 0x68, 0x8d, 0x68, 0x51, 0x85, 0x61, 0x45, 0x82, 0x5c, 0x3e, 0x72, 0x4d, 0x38, 0x74, 0x53, 0x37, 0x8a, 0x60, 0x3f, 0xae, 0x7c, 0x55, 0xac, 0x76, 0x4c, 0xd5, 0x9b, 0x6a, 0xd5, 0x99, 0x65, 0xd4, 0x95, 0x5d, 0xbc, 0x84, 0x55, 0xbe, 0x86, 0x57, 0xbc, 0x87, 0x5b, 0xc7, 0x95, 0x67, 0xcf, 0x98, 0x6c, 0xb4, 0x7d, 0x51, 0xb6, 0x7b, 0x4f, 0xc5, 0x8a, 0x5e, 0xcd, 0x93, 0x61, 0xc5, 0x85, 0x55, 0xb0, 0x71, 0x3f, 0xc4, 0x85, 0x52, 0xbb, 0x7a, 0x4c, 0xac, 0x72, 0x47, 0xa8, 0x71, 0x49, 0x8e, 0x60, 0x3e, 0x82, 0x5b, 0x3e, 0x88, 0x63, 0x46, 0x80, 0x59, 0x3e, 0x93, 0x66, 0x48, 0xbd, 0x87, 0x61, 0xc1, 0x86, 0x5a, 0xde, 0xa9, 0x7b, 0xca, 0x92, 0x60, 0xaa, 0x78, 0x53, 0x7d, 0x56, 0x35, 0xc9, 0x9e, 0x78, 0xef, 0xc9, 0xa4, 0xef, 0xd5, 0xbf, 0xeb, 0xd9, 0xc0, 0x9d, 0x81, 0x6e, 0x7e, 0x68, 0x5c, 0x54, 0x40, 0x30, 0xb1, 0x85, 0x5f, 0xc7, 0x96, 0x6d, 0xb0, 0x85, 0x63, 0x94, 0x6a, 0x49, 0x9a, 0x6c, 0x49, 0xab, 0x79, 0x53, 0xae, 0x7a, 0x51, 0xb8, 0x81, 0x56, 0xbf, 0x87, 0x5a, 0xb5, 0x80, 0x54, 0xb0, 0x7b, 0x4f, 0xb0, 0x7a, 0x50, 0xbb, 0x81, 0x54, 0xb8, 0x7e, 0x52, 0xbe, 0x84, 0x58, 0xbb, 0x82, 0x55, 0xae, 0x78, 0x4f, 0xa4, 0x72, 0x4e, 0xca, 0x98, 0x6e, 0xda, 0xb4, 0x90, 0x89, 0x6e, 0x5e, 0x78, 0x5e, 0x50, 0xac, 0x93, 0x7e, 0xf2, 0xdb, 0xbe, 0xe1, 0xbc, 0x96, 0xc1, 0x94, 0x6d, 0x88, 0x5f, 0x3c, 0x99, 0x69, 0x48, 0xc5, 0x90, 0x66, 0xd8, 0xa0, 0x6d, 0xdf, 0xa6, 0x72, 0xec, 0xb5, 0x83, 0xeb, 0xb6, 0x89, 0xc0, 0x8c, 0x63, 0xc6, 0x94, 0x6d, 0xb6, 0x83, 0x60, 0xbd, 0x90, 0x69, 0x95, 0x66, 0x45, 0x89, 0x5a, 0x32, 0x85, 0x54, 0x29, 0x97, 0x5e, 0x35, 0xb4, 0x72, 0x40, 0xb8, 0x7e, 0x4b, 0xb6, 0x7c, 0x49, 0xc2, 0x84, 0x54, 0xd2, 0x94, 0x5f, 0xdb, 0x9d, 0x6a, 0xc4, 0x86, 0x53, 0xc7, 0x89, 0x51, 0xe0, 0xa1, 0x69, 0xe7, 0xa9, 0x73, 0xe8, 0xab, 0x75, 0xe3, 0xa7, 0x70, 0xe4, 0xaa, 0x74, 0xe2, 0xab, 0x78, 0xe0, 0xa2, 0x6c, 0xd2, 0x9e, 0x70, 0xdb, 0xb4, 0x93, 0xd2, 0xac, 0x8c, 0xc6, 0xb0, 0x97, 0xdc, 0xd0, 0xcb, 0xf6, 0xf6, 0xf1, 0xf7, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfa, 0xf9, 0xf9, 0xe3, 0xe3, 0xe3, 0xd7, 0xd6, 0xd2, 0xda, 0xdd, 0xd7, 0xc3, 0xb1, 0xa3, 0x96, 0x71, 0x54, 0x8b, 0x60, 0x47, 0x97, 0x6c, 0x4d, 0x83, 0x61, 0x44, 0x75, 0x51, 0x31, 0x93, 0x67, 0x45, 0x9a, 0x6c, 0x47, 0x9e, 0x6d, 0x43, 0xc1, 0x8b, 0x5e, 0xd0, 0x96, 0x65, 0xd4, 0x96, 0x63, 0xd6, 0x98, 0x65, 0xcd, 0x93, 0x61, 0xca, 0x90, 0x5e, 0xd1, 0x9b, 0x6e, 0xdb, 0xa1, 0x71, 0xca, 0x90, 0x60, 0xcb, 0x91, 0x61, 0xcc, 0x91, 0x65, 0xc1, 0x86, 0x5a, 0xbc, 0x81, 0x55, 0xb1, 0x76, 0x4a, 0xc6, 0x89, 0x5a, 0xc1, 0x85, 0x55, 0xb8, 0x7f, 0x4d, 0xa2, 0x68, 0x3a, 0xaf, 0x78, 0x4e, 0xb1, 0x7e, 0x57, 0x98, 0x6b, 0x4c, 0x79, 0x54, 0x3c, 0x7a, 0x56, 0x3f, 0x88, 0x5c, 0x3e, 0xcf, 0x9d, 0x75, 0xc8, 0x93, 0x68, 0xba, 0x7f, 0x51, 0xcb, 0x90, 0x64, 0xc4, 0x89, 0x5d, 0xc6, 0x9b, 0x73, 0xc8, 0xa0, 0x81, 0xc7, 0xa2, 0x80, 0xc5, 0xa0, 0x7e, 0xea, 0xd0, 0xb2, 0xca, 0xab, 0x95, 0xb4, 0x9b, 0x83, 0x8a, 0x6b, 0x54, 0xb4, 0x88, 0x61, 0xdb, 0xaf, 0x88, 0xc9, 0x9a, 0x71, 0x8d, 0x60, 0x42, 0x98, 0x6b, 0x47, 0xa4, 0x72, 0x4d, 0xa8, 0x74, 0x4b, 0xbe, 0x86, 0x5a, 0xc0, 0x87, 0x58, 0xb2, 0x7c, 0x4c, 0xb4, 0x7e, 0x50, 0xaa, 0x75, 0x4c, 0xb4, 0x7f, 0x55, 0xaf, 0x78, 0x4d, 0xb6, 0x7f, 0x54, 0xbd, 0x87, 0x58, 0xaf, 0x78, 0x50, 0xa6, 0x72, 0x4b, 0xc4, 0x91, 0x69, 0xd4, 0xa1, 0x7a, 0xb7, 0x94, 0x79, 0xb6, 0x97, 0x7f, 0xdc, 0xbc, 0xa4, 0xe8, 0xc4, 0xa6, 0xcc, 0xad, 0x8d, 0xcd, 0xa7, 0x86, 0xc0, 0x95, 0x70, 0xa8, 0x76, 0x4b, 0xb8, 0x81, 0x52, 0xe2, 0xa6, 0x75, 0xd2, 0x94, 0x63, 0xce, 0x91, 0x63, 0xd8, 0xa4, 0x75, 0xb3, 0x82, 0x58, 0xca, 0x98, 0x73, 0xc4, 0x92, 0x6d, 0xc7, 0x97, 0x72, 0xb4, 0x80, 0x56, 0xa3, 0x6e, 0x42, 0xb6, 0x7c, 0x4d, 0x91, 0x59, 0x32, 0xb1, 0x73, 0x44, 0xc3, 0x85, 0x54, 0xc6, 0x88, 0x57, 0xc6, 0x87, 0x56, 0xbc, 0x7e, 0x4d, 0xd2, 0x93, 0x5d, 0xd4, 0x94, 0x5f, 0xcc, 0x8e, 0x5a, 0xce, 0x90, 0x5d, 0xe1, 0xa3, 0x6c, 0xea, 0xab, 0x72, 0xec, 0xaf, 0x78, 0xea, 0xaf, 0x79, 0xdc, 0xa1, 0x6b, 0xe1, 0xa6, 0x73, 0xd9, 0xa3, 0x74, 0xd3, 0xa5, 0x7e, 0xd3, 0xb1, 0x94, 0xcf, 0xb6, 0xa0, 0xd9, 0xcd, 0xc6, 0xe5, 0xde, 0xd7, 0xfa, 0xf8, 0xf4, 0xfd, 0xfd, 0xfb, 0xfe, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf6, 0xf5, 0xf5, 0xe6, 0xe6, 0xe6, 0xe7, 0xe7, 0xe8, 0xe4, 0xdf, 0xd8, 0xb0, 0x90, 0x77, 0x8f, 0x66, 0x46, 0x96, 0x6c, 0x48, 0x95, 0x6b, 0x47, 0x87, 0x5f, 0x3d, 0x9a, 0x6e, 0x48, 0x9c, 0x6d, 0x47, 0x97, 0x69, 0x43, 0xa9, 0x79, 0x4f, 0xbc, 0x86, 0x58, 0xd1, 0x96, 0x65, 0xd0, 0x93, 0x5f, 0xd2, 0x94, 0x61, 0xca, 0x91, 0x5e, 0xd2, 0x99, 0x66, 0xdc, 0x9f, 0x6d, 0xd9, 0x9f, 0x6f, 0xce, 0x94, 0x63, 0xd1, 0x97, 0x67, 0xc4, 0x89, 0x5d, 0xc0, 0x85, 0x59, 0xbd, 0x82, 0x56, 0xb9, 0x7e, 0x52, 0xb6, 0x7e, 0x52, 0xb4, 0x7c, 0x50, 0xaa, 0x74, 0x45, 0xa8, 0x71, 0x47, 0xa8, 0x72, 0x49, 0xc2, 0x8f, 0x68, 0x9f, 0x76, 0x56, 0x67, 0x45, 0x2c, 0x66, 0x45, 0x2f, 0x79, 0x51, 0x35, 0xbc, 0x8c, 0x66, 0xcd, 0x98, 0x6d, 0xbf, 0x84, 0x56, 0xd3, 0x98, 0x6c, 0xc1, 0x86, 0x5a, 0xb8, 0x85, 0x5c, 0xc7, 0xa2, 0x7e, 0xcf, 0xae, 0x93, 0xb8, 0x96, 0x7c, 0xce, 0xa6, 0x84, 0xde, 0xbc, 0x9e, 0xc1, 0x9e, 0x7e, 0x96, 0x6e, 0x51, 0xcf, 0xa4, 0x7c, 0xd8, 0xad, 0x85, 0xd0, 0x9d, 0x72, 0x96, 0x66, 0x43, 0x96, 0x68, 0x43, 0xa0, 0x6e, 0x48, 0xb1, 0x7b, 0x50, 0xbd, 0x81, 0x52, 0xc5, 0x87, 0x56, 0xcb, 0x90, 0x5e, 0xbb, 0x80, 0x4f, 0xaf, 0x76, 0x48, 0xb5, 0x7c, 0x4e, 0xb5, 0x7e, 0x52, 0xb6, 0x7f, 0x54, 0xb9, 0x82, 0x54, 0xb5, 0x7e, 0x56, 0xa4, 0x71, 0x4a, 0xc7, 0x94, 0x6c, 0xdf, 0xac, 0x82, 0xbe, 0x95, 0x6f, 0xde, 0xbb, 0xa1, 0xdf, 0xbc, 0xa2, 0xd5, 0xb1, 0x93, 0xd1, 0xb2, 0x92, 0xd0, 0xb0, 0x93, 0xbb, 0x8f, 0x69, 0xb0, 0x7c, 0x50, 0xc5, 0x8e, 0x5f, 0xdd, 0xa3, 0x74, 0xdb, 0xa2, 0x74, 0xd5, 0x9c, 0x70, 0xdd, 0xa8, 0x7c, 0xad, 0x7a, 0x5a, 0xc7, 0x95, 0x70, 0xc7, 0x95, 0x70, 0xcd, 0x98, 0x6f, 0xb8, 0x81, 0x55, 0xb7, 0x82, 0x57, 0xb2, 0x78, 0x4a, 0xb5, 0x77, 0x49, 0xb4, 0x75, 0x47, 0xc3, 0x85, 0x54, 0xd0, 0x92, 0x61, 0xc9, 0x8b, 0x5a, 0xc2, 0x84, 0x53, 0xc4, 0x85, 0x4e, 0xd0, 0x91, 0x59, 0xdc, 0x9f, 0x6b, 0xdc, 0x9e, 0x6b, 0xda, 0x9c, 0x65, 0xdd, 0x9f, 0x66, 0xe6, 0xa9, 0x72, 0xea, 0xaf, 0x79, 0xed, 0xb2, 0x7b, 0xde, 0xa3, 0x70, 0xe4, 0xaf, 0x81, 0xd6, 0xaa, 0x85, 0xce, 0xa7, 0x85, 0xcf, 0xb4, 0x9b, 0xd4, 0xc3, 0xba, 0xe9, 0xe2, 0xdb, 0xe9, 0xe7, 0xe3, 0xf4, 0xf4, 0xf2, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xee, 0xf1, 0xee, 0xf1, 0xee, 0xed, 0xe6, 0xe7, 0xe5, 0xbf, 0xa8, 0x9e, 0x9b, 0x77, 0x5a, 0x96, 0x6e, 0x4e, 0x97, 0x6e, 0x51, 0x9d, 0x6e, 0x48, 0xa7, 0x75, 0x4a, 0x9e, 0x6f, 0x4b, 0x8e, 0x61, 0x41, 0x95, 0x65, 0x47, 0xa4, 0x71, 0x48, 0xc2, 0x8c, 0x5e, 0xc8, 0x8e, 0x5e, 0xc3, 0x88, 0x58, 0xc5, 0x8b, 0x5a, 0xd6, 0x9a, 0x67, 0xd8, 0x9c, 0x69, 0xca, 0x8f, 0x63, 0xd0, 0x96, 0x63, 0xca, 0x92, 0x66, 0xbe, 0x86, 0x5a, 0xb1, 0x7b, 0x54, 0xaf, 0x7a, 0x4f, 0xc0, 0x85, 0x5a, 0xc9, 0x8f, 0x5c, 0xc8, 0x8c, 0x61, 0xc2, 0x88, 0x5f, 0x99, 0x5e, 0x39, 0xc2, 0x88, 0x5e, 0xd3, 0x9b, 0x6b, 0xbe, 0x89, 0x60, 0x97, 0x68, 0x4a, 0x6e, 0x49, 0x34, 0x56, 0x37, 0x23, 0x64, 0x41, 0x28, 0xab, 0x7c, 0x57, 0xc1, 0x92, 0x69, 0xba, 0x87, 0x5b, 0xb9, 0x86, 0x5b, 0xb7, 0x84, 0x59, 0xb8, 0x84, 0x5c, 0xd2, 0xa6, 0x85, 0xd7, 0xbb, 0xa1, 0xd6, 0xb2, 0x93, 0xc6, 0x9e, 0x7c, 0xda, 0xb2, 0x90, 0xbd, 0x95, 0x72, 0x7a, 0x5c, 0x41, 0x96, 0x6a, 0x42, 0xc1, 0x8e, 0x62, 0xbc, 0x86, 0x5b, 0x99, 0x69, 0x43, 0x98, 0x6a, 0x4a, 0xad, 0x7c, 0x56, 0xc0, 0x8b, 0x5e, 0xc5, 0x8e, 0x60, 0xbf, 0x88, 0x5b, 0xbe, 0x88, 0x5c, 0xc1, 0x89, 0x5d, 0xc2, 0x88, 0x57, 0xb3, 0x79, 0x49, 0xb1, 0x78, 0x4d, 0xb9, 0x84, 0x58, 0xb8, 0x83, 0x58, 0xc0, 0x8b, 0x61, 0xad, 0x7a, 0x4f, 0xb6, 0x83, 0x59, 0xce, 0x9b, 0x6f, 0xb1, 0x82, 0x5b, 0xdc, 0xb3, 0x90, 0xcd, 0xa4, 0x82, 0xcc, 0xaa, 0x8f, 0xdf, 0xbd, 0xa2, 0xb8, 0x92, 0x71, 0xc1, 0x92, 0x6b, 0xc5, 0x8f, 0x63, 0xca, 0x93, 0x65, 0xdb, 0xa3, 0x75, 0xc8, 0x8e, 0x5c, 0xd3, 0xa1, 0x76, 0xd5, 0x9e, 0x72, 0xa9, 0x7b, 0x5b, 0x9e, 0x6f, 0x4d, 0xc7, 0x9a, 0x71, 0xc7, 0x97, 0x6a, 0xa6, 0x71, 0x47, 0xbc, 0x88, 0x5c, 0xb6, 0x7d, 0x4c, 0xbf, 0x83, 0x52, 0xb7, 0x7b, 0x49, 0xc1, 0x85, 0x52, 0xcf, 0x90, 0x58, 0xd1, 0x90, 0x5c, 0xd0, 0x94, 0x5f, 0xca, 0x8b, 0x55, 0xc7, 0x8d, 0x5a, 0xce, 0x93, 0x61, 0xd3, 0x97, 0x65, 0xe3, 0xa6, 0x72, 0xd8, 0x9a, 0x65, 0xe1, 0xa4, 0x6c, 0xed, 0xb0, 0x77, 0xe8, 0xab, 0x74, 0xe6, 0xaa, 0x78, 0xe7, 0xad, 0x81, 0xf6, 0xcc, 0xb0, 0xdd, 0xbf, 0xad, 0xdb, 0xc9, 0xb8, 0xc3, 0xb3, 0xa4, 0xe9, 0xe5, 0xdd, 0xf4, 0xf0, 0xed, 0xf1, 0xf1, 0xef, 0xfb, 0xfb, 0xf9, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xfa, 0xfa, 0xf4, 0xf7, 0xf4, 0xf1, 0xee, 0xed, 0xd3, 0xc8, 0xbe, 0xa0, 0x7d, 0x6b, 0x9e, 0x74, 0x52, 0x9e, 0x6f, 0x49, 0xb3, 0x7a, 0x52, 0xb8, 0x82, 0x55, 0xb9, 0x82, 0x5a, 0x94, 0x69, 0x48, 0x78, 0x56, 0x34, 0x8a, 0x61, 0x41, 0xa9, 0x7a, 0x4f, 0xc2, 0x8c, 0x5e, 0xc5, 0x8b, 0x5a, 0xc2, 0x88, 0x58, 0xdd, 0xa3, 0x72, 0xd4, 0x9b, 0x6c, 0xd2, 0x99, 0x6a, 0xdb, 0xa1, 0x71, 0xc3, 0x88, 0x5a, 0xb3, 0x7e, 0x54, 0xba, 0x84, 0x5a, 0xb2, 0x7d, 0x52, 0xc8, 0x94, 0x63, 0xd7, 0x9d, 0x6c, 0xd0, 0x96, 0x67, 0xb0, 0x7b, 0x50, 0xc6, 0x8a, 0x5a, 0xcb, 0x8e, 0x61, 0xb7, 0x7a, 0x4d, 0xc5, 0x8c, 0x5a, 0xc8, 0x93, 0x67, 0xa3, 0x75, 0x52, 0x8e, 0x69, 0x4e, 0x52, 0x35, 0x1f, 0x5c, 0x3c, 0x27, 0xab, 0x7e, 0x5e, 0xad, 0x7f, 0x5a, 0xd1, 0x9e, 0x75, 0xe3, 0xb0, 0x85, 0xbf, 0x8c, 0x61, 0xc6, 0x93, 0x65, 0xcc, 0xa1, 0x7a, 0xdb, 0xb7, 0x98, 0xd3, 0xaf, 0x91, 0xbc, 0x94, 0x71, 0xc6, 0x9d, 0x7b, 0xab, 0x83, 0x61, 0x9c, 0x78, 0x56, 0xa4, 0x7c, 0x5b, 0x79, 0x52, 0x33, 0x99, 0x6d, 0x4a, 0x91, 0x63, 0x3e, 0xa5, 0x74, 0x51, 0xb8, 0x83, 0x59, 0xc4, 0x8e, 0x5f, 0xbf, 0x89, 0x5b, 0xb8, 0x81, 0x54, 0xb8, 0x81, 0x55, 0xbe, 0x87, 0x5a, 0xc3, 0x89, 0x59, 0xb9, 0x7f, 0x4f, 0xc4, 0x8b, 0x60, 0xba, 0x86, 0x59, 0xc0, 0x8b, 0x61, 0xbc, 0x87, 0x5d, 0xad, 0x7a, 0x4f, 0xb1, 0x7e, 0x53, 0xa4, 0x7b, 0x57, 0xb6, 0x8a, 0x63, 0xd1, 0xa5, 0x7e, 0xc6, 0x9a, 0x73, 0xdb, 0xb4, 0x94, 0xe5, 0xbf, 0x9e, 0xd5, 0xaa, 0x85, 0xc7, 0x94, 0x69, 0xc5, 0x8e, 0x60, 0xc7, 0x91, 0x63, 0xd5, 0x9d, 0x71, 0xdb, 0xa0, 0x72, 0xe2, 0xb1, 0x89, 0xca, 0x97, 0x6e, 0x94, 0x68, 0x4a, 0x9a, 0x6b, 0x48, 0xcc, 0x9f, 0x76, 0xcd, 0xa1, 0x7c, 0xa6, 0x76, 0x52, 0xb2, 0x7d, 0x51, 0xb8, 0x7e, 0x4e, 0xba, 0x7f, 0x4d, 0xc2, 0x86, 0x54, 0xa3, 0x6a, 0x48, 0xba, 0x7d, 0x51, 0xcb, 0x8e, 0x5d, 0xcf, 0x98, 0x64, 0xc0, 0x8c, 0x61, 0xc1, 0x87, 0x57, 0xd2, 0x95, 0x64, 0xcc, 0x90, 0x5e, 0xce, 0x91, 0x5c, 0xde, 0xa1, 0x6c, 0xde, 0xa1, 0x69, 0xe7, 0xaa, 0x71, 0xeb, 0xaf, 0x76, 0xe9, 0xae, 0x77, 0xe5, 0xab, 0x79, 0xe0, 0xb1, 0x82, 0xdb, 0xb7, 0x92, 0xdd, 0xcb, 0xbb, 0xda, 0xd2, 0xc8, 0xe0, 0xdb, 0xd3, 0xf7, 0xf5, 0xf1, 0xf8, 0xf8, 0xf6, 0xfb, 0xfc, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfe, 0xff, 0xfb, 0xfa, 0xfa, 0xf1, 0xf0, 0xed, 0xe1, 0xd9, 0xd3, 0xc1, 0xab, 0x98, 0xad, 0x81, 0x64, 0xb4, 0x81, 0x58, 0xb3, 0x7e, 0x55, 0xb7, 0x7f, 0x56, 0xb0, 0x7d, 0x54, 0x96, 0x6a, 0x46, 0x88, 0x5f, 0x3f, 0x8f, 0x65, 0x44, 0x9a, 0x6c, 0x4b, 0xac, 0x7c, 0x54, 0xc0, 0x8b, 0x5c, 0xc3, 0x8a, 0x58, 0xc5, 0x8b, 0x5b, 0xd0, 0x96, 0x66, 0xce, 0x99, 0x6b, 0xdb, 0xa2, 0x75, 0xc7, 0x90, 0x61, 0xaf, 0x7a, 0x4e, 0xab, 0x7a, 0x53, 0xc3, 0x8f, 0x63, 0xc5, 0x91, 0x65, 0xc6, 0x90, 0x60, 0xbb, 0x83, 0x56, 0xb2, 0x76, 0x49, 0xbc, 0x82, 0x53, 0xd7, 0x9a, 0x68, 0xd3, 0x97, 0x61, 0xbd, 0x80, 0x50, 0xd0, 0x95, 0x66, 0xcc, 0x96, 0x6a, 0xb1, 0x80, 0x5e, 0x82, 0x5d, 0x43, 0x56, 0x39, 0x23, 0x51, 0x34, 0x1f, 0x82, 0x5b, 0x3f, 0xa7, 0x77, 0x53, 0xc0, 0x8e, 0x6a, 0xc6, 0x95, 0x6c, 0xce, 0x99, 0x6e, 0xcc, 0x9b, 0x6c, 0xb8, 0x88, 0x65, 0xd0, 0xa5, 0x81, 0xcd, 0xa7, 0x87, 0xb7, 0x8e, 0x6e, 0x9d, 0x78, 0x5a, 0xa2, 0x7a, 0x58, 0xab, 0x83, 0x60, 0xa1, 0x74, 0x53, 0x99, 0x6e, 0x4e, 0x7b, 0x4f, 0x2d, 0x97, 0x69, 0x45, 0xb1, 0x7f, 0x58, 0xb4, 0x7e, 0x53, 0xb8, 0x80, 0x52, 0xb5, 0x7d, 0x50, 0xb1, 0x79, 0x4d, 0xa5, 0x6e, 0x44, 0xb2, 0x7a, 0x50, 0xb9, 0x7f, 0x52, 0xbd, 0x81, 0x51, 0xb2, 0x77, 0x49, 0xb8, 0x7f, 0x50, 0xb1, 0x7d, 0x54, 0xc1, 0x8d, 0x63, 0xba, 0x8b, 0x64, 0xb1, 0x7e, 0x53, 0xb7, 0x89, 0x65, 0xbb, 0x88, 0x5f, 0xd6, 0xa5, 0x7e, 0xb5, 0x88, 0x63, 0xd2, 0xa9, 0x83, 0xe2, 0xb9, 0x93, 0xd0, 0x9f, 0x75, 0xb6, 0x81, 0x55, 0xc7, 0x91, 0x65, 0xd2, 0x9c, 0x71, 0xd7, 0xa1, 0x77, 0xc5, 0x8f, 0x66, 0xe0, 0xad, 0x86, 0xad, 0x80, 0x5d, 0xa0, 0x76, 0x55, 0xc5, 0x97, 0x72, 0xbc, 0x8e, 0x6b, 0xcd, 0x99, 0x70, 0xb0, 0x79, 0x4e, 0xaf, 0x79, 0x4b, 0xb6, 0x7d, 0x50, 0xbb, 0x7f, 0x4f, 0xc4, 0x89, 0x55, 0xc4, 0x8a, 0x5a, 0xb8, 0x7e, 0x53, 0xc1, 0x86, 0x59, 0xc2, 0x89, 0x5c, 0xd2, 0x9b, 0x6c, 0xc1, 0x8b, 0x5e, 0xcd, 0x93, 0x65, 0xd7, 0x9c, 0x6b, 0xd4, 0x98, 0x64, 0xcf, 0x91, 0x5d, 0xe0, 0xa3, 0x6e, 0xe0, 0xa3, 0x6c, 0xe6, 0xa8, 0x71, 0xe7, 0xaa, 0x74, 0xe3, 0xa8, 0x73, 0xdc, 0xa6, 0x72, 0xda, 0xa8, 0x82, 0xd9, 0xba, 0x9f, 0xd5, 0xc9, 0xbc, 0xe8, 0xe3, 0xdc, 0xf6, 0xf5, 0xf2, 0xf4, 0xf5, 0xf2, 0xfd, 0xfd, 0xfb, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf2, 0xee, 0xeb, 0xe4, 0xde, 0xda, 0xd9, 0xcb, 0xc0, 0xbf, 0xa4, 0x8c, 0xbb, 0x8b, 0x67, 0xb7, 0x81, 0x57, 0xba, 0x85, 0x5b, 0xb8, 0x85, 0x53, 0x97, 0x66, 0x41, 0x91, 0x65, 0x44, 0x93, 0x68, 0x45, 0x95, 0x69, 0x47, 0x98, 0x6c, 0x49, 0x9f, 0x71, 0x4b, 0xb1, 0x7c, 0x50, 0xb9, 0x80, 0x50, 0xca, 0x90, 0x5f, 0xda, 0xa0, 0x6f, 0xd1, 0x9c, 0x6e, 0xcc, 0x91, 0x65, 0xb6, 0x80, 0x54, 0xad, 0x7b, 0x4e, 0xbb, 0x89, 0x5f, 0xc7, 0x94, 0x68, 0xb9, 0x88, 0x5e, 0xbc, 0x88, 0x5b, 0xc0, 0x89, 0x5c, 0xca, 0x8e, 0x5d, 0xca, 0x8c, 0x5b, 0xcc, 0x8e, 0x5d, 0xde, 0xa2, 0x6d, 0xd8, 0x9c, 0x6c, 0xc3, 0x88, 0x5a, 0xd3, 0x9d, 0x71, 0xbe, 0x8c, 0x67, 0x8d, 0x68, 0x4a, 0x57, 0x3a, 0x26, 0x51, 0x33, 0x1e, 0x71, 0x4d, 0x32, 0xa2, 0x74, 0x53, 0xbe, 0x90, 0x6f, 0xb2, 0x86, 0x5e, 0xbc, 0x8b, 0x60, 0xc3, 0x92, 0x66, 0xb6, 0x84, 0x5f, 0xd3, 0xa7, 0x82, 0xd5, 0xad, 0x8c, 0xa8, 0x81, 0x62, 0x87, 0x63, 0x47, 0xaa, 0x80, 0x5a, 0xbc, 0x91, 0x6c, 0xa9, 0x7f, 0x5d, 0x86, 0x5c, 0x3a, 0x95, 0x68, 0x43, 0xa6, 0x78, 0x54, 0xad, 0x7d, 0x58, 0xb2, 0x7f, 0x56, 0xad, 0x76, 0x4b, 0xa4, 0x6e, 0x43, 0xa5, 0x6e, 0x44, 0xa9, 0x72, 0x49, 0xb0, 0x79, 0x4f, 0xb9, 0x80, 0x55, 0xc3, 0x87, 0x58, 0xbd, 0x80, 0x51, 0xb7, 0x7b, 0x4c, 0xbe, 0x87, 0x5b, 0xc3, 0x8d, 0x61, 0xbf, 0x8f, 0x65, 0xbb, 0x88, 0x5d, 0xb7, 0x88, 0x64, 0xbb, 0x87, 0x60, 0xc8, 0x95, 0x6d, 0xad, 0x7f, 0x5a, 0xbb, 0x8e, 0x67, 0xc7, 0x99, 0x73, 0xc9, 0x95, 0x6a, 0xb9, 0x84, 0x58, 0xb5, 0x80, 0x56, 0xd0, 0x9b, 0x71, 0xd6, 0xa3, 0x7a, 0xcc, 0x9a, 0x73, 0xcd, 0x9c, 0x75, 0x9b, 0x71, 0x50, 0xbd, 0x8f, 0x6a, 0xbe, 0x90, 0x6a, 0xca, 0x9b, 0x7b, 0xc4, 0x8f, 0x67, 0xb8, 0x80, 0x54, 0xbb, 0x86, 0x56, 0xa9, 0x70, 0x44, 0xbd, 0x81, 0x52, 0xd2, 0x96, 0x61, 0xd0, 0x94, 0x62, 0xc4, 0x8d, 0x5e, 0xbd, 0x82, 0x56, 0xc7, 0x8d, 0x60, 0xd0, 0x99, 0x6c, 0xcf, 0x98, 0x6b, 0xcb, 0x90, 0x64, 0xd3, 0x98, 0x69, 0xd7, 0x9b, 0x67, 0xd5, 0x98, 0x64, 0xd5, 0x97, 0x63, 0xe1, 0xa4, 0x6f, 0xe1, 0xa2, 0x6e, 0xe1, 0xa2, 0x6d, 0xe1, 0xa8, 0x72, 0xe2, 0xab, 0x74, 0xe1, 0xab, 0x83, 0xd7, 0xa7, 0x81, 0xcf, 0xb5, 0x98, 0xdc, 0xd5, 0xcc, 0xf2, 0xef, 0xe9, 0xfa, 0xfb, 0xf8, 0xfb, 0xfb, 0xf9, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf7, 0xf4, 0xf2, 0xe6, 0xdf, 0xd9, 0xe0, 0xd7, 0xd0, 0xcb, 0xb8, 0xa9, 0xcd, 0xad, 0x93, 0xbe, 0x8b, 0x65, 0xc0, 0x8b, 0x60, 0xb5, 0x7f, 0x55, 0x9e, 0x6c, 0x45, 0x8f, 0x61, 0x3e, 0x99, 0x6b, 0x45, 0xa3, 0x74, 0x4d, 0x93, 0x66, 0x42, 0x93, 0x67, 0x44, 0x97, 0x69, 0x45, 0xaf, 0x79, 0x51, 0xba, 0x81, 0x55, 0xce, 0x95, 0x64, 0xcd, 0x94, 0x63, 0xdc, 0xa7, 0x79, 0xb6, 0x7c, 0x50, 0xb3, 0x7d, 0x51, 0xbf, 0x8d, 0x5f, 0xc3, 0x8e, 0x61, 0xb4, 0x85, 0x5d, 0xa9, 0x7c, 0x55, 0xbe, 0x8c, 0x62, 0xd8, 0xa2, 0x70, 0xdc, 0xa1, 0x6d, 0xcc, 0x8e, 0x5d, 0xc9, 0x8b, 0x5a, 0xe0, 0xa5, 0x6f, 0xe3, 0xa7, 0x76, 0xdd, 0xa2, 0x74, 0xcf, 0x99, 0x6d, 0xbf, 0x8d, 0x62, 0x9c, 0x77, 0x55, 0x59, 0x3c, 0x28, 0x51, 0x32, 0x1d, 0x62, 0x3f, 0x25, 0x90, 0x67, 0x49, 0x9a, 0x70, 0x52, 0xb4, 0x8a, 0x67, 0xbf, 0x91, 0x6a, 0xce, 0x9d, 0x75, 0xc3, 0x93, 0x69, 0xc4, 0x97, 0x72, 0xda, 0xb2, 0x90, 0x82, 0x5f, 0x44, 0x8b, 0x64, 0x46, 0xb7, 0x87, 0x5f, 0xa3, 0x73, 0x4c, 0x93, 0x69, 0x48, 0x79, 0x4e, 0x2c, 0x9c, 0x6e, 0x49, 0xab, 0x7d, 0x58, 0x95, 0x68, 0x45, 0x93, 0x62, 0x3c, 0x99, 0x67, 0x40, 0x9c, 0x6b, 0x44, 0xa2, 0x6f, 0x47, 0xa9, 0x72, 0x49, 0xb2, 0x7b, 0x52, 0xb4, 0x7b, 0x4e, 0xb5, 0x79, 0x49, 0xc1, 0x84, 0x55, 0xbc, 0x7f, 0x4f, 0xc5, 0x8c, 0x57, 0xcc, 0x92, 0x5e, 0xc4, 0x8b, 0x5c, 0xc8, 0x95, 0x6b, 0xb9, 0x8a, 0x66, 0xc3, 0x91, 0x69, 0xc0, 0x8a, 0x5e, 0xb1, 0x7f, 0x57, 0xa5, 0x75, 0x4c, 0xc1, 0x90, 0x68, 0xc1, 0x8c, 0x60, 0xc3, 0x8e, 0x62, 0xd0, 0x9b, 0x71, 0xd5, 0xa0, 0x76, 0xc9, 0x98, 0x71, 0xd2, 0xa4, 0x7f, 0xc9, 0x9c, 0x78, 0x96, 0x6d, 0x4e, 0xc0, 0x8e, 0x66, 0xbe, 0x90, 0x6a, 0xc7, 0x99, 0x78, 0xbe, 0x89, 0x61, 0xbc, 0x85, 0x58, 0xca, 0x94, 0x64, 0xb1, 0x78, 0x4c, 0xbc, 0x81, 0x52, 0xcb, 0x8f, 0x5b, 0xcb, 0x8f, 0x5e, 0xd2, 0x9a, 0x6c, 0xcc, 0x91, 0x65, 0xca, 0x90, 0x63, 0xc2, 0x8c, 0x5e, 0xbe, 0x87, 0x5a, 0xd2, 0x98, 0x6b, 0xc9, 0x8f, 0x5f, 0xd0, 0x93, 0x60, 0xd6, 0x98, 0x65, 0xd6, 0x98, 0x64, 0xde, 0xa0, 0x6b, 0xe3, 0xa4, 0x6f, 0xde, 0xa0, 0x6b, 0xe1, 0xa8, 0x72, 0xda, 0xa3, 0x6c, 0xe2, 0xad, 0x85, 0xda, 0xb8, 0x95, 0xe1, 0xd1, 0xca, 0xe3, 0xd8, 0xcd, 0xdc, 0xd5, 0xcd, 0xf5, 0xf5, 0xf3, 0xfa, 0xfa, 0xf8, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xef, 0xee, 0xea, 0xf0, 0xef, 0xeb, 0xe5, 0xe1, 0xda, 0xce, 0xb9, 0xa7, 0xc5, 0x9f, 0x81, 0xc7, 0x99, 0x74, 0xb5, 0x80, 0x56, 0xaa, 0x75, 0x4b, 0x9d, 0x6e, 0x4b, 0x9f, 0x6d, 0x48, 0xaf, 0x7c, 0x52, 0xa3, 0x73, 0x4b, 0x85, 0x59, 0x35, 0x87, 0x5c, 0x3a, 0x87, 0x5b, 0x39, 0xa8, 0x75, 0x4e, 0xbb, 0x83, 0x55, 0xce, 0x98, 0x66, 0xcb, 0x94, 0x63, 0xce, 0x9a, 0x6b, 0xab, 0x79, 0x4f, 0xc0, 0x8c, 0x60, 0xc9, 0x94, 0x64, 0xb7, 0x89, 0x60, 0xb1, 0x82, 0x5d, 0xc3, 0x93, 0x69, 0xdd, 0xa9, 0x7a, 0xcd, 0x96, 0x68, 0xcd, 0x91, 0x60, 0xcc, 0x92, 0x61, 0xd9, 0x9a, 0x65, 0xe0, 0xa2, 0x6f, 0xe4, 0xa7, 0x73, 0xdd, 0xa2, 0x73, 0xd0, 0x9a, 0x6e, 0xc4, 0x90, 0x68, 0x9d, 0x71, 0x52, 0x60, 0x40, 0x28, 0x55, 0x36, 0x1f, 0x52, 0x30, 0x16, 0x7f, 0x59, 0x3f, 0xa3, 0x78, 0x5a, 0xac, 0x83, 0x69, 0xa2, 0x76, 0x52, 0xb5, 0x87, 0x60, 0xa9, 0x7b, 0x54, 0xbe, 0x8f, 0x67, 0xab, 0x7d, 0x5a, 0x6c, 0x4f, 0x38, 0x96, 0x6e, 0x4e, 0xa4, 0x76, 0x4e, 0x91, 0x62, 0x40, 0x79, 0x54, 0x37, 0x8d, 0x61, 0x3d, 0x9e, 0x70, 0x49, 0x9f, 0x71, 0x4a, 0x99, 0x6b, 0x46, 0x8d, 0x5e, 0x3a, 0x8d, 0x5f, 0x3a, 0x95, 0x67, 0x43, 0x98, 0x68, 0x42, 0xa4, 0x70, 0x48, 0xa4, 0x70, 0x48, 0xb5, 0x80, 0x55, 0xbf, 0x84, 0x55, 0xc4, 0x8a, 0x5b, 0xcb, 0x8c, 0x5a, 0xcc, 0x8f, 0x60, 0xcd, 0x90, 0x61, 0xcb, 0x94, 0x66, 0xd1, 0x9e, 0x72, 0xc1, 0x90, 0x68, 0xb7, 0x85, 0x60, 0xc2, 0x8d, 0x61, 0xbe, 0x8a, 0x5e, 0xb1, 0x88, 0x60, 0xa1, 0x79, 0x58, 0xcb, 0x95, 0x6a, 0xcb, 0x94, 0x69, 0xc9, 0x95, 0x6a, 0xd3, 0xa2, 0x7a, 0xcc, 0x9e, 0x7a, 0xc0, 0x92, 0x6b, 0xbd, 0x90, 0x67, 0xb4, 0x85, 0x61, 0xd4, 0xa6, 0x81, 0xbe, 0x92, 0x6d, 0xbd, 0x91, 0x6b, 0xa7, 0x74, 0x4e, 0xcf, 0x99, 0x6a, 0xcc, 0x92, 0x61, 0xbd, 0x7e, 0x4f, 0xc3, 0x8c, 0x5b, 0xbb, 0x80, 0x50, 0xce, 0x92, 0x60, 0xc6, 0x8e, 0x5f, 0xb3, 0x7e, 0x53, 0xcc, 0x98, 0x69, 0xcf, 0x99, 0x6b, 0xd7, 0xa1, 0x73, 0xc5, 0x8b, 0x5b, 0xce, 0x94, 0x64, 0xd0, 0x92, 0x60, 0xd1, 0x91, 0x5e, 0xd8, 0x98, 0x64, 0xd8, 0x98, 0x64, 0xe1, 0xa3, 0x6e, 0xda, 0x9d, 0x67, 0xd9, 0x9c, 0x67, 0xde, 0xa6, 0x76, 0xdb, 0xaa, 0x81, 0xda, 0xb4, 0x95, 0xdc, 0xc8, 0xb6, 0xdb, 0xd4, 0xca, 0xe4, 0xe3, 0xdd, 0xec, 0xe8, 0xe1, 0xfb, 0xfa, 0xf8, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xef, 0xed, 0xea, 0xf2, 0xf1, 0xed, 0xda, 0xd1, 0xc8, 0xc7, 0xad, 0x98, 0xc3, 0x9a, 0x7a, 0xaa, 0x78, 0x51, 0xad, 0x75, 0x4a, 0xa0, 0x72, 0x4e, 0x96, 0x68, 0x42, 0xab, 0x7a, 0x50, 0xa7, 0x74, 0x49, 0x99, 0x6a, 0x41, 0x8a, 0x5e, 0x3a, 0x84, 0x5a, 0x38, 0x82, 0x56, 0x34, 0xa4, 0x72, 0x49, 0xb9, 0x7f, 0x52, 0xd1, 0x9b, 0x6a, 0xd0, 0x9a, 0x68, 0xc4, 0x90, 0x61, 0xb0, 0x7e, 0x55, 0xd6, 0xa1, 0x72, 0xb8, 0x83, 0x58, 0xaf, 0x82, 0x58, 0xbc, 0x8d, 0x68, 0xe3, 0xb3, 0x88, 0xdc, 0xa8, 0x79, 0xcd, 0x96, 0x68, 0xce, 0x92, 0x62, 0xcf, 0x95, 0x64, 0xd5, 0x96, 0x61, 0xe0, 0xa2, 0x6f, 0xd8, 0x9a, 0x67, 0xdf, 0xa4, 0x71, 0xd5, 0xa0, 0x6f, 0xc8, 0x94, 0x68, 0xa6, 0x7b, 0x58, 0x70, 0x50, 0x37, 0x59, 0x3a, 0x23, 0x67, 0x45, 0x2b, 0x75, 0x52, 0x36, 0x89, 0x63, 0x44, 0x87, 0x64, 0x4c, 0xa2, 0x7b, 0x5a, 0xa3, 0x75, 0x52, 0xb3, 0x85, 0x62, 0xb4, 0x85, 0x5f, 0x8c, 0x65, 0x4a, 0x6b, 0x4b, 0x32, 0xa5, 0x77, 0x53, 0x95, 0x6b, 0x47, 0x87, 0x5c, 0x3d, 0x7b, 0x52, 0x31, 0x81, 0x57, 0x36, 0x93, 0x65, 0x42, 0x99, 0x6b, 0x48, 0x89, 0x5b, 0x37, 0x83, 0x54, 0x30, 0x8e, 0x60, 0x3b, 0x90, 0x62, 0x3e, 0x90, 0x62, 0x3d, 0x96, 0x67, 0x41, 0x98, 0x69, 0x44, 0xa9, 0x77, 0x4f, 0xb0, 0x7a, 0x50, 0xc0, 0x86, 0x58, 0xcc, 0x8c, 0x5a, 0xbe, 0x82, 0x52, 0xba, 0x7e, 0x4e, 0xcd, 0x91, 0x5f, 0xcf, 0x99, 0x6b, 0xc9, 0x98, 0x6c, 0xac, 0x7b, 0x51, 0xc4, 0x8f, 0x63, 0xca, 0x95, 0x69, 0xcb, 0x97, 0x6d, 0x92, 0x66, 0x49, 0xbe, 0x88, 0x5f, 0xc5, 0x8e, 0x62, 0xc7, 0x93, 0x68, 0xca, 0x9b, 0x72, 0xba, 0x8c, 0x69, 0xb7, 0x88, 0x66, 0xba, 0x8a, 0x63, 0xc5, 0x95, 0x6f, 0xe1, 0xb8, 0x97, 0xd2, 0xa6, 0x81, 0xd1, 0xa5, 0x7f, 0xbb, 0x84, 0x5c, 0xcc, 0x92, 0x61, 0xc0, 0x86, 0x56, 0xba, 0x7a, 0x4c, 0xc7, 0x8c, 0x57, 0xb5, 0x7d, 0x52, 0xca, 0x8e, 0x5c, 0xcd, 0x95, 0x67, 0xbd, 0x89, 0x5a, 0xb4, 0x7f, 0x54, 0xce, 0x97, 0x6a, 0xce, 0x98, 0x6a, 0xce, 0x94, 0x64, 0xc8, 0x8d, 0x5d, 0xd2, 0x96, 0x66, 0xc9, 0x8d, 0x5d, 0xd1, 0x93, 0x61, 0xdb, 0x9b, 0x67, 0xdb, 0x9c, 0x67, 0xd0, 0x92, 0x5d, 0xda, 0x9d, 0x68, 0xcb, 0x92, 0x63, 0xcc, 0x9b, 0x72, 0xd1, 0xab, 0x8b, 0xcd, 0xb0, 0x96, 0xe1, 0xd9, 0xd0, 0xf3, 0xf2, 0xec, 0xeb, 0xe7, 0xe2, 0xfb, 0xfb, 0xf8, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xf8, 0xf6, 0xf8, 0xf7, 0xf5, 0xec, 0xe7, 0xe1, 0xd2, 0xc6, 0xbc, 0xc9, 0xac, 0x94, 0xb3, 0x85, 0x60, 0xb4, 0x81, 0x59, 0x9d, 0x72, 0x50, 0x90, 0x66, 0x44, 0xa1, 0x6f, 0x4b, 0x9d, 0x6b, 0x46, 0xac, 0x77, 0x4c, 0x93, 0x65, 0x3f, 0x7d, 0x58, 0x3a, 0x6c, 0x48, 0x2c, 0x73, 0x4f, 0x33, 0x99, 0x6c, 0x48, 0xbd, 0x85, 0x54, 0xd0, 0x99, 0x68, 0xc5, 0x91, 0x5e, 0xbd, 0x86, 0x59, 0xca, 0x93, 0x65, 0xc6, 0x91, 0x66, 0xb1, 0x81, 0x59, 0xc6, 0x97, 0x74, 0xde, 0xb0, 0x87, 0xd5, 0xa0, 0x74, 0xc7, 0x92, 0x66, 0xb8, 0x83, 0x57, 0xb5, 0x81, 0x55, 0xc6, 0x8a, 0x5a, 0xd0, 0x94, 0x64, 0xd7, 0x97, 0x65, 0xe8, 0xa8, 0x73, 0xe0, 0xa4, 0x75, 0xd8, 0x9f, 0x6e, 0xcf, 0x9a, 0x6b, 0xb8, 0x89, 0x65, 0x85, 0x5e, 0x42, 0x6b, 0x47, 0x2b, 0x6e, 0x4b, 0x2f, 0x6e, 0x49, 0x2d, 0x96, 0x6d, 0x4d, 0x70, 0x4e, 0x35, 0x85, 0x61, 0x4a, 0xa8, 0x7d, 0x5e, 0xa0, 0x76, 0x51, 0x9b, 0x72, 0x55, 0x7a, 0x5b, 0x42, 0x7b, 0x5a, 0x3b, 0x9c, 0x6b, 0x48, 0x91, 0x64, 0x40, 0x7a, 0x52, 0x33, 0xa0, 0x6f, 0x48, 0x99, 0x6a, 0x48, 0x85, 0x5c, 0x3b, 0x7f, 0x51, 0x2c, 0x86, 0x54, 0x30, 0x87, 0x55, 0x32, 0x8d, 0x5b, 0x37, 0x9b, 0x69, 0x44, 0x94, 0x65, 0x40, 0x9f, 0x72, 0x4d, 0xa8, 0x76, 0x52, 0xa5, 0x73, 0x4e, 0xab, 0x79, 0x54, 0xba, 0x83, 0x58, 0xbb, 0x80, 0x51, 0xc5, 0x89, 0x59, 0xba, 0x7d, 0x4e, 0xbb, 0x81, 0x50, 0xbf, 0x85, 0x55, 0xc1, 0x8c, 0x64, 0xb5, 0x80, 0x58, 0xc2, 0x8f, 0x65, 0xdc, 0xa6, 0x76, 0xc9, 0x93, 0x66, 0xab, 0x7d, 0x55, 0xa1, 0x72, 0x4d, 0xc8, 0x8e, 0x61, 0xbe, 0x8f, 0x62, 0xbe, 0x8f, 0x6e, 0xcb, 0x9f, 0x78, 0xb6, 0x86, 0x64, 0xca, 0x99, 0x6d, 0xd6, 0xae, 0x86, 0xdb, 0xae, 0x8d, 0xd6, 0xaa, 0x85, 0xdb, 0xaf, 0x8a, 0xbc, 0x88, 0x5e, 0xdd, 0xa6, 0x77, 0xcd, 0x92, 0x62, 0xb0, 0x75, 0x45, 0xd2, 0x92, 0x5f, 0xcc, 0x8f, 0x60, 0xcb, 0x90, 0x5f, 0xc7, 0x91, 0x65, 0xc6, 0x90, 0x61, 0xc1, 0x8a, 0x61, 0xbd, 0x89, 0x5c, 0xce, 0x99, 0x6d, 0xd5, 0x9f, 0x6e, 0xc4, 0x8e, 0x5c, 0xd0, 0x97, 0x63, 0xd1, 0x96, 0x62, 0xc9, 0x8b, 0x57, 0xd9, 0x9a, 0x65, 0xde, 0x9e, 0x69, 0xdd, 0x9e, 0x6c, 0xd3, 0x99, 0x67, 0xcf, 0x94, 0x61, 0xc3, 0x8d, 0x5b, 0xcf, 0xa0, 0x7e, 0xc9, 0xad, 0x95, 0xda, 0xca, 0xbf, 0xef, 0xed, 0xe9, 0xf2, 0xf0, 0xed, 0xfa, 0xf9, 0xf5, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfc, 0xf6, 0xf6, 0xf4, 0xf4, 0xf4, 0xf2, 0xe3, 0xdf, 0xd9, 0xc9, 0xb9, 0xac, 0xc7, 0xa6, 0x8c, 0xb6, 0x8e, 0x6e, 0xa6, 0x79, 0x56, 0xa1, 0x71, 0x4c, 0xa6, 0x76, 0x50, 0xa5, 0x74, 0x4e, 0xa1, 0x6f, 0x4a, 0x91, 0x61, 0x3f, 0x7b, 0x4f, 0x31, 0x72, 0x4c, 0x2f, 0x68, 0x45, 0x29, 0x77, 0x53, 0x37, 0x9e, 0x71, 0x4c, 0xc9, 0x91, 0x60, 0xce, 0x96, 0x65, 0xca, 0x96, 0x64, 0xb2, 0x7b, 0x4e, 0xd0, 0x9a, 0x6c, 0xbd, 0x88, 0x5d, 0xba, 0x89, 0x61, 0xdf, 0xb2, 0x8a, 0xe3, 0xb7, 0x89, 0xcc, 0x97, 0x6b, 0xc1, 0x8c, 0x60, 0xaf, 0x7a, 0x4e, 0xc4, 0x8f, 0x63, 0xda, 0x9e, 0x6e, 0xc8, 0x8c, 0x5d, 0xcf, 0x90, 0x5e, 0xda, 0x9a, 0x65, 0xe6, 0xab, 0x7b, 0xe2, 0xa9, 0x78, 0xdc, 0xa7, 0x78, 0xc1, 0x93, 0x6e, 0x81, 0x5a, 0x3e, 0x75, 0x52, 0x36, 0x7b, 0x58, 0x3c, 0x63, 0x3e, 0x22, 0x9c, 0x73, 0x53, 0x70, 0x4e, 0x35, 0x7c, 0x59, 0x41, 0x95, 0x6d, 0x51, 0x92, 0x6c, 0x49, 0x8e, 0x65, 0x48, 0x6b, 0x4c, 0x34, 0x89, 0x5f, 0x3f, 0xa3, 0x73, 0x4c, 0x8d, 0x68, 0x4b, 0x8a, 0x62, 0x42, 0xb2, 0x80, 0x59, 0x98, 0x69, 0x47, 0x96, 0x65, 0x3f, 0xaa, 0x79, 0x51, 0x9b, 0x69, 0x45, 0x97, 0x64, 0x41, 0x97, 0x65, 0x41, 0x9f, 0x6d, 0x48, 0x99, 0x67, 0x42, 0xaa, 0x78, 0x51, 0xa3, 0x73, 0x4c, 0x9b, 0x69, 0x44, 0xa4, 0x72, 0x4c, 0xb3, 0x80, 0x57, 0xb9, 0x82, 0x57, 0xbc, 0x83, 0x56, 0xb9, 0x80, 0x53, 0xce, 0x95, 0x63, 0xb3, 0x7a, 0x49, 0xd7, 0xa3, 0x75, 0xcf, 0x9a, 0x6c, 0xa5, 0x77, 0x4c, 0xcf, 0x9c, 0x73, 0xc7, 0x91, 0x64, 0xa1, 0x73, 0x4c, 0x9e, 0x72, 0x4e, 0xbd, 0x87, 0x5e, 0xb5, 0x86, 0x5f, 0xc8, 0x9a, 0x78, 0xbd, 0x91, 0x6a, 0xc6, 0x97, 0x6e, 0xc6, 0x94, 0x6b, 0xe2, 0xb9, 0x92, 0xd7, 0xac, 0x8a, 0xd2, 0xa6, 0x81, 0xd7, 0xab, 0x86, 0xb3, 0x7e, 0x54, 0xb7, 0x80, 0x51, 0xc7, 0x8d, 0x5d, 0xb2, 0x78, 0x47, 0xcb, 0x8f, 0x5a, 0xbd, 0x86, 0x56, 0xc0, 0x8a, 0x5d, 0xc2, 0x90, 0x65, 0xcd, 0x9c, 0x72, 0xb0, 0x7e, 0x53, 0xc4, 0x90, 0x63, 0xcf, 0x9b, 0x6e, 0xc1, 0x8b, 0x5a, 0xd6, 0xa0, 0x6e, 0xcc, 0x92, 0x5f, 0xd8, 0x9c, 0x68, 0xcb, 0x8d, 0x59, 0xd3, 0x93, 0x5f, 0xdc, 0x9c, 0x65, 0xe4, 0xa6, 0x6e, 0xd0, 0x96, 0x62, 0xce, 0x92, 0x62, 0xbe, 0x87, 0x5c, 0xc8, 0x96, 0x6c, 0xce, 0xa8, 0x8f, 0xd4, 0xc0, 0xb2, 0xe7, 0xe0, 0xdb, 0xf6, 0xf5, 0xf1, 0xf5, 0xf4, 0xf0, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xfb, 0xfb, 0xf9, 0xf5, 0xf5, 0xf1, 0xee, 0xe7, 0xe0, 0xc8, 0xb3, 0xa4, 0xc8, 0xa4, 0x89, 0xbf, 0x8e, 0x67, 0xa5, 0x74, 0x4e, 0xa8, 0x79, 0x54, 0xa0, 0x71, 0x4c, 0xa4, 0x73, 0x4b, 0xa4, 0x72, 0x4b, 0x82, 0x5a, 0x3c, 0x75, 0x4d, 0x31, 0x71, 0x4b, 0x2e, 0x61, 0x3c, 0x20, 0x69, 0x45, 0x29, 0x8c, 0x5d, 0x38, 0xc4, 0x8d, 0x5d, 0xc2, 0x89, 0x58, 0xda, 0xa3, 0x72, 0xcb, 0x95, 0x65, 0xb9, 0x83, 0x56, 0xb9, 0x87, 0x5c, 0xd4, 0xa6, 0x7b, 0xe5, 0xb8, 0x8c, 0xd9, 0xa8, 0x7b, 0xc1, 0x8e, 0x62, 0xbe, 0x8a, 0x5f, 0xbb, 0x87, 0x5e, 0xbd, 0x8a, 0x5e, 0xca, 0x8f, 0x62, 0xca, 0x90, 0x5e, 0xd7, 0x98, 0x61, 0xe4, 0xa4, 0x70, 0xdb, 0x9f, 0x6e, 0xe0, 0xa9, 0x78, 0xde, 0xab, 0x7d, 0xc8, 0x9b, 0x76, 0x90, 0x69, 0x4c, 0x80, 0x5b, 0x3e, 0x77, 0x52, 0x36, 0x60, 0x3a, 0x1f, 0x8e, 0x67, 0x4a, 0x7e, 0x57, 0x3b, 0x79, 0x57, 0x41, 0x84, 0x5f, 0x45, 0x90, 0x6c, 0x50, 0x9a, 0x75, 0x59, 0x6c, 0x4f, 0x36, 0x93, 0x6b, 0x49, 0x97, 0x6f, 0x49, 0x71, 0x50, 0x36, 0x99, 0x72, 0x57, 0x9d, 0x70, 0x4d, 0x8f, 0x60, 0x3a, 0xab, 0x77, 0x4f, 0x9d, 0x6a, 0x44, 0x93, 0x61, 0x3c, 0x9e, 0x6b, 0x45, 0xa9, 0x76, 0x4e, 0xa9, 0x76, 0x4d, 0xae, 0x7b, 0x53, 0x9c, 0x69, 0x41, 0x94, 0x64, 0x3c, 0x9f, 0x6f, 0x46, 0xa5, 0x75, 0x4d, 0xa5, 0x73, 0x4d, 0xa9, 0x76, 0x4f, 0xa4, 0x6f, 0x47, 0xa8, 0x74, 0x49, 0xb3, 0x7b, 0x4e, 0xc2, 0x88, 0x59, 0xb8, 0x81, 0x56, 0xbc, 0x8a, 0x5e, 0xbd, 0x8d, 0x65, 0xa2, 0x70, 0x4a, 0xb8, 0x85, 0x5b, 0xb5, 0x83, 0x59, 0xa5, 0x79, 0x57, 0xc4, 0x91, 0x6a, 0xc1, 0x90, 0x6b, 0xbc, 0x8c, 0x67, 0xbf, 0x8f, 0x68, 0xce, 0x9d, 0x76, 0xdb, 0xaa, 0x83, 0xe5, 0xb8, 0x8f, 0xd6, 0xa7, 0x85, 0xed, 0xbf, 0x99, 0xcc, 0x9e, 0x77, 0xd1, 0x9c, 0x71, 0xd8, 0x9f, 0x6f, 0xc9, 0x8c, 0x5d, 0xbd, 0x83, 0x53, 0xd4, 0x97, 0x63, 0xc8, 0x90, 0x5e, 0xc6, 0x91, 0x65, 0xc1, 0x91, 0x68, 0xc9, 0x97, 0x6e, 0xb3, 0x81, 0x56, 0xc0, 0x8b, 0x5f, 0xc9, 0x92, 0x63, 0xca, 0x92, 0x61, 0xc3, 0x8a, 0x59, 0xdd, 0xa3, 0x70, 0xd9, 0x9c, 0x67, 0xd0, 0x91, 0x5b, 0xd0, 0x90, 0x5c, 0xdb, 0x9b, 0x65, 0xe0, 0xa2, 0x68, 0xd6, 0x9a, 0x63, 0xc4, 0x8c, 0x5f, 0xbe, 0x8a, 0x64, 0xbb, 0x8e, 0x6b, 0xc6, 0xa2, 0x83, 0xd4, 0xbd, 0xab, 0xe3, 0xdc, 0xd6, 0xf0, 0xed, 0xe8, 0xf8, 0xf7, 0xf5, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xfa, 0xfa, 0xf8, 0xf0, 0xf1, 0xeb, 0xd0, 0xc8, 0xc0, 0xc6, 0xb0, 0xa0, 0xc2, 0x9e, 0x82, 0xb3, 0x88, 0x65, 0xb6, 0x83, 0x5a, 0xa0, 0x72, 0x4e, 0x98, 0x6a, 0x46, 0xa5, 0x74, 0x4b, 0x9d, 0x6b, 0x43, 0x73, 0x4c, 0x2f, 0x76, 0x51, 0x34, 0x6b, 0x47, 0x2b, 0x5c, 0x3a, 0x1f, 0x5d, 0x3b, 0x21, 0x96, 0x66, 0x40, 0xbe, 0x88, 0x59, 0xd0, 0x96, 0x65, 0xce, 0x94, 0x64, 0xc1, 0x8c, 0x5a, 0xb3, 0x7c, 0x50, 0xc4, 0x92, 0x67, 0xd8, 0xab, 0x7e, 0xd9, 0xaa, 0x7d, 0xc8, 0x96, 0x6b, 0xc6, 0x93, 0x69, 0xc2, 0x8f, 0x64, 0xcd, 0x99, 0x72, 0xbf, 0x8c, 0x61, 0xca, 0x92, 0x65, 0xc8, 0x91, 0x5f, 0xc6, 0x8a, 0x55, 0xd5, 0x99, 0x66, 0xdd, 0xa3, 0x6f, 0xde, 0xa8, 0x78, 0xe1, 0xb0, 0x84, 0xdd, 0xb0, 0x8a, 0xa3, 0x7b, 0x5c, 0x80, 0x59, 0x3c, 0x8d, 0x66, 0x4a, 0x6a, 0x44, 0x29, 0x6e, 0x48, 0x2d, 0x84, 0x5a, 0x3c, 0x7d, 0x5c, 0x46, 0x84, 0x61, 0x47, 0x82, 0x5f, 0x45, 0x8e, 0x6c, 0x53, 0x87, 0x68, 0x4c, 0x83, 0x5f, 0x3c, 0x75, 0x51, 0x2f, 0x78, 0x55, 0x3b, 0x8c, 0x65, 0x4d, 0x83, 0x58, 0x38, 0x9e, 0x6f, 0x47, 0x94, 0x62, 0x3d, 0x98, 0x66, 0x41, 0x9c, 0x69, 0x44, 0xb4, 0x81, 0x59, 0xac, 0x79, 0x4e, 0xa4, 0x71, 0x46, 0xa5, 0x72, 0x48, 0xa2, 0x6e, 0x44, 0xa2, 0x6e, 0x45, 0xa2, 0x70, 0x47, 0xa5, 0x73, 0x4a, 0xa5, 0x73, 0x4e, 0xa7, 0x75, 0x50, 0xac, 0x78, 0x52, 0xb1, 0x7e, 0x53, 0xb0, 0x7c, 0x52, 0xbc, 0x83, 0x56, 0xbc, 0x85, 0x52, 0x9c, 0x69, 0x45, 0xbf, 0x90, 0x6a, 0xad, 0x7e, 0x59, 0xbf, 0x8b, 0x64, 0xc7, 0x92, 0x68, 0xa4, 0x7a, 0x59, 0xc4, 0x95, 0x70, 0xb1, 0x7f, 0x5b, 0xbe, 0x8c, 0x67, 0xbc, 0x8a, 0x63, 0xc6, 0x94, 0x6f, 0xde, 0xae, 0x88, 0xe4, 0xb7, 0x90, 0xe9, 0xbc, 0x97, 0xd5, 0xa8, 0x81, 0xda, 0xa7, 0x7d, 0xca, 0x96, 0x69, 0xd1, 0x97, 0x67, 0xc8, 0x8a, 0x5b, 0xc5, 0x8a, 0x5a, 0xd8, 0x9b, 0x68, 0xc5, 0x8c, 0x5d, 0xc2, 0x8d, 0x61, 0xc2, 0x91, 0x68, 0xcb, 0x98, 0x6d, 0xbe, 0x8b, 0x60, 0xac, 0x77, 0x4b, 0xcd, 0x95, 0x64, 0xcb, 0x91, 0x61, 0xc3, 0x89, 0x58, 0xda, 0xa0, 0x6d, 0xd8, 0x99, 0x64, 0xd6, 0x96, 0x60, 0xd6, 0x97, 0x62, 0xdb, 0x9c, 0x66, 0xdb, 0x9c, 0x63, 0xda, 0x9c, 0x64, 0xcb, 0x94, 0x64, 0xb7, 0x84, 0x5c, 0xca, 0x9c, 0x77, 0xcb, 0xa5, 0x86, 0xc5, 0xab, 0x97, 0xe0, 0xd7, 0xd0, 0xf6, 0xf2, 0xec, 0xf7, 0xf6, 0xf4, 0xfb, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfc, 0xf9, 0xf8, 0xf8, 0xf6, 0xee, 0xef, 0xe9, 0xcf, 0xc6, 0xbf, 0xc2, 0xac, 0x9c, 0xca, 0xa6, 0x8a, 0xbd, 0x8e, 0x68, 0xb8, 0x87, 0x60, 0x9b, 0x6c, 0x47, 0xa0, 0x72, 0x4d, 0xab, 0x7a, 0x51, 0x91, 0x5f, 0x37, 0x7a, 0x53, 0x36, 0x7a, 0x55, 0x38, 0x5e, 0x3d, 0x22, 0x55, 0x37, 0x1f, 0x5d, 0x3d, 0x24, 0x98, 0x68, 0x42, 0xb0, 0x7a, 0x4b, 0xd5, 0x9b, 0x6b, 0xc6, 0x8c, 0x5c, 0xc6, 0x90, 0x5e, 0xc7, 0x90, 0x63, 0xc7, 0x94, 0x69, 0xe3, 0xb6, 0x89, 0xd2, 0x9f, 0x74, 0xc8, 0x9c, 0x6f, 0xbe, 0x8b, 0x61, 0xd1, 0x9f, 0x74, 0xca, 0x96, 0x6f, 0xcd, 0x9a, 0x6f, 0xc5, 0x90, 0x67, 0xd8, 0xa3, 0x75, 0xd1, 0x98, 0x6d, 0xda, 0xa2, 0x72, 0xd7, 0x9e, 0x6a, 0xe5, 0xaf, 0x7e, 0xee, 0xbc, 0x94, 0xdc, 0xb0, 0x8b, 0xce, 0xa5, 0x82, 0x94, 0x68, 0x4d, 0x86, 0x5b, 0x40, 0x72, 0x4d, 0x31, 0x71, 0x4b, 0x2f, 0x85, 0x5c, 0x3e, 0x6b, 0x4a, 0x34, 0x8a, 0x66, 0x4c, 0x7f, 0x5b, 0x41, 0x70, 0x52, 0x3c, 0x90, 0x6c, 0x4e, 0x75, 0x50, 0x33, 0x73, 0x4e, 0x30, 0x77, 0x54, 0x39, 0x83, 0x5c, 0x43, 0x8f, 0x61, 0x42, 0x91, 0x61, 0x39, 0x9c, 0x6b, 0x46, 0x9c, 0x6a, 0x45, 0xa4, 0x70, 0x4b, 0xa6, 0x73, 0x4b, 0xa5, 0x72, 0x48, 0xa3, 0x70, 0x46, 0xac, 0x77, 0x4c, 0xae, 0x75, 0x49, 0xa5, 0x6e, 0x42, 0x9f, 0x69, 0x41, 0xa1, 0x6b, 0x43, 0x8e, 0x5d, 0x37, 0xae, 0x7c, 0x57, 0xab, 0x78, 0x52, 0xb3, 0x80, 0x56, 0xa8, 0x77, 0x50, 0xb5, 0x81, 0x57, 0xc1, 0x8b, 0x59, 0xb0, 0x7c, 0x4d, 0xa2, 0x75, 0x52, 0xb2, 0x86, 0x63, 0xb5, 0x83, 0x5c, 0xc1, 0x8c, 0x62, 0xba, 0x91, 0x72, 0xb3, 0x89, 0x68, 0xbb, 0x8a, 0x67, 0xcf, 0x9d, 0x77, 0xbe, 0x8c, 0x65, 0xcd, 0x9b, 0x76, 0xdc, 0xad, 0x89, 0xe2, 0xba, 0x96, 0xe5, 0xbe, 0x98, 0xf0, 0xc5, 0xa0, 0xe2, 0xaa, 0x7c, 0xd1, 0x9c, 0x70, 0xc1, 0x88, 0x57, 0xc4, 0x86, 0x57, 0xc4, 0x89, 0x59, 0xdc, 0xa3, 0x74, 0xbd, 0x89, 0x5b, 0xce, 0x99, 0x6c, 0xc6, 0x95, 0x6c, 0xc5, 0x92, 0x67, 0xd0, 0x9d, 0x72, 0xae, 0x79, 0x4d, 0xc4, 0x8c, 0x5b, 0xc6, 0x8c, 0x5c, 0xd6, 0x9c, 0x6c, 0xc9, 0x8f, 0x5c, 0xe0, 0xa3, 0x6d, 0xd5, 0x95, 0x5f, 0xce, 0x8f, 0x5a, 0xdf, 0xa0, 0x69, 0xe0, 0xa1, 0x69, 0xdd, 0x9f, 0x66, 0xc7, 0x8e, 0x5c, 0xdd, 0xa7, 0x7d, 0xb9, 0x8a, 0x65, 0xca, 0xa7, 0x87, 0xca, 0xab, 0x95, 0xc7, 0xba, 0xb0, 0xe9, 0xe5, 0xdf, 0xf6, 0xf7, 0xf4, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfd, 0xfb, 0xf3, 0xf4, 0xf2, 0xda, 0xd7, 0xcd, 0xca, 0xc3, 0xb6, 0xd4, 0xba, 0xa6, 0xbb, 0x94, 0x75, 0xb5, 0x86, 0x62, 0x9f, 0x71, 0x4d, 0xa2, 0x6e, 0x46, 0x99, 0x69, 0x43, 0x99, 0x68, 0x43, 0x87, 0x59, 0x38, 0x84, 0x5d, 0x3c, 0x70, 0x4a, 0x2d, 0x66, 0x40, 0x25, 0x55, 0x36, 0x18, 0x6f, 0x48, 0x2b, 0x8e, 0x60, 0x37, 0xc0, 0x86, 0x55, 0xcf, 0x93, 0x61, 0xce, 0x92, 0x61, 0xca, 0x94, 0x62, 0xd1, 0x9b, 0x6a, 0xe3, 0xb0, 0x83, 0xdb, 0xa9, 0x7c, 0xc1, 0x90, 0x65, 0xca, 0x9a, 0x6e, 0xc3, 0x96, 0x6a, 0xd2, 0xa4, 0x7c, 0xce, 0x9d, 0x75, 0xd7, 0xa6, 0x7a, 0xd4, 0x9f, 0x73, 0xc7, 0x92, 0x66, 0xcb, 0x96, 0x68, 0xc2, 0x8b, 0x5a, 0xdb, 0xa1, 0x6f, 0xe1, 0xab, 0x7d, 0xe8, 0xb8, 0x8e, 0xe1, 0xb5, 0x90, 0xd8, 0xa9, 0x89, 0xac, 0x7e, 0x61, 0x7c, 0x52, 0x37, 0x74, 0x4b, 0x2f, 0x6a, 0x41, 0x25, 0x8b, 0x5b, 0x3f, 0x79, 0x54, 0x34, 0x7a, 0x55, 0x3b, 0x77, 0x55, 0x3e, 0x71, 0x53, 0x40, 0x79, 0x57, 0x40, 0x84, 0x5e, 0x40, 0x8b, 0x61, 0x40, 0x72, 0x4e, 0x31, 0x76, 0x52, 0x37, 0x89, 0x5c, 0x3e, 0x97, 0x6c, 0x43, 0x8e, 0x63, 0x3c, 0x87, 0x5a, 0x3b, 0x9e, 0x6e, 0x46, 0xa3, 0x72, 0x49, 0xa7, 0x76, 0x4e, 0x9c, 0x6a, 0x45, 0x9f, 0x6d, 0x48, 0x9d, 0x68, 0x44, 0xa1, 0x6d, 0x48, 0x9f, 0x6c, 0x43, 0x98, 0x65, 0x3c, 0x9d, 0x6c, 0x45, 0xa6, 0x75, 0x4e, 0xad, 0x79, 0x51, 0xb9, 0x85, 0x5d, 0xba, 0x85, 0x59, 0xba, 0x85, 0x59, 0xb6, 0x80, 0x52, 0xce, 0x96, 0x67, 0xba, 0x8b, 0x69, 0xcf, 0xa2, 0x7a, 0xb1, 0x7d, 0x58, 0xb5, 0x82, 0x57, 0xbd, 0x8e, 0x6b, 0xa4, 0x79, 0x5b, 0xc2, 0x93, 0x6e, 0xd0, 0x9d, 0x75, 0xcb, 0x96, 0x6d, 0xda, 0xa7, 0x7e, 0xe7, 0xb5, 0x8b, 0xe0, 0xb3, 0x8c, 0xee, 0xc5, 0xa4, 0xec, 0xbe, 0x9b, 0xe8, 0xb8, 0x8a, 0xd5, 0x9e, 0x71, 0xc1, 0x8b, 0x5d, 0xc6, 0x8a, 0x59, 0xcd, 0x91, 0x5f, 0xe2, 0xab, 0x7d, 0xd5, 0xa2, 0x73, 0xd6, 0xa3, 0x77, 0xcc, 0x99, 0x6c, 0xd2, 0x9d, 0x71, 0xcf, 0x9a, 0x6e, 0xc0, 0x89, 0x5b, 0xc0, 0x84, 0x54, 0xc2, 0x85, 0x57, 0xd9, 0x9d, 0x6a, 0xbf, 0x86, 0x53, 0xd4, 0x9a, 0x64, 0xdd, 0x9f, 0x67, 0xd5, 0x96, 0x5e, 0xd3, 0x93, 0x5b, 0xe1, 0xa1, 0x69, 0xdd, 0xa1, 0x68, 0xc1, 0x8b, 0x5a, 0xbf, 0x92, 0x67, 0xd1, 0xa3, 0x79, 0xd2, 0xb1, 0x91, 0xc0, 0xa3, 0x8a, 0xcd, 0xc1, 0xb6, 0xe4, 0xe1, 0xd8, 0xf1, 0xf3, 0xee, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfa, 0xf0, 0xf0, 0xee, 0xd6, 0xce, 0xc6, 0xd6, 0xca, 0xbf, 0xc7, 0xa9, 0x91, 0xc4, 0xa1, 0x84, 0xb6, 0x8c, 0x6b, 0xa4, 0x73, 0x4c, 0xa0, 0x6f, 0x48, 0x8e, 0x62, 0x40, 0x82, 0x59, 0x31, 0x8d, 0x5d, 0x3d, 0x7c, 0x54, 0x33, 0x6c, 0x47, 0x2a, 0x63, 0x3d, 0x23, 0x5f, 0x3e, 0x21, 0x72, 0x4b, 0x2e, 0x9d, 0x6f, 0x46, 0xb7, 0x7e, 0x4d, 0xcb, 0x8f, 0x5e, 0xcc, 0x90, 0x5f, 0xca, 0x94, 0x63, 0xd7, 0xa1, 0x70, 0xd1, 0x9f, 0x72, 0xc2, 0x8f, 0x63, 0xd3, 0xa2, 0x77, 0xd2, 0xa1, 0x76, 0xca, 0x9d, 0x71, 0xdc, 0xaf, 0x87, 0xc7, 0x96, 0x6e, 0xe8, 0xb8, 0x8b, 0xd9, 0xa4, 0x78, 0xc7, 0x92, 0x66, 0xcb, 0x97, 0x69, 0xcc, 0x95, 0x64, 0xd9, 0x9f, 0x6e, 0xde, 0xa8, 0x7a, 0xe7, 0xb7, 0x8d, 0xdf, 0xb3, 0x8d, 0xc4, 0x96, 0x74, 0xbd, 0x8f, 0x6d, 0x80, 0x57, 0x38, 0x7c, 0x52, 0x36, 0x79, 0x50, 0x34, 0x8b, 0x5c, 0x40, 0x7b, 0x56, 0x36, 0x73, 0x4d, 0x33, 0x61, 0x3f, 0x28, 0x67, 0x49, 0x36, 0x7e, 0x5b, 0x44, 0x8d, 0x67, 0x49, 0x8d, 0x62, 0x42, 0x67, 0x48, 0x2f, 0x84, 0x5e, 0x3f, 0xa8, 0x7c, 0x57, 0x9b, 0x70, 0x49, 0xa2, 0x76, 0x51, 0xa0, 0x73, 0x54, 0xa8, 0x78, 0x50, 0xa8, 0x77, 0x4d, 0xab, 0x79, 0x52, 0xa7, 0x75, 0x50, 0xaa, 0x77, 0x52, 0xaa, 0x76, 0x52, 0x9a, 0x66, 0x41, 0xa4, 0x70, 0x48, 0xa2, 0x6e, 0x46, 0xb3, 0x7e, 0x55, 0xb6, 0x82, 0x58, 0xb5, 0x83, 0x56, 0xbf, 0x8c, 0x5f, 0xc8, 0x93, 0x67, 0xc5, 0x90, 0x64, 0xcb, 0x94, 0x66, 0xcf, 0x97, 0x68, 0xaf, 0x81, 0x5b, 0xb5, 0x87, 0x64, 0xa9, 0x75, 0x51, 0xc0, 0x8d, 0x62, 0xb1, 0x80, 0x5e, 0xa3, 0x78, 0x5b, 0xd1, 0xa1, 0x7c, 0xd6, 0xa2, 0x7a, 0xd4, 0xa0, 0x77, 0xda, 0xa7, 0x7e, 0xe2, 0xb0, 0x88, 0xea, 0xbd, 0x97, 0xe4, 0xbc, 0x95, 0xe6, 0xb8, 0x95, 0xea, 0xba, 0x8c, 0xe2, 0xac, 0x7e, 0xb7, 0x80, 0x52, 0xc5, 0x89, 0x57, 0xce, 0x92, 0x60, 0xce, 0x98, 0x6a, 0xdb, 0xa9, 0x7a, 0xd7, 0xa5, 0x78, 0xd3, 0xa1, 0x74, 0xd1, 0x9d, 0x70, 0xcf, 0x9a, 0x6e, 0xc4, 0x8d, 0x5f, 0xcb, 0x8f, 0x60, 0xc7, 0x8b, 0x5c, 0xcb, 0x8f, 0x5c, 0xd3, 0x9a, 0x67, 0xca, 0x8f, 0x5a, 0xde, 0x9f, 0x67, 0xd6, 0x98, 0x5f, 0xd2, 0x92, 0x5a, 0xdf, 0x9e, 0x66, 0xe2, 0xa6, 0x6c, 0xd7, 0x9d, 0x69, 0xc1, 0x8f, 0x62, 0xbe, 0x94, 0x71, 0xc5, 0x9c, 0x7c, 0xca, 0xaa, 0x8d, 0xcf, 0xbf, 0xb1, 0xd1, 0xca, 0xc2, 0xf1, 0xee, 0xea, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfb, 0xf0, 0xec, 0xe6, 0xd6, 0xcf, 0xca, 0xd3, 0xbd, 0xb4, 0xc6, 0xad, 0x97, 0xc9, 0xa9, 0x92, 0xb7, 0x84, 0x64, 0xa2, 0x71, 0x49, 0x8a, 0x5f, 0x3e, 0x8c, 0x61, 0x3f, 0x80, 0x56, 0x31, 0x86, 0x5a, 0x33, 0x77, 0x4d, 0x32, 0x6f, 0x48, 0x2d, 0x5b, 0x3a, 0x1d, 0x66, 0x44, 0x26, 0x74, 0x49, 0x27, 0xae, 0x7a, 0x52, 0xb7, 0x7e, 0x4e, 0xc6, 0x8a, 0x59, 0xd8, 0x9c, 0x6b, 0xc2, 0x8c, 0x5a, 0xcb, 0x9a, 0x6c, 0xb7, 0x87, 0x5e, 0xd5, 0xa7, 0x77, 0xbf, 0x8e, 0x62, 0xc3, 0x92, 0x67, 0xd5, 0xa9, 0x81, 0xdb, 0xac, 0x81, 0xdf, 0xac, 0x7f, 0xe1, 0xae, 0x81, 0xd6, 0xa5, 0x79, 0xc6, 0x96, 0x6a, 0xcb, 0x97, 0x6b, 0xc2, 0x8a, 0x5a, 0xdf, 0xa5, 0x73, 0xe1, 0xac, 0x7b, 0xed, 0xb7, 0x88, 0xdd, 0xb0, 0x88, 0xb1, 0x81, 0x5a, 0xca, 0x9c, 0x77, 0xac, 0x7f, 0x5b, 0x6c, 0x47, 0x29, 0x7c, 0x53, 0x31, 0x88, 0x5b, 0x3b, 0x87, 0x5a, 0x39, 0x6d, 0x46, 0x2a, 0x5f, 0x3f, 0x29, 0x58, 0x3a, 0x22, 0x7f, 0x5a, 0x3d, 0x89, 0x62, 0x48, 0x89, 0x63, 0x41, 0x70, 0x4f, 0x3a, 0x78, 0x53, 0x33, 0xb7, 0x87, 0x60, 0xca, 0x99, 0x6d, 0xad, 0x80, 0x5d, 0xa7, 0x79, 0x53, 0xb0, 0x7f, 0x57, 0xb6, 0x83, 0x5d, 0xb1, 0x81, 0x5b, 0xae, 0x7d, 0x56, 0xbd, 0x89, 0x5f, 0xb9, 0x86, 0x59, 0xb1, 0x7f, 0x53, 0xba, 0x87, 0x5e, 0xb7, 0x85, 0x54, 0xc4, 0x8d, 0x62, 0xbd, 0x86, 0x5b, 0xbc, 0x8c, 0x65, 0xba, 0x8c, 0x62, 0xbd, 0x8e, 0x64, 0xc8, 0x9a, 0x6f, 0xcb, 0x96, 0x6e, 0xd2, 0x9e, 0x75, 0xd0, 0x9b, 0x70, 0xa5, 0x76, 0x54, 0xd1, 0x9a, 0x70, 0xbc, 0x89, 0x62, 0xb9, 0x8a, 0x67, 0xa0, 0x75, 0x58, 0xc7, 0x9a, 0x71, 0xe4, 0xb7, 0x8c, 0xe3, 0xb8, 0x90, 0xed, 0xba, 0x8f, 0xe6, 0xb7, 0x92, 0xea, 0xc0, 0x9d, 0xe8, 0xbf, 0x97, 0xce, 0xa2, 0x7e, 0xe7, 0xb4, 0x85, 0xe4, 0xae, 0x7c, 0xc4, 0x8e, 0x5c, 0xba, 0x83, 0x57, 0xd7, 0xa0, 0x75, 0xbf, 0x8b, 0x60, 0xe0, 0xa9, 0x7a, 0xd7, 0xa4, 0x75, 0xd5, 0xa2, 0x73, 0xcc, 0x99, 0x6a, 0xdb, 0xa9, 0x7a, 0xcf, 0x9a, 0x6c, 0xcd, 0x95, 0x64, 0xce, 0x93, 0x5f, 0xca, 0x8b, 0x58, 0xd3, 0x99, 0x67, 0xc7, 0x8a, 0x55, 0xdc, 0x9c, 0x64, 0xdf, 0xa0, 0x67, 0xd3, 0x93, 0x5b, 0xdb, 0x98, 0x60, 0xe0, 0x9e, 0x67, 0xdf, 0xa4, 0x6e, 0xcd, 0x91, 0x61, 0xb8, 0x8b, 0x67, 0xc5, 0xac, 0x94, 0xbe, 0x9c, 0x81, 0xcf, 0xbb, 0xa8, 0xd6, 0xc9, 0xc2, 0xe9, 0xe4, 0xdf, 0xfc, 0xfc, 0xfa, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xf9, 0xf9, 0xf7, 0xe6, 0xe2, 0xdc, 0xdb, 0xcd, 0xc3, 0xcc, 0xb7, 0xa5, 0xe0, 0xd3, 0xc7, 0xcd, 0xa3, 0x85, 0xb3, 0x81, 0x5a, 0xa8, 0x76, 0x51, 0x83, 0x58, 0x36, 0x8b, 0x60, 0x3f, 0x86, 0x5d, 0x3b, 0x80, 0x57, 0x34, 0x70, 0x4a, 0x2f, 0x63, 0x3f, 0x23, 0x5f, 0x3f, 0x23, 0x6b, 0x47, 0x29, 0x8c, 0x61, 0x3e, 0xa4, 0x6f, 0x43, 0xbb, 0x82, 0x4f, 0xc8, 0x8d, 0x5b, 0xc6, 0x8a, 0x58, 0xc2, 0x8e, 0x5c, 0xc2, 0x91, 0x64, 0xcc, 0x9a, 0x6c, 0xcf, 0x9d, 0x6f, 0xc1, 0x90, 0x65, 0xcd, 0x9b, 0x71, 0xe4, 0xb9, 0x91, 0xd8, 0xa8, 0x7d, 0xe4, 0xb1, 0x84, 0xdd, 0xaa, 0x7d, 0xd4, 0xa3, 0x78, 0xc2, 0x92, 0x66, 0xc5, 0x94, 0x67, 0xd3, 0x9e, 0x6d, 0xd4, 0x9b, 0x68, 0xd7, 0xa2, 0x71, 0xe0, 0xad, 0x7f, 0xe6, 0xbb, 0x96, 0xd3, 0xa4, 0x7f, 0xc8, 0x9a, 0x76, 0xa0, 0x72, 0x4f, 0x6b, 0x44, 0x27, 0x80, 0x54, 0x33, 0x8f, 0x62, 0x41, 0x8e, 0x61, 0x40, 0x6f, 0x46, 0x2b, 0x54, 0x35, 0x1f, 0x65, 0x47, 0x2f, 0x8f, 0x69, 0x4b, 0x89, 0x65, 0x49, 0x79, 0x55, 0x39, 0x65, 0x44, 0x29, 0x7f, 0x59, 0x3c, 0xac, 0x7f, 0x5d, 0xe5, 0xb8, 0x91, 0xa3, 0x7a, 0x58, 0xb4, 0x8c, 0x66, 0xbe, 0x94, 0x6e, 0xc1, 0x96, 0x71, 0xc4, 0x98, 0x70, 0xc9, 0x98, 0x6e, 0xcf, 0x9c, 0x71, 0xc4, 0x94, 0x6c, 0xd4, 0xa4, 0x7b, 0xd5, 0xa5, 0x7b, 0xcb, 0x9b, 0x72, 0xd3, 0xa3, 0x7b, 0xcb, 0x9b, 0x73, 0xc1, 0x95, 0x70, 0xc6, 0x9b, 0x73, 0xc4, 0x98, 0x70, 0xd4, 0xa8, 0x80, 0xd9, 0xab, 0x84, 0xe7, 0xb9, 0x92, 0xd7, 0xa9, 0x7e, 0xb5, 0x80, 0x5d, 0xc8, 0x94, 0x6a, 0xd9, 0xaa, 0x82, 0xc0, 0x91, 0x6e, 0x8f, 0x64, 0x46, 0xcb, 0x9d, 0x77, 0xed, 0xbf, 0x98, 0xec, 0xc0, 0x9b, 0xf1, 0xbf, 0x93, 0xf1, 0xc2, 0x9b, 0xe9, 0xbf, 0x9b, 0xcf, 0xa6, 0x84, 0xce, 0xa3, 0x7e, 0xdf, 0xaa, 0x7c, 0xdf, 0xa9, 0x78, 0xc7, 0x92, 0x60, 0xae, 0x77, 0x4b, 0xd4, 0x9d, 0x71, 0xc6, 0x93, 0x69, 0xdb, 0xa3, 0x75, 0xe1, 0xae, 0x7f, 0xd8, 0xa6, 0x77, 0xd8, 0xa6, 0x77, 0xde, 0xac, 0x7d, 0xd1, 0x9c, 0x6e, 0xd5, 0x9d, 0x6c, 0xd2, 0x96, 0x62, 0xca, 0x8b, 0x58, 0xd3, 0x98, 0x67, 0xce, 0x91, 0x5c, 0xd1, 0x91, 0x5a, 0xdf, 0xa1, 0x68, 0xdb, 0x9b, 0x63, 0xd8, 0x95, 0x5d, 0xe9, 0xa8, 0x70, 0xdc, 0xa1, 0x6b, 0xce, 0x92, 0x62, 0xc4, 0x93, 0x6a, 0xcf, 0xab, 0x8b, 0xcf, 0xb5, 0xa0, 0xc4, 0xae, 0x9a, 0xdd, 0xce, 0xc6, 0xe2, 0xdc, 0xd7, 0xf9, 0xf9, 0xf7, 0xfe, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfc, 0xfc, 0xf1, 0xef, 0xed, 0xe6, 0xe4, 0xdf, 0xd5, 0xcc, 0xc5, 0xda, 0xd2, 0xc8, 0xd8, 0xc8, 0xb7, 0xc8, 0xa1, 0x85, 0xb1, 0x7d, 0x54, 0xa2, 0x70, 0x4c, 0x8f, 0x63, 0x3f, 0x93, 0x66, 0x42, 0x7e, 0x57, 0x36, 0x75, 0x4f, 0x30, 0x6d, 0x4c, 0x2f, 0x60, 0x3f, 0x22, 0x5c, 0x3b, 0x1f, 0x69, 0x43, 0x23, 0x92, 0x65, 0x3e, 0xa3, 0x6f, 0x41, 0xc1, 0x89, 0x57, 0xc7, 0x8c, 0x5b, 0xbb, 0x81, 0x50, 0xc9, 0x94, 0x64, 0xc8, 0x93, 0x66, 0xcb, 0x97, 0x67, 0xc8, 0x93, 0x66, 0xc4, 0x93, 0x68, 0xd9, 0xaa, 0x7f, 0xda, 0xab, 0x81, 0xd3, 0xa4, 0x78, 0xda, 0xaa, 0x7f, 0xdd, 0xae, 0x82, 0xe0, 0xb1, 0x86, 0xca, 0x9b, 0x70, 0xdc, 0xab, 0x7c, 0xc8, 0x93, 0x64, 0xcf, 0x96, 0x67, 0xe8, 0xb3, 0x84, 0xe5, 0xb0, 0x84, 0xed, 0xc3, 0x9e, 0xd5, 0xa7, 0x83, 0xba, 0x8b, 0x68, 0xa9, 0x79, 0x56, 0x90, 0x61, 0x42, 0x85, 0x57, 0x38, 0x9e, 0x71, 0x4f, 0x9b, 0x6e, 0x4c, 0x78, 0x4e, 0x30, 0x51, 0x33, 0x1d, 0x6b, 0x4a, 0x31, 0x85, 0x62, 0x46, 0x86, 0x65, 0x49, 0x76, 0x56, 0x3d, 0x63, 0x45, 0x2d, 0x95, 0x6f, 0x54, 0x73, 0x5b, 0x45, 0x83, 0x6c, 0x5c, 0x9e, 0x76, 0x5a, 0xbb, 0x96, 0x77, 0xcb, 0xa9, 0x8a, 0xd5, 0xb4, 0x96, 0xd8, 0xb7, 0x9a, 0xd6, 0xb3, 0x92, 0xd4, 0xad, 0x8b, 0xdb, 0xb4, 0x93, 0xda, 0xb3, 0x92, 0xdd, 0xb7, 0x95, 0xdc, 0xb6, 0x96, 0xda, 0xb8, 0x99, 0xd4, 0xb2, 0x93, 0xde, 0xbc, 0x9d, 0xd7, 0xb5, 0x95, 0xce, 0xa7, 0x84, 0xd8, 0xb4, 0x92, 0xf1, 0xc7, 0xa5, 0xdf, 0xb8, 0x93, 0xda, 0xb3, 0x92, 0xb3, 0x7e, 0x56, 0xaa, 0x7c, 0x57, 0xc4, 0x95, 0x6e, 0xb7, 0x88, 0x67, 0x96, 0x6b, 0x4f, 0xca, 0x9a, 0x76, 0xee, 0xc0, 0x9a, 0xf4, 0xc5, 0x9d, 0xeb, 0xbb, 0x90, 0xe3, 0xba, 0x95, 0xd3, 0xac, 0x8a, 0xda, 0xb2, 0x92, 0xa9, 0x7c, 0x56, 0xd5, 0xa0, 0x72, 0xe2, 0xad, 0x7e, 0xd2, 0x9d, 0x6f, 0xba, 0x84, 0x59, 0xd6, 0xa1, 0x72, 0xbf, 0x8f, 0x66, 0xc1, 0x8d, 0x61, 0xe7, 0xb1, 0x83, 0xe1, 0xaf, 0x7f, 0xdc, 0xa8, 0x7a, 0xe4, 0xb1, 0x82, 0xe3, 0xb1, 0x81, 0xd9, 0xa3, 0x71, 0xc8, 0x8c, 0x59, 0xd4, 0x93, 0x62, 0xd6, 0x98, 0x66, 0xd9, 0x9a, 0x67, 0xd7, 0x99, 0x63, 0xd6, 0x98, 0x61, 0xe0, 0xa1, 0x6b, 0xdc, 0x9a, 0x65, 0xe3, 0xa2, 0x6d, 0xd9, 0x9d, 0x69, 0xd0, 0x96, 0x67, 0xbb, 0x87, 0x58, 0xd1, 0xa1, 0x7c, 0xe6, 0xcd, 0xbb, 0xce, 0xba, 0xa7, 0xd6, 0xc7, 0xbf, 0xde, 0xd9, 0xd4, 0xef, 0xed, 0xe8, 0xfd, 0xfd, 0xfb, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xee, 0xec, 0xe9, 0xe3, 0xe2, 0xde, 0xdd, 0xd5, 0xcf, 0xd8, 0xce, 0xc6, 0xd3, 0xbe, 0xab, 0xbe, 0x96, 0x77, 0xba, 0x87, 0x60, 0x93, 0x65, 0x40, 0x8b, 0x60, 0x3e, 0x8a, 0x5f, 0x3d, 0x7d, 0x54, 0x34, 0x72, 0x4e, 0x32, 0x65, 0x43, 0x27, 0x63, 0x42, 0x25, 0x65, 0x44, 0x27, 0x79, 0x51, 0x30, 0x94, 0x65, 0x3b, 0xac, 0x77, 0x49, 0xc0, 0x87, 0x56, 0xc6, 0x8c, 0x5b, 0xb4, 0x7a, 0x49, 0xd2, 0x9c, 0x6e, 0xc0, 0x89, 0x5c, 0xbf, 0x8b, 0x5c, 0xd1, 0x9c, 0x6e, 0xce, 0x9c, 0x72, 0xde, 0xb0, 0x84, 0xd9, 0xa7, 0x7c, 0xdd, 0xaf, 0x83, 0xdb, 0xae, 0x83, 0xe6, 0xb9, 0x8e, 0xd5, 0xa8, 0x7e, 0xd7, 0xaa, 0x7f, 0xcc, 0x9c, 0x70, 0xbc, 0x87, 0x5b, 0xc9, 0x8f, 0x63, 0xec, 0xb7, 0x89, 0xe4, 0xac, 0x80, 0xe7, 0xbc, 0x96, 0xcb, 0x9f, 0x78, 0xda, 0xb0, 0x8c, 0xc9, 0x9d, 0x79, 0xb3, 0x83, 0x62, 0x72, 0x47, 0x27, 0x97, 0x6b, 0x48, 0x99, 0x6d, 0x4a, 0x7f, 0x54, 0x35, 0x53, 0x35, 0x21, 0x62, 0x42, 0x28, 0x79, 0x59, 0x3f, 0x78, 0x58, 0x3e, 0x7d, 0x5b, 0x40, 0x5c, 0x3a, 0x24, 0xa1, 0x79, 0x5d, 0x87, 0x6b, 0x50, 0x25, 0x1c, 0x19, 0x72, 0x57, 0x44, 0xab, 0x8e, 0x74, 0xbe, 0xa0, 0x85, 0xcf, 0xb0, 0x97, 0xd8, 0xbb, 0xa3, 0xda, 0xbd, 0xa4, 0xdf, 0xc0, 0xa5, 0xeb, 0xcd, 0xb1, 0xea, 0xcd, 0xb1, 0xe2, 0xc7, 0xaa, 0xef, 0xd4, 0xb7, 0xe0, 0xc4, 0xac, 0xd5, 0xba, 0xa2, 0xda, 0xbb, 0xa0, 0xd1, 0xb3, 0x97, 0xbd, 0xa2, 0x84, 0xcd, 0xa9, 0x84, 0xcb, 0xaa, 0x8d, 0x6c, 0x55, 0x45, 0xc0, 0x97, 0x7a, 0xb7, 0x83, 0x57, 0xa8, 0x7d, 0x5d, 0xc3, 0x91, 0x6e, 0xa5, 0x76, 0x56, 0x9a, 0x70, 0x54, 0xca, 0x98, 0x75, 0xec, 0xbd, 0x97, 0xec, 0xbc, 0x90, 0xea, 0xbb, 0x90, 0xe5, 0xbe, 0x9a, 0xca, 0xa5, 0x86, 0xcf, 0xa9, 0x89, 0xcb, 0x9d, 0x74, 0xd6, 0x9f, 0x72, 0xdb, 0xa6, 0x7a, 0xc9, 0x94, 0x68, 0xbc, 0x87, 0x5d, 0xd1, 0x9d, 0x6d, 0xd5, 0xa6, 0x80, 0xb4, 0x81, 0x56, 0xd9, 0xa2, 0x75, 0xe8, 0xb5, 0x86, 0xd7, 0xa3, 0x74, 0xda, 0xa5, 0x77, 0xdd, 0xac, 0x7c, 0xe4, 0xb0, 0x7d, 0xd0, 0x98, 0x65, 0xd9, 0x9b, 0x6a, 0xd7, 0x98, 0x66, 0xde, 0xa0, 0x6d, 0xdd, 0xa0, 0x6c, 0xd4, 0x97, 0x61, 0xe0, 0xa2, 0x6d, 0xe4, 0xa5, 0x70, 0xda, 0x9b, 0x67, 0xd8, 0x9c, 0x68, 0xc2, 0x8a, 0x5b, 0xcb, 0x97, 0x65, 0xcb, 0x99, 0x74, 0xd6, 0xc0, 0xaf, 0xde, 0xd2, 0xc8, 0xd3, 0xc7, 0xbe, 0xe4, 0xdf, 0xd9, 0xea, 0xe6, 0xe0, 0xfb, 0xfa, 0xf8, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xea, 0xe8, 0xe5, 0xeb, 0xea, 0xe6, 0xe8, 0xe4, 0xe1, 0xd6, 0xc8, 0xbd, 0xbb, 0x9e, 0x89, 0xb2, 0x89, 0x65, 0xb0, 0x81, 0x5b, 0x89, 0x5f, 0x3e, 0x7c, 0x55, 0x36, 0x8a, 0x63, 0x44, 0x7d, 0x55, 0x35, 0x6d, 0x48, 0x2b, 0x75, 0x53, 0x37, 0x59, 0x38, 0x1b, 0x67, 0x45, 0x28, 0x7a, 0x52, 0x31, 0x91, 0x63, 0x38, 0xb8, 0x84, 0x56, 0xc0, 0x88, 0x57, 0xb9, 0x7f, 0x4f, 0xc8, 0x8f, 0x5f, 0xd1, 0x9a, 0x6c, 0xc1, 0x8a, 0x5c, 0xd8, 0xa3, 0x75, 0xcb, 0x96, 0x68, 0xe1, 0xae, 0x85, 0xd8, 0xab, 0x7f, 0xd9, 0xa6, 0x7b, 0xe1, 0xb4, 0x88, 0xde, 0xb1, 0x87, 0xdf, 0xb2, 0x87, 0xd0, 0xa3, 0x78, 0xdf, 0xb2, 0x87, 0xd6, 0xa8, 0x80, 0xb5, 0x84, 0x5c, 0xb9, 0x80, 0x56, 0xea, 0xb5, 0x87, 0xdf, 0xa8, 0x7c, 0xe8, 0xbd, 0x97, 0xd8, 0xaa, 0x83, 0xcd, 0x9f, 0x7d, 0xb3, 0x84, 0x61, 0xc2, 0x92, 0x70, 0x8a, 0x5e, 0x3e, 0x8c, 0x60, 0x3d, 0x9f, 0x72, 0x4f, 0x7d, 0x52, 0x33, 0x5b, 0x3d, 0x28, 0x5c, 0x40, 0x29, 0x6a, 0x4d, 0x37, 0x6d, 0x51, 0x3b, 0x7c, 0x56, 0x39, 0x87, 0x5e, 0x42, 0x9d, 0x73, 0x58, 0xc4, 0x9e, 0x7c, 0x4b, 0x36, 0x2a, 0x10, 0x05, 0x00, 0x6d, 0x5a, 0x49, 0x73, 0x5e, 0x50, 0x5a, 0x47, 0x3c, 0x7c, 0x6a, 0x5d, 0xb0, 0x9b, 0x88, 0xca, 0xb2, 0x9d, 0xe1, 0xca, 0xb6, 0xdc, 0xc6, 0xb2, 0xdc, 0xc8, 0xb3, 0xe0, 0xcc, 0xb7, 0xca, 0xb3, 0x9d, 0xae, 0x98, 0x83, 0x7a, 0x68, 0x5b, 0x5d, 0x4a, 0x3d, 0x85, 0x6c, 0x5b, 0x72, 0x58, 0x47, 0x33, 0x25, 0x1e, 0x92, 0x7a, 0x65, 0xe9, 0xbc, 0x9a, 0xc1, 0x89, 0x5a, 0x97, 0x6a, 0x4a, 0xc4, 0x92, 0x70, 0xab, 0x80, 0x5f, 0x86, 0x61, 0x43, 0xde, 0xae, 0x8a, 0xef, 0xc1, 0x9b, 0xee, 0xc3, 0x9d, 0xed, 0xc7, 0xa7, 0xea, 0xc9, 0xad, 0xd0, 0xac, 0x8d, 0xb0, 0x8a, 0x69, 0xc6, 0x98, 0x6f, 0xcc, 0x95, 0x68, 0xd9, 0xa4, 0x78, 0xbe, 0x8a, 0x5d, 0xc7, 0x92, 0x68, 0xdd, 0xa9, 0x79, 0xe3, 0xb5, 0x8e, 0xbc, 0x89, 0x5f, 0xc6, 0x8f, 0x62, 0xdf, 0xac, 0x7d, 0xd5, 0xa0, 0x72, 0xce, 0x99, 0x6b, 0xde, 0xad, 0x7e, 0xe4, 0xb1, 0x7e, 0xed, 0xb7, 0x83, 0xd6, 0x9d, 0x6a, 0xd7, 0x9a, 0x67, 0xd8, 0x9a, 0x67, 0xe2, 0xa5, 0x71, 0xdb, 0x9e, 0x69, 0xda, 0x9e, 0x68, 0xe3, 0xa9, 0x73, 0xde, 0xa4, 0x6e, 0xd1, 0x96, 0x62, 0xc5, 0x8d, 0x5e, 0xc0, 0x8c, 0x5a, 0xcc, 0x99, 0x75, 0xd2, 0xba, 0xa2, 0xd6, 0xc7, 0xbf, 0xdd, 0xdb, 0xcf, 0xde, 0xd9, 0xd4, 0xe9, 0xe5, 0xdf, 0xf8, 0xf7, 0xf5, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xf9, 0xfa, 0xf8, 0xed, 0xec, 0xe8, 0xee, 0xed, 0xe9, 0xe7, 0xe6, 0xe2, 0xcf, 0xc0, 0xb1, 0xb6, 0x9a, 0x84, 0xaf, 0x84, 0x62, 0xaa, 0x7b, 0x56, 0x96, 0x6c, 0x4b, 0x7e, 0x59, 0x36, 0x87, 0x5c, 0x3b, 0x6c, 0x49, 0x2a, 0x7b, 0x55, 0x32, 0x68, 0x46, 0x2a, 0x63, 0x3f, 0x20, 0x73, 0x4c, 0x2b, 0x80, 0x57, 0x34, 0x9b, 0x6b, 0x43, 0xae, 0x7a, 0x4d, 0xb3, 0x7e, 0x52, 0xaa, 0x73, 0x46, 0xd3, 0x9d, 0x6c, 0xcb, 0x8f, 0x60, 0xca, 0x94, 0x62, 0xce, 0x96, 0x64, 0xd2, 0x9e, 0x6f, 0xdf, 0xb0, 0x85, 0xd8, 0xa7, 0x76, 0xd0, 0xa3, 0x77, 0xde, 0xb1, 0x84, 0xd7, 0xaa, 0x7f, 0xd1, 0xa4, 0x7a, 0xce, 0xa1, 0x77, 0xde, 0xb0, 0x86, 0xd0, 0xa2, 0x7b, 0xba, 0x88, 0x5f, 0xc3, 0x8c, 0x61, 0xe2, 0xae, 0x7e, 0xd2, 0x9a, 0x6b, 0xe7, 0xbc, 0x95, 0xcd, 0xa0, 0x77, 0xb0, 0x83, 0x63, 0xb8, 0x8c, 0x66, 0xc7, 0x99, 0x74, 0xab, 0x7d, 0x58, 0x6c, 0x42, 0x20, 0x93, 0x68, 0x46, 0x82, 0x55, 0x36, 0x55, 0x38, 0x24, 0x55, 0x38, 0x25, 0x63, 0x47, 0x30, 0x6a, 0x4a, 0x35, 0x82, 0x59, 0x3d, 0x96, 0x67, 0x42, 0x86, 0x5a, 0x3c, 0xe3, 0xbd, 0x9a, 0xc0, 0xa3, 0x87, 0x3a, 0x2d, 0x23, 0x07, 0x04, 0x02, 0x10, 0x0e, 0x0b, 0x03, 0x03, 0x01, 0x06, 0x05, 0x03, 0x37, 0x30, 0x2e, 0x54, 0x46, 0x38, 0x74, 0x62, 0x54, 0x9f, 0x8d, 0x7f, 0xa7, 0x95, 0x88, 0x6e, 0x5c, 0x4e, 0x50, 0x3f, 0x37, 0x46, 0x38, 0x33, 0x08, 0x06, 0x02, 0x07, 0x05, 0x02, 0x1f, 0x15, 0x0f, 0x17, 0x0e, 0x09, 0x7a, 0x67, 0x59, 0xe9, 0xc8, 0xa9, 0xf0, 0xc8, 0xa0, 0xa7, 0x70, 0x4d, 0xa6, 0x74, 0x4d, 0xad, 0x80, 0x63, 0xaa, 0x7b, 0x5c, 0x8e, 0x6a, 0x50, 0xde, 0xaf, 0x87, 0xed, 0xc2, 0x9d, 0xef, 0xc3, 0x9d, 0xf0, 0xd2, 0xb7, 0xf2, 0xd4, 0xb7, 0xd9, 0xb5, 0x96, 0xbc, 0x8d, 0x67, 0xd0, 0x9f, 0x74, 0xd3, 0xa2, 0x77, 0xde, 0xa9, 0x7f, 0xba, 0x8b, 0x5f, 0xbb, 0x86, 0x5a, 0xdd, 0xae, 0x80, 0xe2, 0xb6, 0x8a, 0xd1, 0xa4, 0x7c, 0xbf, 0x8d, 0x61, 0xd3, 0x9c, 0x6b, 0xdf, 0xae, 0x7e, 0xd4, 0x9f, 0x71, 0xdb, 0xa5, 0x74, 0xe0, 0xaa, 0x78, 0xe1, 0xa8, 0x74, 0xda, 0xa1, 0x6c, 0xdc, 0xa2, 0x70, 0xde, 0xa5, 0x6f, 0xe7, 0xad, 0x75, 0xe3, 0xa8, 0x71, 0xe0, 0xa4, 0x6e, 0xe0, 0xa2, 0x6d, 0xe4, 0xa7, 0x71, 0xd3, 0x98, 0x64, 0xca, 0x94, 0x64, 0xc3, 0x8c, 0x5f, 0xc4, 0x92, 0x67, 0xbb, 0x99, 0x7f, 0xcc, 0xbc, 0xaf, 0xe2, 0xdb, 0xd3, 0xed, 0xea, 0xe6, 0xeb, 0xeb, 0xe9, 0xf2, 0xf2, 0xf0, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfb, 0xfa, 0xfa, 0xf8, 0xef, 0xee, 0xea, 0xee, 0xed, 0xe9, 0xe0, 0xdb, 0xd4, 0xb9, 0xa6, 0x94, 0xba, 0x9a, 0x81, 0xaa, 0x83, 0x64, 0xa7, 0x77, 0x53, 0x93, 0x69, 0x47, 0x79, 0x57, 0x38, 0x7b, 0x53, 0x35, 0x6b, 0x48, 0x2a, 0x7c, 0x56, 0x33, 0x6d, 0x4b, 0x30, 0x6a, 0x46, 0x28, 0x79, 0x50, 0x2d, 0x8d, 0x60, 0x3a, 0xa2, 0x70, 0x46, 0xa8, 0x73, 0x47, 0xa7, 0x73, 0x48, 0xb2, 0x7c, 0x50, 0xcc, 0x91, 0x5b, 0xc3, 0x86, 0x57, 0xcc, 0x96, 0x64, 0xc9, 0x91, 0x5f, 0xda, 0xa5, 0x76, 0xdc, 0xaf, 0x83, 0xca, 0x99, 0x68, 0xd6, 0xa9, 0x7c, 0xd0, 0xa3, 0x76, 0xda, 0xad, 0x82, 0xe4, 0xb7, 0x8c, 0xdb, 0xae, 0x83, 0xc9, 0x9c, 0x71, 0xd4, 0xa6, 0x7f, 0xcc, 0x9b, 0x72, 0xc3, 0x8c, 0x61, 0xd8, 0xa4, 0x74, 0xd8, 0xa1, 0x72, 0xd4, 0xa1, 0x72, 0xe0, 0xb3, 0x8c, 0xbf, 0x92, 0x73, 0xa7, 0x7a, 0x55, 0xc7, 0x99, 0x74, 0xbe, 0x90, 0x6b, 0x87, 0x5c, 0x3a, 0x82, 0x57, 0x35, 0x89, 0x5c, 0x3e, 0x53, 0x36, 0x22, 0x60, 0x3f, 0x2a, 0x69, 0x49, 0x31, 0x66, 0x47, 0x31, 0x91, 0x68, 0x4d, 0x88, 0x5e, 0x3a, 0x68, 0x40, 0x22, 0xd4, 0xa6, 0x7f, 0xe5, 0xbf, 0xa0, 0x9a, 0x78, 0x5c, 0x26, 0x1b, 0x13, 0x09, 0x07, 0x04, 0x02, 0x03, 0x01, 0x01, 0x01, 0x00, 0x14, 0x14, 0x10, 0x75, 0x5a, 0x50, 0x80, 0x61, 0x55, 0x77, 0x58, 0x4b, 0x77, 0x58, 0x4c, 0x7d, 0x5e, 0x51, 0x71, 0x5b, 0x54, 0x13, 0x0f, 0x0d, 0x01, 0x03, 0x02, 0x00, 0x03, 0x01, 0x13, 0x11, 0x0e, 0x71, 0x5d, 0x50, 0xe5, 0xc5, 0xad, 0xfa, 0xd7, 0xb6, 0xea, 0xba, 0x8c, 0xbd, 0x86, 0x64, 0xce, 0x99, 0x6f, 0xb7, 0x85, 0x65, 0xad, 0x7e, 0x5f, 0x90, 0x6b, 0x52, 0xdc, 0xb4, 0x91, 0xea, 0xbd, 0x97, 0xeb, 0xc7, 0xa6, 0xf0, 0xd3, 0xb8, 0xcc, 0xa4, 0x81, 0xbb, 0x8d, 0x6a, 0xc7, 0x93, 0x72, 0xcc, 0x9c, 0x70, 0xd6, 0xa5, 0x7a, 0xde, 0xac, 0x81, 0xb1, 0x7c, 0x52, 0xc8, 0x93, 0x67, 0xe0, 0xb1, 0x83, 0xd1, 0xa4, 0x78, 0xdc, 0xae, 0x87, 0xc6, 0x96, 0x69, 0xdc, 0xa4, 0x73, 0xea, 0xb9, 0x8a, 0xdd, 0xa8, 0x7a, 0xd5, 0x9f, 0x6e, 0xe2, 0xac, 0x7a, 0xe5, 0xac, 0x78, 0xe1, 0xa7, 0x73, 0xe4, 0xab, 0x74, 0xe2, 0xa9, 0x74, 0xe0, 0xa8, 0x74, 0xe3, 0xac, 0x78, 0xe0, 0xa9, 0x73, 0xe2, 0xa9, 0x72, 0xdd, 0xa5, 0x6e, 0xde, 0xa3, 0x6f, 0xca, 0x94, 0x64, 0xb7, 0x84, 0x5b, 0xb6, 0x87, 0x5e, 0xba, 0x95, 0x78, 0xc0, 0xac, 0x9c, 0xe4, 0xde, 0xd6, 0xf0, 0xed, 0xe9, 0xec, 0xec, 0xea, 0xf6, 0xf6, 0xf4, 0xfd, 0xfd, 0xfd, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xf7, 0xe8, 0xe9, 0xe1, 0xd7, 0xcb, 0xc0, 0xbe, 0xa7, 0x91, 0xbc, 0x95, 0x76, 0xa3, 0x7d, 0x5f, 0xa3, 0x76, 0x51, 0x92, 0x6a, 0x48, 0x72, 0x4a, 0x27, 0x77, 0x4f, 0x2c, 0x72, 0x49, 0x2c, 0x79, 0x4f, 0x33, 0x72, 0x4c, 0x2d, 0x7a, 0x55, 0x36, 0x76, 0x4d, 0x2a, 0x96, 0x68, 0x40, 0x98, 0x69, 0x3f, 0xaa, 0x78, 0x4b, 0x9b, 0x6d, 0x42, 0xaa, 0x77, 0x49, 0xc8, 0x91, 0x5c, 0xb4, 0x7e, 0x4d, 0xb8, 0x82, 0x51, 0xc5, 0x95, 0x66, 0xdb, 0xa9, 0x78, 0xcf, 0x9c, 0x6d, 0xd0, 0xa0, 0x74, 0xcd, 0xa0, 0x74, 0xd5, 0xa9, 0x7c, 0xda, 0xaa, 0x7e, 0xea, 0xb9, 0x8d, 0xda, 0xad, 0x82, 0xd8, 0xab, 0x80, 0xe5, 0xba, 0x92, 0xd4, 0xa4, 0x7f, 0xce, 0x9c, 0x71, 0xd8, 0xa6, 0x78, 0xd9, 0xa6, 0x76, 0xd3, 0xa0, 0x75, 0xd8, 0xa9, 0x81, 0xc9, 0x9d, 0x77, 0x83, 0x59, 0x37, 0xc0, 0x95, 0x70, 0xc1, 0x9c, 0x7c, 0xa1, 0x77, 0x55, 0x71, 0x47, 0x25, 0x8b, 0x5e, 0x3d, 0x58, 0x3d, 0x29, 0x79, 0x56, 0x3d, 0x8a, 0x60, 0x3f, 0x5c, 0x41, 0x2e, 0x87, 0x5d, 0x3b, 0xb0, 0x7f, 0x59, 0x64, 0x41, 0x26, 0xb5, 0x87, 0x62, 0xef, 0xbe, 0x92, 0xd4, 0xa0, 0x78, 0x7c, 0x5b, 0x3d, 0x2e, 0x20, 0x18, 0x0b, 0x07, 0x06, 0x02, 0x03, 0x02, 0x04, 0x01, 0x00, 0x45, 0x33, 0x2a, 0xaa, 0x7c, 0x6a, 0x8b, 0x6c, 0x5e, 0x9f, 0x74, 0x65, 0xa5, 0x77, 0x68, 0x27, 0x1f, 0x12, 0x02, 0x00, 0x04, 0x04, 0x03, 0x04, 0x29, 0x20, 0x19, 0xa1, 0x82, 0x67, 0xef, 0xcb, 0xa6, 0xfe, 0xd9, 0xb6, 0xf9, 0xd0, 0xaa, 0xd9, 0xa0, 0x6e, 0xd2, 0x96, 0x6b, 0xeb, 0xb5, 0x89, 0xbe, 0x8c, 0x66, 0x9e, 0x71, 0x52, 0x90, 0x6d, 0x54, 0xe1, 0xbb, 0x9c, 0xee, 0xc0, 0x98, 0xe8, 0xc9, 0xb3, 0xe3, 0xc7, 0xa5, 0xaa, 0x7d, 0x5e, 0xbb, 0x8d, 0x6a, 0xd3, 0xa1, 0x7a, 0xc1, 0x8e, 0x63, 0xdd, 0xaa, 0x7f, 0xde, 0xab, 0x80, 0xba, 0x86, 0x5f, 0xd1, 0x9b, 0x70, 0xda, 0xa8, 0x77, 0xdc, 0xae, 0x85, 0xdb, 0xad, 0x84, 0xce, 0x9f, 0x73, 0xdc, 0xa7, 0x78, 0xe2, 0xac, 0x78, 0xe8, 0xb2, 0x7f, 0xde, 0xa4, 0x72, 0xdb, 0xa1, 0x6e, 0xdc, 0xa5, 0x75, 0xe0, 0xa6, 0x72, 0xe7, 0xac, 0x79, 0xe9, 0xaf, 0x7c, 0xec, 0xb5, 0x83, 0xe4, 0xb1, 0x7e, 0xe7, 0xb3, 0x80, 0xe6, 0xb0, 0x7a, 0xe1, 0xa8, 0x70, 0xdf, 0xa6, 0x6f, 0xd7, 0x9d, 0x6c, 0xc2, 0x8f, 0x63, 0xb4, 0x89, 0x65, 0xb5, 0x8d, 0x6d, 0xac, 0x8f, 0x77, 0xd9, 0xcf, 0xc6, 0xec, 0xe8, 0xe5, 0xef, 0xef, 0xed, 0xf3, 0xf3, 0xf1, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfb, 0xfb, 0xfb, 0xfc, 0xfa, 0xe7, 0xe8, 0xe0, 0xca, 0xbd, 0xb2, 0xba, 0xa2, 0x8c, 0xbd, 0x9d, 0x83, 0xa3, 0x7d, 0x5f, 0xa9, 0x7d, 0x57, 0x8e, 0x65, 0x43, 0x76, 0x4e, 0x2b, 0x7d, 0x55, 0x32, 0x7d, 0x54, 0x34, 0x7a, 0x51, 0x32, 0x7b, 0x55, 0x36, 0x72, 0x4d, 0x2e, 0x7a, 0x52, 0x2f, 0x92, 0x63, 0x3d, 0x99, 0x69, 0x40, 0xab, 0x78, 0x4b, 0x91, 0x63, 0x3a, 0xaa, 0x75, 0x48, 0xc8, 0x91, 0x5c, 0xc9, 0x93, 0x61, 0xc8, 0x92, 0x60, 0xd4, 0xa5, 0x76, 0xd8, 0xa6, 0x75, 0xcf, 0x9b, 0x6c, 0xce, 0x9e, 0x74, 0xd7, 0xaa, 0x7d, 0xd0, 0xa4, 0x77, 0xe6, 0xb5, 0x8a, 0xd1, 0xa0, 0x75, 0xe7, 0xba, 0x8f, 0xdf, 0xb2, 0x87, 0xde, 0xb4, 0x8a, 0xe8, 0xb9, 0x94, 0xc7, 0x95, 0x6b, 0xd7, 0xa5, 0x77, 0xcb, 0x97, 0x68, 0xd9, 0xa6, 0x7c, 0xd4, 0xa5, 0x7d, 0xcf, 0xa3, 0x7d, 0x9f, 0x76, 0x55, 0xb4, 0x8a, 0x66, 0xd4, 0xa9, 0x8c, 0xb4, 0x89, 0x67, 0x75, 0x4b, 0x29, 0x7d, 0x52, 0x33, 0x59, 0x38, 0x22, 0x62, 0x3f, 0x26, 0x97, 0x6c, 0x4c, 0xa0, 0x6c, 0x47, 0x97, 0x69, 0x43, 0xba, 0x87, 0x5e, 0x95, 0x6a, 0x48, 0x8f, 0x5f, 0x3c, 0xe1, 0xac, 0x80, 0xd1, 0xa0, 0x70, 0xcf, 0x9d, 0x74, 0xab, 0x7d, 0x5b, 0x71, 0x51, 0x3c, 0x2c, 0x1c, 0x11, 0x09, 0x05, 0x02, 0x09, 0x09, 0x08, 0x6f, 0x55, 0x4b, 0x7c, 0x66, 0x5f, 0x8d, 0x6b, 0x5f, 0x95, 0x6a, 0x57, 0x07, 0x05, 0x03, 0x29, 0x20, 0x1a, 0x74, 0x62, 0x50, 0xcb, 0xa9, 0x8c, 0xed, 0xc9, 0xa8, 0xfa, 0xd3, 0xaf, 0xf2, 0xc7, 0x9e, 0xe1, 0xb1, 0x85, 0xc3, 0x8c, 0x62, 0xb3, 0x82, 0x5a, 0xe7, 0xb5, 0x8a, 0xe0, 0xad, 0x80, 0xc5, 0x91, 0x6b, 0x96, 0x6c, 0x4e, 0xd4, 0xa7, 0x83, 0xe5, 0xbe, 0x9d, 0xee, 0xd1, 0xba, 0xcc, 0xa7, 0x83, 0xb7, 0x8b, 0x6a, 0xca, 0x9b, 0x78, 0xcc, 0x9a, 0x72, 0xd7, 0xa4, 0x79, 0xe4, 0xb0, 0x86, 0xde, 0xab, 0x80, 0xc4, 0x90, 0x69, 0xc7, 0x90, 0x67, 0xd4, 0xa0, 0x71, 0xe5, 0xb5, 0x89, 0xd4, 0xa3, 0x78, 0xe3, 0xb3, 0x89, 0xcc, 0x98, 0x69, 0xe2, 0xad, 0x79, 0xe5, 0xb0, 0x7c, 0xd0, 0x97, 0x64, 0xd8, 0x9e, 0x6b, 0xe2, 0xac, 0x7c, 0xdd, 0xa2, 0x6f, 0xe0, 0xa6, 0x73, 0xeb, 0xb1, 0x7f, 0xee, 0xb7, 0x84, 0xed, 0xb9, 0x87, 0xe9, 0xb5, 0x83, 0xe6, 0xb2, 0x7b, 0xe3, 0xaa, 0x71, 0xd9, 0x9f, 0x69, 0xcd, 0x93, 0x63, 0xcf, 0x9c, 0x71, 0xb3, 0x89, 0x64, 0xb7, 0x8e, 0x6f, 0xbd, 0x9f, 0x87, 0xbd, 0xab, 0x9e, 0xe7, 0xe2, 0xe0, 0xf4, 0xf4, 0xf2, 0xf8, 0xf8, 0xf6, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf4, 0xf5, 0xf3, 0xe0, 0xde, 0xd7, 0xce, 0xbf, 0xb2, 0xbd, 0xa6, 0x93, 0xbf, 0xa9, 0x97, 0xa7, 0x82, 0x64, 0xb0, 0x83, 0x5e, 0x99, 0x6f, 0x4e, 0x85, 0x5c, 0x39, 0x6a, 0x44, 0x23, 0x8c, 0x62, 0x3f, 0x7a, 0x53, 0x31, 0x82, 0x5d, 0x3c, 0x62, 0x3f, 0x21, 0x7d, 0x55, 0x31, 0x8b, 0x5d, 0x35, 0x95, 0x65, 0x3b, 0x9f, 0x6e, 0x43, 0xa2, 0x70, 0x47, 0xaf, 0x7b, 0x4e, 0xc3, 0x8e, 0x5b, 0xbb, 0x86, 0x57, 0xcb, 0x96, 0x67, 0xce, 0x9c, 0x6d, 0xcc, 0x98, 0x69, 0xd6, 0xa3, 0x74, 0xd5, 0xa4, 0x76, 0xd8, 0xa9, 0x7b, 0xdf, 0xb0, 0x82, 0xdd, 0xaf, 0x83, 0xd9, 0xab, 0x7f, 0xda, 0xad, 0x85, 0xe0, 0xb4, 0x8b, 0xd0, 0xa7, 0x7f, 0xe2, 0xb4, 0x8d, 0xcd, 0x9c, 0x71, 0xd8, 0xa7, 0x7a, 0xc6, 0x94, 0x67, 0xda, 0xa8, 0x7d, 0xd8, 0xa7, 0x7d, 0xb6, 0x87, 0x61, 0x9c, 0x71, 0x4e, 0x73, 0x49, 0x27, 0xb8, 0x8a, 0x6b, 0xc3, 0x9b, 0x7a, 0x8a, 0x62, 0x41, 0x7c, 0x4f, 0x30, 0x5f, 0x40, 0x28, 0x6e, 0x4e, 0x34, 0x81, 0x58, 0x38, 0x98, 0x6b, 0x49, 0x9d, 0x6a, 0x43, 0xa1, 0x74, 0x50, 0xb0, 0x7e, 0x54, 0x9e, 0x6e, 0x4e, 0xb8, 0x82, 0x5b, 0xb1, 0x7b, 0x54, 0xe0, 0xb1, 0x8b, 0xe3, 0xbb, 0x98, 0xd8, 0xb2, 0x94, 0xb5, 0x94, 0x7a, 0x5b, 0x43, 0x33, 0x09, 0x09, 0x05, 0x66, 0x4d, 0x42, 0x7c, 0x62, 0x54, 0x83, 0x67, 0x5a, 0x5f, 0x48, 0x41, 0x40, 0x31, 0x29, 0xc3, 0xaa, 0x90, 0xe4, 0xc8, 0xae, 0xf0, 0xd3, 0xb8, 0xf4, 0xd0, 0xac, 0xf1, 0xc6, 0xa0, 0xe4, 0xb1, 0x86, 0xdd, 0xa7, 0x77, 0xde, 0xa1, 0x73, 0xca, 0x96, 0x6b, 0xdb, 0xa4, 0x76, 0xf0, 0xbb, 0x8a, 0xd8, 0x9e, 0x71, 0xbb, 0x8a, 0x65, 0xd6, 0xa5, 0x7c, 0xee, 0xd1, 0xb8, 0xe3, 0xc6, 0xaa, 0xba, 0x93, 0x6f, 0xcc, 0xa5, 0x80, 0xc4, 0x96, 0x71, 0xc7, 0x95, 0x6d, 0xc3, 0x90, 0x66, 0xda, 0xa4, 0x77, 0xd7, 0xa7, 0x7d, 0xaf, 0x7f, 0x56, 0xc1, 0x8b, 0x62, 0xd3, 0x9d, 0x6f, 0xe7, 0xb5, 0x87, 0xd8, 0xa5, 0x77, 0xe3, 0xb1, 0x84, 0xd4, 0xa1, 0x72, 0xd5, 0x9f, 0x6c, 0xdb, 0xa5, 0x73, 0xdd, 0xa3, 0x70, 0xd5, 0x9b, 0x69, 0xd6, 0xa0, 0x6e, 0xdb, 0xa3, 0x6f, 0xda, 0xa1, 0x6e, 0xe1, 0xa7, 0x75, 0xee, 0xb7, 0x84, 0xed, 0xb8, 0x85, 0xe8, 0xb3, 0x7f, 0xe8, 0xb3, 0x7e, 0xe3, 0xac, 0x76, 0xe1, 0xa9, 0x72, 0xc0, 0x90, 0x63, 0xd3, 0xa3, 0x78, 0xc4, 0x9a, 0x77, 0xba, 0x96, 0x7b, 0xba, 0x9e, 0x87, 0xc8, 0xb1, 0x9e, 0xdd, 0xd9, 0xd5, 0xf3, 0xf4, 0xf0, 0xfa, 0xfa, 0xf9, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xee, 0xed, 0xeb, 0xdf, 0xdb, 0xd5, 0xc3, 0xb4, 0xa8, 0xc4, 0xb0, 0xa1, 0xb9, 0xa4, 0x92, 0xb0, 0x8a, 0x6c, 0xa8, 0x7c, 0x5a, 0xa3, 0x76, 0x52, 0x80, 0x56, 0x33, 0x6c, 0x47, 0x28, 0x89, 0x5e, 0x3b, 0x75, 0x4e, 0x2c, 0x75, 0x4f, 0x2e, 0x59, 0x39, 0x1e, 0x72, 0x4b, 0x27, 0x8d, 0x62, 0x3a, 0x91, 0x63, 0x39, 0x93, 0x63, 0x39, 0xaa, 0x76, 0x4d, 0xa4, 0x70, 0x43, 0xbf, 0x8b, 0x58, 0xc7, 0x93, 0x65, 0xc6, 0x91, 0x63, 0xbf, 0x8a, 0x5c, 0xcf, 0x9a, 0x6c, 0xd0, 0x9d, 0x6e, 0xd7, 0xa5, 0x76, 0xcf, 0x9e, 0x71, 0xd9, 0xa9, 0x7b, 0xde, 0xb2, 0x85, 0xe0, 0xb3, 0x86, 0xce, 0xa3, 0x7b, 0xe1, 0xb5, 0x8e, 0xdb, 0xb2, 0x8c, 0xe6, 0xb9, 0x91, 0xd5, 0xa5, 0x7a, 0xd8, 0xa7, 0x7b, 0xd5, 0xa4, 0x78, 0xd4, 0xa3, 0x77, 0xd3, 0xa1, 0x76, 0xc6, 0x94, 0x6e, 0xbb, 0x8d, 0x6a, 0x70, 0x45, 0x27, 0x96, 0x6f, 0x52, 0xba, 0x96, 0x76, 0x8d, 0x69, 0x4a, 0x7a, 0x56, 0x3b, 0x59, 0x3b, 0x25, 0x95, 0x68, 0x48, 0xcb, 0x9a, 0x69, 0xcb, 0x9f, 0x72, 0xd0, 0x9c, 0x70, 0x94, 0x69, 0x45, 0xd1, 0x9f, 0x72, 0x98, 0x69, 0x45, 0xc0, 0x8d, 0x68, 0xd2, 0xa2, 0x80, 0xee, 0xc8, 0xa7, 0xef, 0xcf, 0xb2, 0xef, 0xd3, 0xba, 0xe9, 0xcf, 0xb7, 0xbd, 0x9e, 0x88, 0x3b, 0x30, 0x25, 0x67, 0x50, 0x46, 0x6c, 0x54, 0x48, 0x7e, 0x5f, 0x58, 0x57, 0x45, 0x3d, 0xaa, 0x95, 0x84, 0xf1, 0xdc, 0xc1, 0xf4, 0xe2, 0xca, 0xf4, 0xdc, 0xc1, 0xf1, 0xce, 0xb0, 0xe6, 0xbc, 0x97, 0xcd, 0x9c, 0x72, 0xd7, 0xa1, 0x73, 0xd1, 0x9b, 0x71, 0xbe, 0x8b, 0x62, 0xc9, 0x91, 0x66, 0xd4, 0xa1, 0x74, 0xc5, 0x92, 0x6a, 0xc7, 0x96, 0x6e, 0xd7, 0xa8, 0x81, 0xf1, 0xd6, 0xbf, 0xc6, 0xa3, 0x83, 0xcb, 0xa5, 0x82, 0xd1, 0xa9, 0x85, 0xc7, 0x99, 0x73, 0xc2, 0x91, 0x68, 0xd2, 0x9d, 0x75, 0xc2, 0x8a, 0x5d, 0xdb, 0xad, 0x82, 0xb7, 0x89, 0x5f, 0xba, 0x85, 0x5e, 0xd4, 0x9c, 0x70, 0xe1, 0xae, 0x82, 0xe7, 0xb4, 0x87, 0xdd, 0xab, 0x7c, 0xdf, 0xad, 0x7e, 0xdb, 0xa5, 0x73, 0xd5, 0x9f, 0x6d, 0xe7, 0xb0, 0x7c, 0xd9, 0xa2, 0x6e, 0xd4, 0x9e, 0x6a, 0xe0, 0xab, 0x77, 0xdc, 0xa3, 0x70, 0xd8, 0x9e, 0x6c, 0xe7, 0xaf, 0x7c, 0xea, 0xb4, 0x80, 0xef, 0xb9, 0x85, 0xe7, 0xb1, 0x7e, 0xe4, 0xae, 0x7a, 0xe0, 0xa6, 0x70, 0xd3, 0xa6, 0x79, 0xc9, 0x9c, 0x71, 0xc9, 0xa1, 0x7e, 0xc5, 0xa6, 0x91, 0xc5, 0xae, 0x97, 0xc0, 0xac, 0x98, 0xdf, 0xda, 0xd4, 0xea, 0xeb, 0xe6, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xee, 0xee, 0xec, 0xce, 0xc9, 0xc3, 0xc7, 0xbb, 0xb2, 0xc8, 0xb9, 0xad, 0xb5, 0x97, 0x7e, 0xb3, 0x8f, 0x6f, 0xac, 0x87, 0x62, 0xa6, 0x77, 0x4c, 0x74, 0x4a, 0x27, 0x6a, 0x45, 0x26, 0x80, 0x56, 0x32, 0x76, 0x4f, 0x2e, 0x72, 0x4c, 0x2c, 0x5f, 0x3e, 0x23, 0x6d, 0x47, 0x26, 0x7d, 0x56, 0x31, 0x8a, 0x5f, 0x36, 0x93, 0x63, 0x39, 0xa2, 0x6e, 0x44, 0xad, 0x79, 0x4c, 0xc7, 0x94, 0x61, 0xbf, 0x8a, 0x5c, 0xc6, 0x92, 0x64, 0xbf, 0x8b, 0x5c, 0xce, 0x99, 0x6b, 0xce, 0x9c, 0x6d, 0xd4, 0xa2, 0x73, 0xd3, 0xa2, 0x75, 0xd9, 0xa9, 0x7b, 0xde, 0xb1, 0x84, 0xd8, 0xab, 0x7e, 0xd5, 0xa9, 0x82, 0xd8, 0xad, 0x85, 0xdf, 0xb7, 0x90, 0xe2, 0xb5, 0x8d, 0xd8, 0xa8, 0x7d, 0xe3, 0xb2, 0x86, 0xdb, 0xab, 0x7f, 0xdb, 0xab, 0x7f, 0xd2, 0xa0, 0x76, 0xba, 0x88, 0x62, 0xbe, 0x91, 0x6e, 0x7d, 0x57, 0x39, 0x51, 0x32, 0x1b, 0xa6, 0x87, 0x69, 0x99, 0x7a, 0x5c, 0x61, 0x43, 0x24, 0x9d, 0x70, 0x4b, 0xc6, 0x8d, 0x5f, 0xdb, 0xa5, 0x76, 0xd8, 0xa1, 0x72, 0xe6, 0xb1, 0x88, 0xd0, 0x9c, 0x72, 0xdb, 0xa8, 0x7b, 0xdd, 0xa8, 0x7c, 0xce, 0x9e, 0x76, 0xe0, 0xaf, 0x86, 0xe2, 0xb9, 0x92, 0xe4, 0xc0, 0x9f, 0xe2, 0xc3, 0xa6, 0xe8, 0xcd, 0xb8, 0xe0, 0xc5, 0xab, 0x8a, 0x6f, 0x5b, 0x43, 0x35, 0x31, 0x53, 0x44, 0x3b, 0x43, 0x33, 0x2e, 0x8b, 0x7b, 0x70, 0xeb, 0xd6, 0xbb, 0xf0, 0xe0, 0xca, 0xf2, 0xda, 0xc5, 0xf3, 0xd8, 0xbd, 0xf4, 0xd5, 0xb9, 0xef, 0xc8, 0xa5, 0xea, 0xbc, 0x95, 0xd8, 0xa6, 0x7d, 0xe7, 0xba, 0x96, 0xdc, 0xaa, 0x82, 0xd8, 0xa9, 0x83, 0xe9, 0xc0, 0x98, 0xc6, 0x94, 0x6b, 0xae, 0x80, 0x5c, 0xd6, 0xb3, 0x96, 0xe7, 0xcb, 0xb2, 0xbf, 0x94, 0x71, 0xcc, 0xa2, 0x80, 0xcf, 0xa5, 0x82, 0xcc, 0x9d, 0x78, 0xb8, 0x87, 0x5e, 0xd6, 0xa1, 0x79, 0xb2, 0x7a, 0x4d, 0xd0, 0x9d, 0x74, 0xc6, 0x93, 0x6a, 0xc2, 0x8e, 0x66, 0xca, 0x93, 0x67, 0xdc, 0xa9, 0x7c, 0xe5, 0xb2, 0x85, 0xe5, 0xb2, 0x84, 0xd9, 0xa7, 0x78, 0xea, 0xb5, 0x83, 0xd3, 0x9d, 0x6b, 0xd9, 0xa6, 0x71, 0xf1, 0xbd, 0x89, 0xdb, 0xa6, 0x72, 0xd5, 0xa0, 0x6c, 0xdc, 0xa3, 0x70, 0xe3, 0xa9, 0x77, 0xd4, 0x9d, 0x6a, 0xe8, 0xb2, 0x7f, 0xe9, 0xb4, 0x80, 0xea, 0xb5, 0x81, 0xea, 0xb4, 0x81, 0xdb, 0xa0, 0x68, 0xde, 0xa6, 0x72, 0xc3, 0x96, 0x6b, 0xdd, 0xb4, 0x91, 0xbf, 0xa3, 0x90, 0xd0, 0xbd, 0xab, 0xbe, 0xac, 0x9d, 0xd8, 0xcf, 0xc5, 0xe6, 0xe6, 0xe1, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xeb, 0xe9, 0xe4, 0xd5, 0xcf, 0xc6, 0xc7, 0xbc, 0xb2, 0xc8, 0xbe, 0xb0, 0xcc, 0xb6, 0xa4, 0xbf, 0xa1, 0x89, 0xb9, 0x94, 0x71, 0x94, 0x68, 0x3f, 0x72, 0x4d, 0x2b, 0x5d, 0x3c, 0x20, 0x74, 0x4f, 0x2d, 0x75, 0x4f, 0x31, 0x58, 0x36, 0x1b, 0x58, 0x36, 0x1c, 0x64, 0x42, 0x26, 0x7a, 0x53, 0x31, 0x91, 0x63, 0x3b, 0x98, 0x69, 0x3e, 0xa2, 0x6f, 0x40, 0xae, 0x79, 0x4b, 0xce, 0x99, 0x6b, 0xb7, 0x82, 0x56, 0xc5, 0x90, 0x64, 0xce, 0x99, 0x6b, 0xca, 0x95, 0x67, 0xc2, 0x8f, 0x63, 0xca, 0x97, 0x6a, 0xcb, 0x99, 0x6c, 0xda, 0xa7, 0x7a, 0xe0, 0xaf, 0x83, 0xcf, 0xa3, 0x76, 0xe6, 0xba, 0x93, 0xde, 0xb2, 0x8b, 0xec, 0xc4, 0x9d, 0xd9, 0xac, 0x83, 0xd9, 0xab, 0x82, 0xe5, 0xb2, 0x85, 0xde, 0xb2, 0x8a, 0xde, 0xb2, 0x8a, 0xd6, 0xa9, 0x81, 0xbc, 0x8f, 0x69, 0xb0, 0x87, 0x66, 0x8c, 0x65, 0x4b, 0x5c, 0x3b, 0x1e, 0x6c, 0x49, 0x33, 0xa6, 0x84, 0x69, 0x84, 0x5c, 0x3e, 0x89, 0x5b, 0x3b, 0xad, 0x7a, 0x51, 0xc4, 0x8c, 0x5f, 0xc4, 0x8a, 0x59, 0xc7, 0x93, 0x66, 0xd4, 0x9f, 0x72, 0xd2, 0x9c, 0x74, 0xc2, 0x8d, 0x62, 0xd2, 0xa0, 0x75, 0xcf, 0x9f, 0x78, 0xa9, 0x78, 0x51, 0xd1, 0xa4, 0x7e, 0xde, 0xb8, 0x98, 0xdb, 0xbd, 0xa3, 0xdf, 0xc7, 0xb0, 0xd1, 0xbb, 0xa5, 0x81, 0x70, 0x61, 0x2f, 0x28, 0x28, 0x51, 0x49, 0x43, 0xe0, 0xce, 0xc1, 0xe4, 0xcf, 0xb9, 0xe3, 0xcf, 0xb4, 0xdb, 0xbc, 0x9e, 0xda, 0xb1, 0x92, 0xe6, 0xc0, 0xa0, 0xeb, 0xc6, 0xa5, 0xeb, 0xbf, 0x9b, 0xee, 0xc5, 0xa2, 0xed, 0xc0, 0x97, 0xf1, 0xc3, 0x9b, 0xec, 0xbd, 0x96, 0xec, 0xc2, 0x9e, 0xef, 0xc6, 0x9d, 0xeb, 0xb8, 0x87, 0xe4, 0xc4, 0xa7, 0xbc, 0x9b, 0x7e, 0xbf, 0x99, 0x79, 0xc9, 0x9f, 0x7b, 0xd0, 0xa9, 0x87, 0xce, 0xa2, 0x7c, 0xbc, 0x8f, 0x69, 0xc0, 0x8c, 0x63, 0xc7, 0x95, 0x66, 0xce, 0x9b, 0x70, 0xcd, 0x9a, 0x6f, 0xc5, 0x94, 0x69, 0xc1, 0x90, 0x64, 0xdd, 0xaa, 0x80, 0xe4, 0xb2, 0x81, 0xe4, 0xb1, 0x85, 0xe3, 0xb1, 0x84, 0xe2, 0xb3, 0x85, 0xd8, 0xa4, 0x71, 0xd2, 0x9c, 0x6a, 0xeb, 0xb5, 0x83, 0xe7, 0xae, 0x7d, 0xdb, 0xa2, 0x71, 0xd5, 0x9c, 0x67, 0xe3, 0xae, 0x7a, 0xd3, 0x9e, 0x6d, 0xdf, 0xa9, 0x77, 0xe4, 0xb1, 0x7d, 0xe6, 0xb3, 0x7e, 0xdb, 0xa3, 0x70, 0xd8, 0xa1, 0x6b, 0xdc, 0xa5, 0x6a, 0xd0, 0xa5, 0x7c, 0xda, 0xb7, 0x94, 0xc9, 0xad, 0x97, 0xca, 0xb6, 0xa6, 0xc3, 0xb4, 0xaa, 0xc8, 0xbb, 0xb5, 0xeb, 0xe7, 0xe3, 0xf7, 0xf7, 0xf7, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xe8, 0xe5, 0xe1, 0xd5, 0xce, 0xc6, 0xd2, 0xcb, 0xc5, 0xd9, 0xd3, 0xc7, 0xde, 0xcf, 0xc3, 0xca, 0xb2, 0x9f, 0xa4, 0x7c, 0x5b, 0x7a, 0x51, 0x31, 0x64, 0x44, 0x28, 0x50, 0x38, 0x23, 0x6c, 0x4c, 0x2d, 0x58, 0x36, 0x1c, 0x4d, 0x2f, 0x18, 0x59, 0x3c, 0x25, 0x55, 0x35, 0x1b, 0x70, 0x48, 0x27, 0x8a, 0x5c, 0x34, 0x9d, 0x6d, 0x43, 0xa9, 0x76, 0x48, 0xbe, 0x8a, 0x5c, 0xb8, 0x83, 0x55, 0xb3, 0x7e, 0x52, 0xcb, 0x96, 0x6a, 0xbf, 0x8a, 0x5c, 0xc6, 0x92, 0x64, 0xc4, 0x91, 0x64, 0xce, 0x9b, 0x6f, 0xc8, 0x96, 0x69, 0xdb, 0xa8, 0x7c, 0xd4, 0xa4, 0x78, 0xdf, 0xb3, 0x86, 0xe2, 0xb7, 0x90, 0xe5, 0xb9, 0x92, 0xe7, 0xbf, 0x99, 0xd4, 0xa7, 0x7f, 0xde, 0xb1, 0x88, 0xe0, 0xad, 0x81, 0xe3, 0xb6, 0x90, 0xd0, 0xa4, 0x80, 0xd2, 0xa5, 0x7f, 0xbf, 0x92, 0x6d, 0xb5, 0x8c, 0x6b, 0x94, 0x6d, 0x51, 0x77, 0x55, 0x3c, 0x4d, 0x2b, 0x14, 0x95, 0x74, 0x58, 0x9a, 0x77, 0x58, 0x85, 0x5b, 0x3a, 0x8c, 0x60, 0x3d, 0xa0, 0x70, 0x4a, 0xab, 0x79, 0x52, 0xbb, 0x86, 0x5c, 0xa5, 0x71, 0x4c, 0xca, 0x98, 0x6d, 0xba, 0x8c, 0x68, 0xcf, 0xa5, 0x80, 0xe7, 0xbf, 0x9e, 0xe1, 0xb8, 0x97, 0xde, 0xb8, 0x98, 0xe6, 0xc9, 0xae, 0xe5, 0xcd, 0xb7, 0xdb, 0xc6, 0xb3, 0xe1, 0xd1, 0xbe, 0xd4, 0xc7, 0xb8, 0x32, 0x2b, 0x24, 0x91, 0x89, 0x83, 0xea, 0xd8, 0xca, 0xdb, 0xc8, 0xb5, 0xe6, 0xd4, 0xbd, 0xea, 0xd1, 0xb7, 0xe1, 0xbf, 0xa4, 0xe6, 0xc3, 0xa4, 0xd7, 0xad, 0x89, 0xdf, 0xb3, 0x8d, 0xe8, 0xc0, 0x9e, 0xdd, 0xaa, 0x80, 0xef, 0xbd, 0x93, 0xe7, 0xb9, 0x8d, 0xe8, 0xbe, 0x95, 0xf1, 0xc2, 0x9b, 0xdb, 0xac, 0x84, 0xdb, 0xb3, 0x8f, 0xb5, 0x90, 0x70, 0xbe, 0x99, 0x79, 0xc3, 0x99, 0x75, 0xca, 0xa3, 0x81, 0xc8, 0x9d, 0x77, 0xc2, 0x95, 0x70, 0xb8, 0x89, 0x61, 0xd4, 0xa6, 0x7a, 0xdb, 0xad, 0x81, 0xc3, 0x96, 0x69, 0xcc, 0x9c, 0x70, 0xb2, 0x81, 0x55, 0xdb, 0xa8, 0x7e, 0xda, 0xa8, 0x78, 0xe4, 0xb1, 0x84, 0xe5, 0xb2, 0x85, 0xde, 0xaf, 0x81, 0xe2, 0xae, 0x7b, 0xc9, 0x93, 0x61, 0xcd, 0x97, 0x65, 0xe7, 0xb2, 0x80, 0xe4, 0xaf, 0x7d, 0xdd, 0xa5, 0x70, 0xdf, 0xaa, 0x76, 0xd8, 0xa3, 0x72, 0xd6, 0xa0, 0x6e, 0xdf, 0xac, 0x79, 0xe9, 0xb6, 0x81, 0xe5, 0xae, 0x7b, 0xd4, 0x9f, 0x6c, 0xcb, 0x95, 0x66, 0xd4, 0xa9, 0x83, 0xd9, 0xbf, 0xa4, 0xd6, 0xc1, 0xb1, 0xca, 0xbf, 0xb5, 0xc0, 0xb4, 0xa9, 0xcc, 0xc5, 0xbd, 0xe2, 0xde, 0xda, 0xf7, 0xf6, 0xf7, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xe6, 0xe1, 0xdf, 0xd6, 0xd2, 0xcb, 0xe4, 0xe4, 0xd8, 0xde, 0xde, 0xd3, 0xe0, 0xd4, 0xcb, 0xc6, 0xb2, 0xa2, 0x82, 0x6d, 0x5b, 0x52, 0x3e, 0x2c, 0x41, 0x2b, 0x1f, 0x45, 0x33, 0x26, 0x5c, 0x3e, 0x25, 0x58, 0x3b, 0x21, 0x47, 0x30, 0x1a, 0x3e, 0x27, 0x11, 0x5d, 0x40, 0x24, 0x67, 0x41, 0x20, 0x75, 0x4d, 0x29, 0xa0, 0x71, 0x44, 0xaa, 0x7a, 0x50, 0xb5, 0x82, 0x55, 0xad, 0x7a, 0x4e, 0xbd, 0x8a, 0x5d, 0xbd, 0x8b, 0x5e, 0xb8, 0x84, 0x56, 0xc2, 0x8e, 0x5f, 0xcd, 0x98, 0x6a, 0xd2, 0x9d, 0x6f, 0xdb, 0xa7, 0x79, 0xdd, 0xad, 0x80, 0xc8, 0x9d, 0x75, 0xe5, 0xba, 0x92, 0xd9, 0xad, 0x86, 0xd4, 0xa8, 0x81, 0xdd, 0xb5, 0x8e, 0xe5, 0xb8, 0x90, 0xe0, 0xac, 0x82, 0xda, 0xaa, 0x77, 0xe8, 0xbc, 0x9d, 0xc6, 0x9b, 0x78, 0xde, 0xb6, 0x8d, 0xb8, 0x91, 0x6e, 0x99, 0x70, 0x54, 0xa7, 0x7e, 0x60, 0x84, 0x60, 0x40, 0x62, 0x40, 0x27, 0x8a, 0x66, 0x4a, 0xa4, 0x88, 0x70, 0xa8, 0x88, 0x6c, 0xb0, 0x8d, 0x72, 0x93, 0x68, 0x46, 0xa7, 0x7d, 0x5d, 0xc6, 0x94, 0x67, 0xb2, 0x84, 0x62, 0xd4, 0xa7, 0x7d, 0xdd, 0xb4, 0x92, 0xe1, 0xbd, 0x9d, 0xe4, 0xc2, 0xa4, 0xdb, 0xbd, 0xa2, 0xe2, 0xc7, 0xb1, 0xe9, 0xd2, 0xc1, 0xe5, 0xd4, 0xc3, 0xdf, 0xd2, 0xc1, 0xe7, 0xdf, 0xd2, 0xdc, 0xd5, 0xca, 0x58, 0x51, 0x4b, 0xba, 0xb3, 0xad, 0xec, 0xe5, 0xd9, 0xdf, 0xd2, 0xc1, 0xf0, 0xdd, 0xc8, 0xeb, 0xe0, 0xca, 0xe8, 0xd8, 0xbe, 0xec, 0xd2, 0xba, 0xf1, 0xcd, 0xad, 0xf1, 0xca, 0xa7, 0xe3, 0xbb, 0x93, 0xc7, 0x9e, 0x76, 0xbf, 0x8f, 0x6a, 0xdb, 0xa3, 0x7a, 0xe0, 0xb2, 0x82, 0xd1, 0xa3, 0x79, 0xdc, 0xad, 0x8a, 0xca, 0x9f, 0x7e, 0xc0, 0x99, 0x7a, 0xbf, 0x9e, 0x80, 0xbe, 0x90, 0x6c, 0xc4, 0x9e, 0x7a, 0xc0, 0x94, 0x6f, 0xc4, 0x96, 0x72, 0xc9, 0x97, 0x74, 0xd3, 0xa2, 0x79, 0xdd, 0xb0, 0x85, 0xda, 0xad, 0x83, 0xbf, 0x91, 0x67, 0xbf, 0x8c, 0x63, 0xd4, 0xa3, 0x79, 0xd4, 0xa4, 0x76, 0xdc, 0xab, 0x7e, 0xe9, 0xb8, 0x8b, 0xde, 0xac, 0x7f, 0xd7, 0xa4, 0x77, 0xda, 0xa8, 0x79, 0xce, 0x98, 0x6a, 0xe1, 0xac, 0x7e, 0xe5, 0xb1, 0x83, 0xe0, 0xa9, 0x79, 0xdc, 0xa4, 0x73, 0xe3, 0xac, 0x7b, 0xdc, 0xa6, 0x74, 0xd5, 0x9f, 0x6d, 0xea, 0xb4, 0x80, 0xdf, 0xaa, 0x76, 0xda, 0xa8, 0x75, 0xb3, 0x80, 0x53, 0xd3, 0xa0, 0x71, 0xd3, 0xbb, 0xa2, 0xd0, 0xc3, 0xb9, 0xcd, 0xc9, 0xc1, 0xc9, 0xc2, 0xb9, 0xd6, 0xce, 0xc5, 0xdb, 0xd7, 0xd1, 0xf7, 0xf6, 0xf4, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf9, 0xf9, 0xef, 0xed, 0xeb, 0xe1, 0xe0, 0xd9, 0xe9, 0xe8, 0xe2, 0xee, 0xed, 0xe7, 0xd8, 0xcf, 0xc8, 0xac, 0x9b, 0x8d, 0x6d, 0x59, 0x4b, 0x46, 0x32, 0x24, 0x3b, 0x26, 0x1a, 0x2a, 0x18, 0x0c, 0x50, 0x35, 0x1f, 0x5a, 0x40, 0x28, 0x2b, 0x19, 0x0d, 0x47, 0x2a, 0x18, 0x5c, 0x38, 0x1b, 0x6c, 0x47, 0x26, 0x73, 0x4b, 0x27, 0xa8, 0x78, 0x4b, 0x97, 0x67, 0x3e, 0xb6, 0x84, 0x57, 0xb0, 0x7d, 0x50, 0xbc, 0x89, 0x5c, 0xbf, 0x8d, 0x60, 0xbb, 0x86, 0x58, 0xcd, 0x99, 0x6b, 0xbd, 0x88, 0x5a, 0xd1, 0x9c, 0x6e, 0xd4, 0xa0, 0x71, 0xd4, 0xa4, 0x77, 0xcd, 0xa2, 0x7b, 0xdd, 0xb1, 0x8a, 0xdd, 0xb1, 0x8a, 0xeb, 0xbf, 0x98, 0xe9, 0xc1, 0x9b, 0xe5, 0xb8, 0x90, 0xda, 0xa9, 0x7d, 0xda, 0xad, 0x81, 0xe1, 0xb7, 0x94, 0xd7, 0xad, 0x89, 0xbb, 0x90, 0x6f, 0xb8, 0x8e, 0x6b, 0xaa, 0x80, 0x59, 0xa9, 0x7e, 0x60, 0x9b, 0x76, 0x57, 0x74, 0x51, 0x36, 0x7d, 0x66, 0x54, 0xbe, 0xa2, 0x8b, 0xb6, 0x97, 0x7c, 0xb8, 0x8e, 0x6e, 0xc6, 0x9a, 0x78, 0xbf, 0x92, 0x66, 0xce, 0x9f, 0x7c, 0xe2, 0xb6, 0x92, 0xdc, 0xb3, 0x8f, 0xe2, 0xb9, 0x97, 0xe2, 0xbf, 0x9e, 0xdc, 0xba, 0x9d, 0xe0, 0xc3, 0xa9, 0xd6, 0xbc, 0xa7, 0xe2, 0xcb, 0xba, 0xe8, 0xd7, 0xc5, 0xea, 0xdf, 0xcf, 0xe8, 0xdf, 0xd2, 0xe4, 0xdd, 0xd2, 0x83, 0x7c, 0x77, 0xd7, 0xd0, 0xca, 0xeb, 0xe5, 0xd9, 0xe9, 0xde, 0xcf, 0xea, 0xdb, 0xc8, 0xe5, 0xd2, 0xc0, 0xdb, 0xc3, 0xaf, 0xd4, 0xb4, 0x98, 0xe5, 0xc8, 0xae, 0xea, 0xc7, 0xa6, 0xe4, 0xbf, 0x9a, 0xe4, 0xb5, 0x92, 0xdb, 0xb5, 0x90, 0xdb, 0xaf, 0x80, 0xea, 0xbb, 0x9e, 0xd1, 0x9c, 0x70, 0xe1, 0xba, 0x92, 0xd6, 0xba, 0xa1, 0xbb, 0x94, 0x75, 0xc2, 0x9b, 0x78, 0xbc, 0x92, 0x70, 0xc2, 0x99, 0x73, 0xc1, 0x95, 0x70, 0xc0, 0x94, 0x6f, 0xc2, 0x93, 0x6f, 0xda, 0xad, 0x82, 0xdb, 0xae, 0x83, 0xd6, 0xa9, 0x7e, 0xcf, 0xa2, 0x77, 0xc2, 0x8f, 0x66, 0xd7, 0xa5, 0x7d, 0xdc, 0xab, 0x7e, 0xd9, 0xa9, 0x7b, 0xe0, 0xb0, 0x82, 0xeb, 0xbc, 0x8e, 0xdc, 0xae, 0x7f, 0xe4, 0xb5, 0x85, 0xd9, 0xa7, 0x78, 0xdb, 0xa6, 0x78, 0xe1, 0xad, 0x7f, 0xea, 0xb6, 0x85, 0xdd, 0xa9, 0x77, 0xe3, 0xae, 0x7c, 0xe1, 0xab, 0x7a, 0xdb, 0xa5, 0x73, 0xd9, 0xa3, 0x6f, 0xe3, 0xae, 0x7a, 0xe3, 0xb1, 0x7f, 0xb9, 0x86, 0x59, 0xb3, 0x81, 0x57, 0xbf, 0xa2, 0x89, 0xd0, 0xc4, 0xba, 0xd6, 0xd2, 0xca, 0xdb, 0xd7, 0xd2, 0xd9, 0xd5, 0xd0, 0xdb, 0xd7, 0xd1, 0xf3, 0xf2, 0xf1, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf4, 0xf5, 0xf2, 0xe7, 0xe8, 0xe4, 0xe8, 0xe7, 0xe3, 0xea, 0xe9, 0xe5, 0xd4, 0xce, 0xc8, 0x8b, 0x7c, 0x72, 0x5d, 0x49, 0x3d, 0x43, 0x2f, 0x23, 0x3c, 0x28, 0x1e, 0x3c, 0x28, 0x1a, 0x4c, 0x31, 0x1c, 0x3f, 0x2a, 0x17, 0x3a, 0x24, 0x0e, 0x51, 0x33, 0x19, 0x65, 0x43, 0x24, 0x68, 0x46, 0x25, 0x71, 0x4d, 0x29, 0x9e, 0x70, 0x45, 0x94, 0x69, 0x3c, 0xb5, 0x84, 0x57, 0xa6, 0x73, 0x49, 0xc0, 0x8d, 0x5f, 0xba, 0x8a, 0x5d, 0xbb, 0x89, 0x5b, 0xcd, 0x99, 0x69, 0xcd, 0x99, 0x6a, 0xd8, 0xa3, 0x75, 0xda, 0xa3, 0x72, 0xcb, 0x9b, 0x6f, 0xdf, 0xb3, 0x8c, 0xdc, 0xb1, 0x89, 0xd9, 0xad, 0x86, 0xe4, 0xb9, 0x92, 0xee, 0xc6, 0xa0, 0xe6, 0xb8, 0x91, 0xd5, 0xa6, 0x7d, 0xdd, 0xb3, 0x8e, 0xe2, 0xba, 0x95, 0xd2, 0xa8, 0x84, 0xc8, 0x9d, 0x78, 0xaf, 0x83, 0x5d, 0xae, 0x80, 0x5f, 0xb6, 0x8e, 0x6f, 0xb2, 0x90, 0x73, 0xa2, 0x84, 0x6d, 0x7c, 0x61, 0x4c, 0x9f, 0x86, 0x6b, 0xa1, 0x84, 0x70, 0xa9, 0x81, 0x65, 0xc2, 0x90, 0x62, 0xd4, 0xa4, 0x7d, 0xd5, 0xa7, 0x81, 0xda, 0xaf, 0x87, 0xd4, 0xac, 0x8c, 0xe0, 0xb9, 0x97, 0xdb, 0xb7, 0x97, 0xdc, 0xba, 0x9c, 0xd4, 0xb6, 0x9b, 0xda, 0xc1, 0xad, 0xdd, 0xc7, 0xb7, 0xe4, 0xd5, 0xc6, 0xe5, 0xdc, 0xcd, 0xe4, 0xdc, 0xd1, 0xd6, 0xcf, 0xc5, 0x9c, 0x94, 0x8d, 0xd3, 0xcb, 0xc5, 0xe5, 0xde, 0xd6, 0xeb, 0xe4, 0xd8, 0xe8, 0xdf, 0xd2, 0xeb, 0xde, 0xce, 0xe0, 0xce, 0xba, 0xda, 0xc1, 0xaa, 0xd8, 0xba, 0x9f, 0xde, 0xb9, 0x9a, 0xe9, 0xc3, 0xa3, 0xec, 0xc8, 0xa8, 0xee, 0xc6, 0xa5, 0xee, 0xcd, 0xb0, 0xe8, 0xbd, 0x93, 0xe9, 0xc4, 0x9f, 0xe2, 0xad, 0x7e, 0xcc, 0xae, 0x93, 0xd7, 0xb8, 0x9c, 0xcd, 0xb0, 0x96, 0xba, 0x97, 0x7a, 0xbe, 0x93, 0x69, 0xbf, 0x93, 0x6d, 0xbf, 0x94, 0x6e, 0xcb, 0x9f, 0x78, 0xcd, 0x9f, 0x77, 0xdd, 0xb2, 0x89, 0xda, 0xab, 0x80, 0xd5, 0xa7, 0x7e, 0xcc, 0x9b, 0x71, 0xd6, 0xa3, 0x7b, 0xdd, 0xac, 0x7d, 0xd6, 0xa4, 0x77, 0xda, 0xa9, 0x7b, 0xef, 0xbf, 0x91, 0xdc, 0xb0, 0x81, 0xe2, 0xb3, 0x85, 0xd5, 0xa1, 0x73, 0xd3, 0x9e, 0x70, 0xd2, 0x9d, 0x6f, 0xe9, 0xb7, 0x87, 0xe3, 0xb2, 0x81, 0xd9, 0xa6, 0x76, 0xdd, 0xa9, 0x78, 0xdf, 0xab, 0x77, 0xd7, 0xa1, 0x6b, 0xe8, 0xb4, 0x7e, 0xdc, 0xa8, 0x74, 0xab, 0x7c, 0x52, 0xa4, 0x74, 0x54, 0xb5, 0x98, 0x84, 0xd5, 0xcb, 0xc3, 0xda, 0xd6, 0xcf, 0xdf, 0xde, 0xda, 0xe7, 0xe6, 0xe2, 0xde, 0xdd, 0xd9, 0xf6, 0xf6, 0xf4, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf8, 0xf9, 0xf6, 0xe9, 0xe9, 0xe7, 0xe8, 0xe6, 0xe3, 0xe4, 0xe3, 0xdf, 0xd2, 0xcd, 0xc5, 0x7c, 0x6c, 0x62, 0x5f, 0x4b, 0x3e, 0x4a, 0x36, 0x29, 0x41, 0x2c, 0x22, 0x46, 0x2e, 0x1b, 0x4c, 0x30, 0x1e, 0x35, 0x21, 0x0f, 0x4b, 0x35, 0x1f, 0x52, 0x36, 0x1d, 0x50, 0x32, 0x15, 0x61, 0x41, 0x23, 0x6b, 0x4a, 0x28, 0x8c, 0x61, 0x3a, 0x96, 0x6b, 0x40, 0xad, 0x7e, 0x53, 0xb5, 0x83, 0x56, 0xb2, 0x7e, 0x4f, 0xb1, 0x82, 0x58, 0xba, 0x8a, 0x5f, 0xc6, 0x92, 0x62, 0xd2, 0x9d, 0x6f, 0xdd, 0xa8, 0x7a, 0xd4, 0x9e, 0x6d, 0xc9, 0x9c, 0x72, 0xe3, 0xb8, 0x8e, 0xde, 0xb3, 0x89, 0xdd, 0xb1, 0x8a, 0xeb, 0xbf, 0x98, 0xea, 0xbf, 0x98, 0xe0, 0xb1, 0x8a, 0xd8, 0xab, 0x87, 0xea, 0xc1, 0x9d, 0xd6, 0xad, 0x89, 0xc7, 0x9d, 0x7a, 0xb8, 0x8d, 0x68, 0xac, 0x80, 0x5d, 0xb1, 0x88, 0x69, 0xb5, 0x92, 0x73, 0xab, 0x8b, 0x6f, 0x7f, 0x5f, 0x41, 0xa2, 0x86, 0x6b, 0x6b, 0x52, 0x3f, 0x7b, 0x63, 0x4b, 0x8b, 0x65, 0x44, 0x95, 0x6b, 0x48, 0xa2, 0x78, 0x57, 0xac, 0x7a, 0x53, 0xb9, 0x8e, 0x69, 0xc5, 0x9d, 0x7a, 0xb4, 0x8b, 0x68, 0xdc, 0xb8, 0x99, 0xcd, 0xae, 0x90, 0xe6, 0xcb, 0xb0, 0xe0, 0xc9, 0xb5, 0xdf, 0xcb, 0xbc, 0xe6, 0xdb, 0xcc, 0xe8, 0xe0, 0xd4, 0xdd, 0xd4, 0xcb, 0xd5, 0xcd, 0xc3, 0x99, 0x90, 0x87, 0xc7, 0xbe, 0xb6, 0xdf, 0xd6, 0xce, 0xdf, 0xd9, 0xcd, 0xe9, 0xe3, 0xd7, 0xeb, 0xdf, 0xcf, 0xe7, 0xd7, 0xc4, 0xde, 0xc2, 0xa8, 0xd5, 0xb4, 0x97, 0xdb, 0xb2, 0x94, 0xda, 0xb1, 0x93, 0xe2, 0xbc, 0x9c, 0xe9, 0xbf, 0x9b, 0xef, 0xcb, 0xa8, 0xe6, 0xbd, 0x99, 0xcf, 0xa2, 0x7b, 0xc2, 0x98, 0x74, 0xad, 0x90, 0x74, 0xc6, 0xa5, 0x85, 0xc2, 0xa1, 0x80, 0xc4, 0xa2, 0x85, 0xbf, 0x9b, 0x77, 0xc5, 0x9a, 0x76, 0xbd, 0x91, 0x6b, 0xd5, 0xa7, 0x81, 0xc7, 0x95, 0x70, 0xde, 0xb4, 0x8d, 0xd8, 0xaa, 0x81, 0xe5, 0xb9, 0x90, 0xcc, 0x9b, 0x70, 0xcc, 0x99, 0x70, 0xe3, 0xb0, 0x83, 0xe2, 0xb0, 0x83, 0xd3, 0xa2, 0x74, 0xe5, 0xb3, 0x86, 0xee, 0xc1, 0x92, 0xe6, 0xb6, 0x8c, 0xda, 0xa5, 0x77, 0xd9, 0xa5, 0x76, 0xdc, 0xa7, 0x79, 0xe1, 0xae, 0x7f, 0xe4, 0xb2, 0x83, 0xdc, 0xaa, 0x7c, 0xe0, 0xae, 0x7e, 0xd8, 0xa5, 0x71, 0xdb, 0xa6, 0x71, 0xe2, 0xae, 0x79, 0xe2, 0xac, 0x77, 0xa5, 0x77, 0x50, 0xa8, 0x7d, 0x57, 0x8e, 0x72, 0x5a, 0xcc, 0xc0, 0xb6, 0xdb, 0xd7, 0xd1, 0xdf, 0xdd, 0xda, 0xe8, 0xe7, 0xe4, 0xe7, 0xe7, 0xe5, 0xfa, 0xfa, 0xf8, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf7, 0xf8, 0xf5, 0xef, 0xef, 0xed, 0xea, 0xe9, 0xe5, 0xe5, 0xe4, 0xe0, 0xaf, 0xaa, 0xa2, 0x8a, 0x7a, 0x71, 0x5a, 0x47, 0x39, 0x52, 0x3e, 0x31, 0x48, 0x30, 0x24, 0x5e, 0x41, 0x2c, 0x4b, 0x34, 0x27, 0x38, 0x21, 0x0f, 0x4b, 0x31, 0x19, 0x40, 0x28, 0x13, 0x40, 0x28, 0x11, 0x4f, 0x34, 0x19, 0x6b, 0x49, 0x2d, 0x70, 0x4b, 0x26, 0x9c, 0x6b, 0x46, 0xa5, 0x77, 0x4d, 0xb9, 0x88, 0x55, 0xb5, 0x81, 0x53, 0xbe, 0x8e, 0x64, 0xb9, 0x88, 0x5d, 0xcd, 0x99, 0x69, 0xd5, 0xa0, 0x72, 0xd0, 0x9b, 0x6d, 0xc1, 0x8f, 0x62, 0xde, 0xb4, 0x8e, 0xe2, 0xb8, 0x8a, 0xd6, 0xab, 0x7e, 0xef, 0xc4, 0x9c, 0xe6, 0xba, 0x93, 0xdf, 0xae, 0x83, 0xe5, 0xb7, 0x92, 0xe8, 0xc1, 0x9c, 0xd9, 0xb0, 0x8c, 0xcf, 0xa3, 0x80, 0xbd, 0x93, 0x70, 0xb9, 0x8d, 0x6a, 0xac, 0x83, 0x63, 0xd0, 0xb2, 0x95, 0xb8, 0x9a, 0x80, 0x83, 0x62, 0x43, 0xd1, 0xb1, 0x96, 0x5b, 0x3f, 0x29, 0x5f, 0x46, 0x33, 0x5f, 0x48, 0x2c, 0x78, 0x5a, 0x3e, 0xac, 0x88, 0x6c, 0xa4, 0x76, 0x53, 0x99, 0x71, 0x52, 0xb3, 0x8c, 0x6a, 0xc2, 0x98, 0x72, 0xca, 0x9c, 0x74, 0xe9, 0xc8, 0xab, 0xe7, 0xcd, 0xb2, 0xe8, 0xd1, 0xba, 0xe1, 0xd0, 0xbb, 0xe5, 0xd7, 0xc6, 0xe3, 0xda, 0xca, 0xde, 0xd6, 0xcb, 0xd8, 0xd0, 0xc7, 0xd0, 0xc8, 0xbe, 0x8d, 0x85, 0x7b, 0xb3, 0xab, 0x9d, 0xd6, 0xce, 0xc0, 0xe3, 0xdd, 0xd1, 0xe2, 0xdc, 0xd0, 0xec, 0xe5, 0xd8, 0xf0, 0xe3, 0xd4, 0xe9, 0xcf, 0xb9, 0xdc, 0xc0, 0xa6, 0xd7, 0xae, 0x90, 0xcc, 0xa3, 0x85, 0xcd, 0xa4, 0x7f, 0xc8, 0x9a, 0x74, 0xbe, 0x8b, 0x62, 0xbf, 0x98, 0x7b, 0xda, 0xaf, 0x89, 0xb8, 0x9c, 0x80, 0xb5, 0x92, 0x72, 0xcb, 0xab, 0x8b, 0xc1, 0x9c, 0x75, 0xbb, 0x95, 0x75, 0xbb, 0x95, 0x72, 0xc1, 0x9b, 0x7a, 0xbf, 0x92, 0x69, 0xd1, 0xa3, 0x7d, 0xcc, 0x9b, 0x75, 0xd6, 0xa8, 0x7f, 0xdd, 0xb5, 0x90, 0xdf, 0xb2, 0x8a, 0xdc, 0xac, 0x81, 0xbf, 0x8c, 0x5f, 0xdd, 0xa9, 0x82, 0xdf, 0xb3, 0x84, 0xe1, 0xb4, 0x85, 0xd6, 0xa4, 0x76, 0xe8, 0xbb, 0x8c, 0xf1, 0xc4, 0x99, 0xdb, 0xab, 0x7c, 0xce, 0x9a, 0x6b, 0xda, 0xa6, 0x78, 0xd8, 0xa5, 0x77, 0xe4, 0xb2, 0x83, 0xdc, 0xaa, 0x7c, 0xde, 0xac, 0x7c, 0xdf, 0xac, 0x7a, 0xd3, 0x9d, 0x6d, 0xd9, 0xa3, 0x73, 0xdd, 0xa8, 0x73, 0xba, 0x8c, 0x65, 0xa0, 0x76, 0x53, 0x7b, 0x59, 0x45, 0x9e, 0x8a, 0x7b, 0xd7, 0xd3, 0xce, 0xe4, 0xe2, 0xdf, 0xe7, 0xe5, 0xe2, 0xe6, 0xe7, 0xe5, 0xf7, 0xf8, 0xf5, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf9, 0xf7, 0xf3, 0xf3, 0xf1, 0xf2, 0xf1, 0xef, 0xd0, 0xcf, 0xc8, 0xa9, 0xa5, 0x9d, 0x92, 0x85, 0x7a, 0x65, 0x54, 0x49, 0x59, 0x43, 0x35, 0x45, 0x2e, 0x23, 0x49, 0x33, 0x22, 0x2f, 0x1e, 0x13, 0x40, 0x2a, 0x19, 0x43, 0x2b, 0x18, 0x38, 0x1f, 0x0a, 0x4d, 0x33, 0x17, 0x49, 0x2d, 0x16, 0x5e, 0x41, 0x23, 0x69, 0x46, 0x25, 0x7d, 0x56, 0x32, 0xa6, 0x79, 0x50, 0xb3, 0x82, 0x56, 0xbe, 0x8b, 0x60, 0xb5, 0x87, 0x5e, 0xbc, 0x8a, 0x5d, 0xc7, 0x94, 0x67, 0xd1, 0x9e, 0x71, 0xce, 0x9b, 0x6e, 0xc8, 0x98, 0x6a, 0xdf, 0xb3, 0x89, 0xdb, 0xab, 0x7c, 0xe1, 0xb5, 0x89, 0xe8, 0xbb, 0x90, 0xe8, 0xbb, 0x90, 0xe4, 0xb7, 0x8a, 0xef, 0xc6, 0xa1, 0xe0, 0xb7, 0x93, 0xd2, 0xa8, 0x82, 0xcb, 0xa2, 0x7e, 0xbd, 0x95, 0x72, 0xac, 0x84, 0x62, 0xc3, 0x9f, 0x80, 0xb1, 0x91, 0x75, 0x8a, 0x66, 0x4c, 0xa9, 0x87, 0x64, 0x7f, 0x5d, 0x45, 0x8c, 0x74, 0x5d, 0x5c, 0x42, 0x2b, 0x94, 0x7a, 0x63, 0xa1, 0x87, 0x6f, 0xa0, 0x78, 0x55, 0xba, 0x92, 0x6e, 0xcd, 0xa3, 0x7f, 0xd2, 0xa5, 0x80, 0xe4, 0xbc, 0x99, 0xd8, 0xb4, 0x95, 0xe1, 0xc2, 0xa7, 0xe1, 0xc5, 0xad, 0xdd, 0xc1, 0xa8, 0xdf, 0xcc, 0xbc, 0xdc, 0xcd, 0xc0, 0xdd, 0xd3, 0xc9, 0xd9, 0xd1, 0xc8, 0xcf, 0xc4, 0xba, 0xaf, 0xa3, 0x93, 0x2f, 0x26, 0x1b, 0x65, 0x55, 0x46, 0xbf, 0xb3, 0x9f, 0xd2, 0xca, 0xc0, 0xe7, 0xdf, 0xd4, 0xe7, 0xde, 0xd2, 0xeb, 0xde, 0xcf, 0xe8, 0xd7, 0xc4, 0xeb, 0xd1, 0xb8, 0xe2, 0xc3, 0xa8, 0xe5, 0xc5, 0xa9, 0xdf, 0xb5, 0x90, 0xde, 0xb8, 0x97, 0xda, 0xae, 0x87, 0xd3, 0xac, 0x89, 0xc6, 0x9f, 0x76, 0xb6, 0x9b, 0x7c, 0xb4, 0x93, 0x75, 0xd2, 0xaf, 0x92, 0xbc, 0x90, 0x6a, 0xc3, 0x9f, 0x7f, 0xb5, 0x8c, 0x69, 0xcd, 0xa8, 0x88, 0xc4, 0x99, 0x74, 0xcf, 0xa0, 0x79, 0xd2, 0xa5, 0x7e, 0xce, 0xa1, 0x76, 0xdd, 0xb0, 0x86, 0xe1, 0xb4, 0x89, 0xdb, 0xae, 0x83, 0xd9, 0xa8, 0x7d, 0xd6, 0xa5, 0x7a, 0xe7, 0xbb, 0x8e, 0xe6, 0xba, 0x8d, 0xe0, 0xaf, 0x84, 0xe1, 0xb1, 0x81, 0xe4, 0xb6, 0x8d, 0xe8, 0xb6, 0x8a, 0xd8, 0xa6, 0x79, 0xd9, 0xa6, 0x79, 0xdd, 0xac, 0x80, 0xe6, 0xb5, 0x8a, 0xe0, 0xaf, 0x81, 0xda, 0xa7, 0x78, 0xe4, 0xb1, 0x80, 0xc0, 0x8d, 0x5b, 0xdb, 0xa7, 0x78, 0xd7, 0xa3, 0x72, 0xd2, 0xa3, 0x74, 0xa4, 0x81, 0x5b, 0x76, 0x5a, 0x44, 0x88, 0x6c, 0x5e, 0xc5, 0xbe, 0xb8, 0xea, 0xe9, 0xe7, 0xe7, 0xe5, 0xe4, 0xe8, 0xe8, 0xe6, 0xfc, 0xfc, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfa, 0xf6, 0xf6, 0xf4, 0xea, 0xe9, 0xe7, 0xc4, 0xc3, 0xbd, 0xb7, 0xb3, 0xaa, 0x80, 0x74, 0x69, 0x6b, 0x56, 0x48, 0x5a, 0x40, 0x30, 0x3c, 0x29, 0x1c, 0x27, 0x14, 0x0b, 0x2e, 0x1b, 0x10, 0x40, 0x2a, 0x17, 0x41, 0x28, 0x15, 0x42, 0x2a, 0x15, 0x48, 0x30, 0x16, 0x42, 0x29, 0x15, 0x4e, 0x34, 0x18, 0x66, 0x43, 0x22, 0x83, 0x5c, 0x38, 0xa1, 0x74, 0x4b, 0xb8, 0x87, 0x5c, 0xa8, 0x77, 0x4b, 0xaa, 0x7d, 0x54, 0xc5, 0x92, 0x65, 0xcf, 0x9d, 0x70, 0xd2, 0x9f, 0x72, 0xd5, 0xa2, 0x75, 0xd6, 0xa7, 0x79, 0xda, 0xad, 0x83, 0xe0, 0xb0, 0x81, 0xe7, 0xba, 0x90, 0xea, 0xbd, 0x92, 0xea, 0xbd, 0x92, 0xe9, 0xc2, 0x99, 0xe8, 0xbe, 0x98, 0xd7, 0xac, 0x87, 0xca, 0xa1, 0x7b, 0xbf, 0x96, 0x72, 0xb9, 0x91, 0x6f, 0xb5, 0x91, 0x71, 0xd3, 0xb1, 0x92, 0x9c, 0x76, 0x55, 0xb1, 0x8f, 0x6e, 0xa3, 0x80, 0x64, 0xab, 0x8c, 0x72, 0x80, 0x62, 0x49, 0xa0, 0x86, 0x6f, 0x72, 0x58, 0x41, 0x85, 0x69, 0x51, 0x97, 0x75, 0x59, 0xa6, 0x81, 0x5f, 0xb5, 0x88, 0x5e, 0xce, 0xa0, 0x7b, 0xc8, 0xa0, 0x7d, 0xc3, 0x97, 0x72, 0xc5, 0x9e, 0x7c, 0xd5, 0xb8, 0xa1, 0xd9, 0xbd, 0xa4, 0xe1, 0xcd, 0xbe, 0xdf, 0xcf, 0xc3, 0xd5, 0xcb, 0xc2, 0xcc, 0xc0, 0xb4, 0xa0, 0x90, 0x7e, 0x38, 0x2d, 0x25, 0x1e, 0x1a, 0x15, 0x1b, 0x16, 0x11, 0x69, 0x59, 0x47, 0xb7, 0xa5, 0x95, 0xd8, 0xcd, 0xc3, 0xe5, 0xdc, 0xd0, 0xea, 0xdd, 0xce, 0xeb, 0xda, 0xc6, 0xde, 0xc4, 0xab, 0xe4, 0xc7, 0xae, 0xde, 0xc0, 0xa5, 0xe4, 0xbe, 0x9e, 0xe3, 0xba, 0x98, 0xdd, 0xbe, 0xa0, 0xd1, 0xa4, 0x7c, 0xbf, 0x9b, 0x7b, 0xbd, 0xa0, 0x85, 0xcd, 0xad, 0x91, 0xd1, 0xb2, 0x96, 0xb5, 0x8d, 0x6b, 0xc1, 0x97, 0x74, 0xc9, 0xa4, 0x84, 0xb1, 0x88, 0x64, 0xc5, 0xa1, 0x82, 0xcc, 0xa3, 0x80, 0xcf, 0x9f, 0x77, 0xd5, 0xa8, 0x7e, 0xd1, 0xa4, 0x79, 0xe3, 0xb6, 0x8b, 0xdf, 0xb2, 0x87, 0xe0, 0xaf, 0x84, 0xd7, 0xa6, 0x7a, 0xd7, 0xab, 0x7e, 0xdf, 0xb3, 0x86, 0xea, 0xb9, 0x8f, 0xe3, 0xb3, 0x83, 0xea, 0xbd, 0x94, 0xdc, 0xab, 0x80, 0xda, 0xa7, 0x7a, 0xcb, 0x98, 0x6c, 0xd5, 0xa3, 0x77, 0xe9, 0xb8, 0x8c, 0xe3, 0xb2, 0x84, 0xd6, 0xa3, 0x74, 0xe2, 0xb0, 0x7e, 0xcb, 0x97, 0x65, 0xca, 0x96, 0x66, 0xd0, 0xa1, 0x72, 0xc0, 0x94, 0x6f, 0x9d, 0x7d, 0x5d, 0x74, 0x5b, 0x4d, 0x7e, 0x65, 0x5a, 0xb0, 0xa5, 0x9b, 0xe9, 0xe8, 0xe6, 0xf5, 0xf3, 0xf1, 0xeb, 0xeb, 0xe9, 0xfc, 0xfc, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xe9, 0xe8, 0xe6, 0xc8, 0xc3, 0xbe, 0xb1, 0xa9, 0x9d, 0x83, 0x74, 0x66, 0x65, 0x4e, 0x3b, 0x50, 0x3a, 0x26, 0x3f, 0x29, 0x1f, 0x22, 0x12, 0x05, 0x3c, 0x2c, 0x20, 0x40, 0x28, 0x15, 0x2f, 0x1a, 0x08, 0x47, 0x2b, 0x16, 0x4f, 0x32, 0x1a, 0x3a, 0x27, 0x0c, 0x4f, 0x32, 0x18, 0x5d, 0x3c, 0x1d, 0x78, 0x55, 0x35, 0x9a, 0x6e, 0x43, 0xa6, 0x78, 0x4f, 0x9f, 0x72, 0x47, 0xbd, 0x90, 0x65, 0xbd, 0x8d, 0x60, 0xbc, 0x8c, 0x5f, 0xc1, 0x90, 0x66, 0xcd, 0x9c, 0x6e, 0xda, 0xa9, 0x7d, 0xda, 0xa9, 0x7e, 0xe5, 0xb9, 0x8c, 0xe3, 0xb6, 0x89, 0xea, 0xba, 0x8f, 0xe5, 0xbc, 0x94, 0xef, 0xc6, 0x9c, 0xdf, 0xb3, 0x8d, 0xc9, 0xa0, 0x7b, 0xc7, 0x9f, 0x7a, 0xb9, 0x90, 0x6f, 0xb9, 0x92, 0x75, 0xcd, 0xaa, 0x8a, 0xb7, 0x8d, 0x6b, 0xa8, 0x8c, 0x66, 0xa5, 0x83, 0x62, 0xbc, 0x9f, 0x83, 0x80, 0x61, 0x45, 0xa9, 0x89, 0x6f, 0x71, 0x53, 0x38, 0x8c, 0x72, 0x5a, 0x7a, 0x64, 0x4e, 0x6b, 0x4f, 0x34, 0x75, 0x50, 0x34, 0x7b, 0x5d, 0x3e, 0x75, 0x4d, 0x31, 0x86, 0x57, 0x36, 0xb7, 0x88, 0x5e, 0xb9, 0x88, 0x65, 0xcd, 0xaa, 0x8a, 0xd4, 0xb8, 0x9e, 0xd8, 0xc5, 0xb7, 0xd9, 0xcc, 0xc2, 0xce, 0xbd, 0xb2, 0xa5, 0x91, 0x80, 0x54, 0x3f, 0x2c, 0x3a, 0x2b, 0x20, 0x40, 0x30, 0x25, 0x2e, 0x1f, 0x18, 0x32, 0x23, 0x19, 0x6a, 0x57, 0x42, 0xb7, 0xa2, 0x90, 0xca, 0xbe, 0xb1, 0xdf, 0xd6, 0xcb, 0xe3, 0xd0, 0xbd, 0xe1, 0xc7, 0xae, 0xd0, 0xa7, 0x85, 0xbe, 0x97, 0x77, 0xbe, 0x9c, 0x7d, 0x8d, 0x62, 0x43, 0xa0, 0x77, 0x52, 0xbe, 0x9b, 0x7b, 0xb0, 0x8e, 0x74, 0xc9, 0xaf, 0x95, 0xbc, 0xa2, 0x87, 0xd3, 0xb8, 0x94, 0xbb, 0x94, 0x74, 0xbe, 0x94, 0x70, 0xcc, 0xa5, 0x82, 0xc2, 0x98, 0x71, 0xbf, 0x98, 0x75, 0xc1, 0x9c, 0x7b, 0xc7, 0x9c, 0x75, 0xcc, 0xa1, 0x79, 0xd4, 0xa8, 0x81, 0xd2, 0xa5, 0x7a, 0xe6, 0xb9, 0x8f, 0xde, 0xb1, 0x84, 0xdd, 0xb1, 0x84, 0xe0, 0xae, 0x80, 0xd5, 0xa8, 0x7d, 0xe6, 0xb5, 0x8a, 0xe8, 0xb7, 0x8c, 0xe7, 0xbb, 0x8e, 0xe0, 0xb3, 0x86, 0xd0, 0x9c, 0x6c, 0xe0, 0xaa, 0x7a, 0xcf, 0x9f, 0x71, 0xe5, 0xb9, 0x8c, 0xe2, 0xb3, 0x86, 0xdb, 0xaa, 0x7d, 0xd7, 0xa6, 0x77, 0xc8, 0x96, 0x66, 0xc1, 0x8e, 0x63, 0xc2, 0x94, 0x6a, 0xd0, 0xa9, 0x8a, 0xa7, 0x91, 0x7b, 0x76, 0x5f, 0x49, 0x77, 0x5f, 0x4c, 0x8b, 0x7a, 0x6d, 0xdf, 0xdc, 0xd6, 0xf7, 0xf8, 0xf6, 0xf3, 0xf3, 0xf1, 0xfc, 0xfc, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xfa, 0xde, 0xdf, 0xdc, 0xc4, 0xc0, 0xba, 0x97, 0x89, 0x7f, 0x78, 0x66, 0x58, 0x70, 0x58, 0x47, 0x4e, 0x36, 0x29, 0x4a, 0x35, 0x27, 0x29, 0x17, 0x0d, 0x2d, 0x1e, 0x13, 0x4a, 0x32, 0x21, 0x2a, 0x17, 0x0b, 0x41, 0x28, 0x14, 0x50, 0x33, 0x19, 0x38, 0x23, 0x10, 0x4d, 0x30, 0x17, 0x5c, 0x3e, 0x24, 0x5f, 0x3f, 0x25, 0x8a, 0x64, 0x3c, 0x9b, 0x6c, 0x44, 0xae, 0x81, 0x56, 0xb1, 0x84, 0x59, 0xb0, 0x82, 0x59, 0xb1, 0x84, 0x5b, 0xc7, 0x96, 0x6d, 0xcf, 0x9f, 0x71, 0xd5, 0xa4, 0x79, 0xe2, 0xb1, 0x86, 0xd5, 0xa8, 0x7b, 0xe9, 0xbc, 0x8f, 0xee, 0xc4, 0x9c, 0xee, 0xc3, 0x9a, 0xde, 0xb3, 0x88, 0xdc, 0xb0, 0x8a, 0xc7, 0x9d, 0x79, 0xc0, 0x98, 0x73, 0xae, 0x87, 0x67, 0xcc, 0xa7, 0x87, 0xc2, 0x9d, 0x79, 0xae, 0x8a, 0x66, 0xb2, 0x8d, 0x6a, 0xb1, 0x8f, 0x6f, 0xb7, 0x9a, 0x7e, 0xb7, 0x98, 0x7d, 0xae, 0x8e, 0x73, 0x7a, 0x5c, 0x41, 0x70, 0x55, 0x3e, 0x5e, 0x43, 0x2c, 0x63, 0x4a, 0x31, 0x65, 0x4c, 0x38, 0x5e, 0x3c, 0x24, 0x63, 0x40, 0x26, 0x87, 0x5b, 0x3b, 0x99, 0x6d, 0x45, 0xad, 0x7e, 0x5e, 0xbf, 0x94, 0x70, 0xc8, 0xa4, 0x86, 0xcd, 0xb5, 0xa2, 0xc0, 0xb3, 0xa0, 0x99, 0x80, 0x6d, 0x67, 0x51, 0x3f, 0x6b, 0x5b, 0x4e, 0x5a, 0x4a, 0x3e, 0x77, 0x67, 0x5b, 0x73, 0x63, 0x57, 0x4f, 0x3f, 0x32, 0x5f, 0x4d, 0x3a, 0x6e, 0x57, 0x46, 0xad, 0x9a, 0x88, 0xd0, 0xc0, 0xb1, 0xe0, 0xcc, 0xb9, 0xdc, 0xbb, 0x9e, 0xcf, 0xa5, 0x84, 0xc3, 0x99, 0x78, 0xb9, 0x93, 0x75, 0x82, 0x61, 0x46, 0x8f, 0x6e, 0x54, 0x9c, 0x79, 0x5e, 0xa5, 0x91, 0x79, 0xc0, 0xa2, 0x89, 0xc7, 0xa5, 0x8b, 0xc6, 0xa6, 0x84, 0xc3, 0x9f, 0x7e, 0xb2, 0x89, 0x66, 0xc2, 0x98, 0x73, 0xd1, 0xab, 0x86, 0xaf, 0x85, 0x5e, 0xc4, 0x9f, 0x7d, 0xca, 0xa0, 0x7a, 0xcd, 0xa1, 0x7a, 0xca, 0x9e, 0x77, 0xd0, 0xa3, 0x78, 0xdd, 0xb0, 0x86, 0xee, 0xc1, 0x94, 0xe1, 0xb5, 0x88, 0xd6, 0xa3, 0x76, 0xdf, 0xb2, 0x87, 0xde, 0xad, 0x82, 0xe4, 0xb3, 0x88, 0xea, 0xbe, 0x91, 0xe3, 0xb6, 0x89, 0xca, 0x9a, 0x6c, 0xd6, 0xa5, 0x77, 0xd4, 0xa6, 0x79, 0xe6, 0xba, 0x8d, 0xe8, 0xb9, 0x8c, 0xe3, 0xb3, 0x85, 0xd2, 0xa2, 0x73, 0xc2, 0x93, 0x65, 0xb6, 0x86, 0x5d, 0xbe, 0x92, 0x6b, 0xce, 0xaa, 0x8e, 0xb0, 0x9d, 0x8c, 0x9e, 0x92, 0x85, 0x83, 0x6e, 0x5d, 0x8b, 0x7c, 0x71, 0xc6, 0xc3, 0xbd, 0xf5, 0xf4, 0xf2, 0xf5, 0xf5, 0xf3, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf7, 0xf7, 0xf7, 0xdb, 0xda, 0xd8, 0xc3, 0xbf, 0xb9, 0x98, 0x89, 0x80, 0x86, 0x73, 0x69, 0x6c, 0x56, 0x4a, 0x44, 0x30, 0x29, 0x4d, 0x37, 0x24, 0x33, 0x23, 0x1c, 0x27, 0x15, 0x09, 0x3b, 0x26, 0x18, 0x1b, 0x0d, 0x07, 0x45, 0x2d, 0x1a, 0x44, 0x2b, 0x14, 0x2b, 0x17, 0x0b, 0x48, 0x2f, 0x18, 0x53, 0x37, 0x1e, 0x3f, 0x26, 0x11, 0x7d, 0x5a, 0x36, 0xae, 0x7b, 0x51, 0x9d, 0x71, 0x48, 0xb0, 0x84, 0x5b, 0xae, 0x81, 0x58, 0xb5, 0x89, 0x5f, 0xbc, 0x8d, 0x62, 0xce, 0xa0, 0x73, 0xdb, 0xac, 0x81, 0xd5, 0xa6, 0x7b, 0xdc, 0xb1, 0x86, 0xe5, 0xbb, 0x90, 0xe4, 0xba, 0x92, 0xda, 0xad, 0x83, 0xe9, 0xbc, 0x91, 0xd0, 0xa4, 0x7e, 0xc2, 0x9c, 0x78, 0xc4, 0x9c, 0x77, 0xbe, 0x9b, 0x7c, 0xb2, 0x8d, 0x68, 0xc0, 0x9c, 0x73, 0xbf, 0x9f, 0x7a, 0xb6, 0x8e, 0x6c, 0xb7, 0x98, 0x79, 0xc5, 0xa9, 0x91, 0x96, 0x75, 0x5a, 0x70, 0x4f, 0x37, 0x7d, 0x5e, 0x45, 0x7b, 0x5e, 0x46, 0x68, 0x4b, 0x32, 0x72, 0x58, 0x41, 0x5b, 0x41, 0x2e, 0x3a, 0x24, 0x17, 0x53, 0x39, 0x25, 0x79, 0x53, 0x35, 0x90, 0x65, 0x43, 0xb4, 0x89, 0x68, 0xbd, 0x93, 0x70, 0xc1, 0xa1, 0x84, 0xbd, 0xa3, 0x8c, 0x99, 0x84, 0x6e, 0x6d, 0x56, 0x43, 0x7c, 0x67, 0x55, 0xae, 0x9b, 0x8b, 0x99, 0x8a, 0x7c, 0x9e, 0x8f, 0x81, 0x9d, 0x8d, 0x80, 0x8a, 0x7a, 0x6c, 0x8d, 0x7b, 0x6a, 0x6d, 0x57, 0x42, 0x84, 0x6a, 0x53, 0xbf, 0xa8, 0x93, 0xd6, 0xbf, 0xad, 0xd8, 0xb4, 0x92, 0xc2, 0x97, 0x75, 0xb3, 0x89, 0x68, 0x97, 0x73, 0x56, 0x7a, 0x61, 0x4b, 0x4b, 0x32, 0x23, 0x9b, 0x7f, 0x68, 0xa0, 0x86, 0x71, 0xb5, 0x96, 0x7b, 0xaf, 0x8c, 0x71, 0xbe, 0x9b, 0x7b, 0xc6, 0xa3, 0x82, 0xb0, 0x87, 0x65, 0xbf, 0x95, 0x6e, 0xd6, 0xb0, 0x8d, 0xbc, 0x92, 0x6c, 0xb4, 0x8c, 0x6a, 0xb2, 0x8a, 0x66, 0xd3, 0xa8, 0x82, 0xbe, 0x93, 0x6d, 0xcc, 0x9f, 0x74, 0xd2, 0xa5, 0x7a, 0xe1, 0xb4, 0x88, 0xeb, 0xbe, 0x92, 0xde, 0xae, 0x81, 0xe3, 0xb6, 0x8a, 0xe5, 0xb4, 0x89, 0xdd, 0xac, 0x80, 0xe5, 0xb8, 0x8b, 0xe9, 0xbc, 0x8f, 0xcf, 0xa1, 0x77, 0xcf, 0xa0, 0x74, 0xd9, 0xa9, 0x7f, 0xe0, 0xb0, 0x84, 0xe9, 0xbb, 0x8d, 0xe3, 0xb4, 0x87, 0xd5, 0xa6, 0x78, 0xbe, 0x92, 0x65, 0xa9, 0x80, 0x57, 0xa6, 0x7f, 0x5a, 0xba, 0x9d, 0x83, 0xb6, 0xa6, 0x98, 0xce, 0xca, 0xc3, 0x8e, 0x7d, 0x6c, 0x88, 0x77, 0x6f, 0xc2, 0xbc, 0xb5, 0xeb, 0xeb, 0xe8, 0xf8, 0xf8, 0xf7, 0xfc, 0xfc, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xec, 0xec, 0xec, 0xe3, 0xe3, 0xe1, 0xbd, 0xb9, 0xb3, 0x95, 0x8b, 0x80, 0x99, 0x8b, 0x82, 0x6b, 0x5b, 0x52, 0x45, 0x34, 0x2c, 0x46, 0x2e, 0x1b, 0x24, 0x15, 0x0e, 0x2a, 0x14, 0x08, 0x2e, 0x1b, 0x11, 0x26, 0x18, 0x0d, 0x33, 0x1b, 0x09, 0x3f, 0x27, 0x15, 0x2b, 0x19, 0x0c, 0x38, 0x21, 0x0d, 0x4f, 0x34, 0x1c, 0x27, 0x15, 0x02, 0x7a, 0x59, 0x37, 0xa2, 0x73, 0x49, 0x97, 0x6b, 0x44, 0xac, 0x80, 0x59, 0xad, 0x7f, 0x56, 0xb8, 0x8b, 0x61, 0xc4, 0x98, 0x6b, 0xc9, 0x9c, 0x71, 0xd6, 0xa9, 0x7e, 0xd1, 0xa3, 0x79, 0xe2, 0xb6, 0x8c, 0xe7, 0xba, 0x91, 0xdc, 0xaf, 0x84, 0xd4, 0xa7, 0x7c, 0xd4, 0xa5, 0x7b, 0xd1, 0xa5, 0x7f, 0xc1, 0x9b, 0x76, 0xc2, 0x9b, 0x77, 0xbd, 0x99, 0x79, 0xb2, 0x8d, 0x69, 0xc6, 0xa3, 0x7e, 0xb4, 0x91, 0x71, 0xb4, 0x95, 0x76, 0xc6, 0xab, 0x8e, 0xa7, 0x83, 0x67, 0x79, 0x57, 0x3c, 0x83, 0x60, 0x4a, 0x6e, 0x4e, 0x37, 0x77, 0x57, 0x40, 0x72, 0x56, 0x3d, 0x71, 0x55, 0x3d, 0x43, 0x29, 0x18, 0x3e, 0x28, 0x1b, 0x42, 0x2e, 0x22, 0x55, 0x37, 0x21, 0x7b, 0x56, 0x39, 0xa8, 0x83, 0x66, 0xa3, 0x7e, 0x5c, 0xa1, 0x81, 0x64, 0x8d, 0x71, 0x59, 0x8b, 0x74, 0x5f, 0xa3, 0x8e, 0x7b, 0xb8, 0xa5, 0x93, 0xbc, 0xad, 0x9e, 0xc7, 0xb8, 0xa9, 0xbe, 0xaf, 0xa0, 0xae, 0x9f, 0x92, 0xa2, 0x93, 0x86, 0xba, 0xaa, 0x9b, 0xba, 0xa7, 0x96, 0x9b, 0x7d, 0x63, 0x93, 0x75, 0x5b, 0xac, 0x8d, 0x74, 0xbf, 0x9a, 0x76, 0xbd, 0x95, 0x75, 0x9f, 0x7b, 0x5e, 0x83, 0x6d, 0x57, 0x44, 0x31, 0x21, 0x5f, 0x49, 0x3b, 0x8b, 0x71, 0x5b, 0x8f, 0x73, 0x5b, 0xaf, 0x90, 0x75, 0xc1, 0xa0, 0x85, 0xc3, 0xa0, 0x81, 0xc2, 0x9d, 0x7c, 0xba, 0x91, 0x70, 0xbb, 0x91, 0x6c, 0xd3, 0xaa, 0x86, 0xd4, 0xae, 0x8b, 0xb0, 0x84, 0x61, 0xbf, 0x98, 0x77, 0xd4, 0xaa, 0x84, 0xcd, 0xa3, 0x7d, 0xc4, 0x97, 0x6c, 0xcc, 0x9f, 0x74, 0xd2, 0xa5, 0x7a, 0xd3, 0xa6, 0x7b, 0xe4, 0xb7, 0x8a, 0xe0, 0xb4, 0x87, 0xe1, 0xb0, 0x84, 0xd5, 0xa4, 0x79, 0xd2, 0xa5, 0x78, 0xe8, 0xbc, 0x8f, 0xdb, 0xae, 0x85, 0xbe, 0x8e, 0x63, 0xd5, 0xa3, 0x7a, 0xdc, 0xab, 0x81, 0xe3, 0xb4, 0x86, 0xe5, 0xb8, 0x8b, 0xce, 0xa0, 0x71, 0xc0, 0x93, 0x64, 0x9e, 0x78, 0x50, 0x8e, 0x6b, 0x4b, 0x9d, 0x85, 0x6f, 0xbc, 0xab, 0x9f, 0xd5, 0xd2, 0xcb, 0xb0, 0xa6, 0x97, 0x80, 0x6f, 0x65, 0xb4, 0xab, 0xa4, 0xe4, 0xe5, 0xe0, 0xf9, 0xf9, 0xf9, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xed, 0xed, 0xed, 0xe3, 0xe3, 0xe1, 0xaf, 0xab, 0xa5, 0xb3, 0xae, 0xa2, 0xaf, 0xa4, 0x9a, 0x8a, 0x81, 0x76, 0x46, 0x32, 0x2b, 0x46, 0x2f, 0x1c, 0x22, 0x13, 0x0c, 0x2e, 0x18, 0x0c, 0x26, 0x14, 0x0a, 0x48, 0x2e, 0x1a, 0x36, 0x21, 0x10, 0x3a, 0x21, 0x0e, 0x2d, 0x1b, 0x0d, 0x33, 0x1d, 0x0b, 0x41, 0x2a, 0x15, 0x36, 0x25, 0x14, 0x6e, 0x4e, 0x34, 0x88, 0x64, 0x3c, 0x9e, 0x73, 0x4b, 0xb5, 0x89, 0x62, 0xa7, 0x79, 0x54, 0xba, 0x8c, 0x67, 0xbf, 0x92, 0x66, 0xd4, 0xa7, 0x7b, 0xcc, 0x9f, 0x74, 0xd2, 0xa5, 0x7a, 0xe0, 0xaf, 0x83, 0xdf, 0xae, 0x82, 0xd9, 0xac, 0x81, 0xd2, 0xa5, 0x7b, 0xd3, 0xa4, 0x7a, 0xd2, 0xa6, 0x80, 0xc5, 0x9b, 0x73, 0xc5, 0xa4, 0x83, 0xb7, 0x8e, 0x6c, 0xc3, 0x9d, 0x7c, 0xbc, 0x99, 0x7b, 0x9c, 0x77, 0x59, 0xd4, 0xb7, 0x9e, 0x9f, 0x7e, 0x5d, 0x81, 0x5e, 0x42, 0x9e, 0x7c, 0x61, 0x6e, 0x4b, 0x35, 0x64, 0x44, 0x2d, 0x6e, 0x4e, 0x37, 0x70, 0x54, 0x3b, 0x55, 0x39, 0x20, 0x55, 0x38, 0x23, 0x4f, 0x37, 0x26, 0x55, 0x41, 0x30, 0x4e, 0x37, 0x25, 0x5e, 0x46, 0x32, 0x8e, 0x75, 0x61, 0x6f, 0x57, 0x41, 0x7c, 0x62, 0x4c, 0x9f, 0x88, 0x73, 0xc6, 0xb3, 0xa1, 0xc5, 0xb5, 0xa3, 0xd5, 0xc6, 0xb7, 0xc7, 0xba, 0xad, 0xcc, 0xbc, 0xae, 0xd2, 0xc4, 0xb5, 0xb1, 0xa7, 0x99, 0xc6, 0xbc, 0xae, 0xb9, 0xa9, 0x9b, 0xc4, 0xbb, 0xb1, 0xc3, 0xac, 0x98, 0xb9, 0xa2, 0x8e, 0xa5, 0x8a, 0x74, 0x9a, 0x80, 0x66, 0xad, 0x8c, 0x72, 0x93, 0x77, 0x61, 0x90, 0x7d, 0x6a, 0x7c, 0x63, 0x4e, 0x9f, 0x84, 0x73, 0x94, 0x76, 0x5d, 0x86, 0x69, 0x50, 0xa2, 0x82, 0x67, 0xb0, 0x90, 0x75, 0xc0, 0x9b, 0x7d, 0xc8, 0xa3, 0x82, 0xbf, 0x97, 0x76, 0xb2, 0x88, 0x63, 0xd3, 0xaa, 0x86, 0xd0, 0xaa, 0x87, 0xcd, 0xa1, 0x7e, 0xd2, 0xac, 0x8b, 0xd9, 0xaf, 0x89, 0xd0, 0xa6, 0x80, 0xcb, 0x9e, 0x73, 0xda, 0xad, 0x82, 0xd8, 0xab, 0x81, 0xba, 0x8d, 0x62, 0xdb, 0xaf, 0x82, 0xe4, 0xb7, 0x8a, 0xd9, 0xa8, 0x7d, 0xe6, 0xb5, 0x8a, 0xe2, 0xb5, 0x88, 0xe2, 0xb6, 0x89, 0xde, 0xb0, 0x87, 0xcf, 0x9d, 0x73, 0xd4, 0xa2, 0x78, 0xd4, 0xa3, 0x79, 0xdc, 0xad, 0x7f, 0xdf, 0xb2, 0x85, 0xd6, 0xa8, 0x7b, 0xbe, 0x92, 0x68, 0x8a, 0x64, 0x42, 0x89, 0x69, 0x51, 0x89, 0x75, 0x66, 0xa9, 0x9b, 0x93, 0xcf, 0xcf, 0xcc, 0xd4, 0xd4, 0xcd, 0x99, 0x8f, 0x81, 0xa9, 0xa0, 0x99, 0xe4, 0xe4, 0xdf, 0xf9, 0xf9, 0xf9, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf3, 0xf4, 0xf2, 0xf5, 0xf5, 0xf3, 0xd9, 0xd8, 0xd6, 0xb7, 0xb3, 0xad, 0xb4, 0xb2, 0xad, 0x9f, 0x99, 0x91, 0x85, 0x78, 0x6f, 0x4e, 0x3b, 0x33, 0x48, 0x34, 0x25, 0x1e, 0x11, 0x0b, 0x2e, 0x1a, 0x0f, 0x2c, 0x1d, 0x15, 0x2f, 0x1d, 0x10, 0x3f, 0x28, 0x16, 0x37, 0x25, 0x14, 0x2e, 0x19, 0x06, 0x23, 0x16, 0x0b, 0x24, 0x13, 0x06, 0x47, 0x32, 0x18, 0x49, 0x2e, 0x14, 0x7c, 0x59, 0x38, 0xa3, 0x76, 0x4d, 0xad, 0x81, 0x57, 0xa4, 0x78, 0x55, 0xb7, 0x8c, 0x63, 0xc5, 0x98, 0x6d, 0xca, 0x9d, 0x72, 0xbe, 0x92, 0x6a, 0xd0, 0xa5, 0x79, 0xdd, 0xb2, 0x86, 0xe4, 0xb9, 0x8d, 0xdc, 0xb1, 0x89, 0xd4, 0xa8, 0x81, 0xcf, 0xa2, 0x77, 0xca, 0xa2, 0x79, 0xcd, 0xaa, 0x85, 0xca, 0xa6, 0x83, 0xc5, 0xa0, 0x7f, 0xc8, 0xa3, 0x7f, 0xba, 0x9c, 0x7e, 0xaf, 0x8e, 0x6d, 0xc4, 0xa2, 0x82, 0x99, 0x72, 0x54, 0x93, 0x70, 0x56, 0x73, 0x53, 0x38, 0x60, 0x40, 0x25, 0x79, 0x58, 0x41, 0x58, 0x38, 0x21, 0x69, 0x49, 0x2e, 0x64, 0x44, 0x29, 0x62, 0x48, 0x30, 0x5b, 0x40, 0x2d, 0x67, 0x50, 0x3d, 0x69, 0x4e, 0x38, 0x78, 0x5f, 0x4b, 0x91, 0x7b, 0x69, 0xa4, 0x8f, 0x7f, 0xb1, 0x9b, 0x8b, 0xcf, 0xc0, 0xb2, 0xd8, 0xc8, 0xb9, 0xd6, 0xc6, 0xb6, 0xd7, 0xca, 0xbc, 0xd1, 0xc6, 0xbb, 0xc2, 0xb4, 0xaa, 0xc0, 0xb2, 0xa9, 0xbe, 0xb4, 0xa9, 0xc8, 0xbd, 0xb3, 0xd1, 0xc7, 0xb9, 0xde, 0xd5, 0xc6, 0xe1, 0xd2, 0xc5, 0xdd, 0xcf, 0xc1, 0xd6, 0xc3, 0xb7, 0xcc, 0xba, 0xad, 0xba, 0xa5, 0x93, 0xb8, 0x9f, 0x8e, 0xa9, 0x91, 0x79, 0x9c, 0x83, 0x70, 0x84, 0x6c, 0x51, 0x8d, 0x6f, 0x57, 0x96, 0x75, 0x5a, 0xa3, 0x85, 0x6c, 0xb4, 0x92, 0x7a, 0xc2, 0xa3, 0x7f, 0xc6, 0x9f, 0x7b, 0xc0, 0x9e, 0x7f, 0xb3, 0x88, 0x66, 0xb9, 0x90, 0x6c, 0xda, 0xb6, 0x8f, 0xd1, 0xa9, 0x85, 0xc7, 0x9e, 0x7e, 0xd9, 0xae, 0x87, 0xc3, 0x97, 0x70, 0xd6, 0xa9, 0x7e, 0xcb, 0x9e, 0x73, 0xdd, 0xb2, 0x87, 0xc4, 0x99, 0x6d, 0xcb, 0x9a, 0x6f, 0xdc, 0xab, 0x80, 0xdf, 0xae, 0x83, 0xe1, 0xb0, 0x85, 0xe6, 0xb9, 0x8c, 0xdf, 0xb2, 0x84, 0xdf, 0xb1, 0x88, 0xcb, 0x9a, 0x6f, 0xd5, 0xa4, 0x77, 0xcd, 0x9c, 0x71, 0xd4, 0xa6, 0x79, 0xde, 0xb1, 0x84, 0xda, 0xad, 0x80, 0xc2, 0x95, 0x68, 0x7c, 0x5a, 0x3b, 0x6b, 0x4a, 0x30, 0x5b, 0x4b, 0x3f, 0x97, 0x8c, 0x83, 0xbb, 0xb8, 0xb6, 0xdf, 0xe0, 0xdd, 0xb5, 0xb6, 0xae, 0xad, 0xa6, 0xa0, 0xda, 0xd8, 0xd4, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfa, 0xf5, 0xf6, 0xf3, 0xd3, 0xd2, 0xd1, 0xbe, 0xb9, 0xb4, 0xb4, 0xb2, 0xae, 0x9d, 0x96, 0x8f, 0x73, 0x66, 0x5c, 0x52, 0x3f, 0x37, 0x3d, 0x28, 0x1a, 0x20, 0x13, 0x0d, 0x1e, 0x10, 0x09, 0x2e, 0x1d, 0x14, 0x31, 0x1e, 0x10, 0x37, 0x20, 0x0e, 0x36, 0x20, 0x10, 0x23, 0x13, 0x09, 0x23, 0x13, 0x0a, 0x1d, 0x0c, 0x04, 0x3a, 0x20, 0x0f, 0x40, 0x29, 0x17, 0x62, 0x43, 0x26, 0x9a, 0x72, 0x4a, 0xa9, 0x81, 0x5b, 0xa0, 0x74, 0x52, 0xb4, 0x88, 0x5f, 0xc3, 0x96, 0x6b, 0xca, 0x9d, 0x72, 0xbd, 0x92, 0x69, 0xca, 0x9f, 0x73, 0xd3, 0xa9, 0x7d, 0xd6, 0xac, 0x80, 0xcc, 0xa1, 0x79, 0xdc, 0xb0, 0x89, 0xba, 0x8c, 0x65, 0xd1, 0xa8, 0x84, 0xd9, 0xb8, 0x95, 0xcd, 0xa8, 0x87, 0xb4, 0x8c, 0x6a, 0xd0, 0xaf, 0x8f, 0xa9, 0x86, 0x66, 0xae, 0x8a, 0x6a, 0xaf, 0x89, 0x6a, 0x99, 0x72, 0x54, 0x7e, 0x5a, 0x41, 0x70, 0x51, 0x35, 0x71, 0x51, 0x36, 0x69, 0x49, 0x32, 0x6e, 0x4e, 0x37, 0x5d, 0x3d, 0x22, 0x63, 0x44, 0x28, 0x69, 0x4f, 0x37, 0x75, 0x5a, 0x48, 0x7b, 0x5c, 0x44, 0x8b, 0x70, 0x5a, 0x9f, 0x89, 0x78, 0xbc, 0xab, 0x9d, 0xc7, 0xbc, 0xb1, 0xdb, 0xd0, 0xc5, 0xdb, 0xcf, 0xc4, 0xd0, 0xc0, 0xb1, 0xdd, 0xcc, 0xbc, 0xdd, 0xd0, 0xc2, 0xdc, 0xd0, 0xc6, 0xd8, 0xc9, 0xc0, 0xc6, 0xb8, 0xaf, 0xc6, 0xbc, 0xb2, 0xc7, 0xbd, 0xb2, 0xcf, 0xc0, 0xb3, 0xde, 0xcf, 0xc2, 0xd8, 0xca, 0xbd, 0xe0, 0xd2, 0xc4, 0xe5, 0xdb, 0xd1, 0xe2, 0xd8, 0xce, 0xd6, 0xca, 0xbe, 0xd7, 0xc6, 0xbb, 0xb9, 0xa0, 0x8b, 0xa2, 0x8a, 0x73, 0x99, 0x81, 0x65, 0xb4, 0x96, 0x7e, 0xab, 0x86, 0x68, 0x8c, 0x6b, 0x51, 0xb6, 0x98, 0x7d, 0xbc, 0x97, 0x76, 0xc5, 0xa0, 0x7b, 0xc6, 0xa4, 0x86, 0xbb, 0x8f, 0x6d, 0xb3, 0x8a, 0x66, 0xdd, 0xb9, 0x92, 0xd8, 0xb0, 0x8c, 0xdb, 0xb2, 0x92, 0xd6, 0xaa, 0x83, 0xcc, 0xa0, 0x79, 0xd4, 0xa7, 0x7c, 0xd6, 0xa8, 0x7e, 0xd6, 0xab, 0x7f, 0xd9, 0xae, 0x83, 0xc8, 0x97, 0x6b, 0xd6, 0xa5, 0x7a, 0xdc, 0xab, 0x80, 0xde, 0xad, 0x82, 0xe8, 0xbf, 0x96, 0xe8, 0xbe, 0x95, 0xe3, 0xb6, 0x8e, 0xcc, 0x9a, 0x6f, 0xd3, 0xa2, 0x75, 0xd1, 0xa0, 0x74, 0xd4, 0xa5, 0x79, 0xde, 0xb1, 0x84, 0xd5, 0xa8, 0x7b, 0xb8, 0x8b, 0x61, 0x8d, 0x6b, 0x51, 0x81, 0x62, 0x49, 0x5c, 0x47, 0x36, 0x8b, 0x7c, 0x70, 0xb4, 0xad, 0xa8, 0xe9, 0xea, 0xe8, 0xd6, 0xd8, 0xd0, 0xb6, 0xaf, 0xa8, 0xe7, 0xe5, 0xe0, 0xf7, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xfa, 0xfa, 0xf8, 0xf9, 0xf7, 0xea, 0xeb, 0xe9, 0xc7, 0xc6, 0xc2, 0xc7, 0xc6, 0xc2, 0xba, 0xb6, 0xb0, 0x95, 0x8d, 0x84, 0x6d, 0x5c, 0x54, 0x49, 0x39, 0x30, 0x33, 0x21, 0x15, 0x25, 0x15, 0x0a, 0x26, 0x18, 0x0c, 0x29, 0x19, 0x0d, 0x25, 0x17, 0x0d, 0x30, 0x1c, 0x0d, 0x37, 0x20, 0x14, 0x1a, 0x0e, 0x06, 0x2b, 0x18, 0x0a, 0x19, 0x0a, 0x02, 0x31, 0x1c, 0x10, 0x2e, 0x1b, 0x09, 0x4a, 0x31, 0x21, 0x88, 0x64, 0x43, 0x9a, 0x74, 0x4d, 0x9b, 0x73, 0x50, 0xac, 0x80, 0x5a, 0xbf, 0x91, 0x6b, 0xb8, 0x8a, 0x63, 0xb7, 0x8c, 0x64, 0xc2, 0x97, 0x6e, 0xc8, 0x9c, 0x75, 0xd1, 0xa6, 0x7e, 0xd7, 0xa9, 0x85, 0xcd, 0x9f, 0x7a, 0xc6, 0x99, 0x74, 0xd9, 0xb7, 0x95, 0xc7, 0xa1, 0x7c, 0xca, 0xa1, 0x7b, 0xc5, 0xa0, 0x7c, 0xcc, 0xa9, 0x89, 0xaf, 0x86, 0x69, 0xb0, 0x8c, 0x6d, 0xaf, 0x82, 0x62, 0x85, 0x5d, 0x3d, 0x81, 0x5a, 0x3d, 0x63, 0x42, 0x27, 0x66, 0x44, 0x2a, 0x64, 0x43, 0x28, 0x6d, 0x4b, 0x30, 0x61, 0x40, 0x25, 0x68, 0x4b, 0x32, 0x64, 0x47, 0x30, 0x91, 0x7b, 0x6a, 0xb2, 0xa0, 0x93, 0xc7, 0xb6, 0xa8, 0xd0, 0xc1, 0xb6, 0xcc, 0xbe, 0xb5, 0xd8, 0xcd, 0xc3, 0xd9, 0xce, 0xc4, 0xe3, 0xd7, 0xcd, 0xd9, 0xc9, 0xbc, 0xd0, 0xbd, 0xad, 0xd4, 0xc4, 0xb7, 0xdd, 0xd1, 0xc7, 0xd1, 0xc7, 0xbd, 0xcd, 0xc2, 0xb8, 0xd0, 0xc1, 0xb8, 0xd4, 0xc6, 0xbd, 0xe4, 0xd8, 0xce, 0xda, 0xce, 0xc4, 0xdf, 0xd2, 0xc9, 0xe6, 0xdd, 0xd2, 0xe8, 0xdf, 0xd6, 0xe4, 0xdb, 0xd2, 0xe5, 0xdb, 0xd0, 0xe3, 0xd9, 0xce, 0xd4, 0xc3, 0xb3, 0xaa, 0x92, 0x7c, 0x94, 0x78, 0x5f, 0xbb, 0x9b, 0x80, 0xa6, 0x82, 0x64, 0x9e, 0x79, 0x5c, 0xa9, 0x85, 0x68, 0xb4, 0x8f, 0x6e, 0xd2, 0xab, 0x87, 0xce, 0xa7, 0x85, 0xb8, 0x92, 0x71, 0xc1, 0x9b, 0x76, 0xd7, 0xb0, 0x8b, 0xd5, 0xad, 0x89, 0xc0, 0x98, 0x73, 0xdb, 0xb2, 0x8c, 0xbd, 0x93, 0x6d, 0xcf, 0xa3, 0x7c, 0xcb, 0x9f, 0x78, 0xd5, 0xab, 0x7f, 0xdc, 0xb1, 0x85, 0xdf, 0xae, 0x83, 0xc7, 0x96, 0x6b, 0xd8, 0xa7, 0x7b, 0xdf, 0xae, 0x83, 0xdd, 0xb1, 0x86, 0xe4, 0xb9, 0x8d, 0xe8, 0xbd, 0x90, 0xc4, 0x96, 0x69, 0xd6, 0xa6, 0x77, 0xd5, 0xa4, 0x77, 0xd6, 0xa8, 0x7b, 0xd9, 0xaf, 0x81, 0xcd, 0xa2, 0x78, 0x9e, 0x75, 0x53, 0x9a, 0x7a, 0x5c, 0x7a, 0x5b, 0x42, 0x6e, 0x5a, 0x4f, 0x82, 0x6f, 0x61, 0xb3, 0xae, 0xab, 0xe1, 0xe1, 0xdf, 0xe6, 0xe6, 0xe3, 0xc6, 0xc3, 0xbe, 0xe3, 0xe0, 0xdd, 0xf4, 0xf4, 0xf2, 0xfd, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfb, 0xe5, 0xe5, 0xe3, 0xd3, 0xd1, 0xce, 0xbf, 0xbe, 0xba, 0xaf, 0xab, 0xa5, 0x96, 0x8d, 0x83, 0x60, 0x4f, 0x47, 0x42, 0x31, 0x29, 0x36, 0x24, 0x18, 0x20, 0x0e, 0x02, 0x25, 0x14, 0x0b, 0x25, 0x15, 0x0c, 0x21, 0x13, 0x0b, 0x32, 0x1e, 0x10, 0x36, 0x20, 0x13, 0x1d, 0x10, 0x09, 0x23, 0x13, 0x08, 0x11, 0x06, 0x01, 0x31, 0x1d, 0x12, 0x3a, 0x29, 0x16, 0x33, 0x1b, 0x0b, 0x8c, 0x6b, 0x4c, 0x91, 0x6d, 0x47, 0x99, 0x71, 0x4f, 0xa4, 0x78, 0x52, 0xbf, 0x91, 0x6b, 0xb2, 0x84, 0x5e, 0xb7, 0x8b, 0x64, 0xc3, 0x97, 0x70, 0xcf, 0xa4, 0x7d, 0xd0, 0xa4, 0x7d, 0xbe, 0x95, 0x6f, 0xc6, 0x9d, 0x77, 0xde, 0xbc, 0x95, 0xcf, 0xa6, 0x83, 0xc8, 0x9d, 0x78, 0xce, 0xa4, 0x7e, 0xc8, 0xa2, 0x7d, 0xcf, 0xa8, 0x86, 0xb4, 0x8c, 0x6b, 0xb5, 0x8e, 0x6d, 0xa7, 0x7d, 0x58, 0x93, 0x6b, 0x4b, 0x91, 0x68, 0x4c, 0x7d, 0x5b, 0x40, 0x58, 0x36, 0x1c, 0x6b, 0x4a, 0x2f, 0x6b, 0x49, 0x2f, 0x69, 0x48, 0x2c, 0x5a, 0x3e, 0x24, 0x7f, 0x60, 0x49, 0xb1, 0x9d, 0x8d, 0xc0, 0xb0, 0xa3, 0xcc, 0xbc, 0xb0, 0xd3, 0xc5, 0xbc, 0xdd, 0xcf, 0xc6, 0xd9, 0xce, 0xc4, 0xd8, 0xce, 0xc3, 0xdf, 0xd4, 0xca, 0xdb, 0xcb, 0xbe, 0xd3, 0xc2, 0xb5, 0xd3, 0xc5, 0xba, 0xdd, 0xd1, 0xc8, 0xd4, 0xc6, 0xbd, 0xc9, 0xbb, 0xb2, 0xd2, 0xc3, 0xba, 0xd0, 0xc2, 0xb8, 0xde, 0xd2, 0xc8, 0xe0, 0xd9, 0xcd, 0xe5, 0xd8, 0xce, 0xe7, 0xde, 0xd3, 0xe8, 0xdf, 0xd6, 0xe5, 0xdc, 0xd3, 0xda, 0xcf, 0xc5, 0xe1, 0xd7, 0xcc, 0xe1, 0xd6, 0xc9, 0xcd, 0xb9, 0xa5, 0xb7, 0x9b, 0x82, 0xa7, 0x86, 0x6c, 0xa9, 0x84, 0x67, 0x9c, 0x77, 0x5a, 0xa0, 0x7a, 0x5d, 0xb1, 0x8c, 0x6b, 0xc1, 0x9a, 0x76, 0xc9, 0xa0, 0x7e, 0xb6, 0x8f, 0x6e, 0xc4, 0x9a, 0x76, 0xd0, 0xa6, 0x83, 0xcc, 0xa4, 0x80, 0xce, 0xa6, 0x82, 0xd4, 0xaa, 0x84, 0xd3, 0xa9, 0x83, 0xd3, 0xa8, 0x80, 0xcf, 0xa4, 0x7d, 0xdb, 0xb0, 0x84, 0xd2, 0xa7, 0x7c, 0xd5, 0xa4, 0x78, 0xc9, 0x98, 0x6c, 0xc9, 0x98, 0x6c, 0xdb, 0xaa, 0x7f, 0xd7, 0xaa, 0x7d, 0xd9, 0xac, 0x7f, 0xd8, 0xae, 0x80, 0xcb, 0x9d, 0x71, 0xda, 0xaa, 0x7a, 0xc7, 0x96, 0x69, 0xd7, 0xa9, 0x7d, 0xd6, 0xab, 0x7e, 0xc3, 0x99, 0x6f, 0x94, 0x70, 0x51, 0x7d, 0x61, 0x47, 0x87, 0x67, 0x4e, 0x5a, 0x48, 0x3e, 0x68, 0x57, 0x4a, 0xb4, 0xac, 0xa6, 0xe5, 0xe5, 0xe3, 0xeb, 0xeb, 0xe9, 0xdf, 0xe0, 0xdc, 0xdc, 0xdd, 0xd9, 0xf4, 0xf4, 0xf2, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xf0, 0xf0, 0xee, 0xee, 0xef, 0xed, 0xc6, 0xc4, 0xc1, 0xc3, 0xc1, 0xbe, 0xbd, 0xb8, 0xb2, 0x82, 0x79, 0x6f, 0x58, 0x48, 0x3f, 0x36, 0x25, 0x1d, 0x34, 0x22, 0x18, 0x2a, 0x19, 0x0f, 0x20, 0x11, 0x0a, 0x22, 0x14, 0x0d, 0x1b, 0x0e, 0x08, 0x38, 0x25, 0x13, 0x35, 0x1f, 0x0f, 0x24, 0x16, 0x0b, 0x17, 0x0a, 0x06, 0x12, 0x06, 0x00, 0x25, 0x17, 0x0c, 0x2d, 0x1b, 0x0f, 0x3c, 0x23, 0x10, 0x61, 0x47, 0x2f, 0x8a, 0x69, 0x44, 0x95, 0x6f, 0x4c, 0xa4, 0x79, 0x55, 0xac, 0x80, 0x5a, 0xb3, 0x88, 0x61, 0xb7, 0x8d, 0x66, 0xca, 0x9f, 0x79, 0xcd, 0xa2, 0x7c, 0xc3, 0x98, 0x72, 0xcc, 0xa6, 0x80, 0xd1, 0xac, 0x83, 0xd9, 0xb1, 0x8b, 0xcf, 0xa6, 0x7e, 0xbf, 0x95, 0x6e, 0xcb, 0xa2, 0x7c, 0xc5, 0x9c, 0x77, 0xca, 0xa0, 0x7c, 0xb7, 0x8e, 0x6a, 0xa8, 0x7e, 0x59, 0xb6, 0x8d, 0x67, 0x9a, 0x72, 0x50, 0x90, 0x67, 0x49, 0x76, 0x54, 0x39, 0x67, 0x45, 0x2b, 0x69, 0x47, 0x2d, 0x70, 0x4e, 0x34, 0x63, 0x43, 0x27, 0x61, 0x43, 0x28, 0x73, 0x56, 0x40, 0xa7, 0x94, 0x85, 0xc4, 0xb5, 0xa8, 0xd4, 0xc4, 0xb6, 0xd8, 0xcc, 0xc3, 0xda, 0xce, 0xc4, 0xd6, 0xc9, 0xbf, 0xd4, 0xc7, 0xbe, 0xdb, 0xcb, 0xc3, 0xd2, 0xc2, 0xb7, 0xd8, 0xcc, 0xc1, 0xdb, 0xd2, 0xc8, 0xda, 0xcf, 0xc5, 0xd3, 0xc5, 0xbc, 0xce, 0xc0, 0xb6, 0xcb, 0xbd, 0xb3, 0xd1, 0xc4, 0xbc, 0xd3, 0xc3, 0xba, 0xdd, 0xd7, 0xcb, 0xdb, 0xcf, 0xc5, 0xe0, 0xd7, 0xcc, 0xe6, 0xde, 0xd5, 0xe6, 0xdd, 0xd4, 0xe5, 0xdb, 0xd0, 0xda, 0xcf, 0xc5, 0xd7, 0xcd, 0xc0, 0xc9, 0xb6, 0xa8, 0xc1, 0xa7, 0x8c, 0x88, 0x6a, 0x4f, 0xa8, 0x81, 0x62, 0x9c, 0x75, 0x56, 0x9d, 0x76, 0x57, 0xb5, 0x8e, 0x6d, 0xc0, 0x99, 0x75, 0xc6, 0x9f, 0x7d, 0xc4, 0x9d, 0x7a, 0xc2, 0x97, 0x72, 0xcd, 0xa3, 0x7e, 0xda, 0xb1, 0x8b, 0xe9, 0xc0, 0x9b, 0xc8, 0x9f, 0x79, 0xd0, 0xa6, 0x7e, 0xce, 0xa3, 0x7c, 0xca, 0x9d, 0x76, 0xdb, 0xaf, 0x86, 0xd7, 0xab, 0x82, 0xd1, 0xa2, 0x77, 0xd7, 0xa8, 0x7d, 0xc5, 0x97, 0x6b, 0xd3, 0xa4, 0x78, 0xdc, 0xaf, 0x83, 0xe5, 0xb8, 0x8c, 0xe2, 0xb8, 0x8b, 0xd5, 0xa9, 0x7d, 0xd6, 0xa7, 0x78, 0xca, 0x99, 0x6b, 0xcc, 0x9e, 0x71, 0xcf, 0xa5, 0x78, 0xb9, 0x92, 0x6a, 0x8e, 0x6d, 0x4f, 0x74, 0x5c, 0x49, 0x6b, 0x4d, 0x38, 0x5e, 0x4a, 0x3b, 0x70, 0x61, 0x55, 0x8c, 0x80, 0x76, 0xd2, 0xd0, 0xcc, 0xf4, 0xf4, 0xf2, 0xe9, 0xeb, 0xe8, 0xe8, 0xea, 0xe6, 0xf4, 0xf4, 0xf2, 0xfa, 0xfb, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf6, 0xf6, 0xf6, 0xf4, 0xf4, 0xf2, 0xe6, 0xe6, 0xe4, 0xc4, 0xc3, 0xbf, 0xc7, 0xc6, 0xc2, 0xa8, 0xa1, 0x9d, 0x76, 0x6b, 0x62, 0x50, 0x40, 0x37, 0x32, 0x22, 0x19, 0x2f, 0x1e, 0x16, 0x31, 0x21, 0x18, 0x1e, 0x11, 0x09, 0x21, 0x15, 0x0d, 0x20, 0x11, 0x0c, 0x3d, 0x29, 0x15, 0x2d, 0x17, 0x0a, 0x2d, 0x1e, 0x11, 0x15, 0x0a, 0x05, 0x1c, 0x0d, 0x04, 0x19, 0x0b, 0x04, 0x15, 0x05, 0x00, 0x3d, 0x26, 0x14, 0x39, 0x24, 0x11, 0x7c, 0x5b, 0x39, 0x93, 0x6e, 0x4a, 0x92, 0x68, 0x46, 0xb1, 0x87, 0x61, 0xa9, 0x7f, 0x59, 0xb2, 0x88, 0x62, 0xba, 0x90, 0x6a, 0xcb, 0xa1, 0x7b, 0xb5, 0x8b, 0x65, 0xd9, 0xb0, 0x8d, 0xc8, 0xa0, 0x77, 0xc8, 0x9f, 0x78, 0xd4, 0xaa, 0x85, 0xc7, 0x9d, 0x77, 0xc8, 0x9e, 0x78, 0xca, 0xa0, 0x7b, 0xc0, 0x96, 0x72, 0xbd, 0x95, 0x70, 0xab, 0x83, 0x5d, 0xb7, 0x8b, 0x67, 0x8f, 0x6a, 0x47, 0x8e, 0x68, 0x46, 0x76, 0x54, 0x39, 0x67, 0x45, 0x2b, 0x70, 0x4f, 0x34, 0x77, 0x55, 0x3a, 0x5d, 0x3d, 0x22, 0x57, 0x38, 0x1c, 0x71, 0x56, 0x40, 0x9c, 0x8a, 0x7b, 0xba, 0xaa, 0x9a, 0xb6, 0xa7, 0x98, 0xdd, 0xd2, 0xc8, 0xd9, 0xce, 0xc3, 0xd4, 0xc5, 0xbc, 0xdc, 0xcd, 0xc4, 0xd3, 0xc1, 0xb9, 0xdc, 0xcd, 0xc4, 0xd9, 0xd1, 0xc7, 0xde, 0xd5, 0xcb, 0xd8, 0xca, 0xbd, 0xd8, 0xca, 0xbe, 0xce, 0xc0, 0xb4, 0xcf, 0xc1, 0xb6, 0xda, 0xcf, 0xc7, 0xd4, 0xc4, 0xbb, 0xdc, 0xd1, 0xc6, 0xda, 0xcf, 0xc4, 0xdd, 0xd1, 0xc7, 0xe2, 0xd9, 0xd0, 0xe3, 0xdb, 0xd2, 0xe4, 0xda, 0xd0, 0xd7, 0xcd, 0xc2, 0xdb, 0xcc, 0xbf, 0xc4, 0xb2, 0xa5, 0x92, 0x79, 0x5f, 0x7d, 0x5f, 0x49, 0xa7, 0x82, 0x60, 0xa8, 0x82, 0x60, 0xa3, 0x7c, 0x5a, 0xb8, 0x8f, 0x6d, 0xb9, 0x93, 0x70, 0xcb, 0xa7, 0x83, 0xc7, 0xa0, 0x7c, 0xbd, 0x93, 0x6d, 0xc4, 0x9a, 0x74, 0xdc, 0xb3, 0x8d, 0xe7, 0xbd, 0x97, 0xca, 0xa0, 0x7c, 0xd1, 0xa8, 0x7f, 0xd7, 0xae, 0x85, 0xd0, 0xa0, 0x7a, 0xd9, 0xae, 0x86, 0xd4, 0xa9, 0x81, 0xd3, 0xa6, 0x7b, 0xce, 0xa1, 0x76, 0xd3, 0xa6, 0x79, 0xd5, 0xa9, 0x7c, 0xde, 0xb1, 0x86, 0xdd, 0xb0, 0x85, 0xe1, 0xb6, 0x8b, 0xd1, 0xa6, 0x7a, 0xd1, 0xa4, 0x77, 0xcc, 0x9e, 0x70, 0xcf, 0xa2, 0x74, 0xba, 0x91, 0x66, 0xb2, 0x8e, 0x69, 0x8d, 0x6d, 0x4f, 0x65, 0x51, 0x42, 0x5e, 0x46, 0x35, 0x67, 0x4e, 0x3c, 0x66, 0x58, 0x4d, 0x8f, 0x85, 0x7d, 0xcf, 0xcb, 0xc6, 0xf0, 0xf0, 0xee, 0xee, 0xee, 0xec, 0xf0, 0xf0, 0xee, 0xfa, 0xfb, 0xf9, 0xfa, 0xfa, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfa, 0xfa, 0xfa, 0xf8, 0xf8, 0xf6, 0xdc, 0xdc, 0xda, 0xc0, 0xbe, 0xbb, 0xbb, 0xba, 0xb6, 0x98, 0x91, 0x8d, 0x73, 0x68, 0x5f, 0x4a, 0x3a, 0x31, 0x3a, 0x29, 0x21, 0x2d, 0x1d, 0x14, 0x26, 0x15, 0x0d, 0x1e, 0x0d, 0x06, 0x2f, 0x1e, 0x18, 0x2c, 0x17, 0x0f, 0x39, 0x26, 0x13, 0x26, 0x15, 0x0c, 0x1d, 0x12, 0x09, 0x17, 0x0c, 0x0a, 0x0f, 0x05, 0x01, 0x27, 0x15, 0x06, 0x1b, 0x0b, 0x09, 0x23, 0x16, 0x0b, 0x38, 0x22, 0x15, 0x6d, 0x4c, 0x2d, 0x93, 0x6d, 0x4a, 0x92, 0x67, 0x46, 0xac, 0x83, 0x5d, 0xa5, 0x7b, 0x55, 0xad, 0x83, 0x5d, 0xc4, 0x9a, 0x74, 0xcf, 0xa5, 0x7f, 0xb7, 0x8d, 0x67, 0xca, 0x9e, 0x7d, 0xcf, 0xa3, 0x7c, 0xc0, 0x96, 0x70, 0xc7, 0x9d, 0x77, 0xce, 0xa4, 0x7e, 0xc3, 0x99, 0x73, 0xc4, 0x9a, 0x75, 0xb3, 0x89, 0x65, 0xc7, 0x9e, 0x79, 0xb6, 0x8d, 0x67, 0xab, 0x7f, 0x5c, 0x7c, 0x59, 0x3b, 0x7f, 0x5c, 0x3e, 0x76, 0x54, 0x39, 0x68, 0x46, 0x2b, 0x77, 0x55, 0x3b, 0x6e, 0x4c, 0x32, 0x62, 0x43, 0x27, 0x53, 0x33, 0x18, 0x62, 0x42, 0x28, 0x8f, 0x77, 0x64, 0x90, 0x7b, 0x67, 0xc6, 0xba, 0xaf, 0xd6, 0xc5, 0xbd, 0xcd, 0xbc, 0xb4, 0xde, 0xcf, 0xc6, 0xdc, 0xce, 0xc5, 0xdd, 0xce, 0xc5, 0xd9, 0xcf, 0xc4, 0xdd, 0xd5, 0xcb, 0xd9, 0xcc, 0xc3, 0xc6, 0xb5, 0xa8, 0xd4, 0xc2, 0xb4, 0xce, 0xbd, 0xaf, 0xd5, 0xc7, 0xbc, 0xd8, 0xcd, 0xc5, 0xda, 0xca, 0xc1, 0xdd, 0xd1, 0xc7, 0xd8, 0xc7, 0xbf, 0xd3, 0xc2, 0xba, 0xdc, 0xd4, 0xca, 0xe0, 0xd8, 0xcf, 0xd9, 0xcf, 0xc4, 0xdb, 0xd1, 0xc6, 0xc4, 0xb0, 0xa4, 0xc1, 0xb3, 0xa5, 0x8c, 0x72, 0x5d, 0x75, 0x56, 0x45, 0xa3, 0x80, 0x63, 0x8f, 0x6c, 0x4e, 0x9e, 0x77, 0x56, 0xae, 0x85, 0x63, 0xa9, 0x83, 0x60, 0xbc, 0x98, 0x74, 0xd2, 0xab, 0x87, 0xca, 0xa0, 0x7a, 0xc5, 0x9b, 0x76, 0xd3, 0xa9, 0x83, 0xde, 0xb4, 0x8e, 0xe6, 0xbc, 0x98, 0xd8, 0xaf, 0x85, 0xd6, 0xad, 0x85, 0xd1, 0xa2, 0x7c, 0xdc, 0xb0, 0x89, 0xda, 0xae, 0x87, 0xd7, 0xaa, 0x7f, 0xce, 0xa1, 0x76, 0xd7, 0xaa, 0x7d, 0xc5, 0x98, 0x6b, 0xcf, 0xa2, 0x77, 0xd7, 0xaa, 0x7f, 0xe3, 0xb8, 0x8c, 0xd7, 0xac, 0x81, 0xc7, 0x9c, 0x72, 0xbd, 0x92, 0x68, 0xcb, 0x9e, 0x75, 0xb5, 0x8c, 0x66, 0xa0, 0x7c, 0x5a, 0x8b, 0x6b, 0x4d, 0x65, 0x52, 0x45, 0x63, 0x53, 0x40, 0x61, 0x45, 0x39, 0x49, 0x3e, 0x36, 0x82, 0x7c, 0x77, 0xc4, 0xc1, 0xbb, 0xf3, 0xf3, 0xf1, 0xf2, 0xf2, 0xf0, 0xee, 0xee, 0xec, 0xfc, 0xfc, 0xfa, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xf7, 0xf7, 0xf7, 0xde, 0xde, 0xdc, 0xda, 0xda, 0xd8, 0xd6, 0xd5, 0xd1, 0xc8, 0xc6, 0xc3, 0x83, 0x79, 0x73, 0x6c, 0x5f, 0x55, 0x4f, 0x3d, 0x31, 0x3e, 0x2c, 0x20, 0x2c, 0x1b, 0x13, 0x26, 0x15, 0x0d, 0x1e, 0x11, 0x09, 0x2f, 0x1b, 0x10, 0x3c, 0x28, 0x1c, 0x2e, 0x1c, 0x10, 0x1e, 0x0f, 0x09, 0x1c, 0x0e, 0x03, 0x12, 0x0a, 0x03, 0x1b, 0x0e, 0x08, 0x17, 0x07, 0x01, 0x16, 0x09, 0x00, 0x25, 0x12, 0x09, 0x2d, 0x1b, 0x0d, 0x5a, 0x3f, 0x26, 0x93, 0x6d, 0x49, 0x9c, 0x73, 0x4b, 0xb1, 0x87, 0x62, 0xac, 0x82, 0x5c, 0xb4, 0x8b, 0x65, 0xbe, 0x94, 0x6e, 0xb2, 0x88, 0x62, 0xc7, 0x9d, 0x77, 0xc2, 0x98, 0x73, 0xcb, 0xa1, 0x7b, 0xbc, 0x91, 0x6d, 0xb1, 0x87, 0x63, 0xd5, 0xaf, 0x88, 0xb3, 0x89, 0x63, 0xb5, 0x8b, 0x66, 0xb7, 0x8f, 0x6b, 0xc2, 0x99, 0x75, 0xb0, 0x86, 0x62, 0xa0, 0x77, 0x55, 0x83, 0x60, 0x42, 0x86, 0x63, 0x45, 0x7c, 0x5a, 0x3d, 0x73, 0x52, 0x35, 0x6b, 0x4a, 0x2f, 0x70, 0x4f, 0x34, 0x5f, 0x3d, 0x23, 0x58, 0x37, 0x1c, 0x69, 0x4a, 0x31, 0x6f, 0x53, 0x3f, 0x99, 0x88, 0x7a, 0xad, 0x9c, 0x8f, 0xa0, 0x8d, 0x80, 0xc5, 0xb7, 0xac, 0xd6, 0xc7, 0xbe, 0xda, 0xcc, 0xc3, 0xda, 0xce, 0xc4, 0xd7, 0xcd, 0xc2, 0xe1, 0xd5, 0xcc, 0xd0, 0xc0, 0xb8, 0xc8, 0xb4, 0xa7, 0xd3, 0xc2, 0xb8, 0xd3, 0xbd, 0xb3, 0xd2, 0xc1, 0xb4, 0xcf, 0xc2, 0xb8, 0xce, 0xc3, 0xb9, 0xd8, 0xcd, 0xc3, 0xc9, 0xb7, 0xaa, 0xce, 0xbf, 0xb4, 0xcf, 0xc3, 0xb7, 0xd7, 0xd0, 0xc6, 0xd2, 0xc4, 0xbb, 0xae, 0x99, 0x88, 0xba, 0xa1, 0x8f, 0xb7, 0xa0, 0x89, 0x85, 0x6b, 0x5c, 0x5d, 0x43, 0x2f, 0x91, 0x72, 0x58, 0xa2, 0x7e, 0x61, 0x9e, 0x76, 0x58, 0xb2, 0x89, 0x68, 0xb2, 0x8c, 0x6a, 0xb3, 0x8e, 0x6f, 0xd1, 0xac, 0x8a, 0xc4, 0x9d, 0x78, 0xba, 0x90, 0x6c, 0xd4, 0xa9, 0x84, 0xdf, 0xb9, 0x92, 0xe3, 0xbb, 0x96, 0xd5, 0xad, 0x88, 0xd5, 0xad, 0x89, 0xdb, 0xae, 0x86, 0xda, 0xae, 0x87, 0xdb, 0xb0, 0x88, 0xde, 0xb4, 0x8e, 0xcc, 0x9e, 0x75, 0xd9, 0xad, 0x82, 0xc4, 0x94, 0x67, 0xbf, 0x94, 0x68, 0xdd, 0xb3, 0x87, 0xd7, 0xac, 0x80, 0xd3, 0xa8, 0x7d, 0xc4, 0x99, 0x6e, 0xc1, 0x96, 0x6b, 0xc0, 0x95, 0x6c, 0xb2, 0x8a, 0x65, 0x92, 0x70, 0x53, 0x84, 0x66, 0x48, 0x5c, 0x48, 0x39, 0x66, 0x5c, 0x50, 0x63, 0x52, 0x48, 0x4e, 0x44, 0x3b, 0x69, 0x5f, 0x57, 0xce, 0xca, 0xc5, 0xea, 0xea, 0xe8, 0xf9, 0xfa, 0xf8, 0xf2, 0xf3, 0xf1, 0xf8, 0xf8, 0xf8, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xfa, 0xfa, 0xed, 0xed, 0xed, 0xef, 0xef, 0xed, 0xe0, 0xe0, 0xde, 0xd5, 0xd3, 0xd0, 0xaf, 0xae, 0xaa, 0x85, 0x7c, 0x75, 0x6f, 0x62, 0x58, 0x4f, 0x3d, 0x31, 0x44, 0x32, 0x26, 0x2f, 0x1f, 0x16, 0x2d, 0x1c, 0x14, 0x20, 0x13, 0x0b, 0x3a, 0x28, 0x1c, 0x21, 0x13, 0x0c, 0x1b, 0x10, 0x0a, 0x15, 0x0b, 0x04, 0x24, 0x15, 0x0b, 0x12, 0x0b, 0x08, 0x12, 0x07, 0x01, 0x18, 0x0e, 0x07, 0x16, 0x07, 0x01, 0x10, 0x06, 0x00, 0x46, 0x32, 0x23, 0x64, 0x49, 0x2d, 0x7f, 0x5d, 0x3c, 0x97, 0x70, 0x4d, 0xa3, 0x79, 0x53, 0xaa, 0x80, 0x5a, 0xb8, 0x8e, 0x68, 0xb5, 0x8b, 0x65, 0xb4, 0x8a, 0x64, 0xc8, 0x9f, 0x79, 0xcb, 0xa1, 0x7b, 0xbe, 0x94, 0x6e, 0xb7, 0x8d, 0x69, 0xb3, 0x89, 0x65, 0xc8, 0xa1, 0x7b, 0xbc, 0x92, 0x6c, 0xa8, 0x7d, 0x59, 0xae, 0x86, 0x62, 0xaf, 0x87, 0x62, 0xac, 0x82, 0x5e, 0x99, 0x70, 0x4d, 0x84, 0x60, 0x42, 0x86, 0x62, 0x44, 0x79, 0x58, 0x3b, 0x80, 0x5f, 0x42, 0x76, 0x55, 0x3a, 0x68, 0x46, 0x2b, 0x62, 0x40, 0x26, 0x62, 0x40, 0x26, 0x60, 0x41, 0x28, 0x6e, 0x53, 0x3f, 0x83, 0x6d, 0x5b, 0x9c, 0x86, 0x75, 0x8c, 0x7a, 0x6c, 0xc3, 0xb5, 0xa9, 0xd2, 0xc4, 0xba, 0xce, 0xbf, 0xb6, 0xcf, 0xc3, 0xb9, 0xcf, 0xc5, 0xba, 0xd9, 0xcd, 0xc4, 0xd0, 0xbf, 0xb7, 0xc1, 0xad, 0x9f, 0xcb, 0xbc, 0xb2, 0xcf, 0xb9, 0xb0, 0xc5, 0xb3, 0xa6, 0xd5, 0xc8, 0xbf, 0xc7, 0xb8, 0xaf, 0xd0, 0xc0, 0xb7, 0xb1, 0xa0, 0x93, 0xc1, 0xb3, 0xa7, 0xb4, 0xa4, 0x94, 0xc7, 0xbb, 0xaf, 0xce, 0xc0, 0xb7, 0x9d, 0x86, 0x75, 0x8d, 0x71, 0x5a, 0xac, 0x91, 0x76, 0x82, 0x69, 0x54, 0x61, 0x48, 0x35, 0x81, 0x64, 0x4e, 0x9b, 0x7a, 0x60, 0xaa, 0x82, 0x65, 0xb2, 0x8a, 0x68, 0xbd, 0x97, 0x75, 0xaf, 0x8a, 0x6a, 0xc1, 0x9c, 0x7a, 0xcf, 0xa8, 0x83, 0xbb, 0x90, 0x6c, 0xcb, 0xa0, 0x7b, 0xe0, 0xba, 0x93, 0xe8, 0xc0, 0x9b, 0xe1, 0xb9, 0x94, 0xdc, 0xb5, 0x91, 0xd8, 0xab, 0x83, 0xd4, 0xa9, 0x82, 0xde, 0xb2, 0x8b, 0xe3, 0xb9, 0x93, 0xd1, 0xa3, 0x79, 0xd8, 0xac, 0x81, 0xcd, 0x9e, 0x70, 0xc4, 0x99, 0x6d, 0xdb, 0xb0, 0x84, 0xd4, 0xa9, 0x7e, 0xd9, 0xae, 0x82, 0xbb, 0x8f, 0x68, 0xb9, 0x8d, 0x67, 0xb9, 0x8f, 0x6a, 0x9e, 0x7a, 0x58, 0x8f, 0x6f, 0x50, 0x80, 0x62, 0x48, 0x4c, 0x3e, 0x2e, 0x79, 0x72, 0x69, 0x64, 0x56, 0x50, 0x57, 0x4d, 0x44, 0x72, 0x67, 0x5e, 0xa4, 0xa0, 0x9b, 0xea, 0xea, 0xe8, 0xf8, 0xf8, 0xf6, 0xf7, 0xf7, 0xf5, 0xfa, 0xfa, 0xfa, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xf8, 0xf0, 0xf0, 0xee, 0xf4, 0xf4, 0xf2, 0xd1, 0xd2, 0xcf, 0xce, 0xcd, 0xca, 0x9d, 0x9c, 0x98, 0x8b, 0x83, 0x79, 0x6a, 0x59, 0x4e, 0x55, 0x40, 0x31, 0x49, 0x33, 0x25, 0x32, 0x20, 0x13, 0x26, 0x17, 0x0f, 0x1b, 0x0b, 0x03, 0x3a, 0x29, 0x21, 0x26, 0x18, 0x12, 0x11, 0x09, 0x05, 0x12, 0x0b, 0x07, 0x0b, 0x08, 0x02, 0x0f, 0x07, 0x03, 0x12, 0x07, 0x02, 0x10, 0x05, 0x00, 0x24, 0x17, 0x12, 0x14, 0x0b, 0x05, 0x25, 0x16, 0x07, 0x5c, 0x40, 0x22, 0x73, 0x50, 0x32, 0x93, 0x6d, 0x4b, 0x9e, 0x77, 0x58, 0xab, 0x82, 0x5a, 0xb3, 0x8b, 0x66, 0xa6, 0x7e, 0x59, 0xae, 0x86, 0x61, 0xbe, 0x96, 0x72, 0xc1, 0x97, 0x73, 0xc0, 0x96, 0x72, 0xac, 0x82, 0x5e, 0xc0, 0x96, 0x73, 0xbf, 0x94, 0x6e, 0xc1, 0x98, 0x74, 0xa4, 0x7b, 0x5a, 0xab, 0x83, 0x5f, 0xb7, 0x8e, 0x68, 0xb0, 0x87, 0x64, 0x85, 0x5e, 0x3e, 0x91, 0x6b, 0x4c, 0x86, 0x63, 0x47, 0x69, 0x48, 0x2b, 0x89, 0x67, 0x4b, 0x80, 0x5e, 0x41, 0x6c, 0x4a, 0x31, 0x5a, 0x38, 0x1e, 0x66, 0x44, 0x2a, 0x61, 0x42, 0x2a, 0x61, 0x46, 0x32, 0x8d, 0x73, 0x5e, 0x6b, 0x54, 0x42, 0x86, 0x76, 0x6a, 0xb2, 0xa4, 0x99, 0xbe, 0xb0, 0xa4, 0xc0, 0xb1, 0xa6, 0xb9, 0xac, 0x9f, 0xc9, 0xbd, 0xaf, 0xc4, 0xb7, 0xab, 0xc3, 0xb2, 0xa5, 0xb0, 0x9c, 0x8d, 0xc2, 0xb2, 0xa6, 0xc0, 0xaf, 0xa2, 0xb6, 0xa6, 0x99, 0xbf, 0xaf, 0xa2, 0xbf, 0xb1, 0xa6, 0xc2, 0xb4, 0xa8, 0xa2, 0x90, 0x81, 0xb2, 0xa4, 0x99, 0x89, 0x76, 0x64, 0x91, 0x80, 0x6f, 0xab, 0x9a, 0x8d, 0xb2, 0x9b, 0x8a, 0x8d, 0x6f, 0x5a, 0xa5, 0x84, 0x68, 0x76, 0x5b, 0x46, 0x69, 0x4e, 0x3b, 0x6f, 0x55, 0x40, 0x7c, 0x5e, 0x47, 0xa8, 0x85, 0x69, 0xb8, 0x91, 0x6b, 0xb8, 0x8f, 0x6c, 0xbc, 0x93, 0x71, 0xae, 0x86, 0x64, 0xd3, 0xab, 0x87, 0xcf, 0xa8, 0x80, 0xc2, 0x97, 0x74, 0xd8, 0xae, 0x8a, 0xdf, 0xb7, 0x92, 0xe8, 0xc4, 0xa1, 0xe0, 0xb8, 0x91, 0xde, 0xb4, 0x8e, 0xd6, 0xad, 0x85, 0xe3, 0xb9, 0x91, 0xd7, 0xae, 0x86, 0xd3, 0xa9, 0x81, 0xda, 0xb0, 0x88, 0xd8, 0xad, 0x84, 0xc7, 0x9c, 0x74, 0xc7, 0x9b, 0x74, 0xdb, 0xb0, 0x85, 0xd2, 0xa7, 0x7b, 0xc4, 0x9e, 0x72, 0x9c, 0x76, 0x54, 0xb4, 0x8f, 0x69, 0x95, 0x74, 0x55, 0x91, 0x72, 0x51, 0x76, 0x59, 0x40, 0x42, 0x34, 0x2a, 0x79, 0x72, 0x6a, 0x7c, 0x72, 0x65, 0x62, 0x59, 0x50, 0x7c, 0x6f, 0x68, 0x93, 0x8f, 0x8c, 0xe6, 0xe6, 0xe2, 0xf6, 0xf6, 0xf4, 0xfc, 0xfc, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf8, 0xf8, 0xf6, 0xfa, 0xfa, 0xf8, 0xeb, 0xeb, 0xe9, 0xd8, 0xd8, 0xd6, 0xb9, 0xb8, 0xb4, 0xa7, 0xa6, 0xa2, 0x7d, 0x75, 0x6b, 0x60, 0x4e, 0x43, 0x56, 0x44, 0x39, 0x49, 0x37, 0x2c, 0x3a, 0x26, 0x1e, 0x28, 0x19, 0x0f, 0x1f, 0x0f, 0x06, 0x38, 0x28, 0x1f, 0x1d, 0x0f, 0x07, 0x16, 0x0d, 0x0a, 0x10, 0x08, 0x05, 0x07, 0x04, 0x00, 0x0e, 0x07, 0x04, 0x05, 0x02, 0x02, 0x07, 0x03, 0x03, 0x12, 0x07, 0x02, 0x1a, 0x0c, 0x04, 0x25, 0x14, 0x07, 0x5d, 0x45, 0x29, 0x73, 0x53, 0x38, 0x86, 0x63, 0x43, 0x96, 0x70, 0x53, 0xad, 0x83, 0x5c, 0x9f, 0x77, 0x52, 0xa5, 0x7d, 0x59, 0xbb, 0x93, 0x6f, 0xbc, 0x94, 0x70, 0xb9, 0x8f, 0x6b, 0xc9, 0x9f, 0x7b, 0xaf, 0x85, 0x61, 0xbf, 0x95, 0x71, 0xc2, 0x95, 0x6f, 0xbb, 0x92, 0x6f, 0x9a, 0x72, 0x51, 0xa6, 0x7e, 0x5a, 0xb9, 0x91, 0x6a, 0xa5, 0x7c, 0x5a, 0x8f, 0x69, 0x4a, 0x93, 0x6c, 0x4e, 0x78, 0x54, 0x3a, 0x68, 0x47, 0x2a, 0x87, 0x66, 0x49, 0x79, 0x57, 0x3a, 0x6c, 0x4b, 0x31, 0x63, 0x42, 0x27, 0x6b, 0x49, 0x2f, 0x68, 0x49, 0x30, 0x55, 0x3a, 0x26, 0x6a, 0x4e, 0x3a, 0x6f, 0x59, 0x47, 0x70, 0x5e, 0x51, 0x70, 0x5e, 0x50, 0x77, 0x65, 0x57, 0xa1, 0x90, 0x82, 0xaa, 0x9a, 0x8d, 0xb1, 0xa2, 0x95, 0xa6, 0x98, 0x8c, 0xb3, 0xa0, 0x92, 0x9a, 0x85, 0x74, 0xb2, 0x9d, 0x8c, 0xb2, 0x9d, 0x8d, 0xaf, 0x9a, 0x8a, 0xb0, 0x9b, 0x8b, 0xad, 0x9c, 0x8e, 0xa5, 0x94, 0x86, 0x77, 0x62, 0x51, 0x96, 0x84, 0x76, 0x69, 0x52, 0x42, 0x73, 0x5d, 0x4c, 0x78, 0x63, 0x4e, 0xa4, 0x89, 0x73, 0x90, 0x72, 0x5e, 0x9f, 0x7f, 0x62, 0x69, 0x4f, 0x3a, 0x61, 0x46, 0x31, 0x54, 0x3a, 0x26, 0x7c, 0x5e, 0x47, 0x79, 0x59, 0x3f, 0xbb, 0x99, 0x74, 0xb4, 0x8c, 0x6a, 0xc9, 0xa0, 0x7e, 0xa8, 0x7f, 0x5e, 0xb2, 0x8a, 0x67, 0xcd, 0xa5, 0x7d, 0xcb, 0xa0, 0x7d, 0xe2, 0xb8, 0x94, 0xe4, 0xba, 0x96, 0xe9, 0xc4, 0xa3, 0xcf, 0xa4, 0x7f, 0xeb, 0xc3, 0x9c, 0xd6, 0xac, 0x84, 0xe1, 0xb8, 0x90, 0xde, 0xb4, 0x8c, 0xd9, 0xb0, 0x88, 0xd3, 0xaa, 0x82, 0xd2, 0xa9, 0x81, 0xcc, 0xa1, 0x79, 0xc2, 0x97, 0x6f, 0xc8, 0x9d, 0x72, 0xc1, 0x96, 0x6a, 0xb1, 0x8c, 0x60, 0x9e, 0x7a, 0x58, 0xb4, 0x91, 0x6b, 0x7c, 0x5b, 0x3c, 0x8a, 0x6c, 0x4d, 0x78, 0x5c, 0x43, 0x3a, 0x26, 0x1b, 0x67, 0x5b, 0x53, 0x9f, 0x98, 0x8e, 0x8c, 0x84, 0x7a, 0x72, 0x65, 0x5d, 0xa5, 0xa1, 0x9f, 0xc2, 0xc2, 0xbe, 0xf9, 0xfa, 0xf7, 0xfa, 0xfa, 0xf8, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfb, 0xf2, 0xf2, 0xf0, 0xd7, 0xd6, 0xd3, 0xce, 0xce, 0xcb, 0xb5, 0xb4, 0xb0, 0xa0, 0x9b, 0x99, 0x77, 0x6e, 0x65, 0x63, 0x51, 0x46, 0x56, 0x46, 0x3b, 0x43, 0x33, 0x2b, 0x2a, 0x17, 0x12, 0x2e, 0x20, 0x16, 0x34, 0x22, 0x19, 0x26, 0x17, 0x0e, 0x16, 0x0c, 0x06, 0x0c, 0x05, 0x02, 0x0f, 0x06, 0x03, 0x14, 0x0a, 0x04, 0x16, 0x09, 0x03, 0x0e, 0x05, 0x00, 0x0d, 0x04, 0x01, 0x14, 0x0b, 0x08, 0x22, 0x12, 0x04, 0x22, 0x11, 0x04, 0x43, 0x2d, 0x16, 0x65, 0x47, 0x2c, 0x6e, 0x4f, 0x35, 0x8d, 0x69, 0x4b, 0x9f, 0x77, 0x52, 0x9b, 0x76, 0x52, 0x9e, 0x77, 0x52, 0xbc, 0x94, 0x6f, 0xbd, 0x95, 0x70, 0xaf, 0x85, 0x61, 0xc4, 0x9a, 0x76, 0xb6, 0x8c, 0x66, 0xb8, 0x8e, 0x6a, 0xbf, 0x93, 0x6c, 0xaa, 0x81, 0x5e, 0x9a, 0x71, 0x52, 0xaf, 0x85, 0x62, 0xb1, 0x88, 0x5f, 0xa5, 0x7c, 0x59, 0x93, 0x6d, 0x4f, 0x9b, 0x74, 0x55, 0x8a, 0x67, 0x4b, 0x84, 0x61, 0x45, 0x92, 0x6e, 0x50, 0x7a, 0x59, 0x3c, 0x68, 0x47, 0x2c, 0x6b, 0x4a, 0x2d, 0x75, 0x54, 0x38, 0x5f, 0x41, 0x29, 0x56, 0x3a, 0x24, 0x6f, 0x53, 0x40, 0x78, 0x5f, 0x4d, 0x59, 0x43, 0x31, 0x57, 0x42, 0x31, 0x65, 0x51, 0x41, 0x96, 0x82, 0x72, 0x9b, 0x86, 0x79, 0x92, 0x7f, 0x72, 0x95, 0x85, 0x77, 0x95, 0x83, 0x74, 0x86, 0x71, 0x61, 0x90, 0x7a, 0x68, 0x89, 0x73, 0x60, 0x8f, 0x7a, 0x68, 0x92, 0x7a, 0x6b, 0xab, 0x95, 0x83, 0x7f, 0x69, 0x57, 0x64, 0x4c, 0x39, 0x84, 0x70, 0x5f, 0x66, 0x4e, 0x3d, 0x67, 0x4c, 0x3a, 0x7c, 0x63, 0x4a, 0x84, 0x66, 0x49, 0x7f, 0x60, 0x49, 0x9e, 0x7e, 0x62, 0x78, 0x5e, 0x49, 0x7a, 0x5d, 0x49, 0x6b, 0x4e, 0x37, 0x81, 0x62, 0x4a, 0x7e, 0x5e, 0x44, 0x99, 0x78, 0x5a, 0xc0, 0x9c, 0x7b, 0xbd, 0x97, 0x75, 0xc5, 0x9c, 0x7a, 0xad, 0x84, 0x61, 0xbe, 0x97, 0x70, 0xd7, 0xae, 0x8a, 0xd7, 0xae, 0x8a, 0xd7, 0xad, 0x87, 0xe1, 0xbb, 0x99, 0xdb, 0xb1, 0x8c, 0xdc, 0xb5, 0x8f, 0xdb, 0xb2, 0x8a, 0xe2, 0xb8, 0x90, 0xd8, 0xb0, 0x88, 0xcf, 0xa5, 0x7c, 0xd3, 0xaa, 0x82, 0xc5, 0x9b, 0x73, 0xc3, 0x99, 0x6f, 0xa9, 0x7e, 0x56, 0xc6, 0x9c, 0x72, 0xc9, 0x9f, 0x74, 0xb7, 0x91, 0x67, 0x9c, 0x7a, 0x58, 0xa9, 0x87, 0x65, 0x9a, 0x78, 0x57, 0x7d, 0x63, 0x48, 0x63, 0x4d, 0x36, 0x49, 0x32, 0x23, 0x5c, 0x4a, 0x3f, 0xa2, 0x9c, 0x96, 0x9a, 0x95, 0x8c, 0x7b, 0x6f, 0x68, 0xac, 0xa8, 0xa3, 0xbf, 0xbf, 0xbb, 0xf1, 0xf2, 0xf0, 0xfa, 0xfb, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf8, 0xf8, 0xf6, 0xe9, 0xea, 0xe7, 0xe1, 0xdf, 0xdc, 0xc8, 0xc7, 0xc3, 0xc9, 0xc8, 0xc4, 0x95, 0x8d, 0x8b, 0x68, 0x5e, 0x55, 0x5e, 0x4f, 0x43, 0x59, 0x47, 0x3d, 0x3e, 0x2b, 0x24, 0x30, 0x1f, 0x14, 0x31, 0x20, 0x15, 0x2d, 0x1d, 0x13, 0x1d, 0x11, 0x0a, 0x0c, 0x05, 0x03, 0x09, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x19, 0x0d, 0x06, 0x19, 0x0c, 0x02, 0x13, 0x0a, 0x02, 0x0d, 0x04, 0x01, 0x0f, 0x08, 0x06, 0x3a, 0x27, 0x1a, 0x1e, 0x11, 0x09, 0x4d, 0x34, 0x1c, 0x63, 0x45, 0x2b, 0x52, 0x39, 0x22, 0x88, 0x69, 0x49, 0x9d, 0x75, 0x54, 0x8d, 0x6a, 0x49, 0xab, 0x84, 0x61, 0xb8, 0x90, 0x69, 0xc1, 0x9a, 0x73, 0xbb, 0x91, 0x6f, 0xb8, 0x8f, 0x67, 0xbf, 0x96, 0x6c, 0xb6, 0x8c, 0x68, 0xbd, 0x90, 0x69, 0xa8, 0x7f, 0x5c, 0xa4, 0x7b, 0x5b, 0xae, 0x84, 0x60, 0xb5, 0x8c, 0x65, 0x95, 0x6b, 0x49, 0x99, 0x73, 0x56, 0xaa, 0x84, 0x63, 0x8e, 0x6b, 0x4d, 0x89, 0x65, 0x4a, 0xa2, 0x7a, 0x59, 0x76, 0x54, 0x37, 0x6d, 0x4b, 0x2f, 0x79, 0x58, 0x3a, 0x7c, 0x5b, 0x3e, 0x5d, 0x41, 0x2a, 0x4a, 0x2e, 0x18, 0x72, 0x56, 0x40, 0x51, 0x34, 0x1f, 0x42, 0x29, 0x16, 0x36, 0x21, 0x10, 0x56, 0x42, 0x33, 0x7d, 0x6a, 0x5a, 0x74, 0x5f, 0x50, 0x8e, 0x7b, 0x6c, 0x7a, 0x67, 0x57, 0x86, 0x72, 0x63, 0x73, 0x5e, 0x4f, 0x91, 0x79, 0x68, 0x77, 0x60, 0x4a, 0x6f, 0x5b, 0x4a, 0x8e, 0x74, 0x63, 0x77, 0x5e, 0x4a, 0x82, 0x68, 0x54, 0x4f, 0x38, 0x24, 0x75, 0x61, 0x4e, 0x68, 0x50, 0x3c, 0x67, 0x4a, 0x32, 0x75, 0x59, 0x40, 0x7b, 0x5b, 0x3f, 0x74, 0x54, 0x39, 0x97, 0x76, 0x5a, 0x91, 0x77, 0x5e, 0x74, 0x56, 0x42, 0x80, 0x5f, 0x44, 0x91, 0x70, 0x55, 0x82, 0x61, 0x46, 0x82, 0x61, 0x47, 0xb0, 0x8e, 0x6e, 0xba, 0x95, 0x75, 0xc5, 0x9d, 0x79, 0xbe, 0x96, 0x71, 0xb6, 0x8e, 0x6a, 0xc8, 0xa0, 0x7c, 0xd6, 0xae, 0x8a, 0xd9, 0xaf, 0x87, 0xe1, 0xbb, 0x98, 0xe8, 0xc0, 0x9b, 0xe1, 0xb9, 0x94, 0xd8, 0xaf, 0x87, 0xdf, 0xb6, 0x8e, 0xde, 0xb7, 0x90, 0xdb, 0xb0, 0x86, 0xd8, 0xaf, 0x87, 0xc2, 0x98, 0x70, 0xc7, 0x9f, 0x73, 0x9a, 0x71, 0x4a, 0xc0, 0x98, 0x72, 0xb8, 0x8f, 0x6a, 0xb9, 0x92, 0x6e, 0x9a, 0x7a, 0x56, 0x93, 0x73, 0x56, 0x9c, 0x79, 0x57, 0x5d, 0x48, 0x33, 0x4c, 0x3a, 0x29, 0x39, 0x26, 0x1a, 0x4f, 0x3d, 0x30, 0x96, 0x90, 0x87, 0xb9, 0xb6, 0xaf, 0xa1, 0x9b, 0x95, 0x92, 0x8f, 0x87, 0xd2, 0xd3, 0xce, 0xe7, 0xe7, 0xe5, 0xfc, 0xfc, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xf5, 0xf6, 0xf3, 0xe3, 0xe3, 0xe1, 0xd4, 0xd3, 0xcf, 0xcf, 0xcd, 0xca, 0xb9, 0xb7, 0xb4, 0x7b, 0x73, 0x71, 0x76, 0x6b, 0x62, 0x65, 0x56, 0x4a, 0x4a, 0x37, 0x33, 0x3f, 0x2d, 0x22, 0x42, 0x2c, 0x20, 0x33, 0x1d, 0x10, 0x21, 0x14, 0x0d, 0x0f, 0x07, 0x03, 0x0b, 0x02, 0x01, 0x0e, 0x04, 0x03, 0x13, 0x08, 0x03, 0x20, 0x14, 0x09, 0x1b, 0x0b, 0x00, 0x17, 0x0c, 0x05, 0x05, 0x04, 0x00, 0x0a, 0x03, 0x01, 0x36, 0x1c, 0x11, 0x19, 0x0d, 0x05, 0x4d, 0x35, 0x1d, 0x49, 0x30, 0x18, 0x48, 0x33, 0x1f, 0x85, 0x66, 0x46, 0x95, 0x6e, 0x4c, 0x97, 0x74, 0x53, 0xa4, 0x7d, 0x59, 0xb6, 0x8e, 0x68, 0xc8, 0xa0, 0x7a, 0xb1, 0x86, 0x64, 0xbf, 0x96, 0x6e, 0xb9, 0x90, 0x66, 0xab, 0x81, 0x5c, 0xbe, 0x92, 0x6b, 0x9c, 0x73, 0x51, 0xa8, 0x80, 0x5c, 0xb4, 0x8a, 0x66, 0xa8, 0x7d, 0x5e, 0xa5, 0x7c, 0x5a, 0x9a, 0x75, 0x52, 0xa6, 0x80, 0x5f, 0x88, 0x65, 0x47, 0xa3, 0x7e, 0x63, 0xa7, 0x7e, 0x5e, 0x7b, 0x59, 0x3c, 0x75, 0x53, 0x36, 0x81, 0x60, 0x43, 0x81, 0x5f, 0x43, 0x60, 0x44, 0x2d, 0x47, 0x2b, 0x14, 0x67, 0x4b, 0x30, 0x52, 0x36, 0x1b, 0x45, 0x2d, 0x19, 0x3a, 0x24, 0x14, 0x62, 0x4e, 0x3f, 0x59, 0x46, 0x36, 0x55, 0x44, 0x34, 0x72, 0x5d, 0x4e, 0x6b, 0x56, 0x47, 0x66, 0x52, 0x43, 0x6b, 0x55, 0x45, 0x69, 0x4f, 0x3b, 0x61, 0x46, 0x2e, 0x7d, 0x64, 0x52, 0x78, 0x5a, 0x3e, 0x6c, 0x4e, 0x36, 0x65, 0x47, 0x2f, 0x56, 0x40, 0x2b, 0x65, 0x4f, 0x3d, 0x70, 0x58, 0x3f, 0x67, 0x4a, 0x2f, 0x64, 0x48, 0x2f, 0x87, 0x66, 0x4a, 0x83, 0x62, 0x48, 0x94, 0x74, 0x57, 0xa8, 0x89, 0x66, 0x61, 0x45, 0x2e, 0x84, 0x64, 0x49, 0x95, 0x73, 0x58, 0x7f, 0x5d, 0x43, 0x77, 0x55, 0x3b, 0x9f, 0x7d, 0x5d, 0xae, 0x88, 0x68, 0xc3, 0x9b, 0x78, 0xb5, 0x8d, 0x69, 0xb9, 0x91, 0x6c, 0xa0, 0x78, 0x54, 0xcf, 0xa7, 0x83, 0xd6, 0xad, 0x85, 0xda, 0xb3, 0x90, 0xe5, 0xbd, 0x99, 0xe1, 0xb9, 0x95, 0xda, 0xb1, 0x89, 0xd8, 0xaf, 0x87, 0xe5, 0xbf, 0x97, 0xd9, 0xae, 0x84, 0xdd, 0xb3, 0x8b, 0xca, 0xa1, 0x79, 0xbb, 0x98, 0x6e, 0xa8, 0x84, 0x60, 0xb8, 0x93, 0x72, 0xb0, 0x8c, 0x6a, 0xae, 0x89, 0x66, 0x98, 0x79, 0x54, 0x88, 0x6b, 0x4b, 0x8f, 0x71, 0x52, 0x3f, 0x2b, 0x1f, 0x48, 0x36, 0x2a, 0x50, 0x3d, 0x35, 0x42, 0x32, 0x26, 0x56, 0x49, 0x3b, 0xb9, 0xb1, 0xac, 0xab, 0xac, 0xa4, 0xa2, 0x9e, 0x96, 0xd2, 0xd3, 0xce, 0xea, 0xea, 0xe8, 0xfb, 0xfb, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf3, 0xf3, 0xf1, 0xe4, 0xe4, 0xe2, 0xcc, 0xca, 0xc7, 0xb8, 0xb6, 0xb3, 0xa2, 0x9e, 0x98, 0x7a, 0x70, 0x67, 0x8a, 0x84, 0x7f, 0x59, 0x4d, 0x44, 0x3e, 0x2e, 0x26, 0x35, 0x24, 0x1c, 0x3c, 0x28, 0x1a, 0x21, 0x12, 0x07, 0x22, 0x14, 0x09, 0x0b, 0x06, 0x03, 0x14, 0x0a, 0x06, 0x09, 0x02, 0x01, 0x0d, 0x06, 0x02, 0x17, 0x0f, 0x05, 0x24, 0x11, 0x09, 0x18, 0x0e, 0x06, 0x04, 0x01, 0x03, 0x17, 0x0e, 0x07, 0x2b, 0x18, 0x0b, 0x17, 0x08, 0x00, 0x59, 0x3e, 0x26, 0x3b, 0x28, 0x16, 0x47, 0x34, 0x22, 0x81, 0x61, 0x40, 0x89, 0x67, 0x48, 0x83, 0x64, 0x47, 0x92, 0x6f, 0x4e, 0xb3, 0x8b, 0x66, 0xc2, 0x9a, 0x76, 0xb5, 0x8b, 0x69, 0xc1, 0x98, 0x70, 0xc6, 0x9c, 0x77, 0xaf, 0x85, 0x61, 0xb2, 0x89, 0x65, 0xa2, 0x7a, 0x56, 0xa1, 0x79, 0x56, 0xad, 0x85, 0x62, 0x9b, 0x72, 0x50, 0xa5, 0x7d, 0x5a, 0x9c, 0x74, 0x52, 0xb7, 0x90, 0x6f, 0x8c, 0x68, 0x4a, 0x9d, 0x78, 0x59, 0x9b, 0x76, 0x57, 0x7a, 0x5b, 0x3f, 0x88, 0x64, 0x46, 0x8d, 0x6a, 0x4c, 0x86, 0x63, 0x45, 0x5a, 0x3e, 0x25, 0x4b, 0x2f, 0x16, 0x69, 0x4a, 0x32, 0x53, 0x37, 0x1e, 0x42, 0x29, 0x16, 0x35, 0x1f, 0x0f, 0x59, 0x47, 0x38, 0x4a, 0x35, 0x25, 0x43, 0x31, 0x22, 0x45, 0x31, 0x21, 0x4e, 0x36, 0x26, 0x60, 0x47, 0x35, 0x5b, 0x44, 0x2f, 0x52, 0x38, 0x24, 0x66, 0x48, 0x31, 0x6a, 0x4f, 0x3a, 0x6f, 0x55, 0x39, 0x6f, 0x53, 0x3a, 0x62, 0x46, 0x2e, 0x6b, 0x52, 0x41, 0x6d, 0x55, 0x41, 0x65, 0x4b, 0x34, 0x73, 0x54, 0x39, 0x70, 0x52, 0x37, 0x89, 0x66, 0x48, 0x8b, 0x67, 0x4d, 0x9f, 0x7d, 0x5d, 0xa3, 0x84, 0x65, 0x92, 0x73, 0x5a, 0x7e, 0x5e, 0x45, 0x9e, 0x7a, 0x5f, 0x95, 0x70, 0x54, 0x89, 0x64, 0x49, 0x92, 0x6e, 0x51, 0xa0, 0x7d, 0x5e, 0xbd, 0x97, 0x76, 0xbe, 0x94, 0x70, 0xb7, 0x8d, 0x69, 0xa4, 0x7a, 0x56, 0xcc, 0xa1, 0x81, 0xcd, 0xa3, 0x7b, 0xda, 0xb1, 0x89, 0xdf, 0xb9, 0x93, 0xdc, 0xb4, 0x8d, 0xe1, 0xb6, 0x8b, 0xd5, 0xaa, 0x7f, 0xe3, 0xbf, 0x9a, 0xda, 0xae, 0x81, 0xd2, 0xa9, 0x7e, 0xcc, 0xa7, 0x7f, 0xae, 0x86, 0x5f, 0x9e, 0x79, 0x58, 0xb1, 0x8e, 0x6e, 0xaa, 0x87, 0x67, 0x9e, 0x7d, 0x5d, 0xa1, 0x82, 0x62, 0x95, 0x74, 0x54, 0x8a, 0x6e, 0x4e, 0x4f, 0x3a, 0x2a, 0x55, 0x43, 0x37, 0x3f, 0x32, 0x2a, 0x56, 0x45, 0x3e, 0x6c, 0x5b, 0x54, 0x7e, 0x77, 0x6e, 0xc5, 0xc2, 0xbc, 0xbb, 0xba, 0xb6, 0xc5, 0xc3, 0xc0, 0xf3, 0xf2, 0xf2, 0xfa, 0xfa, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xee, 0xee, 0xec, 0xd2, 0xd2, 0xd0, 0xce, 0xcd, 0xc9, 0xbd, 0xbb, 0xb8, 0x8c, 0x88, 0x82, 0x95, 0x8c, 0x82, 0x76, 0x6c, 0x64, 0x4d, 0x3f, 0x34, 0x38, 0x28, 0x1f, 0x2f, 0x1e, 0x16, 0x41, 0x2f, 0x21, 0x27, 0x19, 0x0e, 0x2b, 0x1d, 0x11, 0x0d, 0x07, 0x05, 0x19, 0x0e, 0x0a, 0x0b, 0x04, 0x03, 0x06, 0x02, 0x01, 0x24, 0x18, 0x0b, 0x1d, 0x0e, 0x09, 0x1d, 0x11, 0x07, 0x18, 0x0c, 0x09, 0x13, 0x07, 0x03, 0x19, 0x0c, 0x06, 0x18, 0x0a, 0x01, 0x4e, 0x33, 0x1b, 0x40, 0x2d, 0x1c, 0x31, 0x1e, 0x0d, 0x78, 0x5c, 0x40, 0x76, 0x59, 0x3d, 0x82, 0x64, 0x47, 0x8a, 0x68, 0x47, 0xac, 0x84, 0x60, 0xb9, 0x91, 0x6c, 0xb1, 0x87, 0x65, 0xb8, 0x8e, 0x66, 0xbf, 0x95, 0x71, 0xac, 0x82, 0x5e, 0xaa, 0x81, 0x5d, 0xab, 0x83, 0x5e, 0xa7, 0x7f, 0x5c, 0xac, 0x84, 0x61, 0x96, 0x6e, 0x4b, 0xab, 0x83, 0x60, 0xad, 0x85, 0x62, 0xbc, 0x96, 0x75, 0x9b, 0x77, 0x59, 0x96, 0x71, 0x51, 0x9e, 0x7a, 0x5a, 0x8c, 0x6c, 0x51, 0x96, 0x73, 0x54, 0x98, 0x75, 0x57, 0x90, 0x6d, 0x4e, 0x63, 0x47, 0x2f, 0x55, 0x39, 0x21, 0x68, 0x48, 0x31, 0x53, 0x37, 0x1f, 0x42, 0x2a, 0x16, 0x3e, 0x28, 0x17, 0x4e, 0x3c, 0x2e, 0x45, 0x30, 0x20, 0x3a, 0x27, 0x18, 0x33, 0x1f, 0x10, 0x47, 0x2f, 0x1c, 0x54, 0x3c, 0x25, 0x55, 0x3c, 0x22, 0x52, 0x37, 0x22, 0x59, 0x3f, 0x2b, 0x61, 0x47, 0x31, 0x6d, 0x54, 0x38, 0x54, 0x38, 0x20, 0x5d, 0x41, 0x28, 0x69, 0x51, 0x39, 0x62, 0x49, 0x33, 0x70, 0x54, 0x3e, 0x7b, 0x5c, 0x41, 0x77, 0x58, 0x3e, 0x8a, 0x67, 0x4a, 0x9c, 0x79, 0x5e, 0xa2, 0x7f, 0x5f, 0xaf, 0x91, 0x6e, 0x98, 0x79, 0x5b, 0x6f, 0x4f, 0x35, 0xa0, 0x7c, 0x61, 0x96, 0x71, 0x51, 0x99, 0x74, 0x54, 0x8c, 0x68, 0x49, 0x9e, 0x7b, 0x5c, 0xb0, 0x8a, 0x6a, 0xc4, 0x9a, 0x76, 0xc5, 0x9b, 0x76, 0xa9, 0x7f, 0x5b, 0xae, 0x83, 0x63, 0xca, 0xa1, 0x79, 0xd1, 0xa8, 0x80, 0xda, 0xb4, 0x8f, 0xe1, 0xb9, 0x91, 0xdb, 0xb0, 0x85, 0xd0, 0xa5, 0x7a, 0xdb, 0xb3, 0x8a, 0xdb, 0xb1, 0x88, 0xcb, 0xa2, 0x76, 0xc0, 0x9b, 0x73, 0x93, 0x6e, 0x4c, 0x86, 0x66, 0x46, 0xa2, 0x84, 0x63, 0xa6, 0x88, 0x66, 0x8f, 0x71, 0x50, 0x9c, 0x7d, 0x5d, 0x9c, 0x7c, 0x57, 0x85, 0x68, 0x4c, 0x5e, 0x48, 0x33, 0x51, 0x3f, 0x33, 0x41, 0x36, 0x2e, 0x51, 0x45, 0x3d, 0x59, 0x4d, 0x45, 0x81, 0x7a, 0x70, 0xae, 0xab, 0xa6, 0xc8, 0xc7, 0xc3, 0xcc, 0xca, 0xc7, 0xf1, 0xf1, 0xf1, 0xf9, 0xf9, 0xf9, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xec, 0xec, 0xea, 0xc9, 0xc9, 0xc7, 0xd1, 0xd0, 0xcc, 0xaf, 0xae, 0xaa, 0xa8, 0xa1, 0x9a, 0x8d, 0x82, 0x7b, 0x5d, 0x4e, 0x47, 0x44, 0x34, 0x2c, 0x34, 0x23, 0x19, 0x34, 0x23, 0x19, 0x48, 0x35, 0x26, 0x32, 0x26, 0x1c, 0x20, 0x13, 0x0f, 0x06, 0x04, 0x00, 0x0f, 0x06, 0x03, 0x10, 0x05, 0x00, 0x14, 0x0c, 0x07, 0x1d, 0x14, 0x04, 0x14, 0x08, 0x01, 0x21, 0x16, 0x0e, 0x14, 0x09, 0x04, 0x0b, 0x04, 0x00, 0x13, 0x0a, 0x04, 0x26, 0x14, 0x06, 0x45, 0x2e, 0x1d, 0x37, 0x28, 0x17, 0x48, 0x32, 0x1f, 0x63, 0x49, 0x32, 0x74, 0x58, 0x3a, 0x66, 0x4a, 0x2e, 0x93, 0x72, 0x50, 0xa5, 0x7f, 0x5e, 0xb5, 0x8f, 0x6e, 0xa6, 0x83, 0x62, 0xad, 0x81, 0x59, 0xb4, 0x8c, 0x67, 0xa8, 0x80, 0x5c, 0xab, 0x83, 0x5d, 0xa9, 0x81, 0x5d, 0xa3, 0x7a, 0x57, 0xaf, 0x85, 0x61, 0xa2, 0x78, 0x54, 0xb6, 0x8e, 0x69, 0xa7, 0x7f, 0x5b, 0xb6, 0x8d, 0x6b, 0xab, 0x84, 0x63, 0xa0, 0x7b, 0x5b, 0x8a, 0x69, 0x4c, 0x9d, 0x7f, 0x5f, 0x9e, 0x7b, 0x5d, 0x9e, 0x7d, 0x60, 0x9a, 0x79, 0x5c, 0x63, 0x45, 0x2b, 0x5a, 0x3b, 0x24, 0x57, 0x3a, 0x22, 0x55, 0x39, 0x21, 0x4d, 0x32, 0x1d, 0x40, 0x29, 0x17, 0x4a, 0x36, 0x27, 0x57, 0x40, 0x2e, 0x33, 0x1c, 0x0c, 0x32, 0x1b, 0x0b, 0x43, 0x2c, 0x19, 0x50, 0x37, 0x1e, 0x5c, 0x3f, 0x26, 0x63, 0x47, 0x31, 0x5f, 0x44, 0x2e, 0x59, 0x3d, 0x24, 0x60, 0x44, 0x2b, 0x56, 0x3a, 0x22, 0x64, 0x48, 0x2f, 0x63, 0x49, 0x2f, 0x5c, 0x41, 0x29, 0x71, 0x55, 0x3b, 0x80, 0x5f, 0x43, 0x6c, 0x4d, 0x33, 0x8f, 0x6c, 0x4e, 0xa2, 0x7f, 0x61, 0x9a, 0x77, 0x58, 0xb8, 0x96, 0x76, 0x8f, 0x72, 0x52, 0x81, 0x5f, 0x44, 0xa8, 0x81, 0x65, 0x9d, 0x76, 0x57, 0xac, 0x85, 0x65, 0x92, 0x6b, 0x4b, 0x92, 0x6b, 0x4a, 0xa5, 0x7e, 0x5c, 0xb9, 0x90, 0x6c, 0xbe, 0x92, 0x6d, 0xc4, 0x98, 0x73, 0xa3, 0x77, 0x53, 0xc3, 0x98, 0x6e, 0xc1, 0x96, 0x6d, 0xd2, 0xab, 0x84, 0xe0, 0xb9, 0x91, 0xda, 0xb0, 0x87, 0xc9, 0xa0, 0x76, 0xd9, 0xaf, 0x82, 0xda, 0xb3, 0x89, 0xcc, 0xa2, 0x79, 0xc4, 0x9e, 0x77, 0x88, 0x67, 0x48, 0x86, 0x66, 0x49, 0x85, 0x6a, 0x4c, 0xa3, 0x83, 0x5e, 0x9c, 0x7d, 0x60, 0x95, 0x76, 0x56, 0x92, 0x72, 0x54, 0x77, 0x5c, 0x44, 0x5c, 0x46, 0x33, 0x54, 0x42, 0x35, 0x43, 0x36, 0x2e, 0x53, 0x49, 0x40, 0x7b, 0x72, 0x6c, 0x7e, 0x75, 0x6c, 0x99, 0x94, 0x8f, 0xca, 0xc6, 0xc4, 0xda, 0xda, 0xd5, 0xeb, 0xeb, 0xe9, 0xfa, 0xfa, 0xf8, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xe2, 0xe2, 0xe0, 0xca, 0xca, 0xc8, 0xc7, 0xc6, 0xc2, 0xb4, 0xb2, 0xaf, 0xa9, 0xa2, 0x9a, 0x6f, 0x63, 0x5d, 0x53, 0x44, 0x3d, 0x3e, 0x30, 0x29, 0x49, 0x39, 0x2c, 0x41, 0x31, 0x24, 0x45, 0x32, 0x23, 0x28, 0x1e, 0x15, 0x1b, 0x12, 0x0d, 0x10, 0x08, 0x03, 0x14, 0x09, 0x04, 0x19, 0x0e, 0x08, 0x0e, 0x05, 0x02, 0x16, 0x0c, 0x02, 0x17, 0x0a, 0x04, 0x18, 0x0d, 0x07, 0x12, 0x08, 0x03, 0x0b, 0x06, 0x01, 0x21, 0x17, 0x0e, 0x2f, 0x1d, 0x0f, 0x2b, 0x1d, 0x12, 0x34, 0x26, 0x15, 0x53, 0x3b, 0x28, 0x4c, 0x36, 0x20, 0x73, 0x5b, 0x3c, 0x5d, 0x40, 0x29, 0x79, 0x58, 0x39, 0x9d, 0x78, 0x58, 0xb2, 0x8d, 0x6d, 0xa2, 0x81, 0x5f, 0xb7, 0x8c, 0x62, 0xaf, 0x87, 0x63, 0xa8, 0x7f, 0x5b, 0xb2, 0x8b, 0x63, 0xa0, 0x77, 0x54, 0xad, 0x83, 0x61, 0xab, 0x81, 0x5d, 0xab, 0x82, 0x5e, 0xb0, 0x88, 0x64, 0xb0, 0x87, 0x63, 0xa9, 0x81, 0x5f, 0xb2, 0x8a, 0x68, 0xa2, 0x7f, 0x5f, 0x89, 0x69, 0x4e, 0xa9, 0x8b, 0x6b, 0x9f, 0x7a, 0x5d, 0xa3, 0x82, 0x65, 0x89, 0x67, 0x4a, 0x73, 0x53, 0x39, 0x5a, 0x3a, 0x25, 0x60, 0x44, 0x2b, 0x5f, 0x43, 0x2a, 0x4d, 0x30, 0x1c, 0x3a, 0x23, 0x11, 0x43, 0x2f, 0x20, 0x55, 0x3d, 0x2b, 0x3e, 0x26, 0x15, 0x33, 0x1b, 0x0b, 0x39, 0x22, 0x10, 0x52, 0x38, 0x21, 0x57, 0x3a, 0x21, 0x5c, 0x3f, 0x29, 0x5a, 0x3e, 0x27, 0x58, 0x3c, 0x24, 0x65, 0x49, 0x30, 0x4e, 0x32, 0x19, 0x61, 0x45, 0x2c, 0x6f, 0x53, 0x3b, 0x68, 0x4c, 0x33, 0x76, 0x59, 0x40, 0x86, 0x64, 0x48, 0x6c, 0x4d, 0x33, 0x96, 0x73, 0x55, 0xa3, 0x80, 0x62, 0xa8, 0x85, 0x67, 0xa2, 0x82, 0x62, 0x9f, 0x7e, 0x5f, 0x89, 0x66, 0x48, 0xab, 0x84, 0x64, 0xab, 0x83, 0x61, 0xaa, 0x82, 0x60, 0xa0, 0x77, 0x55, 0x8e, 0x65, 0x43, 0x9d, 0x75, 0x54, 0xad, 0x84, 0x61, 0xba, 0x8c, 0x65, 0xc3, 0x97, 0x6f, 0xbf, 0x93, 0x6b, 0xbb, 0x93, 0x6c, 0xb5, 0x8d, 0x67, 0xc8, 0xa0, 0x79, 0xe2, 0xba, 0x93, 0xe1, 0xb7, 0x8f, 0xca, 0xa0, 0x78, 0xd0, 0xa4, 0x78, 0xe1, 0xbb, 0x90, 0xc2, 0x99, 0x70, 0xbf, 0x99, 0x74, 0x87, 0x68, 0x4a, 0x90, 0x71, 0x53, 0x71, 0x59, 0x40, 0x9d, 0x7d, 0x5c, 0x87, 0x68, 0x4d, 0xab, 0x8d, 0x6b, 0x84, 0x64, 0x49, 0x79, 0x5e, 0x46, 0x5d, 0x49, 0x39, 0x48, 0x36, 0x2a, 0x65, 0x53, 0x48, 0x66, 0x58, 0x4d, 0x57, 0x4d, 0x45, 0x8e, 0x83, 0x7b, 0xa2, 0x9d, 0x98, 0xbf, 0xbb, 0xb9, 0xe8, 0xe8, 0xe2, 0xe5, 0xe6, 0xe3, 0xfa, 0xfa, 0xf8, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfa, 0xfa, 0xf9, 0xf0, 0xf0, 0xef, 0xf6, 0xf6, 0xf4, 0xb4, 0xb5, 0xb1, 0xcd, 0xcc, 0xc8, 0xbc, 0xbb, 0xb7, 0x92, 0x8a, 0x83, 0x6a, 0x5f, 0x59, 0x50, 0x44, 0x3d, 0x3f, 0x31, 0x29, 0x35, 0x25, 0x1a, 0x3d, 0x2c, 0x21, 0x40, 0x2d, 0x20, 0x1a, 0x10, 0x07, 0x22, 0x19, 0x13, 0x1a, 0x0c, 0x06, 0x1d, 0x10, 0x08, 0x18, 0x0d, 0x08, 0x09, 0x04, 0x04, 0x14, 0x09, 0x03, 0x16, 0x0a, 0x04, 0x1a, 0x11, 0x0b, 0x10, 0x0a, 0x06, 0x0e, 0x06, 0x00, 0x14, 0x08, 0x02, 0x35, 0x23, 0x14, 0x0e, 0x08, 0x02, 0x25, 0x17, 0x0b, 0x4f, 0x39, 0x25, 0x4a, 0x37, 0x26, 0x62, 0x49, 0x2e, 0x5b, 0x41, 0x2b, 0x79, 0x5b, 0x3e, 0x8e, 0x6a, 0x4a, 0x99, 0x75, 0x56, 0x94, 0x73, 0x52, 0xc4, 0x9b, 0x74, 0xa8, 0x80, 0x5d, 0xa9, 0x81, 0x5e, 0xae, 0x86, 0x60, 0xad, 0x85, 0x61, 0xaa, 0x80, 0x5d, 0xb3, 0x88, 0x65, 0xaf, 0x85, 0x61, 0xb2, 0x8a, 0x65, 0xb4, 0x8c, 0x68, 0xa8, 0x80, 0x5d, 0xac, 0x84, 0x63, 0x8b, 0x68, 0x48, 0x90, 0x70, 0x55, 0xb3, 0x94, 0x74, 0x9e, 0x7c, 0x5d, 0xa3, 0x81, 0x63, 0x92, 0x70, 0x52, 0x74, 0x54, 0x39, 0x5f, 0x3e, 0x27, 0x63, 0x47, 0x30, 0x62, 0x46, 0x2e, 0x4e, 0x34, 0x1f, 0x38, 0x20, 0x0e, 0x32, 0x1d, 0x0d, 0x42, 0x2b, 0x18, 0x46, 0x2e, 0x1b, 0x37, 0x1f, 0x0d, 0x39, 0x20, 0x0c, 0x59, 0x3d, 0x26, 0x54, 0x37, 0x1f, 0x5d, 0x40, 0x29, 0x64, 0x47, 0x2e, 0x66, 0x4a, 0x31, 0x59, 0x3d, 0x24, 0x51, 0x34, 0x1a, 0x6e, 0x51, 0x38, 0x70, 0x53, 0x3b, 0x66, 0x49, 0x31, 0x81, 0x63, 0x49, 0x8d, 0x6c, 0x51, 0x75, 0x58, 0x3e, 0x83, 0x60, 0x43, 0xa5, 0x82, 0x63, 0xa6, 0x83, 0x64, 0x96, 0x78, 0x58, 0xb3, 0x8f, 0x71, 0x96, 0x73, 0x54, 0x9f, 0x7a, 0x56, 0xb7, 0x8e, 0x69, 0xae, 0x85, 0x61, 0xb2, 0x88, 0x65, 0x9c, 0x72, 0x4f, 0x95, 0x6c, 0x4a, 0xb6, 0x8d, 0x67, 0xac, 0x81, 0x5b, 0xbb, 0x90, 0x65, 0xb7, 0x8c, 0x62, 0xb0, 0x8b, 0x67, 0xad, 0x88, 0x62, 0xc0, 0x99, 0x73, 0xd8, 0xb1, 0x8b, 0xd5, 0xac, 0x85, 0xc1, 0x97, 0x70, 0xc1, 0x97, 0x6c, 0xdb, 0xb3, 0x8a, 0xbf, 0x98, 0x6f, 0xb4, 0x8f, 0x68, 0x89, 0x6a, 0x4c, 0x78, 0x5b, 0x3c, 0x79, 0x64, 0x4c, 0x9a, 0x7b, 0x5b, 0x9b, 0x7d, 0x61, 0x92, 0x72, 0x52, 0x7c, 0x5f, 0x46, 0x6e, 0x53, 0x41, 0x42, 0x2f, 0x22, 0x48, 0x35, 0x2c, 0x58, 0x44, 0x39, 0x6e, 0x5f, 0x51, 0x5b, 0x4b, 0x40, 0x91, 0x86, 0x7e, 0xa9, 0xa5, 0xa0, 0xae, 0xaa, 0xa6, 0xe0, 0xe0, 0xdc, 0xf5, 0xf5, 0xf4, 0xf3, 0xf3, 0xf3, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf8, 0xf8, 0xf6, 0xf7, 0xf8, 0xf6, 0xe2, 0xe2, 0xe2, 0xcf, 0xd0, 0xca, 0xc6, 0xc5, 0xc1, 0xa2, 0xa1, 0x9d, 0x8b, 0x82, 0x7b, 0x74, 0x6b, 0x64, 0x4f, 0x46, 0x40, 0x3b, 0x2e, 0x24, 0x3e, 0x2d, 0x25, 0x3b, 0x2b, 0x22, 0x3e, 0x2e, 0x24, 0x1a, 0x10, 0x07, 0x1a, 0x11, 0x0a, 0x13, 0x0a, 0x03, 0x1d, 0x11, 0x0a, 0x12, 0x08, 0x05, 0x08, 0x03, 0x02, 0x18, 0x0b, 0x05, 0x17, 0x0b, 0x07, 0x17, 0x10, 0x0b, 0x0b, 0x06, 0x02, 0x30, 0x21, 0x1a, 0x0a, 0x04, 0x00, 0x3c, 0x2c, 0x1f, 0x14, 0x0c, 0x06, 0x21, 0x11, 0x09, 0x43, 0x30, 0x1d, 0x35, 0x23, 0x16, 0x5b, 0x42, 0x28, 0x5e, 0x46, 0x2f, 0x75, 0x59, 0x3c, 0x8f, 0x6f, 0x51, 0x83, 0x63, 0x45, 0xa3, 0x81, 0x60, 0xbf, 0x98, 0x75, 0xa4, 0x7c, 0x59, 0xad, 0x85, 0x62, 0xa5, 0x7d, 0x59, 0xaf, 0x87, 0x62, 0xaa, 0x80, 0x5c, 0xb3, 0x89, 0x65, 0xb1, 0x88, 0x64, 0xb4, 0x8c, 0x67, 0xbc, 0x94, 0x6f, 0x9a, 0x71, 0x4f, 0xa6, 0x7d, 0x5f, 0x93, 0x70, 0x50, 0x8e, 0x6d, 0x52, 0xb3, 0x92, 0x73, 0xa1, 0x80, 0x61, 0xad, 0x89, 0x6b, 0xa0, 0x7d, 0x5e, 0x78, 0x58, 0x3d, 0x6e, 0x4e, 0x33, 0x5d, 0x40, 0x2a, 0x6a, 0x4d, 0x37, 0x4f, 0x36, 0x21, 0x33, 0x19, 0x08, 0x2f, 0x17, 0x07, 0x3a, 0x24, 0x10, 0x50, 0x38, 0x22, 0x41, 0x28, 0x13, 0x42, 0x27, 0x11, 0x5c, 0x3f, 0x29, 0x59, 0x3d, 0x26, 0x59, 0x3c, 0x25, 0x6a, 0x4b, 0x30, 0x59, 0x3d, 0x24, 0x5b, 0x3f, 0x26, 0x58, 0x39, 0x1e, 0x73, 0x54, 0x38, 0x74, 0x53, 0x3c, 0x66, 0x46, 0x2f, 0x89, 0x68, 0x4d, 0x7a, 0x59, 0x3e, 0x68, 0x4c, 0x33, 0x8f, 0x6e, 0x53, 0xa5, 0x82, 0x62, 0xaf, 0x8c, 0x6c, 0xa5, 0x84, 0x65, 0x95, 0x74, 0x55, 0xa9, 0x86, 0x68, 0xa1, 0x7b, 0x5a, 0xa8, 0x7e, 0x5b, 0xae, 0x84, 0x60, 0xb6, 0x8c, 0x67, 0xac, 0x82, 0x5c, 0x9e, 0x74, 0x50, 0xac, 0x82, 0x58, 0xab, 0x80, 0x5e, 0xae, 0x82, 0x5b, 0xb1, 0x85, 0x5e, 0xa3, 0x7f, 0x5c, 0xb6, 0x92, 0x69, 0xac, 0x84, 0x60, 0xd7, 0xae, 0x8a, 0xd5, 0xac, 0x86, 0xb8, 0x90, 0x69, 0xbb, 0x92, 0x6a, 0xd3, 0xa9, 0x81, 0xae, 0x8b, 0x66, 0xb0, 0x8c, 0x67, 0xa1, 0x83, 0x61, 0x88, 0x6d, 0x50, 0x89, 0x73, 0x5b, 0x89, 0x6a, 0x4c, 0x82, 0x67, 0x4c, 0x81, 0x63, 0x45, 0x6a, 0x53, 0x3a, 0x49, 0x33, 0x26, 0x45, 0x31, 0x23, 0x4b, 0x39, 0x2f, 0x48, 0x39, 0x31, 0x69, 0x5b, 0x4e, 0x71, 0x5e, 0x52, 0x8b, 0x80, 0x78, 0xa2, 0xa1, 0x9b, 0xb7, 0xb3, 0xae, 0xdb, 0xda, 0xd9, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xf9, 0xef, 0xef, 0xee, 0xdf, 0xdf, 0xdf, 0xd6, 0xd6, 0xd0, 0xc5, 0xc3, 0xc0, 0x91, 0x90, 0x8c, 0x7c, 0x73, 0x6c, 0x6d, 0x64, 0x5d, 0x4c, 0x3e, 0x39, 0x46, 0x32, 0x2a, 0x3a, 0x29, 0x21, 0x37, 0x26, 0x1e, 0x39, 0x29, 0x1f, 0x27, 0x1a, 0x12, 0x1f, 0x16, 0x10, 0x12, 0x09, 0x02, 0x20, 0x15, 0x0d, 0x0f, 0x04, 0x01, 0x0d, 0x09, 0x04, 0x25, 0x18, 0x12, 0x13, 0x06, 0x09, 0x11, 0x09, 0x05, 0x1c, 0x19, 0x0f, 0x1a, 0x0d, 0x06, 0x19, 0x10, 0x0d, 0x0f, 0x06, 0x00, 0x1c, 0x11, 0x09, 0x32, 0x22, 0x13, 0x2d, 0x1f, 0x12, 0x1b, 0x0e, 0x03, 0x51, 0x3c, 0x26, 0x5b, 0x43, 0x2c, 0x75, 0x59, 0x3c, 0x70, 0x54, 0x39, 0x75, 0x5a, 0x3f, 0x9f, 0x7c, 0x5c, 0xbc, 0x96, 0x73, 0x9e, 0x76, 0x54, 0xa3, 0x7b, 0x58, 0xa9, 0x81, 0x5d, 0xb0, 0x88, 0x63, 0xa0, 0x77, 0x53, 0xb3, 0x89, 0x65, 0xbb, 0x92, 0x6e, 0xb6, 0x8e, 0x6a, 0xb2, 0x8a, 0x66, 0xa8, 0x80, 0x5e, 0xa8, 0x7f, 0x61, 0x99, 0x76, 0x56, 0x86, 0x65, 0x4a, 0xa9, 0x88, 0x6a, 0xa2, 0x81, 0x62, 0xae, 0x8b, 0x6d, 0xa4, 0x81, 0x63, 0x78, 0x58, 0x3d, 0x76, 0x56, 0x3b, 0x50, 0x34, 0x1d, 0x61, 0x45, 0x2e, 0x54, 0x3c, 0x24, 0x36, 0x1c, 0x0b, 0x3c, 0x24, 0x14, 0x3e, 0x27, 0x14, 0x51, 0x39, 0x23, 0x49, 0x31, 0x1b, 0x4d, 0x33, 0x1d, 0x59, 0x3d, 0x26, 0x5b, 0x40, 0x29, 0x53, 0x36, 0x1e, 0x6e, 0x4f, 0x34, 0x62, 0x46, 0x2e, 0x5d, 0x40, 0x28, 0x61, 0x42, 0x26, 0x7c, 0x5c, 0x41, 0x79, 0x59, 0x41, 0x73, 0x53, 0x3c, 0x7e, 0x63, 0x46, 0x66, 0x4b, 0x2e, 0x6c, 0x51, 0x37, 0x7b, 0x5b, 0x3f, 0xa0, 0x7d, 0x5d, 0xa4, 0x81, 0x61, 0x9a, 0x79, 0x5a, 0x92, 0x71, 0x52, 0xa7, 0x84, 0x66, 0x9b, 0x74, 0x54, 0x9e, 0x74, 0x51, 0xac, 0x82, 0x5e, 0xb2, 0x88, 0x63, 0xb1, 0x87, 0x61, 0x9c, 0x72, 0x4d, 0xa5, 0x7c, 0x52, 0xa1, 0x77, 0x54, 0xaf, 0x83, 0x5c, 0xa6, 0x7b, 0x53, 0x98, 0x74, 0x50, 0xc7, 0xa4, 0x7b, 0xa4, 0x7c, 0x57, 0xcc, 0xa4, 0x80, 0xc7, 0xa4, 0x7c, 0xc8, 0xa4, 0x7c, 0xb1, 0x88, 0x60, 0xc9, 0x9f, 0x77, 0xa9, 0x8b, 0x69, 0xa7, 0x88, 0x67, 0x95, 0x76, 0x55, 0x9e, 0x83, 0x66, 0x75, 0x5d, 0x44, 0x82, 0x6a, 0x50, 0x48, 0x39, 0x26, 0x85, 0x6b, 0x50, 0x56, 0x40, 0x29, 0x40, 0x2d, 0x22, 0x40, 0x30, 0x23, 0x57, 0x46, 0x37, 0x52, 0x43, 0x38, 0x51, 0x3f, 0x33, 0x90, 0x85, 0x76, 0x78, 0x6d, 0x64, 0xb4, 0xb2, 0xad, 0xbc, 0xb9, 0xb3, 0xc9, 0xc9, 0xc7, 0xf2, 0xf2, 0xf2, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf3, 0xf4, 0xf2, 0xe4, 0xe4, 0xe2, 0xe0, 0xe1, 0xde, 0xd4, 0xd4, 0xd2, 0xd1, 0xcf, 0xcd, 0x8d, 0x89, 0x83, 0x79, 0x71, 0x6c, 0x67, 0x5c, 0x53, 0x43, 0x35, 0x2e, 0x45, 0x36, 0x2f, 0x35, 0x29, 0x21, 0x2e, 0x22, 0x1a, 0x37, 0x28, 0x20, 0x1d, 0x12, 0x0d, 0x22, 0x14, 0x0b, 0x10, 0x06, 0x00, 0x12, 0x09, 0x04, 0x0e, 0x07, 0x05, 0x24, 0x1c, 0x0f, 0x15, 0x0c, 0x08, 0x19, 0x0c, 0x08, 0x12, 0x0d, 0x06, 0x1e, 0x12, 0x0a, 0x1b, 0x0e, 0x06, 0x09, 0x00, 0x00, 0x1e, 0x14, 0x0c, 0x16, 0x0c, 0x04, 0x28, 0x1e, 0x11, 0x22, 0x17, 0x11, 0x1c, 0x12, 0x07, 0x4d, 0x37, 0x23, 0x58, 0x42, 0x2c, 0x68, 0x4e, 0x32, 0x4c, 0x37, 0x23, 0x78, 0x5d, 0x44, 0x85, 0x66, 0x4a, 0xab, 0x84, 0x61, 0x96, 0x71, 0x4d, 0xa8, 0x83, 0x5f, 0xa0, 0x78, 0x54, 0xa6, 0x7e, 0x5a, 0xaa, 0x81, 0x5e, 0xb1, 0x88, 0x62, 0xc2, 0x98, 0x70, 0xba, 0x91, 0x6b, 0xb2, 0x89, 0x64, 0xa0, 0x77, 0x55, 0x9b, 0x73, 0x51, 0x96, 0x71, 0x52, 0x8c, 0x6c, 0x51, 0xaf, 0x8e, 0x6f, 0xa8, 0x87, 0x68, 0xac, 0x8b, 0x6c, 0xa1, 0x80, 0x61, 0x8c, 0x6c, 0x51, 0x7a, 0x5b, 0x3f, 0x5a, 0x3e, 0x25, 0x69, 0x4d, 0x34, 0x4d, 0x35, 0x1f, 0x45, 0x2c, 0x17, 0x3e, 0x25, 0x10, 0x37, 0x1d, 0x0e, 0x54, 0x3a, 0x24, 0x47, 0x2d, 0x16, 0x50, 0x35, 0x1d, 0x5a, 0x3e, 0x25, 0x57, 0x3c, 0x24, 0x54, 0x38, 0x20, 0x68, 0x49, 0x2e, 0x54, 0x35, 0x1a, 0x72, 0x53, 0x38, 0x66, 0x44, 0x2b, 0x7e, 0x5c, 0x43, 0x72, 0x52, 0x38, 0x72, 0x53, 0x38, 0x8b, 0x6b, 0x4f, 0x66, 0x4a, 0x30, 0x7d, 0x5c, 0x40, 0x7e, 0x5d, 0x40, 0xa6, 0x83, 0x63, 0x9f, 0x7c, 0x5c, 0x8b, 0x6c, 0x52, 0x94, 0x71, 0x54, 0x8d, 0x6e, 0x4e, 0x96, 0x72, 0x51, 0x96, 0x6e, 0x4b, 0xa2, 0x7b, 0x53, 0xb5, 0x8d, 0x64, 0xba, 0x90, 0x6a, 0x91, 0x68, 0x42, 0xa9, 0x81, 0x5c, 0x9e, 0x75, 0x4f, 0xba, 0x8f, 0x68, 0xac, 0x86, 0x62, 0x92, 0x6f, 0x4e, 0xc1, 0x9f, 0x79, 0x97, 0x74, 0x50, 0xb7, 0x94, 0x70, 0xcc, 0xab, 0x81, 0xb3, 0x91, 0x68, 0xba, 0x95, 0x6b, 0xc3, 0x9d, 0x73, 0xa3, 0x83, 0x5e, 0x80, 0x64, 0x42, 0xaa, 0x8c, 0x66, 0x73, 0x56, 0x40, 0x8e, 0x72, 0x55, 0x69, 0x4f, 0x38, 0x59, 0x44, 0x31, 0x68, 0x4f, 0x38, 0x5c, 0x42, 0x2f, 0x35, 0x25, 0x1c, 0x54, 0x41, 0x30, 0x44, 0x31, 0x23, 0x55, 0x3e, 0x2e, 0x51, 0x40, 0x34, 0x76, 0x6b, 0x5d, 0x93, 0x8a, 0x81, 0xa5, 0xa1, 0x9c, 0xc7, 0xc7, 0xc3, 0xcf, 0xcf, 0xcb, 0xed, 0xee, 0xec, 0xfb, 0xfb, 0xf9, 0xfb, 0xfa, 0xfa, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xef, 0xef, 0xed, 0xf3, 0xf4, 0xf1, 0xe4, 0xe4, 0xe2, 0xd3, 0xd3, 0xd1, 0xaa, 0xaa, 0xa8, 0x8e, 0x89, 0x83, 0x8b, 0x84, 0x7f, 0x58, 0x4c, 0x43, 0x46, 0x37, 0x30, 0x47, 0x38, 0x31, 0x3a, 0x2f, 0x27, 0x2b, 0x20, 0x18, 0x2c, 0x1e, 0x15, 0x1a, 0x0f, 0x0b, 0x18, 0x0c, 0x08, 0x21, 0x12, 0x0c, 0x0d, 0x05, 0x03, 0x1d, 0x12, 0x0c, 0x13, 0x0b, 0x03, 0x1e, 0x0f, 0x09, 0x06, 0x03, 0x01, 0x20, 0x17, 0x0c, 0x16, 0x0d, 0x09, 0x13, 0x06, 0x00, 0x0b, 0x03, 0x02, 0x2a, 0x1d, 0x15, 0x0c, 0x07, 0x03, 0x26, 0x1c, 0x14, 0x24, 0x1a, 0x0f, 0x1a, 0x11, 0x08, 0x50, 0x3a, 0x27, 0x4a, 0x38, 0x25, 0x5d, 0x47, 0x2f, 0x45, 0x30, 0x1d, 0x6a, 0x4e, 0x35, 0x7b, 0x62, 0x48, 0x97, 0x75, 0x54, 0xa7, 0x83, 0x5f, 0xa9, 0x85, 0x61, 0xa8, 0x81, 0x5d, 0xa3, 0x7b, 0x57, 0xb2, 0x89, 0x66, 0xb3, 0x89, 0x63, 0xc1, 0x98, 0x6f, 0xb3, 0x89, 0x63, 0xb5, 0x8b, 0x66, 0xa3, 0x7a, 0x58, 0xa2, 0x79, 0x57, 0x94, 0x71, 0x51, 0x80, 0x60, 0x45, 0xae, 0x8d, 0x6e, 0xab, 0x8a, 0x6c, 0xa2, 0x81, 0x62, 0x9e, 0x7d, 0x5e, 0x8b, 0x6c, 0x51, 0x74, 0x55, 0x39, 0x5a, 0x3e, 0x26, 0x77, 0x5b, 0x42, 0x4b, 0x33, 0x1d, 0x49, 0x30, 0x1b, 0x42, 0x2a, 0x10, 0x44, 0x2c, 0x18, 0x5b, 0x41, 0x29, 0x4e, 0x33, 0x1c, 0x4f, 0x34, 0x1c, 0x5a, 0x3e, 0x25, 0x57, 0x3c, 0x24, 0x59, 0x3d, 0x25, 0x61, 0x41, 0x26, 0x6d, 0x4d, 0x32, 0x75, 0x55, 0x3a, 0x7c, 0x5b, 0x3c, 0x83, 0x62, 0x44, 0x79, 0x59, 0x3e, 0x7f, 0x5f, 0x44, 0x88, 0x68, 0x4c, 0x6c, 0x50, 0x36, 0x7a, 0x59, 0x3c, 0x82, 0x60, 0x44, 0x9f, 0x7c, 0x5c, 0xa1, 0x7e, 0x5e, 0x7c, 0x5e, 0x44, 0x95, 0x71, 0x55, 0x83, 0x64, 0x44, 0x94, 0x71, 0x4f, 0x8a, 0x62, 0x41, 0x9e, 0x76, 0x52, 0xaf, 0x86, 0x60, 0xc2, 0x98, 0x72, 0x99, 0x70, 0x4a, 0xa2, 0x7a, 0x56, 0xa4, 0x7c, 0x56, 0xba, 0x94, 0x6b, 0x96, 0x74, 0x4f, 0x83, 0x65, 0x46, 0x9d, 0x7f, 0x5b, 0xa4, 0x82, 0x5e, 0xa9, 0x87, 0x63, 0xb3, 0x91, 0x6c, 0xb1, 0x8f, 0x6a, 0xb7, 0x94, 0x6c, 0xb4, 0x92, 0x6a, 0x9b, 0x7b, 0x59, 0x81, 0x65, 0x47, 0x95, 0x75, 0x5b, 0x83, 0x67, 0x4a, 0x73, 0x5a, 0x3f, 0x64, 0x4d, 0x3a, 0x5e, 0x48, 0x35, 0x4b, 0x37, 0x24, 0x55, 0x3f, 0x2c, 0x2f, 0x1f, 0x16, 0x3c, 0x28, 0x1d, 0x3a, 0x29, 0x20, 0x4e, 0x38, 0x2a, 0x4f, 0x3d, 0x31, 0x64, 0x58, 0x4a, 0x97, 0x8f, 0x86, 0xac, 0xa8, 0xa3, 0xbd, 0xbe, 0xba, 0xd6, 0xd6, 0xd2, 0xe9, 0xea, 0xe8, 0xfa, 0xfb, 0xf9, 0xfd, 0xfd, 0xfd, 0xfe, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xfa, 0xf9, 0xf6, 0xf6, 0xf4, 0xf3, 0xf3, 0xf1, 0xe2, 0xe0, 0xdf, 0xbe, 0xbd, 0xbb, 0xa2, 0xa0, 0x9c, 0x9a, 0x93, 0x91, 0x68, 0x5c, 0x57, 0x5b, 0x50, 0x49, 0x48, 0x3d, 0x37, 0x3d, 0x32, 0x2c, 0x3a, 0x2e, 0x24, 0x2b, 0x20, 0x1a, 0x1f, 0x11, 0x0a, 0x12, 0x07, 0x01, 0x0a, 0x06, 0x03, 0x1c, 0x12, 0x0c, 0x11, 0x0a, 0x03, 0x20, 0x16, 0x0e, 0x12, 0x0a, 0x04, 0x15, 0x0a, 0x03, 0x0e, 0x07, 0x01, 0x21, 0x15, 0x0a, 0x12, 0x0a, 0x05, 0x13, 0x09, 0x04, 0x0c, 0x04, 0x00, 0x2b, 0x1b, 0x12, 0x20, 0x18, 0x10, 0x17, 0x11, 0x08, 0x17, 0x0d, 0x09, 0x1e, 0x14, 0x0d, 0x4b, 0x38, 0x26, 0x3e, 0x2b, 0x1e, 0x48, 0x34, 0x20, 0x5b, 0x48, 0x31, 0x61, 0x4a, 0x2e, 0x73, 0x5b, 0x41, 0x87, 0x68, 0x4a, 0x90, 0x6e, 0x4c, 0xa9, 0x83, 0x5e, 0xa5, 0x80, 0x5d, 0xa5, 0x80, 0x5a, 0xb7, 0x8e, 0x69, 0xad, 0x83, 0x5d, 0xc4, 0x9b, 0x75, 0xae, 0x86, 0x62, 0xa9, 0x81, 0x5d, 0xad, 0x85, 0x61, 0xb1, 0x89, 0x65, 0xa0, 0x7d, 0x5c, 0x92, 0x71, 0x52, 0x8e, 0x6b, 0x4d, 0xb1, 0x8e, 0x6f, 0x82, 0x61, 0x42, 0x9e, 0x7d, 0x5e, 0x8c, 0x6c, 0x51, 0x71, 0x51, 0x36, 0x54, 0x38, 0x20, 0x80, 0x64, 0x4c, 0x45, 0x2c, 0x17, 0x4a, 0x31, 0x1b, 0x45, 0x2c, 0x15, 0x4b, 0x32, 0x1d, 0x61, 0x47, 0x30, 0x56, 0x3b, 0x24, 0x51, 0x35, 0x1e, 0x61, 0x45, 0x2d, 0x5f, 0x42, 0x2a, 0x63, 0x44, 0x2b, 0x76, 0x56, 0x39, 0x69, 0x47, 0x2a, 0x7b, 0x5a, 0x3d, 0x7e, 0x5b, 0x3d, 0x7e, 0x5b, 0x3d, 0x77, 0x56, 0x39, 0x79, 0x58, 0x3b, 0x89, 0x67, 0x49, 0x72, 0x54, 0x3b, 0x80, 0x61, 0x43, 0x94, 0x72, 0x53, 0x96, 0x73, 0x53, 0x96, 0x74, 0x53, 0x86, 0x67, 0x4b, 0x8d, 0x6c, 0x4f, 0x95, 0x72, 0x54, 0x9e, 0x7a, 0x5b, 0x84, 0x60, 0x40, 0x97, 0x6f, 0x4b, 0xb0, 0x89, 0x66, 0xc0, 0x95, 0x72, 0xa3, 0x79, 0x56, 0x93, 0x6f, 0x4b, 0xa6, 0x7d, 0x59, 0xae, 0x87, 0x61, 0x90, 0x6f, 0x4f, 0x7c, 0x5d, 0x3f, 0x8d, 0x6e, 0x4e, 0xa6, 0x84, 0x5d, 0x92, 0x73, 0x54, 0xa5, 0x84, 0x64, 0xa0, 0x80, 0x5f, 0xb0, 0x8c, 0x66, 0xb5, 0x93, 0x6f, 0x78, 0x5c, 0x40, 0x76, 0x58, 0x3b, 0x65, 0x4a, 0x2f, 0x7a, 0x61, 0x42, 0x6b, 0x52, 0x3d, 0x69, 0x51, 0x40, 0x5b, 0x43, 0x30, 0x4a, 0x37, 0x27, 0x40, 0x30, 0x20, 0x3f, 0x31, 0x20, 0x3f, 0x2e, 0x1f, 0x33, 0x22, 0x16, 0x3b, 0x2c, 0x22, 0x55, 0x43, 0x38, 0x66, 0x5a, 0x50, 0x80, 0x79, 0x6f, 0xbc, 0xb9, 0xb4, 0xcd, 0xcc, 0xc6, 0xc9, 0xc8, 0xc6, 0xf4, 0xf4, 0xf2, 0xf3, 0xf3, 0xf1, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfa, 0xee, 0xee, 0xec, 0xd7, 0xd6, 0xd1, 0xb7, 0xb6, 0xb1, 0xc0, 0xbd, 0xbb, 0x7a, 0x73, 0x6d, 0x72, 0x69, 0x62, 0x5b, 0x51, 0x4a, 0x44, 0x3b, 0x34, 0x42, 0x39, 0x32, 0x39, 0x2b, 0x23, 0x1c, 0x11, 0x0e, 0x1f, 0x10, 0x0b, 0x22, 0x17, 0x10, 0x0c, 0x06, 0x04, 0x13, 0x08, 0x04, 0x1e, 0x14, 0x10, 0x17, 0x0d, 0x0a, 0x0c, 0x03, 0x00, 0x12, 0x09, 0x04, 0x18, 0x0c, 0x05, 0x1b, 0x10, 0x06, 0x1f, 0x15, 0x10, 0x1a, 0x0e, 0x08, 0x1a, 0x0e, 0x08, 0x20, 0x12, 0x0c, 0x18, 0x11, 0x08, 0x0d, 0x07, 0x00, 0x1a, 0x14, 0x10, 0x0e, 0x06, 0x03, 0x35, 0x25, 0x15, 0x4a, 0x35, 0x26, 0x34, 0x20, 0x11, 0x4f, 0x3c, 0x28, 0x5d, 0x45, 0x2c, 0x58, 0x41, 0x28, 0x77, 0x5c, 0x40, 0x82, 0x63, 0x44, 0xa1, 0x7d, 0x5b, 0xa4, 0x81, 0x5e, 0xa9, 0x84, 0x5f, 0xbc, 0x93, 0x6c, 0xb8, 0x8e, 0x68, 0xba, 0x91, 0x6b, 0xb5, 0x8d, 0x68, 0xa2, 0x7a, 0x55, 0xab, 0x83, 0x5f, 0xb8, 0x90, 0x6c, 0x96, 0x75, 0x53, 0x97, 0x74, 0x55, 0x87, 0x64, 0x46, 0xa8, 0x85, 0x67, 0x73, 0x52, 0x33, 0x9f, 0x7e, 0x5f, 0x82, 0x62, 0x47, 0x74, 0x55, 0x39, 0x61, 0x45, 0x2c, 0x7e, 0x62, 0x4a, 0x45, 0x2c, 0x16, 0x53, 0x3b, 0x25, 0x39, 0x21, 0x0b, 0x50, 0x38, 0x22, 0x65, 0x4b, 0x34, 0x59, 0x3f, 0x27, 0x5a, 0x3f, 0x27, 0x63, 0x47, 0x2e, 0x69, 0x4b, 0x33, 0x6c, 0x4c, 0x32, 0x6b, 0x4c, 0x2e, 0x70, 0x4f, 0x32, 0x78, 0x57, 0x3a, 0x88, 0x65, 0x47, 0x88, 0x65, 0x46, 0x8a, 0x69, 0x4c, 0x78, 0x56, 0x3a, 0x99, 0x76, 0x56, 0x72, 0x54, 0x36, 0x86, 0x68, 0x4b, 0x92, 0x6f, 0x4f, 0xa9, 0x86, 0x66, 0x99, 0x76, 0x56, 0x99, 0x7a, 0x5c, 0x89, 0x69, 0x4c, 0x88, 0x69, 0x4a, 0x9a, 0x7a, 0x5b, 0x7e, 0x5c, 0x3c, 0x9e, 0x76, 0x51, 0xa7, 0x82, 0x60, 0xa9, 0x82, 0x5e, 0xb9, 0x93, 0x6e, 0x7b, 0x5d, 0x37, 0xa7, 0x80, 0x5c, 0x95, 0x71, 0x4d, 0x74, 0x58, 0x3b, 0x59, 0x3d, 0x21, 0x7f, 0x63, 0x48, 0x8f, 0x72, 0x4f, 0x90, 0x72, 0x54, 0x98, 0x7d, 0x5e, 0x87, 0x6c, 0x4d, 0xa1, 0x7f, 0x5a, 0xa0, 0x82, 0x61, 0x77, 0x5d, 0x41, 0x69, 0x4e, 0x33, 0x72, 0x58, 0x3e, 0x6d, 0x53, 0x39, 0x64, 0x4c, 0x32, 0x73, 0x5c, 0x42, 0x5e, 0x44, 0x2f, 0x3b, 0x27, 0x18, 0x31, 0x22, 0x19, 0x38, 0x27, 0x1f, 0x38, 0x26, 0x1d, 0x3c, 0x2a, 0x1e, 0x3e, 0x2c, 0x20, 0x4c, 0x3a, 0x31, 0x74, 0x68, 0x60, 0x7f, 0x77, 0x6d, 0xad, 0xa9, 0xa4, 0xbb, 0xba, 0xb4, 0xc6, 0xc4, 0xc2, 0xee, 0xee, 0xec, 0xf7, 0xf8, 0xf6, 0xf9, 0xf9, 0xf9, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfb, 0xf2, 0xf3, 0xf0, 0xd6, 0xd7, 0xd4, 0xdb, 0xdb, 0xd6, 0xca, 0xca, 0xc4, 0x92, 0x8d, 0x8d, 0x7a, 0x72, 0x6a, 0x74, 0x6e, 0x67, 0x52, 0x4c, 0x45, 0x54, 0x4b, 0x46, 0x48, 0x3d, 0x35, 0x36, 0x28, 0x1f, 0x20, 0x14, 0x0e, 0x21, 0x13, 0x0e, 0x15, 0x0b, 0x05, 0x07, 0x01, 0x00, 0x1a, 0x0f, 0x0a, 0x16, 0x0e, 0x0b, 0x16, 0x0c, 0x09, 0x13, 0x08, 0x02, 0x15, 0x0b, 0x06, 0x23, 0x17, 0x0f, 0x1b, 0x10, 0x09, 0x18, 0x11, 0x0b, 0x23, 0x12, 0x07, 0x2a, 0x19, 0x0b, 0x0e, 0x04, 0x00, 0x0f, 0x09, 0x03, 0x13, 0x09, 0x01, 0x0a, 0x07, 0x03, 0x0a, 0x06, 0x05, 0x2d, 0x20, 0x15, 0x48, 0x33, 0x22, 0x28, 0x15, 0x0a, 0x3f, 0x2a, 0x19, 0x5a, 0x43, 0x2f, 0x53, 0x3e, 0x29, 0x69, 0x52, 0x3a, 0x72, 0x56, 0x39, 0x8d, 0x6d, 0x4d, 0x9f, 0x7c, 0x5b, 0xa7, 0x83, 0x5e, 0xba, 0x91, 0x6a, 0xb5, 0x8b, 0x64, 0xad, 0x84, 0x5e, 0xa8, 0x81, 0x5c, 0xad, 0x86, 0x60, 0x9b, 0x72, 0x50, 0xc1, 0x9a, 0x75, 0x83, 0x62, 0x42, 0xa2, 0x7f, 0x5e, 0x8c, 0x69, 0x4a, 0xa6, 0x83, 0x64, 0x77, 0x56, 0x38, 0xa3, 0x82, 0x62, 0x83, 0x64, 0x47, 0x75, 0x55, 0x39, 0x6d, 0x50, 0x36, 0x7c, 0x5f, 0x45, 0x47, 0x2e, 0x17, 0x45, 0x2e, 0x18, 0x50, 0x36, 0x20, 0x4b, 0x32, 0x1b, 0x62, 0x48, 0x30, 0x61, 0x46, 0x2e, 0x64, 0x49, 0x30, 0x69, 0x4d, 0x33, 0x5c, 0x3e, 0x25, 0x74, 0x54, 0x3a, 0x6e, 0x4e, 0x31, 0x6c, 0x4c, 0x2f, 0x7c, 0x5c, 0x3f, 0x84, 0x61, 0x42, 0x93, 0x70, 0x51, 0x85, 0x62, 0x45, 0x82, 0x60, 0x42, 0xa3, 0x80, 0x5c, 0x75, 0x56, 0x36, 0x7b, 0x5e, 0x41, 0x8e, 0x6c, 0x4c, 0xaf, 0x8d, 0x6a, 0x97, 0x75, 0x54, 0xa4, 0x83, 0x64, 0x78, 0x59, 0x3b, 0x8c, 0x70, 0x52, 0x90, 0x72, 0x52, 0x88, 0x67, 0x47, 0xb0, 0x88, 0x63, 0xa4, 0x80, 0x5c, 0x9f, 0x7b, 0x57, 0xb7, 0x93, 0x6f, 0x7e, 0x61, 0x3e, 0x90, 0x6e, 0x49, 0x9a, 0x79, 0x58, 0x61, 0x49, 0x2e, 0x64, 0x4a, 0x30, 0x6a, 0x4f, 0x38, 0x89, 0x6e, 0x50, 0x9b, 0x7e, 0x61, 0x69, 0x53, 0x39, 0x74, 0x5b, 0x3f, 0x8f, 0x71, 0x50, 0x84, 0x68, 0x4c, 0x76, 0x5d, 0x43, 0x64, 0x4e, 0x38, 0x62, 0x47, 0x2f, 0x49, 0x30, 0x1a, 0x53, 0x3a, 0x24, 0x55, 0x3f, 0x2d, 0x55, 0x3d, 0x29, 0x49, 0x34, 0x25, 0x41, 0x2f, 0x24, 0x3a, 0x29, 0x1e, 0x33, 0x24, 0x1b, 0x37, 0x26, 0x1c, 0x46, 0x32, 0x25, 0x59, 0x48, 0x3e, 0x6f, 0x61, 0x59, 0x70, 0x68, 0x60, 0xae, 0xaa, 0xa4, 0xc9, 0xc9, 0xc3, 0xd2, 0xd2, 0xcf, 0xe0, 0xe0, 0xde, 0xf7, 0xf7, 0xf5, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfa, 0xfa, 0xfa, 0xe7, 0xe7, 0xe5, 0xea, 0xea, 0xe8, 0xd9, 0xda, 0xd7, 0xc7, 0xc7, 0xc5, 0x92, 0x8e, 0x8a, 0x87, 0x7e, 0x76, 0x6e, 0x66, 0x61, 0x59, 0x52, 0x4c, 0x46, 0x3c, 0x37, 0x3f, 0x33, 0x2b, 0x31, 0x22, 0x19, 0x25, 0x17, 0x0d, 0x21, 0x14, 0x0d, 0x12, 0x0a, 0x07, 0x0c, 0x07, 0x03, 0x17, 0x0d, 0x05, 0x14, 0x0e, 0x0a, 0x17, 0x0d, 0x05, 0x1d, 0x10, 0x05, 0x18, 0x0d, 0x04, 0x24, 0x18, 0x0e, 0x0f, 0x05, 0x02, 0x0f, 0x08, 0x01, 0x41, 0x2c, 0x1f, 0x43, 0x2f, 0x1a, 0x0b, 0x04, 0x00, 0x0d, 0x06, 0x03, 0x13, 0x08, 0x00, 0x0b, 0x06, 0x04, 0x09, 0x05, 0x04, 0x22, 0x15, 0x0c, 0x38, 0x24, 0x16, 0x1f, 0x10, 0x06, 0x36, 0x23, 0x12, 0x4c, 0x39, 0x28, 0x58, 0x42, 0x2d, 0x52, 0x3b, 0x27, 0x62, 0x48, 0x2f, 0x83, 0x65, 0x46, 0xa4, 0x80, 0x60, 0x9e, 0x7a, 0x57, 0xb7, 0x90, 0x69, 0xb3, 0x8a, 0x62, 0xa6, 0x7e, 0x59, 0xa0, 0x7c, 0x58, 0xb3, 0x8f, 0x66, 0x9f, 0x76, 0x58, 0xbf, 0x9c, 0x76, 0x7b, 0x5b, 0x3b, 0x9f, 0x7a, 0x57, 0x9c, 0x79, 0x59, 0xa0, 0x7d, 0x5d, 0x83, 0x62, 0x46, 0xa0, 0x7f, 0x5d, 0x80, 0x61, 0x44, 0x78, 0x59, 0x3b, 0x6b, 0x4b, 0x30, 0x7f, 0x60, 0x45, 0x5c, 0x41, 0x27, 0x44, 0x30, 0x1b, 0x5b, 0x3f, 0x27, 0x5c, 0x40, 0x27, 0x65, 0x49, 0x30, 0x70, 0x54, 0x3b, 0x64, 0x4b, 0x2f, 0x6c, 0x50, 0x33, 0x6e, 0x4e, 0x33, 0x6b, 0x4b, 0x30, 0x71, 0x51, 0x35, 0x69, 0x4a, 0x2c, 0x76, 0x57, 0x39, 0x8e, 0x6b, 0x4b, 0x9c, 0x76, 0x57, 0x8a, 0x67, 0x48, 0x8d, 0x6a, 0x4b, 0x9d, 0x78, 0x55, 0x80, 0x5f, 0x3f, 0x7b, 0x5f, 0x44, 0x87, 0x67, 0x49, 0xac, 0x8b, 0x64, 0x8c, 0x6a, 0x48, 0xa0, 0x7c, 0x5a, 0x7d, 0x5e, 0x40, 0x89, 0x6d, 0x52, 0x84, 0x65, 0x48, 0x76, 0x55, 0x38, 0x8e, 0x69, 0x46, 0xad, 0x88, 0x62, 0xa0, 0x7c, 0x58, 0xb2, 0x8d, 0x6a, 0x6e, 0x51, 0x33, 0x7c, 0x5c, 0x3a, 0x90, 0x6f, 0x4f, 0x65, 0x4d, 0x35, 0x72, 0x58, 0x3d, 0x59, 0x3f, 0x2a, 0x99, 0x7c, 0x5e, 0x7d, 0x64, 0x4b, 0x46, 0x32, 0x1f, 0x67, 0x50, 0x35, 0x6d, 0x54, 0x3c, 0x85, 0x6b, 0x4f, 0x59, 0x43, 0x2e, 0x48, 0x32, 0x1d, 0x6a, 0x50, 0x38, 0x48, 0x34, 0x21, 0x5a, 0x40, 0x29, 0x33, 0x22, 0x14, 0x40, 0x2a, 0x18, 0x47, 0x2f, 0x22, 0x49, 0x32, 0x24, 0x48, 0x35, 0x2a, 0x31, 0x21, 0x18, 0x42, 0x32, 0x29, 0x3c, 0x2b, 0x23, 0x5b, 0x4d, 0x44, 0x69, 0x5a, 0x51, 0x7d, 0x75, 0x6f, 0x98, 0x94, 0x8d, 0xcf, 0xcf, 0xcb, 0xda, 0xda, 0xd6, 0xe7, 0xe8, 0xe5, 0xe4, 0xe4, 0xe2, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf3, 0xf3, 0xf2, 0xed, 0xed, 0xeb, 0xeb, 0xec, 0xe9, 0xde, 0xdf, 0xdd, 0xa7, 0xa7, 0xa5, 0x66, 0x67, 0x61, 0x81, 0x7d, 0x74, 0x5f, 0x58, 0x52, 0x48, 0x41, 0x3b, 0x54, 0x46, 0x3e, 0x36, 0x2c, 0x28, 0x2e, 0x1f, 0x16, 0x26, 0x18, 0x0f, 0x1c, 0x10, 0x08, 0x0f, 0x05, 0x03, 0x0f, 0x0a, 0x06, 0x16, 0x0c, 0x04, 0x18, 0x0d, 0x04, 0x1b, 0x12, 0x0b, 0x1e, 0x12, 0x08, 0x26, 0x17, 0x0a, 0x26, 0x1b, 0x10, 0x0f, 0x06, 0x04, 0x1d, 0x11, 0x06, 0x2e, 0x1a, 0x0c, 0x49, 0x35, 0x20, 0x16, 0x0e, 0x0a, 0x11, 0x08, 0x05, 0x1c, 0x11, 0x08, 0x09, 0x04, 0x02, 0x0a, 0x06, 0x05, 0x1c, 0x0f, 0x06, 0x27, 0x18, 0x0e, 0x20, 0x13, 0x0e, 0x2d, 0x20, 0x10, 0x32, 0x24, 0x15, 0x4e, 0x37, 0x23, 0x45, 0x2e, 0x1a, 0x39, 0x29, 0x16, 0x79, 0x5d, 0x40, 0x9e, 0x79, 0x59, 0x93, 0x6f, 0x4c, 0xbc, 0x95, 0x6e, 0xb2, 0x88, 0x60, 0xa7, 0x7f, 0x5a, 0x8f, 0x6b, 0x46, 0xac, 0x89, 0x60, 0x91, 0x6d, 0x4d, 0xae, 0x91, 0x69, 0x86, 0x67, 0x47, 0x98, 0x72, 0x50, 0x9a, 0x77, 0x57, 0xa0, 0x7d, 0x5d, 0x85, 0x63, 0x48, 0xa2, 0x81, 0x5f, 0x8b, 0x6c, 0x4e, 0x71, 0x52, 0x34, 0x67, 0x47, 0x2c, 0x77, 0x58, 0x3c, 0x5c, 0x41, 0x27, 0x57, 0x42, 0x2d, 0x65, 0x49, 0x30, 0x5a, 0x3e, 0x26, 0x77, 0x5b, 0x43, 0x72, 0x56, 0x3e, 0x5c, 0x43, 0x27, 0x6d, 0x51, 0x34, 0x79, 0x59, 0x3e, 0x76, 0x57, 0x3b, 0x78, 0x59, 0x3d, 0x6b, 0x4c, 0x2e, 0x83, 0x64, 0x46, 0xa2, 0x80, 0x60, 0x93, 0x6d, 0x4e, 0x8d, 0x6b, 0x47, 0x9c, 0x7a, 0x55, 0x98, 0x74, 0x52, 0x87, 0x67, 0x47, 0x75, 0x5a, 0x3e, 0x8b, 0x6a, 0x4c, 0x9e, 0x7b, 0x59, 0x91, 0x6d, 0x51, 0xac, 0x89, 0x67, 0x6d, 0x4e, 0x30, 0x83, 0x67, 0x4c, 0x83, 0x63, 0x46, 0x76, 0x57, 0x3b, 0x76, 0x56, 0x35, 0x9f, 0x7c, 0x57, 0xaa, 0x86, 0x62, 0xa2, 0x80, 0x5b, 0x6d, 0x54, 0x3a, 0x72, 0x55, 0x3c, 0x97, 0x77, 0x57, 0x58, 0x40, 0x28, 0x58, 0x3e, 0x23, 0x75, 0x5b, 0x46, 0x8f, 0x76, 0x5c, 0x5e, 0x48, 0x33, 0x3b, 0x26, 0x19, 0x5b, 0x43, 0x2d, 0x5a, 0x45, 0x2f, 0x66, 0x50, 0x37, 0x61, 0x4b, 0x36, 0x54, 0x3d, 0x29, 0x45, 0x2e, 0x1a, 0x43, 0x32, 0x22, 0x53, 0x39, 0x28, 0x28, 0x17, 0x0e, 0x42, 0x2c, 0x1b, 0x4d, 0x35, 0x27, 0x4d, 0x34, 0x26, 0x62, 0x4b, 0x3c, 0x3d, 0x2b, 0x1f, 0x34, 0x23, 0x1b, 0x46, 0x36, 0x2d, 0x5e, 0x4f, 0x46, 0x65, 0x57, 0x4e, 0x97, 0x8e, 0x89, 0x9e, 0x9b, 0x94, 0xc8, 0xc8, 0xc4, 0xd1, 0xd2, 0xce, 0xea, 0xeb, 0xe8, 0xef, 0xef, 0xed, 0xf5, 0xf5, 0xf5, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xed, 0xed, 0xec, 0xe6, 0xe6, 0xe4, 0xd7, 0xd7, 0xd5, 0xb9, 0xb8, 0xb4, 0x9f, 0x9e, 0x9a, 0x94, 0x8f, 0x8d, 0x80, 0x7b, 0x78, 0x64, 0x60, 0x57, 0x57, 0x4e, 0x47, 0x4d, 0x45, 0x3b, 0x31, 0x29, 0x20, 0x2e, 0x20, 0x15, 0x21, 0x12, 0x0c, 0x1a, 0x0f, 0x08, 0x1b, 0x11, 0x0b, 0x19, 0x0e, 0x09, 0x17, 0x0c, 0x06, 0x1c, 0x0f, 0x06, 0x1e, 0x13, 0x0d, 0x26, 0x18, 0x0f, 0x35, 0x23, 0x15, 0x25, 0x17, 0x0c, 0x10, 0x07, 0x00, 0x1f, 0x15, 0x0d, 0x1c, 0x14, 0x07, 0x22, 0x13, 0x08, 0x0c, 0x04, 0x02, 0x15, 0x0b, 0x04, 0x1f, 0x11, 0x0c, 0x08, 0x03, 0x02, 0x05, 0x03, 0x01, 0x17, 0x0b, 0x07, 0x17, 0x0b, 0x04, 0x15, 0x0a, 0x03, 0x1b, 0x0d, 0x04, 0x28, 0x1c, 0x0f, 0x48, 0x33, 0x21, 0x45, 0x2f, 0x1e, 0x1b, 0x0f, 0x05, 0x68, 0x53, 0x34, 0x83, 0x65, 0x44, 0x96, 0x75, 0x52, 0xad, 0x88, 0x63, 0xb6, 0x91, 0x66, 0xa1, 0x7c, 0x59, 0x9a, 0x77, 0x56, 0xab, 0x89, 0x64, 0x8d, 0x6a, 0x4a, 0xa7, 0x85, 0x64, 0x97, 0x75, 0x52, 0x9b, 0x78, 0x59, 0x8b, 0x68, 0x48, 0x9c, 0x7a, 0x59, 0x8a, 0x67, 0x49, 0xa3, 0x80, 0x62, 0x88, 0x69, 0x4d, 0x72, 0x52, 0x37, 0x77, 0x58, 0x3b, 0x80, 0x61, 0x43, 0x5c, 0x43, 0x26, 0x64, 0x4a, 0x34, 0x5e, 0x42, 0x26, 0x69, 0x4e, 0x32, 0x6e, 0x52, 0x36, 0x7c, 0x60, 0x44, 0x5f, 0x44, 0x28, 0x6a, 0x4f, 0x32, 0x6e, 0x50, 0x33, 0x79, 0x5a, 0x3c, 0x7a, 0x5b, 0x3e, 0x7f, 0x5f, 0x44, 0x76, 0x56, 0x3b, 0xa3, 0x7e, 0x5b, 0x91, 0x70, 0x4f, 0x92, 0x70, 0x4f, 0x95, 0x72, 0x51, 0x9a, 0x77, 0x51, 0x89, 0x6c, 0x49, 0x83, 0x64, 0x47, 0x8c, 0x6d, 0x4f, 0x98, 0x79, 0x57, 0x9f, 0x7f, 0x60, 0xa0, 0x81, 0x5d, 0x6b, 0x4c, 0x2c, 0x69, 0x50, 0x38, 0x87, 0x68, 0x47, 0x7c, 0x62, 0x45, 0x7e, 0x5f, 0x41, 0x95, 0x73, 0x50, 0x9c, 0x79, 0x55, 0x8d, 0x6c, 0x47, 0x82, 0x66, 0x48, 0x5e, 0x45, 0x32, 0x8d, 0x71, 0x54, 0x60, 0x4b, 0x32, 0x54, 0x3e, 0x27, 0x79, 0x5f, 0x45, 0x5f, 0x4a, 0x32, 0x4c, 0x3b, 0x27, 0x4a, 0x39, 0x28, 0x5e, 0x47, 0x33, 0x44, 0x30, 0x1f, 0x3e, 0x2a, 0x19, 0x45, 0x33, 0x25, 0x63, 0x4f, 0x38, 0x3f, 0x2d, 0x1e, 0x53, 0x3f, 0x2e, 0x49, 0x34, 0x20, 0x3d, 0x2c, 0x21, 0x33, 0x24, 0x1b, 0x5c, 0x43, 0x29, 0x58, 0x3d, 0x2c, 0x65, 0x4d, 0x36, 0x4d, 0x39, 0x2d, 0x3f, 0x2f, 0x23, 0x47, 0x36, 0x2a, 0x5c, 0x4a, 0x3f, 0x75, 0x6a, 0x5c, 0x7b, 0x74, 0x6b, 0xa3, 0xa0, 0x9a, 0xac, 0xaa, 0xa7, 0xdc, 0xdb, 0xd7, 0xe9, 0xe9, 0xe7, 0xf6, 0xf7, 0xf5, 0xf5, 0xf5, 0xf5, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf8, 0xec, 0xed, 0xec, 0xdc, 0xdd, 0xdb, 0xd4, 0xd5, 0xd2, 0xcb, 0xca, 0xc7, 0xbc, 0xbb, 0xb7, 0x84, 0x7e, 0x7c, 0x74, 0x6e, 0x6c, 0x6b, 0x68, 0x5f, 0x5a, 0x50, 0x4a, 0x47, 0x3a, 0x32, 0x34, 0x26, 0x1f, 0x2b, 0x1d, 0x12, 0x1f, 0x10, 0x0a, 0x25, 0x16, 0x0c, 0x25, 0x16, 0x0c, 0x1a, 0x0f, 0x08, 0x1d, 0x12, 0x0c, 0x19, 0x0f, 0x09, 0x1d, 0x12, 0x0b, 0x24, 0x16, 0x0d, 0x26, 0x19, 0x0e, 0x1e, 0x12, 0x09, 0x14, 0x0b, 0x04, 0x1b, 0x10, 0x0a, 0x1b, 0x12, 0x0a, 0x27, 0x18, 0x12, 0x0e, 0x06, 0x04, 0x16, 0x0c, 0x05, 0x17, 0x0b, 0x06, 0x09, 0x04, 0x03, 0x09, 0x02, 0x02, 0x0f, 0x07, 0x03, 0x11, 0x09, 0x06, 0x0b, 0x03, 0x01, 0x1c, 0x13, 0x0c, 0x15, 0x0c, 0x07, 0x47, 0x34, 0x26, 0x42, 0x2f, 0x20, 0x28, 0x18, 0x0e, 0x4b, 0x36, 0x1d, 0x63, 0x4a, 0x2e, 0x93, 0x76, 0x56, 0x9f, 0x7d, 0x5b, 0xad, 0x8a, 0x62, 0x97, 0x74, 0x54, 0x95, 0x72, 0x51, 0x9f, 0x7c, 0x59, 0x9a, 0x77, 0x57, 0xa1, 0x7e, 0x5e, 0xaa, 0x88, 0x65, 0x83, 0x60, 0x41, 0x8e, 0x6b, 0x4b, 0x97, 0x74, 0x54, 0x8a, 0x67, 0x49, 0x99, 0x76, 0x57, 0x89, 0x6a, 0x4e, 0x79, 0x59, 0x3e, 0x74, 0x55, 0x38, 0x76, 0x57, 0x3a, 0x68, 0x4f, 0x31, 0x60, 0x46, 0x2f, 0x65, 0x4a, 0x2d, 0x6c, 0x51, 0x34, 0x6a, 0x4f, 0x32, 0x7d, 0x61, 0x45, 0x69, 0x4d, 0x31, 0x73, 0x58, 0x3b, 0x66, 0x49, 0x2c, 0x7c, 0x5d, 0x40, 0x7c, 0x5d, 0x3f, 0x7d, 0x5e, 0x43, 0x70, 0x51, 0x36, 0x98, 0x76, 0x55, 0x7e, 0x61, 0x43, 0x96, 0x73, 0x53, 0x98, 0x75, 0x55, 0x98, 0x75, 0x53, 0x86, 0x68, 0x48, 0x91, 0x72, 0x54, 0x8c, 0x6d, 0x4f, 0x7a, 0x5b, 0x3e, 0xa7, 0x88, 0x65, 0x7d, 0x63, 0x44, 0x61, 0x44, 0x2a, 0x7e, 0x65, 0x4f, 0x98, 0x79, 0x58, 0x74, 0x5d, 0x41, 0x6d, 0x52, 0x37, 0x92, 0x74, 0x55, 0x92, 0x74, 0x53, 0x7b, 0x5d, 0x3c, 0x8e, 0x71, 0x55, 0x73, 0x5a, 0x43, 0x7a, 0x5e, 0x45, 0x4b, 0x37, 0x21, 0x58, 0x41, 0x2b, 0x81, 0x66, 0x4c, 0x57, 0x41, 0x2f, 0x44, 0x31, 0x22, 0x59, 0x45, 0x31, 0x3d, 0x2b, 0x1a, 0x2b, 0x1b, 0x0e, 0x36, 0x26, 0x19, 0x34, 0x22, 0x14, 0x60, 0x4c, 0x36, 0x2f, 0x1d, 0x0f, 0x44, 0x2f, 0x1e, 0x4a, 0x36, 0x23, 0x49, 0x33, 0x24, 0x33, 0x26, 0x19, 0x4d, 0x37, 0x25, 0x64, 0x4e, 0x39, 0x56, 0x41, 0x32, 0x52, 0x41, 0x32, 0x45, 0x35, 0x29, 0x50, 0x3f, 0x33, 0x56, 0x44, 0x38, 0x7e, 0x73, 0x65, 0x7d, 0x75, 0x6b, 0xa1, 0x9e, 0x99, 0xb6, 0xb4, 0xb1, 0xca, 0xc8, 0xc5, 0xda, 0xdb, 0xd8, 0xf7, 0xf8, 0xf6, 0xfb, 0xfb, 0xfb, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfa, 0xfa, 0xfb, 0xfb, 0xfa, 0xf5, 0xf5, 0xf3, 0xe4, 0xe4, 0xe2, 0xdc, 0xdd, 0xdb, 0xd0, 0xd0, 0xce, 0xce, 0xce, 0xcc, 0x9c, 0x9d, 0x97, 0x91, 0x8c, 0x85, 0x7f, 0x7b, 0x7a, 0x54, 0x4b, 0x45, 0x47, 0x3b, 0x34, 0x43, 0x34, 0x2b, 0x29, 0x20, 0x15, 0x27, 0x16, 0x0e, 0x23, 0x12, 0x0c, 0x2b, 0x1a, 0x12, 0x25, 0x19, 0x0f, 0x1a, 0x11, 0x0a, 0x15, 0x0c, 0x05, 0x16, 0x0b, 0x06, 0x1e, 0x12, 0x0c, 0x27, 0x1b, 0x13, 0x1a, 0x0f, 0x07, 0x1c, 0x12, 0x0b, 0x0e, 0x08, 0x03, 0x24, 0x17, 0x0c, 0x16, 0x0f, 0x0a, 0x1a, 0x0c, 0x05, 0x13, 0x0b, 0x09, 0x18, 0x0d, 0x07, 0x20, 0x13, 0x0b, 0x0c, 0x05, 0x00, 0x08, 0x03, 0x01, 0x0b, 0x05, 0x01, 0x08, 0x02, 0x02, 0x0a, 0x04, 0x04, 0x15, 0x0c, 0x06, 0x13, 0x08, 0x02, 0x2d, 0x1f, 0x13, 0x34, 0x20, 0x11, 0x21, 0x13, 0x05, 0x34, 0x22, 0x0f, 0x4d, 0x37, 0x1d, 0x95, 0x76, 0x58, 0x88, 0x68, 0x4a, 0xac, 0x89, 0x66, 0x9f, 0x7c, 0x5a, 0x8b, 0x6a, 0x4b, 0xa8, 0x86, 0x65, 0x93, 0x6e, 0x4d, 0x81, 0x60, 0x3f, 0x9a, 0x7a, 0x57, 0x77, 0x57, 0x36, 0x8d, 0x6d, 0x4c, 0x99, 0x78, 0x57, 0x82, 0x61, 0x45, 0x93, 0x72, 0x52, 0x89, 0x69, 0x4a, 0x8d, 0x70, 0x55, 0x7c, 0x5d, 0x3e, 0x75, 0x55, 0x38, 0x73, 0x57, 0x3a, 0x5c, 0x42, 0x2b, 0x61, 0x46, 0x2b, 0x67, 0x48, 0x2b, 0x74, 0x56, 0x3a, 0x81, 0x65, 0x48, 0x6c, 0x54, 0x34, 0x6b, 0x52, 0x36, 0x56, 0x3b, 0x21, 0x79, 0x59, 0x3c, 0x85, 0x65, 0x44, 0x7f, 0x62, 0x46, 0x7f, 0x64, 0x49, 0x82, 0x64, 0x46, 0x73, 0x56, 0x3b, 0x95, 0x75, 0x56, 0x83, 0x63, 0x44, 0xa4, 0x80, 0x5f, 0x6d, 0x4e, 0x35, 0x8a, 0x6b, 0x4f, 0x74, 0x55, 0x37, 0x4a, 0x31, 0x1d, 0xa1, 0x82, 0x61, 0x82, 0x67, 0x48, 0x6b, 0x51, 0x3b, 0x6f, 0x56, 0x3d, 0x80, 0x66, 0x44, 0x73, 0x5b, 0x40, 0x5c, 0x43, 0x2b, 0x8c, 0x6d, 0x4d, 0x85, 0x6b, 0x49, 0x88, 0x69, 0x4a, 0x80, 0x63, 0x46, 0x72, 0x59, 0x3f, 0x7e, 0x65, 0x4a, 0x54, 0x40, 0x2b, 0x53, 0x3f, 0x26, 0x65, 0x50, 0x36, 0x4a, 0x37, 0x25, 0x30, 0x1f, 0x0e, 0x58, 0x43, 0x2e, 0x2a, 0x1c, 0x0d, 0x1b, 0x0d, 0x07, 0x25, 0x13, 0x0a, 0x33, 0x21, 0x15, 0x59, 0x45, 0x2c, 0x29, 0x16, 0x0e, 0x4f, 0x3b, 0x26, 0x4e, 0x3a, 0x27, 0x3f, 0x2a, 0x1a, 0x4d, 0x3a, 0x2a, 0x47, 0x2f, 0x25, 0x58, 0x42, 0x2d, 0x48, 0x37, 0x2c, 0x5d, 0x4a, 0x3b, 0x4e, 0x3e, 0x34, 0x47, 0x37, 0x2c, 0x55, 0x45, 0x38, 0x71, 0x63, 0x56, 0x76, 0x6d, 0x64, 0x8c, 0x86, 0x82, 0xcb, 0xc9, 0xc6, 0xc3, 0xc1, 0xbe, 0xd5, 0xd5, 0xd3, 0xe8, 0xe9, 0xe6, 0xf9, 0xf9, 0xf9, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfa, 0xfa, 0xfa, 0xf8, 0xf8, 0xf8, 0xfb, 0xfb, 0xfa, 0xed, 0xed, 0xeb, 0xeb, 0xec, 0xe9, 0xe1, 0xe1, 0xdf, 0xed, 0xed, 0xeb, 0xae, 0xae, 0xae, 0x9e, 0x9f, 0x99, 0x88, 0x86, 0x7f, 0x63, 0x5c, 0x57, 0x4e, 0x44, 0x40, 0x3f, 0x31, 0x29, 0x31, 0x26, 0x1f, 0x29, 0x1d, 0x17, 0x2b, 0x1a, 0x12, 0x28, 0x17, 0x0f, 0x22, 0x12, 0x09, 0x22, 0x18, 0x0d, 0x19, 0x10, 0x09, 0x13, 0x0b, 0x04, 0x1a, 0x12, 0x0d, 0x17, 0x0b, 0x05, 0x22, 0x16, 0x0e, 0x1e, 0x13, 0x0b, 0x1c, 0x12, 0x0c, 0x09, 0x05, 0x01, 0x2b, 0x1d, 0x10, 0x12, 0x09, 0x06, 0x22, 0x13, 0x0c, 0x11, 0x07, 0x03, 0x1e, 0x10, 0x08, 0x19, 0x0c, 0x02, 0x1a, 0x11, 0x0b, 0x06, 0x03, 0x00, 0x08, 0x03, 0x00, 0x0b, 0x05, 0x05, 0x08, 0x02, 0x02, 0x10, 0x07, 0x01, 0x16, 0x0a, 0x00, 0x27, 0x19, 0x0f, 0x1c, 0x0f, 0x04, 0x10, 0x04, 0x00, 0x31, 0x20, 0x0d, 0x3f, 0x2c, 0x14, 0x80, 0x63, 0x46, 0x7b, 0x5f, 0x44, 0xa7, 0x87, 0x67, 0x9b, 0x78, 0x57, 0x84, 0x63, 0x44, 0x98, 0x76, 0x57, 0x92, 0x71, 0x50, 0x66, 0x49, 0x2c, 0x79, 0x5b, 0x3d, 0x88, 0x6a, 0x4c, 0x82, 0x60, 0x43, 0x8f, 0x6e, 0x50, 0x79, 0x5a, 0x3e, 0x8e, 0x6f, 0x4f, 0x95, 0x74, 0x54, 0x7b, 0x60, 0x45, 0x7f, 0x61, 0x40, 0x78, 0x59, 0x3c, 0x82, 0x65, 0x49, 0x4f, 0x37, 0x1f, 0x61, 0x46, 0x2c, 0x7b, 0x5a, 0x3d, 0x8d, 0x6d, 0x4e, 0x7a, 0x5e, 0x42, 0x6d, 0x56, 0x3a, 0x56, 0x3e, 0x26, 0x59, 0x41, 0x2a, 0x65, 0x4a, 0x2e, 0x85, 0x66, 0x48, 0x7c, 0x5f, 0x42, 0x61, 0x49, 0x30, 0x6c, 0x52, 0x38, 0x86, 0x6c, 0x52, 0x84, 0x68, 0x4c, 0x85, 0x69, 0x4d, 0x98, 0x78, 0x58, 0x73, 0x56, 0x3b, 0x79, 0x5d, 0x43, 0x73, 0x57, 0x3c, 0x5a, 0x3f, 0x2b, 0x92, 0x74, 0x56, 0x77, 0x5a, 0x3d, 0x6d, 0x55, 0x3b, 0x66, 0x4c, 0x35, 0x81, 0x68, 0x4a, 0x56, 0x43, 0x2b, 0x68, 0x4c, 0x35, 0x7f, 0x64, 0x47, 0x5d, 0x46, 0x2c, 0x80, 0x62, 0x46, 0x7f, 0x64, 0x49, 0x5c, 0x45, 0x2d, 0x62, 0x4d, 0x39, 0x3a, 0x2a, 0x19, 0x4e, 0x3b, 0x26, 0x4b, 0x38, 0x24, 0x3d, 0x2c, 0x1b, 0x3b, 0x29, 0x19, 0x3c, 0x2a, 0x1b, 0x3a, 0x29, 0x1b, 0x1d, 0x0f, 0x09, 0x2d, 0x1b, 0x0f, 0x39, 0x27, 0x1d, 0x55, 0x41, 0x28, 0x31, 0x1f, 0x15, 0x3f, 0x2a, 0x17, 0x3d, 0x2a, 0x16, 0x3c, 0x29, 0x1a, 0x44, 0x2e, 0x1d, 0x48, 0x30, 0x24, 0x54, 0x3d, 0x2f, 0x4d, 0x37, 0x26, 0x60, 0x4c, 0x3e, 0x56, 0x45, 0x3d, 0x45, 0x35, 0x2b, 0x44, 0x35, 0x28, 0x62, 0x52, 0x45, 0x7f, 0x74, 0x6c, 0x86, 0x80, 0x7c, 0xb5, 0xb4, 0xb0, 0xce, 0xcc, 0xc9, 0xd9, 0xd9, 0xd7, 0xe5, 0xe5, 0xe3, 0xf5, 0xf5, 0xf5, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xee, 0xee, 0xed, 0xf5, 0xf5, 0xf4, 0xee, 0xee, 0xec, 0xe2, 0xe2, 0xe0, 0x9e, 0x9e, 0x9c, 0x9b, 0x9a, 0x96, 0x72, 0x70, 0x6b, 0x65, 0x5c, 0x55, 0x47, 0x3d, 0x38, 0x3f, 0x30, 0x29, 0x2e, 0x26, 0x23, 0x26, 0x19, 0x17, 0x31, 0x20, 0x17, 0x32, 0x21, 0x18, 0x31, 0x22, 0x18, 0x1b, 0x10, 0x07, 0x19, 0x0f, 0x09, 0x1b, 0x11, 0x0a, 0x12, 0x0c, 0x09, 0x1d, 0x10, 0x08, 0x29, 0x1c, 0x11, 0x1f, 0x16, 0x0c, 0x14, 0x0a, 0x04, 0x15, 0x0d, 0x09, 0x24, 0x16, 0x08, 0x10, 0x07, 0x04, 0x21, 0x15, 0x10, 0x17, 0x0a, 0x03, 0x23, 0x13, 0x08, 0x1f, 0x10, 0x05, 0x15, 0x0d, 0x07, 0x0c, 0x07, 0x03, 0x06, 0x02, 0x00, 0x09, 0x02, 0x01, 0x0b, 0x04, 0x04, 0x0f, 0x08, 0x03, 0x24, 0x18, 0x0f, 0x1b, 0x0f, 0x06, 0x08, 0x02, 0x00, 0x17, 0x0b, 0x02, 0x1f, 0x10, 0x05, 0x2f, 0x1c, 0x0e, 0x60, 0x49, 0x30, 0x71, 0x58, 0x3d, 0x94, 0x76, 0x57, 0x8c, 0x6b, 0x4d, 0x7a, 0x5a, 0x3b, 0x82, 0x63, 0x43, 0x8d, 0x70, 0x53, 0x56, 0x3b, 0x21, 0x72, 0x56, 0x3a, 0x86, 0x6a, 0x4e, 0x86, 0x65, 0x4b, 0x75, 0x55, 0x3d, 0x7d, 0x5e, 0x43, 0x7f, 0x61, 0x43, 0x99, 0x78, 0x59, 0x79, 0x5d, 0x42, 0x7f, 0x62, 0x43, 0x6e, 0x51, 0x35, 0x78, 0x5b, 0x40, 0x5d, 0x44, 0x2c, 0x5f, 0x44, 0x29, 0x7c, 0x5e, 0x41, 0x8b, 0x6c, 0x4a, 0x82, 0x66, 0x4a, 0x5e, 0x47, 0x2f, 0x4a, 0x32, 0x1d, 0x52, 0x3b, 0x26, 0x5a, 0x42, 0x28, 0x7d, 0x61, 0x45, 0x82, 0x65, 0x4a, 0x6e, 0x57, 0x3f, 0x6c, 0x55, 0x3e, 0x73, 0x5c, 0x45, 0x8b, 0x71, 0x58, 0x7d, 0x62, 0x48, 0x8d, 0x70, 0x53, 0x7a, 0x61, 0x41, 0x64, 0x4b, 0x34, 0x66, 0x4d, 0x34, 0x6a, 0x4e, 0x36, 0x85, 0x69, 0x4c, 0x5a, 0x3f, 0x29, 0x67, 0x50, 0x37, 0x65, 0x4a, 0x34, 0x84, 0x6a, 0x50, 0x4b, 0x39, 0x27, 0x78, 0x5d, 0x44, 0x5f, 0x48, 0x31, 0x3e, 0x2a, 0x1b, 0x77, 0x5f, 0x45, 0x61, 0x49, 0x31, 0x61, 0x4c, 0x35, 0x43, 0x30, 0x23, 0x28, 0x1d, 0x12, 0x1c, 0x0b, 0x00, 0x3a, 0x26, 0x13, 0x21, 0x0e, 0x00, 0x3f, 0x2e, 0x21, 0x2a, 0x1a, 0x11, 0x36, 0x21, 0x13, 0x22, 0x16, 0x0c, 0x38, 0x27, 0x18, 0x36, 0x24, 0x19, 0x45, 0x30, 0x1a, 0x31, 0x1f, 0x13, 0x45, 0x31, 0x21, 0x4e, 0x39, 0x25, 0x48, 0x33, 0x24, 0x40, 0x2b, 0x1b, 0x51, 0x3b, 0x29, 0x3e, 0x28, 0x1e, 0x66, 0x4c, 0x37, 0x5e, 0x49, 0x3a, 0x5d, 0x4c, 0x42, 0x3c, 0x2c, 0x24, 0x3f, 0x30, 0x24, 0x5e, 0x4f, 0x43, 0x91, 0x88, 0x80, 0x78, 0x70, 0x6b, 0xac, 0xa9, 0xa4, 0xc9, 0xc8, 0xc4, 0xd4, 0xd4, 0xd1, 0xe6, 0xe6, 0xe4, 0xf1, 0xf1, 0xf0, 0xfb, 0xfb, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfb, 0xfb, 0xfb, 0xf9, 0xf9, 0xf9, 0xef, 0xef, 0xee, 0xed, 0xed, 0xeb, 0xae, 0xae, 0xac, 0xb7, 0xb6, 0xb1, 0x83, 0x81, 0x7f, 0x82, 0x7d, 0x77, 0x5a, 0x55, 0x4f, 0x42, 0x3a, 0x32, 0x39, 0x2c, 0x26, 0x27, 0x1f, 0x1c, 0x26, 0x19, 0x13, 0x27, 0x18, 0x0b, 0x36, 0x26, 0x1a, 0x29, 0x1a, 0x0f, 0x17, 0x0e, 0x05, 0x18, 0x0f, 0x0c, 0x1a, 0x0e, 0x07, 0x1a, 0x0d, 0x09, 0x22, 0x15, 0x0b, 0x1d, 0x12, 0x07, 0x17, 0x0e, 0x06, 0x19, 0x0f, 0x09, 0x17, 0x0a, 0x02, 0x25, 0x16, 0x09, 0x1b, 0x10, 0x0b, 0x10, 0x0a, 0x07, 0x25, 0x1a, 0x12, 0x1e, 0x0e, 0x01, 0x23, 0x13, 0x06, 0x15, 0x0c, 0x05, 0x11, 0x08, 0x01, 0x0d, 0x07, 0x04, 0x0a, 0x02, 0x01, 0x0c, 0x04, 0x03, 0x03, 0x02, 0x00, 0x1d, 0x13, 0x0e, 0x20, 0x14, 0x0c, 0x0b, 0x03, 0x02, 0x29, 0x1c, 0x13, 0x12, 0x08, 0x00, 0x2b, 0x19, 0x0a, 0x48, 0x34, 0x21, 0x4b, 0x34, 0x1e, 0x82, 0x68, 0x49, 0x7c, 0x5e, 0x46, 0x6d, 0x50, 0x33, 0x75, 0x5a, 0x3a, 0x72, 0x58, 0x3f, 0x5f, 0x45, 0x2b, 0x63, 0x48, 0x2c, 0x81, 0x66, 0x4b, 0x8a, 0x6c, 0x50, 0x63, 0x49, 0x2f, 0x6e, 0x51, 0x36, 0x6f, 0x52, 0x37, 0x97, 0x76, 0x5a, 0x87, 0x6b, 0x51, 0x77, 0x5a, 0x3f, 0x60, 0x47, 0x2c, 0x6a, 0x50, 0x37, 0x5f, 0x45, 0x2c, 0x6c, 0x51, 0x35, 0x82, 0x66, 0x4a, 0x80, 0x62, 0x44, 0x7e, 0x62, 0x47, 0x57, 0x40, 0x29, 0x3f, 0x2b, 0x16, 0x4b, 0x36, 0x1f, 0x50, 0x39, 0x21, 0x69, 0x51, 0x39, 0x78, 0x5c, 0x44, 0x77, 0x5f, 0x4a, 0x66, 0x4d, 0x38, 0x5b, 0x43, 0x2d, 0x77, 0x60, 0x4a, 0x7e, 0x62, 0x49, 0x7b, 0x62, 0x45, 0x75, 0x5d, 0x40, 0x5c, 0x44, 0x2d, 0x6a, 0x51, 0x38, 0x5d, 0x44, 0x2e, 0x73, 0x58, 0x3b, 0x56, 0x42, 0x2f, 0x35, 0x20, 0x0e, 0x83, 0x65, 0x4c, 0x6f, 0x54, 0x3e, 0x71, 0x58, 0x46, 0x73, 0x5b, 0x43, 0x5d, 0x44, 0x30, 0x39, 0x26, 0x15, 0x60, 0x47, 0x30, 0x55, 0x3c, 0x26, 0x56, 0x3e, 0x28, 0x29, 0x18, 0x0b, 0x25, 0x1c, 0x0e, 0x29, 0x18, 0x0f, 0x3f, 0x2b, 0x1a, 0x2c, 0x19, 0x0a, 0x32, 0x22, 0x14, 0x34, 0x22, 0x17, 0x3b, 0x2a, 0x19, 0x1a, 0x0f, 0x06, 0x3a, 0x26, 0x17, 0x45, 0x32, 0x23, 0x52, 0x3b, 0x29, 0x3b, 0x27, 0x1b, 0x33, 0x20, 0x0f, 0x5a, 0x44, 0x32, 0x55, 0x3c, 0x29, 0x41, 0x2e, 0x1e, 0x49, 0x36, 0x24, 0x39, 0x27, 0x1c, 0x45, 0x32, 0x22, 0x5f, 0x49, 0x37, 0x58, 0x45, 0x39, 0x3b, 0x2c, 0x24, 0x3e, 0x30, 0x27, 0x51, 0x42, 0x39, 0x82, 0x7a, 0x73, 0x8e, 0x87, 0x80, 0x93, 0x8c, 0x85, 0xb9, 0xb7, 0xb3, 0xc6, 0xc7, 0xc2, 0xde, 0xde, 0xdf, 0xf5, 0xf5, 0xf3, 0xfb, 0xfc, 0xfa, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xf8, 0xf8, 0xf8, 0xe8, 0xe8, 0xe8, 0xe1, 0xe1, 0xdf, 0xce, 0xcf, 0xcd, 0x82, 0x80, 0x7e, 0x7e, 0x7d, 0x74, 0x90, 0x8b, 0x85, 0x5b, 0x56, 0x50, 0x44, 0x40, 0x37, 0x36, 0x2e, 0x27, 0x38, 0x2c, 0x25, 0x2f, 0x20, 0x16, 0x34, 0x24, 0x18, 0x2c, 0x1c, 0x0f, 0x2d, 0x19, 0x10, 0x1d, 0x0e, 0x07, 0x11, 0x09, 0x06, 0x1a, 0x0e, 0x06, 0x1e, 0x0c, 0x04, 0x24, 0x16, 0x0f, 0x1a, 0x11, 0x0b, 0x14, 0x0a, 0x08, 0x1a, 0x10, 0x0a, 0x25, 0x17, 0x0f, 0x27, 0x16, 0x0f, 0x1a, 0x0c, 0x03, 0x20, 0x15, 0x0f, 0x27, 0x1b, 0x13, 0x31, 0x21, 0x14, 0x20, 0x14, 0x0a, 0x27, 0x19, 0x0e, 0x17, 0x09, 0x00, 0x14, 0x0b, 0x04, 0x0c, 0x05, 0x03, 0x0a, 0x02, 0x01, 0x09, 0x04, 0x00, 0x17, 0x0c, 0x05, 0x0f, 0x02, 0x00, 0x10, 0x08, 0x06, 0x13, 0x0a, 0x03, 0x0c, 0x05, 0x00, 0x26, 0x15, 0x06, 0x36, 0x23, 0x11, 0x33, 0x20, 0x11, 0x53, 0x40, 0x29, 0x73, 0x5b, 0x44, 0x5b, 0x41, 0x27, 0x72, 0x58, 0x3c, 0x5e, 0x44, 0x2a, 0x6c, 0x52, 0x39, 0x55, 0x3f, 0x26, 0x62, 0x4c, 0x33, 0x85, 0x67, 0x4a, 0x64, 0x4b, 0x31, 0x67, 0x4b, 0x2f, 0x71, 0x55, 0x39, 0x8d, 0x6c, 0x50, 0x7a, 0x5c, 0x43, 0x7c, 0x5f, 0x44, 0x5d, 0x46, 0x2b, 0x4f, 0x35, 0x1b, 0x64, 0x4a, 0x31, 0x6f, 0x54, 0x37, 0x72, 0x56, 0x3a, 0x6a, 0x4c, 0x2f, 0x7f, 0x63, 0x48, 0x53, 0x3f, 0x27, 0x37, 0x27, 0x10, 0x3e, 0x2d, 0x17, 0x4f, 0x3c, 0x28, 0x54, 0x40, 0x2d, 0x6e, 0x55, 0x3f, 0x87, 0x6a, 0x50, 0x68, 0x4f, 0x39, 0x6c, 0x54, 0x3e, 0x6a, 0x56, 0x43, 0x74, 0x5d, 0x47, 0x5b, 0x47, 0x2d, 0x74, 0x60, 0x46, 0x5f, 0x48, 0x30, 0x66, 0x4c, 0x33, 0x5c, 0x45, 0x30, 0x53, 0x3f, 0x2a, 0x51, 0x3b, 0x28, 0x45, 0x30, 0x1d, 0x81, 0x63, 0x49, 0x68, 0x4f, 0x39, 0x6a, 0x52, 0x3f, 0x7d, 0x65, 0x4d, 0x52, 0x3a, 0x26, 0x41, 0x2e, 0x1d, 0x57, 0x3e, 0x29, 0x46, 0x2d, 0x18, 0x4b, 0x34, 0x1f, 0x25, 0x15, 0x0a, 0x2b, 0x1c, 0x09, 0x40, 0x2b, 0x1f, 0x25, 0x17, 0x09, 0x25, 0x15, 0x08, 0x37, 0x24, 0x15, 0x2d, 0x1b, 0x10, 0x44, 0x33, 0x23, 0x2d, 0x1d, 0x11, 0x45, 0x2d, 0x1a, 0x46, 0x30, 0x1e, 0x56, 0x3b, 0x27, 0x44, 0x31, 0x1d, 0x56, 0x42, 0x35, 0x4e, 0x38, 0x28, 0x62, 0x43, 0x2b, 0x52, 0x3c, 0x2b, 0x46, 0x33, 0x21, 0x40, 0x2f, 0x26, 0x29, 0x1a, 0x0e, 0x52, 0x3f, 0x30, 0x4f, 0x3d, 0x31, 0x3c, 0x2e, 0x26, 0x3d, 0x2e, 0x25, 0x4c, 0x3e, 0x34, 0x67, 0x5a, 0x54, 0x9b, 0x98, 0x8f, 0x9c, 0x95, 0x8f, 0xbe, 0xbb, 0xb7, 0xca, 0xcb, 0xc6, 0xcf, 0xcf, 0xcf, 0xf6, 0xf7, 0xf5, 0xfb, 0xfc, 0xfa, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfa, 0xfb, 0xf8, 0xe0, 0xe0, 0xde, 0xdb, 0xdc, 0xd9, 0xc1, 0xc2, 0xc0, 0xa3, 0xa2, 0xa0, 0x9b, 0x9a, 0x92, 0xb1, 0xae, 0xaa, 0x59, 0x52, 0x50, 0x41, 0x3a, 0x34, 0x33, 0x2c, 0x26, 0x2a, 0x1e, 0x16, 0x2d, 0x1c, 0x15, 0x30, 0x1e, 0x12, 0x39, 0x27, 0x1b, 0x31, 0x1e, 0x13, 0x25, 0x16, 0x0f, 0x20, 0x13, 0x0c, 0x23, 0x16, 0x0f, 0x1e, 0x12, 0x09, 0x15, 0x09, 0x06, 0x1d, 0x14, 0x0b, 0x10, 0x07, 0x06, 0x1d, 0x12, 0x08, 0x25, 0x15, 0x09, 0x25, 0x15, 0x0a, 0x1f, 0x10, 0x07, 0x1b, 0x11, 0x07, 0x28, 0x1d, 0x17, 0x22, 0x17, 0x10, 0x20, 0x11, 0x09, 0x2f, 0x1c, 0x11, 0x32, 0x20, 0x11, 0x1a, 0x0f, 0x06, 0x15, 0x09, 0x04, 0x0a, 0x03, 0x00, 0x07, 0x03, 0x02, 0x12, 0x0a, 0x05, 0x14, 0x09, 0x08, 0x09, 0x04, 0x02, 0x0a, 0x02, 0x00, 0x0a, 0x03, 0x01, 0x0d, 0x04, 0x00, 0x28, 0x17, 0x0b, 0x29, 0x19, 0x0a, 0x2d, 0x21, 0x11, 0x50, 0x3e, 0x27, 0x4f, 0x39, 0x25, 0x57, 0x3e, 0x25, 0x56, 0x40, 0x2a, 0x48, 0x31, 0x1f, 0x64, 0x4b, 0x34, 0x5c, 0x44, 0x2c, 0x8f, 0x71, 0x52, 0x5e, 0x42, 0x2a, 0x5c, 0x43, 0x2c, 0x7c, 0x5e, 0x45, 0x7f, 0x64, 0x4b, 0x68, 0x4e, 0x35, 0x80, 0x64, 0x46, 0x56, 0x3d, 0x26, 0x56, 0x3f, 0x25, 0x6f, 0x54, 0x36, 0x77, 0x5a, 0x3a, 0x70, 0x56, 0x3a, 0x51, 0x39, 0x1f, 0x80, 0x62, 0x46, 0x5a, 0x45, 0x2e, 0x35, 0x23, 0x0d, 0x3f, 0x2d, 0x19, 0x43, 0x30, 0x1e, 0x4e, 0x3b, 0x29, 0x4b, 0x3a, 0x27, 0x85, 0x6a, 0x51, 0x60, 0x4a, 0x35, 0x5c, 0x45, 0x33, 0x5b, 0x47, 0x37, 0x76, 0x5d, 0x4a, 0x50, 0x3d, 0x2a, 0x64, 0x4d, 0x36, 0x6c, 0x54, 0x3c, 0x64, 0x4c, 0x34, 0x5f, 0x47, 0x2f, 0x56, 0x43, 0x2e, 0x3f, 0x28, 0x14, 0x43, 0x2c, 0x18, 0x82, 0x65, 0x4b, 0x6d, 0x53, 0x3b, 0x65, 0x4f, 0x34, 0x68, 0x52, 0x3c, 0x45, 0x2e, 0x1c, 0x47, 0x36, 0x25, 0x49, 0x33, 0x1e, 0x5d, 0x42, 0x28, 0x5b, 0x47, 0x33, 0x2b, 0x1c, 0x0c, 0x2f, 0x20, 0x0e, 0x1e, 0x0f, 0x03, 0x34, 0x22, 0x15, 0x36, 0x25, 0x15, 0x3a, 0x28, 0x18, 0x2e, 0x1c, 0x0e, 0x3f, 0x2e, 0x1f, 0x3c, 0x2b, 0x1c, 0x43, 0x2c, 0x17, 0x4f, 0x38, 0x23, 0x58, 0x41, 0x2c, 0x59, 0x47, 0x33, 0x45, 0x2b, 0x19, 0x31, 0x23, 0x16, 0x5a, 0x43, 0x2f, 0x4d, 0x35, 0x25, 0x41, 0x2f, 0x21, 0x42, 0x2d, 0x21, 0x3b, 0x26, 0x20, 0x53, 0x40, 0x32, 0x53, 0x42, 0x34, 0x4a, 0x39, 0x2c, 0x47, 0x35, 0x2c, 0x43, 0x36, 0x2f, 0x4f, 0x46, 0x40, 0x85, 0x7a, 0x70, 0xa9, 0xa2, 0x9b, 0xb3, 0xb1, 0xad, 0xc6, 0xc6, 0xc4, 0xd8, 0xd8, 0xd6, 0xee, 0xee, 0xec, 0xfc, 0xfc, 0xfa, 0xfb, 0xfb, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfb, 0xf4, 0xf4, 0xf2, 0xe6, 0xe7, 0xe5, 0xd6, 0xd6, 0xd4, 0xcc, 0xcd, 0xcb, 0x96, 0x95, 0x93, 0xbe, 0xbd, 0xb5, 0xa9, 0xa6, 0xa3, 0x60, 0x59, 0x57, 0x46, 0x3f, 0x39, 0x3b, 0x34, 0x2e, 0x33, 0x27, 0x1f, 0x26, 0x15, 0x0f, 0x3a, 0x28, 0x1c, 0x38, 0x26, 0x1a, 0x33, 0x20, 0x14, 0x1b, 0x0c, 0x05, 0x1b, 0x10, 0x0b, 0x1c, 0x12, 0x0d, 0x1e, 0x14, 0x0c, 0x14, 0x09, 0x06, 0x1e, 0x13, 0x0d, 0x24, 0x19, 0x11, 0x21, 0x15, 0x0f, 0x18, 0x0c, 0x03, 0x17, 0x0b, 0x01, 0x21, 0x14, 0x0a, 0x27, 0x17, 0x0f, 0x1e, 0x13, 0x0d, 0x11, 0x06, 0x00, 0x3a, 0x27, 0x15, 0x1f, 0x15, 0x0c, 0x29, 0x1d, 0x13, 0x0b, 0x07, 0x03, 0x1b, 0x0f, 0x09, 0x0a, 0x03, 0x00, 0x06, 0x01, 0x01, 0x14, 0x0a, 0x06, 0x0f, 0x05, 0x00, 0x09, 0x05, 0x05, 0x09, 0x01, 0x00, 0x0c, 0x04, 0x03, 0x06, 0x00, 0x00, 0x1d, 0x0f, 0x07, 0x16, 0x0d, 0x01, 0x26, 0x18, 0x0d, 0x21, 0x16, 0x0b, 0x51, 0x3b, 0x26, 0x3c, 0x2b, 0x1b, 0x43, 0x31, 0x20, 0x3c, 0x29, 0x15, 0x55, 0x3d, 0x25, 0x5c, 0x44, 0x2c, 0x73, 0x59, 0x3d, 0x54, 0x3c, 0x27, 0x56, 0x3d, 0x26, 0x70, 0x51, 0x3a, 0x79, 0x60, 0x46, 0x73, 0x59, 0x3f, 0x5f, 0x46, 0x2d, 0x53, 0x3e, 0x26, 0x54, 0x3d, 0x26, 0x66, 0x4a, 0x30, 0x74, 0x56, 0x3b, 0x6e, 0x54, 0x3c, 0x41, 0x2d, 0x17, 0x76, 0x5d, 0x43, 0x4d, 0x3a, 0x24, 0x41, 0x2f, 0x19, 0x39, 0x27, 0x12, 0x4c, 0x39, 0x27, 0x49, 0x36, 0x25, 0x3c, 0x30, 0x20, 0x61, 0x4c, 0x35, 0x66, 0x4f, 0x3b, 0x52, 0x3b, 0x2a, 0x54, 0x3f, 0x2f, 0x69, 0x50, 0x3d, 0x4f, 0x3b, 0x2a, 0x64, 0x4c, 0x36, 0x6a, 0x51, 0x3d, 0x5b, 0x42, 0x2e, 0x6e, 0x56, 0x3d, 0x61, 0x4d, 0x38, 0x4c, 0x36, 0x21, 0x4e, 0x38, 0x23, 0x69, 0x50, 0x39, 0x56, 0x40, 0x2c, 0x5d, 0x47, 0x31, 0x60, 0x4a, 0x34, 0x54, 0x3d, 0x2a, 0x30, 0x1e, 0x11, 0x49, 0x33, 0x20, 0x71, 0x55, 0x3b, 0x41, 0x2e, 0x19, 0x2a, 0x1a, 0x12, 0x2e, 0x1f, 0x0d, 0x21, 0x13, 0x08, 0x3a, 0x27, 0x1a, 0x3a, 0x28, 0x1c, 0x33, 0x21, 0x14, 0x33, 0x22, 0x14, 0x41, 0x2f, 0x21, 0x41, 0x30, 0x1f, 0x49, 0x34, 0x21, 0x48, 0x30, 0x20, 0x5c, 0x45, 0x34, 0x58, 0x40, 0x2b, 0x54, 0x3f, 0x29, 0x27, 0x18, 0x0d, 0x47, 0x32, 0x22, 0x67, 0x4c, 0x39, 0x43, 0x2e, 0x21, 0x54, 0x3d, 0x2d, 0x51, 0x3e, 0x2e, 0x4d, 0x39, 0x2c, 0x45, 0x34, 0x26, 0x46, 0x34, 0x26, 0x48, 0x36, 0x2d, 0x3f, 0x32, 0x2a, 0x51, 0x49, 0x43, 0x72, 0x65, 0x5b, 0xa1, 0x9a, 0x94, 0xbb, 0xb9, 0xb5, 0xca, 0xca, 0xc8, 0xd3, 0xd4, 0xd2, 0xe9, 0xea, 0xe7, 0xfa, 0xfb, 0xf8, 0xfd, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xed, 0xee, 0xeb, 0xf1, 0xf1, 0xef, 0xde, 0xde, 0xdc, 0xc3, 0xc3, 0xc1, 0xb1, 0xb2, 0xac, 0xd3, 0xd4, 0xce, 0x9a, 0x97, 0x93, 0x57, 0x4f, 0x4a, 0x5c, 0x54, 0x4e, 0x47, 0x41, 0x3c, 0x29, 0x1e, 0x18, 0x29, 0x19, 0x10, 0x3b, 0x2b, 0x1e, 0x3a, 0x2a, 0x1e, 0x36, 0x25, 0x16, 0x2b, 0x1f, 0x13, 0x11, 0x09, 0x05, 0x16, 0x0e, 0x0b, 0x21, 0x16, 0x0f, 0x1a, 0x0e, 0x0a, 0x1f, 0x16, 0x0f, 0x20, 0x17, 0x0b, 0x1b, 0x12, 0x0a, 0x23, 0x18, 0x0f, 0x25, 0x19, 0x0c, 0x3e, 0x2c, 0x1c, 0x26, 0x18, 0x0f, 0x15, 0x0a, 0x04, 0x1e, 0x11, 0x09, 0x2d, 0x21, 0x12, 0x2d, 0x1f, 0x0f, 0x17, 0x0e, 0x06, 0x08, 0x04, 0x03, 0x19, 0x10, 0x0b, 0x07, 0x00, 0x00, 0x07, 0x04, 0x06, 0x1c, 0x12, 0x0d, 0x11, 0x09, 0x02, 0x04, 0x00, 0x00, 0x09, 0x03, 0x03, 0x0c, 0x01, 0x03, 0x07, 0x01, 0x02, 0x0d, 0x06, 0x03, 0x13, 0x0d, 0x05, 0x21, 0x15, 0x0a, 0x12, 0x09, 0x03, 0x47, 0x34, 0x1e, 0x30, 0x21, 0x15, 0x28, 0x1c, 0x10, 0x3f, 0x2c, 0x17, 0x42, 0x2d, 0x15, 0x4f, 0x39, 0x26, 0x4b, 0x36, 0x1f, 0x65, 0x4c, 0x36, 0x46, 0x2e, 0x18, 0x74, 0x57, 0x3e, 0x63, 0x4d, 0x36, 0x60, 0x48, 0x2f, 0x59, 0x41, 0x2c, 0x4f, 0x3a, 0x23, 0x35, 0x24, 0x10, 0x5c, 0x45, 0x2b, 0x6f, 0x54, 0x39, 0x6e, 0x53, 0x3a, 0x51, 0x3b, 0x24, 0x5e, 0x48, 0x34, 0x4d, 0x3a, 0x2a, 0x49, 0x36, 0x23, 0x49, 0x37, 0x24, 0x4e, 0x3d, 0x29, 0x31, 0x20, 0x0f, 0x35, 0x27, 0x1a, 0x5e, 0x4b, 0x38, 0x4a, 0x35, 0x22, 0x52, 0x3c, 0x30, 0x52, 0x3c, 0x2b, 0x5b, 0x44, 0x32, 0x59, 0x45, 0x33, 0x5f, 0x46, 0x31, 0x5d, 0x46, 0x34, 0x54, 0x3d, 0x2c, 0x67, 0x50, 0x3a, 0x57, 0x42, 0x2d, 0x4e, 0x38, 0x20, 0x70, 0x5a, 0x42, 0x56, 0x41, 0x2d, 0x4c, 0x39, 0x27, 0x64, 0x52, 0x3c, 0x4e, 0x3b, 0x27, 0x3e, 0x29, 0x13, 0x33, 0x1d, 0x0e, 0x4d, 0x38, 0x25, 0x6e, 0x55, 0x3a, 0x40, 0x2d, 0x1c, 0x24, 0x12, 0x06, 0x26, 0x14, 0x0c, 0x2b, 0x1b, 0x0f, 0x36, 0x25, 0x17, 0x2a, 0x17, 0x0d, 0x21, 0x14, 0x0c, 0x3c, 0x29, 0x1f, 0x41, 0x30, 0x1e, 0x49, 0x37, 0x27, 0x49, 0x36, 0x25, 0x48, 0x34, 0x1d, 0x5a, 0x43, 0x2b, 0x5d, 0x43, 0x30, 0x4c, 0x35, 0x20, 0x3b, 0x2a, 0x1c, 0x37, 0x22, 0x16, 0x65, 0x4c, 0x34, 0x54, 0x3c, 0x30, 0x4f, 0x38, 0x23, 0x50, 0x3c, 0x28, 0x48, 0x35, 0x27, 0x4b, 0x39, 0x2b, 0x3c, 0x2c, 0x20, 0x46, 0x36, 0x2c, 0x40, 0x31, 0x28, 0x5e, 0x57, 0x4f, 0x75, 0x6f, 0x66, 0x95, 0x8d, 0x87, 0xc8, 0xc5, 0xc1, 0xce, 0xcc, 0xc9, 0xc8, 0xc6, 0xc3, 0xf4, 0xf4, 0xf2, 0xf2, 0xf3, 0xf1, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfb, 0xec, 0xec, 0xea, 0xf5, 0xf5, 0xf3, 0xe2, 0xe3, 0xe1, 0xb2, 0xb2, 0xb0, 0xce, 0xce, 0xca, 0xda, 0xda, 0xdb, 0x87, 0x84, 0x80, 0x6e, 0x68, 0x5f, 0x6d, 0x68, 0x64, 0x3a, 0x31, 0x2a, 0x30, 0x22, 0x1a, 0x2c, 0x1f, 0x17, 0x2d, 0x1c, 0x13, 0x39, 0x29, 0x20, 0x2d, 0x1d, 0x10, 0x2a, 0x1e, 0x13, 0x1e, 0x12, 0x0c, 0x1b, 0x0f, 0x09, 0x27, 0x18, 0x13, 0x20, 0x15, 0x0f, 0x17, 0x0e, 0x08, 0x20, 0x15, 0x0c, 0x1e, 0x13, 0x0a, 0x18, 0x0e, 0x05, 0x2a, 0x1e, 0x10, 0x3c, 0x2b, 0x1b, 0x2c, 0x20, 0x15, 0x1d, 0x12, 0x0d, 0x24, 0x16, 0x0d, 0x1c, 0x10, 0x06, 0x30, 0x21, 0x14, 0x17, 0x0b, 0x05, 0x0d, 0x06, 0x04, 0x1b, 0x0f, 0x09, 0x18, 0x0c, 0x06, 0x0a, 0x05, 0x04, 0x21, 0x18, 0x13, 0x0b, 0x04, 0x00, 0x05, 0x01, 0x00, 0x04, 0x02, 0x01, 0x0e, 0x05, 0x06, 0x06, 0x00, 0x00, 0x07, 0x02, 0x01, 0x0a, 0x04, 0x01, 0x0d, 0x03, 0x00, 0x15, 0x0d, 0x07, 0x34, 0x24, 0x14, 0x25, 0x17, 0x0b, 0x29, 0x1b, 0x10, 0x40, 0x2e, 0x1e, 0x3f, 0x2d, 0x1b, 0x3a, 0x28, 0x16, 0x2f, 0x1e, 0x0e, 0x4f, 0x39, 0x23, 0x4a, 0x35, 0x20, 0x51, 0x3b, 0x27, 0x5e, 0x47, 0x2f, 0x52, 0x3e, 0x28, 0x4b, 0x36, 0x22, 0x57, 0x43, 0x2d, 0x2d, 0x1f, 0x0f, 0x51, 0x3d, 0x25, 0x60, 0x49, 0x30, 0x62, 0x4b, 0x32, 0x70, 0x5a, 0x41, 0x60, 0x4c, 0x3b, 0x3d, 0x2a, 0x1b, 0x4d, 0x39, 0x28, 0x3e, 0x2c, 0x1b, 0x55, 0x45, 0x2f, 0x3c, 0x2a, 0x19, 0x40, 0x2e, 0x20, 0x52, 0x41, 0x2d, 0x55, 0x3e, 0x2c, 0x4d, 0x35, 0x28, 0x61, 0x4a, 0x3a, 0x58, 0x40, 0x30, 0x4d, 0x39, 0x27, 0x63, 0x4b, 0x36, 0x62, 0x4b, 0x38, 0x5c, 0x45, 0x33, 0x64, 0x4d, 0x39, 0x59, 0x43, 0x2e, 0x62, 0x4c, 0x35, 0x69, 0x53, 0x3c, 0x43, 0x30, 0x1e, 0x49, 0x36, 0x25, 0x43, 0x32, 0x1c, 0x32, 0x21, 0x10, 0x46, 0x32, 0x1d, 0x4e, 0x38, 0x23, 0x4e, 0x39, 0x24, 0x62, 0x49, 0x32, 0x32, 0x1f, 0x13, 0x31, 0x1f, 0x14, 0x44, 0x33, 0x1f, 0x33, 0x23, 0x17, 0x2a, 0x1a, 0x0d, 0x2a, 0x18, 0x0c, 0x2a, 0x19, 0x0e, 0x33, 0x21, 0x16, 0x39, 0x28, 0x16, 0x45, 0x31, 0x22, 0x45, 0x31, 0x22, 0x44, 0x31, 0x1f, 0x50, 0x37, 0x23, 0x60, 0x48, 0x2f, 0x66, 0x4e, 0x35, 0x39, 0x27, 0x18, 0x3f, 0x2a, 0x1b, 0x5e, 0x46, 0x33, 0x63, 0x4a, 0x38, 0x54, 0x3c, 0x2a, 0x48, 0x34, 0x24, 0x44, 0x31, 0x23, 0x52, 0x3f, 0x31, 0x3c, 0x2d, 0x22, 0x47, 0x37, 0x2e, 0x45, 0x34, 0x2c, 0x52, 0x48, 0x41, 0x78, 0x74, 0x6b, 0x89, 0x81, 0x7b, 0xba, 0xb6, 0xb2, 0xc7, 0xc6, 0xc3, 0xd1, 0xcf, 0xcc, 0xea, 0xea, 0xe8, 0xf9, 0xfa, 0xf8, 0xfb, 0xfb, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfb, 0xf5, 0xf5, 0xf4, 0xef, 0xf0, 0xee, 0xe6, 0xe7, 0xe5, 0xc3, 0xc3, 0xc1, 0xd0, 0xd0, 0xcf, 0xbf, 0xbf, 0xc2, 0x78, 0x74, 0x6e, 0x98, 0x94, 0x8e, 0x5f, 0x5c, 0x5a, 0x30, 0x23, 0x1b, 0x36, 0x26, 0x1b, 0x2d, 0x21, 0x1c, 0x2a, 0x1a, 0x14, 0x36, 0x26, 0x1f, 0x2c, 0x1d, 0x13, 0x22, 0x17, 0x10, 0x20, 0x11, 0x08, 0x1f, 0x10, 0x07, 0x27, 0x19, 0x12, 0x1b, 0x0f, 0x0a, 0x1e, 0x14, 0x0d, 0x22, 0x17, 0x0e, 0x17, 0x0c, 0x04, 0x1e, 0x13, 0x0a, 0x1e, 0x12, 0x08, 0x3c, 0x2f, 0x22, 0x21, 0x14, 0x0a, 0x20, 0x14, 0x0e, 0x24, 0x15, 0x0e, 0x1c, 0x10, 0x0c, 0x25, 0x16, 0x0b, 0x1d, 0x12, 0x0c, 0x0e, 0x07, 0x03, 0x1c, 0x0f, 0x06, 0x21, 0x13, 0x0b, 0x0f, 0x06, 0x03, 0x10, 0x0a, 0x08, 0x0a, 0x03, 0x00, 0x07, 0x03, 0x02, 0x01, 0x02, 0x00, 0x0b, 0x06, 0x06, 0x0a, 0x04, 0x04, 0x07, 0x02, 0x02, 0x07, 0x02, 0x01, 0x08, 0x01, 0x01, 0x0d, 0x07, 0x03, 0x1f, 0x13, 0x0b, 0x21, 0x16, 0x0a, 0x3a, 0x28, 0x1d, 0x2d, 0x1f, 0x16, 0x2d, 0x20, 0x11, 0x49, 0x39, 0x24, 0x2d, 0x1c, 0x0f, 0x37, 0x23, 0x12, 0x44, 0x2f, 0x1d, 0x35, 0x23, 0x13, 0x66, 0x4b, 0x33, 0x3c, 0x28, 0x13, 0x4f, 0x3d, 0x28, 0x47, 0x35, 0x20, 0x21, 0x12, 0x04, 0x4d, 0x38, 0x25, 0x41, 0x2c, 0x17, 0x58, 0x44, 0x2e, 0x5c, 0x48, 0x30, 0x64, 0x51, 0x3f, 0x35, 0x23, 0x14, 0x4a, 0x38, 0x25, 0x53, 0x40, 0x2f, 0x48, 0x38, 0x23, 0x40, 0x30, 0x1f, 0x42, 0x32, 0x25, 0x47, 0x36, 0x22, 0x66, 0x4e, 0x3b, 0x5c, 0x44, 0x34, 0x55, 0x3e, 0x2e, 0x5c, 0x45, 0x35, 0x45, 0x31, 0x20, 0x67, 0x4f, 0x3a, 0x59, 0x43, 0x2c, 0x5f, 0x48, 0x33, 0x4d, 0x37, 0x23, 0x59, 0x43, 0x30, 0x64, 0x4d, 0x3c, 0x45, 0x2f, 0x1d, 0x43, 0x2f, 0x1d, 0x58, 0x44, 0x32, 0x3f, 0x2d, 0x1a, 0x2f, 0x1d, 0x10, 0x49, 0x36, 0x22, 0x4d, 0x38, 0x24, 0x3e, 0x2a, 0x14, 0x4c, 0x35, 0x22, 0x44, 0x31, 0x1f, 0x35, 0x23, 0x16, 0x3f, 0x2f, 0x20, 0x2b, 0x1b, 0x0f, 0x31, 0x21, 0x13, 0x32, 0x21, 0x15, 0x56, 0x3d, 0x2d, 0x3f, 0x2c, 0x1d, 0x42, 0x2f, 0x23, 0x43, 0x31, 0x22, 0x45, 0x32, 0x24, 0x3c, 0x2a, 0x1a, 0x56, 0x3f, 0x2c, 0x55, 0x3d, 0x28, 0x68, 0x50, 0x3b, 0x3f, 0x2b, 0x1f, 0x42, 0x2e, 0x1c, 0x53, 0x3a, 0x2a, 0x65, 0x4d, 0x36, 0x50, 0x39, 0x29, 0x3c, 0x29, 0x1c, 0x47, 0x35, 0x29, 0x43, 0x32, 0x25, 0x3d, 0x2f, 0x24, 0x3f, 0x2f, 0x27, 0x48, 0x38, 0x31, 0x5b, 0x4d, 0x46, 0x76, 0x6b, 0x64, 0x7d, 0x75, 0x6f, 0xb3, 0xae, 0xaa, 0xd1, 0xd1, 0xcd, 0xda, 0xda, 0xd6, 0xe0, 0xe1, 0xdf, 0xf4, 0xf4, 0xf2, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0xef, 0xe7, 0xe7, 0xe5, 0xe6, 0xe7, 0xe5, 0xdd, 0xdd, 0xdd, 0xc5, 0xc5, 0xc5, 0x9d, 0x97, 0x91, 0x8a, 0x8b, 0x8a, 0x3d, 0x38, 0x35, 0x35, 0x27, 0x22, 0x3b, 0x2c, 0x23, 0x31, 0x25, 0x1e, 0x34, 0x25, 0x1e, 0x33, 0x24, 0x1d, 0x27, 0x1c, 0x13, 0x1a, 0x0f, 0x06, 0x22, 0x14, 0x0b, 0x24, 0x16, 0x0d, 0x26, 0x1a, 0x0e, 0x20, 0x14, 0x0f, 0x2c, 0x20, 0x14, 0x26, 0x1b, 0x12, 0x15, 0x0a, 0x04, 0x28, 0x19, 0x11, 0x1d, 0x0f, 0x09, 0x34, 0x24, 0x16, 0x14, 0x09, 0x05, 0x1d, 0x0e, 0x05, 0x1d, 0x0d, 0x0a, 0x17, 0x0c, 0x06, 0x2b, 0x1e, 0x10, 0x17, 0x0c, 0x06, 0x16, 0x0b, 0x05, 0x17, 0x0d, 0x07, 0x18, 0x0d, 0x08, 0x0c, 0x04, 0x04, 0x0a, 0x06, 0x05, 0x0a, 0x02, 0x00, 0x07, 0x03, 0x04, 0x01, 0x01, 0x00, 0x04, 0x01, 0x00, 0x0d, 0x07, 0x07, 0x04, 0x02, 0x00, 0x06, 0x03, 0x01, 0x0c, 0x05, 0x04, 0x0c, 0x07, 0x05, 0x0f, 0x09, 0x04, 0x1b, 0x0f, 0x07, 0x29, 0x1c, 0x12, 0x1e, 0x15, 0x0d, 0x1d, 0x12, 0x06, 0x4c, 0x39, 0x26, 0x35, 0x24, 0x19, 0x32, 0x22, 0x13, 0x2a, 0x18, 0x0b, 0x3b, 0x25, 0x14, 0x4d, 0x35, 0x23, 0x42, 0x2f, 0x1a, 0x46, 0x33, 0x21, 0x4f, 0x3c, 0x2b, 0x34, 0x22, 0x12, 0x3f, 0x2e, 0x1e, 0x37, 0x24, 0x15, 0x52, 0x40, 0x2d, 0x49, 0x38, 0x22, 0x5b, 0x4b, 0x39, 0x2d, 0x1d, 0x0f, 0x47, 0x37, 0x21, 0x47, 0x34, 0x22, 0x3f, 0x2f, 0x1e, 0x4a, 0x3a, 0x29, 0x2c, 0x20, 0x14, 0x47, 0x35, 0x23, 0x67, 0x50, 0x3f, 0x60, 0x49, 0x39, 0x51, 0x3e, 0x2c, 0x52, 0x3f, 0x2e, 0x3f, 0x2e, 0x1d, 0x60, 0x4b, 0x37, 0x5b, 0x45, 0x30, 0x51, 0x3a, 0x26, 0x4f, 0x3c, 0x2a, 0x62, 0x4e, 0x3d, 0x59, 0x46, 0x35, 0x51, 0x3e, 0x2d, 0x4d, 0x3a, 0x29, 0x46, 0x33, 0x22, 0x3a, 0x28, 0x18, 0x40, 0x2e, 0x1e, 0x45, 0x34, 0x23, 0x44, 0x32, 0x21, 0x38, 0x26, 0x14, 0x3e, 0x2b, 0x1a, 0x44, 0x30, 0x1f, 0x32, 0x20, 0x12, 0x30, 0x22, 0x16, 0x26, 0x15, 0x0b, 0x38, 0x28, 0x1a, 0x36, 0x23, 0x18, 0x56, 0x40, 0x2d, 0x4e, 0x3b, 0x29, 0x42, 0x2e, 0x20, 0x37, 0x26, 0x18, 0x40, 0x2f, 0x21, 0x27, 0x18, 0x0e, 0x3a, 0x27, 0x19, 0x60, 0x49, 0x35, 0x52, 0x3c, 0x28, 0x5b, 0x40, 0x2b, 0x25, 0x15, 0x08, 0x4e, 0x37, 0x26, 0x4f, 0x37, 0x24, 0x58, 0x43, 0x32, 0x2b, 0x1b, 0x0f, 0x38, 0x29, 0x1d, 0x32, 0x24, 0x1c, 0x3e, 0x2f, 0x27, 0x46, 0x37, 0x30, 0x3f, 0x30, 0x29, 0x43, 0x37, 0x2f, 0x7c, 0x6f, 0x68, 0x7e, 0x79, 0x73, 0xa3, 0x9e, 0x98, 0xce, 0xcf, 0xcb, 0xdc, 0xdd, 0xd9, 0xea, 0xeb, 0xe8, 0xe3, 0xe3, 0xe1, 0xf6, 0xf6, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xfb, 0xfa, 0xfa, 0xf5, 0xf5, 0xf5, 0xe9, 0xe9, 0xe7, 0xf6, 0xf7, 0xf5, 0xd2, 0xd2, 0xd2, 0x93, 0x93, 0x93, 0xba, 0xb8, 0xb5, 0x6d, 0x6c, 0x68, 0x38, 0x2e, 0x2c, 0x29, 0x21, 0x1a, 0x39, 0x2e, 0x28, 0x47, 0x36, 0x2d, 0x31, 0x22, 0x1b, 0x2a, 0x1b, 0x14, 0x2b, 0x1b, 0x0f, 0x2a, 0x1a, 0x0e, 0x29, 0x1b, 0x11, 0x24, 0x16, 0x0d, 0x2b, 0x1c, 0x0f, 0x2d, 0x1c, 0x14, 0x2b, 0x1c, 0x10, 0x22, 0x16, 0x0d, 0x22, 0x18, 0x0f, 0x29, 0x1a, 0x11, 0x14, 0x05, 0x04, 0x21, 0x10, 0x0a, 0x1b, 0x11, 0x06, 0x22, 0x14, 0x0b, 0x1e, 0x0f, 0x0b, 0x25, 0x1b, 0x12, 0x23, 0x14, 0x0d, 0x17, 0x0c, 0x06, 0x1c, 0x11, 0x0b, 0x0b, 0x05, 0x03, 0x07, 0x01, 0x00, 0x0c, 0x06, 0x00, 0x0d, 0x02, 0x00, 0x0d, 0x06, 0x02, 0x07, 0x03, 0x04, 0x00, 0x00, 0x00, 0x07, 0x03, 0x03, 0x07, 0x01, 0x01, 0x03, 0x02, 0x00, 0x04, 0x03, 0x02, 0x06, 0x03, 0x04, 0x05, 0x02, 0x04, 0x0a, 0x03, 0x04, 0x11, 0x06, 0x03, 0x15, 0x10, 0x0c, 0x07, 0x07, 0x06, 0x0c, 0x09, 0x04, 0x1c, 0x10, 0x05, 0x1a, 0x0e, 0x04, 0x1a, 0x0e, 0x02, 0x20, 0x13, 0x09, 0x37, 0x26, 0x17, 0x40, 0x2c, 0x1c, 0x35, 0x26, 0x16, 0x3b, 0x27, 0x16, 0x48, 0x34, 0x23, 0x2d, 0x1b, 0x0b, 0x47, 0x35, 0x25, 0x3d, 0x2e, 0x22, 0x47, 0x3a, 0x29, 0x3a, 0x2e, 0x1a, 0x3b, 0x30, 0x20, 0x26, 0x19, 0x0f, 0x40, 0x2e, 0x1d, 0x3c, 0x29, 0x1b, 0x3a, 0x2b, 0x1a, 0x52, 0x43, 0x32, 0x35, 0x28, 0x1d, 0x4e, 0x3a, 0x29, 0x67, 0x50, 0x3f, 0x5b, 0x43, 0x33, 0x59, 0x46, 0x34, 0x57, 0x44, 0x32, 0x45, 0x33, 0x22, 0x5d, 0x47, 0x33, 0x4f, 0x38, 0x24, 0x54, 0x3d, 0x29, 0x62, 0x4e, 0x3d, 0x42, 0x2f, 0x1d, 0x44, 0x31, 0x1f, 0x55, 0x41, 0x30, 0x43, 0x35, 0x25, 0x3c, 0x2e, 0x1f, 0x46, 0x36, 0x26, 0x30, 0x1e, 0x0e, 0x3d, 0x2c, 0x1d, 0x3d, 0x2c, 0x1e, 0x3b, 0x28, 0x1a, 0x3e, 0x2a, 0x1d, 0x38, 0x24, 0x16, 0x3a, 0x28, 0x1a, 0x2e, 0x20, 0x15, 0x3c, 0x2b, 0x21, 0x2a, 0x1b, 0x0c, 0x39, 0x26, 0x1a, 0x55, 0x3f, 0x2c, 0x4c, 0x39, 0x26, 0x54, 0x42, 0x29, 0x33, 0x21, 0x13, 0x45, 0x34, 0x26, 0x2e, 0x1f, 0x18, 0x2a, 0x15, 0x0c, 0x43, 0x2b, 0x1d, 0x5a, 0x42, 0x34, 0x62, 0x48, 0x34, 0x36, 0x26, 0x19, 0x3f, 0x2c, 0x1c, 0x48, 0x34, 0x25, 0x4d, 0x3a, 0x2b, 0x36, 0x26, 0x19, 0x32, 0x22, 0x17, 0x26, 0x18, 0x10, 0x3c, 0x2c, 0x24, 0x40, 0x31, 0x2a, 0x44, 0x35, 0x2e, 0x53, 0x4a, 0x41, 0x63, 0x5a, 0x51, 0x94, 0x8f, 0x89, 0x96, 0x91, 0x8b, 0xc4, 0xc5, 0xc0, 0xd6, 0xd7, 0xd3, 0xef, 0xef, 0xed, 0xef, 0xef, 0xed, 0xf6, 0xf6, 0xf6, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xf2, 0xf2, 0xf2, 0xea, 0xea, 0xe8, 0xf5, 0xf5, 0xf3, 0xd3, 0xd3, 0xd3, 0x98, 0x99, 0x94, 0xa6, 0xa5, 0xa6, 0x56, 0x52, 0x4d, 0x31, 0x29, 0x24, 0x29, 0x22, 0x1c, 0x38, 0x2f, 0x28, 0x32, 0x25, 0x1a, 0x35, 0x24, 0x1c, 0x35, 0x24, 0x1c, 0x2c, 0x1b, 0x12, 0x34, 0x23, 0x1a, 0x26, 0x19, 0x10, 0x30, 0x1f, 0x12, 0x34, 0x24, 0x17, 0x31, 0x22, 0x18, 0x21, 0x13, 0x0b, 0x1c, 0x0e, 0x07, 0x2c, 0x1d, 0x15, 0x2d, 0x1f, 0x16, 0x27, 0x18, 0x11, 0x32, 0x24, 0x1b, 0x1b, 0x0d, 0x04, 0x12, 0x06, 0x00, 0x1b, 0x10, 0x08, 0x1f, 0x14, 0x0a, 0x1a, 0x0d, 0x09, 0x1e, 0x11, 0x09, 0x0e, 0x04, 0x00, 0x0c, 0x05, 0x02, 0x04, 0x01, 0x01, 0x09, 0x03, 0x02, 0x18, 0x0a, 0x04, 0x10, 0x06, 0x02, 0x0c, 0x02, 0x03, 0x01, 0x02, 0x03, 0x08, 0x04, 0x00, 0x03, 0x01, 0x00, 0x02, 0x01, 0x00, 0x03, 0x02, 0x01, 0x03, 0x02, 0x01, 0x04, 0x01, 0x01, 0x07, 0x03, 0x02, 0x02, 0x02, 0x00, 0x09, 0x08, 0x06, 0x08, 0x07, 0x06, 0x11, 0x0a, 0x03, 0x11, 0x09, 0x04, 0x11, 0x07, 0x00, 0x1e, 0x14, 0x0c, 0x27, 0x1e, 0x12, 0x37, 0x26, 0x14, 0x39, 0x27, 0x19, 0x28, 0x1b, 0x0b, 0x27, 0x18, 0x0c, 0x35, 0x25, 0x16, 0x36, 0x26, 0x18, 0x38, 0x29, 0x1a, 0x3a, 0x2a, 0x19, 0x34, 0x26, 0x16, 0x29, 0x1f, 0x0e, 0x35, 0x28, 0x19, 0x31, 0x21, 0x14, 0x40, 0x2f, 0x22, 0x42, 0x31, 0x25, 0x2b, 0x1b, 0x0e, 0x31, 0x21, 0x14, 0x45, 0x37, 0x29, 0x5c, 0x4b, 0x39, 0x65, 0x51, 0x3f, 0x61, 0x4e, 0x3c, 0x56, 0x43, 0x31, 0x58, 0x45, 0x34, 0x58, 0x46, 0x31, 0x5b, 0x48, 0x32, 0x52, 0x3e, 0x2c, 0x51, 0x3d, 0x2c, 0x68, 0x54, 0x40, 0x48, 0x38, 0x26, 0x39, 0x28, 0x18, 0x61, 0x50, 0x40, 0x33, 0x23, 0x14, 0x20, 0x0f, 0x06, 0x2a, 0x1c, 0x10, 0x34, 0x24, 0x17, 0x49, 0x34, 0x23, 0x39, 0x2a, 0x1c, 0x3d, 0x2b, 0x1a, 0x43, 0x30, 0x20, 0x3f, 0x2b, 0x1d, 0x45, 0x31, 0x25, 0x48, 0x35, 0x23, 0x2c, 0x1a, 0x0d, 0x43, 0x31, 0x23, 0x44, 0x34, 0x24, 0x46, 0x32, 0x1f, 0x51, 0x3e, 0x2e, 0x4f, 0x3c, 0x2a, 0x4c, 0x37, 0x23, 0x4c, 0x3b, 0x2c, 0x38, 0x27, 0x1c, 0x30, 0x1f, 0x0f, 0x3f, 0x2d, 0x1b, 0x58, 0x46, 0x38, 0x47, 0x31, 0x20, 0x46, 0x33, 0x23, 0x3e, 0x2d, 0x1c, 0x44, 0x2d, 0x21, 0x39, 0x28, 0x1e, 0x3a, 0x2b, 0x22, 0x34, 0x25, 0x1c, 0x36, 0x26, 0x1d, 0x3d, 0x2d, 0x24, 0x44, 0x38, 0x2e, 0x4b, 0x43, 0x3d, 0x5a, 0x4f, 0x46, 0x66, 0x5b, 0x52, 0x6e, 0x6a, 0x64, 0xaa, 0xa7, 0xa2, 0xb6, 0xb4, 0xb1, 0xd8, 0xd7, 0xd3, 0xe7, 0xe8, 0xe5, 0xf8, 0xf8, 0xf6, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xed, 0xed, 0xed, 0xf2, 0xf2, 0xf0, 0xf4, 0xf4, 0xf2, 0xc7, 0xc7, 0xc7, 0xce, 0xcf, 0xc9, 0x79, 0x78, 0x77, 0x55, 0x50, 0x4d, 0x30, 0x29, 0x23, 0x3d, 0x36, 0x30, 0x31, 0x28, 0x21, 0x31, 0x24, 0x1a, 0x36, 0x26, 0x1d, 0x31, 0x20, 0x18, 0x2b, 0x1b, 0x12, 0x2f, 0x1e, 0x16, 0x2b, 0x1e, 0x14, 0x33, 0x22, 0x14, 0x39, 0x27, 0x17, 0x3f, 0x2c, 0x20, 0x25, 0x16, 0x0e, 0x29, 0x1c, 0x14, 0x29, 0x19, 0x12, 0x31, 0x23, 0x1a, 0x2e, 0x20, 0x17, 0x31, 0x22, 0x19, 0x2a, 0x1c, 0x13, 0x20, 0x16, 0x0d, 0x14, 0x09, 0x01, 0x0e, 0x09, 0x06, 0x06, 0x01, 0x02, 0x1e, 0x11, 0x08, 0x12, 0x08, 0x04, 0x0b, 0x03, 0x01, 0x03, 0x00, 0x01, 0x15, 0x0b, 0x07, 0x13, 0x09, 0x04, 0x17, 0x0d, 0x08, 0x10, 0x03, 0x05, 0x03, 0x01, 0x00, 0x11, 0x09, 0x02, 0x05, 0x03, 0x02, 0x03, 0x01, 0x00, 0x02, 0x01, 0x00, 0x05, 0x03, 0x01, 0x02, 0x01, 0x00, 0x04, 0x02, 0x01, 0x06, 0x02, 0x02, 0x03, 0x01, 0x00, 0x04, 0x02, 0x01, 0x0f, 0x07, 0x00, 0x12, 0x0a, 0x06, 0x06, 0x02, 0x00, 0x07, 0x03, 0x00, 0x12, 0x0c, 0x06, 0x26, 0x18, 0x0b, 0x38, 0x27, 0x18, 0x20, 0x12, 0x0b, 0x1b, 0x12, 0x0a, 0x32, 0x1e, 0x0f, 0x2a, 0x1b, 0x0c, 0x2b, 0x1b, 0x0c, 0x2d, 0x1d, 0x0b, 0x3a, 0x2c, 0x1c, 0x19, 0x0e, 0x05, 0x2f, 0x21, 0x14, 0x35, 0x25, 0x16, 0x34, 0x24, 0x18, 0x48, 0x38, 0x2b, 0x25, 0x15, 0x08, 0x2f, 0x20, 0x13, 0x36, 0x28, 0x18, 0x61, 0x4f, 0x3d, 0x5d, 0x4d, 0x3d, 0x50, 0x40, 0x30, 0x51, 0x3e, 0x2c, 0x54, 0x41, 0x2f, 0x5b, 0x49, 0x33, 0x5c, 0x4a, 0x34, 0x46, 0x33, 0x22, 0x48, 0x35, 0x23, 0x56, 0x42, 0x2e, 0x3f, 0x2f, 0x1d, 0x3a, 0x28, 0x18, 0x3f, 0x2d, 0x1d, 0x2d, 0x1d, 0x0e, 0x1e, 0x0d, 0x05, 0x26, 0x19, 0x0e, 0x33, 0x23, 0x16, 0x49, 0x33, 0x22, 0x32, 0x23, 0x15, 0x3e, 0x2c, 0x19, 0x39, 0x25, 0x15, 0x3c, 0x28, 0x1a, 0x4c, 0x39, 0x27, 0x40, 0x2c, 0x1f, 0x45, 0x33, 0x25, 0x41, 0x2f, 0x21, 0x39, 0x28, 0x1d, 0x4a, 0x35, 0x26, 0x45, 0x32, 0x23, 0x4c, 0x39, 0x29, 0x53, 0x3e, 0x28, 0x3e, 0x2d, 0x1d, 0x3e, 0x2d, 0x22, 0x32, 0x21, 0x11, 0x40, 0x2f, 0x1d, 0x47, 0x36, 0x28, 0x4c, 0x39, 0x2a, 0x38, 0x28, 0x1c, 0x32, 0x23, 0x13, 0x49, 0x31, 0x25, 0x39, 0x29, 0x1f, 0x35, 0x26, 0x1d, 0x32, 0x23, 0x1a, 0x32, 0x22, 0x19, 0x38, 0x28, 0x1f, 0x42, 0x35, 0x2c, 0x5e, 0x55, 0x50, 0x4f, 0x48, 0x42, 0x6e, 0x67, 0x61, 0x81, 0x76, 0x6f, 0x96, 0x91, 0x8e, 0xbd, 0xbb, 0xb8, 0xcf, 0xcd, 0xca, 0xd6, 0xd7, 0xd4, 0xf3, 0xf3, 0xf1, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfa, 0xfa, 0xfa, 0xee, 0xee, 0xee, 0xf9, 0xf9, 0xf9, 0xeb, 0xeb, 0xeb, 0xc8, 0xc9, 0xc4, 0xd4, 0xd4, 0xd4, 0x7c, 0x79, 0x77, 0x5c, 0x56, 0x53, 0x44, 0x3d, 0x38, 0x4b, 0x44, 0x3e, 0x24, 0x1a, 0x13, 0x3d, 0x2e, 0x23, 0x39, 0x29, 0x1e, 0x2c, 0x1b, 0x11, 0x2c, 0x1b, 0x13, 0x30, 0x1f, 0x17, 0x2c, 0x1e, 0x15, 0x38, 0x27, 0x19, 0x4a, 0x32, 0x22, 0x40, 0x2c, 0x20, 0x2b, 0x1d, 0x14, 0x22, 0x15, 0x0b, 0x29, 0x1a, 0x11, 0x2d, 0x1f, 0x14, 0x34, 0x25, 0x1b, 0x31, 0x23, 0x1a, 0x17, 0x0b, 0x05, 0x0f, 0x07, 0x00, 0x23, 0x17, 0x0d, 0x14, 0x07, 0x00, 0x10, 0x08, 0x03, 0x1e, 0x11, 0x0b, 0x0d, 0x06, 0x03, 0x06, 0x02, 0x00, 0x06, 0x02, 0x03, 0x1e, 0x10, 0x08, 0x09, 0x04, 0x00, 0x18, 0x0b, 0x06, 0x0b, 0x02, 0x00, 0x07, 0x04, 0x01, 0x0d, 0x05, 0x00, 0x07, 0x04, 0x03, 0x05, 0x01, 0x01, 0x04, 0x01, 0x00, 0x0b, 0x05, 0x01, 0x03, 0x02, 0x01, 0x05, 0x00, 0x00, 0x0b, 0x06, 0x06, 0x02, 0x00, 0x00, 0x03, 0x00, 0x01, 0x11, 0x0a, 0x07, 0x15, 0x0e, 0x07, 0x08, 0x05, 0x02, 0x06, 0x02, 0x00, 0x0b, 0x06, 0x04, 0x1b, 0x11, 0x0a, 0x31, 0x22, 0x12, 0x23, 0x14, 0x0d, 0x0f, 0x09, 0x04, 0x35, 0x1f, 0x0d, 0x31, 0x24, 0x14, 0x12, 0x04, 0x00, 0x35, 0x25, 0x14, 0x20, 0x13, 0x05, 0x1d, 0x11, 0x0b, 0x1f, 0x12, 0x06, 0x31, 0x22, 0x14, 0x35, 0x25, 0x19, 0x3c, 0x2c, 0x20, 0x2f, 0x21, 0x16, 0x32, 0x25, 0x1a, 0x40, 0x34, 0x26, 0x55, 0x3f, 0x30, 0x4e, 0x3f, 0x32, 0x4b, 0x3b, 0x2d, 0x4a, 0x37, 0x27, 0x51, 0x3e, 0x2e, 0x50, 0x3c, 0x29, 0x46, 0x36, 0x23, 0x39, 0x28, 0x18, 0x33, 0x21, 0x11, 0x3a, 0x27, 0x15, 0x2a, 0x19, 0x0b, 0x3e, 0x2f, 0x1c, 0x27, 0x18, 0x09, 0x36, 0x27, 0x18, 0x26, 0x19, 0x10, 0x37, 0x27, 0x1b, 0x34, 0x22, 0x16, 0x45, 0x31, 0x22, 0x35, 0x24, 0x15, 0x41, 0x2f, 0x1d, 0x44, 0x31, 0x20, 0x3e, 0x2a, 0x1e, 0x3e, 0x2d, 0x1b, 0x3b, 0x29, 0x1b, 0x47, 0x35, 0x25, 0x44, 0x32, 0x22, 0x2c, 0x1a, 0x15, 0x49, 0x37, 0x27, 0x42, 0x2d, 0x1d, 0x40, 0x2b, 0x1b, 0x54, 0x41, 0x2c, 0x42, 0x2e, 0x21, 0x57, 0x47, 0x33, 0x36, 0x23, 0x17, 0x40, 0x2c, 0x1d, 0x40, 0x2c, 0x1f, 0x4a, 0x36, 0x28, 0x4d, 0x3b, 0x2e, 0x32, 0x21, 0x12, 0x3f, 0x29, 0x1d, 0x3e, 0x2d, 0x22, 0x32, 0x23, 0x1b, 0x29, 0x1b, 0x13, 0x35, 0x26, 0x1d, 0x33, 0x25, 0x1c, 0x3d, 0x32, 0x2a, 0x40, 0x37, 0x30, 0x62, 0x5a, 0x55, 0x64, 0x5f, 0x59, 0x7e, 0x74, 0x6e, 0x87, 0x82, 0x7d, 0xcf, 0xcf, 0xcd, 0xcc, 0xcd, 0xcb, 0xdf, 0xdf, 0xdd, 0xe8, 0xe8, 0xe6, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xef, 0xef, 0xef, 0xd1, 0xd2, 0xcc, 0xcb, 0xca, 0xcd, 0x9d, 0x9a, 0x98, 0x51, 0x4c, 0x47, 0x59, 0x52, 0x4c, 0x38, 0x30, 0x2b, 0x1a, 0x11, 0x0d, 0x36, 0x27, 0x1e, 0x24, 0x17, 0x0d, 0x28, 0x1b, 0x10, 0x32, 0x21, 0x19, 0x2c, 0x1b, 0x13, 0x2b, 0x1c, 0x13, 0x3e, 0x2c, 0x1f, 0x40, 0x2c, 0x1f, 0x30, 0x1f, 0x17, 0x23, 0x15, 0x0d, 0x33, 0x25, 0x1b, 0x2f, 0x20, 0x18, 0x1d, 0x0e, 0x07, 0x2b, 0x1b, 0x13, 0x2c, 0x1d, 0x13, 0x20, 0x15, 0x0d, 0x16, 0x0b, 0x02, 0x1a, 0x10, 0x07, 0x13, 0x09, 0x04, 0x1c, 0x14, 0x0b, 0x18, 0x0f, 0x0b, 0x12, 0x08, 0x05, 0x04, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x17, 0x0b, 0x01, 0x0d, 0x07, 0x01, 0x0b, 0x06, 0x03, 0x15, 0x0e, 0x08, 0x07, 0x05, 0x03, 0x0c, 0x05, 0x02, 0x0c, 0x04, 0x00, 0x08, 0x04, 0x01, 0x02, 0x01, 0x00, 0x0b, 0x06, 0x02, 0x07, 0x01, 0x00, 0x06, 0x00, 0x00, 0x07, 0x01, 0x01, 0x06, 0x01, 0x00, 0x05, 0x00, 0x00, 0x1e, 0x16, 0x13, 0x0c, 0x05, 0x03, 0x0a, 0x03, 0x01, 0x0b, 0x03, 0x02, 0x06, 0x01, 0x01, 0x13, 0x0a, 0x06, 0x2d, 0x1f, 0x16, 0x26, 0x18, 0x08, 0x0e, 0x0b, 0x05, 0x54, 0x3f, 0x2c, 0x25, 0x18, 0x09, 0x1a, 0x0c, 0x03, 0x34, 0x24, 0x17, 0x1f, 0x12, 0x07, 0x20, 0x13, 0x0b, 0x21, 0x12, 0x09, 0x38, 0x29, 0x1c, 0x38, 0x28, 0x1b, 0x2a, 0x1b, 0x10, 0x2b, 0x1d, 0x14, 0x32, 0x24, 0x1b, 0x48, 0x3a, 0x2e, 0x4a, 0x37, 0x29, 0x3a, 0x2a, 0x21, 0x42, 0x34, 0x1f, 0x49, 0x35, 0x26, 0x4e, 0x3a, 0x2b, 0x48, 0x34, 0x22, 0x38, 0x28, 0x19, 0x2c, 0x1d, 0x0e, 0x29, 0x1a, 0x0b, 0x3b, 0x2a, 0x19, 0x26, 0x14, 0x09, 0x36, 0x27, 0x14, 0x2b, 0x1b, 0x0c, 0x36, 0x27, 0x18, 0x1d, 0x13, 0x09, 0x38, 0x25, 0x15, 0x45, 0x32, 0x22, 0x49, 0x37, 0x27, 0x30, 0x1f, 0x11, 0x40, 0x2e, 0x1f, 0x50, 0x3c, 0x2c, 0x3a, 0x27, 0x17, 0x48, 0x37, 0x27, 0x3f, 0x2e, 0x1e, 0x33, 0x21, 0x13, 0x48, 0x36, 0x27, 0x32, 0x1f, 0x18, 0x46, 0x35, 0x25, 0x42, 0x2e, 0x20, 0x43, 0x2f, 0x22, 0x4c, 0x3a, 0x27, 0x40, 0x2c, 0x1e, 0x38, 0x26, 0x18, 0x3e, 0x2d, 0x1e, 0x37, 0x23, 0x16, 0x43, 0x2f, 0x22, 0x3e, 0x2b, 0x20, 0x45, 0x32, 0x28, 0x38, 0x24, 0x18, 0x45, 0x31, 0x23, 0x41, 0x2d, 0x1f, 0x44, 0x33, 0x27, 0x28, 0x1a, 0x11, 0x2c, 0x1d, 0x14, 0x2e, 0x20, 0x17, 0x36, 0x2b, 0x25, 0x4d, 0x42, 0x3b, 0x47, 0x3c, 0x36, 0x52, 0x4c, 0x44, 0x7f, 0x7a, 0x73, 0x76, 0x71, 0x6b, 0xb8, 0xb8, 0xb6, 0xd8, 0xd9, 0xd7, 0xe1, 0xe1, 0xdf, 0xe5, 0xe6, 0xe3, 0xf6, 0xf6, 0xf6, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xfa, 0xfa, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xec, 0xec, 0xec, 0xe7, 0xe8, 0xe3, 0xa8, 0xa8, 0xa9, 0x8f, 0x8d, 0x8b, 0x6a, 0x66, 0x60, 0x67, 0x61, 0x5c, 0x2a, 0x23, 0x1d, 0x1a, 0x13, 0x10, 0x25, 0x1a, 0x14, 0x25, 0x1a, 0x12, 0x23, 0x19, 0x11, 0x36, 0x25, 0x1d, 0x2d, 0x1c, 0x14, 0x3a, 0x2b, 0x21, 0x39, 0x27, 0x1a, 0x2d, 0x1e, 0x15, 0x2f, 0x21, 0x19, 0x20, 0x13, 0x0a, 0x2a, 0x1c, 0x13, 0x2b, 0x1d, 0x13, 0x2e, 0x1f, 0x0f, 0x2c, 0x1d, 0x0f, 0x25, 0x16, 0x07, 0x21, 0x14, 0x08, 0x30, 0x21, 0x17, 0x1a, 0x0f, 0x08, 0x07, 0x03, 0x02, 0x18, 0x0f, 0x07, 0x0a, 0x02, 0x02, 0x17, 0x0b, 0x05, 0x0b, 0x04, 0x04, 0x1c, 0x11, 0x07, 0x16, 0x0d, 0x05, 0x0b, 0x04, 0x00, 0x05, 0x05, 0x03, 0x12, 0x0c, 0x04, 0x09, 0x06, 0x03, 0x0a, 0x04, 0x00, 0x17, 0x0c, 0x02, 0x08, 0x05, 0x00, 0x02, 0x02, 0x03, 0x07, 0x05, 0x04, 0x1b, 0x0e, 0x07, 0x06, 0x01, 0x01, 0x08, 0x01, 0x01, 0x0c, 0x05, 0x01, 0x09, 0x02, 0x00, 0x0b, 0x03, 0x00, 0x0b, 0x02, 0x02, 0x0e, 0x04, 0x03, 0x12, 0x07, 0x05, 0x09, 0x02, 0x01, 0x11, 0x07, 0x04, 0x2d, 0x20, 0x12, 0x1f, 0x12, 0x07, 0x1a, 0x12, 0x0d, 0x53, 0x3f, 0x2d, 0x27, 0x18, 0x0a, 0x23, 0x14, 0x0a, 0x2a, 0x1b, 0x11, 0x28, 0x1c, 0x15, 0x23, 0x16, 0x0e, 0x2c, 0x1d, 0x13, 0x36, 0x27, 0x1b, 0x3c, 0x2d, 0x1f, 0x20, 0x11, 0x07, 0x33, 0x24, 0x1a, 0x4d, 0x3d, 0x32, 0x4e, 0x3e, 0x33, 0x32, 0x23, 0x14, 0x3b, 0x2b, 0x21, 0x40, 0x32, 0x1c, 0x44, 0x32, 0x22, 0x4a, 0x36, 0x27, 0x47, 0x34, 0x21, 0x2b, 0x1c, 0x0d, 0x37, 0x27, 0x18, 0x36, 0x26, 0x19, 0x31, 0x21, 0x11, 0x25, 0x14, 0x08, 0x3d, 0x2e, 0x1d, 0x33, 0x24, 0x16, 0x3b, 0x2b, 0x1b, 0x22, 0x17, 0x0b, 0x36, 0x24, 0x12, 0x40, 0x2e, 0x1b, 0x50, 0x3d, 0x2c, 0x40, 0x2d, 0x1e, 0x44, 0x32, 0x24, 0x40, 0x2d, 0x21, 0x4d, 0x3a, 0x28, 0x4d, 0x3c, 0x2b, 0x36, 0x25, 0x16, 0x36, 0x24, 0x19, 0x39, 0x27, 0x1d, 0x45, 0x34, 0x28, 0x4d, 0x3c, 0x2d, 0x41, 0x2f, 0x25, 0x3d, 0x2b, 0x1f, 0x52, 0x3f, 0x2e, 0x3e, 0x2b, 0x1c, 0x39, 0x29, 0x20, 0x43, 0x30, 0x24, 0x37, 0x24, 0x17, 0x3b, 0x28, 0x1b, 0x32, 0x22, 0x19, 0x43, 0x34, 0x2a, 0x34, 0x21, 0x15, 0x4a, 0x34, 0x27, 0x48, 0x32, 0x22, 0x53, 0x3e, 0x30, 0x36, 0x25, 0x1c, 0x2c, 0x1d, 0x15, 0x30, 0x21, 0x19, 0x2f, 0x23, 0x1c, 0x4c, 0x42, 0x3d, 0x59, 0x4d, 0x47, 0x6a, 0x64, 0x5d, 0x7a, 0x76, 0x6f, 0x8d, 0x89, 0x82, 0x93, 0x92, 0x90, 0xc2, 0xc2, 0xbf, 0xdf, 0xe0, 0xde, 0xe8, 0xe8, 0xe6, 0xf3, 0xf3, 0xf2, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xe9, 0xe9, 0xe9, 0xeb, 0xeb, 0xe9, 0xa9, 0xaa, 0xa8, 0x71, 0x6f, 0x6e, 0x74, 0x73, 0x6c, 0x51, 0x4c, 0x48, 0x28, 0x1f, 0x18, 0x26, 0x1b, 0x15, 0x21, 0x16, 0x10, 0x24, 0x19, 0x13, 0x1f, 0x14, 0x0e, 0x33, 0x23, 0x1a, 0x2c, 0x1c, 0x13, 0x41, 0x2f, 0x23, 0x32, 0x20, 0x14, 0x2f, 0x1f, 0x14, 0x2e, 0x1f, 0x14, 0x2e, 0x1f, 0x14, 0x2a, 0x1b, 0x13, 0x22, 0x12, 0x0c, 0x33, 0x24, 0x12, 0x2e, 0x1e, 0x13, 0x33, 0x24, 0x15, 0x30, 0x20, 0x12, 0x13, 0x0b, 0x08, 0x15, 0x0a, 0x08, 0x0b, 0x06, 0x02, 0x18, 0x0e, 0x06, 0x1a, 0x0e, 0x06, 0x08, 0x03, 0x00, 0x0e, 0x08, 0x09, 0x1f, 0x14, 0x06, 0x17, 0x0d, 0x05, 0x05, 0x03, 0x02, 0x0d, 0x06, 0x01, 0x0b, 0x04, 0x00, 0x16, 0x0f, 0x0a, 0x0c, 0x08, 0x05, 0x17, 0x0c, 0x07, 0x0d, 0x05, 0x03, 0x09, 0x04, 0x05, 0x0d, 0x09, 0x02, 0x21, 0x12, 0x0a, 0x0b, 0x06, 0x04, 0x10, 0x07, 0x04, 0x11, 0x07, 0x02, 0x0d, 0x03, 0x00, 0x0e, 0x05, 0x00, 0x12, 0x08, 0x04, 0x0c, 0x03, 0x00, 0x0f, 0x05, 0x00, 0x0c, 0x03, 0x00, 0x10, 0x07, 0x04, 0x1f, 0x15, 0x0b, 0x24, 0x18, 0x0d, 0x1e, 0x11, 0x0b, 0x46, 0x35, 0x24, 0x2a, 0x1a, 0x0e, 0x3b, 0x2b, 0x1f, 0x21, 0x17, 0x0c, 0x38, 0x2d, 0x23, 0x21, 0x13, 0x0a, 0x3a, 0x2c, 0x22, 0x36, 0x26, 0x1c, 0x42, 0x33, 0x23, 0x24, 0x15, 0x0d, 0x4a, 0x3b, 0x2f, 0x42, 0x31, 0x23, 0x45, 0x35, 0x29, 0x30, 0x20, 0x13, 0x49, 0x39, 0x2d, 0x47, 0x37, 0x2a, 0x49, 0x38, 0x28, 0x41, 0x2d, 0x1d, 0x4b, 0x37, 0x25, 0x31, 0x22, 0x13, 0x38, 0x29, 0x1a, 0x2e, 0x1e, 0x14, 0x31, 0x21, 0x12, 0x33, 0x23, 0x14, 0x33, 0x23, 0x17, 0x26, 0x16, 0x09, 0x43, 0x2f, 0x1d, 0x2f, 0x21, 0x11, 0x3f, 0x2b, 0x19, 0x4d, 0x39, 0x28, 0x55, 0x41, 0x30, 0x4d, 0x38, 0x28, 0x3a, 0x28, 0x19, 0x39, 0x26, 0x1f, 0x4c, 0x37, 0x29, 0x4d, 0x3a, 0x28, 0x34, 0x26, 0x17, 0x3f, 0x2e, 0x1f, 0x31, 0x1e, 0x14, 0x41, 0x31, 0x23, 0x47, 0x37, 0x29, 0x47, 0x33, 0x2c, 0x3d, 0x2c, 0x1e, 0x4d, 0x3a, 0x2a, 0x52, 0x3f, 0x2f, 0x2f, 0x22, 0x1c, 0x3a, 0x25, 0x14, 0x32, 0x20, 0x14, 0x2d, 0x1b, 0x0f, 0x3f, 0x2d, 0x25, 0x38, 0x26, 0x19, 0x3b, 0x28, 0x1c, 0x4d, 0x37, 0x28, 0x53, 0x3b, 0x2b, 0x4c, 0x37, 0x2a, 0x38, 0x27, 0x1e, 0x2e, 0x1f, 0x18, 0x34, 0x25, 0x1e, 0x35, 0x29, 0x20, 0x53, 0x4b, 0x44, 0x5b, 0x50, 0x48, 0x64, 0x5e, 0x5a, 0x7d, 0x7b, 0x74, 0x8e, 0x8c, 0x85, 0xb9, 0xb7, 0xb4, 0xb9, 0xb8, 0xb5, 0xd1, 0xd2, 0xcf, 0xe3, 0xe4, 0xe1, 0xed, 0xed, 0xeb, 0xfd, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xf5, 0xf5, 0xf5, 0xca, 0xca, 0xc8, 0xac, 0xac, 0xaa, 0x92, 0x90, 0x8f, 0x7c, 0x7b, 0x74, 0x47, 0x42, 0x3f, 0x25, 0x1c, 0x15, 0x24, 0x19, 0x13, 0x1f, 0x14, 0x0e, 0x20, 0x15, 0x0f, 0x2e, 0x23, 0x1d, 0x37, 0x26, 0x1e, 0x2e, 0x1e, 0x15, 0x42, 0x30, 0x24, 0x30, 0x1e, 0x12, 0x35, 0x23, 0x16, 0x38, 0x26, 0x18, 0x3b, 0x29, 0x1a, 0x37, 0x25, 0x19, 0x2b, 0x19, 0x12, 0x28, 0x18, 0x0b, 0x26, 0x16, 0x0d, 0x3b, 0x2c, 0x1d, 0x38, 0x28, 0x1a, 0x13, 0x0c, 0x07, 0x2d, 0x1d, 0x10, 0x19, 0x0f, 0x07, 0x1d, 0x10, 0x05, 0x0b, 0x04, 0x01, 0x03, 0x00, 0x01, 0x0e, 0x09, 0x05, 0x21, 0x14, 0x0b, 0x26, 0x17, 0x0b, 0x08, 0x02, 0x00, 0x04, 0x03, 0x03, 0x28, 0x1f, 0x19, 0x18, 0x0f, 0x07, 0x00, 0x02, 0x04, 0x12, 0x0c, 0x05, 0x26, 0x1b, 0x0e, 0x0f, 0x06, 0x01, 0x0f, 0x0c, 0x05, 0x2e, 0x1d, 0x14, 0x13, 0x09, 0x05, 0x15, 0x09, 0x02, 0x1e, 0x0f, 0x06, 0x17, 0x08, 0x00, 0x12, 0x09, 0x04, 0x13, 0x0a, 0x05, 0x0f, 0x06, 0x03, 0x13, 0x08, 0x03, 0x15, 0x0c, 0x05, 0x10, 0x07, 0x00, 0x11, 0x0b, 0x0a, 0x31, 0x21, 0x17, 0x27, 0x1a, 0x12, 0x35, 0x23, 0x17, 0x39, 0x29, 0x1c, 0x44, 0x34, 0x28, 0x28, 0x1d, 0x13, 0x24, 0x19, 0x0f, 0x2d, 0x1f, 0x16, 0x2e, 0x20, 0x17, 0x50, 0x40, 0x36, 0x3e, 0x2f, 0x1f, 0x39, 0x2a, 0x22, 0x48, 0x38, 0x2c, 0x3e, 0x2d, 0x1f, 0x44, 0x34, 0x27, 0x3e, 0x2e, 0x22, 0x46, 0x36, 0x29, 0x34, 0x24, 0x17, 0x43, 0x32, 0x25, 0x51, 0x3e, 0x28, 0x4c, 0x38, 0x26, 0x32, 0x22, 0x14, 0x32, 0x22, 0x14, 0x2b, 0x1a, 0x10, 0x37, 0x27, 0x18, 0x34, 0x25, 0x16, 0x3b, 0x2b, 0x1f, 0x36, 0x26, 0x19, 0x43, 0x2e, 0x1c, 0x40, 0x32, 0x23, 0x47, 0x33, 0x21, 0x40, 0x2d, 0x1b, 0x4f, 0x39, 0x26, 0x5c, 0x44, 0x30, 0x48, 0x33, 0x21, 0x2c, 0x19, 0x12, 0x45, 0x2f, 0x21, 0x51, 0x3e, 0x2d, 0x37, 0x2a, 0x1a, 0x42, 0x30, 0x22, 0x3a, 0x27, 0x1d, 0x32, 0x21, 0x19, 0x2f, 0x1f, 0x16, 0x47, 0x33, 0x2c, 0x49, 0x38, 0x2a, 0x38, 0x24, 0x15, 0x5e, 0x4a, 0x3b, 0x3e, 0x2a, 0x1f, 0x49, 0x38, 0x29, 0x2a, 0x18, 0x0c, 0x2b, 0x19, 0x0d, 0x43, 0x30, 0x28, 0x33, 0x21, 0x14, 0x3d, 0x2d, 0x23, 0x3c, 0x2a, 0x1f, 0x4b, 0x34, 0x26, 0x46, 0x30, 0x24, 0x40, 0x2f, 0x26, 0x32, 0x23, 0x1c, 0x31, 0x23, 0x1c, 0x30, 0x25, 0x1d, 0x52, 0x43, 0x38, 0x4a, 0x3f, 0x36, 0x5b, 0x55, 0x51, 0x85, 0x7e, 0x78, 0x84, 0x7d, 0x78, 0xb8, 0xb6, 0xb3, 0xc6, 0xc5, 0xc1, 0xd6, 0xd6, 0xd4, 0xd6, 0xd6, 0xd4, 0xf2, 0xf2, 0xf0, 0xf4, 0xf5, 0xf2, 0xfb, 0xfb, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xce, 0xcf, 0xc8, 0x97, 0x97, 0x96, 0x8c, 0x8b, 0x87, 0x8a, 0x89, 0x85, 0x47, 0x40, 0x3b, 0x23, 0x17, 0x13, 0x22, 0x16, 0x11, 0x2a, 0x1b, 0x12, 0x41, 0x2b, 0x20, 0x36, 0x28, 0x1e, 0x30, 0x22, 0x1b, 0x3b, 0x29, 0x1f, 0x30, 0x1f, 0x16, 0x2a, 0x19, 0x10, 0x36, 0x26, 0x1a, 0x38, 0x28, 0x1a, 0x2f, 0x1f, 0x11, 0x22, 0x14, 0x0e, 0x29, 0x1c, 0x12, 0x23, 0x15, 0x0b, 0x1d, 0x11, 0x0a, 0x2c, 0x1d, 0x0e, 0x30, 0x20, 0x12, 0x16, 0x0a, 0x06, 0x28, 0x18, 0x0b, 0x25, 0x15, 0x08, 0x32, 0x22, 0x10, 0x12, 0x0a, 0x06, 0x02, 0x01, 0x02, 0x0c, 0x0c, 0x03, 0x19, 0x09, 0x03, 0x14, 0x09, 0x02, 0x0d, 0x08, 0x07, 0x14, 0x0e, 0x08, 0x0e, 0x0c, 0x0b, 0x0d, 0x06, 0x01, 0x06, 0x02, 0x01, 0x0a, 0x06, 0x01, 0x27, 0x1a, 0x0c, 0x1e, 0x12, 0x09, 0x1a, 0x10, 0x09, 0x26, 0x18, 0x12, 0x1c, 0x10, 0x08, 0x13, 0x0b, 0x02, 0x20, 0x14, 0x08, 0x1a, 0x0d, 0x09, 0x0e, 0x05, 0x02, 0x15, 0x09, 0x02, 0x19, 0x0b, 0x05, 0x17, 0x09, 0x03, 0x13, 0x0a, 0x04, 0x13, 0x09, 0x03, 0x17, 0x0e, 0x09, 0x38, 0x2a, 0x20, 0x2f, 0x22, 0x18, 0x28, 0x15, 0x0a, 0x3e, 0x30, 0x21, 0x4c, 0x3e, 0x2f, 0x3f, 0x2f, 0x21, 0x23, 0x1b, 0x15, 0x37, 0x2c, 0x20, 0x2d, 0x1d, 0x11, 0x4d, 0x42, 0x35, 0x3b, 0x2b, 0x21, 0x4c, 0x3b, 0x2c, 0x4c, 0x3b, 0x2d, 0x3d, 0x2b, 0x1d, 0x58, 0x48, 0x3c, 0x3f, 0x2f, 0x22, 0x3c, 0x2c, 0x24, 0x37, 0x27, 0x1a, 0x3d, 0x2a, 0x1c, 0x50, 0x3d, 0x2a, 0x3c, 0x2a, 0x1b, 0x25, 0x17, 0x0b, 0x2d, 0x1f, 0x12, 0x29, 0x1b, 0x0e, 0x38, 0x28, 0x1b, 0x31, 0x21, 0x15, 0x2f, 0x1f, 0x12, 0x42, 0x32, 0x25, 0x35, 0x23, 0x15, 0x45, 0x35, 0x26, 0x46, 0x34, 0x23, 0x48, 0x35, 0x23, 0x55, 0x40, 0x2f, 0x5f, 0x47, 0x33, 0x3f, 0x2f, 0x20, 0x3e, 0x2c, 0x1f, 0x46, 0x33, 0x27, 0x52, 0x40, 0x2e, 0x2f, 0x21, 0x12, 0x49, 0x37, 0x27, 0x4a, 0x39, 0x29, 0x3e, 0x2a, 0x1d, 0x2f, 0x20, 0x17, 0x38, 0x2a, 0x22, 0x48, 0x36, 0x2b, 0x3e, 0x2b, 0x1f, 0x44, 0x36, 0x28, 0x37, 0x28, 0x1e, 0x56, 0x41, 0x34, 0x26, 0x14, 0x0b, 0x36, 0x23, 0x1b, 0x37, 0x26, 0x1e, 0x36, 0x25, 0x1c, 0x38, 0x26, 0x1b, 0x35, 0x24, 0x18, 0x48, 0x34, 0x26, 0x33, 0x23, 0x17, 0x49, 0x36, 0x2a, 0x38, 0x29, 0x22, 0x35, 0x27, 0x20, 0x2e, 0x25, 0x1e, 0x3e, 0x34, 0x2c, 0x48, 0x3a, 0x34, 0x4c, 0x48, 0x40, 0x73, 0x6a, 0x65, 0x93, 0x8f, 0x86, 0x8b, 0x89, 0x85, 0xd6, 0xd7, 0xd7, 0xdc, 0xdc, 0xda, 0xde, 0xdf, 0xdd, 0xe8, 0xe9, 0xe6, 0xf8, 0xf8, 0xf6, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } diff --git a/examples/app_yolov8_classification/src/main.xc b/examples/app_yolov8_classification/src/main.xc new file mode 100644 index 000000000..ff6a4e766 --- /dev/null +++ b/examples/app_yolov8_classification/src/main.xc @@ -0,0 +1,45 @@ +#include "flash_server.h" +#include "stdio.h" +#include +#include +#include + +#define NUMBER_OF_MODELS 1 +#define NFLASH_SPECS 1 + +fl_QuadDeviceSpec flash_spec[NFLASH_SPECS] = { + FL_QUADDEVICE_DEFAULT //FL_QUADDEVICE_MACRONIX_MX25R6435FM2IH0 +}; + +on tile[0]: fl_QSPIPorts qspi = { + PORT_SQI_CS, + PORT_SQI_SCLK, + PORT_SQI_SIO, + XS1_CLKBLK_2 +}; + +extern void model_init(chanend f); +extern void inference(); + +int main(void) { + chan c_flash[1]; + + par { + on tile[0] : { + flash_t headers[NUMBER_OF_MODELS]; + flash_server(c_flash, headers, NUMBER_OF_MODELS, qspi, flash_spec, 1); + } + + on tile[1] : { + unsafe { + c_flash[0] <: FLASH_SERVER_INIT; + model_init(c_flash[0]); + + inference(); + + c_flash[0] <: FLASH_SERVER_QUIT; + } + } + } + return 0; +} diff --git a/examples/app_yolov8_classification/src/support.cpp b/examples/app_yolov8_classification/src/support.cpp new file mode 100644 index 000000000..5085b57f1 --- /dev/null +++ b/examples/app_yolov8_classification/src/support.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include "model.tflite.h" +#include + +// The sample input image is initialized at the beginning of the tensor arena. +// Before we run inference, the input image is copied to the input tensor +// location in the tensor arena. +// With this optimization, we don't need an extra array to store the input +// image. Sample input image is of a LION and of size 160x160x3 = 76800 bytes +uint8_t tensor_arena[LARGEST_TENSOR_ARENA_SIZE] __attribute__((aligned(8))) = + LION_IMAGE; +#define LION_CLASS 291 + +void init(unsigned flash_data) { model_init((void *)flash_data); } + +void run() { + int8_t *p = model_input(0)->data.int8; + // Copy the input image into input tensor location + // The input image values are between 0 and 255 + // Adjust the input image values to be between -128 and 127 + for (int i = 0; i < model_input_size(0); ++i) { + p[i] = tensor_arena[i] - 128; + } + + model_invoke(); + + int maxIndex = -1; + int max = -128; + int8_t *out = model_output(0)->data.int8; + for (int i = 0; i < model_output_size(0); ++i) { + if (out[i] > max) { + max = out[i]; + maxIndex = i; + } + } + if (maxIndex == LION_CLASS) { + printf("\nCorrect - Inferred class is LION!\n"); + } else { + printf("\nIncorrect class!\n"); + } +} + +extern "C" { +void model_init(unsigned flash_data) { init(flash_data); } + +void inference() { run(); } +} diff --git a/examples/audio_network/Makefile b/examples/audio_network/Makefile new file mode 100644 index 000000000..9dba7d931 --- /dev/null +++ b/examples/audio_network/Makefile @@ -0,0 +1,30 @@ +# The TARGET variable determines what target system the application is +# compiled for. It either refers to an XN file in the source directories +# or a valid argument for the --target option when compiling. + +TARGET = xk-audio-316-mc.xn +APP_NAME = + +ifeq ($(XMOS_AITOOLSLIB_PATH),) +$(error Path to XMOS AI Tools library and headers not set correctly!) +endif +include ${XMOS_AITOOLSLIB_PATH}/buildfiles/aitoolslib.make + +# The USED_MODULES variable lists other module used by the application. These +# modules will extend the SOURCE_DIRS, INCLUDE_DIRS and LIB_DIRS variables. +# Modules are expected to be in the directory above the BASE_DIR directory. +USED_MODULES = lib_xua lib_i2c lib_src lib_xcore_math + +# Audio Class 2, Async, I2S Master, 8xInput, 8xOutput +XCC_FLAGS= -fcomment-asm -O3 -report -lquadflash -g -DUSB_TILE=tile[0] -DADAT_TX_USE_SHARED_BUFF=1 -DQUAD_SPI_FLASH=1 -DMIXER=0 -fxscope + +XCC_FLAGS += $(APP_FLAGS) $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_CPP_FLAGS += $(APP_FLAGS) -std=c++14 $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_MAP_FLAGS += $(APP_FLAGS) $(XMOS_AITOOLSLIB_LIBRARIES) + +#============================================================================= +# The following part of the Makefile includes the common build infrastructure +# for compiling XMOS applications. You should not need to edit below here. + +XMOS_MAKE_PATH ?= ../.. +include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common diff --git a/examples/audio_network/denoise_16x8.tflite b/examples/audio_network/denoise_16x8.tflite new file mode 100644 index 000000000..9be1e02fb Binary files /dev/null and b/examples/audio_network/denoise_16x8.tflite differ diff --git a/examples/audio_network/model_audioi16.tflite b/examples/audio_network/model_audioi16.tflite new file mode 100644 index 000000000..db7244ed3 Binary files /dev/null and b/examples/audio_network/model_audioi16.tflite differ diff --git a/examples/audio_network/src/apppll.h b/examples/audio_network/src/apppll.h new file mode 100644 index 000000000..9f1758383 --- /dev/null +++ b/examples/audio_network/src/apppll.h @@ -0,0 +1,111 @@ +#include +#include + +// App PLL setup +#define APP_PLL_CTL_BYPASS (0) // 0 = no bypass, 1 = bypass. +#define APP_PLL_CTL_INPUT_SEL (0) // 0 = XTAL, 1 = sysPLL +#define APP_PLL_CTL_ENABLE (1) // 0 = disabled, 1 = enabled. + +// 24MHz in, 24.576MHz out, integer mode +// Found exact solution: IN 24000000.0, OUT 24576000.0, VCO 2457600000.0, RD 5, FD 512, OD 10, FOD 10 +#define APP_PLL_CTL_OD_48 (4) // Output divider = (OD+1) +#define APP_PLL_CTL_F_48 (511) // FB divider = (F+1)/2 +#define APP_PLL_CTL_R_48 (4) // Ref divider = (R+1) + +#define APP_PLL_CTL_48 ((APP_PLL_CTL_BYPASS << 29) | (APP_PLL_CTL_INPUT_SEL << 28) | (APP_PLL_CTL_ENABLE << 27) |\ + (APP_PLL_CTL_OD_48 << 23) | (APP_PLL_CTL_F_48 << 8) | APP_PLL_CTL_R_48) + +// Fractional divide is M/N +#define APP_PLL_FRAC_EN_48 (0) // 0 = disabled +#define APP_PLL_FRAC_NPLUS1_CYCLES_48 (0) // M value is this reg value + 1. +#define APP_PLL_FRAC_TOTAL_CYCLES_48 (0) // N value is this reg value + 1. +#define APP_PLL_FRAC_48 ((APP_PLL_FRAC_EN_48 << 31) | (APP_PLL_FRAC_NPLUS1_CYCLES_48 << 8) | APP_PLL_FRAC_TOTAL_CYCLES_48) + +// 24MHz in, 22.5792MHz out (44.1kHz * 512), frac mode +// Found exact solution: IN 24000000.0, OUT 22579200.0, VCO 2257920000.0, RD 5, FD 470.400 (m = 2, n = 5), OD 5, FOD 10 +#define APP_PLL_CTL_OD_441 (4) // Output divider = (OD+1) +#define APP_PLL_CTL_F_441 (469) // FB divider = (F+1)/2 +#define APP_PLL_CTL_R_441 (4) // Ref divider = (R+1) + +#define APP_PLL_CTL_441 ((APP_PLL_CTL_BYPASS << 29) | (APP_PLL_CTL_INPUT_SEL << 28) | (APP_PLL_CTL_ENABLE << 27) |\ + (APP_PLL_CTL_OD_441 << 23) | (APP_PLL_CTL_F_441 << 8) | APP_PLL_CTL_R_441) + +#define APP_PLL_FRAC_EN_44 (1) // 1 = enabled +#define APP_PLL_FRAC_NPLUS1_CYCLES_44 (1) // M value is this reg value + 1. +#define APP_PLL_FRAC_TOTAL_CYCLES_44 (4) // N value is this reg value + 1.define APP_PLL_CTL_R_441 (4) // Ref divider = (R+1) +#define APP_PLL_FRAC_44 ((APP_PLL_FRAC_EN_44 << 31) | (APP_PLL_FRAC_NPLUS1_CYCLES_44 << 8) | APP_PLL_FRAC_TOTAL_CYCLES_44) + +#define APP_PLL_DIV_INPUT_SEL (1) // 0 = sysPLL, 1 = app_PLL +#define APP_PLL_DIV_DISABLE (0) // 1 = disabled (pin connected to X1D11), 0 = enabled divider output to pin. +#define APP_PLL_DIV_VALUE (4) // Divide by N+1 - remember there's a /2 also afterwards for 50/50 duty cycle. +#define APP_PLL_DIV ((APP_PLL_DIV_INPUT_SEL << 31) | (APP_PLL_DIV_DISABLE << 16) | APP_PLL_DIV_VALUE) + +/* TODO support more than two freqs..*/ +int AppPllEnable(int32_t clkFreq_hz) +{ + switch(clkFreq_hz) + { + case 44100*512: + + // Disable the PLL + write_node_config_reg(tile[1], XS1_SSWITCH_SS_APP_PLL_CTL_NUM, (APP_PLL_CTL_441 & 0xF7FFFFFF)); + // Enable the PLL to invoke a reset on the appPLL. + write_node_config_reg(tile[1], XS1_SSWITCH_SS_APP_PLL_CTL_NUM, APP_PLL_CTL_441); + // Must write the CTL register twice so that the F and R divider values are captured using a running clock. + write_node_config_reg(tile[1], XS1_SSWITCH_SS_APP_PLL_CTL_NUM, APP_PLL_CTL_441); + // Now disable and re-enable the PLL so we get the full 5us reset time with the correct F and R values. + write_node_config_reg(tile[1], XS1_SSWITCH_SS_APP_PLL_CTL_NUM, (APP_PLL_CTL_441 & 0xF7FFFFFF)); + write_node_config_reg(tile[1], XS1_SSWITCH_SS_APP_PLL_CTL_NUM, APP_PLL_CTL_441); + + // Set the fractional divider if used + write_node_config_reg(tile[0], XS1_SSWITCH_SS_APP_PLL_FRAC_N_DIVIDER_NUM, APP_PLL_FRAC_44); + + break; + + case 48000*512: + + // Disable the PLL + write_node_config_reg(tile[1], XS1_SSWITCH_SS_APP_PLL_CTL_NUM, (APP_PLL_CTL_48 & 0xF7FFFFFF)); + // Enable the PLL to invoke a reset on the appPLL. + write_node_config_reg(tile[1], XS1_SSWITCH_SS_APP_PLL_CTL_NUM, APP_PLL_CTL_48); + // Must write the CTL register twice so that the F and R divider values are captured using a running clock. + write_node_config_reg(tile[1], XS1_SSWITCH_SS_APP_PLL_CTL_NUM, APP_PLL_CTL_48); + // Now disable and re-enable the PLL so we get the full 5us reset time with the correct F and R values. + write_node_config_reg(tile[1], XS1_SSWITCH_SS_APP_PLL_CTL_NUM, (APP_PLL_CTL_48 & 0xF7FFFFFF)); + write_node_config_reg(tile[1], XS1_SSWITCH_SS_APP_PLL_CTL_NUM, APP_PLL_CTL_48); + + // Set the fractional divider if used + write_node_config_reg(tile[0], XS1_SSWITCH_SS_APP_PLL_FRAC_N_DIVIDER_NUM, APP_PLL_FRAC_48); + + break; + + default: + assert(0); + break; + } + + // Wait for PLL output frequency to stabilise due to fractional divider enable + delay_microseconds(100); + + // Turn on the clock output + write_node_config_reg(tile[0], XS1_SSWITCH_SS_APP_CLK_DIVIDER_NUM, APP_PLL_DIV); + + return 0; +} + +int AppPllEnable_SampleRate(int32_t sampleRate_hz) +{ + assert(sampleRate_hz >= 22050); + + if(sampleRate_hz % 22050 == 0) + { + AppPllEnable(44100*512); + } + else + { + AppPllEnable(48000*512); + } + + return 0; +} + diff --git a/examples/audio_network/src/compress_mel.py b/examples/audio_network/src/compress_mel.py new file mode 100644 index 000000000..bc6a26ac0 --- /dev/null +++ b/examples/audio_network/src/compress_mel.py @@ -0,0 +1,58 @@ +import numpy as np + +def compress_mel(filter_banks): + (num_mel_bins,num_spectral_bins) = filter_banks.shape + runs = '' + mels = '' + mel = 0 + current_run = 0 + for i in range(num_spectral_bins): + if filter_banks[mel, i] == 0.0: + mel += 1 + runs += '%d, ' % (current_run) + current_run = 0 + current_run += 1 + mels += ' (int)(%f * MEL_ONE_VALUE + 0.5),\n' % (filter_banks[mel, i]) + if current_run != 0: + runs += '%d' % (current_run) + + return """ +#define MEL_BINS %d +#define MEL_SPECTRAL_BINS %d +int mel_bins_in_overlap[MEL_BINS] = { %s }; +int mel_coefficients[MEL_SPECTRAL_BINS] = { +%s};""" %(num_mel_bins,num_spectral_bins, runs, mels) + +filter_banks = np.zeros((64, 257)) +j = 0 +for i in range(0, 16): + filter_banks[i, j] = 1.0 + j += 1 +for i in range(16, 32): + for k in range(2): + filter_banks[i, j] = 1.0 - k / 2 + filter_banks[i+1, j] = k / 2 + j += 1 +for i in range(32, 48): + for k in range(4): + filter_banks[i, j] = 1.0 - k / 4 + filter_banks[i+1, j] = k / 4 + j += 1 +for i in range(48, 63): + for k in range(10): + filter_banks[i, j] = 1.0 - k / 10 + filter_banks[i+1, j] = k / 10 + if j == 256: + break + j += 1 +print(filter_banks) +print(compress_mel(filter_banks)) +data = np.zeros((257)) +for i in range(257): + if (i & 1): + data[i] = i*3 + 1000 + else: + data[i] = -i +data2=np.inner(filter_banks, data) +print(data2) +print(np.inner(filter_banks.transpose(), data2)) diff --git a/examples/audio_network/src/config.xscope b/examples/audio_network/src/config.xscope new file mode 100644 index 000000000..ef80fed5b --- /dev/null +++ b/examples/audio_network/src/config.xscope @@ -0,0 +1,3 @@ + + + diff --git a/examples/audio_network/src/core/xk-audio-316-mc.xn b/examples/audio_network/src/core/xk-audio-316-mc.xn new file mode 100644 index 000000000..3bac56d69 --- /dev/null +++ b/examples/audio_network/src/core/xk-audio-316-mc.xn @@ -0,0 +1,92 @@ + + + Board + xcore.ai MC Audio Board + + + tileref tile[2] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/audio_network/src/core/xua_conf.h b/examples/audio_network/src/core/xua_conf.h new file mode 100644 index 000000000..b366a3e27 --- /dev/null +++ b/examples/audio_network/src/core/xua_conf.h @@ -0,0 +1,157 @@ +/** + * @file xua_conf.h + * @brief Defines relating to device configuration and customisation. + * For xCORE.ai Audio MC Board + * @author Ross Owen, XMOS Limited + */ +#ifndef _XUA_CONF_H_ +#define _XUA_CONF_H_ + +#define BCD_DEVICE_J (7) +#define BCD_DEVICE_M (1) +#define BCD_DEVICE_N (0) + +/* + * Device configuration option defines to override default defines found lib_xua/api/xua_conf_defaults.h + * + * Build can be customised but changing and adding defines here + * + * Note, we check if they are already defined in Makefile + */ + +/*** Defines relating to basic functionality ***/ +/* Enable/Disable MIDI - Default is MIDI off */ +#ifndef MIDI +#define MIDI (0) +#endif + +/* Enable/Disable S/PDIF output - Default is S/PDIF off */ +#ifndef XUA_SPDIF_TX_EN +#define XUA_SPDIF_TX_EN (0) +#endif + +/* Enable/Disable S/PDIF input - Default is S/PDIF off */ +#ifndef XUA_SPDIF_RX_EN +#define XUA_SPDIF_RX_EN (0) +#endif + +/* Enable/Disable ADAT output - Default is ADAT off */ +#ifndef XUA_ADAT_TX_EN +#define XUA_ADAT_TX_EN (0) +#endif + +/* Enable/Disable ADAT input - Default is ADAT off */ +#ifndef XUA_ADAT_RX_EN +#define XUA_ADAT_RX_EN (0) +#endif + +/* Enable/Disable Mixing core(s) - Default is on */ +#ifndef MIXER +#define MIXER (1) +#endif + +/* Set the number of mixes to perform - Default is 0 i.e mixing disabled */ +#ifndef MAX_MIX_COUNT +#define MAX_MIX_COUNT (0) +#endif + +/* Audio Class version - Default is 2.0 */ +#ifndef AUDIO_CLASS +#define AUDIO_CLASS (2) +#endif + +/*** Defines relating to channel counts ***/ +/* Number of I2S channels to DACs*/ +#ifndef I2S_CHANS_DAC +#define I2S_CHANS_DAC (8) +#endif + +/* Number of I2S channels from ADCs */ +#ifndef I2S_CHANS_ADC +#define I2S_CHANS_ADC (8) +#endif + +/* Number of USB streaming channels - by default calculate by counting audio interfaces */ +#ifndef NUM_USB_CHAN_IN +#define NUM_USB_CHAN_IN (I2S_CHANS_ADC + 2*XUA_SPDIF_RX_EN + 8*XUA_ADAT_RX_EN) /* Device to Host */ +#endif + +#ifndef NUM_USB_CHAN_OUT +#define NUM_USB_CHAN_OUT (I2S_CHANS_DAC + 2*XUA_SPDIF_TX_EN + 8*XUA_ADAT_TX_EN) /* Host to Device */ +#endif + +/*** Defines relating to channel arrangement/indices ***/ +/* Channel index of S/PDIF Tx channels: separate channels after analogue channels (if they fit) */ +#ifndef SPDIF_TX_INDEX + #if (I2S_CHANS_DAC + 2*XUA_SPDIF_TX_EN) <= NUM_USB_CHAN_OUT + #define SPDIF_TX_INDEX (I2S_CHANS_DAC) + #else + #define SPDIF_TX_INDEX (0) + #endif +#endif + +/* Channel index of S/PDIF Rx channels: separate channels after analogue channels */ +#ifndef SPDIF_RX_INDEX +#define SPDIF_RX_INDEX (I2S_CHANS_ADC) +#endif + +/* Channel index of ADAT Tx channels: separate channels after S/PDIF channels (if they fit) */ +#ifndef ADAT_TX_INDEX + #if (I2S_CHANS_DAC + 2*XUA_SPDIF_TX_EN + 8*XUA_ADAT_TX_EN) <= NUM_USB_CHAN_OUT + #define ADAT_TX_INDEX (I2S_CHANS_DAC + 2*XUA_SPDIF_TX_EN) + #else + #define ADAT_TX_INDEX (0) + #endif +#endif + +/* Channel index of ADAT Rx channels: separate channels after S/PDIF channels */ +#ifndef ADAT_RX_INDEX +#define ADAT_RX_INDEX (I2S_CHANS_ADC + 2*XUA_SPDIF_RX_EN) +#endif + +/*** Defines relating to audio frequencies ***/ +/* Master clock defines (in Hz) */ +#ifndef MCLK_441 +#define MCLK_441 (512*44100) /* 44.1, 88.2 etc */ +#endif + +#ifndef MCLK_48 +#define MCLK_48 (512*48000) /* 48, 96 etc */ +#endif + +/* Maximum frequency device runs at */ +#ifndef MAX_FREQ +#define MAX_FREQ (192000) +#endif + +/*** Defines relating to feature placement regarding tiles ***/ +#define XUD_TILE (0) +#define PLL_REF_TILE (0) + +#define AUDIO_IO_TILE (1) +#define MIDI_TILE (1) + +#define XUA_DFU_EN (0) +#define ENDPOINT_INT_INTERVAL_IN_HID (1) +#define ENDPOINT_INT_INTERVAL_OUT_HID (1) + +/*** Defines relating to USB descriptor strings and ID's ***/ +#define VENDOR_ID (0x20B1) /* XMOS VID */ +#define PID_AUDIO_2 (0x0018) +#define PID_AUDIO_1 (0x0017) +#define PRODUCT_STR_A2 "XMOS xCORE.ai MC (UAC2.0)" +#define PRODUCT_STR_A1 "XMOS xCORE.ai MC (UAC1.0)" + +/* Board power source - Default is bus-powered */ +#ifndef XUA_POWERMODE +#define XUA_POWERMODE XUA_POWERMODE_BUS +#endif + +/* Enable/Disable example HID code - Default is off */ +#ifndef HID_CONTROLS +#define HID_CONTROLS (0) +#endif + +#include "user_main.h" + +#endif diff --git a/examples/audio_network/src/cs2100.h b/examples/audio_network/src/cs2100.h new file mode 100644 index 000000000..c660480dc --- /dev/null +++ b/examples/audio_network/src/cs2100.h @@ -0,0 +1,93 @@ +#ifndef CS2100_I2C_DEVICE_ADDR +#define CS2100_I2C_DEVICE_ADDR (0x9c>>1) +#endif + +#define CS2100_DEVICE_CONTROL (0x02) +#define CS2100_DEVICE_CONFIG_1 (0x03) +#define CS2100_GLOBAL_CONFIG (0x05) +#define CS2100_RATIO_1 (0x06) +#define CS2100_RATIO_2 (0x07) +#define CS2100_RATIO_3 (0x08) +#define CS2100_RATIO_4 (0x09) +#define CS2100_FUNC_CONFIG_1 (0x16) +#define CS2100_FUNC_CONFIG_2 (0x17) + +/* TODO this is a key frequency and should be moved into lib_xua */ +#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) + #define PLL_SYNC_FREQ (500) +#else + #if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) + /* Choose a frequency the xcore can easily generate internally */ + #define PLL_SYNC_FREQ (300) + #else + #define PLL_SYNC_FREQ (1000000) + #endif +#endif + +#ifndef CS2100_REGREAD +#define CS2100_REGREAD(reg, data) {data[0] = i2c.read_reg(CS2100_I2C_DEVICE_ADDR, reg, result);} +#endif + +#ifndef CS2100_REGREAD_ASSERT +#define CS2100_REGREAD_ASSERT(reg, data, expected) {data[0] = i2c.read_reg(CS2100_I2C_DEVICE_ADDR, reg, result); assert(data[0] == expected);} +#endif + +#ifndef CS2100_REGWRITE +#define CS2100_REGWRITE(reg, val) {result = i2c.write_reg(CS2100_I2C_DEVICE_ADDR, reg, val);} +#endif + +#ifndef UNSAFE +#define UNSAFE +#endif + + +/* Init of CS2100 */ +void PllInit(UNSAFE client interface i2c_master_if i2c) +{ + UNSAFE + { + unsigned char data[1] = {0}; + i2c_regop_res_t result; + + /* Enable init */ + CS2100_REGWRITE(CS2100_DEVICE_CONFIG_1, 0x07); + CS2100_REGWRITE(CS2100_GLOBAL_CONFIG, 0x01); + CS2100_REGWRITE(CS2100_FUNC_CONFIG_1, 0x08); + CS2100_REGWRITE(CS2100_FUNC_CONFIG_2, 0x00); //0x10 for always gen clock even when unlocked + + /* Read back and check */ + CS2100_REGREAD_ASSERT(CS2100_DEVICE_CONFIG_1, data, 0x07); + CS2100_REGREAD_ASSERT(CS2100_GLOBAL_CONFIG, data, 0x01); + CS2100_REGREAD_ASSERT(CS2100_FUNC_CONFIG_1, data, 0x08); + CS2100_REGREAD_ASSERT(CS2100_FUNC_CONFIG_2, data, 0x00); + + //i2c.shutdown(); + } +} + +/* Setup PLL multiplier */ +void PllMult(unsigned output, unsigned ref, UNSAFE client interface i2c_master_if i2c) +{ + UNSAFE + + { + unsigned char data[1] = {0}; + i2c_regop_res_t result; + + /* PLL expects 12:20 format, convert output and ref to 12:20 */ + /* Shift up the dividend by 12 to retain format... */ + unsigned mult = (unsigned) ((((unsigned long long)output) << 32) / (((unsigned long long)ref) << 20)); + + CS2100_REGWRITE(CS2100_RATIO_1, (mult >> 24) & 0xFF); + CS2100_REGWRITE(CS2100_RATIO_2, (mult >> 16) & 0xFF); + CS2100_REGWRITE(CS2100_RATIO_3, (mult >> 8) & 0xFF); + CS2100_REGWRITE(CS2100_RATIO_4, (mult & 0xFF)); + + /* Read back and check */ + CS2100_REGREAD_ASSERT(CS2100_RATIO_1, data, ((mult >> 24) & 0xFF)); + CS2100_REGREAD_ASSERT(CS2100_RATIO_2, data, ((mult >> 16) & 0xFF)); + CS2100_REGREAD_ASSERT(CS2100_RATIO_3, data, ((mult >> 8) & 0xFF)); + CS2100_REGREAD_ASSERT(CS2100_RATIO_4, data, (mult & 0xFF)); + } +} + diff --git a/examples/audio_network/src/data_path.c b/examples/audio_network/src/data_path.c new file mode 100644 index 000000000..d4455c840 --- /dev/null +++ b/examples/audio_network/src/data_path.c @@ -0,0 +1,142 @@ +#include +#include +#include +#include +#include +#include "assert.h" +#include "mel.h" +#include "mel_parameters.h" + +#define NN_INPUT_CHANNELS 1 +#define NN_OUTPUT_CHANNELS 1 + +void nn_offload_data_to_dsp_engine(chanend_t c_to_dspc, unsigned sampstoNN[], unsigned fromNN[]) +{ + // TODO: reroll these loops + chanend_out_word(c_to_dspc, sampstoNN[0]); + chanend_out_word(c_to_dspc, sampstoNN[1]); + chanend_out_word(c_to_dspc, sampstoNN[2]); + chanend_out_word(c_to_dspc, sampstoNN[3]); + chanend_out_word(c_to_dspc, sampstoNN[4]); + chanend_out_word(c_to_dspc, sampstoNN[5]); + chanend_out_word(c_to_dspc, sampstoNN[6]); + chanend_out_word(c_to_dspc, sampstoNN[7]); + chanend_out_word(c_to_dspc, fromNN[0]); + chanend_out_word(c_to_dspc, fromNN[1]); + chanend_out_word(c_to_dspc, fromNN[2]); + chanend_out_word(c_to_dspc, fromNN[3]); + chanend_out_word(c_to_dspc, fromNN[4]); + chanend_out_word(c_to_dspc, fromNN[5]); + chanend_out_word(c_to_dspc, fromNN[6]); + chanend_out_word(c_to_dspc, fromNN[7]); + chanend_out_end_token(c_to_dspc); + sampstoNN[0] = chanend_in_word(c_to_dspc); + sampstoNN[1] = chanend_in_word(c_to_dspc); + sampstoNN[2] = chanend_in_word(c_to_dspc); + sampstoNN[3] = chanend_in_word(c_to_dspc); + sampstoNN[4] = chanend_in_word(c_to_dspc); + sampstoNN[5] = chanend_in_word(c_to_dspc); + sampstoNN[6] = chanend_in_word(c_to_dspc); + sampstoNN[7] = chanend_in_word(c_to_dspc); + fromNN[0] = chanend_in_word(c_to_dspc); + fromNN[1] = chanend_in_word(c_to_dspc); + fromNN[2] = chanend_in_word(c_to_dspc); + fromNN[3] = chanend_in_word(c_to_dspc); + fromNN[4] = chanend_in_word(c_to_dspc); + fromNN[5] = chanend_in_word(c_to_dspc); + fromNN[6] = chanend_in_word(c_to_dspc); + fromNN[7] = chanend_in_word(c_to_dspc); + chanend_check_end_token(c_to_dspc); +} + +#include "dsp.h" + +int32_t data_processed [UPSAMPLED_WINDOW_ADVANCE][NN_OUTPUT_CHANNELS]; +int32_t data_to_be_processed [UPSAMPLED_WINDOW_ADVANCE][NN_INPUT_CHANNELS]; + +/** Function that transfers data to and from the NN subsystem. This + * provides one fundamental block worth of audio frames, and reads one + * fundamental block. + * + * \param data_from_nn 32-bit sample values that have been processed + * \param data_to_nn 32-bit sample values ready for audio processing + */ +static void data_to_and_from_nn( + int32_t data_from_nn[UPSAMPLED_WINDOW_ADVANCE][NN_OUTPUT_CHANNELS], + int32_t data_to_nn [UPSAMPLED_WINDOW_ADVANCE][NN_INPUT_CHANNELS], + chanend_t c_dsp_threads) { + memcpy(data_to_be_processed, data_to_nn, 4 * UPSAMPLED_WINDOW_ADVANCE * NN_INPUT_CHANNELS); + memcpy(data_from_nn, data_processed, 4 * UPSAMPLED_WINDOW_ADVANCE * NN_OUTPUT_CHANNELS); + chanend_out_end_token(c_dsp_threads); +} + +/** Function that blocks data up for the NN stack, and when ready starts the NN + * threads. + */ +void nn_data_transport_thread(chanend_t c_data, chanend_t c_children) { + int32_t input_data[UPSAMPLED_WINDOW_ADVANCE][NN_INPUT_CHANNELS]; + int32_t output_data[UPSAMPLED_WINDOW_ADVANCE][NN_OUTPUT_CHANNELS]; + int frame = 0; + while(1) { + for(int i = 0; i < 16; i++) { + int x = chanend_in_word(c_data); + if (i < NN_INPUT_CHANNELS) { + input_data[frame][i] = x; + } + } + chanend_check_end_token(c_data); + int nn_channel = 0; + for(int i = 0; i < 16; i++) { + int x = output_data[frame][nn_channel]; + chanend_out_word(c_data, x); + nn_channel ++; + if (nn_channel == NN_OUTPUT_CHANNELS) { + nn_channel = 0; + } + } + for(int i = 0; i < NN_OUTPUT_CHANNELS; i++) { + output_data[frame][i] = 0; + } + chanend_out_end_token(c_data); + frame++; + if (frame == UPSAMPLED_WINDOW_ADVANCE) { // TODO: this may not fit between samples + frame = 0; + data_to_and_from_nn(output_data, input_data, c_children); + } + } +} + +extern void nn_predict_masks(int *masks, int button_state, float *mels); + +void nn_dsp_thread(uint32_t thread_number, + chanend_t c_parent, + chanend_t c_button_state) { + fft_state_t fft_state; + int64_t fft_data[WINDOW_SIZE/2]; + int masks[MEL_BINS]; + float mels[MEL_BINS]; + int button_state = 0xF; + SELECT_RES( + CASE_THEN(c_parent, go), + CASE_THEN(c_button_state, buttons) + ) + { + go: + chanend_check_end_token(c_parent); + + int gain = dsp_time_to_freq(fft_data, (int *)data_to_be_processed, &fft_state); + dsp_calculate_mels(mels, fft_data, gain, MEL_BINS, + mel_coefficients, mel_bins_in_overlap); + nn_predict_masks(masks, button_state, mels); + dsp_apply_masks(fft_data, masks, 1, MEL_BINS, + mel_coefficients, mel_bins_in_overlap); + dsp_freq_to_time((int *)data_processed, fft_data, &fft_state); + continue; // TODO: CONTINUE_NO_RESET + buttons: + button_state = chanend_in_word(c_button_state); + chanend_check_end_token(c_button_state); + chanend_out_end_token(c_button_state); + continue; // TODO: CONTINUE_NO_RESET + + } +} diff --git a/examples/audio_network/src/dsp.c b/examples/audio_network/src/dsp.c new file mode 100644 index 000000000..dfaa02ef4 --- /dev/null +++ b/examples/audio_network/src/dsp.c @@ -0,0 +1,208 @@ +#include +#include +#include +#include +#include +#include "xmath/xmath.h" +#include "src.h" +#include "src_ff3_fir_coefs.h" +#include "dsp.h" +#include "log.h" +#include "raised_cosine.h" +#include "hypot.h" + +int dsp_time_to_freq(int64_t fft_output[], int data_to_be_processed[], fft_state_t *state) { + static int input_frame[WINDOW_SIZE]; // State for overlap-add; first sample is oldest + static int32_t state_ds[3][32]; // State for the down sampler + + // First advance the window, then fill the last quarter in with downsampled signals + + memmove(input_frame, input_frame + WINDOW_ADVANCE, sizeof(int) * WINDOW_OVERLAP); + for(int i = 0; i < WINDOW_ADVANCE; i++) { // 205 us + src_ff3_96t_ds((int32_t *)data_to_be_processed + UPSAMPLE_RATE*i, (int32_t *)input_frame + WINDOW_OVERLAP + i, + src_ff3_fir_coefs, state_ds); + } + + // Use a raised cosing to window it, create two bits of headroom. + // Todo: divide the raised cosine table by 2 + for(int i = 0; i < WINDOW_SIZE; i++) { // 42 us + ((int *)fft_output)[i] = ((raised_cosine_512[i]>>1) * (int64_t)input_frame[i]) >> 32; + } + + // 41 us + fft_index_bit_reversal((complex_s32_t *)fft_output, WINDOW_SIZE/2); + state->hr = 31; + state->exponent = 0; + fft_dit_forward((complex_s32_t *)fft_output, WINDOW_SIZE/2, &state->hr, &state->exponent); + fft_mono_adjust((complex_s32_t *)fft_output, WINDOW_SIZE, 0); + + return state->exponent; // Gain applied. +} + +void dsp_freq_to_time(int data_processed[], int64_t fft_input[], fft_state_t *state) { + static int output_frame[WINDOW_SIZE]; // State for overlap-add; first sample is oldest + static int32_t state_us[32]; // State for the up sampler + + // First inverse the FFT + + fft_mono_adjust((complex_s32_t *)fft_input, WINDOW_SIZE, 1); + fft_index_bit_reversal((complex_s32_t *)fft_input, WINDOW_SIZE/2); + fft_dit_inverse((complex_s32_t *)fft_input, WINDOW_SIZE/2, &state->hr, &state->exponent); + vect_s32_shl((int32_t *)fft_input, (int32_t *)fft_input, WINDOW_SIZE, state->exponent + 9 + 2 + 1 -10); + + // Now add the overlap and fill in the new bit + // TODO: that memcpy is not needed and can be done in here. + + for(int i = 0; i < WINDOW_OVERLAP; i++) { + output_frame[i] += ((int *)fft_input)[i]; + } + for(int i = WINDOW_OVERLAP; i < WINDOW_SIZE; i++) { + output_frame[i] = ((int *)fft_input)[i]; + } + // Now copy the first advance out and up sample it back to 48 kHz + for(int i = 0; i < WINDOW_ADVANCE; i++) { + src_ff3_96t_us((int32_t *)output_frame + i, (int32_t *)data_processed + UPSAMPLE_RATE*i, + src_ff3_fir_coefs, state_us); + } + // Finally memcpy the overlap - TODO: this is not needed and can be done above. + memmove(output_frame, output_frame + WINDOW_ADVANCE, sizeof(int) * WINDOW_OVERLAP); +} + +#include "mel.h" + +void dsp_calculate_mels(float mels[], int64_t fft_input[], int gain, int mel_bins, + int *mel_coefficients, int *mel_bins_in_overlap) { + int mels_int[WINDOW_SIZE/2]; + int magnitudes[WINDOW_SIZE/2+1]; + float multiplier = 0.6931471806 / (1 << LOG2_16_Q_VALUE); // log2 -> ln conversion + // Fixed point -> float conversion + magnitudes[0 ] = abs(((int *)fft_input)[0]); + magnitudes[WINDOW_SIZE/2] = abs(((int *)fft_input)[1]); + + for(int i = 2; i < WINDOW_SIZE; i+=2) { // 82 us + magnitudes[i/2] = hypot_i(((int *)fft_input)[i], ((int *)fft_input)[i+1]); + } + + mel_compress(mels_int, magnitudes, + mel_coefficients, + mel_bins_in_overlap, + WINDOW_SIZE/2+1, mel_bins); // 47 us + for(int i = 0; i < mel_bins; i++) { + mels[i] = (log2_16(mels_int[i]) + (gain << LOG2_16_Q_VALUE) - (20 << LOG2_16_Q_VALUE)) * multiplier; + } +} + +void dsp_apply_masks(int64_t fft_output[], int masks_mel[], int enabled, int mel_bins, + int *mel_coefficients, int *mel_bins_in_overlap) { + int masks_freq[WINDOW_SIZE/2+1]; + + mel_expand(masks_freq, masks_mel, // 68 us + mel_coefficients, + mel_bins_in_overlap, + WINDOW_SIZE/2+1, mel_bins); + if (enabled) { + int64_t m = masks_freq[0]; + ((int *)fft_output)[0] = (((int *)fft_output)[0] * m) >> 30; + m = masks_freq[WINDOW_SIZE/2]; + ((int *)fft_output)[1] = (((int *)fft_output)[1] * m) >> 30; + for(int i = 2; i < WINDOW_SIZE; i+=2) { // 47 us + m = masks_freq[i/2]; + ((int *)fft_output)[i] = (((int *)fft_output)[i] * m) >> 30; + ((int *)fft_output)[i+1] = (((int *)fft_output)[i+1] * m) >> 30; + } + } +} + +#ifdef LOCAL_MAIN +#include "mel_parameters.h" + +int sin_wave[16] = { + 0, 382683, 707107, 923879, 1000000, + 923879, 707107, 382683, 0, + -382683, -707107, -923879, -1000000, + -923879, -707107, -382683, +}; + +int main(void) { + fft_state_t fft_state; + int64_t fft_data[WINDOW_SIZE/2]; + int masks[MEL_BINS]; + int mels[MEL_BINS]; + int cnt = 0; + int data[UPSAMPLED_WINDOW_ADVANCE]; + int multiplier = 200;// 200; + for(int j = 0; j < 8000; j+=UPSAMPLED_WINDOW_ADVANCE) { + for(int i = j; i < j + UPSAMPLED_WINDOW_ADVANCE; i++) { + data[i-j] = sin_wave[cnt]*multiplier; + cnt++; + if (cnt == 16) cnt = 0; + } + for(int i = j; i < j + 16; i++) { + printf("%10d ", data[i-j]); + } + printf(" "); + int t0, t1, t2; + asm volatile("gettime %0" : "=r" (t0)); + int gain = dsp_time_to_freq(fft_data, data, &fft_state); + dsp_calculate_mels(mels, fft_data, gain, MEL_BINS, mel_coefficients, + mel_bins_in_overlap +); + printf("\n"); + for(int i = 0; i < 64; i++) { + printf("%d ", mels[i]); + } + printf("\n"); + + asm volatile("gettime %0" : "=r" (t1)); + for(int i = 0; i < MEL_BINS; i++) { + masks[i] = MEL_ONE_VALUE; + } + dsp_apply_masks(fft_data, masks, 1, MEL_BINS, mel_coefficients, + mel_bins_in_overlap +); + dsp_freq_to_time(data, fft_data, &fft_state); + asm volatile("gettime %0" : "=r" (t2)); + for(int i = 0; i < 16; i++) { + printf("%10d ", data[i]/2); + } + printf("\n"); + } + +} + +#endif + +#ifdef LOCAL_MAIN3 +#include "mel_parameters.h" + +int data[257]; +int data2[257]; + +static int mels[MEL_BINS+1]; + +int main(void) { + + for(int i = 0; i < 257; i++) { + if (i & 1) { + data[i] = i*3 + 1000; + } else { + data[i] = -i; + } + } + mel_compress(mels, data, + mel_coefficients, + mel_bins_in_overlap, + WINDOW_SIZE/2+1, MEL_BINS); + for(int i = 0; i < 64; i++) { + printf("%9d\n", mels[i]); + } + mel_expand(data2, mels, + mel_coefficients, + mel_bins_in_overlap, + WINDOW_SIZE/2+1, MEL_BINS); + for(int i = 0; i < 257; i++) { + printf("%9d %9d\n", data[i], data2[i]); + } +} + +#endif diff --git a/examples/audio_network/src/dsp.h b/examples/audio_network/src/dsp.h new file mode 100644 index 000000000..ede737a22 --- /dev/null +++ b/examples/audio_network/src/dsp.h @@ -0,0 +1,27 @@ +#ifndef __dsp_h__ +#define __dsp_h__ + +#include "xmath/xmath.h" + +#include + +#define UPSAMPLE_RATE 3 +#define WINDOW_SIZE 512 +#define WINDOW_ADVANCE (WINDOW_SIZE/4) +#define WINDOW_OVERLAP (WINDOW_SIZE - WINDOW_ADVANCE) +#define UPSAMPLED_WINDOW_ADVANCE (WINDOW_ADVANCE * UPSAMPLE_RATE) + +typedef struct { + int exponent; + headroom_t hr; +} fft_state_t; + +int dsp_time_to_freq(int64_t fft_output[], int data_to_be_processed[], fft_state_t *state); +void dsp_freq_to_time(int data_processed[], int64_t fft_input[], fft_state_t *state); + +void dsp_calculate_mels(float mels_float[], int64_t fft_input[], int gain, int mel_bins, + int *mel_coefficients, int *mel_bins_in_overlap); +void dsp_apply_masks(int64_t fft_output[], int masks_mel[], int enabled, int mel_bins, + int *mel_coefficients, int *mel_bins_in_overlap); + +#endif diff --git a/examples/audio_network/src/dsp_usb.c b/examples/audio_network/src/dsp_usb.c new file mode 100644 index 000000000..dfd7528e0 --- /dev/null +++ b/examples/audio_network/src/dsp_usb.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +static chanend_t g_c_to_dspc; + +void UserBufferManagementInit() +{ +} + +extern void nn_offload_data_to_dsp_engine(chanend_t c_to_dspc, unsigned sampstoNN[], unsigned fromNN[]); + +void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[]) +{ + nn_offload_data_to_dsp_engine(g_c_to_dspc, sampsFromUsbToAudio, sampsFromAudioToUsb); +} + +DECLARE_JOB(nn_dsp_thread, (uint32_t, chanend_t, chanend_t)); +DECLARE_JOB(nn_data_transport_thread, (chanend_t, chanend_t)); + +void dsp_main(chanend_t c_button_state) { + channel_t c_data = chan_alloc(); + channel_t t; + t = chan_alloc(); + g_c_to_dspc = c_data.end_a; + + PAR_JOBS( + PJOB(nn_dsp_thread, (0, t.end_a, c_button_state)), + PJOB(nn_data_transport_thread, (c_data.end_b, t.end_b)) + ); +} diff --git a/examples/audio_network/src/extensions/XUD_HAL.xc b/examples/audio_network/src/extensions/XUD_HAL.xc new file mode 100644 index 000000000..1bafd7b48 --- /dev/null +++ b/examples/audio_network/src/extensions/XUD_HAL.xc @@ -0,0 +1,12 @@ +#include +#include "xua.h" + +on tile[XUD_TILE]: in port p_vbus = XS1_PORT_4C; + +unsigned int XUD_HAL_GetVBusState(void) +{ + unsigned vBus; + p_vbus :> vBus; + return !vBus; +} + diff --git a/examples/audio_network/src/extensions/audiohw.xc b/examples/audio_network/src/extensions/audiohw.xc new file mode 100644 index 000000000..ced501868 --- /dev/null +++ b/examples/audio_network/src/extensions/audiohw.xc @@ -0,0 +1,401 @@ +#include +#include +#include +#include +#include "xassert.h" +#include "i2c.h" +#include "xua.h" +#include "apppll.h" + +on tile[0]: port p_scl = XS1_PORT_1L; +on tile[0]: port p_sda = XS1_PORT_1M; +on tile[0]: out port p_ctrl = XS1_PORT_8D; +on tile[0]: in port p_margin = XS1_PORT_1G; /* CORE_POWER_MARGIN: Driven 0: 0.925v + * Pull down: 0.922v + * High-z: 0.9v + * Pull-up: 0.854v + * Driven 1: 0.85v + */ + +#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN || (XUA_SYNCMODE == XUA_SYNCMODE_SYNC)) +/* If we have an external digital input interface or running in synchronous mode we need to configure the + * external CS2100 device for master clock generation */ +#define USE_FRACTIONAL_N (1) +#else +#define USE_FRACTIONAL_N (0) +#endif + +/* p_ctrl: + * [0:3] - Unused + * [4] - EN_3v3_N + * [5] - EN_3v3A + * [6] - EXT_PLL_SEL (CS2100:0, SI: 1) + * [7] - MCLK_DIR (Out:0, In: 1) + */ +#if (USE_FRACTIONAL_N) +#define EXT_PLL_SEL__MCLK_DIR (0x00) +#else +#define EXT_PLL_SEL__MCLK_DIR (0x80) +#endif +void ctrlPort() +{ + // Drive control port to turn on 3V3 and set MCLK_DIR + // Note, "soft-start" to reduce current spike + // Note, 3v3_EN is inverted + for (int i = 0; i < 30; i++) + { + p_ctrl <: EXT_PLL_SEL__MCLK_DIR | 0x30; /* 3v3: off, 3v3A: on */ + delay_microseconds(5); + p_ctrl <: EXT_PLL_SEL__MCLK_DIR | 0x20; /* 3v3: on, 3v3A: on */ + delay_microseconds(5); + } +} + +/* Working around not being able to extend an unsafe interface (Bugzilla #18670)*/ +i2c_regop_res_t i2c_reg_write(uint8_t device_addr, uint8_t reg, uint8_t data) +{ + uint8_t a_data[2] = {reg, data}; + size_t n; + + unsafe + { + i_i2c_client.write(device_addr, a_data, 2, n, 1); + } + + if (n == 0) + { + return I2C_REGOP_DEVICE_NACK; + } + if (n < 2) + { + return I2C_REGOP_INCOMPLETE; + } + + return I2C_REGOP_SUCCESS; +} + +uint8_t i2c_reg_read(uint8_t device_addr, uint8_t reg, i2c_regop_res_t &result) +{ + uint8_t a_reg[1] = {reg}; + uint8_t data[1] = {0}; + size_t n; + i2c_res_t res; + + unsafe + { + res = i_i2c_client.write(device_addr, a_reg, 1, n, 0); + + if (n != 1) + { + result = I2C_REGOP_DEVICE_NACK; + i_i2c_client.send_stop_bit(); + return 0; + } + + res = i_i2c_client.read(device_addr, data, 1, 1); + } + + if (res == I2C_ACK) + { + result = I2C_REGOP_SUCCESS; + } + else + { + result = I2C_REGOP_DEVICE_NACK; + } + return data[0]; +} + +#define CS2100_REGWRITE(reg, val) {result = i2c_reg_write(CS2100_I2C_DEVICE_ADDR, reg, val);} +#define CS2100_REGREAD_ASSERT(reg, data, expected) {data[0] = i2c_reg_read(CS2100_I2C_DEVICE_ADDR, reg, result); assert(data[0] == expected);} +#define CS2100_I2C_DEVICE_ADDRESS (0x4E) +#define UNSAFE unsafe +#include "cs2100.h" +#undef UNSAFE + +// PCA9540B (2-channel I2C-bus mux) I2C Slave Address +#define PCA9540B_I2C_DEVICE_ADDR (0x70) + +// PCA9540B (2-channel I2C-bus mux) Control Register Values +#define PCA9540B_CTRL_CHAN_0 (0x04) // Set Control Register to select channel 0 +#define PCA9540B_CTRL_CHAN_1 (0x05) // Set Control Register to select channel 1 +#define PCA9540B_CTRL_CHAN_NONE (0x00) // Set Control Register to select neither channel + +// PCM5122 (2-channel audio DAC) I2C Slave Addresses +#define PCM5122_0_I2C_DEVICE_ADDR (0x4C) +#define PCM5122_1_I2C_DEVICE_ADDR (0x4D) +#define PCM5122_2_I2C_DEVICE_ADDR (0x4E) +#define PCM5122_3_I2C_DEVICE_ADDR (0x4F) + +// PCM1865 (4-channel audio ADC) I2C Slave Addresses +#define PCM1865_0_I2C_DEVICE_ADDR (0x4A) +#define PCM1865_1_I2C_DEVICE_ADDR (0x4B) + +// PCM1865 (4-channel audio ADC) Register Addresses +#define PCM1865_RESET (0x00) +#define PCM1865_PGA_VAL_CH1_L (0x01) +#define PCM1865_PGA_VAL_CH1_R (0x02) +#define PCM1865_PGA_VAL_CH2_L (0x03) +#define PCM1865_PGA_VAL_CH2_R (0x04) +#define PCM1865_ADC2_IP_SEL_L (0x08) // Select input to route to ADC2 left input. +#define PCM1865_ADC2_IP_SEL_R (0x09) // Select input to route to ADC2 right input. +#define PCM1865_FMT (0x0B) // RX_WLEN, TDM_LRCLK_MODE, TX_WLEN, FMT +#define PCM1865_TDM_OSEL (0x0C) +#define PCM1865_TX_TDM_OFFSET (0x0D) +#define PCM1865_GPIO01_FUN (0x10) // Functionality control for GPIO0 and GPIO1. +#define PCM1865_GPIO01_DIR (0x12) // Direction control for GPIO0 and GPIO1. +#define PCM1865_CLK_CFG0 (0x20) // Basic clock config. + +unsafe client interface i2c_master_if i_i2c_client; + +void WriteRegs(int deviceAddr, int numDevices, int regAddr, int regData) +{ + i2c_regop_res_t result; + + for(int i = deviceAddr; i < (deviceAddr + numDevices); i++) + { + unsafe + { + result = i2c_reg_write(i, regAddr, regData); + } + assert(result == I2C_REGOP_SUCCESS && msg("I2C write reg failed")); + } +} + +/* Note, this function assumes contiguous devices addresses */ +void WriteAllDacRegs(int regAddr, int regData) +{ + WriteRegs(PCM5122_0_I2C_DEVICE_ADDR, 4, regAddr, regData); +} + +/* Note, this function assumes contiguous devices addresses */ +void WriteAllAdcRegs(int regAddr, int regData) +{ + WriteRegs(PCM1865_0_I2C_DEVICE_ADDR, 2, regAddr, regData); +} + +void SetI2CMux(int ch) +{ + i2c_regop_res_t result; + + // I2C mux takes the last byte written as the data for the control register. + // We can't send only one byte so we send two with the data in the last byte. + // We set "address" to 0 below as it's discarded by device. + unsafe + { + result = i2c_reg_write(PCA9540B_I2C_DEVICE_ADDR, 0, ch); + } + + assert(result == I2C_REGOP_SUCCESS && msg("I2C Mux I2C write reg failed")); +} + +/* Configures the external audio hardware at startup */ +void AudioHwInit() +{ + i2c_regop_res_t result; + + // Wait for power supply to come up. + delay_milliseconds(100); + + /* Wait until global is set */ + unsafe + { + while(!(unsigned) i_i2c_client); + } + + if(USE_FRACTIONAL_N) + { + /* Set external I2C mux to CS2100 */ + SetI2CMux(PCA9540B_CTRL_CHAN_1); + + unsafe + { + /* Use external CS2100 to generate master clock */ + PllInit(i_i2c_client); + } + } + else + { + /* Use xCORE Secondary PLL to generate *fixed* master clock */ + AppPllEnable_SampleRate(DEFAULT_FREQ); + } + + /* Set external I2C mux to DACs/ADCs */ + SetI2CMux(PCA9540B_CTRL_CHAN_0); + + /* Reset DAC & ADC registers. Just in case we've run another build config */ + WriteAllDacRegs(0x1, 0x11); + WriteAllAdcRegs(PCM1865_RESET, 0xFE); + + /* + * Setup ADCs + */ + /* Setup is ADC is I2S slave, MCLK slave, I2S_DOUT2 on GPIO0. ADC sets up clocking automatically based on applied input clocks */ + WriteAllAdcRegs(PCM1865_ADC2_IP_SEL_L, 0x42); // Set ADC2 Left input to come from VINL2[SE] input. + WriteAllAdcRegs(PCM1865_ADC2_IP_SEL_R, 0x42); // Set ADC2 Right input to come from VINR2[SE] input. + WriteAllAdcRegs(PCM1865_PGA_VAL_CH1_L, 0xFC); + WriteAllAdcRegs(PCM1865_PGA_VAL_CH1_R, 0xFC); + WriteAllAdcRegs(PCM1865_PGA_VAL_CH2_L, 0xFC); + WriteAllAdcRegs(PCM1865_PGA_VAL_CH2_R, 0xFC); + + if (XUA_PCM_FORMAT == XUA_PCM_FORMAT_I2S) + { /* Only enable DOUT2 in I2S mode. In TDM mode it doesn't really make sense, wastes power (and data sheet states "not available") */ + WriteAllAdcRegs(PCM1865_GPIO01_FUN, 0x05); // Set GPIO1 as normal polarity, GPIO1 functionality. Set GPIO0 as normal polarity, DOUT2 functionality. + WriteAllAdcRegs(PCM1865_GPIO01_DIR, 0x04); // Set GPIO1 as an input. Set GPIO0 as an output (used for I2S DOUT2). + } + else + { + /* Write offset such that ADC's do not drive against eachother */ + result = i2c_reg_write(PCM1865_0_I2C_DEVICE_ADDR, PCM1865_TX_TDM_OFFSET, 1); + assert(result == I2C_REGOP_SUCCESS && msg("ADC I2C write reg failed")); + result = i2c_reg_write(PCM1865_1_I2C_DEVICE_ADDR, PCM1865_TX_TDM_OFFSET, 129); + assert(result == I2C_REGOP_SUCCESS && msg("ADC I2C write reg failed")); + + if(CODEC_MASTER) + { + /* PCM5122 drives a 1/2 duty cycle LRCLK for TDM */ + /* RX_WLEN: 24-bit (default) + * TDM_LRCLK_MODE: duty cycle of LRCLK is 1/2 + * TX_WLEN: 32-bit + * FMT: TDM/DSP + */ + WriteAllAdcRegs(PCM1865_FMT, 0b01000011); + } + else + { + /* xCORE drives 1/256 duty cycle LRCLK for TDM */ + /* RX_WLEN: 24-bit (default) + * TDM_LRCLK_MODE: duty cycle of LRCLK is 1/256 + * TX_WLEN: 32-bit + * FMT: TDM/DSP + */ + WriteAllAdcRegs(PCM1865_FMT, 0b01010011); + } + + /* TDM_OSEL: 4ch TDM + */ + WriteAllAdcRegs(PCM1865_TDM_OSEL, 0b00000001); + } + + /* + * Setup DACs + */ + if(CODEC_MASTER) + { + /* When xCORE is I2S slave we set one DAC to master and the rest remain slaves. + * We write some values to all DACs just to avoid any difference in performance */ + + // Disable Auto Clock Configuration + WriteAllDacRegs(0x25, 0x72); + + // PLL P divider to 2 + WriteAllDacRegs(0x14, 0x01); + + // PLL J divider to 8 + WriteAllDacRegs(0x15, 0x08); + + // PLL D1 divider to 00 + WriteAllDacRegs(0x16, 0x00); + + // PLL D2 divider to 00 + WriteAllDacRegs(0x17, 0x00); + + // PLL R divider to 1 + WriteAllDacRegs(0x18, 0x00); + + // NB: Overall PLL Multiplier is x4. + // miniDSP CLK divider (NMAC) to 2 + WriteAllDacRegs(0x1B, 0x01); + + //DAC CLK divider to 16 + WriteAllDacRegs(0x1C, 0x0F); + + // NCP CLK divider to 4 + WriteAllDacRegs(0x1D, 0x03); + + // IDAC2 + WriteAllDacRegs(0x24, 0x00); + } + + if(XUA_PCM_FORMAT == XUA_PCM_FORMAT_I2S) + { + // For basic I2S input we don't need any register setup. DACs will clock auto detect etc. + // It holds DAC in reset until it gets clocks anyway. + } + else /* TDM */ + { + /* Note for TDM to work as expected for all DACs the jumpers marked "DAC I2S/TDM Config" need setting appropriately + * I2S MODE: SET ALL 2-3 + * TDM MODE: SET ALL 1-2, TDM SOURCE 3-4 + */ + /* Set Format to TDM/DSP & 24bit */ + WriteAllDacRegs(0x28, 0b00010011); + + /* Set offset to appropriately for each DAC */ + for(int dacAddr = PCM5122_0_I2C_DEVICE_ADDR; dacAddr < (PCM5122_0_I2C_DEVICE_ADDR+4); dacAddr++) + { + const int dacOffset = dacAddr - PCM5122_0_I2C_DEVICE_ADDR; + result = i2c_reg_write(dacAddr, 0x29, 1 + (dacOffset * 64)); + assert(result == I2C_REGOP_SUCCESS && msg("DAC I2C write reg failed")); + } + } +} + +/* Configures the external audio hardware for the required sample frequency */ +void AudioHwConfig(unsigned samFreq, unsigned mClk, unsigned dsdMode, unsigned sampRes_DAC, unsigned sampRes_ADC) +{ + if (USE_FRACTIONAL_N) + { + SetI2CMux(PCA9540B_CTRL_CHAN_1); + PllMult(mClk, PLL_SYNC_FREQ, i_i2c_client); + SetI2CMux(PCA9540B_CTRL_CHAN_0); + } + else + { + AppPllEnable_SampleRate(samFreq); + } + + /* Set one DAC to I2S master */ + if(CODEC_MASTER) + { + i2c_regop_res_t result = I2C_REGOP_SUCCESS; + unsigned regVal; + const int dacAddr = PCM5122_3_I2C_DEVICE_ADDR; + + //OSR CLK divider is set to one (as its based on the output from the DAC CLK, which is already PLL/16) + regVal = (mClk/(samFreq*I2S_CHANS_PER_FRAME*32))-1; + result |= i2c_reg_write(dacAddr, 0x1E, regVal); + + //# FS setting should be set based on sample rate + regVal = samFreq/96000; + result |= i2c_reg_write(dacAddr, 0x22, regVal); + + //IDAC1 sets the number of miniDSP instructions per clock. + regVal = 192000/samFreq; + result |= i2c_reg_write(dacAddr, 0x23, regVal); + + /* Master mode setting */ + // BCK, LRCK output + result |= i2c_reg_write(dacAddr, 0x09, 0x11); + + // Master mode BCK divider setting (making 64fs) + regVal = (mClk/(samFreq*I2S_CHANS_PER_FRAME*32))-1; + result |= i2c_reg_write(dacAddr, 0x20, regVal); + + // Master mode LRCK divider setting (divide BCK by a further 64 (256 for TDM) to make 1fs) + regVal = (I2S_CHANS_PER_FRAME*32)-1; + result |= i2c_reg_write(dacAddr, 0x21, regVal); + + // Master mode BCK, LRCK divider reset release + result |= i2c_reg_write(dacAddr, 0x0C, 0x3f); + + assert(result == I2C_REGOP_SUCCESS && msg("DAC I2C write reg failed")); + + /* Write to all DACs */ + // Stand-by request + WriteAllDacRegs(0x02, 0x10); + + // Stand-by release + WriteAllDacRegs(0x02, 0x00); + } +} diff --git a/examples/audio_network/src/extensions/audiostream.xc b/examples/audio_network/src/extensions/audiostream.xc new file mode 100644 index 000000000..d894abcf3 --- /dev/null +++ b/examples/audio_network/src/extensions/audiostream.xc @@ -0,0 +1,16 @@ +#include + +on tile[0]: out port p_leds = XS1_PORT_4F; + +void UserAudioStreamStart(void) +{ + /* Turn all LEDs on */ + p_leds <: 0xF; +} + +void UserAudioStreamStop(void) +{ + /* Turn all LEDs off */ + p_leds <: 0x0; +} + diff --git a/examples/audio_network/src/extensions/button.c b/examples/audio_network/src/extensions/button.c new file mode 100644 index 000000000..9e55d60a6 --- /dev/null +++ b/examples/audio_network/src/extensions/button.c @@ -0,0 +1,16 @@ +#include +#include +#include + +void button_server(chanend_t c_buttons) { + port_t buttons = XS1_PORT_4E; + int value = 0; + port_enable(buttons); + while(1) { + port_set_trigger_in_not_equal(buttons, value); + value = port_in(buttons); + chanend_out_word(c_buttons, value); + chanend_out_end_token(c_buttons); + chanend_check_end_token(c_buttons); + } +} diff --git a/examples/audio_network/src/extensions/user_main.h b/examples/audio_network/src/extensions/user_main.h new file mode 100644 index 000000000..6bb8a7643 --- /dev/null +++ b/examples/audio_network/src/extensions/user_main.h @@ -0,0 +1,43 @@ +#ifndef USER_MAIN_H +#define USER_MAIN_H + +#ifdef __XC__ + +#include "i2c.h" +#include +#include +#include + +extern unsafe client interface i2c_master_if i_i2c_client; +extern void interface_saver(client interface i2c_master_if i); +extern void ctrlPort(); +extern void button_server(chanend c); + +/* I2C interface ports */ +extern port p_scl; +extern port p_sda; + +extern void dsp_main(chanend c); + +#define USER_MAIN_DECLARATIONS \ + interface i2c_master_if i2c[1]; \ + chan c_button_state; + +#define USER_MAIN_CORES \ + on tile[0]: { \ + ctrlPort(); \ + i2c_master(i2c, 1, p_scl, p_sda, 100); \ + } \ + on tile[0]: { \ + button_server(c_button_state); \ + } \ + on tile[1]: { /* create DSP process for AWE processing */ \ + unsafe \ + { \ + i_i2c_client = i2c[0]; /* TODO: delete, audiohw on tile 1 */ \ + } \ + dsp_main(c_button_state); \ + } +#endif /* End of DSP process */ + +#endif diff --git a/examples/audio_network/src/hypot.S b/examples/audio_network/src/hypot.S new file mode 100644 index 000000000..582c2067e --- /dev/null +++ b/examples/audio_network/src/hypot.S @@ -0,0 +1,115 @@ +// Copyright (c) 2016, XMOS Ltd, All rights reserved + + .section .cp.rodata, "ac", @progbits + g_hyp_scalar: + .word 0x9b74eda7 // (unsigned)((double)UINT_MAX*0.607252935008881); + + .section .dp.data,"awd",@progbits + .text + .cc_top hypot_i.function + .globl hypot_i + .align 4 + .type hypot_i,@function + +#define ITT(N) \ + {lss r3, r0, r11; ldc r2, N};\ + {bt r3, neg_ ## N; shr r3, r1, r2};\ + {shr r2, r0, r2;sub r0, r0, r3};\ + {bu next_ ## N; add r1, r1, r2};\ + neg_ ## N:;\ + ashr r2, r0, r2;\ + {add r0, r0, r3; sub r1, r1, r2};\ + next_ ## N: + +#define ITT_FINAL(N) \ + {lss r3, r0, r11; ldc r2, N};\ + {bt r3, neg_ ## N;};\ + {shr r2, r0, r2; ldc r3, 0};\ + {bu next_ ## N; add r1, r1, r2};\ + neg_ ## N:;\ + ashr r2, r0, r2;\ + {sub r1, r1, r2; ldc r3, 0};\ + next_ ## N: + +hypot_i: +.align 8 +.issue_mode dual + ashr r0, r0, 2 + ldc r11, 0 + lss r2, r1, r11 + {bf r2, start; lss r2, r0, r11} + {neg r1, r1} + start: + {bf r2, neg_0;shr r1, r1, 2} + {add r0, r0, r1; sub r1, r1, r0} + bu next_0 + neg_0: + {sub r0, r0, r1; add r1, r1, r0} + next_0: + + ITT(1) + ITT(2) + ITT(3) + ITT(4) + ITT(5) + ITT(6) + ITT(7) + ITT(8) + ITT(9) + ITT(10) + ITT(11) + ITT(12) + ITT(13) + ITT(14) + ITT(15) + ITT(16) + ITT(17) + ITT_FINAL(18) + + ldw r0, cp[g_hyp_scalar] + maccu r11, r3, r1, r0 + {retsp 0;shl r0, r11, 2} + + +.tmp_hypot_i: + .size hypot_i, .tmp_hypot_i-hypot_i + .align 4 + .cc_bottom hypot_i.function + + .set hypot_i.nstackwords,0 + .globl hypot_i.nstackwords + .set hypot_i.maxcores,1 + .globl hypot_i.maxcores + .set hypot_i.maxtimers,0 + .globl hypot_i.maxtimers + .set hypot_i.maxchanends,0 + .globl hypot_i.maxchanends + + .cc_top scale.function + .globl scale + .align 4 + .type scale,@function +scale: +.align 8 +.issue_mode dual + ldc r3, 0 + ldivu r1,r11,r3,r1,r2 + ldivu r0,r2,r11,r0,r2 + retsp 0 + +.tmp_scale: + .size scale, .tmp_scale-scale + .align 4 + .cc_bottom scale.function + + .set scale.nstackwords,0 + .globl scale.nstackwords + .set scale.maxcores,1 + .globl scale.maxcores + .set scale.maxtimers,0 + .globl scale.maxtimers + .set scale.maxchanends,0 + .globl scale.maxchanends + + + diff --git a/examples/audio_network/src/hypot.h b/examples/audio_network/src/hypot.h new file mode 100644 index 000000000..9238c7b74 --- /dev/null +++ b/examples/audio_network/src/hypot.h @@ -0,0 +1 @@ +extern int hypot_i(int x, int y); diff --git a/examples/audio_network/src/log.c b/examples/audio_network/src/log.c new file mode 100644 index 000000000..6a8fcc9dd --- /dev/null +++ b/examples/audio_network/src/log.c @@ -0,0 +1,196 @@ +#include +#include +#include + +int log2_8(uint32_t x) { + int base; + asm("clz %0, %1" : "=r" (base) : "r" (x)); + asm("shl %0, %1, %2" : "=r" (x) : "r" (x), "r" (base-28)); // do not use >> relies on negative shifts. + asm("zext %0, 3" : "+r" (x)); + return x + ((31-base)<<3); +} + +struct {int adder, multiplier; } xxx[] = { + {-1466,2932}, + {-1443,2887}, + {-1421,2844}, + {-1399,2802}, + {-1377,2761}, + {-1356,2721}, + {-1335,2683}, + {-1314,2645}, + {-1293,2609}, + {-1273,2573}, + {-1253,2539}, + {-1233,2505}, + {-1214,2472}, + {-1195,2440}, + {-1176,2409}, + {-1157,2379}, + {-1139,2349}, + {-1120,2320}, + {-1102,2292}, + {-1085,2265}, + {-1067,2238}, + {-1050,2212}, + {-1032,2186}, + {-1015,2161}, + {-999,2137}, + {-982,2113}, + {-966,2090}, + {-949,2067}, + {-933,2044}, + {-917,2023}, + {-902,2001}, + {-886,1980}, + {-871,1960}, + {-856,1940}, + {-840,1920}, + {-826,1901}, + {-811,1882}, + {-796,1863}, + {-782,1845}, + {-767,1827}, + {-753,1810}, + {-739,1793}, + {-725,1776}, + {-711,1759}, + {-698,1743}, + {-684,1727}, + {-671,1711}, + {-657,1696}, + {-644,1681}, + {-631,1666}, + {-618,1652}, + {-605,1637}, + {-592,1623}, + {-580,1609}, + {-567,1596}, + {-555,1583}, + {-543,1569}, + {-530,1556}, + {-518,1544}, + {-506,1531}, + {-494,1519}, + {-483,1507}, + {-471,1495}, + {-459,1483}, + {-46913,750624}, + {-46186,739163}, + {-45469,728046}, + {-44764,717258}, + {-44068,706786}, + {-43383,696615}, + {-42708,686733}, + {-42042,677127}, + {-41385,667786}, + {-40737,658699}, + {-40098,649857}, + {-39468,641248}, + {-38846,632865}, + {-38232,624698}, + {-37626,616739}, + {-37027,608981}, + {-36436,601415}, + {-35852,594035}, + {-35276,586833}, + {-34706,579805}, + {-34143,572942}, + {-33587,566241}, + {-33037,559694}, + {-32494,553297}, + {-31956,547044}, + {-31425,540931}, + {-30900,534953}, + {-30380,529106}, + {-29866,523386}, + {-29358,517788}, + {-28855,512308}, + {-28357,506943}, + {-27865,501689}, + {-27377,496543}, + {-26895,491502}, + {-26417,486561}, + {-25945,481720}, + {-25477,476973}, + {-25013,472319}, + {-24554,467755}, + {-24099,463279}, + {-23649,458887}, + {-23203,454578}, + {-22761,450349}, + {-22323,446198}, + {-21890,442123}, + {-21460,438122}, + {-21034,434192}, + {-20612,430332}, + {-20193,426540}, + {-19779,422815}, + {-19368,419154}, + {-18960,415556}, + {-18556,412019}, + {-18155,408542}, + {-17758,405123}, + {-17364,401760}, + {-16973,398453}, + {-16586,395201}, + {-16201,392000}, + {-15820,388851}, + {-15442,385753}, + {-15067,382703}, + {-14694,379701}, +}; + + +int log2_16(uint32_t x) { + int base; + uint32_t lookup; + asm("clz %0, %1" : "=r" (base) : "r" (x)); + asm("shl %0, %1, %2" : "=r" (lookup) : "r" (x), "r" (base-25)); + asm("shl %0, %1, %2" : "=r" (x) : "r" (x), "r" (base-16)); + asm("{zext %0, 6;zext %1, 16}" : "+r" (lookup), "+r" (x)); + int log_multiplier = xxx[lookup].multiplier; + int log_adder = xxx[lookup].adder; + return log_adder + ((log_multiplier * x) >> 16) + ((31-base)<<10); +} + +int log2_8_64(uint64_t x) { + int base; + uint32_t y; + asm("clz %0, %1" : "=r" (base) : "r" ((int32_t)(x >> 32))); + base = 32-base; + if (base <= 0) { + return log2_8((uint32_t)x); + } + asm("lextract %0, %1, %2, %3, 32" : "=r" (y) : "r" ((int32_t)(x >> 32)), "r" ((uint32_t)x), "r" (base)); + return log2_8(y) + base; +} + +int log2_16_64(uint64_t x) { + int base; + uint32_t y; + asm("clz %0, %1" : "=r" (base) : "r" ((int32_t)(x >> 32))); + base = 32-base; + if (base <= 0) { + return log2_16((uint32_t)x); + } + asm("lextract %0, %1, %2, %3, 32" : "=r" (y) : "r" ((int32_t)(x >> 32)), "r" ((uint32_t)x), "r" (base)); + return log2_16(y) + (base<<10); +} + +#ifdef LOCAL_LOG_MAIN + +int main(void) { + for(int i = 0; i < 64; i = i +1) { + printf("%d: %d %f\n", i, log2_16(i), log((float)i)/log(2.0)*8*128); + } + for(int i = 1000; i < 0*(1<<30); i = i * 2 + 834) { + printf("%d: %d %f\n", i, log2_8(i), log((float)i)/log(2.0)*8); + } + for(int64_t i = 100000000; i < (1LL<<60); i = i * 2 + 834) { + printf("%lld: %d %f\n", i, log2_16_64(i), log((float)i)/log(2.0)*8*128); + } +} + +#endif + diff --git a/examples/audio_network/src/log.h b/examples/audio_network/src/log.h new file mode 100644 index 000000000..2d80831d8 --- /dev/null +++ b/examples/audio_network/src/log.h @@ -0,0 +1,15 @@ +#ifndef __log_h__ +#define __log_h__ + +#include + +#define LOG2_8_Q_VALUE 3 +#define LOG2_16_Q_VALUE 10 + +int log2_8(uint32_t x); +int log2_16(uint32_t x); + +int log2_8_64(uint64_t x); +int log2_16_64(uint64_t x); + +#endif diff --git a/examples/audio_network/src/mel.c b/examples/audio_network/src/mel.c new file mode 100644 index 000000000..8adb5a4e9 --- /dev/null +++ b/examples/audio_network/src/mel.c @@ -0,0 +1,38 @@ +#include "mel.h" + +void mel_compress(int *mel, int *input_bin, + int *fractions, + int *number_of_bins_in_overlap, + int mel_spectral_bins, int mel_mel_bins) { + int current_mel = -1; + int run = 0; + mel[0] = 0; // Set first accumulator to zero + for(int i = 0; i < mel_spectral_bins; i++) { + if (run <= 0) { // See if we are at the end of the run + current_mel++; // If so, go to next MEL + run = number_of_bins_in_overlap[current_mel]; + mel[current_mel+1] = 0; // Initialise next accumulator + } + int contribution = (input_bin[i] * (int64_t) fractions[i]) >> MEL_Q_VALUE; + mel[current_mel ] += contribution; + mel[current_mel+1] += input_bin[i] - contribution; + run--; // Completed one element of the run + } +} + +void mel_expand(int *output_bin, int *mel, + int *fractions, + int *number_of_bins_in_overlap, + int mel_spectral_bins, int mel_mel_bins) { + int current_mel = -1; + int run = 0; + for(int i = 0; i < mel_spectral_bins; i++) { + if (run <= 0) { // See if we are at the end of the run + current_mel++; // If so, go to next MEL + run = number_of_bins_in_overlap[current_mel]; + } + output_bin[i] = ((mel[current_mel ] * (int64_t) fractions[i] ) + + (mel[current_mel+1] * (MEL_ONE_VALUE - (int64_t) fractions[i]))) >> MEL_Q_VALUE; + run--; // Completed one element of the run + } +} diff --git a/examples/audio_network/src/mel.h b/examples/audio_network/src/mel.h new file mode 100644 index 000000000..33c1798b0 --- /dev/null +++ b/examples/audio_network/src/mel.h @@ -0,0 +1,74 @@ +#ifndef __mel_h__ +#define __mel_h__ + +#include + +#define MEL_Q_VALUE 30 +#define MEL_ONE_VALUE (1 << MEL_Q_VALUE) +/** Library that enables a sparse matrix multiplication where the input matrix + * fullfills the following criteria: + * - All columns add up to 1 + * - There is at most two non zero values in each column, if there are two then they + * in consecutive rows + * - For two consecutive columns, the number of zero rows above the non-zero + * is either the same or has increased by one. Ie, it is loosely a diagonal matrix + * + * The matrix is stored in a compressed format where we only store the first + * non-zero value of each column; this forms a single vector of elements. As + * the column adds up to one and there is at most two non-zero values, the + * other value can be recalculated. The length of this vector is identical to the + * number of columns in the matrix. + * + * In addition to the vector of non-zero values we need one more vector which counts + * the number of columns for which this row was the first non-zero value. This is a + * vector with a length identical to the number of rows in the matrix. + */ + +/** + * Function that compresses a spectogram into a smaller array of MEL values + * + * @param mel Array of me_mel_bins + * The MEL values are written into this array + * + * @param input_bin Array of me_spectral_bins + * The input values are read from this array + * + * @param fractions Array of me_spectral_bins. + * This stores the first non-zero + * value in each column of the eml filter bank. + * + * @param bins_in_overlap Array of me_mel_bins + * Defines the number of bins until the current MEL + * is completed. For each of the input bins, a + * fraction is added to the current MEL and + * (1-fraction) is added to the next MEL. When the + * current MEL is completed we move on to the next + * MEL. + * + * @param mel_spectral_bins Number of bins in the spectrogram + * + * @param mel_mel_bins Number of MEL values; must be smaller than + * mel_spectral_bins. + */ +void mel_compress(int *mel, int *input_bin, + int *fractions, + int *bins_in_overlap, + int mel_spectral_bins, int mel_mel_bins); + +/** + * Function that expands an array of MEL values into a spectogram + * + * @param output_bin Array of me_spectral_bins + * @param mel Array of me_mel_bins + * @param fractions Array of me_spectral_bins + * @param bins_in_overlap Array of me_mel_bins. See mel_compress(). + * @param mel_spectral_bins Number of bins in the spectrogram + * @param mel_mel_bins Number of MEL values; must be smaller than + * mel_spectral_bins. + */ +void mel_expand(int *output_bin, int *mel, + int *fractions, + int *bins_in_overlap, + int mel_spectral_bins, int mel_mel_bins); + +#endif diff --git a/examples/audio_network/src/mel_parameters.h b/examples/audio_network/src/mel_parameters.h new file mode 100644 index 000000000..9951854b2 --- /dev/null +++ b/examples/audio_network/src/mel_parameters.h @@ -0,0 +1,264 @@ +#define MEL_BINS 64 +#define MEL_SPECTRAL_BINS 257 + +int mel_bins_in_overlap[MEL_BINS] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5 }; + +int mel_coefficients[MEL_SPECTRAL_BINS] = { + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.750000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.250000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.400000 * MEL_ONE_VALUE + 0.5), + (int)(0.300000 * MEL_ONE_VALUE + 0.5), + (int)(0.200000 * MEL_ONE_VALUE + 0.5), + (int)(0.100000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.400000 * MEL_ONE_VALUE + 0.5), + (int)(0.300000 * MEL_ONE_VALUE + 0.5), + (int)(0.200000 * MEL_ONE_VALUE + 0.5), + (int)(0.100000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.400000 * MEL_ONE_VALUE + 0.5), + (int)(0.300000 * MEL_ONE_VALUE + 0.5), + (int)(0.200000 * MEL_ONE_VALUE + 0.5), + (int)(0.100000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.400000 * MEL_ONE_VALUE + 0.5), + (int)(0.300000 * MEL_ONE_VALUE + 0.5), + (int)(0.200000 * MEL_ONE_VALUE + 0.5), + (int)(0.100000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.400000 * MEL_ONE_VALUE + 0.5), + (int)(0.300000 * MEL_ONE_VALUE + 0.5), + (int)(0.200000 * MEL_ONE_VALUE + 0.5), + (int)(0.100000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.400000 * MEL_ONE_VALUE + 0.5), + (int)(0.300000 * MEL_ONE_VALUE + 0.5), + (int)(0.200000 * MEL_ONE_VALUE + 0.5), + (int)(0.100000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.400000 * MEL_ONE_VALUE + 0.5), + (int)(0.300000 * MEL_ONE_VALUE + 0.5), + (int)(0.200000 * MEL_ONE_VALUE + 0.5), + (int)(0.100000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.400000 * MEL_ONE_VALUE + 0.5), + (int)(0.300000 * MEL_ONE_VALUE + 0.5), + (int)(0.200000 * MEL_ONE_VALUE + 0.5), + (int)(0.100000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.400000 * MEL_ONE_VALUE + 0.5), + (int)(0.300000 * MEL_ONE_VALUE + 0.5), + (int)(0.200000 * MEL_ONE_VALUE + 0.5), + (int)(0.100000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.400000 * MEL_ONE_VALUE + 0.5), + (int)(0.300000 * MEL_ONE_VALUE + 0.5), + (int)(0.200000 * MEL_ONE_VALUE + 0.5), + (int)(0.100000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.400000 * MEL_ONE_VALUE + 0.5), + (int)(0.300000 * MEL_ONE_VALUE + 0.5), + (int)(0.200000 * MEL_ONE_VALUE + 0.5), + (int)(0.100000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.400000 * MEL_ONE_VALUE + 0.5), + (int)(0.300000 * MEL_ONE_VALUE + 0.5), + (int)(0.200000 * MEL_ONE_VALUE + 0.5), + (int)(0.100000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.400000 * MEL_ONE_VALUE + 0.5), + (int)(0.300000 * MEL_ONE_VALUE + 0.5), + (int)(0.200000 * MEL_ONE_VALUE + 0.5), + (int)(0.100000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), + (int)(0.500000 * MEL_ONE_VALUE + 0.5), + (int)(0.400000 * MEL_ONE_VALUE + 0.5), + (int)(0.300000 * MEL_ONE_VALUE + 0.5), + (int)(0.200000 * MEL_ONE_VALUE + 0.5), + (int)(0.100000 * MEL_ONE_VALUE + 0.5), + (int)(1.000000 * MEL_ONE_VALUE + 0.5), + (int)(0.900000 * MEL_ONE_VALUE + 0.5), + (int)(0.800000 * MEL_ONE_VALUE + 0.5), + (int)(0.700000 * MEL_ONE_VALUE + 0.5), + (int)(0.600000 * MEL_ONE_VALUE + 0.5), +}; diff --git a/examples/audio_network/src/model_audioi16.tflite.cpp b/examples/audio_network/src/model_audioi16.tflite.cpp new file mode 100644 index 000000000..2d13b6ffc --- /dev/null +++ b/examples/audio_network/src/model_audioi16.tflite.cpp @@ -0,0 +1,13900 @@ +// This file is generated. Do not edit. +// Generated on: 05.03.2024 09:04:34 + + +#include "lib_tflite_micro/api/xcore_config.h" +#include "lib_nn/api/version.h" +#include "lib_tflite_micro/api/version.h" +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/conv.h" +#include "tensorflow/lite/micro/kernels/fully_connected.h" +#include "tensorflow/lite/micro/kernels/micro_ops.h" +#include "tensorflow/lite/micro/kernels/reduce.h" +#include "tensorflow/lite/micro/kernels/softmax.h" +#include "tensorflow/lite/micro/micro_context.h" + +// #define TFLMC_XCORE_PROFILE +// #define TFLMC_CONV2D_PROFILE +// #define TFLMC_PRINT_TENSORS +//#define TFLMC_PRINT_INPUT_TENSORS + +#if defined __GNUC__ +#define ALIGN(X) __attribute__((aligned(X))) +#elif defined _MSC_VER +#define ALIGN(X) __declspec(align(X)) +#elif defined __TASKING__ +#define ALIGN(X) __align(X) +#endif + +// Check lib_nn and lib_tflite_micro versions +// NOTE: xformer version is saved for debugging purposes +// If lib_nn and lib_tflite_micro versions are as expected, +// then the xformer version doesn't matter as the model should execute +// If major version is zero, then minor versions must match +// Otherwise, major versions must match and binary minor version +// must be less or equal to runtime minor version +// Check if runtime lib_tflite_micro version matches with compiled version +static_assert((0 == 0 && lib_tflite_micro::major_version == 0 && 6 == lib_tflite_micro::minor_version) || + (0 == lib_tflite_micro::major_version) || + (6 < lib_tflite_micro::minor_version), + "Model has been compiled with lib_tflite_micro version incompatible with runtime lib_tflite_micro version!"); + +// Check if runtime lib_nn version matches with compiled version +static_assert((0 == 0 && lib_nn::major_version == 0 && 3 == lib_nn::minor_version) || + (0 == lib_nn::major_version) || + (3 < lib_nn::minor_version), + "Model has been compiled with lib_nn version incompatible with runtime lib_nn version!"); + +namespace tflite { +namespace ops { +namespace micro { +namespace xcore { +extern TFLMRegistration *Register_XC_unaryi16(void); +extern TFLMRegistration *Register_XC_binaryi16(void); +extern TFLMRegistration *Register_XC_pad_v2(void); +extern TFLMRegistration *Register_XC_conv2d_v2(void); +extern TFLMRegistration *Register_XC_lookup(void); +extern TFLMRegistration *Register_XC_slice(void); +} // namespace xcore +} // namespace micro +} // namespace ops +} // namespace tflite + + + +constexpr int kTensorArenaSize = 50608; +#ifndef SHARED_TENSOR_ARENA +namespace { +uint8_t tensor_arena[kTensorArenaSize] ALIGN(8); +} +#else +extern uint8_t tensor_arena[]; +#endif + +namespace { +template struct TfArray { + int sz; T elem[SZ]; +}; +enum used_operators_e { + OP_XC_unaryi16, OP_XC_binaryi16, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_UNPACK, OP_SPLIT, OP_SPLIT_V, OP_XC_lookup, OP_PACK, OP_TRANSPOSE, OP_CONCATENATION, OP_XC_slice, OP_LOGISTIC, OP_LAST +}; + +#if defined(TFLMC_XCORE_PROFILE) || defined(TFLMC_PRINT_TENSORS) || defined(TFLMC_PRINT_INPUT_TENSORS) || defined(TFLMC_CONV2D_PROFILE) +const char *op_strs[] = { +"OP_XC_unaryi16", "OP_XC_binaryi16", "OP_XC_pad_v2", "OP_XC_conv2d_v2", "OP_UNPACK", "OP_SPLIT", "OP_SPLIT_V", "OP_XC_lookup", "OP_PACK", "OP_TRANSPOSE", "OP_CONCATENATION", "OP_XC_slice", "OP_LOGISTIC", }; + +#endif +#if defined(TFLMC_XCORE_PROFILE) || defined(TFLMC_PRINT_TENSORS) || defined(TFLMC_PRINT_INPUT_TENSORS) +unsigned char checksum(char *data, unsigned int length) +{ + static char sum; + static char * end; + sum = 0; + end = data + length; + + do + { + sum -= *data++; + } while (data != end); + return sum; +} + +#endif + +#ifdef TFLMC_XCORE_PROFILE +int op_times[OP_LAST]; +int op_counts[OP_LAST]; +int64_t op_times_summed; +int time_t0, time_t1; +#endif + +TfLiteContext ctx{}; + +TFLMRegistration registrations[OP_LAST]; + +struct { +const TfArray<4, int> tensor_dimension0 = { 4, { 1,1,64,1 } }; +const TfArray<2, int> tensor_dimension1 = { 2, { 1,64 } }; +const int32_t tensor_data2[1] = { -1 }; +const int tensor_dimension2 = 0; /* empty TfLiteIntArray */ +const ALIGN(8) int32_t tensor_data3[3] = { + 64, 64, -1, +}; +const TfArray<1, int> tensor_dimension3 = { 1, { 3 } }; +const ALIGN(8) int32_t tensor_data4[3] = { + 1, 0, 2, +}; +const ALIGN(4) uint8_t tensor_data5[4] = { + 8, 254, 127, 59, +}; +const TfArray<1, int> tensor_dimension5 = { 1, { 4 } }; +const ALIGN(4) uint8_t tensor_data6[4] = { + 94, 100, 239, 57, +}; +const ALIGN(4) uint8_t tensor_data7[4] = { + 0, 64, 29, 0, +}; +const ALIGN(8) uint8_t tensor_data8[64] = { + 92, 99, 92, 99, 92, 99, 92, 99, 92, 99, + 92, 99, 92, 99, 92, 99, 92, 99, 92, 99, + 92, 99, 92, 99, 92, 99, 92, 99, 92, 99, + 92, 99, 92, 35, 92, 35, 92, 35, 92, 35, + 92, 35, 92, 35, 92, 35, 92, 35, 92, 35, + 92, 35, 92, 35, 92, 35, 92, 35, 92, 35, + 92, 35, 92, 35, +}; +const TfArray<1, int> tensor_dimension8 = { 1, { 64 } }; +const ALIGN(8) uint8_t tensor_data9[64] = { + 250, 57, 250, 57, 250, 57, 250, 57, 250, 57, + 250, 57, 250, 57, 250, 57, 250, 57, 250, 57, + 250, 57, 250, 57, 250, 57, 250, 57, 250, 57, + 250, 57, 39, 38, 39, 38, 39, 38, 39, 38, + 39, 38, 39, 38, 39, 38, 39, 38, 39, 38, + 39, 38, 39, 38, 39, 38, 39, 38, 39, 38, + 39, 38, 39, 38, +}; +const ALIGN(8) uint8_t tensor_data10[1024] = { + 136, 154, 0, 0, 0, 0, 0, 0, 99, 160, + 0, 0, 0, 0, 0, 0, 137, 167, 0, 0, + 0, 0, 0, 0, 67, 176, 0, 0, 0, 0, + 0, 0, 233, 186, 0, 0, 0, 0, 0, 0, + 234, 199, 0, 0, 0, 0, 0, 0, 201, 215, + 0, 0, 0, 0, 0, 0, 41, 235, 0, 0, + 0, 0, 0, 0, 208, 2, 1, 0, 0, 0, + 0, 0, 175, 31, 1, 0, 0, 0, 0, 0, + 238, 66, 1, 0, 0, 0, 0, 0, 243, 109, + 1, 0, 0, 0, 0, 0, 119, 162, 1, 0, + 0, 0, 0, 0, 147, 226, 1, 0, 0, 0, + 0, 0, 212, 48, 2, 0, 0, 0, 0, 0, + 90, 144, 2, 0, 0, 0, 0, 0, 245, 4, + 3, 0, 0, 0, 0, 0, 75, 147, 3, 0, + 0, 0, 0, 0, 9, 65, 4, 0, 0, 0, + 0, 0, 31, 21, 5, 0, 0, 0, 0, 0, + 255, 23, 6, 0, 0, 0, 1, 0, 253, 83, + 7, 0, 0, 0, 1, 0, 178, 213, 8, 0, + 0, 0, 1, 0, 123, 172, 10, 0, 0, 0, + 1, 0, 26, 235, 12, 0, 0, 0, 1, 0, + 113, 168, 15, 0, 0, 0, 2, 0, 107, 0, + 19, 0, 0, 0, 2, 0, 21, 21, 23, 0, + 0, 0, 2, 0, 246, 15, 28, 0, 0, 0, + 3, 0, 179, 35, 34, 0, 0, 0, 3, 0, + 5, 142, 41, 0, 0, 0, 4, 0, 41, 154, + 50, 0, 0, 0, 5, 0, 196, 163, 61, 0, + 0, 0, 6, 0, 111, 26, 75, 0, 0, 0, + 7, 0, 249, 133, 91, 0, 0, 0, 9, 0, + 146, 139, 111, 0, 1, 0, 11, 0, 240, 243, + 135, 0, 1, 0, 13, 0, 191, 178, 165, 0, + 1, 0, 16, 0, 112, 239, 201, 0, 1, 0, + 20, 0, 178, 15, 246, 0, 1, 0, 24, 0, + 191, 195, 43, 1, 1, 0, 30, 0, 190, 20, + 109, 1, 2, 0, 36, 0, 76, 117, 188, 1, + 2, 0, 44, 0, 77, 212, 28, 2, 3, 0, + 53, 0, 210, 177, 145, 2, 3, 0, 64, 0, + 178, 53, 31, 3, 4, 0, 78, 0, 0, 71, + 202, 3, 4, 0, 94, 0, 224, 162, 152, 4, + 5, 0, 113, 0, 110, 240, 144, 5, 6, 0, + 136, 0, 45, 206, 186, 6, 7, 0, 163, 0, + 32, 212, 30, 8, 8, 0, 194, 0, 243, 131, + 198, 9, 10, 0, 231, 0, 24, 31, 188, 11, + 11, 0, 16, 1, 79, 89, 10, 14, 12, 0, + 63, 1, 57, 222, 187, 16, 14, 0, 115, 1, + 65, 162, 218, 19, 15, 0, 172, 1, 116, 252, + 110, 23, 15, 0, 233, 1, 238, 143, 126, 27, + 16, 0, 39, 2, 21, 25, 11, 32, 15, 0, + 101, 2, 209, 66, 17, 37, 14, 0, 160, 2, + 10, 183, 135, 42, 12, 0, 213, 2, 157, 165, + 94, 48, 9, 0, 0, 3, 85, 247, 127, 54, + 6, 0, 31, 3, 7, 75, 208, 60, 2, 0, + 46, 3, 144, 180, 48, 67, 254, 0, 46, 3, + 77, 8, 129, 73, 250, 0, 31, 3, 21, 90, + 162, 79, 247, 0, 0, 3, 187, 72, 121, 85, + 244, 0, 213, 2, 5, 189, 239, 90, 242, 0, + 160, 2, 214, 230, 245, 95, 241, 0, 101, 2, + 14, 112, 130, 100, 240, 0, 39, 2, 151, 3, + 146, 104, 241, 0, 233, 1, 218, 93, 38, 108, + 241, 0, 172, 1, 229, 33, 69, 111, 242, 0, + 115, 1, 216, 166, 246, 113, 244, 0, 63, 1, + 10, 225, 68, 116, 245, 0, 16, 1, 46, 124, + 58, 118, 246, 0, 231, 0, 5, 44, 226, 119, + 248, 0, 194, 0, 243, 49, 70, 121, 249, 0, + 163, 0, 173, 15, 112, 122, 250, 0, 136, 0, + 56, 93, 104, 123, 251, 0, 113, 0, 20, 185, + 54, 124, 252, 0, 94, 0, 97, 202, 225, 124, + 252, 0, 78, 0, 63, 78, 111, 125, 253, 0, + 64, 0, 191, 43, 228, 125, 253, 0, 53, 0, + 196, 138, 68, 126, 254, 0, 44, 0, 73, 235, + 147, 126, 254, 0, 36, 0, 74, 60, 213, 126, + 255, 0, 30, 0, 86, 240, 10, 127, 255, 0, + 24, 0, 150, 16, 55, 127, 255, 0, 20, 0, + 69, 77, 91, 127, 255, 0, 16, 0, 19, 12, + 121, 127, 255, 0, 13, 0, 115, 116, 145, 127, + 255, 0, 11, 0, 9, 122, 165, 127, 0, 0, + 9, 0, 145, 229, 181, 127, 0, 0, 7, 0, + 60, 92, 195, 127, 0, 0, 6, 0, 218, 101, + 206, 127, 0, 0, 5, 0, 254, 113, 215, 127, + 0, 0, 4, 0, 74, 220, 222, 127, 0, 0, + 3, 0, 10, 240, 228, 127, 0, 0, 3, 0, + 238, 234, 233, 127, 0, 0, 2, 0, 150, 255, + 237, 127, 0, 0, 2, 0, 140, 87, 241, 127, + 0, 0, 2, 0, 232, 20, 244, 127, 0, 0, + 1, 0, 132, 83, 246, 127, 0, 0, 1, 0, + 82, 42, 248, 127, 0, 0, 1, 0, 0, 172, + 249, 127, 0, 0, 1, 0, 255, 231, 250, 127, + 0, 0, 1, 0, 224, 234, 251, 127, 0, 0, + 0, 0, 247, 190, 252, 127, 0, 0, 0, 0, + 182, 108, 253, 127, 0, 0, 0, 0, 14, 251, + 253, 127, 0, 0, 0, 0, 166, 111, 254, 127, + 0, 0, 0, 0, 43, 207, 254, 127, 0, 0, + 0, 0, 110, 29, 255, 127, 0, 0, 0, 0, + 136, 93, 255, 127, 0, 0, 0, 0, 13, 146, + 255, 127, 0, 0, 0, 0, 19, 189, 255, 127, + 0, 0, 0, 0, 81, 224, 255, 127, 0, 0, + 0, 0, 48, 253, 255, 127, 0, 0, 0, 0, + 255, 255, 255, 127, 0, 0, 0, 0, 255, 255, + 255, 127, 0, 0, 0, 0, 255, 255, 255, 127, + 0, 0, 0, 0, 255, 255, 255, 127, 0, 0, + 0, 0, 255, 255, 255, 127, 0, 0, 0, 0, + 255, 255, 255, 127, 0, 0, 0, 0, 255, 255, + 255, 127, 0, 0, 0, 0, 255, 255, 255, 127, + 0, 0, 0, 0, +}; +const TfArray<1, int> tensor_dimension10 = { 1, { 1024 } }; +const ALIGN(4) uint8_t tensor_data11[4] = { + 51, 64, 29, 0, +}; +const ALIGN(8) uint8_t tensor_data12[64] = { + 8, 64, 8, 64, 8, 64, 8, 64, 8, 64, + 8, 64, 8, 64, 8, 64, 8, 64, 8, 64, + 8, 64, 8, 64, 8, 64, 8, 64, 8, 64, + 8, 64, 248, 191, 248, 191, 248, 191, 248, 191, + 248, 191, 248, 191, 248, 191, 248, 191, 248, 191, + 248, 191, 248, 191, 248, 191, 248, 191, 248, 191, + 248, 191, 248, 191, +}; +const ALIGN(8) uint8_t tensor_data13[64] = { + 185, 55, 185, 55, 185, 55, 185, 55, 185, 55, + 185, 55, 185, 55, 185, 55, 185, 55, 185, 55, + 185, 55, 185, 55, 185, 55, 185, 55, 185, 55, + 185, 55, 172, 36, 172, 36, 172, 36, 172, 36, + 172, 36, 172, 36, 172, 36, 172, 36, 172, 36, + 172, 36, 172, 36, 172, 36, 172, 36, 172, 36, + 172, 36, 172, 36, +}; +const ALIGN(8) uint8_t tensor_data14[1024] = { + 233, 143, 0, 0, 0, 0, 0, 0, 148, 147, + 0, 0, 0, 0, 0, 0, 23, 152, 0, 0, + 0, 0, 0, 0, 165, 157, 0, 0, 0, 0, + 0, 0, 123, 164, 0, 0, 0, 0, 0, 0, + 229, 172, 0, 0, 0, 0, 0, 0, 63, 183, + 0, 0, 0, 0, 0, 0, 252, 195, 0, 0, + 0, 0, 0, 0, 169, 211, 0, 0, 0, 0, + 0, 0, 243, 230, 0, 0, 0, 0, 0, 0, + 176, 254, 0, 0, 0, 0, 0, 0, 231, 27, + 1, 0, 0, 0, 0, 0, 217, 63, 1, 0, + 0, 0, 0, 0, 22, 108, 1, 0, 0, 0, + 0, 0, 133, 162, 1, 0, 0, 0, 0, 0, + 130, 229, 1, 0, 0, 0, 0, 0, 240, 55, + 2, 0, 0, 0, 0, 0, 95, 157, 2, 0, + 0, 0, 0, 0, 50, 26, 3, 0, 0, 0, + 0, 0, 203, 179, 3, 0, 0, 0, 0, 0, + 205, 112, 4, 0, 0, 0, 0, 0, 97, 89, + 5, 0, 0, 0, 1, 0, 145, 119, 6, 0, + 0, 0, 1, 0, 184, 215, 7, 0, 0, 0, + 1, 0, 8, 137, 9, 0, 0, 0, 1, 0, + 51, 158, 11, 0, 0, 0, 1, 0, 54, 46, + 14, 0, 0, 0, 1, 0, 89, 85, 17, 0, + 0, 0, 2, 0, 99, 54, 21, 0, 0, 0, + 2, 0, 20, 252, 25, 0, 0, 0, 3, 0, + 252, 218, 31, 0, 0, 0, 3, 0, 178, 19, + 39, 0, 0, 0, 4, 0, 146, 245, 47, 0, + 0, 0, 5, 0, 18, 226, 58, 0, 0, 0, + 6, 0, 213, 80, 72, 0, 0, 0, 7, 0, + 165, 212, 88, 0, 0, 0, 9, 0, 118, 33, + 109, 0, 1, 0, 11, 0, 186, 19, 134, 0, + 1, 0, 14, 0, 46, 185, 164, 0, 1, 0, + 17, 0, 119, 91, 202, 0, 1, 0, 21, 0, + 199, 140, 248, 0, 1, 0, 26, 0, 218, 54, + 49, 1, 2, 0, 31, 0, 142, 172, 118, 1, + 2, 0, 38, 0, 68, 190, 203, 1, 2, 0, + 47, 0, 20, 209, 51, 2, 3, 0, 57, 0, + 165, 248, 178, 2, 3, 0, 70, 0, 252, 18, + 78, 3, 4, 0, 86, 0, 18, 229, 10, 4, + 5, 0, 104, 0, 249, 53, 240, 4, 6, 0, + 126, 0, 20, 229, 5, 6, 7, 0, 153, 0, + 68, 246, 84, 7, 8, 0, 184, 0, 191, 140, + 231, 8, 10, 0, 220, 0, 34, 203, 200, 10, + 11, 0, 6, 1, 0, 141, 4, 13, 13, 0, + 55, 1, 122, 237, 166, 15, 14, 0, 109, 1, + 1, 143, 187, 18, 16, 0, 169, 1, 200, 157, + 76, 22, 17, 0, 233, 1, 7, 144, 97, 26, + 17, 0, 44, 2, 248, 183, 253, 30, 17, 0, + 112, 2, 76, 208, 30, 36, 16, 0, 176, 2, + 111, 193, 187, 41, 13, 0, 235, 2, 87, 236, + 195, 47, 10, 0, 27, 3, 242, 67, 31, 54, + 7, 0, 61, 3, 94, 99, 175, 60, 2, 0, + 79, 3, 49, 156, 81, 67, 254, 0, 79, 3, + 160, 187, 225, 73, 249, 0, 61, 3, 81, 19, + 61, 80, 246, 0, 27, 3, 77, 62, 69, 86, + 243, 0, 235, 2, 140, 47, 226, 91, 240, 0, + 176, 2, 242, 71, 3, 97, 239, 0, 112, 2, + 255, 111, 159, 101, 239, 0, 44, 2, 72, 98, + 180, 105, 239, 0, 233, 1, 27, 113, 69, 109, + 240, 0, 169, 1, 173, 18, 90, 112, 242, 0, + 109, 1, 39, 115, 252, 114, 243, 0, 55, 1, + 2, 53, 56, 117, 245, 0, 6, 1, 101, 115, + 25, 119, 246, 0, 220, 0, 222, 9, 172, 120, + 248, 0, 184, 0, 12, 27, 251, 121, 249, 0, + 153, 0, 31, 202, 16, 123, 250, 0, 126, 0, + 6, 27, 246, 123, 251, 0, 104, 0, 25, 237, + 178, 124, 252, 0, 86, 0, 112, 7, 78, 125, + 253, 0, 70, 0, 250, 46, 205, 125, 253, 0, + 57, 0, 200, 65, 53, 126, 254, 0, 47, 0, + 125, 83, 138, 126, 254, 0, 38, 0, 45, 201, + 207, 126, 254, 0, 31, 0, 68, 115, 8, 127, + 255, 0, 26, 0, 141, 164, 54, 127, 255, 0, + 21, 0, 215, 70, 92, 127, 255, 0, 17, 0, + 72, 236, 122, 127, 255, 0, 14, 0, 145, 222, + 147, 127, 255, 0, 11, 0, 93, 43, 168, 127, + 0, 0, 9, 0, 46, 175, 184, 127, 0, 0, + 7, 0, 240, 29, 198, 127, 0, 0, 6, 0, + 106, 10, 209, 127, 0, 0, 5, 0, 79, 236, + 217, 127, 0, 0, 4, 0, 6, 37, 225, 127, + 0, 0, 3, 0, 240, 3, 231, 127, 0, 0, + 3, 0, 160, 201, 235, 127, 0, 0, 2, 0, + 167, 170, 239, 127, 0, 0, 2, 0, 205, 209, + 242, 127, 0, 0, 1, 0, 206, 97, 245, 127, + 0, 0, 1, 0, 250, 118, 247, 127, 0, 0, + 1, 0, 68, 40, 249, 127, 0, 0, 1, 0, + 111, 136, 250, 127, 0, 0, 1, 0, 154, 166, + 251, 127, 0, 0, 1, 0, 50, 143, 252, 127, + 0, 0, 0, 0, 53, 76, 253, 127, 0, 0, + 0, 0, 206, 229, 253, 127, 0, 0, 0, 0, + 161, 98, 254, 127, 0, 0, 0, 0, 16, 200, + 254, 127, 0, 0, 0, 0, 126, 26, 255, 127, + 0, 0, 0, 0, 124, 93, 255, 127, 0, 0, + 0, 0, 235, 147, 255, 127, 0, 0, 0, 0, + 38, 192, 255, 127, 0, 0, 0, 0, 25, 228, + 255, 127, 0, 0, 0, 0, 255, 255, 255, 127, + 0, 0, 0, 0, 255, 255, 255, 127, 0, 0, + 0, 0, 255, 255, 255, 127, 0, 0, 0, 0, + 255, 255, 255, 127, 0, 0, 0, 0, 255, 255, + 255, 127, 0, 0, 0, 0, 255, 255, 255, 127, + 0, 0, 0, 0, 255, 255, 255, 127, 0, 0, + 0, 0, 255, 255, 255, 127, 0, 0, 0, 0, + 255, 255, 255, 127, 0, 0, 0, 0, 255, 255, + 255, 127, 0, 0, 0, 0, 255, 255, 255, 127, + 0, 0, 0, 0, +}; +const ALIGN(4) uint8_t tensor_data15[4] = { + 136, 115, 29, 0, +}; +const ALIGN(8) uint8_t tensor_data16[64] = { + 99, 92, 99, 92, 99, 92, 99, 92, 99, 92, + 99, 92, 99, 92, 99, 92, 99, 92, 99, 92, + 99, 92, 99, 92, 99, 92, 99, 92, 99, 92, + 99, 92, 174, 33, 174, 33, 174, 33, 174, 33, + 174, 33, 174, 33, 174, 33, 174, 33, 174, 33, + 174, 33, 174, 33, 174, 33, 174, 33, 174, 33, + 174, 33, 174, 33, +}; +const ALIGN(8) uint8_t tensor_data17[1024] = { + 254, 129, 0, 128, 0, 0, 0, 0, 169, 130, + 0, 128, 0, 0, 0, 0, 120, 131, 0, 128, + 0, 0, 0, 0, 113, 132, 0, 128, 0, 0, + 0, 0, 183, 133, 0, 128, 0, 0, 0, 0, + 89, 135, 0, 128, 0, 0, 0, 0, 108, 137, + 0, 128, 0, 0, 0, 0, 29, 140, 0, 128, + 0, 0, 0, 0, 139, 143, 0, 128, 0, 0, + 0, 0, 249, 147, 0, 128, 0, 0, 0, 0, + 167, 153, 0, 128, 0, 0, 0, 0, 243, 160, + 0, 128, 0, 0, 0, 0, 81, 170, 0, 128, + 0, 0, 0, 0, 90, 182, 0, 128, 0, 0, + 0, 0, 207, 197, 0, 128, 0, 0, 0, 0, + 171, 217, 0, 128, 0, 0, 0, 0, 43, 243, + 0, 128, 0, 0, 0, 0, 236, 19, 1, 128, + 0, 0, 0, 0, 255, 61, 1, 128, 0, 0, + 0, 0, 10, 116, 1, 128, 0, 0, 0, 0, + 111, 185, 1, 128, 0, 0, 0, 0, 144, 18, + 2, 128, 0, 0, 0, 0, 21, 133, 2, 128, + 0, 0, 0, 0, 26, 24, 3, 128, 0, 0, + 0, 0, 249, 212, 3, 128, 0, 0, 0, 0, + 137, 199, 4, 128, 0, 0, 1, 0, 28, 255, + 5, 128, 0, 0, 1, 0, 67, 143, 7, 128, + 0, 0, 1, 0, 49, 145, 9, 128, 0, 0, + 1, 0, 57, 37, 12, 128, 0, 0, 1, 0, + 232, 116, 15, 128, 0, 0, 2, 0, 144, 181, + 19, 128, 0, 0, 2, 0, 159, 43, 25, 128, + 0, 0, 3, 0, 248, 46, 32, 128, 0, 0, + 4, 0, 99, 48, 41, 128, 0, 0, 5, 0, + 132, 192, 52, 128, 0, 0, 7, 0, 255, 152, + 67, 128, 1, 0, 8, 0, 217, 167, 86, 128, + 1, 0, 11, 0, 24, 30, 111, 128, 1, 0, + 14, 0, 133, 130, 142, 128, 1, 0, 18, 0, + 63, 201, 182, 128, 1, 0, 23, 0, 207, 113, + 234, 128, 2, 0, 29, 0, 231, 172, 44, 129, + 2, 0, 37, 0, 197, 139, 129, 129, 3, 0, + 48, 0, 29, 59, 238, 129, 4, 0, 61, 0, + 188, 75, 121, 130, 5, 0, 79, 0, 179, 10, + 43, 131, 6, 0, 100, 0, 189, 234, 13, 132, + 8, 0, 128, 0, 130, 254, 46, 133, 10, 0, + 163, 0, 219, 129, 158, 134, 12, 0, 207, 0, + 209, 106, 112, 136, 15, 0, 6, 1, 154, 243, + 188, 138, 19, 0, 74, 1, 210, 5, 161, 141, + 23, 0, 158, 1, 232, 92, 62, 145, 28, 0, + 4, 2, 168, 37, 187, 149, 33, 0, 126, 2, + 226, 203, 64, 155, 38, 0, 13, 3, 45, 154, + 249, 161, 43, 0, 176, 3, 154, 216, 12, 170, + 47, 0, 102, 4, 59, 69, 153, 179, 49, 0, + 40, 5, 89, 43, 174, 190, 48, 0, 236, 5, + 183, 2, 68, 203, 44, 0, 166, 6, 115, 62, + 54, 217, 35, 0, 69, 7, 139, 113, 64, 232, + 23, 0, 186, 7, 194, 187, 0, 248, 8, 0, + 249, 7, 170, 66, 0, 8, 248, 0, 249, 7, + 18, 141, 192, 23, 233, 0, 186, 7, 127, 192, + 202, 38, 221, 0, 69, 7, 161, 252, 188, 52, + 212, 0, 166, 6, 100, 212, 82, 65, 208, 0, + 236, 5, 215, 186, 103, 76, 207, 0, 40, 5, + 181, 39, 244, 85, 209, 0, 102, 4, 72, 102, + 7, 94, 213, 0, 176, 3, 164, 52, 192, 100, + 218, 0, 13, 3, 225, 218, 69, 106, 223, 0, + 126, 2, 153, 163, 194, 110, 228, 0, 4, 2, + 162, 250, 95, 114, 233, 0, 158, 1, 202, 12, + 68, 117, 237, 0, 74, 1, 132, 149, 144, 119, + 241, 0, 6, 1, 108, 126, 98, 121, 244, 0, + 207, 0, 183, 1, 210, 122, 246, 0, 163, 0, + 113, 21, 243, 123, 248, 0, 128, 0, 114, 245, + 213, 124, 250, 0, 100, 0, 98, 180, 135, 125, + 251, 0, 79, 0, 251, 196, 18, 126, 252, 0, + 61, 0, 77, 116, 127, 126, 253, 0, 48, 0, + 40, 83, 212, 126, 254, 0, 37, 0, 60, 142, + 22, 127, 254, 0, 29, 0, 202, 54, 74, 127, + 255, 0, 23, 0, 130, 125, 114, 127, 255, 0, + 18, 0, 237, 225, 145, 127, 255, 0, 14, 0, + 43, 88, 170, 127, 255, 0, 11, 0, 5, 103, + 189, 127, 255, 0, 8, 0, 126, 63, 204, 127, + 0, 0, 7, 0, 159, 207, 215, 127, 0, 0, + 5, 0, 10, 209, 224, 127, 0, 0, 4, 0, + 99, 212, 231, 127, 0, 0, 3, 0, 113, 74, + 237, 127, 0, 0, 2, 0, 24, 139, 241, 127, + 0, 0, 2, 0, 200, 218, 244, 127, 0, 0, + 1, 0, 208, 110, 247, 127, 0, 0, 1, 0, + 190, 112, 249, 127, 0, 0, 1, 0, 229, 0, + 251, 127, 0, 0, 1, 0, 119, 56, 252, 127, + 0, 0, 1, 0, 7, 43, 253, 127, 0, 0, + 0, 0, 230, 231, 253, 127, 0, 0, 0, 0, + 236, 122, 254, 127, 0, 0, 0, 0, 112, 237, + 254, 127, 0, 0, 0, 0, 145, 70, 255, 127, + 0, 0, 0, 0, 246, 139, 255, 127, 0, 0, + 0, 0, 1, 194, 255, 127, 0, 0, 0, 0, + 20, 236, 255, 127, 0, 0, 0, 0, 255, 255, + 255, 127, 0, 0, 0, 0, 255, 255, 255, 127, + 0, 0, 0, 0, 255, 255, 255, 127, 0, 0, + 0, 0, 255, 255, 255, 127, 0, 0, 0, 0, + 255, 255, 255, 127, 0, 0, 0, 0, 255, 255, + 255, 127, 0, 0, 0, 0, 255, 255, 255, 127, + 0, 0, 0, 0, 255, 255, 255, 127, 0, 0, + 0, 0, 255, 255, 255, 127, 0, 0, 0, 0, + 255, 255, 255, 127, 0, 0, 0, 0, 255, 255, + 255, 127, 0, 0, 0, 0, 255, 255, 255, 127, + 0, 0, 0, 0, 255, 255, 255, 127, 0, 0, + 0, 0, 255, 255, 255, 127, 0, 0, 0, 0, + 255, 255, 255, 127, 0, 0, 0, 0, 255, 255, + 255, 127, 0, 0, 0, 0, 255, 255, 255, 127, + 0, 0, 0, 0, +}; +const ALIGN(4) uint8_t tensor_data18[4] = { + 2, 64, 29, 0, +}; +const ALIGN(8) uint8_t tensor_data19[64] = { + 204, 63, 204, 63, 204, 63, 204, 63, 204, 63, + 204, 63, 204, 63, 204, 63, 204, 63, 204, 63, + 204, 63, 204, 63, 204, 63, 204, 63, 204, 63, + 204, 63, 246, 63, 246, 63, 246, 63, 246, 63, + 246, 63, 246, 63, 246, 63, 246, 63, 246, 63, + 246, 63, 246, 63, 246, 63, 246, 63, 246, 63, + 246, 63, 246, 63, +}; +const ALIGN(8) uint8_t tensor_data20[64] = { + 237, 75, 237, 75, 237, 75, 237, 75, 237, 75, + 237, 75, 237, 75, 237, 75, 237, 75, 237, 75, + 237, 75, 237, 75, 237, 75, 237, 75, 237, 75, + 237, 75, 87, 23, 87, 23, 87, 23, 87, 23, + 87, 23, 87, 23, 87, 23, 87, 23, 87, 23, + 87, 23, 87, 23, 87, 23, 87, 23, 87, 23, + 87, 23, 87, 23, +}; +const ALIGN(8) uint8_t tensor_data21[1024] = { + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 1, 0, 0, 0, 1, + 0, 128, 0, 3, 0, 0, 0, 1, 0, 128, + 0, 5, 0, 0, 0, 1, 0, 128, 0, 7, + 0, 0, 0, 1, 0, 128, 0, 9, 0, 0, + 0, 1, 0, 128, 0, 11, 0, 0, 0, 1, + 0, 128, 0, 13, 0, 0, 0, 1, 0, 128, + 0, 15, 0, 0, 0, 1, 0, 128, 0, 17, + 0, 0, 0, 1, 0, 128, 0, 19, 0, 0, + 0, 1, 0, 128, 0, 21, 0, 0, 0, 1, + 0, 128, 0, 23, 0, 0, 0, 1, 0, 128, + 0, 25, 0, 0, 0, 1, 0, 128, 0, 27, + 0, 0, 0, 1, 0, 128, 0, 29, 0, 0, + 0, 1, 0, 128, 0, 31, 0, 0, 0, 1, + 0, 128, 0, 33, 0, 0, 0, 1, 0, 128, + 0, 35, 0, 0, 0, 1, 0, 128, 0, 37, + 0, 0, 0, 1, 0, 128, 0, 39, 0, 0, + 0, 1, 0, 128, 0, 41, 0, 0, 0, 1, + 0, 128, 0, 43, 0, 0, 0, 1, 0, 128, + 0, 45, 0, 0, 0, 1, 0, 128, 0, 47, + 0, 0, 0, 1, 0, 128, 0, 49, 0, 0, + 0, 1, 0, 128, 0, 51, 0, 0, 0, 1, + 0, 128, 0, 53, 0, 0, 0, 1, 0, 128, + 0, 55, 0, 0, 0, 1, 0, 128, 0, 57, + 0, 0, 0, 1, 0, 128, 0, 59, 0, 0, + 0, 1, 1, 128, 0, 61, 0, 0, 0, 1, + 0, 128, 0, 63, 0, 0, 0, 1, 0, 128, + 0, 65, 0, 0, 0, 1, 0, 128, 0, 67, + 0, 0, 0, 1, 0, 128, 0, 69, 0, 0, + 0, 1, 255, 127, 0, 71, 0, 0, 0, 1, + 0, 128, 0, 73, 0, 0, 0, 1, 0, 128, + 0, 75, 0, 0, 0, 1, 0, 128, 0, 77, + 0, 0, 0, 1, 0, 128, 0, 79, 0, 0, + 0, 1, 0, 128, 0, 81, 0, 0, 0, 1, + 0, 128, 0, 83, 0, 0, 0, 1, 0, 128, + 0, 85, 0, 0, 0, 1, 255, 127, 0, 87, + 0, 0, 0, 1, 1, 128, 0, 89, 0, 0, + 0, 1, 0, 128, 0, 91, 0, 0, 0, 1, + 0, 128, 0, 93, 0, 0, 0, 1, 0, 128, + 0, 95, 0, 0, 0, 1, 0, 128, 0, 97, + 0, 0, 0, 1, 0, 128, 0, 99, 0, 0, + 0, 1, 0, 128, 0, 101, 0, 0, 0, 1, + 255, 127, 0, 103, 0, 0, 0, 1, 0, 128, + 0, 105, 0, 0, 0, 1, 0, 128, 0, 107, + 0, 0, 0, 1, 0, 128, 0, 109, 0, 0, + 0, 1, 0, 128, 0, 111, 0, 0, 0, 1, + 0, 128, 0, 113, 0, 0, 0, 1, 0, 128, + 0, 115, 0, 0, 0, 1, 0, 128, 0, 117, + 0, 0, 0, 1, 255, 127, 0, 119, 0, 0, + 0, 1, 1, 128, 0, 121, 0, 0, 0, 1, + 2, 128, 0, 123, 0, 0, 0, 1, 0, 128, + 0, 125, 0, 0, 0, 1, 254, 127, 0, 127, + 0, 0, 0, 1, +}; +const ALIGN(8) uint8_t tensor_data22[32] = { + 173, 216, 173, 216, 173, 216, 173, 216, 173, 216, + 173, 216, 173, 216, 173, 216, 173, 216, 173, 216, + 173, 216, 173, 216, 173, 216, 173, 216, 173, 216, + 173, 216, +}; +const TfArray<1, int> tensor_dimension22 = { 1, { 32 } }; +const ALIGN(8) uint8_t tensor_data23[64] = { + 166, 64, 166, 64, 166, 64, 166, 64, 166, 64, + 166, 64, 166, 64, 166, 64, 166, 64, 166, 64, + 166, 64, 166, 64, 166, 64, 166, 64, 166, 64, + 166, 64, 178, 1, 178, 1, 178, 1, 178, 1, + 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, + 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, + 178, 1, 178, 1, +}; +const ALIGN(8) uint8_t tensor_data24[1024] = { + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 1, 0, 0, 0, 1, + 0, 128, 0, 3, 0, 0, 0, 1, 0, 128, + 0, 5, 0, 0, 0, 1, 0, 128, 0, 7, + 0, 0, 0, 1, 0, 128, 0, 9, 0, 0, + 0, 1, 0, 128, 0, 11, 0, 0, 0, 1, + 0, 128, 0, 13, 0, 0, 0, 1, 0, 128, + 0, 15, 0, 0, 0, 1, 0, 128, 0, 17, + 0, 0, 0, 1, 0, 128, 0, 19, 0, 0, + 0, 1, 0, 128, 0, 21, 0, 0, 0, 1, + 0, 128, 0, 23, 0, 0, 0, 1, 0, 128, + 0, 25, 0, 0, 0, 1, 0, 128, 0, 27, + 0, 0, 0, 1, 0, 128, 0, 29, 0, 0, + 0, 1, 0, 128, 0, 31, 0, 0, 0, 1, + 0, 128, 0, 33, 0, 0, 0, 1, 0, 128, + 0, 35, 0, 0, 0, 1, 0, 128, 0, 37, + 0, 0, 0, 1, 0, 128, 0, 39, 0, 0, + 0, 1, 0, 128, 0, 41, 0, 0, 0, 1, + 0, 128, 0, 43, 0, 0, 0, 1, 0, 128, + 0, 45, 0, 0, 0, 1, 0, 128, 0, 47, + 0, 0, 0, 1, 0, 128, 0, 49, 0, 0, + 0, 1, 0, 128, 0, 51, 0, 0, 0, 1, + 0, 128, 0, 53, 0, 0, 0, 1, 0, 128, + 0, 55, 0, 0, 0, 1, 0, 128, 0, 57, + 0, 0, 0, 1, 0, 128, 0, 59, 0, 0, + 0, 1, 0, 128, 0, 61, 0, 0, 0, 1, + 0, 128, 0, 63, 0, 0, 0, 1, 0, 128, + 0, 65, 0, 0, 0, 1, 0, 128, 0, 67, + 0, 0, 0, 1, 0, 128, 0, 69, 0, 0, + 0, 1, 0, 128, 0, 71, 0, 0, 0, 1, + 0, 128, 0, 73, 0, 0, 0, 1, 0, 128, + 0, 75, 0, 0, 0, 1, 1, 128, 0, 77, + 0, 0, 0, 1, 0, 128, 0, 79, 0, 0, + 0, 1, 0, 128, 0, 81, 0, 0, 0, 1, + 255, 127, 0, 83, 0, 0, 0, 1, 0, 128, + 0, 85, 0, 0, 0, 1, 0, 128, 0, 87, + 0, 0, 0, 1, 0, 128, 0, 89, 0, 0, + 0, 1, 0, 128, 0, 91, 0, 0, 0, 1, + 255, 127, 0, 93, 0, 0, 0, 1, 0, 128, + 0, 95, 0, 0, 0, 1, 0, 128, 0, 97, + 0, 0, 0, 1, 0, 128, 0, 99, 0, 0, + 0, 1, 0, 128, 0, 101, 0, 0, 0, 1, + 255, 127, 0, 103, 0, 0, 0, 1, 0, 128, + 0, 105, 0, 0, 0, 1, 0, 128, 0, 107, + 0, 0, 0, 1, 0, 128, 0, 109, 0, 0, + 0, 1, 0, 128, 0, 111, 0, 0, 0, 1, + 0, 128, 0, 113, 0, 0, 0, 1, 0, 128, + 0, 115, 0, 0, 0, 1, 0, 128, 0, 117, + 0, 0, 0, 1, 0, 128, 0, 119, 0, 0, + 0, 1, 0, 128, 0, 121, 0, 0, 0, 1, + 0, 128, 0, 123, 0, 0, 0, 1, 0, 128, + 0, 125, 0, 0, 0, 1, 0, 128, 0, 127, + 0, 0, 0, 1, +}; +const ALIGN(8) uint8_t tensor_data25[64] = { + 230, 63, 230, 63, 230, 63, 230, 63, 230, 63, + 230, 63, 230, 63, 230, 63, 230, 63, 230, 63, + 230, 63, 230, 63, 230, 63, 230, 63, 230, 63, + 230, 63, 166, 1, 166, 1, 166, 1, 166, 1, + 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, + 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, + 166, 1, 166, 1, +}; +const ALIGN(8) uint8_t tensor_data26[1024] = { + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 1, 0, 0, 0, 1, + 0, 128, 0, 3, 0, 0, 0, 1, 0, 128, + 0, 5, 0, 0, 0, 1, 0, 128, 0, 7, + 0, 0, 0, 1, 0, 128, 0, 9, 0, 0, + 0, 1, 0, 128, 0, 11, 0, 0, 0, 1, + 0, 128, 0, 13, 0, 0, 0, 1, 0, 128, + 0, 15, 0, 0, 0, 1, 0, 128, 0, 17, + 0, 0, 0, 1, 0, 128, 0, 19, 0, 0, + 0, 1, 0, 128, 0, 21, 0, 0, 0, 1, + 0, 128, 0, 23, 0, 0, 0, 1, 0, 128, + 0, 25, 0, 0, 0, 1, 0, 128, 0, 27, + 0, 0, 0, 1, 0, 128, 0, 29, 0, 0, + 0, 1, 0, 128, 0, 31, 0, 0, 0, 1, + 0, 128, 0, 33, 0, 0, 0, 1, 0, 128, + 0, 35, 0, 0, 0, 1, 0, 128, 0, 37, + 0, 0, 0, 1, 0, 128, 0, 39, 0, 0, + 0, 1, 0, 128, 0, 41, 0, 0, 0, 1, + 0, 128, 0, 43, 0, 0, 0, 1, 0, 128, + 0, 45, 0, 0, 0, 1, 0, 128, 0, 47, + 0, 0, 0, 1, 0, 128, 0, 49, 0, 0, + 0, 1, 1, 128, 0, 51, 0, 0, 0, 1, + 0, 128, 0, 53, 0, 0, 0, 1, 0, 128, + 0, 55, 0, 0, 0, 1, 0, 128, 0, 57, + 0, 0, 0, 1, 0, 128, 0, 59, 0, 0, + 0, 1, 0, 128, 0, 61, 0, 0, 0, 1, + 0, 128, 0, 63, 0, 0, 0, 1, 0, 128, + 0, 65, 0, 0, 0, 1, 0, 128, 0, 67, + 0, 0, 0, 1, 0, 128, 0, 69, 0, 0, + 0, 1, 0, 128, 0, 71, 0, 0, 0, 1, + 0, 128, 0, 73, 0, 0, 0, 1, 0, 128, + 0, 75, 0, 0, 0, 1, 0, 128, 0, 77, + 0, 0, 0, 1, 0, 128, 0, 79, 0, 0, + 0, 1, 1, 128, 0, 81, 0, 0, 0, 1, + 0, 128, 0, 83, 0, 0, 0, 1, 0, 128, + 0, 85, 0, 0, 0, 1, 255, 127, 0, 87, + 0, 0, 0, 1, 0, 128, 0, 89, 0, 0, + 0, 1, 0, 128, 0, 91, 0, 0, 0, 1, + 0, 128, 0, 93, 0, 0, 0, 1, 0, 128, + 0, 95, 0, 0, 0, 1, 0, 128, 0, 97, + 0, 0, 0, 1, 0, 128, 0, 99, 0, 0, + 0, 1, 0, 128, 0, 101, 0, 0, 0, 1, + 0, 128, 0, 103, 0, 0, 0, 1, 0, 128, + 0, 105, 0, 0, 0, 1, 0, 128, 0, 107, + 0, 0, 0, 1, 255, 127, 0, 109, 0, 0, + 0, 1, 0, 128, 0, 111, 0, 0, 0, 1, + 0, 128, 0, 113, 0, 0, 0, 1, 0, 128, + 0, 115, 0, 0, 0, 1, 0, 128, 0, 117, + 0, 0, 0, 1, 0, 128, 0, 119, 0, 0, + 0, 1, 0, 128, 0, 121, 0, 0, 0, 1, + 1, 128, 0, 123, 0, 0, 0, 1, 0, 128, + 0, 125, 0, 0, 0, 1, 0, 128, 0, 127, + 0, 0, 0, 1, +}; +const ALIGN(8) uint8_t tensor_data27[64] = { + 88, 65, 88, 65, 88, 65, 88, 65, 88, 65, + 88, 65, 88, 65, 88, 65, 88, 65, 88, 65, + 88, 65, 88, 65, 88, 65, 88, 65, 88, 65, + 88, 65, 170, 2, 170, 2, 170, 2, 170, 2, + 170, 2, 170, 2, 170, 2, 170, 2, 170, 2, + 170, 2, 170, 2, 170, 2, 170, 2, 170, 2, + 170, 2, 170, 2, +}; +const ALIGN(8) uint8_t tensor_data28[1024] = { + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 1, 0, 0, 0, 1, + 0, 128, 0, 3, 0, 0, 0, 1, 0, 128, + 0, 5, 0, 0, 0, 1, 0, 128, 0, 7, + 0, 0, 0, 1, 0, 128, 0, 9, 0, 0, + 0, 1, 0, 128, 0, 11, 0, 0, 0, 1, + 0, 128, 0, 13, 0, 0, 0, 1, 0, 128, + 0, 15, 0, 0, 0, 1, 0, 128, 0, 17, + 0, 0, 0, 1, 0, 128, 0, 19, 0, 0, + 0, 1, 0, 128, 0, 21, 0, 0, 0, 1, + 0, 128, 0, 23, 0, 0, 0, 1, 0, 128, + 0, 25, 0, 0, 0, 1, 0, 128, 0, 27, + 0, 0, 0, 1, 0, 128, 0, 29, 0, 0, + 0, 1, 0, 128, 0, 31, 0, 0, 0, 1, + 0, 128, 0, 33, 0, 0, 0, 1, 0, 128, + 0, 35, 0, 0, 0, 1, 0, 128, 0, 37, + 0, 0, 0, 1, 0, 128, 0, 39, 0, 0, + 0, 1, 0, 128, 0, 41, 0, 0, 0, 1, + 0, 128, 0, 43, 0, 0, 0, 1, 0, 128, + 0, 45, 0, 0, 0, 1, 0, 128, 0, 47, + 0, 0, 0, 1, 0, 128, 0, 49, 0, 0, + 0, 1, 0, 128, 0, 51, 0, 0, 0, 1, + 0, 128, 0, 53, 0, 0, 0, 1, 0, 128, + 0, 55, 0, 0, 0, 1, 0, 128, 0, 57, + 0, 0, 0, 1, 0, 128, 0, 59, 0, 0, + 0, 1, 0, 128, 0, 61, 0, 0, 0, 1, + 0, 128, 0, 63, 0, 0, 0, 1, 0, 128, + 0, 65, 0, 0, 0, 1, 0, 128, 0, 67, + 0, 0, 0, 1, 0, 128, 0, 69, 0, 0, + 0, 1, 0, 128, 0, 71, 0, 0, 0, 1, + 0, 128, 0, 73, 0, 0, 0, 1, 0, 128, + 0, 75, 0, 0, 0, 1, 0, 128, 0, 77, + 0, 0, 0, 1, 0, 128, 0, 79, 0, 0, + 0, 1, 0, 128, 0, 81, 0, 0, 0, 1, + 0, 128, 0, 83, 0, 0, 0, 1, 0, 128, + 0, 85, 0, 0, 0, 1, 0, 128, 0, 87, + 0, 0, 0, 1, 0, 128, 0, 89, 0, 0, + 0, 1, 0, 128, 0, 91, 0, 0, 0, 1, + 0, 128, 0, 93, 0, 0, 0, 1, 0, 128, + 0, 95, 0, 0, 0, 1, 0, 128, 0, 97, + 0, 0, 0, 1, 0, 128, 0, 99, 0, 0, + 0, 1, 0, 128, 0, 101, 0, 0, 0, 1, + 0, 128, 0, 103, 0, 0, 0, 1, 0, 128, + 0, 105, 0, 0, 0, 1, 0, 128, 0, 107, + 0, 0, 0, 1, 0, 128, 0, 109, 0, 0, + 0, 1, 0, 128, 0, 111, 0, 0, 0, 1, + 0, 128, 0, 113, 0, 0, 0, 1, 0, 128, + 0, 115, 0, 0, 0, 1, 0, 128, 0, 117, + 0, 0, 0, 1, 0, 128, 0, 119, 0, 0, + 0, 1, 0, 128, 0, 121, 0, 0, 0, 1, + 0, 128, 0, 123, 0, 0, 0, 1, 0, 128, + 0, 125, 0, 0, 0, 1, 0, 128, 0, 127, + 0, 0, 0, 1, +}; +const ALIGN(8) uint8_t tensor_data29[32] = { + 214, 252, 214, 252, 214, 252, 214, 252, 214, 252, + 214, 252, 214, 252, 214, 252, 214, 252, 214, 252, + 214, 252, 214, 252, 214, 252, 214, 252, 214, 252, + 214, 252, +}; +const ALIGN(8) uint8_t tensor_data30[64] = { + 49, 62, 49, 62, 49, 62, 49, 62, 49, 62, + 49, 62, 49, 62, 49, 62, 49, 62, 49, 62, + 49, 62, 49, 62, 49, 62, 49, 62, 49, 62, + 49, 62, 173, 2, 173, 2, 173, 2, 173, 2, + 173, 2, 173, 2, 173, 2, 173, 2, 173, 2, + 173, 2, 173, 2, 173, 2, 173, 2, 173, 2, + 173, 2, 173, 2, +}; +const ALIGN(8) uint8_t tensor_data31[1024] = { + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 1, 0, 0, 0, 1, + 0, 128, 0, 3, 0, 0, 0, 1, 0, 128, + 0, 5, 0, 0, 0, 1, 0, 128, 0, 7, + 0, 0, 0, 1, 0, 128, 0, 9, 0, 0, + 0, 1, 0, 128, 0, 11, 0, 0, 0, 1, + 0, 128, 0, 13, 0, 0, 0, 1, 0, 128, + 0, 15, 0, 0, 0, 1, 0, 128, 0, 17, + 0, 0, 0, 1, 0, 128, 0, 19, 0, 0, + 0, 1, 0, 128, 0, 21, 0, 0, 0, 1, + 0, 128, 0, 23, 0, 0, 0, 1, 0, 128, + 0, 25, 0, 0, 0, 1, 0, 128, 0, 27, + 0, 0, 0, 1, 0, 128, 0, 29, 0, 0, + 0, 1, 0, 128, 0, 31, 0, 0, 0, 1, + 0, 128, 0, 33, 0, 0, 0, 1, 0, 128, + 0, 35, 0, 0, 0, 1, 0, 128, 0, 37, + 0, 0, 0, 1, 0, 128, 0, 39, 0, 0, + 0, 1, 0, 128, 0, 41, 0, 0, 0, 1, + 0, 128, 0, 43, 0, 0, 0, 1, 0, 128, + 0, 45, 0, 0, 0, 1, 0, 128, 0, 47, + 0, 0, 0, 1, 0, 128, 0, 49, 0, 0, + 0, 1, 0, 128, 0, 51, 0, 0, 0, 1, + 0, 128, 0, 53, 0, 0, 0, 1, 0, 128, + 0, 55, 0, 0, 0, 1, 0, 128, 0, 57, + 0, 0, 0, 1, 0, 128, 0, 59, 0, 0, + 0, 1, 0, 128, 0, 61, 0, 0, 0, 1, + 0, 128, 0, 63, 0, 0, 0, 1, 0, 128, + 0, 65, 0, 0, 0, 1, 0, 128, 0, 67, + 0, 0, 0, 1, 0, 128, 0, 69, 0, 0, + 0, 1, 0, 128, 0, 71, 0, 0, 0, 1, + 0, 128, 0, 73, 0, 0, 0, 1, 0, 128, + 0, 75, 0, 0, 0, 1, 0, 128, 0, 77, + 0, 0, 0, 1, 0, 128, 0, 79, 0, 0, + 0, 1, 0, 128, 0, 81, 0, 0, 0, 1, + 0, 128, 0, 83, 0, 0, 0, 1, 0, 128, + 0, 85, 0, 0, 0, 1, 0, 128, 0, 87, + 0, 0, 0, 1, 0, 128, 0, 89, 0, 0, + 0, 1, 0, 128, 0, 91, 0, 0, 0, 1, + 0, 128, 0, 93, 0, 0, 0, 1, 0, 128, + 0, 95, 0, 0, 0, 1, 0, 128, 0, 97, + 0, 0, 0, 1, 254, 127, 0, 99, 0, 0, + 0, 1, 2, 128, 0, 101, 0, 0, 0, 1, + 0, 128, 0, 103, 0, 0, 0, 1, 0, 128, + 0, 105, 0, 0, 0, 1, 1, 128, 0, 107, + 0, 0, 0, 1, 255, 127, 0, 109, 0, 0, + 0, 1, 2, 128, 0, 111, 0, 0, 0, 1, + 254, 127, 0, 113, 0, 0, 0, 1, 1, 128, + 0, 115, 0, 0, 0, 1, 254, 127, 0, 117, + 0, 0, 0, 1, 1, 128, 0, 119, 0, 0, + 0, 1, 0, 128, 0, 121, 0, 0, 0, 1, + 255, 127, 0, 123, 0, 0, 0, 1, 2, 128, + 0, 125, 0, 0, 0, 1, 255, 127, 0, 127, + 0, 0, 0, 1, +}; +const ALIGN(8) uint8_t tensor_data32[8] = { + 252, 0, 0, 124, 252, 0, 128, 191, +}; +const TfArray<1, int> tensor_dimension32 = { 1, { 8 } }; +const ALIGN(8) uint8_t tensor_data33[8] = { + 0, 0, 0, 124, 0, 0, 128, 191, +}; +const ALIGN(8) int32_t tensor_data34[64] = { + 23980, -281760, 33412, -6618, -29731, -199152, -149999, 29776, 9474889, 3459489, + 5764716, 4360983, 9791223, 2791009, 5843233, 6105883, 34717, -531743, 36320, 119151, + -45805, 17091, 156864, -78035, 7309505, 2049912, 5813667, 3819263, 9621802, 8402533, + 2380325, 5505249, 31423, -155919, -453034, 97999, -361016, -10264, -231997, 110338, + 2441963, 4609738, 2261850, 3312427, 1777126, 9147364, 3555477, 5102044, -323659, -133060, + 1229, 166153, 55075, -482469, 242402, 121651, 1800993, 8350395, 4007423, 2518794, + 5368444, 2391185, 2025136, 3291991, +}; +const ALIGN(8) int8_t tensor_data35[2816] = { + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -46, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -61, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -110, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -100, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -46, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -59, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -127, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -127, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -127, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -71, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -127, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -45, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -127, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 105, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -85, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -38, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -80, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -47, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -127, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -38, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -127, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -127, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -127, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -117, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -73, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -127, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -72, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -109, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -127, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -93, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -127, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -53, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -64, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -111, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -111, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -52, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -25, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -106, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -82, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -67, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -49, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -127, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -127, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -104, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -124, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -127, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -108, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -33, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -88, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, +}; +const TfArray<1, int> tensor_dimension35 = { 1, { 2816 } }; +const ALIGN(8) int32_t tensor_data36[64] = { + 3474188, -696550, 2403687, -205763, 390102, 625141, 18630, -15494, 1675611, 3156316, + 1521332, 2037665, 1845603, 1121593, 2891086, 4118226, 2407865, 2342734, -109115, 55280, + -692976, 1771762, -1093882, -1558294, 2165732, 2953231, 3029694, 2089367, 2269292, 1990039, + 2556050, 1059894, -109648, 1159345, -354070, 239613, -5363647, 2246759, 379773, -335127, + 1146998, 1812097, 2810785, 1275659, 1423850, 1147318, 2190944, 1759253, -1475964, 850864, + -25881, -2035473, 449941, 3405582, 474076, 964023, 1766885, 1044972, 1582994, 1264298, + 2859220, 1157495, 2308363, 1849256, +}; +const ALIGN(8) int8_t tensor_data37[3072] = { + -64, -44, -67, -23, -33, -4, -64, -70, 32, -26, + -7, -6, -40, -38, -36, -73, 2, -84, -14, -106, + -27, 31, -51, 5, -21, 78, 38, -3, 29, 62, + -86, 84, 37, 84, -46, -67, 97, -60, -34, 49, + 2, 75, -24, -25, 29, 19, -41, -2, 5, 80, + 54, -28, -17, 81, 30, -35, -24, 127, 12, 54, + -48, -22, -18, 2, 64, -3, 70, -50, -38, -37, + 19, 26, -48, 16, 43, 2, -37, 13, -45, -71, + -65, -24, 49, -41, -44, 5, 30, 13, 8, 64, + 57, 87, 24, 8, 19, -107, -54, 42, 10, -32, + -44, 28, -4, 35, 71, -103, 55, 55, 56, 40, + -75, -44, 20, 3, -101, 84, -32, 53, 46, 55, + -52, 67, -9, -34, 18, 105, -18, 10, 4, -9, + -11, -20, -8, 75, 97, 34, 28, -5, -82, 25, + 70, -28, -59, 76, 18, -79, 85, 62, 7, -52, + -78, -3, -24, -105, -84, -19, -81, 65, 3, 8, + -102, -75, -39, -6, -23, 9, -5, 2, 14, -122, + 4, 84, -51, 1, -5, -127, 21, -62, 83, 15, + -45, 77, 37, -62, -58, 28, 76, 43, 66, 58, + -8, 59, 82, -111, -28, 56, 8, 2, 61, 6, + -9, -37, -56, -37, 45, -6, 34, 34, -32, -56, + 4, 11, -16, -16, -28, -67, -14, -100, -54, -60, + -33, -61, -68, -70, 44, 43, 13, 15, -37, -18, + 37, -68, -41, -33, -93, -26, 48, -66, -42, -5, + 31, 73, 26, 4, -59, -75, -77, -102, 10, -5, + -12, -47, 19, -11, -1, -7, -66, 3, -35, 60, + 4, 78, -89, -54, -17, 51, -25, 21, 18, 59, + -19, -37, -14, -58, -13, -46, -63, 50, 84, 76, + -22, 49, 57, -12, 60, 14, 79, -75, -61, -57, + 56, -56, -18, 68, -43, 72, -68, 19, -2, 79, + -68, 66, 46, -11, -5, -9, 23, 51, -14, -29, + -34, 84, -20, 69, -92, 44, 4, 45, 68, 102, + -33, -106, 62, 65, 92, -67, 45, -89, 17, -65, + -92, 45, 38, -6, -93, -40, -101, -10, -7, 1, + -69, -60, 35, -91, 74, 119, -69, -42, -14, 1, + -2, -36, -7, -78, 18, -6, 62, -65, -24, 42, + 39, -64, -42, 16, -71, 87, -55, 56, 39, 72, + 12, -76, -15, -27, -24, -39, 85, -56, -80, 84, + -31, -96, -47, 66, -103, 48, -127, 52, -87, -88, + 35, -41, 94, -56, 24, -76, -32, -92, -62, 49, + -27, 51, 5, -23, -49, 34, -10, -7, 62, -34, + -69, -45, -31, 2, 56, -2, 63, -58, -74, 10, + -86, 38, -45, -69, -54, 94, -36, -37, -76, 30, + -24, -102, 111, 53, -28, 38, 96, 64, -32, 18, + 41, 73, 90, 1, 0, 17, 72, 4, 32, -61, + -37, 68, -84, 65, 56, -11, -62, 14, 72, -127, + -47, 48, 12, 12, -64, -33, -88, -38, -54, -13, + -8, 59, 43, -55, -74, -127, 2, 64, 53, -57, + -29, -61, 28, -32, -84, -52, -22, -17, -20, -54, + -11, -109, -64, -32, -71, -32, -43, 59, 44, -14, + -33, 16, -57, -10, -26, 47, -57, -37, -67, -30, + 9, -13, -66, -21, -29, 57, 49, 32, 72, -17, + -4, 3, 81, -46, -23, 9, 16, 80, -36, 42, + -82, -13, 127, 6, 112, 11, 105, 41, 29, -10, + 35, 85, -84, 33, 127, -42, -81, 48, -99, -51, + -50, -61, -78, 95, -17, -67, 27, -54, 10, 67, + 42, 27, -81, -57, 47, -34, -9, 60, -1, -14, + -7, 52, 75, 8, 62, -107, 118, -96, -70, 74, + -6, -24, 33, -87, 52, -13, 8, 8, -37, -1, + 74, 44, -31, -87, -73, 2, -69, -61, -19, -103, + -19, -83, -100, 71, -74, 89, -103, 56, -39, 64, + 56, -31, -2, 50, -96, -2, -74, 27, 74, -83, + 63, -76, 0, -3, 127, -58, -79, 89, -92, 9, + 66, -40, 6, 55, -1, 26, -36, -35, 59, 19, + -102, 42, 49, 19, -71, 44, -37, 83, 16, -81, + -117, -16, -46, 52, -30, -29, 28, -126, 98, 47, + -27, 72, -37, -17, -2, 57, -66, 11, -28, 40, + 93, 112, -24, -20, -23, -26, 83, 23, 10, 19, + -90, -94, 73, -25, -33, 9, -59, -73, 64, -37, + 86, -43, 96, -62, -2, 18, 15, -79, 43, -25, + -36, -19, -36, 65, 54, 60, 85, 24, -71, -2, + -45, -33, -37, 68, -27, -37, -58, -24, 1, -11, + -92, -35, -15, -13, 34, 44, 40, -7, -99, -32, + -53, 26, 68, -17, -29, -32, -14, -52, -7, 3, + 0, -53, -36, -86, -127, 40, -49, -95, -23, -25, + -24, -21, -53, 87, -10, -107, -48, -17, -53, -7, + -58, -48, 12, 18, 77, -67, -49, -14, 66, 42, + -18, -9, 11, 9, -11, 42, -52, -37, 11, 127, + 91, -5, -47, 5, -81, 88, 26, -98, 61, -51, + -52, 58, 91, -48, -5, -16, 38, -47, 46, 53, + 61, 18, -58, -36, -43, 80, 16, -27, 36, -11, + 60, 52, 79, 10, -24, 24, -97, 74, 39, -40, + 12, -81, 79, 52, 73, 74, 47, -83, -76, -19, + -99, 81, 6, -34, -85, -30, 0, 42, -127, 7, + -27, -8, 62, 55, -80, 34, -89, -79, 62, 81, + -67, 9, 33, 92, -54, 89, 25, 38, 98, -7, + -90, -97, -63, 61, 37, -65, -68, -97, 0, -9, + 67, 89, -87, -80, -56, 69, -41, -30, 66, -61, + 68, -26, 18, -16, -25, -7, 34, -76, 85, 43, + 77, -8, -30, -57, -34, 31, 14, -31, 34, -121, + 21, 83, -6, -55, 9, 55, 45, 23, 70, 14, + -107, -8, 96, -70, 42, 55, 63, -61, -31, 84, + 10, 58, -31, -127, 33, 29, 48, 8, -18, 32, + -36, 98, 85, 70, -81, 7, 3, 16, 3, -67, + 34, -27, -92, -95, 97, -41, 35, 35, 115, -90, + 61, -9, -19, -49, -45, 28, 18, -84, -34, -30, + -58, 81, 49, -30, 108, -69, -50, -22, -52, 1, + 70, 85, 83, -94, 69, 41, -32, 80, 53, -51, + -35, 22, -39, -55, -13, 12, 72, -71, 3, -34, + -52, 79, -42, 22, -79, -53, -44, -76, 24, 59, + -28, -53, -31, 6, -1, 23, 56, 35, -33, 31, + 17, 39, 13, 17, -28, -3, -35, 18, -40, -32, + 76, 26, 66, -121, 17, -13, -40, -10, 86, 50, + -13, 72, -32, -15, -3, -55, 31, 13, -51, -100, + 75, 109, 42, -54, -54, 104, 44, 5, 49, -8, + -26, -53, 72, -70, -39, 56, 25, -27, -31, -14, + 66, -64, 4, -61, 22, 3, -36, 26, 10, -20, + 12, 29, 110, 3, -15, 88, -28, 54, -55, -66, + -30, -49, -40, -2, -19, 42, 33, -14, -46, -2, + 44, 33, -11, -85, -40, 40, -97, 36, -36, 45, + -61, -31, 46, 81, -43, 50, -118, -36, 34, 27, + -97, -79, -15, 90, -99, -80, 94, -29, -82, 117, + 65, 15, -67, 27, 127, 14, -28, 53, -22, 113, + -45, -39, 54, 19, -38, 30, 114, -5, 20, 61, + -85, 92, 35, 5, 52, -23, -30, 52, -88, -55, + 52, -39, -17, -70, 65, 74, -95, 75, 30, 66, + 32, 32, 8, 106, -52, 51, 44, -56, -49, 57, + -62, 29, 44, -9, 81, -57, -43, -60, -34, 30, + 4, -15, -79, -36, 5, -39, 11, -52, 30, 47, + 1, -47, -56, -51, -82, -76, -44, -18, -27, -50, + -12, -29, 50, -127, -24, -60, -32, -69, -55, -22, + -68, 12, -50, -9, -88, -42, 19, -112, -3, 59, + 67, 29, -56, 101, 66, 56, -32, 12, 64, 51, + -34, 33, -17, 6, -14, 9, -17, 29, 3, 70, + 46, -67, -84, 42, -4, -32, -43, 19, 6, 61, + -64, -20, 68, 51, 39, 35, 11, 42, -33, 0, + 26, 11, -65, -44, -31, -3, -66, 40, 31, -85, + 69, -32, -2, -81, 37, -11, 33, 11, 35, -76, + 47, 64, 83, -6, 61, 69, 66, 39, -32, 1, + -58, 29, -32, 24, -24, 36, -81, -49, -31, 93, + -26, 8, -34, -10, -61, 55, -29, 81, 93, 48, + 115, -52, 2, 58, 20, 28, 43, -42, -7, 40, + -94, 6, -29, 32, 38, -25, -52, -31, 74, 7, + 29, 43, -55, 29, -32, -36, -17, -17, 61, -20, + -7, 41, -47, -39, 51, -3, -13, 58, 61, 70, + -63, -63, -31, -68, 46, 112, 9, -42, 7, -99, + 1, -43, -20, -64, -79, -54, 14, 127, 15, 11, + 24, -24, 109, -88, 91, -123, 57, 84, 24, 47, + -78, -73, -3, 26, -94, -2, -62, -62, 80, 54, + 86, -90, 21, -85, -11, 83, -18, 9, 6, 48, + 3, -67, 93, -49, 38, -71, -17, 98, 80, -28, + 37, -40, 59, -25, -14, -28, 88, 18, 28, -5, + -23, 68, 27, -18, 12, 27, 8, -20, -21, 42, + 33, 18, -61, 3, -84, 97, -85, 40, 86, -85, + 55, 55, -26, 70, 5, 59, -31, -75, -1, -53, + -28, -30, 9, 11, 60, 0, -70, -63, 14, 12, + -72, -6, -33, 77, -28, -89, -52, 21, 6, 6, + -5, -5, -75, 44, -17, 79, -4, 45, 39, -33, + -82, 8, -62, -2, -52, -45, 59, 36, 6, -15, + -14, -27, -57, 71, -23, 58, 28, 77, 20, -25, + -18, 18, -57, -38, -61, 54, 12, 22, 69, -76, + -56, -66, -54, -17, -100, 52, -10, -3, 65, -44, + -90, 19, -49, -88, -75, 66, -65, -17, 4, -12, + 33, -127, -82, 56, 45, 61, 12, -30, -37, 47, + 28, 61, -23, 41, -9, -75, 9, 13, 45, -79, + 38, -15, -2, -54, -13, 0, 36, -17, -41, 54, + 17, 34, 26, 54, -69, 52, 35, -39, 35, -91, + 55, -41, -57, 23, -26, -58, 60, -16, -52, 79, + -45, 47, -25, 42, 10, 67, -69, 59, 61, -15, + 49, 78, -10, -54, -53, -26, -38, -82, 69, 12, + -19, -85, 64, -18, -112, -12, -117, -20, -36, 61, + -24, 12, -114, -40, -44, -13, 7, -14, -47, 10, + 33, -32, -3, -47, 38, -108, 18, 44, -48, -74, + -32, -10, 103, 109, -38, -9, 63, -11, -21, -87, + -50, 1, 74, 49, 11, -80, 109, 50, -8, -27, + 19, 32, 0, -2, -61, -45, 18, -42, 86, -78, + -15, 1, 47, 62, 70, 18, -2, -49, -55, -19, + -40, -71, 17, 127, -41, -88, 87, -50, -28, -23, + 52, 96, -53, -4, 100, 53, -34, 91, -25, 3, + -29, 21, 125, 22, 59, -5, 127, 12, -41, 12, + 70, -32, 73, -8, 11, 63, -70, -11, -41, 60, + 40, -113, 25, 122, 63, -48, 65, 45, 48, -83, + 22, 19, 12, -38, 93, 2, -71, -31, 16, 0, + 55, 16, -81, -58, -50, 28, 65, 14, -32, 62, + -54, -35, -6, -42, -64, 37, 43, -107, -21, 30, + -34, -21, 46, -23, -14, -18, 88, -33, -89, 36, + 37, -58, 47, 109, -37, 45, -31, -31, 20, -7, + 53, 88, -100, -108, 95, -62, -9, -22, 13, -2, + -31, 11, 11, 48, -59, 10, 33, 73, 13, -12, + 40, 81, -6, -91, 12, 73, 84, 59, -28, -77, + -108, -4, -28, 9, -73, -59, 86, 22, -40, -77, + 18, -71, -7, 3, -43, -14, -98, 45, -63, 53, + 8, 74, 51, -116, -68, -76, 9, -5, -18, 17, + -13, 30, 54, -44, 46, -77, 36, 11, -32, -32, + 18, 66, 17, -5, 36, 1, -27, -59, -15, -71, + 63, -80, 40, 72, -63, -62, -60, -64, -55, -38, + -72, 20, -110, -127, -54, 8, -1, -74, 22, -3, + -54, 14, 26, -4, 1, -63, -13, -31, -19, -87, + -15, -45, 40, 20, -69, 1, -12, 2, -30, 55, + 124, 68, 38, 88, 21, 83, 24, -13, 97, -44, + 21, 74, 19, 61, -61, -61, -8, 43, -106, -61, + -41, 75, 25, 3, 56, -127, -41, -35, -17, 35, + 11, 14, -6, 8, 21, -100, 61, 39, 87, 54, + 68, 42, 33, 63, -13, 13, 0, -21, 47, -23, + -79, 36, 51, 1, 107, -71, 65, 95, 115, 25, + 118, 56, -40, 68, -18, 1, -25, 1, -58, 66, + -63, -5, -83, 93, 47, -31, 0, 18, 58, -7, + 29, 12, 72, -65, -60, 53, -47, -88, 48, -12, + 82, 66, -32, -82, 3, -44, -30, 49, -18, -9, + -27, -9, 18, 11, -32, 25, -9, 16, -51, -127, + -99, 62, -18, 88, 38, -58, 96, -65, 73, 6, + -42, -33, 3, -38, 72, 70, 93, 1, 13, 34, + 108, 11, 45, 87, -57, 76, 70, -98, -87, -16, + 54, -2, -10, 94, 38, -63, 40, 42, -16, 127, + -41, -73, 68, 29, 118, -58, 88, 49, -6, -13, + 23, -106, 61, 21, -72, -61, 45, 19, 71, 24, + 1, -14, -7, 94, 77, -61, -33, 15, -53, -46, + -72, 48, -11, -39, -40, -41, -80, 46, -4, -79, + -114, 28, -40, 74, 50, -83, -71, 11, 19, -81, + -23, -8, 22, 26, -17, -73, -113, 63, -64, 30, + 80, -66, 105, 103, -102, -127, -98, 44, -10, 94, + -37, -31, 22, -66, 77, 10, -1, 23, -21, -58, + -44, -7, 3, -35, -13, 45, 18, 44, 36, -84, + 63, 59, -106, -44, -69, -62, 75, -31, 8, -10, + -10, -14, -73, -63, 43, 30, 118, -52, 58, 61, + 46, 52, -24, 28, -10, 98, 49, 89, -42, 62, + 19, -80, 54, -59, -51, 18, 44, -29, 110, 80, + -5, 81, 24, -7, -32, -20, 0, 10, -31, -79, + 4, -18, -58, -92, -32, 124, 59, -50, -17, -14, + -79, 77, 53, -18, 7, 58, 10, -53, 29, -51, + 74, -81, 1, 56, 84, -48, 7, 40, 70, -88, + -30, 101, -66, -2, 21, 23, -53, 29, -29, 62, + -59, -59, -73, -44, -19, 61, 29, -60, -84, 53, + 37, -126, 71, 38, -68, -84, -6, -100, -102, -103, + -43, 31, 42, -55, -6, -14, -2, -54, 25, 48, + -6, 44, 49, 34, 15, -54, 75, -70, -71, -127, + -17, 65, -37, 46, -6, -35, -49, -15, 72, 25, + -113, -35, -66, -56, 48, -71, 64, -65, -24, 54, + -35, -107, -53, 104, -36, -17, 16, -3, -23, 60, + -59, -22, 45, -26, 54, -67, 40, -36, -4, -16, + 34, 50, 25, 8, 0, 51, 28, 99, 84, 52, + 45, 10, -110, 5, 25, -63, 94, 30, 61, -90, + 34, -51, 40, -33, -3, -1, 65, 34, 8, 52, + -21, 22, 10, -76, -111, 88, 5, 61, 68, -2, + -11, 54, 29, 6, -69, 12, 45, 13, -39, 32, + -42, -73, 64, 4, -2, -81, -41, -16, 29, -80, + 102, -65, 68, 47, 22, -15, -111, 41, 12, -40, + 60, 52, -25, 26, -16, 26, -19, -20, 66, 49, + -80, -11, -83, -70, 62, -23, -92, 23, -54, -28, + -23, -84, -29, -41, 42, 37, -69, -56, 36, 21, + 49, -34, -8, 25, 89, 45, -17, -28, 49, 43, + 46, 127, 63, 0, -31, 61, -12, 15, -47, -27, + 53, -26, -8, 54, 13, -52, 94, 84, 40, -2, + -54, -10, -58, 20, -49, -11, -8, -55, 25, 20, + 60, 15, -19, 63, 42, -32, -19, 50, -21, -20, + -80, -41, 45, -55, 88, -94, 115, -76, -85, -35, + 66, 80, -73, 127, 34, 43, -90, -34, -69, 39, + -52, 1, 85, -50, 36, 51, -40, -50, 36, 70, + 80, 24, 5, -12, 34, 36, 95, -34, -15, -70, + 8, -60, -39, 68, 98, -90, 48, -13, 38, -59, + 6, -12, -5, -1, -29, -38, -37, -96, 53, -10, + -44, -59, -13, -78, -25, 46, -98, 1, 9, -73, + 20, 21, 15, 77, -15, -89, 72, 28, 10, 35, + -22, 35, -33, 19, 3, -96, 45, 11, -2, -50, + 20, 4, 44, -87, 10, 113, 11, 79, -41, -45, + 48, 77, 78, -29, -25, -45, -39, 4, -60, 2, + -79, 35, -84, -112, 52, 49, -27, -18, -127, -73, + -11, -61, -17, 12, 3, 28, 22, -41, -47, -58, + -32, 32, -40, -99, 10, -35, 7, 13, 46, -50, + 51, 96, -7, 57, -40, 30, 26, 127, 58, -54, + -58, 24, -97, 80, 38, 11, -67, 32, -84, 0, + 48, -51, -11, -64, -78, 12, -72, 32, -31, 0, + 5, 17, 2, 20, 56, 3, 43, 26, 41, -93, + -2, 3, -28, 43, 0, -16, 14, -39, 50, 61, + -33, -96, -21, 57, -57, -64, -78, 17, -118, 21, + -26, 35, -18, -56, -17, -64, 56, 41, 107, 1, + 82, 57, -48, 15, -30, 16, 39, -37, -87, 61, + 61, 21, 123, 64, -79, -8, 26, 43, -47, -68, + 53, 52, -43, 69, 80, -29, -57, -30, 113, 41, + -60, -5, 40, -62, 93, 31, 67, 116, 38, -59, + -54, -94, -72, -65, 101, -85, -31, 28, 15, -75, + 71, -20, -1, 63, 6, 1, 10, -63, 40, -9, + -58, 23, -40, -6, -21, 83, -14, 103, -25, -58, + 79, 76, 13, 106, 79, 29, -127, -68, -15, 23, + 65, 36, 55, 39, 33, 84, 5, -15, -31, 60, + 9, 53, 24, -11, 0, -54, 28, -62, -37, 44, + 35, -24, 27, 45, 49, -62, -19, -68, -41, 61, + -106, 49, 70, 37, 42, 32, -105, 79, 16, 9, + -54, -47, -2, -35, -127, -59, -73, -52, -29, -117, + -43, 0, 5, 68, -84, 64, -21, -15, 4, -104, + -27, -53, -71, -65, -74, -76, 55, 31, 0, 6, + -11, 17, 13, -16, 76, -23, 65, 27, -86, -42, + 50, 50, 85, 108, 45, -34, -8, 16, -19, -35, + 116, -7, 33, -15, 64, 56, 0, 47, -48, 92, + 9, -25, -25, -40, 41, -47, 86, -127, 65, -59, + -36, -69, 31, 13, -26, -54, 33, 43, -19, -4, + -44, 94, 68, -84, 22, 37, 14, -14, 56, -60, + 72, -44, -18, -29, -18, -61, -40, -24, 48, 68, + -4, -52, -29, 26, 41, 11, -69, -43, 2, -82, + 20, 27, -68, -25, -64, 31, 31, -110, -41, -56, + -59, -56, 2, -40, -21, 11, -2, -101, -127, -37, + -13, 32, 53, -76, 120, 39, -5, 51, 3, -48, + -64, 79, 83, 7, 86, 72, 69, -39, -13, -42, + -32, -27, -51, 70, -8, -61, 29, 18, -16, 98, + 42, -59, -42, -3, -40, 64, 25, -14, -71, 5, + -9, -1, 2, -73, 50, 45, 69, 7, -33, -40, + 29, -1, -41, -50, -87, -41, 84, -30, 22, 82, + -5, 46, -62, -72, -72, 18, -73, -22, 24, -37, + -15, -13, -39, 35, -70, -1, 37, 89, 49, 55, + -64, -26, 38, 37, -52, 16, -127, 52, 90, -7, + 100, 69, -104, 2, 82, -9, 34, -65, 52, 35, + -38, -4, -31, 57, -57, -37, -73, -4, 64, 8, + 1, 13, -39, -41, -64, -30, -73, 5, -100, -50, + -29, -42, 87, -29, -88, 88, -13, -26, 88, 104, + 78, 49, 37, 87, 18, -67, 63, -21, -20, 44, + 6, -59, -93, -9, 3, 67, -1, 70, -22, 42, + 75, -59, 87, 55, 15, 42, -25, -94, -69, 20, + 26, 52, +}; +const TfArray<1, int> tensor_dimension37 = { 1, { 3072 } }; +const ALIGN(8) int32_t tensor_data38[96] = { + -177639, -952993, -403778, 3767096, 448477, -508262, 1911211, -1302554, 1921939, 1952602, + 1862289, 1520078, 1837951, 1671623, 2287375, 1698326, -3386096, -80069, 1188382, 2067801, + 1069417, 2698279, 79916, 1029536, 1121068, 2112320, 1996876, 2591194, 2191122, 3205187, + 1260233, 2212349, -1537886, -77408, -201181, 636560, 663760, -4111, 288177, 1069068, + 1863372, 2663844, 1932303, 1695467, 1578351, 1848210, 1845632, 1136260, -598494, -2662413, + 968471, -822776, -31572, 1453023, 1661792, 882483, 2188236, 1883016, 2848242, 1826267, + 2229855, 1302231, 2097089, 2737236, 1331245, 661925, 18538, 1269270, -571302, 3032983, + 1779749, -2417392, 2018405, 1870584, 1586268, 2358145, 1853900, 2273708, 1850200, 1588621, + -464679, 1714815, -765568, 1361083, -3313518, 2222090, -1591518, 610654, 2519657, 2303062, + 1501778, 1988225, 1963202, 2579379, 2355358, 1933949, +}; +const TfArray<1, int> tensor_dimension38 = { 1, { 96 } }; +const ALIGN(8) int8_t tensor_data39[7680] = { + -42, -59, 77, 82, 54, -71, 55, 0, 42, 53, + 64, -61, -35, 55, -50, -92, -6, -8, -21, -19, + 29, -44, 10, -6, 55, -19, -42, 32, 0, 46, + 34, -24, 6, -108, -76, 29, -64, -116, -59, 35, + -87, -54, -127, 40, 20, 10, -40, -63, -3, 53, + -33, -82, -98, -67, 76, 44, -20, 29, 70, 24, + 50, -10, 102, 9, 38, 25, 69, -1, 47, 44, + 38, -42, -49, 73, -41, -60, -21, 84, 67, 84, + -8, -17, -78, 25, -44, 29, -66, -10, 8, 64, + -6, 16, 21, 7, 5, 46, -127, -52, -19, 24, + 8, 54, 67, -48, 33, -44, 73, 75, -47, -21, + -70, 28, -78, 6, -29, 12, -21, 6, 50, -39, + -10, -28, -11, -35, 20, 8, 33, -22, -67, -93, + -95, -23, 105, 50, 53, -60, -7, 9, 34, -30, + -72, -21, -44, 88, -31, -39, -17, -25, -20, 16, + -127, 24, -21, -53, -14, 20, -25, -1, -18, -73, + 27, -31, -85, 32, 97, 48, -29, -69, -65, 31, + -19, 112, -27, -88, -111, 24, -32, -5, 63, -43, + 44, 9, 3, -73, -9, 36, -5, -21, -22, -30, + 20, -47, -36, 19, -52, 67, -42, -25, 32, -30, + 9, 81, 10, 26, -5, 57, 63, 22, 24, -27, + 14, 55, -43, -34, 0, -32, -2, 18, -26, 7, + 69, -12, -33, 35, -35, 43, 9, 11, -1, 34, + -19, -28, 68, 30, 19, -34, -13, -38, -37, -14, + 93, 53, -46, 46, -72, -40, 57, -39, 82, 64, + 47, -18, -13, 56, 38, 8, -58, -78, -54, -22, + -6, 100, -8, -92, 2, -27, -31, 45, -4, 65, + -40, -19, -37, -16, 13, -22, -36, 13, 46, -37, + -19, 18, 46, 14, 50, 45, 39, -40, -29, 41, + -17, 17, -62, -110, -20, -107, -95, 79, -51, -82, + -67, 0, -87, 21, 118, -47, 62, -89, 37, 39, + 35, 92, 37, 74, -54, -68, 23, -42, 43, 94, + -56, 44, -35, 4, 52, 73, 48, -48, 51, -20, + -16, 3, 47, -17, -20, 38, -13, 10, 59, -46, + -51, 11, -26, 13, 11, 23, -31, 22, 46, -27, + -28, -19, -25, 15, -27, -14, 14, -49, -41, -19, + -81, -44, -20, 41, -22, -50, 9, 47, -60, -79, + 11, -54, -31, -24, 7, -67, -55, -3, -73, -66, + -46, -30, -67, -14, -32, 27, -33, -40, -121, -39, + 77, -43, -97, -72, 14, -9, -36, -58, 46, 90, + 33, -7, -5, 9, -55, -45, 32, -15, -72, -24, + -8, -27, -59, -9, -1, -12, -1, 100, 46, 31, + -5, -3, 44, -1, -28, -41, 60, 86, -47, -12, + -15, -12, 42, -59, 12, -48, 25, -18, -7, -41, + 19, -7, 15, -8, 18, -42, -15, 16, 54, -3, + -18, -19, 16, 15, -36, 83, -26, 26, -35, -11, + -82, 40, -42, 82, -55, 14, 1, 61, -53, 81, + 12, -3, 2, -7, -22, -14, -61, -11, -12, -25, + 10, -5, -6, -8, 46, 0, -64, 18, 53, -23, + 17, -31, 22, -11, 29, 55, 59, -35, 22, -45, + 32, 106, 127, 99, 42, 16, -27, 19, 6, 29, + -5, 47, -53, 30, 34, -27, -22, -67, 93, 74, + 47, -30, -27, 61, -26, 74, -64, -32, -38, 47, + -42, 23, -3, 15, 58, -48, 0, 73, 20, 10, + -74, 35, 6, 54, -35, -35, 44, 5, -116, 63, + 21, -47, 18, 0, 72, 43, -95, -56, 78, 76, + -11, -92, 51, -8, -5, -127, 22, 34, 61, 69, + 68, -47, 103, -43, 115, 50, -11, 2, 44, -56, + -8, 9, -80, 75, -1, -89, -15, -6, 70, 10, + -94, -23, -35, -4, 44, 27, -18, 7, 4, -13, + -21, 45, -21, -7, 2, 36, -16, 4, 35, 70, + -57, 55, 79, 3, 100, 6, -19, 72, 42, 11, + -88, -48, -29, 59, -49, 75, -25, 33, 39, -67, + 34, -62, -53, 0, -24, -63, 15, 34, 17, 70, + -31, 44, -33, 28, 58, 56, 65, -20, 82, -70, + 16, 72, -47, -57, -66, 7, 20, 10, 4, -60, + -11, 57, -91, -73, -48, -1, 0, -26, -5, -23, + 43, -14, -28, -28, 17, -115, 122, 127, 1, -97, + -126, -20, 36, -38, -48, -56, 4, -24, 61, -26, + 51, -39, -42, -77, -47, 33, -29, -24, -19, -36, + -34, 5, -11, -30, -26, -5, -66, 56, -3, -44, + 5, 41, -37, 20, 27, 47, -47, 88, -2, 33, + -14, -29, -36, 38, -41, -62, -49, -2, 29, -86, + 3, 45, 20, -5, -61, 16, 43, 5, -15, 1, + -21, -39, 16, -20, 25, 40, -4, 62, -15, -70, + -60, -24, -6, 61, 52, 44, 6, 32, -4, 35, + -47, 23, 61, -12, 100, 91, 48, -44, -101, -39, + -1, 27, 41, -10, -60, -54, -39, 24, 22, 30, + 94, -50, 84, -18, 15, -17, -15, -23, -26, 2, + -72, -11, 41, -4, -14, 39, 57, 22, 14, -10, + 12, 30, 54, 60, 2, -61, -51, -33, 4, 43, + -35, 54, 38, 65, 27, 1, 107, -52, 81, -36, + 11, 32, 71, 85, -51, 82, -70, -16, 4, -72, + -24, 28, 51, 31, -3, -41, -70, 116, 21, -27, + -85, 49, -28, 38, -12, 8, 38, -54, 1, -52, + 51, -38, 17, 40, 58, 68, 18, -55, 33, -32, + -69, -17, -32, 34, -93, 60, -47, -48, 1, -33, + -75, -3, 33, 68, 95, 97, -89, -28, 60, 74, + -2, -27, 48, -17, -2, 92, -10, 10, -36, 13, + 7, -32, -22, -34, -50, -10, 12, -30, -11, 23, + -36, -40, -60, -32, -16, 0, -81, 49, -67, -37, + -13, -80, -4, -24, 9, 56, 24, -46, -48, 7, + 13, -16, -37, 62, -19, 20, 25, -61, -28, 63, + 88, 75, 54, 30, -59, -40, -45, 26, -18, -8, + 56, 51, -49, 40, 42, -62, -7, -5, 9, -6, + -44, 0, 0, -69, -2, -22, 9, -27, 9, 8, + 5, -31, 62, 4, 28, 41, -5, 107, -22, 23, + -28, -39, -14, -26, 32, -32, 6, 53, -25, 1, + -36, 39, -43, -37, 47, 43, -76, 32, 38, 29, + 69, 13, -45, 50, -62, 53, 30, -91, -45, -47, + -38, -47, 50, 38, -21, -90, -69, 36, 38, -7, + 72, 26, -15, 47, -2, 68, 55, -4, 38, -51, + -34, -48, -120, -42, -29, -51, 17, -2, 42, 77, + 67, 80, 42, 6, -77, 72, 6, -9, 64, 46, + 57, -46, -28, -7, -60, -32, 8, -89, 10, 35, + -14, -50, 42, 25, -8, -54, 101, 14, -54, 87, + -76, 36, 9, 7, -19, 5, -91, 0, -13, 54, + 42, -74, -47, -26, -56, -18, 50, -75, -43, 29, + -46, -29, -27, -28, 40, -82, 38, -59, -20, 5, + -29, -14, 65, 54, 78, 51, 8, -37, 64, -33, + 18, 50, -14, -45, 39, -4, -7, -17, 61, 10, + 18, 1, -56, 10, 36, -16, 70, -62, 65, -58, + 70, -27, -28, -12, 77, -29, -19, -38, -28, -23, + -45, 9, 13, -3, 8, 3, 55, -73, -32, 107, + 24, -46, 42, -13, 1, -22, 28, -9, 8, 34, + -20, 12, 32, -2, 12, -99, 75, 63, -2, -30, + -56, 23, 78, -81, -54, -46, 2, 6, 19, 13, + 49, -46, 13, 12, -47, -75, -23, 31, 26, -12, + -60, 52, -27, -61, 87, -53, 79, 110, 118, 39, + -38, -51, -45, 54, 6, 58, 4, 14, -107, -14, + 21, 19, -1, -93, -6, -28, 0, 48, -21, 25, + -52, -5, -5, 19, -12, -65, 4, -62, 21, 44, + -9, -62, -10, 2, -40, 4, -15, 22, 4, 51, + 64, 18, 36, 69, -61, 85, 66, 49, 68, 7, + -53, -40, 62, 7, -67, 11, -48, -15, -4, 31, + 34, -55, 5, 16, -58, -54, -63, 37, 66, 41, + -45, 32, -12, -59, -26, 84, -68, 45, -88, -72, + 42, -18, 7, 97, 26, -5, 24, 45, -40, 17, + -60, 11, 29, 90, 28, -60, -119, -38, 23, 77, + -70, -1, 16, 61, 9, 74, 12, -12, 0, -4, + -10, -35, -45, 23, 50, -35, 40, 41, -7, -14, + -35, 55, 41, -30, 27, -78, 20, -58, 20, -43, + 17, -37, -34, -60, 36, 52, -45, -3, 74, 9, + 91, -51, 7, -70, -15, 63, -45, 0, -17, 36, + 68, 2, 47, -33, -94, 69, -11, -63, 18, 9, + 29, 6, -71, 38, -43, -43, -10, -31, 58, -46, + 9, -19, 41, 10, -64, -86, 30, 6, 58, -19, + 53, 39, 27, 10, -38, 11, 20, 8, -41, -1, + 38, -48, -54, 28, -8, -41, -20, 3, 27, -35, + 43, 91, -24, 20, 63, 28, -66, 9, -40, -4, + 26, -3, 54, -34, -7, 4, -72, -15, -69, 11, + -61, -59, -41, -42, -48, 58, 22, 28, -19, -88, + -41, 79, -19, -22, -10, -13, -32, 29, 18, 38, + -25, -12, 18, -27, 27, 38, -29, -2, 39, 24, + -20, -81, -14, -47, 94, 50, -42, -31, 20, 31, + 99, 32, 19, -80, 54, 102, 22, -42, -21, -57, + 27, -4, 1, 37, 31, -42, -14, -37, 36, -2, + -5, 49, 31, 43, -16, -29, 30, -48, 55, 97, + 16, 29, 40, 24, -42, 44, -40, -39, -39, -34, + -23, 10, -41, 82, 10, -12, 93, 56, 83, 15, + 33, 39, 18, 26, -15, 48, 58, -17, 44, -43, + 29, -47, -34, 44, -83, 36, 22, -31, 33, 9, + 18, -66, 92, 1, 5, -57, 17, 53, 73, -34, + 21, 24, -75, 7, -8, 11, -44, -7, -42, 32, + 111, -5, -61, 17, -6, -40, 32, -72, 5, 80, + 64, 60, -48, 48, 54, -78, -15, -74, -58, -59, + 29, -50, 23, 2, 9, -19, 22, -53, -46, -36, + -27, -56, -37, 12, 68, -21, -24, -39, -20, 53, + 89, 112, 77, -49, 71, -68, -37, -80, -65, -17, + 96, 52, 50, -122, -16, -23, -31, -56, 30, 50, + 32, 63, -23, 33, 35, 43, 35, 2, 25, 55, + -43, -51, -127, -83, -74, 93, -109, -94, -24, 26, + -127, -56, -73, 2, 22, -27, -32, -23, -37, 4, + -70, 2, -12, -44, 77, -53, -31, -27, 9, 80, + 44, -59, -26, -24, 55, -47, 41, -32, 19, -26, + -65, 127, 103, -111, 88, -93, -6, -37, 46, 31, + 92, 98, 61, 14, 58, 43, 36, 27, 3, -53, + -25, -12, -127, 30, -59, -1, -82, 15, -40, -64, + -7, 14, -4, -17, 18, -41, -32, -20, -48, 55, + 61, -7, -86, -57, -6, -19, -115, 61, 42, -4, + -102, -24, 45, -11, 85, 40, 73, -41, 58, 66, + -24, 3, -14, -5, 31, -20, -48, 3, 4, -15, + 18, 30, 28, -40, 15, 14, 21, 7, -39, -9, + -70, 41, 35, 24, 33, 3, -71, -15, -1, 18, + -16, 61, -1, 16, -47, -97, -72, 75, -15, 22, + -48, -15, -66, -46, -53, -23, 57, 77, -43, -7, + 37, 72, -28, -28, 1, 42, 102, -32, 49, 87, + 85, -17, -45, 70, 8, -62, 73, -84, 86, 80, + -2, 16, -57, -57, 6, 62, 28, -70, 7, 17, + -71, 67, -35, 47, -60, 7, 11, 24, -38, -10, + 7, -14, -6, 22, -68, -11, 64, 80, -28, -127, + 28, -20, 30, -10, -37, 19, -11, -43, -4, -21, + -9, 13, 5, -22, 80, 47, -35, -5, -56, 18, + -7, 30, 0, -28, 10, -84, -53, 26, 33, -21, + -36, -120, 58, -96, -12, -69, 18, -17, -36, 4, + 38, 25, 16, -29, -63, -16, 39, 43, 48, -13, + -18, -59, -93, -1, -20, 2, -29, 58, -80, -50, + 0, 70, -17, 3, -65, -61, -31, -18, -42, -66, + -60, 26, -29, -72, -52, -59, -8, -66, 31, -87, + 55, -14, 38, 42, -63, -67, -31, 25, 10, -52, + 14, 27, 64, 51, -22, -5, 71, -71, 25, 95, + 40, 72, 58, 25, 1, -72, -65, -11, -3, -32, + -91, -31, -97, -59, -28, -57, -49, 21, -17, -67, + -86, -2, -48, 15, -27, 34, -4, -66, 28, -35, + 25, -7, -50, -1, -31, -19, -24, -31, 12, -1, + -75, 24, -70, -23, -76, -38, -48, 67, 0, -19, + -9, 35, -94, 39, -37, 54, -27, -24, 21, -5, + 59, -78, 20, -24, -53, 1, 33, -9, -31, -68, + 95, -41, 21, 1, -24, 23, 26, -45, 68, 11, + 43, 127, 61, -8, 27, -18, -54, 12, -35, -29, + 45, 28, 41, 13, -39, 4, 30, 1, 112, -6, + 8, -56, -71, -74, -8, -127, -10, 47, -17, 8, + 6, 36, 4, -29, -5, -50, -24, -48, -49, -27, + 79, 10, 12, -84, 23, -82, 37, -23, -25, 19, + 20, 19, 26, 0, -87, 49, 40, -16, -67, -1, + -46, -86, 93, 29, -34, 11, -127, 114, 7, 69, + 24, 8, 85, 75, 61, 18, 30, 1, -20, -25, + -25, -5, 17, -54, 10, -3, -66, -43, 25, -63, + -9, -54, -35, -10, 22, 32, 9, 79, -31, -73, + 33, -67, 31, 64, 64, -10, 60, -119, -29, -9, + -120, -91, 4, 91, 120, -6, -86, 14, 14, -95, + -84, -39, 87, 7, 66, 29, -46, -62, -46, 43, + -117, -102, -46, 50, 56, -76, 70, -90, -51, -21, + -13, 7, 60, -61, -26, -62, 15, -24, -24, 0, + -55, -48, 5, 9, 15, -12, 19, -35, 4, -4, + 40, 23, 47, -51, -9, -48, 46, -15, 38, -41, + -16, -51, -91, 123, 52, -66, 2, -40, -1, 51, + 42, 46, 50, 18, 21, -6, -37, -12, 34, -93, + 22, -87, -29, -63, -64, 47, 28, -13, -42, 9, + 34, 2, 17, 13, 17, -21, -3, -34, 41, -49, + 19, -9, 21, -49, -11, -47, 19, -2, -57, -11, + 37, 105, -90, -11, -70, -106, -12, 50, 73, -49, + -45, -9, 29, 31, 67, -20, 25, -14, 33, -127, + -15, 29, 46, -4, 21, -50, -46, -13, -2, 37, + -47, -18, -28, 76, -39, -19, -38, -15, -34, 21, + -66, -40, -10, 39, 15, 5, -45, -19, -82, 15, + 44, -18, -19, -18, -10, 46, 29, -69, 42, 104, + 4, 16, 127, 67, 43, 31, 23, -61, -4, -61, + -27, 27, 81, -69, 10, -15, -3, 94, 6, 76, + 111, 54, 1, -86, 31, 71, -51, -7, -45, -35, + 64, 48, 14, 29, 28, 46, 75, 72, 46, -82, + 15, 47, 42, 54, 54, -23, -32, -26, 39, 71, + -24, -95, 2, -55, -7, 5, 28, 33, 26, -8, + 18, -20, 20, -26, -30, -15, 24, 1, -45, 5, + -19, 74, -37, -34, 91, 75, 1, -88, 35, 60, + 43, -105, 48, 29, 42, -49, -45, 60, 49, -86, + -57, 91, 66, -43, 122, -7, 78, -31, 21, 48, + -19, -22, -35, 42, 52, -23, -56, -4, 3, 61, + 5, 46, -2, -3, 16, -24, -62, -67, -62, -56, + -42, 11, -65, 25, -14, -24, -29, -81, -33, -13, + 38, -62, 28, -77, 41, -19, 16, 51, -58, 48, + 20, 34, 18, 11, -8, -47, -67, -18, -9, -6, + -63, 66, -53, 26, 73, -76, -42, 12, -77, -70, + 48, -4, -112, 44, 50, -68, -31, -16, -73, 34, + -11, -16, -9, -8, -24, 54, -21, -66, -11, -77, + 38, -2, 65, 17, 28, 0, -23, -33, 23, -23, + -11, -41, -60, 57, -21, -69, 38, -105, 80, 44, + 2, 55, 59, 66, 10, -50, -13, -69, -5, 58, + 47, -22, -2, -40, -27, -33, -23, 21, 3, -13, + -19, 16, -5, -44, -39, 44, -27, -17, -15, 49, + 18, -54, 4, 74, 35, -19, 41, -39, 15, -33, + -6, -4, -77, -21, -17, -61, -68, 58, 1, 53, + 21, 30, -47, -11, 5, 1, 53, -20, 48, -61, + 9, -74, 63, -24, -36, -31, -11, -2, -37, -51, + 52, -76, -48, 101, 6, -29, 56, 50, 23, 89, + -4, -26, -41, 110, 50, 60, -17, -42, 54, 24, + -37, 8, -19, 84, 58, -6, -13, 19, -102, 13, + -58, -2, -89, 26, 31, 87, -46, -19, -9, -85, + -40, -57, 0, -32, 39, -114, -53, -61, 1, 12, + 5, -97, 50, -29, 9, 10, 94, -91, -61, 55, + 50, -35, 37, 43, 108, 80, 58, -86, 70, 20, + 38, -27, -88, -37, 52, 24, 35, 25, 14, 46, + 50, 30, 38, 46, -26, 24, 18, 0, 9, 37, + -39, -16, -52, -77, -46, -8, 76, -35, -29, 14, + 44, -40, 28, 32, 10, -16, 0, 18, -54, -18, + 33, 127, -15, 75, -52, 14, 36, -95, -20, -30, + -50, 59, 20, 61, -27, -47, -63, 88, 20, 36, + -33, -48, -21, 1, -38, 11, -69, -14, 3, 85, + -27, -27, -24, -22, 12, 19, 48, 11, -23, -41, + -54, 0, -55, -22, 36, -56, -3, -48, -4, 30, + -115, -41, -67, -24, -33, 7, -82, 6, 47, 47, + 47, 27, -56, 30, 73, 46, -28, 105, 64, 107, + 83, -44, 57, -6, -80, -15, -24, -1, 111, -32, + 14, 36, -36, 3, 72, 3, -35, 20, 3, -14, + -38, 15, -86, -51, 23, -26, -20, 32, -6, 36, + -9, -33, -19, -19, 56, 3, -28, -13, -55, 47, + -4, -65, -16, -27, 32, -38, 16, -31, 50, -36, + -30, 72, 16, 27, 29, 16, 99, 8, -61, 75, + 95, 10, -80, 19, -40, -95, -76, -12, -81, -43, + -30, -14, 45, -48, 28, -43, -90, 59, -92, 16, + -19, -40, 21, -84, 0, 3, -31, 1, -79, -3, + -44, 6, 15, 12, -14, 48, -11, 56, -41, -34, + -40, -70, -82, -127, 105, -14, 4, 71, 41, 23, + -44, -85, -53, -37, -54, -35, -77, 7, 21, -22, + -84, -61, -42, -127, -34, 6, -111, 25, 33, -62, + -2, -23, -39, 35, -35, -71, -67, -15, 6, 32, + 48, 35, 86, -76, -3, 42, 23, 14, 17, 40, + -19, 11, -120, 18, -2, -10, -11, -35, 49, -6, + -29, 57, 57, 42, 4, 11, 47, -35, -29, 6, + 55, -31, 42, 26, -52, -28, -29, 63, -66, 114, + 24, -38, 12, -51, 81, -59, 39, 57, 5, 46, + 87, -112, -6, 16, 57, 79, -48, 33, 9, 30, + 14, 50, 69, -5, 79, -30, 52, -14, 63, -43, + 72, -45, 94, 37, 21, 127, 18, 48, -52, -36, + -36, 35, 7, 2, 19, -27, 14, 46, -51, -74, + -27, 12, -22, 51, 7, 49, 12, 54, 38, 17, + 91, 78, -54, -10, -27, -6, 60, 67, -71, -15, + 45, -9, -24, -27, -19, 44, 35, -2, -36, -6, + 93, 6, -8, -56, 35, -15, -13, 8, 24, -40, + 42, -47, 37, 1, -17, 13, 39, 17, 29, 47, + -22, 27, 26, -16, 30, -31, -20, -27, 53, 83, + -18, 26, -6, 38, -39, -58, -29, 28, 53, 78, + -5, 48, 30, -41, -58, 13, 6, -18, -38, 28, + -86, -86, 70, 31, 39, 64, 79, 9, 25, -68, + -100, -53, -5, 26, -15, -45, -25, -17, -7, 0, + -65, 22, -34, -43, 41, -59, -70, 54, -60, 40, + -68, -53, -52, -80, 81, 3, 16, 34, -6, 60, + -64, -76, 38, 18, 22, 30, 32, 25, -4, -2, + -100, -26, -71, -38, -30, -46, -30, 99, 23, 74, + 108, -37, -79, 21, -10, -4, 89, 55, -1, -61, + 15, -70, 66, 59, -111, 45, -8, 93, -12, 34, + 94, 12, 87, -44, 116, 31, -32, 66, -23, -33, + -13, 15, -1, 8, -24, 61, -29, 51, -120, -94, + 62, 39, 20, -12, -9, 68, -34, -46, -29, -86, + -55, -24, -25, 66, -38, -23, -63, -67, -44, 72, + 33, -38, -44, -70, -72, -55, -19, 19, -34, -27, + -79, -62, -20, 32, 8, -10, -24, -90, -1, 16, + -78, 7, -60, 70, 45, -27, -10, -11, 1, 40, + -62, -23, -44, -46, 31, -63, -50, -100, -65, -10, + 45, 37, 70, -14, 1, -45, 60, 17, -26, 1, + 10, -36, 77, -15, 24, 40, 73, -12, -127, 42, + -37, 8, -6, -42, -12, 85, -58, 13, -60, 2, + -47, 75, -35, -29, 11, -59, 37, 46, 107, 0, + 51, -17, 8, -41, 40, 2, -39, -4, 36, -17, + 54, -46, 10, -60, 11, 27, 86, -7, -40, -28, + 21, 59, -4, -29, -19, 13, 16, 61, 6, 34, + -76, -39, -40, -52, -15, -19, -46, 34, -16, -21, + 57, -56, -31, 21, -85, -15, -43, 50, -42, 55, + -6, 78, -7, 37, 56, 39, 53, -58, -53, -30, + 42, 109, 18, 33, -122, 66, -20, 52, 66, 11, + 1, 23, 50, -8, -55, 75, -31, -39, 30, 16, + -25, 72, -11, 48, 27, -90, -55, 95, 32, -84, + -42, 59, -36, 12, 65, -6, -28, -19, -27, 91, + -5, 104, -9, -23, -12, -42, -45, -45, 10, -39, + 36, 67, 54, 14, -57, -42, -25, 12, 8, 88, + 30, 27, 10, -16, 64, -22, 80, 48, -17, 23, + -5, -44, 6, -65, -59, 127, -23, -105, 25, -74, + 20, -53, 30, -66, -13, -51, 4, 33, -85, -9, + -8, -15, 19, -34, -63, -5, 31, 50, -22, -5, + -42, 16, 75, -9, -10, -16, 48, 44, 26, -92, + -20, 25, -19, 35, 44, -23, 12, -19, 56, 61, + -49, 51, -49, -2, -54, -75, -36, -19, -28, -56, + 56, 17, 57, -8, -9, 33, 56, 7, -59, -34, + -80, 2, 31, -15, -81, -31, -11, 46, -1, 63, + 88, -45, 18, 32, 44, 26, 34, 14, 0, 30, + -40, -38, 77, -1, 32, -80, 25, -16, -25, 6, + -22, -41, -30, 59, 7, 43, -8, 7, -26, -12, + -52, -34, 60, 90, -5, 39, 46, 86, 53, -40, + -45, -7, 100, -20, -48, -33, 9, 64, -35, -24, + -8, -50, -36, -25, 21, 21, -95, -31, 19, -8, + 78, 10, 10, 23, -11, 8, 7, -38, -53, 15, + -30, -5, -66, 9, -27, -34, -54, -46, -25, 5, + -37, 54, -24, 4, -13, -1, 43, 30, -23, 64, + 51, -25, 28, 4, -53, -25, -9, -54, -24, 65, + 24, 73, -46, -6, -20, 29, 25, 77, -35, 23, + 9, -70, -71, 33, -8, -10, -101, -75, -33, 15, + -38, 45, 112, -3, -42, 56, 15, 27, -24, 50, + -34, 30, -38, 54, -67, 51, 51, 47, 81, 22, + -12, -2, -41, 33, -60, -67, -20, -93, -105, 46, + -28, 104, -24, 41, -65, -40, 78, 31, 41, -1, + -53, 9, 9, 38, 12, 8, 46, 57, 23, -27, + -43, 43, 12, 59, -4, -59, 7, -12, -94, 56, + 24, 0, 114, -95, 47, 77, 40, -97, -113, 29, + -16, 45, -25, -6, 32, 54, 25, 6, 83, -50, + 2, -4, 19, 35, -8, 24, 41, -8, 5, -6, + -108, 5, 67, 53, 32, -69, 8, -22, 127, -38, + -39, 6, 35, 21, -80, -17, -50, -67, 11, -13, + 9, -43, -78, -36, -49, 3, 31, 11, -12, -26, + 9, 17, -57, 102, 65, -33, 57, -80, -35, 46, + -24, -78, -1, 52, -9, 31, -13, -36, 9, -62, + -6, -29, -24, -22, 12, -9, 11, -33, 42, -23, + -16, -44, -18, -31, 56, -68, -3, -10, -10, -82, + -105, 50, 42, -18, 26, -29, 62, 61, 102, -59, + 76, -125, 83, 35, -62, 44, -45, -38, -77, -34, + 44, -6, -21, 1, 36, 8, -25, 29, -12, 26, + -21, -88, 99, 32, 35, -19, -2, -43, 41, -66, + -13, 9, -16, 25, 60, 56, -22, -31, -51, 5, + 34, -64, -39, 4, 46, 6, -5, 29, 22, -30, + -10, 10, -69, -12, -15, 7, 20, 26, -42, -80, + -60, -14, 6, 106, 17, 49, 31, 15, 28, -25, + 75, -14, 32, 27, 54, 6, -32, 69, -42, 89, + -47, 2, 58, 17, 47, 14, -38, 3, 52, 76, + -32, 61, 68, 51, 33, 99, 1, 14, 9, 11, + 0, -40, 16, 33, 1, 48, 4, -24, 34, -12, + 7, 60, -48, 33, -32, -65, -1, 45, -14, -1, + -90, -49, 12, 59, 18, -57, 36, -24, 23, -25, + -11, 50, 36, -15, 57, 63, 15, 40, 66, 50, + -10, 11, -70, 52, -62, 29, -27, -16, -6, -19, + -49, -36, 73, 88, -40, -49, 34, 92, 45, -40, + -20, -23, -48, -67, 13, -21, 80, 30, 26, -10, + 23, -28, 53, -47, -18, -61, -25, -28, 57, 89, + 9, 56, 35, 105, 12, 77, -42, -74, 9, 50, + -12, 71, -57, 61, -36, -25, -41, -37, -25, -26, + -31, 60, -109, 65, 13, -28, 42, -10, -41, 35, + -46, 64, -83, 51, 13, -33, -22, -25, 21, 24, + 61, 96, -27, 2, 33, 14, 35, 46, 12, 37, + 16, 58, -12, 35, 1, -1, 15, -76, -37, 29, + 20, -69, -16, -71, -69, -15, 52, -33, 51, 22, + -2, 42, -4, 66, 101, -31, -21, 43, -47, -45, + -56, 13, -53, -13, -20, 48, 40, 53, 10, 72, + 6, -19, -17, -4, 15, -9, -14, 53, -22, 12, + -12, -33, -31, 51, 40, 33, -28, 29, -39, -53, + 37, -72, -40, -41, 43, 56, -17, 50, -57, 10, + 14, -24, -7, -56, 53, -43, 26, 29, 27, -7, + -4, -34, 34, 56, -3, 64, -5, 20, -39, -45, + 8, 18, -87, -32, -31, 49, 28, 82, 30, 76, + -61, -70, 11, 34, -74, -33, -17, 59, 20, 35, + -60, -10, 34, -8, 15, -24, 67, 127, 35, 95, + -43, 20, -9, -23, 57, 10, -54, -36, 24, -47, + -33, 0, -127, -10, -65, -47, -42, -9, 7, 15, + -19, -18, 18, 81, -15, -59, 38, -50, 29, -55, + -88, -43, -15, -3, -37, 80, 15, 32, 5, 41, + 28, -31, -16, -47, -26, -16, 16, -35, -17, -76, + 44, -25, 60, 75, 9, -81, -5, -51, 47, -7, + -25, 15, 66, 7, -53, -66, -51, -91, -27, 40, + -86, 1, -41, 40, 12, 10, -13, 9, -15, 14, + -17, -50, 12, 89, 14, -5, 14, 54, 40, 30, + -72, -34, 56, 3, -35, 15, 24, 30, 32, 5, + -15, 59, -73, -4, -121, -43, 90, 29, 19, 84, + -33, -51, -40, -41, -99, 47, 6, -62, -1, -103, + -100, 16, 28, -42, -26, 70, -25, 45, -20, 51, + 35, -22, -77, -11, 23, 18, 84, 4, 51, -24, + -72, -39, -56, -30, -25, -21, -14, 12, 28, 20, + 82, -5, 2, 43, -22, -31, 3, -27, 69, 14, + -117, -127, 83, -29, 50, 79, 49, 51, -53, 24, + -105, -64, -29, -83, 33, -6, -75, -31, -65, -20, + -44, -50, 75, -20, -53, 42, 79, 13, 30, 30, + 45, -35, -7, 24, -7, 38, 33, 16, 96, -15, + 43, 27, 1, -24, -24, -28, -9, 79, 45, 65, + -40, 48, 0, -7, 98, -72, -73, 29, 36, 36, + -99, 83, -19, 127, -1, -15, -112, 56, 50, 18, + 25, 35, 21, -35, -55, -18, -39, 32, 0, 11, + 118, 49, -71, 112, -6, -59, 21, 54, -60, 102, + 59, -1, 70, -27, 80, 47, 40, 77, 54, 50, + 52, 72, -110, 18, -44, 44, 11, -40, -73, -65, + -24, 6, -20, 126, -38, -37, -78, 55, -39, 13, + -113, 93, 0, -36, 11, -8, -18, 14, -44, -36, + -31, 36, 15, -15, -60, -9, -40, 12, -5, -47, + -40, 8, -23, 27, 4, -58, -66, 7, 71, -80, + -14, 47, -17, -53, 53, -31, 100, 57, 67, 70, + -75, 16, -65, 5, -86, -12, -66, -29, -19, 13, + -62, -9, 23, 9, 27, -59, 114, -74, -61, -38, + 58, -81, 43, 38, 43, -17, -37, 14, -35, 72, + -49, 14, 48, 37, -42, 17, 15, 8, 6, -60, + -4, 23, -1, -17, 63, -31, 36, -82, 27, -42, + 5, -36, 27, -42, -40, 19, -14, -50, -49, -38, + -34, -71, 22, 61, -51, -50, 45, -14, 19, 30, + -2, -30, -11, -4, 20, -26, -26, -29, -12, 14, + 80, -60, 57, -27, -6, -19, -2, 67, 32, 56, + -84, -82, 10, -88, -1, 107, 98, -2, -6, 25, + 47, -114, -16, -53, -4, 54, 76, 79, -34, -13, + 39, -55, 15, -51, -44, -64, 88, -42, 63, -68, + -82, 46, -32, 2, 53, -44, 19, -23, -30, 18, + -18, -9, 34, 11, 41, -24, -29, -15, -18, -21, + 5, 2, 2, 44, -96, -39, 45, 99, -35, 70, + 3, 27, 46, -17, 1, -45, -46, -23, -51, 70, + -71, -34, 24, 78, -24, 118, -9, 25, 43, 82, + -79, -27, -15, -16, 68, 66, 8, 75, -23, -47, + 37, 84, -44, -5, 24, 42, -15, 62, 3, -36, + -56, 26, 30, 36, 54, 57, 35, -28, -27, -1, + 13, 5, -6, 21, 93, 0, 67, 103, -12, 13, + 29, 41, -19, 29, -16, 50, -1, -68, -38, -57, + -94, 1, -21, -101, 1, -62, 41, -31, -18, 31, + -45, 47, -6, 30, -67, -37, 22, -41, -51, 39, + -10, 22, -37, -38, -106, -7, -10, 67, -20, -17, + 81, -41, 67, -87, -45, 17, -67, -72, -52, 0, + -87, -14, 9, -17, -18, -16, -8, 21, -78, -36, + 11, -32, -79, -48, 39, -37, -48, -65, 9, 9, + -15, -41, 25, -22, 34, 10, 95, -11, -20, -28, + 35, -18, 11, -33, 21, -43, -20, -17, -16, 27, + -34, 1, -23, -59, 4, 44, -54, -1, -17, -6, + -4, -127, -69, 64, 26, -94, 70, 7, 54, 56, + -14, 28, 13, -46, 15, 45, 13, 47, -12, 30, + -13, -31, -23, 0, -27, 50, 41, 3, -39, 22, + 81, -49, 2, -91, -26, -27, 5, -2, -21, -52, + 50, -23, -10, -71, 64, -22, 107, 82, -20, -11, + -44, 55, 35, 8, -93, -124, 19, -63, -5, -27, + -98, 64, 9, -32, 87, 0, -127, 11, -47, -43, + 35, -16, 17, 103, 55, -127, -44, 34, 53, -75, + -20, 13, 13, 37, -95, 8, 48, 21, 5, -3, + 0, -68, -2, 43, 84, -22, -64, -68, 49, -6, + 7, 52, 79, 60, 7, -34, 53, 64, -69, 65, + -57, 51, 46, -40, -8, -23, 22, 66, 86, 22, + -15, 127, -52, -76, 46, 66, 58, 11, -14, 35, + 43, -36, -80, -24, 95, 3, 32, 56, -75, -21, + 8, -11, 89, 68, 50, -109, 19, 101, 77, -29, + 64, 83, 12, -37, -82, 104, -33, 95, -33, -106, + -44, 40, -44, 11, -14, -50, -37, -27, 62, 62, + -25, -39, 14, -41, 8, 46, 6, -3, -30, 17, + -19, 22, -15, 7, 10, -30, -8, -53, 67, -28, + 19, 34, -40, 12, -51, -16, 75, -73, 15, 25, + -68, 39, -36, -33, -5, -26, -69, -3, -3, 20, + -115, 14, -21, 4, -127, 49, 38, -91, 27, 1, + -54, -60, 78, 24, 87, -5, -47, 40, 10, -66, + 48, 13, -22, -50, -40, 28, 46, 42, -60, -15, + 35, -38, -107, -54, -26, 47, -21, 28, -56, 50, + 17, -13, 4, -67, 103, 35, 0, -14, 60, -71, + 2, -45, 29, -125, -96, 116, -42, -56, -3, 43, + -5, -63, -25, -53, 12, -27, 10, -17, 15, 21, + 40, -7, 121, -3, 59, -10, 88, 11, 55, 36, + -52, 58, 29, 7, 35, -73, -44, -8, 25, 60, + -36, 21, 52, -23, -45, -10, -62, 38, -26, 73, + 5, -30, -105, -31, 24, -43, 57, -100, 20, 33, + -21, -7, 107, 70, -57, -44, -18, 34, -59, 121, + 33, -30, 12, -53, 22, -40, 47, -2, -47, 69, + -35, 10, 56, 1, -60, -4, 85, -27, 26, -31, + -49, -22, 9, -20, 123, -102, -4, 10, -55, 25, + 59, -13, -43, -47, 24, 0, 23, 65, 7, 9, + 41, -39, 19, -49, 54, -78, 90, 70, 86, -68, + -5, 73, 54, 2, 92, -20, -45, 9, 15, 44, + 35, -19, 40, 48, -40, -36, 103, 34, 0, -18, + -36, 76, -19, -126, -94, -26, -57, -121, 90, 110, + 22, -26, 9, -9, 59, 35, 39, -36, 21, 16, + -48, -59, -9, 16, 50, 33, 1, -6, 1, -45, + 21, 62, -61, -57, -34, -55, 4, -31, -75, -60, + 20, -7, -32, -83, 45, 44, 67, -43, 68, -34, + -19, -46, -90, 97, -84, 13, 21, 107, 44, -27, + -30, 54, 49, 9, 11, -21, 109, 8, 9, 23, + 93, -45, -11, 39, -126, -95, -33, -22, 12, -4, + -93, -2, -17, -74, -20, -56, -68, -3, 16, -96, + -52, -18, 101, -61, -115, 42, -43, 0, 82, 3, + 72, 36, -45, -101, 58, -93, 46, 20, 2, 38, + -40, 1, -11, -2, -24, 61, 71, -39, -56, -67, + -35, 10, 10, -45, -18, 38, -42, 28, -11, 13, + -4, 99, -10, 11, 10, 3, -12, 73, -55, -127, + 20, 1, -8, -22, 9, 56, -78, -3, -6, -29, + 55, 17, -16, -29, -25, 5, 56, -20, -31, 17, + -39, 4, 10, -17, -37, 18, 21, -25, 35, 76, + -47, 25, 40, -42, 80, -4, 45, -64, -121, 62, + -51, 6, -99, -95, -6, 127, -13, -26, 38, 31, + -16, 20, 41, 30, 6, 23, -14, -70, -32, -25, + -6, -35, 12, -13, 50, 46, 26, -48, -65, -6, + 1, 20, 65, -25, -11, 6, -20, -13, 44, -90, + 20, 30, -51, -57, 1, -57, 72, -16, -13, -60, + 32, -59, -3, -40, 12, 6, -127, 26, 6, 15, + 35, -46, -8, -63, -37, -36, -38, -5, -65, -18, + -73, 79, 12, 95, -59, -11, -19, 78, -20, 88, + 18, 7, -114, 7, 45, -1, 44, 14, 61, 9, + 68, 6, 30, 91, 46, -83, 63, -37, 43, 22, + -64, -21, 11, 3, -50, 46, -65, -30, -6, -17, + -34, 55, -33, 6, -64, 27, -79, -27, 12, 7, + -98, 22, -89, 6, -92, -91, -52, 95, 82, -55, + -97, 42, -6, 55, 42, -16, 53, -38, -6, 38, + 35, 81, -23, -12, 16, 16, 83, -48, -107, 10, + 4, -33, -105, -29, -58, 6, 30, -87, 1, -28, + -2, -71, -57, -55, -61, -28, 53, 13, 12, -76, + -47, -65, 78, -49, -62, -45, 39, -21, -21, -27, + -5, -27, -49, 64, -65, 13, -40, -46, -67, -20, + -28, 6, -30, 46, -21, 28, -29, -25, 26, 32, + -15, 3, 78, -57, -54, -54, 37, 37, -7, -16, + 38, -9, -43, 60, 16, 22, -15, 15, 62, -51, + 14, -24, -54, -25, 11, -49, 53, 25, 63, 11, + -16, 27, -44, 51, -69, 69, -27, -37, 42, 14, + 7, -46, 56, -1, 9, -85, -48, 40, 31, 58, + 0, 12, -19, 15, 46, -43, -44, 11, -69, 38, + -109, -39, -26, -4, -27, -30, 48, -10, -15, -38, + 50, 41, -17, 9, 0, -46, -10, -2, -10, -17, + -41, -53, 73, 27, -14, 38, 49, -86, -59, -3, + -49, 24, -30, 46, 24, -84, -12, 39, -45, -98, + -46, -83, -29, -20, 4, -24, 100, 18, 52, 36, + -72, -21, -18, -47, -33, -5, -38, -4, 21, 40, + -51, -12, -64, -28, -49, 29, 10, -21, -14, -28, + -21, -6, -31, 14, 21, -20, 48, -57, -72, -18, + -70, 5, -65, 33, -79, 9, 41, -42, -50, 22, + 58, 47, 118, -34, -21, 48, 32, -50, -12, -53, + 37, -20, 25, 38, -79, 6, -26, 43, 51, 17, + -23, -23, 58, -23, 31, -117, 0, -21, -5, 68, + -59, -36, -43, -15, 17, 23, -29, -55, -61, -6, + 0, -57, 5, 37, 87, -16, -71, 53, 127, -35, + 42, 89, 39, 29, 25, -25, 114, 92, 127, 2, + -123, 1, 47, -43, -64, 39, -12, 23, -70, -27, + 42, 92, -57, 38, 47, -59, 18, 46, 5, 22, + 5, -2, -37, 31, -32, -63, -19, 19, -69, -11, + 61, 28, 31, 41, -4, 69, 21, -24, 30, -24, + -26, 43, -56, -55, 20, -34, 7, 83, -20, 12, + -26, 47, 13, -13, 28, 51, 76, 8, -27, 40, + -54, 93, -38, 9, -68, -1, -29, -49, -97, 81, + 69, 37, -77, -19, 33, -12, 13, -16, -41, 40, + -98, 16, -74, 37, 12, 3, 53, -33, 15, 67, + -12, 67, 61, -58, 9, -35, -59, -8, -5, -52, + -126, 28, -52, -16, 24, 31, 2, 105, -4, -57, + -5, 29, 31, -13, -22, -17, 37, 39, 26, -55, + -46, 7, 63, 53, 45, -4, -76, 2, 26, -42, + -40, -56, -28, 61, -69, -90, 45, 80, -22, 21, + 27, 17, 117, -32, -54, 26, -2, -70, -38, 44, + 29, -53, -18, -65, 23, -77, -24, 5, 65, 78, + -51, -62, 83, -65, 20, -72, 22, 70, 64, 69, + -25, 19, 30, 3, -25, -41, 2, -41, 8, 40, + 1, 14, -24, 41, -52, -44, -10, -72, 60, -6, + 85, -15, -60, 66, -20, 51, 93, -73, 61, 91, + 76, -52, -32, -63, -37, 80, -49, 69, 24, -125, + -53, 24, 3, 75, -25, 35, -68, 56, 48, 24, + -28, 33, -28, -110, 18, -11, -120, -105, -96, -61, + 37, -14, 88, -38, 95, 70, 28, 33, 66, -38, + 40, 41, 5, -29, -82, -72, 9, -46, 29, -47, + 31, -36, -32, -36, 1, -6, 8, -12, -54, 17, + -10, 12, -16, 57, -38, -27, -27, 69, 62, 41, + 38, -34, -14, -55, -24, -53, -57, -11, 12, 47, + -50, 53, -69, 58, -21, 20, -64, -61, -58, -25, + -18, -16, -46, -32, 56, 19, 7, 45, 45, 45, + 127, -21, -9, -35, 43, -33, 60, -37, -29, 77, + -4, 39, 38, 26, -33, 51, -61, -5, 34, -62, + -38, 21, -19, -6, -11, 91, -52, 17, -10, -12, + 12, 8, 10, 38, 42, 44, -32, 14, 6, 9, + 16, 14, -25, -11, 47, 32, 47, -96, -17, -56, + 19, -65, -5, -37, -64, -66, 86, -39, -20, 23, + -80, -30, -113, 79, 35, 17, 16, 0, 74, -67, + 42, 27, 60, -36, -9, 37, -23, -9, 2, -22, + -8, -37, 41, -51, -17, -5, -29, 52, 11, -8, + 6, -10, 10, 22, -25, -93, -46, -9, 34, -92, + 16, -26, -21, 18, -99, 1, -6, 15, -6, -10, + 10, -21, -9, -16, -51, 21, -73, -30, 34, -44, + 126, -11, -45, 28, -35, -50, -27, -65, 46, 22, + 71, 13, 28, 51, -20, -7, 34, -14, 81, -5, + -28, -14, -10, 71, 95, 54, 35, -20, -119, -50, + -36, -54, 126, 28, 49, 16, -60, 62, -70, 82, + 43, -4, -52, 18, -33, 7, -80, -53, -104, -1, + -30, 18, 28, 67, -11, 37, -109, 77, 6, -6, + -94, 37, 87, -71, -47, 69, 63, -58, 84, 68, + 15, -49, -43, 30, -54, 50, 12, 2, 37, 6, + 67, -18, 56, 32, -45, -69, -54, -39, 17, -49, + 88, 88, 21, -52, -34, 34, -75, 17, -68, -73, + 58, 22, -4, 17, 19, 71, 15, -16, 60, 35, + 40, 81, -127, -49, -3, -57, 54, -55, 47, 58, + -3, 23, -10, 64, 59, 42, 34, 39, -51, 46, + -16, -6, -73, -51, 54, -4, -16, 22, -24, -4, + 80, 66, -8, 47, -54, 7, 32, 37, -22, 45, + 73, 16, 13, -101, -52, -16, 0, -53, 11, 38, + -26, -59, -70, 40, 71, 15, 47, 69, 4, -19, + -22, 15, -49, -39, 31, -23, 67, 1, 123, -33, + -24, 37, -23, -73, -78, -11, -57, -36, 4, 25, + -2, 30, -12, 4, -114, 9, 82, 101, -22, 21, + 40, -14, 32, 12, 71, -9, 76, -34, 1, -15, + 72, -40, 52, -8, -21, 14, 13, -71, 13, -36, + -32, 35, -16, -23, 90, -76, -62, -20, 42, 84, + -54, 4, 46, -32, -24, 50, -37, -36, 58, -51, + -7, -40, -32, -82, -63, -20, 22, 27, 26, 12, + -10, 58, -24, -13, -41, 55, -3, -17, 22, 38, + -24, 42, 4, -33, 25, 100, -18, 7, 52, 30, + 91, -34, -56, -18, 12, 48, -40, 19, -56, 16, + -2, -3, -17, -46, 66, 42, -2, 31, -50, -46, + -5, -63, -50, -4, 1, 37, -76, 11, 17, 22, + 5, 2, 18, -4, -6, -18, -22, 30, -48, -21, + -32, 20, 50, -13, 34, -21, -58, -55, -32, -29, + -16, -58, -26, 6, -17, -62, 85, -27, -44, 47, + 67, -46, 16, 58, 25, 31, 38, 40, 14, -14, + -73, 0, -30, 12, 46, -66, -87, 20, -42, -2, + 54, -62, -81, -39, -32, -63, 1, -36, -52, 6, + -8, 25, -3, -1, -22, 22, -14, -3, -51, 13, + 61, -23, -39, -37, -17, -46, 0, 71, -16, 19, + -9, 3, -88, 35, 80, 13, -31, 32, 5, 26, + 37, 17, 47, 34, 6, -24, -34, 69, 89, -42, + -106, 81, 88, 80, 24, -34, 35, 31, 49, -45, + 43, 2, 37, -51, 39, 38, 56, 42, 11, -12, + 16, -26, -12, -61, 3, -11, -35, -3, 19, 1, + 49, -50, -35, 19, -43, 37, -34, 36, -15, -6, + 42, -70, -35, 42, 79, 99, 38, -36, -45, -71, + 25, 38, 17, 21, 12, -54, 3, -39, 43, -15, + 70, -15, -28, -29, 17, -14, 5, -18, -10, -72, + 12, 11, -24, -25, 59, -48, -9, 60, 48, -30, + -44, -43, 31, 32, 11, -62, 20, -60, 46, -48, + 9, -25, 38, 9, -11, 19, -114, 46, -19, 43, + 67, -85, -1, 56, -36, -19, -17, 55, 58, 29, + -35, -60, 45, 13, 14, 16, 4, -46, 14, -63, + 40, -64, 61, -19, 81, 7, -26, -54, -22, 48, + 17, 2, 26, 4, 24, 77, 68, 32, 86, 50, + -54, 43, -37, 63, 119, -31, -12, 77, 48, 42, + -14, 36, 14, 89, 25, -127, -7, -38, -10, 47, + -118, -27, 52, 55, -37, -65, 93, 4, 47, -86, + -65, 42, 68, -67, 72, -33, 15, -45, -15, -1, + -5, 13, 19, -57, 39, 49, -45, 48, -61, -48, + 76, 79, 24, 48, 39, -19, -85, -21, -28, 61, + -106, -87, -68, -91, 11, 11, -14, -30, -117, -58, + -6, -83, -2, 7, -41, 54, -24, 43, -16, 15, + -22, 4, -93, -53, -28, -82, -8, 25, -26, 26, + 11, 14, -4, 55, 18, -62, 44, 52, 52, 4, + -37, 62, 24, 38, 44, 81, 17, -26, -20, -46, + -63, 55, 27, 8, -15, -23, -9, 47, -13, -9, + -18, -70, -1, 1, -66, -51, 22, -1, 25, -35, + -100, -59, -24, 30, 29, 46, 68, -7, -22, 33, + -22, -64, 51, -118, -127, 5, -19, 18, 25, -56, + -17, -11, 9, -39, -9, -49, -19, 97, -25, 45, + -50, -26, -68, -40, 39, 39, 84, -99, -39, 11, + 20, -12, -3, -44, 23, 19, 6, -9, -1, -62, + -27, 19, -20, -85, -1, -10, 82, 31, -40, -66, + 8, -9, -20, -23, 17, -10, 111, -36, -9, 57, + -45, 8, -97, -18, -79, -24, 107, 85, 68, -71, + 36, -111, -14, -39, 16, -64, 45, -55, -16, -38, + 70, -25, -36, 49, 59, 15, 12, -7, -75, 50, + -19, 65, -22, 29, -30, 27, 51, -42, 28, -45, + 9, -4, -87, 102, -37, -33, -61, 33, 97, -34, + 55, 32, 3, 16, -65, 8, 10, 28, -42, -64, + -26, 21, -7, -43, -52, -15, -14, -63, 23, 21, + -40, 79, 22, -8, -48, 86, 66, 48, 22, -30, + -48, 70, 44, -14, 48, -72, 120, -96, 23, -75, + -39, -53, 24, 28, -9, -17, 63, -14, -97, 89, + -78, -29, -42, 43, -34, -34, -51, 15, 25, -27, + 49, 38, 57, 57, 55, -5, 17, -29, -38, 76, + 71, -44, -30, 30, 25, -41, -44, 3, -71, 26, + 17, -24, 4, -48, -35, -59, -60, -36, -74, -37, + -49, 75, -67, 24, 30, 77, 23, 10, -46, 36, + -31, 20, 14, 8, 4, 39, -30, -33, -9, 29, + -70, -3, -20, 66, 65, -83, -57, -1, -18, 43, + 20, 20, 33, -24, -1, -8, -25, -66, 15, 17, + 16, -11, 31, 4, -16, 77, 80, -60, -113, 74, + 1, 11, 62, -44, 53, -50, -23, 1, 2, 19, + -47, 15, 64, 21, 48, -41, 14, -18, -4, 6, + -8, -112, -3, -34, 15, -2, 37, 61, 35, -25, + 14, 39, -29, 17, -30, -6, -26, -52, 46, -45, + -40, -23, 94, -77, 48, 19, -44, -24, 37, -58, + 5, 20, 19, 73, -27, 28, -55, 30, -55, 89, + 36, 20, 7, 6, -4, 18, 15, 42, 39, 7, + 56, -75, 16, -68, -26, 13, 84, -28, 60, -4, + -89, -56, 6, 59, -35, 60, 31, 43, -3, 61, + 66, -54, -76, -42, -29, -18, 23, 38, -52, 59, + 42, 32, -20, 61, -14, -62, -18, -78, 24, 34, + -69, 67, 8, 39, 73, 43, 46, 33, -16, -2, + -12, 2, -127, -7, 76, 88, 118, 23, 120, -35, + -57, 34, 15, 7, 77, -38, 61, -5, 48, 72, + 3, 14, 5, -52, -24, -11, -69, -15, 12, -10, + 33, 50, 47, -78, -127, -67, 76, 13, 77, 51, + 75, -22, -15, -31, 60, -29, 27, -64, -9, 20, + 30, 82, 65, -53, 41, -61, 70, -10, 34, 1, + -19, 9, 13, -34, 6, 9, 15, -2, 56, -99, + -95, 113, 112, 28, -73, 63, 42, 63, -58, -61, + 11, -4, -5, -50, 68, -35, 34, -43, -67, -38, + 48, 3, -50, -59, 29, 44, -37, 46, 66, 2, + 59, -45, -127, -23, -25, 29, -27, -7, 46, 2, + 51, -22, -53, 59, 47, 9, 77, -45, -18, 17, + 8, 2, 30, 9, 46, 39, 29, 10, 48, 81, + 31, -87, 24, 42, -37, 18, -88, -26, -25, -94, + -63, -58, 33, 23, 51, -79, -56, 0, -73, 28, + -109, -45, 10, 44, -83, -43, -35, -39, -48, 101, + -19, 43, -61, -86, -59, 117, 37, 101, 1, -57, + -40, 51, 79, 67, -4, 15, 50, -37, -127, -45, + 4, 32, -32, 23, -6, -20, -34, -68, 90, 39, + 40, 72, 26, -12, -21, -21, -4, 0, -38, -79, + 21, 94, 0, -25, -16, 62, -40, -36, -69, 48, + -36, -62, -31, -41, -61, 21, 19, 52, 29, 64, + -5, -37, -79, 23, 57, -28, 14, -28, -76, 40, + -62, -76, 15, 17, -5, 11, 8, -19, -50, -1, + 54, -18, 35, -37, -25, -29, 99, -127, -40, -10, + -9, 1, -40, -56, -34, -27, -3, 60, 21, 14, + -16, 7, 7, -60, 45, 12, 96, 5, 102, 14, + 26, 32, -18, -7, -3, -88, 5, -15, -17, -62, + 40, -53, -40, 10, -51, 38, 14, -116, 22, -74, + 59, 17, 52, 12, -98, 34, -95, -117, 115, -117, + 44, 116, 2, 49, -61, 83, 37, -9, 29, -48, + -25, 2, 14, 44, -34, -15, 10, -28, -8, 68, + -71, -32, 3, 48, 2, -49, -10, -25, 2, -2, + 13, -5, 70, -26, -29, -30, 3, -24, 69, -79, + -17, -27, -108, 72, 8, -17, 8, -65, -55, -37, + 66, 30, 51, 41, -12, 5, -57, -23, 6, 62, + -38, -72, -58, -18, -98, 76, 10, -38, 45, 3, + 24, 71, 23, -21, 38, 42, 32, 63, 61, -22, + 55, 66, -55, 43, -51, -7, -67, -36, 28, 39, + -9, 57, 23, -23, 30, -15, 32, -47, -40, -8, + -79, 63, -69, -7, -11, 1, -76, 17, -81, 10, + -50, 83, -25, -50, -39, -57, 98, 20, 61, 18, + -22, 50, 31, 78, 6, 74, -38, 35, -3, 35, + 28, -77, 53, -60, 52, 30, 48, 18, -4, 65, + 18, -13, 22, 8, 3, -18, -52, 17, -10, 63, + -55, 69, -127, -64, -39, 2, 108, 53, 4, 55, + -42, -49, 74, 11, 20, -47, -35, 5, 53, -14, + -61, 127, 13, 38, 64, -5, -43, 56, -60, 25, + -91, -22, -34, -17, -29, -70, 59, 29, -19, -55, + -72, -16, -47, -18, -39, -96, -24, 32, -38, 17, + 4, 24, -91, 15, 41, -26, 46, -36, 31, -77, +}; +const TfArray<1, int> tensor_dimension39 = { 1, { 7680 } }; +const ALIGN(8) int32_t tensor_data40[96] = { + 504319, 1966422, 167447, 1574057, 718953, 1076373, 584757, 520026, 2268807, 1830958, + 2591635, 1920648, 2374097, 2483429, 2464776, 1830631, -281972, 110234, -1734637, 1191325, + 1057917, -1986411, -250537, 318517, 1655164, 2815728, 1579886, 1524168, 2562413, 1524940, + 3543118, 1845407, 2126745, 503677, 403721, 2417270, 268692, 156038, -1357910, 719534, + 2623344, 2558344, 2030815, 1415491, 2193582, 1789481, 1713070, 1861560, -1168997, 1583544, + 706386, 1200240, 189769, 1976027, -620053, -2142963, 1788263, 3265066, 1843230, 1701739, + 1953879, 2939190, 2052528, 2659564, 380540, -1543262, -165103, 980047, -1804499, -2311945, + -369270, 867367, 2282715, 2573871, 2630831, 2126376, 1507246, 2001980, 2392958, 2023725, + -2056055, 65385, 584717, 235762, -968371, 2968263, -2227583, 286619, 1676596, 2088992, + 2396403, 2484447, 1654995, 2038895, 1901159, 2229852, +}; +const ALIGN(8) int8_t tensor_data41[7168] = { + -120, -33, -32, -86, 29, -97, 42, -39, 28, -41, + -109, -69, -50, 92, -19, -12, 9, 60, -60, 40, + -51, 71, 3, -3, 51, 35, 44, 44, -20, -29, + 61, -59, -77, 40, 49, 24, 124, 16, 38, 81, + 41, 120, -43, 31, 49, 41, 74, -32, -26, 52, + 36, -54, -25, 33, 25, -28, 49, -84, -16, 23, + -60, -15, 12, -63, 37, 14, -17, -71, 71, -11, + -32, -13, -96, 31, 2, -1, 70, -1, 4, -127, + -35, 84, 22, 31, -71, -21, -55, 20, 77, 112, + -29, -14, -42, -55, 36, -19, 18, 62, -46, -94, + 51, 12, -27, -7, -28, -3, -27, 81, -44, -24, + 24, -16, -48, 18, -17, -28, -100, 54, 12, 68, + 15, 107, 7, -42, -63, 63, 21, 0, 73, 1, + -116, 8, 7, 24, 53, -38, -63, 34, -34, -4, + -43, 30, -11, -54, 111, 14, -20, 63, 67, 30, + 127, 32, -100, -4, -35, 49, 111, -26, -12, -109, + -2, 31, -12, -16, 31, -48, 70, -29, -127, 50, + -9, -15, -7, 51, 34, -46, 29, 40, -65, -77, + -11, 66, 3, -12, 30, 76, -20, 79, -31, 21, + -29, 69, 40, -98, 38, -48, 9, -71, -13, 49, + -120, -70, -10, 2, 57, 5, 15, 19, -7, -58, + -23, -43, -58, -40, 57, -44, -18, 34, -42, -23, + -32, 26, 10, 27, -28, -35, 47, -1, -81, 11, + -10, -72, -57, -93, -34, 79, -107, -16, 12, 42, + 127, 5, -51, 123, 26, 27, 53, 49, -94, -104, + -76, -26, -4, 75, -79, -38, 60, 71, 20, -22, + -67, -108, -60, -43, -91, -107, 19, -26, -31, 57, + -77, 0, -3, -38, -19, -53, 34, 37, 39, 18, + -31, 10, -14, 61, -24, -73, -34, 14, 53, -33, + 62, 16, -66, -4, 41, -32, 87, -4, 2, -38, + -1, -95, 0, -25, -14, -127, -4, 6, -14, 1, + 56, -46, 18, 1, 2, 8, 48, 47, 12, -14, + -61, -20, -117, -12, 53, -41, 64, 57, 103, -9, + -19, -15, -44, -56, -50, -24, 17, 107, -97, 1, + 36, 4, -22, 109, -127, -11, -36, 103, 57, 45, + 14, 103, -71, -38, 23, 23, 61, 29, 23, 85, + -15, 8, -21, -61, 42, -57, 24, 67, 90, 127, + 97, 100, 58, 23, 38, 10, -24, 56, 90, 74, + 13, 33, -18, 24, -39, -24, -37, 23, -45, 16, + -66, 75, 7, 20, -20, -32, -85, -27, 17, -102, + -27, -124, -15, -93, -29, 15, 33, 18, 75, -60, + 31, 95, 52, 86, -74, -91, 71, -9, -18, 13, + -94, 51, 38, -35, -43, -15, 72, -63, -27, -31, + -85, 39, -19, 77, 5, 41, -87, 0, -58, -24, + -47, 32, 43, 37, 73, 87, 107, 26, -68, -59, + -34, 17, -50, -55, -13, 34, -19, 45, 42, 15, + 36, 108, -43, 5, -42, 14, 65, -5, 4, -53, + -46, -58, -127, 57, -61, 66, -1, 105, 41, -38, + 0, 30, 36, 36, 10, -99, 41, -49, -89, -7, + -65, 47, -45, -15, 92, -30, 14, -39, -45, 21, + -18, -9, 32, 62, 68, 58, 71, 55, 25, 50, + -50, -35, 78, -31, 4, -42, -78, -87, 64, 14, + 23, 4, -53, 74, -80, -2, 76, -71, 77, -66, + -57, 98, 14, 7, 42, -85, -44, -56, 50, -56, + 73, 24, -87, -29, 97, 12, 33, 69, -18, 24, + 25, 4, 34, 0, 37, 5, -44, 5, -19, -72, + -26, -19, 26, 45, -39, 25, 7, -1, -67, 2, + -12, -8, 8, -47, -1, -20, -37, 54, 16, 25, + 51, -34, 47, -52, 60, 18, -13, -22, 23, 3, + -74, -24, -23, 47, 78, -81, 56, 35, 41, 23, + 31, -25, 53, 109, -20, -29, -40, -50, 60, -38, + 53, -73, 33, -76, -68, 57, -37, -4, 55, -37, + -25, -61, 23, 25, 52, -17, -63, -3, -49, 55, + -15, -35, 78, -6, -19, 54, 52, 69, -6, -35, + -6, -4, 8, -6, -14, 39, -55, -12, -6, -88, + -82, 32, -75, -25, -61, -3, 91, -45, 48, -38, + 111, 42, -20, -53, 43, -3, -22, -42, -18, -35, + 17, 40, 42, -46, 33, 70, -35, 9, -26, 64, + 2, -30, 73, 22, -38, 9, 41, -78, -79, 84, + -45, -43, 25, 55, 6, 27, -80, -69, 77, 61, + -36, -11, -17, -13, 29, -9, -22, -60, -26, 16, + -46, -2, 68, 22, 4, -55, -14, 89, -67, -58, + -34, -20, 96, 33, 29, -48, -1, 8, -68, 38, + 59, 62, -25, -19, 23, 40, -39, 39, 43, 44, + -76, 0, -38, -45, 44, -77, -45, -41, -52, -10, + -63, -127, -43, 22, -29, -25, 21, -39, -78, -31, + 22, -49, -55, -33, -62, -60, 2, 50, -91, -14, + 9, 19, 32, -11, 7, -43, -29, 118, 37, 72, + -18, 127, 101, 2, -83, -77, 84, -12, 68, 0, + -110, -7, -20, -38, -42, 55, 14, -59, 60, 60, + -2, -42, -10, -64, 68, 13, -84, 37, -23, 25, + -57, -14, -4, 23, 42, -6, 30, 19, -19, -13, + 35, -33, 36, 39, -22, 45, 13, 42, -24, 24, + -78, 5, -12, 59, -13, -68, -50, -1, 9, -12, + 42, -70, -53, 7, 39, 27, 60, -11, 87, -98, + -77, 57, 54, -33, -61, 54, -75, -68, 43, -65, + 16, 29, -67, 68, -59, 29, -45, -46, 9, 67, + -106, -42, 67, 46, -50, 8, -87, 41, 21, 39, + 34, -30, 64, 19, 43, 32, -64, 50, 8, -30, + 74, -84, 38, -5, -44, -13, -66, 22, -92, -21, + 40, 54, -35, -20, 57, 33, 65, 24, 81, -17, + -68, 0, -44, -83, -58, 34, 7, -6, 75, 60, + -66, 24, -69, 3, 13, -39, 24, -70, -51, -26, + -37, -21, -4, 52, 62, -42, -8, -77, -25, -36, + 32, -83, -6, 22, 62, 127, -80, -84, 3, -16, + 81, 12, -29, -7, -65, -48, -78, -63, -4, -74, + -64, -7, -65, -36, 41, 17, -35, -35, -99, -61, + -28, 20, 35, 3, -43, -15, 61, -25, -38, -57, + 30, 35, 54, -46, -10, -112, -72, 10, 40, -22, + -80, 14, -60, -5, 45, -18, -21, -5, -20, -33, + 10, 59, 47, 51, -34, 69, 5, 3, 83, -68, + -118, 88, -38, -52, 48, 61, -19, -40, -5, -18, + -46, 31, -30, -54, -62, 9, 36, -26, 25, -14, + 33, -7, 47, -5, 31, 81, -6, -31, 4, -35, + -113, -26, 45, -27, -33, -6, -15, -89, 82, -46, + -54, 40, 92, 35, 18, 58, -70, -62, 20, 1, + -20, 6, 33, -76, -46, -50, 39, 72, 23, -30, + 16, -43, -16, 8, 56, -34, 14, 2, -48, 8, + -32, 6, -12, 3, 45, 43, -46, 18, 65, -15, + -86, 55, 25, -31, 66, -64, -67, -12, -34, -39, + 15, -30, 15, -26, -35, -72, -26, -24, 83, 46, + -39, -16, 105, -68, 17, 88, 17, -82, -61, 78, + 23, -99, -61, 37, -74, 9, -7, -38, 56, 16, + -4, -54, 47, -19, -72, -9, -1, -69, 15, -51, + 14, -4, 51, -58, -33, 108, 13, 46, -69, -74, + -1, -18, 11, 35, -21, -35, -26, -22, -60, 25, + 47, 34, -111, 51, -63, 3, -27, -21, -33, -76, + -66, -18, 31, 50, 64, 4, -24, -86, -60, -29, + -57, -66, 70, -37, 81, -60, 32, 31, -6, -7, + 47, -61, 22, 63, 20, 25, 37, -21, 64, 38, + -24, 73, -112, 15, 3, 59, -69, 75, -44, 35, + -56, -21, 61, 8, 65, -84, 45, 42, 10, -8, + -34, -9, 29, -5, -13, -74, -14, -78, 33, -127, + 23, 70, 56, -69, -78, -72, -56, -5, 23, 12, + -9, -58, -43, 2, -5, 34, -44, -39, 36, -52, + -47, 13, 56, -2, -5, -13, -28, -58, -19, 0, + -59, -11, 77, 52, -69, -54, -94, 29, 40, 43, + 63, 84, -45, 49, -85, 82, -94, -100, -106, -29, + 79, -35, 5, 68, -32, 38, 65, 96, 78, -37, + 42, 67, -110, -41, 60, -37, -42, -9, 7, 79, + -116, -14, 60, 16, -5, -82, -109, -56, -2, -61, + -36, 14, -53, -82, 17, -12, 18, 27, -17, 14, + -45, -21, 23, -126, 11, 48, -82, 14, 24, -47, + 28, -22, -40, -13, 28, -1, 24, 15, 45, -36, + -18, 15, -17, -8, -33, -62, 47, 27, 13, -43, + -93, 55, 12, 3, 68, 70, -57, -56, 22, -51, + -39, 48, -83, -56, 16, 32, 74, 53, 114, -90, + 36, -13, 47, -35, 68, -77, -13, 0, 1, 31, + -75, 52, -4, -9, 47, 46, -39, -29, -11, 39, + 58, 46, -37, 6, -11, -63, -28, 9, -49, -56, + -36, -25, -39, -37, 24, 54, -19, 2, 7, 2, + -69, -21, 39, -4, 58, 7, 23, -69, 2, 65, + 6, -2, -15, 11, 24, 3, -64, -76, 83, -11, + 1, -49, 21, -13, 34, -41, -43, -90, -10, -65, + -8, -53, 44, 9, -97, -35, 30, -33, 54, 59, + 23, -47, -8, -13, 45, -12, 23, -37, -25, -26, + 77, 49, -99, 22, 74, 18, -52, 30, -6, 109, + 27, 32, 16, 65, 27, 39, -12, 47, 54, -38, + 13, -61, 49, -21, -22, -71, 36, -125, 22, 43, + 22, 27, 42, 17, -12, -6, -33, 60, -13, -11, + 71, -7, -10, 40, 44, 70, 66, 25, -37, 35, + 42, 47, -3, 34, -74, 44, 53, 25, -9, -23, + -61, -19, -6, 52, 39, -52, 44, 51, 70, 5, + -15, -21, 2, -38, 16, 27, 9, 58, -56, -14, + 4, -53, 3, -74, -114, -20, 9, 3, 45, -5, + -87, -46, -58, -66, 19, 76, -99, 0, -55, 50, + 127, -20, 64, -18, -20, 29, 20, 71, -64, -4, + -32, 55, 79, -65, -63, -66, -5, -63, 65, -54, + -36, -51, 12, 89, 38, 0, -62, 9, -61, -36, + -60, 36, 9, 55, 44, 53, 15, -16, 11, 36, + 16, 29, 6, 38, 21, 74, -18, 69, 46, 11, + 42, -55, 37, -59, 32, 18, 118, -41, 12, 47, + 16, 0, 0, 48, 77, -37, -7, 8, 61, 84, + -17, -60, -10, -127, 1, -113, -8, -62, 7, -17, + -10, 46, -27, 118, 72, -39, -30, 3, -56, -30, + 32, 58, -7, 49, -82, -68, 34, 50, -29, -30, + -96, -27, 9, 34, -86, -39, -45, -3, 16, 49, + -22, 16, -82, 59, -77, 59, -40, -87, 1, -3, + -38, 52, 22, -47, 94, -8, -24, -9, 10, -53, + -97, -78, 79, -48, -47, 14, -58, -11, -52, -7, + -40, 33, -19, -44, 44, 17, -55, 4, -7, -50, + -2, 33, -45, 65, -48, 18, 31, 25, -61, 68, + 12, 97, -38, -56, -68, -40, 96, 78, 3, 81, + -4, 48, 46, -72, -11, -59, 49, 55, -29, -65, + 6, 32, 76, 40, -53, -27, 56, 42, 40, 17, + 4, -39, -61, -13, 0, 77, 7, -13, 35, -1, + -20, -42, 38, -63, -48, 72, -75, -34, 41, -19, + -10, 2, -33, 22, 78, -1, -1, -48, 19, 80, + 19, -49, -72, 52, -23, -33, 27, -56, 99, 1, + -26, 34, -25, -78, -4, -73, 38, 29, -31, -99, + 10, 29, 64, -40, 22, -27, 35, 40, 53, 58, + 87, -36, 18, 0, -28, 15, -85, -81, -62, -102, + 69, 52, 64, 17, 2, 56, 117, -60, 47, 53, + -60, -35, 21, -10, 7, -25, -92, 22, -4, 50, + -45, 75, 24, 6, -6, -18, 53, -1, 44, -8, + 23, -6, -59, 53, -18, -5, -40, -86, 14, 51, + -65, -77, -10, 25, -91, -13, -32, 10, 82, -80, + 116, -48, -32, -30, -78, 73, 1, 15, 74, -36, + 20, 69, -36, 0, 17, 75, -19, -11, -10, 24, + -37, -30, 61, 61, -35, 15, -80, -25, 21, 106, + -80, 35, -12, 17, 6, 14, 26, -12, -38, 26, + 24, 29, -65, -5, -74, 1, -16, -78, -11, -56, + 56, 34, 2, -28, -26, -1, -8, -18, 27, -51, + 26, 1, -30, 24, 74, -67, 62, 56, -20, -27, + 46, 75, -43, -59, 83, -75, 19, 73, 32, -55, + -2, -18, -34, -27, 31, 0, 67, 49, -12, 42, + 55, 41, -43, -21, -73, 54, 22, -13, 71, 18, + -42, -29, 11, 34, 37, 89, -32, 85, 6, 44, + -4, 38, -41, 60, -52, -18, -32, -52, 20, -4, + 21, 8, -30, -79, 14, -80, 25, -47, -72, -63, + -50, 45, -13, -48, 16, -17, 38, 8, -14, 23, + 56, -65, 53, 36, 1, 25, 18, 61, 97, 33, + 9, 4, 3, 71, 50, -10, -26, 29, 22, 88, + -23, -59, -88, 5, 88, 23, -27, 80, 30, -24, + -9, -80, 35, 32, 32, -4, 95, -78, -87, -17, + 10, -68, 17, -32, 7, -5, 43, 32, 25, 88, + 65, 25, -32, -54, -5, -8, -65, 29, -50, 95, + 58, 109, 15, 5, 82, -88, 53, -84, 37, 45, + -87, -10, -16, -89, -39, -127, 39, 12, -32, 27, + 82, -88, 7, -42, -17, -73, 72, 31, 27, -15, + 31, -26, -54, 52, -46, -27, 16, 31, 22, 74, + -73, -39, -118, 122, 4, 34, 58, 52, 19, -76, + 17, -13, 39, -5, -118, 16, -46, -113, -77, -35, + -37, 24, 57, 35, 20, 110, -1, 50, 42, 25, + 19, 34, 3, 36, 28, 70, 58, -9, 89, -116, + -57, 8, -3, 15, -30, -69, 58, 9, -77, 68, + -35, -32, -37, 4, -5, -34, -105, 24, -20, -49, + -75, -69, -82, -47, 17, -103, -19, -63, -44, 78, + -9, -16, 12, -8, -87, -40, -7, -40, 99, 51, + -127, 49, 16, -28, 69, -107, 51, -56, -9, -86, + 48, -21, -10, -76, -2, -38, 83, 30, -26, -74, + 19, -29, -47, -37, 15, -9, -8, 45, 11, -15, + 53, 23, 5, 39, -51, 29, 105, -25, 107, 90, + -92, -5, -34, 89, -59, 78, 31, 39, 25, -7, + -119, -23, 19, -61, 23, 63, 15, 124, -51, 8, + 55, 4, -104, -2, -45, -95, 67, 34, -41, 14, + 41, -39, 88, 38, 39, -31, 64, -18, 4, 22, + -28, -29, 9, -8, 23, -58, 8, -8, -59, 52, + -17, 20, 14, 13, 27, 48, -3, 37, 9, 20, + 6, 82, 45, -37, 43, -26, 120, -50, 82, 111, + 97, -2, -65, 49, -8, 44, -104, 5, -64, 23, + -49, 107, -100, 51, -43, 1, -61, -6, 66, 29, + 53, -34, -39, -21, -27, 22, 4, 38, 3, -23, + 15, -10, 64, -48, 9, 82, 9, 23, -74, -14, + -52, 44, 40, 67, 59, 93, -44, 78, 93, -56, + -76, -46, 77, -2, 34, -45, -13, -20, -14, -3, + 28, -30, 19, 7, -21, 26, -20, 29, -119, 49, + 3, -90, -46, 5, -31, 5, -56, 24, -32, 27, + -61, 62, 54, 30, 69, -52, -9, 50, 2, 5, + 35, 47, 1, -90, 49, -82, -10, 54, 52, -89, + -34, 44, 7, -77, -60, 81, 97, -73, 24, -4, + 54, 92, -62, 46, -13, -100, -34, -86, 0, -1, + -76, 31, 43, 30, -44, 88, 8, 25, 127, 38, + -69, -79, -9, 41, 96, -50, -62, 62, 76, -27, + 24, -119, -19, -1, -87, 16, -61, 58, 79, -90, + 46, 18, 8, -86, -43, -35, -22, -49, 31, -63, + 43, 11, 1, 44, -31, 0, 20, 54, -63, -35, + 20, 3, 17, -10, 27, -58, -25, 78, -37, -30, + -5, -10, -63, 38, -70, 46, -52, -55, 6, -15, + -10, -9, -42, 14, -104, 32, 3, 46, 80, 42, + -31, -15, -38, 72, -21, -19, 66, -57, -48, 38, + 3, -3, 38, 24, -30, -27, -44, -21, -44, -10, + 3, 41, -12, -41, 20, -64, 15, 35, 2, -7, + 17, -34, 64, -125, 12, 37, 6, -14, -57, 55, + 21, -5, -48, -78, -26, -16, -46, -92, -89, -15, + 45, 53, -51, 0, 35, 29, 12, 63, 80, -57, + 11, -43, -48, 16, 58, 32, 17, 16, -92, 59, + -8, 24, 7, 38, -40, 22, 63, 26, 30, -19, + 45, 36, 40, 25, 9, 62, -12, 49, 22, 43, + 43, -66, 56, 66, 11, -7, 4, -27, -60, 113, + 86, -1, -63, 28, -72, 22, 85, 21, 76, 22, + 21, 42, 34, 46, -14, 10, 67, 49, -13, 4, + -52, -1, 21, 31, -29, -46, -26, 32, -17, -103, + -14, -29, -127, -1, 50, -48, -48, 57, 20, 2, + -49, -127, -9, 13, -44, -47, 21, -17, 41, -76, + -14, 38, 33, -48, 32, 4, 62, 27, 25, 63, + 24, -37, -102, -29, -33, 49, -18, 55, -9, 42, + 66, 5, 50, 43, -12, -61, 54, 32, 36, 1, + -19, -56, 43, 47, -36, -8, -37, 39, 60, -4, + 7, 71, 24, -10, 4, -27, 15, -10, 55, -49, + -33, 34, 14, -60, 32, -11, -42, -89, 3, 54, + 61, -43, 43, 44, 1, 37, -37, 22, 35, 78, + -21, -95, -10, 42, -50, -8, -73, -11, -6, 0, + -15, 16, 81, -51, -75, 20, -71, 41, 50, 96, + 28, 29, -90, 34, 10, 79, 16, -12, 79, -91, + -62, -7, 44, 40, -6, -116, -6, 51, -5, 42, + 52, -118, 22, 51, -60, -37, 24, -37, 32, 17, + 15, -38, 20, 30, 20, -49, -72, 30, -11, -28, + -9, -6, -25, 10, 33, 23, -16, -52, 20, -25, + -5, 79, -31, -37, -39, 74, -43, -29, -27, 64, + -19, -21, -88, 14, -56, -89, -28, -48, -75, -48, + 85, 2, 60, 39, -82, 103, 40, 41, 55, -107, + -10, 1, 4, -91, -6, 41, 34, 12, -95, 29, + -38, -11, 15, 34, -19, 20, 51, 41, 52, 20, + 14, 81, -49, 83, -40, -10, 4, 37, -19, 67, + 8, -46, 26, 26, -65, 36, -8, -104, -61, 31, + 111, -44, -50, 64, 21, -11, 50, 21, -39, -66, + 19, 31, 62, -79, 63, -9, 58, -18, 54, 16, + -87, 4, 50, 19, -64, 39, -15, -31, -2, -38, + -50, -24, -95, 81, -16, -34, -72, 42, -10, -26, + -37, 22, 38, -35, -48, 20, -26, 24, -12, -7, + 18, -6, -60, 18, 30, 57, -33, 102, 67, -36, + -40, -8, -81, 34, 75, 61, 29, 15, 10, 53, + -11, 22, -41, 47, 32, 0, 87, -49, 16, -51, + -106, 47, -49, -75, -17, 16, 27, 6, -81, -15, + -14, -81, 21, 22, -20, 12, -33, 12, -62, -7, + 44, -79, 32, 2, -21, 48, 62, 28, -23, 63, + -88, -16, -39, -17, -67, 79, -90, 27, -40, -63, + -87, -12, 15, 12, 18, -64, 49, 45, -31, -84, + 12, -78, -74, 35, -11, -59, -20, 102, -24, -47, + 108, 66, -38, 5, 58, 51, -60, -63, 12, 64, + 20, -77, -47, -77, -10, 3, 122, -21, 84, 0, + 74, -21, -53, 11, 24, 67, -26, -70, 2, -1, + 10, -57, -50, 9, -23, -14, 10, -8, -58, 61, + -48, 1, 76, -91, -52, -10, -63, 60, -16, -86, + 61, -90, -113, -41, -11, 56, -24, 52, -67, -1, + -43, -56, 7, -25, -51, 60, 45, -15, 38, -38, + 29, 63, -65, 34, -15, -2, 5, 27, -21, -45, + -39, 99, -124, -56, -11, 113, 36, 8, 11, 51, + -60, -75, 29, 33, 21, 79, -64, 104, -30, 7, + 74, 13, 46, 7, -67, 51, -51, -20, 19, 11, + -17, -32, -11, -45, -113, 95, -6, 41, 33, -35, + -23, -27, 25, 86, -62, 71, 27, 9, 118, -50, + -27, -2, -34, -26, 34, -79, 36, 48, 6, -5, + 30, 1, 58, 69, 15, 8, -21, -43, -57, 40, + -63, 89, -20, 10, 14, -30, -21, 43, 43, -26, + 13, 3, 93, -28, -23, -58, -56, -75, 73, 9, + -23, -6, -23, -31, -77, -30, -34, -56, 94, 73, + -31, -24, 3, 68, -57, -52, -90, -29, 47, -38, + 14, 84, -59, -21, 32, -39, -11, -70, -105, 24, + -86, -13, 41, 98, -31, 8, -39, 45, -2, 12, + -19, -64, -38, 48, 37, -16, 16, -70, 2, -13, + 35, -126, -60, 44, -10, -114, 75, 46, 87, 27, + -127, -79, -13, 46, -2, 84, 13, 47, 25, -1, + 91, 37, 47, -110, -127, 24, 39, -74, -16, 0, + -51, 68, -3, 9, 7, -47, 52, 74, 66, -34, + -31, 7, -46, -28, -63, 64, -5, 7, 64, -79, + 99, -71, 68, -40, 63, 59, 79, -25, -41, -22, + -33, 63, 25, -31, 41, 2, -60, 41, -43, 6, + -8, -94, -45, -39, 31, -32, 0, -4, -31, -1, + 37, 58, -83, 9, -3, 0, 26, -8, -35, 6, + -18, -58, 47, -54, -60, 2, 25, -72, 38, -21, + -55, 24, -49, 79, -82, 56, 36, -61, -57, -8, + -97, 34, 60, -28, -64, 64, 33, -59, -43, 29, + -59, -42, -45, 6, -63, 69, -72, 27, 80, -9, + 30, 10, -1, -4, -10, -34, 20, 82, 53, 19, + -58, -71, -14, -108, -81, 75, -48, -37, 127, -92, + -29, -13, -8, 19, -15, -43, -10, 11, 52, 69, + -41, -7, -127, -71, -104, 47, 31, -29, -42, -89, + -36, -29, 17, -27, -35, 7, 46, 16, -8, 18, + -64, 18, -20, -64, 39, -33, -43, -18, -34, -29, + 11, -17, 69, -8, 20, 5, -2, 44, 38, 21, + 48, -65, -10, -20, 30, 37, 31, 70, -17, 40, + -28, -7, 88, -26, -65, 35, -85, -59, -76, -81, + 73, -86, -26, -12, -11, 27, 127, -50, 79, -81, + 18, 39, 33, 8, -12, -36, -47, 87, 12, 73, + 68, -103, 71, -51, -115, -11, -29, -55, 53, -52, + -12, 35, 5, -79, -88, -33, -8, 0, 31, -20, + -3, -3, 50, -40, 39, 9, 1, -51, -23, 28, + 9, -69, 58, 55, -23, -64, -86, 3, -44, -12, + 85, 46, 29, -7, -47, 18, -66, -51, -25, 78, + -13, 76, -38, 4, -41, -40, 64, -70, -74, 63, + -54, 11, 36, 27, 96, -30, 34, 16, 5, 46, + -76, -24, 6, 49, 38, -42, 52, -32, 28, -8, + -24, -11, 59, 46, -46, 0, 27, 10, 24, -59, + 4, 29, 15, 28, -36, -25, 69, -14, -24, -72, + 7, -9, 45, -79, -52, -79, -21, 14, 9, 23, + 7, 22, -127, 24, 16, 48, -17, -16, 80, 38, + -11, 8, -124, 65, 104, 35, -14, -25, 68, 4, + 13, 81, -70, 76, -10, 4, -99, 56, 5, -79, + 89, -22, 37, 11, 58, -46, -24, 24, -17, 18, + 2, 7, -24, 60, 67, -65, 53, -25, 8, 40, + -63, -85, 86, 35, -50, -57, 30, -52, 57, 20, + 10, 63, 14, -16, 56, 40, 38, 29, -53, 11, + 45, 5, 27, -10, -37, 37, 16, 80, 2, 22, + -19, 28, 37, -19, 41, -101, -29, 61, -49, -110, + -5, -28, 45, 51, -46, -9, -29, -44, 32, -69, + -24, -31, -1, -5, 78, -15, 18, -42, -12, -51, + -38, -1, -32, -22, 3, 53, -5, -29, 62, -7, + -50, 25, 76, -45, 38, -75, -24, 10, 55, 47, + -64, -40, 23, 41, 86, -11, 121, 49, -28, -49, + 66, -71, -12, -12, -5, -50, 17, -56, -90, -26, + -9, -56, 16, 93, -68, 24, -35, -122, -32, 24, + 31, -80, 50, -49, -30, -19, 25, -11, -24, -93, + 10, -73, -9, -9, -18, -67, 51, -52, 12, -59, + -48, -93, 19, -35, 32, 3, -103, 105, 119, -9, + -5, 11, 58, 3, -5, 38, 56, 21, 14, 40, + 71, 74, -127, -41, 18, -83, -21, 71, -16, -66, + 15, -17, 41, 37, 31, -5, -43, 75, -39, -47, + 14, -119, -40, -15, -15, -31, 4, -24, -99, -42, + 16, -59, 15, -28, 17, 48, -30, 8, -2, 63, + 4, 17, -24, -1, -53, 69, -67, 0, 65, 30, + -79, -96, -21, -77, -17, -2, -41, 75, 94, -27, + 58, 54, 22, -46, -51, 47, -55, -97, 46, -46, + 66, -20, -3, 70, -4, -93, 39, -24, -7, -28, + 97, -88, 10, -120, -32, 11, -21, -83, -15, 11, + -45, 14, -36, 18, 9, 73, 45, -90, 10, 31, + 23, 31, 41, -103, -60, -61, 57, 75, 14, 108, + -17, -73, -14, -68, 52, 95, 26, -29, 14, -53, + 50, 38, 3, -26, 14, -30, 99, 4, 34, -26, + -75, -16, -66, -5, -1, 124, 31, 22, 45, 95, + 108, 113, -30, -42, 76, -22, -68, 48, 41, 53, + 28, -8, -27, -32, 36, -5, -13, -91, -92, 61, + 20, -39, 60, -11, -48, 9, 32, -4, 94, -5, + -78, 56, -52, -55, 61, 20, 12, -25, 79, -83, + -7, -34, 0, -5, 21, -12, -56, -65, 42, -30, + -108, 23, 31, 28, 7, 21, -84, -27, -46, -36, + 88, 57, -39, -82, -71, -52, 2, -48, 59, -40, + -54, -81, 37, -5, 19, -102, 57, 25, -100, -1, + -25, 35, -34, -64, 33, -70, -6, 74, -5, 28, + 16, -86, -34, 118, -67, -37, 65, -14, 17, 19, + 58, -27, 22, 46, -13, -83, -16, -66, -84, -42, + -41, -60, -54, 4, -15, -75, -46, 25, -43, 31, + -1, 30, -71, -49, -13, -57, -112, -37, -8, -47, + 50, 36, 10, -114, 17, -48, 22, -100, -36, -42, + -62, -33, 72, 37, -10, 68, 1, 63, 5, 12, + -9, -48, -9, -44, 84, -7, 59, 11, -85, -10, + -62, -19, 9, -24, -56, -64, 48, 72, 53, -10, + 106, -98, 82, 75, 68, -5, 122, 84, 1, -15, + 125, 24, 12, 20, 26, -64, -53, -67, -127, -109, + -19, 69, 117, 7, 59, 46, -64, -36, 91, -44, + 66, -28, -11, 58, -73, -31, -127, -47, 59, -40, + 54, -18, -70, -29, 12, 5, 32, 68, 22, -121, + -13, -16, -78, -51, 84, -61, 34, 19, -24, 39, + 95, 27, 39, -72, 35, 64, -35, 41, 65, 6, + -42, 61, -6, 48, -64, 4, -25, -95, -106, -81, + 47, -67, -36, -12, 43, -26, -10, 77, -7, -10, + -47, -76, -11, 47, 100, 64, -89, 69, -5, -3, + 56, -8, -1, -20, -59, 44, 17, 0, -16, -1, + -40, -32, 2, -33, 2, 18, 127, -1, -43, 23, + -70, 72, -54, -51, -51, 2, -49, -14, 38, -75, + 16, -57, -67, 26, -25, 24, 36, 1, 27, 39, + 16, -63, 66, 35, 58, 58, 68, -25, -62, -81, + -55, -127, -12, -24, -28, -49, 46, -102, -98, -14, + 44, -23, 36, -41, 18, -108, -35, 6, -34, -73, + -46, 28, 49, -75, 15, 76, -3, 121, -16, -33, + 63, -32, 67, -12, -10, 45, -17, 86, -28, 56, + -49, -64, -58, -55, -7, -109, -100, 32, -17, -2, + -59, -19, -4, -7, 46, 64, -30, 21, 27, 35, + 80, -57, 8, -67, -34, 34, -42, -11, 23, -49, + 16, 1, -5, 56, -36, -15, -39, 87, -26, 27, + -16, -8, -10, 22, 25, 24, -38, 54, -27, -127, + -127, 9, 57, -12, 5, 10, -49, -12, -97, -8, + -42, -32, -3, 47, -4, 10, 88, 72, 4, 10, + 24, 55, 3, 57, -6, 63, 74, 44, 4, 27, + -6, 22, -64, -36, 58, -63, 105, -55, 25, -2, + 58, 45, -18, 35, -56, 35, -25, -29, 53, -34, + -62, 11, 25, 47, -21, -15, -6, 27, 51, -3, + -26, -60, -43, -55, 78, 80, 39, -39, 7, 23, + 58, -11, 51, 52, 100, 108, 117, -20, 83, 45, + 36, -55, 11, 40, -46, 93, 20, 12, 73, -9, + -64, 15, -3, 23, -10, 68, -38, -74, -28, 17, + 86, 96, 5, -97, -31, 77, -103, 51, -49, 25, + 104, 23, 36, -66, -14, -36, 22, -110, 16, 58, + 4, 0, -46, -67, -49, 24, -55, -41, 6, 4, + -89, -49, 62, 36, -59, -60, -34, 51, 30, 89, + 54, -74, -21, -78, -39, -86, -2, 9, 75, 21, + 37, -88, 101, -18, -3, -25, 0, -30, -7, -46, + -96, 25, -83, 85, -103, 16, 40, 77, -33, -99, + -83, -7, 72, -44, 0, 24, -55, 73, -60, 65, + 34, -18, 5, 31, 31, 67, 111, 69, -59, -44, + 88, -49, 92, -29, 49, -90, 66, 3, -28, 106, + -69, 33, 27, -115, -12, -60, 65, 71, 26, 67, + -40, 7, 13, -82, 58, 100, 57, 38, -16, -17, + -37, -58, 51, -8, -52, -29, 68, 16, -9, -60, + -14, 58, -95, -15, 24, 66, 9, -127, -54, -84, + -3, -37, 32, -73, 2, -43, -4, -60, -3, -82, + 6, -46, 1, 22, -77, -7, 8, 37, 8, 41, + -15, -52, 25, 78, 3, -76, -52, -39, -120, -64, + 47, 42, -48, 23, 5, -40, -21, -62, 113, 21, + 26, -18, 76, 35, -61, 30, 14, -2, -46, 57, + -14, -1, 19, -115, 50, -85, 54, -68, -38, -65, + 33, -87, -62, 14, -79, 9, -19, -25, -7, -22, + -7, 28, -16, 23, 10, -97, 45, 17, 28, 56, + 94, -71, 110, 123, -84, -53, -9, -45, 68, 7, + 31, -40, 12, 10, 3, 65, -27, 7, -30, -62, + 36, 35, 38, 0, -59, 24, 41, -11, 18, 14, + -38, 30, 31, 84, -20, -64, -46, 17, -18, -36, + 23, 2, 47, 20, 35, 74, -84, 39, 50, -4, + 3, 13, -41, -57, 21, -43, 27, -114, 39, -23, + -46, 34, -72, -5, -79, -17, 21, 20, 102, -4, + 51, 26, 55, 9, -37, -49, -78, 104, 14, 7, + -18, -84, 2, -105, -40, 23, 32, 47, -67, 51, + 2, 26, -91, 56, 65, -5, -28, -63, -4, 59, + -15, -2, 20, -16, -73, -95, 56, 9, 64, 15, + 23, 13, 59, -34, -64, -14, 59, -83, -38, -24, + 15, 40, 10, -8, 108, -17, -50, -56, 6, -14, + 10, -29, -26, -21, -38, 37, 7, -6, -36, -61, + 56, 42, 48, -34, -36, -53, -42, 74, -28, 59, + -18, 82, -14, -20, -3, 21, -2, 90, -26, 93, + 34, 103, -22, -61, 77, 25, 26, -23, 50, 0, + -14, -30, -2, 0, 14, -18, 3, -13, 103, -42, + -46, 2, 35, -41, 13, 75, 28, -45, -78, 82, + 57, 86, -79, -21, 83, 98, 2, -49, 33, 59, + 31, 102, -49, -72, 14, 112, 55, 100, -45, 62, + 73, 13, 114, -13, 50, 70, -5, 18, -14, -64, + 48, 53, 25, -51, -53, 85, 19, -11, 1, -42, + 26, -56, 86, -13, -54, 82, -67, 15, -6, 4, + 33, -14, 51, 5, 9, -8, 33, 67, 127, 62, + 32, 8, 32, -60, -12, 26, -83, -8, 16, 52, + 17, 2, -81, 13, -97, 51, -41, -18, -70, -9, + 25, -4, 12, 81, 68, -20, 0, -21, 15, -48, + -26, -28, 73, -70, 9, -83, -61, -20, -88, 33, + -26, 69, 26, -11, 13, 3, -12, -19, -44, 39, + -49, 38, -33, 43, -41, -9, -35, 56, -24, -35, + 50, -22, -46, -70, -66, -5, 42, -124, -40, -68, + 63, 18, -33, 51, 23, -22, 36, 48, -4, 117, + 24, -7, 42, -16, 121, -70, -47, -8, -13, -18, + -79, 56, -50, 75, 13, -55, 0, 8, 32, -24, + -76, 47, -20, -15, -62, -3, -21, 13, 0, -83, + 95, -79, 53, -40, -79, -32, -28, -43, -38, -47, + 38, -2, 64, -18, -55, -38, 20, -58, 2, 67, + -28, -11, -82, -38, 36, 68, -33, 14, 14, 50, + -19, 57, 70, 56, -42, -36, 29, 42, 54, -70, + 15, 58, 67, 23, -4, 13, -64, 60, -22, -10, + -24, -15, -29, -57, -32, 3, 60, 55, 33, 19, + -12, -34, -23, 3, -57, 13, 81, -127, 73, 50, + 6, 37, -18, 18, 79, 29, -55, -40, 15, -68, + -13, -55, 80, 31, 20, 13, 15, 29, 67, 80, + -50, -100, 32, 65, 12, -19, 0, 44, 44, -46, + 35, 44, -60, 67, -43, 0, -63, 105, -82, 91, + -9, 37, 15, -1, 72, -3, 57, -58, 44, -57, + -24, -77, -8, 57, 10, -31, 21, 72, -25, -7, + -9, -29, -38, -46, -70, 39, -61, 65, -99, 22, + 13, -60, -67, -73, 15, 17, -58, -16, -31, -9, + 45, 33, -27, 36, 20, 102, -44, -28, 67, 10, + 88, 55, 99, -42, -56, -31, -46, -71, 14, -7, + -18, -31, -19, -10, -37, 41, 6, 78, 97, 80, + -40, 102, 15, 28, 110, -35, 104, -7, 87, -35, + 62, -55, 86, -42, -29, -58, -15, 127, -10, 18, + 64, 62, 28, -36, -30, 44, 47, -64, 68, -63, + -94, -84, -64, 17, 26, 6, -76, 18, 83, 23, + -15, 49, -49, -25, -45, 31, -46, 76, -83, 43, + 26, -82, 58, -60, 1, 54, -27, -69, -18, 26, + 16, -72, 10, -25, 31, 35, 35, -43, 20, -88, + -44, 38, 49, -17, 40, -29, -77, -81, -62, 13, + 9, -121, -24, -29, 38, -52, 9, 32, -41, 22, + -33, -19, -27, -9, 15, -95, 52, -29, -29, 35, + -64, 0, 30, 20, 22, 58, -28, 34, -17, 4, + -42, 49, 4, -54, 28, 47, 65, -14, 0, -63, + 73, 16, -36, -36, -60, 94, 64, 63, -21, -60, + 49, -16, 54, 80, -68, -28, -8, 50, 45, 32, + -9, 57, 62, -9, 33, 5, -9, -26, -16, 57, + 47, 28, -31, 39, 47, -21, 19, -18, 49, 52, + -11, -22, -23, 6, -5, -23, -31, 32, 34, -56, + 6, 25, -13, 16, 0, 53, -127, -39, 14, -92, + -20, 68, -72, -72, 83, 94, 55, 28, -1, 35, + 84, -21, 107, 73, -53, 81, 25, 20, -62, -4, + 2, -44, 51, 60, -72, 47, 18, 42, 20, -87, + 9, 63, -59, 49, 30, 20, 18, -31, 6, 83, + -84, 8, -10, 10, -22, -30, -30, -5, -81, -89, + -35, 73, -83, 41, 2, 73, 22, -76, 118, 31, + 64, 13, -18, -45, -83, 34, 62, -78, -6, 42, + 1, -28, 68, -31, -4, -15, -52, -74, -39, 101, + 85, 14, 23, 48, -88, -101, 95, 22, 24, 50, + -103, 80, 127, -87, 43, -59, 3, 41, 54, 74, + 33, -46, 26, 33, -38, 11, 97, -78, 33, 52, + 44, 29, 55, 22, -54, 45, 49, -33, 48, -37, + 6, 77, 15, 35, -93, 46, 90, 46, -79, 60, + 54, 48, -58, 10, 84, -13, -2, -54, -15, 38, + -76, -41, 15, -58, 18, 21, 58, -11, 70, 75, + -2, -54, 31, 17, -127, -65, -96, -4, 14, -30, + -60, 40, -40, -3, -20, -61, -8, 81, 31, -1, + 76, 5, 28, 8, 26, -44, -5, -9, 42, 9, + -5, -12, -52, -26, 55, 22, 10, -84, 58, 10, + -26, -3, 38, -85, 51, 5, 42, 14, 26, 37, + -10, -11, -38, 46, -21, 2, 64, 75, 34, 79, + -9, -20, -35, 6, 13, -26, -49, 28, -14, 44, + -13, -11, 71, 33, 12, 24, 82, -31, -22, -19, + 30, 26, 68, 10, -2, -52, -22, 8, 51, 19, + -11, -11, -19, -16, -32, -4, -39, 48, -32, 2, + 18, 49, 4, -24, 16, -47, -15, 24, 59, 71, + 49, -30, 34, 33, 14, 40, -2, 80, 115, -42, + 62, -37, -38, 88, -67, 38, 3, -79, 35, -15, + 69, -11, -29, -30, -28, 44, 76, 8, 18, -10, + 42, -16, 70, -23, -38, 23, 19, -25, 25, 60, + -9, 2, 1, -30, 67, -31, -43, -51, -27, -119, + 119, -43, 77, 21, -15, 23, 86, -96, 79, -43, + 10, 59, 20, 61, 85, -1, 44, 46, 69, 66, + 6, 53, -91, 105, 6, -48, 29, 42, -36, 103, + 34, -43, -41, -30, 19, 34, 35, -73, -98, 7, + 61, -77, -44, -51, 30, -21, -20, -30, 64, -57, + -35, -42, 40, 62, 41, -23, -81, 25, 48, -30, + -9, -11, -44, -20, -50, 67, -39, 31, 5, -75, + 110, 61, 13, -55, 109, -83, -4, 76, 32, 78, + 90, 33, -23, -15, 23, -87, -40, 4, -72, -54, + -42, -18, 21, 53, 14, -91, 40, 21, 25, -56, + -5, 65, -7, 10, 52, 43, -37, -51, -44, -24, + -68, 22, 32, 61, 49, -127, -39, -61, -61, 55, + -44, -60, -36, -27, 40, -1, 27, -2, -54, -56, + 22, 0, -41, -34, 7, -9, -6, 26, 42, 18, + 23, 41, 32, -39, -32, 11, 39, 51, -51, 46, + 63, -41, 32, -47, 37, -81, 35, 2, -85, -61, + 20, -85, 0, 4, 97, -67, 6, 16, 23, 45, + 9, -51, 1, 45, 36, 71, 21, 12, 60, -9, + 1, 19, 36, 40, -56, 48, 62, 30, -6, 28, + 49, 55, 44, 8, -71, -83, -32, 0, -39, -96, + -63, -41, 16, 20, 31, -95, 33, 21, 33, 58, + 36, -83, -25, 86, -80, -62, -66, -46, -9, 2, + 57, 3, 41, -53, -19, -36, 9, 87, 72, -56, + 1, 92, 50, 64, 38, -15, -70, -16, 65, -63, + -56, -11, -67, 29, 92, -52, 58, -47, -10, -3, + 93, -115, -82, 18, 39, 10, -25, 48, -60, 107, + 127, 39, 23, -93, 37, 35, 79, -83, 56, 102, + 12, 60, -62, 28, 2, 14, 76, -37, -17, 37, + 7, -75, -9, 105, -29, -2, 31, 48, -64, 20, + 6, 7, -54, 9, 118, 36, 59, 5, 73, 74, + -29, 29, -46, 48, -37, 12, -40, -5, 30, 50, + -124, 18, -62, -69, -22, 68, 43, -32, 50, -4, + -77, -71, -16, -9, 3, 5, 44, -21, -82, 1, + -68, 33, -64, 20, 25, 12, -50, 1, 76, 89, + 61, 21, 7, -78, 22, 75, 23, -32, 15, -51, + -18, 49, -7, -81, -52, 33, -22, 4, 40, 64, + -35, -71, -44, -15, 2, -43, -11, 55, 79, 31, + 55, 35, 39, -49, 112, -15, -34, -45, 73, -18, + 26, 25, -44, 41, 34, 37, -44, 24, 46, 0, + -29, 30, -12, -10, -17, 18, -66, 32, 46, 34, + 24, 38, 72, 44, -33, -49, -71, -49, 9, 7, + 15, -7, 28, -11, -29, -18, 107, -76, 4, 48, + -36, 27, -49, 43, 23, 3, -70, 78, -24, 37, + -66, 6, 61, -18, 22, 10, -64, -6, -3, -79, + 36, 56, -5, -72, 2, -103, -30, 64, -85, 37, + -26, -9, 62, -1, 3, 58, 12, 21, 4, -27, + 62, -44, -15, -36, -32, 73, -22, -74, -41, 107, + -6, -9, 44, 74, -22, -83, -65, -127, -103, -35, + -14, -9, -82, 26, 0, 38, -19, 98, -34, 85, + -41, 72, -70, -88, 107, 23, 48, 34, -4, 79, + -1, -34, -2, -84, -2, -72, 64, 70, 20, -45, + 13, -7, 69, 17, 37, 25, -52, -37, -110, 6, + -62, 98, 46, -108, 76, 27, -19, 66, -61, 20, + 32, 120, 8, -24, -8, 62, -12, -83, -27, 55, + -71, 78, -48, 14, -26, 49, -29, 66, 75, -86, + 47, 55, 37, 66, 32, -69, -11, -25, -64, -46, + -7, -74, -116, -127, -83, -40, 36, 27, -41, 10, + -10, 107, -10, 72, 72, 39, -66, -65, 113, 44, + -124, 109, 42, 12, 14, -52, -56, 37, 38, -16, + 14, 113, 54, 7, 63, 103, 4, 43, 40, -24, + 41, -29, 39, 19, 56, -10, 6, -66, 68, 44, + 0, -50, -118, 46, -49, -46, -48, 21, 34, 35, + 62, 27, -60, 49, -6, 20, -21, 27, 71, -14, + -62, 12, 82, -14, 25, -38, 47, 30, -77, -46, + -20, -73, 39, -20, -26, 8, -53, 50, -10, -14, + -65, -127, -58, 1, 40, -1, -44, -3, -53, 1, + -9, -92, 2, -13, -56, -68, -19, 10, 13, -61, + 90, 40, 20, 49, 7, -5, -56, -17, -59, -39, + 2, -12, -16, -14, 34, -51, 16, -23, -23, -1, + -25, -79, -88, 21, -66, -37, -21, -110, -44, -63, + 56, 86, 35, 36, -45, 53, 21, -38, -39, 100, + 42, -15, -11, 94, 10, -88, 79, 8, -33, -24, + -103, 37, 82, -31, 83, -21, -3, 18, 5, -59, + 65, -82, -21, -95, -75, -33, 0, -75, -33, -95, + -27, -79, 78, -55, 39, 79, -15, -11, -28, -55, + -36, -26, 7, 64, -15, -15, -31, -46, -52, -81, + -19, 11, -31, 58, -54, 18, -30, 44, -10, 17, + 70, -15, -54, -64, 61, -38, 65, -1, 9, 60, + 3, -86, -83, 68, -20, -59, 51, 72, -38, 11, + 53, 127, 41, -4, 13, 3, -50, 9, 111, 29, + -81, -57, -14, 71, -6, -71, 32, 79, -37, 118, + -41, -53, 39, -47, -62, -53, -57, -76, 55, 30, + -25, -64, -26, -44, -5, -59, 95, -87, 60, 68, + 27, 14, -38, 127, 34, -75, -68, 18, -76, -92, + -85, 14, 46, -2, 36, 105, -21, -18, -90, 39, + -14, 105, 24, -40, 24, 62, -57, -37, 63, -1, + -42, 28, -53, -66, -31, 0, -67, -29, 103, -42, + 51, 59, 21, 60, -27, 21, 35, 35, 48, -18, + 35, -49, -71, 11, 63, 37, -15, 38, 5, -31, + -61, 27, -7, 40, 10, -23, 12, -33, 75, -8, + 2, 7, 55, -23, -9, 4, -24, 20, -1, -56, + -99, -19, -3, -57, -22, -82, 7, 3, -55, -89, + -77, 78, 78, 78, 27, 68, -32, -72, 77, 45, + 67, 29, 2, -28, -52, 6, 57, 34, 75, 103, + -8, 46, -28, -69, -81, -54, -127, -5, -38, -16, + -10, 23, -62, -14, -91, 60, -4, 125, 106, -76, + 38, 93, -4, 37, -49, -5, -44, -41, 61, 16, + -4, -23, 33, 48, -111, 23, -100, -86, 64, -23, + -50, 6, 15, -47, 34, -63, 27, 75, -90, 84, + 3, 51, 14, -34, -53, -38, -2, 60, 95, -74, + 11, -26, 30, -51, -79, 13, -38, 76, 46, -28, + -111, -4, 42, -45, 81, 0, 42, -26, -103, -56, + -29, -71, 20, -11, 21, -98, 11, 36, -78, -10, + -25, 48, 9, 40, 35, -18, 19, -25, 47, -20, + -6, 100, -20, -52, 15, 53, 74, 27, -10, 68, + -39, 79, -89, 94, -35, 9, 57, 63, -86, -62, + 6, 69, -25, -101, 59, -16, -30, 20, -86, 5, + 18, -87, -61, -36, -13, -68, 14, -47, -17, 24, + -43, 38, -81, 25, 63, -117, -1, 96, -30, -8, + 103, -112, 14, 105, -14, -17, 67, -43, 38, -122, + 41, -107, 33, 54, -23, 42, -2, 95, 18, 94, + -21, 127, -34, 40, 62, 33, -40, -55, -46, 37, + 8, -27, 14, -34, 74, -20, 20, 24, 57, 28, + 12, -7, -13, 35, -94, 27, 14, 57, 12, 4, + -79, 63, 7, -24, 31, 26, -3, -11, -92, 60, + -27, 34, 62, -11, -44, -63, -127, -68, 51, -74, + -26, 45, 95, 11, 27, -10, 10, -64, 23, -53, + 24, -64, 7, -66, 66, -91, 38, 11, -91, 18, + -34, 1, -15, 90, 68, 0, 5, 62, -33, -20, + -57, -3, -1, 0, 59, 0, -51, -35, 14, -57, + -79, -56, -49, -35, -35, -76, 21, 54, 15, 11, + 51, -83, -58, -77, -40, -87, -62, -122, -47, 39, + -71, -95, 55, 18, -39, -84, -19, -52, -24, 48, + 36, -55, 75, 127, 68, -34, -47, 119, -13, -40, + -51, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +}; +const TfArray<1, int> tensor_dimension41 = { 1, { 7168 } }; +const ALIGN(8) int32_t tensor_data42[128] = { + -215666, -2383331, 646135, -452419, -955651, 1091328, -894699, 5382893, 2216447, 1781677, + 1509637, 2413677, 2211536, 1805037, 1509582, 1448804, -15383, 2032030, -1864283, 2964395, + -3256128, -2508580, -1010563, -786393, 2690454, 2037767, 2395564, 1972817, 1525666, 1554405, + 2530876, 1843419, 728014, 2205480, -3567267, 1175380, 707997, 749404, 902609, 873945, + 1998079, 2202147, 1812296, 2851021, 2140836, 2170222, 2337492, 2385989, 2562872, -970891, + 80609, 748096, -756308, 1018403, 2104092, 1236572, 1952537, 2677687, 2222488, 3158882, + 2952082, 2765586, 1903292, 1586682, 147096, 929642, -3289827, -1430266, 1691106, 3019516, + 844111, 1754681, 2560728, 2360683, 1607046, 2279510, 2331655, 1742355, 2202981, 1838358, + -1597314, -565664, -327860, 1145060, 565934, 719305, -945127, -2951056, 1985586, 1788779, + 1567858, 2902090, 1835642, 2141550, 1814287, 2017867, -142303, -34073, 1697464, -468824, + -244100, 2265863, 486471, 1581145, 1832515, 1800090, 2161328, 1901777, 2380557, 2337300, + 1811806, 1927657, 1929266, -1148686, -358631, -3105824, -1116729, -5826741, 1488180, -160320, + 2385667, 2584481, 1766931, 2289463, 2461695, 2049723, 2148427, 3001946, +}; +const TfArray<1, int> tensor_dimension42 = { 1, { 128 } }; +const ALIGN(8) int8_t tensor_data43[15616] = { + -8, -111, 77, 10, 25, -33, 59, 79, 55, -52, + 55, -8, -15, 55, -23, -22, -13, -21, 21, 52, + 111, -12, -84, -47, 81, 13, 23, -4, 2, -89, + -61, 68, 34, -18, -11, -38, 21, -53, -9, 22, + -78, -55, -6, 75, -37, -21, 63, 49, -62, -9, + 53, 55, 82, 35, -46, 36, 69, 33, 17, -63, + 15, 24, -55, 27, 40, -39, -65, -23, -5, 97, + 41, 19, 17, -18, -39, 47, -40, 108, -15, 37, + 34, 37, 83, 66, 35, 42, -15, 6, -40, 12, + 59, -46, 19, 34, 40, 45, -127, 34, 8, 41, + 15, -67, -88, -44, 8, -26, 2, 26, -43, -41, + 27, -21, 96, 34, -25, 63, 32, 80, 45, -91, + -49, 18, 70, 41, 34, 36, 20, 22, -18, -28, + -17, -68, 6, -16, 54, 39, -80, 49, 10, -42, + -20, 45, 30, -42, -24, -44, -127, -45, -16, -18, + -7, -111, -57, -28, -67, 24, -2, -8, -32, -61, + -4, 11, 17, -80, 48, 29, -13, 24, 79, 32, + 55, -9, 24, -36, -57, -13, 9, 107, -24, 39, + -17, 62, -4, -16, -103, -14, 47, 31, 48, -50, + -31, 2, -53, 62, 36, -22, 35, 81, -17, -37, + 127, 37, -9, 40, 83, 94, 64, 22, 50, 33, + -59, -3, -105, -96, -47, 30, -39, 11, -95, -98, + -6, -62, 32, -92, -112, 28, 42, -33, 46, 9, + -60, -13, 43, -37, 34, -39, 127, 18, -28, 41, + 41, 32, -53, -9, 63, 46, -3, 9, 13, -74, + -19, -19, 12, 36, 44, 22, -70, -29, -73, -20, + -59, 15, -34, 67, 0, -88, -79, -87, -37, 85, + 19, -25, -35, 19, 28, -9, 8, -3, 57, -10, + -6, 62, 37, -12, 48, -33, 27, 25, -55, -1, + 24, 17, -13, 60, 64, -17, -8, -47, -68, 1, + -53, -43, -72, 32, 37, 116, 21, -4, -28, -14, + 10, 37, 27, 18, -48, 100, 40, 11, 36, 24, + -61, 2, -48, 23, -27, -40, 15, 33, -48, 16, + 45, 8, -126, 55, 88, 99, -34, 81, 0, -78, + 77, 14, -44, 6, -98, 20, 34, -10, 105, 18, + -2, -41, 36, -20, -27, 70, -9, 38, 34, 74, + -54, 3, -22, -49, -4, 16, 7, -2, 48, -24, + 20, 77, -10, 52, 45, 82, 28, 48, 3, -25, + 43, 65, 68, 48, -70, -52, -8, -9, -30, -43, + 14, -33, -80, 34, 6, -32, 26, 79, -27, 26, + -54, -38, -42, -84, -38, -62, 17, 8, -16, -98, + -43, 10, -13, -64, 42, -31, -1, -53, -17, -73, + -40, 40, 57, 22, -89, 127, 39, -28, 108, 30, + 52, 25, 69, -20, 58, 58, -14, 5, 39, 23, + 17, -45, 30, 26, -11, -58, 15, 5, -19, 2, + -53, 43, -30, -27, 10, -29, 123, 80, -44, 54, + -37, -19, 46, 50, -55, 54, -10, 4, -64, 20, + -26, -14, -94, -61, -10, -127, 32, 16, -15, -67, + 5, -33, 43, 37, -1, -17, -16, 31, -29, 66, + 49, 3, -26, 24, -60, -27, 40, -28, 25, -26, + -20, 22, 3, 40, 12, 40, 40, 127, 5, -2, + 36, 37, -1, 20, -8, -17, 23, 86, 77, 64, + -92, 12, -55, -21, -60, 79, 19, 86, 68, 23, + 12, -9, 49, 58, -71, 9, -2, 122, -11, 10, + 38, -2, -27, 8, 40, -84, -37, -40, -34, 29, + 32, 86, -40, 24, 31, 87, -30, 36, -48, 60, + -53, 68, 31, 25, 32, -45, 11, 1, 13, -3, + -41, -19, 30, 36, 7, -97, 45, -37, -78, -44, + 87, -49, 40, -19, -115, 45, 5, 7, 20, -73, + -22, 9, 106, 66, 52, 41, -9, 97, 29, -17, + 49, 4, 22, 50, 68, 49, -73, -19, -48, -16, + -11, 3, 63, 64, -9, 27, -69, -18, -109, 36, + -6, -81, -26, 55, 92, 20, -9, -74, 64, -44, + -13, -17, 36, 20, -69, 53, -36, -13, -19, -23, + 43, 17, -70, -61, -38, -5, 99, 71, -55, -88, + -50, 26, 0, -45, -8, 127, 23, -12, -26, 9, + -76, 11, 8, 18, -31, -21, -76, -98, -102, -43, + -45, -69, -30, 24, -89, 27, 41, 65, 54, -5, + 35, -28, -62, 97, 58, 38, -46, -2, -12, -37, + 76, 18, -13, -120, -21, -31, 18, -33, 16, 2, + 86, -27, 28, -21, -35, 39, 21, -75, 28, -9, + -119, 19, 31, 80, 4, -21, 96, 14, 0, 53, + -38, -16, -12, -91, -70, 92, 58, 7, -5, -82, + -50, 64, -27, 9, -42, -2, -61, 33, 75, -8, + -56, -5, 56, 18, 25, -16, 12, 2, 67, 2, + 7, 20, -53, -5, 21, 55, 17, -71, -56, 27, + -8, 33, 11, -26, -4, -3, 89, 41, 57, -7, + -6, 62, -62, 5, 25, -49, -4, -76, 66, 58, + 15, -29, -49, 19, -14, -72, -4, 32, -34, 3, + -23, 44, -41, 26, 88, -25, 9, -74, -36, 36, + 13, 27, 25, 88, -21, -51, 43, -91, -67, -87, + -13, 75, -54, 57, -12, 18, -35, -33, 50, 15, + 40, -13, -33, -79, 85, 12, -17, 40, 17, -20, + -33, 43, 51, -69, 7, -11, -74, -36, 87, 20, + 37, -55, -40, -2, 65, 62, 6, -14, -14, 72, + 27, 82, 49, -50, 55, -4, -25, 76, 4, -86, + 0, 26, -67, -28, 24, 26, -14, 1, 50, 30, + -5, 15, 73, 22, -45, 3, -4, 26, -19, 2, + 127, -6, 11, -75, 30, -11, 42, -48, -10, -12, + 112, -24, -17, 20, 10, -79, -8, 32, 41, 14, + -36, -16, -7, 7, 33, -28, 44, 27, -10, 9, + 34, -39, -18, 95, -41, -22, 3, 57, -3, 14, + -64, 25, 14, 26, -78, -45, 26, -23, 86, -70, + 63, 13, -37, -18, 28, -1, -32, -56, 4, -19, + 62, -43, -49, -38, 29, 88, 8, 57, 35, 76, + -45, -75, -7, 3, 3, 96, 12, 17, -70, 6, + -2, -31, 34, -4, 75, 17, 62, -15, 52, 42, + 66, -89, -7, 18, -29, -11, -11, 55, 16, 28, + 24, -67, -65, -38, 0, 13, -26, -7, -38, 13, + 89, 37, -40, 37, 27, 49, 7, 21, -36, -19, + 32, -12, 22, -54, 33, -47, -4, 35, 37, 8, + -1, -34, 19, 70, -7, -43, 23, -41, 1, 5, + 15, 35, 38, -8, 71, -3, -28, -17, -59, -113, + 14, -48, 45, 37, 24, -92, 29, -32, -17, -104, + -22, 18, -31, 21, 46, -29, -50, -35, 38, -35, + -37, 34, -35, 29, -62, 13, 35, -36, 26, 48, + 63, -13, 12, -13, 29, 15, -49, -29, 29, 4, + -30, -46, -12, 21, 40, 8, 24, -13, -54, -32, + -39, 63, 49, -4, -21, -65, -9, 65, -90, 127, + -63, -18, -34, 35, 16, 16, 72, 0, 12, -61, + -88, 20, -89, -73, -55, 28, 8, -41, 39, 2, + 1, -3, -84, 127, 41, -74, -22, 51, -11, -83, + 10, 23, 26, 70, -17, 8, 12, 72, 32, -36, + 18, 10, -16, -48, 34, -52, -34, 15, -22, -23, + 41, 1, 52, -39, 0, 34, 12, -68, 57, 48, + 2, -5, 24, -33, 42, -26, -39, -17, 20, -22, + 33, 9, -40, -38, -52, 43, 17, -53, 44, -12, + -4, 15, -98, -70, -5, -20, 8, -49, -30, 32, + -45, 3, -75, 7, -53, 18, -68, -48, 31, 83, + 73, -39, 15, -7, 106, -33, -53, 48, 65, -40, + -4, -27, -73, 82, 13, -80, 12, 47, 11, 68, + -17, -43, -73, 33, -56, -49, 36, -68, 22, -19, + 58, 36, 25, 29, 66, -39, 54, 19, -36, -50, + 115, -7, -2, -19, -123, 66, -26, 56, -68, -73, + -101, -2, -52, -66, 25, 75, 51, -8, -41, -41, + 75, 58, -13, -66, -38, 22, -24, 11, -24, 34, + -4, 1, -78, -96, -15, -4, 2, -48, -72, -18, + 31, 4, 83, -34, 10, 29, 6, -52, 23, 15, + -22, -66, -51, -15, -64, -38, 22, 40, 19, -73, + -24, -28, -27, -61, -19, -49, 45, 18, 47, 43, + 4, -52, -56, -10, 21, 5, -15, 27, -50, 16, + 9, 13, -23, -61, -5, 69, -18, -21, 46, -17, + 11, -10, -12, -18, -42, 58, -64, 23, -12, 21, + -41, 62, 15, 22, -38, 12, -16, -15, 1, 44, + 7, -92, 88, 57, -1, -100, -35, -26, 56, 52, + -31, 49, -86, -105, -11, -4, 23, -14, -64, -8, + -43, 28, -40, -21, 32, -73, 80, 63, 40, -12, + 79, -3, -36, 43, -78, -99, -26, 7, -28, 53, + 55, 61, -15, -46, 66, -57, -14, -17, 36, 64, + -18, 45, 121, 18, 13, 45, 44, 4, -12, 34, + 25, 21, 87, 59, -14, -4, 31, -16, 6, -8, + -27, 36, -16, -3, 15, 27, 26, -57, 23, -3, + -45, 71, -33, 8, -39, 26, -62, -76, -14, -18, + -18, -76, 35, 42, 44, 24, -13, 3, -31, 2, + 40, -54, -20, -35, 40, 2, -55, -61, -120, -14, + 57, 46, -107, 78, -6, 40, 37, 88, -26, 52, + -19, 20, 8, 33, 56, 64, 2, 45, 52, -17, + -9, -53, 50, -6, 12, -18, -23, -112, -91, -17, + -16, 53, 26, 4, 49, 34, -7, 25, 75, -33, + -17, -42, -22, 8, 31, -4, -49, 3, 18, 76, + -25, -4, -33, 60, -37, -41, 32, 58, -51, 5, + -4, 14, 27, -27, -72, 16, -7, -25, 33, -62, + -32, -6, 26, 52, -83, 26, -92, 27, 38, 32, + -21, -38, -51, -51, 27, -65, 32, -37, -69, -1, + -66, 14, -46, -68, -69, -63, -100, 24, 72, -33, + -47, 33, 26, -37, 24, 67, -56, -29, 20, -47, + -45, -5, 17, -6, -27, 54, -10, -12, -18, 33, + 16, 47, -76, 13, 52, 5, -33, 6, 43, -32, + 2, 35, -3, 33, 64, -39, 43, 30, 32, 21, + 35, -23, 23, -8, 4, -54, 9, -13, 9, 7, + -59, 81, -71, 43, 5, -64, -15, -28, -3, -37, + 2, 84, -81, 54, -12, 54, 16, -98, 3, 35, + -49, -65, -34, -28, 32, -15, 0, 36, -24, 17, + -92, -3, -49, -5, -24, -59, -2, 26, -77, 83, + -41, 88, -23, -6, -66, 54, 29, 47, 60, -46, + 66, 79, -14, 14, 61, -35, 19, -37, 48, 32, + -7, 44, -31, 2, -24, 4, 17, 5, -75, -45, + -40, -80, -11, -18, 24, -2, -8, -26, 53, 42, + -35, 67, 14, 47, 29, -21, -4, -1, -19, 16, + -46, -39, -23, -51, -43, 4, 34, 30, -4, 47, + -69, 32, 11, -28, -20, 36, -64, 75, 12, 10, + -13, -13, -98, 50, -4, 65, -18, 51, -35, 31, + -64, 44, -50, 13, 15, -13, -44, -36, -37, -36, + -45, 59, 64, -3, 5, -56, -22, -1, 49, 21, + -11, -15, -70, -57, 3, -52, 66, -38, -13, -12, + -13, 12, -8, 41, 3, 24, -29, 35, 48, 38, + -29, 14, -15, -26, 32, -21, -45, -22, -7, -11, + -54, 11, 28, -52, -30, 0, 11, -34, -38, -32, + 6, 81, 47, -7, 20, -2, -13, -41, 26, -20, + 4, -9, -56, -85, -1, -59, -10, 7, -127, -69, + -50, 10, 35, 48, -64, -80, -16, -16, -29, 22, + 15, 20, -37, -3, 15, 36, 11, -85, -87, 25, + 27, -17, -72, 39, 36, 1, -35, 37, 59, -18, + 86, 66, 35, -3, -19, 58, -66, -50, -91, 32, + 37, -37, 36, -3, -35, 9, 16, -6, -40, -14, + -27, -1, 66, 39, -93, -1, -45, 33, -35, -91, + -78, -37, -19, 39, -11, -70, -6, 8, -4, -71, + -42, -49, -30, -51, 48, 21, -22, -39, -63, -36, + 16, 60, 30, -72, -12, -55, 3, -75, 15, -58, + 2, -36, 38, -27, 35, -81, -27, -54, -62, 33, + -31, 7, -1, -30, -54, 8, -23, -51, 39, -58, + 82, -69, 39, -8, -14, 6, -40, -24, 64, 23, + 27, -42, 18, 49, 2, -12, -16, 41, 23, -31, + 15, 15, -26, 44, -49, 12, -1, 40, 41, -27, + -28, 65, -25, 9, 12, 16, 31, -78, 8, 8, + 45, 43, -7, -36, -6, 52, -30, -4, 36, -39, + -88, 17, 4, -37, -15, 2, -52, 31, -44, 57, + 5, 45, 10, -53, 72, -34, -27, 5, 42, -30, + 23, -20, 19, 29, 13, 63, -9, 9, -55, -77, + 12, -17, 98, -24, -22, 44, -72, 27, 14, 60, + -63, 10, -23, 30, -75, -20, 33, -26, 4, 20, + -49, -78, -10, 59, -32, -23, 55, 6, 61, -31, + 7, 36, -16, 60, 6, -16, -18, 7, 43, 11, + 44, -30, 35, -65, 33, -12, -20, 36, -31, 45, + -2, -39, -29, -12, -11, 0, -7, 29, -48, -125, + -34, 49, 36, 27, -66, -101, 53, -63, 8, -56, + -19, 2, -7, -29, 68, -42, 36, -7, -81, 19, + 2, 34, -12, -36, -9, 29, -51, 22, -6, 5, + 15, -1, 29, 74, -21, -3, 12, -1, -37, -13, + 8, -89, -72, 14, 1, -56, -31, 24, 23, -11, + -28, 5, 18, -21, -34, 24, 81, -55, 28, -31, + 6, -45, -81, 75, 35, -38, -39, 12, 62, -67, + -6, -88, 0, -56, 52, -9, -51, -42, 30, -36, + -52, -68, -67, -94, -22, 110, 37, 32, 19, -6, + -17, -4, 50, -21, 2, 71, 58, 93, 22, 71, + 37, 24, 52, 35, 11, -105, 12, 61, -40, 15, + 79, -60, 16, 8, -45, -63, -40, 20, -15, 26, + 37, 58, 18, 19, 1, -35, -34, 10, 27, 31, + 67, 1, -4, 28, -34, -51, -19, 24, -3, 3, + 38, 15, 32, 6, -35, -33, 49, -10, -73, -26, + -10, 31, 33, 4, 28, 29, -43, 47, -54, -27, + -3, -10, -48, 45, 30, 3, -71, -97, -43, -13, + -12, 1, -4, -38, 35, -29, 23, -1, 2, 33, + 33, -21, 63, -45, -89, 19, 40, -40, -42, 38, + -12, 34, -50, -4, 16, 14, -20, 68, -5, 73, + -18, -16, 77, 20, -34, 19, -7, 34, -15, -72, + 88, 22, 29, -70, 7, 33, 35, -34, 33, 47, + -13, -30, -47, -19, -31, -17, 33, -43, -7, 23, + 64, -23, -36, 13, 36, -7, -3, -13, 33, -7, + 9, 64, 10, -43, -91, 5, 30, 24, 31, -39, + 19, 15, 31, 3, 6, -61, -7, -30, 36, 34, + -64, -51, -18, -100, -11, -62, -56, -14, 22, -36, + 38, 0, 13, 14, 6, -4, -49, -38, -8, 61, + 44, 127, -23, 8, 14, -42, 32, -2, 24, 45, + -23, 39, -14, -37, 14, -82, 27, 1, 28, -42, + -62, 19, -4, 27, 9, -47, -2, 4, 5, -67, + 28, 13, 35, 69, -33, -36, 11, 9, 54, 21, + -37, -74, -31, 26, 38, -26, 21, -48, -90, -29, + -25, 50, 13, -11, 44, 61, 5, 72, 29, -87, + 68, -12, 73, 41, 81, 48, 57, -116, -65, -25, + -52, 0, -35, -33, 59, -17, -30, -4, 16, -7, + 0, 13, 2, -18, 95, -16, 30, 24, 22, -33, + 11, 14, 6, -80, -26, 12, 80, 11, 30, -2, + -6, -11, 30, -13, -48, 54, 0, -12, 23, 7, + -39, 46, -46, 3, 78, 51, -30, -11, 79, 24, + -12, 24, -31, -44, -27, -55, -24, 17, 16, -22, + 2, -51, -2, 16, -29, 4, 32, 74, -114, -12, + 11, -84, -82, 67, -40, 4, -64, 72, 12, 7, + -52, 43, 77, -26, -14, -16, 9, -19, 52, 84, + -16, 107, 89, -14, 51, -38, 66, 59, 48, -51, + -52, -8, 17, 17, -11, 4, -16, 0, 0, 17, + -3, -20, -20, 15, -56, 90, 11, -41, 3, -80, + 48, 47, -24, -37, 16, -6, 40, 13, -8, -18, + -19, -1, 7, 32, 24, 27, 61, 5, -11, 96, + -18, 19, 7, -13, -16, -68, -55, -19, -40, -13, + 82, 15, -30, 15, 5, -1, -29, -52, -71, 4, + -21, 4, 56, 14, -53, 48, -40, 0, 7, -84, + -48, -7, 8, -52, 45, 62, 36, 89, 15, -7, + -16, 67, 53, 14, -3, 17, -39, 45, -12, 32, + 3, -37, 112, 65, 4, -42, 0, 2, 29, 5, + 40, -19, 47, 46, -45, -26, -11, -60, 24, -32, + -23, -21, 4, 58, 16, -39, 33, -23, -22, 72, + 27, -70, 44, 69, -6, 5, 31, 90, 19, 38, + -37, 17, -4, 58, 33, 43, -35, -51, 16, -43, + -31, 45, 47, 43, -2, 58, -39, -13, -30, 55, + -44, -22, 36, 32, 78, 78, 22, 16, 49, -42, + -20, -124, 5, 36, -26, 54, -2, 31, -28, 33, + 22, -25, 22, 9, -32, -1, 23, 63, 21, 15, + 75, -20, 47, -29, 30, -15, 31, -41, 11, 23, + -3, 28, 25, 6, 27, 66, 15, -59, 10, 41, + 3, -9, 3, 38, -21, -35, -13, -89, 19, -18, + -15, -101, -22, 8, -34, -18, 78, 4, -14, 25, + 48, -20, 12, -54, 77, -77, 38, -5, -30, 32, + 10, -44, -26, 12, -1, -65, 49, 116, 17, 6, + 127, 60, -49, 70, 10, 7, -35, -27, 58, 53, + -22, 36, -47, 125, -34, -32, -16, 9, -7, -2, + 68, -42, -63, -3, -77, -12, 92, 14, -61, 46, + 16, 25, 14, -27, 37, 45, -5, 42, 24, -94, + -42, 53, -46, -104, 22, -24, 10, 7, 57, -28, + 17, 6, 38, 35, -41, 45, -18, -8, 34, 63, + 2, -59, 43, -37, -51, -10, 7, -43, 51, 24, + 7, -5, 2, -2, 0, 35, -32, -1, -11, 20, + 24, -4, -43, -33, 12, 18, -49, -113, -80, -62, + -28, -3, -41, -1, -18, -30, -7, -49, 10, -19, + 17, -42, -32, 28, 2, 1, 18, 90, 21, 10, + 67, 18, -11, -59, -17, -45, 55, -67, -3, -68, + -34, 25, -62, 3, -10, -61, -29, -7, -31, -43, + 28, 14, 55, 49, -54, -20, -1, 45, 23, -12, + -40, -67, 38, 43, 83, 12, 6, 19, 72, -101, + -24, 9, 81, 3, 22, 17, 78, -63, -75, -3, + -31, -68, -45, -76, 12, -47, 31, 120, 6, -23, + 1, 14, -74, 17, -13, -32, -27, -68, -19, 100, + -83, 62, -34, -16, -52, -11, 81, 76, -5, -57, + 37, -39, -40, -32, -2, -6, -37, 35, -40, -19, + -51, -26, -2, 18, 11, -11, 55, 38, 28, -24, + -45, -4, -14, -65, -31, 45, -38, 1, -26, 34, + -59, 52, -1, -31, -9, -7, 33, -48, -16, 51, + 14, -25, 36, -7, -13, -9, -52, 47, -43, -31, + 23, -51, -17, 104, -52, -32, -94, 34, -2, -26, + -7, 10, 26, 0, -39, -14, -32, 17, -27, -20, + -28, -28, -5, 13, 21, -56, 19, -3, 48, -2, + -6, 47, -70, 15, 80, 10, 1, 18, -17, 25, + 79, -65, 50, -19, -3, 18, 33, -20, 48, 41, + 60, 27, -75, 39, -24, 50, -61, -72, 43, -8, + -2, -25, 47, 41, 17, -2, 33, 8, 54, 30, + -21, 36, -1, 61, -9, -50, -22, 10, -43, 3, + -19, -3, -32, 17, 40, -8, 4, 29, 15, -15, + -13, -45, -24, -106, -111, -55, -94, 10, -39, -32, + 81, -15, -71, 93, -75, -43, 8, 57, 35, -18, + 9, 18, -46, 42, 13, -47, 30, -111, -46, -6, + -52, 10, -73, 72, 27, -10, -12, -41, -48, 63, + 47, 23, 75, 72, 12, -115, 20, -3, 8, 38, + 65, -5, -11, -61, 80, -29, 48, -38, -41, 16, + 80, -41, 87, -12, -64, -7, -80, 73, -5, -43, + -32, 43, -25, 51, 124, -30, 2, 7, 9, -40, + -67, -35, 10, -13, 0, 60, 105, 74, 22, 93, + 10, 66, -24, 77, 93, 64, -3, 4, 11, 8, + 15, 49, 46, -53, 37, 7, -9, 44, 40, 0, + 42, 34, -7, -45, 82, -34, -57, 69, 53, -5, + 8, -17, -48, 27, 39, -51, 66, -34, -24, 32, + -44, 20, 29, 39, -67, -27, -24, -63, 12, 35, + -48, -1, -5, 3, 49, -13, 19, 3, 10, 75, + 14, -56, 52, -19, -2, 77, 22, 6, -8, -14, + 16, -91, -64, 74, 20, 37, -24, -19, -35, -56, + -38, 10, -29, 26, 14, -20, 32, 69, 30, 76, + 43, -17, 6, -3, -52, 14, 42, -21, 4, -81, + 8, 104, 84, -12, 53, 17, 97, 31, -20, -58, + -10, -22, 36, 62, 38, 47, -39, -22, -29, -3, + -2, 70, 13, 83, 24, -38, 13, 44, -19, -11, + 83, 45, -42, -12, 14, -38, -24, -71, -30, -59, + -13, 21, 13, 10, 25, -62, -34, 73, 25, 16, + -47, 49, -3, -58, -11, -31, -37, 23, -10, 36, + -2, 21, -40, 25, 20, -17, -7, -35, -10, 31, + -37, -114, -16, 22, -6, 9, 28, -64, -46, -43, + -16, -114, -16, 37, 43, 40, -42, -18, 43, 41, + 11, -12, -35, 72, 5, -19, 50, -37, 15, 15, + -22, -42, -39, -5, 18, 35, 36, -21, -56, -40, + 0, 9, -2, 32, 49, -32, -22, -37, 24, 0, + -63, 44, -22, -56, 28, 7, -22, 29, 20, -70, + -24, 55, 73, -20, -24, 47, 21, -73, -53, 14, + -14, 90, 100, 26, 117, -44, -46, -92, -41, 65, + 54, -35, 77, 93, 23, -109, -19, 51, 20, -29, + 62, 20, 68, -4, 53, -50, 39, 55, 35, -64, + -39, -20, -5, 4, -18, 18, 35, 3, 41, -35, + 9, 81, -1, 44, 75, 47, 34, -72, -22, 9, + 50, 11, 76, -19, 65, -24, 9, 36, 10, 36, + 65, -45, 6, -1, 57, -3, 49, 68, -29, -40, + 26, 35, -14, 33, -48, 28, 66, -26, 79, -35, + -55, -55, 70, -48, -11, 30, 5, 12, 49, 90, + 4, 65, 12, -62, 66, 34, -43, -5, 71, 50, + -20, -18, -86, -7, 36, 6, 21, 18, 11, 30, + -18, 0, -37, 68, -102, 11, 35, 25, 48, 51, + -23, 65, 8, 62, -28, -121, 37, -45, 95, 102, + 52, 42, 53, -29, -17, -54, 22, 49, 9, 24, + 85, -32, 52, -25, 36, -79, -61, -43, -17, -42, + 40, -27, 35, -55, 44, -56, -46, -41, -7, 13, + 18, -4, 29, 103, -24, -35, -109, -10, -47, -70, + -42, 46, -5, 60, -48, -37, 32, -1, 27, -25, + 15, -44, 70, -65, 60, 69, 17, -8, 10, -14, + -17, -39, -54, 40, -10, -83, -56, -46, 91, -31, + -35, -4, -33, -19, -45, -20, -15, 20, -21, -16, + 47, 6, -24, -10, -42, 54, 36, -32, 12, 12, + 98, -26, -50, -67, -21, -89, 127, 5, -9, 105, + 48, -38, -79, 36, 1, -28, 20, -127, 80, -63, + 52, -3, 19, 52, 65, 40, -26, -119, -13, 18, + 43, -28, 26, 114, 17, 3, 0, 76, 28, -41, + -3, 125, -7, 31, 51, 62, -90, -71, -35, 49, + 32, 64, 31, 27, 70, 39, 12, 78, -66, -46, + -15, 19, 38, 62, 25, 20, -38, 7, -10, 3, + -6, -19, -1, -54, 40, 32, -52, 11, -61, -27, + 54, 21, 27, -26, 5, -12, 1, 9, 21, 18, + -52, 30, 15, -4, -22, 20, -3, 25, 63, 2, + -12, -40, 48, -14, 25, -54, 39, -53, 39, -49, + -107, -96, 74, -75, 63, -17, -101, -52, -29, 99, + 5, -42, -4, 28, -16, -69, 46, 6, -15, 66, + 28, -42, -73, -98, -47, 40, -33, -72, 49, 71, + -26, 7, 23, -64, 22, 32, 51, -9, 55, -71, + 3, -26, -29, -68, -82, 15, 56, -6, -53, -54, + -77, 29, 92, -36, 77, -38, -11, 48, -46, -50, + 16, -38, 105, -67, -25, -37, -10, 71, 36, -68, + 71, -25, -55, 41, 7, -52, -44, -6, -63, -30, + 15, 70, 55, -27, 22, -16, 45, -45, 44, -42, + -80, 39, 71, -9, 0, -65, 18, -14, 54, -24, + -18, 25, 0, -17, 57, -24, 49, 29, 19, 22, + -8, 2, -93, 2, -84, 9, 19, -64, -47, -12, + 1, -17, -15, 17, -46, -41, -27, -22, 64, 12, + -24, 8, 12, 21, 32, 35, -26, -20, 13, 14, + 39, -82, 58, 28, -52, 16, 28, -36, 24, 17, + -27, 91, -2, -44, -6, -21, 47, -34, -7, -59, + -14, 15, -9, -45, -39, -55, 38, -33, 49, 45, + -127, 34, -54, -37, 3, -59, -1, -59, -32, 97, + 34, 30, 96, 32, -53, -39, 76, -44, -62, -43, + 6, -46, -127, -96, -41, 82, -18, -7, -11, -10, + -18, 24, -23, 9, 29, 12, -7, 75, 45, 55, + 13, -24, -5, 9, -80, -35, -4, 41, 31, -47, + 22, 5, -71, -4, 57, 26, -49, 11, 17, -35, + 0, -22, -4, 36, 36, 11, 14, -13, -13, -13, + 10, -25, -13, -10, 93, -78, -66, 20, -34, -7, + 20, 25, -16, -37, 19, -1, -33, -25, 63, 45, + 16, 56, -4, 11, 32, 36, 14, 45, 32, -80, + 68, -13, 47, 12, 68, 64, 49, -32, 67, -53, + 69, 4, 32, -1, -13, -50, 20, -38, -41, -64, + -34, 14, 32, -97, -42, 43, 43, 6, -17, 26, + -18, -63, 60, -60, 29, 24, -16, 62, 2, -56, + -50, 82, -30, 6, -3, 3, 2, -23, 25, -92, + -26, -36, 4, -37, 43, -3, -11, -29, -19, -49, + 34, -59, -81, 28, -42, 13, 4, -72, -9, 10, + -103, -44, 40, -70, 55, -34, -20, 19, -51, 29, + -33, -16, -42, -97, -73, 17, -27, 23, -8, 41, + -87, 19, 12, 11, 22, -32, -28, -10, -23, -22, + -13, -49, 6, 33, 33, -54, 50, 0, -52, 32, + -43, -78, -18, -28, 72, 77, -29, -104, 36, -73, + -15, 52, -26, 17, -2, 83, 42, 1, 17, 36, + -5, 24, 57, 30, -22, -19, 10, -22, -40, 32, + 21, -31, 17, 6, -69, 5, 15, 41, 38, 13, + -32, 2, -3, 32, -109, -86, -61, 24, -56, -12, + -12, 7, 22, 20, -78, -8, 41, 13, 12, 32, + 0, 21, -21, 11, 125, 56, -18, -106, -25, -58, + -19, 59, 32, -1, 40, -71, -52, 10, -47, 23, + -19, -3, 7, 50, -68, -37, 10, 12, -21, 17, + -14, 8, -29, 67, -32, -108, -49, 18, 23, 46, + 16, 41, 26, -32, -30, -48, 9, 49, 48, -14, + 27, -24, -86, -2, -2, -47, -1, -101, 0, -42, + 5, 14, 89, -48, 68, -102, -11, -3, -53, -15, + -14, 0, 20, 5, -108, 40, 0, -30, 38, -44, + -18, 32, -42, -2, 23, -19, 30, 37, -38, -53, + 6, 49, -72, 11, -52, 50, 20, 10, 65, -45, + 28, -55, -24, -25, -42, -7, -124, 22, 56, -123, + -104, -24, 99, -79, -16, -60, -17, -32, -14, -55, + 25, -34, 1, 16, -36, 61, -19, 2, 18, 41, + 68, 23, 8, 29, -11, 84, 73, 61, -19, 50, + -21, 42, -20, -107, -2, -12, 38, 42, 23, 127, + -70, 35, 27, 26, -24, -48, -15, -48, 56, 51, + -33, 56, -61, 46, 83, 25, -41, 35, -19, -29, + -71, -38, 29, 12, -63, 41, 58, -49, 25, 17, + 54, -68, -14, -6, 1, 14, -16, -28, 60, 62, + -46, -46, 53, 50, -84, 0, 55, 33, 22, -12, + -116, -16, -71, 2, 95, -5, -18, -91, 16, 9, + 1, 34, -6, 125, 6, -55, 5, -34, 5, -28, + 31, -21, 65, 31, 39, 87, 64, 6, 43, -78, + 62, 59, -76, -46, -36, -8, 47, -42, -30, -22, + 4, -22, 22, 8, -38, -57, 1, 46, -18, -62, + 17, 27, -31, -65, -1, 48, 63, 30, 98, 66, + 1, -10, 22, -63, -66, 6, 1, 1, -1, 35, + -69, -47, 39, 12, 51, 40, 59, 30, -24, -54, + 9, -12, -6, -127, -99, 13, 22, 53, 36, -86, + -76, -53, -16, -29, -54, 29, -20, -8, -49, 1, + 12, -48, 16, 11, 25, 26, -21, -48, 12, -6, + -58, -9, 17, -4, 64, -44, -63, 9, 2, -45, + 27, -39, -5, 39, 56, 46, 26, 10, -9, 60, + -65, -42, 31, -17, -32, -30, 0, 34, 19, -64, + 18, 38, 91, -3, 19, 26, 25, -18, -1, 32, + 82, 75, 127, 74, -3, 72, -34, 26, -40, -32, + -55, -63, -24, 5, 50, 79, 6, -64, -81, -14, + 32, -17, 39, -33, -33, 26, -13, -9, -16, 10, + -58, -5, 4, 65, -14, 31, 33, -53, 5, -30, + 52, -59, -28, 28, -40, -2, -2, -33, -3, 33, + 12, 11, 59, -10, -35, 27, 18, 57, -12, 15, + 63, 92, 36, -17, 16, 67, 68, 16, -11, -11, + -29, -7, -97, 19, 30, -80, -32, 7, 17, 55, + -8, -21, -78, 15, 18, -78, 56, 59, -4, -38, + -65, -8, 94, -25, 32, 15, -58, -50, -49, -58, + 63, 35, -43, 47, -2, -52, -30, -13, -78, -29, + -32, 5, 63, -32, -59, -9, -50, -35, 71, -23, + -27, 48, 50, -50, 3, -31, -6, -30, -40, 39, + 21, 25, -33, 40, -23, 52, 41, 9, -7, -19, + -9, -51, 49, 4, -16, -41, 3, 66, 3, 15, + 4, -80, -44, -30, 82, 38, 31, -26, 17, -5, + 40, 39, -47, -87, 54, 77, 32, -45, -24, -1, + -16, -22, -33, -57, 8, -23, -50, -14, -1, 30, + -16, 8, -18, -53, 45, -2, 79, -13, -17, 43, + 1, -62, 20, -12, 31, 16, -29, 8, -20, 38, + -57, 49, -8, -52, -57, 13, -28, 7, 0, 57, + -40, -32, 39, 5, 11, -16, 34, 28, -69, -25, + -2, 23, 73, 56, 2, -103, 30, 6, 53, 13, + 19, -97, 66, 5, -35, -47, -14, -49, 66, -19, + 4, 30, -7, 21, -16, 2, 39, 13, 12, 26, + -41, 19, -16, 10, -24, -8, 57, -48, 43, -63, + 65, -56, 47, -43, 85, 66, 22, -49, -30, -19, + 30, -47, -122, 42, -7, 42, -1, -111, 12, -85, + 54, 18, -42, 6, -36, 26, 4, 66, 7, -43, + 54, 13, -25, -63, -50, 9, 78, -16, 19, 50, + -38, 36, 42, -2, -75, 57, -26, 48, 43, 109, + -10, 10, 8, -50, -126, -38, -62, -29, 24, -15, + 5, -27, -24, -74, 51, 92, -6, -43, -5, 23, + -14, 49, 63, 14, -13, -31, 40, -23, -53, 5, + 20, -94, 7, 44, 56, -38, 73, 76, -11, 9, + -40, -28, -7, -27, 1, -50, -30, -23, 98, 19, + -53, 21, -42, 24, 32, -32, 1, 55, 17, -29, + -49, 53, -41, 21, 69, -30, 20, 20, -19, -39, + -62, -54, -27, -14, 28, -8, -21, 26, -48, -3, + 52, 85, -42, 40, 36, 16, -92, 43, 29, -82, + -49, -9, -42, -17, -10, 64, -85, -89, -38, -2, + 49, -25, 3, 17, 0, -26, -10, 16, -57, -81, + -22, -18, 107, 23, -14, -11, -2, -58, -31, -34, + 39, -40, 6, 1, -63, -32, 37, 16, -52, 36, + -8, -51, 47, -16, 35, -8, 24, -12, 46, -47, + -23, 48, 29, -3, -47, 20, 12, -54, -15, 40, + -3, 78, -1, 1, -14, -25, 62, -23, -34, -31, + 27, -36, -76, 48, 7, -47, -69, 22, -19, -18, + 0, -94, 63, 3, -54, -9, 21, -33, -4, -10, + -35, -7, -62, -97, 11, -52, 3, -25, -75, 21, + -9, 38, 36, -26, 3, 60, -29, 79, -32, 18, + -7, -43, 59, 21, -23, -38, 89, 69, -51, -38, + -55, -16, 1, 58, 11, -91, -32, 37, 61, 27, + -66, -13, -35, -62, 15, 8, -59, 16, 13, 4, + 57, 38, -28, -16, 53, -31, 38, 32, -26, -33, + -87, -2, -87, -28, -41, 29, -56, -15, 54, 52, + -10, -42, -68, -16, -10, 61, 15, 50, -33, -5, + 32, 1, -81, 3, -26, -55, 2, -22, -20, -53, + -7, -53, 56, 88, 44, -25, 82, -30, 18, 25, + -12, -14, 38, -15, -91, 20, 63, -57, 67, -31, + -2, -31, 1, 7, 38, -34, 35, -29, 21, -13, + 73, -23, 24, 48, -5, -38, 24, 67, 41, 14, + 6, 18, -39, 75, 33, -120, -89, -37, -71, -49, + 22, 50, 57, 39, 28, -26, 44, -48, -19, -3, + -9, -1, -46, 26, 1, -51, -21, 2, -9, -93, + 35, -47, -42, -19, -22, -27, 18, 57, -2, 87, + -23, -117, 10, 13, -45, 123, -84, -64, -18, 0, + 54, -98, -8, 28, -57, -15, 11, -15, 1, 38, + -45, -22, -38, 31, -13, 4, 71, 84, -28, 44, + -18, 4, 29, -58, 9, -27, 28, -50, 39, 7, + -6, -66, -69, -48, 7, 45, 48, -32, -93, -1, + -34, -25, 2, -11, 2, -26, -7, 8, -17, 16, + -23, 4, 0, -58, 53, -27, 11, -3, 38, -26, + -11, -26, -36, 65, -41, 39, 36, -29, -10, -94, + 45, 16, 40, -46, 20, 12, -4, -52, -104, -29, + 38, 63, -34, 18, -21, -77, -22, -28, 34, 23, + 83, 47, -65, -28, 21, 71, 5, 56, 6, 12, + 8, 91, 16, 43, -11, 10, 53, -46, -43, -69, + -70, -42, 18, -22, 56, -25, 39, 4, 27, 52, + 6, 0, 88, -89, -20, -46, 32, -17, 42, 25, + 46, 27, 1, 29, -15, 20, 17, -51, -21, 53, + -3, -17, 63, 53, 61, -32, -9, -12, -24, 19, + 21, 8, -3, -8, 47, 44, -39, -6, -20, 11, + -35, 35, 64, 56, 26, -21, 29, -1, -29, -16, + 13, 9, -24, -105, 28, 16, 3, 66, 50, -25, + -52, -30, 52, 45, 17, -34, -33, -41, -30, 4, + 38, -6, 43, 18, -33, 19, 14, -9, 13, -35, + -46, 33, -38, 23, 39, 0, -73, -41, -23, 40, + 4, 20, -28, 50, 32, 7, 21, -67, 9, -32, + 79, 2, 22, -6, 32, 58, 43, -91, 60, 43, + -90, -10, -19, 4, 58, -103, 14, 49, 20, -41, + 2, 20, -15, -104, 13, -44, -33, -55, 45, -121, + -13, -50, 51, 54, 8, 11, -17, 56, 18, -30, + 55, -49, -30, -43, 45, -38, 39, -11, 16, -20, + -32, -45, 12, -15, -34, -38, 52, 12, 0, -65, + 31, -30, 51, -69, -19, 42, 19, 13, -43, -2, + 31, -1, 20, 63, -51, -29, 22, 22, 27, 28, + -46, -20, 2, 33, -2, -12, -16, -5, -46, 11, + 64, 22, 62, 6, 31, 7, -5, -32, 42, -22, + 10, -24, 35, -43, -27, 1, 36, 34, 58, -5, + -30, 25, -22, 67, 38, -20, -42, -81, 30, -67, + -23, 21, -23, -8, 56, -19, 4, 3, 55, -44, + -67, -86, 26, 33, -24, -44, 26, -82, -34, -13, + 12, 18, 47, 62, 51, 77, -46, -43, -24, -14, + 39, 15, 60, -16, 12, 13, 2, -42, -1, -30, + -23, 31, -36, 34, 9, -26, -25, -11, 61, 13, + -99, -2, 60, 15, -36, 15, 4, 21, 27, 19, + -34, -58, 70, 58, -8, 85, 3, -55, -12, -57, + 31, -58, 55, -32, -9, -51, 65, 92, 59, 12, + -25, -63, 24, 24, 5, -46, 1, -12, 8, -58, + 19, -18, -5, 31, 67, 20, -4, -49, -42, 0, + 7, -35, -14, 25, 23, 29, 57, 35, 4, 39, + 62, -35, 25, -57, -64, 25, 43, -4, 61, -12, + 47, 13, 55, 26, 29, -18, -14, 4, 22, -20, + -85, 18, 53, -47, -31, -42, 4, 45, 64, -44, + 36, 21, 16, 13, 15, -54, -47, 10, 63, 7, + -75, -1, -14, -28, 85, 47, 8, 26, -53, 57, + 37, 40, 64, 5, -40, 34, -31, 31, -87, -57, + 10, -22, -66, -31, 8, -61, -10, -52, -39, 32, + 52, -9, 13, -7, 34, -24, 66, 33, -13, -5, + -37, -62, 25, 32, -3, -7, -18, -31, 54, 13, + 23, -1, -36, -40, 13, 39, 115, 2, 8, -28, + -12, -96, -42, -10, -36, 1, -54, 61, 56, 21, + -45, -20, 25, 67, 41, -17, 32, 3, 40, 37, + 21, -30, 55, -13, -74, 4, -103, 24, -8, -3, + -67, 8, -16, 58, -22, 66, -46, -1, -15, 21, + 2, -66, -39, 8, -32, 39, -31, 40, -65, 19, + 5, -36, 48, -14, -114, 15, 50, 69, -19, 35, + -31, -11, 30, 19, 87, -22, 23, -50, -24, 66, + 96, 39, 90, -106, 40, 54, 6, 19, 26, -31, + -19, 14, 57, -4, -64, -91, 10, 27, -100, 25, + -35, -35, -6, 59, -53, 0, -1, 80, -48, 5, + -87, 19, 32, -24, 9, -61, -49, 8, -17, 8, + -24, -32, -50, 26, 76, -20, -41, -100, 12, 19, + -26, 44, -14, -17, 3, 7, 73, 8, -27, 6, + 16, 51, -29, -42, 97, -30, -9, 34, -79, -1, + -23, 2, 17, -71, -9, -18, 6, 5, 14, 25, + -32, -5, 13, -84, -32, 7, 64, 29, 49, -28, + 32, -29, -28, 17, 13, -56, 73, -39, 9, 47, + -18, 39, 26, 15, -28, -20, 44, 39, 111, -23, + -7, 40, -10, 51, -1, 14, 36, -13, -32, 22, + 21, -42, -47, -6, -3, 40, 13, -32, -69, -92, + 2, 4, 1, -11, -83, 37, -18, 23, -51, -60, + 28, 85, 6, 7, -70, -27, 23, 59, 43, 46, + -43, 83, -19, -53, 32, -29, 28, 12, 53, -2, + -22, 63, 3, 4, -1, 42, -14, 5, -23, 50, + -75, -16, 3, 19, 2, -25, 53, 25, -8, 18, + -4, 25, -66, -30, 41, -72, -15, -32, -41, -57, + -37, 15, -46, -75, -4, -7, 11, -20, 64, 5, + 38, 63, 19, -3, 29, -28, 80, -39, 57, 29, + 25, 8, 7, 57, -31, -12, -45, 29, 43, -48, + 66, -22, 18, -49, -65, 52, 44, -66, 4, 27, + 18, 40, 38, 18, -27, 20, -42, -24, 26, 1, + -33, -6, 43, 86, 43, 6, -10, -43, 66, 52, + 16, 29, -21, -57, -16, 1, 3, 1, 60, -16, + -53, -73, -37, -14, 72, 39, -14, 70, 52, 72, + 28, 73, 30, 29, 46, -12, 18, 7, -26, -23, + -18, -80, -62, 0, -29, -17, -21, -9, 33, -56, + 58, 51, 8, 12, 54, -10, -39, -15, 51, -16, + 8, -3, -48, -22, -15, -39, 5, 102, -40, -57, + 53, 14, -66, -78, 84, 48, 9, 39, 38, 42, + -80, -8, -8, -47, 62, -55, -44, 33, -6, 29, + 9, -4, 38, 47, 10, 6, 27, -19, 2, -34, + -14, -40, 85, 33, -30, 22, 76, -28, -69, -3, + -57, 38, 97, 41, 22, -19, -107, -31, 4, 72, + -4, -46, -9, 28, -27, 2, 43, -31, -37, 34, + -42, -49, -2, 19, -77, -20, 2, 13, -30, -66, + -26, -15, -21, -52, -11, 11, -28, -103, -51, -5, + -6, -108, -28, 6, -20, -1, 46, -26, -55, -30, + 12, -61, -31, -8, 7, -22, -43, 72, -63, 73, + -65, -53, 48, -77, 21, 13, -19, -3, -36, -19, + 56, 61, 16, -49, -61, 35, -20, 7, 16, 58, + 2, -1, -32, 25, -55, -36, 14, -59, 9, -91, + 37, -12, -59, -1, -38, 25, -31, 6, 52, -10, + 9, -31, -47, -47, 64, 33, -18, -15, -11, 57, + 47, -26, -32, -50, -45, -36, 18, 16, 16, -30, + 38, 32, -60, -72, 7, 39, 49, -13, -7, 36, + 13, -33, -7, 58, 17, 0, -86, 50, -8, -21, + 6, -17, 1, -22, 30, -47, -4, -51, 14, -2, + -46, -29, -22, -55, 13, -84, -48, -78, -6, 27, + -10, -29, 35, 73, 18, 24, 55, -20, 41, 61, + 34, 28, -86, 13, 69, 57, -20, -20, 37, -92, + 47, 34, 1, -6, 50, -105, -36, -28, -33, 40, + -26, -63, 31, 13, 38, -15, 35, -9, -49, -43, + 47, 54, -49, 69, -1, -65, 30, -10, -8, -88, + -50, -25, 64, 52, 74, 7, 10, 2, -74, 10, + -12, 16, 18, -19, 16, -5, 42, 38, 7, -10, + 6, 24, -25, -35, -5, -5, -32, -1, -46, -26, + -33, -69, 42, 2, -31, -61, -5, 9, 32, 57, + 9, 44, -35, -31, -22, 52, 67, 59, 41, 19, + -16, -72, -40, 19, 81, -79, -17, 23, -79, 20, + -15, -46, -53, 3, 3, -25, -21, -14, -48, 9, + -45, -58, -127, -46, 42, 50, -81, -1, 19, -22, + 50, -63, 51, 0, -40, -104, -49, -8, -5, -71, + -59, 50, -47, 35, 17, 5, -41, -45, 78, 91, + -30, 8, -53, -68, 21, 10, 113, -27, 36, -37, + 61, 17, 29, -34, -37, -19, -50, 57, -34, 69, + -51, 59, -15, 52, -39, 28, 45, -90, 31, 40, + 23, 4, 31, -34, -24, 40, 30, 63, 49, -65, + -32, -6, -40, 61, 47, -28, 27, -18, 46, 19, + 7, 2, -20, -6, -16, 57, 43, -32, -76, -10, + -50, -20, -127, -35, 21, -2, 93, -27, -39, 77, + 12, -53, 6, 9, 39, 27, -1, -25, 62, 18, + 33, -15, 15, -5, -71, -15, 27, 10, -27, -28, + 18, 6, 4, -12, -18, 27, -37, 39, -31, 35, + 12, 58, 63, 50, 7, -50, 41, 34, -23, 19, + -10, -6, -60, 97, 93, 53, -31, 108, -99, 93, + 46, 58, 9, 14, 7, 15, -98, -45, -34, 19, + 66, -40, 32, 14, -3, -62, -44, -43, 17, 69, + 40, 20, 40, -22, -81, 25, -59, 33, -14, 16, + 53, 31, -67, -60, -127, 38, -10, -57, -25, -62, + -35, -111, 4, 51, 19, 48, -86, -53, -30, 72, + -24, -27, -61, -3, -44, 16, -53, 20, -36, 11, + 10, -49, -28, -48, 9, 45, 58, 81, 10, 39, + -71, 32, -46, 34, 3, -13, -76, 4, 75, -14, + 27, 36, -108, 67, 1, -69, -62, -16, 24, -64, + 13, -5, -41, -52, 39, -37, -40, -42, 26, 94, + -38, -39, -14, -14, 34, -16, -50, -51, -1, 20, + -40, -5, -23, -41, 30, -19, -35, -44, 15, 66, + 4, -34, -62, -9, 117, 1, -24, 60, -8, 27, + -29, -19, 20, -15, -65, -43, -15, 69, 49, -64, + 21, 41, -56, 52, -59, 32, 40, -30, -10, 15, + -71, 48, 4, 28, 2, -71, 72, 18, -56, 82, + -32, 40, 5, 9, -59, 22, 65, -21, -38, -12, + -44, -1, -32, 5, 11, -30, 31, -12, 43, 13, + 10, -44, 15, 15, 7, 19, -28, -34, 1, 59, + 14, 7, 30, -22, -55, 70, -2, 2, 26, -41, + 59, 3, -67, 49, -55, -8, 29, -31, 30, 6, + 68, 42, -18, 43, 9, 36, -54, 11, 31, -55, + -7, -35, -28, 63, -51, 7, -30, 70, 56, -50, + 33, 15, 52, 25, 67, 48, 6, 57, 6, 64, + -17, 27, 19, -7, 43, 44, -94, 114, 47, -19, + -43, -8, 1, -5, 61, -5, 32, -54, -20, -13, + 44, -23, -46, 18, 10, -20, 17, -4, -48, 20, + -33, -96, 31, -10, -27, -65, 15, -21, -37, 32, + 7, 7, 56, -61, -25, 25, 35, 51, 20, 38, + -7, 56, 63, -10, -36, 44, 6, 18, -27, 76, + -4, -55, -43, 14, 60, 25, -35, 9, 47, -68, + -33, -50, 24, -53, -36, 11, -48, 8, 43, -81, + -23, -93, -47, -5, 17, 71, 4, 4, -26, 11, + -29, -61, -24, 47, -111, 42, 20, 18, -62, -98, + -71, 28, -85, -38, -100, -110, 33, 24, 5, -109, + -33, 46, 50, 28, 53, -65, -36, -15, -46, -36, + -16, 1, -31, -8, 11, -5, 43, -10, 41, -44, + -4, -26, -29, -69, -101, 16, 46, -2, 47, -44, + 70, -59, 30, 35, 75, 46, -26, -46, 43, -44, + 83, -34, 48, -85, -119, -127, 17, 29, 36, -71, + -74, 17, -39, -10, 10, 36, -13, 55, -28, 40, + -43, -33, -97, -11, -42, 36, 50, 44, 54, 53, + -54, 39, 44, 9, 57, -10, 18, -55, -11, 47, + -2, -60, -35, -43, -52, 30, 6, 39, -45, -62, + 12, -83, 25, -66, -25, 30, -41, 93, -22, -12, + 44, 19, 6, -22, 89, -32, -38, 42, 101, 72, + -34, 10, 45, -22, -40, -77, -35, 29, 38, -73, + 4, 0, -9, 45, -46, 37, 22, -127, 5, 27, + 21, 58, 22, -25, 59, -1, 58, 3, -46, -7, + 69, 30, 11, -21, 89, 6, -17, 9, -61, 25, + -42, 36, -105, -19, -41, -9, -65, -57, 13, -78, + -31, 39, 78, -68, 64, -2, -27, 16, -20, -120, + -58, -38, -14, -36, -56, -36, -32, -108, -32, -94, + 3, -47, 81, 1, -10, 46, 1, -19, 79, 28, + 23, -36, 27, -2, -2, 29, 40, 41, -19, -51, + 77, 33, 82, 17, 55, 50, -3, 14, 51, 36, + 18, 27, 0, -51, 38, -93, 45, -46, 32, -27, + -56, 14, 13, 48, -47, -17, -45, -29, 81, 21, + -87, 22, 63, -124, 37, 86, -47, -24, -59, -32, + -6, 12, 18, -18, -67, -72, -10, 71, 43, -33, + 15, -5, -30, -127, 12, -92, 40, 29, -19, -114, + -29, 65, -28, -1, 7, 4, -51, 4, -16, 0, + -25, -3, -82, -45, -11, -71, -39, -10, 8, 65, + -57, -24, -30, -23, -51, -13, 84, -84, -48, 12, + 40, 42, 8, -11, -18, -40, -116, 41, 3, -17, + -55, -9, 99, 83, -32, 1, 56, 51, -24, 59, + -27, 29, 5, -36, 13, 3, -5, 43, 52, 33, + -1, -18, -47, -23, 52, 42, 68, -64, 65, -6, + -15, 34, 32, -21, 1, 18, 28, -26, 64, -3, + -70, -37, 6, 38, -9, -22, 26, 11, 36, -5, + -6, 15, 11, -27, -1, 26, -12, -84, 19, 5, + -27, 37, 35, -35, -49, 8, 12, 10, 21, -51, + -55, 15, 67, -33, 0, -3, 27, 0, 18, -59, + -23, -15, -40, -20, 2, 56, 27, -44, 39, -47, + -12, 2, 21, 75, -3, 52, -15, 3, -14, 3, + 21, 45, 43, 34, 79, 80, -69, 15, 61, 39, + -6, 6, -4, -12, -121, -2, -127, 20, -60, 59, + -42, -19, -10, 30, 34, -8, -18, -11, -8, 14, + -5, 36, -3, -36, -72, 43, -54, -51, 57, 12, + -37, -36, 20, 2, 24, -6, -59, 43, 0, 37, + -25, 15, -63, -85, 12, 3, -77, 56, -57, -59, + 26, -76, -49, -124, -62, 25, 83, -15, -17, -53, + -9, -53, 31, -85, -37, 5, -64, -46, -127, 33, + 21, -5, -105, 32, 57, -36, -21, -41, 69, -56, + -59, -27, -16, -10, 37, 71, -7, -127, 0, -55, + -69, -71, 79, 49, 14, 80, 39, 10, -21, -82, + 32, -52, 6, -74, 25, 64, -36, 2, 7, -1, + 37, -45, -44, 4, -56, -36, 20, 62, -109, -29, + -63, 2, 53, 18, 97, -30, 97, -7, 44, 22, + -35, -80, 91, -24, -58, 12, 6, 55, 50, 15, + 30, 19, 21, 6, -69, -48, 45, 51, -72, 32, + -51, 47, -3, -93, -27, 0, -7, 39, -35, -40, + 27, -18, 4, -22, 13, 30, 32, 13, -25, 33, + 69, 21, 18, 33, -31, -31, -63, 46, 29, 58, + 92, -48, -5, 23, 21, -27, 16, 26, 15, 2, + 28, 11, 53, 12, -80, 6, 23, 30, -127, -21, + 14, 30, -61, 35, -24, 21, -93, 44, -8, -42, + 24, -8, 6, -34, 72, 15, 78, 46, -45, 20, + 18, 74, 16, -13, 44, -40, 46, -27, -9, -55, + 16, -14, -12, -7, 46, 1, -40, 5, 38, 26, + 18, 41, 50, -37, 32, 39, 77, -15, 58, 87, + -6, -66, 57, -5, 37, -4, 64, -63, 63, -33, + -47, 107, 27, -63, -57, -67, -59, -72, -2, 52, + -127, 18, 40, -9, -70, 35, -41, -68, -60, -56, + 32, -10, -35, 46, 65, 63, 81, -10, -56, -60, + -32, 46, 56, 4, -3, -47, -36, 29, -5, -42, + -59, -32, 20, -50, -44, -54, -83, 53, -71, -56, + 32, -49, -32, -1, -15, -97, -35, -1, -29, -15, + -27, 17, 23, -13, 9, 33, -53, -23, -12, 66, + -26, 29, 50, -47, -67, -24, 12, 54, -67, 44, + -62, -9, -99, 5, 25, -7, 18, -20, 42, -36, + 59, -42, 112, -17, -84, 5, -36, 38, 49, 18, + -49, 36, 43, -8, 20, -13, -15, -35, -42, -17, + 15, 26, -59, 18, 38, -1, 28, -42, -45, -79, + 15, -18, 19, -25, -13, -67, 7, -74, -2, -2, + -45, 30, -13, 44, 13, -1, -79, -44, -13, -32, + 12, -37, 30, 3, -25, 80, 66, -51, -5, 54, + -50, 36, -100, 19, -19, -13, -84, -40, 62, -16, + 6, -26, -69, -12, 20, -50, 18, -87, -31, -42, + -47, -23, 14, 2, -127, -51, -12, 14, -11, -62, + -88, -19, -53, -68, -24, -53, -93, -18, -4, -14, + -55, -16, 19, -30, -53, 8, 34, -7, 35, 32, + -36, 58, -59, 24, -50, -43, 55, 35, 62, 27, + -72, -39, -16, -28, 7, -50, -2, 29, -18, -4, + 67, -59, 8, 20, 1, 23, -15, -4, 21, 18, + 21, -16, -17, 40, 57, 28, -19, -12, 5, 73, + 55, 46, -28, -19, 55, -70, 29, -17, 33, 2, + -7, 15, 100, 73, -43, 1, 36, 26, -10, -15, + 55, 77, 4, -46, 12, 5, -24, 71, -90, 7, + -63, 30, 48, 4, 16, -44, -15, -11, 35, -48, + 125, 80, 69, -36, -67, -6, 120, 22, 37, -27, + -48, 37, 1, 52, 20, -14, -36, -65, -31, 2, + 49, -44, 23, -63, 39, 67, -25, 26, -118, -63, + -36, 62, -38, 78, 76, 31, -62, 93, 12, 44, + -1, -31, 26, -10, -21, 60, -29, 66, -27, 3, + 59, -89, 15, -60, -24, -2, 52, -69, 64, 69, + -38, -80, -35, 22, 52, 55, -68, 29, 25, -38, + 52, -99, 121, 5, -74, 46, 40, 49, -40, -3, + -7, 8, -12, 11, 7, 31, 20, 51, 71, 7, + -108, -31, 2, -35, 81, -45, 51, -43, 30, 89, + -6, 42, 8, -19, -54, 23, -32, -62, 33, 55, + -46, 10, -13, 64, 32, 29, -47, 93, 74, -6, + -31, -27, -39, -4, 21, -25, -28, 57, -9, 34, + 10, -57, -35, 27, 46, 8, -91, 29, 66, -50, + 38, -91, 15, -69, -54, -68, -19, 56, 7, -92, + -6, 51, -29, 0, -73, -85, 73, 12, 15, 12, + -34, 67, 25, 1, -54, 64, -26, -63, -7, -91, + 34, 10, -20, -47, 55, 53, 8, -81, 90, 40, + 27, 29, 44, 73, -19, -55, 57, -32, -21, -86, + -49, -15, 32, 50, 38, 21, 24, -7, 44, -46, + 53, -37, 36, -19, -45, 24, 58, -28, -8, -19, + 10, 11, -52, 28, -42, 6, -60, 74, 20, 2, + 60, 44, -59, 42, 26, -53, -7, -114, 49, -36, + 51, -12, -7, -4, -67, 71, -57, 24, -47, -7, + 0, -68, 61, 14, -46, -23, 26, 1, 49, 34, + -20, -127, -30, -95, -49, -34, 42, 9, -36, -19, + -38, -41, -69, 41, 20, -10, 61, -66, -9, 17, + -101, -40, 5, -23, -52, 7, -47, 8, -76, 68, + 2, -30, 60, 38, -27, -28, 13, 59, 39, 72, + 21, 0, -22, 75, -58, -61, 7, 63, 20, -10, + -22, 21, 30, -92, -5, -55, -83, 22, 7, 69, + 15, -12, 1, -45, -71, -82, -6, 21, -25, 55, + 65, -7, 32, -42, -1, 26, 13, 67, -29, -18, + 39, -14, 49, -64, 7, -127, -54, -14, -8, 16, + -3, 27, -74, -25, -26, -4, -97, -42, -24, 16, + 32, 57, 56, -2, 33, 51, -74, -6, -53, 20, + 34, -11, -127, 51, 27, 18, -17, -44, 66, 8, + -18, -24, -27, -13, -18, 19, 32, -5, 28, 8, + 62, 2, -46, 10, 21, 33, 54, -2, -69, -33, + -20, -65, -81, -15, 88, -63, 53, -88, -6, -40, + -14, -19, 44, -123, -36, -61, -3, -35, -64, 1, + 32, -24, -62, -5, 23, 47, -33, -56, 75, -33, + -6, 17, -42, -86, 50, 39, -23, 43, 82, 53, + 17, 52, 2, 26, 25, -33, 23, -6, 7, 5, + 0, 43, -4, 8, -43, 19, 7, -13, -16, -63, + 105, -68, 24, -55, -31, 6, 6, -4, 27, 25, + -16, -5, 63, 15, 68, 34, 58, -36, -37, 49, + -16, 51, 35, -19, 57, 23, -12, -33, -28, -3, + -64, 17, 6, 56, 27, -9, -71, -72, 17, -5, + 60, 75, -36, 93, -11, -12, -57, -33, -17, -64, + -35, 25, -9, 4, 40, 42, -49, -91, -66, -87, + 0, 11, 45, 76, -89, 61, -63, -69, 40, 47, + -65, 53, 72, -18, 17, -10, 66, 55, 20, -57, + -4, 77, -30, -15, 11, 9, 36, 20, 12, -50, + 31, 13, -42, -75, 0, 1, 85, 29, -33, -29, + -40, -8, 17, -34, -8, 64, 2, 90, -3, 80, + 6, -37, -15, 4, -20, -13, -16, -42, 23, 34, + 67, -50, 5, 6, 48, -26, -20, -84, -10, 91, + 125, -54, -7, 84, -60, -27, -1, 44, 0, -115, + 5, 14, 75, 19, -44, -58, 23, 73, -29, -60, + -28, 12, 34, 38, 29, 51, 0, -57, -31, -11, + -43, 48, -10, -27, -22, 43, 65, 10, -59, -15, + -14, 44, -7, 66, 66, 3, -11, 4, -19, -19, + 72, -25, 5, -54, -77, -10, 3, 28, -42, 33, + 65, 19, 91, -38, -77, -33, 14, 24, -32, -18, + 33, -44, -127, 43, 46, 91, 20, -33, 34, 22, + 4, -4, -92, 24, -15, 4, -26, -16, 5, 61, + 5, 11, 29, 37, -9, -19, -60, 30, 35, -33, + 7, -45, 53, 5, -36, 18, 3, -8, -9, 39, + 4, 19, -40, -74, 63, -19, 35, -18, -68, -62, + 43, 14, 5, -54, 14, 25, 18, -31, 43, 28, + 17, 21, -18, -49, 5, 9, -52, -73, 26, -30, + -18, 31, 65, -62, -67, -1, 25, -32, 69, 26, + 103, -55, -34, -11, 33, -14, -46, -19, 41, 35, + 35, 16, -78, 36, -48, 91, 21, 57, 77, 54, + 71, 97, 23, 26, 17, 82, -34, -51, -14, -107, + -20, 43, 14, -85, 82, 0, 41, 39, 63, -91, + 47, -26, -36, 42, -25, 65, -12, -30, -5, 30, + 32, 8, 16, -58, -44, -2, -33, -73, -1, 13, + 15, -18, -19, 10, -3, -35, 6, -25, -45, -50, + -110, 55, -76, -27, -38, -1, 14, 39, 66, 58, + -8, 34, 43, 20, -56, 6, -32, -54, -45, -82, + 25, -15, 25, -15, -17, 3, -6, 14, 2, -105, + -9, 9, -19, -7, -6, 11, 11, 23, 24, -74, + 53, 30, 44, 59, 79, 57, -56, 28, -10, -76, + -78, -3, -59, -50, 55, -47, 29, 64, -72, 8, + -16, 5, 16, 39, -8, -100, 5, 75, -15, -82, + -4, -17, -104, 46, 53, -17, -1, 47, 76, -27, + 69, -29, 2, -14, 56, -68, -36, 26, -10, -18, + -1, 58, -72, -7, 27, -48, 64, 79, 27, 18, + -28, -62, -15, -23, -42, 46, -1, -49, -10, -30, + -8, 61, -53, 7, 46, -34, 34, -21, -36, -4, + 10, 27, -43, 0, 57, 70, -27, -37, 0, 30, + 36, -24, -14, 90, -20, -19, -9, 38, 9, -38, + -63, -21, 33, 35, -51, -2, 32, 66, 42, -6, + -47, 15, -86, 68, 110, 55, -35, -12, -21, 2, + -53, -7, -26, -15, 4, 9, 47, -78, 9, -12, + -22, -7, 18, 35, -20, 14, -37, 41, 33, 45, + 64, 70, 59, -17, 24, 0, 49, -3, 73, 62, + -28, 24, -15, 26, 53, -21, 10, -43, 11, -9, + -19, 27, 29, 44, 39, -42, -3, 83, -12, 101, + -22, -45, -109, -7, -6, 26, -6, 34, 47, -70, + 28, 45, -43, 7, 26, 77, 56, 6, -72, 78, + 21, 39, 65, 17, 17, -105, 61, 8, -16, -12, + 42, 0, 26, -38, 60, -24, -13, 33, -35, 25, + 36, -47, -20, -42, 3, 72, -52, 97, -7, -53, + 24, 27, -33, 5, 43, -20, -37, -1, -50, -44, + 31, 21, -24, -33, -78, 41, 39, 29, -35, -23, + -2, -3, -15, 3, 18, 12, 52, -7, 5, -21, + -3, 75, -75, -51, -1, -54, -36, 12, 52, 54, + 0, 63, -41, -21, -15, -13, -70, 22, 58, -66, + -17, -35, -8, -85, -33, 24, 44, 10, -21, 59, + 43, 66, 26, 68, -99, -38, -91, 54, 58, -10, + -2, 78, 26, 3, -52, -35, 5, 22, -37, -23, + 13, -73, -13, 23, -57, -53, -64, 46, -11, -77, + -37, 37, 38, 43, 33, -27, -15, -36, 26, -17, + -32, 4, 50, -4, 64, 50, -2, 10, -23, -26, + 19, -20, 35, -7, 9, -22, 21, -17, -64, 8, + 59, 74, -46, -45, 33, 10, 43, -24, 37, 36, + -2, -44, 67, -22, 40, 30, -48, 10, 36, 40, + -83, 62, -21, 54, 30, 75, 30, 14, -62, -12, + -13, 29, 52, 12, 23, 43, -24, 13, 45, -49, + -2, 3, -33, 20, 3, 6, -37, 59, -7, 5, + 77, 90, -33, 56, 90, 14, 16, 9, -7, 59, + 70, 9, -18, 18, 72, 50, -102, -52, -13, -30, + -31, 12, 27, 55, 12, -95, 8, 7, -18, -65, + -28, 49, 96, -37, 62, 42, -52, -81, -88, 28, + 57, 34, 55, -52, -44, -54, -10, 83, 2, 27, + -7, -5, -52, -1, 102, 17, 63, 55, -81, 64, + -5, -17, 34, -37, -23, 7, 53, 2, 39, 24, + 20, -44, -59, -30, 30, 1, -62, -12, 26, 44, + -25, 11, -8, -46, 65, 13, 71, 60, 7, -2, + 45, 27, -3, -87, 10, -62, 17, 85, 35, 32, + 11, 5, 60, 21, -19, -4, -15, 24, 44, 34, + 10, 80, 5, 0, 49, -1, -45, 37, -9, 62, + -90, 95, -24, 36, -42, 27, 42, 66, -32, -28, + -3, -75, 28, 76, -29, -52, 23, 42, 31, -40, + 38, 49, 27, 19, 29, -5, 45, -69, -66, 81, + -37, 2, -26, 1, -3, -23, 18, 21, -35, -7, + -53, -77, 35, -44, -7, 3, -29, -59, -23, -33, + -45, 21, 127, 43, -73, 12, 46, -22, 14, 117, + -7, -13, -59, -45, -6, -24, -1, -10, 37, -108, + -35, -86, -65, -27, 38, -55, -8, 22, 48, 45, + 20, 15, 30, 27, -23, -14, -20, -18, -23, 2, + 41, 13, -23, 11, -17, -33, 3, 40, -5, -26, + -97, -32, -38, -1, -25, 36, 25, 5, -37, -6, + 35, -16, -7, 37, -15, -17, 0, -12, 27, 70, + 0, -26, -76, 50, 17, 4, -40, 1, 33, -7, + 27, -6, 51, -40, -6, -40, 5, 1, 27, -31, + -56, -5, 37, 127, -34, -34, 27, -56, -53, 20, + -1, -15, -3, 25, -20, 4, 3, -18, -65, -107, + 58, 24, -19, 57, 48, 35, -50, 70, 3, 16, + -32, 39, -48, -41, 61, -14, -51, -32, 70, -42, + 21, 16, 61, -44, 8, -58, 29, -36, 52, -67, + -33, -48, 46, 64, 15, 42, -33, 15, -53, -43, + 17, 18, 49, -31, 44, 0, 45, 52, 26, 66, + 15, 50, 47, -6, -14, 11, 50, -8, 124, -7, + -4, 16, 53, 66, -36, -29, 72, 44, 11, -88, + 22, 47, -8, -21, 16, 7, -16, -73, -48, -20, + 23, -27, -95, 8, 0, -8, -28, -34, 25, -43, + -30, 35, -14, -26, -41, 36, 41, -3, -75, -59, + -51, 28, 43, 62, -60, -25, 27, 7, -51, -50, + -36, 29, 48, 0, 48, -10, -52, 31, -33, -68, + 30, -12, -8, -15, -30, -26, 32, -62, 47, -116, + 1, -28, -42, 15, -7, 8, -55, -113, 31, -62, + 16, 66, -55, 15, 28, -14, 124, 2, 32, -106, + -23, -20, -9, -8, 1, 29, 104, 52, 45, -10, + -97, 11, 19, 55, -68, 81, 23, 30, 24, 17, + 16, 49, -10, -4, 54, -32, 30, -6, 32, -67, + -80, -59, -36, -89, -26, 1, -21, 5, 17, 10, + 40, -54, -30, -48, -72, -29, -14, 13, -76, -2, + -24, 4, -28, -40, 127, 26, 67, 43, 70, 32, + 21, 55, 46, -13, -52, 11, -28, 13, 53, 28, + 55, 11, 34, 35, 51, -20, -49, -14, -43, 41, + 49, -55, 48, 26, 57, 78, 44, -101, 92, -14, + 78, -17, 32, 42, -57, 46, 55, -23, -35, -42, + 53, 6, 78, 39, 65, 36, -35, -48, -9, -2, + -15, -17, -44, -57, -28, -33, -15, -47, -12, 43, + 16, -26, -77, 0, 35, 16, 40, -61, -11, -84, + -44, -96, 61, 82, -60, 50, -3, -18, 15, 9, + -28, -43, -37, 4, -22, -34, -17, 13, 11, -23, + 28, -38, -26, -59, -5, 18, 56, -20, 50, 29, + 17, 5, 34, -44, -42, -69, -6, 28, -22, 74, + 55, -8, -23, -27, -4, 7, 45, 3, -101, 26, + 93, 10, 55, -58, -17, 19, -20, -22, 14, 28, + 0, -79, -53, 45, 18, -44, 14, -66, -60, -9, + 64, 66, 3, 11, -28, 30, 19, 24, 42, -49, + 27, 38, -6, 28, 25, -19, -2, 40, 37, -51, + -62, -66, -43, -56, 16, 17, 1, -23, -28, -43, + 14, -8, -29, 84, 0, -32, -44, 7, -85, 50, + 78, 41, -96, 20, 71, -49, -19, -67, -116, -1, + -18, -19, -80, -55, -46, 13, 39, 15, -16, 12, + -34, 35, 22, 19, 17, -92, 39, 49, 61, 79, + -18, 33, 26, 2, 25, 61, -22, -17, 33, 67, + 17, -85, 0, 43, 69, 17, 63, 65, 30, 11, + -29, 37, -27, 9, -24, -50, 7, 43, -10, -21, + -45, 57, -28, 2, -2, 12, -4, -39, 19, -58, + -4, 10, 16, 75, -56, -24, 93, -22, -78, 49, + -36, -37, 0, -4, 2, 8, 46, 26, 8, -38, + 16, 10, -12, -21, 36, 5, -39, -8, 16, -44, + 2, 58, -35, 33, -9, 12, -53, -89, 63, 16, + -123, 48, 14, 90, -78, -45, 10, 27, 2, -98, + 7, 45, -25, 35, -8, -8, 40, 23, 57, 29, + -8, 66, 9, -54, 36, 40, 16, 14, -17, 54, + -40, -56, -2, -6, -39, 6, 51, 117, 97, 29, + -76, -75, 43, -46, 22, 31, -60, -27, -45, -20, + 41, -53, -28, -9, 15, -40, -51, 45, 1, 11, + 37, -46, 59, 1, -2, 19, 127, 70, 40, -1, + -19, 23, -43, 55, -38, 49, -46, 51, -16, 47, + -105, 8, 0, 123, -12, 40, 83, -27, -13, 1, + -27, 51, 37, -17, -2, 16, 46, 13, 47, -16, + -43, 49, 57, -5, 31, 36, -28, -53, -40, 73, + -59, -12, -9, -48, 13, -70, 49, 46, 1, -32, + -10, -43, 8, 7, -57, -79, -42, 38, -18, 40, + -15, -6, 81, 42, 8, -63, 23, -69, 44, -6, + -91, 11, -45, 102, 89, 64, 20, 27, 28, 26, + -37, -82, 116, 43, -35, 19, 14, -77, -81, -114, + 74, -59, -56, 11, 52, -55, -40, -24, 21, -11, + 54, -23, -14, 56, 13, 65, 51, 59, 23, -53, + -31, 63, -40, -5, -19, 11, -44, -20, 2, 53, + -42, 44, 36, -21, 13, 37, -53, 0, 10, 21, + 75, 39, -12, -59, 28, -53, -33, 84, 14, -48, + 12, -33, 27, 3, 23, -33, 34, -6, -77, -70, + 36, -106, 70, 0, 26, 2, 43, 39, 4, 53, + -4, -9, -7, -48, -46, 10, 61, -26, 11, -15, + -14, -9, 27, -43, 30, 63, 72, 5, -46, 59, + 71, -13, -28, -30, 35, -29, -68, 10, -20, -29, + -53, 24, -35, -17, 9, -22, -16, -28, 10, -36, + 80, -31, -33, -57, -23, 26, -6, -19, -10, -21, + 42, -64, 5, 84, 85, -22, -19, -75, 31, -110, + -48, 21, -32, 58, 33, 54, -21, -71, -68, -53, + 36, 69, -23, 31, 43, 0, -34, 25, -47, -21, + 23, -43, -31, -33, -31, 35, -29, -53, 2, 5, + 28, 16, 94, -11, 25, -28, 29, 78, -18, 36, + 19, 83, -85, 9, -20, 2, -24, 43, 127, -40, + 3, -50, -10, -84, -37, -37, -15, -29, 58, -25, + -14, 43, -46, -34, 55, 41, -17, 35, 54, -34, + 73, 50, -60, 73, -58, 45, 68, -79, 49, -6, + 53, -67, -53, -40, -15, -39, 15, 9, 34, -8, + 42, 5, 38, 52, -3, 61, 116, 32, 2, 20, + -29, 58, -69, -66, -26, 17, 60, -33, 45, -31, + -42, 41, 20, 78, -97, -100, 28, -21, -75, 41, + -68, -48, -24, 2, -23, 43, 1, -41, 77, 73, + 11, 34, -26, 30, -61, 51, 25, -65, 25, -34, + 60, 25, 32, -14, 83, 93, -49, -40, 2, 73, + -5, -7, -26, -14, -65, 0, -30, 29, 69, -17, + -2, -84, 35, -25, 7, 73, -66, 41, -8, -25, + 5, 65, 57, 88, -26, 13, 18, -24, -16, 37, + -121, -57, -32, -6, -61, -40, 34, -45, 37, -76, + -45, -39, 71, -9, -1, -74, -21, -12, 70, -25, + 8, -12, -33, 11, -127, -1, 12, -31, 52, 29, + 15, -30, 25, -40, 17, -81, 49, 49, 68, -50, + 53, 40, -32, 7, 45, -8, -7, -26, 37, -16, + 61, 75, 18, 5, -6, -7, 58, -17, 14, 11, + -76, 7, -73, -6, -70, 58, 42, -26, -65, 43, + 51, 31, -91, -27, 71, -69, 0, -19, -40, 87, + 75, -57, 62, -52, -40, -44, -85, 37, -121, 34, + -72, 25, 47, 33, -30, -20, -17, -1, -41, -68, + -6, -14, 48, -55, 1, -20, -38, -64, 8, 30, + 62, 61, -66, -97, 35, -29, 11, 32, 11, 54, + -40, 3, -39, 100, -24, -52, 3, 43, -10, 11, + -79, -87, -34, -40, 18, -13, 2, -38, 45, -69, + -4, 49, 57, 69, 5, 29, -56, 96, 70, 83, + 3, 15, -50, 53, 90, -53, 7, 64, 10, -50, + 11, 55, 17, -73, -34, 70, 33, -24, -69, 26, + -26, 72, 39, 65, 35, 0, -16, -43, -33, -74, + -50, 4, -57, -32, 47, -62, -35, 58, 7, 80, + 16, 43, -28, -28, -10, -57, -54, -36, 50, -6, + -26, -27, -5, -80, 13, 40, 46, -83, -2, 3, + -83, 29, -81, -17, -57, -11, -23, -40, -5, -32, + -6, 3, -77, 25, 20, 39, 20, -18, 0, 21, + 85, -98, -63, -23, 35, -31, 37, -12, 5, 17, + 33, -25, 32, -5, -53, 20, 61, -41, -50, 42, + 41, -41, 30, -46, -44, 61, 13, -13, 13, -48, + -84, 39, -40, -10, 60, -18, -29, 60, -71, -42, + -18, -7, -60, -27, 35, 59, 44, -37, -48, 21, + -39, 25, -7, 35, 10, 42, -24, 10, -70, -21, + -5, -112, -20, 64, 3, -80, -37, 13, -14, 11, + 58, 13, 14, -91, 66, -8, 22, -76, -68, 72, + 1, -18, 16, 45, -45, -70, 25, -19, -21, 75, + 12, -11, -37, 46, -24, 5, 35, 46, 61, 39, + -8, 27, 14, -17, 64, 68, -78, 18, -94, -66, + 26, -127, -47, -13, -12, 79, -9, -37, -61, -61, + -38, -82, -64, -39, 9, 21, -14, -16, 32, -7, + -50, -42, 27, -6, 44, 76, -35, -25, -79, 4, + 49, -50, 45, -2, 27, -54, -18, 111, 11, 87, + -84, 63, -76, 24, -25, -16, -53, 83, 5, -12, + 71, -57, -30, 43, -39, 74, -58, -40, -77, 15, + 51, 127, 40, -41, -55, 30, 47, 3, -22, -13, + 51, 35, 29, -32, -29, -95, -4, -22, 5, -62, + -48, 5, 20, 26, -42, 11, -9, 4, 43, -53, + -70, 0, -14, -10, 36, 80, -1, 17, -35, 49, + 38, -4, -7, -10, 20, 27, 50, -28, -39, -77, + 13, -28, -17, 40, 14, 108, 54, -35, 18, -6, + 38, -8, 64, -8, 35, 13, 17, -13, 78, -73, + -88, -35, -41, 53, 42, -3, -16, -31, 6, -4, + 54, 40, 12, -48, -27, -1, 10, 46, -82, -57, + 49, -16, 47, -50, -5, 50, -1, -12, -4, 43, + -9, -19, 57, -13, -69, -31, 91, -16, -74, -26, + 31, 34, -39, -23, 51, 89, 72, -6, 2, 66, + -33, -103, 1, 36, 44, 90, -75, 2, 2, 72, + -120, -31, -39, 7, -14, -1, 65, -59, -39, -7, + 40, -4, 51, 6, -65, 70, -112, 38, 49, -9, + 15, -57, 8, -63, 24, 32, -6, 24, -30, -87, + -72, -45, -44, 48, 55, -46, -31, 99, 20, 7, + 5, -16, -104, 6, -37, -40, 26, 85, 64, 23, + -50, -90, -45, -21, 22, -108, 24, -16, 69, -49, + 51, -17, 29, 1, -29, -11, 6, -30, 29, 5, + 54, 47, 41, 39, -47, -58, 35, -27, 15, 43, + 73, 46, 51, -5, -21, 41, -3, -4, 20, 61, + 11, 55, -61, 75, -14, -38, -98, -3, -46, -14, + 29, -14, -33, -29, -52, 61, 7, -27, 27, 12, + -39, 14, -31, -40, -14, -30, 41, 35, -44, 9, + 3, -37, 5, 32, 59, 6, -67, 67, 50, -65, + 78, 36, -76, 68, 52, 114, -30, -24, 40, 40, + -5, 45, 61, 12, -5, -31, -6, 20, -7, -44, + 37, 59, -50, -17, 46, 80, 4, 117, 12, 61, + 11, -25, 53, -1, 63, -38, 78, 70, -9, 23, + 27, 10, -66, -87, 6, -44, 36, 40, -4, -76, + -13, 12, -43, -106, -13, 59, 36, 6, -22, 37, + -127, -58, 17, -93, 46, -24, 8, 36, -10, 70, + 14, 34, 15, 4, -25, -18, -37, -25, -6, 33, + -33, -45, -5, -61, -21, 47, 5, 19, -12, -27, + 63, -50, 23, 7, -25, 127, 8, 6, 13, -26, + 115, 3, 65, -2, 42, 32, 47, 28, -71, 62, + 54, -17, 51, -51, 3, 21, -84, -90, 14, -9, + 0, -13, -21, -14, -32, 9, -2, -100, 45, -21, + -22, 57, 27, 14, -85, -15, -75, -15, -47, -45, + 19, 24, -43, -2, 58, 56, 29, 13, 29, -12, + -41, 12, 30, -8, 62, 11, 66, 24, 26, 41, + -59, 41, 61, -118, 74, 67, 23, -58, -41, 15, + 3, -17, -43, 19, 119, 26, -15, 79, -54, 2, + -87, 80, -2, 104, -58, 26, -102, 39, 10, 36, + 35, 48, -22, -43, 58, -13, 36, 14, -37, 15, + 52, -47, 35, -10, 19, -9, 4, 44, -60, 34, + -18, 71, 19, 23, 33, -45, -27, -66, 51, -94, + 55, 90, 36, -94, -51, 13, -26, 24, -46, 2, + -10, -26, -67, -71, -62, 15, 6, -15, 16, -127, + -37, -14, -93, -14, 19, -37, 46, -9, -87, -17, + 50, -23, 67, 3, -53, 106, 28, -73, 28, -76, + 42, 120, 115, -13, 25, 91, 43, -9, -15, -2, + 4, -2, 35, -39, -27, 13, 28, -18, -73, 38, + 29, 45, -77, -18, 87, 67, -11, 60, 72, 23, + 26, 27, 101, -23, 6, 46, -42, -9, 49, 82, + -55, -17, -34, -34, -86, -39, 34, 27, -44, 20, + 34, 72, -70, -76, -30, -34, 0, -121, 58, 14, + -33, 33, 85, 18, -81, -61, 12, -76, -16, 27, + -14, 80, -32, 24, -29, -34, -62, -45, 54, 27, + -114, 59, -21, -41, 9, -35, 14, 2, -4, -12, + -46, -25, -61, 22, 12, 71, -25, 48, 86, 11, + -35, -60, -30, -54, 6, 78, 75, -84, -9, -55, + -22, -46, -29, -17, -30, 89, -48, -29, -56, 29, + 10, -64, -23, -15, 55, -21, -98, -67, -1, 66, + -74, 27, 36, -39, 27, -15, 36, 52, 17, -15, + 3, -17, -58, -59, 14, -78, -59, 8, -29, 11, + -35, 90, 64, 9, -32, 40, -127, -70, 40, -51, + 31, 56, -15, -25, 51, -71, 59, -16, -76, -41, + 49, -25, 123, -12, 51, 54, -55, 89, 24, 17, + -59, 4, -69, 1, 10, -78, -35, 27, -57, -115, + 0, -70, 46, -41, 10, -74, -62, 4, -55, -26, + -38, 25, -26, -2, 13, 47, 1, -26, -7, -78, + -36, 47, -3, -26, 6, 55, -61, -10, 6, 59, + 81, 121, 60, -57, -80, -9, 30, 16, 18, 38, + 8, -23, -45, -28, 28, 56, -16, -65, 0, -24, + 32, -9, 66, -5, 18, 34, -33, -38, -95, -30, + -2, 62, -20, -16, 38, -94, 19, -61, 14, 46, + -41, -15, 21, -108, -4, 33, -37, -8, 70, 29, + -47, -8, 20, -4, 38, -2, -115, 13, 12, -28, + 76, 47, -39, -42, 58, 25, -48, -2, 6, -2, + -41, 34, -53, -14, 23, 59, -2, 14, 22, 20, + 18, 40, -3, 12, -69, -37, -2, 13, 41, -8, + -27, 31, 20, 23, 60, 15, -19, -65, -36, 38, + -21, -95, 67, -53, -26, 59, -51, 21, 3, -45, + 9, 21, 42, 8, -52, -1, -14, 46, 43, 1, + 7, 62, -15, 48, 66, 38, -48, 2, 30, -16, + -6, 24, 19, 68, 46, -30, -51, 36, -51, -2, + 84, 21, 46, 12, 1, 4, 29, -119, 2, -56, + 75, 29, -1, 33, -75, -16, 76, 23, 55, -39, + -33, -39, -26, 67, -48, -15, 34, 2, 4, 22, + 95, -51, -61, -11, 4, -48, 33, -32, -24, 26, + 11, 46, -9, -2, 21, 51, 76, 1, -1, 49, + 39, 28, -11, 11, 49, -3, 37, -31, 55, -73, + 53, 45, 21, -24, -17, 28, -2, -10, 71, 20, + -58, 12, -68, 55, -28, 8, 8, 10, -1, -14, + -56, -87, -14, -20, 87, -1, -32, -37, -32, 46, + -36, 50, -21, 31, 53, -41, 66, 0, -5, 47, + -19, 31, 6, -29, 98, -24, 37, 100, -60, 6, + -8, 6, -8, -49, 15, 42, 3, 82, 31, 15, + -24, -5, -7, -1, 30, -31, 14, 14, -69, 34, + -17, -8, -46, 28, 71, -14, 47, 92, -13, -15, + -24, 5, -64, 53, 2, -18, -6, 29, -109, -22, + 59, 9, -52, 19, -5, -92, 27, -37, -10, 64, + 24, -27, 55, 11, 36, -44, -36, -60, -6, -72, + 29, 47, 28, -3, -68, 37, 18, -45, 8, -4, + 12, -54, -16, 1, 25, 17, 46, 57, -59, -24, + 41, -52, -35, -2, -18, -11, -55, 74, -61, 42, + 13, 7, 31, 11, 71, 6, 45, -11, -7, -41, + 9, 6, 63, -31, 29, -35, 113, 64, 89, -67, + 76, 23, 35, -24, -31, 73, 29, -21, -3, 46, + 14, 9, 74, 5, 12, 18, -76, -127, 15, 59, + 12, 50, -11, -27, 37, 51, -14, 20, 113, 38, + -29, -27, -23, 44, 30, -94, 69, 41, 5, 29, + 55, -5, 94, -20, 57, 85, 48, -22, -126, -96, + 53, 18, 77, -38, 68, 10, 35, -7, -60, -58, + 27, -27, 24, 52, -71, -8, -78, -20, -17, 51, + 29, 35, -11, -35, 69, -82, 38, -74, 55, -3, + -30, 55, 1, 69, 0, -8, 27, 17, 28, -46, + -61, -26, 9, -2, 38, -2, 24, -20, 61, 70, + 47, 37, -97, -12, 74, 51, 84, -63, 56, 88, + -8, 35, -5, -19, -47, -14, -34, -38, -14, 11, + 40, -18, -24, -41, 37, -27, 42, -16, 70, -1, + 15, 43, -51, -73, 79, 71, 15, -50, -71, 112, + -18, -17, -4, 112, -19, -66, 12, 0, 13, 5, + -29, 66, -11, -61, 57, -3, 79, -41, -26, 24, + -51, -68, 2, 35, -8, 11, -14, -3, 8, -14, + -20, 0, 2, -16, 48, -109, -77, -80, -16, 36, + 22, 13, 0, -18, -72, -41, 38, -5, -127, -59, + -26, 32, -27, -37, 37, -63, -31, -105, 41, -7, + 69, -76, -69, -33, -31, 39, -12, 6, -69, -74, + -8, -4, -38, -11, -52, 33, 66, 14, -30, -20, + 32, -27, -127, -11, -35, 44, -18, -5, 60, -29, + 4, -50, -77, 3, 119, 64, 11, 8, -44, -42, + -14, -76, -54, 26, 3, 38, 61, -59, 26, -1, + 54, 53, 59, 7, 53, 42, 16, 99, -20, 67, + 1, -13, 91, 24, -66, 50, 4, 15, 32, 11, + -43, 64, 4, -31, 15, 6, 27, -14, 11, 42, + -6, 66, 65, -19, 40, 61, 35, 49, -45, 0, + -76, 27, 17, 70, -10, -75, 16, 33, 49, -9, + 24, 34, -32, 53, 54, -28, -30, 89, 21, -12, + -68, 20, 82, -32, 17, -64, 6, 92, -29, 22, + -26, 8, -1, 6, -31, 60, -50, -50, 8, -9, + -37, -27, -8, -21, -85, -34, -31, -62, 90, 28, + -32, 6, -39, 72, 41, -59, -21, 57, 15, -2, + 35, 38, -71, 54, -45, -12, 47, 50, 25, -83, + 32, 1, 58, -54, -118, -119, 25, 12, -37, 17, + 54, -47, 35, -3, -44, 33, 34, 12, 35, 51, + 35, 50, -16, -1, 121, 62, 92, 29, 56, -32, + 34, -61, 24, 21, -13, -52, 22, 85, 63, -32, + -43, 66, -9, -16, 32, -27, -13, 44, -9, 18, + 83, 33, -44, 25, -1, 17, 15, 44, 55, 10, + -127, -52, 37, -4, -14, -45, 65, -7, 16, 22, + -85, -33, -101, -85, 48, 18, -54, -15, -51, -49, + -2, -16, -21, -34, -56, -53, 2, -36, -19, 8, + 34, -104, 18, -32, 16, -24, 34, 40, -8, 18, + -46, -29, 44, -45, -12, 26, -15, 12, 22, -3, + 0, -48, 83, 4, -38, 54, -31, 8, 10, 11, + -28, -50, -51, -8, 43, 30, 36, 10, 16, 56, + -47, 50, 10, -49, 59, 17, 14, -61, -48, 21, + -24, 8, 47, -15, -58, -15, 90, -29, 43, 107, + 29, 48, -47, 29, 11, -34, -65, 18, 22, 36, + 63, 51, -4, 19, 8, -31, -28, -59, -18, 45, + 11, -9, -72, -88, -10, 94, 12, -82, 70, 20, + -46, 27, -34, 4, -29, 38, 22, 15, -2, -27, + 12, -57, -76, -54, -71, -77, -87, 52, 8, 2, + -2, -28, -12, 25, 6, -41, 38, 76, 12, -8, + -15, -71, -48, 7, 7, 36, 22, -39, 81, -33, + -20, -48, -37, 61, 127, 22, -62, -5, 21, -15, + 19, 102, -8, -25, 50, -89, -45, -71, 8, -38, + 17, -32, 75, 3, 13, 3, 5, 55, -3, -119, + 59, -74, 19, 52, 56, -9, 15, -68, 32, 46, + -60, 72, -68, -37, -56, 40, -37, -30, -55, 22, + 17, 0, 38, -46, -92, 32, -35, 27, 13, -9, + 44, 19, 23, 55, 1, -84, 0, -22, -14, 80, + -20, -33, -9, 40, 29, -28, -101, -39, 3, -37, + -14, -31, -25, -13, -9, -76, 20, -23, -37, 13, + 9, -17, 3, -53, -69, -73, -58, 22, -24, 19, + -1, -43, -42, 19, -54, -20, 98, -17, 51, 45, + -56, -40, 13, -8, -4, -2, -11, 9, 3, -51, + -4, 60, 3, 9, 4, 52, -27, 25, -32, 25, + 20, 73, 3, -19, 58, -4, 27, -41, 43, 46, + 39, -33, -30, -20, 29, -23, 27, -28, 15, 36, + 23, 39, 62, -18, 4, -8, 7, -62, -43, 10, + -15, -3, -9, -71, -35, 35, -36, -2, 17, 10, + -17, 40, -51, -20, 77, -16, -2, -91, 60, 58, + 54, 41, 61, -9, 3, 4, 77, -57, 104, 51, + 58, 44, 13, 19, 67, 63, 52, 54, 10, -40, + 15, -52, 79, -34, 12, 45, 38, 8, -80, -24, + 73, -30, 39, 77, 21, 7, 56, -19, 37, 14, + -10, 32, 71, 24, -1, -11, -20, -14, 43, -37, + 35, 50, -29, 47, 40, -15, 22, -11, 25, 35, + 1, 31, 30, 3, 22, 33, 8, 78, -11, -16, + -42, 31, 64, -21, -100, -25, 3, -101, -26, 3, + 1, 56, 13, -108, -11, -13, -5, -39, 36, 47, + -29, 73, 28, 46, -37, 71, 24, -61, 18, 54, + 30, -71, 86, 27, 24, -1, 44, 40, -8, 29, + 33, 39, -15, 2, 43, 84, 42, -17, -7, -30, + -48, -9, 8, 11, -47, 77, 82, 3, 32, -39, + -40, 27, -73, -24, 16, -30, -53, 57, -96, 12, + 23, 72, 8, -53, -39, -73, 67, -61, -13, -56, + 0, 120, 88, -82, -15, -43, 34, -31, -33, -14, + -27, -24, 12, 33, 8, 8, 59, 11, -10, -53, + 65, 10, -73, -9, 34, 65, -65, -114, -5, 73, + 0, 13, -32, -24, 19, 13, 33, -17, -9, -7, + 15, -13, 3, 67, 14, 23, 51, 1, -10, -7, + -21, 39, 19, -65, -60, -5, -14, 71, -42, -1, + -47, -48, 37, -34, 21, -34, -69, 35, -17, -54, + 24, 31, -12, 40, -18, -18, 42, -15, 59, 23, + -22, 24, -40, -25, -29, 26, -7, 35, -80, -7, + -10, -35, 46, 46, 40, 48, 40, -11, -40, 43, + -49, -6, -85, 17, 65, -34, -36, 60, 2, -70, + -10, -13, 20, -14, -9, 7, -1, -46, -36, 52, + -37, 62, 14, -43, 43, 64, 36, -28, -34, 60, + -4, -17, 68, 72, 31, -6, 39, 5, 0, -114, + 68, -54, -69, 70, 36, -35, -21, 49, -31, -3, + 18, -15, -71, -67, -65, -71, -12, 26, -75, 24, + 54, 28, 73, -28, 13, 3, -41, -33, -21, -30, + 51, 24, -2, 17, -31, 63, 51, -24, 32, 38, + -4, -5, -5, -60, -5, -49, 5, -3, -7, -24, + -52, -92, -58, 47, 19, 61, 15, 33, -53, -61, + 38, 80, 57, -14, -37, 28, -22, 40, -26, 49, + 28, 65, -8, 31, 2, -38, -11, -95, -58, -15, + 26, 47, -13, 48, -12, -36, 10, -14, 42, -53, + -36, -50, -42, 10, 10, 45, -21, 26, -33, -9, + -31, -1, -9, 39, -9, 26, 24, 5, -18, 58, + 38, 18, 49, -16, -24, 56, 9, -9, 43, -21, + 8, 25, 10, 4, -59, -45, 47, 39, 24, 27, + 34, -19, -15, -9, -28, 0, 77, -37, -56, 63, + 11, -29, 18, 11, 76, -83, 15, 42, -86, 29, + 64, 12, 21, 39, 6, -35, -20, -38, -3, 37, + 33, -60, -13, -28, 56, 32, -11, 4, 31, -36, + -20, 7, -27, -67, 2, 79, 1, 19, 23, -81, + -52, -47, 24, -23, 6, 7, -12, -24, 24, 34, + 28, 1, 28, -8, -58, 5, -1, -15, 17, -17, + 35, 42, 9, -17, 56, 10, -32, 11, -31, 6, + 51, -56, 3, 1, -61, 10, -9, 14, -8, -9, + 100, 2, -27, -72, -28, -76, 16, 103, 58, 75, + -22, 0, -93, -2, -15, -32, -58, -52, -32, 23, + 14, 76, -6, 8, 20, 84, 39, 83, 53, -13, + -48, 39, 13, -6, -51, -18, 76, -58, -11, 26, + 14, -69, 12, -107, 53, -100, -94, -21, 42, 80, + 25, 25, 24, 50, 63, -41, 14, -23, -34, 37, + 32, -2, 56, 24, 33, 96, -32, -39, 3, -35, + 43, 7, 46, -29, 21, 58, 77, -54, -58, 10, + -66, 24, 110, -82, -71, -7, 65, -4, -41, 10, + -49, 26, 36, -2, -26, 8, -127, -30, 16, -28, + 28, -61, -46, 36, -58, -14, 35, 11, 11, 39, + 18, -26, -52, -6, -40, -19, -31, 49, 18, 34, + -5, -70, -80, 50, -5, 17, 72, -5, -53, -47, + -31, 22, -19, 30, 6, 69, -18, -39, 18, 18, + 14, -17, 79, 18, 74, 8, -35, 69, 45, 55, + -21, 12, -39, 5, 41, -88, 14, -7, -16, 50, + -19, 25, -28, 4, 11, -5, -12, -1, -11, 39, + 13, -59, -49, 78, -10, 26, -6, 62, 59, 39, + 53, -3, -31, -37, -34, -6, 34, 43, -40, -52, + 39, 41, -83, -1, -35, 23, -37, 26, -33, -32, + -39, -19, 61, 1, 22, -12, 44, 16, 16, -15, + 23, -65, -11, 0, -46, -64, 2, -9, -11, -25, + 20, -9, -17, -31, -17, 52, -80, 6, -29, 13, + 16, 16, 8, 27, 7, 3, 4, -24, -28, 73, + -35, 20, -17, -45, -56, -34, 21, 0, -48, 53, + 66, 7, 89, -34, -16, 43, 10, 6, 127, 87, + 94, -28, 20, 10, 27, 23, 96, 13, -47, 34, + -25, -58, 8, -31, 11, 15, -55, 9, -5, -66, + -33, 23, -75, -52, -6, 57, 79, -4, 9, 23, + 13, 44, -11, 66, 15, 9, 25, -51, 48, 53, + -31, -55, 75, -14, 9, 37, -127, -11, -10, 17, + -83, -22, 30, 0, 3, 20, 63, -22, 21, 78, + -28, 19, 57, -17, 24, -25, -11, -5, -11, 14, + 15, 22, 27, 50, 62, 39, -25, 36, -22, -23, + 1, -70, 22, -40, -105, -29, 85, 71, -25, -85, + -15, 16, -30, 19, 14, 5, 33, 68, 34, -41, + -2, -60, -88, -10, 12, 7, 4, -53, 46, -24, + -95, 59, -73, 56, -7, -54, -38, -8, 3, -17, + 36, -15, 1, -43, 13, 5, 34, -10, -15, 10, + -26, -40, -20, -28, -40, -42, 55, -37, 95, -39, + 34, -39, -30, -17, -88, 44, -23, -62, -20, 41, + 23, 20, -25, -22, -2, 50, -52, 17, -39, -20, + -52, 15, -37, -5, 25, 19, 24, -22, -16, -10, + 21, 20, 59, 32, -10, -74, -65, -9, 0, -15, + 21, 17, 14, -4, -11, 8, 8, 35, 29, -28, + -10, -68, -49, -3, 1, 36, 57, -36, 30, 40, + 46, -35, -64, 22, -33, 26, 49, 7, -42, 9, + -12, 71, 2, -78, 8, 2, 24, -46, -21, -13, + 21, -53, 1, 28, -49, -39, 40, 4, 47, 5, + -1, 40, -13, -52, 43, -7, -16, -17, -17, 12, + -53, -66, -13, 86, -1, -59, -76, 23, 54, -62, + 81, -49, 68, 41, 7, 76, -40, 79, 97, -37, + 80, 57, -15, 108, 42, -47, -3, 40, 17, -14, + 8, 50, 14, 19, 8, 6, 19, 20, 12, -6, + -17, -17, -1, -73, -70, 68, -24, -16, 89, -66, + -78, -50, 23, -52, 58, -22, 23, 37, -13, 4, + 63, 24, -54, 66, 36, 38, 61, -48, -38, -6, + 78, -4, -55, 56, -25, 57, 0, 57, -13, -6, + 13, -28, 1, -14, -5, 9, 7, 62, 45, -38, + -66, -39, -9, -50, 2, -25, -8, -2, 3, -49, + 26, 70, -7, 45, 23, 40, -37, 32, -56, 47, + -10, 57, 41, -86, 39, 16, -40, 67, -29, -8, + 21, 22, -14, -127, 5, 56, -55, -125, -54, 46, + 120, -24, -4, 55, -54, -10, -28, -8, -21, 2, + 3, -81, 42, 52, 38, 52, -7, 16, -48, -58, + 26, -21, -40, -8, 62, 44, 38, -30, 61, -6, + 12, -22, -102, 32, 0, -11, 1, 86, 21, -21, + 2, -26, -30, -15, 21, 13, -30, -24, 24, 46, + 34, 4, 49, -38, 22, -15, 31, -41, -95, -9, + -27, 25, 20, -29, -42, -78, -49, -34, -43, -41, + 39, 27, 22, 19, -5, 60, 1, 38, 82, -24, + -24, 52, -23, 6, 75, 37, 1, -18, 75, -26, + -24, -40, -67, 5, 17, 30, -60, 66, 8, -31, + 22, 21, 21, -10, -1, 58, -55, -39, -27, -33, + 26, -42, 28, -31, 10, 32, 21, 68, 12, -81, + 31, -44, 19, -59, 0, -60, -58, -26, -30, -10, + -12, 25, -62, -55, 12, 28, -50, 30, 33, 17, + -75, -83, -37, 29, 24, -5, 25, -81, 13, 45, + -64, -27, -89, 9, 17, -47, -22, 7, -27, 54, + -67, -14, 12, 22, -17, -30, 41, 94, -66, -22, + -40, 0, -68, -9, 97, 15, 85, 30, 25, 55, + -120, -27, -8, -12, 2, 55, 8, 42, -53, 43, + -51, -11, 59, -23, 14, 10, 29, 9, -12, -13, + 7, 38, 12, 38, -5, -14, -17, 57, 1, -3, + -8, -10, 80, 67, 46, -45, -89, 60, -15, 33, + 41, 17, -39, 96, 51, -17, 51, 25, -19, 34, + 40, -34, -24, -2, -52, -36, -5, 9, -47, -68, + 14, -91, 25, -26, 0, 16, 59, -19, -82, 33, + 4, 1, 1, -22, -29, 9, 39, -61, -65, -1, + 79, -54, -23, 68, 60, 22, 9, -32, -22, 32, + -13, 50, 20, 38, 44, -57, -69, 57, -35, -71, + 25, -4, 0, -65, 61, 69, -35, 12, 42, 70, + -27, -53, -10, -75, 11, 23, 2, 60, -74, -57, + 0, 22, 3, -28, -20, 5, -43, 40, -61, -50, + -37, 35, -31, 25, 32, 49, 14, -85, 27, -86, + 39, -83, -56, 68, 8, -83, -29, 11, -5, 4, + 22, -2, 42, 59, 50, -17, -3, 32, 13, 8, + 38, 0, 29, 25, 36, 12, 44, 56, 3, 26, + -45, 63, 27, 39, -19, 37, -32, -64, -11, 48, + -95, -42, 14, -85, -36, 100, 24, -56, -35, -8, + -13, 31, 43, 0, -127, -3, -66, -41, -9, -62, + -61, -92, -72, 58, -30, 23, -34, 34, -41, 6, + 89, 20, -9, 41, 15, -77, -73, 36, 47, -50, + 40, 9, 7, -15, 63, 12, -58, 18, -37, 28, + 8, 37, -84, -9, -54, 17, -1, -56, -69, -75, + -36, -82, -84, -15, -87, 42, 70, 127, -6, 58, + -33, -42, -18, -38, 70, -88, 22, 17, -14, -57, + -44, 25, 32, -40, -35, 2, -52, -50, -19, 49, + -8, -86, 69, 37, 27, 0, -21, 107, 24, 95, + 42, -1, 0, 6, 34, -5, 29, -10, 65, -20, + 35, -37, -25, -6, 25, -36, -42, 15, -45, 47, + 101, -37, 13, -37, -63, 30, -50, -14, -23, 36, + 1, 87, 51, 23, -78, -26, 93, -17, -16, -73, + 51, -89, 26, 46, 31, -27, 55, 25, -15, -89, + -20, 19, -87, -68, 78, 23, 1, 6, 48, -25, + 44, 9, -1, -50, -19, -34, 34, -18, 36, -53, + -27, 50, 23, 47, 4, -8, -38, -12, 84, 5, + -15, -18, -9, -62, -127, 23, -107, 4, -17, 114, + -39, 44, -34, 15, -79, -20, -95, 4, 5, 37, + 30, 3, 35, 20, -127, -36, -59, 43, -15, -35, + 56, 21, 46, 26, -39, -67, -12, -58, 18, 107, + -20, 30, -69, -42, 44, 45, -27, -13, 14, 66, + -12, -33, 50, 6, 36, 46, 46, 23, -4, 19, + -29, -40, 21, 32, 82, -27, 74, -70, 32, 50, + 94, 13, 23, -9, -14, -52, 47, 41, 2, 5, + -93, -37, -69, 4, 43, -41, -50, -55, 6, 4, + 3, -50, -89, -53, -13, -46, 88, -66, -43, 25, + 14, 42, 6, -25, 19, -31, -1, -27, 67, -16, + 45, 68, 54, 84, 75, 60, 0, 37, 71, 14, + 81, 91, 0, -3, 23, 6, 52, -21, 36, 15, + -14, -13, 4, -56, -49, 22, 26, -33, -28, -10, + -58, -102, 69, 13, -83, -68, -54, -50, -21, 22, + -17, 60, 50, 28, -20, -5, -76, -16, 11, -54, + 56, 76, 33, -5, -27, -3, 15, -12, 69, 60, + 41, 14, -49, 1, 59, 27, 12, -87, 94, -72, + 4, 27, 79, 69, 3, -1, 12, 23, 44, 71, + 94, 27, 40, -15, 70, 18, 6, 63, 49, -25, + -55, -60, -40, -31, 0, -25, 31, -67, -1, 24, + -29, 5, -14, -62, -53, 75, -37, 72, 29, -21, + -15, -31, 48, 17, 126, -69, 6, 24, -67, 60, + 73, -32, -54, -35, 75, 58, 32, 42, -58, 13, + -13, 21, -3, -85, 19, 10, 42, -30, 5, 76, + 51, 4, -55, 16, -65, 63, 18, 2, -103, -85, + -1, -18, 11, -26, -36, -60, -10, 45, 13, -19, + -93, 13, -11, -1, -35, 29, 12, -1, -9, -32, + -42, -82, -48, 38, -64, 34, -70, -17, -56, 9, + 12, 1, -40, -53, 40, -26, -15, -15, 15, 28, + 33, -21, -24, -27, 34, 20, -10, -51, 31, 2, + 69, 32, 42, 42, -93, 19, 22, -93, -97, 45, + -20, -75, 77, -15, 11, 13, 12, -9, -40, 32, + -55, -3, -24, 4, -31, 39, -8, 22, -6, 82, + 8, -11, -4, -53, -6, 4, -45, -72, -10, 3, + 77, -27, 7, -5, 41, -49, -70, 26, 11, -28, + -74, -116, 33, -42, 88, 14, 52, 62, -65, -21, + 61, -73, -21, 26, -34, -55, -24, 70, -12, 43, + 25, 42, -21, -18, -86, 80, 80, -34, -65, -74, + 21, 21, -9, 42, 50, 2, -51, -49, -63, -13, + 2, 23, 87, -36, -15, 36, 4, 35, -26, -32, + -17, -9, -48, -11, 53, 33, 25, -1, -78, 48, + -2, -19, 36, 8, 52, -15, 5, -30, -40, -32, + -30, 62, 27, 15, 117, -59, 22, 31, -3, 72, + -94, 26, 41, 37, -15, -44, 19, -39, 65, -6, + -42, 46, 22, 61, -21, -71, -46, 6, 21, -1, + 17, -24, -48, -43, -49, 7, -11, -98, -3, -40, + -24, -31, 32, -18, 20, -66, 53, 12, 32, 29, + -74, 5, -35, -36, 61, -72, -26, 53, 46, -29, + -36, -26, -20, 42, -53, -17, -21, 30, 18, 13, + -18, 34, 25, -15, 47, 19, 10, -49, 55, 12, + -52, -49, 85, 1, 65, -48, 25, -67, -108, -13, + 48, -46, 5, -39, -76, -33, -21, 6, 17, -51, + 1, -30, -16, -3, 2, -40, -31, -68, -33, -48, + -17, 39, 62, -10, -57, 22, 57, -24, 54, -22, + -39, 43, 45, -120, -4, -34, -20, -18, 61, 46, + -61, 28, 25, -11, 46, 3, -45, 35, -16, 16, + 35, -33, -41, -4, 73, -94, -36, 88, -72, 37, + 15, -27, -18, -9, -1, -88, -15, -55, 50, -117, + -41, -2, -21, -85, 39, -23, -61, 100, 17, -78, + -125, -50, -66, -22, 16, -5, 44, -6, 35, -62, + -57, 24, 32, -30, 22, -1, -16, -22, 29, -21, + 26, 121, -25, -41, -6, -29, 76, -23, 3, 51, + 34, -27, 88, -61, 36, 49, 65, 25, 34, -63, + 11, 30, -3, 66, -107, -24, 41, 3, 17, -27, + -60, -10, -66, -27, 12, -27, 19, -59, 87, -2, + 44, 16, -51, -67, 76, 8, -69, -59, -48, 74, + 10, -40, -56, -66, 18, -24, -12, 38, 5, 69, + 11, -23, -43, -127, -36, -30, -4, 46, -35, -4, + -27, -70, 86, -55, 41, -97, 126, 103, 5, -5, + 10, -122, -2, -53, -70, -14, -79, -34, -97, -58, + -4, 57, -16, -24, 50, -25, -87, 17, 13, 98, + 48, 48, 47, 6, 7, 61, 34, -2, 92, -28, + -35, -33, -105, -44, 38, 32, 39, -3, -27, 30, + 19, -41, -5, 47, 26, -2, -16, 63, -36, 72, + -23, 1, 11, 72, 87, -17, 44, 38, -13, -1, + -41, -93, -89, 15, 77, 36, -44, -67, 5, -13, + -3, -17, -36, -32, -24, 65, -117, -6, -100, -9, + -2, 52, -20, 6, -112, 44, -91, -42, 53, -13, + 19, -21, 36, -48, -60, 32, -51, -76, 61, 74, + 34, -34, -73, -80, 50, -31, 39, 45, -44, 9, + 2, 1, 10, -47, 65, -13, 23, 36, -2, 24, + -12, -45, 7, -7, 82, 30, 27, -29, 89, -44, + 40, 21, 27, 38, 12, -41, 21, 45, 4, -14, + 127, 25, -107, 7, 41, 25, -72, 39, -20, 17, + 63, 49, -53, -87, -100, 30, -35, 9, -9, -25, + -50, -92, -99, 11, -28, -40, 12, 80, 39, 24, + -63, 40, -52, -18, 15, -76, 20, 11, 38, 11, + 25, -16, -33, 9, 38, 46, 6, 26, 12, 33, + -8, -6, 1, 18, 55, 11, -43, 19, -114, -49, + 20, -91, -62, -63, -3, 22, -31, -27, 41, -107, + 68, -25, -8, 18, -33, -17, 41, -47, 18, 96, + 84, 15, 77, 32, -43, -16, -4, 44, 23, 87, + -7, 58, -7, 20, -23, 52, 39, 27, 8, 37, + 31, -79, 35, 36, -30, -44, -68, 4, 16, -50, + -17, 21, 46, 23, 81, 104, 42, -9, -89, -98, + -1, 29, 4, 73, -33, -36, -34, -65, 11, -114, + -15, -22, -90, 95, -35, 47, -15, 26, 18, -63, + 0, -14, -8, 55, 6, 48, 49, -13, -26, -30, + 60, 61, 44, 7, 49, -15, -62, 83, -40, -48, + 15, 37, -56, -11, 14, 51, 92, 27, 18, 40, + -11, -108, 127, 5, -14, 37, 0, 81, 2, 40, + 26, -78, 4, -29, 23, -49, -64, -35, -2, 26, + -66, -52, 23, 21, -33, -12, -6, -33, 31, -14, + -33, -77, 57, -1, -13, 15, 30, -6, 46, -43, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, +}; +const TfArray<1, int> tensor_dimension43 = { 1, { 15616 } }; +const ALIGN(8) int32_t tensor_data44[128] = { + 3494635, 548871, 502901, 1232503, 510759, 1178669, 209336, -781583, 2012593, 1882812, + 2387773, 2399140, 2846558, 1530446, 2182932, 1872885, -557149, -99258, 2588247, 410794, + 210454, -389860, 724025, 450373, 1828304, 2086758, 1505333, 1712627, 2125264, 1493499, + 2111768, 2537506, 1565985, -2575055, 4236709, -2089305, -1562372, 1858761, 88173, 174765, + 1979944, 1182375, 975880, 1735507, 1641387, 1984092, 2122572, 2318917, -4549479, 73202, + -2491991, 2942744, 1684912, 372013, 1204353, 3182104, 1053860, 1608095, 1558426, 1925875, + 1877363, 1862360, 1339717, 1805998, 2478969, -22471, 2047768, 1847613, 3896357, 3322361, + 3272320, 2411652, 1571677, 2337825, 1818569, 1731375, 1606604, 1429231, 2295794, 2352381, + -1023546, -3802343, 1027700, -1153917, -757679, -63966, 364413, -1341943, 2080058, 2081469, + 1828184, 1734864, 1520699, 2065958, 1723066, 1828264, -305005, 1221233, 992687, -1193493, + -3974817, 936298, -150485, -541643, 1609619, 1532826, 1761218, 1388828, 1715957, 1360901, + 2442012, 1089230, 2351395, -3415352, -2070278, -325780, -947514, -587702, 1520042, 2155618, + 1785914, 1739132, 1451333, 1554836, 1403589, 1775959, 1535199, 1821147, +}; +const ALIGN(8) int8_t tensor_data45[12288] = { + 2, -34, 19, -44, -77, 33, 43, 32, -9, -43, + -58, 8, -85, 27, -66, 7, 35, 35, -33, -30, + -5, 52, 3, -65, -34, 47, -37, 2, 5, -56, + -48, -28, -45, 33, -59, -39, 6, -59, 18, -16, + -26, -35, -13, -32, 5, 45, 55, 20, -127, 7, + 15, -51, -54, -3, 13, 0, 21, -11, 20, 10, + 18, 3, -40, 26, 32, -74, 54, 42, -97, -53, + 33, -38, -26, -16, -53, -30, 16, -14, 3, -85, + -23, -127, 2, 12, -42, 35, -97, -43, 36, 88, + -24, -50, 2, -99, -3, -11, 21, 8, -1, 8, + -4, -74, -11, -52, -41, 8, 0, -3, -51, 15, + -17, 11, -26, -18, -17, 54, -19, 60, 0, -12, + 48, -73, -23, 80, -39, -35, 7, 26, 50, 40, + -31, 31, -29, -15, -32, -11, -35, -8, -38, 0, + 27, -15, 32, 57, 69, 17, 74, -5, 11, 71, + -15, 34, -20, 31, 36, 9, -25, 20, 22, 82, + -50, 52, 35, 42, 56, -31, -4, 12, -14, 41, + -35, 15, 1, -24, -58, 92, 76, -21, -33, -13, + -36, 12, 18, -22, 79, -57, 10, 25, 2, 27, + -39, -16, -34, -52, -19, 79, 21, 1, 10, -43, + -25, 96, 12, 10, -26, -10, -28, -42, -3, 7, + -33, 57, -1, 25, -17, -8, 36, -55, 10, 18, + 20, 93, 8, -26, -80, -90, -26, 3, 35, 66, + -37, -22, -40, 5, -2, 80, -70, -32, -3, 81, + -5, 77, 76, -6, 8, 70, -1, 101, 50, -41, + -24, -32, 54, -34, 47, -15, -47, -20, -47, -52, + 51, -7, 43, 29, 11, 19, 82, -74, 60, 11, + 32, 1, 13, 91, 58, -41, 22, 20, -22, 7, + -35, -30, -17, 7, 23, 39, 15, 67, -103, 20, + 14, -6, -69, 47, -57, -29, 53, 23, -26, -57, + 58, -64, 28, 14, -19, -77, -64, 13, -7, 9, + -18, -46, -13, 11, 30, -58, 60, -14, -8, -34, + 58, 8, 27, -37, -11, -25, -62, -6, 32, 3, + 19, 43, -4, -20, -59, -61, 59, 15, 37, -70, + 37, 26, 29, 75, 12, -12, 67, -39, 47, -15, + 45, -66, 29, 3, 33, -4, 9, -18, 3, -7, + 14, -58, 7, 9, 39, -13, -1, 21, 5, -31, + 23, 69, 54, -69, 59, 18, 24, -28, 1, -79, + 19, -82, -71, 6, 34, -16, 38, 63, -87, 14, + -13, 14, -18, -70, 18, 64, 43, -24, -73, -43, + -45, 53, -5, -40, 37, -42, 15, -97, 35, 77, + 13, -91, 66, -23, -9, 9, 27, -71, -69, -39, + 20, 69, 24, 6, -11, -29, 0, -54, -33, -67, + 29, -15, 44, 13, -40, 0, -50, 3, 17, -30, + 24, 52, 34, -3, -73, -49, 15, 49, -12, 72, + -63, 37, -83, -30, -64, 34, -58, -57, -32, -1, + -100, 25, 7, 45, 21, -98, 68, 20, 28, -21, + 77, -5, 59, -10, 56, 35, -34, 10, 28, 14, + -32, 20, 5, 46, -8, -65, -29, 56, 44, -72, + -12, 14, -2, -7, 28, -18, -54, -15, 46, 46, + 0, 84, -16, -9, 13, 24, -34, 17, -5, 5, + -52, -68, -55, -22, -88, 18, 52, 55, 21, 7, + 69, 57, 1, -87, 41, 40, 7, 24, 3, 69, + 21, -6, 52, 44, -15, -24, -32, -57, -16, -44, + 12, 82, -17, 21, -36, 1, -9, -31, -35, -38, + 47, -67, 2, -50, -43, 56, 28, -37, 57, -31, + -30, 11, -62, 0, 22, -19, -46, 16, -18, 42, + 10, -14, -60, 40, -39, 5, 8, 10, -43, 52, + -71, 15, 55, -17, 11, -44, 24, -57, -69, -60, + -10, -35, 45, 83, -29, -66, 21, -4, 41, 60, + 9, -99, 8, -91, 23, -85, -55, 19, 17, -15, + -4, 23, -46, -48, -30, 20, 8, 12, 14, 44, + -7, -6, -46, 2, -28, 68, 50, -6, 37, -48, + -20, -17, -34, 29, 39, -49, 8, 62, 5, 19, + 15, -25, -87, -46, -26, 45, -42, 38, -72, -27, + -70, -11, 47, -34, 5, -33, -11, 48, -71, -21, + 3, 18, -36, -33, -15, -51, -44, -52, -9, -13, + -13, 82, -18, -7, -61, -22, -9, -54, -34, 47, + -9, 0, -55, 8, 40, 80, -103, -26, 42, 13, + -11, -45, 25, 31, 14, -20, 48, -42, -77, 21, + 50, -53, -84, -40, -29, 42, -8, -26, 11, -13, + 39, 71, 87, 22, 76, 41, 18, -9, -88, 2, + -32, -62, -21, -46, 71, -44, 82, -18, -48, -2, + -7, -62, -47, -5, 34, -31, -39, -5, -24, 41, + 46, -77, -67, -44, -6, -27, -25, -73, -2, -11, + 31, 18, -55, 50, 43, 47, -20, 58, 50, 71, + 57, 64, -33, 50, 39, -33, 18, -28, 7, 19, + -7, 23, -67, 30, 13, -51, -50, -22, 17, -3, + 24, -25, 7, 36, 13, 27, -22, 42, 1, 39, + -2, 68, -52, 4, -75, 6, -41, 25, -10, -30, + -69, -61, -4, -49, 55, 47, 37, 39, 52, -51, + 28, 39, -90, -2, 38, -9, 42, -9, 22, 10, + -35, 35, -19, 28, 44, -23, -47, -8, -18, 49, + 53, 31, 25, -72, -51, 42, 51, 107, -15, -5, + -7, -43, -40, -64, -39, 0, 1, -27, -5, -3, + 13, 54, 97, 23, 49, -39, 2, 17, -23, -85, + -1, 23, -60, 58, 19, 34, 17, 31, -37, -13, + 8, -8, 47, 26, -9, -7, 8, -14, -13, 23, + -35, 21, 66, -13, -65, 24, 6, 53, -16, -9, + 4, -24, 18, -14, -17, -11, -49, -53, -7, -5, + 29, 38, 50, 18, -3, -91, -41, 32, 13, 36, + -9, 14, 79, 116, -40, 31, 12, 18, 46, -59, + 20, -58, -18, -31, 127, 70, -24, -67, -39, 3, + -45, 76, -74, -28, 17, -5, -27, -61, 86, -18, + -22, -49, 42, -66, 60, 60, -18, -30, -12, 59, + 14, -5, -14, -41, 7, -25, -13, 33, 22, -81, + -47, -42, -56, -75, -17, -67, 51, -37, 5, 58, + 3, 11, 25, 0, -41, -30, 56, 5, -8, 28, + 64, 57, -46, -1, -24, -48, -31, 19, 24, -8, + -44, 19, 47, 36, -64, 44, -31, -10, -42, 16, + -2, 31, -33, 40, -13, 36, -10, -18, -1, -30, + -42, -18, 52, -39, -64, -104, -15, -35, -58, -39, + 39, 11, 37, 12, -14, -18, 55, -14, 39, -11, + 52, 34, -28, 30, -27, -27, 29, 12, -20, -11, + 13, -13, 43, -32, 4, -17, -67, 30, 0, -17, + -8, -85, 40, 5, 35, 77, 58, 40, 62, 66, + -108, 16, 1, 16, -64, -48, 29, -75, -2, -29, + -57, -69, -23, 27, -24, -40, -81, -52, 32, -29, + 59, -35, -7, 22, 43, 44, 23, 8, 19, -88, + 24, 52, 15, 24, 33, -7, 68, 22, 11, 45, + 60, 10, 63, -91, -38, -9, 59, 5, -36, 42, + -25, 87, -57, -13, 41, -21, -12, -56, 28, -82, + 27, -40, -38, -25, -1, 19, 46, -45, 8, -13, + 37, 35, 8, -7, -31, -5, -104, -6, -94, 39, + -37, 22, -28, -13, 84, 3, -27, 69, 17, -54, + 56, -59, -51, -34, 23, -27, 0, 11, 60, 17, + -10, -23, -68, 5, -75, 24, 35, -10, 45, 82, + 53, 2, -37, -9, 10, -53, 53, -48, -18, -9, + 53, 62, -47, -6, -20, 15, 23, -6, -35, 75, + -21, -53, 6, -59, -6, 25, -8, 10, -40, -1, + 58, 13, 49, -46, -47, -99, 101, -127, -4, 17, + -24, -86, 9, -60, 8, -76, -32, 46, -43, 40, + 16, 24, -33, -102, -10, -28, 100, 8, 75, -28, + 61, -127, -64, 108, 41, -8, 15, -24, -76, -22, + -54, 23, 8, 54, -40, 43, -6, 19, -77, 41, + 86, -67, -38, -97, -42, 13, 43, 3, 45, -64, + 17, -5, -26, 38, -25, 83, 111, -52, 92, -10, + -29, 63, -30, 60, -80, -6, -50, 31, -127, 20, + -17, -46, -72, -19, 66, -41, -3, 62, 42, 2, + 42, -56, 2, -21, 26, 0, 0, 22, 18, -8, + 47, -26, 39, 44, -25, 8, -18, -5, 8, -6, + 0, 9, -3, 2, -19, -14, 37, -127, -34, 45, + -54, 26, 15, 49, 51, 65, 19, 40, 43, 0, + -44, -7, -24, -6, -1, 3, -10, 8, 70, 0, + -4, -66, 28, -26, 26, 55, 54, 43, -10, 27, + -57, -36, 1, 15, 21, -29, 127, -29, -8, -77, + -60, -24, 53, -34, 20, 62, 57, 33, -23, -63, + 1, 4, 48, -35, 60, -54, 45, 39, -28, -8, + -1, 29, -50, 30, -19, 2, -52, 28, -28, 25, + -40, -14, -75, -8, 25, 9, 67, -44, 15, -96, + -19, 50, 2, 20, 66, 127, 16, -38, 36, -41, + 5, -34, -48, -52, -49, 4, -5, -21, 51, 30, + -1, -63, 12, 75, -8, -73, 33, 3, -7, -50, + -47, -45, 0, 72, -62, -41, -109, 1, -2, -15, + -48, -87, -18, -62, -49, 50, -39, 28, 76, 110, + -69, 29, -54, -38, -49, 37, 18, -3, -21, 19, + 15, 17, -40, -20, 74, -27, 10, -62, 54, 20, + 17, 40, 10, 48, -51, -89, 16, -25, -44, -22, + -39, 94, -4, -44, 36, 5, -13, -22, -92, -75, + 46, 42, 60, 31, 1, -40, -63, -22, 12, -23, + 1, -18, -2, 33, -33, -43, -56, -2, -14, 50, + -44, -44, -36, -29, -40, -25, 44, 15, -56, -39, + 30, 18, 7, -38, 29, -41, 21, -11, 53, 3, + -91, -29, 21, 7, 77, -14, -16, -66, -47, 59, + -46, -17, 7, 29, 22, 40, -64, 48, -53, -40, + 50, 13, 24, -3, -21, -5, 90, -29, 14, 62, + 22, -24, -50, 37, 14, -34, 40, 57, -22, 41, + 2, 7, -1, -23, -49, -6, -74, -50, 61, -80, + -27, 81, 34, 70, -7, -35, -4, 28, 32, 24, + -13, 18, -53, 6, -29, 9, 60, -76, -58, 7, + -55, 51, 94, -40, -30, -26, -50, 27, -61, -3, + 12, -47, 4, -62, 38, -83, 83, 0, 43, 38, + -19, -34, 32, 25, 38, 3, -92, 15, -20, -22, + 45, 32, -13, -16, -1, 1, -38, -28, 18, -46, + -4, 24, -17, 0, 4, -7, 11, -21, 26, -51, + -1, 50, -54, 84, 100, -6, -8, 76, -77, 41, + 2, 60, 38, -47, -3, 41, -37, -25, 36, -86, + 7, 10, -70, -54, -30, -31, -86, -20, 29, -72, + 19, -75, -45, 39, 74, -47, -58, 39, 58, 31, + -16, -20, -13, -38, -61, 55, 55, 47, -59, 72, + -46, 55, 3, -62, 61, 57, 81, 95, -73, 39, + -74, -8, -94, 16, -38, 43, -26, -62, -81, 29, + 25, 78, 2, 17, -46, -20, 21, -49, -41, 2, + 40, 37, 41, 21, 2, 56, 61, 27, 23, 28, + 32, -46, -6, -108, 23, 32, -56, -6, -31, -26, + 26, -26, 5, -74, -63, -48, -71, -7, -69, -26, + 24, -2, 34, 5, 55, -82, -3, 87, -12, -42, + -35, 48, -18, -36, 8, -29, 73, -72, -65, -53, + 53, -8, 88, 68, 20, -13, 2, -21, -23, 67, + -23, -15, -38, -13, -76, 28, -32, 22, 14, -37, + 21, -29, -21, -2, 19, 67, -67, 13, 65, -19, + -44, -3, -48, 36, -56, -38, -71, 14, -44, 15, + 9, -8, 4, 32, 112, -69, -38, 41, -79, 34, + -91, -3, -1, -40, -54, 33, 5, 19, -19, 64, + 33, -12, -8, -27, 40, 21, 6, -44, -6, -56, + 15, -42, -27, -26, -71, -11, -3, 14, 9, 69, + 42, 79, -23, -27, 4, 29, -39, -58, 18, -3, + -22, 19, -28, 15, 12, -36, 90, -7, -30, -58, + -85, -86, -84, -8, 10, -35, -26, 26, 23, -55, + 10, -12, -8, 25, -21, 26, 10, -25, 18, 39, + -21, 53, 13, 27, 15, 0, -34, -34, -40, 67, + -47, -59, 5, 5, 40, -82, 12, -5, -71, 42, + 53, -38, 127, 65, 19, 15, -6, 38, 24, 36, + -43, -37, -38, 22, 51, -43, 3, -7, 2, 40, + 8, 29, 52, 60, 68, 34, 64, -14, -30, -104, + -2, -39, 48, 28, -48, -42, -20, -82, -46, 13, + 40, 3, -83, 31, 44, -25, 20, -59, -36, -58, + -12, 98, -16, -28, 29, 62, 21, -27, 24, -9, + 24, -31, -89, 26, 38, 67, 43, -105, 78, 22, + 78, 26, 60, -42, -17, -56, -22, 38, 33, -56, + -19, -10, -37, -31, 32, 10, -22, -10, -3, -22, + -54, -32, -84, -12, -29, 46, 56, -64, -94, 28, + -11, 15, 54, -50, 53, -64, -78, -6, -16, -30, + -72, -64, -22, 2, -44, 6, -10, -80, -26, -61, + 55, -15, 46, -71, -28, 10, 1, 28, 3, 28, + 55, 66, 81, 43, 40, -28, -37, -20, -34, 87, + 24, 45, 15, -70, -23, -33, -13, -85, -60, -5, + -53, -27, 10, 19, -54, -19, 68, 61, 56, -40, + 103, 42, -36, -11, 44, -96, -28, -58, -2, 21, + -38, 21, 1, -18, 20, 7, 21, -15, -87, 42, + 0, -48, 38, -31, 6, -68, 51, -4, -12, -1, + -14, 47, 8, -54, 55, -16, 29, 25, -20, 6, + 62, 42, 36, 7, -88, 21, -38, 10, 10, 25, + 31, -4, -9, 6, -99, 42, -58, -16, -53, 45, + -26, 7, -25, -42, -27, 17, -8, 13, 16, -14, + -15, -36, 13, -15, 33, -21, 6, -16, -10, -28, + 1, 36, -23, -35, 0, -19, -112, -53, 35, 58, + -77, 51, -29, -52, 13, -16, -53, 71, -1, -36, + 33, -46, -65, -60, 12, 28, -41, 16, -19, -16, + 6, 77, -9, 4, 13, -62, 91, -99, 29, 21, + -12, 64, 11, -125, -43, 43, 63, 25, 33, 3, + -26, 97, -60, 55, -36, -7, 81, -36, 12, 89, + 54, 14, -1, -10, -91, -106, 15, 21, -20, -2, + -18, -49, 22, 6, 95, -94, -27, -85, -25, 37, + 30, 36, 37, 46, -42, -5, 10, 17, 80, -35, + 49, 64, 98, 3, 15, 1, 57, -12, 15, -35, + 21, 68, -37, 64, 32, 104, -63, 59, 66, 3, + -61, 17, -38, 34, 43, -65, 7, 57, 62, 40, + 4, -53, -19, -73, -53, -34, -16, -78, 45, -43, + 19, -48, 72, 31, -94, 35, 35, -43, 17, -30, + -23, 68, -4, -12, -29, -50, -4, 23, -43, -39, + -29, -77, 127, -18, -112, 60, -33, 29, 7, 93, + -49, 35, -24, 19, 54, 63, -50, -68, -66, 10, + -58, 10, -32, 12, -52, -33, -63, 7, 41, -112, + 59, 13, 122, -44, -68, -42, 80, 29, 24, 13, + 29, -32, -26, 62, -17, 50, 17, -67, -17, 8, + 26, 69, -42, 15, -10, 51, 2, 79, -4, -16, + -15, 64, 5, 38, 38, 1, -14, -12, -33, 57, + 2, 15, -62, -81, 16, -78, 75, 14, 1, -58, + 77, 12, 47, 6, -19, -18, -20, -21, 74, 106, + -2, -21, 12, -37, 25, -41, 17, 45, 52, -127, + 4, 0, -32, -27, 19, 18, 4, 1, 38, -67, + 19, 20, -52, 15, 56, 23, -21, -37, -24, -29, + -86, -79, 32, 54, 42, 46, 27, 9, 25, 71, + 41, 64, 28, -51, 96, 57, -75, 17, 29, -31, + -53, -12, -6, 31, -45, 98, -2, 27, -46, 63, + 28, -42, -15, 68, 27, -27, 39, 47, -90, -16, + 20, -17, 24, -110, -65, 61, 10, 28, -23, -18, + -15, 49, -10, 22, -28, -44, -39, 23, 69, -73, + -43, -39, 56, 88, 29, -49, 65, -66, 41, -6, + 21, -58, -35, 37, 71, -88, 9, 8, -59, 40, + -99, 44, 27, 45, -3, -51, 26, 57, 72, 127, + -40, 48, -42, 13, -4, -48, 56, 22, -26, -76, + -72, 17, -127, -47, 16, -61, 53, -58, 8, -10, + 64, 54, -68, 52, -31, -11, -17, -21, -61, -27, + 9, 24, -31, -46, -14, -33, -46, 1, 11, 5, + 26, 36, 62, -72, -25, 20, 43, -64, 86, 54, + 2, -6, -65, -20, 30, 43, 2, -32, -51, -16, + -42, -24, -45, -46, 42, 30, -13, -57, -55, -75, + 40, -20, -20, -54, 86, 5, 102, -81, -5, -9, + 54, 33, -23, -32, -51, -97, 61, -16, -25, 34, + -30, 6, 53, -28, 60, -22, 35, 28, -58, 82, + -29, 23, -44, -4, 28, 36, 14, 12, -37, -24, + -11, 65, -5, -9, -48, -16, -47, -11, -29, 30, + -1, -16, 15, 31, 60, 11, -7, -47, 26, 27, + 3, -78, 4, 37, 29, 85, -26, 4, -9, 21, + -21, -10, 23, -10, -3, -5, 1, -29, 9, -37, + 4, 20, -46, -63, -93, 12, -80, -36, -58, -46, + 19, -23, -28, -2, -29, -7, 34, -17, 64, 67, + -42, -59, 32, 21, -59, -22, 6, -38, -77, -9, + 33, 41, -62, 41, -29, -77, -71, 48, -47, 1, + 6, 28, 37, 2, -36, 21, 55, 1, -31, -37, + -127, -8, 31, 24, -53, 50, -5, 42, -39, -50, + 3, 16, 42, 47, 73, -10, 28, 76, 12, 35, + -30, -35, -75, 26, -106, -56, -25, 34, -29, -37, + -76, -2, -3, 0, 31, -75, 4, -30, -43, -28, + 21, 65, 106, -9, -7, 34, 2, 61, -22, 18, + -21, 49, -2, -44, -16, -21, 26, 67, 47, 57, + -1, 30, 5, -3, -56, -46, -10, 8, -9, -38, + -23, 23, -57, -7, 52, -16, 22, -61, -14, -51, + 44, -42, 46, 18, -20, -32, 35, 78, -4, 50, + -8, 31, 72, 17, -26, -17, -45, 42, 59, 45, + -19, -39, 86, 9, 31, -32, -5, 19, -37, 75, + -33, 49, -46, -35, 38, -64, -48, 7, 44, -59, + -42, -48, 22, -2, -127, -26, 9, -18, 21, 60, + 34, -71, -32, 90, 76, -27, 8, -44, -67, -22, + -45, -30, 40, -58, 1, -15, -9, -15, -24, 70, + 16, 17, 20, 33, -28, -39, 17, -15, -6, -38, + 75, -15, 7, -5, 56, -33, -50, -62, 82, -2, + 23, -26, 9, -1, -35, 75, 36, -13, -21, 79, + -43, -55, 36, 56, 11, 61, -26, -50, 75, 72, + -29, 25, 40, -31, -35, 5, -40, -35, -45, 25, + 25, -56, -21, -23, 40, 9, -9, 32, -21, 34, + -62, 67, -8, 4, 17, 57, 64, 57, 33, 0, + 55, 26, -44, 61, 46, -12, -39, -52, 12, -57, + -30, -47, -16, -22, -24, 43, 60, 51, 35, 0, + -41, -53, -113, 1, 10, -7, 44, -106, -47, -50, + 44, -46, -90, -31, -34, 47, 55, -11, -10, -21, + 62, -27, -86, -12, 52, -65, 44, -65, 52, -12, + 2, 4, 13, 83, -77, 80, -9, 32, -64, -33, + 58, -48, -68, 55, -80, -23, -40, -30, -33, -12, + -60, 79, 42, 49, -14, 92, 27, -84, 36, 72, + 28, 9, -26, -74, -20, -25, 35, -36, -28, -49, + -29, -36, -42, 51, 0, 52, -11, 49, -44, 72, + -6, -12, -71, -9, 42, -55, 36, -62, 117, -50, + -18, 36, 46, 27, -20, -46, 13, -91, 40, -38, + 42, -62, 40, -24, 59, 61, -14, -34, -12, -41, + 26, 83, -69, 52, -15, -54, 53, 55, 24, 16, + 4, 9, 52, -82, 12, -46, 62, 8, -16, -18, + -12, 39, -60, -13, -23, -78, 6, -44, 20, -8, + 47, -17, 24, -52, 0, 27, -47, -55, -5, -40, + -41, 103, 0, 74, 17, -11, 72, 11, 12, 38, + -29, 12, -58, -17, -16, 31, -93, 54, 51, -43, + 42, -67, -127, 53, 4, 26, 62, -54, 14, -51, + -59, -107, -7, -17, -56, 0, -13, -47, -70, 9, + -100, 14, 28, 45, -102, -34, 57, 79, 0, -34, + 9, -73, 45, -37, 72, 46, 70, -14, 28, -39, + -1, 0, 29, -58, 23, -26, 71, -104, 48, -14, + -12, -50, 19, -18, 14, 50, -22, 44, 8, -36, + 3, -39, -1, 3, -11, -44, 10, 32, 36, 52, + 82, 25, 0, 21, 8, 16, 53, 19, 59, 32, + 41, -40, -28, -57, 6, -4, -56, -53, -62, 37, + 40, 71, -68, 41, 47, -43, -6, 55, 11, -25, + 59, -52, 0, -11, 72, -70, 0, 54, -55, 8, + 6, -54, 16, 76, -26, -16, 8, -5, 15, 39, + -81, 43, -54, 26, 53, -104, -56, 25, -2, -73, + 55, 17, 7, 47, 88, -16, -1, 84, -19, 53, + 102, 3, 26, -49, 20, -29, 84, -41, -50, 23, + 100, 41, -12, -16, -87, 79, 11, -50, 11, 72, + -35, 22, 87, 25, 45, -79, -12, 9, 57, 54, + -18, 3, 2, 27, 2, 10, -61, -11, 17, -54, + 29, 6, 59, -63, 67, 15, -25, -31, -52, 7, + 70, 63, 94, -50, 84, -15, 7, -5, 17, -28, + 1, 26, -18, -35, -37, 30, 29, 5, -43, -28, + -1, 46, -47, -10, 11, 51, -3, 25, -29, -77, + 0, -45, -64, -20, -12, 43, -47, 3, -19, -26, + -53, 61, -99, -37, -78, 39, -82, 47, -62, 19, + -81, -77, 3, 6, -63, 19, 39, 1, -17, -21, + 16, 8, 81, -8, -22, -1, 43, -19, -10, 19, + 7, -72, 66, 46, 23, 26, 24, -17, -67, 43, + -55, 10, 17, -50, 47, -46, -97, 20, 23, 79, + -43, -90, 3, -1, -15, -55, 44, -20, -52, 96, + 89, -56, -21, -21, -18, 32, 115, 15, 62, 70, + 39, 19, -70, 55, -6, 56, -33, 27, -48, 30, + 42, -73, -27, 35, -3, -33, -44, 2, -7, 80, + 31, -58, 21, 33, 6, -23, 11, -74, -56, 26, + 9, -3, -22, -23, 9, -33, -54, 2, -30, -49, + -43, -4, -8, -18, 41, 56, -31, 38, -25, -30, + -3, 27, 34, -17, 7, 85, -36, 19, -69, -5, + 53, 60, -40, -80, 106, -55, -68, -93, 28, 16, + -70, 19, 51, -52, -17, -31, -24, 0, 8, 27, + -6, 49, -11, 63, -14, -78, 56, -12, -34, 25, + 28, -34, 23, 18, -38, 60, -26, -34, 14, 16, + 12, 32, 39, 15, 0, -25, 2, 2, -37, 20, + -83, -4, 74, -41, -15, 47, -90, 3, -34, 17, + 22, -46, -12, 27, 16, 53, 12, -66, -31, 43, + -53, -44, -40, 47, -75, 55, 55, 26, -79, -27, + 97, -2, -2, 121, 44, -30, 46, -71, 45, 25, + -49, 112, -107, -22, 29, -34, 73, -28, -20, -33, + 29, 18, -10, -4, -6, -18, 47, -84, -15, -44, + -23, 33, -10, -30, -2, 15, -67, -17, 26, -26, + -23, -17, 56, -33, -99, 31, 66, -9, -121, -7, + 38, -16, 13, -24, -49, -17, -48, -12, 50, 32, + 23, 26, -21, 54, -55, -13, -29, 16, -49, -61, + 9, -25, -109, -6, -24, -3, -49, 85, -17, -42, + -8, -51, 36, -49, -46, 3, 58, 46, -39, -32, + -14, 38, -99, -58, 54, -63, 27, 21, 5, -5, + 110, -24, -25, -4, 77, 13, -49, -7, 22, 19, + 40, -8, 50, 83, 35, 27, 32, -44, -54, 56, + -68, -110, 46, -9, 96, -101, -59, -32, -9, 6, + 68, 70, -19, 53, -48, -21, 18, 34, 49, 52, + -25, -55, 7, -21, 4, 52, 6, 27, 24, -13, + -15, -24, -14, -15, -6, -105, 40, 46, -77, 64, + 34, -100, -28, 35, 6, 46, 14, -51, 12, 27, + 110, -33, 8, -52, -69, -4, -49, -26, -1, 35, + 5, -68, -9, 32, -73, -9, -24, -9, -21, -22, + 83, -30, -41, 51, 24, 14, 69, 7, 33, 3, + 15, 125, 60, -20, 50, -34, -25, -38, -38, 49, + -57, -118, 58, -12, -42, 37, -55, 50, -17, -56, + -18, -28, 63, -26, -6, -45, -24, 48, -14, 36, + 15, 7, 51, 100, -44, -30, -31, -2, -10, -51, + 21, 16, 16, 60, -43, -20, 53, 1, -26, 24, + 29, 29, -55, -14, 89, 50, 38, 84, -65, 55, + 48, 19, -19, -12, -62, -29, -22, -53, -22, -13, + -28, 53, -69, -33, -11, -33, -27, 55, -32, 16, + 2, 9, 15, -84, -44, 44, -5, 4, 18, 7, + -8, 0, 24, 40, -3, -13, -25, -1, -14, -41, + -24, 1, -60, -7, -1, 10, -53, 30, -64, -40, + -17, 37, 36, -29, 8, 18, -64, 1, 10, 15, + 48, -33, -55, 16, -6, -82, 9, -5, -62, 7, + 58, -26, -11, 13, 29, -63, 4, -50, -99, 11, + 4, -34, -71, -32, -40, 14, 37, -28, 120, -35, + 29, 47, -43, -18, -35, -22, 15, -23, 23, 24, + 14, 34, -54, 71, 65, -4, -26, 44, 10, -2, + 52, 127, -2, 21, 8, -18, 26, 3, -38, 67, + -68, -29, -42, -30, 65, 4, -11, 3, -59, -38, + 3, 65, -19, 5, -59, -75, -52, 29, 43, 29, + 62, 59, -24, 18, -18, 47, 45, -13, 62, 96, + -20, -40, -11, 52, 36, -18, 50, -87, -13, 11, + -27, 14, 24, -6, 26, 74, 56, -75, -82, 33, + 27, -20, 20, -21, -7, 38, 40, -98, 8, 23, + -65, -28, -37, 69, 25, -30, -50, -40, 56, -32, + 18, -34, 54, 26, 21, -44, -36, 41, -56, -5, + -16, 47, 14, 51, -34, 127, -71, -57, 25, 92, + -5, -31, -38, 54, 12, 5, 23, 50, -69, -2, + 25, 5, 11, 43, -29, -25, -59, -19, 61, -45, + -51, 26, 22, -35, 16, 11, -6, -34, 10, -22, + -13, -9, -29, -77, 35, -110, 103, -49, 19, 48, + 56, 36, -96, 64, 66, 44, -68, -21, -13, -83, + 104, 84, 13, -3, 1, 48, 17, 58, -36, 49, + -63, -20, -104, 46, 53, 32, 10, 58, -39, 44, + -12, -88, -13, -42, -83, 89, -61, -32, 70, -37, + 13, 30, -14, -22, 42, -125, 34, 43, -1, -50, + 13, 11, -60, 39, -3, -72, 30, -27, -17, -60, + -30, 51, -5, 23, -6, -80, -26, -13, -31, 21, + 53, 1, -58, 43, 46, 34, -52, 52, -65, 50, + -87, 30, 73, -47, 62, -68, 21, -15, -53, -43, + 43, 62, -24, -2, -42, -38, -23, -101, -14, -1, + -46, 52, 2, 68, -72, 12, -106, -53, -16, -30, + 30, -68, 14, -19, 33, -82, -27, -33, 45, 23, + 20, -34, 18, -34, -2, -60, -32, -66, 42, -58, + -2, -50, 12, 27, 14, 0, 94, -49, -6, -6, + 15, 15, -35, -70, 2, 3, 7, 9, 18, -23, + 82, 8, 49, 52, 63, -63, -2, 46, -4, -92, + -56, -74, 17, 20, -19, 17, 6, -43, -69, -25, + -59, -8, -75, 37, -64, -22, -16, 8, -23, 22, + -55, -62, -17, 1, -51, -23, -87, -64, 19, 65, + -85, 77, 46, -31, 11, -52, -8, 72, -23, -1, + 69, 35, -5, 34, -60, -78, -52, -115, -22, 68, + -14, 62, 34, 56, 68, 11, -14, -10, 60, -1, + 103, -93, 62, 0, 99, 36, -81, 101, -10, -48, + -27, -15, -17, 84, 10, 32, 41, 64, 53, -3, + -76, -12, -35, -9, 23, -51, 48, -23, 1, 29, + -8, 1, 17, 25, -50, 85, -70, -44, 84, -3, + 26, 73, -51, -59, 87, 12, 55, 1, 4, -14, + 65, -48, 61, 21, -11, -5, 36, -22, 5, -57, + 46, 39, -22, 7, -77, -25, 2, -73, 71, 6, + -18, 16, -12, -34, -18, 14, -58, -10, 4, -7, + -28, -25, -99, 9, 22, 32, -10, 63, 72, -94, + 2, 99, -127, 85, 31, 30, 58, 12, -11, 57, + 20, -41, 37, 35, -7, -74, -82, -7, -3, 22, + -35, -69, -27, -21, -32, 29, 30, 20, 52, -20, + -16, -37, -61, 0, 69, 77, 3, -3, -59, -95, + 44, -45, 26, -27, -30, 53, 28, -49, -56, -2, + 2, -31, 69, 79, 12, 28, 19, -70, 29, -17, + 6, 18, 56, 6, 31, 37, 16, -51, 5, -52, + 57, -50, -68, -15, 42, -36, -12, -2, -9, -18, + 47, -98, -57, -27, 2, -51, -28, 60, -13, 12, + 30, -7, 71, 31, 47, 78, 51, -8, -127, 42, + -29, -19, 14, 83, -24, 18, 10, 9, -56, 9, + 2, -48, -28, -32, 6, -26, -31, 16, -3, 62, + -19, 24, 75, 24, 57, 16, 10, -33, 23, -47, + -43, -45, 21, -46, -10, -41, 93, -60, -26, -41, + 91, -24, 22, 34, -44, 43, -16, -82, 57, 48, + -67, 22, -11, 62, 23, 55, 68, -11, -5, 89, + -6, 31, -10, -1, 9, -54, -53, -60, -79, -7, + -23, 62, -37, 12, -59, -77, -27, 26, 32, 46, + -109, -38, -37, 19, -55, -30, -77, 72, 46, 18, + -58, -76, 16, -66, 19, -46, 32, 39, 72, -76, + -17, 53, 102, 4, 25, -28, -41, 82, 9, 102, + 12, -105, 30, 72, -53, 67, -114, 55, 26, -2, + 42, -48, 21, 44, 43, -49, -45, -9, -32, -41, + -1, -43, 63, -38, -41, -4, 4, 8, 19, -33, + -41, -48, -34, -52, -12, 5, 70, 26, 42, -24, + 21, 46, 30, 40, 40, 1, 63, 31, 14, -35, + 49, -51, 30, -13, -50, -11, -7, -24, -27, -70, + -22, -7, -11, 34, 79, 52, -43, 71, -28, 27, + -3, 55, 55, 80, 27, 33, 59, 56, -60, 48, + 85, 61, 72, -10, 35, -87, -48, -99, -17, -8, + -9, -7, 85, -68, 28, -78, -26, -11, 45, 31, + 3, 27, 35, -80, 9, -31, 16, -6, 8, -48, + -15, -17, 1, -83, 39, -36, -2, -45, 35, -21, + -64, -36, 33, -99, 27, 25, 62, -25, -83, 59, + 22, -2, -66, -28, -36, -61, 108, 66, 10, -18, + -50, 87, 85, 53, 47, -2, 33, -32, -23, 70, + 22, 39, -51, 5, -17, 4, -91, -21, -28, -127, + 44, 9, -11, -77, -26, -14, -8, 60, -50, -15, + 20, 30, 50, -94, -77, -83, 26, 14, -38, -51, + -41, -7, -77, 34, 21, 58, -45, 16, -30, 24, + 50, 1, -64, 77, -30, -11, 61, 6, 46, -14, + -67, 51, 61, 78, -5, 56, -88, 34, -2, 14, + 100, -28, 66, 49, -11, -55, 43, -50, 73, -10, + 4, 83, -36, -70, 36, 86, -8, -3, 31, 23, + 36, 50, -6, 74, 43, 19, 47, 9, 56, -78, + 51, 18, 5, 18, -45, -38, 20, -37, -19, -11, + -15, 78, 75, 12, -19, 26, 22, -46, 91, 73, + -66, -2, -46, -97, -32, -34, 18, -3, -7, 50, + 33, -53, 65, 16, 45, 80, 34, 14, 5, -11, + -14, 67, -35, -4, -38, 14, -14, 35, -40, -13, + -46, -38, 19, -80, -49, -19, -10, 4, -15, -10, + 6, -65, 73, -46, 22, -3, 48, -47, -65, -61, + 18, 30, -11, 3, 24, 40, -16, 41, -15, -54, + -48, 3, -28, 20, -4, -36, -11, 27, -38, 29, + -11, 49, 52, 36, 30, 48, -67, 17, -15, 86, + -22, 28, -66, -33, -6, -32, -36, 3, 11, 20, + -7, 6, -10, 26, -22, 3, 45, 44, -74, 30, + 8, -2, -12, 88, -10, 72, 25, -66, -22, 5, + -59, 15, 42, 69, 28, -27, 16, -26, -23, 89, + 20, 68, -32, 3, 47, -49, 52, -81, 32, -43, + 4, 52, 45, 22, -45, 5, 19, -69, -58, -78, + -33, -12, 52, 4, 47, 38, 16, 7, 36, 14, + -3, 15, 1, 3, 62, 3, 71, -85, -69, 43, + -43, 27, 19, 58, 86, -58, 9, -7, 0, -62, + -51, 7, -9, -59, 5, -25, -5, -27, -59, 5, + -54, -60, 0, 3, 26, 21, -95, 98, 18, 12, + -28, -39, -9, 38, 77, 105, 60, 74, 17, 49, + 61, -68, -30, 10, 21, -21, -92, -45, -58, -24, + -5, 54, -49, -42, -25, -18, 66, 41, 35, -20, + 48, -40, -31, 79, 65, -19, -10, 1, -35, -32, + 46, -5, 46, 56, -11, -38, 59, -28, -52, 17, + 15, -64, 40, 46, 22, 107, -66, 29, -7, -42, + -13, -106, 72, 59, -35, 106, 12, 107, -24, 40, + -11, 49, 21, 26, 17, -16, 7, 14, -30, 47, + -14, 53, 38, 24, 18, 61, -19, -71, -1, -59, + -114, -19, 24, 25, -52, -40, -28, 25, 37, -12, + -41, -21, 90, 48, -88, 1, -69, -108, 37, -106, + -26, 16, -37, -18, -8, 65, 37, -44, -38, 6, + 48, 2, 32, -20, 54, 48, -35, -33, 19, -46, + 13, 39, 46, 9, 0, 0, -58, 27, 24, 5, + 14, 13, -49, 74, 13, 3, 38, -85, 42, -15, + -6, 2, -21, 5, 12, -30, 28, 45, -81, -46, + 24, 66, -127, 10, -20, 51, 2, -12, -37, 10, + -1, 49, -26, 6, -24, -15, 33, 74, 45, 74, + 9, -3, 28, -21, -2, -43, -107, -98, 7, -83, + 0, -47, 28, 0, 4, 11, 53, -65, 20, 37, + -47, -69, -20, -46, -20, 44, -9, 34, -13, -3, + -42, 7, 87, 9, -7, -76, -30, 52, 2, 14, + -82, 45, 61, -49, 28, 79, -108, -63, 67, -77, + -5, 99, -66, -25, 33, -13, -23, -28, -121, 35, + -63, 35, 1, -13, -59, -115, 51, -14, 50, -15, + 68, 52, -111, 107, -62, 86, -86, 34, -127, 26, + 24, 41, 109, 85, -54, 1, 6, -41, -6, 17, + 21, 35, 113, -11, 19, 33, 74, 11, 56, 25, + -127, 47, 36, -92, 23, -73, -11, -10, 26, 67, + 56, -30, 71, -64, -41, 18, 23, 98, 66, 51, + 23, -38, -31, -18, -30, -22, 26, -76, -68, -10, + 7, -68, 39, 34, -22, 26, -9, 43, 9, -29, + 127, 47, 67, 30, 6, 53, 4, -47, -33, -23, + -4, 28, 26, -30, -32, 82, 37, 17, 26, -127, + -39, 10, 29, 41, 5, 30, 35, -7, -24, 63, + -127, 40, -19, 52, 28, 8, -61, 36, -2, 11, + 37, -98, 31, 39, 46, -34, -90, 34, 0, -35, + 62, 74, 53, 60, 42, -53, 7, -76, 16, -57, + 50, -46, 54, 23, -5, 19, -1, 29, 16, 50, + 20, -38, 76, 26, -14, 15, -57, 15, 33, -87, + -85, 127, 27, -2, 11, 17, 35, -38, -35, 86, + -50, -36, -17, 42, 71, -2, 59, -31, -69, -16, + -53, 59, 27, -25, 30, 41, -52, 42, 5, -11, + -17, -38, -53, 0, 55, -41, 10, 31, -28, -48, + -43, -28, 6, 55, -25, -34, -46, 5, 51, 5, + 42, -4, -20, -28, -78, -46, 0, -7, -29, 16, + 3, -18, -58, -22, -42, -32, 7, 49, 25, -67, + -38, 40, -77, 11, -68, 1, -20, 67, -48, -90, + -73, -53, -80, 13, -28, -88, 46, -67, -67, -78, + -26, -36, -7, -54, 42, 13, 33, 78, -42, 49, + -56, -47, -32, 13, 42, -67, 17, 18, 52, 17, + -46, 9, 67, 20, -39, -17, -17, 41, 9, 60, + -25, -77, 0, -10, -44, -28, 45, -42, 38, -51, + 32, 50, -23, 18, -2, -46, 8, 22, -52, -40, + 7, -54, 17, 47, -52, 37, -36, 26, -92, -55, + 67, -28, -59, 23, 61, -52, 21, 5, 60, -42, + -74, 15, -27, -12, -56, 127, -3, 39, 66, -73, + 84, 22, 13, 77, 68, -14, 51, 97, 37, 63, + 11, 90, 27, -50, 13, -11, 56, 13, -56, -8, + 76, -3, 10, -23, 15, -24, 32, 19, -35, 8, + -61, 13, 26, -23, -10, -37, -10, -48, 10, 37, + -40, -10, 23, -62, 16, 39, 8, -43, 50, 14, + -70, 25, 5, -43, 66, -105, 61, -32, -42, 120, + 27, -12, 17, 38, 50, -61, 9, 23, 39, -29, + 26, -59, 5, -55, 25, -21, -44, 24, 64, 10, + -4, -40, 12, -78, -15, 78, 80, 63, -91, 9, + -41, -31, -78, -16, -59, -68, -21, -17, 18, -17, + 14, 0, -106, -39, 31, 46, 21, -15, -7, 79, + -17, 89, 28, -39, 48, -26, -51, 57, -53, -44, + 49, 29, 93, -9, 75, 24, 22, 4, -14, 57, + -92, 6, 8, 21, -27, -59, -42, -50, -127, 13, + 1, 35, 90, 5, 0, 50, 9, 106, -41, 7, + -29, 36, 20, 36, -47, 58, -64, -5, -1, -63, + 19, 3, -2, -79, -44, 30, -20, 3, -31, -17, + -31, -57, -49, -58, 49, -44, 19, 8, -60, -93, + -49, -38, 52, -37, 15, -62, -70, -21, 87, -48, + -19, -95, 54, 21, 9, -11, 4, 9, -2, 20, + 59, 45, 3, -37, 7, -22, 46, 45, -53, 84, + 35, 80, -27, -42, 91, -13, 38, -53, -57, 56, + -77, -34, -27, -18, 47, 59, 32, -56, -33, 20, + 54, -60, -48, -120, -89, 8, -46, -33, 23, 71, + -87, -40, 45, -42, -30, -7, 48, 38, -78, -60, + 5, -30, -43, 56, -9, -61, 34, -65, -12, -9, + 23, -41, 72, -41, 64, 30, 3, 67, 51, -45, + -37, 61, -38, 0, -17, -11, -46, 31, -36, 2, + 58, -39, 35, -5, -48, -6, -55, -26, -45, 63, + -8, -56, -26, -42, -27, -47, 42, 30, -53, -38, + 80, -35, 32, -4, 15, 50, 31, -60, -105, -42, + 5, 60, 45, 25, -33, -35, 34, 23, 17, 12, + -97, 19, 51, -56, 54, -18, 69, 0, -5, 16, + -64, -31, -48, 23, -105, -63, -46, 19, 45, 55, + 53, -14, -102, 14, -99, 40, -57, -106, -8, -78, + -74, 57, 68, 72, 14, -54, 30, -63, 0, -71, + 47, 20, -45, -105, -56, -4, 12, -11, 84, 6, + -11, 54, -1, 16, 21, 37, 15, 28, 83, 71, + -33, -4, 1, -7, -12, 45, -1, -63, -19, -25, + 39, 39, 79, -38, 18, -3, -36, -61, -3, -39, + -20, -101, 49, 57, -39, -10, -14, 11, 41, -39, + 0, -17, -91, -49, 39, -13, 71, -6, -7, 50, + 49, -40, -21, -57, 2, -66, 19, 35, -30, -8, + 17, -104, -75, -127, -35, -6, 10, -84, 36, 59, + 69, 64, 47, -42, -90, 13, 54, -43, 81, 21, + -40, 9, 20, 49, 41, -46, 88, 10, 20, 6, + -8, 94, -50, 7, 81, -55, -17, 119, 40, -62, + 28, -83, -12, -31, -10, 61, -43, -34, -28, 15, + -28, 72, 30, 48, 11, 43, 7, -61, -93, -32, + 98, 12, -3, -63, -115, 46, -79, -30, 25, 23, + -37, -79, 30, 36, -11, 32, 12, -33, -76, -34, + 87, 95, -21, -63, -10, 69, 63, -4, 91, 72, + 102, 73, -94, -28, 40, 48, 29, 41, 34, 9, + 14, -29, 10, -9, -22, 38, 4, 7, -17, 32, + 12, -50, -30, 53, -33, -15, -37, 37, -31, -46, + -23, -12, -14, 38, -8, 52, 45, -30, 10, -71, + -37, -52, 15, -11, -13, -5, -44, 2, 62, 40, + 24, -6, 3, -98, 102, 59, -64, -17, 68, 12, + -71, -46, 21, 36, 28, -66, -17, -56, 49, -22, + -52, 30, -52, -44, 1, 21, -13, 21, -49, -65, + -33, 7, -17, -19, 89, -58, -75, 15, -45, -72, + -28, -56, 58, 27, 50, -51, 15, -38, 15, 29, + -15, 35, 44, 11, 45, -32, -15, -108, -71, -29, + -25, -61, 26, -34, 17, 48, -49, -21, 39, 37, + -6, -62, 61, 81, 48, -49, 72, -16, 81, 65, + -25, -33, -21, 41, -4, -75, -39, -69, -79, -22, + 42, 18, -27, -15, -13, 58, 27, 16, -63, -71, + 44, -23, -32, 47, -45, 52, 9, -52, 34, 26, + -90, 58, -26, 90, -54, -2, -20, -43, -34, -2, + -51, -8, 0, 23, -4, -63, -66, -72, -32, -14, + -1, 64, 0, 13, 65, -44, -30, 35, 2, 9, + 15, -2, -38, -14, -28, 26, -2, 1, -48, -14, + 24, 5, -5, -29, 31, 24, 37, 3, 17, 58, + 11, 41, 60, -34, -1, -20, -9, 3, -44, 75, + 86, -29, -2, 27, 53, 60, 39, -29, 127, 32, + 66, -35, -41, -4, -87, -30, -54, -11, -89, -44, + -83, -68, -72, -17, 42, -23, -25, -28, -29, 65, + 27, 27, 127, -20, 80, 59, -33, -40, -6, 59, + 13, 46, -17, 7, 22, -41, -18, -31, -43, -16, + -59, -33, -25, 32, 25, -22, -42, 63, -34, -64, + -57, 21, -42, 16, -67, -107, -46, 31, 31, 34, + -72, 64, 16, -8, -73, -22, -18, 50, -87, -14, + -50, 19, -36, -70, 35, 23, -53, -39, 27, 51, + -12, -25, -12, -54, 33, -12, 14, 0, 61, 127, + 64, 41, -32, 14, 3, 18, -52, 11, 50, 8, + 7, 11, -44, -18, 17, -62, -19, 29, 46, -59, + 17, 57, 9, 45, -49, -65, 32, -28, -104, 7, + -77, -102, 19, 22, -55, 46, 52, 36, -22, -76, + -38, -26, -13, -2, 18, -53, 4, -21, -12, -59, + 35, 9, 25, 20, 59, -13, -23, 43, 67, -72, + 2, 42, 71, 37, 50, 16, -31, -44, -9, -61, + -61, -39, -93, 63, -22, 23, -68, -15, -7, -69, + 92, 65, 31, 0, 81, 79, 9, -7, -11, 48, + 22, -27, -11, -52, -17, 38, -34, 65, -22, 35, + 12, -34, -5, 12, 29, 23, 18, -31, -46, -18, + -1, 11, 46, 52, 27, 26, -63, 32, -38, -16, + 46, 31, -46, 49, 11, 16, -19, -2, -37, -52, + 27, 6, -54, 15, -27, -34, -49, 35, -3, -29, + -40, 48, 35, 43, 42, -3, 54, -44, 24, -15, + 15, 9, -114, 45, -47, 43, -43, 1, -43, 24, + 80, 28, -3, 24, -45, -16, 16, 40, -26, -20, + -18, -30, -77, -25, 36, -27, 43, 17, 21, 53, + -76, -37, 27, 16, -19, 15, 9, -4, 7, 45, + -33, -31, -24, 33, -20, -84, -4, 18, 11, 44, + 9, 21, 18, -43, 17, -20, 11, 0, -34, 35, + -28, -13, -33, 25, 51, -63, 25, 7, 57, -68, + -60, -46, 31, 1, -11, -7, 61, 9, 41, -17, + 44, 16, -49, -51, 23, -10, -23, -69, 3, -28, + -53, -22, -55, 1, 27, 49, 35, -40, 20, -55, + 28, -91, 38, 7, 67, -97, -7, 22, -19, -68, + 0, -25, -52, 32, -49, 23, -28, 46, 12, 33, + -62, 16, 3, 30, -24, -23, -20, 7, 51, 28, + 1, -77, 24, -62, -73, -39, -8, 21, -27, -22, + 39, -96, 32, -51, 64, -74, -6, -23, -97, 72, + 25, 22, -12, -30, 0, 27, -127, -27, -5, -10, + 18, 32, 9, 9, -1, 85, -71, 11, 20, 5, + 46, -19, -15, 8, -2, 61, -3, -81, -9, 18, + -94, -29, 4, -56, -21, 28, -4, 18, 9, 7, + -59, 1, 65, 46, 18, 24, -9, 2, 61, -1, + 15, 37, -102, 3, -13, 22, -51, 16, -13, -10, + -19, -61, 13, 34, -19, -46, 11, -57, 19, 11, + -82, 3, 0, -38, -55, 79, -8, 55, 36, -5, + 19, 32, -107, -9, 11, -15, -41, 39, -3, 14, + -11, -8, 62, 1, -50, 42, 42, 39, 34, -10, + 25, 61, 40, 58, 38, 31, -41, -2, 40, -14, + 0, 33, 5, -77, 19, 0, 14, 16, 7, 20, + -80, 98, 50, 66, -110, -33, -31, -85, -35, 76, + 50, -34, 20, -69, -12, 45, 25, 45, -47, -10, + -88, 74, 72, -32, -2, 11, -60, 93, 25, -55, + 80, -50, 28, -2, -17, -5, -30, -12, -22, 15, + -22, -41, -28, 7, 27, -20, -34, -12, -40, 51, + 33, 66, 12, 57, -2, -2, 15, -17, 23, 14, + 27, 28, 2, 5, -11, 14, -73, 36, 29, -65, + -19, 20, 58, -42, 20, -40, -59, -36, 37, -8, + -12, -28, 51, 10, 18, 2, -23, -33, -63, -4, + 10, 79, -16, -34, 8, 34, 20, -13, -14, -49, + -34, -41, -30, 72, -9, -26, 55, -3, -38, -22, + -1, 80, 51, -41, 67, -2, -20, -30, -52, 62, + -5, 23, 28, 86, -28, -23, -9, 5, -41, 39, + 1, -6, -81, 50, 14, -27, -46, -11, 82, -26, + -13, 50, -53, -89, -27, 20, -8, 9, -49, 38, + 68, 72, 14, -41, 92, -62, 14, -41, -14, 0, + 47, 29, 95, -16, -23, -69, -62, -32, 24, -55, + -39, -5, 35, 2, -40, 26, -14, 88, 59, -18, + 86, -12, -27, 54, -63, -73, -52, -36, 72, 54, + -12, 13, 27, -10, -14, -36, -14, 18, -24, -37, + 23, 32, 7, -7, 29, -31, -8, 5, -25, -60, + -64, -17, 5, 72, -17, -67, 39, 11, 39, -61, + -1, -50, -13, 30, 22, 21, 0, -20, 26, -4, + 1, -17, 7, -34, -20, -38, 11, 3, -22, 28, + -1, -31, -34, -19, 67, -46, -22, 22, 23, 25, + 46, -50, 10, 59, -8, 80, 46, -69, 47, -33, + 0, 63, -52, 60, -74, -33, -78, -20, -60, -5, + 70, 75, -21, -5, 51, 66, 3, -27, -31, -7, + 66, -6, -26, -26, -32, 3, 58, 27, -57, -4, + -61, -37, -43, -47, 34, 9, -12, -8, -37, -9, + 25, -5, 4, 45, 36, -46, 79, -38, -81, 42, + -5, -11, 59, -32, 40, 75, -86, 71, 76, 3, + 14, 35, -55, -8, -64, -7, -14, -59, -22, 0, + 39, -35, -54, -10, -13, -47, 30, -61, -16, 4, + 56, 47, 54, 12, -6, -71, 32, 20, -62, -24, + 85, -33, 25, 52, 33, -59, 1, 71, -64, 23, + 29, 26, -50, -11, -15, -30, -28, -18, 19, -9, + -36, -14, 49, -38, 50, -61, -41, 4, -15, -42, + 42, 37, -58, -49, 40, -54, -27, -19, -9, -105, + 39, -63, -26, 14, -43, -10, 34, -31, -42, -46, + 14, -78, -75, 51, -3, 6, 8, -14, 97, -61, + 19, -36, 10, -56, 93, -71, 22, -39, 78, -13, + -69, -66, 40, 16, -21, -20, 64, -33, -52, -58, + -91, 14, 49, 5, 13, 10, -67, -1, 31, 35, + 9, -40, -45, 35, 12, -56, -7, 50, -48, 12, + -34, -36, 30, 8, -11, -32, -30, -8, -16, 31, + -85, -31, 4, -29, 34, 46, -63, -38, -21, 25, + -15, -104, 6, 23, -1, -30, -27, -81, -39, -62, + 43, 4, -55, -22, -5, -45, 9, -36, 9, -17, + 9, 6, -46, -30, -40, -32, -10, 5, 5, 21, + 88, 10, 57, 23, -21, 60, -32, -66, -4, 20, + 32, 61, -46, -25, -41, -38, -55, -30, 30, -50, + 37, -45, 44, 17, 1, -1, -48, -44, -53, -43, + 16, 7, -16, -49, 70, 4, 11, -56, -21, -8, + -5, -14, -35, 50, 10, -25, -59, 41, -13, -31, + -2, 36, 3, -14, 3, -19, 1, -16, -18, -16, + -82, 23, 36, -6, 52, 40, 28, -42, 43, -49, + 46, 18, -29, 3, 79, -33, -4, 65, 8, -46, + -53, 62, 9, -71, -23, 46, 12, -51, -3, -84, + 34, 9, -12, -47, 44, 35, -5, 52, 51, 61, + -39, 34, 3, 52, 5, -46, -8, -11, 24, 4, + -46, 35, -1, -42, -46, 55, -70, -35, -10, 28, + -28, -64, 13, 45, -33, 49, -5, -33, 62, -109, + 4, -16, -45, -92, 28, -80, 19, 66, -21, -28, + -28, 44, -3, -5, -26, -74, 6, -25, 13, -1, + 1, -23, 20, -44, -17, -121, -18, 3, -39, 78, + 72, 66, -47, 9, -127, 11, -15, 25, -69, 80, + -16, -48, -50, -5, 26, 69, 50, -3, 15, -16, + -38, 9, -22, -80, -13, 34, -43, 32, -15, 17, + 8, 73, 3, 45, 59, 60, 29, -18, 60, 22, + -20, -24, 4, -35, -82, -14, -32, 24, 2, 38, + -20, -11, -11, -8, 17, -63, 10, 2, -31, 9, + 13, 16, -13, 6, -25, -108, -22, 44, -35, -1, + -30, 35, -17, -32, -61, 79, 22, 59, 0, -11, + -13, -35, 4, 1, 26, -13, -4, -35, 5, -41, + 32, 55, -33, 52, 29, -34, 80, 64, 10, -45, + -16, -34, -14, 27, -17, -72, 66, 28, 18, 14, + -83, -29, 24, 6, 31, 47, 5, -100, 31, 25, + -6, 13, -13, 44, 14, 0, 65, 50, 29, 35, + 33, 31, 9, -44, -10, 8, 83, 21, 31, 8, + 1, -50, 14, -11, 43, -39, 32, -34, 3, 10, + 13, 35, -48, 3, -26, -49, -4, -32, -42, 0, + 44, 35, -2, -12, 78, 30, -27, -30, -37, -59, + 29, 34, -18, 34, -70, -32, 14, 21, 2, -6, + 70, 67, -70, -3, 71, -8, -53, -61, 28, 90, + -10, 16, -69, 26, 76, -122, 14, 19, -24, -58, + -6, 7, 3, 52, 39, 13, 6, -101, -40, -45, + 42, 61, -32, 19, 6, -30, -70, -1, -73, -19, + -7, 8, 10, 3, 9, 31, 45, 37, -61, 23, + -66, 22, 63, -7, 37, 40, 17, -69, -55, -52, + 20, -21, -2, -2, 8, -36, -58, 21, -58, -31, + -77, 14, 13, -64, -45, 25, 46, 74, 46, -34, + 35, -4, 78, -17, 66, 60, -39, -11, -29, 9, + -17, 18, -27, -41, 43, 9, 79, 19, 69, 38, + -78, -26, -50, 0, -30, -51, -49, -11, -46, 69, + 57, -117, -8, -53, -52, 68, 29, -19, 27, -22, + 34, 55, -26, 12, -17, 30, 27, 7, -5, 14, + -20, -29, -11, 5, -35, 6, -43, 24, -29, -12, + 11, 21, -34, -20, 21, 42, 73, 15, 24, 16, + 41, 4, -9, -9, -55, 21, 26, 18, -6, -23, + -8, 7, 15, 9, -15, -44, -15, 27, -40, 67, + 8, 26, -4, 37, 46, 12, 38, 12, 21, 28, + 61, -45, -8, -33, -28, -62, 0, -104, 1, 12, + 49, -53, -12, -83, -40, 55, -98, -51, 29, 76, + 2, 69, -32, -22, 32, 3, 79, 43, 18, 46, + -17, 26, -23, 3, -51, -1, 15, 22, -74, -10, + 36, 16, -18, -13, -35, -35, 6, -11, -5, 38, + -82, 34, 15, -60, 10, 6, 54, -33, -22, -70, + 66, -17, -84, 8, -14, 35, 3, 87, -20, 2, + -8, -89, 22, 68, -49, 5, -72, 17, -31, -103, + -40, -71, -7, 60, -3, 90, 33, -70, 28, -27, + -23, -57, -69, -25, -95, 23, 70, 28, 2, 46, + -62, 1, -56, -33, 12, -2, -63, 34, -88, 76, + -7, 47, 18, 25, 5, -7, 8, 47, -6, 51, + 15, 35, -6, 3, -55, 53, -48, -2, 20, -4, + 6, 47, 40, -38, -18, 54, 25, 67, -27, -20, + -51, 2, -3, 43, -63, -19, 13, -27, -75, -28, + -24, -5, -43, 44, -78, -83, -20, -56, -18, 54, + 28, 24, 7, -24, -46, -42, -16, 5, -14, -22, + -29, 94, 0, -37, -23, 70, -14, -99, 66, 3, + 6, 25, 3, -87, 13, -3, 52, -26, -127, -80, + -77, 56, 46, -25, -72, -47, -42, -18, 15, 7, + -24, -3, -56, -93, -53, -33, -49, -47, 22, -5, + 16, -27, 18, -77, 24, 6, -21, 33, -73, 38, + -14, -3, 5, 24, 28, 6, 11, 32, 25, -8, + -52, -30, -22, 49, 5, 41, 10, 17, 8, 28, + 30, 3, 32, 57, 16, 40, 71, 22, 2, -46, + -43, -30, 49, -37, 41, -40, 34, 29, 66, 97, + 46, -20, 80, -24, -66, -21, -116, -43, -25, 76, + -114, -17, 74, 70, 1, -29, -15, 57, 46, 31, + 60, 71, -6, -12, 34, 57, 0, -28, -13, -15, + -17, 86, 50, -67, -42, -17, 2, 13, 37, 21, + 14, -30, 17, -41, -21, -64, 25, -103, -22, 40, + 83, -40, 41, 127, -27, 108, -26, 11, -18, 3, + -94, 46, 31, 52, -36, -16, 52, -12, 20, 2, + -52, -8, -38, 39, -13, -45, -127, -51, 34, -43, + -90, -117, 10, 36, -78, -14, -50, -60, -50, -18, + -49, 4, 5, -44, -52, -73, -15, -12, 37, -67, + -70, -19, -13, -20, -59, -31, -47, 3, 12, -59, + -12, -39, -47, 31, -45, -18, -21, -6, -16, -7, + -31, -38, -39, 36, 73, 33, 38, -66, -74, -2, + -23, -71, -35, -14, 30, -17, -18, -49, -72, -45, + -17, -47, -63, 9, -29, -10, -83, -61, 9, -26, + -27, -6, -24, -75, -30, -7, 3, -40, -13, -41, + 30, -82, 18, -29, 6, 24, 61, -9, 70, -8, + 55, -60, -46, 54, -14, -109, 24, 34, 4, -8, + 48, -51, 2, 49, 2, -3, 73, 15, 56, 1, + -41, 52, 31, -5, 10, -30, -34, 16, -3, -40, + 22, 23, -6, 74, 48, -18, -8, -20, 66, 14, + -127, -47, 13, -58, 6, -18, -41, -2, -9, -62, + -55, 38, -49, 59, -63, -11, -71, -6, 10, 37, + -9, -43, 16, 29, -39, -5, 78, 6, 38, -75, + -27, 75, 42, -32, -64, 72, 13, 50, 49, 19, + -24, 0, 127, 30, -33, 13, -65, 11, -24, -24, + -36, -21, -63, 15, -47, -14, -33, 31, 21, 90, + -7, -29, -12, 33, 4, 11, -50, -13, 18, 29, + -34, 23, -14, -27, -1, 41, 27, 6, -39, -24, + -99, -52, -45, -9, -58, -12, -23, 36, 35, 41, + 10, 26, -127, 3, -15, -56, 39, -25, 62, -17, + -8, 20, 25, 56, 58, -66, 10, -2, 61, 1, + -56, 14, -6, 6, 66, -30, -44, -22, 46, -45, + -11, -19, -69, 33, 21, 40, -54, 89, -49, 3, + -101, 69, -6, 4, -8, -73, 76, 69, -10, 15, + -36, -36, 6, 23, -4, -11, -54, -62, 4, -28, + -62, 41, -16, -79, -6, -77, -37, -14, -26, 32, + 52, -7, -34, 33, 17, 60, -77, 16, -10, 61, + 57, 7, 4, 42, 81, 55, -14, 2, -83, 9, + 6, 53, -110, 42, -71, -23, 46, -32, 56, 23, + -27, -57, -58, 35, -5, 69, -22, -27, -29, -31, + 23, -47, 8, 45, 8, -46, 5, -27, 2, -95, + 66, 83, 19, -127, -20, 11, 42, -68, -25, 42, + 24, -10, 31, 20, -57, 65, -17, -16, 20, 8, + -30, -3, 108, 4, 13, -35, -26, 91, -37, -31, + 41, 50, -34, 28, 46, 67, 28, 22, 26, 11, + -40, -24, 33, -2, 15, 41, 43, -42, -4, -14, + 15, 38, -62, -45, 35, 59, -10, 54, -28, 16, + 3, -3, 12, 46, 76, -34, 24, -5, 11, -61, + -18, 56, -26, 6, -37, 18, 77, -52, 12, -30, + 82, 50, 25, -33, -10, 46, 80, -4, -51, -3, + 120, 3, 9, 14, 46, -63, -4, 10, -43, -7, + -37, 78, -6, -46, 78, -15, 65, -17, 44, -72, + -60, 7, -39, -49, -77, -24, -40, -23, 8, -115, + -8, 20, 18, -11, -99, 4, -12, -7, -27, -6, + 17, -39, 3, -13, 3, 1, 60, 14, -20, -46, + 46, 41, -6, 85, 48, -45, 87, 11, 3, 38, + -17, 8, -19, 29, 3, 0, 13, -38, 19, -7, + 20, -41, 80, 38, 19, 25, -25, 60, 18, 60, + 18, 48, 37, 36, -75, -44, -31, 70, 57, 39, + -71, 10, -33, 35, -61, 42, 37, -12, 3, 0, + 42, -60, -23, 9, -34, 24, 49, -63, 2, 49, + 9, -9, -84, 47, 10, 49, -73, -1, 11, -14, + -2, 46, 61, 127, 18, 41, 69, 45, 39, 46, + 14, 46, -36, 1, 23, -23, -48, -11, 11, -28, + 7, 26, -5, -32, -117, -13, -12, -41, 50, 82, + 10, -25, -2, 59, -89, 43, 11, -40, -10, 36, + 66, -35, 9, -50, -29, 82, -55, -44, -5, 79, + -50, -5, 36, -28, 58, 11, 98, -23, -93, -13, + -42, 62, 86, -38, -12, 35, 76, -18, -59, -77, + -40, -52, -71, -51, -34, 28, 31, 28, 17, 11, + 7, 37, 31, 50, -68, -22, 9, 83, -2, 51, + 10, 16, -24, -61, 31, 14, -20, 27, -59, -72, + 40, -2, 60, -27, -73, 48, 42, 23, 5, 45, + -26, 16, 58, -55, -14, 48, -9, -40, -45, -44, + -19, 17, 39, 36, -52, 105, 33, 6, 6, 45, + -37, 36, 75, -54, -61, 17, 0, 56, -78, -14, + 23, 85, -48, -48, -40, -14, 9, -45, -15, -12, + 28, 105, 22, -65, -53, 3, 1, 45, -8, -50, + -21, -14, 8, -63, 26, -76, -5, -81, 31, 12, + 2, -38, -31, -13, -3, 3, -43, 63, 49, -28, + -104, 39, -4, -13, 17, 42, -50, 29, -18, 26, + 34, -14, 38, 56, -111, -18, 80, -29, 83, 24, + 48, -3, -16, 31, -26, 31, 31, -29, 50, 71, + -42, 17, -47, -71, -48, -29, 16, -28, -34, -13, + -50, 46, 33, -8, -11, -13, -38, 27, -26, 20, + 70, -25, 17, 6, -73, -127, -54, -104, -10, -30, + 6, 9, -121, -34, 2, 29, 14, -39, -122, -80, + 86, 10, 5, -52, 14, -37, 22, -27, 5, -33, + -14, 46, 39, -35, -22, -25, 58, 24, 41, 20, + -102, -9, -53, -54, 36, -7, 34, 33, 50, 17, + -70, -47, -7, 66, -38, 21, -12, -44, -61, -28, + -21, 2, -57, -18, 41, 62, 58, 25, -50, 0, + 17, 29, 41, -8, 81, -12, -54, -106, 19, -53, + -100, 20, -70, 10, -25, 85, 99, -37, -66, 28, + -50, 27, 42, 8, 3, -57, -33, -12, -13, -126, + 2, 23, 18, -62, -21, -49, -17, -127, -39, -15, + 4, 6, 0, -21, -44, 40, 8, 21, 41, -12, + -80, -34, -21, -29, -31, -45, -50, 46, -11, -63, + -23, 28, -46, -18, -22, -20, -23, -33, -17, -21, + -27, -20, -1, 11, -127, 31, 22, -5, -57, 94, + 18, -27, -58, -23, 61, 21, -36, 28, 47, -39, + 29, 60, 37, 30, -22, -85, -17, -19, -76, -25, + -35, -6, 27, 1, 38, -46, -47, -24, 15, -53, + -19, -5, -8, 12, -28, 34, -17, 0, -84, 7, + 50, 10, -27, -57, 36, 66, 113, -12, 23, -51, + 24, 8, -25, -42, -40, -71, 0, -127, 15, -21, + -15, -25, -16, -58, 24, -15, 10, -86, -12, -87, + -51, 10, -26, 36, -31, -21, 5, -37, 33, 27, + -13, 75, -3, -18, -27, -39, 50, -20, 56, 71, + 52, -5, -22, 30, 42, 36, -5, 26, -52, -23, + 19, 14, -25, 47, -24, 101, -56, 46, -9, 8, + -66, 20, 42, 5, 13, 32, 81, 61, 33, 42, + -56, 59, -103, -67, -17, 0, 53, -56, -17, 17, + -114, -28, -37, -78, 13, -2, -73, 18, 24, -8, + -41, 21, 37, -46, 27, 67, 9, 40, -36, 40, + 114, 7, 52, 43, 34, 7, 28, 53, 85, -81, + 16, 47, 4, -33, -22, 5, 21, -32, 5, -7, + -25, -48, 1, 8, -10, 21, -35, -38, -35, -44, + -29, -42, -25, -89, -3, 19, 101, -25, -74, -51, + -1, -10, 97, 19, 47, 33, 8, 79, 18, 84, + -63, 16, -26, 48, 54, 69, -33, -8, 35, 12, + 7, -20, 14, 46, 44, 73, -44, 18, 45, 27, + 66, 29, -31, -29, -2, -4, 66, 73, 37, 18, + -70, 27, -67, 51, 88, -16, -31, -7, -60, -7, + -36, -45, 87, -31, 22, -4, -85, 80, 6, 22, + 0, -65, -81, -6, -6, -55, 3, -16, 122, -33, + 48, 79, 11, 14, 57, 93, 34, -25, 5, -23, + 5, 48, 82, 2, 38, 22, 9, -34, 41, -7, + 69, -25, 30, 10, -26, 8, 112, 44, -89, 67, + 26, -36, 1, -65, 64, -36, -16, -15, 66, -17, + 73, -8, 7, -33, -49, -31, -11, -51, 60, -7, + -20, 39, 49, 21, -31, -18, -9, -25, 47, 87, + -22, -75, 32, -61, 57, 84, -9, -23, 80, 58, + -10, 7, -48, 11, -2, 1, -37, -65, -19, 16, + -43, 7, 22, -27, -26, -8, -61, -67, -54, -5, + -2, -12, 6, 2, -13, -74, -27, -14, -3, -45, + 21, 15, -23, -7, 55, 48, -72, -35, 26, -3, + 0, -12, 43, -7, 41, -32, 59, -45, 48, -60, + 64, 48, -99, 74, 3, 24, -22, -12, 10, 1, + -87, 86, 24, -14, -12, 19, -64, -17, -27, 74, + 43, -25, 4, 33, 41, 21, 54, -18, -53, 35, + 52, -30, -36, 32, -23, 19, 10, 43, 7, 30, + -85, 27, 43, 22, 4, 16, 99, -31, -119, 25, + 17, -29, -31, 21, -44, 69, 39, 0, 24, -30, + 74, 18, 16, 3, -25, 96, 10, 84, 59, 58, + -52, -16, -9, -28, -52, 9, 34, 27, -45, -80, + -29, -8, 10, -23, 5, 40, 28, -8, -63, -17, + 3, 42, -58, -97, -14, -73, 24, 0, -5, 75, + 58, -95, 89, -85, 30, 27, 45, -39, 0, 78, + -61, 50, -20, -48, -64, -59, 24, 22, -10, 8, + 18, 79, 30, 57, 21, -33, -17, 31, -5, -49, + -12, -75, 77, 68, 6, 104, -36, -34, 24, 17, + -38, 49, -23, -69, -46, 41, -33, 16, -9, 2, + -58, 85, -33, -4, -29, -23, -11, 54, -72, 65, + 37, 47, -97, -14, -54, 74, -15, -102, 19, -6, + 23, -3, -33, -33, -89, -28, -7, 8, -58, -81, + -37, 64, -69, -113, 33, 60, 8, 9, 58, 75, + -84, 58, 68, 30, -73, -29, 17, 43, 47, -1, + -30, -26, -4, 43, 82, -39, 51, 23, 48, -81, + 28, 39, 42, 3, -24, 14, 35, -40, 53, 15, + -11, -24, 41, 4, -42, -15, 26, 94, 0, -53, + 56, 65, -49, -18, 40, -3, 21, -25, 40, 53, + -59, 56, -62, -16, -76, 92, -16, -23, -37, -53, + -34, 23, -39, -59, -46, 54, 7, -4, -42, 28, + -43, -14, -31, -26, -89, -9, -21, -24, 21, 5, + 61, 69, -16, 42, -29, 3, -7, -47, 32, 101, + -73, 29, -13, -53, 1, 22, -47, -29, -20, 94, + -76, -18, 82, -32, -12, 25, 15, -38, -10, -24, + -24, 91, 23, -69, 28, -62, 4, 97, 7, -104, + -1, -4, 109, 52, 41, -56, 91, 81, -33, -24, + -25, 16, 39, 3, -67, -84, 44, 59, 54, 38, + -67, 20, -58, -19, 2, 27, -33, 40, 54, 45, + -31, -43, -4, -22, -38, 81, -35, -25, -110, -10, + 29, -39, -86, 8, 124, 17, -22, 49, -32, 21, + -64, 61, 63, 82, -66, 67, 29, 35, 4, -2, + -44, 13, -39, 53, 54, -109, -15, -90, -2, -8, + -84, 3, -123, -114, -25, 6, 82, -22, 42, 94, + 57, 15, 76, 0, 28, 30, 38, -87, -26, 24, + 58, -71, -51, -60, 49, 47, -13, -79, -42, -38, + 38, 12, -13, 51, -60, -6, -2, -127, -88, -29, + -36, -37, -47, 41, 60, 36, 18, -92, 33, 29, + 89, -14, 81, -96, -7, -55, 17, 65, -39, -72, + 72, 60, 59, 18, -32, -42, -90, 14, 9, -43, + -74, -28, -18, -46, -51, 23, -75, 65, -63, -95, + -59, -63, -84, -29, 85, 7, 53, -71, 17, 32, + 22, 3, 52, -33, 51, -58, 44, 35, 10, 74, + 45, -37, 51, -10, -2, -73, -22, 60, 6, -5, + -30, 16, -51, -30, -3, 51, -18, -54, 4, 14, + -8, -58, 67, 58, -100, -32, -27, -37, -67, -27, + -44, -44, -3, 8, 48, -66, -82, -38, -16, 106, + -36, -13, -34, 37, 17, 34, 30, 38, -27, 1, + 68, 62, -43, -54, 70, 0, -29, 19, -8, 13, + 40, -41, -23, 51, 26, -54, -14, 93, -18, -40, + 29, 6, -100, -9, 31, -47, -30, 59, -77, 26, + 10, 29, 114, 7, 33, 84, 8, -20, 24, 87, + -26, -95, -80, -28, 101, -7, 0, 24, 32, -10, + 27, 47, -20, -34, -24, 3, -46, 61, 31, -40, + 23, 14, 16, -7, -26, 7, 75, -49, 17, 10, + 13, -118, 21, 114, 13, 48, -33, 6, -50, -93, + 29, -18, 14, -73, -18, -95, 28, -15, -65, -25, + -26, -2, -42, 55, 124, -39, 41, 67, -16, 84, + -21, 54, -87, 44, 21, -43, 5, -33, 29, -73, + 11, -60, 43, 50, -52, -16, 127, 28, 51, -53, + 41, -8, 32, -47, -25, 31, 55, 53, -27, -46, + -42, 26, -16, -32, 21, 10, -39, 43, 62, 38, + 43, 5, -63, 22, 9, 12, 2, 0, 74, 46, + -73, 10, 39, 40, -34, -17, -79, -53, -12, 43, + 19, -39, 0, 27, 91, -79, -19, -93, 60, -10, + -12, -81, 17, 5, 18, -104, -39, -97, 29, 69, + -77, 74, 0, -87, -15, -48, -29, 60, -36, -84, + 2, -68, 1, 13, -54, 0, 45, 6, 16, -19, + 22, 29, 20, -6, -12, -21, -36, 20, 57, -17, + -42, 3, -24, -52, 32, 30, 28, 23, 18, -41, + 47, -15, 43, 34, -44, 45, -15, -16, -8, 2, + 20, 85, 50, -2, -127, 19, -73, -3, -23, -15, + -44, 38, 106, 6, -29, 5, 33, -23, 63, -57, + -70, 30, -18, -44, -73, -36, 54, -39, 3, 71, + -55, 0, 82, 45, 25, -64, -5, -32, -3, 42, + -35, 18, 77, -13, -4, -21, -48, -9, 2, -17, + 66, -77, -43, 5, -19, -83, 55, -15, -93, -43, + -24, 92, -76, 92, -27, -35, 1, -80, -33, 8, + 16, -73, -33, -12, -70, -71, 5, 39, -6, -15, + -34, 56, -33, -37, -69, 78, 22, -26, 19, 83, + 27, -1, 5, 34, -42, -52, 6, -41, -4, -21, + -5, -51, -45, 66, -2, -70, -8, -1, -75, 42, + 109, -61, 56, 115, -45, -5, 15, 7, 10, -25, + -45, -1, 22, -42, 81, 36, 123, -54, 21, 16, + 29, 19, 7, -21, 23, -34, -49, -104, -62, -21, + 49, -104, 20, 24, -42, -13, -56, 53, -66, -82, + 68, 18, -80, 17, 2, -31, 51, -25, 43, -18, + -32, -17, 5, -58, 17, -73, 54, 68, 45, 16, + -58, 0, 34, 44, 85, -34, 14, -33, 48, -127, + 12, 33, -3, 11, -25, 16, 82, -5, -85, 50, + 22, -12, -11, -125, 24, -8, 36, 26, -59, -9, + -11, -30, -13, 58, -28, -21, -21, -18, -30, 56, + 4, -49, -59, 4, 27, 12, -6, -8, 39, 22, + 71, -105, -21, -35, 18, -127, 19, -35, -25, 2, + 6, 13, 33, 43, -33, 13, 86, -40, 52, 19, + 75, -40, -30, 6, -7, 51, 14, -5, -24, 36, + -58, 8, 24, -32, 67, -71, 47, -23, 10, 25, + -18, 5, 30, 48, 34, -6, 14, -59, 1, -43, + -36, -46, 89, 70, 36, 52, 20, -69, -87, 66, + -32, 37, 28, 55, 1, 29, -20, 50, -48, -13, + 27, 51, 55, -37, -19, 33, -26, 36, 43, 72, + -7, 127, 50, 5, 17, 67, -11, -6, 25, 19, + -1, 80, 1, 80, 60, 31, -2, 23, -88, 94, + -62, 64, 101, -68, -2, 76, -52, 49, -72, 16, + -54, 42, 60, 32, -14, 30, 80, -37, -24, -52, + 65, -17, -44, -95, -2, 66, -61, -47, -23, 41, + -16, -25, -47, -32, 47, 38, 20, -98, 58, 10, + 58, -127, 35, 44, 18, -53, -17, -30, 28, 37, + 75, -75, -47, -25, -3, 23, 88, -54, -39, -18, + 56, 6, 11, 13, -59, -71, -86, -55, -59, 3, + -32, -45, -19, 10, 49, -51, 35, -12, 50, 40, + 4, 10, 51, 17, 24, 31, 70, -25, 2, -33, + 10, 38, 10, -71, -1, -5, 12, -31, 15, 49, + -73, 8, 37, -53, -47, 35, 91, -83, 46, 5, + -7, -98, 53, -31, 78, -57, -93, 42, -18, -5, + -73, -32, 68, 19, 25, 37, -88, 84, -70, 79, + -81, -51, 82, -51, 58, -104, -5, -6, -52, 68, + -36, 43, -73, -25, -2, -45, -81, -34, -13, 54, + -33, -71, 66, -74, -77, -59, 39, -15, -10, -8, + -11, -4, 3, 102, 62, 64, 28, -28, 44, -20, + -62, -62, -64, -43, 54, 8, -51, -34, 77, 30, + -32, -6, -3, 52, 17, -50, 34, -15, -56, -45, + -23, -19, 36, -42, -60, -33, -104, -92, 74, 39, + -1, 46, 39, -37, -7, -38, 80, -43, 17, 28, + -39, 54, -81, -17, 33, 38, -31, 110, -34, -47, + 1, 29, 55, 52, -42, 14, 29, 33, -38, -27, + 69, 51, 3, -24, -44, -15, 0, 7, 8, 56, + 55, -4, -7, 23, 10, 3, 15, -48, -5, 18, + 26, -30, 61, 62, -29, 62, -32, -7, -29, -17, + -26, 119, -21, 20, -90, 44, 31, -29, 26, -26, + -4, -34, -61, -43, 31, -67, -40, -37, -42, -25, + -14, 71, 1, -63, -11, 29, -40, 12, -8, -21, + -70, -64, 10, 11, 23, 11, -52, 6, -50, -17, + -54, 64, 24, -69, -12, -22, 54, 79, 65, 32, + -75, 72, 32, 89, 50, -9, -15, 63, -23, 10, + -23, 2, 29, -23, 63, -22, 88, 7, 73, -7, + 3, 45, 37, -25, -33, -30, -40, -48, 38, -50, + 29, 55, 4, -112, 72, 0, 9, -14, 45, -23, + -82, 31, -95, 13, -94, -27, 73, -34, -40, -10, + 12, -4, -17, 19, 7, 48, -46, -44, 7, -41, + -30, 20, -87, 27, -24, -7, 77, -28, -14, 38, + 2, -60, 74, -24, -38, 39, 52, -18, -31, 33, + -101, 61, 97, 77, -18, -12, 65, 45, 18, 32, + -30, -63, -12, -12, -127, -25, 46, 32, -71, 66, + -6, 37, 35, -23, 33, -21, -7, -6, 1, 4, + 25, -58, 34, -35, 1, 47, -9, -17, -66, -10, + -20, 12, 41, 35, -37, -22, -32, -18, 14, -72, + -72, -64, -51, -28, 46, -31, -63, -7, -45, -77, + -6, -11, -27, -67, 17, -41, -41, -52, -59, -13, + 43, -24, 4, 67, 34, 19, -111, 20, 17, 29, + -92, 59, 49, 58, 38, 1, -29, -4, 65, 89, + 53, 30, 8, -21, 30, 5, -85, 38, -7, 19, + -48, 75, 3, 41, -27, 71, 30, -26, 14, 28, + -79, 23, -1, 93, 20, 60, -54, 83, -23, 51, + -19, 75, 92, 124, 48, -104, 1, 49, -5, -67, + -110, -52, 49, -36, 87, -19, 34, -5, -40, -49, + -56, 48, -9, -107, 17, -3, -44, 23, 49, -44, + 10, 65, -66, -21, 42, -11, -32, 78, 29, 5, + 33, -40, -11, 36, 14, 107, 34, -4, -32, -80, + 62, 120, 63, 66, -75, 20, -64, 64, -14, -9, + 17, -50, -8, 86, 58, -38, -73, -40, 80, -13, + 20, 56, -101, 27, 43, 56, 87, 28, 35, 28, + 20, -29, 116, -4, 94, 8, -17, -23, 64, 32, + 3, -9, 2, 38, -16, -39, 17, -37, 38, -23, + 67, -23, -9, -11, -48, 8, 26, 14, -13, -6, + 11, -33, -16, -18, -21, -12, -16, -50, 54, 72, + -35, -10, 5, 38, 17, 27, 28, -40, -60, 32, + -105, 39, -35, -37, 66, 88, -9, 64, 87, 41, + -110, -24, 38, 33, -32, 29, -47, -14, -54, -8, + 40, 67, 50, -77, -27, -34, 7, -31, 23, 33, + -14, 0, -44, 25, 18, -98, -4, -13, 26, -10, + 0, -63, 12, 7, -39, -25, -39, -46, -2, -35, + 40, 3, -20, -105, 1, -36, -70, 8, 13, 89, + 26, 21, -39, -55, -89, -14, 1, -17, -75, 50, + -9, 16, -13, 61, -18, 90, 26, -8, 80, 14, + 89, -31, -60, -38, 59, 16, 44, 27, 46, -99, + 4, 7, 31, 50, 19, 26, 98, 67, 71, -42, + 2, 50, -13, -36, 0, 4, -3, -107, 15, 13, + -10, -61, -1, 82, -51, -18, -4, 55, 25, -53, + -4, 43, 15, -100, 93, 25, -11, 78, -55, -12, + -17, 57, -18, -51, -51, -23, 114, -44, 45, 36, + 26, -12, -56, -33, -127, -50, -57, -37, -85, -17, + -23, 17, 21, 37, 89, 91, -26, 2, 34, -18, + 57, -46, 24, -27, -65, -26, -54, 76, -11, -62, + -69, 33, -30, 6, -27, 1, -95, 127, -17, 63, + 43, -34, -7, 9, 76, -22, -9, -7, 54, 39, + 42, 6, -5, -37, 35, -7, -43, 9, -18, 70, + -56, -34, -31, 38, 52, 33, -10, 43, -6, -5, + -43, -56, 61, 26, -38, 71, 33, 50, 13, -54, + 2, -10, 46, 59, -89, 18, 45, -24, 15, 71, + -15, -15, -2, 24, 42, -46, 51, 72, 15, 43, + 21, 29, 0, 49, -101, 62, -25, -62, -88, -10, + -97, -71, -42, -25, 3, 51, 64, 25, 26, 25, + 14, -51, 34, -46, -35, -8, 28, -36, 39, 11, + 101, -31, 68, -79, 6, -48, -60, -30, 33, -6, + 35, 53, 21, -32, -52, 46, 40, -40, -27, 3, + 44, -2, -18, 25, -35, -10, -52, -7, 31, 4, + -19, -6, 6, 12, -28, -4, 28, 25, -57, -56, + -23, 24, -5, 5, -34, 13, 39, -9, 78, 96, + 79, -57, -26, 22, 45, -14, 31, 19, -10, -24, + 58, -43, 90, -127, 88, -82, -1, -19, 51, -68, + 71, 29, 76, 97, 59, 104, 51, -9, -4, -1, + 127, 1, 69, -74, 18, 29, 67, 20, 2, 82, + 56, 71, -48, 8, 25, -22, 5, 15, 41, -59, + -7, 32, 16, -50, -27, 32, 23, 64, 13, 30, + -19, -10, -60, -42, -114, 44, -2, -75, -100, 38, + -99, 69, -22, 52, 33, -8, -1, 79, -35, -62, + -32, -16, 66, 65, 53, -6, 44, 6, 100, 29, + 85, 47, -13, 9, -51, 74, 10, -34, -100, 66, + 110, -80, 85, 2, -32, -62, 107, -12, 42, -3, + 30, 6, 86, 46, 99, -49, 78, 2, 94, -3, + 21, 51, -2, 48, -74, -25, 3, 73, -13, -11, + -49, 26, 64, 36, 54, 59, 2, -22, -5, -40, + 25, -22, 37, 54, 30, 31, 66, -26, -1, 36, + -28, -56, 59, -16, 41, 67, -4, 53, 7, 5, + 30, 20, -13, -19, -3, -36, 11, 27, -6, -33, + 17, 56, -61, -32, 51, -51, -2, 71, -40, -74, + -3, -123, 31, 39, -20, -126, 63, 55, -54, -88, + 50, -41, 38, -1, 74, 20, -21, 6, 39, 23, + 101, 22, 11, -37, -42, 47, -19, 35, 36, -51, + -30, -9, 45, -38, 29, 19, 37, -26, -45, 8, + -30, 89, -4, -46, 39, -9, -33, 50, 70, -69, + 33, -28, 63, 31, -36, -68, -55, -6, 15, -57, + -24, -11, 55, 2, -12, 84, -61, -25, -9, 17, + -19, 38, -44, -13, 47, 68, 62, 11, 5, 33, + 12, -43, 45, -42, 6, 48, 67, -54, 91, 20, + 35, 28, 73, -76, 5, 47, 41, 1, 6, 41, + 50, -15, 61, -55, 86, 18, 21, -1, 23, -45, + -64, 3, 81, -31, 23, -52, -5, 42, 1, 34, + -40, 58, -61, 10, -23, -111, -35, -38, -55, -37, + 20, -95, 3, 6, -73, 11, 95, -110, -7, 66, + -18, -97, 21, -77, -20, 33, -13, -55, 31, -32, + 71, 84, -72, -14, 2, 31, -10, 73, -4, -14, + 12, -42, -54, 57, -50, 12, -37, 22, 28, 57, + 44, -47, 12, 58, 57, -56, -84, -69, 42, 54, + -79, -20, -54, -25, -48, -33, -58, -55, -3, 0, + 17, -49, 70, 40, -18, 18, -51, -32, 54, -20, + 28, 32, 64, -27, -33, -16, 9, 13, 53, -43, + -91, 14, -35, -20, 54, 30, 26, 68, 86, -37, + 51, -47, 62, 14, -39, -43, -35, -3, 79, -11, + -49, 29, 59, -4, -25, 55, 12, 73, -54, 26, + -29, -38, 21, -25, 12, -13, -68, -20, -64, 72, + -61, -2, 0, -14, 27, -79, 40, 39, 1, -2, + 62, -17, -78, -49, 50, -14, -17, 65, 91, 31, + -42, -19, 25, -27, -4, 63, 44, 43, 2, -37, + 10, 14, -48, 48, -20, 84, 10, -31, -78, -22, + -2, -23, 72, -87, -17, 0, 19, 27, -41, -13, + -46, 1, -96, -1, 47, -19, -54, -42, 39, -17, + -5, 39, -127, 52, -48, 56, 43, 4, 69, -6, + -42, -54, -116, -25, 34, -88, -20, -30, 21, -45, + -60, 1, 93, 42, -20, -25, -31, -6, 34, 59, + 6, 53, 11, 21, 75, -25, -84, -70, 60, 102, + 4, 76, -54, 61, -23, 51, 42, -1, 23, 85, + 114, 38, -3, 7, -45, 17, -29, 3, 23, 16, + -14, 5, 56, 38, 12, 8, 46, -79, 39, 24, + 44, -67, -48, 28, -24, -13, -63, 8, -94, -40, + -47, 20, 63, -73, -35, 54, 65, 51, -35, -2, + 69, -40, 12, 52, -28, 127, -17, 22, 24, -83, + -38, -47, -74, -62, -110, 61, 56, 9, -6, 22, + -30, -18, -5, -50, 2, 11, -10, 15, 72, 9, + -46, 22, 46, -9, -13, 8, 58, -22, 32, -4, + -10, -7, 83, -49, 19, 14, 21, -105, -84, -64, + 13, 88, 92, 89, 94, 67, -23, 24, 14, 54, + -54, -32, 35, -35, -127, 46, 51, -5, -16, 35, + -47, 27, 13, 52, 18, -74, -54, -30, -42, 10, + 49, -85, 8, -55, 12, 57, 57, 8, 30, 34, + 13, 56, 32, -2, 51, 51, -72, -10, -22, 12, + 21, 31, -13, 12, -90, 58, -73, 69, -36, -4, + -64, 38, -70, 38, 49, 64, -19, 65, +}; +const TfArray<1, int> tensor_dimension45 = { 1, { 12288 } }; +const ALIGN(8) int32_t tensor_data46[64] = { + 2167614, -2452865, 479346, 4411665, 1701048, 1774359, -2657633, 84092, 2019746, 1579375, + 3082665, 1720836, 1653506, 1912806, 1575066, 2007223, 1186713, 187078, 1103900, 2018011, + 2195022, -2754417, -1421447, 2445709, 2081270, 2276648, 1866074, 1750400, 1980493, 1771956, + 1836555, 2534277, 1466993, 1817624, 1006373, -2213160, 1927167, 1546508, -668650, 1807230, + 2281172, 2847136, 2526178, 1946753, 2752237, 2225088, 2220657, 2646339, 2980536, -95573, + 1819904, -3919424, 1069304, -702428, 2742277, -81218, 2996898, 2052783, 3325854, 2457987, + 3215580, 1887330, 1978605, 2766608, +}; +const ALIGN(8) int8_t tensor_data47[4096] = { + -39, 87, -67, 48, 23, 47, -51, -7, -72, -42, + 47, 28, -16, -21, -47, -17, 10, 36, -71, -49, + -32, -68, -52, 96, -127, 49, -39, -17, -38, 18, + -44, -65, -55, 9, 90, 19, 108, 34, -60, 102, + -66, 36, 50, 47, 7, -103, -47, 67, 8, -41, + 17, 95, -5, 71, -96, 44, -1, -56, 14, -54, + -34, -16, 28, 5, -22, -16, -31, 58, -25, 3, + -64, 27, -56, -21, -89, -43, 1, 31, 107, -51, + 19, -63, -46, 65, -58, 96, -5, 1, 51, 1, + 55, 37, -3, -23, -19, 55, 14, 58, 85, -106, + -62, -61, -76, 42, 86, -50, 79, -74, -1, 15, + -7, 107, -16, 31, 70, 24, -66, 7, 30, -29, + -14, -32, -23, -31, 53, 3, 55, -3, 68, 51, + -75, 25, 5, -14, 91, 1, -90, -45, -29, -2, + -18, 44, -8, -85, 85, -6, -66, -81, 20, -87, + -33, -87, 48, 22, -41, 9, 28, -21, 24, 14, + 39, 56, -40, 42, 7, -7, 21, -62, -64, 55, + -27, 5, -7, 37, -54, -24, -46, -31, 47, 21, + 57, -98, -65, -45, -1, -49, -29, 112, 33, 17, + -4, -91, -34, 93, 30, 107, 30, -34, -70, 29, + 86, -63, 102, 70, 55, 75, 114, -57, 66, -37, + 19, 18, -35, 62, 55, 85, -85, 39, 45, -3, + -55, 68, -29, -2, -24, 38, -45, 81, 17, -25, + 72, -59, -20, -59, -35, -90, 9, -10, -87, 21, + 56, 17, 50, -119, 15, 44, -65, -46, -104, -78, + -3, -12, 44, -52, 24, 25, -44, -11, -11, 68, + 16, 46, 73, -14, -25, 5, -49, -42, -65, -41, + -25, -11, -50, 40, -53, -19, 9, -21, 16, 32, + -17, -28, -90, 10, 57, 2, 7, -33, 76, 32, + 21, 24, 73, -80, 6, -94, -47, -24, 81, 29, + 39, -65, 14, 68, 86, 20, -64, 41, 82, -45, + 26, -19, 66, 76, -21, 93, 22, 33, -74, 13, + 41, -90, 19, -24, -11, 16, 43, 29, 41, -103, + 33, -9, -2, -82, 11, 64, 109, -74, 15, 56, + -28, -77, 80, 109, 1, -43, 73, -62, 66, 10, + -51, 15, 61, -41, 41, -45, -31, 113, -117, -52, + 20, 91, -19, 14, 20, -94, -4, -20, -19, -27, + -67, 50, -18, 21, 12, -24, -14, -65, 62, -4, + 48, 37, -66, 44, -21, 0, -76, -101, -30, -40, + -22, -24, -96, -105, -14, 27, -70, 22, -21, 37, + -106, -2, 37, -71, -87, 42, 3, -51, 48, 1, + 8, -109, -85, 26, -18, 41, 30, -57, -32, 42, + 48, 4, -28, 19, 8, -4, 40, -15, -2, -72, + -36, 30, -55, -92, -22, 81, 7, -61, -17, 46, + 76, -34, -29, -21, -42, -60, 21, -64, 104, -60, + -30, 73, -39, -50, -7, 121, -75, 112, -107, -44, + 111, -49, 61, -40, 32, 79, -42, -87, -43, 78, + -4, 62, 50, -40, 22, 4, 75, 37, -47, -45, + 26, 10, 65, -44, -9, -24, -104, -63, -19, -106, + -73, 6, -7, 111, 22, 36, -33, -107, -120, -89, + 97, 50, 25, 37, 10, 15, -71, -74, 14, 27, + -51, 2, 31, 3, -13, 5, 19, 26, -34, -45, + 71, 52, 0, 56, 76, 99, 65, 47, -46, 66, + 11, 30, -11, 43, -79, 97, -60, 44, -42, 33, + -27, -54, 29, -39, 10, 49, 41, 47, -23, 3, + 25, 65, -69, 72, -67, -56, 125, -21, 93, -36, + 31, -106, -60, -62, -44, -44, -27, -10, 46, -21, + -55, 48, 59, 30, 36, 28, 43, 0, 20, 49, + 11, -59, -84, 34, -74, 10, 29, 23, 71, -16, + 6, 9, -60, -21, -56, 42, -82, -10, 11, 50, + 53, -46, 7, 98, -43, 63, 104, 28, -93, 75, + -46, -69, -47, -58, -69, -73, 7, 11, -28, 84, + -1, -22, -40, 9, 70, -21, 17, -12, 65, -15, + -34, -26, -33, -9, -37, 8, 18, -1, -43, -18, + 36, -17, -9, -65, -68, 20, -16, -32, -95, 19, + -40, -22, 26, 18, 29, 31, -50, -44, -124, -97, + -53, 1, 39, -86, -35, 41, -86, 38, -62, -2, + 42, 57, 28, -109, -48, -34, 52, -30, 25, 22, + -13, 27, -22, -84, -49, 17, -5, 66, 55, 2, + 41, -4, -67, -57, 55, 27, 54, -53, 33, -113, + 13, 20, -73, -6, 35, 11, 59, -27, 30, 64, + 38, 59, 120, -33, -6, -31, -22, -14, 22, 100, + -67, 112, 5, 15, 33, 56, -77, 6, 31, 10, + 47, 14, -72, -25, -57, -54, -9, 51, 8, -62, + 66, -10, 2, 69, 48, 57, -65, -38, 69, 28, + 24, 70, 18, -76, 4, -15, -33, 1, 7, 72, + 60, 2, -19, 39, -70, 33, 78, -84, 31, 73, + 13, 54, -39, -58, -43, -51, -26, 24, -48, 23, + -17, -11, -23, 77, 2, 27, -19, 9, 20, -2, + 29, -109, 25, 77, -26, -24, -75, -42, 28, -72, + 99, -9, -44, -59, 62, 5, -47, 87, 0, 36, + 2, 38, 17, 49, 72, 45, 4, -26, -100, -81, + 10, -47, -73, 17, 78, 101, -9, -44, -26, 47, + 21, 67, 24, 60, -77, -7, -3, -69, -91, 48, + -60, 31, -38, -49, 64, 78, -8, -54, -60, 62, + -13, -43, -57, -99, -20, 31, 10, -22, -32, 17, + -40, -90, -17, 60, 78, -60, 122, -25, 36, 0, + -18, -42, -79, -67, 24, 99, 21, -93, 77, 20, + 3, -69, 27, 45, -20, 63, 14, 18, -71, -7, + -69, -48, 59, 5, -24, -56, -52, -62, -36, 42, + 44, 20, 21, 4, -77, 16, 31, -15, 58, 50, + -23, -127, 39, 14, -41, -88, -9, 52, -61, -54, + -31, 7, -49, 51, -86, -107, -27, -11, -8, 25, + 25, 109, 38, -43, -56, -9, -68, -46, -127, -6, + -47, 30, -41, 40, -20, -21, 23, -17, 3, -123, + -89, 44, 86, 35, 42, -113, 3, -67, 27, -21, + -79, 80, 36, 5, -127, 57, 77, 23, -79, -63, + -36, -57, 81, 18, 4, 6, -15, -30, -26, -41, + -9, 74, -8, -73, -76, -75, -77, -15, -47, -82, + 19, -35, -26, 28, -28, -36, -10, 44, 7, 20, + 25, 5, -5, -11, 81, -66, 72, -126, -80, 31, + 15, 41, -72, -44, -22, -12, 5, -95, -25, 34, + -21, -87, 52, 65, -38, -72, -20, 78, -50, -83, + -86, 17, -62, -10, -23, 36, 7, 35, -19, -42, + -13, 53, -14, -40, -28, -17, -84, 50, -27, -21, + 58, 20, 41, -32, -49, -11, -8, -42, -77, 27, + -22, 17, -36, 38, 121, 73, 92, 85, 35, 34, + -64, 22, 13, -7, 60, 64, -45, -37, 82, -39, + 98, 17, 51, -60, -51, 12, -100, -36, -47, -61, + -45, 22, 29, 24, -42, -78, 98, 64, -24, -16, + -112, -60, 57, -64, -69, 120, 22, -46, 41, -39, + 78, 25, -10, -8, -23, -49, -39, 51, -5, 47, + -47, 33, -55, 66, -9, -27, 127, 56, 36, -84, + -55, -59, -71, 25, 60, -1, -33, -114, -11, 53, + 25, -20, -26, 50, -42, -21, 28, 13, -7, 43, + -70, 69, 73, 9, 21, 29, -45, 75, 14, -82, + 36, -105, -8, 0, -36, -74, -74, -25, -55, 56, + -56, 62, 34, 53, 41, -16, 72, 78, -78, -64, + 51, 21, -63, 4, 14, -20, 22, 3, 12, -56, + -30, 16, 51, -81, 20, 9, 34, 41, -39, 47, + 36, -38, -42, -50, -7, -101, 13, 127, -28, 59, + 64, 110, -2, -27, -12, 43, -27, 30, -13, -99, + 112, -6, -93, -53, -18, 27, -10, -11, 75, 10, + -41, 23, -106, -2, -51, 126, -20, 34, 11, -43, + -64, 52, -83, -23, 0, 29, 72, -28, -97, -81, + 2, 30, 41, -33, -25, 34, 29, 2, -22, 74, + -22, 13, -6, 19, 37, -8, 15, -52, -27, 57, + 50, -100, 36, 102, 109, 2, -64, 42, -13, 92, + 70, 15, -38, 14, 47, -41, -57, -83, -127, 33, + 77, 26, -15, -2, -32, 45, -9, -78, -74, 39, + -59, -16, -22, 49, 40, 34, -51, -69, -11, 23, + 42, -43, -127, 37, 25, 37, -47, -61, -45, 106, + -12, -16, -17, -29, -15, 90, -47, -12, -9, 56, + -23, -95, 92, 74, 40, 70, 97, -38, -9, -21, + 103, 80, -55, -6, -12, 51, 46, 40, -44, -88, + 44, 52, 107, 27, -5, -9, -3, -4, -57, -24, + 51, 1, 36, -75, 50, -34, -67, -6, -20, 41, + -18, 71, 90, -35, -1, 101, -29, 36, 71, 83, + -76, 25, -93, -1, -69, -2, -23, -41, -17, 16, + 18, 72, 2, 12, -35, -13, -72, -25, -66, -4, + 53, -70, 54, 47, -47, 87, 51, 15, -67, 15, + -74, -74, 47, -90, -37, -41, -69, -90, -73, -62, + -24, -39, -45, -41, -31, 52, -71, -3, 29, 17, + -43, 84, 66, -127, -7, 88, 21, -57, 48, 50, + -41, 12, -3, 8, 68, 1, 29, -48, 1, -50, + 20, 43, 22, -7, 0, 6, 18, -79, -15, -83, + 65, -50, 7, 33, 77, 44, 89, -45, 3, -3, + -56, 2, 85, -111, 6, 24, -64, 63, -38, -46, + 2, 102, 97, -121, 60, 46, 69, -18, 50, 21, + 74, 26, 60, 53, 0, -39, -77, -54, 105, 63, + 74, -64, 63, 29, -64, -11, -19, -27, 9, -116, + 5, 18, -30, -49, -20, 48, 20, 30, -15, -52, + -21, -33, 7, 36, -39, 10, -65, 33, -31, -90, + -25, -6, 56, 60, -60, 72, 32, 66, 41, 36, + 60, 12, -25, -5, -14, -95, 49, -2, 57, 110, + -58, -5, -10, -9, -44, -25, 4, -13, -10, 11, + -5, -30, -3, 52, 72, -5, -71, 33, 117, 41, + -4, -22, -34, 82, 61, -12, 41, -85, -40, 46, + 99, 15, 65, -76, 38, 27, 76, -40, -100, 52, + -65, -36, 73, 0, -27, 12, -45, -45, 127, -2, + 108, 24, -127, 31, -38, -98, -67, -10, 29, 10, + 45, 33, 82, -47, -100, 95, 116, 20, 36, 33, + -19, 100, -18, 75, 45, 79, 73, -35, -68, -60, + 41, 8, -94, -68, 24, 61, -17, 120, 24, -73, + -56, -91, -32, 56, -78, -29, -79, -97, -127, 54, + -52, -79, 71, 73, 39, -8, 8, 46, 36, 21, + -38, -34, -70, 4, -24, -19, 26, -91, 2, -31, + -13, -23, 51, 72, -11, 115, 22, 62, -69, -23, + 49, -62, 20, 13, -38, 2, -29, 52, -61, -18, + -45, 4, 67, 43, -9, 9, -32, 12, -14, 56, + 61, -26, 35, -30, -37, -36, -44, -37, -46, 79, + -24, -12, -3, 18, -68, 4, 17, 68, 46, -4, + 15, 67, -60, 17, 95, -16, 20, 27, 125, -23, + -85, -34, 102, 59, 47, -41, 78, 4, -34, -12, + -97, 19, 28, -56, -70, 6, 61, -9, -25, -64, + 16, 10, 10, -20, 103, -33, 37, -28, -55, -71, + -60, 49, -127, -58, -24, 36, 0, 28, -51, -3, + -20, 47, -29, 7, -66, -31, -29, -26, -3, 8, + -57, 17, 61, 43, -36, 18, 33, 34, -93, 82, + 71, 23, -52, -38, -10, -97, -15, -3, 64, 16, + -10, 37, 74, -68, -28, -45, 74, 7, -48, -10, + -32, -34, 44, 49, 4, 0, 31, -101, 4, 85, + 44, -55, -70, -69, 81, 34, -8, -71, -69, 75, + 79, 47, 89, -1, -77, 37, -43, 76, -59, 20, + 42, -62, -27, -74, -26, -20, 2, -60, -26, 23, + 20, 15, -18, 38, -8, -62, 47, 33, -89, 2, + -73, -98, 39, 74, 54, -22, 7, -36, -106, -60, + 15, 5, 81, -84, -6, 20, -51, -86, 21, 13, + 55, 127, -12, -21, -52, 64, -71, 45, -103, 32, + 105, 86, 6, 29, 32, -95, -120, 97, -67, 36, + 38, 29, -42, -38, -32, 52, -35, -12, -79, 51, + 69, -48, -52, -66, -43, 41, 25, -61, -44, -7, + 62, -97, -112, -55, -36, 29, 81, 43, -71, -58, + 42, 26, -10, -99, 27, -58, -42, -77, -22, 20, + 3, -53, -46, -37, 63, -95, -44, 2, 77, 39, + 14, -31, -25, -1, -11, 0, -35, -27, 22, 32, + 67, 14, 5, 41, 3, 0, -1, 23, 18, -7, + 47, 6, 43, -24, 80, 16, 61, 9, -39, 57, + -111, -84, 42, -9, -68, 68, 69, 53, 51, 29, + 10, 11, 113, 41, 30, 28, -64, 12, -9, 103, + 41, 52, -84, 35, 127, -74, -18, -21, 52, -49, + -9, -60, 47, 28, 81, 64, -39, 53, -75, -17, + -43, -27, -18, 36, -41, -37, -4, -60, 36, -3, + -15, -43, -127, 14, -46, -61, 53, 43, -47, 31, + -25, 78, 90, 72, 2, -79, -12, -16, -82, -53, + 14, -15, -55, 23, -63, -37, 23, 38, 79, 21, + -39, -5, 27, 25, -40, -26, 39, -22, 14, 52, + -2, -45, -37, -3, 14, 31, -11, 12, -31, 49, + 46, -4, 11, -71, 15, -55, 34, 10, 8, 33, + 29, -7, 14, 7, 43, 15, -79, -60, -70, -59, + 54, 41, 11, 34, 27, 27, 13, -72, 19, 62, + -20, 4, 38, -21, -31, 37, 27, 79, -73, 37, + -40, -51, 20, 3, 86, -119, 4, 54, -98, 23, + -61, 41, 40, 86, 5, -35, -23, 16, -1, 47, + 33, -47, -82, 35, -7, 17, -17, -20, 29, -35, + -58, 13, 77, -52, -48, -22, 49, -93, 56, 38, + 62, -1, -23, 61, 59, 37, -58, 83, -30, -4, + -76, -29, -39, -96, 22, 38, -7, 58, 56, -46, + -11, 16, -33, -13, -8, 14, 21, 53, 10, -8, + -12, 91, 32, -69, 18, 69, -36, 16, -57, 20, + 33, -16, -40, -51, 48, 61, 43, 56, 5, -45, + -2, 54, 21, -67, -13, -78, -76, -52, -49, 15, + -47, 41, 17, -63, -82, 55, -22, -37, 19, -46, + -30, 10, -29, -16, 10, 62, 83, -18, -59, -70, + 34, -127, -15, -1, -12, -46, -42, -65, -24, -57, + -27, 38, 56, 23, -60, -33, 120, -40, -32, 59, + -118, 16, 127, -71, -26, 0, -64, -126, 57, 40, + 28, 83, -48, -13, 73, 6, 79, 117, -27, 37, + 39, 37, -76, -91, 45, -51, -13, 30, 15, 51, + 67, 66, -21, 77, 70, 18, 69, -91, 47, 62, + 24, 66, 28, 14, 12, 16, -1, -43, 13, -89, + 1, 6, -12, 33, 14, 6, 4, -127, 56, 61, + 77, -39, -48, 41, 27, -47, 49, 13, 65, 69, + 39, -50, -7, -4, 33, -8, 29, -47, 19, 49, + 61, -65, 3, 32, -52, 37, 28, -47, 32, -40, + -33, 51, -114, 15, -21, -83, 36, 68, -10, 2, + -66, -57, -47, 5, 18, -52, -2, -36, -119, 35, + -31, -61, -96, -54, 124, -109, -54, 67, -19, 38, + 38, -55, 104, -31, -38, -68, 81, -48, 74, 12, + 27, -60, 57, 36, 27, 4, 48, 27, 50, 85, + -82, 52, -3, 11, 29, 78, -36, -62, -61, -5, + 51, 63, -57, -42, 14, 28, 39, 88, -24, 10, + 48, -74, -45, -110, 9, -63, 9, 26, -8, -32, + 40, -40, 106, -80, -31, -20, 80, -97, 20, -49, + -36, 127, -45, 102, -73, -17, 6, -88, 58, 41, + 17, 23, 14, 44, -38, -46, 46, -34, -32, 66, + -48, -20, 98, 53, -17, 48, 102, 1, -38, 15, + -8, -44, 38, -28, -13, 76, 70, 77, -16, -2, + 32, -73, -68, 53, 29, 36, 17, 45, -50, 16, + -15, -17, -52, -8, 7, -53, -49, -76, -12, 46, + 87, -43, -5, -22, 64, 34, 49, -44, 45, 20, + 16, 2, -21, -12, 43, -109, -25, 75, -56, 29, + 12, 32, 20, 55, 57, -85, -5, -61, -31, 29, + 51, 63, -25, -9, 68, 26, -21, 67, -36, -8, + -49, -32, -40, -46, -36, -90, 44, -84, -65, -24, + 43, -49, -1, -26, 47, 78, -15, -34, -53, -33, + -59, -11, 7, -13, -88, 6, -39, -33, 31, -64, + 19, -38, 66, 50, -36, -62, -64, 6, 1, 9, + 21, 29, -43, -32, -30, -22, 45, -5, 23, 34, + 15, -36, 31, -58, 11, -41, -33, -15, 54, 22, + 38, -20, 50, -67, 40, 3, 78, -43, 23, 67, + -15, 32, 44, 45, -21, 34, -10, -55, 39, -30, + -40, -76, -94, 27, 39, 45, -97, 78, 11, -74, + 106, -17, 2, 19, -94, 47, 56, -37, 16, -71, + 25, -13, 20, -65, -20, -47, -88, 64, 72, 23, + -62, 11, 85, 10, 33, -14, 50, 100, -81, -66, + -65, -27, 47, -59, -27, -11, 54, -14, 23, -50, + 24, -38, 61, -41, 51, -4, 2, 48, 38, 19, + -73, 32, -16, -32, -1, -31, -16, 6, 73, 32, + 37, 60, -11, 45, -16, 12, 4, 81, 16, 22, + -22, 37, -10, -25, -26, 21, -60, -11, -84, 76, + 65, -1, 77, 3, 25, -34, 73, -20, 67, -96, + 56, 38, -15, -17, 85, 8, -78, 81, -25, 21, + 44, 30, 6, -68, -72, 84, -35, 34, 8, 27, + 39, 28, -39, -63, -59, -30, -5, 43, 3, 58, + -42, -25, 97, 16, 106, 27, 54, -30, -34, 50, + -34, 13, -21, 10, -71, 111, 8, -50, -55, 15, + 5, 34, -22, -8, -64, -37, -12, -84, 5, 60, + -33, -80, 67, -94, -27, -50, -35, 84, 7, -68, + 18, 56, -88, -80, -90, 4, -45, 29, -48, -10, + -64, 15, -72, -39, -31, -61, -35, -88, -75, 50, + -3, -60, -9, 42, 45, -6, 10, -22, 6, -28, + 42, -43, 6, 16, -30, -61, -8, 11, -63, -20, + 96, -32, 31, 18, -32, -45, -25, -26, -22, 1, + 12, -72, 21, 45, -59, -52, -45, 64, -42, -32, + 16, 45, -52, -3, -43, 42, 33, 36, 38, 56, + -21, -70, -8, 22, 23, -25, 17, 71, 8, 78, + 10, -79, 4, -19, 7, 4, -6, -47, -99, -34, + -18, 30, 80, 0, -6, -60, -18, -74, 41, -40, + -64, 5, 125, 62, 93, 13, 12, 51, -93, 25, + -64, -35, -24, -25, -32, 79, 62, -41, -71, 62, + -4, -3, 69, -5, -55, 51, -1, -81, 47, -39, + 27, 3, -9, 8, 74, 50, 5, 0, 22, -3, + 1, -88, 33, -46, 18, 82, -69, 25, -18, -49, + 14, -9, -12, -28, 39, 99, 26, 35, 20, 54, + -35, -45, 31, -54, 127, -74, -53, 65, -30, -8, + 11, 2, -14, 32, -18, 58, 21, 1, -51, -22, + -28, 88, -25, 2, 58, 64, -17, -63, 25, 41, + -64, -8, -55, -107, -25, -28, 70, 36, 49, -70, + -6, 22, -20, 32, 33, 7, -40, -127, -66, -61, + -14, -60, -34, -39, -37, 49, -14, 12, -102, -54, + -79, -23, -38, 87, -37, -32, 13, -42, 65, 5, + -102, 87, -4, 82, -72, -87, -69, -37, 108, 9, + 43, 7, -2, -4, -7, 80, -10, 30, -106, 10, + -59, -20, -6, -37, 114, -20, 49, -37, -14, -36, + 79, 16, 46, 94, -85, 17, 6, 53, 28, 44, + -15, 10, -49, 19, -23, 8, 63, 22, -10, 17, + -1, -77, -3, 39, 45, -38, -69, -48, -16, 36, + -27, -56, 71, -5, 6, 21, 14, -56, 38, 119, + -127, 59, 10, -64, -36, -62, 39, 19, -66, -49, + -8, -23, 45, 14, -29, -22, -27, -27, -23, -46, + 80, 32, -60, -19, -34, -31, -36, 48, 18, 53, + 47, 39, -5, 84, -42, 127, -79, 43, -46, -39, + -72, -40, 47, -43, -8, 21, 44, 53, 51, -30, + 25, -31, 15, 91, 94, 25, -41, 73, 40, -91, + -51, -125, -112, 66, 38, -4, 38, -102, -46, -7, + 88, -25, 40, 59, 11, 55, -127, 12, -26, -46, + 60, -34, 7, -40, -17, -61, 38, 70, -88, 96, + 37, -28, -27, -17, 49, -45, 50, 6, 55, -68, + -7, 25, 27, -19, -54, 71, -47, -69, -59, -78, + 21, 1, -106, 17, -5, -27, 24, 73, -47, -24, + 61, 20, 34, 39, 9, 9, -39, 93, -125, 50, + 82, 32, 28, -36, -42, 44, 48, 21, 93, 66, + -11, 15, 11, 24, -13, -30, 55, 50, -71, -88, + 9, -32, -12, 51, -19, -55, -7, 63, -6, 3, + 9, -39, -36, 64, 6, -42, 20, -63, 25, -19, + 49, 14, 47, -53, -26, -88, -85, -23, 95, -2, + -25, 59, -100, 29, 31, -3, -86, 43, -63, -9, + 65, 9, 41, 95, 26, 8, 38, 73, -69, -27, + -20, 46, 11, -12, 45, 49, -96, 62, 2, 40, + -79, 59, -71, -18, -26, 104, 60, 32, -77, 118, + -36, -102, 38, -28, -57, 61, 9, -64, -77, -68, + -1, 45, 48, 67, 7, 2, -83, -45, -25, -2, + -26, -36, -19, 9, -52, 38, -52, 29, 28, 32, + 61, 56, -68, 59, -58, 62, 20, 28, -82, 63, + 72, -103, -62, -47, -19, -44, 66, -17, -62, -32, + -86, 34, -32, -75, -98, 47, -16, -127, -50, -19, + -10, 13, 63, 37, 19, 52, -55, 51, -15, 108, + -106, 49, -76, 27, -25, -60, 42, 63, -32, 89, + -99, 58, -98, -52, 97, 35, -46, 10, 72, 24, + 15, -3, -43, 30, -80, 85, 87, -25, 60, 35, + -95, -109, 28, -52, -57, 26, 19, 94, -110, -29, + 11, 30, 47, 43, -74, -81, 48, -3, -26, 20, + -54, 59, 70, -40, 17, -94, -21, 77, -8, 34, + 20, 24, 0, -11, -60, 52, 63, 3, 27, -12, + 12, -46, -31, -42, -2, 45, -52, 7, 30, 16, + 20, 104, 68, 21, -76, 43, 76, -48, -94, -11, + 59, -85, 97, 68, 59, -6, -36, 85, -5, 61, + 15, -5, 44, 96, 22, 39, -38, 61, 30, -50, + -4, -9, -49, -33, 13, -15, 31, -24, -36, -47, + -10, -39, 42, -5, -13, 48, -6, 29, -30, 42, + -49, 20, -17, -45, -59, 53, -20, -3, 19, -14, + 61, -109, 14, 15, 62, -7, -26, -69, 42, -67, + 20, 58, 34, -71, -1, 49, -100, -53, 31, 69, + -8, -34, -44, -69, 125, -51, 62, 20, -55, -14, + -10, 51, -13, 15, 109, 36, 58, -79, -44, 28, + -46, -33, -22, -36, -75, 36, 45, 43, 7, -77, + 0, -9, -52, -53, 54, -33, 26, 1, -36, -99, + -127, 70, -56, 59, -9, -23, 40, -38, 39, 30, + -38, -58, -41, -13, -68, -24, -31, 3, 35, -38, + 45, -32, 7, 92, -34, -52, -58, 13, 48, -61, + -48, -13, 5, 55, -48, -22, 54, -11, 36, 32, + 14, 4, -2, 48, -12, 60, -49, -21, -65, -12, + -40, -64, -31, -98, -21, 12, -36, 14, 46, -45, + 12, -54, -30, -49, 28, 77, -44, 58, 87, -63, + -8, -70, -66, -44, -36, -102, -65, -56, 13, 41, + -22, -76, -87, 9, 48, -54, 15, 17, 10, 49, + -1, 73, 31, -28, 99, -75, -98, 71, -85, 50, + -4, 46, -66, -81, -13, 22, 21, -59, 42, -33, + -11, 51, -24, -47, -22, 67, 7, -66, -75, -20, + -19, 48, 5, 14, -13, 60, -30, 36, 8, -53, + -77, -28, 106, 0, 30, -49, 50, -27, 16, 52, + -42, -68, -60, -78, -27, -18, -23, -1, 39, -24, + 31, 1, 13, 9, -47, 18, 60, 45, -48, -125, + -21, 39, -58, 43, -8, -5, -127, 5, -20, -87, + -30, 3, 27, 53, 46, 64, 91, -77, -51, 3, + -64, -64, -34, -28, 0, -19, 33, -6, -5, 1, + -8, -28, 51, -13, 2, 66, -16, 20, -43, 32, + 78, -103, -36, -43, -33, -38, -110, -85, -87, -23, + 36, -93, 10, -5, -42, -17, -22, 68, -115, -97, + -32, -1, -40, 105, -43, 60, -6, 56, 0, 78, + -104, -22, 46, -67, 6, -20, 71, -59, -3, 79, + -45, -45, -90, 36, -22, -40, 8, -104, -80, -51, + -97, -15, -8, -64, -50, -51, -4, -63, 14, 5, + -6, -92, 57, 28, 37, -35, 62, -8, -30, -34, + 81, 12, -52, 42, -25, -49, 13, 45, 10, 27, + -31, 31, -41, 4, -69, -8, 51, -63, 40, -47, + -47, -50, -47, -55, 82, 40, 14, 23, 65, -63, + 45, 27, 24, -2, -5, -20, 4, -26, -81, -46, + -96, -14, 22, -37, -6, -12, -19, 53, 43, -7, + -14, 77, -16, -44, 33, 124, -32, 127, -55, 27, + 21, 38, 39, -57, -28, 88, -120, -56, 7, 6, + 90, -24, -88, -22, 57, -50, -78, 28, -13, 119, + 76, -89, -15, 80, 16, 24, 20, -56, -43, 53, + 2, 83, -13, 13, -26, 52, -127, -25, 29, -78, + -23, -30, 23, -45, 39, -31, 33, -21, 2, -11, + -57, 34, -102, -20, 15, -16, -127, -35, 26, -46, + 58, -10, -15, -58, 96, 93, -16, 56, 23, 24, + 5, -16, 19, 42, 57, -48, 19, 22, 42, -51, + -51, 6, -20, 127, 24, -33, 47, 122, -20, -16, + 64, 62, 22, 42, -40, 20, -34, -7, 29, -63, + 17, 49, 56, -41, 0, -19, -55, 65, -60, 40, + 20, -68, -10, 38, 16, 45, -22, 58, -11, 13, + -27, -61, 7, 67, -72, -54, 74, -59, -18, 42, + 2, 19, 36, -6, -58, 9, 57, -16, 53, -38, + 65, -23, 85, 65, 50, -66, 38, 47, 68, 87, + 19, 83, 48, 38, 82, 127, 22, 25, -13, -118, + 25, 87, 72, -15, -80, -44, 45, -42, -6, 17, + 13, 36, 85, 85, -60, -45, -95, 31, -44, -67, + -101, -32, -48, 7, -54, -74, +}; +const TfArray<1, int> tensor_dimension47 = { 1, { 4096 } }; +const ALIGN(8) int32_t tensor_data48[384] = { + 122783, 256651, 227528, 75801, 114339, 13253, 206983, 82923, 2689125, 2689125, + 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 64470, 101728, -48067, 167561, + 96008, 239916, 245486, 181257, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, + 2689125, 2689125, 74767, 111807, 33831, 137349, 62791, 31406, 93984, 79457, + 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 62222, 45498, + 17834, 15812, 115986, 75392, 89946, -34397, 2689125, 2689125, 2689125, 2689125, + 2689125, 2689125, 2689125, 2689125, -40991, 153966, 87215, 34730, 105754, -48359, + 133134, 177520, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, + 144660, 231994, 221485, -23984, 71425, 290899, 186446, -10580, 2689125, 2689125, + 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 73174, 186475, 76107, 177512, + 172743, 292571, 154775, 147971, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, + 2689125, 2689125, 52833, 246229, 199954, 64905, 77447, 30557, 111482, 79368, + 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 90513, 17060, + 31292, 10451, 45755, 13577, 36210, -22520, 2689125, 2689125, 2689125, 2689125, + 2689125, 2689125, 2689125, 2689125, 48230, 58704, 2552, 49452, 71220, 73774, + 42616, 49813, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, + 39515, 31376, 24093, 96006, 86846, 54683, 21879, 25532, 2689125, 2689125, + 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 34374, 81344, 94995, 36466, + 43273, 73205, 22988, 108868, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, + 2689125, 2689125, 53984, 87082, -18390, 24515, 48332, 49001, 2220, 39248, + 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 17078, 134277, + 34674, 41150, -14633, 57089, 75766, 48900, 2689125, 2689125, 2689125, 2689125, + 2689125, 2689125, 2689125, 2689125, 65974, 70114, 40513, 82362, 17115, 64859, + 26904, 14330, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, + 81301, 123758, 31893, 24949, 29601, 41984, 71416, 112737, 2689125, 2689125, + 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, -32196, -16241, 15477, -75123, + -33824, -80614, -36592, 9683, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, + 2689125, 2689125, -16303, -37824, 78256, 27516, 15221, -33336, -45138, -19695, + 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, -14916, 23273, + -12277, -21288, -52155, -21805, -34828, 34025, 2689125, 2689125, 2689125, 2689125, + 2689125, 2689125, 2689125, 2689125, 25048, -53101, -50638, -66268, -3545, -40678, + -13055, 89862, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, + -74530, -52913, 4203, 7067, -5207, -839, 48652, -39724, 2689125, 2689125, + 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 10040, -1580, -47980, 15735, + -7842, -45172, -43102, -5811, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, + 2689125, 2689125, -9635, 1829, -26421, -23988, 968, 26906, 11453, 69866, + 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, 2689125, -27589, -15479, + -826, -9237, 10722, 47566, 26954, 26258, 2689125, 2689125, 2689125, 2689125, + 2689125, 2689125, 2689125, 2689125, +}; +const TfArray<1, int> tensor_dimension48 = { 1, { 384 } }; +const ALIGN(8) int8_t tensor_data49[12288] = { + -48, 2, 19, -1, -2, -2, 1, 3, -44, -88, + 16, -22, -19, -18, 10, 35, 14, 5, -21, 21, + 9, 21, -4, -51, -21, -18, 26, 10, 20, 12, + -32, -2, 24, 68, -10, 12, 33, 54, -7, 16, + 55, -7, -30, 23, 10, -20, 23, 18, 12, -15, + 59, -3, 9, 4, 60, 35, 2, 51, 12, 42, + 19, 35, -3, -22, 13, 9, 53, -14, -60, 10, + 6, 46, 43, 28, -52, -6, 10, 13, 40, -46, + 17, 8, 29, 62, 51, 18, 18, 16, 43, 43, + 46, 7, 23, 6, 10, 8, 14, 43, 2, -41, + -5, -6, 26, 20, 35, 27, -12, -71, -8, 23, + 77, -21, 6, -14, 41, -50, -9, 17, -17, 52, + 32, 33, -7, 0, -20, 13, 44, -14, 4, 29, + -25, -9, -22, 49, -33, 30, 75, 43, -61, -29, + 5, -11, 36, -17, 5, 27, 13, 0, -4, 37, + 40, -32, -58, -20, -4, 0, -13, 12, -59, 21, + 52, 8, 15, 19, 23, 27, -8, -15, 28, 42, + 20, -20, -19, -8, 27, 16, 42, -127, -5, 16, + 23, 68, -84, -68, -27, 24, 12, -8, -13, 33, + -90, 31, 33, -2, 19, -12, 18, 40, 43, 13, + 36, 11, 10, -6, -24, 15, -2, 34, 11, 27, + 35, 5, -27, -5, 33, -10, 1, 12, -34, -8, + -16, -17, 9, -10, -1, 51, 8, -23, -19, 21, + -6, 20, 18, 5, 1, 0, 3, 12, 31, 12, + -17, 33, 16, 35, 10, 0, 6, -23, -55, -74, + -21, -3, 27, -15, 18, 22, -28, -11, 36, 4, + -22, 7, 2, 8, -28, -49, 13, -1, 0, -20, + -1, 19, 16, 14, -25, 9, 17, -30, 27, 54, + -2, -5, 39, 43, -4, 15, 30, -8, 27, 0, + 11, 65, 47, 41, -13, 25, 9, 13, -21, 54, + 29, 0, 16, 42, 49, 23, 24, -39, 7, 13, + -13, -21, 37, 15, 0, 24, 23, -9, -37, 30, + 0, 54, 74, -20, 9, 16, -4, 6, 38, 25, + -19, 7, 64, -19, 5, -7, 37, 45, 33, 13, + 54, 49, 46, 45, 5, 12, 15, 51, 14, 4, + 4, 34, -30, -26, 12, 9, 3, 42, -22, -10, + 20, 30, -50, 22, 22, 29, -37, 37, 21, 66, + 30, -21, 14, 8, -45, -20, 2, 21, -33, 11, + 35, 30, 3, 24, 7, -8, 39, -40, 35, -23, + -39, 20, 42, 28, -13, 14, 13, 37, -32, 46, + -12, -57, -53, 15, 52, -1, -17, -23, 8, -21, + 40, 2, 19, 2, 19, 16, -27, -1, -21, 43, + 41, -19, 13, 17, 18, 9, -10, 16, 16, -7, + 27, 12, -30, 54, -5, -1, 3, -74, -8, 31, + -4, -32, -21, -41, -37, 5, 33, 3, 9, 49, + 15, 16, 41, 40, 20, -10, 15, 39, -5, 36, + 3, -22, 17, 37, 3, -29, 5, 20, 30, -2, + 15, -3, 1, 11, -14, -1, 64, 0, -29, -5, + 3, -23, 23, 10, 13, 46, 19, -36, 12, 12, + -1, 34, -6, -27, -25, -1, -16, 31, -19, 33, + 3, 49, 18, 6, -14, 2, 7, 24, -24, -6, + 6, -17, -7, 34, 11, -8, 15, -1, 23, -22, + -33, -17, -7, 12, -2, -7, -12, 8, 1, 19, + 21, 0, -13, 14, 18, 13, 2, 32, 10, 4, + 1, -7, 49, -9, 10, 30, 10, 44, 15, 13, + 32, 8, -3, 17, -16, 39, -6, 18, 10, -4, + 33, 26, -2, -28, 46, 23, 46, 32, 30, 13, + 51, 23, 20, 31, 42, 2, -5, -3, 24, -27, + -14, 42, 5, 13, 1, -20, 16, 33, -4, 2, + -14, -16, 35, 43, 30, -12, -2, 6, 33, 49, + -6, 13, -23, -2, -12, -21, 31, 30, 35, 33, + 48, -33, -33, 3, 13, 18, 14, -30, -7, 18, + 7, 9, 65, 34, -18, 33, 22, -14, 35, 33, + 8, 51, 19, -32, 0, 1, -1, 17, 47, -14, + -32, 81, 40, 3, -12, 29, 39, 36, 2, -62, + 33, 19, -8, 26, 34, -18, 47, 3, 23, -30, + -32, 39, 25, -26, 6, 11, 14, -5, 1, 3, + 45, -6, -6, 17, 21, 28, -5, 17, 31, 34, + 29, 60, -1, -15, -16, 6, 28, -3, -24, -1, + 0, -27, 21, -11, 0, -6, 9, -20, 30, 15, + -3, -2, -22, 18, 1, 32, 52, -28, 32, 14, + 69, 12, 1, -13, -18, -21, -16, -30, 61, 27, + 13, -4, 11, 10, 0, 3, 17, -5, 7, -40, + -5, 40, 17, 3, -2, -22, 42, 14, 29, -11, + 23, 6, 38, 11, 17, 12, -5, -16, -36, -9, + 49, -5, 4, -15, -42, 16, 27, -8, -22, -7, + 6, -1, -12, -20, 25, -11, -2, -1, -1, -3, + 4, -5, 2, 1, -20, -32, -17, 14, 5, -3, + 1, 14, 34, 6, 22, -29, 20, -14, 29, 30, + 5, 44, 25, -2, -13, 24, 14, 42, 43, 76, + -2, 8, 42, 22, 43, 41, 9, 25, -18, 60, + -1, 16, 48, -23, -24, 17, 9, 27, 26, 4, + 29, 28, 43, -13, 31, 14, 32, 13, -1, 26, + 3, -30, -4, 32, 17, 4, 5, 27, 5, -19, + 9, -14, -13, 3, 22, -43, -30, -32, 32, 4, + 29, -12, 56, 28, -22, -4, -41, 66, -6, 6, + 1, 28, 32, 34, -6, 49, 37, 54, -38, 67, + 32, -69, 7, -10, 24, -15, 36, -39, -36, -6, + -17, 5, 1, 42, -9, 57, 14, -36, -15, -62, + 23, 6, 27, -41, -49, -45, -14, -6, 30, 24, + -24, 55, -5, -63, -22, -66, 5, -5, 26, -35, + -28, -116, -27, 10, -40, 32, 61, 46, -53, -63, + -51, -9, -18, -62, -2, 0, 29, -30, 69, 15, + 46, 13, 8, 57, 9, 12, -12, 6, -18, -15, + 13, 12, 36, 46, -21, -9, 7, 62, -30, 10, + 3, 17, -3, -36, 7, 4, -10, -2, -32, -30, + 61, 9, 21, 29, 52, 39, 27, 9, -20, 3, + -7, -31, 34, 24, 26, 50, 19, 9, -31, 11, + -3, 6, -28, 18, 8, -5, 16, 18, 12, -25, + -11, -18, -15, 10, 1, -24, 15, 32, 19, 10, + -17, 30, -35, -35, 12, 41, 45, -12, 33, -16, + -3, -51, -30, 7, -30, -12, 16, -9, -7, -2, + -37, -8, 24, 35, -3, -28, -62, 9, -40, 37, + -51, -27, -13, -3, -5, -1, -17, -1, -13, 8, + 23, -52, -8, -8, -41, 8, -5, 54, 48, 22, + -20, -20, -26, -3, -4, -31, -2, 17, -20, -22, + -64, -1, 49, 26, 32, 39, -30, 17, -62, -22, + 32, 2, -32, 74, 42, -55, -37, -18, 40, 59, + 35, 32, -66, 7, -51, -7, 50, -24, -11, 10, + 29, -3, -15, -44, 30, 60, 72, -11, 12, -19, + -10, -35, 7, 0, -40, 27, 25, 10, -8, -6, + 11, 34, -3, -4, -19, 44, -4, 35, -44, -6, + 2, 27, 21, -17, -20, 6, 56, 47, 52, 2, + -9, -20, -24, -52, 75, 16, 17, -38, -42, 13, + 0, 39, -12, -56, 13, 29, -16, 1, -26, -1, + -10, 12, -60, 47, 4, -18, 48, -8, -14, -9, + -5, 2, -29, 52, 24, 27, 46, -40, 2, -12, + -11, 23, 4, 12, -3, -10, -1, 33, 4, -14, + 32, -23, 13, -30, 2, 48, 114, 24, -14, 0, + 28, 26, -18, 36, -21, 2, 8, -3, -51, 5, + -26, 14, 72, -21, -17, 31, 40, 42, 16, -31, + -18, 6, -42, -2, 0, -21, -17, -26, -22, -13, + 22, 35, -9, -17, 40, -21, -37, 3, -1, -17, + -6, 1, 45, 47, 49, -18, -4, -17, 12, 54, + 29, 45, -66, 6, -15, 33, 10, -55, -38, 30, + -1, -24, -27, -5, 39, 21, 74, 35, -54, 23, + -7, 1, 24, -50, 18, 41, 11, 1, -25, 42, + -4, 16, -22, 20, 8, 12, -28, -27, -16, 13, + -23, 54, -28, -19, 8, 16, -27, 10, -9, 13, + 25, 33, -59, 8, 14, -9, -12, 15, 107, 4, + 7, -32, 9, 26, 37, 2, -35, -12, 51, 18, + 7, -35, 39, 2, 22, -29, 44, -28, 7, -4, + 26, 43, -17, 16, 43, -73, -22, -3, 24, 49, + 26, -52, 3, 4, -31, -55, 9, 45, -41, 13, + 54, -65, -37, -38, -28, 32, -20, 23, 4, 42, + -17, -43, -3, 28, 30, -9, -2, -27, -71, -36, + 47, 8, 2, -2, -39, -2, 9, -32, 22, 24, + 43, 35, 24, -87, -55, -38, 10, 7, 27, -11, + 12, -17, 3, 9, -37, 64, 5, 14, 27, 6, + -25, -15, -40, -11, -53, 44, 27, -37, -16, 27, + -15, -24, 12, 14, -68, -14, 18, 35, 26, 23, + -14, -32, -19, 39, -11, -9, 47, 22, -14, 45, + 19, -33, -51, 22, 21, 44, 8, 11, 3, 17, + -27, 9, 14, -14, -27, 31, 1, -22, -45, -2, + -33, 4, 52, 5, 33, 20, -9, 12, -26, -11, + 10, -20, 24, -9, 3, 4, 25, 49, 27, 3, + 6, 23, -29, -3, -11, -1, -63, 31, 23, 3, + -31, -18, 5, 1, -9, -2, 9, -14, -31, -7, + 0, -25, 9, -11, -17, 46, -14, 35, -8, 23, + 63, -42, 48, 23, -2, -43, 5, 52, -23, 41, + 38, 13, -7, 33, 20, 12, 34, -20, -4, -10, + -16, -60, -13, 36, -16, 34, 21, -19, -58, -25, + -5, 17, 22, 11, 26, -3, -3, 4, 1, -10, + 15, 8, 18, 12, 47, 0, -33, -6, 29, -12, + 20, -10, 14, -5, -57, 16, -28, 5, 7, 15, + 19, -12, -32, -7, 0, -10, -17, 37, 7, 9, + 19, 2, -8, 26, -13, 5, -29, 27, 16, 28, + -6, -26, 33, 23, 20, 31, -20, -35, 23, 24, + 31, 11, 17, -8, 32, 37, -15, -11, 16, 4, + -5, 35, 1, -34, 20, 16, -17, 3, 31, -2, + -9, 10, 10, -7, 20, 9, -22, 11, -28, -19, + 42, 33, 40, 11, 26, -38, 21, -1, 26, -24, + 7, -27, -3, -25, 33, 15, -12, 4, 11, -1, + 23, 0, -21, 30, 30, -23, -5, 28, -1, -29, + -27, 3, 8, 7, -22, 6, 8, 11, -34, 8, + 10, -5, 29, 8, 42, -4, 14, 14, -8, -24, + -10, 9, 34, -25, 19, 3, 26, 14, 67, 0, + 28, 36, -14, -44, -13, 40, -20, -17, 53, 40, + 19, 43, 27, -26, -7, 15, 3, 20, 33, 3, + -14, -19, -33, 9, 19, 31, 9, -38, -52, -37, + 2, 48, 4, -80, -31, 9, -5, -7, -12, 13, + -61, -22, 1, -10, -30, -24, -19, 15, -9, -4, + 10, 3, 7, 32, 12, 10, -2, 1, 32, 17, + 11, -36, -4, 13, 25, 7, 45, 0, -12, 25, + -7, 38, -2, -4, -5, 31, 4, 5, 19, 72, + 12, 22, 22, -35, 8, 20, 17, 2, 30, -35, + 3, 47, 48, -24, 41, -22, 12, -11, -32, 0, + 11, -1, -21, -38, 20, 9, 14, -19, -9, 5, + 30, 7, 29, -7, 18, 43, 7, -19, -13, 14, + -7, -12, -10, -9, -65, -37, 4, 14, 0, -26, + -13, -19, 33, 23, -7, -25, 1, 35, 32, 17, + 29, -3, -27, -8, 15, -45, 9, -18, 16, -11, + -8, 2, -10, -4, -12, -20, -3, -15, 6, 36, + -23, -7, 26, 4, 9, -7, 1, 14, 14, -17, + 19, 2, 30, 22, -15, 14, -4, -13, 4, -10, + 17, -30, 24, -19, -22, -51, 11, -19, -8, -21, + -68, -22, -17, -24, -5, -5, 26, 5, -17, -78, + -23, -93, 8, -1, 19, -7, 41, 20, 1, -2, + 5, 61, 2, 6, -5, 24, 29, -5, 22, 37, + 18, 1, -23, -13, 19, -10, 10, 4, -16, -12, + 6, -25, -25, 18, 15, -21, -6, 45, -20, 48, + -38, 16, -16, -29, 2, -2, 1, 20, 20, 7, + -47, -18, -14, 9, 22, 55, -31, -25, -43, 33, + 30, -39, 44, -41, -18, -55, 10, 6, 22, 2, + 25, 49, -38, -1, 0, -30, 0, -13, 33, -11, + -64, -29, 30, 17, -5, -49, -31, -12, 42, -35, + 31, 41, -26, -6, -26, 15, 28, -4, -9, 5, + -8, -38, 8, 17, 31, -51, 10, 4, -4, 7, + -12, -22, -32, -69, 6, 5, -1, 36, -15, 56, + -12, -15, 5, -33, -9, 0, 11, 7, -3, 2, + 4, 2, 40, 23, -5, 32, -20, -29, 24, -16, + 43, 17, 2, -9, -12, -6, 26, 23, -7, 33, + 9, 37, 3, -4, -29, -27, 10, 17, 17, -26, + -4, -23, 25, 15, -3, -1, -38, 18, 30, 6, + 1, 25, 29, -13, -11, -14, -12, 37, 28, 53, + 32, -38, 31, 17, 26, 61, 55, 7, 8, 27, + -6, 43, 17, 25, -1, 37, 26, 1, 26, 30, + -6, -29, 18, -24, 15, 18, 23, -39, -62, 3, + 25, 34, -70, 4, 10, 19, -70, 10, 13, 21, + -9, 29, 40, 41, 25, -27, -12, 11, 33, -49, + -17, 7, 30, 35, 46, -19, -27, 27, -1, 41, + 64, -26, 38, -30, 29, 8, -18, 18, 1, 24, + 31, 41, -31, 3, 15, 15, 33, -27, 17, 5, + 10, 10, 8, 27, 66, 51, 51, 36, -1, 46, + 5, 17, 4, 16, 20, 25, 60, 5, -5, 15, + 57, 55, 40, 48, -21, -16, 5, 19, 7, 10, + -29, 37, -20, 20, 15, -14, -19, -52, -15, -38, + 26, 9, 3, -6, 24, 37, 57, 17, -17, -22, + -21, 33, 9, -14, 11, 22, -19, -20, 5, 12, + 35, 28, -31, 41, -39, -10, -41, 8, 4, 21, + 73, 39, -4, -11, -10, 6, 40, 19, -48, 27, + -43, 29, 19, -15, 8, -24, -2, -17, -17, 20, + -13, -19, -20, -28, 40, 0, 26, 10, 24, 37, + 53, 49, 4, -5, 21, 37, 30, 22, 24, 3, + 28, 14, -11, -27, -9, -4, 27, 24, 17, 11, + -20, 8, 28, 17, 44, 16, 11, 65, 0, 11, + -1, 13, 34, 21, 43, 39, -8, 21, -22, 12, + 39, 1, -4, -1, -43, 26, -7, 27, -45, -35, + -37, -19, -25, 44, 0, 17, 4, 22, 22, 1, + -13, -9, 28, -31, -15, 48, 50, 49, -16, -6, + 9, -3, 43, -10, -2, 15, 18, 17, -4, 25, + -13, 27, 3, 50, 26, 38, 38, -6, -34, 26, + 27, 11, -7, 21, -30, 30, -16, 11, 12, 27, + 25, 28, -14, 19, -36, -38, 29, -33, -41, -51, + 20, 3, -33, 33, 27, 27, -12, 18, -40, 3, + -21, 50, 28, -11, 64, -10, 18, 4, -2, -42, + 28, 38, -33, 37, 41, -44, -22, 4, -22, -13, + 29, 13, -20, -19, -10, 5, -1, 13, 7, 2, + -7, -17, -5, -17, 43, 56, 9, -9, 39, 28, + 11, 49, 21, 36, 50, 7, 52, -1, -15, 41, + 14, 21, 23, 1, 55, -9, -23, 30, -38, -1, + 10, 6, 63, -19, -3, 26, 0, 18, -15, -23, + 0, 16, 23, 13, -25, -14, 12, -2, -36, 5, + 21, -4, 18, -4, 25, 34, -6, -7, 22, 2, + 45, -2, -24, -11, 12, 1, 8, 39, -2, 16, + 12, -20, 45, 25, -72, 64, 30, 30, -38, 3, + 10, -29, -8, -18, 20, 18, -7, -21, -5, 4, + -18, -50, 22, 13, 28, 11, -26, 1, -47, 3, + 43, -21, 37, -10, 21, 10, 31, 15, -1, 37, + 17, 20, 10, 22, 2, 42, 16, 10, 19, 46, + 4, 3, 19, 12, 0, 52, 16, 19, 24, -11, + 0, -27, 45, 2, 15, 7, 9, 11, 10, 21, + 54, 52, 25, 37, 12, -26, 9, 17, -3, 45, + 3, 3, -17, 40, -4, 34, 8, 3, -12, 27, + -33, 2, -18, -19, 40, -13, 9, -8, 37, 59, + 1, -25, 38, 12, 11, 48, -24, -2, -29, -12, + 68, 59, 16, 4, 4, 37, 38, 37, 49, 35, + 10, 18, -24, 24, -2, -19, -12, -85, -25, 3, + 0, 11, -6, -70, -41, 25, 28, 8, 54, 19, + 13, -46, 36, 76, 100, 26, 49, -26, 64, 29, + 88, -30, -35, -13, 0, -60, 72, -19, 34, 48, + 21, -8, 32, 23, 21, 18, 16, -34, -6, 23, + 43, 28, 31, 14, -35, 25, -16, -29, -23, 6, + -9, 45, 6, 15, -44, -25, -88, -34, -14, 41, + 30, 27, 32, -3, 20, 12, 5, 10, 45, 23, + -17, 19, 25, 19, -1, -11, 14, 43, 60, 27, + -14, -23, 44, 28, 2, 22, -23, -32, 19, 16, + 18, -26, 42, -48, 85, -16, 6, -9, 8, 9, + 23, 29, -33, -66, -12, -41, 38, 7, -56, 40, + -27, -22, -18, 36, 17, 30, -1, -38, -27, 14, + -24, 15, 37, 14, 17, 60, 48, -8, -30, 27, + 73, 9, 64, 28, -39, 16, -33, -1, 16, 4, + 63, -36, 68, 38, 23, 8, 16, -36, 16, -5, + 48, 52, 44, 19, 24, -1, 35, 19, 37, -30, + 9, 31, 10, 47, 32, 33, 25, 26, 47, 6, + 23, 16, 7, 9, -1, -21, 29, 27, -27, 16, + -27, -15, 19, -6, 3, 17, 1, 28, 14, 23, + 51, 23, 19, 39, 28, 1, -10, 33, 20, 21, + 24, -1, 4, 7, -21, -68, -33, -6, -18, 16, + 12, -54, -1, -7, 0, -9, -12, 9, -13, -24, + 10, 61, 37, 44, 14, 24, 25, 65, 32, 24, + -3, -25, 22, -20, 35, -41, -9, 49, 38, 39, + 5, 10, -37, -44, 10, 41, 20, -3, 32, 6, + 31, 1, -3, -4, 23, -32, -1, 23, -38, -12, + -29, -32, 42, -45, 10, -32, -8, -16, -35, -16, + 27, 29, 20, 103, -81, -27, -95, -36, 12, -110, + 43, 48, -56, 13, 5, 25, 37, 11, 12, 51, + 11, 8, 44, -2, 12, 21, -14, 1, -17, -11, + 24, 17, 20, 8, 17, -53, 6, -8, 17, 14, + -56, 14, -3, 20, -2, 26, 48, 36, 21, -5, + 14, 14, -22, 9, 10, 36, 21, 50, 15, 54, + 58, 7, 24, 25, 41, 15, 31, 67, 37, -22, + -21, 56, 13, -44, -1, 5, -3, 29, -11, -34, + 54, 28, 8, -21, -33, -14, -18, -28, -63, -64, + 41, -2, 13, 19, 29, 37, 27, -25, -5, 12, + 11, -5, 30, 18, -11, 8, -54, 0, 12, 24, + -12, 18, 24, 29, -42, 38, 24, -91, -40, -16, + -17, -48, -23, -53, -10, -51, -37, -22, -69, 48, + 33, 68, -20, -59, -21, -65, 42, -18, -32, -21, + -12, -95, 6, 44, -12, -10, -2, 33, -7, 43, + 35, 71, 1, 47, 21, 17, 28, 30, 39, 39, + 17, -19, -17, -11, -38, 8, 15, 29, 5, 29, + 19, -45, 7, 28, 48, 2, 11, 34, 29, 26, + 0, -24, 0, 24, -19, 8, 29, 8, -6, 2, + 1, -36, -5, -12, -35, -5, -12, -26, 9, -23, + 1, 8, -49, -23, 31, 18, 72, 27, 7, 32, + -9, 40, -16, -68, -16, -13, 21, 9, 54, -115, + -76, -34, -27, 14, 12, 27, 11, 3, 12, -16, + -13, -28, 9, 21, -13, 1, -60, 0, 28, 13, + -45, 4, 14, -9, -19, 22, 50, 67, 29, -5, + -9, 20, 60, -10, 39, -1, 2, -2, 28, 43, + 22, 23, 27, 9, 19, -23, 41, 18, 21, 4, + -10, 63, 0, 13, 23, 31, 30, 13, -17, -37, + -9, 39, 24, 37, 15, 20, -2, 2, -6, -28, + 55, 14, 27, 40, 60, 29, 3, 8, 3, 51, + 13, -11, -2, 10, 23, -14, 22, 8, 3, 31, + 13, 11, 8, -8, 15, -3, 20, 27, -5, 22, + -55, 19, 7, 13, -11, 39, 72, 40, -12, 29, + 1, -10, 44, 26, 16, 7, -48, -10, 14, -41, + -4, 25, 7, -1, 1, -8, -5, -8, 13, 17, + 43, 55, -14, 2, -14, 6, -5, 64, 40, 79, + -19, 28, 14, 5, 49, -31, -29, 38, -11, -14, + -15, -36, 25, 56, 7, 0, -32, 44, -33, 51, + 17, -53, 16, 25, 28, -11, 18, 13, -7, -19, + -60, -40, -5, 28, 47, 20, -15, 24, -9, 24, + 48, -25, -9, 13, 57, 24, 60, 36, 25, 1, + -6, 15, 45, 3, -45, 60, 34, -3, 6, -50, + 11, 32, 19, -21, -29, 42, 10, 57, 30, -1, + 30, 41, 29, -8, 32, 60, 42, 30, 37, 54, + 38, 19, -12, 30, 21, 16, -9, 32, 24, -14, + -50, -17, -2, 23, 30, 3, -34, -4, -43, -1, + 47, -5, -39, 5, -24, -15, -13, -20, 29, 5, + -24, -33, 20, 32, 11, 22, -10, 26, 1, 5, + 14, 9, -9, -24, 9, -13, -26, -17, -10, 15, + 8, -2, -2, 14, -3, -10, -8, -42, 2, 1, + -32, 17, 21, 9, 4, 6, -5, 14, 4, 43, + 9, -24, 33, 110, 17, -19, 37, 25, 30, -9, + 17, 0, 70, 1, 40, 32, -33, 9, 30, -12, + 14, 56, -21, -4, -12, 31, 37, -4, -13, -2, + 30, 9, 51, -41, -2, 0, 16, 8, 25, 0, + 8, 36, 48, 52, -1, 8, 24, 60, -10, -25, + -13, -5, -38, -15, -26, 29, 4, -32, -27, 1, + 8, 24, -15, 3, 26, 18, 28, 31, 34, 5, + 1, 1, 31, 20, -7, 11, -9, 17, -24, 1, + -1, -16, 48, 27, -9, -7, -2, -60, -9, -5, + 22, 17, -25, 3, -8, 11, 48, 0, 52, -27, + 16, -5, -17, -10, 39, 55, -5, 34, 14, -39, + -48, 33, 24, 30, 21, 18, -46, 52, -28, -36, + 34, 42, 14, 42, 0, -47, -60, -9, -11, 13, + 16, 15, -23, 39, -22, 2, -18, -14, 9, 12, + -25, 18, 50, 63, 6, 4, 32, -71, 21, 16, + -5, 27, 42, 53, -6, 40, 32, 16, -8, 14, + 61, 16, 2, -25, -9, 69, 28, -51, 79, 12, + -5, 56, 64, -10, -40, 17, 19, -19, 39, 6, + 56, 27, 18, 7, -7, 4, 29, 18, 24, -15, + 46, 17, 24, 45, -6, -15, 17, 19, -24, -29, + 24, 51, -40, 34, 23, -62, -55, -18, -6, -26, + -8, -14, -2, -27, 17, 46, 21, 1, -11, -16, + 10, -12, -30, 25, 21, -49, -14, -3, 27, 24, + 26, -66, -48, 25, 13, -2, -13, 24, 15, 2, + 4, 63, 44, -5, 1, -49, -11, 41, 88, 24, + -39, -22, -41, -28, 21, -22, -13, 30, 15, 17, + 19, 40, 29, 20, 37, 14, 13, -1, 25, 20, + 26, 46, 23, -91, 25, -13, -14, -25, -77, -50, + -37, 51, -25, -83, -5, -36, 53, -33, 24, 46, + 32, 4, 14, 51, 41, 62, 30, 6, 50, 32, + 17, 51, 25, 22, 12, -7, -33, -17, 8, 10, + -5, 4, 17, 13, -3, -10, -46, -6, 17, 9, + -12, 66, 91, -75, -28, -9, 4, 43, 56, 45, + -45, -25, -53, -43, 44, -43, -40, 34, 15, 0, + 3, 26, 52, 51, 81, -9, -24, -46, -16, -22, + 4, -26, 7, 62, 25, -41, 2, 31, 20, -6, + -12, 52, -28, -12, -2, -43, 43, -8, 2, 0, + 0, 7, -27, 6, -10, 20, -8, -53, -9, 47, + 44, 12, 20, -25, 47, -17, 32, -38, -17, -20, + 12, -2, 64, 53, -41, -93, -54, -24, 18, 20, + -5, -7, 47, -7, 34, 28, 16, 10, 39, -5, + 38, 36, 14, 6, 17, 50, -12, -25, 15, 2, + 41, 38, 29, -30, -19, -25, 11, 36, 35, -11, + 16, 46, 35, 6, 33, 31, -6, 12, 22, 8, + 13, 36, 14, 4, -1, 2, 37, -4, 1, 49, + 8, -10, 42, 10, -11, 5, 51, -36, 19, -9, + -16, 30, 35, -23, -29, -39, -66, -13, 9, 0, + -14, -14, 21, -14, 29, 10, -4, -1, -53, 29, + 13, 18, -3, -25, 14, -33, -41, -38, 1, 9, + 7, -8, -35, -31, -33, -3, 52, 29, 48, 4, + 55, 54, -5, -32, 34, 32, -46, -4, 34, -10, + -8, 50, 11, 15, 56, 46, -8, -7, 47, 11, + -20, 61, -19, 8, -20, 4, 13, 28, -48, -31, + 47, -7, 33, -5, 6, 34, -7, -36, -11, -25, + 29, 6, 42, 40, 2, 71, 42, 24, 54, 74, + -8, -40, 15, 25, 9, 8, 25, -22, 20, -58, + 3, 56, -40, -12, -40, 13, -41, -21, -21, 65, + 0, -7, -66, 29, 13, 33, -29, -36, 42, -2, + 34, 39, -51, -18, 24, -46, -35, 4, 48, 34, + 9, 9, 24, -24, 31, 61, 24, 53, 1, -11, + 1, -8, -21, -25, 15, -30, 27, -4, -42, -13, + 36, 47, 63, 20, 27, 19, 2, -47, -13, -54, + 29, -24, 22, -4, 46, 47, -36, -27, -4, 19, + 10, -46, 20, 3, 46, 20, 17, -76, -22, -69, + -29, -9, 51, 83, 14, 13, 48, -2, -44, -10, + -84, -29, 55, 7, 21, 26, 17, 30, 8, 33, + 28, 44, 58, 42, 36, 3, -20, 25, -13, 4, + 40, 11, -37, 1, 7, 12, 24, 19, 56, -10, + -22, 17, -10, -7, 25, -17, 2, -4, 45, 46, + 17, 19, 40, 42, -22, 13, 43, 11, -30, 25, + 44, 47, 35, 1, -10, 39, -14, 35, 27, 52, + -9, -10, -34, -9, 14, 9, 25, -17, 20, -32, + 14, 5, -12, 5, -23, 4, -50, 18, 27, 5, + 50, 24, -77, 14, 5, 36, 17, -19, 51, 38, + -7, 39, -38, -28, 9, 2, 23, -6, -12, -11, + -48, -3, 17, 14, 21, -10, -14, -22, 28, 1, + -7, 43, -28, 16, 1, 16, -14, -7, -4, -14, + 13, -8, -14, -21, 7, 12, -7, 33, 25, -21, + -12, -6, -6, -15, 1, -17, 13, -15, -24, 38, + 13, 27, 23, 3, 2, 11, 6, 25, 12, 31, + -28, 0, -56, 14, 40, 34, -30, -39, -19, -31, + 36, -19, 65, 22, -21, 57, 17, 28, 25, 26, + -7, 29, 0, 7, 37, 19, 0, 26, -11, -20, + 29, 13, 39, -5, 25, 26, -24, 18, 9, 11, + 8, -9, 9, 18, 4, -15, 5, -6, -11, 6, + -9, -16, 37, -29, 10, -7, -18, 28, 0, -6, + -12, 17, 26, 3, -23, 24, -11, 21, 33, -27, + -20, -14, -52, -55, 32, 41, 32, 49, -5, 0, + -43, 55, 11, -14, -6, 14, -17, -2, 31, -24, + 16, -1, 22, 9, 12, -10, 29, 6, 61, -25, + 11, 26, 13, 1, 33, 50, -8, -29, -13, -32, + -4, 28, -33, 28, 23, 20, 30, -27, 33, -2, + -19, -17, -7, 28, -14, 10, -5, 31, 6, -29, + -10, 31, 23, 19, -13, -42, -7, -1, 44, 44, + 7, -5, -21, 48, 48, -12, 40, 10, 10, 11, + 26, 13, -4, 52, 14, -7, 8, -22, -11, -6, + -22, 20, 50, 12, 18, 28, 0, -20, 22, 16, + 55, 24, 46, 36, 17, -1, 11, 1, 86, -22, + 9, 17, -14, 8, 32, 16, 3, -11, 12, 9, + 33, -14, -57, 38, 59, 61, -4, 22, 28, 13, + -20, -20, 32, -57, 5, 37, 38, 9, -7, 37, + 53, -34, -7, 10, -6, 18, 0, -8, -34, 6, + 6, -8, -15, 0, -5, -21, 38, 51, 8, -29, + 33, 31, -28, -5, 13, 11, 9, 15, 38, 13, + 7, -7, 21, 34, -6, 18, 17, 44, 11, 23, + 19, -4, -15, -20, -11, -14, -13, -21, -50, -36, + 52, -11, 4, 59, 1, -44, 58, -9, -54, 44, + 35, 49, 17, 21, 4, 28, -2, 31, 14, 29, + 25, 12, 28, -6, 25, 31, 7, 14, -35, -14, + 19, 0, 9, -11, 30, -12, -9, -14, 15, -42, + -12, 18, 24, 21, 42, 10, 55, 14, 12, 30, + 8, -23, 25, -5, -6, 19, 11, 8, -18, -22, + 3, 19, -34, -9, 1, 33, 24, 2, 51, 34, + 64, 31, -20, -7, -9, 25, 27, 45, 15, 19, + 9, 39, 11, 9, 13, 27, 3, 11, 8, -13, + -40, 3, -19, 21, 31, 10, 28, -27, 17, 25, + -22, 12, 11, 16, 42, -10, 17, 5, 29, 11, + -6, -16, -4, 45, 23, -7, 64, 38, 17, 49, + 16, -15, 4, 6, 14, 14, -38, 31, 32, 14, + 48, 44, -18, -42, 21, 9, -52, -12, 33, 6, + -25, 26, 33, 26, 7, 12, -11, 6, -30, 3, + 17, -17, 22, 26, 60, 36, 7, 29, 24, 4, + -17, 3, 5, 24, 12, 9, 1, 7, -14, 43, + 18, 2, 11, -6, -10, -34, 33, 30, 25, -23, + -3, -15, -35, 8, 14, 28, -10, 35, -6, 19, + 17, 29, 15, -27, 12, -13, 18, 33, 41, -23, + -19, -12, 9, -28, -8, 10, 6, 8, -20, -15, + -19, 29, 42, 24, 36, -10, -3, 6, -18, 10, + 2, 16, -23, 37, 10, 8, 1, 28, 1, -8, + 23, 18, -23, -17, -5, 48, 31, -24, 20, -11, + -5, 24, 27, -26, -12, 21, 4, 13, 1, 43, + 30, 11, 25, 25, -10, 15, -24, -2, -21, -14, + 6, 31, -9, -7, -27, 2, 33, 32, 27, 4, + -6, 25, -8, 26, 32, 42, -12, -26, 38, -1, + 4, 19, 35, -19, -5, -24, -15, -21, 38, 35, + 5, -1, 13, -6, -31, 2, 39, 20, -14, 22, + 8, 17, -5, -29, 38, -17, 36, -6, -11, 28, + -33, 16, -32, -13, 15, -19, 25, 3, 7, -27, + 33, -17, -23, -5, -19, -9, 14, 16, 5, 1, + 35, 7, -18, 25, -19, 1, 3, 22, 23, 33, + -23, -5, -4, 11, 39, -16, 11, -27, 27, 27, + 25, 4, 21, -17, 10, 30, -5, 23, 12, -16, + 10, -31, -13, 11, 16, -15, -20, -8, 44, 12, + -16, 32, 5, -19, 21, 15, -1, -16, 45, 55, + 15, 28, -23, 8, 71, -5, 1, 2, -16, -15, + 19, 63, 13, 33, -19, 39, -9, 19, 7, 19, + -5, 3, -13, -5, 20, 27, -5, 4, -6, -10, + -24, -31, -23, 40, 30, 16, 30, 37, 0, 16, + -20, -27, 6, 40, 52, 33, -19, -7, 3, 13, + -1, -39, -10, -18, -26, 25, -10, 22, -25, 3, + -25, -5, 7, 0, -18, 34, 5, -35, -11, 3, + 30, -2, -7, -10, -8, -15, -12, 14, -9, 11, + 2, -4, 20, 16, -7, -20, 24, 26, 18, 19, + -1, 3, 3, 10, -8, 33, -20, 9, -12, 22, + -13, 10, 22, -16, -14, 5, 22, 4, -15, 10, + -20, 29, 21, 5, 0, -24, 15, -14, -28, -2, + -25, -13, 15, -6, 8, 11, -2, -11, 4, 14, + 13, 18, 20, 24, 9, 27, 12, 39, -19, -14, + 31, -2, 8, -7, 17, 13, 7, -12, 19, 25, + -11, 7, 42, 21, -14, 36, -10, -13, 25, -17, + 32, 10, -6, -27, 6, 0, -14, 28, 28, 65, + 34, 26, -18, -40, -9, 47, -20, -13, -17, -13, + 33, -7, -31, 10, -27, 2, -33, -3, 25, 23, + 21, 56, 3, -4, 27, -10, 9, 9, -28, 5, + 26, 4, -41, -18, 5, -1, -2, 19, 14, 8, + 35, 5, -2, 34, 21, 12, 57, 24, 22, 48, + -6, -11, 6, -17, -32, 5, 8, -10, 0, 7, + -17, -5, 23, 7, -6, 8, 5, 13, 4, 52, + -44, 0, -21, -8, 3, 10, 10, 12, 7, 7, + -15, -8, 4, 7, -8, -32, -24, 22, 17, 3, + 0, -11, -34, 20, 25, 3, 0, 15, -28, 27, + 23, -18, -21, 27, 18, 38, -6, 27, -5, 14, + 28, 19, 4, 4, 13, -4, -19, 53, -4, 32, + 21, -4, -19, -5, 11, 27, -6, 24, -6, 32, + -32, 18, 17, -21, -4, 26, 15, 9, -7, 24, + 4, 3, 20, 24, -22, 7, 30, -12, 9, 14, + -2, -12, 17, 28, -5, -14, -19, -8, -21, 27, + 36, -28, 26, 15, 20, 40, 33, -15, 16, -24, + 26, 39, 5, -33, 13, 15, 27, -28, 7, -22, + -37, 12, 22, -43, 2, 37, 29, 20, -43, -35, + 4, -10, -8, -22, -19, -9, -16, 24, -8, -28, + 3, 21, 40, 26, -34, -28, 6, -14, 9, 39, + 46, 31, 7, 49, 9, 10, -35, 28, 32, -28, + 5, 21, 26, -10, 1, 11, 5, 9, -8, 41, + 37, -5, 2, -11, 16, 49, 23, 9, -13, 4, + 19, 28, -13, -13, 17, 35, 2, -12, 16, 3, + -3, -23, 15, -2, 5, -13, 4, 3, 5, 7, + 24, -14, -11, -8, 29, -13, -19, 24, 24, 10, + 8, 6, 0, 40, -3, -30, -16, 9, 17, 23, + 22, 38, 27, 2, 5, -3, -13, -7, 9, 15, + 38, 40, 18, 43, 21, -4, 58, 9, 7, 5, + 30, -6, 15, 14, -15, 36, 15, 27, -16, -13, + -35, 1, -35, -10, -31, 8, -14, 2, 9, 1, + -29, -8, 18, -17, 15, 13, -13, -24, 20, 19, + 26, 27, 17, -29, -6, -23, 49, 7, 22, 37, + 5, 22, -15, 27, -12, 17, -1, -9, -29, -16, + 0, -14, 21, -1, 4, 11, -20, -22, 49, -8, + -11, -3, 8, 13, -30, 14, 9, 28, -12, -8, + -21, 30, 34, -12, 1, 39, -13, 34, 24, 19, + 1, 1, -8, -20, 6, -25, -4, -23, -35, 0, + 19, 10, -25, 20, -30, -3, -12, 22, -31, -33, + 2, -1, 26, 14, 25, 6, -12, -23, 15, 5, + 29, 2, 13, 11, 15, -26, 12, -19, -22, -9, + 25, 26, -37, -10, -12, -11, 66, -23, -15, -9, + -33, -11, -17, -54, -8, 44, 33, 54, -31, 6, + -14, 29, 25, -30, -1, 44, -11, -2, 18, -18, + -10, 16, -9, 41, 25, 7, -41, 69, 6, -30, + -27, 81, -35, -35, 10, 22, -6, 29, 28, 4, + -7, -14, -2, 2, 4, 43, -5, -11, 15, 7, + 6, 41, -10, 10, -7, 29, 36, 22, -23, -3, + 16, 32, 9, 8, 7, 22, 35, 4, -17, 64, + 27, 42, 10, -12, 24, -19, 27, -46, -9, -15, + -42, -64, 23, -40, -11, 30, -19, 1, 26, 24, + 22, -26, 23, 19, -1, -4, -2, 24, -16, 7, + 46, -25, -8, -35, -26, -48, 11, -37, 55, -2, + -12, 11, -2, 19, -4, 7, 1, 36, 12, 3, + 5, 44, 3, -6, 10, 42, 18, 8, 11, 23, + 7, 35, 41, -29, -4, 7, -11, -16, 15, -17, + -25, 23, -22, -3, 18, 45, 5, 42, -33, -2, + -10, 13, 29, 29, -14, -11, 6, -27, 14, 35, + -17, -32, 72, 16, -25, 12, 18, 25, 21, 19, + -29, 26, -4, 4, 1, 9, 1, -3, -1, 5, + -6, 42, 15, 6, 36, 29, 12, 23, 38, -30, + -1, 0, 20, 29, 14, -4, 6, 45, -3, 51, + -6, -20, -7, 14, -3, -33, 17, -15, -41, 11, + -8, -27, 13, 37, -10, 29, -3, 35, -4, 7, + -30, 19, -17, 3, 7, 11, -11, -2, 2, 25, + 11, -23, 29, 13, 18, 42, 8, 35, -12, -8, + 44, 23, 10, 18, -11, 2, 15, 17, 29, -25, + 18, 5, -34, 15, 27, 26, -9, 52, 7, 25, + -2, -6, 8, 28, -2, 25, 0, 7, 2, 5, + -2, -11, 3, 22, 8, -2, -8, 12, 11, 19, + -22, -12, 14, 33, 20, -46, 1, 5, 27, 13, + 28, -8, 23, 9, 4, -36, 57, 37, 7, -7, + 10, 23, 6, 35, -7, -18, -2, 17, -36, -14, + 16, -5, -36, -1, 35, -8, 25, -2, 26, 29, + 12, 29, 21, 21, 13, 11, 19, 12, 1, -10, + 25, -27, 21, 26, 23, 25, 30, 12, -24, 0, + 4, -8, 21, 0, 19, -10, -12, -5, 3, 8, + -15, 15, -25, -27, -30, 18, -24, -16, 9, 26, + 9, 44, -17, 16, -1, -10, -14, 36, 7, -7, + 15, 42, 7, 30, 11, -14, -19, -27, 17, -27, + -15, 5, -17, 45, -22, 12, 18, 15, -21, -12, + 10, -14, -10, 56, 44, 2, 16, -21, 36, 11, + 23, -2, 33, 18, 8, 7, 16, -16, 46, -24, + -13, 10, 16, -7, -12, -17, 24, 37, 12, 0, + 0, 19, -13, 9, -15, -20, -7, 50, 42, -8, + -32, 5, -16, 20, 9, 24, 25, 14, -22, 48, + 23, -10, 14, 4, 30, -3, 31, 11, 23, -14, + 3, 30, 12, 11, 26, 0, -13, 3, 3, -30, + 7, 49, -12, 34, -14, -13, -16, 37, 12, -14, + 37, 39, -5, 34, -8, 2, -10, -63, 25, -6, + 0, 27, 12, -24, -32, -9, 8, -36, -30, 53, + -14, 4, 40, -15, 23, -21, 0, -22, 5, -28, + -7, 28, -13, 12, -14, 22, -10, 1, 22, 3, + 32, 9, 37, 37, -1, 55, 51, 10, -1, 17, + -69, 5, -6, 1, -18, 10, -1, -20, -63, -4, + 14, -28, 20, 31, -2, 7, 6, 34, 25, -13, + -19, -21, -20, 15, 41, 16, 10, 43, -18, -29, + -40, 10, -25, -11, -29, 30, -3, 20, 11, -40, + 21, 4, -36, -7, 42, -25, -11, -39, -1, -16, + -16, -22, 3, 14, 7, -13, -16, 25, 1, -15, + 31, 27, -13, 8, 3, 47, -43, 9, 29, 9, + -9, 1, -20, 57, 1, -11, 8, -1, 26, -11, + 1, 26, -9, -12, -3, -34, 33, 28, 21, 7, + 14, -14, 30, 43, 10, 40, 14, 20, 15, -35, + 24, 36, -25, -17, 13, -1, 1, 48, -14, -12, + -12, -6, -6, 22, 3, 8, 42, 14, -1, 6, + 20, -2, 14, -2, 40, -11, -4, 24, 9, 26, + 21, -8, -13, 30, -6, 8, -10, 4, 16, -2, + 24, -22, -2, -46, -27, -19, -5, 15, 33, 21, + 27, 12, -15, -4, 23, -13, -18, 54, 11, -3, + -9, -27, -23, -1, -7, -13, 20, 45, 4, 2, + 6, 37, -33, 25, -1, -17, -18, 38, -5, -12, + 8, 20, -5, -23, -11, 20, 10, 20, 23, -11, + -6, 22, -47, -1, 6, 0, 20, 0, -53, 40, + 7, 1, 19, 29, 44, -16, 9, -5, 2, -15, + -7, 1, 15, 17, 4, 7, -1, 19, 8, 5, + 25, 9, -2, 40, -2, 5, 2, 21, -9, -10, + -9, 3, -13, -11, -12, 38, 6, -10, 4, -19, + 9, 0, -8, 28, 19, 25, 34, 15, 30, 41, + -13, 15, 1, -16, 43, -1, -50, 14, 53, 11, + -19, 34, 40, -41, -17, -9, -14, 13, -10, 42, + -29, -13, 4, -3, 7, 48, 3, 4, -27, 5, + -24, 40, 15, -28, 13, -25, -11, 0, -7, 0, + 14, -20, -2, -17, 2, 21, 3, 4, 16, -13, + -37, 7, -2, 15, 21, -9, 17, -22, 11, 26, + 3, 23, 35, -5, 17, 14, 17, -20, -5, 3, + -15, -16, 22, -16, -5, 38, -13, 20, 27, -4, + 23, 21, 8, 32, 30, 3, 76, -11, 8, -14, + 27, -9, 20, 21, -39, 34, 4, -35, -6, -22, + 3, -7, -19, 17, -15, -10, 19, -14, -12, 2, + 17, -34, 19, -8, 8, 18, 54, 19, 25, -14, + 14, 27, 52, 53, 21, -17, -28, -18, 32, -1, + 53, -1, -41, 62, -15, 10, -6, 17, 6, -16, + 32, 8, 1, -14, -34, 43, 12, -20, -34, -4, + -11, 43, 23, 27, 9, -26, 16, -10, 13, 4, + -18, -1, -6, 14, 2, -9, 30, 45, 28, -6, + -3, 20, 16, -8, -11, 12, 8, -20, -10, 9, + -1, -1, 20, 54, 52, -16, 17, 29, 41, 12, + 36, -3, 43, 32, -6, 17, 26, -15, 38, -1, + 42, 24, -26, 21, -12, -4, 34, 36, 3, -11, + -4, -38, 2, 3, 22, 40, 6, 20, -2, 19, + -15, 29, -19, 11, 0, 5, -8, -22, 7, -5, + 26, -30, -46, -49, 20, 17, -35, 13, 11, 12, + 6, -2, 3, -14, 26, 24, -11, 24, -8, -22, + -15, -6, -20, 11, -17, 10, 39, -2, -14, 22, + 7, 22, -28, -2, -24, -11, 29, -6, 6, 25, + -5, -31, 23, 1, 6, -35, 6, -29, -15, -7, + 15, -7, 33, 15, -39, 41, -21, -13, 4, 3, + 11, 17, 45, 29, -17, 17, 10, -11, 6, 33, + -19, -7, 13, 23, -28, 2, 22, 13, -32, -21, + 14, 30, -15, 4, -18, 7, 9, 14, -3, -4, + 19, 24, 9, -12, -8, -29, 50, -9, 14, 52, + 12, 35, 1, 4, 41, 35, -7, 11, 8, 27, + -36, 14, 2, -31, 11, 18, -32, -55, -37, 27, + -3, -12, -48, -18, -21, 20, -24, 21, -10, -27, + -29, -44, -14, 32, -26, -8, 22, -1, -17, 10, + 26, -34, 7, -11, 23, 27, -24, 76, 23, -36, + -13, 57, 1, 9, -27, -24, -2, 30, 82, 53, + -16, -9, -24, 34, 17, -26, -9, -1, -30, -15, + 37, -8, 14, 8, -30, -8, 15, 17, 19, -19, + -24, -16, -2, -2, -5, 4, 7, 25, 23, -36, + 1, 4, 14, -18, 26, 15, -3, -25, 34, 36, + -2, -4, 29, -8, 6, 38, 7, 18, 31, -6, + -27, 32, 24, 7, 43, 27, -18, 30, 6, 35, + 57, 38, 48, 19, 22, 32, 39, 44, 23, -1, + -4, 36, 21, 4, 11, -1, 52, 4, -16, -1, + -8, 20, -11, 76, -29, 26, 25, 21, 43, 21, + -7, 2, -3, -22, -20, 13, 11, 30, -2, 7, + -6, 16, 32, 15, 8, -13, 11, -25, 0, -22, + 26, 42, 65, 10, 31, 18, 3, -27, 27, 26, + 44, 101, -17, -26, -33, 0, 18, 0, -1, -1, + -49, 44, 58, 36, -29, -9, -15, -21, 18, 4, + 47, 30, -16, 40, -24, 37, 33, 14, -26, 18, + -2, 46, 20, 27, -25, -6, -9, 19, 17, -3, + -38, 17, 27, -5, -9, 1, 6, 5, 27, -23, + -2, -17, 25, -7, 27, 10, 18, 5, 22, 11, + -1, 5, 9, -6, 23, -7, 40, 15, 32, 32, + 12, 6, 30, 27, 16, 42, 14, 51, 27, 37, + 43, 11, 32, -13, -11, 19, 36, -26, 58, -29, + 14, 6, -63, -1, -37, 11, 11, 45, 6, -44, + -8, -40, -31, -16, 69, 27, 7, 26, -9, -4, + 2, 14, -39, 79, -3, -34, 19, 9, 2, -1, + 92, 4, 26, 26, 8, 36, -5, -14, -12, 72, + 5, -18, 31, -17, 3, 59, -31, -25, -38, 18, + 22, -11, -14, -11, -29, -29, 28, 15, 47, 36, + 22, 32, 13, 32, 13, -3, -13, 3, -10, 27, + 27, 7, 15, -33, -17, 24, 11, 1, 8, 42, + 27, -10, 31, 45, -10, 35, 18, -9, -20, 24, + -6, -10, 34, -20, 18, 4, 19, -26, 8, 22, + 29, -14, -1, 12, -15, 22, 2, 52, 44, 14, + 14, 6, -16, -10, -6, 42, 16, 37, 10, 11, + 24, 1, 45, 15, 10, -14, 23, 6, 17, -23, + -16, 9, 18, 1, 16, -1, 11, 11, 41, 16, + 10, -27, -17, -10, 45, 24, 6, -9, 29, 37, + -14, 2, -23, -10, 7, -14, -9, 6, -7, -8, + 34, 55, 42, 39, 18, 11, -10, 5, -31, -24, + 51, 53, 23, 0, 57, 16, -26, -64, 21, -40, + -21, 25, 38, 40, 14, 38, -33, 0, -3, -6, + 42, 3, 31, 15, -20, 8, -25, 19, -3, 21, + 17, 16, 32, -28, 14, 22, -19, -20, -2, 4, + -35, 24, -28, 13, -17, -38, -3, -26, -31, 7, + -11, -24, -29, 22, 40, 22, 9, -7, 27, 13, + -23, -22, 11, 12, 29, 14, -18, 9, 2, -24, + 5, 7, 6, 14, -31, -35, -19, 12, 12, 1, + 18, 25, -7, -4, -2, 15, 35, 40, 31, -34, + 34, -17, 8, -1, 4, 17, 10, 37, 6, 20, + 8, 20, -20, 15, 21, -24, 12, -10, -35, 5, + -2, -17, 48, 47, 14, 11, -33, 7, 18, 5, + 24, 34, 18, 54, 17, 18, -25, 6, 15, 94, + 77, 30, 43, 3, -14, -40, -16, -16, -28, 18, + 15, 4, 22, 6, -8, 11, 6, 4, -25, 13, + 28, -6, -16, -12, 20, -3, -39, -33, -18, -18, + 35, 7, -29, -17, 17, 49, -14, 19, -10, 26, + -18, 3, 8, -6, 29, -1, -19, 14, 39, -31, + 7, 42, 21, -8, 31, 8, -18, 72, 18, 20, + 18, 2, 2, 49, 51, 11, 30, 14, 1, 1, + 10, 18, 19, -31, -7, -14, 12, 15, 17, -31, + -28, -10, -20, -2, 4, 17, -10, 35, 26, -32, + 10, -2, 28, -12, -39, -4, -5, -51, 1, 9, + 32, -20, 26, -36, -41, -14, -15, 6, 21, 9, + 36, -4, 35, 13, 8, 51, 30, 16, -2, 1, + 37, 55, 19, 9, -14, 45, 6, 22, 29, -28, + 9, 1, -27, 2, -5, -26, -11, 5, 26, -17, + 4, -22, -8, -6, 29, 14, 15, 31, 24, 16, + -4, 2, 11, 32, 20, 20, 19, -6, 8, 31, + 40, -26, 19, 42, 62, 13, -30, 30, 2, 20, + -2, 6, 18, 21, 11, 14, -13, 18, 11, 13, + -20, -34, -16, 1, -28, 11, -18, 15, 10, 17, + 16, 20, 26, 20, 40, -34, 40, -9, 1, 8, + 1, 28, -10, 9, 8, -39, -26, 8, -2, -35, + 45, -26, 9, 30, 34, -35, 13, -39, 11, -4, + 5, -4, 13, 5, -40, -4, -14, 31, 53, 21, + 10, 10, 40, 42, 14, 25, 18, -10, -6, 14, + 24, 19, -11, 13, 8, 4, -20, 14, 14, -24, + -7, -12, 37, 10, 22, -13, -33, -3, -6, 0, + -32, -12, 59, -1, -16, -36, -42, 17, 19, -8, + -18, 8, 4, 6, 18, -12, -36, 50, 11, 5, + -11, 5, 7, 11, 9, -16, -1, -3, -15, -3, + 29, 9, 9, 21, 27, 60, 6, 25, -28, -6, + 40, 17, 60, 45, 18, 49, 2, 13, -29, 3, + 8, -6, 22, 3, 25, 46, -31, 6, -6, 23, + 51, 13, 25, 20, -8, 42, 42, 42, -24, -39, + -10, -23, 4, 3, 1, -22, 24, 55, -1, 2, + -4, 71, 57, 84, -10, -25, 6, -14, 20, 22, + 25, -14, -23, 62, -23, -12, 6, -25, -6, -14, + 31, 22, 5, -40, 17, 6, -9, 1, 30, 56, + 21, 10, 39, -12, -2, 22, -7, -1, -2, 52, + 11, 6, 61, -15, -11, -1, 12, -3, -19, -25, + 22, -24, -5, 25, -12, 29, 19, 24, -24, -29, + -14, 17, 0, 12, 38, 2, 24, -16, 24, -11, + -15, 8, 26, 1, -18, -19, -32, -1, -17, 32, + 14, 23, -4, 47, 52, -7, -5, -17, 17, 0, + 27, -8, -6, 26, -28, 0, 31, -2, 24, -5, + -10, -8, -40, -21, 14, 5, 11, 15, 0, -2, + -24, -9, -15, -27, -14, -11, -31, -29, -8, -1, + -10, 0, 1, 30, -11, -4, -8, 9, -19, -24, + -13, 9, 18, -3, -16, -19, 19, -6, -14, 16, + -9, 19, 3, 38, 33, 65, -15, -13, -19, 27, + -19, 30, 0, 23, 46, -3, 22, -19, -6, -36, + -2, 14, 16, 9, 32, 29, -16, 2, 32, 1, + 17, 10, 24, 1, 18, -24, -32, -2, 21, -14, + -8, 47, -6, 19, 19, -18, -28, -28, -8, 26, + -3, -8, -4, 21, 5, -9, 1, -2, -8, 15, + -6, -17, -29, 22, 10, 40, 9, -25, 13, 55, + 19, -5, 53, 62, -18, 27, 31, 34, 11, 2, + 62, 9, 12, -4, 5, 4, 29, 14, -25, 10, + -8, 25, 10, 32, 25, 20, 10, 52, -32, -12, + -37, 68, 38, 16, 36, 49, -28, -35, 12, 30, + 22, 11, 66, -5, -14, -21, 6, -22, -6, 8, + -13, 47, 17, 15, 13, 13, 0, 33, 16, 45, + -46, 31, 15, -4, -23, 32, 27, 24, 19, 25, + 20, 3, -11, 34, 12, 34, 7, 33, 34, 10, + 15, 2, 20, 6, 9, -3, 3, 29, 28, -6, + 27, -30, 32, -23, 3, 3, -6, -21, 12, 28, + 34, 8, -30, -27, 6, -1, -16, 27, 33, 13, + -2, -3, 19, 6, 49, -14, 23, 5, 30, -6, + 34, -2, 1, -3, 25, 14, 24, -17, 34, 3, + -4, 11, -21, -6, 27, -15, -4, 33, 19, 42, + 35, 51, 66, -37, 5, -24, 13, 50, 71, 34, + -29, -17, -12, -11, -11, -37, 45, 1, -2, -21, + -13, -29, -16, -2, -7, -8, 11, 14, -7, -2, + 25, 29, -7, -5, 16, 2, 3, -10, -16, 45, + 75, 67, 5, -4, -35, -3, -10, -9, 9, 27, + -4, 36, 44, -19, 14, -24, 55, 10, 3, 10, + 5, 43, -26, 1, -22, 0, -19, 12, -1, -10, + -29, 15, -33, -11, -19, -13, 12, 27, 33, 48, + -3, 27, 9, -7, -21, -25, -12, 21, 38, -14, + -30, -37, -26, 3, -27, -21, -12, 42, -8, -19, + -33, 9, 11, 54, -26, 12, 6, 14, -22, 5, + 44, -41, 47, 37, 18, 14, 0, 23, -8, 46, + 2, 29, 16, -17, 10, 24, -5, 13, 48, 21, + 70, 18, 10, -4, 20, 64, 44, 53, -16, 22, + 18, 21, -7, -31, 21, 0, 31, -39, -6, -43, + 2, 32, 22, 4, -6, 39, 2, 31, 9, -13, + 51, -23, 9, -2, 14, 23, 1, -17, 16, 30, + 11, 5, 28, 22, 6, -19, 11, 49, 5, 8, + -9, -19, 47, 5, 60, 43, -31, 11, 49, 16, + -3, 21, -17, -6, -20, 10, 12, 6, -17, -19, + -15, -4, 37, -3, 18, -12, 3, -32, -9, -16, + -8, -1, -16, 26, -11, 17, -34, 16, -5, -40, + -10, 36, 12, 25, 27, 14, 15, -1, -26, 18, + 22, -6, 8, 13, 23, -22, 28, 6, -25, -1, + -16, -2, -29, 0, 9, 2, 11, 35, -18, -18, + 4, -11, 41, 0, 24, -8, -16, 1, 61, 30, + 24, 8, -14, -40, -16, 21, -49, -16, 64, 17, + 18, -9, 8, 8, -3, 44, 29, -36, 33, 24, + 23, -33, -28, 24, 0, -8, 0, 39, -33, 20, + 51, 19, 54, -28, 9, -7, 8, -23, -21, -2, + 48, 15, 1, 15, 10, -15, 31, 21, 1, 21, + -6, -3, 9, 14, 24, 2, -15, 8, 36, 28, + 27, -33, -6, -3, 32, 13, 2, 43, 12, 13, + 24, 34, -8, 39, 34, 27, 31, -9, -10, 8, + -23, 2, 16, 30, -11, 11, -8, -6, 37, 38, + -3, 20, -3, -8, -9, -35, -4, 7, 5, 10, + 12, 29, -24, -10, 51, -16, -36, 14, -17, 17, + 16, -22, 20, 7, -11, -21, 26, 13, 13, 1, + 7, 47, 41, -12, -1, -3, 24, 17, 14, 13, + -14, -25, 25, 20, 16, 15, 8, -15, 1, 30, + -32, 4, 15, -16, 5, 10, 42, -11, 4, 24, + -1, 13, 30, 34, -2, 23, -18, 6, -33, 25, + -7, 1, -21, -1, -7, -6, 8, -2, 27, -4, + -8, -38, -32, -27, -4, 7, 8, -25, 19, -20, + -24, -37, -6, 28, 9, -6, -18, 26, -5, 21, + -19, 13, -16, 2, 8, -25, -3, -29, -34, 27, + 9, -20, -28, 15, -27, -16, 16, 37, -9, -3, + -24, -3, 7, -27, 16, 21, 24, 33, -4, 35, + -16, 37, 36, -27, 14, -22, -4, 12, 26, 14, + -8, 6, -22, -14, -6, -18, -15, -22, -75, 9, + 18, -15, 3, -32, -17, -33, 19, 4, 7, 23, + -2, 12, 7, -8, -9, 11, -17, 6, 4, -36, + -17, -15, 15, 15, 20, 20, -29, -29, -7, 3, + 45, -23, -25, 9, -1, 17, 31, 28, -33, -16, + -10, 0, 16, 12, 32, -17, 14, 21, -10, 6, + 16, 1, 25, -5, 8, 8, -1, -24, -22, 15, + -10, 23, 36, -13, 15, -30, 13, -33, -17, -25, + 21, 12, 9, -15, -29, 15, -5, -12, -4, -27, + 2, -40, 1, 17, -22, 32, 0, 5, 28, 6, + 15, 11, 21, 8, -23, -20, 23, 14, -24, -37, + -23, -24, 31, -5, 9, 21, -1, 38, 7, -21, + -32, 3, 16, 34, -26, -24, 8, -18, 15, 14, + 27, 5, -26, 19, 11, -4, -22, 29, 13, -22, + 3, -17, -11, 19, 31, -6, 22, 17, 18, 20, + 5, 10, -4, -5, -21, -32, 26, -8, 11, -30, + -3, -14, 2, 8, 10, 7, 24, 27, 22, 7, + 16, -25, -16, -18, -2, 19, 4, -32, 29, -9, + 28, -21, 28, 10, 15, -23, -22, -31, 16, 26, + 11, 15, -10, -1, 4, 21, 28, 8, -7, -23, + -56, 4, -17, 13, 21, -3, 17, -18, 1, -12, + -5, -11, 5, -24, 18, -5, 3, 8, -30, -11, + -11, -28, -6, 12, 13, -14, 6, 2, -20, -22, + 24, -19, -6, -10, -7, -11, -25, -7, 19, 16, + -10, 0, -2, -10, 19, -25, 8, -4, 14, -10, + -22, 9, -21, 20, 18, -11, -2, -3, 7, -10, + -47, -8, -9, -47, -29, -1, -25, -27, 26, 12, + -29, -32, 17, -10, -28, 22, -14, 9, -4, -34, + -10, -15, 2, 13, 6, -16, -12, 11, -10, 29, + -36, -18, 17, -18, 3, 43, -15, 27, -23, 35, + 4, 4, -23, -15, -18, -13, 44, 17, -32, -15, + -2, 8, 20, 21, 36, -22, -14, 22, -10, -18, + 9, -10, -1, 5, -4, 16, 2, 7, -17, 11, + -3, -22, -3, -7, -26, -24, 8, -20, -2, -14, + 18, -25, -14, -32, 15, -37, 19, -13, 11, 0, + 10, -9, 19, 16, 7, 18, 7, 25, -21, -26, + -49, 28, 25, -23, 25, -15, -28, -24, 26, -24, + -9, -23, -21, 34, 5, 8, 9, 2, 11, -17, + -16, 42, -6, -4, -4, -10, -5, 18, 20, 23, + -23, 12, -23, -6, -23, 6, -5, -21, -10, -8, + 0, -29, 24, 26, -21, -26, -27, -41, -23, 4, + -18, 17, 8, -15, 8, 33, 0, -5, 14, 27, + -13, 23, -11, 16, -24, -31, -14, -10, 11, -14, + 1, 11, 13, -13, -5, -3, 16, -19, 6, -7, + 15, -23, 17, 1, -27, -11, 4, -3, -34, 3, + -6, 26, 11, 26, 8, 33, 19, -12, 2, -12, + 8, 5, -24, 17, 7, 5, 13, -2, -15, 6, + -1, -21, 11, -21, -24, 2, 12, 22, -25, 2, + 31, 1, 5, 6, 13, -20, 1, 1, 24, -24, + 9, 1, -17, -26, 1, -1, -19, -27, -8, 13, + 23, 0, -1, -2, 9, -29, 11, 18, -25, -4, + -17, 1, 11, -28, 13, 6, 23, -44, -8, -13, + -18, 16, 6, -24, 17, 20, -4, 18, -17, -24, + 2, -20, -25, -32, 4, 14, -1, 22, -22, -32, + 4, 5, -32, 5, -29, -20, -9, 21, 10, -27, + 20, 4, 14, -20, -27, -19, 6, 2, 5, 5, + 20, 16, 2, 31, 6, 3, -2, -11, 24, 15, + 4, -21, -17, -29, 19, 21, -15, -31, -3, -35, + 3, -33, 15, -42, -7, 7, -7, 15, -11, 4, + 7, 33, -15, -30, -34, -36, 8, -32, 23, -13, + 0, 0, -4, 22, 9, 9, -7, -8, 23, 19, + -10, -2, -28, 12, 6, -21, -10, 13, -14, -15, + 10, -17, 31, 33, 12, 3, -14, 23, 6, 19, + -17, 8, 5, -9, -6, -29, 6, -3, 23, -3, + 13, -2, -15, -13, -3, -19, 3, 2, 14, -25, + -15, -11, -16, -27, 18, 19, -11, 0, -18, -13, + -15, 45, 3, 9, 11, -24, 9, 13, 10, 0, + 12, 7, -30, 2, -43, -26, 25, -24, -14, 30, + -23, -2, 1, 19, 0, 15, -18, 10, 8, -15, + 4, 21, -15, 10, -3, -14, 12, -25, -14, -15, + -26, 15, 5, 2, 2, 22, 15, -20, -10, -12, + -5, -20, 5, -15, 13, -22, -22, 0, 23, 20, + 14, 29, -7, 4, 17, -7, 23, -19, 22, -18, + -1, -27, 10, -23, 0, -19, 16, -16, 27, 3, + -10, -9, -8, -24, 15, -1, 6, 21, 23, 24, + 7, -7, 7, 0, -19, 21, -30, 16, -23, 5, + -10, 27, 7, -12, -26, 4, 2, -4, 21, 14, + 12, 10, 34, -17, -14, -26, -2, 1, -17, -7, + -9, -21, -4, -33, -11, -9, -22, 26, -13, 9, + -29, -4, 12, -21, -8, -42, 16, -28, -39, -8, + 4, -10, -13, -15, 15, 1, 17, 8, 5, -3, + -16, 4, -3, 2, -11, 11, -18, 32, -9, -19, + -26, -11, -2, 5, 12, -24, 19, 13, 15, 14, + -11, 6, -33, -18, -4, 10, 5, 31, -8, -7, + -18, -23, 1, -46, -1, 7, 2, 25, -12, 15, + 9, 32, 7, 36, 8, -12, -1, 24, 31, 8, + -28, -28, -12, 32, -4, -27, -13, 28, -2, 0, + -25, 28, 10, 13, 8, 6, -9, -4, -2, 5, + -22, -13, -17, -3, 29, 13, 2, 2, -8, 20, + 26, -4, -2, -21, -5, -19, 21, 13, -8, -19, + -17, 9, 12, 5, 28, 27, 23, -31, 6, -13, + -3, -14, -14, -14, 14, -3, -21, 10, -11, 14, + 6, -12, -12, 18, 7, -8, -5, -16, -20, -15, + 27, -14, 18, -11, 39, 22, 11, -13, 1, 27, + 31, -17, 3, -22, 14, 6, -7, -1, -20, 17, + 7, -3, 2, -7, 8, 28, 16, -36, 15, -23, + 13, -25, -14, -25, -14, -4, 25, -28, 15, -7, + 17, 23, -28, 25, 7, -2, -21, -18, -7, 11, + -12, 7, 17, -2, 25, -36, -33, -2, 28, 22, + 18, 30, -13, -4, -2, -29, 3, -25, 14, -37, + 21, -15, 34, -5, -8, -18, -24, 31, 34, 9, + 13, 13, -14, 29, -7, 37, 0, -3, -15, 14, + 27, -16, -3, 13, -34, 11, -9, -20, -8, -11, + -30, -29, 18, -11, -17, -17, -18, -10, 10, 1, + -22, -2, -16, 5, 34, 19, 3, -23, -29, 12, + 7, -4, -5, -26, 20, -24, 17, -30, 12, 24, + 21, 4, 4, 31, 30, -5, 6, -3, 11, -24, + -8, -31, 38, -3, 26, -8, -28, -13, 33, -3, + -23, 33, 16, 1, 11, -19, -34, -26, 20, -19, + 7, -19, -14, 32, -14, -23, -10, 22, 2, -14, + -23, -15, -29, 11, 20, -30, 16, -16, -25, -8, + 9, -18, 24, -3, -23, 28, -5, -28, -28, 30, + -14, -14, -9, 3, -24, 19, -5, -6, 1, 6, + -5, -19, 5, -3, -31, 0, -17, 20, 4, 23, + -21, 23, -37, 13, -12, 6, 7, -25, -2, 13, + -15, 1, -2, 1, 20, -17, -15, 7, 13, -13, + -33, 11, -35, 18, 5, -18, 2, 7, -15, 5, + -37, -32, 25, 0, -10, -31, 0, 41, 27, 2, + -45, 5, -26, -16, -2, 2, -10, 24, -30, 35, + -10, -24, 8, 38, 7, -9, 2, -14, 9, 15, + -14, -10, 16, 8, -31, 26, -5, 1, 5, 4, + -42, 0, 18, 17, -28, 8, -1, 11, -22, -5, + 19, 29, 13, -17, 16, -7, -14, 23, -28, 15, + -37, -18, 5, 2, 3, -20, -4, 3, 19, 41, + 53, -14, 3, 26, -15, -7, 6, 19, -21, 28, + 45, -5, -19, -4, -11, 22, 27, 36, 10, -36, + -1, 25, -13, -6, -16, -12, -16, 1, -15, 23, + 27, 22, 1, -9, -28, 37, 25, -12, 0, 31, + -7, 7, -4, -48, -13, -11, -1, 22, 16, 3, + 12, 20, 12, 6, -13, 14, -4, 31, -6, -29, + -30, -33, -5, -45, 0, 14, 11, -38, -4, 17, + 13, 4, -24, -13, -20, 50, -2, -2, 18, 0, + 1, -7, 12, -7, 24, -11, -13, 6, 4, -14, + -9, 9, -4, -22, -2, -29, -13, 5, 33, 6, + 15, 28, 22, 14, -15, -25, -33, 10, 2, 24, + -23, -9, 3, 31, -25, -19, 29, -10, -12, -25, + 24, -30, 26, 28, 18, 6, 5, -9, 19, 32, + 14, -23, 30, 3, -47, -58, -3, -41, 11, -11, + 2, 5, 5, 10, -11, 3, 22, -15, 28, 13, + 10, -38, -21, -8, -2, -49, 21, -32, -10, -16, + -16, 16, 7, -15, 23, -13, 8, 14, 17, -19, + 7, -17, 1, -42, -5, 2, 21, -9, 15, 12, + -2, 14, -11, 8, -2, 6, 12, 21, 36, -12, + 16, 18, -5, 23, -21, 22, -25, 2, -23, -8, + 9, -2, -42, -44, -30, 2, -3, 15, -20, 31, + 1, 19, 22, 4, -9, -56, -9, -13, -16, 23, + 34, 18, 2, -17, -37, 31, -21, -17, 36, 7, + 5, 10, 20, -7, -11, 4, -21, 14, 16, 15, + 3, 5, -2, 4, -29, -29, 30, 7, -2, -16, + -19, -23, 1, -11, 1, -1, 13, -11, 2, 18, + 26, 20, 48, -10, 5, 0, 2, 3, 16, 4, + 23, 28, 19, 5, -8, 3, -17, -15, 22, 22, + 24, -24, -17, 2, -9, 2, 30, 22, -21, 6, + 15, 3, -7, 4, -12, -18, 15, -23, 4, 3, + -10, 16, -52, -13, -13, -8, 13, -15, 9, -24, + 14, 21, 36, 17, 9, 26, -13, -25, -27, -12, + -18, 11, -7, -19, 21, -19, 24, -29, 23, 20, + 28, -6, -21, -5, -34, -1, -27, 18, 10, 15, + -10, 19, -24, -17, -21, 11, 3, -15, 21, 2, + -32, -8, 12, -2, -20, -10, 25, 10, 1, 18, + 10, -7, -14, -7, -8, 3, -5, 23, -9, 11, + -13, -1, 16, -10, -17, 15, -9, 21, 20, 3, + -24, 14, -35, -30, -27, 7, -18, -37, -8, -34, + 5, -14, 10, 12, 21, 2, -33, -7, -4, -4, + -7, 9, 2, 0, -14, -26, -2, -22, 26, -3, + 28, -3, -28, 6, -12, -9, 6, 9, 9, -12, + -21, -6, -4, -32, 5, -17, 0, -21, 4, -3, + -20, -25, -13, -12, -7, -5, 12, -25, -16, -20, + 4, 2, 23, 7, 9, 25, 5, -5, 8, 21, + 25, -25, -1, -19, 4, 23, -30, -37, 2, -7, + -11, -10, -15, -26, -2, 11, -14, 25, 3, 32, + 15, 12, 37, -21, 1, 31, 3, 23, 15, -13, + -21, 5, 1, -28, -6, 16, -14, 26, 27, 26, + 20, 17, 15, 3, 0, 7, 28, 17, -9, 4, + 27, -31, 11, 12, -2, 4, 12, -25, 16, 21, + 3, 26, 11, 8, -1, 16, 10, -18, 11, -8, + -2, -3, -9, -34, 12, -21, 33, 4, 10, 12, + -18, -18, 19, 28, 6, 8, 7, 16, -5, -15, + -14, -15, -12, -15, -17, -6, -9, 20, -8, 17, + 24, -6, 1, -8, -4, -11, 10, -25, -5, -26, + 2, -32, -26, 30, -4, -8, -3, -21, 37, 32, + 7, 9, -18, -17, -2, -29, -22, -15, -11, -6, + 0, 10, -3, -4, 33, -10, -10, 1, 2, -8, + 13, -14, -10, -6, -15, -11, 3, 5, -13, -30, + -7, 18, -3, 29, -8, 15, -8, 3, 31, -19, + -16, 16, 16, 5, 8, -15, 14, 23, 24, 7, + 5, 11, -10, 12, 11, -20, -10, -35, -4, 19, + 25, 14, 14, 31, -26, 13, 0, 13, -12, -20, + 12, 19, -25, -32, -25, 8, -14, 34, 6, -3, + -33, 16, 25, 20, 19, -17, -31, 3, -25, -8, + -12, 21, 13, 35, -15, -5, -13, 8, 13, -6, + 7, 9, -30, 1, -11, -37, -14, 28, 11, -24, + -24, 12, -19, 22, -6, -12, 26, -31, -37, -9, + 8, -6, 0, 14, 13, -5, 8, 3, 17, -31, + 27, -9, 29, 7, 1, -10, -7, -8, 19, 7, + -6, 3, -21, 28, -11, 22, -10, 4, 0, -23, + 3, -3, -15, 6, -10, 35, 13, 38, 24, 11, + -20, 33, 6, 7, -8, 18, 1, -4, -23, -11, + 23, -12, 24, 32, -6, -16, -28, 8, 28, 30, + -10, 23, 3, -33, -30, -22, -3, -12, -12, -8, + -16, -12, -28, -33, 4, -26, 14, -14, 13, -3, + -6, -8, 0, -12, -23, -1, -9, 12, 16, -17, + 2, -7, -12, 7, -27, 11, 14, 25, -25, 16, + -8, -6, -9, 10, 17, 0, -10, -21, 23, -39, + 8, 25, 28, -3, 0, -17, -14, 8, 23, -10, + -6, -15, -13, -9, 19, 22, -43, 19, 26, 10, + -15, 6, 11, -10, 5, -22, 19, -10, -6, 10, + 8, -25, -2, -14, 17, -11, -25, -24, -23, -18, + -26, 0, 10, 20, 12, 20, -33, 14, 6, -4, + 26, -11, -6, 0, -4, -9, -15, 19, -26, 17, + -5, -18, 18, -21, -2, 7, 2, 4, 13, 2, + -13, 27, -20, 18, 6, -11, -6, 1, 3, 15, + 2, 33, -2, 9, -22, -26, 6, 3, 10, 18, + 11, -7, 3, -1, -7, 21, -17, -9, -13, -8, + 5, 12, 15, 8, -17, 24, -20, -15, -8, 15, + 1, -8, -30, 29, 9, 2, -17, 34, 0, 11, + -14, 10, 26, -14, 5, -19, -21, 5, -22, -1, + -32, -33, -11, -16, 12, -17, -24, -7, -40, 0, + -25, -36, 27, 20, -6, -18, -10, -15, 7, -3, + 11, 8, -14, -23, -19, 10, 26, -3, 21, -19, + 10, 12, 33, 16, 3, 15, -1, -5, 16, 10, + -17, 22, 5, 4, 11, -10, 4, -10, -14, -15, + -10, 13, -1, 11, -27, -9, 2, 7, 13, 1, + 11, 3, 20, 24, -25, -15, 18, -17, 21, 3, + 15, 4, -9, -24, 25, 14, 8, 0, 15, 31, + -12, -10, 4, 8, -8, 0, 2, -6, 5, -33, + -1, -22, 15, 12, -1, -1, 9, -13, -1, 3, + -15, 10, 5, -7, 5, -15, -9, -20, -3, -16, + -30, 15, 28, 11, -26, -3, 12, -17, -5, 25, + -5, 6, -7, 23, -38, -6, 6, -23, 4, -41, + -25, 13, -7, -24, 19, -34, -16, 26, 27, -11, + -16, -24, 33, -12, -5, -15, -12, -9, 17, -11, + -30, -23, 3, -5, 22, 34, 11, -34, -2, 0, + -11, -15, -18, 4, 0, 12, -11, 6, 15, 12, + -44, -10, 10, 33, 5, 7, 23, -10, -11, 22, + 19, -10, 21, 4, 16, 20, -35, 7, 19, -13, + -7, -1, -28, -31, -35, -12, 13, -14, -21, 20, + 16, 21, 22, 5, 6, 15, -21, -25, -9, -34, + 10, -7, -19, -10, -24, -1, -5, 6, -14, 14, + 3, 23, 1, -32, 32, 18, -22, 9, 24, 30, + -27, 31, 8, -14, -3, -14, -19, -1, 10, -14, + -10, -19, -30, 10, -25, -7, 6, 14, -24, 18, + 9, 13, 6, 21, 32, 19, -5, -18, -20, -31, + -28, -1, 11, -5, -29, 6, 22, 5, -9, 34, + 12, 15, -30, 11, -18, 20, 13, 14, -31, 15, + -15, 0, 6, -14, 18, 9, -20, 34, 18, 10, + 13, 10, 3, -13, 18, -10, -23, 34, 9, 18, + 2, -16, 12, -12, -21, -17, -20, -19, 11, -19, + -45, -5, 6, 0, 11, 2, 16, -6, 31, -16, + 10, -6, 8, 17, 13, 0, -20, 15, -12, -4, + -23, 15, 19, 8, -3, 12, -1, -7, -17, -30, + 3, -21, 4, 22, 7, 10, -35, -31, -1, 0, + -23, -12, 13, 26, 22, -9, 23, 4, 0, 29, + 47, 31, -14, 19, 5, 14, 7, -10, 23, -22, + 1, -10, 18, -39, -1, -6, 26, -7, 11, -15, + -19, 10, -27, 3, -20, -27, -4, -23, -2, 24, + 18, -24, 5, -14, -9, -14, 33, -16, 27, -9, + -34, -48, 3, -10, 19, 23, -14, -58, -14, -43, + -11, -21, 5, 20, -25, -39, 7, -2, -23, -33, + -22, -27, -28, 7, -10, 0, -11, -29, -14, -17, + -7, 22, 13, -29, -5, 8, -21, -38, -14, 9, + 25, 14, 14, -4, -39, -8, -21, -18, 6, 41, + 8, 32, -1, 32, -9, 26, 0, 15, -10, -16, + 50, -23, 36, -12, 8, -35, 1, 9, 5, 9, + -20, -45, -28, -27, -6, -31, 5, 8, -12, 7, + 20, -2, 19, 15, 7, -23, 1, 3, 21, 7, + 0, 28, 6, 20, 26, -13, -30, -19, -16, -20, + 40, 21, 2, -26, 6, -43, 25, -10, -11, -15, + -36, -23, -1, 31, 16, -34, -7, -14, 12, 0, + 4, -13, -29, -2, 8, 23, 23, -8, 12, -3, + -23, -13, -21, -12, 6, -12, -11, 18, 3, -13, + -35, 9, -8, -4, 24, 19, -7, -23, -26, 25, + 20, -3, 29, 10, 3, 20, 3, -6, -22, -2, + -29, 9, -9, -21, -27, -5, -23, 6, 0, -6, + -33, 13, 19, -32, 5, 35, 9, 17, -22, 2, + -3, -2, 20, -1, 23, 2, -11, 37, 35, 29, + -43, -18, 22, -12, -10, 17, 12, -7, 23, -4, + -32, 0, 1, -14, -11, -11, -10, -29, -41, -9, + 14, 21, -25, -19, 24, 15, 6, 6, -8, -7, + -25, -25, 22, -24, 15, 35, -14, -13, -27, -13, + 31, -38, 11, 14, -35, 0, -13, -9, -3, 7, + 13, 16, 23, -21, -22, -20, -17, -12, -26, -20, + 19, -22, -20, -27, 21, 28, 0, -19, -1, 2, + -29, -12, -26, -43, -21, -9, 22, -11, -2, 0, + -25, -8, -16, -36, -3, -18, 13, -3, -18, 10, + 25, 31, 22, -11, 21, -27, -12, -22, 13, 19, + 7, -11, 21, 20, -14, -30, -9, 13, -2, -23, + 28, 33, 1, 26, 20, 6, 21, -16, 1, -1, + 22, 29, -2, -25, 8, 7, -13, -16, -8, 6, + 15, -21, 25, 5, 5, 17, -9, 4, 5, 28, + -16, 5, 0, -11, 20, -12, -13, 9, 19, -14, + -11, -39, 1, -24, -13, -19, -10, -21, -36, 19, + -24, 44, 21, 32, -6, -33, -7, -26, -25, -26, + -12, -5, 10, 1, 12, -7, -41, -32, -26, 16, + -35, -3, -2, 21, -15, 24, -2, 4, -4, 11, + 27, 18, 8, -17, -11, -12, 7, 9, 30, -9, + 21, -16, -20, -31, -18, 17, -14, -24, 8, -27, + 9, -28, 23, 25, -11, -6, -12, 7, 4, 6, + -17, 14, -13, 16, 13, -9, 2, -13, -8, -27, + 16, 2, 23, 9, -3, 11, -18, 20, 6, -25, + 9, -7, 15, 0, -9, 37, 19, 1, -7, -10, + -15, 24, 45, 39, 8, 15, -19, 12, 31, -35, + -10, -10, 18, 9, 10, 2, -21, 31, 10, 17, + -1, -11, -39, 30, 22, -7, -15, -34, 9, -4, + 15, 10, 2, 12, 7, 0, 28, -16, -5, 20, + 56, -11, 20, -20, -22, -6, 32, 6, -21, 15, + -9, -11, -9, -17, 7, 12, 23, 15, 14, 10, + 2, 3, -1, 6, -12, -5, -17, -2, -22, -1, + 8, -1, 11, 25, 33, 8, 10, 15, 12, 14, + 20, -30, 16, 32, 29, 13, 15, 20, -7, 15, + 4, -15, 13, 24, 10, 17, -3, -22, -6, -19, + 7, -5, -8, 28, -2, 10, -11, 22, -12, -29, + -4, -9, -12, 22, 25, -2, -7, 2, -12, -17, + 6, 5, 20, 3, 14, 3, 20, -3, -7, -5, + 24, 17, 34, 12, -7, -12, 18, -1, -2, -5, + -31, -25, 13, -28, 25, 22, 16, -16, 18, -14, + -31, -27, 14, 21, -19, -17, 5, 21, 12, -8, + 6, 3, -29, 6, -20, 10, 3, -16, 6, 10, + -2, -29, -38, -31, -2, 17, -4, 11, 3, 16, + -23, 3, 13, -1, -29, -20, -16, -2, 33, 11, + -23, 34, -11, -9, 3, -36, -4, 13, 5, -9, + 10, 18, 2, -29, -30, -18, 36, 15, 30, 5, + -20, 28, 20, 11, -12, 3, 24, -7, 28, 3, + -18, -2, -5, -13, -2, -21, 9, -1, 31, -7, + -31, 24, 5, -2, -8, 18, -21, 2, 16, 19, + -10, -11, -7, 24, 19, -1, -2, 19, 14, -29, + -28, 3, -4, -18, -4, -20, 19, 9, -22, 30, + -5, -7, -6, 15, -10, -7, 0, 3, 2, -10, + 30, 17, -10, 3, -18, 12, 10, -16, -44, 14, + -7, 9, 20, -15, 25, 26, -18, 20, -1, -10, + -26, -18, -22, -5, -32, 4, -11, -18, -23, -21, + -24, -18, 36, 20, 6, -12, -16, 10, 10, -15, + 17, -23, 1, 2, 23, -33, 19, 4, -3, 7, + -5, 3, -15, 12, -1, 20, -25, 37, 12, 25, + 49, -7, -3, 14, 7, -4, -2, 5, 35, -4, + 14, -21, 15, 16, 17, -19, -12, -27, -6, 7, + 2, 14, 12, -1, 20, 7, -14, -49, 5, -44, + -13, -6, 7, 9, -15, -24, 33, 29, -4, -3, + 7, 31, 25, 10, -12, 6, 2, 6, -11, -14, + 0, 9, 22, 6, -15, -23, 0, 17, -13, -6, + 7, -11, -9, -22, -1, 4, -34, 10, 10, 5, + -9, 24, -12, 23, -10, 21, -9, -5, -9, 21, + 26, -10, -23, -26, 2, -23, -16, -5, 6, 23, + 6, 12, -28, -5, -19, -6, -19, -16, -1, -21, + 17, 20, -20, -23, 17, -19, 11, 0, 15, -11, + 19, 2, 29, -32, -29, 30, 18, 0, 0, -24, + -41, 7, -20, -17, -32, 35, -13, 25, -4, -14, + -11, 4, 11, 20, 1, 17, 10, 22, 17, -9, + -8, 15, -12, 22, -4, -29, 22, 5, -21, 8, + -22, -10, 4, -16, -26, -11, 11, 37, 11, -29, + 23, -9, -8, 5, 1, -26, 13, 2, 13, 10, + 2, -28, 16, 8, -2, -29, -5, 7, -9, -20, + 6, -33, -12, -6, -1, 10, 23, 15, 25, 5, + -23, 13, 20, -2, 31, -15, 6, 9, 9, -26, + -1, -16, -33, 0, -22, 23, -3, -44, -2, 7, + 12, -21, -17, 17, 1, 27, 0, -22, 19, -18, + 18, -19, -6, -22, -16, 2, -14, 31, 20, -17, + -27, -6, 23, -34, -14, -37, 17, 17, 23, -21, + -42, 3, -5, 18, -6, -24, -37, -19, 25, 20, + 19, -5, -2, -3, -12, 5, -1, 15, -11, -7, + 14, 15, 22, -16, 22, 34, -8, 5, -11, 4, + -29, -10, -4, -22, -34, 26, -33, 1, -21, -36, + 11, 2, -13, -2, 9, -48, -20, 16, -10, 1, + 14, -21, -17, -14, 6, -22, 24, 25, 11, -3, + 2, -17, -26, 3, 14, 7, 11, -1, -9, 3, + -42, -35, 31, -5, 1, 19, -30, -32, -4, 5, + 5, 9, -31, 4, -17, 2, -9, -15, 2, 16, + -27, 19, -35, -22, 37, 4, -17, -34, -40, -14, + -5, -13, 0, 18, -5, 28, 18, -24, 17, 0, + 9, -13, -2, -22, 22, 24, -8, -41, 8, 10, + 9, -35, 34, -16, -1, -22, 28, -4, 1, -14, + -16, -29, 10, -6, 14, 15, 0, -22, -21, -31, + 14, -23, 10, 10, 35, 5, 6, 27, -1, 2, + 1, 29, -13, 11, -16, 27, 13, 7, -11, -18, + -3, -6, -7, 9, 11, 6, -21, -1, 32, 11, + 5, 2, 33, -39, -35, -2, 27, -15, -18, 14, + 29, -2, 29, 9, -15, -30, 15, 14, -12, 24, + -4, -4, 0, -15, -10, -5, -14, 4, 23, 8, + -14, 13, -1, 1, 5, -5, -9, 11, -25, -24, + 10, 42, -24, -24, -4, 24, 25, 1, -20, -1, + 6, -24, 12, 26, -23, 5, -4, 22, 14, -2, + 3, -2, 12, -9, -7, -27, 22, 21, 7, -1, + 33, 1, 1, 17, -17, -21, 4, -11, 26, 23, + -13, -5, -4, 0, 16, -4, -11, 33, 7, -22, + 9, 10, 23, 28, 36, -1, 4, -29, -41, -20, + 31, -25, 21, 47, -23, -31, 8, 18, 22, 13, + 19, 19, 8, 20, 22, -24, 20, -13, 13, -3, + -10, -7, -29, 10, 30, -5, -2, -5, -33, 14, + -13, -30, 10, -4, -16, -32, -22, -12, -33, 9, + 2, 2, -17, -14, 12, 3, 9, 18, -25, 0, + 15, 0, -38, -15, 10, 5, 0, -11, 14, -25, + -13, 11, -1, 15, 33, -11, 4, 10, -15, 1, + 5, -5, 6, 1, 25, -14, -32, -6, 1, 26, + -16, 7, 14, 34, -32, -25, 9, -12, 19, 29, + 27, 10, 9, -31, -15, 24, -25, -33, 15, 15, + -27, -24, 22, -37, 5, 3, -17, -8, -8, 9, + -10, -22, -16, 1, 20, 29, 3, -20, 2, -5, + -36, -11, 19, 7, 24, 2, 15, 9, -19, 11, + 23, -17, 13, 0, -3, 32, 14, 7, 15, 4, + 20, 5, 0, 20, 0, 20, 30, -11, 13, -14, + -21, -10, 20, 33, -17, -6, 0, -8, 31, -7, + -26, -27, 32, 9, 10, 29, -9, -19, 13, -7, + -24, 17, -3, 28, 10, -19, 12, 7, 4, 5, + 34, -3, -16, -17, -14, 4, 1, 26, +}; +const ALIGN(8) int32_t tensor_data50[384] = { + 432050, 903105, 800627, 266727, 402336, 46636, 728334, 291791, 1161296, 1161296, + 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 226858, 357960, -169137, 589616, + 337835, 844218, 863817, 637807, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, + 1161296, 1161296, 263092, 393427, 119046, 483306, 220949, 110510, 330710, 279594, + 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 218946, 160100, + 62754, 55640, 408132, 265291, 316503, -121037, 1161296, 1161296, 1161296, 1161296, + 1161296, 1161296, 1161296, 1161296, -144240, 541778, 306893, 122209, 372128, -170166, + 468471, 624659, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, + 509029, 816341, 779364, -84394, 251331, 1023617, 656068, -37230, 1161296, 1161296, + 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 257483, 656170, 267806, 624629, + 607848, 1029501, 544623, 520681, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, + 1161296, 1161296, 185909, 866430, 703600, 228388, 272521, 107524, 392283, 279281, + 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 318499, 60030, + 110109, 36774, 161003, 47774, 127417, -79245, 1161296, 1161296, 1161296, 1161296, + 1161296, 1161296, 1161296, 1161296, 169713, 206567, 8981, 174011, 250611, 259596, + 149958, 175284, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, + 139044, 110407, 84779, 337827, 305594, 192419, 76986, 89842, 1161296, 1161296, + 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 120957, 286234, 334268, 128317, + 152268, 257594, 80889, 383085, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, + 1161296, 1161296, 189961, 306426, -64711, 86262, 170070, 172426, 7812, 138108, + 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 60095, 472495, + 122013, 144800, -51491, 200885, 266604, 172069, 1161296, 1161296, 1161296, 1161296, + 1161296, 1161296, 1161296, 1161296, 232149, 246716, 142559, 289816, 60225, 228226, + 94671, 50424, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, + 286083, 435482, 112225, 87789, 104160, 147734, 251299, 396699, 1161296, 1161296, + 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, -116249, -55607, 101265, 280907, + -233740, -17829, -117539, -10168, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, + 1161296, 1161296, 75052, -162941, 175557, 69029, 171451, -139124, -121163, 51937, + 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 195206, 20034, + -53621, -119699, -289327, -117536, -82489, 115852, 1161296, 1161296, 1161296, 1161296, + 1161296, 1161296, 1161296, 1161296, 69081, -287035, 269251, -241164, -199143, -57808, + -84169, 34036, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, + 193455, -196930, -84533, 27068, 43842, -40972, -44528, -160825, 1161296, 1161296, + 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, -60783, 24885, -291792, -65059, + -183403, -217737, -111020, -64900, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, + 1161296, 1161296, 41956, 4236, 200904, -97033, 85909, 129244, 32046, 236815, + 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, 1161296, -129378, -70221, + -60528, 95994, 111042, 155648, 15468, 67530, 1161296, 1161296, 1161296, 1161296, + 1161296, 1161296, 1161296, 1161296, +}; +const ALIGN(8) int8_t tensor_data51[12288] = { + -23, 11, -20, -12, 9, 3, 1, 12, 0, 27, + -19, 15, -13, -24, -1, -22, -39, 2, -38, -23, + 19, -12, 5, -15, 0, 44, -27, -11, -44, -24, + 18, -4, 12, 0, -21, 3, 14, 14, -24, -6, + 32, 1, -42, -7, -55, 0, 32, -15, -39, -6, + -19, -1, -3, -4, -14, 7, 9, -1, 0, 5, + -32, -10, -21, -12, -68, -6, -12, 11, 73, -13, + 30, 16, 8, -45, 7, 69, -5, 14, 3, 45, + 16, 23, 18, -16, 0, -5, -4, 11, 10, -5, + -6, -10, -16, 1, 17, -6, -45, -20, -7, -27, + 15, -39, -7, 18, 28, -77, 0, 19, -12, -1, + 9, 5, -9, -17, -6, -29, 58, 29, -8, 23, + 26, -82, -3, -2, -29, -5, -1, -1, -45, -63, + -47, 2, 27, -2, 31, 127, 18, -16, -2, 21, + -10, 27, 6, 34, -31, 1, -15, -6, 19, -13, + -37, 12, 15, 3, -3, 15, -3, 13, 0, 4, + 57, 0, -31, -18, 31, 64, -23, 4, 22, -15, + -33, 2, -40, 17, 64, -41, -31, -7, -18, -13, + -46, 31, -10, 18, 2, 11, 8, 18, 9, -27, + -23, 3, 18, 1, -32, 1, 19, 28, -26, 9, + 11, -14, -21, -8, -32, 2, 46, -20, 4, 5, + 33, -5, 7, 25, 26, 0, 10, 30, -16, -41, + 3, -4, 6, 38, 32, 10, -33, -2, -24, 20, + 14, 22, 23, -9, -1, -35, -23, 8, 10, -3, + 19, 16, -42, -23, -4, -46, -9, -1, 20, 49, + -18, 10, -19, -36, 37, -26, -3, 2, -57, 16, + -6, -16, -12, -3, 9, -4, 3, -4, -18, 1, + 37, 20, -7, 0, -55, -5, 26, -28, -55, -30, + 13, -40, -10, 7, 13, -1, -20, 33, 14, 22, + -13, 31, -13, -11, 13, 21, 0, -22, -3, -34, + -19, 19, 26, 3, 26, 25, -30, 3, -13, -25, + -36, 17, 20, -50, 10, -7, -28, 25, 38, -23, + 39, 13, 0, 11, 37, 40, -22, 1, 93, 12, + 0, -35, -22, 3, -41, -1, 27, 14, 2, 9, + 11, -9, -21, 21, -11, -7, 19, 3, 2, 17, + 15, -24, 7, 1, 0, 6, 16, 55, 17, -1, + 23, 56, 15, -19, 4, 15, -38, -54, 8, -9, + -1, 9, -10, 10, -10, -4, 26, 13, 14, -52, + -34, 0, -17, -1, 39, 24, 4, 8, 42, 19, + -46, -43, 7, -4, -75, -26, 4, -10, -29, 3, + -11, 22, 8, 2, 16, -11, -27, -1, 4, -2, + 2, -22, -4, 6, -21, 6, -21, 19, -16, 28, + 23, 14, -31, 1, -43, -13, -9, -10, -1, -8, + -2, 9, -9, 1, -7, -11, 16, -27, -6, 0, + -32, -28, -46, 1, 19, -25, -20, 26, 14, 17, + -16, 30, -6, -9, -10, 26, -17, -23, 13, -11, + -14, 3, 0, -5, -12, 1, -18, -9, -40, -32, + -22, -22, 19, -38, -7, 25, -9, 23, 53, 5, + 21, 7, -33, 25, -17, -10, -11, 7, -3, -3, + -14, -14, -12, -4, -3, 7, -2, 3, -36, 21, + 10, -21, -13, 14, -11, -52, 16, 17, -15, -14, + -17, 24, -7, 12, -13, -1, -4, -15, -18, -22, + -15, 26, -9, -15, 13, 9, -6, -9, -11, -42, + 29, -7, -8, -40, 8, 1, -2, 21, -24, -6, + 18, 9, -4, -27, 9, -11, 8, -24, -29, -28, + -12, -16, -45, 2, -41, -26, 4, 3, -10, -16, + 20, -3, 29, -32, -30, -20, -19, -2, -18, 18, + -12, -23, 28, 4, -16, -19, 4, -58, -2, -35, + 1, -20, -13, 47, -30, 23, 5, 7, 5, 59, + 34, -1, 10, -53, 11, -21, 12, -6, -25, -28, + -22, 4, 1, -43, 31, -14, -26, 2, 18, -25, + 6, -16, -2, -36, -28, -3, -55, 34, -3, -11, + -8, 5, 24, -15, 3, -33, 24, -29, 2, -3, + 13, -9, -43, 21, -10, 1, 14, 46, -10, -8, + 7, -40, 6, -25, 2, -14, -5, 5, -41, 52, + 1, -16, -64, 20, 6, 9, 9, -26, 22, 0, + -13, -14, -10, -33, -18, 29, 7, -25, -11, -15, + -6, -19, 15, -31, 35, 16, -8, -30, -10, -20, + -12, 38, -26, -15, -31, 1, 6, -19, -45, -41, + -13, 27, 2, -3, -7, -32, -5, 6, 5, -12, + -11, -5, -9, 8, 37, -15, 27, -11, -40, -17, + -20, -35, -6, 20, -25, -43, -7, -13, -31, -11, + 1, 37, 7, -13, -34, -13, 0, 31, -13, 24, + -4, 16, 14, -12, 36, -5, 15, -16, 11, 7, + -22, -7, 20, -43, -13, 2, -40, -19, -31, -8, + -27, -3, 5, -15, 2, -2, -6, -16, -5, -18, + -3, 2, -9, -2, 19, 25, -22, 12, 9, -10, + 34, 12, 3, 14, 12, 4, 2, 0, -5, 11, + 17, 22, -10, 4, 66, 7, -2, 10, -32, 6, + 15, -62, 16, -18, 49, 27, -24, -41, -26, -7, + -7, 0, -2, 32, -22, 9, 15, -44, 31, -19, + 20, 26, -15, 35, -4, 22, 5, 19, 31, 15, + -15, -7, 7, -39, 25, -29, 27, 30, 28, 20, + 7, 20, 87, 19, 5, 14, 0, 75, 3, 14, + -4, 39, 3, -8, 61, 48, 50, 18, -3, 33, + -13, 20, -3, 26, 8, 18, 30, -28, 8, 9, + 23, 0, 36, 12, 10, -4, -32, 13, 2, 12, + 23, 20, 11, -7, 13, 1, 62, 35, 40, -12, + -16, 9, -36, 7, -16, 53, 8, 20, 7, 8, + -9, 11, 25, 26, 39, 36, 74, 3, -100, -32, + 1, 58, 16, -16, 16, -15, -10, 6, 50, 62, + 46, 7, -12, 8, 4, 12, -12, 18, -16, -29, + 24, -22, 3, 14, 13, -15, 2, 9, 4, 6, + 2, 9, -22, 12, 5, -68, 30, -37, 8, 25, + -45, 23, -1, 19, -5, -1, 14, 7, 15, 28, + -5, -2, 22, 3, -18, 22, 11, -33, -30, -8, + 26, 6, -2, 27, -18, 6, -4, -21, 30, -21, + 30, 34, -39, -1, -8, 10, -87, 1, 11, 8, + -8, -23, 12, 23, 24, -7, 16, 11, -7, 10, + -14, 28, 12, 14, 16, 10, -22, -8, -15, -15, + 22, -16, 5, 23, -5, 8, 7, -3, 24, 29, + 26, 18, -19, -14, 20, -16, -10, 25, 17, 3, + -8, -8, -56, 14, -5, 19, 23, -30, 30, -14, + 22, 14, 9, 15, -4, -11, -30, -24, 23, 18, + -58, -21, -15, -26, 67, -15, 16, -18, 7, -25, + 19, 74, 1, 19, 5, 75, -11, -41, 28, -19, + 51, 18, -6, -13, 11, 6, 7, -43, -23, 12, + -8, 38, -15, -31, 54, -6, 37, 6, 15, 9, + 9, -82, -11, 47, -21, 5, -12, 12, -5, 1, + 13, -9, 18, -9, 29, -13, 9, -25, 20, -2, + 10, -13, -12, -29, 20, 2, 13, 11, -4, 11, + 4, 1, 9, -22, -25, -18, -12, -4, -25, -2, + -52, -2, 27, -6, 52, 52, -9, -8, -5, 9, + -2, -21, -11, -2, -5, 58, 5, 22, -31, -29, + 21, -71, -4, 20, 10, 10, -7, -19, -18, -27, + 39, -3, -5, -11, 0, 23, 10, 16, 2, 10, + 26, -16, -15, -31, -8, -11, -16, 4, 0, -5, + 27, -33, 2, 11, -25, 16, 22, -13, -10, -6, + -10, 3, 16, 17, -44, 6, 9, 2, 24, 34, + -24, 1, 22, -30, -14, 18, -39, -28, -3, -1, + -39, -15, 32, 11, -2, -29, 41, 8, 14, -18, + 2, 3, -25, 31, 4, 37, -30, 2, 13, -25, + 32, -21, -10, 3, 12, 8, -3, -16, -2, -10, + 38, 35, -26, -27, 19, -10, 67, -16, 6, 26, + 31, -34, -5, 28, -1, 13, 0, 32, 4, -51, + -16, -3, 34, 19, 6, -14, 30, -24, -3, -37, + -3, 11, -22, -12, -22, -15, -20, -26, 10, -8, + -21, -8, 14, 1, -12, 17, -11, -13, -3, -12, + 21, 16, -23, -5, -3, 23, -5, -3, -2, 4, + 7, -1, 5, 14, 25, -3, -6, 10, 20, 23, + 25, 20, -26, -13, 85, 15, 2, -16, -12, 14, + -57, -20, 30, 42, 4, 3, -39, 4, -33, -9, + 65, -7, 3, -5, -18, 53, 30, 17, 10, 11, + 14, -6, -9, 12, -39, -7, 59, 19, 8, -5, + -38, 26, 29, 4, -15, -1, -40, -1, -18, -34, + -13, -20, 52, -14, 2, -86, -30, -14, -17, 39, + 5, -4, -12, 13, 5, -1, 7, 10, 15, 0, + 29, -22, 4, 31, 23, -7, 34, 26, -26, -8, + -25, 10, 0, 12, 64, 8, -3, 10, -3, 27, + 28, -19, 7, 17, -16, 13, 9, -9, -14, -9, + -47, -29, 4, 3, 5, -12, -6, 30, 25, 23, + -22, 4, -31, -11, -27, 27, 36, -20, 2, -29, + 5, 31, 28, -20, 34, 32, 4, 40, 18, 32, + 23, 32, 1, -10, 27, -5, -14, 20, 21, -24, + -17, -27, -1, -16, -3, -15, -9, -4, 30, -14, + -10, 21, -3, 3, 16, -14, 21, 0, 44, 9, + 50, 48, 53, 33, 42, 32, 4, 13, -18, 5, + -27, -15, 14, 14, -29, 13, -4, 7, -17, 7, + 2, 12, -14, 6, -5, 5, 20, -34, 33, 8, + 80, -1, 0, 19, -25, 10, 55, 31, 4, -33, + -8, 14, 3, 3, 24, 26, -55, -2, -44, -17, + -58, -37, 6, -32, -24, -15, 15, -21, 36, 37, + -25, 4, -16, -14, -9, -22, -39, -37, -11, -11, + -7, -4, -11, -2, 14, 4, -10, 21, 18, -27, + -29, -14, -22, -15, 11, -3, -10, 0, 21, 1, + 8, -11, -12, -38, -39, -35, 17, -4, -18, 41, + -17, 1, 23, -12, -3, 39, 8, 1, 6, 53, + 3, -38, -3, -3, -4, 19, -24, 13, -1, -22, + -4, 22, 6, -7, -1, -2, -10, -67, -7, -32, + 10, 21, -53, 24, 4, -23, -41, 94, 4, -11, + -55, -64, -9, -11, 14, 36, -23, 9, -28, 25, + 3, 6, -35, 49, -57, -13, 1, -14, -5, -34, + 0, 6, 16, -14, -7, 8, -6, -12, -19, 15, + -16, 13, 1, 36, 10, -19, -7, -1, -3, 17, + -3, 30, -19, -7, 10, 26, 33, 2, 4, -12, + -3, -6, 4, -20, -7, -5, -14, 11, -8, -22, + 17, -8, -5, -7, 9, -12, 12, -6, -19, 11, + 16, 21, -19, 16, -29, -20, 19, 16, -19, -3, + 19, 42, 15, -21, -1, -27, -24, -19, -32, 26, + -19, -6, 2, -13, 8, 7, -31, -3, -5, 10, + -14, -4, -26, -7, -7, 1, -10, -6, -22, 10, + 0, -23, 12, -10, -1, -22, -4, -19, -17, 7, + -16, -1, -4, -6, 4, -2, 17, -4, 23, 6, + 6, -11, -25, -24, -11, 8, -11, 16, -19, -16, + -11, 5, 9, -15, 1, 21, 6, -24, -11, 8, + 6, 27, -23, 12, 0, 2, -6, 20, 8, -8, + -19, -38, -2, 3, -19, -6, 56, 5, -11, 8, + -3, 16, -55, 52, -4, -9, 1, -16, -16, -2, + -18, -16, 8, -42, 9, 6, -3, 24, -18, -2, + 16, -22, 0, 10, -10, 16, -8, -5, 9, -4, + 5, 1, 19, 15, -5, 10, 4, 35, 120, 10, + 0, -3, 10, 66, 11, 32, -12, 32, 12, -13, + 49, 50, 50, -4, 5, 3, -26, 9, -19, -1, + 53, -20, -5, 8, 23, 25, -22, 50, 29, -2, + 22, 15, -22, 19, -8, 90, 40, 23, 4, 16, + 15, 6, 18, 36, 80, 26, 27, 11, -26, -14, + 8, 45, 1, 19, 8, 15, 18, -7, 25, 10, + 16, 7, 16, 23, -10, -7, 11, -14, 19, 5, + 6, -12, 12, 15, 11, -22, -7, -3, 2, 29, + -27, 17, -2, 11, 31, 14, 14, 0, 6, 4, + -9, 26, 9, 7, 14, -13, 1, 8, -3, 20, + 9, -40, 16, -11, -3, -1, -8, -10, -40, 19, + -26, 41, 15, 14, -11, 14, 7, -5, 6, -8, + 25, 22, 20, 13, 29, 14, 15, 22, 3, 15, + -15, 21, 27, -6, 24, -16, 14, 19, 8, 28, + 2, -4, -18, 12, 30, 20, -21, 25, -2, 9, + 12, 19, 11, 12, 43, 7, 20, 8, -8, 3, + -28, -2, 10, 25, 8, 22, 4, 25, 3, 3, + 59, 56, -38, 11, 1, 23, -7, 25, 3, 42, + 5, -23, -2, -22, -2, 12, 16, 12, 4, 26, + 10, -10, -39, -6, -1, 39, 31, 29, -12, 2, + 7, 7, 31, 48, 74, 13, 5, -19, -38, 2, + 0, -14, 4, -22, 20, -7, 21, 16, -5, 14, + 39, -6, 15, -14, 21, 6, -5, -30, 14, -3, + 6, 11, 22, 26, 1, 11, 26, 6, 10, -4, + 10, 10, 16, -13, 4, -3, 4, -5, -12, -27, + -26, 28, -2, 16, 31, 10, 21, -15, 30, -70, + -11, 5, -14, 22, -7, 18, 27, -20, -6, -9, + -16, -25, -57, 18, -22, -8, -17, 43, -14, -26, + 8, 2, -3, -7, -3, 28, -1, -9, 5, 3, + 4, 23, -15, -21, -5, 23, -11, -53, 1, 13, + 3, 8, -24, -32, 39, 24, 2, 15, 4, 7, + 28, 0, -8, -10, -15, -16, -10, 16, 25, 37, + 32, -8, 25, 6, 9, 19, -2, -3, 4, -10, + -12, 26, 5, -15, 9, -13, 6, -8, -21, 7, + -17, 26, 22, -14, -5, 2, -43, -14, 18, -3, + 20, 4, -82, -25, -32, -1, 5, 10, -22, 39, + -5, -28, -20, -14, 1, -15, -73, -16, 10, 21, + 21, 24, 14, -19, -9, 7, 10, -9, 14, 9, + -29, 42, -41, 0, 3, 21, 7, 49, -1, 29, + 5, 1, 12, -32, -1, 28, -4, 52, 7, -32, + -56, -11, 5, -23, 17, 20, 20, -14, 1, 4, + 13, -18, 8, -1, 30, 8, 25, -7, 14, -4, + 15, -2, 7, 2, 9, -11, -8, 31, 0, 8, + 6, -31, 21, -8, 9, -7, 4, -4, 7, -7, + -18, -8, 2, 6, -14, -1, 13, -22, -52, -19, + 31, 8, -6, -17, 38, -5, -23, -41, -55, 9, + 32, -9, 20, 34, -37, 14, 10, -41, 29, -10, + -7, 18, 5, -9, 1, -6, -11, -5, 5, -9, + 25, 11, 19, -4, 0, -7, 33, -36, -14, -20, + 5, 6, 7, 8, 18, 4, 1, 9, -6, 1, + -18, 13, 6, -2, 14, 18, 3, 15, 4, -1, + 11, 19, 11, -8, -12, -20, -1, 4, -10, -11, + 11, -55, 12, 14, -20, 37, 49, 52, -6, 28, + 23, 44, -17, 1, -14, 3, -2, -20, 19, -7, + 7, -19, 8, 11, -24, 15, -42, -11, -22, 18, + 3, -17, -9, -1, -3, 19, 43, 6, -3, -16, + -10, 16, -7, 21, 15, 11, 28, 8, -8, -1, + -39, -32, -12, -28, 22, 28, 2, 13, -6, -30, + -17, 20, 7, -27, -2, -2, -33, 11, 12, -1, + 16, 12, -1, 17, 11, 7, 19, 6, 11, 3, + 8, -15, -17, 21, 14, -4, 31, 17, -16, 26, + -2, 24, -13, 10, -15, -24, 8, -6, -4, 7, + -33, 6, 4, 2, -29, 22, 15, 26, -39, -4, + 50, 4, -26, 47, -1, -24, -3, -49, 53, 6, + 15, 22, -17, 57, 29, 15, 52, 12, -4, 15, + -7, 7, 36, -25, 44, 52, -9, 13, 21, 23, + -15, -17, -36, -7, -1, -61, 29, 28, -20, 16, + 28, 9, 15, 1, -1, -20, -29, 22, -12, -5, + 8, -8, -5, 4, 0, -30, -5, 22, -47, 7, + -10, -1, -41, -14, 7, -3, -8, -10, -25, 14, + 12, -17, 28, 8, -73, 12, -29, -21, -32, -30, + -14, -48, -35, -6, -27, 4, 41, 41, -4, 8, + 3, -30, -18, -10, 13, 6, -12, -6, 20, 9, + -2, -2, 4, 23, 16, 30, -10, 13, -5, 5, + -32, -10, 10, -2, 7, -18, 0, 4, 19, -13, + 8, 19, 8, -38, -2, -28, 10, 2, -34, 38, + 6, -27, 18, -3, 1, -37, 5, -32, -3, -1, + -7, 23, -9, 28, -27, -21, 10, 36, -1, 20, + -72, -5, 26, 12, -14, 32, -14, -39, -25, -52, + 6, 9, -14, -20, -41, -78, 3, 25, 8, 16, + 6, -36, -31, -5, 15, -17, -32, 28, -26, -18, + 34, 25, -24, -23, 18, 1, -28, -25, 6, -10, + -4, 18, -20, -22, -9, -16, 19, -3, 3, -12, + 22, -29, -2, -31, 16, -2, -18, 2, -19, 17, + 16, -41, 37, -4, 2, 2, 27, 14, -17, -31, + -13, -21, -16, -2, -24, 9, -8, -23, -3, -3, + -10, 5, -11, 9, -17, 62, -8, -56, -32, -60, + 92, 16, -6, -11, -44, 1, 52, 23, -2, -5, + -19, -13, -13, -12, -4, -6, -65, -6, -21, 3, + 2, 14, 10, -17, 22, 39, -4, -35, -3, -30, + -19, 1, 2, 28, 18, -5, -8, -44, 45, 3, + 19, 15, 24, 5, -8, -48, -9, -21, 27, -6, + 4, 17, -50, -22, -23, 0, 34, -9, -16, -25, + 4, -18, -14, 1, -12, 13, 19, -20, 31, -30, + -7, -15, 13, 12, -2, -38, -23, -20, -6, -1, + -22, -13, -6, 1, -20, 6, 5, -4, 9, 2, + 67, -15, -37, -21, 0, -25, -4, 16, -39, -34, + -34, -5, -21, -18, 18, -4, 1, 18, 1, 10, + -7, 0, 35, -11, 9, 15, -19, -26, -16, -5, + 33, -6, -8, -4, -8, 8, 2, -5, -30, -3, + -7, -15, -20, 7, -4, -1, -23, 13, -1, 37, + -25, -9, 17, -10, -7, 5, 12, 16, -10, 32, + -1, 36, 21, -2, -53, -16, 9, 9, -4, -6, + -4, -12, 1, -21, -11, -41, -3, 7, 41, 1, + -31, 10, -12, -19, 15, -17, 13, -24, -18, 32, + 44, -20, -13, -4, -52, 11, 21, 21, -19, -30, + 8, 9, 15, -7, 1, 7, 14, 4, -4, 6, + -21, 27, 80, 23, -11, 1, -6, 0, 25, 17, + 17, 8, 16, 64, -30, -16, -4, 16, -16, 14, + -1, 3, 20, 5, 11, 9, 9, -9, 11, -16, + 6, 16, 14, 34, 24, 17, -31, -11, 18, -32, + 18, -10, 12, 30, -3, 8, -11, -6, 51, 7, + -47, 19, -7, -31, 3, -12, -5, -2, -34, 4, + -8, -18, -2, -14, 2, -10, 73, 8, -13, 36, + -10, 14, 28, 1, 5, 17, 50, 23, 22, -7, + 12, 13, -19, -4, -2, 27, 24, -2, -19, 26, + 16, -16, 24, 52, 9, -4, 55, -8, -58, -28, + -20, -23, -2, -24, -5, -22, -2, -3, -2, -22, + 1, 3, -16, 19, -4, 25, 8, -10, 12, 6, + 3, -19, 3, -14, 8, 11, -8, 20, -30, -15, + 0, 15, -6, -4, 24, -10, 18, -3, 3, 16, + -6, 26, 32, 18, -17, 5, 18, 15, -24, -16, + 13, -56, 37, -19, 39, 26, -27, 30, -15, 5, + 27, -4, -8, -3, 5, -1, -16, 1, -24, 1, + -14, -10, -21, -16, -15, 34, -16, 1, 10, 16, + 10, 30, 12, 16, -13, -7, 3, 5, 17, 0, + 26, 28, 19, -4, 11, -56, -16, -80, 18, 9, + 20, -9, -18, -5, -36, -36, 50, -33, -31, -12, + -20, -30, 10, 34, 5, 25, -10, -34, -7, -7, + -24, -22, 5, 29, 16, 18, 18, -20, 7, 2, + -39, -25, 24, 15, -23, 8, -14, -5, 10, -21, + 32, 38, -38, -18, 14, -13, -1, 16, -26, 7, + -19, 5, -6, -26, 27, -10, 2, 8, 17, 43, + 20, 17, 15, -5, 3, -16, 4, -20, -3, -5, + -15, -7, -12, 1, -38, -24, -41, 14, 7, 24, + 5, -4, -14, -20, -16, -16, 3, 10, -9, -11, + -35, -15, 18, 2, -10, 13, 8, -27, -10, 6, + -11, 21, 3, 42, 34, 33, -21, -7, -31, -78, + 13, 25, -28, -9, 6, 18, -7, -11, 43, -32, + 20, 15, -25, -45, 40, -37, -3, 8, -4, -26, + -13, -4, -31, 1, 16, 2, 25, -38, 21, -8, + 4, 0, -3, -14, -10, 4, -14, -24, 18, 9, + -16, 16, -38, 20, -31, -2, -29, 48, -5, 6, + -2, 21, -17, -25, 12, -21, -34, -22, 12, -6, + 1, 12, 11, -8, 1, -1, 14, -15, -2, -33, + -18, 3, 9, -1, -4, -1, 3, 44, 4, 18, + 8, -10, 26, -17, -2, -41, -13, -25, 3, 8, + 4, 12, -9, -30, 10, 14, -28, 6, 35, -4, + -31, 5, -25, -14, 24, -4, 9, -22, 11, 24, + 26, 44, 9, -17, 6, 3, -5, -42, -11, 15, + -26, 12, -16, -19, -12, 14, 0, -30, -13, -22, + 4, 16, 0, -34, -2, -15, -7, -7, 16, 2, + 2, 33, 22, -16, -19, 2, -15, -10, -6, -10, + -3, -2, -15, 21, 32, 13, -10, 34, 20, 37, + -12, -3, 8, 12, 6, 5, 3, -22, 25, -53, + 13, 8, -20, 15, 16, -13, -11, 12, -26, -26, + 10, -33, -19, 19, -1, -5, 17, 22, -27, 22, + 4, 7, -21, 11, -21, -19, 13, -2, -1, 0, + 13, 0, 18, 18, -7, 6, -13, -25, -15, 18, + 2, -29, 1, -16, -39, 21, 13, 10, 15, 8, + -10, 10, 26, 46, 1, 7, 12, 17, 7, 19, + 17, -4, -6, -30, 13, 28, -7, 2, 5, 15, + -1, -20, -3, -6, -26, -4, 12, -1, -3, -10, + 24, 9, 15, 42, 16, 43, 32, 23, -29, 1, + 22, 6, -13, 29, -30, 6, 8, 13, -15, 6, + 4, -24, -19, -12, -8, -27, 10, -10, -2, -9, + 6, 22, 10, 23, -19, 20, -1, -5, -19, -17, + 1, -24, 16, -20, -10, 18, 22, -8, 23, 7, + -31, 30, 12, 25, -3, -13, 20, -3, 24, 21, + 17, 10, 10, -43, 24, 28, -35, 42, -21, -20, + -7, 20, -9, -4, 26, 9, -2, 38, 6, -15, + 12, 35, -24, 11, -26, -6, -12, 18, -3, -16, + 10, -21, 4, 19, 33, -9, 21, 26, -19, 12, + -2, 7, -21, 20, 5, -14, 25, -21, -20, 17, + 11, -9, 16, 40, -7, 11, -62, -2, -13, 13, + 30, -10, -11, -2, -13, 34, 50, 7, -15, 1, + -25, 9, 2, 3, -49, -6, 14, -13, -12, 0, + 15, -27, -2, 28, 12, -12, 4, -13, 5, -18, + -20, -39, -42, 13, -6, -15, -4, 5, 7, -4, + 23, 27, -10, -10, -3, -43, -20, -32, 10, 35, + -8, -12, -36, 15, 54, 3, 24, 25, 24, -10, + -31, -24, -27, -1, -16, -14, -52, -24, 21, -13, + -14, -35, -27, -18, -12, 12, -10, -30, -42, -30, + 13, 3, -17, -3, -16, -31, -21, -2, 8, -16, + 14, -20, -12, 5, 2, -9, -23, 17, 5, -15, + 14, 8, -10, -24, 14, 16, -11, -24, -13, -18, + -9, -51, -2, 14, 0, -2, 4, -16, 89, 0, + 22, -17, 15, 11, -20, -16, -18, -29, 9, 49, + -8, -24, -14, 2, -2, 9, 5, 13, 25, 27, + 2, -5, -29, -24, 18, 11, 14, 7, 16, -9, + 27, 14, 14, -16, 7, 7, -5, -7, -10, -24, + -9, 27, -11, -9, -10, 16, 7, -2, 13, -5, + -8, -56, 0, 11, 18, -8, -26, 23, -30, 4, + -13, 10, 6, -15, -42, 12, -35, 22, -18, -51, + -31, -89, 2, -4, -21, -4, -26, -3, 54, 27, + 52, 2, 40, -49, -1, -12, 23, 19, -26, 9, + -19, -18, 31, -5, -27, -33, 22, 1, 41, -4, + -24, 10, 1, 3, -26, 9, -33, -35, 37, 22, + -15, -18, 23, 13, 30, -26, -35, -28, -28, -13, + -14, -11, -42, -31, 21, -25, -10, -33, -1, 27, + 17, -48, -15, -2, 32, 31, -33, 40, -18, -4, + -18, 45, -10, 4, 18, 21, -22, 16, -19, 4, + 8, 0, 4, 7, 8, 12, -19, -9, 11, -26, + 17, 13, -18, 31, -6, -8, 17, -14, 44, -14, + 12, 10, 10, -10, 17, 38, -33, -2, -6, -6, + 12, 1, 27, 14, -13, -4, -16, 4, 17, 1, + -9, 6, 5, 0, 34, 6, -31, 5, 10, -30, + 27, -29, 27, 35, -19, 7, -37, 18, 19, 17, + 2, 5, -5, -16, -6, -29, -7, -11, -21, -5, + -26, -25, -13, 3, -1, 24, -28, 14, -20, -4, + 24, -3, 2, -24, 12, 3, -3, 3, 45, 21, + 17, 10, 1, 9, 0, 16, 7, -12, 40, -3, + -36, 20, 8, 19, -7, 11, 4, 3, 1, -6, + -5, 26, 6, -1, 2, -21, -7, 24, 27, 14, + 21, -6, 39, 7, -74, -1, 5, 21, 3, -2, + -8, 4, -10, -3, -23, 3, -14, 37, -13, -18, + -28, -9, -26, 9, 5, -20, 10, 6, -14, 20, + 1, 4, 1, 30, -10, 0, 0, 16, -12, 9, + 41, -9, -9, -10, -2, 3, -12, 36, 51, 4, + 46, -8, 37, -6, -7, -75, -3, -3, 0, -1, + -4, 5, 24, -47, 8, -18, -27, 19, -3, 33, + -16, -1, 15, -13, 3, 3, 17, 32, -9, 38, + -20, 11, -37, 24, 19, 37, -30, 15, 38, -1, + 13, -15, 5, 1, 26, 3, 7, 8, 13, 21, + 15, 28, -23, -2, 22, -45, 30, -22, 41, 44, + -33, 7, -21, 28, -16, 22, -11, 16, -15, -6, + 12, -15, 8, 12, 35, 16, 6, -2, 21, -6, + -18, -6, -27, 10, 10, -14, -22, -2, 12, -2, + 9, -5, -6, -9, -10, 14, -16, -3, -9, 9, + 29, 22, 11, 5, -17, 6, 14, 8, -1, 11, + -9, 19, 30, -2, 24, 1, 26, -17, -2, -23, + 3, -22, -1, 6, -7, -6, 20, 1, -8, 13, + 19, -14, 9, -21, 23, -10, -8, 3, -22, 2, + 10, -5, -3, 12, -2, 26, -2, 1, 11, 14, + 12, 6, 19, -4, -2, -7, -26, 15, 36, -12, + 7, 19, 17, 17, -2, -30, -12, -14, 5, 2, + -2, -18, 18, -18, 16, -9, 3, -8, 1, -9, + 8, 3, -2, -17, 4, 7, -6, -18, -3, 18, + 15, -9, -1, 6, -15, -2, 0, -14, 16, 17, + -14, 19, -13, -11, -9, 7, 4, 6, 21, 27, + -48, -17, 11, 3, 0, 12, -7, -32, -10, -7, + 1, 17, -7, -33, 44, -11, -30, -17, -9, -18, + 17, -44, -20, 0, -2, -13, -3, -26, 0, -39, + 34, 6, -1, -2, 9, 4, 6, -4, 13, 25, + -2, -4, -24, 17, -14, -11, -5, 8, 10, 5, + -6, -17, -7, 10, 9, 29, -4, -3, 2, -2, + -13, -15, -17, -16, -43, 25, 27, 13, 11, -28, + 25, -22, 2, -27, -5, 1, -13, 2, -34, 9, + -10, -11, 7, 11, 4, -16, -17, 7, 5, 1, + 3, -10, -16, -1, -8, 4, 12, 11, -13, -1, + -16, 24, 4, 9, -5, 3, -5, -3, -11, -5, + -3, 19, 18, -19, 17, -1, -11, 13, 4, -18, + 9, 9, -16, -8, 16, -7, 7, 9, 34, -9, + 50, 20, -21, -4, -5, 0, 5, -16, 2, 18, + -5, 25, 12, 3, 19, -11, -16, 21, 28, 8, + 13, 15, -1, -19, 3, 15, 12, -29, 8, 15, + 7, -2, -33, -10, 6, 26, -7, 0, 4, 17, + 10, -7, 11, 10, 6, -33, 9, -5, 11, 6, + 1, 23, -19, -18, 2, -4, -4, 8, 14, -4, + 14, 15, -11, 38, -17, -4, 5, 2, -10, -6, + -16, -16, -3, 9, 22, 14, 2, 9, 9, -3, + 23, 22, -9, -3, -48, 6, 0, -3, -1, 3, + 32, 2, -10, 21, -14, -5, -16, -8, -2, 7, + -9, -12, -3, -7, -5, -5, 17, -11, 12, 42, + -35, 19, -9, -6, -13, 1, 9, 8, 20, -16, + -6, 3, -11, 7, 15, 22, -8, -10, 4, 5, + 7, -12, -21, -3, -10, -12, -4, 3, -10, -7, + -14, 16, 7, 19, -16, 11, 16, -6, -31, 24, + 9, 19, 2, 9, 32, 14, -8, -8, 0, -6, + -33, -4, 1, 14, -13, -9, -5, 20, -3, 5, + 20, -11, 5, 21, -8, 5, 8, 1, 6, 2, + -12, 1, 6, -20, -13, 4, 2, 4, -4, 14, + 2, 0, 4, 6, -2, -1, 26, -9, -4, -21, + -3, -4, 22, -1, 15, 14, 7, -2, -19, 12, + 11, 20, 17, -2, 0, -17, -6, 0, 3, -6, + -1, 19, 21, 9, 16, -5, -18, -11, -10, -7, + 15, -11, 6, 3, 5, -22, 20, 41, -33, 23, + -1, -2, 10, 34, 8, -20, 17, -19, -12, 19, + 22, -8, 15, 1, -9, -10, -40, -10, 13, 2, + 14, 3, 4, 13, 2, -8, 23, -7, -9, -28, + 18, 30, 13, -5, -2, 4, 10, 4, 9, -6, + 6, 4, 0, 0, 26, 15, 8, -37, 8, -8, + -13, 19, -17, -1, -17, 3, 17, 3, -11, -14, + -1, 7, 4, -9, 1, 1, -18, -1, 7, -17, + 0, -4, 46, -23, 16, 12, 1, 4, 26, -23, + 11, -14, -19, 3, -22, 21, 7, -14, 37, 6, + 6, -5, 4, -20, -1, 10, -13, -15, 6, -15, + 13, -8, -9, 5, 4, -10, 6, -3, 20, -18, + -24, -5, -19, -14, 10, -12, -1, 4, -28, 3, + 15, 7, 5, -14, -7, 4, 39, 12, -16, 3, + -12, -14, 8, 1, 9, -8, -6, -10, 0, -1, + 8, -44, 5, 12, -9, -1, 0, -25, 17, 0, + -18, -5, -10, 12, 9, -4, 2, -39, -3, 22, + 3, 23, 11, 3, 25, -42, -8, 6, -3, -1, + 19, -9, -3, -1, -17, 4, -9, 9, -6, 1, + 3, -8, -9, 6, 26, -12, 3, -11, -2, -1, + 5, 3, 2, -7, -25, 11, -9, -22, 9, -6, + 10, -15, -5, 4, 5, -47, 19, 8, -13, 28, + 22, 11, 2, -12, -7, 20, -21, 20, 4, -5, + -9, 7, -31, -11, -14, -6, -7, -1, -17, -8, + -4, -9, 32, 33, 15, 0, 22, 9, 24, -3, + 1, -18, -30, -13, -24, -15, 1, -5, 4, -31, + 4, 0, 12, 15, 96, -39, -12, -15, -22, -15, + -23, 8, 1, -36, 24, -9, -17, 0, 21, 39, + 14, 5, -20, 4, 1, 11, -29, 19, -9, -6, + 6, -6, -12, -9, 24, 4, 3, 3, -11, 5, + -8, 14, 3, 0, -3, -6, 15, -33, 23, -35, + -47, 16, 0, 3, -5, 6, 5, 3, -7, 1, + 16, -3, -12, 5, -7, 12, 16, 14, 9, 10, + 23, 16, 1, 13, -13, 2, -1, 0, 8, -7, + -14, -18, 6, 11, -10, 40, 3, 15, 31, -8, + 2, -5, 15, 6, 0, 13, -9, 12, 25, 3, + 9, -6, -17, -15, 10, -10, 20, -4, -29, -9, + -8, -49, -2, -15, -2, 19, 9, 13, -10, -6, + 6, -14, 9, 8, 7, 5, 6, 3, -1, 2, + 37, 21, -11, -25, -5, -19, -6, -5, -18, -26, + 2, 10, -9, -13, 14, 2, 22, -5, -1, -1, + -2, -7, -7, 16, -18, -16, -36, 12, 0, -16, + 21, -28, -8, 1, 3, -3, 3, -9, -14, -17, + -22, 22, -14, -21, -16, -26, -6, -28, -13, 2, + 8, 8, -15, -3, -4, -1, -11, -2, 5, -16, + -44, -10, 15, 5, 25, 16, 10, -7, 5, -28, + -5, -10, 15, -4, 6, -6, 4, -21, -34, 4, + -4, -7, -49, -6, 9, -36, -8, -8, 1, 10, + -2, -7, -1, -3, 8, -26, 8, -5, 22, 3, + 3, -4, 3, 15, -8, 3, -15, 1, 42, 8, + -6, -9, 19, 33, -5, -9, 0, 4, 17, -1, + 19, -20, 9, 0, -24, -38, -11, 18, -3, 31, + -4, 24, -13, 0, 31, -2, 0, -28, 15, 14, + -22, -21, 7, 18, -18, 11, -24, 6, 20, -15, + 7, 9, 17, 3, 0, 10, 3, 19, 7, -2, + 4, 13, 26, 3, 14, 14, -3, -24, -1, -14, + 5, -17, -8, 0, 6, 3, 9, 2, 22, -1, + 28, -8, -16, -9, 16, -8, -3, -11, -16, 6, + 10, -1, -34, 25, -3, 0, 4, -1, -16, -10, + 3, -22, -19, 49, 12, 1, 15, 7, -2, -8, + -5, 5, 22, -1, -6, 8, 5, 13, 0, 20, + -1, -19, -5, 8, 14, -10, -35, -12, 2, -2, + -16, 24, 26, -2, 13, -9, 2, 5, 34, -45, + 15, -13, 5, -1, 24, -5, -8, -42, 5, -5, + -21, 16, -2, 17, -13, 3, -24, 0, 32, -5, + -2, 8, -6, 7, -3, -16, -3, 9, -26, -7, + 19, 11, 5, -5, 12, 1, 25, 18, 8, -35, + 8, -9, 0, -47, 0, 5, 15, 10, 8, -23, + -37, -2, 11, 14, -1, 3, 13, 5, -8, -24, + -4, -9, 12, 3, -28, -22, -21, 16, 2, 15, + 7, -28, 11, 13, 8, -26, 6, 4, -24, 14, + -6, -7, 27, -1, 9, 14, 9, -32, -9, -9, + -3, -3, -6, 5, -14, -12, 42, 4, -37, -29, + -19, -34, -1, 21, 7, 9, -5, 6, -1, 2, + 17, -19, 7, -16, 13, 28, 31, -14, -9, 10, + -8, 27, 0, 9, 13, 15, 1, 17, -21, 10, + -5, 8, -1, -7, -16, 18, 12, -15, 13, -6, + -1, 6, 3, 29, -12, -32, -8, -9, 15, -20, + -1, -19, 1, -1, 3, 8, 16, 4, -28, -6, + -5, -19, -20, 0, 4, -5, 12, -19, -2, 7, + 9, -13, 12, -19, -15, -9, 27, 1, 6, 5, + -9, 1, 7, 12, -9, 10, -11, -9, 22, -5, + -1, -31, -12, 16, -15, -28, -20, 1, 8, -9, + -13, -10, 27, -14, -16, 12, 35, -7, -4, 1, + 22, -17, 30, 12, 8, 10, -2, 17, 3, 0, + -10, 10, -39, 11, -1, 2, 17, 7, 5, -6, + -13, 1, 5, -12, 15, 2, -5, 39, 17, -11, + 3, 20, -11, 12, 11, 26, 6, -10, -36, 17, + 13, 1, 10, 14, 29, -26, 10, 7, -11, 19, + -19, -4, -3, -6, 7, -15, 23, 3, -9, -5, + 3, -7, 0, -5, -29, 3, -14, -19, 3, 16, + 7, -15, -31, 7, 7, 15, 18, 0, 15, -4, + 1, 4, -46, -10, -2, 2, -21, 8, -10, 15, + 5, -9, 29, 5, -4, 17, -3, -4, 15, 4, + -33, -8, 12, -12, -12, -12, 5, -3, -51, 3, + 17, -21, -12, -6, -18, 20, 6, -29, 8, 0, + -18, 1, 4, -7, 17, -25, -9, 7, -6, 4, + -43, 26, -4, 16, 14, 12, -13, 8, 7, -7, + 5, 5, 5, 4, -5, -2, 10, -6, 4, -12, + -23, -2, -8, 3, 14, 2, -50, 10, 17, 2, + 1, -7, -9, -7, -16, 8, 18, -20, 11, 0, + 24, 14, 18, -10, 10, 8, -16, -19, -21, -2, + -6, -3, 17, 8, 2, -12, 6, 8, 19, 7, + -34, -1, 0, -15, 5, -14, -42, -21, -7, -19, + -24, 2, 15, -8, -22, 4, -22, -12, -28, -27, + -20, -27, -25, -10, 4, -15, -10, 6, 18, -3, + -5, 9, 14, -19, 19, 1, 5, 10, 22, -9, + -19, 17, 0, -22, 10, 6, 13, -7, 33, 10, + 34, -8, -16, -4, 4, 2, -6, -17, 7, 17, + -5, -18, -9, -27, -5, -26, -4, -7, -5, 1, + -31, -10, -12, 3, -16, -9, 5, 6, -5, -15, + -2, 4, 0, -31, -9, -19, -35, 2, -20, -9, + 4, 1, -12, -12, 12, -15, 15, -6, 13, 17, + -20, -12, -2, -9, -2, 8, -3, 6, -10, -11, + 18, 13, 19, 13, 2, -17, -22, -8, 8, -6, + 4, -8, -12, 9, 13, -10, 12, -31, 6, 34, + 0, -6, -10, -14, -13, -19, -15, 21, -9, 6, + -1, -8, -8, 10, 14, 21, -12, 19, 3, 2, + 27, 2, 7, 18, -7, 9, 15, 8, 14, 5, + 6, -19, 26, 7, -16, -3, 2, -4, 20, 19, + -9, -5, -11, 3, 17, -8, 16, 12, 12, 17, + 6, 5, 16, -2, 1, 1, 7, -12, -20, 10, + -4, -20, 8, 2, -12, 0, -7, 12, 12, -4, + 17, 3, 1, 11, -8, 10, -21, 0, 45, -23, + -23, 24, 4, -7, -5, -19, 25, -3, 2, 7, + -18, 22, 13, -7, -4, 2, -1, 0, 9, -2, + -5, 3, 5, 5, 1, 2, 0, -27, 1, -5, + -1, 35, 25, -8, -2, -9, 10, 30, 1, 8, + -31, -23, 7, 13, 3, -17, -28, -58, -16, -1, + -24, 1, 7, 10, 18, 18, -8, 2, -30, 12, + 9, -15, 8, -31, -18, 13, -5, 11, 13, 15, + 2, -2, -6, 13, -18, 36, 3, -16, 21, -1, + -30, 4, -21, -5, -4, 9, 11, -15, -7, -3, + 4, -2, 7, 8, -1, 14, 4, 8, 11, -16, + 21, 4, 23, -32, 8, -17, -27, 14, -22, 10, + 17, 13, 27, 27, -4, 3, 10, -9, 20, -21, + -18, -11, -5, -8, -7, 0, 24, -1, 17, -15, + -10, -8, 26, -11, -14, -7, 1, 5, -18, -33, + 3, 10, 9, -6, -18, 2, 0, 9, 3, -1, + -1, -8, -42, 4, -7, 3, 2, -14, -36, 14, + 42, 4, -25, -20, 9, -15, 3, -9, 17, 14, + 3, 4, -7, 8, -5, 7, -8, 12, -23, 9, + 5, 31, -7, -13, -1, 6, 15, 24, 2, 2, + -42, -16, -18, -8, -1, -26, -23, 11, -8, -11, + -1, 0, 17, -19, -6, -7, 14, -12, -12, 18, + -2, -26, -2, -16, 1, 6, 4, 0, -15, 0, + 10, 4, -26, -3, 10, -21, -3, -15, -25, 7, + 7, -6, -6, -9, 28, 2, -1, 5, -23, -14, + -26, -7, -12, 9, 6, 12, 3, 6, -7, 0, + 4, -15, 16, -3, 4, -4, 2, 7, 0, 4, + -9, -2, -16, -5, -2, -3, -11, 22, -2, -11, + 12, -3, 1, 8, -2, -3, 15, -2, 14, 3, + 14, 6, -1, 0, -9, 20, -34, -1, 6, -20, + -8, 10, -4, 2, 10, -4, 14, 13, 5, 0, + 21, 4, 0, -3, 3, -24, 19, -30, 4, -24, + -4, 25, -1, -7, 8, -21, 24, 12, -26, -20, + 9, -9, -1, -19, -22, 2, 5, 17, 4, -16, + 11, -6, 9, 7, -2, 5, -16, -8, -4, 17, + -7, 7, 0, -1, 6, 0, -3, -11, -2, 0, + -1, 3, -4, -7, 5, 27, -5, 22, 30, -39, + -19, 1, 4, -4, -23, -4, 19, -27, 22, -12, + 9, 19, -14, -37, -20, 21, 1, -46, -6, 24, + -15, 13, 0, 16, 8, -3, 16, 8, -20, 25, + 24, -22, -13, 7, -26, -35, 21, -11, 31, 15, + -19, -28, 21, -19, 13, 16, 9, 1, 12, -3, + -2, 6, 14, 5, -1, 1, -8, -24, 7, -6, + -39, 14, 15, -11, -19, -11, 3, 0, 31, 4, + 3, -10, -2, -4, 14, 1, 2, -15, -2, -7, + -4, -11, 1, 16, 14, 1, 13, 11, -3, -18, + -7, -3, 1, 0, -3, 7, 5, 6, 7, 4, + 0, 1, 27, 18, -2, -8, -20, 18, 2, -5, + 8, -6, 11, -9, 6, 5, 4, -4, 12, -19, + 7, -7, 12, -17, -17, 6, -4, 4, 7, -6, + 8, 17, 11, -4, 4, 10, 1, 20, 7, 1, + 3, -19, -7, 22, 1, -14, 9, 5, 1, -6, + 4, 2, -8, -25, 8, 5, 21, 14, 0, -22, + -4, 0, 10, -7, 1, 4, 1, 17, -13, -8, + 3, 0, -7, 19, 9, -7, -18, -1, -9, 2, + 8, 3, -3, -4, -26, -13, 6, -2, -13, 1, + 15, -19, -15, 1, -44, -14, 1, 7, -20, -3, + 41, -15, 22, 23, 8, -13, -1, -17, 5, -17, + -11, 23, -4, 19, -15, 5, -11, 4, 3, 0, + 8, 4, 9, 27, 7, -21, -1, -29, -15, -10, + -2, -10, -17, -2, -15, 15, -4, 12, -9, -2, + -9, 0, -2, -18, 9, -17, -8, 2, 30, 2, + -1, 5, 5, -5, -9, 2, 7, -14, -7, 6, + 29, 3, 5, 3, -10, -6, -75, 3, 14, -26, + -5, 0, -11, 11, 9, -18, 5, 21, 32, 16, + -14, 39, 1, -31, -22, 5, 16, -12, 7, -30, + -39, 8, 7, 27, -2, 10, -11, 10, 14, 6, + -25, 13, -22, -9, 14, 10, -7, 4, 8, 5, + 13, 6, -26, 22, 3, -3, 4, 6, 9, 1, + 6, -1, -5, 7, 19, -5, 24, 8, -22, -28, + -39, 2, -18, -27, -16, -17, -17, 23, 2, -13, + 20, -4, 12, -1, 0, 18, 22, 17, 0, 17, + -38, 16, 15, 18, -9, 13, -3, -16, -11, 10, + 5, 4, -9, -1, 12, 2, 6, 0, -2, -6, + -10, -5, -8, -4, 14, 20, -1, 13, -11, 19, + -5, 12, 5, -1, 15, 25, -4, 14, 14, -6, + -12, -3, 13, -27, -18, -8, -20, 3, -9, 0, + -2, -10, 14, 2, -2, 22, 2, 5, 9, -9, + -17, -9, -14, -11, -1, 9, -32, 1, 29, -32, + 9, -6, 3, 20, -14, 15, 6, -12, -2, 23, + -12, -4, 0, -35, -25, 22, -5, -1, 17, 16, + -22, 12, -13, 9, -23, -18, -12, 0, -12, -27, + -9, 6, -8, -3, 2, 3, -1, -19, -22, 9, + 15, 6, 14, 29, 7, 4, -3, 1, 30, -41, + 10, 1, 7, 4, -7, 19, 14, 3, 3, -10, + 0, -4, -1, 13, 66, 2, -22, -29, 2, 3, + -4, -16, 3, -8, -1, 15, -19, -10, 12, 23, + 33, -8, 21, 7, 4, 15, 3, -17, 19, -3, + 3, -4, -5, -1, -6, 9, -16, -10, -12, 10, + -7, -6, -8, 2, -8, 14, 0, -8, 27, -8, + -17, 17, 0, 10, -14, 2, 36, -15, 1, -21, + -33, 1, -13, 2, -16, -19, 4, -18, -18, -30, + 28, -20, -8, 0, -1, -3, -2, 21, 9, -3, + 5, 2, -10, -5, -9, 12, 17, -2, 0, 2, + -17, -15, -4, 0, 3, 9, -17, -3, 20, 11, + -11, -16, 15, 1, 17, 1, -2, -8, -4, 6, + 6, -5, -1, 6, -6, 20, 0, -12, 6, 37, + -2, -11, -13, -27, 6, -19, 37, 3, -9, -1, + -17, -23, 13, -19, -25, -14, 9, -1, 11, 9, + 6, -7, -11, 5, -11, -12, -2, 16, -17, 0, + 58, -1, -15, -23, -1, -28, -12, 4, -9, -1, + -13, -4, -6, -22, 15, -26, -12, 2, -3, -7, + -10, 10, 1, -9, 10, -8, 5, 23, -4, 20, + -15, 9, -18, -39, 8, 2, -3, -9, 26, 12, + -18, 8, 1, -6, 4, 37, -10, -1, -4, 18, + 8, 4, -22, -11, -30, -14, -8, 5, -10, -14, + -3, -13, -13, 4, 20, -13, -9, -6, -23, -33, + -8, -3, -27, -3, -21, -16, -30, 10, 17, -23, + 11, 14, 3, -30, -9, -13, 25, 13, -2, 24, + -9, 5, -5, -19, -1, -8, 0, 38, 10, 13, + 14, -13, 13, -24, -10, 1, 4, -15, 1, -9, + -2, 8, 3, -3, 6, 22, -2, 2, -1, -3, + 17, -1, -7, 17, 3, -16, 10, -30, -11, -5, + -11, -8, -2, -3, -2, -5, 1, 4, -34, 27, + -4, -28, -16, -26, -20, 8, -12, -4, -6, -22, + -27, -6, -9, 8, -6, 6, -3, 24, 6, 0, + 21, 4, -16, 26, -41, 9, 27, -31, 34, 18, + 51, 5, -14, 11, 0, 22, -4, -1, 16, 9, + 0, 1, 10, -18, 3, -1, 0, 17, -33, 31, + -31, 14, 5, -14, 26, 25, -10, -6, 4, -2, + 19, 2, -10, 20, 3, -14, -16, 10, -9, -35, + 6, -16, 2, 14, -15, -3, 7, -18, 17, 9, + 14, 3, 13, 7, -3, 12, 4, 6, 3, -18, + 26, -23, -18, -13, -33, 5, -25, 13, -4, -30, + 1, -3, 8, -8, 4, 15, -13, 35, 6, -7, + -30, -2, -1, -4, 17, -5, 3, 14, 53, -7, + 11, 23, 38, 13, -3, -9, -8, 10, -7, 31, + -23, 2, -2, 4, 20, -3, 3, 16, -1, -5, + 3, 9, 3, -4, -2, -20, 7, 7, -25, -3, + -22, 10, 0, 7, 2, 10, 15, 10, 9, 3, + 20, -29, 32, -12, 29, 20, 13, 19, -22, 6, + 21, -1, 40, 10, 26, 20, -24, -2, 17, 1, + -5, -1, 17, 28, -10, -1, 15, -6, 17, -14, + 27, 31, -11, -3, 13, 26, -43, -13, -7, -4, + 3, 24, 5, -1, -20, -7, -22, 13, 8, 29, + 27, 26, -1, 7, 18, -3, 16, -6, -14, 5, + 26, -20, -1, 3, 1, -7, -26, -12, 24, 20, + 16, -15, 5, 2, -2, -6, -5, -10, -20, 25, + -13, -5, 6, 13, 25, 0, 19, -1, 34, -16, + 0, -19, -5, 6, -2, -7, -18, -19, 34, -14, + 3, -2, -6, 9, 16, 25, 20, 17, 8, -28, + -10, -4, 8, 14, 8, -18, 20, 1, 23, -14, + 53, -21, 18, -5, -2, -3, -6, -3, -6, 0, + 30, 8, 11, 7, -12, -4, -23, -6, -8, 7, + 4, -3, 3, -3, 16, -18, 21, -11, 8, -6, + 21, -12, -3, -17, -3, 9, 4, -11, -1, -2, + -7, -7, -2, -12, -2, -22, -10, 2, 0, -22, + -1, -7, -8, 35, -5, -29, 21, 4, -10, 2, + 22, -10, -17, -8, -9, 12, -1, 32, 1, 3, + -13, -7, 0, 10, 4, -24, 12, 9, 21, -8, + 5, -17, -6, -8, -1, 23, -13, 1, -31, 0, + 4, -26, -2, -29, 18, 9, 0, -3, 5, 16, + 10, 17, -9, 42, 23, 18, -14, -8, 29, 1, + -27, -32, -5, -49, -3, 3, -21, 13, -5, 25, + -8, -23, 17, -12, 2, 10, 9, -4, 2, 6, + -18, 5, -5, -5, -20, 4, -3, 18, 1, 14, + -9, 23, 8, -9, -1, 0, 1, 7, 1, -7, + -11, -1, -19, 9, 8, -2, 33, -17, 1, 6, + 14, -1, -12, -16, 2, -6, 0, 0, -27, -5, + -16, -3, 3, -5, -4, 9, 15, 2, -24, -8, + -2, 3, -16, 14, 1, 7, 2, 20, -12, 9, + -2, -10, 7, 7, 4, 11, 14, -8, -14, -12, + -25, -18, -4, 4, -2, -7, -9, -2, 7, -5, + 2, 10, 0, 14, -3, 3, -18, 0, -18, 7, + 10, 3, -25, -10, -27, -30, -15, 6, 1, -26, + 9, 13, -21, 6, 59, 10, -4, 0, -15, -9, + 2, -13, -11, -22, -16, -1, -5, -5, 2, 1, + 1, -3, -3, 9, 12, -8, -39, -14, 2, -14, + -12, -19, 4, 8, -29, -4, 0, 39, 4, 20, + 15, 12, -2, -11, 2, 24, -8, 20, 9, -3, + 0, -11, -8, -2, 6, -7, -15, -18, -11, -7, + 6, -3, -5, 9, -12, 9, 7, -8, -14, -17, + -1, 6, -11, -8, -38, 10, 8, -14, -8, 3, + -1, -21, 7, 3, 5, 8, 1, 5, 0, 4, + 10, 34, 4, -1, -39, 4, 15, -16, 1, -1, + 13, -7, 10, 13, 10, -10, -9, 0, 3, 9, + -19, -13, -8, -4, 2, 2, -10, 31, 15, 17, + 4, 7, 40, 6, -11, -9, -15, 8, -7, 12, + 1, 4, -54, -17, 8, -4, 16, 16, 36, 11, + 1, 1, -37, 8, -7, -7, -22, 12, -39, 5, + 12, -2, 3, -10, -20, -5, 5, 17, 17, 2, + 23, 4, -23, -3, -4, 16, 22, 2, 5, 11, + -8, 8, 7, 12, -14, -10, 15, -4, -8, 24, + 21, 4, 6, -2, -26, -1, -16, -14, -18, -27, + -5, -25, 20, -13, -22, 11, 2, -2, 12, 11, + -5, -7, -10, -5, 2, 10, -4, -6, 21, 5, + -23, -6, -4, 3, 24, 34, -20, -2, -5, -1, + -1, 20, 2, -9, 9, -16, 4, 4, -16, 5, + 10, 4, 3, -14, 6, 18, -8, 8, 7, -11, + 0, 10, -5, 3, -2, 8, 16, 13, 5, -20, + -11, 2, 2, 9, 5, 9, -18, -4, 7, -15, + -31, -9, 15, -19, 0, -8, 3, 15, 5, 1, + -4, 15, 7, -6, -8, 23, -8, -4, 9, 7, + -1, -19, -10, 19, 7, 33, 7, -8, -28, -9, + -9, 16, 1, -15, 14, -1, -17, -6, -2, -5, + -10, -4, -17, -5, -11, -2, 21, 2, -5, -15, + -11, -10, 11, 22, -9, 2, -4, 6, -16, -15, + -6, 2, -9, 14, -10, -4, 30, 20, 8, 0, + -7, -5, -12, -1, 20, -8, 7, 5, -10, -14, + -8, -3, 14, -14, -2, 6, -23, 3, 23, 0, + 7, 4, -8, -5, 2, 20, -13, 21, 3, -17, + 11, -5, -20, -6, -6, 17, 6, 1, -6, 2, + 12, -7, -5, -19, -10, -32, -22, 3, -1, -17, + 5, -9, 11, 9, 5, -12, 6, 7, 6, -8, + 7, 5, -6, 1, -2, -9, 5, -24, 31, -11, + -12, -5, -10, -12, -11, -1, -6, -20, 0, -9, + -8, -1, 0, 14, -10, 5, -26, -5, 20, 13, + 15, -22, 18, -19, 43, -15, -13, 2, -23, 5, + -8, 19, 0, 1, 31, -5, -14, -6, 3, -18, + 7, -12, -22, 4, -14, -11, -3, -15, -2, 6, + -13, 3, -21, -32, 14, 2, -23, -12, -21, -10, + -15, 11, -14, -1, 1, -10, 17, -4, 28, -31, + 26, -3, 25, -20, -5, -14, -1, -10, -6, 20, + -16, 13, -2, -32, -9, 4, 8, -3, -1, -14, + 11, 21, -20, 17, 15, 2, -19, 4, -11, 10, + 8, 1, -28, 7, -14, 26, -13, -13, 3, 10, + -4, -5, 5, 30, -11, 9, 25, 31, -10, -3, + -2, -8, -6, 8, -26, 10, -3, 4, -4, -7, + -15, 16, 19, -17, -33, 10, -7, 9, 2, 4, + 8, -10, 0, -16, 14, 23, -3, -8, 4, 27, + -2, 1, 29, 12, -13, -2, 17, -4, 6, -15, + 8, 21, -12, -12, -13, -1, 1, -14, 22, -8, + 4, -11, 0, -13, 16, 2, -22, 0, 3, 5, + 11, -7, -1, -5, -9, -11, 7, -24, 15, -11, + -8, 2, 1, 0, -3, -11, -24, -22, 1, 6, + 8, 8, -9, 2, 13, -15, -42, -1, -30, 15, + -4, 4, 9, -25, -20, 5, 27, 2, 1, -29, + 10, 24, -7, 1, 1, 16, -10, -2, 3, -1, + 11, -7, 19, -11, 5, -5, 3, -1, 0, 3, + -3, 10, 8, -9, 32, -1, 23, 11, 16, 1, + -9, -15, 4, -14, -17, -9, -2, -16, -34, -6, + 2, 26, 4, 10, 9, 9, -3, 1, -3, 18, + 8, -6, 20, 12, -15, 7, 4, 21, -20, 21, + 15, 40, -26, 15, 21, -9, 13, -3, 16, 7, + -9, 8, -1, 22, -17, 2, 12, 5, -7, -17, + -1, -24, 13, -15, 17, 1, -19, 7, -7, 7, + 6, 12, 60, 11, 1, -10, 21, 2, 2, 7, + 8, 10, -12, -13, -11, 6, 12, 15, -18, 11, + -33, -1, 8, -2, 5, -10, 8, 12, -21, 25, + -7, 21, -19, -22, -8, 24, -11, 15, 2, 9, + -9, -10, 8, -1, 30, -3, -29, -1, 4, 22, + 27, -13, 13, -10, 8, -19, 6, -17, 14, -3, + -20, 4, 18, -3, -19, 6, 25, 17, -6, 11, + -13, 26, 11, -3, 15, 31, -2, 6, -14, 31, + 15, 2, 19, 10, -13, -22, -12, -7, -11, 22, + 10, 0, 14, 4, -25, 0, 13, 12, 1, -27, + -22, -33, -37, 4, 2, 31, -2, -10, 9, -22, + 3, -25, -9, -4, 2, 24, -6, -6, 19, 32, + 6, -1, 17, 24, -1, -7, -11, 14, -3, -4, + 25, 21, -5, 1, 3, 22, 1, -5, 13, -10, + 5, -7, -22, 0, -1, 14, -26, -23, 25, 16, + -14, 15, 15, -1, -34, -4, -19, -1, 14, 0, + 23, 5, -39, -18, -1, -2, -6, -23, 6, 27, + -14, 2, -17, -9, 9, -27, -5, 6, -7, 5, + -8, 5, 11, -18, 14, -15, 18, -5, -8, 9, + 1, -7, -27, -6, -22, 19, -9, 21, 7, 16, + -9, 11, 0, 4, -18, 0, -14, 6, 12, -14, + 6, -12, -11, -16, 9, 8, 0, -13, 4, -4, + 0, 20, 2, 11, -40, 7, -16, 11, -30, -1, + -3, 27, -11, 18, 7, 26, 12, -17, -2, 1, + 12, 0, -1, 0, -20, 15, -7, 34, 9, -20, + 9, 29, -6, -2, -2, 14, 17, 14, 16, -1, + 4, -4, 1, -3, -9, 10, -14, 15, -1, -11, + 15, -13, 21, 1, 34, 2, 12, 16, 7, -27, + 10, -13, 6, -14, -14, 6, 2, 29, -3, -2, + 18, -8, -2, -6, -10, -5, -6, -9, -3, -13, + -3, -13, -4, 4, -6, -11, 11, -5, -16, -8, + 18, 12, 11, 8, 31, 11, 2, -21, 26, 5, + -6, 14, 24, 7, 2, 9, -13, -7, 31, 2, + 3, 0, 5, 7, -21, -7, -13, -4, -4, -5, + -7, -4, -12, -4, -18, 11, -1, 4, 25, -25, + 15, -4, -21, 0, -8, 18, 29, 0, 7, 6, + -26, 8, -6, 1, 5, 5, -1, 13, -12, -2, + 23, -7, 1, 26, 13, -12, -2, 3, 2, 25, + -6, -4, -24, -4, -6, -1, -4, -5, -43, -19, + 6, -8, 20, -20, 15, 28, -14, 8, 14, -12, + 13, 20, -18, 11, -21, 1, 19, 21, -3, -7, + 12, -5, -5, -3, 21, -13, 14, 24, 2, 19, + -12, 14, 8, 5, 4, -5, 33, 3, -9, 11, + 19, -15, 13, 3, -3, -6, 12, 4, -7, -11, + 9, 1, -9, -9, 6, 6, -12, 14, 13, 12, + -9, -2, 13, 2, 5, -4, 13, -2, 15, -1, + -3, 15, -11, 0, 2, 11, 6, -13, 17, 19, + -2, -21, -16, 18, -21, 16, -5, 2, -20, -5, + 22, -1, 5, 4, 15, 31, 11, -13, 35, -7, + 4, -16, -8, 10, -3, -13, 0, 9, 39, -12, + 32, 6, 8, 12, -11, 26, 8, -7, -20, 2, + -31, -10, 7, -13, 12, 14, -8, -2, -1, 39, + 6, 6, 18, 2, -6, 4, 8, 3, -8, 0, + 4, 0, -30, 9, 26, 27, -8, 12, -16, 8, + 3, 20, 29, 6, 0, -15, 11, -14, 0, -2, + 9, 14, 0, 1, 11, 2, -6, -5, 32, 3, + 22, 35, -2, -26, -12, 12, -21, 23, 6, 14, + -25, -12, 41, -8, -1, 11, 15, -15, -12, -16, + 5, -12, 0, -10, 3, 20, 2, -9, -11, -3, + 7, 5, -1, 6, -5, 13, -2, 12, 2, 13, + -20, 14, 8, 3, -28, -3, -17, 31, -12, -33, + -33, 15, -11, -3, -26, -24, 5, -31, -15, -8, + 21, -24, -5, -13, -9, 5, -15, 7, 9, 6, + -16, 3, 1, 13, 17, 16, 10, -4, -3, 14, + 2, 7, -15, -12, 5, -1, -3, 13, -29, 29, + 6, 14, 11, 1, -20, -6, 8, 19, 27, -1, + -1, -1, 0, -11, 0, -3, -21, 11, -7, 18, + 5, -14, 9, -13, -7, -9, -27, -18, -8, -24, + 14, -28, -26, -7, 1, -32, 24, -9, -8, -20, + 17, 12, 21, 19, 1, -19, -20, 16, 1, -4, + -17, 0, -9, 25, -10, -10, 23, 6, -12, 6, + -13, -24, 4, -12, 16, -17, -25, -2, 18, 7, + 10, -3, 40, -13, 11, 16, 16, -14, -15, -4, + 16, -21, -35, 3, 19, 12, 7, 10, 7, 10, + -1, 9, -6, -1, -15, 11, 23, 1, 3, -23, + 0, -5, 5, -6, 12, -4, 8, 5, 11, -4, + 0, -12, 3, 9, 2, -18, -4, 3, 17, 12, + -13, -12, 5, 9, -11, -3, 4, -6, 6, 3, + 44, -18, 10, 6, 26, 25, -18, -2, -3, -4, + 3, 5, 2, 24, 2, -1, 4, -4, -9, 3, + -31, -8, 1, -13, -5, 16, -4, 2, 3, 14, + 6, -9, 9, 2, 4, 10, -19, 2, -9, 32, + -6, 13, 13, -10, 6, -8, 6, -9, -11, 6, + -6, 5, 6, -9, -14, -3, -2, 13, -4, -11, + -13, 9, -5, 0, -5, 12, 16, -14, -6, -23, + -9, -9, 10, -7, -19, 1, 0, 5, -3, -11, + 1, 15, 11, 5, 25, -5, 29, 14, 10, -12, + 4, -6, -4, -28, 17, 18, -8, -27, -11, -16, + 9, 5, -15, -12, -1, 8, -12, 23, 6, 10, + 1, -14, -2, 1, 18, 9, -17, 1, 50, 4, + -10, -9, 10, 11, 0, 7, 9, -3, 27, 5, + -48, -16, 9, 3, 1, 24, -17, -12, 20, -33, + 2, -7, 15, 31, -5, 13, -17, -10, 18, 39, + 16, -6, -16, 1, 21, -3, 9, -2, -9, 9, + -22, -20, -34, -20, 19, 1, -33, -17, 27, -2, + -7, 9, -10, 0, 7, -6, -4, 2, 10, 14, + 23, -5, 1, 12, 2, 2, 4, -3, 0, -2, + -3, 3, -6, 18, -7, -6, -17, -21, 2, -3, + 8, 18, -6, -10, -8, -1, 13, -6, 6, 21, + 13, 22, 28, 21, 2, 1, -2, 12, 7, 2, + 13, -5, 6, 14, -4, 3, -19, -18, 20, -10, + 17, 0, 5, 16, 8, 23, -28, -6, -11, -2, + 4, 15, 19, -1, 3, 4, 42, 0, 0, -1, + -3, -5, 7, 10, -18, 9, 2, -10, -5, 5, + -12, 2, 6, -11, 3, -9, 4, -4, 7, -16, + -14, 15, 9, 20, 15, 21, 1, 4, 12, -25, + 13, -15, -9, -12, 9, 2, -22, -34, -12, -14, + 36, 15, -30, -5, 35, 27, 24, 46, 12, 22, + 0, -19, 5, 13, -9, 11, -37, 36, -6, -10, + 19, 28, 5, -10, 3, -6, -8, 1, -18, 30, + 11, -4, -7, 17, 6, -12, 6, 6, -4, -2, + 14, -4, 5, -12, 7, -1, 5, 23, -9, -2, + 14, 12, 29, -10, 7, -10, 1, -4, -11, -9, + 2, 0, -6, -3, 21, 1, 2, -6, 32, -6, + -11, -7, -4, 1, -13, 12, -10, 19, 6, 1, + -19, -5, 31, -8, -22, 14, -21, -18, -24, 1, + -10, 1, 11, 18, 22, 12, -17, -14, -9, -5, + -11, 0, -12, -8, -4, 12, 10, -6, 21, 38, + -6, -4, 7, -5, -4, 10, 5, -5, -26, -11, + -17, 3, -1, 22, -1, 27, 8, -11, 14, 6, + -3, 10, 10, 5, -2, 5, 16, -17, 8, 6, + -13, 12, -10, 5, 10, -6, -4, 0, -8, 15, + -26, 9, -4, 23, 0, 8, 3, 10, 8, 6, + -1, -10, 17, 22, -40, -13, -22, -37, -27, 19, + 11, 21, -3, 33, -6, -7, 12, -24, 15, -3, + 3, -6, 11, 4, 12, -6, -5, -2, 7, -11, + -4, 3, 14, -4, 19, 13, -1, 2, -5, -6, + 12, -12, 3, 9, -2, 22, 14, -3, 9, -15, + -8, -16, -8, -2, 9, -16, -9, 20, 20, 16, + -15, 16, 24, -22, -7, 6, -10, 1, 9, -6, + -10, -11, 2, -5, 0, -14, 19, 17, -3, -11, + -2, 10, 9, -4, -2, 2, -5, -1, 10, 21, + -14, -5, -15, 10, -8, 15, 24, -13, 31, -2, + 14, -6, -3, 24, 4, 5, 25, 22, 11, -4, + -8, 6, -61, -5, 2, 13, 23, 12, 30, -17, + -18, -5, 1, 0, 2, -14, -4, -15, -22, -11, + -1, 19, -17, -12, -10, 5, -11, -21, 30, -10, + -7, -15, -29, -7, -37, 13, -12, -37, 17, -14, + 0, -21, 13, 5, 16, 2, -15, -1, -11, -11, + -16, -18, -10, -1, 8, -21, -28, 4, -10, 5, + -2, 4, 3, -3, 8, 9, 19, -15, -12, -8, + 22, -10, 16, 4, 0, -19, -23, -4, 0, -14, + 11, 7, -45, 3, -1, -8, 10, 5, 39, 5, + -4, 1, -4, -2, 2, -26, 5, -13, -39, -4, + -9, -8, -7, 3, 31, 1, 13, 23, -4, -1, + 2, -3, -5, 5, -36, -10, 1, -29, 4, 1, + -10, -8, -2, 0, -1, 10, 19, 13, 3, -3, + 3, 16, -3, -9, 10, 1, 16, -9, -10, -17, + -16, 17, 6, 22, -18, -5, -27, -4, -4, 5, + -4, 18, 21, -19, -10, 12, -13, -36, 15, -3, + -10, 6, -29, 23, 4, 6, -21, -9, 0, 15, + -24, 6, -7, -2, 5, 5, -7, 4, 18, -2, + -3, -7, -18, -8, 19, 10, 16, 11, -15, 3, + -5, 1, -4, -14, -5, -10, -7, 25, -3, 6, + 4, 0, -4, -5, -4, 9, 11, -13, 1, 13, + -19, -22, 10, 21, 5, -5, 2, -9, 4, 2, + 3, 4, 20, -11, -21, 28, -22, -1, -7, 22, + 13, -11, -14, 3, -13, -5, -1, 30, -3, -4, + -6, 7, 1, -3, 2, 11, 7, -21, -8, -11, + -2, 18, -25, 36, -2, -8, -13, 23, 1, -9, + -13, -29, -8, 1, -20, -11, -8, -13, 10, -10, + -4, 13, 11, -12, -6, -3, -11, 14, 22, 17, + 3, -11, 16, 10, -10, 21, 4, 3, -22, 4, + -13, 15, -20, 1, -29, -1, 5, 4, 13, 24, + -12, 0, -6, -5, 12, 24, -27, -6, 21, -12, + -11, -1, -9, 13, -12, 7, 1, -17, -14, 10, + 11, -28, -6, -18, 10, -26, -5, 14, 10, 19, + 1, -1, 13, -10, 7, 19, -9, -1, 7, 6, + -25, -11, 12, 6, 5, 8, -17, 4, 13, 3, + 3, -1, -18, 1, -2, 10, 9, 2, -13, 3, + -9, -8, -10, 6, 6, 3, 5, -7, 30, -24, + 16, -12, -2, 11, -24, 10, -20, 9, 2, 14, + 20, 4, -5, 2, -1, -29, 12, -5, -4, -7, + 18, 21, 13, 2, -25, -11, 5, 10, 0, 0, + -26, -3, 10, 6, -4, -55, -17, 3, 2, -13, + -22, -12, 17, -22, 1, 20, 4, -1, 9, -6, + 14, 32, 2, -31, 2, 0, -13, 16, -6, 5, + -25, -9, 26, -1, -15, -3, -20, -44, -34, 10, + 11, 1, -1, -39, -5, -22, 9, 21, 12, 0, + -3, -2, -14, -9, 21, -1, -11, -11, -45, -10, + 8, -3, -9, -20, 2, -38, 1, 7, -7, 2, + 33, -6, 16, -26, -15, 23, 18, 2, 17, -8, + -4, -1, -9, -1, 14, -5, -36, 2, -14, -2, + -12, 4, 1, -13, 5, 9, -1, 4, 5, 15, + -8, -11, -6, 4, -11, 26, 20, 19, -7, 11, + -7, 8, 16, 29, 31, 14, 23, 8, 6, 12, + 9, 6, -8, 4, -11, -12, 5, 6, -12, -7, + 19, -18, -8, -16, -22, 1, 3, -6, -23, -1, + -1, 0, 1, -9, -12, 14, 2, 20, -33, -16, + 21, 10, 21, 10, -3, 10, 2, 20, 15, 21, + 5, 30, 19, 3, -8, 19, 19, 12, -9, -22, + 4, 0, -9, 1, 1, 9, -25, -10, -9, -4, + 15, 1, 17, -9, 11, 29, -15, -34, -2, -3, + -1, -13, -32, -17, -8, 1, 51, 14, 13, -5, + -13, 31, -5, 8, -17, 24, 8, 0, -13, 17, + -7, 14, 2, 16, 23, 1, 4, 5, 6, -5, + 2, 3, -10, 5, -27, -1, -21, 1, -6, -10, + 30, 4, -6, -14, -4, -14, -14, 16, 1, -6, + -11, -4, -1, -17, 5, 8, 8, -13, 6, 5, + 0, 4, 3, 5, 13, -7, -6, 18, -15, 3, + 22, 12, 10, 8, -7, -24, 3, -24, 1, -3, + 4, 3, -6, -2, -35, 2, -19, 5, 1, 26, + -6, -12, 2, -11, 3, 10, 10, -6, -26, 17, + -19, 3, 12, 0, 2, -1, 3, -18, 9, 9, + -17, 4, -11, 7, -5, -18, -12, -5, 29, 10, + -10, 2, -2, -10, 6, -11, -10, -16, -5, -1, + -29, -39, -9, 21, -2, 12, -19, -3, 4, 14, + 8, -14, -5, -1, 16, -4, -16, -1, -1, 19, + -3, 1, 3, 13, 20, 8, 6, -9, -12, 1, + 23, -19, 7, -3, 5, 4, 1, 8, 4, 31, + 2, 34, -6, -3, 11, 17, -2, 3, 14, -7, + -17, 2, -2, -37, -16, 3, -7, 8, 12, 0, + 2, -18, 2, 6, 17, -4, -11, -1, -2, 11, + 11, -4, -4, -23, -5, 26, -3, -9, -6, 55, + 11, -11, 0, -12, 4, -17, -10, 13, 11, 10, + 2, -25, -14, -13, 7, -13, 5, 4, -25, 7, + -22, -21, 19, 1, 1, -13, 29, 15, -22, -4, + 26, 28, 12, -12, -10, 6, -31, -4, 14, 18, + 10, 11, 9, 10, 22, -3, 19, 20, 9, 18, + -11, 11, 17, -9, 2, 5, 31, -22, -20, -19, + -17, -6, 2, -2, -1, -9, 15, -11, 7, 14, + 2, -25, -1, 14, 11, 4, 0, 0, -14, -9, + -10, 3, -5, -12, -5, -12, -3, 2, 9, 11, + 37, -4, 20, -10, 15, -37, 1, 20, -9, 10, + 8, -6, 12, 4, -1, -5, 17, 6, 2, -14, + 16, 13, 20, 1, -9, 21, 20, 15, 6, 18, + -9, -2, 10, 12, -8, 12, 22, 22, 9, -16, + 8, 10, -7, 9, -25, 21, -7, 2, -7, -34, + -3, 27, -4, -27, 5, -1, 1, -7, 1, 21, + 3, 13, -7, -19, 2, 26, 4, -9, 3, 17, + -11, -5, 29, -5, -21, -12, 24, -21, 26, -3, + -13, -15, 8, -13, -3, -4, 14, 12, -1, 33, + 13, -10, 12, -6, 9, -5, -6, -13, -20, 5, + 13, -23, -4, 17, 1, 28, 3, 11, -2, -8, + 21, 21, -5, -4, -3, 15, 13, 6, 14, 8, + 8, -15, -16, -3, 8, -15, 19, -15, 12, -8, + 9, -20, -1, 11, 4, -13, -24, -5, -7, 6, + -1, 3, 23, -7, -2, -13, -10, -8, -22, -34, + -2, -3, -9, 11, 11, 6, 20, -5, 34, -4, + 24, 41, -6, 11, 2, 4, 2, 5, -26, -18, + -3, -10, -5, -6, -24, 1, -6, -21, -9, 3, + -1, -4, 3, -3, 21, 6, -14, -13, 5, 2, + -10, 8, 20, -7, -10, 24, 11, 16, -6, -6, + -5, -7, -12, -8, -2, 14, 11, 2, -1, -15, + -1, -2, -1, -27, -7, 11, -12, -16, -14, 7, + -17, -16, -14, 3, -13, -16, -15, -1, 0, 24, + 29, -25, -4, 15, -1, 16, -7, -14, -21, -7, + 11, 9, 19, 4, 6, 1, -11, 3, -2, 8, + 2, -15, -17, 0, 2, 13, -7, -18, 16, -7, + -23, -21, -24, 0, -9, 26, 5, -15, 3, 11, + -8, 20, 9, -6, -1, 2, -8, -3, 7, 8, + -13, 0, -11, 1, -2, 9, 17, 15, 21, 7, + -2, -7, 42, 7, -16, 8, -7, 0, 3, -4, + -9, 0, -40, 5, -12, -3, 3, 1, -1, 29, + 16, -24, 27, 1, -7, 15, 16, 3, 28, 3, + -8, 23, 18, 5, 29, -4, -13, 16, -24, -9, + 27, 10, -10, -22, -13, 21, 2, 16, 16, 22, + -13, 22, -4, 10, 32, -37, -23, -6, 0, -13, + 2, 8, -6, 4, 9, 11, -16, 8, 2, -16, + -17, 9, 10, 17, 2, -6, 5, 2, -7, 9, + -4, 0, 12, 14, -25, -19, 10, 9, -12, -28, + 10, 1, 6, 4, -15, 12, 16, -23, -5, 21, + -3, 10, 13, -1, -12, -16, 30, 15, 13, -3, + 1, -2, -1, 0, 10, -16, -37, 27, -33, 12, + -5, -21, -10, -10, -19, -6, -13, 19, -15, -7, + 2, -10, 40, -5, 22, -4, -8, -22, -3, 29, + -5, 10, 26, -26, -16, 0, 10, -12, -12, 21, + -20, 16, -7, -9, -6, 4, 30, 14, 9, -7, + 7, 1, 12, -2, -11, 0, 2, 25, 1, -15, + 13, -24, 21, 10, -9, 7, -9, 8, 4, -6, + -14, 5, 17, -6, -15, 2, 3, 20, 8, 16, + 28, 8, -24, 22, 15, 9, -1, 4, 2, -11, + -23, -18, 4, -6, 3, 14, 16, -21, 0, 0, + -13, -4, 5, 5, 2, -6, 3, -2, 24, -10, + 8, 17, 16, 25, -15, 17, 3, 2, 6, 48, + -38, -3, 16, -17, 6, -10, 5, -3, 2, -16, + 9, -8, 5, -6, -8, -10, 6, 14, -3, 26, + -13, -5, 9, -5, -18, 2, 15, -13, 20, -12, + -4, -18, 6, 10, 6, 7, 13, -8, 7, -9, + -6, -6, 26, 12, 2, -3, -31, 8, 4, 5, + -3, -7, 30, -15, -4, 11, -44, -18, 17, 6, + 6, 8, 30, -26, 1, -9, 25, 35, 9, -30, + -27, -6, 2, 18, -17, 26, -33, -26, -11, -14, + 14, -28, -12, 9, -3, -10, -10, 6, 14, 26, + 20, 14, -6, 20, -10, -15, 13, -6, 5, 4, + -9, -21, 2, -14, -4, -16, -11, 7, 18, -15, + -9, 17, 6, 11, -20, -2, 41, 2, -1, 10, + -13, 10, 15, 13, 12, -3, 9, -13, 34, -9, + 21, -15, -40, 8, 5, 2, -9, 13, 4, -5, + -3, -18, 26, -11, 24, 13, 15, 12, 34, -13, + -12, 23, 4, 8, 9, -5, -11, -3, 0, -22, + -8, 1, 2, -19, -5, -29, 18, -13, -2, -11, + -6, -3, 7, -20, 0, -30, 11, -10, -8, 1, + -14, -19, 20, -9, -1, 16, -20, 28, 4, -31, + 6, 2, 11, 15, 21, 28, -17, 3, -16, -3, + 29, 12, 19, 1, 15, 11, 23, 9, 17, 8, + -4, -9, -19, -7, 16, 22, -24, 1, -3, 0, + -10, -30, 14, -22, 16, -4, 25, 2, 2, 15, + -12, 43, -11, 4, -2, -24, 0, 2, 17, 6, + 21, -6, -6, -15, -49, -19, 14, 13, 1, 13, + 4, 7, 1, -28, 29, 25, 29, 6, -5, -6, + -33, 5, 16, -9, -16, 11, -16, 9, 1, -3, + 22, 13, -6, -4, 3, 17, 2, -1, 4, 6, + 3, 14, -5, 1, 5, -20, -7, 23, -2, -8, + -6, -5, -18, -3, 1, -28, -3, 15, -4, 4, + -3, -9, -5, -6, -21, 8, 7, 42, 16, 25, + -20, 18, 32, 4, 7, -7, 23, -10, -28, -19, + -20, 3, -31, 4, 24, 12, -9, 12, 25, -3, + -8, -7, 4, 26, 2, 3, 4, 16, -32, -11, + 23, 0, -10, -10, 8, 7, -20, -7, 12, 1, + 8, 4, -7, 19, 4, 10, 6, -14, 2, -26, + -16, 13, 3, -19, -4, 12, -20, -1, 28, -9, + -3, -9, -7, -3, -14, 4, 7, 22, 5, 1, + 10, 21, -2, -6, 2, -3, -12, -29, 13, -2, + -2, 22, -2, 29, 12, -10, 6, 13, -15, -5, + 4, 4, -38, -2, -22, 6, -18, 25, 4, 11, + -13, -3, 16, 9, 2, 5, -1, -13, -17, 14, + -7, -11, -17, -1, -25, 5, 1, 0, -27, 5, + 1, -28, 13, -5, -10, 7, -12, -21, -2, 0, + -26, 1, 31, -8, -11, 11, -13, -21, -5, 1, + -7, 15, -1, 13, 8, -16, 7, -5, -3, -16, + -2, 16, 2, -5, -10, 5, 6, 8, -9, 3, + 13, 20, -14, -2, 7, -4, 0, -22, -4, 15, + -18, 9, -4, 3, -4, 12, -18, 5, -16, -1, + 9, -12, 28, 18, 22, 21, -25, -11, 15, -2, + 4, -13, -24, -15, -19, 20, 11, -9, -5, 28, + 4, 0, 0, -28, 4, 42, -3, -11, -29, -31, + -10, 11, 5, -23, -10, 11, 6, -10, 11, -23, + -3, 2, -3, 14, -11, 1, 22, -13, -17, 3, + 8, -15, 8, -11, -6, 5, -7, 26, 6, 2, + -12, -3, -16, 5, 2, 5, -20, 26, 2, -2, + 8, 5, -10, -6, -12, -7, -15, -6, 0, -24, + -7, -6, -8, 0, 10, 8, 7, 2, 9, 18, + 13, -9, -5, 14, -28, 19, -7, 11, -12, 33, + 10, -5, 2, -24, 12, 0, -43, -9, -10, -37, + -2, 22, -9, 21, 4, 18, 1, -6, 19, -18, + -4, -2, 12, 6, 22, -13, 12, 15, -30, 9, + -4, -10, -24, 6, 11, 9, -2, -4, -1, -6, + 28, -19, -17, -32, -13, 16, -16, -42, -18, -10, + -32, 0, 6, 22, 4, -5, 10, -10, -2, -15, + -7, -10, 4, -22, -10, 18, -4, -3, 21, -14, + -20, 28, 20, 6, -11, -15, 1, 1, 2, -19, + 3, -6, -8, -10, 6, 31, -8, -2, 7, -7, + 7, -11, 1, -15, 2, -3, -4, 2, -11, 4, + 18, 28, -2, 17, 17, -14, -5, 3, 10, 24, + 13, -2, -6, 12, 9, 6, 1, -16, 1, -4, + 24, 5, 0, -13, 20, -12, -1, -2, -4, -24, + -22, -3, 15, -14, -10, 15, -9, -2, 11, 23, + -3, -5, -6, 0, 0, -9, 33, -29, 19, 0, + 14, 1, 7, 14, 7, -9, 7, 16, 6, 0, + -9, 4, -9, -22, -2, -1, 2, 7, 26, -8, + -5, 6, -6, 13, 12, 7, 2, 6, -28, -2, + -13, 7, 5, 10, 23, 0, 0, 20, -11, -18, + 21, -10, -13, 15, -31, -4, -21, -4, 2, -22, + -3, 13, -6, -6, -1, 8, 2, 11, -3, -11, + 4, -22, -4, 14, 6, 9, 23, 2, 10, 17, + -3, -4, 0, -8, -14, 12, 13, -15, -2, -18, + -4, -6, 1, 5, 5, 3, -25, 4, -12, 19, + 4, -8, 0, -1, -4, -1, 11, -21, 29, -7, + 8, 20, -2, 13, 20, -12, -10, 23, -30, -12, + 10, -1, -13, 11, 30, 12, -6, -11, -38, -31, + 1, 14, 9, -1, -19, -2, -13, -5, 11, 8, + -1, 7, -5, -16, -9, 9, 7, -9, 9, 4, + -1, -6, -3, -14, 12, -3, 15, 4, 16, -7, + 18, 11, 22, 0, -9, 15, -23, 10, -1, -5, + 11, -22, -28, 10, 7, -5, -19, -2, 7, 12, + -27, 13, 5, -5, -16, -30, -12, 5, 9, -7, + -10, -2, -7, 9, 7, 2, -11, 12, -14, 30, + 24, -21, -13, -10, -13, -16, 1, 10, -14, -6, + -3, -17, 10, -14, -8, -8, -8, 0, 68, -12, + -18, -10, -28, -2, -2, -12, -4, 15, 2, -11, + 12, -1, 5, -3, -17, -13, 11, 14, -7, 6, + 4, -15, 14, -11, 2, 22, -8, -15, 15, 0, + 21, 7, -24, -9, 12, 3, -2, 7, -18, -11, + 18, -1, 8, 4, -4, -5, -21, 1, 16, 2, + -11, -11, 2, -15, 23, -3, 2, -17, 13, 19, + -6, -22, 1, -16, -15, 3, 5, 20, 1, -22, + -3, 8, 10, -1, -3, -22, 2, -2, 3, 14, + -1, -19, 8, -31, 33, -3, 2, -22, 8, -22, + 11, -3, -3, 2, -7, 15, 15, 14, 5, -2, + -18, 17, 20, 0, -16, 2, 1, 9, -10, -7, + -48, -3, -10, -13, 5, -4, 6, -12, -12, -6, + 40, -2, -10, -4, -19, -4, -39, 0, -8, 18, + 41, 5, -13, -2, 3, -4, 38, 27, 7, -12, + 18, 11, -20, 1, -9, -12, -28, -13, 4, -21, + -4, -7, 23, -43, -1, -3, 10, 4, -10, 2, + 6, -9, -21, -4, 30, -18, 6, -11, -17, -15, + 12, 13, 2, -3, -47, 2, -16, 16, -8, 16, + 5, -7, -3, 0, 14, -1, 25, 5, 22, 0, + -44, -8, -2, -9, -6, -11, -18, -5, 15, -22, + 8, 16, -12, -3, 6, 0, 12, -12, 1, 23, + 0, -7, 15, 6, 12, 12, -4, 8, 11, 7, + 6, -12, -4, 9, 17, -16, -18, 14, -11, -12, + -3, -10, 3, 0, -6, -8, 3, -2, 30, 14, + -19, 11, 19, -4, -1, -8, 7, 15, 7, -12, + 11, 2, 16, 27, -9, 27, -16, 25, 22, -13, + 8, -15, 22, 19, -25, 11, -4, -3, -8, 9, + 17, -4, 2, 14, -1, 3, 10, -8, 12, 3, + 9, 11, 19, 25, -15, 13, 31, 18, -5, 6, + 1, -10, -11, -4, -17, 22, -6, -24, -21, -33, + 16, -16, 2, -5, -1, -2, 4, 23, 6, 2, + -31, -13, 11, -2, 1, -25, 24, 19, 8, 5, + -9, -4, -2, -14, 2, -17, 13, 10, 0, -6, + 4, 11, 20, 11, 8, 9, -9, -17, 5, -2, + -6, -7, 18, 11, -18, 23, 8, 16, 4, -2, + -10, -17, 10, 1, -10, 14, -12, 12, -26, -3, + 14, -24, -2, -17, 12, 22, 21, 12, -12, 13, + -1, 0, 11, 12, -9, -3, -11, -1, -30, -8, + -2, -24, 6, 12, 21, 12, -1, 11, 2, 29, + -17, -12, 32, -14, 4, -4, 7, 23, 34, -5, + -2, -6, 4, 1, -3, -5, 20, 1, 1, -24, + -20, 0, 6, 13, -16, 9, -12, -23, 1, -21, + 1, 5, -3, -8, -28, -4, -52, 6, +}; +const ALIGN(8) int32_t tensor_data52[64] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1410922, 1262191, + 1372153, 1475073, 1941890, 2010889, 1125058, 1318332, 0, 0, 0, 0, + 0, 0, 0, 0, 1024672, 1047798, 1806470, 1108315, 877045, 1761838, + 1697485, 1429260, 0, 0, 0, 0, 0, 0, 0, 0, + 1174478, 1209969, 1265983, 1056120, 1226231, 1347323, 875321, 1628929, 0, 0, + 0, 0, 0, 0, 0, 0, 1708566, 1502189, 1479074, 1453430, + 1188883, 1382098, 1871893, 941584, +}; +const ALIGN(8) int8_t tensor_data53[1024] = { + -19, -23, 24, 7, 8, 94, 16, -72, 20, 92, + 23, -89, 61, -51, 56, -55, 39, -41, -73, -15, + -53, 24, -41, 88, 20, 42, -24, 35, -52, -38, + 51, -47, -52, -66, -22, -92, -81, -22, 101, 54, + 81, 65, -29, 58, -11, 51, -44, 65, 13, -39, + -34, -46, 59, 52, 84, -46, -9, 1, 127, 22, + -25, 6, 39, 37, -17, 27, -76, 60, -60, 28, + 6, -9, -3, 24, 24, -24, 7, -31, 38, -42, + -12, 38, 72, 5, 77, 73, -55, -102, -10, 21, + -10, -41, 58, 9, -102, 95, 17, -2, 61, 7, + 29, 66, 65, -61, -110, -37, 127, 5, 35, -40, + 27, 23, 107, -3, 111, -77, -33, 37, -17, -6, + 1, -5, 45, -19, 96, -86, -29, -23, -80, 29, + 40, -25, 55, 17, 5, -17, -77, 8, -6, 51, + 28, -26, -107, 5, 84, 83, 5, -67, 113, -115, + -47, 68, 63, -66, -30, 78, -83, -104, 41, -127, + 4, -18, -69, 15, 29, 52, 7, 30, 17, 34, + -17, 52, 26, 30, -69, -26, 64, -31, -10, 5, + -104, -17, 22, -3, -31, -21, -26, 55, 6, 77, + 48, 52, -29, -71, 72, 52, 48, 33, 58, -85, + -77, 71, 11, -61, -2, 32, -79, 70, -27, 1, + -59, 8, -127, -10, -50, 1, -43, 26, 19, -117, + 41, 53, 100, -115, 9, 7, -38, 20, -62, -78, + -9, 0, 74, -52, -39, 102, -44, -107, 0, -18, + -63, -17, 24, -7, -44, 18, 36, 10, -24, -14, + 43, 70, 4, 29, 5, -4, 78, 30, 92, 56, + 56, 121, -28, 49, 127, 0, -96, 89, 46, -50, + 7, 88, 3, -52, -18, 2, 41, -46, 26, 66, + -63, -2, 69, -92, -21, 65, -79, -19, -81, 16, + 82, -16, -34, -99, -70, -50, 81, 22, 16, 23, + -1, -31, 23, -12, -37, 28, -47, 26, 61, 75, + -57, -71, -16, -54, -90, 38, 8, -81, -30, 99, + -52, -19, -31, -12, 14, 1, 2, -27, -73, 48, + 28, -10, -31, 17, -127, -19, -34, 5, -72, 34, + -71, -29, 15, 50, 36, -2, 10, 7, -74, -23, + 69, -43, 45, -48, -68, -85, 49, 57, -58, -32, + -35, -24, 32, 28, -20, 52, 42, 35, 88, -35, + -78, 31, 32, 32, 77, 30, -74, -29, -34, 88, + 19, -14, -3, -127, 25, -63, 111, 20, -54, -19, + -5, 59, 75, -34, -66, -38, 71, -35, 27, -84, + 88, -4, 66, 6, 67, 123, 23, -31, -110, -4, + 60, 92, -84, -2, -14, 86, -2, -50, -26, 18, + -37, 14, -39, -59, -70, 26, -70, -69, 42, 31, + 13, -15, -5, 15, 52, -29, 77, 0, 11, 32, + -102, -8, 66, 8, -63, 38, -127, 24, -20, 24, + -88, -61, 14, 112, -52, -47, 5, -24, 28, 6, + -2, -45, 75, -72, -44, 112, -101, 77, 12, -37, + 12, -115, -123, 43, 52, 58, 2, 61, -95, -46, + 0, 54, 56, -27, -18, 30, 68, -14, 72, 4, + -52, 8, -103, 43, -4, -21, 19, -69, -127, -38, + -4, -38, 20, -96, 64, 11, 9, 10, 68, -21, + 60, -13, 32, -1, 41, -12, -46, 31, -5, 51, + -17, -41, 60, 59, -30, 127, -44, -23, 69, -65, + -63, 53, 5, 103, -6, 23, -39, 86, 12, -62, + 35, -53, -88, -99, -54, -68, 53, -91, -85, -123, + -100, -16, 49, -40, -7, 127, -41, -16, -34, 34, + 57, 27, 69, -37, 49, 24, -44, 10, -19, -63, + -28, -6, -16, 44, -42, -16, 76, -56, 34, 0, + 13, 44, -85, -13, -6, -85, 3, 8, 62, -111, + -87, -18, 38, 13, -7, 29, 16, -42, 32, -21, + -14, 57, 51, 10, -18, 28, 71, 27, 42, 1, + -81, 82, 6, -29, -4, -3, -9, -109, 43, -65, + 103, -6, -45, -26, -17, 8, 9, 46, -68, 19, + -3, -21, 70, 48, -12, 35, -93, 17, 27, -95, + 94, 69, -5, -43, -117, -80, -64, 30, 94, -40, + -56, 109, -6, -1, -15, 67, -27, 103, 22, -105, + -43, 79, 15, -127, -45, 127, 0, -73, 49, -7, + 37, 92, -18, 83, 23, -98, 68, 56, -74, 5, + -1, 74, -20, -127, -74, 60, 10, 50, -29, 57, + -13, 78, 74, 66, 60, -78, -54, 73, 96, 31, + 62, 65, -27, -27, 59, -27, -3, 32, -10, -90, + -37, 31, -6, -46, -82, 64, 24, -59, 75, -66, + -44, 9, 127, -28, -39, -65, 9, 18, -24, -38, + -8, 67, -67, -24, -85, 47, 37, 59, 1, -81, + 108, 14, 38, 13, -80, -25, -12, -38, -91, 30, + -38, 73, -37, -15, -13, -21, -7, 39, 21, -13, + -13, 3, -17, 91, 14, -6, -2, 55, 33, -81, + 86, 16, 0, 36, 32, 67, -41, -87, -27, 30, + -20, 44, 31, 24, 68, -88, 71, -4, -68, 6, + 84, -77, 55, 25, -63, -43, 86, -70, 3, 43, + -12, 112, 34, 71, -123, -72, 28, 75, 80, -19, + -42, 61, -109, 62, -4, 69, 66, 5, 77, 30, + 96, 31, -4, 7, -2, -30, 25, -16, 11, 64, + 127, -35, 77, 45, 37, -67, -1, -15, 43, -70, + -40, 27, 13, -48, -32, 17, 19, -54, -37, 8, + -51, -60, -70, 27, 35, 30, -67, -8, 12, -18, + 3, 15, -48, -5, 19, -58, 11, -9, -27, -47, + -84, 23, 0, -11, -12, 31, -97, -32, -98, 51, + -127, -90, 39, -29, -56, -86, 21, -50, 107, 20, + 39, -17, 125, -97, -59, 86, -65, 81, 94, 81, + 39, -79, 44, -58, -62, -56, 4, -75, -64, 47, + -66, 49, 7, 7, -27, -13, 67, -75, 32, -27, + 110, -111, -4, -7, 28, -72, 110, -23, -17, -1, + -14, -12, 49, 48, 5, 75, 83, -37, 17, 18, + -16, 76, 49, 26, 91, 18, 5, -7, -73, -65, + -25, -55, 71, 94, -30, 26, 54, 64, -13, -127, + -20, 89, 58, 43, -12, 55, -54, 27, -93, 38, + 108, -20, -57, -48, -127, 58, -14, 75, -45, -118, + 10, -92, 54, 75, 45, -13, 46, -55, 29, 16, + 94, 6, -43, 42, -85, -72, 82, -23, -88, 57, + -108, -38, -127, 44, 15, -68, -35, 76, 13, 20, + -109, -127, 84, 53, 61, 77, -30, 89, -39, -1, + -40, -57, -28, 38, +}; +const ALIGN(8) int8_t tensor_data54[1024] = { + -66, -30, -64, -23, 0, -67, 38, -83, -55, 33, + -23, -78, -3, 89, -23, -16, 3, 16, -15, 67, + 2, 80, 87, 24, 0, 93, -58, 59, 14, -4, + -71, 38, 84, -71, -127, -37, 25, -104, -44, -19, + 34, -47, -44, 65, -89, -54, -18, -40, -5, -32, + 11, 95, 1, -3, 21, -62, -74, 28, -13, -45, + 52, -30, 24, -32, 20, 29, -20, -10, 6, 3, + 11, 3, 59, 30, -18, 2, 34, -70, -42, -37, + -54, 77, -55, 41, 34, -48, -54, -78, 1, -119, + 10, 88, 95, 127, 111, 32, 15, -27, 16, -20, + 75, 59, 57, -20, -30, -71, 126, -14, 51, -7, + -28, -46, 18, 35, -67, -21, 6, -24, 30, -85, + -65, 34, 73, 54, 117, 72, -13, 111, 2, -28, + 4, -62, -65, -35, 50, -66, 38, -127, 1, -52, + 38, 29, 46, -9, 74, -74, 30, 37, -95, 58, + 32, 111, -51, -12, -69, 6, 46, -40, 54, 59, + 30, 26, -5, 21, 22, -34, 29, -6, 64, 15, + 62, 39, -57, 49, -45, -30, 41, -110, 4, -62, + -90, 4, -59, 59, -51, -126, -77, 50, 100, 45, + 43, 38, -25, 83, 53, 32, 77, 67, -42, 19, + -97, -13, 127, -23, 59, -53, -106, 89, 79, 27, + 49, 44, -63, -103, 105, -30, 101, 76, 48, -36, + -76, 2, 90, 26, -69, -14, -49, -9, 12, -72, + 35, 103, 13, -108, -14, 127, 0, -72, -81, -25, + -36, 30, 52, -83, 47, -38, 43, -9, -26, -103, + -51, 97, 70, -79, 26, -54, -54, -19, -51, 119, + 13, 67, -68, -13, -51, 35, 101, -53, -32, -48, + 65, 20, -37, -13, -10, 75, -54, 3, 127, 15, + 63, 25, 64, -26, 68, -46, 25, -68, -38, -17, + 62, -46, -48, -46, -33, -5, -1, 91, -7, -101, + -94, 66, -103, 3, 49, -10, 17, -7, 5, 49, + -76, -6, 75, 74, -40, -49, 33, -54, -23, -53, + -10, 50, 60, 52, -10, -52, 11, 38, -3, -43, + -44, 15, -31, 60, -11, -33, -54, -18, -68, 101, + -43, -29, -46, 84, -93, 13, 83, 33, 18, 15, + 20, 79, 43, 19, -36, -15, 15, 14, -40, -88, + -55, 3, -65, -16, 77, 46, 43, -23, 38, -18, + 25, -34, 34, -109, -60, 79, -11, 56, -60, -41, + 112, -40, 71, -19, -21, 14, -65, 7, -24, -42, + -60, 22, -37, -2, 11, -16, -34, -11, 42, -31, + -12, 84, 85, -8, -36, -41, -22, -89, -27, -90, + 54, 36, 15, 48, -40, -110, -36, -127, -10, -58, + -25, 23, 15, -46, -1, 61, 17, 43, 29, 7, + 66, 1, 45, 58, -84, -73, -49, -77, -10, 58, + -71, -52, -34, -76, -92, 93, 45, -115, 45, -19, + -11, 0, -113, 109, -12, -8, 40, -17, -71, -54, + -117, -77, 44, 7, -17, 51, -51, 17, -26, -103, + 115, -109, 93, 30, -73, 81, -117, 32, 10, -13, + -52, -40, -22, 31, 67, -58, -37, 36, 79, -94, + -16, 10, -92, -21, -50, -23, 47, 13, 101, 41, + -32, 80, 27, -54, -13, -58, -11, -6, -68, -26, + -77, 17, -61, 8, 71, 26, 44, 53, -58, -1, + -27, 29, -11, -54, 28, 61, -8, -66, 51, 51, + -46, -90, -55, 67, -72, -31, 59, -26, 10, 23, + 7, -31, 54, 74, 14, -122, 47, 48, 89, 91, + 41, -107, 22, -54, -13, 31, 24, -34, -7, -65, + -28, -37, -46, -53, 19, -18, -22, -52, 21, -50, + 42, -22, 41, -7, 23, 39, 36, 16, 54, 15, + 101, -68, 127, -54, 21, -55, 14, -68, 76, -75, + 34, -29, 39, -12, 2, -11, -55, -56, -20, 127, + 63, -63, -2, 33, 1, -55, 76, -70, 54, -59, + 8, 26, -99, 41, 4, -72, -7, -33, 45, 17, + -94, 30, 8, 71, 22, 61, 67, -52, -69, 3, + 84, 13, -22, -27, 45, 10, -40, 54, 18, -81, + 65, -51, 32, 71, -10, 22, 67, -68, -6, -87, + 49, 93, -1, -18, -92, -127, -41, 53, -13, 70, + -61, -94, -4, -65, 28, -104, 79, -31, -5, 102, + 48, -46, -9, 7, -30, 36, -26, -34, -44, 16, + 15, 9, 1, -31, 94, 43, -16, 69, -39, -67, + 51, 37, 24, -66, -1, -114, -65, 65, -19, -17, + -22, 32, -91, 47, -24, -16, -65, 11, -79, 21, + 61, 46, -30, 2, -13, 97, 12, 38, -96, -39, + 71, 41, -32, -8, -26, 3, -48, 94, -5, 2, + 29, -30, 51, -13, -4, -17, -106, 81, -36, 23, + 43, -8, -92, 7, 8, -43, -70, 37, -21, 95, + -67, 110, -34, 80, 13, -30, 49, 12, 21, 21, + -97, -97, 35, 48, -40, 10, 32, -54, -1, -13, + 1, -77, -73, -17, 74, 17, -31, 72, -52, 18, + -58, 67, 61, -25, -14, -29, -127, -47, 97, 15, + -46, 112, 18, 9, 65, -78, -72, 49, 7, -35, + 13, 0, -66, -46, -88, 64, -21, 11, -45, 54, + -17, -1, 97, -2, 118, 54, 68, -48, -15, -4, + -77, -41, -36, 40, 26, -11, -45, -5, -33, 6, + 68, -58, -31, -73, 29, 6, -21, -59, -37, -23, + 16, 26, -38, 19, 53, 2, -68, -11, 8, -34, + -15, -6, -29, 3, 23, 72, -2, -71, 90, 42, + 19, 49, 17, 12, -38, -127, -20, 32, -7, -78, + -10, -79, -8, -84, 18, -40, 52, -44, -30, 77, + -72, -111, 23, -84, -82, -28, 59, 36, -42, 19, + -5, -14, -23, 67, 16, -58, -29, -2, -112, -31, + 13, -37, -25, 22, -4, -97, -80, -45, 73, 17, + -89, -7, -59, 66, -84, 54, 66, 41, -110, 105, + -28, 40, -27, 45, 66, -1, -41, 97, 83, -6, + -35, 121, -85, -37, -23, 58, -30, -19, 27, 14, + -100, -66, 33, -92, -13, 23, -14, 2, -113, 58, + -17, 37, 52, 28, -65, -30, -1, -46, -44, -68, + -34, -1, 19, -14, -36, -15, 5, -38, 5, -61, + -20, 64, 36, 10, -80, 37, -25, 14, -53, -12, + 63, 29, 97, -93, 20, 25, -17, 94, -51, -50, + -67, 9, 84, 67, -81, -62, 67, 21, -22, 37, + -18, -37, -38, -42, 89, -91, -13, 91, 96, 1, + -86, -35, 43, -33, -72, -63, -79, 45, 14, 10, + -49, -86, -26, -67, +}; +const ALIGN(8) int32_t tensor_data55[64] = { + -295672, 1365588, -78100, 158028, 887293, -562267, 379960, -2167548, 3027368, 4018131, + 3422905, 2845037, 2424679, 3784220, 3833201, 3939899, 596621, 999716, -426526, -654696, + 18235, 1080752, -218483, 1179791, 4386309, 3995732, 2865762, 3917728, 3811343, 3288539, + 3396537, 2985320, 2957672, -2267926, -164211, -1519597, -471674, 1025094, -166681, -329970, + 3231081, 3431900, 4789748, 3740261, 2535062, 2349611, 3366755, 2942566, 1443734, 2476009, + 1799673, 95880, 704045, -1908700, 158005, 142511, 4183286, 2376585, 3505882, 3822513, + 2901206, 2891253, 3622755, 4216363, +}; +const ALIGN(8) int8_t tensor_data56[3072] = { + 50, 25, 56, -39, -17, 103, 6, 96, 51, 48, + 13, -7, -20, 114, -90, -127, 18, -60, -100, -44, + -53, -22, 56, -79, -49, -107, 127, 42, -19, 18, + -21, -37, 30, -27, -7, 41, 36, 37, -27, -105, + 39, -50, 22, 24, -39, 58, -116, -56, 85, 51, + 44, -38, 51, -49, 8, -105, -3, -53, -83, 98, + 9, 24, 64, -127, -101, -74, -5, 61, 98, -28, + 55, 84, -65, -66, 71, -51, 97, -12, -93, 46, + -93, 59, -84, 60, -8, -127, -106, 87, 22, -12, + 39, -89, -22, -29, -87, 79, -90, -40, -29, 121, + -50, 12, -90, 43, -42, 114, -41, -109, 96, 24, + -62, 88, 27, -37, -31, 35, -28, 74, 9, 13, + 22, 3, 83, 15, -53, 40, 127, -23, -56, -12, + -20, 75, 4, 12, 35, -13, 35, -53, 63, -88, + -4, 54, -71, 40, 89, 42, 85, -93, 24, 33, + -10, -47, -102, -31, -90, -51, -103, 75, -89, -25, + 42, -26, 66, 33, 61, -123, 22, 68, 59, 10, + -15, -7, -24, 2, -101, 7, 74, 22, -4, -26, + 112, -29, 25, -91, -36, 27, -11, 4, -81, 47, + 57, 15, 37, 16, -31, -66, 34, 17, -75, 111, + 15, 15, -60, 85, -70, 85, -71, 2, -12, -75, + 38, 97, -117, -6, 53, 53, -23, 95, -81, -17, + 81, -21, 22, 15, 82, -25, 98, -89, 100, -73, + 127, 24, 10, 21, 49, 65, 63, 13, -50, 110, + 14, 105, 53, 10, 112, -127, -87, 30, 48, 45, + 25, 36, 65, -52, 37, -66, 12, 29, 37, 47, + -74, 37, 16, 61, 110, 43, 126, -56, -118, 47, + -27, 23, -39, 33, 23, -48, 46, 5, 54, -101, + -125, -56, 76, -76, -56, 14, 100, -12, -54, 10, + -38, 53, -64, -127, -25, 52, -30, 46, 45, 50, + 47, 48, 42, 5, -65, 38, 91, -28, 18, -5, + -83, 73, -94, -40, 8, 66, -38, -46, -33, 43, + -49, 51, -16, -4, 69, 53, 127, -19, 34, -83, + -65, -50, 43, -75, 66, 15, 25, -39, 24, -61, + 46, -107, 5, -118, -25, 1, -101, 82, 55, 47, + 49, -43, 36, 84, -63, -52, 90, 72, 2, -83, + 48, 82, -125, -4, 42, -127, -61, 64, -84, -82, + -26, -116, 3, 13, -2, 53, 73, 89, -61, -62, + -45, 32, -73, -42, -51, -28, -83, 47, 71, 14, + 6, -24, -51, 49, -127, 108, -3, 30, 1, 84, + 44, 16, 58, 127, -40, -73, -39, 95, 59, -24, + 69, 48, -30, 54, 98, 33, -65, -71, -74, 42, + -30, -103, -1, 68, -63, -75, -87, 87, 91, -6, + 10, 113, 59, 76, -36, 43, -19, 41, -32, -70, + -24, -43, 58, -127, -20, 47, -16, 5, 10, 45, + -47, 88, -25, -127, -82, 14, -63, -100, -44, -67, + 38, -41, -10, -75, 28, 81, -127, 77, -39, -24, + 10, -76, -5, -65, 5, -61, -104, -54, 11, 15, + -100, 117, -88, 109, 19, -25, -66, -74, 11, 18, + 41, -9, -108, -9, 121, -61, -69, 7, -21, -103, + 49, 86, -42, 17, -101, -78, -4, -48, 10, -16, + 28, 27, 3, 35, 3, -40, -23, -54, -95, 43, + -22, 64, -58, 61, 78, -53, 41, -42, 36, -42, + -35, -39, -8, 23, -43, 7, 28, -67, -71, 6, + -12, 18, -14, -9, -10, 10, -66, 25, 49, -11, + 8, 46, -7, -15, -39, -37, -11, 42, -35, -33, + -21, 22, -69, -55, -17, -29, -24, -72, -43, -27, + -67, -20, 83, 42, -13, 13, -23, 34, 28, 36, + -2, -46, 42, 11, 35, -17, -72, -58, 23, -80, + 4, 22, 0, 11, 35, -66, -37, 26, 15, 30, + -68, -30, 34, -16, -5, -42, 86, 74, -5, 32, + -5, -43, -57, -27, 79, -46, -30, -66, -18, -70, + -8, 40, 4, -61, -13, -31, -2, 56, 12, 98, + -28, -66, 32, -54, -10, -18, 5, -36, -25, -56, + -69, 60, 48, -31, -8, -11, -32, 71, -25, 7, + -42, -38, -69, 56, -54, 37, -3, 23, -11, 4, + 36, -9, -16, 9, 24, -27, -21, -36, 17, -12, + 19, 32, 8, 22, -39, 6, 3, -12, 86, -36, + -1, -80, 44, 56, 87, 31, 94, 18, 31, 21, + 57, 25, 40, 37, 29, 49, -7, 9, 49, 54, + 91, 41, -98, 10, -13, -12, 46, 84, 27, 41, + 29, -53, -54, -5, -33, -68, 30, -37, 15, 26, + 54, 31, 3, -15, -33, 40, 34, -10, -16, 26, + -31, -45, -37, 49, -65, -48, -66, -78, -28, -98, + -27, 27, 73, -22, 41, -16, 56, -27, -41, -67, + 34, 8, 64, 58, 45, -45, 37, 8, 50, -27, + -4, 34, 4, 28, 25, -40, -17, -59, -74, -47, + 6, 44, 78, -34, 8, 60, 36, -7, 57, -35, + 43, 45, 3, -65, -62, 17, -61, 3, -49, 58, + -7, 45, -48, 28, -51, 48, -102, -17, -60, 21, + 0, -53, -14, -51, 42, 21, 1, -14, 37, 60, + -8, -44, -32, 15, -1, -11, 65, 14, -8, -19, + 14, 26, -34, -35, -13, -38, 31, 88, 38, -10, + 17, 33, -39, 5, 7, -20, 39, 82, -45, 55, + 59, -18, 4, -52, -25, 54, 42, 43, -13, 44, + -45, 82, -9, 71, -62, 39, -68, -51, -47, -94, + 15, -83, 54, -18, 61, -8, -70, -57, -35, -31, + 57, -16, 35, -7, -50, -16, 23, 19, 9, -29, + -39, -34, -4, 35, 56, -32, -71, 15, 29, -5, + 41, 19, 26, 24, 24, 60, 17, 46, -13, 46, + 52, -35, -36, 25, 0, -29, 33, -7, -30, -41, + -12, -64, 25, 62, -24, 1, -53, 6, -3, -33, + -49, -27, -9, 47, 26, -23, -53, -53, -3, 34, + -24, 38, -32, 45, 127, 29, -41, -16, 52, 0, + 15, -37, 69, 14, -19, -81, -53, -103, 70, 13, + -97, 35, -28, -8, -15, 14, -27, -80, -31, 1, + 81, -44, 62, -58, 3, -29, -1, 77, 54, 40, + 28, -20, 32, 15, -15, -30, -10, 48, 11, 28, + -49, -27, 51, 48, 33, 8, 28, -25, -47, 40, + 4, 32, -90, -20, 47, -34, 73, -74, -63, -64, + -59, 27, 42, 66, -27, 8, -12, -35, 10, -48, + 6, -35, -33, 16, 79, 26, -2, 30, 58, 33, + -15, -36, 60, -41, 70, -46, -14, 18, -2, 0, + 90, -43, 12, 8, -32, 89, -61, 20, -12, -52, + 20, -10, 58, -7, 49, 54, -66, -15, 32, -52, + -14, 67, 51, 44, 0, 10, -61, 45, 39, -21, + 35, 18, 35, -45, 50, 59, -2, 0, -59, 37, + -32, -48, 38, 43, 4, -20, 17, -87, -50, 15, + -55, 7, 15, 66, 8, 15, 35, 10, -21, 43, + 14, -84, 31, 57, -23, 15, -14, -68, -7, -40, + 50, 57, 9, 6, 76, -58, 77, -11, -55, -33, + 17, 73, -83, -26, 36, 45, 43, 29, 2, 2, + 30, -87, 84, -16, -31, -56, 6, -73, -27, -91, + -76, 66, 1, -34, 44, -9, -17, 17, -47, 2, + -20, -65, 42, 68, 46, -93, -5, -26, 38, -19, + -23, 56, -10, 16, -25, 0, -39, -32, -45, -36, + 6, -61, 30, -91, 48, 19, 1, 51, 13, -37, + 37, 12, 21, -5, -48, 2, -13, 55, -12, 22, + 46, 47, 26, 23, -17, 80, -21, -28, 35, -58, + 12, -67, -2, 27, 28, 61, 9, -82, -28, 110, + 58, 9, 101, -77, -55, 6, 113, -90, -19, -32, + 95, -37, 33, -52, -16, 41, 13, -23, -18, 35, + -3, -57, -5, -28, 62, -93, -31, 62, 22, -86, + 36, 57, -51, -60, 36, -48, -22, -54, -12, -8, + 2, -20, 15, -30, 82, 15, 2, 7, 28, -52, + 39, 52, -44, -16, 59, -20, 54, -7, -5, 42, + -67, -63, 10, -106, -29, -82, 43, 4, 41, -80, + 31, -29, -17, -24, -55, -28, -18, 0, -62, 5, + 36, 11, 27, -50, -28, -8, 68, -2, 2, 13, + 22, -9, 80, 61, 69, 84, 88, -13, -68, 50, + 21, 4, -4, -43, -94, 30, 55, 92, 30, -51, + 18, 31, -22, 30, -13, 98, -43, 6, 61, -6, + 64, 35, -18, -62, -40, 58, -36, -45, 54, 45, + -18, 27, -28, 32, 57, -65, 67, 14, 56, 58, + -8, 48, 8, 60, -9, 50, 7, 33, 8, 63, + -64, 26, -78, -54, -34, 15, -5, -31, -49, 44, + -32, 34, 28, -23, -46, 63, 45, 7, 20, 81, + -23, -27, 57, -53, -44, -68, 18, 5, -47, 58, + -32, 1, 54, -75, -40, 14, 3, -26, 65, 61, + -17, 8, 12, 76, 33, 28, -2, -37, 5, -12, + 63, 27, 41, -24, -62, 22, -11, 4, -33, 25, + 12, -16, -11, -59, -8, 51, 55, 52, 72, 53, + -20, 47, -26, 59, 48, 25, -63, 50, 8, -65, + -83, 59, 59, 13, 18, -36, -27, 11, 9, 4, + 66, -31, -45, -34, -27, -52, -33, -73, -39, -59, + -53, -1, -16, 18, -28, 5, 78, -40, 27, 17, + 45, 61, -47, -17, -28, 17, 5, -8, 16, 2, + -6, -38, -53, -36, -80, -12, -26, -74, -14, 49, + 55, -5, -79, -19, 51, -52, -15, -44, -59, 53, + -34, -30, -23, 2, 30, -17, -30, -29, -37, -4, + -25, -39, -11, 16, -48, -52, -27, 8, -26, -11, + -83, 41, -3, 28, 38, 45, 79, -33, 15, 38, + -39, -18, -9, -29, -31, 54, -18, -19, -13, -58, + -11, 3, -46, 32, -20, 47, 106, 74, 93, -37, + -10, -108, -51, -6, -43, -82, -18, 77, -110, 64, + 5, 58, -58, -21, 20, 75, -10, -127, -97, 18, + 59, -75, 9, -86, 31, 3, -54, 34, -26, 62, + 58, -5, 20, 22, 11, 108, 56, 61, -75, 32, + 3, -67, 98, 1, -39, -91, -33, 12, 4, -5, + 114, 58, 2, 83, -14, -72, 26, -95, 32, 24, + 27, 24, -15, -64, -117, -44, 103, -34, 14, -58, + -64, 125, -69, -44, 55, 2, -45, -100, -30, 98, + -26, 72, -15, 69, 46, 44, 112, -49, 16, -16, + -30, -9, 34, 82, -36, -106, -26, -26, 15, 32, + -90, -91, -118, 37, 32, 25, 19, -32, -10, -67, + -92, 21, 88, 21, -84, -16, -57, 50, 35, -23, + 17, 61, 18, -30, 43, 39, 76, -54, -41, 51, + -85, 16, 15, -69, 45, 112, -90, -2, 127, 12, + -11, -100, -2, 127, 90, 15, -26, -69, -27, -32, + -21, -43, 108, 20, 104, 68, -32, -61, -22, 2, + -30, 115, 21, 62, -35, 43, -60, 65, -11, -16, + 50, -7, -37, -120, -69, -47, 43, -63, -61, 35, + 49, -11, 89, 24, 81, -48, -64, 54, -65, 102, + 68, -79, 12, 89, -49, 41, -31, 127, 30, -54, + -5, -66, -57, 92, 44, -103, -60, -97, -18, 95, + -94, 75, -109, 24, -15, 25, -101, 73, 95, -49, + -71, 19, 5, 22, -51, -35, -127, -52, -47, -49, + -78, -33, -64, 43, -23, 3, -89, 79, -10, 12, + 52, -7, -67, 29, -46, 33, -22, 73, 33, -60, + 16, -36, 68, -44, 60, 99, -84, 27, -5, 29, + -77, 15, 65, -3, 50, 127, 62, -63, 54, -7, + 74, -59, 3, 56, 21, -98, -55, -39, -87, -8, + 12, 2, 88, -33, -11, 97, 6, 7, -22, -25, + -53, 34, -53, -85, -67, -71, 127, -10, -57, 32, + 42, -35, -29, 30, 94, 50, -11, -127, -40, -21, + 33, -87, 89, -54, -11, 33, -70, -127, 94, 99, + -109, 59, 35, 17, -58, -69, 16, -65, 39, 85, + 8, -12, 4, 63, 31, -127, 78, 70, 109, -127, + 39, -5, 28, 46, 79, -56, 65, 35, 53, 48, + 96, -40, -84, -37, -80, 5, 36, 95, 15, -8, + -33, -2, -34, -62, -63, 15, -73, -119, 41, -33, + 59, 12, -60, -39, 25, -49, -35, -127, 101, 70, + -7, -74, -21, 30, -70, 35, 17, 106, 15, -70, + 101, -35, -59, 61, 59, -11, -19, 41, -31, -96, + 105, -6, -6, -81, -73, -50, -108, -27, 24, 42, + 9, 66, -127, -92, -16, 14, -4, 26, -53, 23, + -21, 69, 38, -16, 34, -35, 20, -5, -71, -24, + 83, -18, -15, -7, 127, 1, 90, -126, -121, -62, + -66, -3, -45, -41, 34, 31, -86, 16, 55, 41, + 75, 43, 74, -53, 32, 41, -39, 85, 85, -35, + 1, 38, -27, -1, 23, -99, -121, 33, -3, 97, + 39, -32, 27, -6, -3, -107, -38, 66, -81, -31, + 51, 50, -2, 87, -64, -36, -66, 38, 35, 74, + -45, -58, 41, -23, 0, 16, 64, 40, -43, -45, + -6, -33, -127, 7, -12, 8, -56, -83, -31, 7, + -40, -18, 48, -23, 51, -33, 16, 13, 21, -44, + 29, 4, -24, 18, 68, -30, -35, 4, -3, -27, + 61, 44, -6, 13, 42, -24, -33, 5, 19, 38, + -54, -46, 44, 20, 40, 23, -35, -52, -35, 44, + -42, -36, 26, 1, 11, 13, -8, 31, -33, -36, + 50, -60, 88, -1, -49, 4, -22, -9, -8, 40, + 40, 63, -3, -65, -5, 25, 14, -43, -26, 31, + -41, -6, 3, -9, -27, 70, -43, 37, 49, 41, + -56, 21, 57, 6, -8, 4, -21, -29, 33, -54, + 54, 51, 5, -39, -37, 5, 50, 1, -18, 47, + 23, -9, 5, 37, 17, -73, -67, 5, 92, -31, + -21, 36, -75, -33, 39, -35, 45, 34, -10, 62, + -60, 23, 29, 43, 31, -52, -67, 31, -11, 3, + 45, -43, 40, 84, 21, 21, 14, 65, -4, 36, + 61, -55, -28, -9, -44, 26, -22, -55, -52, -33, + 6, 55, -34, -14, -36, -16, 75, 38, -49, -23, + -29, 51, 10, -22, -59, 25, -18, 6, 28, 11, + -19, -6, -47, -17, -11, -71, 16, 15, -24, 93, + 71, -81, -56, -32, -51, -37, -36, -16, 10, -52, + 41, 29, -60, -65, 76, 1, 68, -86, 23, -38, + -96, 97, -58, 72, 37, 69, -80, 31, 37, 99, + 5, -61, -95, 61, -89, 42, -58, -42, 60, -45, + 58, -86, -10, 3, -59, -12, -25, 18, -39, -6, + -33, -4, -52, 31, -36, 31, 19, -13, -54, -19, + -7, 23, -21, 0, -49, -23, -4, -52, 16, 34, + 25, -1, -59, 15, -51, 58, 29, -47, -36, 13, + 67, 24, 30, -54, -52, -22, -51, 62, -73, -64, + -5, -5, 31, 30, -21, 10, -29, -38, -6, -18, + -21, 34, 53, 48, -38, 36, -37, 56, -43, 68, + 11, -36, -60, -42, -3, -48, 13, 38, 18, 55, + 18, -30, 60, -65, 42, -75, -8, 24, 16, -12, + 43, -30, 83, -98, 12, -20, -85, -56, -48, 23, + -1, -56, 68, 75, 85, 24, 20, 23, 18, 16, + -60, -56, 11, 3, -14, 31, -59, -38, -13, 22, + -45, 46, -21, 11, 50, 27, -12, -57, 10, -61, + -66, -44, -58, 67, 10, 88, 60, -8, 52, 65, + 37, -51, 68, -38, 57, 33, 24, 42, 15, -37, + -63, -49, -22, -14, 64, -5, -8, -32, -28, -78, + 0, 2, -25, -20, -60, -66, 34, 13, -12, -28, + 25, -7, -26, 12, 36, 4, 35, 24, 3, -59, + 25, -7, 19, 109, 46, -21, -10, 20, -25, -14, + -3, -21, 11, -28, 31, 27, 28, 53, 22, 8, + -26, 13, -21, -1, 9, 36, -24, -8, 53, 38, + -34, -31, 29, 75, 28, -16, -48, -28, -4, 18, + -10, 13, 78, -24, -67, 2, 71, 32, 49, 38, + -47, 56, 20, -60, -12, 29, -61, 19, 4, -50, + -31, 72, -23, 68, -10, 25, 38, 16, 48, -66, + -29, 68, 1, -1, -68, -96, 108, -112, -23, -54, + 6, -53, -73, -60, -65, -28, 35, 19, 4, -50, + 36, -31, 56, -14, -49, -17, -36, 38, 26, -68, + 18, -6, 2, -18, 6, -63, -14, 38, -19, 18, + -71, -57, -74, -63, -56, 36, -8, 20, 48, -66, + -3, -8, 36, -7, 43, -47, 10, 41, 46, 44, + 10, 62, 50, 31, -15, -2, -1, 24, -36, 3, + -9, -65, -26, -28, 50, 20, -13, 23, 51, -28, + 61, 43, -39, -6, -37, -32, -69, -10, -6, 33, + -52, 12, 23, 7, -46, 14, 46, 11, -64, 80, + -18, 47, 57, -36, 77, 29, 41, -44, -52, -29, + 44, -37, -75, -18, -75, -63, 15, 16, 75, 43, + -44, -3, -36, -65, -68, -48, 19, 26, 48, -18, + -47, 50, -29, 31, -6, 31, -24, 36, 56, 35, + 3, -59, 6, 127, -18, -62, -51, -44, 5, 34, + -50, 86, 9, -62, 47, -28, 60, -40, -6, -26, + 10, 66, -25, -59, -12, -15, 24, -9, -7, -42, + 35, 43, -54, 47, -29, -10, 50, 7, -27, -7, + 5, -11, 33, 51, 0, 21, -65, -2, 18, 43, + -52, -1, 3, 48, -26, 27, -67, 73, 19, 12, + 4, -40, -52, 76, -6, 64, 64, -20, -24, 31, + 3, 52, -24, -16, -12, 42, 32, 0, -13, -4, + 6, -66, -23, 50, -34, 18, 9, 22, -60, 35, + 88, -19, -40, 16, -11, 87, -84, 61, -46, -7, + -81, -19, 22, 35, 19, 31, -7, 35, 16, 24, + -52, 45, 48, 19, 53, 59, -61, -71, 40, -85, + -3, -67, 45, -33, 26, 10, -45, -28, 35, 41, + 9, -57, -69, 17, -25, -60, -20, 31, 10, 77, + -12, 34, -4, -7, -44, -52, -24, 63, 44, -30, + 72, 13, 77, 5, 78, 12, 37, 41, 48, 18, + -34, 19, -20, 66, -39, 40, 17, -54, -37, 7, + -12, 73, -25, 34, -5, 30, 11, 5, 35, -7, + -23, -19, 7, 30, 58, 0, 17, -18, -19, -49, + -14, 10, -36, -54, -34, -3, 3, 60, -30, -14, + 61, 1, -13, 5, -58, -26, -26, 51, 18, -20, + -56, 6, 80, -54, 28, 1, 9, 9, -90, 31, + -73, 7, 44, -66, -9, -21, -73, -85, 44, -52, + -18, 2, -24, 85, -89, 66, 54, -17, 58, 66, + 21, 65, 20, -10, 25, -21, 53, -1, 64, 12, + -1, -51, -31, 2, 19, 60, -52, -7, -2, 7, + -20, 59, -32, -52, 120, 56, 0, -75, -23, -17, + 31, -11, 22, 33, 33, 45, 3, 30, 35, 60, + -1, 34, 47, -17, -12, 23, -10, 67, -35, -61, + 58, 23, 49, 43, -60, 4, 44, -13, -39, -1, + 2, 15, 40, -69, 25, -18, 4, -35, -16, 13, + -29, -17, 30, 35, 26, -2, 16, -6, -32, -22, + -14, -34, -64, -40, 54, -32, -29, -52, 28, -4, + 37, 45, 19, -16, -22, -52, -11, -6, 62, 30, + 32, 8, -26, -78, 38, -42, 28, 12, -11, 83, + 7, -5, -49, -1, -25, 0, 22, 32, -54, 26, + -28, 23, -70, 48, 21, 3, -127, -56, -3, -39, + -37, -49, -104, -81, -24, -6, -48, -61, 69, -21, + 15, -24, -32, -45, 11, -40, 0, -34, -26, -60, + 35, -73, 49, -30, 8, -60, 9, -69, -12, -19, + -5, -55, -63, 29, 9, -29, -7, 5, -16, -25, + 30, -38, +}; +const ALIGN(8) int32_t tensor_data57[64] = { + 0, 0, 0, 0, 0, 0, 0, 0, 2479534, 2255083, + 2253812, 1975416, 1882117, 1882926, 2412723, 2101797, 0, 0, 0, 0, + 0, 0, 0, 0, 2075492, 1914287, 2888318, 2054113, 1576883, 1520125, + 1900458, 1995394, 0, 0, 0, 0, 0, 0, 0, 0, + 2320107, 2210501, 2704809, 2844197, 1706749, 2243372, 1708322, 1824117, 0, 0, + 0, 0, 0, 0, 0, 0, 2256915, 3655807, 2310079, 1963454, + 1599467, 1585931, 1833935, 2228244, +}; +const ALIGN(8) int8_t tensor_data58[2048] = { + -45, 103, 91, 60, 88, -51, 94, -5, -108, -61, + -77, 28, 21, 73, -12, 93, -75, -36, 65, 66, + 25, -33, 2, -17, 41, 57, -33, -32, -27, -57, + -30, 21, -78, -10, -65, 49, -48, -27, -28, -7, + 1, 67, 54, 56, -91, 100, 14, 21, 90, 39, + 96, 11, -42, -95, -15, 30, 19, 103, 97, 24, + 12, 33, 67, -33, -102, -25, 1, -4, 63, 90, + -46, 64, -75, 35, -66, -35, -22, 20, -62, -75, + 66, -83, -83, 29, 21, 62, -61, 45, -78, -57, + 25, -67, 15, -70, -58, -83, 44, -77, -2, 73, + 35, 11, -65, -59, 73, -36, 75, -23, 85, 63, + -11, 0, 56, -108, 38, 1, -78, 61, 31, -33, + 77, 8, -127, 35, -48, 39, -38, 16, -97, -33, + 81, -32, 31, 0, -95, -108, 6, -79, -17, -80, + 21, 13, 67, -81, -54, -31, 2, -51, -50, 0, + 14, -87, -24, 53, -127, -6, 58, -98, -41, 1, + -33, 71, -9, -30, -30, -49, 50, -46, -51, 78, + -2, -28, -37, 39, 4, 37, -44, 75, 64, -56, + -11, -45, 47, 28, 51, 18, -16, -26, -21, -63, + 14, -15, 5, 56, -50, 96, -25, -95, 105, 18, + 56, -6, -19, -14, 42, 67, 56, -48, 39, 62, + 55, 14, 73, 10, 113, -39, -118, -93, 73, 47, + 54, 85, 27, 127, 68, 59, 93, 81, 13, 48, + -81, -103, 24, -34, -127, 23, 54, 58, 75, 11, + 39, -6, 22, 92, 3, 27, 2, 21, 5, 34, + 26, -63, -5, 1, -35, 117, -127, -7, -20, 95, + -38, -1, 4, -31, -45, -51, -64, -14, 9, -80, + 76, 102, -38, -48, 73, 64, 57, 52, 89, 103, + 2, -23, 72, 47, 64, 50, -59, -35, -85, -18, + -27, 27, 110, 63, -29, -73, -7, -2, 24, 85, + 3, -56, -46, 27, 42, -56, 54, -19, -66, 2, + 39, -98, 94, -17, 21, 23, -36, 14, -10, -106, + -22, 88, -20, 53, -65, -72, -49, -76, -43, 33, + -62, 35, -79, 3, -26, 83, -10, -3, 3, -119, + -56, -91, 0, 42, 11, -58, -49, 27, 66, 55, + -48, 39, 65, 115, 88, 118, -104, 82, -43, -22, + -3, 84, -93, 18, 16, -54, -26, 4, -1, 9, + -57, -53, 63, 91, -57, -23, 64, 37, -76, 78, + 21, 53, -89, 32, -71, -65, 38, 22, 48, 56, + 20, 31, 65, 57, -16, -23, 73, -36, -6, 34, + -2, -62, 46, -22, -34, -17, -8, -9, 4, 12, + -12, -61, -73, 25, 24, -78, -55, -63, -62, 62, + -93, 56, -34, -70, -76, 62, 14, -70, 78, -43, + -75, -41, 22, 34, 33, 45, 26, -22, 12, -57, + -16, 76, -19, 33, 22, -61, -13, 47, 63, -36, + 96, -20, 10, 51, 13, -53, -8, 87, -23, -45, + -28, -82, -13, -3, 54, 35, 93, 35, 0, -106, + -116, -49, 11, 67, 39, -100, 1, -20, -12, 93, + 0, 32, -8, -114, -105, 29, 15, 59, -47, -54, + -26, 61, 87, -91, -87, -26, -57, -87, 8, 20, + -38, 6, -1, -90, 1, 92, -28, -10, 48, 1, + 4, -67, 25, -66, -63, -98, 70, -20, 7, -70, + -58, -84, 30, -83, -51, -34, 8, -23, 43, 95, + -76, 19, 112, -91, 119, -54, 90, -65, -24, -102, + -9, -45, 45, -19, -122, 40, 55, -26, -71, 55, + 97, -38, 75, 119, -56, -14, -24, 3, -32, -1, + -19, -10, -40, -79, 18, 4, -78, 59, -57, -37, + 16, -32, -127, 37, -35, 24, -48, -77, -36, -38, + -85, 7, 27, -74, -53, -20, 1, -13, 37, 2, + 32, 74, -24, -37, -114, 117, 17, -35, 30, 3, + -42, -105, 31, -4, -9, 37, -36, 69, 1, 79, + -72, 103, -25, -45, -51, 20, -57, -37, -10, 6, + -1, 116, -95, 68, -103, -17, -18, 15, 101, -76, + -33, -64, -50, -57, -15, -40, 48, -26, 11, 104, + 41, 102, -29, -27, 37, -21, 98, 70, -66, -54, + 70, 53, 10, 72, 6, 70, 94, -47, 53, -9, + 24, -46, -34, -45, -64, 54, -33, 64, -78, -42, + 51, 34, -20, -22, 48, -35, 34, -58, -76, -42, + 87, 16, -82, -58, 35, 36, 47, 16, -12, 91, + -12, 31, -6, -46, 15, 17, 49, 59, 25, 7, + -7, 11, -49, 22, -84, -53, -27, -24, -76, 18, + 74, 51, 31, 10, 66, 49, 35, 59, -4, 30, + -78, -20, 75, 31, -53, 90, -1, 49, -59, -15, + -41, 52, 27, 78, -28, -11, 15, -26, -28, -77, + -110, -46, -122, 59, 35, -63, 19, -19, -49, 18, + 27, -19, -67, -16, 64, -36, -57, -82, -41, 5, + 7, 31, 6, -19, -31, 57, -17, -6, -15, 72, + 24, 41, -107, -37, -82, -17, 2, -91, -90, -21, + 69, -84, -1, -20, -20, 121, 121, 127, -48, -21, + -18, 86, -27, -98, 30, 27, -8, 64, -48, 49, + -40, -50, -43, 111, -127, -37, -7, 50, -5, -2, + -51, -4, 100, 27, 10, -29, -13, 3, -84, 2, + -11, -32, -9, -51, -20, 17, 38, 46, 72, -45, + 9, -30, 13, -54, -59, 8, -5, -56, 19, -45, + -52, 119, -18, 49, -29, 17, -7, -44, -61, -11, + -78, 58, 45, -11, -66, 68, 101, 70, 51, -122, + -12, -5, 51, 58, 83, 5, 55, -6, -11, -75, + 7, 25, 10, -19, -12, 6, -119, -30, -49, 51, + -4, -6, 44, -22, -29, -58, -71, 33, -33, 46, + -89, 65, -66, -65, -61, 46, -5, 77, -31, 18, + -86, 64, -100, 19, -25, -24, -67, -26, -117, -56, + 43, 4, -65, 17, 47, 102, 43, -40, -22, -43, + -10, -95, 85, -53, 58, 55, -69, -31, -54, 13, + 42, 50, 27, -28, 3, 21, -31, -73, 76, 11, + -6, 4, -80, -127, 20, -38, -54, -9, -20, 65, + -23, -37, 31, -44, 96, 12, -2, -46, 63, -43, + -6, 7, 18, 52, 62, -27, 92, -56, -18, 41, + -28, 3, -63, 22, 36, 43, -45, -17, -33, 31, + 83, 24, -50, 65, 7, -41, 56, 63, -30, -103, + -32, 2, -22, -71, -18, -35, 49, 22, 59, 45, + 11, -44, 26, 66, -60, -77, 12, -27, 8, -11, + -34, -26, -40, 40, 45, -10, 13, -84, 18, 11, + -69, 2, -118, -127, -3, 12, -86, -23, -65, 96, + 32, -78, 9, -77, 38, -91, -14, 53, 3, 14, + 52, -2, -75, -9, 74, 5, -127, -49, 8, -3, + -11, 19, 21, -103, 66, -32, -32, 36, -15, 54, + 20, 49, 127, -4, -117, -11, 87, -41, 17, 3, + 18, 32, -54, -67, 81, -83, 62, 31, 21, 23, + 46, 28, -91, 0, 25, -12, -25, -76, 45, 39, + 49, -46, -23, -8, -44, 63, 36, -57, 21, 14, + -36, 21, 41, 94, 7, -16, 52, 75, -15, 11, + 94, -80, 39, -7, -87, 5, 39, 93, -21, 77, + 75, -48, -16, 109, -14, -78, -114, 9, -41, -67, + 77, 108, 43, -26, 104, -81, 20, -62, 42, -50, + -8, -42, 23, 26, 29, -56, -72, -53, -27, -44, + -14, -11, 53, 41, -71, -18, 27, 24, -20, -13, + -73, 24, 8, -99, 77, 107, -67, -38, -47, -26, + 75, -28, 40, 38, 38, -28, -2, 37, -84, 32, + -25, -7, 64, -2, -18, 48, 16, -32, -45, -17, + -65, 16, -75, 11, 70, -2, 63, 48, 51, 13, + 64, 8, 8, -29, 29, 92, -57, -8, 87, 98, + -6, -34, -46, 36, -80, -103, -22, -48, 96, 45, + -74, -106, -23, -44, -12, 51, 75, 12, -93, -26, + -17, -100, 57, -77, 23, -67, -49, -56, -81, 45, + 32, -35, -25, 12, 65, -45, 38, 38, -69, -38, + 3, 74, -71, 20, 26, 78, 61, -55, -35, -15, + -73, 16, -13, -5, -30, -70, -10, 5, 4, 58, + 48, -52, -65, 19, -24, -64, 68, 127, -55, 59, + 51, 39, 5, 36, 5, -32, -44, 87, 35, -56, + 16, 43, -1, 85, -4, -8, 62, 43, -9, 49, + 31, -88, -87, 67, -102, -57, 81, 105, 52, -42, + 116, 57, -103, -70, -32, -65, -32, 18, 15, 4, + -56, 83, 34, -44, 3, -50, 14, -38, 54, -76, + -58, -41, 114, 10, -14, -12, -29, -2, 59, -71, + 4, -46, 18, -79, -68, 64, -104, -59, 48, 52, + -65, 88, -61, -55, -74, -66, 42, 13, 30, -45, + -102, 127, 117, 96, 74, -55, -18, 39, -7, 39, + -87, -20, -57, -103, -7, -25, -72, 48, -99, -22, + -43, -120, -38, -25, 84, -3, 76, -26, -49, 96, + 69, -14, -70, 97, -44, -29, 6, 83, 60, 70, + -9, 19, 27, 31, -26, 108, -30, 30, -6, 48, + -57, -35, -120, 5, -50, 37, 42, -42, 5, -13, + 17, -34, -49, -23, -13, -42, -3, 24, -55, 79, + 55, 54, -98, -10, 81, 102, 23, -33, -28, -10, + -24, 40, -44, 33, 11, -25, -46, -31, -45, -4, + 51, -4, 5, -51, 43, 68, -91, 0, -35, 27, + -118, 75, 48, 3, 103, 18, -7, -41, -44, 21, + -25, -74, 54, 47, -12, 19, -66, -28, -97, -10, + -28, 23, 58, -45, 31, -70, -2, -60, -15, 11, + -17, 55, 26, -18, -71, -16, -15, -13, -31, -22, + 29, 42, -33, -4, -20, -9, 19, -25, -3, 4, + -93, -14, -107, 55, 26, 54, -98, -24, -13, 2, + -65, -55, -107, -8, 36, -22, -48, -43, -89, 1, + 32, -15, -13, 17, 8, -82, -39, -70, 15, -73, + 39, 32, -34, -100, -18, -31, -28, -59, 42, -53, + 54, 24, 19, 97, 10, -69, -38, 39, 73, -15, + -45, -65, 52, 122, -35, -47, -64, 14, -39, 33, + -1, -42, 63, -73, -59, 34, -16, 12, -54, -83, + -44, 53, -125, 6, -29, -27, 15, -47, -41, -25, + -40, -11, -27, 111, 42, -47, -33, -22, -83, -52, + 99, -81, -30, -50, -53, 94, 65, -89, 10, 19, + 58, 7, 76, -75, -46, 19, -9, 22, -5, -75, + 46, -8, 3, 61, 60, -105, 27, -47, -17, 65, + -28, 78, -10, 38, 16, 10, -18, -85, 56, 26, + 100, -105, -32, -119, 60, 57, -47, 34, 33, -30, + -59, 31, 85, -68, 38, -99, -5, -72, -76, -6, + 38, 4, -33, 70, 66, -41, -12, 47, -70, 17, + -27, 5, -28, 77, -6, 30, 14, 17, -28, 49, + -42, 19, 94, -112, -25, -36, -127, 56, -10, 20, + -41, 103, -20, -93, -50, -13, 40, 7, -47, -16, + 26, -31, -88, -69, 25, 37, 23, 42, 23, 18, + 25, -2, 46, -34, -59, -79, -27, -44, -22, -67, + 13, -71, 39, -119, -5, -45, 73, -30, 31, 37, + -46, -15, 64, -19, -60, 85, 49, 46, 3, 40, + -15, -3, 104, 4, 9, -11, 61, -52, -5, -2, + -34, 70, -19, -26, -31, -21, 25, 29, -10, -62, + -41, 46, 77, -67, -42, 60, 68, 31, 44, -28, + -87, 8, 24, -60, -91, 9, -78, -78, 69, -52, + -52, -65, 21, 30, -48, 57, -73, -8, -26, -13, + -80, 61, 32, 78, -32, -82, 55, 27, 92, -35, + -25, 68, 55, 43, 52, 44, -45, 10, -71, 0, + -69, 36, -1, 3, 103, -28, -28, -17, 97, -25, + 94, 46, 43, 84, -33, -55, 68, 117, -22, -31, + 26, 43, -12, -51, -101, -58, -28, 0, -68, 100, + 24, -19, -47, 8, -52, -41, 26, 6, 56, -49, + 52, -105, 37, -50, -35, -55, 7, -23, 62, -51, + 30, 25, -2, 7, 32, -39, -73, 30, -64, -83, + -18, 24, 78, 29, 37, -32, 56, -88, -83, 5, + -82, 36, -100, 47, 76, -101, -54, 76, 34, 110, + 4, 38, 53, 26, -64, 32, 3, -57, -69, -22, + -65, -6, -93, 107, 19, -19, 96, -36, -35, 127, + -50, 32, 90, 63, 36, 33, 29, 51, -82, 35, + 61, 30, -37, -9, -5, -51, 61, -28, 11, 25, + 35, 26, 15, 37, 85, 21, -94, 73, -86, -74, + 51, -30, 99, -88, -107, -18, 111, 67, -33, -29, + -25, 96, 33, 20, 8, -27, 25, 3, 59, 6, + 5, 14, 19, -26, 51, 20, 49, 34, 61, 87, + 107, 9, 20, -127, -71, 34, -39, 13, -103, 125, + -120, 58, -12, 48, -80, -22, 16, -81, -33, -45, + 91, -77, 55, 61, -12, -37, 63, -15, -5, -61, + 32, -38, -6, 8, -33, 21, 59, -51, -52, -60, + 93, -62, -34, -2, -33, -69, -74, -63, -12, 11, + 5, 59, -28, -49, -69, 36, 1, 53, 14, -53, + -19, 15, -72, 21, 55, 25, 36, 13, -9, -25, + 10, -22, -35, 63, 89, 50, -85, -119, +}; +const TfArray<1, int> tensor_dimension58 = { 1, { 2048 } }; +const ALIGN(8) int8_t tensor_data59[1024] = { + 46, 17, -105, 53, 7, 87, -84, -76, -34, 60, + 8, -23, -61, 4, 20, -77, -14, 72, 6, 11, + -16, -93, 20, 9, -16, -99, -19, 2, 29, 71, + 65, 43, 40, -19, 7, 35, 74, 20, 26, 63, + -68, 32, 17, -73, 15, 55, 9, -78, 46, -43, + 20, -39, -30, -98, -92, -28, 31, 116, -96, -33, + 94, -54, -25, -109, -88, -40, 89, -55, 55, -34, + 60, -24, 64, -103, -69, -85, -98, -73, -14, 127, + -90, 7, -101, 104, 17, 79, -127, 57, -46, -96, + 87, -70, -32, 121, 33, 0, -76, 92, -30, 18, + 10, 89, 53, -115, -91, -42, 30, -72, 42, -4, + 55, -3, -46, -21, 125, -55, -70, 84, 23, -70, + -70, 31, 2, -17, 86, 56, 78, -15, -51, 89, + 70, 99, 40, 72, -37, -98, -10, -2, -38, 77, + -40, -6, 67, 96, 7, 4, 5, -28, -86, 0, + -36, -46, 27, -36, 65, 1, 32, 9, -48, 89, + 8, -3, 20, 37, -41, 69, -1, 11, -23, 81, + -12, 26, -40, -101, -67, 70, 47, 60, -33, -47, + -9, 12, -11, -48, -63, -53, -19, 73, -39, -30, + 15, 28, -40, 5, 50, -6, -127, 64, -29, -54, + -92, -49, -34, -6, 78, -58, -39, -3, -88, 43, + -10, -32, -9, 8, -29, -32, -70, -72, 13, -23, + 6, 99, 39, -16, 49, -35, -84, -74, -31, 30, + -59, -78, 42, 4, -11, 5, 27, 70, -54, -98, + -60, -44, 34, -34, -28, -18, -47, -14, 28, 1, + -16, -44, 47, 31, 10, 105, 12, 44, -81, -49, + 25, -106, 20, 37, 11, 2, 30, -19, 81, 111, + -87, 4, -51, -39, -13, -49, -3, -23, -86, -78, + -54, -57, -97, 82, 43, -38, -85, -20, 105, 63, + 0, -64, -39, 24, 31, -28, -17, 20, -79, 3, + 21, 8, -20, -50, 82, -30, 76, -49, -29, 52, + 58, 19, 96, 23, -9, -11, -61, -8, -42, -71, + 12, -7, 35, -1, -63, -42, 23, 39, -71, 23, + -92, -47, 25, 59, -55, 39, 10, -86, -84, -28, + 2, 67, -18, 111, 27, -105, -13, 11, -102, -23, + -116, -15, -44, -31, 72, 93, -63, 23, 9, -23, + 42, -43, 26, 4, 127, 50, -14, -17, -116, -21, + 40, -48, -19, 54, 12, 36, 39, 29, -41, -1, + 38, 44, -72, 109, -90, -30, 24, -94, 46, -42, + -113, -40, 55, 47, -22, 127, 31, 11, 73, 47, + 4, -91, 12, 68, 57, -18, -103, 28, 23, -16, + 63, -13, -26, 26, -1, -47, -25, 5, -41, 42, + -61, 62, -24, -36, -1, 25, 18, -86, 91, 0, + -68, -26, -5, -61, -25, -61, -20, -30, -27, 43, + 32, 34, 40, 63, 127, 26, -55, 61, 2, -34, + 15, -10, 21, 0, -8, -18, 24, 81, 37, 32, + 84, -69, -9, 21, -62, -12, -100, 31, -9, -44, + 90, -77, -34, -25, -70, -10, 33, -69, -62, 45, + -66, 88, -17, 36, -66, 69, -35, 27, -20, -12, + -4, 35, -1, 59, -9, 10, -1, -90, 17, -47, + 52, 18, 14, -58, 14, -20, 33, -72, -45, -39, + -2, -121, 26, -22, -64, 29, -107, 79, 16, 28, + -54, -29, 23, 23, 92, 85, -127, -16, -14, 55, + 52, 78, 23, 7, 122, 16, -37, -71, 39, 7, + -93, 26, 63, 7, -53, -55, -59, -71, -2, -27, + -46, -66, -17, -68, -79, 63, 72, -2, -84, -22, + -29, -3, 23, 57, 14, 41, -58, -77, -47, 114, + 67, -26, 66, 11, -24, 68, -37, 90, -67, 39, + 10, -31, 26, -26, -38, 44, -63, 19, -47, 25, + 38, -1, -2, -2, -103, -64, -106, 59, 27, 14, + -35, -27, 83, 23, -44, -43, -90, 32, -15, 50, + 62, -18, 24, -63, -53, -70, -4, -10, -89, 13, + 45, -15, 40, -9, 22, -64, -39, 9, 12, -50, + -57, -51, 80, -62, 24, -102, 23, -35, 25, -14, + -53, 100, -9, 6, -23, -61, 65, -49, 32, -44, + -52, -56, -37, 59, 73, -16, 94, 3, -71, -51, + 45, -106, -38, 4, 18, 110, 56, -36, -39, 87, + -46, 67, -22, -88, 15, -41, -32, -5, -71, -40, + -9, -32, 56, -11, 15, -24, -23, 14, 28, -45, + 9, 15, 37, -72, 5, -25, -52, -13, 84, -104, + 46, -94, -78, -79, -46, 76, -9, 118, 108, -54, + -49, -52, -80, -11, 33, 111, -80, -77, 3, 42, + -17, 33, -29, -38, 1, 2, 23, -95, -15, -28, + -26, 85, -38, -17, -27, 15, 82, 64, 58, 2, + -47, -40, -31, -34, -30, -21, -56, 44, 76, 37, + 94, 6, -16, -8, -52, -5, 3, 1, 110, 15, + -39, 80, 34, 3, 76, -22, 16, -97, 29, -2, + -23, 105, -40, 74, -35, 13, 13, 44, -84, -19, + -27, 112, -70, 42, 3, 36, -87, -11, -35, -30, + -18, 44, 15, -31, 39, -46, -66, 36, -7, 14, + 82, 104, 70, -56, -38, -15, -70, -25, -112, -90, + -88, 51, 58, -49, -73, -32, -30, -3, 0, -21, + -68, 56, -61, -127, -32, 40, 10, -69, 61, -23, + -98, -94, -127, -1, 23, -86, -52, 5, -97, -13, + 52, 35, -54, 29, -34, -37, -81, -44, -6, 89, + -92, 52, 77, -76, -119, -62, -54, 40, -84, 69, + -66, -43, -86, 19, -58, 43, -63, 8, -44, -20, + 41, 124, -30, 59, -127, -36, 81, 49, -73, 49, + 37, 30, 78, 43, -66, 47, 60, 32, -56, 37, + 13, 71, 21, 52, -92, 60, -77, -29, 127, 12, + 47, 88, -43, -78, -66, 52, 7, 39, 31, -1, + -30, 5, 70, -9, -11, 72, 43, -40, 25, -68, + 94, -88, 29, 34, 86, -11, 97, -67, -23, 44, + -42, -2, 48, -10, 21, 9, -60, 41, 42, -20, + 55, 34, 127, 86, 46, -27, 5, -6, 11, 25, + 5, 46, -63, 58, 9, 37, 19, 21, 60, -43, + -11, 75, 67, 127, 17, -38, -3, -38, 13, 19, + 18, 34, -21, 39, 19, 10, -9, 7, -2, 127, + -66, -13, -81, -26, 9, 16, 91, -62, 54, -41, + -36, -26, 67, -64, 44, 3, 34, 8, 38, -11, + 12, 34, -34, -16, 36, -74, -12, 127, -20, 1, + -54, 83, -73, 4, 33, 78, 57, 77, 1, -70, + -33, 70, 8, 41, +}; +const ALIGN(8) int32_t tensor_data60[128] = { + -215666, -2383331, 646135, -452419, -955651, 1091328, -894699, 5382893, 1818252, 1461590, + 1238424, 1980048, 1814223, 1480754, 1238379, 1188519, -15383, 2032030, -1864283, 2964395, + -3256128, -2508580, -1010563, -786393, 2207101, 1671673, 1965189, 1618391, 1251573, 1275149, + 2076192, 1512240, 728014, 2205480, -3567267, 1175380, 707997, 749404, 902609, 873945, + 1639114, 1806520, 1486709, 2338822, 1756224, 1780331, 1917550, 1957335, 2562872, -970891, + 80609, 748096, -756308, 1018403, 2104092, 1236572, 1601754, 2196628, 1823208, 2591373, + 2421727, 2268735, 1561356, 1301627, 147096, 929642, -3289827, -1430266, 1691106, 3019516, + 844111, 1754681, 2100681, 1936575, 1318332, 1869985, 1912762, 1429332, 1807205, 1508088, + -1597314, -565664, -327860, 1145060, 565934, 719305, -945127, -2951056, 1628866, 1467416, + 1286185, 2380716, 1505860, 1756810, 1488342, 1655348, -142303, -34073, 1697464, -468824, + -244100, 2265863, 486471, 1581145, 1503295, 1476695, 1773035, 1560113, 1952878, 1917393, + 1486306, 1581345, 1929266, -1148686, -358631, -3105824, -1116729, -5826741, 1488180, -160320, + 1957071, 2120167, 1449494, 1878150, 2019439, 1681480, 1762451, 2462632, +}; +const ALIGN(8) int32_t tensor_data61[64] = { + -1217511, 1030411, -1089058, 2140044, 878989, -667805, 1335445, -2322320, 4178108, 4211640, + 2926468, 2592042, 3535532, 2643423, 3244405, 3336989, -1051594, -1265799, -460357, -246276, + 406440, -1071479, -1295261, 298717, 3247485, 4109903, 3562870, 4105409, 4086824, 3663109, + 4707079, 2167744, 1219278, 891224, 116486, 934610, -150901, -2022856, 1095687, 500106, + 2386105, 4829781, 4160560, 3367679, 2251886, 2762480, 4208977, 3924342, 1343647, 574349, + -179412, 479328, -1064746, -721988, -424757, 563460, 3453457, 3721704, 3222343, 3743342, + 3780527, 4463953, 3809471, 4349940, +}; +const ALIGN(8) int8_t tensor_data62[3072] = { + 24, 37, -77, -81, 90, -90, 115, 123, 21, 7, + 5, -6, -36, -9, 71, -112, 67, 38, -100, -13, + 88, 54, 107, 2, -62, -86, -28, 2, 90, 22, + 12, -125, 33, -68, -57, -94, -15, 39, 19, -82, + -16, -47, -65, 61, -118, 49, -79, -2, 75, -89, + 80, 19, -33, 24, -40, 49, -29, -91, -114, 82, + 86, -22, 63, 5, -99, -60, 64, 127, -65, -60, + 46, -33, -13, 17, 115, -21, -115, 7, 71, 80, + 125, 22, -34, -17, 127, 24, 30, -59, 66, -73, + 12, 92, 10, 37, 37, 53, -124, 106, -10, -12, + 94, -42, 30, -48, 101, -120, -111, -9, -32, -127, + 76, -27, -48, 13, 56, -30, 79, -78, 4, -20, + -123, 26, 31, -26, 127, -10, -42, 35, 18, 25, + -78, -78, 0, 75, 127, 71, -76, -24, -2, -94, + -79, 0, -124, -17, -31, -15, 41, 28, -6, -74, + -42, 35, -40, -5, -31, 51, 0, 42, -68, 40, + 98, 13, 44, -16, 62, 87, 103, 14, -44, -101, + 24, -101, 91, 80, -98, 24, 29, 77, 59, 56, + -11, 97, 33, -28, 36, -73, 29, 127, 8, -39, + -69, -68, -112, 5, -5, -74, -19, -82, -15, -103, + 38, -65, -10, 78, -39, -37, -100, 17, -39, 64, + -42, 19, -28, 71, 42, 92, -43, 6, -69, 117, + 1, -33, -68, -59, -13, 5, -59, 111, 76, 32, + -80, 90, 47, 65, 43, -82, -41, -81, 45, 14, + 43, 78, 106, -62, 67, -21, -86, 64, 102, 72, + -95, 127, -60, 62, -38, 32, -127, 36, -28, 103, + 19, 83, 109, 76, -47, -119, 7, 42, -60, 43, + 104, 87, 72, -70, 79, 1, -39, -78, 83, 10, + -99, -67, -120, -117, 127, -7, -6, -78, 67, 6, + -34, 49, -127, -89, 20, -65, 64, -113, -121, -62, + 11, -14, 76, -3, 75, 39, -67, 7, -4, -11, + 21, 127, -33, -38, -6, 109, 55, 27, 51, -9, + 38, 26, -52, 50, 18, 50, -48, 119, 46, 36, + 85, 40, -79, 37, 69, -38, 36, -121, 60, -113, + 58, 41, -16, 101, -11, 76, -84, 74, 105, 82, + -58, 86, -8, 76, 13, -44, -18, 14, -86, 115, + 38, 28, 34, 101, -58, 45, -9, 45, -103, 6, + -3, 32, 70, 106, 39, -71, -37, 1, -56, 75, + 31, 38, 108, -58, 5, -117, 29, -36, -29, 35, + 7, -45, -14, -122, -9, 20, 64, -75, 13, -88, + -4, 45, -42, 93, -69, 74, 127, 68, -67, 14, + -82, -64, 4, -86, 74, -88, 110, 61, 66, -3, + 63, 5, 34, -118, -113, -127, -3, -50, 91, 24, + 94, -64, 5, 106, -58, -54, -9, -15, 40, 39, + -15, -59, 3, 8, 33, -6, -46, -9, -48, -18, + 121, 49, -11, 50, -105, -41, 81, -38, 127, 30, + 39, 7, -9, 51, -55, 77, 127, -36, 83, -14, + -78, 11, 61, 72, 30, 25, 60, 65, 89, -1, + -18, -6, 23, 60, 11, 74, -14, 102, 12, 22, + 56, 47, -3, -62, -127, 35, -47, 19, -101, -50, + -11, -43, -51, 94, -65, 6, 56, 62, 11, 29, + -41, 22, 73, -6, 69, 23, 60, -37, -76, -2, + -56, 10, -31, 27, -6, 49, 32, -32, -27, 8, + 33, 84, 28, -46, 64, -69, -42, 56, 59, -63, + -61, -35, 26, 24, 8, -32, 23, -46, 55, 39, + 55, -29, 24, -7, -12, -17, -32, -1, 61, 44, + -39, 49, -25, -40, -33, 53, 17, -3, -71, -6, + -32, -37, 8, 33, -9, 14, -35, -16, 83, 47, + 64, -32, 51, 0, 10, -82, 19, -38, 72, -72, + -55, -91, -25, -2, 18, 6, -62, -39, -35, -60, + -73, -19, -83, -38, 85, 59, 80, -50, -52, -68, + -45, -8, -4, -31, 25, 19, -24, 47, -82, -72, + -48, 80, -87, 21, -19, -31, -2, -38, 47, -31, + -14, -68, -45, -87, 24, -9, -20, -24, 7, -22, + -8, 29, -57, -18, 21, -24, -41, -62, -30, -64, + 11, -51, 5, 58, 32, 28, -26, 25, -49, 22, + -66, 17, 8, 57, -13, -17, -34, 29, -34, 17, + 21, 34, 53, 10, -15, -6, -34, -44, 14, -46, + -86, -59, -65, 61, 38, -65, -19, 0, 7, 20, + -24, -58, -64, 25, -18, 43, 26, 20, -20, -48, + -27, 1, 30, -19, 58, 62, -20, 47, -12, -38, + -33, 13, 60, -26, 70, -39, -52, -33, 48, -19, + 32, 64, -34, -77, -82, -24, 47, 38, 49, -14, + 53, 11, -26, 82, 56, 20, -24, -30, 46, -60, + 28, -9, -42, -46, -15, -26, -62, 88, 47, 3, + 47, 37, -9, 19, -17, 57, 65, 32, -46, -61, + 4, -63, 22, 4, 26, 38, 37, 73, 37, 27, + 10, -58, 37, 53, -21, 40, 3, 36, -37, 75, + 73, 11, 48, -24, 64, 61, 58, 63, -18, 66, + 9, 22, -1, -16, -31, -86, -54, -5, 39, -42, + 20, 24, -33, 41, 35, 40, -41, -3, -63, 60, + -60, -62, -20, 97, 44, -29, 51, 70, -29, -17, + -37, -42, -40, -36, 51, 16, 9, 3, -16, -2, + 7, -19, 40, -79, 45, 80, -10, 18, 86, 15, + -17, -1, -68, 20, -90, -4, 74, -2, 23, 30, + -13, 40, -18, -20, -31, -65, -17, 100, 2, -4, + 49, 87, 32, -108, 47, 67, -11, 61, 32, 47, + -5, -60, -64, -56, -47, 33, -1, 7, 2, -32, + 3, -37, -2, 0, 64, 37, 26, -60, -56, 55, + -2, 29, 26, 29, 30, -8, 87, 16, -30, 44, + 67, 3, 42, -30, 62, 39, 34, -40, -36, 103, + -17, 45, 18, 31, 31, 18, 55, 13, 5, -1, + 33, 11, 1, 78, -4, 75, 41, 15, -36, 18, + -25, 37, -47, 40, 19, 35, 6, 12, 20, 26, + 57, 36, 60, 86, -20, 0, -10, -2, -39, -28, + 69, -11, -6, -56, -58, 55, -31, 28, 21, -64, + -49, 30, -2, -32, 40, -60, -46, -4, 7, 29, + 15, 30, -14, 33, -45, -7, -37, 39, -44, 46, + 14, 59, -43, 8, 16, 102, -24, -33, 42, 82, + -45, -72, 47, 51, -37, 36, 37, 1, 15, 65, + 12, -16, 32, 6, 53, 17, -20, -6, -68, -36, + 78, 29, 4, -56, 14, 32, 36, -2, -18, 0, + 40, 66, 44, -30, -38, 65, 22, 19, 94, -98, + 38, 73, 31, 50, -39, -18, -27, 33, -39, -14, + -28, 30, -42, -61, -49, -76, -41, 69, 61, 72, + -68, 4, 25, -29, 2, 52, 61, -54, 35, 9, + -20, -73, 4, -90, -43, -66, 10, 74, 5, -72, + 0, -55, -17, -8, 53, -16, -16, -35, 65, 7, + -67, 19, 59, 2, -22, 62, 13, 53, -26, -39, + -52, -57, 14, -55, 64, -66, -75, -26, -82, -51, + 15, -40, 29, -64, 16, -42, -40, -61, -50, -64, + 18, -55, 10, -27, 16, 32, -58, -3, -41, 15, + -47, 43, -17, -46, 10, 59, 57, -24, -54, 56, + -57, -82, 22, -22, -55, -36, -15, -53, -65, -42, + 26, 17, -16, 34, 28, -13, -28, -21, 76, 20, + 51, -60, -57, 7, -44, -41, -12, -9, -71, -23, + -47, 35, 36, -74, 44, 52, -68, -69, 6, -40, + 13, -24, -29, 49, -12, -54, 73, -26, 36, -19, + -84, -32, 50, -35, -88, 62, 54, 11, 12, 9, + 35, -78, -13, 2, -1, -43, 14, 39, -41, 86, + -62, 90, 53, -35, 10, 34, 43, 54, -62, -20, + -63, -10, 24, 40, 23, 36, 31, 29, -55, -10, + -37, 33, -42, -3, -3, 30, 18, -58, -39, 2, + -25, 12, 38, -40, -28, -92, -37, -24, 19, -40, + -81, -50, 44, -52, -56, 31, 48, -34, -24, -20, + 1, -52, 40, -40, 4, -20, -11, -39, 29, -3, + -10, -8, -17, 22, -61, 5, 74, 15, 3, 33, + -59, -4, 33, -16, 20, 31, 5, 35, -37, -41, + 21, -67, 42, -37, 74, -13, 74, 18, 53, -29, + 42, 37, 24, 45, 41, -90, -8, -59, -68, -46, + 33, 16, 49, -69, -26, 64, -78, 74, -75, -49, + 72, 59, 50, 31, -13, 107, -53, -67, 18, 85, + 10, 32, -39, -2, -57, 46, 54, -40, -24, -7, + -40, 23, 22, 59, 4, 30, 1, 0, 30, 49, + 86, 65, 16, 7, 52, -34, -23, -31, 43, 9, + 9, 5, 27, 16, -48, -4, 21, 67, 12, 15, + 33, -28, 23, 52, 53, -62, 9, -17, 28, 84, + 25, -4, -64, 21, -41, 55, -51, -23, -20, -79, + 98, 0, 2, -1, 68, 35, 11, 68, -30, -22, + -46, 52, -31, -11, 62, -27, 0, -52, -4, -5, + -10, -18, 76, -47, -90, -59, 23, -16, -4, -30, + -46, -62, 20, -45, -26, -13, 85, -34, 35, 30, + -51, -70, -41, -4, -11, -32, 13, 55, 26, -51, + -19, -51, 49, 26, -77, 23, 40, -18, -29, -38, + 22, -73, 28, 6, 21, 56, 27, -54, 72, -24, + 19, -10, 30, 50, -26, 3, -43, 77, -16, -38, + 62, 2, 13, -39, -4, -1, 49, -15, 76, 28, + 8, 42, -1, -53, 4, -14, 53, -56, 4, -8, + -65, 6, -54, -58, 22, 32, 13, -67, -32, -42, + -26, 13, -10, -3, 54, 14, 10, 25, 13, -16, + -38, 7, 26, 41, 16, 40, 43, -15, -15, -30, + 36, 53, 4, -53, 36, -81, 31, 15, -45, -8, + 51, -47, 35, -11, 79, 8, 36, -75, -12, -24, + -24, -34, 3, 17, -60, 9, -60, 31, -40, -127, + -83, -26, -26, 6, -71, -82, 76, -24, 115, 27, + -34, -37, 55, -45, -33, -69, -90, 51, -127, -74, + 46, -73, -77, 69, -39, 46, 32, 41, -91, -57, + -20, 5, -33, -101, -75, -7, 63, 29, -96, 86, + 4, 1, -36, -60, -37, -23, -28, -35, -37, 45, + 68, -93, -42, -28, 61, -30, -67, 45, 59, -48, + 83, -55, 15, 84, 58, 77, 43, -6, 102, 124, + -2, 78, 50, 93, 69, 90, 71, -31, 47, 88, + -40, 61, 33, 40, 6, 10, -62, 49, 97, -20, + 33, -81, -2, 47, 121, 66, 73, -106, -107, 28, + 15, 2, -96, 119, -57, -30, 27, 86, -4, -107, + 12, 34, 98, -10, -45, 24, -53, 64, -69, -35, + -18, 127, 22, 70, -66, 83, -127, -18, -23, -124, + -119, 10, -45, -22, 76, 56, 31, 26, -87, -80, + -115, -21, -99, 37, -98, -58, 12, -87, -36, -32, + -17, 20, -78, 92, -90, 24, 54, -45, -125, -85, + -33, 50, 13, 81, 55, -42, -65, 10, 24, 31, + 90, -80, 90, -118, -96, 62, -52, 27, -10, -78, + 97, -73, -69, 115, -65, 127, -89, 60, 1, 110, + -14, -16, 30, -59, -25, -51, -20, -24, 49, -49, + -23, 127, 48, 98, 116, -14, -8, -9, -98, 53, + -13, -64, 8, -78, -113, 38, 60, 10, -126, 70, + 124, -112, -44, -25, 83, 118, 61, 88, -96, 38, + 32, -105, 7, -53, 12, -121, -87, 82, 28, -44, + -70, 10, -71, 80, -75, 111, 60, 57, 47, 81, + -12, 24, -27, 17, -57, 10, -1, 26, 87, 6, + -20, -112, 39, 66, 22, 56, 16, -39, 13, -37, + 66, -42, -2, 43, 28, -88, 70, 95, 21, 40, + 76, 70, 22, -27, 27, 15, -78, -11, 32, 32, + -127, 20, -62, 48, 46, -46, -29, 64, 15, -97, + 61, -100, 84, 41, -7, 44, -33, 52, 21, -103, + 19, -88, 37, -44, 127, 50, -54, 34, -45, -127, + 13, -113, -3, -117, 95, 70, 102, 10, 91, 56, + -41, -93, -54, -90, -30, -3, 74, -31, -21, 89, + 8, -36, 10, 20, -48, 127, -40, -53, 40, 109, + -84, -117, 23, -16, -84, 45, 112, 126, 38, 24, + -127, 82, -90, -75, -48, 41, 20, 81, -86, -55, + 84, -22, -89, 32, -5, 31, 23, -18, 74, 25, + 6, -111, -39, 26, 76, 76, 102, 19, -16, -93, + -98, 12, -112, -53, 71, 48, 22, -20, 33, 105, + 71, -77, 11, -35, 0, -81, 73, -26, 127, -22, + -4, 94, -117, -35, -61, 71, 127, 64, 36, 28, + -87, 70, 16, 7, 43, -29, -105, -45, 109, 62, + -23, 23, 11, -107, 87, 40, -97, -50, 46, 25, + 59, -39, -31, 95, 41, -61, -44, -60, 9, -7, + 49, 25, -104, -118, 30, -52, 24, -10, -75, -33, + -18, 8, 9, 20, 104, 32, -127, -111, -23, 66, + -86, -69, -19, -65, -60, 95, -50, -67, -56, 123, + -64, -31, 106, -85, -109, -40, -127, -81, 126, -74, + 11, -29, -8, -122, -127, -24, -86, 98, 30, -76, + 20, -51, 59, -91, -67, -29, 5, 37, 79, 50, + -72, 68, 14, -44, -28, 11, -7, -17, -67, 17, + 33, -17, 17, -37, 33, -16, 46, -90, 0, -22, + 81, -49, 60, -97, -53, 11, -42, 24, 43, -20, + 7, 14, 7, 39, -17, 1, -52, -39, -33, 33, + -53, 16, 8, -13, 9, -44, -79, 58, -27, -8, + -13, -24, 45, 32, -63, -35, -1, 17, -24, 59, + 55, 56, -23, 61, -19, -33, 64, 68, 35, -69, + 30, -82, -58, -81, 31, -52, 44, 10, 50, -62, + -57, 12, -39, -32, 23, -3, 56, 7, 35, 2, + -5, -19, 66, 17, -2, 25, -89, -94, 42, -35, + -76, 74, 61, -32, -34, -41, 27, -92, 5, 16, + -9, -14, 4, -46, -11, -15, -5, -32, -5, 45, + 43, 82, -28, -42, -2, 32, -57, -55, 72, -47, + -51, 64, 66, -3, 90, -52, -83, 71, 42, -14, + -23, -10, 49, 16, -52, 54, 0, 5, 40, 85, + 39, 42, 99, -56, -90, 16, 16, -23, 13, -37, + -11, -33, -37, -9, 25, 16, -41, 66, 23, -7, + -15, -14, -12, 9, 25, -67, 40, -56, -25, -15, + 7, -44, 61, 54, 48, -49, -65, -32, 38, -72, + -31, 34, 30, 50, 31, -31, -49, 60, -49, 4, + 70, -25, -48, 42, -38, -58, 50, -87, 22, 9, + 68, 3, 97, -80, -84, 34, -21, -6, -3, 57, + -58, -10, -49, -25, -69, -23, 58, -36, -43, -10, + -14, -41, -97, 4, 33, 41, -16, 25, -14, -43, + -107, 0, -50, -51, -44, 43, -6, 73, -13, 19, + 59, 14, 78, -79, -3, 29, -35, -25, -22, -66, + 15, 22, 14, 21, 68, -56, 14, -37, 22, 5, + 0, 32, 47, 60, 14, 24, 16, 38, -10, -22, + 64, -73, -60, -23, -20, -58, 21, -13, 2, 47, + -53, 17, 50, -16, 36, -12, 5, -37, 7, -39, + -12, 54, 46, -10, 48, -47, -41, 5, -63, -46, + -24, 3, 15, 27, 62, 35, -75, 77, 47, -76, + -6, 23, 31, -27, 10, -66, 9, 61, 58, 46, + 20, -77, -21, 62, 12, -25, -47, 32, 27, 49, + 49, -20, 30, 68, 75, 86, 41, 8, -80, -60, + 36, 18, -28, -92, -35, 7, -93, 2, 2, -36, + -14, -38, 63, 65, -16, -80, 44, -45, -32, 42, + -82, -36, 44, 14, 6, -12, 33, -16, 82, -33, + -41, 67, 8, -31, 48, 44, -56, -39, -16, 58, + 28, -60, 15, -23, -43, 74, 46, -27, 28, -51, + -54, -79, -58, 79, 20, 72, -22, 3, 5, -56, + 31, -63, -80, -53, -70, -1, -22, -25, -36, -34, + -44, 3, -66, 7, -1, 14, -26, -47, -32, 28, + 54, 62, 2, -25, 32, 43, -36, -41, -15, -55, + 37, 5, 1, -42, 88, 4, -16, -51, 13, 20, + 51, 22, -5, 31, -37, -56, -19, 48, -40, -47, + -94, -36, 8, -60, -17, -64, 52, 43, -15, -36, + 8, -47, 44, 0, 59, 26, 30, -14, 87, 3, + -26, 13, 0, -32, -63, 0, 51, -7, -40, 28, + -32, -29, -71, -54, -44, 66, 2, 31, -38, -19, + 47, -86, -63, -64, -27, -43, -81, -59, -31, -14, + 59, -96, 62, -44, 9, -36, 56, 41, -19, -70, + 20, 12, 16, -44, 57, -49, -47, -1, 40, 20, + -94, -37, -31, -13, 59, -18, 1, -43, -78, 21, + -58, 12, 7, 45, 46, 19, -39, 46, 50, 15, + -11, -70, 16, -17, 23, -18, 15, -5, -48, -57, + -18, 51, 81, 52, -55, -38, 8, -8, -5, 89, + -69, -53, 63, -5, 24, -62, -11, -73, 23, -19, + 30, 40, 35, 78, 71, -95, 29, -17, -68, 29, + 6, -14, 62, 32, -21, -76, -29, -79, 13, -41, + -1, -18, 26, 12, 36, -60, 60, 57, 29, 2, + -28, 40, -51, -18, -12, -67, 43, 85, -76, 31, + -25, 65, 55, -10, 11, -31, 49, 79, 24, 10, + 25, -58, -71, 55, 65, -14, -14, 40, -32, 47, + 57, -39, -30, -46, 16, 12, 71, -21, -21, 12, + -11, 72, -68, -20, 28, -53, 63, -41, -11, 35, + 67, 38, -4, -67, 56, 14, -47, -2, -25, 56, + -17, 52, 41, 65, -2, -47, 38, -54, -15, 46, + -62, 62, 7, 51, 4, 66, 5, -40, 24, 24, + 26, 50, -50, -45, -33, 20, 72, -65, -47, 64, + -43, -52, 14, 7, -16, -69, -27, -21, -3, 27, + -15, -23, -30, -79, 82, 18, 13, -24, 17, 64, + 5, 59, 64, 53, -53, 36, -42, 11, 58, 3, + -10, -7, -7, -65, 59, 39, 74, 8, -15, 55, + -13, -55, 2, 72, 80, -46, -51, -64, -41, -39, + -28, -53, 65, 58, 41, -64, 29, -40, -37, 8, + -14, -23, 23, -23, -26, 7, 66, -10, 56, -11, + -54, -8, -63, 47, -41, -7, -5, -51, 12, 75, + -66, 14, -38, 18, 28, -56, -90, -56, 20, 50, + 13, 0, 77, -10, -9, -69, 8, 46, 80, 29, + -46, 6, 51, 3, -78, 47, 40, -44, 8, -5, + 16, 26, -24, -42, -34, 61, 36, -50, -40, -21, + -26, 53, 48, -19, 35, -20, 62, -70, 31, 53, + 43, 67, -12, -62, -85, -7, 81, 42, -2, -69, + 4, 60, -28, -21, 8, -75, 12, 19, 80, -14, + -6, -46, -35, -20, -46, -28, 15, 43, 50, 30, + 64, 9, 9, 0, 74, -3, 21, 22, 33, -81, + 43, 35, -19, 87, -2, -71, 105, 18, 3, 62, + 74, 25, -22, -41, -38, -30, 30, 32, -21, 75, + -44, 9, -25, -42, -9, 15, -56, -58, 13, 32, + 65, 1, 26, 29, -25, 80, -22, -36, 55, -23, + 13, -46, -41, -25, 69, -70, 48, -22, 8, -15, + 17, -28, 70, -64, -47, -13, -30, 31, -24, 55, + 72, 47, 37, 45, 20, -39, -4, 68, -19, 24, + -45, 15, -49, 8, 54, -14, 64, -54, 22, 22, + -9, -26, -36, 29, -49, 33, 29, -26, -23, 49, + 14, -55, -46, 36, 15, 60, -2, 39, -1, 36, + -46, -12, 26, 43, 38, -63, 65, -48, 46, 52, + -50, 2, 71, -32, -27, 1, -57, 14, 12, 67, + 51, 8, 87, -34, 82, -27, 28, -27, -2, -8, + 35, -13, -58, 58, -55, 53, -66, -62, 48, 55, + 19, -63, 41, -81, 91, 2, 2, -70, 13, 68, + 15, 35, +}; +const ALIGN(8) int32_t tensor_data63[64] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1957164, 1751923, + 1627537, 1497909, 1410056, 2435591, 2096979, 2677721, 0, 0, 0, 0, + 0, 0, 0, 0, 1731321, 1373441, 1884291, 1708016, 2117941, 1588153, + 1511531, 2235245, 0, 0, 0, 0, 0, 0, 0, 0, + 1236550, 1234813, 1625273, 1065099, 1409751, 1775209, 2097151, 1103851, 0, 0, + 0, 0, 0, 0, 0, 0, 1832332, 1892685, 1762715, 1934384, + 1682320, 1285692, 1972279, 1666300, +}; +const ALIGN(8) int8_t tensor_data64[3072] = { + -1, -50, -2, -4, 5, 15, 34, -25, 2, 30, + 7, 93, -55, -38, 6, 74, -37, 60, 79, -35, + -27, 63, 22, -72, 54, -52, 11, 66, 34, -101, + 4, -84, 29, 27, -102, -78, -2, 64, 4, -13, + -19, -57, 19, -23, -39, -6, -29, 45, 42, 55, + -18, -78, -5, 5, 26, -63, 21, 55, -27, 3, + 14, -6, 52, 75, 12, -29, -62, -35, -57, 14, + -2, 11, 40, -22, -17, 27, -18, 21, 14, -5, + 105, -26, 32, 67, 16, -42, -54, 48, 14, 23, + -28, -48, -31, -42, 65, 24, 89, 104, 7, 8, + 4, 8, -27, -42, -42, -16, -47, 3, -65, -98, + -34, 46, 39, 50, 0, 20, 74, -88, 20, -60, + 1, 64, 81, -33, 67, -60, -16, -11, -4, -112, + 27, -16, 9, 32, 31, 2, 53, 51, 58, -2, + 74, 21, 13, 6, 32, 21, 83, -43, 55, -127, + 34, -69, -53, 62, 10, -42, 112, 39, -23, 30, + -2, 19, -39, 55, 32, 76, 7, 41, -8, 28, + 18, -12, -51, -9, 44, 5, -36, -41, -65, 28, + 98, 45, 11, 72, 49, 64, -16, -49, 28, 79, + 19, 93, 27, 39, -8, -5, 24, 1, 37, -35, + 18, 42, -13, 11, 127, -32, -78, 71, 24, -98, + 42, -26, 5, 25, 54, -3, 36, -84, -29, -31, + 10, 4, 98, -48, 23, 12, -75, -10, -35, -9, + 23, -21, 7, 86, -59, -19, 76, 49, 57, -5, + 57, -65, 2, 61, 38, -55, -25, -4, -39, 6, + 69, 41, -10, -77, 58, -61, -15, -47, -55, -57, + -3, -29, 47, -36, 15, 41, -30, -43, 12, -6, + -35, -2, -35, 66, 69, -22, -59, -13, -27, -17, + 29, -83, 43, 1, -41, 23, 14, -66, 3, -86, + -3, 18, 28, -18, -9, -3, -35, 58, -31, -35, + -66, -97, -24, -12, 66, -87, -101, -4, -40, 5, + 37, 15, 72, 26, -21, -82, 15, -18, -77, 69, + -37, -13, -60, -26, -29, -28, 8, -21, 47, -42, + 0, 8, -6, 5, 47, -25, 10, -2, 9, -11, + -54, 34, 39, -65, -42, -1, 50, 26, -3, 29, + -29, 41, -51, -46, -73, 39, -53, 7, -50, -43, + 90, -70, -33, 50, -105, -81, 33, 68, -50, -13, + -15, -69, 76, -57, -26, 32, 0, 18, 41, 8, + 32, 30, -22, -36, 8, 9, -35, 22, -53, 106, + -27, -50, 56, 6, -50, 1, -40, -61, 45, 19, + -79, -112, -5, -33, 81, 17, -33, -74, 46, -37, + -18, -43, 29, 20, 55, -79, 29, 26, 66, 50, + -17, -9, -19, 1, -26, -90, -29, -32, 66, -71, + 29, 8, 19, 38, -40, 14, -14, 29, 13, 13, + 48, -44, 3, 25, 24, 15, 33, 7, -15, -60, + 1, 15, -3, -57, -42, -93, 27, 83, -17, 106, + -77, -57, -35, -14, 18, 5, 29, 14, -21, 71, + 22, 18, -6, -80, 35, 23, -60, 30, -31, 53, + -56, 13, 36, -72, 8, -2, 34, 8, 36, 49, + 6, -36, -19, 74, 55, -19, 9, -23, -106, -27, + 21, -3, 58, -62, 64, 9, -50, 71, 3, -78, + 43, -18, -25, -3, -10, -40, 14, 52, 24, 56, + -30, 31, 15, -48, -48, -19, 55, -56, 37, -27, + -48, -2, -13, 62, -6, -13, -1, 71, -5, 14, + 84, -23, 22, -7, -12, -11, -38, 36, -23, -4, + -1, 9, 70, -15, 8, -30, -48, 66, -3, -29, + -69, -20, 27, -94, 66, -80, 42, -28, 16, 59, + 18, -21, 51, 32, 5, -12, 40, 2, 0, 15, + 45, 6, 38, -7, 28, -48, -37, 36, 22, 12, + 10, 8, 37, 53, 27, -54, 37, -70, -79, 33, + -60, 104, 87, -38, 10, -45, 14, 2, 40, 73, + -4, -24, 51, 5, -27, -26, 23, 72, -8, 69, + 44, 26, 70, -61, 23, 64, 78, -50, -14, -4, + -16, 54, 50, -15, 33, -72, 19, 55, -20, 7, + 15, -33, -23, -16, 34, 27, -7, -17, -78, 40, + 35, -38, 6, 67, -22, 28, -43, -59, -17, -38, + 98, 25, 9, 21, -24, 28, 26, -21, -15, 124, + 43, 66, 35, -65, 73, -13, 27, -42, -40, -14, + 47, 22, 37, -62, -5, -34, 8, 14, -17, 17, + -16, -34, -40, 89, -15, 112, 42, -48, -45, -11, + 8, -32, 16, -76, -47, -7, -28, -9, 30, 35, + -48, -30, 15, 26, 70, 47, -35, 65, -49, -25, + -60, -45, 11, 0, 2, 53, -57, 58, 25, 17, + 36, 57, -10, 12, 91, -4, -5, -25, -36, 39, + -9, -66, 3, -1, -22, 20, -56, 29, 27, 10, + -40, -47, 20, 48, -60, 9, -32, -21, -58, 38, + -91, 2, 104, -53, 9, -25, 11, -60, 23, -14, + 20, -34, 12, 45, 4, 16, -65, -4, -26, -50, + -45, -70, 46, -2, 37, 44, -5, 2, -1, 68, + 31, -83, 10, 51, -41, -51, 38, 3, -7, -4, + 32, -4, -28, -4, 26, -49, 18, 15, 40, -21, + -45, -20, -41, -25, 68, 64, 112, 72, -36, 27, + 24, 16, 58, -71, -26, 59, -109, -4, -46, -75, + -3, 2, 28, -30, -16, 1, 9, -3, 22, -50, + 41, 7, 40, -7, 1, -35, 1, -15, -94, 75, + 12, -51, -42, -8, -15, -42, -4, 32, 2, 45, + -7, 15, -82, 53, -52, -31, -121, -48, 16, -71, + -21, -15, 59, -65, -71, -25, 14, -110, 74, 12, + 37, -17, -22, -48, 45, -30, 14, 17, -33, 63, + -40, 62, -9, 33, 19, -49, -101, -26, -39, -11, + -34, 37, -34, -99, -19, 52, -34, 39, 35, 60, + 12, -22, 23, 18, 42, -9, 64, -41, 6, -84, + 32, 14, 11, 70, -99, 58, 12, -18, 22, 3, + 61, -33, 24, 38, 20, 21, 37, -16, 58, -5, + 21, 40, -44, 19, -56, -15, 68, -47, -35, -62, + -39, 46, -45, 32, 25, 127, -55, -31, 42, 51, + 12, -56, 36, 80, 69, 4, -38, -34, -22, -37, + -76, 53, -13, 30, 18, 50, -39, 127, 36, 39, + 22, 27, -17, 20, -23, -59, 3, 13, -33, -1, + -6, 22, 54, -72, 25, -27, 21, 35, -23, -36, + -3, 40, -23, -25, -39, 63, 49, -10, -19, 3, + 2, 71, -42, 21, -48, 1, -34, -77, -91, 76, + 17, -66, 5, -21, -54, 16, -30, -18, -40, 43, + -4, 6, 49, 14, 28, -35, 10, -84, -11, 11, + -10, 5, -5, 4, 8, -32, 51, -27, -39, 96, + -69, -31, 111, -14, -26, 80, -33, -30, -59, 66, + -20, -69, -22, 53, -4, 27, 19, -8, -8, 4, + -42, 9, 107, 61, 12, -57, -102, -105, 3, 102, + -87, 10, 2, -39, 74, -50, -16, 125, 11, -28, + -30, 8, 6, -32, 29, 47, 1, -49, -1, 23, + -13, -24, -65, 42, -58, 27, -49, -101, -15, 39, + 70, -79, 62, -34, -53, -32, 27, -110, 72, 39, + 54, 39, -47, 12, -127, -72, -14, -88, -27, -58, + 34, 7, 112, -66, -7, -35, -24, -34, -37, 2, + 58, -2, -13, 20, -26, -13, 28, 45, -26, -127, + 44, -2, 23, 31, -26, 72, -43, 7, -21, -37, + -33, 47, 17, -6, 43, 6, -13, 33, 49, 26, + 32, -61, -62, -67, -76, 16, -13, 46, -70, -51, + -16, -70, 53, 45, -21, -29, -55, -9, 10, 13, + 4, -8, 77, 30, -15, -18, 52, -32, 68, 8, + 114, 45, 56, -8, -16, -19, -98, 59, -64, 94, + 103, 30, -13, 23, -81, -13, 12, -14, 35, -17, + -19, -88, -48, -24, 77, 50, 61, -50, 24, 7, + 89, 35, 48, 3, -33, -36, 55, -7, 23, 25, + -50, -40, 22, -95, 15, 23, 56, 3, -12, -77, + -50, 41, -25, -64, 77, 25, 11, -42, -49, -35, + -20, 8, -31, -1, -6, -56, 47, -48, 61, 54, + 4, 22, -44, -33, 58, -46, -17, 84, 47, 52, + 31, -1, -79, 72, -22, 74, 1, 12, -20, 76, + 78, -32, -127, 19, 45, 73, 42, -12, 26, 5, + 21, 13, -22, 18, -28, 16, -32, -37, 19, 39, + 99, 90, 35, -20, 28, -8, -74, -42, -5, 69, + -2, -25, -62, -21, 36, -27, 11, 57, -19, 73, + -67, 30, 63, 42, -3, -93, 66, -18, -9, 84, + 40, 16, -124, 43, 64, -39, -63, 32, -33, -33, + -28, 0, 46, 13, 6, 33, 34, -45, -33, 65, + -46, -23, 40, -55, -5, 35, -85, -2, -34, 32, + 18, 77, -107, 17, -29, 28, 49, -30, 3, 51, + -64, 62, -49, -21, 38, -34, 8, 68, -110, 18, + -81, -11, -28, -29, 41, -17, 17, 34, 33, 9, + 7, -44, -18, 46, 47, -17, -3, 17, -56, -74, + -8, 22, -70, 93, 42, -49, -6, 66, 72, 26, + -113, 51, 34, 27, 90, 46, -20, 55, -30, -23, + -59, -27, 3, 42, 15, -14, 42, 16, 21, -65, + 10, 57, -77, 88, 2, 10, -24, -55, 76, -31, + 30, 2, 40, -27, 34, -13, 13, -10, -8, 48, + -36, -6, -56, 44, -100, 118, 27, -55, -15, 96, + 3, 80, 40, -47, 38, 87, 31, 28, 40, -33, + 54, -65, 37, -52, 7, 56, 106, 6, 66, 88, + 49, 28, 8, -59, -43, 45, -27, -5, -27, -50, + -76, -36, 44, 67, 67, 2, 49, 29, -24, 3, + -57, 78, -10, 4, 20, -13, 65, 89, 45, 9, + 1, 42, -10, 37, 13, 2, -14, -48, -34, -9, + -16, 76, 78, -59, 34, 18, 23, -14, -46, 35, + -4, 56, -13, -58, -15, -72, -14, -78, -18, 36, + 84, 56, -13, -57, -44, -48, -91, -10, -19, -7, + -20, -22, 82, -40, 10, 45, -38, 35, -52, 0, + 18, 125, 10, -37, -2, 54, -17, -6, 33, 2, + -29, 0, -27, 56, -107, 32, -3, 90, -22, 44, + -9, 43, -10, 16, -16, -60, -32, 21, -77, -76, + -53, 21, -92, -14, 38, 20, 40, -9, 58, -42, + -5, -9, 17, 16, 101, -24, 110, -19, 127, -63, + 89, 82, -114, -54, -62, 49, -24, 9, 126, -110, + -1, -50, 37, -25, -88, -113, 2, 37, -105, 45, + -106, 13, 12, 1, 82, 32, 48, -57, -35, 75, + -30, 42, -2, -17, 9, -77, -106, -37, -56, 54, + 49, 37, 95, -85, 110, 4, 5, 54, 106, -61, + -106, -35, 40, -22, 89, 14, -64, 21, 4, 21, + -37, -25, 26, 20, 27, 3, -64, 27, 95, 63, + -22, 9, -4, -50, -27, 15, -59, 22, -63, 30, + -75, -44, -65, 29, -15, -1, -26, 29, 102, 56, + 1, -84, 85, 1, -21, 7, 29, -95, -38, 16, + 2, -73, -32, 45, -20, 10, -77, -29, -72, 110, + -8, -9, 22, -70, 32, -26, 32, 41, 14, 86, + 94, -29, 7, 69, -51, -24, -36, 42, 20, 27, + 14, -56, 79, 63, -68, -21, 35, -15, -24, 44, + -32, -14, -60, -49, -17, -2, -86, 48, -49, -92, + 48, -14, 97, -64, -40, -33, 1, 29, -22, 66, + 39, 2, -39, 46, -1, 39, 27, 53, 87, 21, + -20, -40, -30, 30, 39, -37, 55, 33, -19, -30, + 45, -83, -32, -8, 10, -63, -41, 33, 3, -25, + -30, 56, 105, -40, 45, -70, 91, -2, -22, 23, + -21, -32, -28, 18, 64, -63, 94, 14, 39, -40, + 3, 16, -55, -97, -40, -41, 59, 40, 72, -36, + -39, -51, 20, -74, -84, -33, 58, -91, -9, 47, + -112, 70, -103, -26, -48, -8, -21, 43, 27, -22, + 42, 117, -14, 95, 6, -22, 4, -60, 28, 44, + 88, 25, 13, -87, 24, -70, -10, -75, -85, -121, + 14, 1, 56, 73, -109, 8, 41, -38, -11, -62, + -16, 40, 33, -66, 87, -89, -52, 127, 72, 15, + 8, 101, 80, 63, 53, 48, -79, 32, -7, -72, + -16, -88, -29, -19, 17, 72, -7, -67, -47, -4, + 83, -125, 58, 15, 16, -19, 118, 5, -93, 34, + -18, -36, 4, 36, 29, 26, -43, -72, 30, 21, + -19, -47, -28, 83, 56, 20, 16, -11, -13, -88, + 48, 99, 62, 18, -51, -15, -102, -94, -8, -15, + -8, -34, -82, 124, -14, 10, 38, 26, 37, -41, + 44, -66, -11, 37, -18, -71, -73, 81, 24, 95, + 8, 41, 0, -106, -56, 3, 78, 14, -22, 7, + -73, -111, -15, -101, -42, 106, -23, 39, 41, -39, + 17, 31, -31, 25, -127, -11, -7, -29, -1, 43, + 33, -122, 23, 52, -29, 4, 34, -33, 68, 0, + 7, -5, -38, -126, 14, 29, -77, 1, 61, 88, + 43, 93, 53, -79, 5, -37, -23, 31, -75, 26, + 21, -51, -61, 39, 21, 3, 47, 21, -25, -8, + -64, -11, -37, 23, 30, 48, 1, 14, -18, -43, + -53, 61, 74, 11, -54, -64, 21, -5, 67, 1, + -62, 1, -37, 75, 31, -49, -63, -21, -35, 9, + -42, -30, 96, 47, 18, -49, 36, 31, -58, -30, + -7, -45, -44, 46, 69, 25, 44, 22, -19, -15, + 45, 0, 58, -39, 91, 89, 12, -77, 67, -37, + 0, 119, -72, -18, -43, -74, 22, 39, -49, 20, + 127, 15, 34, 49, 7, 24, -65, 33, 47, 54, + -6, 3, -28, 49, -28, 87, 60, 60, 38, 3, + 97, 14, -67, 57, 7, -39, 40, -23, 100, -9, + -70, -83, 68, -16, 34, -29, 13, -18, 26, 0, + -63, 68, -53, 15, -61, 36, -69, 4, -13, -26, + 69, -47, -8, 29, 84, -42, 62, 115, 40, 20, + 51, -94, 81, -21, -36, 64, -38, -33, -54, -44, + -10, -67, -52, 66, 120, -2, 69, 35, -61, 66, + 8, 50, 88, 34, -13, 67, 10, 43, -8, 67, + -8, -49, -2, 70, -30, 52, 2, -42, 3, -52, + -48, 25, 83, 24, 40, -10, -15, 28, 23, -22, + 10, 84, -59, 26, -34, -76, -17, 21, -51, -48, + 84, -69, -7, 51, 77, -95, 103, -33, 103, 44, + 88, -67, -1, -27, 54, -83, -82, -55, 36, 7, + -18, 39, 54, -29, 77, -21, -18, -17, 5, -37, + -44, 114, 56, -95, 46, 47, 45, -51, -43, -11, + 9, 9, 63, -55, -35, -11, -100, -31, 57, 0, + 55, -26, 51, -67, 33, -49, -2, 58, 103, 11, + 69, 105, -24, -38, 19, 1, 25, 42, -21, 51, + -23, -1, -42, -67, 16, -57, -30, -61, 20, -42, + -56, -28, 3, -57, 110, -32, 77, 6, 8, -43, + 29, -22, -28, -15, 14, -46, 35, -1, -56, 48, + -52, -39, -12, -13, -39, 4, 45, 21, -18, 6, + 49, 38, 15, -58, 5, -49, -60, 2, -63, -40, + 92, 19, 34, -12, -63, -36, 23, -44, -42, 99, + -94, 64, -127, 17, -34, -57, -40, 50, 0, 3, + -15, 68, 15, 93, -73, 54, 54, 17, -31, -21, + -114, -109, -39, 75, -25, -37, -15, 63, 37, 116, + 49, -48, -82, -49, -23, -74, -53, -12, -49, 41, + 51, 53, -70, -19, -28, -68, -52, 63, 66, -16, + 13, -21, 8, 74, -49, 20, 10, -20, 45, -15, + 17, -57, -60, -43, -16, -31, 82, -27, -50, 1, + -59, 104, 57, -18, -77, 83, 17, 22, -22, -44, + -9, -60, -73, -48, 60, 30, -38, 88, 7, -43, + 71, -16, -22, -10, -26, -63, 21, -49, 45, -127, + -2, 27, 65, 53, -71, -5, -2, -99, 95, -51, + -64, 24, -6, 50, 36, -33, 19, -40, 56, 9, + 2, -1, -51, -8, 72, -62, 23, -20, 46, -127, + 72, -39, 74, 41, -25, 84, 13, 14, -28, -14, + 51, 55, 5, -17, -7, 12, -69, 11, 35, -37, + 39, -78, -80, -41, -32, -80, 63, -19, 47, -74, + 38, 52, -47, -79, 45, 50, -7, 19, -76, 38, + 44, -21, 63, 12, 2, -46, 50, -43, 90, -17, + -39, -88, 24, 2, -21, -26, -23, -29, 47, -3, + -22, -12, -2, -41, 3, 57, 15, 31, 41, 43, + 36, -109, -12, -13, -5, 41, 23, -30, 50, -56, + 127, 30, 8, 65, 51, 102, 19, 27, -2, -2, + 93, -46, -74, 24, 34, 3, 12, -43, -55, 18, + 35, -40, 8, 32, -71, 12, 16, 28, -22, 53, + 47, 17, -57, -37, 41, 111, 67, -1, 57, 22, + -7, -38, -53, 86, -52, -47, 28, 24, -7, 49, + 64, -63, 25, 4, -58, -6, 55, 31, -57, -6, + -19, 87, 2, 24, 92, -71, -87, -4, 1, -65, + -19, 2, 65, 16, -58, 67, -106, -6, -55, 15, + 26, -77, 26, 8, -49, -84, -55, 72, -48, 10, + -21, -29, 48, 22, 14, 30, 28, 50, -25, -44, + 71, -37, 82, -23, -55, -61, 61, -53, -18, -63, + -55, -95, -19, -32, -23, -64, -13, -44, 13, -18, + -8, 14, -29, 45, -21, -63, 53, -4, 57, 29, + -122, -13, -3, 70, -12, -60, 16, -123, -34, -15, + -10, -9, -2, -86, 49, 50, -75, 4, -73, -59, + 100, -56, 34, -3, 45, -2, -56, 90, -24, -66, + -49, 50, 50, 24, 87, -28, -24, -67, 35, -82, + 61, -35, -76, 30, -38, -3, -77, -108, -65, 49, + -15, -1, 56, 96, -54, 65, 46, 49, 28, -9, + 15, 29, -53, 3, 45, -27, 68, 25, -18, -2, + 6, 4, -14, 28, 77, 23, -45, -26, -8, -41, + 78, -21, -89, 82, 13, 2, -13, 62, -21, 14, + -8, 10, -51, -2, 83, -18, -28, -44, 18, -10, + 68, -81, 65, -51, 127, 47, -58, 68, 74, 13, + 15, 33, 44, -59, 2, -56, -26, -20, -64, -59, + -19, 55, -78, 34, -66, -1, -43, 64, 7, 0, + -32, -22, 9, 26, -7, 10, 33, 0, -16, 21, + -64, 41, 25, -56, 17, 71, 85, 21, 48, -33, + 11, -1, -34, -58, 70, -7, 0, 34, -39, -127, + 22, 6, 6, -20, -53, -60, 98, -60, -70, 102, + -50, -8, 4, -118, -9, -76, 54, -49, 80, 1, + -59, 68, 21, 61, 65, -102, -58, 56, 66, -38, + 12, 105, 84, 17, 112, 37, -22, 54, -96, -47, + 93, 26, -35, 20, 20, -45, -71, -57, 31, -43, + 92, -20, 12, -11, 59, -101, 12, 2, -37, 57, + 27, -78, -64, 73, 29, -94, -58, 62, -24, -18, + -19, -13, -15, -92, -31, -80, 59, -15, -67, 10, + -3, 18, -87, 53, -35, 1, -68, -5, -67, -27, + 39, -38, -13, -10, -84, -36, -48, 0, -95, -25, + -47, -56, 33, 53, 1, 64, -58, 62, -37, 9, + -44, -89, 19, -47, 65, -54, -6, 103, -13, -79, + -4, -43, 39, -8, 19, 30, -26, 61, -14, 42, + 9, -10, 6, 33, -11, -113, -17, 5, -30, 119, + -80, -7, -89, 70, 51, -80, 20, 47, -68, 85, + -54, 6, -15, -11, 30, -32, -25, -77, -74, 12, + 23, 47, 41, 39, -44, -39, -4, -20, 8, 20, + -10, 55, -86, -49, 22, 30, -75, -13, 46, 65, + 63, -13, -68, 19, -65, -65, 21, 7, 47, -42, + -18, 62, -11, 28, -20, -21, -38, 9, -4, 119, + -4, -78, +}; +const ALIGN(8) int8_t tensor_data65[2048] = { + -34, 24, 57, 37, -40, 1, -24, 1, -20, 93, + -43, 50, -67, 45, -25, 19, 51, -38, 23, 97, + 35, -20, 17, -37, 66, 32, 60, -38, -13, -43, + -39, -6, -12, -67, -28, 41, 28, -25, 24, -32, + 31, 29, 14, -43, 26, 16, -37, 11, 48, 30, + -54, 108, -52, -29, 49, 71, 27, 35, -32, -14, + -1, 28, -25, 63, 34, 50, 32, -11, 53, 46, + 80, -66, 17, -25, 38, 18, 21, 30, -52, 1, + 77, 48, -98, -22, 19, 93, 13, -16, -13, 20, + -56, -26, -33, -40, -90, -4, -40, 1, -74, -14, + 38, 67, 56, 66, -14, 5, -13, -72, -45, -84, + 79, -38, -63, 4, -83, -31, -18, -29, -68, -42, + -39, -37, 3, -30, -46, 24, -12, -4, 16, -26, + -27, 72, -32, 43, 26, -51, -49, -41, 31, 25, + 53, 21, 5, -63, 37, -33, -62, -7, 44, 60, + 107, -29, -61, -28, 57, 78, -30, -24, -41, -20, + 17, -56, 83, -6, 70, 9, 1, -32, -5, 15, + 6, -58, -21, -44, 69, -76, 51, -50, -52, 62, + -35, -29, -13, 17, 21, -38, -42, -29, 82, 57, + 30, 73, -10, -79, -33, -19, -2, -28, -36, -3, + -47, 45, -54, -16, 58, 43, -18, -24, -73, -8, + -26, 3, 20, 7, -11, 9, -21, -48, 28, 22, + 48, -41, 20, 86, 57, 14, -44, 72, 42, 36, + -6, -58, 25, 10, 50, -11, -30, 46, 32, -33, + -49, 28, -31, -40, -6, 29, -59, -39, 0, -13, + 35, -46, 14, 81, 1, 62, -83, 26, -48, -27, + -51, -21, 4, -27, 46, -3, 38, -9, 17, -50, + -4, -93, 14, 0, 6, -18, 49, 46, -43, 99, + 77, -58, 1, -30, -24, -3, 26, 33, -29, -41, + -30, -44, -44, -16, 3, -5, 25, -78, -72, -63, + 7, -127, 42, 11, 23, -36, 51, -54, 48, -9, + 94, 63, -72, -44, -45, -65, 70, 3, -32, 71, + 35, -29, 34, -11, 13, -74, -40, 13, 21, 48, + -66, -15, 18, -34, -27, 41, 62, -16, 27, 69, + 57, -118, 7, -65, 16, 31, -14, 124, -76, 19, + 6, -71, 36, 0, -42, 103, -38, 27, -108, -1, + -70, 3, 14, -41, -95, 45, 13, 36, 19, 38, + 23, -25, -36, 97, -56, 46, -27, 46, 79, -8, + -28, 20, 73, -21, 8, -1, 58, 46, 77, 50, + 50, -58, -58, 99, -70, 67, -15, -1, 127, 15, + 13, -54, -50, 42, 116, -40, 69, -6, -3, 20, + -78, -50, 3, 24, -20, -27, 19, -59, -51, -49, + -4, 9, 46, -57, 0, -15, -30, 73, -17, -66, + 68, -8, -60, -106, -60, 35, -33, 0, 68, -125, + 9, -71, -102, 35, -41, 17, 24, 72, -29, -58, + 17, -3, -29, 36, -25, -50, 49, 57, -50, -27, + 57, -54, 35, -18, 32, 59, -19, -43, 40, -17, + 41, -75, -41, 7, -50, 13, 21, -42, 3, 78, + -19, 4, 6, 16, 29, -5, 77, -99, -55, 73, + 3, 31, -75, -24, 90, 34, -24, 20, 67, 33, + 14, -23, 45, -31, 51, 62, -8, -2, 27, -36, + 32, 26, 46, -20, -5, 2, -7, 2, -14, 23, + -54, -17, -2, -14, 9, -15, 27, 6, -11, 127, + 11, -95, 48, 93, 18, 54, -22, -21, 6, -10, + 8, 67, 40, -51, -36, -52, 27, -92, -51, -12, + -68, -76, -38, 68, 12, 28, 57, -14, -42, -33, + 41, 60, 80, 51, 16, -101, -1, 27, 100, -72, + 55, -41, 82, -95, 9, 11, 38, 47, -41, 1, + 37, -51, 40, 10, -20, 24, 127, 17, 23, 33, + -35, -2, -12, 3, -57, -66, -32, -77, 75, 6, + -63, 46, 91, -66, 52, 44, 27, 39, 16, 87, + 21, 79, 2, -83, -114, 82, -126, 5, 95, 40, + -76, -31, 3, -39, -32, -20, -33, -20, -41, -6, + 10, 16, 71, 48, -30, -3, -14, 33, 50, 15, + 58, -42, 65, 22, -37, -26, -69, 7, -67, 39, + 71, -48, -35, 1, -41, 56, -51, 80, 5, -56, + 42, -36, -37, -24, -38, -8, 59, 18, 13, 10, + 13, 42, -47, 39, 22, -78, 49, -32, -25, 66, + -44, -127, 39, -3, 42, 28, -8, -54, 11, -35, + -45, 28, 48, -55, -66, 23, -25, -86, -9, 28, + 6, 7, 1, 88, 29, -1, 15, -10, 8, -71, + 67, 60, 29, -55, 21, 19, 77, -34, -7, -5, + -38, -13, 25, 28, -61, 99, -2, -24, 45, 48, + -7, -54, 29, 27, 109, 73, -43, 68, 10, -59, + 50, 13, 17, 10, -56, -22, 86, -36, -4, 76, + 46, 51, -62, 24, 4, -55, 33, -5, -127, 23, + 15, -49, -5, -39, 40, -49, 29, -18, 1, 13, + -7, -19, 0, 83, -26, 28, 34, -3, -36, 20, + -40, -42, 9, 48, -11, 8, -36, 65, -58, -62, + 24, 43, 2, -16, 12, 10, 78, -15, -99, -45, + -40, -60, 56, -26, -55, 44, -67, -5, -43, 41, + 33, 17, -21, -44, 47, -16, 2, -40, -127, 53, + -5, -21, -47, 23, 1, 53, 20, 67, -97, -109, + -19, -52, 0, 37, 23, -62, 45, 24, -24, 14, + 63, 48, -34, 25, 28, -17, 15, -15, -34, 100, + -127, -61, -6, -19, 8, -48, 39, 9, 6, -39, + -43, -34, 27, -36, 24, -85, -67, 4, -62, 42, + -51, -62, 35, -25, -27, 96, 38, -112, 71, -66, + 35, 39, 44, 89, -73, 10, -19, 26, -1, 35, + 31, -26, 19, -12, 82, 74, -50, -22, -21, 26, + -12, 75, -21, 1, -90, 107, 57, 38, 36, -20, + 88, -104, 40, 18, -35, -20, -32, 29, 62, -23, + 47, -42, -89, -21, 94, -44, 34, 18, 16, 54, + -87, -2, 46, -89, -16, -64, -13, -109, -94, 103, + 54, -47, 28, 58, -5, -100, -63, 104, -68, -9, + 39, -5, 26, 21, 12, 44, 78, -7, -8, 38, + 39, 18, -67, -7, 55, 10, -33, -51, 84, 44, + -3, 75, -75, 6, 5, -52, -72, 28, 37, -66, + -20, -19, 2, -37, -26, -74, -58, -22, -34, -54, + -12, -14, 53, -4, -76, -72, -4, 90, 50, -20, + -16, 26, 26, 127, -32, -17, 63, -35, -13, 35, + 21, 30, 75, 29, -49, 17, 25, -40, 9, -10, + -45, 10, 14, -55, -59, -22, 6, -25, -3, 7, + -16, 0, -5, 7, 85, -60, 33, -57, 98, 1, + 60, 15, 37, 46, 70, 84, -34, 44, 45, -58, + 37, -56, 42, 30, 64, -3, 13, 10, -37, 46, + -64, -53, -21, 41, 52, -7, -35, -71, -38, 20, + 8, -11, 52, -23, -57, 35, 15, 44, -11, -1, + 81, 34, 15, -46, 32, -121, 61, -86, 76, 33, + 32, -40, 27, -24, 9, -82, 13, 11, 33, -9, + 13, 19, 32, -20, -54, 74, 74, 12, -68, -100, + -107, 11, 34, -87, 6, 26, 5, -85, -75, -63, + -29, -79, -20, 89, 112, -56, -72, -35, 25, 26, + 51, -5, 84, 26, -58, -21, -41, 46, -17, 3, + 12, 106, 15, 27, 10, 72, 34, -66, 42, 2, + 89, 22, -2, -64, 33, -7, -4, -9, -45, 66, + 64, -43, -13, -34, 54, 67, -57, -96, -51, 23, + -16, 81, 127, -66, -25, 26, 25, 39, 51, -50, + 66, 34, -100, 25, 53, -39, 25, 46, -21, 68, + -77, -7, -54, -65, -39, -43, 52, 63, -53, 66, + 55, 34, 10, -39, -44, -7, -26, -26, 14, 91, + 48, 67, 74, 43, -58, -33, 71, -63, 19, 32, + 56, -95, 7, -93, -34, -31, 56, 86, -26, -88, + -33, -3, -67, -17, -14, -54, -2, 5, 3, -26, + 39, -18, -23, 17, 90, 6, -17, 93, 33, -3, + 127, -38, -22, -67, 67, -98, 63, -3, 43, 4, + -48, 56, 57, 50, -43, -19, 16, 33, 35, -52, + 0, 31, -2, 46, 44, 39, -5, -62, 10, 40, + -21, -15, 30, 25, 7, 28, -9, 29, -16, 10, + 30, 65, 37, -92, 57, -16, -65, -33, 14, 38, + 89, -23, 23, -55, 19, -62, -28, 39, 63, -38, + -30, -3, 56, 13, -1, -24, 2, 9, -29, 66, + -21, -18, -78, 68, 8, -29, 78, 127, -70, 49, + 63, 80, -6, 24, -33, 50, -89, -3, 32, 70, + -95, 64, 28, 38, -17, 2, -78, -54, 81, 68, + 10, -33, 15, -14, -19, 50, 13, -59, -38, 68, + -58, -19, 86, -59, 19, 74, 93, -79, 0, 97, + -48, 87, 43, -25, 108, -44, 14, -108, -24, 43, + 9, -77, -5, 1, -30, 37, 8, 13, 62, -25, + -60, 56, -39, 127, -55, -36, 46, 29, -37, 19, + 30, -19, 17, -20, -9, -31, 25, 32, -46, 14, + -6, -60, 50, -97, -48, -102, 18, 126, -55, -10, + -2, 127, 69, 96, 73, 24, 105, 0, 34, -27, + 35, 83, -13, 40, -6, 11, 20, 37, 1, 76, + 20, -32, -21, -39, 55, 35, 12, 28, 46, 16, + -48, 41, 50, 23, 50, 70, -71, -12, 7, -13, + 79, -28, 6, -7, 48, -33, -106, 59, -9, 23, + 0, 4, -23, -64, -17, -3, 14, 33, -45, -65, + 58, 62, 9, 6, -114, 52, -30, -67, 17, 50, + -62, 36, -79, 85, -49, 0, -6, -70, -66, 51, + 63, -40, 49, 31, 37, -7, -68, -92, 67, 48, + -58, 55, 29, -8, 29, 103, -15, -13, -3, -68, + 16, 24, 30, 127, -1, 80, -48, 91, -86, -14, + 55, 2, 5, -31, -27, 34, 5, -1, -46, -114, + 4, -12, -8, 76, -15, -5, 91, -43, 13, 38, + -3, 80, 61, 58, -33, 10, 56, 7, -34, 50, + -17, 7, -4, 13, -48, -84, 89, 19, -68, -26, + 6, 5, -41, -8, -12, 43, 68, 85, 95, 49, + -52, 14, 99, 65, -64, -57, 1, -92, -4, 45, + -4, 27, 39, 31, -34, 1, -47, 82, -1, 9, + -11, -13, 33, 10, 42, -42, 7, 51, 31, -39, + 44, 58, 18, 10, 18, -22, -48, 32, 50, 29, + 6, -62, -30, -18, 42, 30, -71, -5, -36, 57, + 45, 17, -52, 7, -19, -47, -3, -77, 67, -106, + 84, -69, 89, 49, -25, -79, 49, -19, -39, 41, + -10, -57, -1, -33, -5, -42, 36, -19, -33, -51, + -28, 6, 51, -19, 69, -16, 10, -39, 18, -28, + 25, 0, 12, 102, 98, 37, 84, -77, 35, -55, + -107, 21, 83, 30, 1, -22, 8, 25, -80, 30, + -106, -13, -69, 45, 18, 23, -22, 28, 59, 37, + 12, 13, -28, 53, 1, -10, -14, -45, -59, 46, + 69, 0, 30, -11, -36, -38, 26, 6, 44, -57, + -17, -33, 34, -13, 127, 55, -8, 87, 82, -73, + -127, -38, -9, -23, -64, -29, 54, 37, -80, 35, + -65, -33, 20, 90, -57, -9, 21, -47, -23, -39, + -11, -58, 9, 47, 6, 35, 30, -37, 31, 75, + -31, -16, 72, -72, -75, -33, -74, -22, -14, 43, + 74, 73, 78, 40, -28, -65, -29, -50, 32, 82, + -33, -6, -13, -3, 42, -86, 30, -65, -2, 12, + -70, 15, 22, 21, -52, -2, -56, -49, 55, -20, + -10, -82, 0, 127, 9, -70, -9, 66, -30, 26, + -23, 55, 41, 8, 50, -66, 35, -64, 7, -29, + -31, 24, -79, -59, 5, 26, 73, -83, -45, -38, + 18, 37, -4, -77, 56, -62, 11, 57, 21, 15, + 46, 16, 5, -20, -93, -45, -38, -44, -42, 76, + 20, -28, -42, 68, -49, -2, -84, 113, 47, 39, + 12, -55, -39, 1, -80, -24, 1, 121, 28, -55, + -5, 34, 13, -23, 20, 29, -28, 57, 61, 1, + 5, 52, 48, 15, 29, -5, -59, 13, 45, 45, + -34, -25, 35, 37, -5, -20, 12, 40, -53, 85, + -75, 21, -78, 10, -23, -51, 25, -61, 30, 21, + -4, -51, 73, 45, -5, -71, -42, 49, -18, 38, + 10, -43, -17, -55, -3, -26, -71, -85, -2, 10, + -23, -2, -2, 0, -69, 55, -9, 2, 50, -29, + -53, 14, 22, -71, -50, -60, -74, -53, 80, 28, + -18, -54, -14, 68, 41, 77, 71, -46, 50, -61, + 34, -46, 1, -42, -6, -51, 2, 0, -45, -8, + 32, -8, -4, 59, -43, 38, 61, 81, 57, 102, + 16, -74, 15, -74, 77, 69, -41, 81, -70, 41, + -82, -75, -10, -44, -95, -10, -58, -74, -47, -3, + 54, -48, -51, 9, 10, -103, -17, 88, -25, 32, + -3, 44, 54, -42, -2, 52, -119, -84, 3, -46, + 37, 69, -4, -13, -69, -32, 64, 1, 10, 84, + 54, -81, -35, -97, 6, 17, -45, 38, 39, -23, + -44, -31, 26, -29, -55, 51, -8, -13, +}; +const ALIGN(8) int32_t tensor_data66[96] = { + 504319, 1966422, 167447, 1574057, 718953, 1076373, 584757, 520026, 2188241, 1765940, + 2499605, 1852446, 2289793, 2395242, 2377251, 1765625, -281972, 110234, -1734637, 1191325, + 1057917, -1986411, -250537, 318517, 1596389, 2715741, 1523784, 1470044, 2471421, 1470789, + 3417301, 1779877, 2126745, 503677, 403721, 2417270, 268692, 156038, -1357910, 719534, + 2530188, 2467497, 1958701, 1365226, 2115687, 1725936, 1652238, 1795455, -1168997, 1583544, + 706386, 1200240, 189769, 1976027, -620053, -2142963, 1724762, 3149123, 1777777, 1641310, + 1884496, 2834818, 1979642, 2565122, 380540, -1543262, -165103, 980047, -1804499, -2311945, + -369270, 867367, 2201655, 2482472, 2537409, 2050868, 1453723, 1930889, 2307983, 1951862, + -2056055, 65385, 584717, 235762, -968371, 2968263, -2227583, 286619, 1617059, 2014811, + 2311306, 2396223, 1596225, 1966493, 1833648, 2150669, +}; +const ALIGN(8) int32_t tensor_data67[64] = { + -1226249, 559037, -274430, 536445, -326082, 510176, 531509, -610296, 3717173, 2691263, + 2935573, 4121934, 3571161, 3681434, 4081564, 4270066, 511255, 153389, -1006693, 129776, + 855485, -182526, -707020, 939691, 2673729, 3418137, 2950902, 3437339, 3501815, 3947362, + 3683240, 3615284, 238616, 1091696, 547326, 1435908, -1002547, 1004208, -546130, -1324451, + 3571504, 6523684, 3943512, 4302929, 3265114, 2675431, 4696282, 2906181, 991494, -1440517, + -1444830, 582069, -196091, -1674113, 383436, 1169333, 3114426, 3460161, 3188307, 4286887, + 3077290, 3720392, 3353129, 2668259, +}; +const ALIGN(8) int8_t tensor_data68[2816] = { + -34, -21, 40, 111, -44, 46, 47, -85, 6, 84, + 91, -31, 61, 48, -65, 78, 116, 72, 25, 5, + -13, -36, -76, -64, -91, -69, -109, -90, 29, -101, + -21, -13, 69, -68, -71, -90, 106, -86, 44, -34, + 31, 75, 14, -127, 28, -65, -58, -80, 35, 64, + -107, 27, 41, -9, 48, 23, 68, 26, 0, -85, + -35, -91, -66, 13, -29, 21, 76, 44, 75, -28, + -18, 80, 52, 3, 45, -38, -36, -55, -127, 47, + -41, -5, -127, 55, -14, -48, -27, -19, 74, -62, + 57, -2, 34, 39, 7, -6, -30, 13, -102, -9, + -16, -32, -81, 33, -125, 56, -39, -60, -79, 127, + -42, -26, 15, -85, -88, -94, -90, -28, -67, -104, + 52, 38, 31, -17, 20, 22, -35, 127, -79, 96, + -27, -49, 59, -4, 53, 77, 35, -85, 60, 48, + 36, -22, -59, -82, -48, 20, 21, 50, -89, -3, + -41, 47, -56, -4, 32, 127, -28, -94, 85, -40, + 83, 31, -37, -105, -21, 23, -5, -127, 57, 9, + 50, -61, -98, -90, 91, -56, -65, 3, -96, 37, + -14, -73, 18, -5, 127, 35, 109, 35, 80, 61, + 27, -41, 14, -77, 53, -81, -9, 0, -85, -127, + -23, 37, -71, 59, 51, -8, 0, 14, -127, -106, + -30, 18, 25, -78, 45, 109, 45, 81, 97, 33, + 96, 95, -6, 97, 24, 33, 32, -20, -58, 72, + -75, 17, 114, -78, 56, 117, -5, -91, 32, 33, + 9, -39, 104, -85, 59, 113, -5, -57, -37, 74, + -127, -80, -76, -91, 110, -1, -27, 38, 22, 1, + -113, 16, -60, 52, -27, -43, -31, 17, 84, -110, + 10, -17, -32, 81, 19, -73, -50, 127, -67, 13, + 46, -54, -87, -18, -26, -94, 65, 19, -37, -32, + -31, -26, -106, 20, -31, 77, -76, -26, 14, -29, + 65, -12, -49, 12, 30, 15, -127, 79, -34, 90, + -4, 24, -69, 93, 55, -15, 4, 10, -69, 35, + 100, -69, -42, -22, 85, -26, -62, -57, 82, -54, + -48, 39, -97, -114, 101, -12, 43, 52, -63, -38, + 35, -12, 20, 21, 3, 44, 12, -7, 86, -55, + 28, -124, 93, -29, -42, -29, 52, 31, 80, 124, + -8, 96, 59, -118, 59, 30, 86, -26, -23, -66, + -113, 40, 38, -1, -5, 57, 7, -54, 63, -54, + -2, 71, -56, -19, -42, -85, -49, 28, -3, -15, + -37, 56, -127, 42, 23, -22, 26, -21, 60, -64, + -8, 89, 47, -59, 63, 104, -112, 37, -115, -49, + 24, -57, -50, 50, 22, -49, -29, -70, 23, -89, + 16, 103, 85, -70, 119, -39, -59, -15, -13, 97, + 54, 65, -6, 52, 28, -5, -12, -87, 70, 15, + -44, 56, 59, -68, 36, 9, 66, -9, 0, -72, + 72, -30, -84, 58, -98, -73, -34, -28, -88, 29, + 40, 50, -21, 73, -4, 54, 30, 19, -40, 17, + 47, 4, 45, 45, 100, -119, 31, 63, -47, -71, + -28, -21, -88, -79, 69, 12, 7, 96, 101, 127, + 115, 95, 96, -118, -15, -15, -105, -9, -90, -58, + -112, 97, -58, -25, -31, -91, -55, 30, 41, 64, + 80, 105, -41, -127, 1, 12, 31, 17, 18, -59, + -77, 12, -39, 72, 79, -8, -15, 8, -11, -36, + -3, -38, 1, -41, 55, -70, -50, 13, -6, -42, + -4, 37, 12, -46, -43, -45, 70, 28, 45, 74, + 10, 24, -15, 27, -36, 37, -41, 43, 53, -76, + 2, -62, -11, 67, -77, -81, -15, 65, -4, -18, + 45, 46, -44, -31, 28, 35, -55, -72, -17, -2, + 19, -34, -3, -13, 7, 3, -73, 54, -27, -15, + -9, 55, 24, -52, -17, 58, -23, 49, -55, -15, + -14, 58, -14, -28, 59, -70, 1, -43, -31, 18, + 11, 55, -48, 58, 39, -18, 5, 33, -25, 26, + -27, -55, 63, -11, -37, -33, 66, 30, 17, -119, + 43, 8, 63, -39, -29, 37, -57, 68, -10, -34, + 37, -32, -15, -50, -10, 15, 66, -22, 51, -48, + -48, -47, 38, 38, 12, -25, -60, 38, 55, 29, + 22, -46, -8, -8, -18, 32, -71, -17, -73, -82, + 63, -94, -35, 45, 1, 46, -78, -62, 39, 65, + 26, -28, 10, -9, -26, 6, 87, 41, 56, -40, + -54, 58, -37, 54, 24, -39, -64, -14, -22, 64, + 35, 18, 55, -44, -38, -14, 4, -54, 8, 40, + 61, 29, -18, -41, 40, -69, -2, -5, -54, 75, + 41, -62, -37, 45, -32, -34, -66, -60, -58, -19, + -13, -18, -66, 43, -5, -66, -52, -2, -30, -18, + 56, 7, -7, -28, 80, 32, 73, -35, 3, 18, + -17, -16, -33, -48, 46, -43, -21, 48, 31, -61, + 60, -33, 10, 23, -46, -28, -53, -75, 6, -51, + -50, -6, 84, -44, -37, -28, 2, 36, 47, 1, + -48, 66, 81, -60, 65, 15, -26, 60, 11, -55, + -17, -76, 52, -3, -10, 1, 70, 65, 37, -46, + 20, 34, 19, 6, 99, -6, -14, -2, -45, 16, + 37, 16, 47, -38, -4, 40, 72, 21, 28, 47, + 9, 54, 18, 24, -25, 71, 37, 39, 1, -69, + -35, 50, 20, 48, 81, 2, 5, 64, 15, 71, + 48, 45, -62, -35, 50, -25, -16, 17, 47, 33, + 45, -34, 59, 26, -21, -27, -36, 36, 17, 66, + -9, -62, 29, 45, 81, 76, -24, 44, 45, -12, + 65, 9, 5, -47, 0, 47, -1, 62, -65, -65, + -56, -20, -34, 16, 46, 7, -7, 39, 37, -15, + -18, -70, 65, 73, -43, 47, -11, -10, -41, 47, + 5, -61, -58, -44, -57, -61, -34, -28, 18, -37, + 27, 23, 63, 41, -16, -14, 48, 51, 67, -69, + -7, 20, 111, 1, 23, -2, 37, 71, 19, -50, + -36, -49, -24, -52, 39, 49, -51, -16, -39, -78, + -64, -54, 37, 57, -61, -12, 35, 75, 12, -2, + -12, 20, 45, 21, 16, -61, 23, -63, -40, -20, + -35, 36, -46, 27, -16, 66, 44, -61, 57, -19, + 54, -22, 31, 4, -42, 3, -74, -36, 58, -7, + 66, 69, -30, -36, 30, -11, 18, 1, 27, 11, + 71, -1, 19, -5, -23, 43, -34, 26, -39, 76, + -59, 23, 12, 56, -10, -32, 4, 53, 22, -61, + 66, -59, 73, 11, 83, 21, 32, 8, -18, 53, + 3, -8, -20, -20, 74, -22, -28, 92, 14, -31, + -59, 72, -32, 32, 52, 4, 74, -42, 50, -15, + -49, 30, 61, 36, -20, 16, -1, 32, 21, -29, + 42, -2, -46, -5, -64, 27, -54, -19, -2, 23, + 32, 19, 44, 36, 2, 0, 29, -73, -56, 20, + -8, -40, 59, 33, 24, -13, -18, 20, -31, 16, + -49, -51, -3, -4, 78, 7, -62, 28, 40, -79, + 40, -66, -8, -22, 29, -34, -24, -5, -37, 4, + -53, 11, 47, -28, 51, 17, -11, -39, 42, -18, + 44, -43, 3, -59, -74, -6, -26, 6, -33, 42, + -34, 31, -77, 33, 29, -53, 1, -46, -84, 66, + -97, 32, -32, 92, 48, 6, -42, -34, -39, -20, + -13, 17, 1, 47, 16, -1, -6, -3, -34, 12, + -11, 86, 7, 15, -21, -23, 16, -2, 9, 24, + 28, -46, 31, -25, 0, -8, 77, 66, -77, -35, + 9, -126, -85, 19, 44, 30, -17, -10, -89, 1, + 30, 48, -38, -29, -45, -3, -62, 58, 34, 10, + 64, -3, 30, 24, 77, 73, -9, 3, -3, -58, + -24, 49, -58, -39, -18, 30, 18, 37, 38, -24, + 45, -6, 25, 48, 27, 39, -29, 63, 4, 46, + -29, -63, 9, 56, -35, -50, 21, 0, 1, 3, + 32, 51, -71, -24, 19, -52, -77, -21, -39, -19, + -29, -57, 31, 85, -66, 35, -71, -23, -41, -37, + 11, -33, 10, 45, -3, 22, -81, -15, 23, 76, + -33, 60, -68, -4, -70, -19, 61, 27, -43, -25, + 0, -17, -86, -7, 62, 63, 20, -54, -6, 14, + 55, 111, -27, 127, 47, -36, -59, -30, -81, 40, + 1, -14, 7, -54, 92, 18, -111, 5, -98, 3, + -76, -56, 88, -38, -47, -30, -33, 48, 54, 61, + 67, 110, 3, 30, -22, 51, 22, 85, -6, -72, + -84, -18, -10, 79, -18, 64, -26, 39, 105, -40, + 89, -83, -32, 80, -88, -22, 0, -1, -48, -56, + -62, 19, 98, -5, 113, -14, 116, -23, -113, 113, + 0, -64, -77, -93, 13, -98, 7, -74, -69, -99, + -100, -28, -16, -127, 29, 23, -46, 7, 70, 78, + 18, -72, -112, 12, -31, 104, -100, -90, -54, 82, + 65, -83, -10, -13, -48, -72, -2, 104, 15, 118, + 122, 66, 68, -103, -41, 92, 108, 46, 51, 127, + 38, 126, 80, 13, -54, 16, -92, 30, 67, -32, + -84, 35, -1, -2, 33, 26, -90, -69, 66, 43, + -5, -17, 89, -118, 58, -61, -69, 48, -49, 127, + 24, -45, 24, 26, 41, -16, -30, -15, 33, 33, + 48, 61, -127, 40, -61, 77, -63, 90, -24, 12, + 20, 8, -55, 1, 55, -51, 68, 69, 127, -77, + -117, -33, -43, -7, 72, -86, -42, 92, -25, -1, + 97, 65, -32, -66, 62, 33, 27, -64, -48, -35, + -3, -25, -25, -3, -76, 56, 12, -22, 27, -9, + 1, 7, 57, -31, 51, 86, 56, -71, 120, 54, + 2, -79, 61, 110, 3, -117, -66, 62, 71, -57, + 55, -12, -11, -35, -74, -127, 101, -15, 3, 22, + 51, -91, 127, -77, -4, 87, -109, -70, 2, -73, + -90, -34, -1, 34, 96, 73, 69, 35, 8, 39, + 64, 34, 25, 60, 67, 58, 68, -103, 85, -63, + -93, -26, 29, -84, 14, 87, 109, -65, 94, 20, + -118, 80, 127, -40, 89, -69, -67, -113, -127, -36, + -67, -81, 67, -68, -9, 66, 95, 43, -43, -53, + 33, 61, -88, 43, -127, -13, -60, -9, -96, 56, + 28, -65, 10, -36, -24, -9, 15, -23, -9, 6, + -47, 8, -113, -127, -82, -32, 65, 7, 55, -108, + -53, 12, 42, 34, 104, 9, 48, 89, 80, 26, + -21, 2, 125, 16, -55, -62, -11, 49, 9, 47, + 26, 14, -63, 72, 9, -42, 81, 48, 0, -127, + 79, 16, -66, -102, 53, 78, 71, -34, -76, 77, + -54, -61, 55, 90, 68, 87, -31, -45, 109, -74, + -72, -78, -40, -43, -3, 47, -90, 42, -43, -30, + -113, 25, -22, -50, 11, -124, -127, -11, 24, -82, + 44, 8, -18, -93, 4, 31, -97, 5, -30, -2, + 58, -19, -38, -10, -32, 63, -28, 71, -66, 111, + -51, -40, 18, 0, -37, 18, 59, -122, 46, 30, + 60, 4, -14, -23, 102, -70, 54, 95, -15, -44, + 76, -82, -76, 88, -30, 30, 54, 107, 10, -22, + -127, -9, 18, -50, 15, -2, 24, 65, -49, -10, + -57, -41, 2, -13, 32, -46, 94, -26, 45, -46, + 38, 32, 67, 4, 21, -87, 127, -7, 26, -5, + 25, 89, 56, 107, 52, -71, 117, -59, -5, 44, + -15, -77, -1, 114, -18, -90, -50, -18, -29, 15, + -66, -31, 31, -95, 75, -5, 7, 6, 19, 27, + 40, -22, 16, -28, 31, 11, 60, -17, -73, 35, + 94, 26, 22, 98, -8, -2, -52, -3, 67, -104, + 38, -35, 71, -5, 0, -55, 48, -12, -67, -24, + -20, -25, -8, 66, -10, 38, 13, 99, 79, -13, + -61, 22, -8, 8, 53, -41, -11, 6, 57, -8, + 51, -24, -3, -5, 9, 54, -80, 57, -59, 10, + 27, 56, 52, 53, 25, -21, -66, -46, -70, 48, + 28, -42, 14, -2, -26, 62, -5, -54, -4, 38, + 22, 17, -44, 99, -43, 44, 64, 65, -29, 35, + 27, 16, 18, -39, 17, -15, -55, -15, -69, 23, + -55, -48, 29, -12, -3, -7, 9, -70, -36, 55, + 23, -67, 14, -84, 31, 8, 39, -59, -2, -16, + 21, 11, -1, 48, -52, -26, -71, -23, -77, 22, + -64, -10, 6, -22, -53, -9, -9, -9, 62, -3, + 69, -24, -9, 72, -37, 80, 46, 12, 15, 33, + -49, 56, -27, -14, 60, -36, -25, -17, 45, -84, + -39, -10, 10, -31, 13, 18, -48, -34, -46, 10, + -20, -7, 41, -17, -34, -11, 41, -57, 26, 9, + -8, -53, 1, 64, 67, -42, -53, 21, 12, 34, + 20, 4, -24, 27, 9, -36, -6, -51, 31, 35, + -8, -9, 24, -33, -30, -20, 48, -29, -18, -67, + -40, -46, 37, 60, -16, 40, -9, 0, -61, -42, + 54, 23, -58, 57, -17, -24, -41, 16, 8, -7, + -32, -10, 53, -47, -41, 33, -55, -35, 12, 33, + -44, -34, -40, -64, -40, 55, -15, 29, -58, -30, + -23, 45, -13, 13, -28, 0, 52, 22, -4, 55, + 3, 92, 101, -20, -75, -14, -48, -6, 22, 84, + 36, 49, 86, -53, -60, -3, -93, -2, 7, -64, + 109, -11, -7, -61, -27, 5, 47, -52, 78, -91, + 105, 2, -11, 17, 43, 61, 40, 2, 42, 27, + 10, -42, -38, -62, 12, -51, -62, -13, -44, 12, + 41, -10, 70, 39, -54, -20, 18, 75, 0, 7, + -12, 33, -75, 20, 22, -55, 38, -46, -28, 51, + 0, 4, 47, -5, -12, -52, 45, 9, 25, 87, + -18, 58, -33, 21, 43, -13, -57, 66, 61, 4, + 47, 24, 39, -81, 51, 3, 8, -34, 86, -35, + -14, -5, -16, 67, 3, 8, 76, 83, 61, -49, + 56, -64, -34, 35, -41, -64, -79, 25, -53, 3, + -5, 91, -17, 56, -40, -33, 14, -21, 24, -24, + -17, -56, 4, 35, -34, 31, 42, -68, -34, 33, + -52, 60, -15, -36, -49, 14, 50, -66, 49, 18, + -3, -86, -46, -24, -24, -31, -10, -20, 34, -8, + -50, 27, -4, 28, -61, -25, -37, 3, -34, -7, + -43, -42, 7, 53, -34, 26, 51, 6, 39, 43, + -69, 40, -22, 74, 34, -5, 0, -25, -19, 62, + 1, -14, 11, 13, 15, -22, -4, -12, 3, 3, + 38, 4, -37, -14, 26, 4, -63, -9, 37, 60, + -83, 35, -27, 43, -51, 51, -48, -14, 35, -12, + 21, 20, -33, -13, -71, -49, 50, -46, 30, 2, + 13, -29, 70, 6, 60, 24, 49, 35, 57, -7, + 71, 14, 59, -24, 33, -48, 34, -27, 0, -66, + -46, 52, 33, -10, -6, 13, -34, -57, 11, 32, + -61, -94, -74, 60, 74, -13, -91, 29, 11, -46, + -84, 65, 54, 88, -46, 57, -26, -63, 4, 50, + -34, 49, -60, -84, 36, -72, -7, 39, 25, -22, + -27, -31, 48, 1, -47, 23, -54, 7, -19, 4, + -13, 31, 28, -5, 23, -28, 3, 0, -16, 30, + -70, -64, -42, -58, 28, 69, 8, -38, -51, 51, + 29, -38, 70, -62, 35, -55, 16, -77, -102, -6, + 1, 33, 34, -2, 50, 41, 76, -67, 55, -41, + -42, 13, -29, -60, 4, 17, 6, -29, 61, -10, + 96, -20, -79, 14, -42, 69, 65, 26, 78, -37, + 63, -82, -8, -29, -17, 57, 50, -49, -48, -67, + -44, -42, 52, -6, 76, 39, -26, 50, 54, 24, + 16, 50, -9, -40, -50, -75, 3, 13, -24, 47, + 1, 45, -29, 19, 11, -2, 60, -38, 12, -14, + 32, -20, 70, 53, -51, 65, -41, -47, -78, -18, + -8, -26, -47, 18, -39, -3, -82, -12, 13, 31, + -9, -49, 47, -32, -24, -3, 19, -70, -59, 47, + 28, -46, -43, -30, -77, -10, 22, -9, 11, -36, + -26, 36, -30, -1, 70, 16, -7, -41, 19, -8, + -17, 26, -43, -22, -24, 33, -6, 33, -35, 8, + 14, 37, -20, 48, -24, -45, 73, 10, 60, -23, + 32, 72, -92, -37, 33, 18, 30, 34, -72, -57, + -57, 31, 27, -62, 63, 88, -39, -24, -71, 80, + -10, -26, 27, 7, 53, -38, 4, -71, -41, -1, + -52, 62, 47, 20, -50, 20, -45, -16, 8, -25, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, +}; +const ALIGN(8) int32_t tensor_data69[64] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1221619, 1643791, + 804317, 1311659, 1265901, 1515515, 1348511, 1749911, 0, 0, 0, 0, + 0, 0, 0, 0, 2572927, 1755912, 1460754, 1677111, 1229938, 1613966, + 1428808, 1346648, 0, 0, 0, 0, 0, 0, 0, 0, + 871952, 1462129, 1180658, 1469030, 1829194, 1681063, 938927, 602072, 0, 0, + 0, 0, 0, 0, 0, 0, 831631, 1020466, 876461, 2172570, + 1016265, 1485552, 1700096, 1729080, +}; +const ALIGN(8) int8_t tensor_data70[3072] = { + -25, -41, 80, -12, -41, -70, -12, 37, 4, -2, + -19, -47, -8, -10, 23, 23, 89, 58, -52, -45, + 73, 84, -53, -68, 35, -25, -18, -43, 81, 66, + 9, 27, -23, 8, 48, 43, 61, -8, -38, -66, + -55, 79, 40, -43, -34, -34, 3, 51, 47, 45, + 4, 13, 34, -9, 89, 77, -94, 72, 3, 49, + -12, 21, 57, 56, 99, -89, -54, 11, -52, 45, + -46, 40, -55, 66, -48, 41, 61, 20, 61, 49, + -114, -12, 15, 57, -75, -8, -30, -78, -79, -1, + -33, 63, -12, 36, -8, 34, 33, 77, 48, 23, + 54, -55, 13, -56, -22, -6, 120, 38, 86, -2, + -127, 51, 41, -87, 47, 29, -63, -80, -3, 38, + -50, 46, -37, 30, 59, -50, -42, 49, -21, -122, + 84, -13, -77, -116, 8, 54, 34, -22, 11, 13, + 26, -47, -5, 15, 23, -59, -37, 73, 37, 47, + -37, 52, -17, 73, -37, 31, -1, 61, 8, 75, + 2, -23, 31, -110, -35, -58, -50, -15, -48, 115, + 66, -91, 87, 76, 20, -5, -5, 33, -78, -8, + 56, -118, 19, -73, 44, 56, -83, -47, -94, -86, + -76, -66, -54, -22, -61, -89, 36, -70, -40, 66, + -127, -9, -38, 111, -13, 42, 76, -62, -42, -44, + -3, 66, 56, 22, 80, 17, -80, 8, -14, 3, + -81, -45, -21, 11, 72, -33, 35, -43, 53, 34, + -32, 76, -98, 36, -55, -20, 44, 44, 56, 49, + 24, 27, -1, -34, -43, -48, 6, 20, 43, -37, + -53, 31, 23, -68, -72, -24, 119, 28, -27, 51, + 27, -59, 52, 50, 25, -52, -61, -44, 58, 77, + 127, 40, 74, -19, -49, 14, -45, -16, 31, 36, + 17, -17, 83, 88, 82, -13, -4, -7, -102, -5, + -69, -37, -70, -51, 15, -23, 48, -47, 68, 90, + -50, -29, -18, 12, -89, -58, -38, -96, 39, 68, + 58, 66, 37, -31, -34, 44, -73, 31, -89, -46, + 21, 106, 51, 54, -18, -1, -16, -49, 58, -50, + 27, -34, 3, 11, 42, -80, 25, -18, 39, -26, + 5, -36, -38, 19, 55, 55, -34, -5, 40, 99, + 17, -18, -101, -64, -39, 28, -44, -54, 46, 26, + 103, -83, -5, 58, -10, -55, 75, 68, -11, 16, + 24, -6, 24, 72, -35, -13, -19, -35, 127, 18, + 8, 81, -27, -30, -53, 26, 2, 17, 7, 82, + 1, -7, -49, 46, -20, -56, 58, -127, -82, -18, + -16, 36, -71, -8, -104, 47, 40, 81, -62, -24, + -43, -23, 6, 32, 32, 13, -69, 30, -51, 37, + -19, 42, -93, 111, -39, -28, -41, -94, -62, 63, + -45, -29, 14, -18, -6, -18, 10, 41, 90, -32, + -52, 35, -39, -77, -74, 123, -30, 94, -78, 27, + 23, 2, -47, -22, -56, 5, 10, 6, -56, -18, + -64, -22, -26, -24, -117, -20, -42, -15, -54, 6, + 87, 22, -26, 45, 7, 37, 12, 48, 23, 3, + -72, -7, 59, -62, -19, 54, -66, 127, -53, 43, + 1, -52, -5, -15, -79, 68, -13, 44, -52, -60, + 6, 53, -63, -127, -59, -88, 50, 36, -23, 40, + -28, -31, -18, 14, 42, -2, -27, -72, 28, 48, + -38, -10, 24, 29, 83, 75, 27, 20, 71, 15, + -91, -50, 79, 28, 53, 7, -85, -6, 13, 76, + 38, -10, 116, -14, -127, 31, 33, 75, 56, 7, + -30, 59, 24, -6, 44, 108, 37, -30, -54, -44, + 26, 75, -24, 19, -30, -29, 15, -30, -70, 82, + 37, 17, 13, -8, 10, -14, -17, -104, 81, 1, + 106, 0, 3, -68, 34, -26, -40, 31, -11, 61, + 28, 95, 17, 88, 78, 70, 25, -15, -46, -16, + 36, 27, -28, 12, 61, -45, -84, 69, 0, 57, + 91, -84, -38, -81, 29, 45, -59, 100, -63, -30, + 4, 83, -84, -11, -33, -3, -47, 50, -68, 7, + -25, 47, 76, -8, 20, -58, -26, 59, -4, 38, + 3, -40, -82, -20, 54, -84, -16, 34, -29, -10, + -95, 76, -77, -10, 37, -78, -8, 35, 24, -20, + 6, -27, 35, 8, -51, 54, 8, 16, 30, 53, + -45, 85, 56, -64, -61, -72, 24, 83, 90, 103, + 74, 71, 63, 43, 111, 61, 60, -71, 7, -14, + -36, -60, -79, 25, -85, -87, -95, -61, 65, 13, + 96, 15, 39, -11, -35, -6, -30, 39, -38, 16, + -56, 1, 22, -41, 0, 64, 88, -10, -23, 28, + -27, 26, -49, -80, 8, -112, 77, 62, -13, -4, + -6, 32, -84, -19, -7, 26, -71, -18, 74, -80, + 50, -23, 8, 17, 18, 15, 11, -19, -16, -14, + -53, 19, 43, 39, 1, -66, 57, 1, -2, 7, + 38, -56, 40, 45, 66, 76, 25, 0, -50, 16, + -86, -44, -102, -84, 28, -77, -75, 9, -57, -22, + 13, 73, 71, -83, 18, -36, -77, -57, -46, -10, + -35, 13, 74, 30, -22, 48, 1, 20, -14, -32, + -54, -108, 51, 48, -29, -72, 81, -91, 33, 37, + -18, -47, -42, -55, 52, -24, -71, -65, -56, -35, + -85, 71, -6, -46, 59, -86, 9, 87, -5, -45, + -28, -31, -25, 11, -59, 27, -106, -72, 43, -78, + 112, 33, 23, 60, 6, -20, -23, 14, 76, 0, + -48, 61, -67, 4, 6, -45, -72, -13, -51, 15, + -60, 54, 96, -50, -83, 14, 36, 48, -8, -35, + 9, -95, -40, -63, -60, 64, 31, -61, -3, 86, + 59, -45, -34, 47, -66, 92, 52, -11, -49, -61, + -50, 18, -45, 2, -44, 79, -98, 21, 37, -22, + 16, -52, -75, 107, 52, 83, -54, 23, -106, 56, + -110, 0, -50, 59, 21, 51, -127, -69, 77, 37, + -15, -41, 38, 81, -83, 1, -4, -63, -54, 118, + -72, -33, -108, 51, 77, -18, -59, 72, -27, -61, + -91, -2, 76, 1, -64, 104, 11, 46, -97, 23, + 26, -82, 97, -68, 41, 47, -71, -5, -21, 1, + -54, 4, 4, 29, -40, -16, -31, -65, 59, -11, + -9, -38, -67, 7, -87, 23, -61, -27, -23, -77, + -40, 8, -44, 53, -21, -23, -38, 59, -127, 95, + -4, -65, -54, -75, -46, -37, 47, 58, -38, 81, + 84, 51, 45, 35, 28, -33, -56, -22, 82, 70, + 0, 50, -90, -61, 33, -51, 41, 19, 58, -36, + 28, 61, -46, 63, 27, 13, -66, 56, 45, 12, + 6, -39, -109, 57, 27, 33, -49, -42, -31, 78, + 77, 34, 50, -77, -33, 34, 36, 44, -51, 43, + -45, -72, 115, 74, 42, 16, -98, 29, -64, -7, + 59, 54, -60, 40, 42, 70, -69, 24, 11, 71, + 23, 64, -37, 0, -70, 2, -78, 11, -7, -11, + 29, -1, -81, -23, 103, -4, 127, 44, -62, -60, + 112, -95, -87, 8, -112, -63, 5, -25, -72, 76, + -11, 62, -45, 37, 69, -16, 86, 29, 43, -53, + 15, 80, -66, -46, 51, -59, 15, 64, -127, -57, + -41, -63, 18, 73, -95, -67, -17, -18, 8, -49, + 26, -32, 63, 49, 68, 6, 121, 56, -115, 86, + -105, 111, -55, -24, -14, -22, 37, 62, -48, 51, + 19, -47, 38, 0, 64, -64, -82, -46, 44, 114, + 13, 0, 8, 3, 67, -25, 74, -40, -5, 37, + 37, -25, 7, 30, 13, 2, -47, 93, 40, 60, + -34, -26, 49, 47, -80, -6, 20, -41, 106, -7, + -26, 13, 50, 107, -48, -53, 60, 43, 41, 64, + -18, 1, -50, -87, -27, 69, -33, -84, 14, 86, + 72, -114, 79, -50, 53, -44, 23, 50, 55, -5, + -64, -17, -10, 55, -38, 73, -6, -59, -29, 69, + 9, -25, 22, -41, -38, -96, -30, -24, 68, 65, + -47, -87, 53, 2, -39, -52, -2, -1, -4, -71, + 83, -25, 79, 58, 15, -69, 28, 31, 32, 31, + -5, -57, -12, 39, 29, 102, 29, 2, 14, -37, + -11, 0, 52, 95, 16, -96, 72, -15, -54, -65, + 70, -2, -44, -71, -48, -6, -13, 34, -19, -14, + 40, -52, 7, -38, 56, -3, -28, -88, -20, -127, + 48, 94, 20, -4, 55, -9, -109, -24, 42, 58, + 3, 42, -79, -13, 45, -58, -24, 21, 25, -45, + -42, -63, -34, 81, -26, 88, 30, 47, -24, -69, + -61, -40, 32, -16, 60, 47, 50, 19, 39, 91, + 31, 93, -48, 53, -29, -60, 2, 47, -127, -36, + 22, 92, 107, -45, 37, -97, -69, 28, -35, 67, + 34, -42, -30, -91, -62, 91, -48, 55, 67, 64, + 15, 45, -41, 71, 10, 29, 19, 33, -64, 126, + -79, 122, -71, 27, -85, 25, -49, -40, 69, 23, + 0, 71, -54, 13, 35, -113, 76, -15, 31, -72, + 1, -55, 30, 93, -56, -67, -87, 27, -73, 38, + -39, 69, -49, 5, 39, -17, -4, -50, 29, 61, + 18, -101, 14, 73, -26, 41, 31, -57, -61, -38, + 33, -9, 59, -18, 41, 86, 21, 82, -4, -41, + -110, -84, -60, 38, 44, 127, 91, 0, 43, -96, + -65, -71, 88, -71, 55, -79, -79, 38, -58, 42, + 19, 33, 46, 26, -32, 127, 52, -40, 50, 57, + 11, 35, 21, -1, 6, -106, -52, 43, 68, 46, + 61, -57, 9, -4, 84, 65, -19, 52, -57, 32, + 36, 28, -8, 5, -17, -55, -7, 52, -52, -6, + -4, 10, -58, -36, -8, 11, 30, 29, -28, -23, + 62, 15, 34, 30, 2, 5, -78, -33, 84, -52, + 10, 3, -16, 27, -75, -52, 81, -48, -11, 6, + 51, 14, -6, -3, 9, -89, -99, -95, 18, -103, + -4, -51, 37, 114, 72, 64, 31, 31, 41, 86, + -86, -28, 60, -40, 85, 76, 21, -32, 43, -42, + 2, -54, -43, -16, -34, -8, -15, -49, 26, -55, + -25, 14, 31, 61, 3, 30, -38, -65, -48, -47, + 62, 25, -48, 43, -66, -90, 46, -52, 36, 25, + 93, -29, 30, 83, -65, -127, 65, 37, -68, -9, + -99, 108, -31, -45, 91, -39, -5, 98, 64, -46, + -7, 77, -29, 8, -27, 90, -39, 41, -67, 58, + 34, 45, 6, 47, -48, -6, 113, -76, 98, 41, + -6, -66, 14, 73, -4, 62, 90, 26, 37, -50, + 85, 1, 8, 100, -4, -59, 21, 92, 80, 8, + -118, -5, -67, -21, -27, 28, -25, 72, 65, -24, + -97, 78, 127, 61, -82, -21, 72, -83, 48, -71, + 22, 88, -28, 107, -3, 59, -5, -17, -54, -62, + -2, 33, 76, 5, 53, 99, -53, 44, 86, -35, + 70, -15, 23, -66, -39, -24, 56, -52, 54, -44, + 55, -127, 90, 22, 49, 36, 60, -2, -74, 62, + 59, -6, 56, 6, -2, 6, 97, 103, 6, 42, + -54, -24, 32, 68, 102, 99, -71, -13, -4, -84, + 103, -22, 45, -51, 56, -64, -21, 16, -13, 42, + -8, 73, 49, 127, -14, 87, 28, 2, 32, 29, + 38, 27, 45, -56, 11, 30, 63, 50, -46, -30, + 27, 32, -33, 65, -10, 28, 56, -43, -50, -45, + -35, -13, 3, -3, 83, -28, 114, -31, 21, 41, + -53, 37, 36, -107, 15, 35, -97, 45, -94, -68, + -12, -37, -86, 6, 23, 97, -25, -1, 11, -65, + 50, -127, 81, -70, -106, -119, 34, -80, -42, -50, + -55, -7, -2, 21, 76, 47, 95, -55, 113, -27, + -26, 14, 26, -58, -37, 4, 18, 29, 95, -10, + 63, -91, -85, 27, 113, 74, 15, -9, -68, 27, + 47, 49, -63, -21, -55, 81, -8, -24, -4, 16, + 4, 13, 30, -41, -34, -68, 19, -1, 50, 50, + -127, -8, 17, 74, 84, -48, -33, 62, 11, -27, + 106, 92, 55, 13, -13, 77, -29, -68, -35, -27, + -44, 42, 51, -98, 23, 33, 74, 17, -14, 46, + -11, -38, -17, 3, 63, -11, -5, 15, -36, -8, + 44, -32, 94, 26, 33, -45, -52, 10, -20, 17, + -21, 28, -79, -14, -20, 12, 90, -51, 32, -41, + -41, -21, 35, 71, -23, 38, 4, 67, -50, -58, + 21, -65, -37, 50, -7, -41, -20, 65, -6, 39, + 10, -46, 104, -38, 49, 9, 70, -15, 56, 51, + -55, 45, -27, 99, -61, 8, 55, -43, 98, 83, + 115, 35, -3, 11, 42, 102, -45, -24, -83, -20, + 63, -5, 4, 103, -24, 42, 117, -29, 112, 67, + 9, 30, -61, -79, -73, 12, -80, -107, -82, 48, + 73, 2, -74, -44, 39, 16, -41, -46, -18, -45, + 29, 83, -121, 78, -78, -33, -8, 94, -68, -25, + -53, -76, -2, -29, 18, 40, 55, -30, 35, 74, + 49, 32, -54, 19, 68, -67, -75, 75, 71, 26, + -25, -78, 15, 9, 37, 1, 112, -64, -22, -68, + -127, -9, 14, -25, 37, -57, -54, -39, -112, -39, + -37, -45, -45, -38, -33, 69, 5, 113, 124, -41, + 34, 35, -9, -8, -39, -65, -1, 36, 59, -39, + 67, 64, 43, 0, 44, -1, 53, -42, -40, 23, + -50, -57, 20, 33, -6, 8, 17, -127, -52, -7, + -43, -20, -1, 90, -64, -108, 17, -51, -24, 49, + 50, -8, 20, 7, -41, 59, -32, -57, -18, 9, + -6, -28, -26, 55, 36, -13, 20, -21, -14, -46, + 87, -28, 32, -25, -51, 102, -27, 34, -26, -68, + -70, 88, 85, -21, 12, 50, 122, 67, 127, 1, + -15, 73, 17, -25, -51, 78, -32, -40, -81, 35, + 19, -95, -28, -18, 50, 10, 33, 1, 23, -45, + -46, -55, -23, 41, -33, -48, -6, 71, 36, 13, + 77, 48, -28, -37, -38, -30, 51, -43, 74, -25, + 23, -61, -103, -45, 43, 15, -104, 46, 43, 68, + -55, -14, 22, 108, -10, -34, 13, -45, -82, -98, + 20, 77, 29, 17, 25, -24, 52, -6, 4, 39, + -97, -74, 40, -85, -45, 84, -38, -6, -21, 55, + -41, -95, 7, 1, 102, 97, -59, 13, -19, 92, + -26, 73, 33, -50, -43, -98, -49, 34, -48, -74, + -22, 79, -44, -23, 7, 35, 73, -98, -76, 51, + 34, -32, -73, -72, 15, -62, -68, 9, 91, 77, + 85, -55, 74, -27, 41, -19, -32, -60, 15, -61, + 30, -28, 72, 28, -57, 11, 3, 7, -53, -70, + 17, -17, -44, 45, -12, -24, 69, 65, -18, -3, + 21, 85, 28, 61, -37, -115, -6, -73, 59, -80, + -40, -47, 76, 4, -59, -41, 112, -29, -12, 102, + -1, 89, 71, 28, 67, -75, -13, -70, -16, 58, + -114, -28, -68, 39, 50, 34, 56, 7, 10, 4, + 12, 2, -127, 11, 5, -69, 91, 30, -83, -4, + 86, -19, -42, 24, 14, 5, 60, 25, 12, 32, + -84, -33, 20, 4, -29, -40, 53, 2, -35, -73, + 0, 6, 59, -18, 3, -28, 30, -49, 49, -90, + -1, 93, -37, -36, 14, 79, -66, -31, 31, -8, + 16, -6, -12, -32, 68, 49, 26, -21, -69, -13, + -95, -13, -107, 15, 34, 62, -4, -37, -69, -59, + 26, -13, -59, -85, 50, -84, -38, 0, -11, 51, + -16, 22, -69, 6, 127, -3, -31, -56, -60, 14, + -12, 7, 76, 18, -34, -63, -79, 15, 58, 14, + 41, -32, 20, 54, -7, 43, -12, 24, -41, -65, + 63, 2, 64, 29, -62, -61, 2, -81, 36, -8, + 68, 53, -11, -7, -14, -41, 95, 15, 113, 6, + -16, 77, -92, -57, -62, -93, 89, 95, -53, -56, + -18, -28, -67, -19, -79, 98, 17, -18, 6, 63, + 41, -47, 20, -79, 52, -74, 53, -57, -84, -98, + 80, 12, -21, 73, 37, 35, 79, -26, 66, 56, + -46, 86, -67, 60, 45, 66, 34, 54, -36, 21, + -3, 28, -20, -61, 54, -84, -21, 19, 60, 119, + 85, -67, 26, -99, -127, -83, 65, -33, 5, 5, + -74, -43, -6, -56, -33, -13, -19, 27, -7, -49, + 72, 45, 10, -36, 74, -53, 44, -66, 42, -74, + -54, -21, -26, 55, -64, -6, 14, -50, -53, -66, + -34, -29, 56, -82, 32, 45, -24, -14, 70, -102, + 71, -72, 65, -33, 19, 73, -75, 37, 28, -1, + -24, -12, -83, 66, -66, 22, 32, 64, -55, -8, + -7, -22, 66, -65, -49, -38, -61, -31, 106, -101, + 54, -58, -71, -28, 22, 3, 123, 79, 28, -69, + 20, 46, 38, -3, 27, -27, 13, -36, -75, 49, + -49, -65, 10, -49, -2, 59, -96, 5, 76, 0, + 92, -39, 25, -18, 45, 79, 7, 39, 49, -31, + 2, -20, 53, 58, 4, -57, 42, -62, 70, 37, + 30, -11, 1, -29, 36, 1, -23, -94, -71, 57, + 69, 19, 88, 60, -91, 30, 39, -40, -20, 23, + -17, 124, 36, -50, 4, 32, -105, 55, -57, 62, + -17, 65, -54, 36, 47, -52, 78, -56, 40, 77, + -15, -35, -55, 66, 30, -33, -20, -83, 0, -25, + 73, 95, -31, 33, -48, 14, 96, -87, 3, 36, + -68, 65, -24, 42, -41, 73, -31, 30, -28, 35, + -94, 73, 15, -109, 22, -12, -25, 30, -77, 20, + 40, 68, 33, 60, 38, 74, 60, -18, -35, -5, + -70, 90, 47, -104, 94, 68, 48, 116, -30, 26, + 69, 55, -34, -53, -47, 69, 51, 4, -81, -63, + 44, 21, 47, -84, 25, 29, 8, -50, -36, 47, + -67, -3, 81, 52, 29, 83, 43, -52, -40, -79, + -101, -18, 31, 1, 106, 45, -5, -20, 74, -46, + -3, 26, 35, 58, 46, 39, -37, -58, 127, -24, + -69, 61, 12, -9, -45, -26, -13, -27, -37, 58, + -19, -70, -50, -24, 68, 85, -73, 40, 85, 5, + 29, 53, -53, 81, -22, 46, -92, -19, 70, -44, + 63, -49, -2, 21, -71, -48, -37, -77, -53, -6, + -38, -31, 13, 3, -5, 63, 78, -7, -53, -70, + 27, 72, 25, -35, -21, 47, 55, -46, -25, 48, + -48, 61, -94, 65, 33, 3, 1, -74, 22, -65, + 24, -40, 17, -31, 47, 38, -13, -25, 30, 10, + 15, 10, -77, -51, -33, 22, -29, 49, -5, -11, + 3, 14, -52, -31, -23, -23, 47, 103, -47, 13, + -101, 85, -10, -34, 13, -52, 92, -42, -60, 2, + 7, 34, -31, 62, -45, -43, 20, 46, -67, 51, + -67, 111, -75, -66, 24, 45, 106, -29, 57, 15, + 43, -62, 57, -82, 75, -1, -30, -105, -76, 88, + 49, -23, -6, 41, -106, 2, 106, -18, 17, -84, + 41, -91, 27, 44, 34, -13, -66, 79, -127, -20, + 2, 6, -48, 52, 9, -26, -76, -127, 4, 15, + 21, -114, -47, 16, -67, -74, -47, -90, 52, -51, + -36, 28, 59, 47, -13, 9, 17, 42, -30, -100, + -97, 72, 61, 50, -71, 43, 47, -127, 64, -53, + 29, -34, 45, 22, 119, -13, -4, 14, -46, -8, + 6, -26, -74, 0, 53, 65, -38, -61, 20, -27, + 17, 4, -23, 41, -45, 39, 51, 14, -34, 98, + -62, -2, -85, 1, -1, -63, 36, 45, 40, 10, + 73, 2, -77, 36, 63, 55, 75, 40, -36, 5, + -13, -9, -11, 85, -87, -44, 31, -49, -68, 33, + -1, 6, 34, -40, -48, 81, -9, 15, 37, 36, + 32, 40, +}; +const ALIGN(8) int32_t tensor_data71[64] = { + -495905, -190876, 1099499, -717070, -388271, 1449897, 52867, 295884, 3843540, 5144693, + 3121274, 2286673, 2946502, 2379661, 3033990, 4534492, 80960, 1552237, -476738, 3166778, + 591545, -687231, -1163489, -260571, 7100339, 2835663, 2567137, 2969029, 3483157, 4318254, + 2954878, 3058659, 582134, -1149835, 1171803, -1927339, -1146591, 160054, -920549, 170288, + 3675931, 2293014, 1841928, 4627067, 2356483, 3064793, 3161787, 5953782, 514324, -595372, + 104002, -1443384, 291682, -40280, 608785, -126823, 3678209, 2785358, 4788613, 2602741, + 4989481, 2993036, 2693294, 2719673, +}; +const ALIGN(8) int8_t tensor_data72[2816] = { + -95, -20, 40, -14, 42, 1, 14, -36, 86, -105, + 6, -72, 80, -41, 91, -36, 33, -98, -93, -102, + -68, 54, 6, -55, 110, 93, 51, 62, 127, -98, + 35, -64, -114, -7, 60, 2, -20, -58, -7, -2, + -53, 67, -31, -81, -25, -28, 115, 0, 92, -66, + -40, 10, 74, 51, 18, 26, 14, 7, 127, 76, + -45, -46, 61, 26, 21, 37, -17, -35, -98, -19, + -44, -57, 70, 14, -96, 104, -3, -59, 93, -49, + 89, -63, -29, 4, -43, -8, -42, -63, -52, 89, + 1, 83, 126, 82, 61, 9, -62, -25, -94, -61, + 99, -67, -92, 70, 26, 90, -49, 70, -11, -45, + -75, -29, 93, -67, -69, -11, 11, -88, -14, 27, + -57, -74, -66, 26, -77, -57, -65, 112, -10, 114, + 26, -3, 54, 4, -46, 70, -99, 72, 49, 127, + -103, 65, 83, -39, -73, -64, -52, -42, 2, -36, + 28, -47, -59, -127, -53, -81, -28, -17, -11, 39, + -7, 48, -94, 70, 8, -69, -98, -86, -76, 1, + 51, -75, 127, -35, 79, -62, -62, -15, 103, 52, + 71, 58, 24, 14, -78, 4, 93, -64, 7, 127, + -28, 16, -72, 78, 41, 19, -47, 25, -35, 34, + 7, 55, -55, -13, 127, 81, 20, -63, -115, 116, + 97, -57, -58, -105, -82, 106, 41, -94, -49, -122, + 7, -45, 30, -104, 60, 69, -20, 100, -6, 99, + -84, 62, -10, 40, -117, -64, 42, -21, 127, 17, + -3, -63, 66, 51, 35, -57, -4, 55, -12, -56, + -1, 29, 127, 57, 16, -25, -127, -36, 20, -74, + 51, 102, 66, -62, 4, 14, -5, -37, 21, -10, + 92, -17, -31, 25, -101, -74, 105, 17, 20, 32, + 102, -25, 21, 27, 37, -31, -55, -21, 83, 98, + -85, -127, 111, -59, -53, 49, 117, -64, -86, 63, + -90, -40, -84, -13, -74, 5, 21, -40, -20, 42, + 45, 36, -81, 8, 54, 101, 114, 76, 15, 87, + 93, -17, -39, -127, -3, 18, -91, -3, 108, -94, + 27, -100, 61, 93, -75, -99, 79, -47, -33, -63, + -32, -37, -44, -96, 23, 112, 102, 33, -30, 127, + -35, -65, 84, 127, 42, -52, 47, -26, -34, -32, + 39, -84, -90, -57, 73, 28, -66, -51, 78, 127, + 32, 5, -34, -97, -114, -83, 40, 92, 23, -60, + 83, -61, -2, 26, -111, -87, 16, 88, -108, 114, + -76, 35, -44, 22, 12, 22, -120, 17, 79, 47, + -57, -3, -116, 13, -19, -61, -82, -118, -65, -19, + -38, 43, 31, 7, -20, -83, -23, 98, 31, -19, + 2, -84, 14, -53, 99, 49, -62, -36, -125, 111, + -36, -50, -69, 16, -2, 98, -24, 13, -100, 81, + -22, -17, -13, -83, 103, -78, 116, -28, 12, -44, + 61, -34, 69, 19, 2, -13, 9, -49, 4, 7, + -82, -2, 68, 4, -77, 29, -100, 126, -26, 66, + 28, -94, -15, -104, 82, 21, -63, 80, 127, -33, + -31, 42, 110, 19, -3, -65, -101, 46, -8, 73, + -5, 76, -49, -109, 50, 82, -18, -14, -53, 33, + 13, 25, -85, -4, 6, 12, -46, 14, 18, 61, + 29, 33, -30, 25, -13, -61, 17, 37, -8, 15, + -55, -114, 64, -53, 42, -79, 55, -75, 87, 79, + -68, 75, -45, -21, 4, 71, -54, -6, -32, 6, + -22, -14, 16, 12, -83, 52, 26, 63, 10, -23, + -13, 14, 44, 48, 21, -58, 19, 77, 51, -35, + -51, 20, -17, 52, -1, -43, -7, -54, -68, -35, + -52, -54, 81, 3, -46, 21, -48, -68, 52, 11, + -74, -67, -22, -75, 42, -66, -76, -72, -41, -45, + 41, 27, -9, 91, 8, -22, 8, -67, 28, -12, + -62, 95, 66, -58, -13, 52, -68, -10, 93, -20, + 26, 0, 2, 19, -7, 85, 44, -71, 39, -81, + -36, 77, 31, 40, -67, -26, 18, 18, -57, 13, + -9, -86, 11, -17, 31, 38, 43, 9, -4, 23, + -30, 71, 40, 37, -21, 55, 11, -37, -90, -65, + 43, -41, -51, 61, -6, -4, -37, 34, -53, -5, + -23, 24, 38, -59, 7, -38, -8, -27, -30, -73, + 36, -63, 23, 26, -12, -69, 74, -18, 25, -38, + -16, -43, -43, 49, -55, -45, -5, -15, -23, 36, + 45, 8, -4, -23, -83, 52, 60, 2, -83, 11, + 3, 21, -49, -68, -39, -38, -40, -25, 45, -29, + -50, -53, 64, 10, 30, -38, -2, -39, 19, -56, + -62, 60, -77, -11, -48, -40, 99, -9, 22, -70, + -97, -80, 59, -60, -49, -36, 27, -35, -32, 20, + 52, 79, 2, -51, -46, 37, -35, -46, 11, 3, + 9, 52, 53, -34, 9, 24, -41, 4, 7, 25, + -40, 28, -23, 18, -11, -33, -21, -15, 108, 42, + 35, -1, -29, 43, -14, -27, 0, 12, 1, -1, + 74, 74, -100, 8, 14, -24, 48, 8, -10, -45, + 24, 80, 22, 71, -81, 59, 52, 39, -39, 7, + -49, 50, 75, -88, -32, -18, 96, -95, 59, 52, + 44, 78, 94, -27, 29, -57, 18, -21, 39, 1, + -46, 5, 77, 38, 77, 77, -7, 67, -53, 3, + -55, -64, 50, -35, 26, -5, 41, -44, -67, 52, + -52, -68, 59, 55, -54, 46, 52, 43, 13, -20, + 24, -30, 14, -24, -36, -28, -54, 16, 24, -80, + 12, 34, -124, 90, 5, 57, 33, -38, -41, -21, + -5, -13, -16, 75, -24, -30, -78, 49, 31, -47, + -83, -5, -2, -20, 7, 5, 46, -69, -44, 80, + -15, -24, 13, -34, -42, 10, 72, 20, 57, -37, + 79, 18, 45, -3, 56, 27, 20, 106, -30, 33, + 57, 18, -51, -19, 65, 65, -11, 19, -15, 44, + 19, 4, -27, 16, -56, 35, 40, -5, -92, -61, + 37, 22, -15, 28, -10, 32, -46, -55, -65, 8, + 29, 71, 26, 42, 50, -8, 84, 89, 65, 13, + -99, -1, -35, -53, 68, 16, -59, -4, 47, -63, + -19, 15, 18, 29, -24, -41, 48, -51, 4, 24, + 25, -35, -16, -20, 13, 36, -77, 30, 64, -32, + 43, 95, 41, -77, -36, -8, 97, -1, -16, -39, + -31, 62, -35, 45, 22, -42, 1, 28, 0, -10, + -68, -27, -54, -43, -2, 16, 5, -3, 23, -6, + -23, 47, -43, -15, -30, 24, -6, 26, 9, -6, + -50, -3, -3, 8, 77, -86, 48, 14, -3, -38, + 68, -42, 0, 0, 38, -6, 5, -47, -74, 1, + 60, 41, -78, 9, 12, -62, 8, -26, -89, 38, + -20, -16, -23, -50, 38, -29, -27, 46, 8, 28, + -78, -40, -23, 4, -76, 12, -31, 12, -68, 57, + 2, 20, 81, 23, 88, -53, -45, -55, -22, -28, + 29, -17, -67, -29, 46, -3, -88, 2, 6, 44, + 9, -46, 25, -12, -48, 44, 51, 9, -32, -42, + 32, 30, 16, 33, -24, 1, 18, -22, -8, 46, + -72, 17, 94, -1, -74, 53, 0, -53, 72, 88, + 58, -68, 62, -18, -56, 58, 40, 24, -34, 93, + 90, 46, -72, 44, 83, -31, -25, -43, -11, 15, + 34, -47, 90, 22, 77, 19, -11, -30, -29, -2, + 16, 24, 14, -66, -30, -68, -6, -20, -41, -34, + -93, 75, -77, -51, 42, -82, 101, 65, -36, -46, + 51, -36, 60, 21, -61, -2, -17, 28, 22, -25, + -79, -9, 21, -42, -9, -61, -71, 50, 13, 74, + -38, -7, 8, -67, -6, -14, -25, 16, 77, 13, + -70, 6, 21, 3, 52, 48, -38, -1, 41, -5, + -17, -12, 84, 27, -58, 65, 22, -12, 51, 1, + 47, 14, 38, 39, 7, 25, -21, -15, -3, 28, + -53, -17, -82, -69, 8, -6, -53, 30, -73, 73, + 49, 10, -20, 38, -51, 22, 101, -46, -29, 61, + -69, 90, -20, -44, 6, -28, -9, 65, -58, 56, + -9, -40, -4, 4, 6, 18, 33, -14, -20, 6, + -6, -13, -22, -2, -1, -10, -39, -18, -25, -31, + -42, -58, -71, 12, 38, -26, -42, 27, 38, -31, + -29, 46, 127, -71, 49, 16, 34, 8, -59, 46, + -29, 37, 4, 92, -102, -25, -36, -6, -47, 62, + 58, 39, 15, 46, 25, -102, -49, 50, 60, -32, + -1, -86, 43, 67, 6, 34, 64, 87, 34, -19, + -59, -78, -38, -47, -69, 9, 15, 14, -26, -83, + 69, -106, 27, 50, -44, -43, 40, -10, -7, -38, + 54, -13, 18, 69, 93, -8, 38, 4, -80, 78, + 81, 78, -57, -102, -70, -67, -110, -13, 127, -43, + -81, -117, -22, 6, -45, -4, 17, 96, 7, -14, + 93, 95, 1, -12, -83, 118, 88, 34, -2, -28, + -50, -55, -9, 70, -16, -30, -47, -48, -29, -30, + 4, 14, -14, -15, -45, 57, -127, -1, -13, 50, + 63, -18, 35, -13, 11, 57, 15, 11, 52, 100, + 56, -18, 53, -5, 51, 13, -7, 112, 44, -54, + 41, -81, -46, 106, 97, 113, 67, 68, -127, 48, + -8, -122, -37, -106, -48, -110, -109, -117, 111, -7, + 55, 49, 15, -20, 35, -15, 64, -50, 88, -19, + 2, -78, -87, -62, -40, -19, -31, -60, 22, 6, + 84, -13, -64, 2, 67, 12, -77, 123, 85, 120, + -108, -20, -68, 0, -107, 77, -122, 50, 65, 109, + 79, 48, 107, 59, 93, -56, -127, -56, -2, 60, + -51, -1, -35, 118, 11, 31, -56, 85, -46, -51, + -61, 65, 84, -15, 40, -54, -74, -38, 37, -60, + 27, 6, 10, -11, 10, 3, -90, -81, -26, -58, + -61, -7, 127, -94, 110, 58, -36, 2, -67, 36, + 47, 28, -10, -25, -13, -19, 38, 66, -27, -24, + 11, 36, -100, 62, 110, 127, -99, 84, -2, -14, + -53, -64, 100, 19, -25, -100, 39, 37, 24, -40, + -64, 85, 94, -20, -81, -37, 23, -63, 77, -54, + -65, 84, 42, -34, -24, 127, -99, -37, 27, -82, + 75, -4, 39, -73, 48, -75, -40, 105, -34, -42, + -31, -46, 47, -49, -75, 70, 62, 33, -115, 125, + 72, 53, 3, -127, -17, 34, 109, 68, -104, 92, + 55, 26, 25, -68, 96, 37, 78, 65, -7, 124, + 7, -47, -127, -30, -52, 69, -46, 97, -62, 118, + -115, -31, -4, 102, -16, 6, 6, 108, -20, 19, + -23, 30, 8, 11, 45, -21, -39, -2, -45, 8, + -6, 65, 56, -36, 50, -18, 84, 14, 38, -50, + 68, 15, 19, 70, 127, -65, 64, -20, 59, 19, + 3, -121, -69, 46, -64, -56, 81, 100, -71, -87, + 48, -39, 31, -53, 31, 28, 34, 116, -37, -85, + 100, -121, 41, -72, 54, 47, -28, -80, 59, 1, + -93, -127, -40, 116, 70, -18, -82, 14, -31, 71, + 62, 2, -127, 41, -17, 62, -47, 77, 55, -127, + 39, 96, -50, 60, 79, -34, -85, 98, -32, 31, + 98, 18, 87, 78, -77, -121, 16, 54, -49, 30, + -4, -81, -22, -2, 70, -62, -37, -33, 107, -56, + 0, 6, 42, 127, 57, 7, -96, -105, 101, -4, + 32, -27, 79, -59, -111, 3, -85, -5, 52, -81, + -35, -53, -105, -27, 92, 13, 2, 20, -38, 89, + 15, -78, 24, -26, 4, 23, -23, -29, 7, 25, + -14, 23, 11, 12, -8, 27, -53, -3, 51, -2, + 65, 36, -83, -93, -55, 26, 21, -50, -73, 13, + -19, -7, 66, -7, -1, -39, -31, 62, 42, -9, + 21, -84, -44, -62, 32, -1, 22, 111, 47, 52, + 13, -18, 34, -68, -55, 31, 13, 33, 45, 15, + -45, -42, -30, 38, 69, -54, -10, 33, -49, -11, + -15, -15, -85, -7, 75, -5, -65, 58, 62, -41, + 1, -42, 39, -21, 37, -22, 57, 10, 68, -80, + -58, -77, -17, -27, 33, 3, 58, -34, -2, -60, + -2, 61, 33, 26, 77, 55, -47, 49, 51, -37, + 42, 73, 55, 3, -49, -47, 38, 11, 36, 7, + 23, -35, 18, 47, 19, 7, 62, 40, 44, -30, + -29, 28, -42, -34, 51, 2, -22, 17, 23, 7, + -72, -28, 7, 34, 40, 34, 4, -6, 65, -67, + 81, 63, -1, -82, 42, -83, -49, -76, -40, 81, + 75, 105, 79, 39, 1, -8, 64, 85, -63, -16, + 21, 26, -69, 72, -80, 40, -72, 26, 60, -22, + 67, -30, -31, 87, -19, 62, 49, 72, 7, -39, + 8, 23, -44, -17, -45, 49, 37, 36, -38, 4, + 103, -69, -2, 10, 29, -57, -40, -40, 85, 59, + 85, -29, 24, 8, -95, -80, -18, 77, -8, 60, + -19, -57, 30, 79, -52, -66, -43, 104, -72, 5, + -71, -62, -91, -58, -46, -35, 6, 28, 57, -73, + 93, -52, -18, 28, -7, -2, -44, -52, 21, 35, + -29, -57, 56, 40, -38, 17, -56, 47, -3, 20, + -50, -13, 3, -22, 34, -22, 29, -43, 40, -34, + 5, -49, -2, -9, 31, 20, -37, 47, -10, -38, + -53, -67, 58, 15, 93, -68, -42, -63, -63, 87, + -2, -77, -6, 17, -68, 80, -6, -71, -12, -74, + 101, -33, 91, 41, -36, -17, 13, 22, -43, -42, + 40, 69, 1, 12, 31, 24, -2, -62, 56, -66, + 57, -35, -80, 14, 44, 29, -25, -39, 12, -51, + -59, 30, 7, 5, -19, 35, -19, -5, 59, -1, + 60, 87, -57, 6, 22, -12, -48, -10, -41, 3, + 29, 60, -79, -18, -50, 39, 0, 11, 0, 20, + 61, -15, -44, 4, -43, -65, 17, -2, 61, 39, + 1, -7, -6, -15, 2, -26, 30, 42, 3, 21, + -42, 24, -82, -34, 27, 34, -35, 27, -60, -16, + 46, 8, -62, 2, -4, -21, 37, 14, -5, -21, + 19, 77, -52, 55, 74, -78, 48, 40, 87, -66, + 30, 63, -37, 53, 31, 53, -20, 7, 35, -44, + -67, 44, 60, -37, 47, 46, -57, -54, -27, 71, + -47, -51, 26, -47, -50, -69, -38, -22, -6, -32, + -28, -8, 13, 64, 20, -41, -18, 1, -83, 34, + -34, 58, 21, 68, 12, 60, 67, -57, 25, 8, + 88, 75, -52, 10, -81, 33, 44, -36, -90, -36, + -20, -4, -57, 57, 23, 63, 77, 44, -1, 56, + -30, -34, 48, -100, 37, -24, -9, -65, 33, 84, + -61, 68, 108, -32, -78, 40, -103, 52, -38, -24, + -19, -2, 46, -51, 6, 58, 8, 52, 18, 72, + -78, -44, 36, 44, 8, -22, -39, -20, 12, 1, + 42, 27, 38, 44, -24, 1, 10, 16, -38, 16, + -29, 51, 53, -63, -4, 0, -34, -5, 40, -31, + 22, 83, -1, -10, 12, 73, -53, -97, 52, 88, + 41, 18, 127, -15, -46, 67, 37, -8, -28, -73, + 101, -27, -47, 14, 69, 48, 49, -65, 19, -41, + 73, 1, -42, 31, 34, -50, -59, -44, -66, -68, + 75, -69, -13, -63, -51, 33, 31, 51, 66, -66, + -41, 4, -16, 42, -32, -17, -6, -56, -90, 54, + -67, -40, 16, -56, 49, 53, -45, 4, -13, -3, + -17, -6, -68, 35, -69, -27, 56, -48, 69, 4, + -7, 46, -81, 14, 8, 11, -2, -15, -12, 66, + 46, 26, -46, 2, 1, 20, -72, 21, -47, -32, + -5, 24, 13, -72, -54, -25, 36, -19, 32, 26, + 20, -6, 59, -6, 2, -4, 64, -22, 55, 20, + 26, -1, -27, 80, -43, 22, -75, 79, -90, -25, + 48, 61, 17, -38, 64, 57, 40, -13, -86, -3, + 55, 24, -49, -4, 31, 36, -46, 14, -35, 63, + 28, -11, -38, -29, 68, 75, 50, -2, -30, 21, + 7, -45, 15, -51, -71, 42, 73, -60, 45, -21, + -67, -49, 14, 51, 41, -24, -26, 24, 11, 23, + -41, -64, 23, -50, -47, 18, 81, 12, 70, -27, + -49, -14, 51, 52, -6, 69, -50, -42, -41, -55, + -50, 29, -45, -6, -64, 90, -1, 19, 21, -10, + 64, 63, 30, -29, 7, 54, -27, -8, 59, -25, + 32, -29, 10, -16, -62, -40, 23, 42, 24, -45, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, +}; +const ALIGN(8) int32_t tensor_data73[64] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1327852, 1665629, + 1098688, 1791341, 1844902, 1433398, 457047, 1097224, 0, 0, 0, 0, + 0, 0, 0, 0, 1903745, 1273224, 711941, 847647, 1265567, 1040632, + 1304505, 1712670, 0, 0, 0, 0, 0, 0, 0, 0, + 888417, 1109711, 1293059, 1143370, 1863484, 1002525, 2043063, 1063310, 0, 0, + 0, 0, 0, 0, 0, 0, 1099095, 596433, 1089775, 744404, + 1465273, 1186675, 1137238, 945126, +}; +const ALIGN(8) int8_t tensor_data74[3072] = { + 93, 23, 53, 69, 84, -60, -81, 72, -31, -23, + -51, 45, -69, 33, -71, -79, 48, -27, -7, 8, + -50, 23, 35, -4, -39, -20, 31, 3, -2, 19, + 43, 14, 13, -27, 15, -39, -17, -34, -10, -19, + 70, 88, 7, -5, 32, 1, 20, -5, -21, -63, + 23, 2, -45, 65, 17, 48, -52, -92, 31, 2, + -15, -49, 63, 50, 29, 0, 5, 29, 7, 6, + -54, -41, 38, 49, -28, 42, -10, 45, -8, -18, + -35, 2, -7, 73, -71, -21, -93, -76, 1, 48, + -41, -4, -69, 58, -38, -33, 21, 6, -1, 47, + -47, -40, -38, 64, 6, -41, 16, 46, 10, -35, + 7, -35, 59, 42, 13, 68, -15, -13, -47, 6, + 1, -50, 75, 17, 0, 3, 69, 10, 0, 14, + -10, -41, 3, 28, 18, -53, 47, -61, 29, 3, + -4, 61, -2, -3, 73, -22, -56, 121, -16, 40, + -64, 18, -63, 48, 0, 66, -57, 78, -13, 15, + 30, 42, 8, -10, 42, -13, -61, 31, -101, -15, + -75, -44, -39, -1, 45, 2, -4, -35, -11, -27, + -31, 29, 9, -39, -26, -24, -5, 47, 27, 43, + 38, -41, 24, -73, 18, -13, 47, 50, -50, 36, + -25, 16, -31, 30, 13, 21, 12, 25, -18, 64, + -57, -4, 37, 11, -36, -62, 6, -50, 33, -31, + 32, 10, -35, 36, 72, 30, 4, 96, -29, 71, + -127, -32, 10, 25, 44, 10, -28, 22, 44, 56, + -44, 78, 27, 48, -26, -27, 14, 118, 47, 34, + 13, 52, -40, 21, -79, -56, -53, -8, 55, 49, + -6, -121, -32, 8, 29, -15, 58, -74, -95, 29, + 97, -77, -31, 6, 12, 8, -13, 50, 64, -20, + 7, -7, -36, 22, 19, 21, -30, 15, 78, -57, + 19, -43, 37, 105, -36, -29, 7, -60, -1, 14, + 96, 3, -31, 12, -19, -30, -47, -54, -32, 3, + 53, 7, -62, -11, -109, 63, 2, 51, -39, 24, + 5, -13, -59, -10, 25, 10, -39, 9, -5, -46, + 34, -16, 32, 33, 1, -32, -39, -25, -92, -53, + 98, -65, -23, -62, -46, 88, 0, -66, 58, 6, + 127, 5, -35, 33, 28, -11, 65, 17, 41, -22, + 19, -45, 43, -27, -53, -27, 16, 17, 81, -36, + -23, -79, 18, -29, 22, 47, -56, -7, 18, 39, + -6, 39, 20, 24, 2, 25, -9, 10, 32, 65, + -21, -10, 3, 9, 3, -39, 49, 26, 19, 9, + 15, -49, -48, -82, -50, -70, -60, 102, -65, -6, + 53, 13, 43, 37, 66, -19, -73, 127, 6, -17, + -2, -17, -80, -19, 33, 12, 61, -52, 34, -5, + 49, 37, 35, -38, 42, -49, -2, 104, -33, 8, + -5, 10, -5, 0, 75, -26, -10, 7, 86, -31, + 1, -8, 15, -65, -38, -25, -54, 29, 27, 44, + -30, 17, 11, 35, 41, -26, -90, -10, 59, 36, + 34, 49, -18, 20, 64, 2, 5, -39, -1, 16, + 50, 39, -18, 0, -8, 1, 25, 54, -39, -55, + -1, -29, 31, 5, 56, -10, -47, 109, 112, 18, + -19, -96, -75, -36, 39, 0, -9, -22, -11, 86, + 35, -51, 0, 29, -51, 53, -12, 42, -21, 95, + -39, -28, 30, -83, -50, 64, -8, 12, 24, -20, + -44, -46, -18, -77, 48, 9, -21, -8, -7, 22, + -39, 55, 15, 15, 6, -53, 47, 33, -23, -20, + -42, -103, -23, 44, 47, 108, -31, 13, 46, 28, + 81, -8, -8, 26, 46, 49, 0, 64, 0, 11, + 56, 11, -59, 18, -127, 78, -17, -30, -20, 39, + 1, 35, -39, 29, 4, 7, 29, 8, -29, 31, + -17, -36, 16, -32, -86, -45, -19, -70, -46, 96, + -24, -13, 17, 84, 1, 12, 40, 36, -36, -45, + -24, -60, 9, 10, -10, -12, -45, -10, -7, 35, + 28, -23, 33, -29, 40, 29, -41, 81, -40, -5, + -57, -8, 16, -15, 82, 29, -43, 44, 57, -14, + 19, -24, -40, 50, 60, 35, -26, 7, -61, -72, + 34, 18, 5, -10, -50, 8, 6, 103, 22, 98, + -18, -7, -31, 65, -40, -2, -47, 4, -56, 117, + 59, 14, 44, 26, -106, -8, -12, -67, 14, 97, + 39, 6, -67, -63, 21, 35, 11, 58, 5, -15, + -47, -17, 33, 11, -52, -77, 51, 5, 1, 48, + 27, 58, -11, 41, -21, 102, -15, 12, 40, -44, + 27, -29, 6, -28, -32, -46, -21, -1, -47, -19, + 49, -29, -15, -21, -40, 75, 29, 41, -1, 36, + -9, 57, -7, 83, 2, 33, 17, -14, 30, 117, + -51, -10, -68, 8, 25, -43, 21, -41, 8, 14, + -11, -4, 22, 9, 88, -15, 9, 25, 33, -2, + -25, 90, -18, -22, -31, -23, -78, 54, 11, 14, + 2, 0, 39, 3, 42, 29, -42, -17, -20, 41, + 10, -57, -44, 26, 40, -36, -39, -19, 56, -23, + -12, 23, -3, -9, -91, 50, -58, 2, -11, -20, + -17, 21, -15, -47, 52, 83, 0, -56, 23, -33, + 30, -2, 33, 0, -69, 26, -29, -2, 68, 37, + -85, -76, -18, 43, -57, 19, -39, -8, -12, -3, + 66, -12, -15, -28, -22, -45, -48, 20, -32, 32, + 11, -1, 16, -50, 51, 4, -26, -23, 35, 34, + -64, -31, -73, -76, 76, 39, -56, -2, -33, -52, + -16, -90, 20, -47, 9, -73, -3, -58, 28, -12, + 37, -32, 36, -31, 20, -44, -25, 16, 5, -51, + 15, 45, -18, -30, -5, 14, 47, 62, -57, 51, + -6, 40, 64, 49, -45, 26, 10, 34, 17, -45, + 30, 26, -26, 43, -80, 28, 25, -19, 4, 15, + 11, -15, 91, 4, -80, 29, -47, -91, 55, 44, + -1, 29, -52, -20, 51, -8, -60, 53, 54, -15, + 24, 33, -28, -68, -35, 41, -64, 69, -26, 34, + -2, 96, -60, -58, 7, 68, -66, -8, 23, 11, + -85, 66, 44, 10, -10, -52, 0, -1, -47, -22, + 76, 41, 47, 2, -32, -14, -65, 59, 13, -13, + -9, 7, -104, 13, -18, -14, 30, 9, -26, -33, + 49, 56, -10, 92, 22, 28, -9, -9, 25, -10, + 21, 7, 59, -26, -70, -77, 28, 13, 37, 78, + -45, -50, 25, -18, 21, 16, -40, -12, -27, 52, + 28, -10, 57, -34, 9, 28, -27, 25, 27, 20, + 31, 38, 16, 17, 79, -62, -3, -42, 6, 7, + -20, -8, 69, 16, 22, 52, -59, -15, -55, 39, + 20, 50, -10, -37, 19, 18, -52, 64, -30, 59, + 4, 17, -18, -18, -44, 0, -34, 43, 33, 20, + 7, -27, 16, -81, 95, 20, -4, 67, 43, 37, + 62, -29, 2, -99, -27, 8, -82, 99, -31, 13, + -105, 5, 46, 14, 14, 36, -42, 3, -34, 26, + 5, -27, -1, -41, -11, -30, -2, -23, -36, 4, + -31, -24, -23, 14, 22, -86, -89, 49, -69, -24, + -15, 30, -61, 12, 111, 10, 25, -33, 22, -61, + 36, 41, -29, -10, -33, 35, -10, -47, -1, 28, + 36, -19, 42, -13, 33, -70, 80, 38, 63, 127, + -6, -43, -119, 36, -8, -58, 18, -14, 24, 42, + 10, -21, 56, -5, -15, 64, 2, -34, -5, 25, + -59, -4, -45, -35, -21, 47, -25, 50, 0, 13, + 9, 66, -33, 42, -127, 12, -61, 57, 60, 25, + 29, 61, 77, 70, 4, -8, -1, 73, 20, -77, + -43, -22, 1, 52, -44, 67, -16, 64, -46, -75, + 44, -38, 18, 44, 21, -29, 9, -52, -11, -31, + -19, 10, 54, -1, 11, 9, -8, 27, -12, 23, + 50, 37, 6, -2, 23, 59, 18, 33, -8, 28, + -9, -17, 47, 25, -23, 21, -75, 55, -15, 26, + -59, -49, -40, 51, -43, 56, -12, 52, 63, -6, + -27, 110, 12, -16, -121, 2, 5, -17, 71, 37, + 19, -8, 40, 11, 81, 38, 42, 16, 64, 48, + -79, -27, 106, 16, 0, 25, 32, 18, -5, -65, + 18, 37, -25, -41, -13, -12, 69, 5, -20, -83, + -127, -52, 25, 71, -54, -69, 5, -6, 28, 36, + -23, -66, 12, 27, 0, 63, 3, 3, -27, -4, + -9, 66, 35, 33, -83, -20, -17, -22, -72, -20, + 13, -64, -11, 6, 84, 48, 2, 54, -29, -30, + -55, -5, -17, -17, 17, -11, -54, 4, -68, 22, + -36, -10, 4, 65, 12, -23, -7, -19, 1, -62, + 10, -29, 21, -32, 31, 29, -22, 1, 7, -38, + -34, -37, 36, -71, -87, -11, 99, 37, -2, 34, + -65, -94, -32, 60, -57, -23, -58, -34, -22, -32, + 33, -29, -5, 37, -21, 20, 20, -1, -7, -31, + 22, -7, 37, -15, 23, -42, 31, 41, -6, 51, + -32, 26, -1, -30, 12, 91, -23, 58, -11, -17, + -11, -5, 12, -47, 43, 60, -12, 38, -48, -26, + 27, 55, 20, 59, 51, 14, -124, -77, 112, 51, + -82, -16, 25, 14, 74, -22, 19, -27, 37, 70, + -12, 45, 44, -71, 40, -1, 75, 4, -3, 65, + 6, -76, -54, 79, 27, -56, 26, 4, -23, -45, + -50, -39, -62, 11, -12, -86, 41, -37, 127, 2, + 5, 40, -6, 32, 1, -57, 47, -38, 41, -18, + -53, 30, -6, -36, -15, -12, -14, 1, -26, 23, + -53, 10, 77, -36, -15, -13, -2, -2, 23, -41, + 2, -48, 33, 5, 77, -42, -5, -18, -38, -22, + 61, 96, -61, -36, -10, 6, -27, 44, -17, 17, + 40, -47, -41, 29, 26, -29, 31, -48, -65, -3, + -40, -57, 33, -22, -2, 31, 75, 13, 96, 88, + 68, 34, 11, 104, -4, -82, 0, -23, -127, -73, + -91, -20, 18, 29, 13, 20, 24, 14, -12, -5, + -26, 3, -9, -46, 62, -54, 101, -37, 12, -12, + 41, 32, 35, 42, 23, 71, -10, 20, -16, -31, + -24, -28, 25, -18, -26, 25, -38, 5, -3, -10, + -63, 14, -57, -6, -16, 7, 8, -13, 57, -42, + 87, 53, 52, 19, -22, 39, -57, 26, 58, -52, + 72, -51, -40, 7, -25, 91, 25, -3, -26, 53, + 35, 47, 0, -6, -82, -38, 91, 15, -10, -10, + 14, -32, 43, -14, 32, 110, -73, 20, -48, 35, + 9, 10, 17, 127, -50, 61, 26, -7, 39, 68, + 33, 38, 39, -18, -47, 5, -33, 11, 38, -14, + -41, 1, 40, 58, 51, 57, 53, 21, -42, 57, + -76, 20, 1, -36, -30, 61, -18, -2, 52, 86, + -34, 24, 86, -15, -20, 5, -58, 79, 18, -18, + 43, 50, 59, 33, 53, -40, -5, 1, 0, 7, + 13, 20, 40, -23, 19, -2, 9, 16, -23, 26, + 53, 5, 49, -15, 14, 60, 37, -75, 46, 97, + -3, -27, -47, 23, -1, -66, -41, 21, 24, 37, + -27, 54, -50, 82, -20, 10, -17, -26, 17, 58, + 0, 73, 29, -13, -13, 86, 18, -29, -3, 51, + -67, 56, -10, -53, -43, -118, -62, -23, 12, -62, + 47, 67, 20, 84, 19, -57, -4, -1, -11, -41, + -31, -57, -41, -72, -57, 22, -36, 127, -55, 22, + 9, 7, -1, 51, -30, -23, 64, -57, -96, 28, + -75, -2, 4, 52, 20, 51, -23, -69, -9, 20, + 6, 29, 35, 2, -20, 1, 61, 48, 24, 21, + -61, 6, 71, 9, -16, -27, 49, 112, 24, 34, + 77, 61, 3, -37, -10, 52, -21, 43, -24, -9, + -9, 54, 30, -17, 11, -2, -12, -24, -37, -18, + 2, -17, -56, 16, 47, 2, 40, -8, -47, 22, + 16, 54, 127, 10, -34, -45, 29, 62, 40, -57, + -24, 46, -71, 8, -37, -15, 53, 14, 63, 108, + 83, -46, 14, -56, 10, 51, 27, 14, -16, 6, + 11, 27, -8, 38, 21, 52, 4, 25, 22, -9, + 1, -14, 27, -24, -56, 62, -59, -46, 7, -66, + 15, -3, 26, 59, 40, 8, 66, -40, -15, -42, + -10, 78, -53, -26, 9, 14, -8, 53, 11, 96, + 40, 41, -42, -68, -3, -41, -38, -6, -64, 19, + 21, -15, -3, 10, 18, 37, -59, 32, 49, 41, + 3, -24, 3, 11, -21, 21, -44, 60, -24, 11, + -24, -89, 16, -8, 39, 27, -16, 14, 13, -17, + 20, -65, -35, 36, 73, 17, 36, 30, 25, -37, + -28, 20, -17, 33, -1, -28, -26, 43, -7, 41, + 4, 64, 13, -32, 28, 7, 52, -1, -22, 13, + -90, -11, 11, 3, 26, -76, 58, 44, -42, -9, + 46, -14, 15, 46, 25, -71, 46, 11, 20, -29, + -84, 0, -33, -75, -2, -49, -61, -12, 9, 118, + -51, -42, -16, 10, 46, -8, -41, 8, -44, 17, + 123, -46, 11, 73, 12, 19, 29, -9, 41, 51, + -86, 19, -54, 31, -43, 37, -56, -65, 4, 53, + 45, 46, 9, -20, -6, 28, -10, 69, 49, -21, + -123, 66, 14, 58, -13, 50, 69, 59, 21, -93, + 2, 23, -72, -95, -88, 0, -72, -27, -82, 15, + -50, -59, -20, -37, 44, -44, -5, 73, 12, 83, + -82, -16, -26, -31, -22, 21, 8, 50, -18, -18, + -15, -44, -38, -12, 3, 7, 31, 11, 7, 12, + 64, 33, 75, 127, 11, -26, -34, -34, -56, 34, + -26, -65, -21, -14, -16, 33, -11, 38, -7, 55, + -2, 42, -21, 33, 28, 48, -30, -27, 19, -8, + -54, -28, 39, 62, 40, 52, -11, 23, 12, -18, + 38, -12, 2, -48, 63, -64, 21, 23, 21, 13, + 51, 22, 32, 91, 44, -27, -46, 30, -21, -8, + -15, -5, 35, 34, 26, 38, 20, -7, -43, 60, + -34, 6, -73, -36, -54, 9, 10, 13, -22, 127, + 43, -25, 89, 21, 2, 50, 6, 8, -13, -35, + -57, -26, -26, 3, 25, 32, 75, 19, -6, -13, + 32, 36, 24, -18, -27, -2, 25, -3, -11, 58, + 14, 19, 25, -4, 121, -12, -78, 79, -21, 6, + -95, 41, -72, -46, -59, -62, -75, 84, 29, 83, + 29, 28, 22, 16, 35, 19, 2, -18, -38, 36, + 12, -57, -18, -4, 7, -13, -20, 45, 28, 89, + -29, -62, 40, 96, 26, -49, 62, 16, 26, 45, + -21, -83, -19, 11, -15, 28, -38, 2, 25, 24, + -13, -91, -5, -88, -66, 0, 69, 1, 68, 9, + 29, -4, 41, -53, -48, 8, -33, 68, -10, 5, + -39, 14, 20, 45, -68, -33, 52, 52, -35, -79, + 1, 12, 30, 108, -100, 34, 15, -25, -24, -59, + 39, 23, 58, 17, -32, -99, -18, 67, 27, -25, + -18, -7, -87, 48, 33, -37, -3, 28, -44, -33, + 57, -3, -8, -28, -63, 26, -38, -63, 22, -10, + -37, -12, -49, 47, -69, 7, 64, 28, -12, 83, + 30, -35, 66, -13, 36, -41, 6, -25, 72, 33, + -76, 37, -39, -98, 9, -29, -122, 6, -53, 19, + -23, 64, -32, 34, -52, 81, 2, -23, -42, -64, + 36, -26, -40, -17, 13, 34, -45, 20, 127, -44, + 49, 1, -34, -84, 9, -33, -10, 51, 15, 38, + 14, 33, 14, 9, -4, 16, 9, -1, 20, 0, + -53, -9, -16, 0, -127, 31, -6, -3, -21, 81, + -28, 46, -8, 0, -29, -17, 26, -1, 18, 20, + -20, -4, -19, -12, -19, -21, -14, 40, 14, 30, + 41, 15, 5, -33, 60, -35, -38, -45, -78, -12, + -19, 43, 9, 4, -24, 34, -1, 30, 8, 9, + 22, -36, -14, 4, 11, 23, 37, -40, -10, -13, + -105, -11, 34, 69, 87, 16, 56, 26, 61, -9, + -32, 58, -127, 46, -36, 51, 21, 49, 26, 25, + -5, 14, -56, -18, 39, 59, -27, -51, 50, 13, + 7, -56, -66, 72, 4, -31, 20, -85, 11, 51, + -51, 73, -60, -34, -40, -39, 13, -38, -31, -43, + -112, -69, 30, 78, 25, -5, -59, -1, -41, 60, + -55, -2, -37, -10, 19, 11, -28, 67, 6, 5, + 34, 53, -53, 4, 6, -14, -56, 2, -15, -55, + 92, 31, -68, 24, 69, 48, -12, 6, 70, 43, + 19, 30, -6, 31, -15, 20, 1, -11, -46, 56, + 27, 52, 21, 0, 43, 51, 14, 1, -54, -42, + -1, -17, 29, 50, 17, 79, 53, 20, -28, -33, + 5, 0, -21, -78, -28, 16, 16, 69, 41, 62, + -14, 91, 3, 39, 11, -3, -103, 51, -13, 91, + -44, -7, 82, 8, 99, 125, -79, 8, -24, -49, + 1, 6, 16, 8, 61, 21, -70, 28, 52, 73, + -33, 24, -63, 6, -49, 79, -33, -8, -20, 19, + 45, 36, 8, 72, 16, -39, -32, 40, -25, 42, + 45, -70, -17, -6, -18, 21, 16, 36, -16, -4, + 14, 10, 66, 34, -13, 17, -17, 17, -47, -14, + -78, 4, 61, 49, -14, 30, 40, 54, 58, 60, + 72, 36, 8, 43, 11, 23, -26, -61, 18, -21, + -32, 30, 22, 34, 35, 19, -41, 71, 33, -17, + -22, 46, -75, -75, -101, 56, 36, -29, -57, 23, + 2, -32, -20, -4, 10, 29, 45, 1, 21, 16, + 50, 49, -3, 56, 20, -2, 73, 38, -84, -33, + 16, 11, 8, -18, 83, -50, 16, 34, -87, 108, + -18, 0, -29, 67, 29, -31, -29, -8, -31, 20, + -28, -13, -18, 4, 14, 49, 15, -28, 36, 65, + -103, -14, 67, -8, 19, 37, 9, -71, -27, -3, + 46, 17, 46, -45, 62, -61, 54, 30, -78, 43, + 83, -1, -43, -63, -36, 47, -30, -8, 8, 27, + 66, 73, 58, 25, 21, 79, 8, -42, -48, 8, + 71, 2, 49, 111, 21, -40, 73, 99, -17, -53, + -24, -28, 69, -69, -37, 19, -52, -94, 31, -7, + -4, 33, -45, -19, -27, -92, 85, -113, 27, -2, + -51, 87, 0, -64, -50, -41, -67, 37, 53, -46, + -43, -28, -51, -49, 11, 54, -32, -7, 79, -62, + 80, -6, -57, 44, -10, 34, -60, -49, 28, 37, + 7, -14, -33, -41, 89, -52, 51, 36, -36, 34, + 105, -42, -48, 66, -86, -21, -46, -20, 32, 65, + 65, 41, -9, -38, -47, 35, -2, -9, 48, -33, + 17, 12, 69, -18, 17, 84, -54, -34, -25, 45, + -27, -9, -28, 76, -14, 18, -72, 28, 28, 33, + -70, 2, -27, 41, -12, -32, 10, 17, 81, 10, + -33, 10, 15, 22, -22, 11, -57, 35, -3, -8, + -19, 105, -34, 88, 30, 30, -80, 10, -7, -47, + 7, -5, -27, -61, -25, -86, -7, -17, 25, -9, + -27, 14, -26, 14, 24, -109, -1, -16, -53, -23, + -10, 82, -87, -49, 25, -39, -3, -15, -18, 38, + -11, -18, -26, 13, 33, -34, 42, -38, -3, 28, + 12, 42, -7, -81, -60, -71, 52, 17, 32, -47, + 13, -19, -92, -66, -35, -3, -37, -12, 15, 28, + -77, 27, 65, 51, -3, -5, -63, 14, -62, -26, + 14, 59, 39, 25, -45, -41, 0, -62, 66, -48, + 22, -25, -55, 54, -62, -61, -22, 6, 26, -3, + 44, -60, -63, 64, 15, -6, 7, -65, 13, -32, + -26, 54, -10, 62, 0, -22, 90, 10, -86, -122, + 42, 4, 20, 22, 5, -29, 81, -1, 49, 27, + -87, 58, +}; +const ALIGN(8) int8_t tensor_data75[2048] = { + 31, -29, 38, 15, 15, -19, 13, -31, -53, 23, + -25, -25, 31, 19, 33, -12, 61, -57, -23, -16, + 25, -13, -82, -42, -26, 5, -53, -20, -88, 5, + -78, 46, 66, 28, -96, -21, -21, 23, 0, 58, + 32, 18, 43, 60, 4, 32, 52, -30, 8, 23, + 26, 36, 16, -57, -30, -33, -7, -33, 0, 13, + -48, 52, 16, 43, 50, 88, -44, -4, 6, -9, + -127, 56, 17, -30, -3, 16, -31, 55, 78, 33, + -35, -15, 33, 103, -33, -21, 1, -25, -83, -74, + -40, -20, 57, -41, 32, -2, -127, -2, -32, -46, + 0, 32, -11, -3, 42, 67, 5, 3, -2, -44, + 72, -26, 29, -18, 12, 14, -5, 27, -30, -18, + -7, 4, -28, 33, -5, 23, -47, 16, 116, 29, + 56, 6, 51, 58, -111, 1, -69, 0, -33, -69, + -17, -37, -15, 50, -77, -20, 33, 5, 32, -75, + 14, -48, 38, 73, -4, 32, -27, 126, 39, -31, + 33, -25, 8, 15, 36, -17, -48, -43, -34, 20, + 33, -23, 31, 29, 22, 3, 22, 22, 6, 10, + 16, 28, -13, -114, 71, 75, -12, 26, 60, 39, + 10, 6, -27, 0, -38, -23, -19, -63, -60, -6, + -47, 7, -96, 21, -58, 8, 27, -15, 18, 89, + -8, -40, -90, 56, -7, -21, 60, -34, -40, 31, + -44, 4, -44, 95, -9, -7, 14, -29, -17, 44, + 21, 27, 38, -2, 16, 32, -29, -8, -32, 30, + -4, 43, 9, -9, 2, -23, -83, -31, 19, 36, + -35, -16, 18, -71, 36, -33, 10, -62, -6, -32, + 27, 9, 35, -38, 5, -5, -43, 59, -48, -36, + -53, -23, 8, 14, -10, -35, -2, -82, 14, 15, + -5, 65, 44, 9, -26, -1, 19, 17, -35, 8, + -26, -43, 21, 93, -29, 36, -14, -41, 36, 48, + 17, 56, -40, -44, -47, 78, 31, 6, -38, -74, + 16, 21, 35, -22, -11, 37, -94, 7, 12, -34, + 28, -24, -18, -42, 50, -45, -17, 77, -117, -9, + -19, 40, 8, 77, 15, 73, -20, -44, -79, 23, + -22, 35, 11, 67, 38, 13, -54, -9, -57, -24, + 81, 70, 7, 0, -47, -42, 13, -25, -16, -18, + 24, -30, -41, 18, 10, 19, -12, -3, -53, 11, + -36, -57, -14, 4, -30, 35, 18, -54, 44, -61, + -25, -15, 30, 8, 39, 9, 18, 43, 28, -5, + 52, 127, -38, 21, -25, -54, -8, 107, -41, 12, + -32, -29, -5, 15, -44, -53, -8, -50, 26, -40, + -17, 16, -55, -65, -48, -34, 16, -63, 34, 15, + 34, 13, 16, -12, -45, 13, -26, -12, 50, -52, + 67, -22, 19, -25, -24, -1, -5, 62, 17, 32, + 16, -83, 52, 6, 19, 32, -108, 17, -27, -7, + -41, 44, -55, -85, -42, 42, -12, 6, -31, -106, + -17, 7, -1, 71, 71, 51, -127, -65, 86, 4, + -27, -13, -47, -6, -49, 10, 13, 22, -11, -16, + -60, -27, -48, -14, 25, 34, -22, -47, -52, -7, + 23, -15, -1, -3, 1, 11, -53, -44, -84, -1, + -5, -31, 29, 42, 28, 40, 51, -67, -45, 51, + 60, -3, 13, 88, -13, 64, 52, -30, 24, 36, + -28, 19, 30, -67, -65, 36, -8, -5, 127, 87, + -33, -14, 68, -12, -39, 10, 2, -25, 88, 25, + 14, 29, -24, 7, 63, 37, -22, 59, -79, 104, + -14, -93, 45, 45, 44, 15, -35, 9, -18, -16, + 17, -4, -45, 44, 14, 63, 34, -31, 40, -59, + -14, -27, 15, 18, -80, 36, 60, 56, 6, 55, + -1, -16, -2, 5, -30, -29, 92, 10, -36, 32, + 59, 3, 92, 64, 23, 7, 52, 3, -50, 35, + -88, -33, -13, 62, -57, -7, -36, 40, -40, -16, + -6, -33, 8, 53, -27, 64, -26, 28, 38, 36, + 30, -32, 19, 14, 35, 6, 3, 10, -27, 38, + -48, -32, -33, -10, -34, -9, 16, 37, -37, 9, + 5, -47, 61, 55, -20, 2, -12, -11, -71, 73, + -92, 34, -37, 23, -46, 60, 23, 35, 31, -7, + -21, -15, -3, 0, 61, -10, 47, -41, -16, -9, + 99, -74, -29, 41, -4, 33, -20, 14, -19, 127, + 60, 18, 18, 13, 37, -56, 38, -55, -14, -65, + -14, 78, 25, 32, 17, -43, 9, 7, -7, 32, + 39, 48, -15, 2, 110, 51, -99, -14, -54, -49, + -29, -26, 13, 59, 91, 10, -22, 12, 65, -62, + 50, 81, -10, -9, 2, 18, -58, 31, -42, -25, + 31, -70, -13, -19, -11, 59, -35, 14, 16, 46, + 41, 46, -22, -12, -35, -32, 36, 47, -16, 12, + 44, 20, 37, 20, -21, -32, -89, 13, -20, 127, + -45, -4, -66, 22, -30, 60, -9, 17, 51, -11, + -41, 30, 9, -73, -43, -22, 3, -42, -46, 49, + -72, -37, 73, 46, 83, -65, -67, 82, 78, -68, + 57, 22, -56, -24, -69, -53, -14, -20, -3, 36, + 74, 30, -53, -28, 61, 101, -127, -53, 15, -49, + 67, 19, 75, 21, -21, 21, 41, 2, -57, 3, + 74, 11, -9, -27, -35, 45, -60, -16, -90, 27, + -18, 42, 32, 20, 11, -12, 48, 26, -36, 10, + -55, 31, -20, 29, 0, 9, -13, 60, 1, 38, + 37, 64, -4, -43, 72, 52, -76, 14, -36, 5, + 8, 1, -52, -10, -20, -2, -11, -33, 0, -10, + -1, -7, 9, -23, -26, -14, 12, 18, 65, -45, + 6, -40, -26, -1, -25, 17, -25, 14, 21, 30, + 56, -51, -19, 6, -35, 13, 11, -57, 3, -40, + -58, 39, -49, 18, -30, 63, 14, -34, 56, 50, + -35, 38, 52, -47, -84, 27, 40, -11, -43, -24, + -59, -5, 6, -53, 30, 53, -21, 51, 20, 50, + -54, 9, -66, 2, -62, 26, -26, 4, -73, 24, + -118, 25, 51, -40, -6, -13, -28, -75, -53, 20, + -31, 33, 4, -96, -37, -72, 27, -43, 18, -24, + -43, -61, 1, 58, -3, -66, 72, 9, -63, 127, + 12, -72, 34, 21, 22, 55, -66, -8, -46, -40, + -53, -1, -25, 92, -61, -13, 41, 13, -47, -18, + 25, -56, 31, 40, -21, 17, 40, 46, -15, -10, + 17, 28, -18, 21, -9, -10, 31, -33, 48, -71, + 24, 16, -44, 28, -32, -16, -16, -19, -18, -34, + 34, -2, -5, 17, -58, 69, -72, -10, -24, 37, + -7, -49, -8, -12, 35, -17, -5, -72, 11, 40, + 35, -1, -76, -37, -10, -41, 7, -77, 7, 4, + 28, -11, 59, 42, -123, 32, 88, -3, 38, -20, + -19, 73, -86, 58, -43, 20, -79, -17, 4, -61, + -35, 0, 17, 27, -3, -30, -1, 15, -37, 41, + -16, -29, -52, -62, -15, -10, -34, -12, 65, 11, + -2, 56, -22, -63, -91, -78, -124, 9, -34, -10, + -11, 50, -5, -5, 5, 52, 12, 39, 9, 42, + -45, 68, 29, 65, -7, 23, 18, -4, 41, 0, + -40, -10, 44, -19, -19, 23, -17, 42, -11, -7, + 4, 17, -29, 115, -26, 7, 77, 51, 49, 46, + -40, -25, -51, 36, 13, -41, 1, -11, 3, -10, + 15, 37, 4, -20, 5, 15, -17, 41, -39, 17, + 5, 53, 10, 10, 24, 18, -3, 6, 25, -38, + 1, 29, -10, -9, 1, 127, -47, -9, -13, -92, + -5, -47, -86, -3, 87, 30, 40, 75, -5, 37, + -116, 43, -35, -24, 2, 23, 11, 25, -68, 51, + -70, 1, 76, 42, -10, 49, -30, 36, -50, 24, + -3, -18, -57, -99, -16, -42, 94, 18, 65, 106, + -53, 60, -84, 25, 3, -21, -46, 8, -4, 58, + 76, 92, -31, -85, 77, -9, 37, 30, -33, 12, + -127, 45, 58, -93, -38, -19, 56, -43, 17, -37, + -29, 60, 17, -30, -102, -32, 15, -12, -2, -28, + -66, 70, -66, 111, 79, -18, -15, -47, 36, -45, + 29, 38, 28, 51, 15, 87, -7, 72, 66, -5, + -15, -31, -13, 23, -15, -45, 7, -30, 66, 2, + -90, 29, -41, 44, 69, 21, 51, 50, 37, -26, + -4, -38, -2, -68, -49, 46, -51, 33, -4, 15, + 3, 46, 127, 17, 35, -20, 26, -59, -65, 43, + -20, -8, -4, -23, 9, -58, 75, -10, 39, 22, + -52, 31, 26, -48, -88, -31, -43, -54, 67, -8, + -23, -14, -30, -45, 47, 22, 33, -42, -8, -42, + 2, 70, -25, 19, 94, -31, -19, -45, -30, -49, + -19, -5, -14, -12, -49, 48, 20, -4, -9, 45, + -44, 29, -33, 43, 5, -1, -12, -11, -13, -44, + 3, 25, -32, -15, -15, -7, -42, -41, -9, -43, + 27, 42, 8, -11, 6, 21, -47, 22, -50, 5, + -99, 36, -56, -18, 24, 76, -7, 31, 63, 50, + 16, -25, 21, -5, -25, 9, 0, -21, 20, 21, + 4, 9, -15, 25, -66, 20, 34, 37, 20, -20, + -88, 3, 2, 61, 44, -39, -57, -51, 53, -71, + -24, -23, 22, 56, -14, -20, 18, 107, -49, 68, + 11, -44, 25, 25, 31, 26, 30, 43, -83, -6, + -5, -20, 31, -51, -35, 57, 43, -66, -1, -50, + 67, 77, -31, 10, -11, -74, -68, 47, 45, 98, + -83, -2, 38, -49, 12, 120, 64, 110, -26, 43, + 21, 62, 17, -2, 78, 5, -34, 89, 72, -50, + -57, -59, 21, 6, -120, -43, -26, -21, 23, -119, + 48, 8, -83, 32, -45, 56, -32, 22, 18, -17, + 37, -24, -13, 51, 75, 27, 10, 22, 26, 62, + -32, -20, 64, 13, -47, 6, -57, 48, -69, 32, + 51, 16, -16, -14, 46, -55, 10, 32, -51, 5, + -14, 34, 71, 127, -76, -9, -12, -79, -68, 82, + -50, 32, -57, 56, 5, -18, 13, -23, -20, 59, + 59, -19, 25, 2, 30, -44, -17, 35, -81, 28, + -50, 33, 4, -18, 30, 10, 0, -50, 14, -22, + 36, -25, -16, 73, 15, -22, -56, 77, -28, -38, + 93, -25, -23, 117, 47, 76, -20, -52, -107, 24, + 1, 21, 42, 64, 80, 64, 0, 70, -1, 2, + 31, -49, -43, 22, 19, 46, -43, -16, 5, -54, + -53, 0, 23, 49, -42, -29, 26, 20, -28, 23, + 2, 36, 8, -29, 42, 41, -14, 11, 91, 89, + 3, 2, -18, 20, -56, -4, -41, -3, 49, 35, + -67, 21, 12, -3, 1, 2, 19, -5, -10, -1, + 31, -39, -21, -3, 3, -17, -17, 66, -50, -15, + -64, -64, -47, -77, -20, 57, 60, 59, 12, -51, + 0, -26, -47, 54, -33, -25, 6, -11, 15, 78, + 49, 32, -14, -10, -28, 85, 16, 59, -66, 63, + -6, 4, 27, -22, -39, -67, 43, -63, -12, 52, + -21, 9, 62, 11, 3, -12, 54, -22, 35, 98, + -28, 127, -58, -24, -90, 44, 17, -4, -60, -18, + 15, 64, 49, 38, 4, 53, -73, 22, 4, 12, + -37, 37, -9, -27, 33, -98, 45, -57, 19, -4, + 127, 119, -102, 49, 13, -47, -55, 23, 30, 25, + 9, 14, -97, -28, -5, -89, -31, 20, -8, -8, + -23, -11, -42, -17, -10, -22, 40, 16, 9, 12, + 43, 37, -2, -17, -30, -54, 31, -27, 4, 17, + 4, -34, -14, -41, -4, -19, -51, -33, 35, 95, + -32, 8, -70, -4, 60, 95, -75, -33, -79, 29, + -81, -31, 7, 56, 11, -26, -33, -32, 51, 23, + 3, 51, -75, -23, 24, -41, 38, -48, 30, -2, + 13, -5, 3, -7, -56, 35, -53, 6, 14, 48, + 45, -4, 12, -45, 24, -33, 24, -40, -74, -65, + -24, 3, -40, 13, 57, -46, 24, -112, 73, 40, + -49, 34, -49, 50, 18, 83, 38, -39, -37, -14, + 33, 7, 24, -18, -44, 62, 42, 4, 1, 31, + 29, -17, 49, 29, -22, -9, -23, 30, -17, 9, + 14, 25, 22, 37, 66, 3, 23, -34, -3, -2, + 19, 14, -44, -13, -7, -18, 12, 72, -18, 11, + 21, -12, -37, -37, -26, -26, 30, 17, 11, -31, + 24, -35, 24, -14, -35, 11, 21, -21, 45, -26, + -13, -86, -11, -76, -69, 55, -28, 48, -7, 77, + 43, -21, 67, -43, -73, -74, -39, 2, 45, 27, + 21, -13, 18, -95, 127, -4, -63, -11, 5, -17, + 24, 41, 25, -74, 69, 16, -7, 61, 27, -37, + 39, -37, -7, -31, 60, -43, -6, -73, 11, -28, + -52, 100, -102, 19, -70, 62, 16, 125, -70, 69, + 42, -56, -53, -18, 76, -106, -19, -32, -16, 101, + -107, 34, -82, -49, 14, 29, 74, 40, -14, 40, + 35, -27, 43, 95, -88, 35, -98, -101, 51, 58, + 42, 48, 8, 31, 14, -28, -10, 23, 45, -38, + 12, -50, 40, 2, 99, -26, -15, -15, +}; +const ALIGN(8) int32_t tensor_data76[64] = { + 23980, -281760, 33412, -6618, -29731, -199152, -149999, 29776, 5772086, 2107514, + 3511855, 2656703, 5964796, 1700278, 3559687, 3719693, 34717, -531743, 36320, 119151, + -45805, 17091, 156864, -78035, 4452938, 1248803, 3541676, 2326688, 5861585, 5118808, + 1450090, 3353788, 31423, -155919, -453034, 97999, -361016, -10264, -231997, 110338, + 1487640, 2808244, 1377915, 2017924, 1082622, 5572558, 2165990, 3108156, -323659, -133060, + 1229, 166153, 55075, -482469, 242402, 121651, 1097162, 5087046, 2441315, 1534445, + 3270447, 1456705, 1233709, 2005475, +}; +const ALIGN(8) int32_t tensor_data77[32] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1425819, 1425819, + 1425819, 1425819, 1425819, 1425819, 1425819, 1425819, -6617, 0, 0, 0, + 0, 0, 0, 0, 1425819, 1425819, 1425819, 1425819, 1425819, 1425819, + 1425819, 1425819, +}; +const ALIGN(8) int8_t tensor_data78[3072] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 37, -38, -24, -13, -23, -1, -14, -21, -43, 2, + 4, -25, 11, -8, -1, 43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 3, 4, -55, + 27, -10, 39, -13, -60, -27, 14, -35, 5, 4, + -4, 27, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 25, -9, -16, -4, -12, 0, -1, + 0, 0, 13, -24, 6, 22, -7, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -11, -13, + 13, -6, 10, 2, 25, 26, 11, 19, 21, 9, + -13, -17, -1, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, -51, -37, 29, -23, 31, + -38, -62, -27, 25, 23, -27, 20, -7, 58, 49, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -15, 21, 34, -24, 35, -21, -9, -50, -109, -38, + 5, -31, -27, 14, 16, 47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 10, 9, + -17, -12, -6, -9, -10, 21, 5, -8, -13, -12, + 4, -2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -6, 9, 43, 3, 4, 2, 10, -9, + -3, -3, 8, 4, -13, -11, 13, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -10, -30, + -13, 49, -13, 17, -37, -28, -41, -9, 23, -24, + 38, -29, 17, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -34, 43, 13, -25, 17, -12, + 8, -13, -72, -3, 24, 1, -23, -32, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 1, -6, 0, 22, -19, -7, -10, 1, -9, + -1, -8, 21, -2, 9, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -24, -10, 5, 14, + 7, -14, -8, -16, 18, 11, 7, 0, 4, 12, + 19, -6, +}; +const ALIGN(8) int8_t tensor_data79[2048] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 33, -47, -34, -8, -3, 9, -36, -47, -60, 11, + 29, -55, 26, -35, 21, 52, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 36, 24, -56, + 30, -25, 14, -48, -73, -62, -7, -22, -10, 15, + 42, 42, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, -6, 8, 21, 10, -8, -18, -8, + -1, 9, 9, -30, 16, 13, 2, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -6, 8, + 3, 15, -1, 19, -4, 5, -10, -34, 0, 12, + -20, -6, -22, 18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -23, -47, -19, 47, -33, 12, + -45, -64, -46, 3, 46, -42, 24, -30, 50, 53, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -33, 26, 22, -50, 35, -47, 30, -27, -127, -14, + 22, -53, -39, -38, 36, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 27, 0, 1, 7, + -13, 10, 4, -14, 39, -8, -6, -9, 16, 5, + 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 9, 0, 3, 17, -12, 14, 9, + -8, -11, 14, 4, 20, -17, -25, -1, +}; +const TfArray<1, float> quant80_scale = { 1, { 3.0518494895659387e-05, } }; +const TfArray<1, int> quant80_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant80 = { (TfLiteFloatArray*)&quant80_scale, (TfLiteIntArray*)&quant80_zero, 0 }; +const TfArray<1, float> quant81_scale = { 1, { 0.00026107800658792257, } }; +const TfArray<1, int> quant81_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant81 = { (TfLiteFloatArray*)&quant81_scale, (TfLiteIntArray*)&quant81_zero, 0 }; +const ALIGN(2) int16_t tensor_data82[1] = { + 32767, +}; +const TfArray<1, int> tensor_dimension82 = { 1, { 1 } }; +const TfArray<1, float> quant82_scale = { 1, { 1.476025499869138e-05, } }; +const TfArray<1, int> quant82_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant82 = { (TfLiteFloatArray*)&quant82_scale, (TfLiteIntArray*)&quant82_zero, 0 }; +const TfArray<1, float> quant83_scale = { 1, { 0.00012627018440980464, } }; +const TfArray<1, int> quant83_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant83 = { (TfLiteFloatArray*)&quant83_scale, (TfLiteIntArray*)&quant83_zero, 0 }; +const ALIGN(2) int16_t tensor_data84[1] = { + -32767, +}; +const TfArray<1, float> quant84_scale = { 1, { 4.4934622565051541e-05, } }; +const TfArray<1, int> quant84_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant84 = { (TfLiteFloatArray*)&quant84_scale, (TfLiteIntArray*)&quant84_zero, 0 }; +const TfArray<1, float> quant85_scale = { 1, { 8.1335558206774294e-05, } }; +const TfArray<1, int> quant85_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant85 = { (TfLiteFloatArray*)&quant85_scale, (TfLiteIntArray*)&quant85_zero, 0 }; +const TfArray<4, int> tensor_dimension86 = { 4, { 1,1,64,16 } }; +const TfArray<4, int> tensor_dimension87 = { 4, { 1,1,67,16 } }; +const TfArray<4, int> tensor_dimension88 = { 4, { 1,1,32,32 } }; +const TfArray<1, float> quant88_scale = { 1, { 0.00019638665253296494, } }; +const TfArray<1, int> quant88_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant88 = { (TfLiteFloatArray*)&quant88_scale, (TfLiteIntArray*)&quant88_zero, 0 }; +const TfArray<4, int> tensor_dimension89 = { 4, { 1,1,34,32 } }; +const TfArray<1, float> quant90_scale = { 1, { 0.00026059855008497834, } }; +const TfArray<1, int> quant90_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant90 = { (TfLiteFloatArray*)&quant90_scale, (TfLiteIntArray*)&quant90_zero, 0 }; +const TfArray<4, int> tensor_dimension91 = { 4, { 1,1,35,32 } }; +const TfArray<4, int> tensor_dimension92 = { 4, { 1,1,16,48 } }; +const TfArray<1, float> quant92_scale = { 1, { 0.00022811564849689603, } }; +const TfArray<1, int> quant92_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant92 = { (TfLiteFloatArray*)&quant92_scale, (TfLiteIntArray*)&quant92_zero, 0 }; +const TfArray<4, int> tensor_dimension93 = { 4, { 1,1,18,48 } }; +const TfArray<1, float> quant94_scale = { 1, { 0.00022328863269649446, } }; +const TfArray<1, int> quant94_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant94 = { (TfLiteFloatArray*)&quant94_scale, (TfLiteIntArray*)&quant94_zero, 0 }; +const TfArray<4, int> tensor_dimension95 = { 4, { 1,1,19,48 } }; +const TfArray<4, int> tensor_dimension96 = { 4, { 1,1,8,64 } }; +const TfArray<1, float> quant96_scale = { 1, { 0.00018105856725014746, } }; +const TfArray<1, int> quant96_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant96 = { (TfLiteFloatArray*)&quant96_scale, (TfLiteIntArray*)&quant96_zero, 0 }; +const TfArray<4, int> tensor_dimension97 = { 4, { 1,1,9,64 } }; +const TfArray<4, int> tensor_dimension98 = { 4, { 1,1,4,64 } }; +const TfArray<1, float> quant98_scale = { 1, { 0.00018422781431581825, } }; +const TfArray<1, int> quant98_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant98 = { (TfLiteFloatArray*)&quant98_scale, (TfLiteIntArray*)&quant98_zero, 0 }; +const TfArray<3, int> tensor_dimension99 = { 3, { 1,1,64 } }; +const TfArray<1, float> quant99_scale = { 1, { 0.00016722069995012134, } }; +const TfArray<1, int> quant99_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant99 = { (TfLiteFloatArray*)&quant99_scale, (TfLiteIntArray*)&quant99_zero, 0 }; +const TfArray<2, int> tensor_dimension101 = { 2, { 1,192 } }; +const TfArray<1, float> quant101_scale = { 1, { 0.00035284835030324757, } }; +const TfArray<1, int> quant101_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant101 = { (TfLiteFloatArray*)&quant101_scale, (TfLiteIntArray*)&quant101_zero, 0 }; +const TfArray<1, float> quant105_scale = { 1, { 0.00023219933791551739, } }; +const TfArray<1, int> quant105_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant105 = { (TfLiteFloatArray*)&quant105_scale, (TfLiteIntArray*)&quant105_zero, 0 }; +const TfArray<1, float> quant109_scale = { 1, { 0.00038951999158598483, } }; +const TfArray<1, int> quant109_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant109 = { (TfLiteFloatArray*)&quant109_scale, (TfLiteIntArray*)&quant109_zero, 0 }; +const TfArray<1, float> quant110_scale = { 1, { 3.0517578125e-05, } }; +const TfArray<1, int> quant110_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant110 = { (TfLiteFloatArray*)&quant110_scale, (TfLiteIntArray*)&quant110_zero, 0 }; +const TfArray<1, float> quant111_scale = { 1, { 3.0422110285144299e-05, } }; +const TfArray<1, int> quant111_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant111 = { (TfLiteFloatArray*)&quant111_scale, (TfLiteIntArray*)&quant111_zero, 0 }; +const int16_t tensor_data112[1] = { 32767 }; +const TfArray<1, float> quant112_scale = { 1, { 3.0518509447574615e-05, } }; +const TfArray<1, int> quant112_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant112 = { (TfLiteFloatArray*)&quant112_scale, (TfLiteIntArray*)&quant112_zero, 0 }; +const TfArray<1, float> quant113_scale = { 1, { 3.050345549127087e-05, } }; +const TfArray<1, int> quant113_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant113 = { (TfLiteFloatArray*)&quant113_scale, (TfLiteIntArray*)&quant113_zero, 0 }; +const TfArray<1, float> quant114_scale = { 1, { 0.00040525090298615396, } }; +const TfArray<1, int> quant114_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant114 = { (TfLiteFloatArray*)&quant114_scale, (TfLiteIntArray*)&quant114_zero, 0 }; +const TfArray<1, float> quant116_scale = { 1, { 0.00012862756557296962, } }; +const TfArray<1, int> quant116_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant116 = { (TfLiteFloatArray*)&quant116_scale, (TfLiteIntArray*)&quant116_zero, 0 }; +const TfArray<1, float> quant117_scale = { 1, { 0.00024443116853944957, } }; +const TfArray<1, int> quant117_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant117 = { (TfLiteFloatArray*)&quant117_scale, (TfLiteIntArray*)&quant117_zero, 0 }; +const TfArray<1, float> quant119_scale = { 1, { 3.0499082640744746e-05, } }; +const TfArray<1, int> quant119_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant119 = { (TfLiteFloatArray*)&quant119_scale, (TfLiteIntArray*)&quant119_zero, 0 }; +const TfArray<4, int> tensor_dimension123 = { 4, { 1,1,4,32 } }; +const TfArray<1, float> quant123_scale = { 1, { 0.00015141174662858248, } }; +const TfArray<1, int> quant123_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant123 = { (TfLiteFloatArray*)&quant123_scale, (TfLiteIntArray*)&quant123_zero, 0 }; +const ALIGN(8) int16_t tensor_data125[32] = { + -2036, -12347, -18547, 28102, -11978, 14584, -16744, 6902, 15021, 32767, + 12100, -12661, 23195, -9947, -1962, 1375, 22215, 16520, -1608, -13700, + 25830, 2639, 1783, -13263, -2138, -3567, 1050, 937, 8723, -6720, + 2526, 9535, +}; +const TfArray<1, float> quant125_scale = { 1, { 4.6542158088413998e-05, } }; +const TfArray<1, int> quant125_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant125 = { (TfLiteFloatArray*)&quant125_scale, (TfLiteIntArray*)&quant125_zero, 0 }; +const TfArray<1, float> quant126_scale = { 1, { 0.00012762885307893157, } }; +const TfArray<1, int> quant126_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant126 = { (TfLiteFloatArray*)&quant126_scale, (TfLiteIntArray*)&quant126_zero, 0 }; +const TfArray<4, int> tensor_dimension129 = { 4, { 1,1,4,96 } }; +const TfArray<1, float> quant130_scale = { 1, { 0.00017180619761347771, } }; +const TfArray<1, int> quant130_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant130 = { (TfLiteFloatArray*)&quant130_scale, (TfLiteIntArray*)&quant130_zero, 0 }; +const TfArray<4, int> tensor_dimension131 = { 4, { 1,1,6,32 } }; +const TfArray<4, int> tensor_dimension132 = { 4, { 1,1,9,32 } }; +const TfArray<1, float> quant132_scale = { 1, { 0.0002229402307420969, } }; +const TfArray<1, int> quant132_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant132 = { (TfLiteFloatArray*)&quant132_scale, (TfLiteIntArray*)&quant132_zero, 0 }; +const TfArray<4, int> tensor_dimension134 = { 4, { 1,1,8,32 } }; +const ALIGN(8) int16_t tensor_data135[32] = { + 9616, 20292, 12281, 11089, 25584, 15062, -9350, 21992, 17946, 26043, + 1616, -13235, 20923, 5994, 8545, 15281, -7042, -12494, -10376, 28720, + 24802, 16114, 32767, 7376, 20256, -6387, 13723, -22350, -11218, 10793, + 24374, 22771, +}; +const TfArray<1, float> quant135_scale = { 1, { 5.8485397858021315e-06, } }; +const TfArray<1, int> quant135_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant135 = { (TfLiteFloatArray*)&quant135_scale, (TfLiteIntArray*)&quant135_zero, 0 }; +const TfArray<1, float> quant136_scale = { 1, { 0.00022071022249292582, } }; +const TfArray<1, int> quant136_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant136 = { (TfLiteFloatArray*)&quant136_scale, (TfLiteIntArray*)&quant136_zero, 0 }; +const TfArray<4, int> tensor_dimension140 = { 4, { 1,1,8,96 } }; +const TfArray<1, float> quant141_scale = { 1, { 0.00017595011740922928, } }; +const TfArray<1, int> quant141_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant141 = { (TfLiteFloatArray*)&quant141_scale, (TfLiteIntArray*)&quant141_zero, 0 }; +const TfArray<4, int> tensor_dimension142 = { 4, { 1,1,12,32 } }; +const TfArray<4, int> tensor_dimension143 = { 4, { 1,1,19,32 } }; +const TfArray<1, float> quant143_scale = { 1, { 0.00023114687064662576, } }; +const TfArray<1, int> quant143_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant143 = { (TfLiteFloatArray*)&quant143_scale, (TfLiteIntArray*)&quant143_zero, 0 }; +const TfArray<4, int> tensor_dimension145 = { 4, { 1,1,16,32 } }; +const ALIGN(8) int16_t tensor_data146[32] = { + 12343, 11704, 5778, 32767, -12082, -13356, 11676, -14891, 718, 1994, + 813, 1899, 23874, 11908, -27839, 4408, -12623, 11821, 4943, 13711, + 2484, 198, -1486, 10234, 14108, 16797, 21084, 10722, -20034, -8522, + -1188, -32344, +}; +const TfArray<1, float> quant146_scale = { 1, { 5.9609933487081435e-06, } }; +const TfArray<1, int> quant146_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant146 = { (TfLiteFloatArray*)&quant146_scale, (TfLiteIntArray*)&quant146_zero, 0 }; +const TfArray<1, float> quant147_scale = { 1, { 0.00023150960623752326, } }; +const TfArray<1, int> quant147_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant147 = { (TfLiteFloatArray*)&quant147_scale, (TfLiteIntArray*)&quant147_zero, 0 }; +const TfArray<4, int> tensor_dimension151 = { 4, { 1,1,16,80 } }; +const TfArray<1, float> quant152_scale = { 1, { 0.00019044482905883342, } }; +const TfArray<1, int> quant152_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant152 = { (TfLiteFloatArray*)&quant152_scale, (TfLiteIntArray*)&quant152_zero, 0 }; +const TfArray<4, int> tensor_dimension153 = { 4, { 1,1,20,32 } }; +const TfArray<4, int> tensor_dimension154 = { 4, { 1,1,18,32 } }; +const TfArray<1, float> quant154_scale = { 1, { 0.00022714887745678425, } }; +const TfArray<1, int> quant154_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant154 = { (TfLiteFloatArray*)&quant154_scale, (TfLiteIntArray*)&quant154_zero, 0 }; +const ALIGN(8) int16_t tensor_data156[32] = { + -2151, 24061, 19114, -11396, 5939, 14387, 7668, -842, 8663, -5086, + -27810, -17395, 25014, -16537, -7582, -27218, -496, -1438, -15300, -6760, + 8285, 18294, 29619, 808, -1516, -13313, 3506, 2497, 4111, 32767, + -3342, 728, +}; +const TfArray<1, float> quant156_scale = { 1, { 9.2589170890278183e-06, } }; +const TfArray<1, int> quant156_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant156 = { (TfLiteFloatArray*)&quant156_scale, (TfLiteIntArray*)&quant156_zero, 0 }; +const TfArray<1, float> quant157_scale = { 1, { 0.00022247611195780337, } }; +const TfArray<1, int> quant157_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant157 = { (TfLiteFloatArray*)&quant157_scale, (TfLiteIntArray*)&quant157_zero, 0 }; +const TfArray<1, float> quant161_scale = { 1, { 0.0001777983270585537, } }; +const TfArray<1, int> quant161_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant161 = { (TfLiteFloatArray*)&quant161_scale, (TfLiteIntArray*)&quant161_zero, 0 }; +const TfArray<1, float> quant163_scale = { 1, { 0.00031325253075920045, } }; +const TfArray<1, int> quant163_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant163 = { (TfLiteFloatArray*)&quant163_scale, (TfLiteIntArray*)&quant163_zero, 0 }; +const ALIGN(8) int16_t tensor_data166[32] = { + 3903, 22171, 14284, 2236, 11827, 7387, 19205, 17127, 23194, -3374, + 9208, 24305, 6878, 13629, 8527, 7107, 20312, 3543, 4389, 20991, + 3721, 15346, 4125, 20016, 32767, 15875, 3766, 25381, 13400, 13373, + 7085, 2775, +}; +const TfArray<1, float> quant166_scale = { 1, { 1.3473301805788651e-05, } }; +const TfArray<1, int> quant166_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant166 = { (TfLiteFloatArray*)&quant166_scale, (TfLiteIntArray*)&quant166_zero, 0 }; +const TfArray<1, float> quant167_scale = { 1, { 0.00032236904371529818, } }; +const TfArray<1, int> quant167_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant167 = { (TfLiteFloatArray*)&quant167_scale, (TfLiteIntArray*)&quant167_zero, 0 }; +const TfArray<4, int> tensor_dimension172 = { 4, { 1,1,32,64 } }; +const TfArray<4, int> tensor_dimension173 = { 4, { 1,1,36,64 } }; +const TfArray<1, float> quant174_scale = { 1, { 0.0011922091944143176, } }; +const TfArray<1, int> quant174_zero = { 1, { 0 } }; +const TfLiteAffineQuantization quant174 = { (TfLiteFloatArray*)&quant174_scale, (TfLiteIntArray*)&quant174_zero, 0 }; +const TfArray<4, int> tensor_dimension176 = { 4, { 1,1,67,1 } }; +uint8_t ALIGN(4) opdata0[15] = { 116, 121, 112, 101, 0, 1, 6, 1, 1, 1, 0, 4, 2, 36, 1, }; /* custom_initial_data */ +const TfArray<2, int> inputs0 = { 2, { 1,5 } }; +const TfArray<1, int> outputs0 = { 1, { 80 } }; +const TfArray<2, int> inputs1 = { 2, { 0,6 } }; +const TfArray<1, int> outputs1 = { 1, { 81 } }; +uint8_t ALIGN(4) opdata2[15] = { 116, 121, 112, 101, 0, 1, 6, 1, 1, 1, 1, 4, 2, 36, 1, }; /* custom_initial_data */ +const TfArray<3, int> inputs2 = { 3, { 81,82,7 } }; +const TfArray<1, int> outputs2 = { 1, { 83 } }; +const TfArray<3, int> inputs3 = { 3, { 83,84,8 } }; +const TfArray<1, int> outputs3 = { 1, { 85 } }; +uint8_t ALIGN(4) opdata4[77] = { 98, 0, 5, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 101, 0, 5, 1, 1, 1, 64, 2, 4, 4, 4, 4, 4, 105, 0, 4, 0, 0, 8, 0, 8, 0, 8, 32, 0, 5, 5, 5, 5, 111, 0, 4, 0, 128, 0, 128, 0, 128, 0, 2, 0, 5, 5, 5, 5, 4, 59, 47, 35, 20, 4, 1, 4, 63, 51, 38, 23, 40, 40, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs4 = { 1, { 85 } }; +const TfArray<1, int> outputs4 = { 1, { 86 } }; +uint8_t ALIGN(4) opdata5[85] = { 98, 0, 5, 0, 0, 0, 0, 32, 4, 4, 4, 4, 4, 101, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 32, 8, 5, 5, 5, 5, 5, 105, 0, 0, 4, 0, 96, 8, 96, 8, 96, 8, 96, 8, 5, 5, 5, 5, 111, 0, 4, 0, 0, 8, 0, 8, 0, 8, 0, 8, 5, 5, 5, 5, 4, 67, 55, 36, 20, 4, 1, 4, 71, 57, 38, 23, 40, 41, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs5 = { 1, { 86 } }; +const TfArray<1, int> outputs5 = { 1, { 87 } }; +uint8_t ALIGN(4) opdata6[314] = { 109, 112, 0, 8, 96, 8, 0, 0, 64, 0, 0, 0, 0, 97, 0, 24, 0, 10, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 7, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 14, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, 26, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 26, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 5, 200, 161, 122, 83, 44, 20, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 0, 1, 1, 8, 0, 18, 1, 235, 0, 229, 0, 18, 0, 16, 0, 14, 0, 2, 0, 7, 0, 18, 1, 9, 0, 34, 1, 252, 0, 46, 0, 0, 0, 0, 0, 20, 5, 20, 20, 40, 5, 5, 21, 37, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs6 = { 4, { 87,35,34,-1 } }; +const TfArray<1, int> outputs6 = { 1, { 88 } }; +uint8_t ALIGN(4) opdata7[85] = { 98, 0, 5, 0, 0, 0, 0, 64, 4, 4, 4, 4, 4, 101, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 64, 8, 5, 5, 5, 5, 5, 105, 0, 0, 4, 0, 128, 8, 128, 8, 128, 8, 128, 8, 5, 5, 5, 5, 111, 0, 4, 0, 0, 8, 0, 8, 0, 8, 0, 8, 5, 5, 5, 5, 4, 67, 55, 36, 20, 4, 1, 4, 71, 57, 38, 23, 40, 41, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs7 = { 1, { 88 } }; +const TfArray<1, int> outputs7 = { 1, { 89 } }; +uint8_t ALIGN(4) opdata8[314] = { 109, 112, 0, 8, 128, 8, 0, 0, 64, 0, 0, 0, 0, 97, 0, 24, 0, 12, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 192, 7, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 14, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, 26, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 26, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 5, 200, 161, 122, 83, 44, 20, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 0, 1, 1, 8, 0, 18, 1, 235, 0, 229, 0, 18, 0, 16, 0, 14, 0, 2, 0, 7, 0, 18, 1, 9, 0, 34, 1, 252, 0, 46, 0, 0, 0, 0, 0, 20, 5, 20, 20, 40, 5, 5, 21, 37, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs8 = { 4, { 89,37,36,-1 } }; +const TfArray<1, int> outputs8 = { 1, { 90 } }; +uint8_t ALIGN(4) opdata9[85] = { 98, 0, 5, 0, 0, 0, 0, 64, 4, 4, 4, 4, 4, 101, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 64, 8, 5, 5, 5, 5, 5, 105, 0, 0, 4, 0, 192, 8, 192, 8, 192, 8, 192, 8, 5, 5, 5, 5, 111, 0, 4, 0, 0, 8, 0, 8, 0, 8, 0, 8, 5, 5, 5, 5, 4, 67, 55, 36, 20, 4, 1, 4, 71, 57, 38, 23, 40, 41, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs9 = { 1, { 90 } }; +const TfArray<1, int> outputs9 = { 1, { 91 } }; +uint8_t ALIGN(4) opdata10[314] = { 109, 112, 0, 8, 192, 8, 0, 0, 128, 0, 0, 0, 0, 97, 0, 24, 0, 20, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 128, 7, 0, 0, 0, 111, 0, 4, 48, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 128, 4, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 224, 4, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 10, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 224, 4, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 13, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 224, 4, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 224, 4, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 5, 200, 161, 122, 83, 44, 20, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 0, 1, 1, 8, 0, 18, 1, 235, 0, 229, 0, 18, 0, 16, 0, 14, 0, 2, 0, 7, 0, 18, 1, 9, 0, 34, 1, 252, 0, 46, 0, 0, 0, 0, 0, 20, 5, 20, 20, 40, 5, 5, 21, 37, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs10 = { 4, { 91,39,38,-1 } }; +const TfArray<1, int> outputs10 = { 1, { 92 } }; +uint8_t ALIGN(4) opdata11[85] = { 98, 0, 5, 0, 0, 0, 0, 96, 4, 4, 4, 4, 4, 101, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 96, 6, 5, 5, 5, 5, 5, 105, 0, 0, 4, 0, 192, 6, 192, 6, 192, 6, 192, 6, 5, 5, 5, 5, 111, 0, 4, 0, 0, 6, 0, 6, 0, 6, 0, 6, 5, 5, 5, 5, 4, 67, 55, 36, 20, 4, 1, 4, 71, 57, 38, 23, 40, 41, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs11 = { 1, { 92 } }; +const TfArray<1, int> outputs11 = { 1, { 93 } }; +uint8_t ALIGN(4) opdata12[314] = { 109, 112, 0, 8, 192, 6, 0, 0, 96, 0, 0, 0, 0, 97, 0, 24, 0, 18, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 160, 5, 0, 0, 0, 111, 0, 4, 48, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 128, 4, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 224, 4, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 10, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 224, 4, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 13, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 224, 4, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 224, 4, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 5, 200, 161, 122, 83, 44, 20, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 0, 1, 1, 8, 0, 18, 1, 235, 0, 229, 0, 18, 0, 16, 0, 14, 0, 2, 0, 7, 0, 18, 1, 9, 0, 34, 1, 252, 0, 46, 0, 0, 0, 0, 0, 20, 5, 20, 20, 40, 5, 5, 21, 37, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs12 = { 4, { 93,41,40,-1 } }; +const TfArray<1, int> outputs12 = { 1, { 94 } }; +uint8_t ALIGN(4) opdata13[85] = { 98, 0, 5, 0, 0, 0, 0, 96, 4, 4, 4, 4, 4, 101, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 96, 6, 5, 5, 5, 5, 5, 105, 0, 0, 4, 0, 32, 7, 32, 7, 32, 7, 32, 7, 5, 5, 5, 5, 111, 0, 4, 0, 0, 6, 0, 6, 0, 6, 0, 6, 5, 5, 5, 5, 4, 67, 55, 36, 20, 4, 1, 4, 71, 57, 38, 23, 40, 41, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs13 = { 1, { 94 } }; +const TfArray<1, int> outputs13 = { 1, { 95 } }; +uint8_t ALIGN(4) opdata14[314] = { 109, 112, 0, 8, 32, 7, 0, 0, 192, 0, 0, 0, 0, 97, 0, 24, 0, 30, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 5, 0, 0, 0, 111, 0, 4, 64, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 128, 3, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 128, 3, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 5, 200, 161, 122, 83, 44, 20, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 0, 1, 1, 8, 0, 18, 1, 235, 0, 229, 0, 18, 0, 16, 0, 14, 0, 2, 0, 7, 0, 18, 1, 9, 0, 34, 1, 252, 0, 46, 0, 0, 0, 0, 0, 20, 5, 20, 20, 40, 5, 5, 21, 37, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs14 = { 4, { 95,43,42,-1 } }; +const TfArray<1, int> outputs14 = { 1, { 96 } }; +uint8_t ALIGN(4) opdata15[85] = { 98, 0, 5, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 101, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 4, 5, 5, 5, 5, 5, 105, 0, 0, 4, 0, 128, 4, 128, 4, 128, 4, 128, 4, 5, 5, 5, 5, 111, 0, 4, 0, 0, 4, 0, 4, 0, 4, 0, 4, 5, 5, 5, 5, 4, 67, 55, 36, 20, 4, 1, 4, 71, 57, 38, 23, 40, 41, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs15 = { 1, { 96 } }; +const TfArray<1, int> outputs15 = { 1, { 97 } }; +uint8_t ALIGN(4) opdata16[254] = { 109, 112, 0, 8, 128, 4, 0, 0, 0, 1, 0, 0, 0, 97, 0, 24, 0, 24, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 111, 0, 4, 64, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 128, 1, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 128, 1, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 128, 1, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 128, 1, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 4, 160, 121, 82, 43, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 214, 6, 229, 189, 182, 12, 9, 7, 1, 7, 221, 9, 235, 196, 29, 0, 0, 20, 4, 20, 20, 40, 4, 4, 14, 36, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs16 = { 4, { 97,45,44,-1 } }; +const TfArray<1, int> outputs16 = { 1, { 98 } }; +uint8_t ALIGN(4) opdata17[170] = { 109, 112, 0, 8, 0, 2, 0, 0, 0, 1, 0, 0, 0, 97, 0, 24, 0, 16, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 2, 80, 41, 20, 20, 115, 0, 107, 0, 116, 0, 7, 130, 6, 145, 105, 98, 12, 9, 7, 1, 7, 137, 9, 151, 112, 25, 0, 0, 20, 4, 20, 20, 40, 4, 4, 14, 36, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs17 = { 4, { 98,47,46,-1 } }; +const TfArray<1, int> outputs17 = { 1, { 99 } }; +const ALIGN(4) uint8_t opdata18[8] = { 1, 0, 0, 0, 0, 0, 0, 0, }; /* op type 88=UNPACK */ +const TfArray<1, int> inputs18 = { 1, { 99 } }; +const TfArray<1, int> outputs18 = { 1, { 100 } }; +uint8_t ALIGN(4) opdata19[128] = { 109, 112, 0, 8, 128, 0, 0, 0, 128, 0, 0, 0, 0, 97, 0, 24, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 0, 4, 192, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 0, 0, 48, 48, 0, 1, 40, 20, 115, 0, 107, 0, 116, 0, 7, 88, 6, 103, 63, 56, 12, 9, 7, 1, 7, 95, 9, 109, 70, 23, 0, 0, 20, 4, 20, 20, 40, 4, 4, 14, 36, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs19 = { 4, { 100,49,48,-1 } }; +const TfArray<1, int> outputs19 = { 1, { 101 } }; +const ALIGN(4) uint8_t opdata20[4] = { 3, 0, 0, 0, }; /* op type 49=SPLIT */ +const TfArray<2, int> inputs20 = { 2, { 2,101 } }; +const TfArray<3, int> outputs20 = { 3, { 102,103,104 } }; +const TfArray<4, int> inputs21 = { 4, { 80,51,50,-1 } }; +const TfArray<1, int> outputs21 = { 1, { 105 } }; +const ALIGN(4) uint8_t opdata22[4] = { 3, 0, 0, 0, }; /* op type 102=SPLIT_V */ +const TfArray<3, int> inputs22 = { 3, { 105,3,2 } }; +const TfArray<3, int> outputs22 = { 3, { 106,107,108 } }; +const TfArray<3, int> inputs23 = { 3, { 102,106,9 } }; +const TfArray<1, int> outputs23 = { 1, { 109 } }; +uint8_t ALIGN(4) opdata24[0] = { }; /* custom_initial_data */ +const TfArray<2, int> inputs24 = { 2, { 109,10 } }; +const TfArray<1, int> outputs24 = { 1, { 110 } }; +const TfArray<3, int> inputs25 = { 3, { 110,80,11 } }; +const TfArray<1, int> outputs25 = { 1, { 111 } }; +const TfArray<3, int> inputs26 = { 3, { 112,110,12 } }; +const TfArray<1, int> outputs26 = { 1, { 113 } }; +const TfArray<3, int> inputs27 = { 3, { 103,107,13 } }; +const TfArray<1, int> outputs27 = { 1, { 114 } }; +const TfArray<2, int> inputs28 = { 2, { 114,14 } }; +const TfArray<1, int> outputs28 = { 1, { 115 } }; +const TfArray<3, int> inputs29 = { 3, { 115,108,15 } }; +const TfArray<1, int> outputs29 = { 1, { 116 } }; +const TfArray<3, int> inputs30 = { 3, { 104,116,16 } }; +const TfArray<1, int> outputs30 = { 1, { 117 } }; +const TfArray<2, int> inputs31 = { 2, { 117,17 } }; +const TfArray<1, int> outputs31 = { 1, { 118 } }; +const TfArray<3, int> inputs32 = { 3, { 113,118,18 } }; +const TfArray<1, int> outputs32 = { 1, { 119 } }; +const TfArray<3, int> inputs33 = { 3, { 111,119,19 } }; +const TfArray<1, int> outputs33 = { 1, { 120 } }; +const TfLitePackParams opdata34 = { 1, 0 }; +const TfArray<1, int> inputs34 = { 1, { 120 } }; +const TfArray<1, int> outputs34 = { 1, { 121 } }; +const TfArray<2, int> inputs35 = { 2, { 121,4 } }; +const TfArray<1, int> outputs35 = { 1, { 122 } }; +uint8_t ALIGN(4) opdata36[170] = { 109, 112, 0, 8, 128, 0, 0, 0, 64, 0, 0, 0, 0, 97, 0, 24, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 2, 80, 41, 20, 20, 115, 0, 107, 0, 116, 0, 7, 130, 6, 145, 105, 98, 12, 9, 7, 1, 7, 137, 9, 151, 112, 25, 0, 0, 20, 4, 20, 20, 40, 4, 4, 14, 36, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs36 = { 4, { 122,53,52,-1 } }; +const TfArray<1, int> outputs36 = { 1, { 123 } }; +uint8_t ALIGN(4) opdata37[170] = { 109, 112, 0, 8, 128, 0, 0, 0, 64, 0, 0, 0, 0, 97, 0, 24, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 2, 80, 41, 20, 20, 115, 0, 107, 0, 116, 0, 7, 130, 6, 145, 105, 98, 12, 9, 7, 1, 7, 137, 9, 151, 112, 25, 0, 0, 20, 4, 20, 20, 40, 4, 4, 14, 36, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs37 = { 4, { 122,54,52,123 } }; +const TfArray<1, int> outputs37 = { 1, { 124 } }; +const TfArray<3, int> inputs38 = { 3, { 124,125,20 } }; +const TfArray<1, int> outputs38 = { 1, { 126 } }; +const TfArray<2, int> inputs39 = { 2, { 126,21 } }; +const TfArray<1, int> outputs39 = { 1, { 127 } }; +const TfArray<2, int> inputs40 = { 2, { 127,22 } }; +const TfArray<1, int> outputs40 = { 1, { 128 } }; +const TfLiteConcatenationParams opdata41 = { 3, kTfLiteActNone }; +const TfArray<2, int> inputs41 = { 2, { 128,98 } }; +const TfArray<1, int> outputs41 = { 1, { 129 } }; +uint8_t ALIGN(4) opdata42[254] = { 109, 112, 0, 8, 0, 3, 0, 0, 192, 0, 0, 0, 0, 97, 0, 24, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 64, 2, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 4, 160, 121, 82, 43, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 214, 6, 229, 189, 182, 12, 9, 7, 1, 7, 221, 9, 235, 196, 29, 0, 0, 20, 4, 20, 20, 40, 4, 4, 14, 36, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs42 = { 4, { 129,56,55,-1 } }; +const TfArray<1, int> outputs42 = { 1, { 130 } }; +uint8_t ALIGN(4) opdata43[85] = { 98, 0, 5, 0, 0, 0, 0, 64, 4, 4, 4, 4, 4, 101, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 64, 1, 5, 5, 5, 5, 5, 105, 0, 0, 4, 0, 128, 1, 128, 1, 128, 1, 128, 1, 5, 5, 5, 5, 111, 0, 4, 0, 0, 1, 0, 1, 0, 1, 0, 1, 5, 5, 5, 5, 4, 67, 55, 36, 20, 4, 1, 4, 71, 57, 38, 23, 40, 41, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs43 = { 1, { 130 } }; +const TfArray<1, int> outputs43 = { 1, { 131 } }; +uint8_t ALIGN(4) opdata44[254] = { 109, 112, 0, 8, 128, 1, 0, 0, 64, 0, 0, 0, 0, 97, 0, 24, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 1, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 1, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 1, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 4, 160, 121, 82, 43, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 214, 6, 229, 189, 182, 12, 9, 7, 1, 7, 221, 9, 235, 196, 29, 0, 0, 20, 4, 20, 20, 40, 4, 4, 14, 36, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs44 = { 4, { 131,58,57,-1 } }; +const TfArray<1, int> outputs44 = { 1, { 132 } }; +uint8_t ALIGN(4) opdata45[254] = { 109, 112, 0, 8, 128, 1, 0, 0, 64, 0, 0, 0, 0, 97, 0, 24, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 192, 1, 0, 0, 128, 0, 0, 0, 64, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 192, 1, 0, 0, 128, 0, 0, 0, 64, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 192, 1, 0, 0, 128, 0, 0, 0, 64, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 192, 1, 0, 0, 128, 0, 0, 0, 64, 0, 0, 0, 48, 48, 0, 4, 160, 121, 82, 43, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 214, 6, 229, 189, 182, 12, 9, 7, 1, 7, 221, 9, 235, 196, 29, 0, 0, 20, 4, 20, 20, 40, 4, 4, 14, 36, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs45 = { 4, { 131,59,57,132 } }; +const TfArray<1, int> outputs45 = { 1, { 133 } }; +uint8_t ALIGN(4) opdata46[85] = { 98, 0, 5, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 101, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 2, 5, 5, 5, 5, 5, 105, 0, 0, 4, 0, 64, 2, 64, 2, 64, 2, 64, 2, 5, 5, 5, 5, 111, 0, 4, 0, 0, 2, 0, 2, 0, 2, 0, 2, 5, 5, 5, 5, 4, 67, 55, 36, 20, 4, 1, 4, 71, 57, 38, 23, 40, 41, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs46 = { 1, { 133 } }; +const TfArray<1, int> outputs46 = { 1, { 134 } }; +const TfArray<3, int> inputs47 = { 3, { 134,135,23 } }; +const TfArray<1, int> outputs47 = { 1, { 136 } }; +const TfArray<2, int> inputs48 = { 2, { 136,24 } }; +const TfArray<1, int> outputs48 = { 1, { 137 } }; +const TfArray<1, int> inputs49 = { 1, { 94 } }; +const TfArray<1, int> outputs49 = { 1, { 138 } }; +const TfArray<4, int> inputs50 = { 4, { 138,43,60,-1 } }; +const TfArray<1, int> outputs50 = { 1, { 139 } }; +const TfLiteConcatenationParams opdata51 = { 3, kTfLiteActNone }; +const TfArray<2, int> inputs51 = { 2, { 137,139 } }; +const TfArray<1, int> outputs51 = { 1, { 140 } }; +uint8_t ALIGN(4) opdata52[314] = { 109, 112, 0, 8, 0, 6, 0, 0, 192, 0, 0, 0, 0, 97, 0, 24, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 64, 5, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128, 1, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128, 1, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128, 1, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 1, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 1, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 5, 200, 161, 122, 83, 44, 20, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 0, 1, 1, 8, 0, 18, 1, 235, 0, 229, 0, 18, 0, 16, 0, 14, 0, 2, 0, 7, 0, 18, 1, 9, 0, 34, 1, 252, 0, 46, 0, 0, 0, 0, 0, 20, 5, 20, 20, 40, 5, 5, 21, 37, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs52 = { 4, { 140,62,61,-1 } }; +const TfArray<1, int> outputs52 = { 1, { 141 } }; +uint8_t ALIGN(4) opdata53[91] = { 98, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 5, 5, 5, 5, 5, 101, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 128, 2, 5, 5, 5, 5, 5, 105, 0, 0, 4, 0, 0, 3, 0, 3, 0, 3, 0, 3, 5, 5, 5, 5, 111, 0, 4, 0, 0, 2, 0, 2, 0, 2, 0, 2, 5, 5, 5, 5, 4, 73, 55, 36, 20, 4, 1, 4, 76, 57, 38, 23, 41, 41, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs53 = { 1, { 141 } }; +const TfArray<1, int> outputs53 = { 1, { 142 } }; +uint8_t ALIGN(4) opdata54[314] = { 109, 112, 0, 8, 0, 3, 0, 0, 64, 0, 0, 0, 0, 97, 0, 24, 0, 12, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 2, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 3, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 3, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 3, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 3, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 3, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 5, 200, 161, 122, 83, 44, 20, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 0, 1, 1, 8, 0, 18, 1, 235, 0, 229, 0, 18, 0, 16, 0, 14, 0, 2, 0, 7, 0, 18, 1, 9, 0, 34, 1, 252, 0, 46, 0, 0, 0, 0, 0, 20, 5, 20, 20, 40, 5, 5, 21, 37, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs54 = { 4, { 142,64,63,-1 } }; +const TfArray<1, int> outputs54 = { 1, { 143 } }; +uint8_t ALIGN(4) opdata55[314] = { 109, 112, 0, 8, 0, 3, 0, 0, 64, 0, 0, 0, 0, 97, 0, 24, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 128, 2, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 192, 3, 0, 0, 128, 0, 0, 0, 64, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 192, 3, 0, 0, 128, 0, 0, 0, 64, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 192, 3, 0, 0, 128, 0, 0, 0, 64, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 192, 3, 0, 0, 128, 0, 0, 0, 64, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 64, 4, 0, 0, 128, 0, 0, 0, 64, 0, 0, 0, 48, 48, 0, 5, 200, 161, 122, 83, 44, 20, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 0, 1, 1, 8, 0, 18, 1, 235, 0, 229, 0, 18, 0, 16, 0, 14, 0, 2, 0, 7, 0, 18, 1, 9, 0, 34, 1, 252, 0, 46, 0, 0, 0, 0, 0, 20, 5, 20, 20, 40, 5, 5, 21, 37, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs55 = { 4, { 142,65,63,143 } }; +const TfArray<1, int> outputs55 = { 1, { 144 } }; +uint8_t ALIGN(4) opdata56[85] = { 98, 0, 5, 0, 0, 0, 0, 64, 4, 4, 4, 4, 4, 101, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 64, 4, 5, 5, 5, 5, 5, 105, 0, 0, 4, 0, 192, 4, 192, 4, 192, 4, 192, 4, 5, 5, 5, 5, 111, 0, 4, 0, 0, 4, 0, 4, 0, 4, 0, 4, 5, 5, 5, 5, 4, 67, 55, 36, 20, 4, 1, 4, 71, 57, 38, 23, 40, 41, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs56 = { 1, { 144 } }; +const TfArray<1, int> outputs56 = { 1, { 145 } }; +const TfArray<3, int> inputs57 = { 3, { 145,146,25 } }; +const TfArray<1, int> outputs57 = { 1, { 147 } }; +const TfArray<2, int> inputs58 = { 2, { 147,26 } }; +const TfArray<1, int> outputs58 = { 1, { 148 } }; +const TfArray<1, int> inputs59 = { 1, { 92 } }; +const TfArray<1, int> outputs59 = { 1, { 149 } }; +const TfArray<4, int> inputs60 = { 4, { 149,41,66,-1 } }; +const TfArray<1, int> outputs60 = { 1, { 150 } }; +const TfLiteConcatenationParams opdata61 = { 3, kTfLiteActNone }; +const TfArray<2, int> inputs61 = { 2, { 148,150 } }; +const TfArray<1, int> outputs61 = { 1, { 151 } }; +uint8_t ALIGN(4) opdata62[314] = { 109, 112, 0, 8, 0, 10, 0, 0, 160, 0, 0, 0, 0, 97, 0, 24, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 96, 9, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 3, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 3, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 13, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 3, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 3, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 5, 200, 161, 122, 83, 44, 20, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 0, 1, 1, 8, 0, 18, 1, 235, 0, 229, 0, 18, 0, 16, 0, 14, 0, 2, 0, 7, 0, 18, 1, 9, 0, 34, 1, 252, 0, 46, 0, 0, 0, 0, 0, 20, 5, 20, 20, 40, 5, 5, 21, 37, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs62 = { 4, { 151,68,67,-1 } }; +const TfArray<1, int> outputs62 = { 1, { 152 } }; +uint8_t ALIGN(4) opdata63[91] = { 98, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 5, 5, 5, 5, 5, 101, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 128, 4, 5, 5, 5, 5, 5, 105, 0, 0, 4, 0, 0, 5, 0, 5, 0, 5, 0, 5, 5, 5, 5, 5, 111, 0, 4, 0, 0, 4, 0, 4, 0, 4, 0, 4, 5, 5, 5, 5, 4, 73, 55, 36, 20, 4, 1, 4, 76, 57, 38, 23, 41, 41, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs63 = { 1, { 152 } }; +const TfArray<1, int> outputs63 = { 1, { 153 } }; +uint8_t ALIGN(4) opdata64[314] = { 109, 112, 0, 8, 0, 5, 0, 0, 64, 0, 0, 0, 0, 97, 0, 24, 0, 12, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 4, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128, 3, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128, 3, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128, 3, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 15, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 3, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 3, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 5, 200, 161, 122, 83, 44, 20, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 0, 1, 1, 8, 0, 18, 1, 235, 0, 229, 0, 18, 0, 16, 0, 14, 0, 2, 0, 7, 0, 18, 1, 9, 0, 34, 1, 252, 0, 46, 0, 0, 0, 0, 0, 20, 5, 20, 20, 40, 5, 5, 21, 37, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs64 = { 4, { 153,70,69,-1 } }; +const TfArray<1, int> outputs64 = { 1, { 154 } }; +uint8_t ALIGN(4) opdata65[85] = { 98, 0, 5, 0, 0, 0, 0, 64, 4, 4, 4, 4, 4, 101, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 64, 4, 5, 5, 5, 5, 5, 105, 0, 0, 4, 0, 128, 4, 128, 4, 128, 4, 128, 4, 5, 5, 5, 5, 111, 0, 4, 0, 0, 4, 0, 4, 0, 4, 0, 4, 5, 5, 5, 5, 4, 67, 55, 36, 20, 4, 1, 4, 71, 57, 38, 23, 40, 41, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs65 = { 1, { 154 } }; +const TfArray<1, int> outputs65 = { 1, { 155 } }; +const TfArray<3, int> inputs66 = { 3, { 155,156,27 } }; +const TfArray<1, int> outputs66 = { 1, { 157 } }; +const TfArray<2, int> inputs67 = { 2, { 157,28 } }; +const TfArray<1, int> outputs67 = { 1, { 158 } }; +const TfArray<2, int> inputs68 = { 2, { 158,29 } }; +const TfArray<1, int> outputs68 = { 1, { 159 } }; +const TfLiteConcatenationParams opdata69 = { 3, kTfLiteActNone }; +const TfArray<2, int> inputs69 = { 2, { 159,92 } }; +const TfArray<1, int> outputs69 = { 1, { 160 } }; +const TfArray<4, int> inputs70 = { 4, { 160,72,71,-1 } }; +const TfArray<1, int> outputs70 = { 1, { 161 } }; +const TfArray<1, int> inputs71 = { 1, { 161 } }; +const TfArray<1, int> outputs71 = { 1, { 162 } }; +uint8_t ALIGN(4) opdata72[314] = { 109, 112, 0, 8, 0, 5, 0, 0, 64, 0, 0, 0, 0, 97, 0, 24, 0, 12, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 4, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 6, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 6, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 11, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 7, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 7, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 18, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 192, 6, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 5, 200, 161, 122, 83, 44, 20, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 0, 1, 1, 8, 0, 18, 1, 235, 0, 229, 0, 18, 0, 16, 0, 14, 0, 2, 0, 7, 0, 18, 1, 9, 0, 34, 1, 252, 0, 46, 0, 0, 0, 0, 0, 20, 5, 20, 20, 40, 5, 5, 21, 37, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs72 = { 4, { 162,74,73,-1 } }; +const TfArray<1, int> outputs72 = { 1, { 163 } }; +uint8_t ALIGN(4) opdata73[314] = { 109, 112, 0, 8, 0, 5, 0, 0, 64, 0, 0, 0, 0, 97, 0, 24, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 128, 4, 0, 0, 0, 111, 0, 4, 32, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 192, 6, 0, 0, 128, 0, 0, 0, 64, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 192, 6, 0, 0, 128, 0, 0, 0, 64, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 11, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 64, 7, 0, 0, 128, 0, 0, 0, 64, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 64, 7, 0, 0, 128, 0, 0, 0, 64, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 17, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 64, 7, 0, 0, 128, 0, 0, 0, 64, 0, 0, 0, 48, 48, 0, 5, 200, 161, 122, 83, 44, 20, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 0, 1, 1, 8, 0, 18, 1, 235, 0, 229, 0, 18, 0, 16, 0, 14, 0, 2, 0, 7, 0, 18, 1, 9, 0, 34, 1, 252, 0, 46, 0, 0, 0, 0, 0, 20, 5, 20, 20, 40, 5, 5, 21, 37, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs73 = { 4, { 162,75,73,163 } }; +const TfArray<1, int> outputs73 = { 1, { 164 } }; +const TfArray<1, int> inputs74 = { 1, { 164 } }; +const TfArray<1, int> outputs74 = { 1, { 165 } }; +const TfArray<3, int> inputs75 = { 3, { 165,166,30 } }; +const TfArray<1, int> outputs75 = { 1, { 167 } }; +const TfArray<2, int> inputs76 = { 2, { 167,31 } }; +const TfArray<1, int> outputs76 = { 1, { 168 } }; +const TfArray<1, int> inputs77 = { 1, { 85 } }; +const TfArray<1, int> outputs77 = { 1, { 169 } }; +const TfArray<1, int> inputs78 = { 1, { 169 } }; +const TfArray<1, int> outputs78 = { 1, { 170 } }; +const TfArray<4, int> inputs79 = { 4, { 170,35,76,-1 } }; +const TfArray<1, int> outputs79 = { 1, { 171 } }; +const TfLiteConcatenationParams opdata80 = { 3, kTfLiteActNone }; +const TfArray<2, int> inputs80 = { 2, { 168,171 } }; +const TfArray<1, int> outputs80 = { 1, { 172 } }; +uint8_t ALIGN(4) opdata81[91] = { 98, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 5, 5, 5, 5, 101, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 17, 5, 5, 5, 5, 5, 105, 0, 0, 4, 0, 0, 18, 0, 18, 0, 18, 0, 18, 5, 5, 5, 5, 111, 0, 4, 0, 0, 16, 0, 16, 0, 16, 0, 16, 5, 5, 5, 5, 4, 73, 55, 36, 20, 4, 1, 4, 76, 57, 38, 23, 41, 41, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs81 = { 1, { 172 } }; +const TfArray<1, int> outputs81 = { 1, { 173 } }; +uint8_t ALIGN(4) opdata82[314] = { 109, 112, 0, 8, 0, 18, 0, 0, 128, 0, 0, 0, 0, 97, 0, 24, 0, 24, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 128, 16, 0, 0, 0, 111, 0, 4, 16, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 160, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 14, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 160, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 21, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 160, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 21, 0, 0, 0, 27, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 224, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 160, 6, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 5, 200, 161, 122, 83, 44, 20, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 0, 1, 1, 8, 0, 18, 1, 235, 0, 229, 0, 18, 0, 16, 0, 14, 0, 2, 0, 7, 0, 18, 1, 9, 0, 34, 1, 252, 0, 46, 0, 0, 0, 0, 0, 20, 5, 20, 20, 40, 5, 5, 21, 37, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs82 = { 4, { 173,78,77,-1 } }; +const TfArray<1, int> outputs82 = { 1, { 174 } }; +uint8_t ALIGN(4) opdata83[314] = { 109, 112, 0, 8, 0, 18, 0, 0, 128, 0, 0, 0, 0, 97, 0, 24, 0, 16, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 111, 0, 4, 16, 0, 0, 0, 0, 112, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 160, 6, 0, 0, 64, 0, 0, 0, 128, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 14, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 160, 6, 0, 0, 64, 0, 0, 0, 128, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 21, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 160, 6, 0, 0, 64, 0, 0, 0, 128, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 21, 0, 0, 0, 27, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 224, 6, 0, 0, 64, 0, 0, 0, 128, 0, 0, 0, 48, 48, 0, 38, 0, 0, 0, 0, 1, 0, 0, 0, 27, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 224, 6, 0, 0, 64, 0, 0, 0, 128, 0, 0, 0, 48, 48, 0, 5, 200, 161, 122, 83, 44, 20, 20, 20, 20, 20, 115, 0, 107, 0, 116, 0, 7, 0, 1, 1, 8, 0, 18, 1, 235, 0, 229, 0, 18, 0, 16, 0, 14, 0, 2, 0, 7, 0, 18, 1, 9, 0, 34, 1, 252, 0, 46, 0, 0, 0, 0, 0, 20, 5, 20, 20, 40, 5, 5, 21, 37, 1, }; /* custom_initial_data */ +const TfArray<4, int> inputs83 = { 4, { 173,79,77,174 } }; +const TfArray<1, int> outputs83 = { 1, { 175 } }; +uint8_t ALIGN(4) opdata84[77] = { 98, 0, 5, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 101, 0, 5, 1, 1, 1, 67, 2, 4, 4, 4, 4, 4, 105, 0, 4, 0, 96, 8, 96, 8, 96, 8, 32, 0, 5, 5, 5, 5, 111, 0, 4, 0, 134, 0, 134, 0, 134, 0, 2, 0, 5, 5, 5, 5, 4, 59, 47, 35, 20, 4, 1, 4, 63, 51, 38, 23, 40, 40, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs84 = { 1, { 175 } }; +const TfArray<1, int> outputs84 = { 1, { 176 } }; +uint8_t ALIGN(4) opdata85[85] = { 98, 0, 5, 0, 0, 0, 0, 2, 4, 4, 4, 4, 4, 101, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 130, 0, 5, 5, 5, 5, 5, 105, 0, 0, 4, 0, 134, 0, 134, 0, 134, 0, 134, 0, 5, 5, 5, 5, 111, 0, 4, 0, 128, 0, 128, 0, 128, 0, 128, 0, 5, 5, 5, 5, 4, 67, 55, 36, 20, 4, 1, 4, 71, 57, 38, 23, 40, 41, 41, 41, 8, 36, 1, }; /* custom_initial_data */ +const TfArray<1, int> inputs85 = { 1, { 176 } }; +const TfArray<1, int> outputs85 = { 1, { 177 } }; +const TfArray<1, int> inputs86 = { 1, { 177 } }; +const TfArray<1, int> outputs86 = { 1, { 178 } }; +uint8_t ALIGN(4) opdata87[15] = { 116, 121, 112, 101, 0, 1, 6, 1, 1, 1, 2, 4, 2, 36, 1, }; /* custom_initial_data */ +const TfArray<2, int> inputs87 = { 2, { 120,32 } }; +const TfArray<1, int> outputs87 = { 1, { 179 } }; +const TfArray<2, int> inputs88 = { 2, { 178,33 } }; +const TfArray<1, int> outputs88 = { 1, { 180 } }; +} g0; + +TfLiteTensor tflTensors[] = +{{ {(int32_t*)(tensor_arena + 256)},(TfLiteIntArray*)&g0.tensor_dimension0, kTfLiteFloat32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteFloat32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteArenaRw, false, }, +{ {(int32_t*)g0.tensor_data2},(TfLiteIntArray*)&g0.tensor_dimension2, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},4, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data3},(TfLiteIntArray*)&g0.tensor_dimension3, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},12, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data4},(TfLiteIntArray*)&g0.tensor_dimension3, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},12, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data5},(TfLiteIntArray*)&g0.tensor_dimension5, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},4, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data6},(TfLiteIntArray*)&g0.tensor_dimension5, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},4, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data7},(TfLiteIntArray*)&g0.tensor_dimension5, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},4, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data8},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},64, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data9},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},64, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data10},(TfLiteIntArray*)&g0.tensor_dimension10, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},1024, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data11},(TfLiteIntArray*)&g0.tensor_dimension5, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},4, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data12},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},64, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data13},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},64, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data14},(TfLiteIntArray*)&g0.tensor_dimension10, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},1024, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data15},(TfLiteIntArray*)&g0.tensor_dimension5, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},4, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data16},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},64, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data17},(TfLiteIntArray*)&g0.tensor_dimension10, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},1024, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data18},(TfLiteIntArray*)&g0.tensor_dimension5, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},4, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data19},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},64, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data20},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},64, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data21},(TfLiteIntArray*)&g0.tensor_dimension10, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},1024, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data22},(TfLiteIntArray*)&g0.tensor_dimension22, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},32, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data23},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},64, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data24},(TfLiteIntArray*)&g0.tensor_dimension10, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},1024, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data25},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},64, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data26},(TfLiteIntArray*)&g0.tensor_dimension10, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},1024, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data27},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},64, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data28},(TfLiteIntArray*)&g0.tensor_dimension10, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},1024, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data29},(TfLiteIntArray*)&g0.tensor_dimension22, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},32, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data30},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},64, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data31},(TfLiteIntArray*)&g0.tensor_dimension10, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},1024, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data32},(TfLiteIntArray*)&g0.tensor_dimension32, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},8, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data33},(TfLiteIntArray*)&g0.tensor_dimension32, kTfLiteUInt8, {kTfLiteNoQuantization, nullptr }, {0,0},8, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data34},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data35},(TfLiteIntArray*)&g0.tensor_dimension35, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},2816, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data36},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data37},(TfLiteIntArray*)&g0.tensor_dimension37, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},3072, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data38},(TfLiteIntArray*)&g0.tensor_dimension38, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},384, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data39},(TfLiteIntArray*)&g0.tensor_dimension39, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},7680, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data40},(TfLiteIntArray*)&g0.tensor_dimension38, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},384, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data41},(TfLiteIntArray*)&g0.tensor_dimension41, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},7168, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data42},(TfLiteIntArray*)&g0.tensor_dimension42, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},512, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data43},(TfLiteIntArray*)&g0.tensor_dimension43, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},15616, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data44},(TfLiteIntArray*)&g0.tensor_dimension42, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},512, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data45},(TfLiteIntArray*)&g0.tensor_dimension45, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},12288, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data46},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data47},(TfLiteIntArray*)&g0.tensor_dimension47, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},4096, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data48},(TfLiteIntArray*)&g0.tensor_dimension48, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},1536, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data49},(TfLiteIntArray*)&g0.tensor_dimension45, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},12288, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data50},(TfLiteIntArray*)&g0.tensor_dimension48, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},1536, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data51},(TfLiteIntArray*)&g0.tensor_dimension45, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},12288, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data52},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data53},(TfLiteIntArray*)&g0.tensor_dimension10, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},1024, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data54},(TfLiteIntArray*)&g0.tensor_dimension10, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},1024, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data55},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data56},(TfLiteIntArray*)&g0.tensor_dimension37, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},3072, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data57},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data58},(TfLiteIntArray*)&g0.tensor_dimension58, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},2048, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data59},(TfLiteIntArray*)&g0.tensor_dimension10, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},1024, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data60},(TfLiteIntArray*)&g0.tensor_dimension42, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},512, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data61},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data62},(TfLiteIntArray*)&g0.tensor_dimension37, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},3072, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data63},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data64},(TfLiteIntArray*)&g0.tensor_dimension37, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},3072, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data65},(TfLiteIntArray*)&g0.tensor_dimension58, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},2048, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data66},(TfLiteIntArray*)&g0.tensor_dimension38, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},384, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data67},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data68},(TfLiteIntArray*)&g0.tensor_dimension35, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},2816, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data69},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data70},(TfLiteIntArray*)&g0.tensor_dimension37, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},3072, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data71},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data72},(TfLiteIntArray*)&g0.tensor_dimension35, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},2816, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data73},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data74},(TfLiteIntArray*)&g0.tensor_dimension37, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},3072, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data75},(TfLiteIntArray*)&g0.tensor_dimension58, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},2048, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data76},(TfLiteIntArray*)&g0.tensor_dimension8, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data77},(TfLiteIntArray*)&g0.tensor_dimension22, kTfLiteInt32, {kTfLiteNoQuantization, nullptr }, {0,0},128, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data78},(TfLiteIntArray*)&g0.tensor_dimension37, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},3072, kTfLiteMmapRo, false, }, +{ {(int32_t*)g0.tensor_data79},(TfLiteIntArray*)&g0.tensor_dimension58, kTfLiteInt8, {kTfLiteNoQuantization, nullptr }, {0,0},2048, kTfLiteMmapRo, false, }, +{ {(int32_t*)(tensor_arena + 6784)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant80)) }, {g0.quant80.scale->data[0], g0.quant80.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 128)},(TfLiteIntArray*)&g0.tensor_dimension0, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant81)) }, {g0.quant81.scale->data[0], g0.quant81.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)g0.tensor_data82},(TfLiteIntArray*)&g0.tensor_dimension82, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant82)) }, {g0.quant82.scale->data[0], g0.quant82.zero_point->data[0] },2, kTfLiteMmapRo, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension0, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant83)) }, {g0.quant83.scale->data[0], g0.quant83.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)g0.tensor_data84},(TfLiteIntArray*)&g0.tensor_dimension82, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant84)) }, {g0.quant84.scale->data[0], g0.quant84.zero_point->data[0] },2, kTfLiteMmapRo, false, }, +{ {(int32_t*)(tensor_arena + 6656)},(TfLiteIntArray*)&g0.tensor_dimension0, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant85)) }, {g0.quant85.scale->data[0], g0.quant85.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 2144)},(TfLiteIntArray*)&g0.tensor_dimension86, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant85)) }, {g0.quant85.scale->data[0], g0.quant85.zero_point->data[0] },2048, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension87, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant85)) }, {g0.quant85.scale->data[0], g0.quant85.zero_point->data[0] },2144, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 2176)},(TfLiteIntArray*)&g0.tensor_dimension88, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant88)) }, {g0.quant88.scale->data[0], g0.quant88.zero_point->data[0] },2048, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension89, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant88)) }, {g0.quant88.scale->data[0], g0.quant88.zero_point->data[0] },2176, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 2240)},(TfLiteIntArray*)&g0.tensor_dimension88, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant90)) }, {g0.quant90.scale->data[0], g0.quant90.zero_point->data[0] },2048, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension91, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant90)) }, {g0.quant90.scale->data[0], g0.quant90.zero_point->data[0] },2240, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 4096)},(TfLiteIntArray*)&g0.tensor_dimension92, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant92)) }, {g0.quant92.scale->data[0], g0.quant92.zero_point->data[0] },1536, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension93, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant92)) }, {g0.quant92.scale->data[0], g0.quant92.zero_point->data[0] },1728, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 1824)},(TfLiteIntArray*)&g0.tensor_dimension92, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant94)) }, {g0.quant94.scale->data[0], g0.quant94.zero_point->data[0] },1536, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension95, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant94)) }, {g0.quant94.scale->data[0], g0.quant94.zero_point->data[0] },1824, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 5632)},(TfLiteIntArray*)&g0.tensor_dimension96, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant96)) }, {g0.quant96.scale->data[0], g0.quant96.zero_point->data[0] },1024, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension97, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant96)) }, {g0.quant96.scale->data[0], g0.quant96.zero_point->data[0] },1152, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 1152)},(TfLiteIntArray*)&g0.tensor_dimension98, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant98)) }, {g0.quant98.scale->data[0], g0.quant98.zero_point->data[0] },512, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension99, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant99)) }, {g0.quant99.scale->data[0], g0.quant99.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 384)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant99)) }, {g0.quant99.scale->data[0], g0.quant99.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension101, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant101)) }, {g0.quant101.scale->data[0], g0.quant101.zero_point->data[0] },384, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 1024)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant101)) }, {g0.quant101.scale->data[0], g0.quant101.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 896)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant101)) }, {g0.quant101.scale->data[0], g0.quant101.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 768)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant101)) }, {g0.quant101.scale->data[0], g0.quant101.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension101, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant105)) }, {g0.quant105.scale->data[0], g0.quant105.zero_point->data[0] },384, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 384)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant105)) }, {g0.quant105.scale->data[0], g0.quant105.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 640)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant105)) }, {g0.quant105.scale->data[0], g0.quant105.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 512)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant105)) }, {g0.quant105.scale->data[0], g0.quant105.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 128)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant109)) }, {g0.quant109.scale->data[0], g0.quant109.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant110)) }, {g0.quant110.scale->data[0], g0.quant110.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 384)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant111)) }, {g0.quant111.scale->data[0], g0.quant111.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)g0.tensor_data112},(TfLiteIntArray*)&g0.tensor_dimension2, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant112)) }, {g0.quant112.scale->data[0], g0.quant112.zero_point->data[0] },2, kTfLiteMmapRo, false, }, +{ {(int32_t*)(tensor_arena + 256)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant113)) }, {g0.quant113.scale->data[0], g0.quant113.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 128)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant114)) }, {g0.quant114.scale->data[0], g0.quant114.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant110)) }, {g0.quant110.scale->data[0], g0.quant110.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 128)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant116)) }, {g0.quant116.scale->data[0], g0.quant116.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant117)) }, {g0.quant117.scale->data[0], g0.quant117.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 128)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant110)) }, {g0.quant110.scale->data[0], g0.quant110.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant119)) }, {g0.quant119.scale->data[0], g0.quant119.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 10752)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant80)) }, {g0.quant80.scale->data[0], g0.quant80.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension99, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant80)) }, {g0.quant80.scale->data[0], g0.quant80.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 512)},(TfLiteIntArray*)&g0.tensor_dimension99, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant80)) }, {g0.quant80.scale->data[0], g0.quant80.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 256)},(TfLiteIntArray*)&g0.tensor_dimension123, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant123)) }, {g0.quant123.scale->data[0], g0.quant123.zero_point->data[0] },256, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension123, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant123)) }, {g0.quant123.scale->data[0], g0.quant123.zero_point->data[0] },256, kTfLiteArenaRw, false, }, +{ {(int32_t*)g0.tensor_data125},(TfLiteIntArray*)&g0.tensor_dimension22, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant125)) }, {g0.quant125.scale->data[0], g0.quant125.zero_point->data[0] },64, kTfLiteMmapRo, false, }, +{ {(int32_t*)(tensor_arena + 256)},(TfLiteIntArray*)&g0.tensor_dimension123, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant126)) }, {g0.quant126.scale->data[0], g0.quant126.zero_point->data[0] },256, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension123, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant126)) }, {g0.quant126.scale->data[0], g0.quant126.zero_point->data[0] },256, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 768)},(TfLiteIntArray*)&g0.tensor_dimension123, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant98)) }, {g0.quant98.scale->data[0], g0.quant98.zero_point->data[0] },256, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension129, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant98)) }, {g0.quant98.scale->data[0], g0.quant98.zero_point->data[0] },768, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 768)},(TfLiteIntArray*)&g0.tensor_dimension123, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant130)) }, {g0.quant130.scale->data[0], g0.quant130.zero_point->data[0] },256, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 1152)},(TfLiteIntArray*)&g0.tensor_dimension131, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant130)) }, {g0.quant130.scale->data[0], g0.quant130.zero_point->data[0] },384, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 576)},(TfLiteIntArray*)&g0.tensor_dimension132, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant132)) }, {g0.quant132.scale->data[0], g0.quant132.zero_point->data[0] },576, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension132, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant132)) }, {g0.quant132.scale->data[0], g0.quant132.zero_point->data[0] },576, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 576)},(TfLiteIntArray*)&g0.tensor_dimension134, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant132)) }, {g0.quant132.scale->data[0], g0.quant132.zero_point->data[0] },512, kTfLiteArenaRw, false, }, +{ {(int32_t*)g0.tensor_data135},(TfLiteIntArray*)&g0.tensor_dimension22, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant135)) }, {g0.quant135.scale->data[0], g0.quant135.zero_point->data[0] },64, kTfLiteMmapRo, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension134, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant136)) }, {g0.quant136.scale->data[0], g0.quant136.zero_point->data[0] },512, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 3360)},(TfLiteIntArray*)&g0.tensor_dimension134, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant136)) }, {g0.quant136.scale->data[0], g0.quant136.zero_point->data[0] },512, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension95, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant94)) }, {g0.quant94.scale->data[0], g0.quant94.zero_point->data[0] },1824, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 1824)},(TfLiteIntArray*)&g0.tensor_dimension96, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant136)) }, {g0.quant136.scale->data[0], g0.quant136.zero_point->data[0] },1024, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension140, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant136)) }, {g0.quant136.scale->data[0], g0.quant136.zero_point->data[0] },1536, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 1536)},(TfLiteIntArray*)&g0.tensor_dimension134, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant141)) }, {g0.quant141.scale->data[0], g0.quant141.zero_point->data[0] },512, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 2432)},(TfLiteIntArray*)&g0.tensor_dimension142, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant141)) }, {g0.quant141.scale->data[0], g0.quant141.zero_point->data[0] },768, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 1216)},(TfLiteIntArray*)&g0.tensor_dimension143, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant143)) }, {g0.quant143.scale->data[0], g0.quant143.zero_point->data[0] },1216, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension143, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant143)) }, {g0.quant143.scale->data[0], g0.quant143.zero_point->data[0] },1216, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 1216)},(TfLiteIntArray*)&g0.tensor_dimension145, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant143)) }, {g0.quant143.scale->data[0], g0.quant143.zero_point->data[0] },1024, kTfLiteArenaRw, false, }, +{ {(int32_t*)g0.tensor_data146},(TfLiteIntArray*)&g0.tensor_dimension22, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant146)) }, {g0.quant146.scale->data[0], g0.quant146.zero_point->data[0] },64, kTfLiteMmapRo, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension145, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant147)) }, {g0.quant147.scale->data[0], g0.quant147.zero_point->data[0] },1024, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 5632)},(TfLiteIntArray*)&g0.tensor_dimension145, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant147)) }, {g0.quant147.scale->data[0], g0.quant147.zero_point->data[0] },1024, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension93, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant92)) }, {g0.quant92.scale->data[0], g0.quant92.zero_point->data[0] },1728, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 2560)},(TfLiteIntArray*)&g0.tensor_dimension92, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant147)) }, {g0.quant147.scale->data[0], g0.quant147.zero_point->data[0] },1536, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension151, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant147)) }, {g0.quant147.scale->data[0], g0.quant147.zero_point->data[0] },2560, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 2560)},(TfLiteIntArray*)&g0.tensor_dimension145, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant152)) }, {g0.quant152.scale->data[0], g0.quant152.zero_point->data[0] },1024, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension153, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant152)) }, {g0.quant152.scale->data[0], g0.quant152.zero_point->data[0] },1280, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 1280)},(TfLiteIntArray*)&g0.tensor_dimension154, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant154)) }, {g0.quant154.scale->data[0], g0.quant154.zero_point->data[0] },1152, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension145, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant154)) }, {g0.quant154.scale->data[0], g0.quant154.zero_point->data[0] },1024, kTfLiteArenaRw, false, }, +{ {(int32_t*)g0.tensor_data156},(TfLiteIntArray*)&g0.tensor_dimension22, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant156)) }, {g0.quant156.scale->data[0], g0.quant156.zero_point->data[0] },64, kTfLiteMmapRo, false, }, +{ {(int32_t*)(tensor_arena + 1024)},(TfLiteIntArray*)&g0.tensor_dimension145, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant157)) }, {g0.quant157.scale->data[0], g0.quant157.zero_point->data[0] },1024, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension145, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant157)) }, {g0.quant157.scale->data[0], g0.quant157.zero_point->data[0] },1024, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 2560)},(TfLiteIntArray*)&g0.tensor_dimension145, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant92)) }, {g0.quant92.scale->data[0], g0.quant92.zero_point->data[0] },1024, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension151, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant92)) }, {g0.quant92.scale->data[0], g0.quant92.zero_point->data[0] },2560, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 2560)},(TfLiteIntArray*)&g0.tensor_dimension145, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant161)) }, {g0.quant161.scale->data[0], g0.quant161.zero_point->data[0] },1024, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 4480)},(TfLiteIntArray*)&g0.tensor_dimension153, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant161)) }, {g0.quant161.scale->data[0], g0.quant161.zero_point->data[0] },1280, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 2240)},(TfLiteIntArray*)&g0.tensor_dimension91, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant163)) }, {g0.quant163.scale->data[0], g0.quant163.zero_point->data[0] },2240, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension91, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant163)) }, {g0.quant163.scale->data[0], g0.quant163.zero_point->data[0] },2240, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 2240)},(TfLiteIntArray*)&g0.tensor_dimension88, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant163)) }, {g0.quant163.scale->data[0], g0.quant163.zero_point->data[0] },2048, kTfLiteArenaRw, false, }, +{ {(int32_t*)g0.tensor_data166},(TfLiteIntArray*)&g0.tensor_dimension22, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant166)) }, {g0.quant166.scale->data[0], g0.quant166.zero_point->data[0] },64, kTfLiteMmapRo, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension88, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant167)) }, {g0.quant167.scale->data[0], g0.quant167.zero_point->data[0] },2048, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 8704)},(TfLiteIntArray*)&g0.tensor_dimension88, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant167)) }, {g0.quant167.scale->data[0], g0.quant167.zero_point->data[0] },2048, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 2144)},(TfLiteIntArray*)&g0.tensor_dimension86, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant85)) }, {g0.quant85.scale->data[0], g0.quant85.zero_point->data[0] },2048, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension87, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant85)) }, {g0.quant85.scale->data[0], g0.quant85.zero_point->data[0] },2144, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 2144)},(TfLiteIntArray*)&g0.tensor_dimension88, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant167)) }, {g0.quant167.scale->data[0], g0.quant167.zero_point->data[0] },2048, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 4608)},(TfLiteIntArray*)&g0.tensor_dimension172, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant167)) }, {g0.quant167.scale->data[0], g0.quant167.zero_point->data[0] },4096, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension173, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant167)) }, {g0.quant167.scale->data[0], g0.quant167.zero_point->data[0] },4608, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 6752)},(TfLiteIntArray*)&g0.tensor_dimension87, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant174)) }, {g0.quant174.scale->data[0], g0.quant174.zero_point->data[0] },2144, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 4608)},(TfLiteIntArray*)&g0.tensor_dimension87, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant174)) }, {g0.quant174.scale->data[0], g0.quant174.zero_point->data[0] },2144, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension176, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant174)) }, {g0.quant174.scale->data[0], g0.quant174.zero_point->data[0] },134, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 136)},(TfLiteIntArray*)&g0.tensor_dimension0, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant174)) }, {g0.quant174.scale->data[0], g0.quant174.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 512)},(TfLiteIntArray*)&g0.tensor_dimension0, kTfLiteInt16, {kTfLiteAffineQuantization, const_cast(static_cast(&g0.quant110)) }, {g0.quant110.scale->data[0], g0.quant110.zero_point->data[0] },128, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 256)},(TfLiteIntArray*)&g0.tensor_dimension1, kTfLiteFloat32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteArenaRw, false, }, +{ {(int32_t*)(tensor_arena + 0)},(TfLiteIntArray*)&g0.tensor_dimension0, kTfLiteFloat32, {kTfLiteNoQuantization, nullptr }, {0,0},256, kTfLiteArenaRw, false, }, +}; + +TfLiteNode tflNodes[] = +{{ (TfLiteIntArray*)&g0.inputs0, (TfLiteIntArray*)&g0.outputs0, (TfLiteIntArray*)&g0.inputs0, const_cast(static_cast(&g0.opdata0)), 15, }, +{ (TfLiteIntArray*)&g0.inputs1, (TfLiteIntArray*)&g0.outputs1, (TfLiteIntArray*)&g0.inputs1, const_cast(static_cast(&g0.opdata0)), 15, }, +{ (TfLiteIntArray*)&g0.inputs2, (TfLiteIntArray*)&g0.outputs2, (TfLiteIntArray*)&g0.inputs2, const_cast(static_cast(&g0.opdata2)), 15, }, +{ (TfLiteIntArray*)&g0.inputs3, (TfLiteIntArray*)&g0.outputs3, (TfLiteIntArray*)&g0.inputs3, const_cast(static_cast(&g0.opdata0)), 15, }, +{ (TfLiteIntArray*)&g0.inputs4, (TfLiteIntArray*)&g0.outputs4, (TfLiteIntArray*)&g0.inputs4, const_cast(static_cast(&g0.opdata4)), 77, }, +{ (TfLiteIntArray*)&g0.inputs5, (TfLiteIntArray*)&g0.outputs5, (TfLiteIntArray*)&g0.inputs5, const_cast(static_cast(&g0.opdata5)), 85, }, +{ (TfLiteIntArray*)&g0.inputs6, (TfLiteIntArray*)&g0.outputs6, (TfLiteIntArray*)&g0.inputs6, const_cast(static_cast(&g0.opdata6)), 314, }, +{ (TfLiteIntArray*)&g0.inputs7, (TfLiteIntArray*)&g0.outputs7, (TfLiteIntArray*)&g0.inputs7, const_cast(static_cast(&g0.opdata7)), 85, }, +{ (TfLiteIntArray*)&g0.inputs8, (TfLiteIntArray*)&g0.outputs8, (TfLiteIntArray*)&g0.inputs8, const_cast(static_cast(&g0.opdata8)), 314, }, +{ (TfLiteIntArray*)&g0.inputs9, (TfLiteIntArray*)&g0.outputs9, (TfLiteIntArray*)&g0.inputs9, const_cast(static_cast(&g0.opdata9)), 85, }, +{ (TfLiteIntArray*)&g0.inputs10, (TfLiteIntArray*)&g0.outputs10, (TfLiteIntArray*)&g0.inputs10, const_cast(static_cast(&g0.opdata10)), 314, }, +{ (TfLiteIntArray*)&g0.inputs11, (TfLiteIntArray*)&g0.outputs11, (TfLiteIntArray*)&g0.inputs11, const_cast(static_cast(&g0.opdata11)), 85, }, +{ (TfLiteIntArray*)&g0.inputs12, (TfLiteIntArray*)&g0.outputs12, (TfLiteIntArray*)&g0.inputs12, const_cast(static_cast(&g0.opdata12)), 314, }, +{ (TfLiteIntArray*)&g0.inputs13, (TfLiteIntArray*)&g0.outputs13, (TfLiteIntArray*)&g0.inputs13, const_cast(static_cast(&g0.opdata13)), 85, }, +{ (TfLiteIntArray*)&g0.inputs14, (TfLiteIntArray*)&g0.outputs14, (TfLiteIntArray*)&g0.inputs14, const_cast(static_cast(&g0.opdata14)), 314, }, +{ (TfLiteIntArray*)&g0.inputs15, (TfLiteIntArray*)&g0.outputs15, (TfLiteIntArray*)&g0.inputs15, const_cast(static_cast(&g0.opdata15)), 85, }, +{ (TfLiteIntArray*)&g0.inputs16, (TfLiteIntArray*)&g0.outputs16, (TfLiteIntArray*)&g0.inputs16, const_cast(static_cast(&g0.opdata16)), 254, }, +{ (TfLiteIntArray*)&g0.inputs17, (TfLiteIntArray*)&g0.outputs17, (TfLiteIntArray*)&g0.inputs17, const_cast(static_cast(&g0.opdata17)), 170, }, +{ (TfLiteIntArray*)&g0.inputs18, (TfLiteIntArray*)&g0.outputs18, (TfLiteIntArray*)&g0.inputs18, const_cast(static_cast(&g0.opdata18)), 0, }, +{ (TfLiteIntArray*)&g0.inputs19, (TfLiteIntArray*)&g0.outputs19, (TfLiteIntArray*)&g0.inputs19, const_cast(static_cast(&g0.opdata19)), 128, }, +{ (TfLiteIntArray*)&g0.inputs20, (TfLiteIntArray*)&g0.outputs20, (TfLiteIntArray*)&g0.inputs20, const_cast(static_cast(&g0.opdata20)), 0, }, +{ (TfLiteIntArray*)&g0.inputs21, (TfLiteIntArray*)&g0.outputs21, (TfLiteIntArray*)&g0.inputs21, const_cast(static_cast(&g0.opdata19)), 128, }, +{ (TfLiteIntArray*)&g0.inputs22, (TfLiteIntArray*)&g0.outputs22, (TfLiteIntArray*)&g0.inputs22, const_cast(static_cast(&g0.opdata22)), 0, }, +{ (TfLiteIntArray*)&g0.inputs23, (TfLiteIntArray*)&g0.outputs23, (TfLiteIntArray*)&g0.inputs23, const_cast(static_cast(&g0.opdata0)), 15, }, +{ (TfLiteIntArray*)&g0.inputs24, (TfLiteIntArray*)&g0.outputs24, (TfLiteIntArray*)&g0.inputs24, const_cast(static_cast(&g0.opdata24)), 0, }, +{ (TfLiteIntArray*)&g0.inputs25, (TfLiteIntArray*)&g0.outputs25, (TfLiteIntArray*)&g0.inputs25, const_cast(static_cast(&g0.opdata2)), 15, }, +{ (TfLiteIntArray*)&g0.inputs26, (TfLiteIntArray*)&g0.outputs26, (TfLiteIntArray*)&g0.inputs26, const_cast(static_cast(&g0.opdata0)), 15, }, +{ (TfLiteIntArray*)&g0.inputs27, (TfLiteIntArray*)&g0.outputs27, (TfLiteIntArray*)&g0.inputs27, const_cast(static_cast(&g0.opdata0)), 15, }, +{ (TfLiteIntArray*)&g0.inputs28, (TfLiteIntArray*)&g0.outputs28, (TfLiteIntArray*)&g0.inputs28, const_cast(static_cast(&g0.opdata24)), 0, }, +{ (TfLiteIntArray*)&g0.inputs29, (TfLiteIntArray*)&g0.outputs29, (TfLiteIntArray*)&g0.inputs29, const_cast(static_cast(&g0.opdata2)), 15, }, +{ (TfLiteIntArray*)&g0.inputs30, (TfLiteIntArray*)&g0.outputs30, (TfLiteIntArray*)&g0.inputs30, const_cast(static_cast(&g0.opdata0)), 15, }, +{ (TfLiteIntArray*)&g0.inputs31, (TfLiteIntArray*)&g0.outputs31, (TfLiteIntArray*)&g0.inputs31, const_cast(static_cast(&g0.opdata24)), 0, }, +{ (TfLiteIntArray*)&g0.inputs32, (TfLiteIntArray*)&g0.outputs32, (TfLiteIntArray*)&g0.inputs32, const_cast(static_cast(&g0.opdata2)), 15, }, +{ (TfLiteIntArray*)&g0.inputs33, (TfLiteIntArray*)&g0.outputs33, (TfLiteIntArray*)&g0.inputs33, const_cast(static_cast(&g0.opdata0)), 15, }, +{ (TfLiteIntArray*)&g0.inputs34, (TfLiteIntArray*)&g0.outputs34, (TfLiteIntArray*)&g0.inputs34, const_cast(static_cast(&g0.opdata34)), 0, }, +{ (TfLiteIntArray*)&g0.inputs35, (TfLiteIntArray*)&g0.outputs35, (TfLiteIntArray*)&g0.inputs35, nullptr, 0, }, +{ (TfLiteIntArray*)&g0.inputs36, (TfLiteIntArray*)&g0.outputs36, (TfLiteIntArray*)&g0.inputs36, const_cast(static_cast(&g0.opdata36)), 170, }, +{ (TfLiteIntArray*)&g0.inputs37, (TfLiteIntArray*)&g0.outputs37, (TfLiteIntArray*)&g0.inputs37, const_cast(static_cast(&g0.opdata37)), 170, }, +{ (TfLiteIntArray*)&g0.inputs38, (TfLiteIntArray*)&g0.outputs38, (TfLiteIntArray*)&g0.inputs38, const_cast(static_cast(&g0.opdata0)), 15, }, +{ (TfLiteIntArray*)&g0.inputs39, (TfLiteIntArray*)&g0.outputs39, (TfLiteIntArray*)&g0.inputs39, const_cast(static_cast(&g0.opdata24)), 0, }, +{ (TfLiteIntArray*)&g0.inputs40, (TfLiteIntArray*)&g0.outputs40, (TfLiteIntArray*)&g0.inputs40, const_cast(static_cast(&g0.opdata2)), 15, }, +{ (TfLiteIntArray*)&g0.inputs41, (TfLiteIntArray*)&g0.outputs41, (TfLiteIntArray*)&g0.inputs41, const_cast(static_cast(&g0.opdata41)), 0, }, +{ (TfLiteIntArray*)&g0.inputs42, (TfLiteIntArray*)&g0.outputs42, (TfLiteIntArray*)&g0.inputs42, const_cast(static_cast(&g0.opdata42)), 254, }, +{ (TfLiteIntArray*)&g0.inputs43, (TfLiteIntArray*)&g0.outputs43, (TfLiteIntArray*)&g0.inputs43, const_cast(static_cast(&g0.opdata43)), 85, }, +{ (TfLiteIntArray*)&g0.inputs44, (TfLiteIntArray*)&g0.outputs44, (TfLiteIntArray*)&g0.inputs44, const_cast(static_cast(&g0.opdata44)), 254, }, +{ (TfLiteIntArray*)&g0.inputs45, (TfLiteIntArray*)&g0.outputs45, (TfLiteIntArray*)&g0.inputs45, const_cast(static_cast(&g0.opdata45)), 254, }, +{ (TfLiteIntArray*)&g0.inputs46, (TfLiteIntArray*)&g0.outputs46, (TfLiteIntArray*)&g0.inputs46, const_cast(static_cast(&g0.opdata46)), 85, }, +{ (TfLiteIntArray*)&g0.inputs47, (TfLiteIntArray*)&g0.outputs47, (TfLiteIntArray*)&g0.inputs47, const_cast(static_cast(&g0.opdata0)), 15, }, +{ (TfLiteIntArray*)&g0.inputs48, (TfLiteIntArray*)&g0.outputs48, (TfLiteIntArray*)&g0.inputs48, const_cast(static_cast(&g0.opdata24)), 0, }, +{ (TfLiteIntArray*)&g0.inputs49, (TfLiteIntArray*)&g0.outputs49, (TfLiteIntArray*)&g0.inputs49, const_cast(static_cast(&g0.opdata13)), 85, }, +{ (TfLiteIntArray*)&g0.inputs50, (TfLiteIntArray*)&g0.outputs50, (TfLiteIntArray*)&g0.inputs50, const_cast(static_cast(&g0.opdata14)), 314, }, +{ (TfLiteIntArray*)&g0.inputs51, (TfLiteIntArray*)&g0.outputs51, (TfLiteIntArray*)&g0.inputs51, const_cast(static_cast(&g0.opdata51)), 0, }, +{ (TfLiteIntArray*)&g0.inputs52, (TfLiteIntArray*)&g0.outputs52, (TfLiteIntArray*)&g0.inputs52, const_cast(static_cast(&g0.opdata52)), 314, }, +{ (TfLiteIntArray*)&g0.inputs53, (TfLiteIntArray*)&g0.outputs53, (TfLiteIntArray*)&g0.inputs53, const_cast(static_cast(&g0.opdata53)), 91, }, +{ (TfLiteIntArray*)&g0.inputs54, (TfLiteIntArray*)&g0.outputs54, (TfLiteIntArray*)&g0.inputs54, const_cast(static_cast(&g0.opdata54)), 314, }, +{ (TfLiteIntArray*)&g0.inputs55, (TfLiteIntArray*)&g0.outputs55, (TfLiteIntArray*)&g0.inputs55, const_cast(static_cast(&g0.opdata55)), 314, }, +{ (TfLiteIntArray*)&g0.inputs56, (TfLiteIntArray*)&g0.outputs56, (TfLiteIntArray*)&g0.inputs56, const_cast(static_cast(&g0.opdata56)), 85, }, +{ (TfLiteIntArray*)&g0.inputs57, (TfLiteIntArray*)&g0.outputs57, (TfLiteIntArray*)&g0.inputs57, const_cast(static_cast(&g0.opdata0)), 15, }, +{ (TfLiteIntArray*)&g0.inputs58, (TfLiteIntArray*)&g0.outputs58, (TfLiteIntArray*)&g0.inputs58, const_cast(static_cast(&g0.opdata24)), 0, }, +{ (TfLiteIntArray*)&g0.inputs59, (TfLiteIntArray*)&g0.outputs59, (TfLiteIntArray*)&g0.inputs59, const_cast(static_cast(&g0.opdata11)), 85, }, +{ (TfLiteIntArray*)&g0.inputs60, (TfLiteIntArray*)&g0.outputs60, (TfLiteIntArray*)&g0.inputs60, const_cast(static_cast(&g0.opdata12)), 314, }, +{ (TfLiteIntArray*)&g0.inputs61, (TfLiteIntArray*)&g0.outputs61, (TfLiteIntArray*)&g0.inputs61, const_cast(static_cast(&g0.opdata61)), 0, }, +{ (TfLiteIntArray*)&g0.inputs62, (TfLiteIntArray*)&g0.outputs62, (TfLiteIntArray*)&g0.inputs62, const_cast(static_cast(&g0.opdata62)), 314, }, +{ (TfLiteIntArray*)&g0.inputs63, (TfLiteIntArray*)&g0.outputs63, (TfLiteIntArray*)&g0.inputs63, const_cast(static_cast(&g0.opdata63)), 91, }, +{ (TfLiteIntArray*)&g0.inputs64, (TfLiteIntArray*)&g0.outputs64, (TfLiteIntArray*)&g0.inputs64, const_cast(static_cast(&g0.opdata64)), 314, }, +{ (TfLiteIntArray*)&g0.inputs65, (TfLiteIntArray*)&g0.outputs65, (TfLiteIntArray*)&g0.inputs65, const_cast(static_cast(&g0.opdata65)), 85, }, +{ (TfLiteIntArray*)&g0.inputs66, (TfLiteIntArray*)&g0.outputs66, (TfLiteIntArray*)&g0.inputs66, const_cast(static_cast(&g0.opdata0)), 15, }, +{ (TfLiteIntArray*)&g0.inputs67, (TfLiteIntArray*)&g0.outputs67, (TfLiteIntArray*)&g0.inputs67, const_cast(static_cast(&g0.opdata24)), 0, }, +{ (TfLiteIntArray*)&g0.inputs68, (TfLiteIntArray*)&g0.outputs68, (TfLiteIntArray*)&g0.inputs68, const_cast(static_cast(&g0.opdata2)), 15, }, +{ (TfLiteIntArray*)&g0.inputs69, (TfLiteIntArray*)&g0.outputs69, (TfLiteIntArray*)&g0.inputs69, const_cast(static_cast(&g0.opdata69)), 0, }, +{ (TfLiteIntArray*)&g0.inputs70, (TfLiteIntArray*)&g0.outputs70, (TfLiteIntArray*)&g0.inputs70, const_cast(static_cast(&g0.opdata62)), 314, }, +{ (TfLiteIntArray*)&g0.inputs71, (TfLiteIntArray*)&g0.outputs71, (TfLiteIntArray*)&g0.inputs71, const_cast(static_cast(&g0.opdata63)), 91, }, +{ (TfLiteIntArray*)&g0.inputs72, (TfLiteIntArray*)&g0.outputs72, (TfLiteIntArray*)&g0.inputs72, const_cast(static_cast(&g0.opdata72)), 314, }, +{ (TfLiteIntArray*)&g0.inputs73, (TfLiteIntArray*)&g0.outputs73, (TfLiteIntArray*)&g0.inputs73, const_cast(static_cast(&g0.opdata73)), 314, }, +{ (TfLiteIntArray*)&g0.inputs74, (TfLiteIntArray*)&g0.outputs74, (TfLiteIntArray*)&g0.inputs74, const_cast(static_cast(&g0.opdata9)), 85, }, +{ (TfLiteIntArray*)&g0.inputs75, (TfLiteIntArray*)&g0.outputs75, (TfLiteIntArray*)&g0.inputs75, const_cast(static_cast(&g0.opdata0)), 15, }, +{ (TfLiteIntArray*)&g0.inputs76, (TfLiteIntArray*)&g0.outputs76, (TfLiteIntArray*)&g0.inputs76, const_cast(static_cast(&g0.opdata24)), 0, }, +{ (TfLiteIntArray*)&g0.inputs77, (TfLiteIntArray*)&g0.outputs77, (TfLiteIntArray*)&g0.inputs77, const_cast(static_cast(&g0.opdata4)), 77, }, +{ (TfLiteIntArray*)&g0.inputs78, (TfLiteIntArray*)&g0.outputs78, (TfLiteIntArray*)&g0.inputs78, const_cast(static_cast(&g0.opdata5)), 85, }, +{ (TfLiteIntArray*)&g0.inputs79, (TfLiteIntArray*)&g0.outputs79, (TfLiteIntArray*)&g0.inputs79, const_cast(static_cast(&g0.opdata6)), 314, }, +{ (TfLiteIntArray*)&g0.inputs80, (TfLiteIntArray*)&g0.outputs80, (TfLiteIntArray*)&g0.inputs80, const_cast(static_cast(&g0.opdata80)), 0, }, +{ (TfLiteIntArray*)&g0.inputs81, (TfLiteIntArray*)&g0.outputs81, (TfLiteIntArray*)&g0.inputs81, const_cast(static_cast(&g0.opdata81)), 91, }, +{ (TfLiteIntArray*)&g0.inputs82, (TfLiteIntArray*)&g0.outputs82, (TfLiteIntArray*)&g0.inputs82, const_cast(static_cast(&g0.opdata82)), 314, }, +{ (TfLiteIntArray*)&g0.inputs83, (TfLiteIntArray*)&g0.outputs83, (TfLiteIntArray*)&g0.inputs83, const_cast(static_cast(&g0.opdata83)), 314, }, +{ (TfLiteIntArray*)&g0.inputs84, (TfLiteIntArray*)&g0.outputs84, (TfLiteIntArray*)&g0.inputs84, const_cast(static_cast(&g0.opdata84)), 77, }, +{ (TfLiteIntArray*)&g0.inputs85, (TfLiteIntArray*)&g0.outputs85, (TfLiteIntArray*)&g0.inputs85, const_cast(static_cast(&g0.opdata85)), 85, }, +{ (TfLiteIntArray*)&g0.inputs86, (TfLiteIntArray*)&g0.outputs86, (TfLiteIntArray*)&g0.inputs86, nullptr, 0, }, +{ (TfLiteIntArray*)&g0.inputs87, (TfLiteIntArray*)&g0.outputs87, (TfLiteIntArray*)&g0.inputs87, const_cast(static_cast(&g0.opdata87)), 15, }, +{ (TfLiteIntArray*)&g0.inputs88, (TfLiteIntArray*)&g0.outputs88, (TfLiteIntArray*)&g0.inputs88, const_cast(static_cast(&g0.opdata87)), 15, }, +}; + +used_operators_e used_ops[] = +{OP_XC_unaryi16, OP_XC_unaryi16, OP_XC_binaryi16, OP_XC_binaryi16, OP_XC_pad_v2, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_XC_conv2d_v2, OP_UNPACK, OP_XC_conv2d_v2, OP_SPLIT, OP_XC_conv2d_v2, OP_SPLIT_V, OP_XC_binaryi16, OP_XC_lookup, OP_XC_binaryi16, OP_XC_binaryi16, OP_XC_binaryi16, OP_XC_lookup, OP_XC_binaryi16, OP_XC_binaryi16, OP_XC_lookup, OP_XC_binaryi16, OP_XC_binaryi16, OP_PACK, OP_TRANSPOSE, OP_XC_conv2d_v2, OP_XC_conv2d_v2, OP_XC_binaryi16, OP_XC_lookup, OP_XC_unaryi16, OP_CONCATENATION, OP_XC_conv2d_v2, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_XC_conv2d_v2, OP_XC_slice, OP_XC_binaryi16, OP_XC_lookup, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_CONCATENATION, OP_XC_conv2d_v2, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_XC_conv2d_v2, OP_XC_slice, OP_XC_binaryi16, OP_XC_lookup, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_CONCATENATION, OP_XC_conv2d_v2, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_XC_slice, OP_XC_binaryi16, OP_XC_lookup, OP_XC_unaryi16, OP_CONCATENATION, OP_XC_conv2d_v2, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_XC_conv2d_v2, OP_XC_slice, OP_XC_binaryi16, OP_XC_lookup, OP_XC_pad_v2, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_CONCATENATION, OP_XC_pad_v2, OP_XC_conv2d_v2, OP_XC_conv2d_v2, OP_XC_slice, OP_XC_slice, OP_LOGISTIC, OP_XC_unaryi16, OP_XC_unaryi16, }; + + +// Indices into tflTensors and tflNodes for subgraphs +size_t tflTensors_subgraph_index[] = {0, 181, }; +size_t tflNodes_subgraph_index[] = {0, 89, }; + +// Variable tensors +size_t varTensors_index[] = {}; + +// Input/output tensors +static const int inTensorIndices[] = { + 0, 1, +}; + +static const int outTensorIndices[] = { + 179, 180, +}; + +// Indices into inTensors and outTensors for subgraphs +size_t inTensors_subgraph_index[] = {0, 2, }; +size_t outTensors_subgraph_index[] = {0, 2, }; + +// Scratch buffer variables +int scratch_buffer_idx; +const int scratch_buffer_offsets[27] = { 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6912, 6784, 6784, 10880, 10880, 6784, 10880, 10880, 10880, 10880, 10880, 10880, 10880, 10880, 10880, 10880, 10880, 10880, 10880 }; +tflite::MicroContext mc; +tflite::MicroGraph micro_graph; +size_t currentSubgraphIndex = 0; + +// Xcore context and thread variables +xc_context_config_t xc_config; +// When using USE_DDR_FIX for enabling LPDDR support, only one thread can be used +#ifdef USE_DDR_FIX +static_assert((5 == 1), + "Only one thread can be used when using USE_DDR_FIX! Please recompile with one thread!"); +#endif +constexpr int kStackWordsPerThread = 256; +constexpr int threadsStackSizeInUint64 = 5 * kStackWordsPerThread/2; +// We use uint64_t for xcThreadsStack so that it is aligned to 8 bytes +uint64_t xcThreadsStack[threadsStackSizeInUint64]; + +// Persistent buffer ptr +// Initialized to the tail end of the tensor arena +uint8_t *persistentBufferPtr; +// Functions to be used as function pointers for TfLiteContext and MicroContext +static void* AllocatePersistentBuffer(struct TfLiteContext* ctx, + size_t bytes) { + // Align to double word + bytes = ((bytes + 7) / 8) * 8; + persistentBufferPtr -= bytes; + return persistentBufferPtr; +} + +static TfLiteEvalTensor *GetEvalTensor(const struct TfLiteContext *context, + int tensor_idx) { + return (TfLiteEvalTensor*)&tflTensors[tflTensors_subgraph_index[currentSubgraphIndex] + tensor_idx]; +} + +static TfLiteStatus RequestScratchBufferInArena(struct TfLiteContext *context, size_t bytes, + int *buffer_idx) { + *buffer_idx = scratch_buffer_idx++; + return kTfLiteOk; +}; + +static void *GetScratchBuffer(struct TfLiteContext *context, + int buffer_idx) { + return tensor_arena + scratch_buffer_offsets[buffer_idx]; +} + +static TfLiteTensor* mc_AllocateTempInputTensor(const TfLiteNode* node, int index) { + if (node->inputs->data[index] < 0) { + return nullptr; + } + return &ctx.tensors[tflTensors_subgraph_index[currentSubgraphIndex] + node->inputs->data[index]]; +} + +static TfLiteTensor* mc_AllocateTempOutputTensor(const TfLiteNode* node, int index) { + if (node->outputs->data[index] < 0) { + return nullptr; + } + return &ctx.tensors[tflTensors_subgraph_index[currentSubgraphIndex] + node->outputs->data[index]]; +} + +static void mc_DeallocateTempTfLiteTensor(TfLiteTensor* tensor) { +} + +static void* mc_external_context() { + return &xc_config; +} + +static tflite::MicroGraph& mc_graph() { + return micro_graph; +} + +static int mg_NumSubgraphs(){ + return sizeof(tflTensors_subgraph_index)/sizeof(size_t) - 1; +} + +static size_t mg_NumSubgraphInputs(int subgraph_idx){ + return inTensors_subgraph_index[subgraph_idx+1] - inTensors_subgraph_index[subgraph_idx]; +} + +static size_t mg_NumSubgraphOutputs(int subgraph_idx){ + return outTensors_subgraph_index[subgraph_idx+1] - outTensors_subgraph_index[subgraph_idx]; +} + +static TfLiteEvalTensor* mg_GetSubgraphInput(int subgraph_idx, int i){ + return (TfLiteEvalTensor*)&tflTensors[tflTensors_subgraph_index[subgraph_idx] + inTensorIndices[inTensors_subgraph_index[subgraph_idx] + i]]; +} + +static TfLiteEvalTensor* mg_GetSubgraphOutput(int subgraph_idx, int i){ + return (TfLiteEvalTensor*)&tflTensors[tflTensors_subgraph_index[subgraph_idx] + outTensorIndices[outTensors_subgraph_index[subgraph_idx] + i]]; +} + +static TfLiteStatus mg_InvokeSubgraph(int g){ + int prevSubgraphIndex = currentSubgraphIndex; + currentSubgraphIndex = g; +#ifdef TFLMC_PRINT_TENSORS +printf("[\n"); +#endif + + for(size_t i = tflNodes_subgraph_index[g]; i < tflNodes_subgraph_index[g+1]; ++i) { + +#ifdef TFLMC_PRINT_INPUT_TENSORS + // print every input tensor + printf("\nnode in %d", i); + for (int j=0; jsize; j++){ + // -1 such as in case of no bias tensor for conv + if (tflNodes[i].inputs->data[j] != -1) { + printf("\ntensor %d, input %d, %d bytes, checksum %d\n", tflNodes[i].inputs->data[j], j, tflTensors[tflNodes[i].inputs->data[j]].bytes, checksum(tflTensors[tflNodes[i].inputs->data[j]].data.raw, tflTensors[tflNodes[i].inputs->data[j]].bytes)); + for(int k=0; kdata[j]].bytes; k++){ + printf("%d,", (int8_t)tflTensors[tflTensors_subgraph_index[g] + tflNodes[i].inputs->data[j]].data.raw[k]); + } + } + } + printf("\n"); +#endif + +#ifdef TFLMC_XCORE_PROFILE +#ifdef __xcore__ + asm volatile ("gettime %0" : "=r" (time_t0)); +#endif +#endif + + TfLiteStatus status = registrations[used_ops[i]].invoke(&ctx, &tflNodes[i]); + +#ifdef TFLMC_XCORE_PROFILE +#ifdef __xcore__ + asm volatile ("gettime %0" : "=r" (time_t1)); +#endif + op_times[used_ops[i]] += time_t1 - time_t0; + op_counts[used_ops[i]] += 1; + printf("\nnode %-5d %-32s %-12d", i, op_strs[used_ops[i]], time_t1 - time_t0); +#endif + +#ifdef TFLMC_PRINT_TENSORS + // print every output tensor + printf("\n{\"node\" : \"%d\", \"op\" : \"%s\", \"data\" : [", i, op_strs[used_ops[i]]); + for (int j=0; jsize; j++){ + printf("\n{\"tensor\" : %d, \"output\" : %d, \"bytes\" : %d, \"checksum\" : %d,\n", tflNodes[i].outputs->data[j], j, tflTensors[tflNodes[i].outputs->data[j]].bytes, checksum(tflTensors[tflNodes[i].outputs->data[j]].data.raw, tflTensors[tflNodes[i].outputs->data[j]].bytes)); + printf("\"val\" : ["); + for(int k=0; kdata[j]].bytes; k++){ + printf("%d", (int8_t)tflTensors[tflTensors_subgraph_index[g] + tflNodes[i].outputs->data[j]].data.raw[k]); + if (k < tflTensors[tflTensors_subgraph_index[g] + tflNodes[i].outputs->data[j]].bytes-1){ + printf(","); + } + } + if(jsize-1){ + printf("]},\n"); + } else { + printf("]}]\n"); + } + } + + if(i < ((tflNodes_subgraph_index[g+1] - tflNodes_subgraph_index[g]) - 1)){ + printf("},\n"); + } else { + printf("}\n"); + } +#endif + + if (0 && status != kTfLiteOk) { + currentSubgraphIndex = prevSubgraphIndex; + return status; + } + } +#ifdef TFLMC_PRINT_TENSORS +printf("\n]"); +#endif + + currentSubgraphIndex = prevSubgraphIndex; + return kTfLiteOk; +} + +} // namespace + +TfLiteTensor* model_input(int index) { + return &ctx.tensors[inTensorIndices[index]]; +} + +TfLiteTensor* model_output(int index) { + return &ctx.tensors[outTensorIndices[index]]; +} + +#pragma stackfunction 1000 +TfLiteStatus model_init(void *flash_data) { + // Clear and initialize + scratch_buffer_idx = 0; + persistentBufferPtr = tensor_arena + kTensorArenaSize; + + // Set flash data in xcore context config + xc_config.flash_data = flash_data; + // Set thread count specified in the compiler + xc_config.model_thread_count = 5; + // Set thread info + xc_config.thread_info.nstackwords = kStackWordsPerThread; + xc_config.thread_info.stacks = &xcThreadsStack[threadsStackSizeInUint64 - 1]; + + // Setup microcontext functions + mc.AllocateTempInputTensor = &mc_AllocateTempInputTensor; + mc.AllocateTempOutputTensor = &mc_AllocateTempOutputTensor; + mc.DeallocateTempTfLiteTensor = &mc_DeallocateTempTfLiteTensor; + mc.external_context = &mc_external_context; + mc.graph = &mc_graph; + + micro_graph.NumSubgraphs = &mg_NumSubgraphs; + micro_graph.NumSubgraphInputs = &mg_NumSubgraphInputs; + micro_graph.NumSubgraphOutputs = &mg_NumSubgraphOutputs; + micro_graph.GetSubgraphInput = &mg_GetSubgraphInput; + micro_graph.GetSubgraphOutput = &mg_GetSubgraphOutput; + micro_graph.InvokeSubgraph = &mg_InvokeSubgraph; + + // Setup tflitecontext functions + ctx.AllocatePersistentBuffer = &AllocatePersistentBuffer; + ctx.GetEvalTensor = &GetEvalTensor; + ctx.RequestScratchBufferInArena = &RequestScratchBufferInArena; + ctx.GetScratchBuffer = &GetScratchBuffer; + + // Set microcontext as the context ptr + ctx.impl_ = (void*)&mc; + ctx.tensors = tflTensors; + ctx.tensors_size = 181; + registrations[OP_XC_unaryi16] = *(tflite::ops::micro::xcore::Register_XC_unaryi16()); + registrations[OP_XC_binaryi16] = *(tflite::ops::micro::xcore::Register_XC_binaryi16()); + registrations[OP_XC_pad_v2] = *(tflite::ops::micro::xcore::Register_XC_pad_v2()); + registrations[OP_XC_conv2d_v2] = *(tflite::ops::micro::xcore::Register_XC_conv2d_v2()); + registrations[OP_UNPACK] = tflite::Register_UNPACK(); + registrations[OP_SPLIT] = tflite::Register_SPLIT(); + registrations[OP_SPLIT_V] = tflite::Register_SPLIT_V(); + registrations[OP_XC_lookup] = *(tflite::ops::micro::xcore::Register_XC_lookup()); + registrations[OP_PACK] = tflite::Register_PACK(); + registrations[OP_TRANSPOSE] = tflite::Register_TRANSPOSE(); + registrations[OP_CONCATENATION] = tflite::Register_CONCATENATION(); + registrations[OP_XC_slice] = *(tflite::ops::micro::xcore::Register_XC_slice()); + registrations[OP_LOGISTIC] = tflite::Register_LOGISTIC(); + + + // Allocate persistent buffers for variable tensors + for (int i = 0; i < 0; i++) { + tflTensors[varTensors_index[i]].data.data = AllocatePersistentBuffer(&ctx, tflTensors[varTensors_index[i]].bytes); + } + +#ifdef TFLMC_XCORE_PROFILE + printf("\nProfiling init()..."); + memset(op_times, 0, sizeof(op_times)); + op_times_summed = 0; +#endif + + for(size_t g = 0; g < 1; ++g) { + currentSubgraphIndex = g; + for(size_t i = tflNodes_subgraph_index[g]; i < tflNodes_subgraph_index[g+1]; ++i) { + if (registrations[used_ops[i]].init) { + +#ifdef TFLMC_XCORE_PROFILE +#ifdef __xcore__ + asm volatile ("gettime %0" : "=r" (time_t0)); +#endif +#endif + + tflNodes[i].user_data = registrations[used_ops[i]].init(&ctx, (const char*)tflNodes[i].builtin_data, tflNodes[i].custom_initial_data_size); + +#ifdef TFLMC_XCORE_PROFILE +#ifdef __xcore__ + asm volatile ("gettime %0" : "=r" (time_t1)); +#endif + op_times[used_ops[i]] += time_t1 - time_t0; + printf("\nnode %-5d %-32s %-12d", i, op_strs[used_ops[i]], time_t1 - time_t0); +#endif + + } + } + } + currentSubgraphIndex = 0; + +#ifdef TFLMC_XCORE_PROFILE + printf("\n\nCumulative times for init()..."); + for(int i=0; i(tflNodes[i].user_data); + conv_times1 += op_data->threadsStartTime - op_data->evalStartTime; + conv_times2 += op_data->threadsDoneTime - op_data->threadsStartTime; + printf("\nnode %-5d %-25s %-25s %-6d %-6d %-12d", i, op_strs[used_ops[i]], op_data->name, op_data->thread_count, op_data->threadsStartTime - op_data->evalStartTime, op_data->threadsDoneTime - op_data->threadsStartTime); + } + } + } + printf("\nSummed - %-10d %-10d", conv_times1, conv_times2); +#endif + +#ifdef TFLMC_XCORE_PROFILE + printf("\n\nCumulative times for invoke()..."); + for(int i=0; i +extern "C" { +extern int read_sswitch_reg(unsigned tile, unsigned reg, unsigned *data); +extern int write_sswitch_reg(unsigned tile, unsigned reg, unsigned data); +} + +void model_ioserver(chanend_t c) { + unsigned tensor_num = 0; + extern unsigned tile[]; + while(1) { + int cmd = ioserver_command_receive(c, &tensor_num); + switch(cmd) { + case IOSERVER_TENSOR_RECV_INPUT: { + ioserver_tensor_recv_input( + c, (unsigned int *) model_input(tensor_num)->data.u32, + (model_input(tensor_num)->bytes + 3) / sizeof(int)); + break; + } + case IOSERVER_TENSOR_SEND_OUTPUT: { + ioserver_tensor_send_output( + c, (unsigned int*) model_output(tensor_num)->data.u32, + (model_output(tensor_num)->bytes + 3) / sizeof(int)); + break; + } + case IOSERVER_INVOKE: { + model_invoke(); + ioserver_command_acknowledge(c, IOSERVER_ACK); + break; + } + case IOSERVER_RESET: { + model_reset(); + ioserver_command_acknowledge(c, IOSERVER_ACK); + break; + } + case IOSERVER_EXIT: { + ioserver_command_acknowledge(c, IOSERVER_ACK); + unsigned pll_ctrl; + hwtimer_t timer = hwtimer_alloc(); + hwtimer_delay(timer, 100000); + hwtimer_free(timer); + read_sswitch_reg(tile[USB_TILE], XS1_SSWITCH_PLL_CTL_NUM, &pll_ctrl); + write_sswitch_reg(tile[USB_TILE], XS1_SSWITCH_PLL_CTL_NUM, pll_ctrl); + return; + } + default: { + ioserver_command_acknowledge(c, IOSERVER_NACK); + break; + } + } + } +} +#else + +void model_ioserver(void *io_channel) {} + +#endif // __xcore__ + diff --git a/examples/audio_network/src/model_audioi16.tflite.h b/examples/audio_network/src/model_audioi16.tflite.h new file mode 100644 index 000000000..e49aa36c7 --- /dev/null +++ b/examples/audio_network/src/model_audioi16.tflite.h @@ -0,0 +1,86 @@ +// This file is generated. Do not edit. +// Generated on: 05.03.2024 09:04:34 + +#ifndef model_GEN_H +#define model_GEN_H + +#include "tensorflow/lite/c/common.h" + +#ifdef SHARED_TENSOR_ARENA + #ifndef LARGEST_TENSOR_ARENA_SIZE + #define LARGEST_TENSOR_ARENA_SIZE 50608 + #elif LARGEST_TENSOR_ARENA_SIZE < 50608 + #define LARGEST_TENSOR_ARENA_SIZE 50608 + #endif +#endif + +// Sets up the model with init and prepare steps. +TfLiteStatus model_init(void *flash_data); +// Returns the input tensor with the given index. +TfLiteTensor *model_input(int index); +// Returns the output tensor with the given index. +TfLiteTensor *model_output(int index); +// Runs inference for the model. +TfLiteStatus model_invoke(); +// Resets variable tensors in the model. +// This should be called after invoking a model with stateful ops such as LSTM. +TfLiteStatus model_reset(); + +// Returns the number of input tensors. +inline size_t model_inputs() { + return 2; +} +// Returns the number of output tensors. +inline size_t model_outputs() { + return 2; +} + +inline void *model_input_ptr(int index) { + return model_input(index)->data.data; +} +inline size_t model_input_size(int index) { + return model_input(index)->bytes; +} +inline int model_input_dims_len(int index) { + return model_input(index)->dims->data[0]; +} +inline int *model_input_dims(int index) { + return &model_input(index)->dims->data[1]; +} + +inline void *model_output_ptr(int index) { + return model_output(index)->data.data; +} +inline size_t model_output_size(int index) { + return model_output(index)->bytes; +} +inline int model_output_dims_len(int index) { + return model_output(index)->dims->data[0]; +} +inline int *model_output_dims(int index) { + return &model_output(index)->dims->data[1]; +} +// Only returns valid value if input is quantized +inline int32_t model_input_zeropoint(int index) { + return model_input(index)->params.zero_point; +} +// Only returns valid value if input is quantized +inline float model_input_scale(int index) { + return model_input(index)->params.scale; +} +// Only returns valid value if output is quantized +inline int32_t model_output_zeropoint(int index) { + return model_output(index)->params.zero_point; +} +// Only returns valid value if output is quantized +inline float model_output_scale(int index) { + return model_output(index)->params.scale; +} + +// Sets up the model part of ioserver to communicate +// with this model from host. +// Requires that ioserver() has been setup and running. +// This is an infinite loop and does not exit. +TfLiteStatus model_ioserver(unsigned io_channel); + +#endif diff --git a/examples/audio_network/src/raised_cosine.h b/examples/audio_network/src/raised_cosine.h new file mode 100644 index 000000000..64bcd9653 --- /dev/null +++ b/examples/audio_network/src/raised_cosine.h @@ -0,0 +1,560 @@ +int raised_cosine_512[512] = { + 0, + 40425, + 161695, + 363792, + 646685, + 1010330, + 1454675, + 1979651, + 2585180, + 3271171, + 4037519, + 4884110, + 5810817, + 6817499, + 7904006, + 9070172, + 10315824, + 11640773, + 13044820, + 14527753, + 16089348, + 17729372, + 19447577, + 21243703, + 23117481, + 25068629, + 27096852, + 29201845, + 31383291, + 33640862, + 35974217, + 38383006, + 40866865, + 43425420, + 46058287, + 48765068, + 51545356, + 54398732, + 57324767, + 60323019, + 63393038, + 66534362, + 69746516, + 73029017, + 76381371, + 79803073, + 83293608, + 86852450, + 90479063, + 94172901, + 97933408, + 101760017, + 105652152, + 109609227, + 113630646, + 117715804, + 121864085, + 126074864, + 130347508, + 134681373, + 139075806, + 143530145, + 148043720, + 152615851, + 157245850, + 161933018, + 166676651, + 171476034, + 176330443, + 181239149, + 186201412, + 191216484, + 196283611, + 201402029, + 206570967, + 211789647, + 217057283, + 222373082, + 227736243, + 233145959, + 238601414, + 244101788, + 249646252, + 255233971, + 260864103, + 266535801, + 272248210, + 278000471, + 283791716, + 289621074, + 295487667, + 301390612, + 307329019, + 313301994, + 319308638, + 325348046, + 331419309, + 337521511, + 343653736, + 349815057, + 356004549, + 362221279, + 368464310, + 374732703, + 381025513, + 387341792, + 393680591, + 400040953, + 406421921, + 412822535, + 419241829, + 425678839, + 432132593, + 438602120, + 445086447, + 451584596, + 458095588, + 464618444, + 471152181, + 477695815, + 484248360, + 490808831, + 497376238, + 503949592, + 510527905, + 517110185, + 523695440, + 530282680, + 536870912, + 543459144, + 550046384, + 556631639, + 563213919, + 569792232, + 576365586, + 582932993, + 589493464, + 596046009, + 602589643, + 609123380, + 615646236, + 622157228, + 628655377, + 635139704, + 641609231, + 648062985, + 654499995, + 660919289, + 667319903, + 673700871, + 680061233, + 686400032, + 692716311, + 699009121, + 705277514, + 711520545, + 717737275, + 723926767, + 730088088, + 736220313, + 742322515, + 748393778, + 754433186, + 760439830, + 766412805, + 772351212, + 778254157, + 784120750, + 789950108, + 795741353, + 801493614, + 807206023, + 812877721, + 818507853, + 824095572, + 829640036, + 835140410, + 840595865, + 846005581, + 851368742, + 856684541, + 861952177, + 867170857, + 872339795, + 877458213, + 882525340, + 887540412, + 892502675, + 897411381, + 902265790, + 907065173, + 911808806, + 916495974, + 921125973, + 925698104, + 930211679, + 934666018, + 939060451, + 943394316, + 947666960, + 951877739, + 956026020, + 960111178, + 964132597, + 968089672, + 971981807, + 975808416, + 979568923, + 983262761, + 986889374, + 990448216, + 993938751, + 997360453, + 1000712807, + 1003995308, + 1007207462, + 1010348786, + 1013418805, + 1016417057, + 1019343092, + 1022196468, + 1024976756, + 1027683537, + 1030316404, + 1032874959, + 1035358818, + 1037767607, + 1040100962, + 1042358533, + 1044539979, + 1046644972, + 1048673195, + 1050624343, + 1052498121, + 1054294247, + 1056012452, + 1057652476, + 1059214071, + 1060697004, + 1062101051, + 1063426000, + 1064671652, + 1065837818, + 1066924325, + 1067931007, + 1068857714, + 1069704305, + 1070470653, + 1071156644, + 1071762173, + 1072287149, + 1072731494, + 1073095139, + 1073378032, + 1073580129, + 1073701399, + 1073741824, + 1073701399, + 1073580129, + 1073378032, + 1073095139, + 1072731494, + 1072287149, + 1071762173, + 1071156644, + 1070470653, + 1069704305, + 1068857714, + 1067931007, + 1066924325, + 1065837818, + 1064671652, + 1063426000, + 1062101051, + 1060697004, + 1059214071, + 1057652476, + 1056012452, + 1054294247, + 1052498121, + 1050624343, + 1048673195, + 1046644972, + 1044539979, + 1042358533, + 1040100962, + 1037767607, + 1035358818, + 1032874959, + 1030316404, + 1027683537, + 1024976756, + 1022196468, + 1019343092, + 1016417057, + 1013418805, + 1010348785, + 1007207462, + 1003995308, + 1000712807, + 997360453, + 993938751, + 990448216, + 986889374, + 983262761, + 979568923, + 975808416, + 971981807, + 968089672, + 964132597, + 960111178, + 956026020, + 951877739, + 947666960, + 943394316, + 939060451, + 934666018, + 930211679, + 925698104, + 921125973, + 916495974, + 911808806, + 907065173, + 902265790, + 897411381, + 892502675, + 887540412, + 882525340, + 877458213, + 872339795, + 867170857, + 861952177, + 856684541, + 851368742, + 846005581, + 840595865, + 835140410, + 829640036, + 824095572, + 818507853, + 812877721, + 807206023, + 801493614, + 795741353, + 789950108, + 784120750, + 778254157, + 772351212, + 766412805, + 760439830, + 754433186, + 748393778, + 742322515, + 736220313, + 730088088, + 723926767, + 717737275, + 711520545, + 705277514, + 699009121, + 692716311, + 686400032, + 680061233, + 673700871, + 667319903, + 660919289, + 654499995, + 648062985, + 641609231, + 635139704, + 628655377, + 622157228, + 615646236, + 609123380, + 602589643, + 596046009, + 589493464, + 582932993, + 576365586, + 569792232, + 563213919, + 556631639, + 550046384, + 543459144, + 536870912, + 530282680, + 523695440, + 517110185, + 510527905, + 503949592, + 497376238, + 490808831, + 484248360, + 477695815, + 471152181, + 464618444, + 458095588, + 451584596, + 445086447, + 438602120, + 432132593, + 425678839, + 419241829, + 412822535, + 406421921, + 400040953, + 393680591, + 387341792, + 381025513, + 374732703, + 368464310, + 362221279, + 356004549, + 349815057, + 343653736, + 337521511, + 331419309, + 325348046, + 319308638, + 313301994, + 307329019, + 301390612, + 295487667, + 289621074, + 283791716, + 278000471, + 272248210, + 266535801, + 260864103, + 255233971, + 249646252, + 244101788, + 238601414, + 233145959, + 227736243, + 222373082, + 217057283, + 211789647, + 206570967, + 201402029, + 196283611, + 191216484, + 186201412, + 181239149, + 176330443, + 171476034, + 166676651, + 161933018, + 157245849, + 152615851, + 148043720, + 143530145, + 139075806, + 134681373, + 130347508, + 126074864, + 121864085, + 117715804, + 113630646, + 109609227, + 105652152, + 101760017, + 97933408, + 94172901, + 90479063, + 86852450, + 83293608, + 79803073, + 76381371, + 73029017, + 69746516, + 66534362, + 63393038, + 60323019, + 57324767, + 54398732, + 51545356, + 48765068, + 46058287, + 43425420, + 40866865, + 38383006, + 35974217, + 33640862, + 31383291, + 29201845, + 27096852, + 25068629, + 23117481, + 21243703, + 19447577, + 17729372, + 16089348, + 14527753, + 13044820, + 11640773, + 10315824, + 9070172, + 7904006, + 6817499, + 5810817, + 4884110, + 4037519, + 3271171, + 2585180, + 1979651, + 1454675, + 1010330, + 646685, + 363792, + 161695, + 40425, +}; + +int raised_cosine_8[8] = { + 0, + 157245850, + 536870912, + 916495974, + 1073741824, + 916495974, + 536870912, + 157245849, +}; + +int raised_cosine_32[32] = { + 0, + 10315824, + 40866865, + 90479063, + 157245850, + 238601414, + 331419309, + 432132593, + 536870912, + 641609231, + 742322515, + 835140410, + 916495974, + 983262761, + 1032874959, + 1063426000, + 1073741824, + 1063426000, + 1032874959, + 983262761, + 916495974, + 835140410, + 742322515, + 641609231, + 536870912, + 432132593, + 331419309, + 238601414, + 157245849, + 90479063, + 40866865, + 10315824 +}; diff --git a/examples/audio_network/src/support.cpp b/examples/audio_network/src/support.cpp new file mode 100644 index 000000000..e09a22ff2 --- /dev/null +++ b/examples/audio_network/src/support.cpp @@ -0,0 +1,175 @@ +#include +#include +#include +#include + +#include "model_audioi16.tflite.h" + +#define MEL_BINS 64 +#define MEL_Q_VALUE 30 +#define MEL_ONE_VALUE (1 << MEL_Q_VALUE) + +extern "C" { + +#define LOOKUP_TYPICAL 0 +#define LOOKUP_HARSH 1 +#define LOOKUP_PASSTHROUGH 2 +#define LOOKUP_MEDIUM 3 + // Buttons pressed, 0000 is all, 1111 is none + int32_t button_lookup[8] = { + LOOKUP_TYPICAL, // 0000 + LOOKUP_TYPICAL, // 0001 + LOOKUP_TYPICAL, // 0010 + LOOKUP_HARSH, // 0011 + LOOKUP_TYPICAL, // 0100 + LOOKUP_MEDIUM, // 0101 + LOOKUP_PASSTHROUGH, // 0110 + LOOKUP_TYPICAL, // 0111 + }; + + int32_t output_lookup[4][256] = { + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, + 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 52, + 53, 54, 55, 56, 58, 59, 60, 61, 63, 64, 65, 66, 68, 69, 70, 71, + 73, 74, 75, 77, 78, 79, 81, 82, 83, 84, 86, 87, 88, 90, 91, 93, + 94, 95, 97, 98, 99,101,102,104,105,106,108,109,111,112,114,115, + 116,118,119,121,122,124,125,127,128,130,131,133,134,136,137,139, + 141,142,144,145,147,148,150,151,153,155,156,158,160,161,163,164, + 166,168,169,171,173,174,176,178,179,181,183,185,186,188,190,192, + 193,195,197,199,200,202,204,206,208,209,211,213,215,217,219,220, + 222,224,226,228,230,232,234,236,237,239,241,243,245,247,249,251, + 253,255,257,259,261,263,265,267,269,271,273,275,278,280,282,284, + 286,288,290,292,294,297,299,301,303,305,308,310,312,314,316,319, + 321,323,325,328,330,332,335,337,339,342,344,346,349,351,353,356, + 358,361,363,365,368,370,373,375,378,380,383,385,388,390,393,395, + 398,400,403,405,408,411,413,416,418,421,424,426,429,432,434,437, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, + 5, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, + 11, 11, 12, 12, 13, 14, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20, + 21, 21, 22, 23, 24, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, + 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 52, + 53, 54, 56, 57, 58, 60, 61, 63, 64, 66, 67, 69, 71, 72, 74, 75, + 77, 79, 81, 82, 84, 86, 88, 90, 92, 93, 95, 97, 99,101,104,106, + 108,110,112,114,117,119,121,123,126,128,131,133,136,138,141,143, + 146,149,151,154,157,160,162,165,168,171,174,177,180,183,187,190, + 193,196,200,203,206,210,213,217,220,224,227,231,235,239,242,246, + 250,254,258,262,266,271,275,279,283,288,292,296,301,305,310,315, + 319,324,329,334,339,344,349,354,359,364,369,375,380,386,391,397, + 402,408,414,419,425,431,437,443,449,456,462,468,475,481,488,494, + 501,508,515,521,528,535,543,550,557,564,572,579,587,594,602,610, + 618,626,634,642,650,659,667,675,684,693,701,710,719,728,737,747, + }, + { + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + }, + { + 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, + 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 12, + 12, 13, 14, 14, 15, 16, 16, 17, 18, 19, 19, 20, 21, 22, 22, 23, + 24, 25, 26, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53, 54, 56, + 57, 58, 59, 61, 62, 63, 65, 66, 67, 69, 70, 71, 73, 74, 76, 77, + 79, 80, 82, 83, 85, 86, 88, 89, 91, 92, 94, 96, 97, 99,101,102, + 104,106,108,109,111,113,115,117,118,120,122,124,126,128,130,132, + 134,136,138,140,142,144,146,148,150,152,155,157,159,161,163,166, + 168,170,173,175,177,180,182,184,187,189,192,194,197,199,202,205, + 207,210,212,215,218,220,223,226,229,231,234,237,240,243,246,249, + 252,255,258,261,264,267,270,273,276,279,283,286,289,292,296,299, + 302,306,309,312,316,319,323,326,330,333,337,341,344,348,352,356, + 359,363,367,371,375,379,383,386,390,395,399,403,407,411,415,419, + 424,428,432,436,441,445,450,454,459,463,468,472,477,482,486,491, + 496,501,505,510,515,520,525,530,535,540,545,550,556,561,566,571, + } + }; + float state[64] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, + 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, + 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, + 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, + 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, + 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, + 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, + 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; + + int cnt = 0; + int skip = 10000; + int inputs_saved[16][64]; + int outputs_saved[16][64]; + +// TODO: replace all FLOAT with int16_t + +void nn_predict_masks(int *masks, int button_state, float *mels) { + model_init(NULL); + float *inputs = (float *)model_input_ptr(0); + float *state_inputs = (float *)model_input_ptr(1); + float *state_outputs = (float *)model_output_ptr(0); + float *outputs = (float *)model_output_ptr(1); + memcpy(state_inputs, state, sizeof(state)); + for(int i = 0; i < MEL_BINS; i++) { + inputs[i] = mels[i]; + } +#if 0 + if (skip == 0) { + for(int i = 0; i < MEL_BINS; i++) { + inputs_saved[cnt][i] = inputs[i]; + } + } +#endif + model_invoke(); + int table = button_lookup[button_state & 0x7]; + for(int i = 0; i < MEL_BINS; i++) { + int converted_output = outputs[i] * 255.0; + masks[i] = output_lookup[table][converted_output] << (MEL_Q_VALUE-8); + } +#if 0 + if (skip == 0) { + for(int i = 0; i < MEL_BINS; i++) { + outputs_saved[cnt][i] = outputs[i]; + } + cnt++; + if (cnt == 16) { + for(int i = 0; i < MEL_BINS; i++) { + for(int c = 0; c < cnt; c++) { + printint(inputs_saved[c][i]); + printchar(' '); + } + printchar('\n'); + } + printstr("outputs\n"); + for(int i = 0; i < MEL_BINS; i++) { + for(int c = 0; c < cnt; c++) { + printint(outputs_saved[c][i]); + printchar(' '); + } + printchar('\n'); + } + _exit(0); + } + } else { + skip--; + } +#endif + memcpy(state, state_outputs, sizeof(state)); +} + +}; diff --git a/examples/models/MNIST/mnist_CNN_1-32-P-10/mnist_CNN_1-32-P-10.ipynb b/examples/models/MNIST/mnist_CNN_1-32-P-10/mnist_CNN_1-32-P-10.ipynb index 8fb84fcc8..073121194 100644 --- a/examples/models/MNIST/mnist_CNN_1-32-P-10/mnist_CNN_1-32-P-10.ipynb +++ b/examples/models/MNIST/mnist_CNN_1-32-P-10/mnist_CNN_1-32-P-10.ipynb @@ -17,10 +17,11 @@ "\n", "# WARNING: Training on GPU is currently non-deterministic!\n", "# Uncomment to train on CPU.\n", - "#os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"-1\" \n", + "# os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"-1\"\n", "\n", "import warnings\n", - "warnings.filterwarnings(action='ignore')\n", + "\n", + "warnings.filterwarnings(action=\"ignore\")\n", "import tensorflow as tf\n", "from tensorflow import keras" ] @@ -33,7 +34,10 @@ "source": [ "# random seed setter to make training reproducible\n", "import random\n", + "\n", "SEED = 123\n", + "\n", + "\n", "def set_all_seeds(seed=SEED):\n", " tf.random.set_seed(seed)\n", " np.random.seed(seed)\n", @@ -49,6 +53,7 @@ "# enable training in notebook\n", "from tensorflow.compat.v1 import ConfigProto\n", "from tensorflow.compat.v1 import InteractiveSession\n", + "\n", "config = ConfigProto()\n", "config.gpu_options.allow_growth = True\n", "session = InteractiveSession(config=config)" @@ -77,7 +82,10 @@ "metadata": {}, "outputs": [], "source": [ - "(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()\n", + "(train_images, train_labels), (\n", + " test_images,\n", + " test_labels,\n", + ") = tf.keras.datasets.mnist.load_data()\n", "\n", "train_images = np.expand_dims(train_images, axis=-1)\n", "train_labels = np.expand_dims(train_labels, axis=-1)\n", @@ -85,7 +93,7 @@ "test_labels = np.expand_dims(test_labels, axis=-1)\n", "\n", "scale = tf.constant(255, dtype=tf.dtypes.float32)\n", - "x_train, x_test = train_images/scale - .5, test_images/scale - .5\n", + "x_train, x_test = train_images / scale - 0.5, test_images / scale - 0.5\n", "y_train, y_test = train_labels, test_labels" ] }, @@ -99,33 +107,34 @@ "\n", "set_all_seeds()\n", "datagen = ImageDataGenerator(\n", - " featurewise_center=False, # set input mean to 0 over the dataset\n", - " samplewise_center=False, # set each sample mean to 0\n", - " featurewise_std_normalization=False, # divide inputs by std of the dataset\n", - " samplewise_std_normalization=False, # divide each input by its std\n", - " zca_whitening=False, # apply ZCA whitening\n", - " zca_epsilon=1e-06, # epsilon for ZCA whitening\n", - " rotation_range=0, # randomly rotate images in the range (degrees, 0 to 180)\n", - " # randomly shift images horizontally (fraction of total width)\n", - " width_shift_range=0.1,\n", - " # randomly shift images vertically (fraction of total height)\n", - " height_shift_range=0.1,\n", - " shear_range=0., # set range for random shear\n", - " zoom_range=0., # set range for random zoom\n", - " channel_shift_range=0., # set range for random channel shifts\n", - " # set mode for filling points outside the input boundaries\n", - " fill_mode='nearest',\n", - " cval=0., # value used for fill_mode = \"constant\"\n", - " horizontal_flip=True, # randomly flip images\n", - " vertical_flip=False, # randomly flip images\n", - " # set rescaling factor (applied before any other transformation)\n", - " rescale=None,\n", - " # set function that will be applied on each input\n", - " preprocessing_function=None,\n", - " # image data format, either \"channels_first\" or \"channels_last\"\n", - " data_format=None,\n", - " # fraction of images reserved for validation (strictly between 0 and 1)\n", - " validation_split=0.0)\n", + " featurewise_center=False, # set input mean to 0 over the dataset\n", + " samplewise_center=False, # set each sample mean to 0\n", + " featurewise_std_normalization=False, # divide inputs by std of the dataset\n", + " samplewise_std_normalization=False, # divide each input by its std\n", + " zca_whitening=False, # apply ZCA whitening\n", + " zca_epsilon=1e-06, # epsilon for ZCA whitening\n", + " rotation_range=0, # randomly rotate images in the range (degrees, 0 to 180)\n", + " # randomly shift images horizontally (fraction of total width)\n", + " width_shift_range=0.1,\n", + " # randomly shift images vertically (fraction of total height)\n", + " height_shift_range=0.1,\n", + " shear_range=0.0, # set range for random shear\n", + " zoom_range=0.0, # set range for random zoom\n", + " channel_shift_range=0.0, # set range for random channel shifts\n", + " # set mode for filling points outside the input boundaries\n", + " fill_mode=\"nearest\",\n", + " cval=0.0, # value used for fill_mode = \"constant\"\n", + " horizontal_flip=True, # randomly flip images\n", + " vertical_flip=False, # randomly flip images\n", + " # set rescaling factor (applied before any other transformation)\n", + " rescale=None,\n", + " # set function that will be applied on each input\n", + " preprocessing_function=None,\n", + " # image data format, either \"channels_first\" or \"channels_last\"\n", + " data_format=None,\n", + " # fraction of images reserved for validation (strictly between 0 and 1)\n", + " validation_split=0.0,\n", + ")\n", "datagen.fit(x_train)" ] }, @@ -142,22 +151,33 @@ "metadata": {}, "outputs": [], "source": [ - "from tensorflow.keras.layers import Conv2D, Dense, MaxPool2D, Flatten, Input, BatchNormalization, ReLU\n", + "from tensorflow.keras.layers import (\n", + " Conv2D,\n", + " Dense,\n", + " MaxPool2D,\n", + " Flatten,\n", + " Input,\n", + " BatchNormalization,\n", + " ReLU,\n", + ")\n", "\n", "# single dense layer, i.e. multiple logistic regression\n", - "model = keras.Sequential([ \n", - " Conv2D(filters=32, kernel_size=5, padding='same', input_shape=(28, 28, 1)),\n", - " BatchNormalization(),\n", - " ReLU(),\n", - " MaxPool2D(pool_size=2, strides=2),\n", - "\n", - " Flatten(),\n", - " Dense(10, activation='softmax')\n", - "])\n", + "model = keras.Sequential(\n", + " [\n", + " Conv2D(filters=32, kernel_size=5, padding=\"same\", input_shape=(28, 28, 1)),\n", + " BatchNormalization(),\n", + " ReLU(),\n", + " MaxPool2D(pool_size=2, strides=2),\n", + " Flatten(),\n", + " Dense(10, activation=\"softmax\"),\n", + " ]\n", + ")\n", "\n", - "training_params = {'optimizer': 'adam',\n", - " 'loss': 'sparse_categorical_crossentropy',\n", - " 'metrics': ['accuracy']}\n", + "training_params = {\n", + " \"optimizer\": \"adam\",\n", + " \"loss\": \"sparse_categorical_crossentropy\",\n", + " \"metrics\": [\"accuracy\"],\n", + "}\n", "\n", "set_all_seeds()\n", "model.compile(**training_params)\n", @@ -177,23 +197,31 @@ "\n", "# run the training\n", "if USE_TENSORBOARD:\n", - " log_dir=\"logs/\" + datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\") \n", - " tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=0)\n", + " log_dir = \"logs/\" + datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n", + " tensorboard_callback = tf.keras.callbacks.TensorBoard(\n", + " log_dir=log_dir, histogram_freq=0\n", + " )\n", "\n", " set_all_seeds()\n", - " model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size),\n", - " epochs=1,\n", - " validation_data=(x_test, y_test),\n", - " callbacks=[tensorboard_callback])\n", - " model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size),\n", - " epochs=epochs-1,\n", - " validation_data=(x_test, y_test),\n", - " callbacks=[tensorboard_callback])\n", + " model.fit_generator(\n", + " datagen.flow(x_train, y_train, batch_size=batch_size),\n", + " epochs=1,\n", + " validation_data=(x_test, y_test),\n", + " callbacks=[tensorboard_callback],\n", + " )\n", + " model.fit_generator(\n", + " datagen.flow(x_train, y_train, batch_size=batch_size),\n", + " epochs=epochs - 1,\n", + " validation_data=(x_test, y_test),\n", + " callbacks=[tensorboard_callback],\n", + " )\n", "else:\n", " set_all_seeds()\n", - " model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size),\n", - " epochs=epochs,\n", - " validation_data=(x_test, y_test))" + " model.fit_generator(\n", + " datagen.flow(x_train, y_train, batch_size=batch_size),\n", + " epochs=epochs,\n", + " validation_data=(x_test, y_test),\n", + " )" ] }, { @@ -212,7 +240,7 @@ "models_dir = pathlib.Path(\"./models/\")\n", "models_dir.mkdir(exist_ok=True, parents=True)\n", "\n", - "model.save(models_dir/\"model.h5\")" + "model.save(models_dir / \"model.h5\")" ] }, { @@ -229,7 +257,7 @@ "outputs": [], "source": [ "# load keras model from disk for reproducibility\n", - "model = keras.models.load_model(models_dir/\"model.h5\")" + "model = keras.models.load_model(models_dir / \"model.h5\")" ] }, { @@ -255,9 +283,9 @@ "metadata": {}, "outputs": [], "source": [ - "model_float_file = models_dir/\"model_float.tflite\"\n", + "model_float_file = models_dir / \"model_float.tflite\"\n", "size_float = model_float_file.write_bytes(model_float_lite)\n", - "print('Float model size: {:.0f} KB'.format(size_float/1024))" + "print(\"Float model size: {:.0f} KB\".format(size_float / 1024))" ] }, { @@ -276,13 +304,17 @@ "converter = tf.lite.TFLiteConverter.from_keras_model(model)\n", "\n", "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", - "#converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] # this doesn't seem to do anything\n", + "# converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] # this doesn't seem to do anything\n", "\n", "# representative dataset to estimate activation distributions\n", "x_train_ds = tf.data.Dataset.from_tensor_slices((x_train)).batch(1)\n", + "\n", + "\n", "def representative_data_gen():\n", " for input_value in x_train_ds.take(100):\n", " yield [input_value]\n", + "\n", + "\n", "converter.representative_dataset = representative_data_gen\n", "\n", "model_quant_lite = converter.convert()" @@ -294,9 +326,9 @@ "metadata": {}, "outputs": [], "source": [ - "model_quant_file = models_dir/\"model_quant.tflite\"\n", + "model_quant_file = models_dir / \"model_quant.tflite\"\n", "size_quant = model_quant_file.write_bytes(model_quant_lite)\n", - "print('Quantized model size: {:.0f} KB'.format(size_quant/1024))" + "print(\"Quantized model size: {:.0f} KB\".format(size_quant / 1024))" ] }, { @@ -326,25 +358,32 @@ "source": [ "import sys\n", "\n", + "\n", "def eval_float(j, img):\n", " img = tf.expand_dims(img, 0)\n", " interpreter_float.set_tensor(interpreter_float.get_input_details()[0][\"index\"], img)\n", " interpreter_float.invoke()\n", - " probability = interpreter_float.get_tensor(interpreter_float.get_output_details()[0][\"index\"])\n", + " probability = interpreter_float.get_tensor(\n", + " interpreter_float.get_output_details()[0][\"index\"]\n", + " )\n", " return np.argmax(probability)\n", "\n", + "\n", "def eval_quant(j, img):\n", - " if (j+1) % 10 == 0:\n", - " print('quant: {:6d}/10000'.format(j+1), end='\\r')\n", + " if (j + 1) % 10 == 0:\n", + " print(\"quant: {:6d}/10000\".format(j + 1), end=\"\\r\")\n", " sys.stdout.flush()\n", " img = tf.expand_dims(img, 0)\n", " interpreter_quant.set_tensor(interpreter_quant.get_input_details()[0][\"index\"], img)\n", " interpreter_quant.invoke()\n", - " probability = interpreter_quant.get_tensor(interpreter_quant.get_output_details()[0][\"index\"])\n", + " probability = interpreter_quant.get_tensor(\n", + " interpreter_quant.get_output_details()[0][\"index\"]\n", + " )\n", " return np.argmax(probability)\n", "\n", - "predictions_float = np.NaN*np.zeros((y_test.shape[0],))\n", - "predictions_quant = np.NaN*np.zeros((y_test.shape[0],))\n", + "\n", + "predictions_float = np.NaN * np.zeros((y_test.shape[0],))\n", + "predictions_quant = np.NaN * np.zeros((y_test.shape[0],))\n", "\n", "for j, img in enumerate(x_test):\n", " predictions_float[j] = eval_float(j, img)\n", @@ -360,9 +399,17 @@ "outputs": [], "source": [ "acc = tf.metrics.Accuracy()\n", - "print('Accuracy of models:')\n", - "print('# Float TFLite model: {:.2%}'.format(acc(test_labels, predictions_float).numpy()))\n", - "print('# Quantized TFLite model: {:.2%}'.format(acc(test_labels, predictions_quant).numpy()))" + "print(\"Accuracy of models:\")\n", + "print(\n", + " \"# Float TFLite model: {:.2%}\".format(\n", + " acc(test_labels, predictions_float).numpy()\n", + " )\n", + ")\n", + "print(\n", + " \"# Quantized TFLite model: {:.2%}\".format(\n", + " acc(test_labels, predictions_quant).numpy()\n", + " )\n", + ")" ] }, { @@ -379,9 +426,14 @@ "outputs": [], "source": [ "from tflite_utils import load_tflite_as_json, save_json_as_tflite\n", - "from tflite2xcore_utils import clean_unused_opcodes, clean_unused_tensors, clean_unused_buffers\n", + "from tflite2xcore_utils import (\n", + " clean_unused_opcodes,\n", + " clean_unused_tensors,\n", + " clean_unused_buffers,\n", + ")\n", "from tflite2xcore_graph_conv import remove_float_inputs_outputs\n", - "model_quant_stripped_file = 'models/model_quant_stripped.tflite'\n", + "\n", + "model_quant_stripped_file = \"models/model_quant_stripped.tflite\"\n", "\n", "json_model = load_tflite_as_json(model_quant_file)\n", "remove_float_inputs_outputs(json_model)\n", diff --git a/experimental/README.md b/experimental/README.md deleted file mode 100644 index c0715ef37..000000000 --- a/experimental/README.md +++ /dev/null @@ -1,13 +0,0 @@ -DISCLAIMER --- - -This is the experimental folder. Nothing in here is expected to work, and playing with it may even -mess up things that you previously thought were working. You are welcome to try out projects in this -area, but you do so at your own risk. - - -Contents --- - -* xformer - a TFLite to XCore MLIR based optimizer - diff --git a/experimental/xformer/.bazelrc b/experimental/xformer/.bazelrc deleted file mode 100644 index 5e75c99a9..000000000 --- a/experimental/xformer/.bazelrc +++ /dev/null @@ -1,59 +0,0 @@ -# Clang 9 is required. -#build --client_env=CC=clang - -# Disable warnings we don't care about. -#build --copt=-Wno-unused-local-typedef - -# C++14 standard version is required. -build --cxxopt=-std=c++14 --host_cxxopt=-std=c++14 - -# Necessary linker options. -#build --linkopt=-pthread -#build --linkopt=-ldl -#build --linkopt=-lm -#build --host_linkopt=-pthread -#build --host_linkopt=-ldl -#build --host_linkopt=-lm - -build --experimental_repo_remote_exec -build --nocheck_visibility - -build:darwin_config --linkopt=-framework -build:darwin_config --linkopt=Foundation -build:darwin_config --linkopt=-framework -build:darwin_config --linkopt=SystemConfiguration -#build:linux_config --linkopt=-lm -#build:linux_config --linkopt=-lrt - -# Address sanitizer -# CC=clang bazel build --config asan -build:asan --strip=never -build:asan --copt -Wno-macro-redefined -build:asan --copt -fsanitize=address -build:asan --copt -DADDRESS_SANITIZER -build:asan --copt -g -build:asan --copt -O1 -build:asan --copt -fno-omit-frame-pointer -build:asan --copt -fno-sanitize-recover=all -build:asan --copt -gmlt -build:asan --linkopt -fsanitize=address - -# BAZEL DEBUG BUILD NOTES -# Creating a debug build for Tensorflow is extremely taxing. Enabling debug for all of Tensorflow makes the build and link process take 3-4 hours. It finally doesn't work as the library is too large to be loaded. -# As a solution to this problem, the bazel option --per_file_copt is awesome as it allows just the files within a particular package to be built with different flags. -# This is used in the below command to create a Tensorflow build which includes only debug symbols for Tensorflow Lite. Tensorflow also requires bazel version 3.7.2, so this is used locally just for the Tensorflow build. -# In the following command, we build the target "build_pip_package". This builds all(most) of Tensorflow and creates a Python whl package which we can "pip install". This can then be used to debug the TFLite interpreter when we are invoking it via the Tensorflow Python API, such as in xformer1. -# bazel build -c opt --strip="never" --per_file_copt="//tensorflow/lite/.*\.cc@-g,-O0" //tensorflow/tools/pip_package:build_pip_package - -# Use the following command to create a debug build for xformer2 -# bazel build -c dbg --spawn_strategy=local --javacopt="-g" --copt="-g" --strip="never" //:xcore-opt - -# Use our custom-configured c++ toolchain. -#build:linux_config --crosstool_top=//toolchain:gnu_suite - -# Use --cpu as a differentiator. -#build:linux_config --cpu=k8 - -# Use the default Bazel C++ toolchain to build the tools used during the -# build. -#build:linux_config --host_crosstool_top=//toolchain:gnu_suite diff --git a/experimental/xformer/.bazelversion b/experimental/xformer/.bazelversion deleted file mode 100644 index ee74734aa..000000000 --- a/experimental/xformer/.bazelversion +++ /dev/null @@ -1 +0,0 @@ -4.1.0 diff --git a/experimental/xformer/BUILD b/experimental/xformer/BUILD deleted file mode 100644 index c268f3d53..000000000 --- a/experimental/xformer/BUILD +++ /dev/null @@ -1,160 +0,0 @@ -load("@org_tensorflow//third_party/mlir:tblgen.bzl", "gentbl") - -package( - default_visibility = ["//visibility:public"], -) - -gentbl( - name = "xc_ops_inc_gen", - tbl_outs = [ - ("-gen-enum-decls", "IR/XCoreEnumOps.h.inc"), - ("-gen-enum-defs", "IR/XCoreEnumOps.cpp.inc"), - ("-gen-op-decls", "IR/XCoreOps.h.inc"), - ("-gen-op-defs", "IR/XCoreOps.cpp.inc"), - ("-gen-dialect-decls -dialect=xc", "IR/XCoreDialect.h.inc"), - ("-gen-dialect-doc", "IR/XCoreOps.md"), - ], - tblgen = "@llvm-project//mlir:mlir-tblgen", - td_file = "IR/XCoreOps.td", - td_includes = ["external/org_tensorflow"], - td_srcs = [ - "@llvm-project//mlir:StdOpsTdFiles", - "@org_tensorflow//tensorflow/compiler/mlir/tensorflow:tensorflow_ops_td_files", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_ops_td_files", - ], -) - -gentbl( - name = "xc_patterns_inc_gen", - tbl_outs = [ - ("-gen-rewriters", "Transforms/GeneratedXCPatterns.inc"), - ], - tblgen = "@llvm-project//mlir:mlir-tblgen", - td_file = "Transforms/XCPatterns.td", - td_includes = ["external/org_tensorflow", "external/lce"], - td_srcs = [ - "IR/XCoreOps.td", - "@lce//larq_compute_engine/mlir:lce_ops_td_file", - "@llvm-project//mlir:StdOpsTdFiles", - "@org_tensorflow//tensorflow/compiler/mlir/tensorflow:tensorflow_ops_td_files", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_ops_td_files", - ], -) - -gentbl( - name = "tfl_patterns_inc_gen", - tbl_outs = [ - ("-gen-rewriters", "Transforms/GeneratedTFLPatterns.inc"), - ], - tblgen = "@llvm-project//mlir:mlir-tblgen", - td_file = "Transforms/TFLPatterns.td", - td_includes = ["external/org_tensorflow", "external/lce"], - td_srcs = [ - "@lce//larq_compute_engine/mlir:lce_ops_td_file", - "@llvm-project//mlir:StdOpsTdFiles", - "@org_tensorflow//tensorflow/compiler/mlir/tensorflow:tensorflow_ops_td_files", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_ops_td_files", - ], -) - -gentbl( - name = "load_constant_op_patterns_inc_gen", - tbl_outs = [ - ("-gen-rewriters", "Transforms/GeneratedLoadConstantOpPatterns.inc"), - ], - tblgen = "@llvm-project//mlir:mlir-tblgen", - td_file = "Transforms/LoadConstantOpPatterns.td", - td_includes = ["external/org_tensorflow"], - td_srcs = [ - "IR/XCoreOps.td", - "@llvm-project//mlir:StdOpsTdFiles", - "@org_tensorflow//tensorflow/compiler/mlir/tensorflow:tensorflow_ops_td_files", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_ops_td_files", - ], -) - -gentbl( - name = "conv_patterns_inc_gen", - tbl_outs = [ - ("-gen-rewriters", "Transforms/GeneratedConvPatterns.inc"), - ], - tblgen = "@llvm-project//mlir:mlir-tblgen", - td_file = "Transforms/ConvPatterns.td", - td_includes = ["external/org_tensorflow"], - td_srcs = [ - "IR/XCoreOps.td", - "@llvm-project//mlir:StdOpsTdFiles", - "@org_tensorflow//tensorflow/compiler/mlir/tensorflow:tensorflow_ops_td_files", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_ops_td_files", - ], -) - -cc_library( - name = "xcore_passes", - srcs = glob(["Transforms/*.cpp"]) + [ - "IR/XCoreEnumOps.h.inc", - "IR/XCoreEnumOps.cpp.inc", - "IR/XCoreOps.cpp", - "IR/XCoreDialect.h.inc", - "IR/XCoreOps.cpp.inc", - "IR/XCoreOps.h.inc", - "Transforms/GeneratedXCPatterns.inc", - "Transforms/GeneratedTFLPatterns.inc", - "Transforms/GeneratedLoadConstantOpPatterns.inc", - "Transforms/GeneratedConvPatterns.inc" - ], - hdrs = [ - "Transforms/ConvPatterns.h", - "Transforms/Options.h", - "Transforms/Passes.h", - "Utils/FileIO.h", - "IR/XCoreOps.h", - ], - deps = [ - ":xc_ops_inc_gen", - ":xc_patterns_inc_gen", - ":tfl_patterns_inc_gen", - ":load_constant_op_patterns_inc_gen", - ":conv_patterns_inc_gen", - "@lce//larq_compute_engine/mlir:larq_compute_engine_translate_tflite", - "@llvm-project//mlir:IR", - "@llvm-project//mlir:Pass", - "@llvm-project//mlir:QuantOps", - "@org_tensorflow//tensorflow/compiler/mlir/tensorflow", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite", - "@lib_nn//:libnn_lib", - ], - copts = ["-DNN_USE_REF -Iexternal/lib_nn/lib_nn/api"], -) - -cc_library( - name = "utils", - srcs = glob(["Utils/*.cpp"]), - hdrs = glob(["Utils/*.h"]), - deps = [ - "@llvm-project//llvm:Support", - "@llvm-project//mlir:IR", - "@llvm-project//mlir:Pass", - "@llvm-project//mlir:Support", - "@org_tensorflow//tensorflow/compiler/mlir/lite:flatbuffer_import", - "@org_tensorflow//tensorflow/compiler/mlir/lite:flatbuffer_export", - ], -) - -cc_binary( - name = "xcore-opt", - srcs = ["XCoreOptMain.cpp"], - deps = [ - ":xcore_passes", - ":utils", - "@llvm-project//mlir:IR", - "@llvm-project//mlir:StandardOps", - "@llvm-project//mlir:QuantOps", - "@llvm-project//llvm:Support", - "@llvm-project//mlir:Pass", - "@llvm-project//mlir:Shape", - "@llvm-project//mlir:Support", - "@llvm-project//mlir:TransformUtils", - "@llvm-project//mlir:MlirOptLib", - ], -) diff --git a/experimental/xformer/IR/XCoreOps.cpp b/experimental/xformer/IR/XCoreOps.cpp deleted file mode 100644 index 35a121d55..000000000 --- a/experimental/xformer/IR/XCoreOps.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "IR/XCoreOps.h" - -#define GET_OP_CLASSES -#include "IR/XCoreOps.cpp.inc" - -#include "IR/XCoreEnumOps.cpp.inc" - -namespace mlir { -namespace xcore { - -void XCoreDialect::initialize() { - addOperations< -#define GET_OP_LIST -#include "IR/XCoreOps.cpp.inc" - >(); -} -} // namespace xcore -} // namespace mlir diff --git a/experimental/xformer/IR/XCoreOps.h b/experimental/xformer/IR/XCoreOps.h deleted file mode 100644 index 00217f6bd..000000000 --- a/experimental/xformer/IR/XCoreOps.h +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#ifndef XFORMER_IR_XCOREOPS_H -#define XFORMER_IR_XCOREOPS_H - -#include "mlir/Dialect/Quant/QuantTypes.h" -#include "mlir/Interfaces/SideEffectInterfaces.h" - -// clang-format off -#include "IR/XCoreDialect.h.inc" -// clang-format on - -#include "IR/XCoreEnumOps.h.inc" - -#define GET_OP_CLASSES -#include "IR/XCoreOps.h.inc" - -#endif // XFORMER_IR_XCOREOPS_H diff --git a/experimental/xformer/IR/XCoreOps.td b/experimental/xformer/IR/XCoreOps.td deleted file mode 100644 index 58fc2f669..000000000 --- a/experimental/xformer/IR/XCoreOps.td +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -//===----------------------------------------------------------------------===// -// -// This is the operation definition file for XCore dialect operations. -// -//===----------------------------------------------------------------------===// - -include "mlir/IR/OpBase.td" -include "mlir/Interfaces/SideEffectInterfaces.td" -include "tensorflow/compiler/mlir/lite/quantization/quantization.td" - -//===----------------------------------------------------------------------===// -// XCore dialect definitions -//===----------------------------------------------------------------------===// - -#ifndef XCORE_DIALECT -#define XCORE_DIALECT - -def XCoreDialect : Dialect { - let name = "xc"; - - let summary = "Types and operations for XCore dialect"; - let description = [{ - This dialect contains operations for XCore. This dialect will be used in - conjunction with the TensorFlow dialects for converting & optimizing - TF graphs to be deployed on XCore. - }]; - - let cppNamespace = "::mlir::xcore"; -} - -//===----------------------------------------------------------------------===// -// XCore op definitions -//===----------------------------------------------------------------------===// - -// Base class for the operation in this dialect -class XC_Op traits = []> - : Op { - - let extraClassDeclaration = [{ std::vector buildCustomOptions(); }]; -} - -// Conv2D - -def XC_Conv2D_ValidDirect : StrEnumAttrCase<"ValidDirect">; -def XC_Conv2D_ValidIndirect : StrEnumAttrCase<"ValidIndirect">; -def XC_Conv2D_PaddedIndirect : StrEnumAttrCase<"PaddedIndirect">; -def XC_DW_Conv2D_ValidDirect : StrEnumAttrCase<"DepthwiseValidDirect">; -def XC_DW_Conv2D_PaddedIndirect : StrEnumAttrCase<"DepthwisePaddedIndirect">; -def XC_BNN_Conv2D_ValidDirect_Binary : StrEnumAttrCase<"BNNValidDirectBinary">; -def XC_BNN_Conv2D_ValidIndirect_Binary - : StrEnumAttrCase<"BNNValidIndirectBinary">; -def XC_BNN_Conv2D_ValidDirect_Int8 : StrEnumAttrCase<"BNNValidDirectInt8">; -def XC_BNN_Conv2D_ValidIndirect_Int8 : StrEnumAttrCase<"BNNValidIndirectInt8">; - -def XC_Conv2D_TypeAttr : StrEnumAttr<"Conv2DType", "conv2d type enum", [ - XC_Conv2D_ValidDirect, XC_Conv2D_ValidIndirect, XC_Conv2D_PaddedIndirect, - XC_DW_Conv2D_ValidDirect, XC_DW_Conv2D_PaddedIndirect, - XC_BNN_Conv2D_ValidDirect_Binary, XC_BNN_Conv2D_ValidIndirect_Binary, - XC_BNN_Conv2D_ValidDirect_Int8, XC_BNN_Conv2D_ValidIndirect_Int8 -]>; - -def XC_Conv2DV2Op : XC_Op<"conv2d_v2", [NoSideEffect]> { - let summary = "Conv2D V2 op"; - - let description = [{Conv2D V2 op.}]; - - let arguments = (ins - // I32 input is for BNNs - TensorOf<[QI8, I32]>:$input, - - I32Attr:$thread_count, - I32ArrayAttr:$scratch_bytes, - TensorOf<[I8]>:$weights, - TensorOf<[I16]>:$mulsbiases_or_thresholds, - StrArrayAttr:$abstract_kernel_params, - StrArrayAttr:$memcpy_fn_params, - StrArrayAttr:$aggregate_fn_params, - StrArrayAttr:$output_transform_fn_params, - StrArrayAttr:$conv2d_kernel_type - ); - - // I32 output is for BNNs - let results = (outs TensorOf<[QI8, I32]> : $output); -} - -def XC_FakeConv2DOp : XC_Op<"fake_conv2d", [NoSideEffect]> { - let summary = "Fake Conv2D op"; - - let description = [{Fake Conv2D op.}]; - - let arguments = (ins - TensorOf<[QI8]>:$input, - TensorOf<[QI8]>:$filter, - TensorOf<[I32,QI32]>:$bias, - I32Attr:$dilation_h_factor, - I32Attr:$dilation_w_factor, - StrAttr:$fused_activation_function, - StrAttr:$padding, - // For using explicit padding - AnyTypeOf<[TensorOf<[I32,I64]>, NoneType]>:$padding_values, - I32Attr:$stride_h, - I32Attr:$stride_w - ); - - let results = (outs TensorOf<[QI8]> : $output); -} - -def XC_FakeDepthwiseConv2DOp : XC_Op<"fake_depthwise_conv2d", [NoSideEffect]> { - let summary = "Fake Depthwise Conv2D op"; - - let description = [{Fake Depthwise Conv2D op.}]; - - let arguments = (ins - TensorOf<[QI8]>:$input, - TensorOf<[QI8]>:$filter, - TensorOf<[I32,QI32]>:$bias, - I32Attr:$dilation_h_factor, - I32Attr:$dilation_w_factor, - StrAttr:$fused_activation_function, - StrAttr:$padding, - // For using explicit padding - AnyTypeOf<[TensorOf<[I32,I64]>, NoneType]>:$padding_values, - I32Attr:$stride_h, - I32Attr:$stride_w, - I32Attr:$depth_multiplier - ); - - let results = (outs TensorOf<[QI8]> : $output); -} - -def XC_Lookup8Op : XC_Op<"lookup_8", [NoSideEffect]> { - let summary = "Lookup table op"; - - let description = [{Lookup table op.}]; - - let arguments = (ins TensorOf<[QI8]> : $input, TensorOf<[I8]> : $lut); - - let results = (outs TensorOf<[QI8]> : $output); -} - -def XC_PadOp : XC_Op<"pad", [NoSideEffect]> { - let summary = "Pad op"; - - let description = [{Pad op.}]; - - let arguments = (ins - TensorOf<[F32, I32, QI8]>:$input, - TensorOf<[I32]>:$padding, - - I32Attr:$pad_value - ); - - let results = (outs TensorOf<[F32, I32, QI8]> : $output); -} - -def XC_LoadConstantOp - : XC_Op<"ld_constant", [NoSideEffect, SameOperandsAndResultType]> { - let summary = "Load constant op"; - - let description = [{Load constant op.}]; - - let arguments = (ins AnyTensor : $input); - - let results = (outs AnyTensor : $output); -} - -def XC_LoadFlashOp : XC_Op<"ld_flash", [NoSideEffect]> { - let summary = "Load from flash op"; - - let description = [{Load from flash op.}]; - - let arguments = (ins I32Attr : $address, I32Attr : $size); - - let results = (outs AnyTensor : $output); -} - -def XC_Bsign8Op : XC_Op<"bsign_8", [NoSideEffect]> { - let summary = "Binary sign op"; - - let description = [{Binary sign op.}]; - - let arguments = (ins TensorOf<[QI8]> : $input); - - let results = (outs TensorOf<[I32]> : $output); -} - -#endif // XCORE_DIALECT diff --git a/experimental/xformer/README.md b/experimental/xformer/README.md deleted file mode 100644 index 5b2233ce8..000000000 --- a/experimental/xformer/README.md +++ /dev/null @@ -1,55 +0,0 @@ -Build instructions --- - -`Bazel` is used to build this program. The choice of build system is -driven by the most complex dependency (Tensorflow). - -Note before the first step ensure that you have installed the -`xcore_interpreters` and `tflite2xcore` python packages using -`pip`. This will ensure that the python requirements are installed. - -Also, before installing make sure that you have updated ai_tools -including the submodules: - - git pull - git submodule update --init --recursive - - -With Bazel installed (check `.bazelversion` for current version), -you can build with the following command (make sure you run it -from the directory /ai_tools/experimental/xformer): - - bazel build //:xcore-opt - -To run the binary on an input tflite file: - - ./bazel-bin/xcore-opt -o - -To view the various supported options: - - ./bazel-bin/xcore-opt --help - - -Python package instructions --- - -After building the xcore-opt binary, the python package can be built -with the following command (make sure you run it from the directory -/ai_tools/experimental/xformer/python): - - cd python - python setup.py bdist_wheel - -The wheel file will be created in a newly created `dist` folder. -This can now be installed via pip or uploaded to pypi via twine. - -Test instructions --- - -We use [llvm-lit](https://llvm.org/docs/CommandGuide/lit.html) for writing unit tests. This makes it easier to test the impact of a single pass. To run all lit tests in the `Test` folder, use the following command: - - bazel test //Test:all - -An individual test can be run by combining the `test filename` and `.test` suffix to create the bazel target name. For example, the following command: - - bazel test //Test:xcfc-to-tflcustom.mlir.test diff --git a/experimental/xformer/Test/activation-lowering.mlir.disabled b/experimental/xformer/Test/activation-lowering.mlir.disabled deleted file mode 100644 index 96115c29f..000000000 --- a/experimental/xformer/Test/activation-lowering.mlir.disabled +++ /dev/null @@ -1,43 +0,0 @@ -// RUN: xcore-opt --mlir-io %s --xcore-apply-patterns | FileCheck %s - -// CHECK-LABEL: relu -func @relu(%arg0: tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> attributes {tf.entry_function = {inputs = "lambda_input_int8", outputs = "Identity_int8"}} { - // CHECK: "0x828486888A8C8E90929496989A9C9EA0A2A4A6A8AAACAEB0B2B4B6B8BABCBEC0C2C4C6C8CACCCED0D2D4D6D8DADCDEE0E2E4E6E8EAECEEF0F2F4F6F8FAFCFE00020406080A0C0E10121416181A1C1E20222426282A2C2E30323436383A3C3E40424446484A4C4E50525456585A5C5E60626466686A6C6E70727476787A7C7E7F8080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080" - // CHECK-SAME: tensor<256xi8> - // CHECK: xc.lookup_8 - %0 = "tfl.relu"(%arg0) : (tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> - return %0 : tensor<1x12x4x7x!quant.uniform> -} - -// ----- - -// CHECK-LABEL: relu6 -func @relu6(%arg0: tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> attributes {tf.entry_function = {inputs = "lambda_input_int8", outputs = "Identity_int8"}} { - // CHECK: "0x828486888A8C8E90929496989A9C9EA0A2A4A6A8AAACAEB0B2B4B6B8BABCBEC0C2C4C6C8CACCCED0D2D4D6D8DADCDEE0E2E4E6E8EAECEEF0F2F4F6F8FAFCFE00020406080A0C0E10121416181A1C1E20222426282A2C2E30323436383A3C3E40424446484A4C4E50525456585A5C5E60626466686A6C6E70727476787A7C7E7F8080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080" - // CHECK-SAME: tensor<256xi8> - // CHECK: xc.lookup_8 - %0 = "tfl.relu6"(%arg0) : (tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> - return %0 : tensor<1x12x4x7x!quant.uniform> -} - -// ----- - -// CHECK-LABEL: tanh -func @tanh(%arg0: tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> attributes {tf.entry_function = {inputs = "lambda_input_int8", outputs = "Identity_int8"}} { - // CHECK: "0x828486888A8C8E90929496989A9C9EA0A2A4A6A8AAACAEAFB1B3B5B7B9BBBDBFC1C2C4C6C8CACCCDCFD1D3D5D6D8DADCDDDFE1E3E4E6E8E9EBEDEEF0F1F3F5F6F8F9FBFCFEFF0102040507080A0B0C0E0F111213151617191A1B1C1E1F2021222425262728292A2C2D2E2F303132333435363738393A3B3C3D3D3E3F404142438080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080" - // CHECK-SAME: tensor<256xi8> - // CHECK: xc.lookup_8 - %0 = "tfl.tanh"(%arg0) : (tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> - return %0 : tensor<1x12x4x7x!quant.uniform> -} - -// ----- - -// CHECK-LABEL: logistic -func @logistic(%arg0: tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> attributes {tf.entry_function = {inputs = "lambda_input_int8", outputs = "Identity_int8"}} { - // CHECK: "0x000101020203030404050506060707080809090A0A0B0B0C0C0D0D0E0E0F0F0F10101111121213131414151516161717181819191A1A1B1B1C1C1D1D1E1E1E1F1F202021212222232324242425252626272728282929292A2A2B2B2C2C2D2D2D2E2E2F2F3030303131323233333334343535353636373738383839393A3A3A3BC5C5C6C6C6C7C7C8C8C8C9C9CACACBCBCBCCCCCDCDCDCECECFCFD0D0D0D1D1D2D2D3D3D3D4D4D5D5D6D6D7D7D7D8D8D9D9DADADBDBDCDCDDDDDDDEDEDFDFE0E0E1E1E2E2E3E3E4E4E4E5E5E6E6E7E7E8E8E9E9EAEAEBEBECECEDEDEEEEEFEFF0F0F1F1F2F2F3F3F4F4F5F5F6F6F7F7F8F8F9F9FAFAFBFBFCFCFDFDFEFEFFFF00" - // CHECK-SAME: tensor<256xi8> - // CHECK: xc.lookup_8 - %0 = "tfl.logistic"(%arg0) : (tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> - return %0 : tensor<1x12x4x7x!quant.uniform> -} diff --git a/experimental/xformer/Test/avg_pool_2d.mlir b/experimental/xformer/Test/avg_pool_2d.mlir deleted file mode 100644 index e1274e228..000000000 --- a/experimental/xformer/Test/avg_pool_2d.mlir +++ /dev/null @@ -1,40 +0,0 @@ -// RUN: xcore-opt --mlir-io %s --xcore-replace-avgpool-with-conv2d | FileCheck %s - -// CHECK-LABEL: main2x2 -func @main2x2(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "average_pooling2d_input", outputs = "Identity"}} { - - // CHECK: tfl.depthwise_conv_2d - // CHECK-SAME: stride_h = 2 : i32 - // CHECK-SAME: stride_w = 2 : i32 - // CHECK-SAME: tensor<1x2x2x4x!quant.uniform - // CHECK-NOT: tfl.average_pool_2d - %0 = "tfl.average_pool_2d"(%arg0) {filter_height = 2 : i32, filter_width = 2 : i32, fused_activation_function = "NONE", padding = "VALID", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>) -> tensor> - // CHECK: return - return %0 : tensor> -} - -// CHECK-LABEL: main3x3 -func @main3x3(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "average_pooling2d_input", outputs = "Identity"}} { - - // CHECK: tfl.depthwise_conv_2d - // CHECK-SAME: stride_h = 3 : i32 - // CHECK-SAME: stride_w = 3 : i32 - // CHECK-SAME: tensor<1x3x3x4x!quant.uniform - // CHECK-NOT: tfl.average_pool_2d - %0 = "tfl.average_pool_2d"(%arg0) {filter_height = 3 : i32, filter_width = 3 : i32, fused_activation_function = "NONE", padding = "VALID", stride_h = 3 : i32, stride_w = 3 : i32} : (tensor>) -> tensor> - // CHECK: return - return %0 : tensor> -} - -// CHECK-LABEL: main4x4 -func @main4x4(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "average_pooling2d_input", outputs = "Identity"}} { - - // CHECK: tfl.depthwise_conv_2d - // CHECK-SAME: stride_h = 1 : i32 - // CHECK-SAME: stride_w = 1 : i32 - // CHECK-SAME: tensor<1x4x4x4x!quant.uniform - // CHECK-NOT: tfl.average_pool_2d - %0 = "tfl.average_pool_2d"(%arg0) {filter_height = 4 : i32, filter_width = 4 : i32, fused_activation_function = "NONE", padding = "VALID", stride_h = 1 : i32, stride_w = 1 : i32} : (tensor>) -> tensor> - // CHECK: return - return %0 : tensor> -} diff --git a/experimental/xformer/Test/invalid-loadconstantop.mlir b/experimental/xformer/Test/invalid-loadconstantop.mlir deleted file mode 100644 index 508061950..000000000 --- a/experimental/xformer/Test/invalid-loadconstantop.mlir +++ /dev/null @@ -1,15 +0,0 @@ -// RUN: xcore-opt --mlir-io %s --xcore-apply-loadconstantop-patterns -verify-diagnostics - -// expected-error@+1 {{Flash image file option should be provided to run this pass!}} -func @invalid(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "flatten_input", outputs = "Identity"}} { - %cst = constant dense<[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]> : tensor<10xi8> - %cst_0 = constant dense<[[11, 12, 13, 14, 15, 16, 17, 18, 19, 10]]> : tensor<1x10xi16> - %cst_1 = constant dense<[-1, 1, 1, 32]> : tensor<4xi64> - %cst_2 = constant dense<[-1, 32]> : tensor<2xi64> - %0 = "tfl.pseudo_const"() {value = dense<[-1, 32]> : tensor<2xi32>} : () -> tensor<2xi32> - %1 = "tfl.reshape"(%arg0, %0) : (tensor>, tensor<2xi32>) -> tensor> - %2 = "tfl.reshape"(%1, %cst_1) : (tensor>, tensor<4xi64>) -> tensor> - %3 = "xc.conv2d_v2"(%2, %cst, %cst_0) {abstract_kernel_params = ["\00\00\00\00\01\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00 \00\00\00"], aggregate_fn_params = [" \08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \08\00\00\CA~=\18\FC\1C\86\1B\BE\0D\B0U\13\CC\16\B57\DA*\22I0\F9~\88c\D8K\E2\A1\F3P^\16W\8B\C0\85\F8\F5[\AB\825\05\DC\97, rQ\FCf\F6\A1\A2\B3\7F+\E5\F9\04\E1\CA\05\A8\F6\F6Iv\9BQ\B6M\B9\89\EA\1F\B1\1C\AD\8D-,C\BB\DF^\F0\1C>\82\E9\99G\AA\BB\12\D5c*\89m\03\9FP\97\14\AFP\AA\D42\A2\8C3\87P%\09M\DC\0CB\A2p\82y\BF|\13\A6\C4\F5%\D3WhW\D1\00#~\F4_\A5\F5\A2f4\85]k\8A\DD\93\0B\0B\DF\04\DD\82\AB\8A\97\91\DD\D4X\83\8A=_v=\85\A2\19\87\A4\E6\1A?F=\CC~\06\83\D1\DBU\A0\EC\82=\84%M\18\E1\D1\AB\C8\1D\8B\BE\D6h\C8\E8\F1\DD\EE`\F3\E1h75\A3\87\04/'\96\C9\10\AB\A2\147\FD\B3\C6\AE\08\F4\83JoK\93\CD\8EZ\\S\CB<\BEv[\CE\CA\B1\FB\FC\0AR\E4sV\04x\EA\99\A8z \FE+e\C9\84\AD\F2E\89\88\8B\C6\C5wa{>\BA\CF\E6\005\A5:\9F\8B\CA2\07\D0=\F2Jz\85\B7\17\CA\A5fM\DC\9F\91\1E\1Aj\DF\ED\A8I\DC\1DW\90\19\92\FA\84\11\15\9C\B7\AC\02\BD\03/\05\BFxk\BF\E4\AE\A2'p\F4d^\988M_\D7\B4!\CDn4Q\93\AE\D9\AC\B6K\0A\C4\D6\A2\16i<\B1M\A1\F2N\AD*\C0O\0CVs\E9\FA\CF\DBWEZw\9F\AF\A5bu\04{\A1!\EF\8C$&u\A9\1F&\A6\E6\22=\AEB\B8\D9\8A\F8\D7l\12\DA\09\98\10\07AP\A9yv\BC[xI\CAs\D6\A1,\E4\EF\DD\9E\F6\FA\D4\B9\B3\A6\B5j\A1&)d\0D\DA\DFV\E8\F0\F0f+\D5\AB\7Fq/\89\9A\15\81\BA2\ED`\EB\88\12\D4\C7\90i?\E7\98\AB:\E5\E2y\87\EA\93s\F4'\CBb\B1^\893\C3\C6\B6\BA\96$+\AF\EA\99\17\CE+O\B80\AC\10\DE\DCIl\B1\CATB\EA/\E9\AF\99g\00\01Y\BF/\82\A6\BF\EF0\D5k\A2\FA\1BM$\9A~@|\EFu\9By\A9>\99\E1;\0F\053G#\0B\A4\A8\1A^\E8W\07\EB`\98s\D4ZtV\1D\82A\C2\FF\13\E0\EF\F6MRP\A8\CE\22`\FC\BE\82\19\04}\B7\ED\FE\D8\197Yj\F5\BA^#f\C3\05\8F|vK\AB\E0k\D6qx\F0U\95{\D0\F1\F2\CA\B1N\FEI\C0\1990\04@\EB\0C\99\B4\9BjN\15\03\C0rd\D2\84\BA\96HZ\8CN:\8C\07@A\8C\B1DFq\C4u m\88b\10?Us\8F\8A\9C\BC\C9\A5\\\84\0E(f\8CF*\BF\FC\F72\BC\0A=k\AEG\0C2sq\B6X\07\FE\9A\22\F9c\03\BC\F7\15+r\EFOy\9E\E3\00\11#h_\A9\96\11\C5\FD\B9\82\EA,\D60}\96Z\8A .\0B\CB\D3/\AF\EC5\\\AA\DC#\8DM\8C\A7\94[TP\AD\BD+\16\87\06/8\06\D6[\C9 \F8\83C\869$EU\\\C6e\155\C7cK\CD\D4\1C\0A\19\A6E\A7\12\BC\DB\06\B5\EC\F2]rIn\D2\B6\B5DA\DA\C3N46M\A4\BE\10\16\12\C1\D7\CA=RRf\1D\A5\F6\A8\B5,\E6\0Bj\FF\EE\86C;D\E2\FD\97\08\A7\E9\06G\FBM\ECS\BE6Qe%1\14\81N\1F\DD7X\DF\9A\9D\F40\E3\1B\9F\F1\B8\A5o\AF\DB2\DF\B4\1DR\F6y\B0<\AD\CB\EAYD\D5v;M\EC\8F>f@\A6\8D,,\0EiJ\E0c\E6\E5\E8\DBR\94\E6%\03v\9DO\0A\96\BAX}\8E\CF\09\94|\06j\84\B3\FE\81H\A4-\F0\A65W\02?\BB6\B4\0A\D8B|\91\D3\22\BEw\E32\C4G#\EA\16\01|\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00"], conv2d_kernel_type = ["ValidDirect"], memcpy_fn_params = [" \00\00\00 \00\00\00"], output_transform_fn_params = ["\E4\00\00\00 \00\00\00 \00\00\00\00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\00\00\00\00\C1\0F\A9\BD\22\03\D5\F9u\F5\B9\B8\DA\00g\F3@\B1\C1\EBQ\0A4\DF\ED\16\BD\01{\10\12\E0.\D3S\D57\12\B7\03\D1\10u\E6\AE\E0\11\F0m\FD\A3\12\A1\19\9A\D6-\BC1\EE\C3\C5\7F\EF\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk"], scratch_bytes = [0 : i32], thread_count = 1 : i32} : (tensor>, tensor<10xi8>, tensor<1x10xi16>) -> tensor> - %4 = "tfl.reshape"(%3, %cst_2) : (tensor>, tensor<2xi64>) -> tensor> - return %4 : tensor> -} diff --git a/experimental/xformer/Test/invalid-loadflashop.mlir b/experimental/xformer/Test/invalid-loadflashop.mlir deleted file mode 100644 index 247a462ca..000000000 --- a/experimental/xformer/Test/invalid-loadflashop.mlir +++ /dev/null @@ -1,17 +0,0 @@ -// RUN: xcore-opt --mlir-io %s --xcore-write-flash-image -verify-diagnostics - -// expected-error@+1 {{Flash image file option should be provided to run this pass!}} -func @valid(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "flatten_input", outputs = "Identity"}} { - %cst = constant dense<[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]> : tensor<10xi8> - %cst_0 = constant dense<[[11, 12, 13, 14, 15, 16, 17, 18, 19, 10]]> : tensor<1x10xi16> - %cst_1 = constant dense<[-1, 1, 1, 32]> : tensor<4xi64> - %cst_2 = constant dense<[-1, 32]> : tensor<2xi64> - %cst_3 = constant dense<[-1, 32]> : tensor<2xi32> - %0 = "tfl.reshape"(%arg0, %cst_3) : (tensor>, tensor<2xi32>) -> tensor> - %1 = "tfl.reshape"(%0, %cst_1) : (tensor>, tensor<4xi64>) -> tensor> - %2 = "xc.ld_constant"(%cst) : (tensor<10xi8>) -> tensor<10xi8> - %3 = "xc.ld_constant"(%cst_0) : (tensor<1x10xi16>) -> tensor<1x10xi16> - %4 = "xc.conv2d_v2"(%1, %2, %3) {abstract_kernel_params = ["\00\00\00\00\01\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00 \00\00\00"], aggregate_fn_params = [" \08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \08\00\00\CA~=\18\FC\1C\86\1B\BE\0D\B0U\13\CC\16\B57\DA*\22I0\F9~\88c\D8K\E2\A1\F3P^\16W\8B\C0\85\F8\F5[\AB\825\05\DC\97, rQ\FCf\F6\A1\A2\B3\7F+\E5\F9\04\E1\CA\05\A8\F6\F6Iv\9BQ\B6M\B9\89\EA\1F\B1\1C\AD\8D-,C\BB\DF^\F0\1C>\82\E9\99G\AA\BB\12\D5c*\89m\03\9FP\97\14\AFP\AA\D42\A2\8C3\87P%\09M\DC\0CB\A2p\82y\BF|\13\A6\C4\F5%\D3WhW\D1\00#~\F4_\A5\F5\A2f4\85]k\8A\DD\93\0B\0B\DF\04\DD\82\AB\8A\97\91\DD\D4X\83\8A=_v=\85\A2\19\87\A4\E6\1A?F=\CC~\06\83\D1\DBU\A0\EC\82=\84%M\18\E1\D1\AB\C8\1D\8B\BE\D6h\C8\E8\F1\DD\EE`\F3\E1h75\A3\87\04/'\96\C9\10\AB\A2\147\FD\B3\C6\AE\08\F4\83JoK\93\CD\8EZ\\S\CB<\BEv[\CE\CA\B1\FB\FC\0AR\E4sV\04x\EA\99\A8z \FE+e\C9\84\AD\F2E\89\88\8B\C6\C5wa{>\BA\CF\E6\005\A5:\9F\8B\CA2\07\D0=\F2Jz\85\B7\17\CA\A5fM\DC\9F\91\1E\1Aj\DF\ED\A8I\DC\1DW\90\19\92\FA\84\11\15\9C\B7\AC\02\BD\03/\05\BFxk\BF\E4\AE\A2'p\F4d^\988M_\D7\B4!\CDn4Q\93\AE\D9\AC\B6K\0A\C4\D6\A2\16i<\B1M\A1\F2N\AD*\C0O\0CVs\E9\FA\CF\DBWEZw\9F\AF\A5bu\04{\A1!\EF\8C$&u\A9\1F&\A6\E6\22=\AEB\B8\D9\8A\F8\D7l\12\DA\09\98\10\07AP\A9yv\BC[xI\CAs\D6\A1,\E4\EF\DD\9E\F6\FA\D4\B9\B3\A6\B5j\A1&)d\0D\DA\DFV\E8\F0\F0f+\D5\AB\7Fq/\89\9A\15\81\BA2\ED`\EB\88\12\D4\C7\90i?\E7\98\AB:\E5\E2y\87\EA\93s\F4'\CBb\B1^\893\C3\C6\B6\BA\96$+\AF\EA\99\17\CE+O\B80\AC\10\DE\DCIl\B1\CATB\EA/\E9\AF\99g\00\01Y\BF/\82\A6\BF\EF0\D5k\A2\FA\1BM$\9A~@|\EFu\9By\A9>\99\E1;\0F\053G#\0B\A4\A8\1A^\E8W\07\EB`\98s\D4ZtV\1D\82A\C2\FF\13\E0\EF\F6MRP\A8\CE\22`\FC\BE\82\19\04}\B7\ED\FE\D8\197Yj\F5\BA^#f\C3\05\8F|vK\AB\E0k\D6qx\F0U\95{\D0\F1\F2\CA\B1N\FEI\C0\1990\04@\EB\0C\99\B4\9BjN\15\03\C0rd\D2\84\BA\96HZ\8CN:\8C\07@A\8C\B1DFq\C4u m\88b\10?Us\8F\8A\9C\BC\C9\A5\\\84\0E(f\8CF*\BF\FC\F72\BC\0A=k\AEG\0C2sq\B6X\07\FE\9A\22\F9c\03\BC\F7\15+r\EFOy\9E\E3\00\11#h_\A9\96\11\C5\FD\B9\82\EA,\D60}\96Z\8A .\0B\CB\D3/\AF\EC5\\\AA\DC#\8DM\8C\A7\94[TP\AD\BD+\16\87\06/8\06\D6[\C9 \F8\83C\869$EU\\\C6e\155\C7cK\CD\D4\1C\0A\19\A6E\A7\12\BC\DB\06\B5\EC\F2]rIn\D2\B6\B5DA\DA\C3N46M\A4\BE\10\16\12\C1\D7\CA=RRf\1D\A5\F6\A8\B5,\E6\0Bj\FF\EE\86C;D\E2\FD\97\08\A7\E9\06G\FBM\ECS\BE6Qe%1\14\81N\1F\DD7X\DF\9A\9D\F40\E3\1B\9F\F1\B8\A5o\AF\DB2\DF\B4\1DR\F6y\B0<\AD\CB\EAYD\D5v;M\EC\8F>f@\A6\8D,,\0EiJ\E0c\E6\E5\E8\DBR\94\E6%\03v\9DO\0A\96\BAX}\8E\CF\09\94|\06j\84\B3\FE\81H\A4-\F0\A65W\02?\BB6\B4\0A\D8B|\91\D3\22\BEw\E32\C4G#\EA\16\01|\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00"], conv2d_kernel_type = ["ValidDirect"], memcpy_fn_params = [" \00\00\00 \00\00\00"], output_transform_fn_params = ["\E4\00\00\00 \00\00\00 \00\00\00\00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\00\00\00\00\C1\0F\A9\BD\22\03\D5\F9u\F5\B9\B8\DA\00g\F3@\B1\C1\EBQ\0A4\DF\ED\16\BD\01{\10\12\E0.\D3S\D57\12\B7\03\D1\10u\E6\AE\E0\11\F0m\FD\A3\12\A1\19\9A\D6-\BC1\EE\C3\C5\7F\EF\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk"], scratch_bytes = [0 : i32], thread_count = 1 : i32} : (tensor>, tensor<10xi8>, tensor<1x10xi16>) -> tensor> - %5 = "tfl.reshape"(%4, %cst_2) : (tensor>, tensor<2xi64>) -> tensor> - return %5 : tensor> -} diff --git a/experimental/xformer/Test/loadconstantop.mlir b/experimental/xformer/Test/loadconstantop.mlir deleted file mode 100644 index 12f0880a0..000000000 --- a/experimental/xformer/Test/loadconstantop.mlir +++ /dev/null @@ -1,39 +0,0 @@ -// RUN: xcore-opt --mlir-io %s --xcore-apply-loadconstantop-patterns --xcore-flash-image-file=/dev/null --xcore-load-externally-if-larger=0 | FileCheck %s - -// RUN: xcore-opt --mlir-io %s --xcore-apply-loadconstantop-patterns --xcore-flash-image-file=/dev/null --xcore-load-externally-if-larger=16 | FileCheck %s -check-prefix=LARGER-CHECK - -// CHECK-LABEL: valid -func @valid(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "flatten_input", outputs = "Identity"}} { - %cst = constant dense<[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]> : tensor<10xi8> - %cst_0 = constant dense<[[11, 12, 13, 14, 15, 16, 17, 18, 19, 10]]> : tensor<1x10xi16> - %cst_1 = constant dense<[-1, 1, 1, 32]> : tensor<4xi64> - %cst_2 = constant dense<[-1, 32]> : tensor<2xi64> - %0 = "tfl.pseudo_const"() {value = dense<[-1, 32]> : tensor<2xi32>} : () -> tensor<2xi32> - %1 = "tfl.reshape"(%arg0, %0) : (tensor>, tensor<2xi32>) -> tensor> - %2 = "tfl.reshape"(%1, %cst_1) : (tensor>, tensor<4xi64>) -> tensor> - // CHECK: xc.ld_constant - // CHECK: xc.ld_constant - // CHECK: xc.conv2d_v2 - %3 = "xc.conv2d_v2"(%2, %cst, %cst_0) {abstract_kernel_params = ["\00\00\00\00\01\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00 \00\00\00"], aggregate_fn_params = [" \08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \08\00\00\CA~=\18\FC\1C\86\1B\BE\0D\B0U\13\CC\16\B57\DA*\22I0\F9~\88c\D8K\E2\A1\F3P^\16W\8B\C0\85\F8\F5[\AB\825\05\DC\97, rQ\FCf\F6\A1\A2\B3\7F+\E5\F9\04\E1\CA\05\A8\F6\F6Iv\9BQ\B6M\B9\89\EA\1F\B1\1C\AD\8D-,C\BB\DF^\F0\1C>\82\E9\99G\AA\BB\12\D5c*\89m\03\9FP\97\14\AFP\AA\D42\A2\8C3\87P%\09M\DC\0CB\A2p\82y\BF|\13\A6\C4\F5%\D3WhW\D1\00#~\F4_\A5\F5\A2f4\85]k\8A\DD\93\0B\0B\DF\04\DD\82\AB\8A\97\91\DD\D4X\83\8A=_v=\85\A2\19\87\A4\E6\1A?F=\CC~\06\83\D1\DBU\A0\EC\82=\84%M\18\E1\D1\AB\C8\1D\8B\BE\D6h\C8\E8\F1\DD\EE`\F3\E1h75\A3\87\04/'\96\C9\10\AB\A2\147\FD\B3\C6\AE\08\F4\83JoK\93\CD\8EZ\\S\CB<\BEv[\CE\CA\B1\FB\FC\0AR\E4sV\04x\EA\99\A8z \FE+e\C9\84\AD\F2E\89\88\8B\C6\C5wa{>\BA\CF\E6\005\A5:\9F\8B\CA2\07\D0=\F2Jz\85\B7\17\CA\A5fM\DC\9F\91\1E\1Aj\DF\ED\A8I\DC\1DW\90\19\92\FA\84\11\15\9C\B7\AC\02\BD\03/\05\BFxk\BF\E4\AE\A2'p\F4d^\988M_\D7\B4!\CDn4Q\93\AE\D9\AC\B6K\0A\C4\D6\A2\16i<\B1M\A1\F2N\AD*\C0O\0CVs\E9\FA\CF\DBWEZw\9F\AF\A5bu\04{\A1!\EF\8C$&u\A9\1F&\A6\E6\22=\AEB\B8\D9\8A\F8\D7l\12\DA\09\98\10\07AP\A9yv\BC[xI\CAs\D6\A1,\E4\EF\DD\9E\F6\FA\D4\B9\B3\A6\B5j\A1&)d\0D\DA\DFV\E8\F0\F0f+\D5\AB\7Fq/\89\9A\15\81\BA2\ED`\EB\88\12\D4\C7\90i?\E7\98\AB:\E5\E2y\87\EA\93s\F4'\CBb\B1^\893\C3\C6\B6\BA\96$+\AF\EA\99\17\CE+O\B80\AC\10\DE\DCIl\B1\CATB\EA/\E9\AF\99g\00\01Y\BF/\82\A6\BF\EF0\D5k\A2\FA\1BM$\9A~@|\EFu\9By\A9>\99\E1;\0F\053G#\0B\A4\A8\1A^\E8W\07\EB`\98s\D4ZtV\1D\82A\C2\FF\13\E0\EF\F6MRP\A8\CE\22`\FC\BE\82\19\04}\B7\ED\FE\D8\197Yj\F5\BA^#f\C3\05\8F|vK\AB\E0k\D6qx\F0U\95{\D0\F1\F2\CA\B1N\FEI\C0\1990\04@\EB\0C\99\B4\9BjN\15\03\C0rd\D2\84\BA\96HZ\8CN:\8C\07@A\8C\B1DFq\C4u m\88b\10?Us\8F\8A\9C\BC\C9\A5\\\84\0E(f\8CF*\BF\FC\F72\BC\0A=k\AEG\0C2sq\B6X\07\FE\9A\22\F9c\03\BC\F7\15+r\EFOy\9E\E3\00\11#h_\A9\96\11\C5\FD\B9\82\EA,\D60}\96Z\8A .\0B\CB\D3/\AF\EC5\\\AA\DC#\8DM\8C\A7\94[TP\AD\BD+\16\87\06/8\06\D6[\C9 \F8\83C\869$EU\\\C6e\155\C7cK\CD\D4\1C\0A\19\A6E\A7\12\BC\DB\06\B5\EC\F2]rIn\D2\B6\B5DA\DA\C3N46M\A4\BE\10\16\12\C1\D7\CA=RRf\1D\A5\F6\A8\B5,\E6\0Bj\FF\EE\86C;D\E2\FD\97\08\A7\E9\06G\FBM\ECS\BE6Qe%1\14\81N\1F\DD7X\DF\9A\9D\F40\E3\1B\9F\F1\B8\A5o\AF\DB2\DF\B4\1DR\F6y\B0<\AD\CB\EAYD\D5v;M\EC\8F>f@\A6\8D,,\0EiJ\E0c\E6\E5\E8\DBR\94\E6%\03v\9DO\0A\96\BAX}\8E\CF\09\94|\06j\84\B3\FE\81H\A4-\F0\A65W\02?\BB6\B4\0A\D8B|\91\D3\22\BEw\E32\C4G#\EA\16\01|\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00"], conv2d_kernel_type = ["ValidDirect"], memcpy_fn_params = [" \00\00\00 \00\00\00"], output_transform_fn_params = ["\E4\00\00\00 \00\00\00 \00\00\00\00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\00\00\00\00\C1\0F\A9\BD\22\03\D5\F9u\F5\B9\B8\DA\00g\F3@\B1\C1\EBQ\0A4\DF\ED\16\BD\01{\10\12\E0.\D3S\D57\12\B7\03\D1\10u\E6\AE\E0\11\F0m\FD\A3\12\A1\19\9A\D6-\BC1\EE\C3\C5\7F\EF\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk"], scratch_bytes = [0 : i32], thread_count = 1 : i32} : (tensor>, tensor<10xi8>, tensor<1x10xi16>) -> tensor> - %4 = "tfl.reshape"(%3, %cst_2) : (tensor>, tensor<2xi64>) -> tensor> - return %4 : tensor> -} - -// ----- - -// LARGER-CHECK-LABEL: valid2 -func @valid2(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "flatten_input", outputs = "Identity"}} { - %cst = constant dense<[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]> : tensor<10xi8> - %cst_0 = constant dense<[[11, 12, 13, 14, 15, 16, 17, 18, 19, 10]]> : tensor<1x10xi16> - %cst_1 = constant dense<[-1, 1, 1, 32]> : tensor<4xi64> - %cst_2 = constant dense<[-1, 32]> : tensor<2xi64> - %0 = "tfl.pseudo_const"() {value = dense<[-1, 32]> : tensor<2xi32>} : () -> tensor<2xi32> - %1 = "tfl.reshape"(%arg0, %0) : (tensor>, tensor<2xi32>) -> tensor> - %2 = "tfl.reshape"(%1, %cst_1) : (tensor>, tensor<4xi64>) -> tensor> - // LARGER-CHECK: xc.ld_constant - // LARGER-CHECK-NOT: xc.ld_constant - // LARGER-CHECK: xc.conv2d_v2 - %3 = "xc.conv2d_v2"(%2, %cst, %cst_0) {abstract_kernel_params = ["\00\00\00\00\01\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00 \00\00\00"], aggregate_fn_params = [" \08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \08\00\00\CA~=\18\FC\1C\86\1B\BE\0D\B0U\13\CC\16\B57\DA*\22I0\F9~\88c\D8K\E2\A1\F3P^\16W\8B\C0\85\F8\F5[\AB\825\05\DC\97, rQ\FCf\F6\A1\A2\B3\7F+\E5\F9\04\E1\CA\05\A8\F6\F6Iv\9BQ\B6M\B9\89\EA\1F\B1\1C\AD\8D-,C\BB\DF^\F0\1C>\82\E9\99G\AA\BB\12\D5c*\89m\03\9FP\97\14\AFP\AA\D42\A2\8C3\87P%\09M\DC\0CB\A2p\82y\BF|\13\A6\C4\F5%\D3WhW\D1\00#~\F4_\A5\F5\A2f4\85]k\8A\DD\93\0B\0B\DF\04\DD\82\AB\8A\97\91\DD\D4X\83\8A=_v=\85\A2\19\87\A4\E6\1A?F=\CC~\06\83\D1\DBU\A0\EC\82=\84%M\18\E1\D1\AB\C8\1D\8B\BE\D6h\C8\E8\F1\DD\EE`\F3\E1h75\A3\87\04/'\96\C9\10\AB\A2\147\FD\B3\C6\AE\08\F4\83JoK\93\CD\8EZ\\S\CB<\BEv[\CE\CA\B1\FB\FC\0AR\E4sV\04x\EA\99\A8z \FE+e\C9\84\AD\F2E\89\88\8B\C6\C5wa{>\BA\CF\E6\005\A5:\9F\8B\CA2\07\D0=\F2Jz\85\B7\17\CA\A5fM\DC\9F\91\1E\1Aj\DF\ED\A8I\DC\1DW\90\19\92\FA\84\11\15\9C\B7\AC\02\BD\03/\05\BFxk\BF\E4\AE\A2'p\F4d^\988M_\D7\B4!\CDn4Q\93\AE\D9\AC\B6K\0A\C4\D6\A2\16i<\B1M\A1\F2N\AD*\C0O\0CVs\E9\FA\CF\DBWEZw\9F\AF\A5bu\04{\A1!\EF\8C$&u\A9\1F&\A6\E6\22=\AEB\B8\D9\8A\F8\D7l\12\DA\09\98\10\07AP\A9yv\BC[xI\CAs\D6\A1,\E4\EF\DD\9E\F6\FA\D4\B9\B3\A6\B5j\A1&)d\0D\DA\DFV\E8\F0\F0f+\D5\AB\7Fq/\89\9A\15\81\BA2\ED`\EB\88\12\D4\C7\90i?\E7\98\AB:\E5\E2y\87\EA\93s\F4'\CBb\B1^\893\C3\C6\B6\BA\96$+\AF\EA\99\17\CE+O\B80\AC\10\DE\DCIl\B1\CATB\EA/\E9\AF\99g\00\01Y\BF/\82\A6\BF\EF0\D5k\A2\FA\1BM$\9A~@|\EFu\9By\A9>\99\E1;\0F\053G#\0B\A4\A8\1A^\E8W\07\EB`\98s\D4ZtV\1D\82A\C2\FF\13\E0\EF\F6MRP\A8\CE\22`\FC\BE\82\19\04}\B7\ED\FE\D8\197Yj\F5\BA^#f\C3\05\8F|vK\AB\E0k\D6qx\F0U\95{\D0\F1\F2\CA\B1N\FEI\C0\1990\04@\EB\0C\99\B4\9BjN\15\03\C0rd\D2\84\BA\96HZ\8CN:\8C\07@A\8C\B1DFq\C4u m\88b\10?Us\8F\8A\9C\BC\C9\A5\\\84\0E(f\8CF*\BF\FC\F72\BC\0A=k\AEG\0C2sq\B6X\07\FE\9A\22\F9c\03\BC\F7\15+r\EFOy\9E\E3\00\11#h_\A9\96\11\C5\FD\B9\82\EA,\D60}\96Z\8A .\0B\CB\D3/\AF\EC5\\\AA\DC#\8DM\8C\A7\94[TP\AD\BD+\16\87\06/8\06\D6[\C9 \F8\83C\869$EU\\\C6e\155\C7cK\CD\D4\1C\0A\19\A6E\A7\12\BC\DB\06\B5\EC\F2]rIn\D2\B6\B5DA\DA\C3N46M\A4\BE\10\16\12\C1\D7\CA=RRf\1D\A5\F6\A8\B5,\E6\0Bj\FF\EE\86C;D\E2\FD\97\08\A7\E9\06G\FBM\ECS\BE6Qe%1\14\81N\1F\DD7X\DF\9A\9D\F40\E3\1B\9F\F1\B8\A5o\AF\DB2\DF\B4\1DR\F6y\B0<\AD\CB\EAYD\D5v;M\EC\8F>f@\A6\8D,,\0EiJ\E0c\E6\E5\E8\DBR\94\E6%\03v\9DO\0A\96\BAX}\8E\CF\09\94|\06j\84\B3\FE\81H\A4-\F0\A65W\02?\BB6\B4\0A\D8B|\91\D3\22\BEw\E32\C4G#\EA\16\01|\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00"], conv2d_kernel_type = ["ValidDirect"], memcpy_fn_params = [" \00\00\00 \00\00\00"], output_transform_fn_params = ["\E4\00\00\00 \00\00\00 \00\00\00\00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\00\00\00\00\C1\0F\A9\BD\22\03\D5\F9u\F5\B9\B8\DA\00g\F3@\B1\C1\EBQ\0A4\DF\ED\16\BD\01{\10\12\E0.\D3S\D57\12\B7\03\D1\10u\E6\AE\E0\11\F0m\FD\A3\12\A1\19\9A\D6-\BC1\EE\C3\C5\7F\EF\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk"], scratch_bytes = [0 : i32], thread_count = 1 : i32} : (tensor>, tensor<10xi8>, tensor<1x10xi16>) -> tensor> - %4 = "tfl.reshape"(%3, %cst_2) : (tensor>, tensor<2xi64>) -> tensor> - return %4 : tensor> -} diff --git a/experimental/xformer/Test/loadflashop.mlir b/experimental/xformer/Test/loadflashop.mlir deleted file mode 100644 index 23d6890a4..000000000 --- a/experimental/xformer/Test/loadflashop.mlir +++ /dev/null @@ -1,20 +0,0 @@ -// RUN: xcore-opt --mlir-io %s --xcore-write-flash-image --xcore-flash-image-file=/dev/null | FileCheck %s - -// CHECK-LABEL: valid -func @valid(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "flatten_input", outputs = "Identity"}} { - %cst = constant dense<[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]> : tensor<10xi8> - %cst_0 = constant dense<[[11, 12, 13, 14, 15, 16, 17, 18, 19, 10]]> : tensor<1x10xi16> - %cst_1 = constant dense<[-1, 1, 1, 32]> : tensor<4xi64> - %cst_2 = constant dense<[-1, 32]> : tensor<2xi64> - %cst_3 = constant dense<[-1, 32]> : tensor<2xi32> - %0 = "tfl.reshape"(%arg0, %cst_3) : (tensor>, tensor<2xi32>) -> tensor> - %1 = "tfl.reshape"(%0, %cst_1) : (tensor>, tensor<4xi64>) -> tensor> - // CHECK: xc.ld_flash - // CHECK: xc.ld_flash - // CHECK: xc.conv2d_v2 - %2 = "xc.ld_constant"(%cst) : (tensor<10xi8>) -> tensor<10xi8> - %3 = "xc.ld_constant"(%cst_0) : (tensor<1x10xi16>) -> tensor<1x10xi16> - %4 = "xc.conv2d_v2"(%1, %2, %3) {abstract_kernel_params = ["\00\00\00\00\01\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00 \00\00\00"], aggregate_fn_params = [" \08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \08\00\00\CA~=\18\FC\1C\86\1B\BE\0D\B0U\13\CC\16\B57\DA*\22I0\F9~\88c\D8K\E2\A1\F3P^\16W\8B\C0\85\F8\F5[\AB\825\05\DC\97, rQ\FCf\F6\A1\A2\B3\7F+\E5\F9\04\E1\CA\05\A8\F6\F6Iv\9BQ\B6M\B9\89\EA\1F\B1\1C\AD\8D-,C\BB\DF^\F0\1C>\82\E9\99G\AA\BB\12\D5c*\89m\03\9FP\97\14\AFP\AA\D42\A2\8C3\87P%\09M\DC\0CB\A2p\82y\BF|\13\A6\C4\F5%\D3WhW\D1\00#~\F4_\A5\F5\A2f4\85]k\8A\DD\93\0B\0B\DF\04\DD\82\AB\8A\97\91\DD\D4X\83\8A=_v=\85\A2\19\87\A4\E6\1A?F=\CC~\06\83\D1\DBU\A0\EC\82=\84%M\18\E1\D1\AB\C8\1D\8B\BE\D6h\C8\E8\F1\DD\EE`\F3\E1h75\A3\87\04/'\96\C9\10\AB\A2\147\FD\B3\C6\AE\08\F4\83JoK\93\CD\8EZ\\S\CB<\BEv[\CE\CA\B1\FB\FC\0AR\E4sV\04x\EA\99\A8z \FE+e\C9\84\AD\F2E\89\88\8B\C6\C5wa{>\BA\CF\E6\005\A5:\9F\8B\CA2\07\D0=\F2Jz\85\B7\17\CA\A5fM\DC\9F\91\1E\1Aj\DF\ED\A8I\DC\1DW\90\19\92\FA\84\11\15\9C\B7\AC\02\BD\03/\05\BFxk\BF\E4\AE\A2'p\F4d^\988M_\D7\B4!\CDn4Q\93\AE\D9\AC\B6K\0A\C4\D6\A2\16i<\B1M\A1\F2N\AD*\C0O\0CVs\E9\FA\CF\DBWEZw\9F\AF\A5bu\04{\A1!\EF\8C$&u\A9\1F&\A6\E6\22=\AEB\B8\D9\8A\F8\D7l\12\DA\09\98\10\07AP\A9yv\BC[xI\CAs\D6\A1,\E4\EF\DD\9E\F6\FA\D4\B9\B3\A6\B5j\A1&)d\0D\DA\DFV\E8\F0\F0f+\D5\AB\7Fq/\89\9A\15\81\BA2\ED`\EB\88\12\D4\C7\90i?\E7\98\AB:\E5\E2y\87\EA\93s\F4'\CBb\B1^\893\C3\C6\B6\BA\96$+\AF\EA\99\17\CE+O\B80\AC\10\DE\DCIl\B1\CATB\EA/\E9\AF\99g\00\01Y\BF/\82\A6\BF\EF0\D5k\A2\FA\1BM$\9A~@|\EFu\9By\A9>\99\E1;\0F\053G#\0B\A4\A8\1A^\E8W\07\EB`\98s\D4ZtV\1D\82A\C2\FF\13\E0\EF\F6MRP\A8\CE\22`\FC\BE\82\19\04}\B7\ED\FE\D8\197Yj\F5\BA^#f\C3\05\8F|vK\AB\E0k\D6qx\F0U\95{\D0\F1\F2\CA\B1N\FEI\C0\1990\04@\EB\0C\99\B4\9BjN\15\03\C0rd\D2\84\BA\96HZ\8CN:\8C\07@A\8C\B1DFq\C4u m\88b\10?Us\8F\8A\9C\BC\C9\A5\\\84\0E(f\8CF*\BF\FC\F72\BC\0A=k\AEG\0C2sq\B6X\07\FE\9A\22\F9c\03\BC\F7\15+r\EFOy\9E\E3\00\11#h_\A9\96\11\C5\FD\B9\82\EA,\D60}\96Z\8A .\0B\CB\D3/\AF\EC5\\\AA\DC#\8DM\8C\A7\94[TP\AD\BD+\16\87\06/8\06\D6[\C9 \F8\83C\869$EU\\\C6e\155\C7cK\CD\D4\1C\0A\19\A6E\A7\12\BC\DB\06\B5\EC\F2]rIn\D2\B6\B5DA\DA\C3N46M\A4\BE\10\16\12\C1\D7\CA=RRf\1D\A5\F6\A8\B5,\E6\0Bj\FF\EE\86C;D\E2\FD\97\08\A7\E9\06G\FBM\ECS\BE6Qe%1\14\81N\1F\DD7X\DF\9A\9D\F40\E3\1B\9F\F1\B8\A5o\AF\DB2\DF\B4\1DR\F6y\B0<\AD\CB\EAYD\D5v;M\EC\8F>f@\A6\8D,,\0EiJ\E0c\E6\E5\E8\DBR\94\E6%\03v\9DO\0A\96\BAX}\8E\CF\09\94|\06j\84\B3\FE\81H\A4-\F0\A65W\02?\BB6\B4\0A\D8B|\91\D3\22\BEw\E32\C4G#\EA\16\01|\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00"], conv2d_kernel_type = ["ValidDirect"], memcpy_fn_params = [" \00\00\00 \00\00\00"], output_transform_fn_params = ["\E4\00\00\00 \00\00\00 \00\00\00\00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\00\00\00\00\C1\0F\A9\BD\22\03\D5\F9u\F5\B9\B8\DA\00g\F3@\B1\C1\EBQ\0A4\DF\ED\16\BD\01{\10\12\E0.\D3S\D57\12\B7\03\D1\10u\E6\AE\E0\11\F0m\FD\A3\12\A1\19\9A\D6-\BC1\EE\C3\C5\7F\EF\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk"], scratch_bytes = [0 : i32], thread_count = 1 : i32} : (tensor>, tensor<10xi8>, tensor<1x10xi16>) -> tensor> - %5 = "tfl.reshape"(%4, %cst_2) : (tensor>, tensor<2xi64>) -> tensor> - return %5 : tensor> -} diff --git a/experimental/xformer/Test/padding.mlir.disabled b/experimental/xformer/Test/padding.mlir.disabled deleted file mode 100644 index 55cc9d6b0..000000000 --- a/experimental/xformer/Test/padding.mlir.disabled +++ /dev/null @@ -1,51 +0,0 @@ -// RUN: xcore-opt --mlir-io %s --xcore-apply-xcpatterns | FileCheck %s - -// CHECK-LABEL: replace_pad_negative_zeropoint -func @replace_pad_negative_zeropoint(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "zero_padding2d_input_int8", outputs = "Identity_int8"}} { - %0 = "tfl.pseudo_const"() {value = dense<[[0, 0], [0, 0], [2, 0], [0, 0]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> - // CHECK: xc.pad - // CHECK-SAME: {pad_value = -151587082 : i32} - %1 = "tfl.pad"(%arg0, %0) : (tensor>, tensor<4x2xi32>) -> tensor> - return %1 : tensor> -} - -// ----- - -// CHECK-LABEL: replace_pad_positive_zeropoint -func @replace_pad_positive_zeropoint(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "zero_padding2d_input_int8", outputs = "Identity_int8"}} { - %0 = "tfl.pseudo_const"() {value = dense<[[0, 0], [0, 0], [2, 0], [0, 0]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> - // CHECK: xc.pad - // CHECK-SAME: {pad_value = 168430090 : i32} - %1 = "tfl.pad"(%arg0, %0) : (tensor>, tensor<4x2xi32>) -> tensor> - return %1 : tensor> -} - -// ----- - -// CHECK-LABEL: replace_pad_with_invalid_shape -func @replace_pad_with_invalid_shape(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "zero_padding2d_input_int8", outputs = "Identity_int8"}} { - %0 = "tfl.pseudo_const"() {value = dense<[[0, 0], [0, 0], [2, 0]]> : tensor<3x2xi32>} : () -> tensor<3x2xi32> - // CHECK-NOT: xc.pad - %1 = "tfl.pad"(%arg0, %0) : (tensor>, tensor<3x2xi32>) -> tensor> - return %1 : tensor> -} - -// ----- - -// CHECK-LABEL: replace_pad_with_batchchannel_padding -func @replace_pad_with_batchchannel_padding(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "zero_padding2d_input_int8", outputs = "Identity_int8"}} { - %0 = "tfl.pseudo_const"() {value = dense<[[1, 1], [0, 0], [2, 0], [1, 1]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> - // CHECK-NOT: xc.pad - %1 = "tfl.pad"(%arg0, %0) : (tensor>, tensor<4x2xi32>) -> tensor> - return %1 : tensor> -} - -// ----- - -// CHECK-LABEL: replace_pad_with_invalid_bytes_per_pixel -func @replace_pad_with_invalid_bytes_per_pixel(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "zero_padding2d_input_int8", outputs = "Identity_int8"}} { - %0 = "tfl.pseudo_const"() {value = dense<[[0, 0], [0, 0], [2, 0], [0, 0]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> - // CHECK-NOT: xc.pad - %1 = "tfl.pad"(%arg0, %0) : (tensor>, tensor<4x2xi32>) -> tensor> - return %1 : tensor> -} diff --git a/experimental/xformer/Test/translate-to-customops.mlir b/experimental/xformer/Test/translate-to-customops.mlir deleted file mode 100644 index d00767bdb..000000000 --- a/experimental/xformer/Test/translate-to-customops.mlir +++ /dev/null @@ -1,22 +0,0 @@ -// RUN: xcore-opt --mlir-io %s --xcore-translate-to-customop | FileCheck %s - -// CHECK-LABEL: activation_lowering -func @activation_lowering(%arg0: tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> attributes {tf.entry_function = {inputs = "lambda_input_int8", outputs = "Identity_int8"}} { - %cst = constant dense<"0x828486888A8C8E90929496989A9C9EA0A2A4A6A8AAACAEB0B2B4B6B8BABCBEC0C2C4C6C8CACCCED0D2D4D6D8DADCDEE0E2E4E6E8EAECEEF0F2F4F6F8FAFCFE00020406080A0C0E10121416181A1C1E20222426282A2C2E30323436383A3C3E40424446484A4C4E50525456585A5C5E60626466686A6C6E70727476787A7C7E7F8080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080"> : tensor<256xi8> -// CHECK: tfl.custom -// CHECK-SAME: XC_lookup_8 - %0 = "xc.lookup_8"(%arg0, %cst) : (tensor<1x12x4x7x!quant.uniform>, tensor<256xi8>) -> tensor<1x12x4x7x!quant.uniform> - return %0 : tensor<1x12x4x7x!quant.uniform> -} - -// ----- - -// CHECK-LABEL: replace_pad -func @replace_pad(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "zero_padding2d_input_int8", outputs = "Identity_int8"}} { - %cst = constant dense<[[0, 0], [0, 0], [2, 0], [0, 0]]> : tensor<4x2xi32> -// CHECK: tfl.custom -// CHECK-SAME: XC_pad -// CHECK-SAME: custom_option = opaque<"xc", "0x7061645F76616C756500010B010101FF04022401"> - %0 = "xc.pad"(%arg0, %cst) {pad_value = -1 : i32} : (tensor>, tensor<4x2xi32>) -> tensor> - return %0 : tensor> - } diff --git a/experimental/xformer/Transforms/ApplyLoadConstantOpPatterns.cpp b/experimental/xformer/Transforms/ApplyLoadConstantOpPatterns.cpp deleted file mode 100644 index 24c4d6fa0..000000000 --- a/experimental/xformer/Transforms/ApplyLoadConstantOpPatterns.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "IR/XCoreOps.h" -#include "Transforms/Options.h" - -#include "mlir/Pass/Pass.h" -#include "mlir/Transforms/GreedyPatternRewriteDriver.h" -#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" - -namespace mlir { -namespace xcore { - -namespace { -// Apply generated patterns. -struct ApplyLoadConstantOpPatterns - : public PassWrapper { - void getDependentDialects(DialectRegistry ®istry) const final { - registry.insert(); - } - void runOnFunction() override; -}; - -bool shouldBeLoadedExternally(Attribute values) { - // values might be UnitAttr or BoolAttr which are too small to be loaded - // externally anyway - auto totalSizeInBits = 0; - if (values.isa()) { - auto valuesAttr = values.cast(); - totalSizeInBits = - (valuesAttr.getNumElements() * - valuesAttr.getType().getElementType().getIntOrFloatBitWidth()); - } - return totalSizeInBits / CHAR_BIT > loadExternallyIfLargerOption; -} - -#include "Transforms/GeneratedLoadConstantOpPatterns.inc" - -void ApplyLoadConstantOpPatterns::runOnFunction() { - auto f = getFunction(); - if (flashImageFilenameOption.empty()) { - f.emitError("Flash image file option should be provided to run this pass!"); - signalPassFailure(); - return; - } - - OwningRewritePatternList patterns(&getContext()); - auto func = getFunction(); - populateWithGenerated(patterns); - (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); -} -} // namespace - -// Creates an instance of the ApplyLoadConstantOpPatterns pass. -std::unique_ptr> createApplyLoadConstantOpPatternsPass() { - return std::make_unique(); -} - -static PassRegistration - pass("xcore-apply-loadconstantop-patterns", - "Apply load constant op optimization patterns."); - -} // namespace xcore -} // namespace mlir diff --git a/experimental/xformer/Transforms/ApplyTFLPatterns.cpp b/experimental/xformer/Transforms/ApplyTFLPatterns.cpp deleted file mode 100644 index 49c10d49a..000000000 --- a/experimental/xformer/Transforms/ApplyTFLPatterns.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "IR/XCoreOps.h" - -#include "larq_compute_engine/mlir/ir/lce_ops.h" -#include "mlir/Pass/Pass.h" -#include "mlir/Transforms/GreedyPatternRewriteDriver.h" -#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" -#include "tensorflow/core/framework/kernel_shape_util.h" - -namespace mlir { -namespace xcore { - -namespace { -// Apply generated TFL patterns. -struct ApplyTFLPatterns : public PassWrapper { - void getDependentDialects(DialectRegistry ®istry) const final { - registry.insert(); - } - void runOnFunction() override; -}; - -SmallVector getBConv2DPaddingValues(PatternRewriter &rewriter, - mlir::lq::Bconv2dOp conv2DOp) { - auto inputType = conv2DOp.input().getType().dyn_cast(); - auto filterType = conv2DOp.filter().getType().dyn_cast(); - auto inputHeight = inputType.getDimSize(1); - auto inputWidth = inputType.getDimSize(2); - auto filterHeight = filterType.getDimSize(1); - auto filterWidth = filterType.getDimSize(2); - - // Find padding values - int64_t newHeight, newWidth; - int64_t padTop, padBottom, padLeft, padRight; - if (tensorflow::GetWindowedOutputSizeVerboseV2( - inputHeight, filterHeight, conv2DOp.dilation_height_factor(), - conv2DOp.stride_height(), tensorflow::Padding::SAME, &newHeight, - &padTop, &padBottom) != tensorflow::Status::OK()) { - conv2DOp->emitError("Could not obtain SAME padding values for BConv2D!"); - } - if (tensorflow::GetWindowedOutputSizeVerboseV2( - inputWidth, filterWidth, conv2DOp.dilation_width_factor(), - conv2DOp.stride_width(), tensorflow::Padding::SAME, &newWidth, - &padLeft, &padRight) != tensorflow::Status::OK()) { - conv2DOp->emitError("Could not obtain SAME padding values for BConv2D!"); - } - - std::vector paddingValues{0, - 0, - static_cast(padTop), - static_cast(padBottom), - static_cast(padLeft), - static_cast(padRight), - 0, - 0}; - - RankedTensorType type = RankedTensorType::get({4, 2}, rewriter.getI32Type()); - auto attr = DenseIntElementsAttr::get(type, paddingValues); - auto paddingOp = rewriter.create(conv2DOp->getLoc(), type, attr); - - // Obtain the output type so that we can use it to denote the returnType for - // the PadOp in Tablegen DRR - auto batch = 1; - auto depth = inputType.getDimSize(3); - auto outputHeight = inputHeight + padTop + padBottom; - auto outputWidth = inputWidth + padLeft + padRight; - std::vector dummy(batch * outputHeight * outputWidth * depth, 0); - RankedTensorType outputType = RankedTensorType::get( - {batch, outputHeight, outputWidth, depth}, rewriter.getI32Type()); - auto outputTypeOp = - rewriter.create(conv2DOp->getLoc(), outputType, - DenseIntElementsAttr::get(outputType, dummy)); - - return SmallVector({paddingOp, outputTypeOp}); -} - -#include "Transforms/GeneratedTFLPatterns.inc" - -void ApplyTFLPatterns::runOnFunction() { - OwningRewritePatternList patterns(&getContext()); - auto func = getFunction(); - - populateWithGenerated(patterns); - (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); -} -} // namespace - -// Creates an instance of the ApplyTFLPatterns pass. -std::unique_ptr> createApplyTFLPatternsPass() { - return std::make_unique(); -} - -static PassRegistration - pass("xcore-apply-tflpatterns", - "Apply generated TFL optimization patterns."); - -} // namespace xcore -} // namespace mlir diff --git a/experimental/xformer/Transforms/ApplyXCPatterns.cpp b/experimental/xformer/Transforms/ApplyXCPatterns.cpp deleted file mode 100644 index 32ab476f7..000000000 --- a/experimental/xformer/Transforms/ApplyXCPatterns.cpp +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "IR/XCoreOps.h" - -#include "larq_compute_engine/mlir/ir/lce_ops.h" -#include "mlir/Pass/Pass.h" -#include "mlir/Transforms/GreedyPatternRewriteDriver.h" -#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" -#include - -namespace mlir { -namespace xcore { - -namespace { -// Apply generated XC patterns. -struct ApplyXCPatterns : public PassWrapper { - void getDependentDialects(DialectRegistry ®istry) const final { - registry.insert(); - } - void runOnFunction() override; -}; - -// TODO: Remove when we have fusing of Pad and Conv2D in xformer2 -// Replacing pad when there is a following Conv2D after a Pad is breaking fusing -// passes in xformer1 -bool hasNoFollowingConv2D(Value outputVal) { - if (outputVal.hasOneUse()) { - if (llvm::isa(*outputVal.getUsers().begin())) { - auto op = dyn_cast(*outputVal.getUsers().begin()); - if (op.custom_code().startswith("XC_bconv2d")) - return false; - } else if (llvm::isa( - *outputVal.getUsers().begin()) || - llvm::isa(*outputVal.getUsers().begin())) { - return false; - } - } - return true; -} - -IntegerAttr getPadValue(PatternRewriter &rewriter, Value inputVal) { - auto inputType = inputVal.getType().cast(); - auto elementType = inputType.getElementType(); - - // For quantized input type, padValue is the zero_point - // Otherwise, it is zero - int padValue = 0; - if (elementType.isa()) { - auto inputQType = elementType.dyn_cast(); - padValue = inputQType.getZeroPoint(); - elementType = elementType.cast().getStorageType(); - } - - assert(elementType.isIntOrFloat() && - "Type has to be I32, F32, or I8 if quantized!"); - // padValue has to be four bytes - // For input type of int8, this would be arranged as b,b,b,b - if (elementType.isInteger(8)) { - padValue = padValue << 24 | (padValue << 16 & 0x00FFFFFF) | - (padValue << 8 & 0x0000FFFF) | (padValue & 0x000000FF); - } - - return rewriter.getI32IntegerAttr(padValue); -} - -DenseElementsAttr getLookupTable(PatternRewriter &rewriter, Operation *op) { - llvm::SmallVector inputVector; - inputVector.resize(256); - - // The inputvector has 256 input values in the following order, - // 0, 1, 2... -> 127 and - // -128, -127, -126... -> -1 - std::iota(inputVector.begin(), inputVector.begin() + 128, 0); - std::iota(inputVector.begin() + 128, inputVector.end(), -128); - - // Get input scale and input zero point - RankedTensorType inputType = - op->getOperand(0).getType().dyn_cast(); - auto inputQType = - inputType.getElementType().dyn_cast(); - auto inputScale = inputQType.getScale(); - auto inputZeroPoint = inputQType.getZeroPoint(); - - // Get output scale and output zero point - RankedTensorType outputType = - op->getResult(0).getType().dyn_cast(); - auto outputQType = - outputType.getElementType().dyn_cast(); - auto outputScale = outputQType.getScale(); - assert(outputScale != 0 && "Output scale of zero is not supported!"); - auto outputZeroPoint = outputQType.getZeroPoint(); - - // Dequantize the input vector - llvm::SmallVector dequantizedVector; - std::transform(inputVector.begin(), inputVector.end(), - std::back_inserter(dequantizedVector), [&](int8_t n) { - return static_cast( - (static_cast(n) - inputZeroPoint) * inputScale); - }); - - // Apply the activation function to the dequantized vector - if (isa(op)) { - std::for_each(dequantizedVector.begin(), dequantizedVector.end(), - [](double &x) { x = std::max(x, 0.0); }); - } else if (isa(op)) { - std::for_each(dequantizedVector.begin(), dequantizedVector.end(), - [](double &x) { x = std::min(std::max(x, 0.0), 6.0); }); - } else if (isa(op)) { - std::for_each(dequantizedVector.begin(), dequantizedVector.end(), - [](double &x) { x = tanh(x); }); - } else if (isa(op)) { - std::for_each(dequantizedVector.begin(), dequantizedVector.end(), - [](double &x) { x = 1.0 / (1.0 + exp(-x)); }); - } else { - llvm_unreachable("Unsupported op!"); - } - - // Quantize to create the result vector - llvm::SmallVector resultVector; - std::transform( - dequantizedVector.begin(), dequantizedVector.end(), - std::back_inserter(resultVector), [&](double n) { - int32_t t = - static_cast(round(n / outputScale)) + outputZeroPoint; - return static_cast(std::max(std::min(t, INT8_MAX), INT8_MIN)); - }); - - ShapedType lookupTableType = - RankedTensorType::get({256}, rewriter.getIntegerType(8)); - auto lookupTableAttr = - DenseElementsAttr::get(lookupTableType, resultVector); - return lookupTableAttr; -} - -#include "Transforms/GeneratedXCPatterns.inc" - -void ApplyXCPatterns::runOnFunction() { - OwningRewritePatternList patterns(&getContext()); - auto func = getFunction(); - - populateWithGenerated(patterns); - (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); -} -} // namespace - -// Creates an instance of the ApplyXCPatterns pass. -std::unique_ptr> createApplyXCPatternsPass() { - return std::make_unique(); -} - -static PassRegistration - pass("xcore-apply-xcpatterns", "Apply generated XC optimization patterns."); - -} // namespace xcore -} // namespace mlir diff --git a/experimental/xformer/Transforms/ConvPatterns.h b/experimental/xformer/Transforms/ConvPatterns.h deleted file mode 100644 index b6071d196..000000000 --- a/experimental/xformer/Transforms/ConvPatterns.h +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#ifndef XFORMER_TRANSFORMS_CONVPATTERNS_H -#define XFORMER_TRANSFORMS_CONVPATTERNS_H - -#include "IR/XCoreOps.h" - -#include "larq_compute_engine/mlir/ir/lce_ops.h" -#include "lib_nn/api/Conv2d.hpp" -#include "mlir/Pass/Pass.h" -#include "mlir/Transforms/GreedyPatternRewriteDriver.h" -#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" - -namespace mlir { -namespace xcore { - -struct TFLConvArgs { - int outputHeight, outputWidth, outputDepth, outputZeroPoint; - int inputHeight, inputWidth, inputDepth, inputZeroPoint; - int filterHeight, filterWidth, filterDepth; - std::vector filter; - std::vector bias; - std::vector effectiveMultiplier; - int8_t padValue; - bool toBePadded; - nn::padding_t padding; - nn::ImageGeometry Y; - nn::ImageGeometry X; - nn::WindowGeometry K; -}; - -struct BConvArgs { - int outputHeight, outputWidth, outputDepth; - int inputHeight, inputWidth, inputDepth; - int filterHeight, filterWidth, filterDepth; - bool binaryOutput; - int32_t clampMin, clampMax; - std::vector filter; - std::vector postActivationBias; - std::vector postActivationMultiplier; - std::vector threshold; - int8_t padValue; - nn::ImageGeometry Y; - nn::ImageGeometry X; - nn::WindowGeometry K; -}; - -// -// XC Conv2D Base class -// ConcreteType would be TFL Conv types or Larq BConv2D -// Replaces them with XC Conv2D -template -class ReplaceWithXCConv2DBase : public OpRewritePattern { -public: - ReplaceWithXCConv2DBase(MLIRContext *context) - : OpRewritePattern(context) {} - - LogicalResult matchAndRewrite(ConvOpType op, - PatternRewriter &rewriter) const override; -}; - -// -// -// -// Handle Larq BNN Conv2D -class ReplaceBConv2DPattern - : public ReplaceWithXCConv2DBase { -public: - using BaseType = - ReplaceWithXCConv2DBase; - ReplaceBConv2DPattern(MLIRContext *context) : BaseType(context) {} - - LogicalResult checkIfValid(lq::Bconv2dOp op) const; - - LogicalResult getArgs(lq::Bconv2dOp op, BConvArgs &args) const; - - LogicalResult getKernelType(const BConvArgs &args, Conv2DType &kt) const; - - LogicalResult getSerializedParamsAndTensors( - const BConvArgs &args, const Conv2DType &kt, - llvm::SmallVector &strParams, - std::vector &weightsData, - std::vector &mulsBiasesOrThresholdsData, - int &scratchBytes) const; - -private: - LogicalResult getBConv2DValidDirectBinaryParams( - const BConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &thresholdsData, - int &scratchBytes) const; - - LogicalResult getBConv2DValidIndirectBinaryParams( - const BConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &thresholdsData, - int &scratchBytes) const; - - LogicalResult getBConv2DValidDirectInt8Params( - const BConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &mulsBiasesData, - int &scratchBytes) const; - - LogicalResult getBConv2DValidIndirectInt8Params( - const BConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &mulsBiasesData, - int &scratchBytes) const; -}; - -// -// -// TFL Conv2D Base class -// TFLConvOpType would be XC_FakeConv2D or XC_FakeDepthwiseConv2D -template -class ReplaceConv2DBase : public ReplaceWithXCConv2DBase< - ReplaceConv2DBase, - TFLConvOpType, TFLConvArgs> { -public: - using BaseType = - ReplaceWithXCConv2DBase, - TFLConvOpType, TFLConvArgs>; - ReplaceConv2DBase(MLIRContext *context) : BaseType(context) {} - - LogicalResult checkIfValid(TFLConvOpType op) const { return success(); } - - LogicalResult getArgs(TFLConvOpType op, TFLConvArgs &args) const; - - LogicalResult getKernelType(const TFLConvArgs &args, Conv2DType &kt) const { - if (failed( - static_cast(this)->getKernelType(args, kt))) { - return failure(); - } - return success(); - } - - LogicalResult - getSerializedParamsAndTensors(const TFLConvArgs &args, const Conv2DType &kt, - llvm::SmallVector &strParams, - std::vector &weightsData, - std::vector &mulsBiasesData, - int &scratchBytes) const { - if (failed(static_cast(this) - ->getSerializedParamsAndTensors(args, kt, strParams, - weightsData, mulsBiasesData, - scratchBytes))) { - return failure(); - } - return success(); - } -}; - -// -// -// -// Handle XC_FakeConv2D -class ReplaceConv2DPattern - : public ReplaceConv2DBase { -public: - using BaseType = ReplaceConv2DBase; - ReplaceConv2DPattern(MLIRContext *context) : BaseType(context) {} - - LogicalResult getKernelType(const TFLConvArgs &args, Conv2DType &kt) const; - - // Conv is quantized along dimension 0 - int getQuantizationIndex() const { return 0; } - - LogicalResult - getSerializedParamsAndTensors(const TFLConvArgs &args, const Conv2DType &kt, - llvm::SmallVector &strParams, - std::vector &weightsData, - std::vector &mulsBiasesData, - int &scratchBytes) const; - -private: - LogicalResult getConv2DPaddedIndirectParams( - const TFLConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &mulsBiasesData, - int &scratchBytes) const; - - LogicalResult getConv2DValidIndirectParams( - const TFLConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &mulsBiasesData, - int &scratchBytes) const; - - LogicalResult getConv2DValidDirectParams( - const TFLConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &mulsBiasesData, - int &scratchBytes) const; -}; - -// -// -// -// Handle XC_FakeDepthwiseConv2D -class ReplaceDepthwiseConv2DPattern - : public ReplaceConv2DBase { -public: - using BaseType = - ReplaceConv2DBase; - ReplaceDepthwiseConv2DPattern(MLIRContext *context) : BaseType(context) {} - - LogicalResult getKernelType(const TFLConvArgs &args, Conv2DType &kt) const; - - // DepthwiseConv is quantized along dimension 3 - int getQuantizationIndex() const { return 3; } - - LogicalResult - getSerializedParamsAndTensors(const TFLConvArgs &args, const Conv2DType &kt, - llvm::SmallVector &strParams, - std::vector &weightsData, - std::vector &mulsBiasesData, - int &scratchBytes) const; - -private: - LogicalResult getDepthwiseConv2DValidDirectParams( - const TFLConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &mulsBiasesData, - int &scratchBytes) const; - - LogicalResult getDepthwiseConv2DPaddedIndirectParams( - const TFLConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &mulsBiasesData, - int &scratchBytes) const; -}; - -} // namespace xcore -} // namespace mlir - -#endif // XFORMER_TRANSFORMS_CONVPATTERNS_H diff --git a/experimental/xformer/Transforms/ConvPatterns.td b/experimental/xformer/Transforms/ConvPatterns.td deleted file mode 100644 index 70383647e..000000000 --- a/experimental/xformer/Transforms/ConvPatterns.td +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -include "mlir/Dialect/StandardOps/IR/Ops.td" -include "tensorflow/compiler/mlir/lite/ir/tfl_ops.td" - -include "IR/XCoreOps.td" - -def ShouldReduceMemory : Constraint>; - -def CreateNoneAttrValue : NativeCodeCall<"$_builder.getUnitAttr()">; - -// Check that depth is a multiple of four -def HasValidDepth - : Constraint< - CPred<"$0.getType().cast().getDimSize(3) % 4 == 0">>; - -// TFL_Conv2D() -> XC_FakeConv2D() -def : Pat<(TFL_Conv2DOp: $output TensorOf<[QI8]>:$input, TensorOf<[QI8]>:$f, TensorOf<[I32,QI32]>:$b, $dh, $dw, $faf, $p, $sh, $sw), - (XC_FakeConv2DOp $input, $f, $b, $dh, $dw, $faf, $p, (ConstantOp (CreateNoneAttrValue)), $sh, $sw),[ - (HasValidDepth $input), - (HasValidDepth $output) - ]>; - -// TFL_DepthwiseConv2D() -> XC_FakeDepthwiseConv2D() -def : Pat<(TFL_DepthwiseConv2DOp: $output TensorOf<[QI8]>:$input, TensorOf<[QI8]>:$f, TensorOf<[I32,QI32]>:$b, $dh, $dw, $faf, $p, $sh, $sw, $dm), - (XC_FakeDepthwiseConv2DOp $input, $f, $b, $dh, $dw, $faf, $p, (ConstantOp (CreateNoneAttrValue)), $sh, $sw, $dm),[ - (HasValidDepth $input), - (HasValidDepth $output) - ]>; - -// Replace XC_FakeDepthwiseConv2D(Pad()) of VALID padding with -// XC_FakeDepthwiseConv2D() of EXPLICIT padding -def : Pat<(XC_FakeDepthwiseConv2DOp(TFL_PadOp $input, $padding_values), $f, $b, - $dh, $dw, $faf, ConstantAttr, $dummy_values, $sh, - $sw, $dm), - (XC_FakeDepthwiseConv2DOp $input, $f, $b, $dh, $dw, $faf, - ConstantAttr, $padding_values, $sh, $sw, $dm), - [(ShouldReduceMemory)]>; \ No newline at end of file diff --git a/experimental/xformer/Transforms/ConvPatternsLCE.cpp b/experimental/xformer/Transforms/ConvPatternsLCE.cpp deleted file mode 100644 index 0e03904ec..000000000 --- a/experimental/xformer/Transforms/ConvPatternsLCE.cpp +++ /dev/null @@ -1,471 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "Transforms/ConvPatterns.h" - -namespace mlir { -namespace xcore { - -// Handle Larq BNN Conv2D -LogicalResult -ReplaceBConv2DPattern::checkIfValid(lq::Bconv2dOp conv2DOp) const { - // For BConv2D, we emit error messages since we don't have a reference op - // The compilation will fail as we haven't defined a TFL custom op for BConv2D - - // Check for invalid types and return - // Check filter is I32 - if (!conv2DOp.filter() - .getType() - .template cast() - .getElementType() - .isInteger(32)) { - conv2DOp.emitError("Filter type must be int32(packed binary) for BConv2D!"); - return failure(); - } - - // Check output is I32 or QI8 - if (!(conv2DOp.output() - .getType() - .template cast() - .getElementType() - .template isa() && - conv2DOp.output() - .getType() - .template cast() - .getElementType() - .template cast() - .isSigned() && - conv2DOp.output() - .getType() - .template cast() - .getElementType() - .template cast() - .getStorageTypeIntegralWidth() == 8) && - !(conv2DOp.output() - .getType() - .template cast() - .getElementType() - .isInteger(32))) { - conv2DOp.emitError( - "Output type must be int32(packed binary) or int8 for BConv2D!"); - return failure(); - } - - // If we have QI8 output, check activation function is RELU - if (conv2DOp.output() - .getType() - .template cast() - .getElementType() - .template isa() && - !(conv2DOp.fused_activation_function() == "RELU")) { - conv2DOp.emitError("Activation function must be RELU for BConv2D int8!"); - return failure(); - } - - // Check padding is VALID - if (!(conv2DOp.padding() == "VALID")) { - conv2DOp.emitError("Only VALID padding is supported for BConv2D!"); - return failure(); - } - - // Check channels_in is a multiple of 32 - if (!(conv2DOp.channels_in() % 32 == 0)) { - conv2DOp.emitError( - "Only channels_in of multiples of 32 is supported for BConv2D!"); - return failure(); - } - - auto outputType = - conv2DOp.output().getType().template dyn_cast(); - auto outputDepth = outputType.getDimSize(3); - // If we have QI8 output, check output depth is a multiple of four - if (conv2DOp.output() - .getType() - .template cast() - .getElementType() - .template isa() && - (outputDepth % 4 != 0)) { - conv2DOp.emitError( - "Output depth must be a multiple of four for BConv2D int8!"); - return failure(); - } - - return success(); -} - -LogicalResult ReplaceBConv2DPattern::getArgs(lq::Bconv2dOp conv2DOp, - BConvArgs &args) const { - // Retrieve remaining args - // Find if binary output for the BConv2D - bool binaryOutput = true; - if (conv2DOp.output() - .getType() - .template cast() - .getElementType() - .template isa()) { - binaryOutput = false; - } - - // For binary output, convert depth to bits which is the number of input and - // output channels - // For int8 output, convert - // - input depth to bits which is the number of input channels - // - filter depth which is of type int32 to number of int8s which is the - // number of output channels - // - output depth is already of int8 type which should be the correct number - // of output channels - args.inputDepth *= sizeof(int32_t) * CHAR_BIT; - if (binaryOutput) { - args.outputDepth *= sizeof(int32_t) * CHAR_BIT; - args.filterDepth *= sizeof(int32_t) * CHAR_BIT; - } else { - args.filterDepth *= sizeof(int32_t); - } - - // Get filter values - auto filterConstOp = - dyn_cast(conv2DOp.filter().getDefiningOp()); - auto filter = filterConstOp.value().cast(); - auto filterVector = std::vector{filter.getValues().begin(), - filter.getValues().end()}; - - std::vector biasVector; - std::vector multiplierVector; - std::vector thresholdVector; - if (binaryOutput) { - // Get threshold values - auto thresholdConstOp = - dyn_cast(conv2DOp.output_threshold().getDefiningOp()); - auto threshold = thresholdConstOp.value().cast(); - thresholdVector = - std::vector{threshold.getValues().begin(), - threshold.getValues().end()}; - } else { - // Get bias values - auto biasConstOp = dyn_cast( - conv2DOp.post_activation_bias().getDefiningOp()); - auto biases = biasConstOp.value().cast(); - biasVector = std::vector{biases.getValues().begin(), - biases.getValues().end()}; - - // Get multiplier values - auto multiplierConstOp = dyn_cast( - conv2DOp.post_activation_multiplier().getDefiningOp()); - auto multipliers = multiplierConstOp.value().cast(); - multiplierVector = - std::vector{multipliers.getValues().begin(), - multipliers.getValues().end()}; - - // Fuse the back-transformation and int8 scale/zero-point into - // the output transform multiplier/bias - // Based on OneTimeSetup() in - // https://github.com/larq/compute-engine/blob/main/larq_compute_engine/tflite/kernels/bconv2d.cc#L353 - auto outputType = - conv2DOp.output().getType().template dyn_cast(); - auto outputQType = - outputType.getElementType() - .template dyn_cast(); - auto outputScale = outputQType.getScale(); - auto outputZeroPoint = outputQType.getZeroPoint(); - - int32_t backtransformAdd = - args.filterHeight * args.filterWidth * conv2DOp.channels_in(); - - for (int i = 0; i < args.outputDepth; ++i) { - auto postMul = multiplierVector[i]; - auto postBias = biasVector[i]; - multiplierVector[i] = -1 * postMul / outputScale; - biasVector[i] = - (postBias + static_cast(backtransformAdd) * postMul) / - outputScale + - outputZeroPoint; - } - - // Initialize min and max clamp values for RELU - // Based on CalculateActivationRange() in - // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/kernels/kernel_util.h#L266 - assert(conv2DOp.fused_activation_function() == "RELU" && - "Activation function should be RELU for the clamp value " - "initialization!"); - int32_t nominalClampMin = 0; - int32_t nominalClampMax = std::numeric_limits::max(); - - nominalClampMin = std::max(nominalClampMin, -1 * backtransformAdd); - nominalClampMax = std::min(nominalClampMax, backtransformAdd); - args.clampMin = -1 * nominalClampMax + backtransformAdd; - args.clampMax = -1 * nominalClampMin + backtransformAdd; - } - - // Init lib_nn structs - // Output could be int8 or binary - args.Y = nn::ImageGeometry(args.outputHeight, args.outputWidth, - args.outputDepth, binaryOutput ? 1 : 8); - // Input is in binary - args.X = - nn::ImageGeometry(args.inputHeight, args.inputWidth, args.inputDepth, 1); - args.K = nn::WindowGeometry( - args.filterHeight, args.filterWidth, args.filterDepth, 0, 0, - conv2DOp.stride_height(), conv2DOp.stride_width(), 1, - conv2DOp.dilation_height_factor(), conv2DOp.dilation_width_factor()); - - // TODO, we are not padding at the moment, but the pad value might have to be - // changed for BNNs - args.padValue = 0; - args.binaryOutput = binaryOutput; - args.filter = filterVector; - args.postActivationBias = biasVector; - args.postActivationMultiplier = multiplierVector; - args.threshold = thresholdVector; - - return success(); -} - -LogicalResult ReplaceBConv2DPattern::getKernelType(const BConvArgs &args, - Conv2DType &kt) const { - // In case of binary output, since the input and output types are int32(packed - // binary), they will always be a multiple of 32 channels - // Hence we don't need to check for that case - if (args.inputDepth % 256 == 0 && args.binaryOutput) { - kt = Conv2DType::BNNValidDirectBinary; - } else if (args.inputDepth % 256 == 0 && args.outputDepth % 16 == 0) { - kt = Conv2DType::BNNValidDirectInt8; - } else if (args.binaryOutput) { - kt = Conv2DType::BNNValidIndirectBinary; - } else { - kt = Conv2DType::BNNValidIndirectInt8; - } - - return success(); -} - -LogicalResult ReplaceBConv2DPattern::getSerializedParamsAndTensors( - const BConvArgs &args, const Conv2DType &kt, - llvm::SmallVector &strParams, std::vector &weightsData, - std::vector &thresholdsData, int &scratchBytes) const { - switch (kt) { - case Conv2DType::BNNValidDirectBinary: - if (failed(getBConv2DValidDirectBinaryParams( - args, strParams, weightsData, thresholdsData, scratchBytes))) { - return failure(); - } - break; - case Conv2DType::BNNValidIndirectBinary: - if (failed(getBConv2DValidIndirectBinaryParams( - args, strParams, weightsData, thresholdsData, scratchBytes))) { - return failure(); - } - break; - case Conv2DType::BNNValidDirectInt8: - if (failed(getBConv2DValidDirectInt8Params(args, strParams, weightsData, - thresholdsData, scratchBytes))) { - return failure(); - } - break; - case Conv2DType::BNNValidIndirectInt8: - if (failed(getBConv2DValidIndirectInt8Params( - args, strParams, weightsData, thresholdsData, scratchBytes))) { - return failure(); - } - break; - default: - // This shouldn't happen! - return failure(); - } - return success(); -} - -LogicalResult ReplaceBConv2DPattern::getBConv2DValidDirectBinaryParams( - const BConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &thresholdsData, - int &scratchBytes) const { - nn::DerefInputFn::Params imToColParams(args.X, args.K); - - std::array filterShape = {args.outputDepth, args.filterHeight, - args.filterWidth, args.inputDepth}; - nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( - (int8_t *)args.filter.data(), filterShape, 1, args.padValue); - - nn::MatMulBinaryDirectFn::Params afParams(args.X, args.K, args.inputDepth); - - // adjust the thresholds from xorpopcount space - // to xcore space - auto adjustedThresholds = nn::OT_binary::adjust_thresholds( - args.threshold, args.inputDepth, args.K, rw); - - nn::OutputTransformFn::pad_final_access(adjustedThresholds, VPU_INT16_EPV, - (int16_t)args.padValue); - - auto ir = nn::ImageRegion(0, 0, 0, args.Y.height, args.Y.width, args.Y.depth); - nn::Filter2D::Params akParams(args.Y, ir, VPU_INT8_ACC_PERIOD); - - // TODO: Check serialization - std::string akpStr = akParams.serialise(); - std::string mfStr = imToColParams.serialise(); - std::string afStr = afParams.serialise(); - std::string otStr = ""; // otParams.serialise(); - - strParams.push_back(akpStr); - strParams.push_back(mfStr); - strParams.push_back(afStr); - strParams.push_back(otStr); - weightsData = rw.weights; - thresholdsData = adjustedThresholds; - scratchBytes = 0; - - return success(); -} - -LogicalResult ReplaceBConv2DPattern::getBConv2DValidIndirectBinaryParams( - const BConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &thresholdsData, - int &scratchBytes) const { - nn::ImToColValid::Params imToColParams(args.X, args.K, args.inputDepth); - - std::array filterShape = {args.outputDepth, args.filterHeight, - args.filterWidth, args.inputDepth}; - nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( - (int8_t *)args.filter.data(), filterShape, 1, args.padValue); - - const int elementsPerByte = 8; - int inputBytes = - args.filterHeight * args.filterWidth * args.inputDepth / elementsPerByte; - nn::MatMulBinary::Params afParams(args.outputDepth, inputBytes); - - // adjust the thresholds from xorpopcount space - // to xcore space - auto adjustedThresholds = nn::OT_binary::adjust_thresholds( - args.threshold, args.inputDepth, args.K, rw); - - nn::OutputTransformFn::pad_final_access(adjustedThresholds, VPU_INT16_EPV, - (int16_t)args.padValue); - - auto ir = nn::ImageRegion(0, 0, 0, args.Y.height, args.Y.width, args.Y.depth); - nn::Filter2D::Params akParams(args.Y, ir, VPU_INT8_ACC_PERIOD); - - // TODO: Check serialization - std::string akpStr = akParams.serialise(); - std::string mfStr = imToColParams.serialise(); - std::string afStr = afParams.serialise(); - std::string otStr = ""; // otParams.serialise(); - - strParams.push_back(akpStr); - strParams.push_back(mfStr); - strParams.push_back(afStr); - strParams.push_back(otStr); - weightsData = rw.weights; - thresholdsData = adjustedThresholds; - scratchBytes = nn::MatMulInt8::get_scratch_mem_bytes(inputBytes) + 32; - - return success(); -} - -LogicalResult ReplaceBConv2DPattern::getBConv2DValidDirectInt8Params( - const BConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &mulsBiasesData, - int &scratchBytes) const { - nn::DerefInputFn::Params imToColParams(args.X, args.K); - - std::array filterShape = {args.outputDepth, args.filterHeight, - args.filterWidth, args.inputDepth}; - nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( - (int8_t *)args.filter.data(), filterShape, 1, args.padValue); - - nn::MatMulBinaryDirectFn::Params afParams(args.X, args.K, args.inputDepth); - - int receptiveVolume = args.filterHeight * args.filterWidth * args.inputDepth; - nn::MulsAndBias mulAndBiases = nn::OT_int8_clamped::canonicalise_mul_and_bias( - args.postActivationMultiplier, args.postActivationBias, receptiveVolume, - args.clampMin, args.clampMax, args.outputDepth); - auto accuOverlaps = nn::OT_int8_clamped::get_accumulator_overlaps( - receptiveVolume, args.outputDepth, rw); - nn::QuantisationParams qp = - nn::OutputTransformFnInt8::quantise_activation(mulAndBiases); - - auto serialisedOffsetsMultipliersAndBiases = - nn::OutputTransformFn::serialise_memory(accuOverlaps, qp.multipliers, - qp.biases); - nn::OutputTransformFn::pad_final_access(serialisedOffsetsMultipliersAndBiases, - VPU_INT16_EPV, - (int16_t)args.padValue); - - nn::OT_int8_clamped::Params otParams((int32_t)args.outputDepth, - qp.initial_shr, qp.final_shr); - - auto ir = nn::ImageRegion(0, 0, 0, args.Y.height, args.Y.width, args.Y.depth); - nn::Filter2D::Params akParams(args.Y, ir, VPU_INT8_ACC_PERIOD); - - // TODO: Check serialization - std::string akpStr = akParams.serialise(); - std::string mfStr = imToColParams.serialise(); - std::string afStr = afParams.serialise(); - std::string otStr = otParams.serialise(); - - strParams.push_back(akpStr); - strParams.push_back(mfStr); - strParams.push_back(afStr); - strParams.push_back(otStr); - weightsData = rw.weights; - mulsBiasesData = serialisedOffsetsMultipliersAndBiases; - scratchBytes = 0; - - return success(); -} - -LogicalResult ReplaceBConv2DPattern::getBConv2DValidIndirectInt8Params( - const BConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &mulsBiasesData, - int &scratchBytes) const { - nn::ImToColValid::Params imToColParams(args.X, args.K, args.inputDepth); - - std::array filterShape = {args.outputDepth, args.filterHeight, - args.filterWidth, args.inputDepth}; - nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( - (int8_t *)args.filter.data(), filterShape, 1, args.padValue); - - const int elementsPerByte = 8; - int inputBytes = - args.filterHeight * args.filterWidth * args.inputDepth / elementsPerByte; - - nn::MatMulBinary::Params afParams(args.outputDepth, inputBytes); - - int receptiveVolume = args.filterHeight * args.filterWidth * args.inputDepth; - nn::MulsAndBias mulAndBiases = nn::OT_int8_clamped::canonicalise_mul_and_bias( - args.postActivationMultiplier, args.postActivationBias, receptiveVolume, - args.clampMin, args.clampMax, args.outputDepth); - auto accuOverlaps = nn::OT_int8_clamped::get_accumulator_overlaps( - receptiveVolume, args.outputDepth, rw); - nn::QuantisationParams qp = - nn::OutputTransformFnInt8::quantise_activation(mulAndBiases); - - auto serialisedOffsetsMultipliersAndBiases = - nn::OutputTransformFn::serialise_memory(accuOverlaps, qp.multipliers, - qp.biases); - nn::OutputTransformFn::pad_final_access(serialisedOffsetsMultipliersAndBiases, - VPU_INT16_EPV, - (int16_t)args.padValue); - - nn::OT_int8_clamped::Params otParams((int32_t)args.outputDepth, - qp.initial_shr, qp.final_shr); - - auto ir = nn::ImageRegion(0, 0, 0, args.Y.height, args.Y.width, args.Y.depth); - nn::Filter2D::Params akParams(args.Y, ir, VPU_INT8_ACC_PERIOD); - - // TODO: Check serialization - std::string akpStr = akParams.serialise(); - std::string mfStr = imToColParams.serialise(); - std::string afStr = afParams.serialise(); - std::string otStr = otParams.serialise(); - - strParams.push_back(akpStr); - strParams.push_back(mfStr); - strParams.push_back(afStr); - strParams.push_back(otStr); - weightsData = rw.weights; - mulsBiasesData = serialisedOffsetsMultipliersAndBiases; - scratchBytes = nn::MatMulInt8::get_scratch_mem_bytes(inputBytes) + 32; - - return success(); -} - -} // namespace xcore -} // namespace mlir diff --git a/experimental/xformer/Transforms/ConvPatternsTFL.cpp b/experimental/xformer/Transforms/ConvPatternsTFL.cpp deleted file mode 100644 index 99852092f..000000000 --- a/experimental/xformer/Transforms/ConvPatternsTFL.cpp +++ /dev/null @@ -1,489 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "Transforms/ConvPatterns.h" - -#include "tensorflow/core/framework/kernel_shape_util.h" - -namespace mlir { -namespace xcore { - -// TFL Conv2D Base class implementation -// TFLConvOpType would be XC_FakeConv2D or XC_FakeDepthwiseConv2D -template -LogicalResult ReplaceConv2DBase::getArgs( - TFLConvOpType conv2DOp, TFLConvArgs &args) const { - // Retrieve remaining args - // Get output zero point - auto outputType = - conv2DOp.output().getType().template dyn_cast(); - auto outputQType = - outputType.getElementType() - .template dyn_cast(); - auto outputScale = outputQType.getScale(); - auto outputZeroPoint = outputQType.getZeroPoint(); - - // Get input zero point - auto inputType = - conv2DOp.input().getType().template dyn_cast(); - auto inputQType = inputType.getElementType() - .template dyn_cast(); - auto inputScale = inputQType.getScale(); - auto inputZeroPoint = inputQType.getZeroPoint(); - - // Get filter values - auto filterQConstOp = - dyn_cast(conv2DOp.filter().getDefiningOp()); - auto filter = filterQConstOp.value().template cast(); - auto filterVector = - std::vector{filter.template getValues().begin(), - filter.template getValues().end()}; - - // Get bias values - DenseElementsAttr biases; - if (conv2DOp.bias() - .getType() - .template cast() - .getElementType() - .template isa()) { - auto biasQConstOp = - dyn_cast(conv2DOp.bias().getDefiningOp()); - biases = biasQConstOp.value().template cast(); - } else { - auto biasConstOp = - dyn_cast(conv2DOp.bias().getDefiningOp()); - biases = biasConstOp.value().template cast(); - } - auto biasVector = - std::vector{biases.template getValues().begin(), - biases.template getValues().end()}; - - // Calculate effectiveOutputScale - std::vector effectiveOutputScaleVector; - auto filterQConstOpType = - filterQConstOp.qtype().template cast(); - bool isPerChannelQuantized = false; - double filterScale; - ArrayRef filterScales; - if (auto filterQType = - filterQConstOpType.getElementType() - .template dyn_cast()) { - filterScale = filterQType.getScale(); - } else if (auto filterQType = - filterQConstOpType.getElementType() - .template dyn_cast< - mlir::quant::UniformQuantizedPerAxisType>()) { - isPerChannelQuantized = true; - filterScales = filterQType.getScales(); - } else { - return failure(); - } - - // Conv is quantized along dimension 0 - // DepthwiseConv is quantized along dimension 3 - // https://www.tensorflow.org/lite/performance/quantization_spec - int dim = static_cast(this)->getQuantizationIndex(); - auto filterType = - conv2DOp.filter().getType().template dyn_cast(); - auto numOutputChannels = filterType.getDimSize(dim); - for (int i = 0; i < numOutputChannels; ++i) { - auto scale = isPerChannelQuantized ? filterScales[i] : filterScale; - assert(outputScale != 0 && "outputScale should not be zero!"); - effectiveOutputScaleVector.push_back(inputScale * scale / outputScale); - } - - // Find padding values - int64_t newHeight, newWidth; - int64_t padTop, padBottom, padLeft, padRight; - - if (conv2DOp.padding() == "EXPLICIT") { - auto paddingValuesConstOp = - dyn_cast(conv2DOp.padding_values().getDefiningOp()); - auto paddingValues = - paddingValuesConstOp.value().template cast(); - // The padding values for the PadOp are stored as a 4x2 tensor - // 0,0 and 0,1 is for the batch dimension and 3,0, and 3,1 for the - // channel/depth - // 1,0 and 1,1 is top and bottom, and 2,0 and 2,1 is - // left and right which are the padding values we need - padTop = paddingValues.template getValue({1, 0}); - padBottom = paddingValues.template getValue({1, 1}); - padLeft = paddingValues.template getValue({2, 0}); - padRight = paddingValues.template getValue({2, 1}); - } else { - tensorflow::Padding opPadding = conv2DOp.padding() == "VALID" - ? tensorflow::Padding::VALID - : tensorflow::Padding::SAME; - if (tensorflow::GetWindowedOutputSizeVerboseV2( - args.inputHeight, args.filterHeight, conv2DOp.dilation_h_factor(), - conv2DOp.stride_h(), opPadding, &newHeight, &padTop, - &padBottom) != tensorflow::Status::OK()) { - return failure(); - } - if (tensorflow::GetWindowedOutputSizeVerboseV2( - args.inputWidth, args.filterWidth, conv2DOp.dilation_w_factor(), - conv2DOp.stride_w(), opPadding, &newWidth, &padLeft, - &padRight) != tensorflow::Status::OK()) { - return failure(); - } - } - args.toBePadded = - padTop != 0 || padBottom != 0 || padLeft != 0 || padRight != 0; - - args.padding = {static_cast(padTop), static_cast(padLeft), - static_cast(padBottom), - static_cast(padRight)}; - args.padValue = 0; - - // Init lib_nn structs - args.Y = - nn::ImageGeometry(args.outputHeight, args.outputWidth, args.outputDepth); - args.X = - nn::ImageGeometry(args.inputHeight, args.inputWidth, args.inputDepth); - args.K = nn::WindowGeometry( - args.filterHeight, args.filterWidth, args.filterDepth, -args.padding.top, - -args.padding.left, conv2DOp.stride_h(), conv2DOp.stride_w(), 1, - conv2DOp.dilation_h_factor(), conv2DOp.dilation_w_factor()); - - args.outputZeroPoint = outputZeroPoint; - args.inputZeroPoint = inputZeroPoint; - args.filter = filterVector; - args.bias = biasVector; - args.effectiveMultiplier = effectiveOutputScaleVector; - - return success(); -} - -// Since we are not defining the template functions in the header, we need -// explicit template class instantiations to avoid linker errors -template class ReplaceConv2DBase; -template class ReplaceConv2DBase; - -// -// -// -// Handle TFL Conv2D specific functions -LogicalResult ReplaceConv2DPattern::getKernelType(const TFLConvArgs &args, - Conv2DType &kt) const { - if (args.toBePadded) { - kt = Conv2DType::PaddedIndirect; - } else if (args.inputDepth % 32 == 0 && args.outputDepth % 16 == 0) { - kt = Conv2DType::ValidDirect; - } else { - kt = Conv2DType::ValidIndirect; - } - return success(); -} - -LogicalResult ReplaceConv2DPattern::getSerializedParamsAndTensors( - const TFLConvArgs &args, const Conv2DType &kt, - llvm::SmallVector &strParams, std::vector &weightsData, - std::vector &mulsBiasesData, int &scratchBytes) const { - switch (kt) { - case Conv2DType::ValidDirect: - if (failed(getConv2DValidDirectParams(args, strParams, weightsData, - mulsBiasesData, scratchBytes))) { - return failure(); - } - break; - case Conv2DType::ValidIndirect: - if (failed(getConv2DValidIndirectParams(args, strParams, weightsData, - mulsBiasesData, scratchBytes))) { - return failure(); - } - break; - case Conv2DType::PaddedIndirect: - if (failed(getConv2DPaddedIndirectParams(args, strParams, weightsData, - mulsBiasesData, scratchBytes))) { - return failure(); - } - break; - default: - // This shouldn't happen! - return failure(); - } - - return success(); -} - -LogicalResult ReplaceConv2DPattern::getConv2DPaddedIndirectParams( - const TFLConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &mulsBiasesData, - int &scratchBytes) const { - - nn::ImToColPadded::Params imToColParams(args.X, args.K, args.padding, - args.inputDepth, args.inputZeroPoint); - - std::array filterShape = {args.outputDepth, args.filterHeight, - args.filterWidth, args.inputDepth}; - nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( - (int8_t *)args.filter.data(), filterShape, 8, args.padValue); - int inputBytes = args.filterHeight * args.filterWidth * args.inputDepth; - nn::MatMulInt8::Params afParams(args.outputDepth, inputBytes); - - nn::MulsAndBias mulsAndBiases = - nn::OutputTransformFnInt8::canonicalise_mul_and_bias( - args.effectiveMultiplier, args.bias, args.filter, args.inputZeroPoint, - args.outputZeroPoint, args.outputDepth); - nn::QuantisationParams qp = - nn::OutputTransformFnInt8::quantise_activation(mulsAndBiases); - auto serialisedMultipliersAndBiases = - nn::OutputTransformFn::serialise_memory(qp.multipliers, qp.biases); - nn::OutputTransformFn::pad_final_access( - serialisedMultipliersAndBiases, VPU_INT16_EPV, (int16_t)args.padValue); - nn::OT_int8::Params otParams((int32_t)args.outputDepth, qp.initial_shr, - qp.final_shr); - - auto ir = nn::ImageRegion(0, 0, 0, args.Y.height, args.Y.width, args.Y.depth); - nn::Filter2D::Params akParams(args.Y, ir, VPU_INT8_ACC_PERIOD); - - // TODO: Check serialization - std::string akpStr = akParams.serialise(); - std::string mfStr = imToColParams.serialise(); - std::string afStr = afParams.serialise(); - std::string otStr = otParams.serialise(); - - strParams.push_back(akpStr); - strParams.push_back(mfStr); - strParams.push_back(afStr); - strParams.push_back(otStr); - weightsData = rw.weights; - mulsBiasesData = serialisedMultipliersAndBiases; - scratchBytes = - nn::MatMulInt8::get_scratch_mem_bytes(inputBytes) + 32; //[asj] FIXME - - return success(); -} - -LogicalResult ReplaceConv2DPattern::getConv2DValidIndirectParams( - const TFLConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &mulsBiasesData, - int &scratchBytes) const { - - nn::ImToColValid::Params imToColParams(args.X, args.K, args.inputDepth); - - std::array filterShape = {args.outputDepth, args.filterHeight, - args.filterWidth, args.inputDepth}; - nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( - (int8_t *)args.filter.data(), filterShape, 8, args.padValue); - int inputBytes = args.filterHeight * args.filterWidth * args.inputDepth; - nn::MatMulInt8::Params afParams(args.outputDepth, inputBytes); - - nn::MulsAndBias mulsAndBiases = - nn::OutputTransformFnInt8::canonicalise_mul_and_bias( - args.effectiveMultiplier, args.bias, args.filter, args.inputZeroPoint, - args.outputZeroPoint, args.outputDepth); - nn::QuantisationParams qp = - nn::OutputTransformFnInt8::quantise_activation(mulsAndBiases); - auto serialisedMultipliersAndBiases = - nn::OutputTransformFn::serialise_memory(qp.multipliers, qp.biases); - nn::OutputTransformFn::pad_final_access( - serialisedMultipliersAndBiases, VPU_INT16_EPV, (int16_t)args.padValue); - nn::OT_int8::Params otParams((int32_t)args.outputDepth, qp.initial_shr, - qp.final_shr); - - auto ir = nn::ImageRegion(0, 0, 0, args.Y.height, args.Y.width, args.Y.depth); - nn::Filter2D::Params akParams(args.Y, ir, VPU_INT8_ACC_PERIOD); - - // TODO: Check serialization - std::string akpStr = akParams.serialise(); - std::string mfStr = imToColParams.serialise(); - std::string afStr = afParams.serialise(); - std::string otStr = otParams.serialise(); - - strParams.push_back(akpStr); - strParams.push_back(mfStr); - strParams.push_back(afStr); - strParams.push_back(otStr); - weightsData = rw.weights; - mulsBiasesData = serialisedMultipliersAndBiases; - scratchBytes = - nn::MatMulInt8::get_scratch_mem_bytes(inputBytes) + 32; //[asj] FIXME - - return success(); -} - -LogicalResult ReplaceConv2DPattern::getConv2DValidDirectParams( - const TFLConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &mulsBiasesData, - int &scratchBytes) const { - - nn::DerefInputFn::Params imToColParams(args.X, args.K); - - std::array filterShape = {args.outputDepth, args.filterHeight, - args.filterWidth, args.inputDepth}; - nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( - (int8_t *)args.filter.data(), filterShape, 8, args.padValue); - nn::MatMulDirectFn::Params afParams(args.X, args.K, args.inputDepth); - - nn::MulsAndBias mulsAndBiases = - nn::OutputTransformFnInt8::canonicalise_mul_and_bias( - args.effectiveMultiplier, args.bias, args.filter, args.inputZeroPoint, - args.outputZeroPoint, args.outputDepth); - nn::QuantisationParams qp = - nn::OutputTransformFnInt8::quantise_activation(mulsAndBiases); - auto serialisedMultipliersAndBiases = - nn::OutputTransformFn::serialise_memory(qp.multipliers, qp.biases); - nn::OutputTransformFn::pad_final_access( - serialisedMultipliersAndBiases, VPU_INT16_EPV, (int16_t)args.padValue); - nn::OT_int8::Params otParams((int32_t)args.outputDepth, qp.initial_shr, - qp.final_shr); - - auto ir = nn::ImageRegion(0, 0, 0, args.Y.height, args.Y.width, args.Y.depth); - nn::Filter2D::Params akParams(args.Y, ir, VPU_INT8_ACC_PERIOD); - - // TODO: Check serialization - std::string akpStr = akParams.serialise(); - std::string mfStr = imToColParams.serialise(); - std::string afStr = afParams.serialise(); - std::string otStr = otParams.serialise(); - - strParams.push_back(akpStr); - strParams.push_back(mfStr); - strParams.push_back(afStr); - strParams.push_back(otStr); - weightsData = rw.weights; - mulsBiasesData = serialisedMultipliersAndBiases; - scratchBytes = 0; - - return success(); -} - -// -// -// -// Handle TFL DepthwiseConv2D -LogicalResult -ReplaceDepthwiseConv2DPattern::getKernelType(const TFLConvArgs &args, - Conv2DType &kt) const { - if (args.toBePadded) { - kt = Conv2DType::DepthwisePaddedIndirect; - } else { - kt = Conv2DType::DepthwiseValidDirect; - } - return success(); -} - -LogicalResult ReplaceDepthwiseConv2DPattern::getSerializedParamsAndTensors( - const TFLConvArgs &args, const Conv2DType &kt, - llvm::SmallVector &strParams, std::vector &weightsData, - std::vector &mulsBiasesData, int &scratchBytes) const { - switch (kt) { - case Conv2DType::DepthwiseValidDirect: - if (failed(getDepthwiseConv2DValidDirectParams( - args, strParams, weightsData, mulsBiasesData, scratchBytes))) { - return failure(); - } - break; - case Conv2DType::DepthwisePaddedIndirect: - if (failed(getDepthwiseConv2DPaddedIndirectParams( - args, strParams, weightsData, mulsBiasesData, scratchBytes))) { - return failure(); - } - break; - default: - // This shouldn't happen! - return failure(); - } - - return success(); -} - -LogicalResult -ReplaceDepthwiseConv2DPattern::getDepthwiseConv2DValidDirectParams( - const TFLConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &mulsBiasesData, - int &scratchBytes) const { - - nn::DerefInputFn::Params imToColParams(args.X, args.K); - - std::array filterShape = {1, args.filterHeight, args.filterWidth, - args.inputDepth}; - nn::Conv2dReorderedWeights rw = nn::MatMulDirectFn_DW::reorder_kernel_weights( - (int8_t *)args.filter.data(), filterShape, args.padValue); - nn::MatMulDirectFn_DW::Params afParams(args.X, args.K); - - nn::MulsAndBias mulsAndBiases = - nn::OutputTransformFnInt8::canonicalise_mul_and_bias_dw( - args.effectiveMultiplier, args.bias, args.filter, filterShape, - args.inputZeroPoint, args.outputZeroPoint, args.outputDepth); - nn::QuantisationParams qp = - nn::OutputTransformFnInt8::quantise_activation(mulsAndBiases); - auto serialisedMultipliersAndBiases = - nn::OutputTransformFn::serialise_memory(qp.multipliers, qp.biases); - nn::OutputTransformFn::pad_final_access( - serialisedMultipliersAndBiases, VPU_INT16_EPV, (int16_t)args.padValue); - nn::OT_int8::Params otParams((int32_t)args.outputDepth, qp.initial_shr, - qp.final_shr); - - auto ir = nn::ImageRegion(0, 0, 0, args.Y.height, args.Y.width, args.Y.depth); - nn::Filter2D_DW::Params akParams(args.Y, ir, VPU_INT8_ACC_PERIOD); - - // TODO: Check serialization - std::string akpStr = akParams.serialise(); - std::string mfStr = imToColParams.serialise(); - std::string afStr = afParams.serialise(); - std::string otStr = otParams.serialise(); - - strParams.push_back(akpStr); - strParams.push_back(mfStr); - strParams.push_back(afStr); - strParams.push_back(otStr); - weightsData = rw.weights; - mulsBiasesData = serialisedMultipliersAndBiases; - scratchBytes = 0; - - return success(); -} - -LogicalResult -ReplaceDepthwiseConv2DPattern::getDepthwiseConv2DPaddedIndirectParams( - const TFLConvArgs &args, llvm::SmallVector &strParams, - std::vector &weightsData, std::vector &mulsBiasesData, - int &scratchBytes) const { - - nn::ImToColPadded::Params imToColParams(args.X, args.K, args.padding, 16, - args.inputZeroPoint); - - std::array filterShape = {1, args.filterHeight, args.filterWidth, - args.inputDepth}; - nn::Conv2dReorderedWeights rw = nn::MatMulDirectFn_DW::reorder_kernel_weights( - (int8_t *)args.filter.data(), filterShape, args.padValue); - nn::MatMulDirectFn_DW::Params afParams(args.K); - - nn::MulsAndBias mulsAndBiases = - nn::OutputTransformFnInt8::canonicalise_mul_and_bias_dw( - args.effectiveMultiplier, args.bias, args.filter, filterShape, - args.inputZeroPoint, args.outputZeroPoint, args.outputDepth); - nn::QuantisationParams qp = - nn::OutputTransformFnInt8::quantise_activation(mulsAndBiases); - auto serialisedMultipliersAndBiases = - nn::OutputTransformFn::serialise_memory(qp.multipliers, qp.biases); - nn::OutputTransformFn::pad_final_access( - serialisedMultipliersAndBiases, VPU_INT16_EPV, (int16_t)args.padValue); - nn::OT_int8::Params otParams((int32_t)args.outputDepth, qp.initial_shr, - qp.final_shr); - - auto ir = nn::ImageRegion(0, 0, 0, args.Y.height, args.Y.width, args.Y.depth); - nn::Filter2D_DW::Params akParams(args.Y, ir, VPU_INT8_ACC_PERIOD); - - // TODO: Check serialization - std::string akpStr = akParams.serialise(); - std::string mfStr = imToColParams.serialise(); - std::string afStr = afParams.serialise(); - std::string otStr = otParams.serialise(); - - strParams.push_back(akpStr); - strParams.push_back(mfStr); - strParams.push_back(afStr); - strParams.push_back(otStr); - weightsData = rw.weights; - mulsBiasesData = serialisedMultipliersAndBiases; - scratchBytes = nn::MatMulDirectFn_DW::get_scratch_mem_bytes(filterShape); - - return success(); -} - -} // namespace xcore -} // namespace mlir diff --git a/experimental/xformer/Transforms/LoadConstantOpPatterns.td b/experimental/xformer/Transforms/LoadConstantOpPatterns.td deleted file mode 100644 index 4390c4369..000000000 --- a/experimental/xformer/Transforms/LoadConstantOpPatterns.td +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -// This is the second pattern definition file for XCore. -include "mlir/Dialect/StandardOps/IR/Ops.td" -include "tensorflow/compiler/mlir/lite/ir/tfl_ops.td" - -include "IR/XCoreOps.td" - -def ShouldBeLoadedExternally - : Constraint>; - -def : Pat<(XC_Conv2DV2Op - : $output $input, $thread_count, $scratch_bytes, - (ConstantOp - : $weights_op $weights_attr), - $mulsbiases_or_thresholds, $abstract_kernel_params, - $memcpy_fn_params, $aggregate_fn_params, - $output_transform_fn_params, $conv2d_kernel_type), - (XC_Conv2DV2Op $input, $thread_count, $scratch_bytes, - (XC_LoadConstantOp $weights_op), $mulsbiases_or_thresholds, - $abstract_kernel_params, $memcpy_fn_params, $aggregate_fn_params, - $output_transform_fn_params, $conv2d_kernel_type), - [(ShouldBeLoadedExternally $weights_attr)]>; - -def : Pat<(XC_Conv2DV2Op - : $output $input, $thread_count, $scratch_bytes, $weights, - (ConstantOp - : $mulsbiases_or_thresholds_op $mulsbiases_or_thresholds_attr), - $abstract_kernel_params, $memcpy_fn_params, $aggregate_fn_params, - $output_transform_fn_params, $conv2d_kernel_type), - (XC_Conv2DV2Op $input, $thread_count, $scratch_bytes, $weights, - (XC_LoadConstantOp $mulsbiases_or_thresholds_op), - $abstract_kernel_params, $memcpy_fn_params, $aggregate_fn_params, - $output_transform_fn_params, $conv2d_kernel_type), - [(ShouldBeLoadedExternally $mulsbiases_or_thresholds_attr)]>; - -foreach constOp = [ConstantOp, TFL_ConstOp] in { -def: - Pat<(TFL_Conv2DOp $input, - (constOp - : $op $attr), - $b, $dh, $dw, $faf, $p, $sh, $sw), - (TFL_Conv2DOp $input, (XC_LoadConstantOp $op), $b, $dh, $dw, $faf, $p, - $sh, $sw), - [(ShouldBeLoadedExternally $attr)]>; - -def: - Pat<(TFL_Conv2DOp $input, $f, - (constOp - : $op $attr), - $dh, $dw, $faf, $p, $sh, $sw), - (TFL_Conv2DOp $input, $f, (XC_LoadConstantOp $op), $dh, $dw, $faf, $p, - $sh, $sw), - [(ShouldBeLoadedExternally $attr)]>; -} - -def : Pat<(TFL_Conv2DOp $input, - (TFL_QConstOp - : $op $qtype, $attr), - $b, $dh, $dw, $faf, $p, $sh, $sw), - (TFL_Conv2DOp $input, (XC_LoadConstantOp $op), $b, $dh, $dw, $faf, $p, - $sh, $sw), - [(ShouldBeLoadedExternally $attr)]>; - -def : Pat<(TFL_Conv2DOp $input, $f, - (TFL_QConstOp - : $op $qtype, $attr), - $dh, $dw, $faf, $p, $sh, $sw), - (TFL_Conv2DOp $input, $f, (XC_LoadConstantOp $op), $dh, $dw, $faf, $p, - $sh, $sw), - [(ShouldBeLoadedExternally $attr)]>; \ No newline at end of file diff --git a/experimental/xformer/Transforms/Options.h b/experimental/xformer/Transforms/Options.h deleted file mode 100644 index cbeb1f7a0..000000000 --- a/experimental/xformer/Transforms/Options.h +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#ifndef XFORMER_TRANSFORMS_OPTIONS_H -#define XFORMER_TRANSFORMS_OPTIONS_H - -#include "llvm/Support/CommandLine.h" - -namespace mlir { -namespace xcore { - -extern llvm::cl::opt flashImageFilenameOption; -extern llvm::cl::opt loadExternallyIfLargerOption; -extern llvm::cl::opt reduceMemoryOption; - -} // namespace xcore -} // namespace mlir - -#endif // XFORMER_TRANSFORMS_OPTIONS_H diff --git a/experimental/xformer/Transforms/Pad3to4Conv2D.cpp b/experimental/xformer/Transforms/Pad3to4Conv2D.cpp deleted file mode 100644 index 843e488c4..000000000 --- a/experimental/xformer/Transforms/Pad3to4Conv2D.cpp +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "mlir/Pass/Pass.h" -#include "mlir/Transforms/GreedyPatternRewriteDriver.h" -#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" - -namespace mlir { -namespace xcore { - -namespace { -// Add padding before TFL Conv2D to align input depth from three to four. -struct Pad3to4Conv2D : public PassWrapper { - void getDependentDialects(DialectRegistry ®istry) const final { - registry.insert(); - } - void runOnFunction() override; -}; - -struct Pad3to4Conv2DPattern : public OpRewritePattern { - using OpRewritePattern::OpRewritePattern; - - LogicalResult matchAndRewrite(TFL::Conv2DOp conv2DOp, - PatternRewriter &rewriter) const override { - // Check for invalid types and return - // These are the types applicable for lowering to an XC Conv2D - // Input type must be QI8 - if (!(conv2DOp.input() - .getType() - .template cast() - .getElementType() - .template isa() && - conv2DOp.input() - .getType() - .template cast() - .getElementType() - .template cast() - .isSigned() && - conv2DOp.input() - .getType() - .template cast() - .getElementType() - .template cast() - .getStorageTypeIntegralWidth() == 8)) { - return failure(); - } - - // Filter type must be QI8 - if (!(conv2DOp.filter() - .getType() - .template cast() - .getElementType() - .template isa() && - conv2DOp.filter() - .getType() - .template cast() - .getElementType() - .template cast() - .isSigned() && - conv2DOp.filter() - .getType() - .template cast() - .getElementType() - .template cast() - .getStorageTypeIntegralWidth() == 8)) { - return failure(); - } - - // We don't bother padding if output depth is not a multiple of four as we - // cannot optimize it with an XC Conv2D - auto outputDepth = - conv2DOp.output().getType().cast().getDimSize(3); - if (outputDepth % 4 != 0) { - return failure(); - } - - // Input depth must be three - auto inputDepth = - conv2DOp.input().getType().cast().getDimSize(3); - if (inputDepth != 3) { - return failure(); - } - - // Pad the Conv2D input - RankedTensorType paddingsType = - RankedTensorType::get({4, 2}, rewriter.getI32Type()); - - // Pad the input depth by one, i.e, from 3 to 4 - std::vector paddingsValues = {0, 0, 0, 0, 0, 0, 0, 1}; - Value paddings = rewriter.create( - conv2DOp.getLoc(), - DenseIntElementsAttr::get(paddingsType, paddingsValues)); - auto inputShape = - conv2DOp.input().getType().cast().getShape(); - - // The pad output depth would increse from 3 to 4 - auto paddedInputResultType = RankedTensorType::get( - {inputShape[0], inputShape[1], inputShape[2], inputShape[3] + 1}, - conv2DOp.input().getType().cast().getElementType()); - - // Set the PadOp output as the Conv2D input - Value padOpOutput = rewriter.create( - conv2DOp.getLoc(), paddedInputResultType, conv2DOp.input(), paddings); - conv2DOp.setOperand(0, padOpOutput); - - // Pad the Conv2D filter - // We need to do this at compile time instead of using a PadOp - // as we use the padded filter values for the boggling calculations - // for creating the XC Conv2D ops - auto filterQConstOp = - dyn_cast(conv2DOp.filter().getDefiningOp()); - auto filter = filterQConstOp.value().cast(); - auto filterVector = std::vector{filter.getValues().begin(), - filter.getValues().end()}; - auto filterShape = - conv2DOp.filter().getType().cast().getShape(); - llvm::SmallVector paddedFilterVector; - paddedFilterVector.reserve(filterShape[0] * filterShape[1] * - filterShape[2] * (filterShape[3] + 1)); - - // Pad the filter depth by one, i.e, from 3 to 4 - for (int i = 0; i < filterVector.size(); i += filterShape[3]) { - paddedFilterVector.insert(paddedFilterVector.end(), - filterVector.begin() + i, - filterVector.begin() + i + filterShape[3]); - paddedFilterVector.insert(paddedFilterVector.end(), 0); - } - - auto paddedFilterResultType = RankedTensorType::get( - {filterShape[0], filterShape[1], filterShape[2], filterShape[3] + 1}, - conv2DOp.filter().getType().cast().getElementType()); - RankedTensorType paddedFilterValueType = RankedTensorType::get( - {filterShape[0], filterShape[1], filterShape[2], filterShape[3] + 1}, - rewriter.getIntegerType(8)); - - // Create a new QConstOp with the padded data - Value paddedQConstOpOutput = rewriter.create( - conv2DOp.getLoc(), mlir::TypeAttr::get(paddedFilterResultType), - DenseElementsAttr::get(paddedFilterValueType, - paddedFilterVector)); - - // Set the QConstOp output as the Conv2D filter - conv2DOp.setOperand(1, paddedQConstOpOutput); - - return success(); - } -}; - -void Pad3to4Conv2D::runOnFunction() { - auto *ctx = &getContext(); - auto func = getFunction(); - - OwningRewritePatternList patterns(ctx); - patterns.insert(ctx); - (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); -} -} // namespace - -// Creates an instance of the Pad3to4Conv2D pass. -std::unique_ptr> createPad3to4Conv2DPass() { - return std::make_unique(); -} - -static PassRegistration pass( - "xcore-pad-3to4-conv2d", - "Add padding before TFL Conv2D to align input depth from three to four."); - -} // namespace xcore -} // namespace mlir diff --git a/experimental/xformer/Transforms/Passes.cpp b/experimental/xformer/Transforms/Passes.cpp deleted file mode 100644 index 8d449735f..000000000 --- a/experimental/xformer/Transforms/Passes.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "Transforms/Passes.h" -#include "Transforms/Options.h" - -#include "larq_compute_engine/mlir/transforms/passes.h" -#include "mlir/Pass/Pass.h" -#include "mlir/Pass/PassManager.h" -#include "mlir/Transforms/Passes.h" - -namespace mlir { -namespace xcore { - -void buildXCorePassPipeline(OpPassManager &pm) { - // Run pass from LCE to convert Larq ops which are in TFL custom op format to - // Larq dialect - pm.addPass(mlir::TFL::CreateTranslateToLCEPass()); - pm.addPass(createApplyTFLPatternsPass()); - pm.addPass(createReplaceAvgPoolWithConv2DPass()); - pm.addPass(createReplaceFCWithConv2DPass()); - pm.addPass(createPad3to4Conv2DPass()); - pm.addPass(createReplaceConv2DPass()); - pm.addPass(createApplyXCPatternsPass()); - // Add to pipeline only if flash image file option is provided - if (!flashImageFilenameOption.empty()) { - pm.addPass(createApplyLoadConstantOpPatternsPass()); - pm.addPass(createWriteFlashImagePass()); - } - // Run canonicalization, which includes combining Reshapes - pm.addPass(mlir::createCanonicalizerPass()); - pm.addPass(createTranslateToCustomOpPass()); -} - -void registerXCorePassPipeline() { - mlir::PassPipelineRegistration<> pipeline( - "xcore-tfl-pipeline", - "Run XCore passes for transforming TFLite code into XCore", - [](OpPassManager &passManager) { buildXCorePassPipeline(passManager); }); -} - -} // namespace xcore -} // namespace mlir diff --git a/experimental/xformer/Transforms/Passes.h b/experimental/xformer/Transforms/Passes.h deleted file mode 100644 index 202275156..000000000 --- a/experimental/xformer/Transforms/Passes.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#ifndef XFORMER_TRANSFORMS_PASSES_H -#define XFORMER_TRANSFORMS_PASSES_H - -#include "mlir/Pass/Pass.h" - -namespace mlir { -namespace xcore { - -//===----------------------------------------------------------------------===// -// Pipelines -//===----------------------------------------------------------------------===// - -// Create a single pipeline that will run all the needed passes in the right -// order. -void buildXCorePassPipeline(OpPassManager &pm); - -//===----------------------------------------------------------------------===// -// XCore-specific passes -//===----------------------------------------------------------------------===// - -std::unique_ptr> createApplyTFLPatternsPass(); -std::unique_ptr> createReplaceAvgPoolWithConv2DPass(); -std::unique_ptr> createReplaceFCWithConv2DPass(); -std::unique_ptr> createPad3to4Conv2DPass(); -std::unique_ptr> createReplaceConv2DPass(); -std::unique_ptr> createApplyXCPatternsPass(); -std::unique_ptr> createApplyLoadConstantOpPatternsPass(); -std::unique_ptr> createWriteFlashImagePass(); -std::unique_ptr> createTranslateToCustomOpPass(); - -//===----------------------------------------------------------------------===// -// Registration -//===----------------------------------------------------------------------===// - -void registerXCorePassPipeline(); - -} // namespace xcore -} // namespace mlir - -#endif // XFORMER_TRANSFORMS_PASSES_H diff --git a/experimental/xformer/Transforms/ReplaceAvgPoolWithConv2D.cpp b/experimental/xformer/Transforms/ReplaceAvgPoolWithConv2D.cpp deleted file mode 100644 index 86475e573..000000000 --- a/experimental/xformer/Transforms/ReplaceAvgPoolWithConv2D.cpp +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "mlir/Pass/Pass.h" -#include "mlir/Transforms/GreedyPatternRewriteDriver.h" -#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" - -namespace mlir { -namespace xcore { - -namespace { -// Replace TFL AveragePool2D with TFL DepthwiseConv2D. -struct ReplaceAvgPoolWithConv2D - : public PassWrapper { - void getDependentDialects(DialectRegistry ®istry) const final { - registry.insert(); - } - void runOnFunction() override; -}; - -struct ReplaceAvgPoolWithConv2DPattern - : public OpRewritePattern { - using OpRewritePattern::OpRewritePattern; - - LogicalResult matchAndRewrite(TFL::AveragePool2DOp avgPoolOp, - PatternRewriter &rewriter) const override { - - auto inputElementalType = - avgPoolOp.input().getType().cast().getElementType(); - - // Check for invalid types and return - // Input type must be QI8 - if (!(inputElementalType.isa() && - inputElementalType.cast().isSigned() && - inputElementalType.cast() - .getStorageTypeIntegralWidth() == 8)) { - return failure(); - } - - auto outputElementalType = - avgPoolOp.output().getType().cast().getElementType(); - - // Output type must be QI8 - if (!(outputElementalType.isa() && - outputElementalType.cast().isSigned() && - outputElementalType.cast() - .getStorageTypeIntegralWidth() == 8)) { - return failure(); - } - - auto inputType = avgPoolOp.input().getType().dyn_cast(); - auto inputDepth = inputType.getDimSize(3); - - auto filterHeight = avgPoolOp.filter_height(); - auto filterWidth = avgPoolOp.filter_width(); - - float scaleFactor = 1. / (filterHeight * filterWidth); - - int64_t storageTypeMin = - quant::QuantizedType::getDefaultMinimumForInteger(/*isSigned=*/true, 8); - int64_t storageTypeMax = - quant::QuantizedType::getDefaultMaximumForInteger(/*isSigned=*/true, 8); - - /* - The quantisation stratergy we are using is to set all elements of the filter - to one and to control the scaling with the QTypes scalar. The zero point - will be 0. In order to achieve an AvgPool2D we simply sum all elements of - the receptive field then scale by 1./count(the receptive field). - */ - UniformQuantizedType int8ElementQtype = - mlir::quant::UniformQuantizedType::get( - true, rewriter.getIntegerType(8), rewriter.getF32Type(), - scaleFactor, 0, storageTypeMin, storageTypeMax); - - auto filterResultType = RankedTensorType::get( - {1, filterHeight, filterWidth, inputDepth}, int8ElementQtype); - - RankedTensorType filterValueType = RankedTensorType::get( - {1, filterHeight, filterWidth, inputDepth}, rewriter.getIntegerType(8)); - - // These are the actual values that the quantised filter will hold. - std::vector filterVector(filterHeight * filterWidth * inputDepth, - 1); - - Value filter = rewriter.create( - avgPoolOp.getLoc(), mlir::TypeAttr::get(filterResultType), - DenseElementsAttr::get(filterValueType, filterVector)); - - //[asj] This may need to be QI32 but I32 seems to work - RankedTensorType biasType = - RankedTensorType::get({inputDepth}, rewriter.getI32Type()); - std::vector biasValues(inputDepth, 0); - auto bias = rewriter.create( - avgPoolOp->getLoc(), DenseIntElementsAttr::get(biasType, biasValues)); - - auto conv2dOp = rewriter.create( - avgPoolOp.getLoc(), avgPoolOp.getType(), avgPoolOp.input(), filter, - bias, // TODO [asj]how do we drop the bias? - /*dilation_h_factor=*/1, - /*dilation_w_factor=*/1, - /*fused_activation_function=*/avgPoolOp.fused_activation_function(), - /*padding=*/avgPoolOp.padding(), - /*stride_h=*/avgPoolOp.stride_h(), - /*stride_w=*/avgPoolOp.stride_w(), - /*depth_multiplier=*/1); - - rewriter.replaceOp(avgPoolOp, conv2dOp.output()); - - return success(); - } -}; - -void ReplaceAvgPoolWithConv2D::runOnFunction() { - auto *ctx = &getContext(); - auto func = getFunction(); - - OwningRewritePatternList patterns(ctx); - patterns.insert(ctx); - (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); -} -} // namespace - -// Creates an instance of the ReplaceAvgPoolWithConv2D pass. -std::unique_ptr> createReplaceAvgPoolWithConv2DPass() { - return std::make_unique(); -} - -static PassRegistration - pass("xcore-replace-avgpool-with-conv2d", - "Replace TFL Avgpool with Conv2D operations."); - -} // namespace xcore -} // namespace mlir diff --git a/experimental/xformer/Transforms/ReplaceConv2D.cpp b/experimental/xformer/Transforms/ReplaceConv2D.cpp deleted file mode 100644 index a55e0e549..000000000 --- a/experimental/xformer/Transforms/ReplaceConv2D.cpp +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "IR/XCoreOps.h" -#include "Transforms/ConvPatterns.h" -#include "Transforms/Options.h" - -#include "larq_compute_engine/mlir/ir/lce_ops.h" -#include "mlir/Pass/Pass.h" -#include "mlir/Transforms/GreedyPatternRewriteDriver.h" -#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" - -namespace mlir { -namespace xcore { - -// XC Conv2D Base class implementation -// ConcreteType would be TFL Conv types or Larq BConv2D -// Replaces them with XC Conv2D -template -LogicalResult -ReplaceWithXCConv2DBase::matchAndRewrite( - ConvOpType op, PatternRewriter &rewriter) const { - auto conv2DOp = static_cast(op); - auto builder = static_cast(this); - - // Check if the op has invalid types - if (failed(builder->checkIfValid(conv2DOp))) { - return failure(); - } - - // Extract common args from the op - ArgsType args; - auto inputType = - conv2DOp.input().getType().template dyn_cast(); - auto outputType = - conv2DOp.output().getType().template dyn_cast(); - auto filterType = - conv2DOp.filter().getType().template dyn_cast(); - args.inputHeight = inputType.getDimSize(1); - args.inputWidth = inputType.getDimSize(2); - args.inputDepth = inputType.getDimSize(3); - args.outputHeight = outputType.getDimSize(1); - args.outputWidth = outputType.getDimSize(2); - args.outputDepth = outputType.getDimSize(3); - args.filterHeight = filterType.getDimSize(1); - args.filterWidth = filterType.getDimSize(2); - args.filterDepth = filterType.getDimSize(3); - // Get op-type specific args - if (failed(builder->getArgs(conv2DOp, args))) { - return failure(); - } - - Conv2DType kernelType; - if (failed(builder->getKernelType(args, kernelType))) { - return failure(); - } - - llvm::SmallVector abstractKernelParams, memcpyFnParams, - aggregateFnParams, outputTransformFnParams, kernelTypeEnumParams; - llvm::SmallVector scratchByteParams; - - // TODO: We only have one thread now - // If we have more threads, we'll need to combine the tensor data - // and save the sizes for each thread - std::vector weightsData; - std::vector mulsBiasesOrThresholdsData; - - // TODO: Currently thread count is one - const int threadCount = 1; - - // TODO: Multithread analysis to determine how to split up the data - // between threads. Might be better to do this as an analysis pass and - // access the analysis results here - for (int i = 0; i < threadCount; ++i) { - llvm::SmallVector strParams; - int scratchBytes = 0; - - // Obtain serialized params and calculated tensors from lib_nn for the - // conv2d kernel type - if (failed(builder->getSerializedParamsAndTensors( - args, kernelType, strParams, weightsData, - mulsBiasesOrThresholdsData, scratchBytes))) { - return failure(); - } - - kernelTypeEnumParams.push_back(stringifyConv2DType(kernelType).str()); - abstractKernelParams.push_back(strParams[0]); - memcpyFnParams.push_back(strParams[1]); - aggregateFnParams.push_back(strParams[2]); - outputTransformFnParams.push_back(strParams[3]); - scratchByteParams.push_back(scratchBytes); - } - - // Create a string array attr from a vector of strings - auto getStringArrayAttr = [&](llvm::SmallVector value) { - auto attrs = llvm::to_vector<8>( - llvm::map_range(value, [&](std::string v) -> Attribute { - return rewriter.getStringAttr(v); - })); - return rewriter.getArrayAttr(attrs); - }; - - // Create the tensors for weights and multipliers_and_biases - assert(threadCount == 1 && - "Tensor data has to be combined for more than one thread!"); - ShapedType weightsType = RankedTensorType::get( - {static_cast(weightsData.size())}, rewriter.getIntegerType(8)); - auto weightsAttr = DenseElementsAttr::get(weightsType, weightsData); - auto weightsConstantOp = - rewriter.create(conv2DOp.getLoc(), weightsAttr); - - ShapedType mulsBiasesOrThresholdsType = RankedTensorType::get( - {static_cast(mulsBiasesOrThresholdsData.size())}, - rewriter.getIntegerType(16)); - auto mulsBiasesOrThresholdsAttr = DenseElementsAttr::get( - mulsBiasesOrThresholdsType, mulsBiasesOrThresholdsData); - auto mulsBiasesOrThresholdsConstantOp = rewriter.create( - conv2DOp.getLoc(), mulsBiasesOrThresholdsAttr); - - // Create the Conv2DV2 Op with the params and kernel type - auto newConv2DV2Op = rewriter.create( - conv2DOp.getLoc(), conv2DOp.getType(), conv2DOp.input(), - rewriter.getI32IntegerAttr(threadCount), - rewriter.getI32ArrayAttr(scratchByteParams), weightsConstantOp, - mulsBiasesOrThresholdsConstantOp, - getStringArrayAttr(abstractKernelParams), - getStringArrayAttr(memcpyFnParams), getStringArrayAttr(aggregateFnParams), - getStringArrayAttr(outputTransformFnParams), - getStringArrayAttr(kernelTypeEnumParams)); - rewriter.replaceOp(conv2DOp, newConv2DV2Op.output()); - - return success(); -} - -namespace { -// Replace with XC Conv2D pass -struct ReplaceConv2D : public PassWrapper { - void getDependentDialects(DialectRegistry ®istry) const final { - registry - .insert(); - } - void runOnFunction() override; -}; - -bool shouldReduceMemory() { return reduceMemoryOption; } - -#include "Transforms/GeneratedConvPatterns.inc" - -void ReplaceConv2D::runOnFunction() { - auto *ctx = &getContext(); - auto func = getFunction(); - - // Apply patterns to lower TFL Conv to XC Fake Conv ops - // This helps in pattern matching only types we support for xcore such as QI8 - // and for handling issues such as EXPLICIT padding which is not supported in - // TFL Conv ops - OwningRewritePatternList patterns1(ctx); - populateWithGenerated(patterns1); - (void)applyPatternsAndFoldGreedily(func, std::move(patterns1)); - - // Replace with XC Conv2D op - OwningRewritePatternList patterns2(ctx); - patterns2.insert(ctx); - (void)applyPatternsAndFoldGreedily(func, std::move(patterns2)); -} -} // namespace - -// Creates an instance of the ReplaceConv2D pass. -std::unique_ptr> createReplaceConv2DPass() { - return std::make_unique(); -} - -static PassRegistration - pass("xcore-replace-conv2d", "Replace Conv2D with XC Conv2D pass."); - -} // namespace xcore -} // namespace mlir diff --git a/experimental/xformer/Transforms/ReplaceFCWithConv2D.cpp b/experimental/xformer/Transforms/ReplaceFCWithConv2D.cpp deleted file mode 100644 index 07cd6b7d8..000000000 --- a/experimental/xformer/Transforms/ReplaceFCWithConv2D.cpp +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "mlir/Pass/Pass.h" -#include "mlir/Transforms/GreedyPatternRewriteDriver.h" -#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" - -namespace mlir { -namespace xcore { - -namespace { -// Replace suitable TFL FullyConnected with TFL Conv2D for XCore. -struct ReplaceFCWithConv2D - : public PassWrapper { - void getDependentDialects(DialectRegistry ®istry) const final { - registry.insert(); - } - void runOnFunction() override; -}; - -struct ReplaceFCWithConv2DPattern - : public OpRewritePattern { - using OpRewritePattern::OpRewritePattern; - - LogicalResult matchAndRewrite(TFL::FullyConnectedOp fcOp, - PatternRewriter &rewriter) const override { - // Check for invalid types and return - // Input type must be QI8 - auto fcInputElementType = - fcOp.input().getType().cast().getElementType(); - if (!(fcInputElementType.isa() && - fcInputElementType.cast().isSigned() && - fcInputElementType.cast() - .getStorageTypeIntegralWidth() == 8)) { - return failure(); - } - - // Filter type must be - auto fcFilterElementType = - fcOp.filter().getType().cast().getElementType(); - if (!(fcFilterElementType.isa() && - fcFilterElementType.cast().isSigned() && - fcFilterElementType.cast() - .getStorageTypeIntegralWidth() == 8)) { - return failure(); - } - - // TODO: What to do if no bias? - // Bias type must be QI32 - auto fcBiasElementType = - fcOp.bias().getType().cast().getElementType(); - if (!(fcBiasElementType.isa() && - fcBiasElementType.cast().isSigned() && - fcBiasElementType.cast() - .getStorageTypeIntegralWidth() == 32)) { - return failure(); - } - - if (fcOp.weights_format() != "DEFAULT") { - return failure(); - } - - if (fcOp.keep_num_dims() != false) { - return failure(); - } - - // Add a ReshapeOp before Conv2D for expanding input to 4 dims - auto inputType = fcOp.input().getType().cast(); - assert(inputType.getRank() == 2 && - "FullyConnected input should have a rank of 2!"); - std::vector expandedShapeVector = {inputType.getShape()[0], 1, 1, - inputType.getShape()[1]}; - auto expandedInputResultType = - RankedTensorType::get(expandedShapeVector, inputType.getElementType()); - auto expandedShapeConstantOp = rewriter.create( - fcOp.getLoc(), - DenseElementsAttr::get( - RankedTensorType::get({4}, rewriter.getIntegerType(64)), - llvm::makeArrayRef(expandedShapeVector))); - auto reshapeInputOp = - rewriter.create(fcOp.getLoc(), expandedInputResultType, - fcOp.input(), expandedShapeConstantOp); - - // Expand filter to 4 dims - auto filterQConstOp = - dyn_cast(fcOp.filter().getDefiningOp()); - auto filter = filterQConstOp.value().cast(); - auto filterType = fcOp.filter().getType().cast(); - std::vector expandedFilterVector = {filterType.getShape()[0], 1, 1, - filterType.getShape()[1]}; - auto expandedFilterType = RankedTensorType::get( - expandedFilterVector, filterType.getElementType()); - auto expandedFilterQConstOp = rewriter.create( - fcOp.getLoc(), mlir::TypeAttr::get(expandedFilterType), filter); - - // Add a Conv2D to replace the FC - auto result0Type = fcOp.getResult(0).getType().cast(); - std::vector expandedResultVector = {result0Type.getShape()[0], 1, - 1, result0Type.getShape()[1]}; - auto expandedResultType = RankedTensorType::get( - expandedResultVector, result0Type.getElementType()); - auto newConv2DOp = rewriter.create( - fcOp.getLoc(), expandedResultType, reshapeInputOp, - expandedFilterQConstOp, fcOp.bias(), 1, 1, - fcOp.fused_activation_function(), "VALID", 1, 1); - - // Add a ReshapeOp after Conv2D for squeezing output back to 2 dims - auto newConv2DOutputType = - newConv2DOp.output().getType().cast(); - std::vector squeezedShapeVector = { - newConv2DOutputType.getShape()[0], newConv2DOutputType.getShape()[3]}; - auto squeezedOutputResultType = RankedTensorType::get( - squeezedShapeVector, newConv2DOutputType.getElementType()); - auto squeezedShapeConstantOp = rewriter.create( - fcOp.getLoc(), - DenseElementsAttr::get( - RankedTensorType::get({2}, rewriter.getIntegerType(64)), - llvm::makeArrayRef(squeezedShapeVector))); - auto reshapeOutputOp = rewriter.create( - fcOp.getLoc(), squeezedOutputResultType, newConv2DOp.output(), - squeezedShapeConstantOp); - - // Replace the FC with the new ops - rewriter.replaceOp(fcOp, reshapeOutputOp.output()); - - return success(); - } -}; - -void ReplaceFCWithConv2D::runOnFunction() { - auto *ctx = &getContext(); - auto func = getFunction(); - - OwningRewritePatternList patterns(ctx); - patterns.insert(ctx); - (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); -} -} // namespace - -// Creates an instance of the ReplaceFCWithConv2D pass. -std::unique_ptr> createReplaceFCWithConv2DPass() { - return std::make_unique(); -} - -static PassRegistration - pass("xcore-replace-fc-with-conv2d", - "Replace suitable TFL FullyConnected with TFL Conv2D for XCore."); - -} // namespace xcore -} // namespace mlir diff --git a/experimental/xformer/Transforms/TFLPatterns.td b/experimental/xformer/Transforms/TFLPatterns.td deleted file mode 100644 index 885c56d60..000000000 --- a/experimental/xformer/Transforms/TFLPatterns.td +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -include "mlir/Dialect/StandardOps/IR/Ops.td" -include "tensorflow/compiler/mlir/lite/ir/tfl_ops.td" -include "larq_compute_engine/mlir/ir/lce_ops.td" - -// Casts $1 to a dequantized type and then casts that to a quantized type -// using the quantization parameters from the type in $0 -// $0 = tensor -// $1 = tensor -// We create tensor -class UpdateShapeWithAxis - : NativeCodeCall< - "quant::CastQuantizedTypeAttrFromExpressedType($_builder, $0, " - "quant::QuantizedType::castToExpressedType($1.getType()), " #i #")">; - -// Convert Quantize(Reshape()) -> Reshape(Quantize()) -// This is to merge Quantize with Conv2D if possible -def : Pat<(TFL_QuantizeOp(TFL_ReshapeOp $input, $shape), $qtype), - (TFL_ReshapeOp(TFL_QuantizeOp $input, - (UpdateShapeWithAxis<-1> $qtype, $input)), - $shape)>; - -// Fuse Quantize(Conv2D()) -> Conv2D() -def : Pat<(TFL_QuantizeOp(TFL_Conv2DOp $input, $f, $b, $dh, $dw, $faf, $p, $sh, - $sw), - $qtype), - (TFL_Conv2DOp $input, $f, $b, $dh, $dw, $faf, $p, $sh, $sw)>; - -// Get padding values and output type as two return values -def GetBConv2DPaddingValues - : NativeCodeCall<"getBConv2DPaddingValues($_builder, " - "$0.getDefiningOp())", - 2>; - -// Replace LQ_Bconv2DOp of SAME padding with a pad_value of one with -// LQ_Bconv2DOp(TFL_Pad()) of VALID padding. We cannot do this when the -// pad_value is zero as detailed below. -// Comment copied from -// https://github.com/larq/compute-engine/blob/main/larq_compute_engine/core/bconv2d/zero_padding_correction.h#L6 -// "When we compute a convolution that requires "SAME" padding we pad with the -// value zero, meaning bitpacked bits 0, representing the value +1; thus we -// compute 'same one' padding by default. A correction is needed if we want -// 'same zero' padding instead -- we have to add or subtract a value to elements -// at the edge of the output tensor." -def : Pat<(LQ_Bconv2dOp - : $output $input, $f, $m, $b, $t, $cin, $dh, $dw, $faf, - ConstantAttr, ConstantAttr, $sh, - $sw), - (LQ_Bconv2dOp(TFL_PadOp $input, - (GetBConv2DPaddingValues - : $ret__0 $output), - (returnType $ret__1)), - $f, $m, $b, $t, $cin, $dh, $dw, $faf, ConstantAttr, - ConstantAttr, $sh, $sw)>; diff --git a/experimental/xformer/Transforms/TranslateToCustomOp.cpp b/experimental/xformer/Transforms/TranslateToCustomOp.cpp deleted file mode 100644 index 42ed8ef26..000000000 --- a/experimental/xformer/Transforms/TranslateToCustomOp.cpp +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "IR/XCoreOps.h" - -#include "flatbuffers/flexbuffers.h" -#include "mlir/Pass/Pass.h" -#include "mlir/Transforms/GreedyPatternRewriteDriver.h" -#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" - -namespace mlir { -namespace xcore { - -std::vector Bsign8Op::buildCustomOptions() { return {}; } -std::vector Lookup8Op::buildCustomOptions() { return {}; } - -std::vector LoadFlashOp::buildCustomOptions() { - flexbuffers::Builder fbb; - fbb.Map([&]() { - fbb.Int("addr", (int32_t)address()); - fbb.Int("size", (int32_t)size()); - }); - fbb.Finish(); - return fbb.GetBuffer(); -} - -std::vector PadOp::buildCustomOptions() { - flexbuffers::Builder fbb; - fbb.Map([&]() { fbb.Int("pad_value", (int32_t)pad_value()); }); - fbb.Finish(); - return fbb.GetBuffer(); -} - -std::vector Conv2DV2Op::buildCustomOptions() { - int threadCount = (int)thread_count(); - - flexbuffers::Builder fbb; - auto rootMap = fbb.StartMap(); - auto threadsVec = fbb.StartVector("threads"); - for (int i = 0; i < threadCount; ++i) { - auto vec = fbb.StartVector(); - fbb.Int((int32_t)scratch_bytes() - .cast()[i] - .cast() - .getInt()); - fbb.Int((int32_t)(symbolizeConv2DType(conv2d_kernel_type() - .cast()[i] - .cast() - .getValue() - .str()) - .getValue())); - fbb.String(abstract_kernel_params() - .cast()[i] - .cast() - .getValue() - .str()); - fbb.String(memcpy_fn_params() - .cast()[i] - .cast() - .getValue() - .str()); - fbb.String(aggregate_fn_params() - .cast()[i] - .cast() - .getValue() - .str()); - fbb.String(output_transform_fn_params() - .cast()[i] - .cast() - .getValue() - .str()); - fbb.EndVector(vec, false, false); - } - fbb.EndVector(threadsVec, false, false); - - fbb.EndMap(rootMap); - fbb.Finish(); - return fbb.GetBuffer(); -} - -namespace { -/// This pass translates XCore ops to TFLite custom ops. -struct TranslateToCustomOp - : public PassWrapper { - void runOnFunction() override; -}; - -template -struct RewriteToCustomOp : public OpRewritePattern { - using OpRewritePattern::OpRewritePattern; - - LogicalResult matchAndRewrite(XCoreOp xc_op, - PatternRewriter &rewriter) const override { - auto options = xc_op.buildCustomOptions(); - auto *op = xc_op.getOperation(); - auto type = RankedTensorType::get({static_cast(options.size())}, - rewriter.getIntegerType(8)); - std::string options_bytes(options.begin(), options.end()); - auto attr = OpaqueElementsAttr::get(op->getDialect(), type, options_bytes); - - rewriter.replaceOpWithNewOp( - op, op->getResultTypes(), op->getOperands(), - "XC_" + std::string(XCoreOp::getOperationName().drop_front(3)), attr); - return success(); - } -}; - -void TranslateToCustomOp::runOnFunction() { - auto *ctx = &getContext(); - OwningRewritePatternList patterns(ctx); - auto func = getFunction(); - - patterns.insert>(ctx); - patterns.insert>(ctx); - patterns.insert>(ctx); - patterns.insert>(ctx); - patterns.insert>(ctx); - - (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); -} - -} // namespace - -// Creates an instance of the TranslateToCustomOp pass. -std::unique_ptr> createTranslateToCustomOpPass() { - return std::make_unique(); -} - -static PassRegistration - pass("xcore-translate-to-customop", - "Translate to custom ops in TensorFlow Lite dialect"); - -} // namespace xcore -} // namespace mlir diff --git a/experimental/xformer/Transforms/WriteFlashImage.cpp b/experimental/xformer/Transforms/WriteFlashImage.cpp deleted file mode 100644 index 6f684a0be..000000000 --- a/experimental/xformer/Transforms/WriteFlashImage.cpp +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "IR/XCoreOps.h" -#include "Transforms/Options.h" -#include "Utils/FileIO.h" - -#include "mlir/Pass/Pass.h" -#include "mlir/Support/FileUtilities.h" -#include "mlir/Transforms/GreedyPatternRewriteDriver.h" -#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" -#include "llvm/Support/ToolOutputFile.h" - -namespace mlir { -namespace xcore { - -namespace { -// Write flash image -struct WriteFlashImage : public PassWrapper { - void getDependentDialects(DialectRegistry ®istry) const final { - registry.insert(); - } - void runOnFunction() override; -}; - -struct WriteFlashImagePattern : public OpRewritePattern { - WriteFlashImagePattern(std::vector> *tensorsVec, - MLIRContext *context) - : OpRewritePattern(context), tensorsVec_(tensorsVec) {} - - LogicalResult matchAndRewrite(LoadConstantOp loadOp, - PatternRewriter &rewriter) const override { - DenseElementsAttr attr; - if (loadOp.input() - .getType() - .cast() - .getElementType() - .isa()) { - auto qConstOp = dyn_cast(loadOp.input().getDefiningOp()); - attr = qConstOp.value().template cast(); - } else if (!matchPattern(loadOp.input(), m_Constant(&attr))) { - return failure(); - } - - std::vector tensorData; - int n = attr.isSplat() ? attr.getNumElements() : 1; - for (int i = 0; i < n; ++i) { - tensorData.insert(tensorData.end(), attr.getRawData().begin(), - attr.getRawData().end()); - } - - int address = 0; - for (auto const &t : *tensorsVec_) { - address += t.size(); - } - - // Create a LoadFlashOp with data addr and tensor size - auto loadFlashOp = rewriter.create( - loadOp.getLoc(), loadOp.getType(), address, tensorData.size()); - tensorsVec_->push_back(tensorData); - - // Replace the LoadOp with the new LoadFlashOp - rewriter.replaceOp(loadOp, loadFlashOp.output()); - return success(); - } - -private: - std::vector> *tensorsVec_; -}; - -void WriteFlashImage::runOnFunction() { - auto f = getFunction(); - if (flashImageFilenameOption.empty()) { - f.emitError("Flash image file option should be provided to run this pass!"); - signalPassFailure(); - return; - } - - auto *ctx = &getContext(); - auto func = getFunction(); - // For each LoadOp in the graph, save the tensor data, and replace the LoadOp - // with a LoadFlashOp - std::vector> tensorsVec; - OwningRewritePatternList patterns(ctx); - patterns.insert(&tensorsVec, ctx); - (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); - - // Write tensor data to flash image file - if (failed( - utils::writeFlashImageToFile(flashImageFilenameOption, tensorsVec))) { - f.emitError("Failed to write flash image!"); - signalPassFailure(); - return; - } -} -} // namespace - -// Creates an instance of the WriteFlashImage pass. -std::unique_ptr> createWriteFlashImagePass() { - return std::make_unique(); -} - -static PassRegistration pass("xcore-write-flash-image", - "Write flash image."); - -} // namespace xcore -} // namespace mlir diff --git a/experimental/xformer/Transforms/XCPatterns.td b/experimental/xformer/Transforms/XCPatterns.td deleted file mode 100644 index d32e91c88..000000000 --- a/experimental/xformer/Transforms/XCPatterns.td +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -// This is the optimization pattern definition file for XCore. -include "mlir/Dialect/StandardOps/IR/Ops.td" -include "tensorflow/compiler/mlir/lite/ir/tfl_ops.td" -include "larq_compute_engine/mlir/ir/lce_ops.td" - -include "IR/XCoreOps.td" - -// Activation lowering patterns -def getLookupTable - : NativeCodeCall<"getLookupTable($_builder, $0.getDefiningOp())">; - -// TODO: DPK -// foreach activationOp = -// [TFL_ReluOp, TFL_Relu6Op, TFL_TanhOp, TFL_LogisticOp] in { -// def: -// Pat<(activationOp -// : $output TensorOf<[QI8]>:$input), -// (XC_Lookup8Op $input, (ConstantOp (getLookupTable $output)))>; -// } - -// Pad pattern -// We only support padding for 4 dimensions -def HasValidPaddingShape - : Constraint().getDimSize(0) == 4">>; - -// We only support spatial padding -def HasNoPaddingForBatchAndChannel - : Constraint().getNumElements() == 8 && " - "($0.cast().getValue({0,0}) == 0 &&" - "$0.cast().getValue({0,1}) == 0 &&" - "$0.cast().getValue({3,0}) == 0 &&" - "$0.cast().getValue({3,1}) == 0)">>; - -// We only support bytes per pixel being a multiple of four -// Check if channel dimension size * sizeof(input type) is divisible by 4 -def HasValidBytesPerPixel : Constraint().getElementType().isIntOrFloat() &&" - "($0.getType().cast().getElementType()." - "getIntOrFloatBitWidth() / 8 * " - "$0.getType().cast().getDimSize(3)) % 4 == 0">, - CPred<"$0.getType().cast().getElementType().isa() &&" - "($0.getType().cast().getElementType().cast().getStorageTypeIntegralWidth() / 8 * " - "$0.getType().cast().getDimSize(3)) % 4 == 0"> -]>>; - -def getPadValue : NativeCodeCall<"getPadValue($_builder, $0)">; - -// TODO: Remove when we have fusing of Pad and Conv2D in xformer2 -// Replacing pad when there is a following Conv2D after a Pad is breaking fusing -// passes in xformer1 -def HasNoFollowingConv2D : Constraint>; - -// TODO : DPK -// Not using XC_Pad in our runtime at the moment -// Would fail with "Failed to get registration from op code CUSTOM" -// def : Pat<(TFL_PadOp -// : $output $input, (TFL_ConstOp -// : $padding_op $padding_attr)), -// (XC_PadOp $input, $padding_op, (getPadValue $input)), [ -// (HasValidPaddingShape $padding_op), -// (HasNoPaddingForBatchAndChannel $padding_attr), -// (HasValidBytesPerPixel $input), (HasNoFollowingConv2D $output) -// ]>; - -// Fuse XC_Conv2D(Reshape()) -> XC_Conv2D() -def : Pat<(XC_Conv2DV2Op - : $cout(TFL_ReshapeOp - : $rout $input, $shape), - $tc, $scratch, $weights, $muls, $akp, $mp, $aggp, $otp, $ktp), - (XC_Conv2DV2Op $input, $tc, $scratch, $weights, $muls, $akp, $mp, - $aggp, $otp, $ktp)>; - -// Fuse Reshape(XC_Conv2D()) -> XC_Conv2D() -def : Pat<(TFL_ReshapeOp - : $rout(XC_Conv2DV2Op $input, $tc, $scratch, $weights, $muls, $akp, - $mp, $aggp, $otp, $ktp), - $shape), - (XC_Conv2DV2Op $input, $tc, $scratch, $weights, $muls, $akp, $mp, - $aggp, $otp, $ktp)>; - -// Replace LQ_QuantizeOp with XC_bsign_8 -def : Pat<(LQ_QuantizeOp $input), (XC_Bsign8Op $input)>; diff --git a/experimental/xformer/Utils/FileIO.cpp b/experimental/xformer/Utils/FileIO.cpp deleted file mode 100644 index 943f5f24b..000000000 --- a/experimental/xformer/Utils/FileIO.cpp +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "Utils/FileIO.h" - -#include "mlir/Support/FileUtilities.h" -#include "tensorflow/compiler/mlir/lite/flatbuffer_export.h" -#include "tensorflow/compiler/mlir/lite/flatbuffer_import.h" -#include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/ToolOutputFile.h" - -namespace mlir { -namespace xcore { -namespace utils { - -LogicalResult writeDataToFile(std::string &filename, std::string &data) { - auto outputFile = openOutputFile(filename); - if (!outputFile) { - llvm::errs() << "Could not open output file: " << filename << "\n"; - return failure(); - } - outputFile->os() << data; - outputFile->keep(); - return success(); -} - -LogicalResult writeFlashImageToFile(std::string &filename, - std::vector> tensorsVec) { - - // Combine data for the tensors - std::string data; - for (auto const &tensor : tensorsVec) { - data += std::string(tensor.data(), tensor.size()); - } - - return utils::writeDataToFile(filename, data); -} - -LogicalResult writeMLIRToFlatBufferFile(std::string &filename, - mlir::ModuleOp module, - const bool &dontMinify) { - std::string serialized_flatbuffer; - std::unique_ptr op_or_arg_name_mapper; - if (dontMinify) { - op_or_arg_name_mapper = - std::make_unique(); - } else { - op_or_arg_name_mapper = - std::make_unique(); - } - - tflite::FlatbufferExportOptions options; - options.emit_builtin_tflite_ops = true; - options.emit_select_tf_ops = true; - options.emit_custom_ops = true; - options.op_or_arg_name_mapper = op_or_arg_name_mapper.get(); - - if (tflite::MlirToFlatBufferTranslateFunction(module, options, - &serialized_flatbuffer)) { - return writeDataToFile(filename, serialized_flatbuffer); - } else { - emitError(UnknownLoc::get(module.getContext())) - << "Error converting MLIR to flatbuffer, no file written"; - return failure(); - } -} - -mlir::OwningModuleRef readFlatBufferFileToMLIR(std::string &filename, - mlir::MLIRContext *context) { - std::string errorMessage; - auto inputFile = openInputFile(filename, &errorMessage); - if (!inputFile) { - emitError(UnknownLoc::get(context)) << errorMessage; - return mlir::OwningModuleRef(nullptr); - } - - auto loc = mlir::FileLineColLoc::get(context, filename, 0, 0); - OwningModuleRef mod = - tflite::FlatBufferToMlir(absl::string_view(inputFile->getBufferStart(), - inputFile->getBufferSize()), - context, loc); - return mod; -} - -} // namespace utils -} // namespace xcore -} // namespace mlir diff --git a/experimental/xformer/Utils/FileIO.h b/experimental/xformer/Utils/FileIO.h deleted file mode 100644 index e6db3e469..000000000 --- a/experimental/xformer/Utils/FileIO.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#ifndef XFORMER_UTILS_FILEIO_H -#define XFORMER_UTILS_FILEIO_H - -#include "mlir/IR/BuiltinOps.h" -#include "mlir/Support/FileUtilities.h" - -namespace mlir { -namespace xcore { -namespace utils { - -LogicalResult writeDataToFile(std::string &filename, std::string &data); - -LogicalResult writeFlashImageToFile(std::string &filename, - std::vector> tensorsVec); - -LogicalResult writeMLIRToFlatBufferFile(std::string &filename, - mlir::ModuleOp module, - const bool &dontMinify); - -mlir::OwningModuleRef readFlatBufferFileToMLIR(std::string &filename, - mlir::MLIRContext *context); - -} // namespace utils -} // namespace xcore -} // namespace mlir - -#endif // XFORMER_UTILS_FILEIO_H diff --git a/experimental/xformer/WORKSPACE b/experimental/xformer/WORKSPACE deleted file mode 100644 index 01219ff42..000000000 --- a/experimental/xformer/WORKSPACE +++ /dev/null @@ -1,70 +0,0 @@ -workspace(name = "xformer") - -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") - -################################## Skylib ##################################### -SKYLIB_VERSION = "1.0.3" - -http_archive( - name = "bazel_skylib", - sha256 = "1c531376ac7e5a180e0237938a2536de0c54d93f5c278634818e0efc952dd56c", - urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/{version}/bazel-skylib-{version}.tar.gz".format(version = SKYLIB_VERSION), - "https://github.com/bazelbuild/bazel-skylib/releases/download/{version}/bazel-skylib-{version}.tar.gz".format(version = SKYLIB_VERSION), - ], -) -load("@bazel_skylib//lib:paths.bzl", "paths") - -################################## TensorFlow ################################## -http_archive( - name = "org_tensorflow", - patch_args = ["-p0"], - patch_tool = "patch", - patches = [ - "//patches:llvm_update.patch", - ], - sha256 = "e68c1d346fc3d529653530ca346b2c62f5b31bd4fcca7ffc9c65bb39ab2f6ed3", - strip_prefix = "tensorflow-2.6.2", - urls = [ - "https://github.com/tensorflow/tensorflow/archive/v2.6.2.tar.gz", - ], -) - -# Import all of the tensorflow dependencies. Note that we are deliberately -# letting TensorFlow take control of all the dependencies it sets up, whereas -# ours are initialized with `maybe`. Actually tracking this with Bazel is PITA -# and for now this gets TF stuff building. This includes, for instance, -# @llvm-project and @com_google_absl. -load("@org_tensorflow//tensorflow:workspace3.bzl", "tf_workspace3") -tf_workspace3() -load("@org_tensorflow//tensorflow:workspace2.bzl", "tf_workspace2") -tf_workspace2() -load("@org_tensorflow//tensorflow:workspace1.bzl", "tf_workspace1") -tf_workspace1() -load("@org_tensorflow//tensorflow:workspace0.bzl", "tf_workspace0") -tf_workspace0() - -################################# lib_nn ####################################### -new_local_repository( - name = "lib_nn", - path = "../../third_party/lib_nn", - build_file = "lib_nn.BUILD", -) - -########################### larq compute engine ################################ -http_archive( - name = "lce", - patch_args = ["-p0"], - patch_tool = "patch", - patches = [ - "//patches:larq_to_main.patch", - "//patches:bazel_fix.patch", - ], - sha256 = "a7a47c0cf2ba9acfac2ea686aed12807cbe35c2cefa08f032dd1ca692d86aa11", - strip_prefix = "compute-engine-0.6.2", - urls = [ - "https://github.com/larq/compute-engine/archive/refs/tags/v0.6.2.tar.gz", - ], -) - diff --git a/experimental/xformer/XCoreOptMain.cpp b/experimental/xformer/XCoreOptMain.cpp deleted file mode 100644 index ad57f340e..000000000 --- a/experimental/xformer/XCoreOptMain.cpp +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -// XMOS Public License: Version 1 - -#include "IR/XCoreOps.h" -#include "Transforms/Options.h" -#include "Transforms/Passes.h" -#include "Utils/FileIO.h" - -#include "mlir/IR/AsmState.h" -#include "mlir/Parser.h" -#include "mlir/Pass/PassManager.h" -#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" -#include "llvm/Support/InitLLVM.h" -#include "llvm/Support/SourceMgr.h" -#include "llvm/Support/ToolOutputFile.h" - -using namespace llvm; -using namespace mlir; - -// TODO: -namespace mlir { -namespace xcore { - -cl::opt flashImageFilenameOption( - "xcore-flash-image-file", - cl::desc("The file to write the xcore flash image."), - cl::value_desc("filename"), cl::init("")); - -cl::opt loadExternallyIfLargerOption( - "xcore-load-externally-if-larger", - cl::desc("Load constants externally if larger than given limit in bytes " - "(default = 96 bytes). Cannot be specified when " - "xcore-flash-image-file is not provided."), - cl::init(96)); - -cl::opt reduceMemoryOption( - "xcore-reduce-memory", - cl::desc( - "Try to reduce memory usage by possibly increasing execution time."), - cl::init(true)); - -} // namespace xcore -} // namespace mlir - -LogicalResult runPassPipeline(const PassPipelineCLParser &passPipeline, - const OwningModuleRef &mod, - MLIRContext *context) { - PassManager pm(context, mlir::OpPassManager::Nesting::Implicit); - applyPassManagerCLOptions(pm); - - auto errorHandler = [&](const Twine &msg) { - return emitError(UnknownLoc::get(context)) << msg; - }; - - if (passPipeline.hasAnyOccurrences()) { - // Build the provided pipeline. - if (failed(passPipeline.addToPipeline(pm, errorHandler))) - return failure(); - - // Run the pipeline. - if (failed(pm.run(*mod))) - return failure(); - - } else { - xcore::buildXCorePassPipeline(pm); - if (failed(pm.run(*mod))) { - return failure(); - } - } - return success(); -} - -int main(int argc, char **argv) { - llvm::InitLLVM y(argc, argv); - - static cl::opt inputFilename(cl::Positional, - cl::desc("")); - static cl::opt outputFilename("o", cl::desc("Output filename"), - cl::value_desc("filename")); - static cl::opt mlirIOEnabled( - "mlir-io", cl::desc("Enable MLIR input and output"), cl::init(false)); - static cl::opt verifyDiagnosticsEnabled( - "verify-diagnostics", - cl::desc("Check that emitted diagnostics match " - "expected-* lines on the corresponding line"), - cl::init(false)); - static cl::opt dontMinifyEnabled( - "xcore-dont-minify", - cl::desc("Do not strip debug info and minify the model"), - cl::init(false)); - - // Register any command line options. - registerAsmPrinterCLOptions(); - registerMLIRContextCLOptions(); - registerPassManagerCLOptions(); - xcore::registerXCorePassPipeline(); - PassPipelineCLParser passPipeline("", "Compiler passes to run"); - cl::ParseCommandLineOptions(argc, argv); - - // Initialize dialects. - MLIRContext context; - context.loadDialect(); - context.loadDialect(); - context.loadDialect(); - context.loadDialect(); - context.printOpOnDiagnostic(!verifyDiagnosticsEnabled); - - auto failedMessage = [&](const Twine &msg) { - emitError(UnknownLoc::get(&context)) << msg; - return 1; - }; - - // Validate options - if (mlir::xcore::loadExternallyIfLargerOption.getNumOccurrences() > 0 && - mlir::xcore::flashImageFilenameOption.empty()) { - return failedMessage( - "Please specify the xcore-flash-image-file option when specifying the " - "xcore-load-externally-if-larger option!"); - } - - // Parse input. - OwningModuleRef mod; - SourceMgr sourceMgr; - if (mlirIOEnabled) { - // Parse the MLIR input file. - std::string errorMessage; - auto file = openInputFile(inputFilename, &errorMessage); - if (!file) { - return failedMessage(errorMessage); - } - sourceMgr.AddNewSourceBuffer(std::move(file), SMLoc()); - mod = parseSourceFile(sourceMgr, &context); - } else { - // Read flatbuffer and convert to serialized MLIR string. - mod = xcore::utils::readFlatBufferFileToMLIR(inputFilename, &context); - if (!mod) { - return failedMessage("Unable to read flatbuffer file!"); - } - } - - // Run transformations - if (verifyDiagnosticsEnabled) { - SourceMgrDiagnosticVerifierHandler sourceMgrHandler(sourceMgr, &context); - (void)runPassPipeline(passPipeline, mod, &context); - if (failed(sourceMgrHandler.verify())) { - return 1; - } - } else { - if (failed(runPassPipeline(passPipeline, mod, &context))) { - return 1; - } - } - - // Print output - if (mlirIOEnabled) { - // Print the MLIR output to stdout - std::string errorMessage; - auto output = openOutputFile("-", &errorMessage); - if (!output) { - return failedMessage(errorMessage); - } - mod->print(output->os()); - output->os() << '\n'; - } - // Write modified flatbuffer to output file - if (!outputFilename.empty()) { - std::string outfilename(outputFilename); - if (failed(xcore::utils::writeMLIRToFlatBufferFile(outfilename, mod.get(), - dontMinifyEnabled))) - return 1; - } - - return 0; -} diff --git a/experimental/xformer/lib_nn.BUILD b/experimental/xformer/lib_nn.BUILD deleted file mode 100644 index d3ad6a21d..000000000 --- a/experimental/xformer/lib_nn.BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package( - default_visibility = ["//visibility:public"], -) - -cc_library( - name = "libnn_lib2", - hdrs = glob(["lib_nn/api/*.h*"]) + - glob(["lib_nn/api/geom/*.h*"]) + - glob(["lib_nn/src/asm/*.h*"]) + - glob(["lib_nn/src/*.h*"]), - srcs = ["lib_nn.dylib"], - deps = [], -) - - -cc_library( - name = "libnn_lib", - hdrs = glob(["lib_nn/api/*.h*"]) + - glob(["lib_nn/api/geom/*.h*"]) + - glob(["lib_nn/src/asm/*.h*"]) + - glob(["lib_nn/src/*.h*"]), - srcs = glob(["lib_nn/src/c/*.c"]) + - glob(["lib_nn/src/c/util/depthwise/*.c"]) + - glob(["lib_nn/src/c/util/deep/*.c"]) + - glob(["lib_nn/src/c/util/binary/*.c"]) + - glob(["lib_nn/src/c/util/shallow/*.c"]) + - glob(["lib_nn/src/asm/*.c"]) + - glob(["lib_nn/src/cpp/*.cpp"]) + - glob(["lib_nn/src/cpp/filt2d/*.cpp"]) + - glob(["lib_nn/src/cpp/filt2d/geom/*.cpp"]), - copts = ["-DNN_USE_REF -Iexternal/lib_nn/lib_nn/api"], - deps = [], - alwayslink = 1, -) diff --git a/experimental/xformer/modelrunner.py b/experimental/xformer/modelrunner.py deleted file mode 100755 index 263d2fd2f..000000000 --- a/experimental/xformer/modelrunner.py +++ /dev/null @@ -1,174 +0,0 @@ -# Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -# XMOS Public License: Version 1 -import os -import tempfile -import sys -import subprocess -import numpy as np -import pathlib -import argparse -from cv2 import cv2 - -import tensorflow as tf -import larq_compute_engine as lce -from tflm_interpreter import TFLMInterpreter - -XFORMER2_PATH = (pathlib.Path(__file__).resolve().parents[0] / "bazel-bin" / - "xcore-opt") - - -def get_xformed_model(model): - with tempfile.TemporaryDirectory(suffix=str(os.getpid())) as dirname: - input_path = pathlib.Path(dirname) / "input.tflite" - - with open(pathlib.Path(input_path).resolve(), "wb") as fd: - fd.write(model) - - output_path = pathlib.Path(dirname) / "output.tflite" - cmd = [str(XFORMER2_PATH), str(input_path), "-o", str(output_path), - #"--xcore-replace-avgpool-with-conv2d", - #"--xcore-replace-with-conv2dv2", - #"--xcore-translate-to-customop" - ] - p = subprocess.run(cmd, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - check=True) - print(p.stdout) - - with open(pathlib.Path(output_path).resolve(), "rb") as fd: - bits = bytes(fd.read()) - return bits - - -def test_inference(args): - model = args.model - - with open(model, "rb") as fd: - model_content = fd.read() - - # for attaching a debugger - if args.s: - import time - time.sleep(5) - - if args.bnn: - print("Creating LCE interpreter...") - interpreter = lce.testing.Interpreter(model_content, num_threads=1, use_reference_bconv=True) - #interpreter = lce.testing.Interpreter(model_content, num_threads=1) - input_tensor_type = interpreter.input_types[0] - input_tensor_shape = interpreter.input_shapes[0] - - else: - print("Creating TFLite interpreter...") - interpreter = tf.lite.Interpreter( - model_content=model_content, - experimental_op_resolver_type=tf.lite.experimental. - OpResolverType.BUILTIN_REF, experimental_preserve_all_tensors=True) - # interpreter = tensorflow.lite.Interpreter( - # model_content=model_content) - interpreter.allocate_tensors() - input_tensor_details = interpreter.get_input_details()[0] - input_tensor_type = input_tensor_details["dtype"] - input_tensor_shape = input_tensor_details["shape"] - - # input_tensor = np.array(100 * np.random.random_sample(input_tensor_shape), dtype=input_tensor_type) - # interpreter.set_tensor(input_tensor_details["index"], input_tensor) - # print("Invoking TFLite interpreter...") - # interpreter.invoke() - - if args.input: - print("Input provided via file...") - s = input_tensor_shape - img = cv2.imread(args.input) - res = cv2.resize(img, dsize=(s[1], s[2]), interpolation=cv2.INTER_CUBIC) - - input_tensor = np.array(res, dtype=input_tensor_type) - input_tensor.shape = input_tensor_shape - - #print(repr(input_tensor)) - print("Invoking xformer to get converted model...") - xformed_model = get_xformed_model(model_content) - - print("Creating TFLM XCore interpreter...") - ie = TFLMInterpreter(model_content=xformed_model) - - if args.cifar: - (_,_), (test_images,_) = tf.keras.datasets.cifar10.load_data() - # shift images from 0-255 to -128-127 - test_images = tf.cast(test_images - 128.0, tf.int8) - - # Run tests - num_of_fails = 0 - for test in range(0, int(args.n)): - print("Run #" + str(test)) - if args.cifar: - print("Using cifar images...") - # add batch dim - input_tensor = np.expand_dims(test_images[test], axis=0) - else: - print("Creating random input...") - input_tensor = np.array(100 * np.random.random_sample(input_tensor_shape), dtype=input_tensor_type) - #input_tensor = np.array(100 * np.ones(input_tensor_shape), dtype=input_tensor_type) - - - if args.bnn: - print("Invoking LCE interpreter...") - outputs = interpreter.predict(input_tensor) - # for some reason, batch dim is missing in lce when only one output - if len(outputs) == 1: - outputs = [outputs] - num_of_outputs = len(outputs) - else: - interpreter.set_tensor(input_tensor_details["index"], input_tensor) - print("Invoking TFLite interpreter...") - interpreter.invoke() - - num_of_outputs = len(interpreter.get_output_details()) - outputs = [] - for i in range(num_of_outputs): - outputs.append( - interpreter.get_tensor( - interpreter.get_output_details()[i]["index"])) - - # print("Creating 2nd LCE interpreter...") - # ie = lce.testing.Interpreter(xformed_model, num_threads=1, use_reference_bconv=True) - # outputs2 = ie.predict(input_tensor) - # # for some reason, batch dim is missing in lce when only one output - # if len(outputs2) == 1: - # outputs2 = [outputs2] - # print(outputs2) - - ie.set_input_tensor(0, input_tensor) - print("Invoking XCORE interpreter...") - ie.invoke() - xformer_outputs = [] - for i in range(num_of_outputs): - xformer_outputs.append(ie.get_output_tensor(i)) - - # Compare outputs - for i in range(num_of_outputs): - print("Comparing output number " + str(i) + "...") - try: - np.testing.assert_equal(outputs[i], xformer_outputs[i]) - except Exception as e: - num_of_fails += 1 - print(e) - print("Run #" + str(test) + " failed") - #np.testing.assert_equal(outputs[i], outputs2[i]) - return num_of_fails - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("model", help="provide model tflite file") - parser.add_argument("--input", help="input file") - parser.add_argument("--bnn", default=False, action='store_true', help="run bnn") - parser.add_argument("--s", default=False, action='store_true', help="sleep for 5 seconds") - parser.add_argument("--cifar", default=False, action='store_true', help="enable cifar test data") - parser.add_argument("--n", default=1, help="num of runs") - args = parser.parse_args() - - num_of_fails = test_inference(args) - print("\nTotal tests = " + str(args.n)) - print("Total fails = " + str(num_of_fails)) diff --git a/experimental/xformer/patches/bazel_fix.patch b/experimental/xformer/patches/bazel_fix.patch deleted file mode 100644 index 1b612fd10..000000000 --- a/experimental/xformer/patches/bazel_fix.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- larq_compute_engine/mlir/BUILD 2022-01-10 15:22:39.000000000 +0000 -+++ BUILD2 2022-01-10 15:24:18.000000000 +0000 -@@ -319,6 +319,7 @@ - ], - deps = [ - "@llvm-project//mlir:StandardOps", -+ "@llvm-project//mlir:Pass", - ], - alwayslink = 1, - ) diff --git a/experimental/xformer/patches/larq_to_main.patch b/experimental/xformer/patches/larq_to_main.patch deleted file mode 100644 index 024a7800d..000000000 --- a/experimental/xformer/patches/larq_to_main.patch +++ /dev/null @@ -1,719 +0,0 @@ -diff --git larq_compute_engine/mlir/BUILD larq_compute_engine/mlir/BUILD -index 792d189..e3a5dc5 100644 ---- larq_compute_engine/mlir/BUILD -+++ larq_compute_engine/mlir/BUILD -@@ -1,4 +1,4 @@ --load("@org_tensorflow//third_party/mlir:tblgen.bzl", "gentbl") -+load("@org_tensorflow//third_party/mlir:tblgen.bzl", "gentbl", "td_library") - load("@org_tensorflow//tensorflow:tensorflow.bzl", "pybind_extension", "tf_cc_binary") - - package( -@@ -6,9 +6,22 @@ package( - licenses = ["notice"], # Apache 2.0 - ) - -+td_library( -+ name = "lce_ops_td_file", -+ srcs = [ -+ "ir/lce_ops.td", -+ ], -+ deps = [ -+ "@llvm-project//mlir:SideEffectTdFiles", -+ "@org_tensorflow//tensorflow/compiler/mlir/lite/quantization:quantization_td_files", -+ ], -+) -+ - gentbl( - name = "lce_ops_inc_gen", - tbl_outs = [ -+ ("-gen-enum-decls", "ir/lce_enum.h.inc"), -+ ("-gen-enum-defs", "ir/lce_enum.cc.inc"), - ("-gen-op-decls", "ir/lce_ops.h.inc"), - ("-gen-op-defs", "ir/lce_ops.cc.inc"), - ("-gen-dialect-decls -dialect=lq", "ir/lce_dialect.h.inc"), -@@ -18,8 +31,7 @@ gentbl( - td_file = "ir/lce_ops.td", - td_includes = ["external/org_tensorflow"], - td_srcs = [ -- "@org_tensorflow//tensorflow/compiler/mlir/lite/quantization:quantization_td_files", -- "@llvm-project//mlir:SideEffectTdFiles", -+ ":lce_ops_td_file", - ], - ) - -@@ -46,7 +58,7 @@ gentbl( - td_file = "transforms/prepare_patterns_target_arm.td", - td_includes = ["external/org_tensorflow"], - td_srcs = [ -- "ir/lce_ops.td", -+ ":lce_ops_td_file", - "transforms/op_removal_patterns.td", - "transforms/prepare_patterns_common.td", - "@llvm-project//mlir:StdOpsTdFiles", -@@ -64,7 +76,7 @@ gentbl( - td_file = "transforms/prepare_patterns_common.td", - td_includes = ["external/org_tensorflow"], - td_srcs = [ -- "ir/lce_ops.td", -+ ":lce_ops_td_file", - "transforms/op_removal_patterns.td", - "@llvm-project//mlir:StdOpsTdFiles", - "@org_tensorflow//tensorflow/compiler/mlir/tensorflow:tensorflow_ops_td_files", -@@ -81,7 +93,7 @@ gentbl( - td_file = "transforms/optimize_patterns_target_arm.td", - td_includes = ["external/org_tensorflow"], - td_srcs = [ -- "ir/lce_ops.td", -+ ":lce_ops_td_file", - "transforms/optimize_patterns_common.td", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_ops_td_files", - "@llvm-project//mlir:StdOpsTdFiles", -@@ -97,7 +109,7 @@ gentbl( - td_file = "transforms/optimize_patterns_common.td", - td_includes = ["external/org_tensorflow"], - td_srcs = [ -- "ir/lce_ops.td", -+ ":lce_ops_td_file", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_ops_td_files", - "@llvm-project//mlir:StdOpsTdFiles", - ], -@@ -112,7 +124,7 @@ gentbl( - td_file = "transforms/bitpack_weights_patterns.td", - td_includes = ["external/org_tensorflow"], - td_srcs = [ -- "ir/lce_ops.td", -+ ":lce_ops_td_file", - "transforms/op_removal_patterns.td", - "@org_tensorflow//tensorflow/compiler/mlir/tensorflow:tensorflow_ops_td_files", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_ops_td_files", -@@ -129,7 +141,7 @@ gentbl( - td_file = "transforms/quantize_patterns.td", - td_includes = ["external/org_tensorflow"], - td_srcs = [ -- "ir/lce_ops.td", -+ ":lce_ops_td_file", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_ops_td_files", - ], - ) -@@ -146,6 +158,7 @@ cc_library( - "//larq_compute_engine/core:types", - "//larq_compute_engine/core/bitpacking:bitpack", - "@llvm-project//mlir:IR", -+ "@llvm-project//mlir:QuantOps", - ], - ) - -@@ -153,6 +166,8 @@ cc_library( - name = "larq_compute_engine", - srcs = [ - "ir/lce_dialect.h.inc", -+ "ir/lce_enum.cc.inc", -+ "ir/lce_enum.h.inc", - "ir/lce_ops.cc", - "ir/lce_ops.cc.inc", - "ir/lce_ops.h.inc", -@@ -263,6 +278,21 @@ cc_library( - alwayslink = 1, - ) - -+cc_library( -+ name = "larq_compute_engine_translate_tflite", -+ srcs = [ -+ "transforms/translate_tflite.cc", -+ ], -+ hdrs = [ -+ "transforms/passes.h", -+ ], -+ deps = [ -+ ":larq_compute_engine", -+ "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite", -+ ], -+ alwayslink = 1, -+) -+ - cc_library( - name = "larq_compute_engine_quantize", - srcs = [ -@@ -279,6 +309,20 @@ cc_library( - alwayslink = 1, - ) - -+cc_library( -+ name = "set_batch_size", -+ srcs = [ -+ "transforms/set_batch_size.cc", -+ ], -+ hdrs = [ -+ "transforms/passes.h", -+ ], -+ deps = [ -+ "@llvm-project//mlir:StandardOps", -+ ], -+ alwayslink = 1, -+) -+ - cc_library( - name = "lce_tfl_passes", - srcs = ["tf_tfl_passes.cc"], -@@ -292,10 +336,13 @@ cc_library( - ":larq_compute_engine_optimize", - ":larq_compute_engine_prepare", - ":larq_compute_engine_quantize", -+ ":larq_compute_engine_translate_tflite", -+ ":set_batch_size", - "@llvm-project//mlir:IR", - "@llvm-project//mlir:Pass", - "@llvm-project//mlir:QuantOps", - "@llvm-project//mlir:Transforms", -+ "@org_tensorflow//tensorflow/compiler/mlir/lite:fake_quant_utils", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_legalize_tf", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_optimize", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_quantize", -@@ -345,6 +392,7 @@ pybind_extension( - deps = [ - ":lce_tfl_passes", - ":tf_to_tfl_flatbuffer", -+ "@org_tensorflow//tensorflow/cc/saved_model:loader", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite", - "@org_tensorflow//tensorflow/compiler/mlir/lite:tf_to_tfl_flatbuffer", - "@org_tensorflow//tensorflow/compiler/mlir/lite/python:tf_tfl_flatbuffer_helpers", -diff --git larq_compute_engine/mlir/ir/lce_ops.cc larq_compute_engine/mlir/ir/lce_ops.cc -index ee024d6..f9cc1d1 100644 ---- larq_compute_engine/mlir/ir/lce_ops.cc -+++ larq_compute_engine/mlir/ir/lce_ops.cc -@@ -5,22 +5,8 @@ - #include "larq_compute_engine/mlir/transforms/bitpack.h" - #include "tensorflow/lite/schema/schema_generated.h" - --static tflite::Padding ConvertPaddingAttr(llvm::StringRef str) { -- return llvm::StringSwitch(str) -- .Case("SAME", tflite::Padding_SAME) -- .Case("VALID", tflite::Padding_VALID); --} -- --static tflite::ActivationFunctionType ConvertActivationAttr( -- llvm::StringRef str) { -- return llvm::StringSwitch(str) -- .Case("NONE", tflite::ActivationFunctionType_NONE) -- .Case("RELU", tflite::ActivationFunctionType_RELU) -- .Case("RELU_N1_TO_1", tflite::ActivationFunctionType_RELU_N1_TO_1) -- .Case("RELU6", tflite::ActivationFunctionType_RELU6); --} -- - #define GET_OP_CLASSES -+#include "larq_compute_engine/mlir/ir/lce_enum.cc.inc" - #include "larq_compute_engine/mlir/ir/lce_ops.cc.inc" - - namespace mlir { -@@ -36,9 +22,10 @@ std::vector Bconv2dOp::buildCustomOptions() { - fbb.Int("dilation_height_factor", dilation_height_factor()); - fbb.Int("dilation_width_factor", dilation_width_factor()); - fbb.Int("fused_activation_function", -- (int)ConvertActivationAttr(fused_activation_function())); -+ (int)symbolizeActivationFunctionType(fused_activation_function()) -+ .getValue()); - fbb.Int("pad_values", pad_values()); -- fbb.Int("padding", (int)ConvertPaddingAttr(padding())); -+ fbb.Int("padding", (int)symbolizePadding(padding()).getValue()); - fbb.Int("stride_height", stride_height()); - fbb.Int("stride_width", stride_width()); - }); -@@ -49,7 +36,7 @@ std::vector Bconv2dOp::buildCustomOptions() { - std::vector BMaxPool2dOp::buildCustomOptions() { - flexbuffers::Builder fbb; - fbb.Map([&]() { -- fbb.Int("padding", (int)ConvertPaddingAttr(padding())); -+ fbb.Int("padding", (int)symbolizePadding(padding()).getValue()); - fbb.Int("stride_width", stride_width()); - fbb.Int("stride_height", stride_height()); - fbb.Int("filter_width", filter_width()); -diff --git larq_compute_engine/mlir/ir/lce_ops.h larq_compute_engine/mlir/ir/lce_ops.h -index f19dd81..9becf0a 100644 ---- larq_compute_engine/mlir/ir/lce_ops.h -+++ larq_compute_engine/mlir/ir/lce_ops.h -@@ -8,6 +8,8 @@ - #include "larq_compute_engine/mlir/ir/lce_dialect.h.inc" - // clang-format on - -+#include "larq_compute_engine/mlir/ir/lce_enum.h.inc" -+ - #define GET_OP_CLASSES - #include "larq_compute_engine/mlir/ir/lce_ops.h.inc" - -diff --git larq_compute_engine/mlir/lce_mlir_opt.cc larq_compute_engine/mlir/lce_mlir_opt.cc -index 22a8431..3678051 100644 ---- larq_compute_engine/mlir/lce_mlir_opt.cc -+++ larq_compute_engine/mlir/lce_mlir_opt.cc -@@ -12,6 +12,7 @@ int main(int argc, char** argv) { - registry.insert(); -- return failed(mlir::MlirOptMain( -- argc, argv, "Larq Compute Engine pass driver\n", registry)); -+ return failed(mlir::MlirOptMain(argc, argv, -+ "Larq Compute Engine pass driver\n", registry, -+ /*preloadDialectsInContext=*/false)); - } -diff --git larq_compute_engine/mlir/python/saved_model_tfl_flatbuffer.cc larq_compute_engine/mlir/python/saved_model_tfl_flatbuffer.cc -index 832a6e0..2b69564 100644 ---- larq_compute_engine/mlir/python/saved_model_tfl_flatbuffer.cc -+++ larq_compute_engine/mlir/python/saved_model_tfl_flatbuffer.cc -@@ -15,6 +15,7 @@ limitations under the License. - ==============================================================================*/ - - #include -+#include - #include - - #include "absl/types/span.h" -@@ -32,6 +33,7 @@ limitations under the License. - #include "pybind11/pybind11.h" - #include "pybind11/pytypes.h" - #include "pybind11/stl.h" -+#include "tensorflow/cc/saved_model/loader.h" - #include "tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.h" - #include "tensorflow/compiler/mlir/lite/tf_to_tfl_flatbuffer.h" - #include "tensorflow/compiler/mlir/lite/transforms/passes.h" -@@ -124,9 +126,11 @@ pybind11::bytes ConvertSavedModelToTFLiteFlatBuffer( - std::unordered_set tags(saved_model_tags.begin(), - saved_model_tags.end()); - -+ auto bundle = std::make_unique(); - auto module = - ImportSavedModel(saved_model_dir, saved_model_version, tags, -- custom_opdefs, exported_names_span, specs, &context); -+ custom_opdefs, exported_names_span, specs, -+ /*enable_variable_lifting=*/true, &context, &bundle); - - if (!module.ok()) { - throw std::runtime_error("Could not import SavedModel."); -diff --git larq_compute_engine/mlir/tests/lce_ops_options_test.cc larq_compute_engine/mlir/tests/lce_ops_options_test.cc -index 381435b..26b4043 100644 ---- larq_compute_engine/mlir/tests/lce_ops_options_test.cc -+++ larq_compute_engine/mlir/tests/lce_ops_options_test.cc -@@ -60,9 +60,9 @@ TEST(LCEOpsSerializationTest, BConv2dTest) { - ASSERT_EQ(m["stride_height"].AsInt32(), 1); - ASSERT_EQ(m["stride_width"].AsInt32(), 2); - ASSERT_EQ(m["pad_values"].AsInt32(), 1); -- ASSERT_EQ((ActivationFunctionType)m["fused_activation_function"].AsInt32(), -- ActivationFunctionType_RELU); -- ASSERT_EQ((Padding)m["padding"].AsInt32(), Padding_SAME); -+ ASSERT_EQ((::ActivationFunctionType)m["fused_activation_function"].AsInt32(), -+ ::ActivationFunctionType::RELU); -+ ASSERT_EQ((::Padding)m["padding"].AsInt32(), ::Padding::SAME); - } - - TEST(LCEOpsSerializationTest, BMaxPool2dTest) { -@@ -82,7 +82,7 @@ TEST(LCEOpsSerializationTest, BMaxPool2dTest) { - std::vector v = cast(op).buildCustomOptions(); - const flexbuffers::Map& m = flexbuffers::GetRoot(v).AsMap(); - -- ASSERT_EQ((Padding)m["padding"].AsInt32(), Padding_SAME); -+ ASSERT_EQ((::Padding)m["padding"].AsInt32(), ::Padding::SAME); - ASSERT_EQ(m["stride_width"].AsInt32(), 2); - ASSERT_EQ(m["stride_height"].AsInt32(), 1); - ASSERT_EQ(m["filter_width"].AsInt32(), 3); -diff --git larq_compute_engine/mlir/tests/legalize-lce.mlir larq_compute_engine/mlir/tests/legalize-lce.mlir -index 4739d72..3230cbe 100644 ---- larq_compute_engine/mlir/tests/legalize-lce.mlir -+++ larq_compute_engine/mlir/tests/legalize-lce.mlir -@@ -1,4 +1,5 @@ - // RUN: lce-tf-opt %s -tfl-legalize-lce -verify-diagnostics | FileCheck %s -+// RUN: lce-tf-opt %s -tfl-legalize-lce -lce-translate-tfl -verify-diagnostics | FileCheck %s --check-prefix=TRANSLATE - - // CHECK-LABEL: @legalize_bconv2d - func @legalize_bconv2d(%arg0: tensor<256x32x32x1xi32>, %arg1: tensor<16x3x3x3xf32>, %arg2: tensor<16xf32>, %arg3: tensor<16xf32>, %arg4: none) -> tensor<256x30x30x16xf32> { -@@ -7,6 +8,9 @@ func @legalize_bconv2d(%arg0: tensor<256x32x32x1xi32>, %arg1: tensor<16x3x3x3xf3 - - // CHECK: %0 = "tfl.custom"(%arg0, %arg1, %arg2, %arg3, %arg4) {custom_code = "LceBconv2d", custom_option = opaque<"lq", "0x6368616E6E656C735F696E0064696C6174696F6E5F6865696768745F666163746F720064696C6174696F6E5F77696474685F666163746F720066757365645F61637469766174696F6E5F66756E6374696F6E007061645F76616C7565730070616464696E67007374726964655F686569676874007374726964655F776964746800088277614C3329221508010803010100000101010404040404040404102401"> : tensor<160xi8>} : (tensor<256x32x32x1xi32>, tensor<16x3x3x3xf32>, tensor<16xf32>, tensor<16xf32>, none) -> tensor<256x30x30x16xf32> - // CHECK-NEXT: return %0 -+ -+ // TRANSLATE: %0 = "lq.Bconv2d"(%arg0, %arg1, %arg2, %arg3, %arg4) {channels_in = 3 : i32, dilation_height_factor = 1 : i32, dilation_width_factor = 1 : i32, fused_activation_function = "NONE", pad_values = 0 : i32, padding = "VALID", stride_height = 1 : i32, stride_width = 1 : i32} : (tensor<256x32x32x1xi32>, tensor<16x3x3x3xf32>, tensor<16xf32>, tensor<16xf32>, none) -> tensor<256x30x30x16xf32> -+ // TRANSLATE-NEXT: return %0 : tensor<256x30x30x16xf32> - } - - // CHECK-LABEL: @legalize_bmax_pool2d -@@ -16,6 +20,9 @@ func @legalize_bmax_pool2d(%arg0: tensor<256x32x32x3xi32>) -> tensor<256x16x16x3 - - // CHECK: %0 = "tfl.custom"(%arg0) {custom_code = "LceBMaxPool2d", custom_option = opaque<"lq", "0x70616464696E67007374726964655F7769647468007374726964655F6865696768740066696C7465725F77696474680066696C7465725F68656967687400050F1D412D3B050105020200020204040404040A2401"> : tensor<84xi8>} : (tensor<256x32x32x3xi32>) -> tensor<256x16x16x3xi32> - // CHECK-NEXT: return %0 -+ -+ // TRANSLATE: %0 = "lq.BMaxPool2d"(%arg0) {filter_height = 2 : i32, filter_width = 2 : i32, padding = "SAME", stride_height = 2 : i32, stride_width = 2 : i32} : (tensor<256x32x32x3xi32>) -> tensor<256x16x16x3xi32> -+ // TRANSLATE-NEXT: return %0 : tensor<256x16x16x3xi32> - } - - // CHECK-LABEL: @legalize_quantize -@@ -25,6 +32,9 @@ func @legalize_quantize(%arg0: tensor<256x32x32x64xf32>) -> tensor<256x32x32x2xi - - // CHECK: %0 = "tfl.custom"(%arg0) {custom_code = "LceQuantize", custom_option = opaque<"lq", "0x"> : tensor<0xi8>} : (tensor<256x32x32x64xf32>) -> tensor<256x32x32x2xi32> - // CHECK-NEXT: return %0 -+ -+ // TRANSLATE: %0 = "lq.Quantize"(%arg0) : (tensor<256x32x32x64xf32>) -> tensor<256x32x32x2xi32> -+ // TRANSLATE-NEXT: return %0 : tensor<256x32x32x2xi32> - } - - // CHECK-LABEL: @legalize_dequantize -@@ -34,4 +44,7 @@ func @legalize_dequantize(%arg0: tensor<256x32x32x2xi32>) -> tensor<256x32x32x64 - - // CHECK: %0 = "tfl.custom"(%arg0) {custom_code = "LceDequantize", custom_option = opaque<"lq", "0x"> : tensor<0xi8>} : (tensor<256x32x32x2xi32>) -> tensor<256x32x32x64xf32> - // CHECK-NEXT: return %0 -+ -+ // TRANSLATE: %0 = "lq.Dequantize"(%arg0) : (tensor<256x32x32x2xi32>) -> tensor<256x32x32x64xf32> -+ // TRANSLATE-NEXT: return %0 : tensor<256x32x32x64xf32> - } -diff --git larq_compute_engine/mlir/tests/set_batch_size.mlir larq_compute_engine/mlir/tests/set_batch_size.mlir -new file mode 100644 -index 0000000..203291c ---- /dev/null -+++ larq_compute_engine/mlir/tests/set_batch_size.mlir -@@ -0,0 +1,51 @@ -+// RUN: lce-tf-opt %s -mlir-setbatchsize -verify-diagnostics | FileCheck %s -+ -+// CHECK-LABEL: @simple -+func @simple(%arg0: tensor, %arg1: tensor<2x6xf32>) -> (tensor) { -+ %0 = "tf.AddV2"(%arg0, %arg1) : (tensor, tensor<2x6xf32>) -> tensor -+ return %0 : tensor -+ // CHECK: %arg0: tensor<1x6xf32> -+ // Check that the 'batch' size of the second argument is *not* changed to 1 -+ // CHECK: %arg1: tensor<2x6xf32> -+} -+ -+// This is an IR dump from the following simple 2-input model -+// This is to ensure that the pass does not destroy the extra function attributes that are present -+// img1 = tf.keras.layers.Input(shape=(4,)) -+// img2 = tf.keras.layers.Input(shape=(6,)) -+// x = tf.keras.layers.Dense(6)(img1) + img2 -+// return tf.keras.Model([img1, img2], x) -+// Both inputs have a dynamic batch size -+ -+// CHECK-LABEL: @dual_input_model -+func @dual_input_model(%arg0: tensor {tf_saved_model.index_path = ["input_2"]}, %arg1: tensor {tf_saved_model.index_path = ["input_1"]}, %arg2: tensor>> {tf_saved_model.bound_input = @"dense/bias"}, %arg3: tensor>> {tf_saved_model.bound_input = @"dense/kernel"}) -> (tensor {tf_saved_model.index_path = ["tf.__operators__.add"]}) attributes {tf.entry_function = {control_outputs = "", inputs = "serving_default_input_2:0,serving_default_input_1:0", outputs = "StatefulPartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { -+ %0 = "tf.ReadVariableOp"(%arg2) {device = ""} : (tensor>>) -> tensor<6xf32> -+ %1 = "tf.ReadVariableOp"(%arg3) {device = ""} : (tensor>>) -> tensor<4x6xf32> -+ %2 = "tf.MatMul"(%arg1, %1) {device = "", transpose_a = false, transpose_b = false} : (tensor, tensor<4x6xf32>) -> tensor -+ %3 = "tf.BiasAdd"(%2, %0) {data_format = "NHWC", device = ""} : (tensor, tensor<6xf32>) -> tensor -+ %4 = "tf.AddV2"(%3, %arg0) {device = ""} : (tensor, tensor) -> tensor -+ %5 = "tf.Identity"(%4) {device = ""} : (tensor) -> tensor -+ %6 = "tf.Identity"(%5) {device = ""} : (tensor) -> tensor -+ return %6 : tensor -+ // CHECK: %arg0: tensor<1x6xf32> {tf_saved_model.index_path = ["input_2"]} -+ // CHECK: %arg1: tensor<1x4xf32> {tf_saved_model.index_path = ["input_1"]} -+ // The resource objects and attributes should be unchanged -+ // CHECK: %arg2: tensor>> {tf_saved_model.bound_input = @"dense/bias"}, %arg3: tensor>> {tf_saved_model.bound_input = @"dense/kernel"}) -> (tensor {tf_saved_model.index_path = ["tf.__operators__.add"]}) attributes {tf.entry_function = {control_outputs = "", inputs = "serving_default_input_2:0,serving_default_input_1:0", outputs = "StatefulPartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { -+} -+ -+// This is the same model, but one of the two inputs has been given a fixed batch size in Python -+ -+// CHECK-LABEL: @dual_input_one_fixed_size -+func @dual_input_one_fixed_size(%arg0: tensor {tf_saved_model.index_path = ["input_2"]}, %arg1: tensor<1x4xf32> {tf_saved_model.index_path = ["input_1"]}, %arg2: tensor>> {tf_saved_model.bound_input = @"dense/bias"}, %arg3: tensor>> {tf_saved_model.bound_input = @"dense/kernel"}) -> (tensor {tf_saved_model.index_path = ["tf.__operators__.add"]}) attributes {tf.entry_function = {control_outputs = "", inputs = "serving_default_input_2:0,serving_default_input_1:0", outputs = "StatefulPartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { -+ %0 = "tf.ReadVariableOp"(%arg2) {device = ""} : (tensor>>) -> tensor<6xf32> -+ %1 = "tf.ReadVariableOp"(%arg3) {device = ""} : (tensor>>) -> tensor<4x6xf32> -+ %2 = "tf.MatMul"(%arg1, %1) {device = "", transpose_a = false, transpose_b = false} : (tensor<1x4xf32>, tensor<4x6xf32>) -> tensor<1x6xf32> -+ %3 = "tf.BiasAdd"(%2, %0) {data_format = "NHWC", device = ""} : (tensor<1x6xf32>, tensor<6xf32>) -> tensor<1x6xf32> -+ %4 = "tf.AddV2"(%3, %arg0) {device = ""} : (tensor<1x6xf32>, tensor) -> tensor -+ %5 = "tf.Identity"(%4) {device = ""} : (tensor) -> tensor -+ %6 = "tf.Identity"(%5) {device = ""} : (tensor) -> tensor -+ return %6 : tensor -+ // CHECK: %arg0: tensor<1x6xf32> {tf_saved_model.index_path = ["input_2"]} -+ // CHECK: %arg1: tensor<1x4xf32> {tf_saved_model.index_path = ["input_1"]} -+ // CHECK: %arg2: tensor>> {tf_saved_model.bound_input = @"dense/bias"}, %arg3: tensor>> {tf_saved_model.bound_input = @"dense/kernel"}) -> (tensor {tf_saved_model.index_path = ["tf.__operators__.add"]}) attributes {tf.entry_function = {control_outputs = "", inputs = "serving_default_input_2:0,serving_default_input_1:0", outputs = "StatefulPartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { -+} -\ No newline at end of file -diff --git larq_compute_engine/mlir/tf_tfl_passes.cc larq_compute_engine/mlir/tf_tfl_passes.cc -index d413a58..66cec67 100644 ---- larq_compute_engine/mlir/tf_tfl_passes.cc -+++ larq_compute_engine/mlir/tf_tfl_passes.cc -@@ -6,6 +6,7 @@ - #include "tensorflow/compiler/mlir/lite/quantization/quantization_config.h" - #include "tensorflow/compiler/mlir/lite/quantization/quantization_passes.h" - #include "tensorflow/compiler/mlir/lite/transforms/passes.h" -+#include "tensorflow/compiler/mlir/lite/utils/fake_quant_utils.h" - #include "tensorflow/compiler/mlir/tensorflow/transforms/decode_constant.h" - #include "tensorflow/compiler/mlir/tensorflow/transforms/passes.h" - #include "tensorflow/compiler/mlir/tensorflow/transforms/tf_saved_model_passes.h" -@@ -49,6 +50,12 @@ void AddTFToLCETFLConversionPasses( - const mlir::TFL::QuantizationSpecs& quant_specs, - mlir::OpPassManager* pass_manager, const LCETarget target, - const bool experimental_enable_bitpacked_activations) { -+ // This pass wraps all the tf.FakeQuant ops in a custom op so they are not -+ // folded before being converted to tfl.quantize and tfl.dequantize ops. -+ auto wrapped_ops = mlir::TFL::AllTfFakeQuantOps(); -+ pass_manager->addNestedPass( -+ mlir::TFL::CreateRaiseCustomOpsPass(wrapped_ops)); -+ - mlir::TF::StandardPipelineOptions standard_pipeline_options; - standard_pipeline_options.enable_inliner = false; - standard_pipeline_options.form_clusters = false; -@@ -92,6 +99,10 @@ void AddTFToLCETFLConversionPasses( - pass_manager->addPass( - mlir::tf_saved_model::CreateOptimizeGlobalTensorsPass()); - -+ // Set the batch size of the function input to 1 and let shape inference -+ // propagate this in the next pass. -+ pass_manager->addPass(mlir::CreateSetBatchSizePass()); -+ - // Add a shape inference pass to optimize away the unnecessary casts. - pass_manager->addPass(mlir::TF::CreateTFShapeInferencePass()); - -@@ -171,8 +182,9 @@ void AddTFToLCETFLConversionPasses( - // so that it can target constants introduced once TensorFlow Identity ops - // are removed during legalization. - pass_manager->addPass(mlir::TFL::CreateOptimizeFunctionalOpsPass()); -+ std::vector empty_wrapped_ops({}); - pass_manager->addNestedPass( -- mlir::TFL::CreateRaiseCustomOpsPass()); -+ mlir::TFL::CreateRaiseCustomOpsPass(empty_wrapped_ops)); - pass_manager->addPass(mlir::createSymbolDCEPass()); - pass_manager->addNestedPass(mlir::createCanonicalizerPass()); - pass_manager->addNestedPass(mlir::createCSEPass()); -diff --git larq_compute_engine/mlir/transforms/legalize_tflite.cc larq_compute_engine/mlir/transforms/legalize_tflite.cc -index bb75781..4b1fc5b 100644 ---- larq_compute_engine/mlir/transforms/legalize_tflite.cc -+++ larq_compute_engine/mlir/transforms/legalize_tflite.cc -@@ -10,6 +10,9 @@ namespace TFL { - namespace { - - struct LegalizeLCE : public PassWrapper { -+ void getDependentDialects(DialectRegistry& registry) const override { -+ registry.insert(); -+ } - void runOnFunction() override; - }; - -diff --git larq_compute_engine/mlir/transforms/passes.h larq_compute_engine/mlir/transforms/passes.h -index b9b774b..f251cfc 100644 ---- larq_compute_engine/mlir/transforms/passes.h -+++ larq_compute_engine/mlir/transforms/passes.h -@@ -27,7 +27,14 @@ std::unique_ptr> CreateLCEQuantizePass(); - // Creates an instance of LegalizeLCE pass. - std::unique_ptr> CreateLegalizeLCEPass(); - -+// Creates an instance of TranslateToLCE pass. -+std::unique_ptr> CreateTranslateToLCEPass(); -+ - } // namespace TFL -+ -+// Creates an instance of the TensorFlow dialect SetBatchSize pass -+std::unique_ptr> CreateSetBatchSizePass(); -+ - } // namespace mlir - - #endif // LARQ_COMPUTE_ENGINE_MLIR_PASSES_H_ -diff --git larq_compute_engine/mlir/transforms/set_batch_size.cc larq_compute_engine/mlir/transforms/set_batch_size.cc -new file mode 100644 -index 0000000..a4d8a57 ---- /dev/null -+++ larq_compute_engine/mlir/transforms/set_batch_size.cc -@@ -0,0 +1,68 @@ -+#include "mlir/Pass/Pass.h" -+ -+// This pass will set the batch dimension of all inputs of the outermost -+// function to 1, leaving it to shape inference to do the rest. -+ -+namespace mlir { -+ -+namespace { -+ -+mlir::Type SetBatchSize(mlir::Type type) { -+ auto tensor_type = type.dyn_cast(); -+ if (tensor_type && tensor_type.hasRank()) { -+ auto shape = tensor_type.getShape(); -+ if (shape.size() > 0 && shape[0] == ShapedType::kDynamicSize) { -+ // Create a new shape but set the first dimension to 1 -+ llvm::SmallVector shape_new(shape.begin(), shape.end()); -+ shape_new[0] = 1; -+ -+ return tensor_type.clone(shape_new); -+ } -+ } -+ return nullptr; -+} -+ -+struct SetBatchSizePass : public PassWrapper { -+ void runOnFunction() override { -+ FuncOp func = getFunction(); -+ -+ // We have to edit both the function signature (mlir::Type) *and* the -+ // function arguments (mlir::Value) -+ -+ // mlir::FunctionType is a TableGen-autogenerated MLIR type -+ mlir::FunctionType signature = func.getType(); -+ -+ // Create a mutable copy of the input types, since getInputs returns an -+ // immutable llvm::ArrayRef -+ std::vector signature_inputs(signature.getInputs()); -+ -+ for (auto& input_type : signature_inputs) { -+ auto new_type = SetBatchSize(input_type); -+ if (new_type) input_type = new_type; -+ } -+ -+ auto signature_new = mlir::FunctionType::get( -+ signature.getContext(), signature_inputs, signature.getResults()); -+ // Set the new signature -+ func.typeAttr(mlir::TypeAttr::get(signature_new)); -+ -+ // Now apply the same change to the mlir::Value objects -+ for (mlir::BlockArgument arg : func.getArguments()) { -+ // mlir::BlockArgument is a sublcass of mlir::Value -+ auto new_type = SetBatchSize(arg.getType()); -+ if (new_type) arg.setType(new_type); -+ } -+ } -+}; -+ -+} // namespace -+ -+// Creates an instance of the ZeroPointCompatibility pass. -+std::unique_ptr> CreateSetBatchSizePass() { -+ return std::make_unique(); -+} -+ -+static PassRegistration pass("mlir-setbatchsize", -+ "Set batch size to 1"); -+ -+} // namespace mlir -diff --git larq_compute_engine/mlir/transforms/translate_tflite.cc larq_compute_engine/mlir/transforms/translate_tflite.cc -new file mode 100644 -index 0000000..1fe799b ---- /dev/null -+++ larq_compute_engine/mlir/transforms/translate_tflite.cc -@@ -0,0 +1,83 @@ -+#include "flatbuffers/flexbuffers.h" -+#include "larq_compute_engine/mlir/ir/lce_ops.h" -+#include "mlir/IR/PatternMatch.h" -+#include "mlir/Pass/Pass.h" -+#include "mlir/Transforms/GreedyPatternRewriteDriver.h" -+#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" -+ -+namespace mlir { -+namespace TFL { -+ -+namespace { -+ -+struct TranslateToLCE : public PassWrapper { -+ void getDependentDialects(DialectRegistry& registry) const override { -+ registry.insert(); -+ } -+ void runOnFunction() override; -+}; -+ -+struct TranslateToLCEPattern : public OpRewritePattern { -+ using OpRewritePattern::OpRewritePattern; -+ -+ LogicalResult matchAndRewrite(TFL::CustomOp custom_op, -+ PatternRewriter& rewriter) const override { -+ auto stringData = custom_op.custom_option().getValue(); -+ -+ // Replace CustomOp with relevant LarqOp -+ if (custom_op.custom_code() == "LceQuantize") { -+ rewriter.replaceOpWithNewOp( -+ custom_op, custom_op->getResultTypes(), custom_op->getOperands()); -+ } else if (custom_op.custom_code() == "LceDequantize") { -+ rewriter.replaceOpWithNewOp( -+ custom_op, custom_op->getResultTypes(), custom_op->getOperands()); -+ } else if (custom_op.custom_code() == "LceBMaxPool2d") { -+ auto map = -+ flexbuffers::GetRoot((uint8_t*)stringData.data(), stringData.size()) -+ .AsMap(); -+ rewriter.replaceOpWithNewOp( -+ custom_op, custom_op->getResultTypes(), custom_op->getOperand(0), -+ stringifyPadding(static_cast(map["padding"].AsInt32())), -+ map["stride_width"].AsInt32(), map["stride_height"].AsInt32(), -+ map["filter_width"].AsInt32(), map["filter_height"].AsInt32()); -+ } else if (custom_op.custom_code() == "LceBconv2d") { -+ auto map = -+ flexbuffers::GetRoot((uint8_t*)stringData.data(), stringData.size()) -+ .AsMap(); -+ rewriter.replaceOpWithNewOp( -+ custom_op, custom_op->getResultTypes(), custom_op->getOperand(0), -+ custom_op->getOperand(1), custom_op->getOperand(2), -+ custom_op->getOperand(3), custom_op->getOperand(4), -+ map["channels_in"].AsInt32(), map["dilation_height_factor"].AsInt32(), -+ map["dilation_width_factor"].AsInt32(), -+ stringifyActivationFunctionType(static_cast( -+ map["fused_activation_function"].AsInt32())), -+ map["pad_values"].AsInt32(), -+ stringifyPadding(static_cast(map["padding"].AsInt32())), -+ map["stride_height"].AsInt32(), map["stride_width"].AsInt32()); -+ } -+ -+ return success(); -+ } -+}; -+ -+void TranslateToLCE::runOnFunction() { -+ OwningRewritePatternList patterns(&getContext()); -+ auto* ctx = &getContext(); -+ auto func = getFunction(); -+ patterns.insert(ctx); -+ (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); -+} -+ -+} // namespace -+ -+// Creates an instance of the TranslateToLCE pass. -+std::unique_ptr> CreateTranslateToLCEPass() { -+ return std::make_unique(); -+} -+ -+static PassRegistration pass( -+ "lce-translate-tfl", "Translate TFL custom ops to LCE ops"); -+ -+} // namespace TFL -+} // namespace mlir -diff --git third_party/install_android.sh third_party/install_android.sh -index 3a910e4..f6d5075 100755 ---- third_party/install_android.sh -+++ third_party/install_android.sh -@@ -6,7 +6,7 @@ export ANDROID_SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux - export ANDROID_HOME="/tmp/lce_android" - export ANDROID_VERSION=29 - export ANDROID_BUILD_TOOLS_VERSION=28.0.3 --export ANDROID_NDK_VERSION=18.1.5063045 -+export ANDROID_NDK_VERSION=19.2.5345600 - - # download android SDK - mkdir -p $ANDROID_HOME; cd $ANDROID_HOME; -diff --git third_party/tensorflow_patches/tf_pr_48546.patch third_party/tensorflow_patches/tf_pr_48546.patch -deleted file mode 100644 -index b6b0cab..0000000 ---- third_party/tensorflow_patches/tf_pr_48546.patch -+++ /dev/null -@@ -1,36 +0,0 @@ --diff --git a/tensorflow/lite/delegates/gpu/cl/BUILD b/tensorflow/lite/delegates/gpu/cl/BUILD --index b37629a97aa..5e6518605e4 100644 ----- a/tensorflow/lite/delegates/gpu/cl/BUILD --+++ b/tensorflow/lite/delegates/gpu/cl/BUILD --@@ -3,6 +3,7 @@ load( -- "//tensorflow/core/platform:build_config_root.bzl", -- "tf_gpu_tests_tags", -- ) --+load("//tensorflow:tensorflow.bzl", "workspace_root") -- -- package( -- default_visibility = ["//visibility:public"], --@@ -490,7 +491,7 @@ flatbuffer_cc_library( -- srcs = ["serialization.fbs"], -- flatc_args = [ -- "--scoped-enums", --- "-I ./", --+ "-I " + workspace_root, -- ], -- includes = [ -- "//tensorflow/lite/delegates/gpu/common/task:serialization_base_cc_fbs_includes", --diff --git a/tensorflow/tensorflow.bzl b/tensorflow/tensorflow.bzl --index a9da708bb53..2e070d7f137 100644 ----- a/tensorflow/tensorflow.bzl --+++ b/tensorflow/tensorflow.bzl --@@ -52,6 +52,11 @@ VERSION = "2.5.0" -- VERSION_MAJOR = VERSION.split(".")[0] -- two_gpu_tags = ["requires-gpu-nvidia:2", "notap", "manual", "no_pip"] -- --+# The workspace root, to be used to set workspace 'include' paths in a way that --+# will still work correctly when TensorFlow is included as a dependency of an --+# external project. --+workspace_root = Label("//:WORKSPACE").workspace_root or "./" --+ -- def clean_dep(target): -- """Returns string to 'target' in @org_tensorflow repository. diff --git a/experimental/xformer/patches/llvm_update.patch b/experimental/xformer/patches/llvm_update.patch deleted file mode 100644 index e0f5a0d8d..000000000 --- a/experimental/xformer/patches/llvm_update.patch +++ /dev/null @@ -1,1372 +0,0 @@ -diff -Naur third_party/llvm/llvm_td_update.patch /Users/deepakpanickal/code/llvm/llvm_td_update.patch ---- third_party/llvm/llvm_td_update.patch 1970-01-01 01:00:00.000000000 +0100 -+++ /Users/deepakpanickal/code/llvm/llvm_td_update.patch 2022-01-23 13:24:10.000000000 +0000 -@@ -0,0 +1,1359 @@ -+diff --git a/mlir/docs/DeclarativeRewrites.md b/mlir/docs/DeclarativeRewrites.md -+index 27ae161978c8..c3518972bb0e 100644 -+--- a/mlir/docs/DeclarativeRewrites.md -++++ b/mlir/docs/DeclarativeRewrites.md -+@@ -11,8 +11,8 @@ compiler build time. -+ This manual explains in detail all of the available mechanisms for defining -+ rewrite rules in such a declarative manner. It aims to be a specification -+ instead of a tutorial. Please refer to -+-[Quickstart tutorial to adding MLIR graph -+-rewrite](Tutorials/QuickstartRewrites.md) for the latter. -++[Quickstart tutorial to adding MLIR graph rewrite](Tutorials/QuickstartRewrites.md) -++for the latter. -+ -+ Given that declarative rewrite rules depend on op definition specification, this -+ manual assumes knowledge of the [ODS](OpDefinitions.md) doc. -+@@ -51,8 +51,8 @@ features: -+ * Matching multi-result ops in nested patterns. -+ * Matching and generating variadic operand/result ops in nested patterns. -+ * Packing and unpacking variadic operands/results during generation. -+-* [`NativeCodeCall`](#nativecodecall-transforming-the-generated-op) -+- returning more than one results. -++* [`NativeCodeCall`](#nativecodecall-transforming-the-generated-op) returning -++ more than one results. -+ -+ ## Rule Definition -+ -+@@ -93,9 +93,9 @@ Each pattern is specified as a TableGen `dag` object with the syntax of -+ [directives](#rewrite-directives). `argN` is for matching (if used in source -+ pattern) or generating (if used in result pattern) the `N`-th argument for -+ `operator`. If the `operator` is some MLIR operation, it means the `N`-th -+-argument as specified in the `arguments` list of the op's definition. -+-Therefore, we say op argument specification in pattern is **position-based**: -+-the position where they appear matters. -++argument as specified in the `arguments` list of the op's definition. Therefore, -++we say op argument specification in pattern is **position-based**: the position -++where they appear matters. -+ -+ `argN` can be a `dag` object itself, thus we can have nested `dag` tree to model -+ the def-use relationship between ops. -+@@ -245,15 +245,15 @@ the pattern by following the exact same order as the ODS `arguments` definition. -+ Otherwise, a custom `build()` method that matches the argument list is required. -+ -+ Right now all ODS-generated `build()` methods require specifying the result -+-type(s), unless the op has known traits like `SameOperandsAndResultType` that -+-we can use to auto-generate a `build()` method with result type deduction. -+-When generating an op to replace the result of the matched root op, we can use -+-the matched root op's result type when calling the ODS-generated builder. -+-Otherwise (e.g., generating an [auxiliary op](#supporting-auxiliary-ops) or -+-generating an op with a nested result pattern), DRR will not be able to deduce -+-the result type(s). The pattern author will need to define a custom builder -+-that has result type deduction ability via `OpBuilder` in ODS. For example, -+-in the following pattern -++type(s), unless the op has known traits like `SameOperandsAndResultType` that we -++can use to auto-generate a `build()` method with result type deduction. When -++generating an op to replace the result of the matched root op, we can use the -++matched root op's result type when calling the ODS-generated builder. Otherwise -++(e.g., generating an [auxiliary op](#supporting-auxiliary-ops) or generating an -++op with a nested result pattern), DRR will not be able to deduce the result -++type(s). The pattern author will need to define a custom builder that has result -++type deduction ability via `OpBuilder` in ODS. For example, in the following -++pattern -+ -+ ```tablegen -+ def : Pat<(AOp $input, $attr), (COp (AOp $input, $attr) $attr)>; -+@@ -295,8 +295,8 @@ to replace the matched `AOp`. -+ -+ In the result pattern, we can bind to the result(s) of a newly built op by -+ attaching symbols to the op. (But we **cannot** bind to op arguments given that -+-they are referencing previously bound symbols.) This is useful for reusing -+-newly created results where suitable. For example, -++they are referencing previously bound symbols.) This is useful for reusing newly -++created results where suitable. For example, -+ -+ ```tablegen -+ def DOp : Op<"d_op"> { -+@@ -373,18 +373,15 @@ And make sure the generated C++ code from the above pattern has access to the -+ definition of the C++ helper function. -+ -+ In the above example, we are using a string to specialize the `NativeCodeCall` -+-template. The string can be an arbitrary C++ expression that evaluates into -+-some C++ object expected at the `NativeCodeCall` site (here it would be -+-expecting an array attribute). Typically the string should be a function call. -+- -+-Note that currently `NativeCodeCall` must return no more than one value or -+-attribute. This might change in the future. -++template. The string can be an arbitrary C++ expression that evaluates into some -++C++ object expected at the `NativeCodeCall` site (here it would be expecting an -++array attribute). Typically the string should be a function call. -+ -+ ##### `NativeCodeCall` placeholders -+ -+-In `NativeCodeCall`, we can use placeholders like `$_builder`, `$N`. The former -+-is called _special placeholder_, while the latter is called _positional -+-placeholder_. -++In `NativeCodeCall`, we can use placeholders like `$_builder`, `$N` and `$N...`. -++The former is called _special placeholder_, while the latter is called -++_positional placeholder_ and _positional range placeholder_. -+ -+ `NativeCodeCall` right now only supports three special placeholders: -+ `$_builder`, `$_loc`, and `$_self`: -+@@ -423,6 +420,35 @@ the `NativeCodeCall` use site. For example, if we define `SomeCall : -+ NativeCodeCall<"someFn($1, $2, $0)">` and use it like `(SomeCall $in0, $in1, -+ $in2)`, then this will be translated into C++ call `someFn($in1, $in2, $in0)`. -+ -++Positional range placeholders will be substituted by multiple `dag` object -++parameters at the `NativeCodeCall` use site. For example, if we define -++`SomeCall : NativeCodeCall<"someFn($1...)">` and use it like `(SomeCall $in0, -++$in1, $in2)`, then this will be translated into C++ call `someFn($in1, $in2)`. -++ -++##### `NativeCodeCall` binding multi-results -++ -++To bind multi-results and access the N-th result with `$__N`, specify the -++number of return values in the template. Note that only `Value` type is -++supported for multiple results binding. For example, -++ -++```tablegen -++ -++def PackAttrs : NativeCodeCall<"packAttrs($0, $1)", 2>; -++def : Pattern<(TwoResultOp $attr1, $attr2), -++ [(OneResultOp (PackAttr:$res__0, $attr1, $attr2)), -++ (OneResultOp $res__1)]>; -++ -++``` -++ -++Use `NativeCodeCallVoid` for case has no return value. -++ -++The correct number of returned value specified in NativeCodeCall is important. -++It will be used to verify the consistency of the number of result values. -++Additionally, `mlir-tblgen` will try to capture the return value of -++NativeCodeCall in the generated code so that it will trigger a later compilation -++error if a NativeCodeCall that doesn't return a result isn't labeled with 0 -++returns. -++ -+ ##### Customizing entire op building -+ -+ `NativeCodeCall` is not only limited to transforming arguments for building an -+@@ -490,8 +516,8 @@ matched op. -+ -+ Multi-result ops bring extra complexity to declarative rewrite rules. We use -+ TableGen `dag` objects to represent ops in patterns; there is no native way to -+-indicate that an op generates multiple results. The approach adopted is based -+-on **naming convention**: a `__N` suffix is added to a symbol to indicate the -++indicate that an op generates multiple results. The approach adopted is based on -++**naming convention**: a `__N` suffix is added to a symbol to indicate the -+ `N`-th result. -+ -+ #### `__N` suffix -+@@ -541,12 +567,12 @@ The above example also shows how to replace a matched multi-result op. -+ -+ To replace an `N`-result op, the result patterns must generate at least `N` -+ declared values (see [Declared vs. actual value](#declared-vs-actual-value) for -+-definition). If there are more than `N` declared values generated, only the -+-last `N` declared values will be used to replace the matched op. Note that -+-because of the existence of multi-result op, one result pattern **may** generate -+-multiple declared values. So it means we do not necessarily need `N` result -+-patterns to replace an `N`-result op. For example, to replace an op with three -+-results, you can have -++definition). If there are more than `N` declared values generated, only the last -++`N` declared values will be used to replace the matched op. Note that because of -++the existence of multi-result op, one result pattern **may** generate multiple -++declared values. So it means we do not necessarily need `N` result patterns to -++replace an `N`-result op. For example, to replace an op with three results, you -++can have -+ -+ ```tablegen -+ // ThreeResultOp/TwoResultOp/OneResultOp generates three/two/one result(s), -+@@ -590,8 +616,8 @@ regarding an op's values. -+ * _Actual operand/result/value_: an operand/result/value of an op instance at -+ runtime -+ -+-The above terms are needed because ops can have multiple results, and some of the -+-results can also be variadic. For example, -++The above terms are needed because ops can have multiple results, and some of -++the results can also be variadic. For example, -+ -+ ```tablegen -+ def MultiVariadicOp : Op<"multi_variadic_op"> { -+@@ -611,8 +637,8 @@ def MultiVariadicOp : Op<"multi_variadic_op"> { -+ -+ We say the above op has 3 declared operands and 3 declared results. But at -+ runtime, an instance can have 3 values corresponding to `$input2` and 2 values -+-correspond to `$output2`; we say it has 5 actual operands and 4 actual -+-results. A variadic operand/result is a considered as a declared value that can -++correspond to `$output2`; we say it has 5 actual operands and 4 actual results. -++A variadic operand/result is a considered as a declared value that can -+ correspond to multiple actual values. -+ -+ [TODO] -+@@ -651,10 +677,10 @@ You can -+ -+ ### Adjusting benefits -+ -+-The benefit of a `Pattern` is an integer value indicating the benefit of matching -+-the pattern. It determines the priorities of patterns inside the pattern rewrite -+-driver. A pattern with a higher benefit is applied before one with a lower -+-benefit. -++The benefit of a `Pattern` is an integer value indicating the benefit of -++matching the pattern. It determines the priorities of patterns inside the -++pattern rewrite driver. A pattern with a higher benefit is applied before one -++with a lower benefit. -+ -+ In DRR, a rule is set to have a benefit of the number of ops in the source -+ pattern. This is based on the heuristics and assumptions that: -+@@ -662,7 +688,6 @@ pattern. This is based on the heuristics and assumptions that: -+ * Larger matches are more beneficial than smaller ones. -+ * If a smaller one is applied first the larger one may not apply anymore. -+ -+- -+ The fourth parameter to `Pattern` (and `Pat`) allows to manually tweak a -+ pattern's benefit. Just supply `(addBenefit N)` to add `N` to the benefit value. -+ -+@@ -696,8 +721,8 @@ def : Pat<(LocSrc1Op:$src1 (LocSrc2Op:$src2 ...), -+ (LocDst1Op (LocDst2Op ..., (location $src2)), (location "outer"))>; -+ ``` -+ -+-In the above pattern, the generated `LocDst2Op` will use the matched location -+-of `LocSrc2Op` while the root `LocDst1Op` node will used the named location -++In the above pattern, the generated `LocDst2Op` will use the matched location of -++`LocSrc2Op` while the root `LocDst1Op` node will used the named location -+ `outer`. -+ -+ ### `replaceWithValue` -+@@ -724,8 +749,8 @@ The above pattern removes the `Foo` and replaces all uses of `Foo` with -+ -+ ### Run `mlir-tblgen` to see the generated content -+ -+-TableGen syntax sometimes can be obscure; reading the generated content can be -+-a very helpful way to understand and debug issues. To build `mlir-tblgen`, run -++TableGen syntax sometimes can be obscure; reading the generated content can be a -++very helpful way to understand and debug issues. To build `mlir-tblgen`, run -+ `cmake --build . --target mlir-tblgen` in your build directory and find the -+ `mlir-tblgen` binary in the `bin/` subdirectory. All the supported generators -+ can be found via `mlir-tblgen --help`. -+diff --git a/mlir/include/mlir/IR/OpBase.td b/mlir/include/mlir/IR/OpBase.td -+index 952e3a36e457..ebd882db9a27 100644 -+--- a/mlir/include/mlir/IR/OpBase.td -++++ b/mlir/include/mlir/IR/OpBase.td -+@@ -2543,26 +2543,69 @@ class Pat preds = [], -+ // If used as a DAG node, i.e., `(NativeCodeCall<"..."> , ..., )`, -+ // then positional placeholders are also supported; placeholder `$N` in the -+ // wrapped C++ expression will be replaced by ``. -++// -++// ## Bind multiple results -++// -++// To bind multi-results and access the N-th result with `$__N`, specify -++// the number of return values in the template. Note that only `Value` type is -++// supported for multiple results binding. -+ -+-class NativeCodeCall { -++class NativeCodeCall { -+ string expression = expr; -++ int numReturns = returns; -+ } -+ -++class NativeCodeCallVoid : NativeCodeCall; -++ -+ def ConstantLikeMatcher : NativeCodeCall<"success(matchPattern($_self->getResult(0), m_Constant(&$0)))">; -+ -+ //===----------------------------------------------------------------------===// -+ // Rewrite directives -+ //===----------------------------------------------------------------------===// -+ -+-// Directive used in result pattern to specify the location of the generated -+-// op. This directive must be used as the last argument to the op creation -+-// DAG construct. The arguments to location must be previously captured symbol. -+-def location; -+- -+ // Directive used in result pattern to indicate that no new op are generated, -+ // so to replace the matched DAG with an existing SSA value. -+ def replaceWithValue; -+ -++// Directive used in result patterns to specify the location of the generated -++// op. This directive must be used as a trailing argument to op creation or -++// native code calls. -++// -++// Usage: -++// * Create a named location: `(location "myLocation")` -++// * Copy the location of a captured symbol: `(location $arg)` -++// * Create a fused location: `(location "metadata", $arg0, $arg1)` -++ -++def location; -++ -++// Directive used in result patterns to specify return types for a created op. -++// This allows ops to be created without relying on type inference with -++// `OpTraits` or an op builder with deduction. -++// -++// This directive must be used as a trailing argument to op creation. -++// -++// Specify one return type with a string literal: -++// -++// ``` -++// (AnOp $val, (returnType "$_builder.getI32Type()")) -++// ``` -++// -++// Pass a captured value to copy its return type: -++// -++// ``` -++// (AnOp $val, (returnType $val)); -++// ``` -++// -++// Pass a native code call inside a DAG to create a new type with arguments. -++// -++// ``` -++// (AnOp $val, -++// (returnType (NativeCodeCall<"$_builder.getTupleType({$0})"> $val))); -++// ``` -++// -++// Specify multiple return types with multiple of any of the above. -++ -++def returnType; -+ -+ //===----------------------------------------------------------------------===// -+ // Attribute and Type generation -+diff --git a/mlir/include/mlir/TableGen/Pattern.h b/mlir/include/mlir/TableGen/Pattern.h -+index 98c5d9b18f5d..a3786cd8e0b8 100644 -+--- a/mlir/include/mlir/TableGen/Pattern.h -++++ b/mlir/include/mlir/TableGen/Pattern.h -+@@ -100,6 +100,11 @@ public: -+ // Precondition: isNativeCodeCall() -+ StringRef getNativeCodeTemplate() const; -+ -++ // Returns the number of values will be returned by the native helper -++ // function. -++ // Precondition: isNativeCodeCall() -++ int getNumReturnsOfNativeCode() const; -++ -+ // Returns the string associated with the leaf. -+ // Precondition: isStringAttr() -+ std::string getStringAttr() const; -+@@ -171,6 +176,9 @@ public: -+ // Returns whether this DAG represents the location of an op creation. -+ bool isLocationDirective() const; -+ -++ // Returns whether this DAG is a return type specifier. -++ bool isReturnTypeDirective() const; -++ -+ // Returns true if this DAG node is wrapping native code call. -+ bool isNativeCodeCall() const; -+ -+@@ -181,9 +189,17 @@ public: -+ // Precondition: isNativeCodeCall() -+ StringRef getNativeCodeTemplate() const; -+ -++ // Returns the number of values will be returned by the native helper -++ // function. -++ // Precondition: isNativeCodeCall() -++ int getNumReturnsOfNativeCode() const; -++ -+ void print(raw_ostream &os) const; -+ -+ private: -++ friend class SymbolInfoMap; -++ const void *getAsOpaquePointer() const { return node; } -++ -+ const llvm::DagInit *node; // nullptr means null DagNode -+ }; -+ -+@@ -237,26 +253,34 @@ public: -+ // Allow SymbolInfoMap to access private methods. -+ friend class SymbolInfoMap; -+ -++ // DagNode and DagLeaf are accessed by value which means it can't be used as -++ // identifier here. Use an opaque pointer type instead. -++ using DagAndConstant = std::pair; -++ -+ // What kind of entity this symbol represents: -+ // * Attr: op attribute -+ // * Operand: op operand -+ // * Result: op result -+ // * Value: a value not attached to an op (e.g., from NativeCodeCall) -+- enum class Kind : uint8_t { Attr, Operand, Result, Value }; -++ // * MultipleValues: a pack of values not attached to an op (e.g., from -++ // NativeCodeCall). This kind supports indexing. -++ enum class Kind : uint8_t { Attr, Operand, Result, Value, MultipleValues }; -+ -+- // Creates a SymbolInfo instance. `index` is only used for `Attr` and -+- // `Operand` so should be negative for `Result` and `Value` kind. -+- SymbolInfo(const Operator *op, Kind kind, Optional index); -++ // Creates a SymbolInfo instance. `dagAndConstant` is only used for `Attr` -++ // and `Operand` so should be llvm::None for `Result` and `Value` kind. -++ SymbolInfo(const Operator *op, Kind kind, -++ Optional dagAndConstant); -+ -+ // Static methods for creating SymbolInfo. -+ static SymbolInfo getAttr(const Operator *op, int index) { -+- return SymbolInfo(op, Kind::Attr, index); -++ return SymbolInfo(op, Kind::Attr, DagAndConstant(nullptr, index)); -+ } -+ static SymbolInfo getAttr() { -+ return SymbolInfo(nullptr, Kind::Attr, llvm::None); -+ } -+- static SymbolInfo getOperand(const Operator *op, int index) { -+- return SymbolInfo(op, Kind::Operand, index); -++ static SymbolInfo getOperand(DagNode node, const Operator *op, int index) { -++ return SymbolInfo(op, Kind::Operand, -++ DagAndConstant(node.getAsOpaquePointer(), index)); -+ } -+ static SymbolInfo getResult(const Operator *op) { -+ return SymbolInfo(op, Kind::Result, llvm::None); -+@@ -264,6 +288,10 @@ public: -+ static SymbolInfo getValue() { -+ return SymbolInfo(nullptr, Kind::Value, llvm::None); -+ } -++ static SymbolInfo getMultipleValues(int numValues) { -++ return SymbolInfo(nullptr, Kind::MultipleValues, -++ DagAndConstant(nullptr, numValues)); -++ } -+ -+ // Returns the number of static values this symbol corresponds to. -+ // A static value is an operand/result declared in ODS. Normally a symbol -+@@ -289,10 +317,21 @@ public: -+ std::string getAllRangeUse(StringRef name, int index, const char *fmt, -+ const char *separator) const; -+ -++ // The argument index (for `Attr` and `Operand` only) -++ int getArgIndex() const { return (*dagAndConstant).second; } -++ -++ // The number of values in the MultipleValue -++ int getSize() const { return (*dagAndConstant).second; } -++ -+ const Operator *op; // The op where the bound entity belongs -+ Kind kind; // The kind of the bound entity -+- // The argument index (for `Attr` and `Operand` only) -+- Optional argIndex; -++ -++ // The pair of DagNode pointer and constant value (for `Attr`, `Operand` and -++ // the size of MultipleValue symbol). Note that operands may be bound to the -++ // same symbol, use the DagNode and index to distinguish them. For `Attr` -++ // and MultipleValue, the Dag part will be nullptr. -++ Optional dagAndConstant; -++ -+ // Alternative name for the symbol. It is used in case the name -+ // is not unique. Applicable for `Operand` only. -+ Optional alternativeName; -+@@ -312,16 +351,24 @@ public: -+ -+ // Binds the given `symbol` to the `argIndex`-th argument to the given `op`. -+ // Returns false if `symbol` is already bound and symbols are not operands. -+- bool bindOpArgument(StringRef symbol, const Operator &op, int argIndex); -++ bool bindOpArgument(DagNode node, StringRef symbol, const Operator &op, -++ int argIndex); -+ -+ // Binds the given `symbol` to the results the given `op`. Returns false if -+ // `symbol` is already bound. -+ bool bindOpResult(StringRef symbol, const Operator &op); -+ -+- // Registers the given `symbol` as bound to a value. Returns false if `symbol` -+- // is already bound. -++ // A helper function for dispatching target value binding functions. -++ bool bindValues(StringRef symbol, int numValues = 1); -++ -++ // Registers the given `symbol` as bound to the Value(s). Returns false if -++ // `symbol` is already bound. -+ bool bindValue(StringRef symbol); -+ -++ // Registers the given `symbol` as bound to a MultipleValue. Return false if -++ // `symbol` is already bound. -++ bool bindMultipleValues(StringRef symbol, int numValues); -++ -+ // Registers the given `symbol` as bound to an attr. Returns false if `symbol` -+ // is already bound. -+ bool bindAttr(StringRef symbol); -+@@ -334,8 +381,8 @@ public: -+ -+ // Returns an iterator to the information of the given symbol named as `key`, -+ // with index `argIndex` for operator `op`. -+- const_iterator findBoundSymbol(StringRef key, const Operator &op, -+- int argIndex) const; -++ const_iterator findBoundSymbol(StringRef key, DagNode node, -++ const Operator &op, int argIndex) const; -+ -+ // Returns the bounds of a range that includes all the elements which -+ // bind to the `key`. -+diff --git a/mlir/lib/TableGen/Pattern.cpp b/mlir/lib/TableGen/Pattern.cpp -+index d3bd6f7662bf..ce225ed93076 100644 -+--- a/mlir/lib/TableGen/Pattern.cpp -++++ b/mlir/lib/TableGen/Pattern.cpp -+@@ -54,9 +54,7 @@ bool DagLeaf::isEnumAttrCase() const { -+ return isSubClassOf("EnumAttrCaseInfo"); -+ } -+ -+-bool DagLeaf::isStringAttr() const { -+- return isa(def); -+-} -++bool DagLeaf::isStringAttr() const { return isa(def); } -+ -+ Constraint DagLeaf::getAsConstraint() const { -+ assert((isOperandMatcher() || isAttrMatcher()) && -+@@ -83,6 +81,11 @@ llvm::StringRef DagLeaf::getNativeCodeTemplate() const { -+ return cast(def)->getDef()->getValueAsString("expression"); -+ } -+ -++int DagLeaf::getNumReturnsOfNativeCode() const { -++ assert(isNativeCodeCall() && "the DAG leaf must be NativeCodeCall"); -++ return cast(def)->getDef()->getValueAsInt("numReturns"); -++} -++ -+ std::string DagLeaf::getStringAttr() const { -+ assert(isStringAttr() && "the DAG leaf must be string attribute"); -+ return def->getAsUnquotedString(); -+@@ -109,7 +112,8 @@ bool DagNode::isNativeCodeCall() const { -+ } -+ -+ bool DagNode::isOperation() const { -+- return !isNativeCodeCall() && !isReplaceWithValue() && !isLocationDirective(); -++ return !isNativeCodeCall() && !isReplaceWithValue() && -++ !isLocationDirective() && !isReturnTypeDirective(); -+ } -+ -+ llvm::StringRef DagNode::getNativeCodeTemplate() const { -+@@ -119,6 +123,13 @@ llvm::StringRef DagNode::getNativeCodeTemplate() const { -+ ->getValueAsString("expression"); -+ } -+ -++int DagNode::getNumReturnsOfNativeCode() const { -++ assert(isNativeCodeCall() && "the DAG leaf must be NativeCodeCall"); -++ return cast(node->getOperator()) -++ ->getDef() -++ ->getValueAsInt("numReturns"); -++} -++ -+ llvm::StringRef DagNode::getSymbol() const { return node->getNameStr(); } -+ -+ Operator &DagNode::getDialectOp(RecordOperatorMap *mapper) const { -+@@ -168,6 +179,11 @@ bool DagNode::isLocationDirective() const { -+ return dagOpDef->getName() == "location"; -+ } -+ -++bool DagNode::isReturnTypeDirective() const { -++ auto *dagOpDef = cast(node->getOperator())->getDef(); -++ return dagOpDef->getName() == "returnType"; -++} -++ -+ void DagNode::print(raw_ostream &os) const { -+ if (node) -+ node->print(os); -+@@ -193,8 +209,8 @@ StringRef SymbolInfoMap::getValuePackName(StringRef symbol, int *index) { -+ } -+ -+ SymbolInfoMap::SymbolInfo::SymbolInfo(const Operator *op, SymbolInfo::Kind kind, -+- Optional index) -+- : op(op), kind(kind), argIndex(index) {} -++ Optional dagAndConstant) -++ : op(op), kind(kind), dagAndConstant(dagAndConstant) {} -+ -+ int SymbolInfoMap::SymbolInfo::getStaticValueCount() const { -+ switch (kind) { -+@@ -204,6 +220,8 @@ int SymbolInfoMap::SymbolInfo::getStaticValueCount() const { -+ return 1; -+ case Kind::Result: -+ return op->getNumResults(); -++ case Kind::MultipleValues: -++ return getSize(); -+ } -+ llvm_unreachable("unknown kind"); -+ } -+@@ -217,8 +235,9 @@ std::string SymbolInfoMap::SymbolInfo::getVarDecl(StringRef name) const { -+ switch (kind) { -+ case Kind::Attr: { -+ if (op) { -+- auto type = -+- op->getArg(*argIndex).get()->attr.getStorageType(); -++ auto type = op->getArg(getArgIndex()) -++ .get() -++ ->attr.getStorageType(); -+ return std::string(formatv("{0} {1};\n", type, name)); -+ } -+ // TODO(suderman): Use a more exact type when available. -+@@ -234,6 +253,14 @@ std::string SymbolInfoMap::SymbolInfo::getVarDecl(StringRef name) const { -+ case Kind::Value: { -+ return std::string(formatv("::mlir::Value {0};\n", name)); -+ } -++ case Kind::MultipleValues: { -++ // This is for the variable used in the source pattern. Each named value in -++ // source pattern will only be bound to a Value. The others in the result -++ // pattern may be associated with multiple Values as we will use `auto` to -++ // do the type inference. -++ return std::string(formatv( -++ "::mlir::Value {0}_raw; ::mlir::ValueRange {0}({0}_raw);\n", name)); -++ } -+ case Kind::Result: { -+ // Use the op itself for captured results. -+ return std::string(formatv("{0} {1};\n", op->getQualCppClassName(), name)); -+@@ -254,7 +281,7 @@ std::string SymbolInfoMap::SymbolInfo::getValueAndRangeUse( -+ } -+ case Kind::Operand: { -+ assert(index < 0); -+- auto *operand = op->getArg(*argIndex).get(); -++ auto *operand = op->getArg(getArgIndex()).get(); -+ // If this operand is variadic, then return a range. Otherwise, return the -+ // value itself. -+ if (operand->isVariableLength()) { -+@@ -309,6 +336,21 @@ std::string SymbolInfoMap::SymbolInfo::getValueAndRangeUse( -+ LLVM_DEBUG(llvm::dbgs() << repl << " (Value)\n"); -+ return std::string(repl); -+ } -++ case Kind::MultipleValues: { -++ assert(op == nullptr); -++ assert(index < getSize()); -++ if (index >= 0) { -++ std::string repl = -++ formatv(fmt, std::string(formatv("{0}[{1}]", name, index))); -++ LLVM_DEBUG(llvm::dbgs() << repl << " (MultipleValues)\n"); -++ return repl; -++ } -++ // If it doesn't specify certain element, unpack them all. -++ auto repl = -++ formatv(fmt, std::string(formatv("{0}.begin(), {0}.end()", name))); -++ LLVM_DEBUG(llvm::dbgs() << repl << " (MultipleValues)\n"); -++ return std::string(repl); -++ } -+ } -+ llvm_unreachable("unknown kind"); -+ } -+@@ -351,12 +393,26 @@ std::string SymbolInfoMap::SymbolInfo::getAllRangeUse( -+ LLVM_DEBUG(llvm::dbgs() << repl << " (Value)\n"); -+ return std::string(repl); -+ } -++ case Kind::MultipleValues: { -++ assert(op == nullptr); -++ assert(index < getSize()); -++ if (index >= 0) { -++ std::string repl = -++ formatv(fmt, std::string(formatv("{0}[{1}]", name, index))); -++ LLVM_DEBUG(llvm::dbgs() << repl << " (MultipleValues)\n"); -++ return repl; -++ } -++ auto repl = -++ formatv(fmt, std::string(formatv("{0}.begin(), {0}.end()", name))); -++ LLVM_DEBUG(llvm::dbgs() << repl << " (MultipleValues)\n"); -++ return std::string(repl); -++ } -+ } -+ llvm_unreachable("unknown kind"); -+ } -+ -+-bool SymbolInfoMap::bindOpArgument(StringRef symbol, const Operator &op, -+- int argIndex) { -++bool SymbolInfoMap::bindOpArgument(DagNode node, StringRef symbol, -++ const Operator &op, int argIndex) { -+ StringRef name = getValuePackName(symbol); -+ if (name != symbol) { -+ auto error = formatv( -+@@ -366,7 +422,7 @@ bool SymbolInfoMap::bindOpArgument(StringRef symbol, const Operator &op, -+ -+ auto symInfo = op.getArg(argIndex).is() -+ ? SymbolInfo::getAttr(&op, argIndex) -+- : SymbolInfo::getOperand(&op, argIndex); -++ : SymbolInfo::getOperand(node, &op, argIndex); -+ -+ std::string key = symbol.str(); -+ if (symbolInfoMap.count(key)) { -+@@ -393,11 +449,25 @@ bool SymbolInfoMap::bindOpResult(StringRef symbol, const Operator &op) { -+ return symbolInfoMap.count(inserted->first) == 1; -+ } -+ -++bool SymbolInfoMap::bindValues(StringRef symbol, int numValues) { -++ std::string name = getValuePackName(symbol).str(); -++ if (numValues > 1) -++ return bindMultipleValues(name, numValues); -++ return bindValue(name); -++} -++ -+ bool SymbolInfoMap::bindValue(StringRef symbol) { -+ auto inserted = symbolInfoMap.emplace(symbol.str(), SymbolInfo::getValue()); -+ return symbolInfoMap.count(inserted->first) == 1; -+ } -+ -++bool SymbolInfoMap::bindMultipleValues(StringRef symbol, int numValues) { -++ std::string name = getValuePackName(symbol).str(); -++ auto inserted = -++ symbolInfoMap.emplace(name, SymbolInfo::getMultipleValues(numValues)); -++ return symbolInfoMap.count(inserted->first) == 1; -++} -++ -+ bool SymbolInfoMap::bindAttr(StringRef symbol) { -+ auto inserted = symbolInfoMap.emplace(symbol.str(), SymbolInfo::getAttr()); -+ return symbolInfoMap.count(inserted->first) == 1; -+@@ -414,16 +484,16 @@ SymbolInfoMap::const_iterator SymbolInfoMap::find(StringRef key) const { -+ } -+ -+ SymbolInfoMap::const_iterator -+-SymbolInfoMap::findBoundSymbol(StringRef key, const Operator &op, -++SymbolInfoMap::findBoundSymbol(StringRef key, DagNode node, const Operator &op, -+ int argIndex) const { -+ std::string name = getValuePackName(key).str(); -+ auto range = symbolInfoMap.equal_range(name); -+ -+- for (auto it = range.first; it != range.second; ++it) { -+- if (it->second.op == &op && it->second.argIndex == argIndex) { -++ const auto symbolInfo = SymbolInfo::getOperand(node, &op, argIndex); -++ -++ for (auto it = range.first; it != range.second; ++it) -++ if (it->second.dagAndConstant == symbolInfo.dagAndConstant) -+ return it; -+- } -+- } -+ -+ return symbolInfoMap.end(); -+ } -+@@ -629,7 +699,9 @@ void Pattern::collectBoundSymbols(DagNode tree, SymbolInfoMap &infoMap, -+ if (!isSrcPattern) { -+ LLVM_DEBUG(llvm::dbgs() << "found symbol bound to NativeCodeCall: " -+ << treeName << '\n'); -+- verifyBind(infoMap.bindValue(treeName), treeName); -++ verifyBind( -++ infoMap.bindValues(treeName, tree.getNumReturnsOfNativeCode()), -++ treeName); -+ } else { -+ PrintFatalError(&def, -+ formatv("binding symbol '{0}' to NativecodeCall in " -+@@ -685,14 +757,18 @@ void Pattern::collectBoundSymbols(DagNode tree, SymbolInfoMap &infoMap, -+ auto &op = getDialectOp(tree); -+ auto numOpArgs = op.getNumArgs(); -+ -+- // The pattern might have the last argument specifying the location. -+- bool hasLocDirective = false; -+- if (numTreeArgs != 0) { -+- if (auto lastArg = tree.getArgAsNestedDag(numTreeArgs - 1)) -+- hasLocDirective = lastArg.isLocationDirective(); -++ // The pattern might have trailing directives. -++ int numDirectives = 0; -++ for (int i = numTreeArgs - 1; i >= 0; --i) { -++ if (auto dagArg = tree.getArgAsNestedDag(i)) { -++ if (dagArg.isLocationDirective() || dagArg.isReturnTypeDirective()) -++ ++numDirectives; -++ else -++ break; -++ } -+ } -+ -+- if (numOpArgs != numTreeArgs - hasLocDirective) { -++ if (numOpArgs != numTreeArgs - numDirectives) { -+ auto err = formatv("op '{0}' argument number mismatch: " -+ "{1} in pattern vs. {2} in definition", -+ op.getOperationName(), numTreeArgs, numOpArgs); -+@@ -722,7 +798,8 @@ void Pattern::collectBoundSymbols(DagNode tree, SymbolInfoMap &infoMap, -+ if (!treeArgName.empty() && treeArgName != "_") { -+ LLVM_DEBUG(llvm::dbgs() << "found symbol bound to op argument: " -+ << treeArgName << '\n'); -+- verifyBind(infoMap.bindOpArgument(treeArgName, op, i), treeArgName); -++ verifyBind(infoMap.bindOpArgument(tree, treeArgName, op, i), -++ treeArgName); -+ } -+ } -+ } -+diff --git a/mlir/test/lib/Dialect/Test/TestOps.td b/mlir/test/lib/Dialect/Test/TestOps.td -+index 0f1775f7a78f..b6cd59978cce 100644 -+--- a/mlir/test/lib/Dialect/Test/TestOps.td -++++ b/mlir/test/lib/Dialect/Test/TestOps.td -+@@ -860,7 +860,7 @@ def OpNativeCodeCall3 : TEST_Op<"native_code_call3"> { -+ // Test that NativeCodeCall is not ignored if it is not used to directly -+ // replace the matched root op. -+ def : Pattern<(OpNativeCodeCall3 $input), -+- [(NativeCodeCall<"createOpI($_builder, $_loc, $0)"> $input), -++ [(NativeCodeCallVoid<"createOpI($_builder, $_loc, $0)"> $input), -+ (OpK)]>; -+ -+ def OpNativeCodeCall4 : TEST_Op<"native_code_call4"> { -+@@ -877,6 +877,19 @@ def BindNativeCodeCallResult : NativeCodeCall<"bindNativeCodeCallResult($0)">; -+ def : Pat<(OpNativeCodeCall4 (GetFirstI32Result $ret)), -+ (OpNativeCodeCall5 (BindNativeCodeCallResult:$native $ret), $native)>; -+ -++def OpNativeCodeCall6 : TEST_Op<"native_code_call6"> { -++ let arguments = (ins I32:$input1, I32:$input2); -++ let results = (outs I32:$output1, I32:$output2); -++} -++def OpNativeCodeCall7 : TEST_Op<"native_code_call7"> { -++ let arguments = (ins I32:$input); -++ let results = (outs I32); -++} -++def BindMultipleNativeCodeCallResult : NativeCodeCall<"bindMultipleNativeCodeCallResult($0, $1)", 2>; -++def : Pattern<(OpNativeCodeCall6 $arg1, $arg2), -++ [(OpNativeCodeCall7 (BindMultipleNativeCodeCallResult:$native__0 $arg1, $arg2)), -++ (OpNativeCodeCall7 $native__1)]>; -++ -+ // Test AllAttrConstraintsOf. -+ def OpAllAttrConstraint1 : TEST_Op<"all_attr_constraint_of1"> { -+ let arguments = (ins I64ArrayAttr:$attr); -+@@ -1036,7 +1049,7 @@ def OpSymbolBindingNoResult : TEST_Op<"symbol_binding_no_result", []> { -+ -+ // Test that we can bind to an op without results and reference it later. -+ def : Pat<(OpSymbolBindingNoResult:$op $operand), -+- (NativeCodeCall<"handleNoResultOp($_builder, $0)"> $op)>; -++ (NativeCodeCallVoid<"handleNoResultOp($_builder, $0)"> $op)>; -+ -+ //===----------------------------------------------------------------------===// -+ // Test Patterns (Attributes) -+@@ -1291,6 +1304,64 @@ def : Pat<(TestLocationSrcOp:$res1 -+ (location "named")), -+ (location "fused", $res2, $res3))>; -+ -++//===----------------------------------------------------------------------===// -++// Test Patterns (Type Builders) -++ -++def SourceOp : TEST_Op<"source_op"> { -++ let arguments = (ins AnyInteger:$arg, AnyI32Attr:$tag); -++ let results = (outs AnyInteger); -++} -++ -++// An op without return type deduction. -++def OpX : TEST_Op<"op_x"> { -++ let arguments = (ins AnyInteger:$input); -++ let results = (outs AnyInteger); -++} -++ -++// Test that ops without built-in type deduction can be created in the -++// replacement DAG with an explicitly specified type. -++def : Pat<(SourceOp $val, ConstantAttr:$attr), -++ (OpX (OpX $val, (returnType "$_builder.getI32Type()")))>; -++// Test NativeCodeCall type builder can accept arguments. -++def SameTypeAs : NativeCodeCall<"$0.getType()">; -++ -++def : Pat<(SourceOp $val, ConstantAttr:$attr), -++ (OpX (OpX $val, (returnType (SameTypeAs $val))))>; -++ -++// Test multiple return types. -++def MakeI64Type : NativeCodeCall<"$_builder.getI64Type()">; -++def MakeI32Type : NativeCodeCall<"$_builder.getI32Type()">; -++ -++def OneToTwo : TEST_Op<"one_to_two"> { -++ let arguments = (ins AnyInteger); -++ let results = (outs AnyInteger, AnyInteger); -++} -++ -++def TwoToOne : TEST_Op<"two_to_one"> { -++ let arguments = (ins AnyInteger, AnyInteger); -++ let results = (outs AnyInteger); -++} -++ -++def : Pat<(SourceOp $val, ConstantAttr:$attr), -++ (TwoToOne (OpX (OneToTwo:$res__0 $val, (returnType (MakeI64Type), (MakeI32Type))), (returnType (MakeI32Type))), -++ (OpX $res__1, (returnType (MakeI64Type))))>; -++ -++// Test copy value return type. -++def : Pat<(SourceOp $val, ConstantAttr:$attr), -++ (OpX (OpX $val, (returnType $val)))>; -++ -++// Test create multiple return types with different methods. -++def : Pat<(SourceOp $val, ConstantAttr:$attr), -++ (TwoToOne (OneToTwo:$res__0 $val, (returnType $val, "$_builder.getI64Type()")), $res__1)>; -++ -++//===----------------------------------------------------------------------===// -++// Test Patterns (Trailing Directives) -++ -++// Test that we can specify both `location` and `returnType` directives. -++def : Pat<(SourceOp $val, ConstantAttr:$attr), -++ (TwoToOne (OpX $val, (returnType $val), (location "loc1")), -++ (OpX $val, (location "loc2"), (returnType $val)))>; -++ -+ //===----------------------------------------------------------------------===// -+ // Test Legalization -+ //===----------------------------------------------------------------------===// -+diff --git a/mlir/test/lib/Dialect/Test/TestPatterns.cpp b/mlir/test/lib/Dialect/Test/TestPatterns.cpp -+index c27d855a2c2e..568f3bfe3630 100644 -+--- a/mlir/test/lib/Dialect/Test/TestPatterns.cpp -++++ b/mlir/test/lib/Dialect/Test/TestPatterns.cpp -+@@ -44,6 +44,11 @@ static bool getFirstI32Result(Operation *op, Value &value) { -+ -+ static Value bindNativeCodeCallResult(Value value) { return value; } -+ -++static SmallVector bindMultipleNativeCodeCallResult(Value input1, -++ Value input2) { -++ return SmallVector({input2, input1}); -++} -++ -+ // Test that natives calls are only called once during rewrites. -+ // OpM_Test will return Pi, increased by 1 for each subsequent calls. -+ // This let us check the number of times OpM_Test was called by inspecting -+diff --git a/mlir/test/mlir-tblgen/pattern.mlir b/mlir/test/mlir-tblgen/pattern.mlir -+index affc3d7a9396..f7345c14f0bb 100644 -+--- a/mlir/test/mlir-tblgen/pattern.mlir -++++ b/mlir/test/mlir-tblgen/pattern.mlir -+@@ -102,6 +102,16 @@ func @verifyNativeCodeCallBinding(%arg0 : i32) -> (i32) { -+ return %1 : i32 -+ } -+ -++// CHECK-LABEL: verifyMultipleNativeCodeCallBinding -++func@verifyMultipleNativeCodeCallBinding(%arg0 : i32) -> (i32) { -++ %0 = "test.op_k"() : () -> (i32) -++ %1 = "test.op_k"() : () -> (i32) -++ // CHECK: %[[A:.*]] = "test.native_code_call7"(%1) : (i32) -> i32 -++ // CHECK: %[[A:.*]] = "test.native_code_call7"(%0) : (i32) -> i32 -++ %2, %3 = "test.native_code_call6"(%0, %1) : (i32, i32) -> (i32, i32) -++ return %2 : i32 -++} -++ -+ // CHECK-LABEL: verifyAllAttrConstraintOf -+ func @verifyAllAttrConstraintOf() -> (i32, i32, i32) { -+ // CHECK: "test.all_attr_constraint_of2" -+@@ -509,3 +519,56 @@ func @redundantTest(%arg0: i32) -> i32 { -+ // CHECK: "test.op_m"(%arg0) {optional_attr = 314159265 : i32} : (i32) -> i32 -+ return %0 : i32 -+ } -++ -++//===----------------------------------------------------------------------===// -++// Test that ops without type deduction can be created with type builders. -++//===----------------------------------------------------------------------===// -++ -++func @explicitReturnTypeTest(%arg0 : i64) -> i8 { -++ %0 = "test.source_op"(%arg0) {tag = 11 : i32} : (i64) -> i8 -++ // CHECK: "test.op_x"(%arg0) : (i64) -> i32 -++ // CHECK: "test.op_x"(%0) : (i32) -> i8 -++ return %0 : i8 -++} -++ -++func @returnTypeBuilderTest(%arg0 : i1) -> i8 { -++ %0 = "test.source_op"(%arg0) {tag = 22 : i32} : (i1) -> i8 -++ // CHECK: "test.op_x"(%arg0) : (i1) -> i1 -++ // CHECK: "test.op_x"(%0) : (i1) -> i8 -++ return %0 : i8 -++} -++ -++func @multipleReturnTypeBuildTest(%arg0 : i1) -> i1 { -++ %0 = "test.source_op"(%arg0) {tag = 33 : i32} : (i1) -> i1 -++ // CHECK: "test.one_to_two"(%arg0) : (i1) -> (i64, i32) -++ // CHECK: "test.op_x"(%0#0) : (i64) -> i32 -++ // CHECK: "test.op_x"(%0#1) : (i32) -> i64 -++ // CHECK: "test.two_to_one"(%1, %2) : (i32, i64) -> i1 -++ return %0 : i1 -++} -++ -++func @copyValueType(%arg0 : i8) -> i32 { -++ %0 = "test.source_op"(%arg0) {tag = 44 : i32} : (i8) -> i32 -++ // CHECK: "test.op_x"(%arg0) : (i8) -> i8 -++ // CHECK: "test.op_x"(%0) : (i8) -> i32 -++ return %0 : i32 -++} -++ -++func @multipleReturnTypeDifferent(%arg0 : i1) -> i64 { -++ %0 = "test.source_op"(%arg0) {tag = 55 : i32} : (i1) -> i64 -++ // CHECK: "test.one_to_two"(%arg0) : (i1) -> (i1, i64) -++ // CHECK: "test.two_to_one"(%0#0, %0#1) : (i1, i64) -> i64 -++ return %0 : i64 -++} -++ -++//===----------------------------------------------------------------------===// -++// Test that multiple trailing directives can be mixed in patterns. -++//===----------------------------------------------------------------------===// -++ -++func @returnTypeAndLocation(%arg0 : i32) -> i1 { -++ %0 = "test.source_op"(%arg0) {tag = 66 : i32} : (i32) -> i1 -++ // CHECK: "test.op_x"(%arg0) : (i32) -> i32 loc("loc1") -++ // CHECK: "test.op_x"(%arg0) : (i32) -> i32 loc("loc2") -++ // CHECK: "test.two_to_one"(%0, %1) : (i32, i32) -> i1 -++ return %0 : i1 -++} -+diff --git a/mlir/test/mlir-tblgen/rewriter-errors.td b/mlir/test/mlir-tblgen/rewriter-errors.td -+index 60e4710688e7..3cebe2dfd34f 100644 -+--- a/mlir/test/mlir-tblgen/rewriter-errors.td -++++ b/mlir/test/mlir-tblgen/rewriter-errors.td -+@@ -1,6 +1,8 @@ -+ // RUN: not mlir-tblgen -gen-rewriters -I %S/../../include -DERROR1 %s 2>&1 | FileCheck --check-prefix=ERROR1 %s -+ // RUN: not mlir-tblgen -gen-rewriters -I %S/../../include -DERROR2 %s 2>&1 | FileCheck --check-prefix=ERROR2 %s -+ // RUN: not mlir-tblgen -gen-rewriters -I %S/../../include -DERROR3 %s 2>&1 | FileCheck --check-prefix=ERROR3 %s -++// RUN: not mlir-tblgen -gen-rewriters -I %S/../../include -DERROR4 %s 2>&1 | FileCheck --check-prefix=ERROR4 %s -++// RUN: not mlir-tblgen -gen-rewriters -I %S/../../include -DERROR5 %s 2>&1 | FileCheck --check-prefix=ERROR5 %s -+ -+ include "mlir/IR/OpBase.td" -+ -+@@ -35,3 +37,15 @@ def NativeMatcher : NativeCodeCall<"success(nativeCall($_self, $0, $1))">; -+ def : Pat<(OpA (NativeMatcher (OpB $val, $unused)), AnyI32Attr:$arg), -+ (OpB $val, $arg)>; -+ #endif -++ -++#ifdef ERROR4 -++// Check trying to pass op as DAG node inside ReturnTypeFunc fails. -++// ERROR4: [[@LINE+1]]:1: error: nested DAG in `returnType` must be a native code -++def : Pat<(OpB $val, AnyI32Attr:$attr), (OpA (OpA $val, $val, (returnType (OpA $val, $val))), $val)>; -++#endif -++ -++#ifdef ERROR5 -++// Check that trying to specify explicit types at the root node fails. -++// ERROR5: [[@LINE+1]]:1: error: Cannot specify explicit return types in an op -++def : Pat<(OpB $val, AnyI32Attr:$attr), (OpA $val, $val, (returnType "someType()"))>; -++#endif -+diff --git a/mlir/test/mlir-tblgen/rewriter-indexing.td b/mlir/test/mlir-tblgen/rewriter-indexing.td -+index cbdeff9c743d..e31d78c2481e 100644 -+--- a/mlir/test/mlir-tblgen/rewriter-indexing.td -++++ b/mlir/test/mlir-tblgen/rewriter-indexing.td -+@@ -85,3 +85,18 @@ def NativeBuilder : -+ // CHECK: nativeCall(rewriter, odsLoc, (*v1.begin()), (*v2.begin()), (*v3.begin()), (*v4.begin()), (*v5.begin()), (*v6.begin()), (*v7.begin()), (*v8.begin()), (*v9.begin()), (*v10.begin())) -+ def test4 : Pat<(DOp $v1, $v2, $v3, $v4, $v5, $v6, $v7, $v8, $v9, $v10), -+ (NativeBuilder $v1, $v2, $v3, $v4, $v5, $v6, $v7, $v8, $v9, $v10)>; -++ -++// CHECK: struct test5 : public ::mlir::RewritePattern { -++// CHECK: foo(rewriter, (*v4.begin()), (*v5.begin()), (*v6.begin()), (*v7.begin()), (*v8.begin()), (*v9.begin()), (*v10.begin())) -++def test5 : Pat<(DOp $v1, $v2, $v3, $v4, $v5, $v6, $v7, $v8, $v9, $v10), -++ (NativeCodeCall<[{ foo($_builder, $3...) }]> $v1, $v2, $v3, $v4, $v5, $v6, $v7, $v8, $v9, $v10)>; -++ -++// Check Pattern with return type builder. -++def SameTypeAs : NativeCodeCall<"$0.getType()">; -++// CHECK: struct test6 : public ::mlir::RewritePattern { -++// CHECK: tblgen_types.push_back((*v2.begin()).getType()) -++// CHECK: tblgen_types.push_back(rewriter.getI32Type()) -++// CHECK: nativeVar_1 = doSomething((*v3.begin())) -++// CHECK: tblgen_types.push_back(nativeVar_1) -++def test6 : Pat<(DOp $v1, $v2, $v3, $v4, $v5, $v6, $v7, $v8, $v9, $v10), -++ (AOp (AOp $v1, (returnType $v2, "$_builder.getI32Type()", (NativeCodeCall<"doSomething($0)"> $v3))))>; -+diff --git a/mlir/tools/mlir-tblgen/RewriterGen.cpp b/mlir/tools/mlir-tblgen/RewriterGen.cpp -+index e0112af6b5b0..f6bba0721805 100644 -+--- a/mlir/tools/mlir-tblgen/RewriterGen.cpp -++++ b/mlir/tools/mlir-tblgen/RewriterGen.cpp -+@@ -127,12 +127,31 @@ private: -+ // Returns the symbol of the old value serving as the replacement. -+ StringRef handleReplaceWithValue(DagNode tree); -+ -++ // Trailing directives are used at the end of DAG node argument lists to -++ // specify additional behaviour for op matchers and creators, etc. -++ struct TrailingDirectives { -++ // DAG node containing the `location` directive. Null if there is none. -++ DagNode location; -++ -++ // DAG node containing the `returnType` directive. Null if there is none. -++ DagNode returnType; -++ -++ // Number of found trailing directives. -++ int numDirectives; -++ }; -++ -++ // Collect any trailing directives. -++ TrailingDirectives getTrailingDirectives(DagNode tree); -++ -+ // Returns the location value to use. -+- std::pair getLocation(DagNode tree); -++ std::string getLocation(TrailingDirectives &tail); -+ -+ // Returns the location value to use. -+ std::string handleLocationDirective(DagNode tree); -+ -++ // Emit return type argument. -++ std::string handleReturnTypeArg(DagNode returnType, int i, int depth); -++ -+ // Emits the C++ statement to build a new op out of the given DAG `tree` and -+ // returns the variable name that this op is assigned to. If the root op in -+ // DAG `tree` has a specified name, the created op will be assigned to a -+@@ -272,9 +291,10 @@ void PatternEmitter::emitNativeCodeMatch(DagNode tree, StringRef opName, -+ capture.push_back(std::move(argName)); -+ } -+ -+- bool hasLocationDirective; -+- std::string locToUse; -+- std::tie(hasLocationDirective, locToUse) = getLocation(tree); -++ auto tail = getTrailingDirectives(tree); -++ if (tail.returnType) -++ PrintFatalError(loc, "`NativeCodeCall` cannot have return type specifier"); -++ auto locToUse = getLocation(tail); -+ -+ auto fmt = tree.getNativeCodeTemplate(); -+ if (fmt.count("$_self") != 1) { -+@@ -287,14 +307,14 @@ void PatternEmitter::emitNativeCodeMatch(DagNode tree, StringRef opName, -+ -+ os << "if (failed(" << nativeCodeCall << ")) return ::mlir::failure();\n"; -+ -+- for (int i = 0, e = tree.getNumArgs(); i != e; ++i) { -++ for (int i = 0, e = tree.getNumArgs() - tail.numDirectives; i != e; ++i) { -+ auto name = tree.getArgName(i); -+ if (!name.empty() && name != "_") { -+ os << formatv("{0} = {1};\n", name, capture[i]); -+ } -+ } -+ -+- for (int i = 0, e = tree.getNumArgs(); i != e; ++i) { -++ for (int i = 0, e = tree.getNumArgs() - tail.numDirectives; i != e; ++i) { -+ std::string argName = capture[i]; -+ -+ // Handle nested DAG construct first -+@@ -450,7 +470,7 @@ void PatternEmitter::emitOperandMatch(DagNode tree, StringRef opName, -+ op.arg_begin(), op.arg_begin() + argIndex, -+ [](const Argument &arg) { return arg.is(); }); -+ -+- auto res = symbolInfoMap.findBoundSymbol(name, op, argIndex); -++ auto res = symbolInfoMap.findBoundSymbol(name, tree, op, argIndex); -+ os << formatv("{0} = {1}.getODSOperands({2});\n", -+ res->second.getVarName(name), opName, -+ argIndex - numPrevAttrs); -+@@ -750,7 +770,8 @@ void PatternEmitter::emitRewriteLogic() { -+ // NativeCodeCall will only be materialized to `os` if it is used. Here -+ // we are handling auxiliary patterns so we want the side effect even if -+ // NativeCodeCall is not replacing matched root op's results. -+- if (resultTree.isNativeCodeCall()) -++ if (resultTree.isNativeCodeCall() && -++ resultTree.getNumReturnsOfNativeCode() == 0) -+ os << val << ";\n"; -+ } -+ -+@@ -800,11 +821,8 @@ std::string PatternEmitter::handleResultPattern(DagNode resultTree, -+ "location directive can only be used with op creation"); -+ } -+ -+- if (resultTree.isNativeCodeCall()) { -+- auto symbol = handleReplaceWithNativeCodeCall(resultTree, depth); -+- symbolInfoMap.bindValue(symbol); -+- return symbol; -+- } -++ if (resultTree.isNativeCodeCall()) -++ return handleReplaceWithNativeCodeCall(resultTree, depth); -+ -+ if (resultTree.isReplaceWithValue()) -+ return handleReplaceWithValue(resultTree).str(); -+@@ -882,6 +900,24 @@ std::string PatternEmitter::handleLocationDirective(DagNode tree) { -+ return os.str(); -+ } -+ -++std::string PatternEmitter::handleReturnTypeArg(DagNode returnType, int i, -++ int depth) { -++ // Nested NativeCodeCall. -++ if (auto dagNode = returnType.getArgAsNestedDag(i)) { -++ if (!dagNode.isNativeCodeCall()) -++ PrintFatalError(loc, "nested DAG in `returnType` must be a native code " -++ "call"); -++ return handleReplaceWithNativeCodeCall(dagNode, depth); -++ } -++ // String literal. -++ auto dagLeaf = returnType.getArgAsLeaf(i); -++ if (dagLeaf.isStringAttr()) -++ return tgfmt(dagLeaf.getStringAttr(), &fmtCtx); -++ return tgfmt( -++ "$0.getType()", &fmtCtx, -++ handleOpArgument(returnType.getArgAsLeaf(i), returnType.getArgName(i))); -++} -++ -+ std::string PatternEmitter::handleOpArgument(DagLeaf leaf, -+ StringRef patArgName) { -+ if (leaf.isStringAttr()) -+@@ -927,11 +963,12 @@ std::string PatternEmitter::handleReplaceWithNativeCodeCall(DagNode tree, -+ -+ SmallVector attrs; -+ -+- bool hasLocationDirective; -+- std::string locToUse; -+- std::tie(hasLocationDirective, locToUse) = getLocation(tree); -++ auto tail = getTrailingDirectives(tree); -++ if (tail.returnType) -++ PrintFatalError(loc, "`NativeCodeCall` cannot have return type specifier"); -++ auto locToUse = getLocation(tail); -+ -+- for (int i = 0, e = tree.getNumArgs() - hasLocationDirective; i != e; ++i) { -++ for (int i = 0, e = tree.getNumArgs() - tail.numDirectives; i != e; ++i) { -+ if (tree.isNestedDagArg(i)) { -+ attrs.push_back( -+ handleResultPattern(tree.getArgAsNestedDag(i), i, depth + 1)); -+@@ -944,9 +981,39 @@ std::string PatternEmitter::handleReplaceWithNativeCodeCall(DagNode tree, -+ } -+ -+ std::string symbol = tgfmt(fmt, &fmtCtx.addSubst("_loc", locToUse), attrs); -+- if (!tree.getSymbol().empty()) { -+- os << formatv("auto {0} = {1};\n", tree.getSymbol(), symbol); -+- symbol = tree.getSymbol().str(); -++ -++ // In general, NativeCodeCall without naming binding don't need this. To -++ // ensure void helper function has been correctly labeled, i.e., use -++ // NativeCodeCallVoid, we cache the result to a local variable so that we will -++ // get a compilation error in the auto-generated file. -++ // Example. -++ // // In the td file -++ // Pat<(...), (NativeCodeCall ...)> -++ // -++ // --- -++ // -++ // // In the auto-generated .cpp -++ // ... -++ // // Causes compilation error if Foo() returns void. -++ // auto nativeVar = Foo(); -++ // ... -++ if (tree.getNumReturnsOfNativeCode() != 0) { -++ // Determine the local variable name for return value. -++ std::string varName = -++ SymbolInfoMap::getValuePackName(tree.getSymbol()).str(); -++ if (varName.empty()) { -++ varName = formatv("nativeVar_{0}", nextValueId++); -++ // Register the local variable for later uses. -++ symbolInfoMap.bindValues(varName, tree.getNumReturnsOfNativeCode()); -++ } -++ -++ // Catch the return value of helper function. -++ os << formatv("auto {0} = {1}; (void){0};\n", varName, symbol); -++ -++ if (!tree.getSymbol().empty()) -++ symbol = tree.getSymbol().str(); -++ else -++ symbol = varName; -+ } -+ -+ return symbol; -+@@ -963,23 +1030,56 @@ int PatternEmitter::getNodeValueCount(DagNode node) { -+ // Otherwise this is an unbound op; we will use all its results. -+ return pattern.getDialectOp(node).getNumResults(); -+ } -+- // TODO: This considers all NativeCodeCall as returning one -+- // value. Enhance if multi-value ones are needed. -++ -++ if (node.isNativeCodeCall()) -++ return node.getNumReturnsOfNativeCode(); -++ -+ return 1; -+ } -+ -+-std::pair PatternEmitter::getLocation(DagNode tree) { -+- auto numPatArgs = tree.getNumArgs(); -++PatternEmitter::TrailingDirectives -++PatternEmitter::getTrailingDirectives(DagNode tree) { -++ TrailingDirectives tail = {DagNode(nullptr), DagNode(nullptr), 0}; -+ -+- if (numPatArgs != 0) { -+- if (auto lastArg = tree.getArgAsNestedDag(numPatArgs - 1)) -+- if (lastArg.isLocationDirective()) { -+- return std::make_pair(true, handleLocationDirective(lastArg)); -+- } -++ // Look backwards through the arguments. -++ auto numPatArgs = tree.getNumArgs(); -++ for (int i = numPatArgs - 1; i >= 0; --i) { -++ auto dagArg = tree.getArgAsNestedDag(i); -++ // A leaf is not a directive. Stop looking. -++ if (!dagArg) -++ break; -++ -++ auto isLocation = dagArg.isLocationDirective(); -++ auto isReturnType = dagArg.isReturnTypeDirective(); -++ // If encountered a DAG node that isn't a trailing directive, stop looking. -++ if (!(isLocation || isReturnType)) -++ break; -++ // Save the directive, but error if one of the same type was already -++ // found. -++ ++tail.numDirectives; -++ if (isLocation) { -++ if (tail.location) -++ PrintFatalError(loc, "`location` directive can only be specified " -++ "once"); -++ tail.location = dagArg; -++ } else if (isReturnType) { -++ if (tail.returnType) -++ PrintFatalError(loc, "`returnType` directive can only be specified " -++ "once"); -++ tail.returnType = dagArg; -++ } -+ } -+ -++ return tail; -++} -++ -++std::string -++PatternEmitter::getLocation(PatternEmitter::TrailingDirectives &tail) { -++ if (tail.location) -++ return handleLocationDirective(tail.location); -++ -+ // If no explicit location is given, use the default, all fused, location. -+- return std::make_pair(false, "odsLoc"); -++ return "odsLoc"; -+ } -+ -+ std::string PatternEmitter::handleOpCreation(DagNode tree, int resultIndex, -+@@ -992,11 +1092,10 @@ std::string PatternEmitter::handleOpCreation(DagNode tree, int resultIndex, -+ auto numOpArgs = resultOp.getNumArgs(); -+ auto numPatArgs = tree.getNumArgs(); -+ -+- bool hasLocationDirective; -+- std::string locToUse; -+- std::tie(hasLocationDirective, locToUse) = getLocation(tree); -++ auto tail = getTrailingDirectives(tree); -++ auto locToUse = getLocation(tail); -+ -+- auto inPattern = numPatArgs - hasLocationDirective; -++ auto inPattern = numPatArgs - tail.numDirectives; -+ if (numOpArgs != inPattern) { -+ PrintFatalError(loc, -+ formatv("resultant op '{0}' argument number mismatch: " -+@@ -1011,7 +1110,7 @@ std::string PatternEmitter::handleOpCreation(DagNode tree, int resultIndex, -+ // First go through all the child nodes who are nested DAG constructs to -+ // create ops for them and remember the symbol names for them, so that we can -+ // use the results in the current node. This happens in a recursive manner. -+- for (int i = 0, e = tree.getNumArgs() - hasLocationDirective; i != e; ++i) { -++ for (int i = 0, e = tree.getNumArgs() - tail.numDirectives; i != e; ++i) { -+ if (auto child = tree.getArgAsNestedDag(i)) -+ childNodeNames[i] = handleResultPattern(child, i, depth + 1); -+ } -+@@ -1046,7 +1145,7 @@ std::string PatternEmitter::handleOpCreation(DagNode tree, int resultIndex, -+ bool useFirstAttr = -+ resultOp.getTrait("::mlir::OpTrait::FirstAttrDerivedResultType"); -+ -+- if (isSameOperandsAndResultType || useFirstAttr) { -++ if (!tail.returnType && (isSameOperandsAndResultType || useFirstAttr)) { -+ // We know how to deduce the result type for ops with these traits and we've -+ // generated builders taking aggregate parameters. Use those builders to -+ // create the ops. -+@@ -1063,7 +1162,7 @@ std::string PatternEmitter::handleOpCreation(DagNode tree, int resultIndex, -+ -+ bool usePartialResults = valuePackName != resultValue; -+ -+- if (usePartialResults || depth > 0 || resultIndex < 0) { -++ if (!tail.returnType && (usePartialResults || depth > 0 || resultIndex < 0)) { -+ // For these cases (broadcastable ops, op results used both as auxiliary -+ // values and replacement values, ops in nested patterns, auxiliary ops), we -+ // still need to supply the result types when building the op. But because -+@@ -1081,10 +1180,14 @@ std::string PatternEmitter::handleOpCreation(DagNode tree, int resultIndex, -+ return resultValue; -+ } -+ -+- // If depth == 0 and resultIndex >= 0, it means we are replacing the values -+- // generated from the source pattern root op. Then we can use the source -+- // pattern's value types to determine the value type of the generated op -+- // here. -++ // If we are provided explicit return types, use them to build the op. -++ // However, if depth == 0 and resultIndex >= 0, it means we are replacing -++ // the values generated from the source pattern root op. Then we must use the -++ // source pattern's value types to determine the value type of the generated -++ // op here. -++ if (depth == 0 && resultIndex >= 0 && tail.returnType) -++ PrintFatalError(loc, "Cannot specify explicit return types in an op whose " -++ "return values replace the source pattern's root op"); -+ -+ // First prepare local variables for op arguments used in builder call. -+ createAggregateLocalVarsForOpArgs(tree, childNodeNames, depth); -+@@ -1094,11 +1197,20 @@ std::string PatternEmitter::handleOpCreation(DagNode tree, int resultIndex, -+ os.indent() << formatv("::mlir::SmallVector<::mlir::Type, 4> tblgen_types; " -+ "(void)tblgen_types;\n"); -+ int numResults = resultOp.getNumResults(); -+- if (numResults != 0) { -+- for (int i = 0; i < numResults; ++i) -+- os << formatv("for (auto v: castedOp0.getODSResults({0})) {{\n" -+- " tblgen_types.push_back(v.getType());\n}\n", -+- resultIndex + i); -++ if (tail.returnType) { -++ auto numRetTys = tail.returnType.getNumArgs(); -++ for (int i = 0; i < numRetTys; ++i) { -++ auto varName = handleReturnTypeArg(tail.returnType, i, depth + 1); -++ os << "tblgen_types.push_back(" << varName << ");\n"; -++ } -++ } else { -++ if (numResults != 0) { -++ // Copy the result types from the source pattern. -++ for (int i = 0; i < numResults; ++i) -++ os << formatv("for (auto v: castedOp0.getODSResults({0})) {{\n" -++ " tblgen_types.push_back(v.getType());\n}\n", -++ resultIndex + i); -++ } -+ } -+ os << formatv("{0} = rewriter.create<{1}>({2}, tblgen_types, " -+ "tblgen_values, tblgen_attrs);\n", -+@@ -1187,8 +1299,7 @@ void PatternEmitter::supplyValuesForOpArgs( -+ if (!subTree.isNativeCodeCall()) -+ PrintFatalError(loc, "only NativeCodeCall allowed in nested dag node " -+ "for creating attribute"); -+- os << formatv("/*{0}=*/{1}", opArgName, -+- handleReplaceWithNativeCodeCall(subTree, depth)); -++ os << formatv("/*{0}=*/{1}", opArgName, childNodeNames.lookup(argIndex)); -+ } else { -+ auto leaf = node.getArgAsLeaf(argIndex); -+ // The argument in the result DAG pattern. -+@@ -1229,8 +1340,7 @@ void PatternEmitter::createAggregateLocalVarsForOpArgs( -+ if (!subTree.isNativeCodeCall()) -+ PrintFatalError(loc, "only NativeCodeCall allowed in nested dag node " -+ "for creating attribute"); -+- os << formatv(addAttrCmd, opArgName, -+- handleReplaceWithNativeCodeCall(subTree, depth + 1)); -++ os << formatv(addAttrCmd, opArgName, childNodeNames.lookup(argIndex)); -+ } else { -+ auto leaf = node.getArgAsLeaf(argIndex); -+ // The argument in the result DAG pattern. -diff -Naur third_party/llvm/workspace.bzl /Users/deepakpanickal/code/llvm/workspace.bzl ---- third_party/llvm/workspace.bzl 2022-01-19 21:56:22.000000000 +0000 -+++ /Users/deepakpanickal/code/llvm/workspace.bzl 2022-01-19 22:16:11.000000000 +0000 -@@ -20,4 +20,5 @@ - "//third_party/mlir:BUILD": "mlir/BUILD", - "//third_party/mlir:test.BUILD": "mlir/test/BUILD", - }, -+ patch_file = "//third_party/llvm:llvm_td_update.patch", - ) diff --git a/experimental/xformer/python/README.md b/experimental/xformer/python/README.md deleted file mode 100644 index c989672e8..000000000 --- a/experimental/xformer/python/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# XMOS AI Tools - -## Usage - -### Using xformer -``` -from xmos_ai_tools import xformer as xf - -xf.convert("source model path", "converted model path", params=None) -``` - -### Using the xcore tflm host interpreter -``` -from xmos_ai_tools import xcore_tflm_host_interpreter as xtflm - -ie = xtflm.XTFLMInterpreter(model_content=xformed_model) -ie.set_input_tensor(0, input_tensor) -ie.invoke() -xformer_outputs = [] -for i in range(num_of_outputs): - xformer_outputs.append(ie.get_output_tensor(i)) -``` \ No newline at end of file diff --git a/experimental/xformer/python/pyproject.toml b/experimental/xformer/python/pyproject.toml deleted file mode 100644 index e8cf30ba6..000000000 --- a/experimental/xformer/python/pyproject.toml +++ /dev/null @@ -1,5 +0,0 @@ -[build-system] -# These are the assumed default build requirements from pip: -# https://pip.pypa.io/en/stable/reference/pip/#pep-517-and-518-support -requires = ["setuptools>=43.0.0", "wheel"] -build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/experimental/xformer/python/setup.cfg b/experimental/xformer/python/setup.cfg deleted file mode 100644 index 58e572c70..000000000 --- a/experimental/xformer/python/setup.cfg +++ /dev/null @@ -1,4 +0,0 @@ -[metadata] -# This includes the license file(s) in the wheel. -# https://wheel.readthedocs.io/en/stable/user_guide.html#including-license-files-in-the-generated-wheel-file -license_files = ../../../LICENSE.rst \ No newline at end of file diff --git a/experimental/xformer/python/setup.py b/experimental/xformer/python/setup.py deleted file mode 100644 index 7fe971d6e..000000000 --- a/experimental/xformer/python/setup.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/python3 - -# Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the -# XMOS Public License: Version 1 - -import platform -from setuptools import setup -from setuptools.command.install import install -import pathlib -import os - -# Find path to xcore-opt binary -here = pathlib.Path(__file__).parent.resolve() -exe_suffix = ".exe" if platform.system() == "Windows" else "" -XCOREOPT_BINARY = pathlib.Path.joinpath(here.parent, "bazel-bin", "xcore-opt", - exe_suffix) - -# Get the long description from the README file -LONG_README = (here / 'README.md').read_text(encoding='utf-8') - -# xtflm_interpreter path and libs from lib_tflite_micro -XTFLM_INTERPRETER_LIBS = [ - "/libs/linux/xtflm_python.so", - "/libs/linux/xtflm_python.so.1.0.1", - "/libs/macos/xtflm_python.dylib", - "/libs/macos/xtflm_python.1.0.1.dylib", -] -XTFLM_INTERPRETER_PATH = pathlib.Path.joinpath(here.parent.parent.parent, "third_party", "lib_tflite_micro", "xtflm_interpreter", "xtflm_interpreter") -# adjust path to libs -XTFLM_INTERPRETER_LIBS = [str(XTFLM_INTERPRETER_PATH) + x for x in XTFLM_INTERPRETER_LIBS] -# xtflm_interpreter requires numpy -REQUIRED_PACKAGES = [ - "numpy<2.0", -] - -# Get tag version from env variable -# This will be in the format, vX.Y.Z -# We need to remove the first character to get just the version number -environment_variable_name = 'XMOS_AI_TOOLS_RELEASE_VERSION' -VERSION_NUMBER = os.environ.get( environment_variable_name, "v0.1.0" ) -VERSION_NUMBER = VERSION_NUMBER[1:] - -# Force platform specific wheel. -# https://stackoverflow.com/questions/45150304 -try: - from wheel.bdist_wheel import bdist_wheel as _bdist_wheel - - class bdist_wheel(_bdist_wheel): - def finalize_options(self): - _bdist_wheel.finalize_options(self) - self.root_is_pure = False - - def get_tag(self): - python, abi, plat = _bdist_wheel.get_tag(self) - # We don't contain any python extensions so are version agnostic - # but still want to be platform specific. - python, abi = 'py3', 'none' - return python, abi, plat - -except ImportError: - bdist_wheel = None - - -# See https://github.com/bigartm/bigartm/issues/840 -class install_plat_lib(install): - def finalize_options(self): - install.finalize_options(self) - self.install_lib = self.install_platlib - - -setup( - name="xmos-ai-tools", - version=VERSION_NUMBER, - author="XMOS", - author_email="support@xmos.com", - license="LICENSE.txt", - description="XMOS AI Tools", - long_description=LONG_README, - long_description_content_type="text/markdown", - url="https://github.com/xmos/ai_tools", - classifiers=[ - "License :: Other/Proprietary License", - "Development Status :: 4 - Beta", - "Intended Audience :: Developers", - "Intended Audience :: Education", - "Intended Audience :: Science/Research", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Topic :: Scientific/Engineering", - "Topic :: Scientific/Engineering :: Mathematics", - "Topic :: Scientific/Engineering :: Artificial Intelligence", - "Topic :: Software Development", - "Topic :: Software Development :: Libraries", - "Topic :: Software Development :: Libraries :: Python Modules", - ], - python_requires=">=3.7", - install_requires=REQUIRED_PACKAGES, - package_dir={'xmos_ai_tools.xformer': 'src/xformer', 'xmos_ai_tools.xcore_tflm_host_interpreter': str(XTFLM_INTERPRETER_PATH)}, - packages=['xmos_ai_tools.xformer', 'xmos_ai_tools.xcore_tflm_host_interpreter'], # Required - package_data={"": XTFLM_INTERPRETER_LIBS}, - data_files=[('bin', [str(XCOREOPT_BINARY)])], - cmdclass={ - 'bdist_wheel': bdist_wheel, - 'install': install_plat_lib, - }, - keywords="tensorflow binarized neural networks", -) diff --git a/experimental/xformer/python/src/xformer/__init__.py b/experimental/xformer/python/src/xformer/__init__.py deleted file mode 100644 index 43d109abf..000000000 --- a/experimental/xformer/python/src/xformer/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -import subprocess -import typing -from pathlib import Path -from typing import Union, List, Optional - - -def convert(filename: Union[str, Path], outfile: Union[str, Path], - params: Optional[typing.Dict[str, Optional[str]]]) -> int: - args: List[Optional[str]] = ["xcore-opt", "-o", str(outfile)] - - if params is not None: - for key, val in params.items(): - if len(key) > 1: - flag: str = "--" + str(key) - else: - flag = "-" + str(key) - if str(val) == "" or val is None: - args.append(flag) - else: - args.append(f"{flag} {val}") - - args.append(str(filename)) - - process_call: subprocess.CompletedProcess = subprocess.run( - [arg for arg in args], check=True) - return process_call.returncode diff --git a/experimental/xformer/toolchain/BUILD b/experimental/xformer/toolchain/BUILD deleted file mode 100644 index 369886450..000000000 --- a/experimental/xformer/toolchain/BUILD +++ /dev/null @@ -1,72 +0,0 @@ -# -# Copyright 2015 Google Inc. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -package(default_visibility = ["//visibility:public"]) - -#filegroup( -# name = "toolchain", -# srcs = [ -# ":cc-compiler-linux", -# ], -#) - -#filegroup(name = "clang_suite") - -cc_toolchain_suite( - name = "gnu_suite", - toolchains = { - "k8": ":k8_toolchain", - }, -) - -filegroup(name = "empty") - -cc_toolchain( - name = "k8_toolchain", - toolchain_identifier = "k8-toolchain", - toolchain_config = ":k8_toolchain_config", - all_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 0, -) - -load(":cc_toolchain_config.bzl", "cc_toolchain_config") - -cc_toolchain_config(name = "k8_toolchain_config") - -#cc_toolchain( -# name = "cc_linux", -# toolchain_config = ":linux_toolchain_config", -# all_files = ":empty", -# compiler_files = ":empty", -# dwp_files = ":empty", -# linker_files = ":empty", -# objcopy_files = ":empty", -# strip_files = ":empty", -# supports_param_files = 0, -#) -# -#toolchain_type(name = "toolchain_type") -# -#toolchain( -# name = "cc-compiler-linux", -# toolchain = ":cc_linux", -# toolchain_type = ":toolchain_type", -# toolchain_config = ":linux_toolchain_config", -###) diff --git a/experimental/xformer/toolchain/cc_toolchain_config.bzl b/experimental/xformer/toolchain/cc_toolchain_config.bzl deleted file mode 100644 index 77cc66ca5..000000000 --- a/experimental/xformer/toolchain/cc_toolchain_config.bzl +++ /dev/null @@ -1,97 +0,0 @@ -# NEW -load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") -# NEW -load( - "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", - "feature", - "flag_group", - "flag_set", - "tool_path", -) - -all_link_actions = [ # NEW - ACTION_NAMES.cpp_link_executable, - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.cpp_link_nodeps_dynamic_library, -] - -def _impl(ctx): - tool_paths = [ # NEW - tool_path( - name = "gcc", - path = "/opt/xmos/gcc/11.2.0/bin/gcc", - ), - tool_path( - name = "ld", - path = "/usr/bin/ld", - ), - tool_path( - name = "ar", - path = "/opt/xmos/gcc/11.2.0/bin/gcc-ar", - ), - tool_path( - name = "cpp", - path = "/opt/xmos/gcc/11.2.0/bin/cpp", - ), - tool_path( - name = "gcov", - path = "/bin/false", - ), - tool_path( - name = "nm", - path = "/bin/false", - ), - tool_path( - name = "objdump", - path = "/bin/false", - ), - tool_path( - name = "strip", - path = "/bin/false", - ), - ] - - features = [ # NEW - feature( - name = "default_linker_flags", - enabled = True, - flag_sets = [ - flag_set( - actions = all_link_actions, - flag_groups = ([ - flag_group( - flags = [ - "-lstdc++", - ], - ), - ]), - ), - ], - ), - ] - - return cc_common.create_cc_toolchain_config_info( - ctx = ctx, - features = features, # NEW - cxx_builtin_include_directories = [ - "/opt/xmos/gcc/11.2.0/lib/gcc/x86_64-pc-linux-gnu/11.2.0/include", - "/opt/xmos/gcc/11.2.0/lib/gcc/x86_64-pc-linux-gnu/11.2.0/include-fixed", - "/opt/xmos/gcc/11.2.0/include", - "/usr/include", - ], - toolchain_identifier = "local", - host_system_name = "local", - target_system_name = "local", - target_cpu = "k8", - target_libc = "unknown", - compiler = "gnu", - abi_version = "unknown", - abi_libc_version = "unknown", - tool_paths = tool_paths - ) - -cc_toolchain_config = rule( - implementation = _impl, - attrs = {}, - provides = [CcToolchainConfigInfo], -) diff --git a/integration_tests/compile_test.cpp b/integration_tests/compile_test.cpp new file mode 100644 index 000000000..f9ec8c72d --- /dev/null +++ b/integration_tests/compile_test.cpp @@ -0,0 +1,51 @@ +#include +#include +#include "model.tflite.h" + +int main() { + if (model_init(NULL)) { + printf("Error!\n"); + } + + for (int n = 0; n < model_inputs(); ++n) { + char filename[8]; + sprintf(filename, "in%d", n); + FILE *fp = fopen(filename, "rb"); + if (fp == NULL) { + printf("Failed to open file.\n"); + return 1; + } + int8_t *in = model_input(n)->data.int8; + for (int i = 0; i < model_input_size(n); ++i) { + int byte = fgetc(fp); + if (byte == EOF) { + printf("Input too small for model. EOF occured.\n"); + break; + } + printf("%d,", byte); + in[i] = (int8_t)byte; + } + printf("\n"); + fclose(fp); + } + + model_invoke(); + + for (int n = 0; n < model_outputs(); ++n) { + char filename[8]; + sprintf(filename, "out%d", n); + FILE *fp = fopen(filename, "wb"); + if (fp == NULL) { + printf("Failed to open file.\n"); + return 1; + } + int8_t *out = model_output(n)->data.int8; + for (int i = 0; i < model_output_size(n); ++i) { + printf("%d,", (int)out[i]); + } + printf("\n"); + fwrite(out, sizeof(int8_t), model_output_size(n), fp); + fclose(fp); + } + return 0; +} diff --git a/integration_tests/conftest.py b/integration_tests/conftest.py new file mode 100644 index 000000000..631029de9 --- /dev/null +++ b/integration_tests/conftest.py @@ -0,0 +1,44 @@ +import glob +import pathlib +import sys + +# workaround to get debug logs when using xdist +sys.stdout = sys.stderr + + +def pytest_addoption(parser): + parser.addoption( + "--s", + default=False, + action="store_true", + help="sleep for five seconds to attach a debugger", + ) + parser.addoption( + "--bnn", default=False, action="store_true", help="run binarized models" + ) + parser.addoption( + "--device", default=False, action="store_true", help="run tests on xcore" + ) + parser.addoption( + "--compiled", default=False, action="store_true", help="test compiled models" + ) + parser.addoption( + "--models_path", + action="store", + type=pathlib.Path, + required=True, + help="path to the directory containing the models to be tested", + ) + parser.addoption( + "--tc", + action="store", + default=5, + type=int, + help="xcore-thread-count parameter for compilation", + ) + + +def pytest_generate_tests(metafunc): + models_path = metafunc.config.getoption("models_path") + filelist = glob.glob(str(models_path) + "/**/*.tflite", recursive=True) + metafunc.parametrize("filename", filelist) diff --git a/integration_tests/device_test/Makefile b/integration_tests/device_test/Makefile new file mode 100644 index 000000000..843f94140 --- /dev/null +++ b/integration_tests/device_test/Makefile @@ -0,0 +1,37 @@ +TARGET = XCORE-AI-EXPLORER +APP_NAME = + +APP_FLAGS = -report \ +-O3 -mcmodel=large -fxscope -Wno-xcore-fptrgroup \ +-g \ +-Xcompiler-xc -mtimer-abi=hwtimers \ +-DUSB_TILE='tile[1]' -DXUD_CORE_CLOCK=600 \ +-lquadflash + +# The USED_MODULES variable lists other module used by the application. +USED_MODULES = lib_xud + +# ******************************************************* +# Include AI Tools library and headers +# ******************************************************* +# The following variables are defined for AI Tools library +# and should be included when building the app. +# XMOS_AITOOLSLIB_DEFINITIONS +# XMOS_AITOOLSLIB_INCLUDES +# XMOS_AITOOLSLIB_LIBRARIES +# +ifeq ($(XMOS_AITOOLSLIB_PATH),) +$(error Path to XMOS AI Tools library and headers not set correctly!) +endif +include ${XMOS_AITOOLSLIB_PATH}/buildfiles/aitoolslib.make + +XCC_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_CPP_FLAGS = $(APP_FLAGS) -std=c++14 $(XMOS_AITOOLSLIB_DEFINITIONS) $(XMOS_AITOOLSLIB_INCLUDES) +XCC_MAP_FLAGS = $(APP_FLAGS) $(XMOS_AITOOLSLIB_LIBRARIES) + +#============================================================================= +# The following part of the Makefile includes the common build infrastructure +# for compiling XMOS applications. You should not need to edit below here. + +XMOS_MAKE_PATH ?= ../.. +include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common diff --git a/integration_tests/device_test/src/config.xscope b/integration_tests/device_test/src/config.xscope new file mode 100644 index 000000000..ef80fed5b --- /dev/null +++ b/integration_tests/device_test/src/config.xscope @@ -0,0 +1,3 @@ + + + diff --git a/integration_tests/device_test/src/main.xc b/integration_tests/device_test/src/main.xc new file mode 100644 index 000000000..834b54104 --- /dev/null +++ b/integration_tests/device_test/src/main.xc @@ -0,0 +1,22 @@ +#include +#include "ioserver.h" + +#define NUMBER_OF_MODELS 1 + +extern void run(chanend io_channel); + +int main(void) { + chan io_channel[NUMBER_OF_MODELS]; + par { + on tile[0]: { + unsafe { + run(io_channel[0]); + } + } + on tile[1]: { + // ioserver uses three threads + ioserver(io_channel, NUMBER_OF_MODELS); + } + } + return 0; +} diff --git a/integration_tests/device_test/src/support.cpp b/integration_tests/device_test/src/support.cpp new file mode 100644 index 000000000..48d0a9138 --- /dev/null +++ b/integration_tests/device_test/src/support.cpp @@ -0,0 +1,10 @@ +#include +#include +#include "model.tflite.h" + +extern "C" { +void run(unsigned io_channel) { + model_init(NULL); + model_ioserver(io_channel); +} +} diff --git a/integration_tests/models/16x8/test_add/params.yaml b/integration_tests/models/16x8/test_add/params.yaml new file mode 100644 index 000000000..1b38ac6e5 --- /dev/null +++ b/integration_tests/models/16x8/test_add/params.yaml @@ -0,0 +1,3 @@ +MAX_ABS_ERROR: 1.0 +AVG_ABS_ERROR: 1.0 +ABS_AVG_ERROR: 1.0 \ No newline at end of file diff --git a/integration_tests/models/16x8/test_add/test_add_0.tflite b/integration_tests/models/16x8/test_add/test_add_0.tflite new file mode 100644 index 000000000..3efe46ec0 Binary files /dev/null and b/integration_tests/models/16x8/test_add/test_add_0.tflite differ diff --git a/integration_tests/models/16x8/test_add/test_add_46.tflite b/integration_tests/models/16x8/test_add/test_add_46.tflite new file mode 100644 index 000000000..ff43c2885 Binary files /dev/null and b/integration_tests/models/16x8/test_add/test_add_46.tflite differ diff --git a/integration_tests/models/16x8/test_concatenate/generate.py b/integration_tests/models/16x8/test_concatenate/generate.py new file mode 100644 index 000000000..796667b3e --- /dev/null +++ b/integration_tests/models/16x8/test_concatenate/generate.py @@ -0,0 +1,36 @@ +import numpy as np +import tensorflow as tf +from tensorflow import lite as tfl + +i = 0 + +def generate_concatenate_model(input_shapes, axis): + input_data = [tf.keras.Input(shape=input_shape, dtype=np.float32, batch_size=1) for input_shape in input_shapes] + concatenated_output = tf.concat(input_data, axis=axis) + model = tf.keras.Model(inputs=input_data, outputs=concatenated_output) + converter = tfl.TFLiteConverter.from_keras_model(model) + def representative_dataset_gen(): + for _ in range(100): + yield [np.random.uniform(low=-127, high=127, size=shp).astype(np.float32) for shp in input_shapes] + converter.optimizations = [tf.lite.Optimize.DEFAULT] + converter.representative_dataset = representative_dataset_gen + converter.target_spec.supported_ops = [tfl.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8] + converter._experimental_full_integer_quantization_bias_type=tf.int32 + + tflite_model = converter.convert() + global i + model_name = f'test_concatenate_{i}.tflite' + i+=1 + with open(model_name, 'wb') as f: + f.write(tflite_model) + print(f'Model saved: {model_name}') + + +generate_concatenate_model([(64), (64)], 0) # 0 +generate_concatenate_model([(2, 3), (2, 3)], 1) # 1 +generate_concatenate_model([(2, 3, 5), (2, 3, 5)], -1) # 2 +generate_concatenate_model([(2, 3, 5), (2, 3, 7)], -1) # 3 +generate_concatenate_model([(2, 6, 5, 2), (2, 6, 5, 2)], 1) # 4 +generate_concatenate_model([(2, 6, 5, 2), (2, 2, 5, 2)], -3) # 5 +generate_concatenate_model([(2, 6, 5, 2), (2, 6, 5, 2)], 3) # 6 + diff --git a/integration_tests/models/16x8/test_concatenate/params.yaml b/integration_tests/models/16x8/test_concatenate/params.yaml new file mode 100644 index 000000000..03e350050 --- /dev/null +++ b/integration_tests/models/16x8/test_concatenate/params.yaml @@ -0,0 +1 @@ +MAX_ABS_ERROR: 0.04 diff --git a/integration_tests/models/16x8/test_concatenate/test_concatenate_0.tflite b/integration_tests/models/16x8/test_concatenate/test_concatenate_0.tflite new file mode 100644 index 000000000..b2eb8e67d Binary files /dev/null and b/integration_tests/models/16x8/test_concatenate/test_concatenate_0.tflite differ diff --git a/integration_tests/models/16x8/test_concatenate/test_concatenate_1.tflite b/integration_tests/models/16x8/test_concatenate/test_concatenate_1.tflite new file mode 100644 index 000000000..fa04bfada Binary files /dev/null and b/integration_tests/models/16x8/test_concatenate/test_concatenate_1.tflite differ diff --git a/integration_tests/models/16x8/test_concatenate/test_concatenate_2.tflite b/integration_tests/models/16x8/test_concatenate/test_concatenate_2.tflite new file mode 100644 index 000000000..e38b092c8 Binary files /dev/null and b/integration_tests/models/16x8/test_concatenate/test_concatenate_2.tflite differ diff --git a/integration_tests/models/16x8/test_concatenate/test_concatenate_3.tflite b/integration_tests/models/16x8/test_concatenate/test_concatenate_3.tflite new file mode 100644 index 000000000..f10275577 Binary files /dev/null and b/integration_tests/models/16x8/test_concatenate/test_concatenate_3.tflite differ diff --git a/integration_tests/models/16x8/test_concatenate/test_concatenate_4.tflite b/integration_tests/models/16x8/test_concatenate/test_concatenate_4.tflite new file mode 100644 index 000000000..6ad100037 Binary files /dev/null and b/integration_tests/models/16x8/test_concatenate/test_concatenate_4.tflite differ diff --git a/integration_tests/models/16x8/test_concatenate/test_concatenate_5.tflite b/integration_tests/models/16x8/test_concatenate/test_concatenate_5.tflite new file mode 100644 index 000000000..c80d46efb Binary files /dev/null and b/integration_tests/models/16x8/test_concatenate/test_concatenate_5.tflite differ diff --git a/integration_tests/models/16x8/test_concatenate/test_concatenate_6.tflite b/integration_tests/models/16x8/test_concatenate/test_concatenate_6.tflite new file mode 100644 index 000000000..cfe68f969 Binary files /dev/null and b/integration_tests/models/16x8/test_concatenate/test_concatenate_6.tflite differ diff --git a/integration_tests/models/16x8/test_conv2d/test_conv2d_0.tflite b/integration_tests/models/16x8/test_conv2d/test_conv2d_0.tflite new file mode 100644 index 000000000..460d896b2 Binary files /dev/null and b/integration_tests/models/16x8/test_conv2d/test_conv2d_0.tflite differ diff --git a/integration_tests/models/16x8/test_conv2d/test_conv2d_1.tflite b/integration_tests/models/16x8/test_conv2d/test_conv2d_1.tflite new file mode 100644 index 000000000..da3f18158 Binary files /dev/null and b/integration_tests/models/16x8/test_conv2d/test_conv2d_1.tflite differ diff --git a/integration_tests/models/16x8/test_conv2d/test_conv2d_2.tflite b/integration_tests/models/16x8/test_conv2d/test_conv2d_2.tflite new file mode 100644 index 000000000..5f6d0f1d6 Binary files /dev/null and b/integration_tests/models/16x8/test_conv2d/test_conv2d_2.tflite differ diff --git a/integration_tests/models/16x8/test_fully_connected/test_fully_connected_0.tflite b/integration_tests/models/16x8/test_fully_connected/test_fully_connected_0.tflite new file mode 100644 index 000000000..c483147e7 Binary files /dev/null and b/integration_tests/models/16x8/test_fully_connected/test_fully_connected_0.tflite differ diff --git a/integration_tests/models/16x8/test_mean/params.yaml b/integration_tests/models/16x8/test_mean/params.yaml new file mode 100644 index 000000000..aecf2f6bd --- /dev/null +++ b/integration_tests/models/16x8/test_mean/params.yaml @@ -0,0 +1 @@ +MAX_ABS_ERROR: 1.0 diff --git a/integration_tests/models/16x8/test_mean/test_mean_0.tflite b/integration_tests/models/16x8/test_mean/test_mean_0.tflite new file mode 100644 index 000000000..d6ba76ad0 Binary files /dev/null and b/integration_tests/models/16x8/test_mean/test_mean_0.tflite differ diff --git a/integration_tests/models/16x8/test_mean/test_mean_1.mlir b/integration_tests/models/16x8/test_mean/test_mean_1.mlir new file mode 100644 index 000000000..86e91f1ab --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_1.mlir @@ -0,0 +1,5 @@ +func.func @main(%arg0: tensor<1x5x8x16x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x5x1x16x!quant.uniform> {tf_saved_model.index_path = ["tf.mean_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1xi32>, value = dense<2> : tensor<1xi32>} : () -> tensor<1xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<1x5x8x16x!quant.uniform>, tensor<1xi32>) -> tensor<1x5x1x16x!quant.uniform> + return %1 : tensor<1x5x1x16x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_1.tflite b/integration_tests/models/16x8/test_mean/test_mean_1.tflite new file mode 100644 index 000000000..063533218 Binary files /dev/null and b/integration_tests/models/16x8/test_mean/test_mean_1.tflite differ diff --git a/integration_tests/models/16x8/test_mean/test_mean_10.mlir b/integration_tests/models/16x8/test_mean/test_mean_10.mlir new file mode 100644 index 000000000..f49a62393 --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_10.mlir @@ -0,0 +1,6 @@ +// This test reduces the 2nd and 3rd axes of a 4D tensor with consecutive axes and keep_dims = true. +func.func @main(%arg0: tensor<8x5x10x12x!quant.uniform>) -> (tensor<8x1x1x12x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[1, 2]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<8x5x10x12x!quant.uniform>, tensor<2xi32>) -> tensor<8x1x1x12x!quant.uniform> + return %1 : tensor<8x1x1x12x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_10.tflite b/integration_tests/models/16x8/test_mean/test_mean_10.tflite new file mode 100644 index 000000000..e84cfe0cb Binary files /dev/null and b/integration_tests/models/16x8/test_mean/test_mean_10.tflite differ diff --git a/integration_tests/models/16x8/test_mean/test_mean_10_int16.mlir b/integration_tests/models/16x8/test_mean/test_mean_10_int16.mlir new file mode 100644 index 000000000..043682ea9 --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_10_int16.mlir @@ -0,0 +1,6 @@ +// This test reduces the 2nd and 3rd axes of a 4D tensor with consecutive axes and keep_dims = true. +func.func @main(%arg0: tensor<8x5x10x12x!quant.uniform>) -> (tensor<8x1x1x12x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[1, 2]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<8x5x10x12x!quant.uniform>, tensor<2xi32>) -> tensor<8x1x1x12x!quant.uniform> + return %1 : tensor<8x1x1x12x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_11.mlir b/integration_tests/models/16x8/test_mean/test_mean_11.mlir new file mode 100644 index 000000000..f49a62393 --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_11.mlir @@ -0,0 +1,6 @@ +// This test reduces the 2nd and 3rd axes of a 4D tensor with consecutive axes and keep_dims = true. +func.func @main(%arg0: tensor<8x5x10x12x!quant.uniform>) -> (tensor<8x1x1x12x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[1, 2]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<8x5x10x12x!quant.uniform>, tensor<2xi32>) -> tensor<8x1x1x12x!quant.uniform> + return %1 : tensor<8x1x1x12x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_11.tflite b/integration_tests/models/16x8/test_mean/test_mean_11.tflite new file mode 100644 index 000000000..e84cfe0cb Binary files /dev/null and b/integration_tests/models/16x8/test_mean/test_mean_11.tflite differ diff --git a/integration_tests/models/16x8/test_mean/test_mean_11_int16.mlir b/integration_tests/models/16x8/test_mean/test_mean_11_int16.mlir new file mode 100644 index 000000000..043682ea9 --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_11_int16.mlir @@ -0,0 +1,6 @@ +// This test reduces the 2nd and 3rd axes of a 4D tensor with consecutive axes and keep_dims = true. +func.func @main(%arg0: tensor<8x5x10x12x!quant.uniform>) -> (tensor<8x1x1x12x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[1, 2]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<8x5x10x12x!quant.uniform>, tensor<2xi32>) -> tensor<8x1x1x12x!quant.uniform> + return %1 : tensor<8x1x1x12x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_1_int16.mlir b/integration_tests/models/16x8/test_mean/test_mean_1_int16.mlir new file mode 100644 index 000000000..d02569533 --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_1_int16.mlir @@ -0,0 +1,5 @@ +func.func @main(%arg0: tensor<1x5x8x16x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x5x1x16x!quant.uniform> {tf_saved_model.index_path = ["tf.mean_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1xi32>, value = dense<2> : tensor<1xi32>} : () -> tensor<1xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<1x5x8x16x!quant.uniform>, tensor<1xi32>) -> tensor<1x5x1x16x!quant.uniform> + return %1 : tensor<1x5x1x16x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_2.mlir b/integration_tests/models/16x8/test_mean/test_mean_2.mlir new file mode 100644 index 000000000..7b006436c --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_2.mlir @@ -0,0 +1,6 @@ +// This test reduces the 3rd axis of a 4D tensor without keeping dimensions. +func.func @main(%arg0: tensor<2x3x4x5x!quant.uniform>) -> (tensor<2x3x5x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1xi32>, value = dense<2> : tensor<1xi32>} : () -> tensor<1xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = false} : (tensor<2x3x4x5x!quant.uniform>, tensor<1xi32>) -> tensor<2x3x5x!quant.uniform> + return %1 : tensor<2x3x5x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_2.tflite b/integration_tests/models/16x8/test_mean/test_mean_2.tflite new file mode 100644 index 000000000..bff813a03 Binary files /dev/null and b/integration_tests/models/16x8/test_mean/test_mean_2.tflite differ diff --git a/integration_tests/models/16x8/test_mean/test_mean_2_int16.mlir b/integration_tests/models/16x8/test_mean/test_mean_2_int16.mlir new file mode 100644 index 000000000..7cebc482c --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_2_int16.mlir @@ -0,0 +1,6 @@ +// This test reduces the 3rd axis of a 4D tensor without keeping dimensions. +func.func @main(%arg0: tensor<2x3x4x5x!quant.uniform>) -> (tensor<2x3x5x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1xi32>, value = dense<2> : tensor<1xi32>} : () -> tensor<1xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = false} : (tensor<2x3x4x5x!quant.uniform>, tensor<1xi32>) -> tensor<2x3x5x!quant.uniform> + return %1 : tensor<2x3x5x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_3.mlir b/integration_tests/models/16x8/test_mean/test_mean_3.mlir new file mode 100644 index 000000000..1c964c9f2 --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_3.mlir @@ -0,0 +1,6 @@ +// This test reduces the 2nd and 4th axes of a 5D tensor while keeping dimensions. +func.func @main(%arg0: tensor<4x3x5x7x6x!quant.uniform>) -> (tensor<4x1x5x1x6x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[1, 3]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<4x3x5x7x6x!quant.uniform>, tensor<2xi32>) -> tensor<4x1x5x1x6x!quant.uniform> + return %1 : tensor<4x1x5x1x6x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_3.tflite b/integration_tests/models/16x8/test_mean/test_mean_3.tflite new file mode 100644 index 000000000..101a53ba3 Binary files /dev/null and b/integration_tests/models/16x8/test_mean/test_mean_3.tflite differ diff --git a/integration_tests/models/16x8/test_mean/test_mean_3_int16.mlir b/integration_tests/models/16x8/test_mean/test_mean_3_int16.mlir new file mode 100644 index 000000000..1172d1eed --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_3_int16.mlir @@ -0,0 +1,6 @@ +// This test reduces the 2nd and 4th axes of a 5D tensor while keeping dimensions. +func.func @main(%arg0: tensor<4x3x5x7x6x!quant.uniform>) -> (tensor<4x1x5x1x6x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[1, 3]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<4x3x5x7x6x!quant.uniform>, tensor<2xi32>) -> tensor<4x1x5x1x6x!quant.uniform> + return %1 : tensor<4x1x5x1x6x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_4.mlir b/integration_tests/models/16x8/test_mean/test_mean_4.mlir new file mode 100644 index 000000000..595ef06c6 --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_4.mlir @@ -0,0 +1,6 @@ +// This test reduces the 1st axis of a 3D tensor without keeping dimensions. +func.func @main(%arg0: tensor<10x20x30x!quant.uniform>) -> (tensor<20x30x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1xi32>, value = dense<0> : tensor<1xi32>} : () -> tensor<1xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = false} : (tensor<10x20x30x!quant.uniform>, tensor<1xi32>) -> tensor<20x30x!quant.uniform> + return %1 : tensor<20x30x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_4.tflite b/integration_tests/models/16x8/test_mean/test_mean_4.tflite new file mode 100644 index 000000000..e023e126f Binary files /dev/null and b/integration_tests/models/16x8/test_mean/test_mean_4.tflite differ diff --git a/integration_tests/models/16x8/test_mean/test_mean_4_int16.mlir b/integration_tests/models/16x8/test_mean/test_mean_4_int16.mlir new file mode 100644 index 000000000..7cd5d0508 --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_4_int16.mlir @@ -0,0 +1,6 @@ +// This test reduces the 1st axis of a 3D tensor without keeping dimensions. +func.func @main(%arg0: tensor<10x20x30x!quant.uniform>) -> (tensor<20x30x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1xi32>, value = dense<0> : tensor<1xi32>} : () -> tensor<1xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = false} : (tensor<10x20x30x!quant.uniform>, tensor<1xi32>) -> tensor<20x30x!quant.uniform> + return %1 : tensor<20x30x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_5.mlir b/integration_tests/models/16x8/test_mean/test_mean_5.mlir new file mode 100644 index 000000000..bfbc54527 --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_5.mlir @@ -0,0 +1,6 @@ +// This test reduces all axes of a 2D tensor while keeping dimensions. +func.func @main(%arg0: tensor<5x7x!quant.uniform>) -> (tensor<1x1x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[0, 1]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<5x7x!quant.uniform>, tensor<2xi32>) -> tensor<1x1x!quant.uniform> + return %1 : tensor<1x1x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_5.tflite b/integration_tests/models/16x8/test_mean/test_mean_5.tflite new file mode 100644 index 000000000..be35d7504 Binary files /dev/null and b/integration_tests/models/16x8/test_mean/test_mean_5.tflite differ diff --git a/integration_tests/models/16x8/test_mean/test_mean_5_int16.mlir b/integration_tests/models/16x8/test_mean/test_mean_5_int16.mlir new file mode 100644 index 000000000..913a2c3c9 --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_5_int16.mlir @@ -0,0 +1,6 @@ +// This test reduces all axes of a 2D tensor while keeping dimensions. +func.func @main(%arg0: tensor<5x7x!quant.uniform>) -> (tensor<1x1x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[0, 1]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<5x7x!quant.uniform>, tensor<2xi32>) -> tensor<1x1x!quant.uniform> + return %1 : tensor<1x1x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_6.mlir b/integration_tests/models/16x8/test_mean/test_mean_6.mlir new file mode 100644 index 000000000..9d8f2be6d --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_6.mlir @@ -0,0 +1,6 @@ +// This test reduces a 1D tensor to a scalar. +func.func @main(%arg0: tensor<15x!quant.uniform>) -> (tensor>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1xi32>, value = dense<0> : tensor<1xi32>} : () -> tensor<1xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = false} : (tensor<15x!quant.uniform>, tensor<1xi32>) -> tensor> + return %1 : tensor> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_6.tflite b/integration_tests/models/16x8/test_mean/test_mean_6.tflite new file mode 100644 index 000000000..200c2d60a Binary files /dev/null and b/integration_tests/models/16x8/test_mean/test_mean_6.tflite differ diff --git a/integration_tests/models/16x8/test_mean/test_mean_6_int16.mlir b/integration_tests/models/16x8/test_mean/test_mean_6_int16.mlir new file mode 100644 index 000000000..57a4a498c --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_6_int16.mlir @@ -0,0 +1,6 @@ +// This test reduces a 1D tensor to a scalar. +func.func @main(%arg0: tensor<15x!quant.uniform>) -> (tensor>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1xi32>, value = dense<0> : tensor<1xi32>} : () -> tensor<1xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = false} : (tensor<15x!quant.uniform>, tensor<1xi32>) -> tensor> + return %1 : tensor> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_7.mlir b/integration_tests/models/16x8/test_mean/test_mean_7.mlir new file mode 100644 index 000000000..36c6a0739 --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_7.mlir @@ -0,0 +1,6 @@ +// This test reduces the 2nd and 3rd axes of a 3D tensor with different input/output quantization parameters. +func.func @main(%arg0: tensor<5x6x7x!quant.uniform>) -> (tensor<5x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[1, 2]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = false} : (tensor<5x6x7x!quant.uniform>, tensor<2xi32>) -> tensor<5x!quant.uniform> + return %1 : tensor<5x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/test_mean_7.tflite b/integration_tests/models/16x8/test_mean/test_mean_7.tflite new file mode 100644 index 000000000..da9ae10b1 Binary files /dev/null and b/integration_tests/models/16x8/test_mean/test_mean_7.tflite differ diff --git a/integration_tests/models/16x8/test_mean/test_mean_7_int16.mlir b/integration_tests/models/16x8/test_mean/test_mean_7_int16.mlir new file mode 100644 index 000000000..078b65ca7 --- /dev/null +++ b/integration_tests/models/16x8/test_mean/test_mean_7_int16.mlir @@ -0,0 +1,6 @@ +// This test reduces the 2nd and 3rd axes of a 3D tensor with different input/output quantization parameters. +func.func @main(%arg0: tensor<5x6x7x!quant.uniform>) -> (tensor<5x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[1, 2]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = false} : (tensor<5x6x7x!quant.uniform>, tensor<2xi32>) -> tensor<5x!quant.uniform> + return %1 : tensor<5x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_mean/translate_mlir.py b/integration_tests/models/16x8/test_mean/translate_mlir.py new file mode 100644 index 000000000..847e5f432 --- /dev/null +++ b/integration_tests/models/16x8/test_mean/translate_mlir.py @@ -0,0 +1,53 @@ +import os +import re + + +def translate_int8_to_int16_mlir(mlir_code): + """ + Translates MLIR code from using int8 quantization to int16 quantization, removing any zero-point specification. + + Args: + mlir_code (str): The original MLIR code string with int8 quantization. + + Returns: + str: Translated MLIR code with int16 quantization. + """ + # Step 1: Replace int8 quantization with int16 quantization in tensor types + mlir_code = re.sub( + r"!quant\.uniform]+)>", r"!quant.uniform", mlir_code + ) + + # Step 2: Remove any zero-point by eliminating it from the parameter list + mlir_code = re.sub( + r"!quant\.uniform]+>", + r"!quant.uniform", + mlir_code, + ) + + return mlir_code + + +def process_mlir_files_in_directory(): + """ + Processes all .mlir files in the current directory by translating int8 quantization to int16, + and saving the output to a new file with the _int16.mlir suffix. + """ + for filename in os.listdir("."): + if not filename.endswith(".mlir") or filename.endswith("_int16.mlir"): + continue + with open(filename, "r") as file: + mlir_code = file.read() + + # Translate the MLIR code + translated_mlir_code = translate_int8_to_int16_mlir(mlir_code) + + # Save the translated code to a new file + new_filename = f"{os.path.splitext(filename)[0]}_int16.mlir" + with open(new_filename, "w") as new_file: + new_file.write(translated_mlir_code) + print(f"Processed {filename} -> {new_filename}") + + +# Execute the script +if __name__ == "__main__": + process_mlir_files_in_directory() diff --git a/integration_tests/models/16x8/test_mul/params.yaml b/integration_tests/models/16x8/test_mul/params.yaml new file mode 100644 index 000000000..d89d6f82f --- /dev/null +++ b/integration_tests/models/16x8/test_mul/params.yaml @@ -0,0 +1,3 @@ +MAX_ABS_ERROR: 2.0 +AVG_ABS_ERROR: 1.5 +ABS_AVG_ERROR: 1.5 diff --git a/integration_tests/models/16x8/test_mul/test_mul_41.tflite b/integration_tests/models/16x8/test_mul/test_mul_41.tflite new file mode 100644 index 000000000..2bd381cbb Binary files /dev/null and b/integration_tests/models/16x8/test_mul/test_mul_41.tflite differ diff --git a/integration_tests/models/16x8/test_mul/test_mul_6.tflite b/integration_tests/models/16x8/test_mul/test_mul_6.tflite new file mode 100644 index 000000000..b975ed2a0 Binary files /dev/null and b/integration_tests/models/16x8/test_mul/test_mul_6.tflite differ diff --git a/integration_tests/models/16x8/test_sigmoid/params.yaml b/integration_tests/models/16x8/test_sigmoid/params.yaml new file mode 100644 index 000000000..0d9bc8cf2 --- /dev/null +++ b/integration_tests/models/16x8/test_sigmoid/params.yaml @@ -0,0 +1,2 @@ +MAX_ABS_ERROR: 2.0 +AVG_ABS_ERROR: 0.35 diff --git a/integration_tests/models/16x8/test_sigmoid/test_sigmoid_0.tflite b/integration_tests/models/16x8/test_sigmoid/test_sigmoid_0.tflite new file mode 100644 index 000000000..be5bdf732 Binary files /dev/null and b/integration_tests/models/16x8/test_sigmoid/test_sigmoid_0.tflite differ diff --git a/integration_tests/models/16x8/test_tanh/params.yaml b/integration_tests/models/16x8/test_tanh/params.yaml new file mode 100644 index 000000000..7b0ce5b07 --- /dev/null +++ b/integration_tests/models/16x8/test_tanh/params.yaml @@ -0,0 +1,2 @@ +MAX_ABS_ERROR: 3.0 +AVG_ABS_ERROR : 0.50 \ No newline at end of file diff --git a/integration_tests/models/16x8/test_tanh/test_tanh_0.tflite b/integration_tests/models/16x8/test_tanh/test_tanh_0.tflite new file mode 100644 index 000000000..e9e6481a1 Binary files /dev/null and b/integration_tests/models/16x8/test_tanh/test_tanh_0.tflite differ diff --git a/integration_tests/models/16x8/test_tanh/test_tanh_1.tflite b/integration_tests/models/16x8/test_tanh/test_tanh_1.tflite new file mode 100644 index 000000000..5ad6fd9f8 Binary files /dev/null and b/integration_tests/models/16x8/test_tanh/test_tanh_1.tflite differ diff --git a/integration_tests/models/16x8/test_transpose/test_transpose_0.mlir b/integration_tests/models/16x8/test_transpose/test_transpose_0.mlir new file mode 100644 index 000000000..178917139 --- /dev/null +++ b/integration_tests/models/16x8/test_transpose/test_transpose_0.mlir @@ -0,0 +1,5 @@ +func.func @main(%arg0: tensor<4x6x5x8x!quant.uniform>) -> (tensor<4x5x6x8x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[0, 2, 1, 3]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.transpose"(%arg0, %0) : (tensor<4x6x5x8x!quant.uniform>, tensor<4xi32>) -> tensor<4x5x6x8x!quant.uniform> + return %1 : tensor<4x5x6x8x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_transpose/test_transpose_0.tflite b/integration_tests/models/16x8/test_transpose/test_transpose_0.tflite new file mode 100644 index 000000000..6d527fc6f Binary files /dev/null and b/integration_tests/models/16x8/test_transpose/test_transpose_0.tflite differ diff --git a/integration_tests/models/16x8/test_transpose/test_transpose_1.mlir b/integration_tests/models/16x8/test_transpose/test_transpose_1.mlir new file mode 100644 index 000000000..92c14d23e --- /dev/null +++ b/integration_tests/models/16x8/test_transpose/test_transpose_1.mlir @@ -0,0 +1,8 @@ +func.func @main(%arg0: tensor<3x7x6x4x!quant.uniform>) -> (tensor<4x3x7x6x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[0, 3, 2, 1]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.transpose"(%arg0, %0) : (tensor<3x7x6x4x!quant.uniform>, tensor<4xi32>) -> tensor<3x4x6x7x!quant.uniform> + %2 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[1, 0, 3, 2]> : tensor<4xi32>} : () -> tensor<4xi32> + %3 = "tfl.transpose"(%1, %2) : (tensor<3x4x6x7x!quant.uniform>, tensor<4xi32>) -> tensor<4x3x7x6x!quant.uniform> + return %3 : tensor<4x3x7x6x!quant.uniform> +} + diff --git a/integration_tests/models/16x8/test_transpose/test_transpose_1.tflite b/integration_tests/models/16x8/test_transpose/test_transpose_1.tflite new file mode 100644 index 000000000..c7eeeeece Binary files /dev/null and b/integration_tests/models/16x8/test_transpose/test_transpose_1.tflite differ diff --git a/integration_tests/models/16x8/test_transpose/test_transpose_2.mlir b/integration_tests/models/16x8/test_transpose/test_transpose_2.mlir new file mode 100644 index 000000000..669f570f8 --- /dev/null +++ b/integration_tests/models/16x8/test_transpose/test_transpose_2.mlir @@ -0,0 +1,10 @@ +func.func @main(%arg0: tensor<2x8x4x6x!quant.uniform>) -> (tensor<4x2x6x8x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[1, 0, 3, 2]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.transpose"(%arg0, %0) : (tensor<2x8x4x6x!quant.uniform>, tensor<4xi32>) -> tensor<8x2x6x4x!quant.uniform> + %2 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[0, 2, 3, 1]> : tensor<4xi32>} : () -> tensor<4xi32> + %3 = "tfl.transpose"(%1, %2) : (tensor<8x2x6x4x!quant.uniform>, tensor<4xi32>) -> tensor<8x6x4x2x!quant.uniform> + %4 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[2, 3, 1, 0]> : tensor<4xi32>} : () -> tensor<4xi32> + %5 = "tfl.transpose"(%3, %4) : (tensor<8x6x4x2x!quant.uniform>, tensor<4xi32>) -> tensor<4x2x6x8x!quant.uniform> + return %5 : tensor<4x2x6x8x!quant.uniform> +} + diff --git a/integration_tests/models/16x8/test_transpose/test_transpose_2.tflite b/integration_tests/models/16x8/test_transpose/test_transpose_2.tflite new file mode 100644 index 000000000..ded9a14ba Binary files /dev/null and b/integration_tests/models/16x8/test_transpose/test_transpose_2.tflite differ diff --git a/integration_tests/models/16x8/test_transpose/test_transpose_3.mlir b/integration_tests/models/16x8/test_transpose/test_transpose_3.mlir new file mode 100644 index 000000000..292a6cc39 --- /dev/null +++ b/integration_tests/models/16x8/test_transpose/test_transpose_3.mlir @@ -0,0 +1,6 @@ +func.func @main(%arg0: tensor<2x3x4x5x6x!quant.uniform>) -> (tensor<2x6x5x4x3x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<5xi32>, value = dense<[0, 4, 3, 2, 1]> : tensor<5xi32>} : () -> tensor<5xi32> + %1 = "tfl.transpose"(%arg0, %0) : (tensor<2x3x4x5x6x!quant.uniform>, tensor<5xi32>) -> tensor<2x6x5x4x3x!quant.uniform> + return %1 : tensor<2x6x5x4x3x!quant.uniform> +} + diff --git a/integration_tests/models/16x8/test_transpose/test_transpose_3.tflite b/integration_tests/models/16x8/test_transpose/test_transpose_3.tflite new file mode 100644 index 000000000..9db72fe2b Binary files /dev/null and b/integration_tests/models/16x8/test_transpose/test_transpose_3.tflite differ diff --git a/integration_tests/models/16x8/test_transpose/test_transpose_4.mlir b/integration_tests/models/16x8/test_transpose/test_transpose_4.mlir new file mode 100644 index 000000000..b9ec6939e --- /dev/null +++ b/integration_tests/models/16x8/test_transpose/test_transpose_4.mlir @@ -0,0 +1,7 @@ +func.func @main(%arg0: tensor<3x4x5x6x7x!quant.uniform>) -> (tensor<4x5x6x7x3x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<5xi32>, value = dense<[0, 4, 3, 2, 1]> : tensor<5xi32>} : () -> tensor<5xi32> + %1 = "tfl.transpose"(%arg0, %0) : (tensor<3x4x5x6x7x!quant.uniform>, tensor<5xi32>) -> tensor<3x7x6x5x4x!quant.uniform> + %2 = "tfl.pseudo_qconst"() {qtype = tensor<5xi32>, value = dense<[4, 3, 2, 1, 0]> : tensor<5xi32>} : () -> tensor<5xi32> + %3 = "tfl.transpose"(%1, %2) : (tensor<3x7x6x5x4x!quant.uniform>, tensor<5xi32>) -> tensor<4x5x6x7x3x!quant.uniform> + return %3 : tensor<4x5x6x7x3x!quant.uniform> +} diff --git a/integration_tests/models/16x8/test_transpose/test_transpose_4.tflite b/integration_tests/models/16x8/test_transpose/test_transpose_4.tflite new file mode 100644 index 000000000..067ace8a9 Binary files /dev/null and b/integration_tests/models/16x8/test_transpose/test_transpose_4.tflite differ diff --git a/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_0.tflite b/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_0.tflite new file mode 100644 index 000000000..38a28cd13 Binary files /dev/null and b/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_0.tflite differ diff --git a/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_1.tflite b/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_1.tflite new file mode 100644 index 000000000..714b83e52 Binary files /dev/null and b/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_1.tflite differ diff --git a/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_2.tflite b/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_2.tflite new file mode 100644 index 000000000..9d3a43a4d Binary files /dev/null and b/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_2.tflite differ diff --git a/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_3.tflite b/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_3.tflite new file mode 100644 index 000000000..82720f122 Binary files /dev/null and b/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_3.tflite differ diff --git a/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_4.tflite b/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_4.tflite new file mode 100644 index 000000000..ad68a8482 Binary files /dev/null and b/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_4.tflite differ diff --git a/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_5.tflite b/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_5.tflite new file mode 100644 index 000000000..93401a7d0 Binary files /dev/null and b/integration_tests/models/16x8/test_transpose_conv/test_transpose_conv_5.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_0.tflite b/integration_tests/models/8x8/test_add/test_add_0.tflite new file mode 100644 index 000000000..c4acfacb9 Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_0.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_1.tflite b/integration_tests/models/8x8/test_add/test_add_1.tflite new file mode 100644 index 000000000..a60c15aea Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_1.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_10.tflite b/integration_tests/models/8x8/test_add/test_add_10.tflite new file mode 100644 index 000000000..af5163742 Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_10.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_11.tflite b/integration_tests/models/8x8/test_add/test_add_11.tflite new file mode 100644 index 000000000..c116c2470 Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_11.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_12.tflite b/integration_tests/models/8x8/test_add/test_add_12.tflite new file mode 100644 index 000000000..1a322327f Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_12.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_13.tflite b/integration_tests/models/8x8/test_add/test_add_13.tflite new file mode 100644 index 000000000..57309fdbd Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_13.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_14.tflite b/integration_tests/models/8x8/test_add/test_add_14.tflite new file mode 100644 index 000000000..b4fc7cdb8 Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_14.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_15.tflite b/integration_tests/models/8x8/test_add/test_add_15.tflite new file mode 100644 index 000000000..b1e88afca Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_15.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_16.tflite b/integration_tests/models/8x8/test_add/test_add_16.tflite new file mode 100644 index 000000000..64c439fca Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_16.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_17.tflite b/integration_tests/models/8x8/test_add/test_add_17.tflite new file mode 100644 index 000000000..70b67362a Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_17.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_18.tflite b/integration_tests/models/8x8/test_add/test_add_18.tflite new file mode 100644 index 000000000..7b61d768d Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_18.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_19.tflite b/integration_tests/models/8x8/test_add/test_add_19.tflite new file mode 100644 index 000000000..2d74d1e1e Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_19.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_2.tflite b/integration_tests/models/8x8/test_add/test_add_2.tflite new file mode 100644 index 000000000..f2a2498c4 Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_2.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_3.tflite b/integration_tests/models/8x8/test_add/test_add_3.tflite new file mode 100644 index 000000000..c01249e26 Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_3.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_4.tflite b/integration_tests/models/8x8/test_add/test_add_4.tflite new file mode 100644 index 000000000..1080c809e Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_4.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_41.tflite b/integration_tests/models/8x8/test_add/test_add_41.tflite new file mode 100644 index 000000000..5f35d3614 Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_41.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_42.tflite b/integration_tests/models/8x8/test_add/test_add_42.tflite new file mode 100644 index 000000000..15b76df93 Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_42.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_43.tflite b/integration_tests/models/8x8/test_add/test_add_43.tflite new file mode 100644 index 000000000..7baad802e Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_43.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_44.tflite b/integration_tests/models/8x8/test_add/test_add_44.tflite new file mode 100644 index 000000000..ff0b869fb Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_44.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_45.tflite b/integration_tests/models/8x8/test_add/test_add_45.tflite new file mode 100644 index 000000000..63754e1b9 Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_45.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_46.tflite b/integration_tests/models/8x8/test_add/test_add_46.tflite new file mode 100644 index 000000000..d5b7a2156 Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_46.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_47.tflite b/integration_tests/models/8x8/test_add/test_add_47.tflite new file mode 100644 index 000000000..77a127939 Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_47.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_5.tflite b/integration_tests/models/8x8/test_add/test_add_5.tflite new file mode 100644 index 000000000..7b691e1ed Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_5.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_6.tflite b/integration_tests/models/8x8/test_add/test_add_6.tflite new file mode 100644 index 000000000..cb06eb881 Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_6.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_7.tflite b/integration_tests/models/8x8/test_add/test_add_7.tflite new file mode 100644 index 000000000..eb7a208bc Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_7.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_8.tflite b/integration_tests/models/8x8/test_add/test_add_8.tflite new file mode 100644 index 000000000..8e65623da Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_8.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_9.tflite b/integration_tests/models/8x8/test_add/test_add_9.tflite new file mode 100644 index 000000000..b78efbd04 Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_9.tflite differ diff --git a/integration_tests/models/8x8/test_add/test_add_dual_output.tflite b/integration_tests/models/8x8/test_add/test_add_dual_output.tflite new file mode 100644 index 000000000..045f6d336 Binary files /dev/null and b/integration_tests/models/8x8/test_add/test_add_dual_output.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/params.yaml b/integration_tests/models/8x8/test_avgpool2d/params.yaml new file mode 100644 index 000000000..219fc195a --- /dev/null +++ b/integration_tests/models/8x8/test_avgpool2d/params.yaml @@ -0,0 +1,2 @@ +ABS_AVG_ERROR: 1.0 +AVG_ABS_ERROR: 1.0 \ No newline at end of file diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_0.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_0.tflite new file mode 100644 index 000000000..2ecb523aa Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_0.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_1.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_1.tflite new file mode 100644 index 000000000..f4dac4ce0 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_1.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_10.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_10.tflite new file mode 100644 index 000000000..106386573 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_10.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_11.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_11.tflite new file mode 100644 index 000000000..70f268840 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_11.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_12.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_12.tflite new file mode 100644 index 000000000..3945746ca Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_12.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_13.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_13.tflite new file mode 100644 index 000000000..a7b542c51 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_13.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_14.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_14.tflite new file mode 100644 index 000000000..ed3732878 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_14.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_15.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_15.tflite new file mode 100644 index 000000000..d4ee37db2 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_15.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_16.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_16.tflite new file mode 100644 index 000000000..e6abbf51f Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_16.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_17.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_17.tflite new file mode 100644 index 000000000..35309722a Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_17.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_18.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_18.tflite new file mode 100644 index 000000000..e34873263 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_18.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_19.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_19.tflite new file mode 100644 index 000000000..9db558c72 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_19.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_2.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_2.tflite new file mode 100644 index 000000000..93854e235 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_2.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_20.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_20.tflite new file mode 100644 index 000000000..b7e8ea5c7 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_20.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_21.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_21.tflite new file mode 100644 index 000000000..90d33a676 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_21.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_22.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_22.tflite new file mode 100644 index 000000000..5cfdab202 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_22.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_23.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_23.tflite new file mode 100644 index 000000000..6ec44ef36 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_23.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_24.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_24.tflite new file mode 100644 index 000000000..8f9f5e5fa Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_24.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_25.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_25.tflite new file mode 100644 index 000000000..64c1ad017 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_25.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_26.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_26.tflite new file mode 100644 index 000000000..4f5693cf9 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_26.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_27.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_27.tflite new file mode 100644 index 000000000..067b6e417 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_27.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_28.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_28.tflite new file mode 100644 index 000000000..4e8aabd42 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_28.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_29.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_29.tflite new file mode 100644 index 000000000..03b6e90b2 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_29.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_3.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_3.tflite new file mode 100644 index 000000000..6653dd41e Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_3.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_30.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_30.tflite new file mode 100644 index 000000000..52d1c54c8 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_30.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_31.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_31.tflite new file mode 100644 index 000000000..5e8ac02e3 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_31.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_32.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_32.tflite new file mode 100644 index 000000000..6b39aac29 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_32.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_33.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_33.tflite new file mode 100644 index 000000000..d952740da Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_33.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_34.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_34.tflite new file mode 100644 index 000000000..b67e2d11d Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_34.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_35.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_35.tflite new file mode 100644 index 000000000..e97cbc23d Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_35.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_36.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_36.tflite new file mode 100644 index 000000000..43fd908f6 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_36.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_37.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_37.tflite new file mode 100644 index 000000000..438645442 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_37.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_38.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_38.tflite new file mode 100644 index 000000000..7fe372aa3 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_38.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_39.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_39.tflite new file mode 100644 index 000000000..f35969d97 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_39.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_4.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_4.tflite new file mode 100644 index 000000000..9cdd7e099 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_4.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_5.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_5.tflite new file mode 100644 index 000000000..2a1aba600 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_5.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_6.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_6.tflite new file mode 100644 index 000000000..f98f12172 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_6.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_7.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_7.tflite new file mode 100644 index 000000000..dc5be196f Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_7.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_8.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_8.tflite new file mode 100644 index 000000000..bb11c0489 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_8.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_9.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_9.tflite new file mode 100644 index 000000000..ed472ad91 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_9.tflite differ diff --git a/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_dual_output.tflite b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_dual_output.tflite new file mode 100644 index 000000000..82cd138d8 Binary files /dev/null and b/integration_tests/models/8x8/test_avgpool2d/test_avgpool2d_dual_output.tflite differ diff --git a/integration_tests/models/8x8/test_broadcast/generate.py b/integration_tests/models/8x8/test_broadcast/generate.py new file mode 100644 index 000000000..67c074be9 --- /dev/null +++ b/integration_tests/models/8x8/test_broadcast/generate.py @@ -0,0 +1,20 @@ +import numpy as np +import tensorflow as tf + +input_shape = (13, 5) +input_data = tf.keras.Input(shape=input_shape, batch_size=1) +output = tf.broadcast_to(input_data, (1, 8, 13, 5)) +model = tf.keras.Model(inputs=input_data, outputs=output) +converter = tf.lite.TFLiteConverter.from_keras_model(model) +def representative_dataset_gen(): + for _ in range(100): + yield [np.random.uniform(low=-1., high=1., size=(1,) + input_shape).astype(np.float32)] +converter.representative_dataset = representative_dataset_gen +converter.optimizations = [tf.lite.Optimize.DEFAULT] +converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] +converter.inference_input_type = tf.int8 +converter.inference_output_type = tf.int8 +tflite_model = converter.convert() +model_name = f'test_broadcast_4.tflite' +with open(model_name, 'wb') as f: + f.write(tflite_model) diff --git a/integration_tests/models/8x8/test_broadcast/params.yaml b/integration_tests/models/8x8/test_broadcast/params.yaml new file mode 100644 index 000000000..b684ee66c --- /dev/null +++ b/integration_tests/models/8x8/test_broadcast/params.yaml @@ -0,0 +1 @@ +MAX_ABS_ERROR: 0.0 diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_0.mlir b/integration_tests/models/8x8/test_broadcast/test_broadcast_0.mlir new file mode 100644 index 000000000..674a8bd7e --- /dev/null +++ b/integration_tests/models/8x8/test_broadcast/test_broadcast_0.mlir @@ -0,0 +1,6 @@ +func.func @main(%arg0: tensor<1x5x1x16x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x5x8x16x!quant.uniform> {tf_saved_model.index_path = ["tf.broadcast_to_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[1, 5, 8, 16]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.broadcast_to"(%arg0, %0) : (tensor<1x5x1x16x!quant.uniform>, tensor<4xi32>) -> tensor<1x5x8x16x!quant.uniform> + return %1 : tensor<1x5x8x16x!quant.uniform> +} + diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_0.tflite b/integration_tests/models/8x8/test_broadcast/test_broadcast_0.tflite new file mode 100644 index 000000000..aa14d2f5a Binary files /dev/null and b/integration_tests/models/8x8/test_broadcast/test_broadcast_0.tflite differ diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_1.mlir b/integration_tests/models/8x8/test_broadcast/test_broadcast_1.mlir new file mode 100644 index 000000000..360c2da24 --- /dev/null +++ b/integration_tests/models/8x8/test_broadcast/test_broadcast_1.mlir @@ -0,0 +1,6 @@ +func.func @main(%arg0: tensor<1x5x8x1x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x5x8x16x!quant.uniform> {tf_saved_model.index_path = ["tf.broadcast_to_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[1, 5, 8, 16]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.broadcast_to"(%arg0, %0) : (tensor<1x5x8x1x!quant.uniform>, tensor<4xi32>) -> tensor<1x5x8x16x!quant.uniform> + return %1 : tensor<1x5x8x16x!quant.uniform> +} + diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_1.tflite b/integration_tests/models/8x8/test_broadcast/test_broadcast_1.tflite new file mode 100644 index 000000000..2044dd97f Binary files /dev/null and b/integration_tests/models/8x8/test_broadcast/test_broadcast_1.tflite differ diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_2.mlir b/integration_tests/models/8x8/test_broadcast/test_broadcast_2.mlir new file mode 100644 index 000000000..f61de83ac --- /dev/null +++ b/integration_tests/models/8x8/test_broadcast/test_broadcast_2.mlir @@ -0,0 +1,6 @@ +func.func @main(%arg0: tensor<1x5x8x1x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x5x8x23x!quant.uniform> {tf_saved_model.index_path = ["tf.broadcast_to_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[1, 5, 8, 23]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.broadcast_to"(%arg0, %0) : (tensor<1x5x8x1x!quant.uniform>, tensor<4xi32>) -> tensor<1x5x8x23x!quant.uniform> + return %1 : tensor<1x5x8x23x!quant.uniform> +} + diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_2.tflite b/integration_tests/models/8x8/test_broadcast/test_broadcast_2.tflite new file mode 100644 index 000000000..888ee5a72 Binary files /dev/null and b/integration_tests/models/8x8/test_broadcast/test_broadcast_2.tflite differ diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_3.mlir b/integration_tests/models/8x8/test_broadcast/test_broadcast_3.mlir new file mode 100644 index 000000000..106578a74 --- /dev/null +++ b/integration_tests/models/8x8/test_broadcast/test_broadcast_3.mlir @@ -0,0 +1,6 @@ +func.func @main(%arg0: tensor<1x5x1x1x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x5x8x23x!quant.uniform> {tf_saved_model.index_path = ["tf.broadcast_to_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[1, 5, 8, 23]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.broadcast_to"(%arg0, %0) : (tensor<1x5x1x1x!quant.uniform>, tensor<4xi32>) -> tensor<1x5x8x23x!quant.uniform> + return %1 : tensor<1x5x8x23x!quant.uniform> +} + diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_3.tflite b/integration_tests/models/8x8/test_broadcast/test_broadcast_3.tflite new file mode 100644 index 000000000..20259f86e Binary files /dev/null and b/integration_tests/models/8x8/test_broadcast/test_broadcast_3.tflite differ diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_4.mlir b/integration_tests/models/8x8/test_broadcast/test_broadcast_4.mlir new file mode 100644 index 000000000..d474b81ac --- /dev/null +++ b/integration_tests/models/8x8/test_broadcast/test_broadcast_4.mlir @@ -0,0 +1,6 @@ +func.func @main(%arg0: tensor<8x23x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x5x8x23x!quant.uniform> {tf_saved_model.index_path = ["tf.broadcast_to_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[1, 5, 8, 23]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.broadcast_to"(%arg0, %0) : (tensor<8x23x!quant.uniform>, tensor<4xi32>) -> tensor<1x5x8x23x!quant.uniform> + return %1 : tensor<1x5x8x23x!quant.uniform> +} + diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_4.tflite b/integration_tests/models/8x8/test_broadcast/test_broadcast_4.tflite new file mode 100644 index 000000000..ebcca3233 Binary files /dev/null and b/integration_tests/models/8x8/test_broadcast/test_broadcast_4.tflite differ diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_5.mlir b/integration_tests/models/8x8/test_broadcast/test_broadcast_5.mlir new file mode 100644 index 000000000..8ac5847a3 --- /dev/null +++ b/integration_tests/models/8x8/test_broadcast/test_broadcast_5.mlir @@ -0,0 +1,5 @@ +func.func @main(%arg0: tensor>) -> tensor<1x1x13x64x!quant.uniform> attributes {tf.entry_function = {inputs = "arg0", outputs = "0"}} { + %cst = arith.constant dense<[1, 1, 13, 64]> : tensor<4xi32> + %0 = "tfl.broadcast_to"(%arg0, %cst) : (tensor>, tensor<4xi32>) -> tensor<1x1x13x64x!quant.uniform> + return %0 : tensor<1x1x13x64x!quant.uniform> +} diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_5.tflite b/integration_tests/models/8x8/test_broadcast/test_broadcast_5.tflite new file mode 100644 index 000000000..f09fd29ac Binary files /dev/null and b/integration_tests/models/8x8/test_broadcast/test_broadcast_5.tflite differ diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_6.mlir b/integration_tests/models/8x8/test_broadcast/test_broadcast_6.mlir new file mode 100644 index 000000000..9a6895723 --- /dev/null +++ b/integration_tests/models/8x8/test_broadcast/test_broadcast_6.mlir @@ -0,0 +1,5 @@ +func.func @main(%arg0: tensor<1x127x1x1x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x127x127x1x!quant.uniform> {tf_saved_model.index_path = ["tf.broadcast_to_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[1, 127, 127, 1]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.broadcast_to"(%arg0, %0) : (tensor<1x127x1x1x!quant.uniform>, tensor<4xi32>) -> tensor<1x127x127x1x!quant.uniform> + return %1 : tensor<1x127x127x1x!quant.uniform> +} diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_6.tflite b/integration_tests/models/8x8/test_broadcast/test_broadcast_6.tflite new file mode 100644 index 000000000..9e4f538a4 Binary files /dev/null and b/integration_tests/models/8x8/test_broadcast/test_broadcast_6.tflite differ diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_7.mlir b/integration_tests/models/8x8/test_broadcast/test_broadcast_7.mlir new file mode 100644 index 000000000..cbc30d5fd --- /dev/null +++ b/integration_tests/models/8x8/test_broadcast/test_broadcast_7.mlir @@ -0,0 +1,5 @@ +func.func @main(%arg0: tensor<1x127x1x2x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x127x127x2x!quant.uniform> {tf_saved_model.index_path = ["tf.broadcast_to_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[1, 127, 127, 2]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.broadcast_to"(%arg0, %0) : (tensor<1x127x1x2x!quant.uniform>, tensor<4xi32>) -> tensor<1x127x127x2x!quant.uniform> + return %1 : tensor<1x127x127x2x!quant.uniform> +} diff --git a/integration_tests/models/8x8/test_broadcast/test_broadcast_7.tflite b/integration_tests/models/8x8/test_broadcast/test_broadcast_7.tflite new file mode 100644 index 000000000..e5e87e786 Binary files /dev/null and b/integration_tests/models/8x8/test_broadcast/test_broadcast_7.tflite differ diff --git a/integration_tests/models/8x8/test_concatenate/generate.py b/integration_tests/models/8x8/test_concatenate/generate.py new file mode 100644 index 000000000..8396a68fb --- /dev/null +++ b/integration_tests/models/8x8/test_concatenate/generate.py @@ -0,0 +1,58 @@ +import numpy as np +import tensorflow as tf +from tensorflow import lite as tfl + +i = 0 + + +def generate_concatenate_model(input_shapes, axis): + dtype = tf.int8 + input_data = [ + tf.keras.Input(shape=input_shape, dtype=dtype, batch_size=1) + for input_shape in input_shapes + ] + concatenated_output = tf.concat(input_data, axis=axis) + model = tf.keras.Model(inputs=input_data, outputs=concatenated_output) + converter = tfl.TFLiteConverter.from_keras_model(model) + if dtype == tf.int8 or dtype == tf.int16: + + def representative_dataset_gen(): + for _ in range(100): + yield [ + np.random.uniform(low=-127, high=127, size=shp).astype( + dtype.as_numpy_dtype + ) + for shp in input_shapes + ] + + converter.optimizations = [tf.lite.Optimize.DEFAULT] + converter.representative_dataset = representative_dataset_gen + if dtype == tf.int8: + converter.target_spec.supported_ops = [tfl.OpsSet.TFLITE_BUILTINS_INT8] + else: + converter.target_spec.supported_ops = [ + tfl.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8 + ] + converter.inference_input_type = dtype + converter.inference_output_type = dtype + tflite_model = converter.convert() + global i + model_name = f"test_concatenate_{i}.tflite" + i += 1 + with open(model_name, "wb") as f: + f.write(tflite_model) + print(f"Model saved: {model_name}") + + +generate_concatenate_model([(64), (64)], 0) # 0 +generate_concatenate_model([(2, 3), (2, 3)], 1) # 1 +generate_concatenate_model([(2, 3, 5), (2, 3, 5)], -1) # 2 +generate_concatenate_model([(2, 3, 5), (2, 3, 7)], -1) # 3 +generate_concatenate_model([(2, 6, 5, 2), (2, 6, 5, 2)], 1) # 4 +generate_concatenate_model([(2, 6, 5, 2), (2, 2, 5, 2)], -3) # 5 +generate_concatenate_model([(2, 6, 5, 2), (2, 6, 5, 2)], 3) # 6 +generate_concatenate_model([(2, 6, 5, 2)] * 8, 3) # 6 +generate_concatenate_model([(2, 6, 5, 2)] * 9, 3) # 6 +generate_concatenate_model([(2, 6, 5, 2)] * 16, 3) # 6 +generate_concatenate_model([(2, 6, 5, 2)] * 33, 3) # 6 +generate_concatenate_model([(2, 6, 5, 1)] * 40, 3) # 6 diff --git a/integration_tests/models/8x8/test_concatenate/params.yaml b/integration_tests/models/8x8/test_concatenate/params.yaml new file mode 100644 index 000000000..b684ee66c --- /dev/null +++ b/integration_tests/models/8x8/test_concatenate/params.yaml @@ -0,0 +1 @@ +MAX_ABS_ERROR: 0.0 diff --git a/integration_tests/models/8x8/test_concatenate/test_concatenate_0.tflite b/integration_tests/models/8x8/test_concatenate/test_concatenate_0.tflite new file mode 100644 index 000000000..5f545e876 Binary files /dev/null and b/integration_tests/models/8x8/test_concatenate/test_concatenate_0.tflite differ diff --git a/integration_tests/models/8x8/test_concatenate/test_concatenate_1.tflite b/integration_tests/models/8x8/test_concatenate/test_concatenate_1.tflite new file mode 100644 index 000000000..71a5929bf Binary files /dev/null and b/integration_tests/models/8x8/test_concatenate/test_concatenate_1.tflite differ diff --git a/integration_tests/models/8x8/test_concatenate/test_concatenate_10.tflite b/integration_tests/models/8x8/test_concatenate/test_concatenate_10.tflite new file mode 100644 index 000000000..6e7d403f5 Binary files /dev/null and b/integration_tests/models/8x8/test_concatenate/test_concatenate_10.tflite differ diff --git a/integration_tests/models/8x8/test_concatenate/test_concatenate_11.tflite b/integration_tests/models/8x8/test_concatenate/test_concatenate_11.tflite new file mode 100644 index 000000000..5afbbd78c Binary files /dev/null and b/integration_tests/models/8x8/test_concatenate/test_concatenate_11.tflite differ diff --git a/integration_tests/models/8x8/test_concatenate/test_concatenate_2.tflite b/integration_tests/models/8x8/test_concatenate/test_concatenate_2.tflite new file mode 100644 index 000000000..f61f11a77 Binary files /dev/null and b/integration_tests/models/8x8/test_concatenate/test_concatenate_2.tflite differ diff --git a/integration_tests/models/8x8/test_concatenate/test_concatenate_3.tflite b/integration_tests/models/8x8/test_concatenate/test_concatenate_3.tflite new file mode 100644 index 000000000..baf95c7c4 Binary files /dev/null and b/integration_tests/models/8x8/test_concatenate/test_concatenate_3.tflite differ diff --git a/integration_tests/models/8x8/test_concatenate/test_concatenate_4.tflite b/integration_tests/models/8x8/test_concatenate/test_concatenate_4.tflite new file mode 100644 index 000000000..5c9edd60a Binary files /dev/null and b/integration_tests/models/8x8/test_concatenate/test_concatenate_4.tflite differ diff --git a/integration_tests/models/8x8/test_concatenate/test_concatenate_5.tflite b/integration_tests/models/8x8/test_concatenate/test_concatenate_5.tflite new file mode 100644 index 000000000..fb02a6012 Binary files /dev/null and b/integration_tests/models/8x8/test_concatenate/test_concatenate_5.tflite differ diff --git a/integration_tests/models/8x8/test_concatenate/test_concatenate_6.tflite b/integration_tests/models/8x8/test_concatenate/test_concatenate_6.tflite new file mode 100644 index 000000000..2bc33500b Binary files /dev/null and b/integration_tests/models/8x8/test_concatenate/test_concatenate_6.tflite differ diff --git a/integration_tests/models/8x8/test_concatenate/test_concatenate_7.tflite b/integration_tests/models/8x8/test_concatenate/test_concatenate_7.tflite new file mode 100644 index 000000000..0b468f6cd Binary files /dev/null and b/integration_tests/models/8x8/test_concatenate/test_concatenate_7.tflite differ diff --git a/integration_tests/models/8x8/test_concatenate/test_concatenate_8.tflite b/integration_tests/models/8x8/test_concatenate/test_concatenate_8.tflite new file mode 100644 index 000000000..b8cea6d20 Binary files /dev/null and b/integration_tests/models/8x8/test_concatenate/test_concatenate_8.tflite differ diff --git a/integration_tests/models/8x8/test_concatenate/test_concatenate_9.tflite b/integration_tests/models/8x8/test_concatenate/test_concatenate_9.tflite new file mode 100644 index 000000000..ac0492203 Binary files /dev/null and b/integration_tests/models/8x8/test_concatenate/test_concatenate_9.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_0.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_0.tflite new file mode 100644 index 000000000..2f7bd7a5d Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_0.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_1.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_1.tflite new file mode 100644 index 000000000..8f2f80190 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_1.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_10.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_10.tflite new file mode 100644 index 000000000..3adf98164 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_10.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_11.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_11.tflite new file mode 100644 index 000000000..3181e2c17 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_11.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_12.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_12.tflite new file mode 100644 index 000000000..478c073ad Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_12.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_13.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_13.tflite new file mode 100644 index 000000000..e491f3348 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_13.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_14.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_14.tflite new file mode 100644 index 000000000..938828fd0 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_14.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_15.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_15.tflite new file mode 100644 index 000000000..24d9340db Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_15.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_16.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_16.tflite new file mode 100644 index 000000000..ded2b1fb0 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_16.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_17.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_17.tflite new file mode 100644 index 000000000..be6377f36 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_17.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_18.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_18.tflite new file mode 100644 index 000000000..06ffede79 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_18.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_19.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_19.tflite new file mode 100644 index 000000000..abcd4b53f Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_19.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_2.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_2.tflite new file mode 100644 index 000000000..d5ae95410 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_2.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_20.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_20.tflite new file mode 100644 index 000000000..267bf1221 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_20.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_21.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_21.tflite new file mode 100644 index 000000000..023f991f8 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_21.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_22.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_22.tflite new file mode 100644 index 000000000..084c691b7 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_22.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_23.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_23.tflite new file mode 100644 index 000000000..a93bc5499 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_23.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_24.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_24.tflite new file mode 100644 index 000000000..b5b002fb3 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_24.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_25.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_25.tflite new file mode 100644 index 000000000..8a134857a Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_25.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_26.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_26.tflite new file mode 100644 index 000000000..049859ce3 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_26.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_27.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_27.tflite new file mode 100644 index 000000000..b5ccf2ce8 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_27.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_28.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_28.tflite new file mode 100644 index 000000000..56760e4cb Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_28.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_29.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_29.tflite new file mode 100644 index 000000000..38da2dc3d Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_29.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_3.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_3.tflite new file mode 100644 index 000000000..0c58ac754 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_3.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_30.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_30.tflite new file mode 100644 index 000000000..0f4adff19 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_30.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_31.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_31.tflite new file mode 100644 index 000000000..bf4c63876 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_31.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_32.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_32.tflite new file mode 100644 index 000000000..9e0061867 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_32.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_33.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_33.tflite new file mode 100644 index 000000000..4cac733de Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_33.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_34.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_34.tflite new file mode 100644 index 000000000..3bee0e5ff Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_34.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_35.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_35.tflite new file mode 100644 index 000000000..3013ded8e Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_35.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_36.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_36.tflite new file mode 100644 index 000000000..f57c4a0a1 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_36.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_37.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_37.tflite new file mode 100644 index 000000000..19c39cc13 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_37.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_38.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_38.tflite new file mode 100644 index 000000000..44ccc2c0b Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_38.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_39.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_39.tflite new file mode 100644 index 000000000..fc6041fba Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_39.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_4.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_4.tflite new file mode 100644 index 000000000..6ff8eca0d Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_4.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_40.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_40.tflite new file mode 100644 index 000000000..b033a7534 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_40.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_5.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_5.tflite new file mode 100644 index 000000000..7732cd416 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_5.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_6.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_6.tflite new file mode 100644 index 000000000..51873ea75 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_6.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_7.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_7.tflite new file mode 100644 index 000000000..2056a2083 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_7.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_8.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_8.tflite new file mode 100644 index 000000000..db3514697 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_8.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_9.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_9.tflite new file mode 100644 index 000000000..7272dce16 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_9.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d/test_conv2d_dual_output.tflite b/integration_tests/models/8x8/test_conv2d/test_conv2d_dual_output.tflite new file mode 100644 index 000000000..a5b495772 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d/test_conv2d_dual_output.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_0.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_0.tflite new file mode 100644 index 000000000..4db29a380 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_0.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_1.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_1.tflite new file mode 100644 index 000000000..62e57544d Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_1.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_10.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_10.tflite new file mode 100644 index 000000000..a8b15b3cf Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_10.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_11.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_11.tflite new file mode 100644 index 000000000..107ef0009 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_11.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_12.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_12.tflite new file mode 100644 index 000000000..e25aa22d9 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_12.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_13.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_13.tflite new file mode 100644 index 000000000..a83d2e9ed Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_13.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_14.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_14.tflite new file mode 100644 index 000000000..5ba57c83b Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_14.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_15.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_15.tflite new file mode 100644 index 000000000..29371f8f3 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_15.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_16.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_16.tflite new file mode 100644 index 000000000..a1537b5d0 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_16.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_17.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_17.tflite new file mode 100644 index 000000000..e0f84dd1a Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_17.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_18.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_18.tflite new file mode 100644 index 000000000..061c8389c Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_18.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_19.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_19.tflite new file mode 100644 index 000000000..56ee30223 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_19.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_2.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_2.tflite new file mode 100644 index 000000000..28fae70e8 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_2.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_20.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_20.tflite new file mode 100644 index 000000000..7e9b963df Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_20.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_21.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_21.tflite new file mode 100644 index 000000000..535ac7328 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_21.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_22.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_22.tflite new file mode 100644 index 000000000..c29e99ce5 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_22.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_23.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_23.tflite new file mode 100644 index 000000000..83be0c3ca Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_23.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_24.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_24.tflite new file mode 100644 index 000000000..e824d0276 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_24.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_25.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_25.tflite new file mode 100644 index 000000000..59beb4e72 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_25.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_26.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_26.tflite new file mode 100644 index 000000000..53ea34296 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_26.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_27.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_27.tflite new file mode 100644 index 000000000..b4ed4d949 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_27.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_28.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_28.tflite new file mode 100644 index 000000000..c540ad47b Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_28.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_29.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_29.tflite new file mode 100644 index 000000000..e2cf1366b Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_29.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_3.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_3.tflite new file mode 100644 index 000000000..2b49e04c8 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_3.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_30.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_30.tflite new file mode 100644 index 000000000..1339f1bec Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_30.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_31.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_31.tflite new file mode 100644 index 000000000..3152a4a7f Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_31.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_32.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_32.tflite new file mode 100644 index 000000000..378f3b4f4 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_32.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_33.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_33.tflite new file mode 100644 index 000000000..a9aec0937 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_33.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_34.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_34.tflite new file mode 100644 index 000000000..b72f0bb2f Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_34.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_35.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_35.tflite new file mode 100644 index 000000000..449eacb7d Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_35.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_36.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_36.tflite new file mode 100644 index 000000000..2317982c8 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_36.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_37.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_37.tflite new file mode 100644 index 000000000..9c97a91fd Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_37.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_38.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_38.tflite new file mode 100644 index 000000000..bb27ef356 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_38.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_39.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_39.tflite new file mode 100644 index 000000000..fc1c7f057 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_39.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_4.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_4.tflite new file mode 100644 index 000000000..80c49d326 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_4.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_5.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_5.tflite new file mode 100644 index 000000000..6ced2790a Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_5.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_6.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_6.tflite new file mode 100644 index 000000000..1776036dc Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_6.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_7.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_7.tflite new file mode 100644 index 000000000..4f3df2978 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_7.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_8.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_8.tflite new file mode 100644 index 000000000..f4e39b485 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_8.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_9.tflite b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_9.tflite new file mode 100644 index 000000000..674f025c9 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_1x1/test_conv2d_1x1_9.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_0.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_0.tflite new file mode 100644 index 000000000..b79a0909c Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_0.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_1.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_1.tflite new file mode 100644 index 000000000..78e7b1ff0 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_1.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_10.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_10.tflite new file mode 100644 index 000000000..7345f726d Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_10.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_11.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_11.tflite new file mode 100644 index 000000000..27df6c9ba Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_11.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_12.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_12.tflite new file mode 100644 index 000000000..7a0321e7b Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_12.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_13.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_13.tflite new file mode 100644 index 000000000..9ce2f1fd7 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_13.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_14.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_14.tflite new file mode 100644 index 000000000..84befddca Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_14.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_15.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_15.tflite new file mode 100644 index 000000000..a119f85c7 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_15.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_16.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_16.tflite new file mode 100644 index 000000000..0ee1ea1b3 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_16.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_17.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_17.tflite new file mode 100644 index 000000000..2ae2cee37 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_17.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_18.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_18.tflite new file mode 100644 index 000000000..5240480c8 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_18.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_19.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_19.tflite new file mode 100644 index 000000000..fa9b169a1 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_19.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_2.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_2.tflite new file mode 100644 index 000000000..192391de5 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_2.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_20.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_20.tflite new file mode 100644 index 000000000..89abe023c Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_20.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_21.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_21.tflite new file mode 100644 index 000000000..236093e98 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_21.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_22.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_22.tflite new file mode 100644 index 000000000..c1c5c052a Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_22.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_23.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_23.tflite new file mode 100644 index 000000000..d17e0a2ef Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_23.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_24.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_24.tflite new file mode 100644 index 000000000..c596b9a30 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_24.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_25.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_25.tflite new file mode 100644 index 000000000..1db8dc640 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_25.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_26.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_26.tflite new file mode 100644 index 000000000..db2246206 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_26.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_27.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_27.tflite new file mode 100644 index 000000000..23d1c6a6b Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_27.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_28.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_28.tflite new file mode 100644 index 000000000..ea1f3331b Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_28.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_29.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_29.tflite new file mode 100644 index 000000000..1ce3e64d7 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_29.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_3.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_3.tflite new file mode 100644 index 000000000..63c0bfe2b Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_3.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_30.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_30.tflite new file mode 100644 index 000000000..4f1d0da60 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_30.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_31.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_31.tflite new file mode 100644 index 000000000..b7c3d0f39 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_31.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_32.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_32.tflite new file mode 100644 index 000000000..7a2d604c2 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_32.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_33.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_33.tflite new file mode 100644 index 000000000..613901a0b Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_33.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_34.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_34.tflite new file mode 100644 index 000000000..ffb7a89c4 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_34.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_35.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_35.tflite new file mode 100644 index 000000000..f06af483a Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_35.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_36.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_36.tflite new file mode 100644 index 000000000..93d40fa2a Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_36.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_37.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_37.tflite new file mode 100644 index 000000000..2bff8d679 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_37.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_38.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_38.tflite new file mode 100644 index 000000000..0e23590fc Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_38.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_39.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_39.tflite new file mode 100644 index 000000000..2e0c0c7b5 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_39.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_4.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_4.tflite new file mode 100644 index 000000000..a079a3200 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_4.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_5.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_5.tflite new file mode 100644 index 000000000..a12b757b7 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_5.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_6.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_6.tflite new file mode 100644 index 000000000..f9a83f21a Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_6.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_7.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_7.tflite new file mode 100644 index 000000000..bdd308eb6 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_7.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_8.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_8.tflite new file mode 100644 index 000000000..4c6437d63 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_8.tflite differ diff --git a/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_9.tflite b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_9.tflite new file mode 100644 index 000000000..04b09ad18 Binary files /dev/null and b/integration_tests/models/8x8/test_conv2d_shallowin/test_conv2d_shallowin_9.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_0.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_0.tflite new file mode 100644 index 000000000..6c3e8c0b4 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_0.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_1.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_1.tflite new file mode 100644 index 000000000..866f18eb1 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_1.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_10.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_10.tflite new file mode 100644 index 000000000..b4736c683 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_10.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_11.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_11.tflite new file mode 100644 index 000000000..89cebbca1 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_11.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_12.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_12.tflite new file mode 100644 index 000000000..0f141c0f7 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_12.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_13.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_13.tflite new file mode 100644 index 000000000..d57e82fc3 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_13.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_14.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_14.tflite new file mode 100644 index 000000000..25cb2aaa8 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_14.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_15.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_15.tflite new file mode 100644 index 000000000..4ffa71ca0 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_15.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_16.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_16.tflite new file mode 100644 index 000000000..404a222ad Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_16.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_17.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_17.tflite new file mode 100644 index 000000000..0350067b6 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_17.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_18.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_18.tflite new file mode 100644 index 000000000..4d6300333 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_18.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_19.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_19.tflite new file mode 100644 index 000000000..4b368b87f Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_19.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_2.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_2.tflite new file mode 100644 index 000000000..199501777 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_2.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_3.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_3.tflite new file mode 100644 index 000000000..551ed4756 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_3.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_4.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_4.tflite new file mode 100644 index 000000000..af4ff5e8e Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_4.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_5.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_5.tflite new file mode 100644 index 000000000..df7314e94 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_5.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_6.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_6.tflite new file mode 100644 index 000000000..c70c07d0d Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_6.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_7.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_7.tflite new file mode 100644 index 000000000..9b97f6aa5 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_7.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_8.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_8.tflite new file mode 100644 index 000000000..491c40741 Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_8.tflite differ diff --git a/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_9.tflite b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_9.tflite new file mode 100644 index 000000000..9aa9b6d1b Binary files /dev/null and b/integration_tests/models/8x8/test_custom_relu_conv2d/test_custom_relu_conv2d_9.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_0.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_0.tflite new file mode 100644 index 000000000..ec6c1b08b Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_0.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_1.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_1.tflite new file mode 100644 index 000000000..72a7d40db Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_1.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_10.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_10.tflite new file mode 100644 index 000000000..40d64046b Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_10.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_11.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_11.tflite new file mode 100644 index 000000000..20b72091d Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_11.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_12.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_12.tflite new file mode 100644 index 000000000..730ccd10b Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_12.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_13.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_13.tflite new file mode 100644 index 000000000..90eba9984 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_13.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_14.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_14.tflite new file mode 100644 index 000000000..39a6d8a88 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_14.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_15.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_15.tflite new file mode 100644 index 000000000..4163d4837 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_15.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_16.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_16.tflite new file mode 100644 index 000000000..140c6060a Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_16.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_17.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_17.tflite new file mode 100644 index 000000000..65d59fc6b Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_17.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_18.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_18.tflite new file mode 100644 index 000000000..f197bc059 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_18.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_19.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_19.tflite new file mode 100644 index 000000000..bc6a3a686 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_19.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_2.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_2.tflite new file mode 100644 index 000000000..7ae0e7fdc Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_2.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_20.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_20.tflite new file mode 100644 index 000000000..293675565 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_20.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_21.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_21.tflite new file mode 100644 index 000000000..e89963efd Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_21.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_22.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_22.tflite new file mode 100644 index 000000000..7e96a827c Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_22.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_23.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_23.tflite new file mode 100644 index 000000000..809c98d85 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_23.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_24.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_24.tflite new file mode 100644 index 000000000..9bc44df67 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_24.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_25.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_25.tflite new file mode 100644 index 000000000..906f83f82 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_25.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_26.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_26.tflite new file mode 100644 index 000000000..eb2e5b503 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_26.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_27.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_27.tflite new file mode 100644 index 000000000..c8febdfc2 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_27.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_28.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_28.tflite new file mode 100644 index 000000000..e3f8c5693 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_28.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_29.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_29.tflite new file mode 100644 index 000000000..d3892501b Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_29.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_3.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_3.tflite new file mode 100644 index 000000000..dca2e2844 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_3.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_30.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_30.tflite new file mode 100644 index 000000000..1c9de4486 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_30.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_31.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_31.tflite new file mode 100644 index 000000000..500e73398 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_31.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_32.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_32.tflite new file mode 100644 index 000000000..1c348d198 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_32.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_33.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_33.tflite new file mode 100644 index 000000000..a455f3f9f Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_33.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_34.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_34.tflite new file mode 100644 index 000000000..eac995151 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_34.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_35.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_35.tflite new file mode 100644 index 000000000..55dc7a839 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_35.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_36.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_36.tflite new file mode 100644 index 000000000..bb7a3c7ff Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_36.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_37.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_37.tflite new file mode 100644 index 000000000..3bbf59be9 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_37.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_38.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_38.tflite new file mode 100644 index 000000000..4dae58cac Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_38.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_39.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_39.tflite new file mode 100644 index 000000000..c14f76518 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_39.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_4.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_4.tflite new file mode 100644 index 000000000..83ffbab8d Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_4.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_5.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_5.tflite new file mode 100644 index 000000000..8db188722 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_5.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_6.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_6.tflite new file mode 100644 index 000000000..1e633e59f Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_6.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_7.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_7.tflite new file mode 100644 index 000000000..1e6409ff7 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_7.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_8.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_8.tflite new file mode 100644 index 000000000..52dee646c Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_8.tflite differ diff --git a/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_9.tflite b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_9.tflite new file mode 100644 index 000000000..0782fbc83 Binary files /dev/null and b/integration_tests/models/8x8/test_depthwise_conv2d/test_depthwise_conv2d_9.tflite differ diff --git a/integration_tests/models/8x8/test_detection_postprocess/in1.npy b/integration_tests/models/8x8/test_detection_postprocess/in1.npy new file mode 100644 index 000000000..d9ab326d1 Binary files /dev/null and b/integration_tests/models/8x8/test_detection_postprocess/in1.npy differ diff --git a/integration_tests/models/8x8/test_detection_postprocess/in2.npy b/integration_tests/models/8x8/test_detection_postprocess/in2.npy new file mode 100644 index 000000000..7028be398 Binary files /dev/null and b/integration_tests/models/8x8/test_detection_postprocess/in2.npy differ diff --git a/integration_tests/models/8x8/test_detection_postprocess/special.tflite.xc b/integration_tests/models/8x8/test_detection_postprocess/special.tflite.xc new file mode 100644 index 000000000..15ca6e272 Binary files /dev/null and b/integration_tests/models/8x8/test_detection_postprocess/special.tflite.xc differ diff --git a/integration_tests/models/8x8/test_detection_postprocess/test_dtp_tfl.tflite b/integration_tests/models/8x8/test_detection_postprocess/test_dtp_tfl.tflite new file mode 100644 index 000000000..100caf5c1 Binary files /dev/null and b/integration_tests/models/8x8/test_detection_postprocess/test_dtp_tfl.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_0.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_0.tflite new file mode 100644 index 000000000..e9e095073 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_0.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_1.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_1.tflite new file mode 100644 index 000000000..43dfeed8a Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_1.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_10.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_10.tflite new file mode 100644 index 000000000..9121557b5 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_10.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_11.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_11.tflite new file mode 100644 index 000000000..04a7fd350 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_11.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_12.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_12.tflite new file mode 100644 index 000000000..bdc971c8f Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_12.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_13.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_13.tflite new file mode 100644 index 000000000..495af2974 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_13.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_14.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_14.tflite new file mode 100644 index 000000000..a35593123 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_14.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_15.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_15.tflite new file mode 100644 index 000000000..e6cc920f9 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_15.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_16.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_16.tflite new file mode 100644 index 000000000..62ed1a8ce Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_16.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_17.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_17.tflite new file mode 100644 index 000000000..6f7d1c7fb Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_17.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_18.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_18.tflite new file mode 100644 index 000000000..a4da968c1 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_18.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_19.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_19.tflite new file mode 100644 index 000000000..d83030f1b Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_19.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_2.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_2.tflite new file mode 100644 index 000000000..c659881ba Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_2.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_20.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_20.tflite new file mode 100644 index 000000000..84e200854 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_20.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_21.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_21.tflite new file mode 100644 index 000000000..205928c0f Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_21.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_22.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_22.tflite new file mode 100644 index 000000000..5ea22b179 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_22.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_23.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_23.tflite new file mode 100644 index 000000000..bb14db6c0 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_23.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_24.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_24.tflite new file mode 100644 index 000000000..765d5b1bd Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_24.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_26.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_26.tflite new file mode 100644 index 000000000..6be0c2dcc Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_26.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_27.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_27.tflite new file mode 100644 index 000000000..82079e08a Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_27.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_28.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_28.tflite new file mode 100644 index 000000000..90f4478a7 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_28.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_29.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_29.tflite new file mode 100644 index 000000000..f6ccbf4fc Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_29.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_3.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_3.tflite new file mode 100644 index 000000000..3fdf028c4 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_3.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_30.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_30.tflite new file mode 100644 index 000000000..18d51456b Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_30.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_31.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_31.tflite new file mode 100644 index 000000000..207197771 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_31.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_32.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_32.tflite new file mode 100644 index 000000000..d63e55988 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_32.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_33.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_33.tflite new file mode 100644 index 000000000..ca31969bb Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_33.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_34.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_34.tflite new file mode 100644 index 000000000..a6b24801b Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_34.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_35.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_35.tflite new file mode 100644 index 000000000..237327b3e Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_35.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_36.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_36.tflite new file mode 100644 index 000000000..aaf04720a Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_36.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_37.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_37.tflite new file mode 100644 index 000000000..e105b959b Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_37.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_38.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_38.tflite new file mode 100644 index 000000000..e3384d579 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_38.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_39.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_39.tflite new file mode 100644 index 000000000..a45d7e9a8 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_39.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_4.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_4.tflite new file mode 100644 index 000000000..322a451fc Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_4.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_5.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_5.tflite new file mode 100644 index 000000000..ded46fb93 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_5.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_6.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_6.tflite new file mode 100644 index 000000000..a0f09dcb2 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_6.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_7.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_7.tflite new file mode 100644 index 000000000..08f45f122 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_7.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_8.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_8.tflite new file mode 100644 index 000000000..a1940fcb0 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_8.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_9.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_9.tflite new file mode 100644 index 000000000..643a866fd Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_9.tflite differ diff --git a/integration_tests/models/8x8/test_fully_connected/test_fully_connected_three_inputs.tflite b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_three_inputs.tflite new file mode 100644 index 000000000..10037b9a0 Binary files /dev/null and b/integration_tests/models/8x8/test_fully_connected/test_fully_connected_three_inputs.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/params.yaml b/integration_tests/models/8x8/test_global_avgpool2d/params.yaml new file mode 100644 index 000000000..219fc195a --- /dev/null +++ b/integration_tests/models/8x8/test_global_avgpool2d/params.yaml @@ -0,0 +1,2 @@ +ABS_AVG_ERROR: 1.0 +AVG_ABS_ERROR: 1.0 \ No newline at end of file diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_0.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_0.tflite new file mode 100644 index 000000000..3907256ac Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_0.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_1.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_1.tflite new file mode 100644 index 000000000..8060dbb04 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_1.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_10.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_10.tflite new file mode 100644 index 000000000..c9ce3a20a Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_10.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_11.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_11.tflite new file mode 100644 index 000000000..6501116e3 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_11.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_12.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_12.tflite new file mode 100644 index 000000000..353cb9b9e Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_12.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_13.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_13.tflite new file mode 100644 index 000000000..68f7da745 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_13.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_14.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_14.tflite new file mode 100644 index 000000000..84831c057 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_14.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_15.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_15.tflite new file mode 100644 index 000000000..2e8f067e5 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_15.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_16.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_16.tflite new file mode 100644 index 000000000..fa17c6663 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_16.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_17.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_17.tflite new file mode 100644 index 000000000..8d33ba856 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_17.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_18.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_18.tflite new file mode 100644 index 000000000..1a83a0e2b Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_18.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_19.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_19.tflite new file mode 100644 index 000000000..5dcea2f96 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_19.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_2.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_2.tflite new file mode 100644 index 000000000..95227b2fa Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_2.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_20.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_20.tflite new file mode 100644 index 000000000..4b8036900 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_20.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_21.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_21.tflite new file mode 100644 index 000000000..bdc4a5694 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_21.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_22.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_22.tflite new file mode 100644 index 000000000..b9fa16ece Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_22.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_23.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_23.tflite new file mode 100644 index 000000000..cc43c579a Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_23.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_24.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_24.tflite new file mode 100644 index 000000000..070102e3e Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_24.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_25.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_25.tflite new file mode 100644 index 000000000..8d340b770 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_25.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_26.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_26.tflite new file mode 100644 index 000000000..852b7941b Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_26.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_27.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_27.tflite new file mode 100644 index 000000000..fd6658105 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_27.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_28.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_28.tflite new file mode 100644 index 000000000..4ce96c29a Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_28.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_29.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_29.tflite new file mode 100644 index 000000000..68f7da745 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_29.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_3.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_3.tflite new file mode 100644 index 000000000..e414514a9 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_3.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_30.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_30.tflite new file mode 100644 index 000000000..853bb8c86 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_30.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_31.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_31.tflite new file mode 100644 index 000000000..8060dbb04 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_31.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_32.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_32.tflite new file mode 100644 index 000000000..853bb8c86 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_32.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_33.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_33.tflite new file mode 100644 index 000000000..6fd6a4a0b Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_33.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_34.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_34.tflite new file mode 100644 index 000000000..29f55f7dc Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_34.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_35.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_35.tflite new file mode 100644 index 000000000..5dcea2f96 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_35.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_36.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_36.tflite new file mode 100644 index 000000000..c91830471 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_36.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_37.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_37.tflite new file mode 100644 index 000000000..a9de28063 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_37.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_38.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_38.tflite new file mode 100644 index 000000000..1135da0b9 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_38.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_39.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_39.tflite new file mode 100644 index 000000000..c769447ff Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_39.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_4.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_4.tflite new file mode 100644 index 000000000..bb47b550a Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_4.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_5.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_5.tflite new file mode 100644 index 000000000..e851f15ce Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_5.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_6.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_6.tflite new file mode 100644 index 000000000..e731a70f5 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_6.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_7.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_7.tflite new file mode 100644 index 000000000..f1166eb9c Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_7.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_8.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_8.tflite new file mode 100644 index 000000000..c8453026c Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_8.tflite differ diff --git a/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_9.tflite b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_9.tflite new file mode 100644 index 000000000..9174bade6 Binary files /dev/null and b/integration_tests/models/8x8/test_global_avgpool2d/test_global_avgpool2d_9.tflite differ diff --git a/integration_tests/models/8x8/test_leaky_relu/test_leaky_relu_0.tflite b/integration_tests/models/8x8/test_leaky_relu/test_leaky_relu_0.tflite new file mode 100644 index 000000000..ec4925494 Binary files /dev/null and b/integration_tests/models/8x8/test_leaky_relu/test_leaky_relu_0.tflite differ diff --git a/integration_tests/models/8x8/test_lstm/generate.py b/integration_tests/models/8x8/test_lstm/generate.py new file mode 100644 index 000000000..520308a27 --- /dev/null +++ b/integration_tests/models/8x8/test_lstm/generate.py @@ -0,0 +1,40 @@ +import tensorflow as tf +from tensorflow.keras.layers import LSTM, Input +from tensorflow.keras import Model +import numpy as np +import os + +def export_lstm_stateful_tflite(units, input_shape): + main_input = Input(shape=input_shape) + input_h = Input(shape=(units,)) + input_c = Input(shape=(units,)) + + # lstm_layer, state_h, state_c = LSTM(units, unroll=True, return_state=True)(main_input, initial_state=[input_h, input_c]) + lstm_layer = LSTM(units)(main_input) + # model = Model(inputs=[main_input, input_h, input_c], outputs=[lstm_layer, state_h, state_c]) + model = Model(inputs=[main_input], outputs=[lstm_layer]) + + converter = tf.lite.TFLiteConverter.from_keras_model(model) + converter.optimizations = [tf.lite.Optimize.DEFAULT] + + def representative_dataset_gen(): + for _ in range(100): + yield [np.random.rand(1, *input_shape).astype(np.float32), + np.random.rand(1, units).astype(np.float32), + np.random.rand(1, units).astype(np.float32)] + + converter.representative_dataset = representative_dataset_gen + converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8, tf.lite.OpsSet.SELECT_TF_OPS] + converter._experimental_lower_tensor_list_ops = False + converter.target_spec.supported_types = [tf.int8] + converter.inference_input_type = converter.inference_output_type = tf.int8 + + tflite_model = converter.convert() + model_file = 'test_lstm_4.tflite' + with open(model_file, 'wb') as f: + f.write(tflite_model) + + return os.path.getsize(model_file) / 1024 + +# Example call +example = export_lstm_stateful_tflite(9, (10, 16)) diff --git a/integration_tests/models/8x8/test_lstm/params.yaml b/integration_tests/models/8x8/test_lstm/params.yaml new file mode 100644 index 000000000..e64088d73 --- /dev/null +++ b/integration_tests/models/8x8/test_lstm/params.yaml @@ -0,0 +1 @@ +MAX_ABS_ERROR: 4.0 diff --git a/integration_tests/models/8x8/test_lstm/test_lstm_1.tflite b/integration_tests/models/8x8/test_lstm/test_lstm_1.tflite new file mode 100644 index 000000000..389230c50 Binary files /dev/null and b/integration_tests/models/8x8/test_lstm/test_lstm_1.tflite differ diff --git a/integration_tests/models/8x8/test_lstm/test_lstm_2.tflite b/integration_tests/models/8x8/test_lstm/test_lstm_2.tflite new file mode 100644 index 000000000..a5e83d0b3 Binary files /dev/null and b/integration_tests/models/8x8/test_lstm/test_lstm_2.tflite differ diff --git a/integration_tests/models/8x8/test_lstm/test_lstm_3.tflite b/integration_tests/models/8x8/test_lstm/test_lstm_3.tflite new file mode 100644 index 000000000..163eb069d Binary files /dev/null and b/integration_tests/models/8x8/test_lstm/test_lstm_3.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_0.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_0.tflite new file mode 100644 index 000000000..1c16144dd Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_0.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_1.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_1.tflite new file mode 100644 index 000000000..b6b1fb4e4 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_1.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_10.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_10.tflite new file mode 100644 index 000000000..219851481 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_10.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_11.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_11.tflite new file mode 100644 index 000000000..44f62658e Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_11.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_12.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_12.tflite new file mode 100644 index 000000000..693771ebc Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_12.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_13.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_13.tflite new file mode 100644 index 000000000..db250ca48 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_13.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_14.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_14.tflite new file mode 100644 index 000000000..aadcb879f Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_14.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_15.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_15.tflite new file mode 100644 index 000000000..6fcb158b6 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_15.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_16.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_16.tflite new file mode 100644 index 000000000..c82bc7561 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_16.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_17.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_17.tflite new file mode 100644 index 000000000..e61ba940b Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_17.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_18.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_18.tflite new file mode 100644 index 000000000..f72f348df Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_18.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_19.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_19.tflite new file mode 100644 index 000000000..120077b1b Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_19.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_2.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_2.tflite new file mode 100644 index 000000000..8ecd1ea18 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_2.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_20.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_20.tflite new file mode 100644 index 000000000..433c084ce Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_20.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_21.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_21.tflite new file mode 100644 index 000000000..bea3849c3 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_21.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_22.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_22.tflite new file mode 100644 index 000000000..0a267edff Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_22.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_23.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_23.tflite new file mode 100644 index 000000000..a48f51841 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_23.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_24.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_24.tflite new file mode 100644 index 000000000..a7ad26062 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_24.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_25.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_25.tflite new file mode 100644 index 000000000..11deabe43 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_25.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_26.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_26.tflite new file mode 100644 index 000000000..1bb2cd9eb Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_26.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_27.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_27.tflite new file mode 100644 index 000000000..8f0a3cd66 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_27.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_28.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_28.tflite new file mode 100644 index 000000000..da88aa32d Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_28.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_29.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_29.tflite new file mode 100644 index 000000000..9b57f6747 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_29.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_3.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_3.tflite new file mode 100644 index 000000000..9c35302b1 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_3.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_30.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_30.tflite new file mode 100644 index 000000000..30a3bd54d Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_30.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_31.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_31.tflite new file mode 100644 index 000000000..b8cdfa306 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_31.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_32.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_32.tflite new file mode 100644 index 000000000..083bed692 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_32.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_33.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_33.tflite new file mode 100644 index 000000000..b66891121 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_33.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_34.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_34.tflite new file mode 100644 index 000000000..ce5a4b26d Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_34.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_35.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_35.tflite new file mode 100644 index 000000000..7b89fc165 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_35.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_36.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_36.tflite new file mode 100644 index 000000000..207ff47bb Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_36.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_37.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_37.tflite new file mode 100644 index 000000000..77b74b683 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_37.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_38.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_38.tflite new file mode 100644 index 000000000..f9784dcfa Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_38.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_39.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_39.tflite new file mode 100644 index 000000000..9cbd43fdd Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_39.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_4.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_4.tflite new file mode 100644 index 000000000..35aadbee7 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_4.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_5.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_5.tflite new file mode 100644 index 000000000..1dc83e7fd Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_5.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_6.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_6.tflite new file mode 100644 index 000000000..f324df08c Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_6.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_7.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_7.tflite new file mode 100644 index 000000000..bdbd5cb38 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_7.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_8.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_8.tflite new file mode 100644 index 000000000..331dd0c45 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_8.tflite differ diff --git a/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_9.tflite b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_9.tflite new file mode 100644 index 000000000..cbccbdde7 Binary files /dev/null and b/integration_tests/models/8x8/test_maxpool2d/test_maxpool2d_9.tflite differ diff --git a/integration_tests/models/8x8/test_mean/generate.py b/integration_tests/models/8x8/test_mean/generate.py new file mode 100644 index 000000000..1743e1a27 --- /dev/null +++ b/integration_tests/models/8x8/test_mean/generate.py @@ -0,0 +1,47 @@ +import numpy as np +import tensorflow as tf +from tensorflow import lite as tfl + +i = 0 + + +def generate_mean_model(input_shape, axes): + input_data = tf.keras.Input(shape=input_shape, dtype=tf.int8, batch_size=1) + mean_output = tf.keras.backend.mean(input_data, axis=axes) + model = tf.keras.Model(inputs=input_data, outputs=mean_output) + converter = tfl.TFLiteConverter.from_keras_model(model) + + def representative_dataset_gen(): + for _ in range(100): + yield [ + np.random.uniform(low=-127, high=127, size=input_shape).astype(np.int8) + ] + + converter.optimizations = [tf.lite.Optimize.DEFAULT] + converter.representative_dataset = representative_dataset_gen + converter.target_spec.supported_ops = [tfl.OpsSet.TFLITE_BUILTINS_INT8] + converter.inference_input_type = tf.int8 + converter.inference_output_type = tf.int8 + + tflite_model = converter.convert() + global i + model_name = f"test_mean_{i}.tflite" + i += 1 + with open(model_name, "wb") as f: + f.write(tflite_model) + print(f"Model saved: {model_name}") + + +input_shapes_and_axes = [ + ((10,), [0]), + ((8, 16), [0]), + ((8, 16), [1]), + ((8, 16), [0, 1]), + ((8, 15, 32), [0]), + ((8, 15, 32), [1]), + ((8, 15, 32), [2]), + ((8, 15, 32), [0, 2]), +] + +for shape, axes in input_shapes_and_axes: + generate_mean_model(shape, axes) diff --git a/integration_tests/models/8x8/test_mean/params.yaml b/integration_tests/models/8x8/test_mean/params.yaml new file mode 100644 index 000000000..aecf2f6bd --- /dev/null +++ b/integration_tests/models/8x8/test_mean/params.yaml @@ -0,0 +1 @@ +MAX_ABS_ERROR: 1.0 diff --git a/integration_tests/models/8x8/test_mean/test_mean_0.tflite b/integration_tests/models/8x8/test_mean/test_mean_0.tflite new file mode 100644 index 000000000..d6ba76ad0 Binary files /dev/null and b/integration_tests/models/8x8/test_mean/test_mean_0.tflite differ diff --git a/integration_tests/models/8x8/test_mean/test_mean_1.mlir b/integration_tests/models/8x8/test_mean/test_mean_1.mlir new file mode 100644 index 000000000..86e91f1ab --- /dev/null +++ b/integration_tests/models/8x8/test_mean/test_mean_1.mlir @@ -0,0 +1,5 @@ +func.func @main(%arg0: tensor<1x5x8x16x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x5x1x16x!quant.uniform> {tf_saved_model.index_path = ["tf.mean_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1xi32>, value = dense<2> : tensor<1xi32>} : () -> tensor<1xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<1x5x8x16x!quant.uniform>, tensor<1xi32>) -> tensor<1x5x1x16x!quant.uniform> + return %1 : tensor<1x5x1x16x!quant.uniform> +} diff --git a/integration_tests/models/8x8/test_mean/test_mean_1.tflite b/integration_tests/models/8x8/test_mean/test_mean_1.tflite new file mode 100644 index 000000000..6fd030d11 Binary files /dev/null and b/integration_tests/models/8x8/test_mean/test_mean_1.tflite differ diff --git a/integration_tests/models/8x8/test_mean/test_mean_10.mlir b/integration_tests/models/8x8/test_mean/test_mean_10.mlir new file mode 100644 index 000000000..f49a62393 --- /dev/null +++ b/integration_tests/models/8x8/test_mean/test_mean_10.mlir @@ -0,0 +1,6 @@ +// This test reduces the 2nd and 3rd axes of a 4D tensor with consecutive axes and keep_dims = true. +func.func @main(%arg0: tensor<8x5x10x12x!quant.uniform>) -> (tensor<8x1x1x12x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[1, 2]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<8x5x10x12x!quant.uniform>, tensor<2xi32>) -> tensor<8x1x1x12x!quant.uniform> + return %1 : tensor<8x1x1x12x!quant.uniform> +} diff --git a/integration_tests/models/8x8/test_mean/test_mean_10.tflite b/integration_tests/models/8x8/test_mean/test_mean_10.tflite new file mode 100644 index 000000000..0e35f8a89 Binary files /dev/null and b/integration_tests/models/8x8/test_mean/test_mean_10.tflite differ diff --git a/integration_tests/models/8x8/test_mean/test_mean_11.mlir b/integration_tests/models/8x8/test_mean/test_mean_11.mlir new file mode 100644 index 000000000..f49a62393 --- /dev/null +++ b/integration_tests/models/8x8/test_mean/test_mean_11.mlir @@ -0,0 +1,6 @@ +// This test reduces the 2nd and 3rd axes of a 4D tensor with consecutive axes and keep_dims = true. +func.func @main(%arg0: tensor<8x5x10x12x!quant.uniform>) -> (tensor<8x1x1x12x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[1, 2]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<8x5x10x12x!quant.uniform>, tensor<2xi32>) -> tensor<8x1x1x12x!quant.uniform> + return %1 : tensor<8x1x1x12x!quant.uniform> +} diff --git a/integration_tests/models/8x8/test_mean/test_mean_11.tflite b/integration_tests/models/8x8/test_mean/test_mean_11.tflite new file mode 100644 index 000000000..d4311b854 Binary files /dev/null and b/integration_tests/models/8x8/test_mean/test_mean_11.tflite differ diff --git a/integration_tests/models/8x8/test_mean/test_mean_2.mlir b/integration_tests/models/8x8/test_mean/test_mean_2.mlir new file mode 100644 index 000000000..7b006436c --- /dev/null +++ b/integration_tests/models/8x8/test_mean/test_mean_2.mlir @@ -0,0 +1,6 @@ +// This test reduces the 3rd axis of a 4D tensor without keeping dimensions. +func.func @main(%arg0: tensor<2x3x4x5x!quant.uniform>) -> (tensor<2x3x5x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1xi32>, value = dense<2> : tensor<1xi32>} : () -> tensor<1xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = false} : (tensor<2x3x4x5x!quant.uniform>, tensor<1xi32>) -> tensor<2x3x5x!quant.uniform> + return %1 : tensor<2x3x5x!quant.uniform> +} diff --git a/integration_tests/models/8x8/test_mean/test_mean_2.tflite b/integration_tests/models/8x8/test_mean/test_mean_2.tflite new file mode 100644 index 000000000..d9cf8d847 Binary files /dev/null and b/integration_tests/models/8x8/test_mean/test_mean_2.tflite differ diff --git a/integration_tests/models/8x8/test_mean/test_mean_3.mlir b/integration_tests/models/8x8/test_mean/test_mean_3.mlir new file mode 100644 index 000000000..1c964c9f2 --- /dev/null +++ b/integration_tests/models/8x8/test_mean/test_mean_3.mlir @@ -0,0 +1,6 @@ +// This test reduces the 2nd and 4th axes of a 5D tensor while keeping dimensions. +func.func @main(%arg0: tensor<4x3x5x7x6x!quant.uniform>) -> (tensor<4x1x5x1x6x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[1, 3]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<4x3x5x7x6x!quant.uniform>, tensor<2xi32>) -> tensor<4x1x5x1x6x!quant.uniform> + return %1 : tensor<4x1x5x1x6x!quant.uniform> +} diff --git a/integration_tests/models/8x8/test_mean/test_mean_3.tflite b/integration_tests/models/8x8/test_mean/test_mean_3.tflite new file mode 100644 index 000000000..d98f2ba43 Binary files /dev/null and b/integration_tests/models/8x8/test_mean/test_mean_3.tflite differ diff --git a/integration_tests/models/8x8/test_mean/test_mean_4.mlir b/integration_tests/models/8x8/test_mean/test_mean_4.mlir new file mode 100644 index 000000000..595ef06c6 --- /dev/null +++ b/integration_tests/models/8x8/test_mean/test_mean_4.mlir @@ -0,0 +1,6 @@ +// This test reduces the 1st axis of a 3D tensor without keeping dimensions. +func.func @main(%arg0: tensor<10x20x30x!quant.uniform>) -> (tensor<20x30x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1xi32>, value = dense<0> : tensor<1xi32>} : () -> tensor<1xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = false} : (tensor<10x20x30x!quant.uniform>, tensor<1xi32>) -> tensor<20x30x!quant.uniform> + return %1 : tensor<20x30x!quant.uniform> +} diff --git a/integration_tests/models/8x8/test_mean/test_mean_4.tflite b/integration_tests/models/8x8/test_mean/test_mean_4.tflite new file mode 100644 index 000000000..01fb8e2cb Binary files /dev/null and b/integration_tests/models/8x8/test_mean/test_mean_4.tflite differ diff --git a/integration_tests/models/8x8/test_mean/test_mean_5.mlir b/integration_tests/models/8x8/test_mean/test_mean_5.mlir new file mode 100644 index 000000000..bfbc54527 --- /dev/null +++ b/integration_tests/models/8x8/test_mean/test_mean_5.mlir @@ -0,0 +1,6 @@ +// This test reduces all axes of a 2D tensor while keeping dimensions. +func.func @main(%arg0: tensor<5x7x!quant.uniform>) -> (tensor<1x1x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[0, 1]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = true} : (tensor<5x7x!quant.uniform>, tensor<2xi32>) -> tensor<1x1x!quant.uniform> + return %1 : tensor<1x1x!quant.uniform> +} diff --git a/integration_tests/models/8x8/test_mean/test_mean_5.tflite b/integration_tests/models/8x8/test_mean/test_mean_5.tflite new file mode 100644 index 000000000..ea0352d0d Binary files /dev/null and b/integration_tests/models/8x8/test_mean/test_mean_5.tflite differ diff --git a/integration_tests/models/8x8/test_mean/test_mean_6.mlir b/integration_tests/models/8x8/test_mean/test_mean_6.mlir new file mode 100644 index 000000000..9d8f2be6d --- /dev/null +++ b/integration_tests/models/8x8/test_mean/test_mean_6.mlir @@ -0,0 +1,6 @@ +// This test reduces a 1D tensor to a scalar. +func.func @main(%arg0: tensor<15x!quant.uniform>) -> (tensor>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1xi32>, value = dense<0> : tensor<1xi32>} : () -> tensor<1xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = false} : (tensor<15x!quant.uniform>, tensor<1xi32>) -> tensor> + return %1 : tensor> +} diff --git a/integration_tests/models/8x8/test_mean/test_mean_6.tflite b/integration_tests/models/8x8/test_mean/test_mean_6.tflite new file mode 100644 index 000000000..21f781ab9 Binary files /dev/null and b/integration_tests/models/8x8/test_mean/test_mean_6.tflite differ diff --git a/integration_tests/models/8x8/test_mean/test_mean_7.mlir b/integration_tests/models/8x8/test_mean/test_mean_7.mlir new file mode 100644 index 000000000..36c6a0739 --- /dev/null +++ b/integration_tests/models/8x8/test_mean/test_mean_7.mlir @@ -0,0 +1,6 @@ +// This test reduces the 2nd and 3rd axes of a 3D tensor with different input/output quantization parameters. +func.func @main(%arg0: tensor<5x6x7x!quant.uniform>) -> (tensor<5x!quant.uniform>) { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<2xi32>, value = dense<[1, 2]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.mean"(%arg0, %0) {keep_dims = false} : (tensor<5x6x7x!quant.uniform>, tensor<2xi32>) -> tensor<5x!quant.uniform> + return %1 : tensor<5x!quant.uniform> +} diff --git a/integration_tests/models/8x8/test_mean/test_mean_7.tflite b/integration_tests/models/8x8/test_mean/test_mean_7.tflite new file mode 100644 index 000000000..5949ca73e Binary files /dev/null and b/integration_tests/models/8x8/test_mean/test_mean_7.tflite differ diff --git a/integration_tests/models/8x8/test_mul/test_mul_1.tflite b/integration_tests/models/8x8/test_mul/test_mul_1.tflite new file mode 100644 index 000000000..ac1b45537 Binary files /dev/null and b/integration_tests/models/8x8/test_mul/test_mul_1.tflite differ diff --git a/integration_tests/models/8x8/test_mul/test_mul_2.tflite b/integration_tests/models/8x8/test_mul/test_mul_2.tflite new file mode 100644 index 000000000..292b2cbc8 Binary files /dev/null and b/integration_tests/models/8x8/test_mul/test_mul_2.tflite differ diff --git a/integration_tests/models/8x8/test_mul/test_mul_3.tflite b/integration_tests/models/8x8/test_mul/test_mul_3.tflite new file mode 100644 index 000000000..ec9a3bbbd Binary files /dev/null and b/integration_tests/models/8x8/test_mul/test_mul_3.tflite differ diff --git a/integration_tests/models/8x8/test_mul/test_mul_4.tflite b/integration_tests/models/8x8/test_mul/test_mul_4.tflite new file mode 100644 index 000000000..bb1670b72 Binary files /dev/null and b/integration_tests/models/8x8/test_mul/test_mul_4.tflite differ diff --git a/integration_tests/models/8x8/test_mul/test_mul_41.tflite b/integration_tests/models/8x8/test_mul/test_mul_41.tflite new file mode 100644 index 000000000..51514642d Binary files /dev/null and b/integration_tests/models/8x8/test_mul/test_mul_41.tflite differ diff --git a/integration_tests/models/8x8/test_mul/test_mul_42.tflite b/integration_tests/models/8x8/test_mul/test_mul_42.tflite new file mode 100644 index 000000000..bbb0cc4fe Binary files /dev/null and b/integration_tests/models/8x8/test_mul/test_mul_42.tflite differ diff --git a/integration_tests/models/8x8/test_mul/test_mul_43.tflite b/integration_tests/models/8x8/test_mul/test_mul_43.tflite new file mode 100644 index 000000000..9f8588aed Binary files /dev/null and b/integration_tests/models/8x8/test_mul/test_mul_43.tflite differ diff --git a/integration_tests/models/8x8/test_mul/test_mul_44.tflite b/integration_tests/models/8x8/test_mul/test_mul_44.tflite new file mode 100644 index 000000000..4b36cf10f Binary files /dev/null and b/integration_tests/models/8x8/test_mul/test_mul_44.tflite differ diff --git a/integration_tests/models/8x8/test_mul/test_mul_45.tflite b/integration_tests/models/8x8/test_mul/test_mul_45.tflite new file mode 100644 index 000000000..bf91c5f50 Binary files /dev/null and b/integration_tests/models/8x8/test_mul/test_mul_45.tflite differ diff --git a/integration_tests/models/8x8/test_mul/test_mul_46.tflite b/integration_tests/models/8x8/test_mul/test_mul_46.tflite new file mode 100644 index 000000000..f05f6dbce Binary files /dev/null and b/integration_tests/models/8x8/test_mul/test_mul_46.tflite differ diff --git a/integration_tests/models/8x8/test_mul/test_mul_5.tflite b/integration_tests/models/8x8/test_mul/test_mul_5.tflite new file mode 100644 index 000000000..65fbcb62e Binary files /dev/null and b/integration_tests/models/8x8/test_mul/test_mul_5.tflite differ diff --git a/integration_tests/models/8x8/test_mul/test_mul_6.tflite b/integration_tests/models/8x8/test_mul/test_mul_6.tflite new file mode 100644 index 000000000..47c97fae8 Binary files /dev/null and b/integration_tests/models/8x8/test_mul/test_mul_6.tflite differ diff --git a/integration_tests/models/8x8/test_mul/test_mul_7.tflite b/integration_tests/models/8x8/test_mul/test_mul_7.tflite new file mode 100644 index 000000000..8db3fd85e Binary files /dev/null and b/integration_tests/models/8x8/test_mul/test_mul_7.tflite differ diff --git a/integration_tests/models/8x8/test_pad/generate.py b/integration_tests/models/8x8/test_pad/generate.py new file mode 100644 index 000000000..dcd338772 --- /dev/null +++ b/integration_tests/models/8x8/test_pad/generate.py @@ -0,0 +1,25 @@ +import numpy as np +import tensorflow as tf + +input_shape = (1, 8, 13, 5) +input_data = tf.keras.Input(shape=input_shape, batch_size=1) +print(input_data.shape) +l = tf.keras.layers.ZeroPadding3D(padding=((2, 0), (2, 1), (1, 2)), data_format='channels_last') +# l = tf.keras.layers.Conv2D(8, 5, strides=[2,2], padding='same') +output = l(input_data) +# l.set_weights([np.zeros((5, 5, 9, 8)), np.zeros(8)]) +print(output.shape) +model = tf.keras.Model(inputs=input_data, outputs=output) +converter = tf.lite.TFLiteConverter.from_keras_model(model) +def representative_dataset_gen(): + for _ in range(100): + yield [np.random.uniform(low=-1., high=1., size=(1,) + input_shape).astype(np.float32)] +converter.representative_dataset = representative_dataset_gen +converter.optimizations = [tf.lite.Optimize.DEFAULT] +converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] +converter.inference_input_type = tf.int8 +converter.inference_output_type = tf.int8 +tflite_model = converter.convert() +model_name = f'test_pad_30.tflite' +with open(model_name, 'wb') as f: + f.write(tflite_model) diff --git a/integration_tests/models/8x8/test_pad/params.yaml b/integration_tests/models/8x8/test_pad/params.yaml new file mode 100644 index 000000000..b684ee66c --- /dev/null +++ b/integration_tests/models/8x8/test_pad/params.yaml @@ -0,0 +1 @@ +MAX_ABS_ERROR: 0.0 diff --git a/integration_tests/models/8x8/test_pad/test_pad_0.tflite b/integration_tests/models/8x8/test_pad/test_pad_0.tflite new file mode 100644 index 000000000..6a6a7fae2 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_0.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_1.tflite b/integration_tests/models/8x8/test_pad/test_pad_1.tflite new file mode 100644 index 000000000..5beb64127 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_1.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_10.tflite b/integration_tests/models/8x8/test_pad/test_pad_10.tflite new file mode 100644 index 000000000..e2874ba4d Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_10.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_11.tflite b/integration_tests/models/8x8/test_pad/test_pad_11.tflite new file mode 100644 index 000000000..2dafa964d Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_11.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_12.tflite b/integration_tests/models/8x8/test_pad/test_pad_12.tflite new file mode 100644 index 000000000..da07c10b4 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_12.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_13.tflite b/integration_tests/models/8x8/test_pad/test_pad_13.tflite new file mode 100644 index 000000000..bc4934359 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_13.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_14.tflite b/integration_tests/models/8x8/test_pad/test_pad_14.tflite new file mode 100644 index 000000000..ba6d9f6f6 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_14.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_15.tflite b/integration_tests/models/8x8/test_pad/test_pad_15.tflite new file mode 100644 index 000000000..553f89533 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_15.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_16.tflite b/integration_tests/models/8x8/test_pad/test_pad_16.tflite new file mode 100644 index 000000000..c42f12602 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_16.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_17.tflite b/integration_tests/models/8x8/test_pad/test_pad_17.tflite new file mode 100644 index 000000000..4ed83e941 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_17.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_18.tflite b/integration_tests/models/8x8/test_pad/test_pad_18.tflite new file mode 100644 index 000000000..037ca594e Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_18.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_19.tflite b/integration_tests/models/8x8/test_pad/test_pad_19.tflite new file mode 100644 index 000000000..14df055a2 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_19.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_2.tflite b/integration_tests/models/8x8/test_pad/test_pad_2.tflite new file mode 100644 index 000000000..d3d1877ea Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_2.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_26.tflite b/integration_tests/models/8x8/test_pad/test_pad_26.tflite new file mode 100644 index 000000000..fd6de8569 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_26.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_27.tflite b/integration_tests/models/8x8/test_pad/test_pad_27.tflite new file mode 100644 index 000000000..324a267a2 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_27.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_28.tflite b/integration_tests/models/8x8/test_pad/test_pad_28.tflite new file mode 100644 index 000000000..9cb2cf2b7 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_28.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_3.tflite b/integration_tests/models/8x8/test_pad/test_pad_3.tflite new file mode 100644 index 000000000..3896345f7 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_3.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_30.tflite b/integration_tests/models/8x8/test_pad/test_pad_30.tflite new file mode 100644 index 000000000..3e77f9e02 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_30.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_4.tflite b/integration_tests/models/8x8/test_pad/test_pad_4.tflite new file mode 100644 index 000000000..a483033b3 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_4.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_5.tflite b/integration_tests/models/8x8/test_pad/test_pad_5.tflite new file mode 100644 index 000000000..9ddfb9b17 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_5.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_6.tflite b/integration_tests/models/8x8/test_pad/test_pad_6.tflite new file mode 100644 index 000000000..868348636 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_6.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_7.tflite b/integration_tests/models/8x8/test_pad/test_pad_7.tflite new file mode 100644 index 000000000..d93cb8baa Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_7.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_8.tflite b/integration_tests/models/8x8/test_pad/test_pad_8.tflite new file mode 100644 index 000000000..af71b5923 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_8.tflite differ diff --git a/integration_tests/models/8x8/test_pad/test_pad_9.tflite b/integration_tests/models/8x8/test_pad/test_pad_9.tflite new file mode 100644 index 000000000..064205d25 Binary files /dev/null and b/integration_tests/models/8x8/test_pad/test_pad_9.tflite differ diff --git a/integration_tests/models/8x8/test_pad_overlap/test_pad_overlap_0.tflite b/integration_tests/models/8x8/test_pad_overlap/test_pad_overlap_0.tflite new file mode 100644 index 000000000..3010e369a Binary files /dev/null and b/integration_tests/models/8x8/test_pad_overlap/test_pad_overlap_0.tflite differ diff --git a/integration_tests/models/8x8/test_pad_overlap/test_pad_overlap_1.tflite b/integration_tests/models/8x8/test_pad_overlap/test_pad_overlap_1.tflite new file mode 100644 index 000000000..89049ba0f Binary files /dev/null and b/integration_tests/models/8x8/test_pad_overlap/test_pad_overlap_1.tflite differ diff --git a/integration_tests/models/8x8/test_pad_overlap/test_pad_overlap_2.tflite b/integration_tests/models/8x8/test_pad_overlap/test_pad_overlap_2.tflite new file mode 100644 index 000000000..767712268 Binary files /dev/null and b/integration_tests/models/8x8/test_pad_overlap/test_pad_overlap_2.tflite differ diff --git a/integration_tests/models/8x8/test_pad_overlap/test_pad_overlap_3.tflite b/integration_tests/models/8x8/test_pad_overlap/test_pad_overlap_3.tflite new file mode 100644 index 000000000..a163e4143 Binary files /dev/null and b/integration_tests/models/8x8/test_pad_overlap/test_pad_overlap_3.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_0.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_0.tflite new file mode 100644 index 000000000..b9ef4658c Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_0.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_1.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_1.tflite new file mode 100644 index 000000000..bc48f3b1a Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_1.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_10.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_10.tflite new file mode 100644 index 000000000..e0b3bf51d Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_10.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_11.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_11.tflite new file mode 100644 index 000000000..3cf58c448 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_11.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_12.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_12.tflite new file mode 100644 index 000000000..89e521ca3 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_12.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_13.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_13.tflite new file mode 100644 index 000000000..5a1f65819 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_13.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_14.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_14.tflite new file mode 100644 index 000000000..baa74443a Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_14.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_15.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_15.tflite new file mode 100644 index 000000000..4f68cfc17 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_15.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_16.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_16.tflite new file mode 100644 index 000000000..dd49d8776 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_16.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_17.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_17.tflite new file mode 100644 index 000000000..b89f120f9 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_17.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_18.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_18.tflite new file mode 100644 index 000000000..b7d1eb7e0 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_18.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_19.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_19.tflite new file mode 100644 index 000000000..90b0629bf Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_19.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_2.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_2.tflite new file mode 100644 index 000000000..10bdfd56c Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_2.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_3.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_3.tflite new file mode 100644 index 000000000..baf266ccc Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_3.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_4.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_4.tflite new file mode 100644 index 000000000..02ece1adf Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_4.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_5.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_5.tflite new file mode 100644 index 000000000..690887f65 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_5.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_6.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_6.tflite new file mode 100644 index 000000000..ab081230c Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_6.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_7.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_7.tflite new file mode 100644 index 000000000..e8ebf6736 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_7.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_8.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_8.tflite new file mode 100644 index 000000000..0a9278af7 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_8.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_9.tflite b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_9.tflite new file mode 100644 index 000000000..ed7f8c991 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d/test_padded_conv2d_9.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_0.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_0.tflite new file mode 100644 index 000000000..5424aabec Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_0.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_1.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_1.tflite new file mode 100644 index 000000000..aa17e5e12 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_1.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_10.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_10.tflite new file mode 100644 index 000000000..c6ba13a85 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_10.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_11.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_11.tflite new file mode 100644 index 000000000..b4d39a4a8 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_11.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_12.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_12.tflite new file mode 100644 index 000000000..662808aeb Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_12.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_13.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_13.tflite new file mode 100644 index 000000000..dd62de849 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_13.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_14.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_14.tflite new file mode 100644 index 000000000..a0efd69ea Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_14.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_15.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_15.tflite new file mode 100644 index 000000000..3cc894ac2 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_15.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_16.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_16.tflite new file mode 100644 index 000000000..1c49a7002 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_16.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_17.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_17.tflite new file mode 100644 index 000000000..d797bda2d Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_17.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_18.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_18.tflite new file mode 100644 index 000000000..57d9f82bc Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_18.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_19.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_19.tflite new file mode 100644 index 000000000..39f8e1f99 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_19.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_2.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_2.tflite new file mode 100644 index 000000000..85dd6904b Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_2.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_3.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_3.tflite new file mode 100644 index 000000000..b873f4eb7 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_3.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_4.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_4.tflite new file mode 100644 index 000000000..19eb2033e Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_4.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_5.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_5.tflite new file mode 100644 index 000000000..b73edba92 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_5.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_6.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_6.tflite new file mode 100644 index 000000000..795d9d18c Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_6.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_7.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_7.tflite new file mode 100644 index 000000000..5397b8b2f Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_7.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_8.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_8.tflite new file mode 100644 index 000000000..d0175108d Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_8.tflite differ diff --git a/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_9.tflite b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_9.tflite new file mode 100644 index 000000000..cd565af1d Binary files /dev/null and b/integration_tests/models/8x8/test_padded_conv2d_shallowin/test_padded_conv2d_shallowin_9.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_0.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_0.tflite new file mode 100644 index 000000000..9b813d98d Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_0.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_1.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_1.tflite new file mode 100644 index 000000000..91c90327e Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_1.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_10.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_10.tflite new file mode 100644 index 000000000..581a5a0be Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_10.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_11.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_11.tflite new file mode 100644 index 000000000..b843da0dc Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_11.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_12.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_12.tflite new file mode 100644 index 000000000..7a752f70c Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_12.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_13.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_13.tflite new file mode 100644 index 000000000..727389d25 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_13.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_14.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_14.tflite new file mode 100644 index 000000000..d3e844a76 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_14.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_15.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_15.tflite new file mode 100644 index 000000000..62de8d6d5 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_15.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_16.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_16.tflite new file mode 100644 index 000000000..9fb100391 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_16.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_17.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_17.tflite new file mode 100644 index 000000000..18490b0de Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_17.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_18.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_18.tflite new file mode 100644 index 000000000..1490019df Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_18.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_19.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_19.tflite new file mode 100644 index 000000000..034e6dc45 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_19.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_2.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_2.tflite new file mode 100644 index 000000000..79cc4d6c8 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_2.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_3.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_3.tflite new file mode 100644 index 000000000..0cb1f62d6 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_3.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_4.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_4.tflite new file mode 100644 index 000000000..684338405 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_4.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_5.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_5.tflite new file mode 100644 index 000000000..f6534fec0 Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_5.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_6.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_6.tflite new file mode 100644 index 000000000..b62a07f8f Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_6.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_7.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_7.tflite new file mode 100644 index 000000000..270843add Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_7.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_8.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_8.tflite new file mode 100644 index 000000000..271b26b5b Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_8.tflite differ diff --git a/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_9.tflite b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_9.tflite new file mode 100644 index 000000000..8c156ae4c Binary files /dev/null and b/integration_tests/models/8x8/test_padded_depthwise_conv2d/test_padded_depthwise_conv2d_9.tflite differ diff --git a/integration_tests/models/8x8/test_prelu/test_prelu_0.tflite b/integration_tests/models/8x8/test_prelu/test_prelu_0.tflite new file mode 100644 index 000000000..cc40789cc Binary files /dev/null and b/integration_tests/models/8x8/test_prelu/test_prelu_0.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_0.tflite b/integration_tests/models/8x8/test_relu/test_relu_0.tflite new file mode 100644 index 000000000..82be7a125 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_0.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_1.tflite b/integration_tests/models/8x8/test_relu/test_relu_1.tflite new file mode 100644 index 000000000..be7d12fe3 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_1.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_10.tflite b/integration_tests/models/8x8/test_relu/test_relu_10.tflite new file mode 100644 index 000000000..86ab8c2f6 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_10.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_11.tflite b/integration_tests/models/8x8/test_relu/test_relu_11.tflite new file mode 100644 index 000000000..9e72dba01 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_11.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_12.tflite b/integration_tests/models/8x8/test_relu/test_relu_12.tflite new file mode 100644 index 000000000..bccc4c764 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_12.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_13.tflite b/integration_tests/models/8x8/test_relu/test_relu_13.tflite new file mode 100644 index 000000000..38043cac0 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_13.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_14.tflite b/integration_tests/models/8x8/test_relu/test_relu_14.tflite new file mode 100644 index 000000000..c50c69b26 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_14.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_15.tflite b/integration_tests/models/8x8/test_relu/test_relu_15.tflite new file mode 100644 index 000000000..628671204 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_15.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_16.tflite b/integration_tests/models/8x8/test_relu/test_relu_16.tflite new file mode 100644 index 000000000..a0efc1967 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_16.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_17.tflite b/integration_tests/models/8x8/test_relu/test_relu_17.tflite new file mode 100644 index 000000000..def222c84 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_17.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_18.tflite b/integration_tests/models/8x8/test_relu/test_relu_18.tflite new file mode 100644 index 000000000..e840b6a93 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_18.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_19.tflite b/integration_tests/models/8x8/test_relu/test_relu_19.tflite new file mode 100644 index 000000000..3e34a686a Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_19.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_2.tflite b/integration_tests/models/8x8/test_relu/test_relu_2.tflite new file mode 100644 index 000000000..e429b2307 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_2.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_20.tflite b/integration_tests/models/8x8/test_relu/test_relu_20.tflite new file mode 100644 index 000000000..f1a48b0ad Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_20.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_21.tflite b/integration_tests/models/8x8/test_relu/test_relu_21.tflite new file mode 100644 index 000000000..cd6903347 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_21.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_22.tflite b/integration_tests/models/8x8/test_relu/test_relu_22.tflite new file mode 100644 index 000000000..5f2d93b02 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_22.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_23.tflite b/integration_tests/models/8x8/test_relu/test_relu_23.tflite new file mode 100644 index 000000000..4ed679e64 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_23.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_24.tflite b/integration_tests/models/8x8/test_relu/test_relu_24.tflite new file mode 100644 index 000000000..53dab9c41 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_24.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_25.tflite b/integration_tests/models/8x8/test_relu/test_relu_25.tflite new file mode 100644 index 000000000..f6f71be9b Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_25.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_26.tflite b/integration_tests/models/8x8/test_relu/test_relu_26.tflite new file mode 100644 index 000000000..396cb9b03 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_26.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_27.tflite b/integration_tests/models/8x8/test_relu/test_relu_27.tflite new file mode 100644 index 000000000..1989ceb8c Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_27.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_28.tflite b/integration_tests/models/8x8/test_relu/test_relu_28.tflite new file mode 100644 index 000000000..6486e953c Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_28.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_29.tflite b/integration_tests/models/8x8/test_relu/test_relu_29.tflite new file mode 100644 index 000000000..d2901694f Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_29.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_3.tflite b/integration_tests/models/8x8/test_relu/test_relu_3.tflite new file mode 100644 index 000000000..12f3200d5 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_3.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_30.tflite b/integration_tests/models/8x8/test_relu/test_relu_30.tflite new file mode 100644 index 000000000..f4678334b Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_30.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_31.tflite b/integration_tests/models/8x8/test_relu/test_relu_31.tflite new file mode 100644 index 000000000..255a47232 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_31.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_32.tflite b/integration_tests/models/8x8/test_relu/test_relu_32.tflite new file mode 100644 index 000000000..6c39e2f63 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_32.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_33.tflite b/integration_tests/models/8x8/test_relu/test_relu_33.tflite new file mode 100644 index 000000000..f2abf1fbc Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_33.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_34.tflite b/integration_tests/models/8x8/test_relu/test_relu_34.tflite new file mode 100644 index 000000000..22f1f9198 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_34.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_35.tflite b/integration_tests/models/8x8/test_relu/test_relu_35.tflite new file mode 100644 index 000000000..9acf6bf10 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_35.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_36.tflite b/integration_tests/models/8x8/test_relu/test_relu_36.tflite new file mode 100644 index 000000000..9f8b1a0b9 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_36.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_37.tflite b/integration_tests/models/8x8/test_relu/test_relu_37.tflite new file mode 100644 index 000000000..2e2e80fd1 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_37.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_38.tflite b/integration_tests/models/8x8/test_relu/test_relu_38.tflite new file mode 100644 index 000000000..3f7d77652 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_38.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_39.tflite b/integration_tests/models/8x8/test_relu/test_relu_39.tflite new file mode 100644 index 000000000..49037ffff Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_39.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_4.tflite b/integration_tests/models/8x8/test_relu/test_relu_4.tflite new file mode 100644 index 000000000..485e1c5cb Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_4.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_5.tflite b/integration_tests/models/8x8/test_relu/test_relu_5.tflite new file mode 100644 index 000000000..b4a95e353 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_5.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_6.tflite b/integration_tests/models/8x8/test_relu/test_relu_6.tflite new file mode 100644 index 000000000..10b4b59e3 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_6.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_7.tflite b/integration_tests/models/8x8/test_relu/test_relu_7.tflite new file mode 100644 index 000000000..440dbb477 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_7.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_8.tflite b/integration_tests/models/8x8/test_relu/test_relu_8.tflite new file mode 100644 index 000000000..6c80efafb Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_8.tflite differ diff --git a/integration_tests/models/8x8/test_relu/test_relu_9.tflite b/integration_tests/models/8x8/test_relu/test_relu_9.tflite new file mode 100644 index 000000000..12a5f7e56 Binary files /dev/null and b/integration_tests/models/8x8/test_relu/test_relu_9.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_0.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_0.tflite new file mode 100644 index 000000000..ca58b6542 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_0.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_1.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_1.tflite new file mode 100644 index 000000000..f5b11891a Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_1.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_10.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_10.tflite new file mode 100644 index 000000000..675f275fe Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_10.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_11.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_11.tflite new file mode 100644 index 000000000..d7b53db82 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_11.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_12.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_12.tflite new file mode 100644 index 000000000..822cea13a Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_12.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_13.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_13.tflite new file mode 100644 index 000000000..dfe61e81f Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_13.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_14.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_14.tflite new file mode 100644 index 000000000..59b5cf254 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_14.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_15.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_15.tflite new file mode 100644 index 000000000..9c2bebd88 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_15.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_16.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_16.tflite new file mode 100644 index 000000000..755b4b9da Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_16.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_17.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_17.tflite new file mode 100644 index 000000000..a9827e0ce Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_17.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_18.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_18.tflite new file mode 100644 index 000000000..ca2235329 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_18.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_19.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_19.tflite new file mode 100644 index 000000000..1b56ef402 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_19.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_2.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_2.tflite new file mode 100644 index 000000000..6cc79153e Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_2.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_20.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_20.tflite new file mode 100644 index 000000000..f67e0eaca Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_20.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_21.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_21.tflite new file mode 100644 index 000000000..a77b2bc22 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_21.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_22.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_22.tflite new file mode 100644 index 000000000..d7b53db82 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_22.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_23.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_23.tflite new file mode 100644 index 000000000..e77221936 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_23.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_24.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_24.tflite new file mode 100644 index 000000000..23ee380ff Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_24.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_25.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_25.tflite new file mode 100644 index 000000000..8fa9fa9fd Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_25.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_26.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_26.tflite new file mode 100644 index 000000000..e04b8a3f1 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_26.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_27.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_27.tflite new file mode 100644 index 000000000..c30aad0cd Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_27.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_28.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_28.tflite new file mode 100644 index 000000000..0ebb2d570 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_28.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_29.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_29.tflite new file mode 100644 index 000000000..f67e0eaca Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_29.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_3.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_3.tflite new file mode 100644 index 000000000..76952ced5 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_3.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_30.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_30.tflite new file mode 100644 index 000000000..b5a8ad8f5 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_30.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_31.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_31.tflite new file mode 100644 index 000000000..1a0464755 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_31.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_32.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_32.tflite new file mode 100644 index 000000000..0b2d159ee Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_32.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_33.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_33.tflite new file mode 100644 index 000000000..974e987d3 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_33.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_34.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_34.tflite new file mode 100644 index 000000000..8fa9fa9fd Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_34.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_35.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_35.tflite new file mode 100644 index 000000000..c9b22c656 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_35.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_36.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_36.tflite new file mode 100644 index 000000000..e44853292 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_36.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_37.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_37.tflite new file mode 100644 index 000000000..afb413a5f Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_37.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_38.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_38.tflite new file mode 100644 index 000000000..dfe61e81f Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_38.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_39.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_39.tflite new file mode 100644 index 000000000..87466a2d6 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_39.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_4.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_4.tflite new file mode 100644 index 000000000..7a3b5fdfb Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_4.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_40.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_40.tflite new file mode 100644 index 000000000..b75511431 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_40.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_41.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_41.tflite new file mode 100644 index 000000000..966a6c64d Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_41.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_5.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_5.tflite new file mode 100644 index 000000000..ce7113bf4 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_5.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_6.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_6.tflite new file mode 100644 index 000000000..f55e32c8a Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_6.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_7.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_7.tflite new file mode 100644 index 000000000..95ae7a04e Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_7.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_8.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_8.tflite new file mode 100644 index 000000000..189f667d7 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_8.tflite differ diff --git a/integration_tests/models/8x8/test_sigmoid/test_sigmoid_9.tflite b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_9.tflite new file mode 100644 index 000000000..76952ced5 Binary files /dev/null and b/integration_tests/models/8x8/test_sigmoid/test_sigmoid_9.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_0.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_0.tflite new file mode 100644 index 000000000..f1022ab6e Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_0.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_1.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_1.tflite new file mode 100644 index 000000000..0765ed3fa Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_1.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_10.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_10.tflite new file mode 100644 index 000000000..8b90c2d29 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_10.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_11.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_11.tflite new file mode 100644 index 000000000..495543347 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_11.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_12.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_12.tflite new file mode 100644 index 000000000..d3de4a47c Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_12.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_13.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_13.tflite new file mode 100644 index 000000000..5bbb38e88 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_13.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_14.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_14.tflite new file mode 100644 index 000000000..be5c10236 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_14.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_15.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_15.tflite new file mode 100644 index 000000000..e9c4f1180 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_15.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_16.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_16.tflite new file mode 100644 index 000000000..aa1b65803 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_16.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_17.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_17.tflite new file mode 100644 index 000000000..ac7cc6862 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_17.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_18.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_18.tflite new file mode 100644 index 000000000..472f22760 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_18.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_19.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_19.tflite new file mode 100644 index 000000000..552afb042 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_19.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_2.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_2.tflite new file mode 100644 index 000000000..3621d5a95 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_2.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_3.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_3.tflite new file mode 100644 index 000000000..8726ecce1 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_3.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_4.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_4.tflite new file mode 100644 index 000000000..65735d539 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_4.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_5.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_5.tflite new file mode 100644 index 000000000..145d37b16 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_5.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_6.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_6.tflite new file mode 100644 index 000000000..64e02a51e Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_6.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_7.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_7.tflite new file mode 100644 index 000000000..4a75768b6 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_7.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_8.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_8.tflite new file mode 100644 index 000000000..8acd6f311 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_8.tflite differ diff --git a/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_9.tflite b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_9.tflite new file mode 100644 index 000000000..0b2303645 Binary files /dev/null and b/integration_tests/models/8x8/test_single_pixel_conv2d/test_single_pixel_conv2d_9.tflite differ diff --git a/integration_tests/models/8x8/test_slice/generate.py b/integration_tests/models/8x8/test_slice/generate.py new file mode 100644 index 000000000..d067572a5 --- /dev/null +++ b/integration_tests/models/8x8/test_slice/generate.py @@ -0,0 +1,56 @@ +import numpy as np +import tensorflow as tf +from tensorflow import lite as tfl + +i = 0 + +def generate_slice_model(input_shape, dtype, begin, size): + begin = [0] + begin + size = [1] + size + input_data = tf.keras.Input(shape=input_shape, dtype=dtype, batch_size=1) + sliced_output = tf.slice(input_data, begin, size) + model = tf.keras.Model(inputs=input_data, outputs=sliced_output) + converter = tfl.TFLiteConverter.from_keras_model(model) + if dtype == tf.int8 or dtype == tf.int16: + def representative_dataset_gen(): + for _ in range(100): + yield [np.random.uniform(low=-127, high=127, size=input_shape).astype(dtype.as_numpy_dtype)] + converter.optimizations = [tf.lite.Optimize.DEFAULT] + converter.representative_dataset = representative_dataset_gen + if dtype == tf.int8: + converter.target_spec.supported_ops = [tfl.OpsSet.TFLITE_BUILTINS_INT8] + else: + converter.target_spec.supported_ops = [tfl.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8] + converter.inference_input_type = dtype + converter.inference_output_type = dtype + tflite_model = converter.convert() + global i + model_name = f'test_slice_{i}.tflite' + i+=1 + with open(model_name, 'wb') as f: + f.write(tflite_model) + print(f'Model saved: {model_name}') + + +dtypes = [tf.int8, tf.float32] + +for dtype in dtypes: + shape = (10,) + generate_slice_model(shape, dtype, [0], [5]) + generate_slice_model(shape, dtype, [2], [4]) + generate_slice_model(shape, dtype, [0], [10]) + shape = (8, 16) + generate_slice_model(shape, dtype, [0, 0], [8, 8]) + generate_slice_model(shape, dtype, [2, 0], [6, 16]) + generate_slice_model(shape, dtype, [4, 1], [4, 15]) + shape = (8, 15, 32) + generate_slice_model(shape, dtype, [0, 0, 0], [8, 15, 28]) + generate_slice_model(shape, dtype, [2, 0, 0], [6, 15, 32]) + generate_slice_model(shape, dtype, [3, 0, 0], [4, 14, 32]) + shape = (1, 1, 20) + generate_slice_model(shape, dtype, [0, 0, 0], [1, 1, 15]) + shape = (7, 9, 10, 3) + generate_slice_model(shape, dtype, [0, 0, 0, 0], [7, 9, 10, 3]) + generate_slice_model(shape, dtype, [1, 5, 0, 0], [6, 3, 10, 3]) + shape = (3, 11, 16, 5) + generate_slice_model(shape, dtype, [2, 2, 1, 0], [1, 8, 13, 5]) diff --git a/integration_tests/models/8x8/test_slice/params.yaml b/integration_tests/models/8x8/test_slice/params.yaml new file mode 100644 index 000000000..b684ee66c --- /dev/null +++ b/integration_tests/models/8x8/test_slice/params.yaml @@ -0,0 +1 @@ +MAX_ABS_ERROR: 0.0 diff --git a/integration_tests/models/8x8/test_slice/test_slice_0.tflite b/integration_tests/models/8x8/test_slice/test_slice_0.tflite new file mode 100644 index 000000000..6693d8ee8 Binary files /dev/null and b/integration_tests/models/8x8/test_slice/test_slice_0.tflite differ diff --git a/integration_tests/models/8x8/test_slice/test_slice_1.tflite b/integration_tests/models/8x8/test_slice/test_slice_1.tflite new file mode 100644 index 000000000..2f061721e Binary files /dev/null and b/integration_tests/models/8x8/test_slice/test_slice_1.tflite differ diff --git a/integration_tests/models/8x8/test_slice/test_slice_10.tflite b/integration_tests/models/8x8/test_slice/test_slice_10.tflite new file mode 100644 index 000000000..c004bca26 Binary files /dev/null and b/integration_tests/models/8x8/test_slice/test_slice_10.tflite differ diff --git a/integration_tests/models/8x8/test_slice/test_slice_11.tflite b/integration_tests/models/8x8/test_slice/test_slice_11.tflite new file mode 100644 index 000000000..a8c32976a Binary files /dev/null and b/integration_tests/models/8x8/test_slice/test_slice_11.tflite differ diff --git a/integration_tests/models/8x8/test_slice/test_slice_12.tflite b/integration_tests/models/8x8/test_slice/test_slice_12.tflite new file mode 100644 index 000000000..90ab9099d Binary files /dev/null and b/integration_tests/models/8x8/test_slice/test_slice_12.tflite differ diff --git a/integration_tests/models/8x8/test_slice/test_slice_2.tflite b/integration_tests/models/8x8/test_slice/test_slice_2.tflite new file mode 100644 index 000000000..2e8069830 Binary files /dev/null and b/integration_tests/models/8x8/test_slice/test_slice_2.tflite differ diff --git a/integration_tests/models/8x8/test_slice/test_slice_3.tflite b/integration_tests/models/8x8/test_slice/test_slice_3.tflite new file mode 100644 index 000000000..56b143536 Binary files /dev/null and b/integration_tests/models/8x8/test_slice/test_slice_3.tflite differ diff --git a/integration_tests/models/8x8/test_slice/test_slice_4.tflite b/integration_tests/models/8x8/test_slice/test_slice_4.tflite new file mode 100644 index 000000000..0e0b1c1e1 Binary files /dev/null and b/integration_tests/models/8x8/test_slice/test_slice_4.tflite differ diff --git a/integration_tests/models/8x8/test_slice/test_slice_5.tflite b/integration_tests/models/8x8/test_slice/test_slice_5.tflite new file mode 100644 index 000000000..09e90ce06 Binary files /dev/null and b/integration_tests/models/8x8/test_slice/test_slice_5.tflite differ diff --git a/integration_tests/models/8x8/test_slice/test_slice_6.tflite b/integration_tests/models/8x8/test_slice/test_slice_6.tflite new file mode 100644 index 000000000..76c782013 Binary files /dev/null and b/integration_tests/models/8x8/test_slice/test_slice_6.tflite differ diff --git a/integration_tests/models/8x8/test_slice/test_slice_7.tflite b/integration_tests/models/8x8/test_slice/test_slice_7.tflite new file mode 100644 index 000000000..44c1d6e2a Binary files /dev/null and b/integration_tests/models/8x8/test_slice/test_slice_7.tflite differ diff --git a/integration_tests/models/8x8/test_slice/test_slice_8.tflite b/integration_tests/models/8x8/test_slice/test_slice_8.tflite new file mode 100644 index 000000000..1fedcd828 Binary files /dev/null and b/integration_tests/models/8x8/test_slice/test_slice_8.tflite differ diff --git a/integration_tests/models/8x8/test_slice/test_slice_9.tflite b/integration_tests/models/8x8/test_slice/test_slice_9.tflite new file mode 100644 index 000000000..bdfc44b4a Binary files /dev/null and b/integration_tests/models/8x8/test_slice/test_slice_9.tflite differ diff --git a/integration_tests/models/8x8/test_slice/test_slice_no_op.tflite b/integration_tests/models/8x8/test_slice/test_slice_no_op.tflite new file mode 100644 index 000000000..f89f70e25 Binary files /dev/null and b/integration_tests/models/8x8/test_slice/test_slice_no_op.tflite differ diff --git a/integration_tests/models/8x8/test_softmax/generate.py b/integration_tests/models/8x8/test_softmax/generate.py new file mode 100644 index 000000000..86fd3f48a --- /dev/null +++ b/integration_tests/models/8x8/test_softmax/generate.py @@ -0,0 +1,40 @@ + +import numpy as np +import tensorflow as tf + +BATCH_SIZE = 100 +input_shape = (2,) +input_data = tf.keras.Input(shape=input_shape, batch_size=BATCH_SIZE) +print(input_data.shape) + +# Apply the Softmax layer +output = tf.keras.layers.Softmax()(input_data) +print(output.shape) + +# Create the model +model = tf.keras.Model(inputs=input_data, outputs=output) + +# Convert the model to TensorFlow Lite format +converter = tf.lite.TFLiteConverter.from_keras_model(model) + +# Optional: Define a representative dataset for quantization (not required for this simple model) +def representative_dataset_gen(): + for _ in range(100): + yield [np.random.uniform(low=-1., high=1., size=(BATCH_SIZE,) + input_shape).astype(np.float32)] + +# Optional: Set optimization options (can be commented out if not needed) +converter.representative_dataset = representative_dataset_gen +converter.optimizations = [tf.lite.Optimize.DEFAULT] +converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] +converter.inference_input_type = tf.int8 +converter.inference_output_type = tf.int8 + +# Convert the model +tflite_model = converter.convert() + +# Save the TFLite model +model_name = 'test_softmax_10.tflite' +with open(model_name, 'wb') as f: + f.write(tflite_model) + +print(f"TFLite model saved as {model_name}") diff --git a/integration_tests/models/8x8/test_softmax/params.yaml b/integration_tests/models/8x8/test_softmax/params.yaml new file mode 100644 index 000000000..aecf2f6bd --- /dev/null +++ b/integration_tests/models/8x8/test_softmax/params.yaml @@ -0,0 +1 @@ +MAX_ABS_ERROR: 1.0 diff --git a/integration_tests/models/8x8/test_softmax/test_softmax_0.tflite b/integration_tests/models/8x8/test_softmax/test_softmax_0.tflite new file mode 100644 index 000000000..f9b838144 Binary files /dev/null and b/integration_tests/models/8x8/test_softmax/test_softmax_0.tflite differ diff --git a/integration_tests/models/8x8/test_softmax/test_softmax_1.tflite b/integration_tests/models/8x8/test_softmax/test_softmax_1.tflite new file mode 100644 index 000000000..d9c89e481 Binary files /dev/null and b/integration_tests/models/8x8/test_softmax/test_softmax_1.tflite differ diff --git a/integration_tests/models/8x8/test_softmax/test_softmax_10.tflite b/integration_tests/models/8x8/test_softmax/test_softmax_10.tflite new file mode 100644 index 000000000..0a57ec581 Binary files /dev/null and b/integration_tests/models/8x8/test_softmax/test_softmax_10.tflite differ diff --git a/integration_tests/models/8x8/test_softmax/test_softmax_11.tflite b/integration_tests/models/8x8/test_softmax/test_softmax_11.tflite new file mode 100644 index 000000000..77fd27a9c Binary files /dev/null and b/integration_tests/models/8x8/test_softmax/test_softmax_11.tflite differ diff --git a/integration_tests/models/8x8/test_softmax/test_softmax_2.tflite b/integration_tests/models/8x8/test_softmax/test_softmax_2.tflite new file mode 100644 index 000000000..944265bd7 Binary files /dev/null and b/integration_tests/models/8x8/test_softmax/test_softmax_2.tflite differ diff --git a/integration_tests/models/8x8/test_softmax/test_softmax_3.tflite b/integration_tests/models/8x8/test_softmax/test_softmax_3.tflite new file mode 100644 index 000000000..2a3e66339 Binary files /dev/null and b/integration_tests/models/8x8/test_softmax/test_softmax_3.tflite differ diff --git a/integration_tests/models/8x8/test_softmax/test_softmax_4.tflite b/integration_tests/models/8x8/test_softmax/test_softmax_4.tflite new file mode 100644 index 000000000..14b8b40f2 Binary files /dev/null and b/integration_tests/models/8x8/test_softmax/test_softmax_4.tflite differ diff --git a/integration_tests/models/8x8/test_softmax/test_softmax_5.tflite b/integration_tests/models/8x8/test_softmax/test_softmax_5.tflite new file mode 100644 index 000000000..3fa1576e8 Binary files /dev/null and b/integration_tests/models/8x8/test_softmax/test_softmax_5.tflite differ diff --git a/integration_tests/models/8x8/test_softmax/test_softmax_6.tflite b/integration_tests/models/8x8/test_softmax/test_softmax_6.tflite new file mode 100644 index 000000000..47805428e Binary files /dev/null and b/integration_tests/models/8x8/test_softmax/test_softmax_6.tflite differ diff --git a/integration_tests/models/8x8/test_softmax/test_softmax_7.tflite b/integration_tests/models/8x8/test_softmax/test_softmax_7.tflite new file mode 100644 index 000000000..20c97a446 Binary files /dev/null and b/integration_tests/models/8x8/test_softmax/test_softmax_7.tflite differ diff --git a/integration_tests/models/8x8/test_softmax/test_softmax_8.tflite b/integration_tests/models/8x8/test_softmax/test_softmax_8.tflite new file mode 100644 index 000000000..bc69e1f03 Binary files /dev/null and b/integration_tests/models/8x8/test_softmax/test_softmax_8.tflite differ diff --git a/integration_tests/models/8x8/test_softmax/test_softmax_9.tflite b/integration_tests/models/8x8/test_softmax/test_softmax_9.tflite new file mode 100644 index 000000000..8983c3eb9 Binary files /dev/null and b/integration_tests/models/8x8/test_softmax/test_softmax_9.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/generate.py b/integration_tests/models/8x8/test_strided_slice/generate.py new file mode 100644 index 000000000..4d31e5a11 --- /dev/null +++ b/integration_tests/models/8x8/test_strided_slice/generate.py @@ -0,0 +1,20 @@ +import numpy as np +import tensorflow as tf + +input_shape = (8, 1, 9) +input_data = tf.keras.Input(shape=input_shape, dtype=tf.int8, batch_size=1) +sliced_output = input_data[:, ::-2, 0, :-5] +model = tf.keras.Model(inputs=input_data, outputs=sliced_output) +converter = tf.lite.TFLiteConverter.from_keras_model(model) +def representative_dataset_gen(): + for _ in range(100): + yield [np.random.uniform(low=-127, high=127, size=input_shape).astype(np.int8)] +converter.representative_dataset = representative_dataset_gen +converter.optimizations = [tf.lite.Optimize.DEFAULT] +converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] +converter.inference_input_type = tf.int8 +converter.inference_output_type = tf.int8 +tflite_model = converter.convert() +model_name = f'strided_slice_5.tflite' +with open(model_name, 'wb') as f: + f.write(tflite_model) diff --git a/integration_tests/models/8x8/test_strided_slice/params.yaml b/integration_tests/models/8x8/test_strided_slice/params.yaml new file mode 100644 index 000000000..b684ee66c --- /dev/null +++ b/integration_tests/models/8x8/test_strided_slice/params.yaml @@ -0,0 +1 @@ +MAX_ABS_ERROR: 0.0 diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_0.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_0.tflite new file mode 100644 index 000000000..42d44d810 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_0.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_1.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_1.tflite new file mode 100644 index 000000000..2b865542e Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_1.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_10.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_10.tflite new file mode 100644 index 000000000..c5df46046 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_10.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_11.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_11.tflite new file mode 100644 index 000000000..9023d5235 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_11.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_12.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_12.tflite new file mode 100644 index 000000000..24dc69c80 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_12.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_13.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_13.tflite new file mode 100644 index 000000000..b927811ee Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_13.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_14.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_14.tflite new file mode 100644 index 000000000..3a2052e8c Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_14.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_15.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_15.tflite new file mode 100644 index 000000000..10c18fcdf Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_15.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_16.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_16.tflite new file mode 100644 index 000000000..be71dd341 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_16.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_17.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_17.tflite new file mode 100644 index 000000000..c8b7af527 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_17.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_18.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_18.tflite new file mode 100644 index 000000000..01e824e43 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_18.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_19.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_19.tflite new file mode 100644 index 000000000..66606fe95 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_19.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_2.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_2.tflite new file mode 100644 index 000000000..9cf3967fb Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_2.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_20.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_20.tflite new file mode 100644 index 000000000..3060acb1d Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_20.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_21.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_21.tflite new file mode 100644 index 000000000..9875fdb52 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_21.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_22.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_22.tflite new file mode 100644 index 000000000..6286c26bf Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_22.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_23.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_23.tflite new file mode 100644 index 000000000..63cee1dec Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_23.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_24.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_24.tflite new file mode 100644 index 000000000..2c5301b08 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_24.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_25.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_25.tflite new file mode 100644 index 000000000..c846a6472 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_25.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_26.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_26.tflite new file mode 100644 index 000000000..5b9da333d Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_26.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_27.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_27.tflite new file mode 100644 index 000000000..e102689bc Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_27.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_28.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_28.tflite new file mode 100644 index 000000000..034367f39 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_28.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_29.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_29.tflite new file mode 100644 index 000000000..9c1bbeedc Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_29.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_3.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_3.tflite new file mode 100644 index 000000000..654bf76a5 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_3.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_30.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_30.tflite new file mode 100644 index 000000000..166907071 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_30.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_31.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_31.tflite new file mode 100644 index 000000000..3eca28357 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_31.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_32.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_32.tflite new file mode 100644 index 000000000..913a9997a Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_32.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_33.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_33.tflite new file mode 100644 index 000000000..c5fc96191 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_33.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_34.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_34.tflite new file mode 100644 index 000000000..99838e42b Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_34.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_35.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_35.tflite new file mode 100644 index 000000000..0c5d20965 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_35.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_36.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_36.tflite new file mode 100644 index 000000000..dea0417d2 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_36.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_37.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_37.tflite new file mode 100644 index 000000000..1647b6c97 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_37.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_38.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_38.tflite new file mode 100644 index 000000000..7f0e47b93 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_38.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_39.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_39.tflite new file mode 100644 index 000000000..25fa7ab1d Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_39.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_40.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_40.tflite new file mode 100644 index 000000000..327a234b0 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_40.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_41.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_41.tflite new file mode 100644 index 000000000..01b0cfef2 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_41.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_42.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_42.tflite new file mode 100644 index 000000000..f7d4983bd Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_42.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_43.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_43.tflite new file mode 100644 index 000000000..2ae8f0c11 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_43.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_44.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_44.tflite new file mode 100644 index 000000000..4ba61ae7f Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_44.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_45.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_45.tflite new file mode 100644 index 000000000..86e2ad91d Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_45.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_46.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_46.tflite new file mode 100644 index 000000000..9bac2831d Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_46.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_47.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_47.tflite new file mode 100644 index 000000000..8a5418f67 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_47.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_48.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_48.tflite new file mode 100644 index 000000000..d8484e6e4 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_48.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_49.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_49.tflite new file mode 100644 index 000000000..9d7c1e97d Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_49.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_50.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_50.tflite new file mode 100644 index 000000000..25d5d8d12 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_50.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_51.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_51.tflite new file mode 100644 index 000000000..022b314ef Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_51.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_52.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_52.tflite new file mode 100644 index 000000000..0a244ece3 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_52.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_53.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_53.tflite new file mode 100644 index 000000000..dcbc041b7 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_53.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_54.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_54.tflite new file mode 100644 index 000000000..1aea12e96 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_54.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_55.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_55.tflite new file mode 100644 index 000000000..d601d7d71 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_55.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_56.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_56.tflite new file mode 100644 index 000000000..67dc3e91f Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_56.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_57.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_57.tflite new file mode 100644 index 000000000..edfec4c14 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_57.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_58.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_58.tflite new file mode 100644 index 000000000..5d2d8ff5f Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_58.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_59.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_59.tflite new file mode 100644 index 000000000..9e66bf69a Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_59.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_6.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_6.tflite new file mode 100644 index 000000000..bc128f51e Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_6.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_60.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_60.tflite new file mode 100644 index 000000000..0b4992d26 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_60.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_61.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_61.tflite new file mode 100644 index 000000000..863a5e7e8 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_61.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_62.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_62.tflite new file mode 100644 index 000000000..06c3c20d4 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_62.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_63.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_63.tflite new file mode 100644 index 000000000..cf2773a76 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_63.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_64.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_64.tflite new file mode 100644 index 000000000..f415da77e Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_64.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_65.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_65.tflite new file mode 100644 index 000000000..7e55764b7 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_65.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_66.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_66.tflite new file mode 100644 index 000000000..938eb9ede Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_66.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_67.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_67.tflite new file mode 100644 index 000000000..f2b76d1bf Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_67.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_68.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_68.tflite new file mode 100644 index 000000000..57fe62073 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_68.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_69.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_69.tflite new file mode 100644 index 000000000..d9c313faf Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_69.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_7.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_7.tflite new file mode 100644 index 000000000..a97d0d614 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_7.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_70.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_70.tflite new file mode 100644 index 000000000..4f3eeaba5 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_70.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_71.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_71.tflite new file mode 100644 index 000000000..55c643611 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_71.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_72.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_72.tflite new file mode 100644 index 000000000..a6800598a Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_72.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_73.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_73.tflite new file mode 100644 index 000000000..cdd51df30 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_73.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_74.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_74.tflite new file mode 100644 index 000000000..fe3237e38 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_74.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_75.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_75.tflite new file mode 100644 index 000000000..8dd9d9892 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_75.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_76.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_76.tflite new file mode 100644 index 000000000..e7002ebe2 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_76.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_77.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_77.tflite new file mode 100644 index 000000000..ad400cb94 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_77.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_78.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_78.tflite new file mode 100644 index 000000000..44c6cb024 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_78.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_79.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_79.tflite new file mode 100644 index 000000000..ea527d18f Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_79.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_8.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_8.tflite new file mode 100644 index 000000000..504374345 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_8.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_80.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_80.tflite new file mode 100644 index 000000000..b8aca8959 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_80.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_81.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_81.tflite new file mode 100644 index 000000000..75758d54c Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_81.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_82.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_82.tflite new file mode 100644 index 000000000..f52bb14c7 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_82.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_83.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_83.tflite new file mode 100644 index 000000000..79d36d544 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_83.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_84.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_84.tflite new file mode 100644 index 000000000..d0294b0d1 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_84.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_85.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_85.tflite new file mode 100644 index 000000000..8afe04c06 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_85.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_86.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_86.tflite new file mode 100644 index 000000000..af6736935 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_86.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_87.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_87.tflite new file mode 100644 index 000000000..ff4717afc Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_87.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_88.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_88.tflite new file mode 100644 index 000000000..fa9edc71b Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_88.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_89.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_89.tflite new file mode 100644 index 000000000..52b392e04 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_89.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_9.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_9.tflite new file mode 100644 index 000000000..257b70898 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_9.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_90.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_90.tflite new file mode 100644 index 000000000..2d5aa4286 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_90.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_91.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_91.tflite new file mode 100644 index 000000000..26c954d18 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_91.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_92.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_92.tflite new file mode 100644 index 000000000..dd817dcc4 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_92.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_93.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_93.tflite new file mode 100644 index 000000000..15c9a5f96 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_93.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_94.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_94.tflite new file mode 100644 index 000000000..d60beef64 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_94.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_95.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_95.tflite new file mode 100644 index 000000000..a3f5d66f4 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_95.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_96.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_96.tflite new file mode 100644 index 000000000..0583585be Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_96.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_97.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_97.tflite new file mode 100644 index 000000000..ab29eb82a Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_97.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_98.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_98.tflite new file mode 100644 index 000000000..80a21640c Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_98.tflite differ diff --git a/integration_tests/models/8x8/test_strided_slice/strided_slice_99.tflite b/integration_tests/models/8x8/test_strided_slice/strided_slice_99.tflite new file mode 100644 index 000000000..648915ae5 Binary files /dev/null and b/integration_tests/models/8x8/test_strided_slice/strided_slice_99.tflite differ diff --git a/integration_tests/models/8x8/test_sub/1.sh b/integration_tests/models/8x8/test_sub/1.sh new file mode 100755 index 000000000..4a264cea1 --- /dev/null +++ b/integration_tests/models/8x8/test_sub/1.sh @@ -0,0 +1,6 @@ +cp $1 /tmp/ +xcore-opt /tmp/$1 --lce-translate-tfl --mlir-print-ir-after-all -o /tmp/1.tflite >/tmp/1.mlir 2>&1 +cat /tmp/1.mlir | grep -v Tensor > /tmp/2.mlir +sed -i -e 's/tfl.add/tfl.sub/g' /tmp/2.mlir +xcore-opt --mlir-io --lce-translate-tfl /tmp/2.mlir -o /tmp/t.tflite +cp /tmp/t.tflite $1 diff --git a/integration_tests/models/8x8/test_sub/test_sub_0.tflite b/integration_tests/models/8x8/test_sub/test_sub_0.tflite new file mode 100644 index 000000000..3a3ed2e5c Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_0.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_1.tflite b/integration_tests/models/8x8/test_sub/test_sub_1.tflite new file mode 100644 index 000000000..933426f7a Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_1.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_10.tflite b/integration_tests/models/8x8/test_sub/test_sub_10.tflite new file mode 100644 index 000000000..c602e8ee8 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_10.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_11.tflite b/integration_tests/models/8x8/test_sub/test_sub_11.tflite new file mode 100644 index 000000000..bd73d3a34 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_11.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_12.tflite b/integration_tests/models/8x8/test_sub/test_sub_12.tflite new file mode 100644 index 000000000..1c983b9f0 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_12.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_13.tflite b/integration_tests/models/8x8/test_sub/test_sub_13.tflite new file mode 100644 index 000000000..c388b3ce0 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_13.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_14.tflite b/integration_tests/models/8x8/test_sub/test_sub_14.tflite new file mode 100644 index 000000000..70caf0c7f Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_14.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_15.tflite b/integration_tests/models/8x8/test_sub/test_sub_15.tflite new file mode 100644 index 000000000..9750f9b06 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_15.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_16.tflite b/integration_tests/models/8x8/test_sub/test_sub_16.tflite new file mode 100644 index 000000000..81a1e3ceb Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_16.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_17.tflite b/integration_tests/models/8x8/test_sub/test_sub_17.tflite new file mode 100644 index 000000000..3a3493806 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_17.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_18.tflite b/integration_tests/models/8x8/test_sub/test_sub_18.tflite new file mode 100644 index 000000000..8ec012fbf Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_18.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_19.tflite b/integration_tests/models/8x8/test_sub/test_sub_19.tflite new file mode 100644 index 000000000..5cde7b1e5 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_19.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_2.tflite b/integration_tests/models/8x8/test_sub/test_sub_2.tflite new file mode 100644 index 000000000..578db1d86 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_2.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_3.tflite b/integration_tests/models/8x8/test_sub/test_sub_3.tflite new file mode 100644 index 000000000..725acfdd7 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_3.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_4.tflite b/integration_tests/models/8x8/test_sub/test_sub_4.tflite new file mode 100644 index 000000000..7bf123c24 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_4.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_41.tflite b/integration_tests/models/8x8/test_sub/test_sub_41.tflite new file mode 100644 index 000000000..bf1466c48 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_41.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_42.tflite b/integration_tests/models/8x8/test_sub/test_sub_42.tflite new file mode 100644 index 000000000..c8fdf4a0b Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_42.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_43.tflite b/integration_tests/models/8x8/test_sub/test_sub_43.tflite new file mode 100644 index 000000000..937fe3022 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_43.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_44.tflite b/integration_tests/models/8x8/test_sub/test_sub_44.tflite new file mode 100644 index 000000000..70feb7854 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_44.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_45.tflite b/integration_tests/models/8x8/test_sub/test_sub_45.tflite new file mode 100644 index 000000000..ad4b49749 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_45.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_46.tflite b/integration_tests/models/8x8/test_sub/test_sub_46.tflite new file mode 100644 index 000000000..f41c031dd Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_46.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_47.tflite b/integration_tests/models/8x8/test_sub/test_sub_47.tflite new file mode 100644 index 000000000..8efac2d57 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_47.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_5.tflite b/integration_tests/models/8x8/test_sub/test_sub_5.tflite new file mode 100644 index 000000000..ca3e769c4 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_5.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_6.tflite b/integration_tests/models/8x8/test_sub/test_sub_6.tflite new file mode 100644 index 000000000..ddd3ced2c Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_6.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_7.tflite b/integration_tests/models/8x8/test_sub/test_sub_7.tflite new file mode 100644 index 000000000..3332f8c48 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_7.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_8.tflite b/integration_tests/models/8x8/test_sub/test_sub_8.tflite new file mode 100644 index 000000000..397d94544 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_8.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_9.tflite b/integration_tests/models/8x8/test_sub/test_sub_9.tflite new file mode 100644 index 000000000..89143cff6 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_9.tflite differ diff --git a/integration_tests/models/8x8/test_sub/test_sub_dual_output.tflite b/integration_tests/models/8x8/test_sub/test_sub_dual_output.tflite new file mode 100644 index 000000000..cf3bea545 Binary files /dev/null and b/integration_tests/models/8x8/test_sub/test_sub_dual_output.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_0.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_0.tflite new file mode 100644 index 000000000..25a9e2902 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_0.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_1.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_1.tflite new file mode 100644 index 000000000..52ce6843b Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_1.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_10.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_10.tflite new file mode 100644 index 000000000..96dde1241 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_10.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_11.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_11.tflite new file mode 100644 index 000000000..2a594906b Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_11.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_12.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_12.tflite new file mode 100644 index 000000000..4d8a28b29 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_12.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_13.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_13.tflite new file mode 100644 index 000000000..86898b8fb Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_13.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_14.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_14.tflite new file mode 100644 index 000000000..cc113b9bf Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_14.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_15.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_15.tflite new file mode 100644 index 000000000..24b1a41e7 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_15.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_16.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_16.tflite new file mode 100644 index 000000000..05cb5c6c9 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_16.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_17.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_17.tflite new file mode 100644 index 000000000..4c07577b5 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_17.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_18.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_18.tflite new file mode 100644 index 000000000..c8f727b18 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_18.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_19.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_19.tflite new file mode 100644 index 000000000..4fdeffaff Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_19.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_2.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_2.tflite new file mode 100644 index 000000000..edfa36f6d Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_2.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_20.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_20.tflite new file mode 100644 index 000000000..bcd6c19be Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_20.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_21.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_21.tflite new file mode 100644 index 000000000..52ce6843b Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_21.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_22.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_22.tflite new file mode 100644 index 000000000..fcef3bc5c Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_22.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_23.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_23.tflite new file mode 100644 index 000000000..0b5108ad5 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_23.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_24.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_24.tflite new file mode 100644 index 000000000..dd377d4cd Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_24.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_25.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_25.tflite new file mode 100644 index 000000000..10694db76 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_25.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_26.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_26.tflite new file mode 100644 index 000000000..8a82ed2da Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_26.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_27.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_27.tflite new file mode 100644 index 000000000..1521cb43f Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_27.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_28.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_28.tflite new file mode 100644 index 000000000..047b89b15 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_28.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_29.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_29.tflite new file mode 100644 index 000000000..b3d3ea90d Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_29.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_3.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_3.tflite new file mode 100644 index 000000000..9e09d1a7e Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_3.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_30.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_30.tflite new file mode 100644 index 000000000..e4be9c283 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_30.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_31.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_31.tflite new file mode 100644 index 000000000..7268929fc Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_31.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_32.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_32.tflite new file mode 100644 index 000000000..6f88ce821 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_32.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_33.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_33.tflite new file mode 100644 index 000000000..b5e656c67 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_33.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_34.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_34.tflite new file mode 100644 index 000000000..f3e6a1031 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_34.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_35.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_35.tflite new file mode 100644 index 000000000..dc73cf70f Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_35.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_36.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_36.tflite new file mode 100644 index 000000000..46cac5e7f Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_36.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_37.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_37.tflite new file mode 100644 index 000000000..c7552eef2 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_37.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_38.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_38.tflite new file mode 100644 index 000000000..e03c03bba Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_38.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_39.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_39.tflite new file mode 100644 index 000000000..77ce56492 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_39.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_4.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_4.tflite new file mode 100644 index 000000000..ab3f81420 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_4.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_5.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_5.tflite new file mode 100644 index 000000000..a3419557e Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_5.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_6.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_6.tflite new file mode 100644 index 000000000..1db3959ac Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_6.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_7.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_7.tflite new file mode 100644 index 000000000..2b2800f28 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_7.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_8.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_8.tflite new file mode 100644 index 000000000..050768ed0 Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_8.tflite differ diff --git a/integration_tests/models/8x8/test_tanh/test_tanh_9.tflite b/integration_tests/models/8x8/test_tanh/test_tanh_9.tflite new file mode 100644 index 000000000..7691c264a Binary files /dev/null and b/integration_tests/models/8x8/test_tanh/test_tanh_9.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_0.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_0.tflite new file mode 100644 index 000000000..e96e4085b Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_0.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_1.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_1.tflite new file mode 100644 index 000000000..8a1f5e799 Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_1.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_10.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_10.tflite new file mode 100644 index 000000000..0e34424e7 Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_10.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_11.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_11.tflite new file mode 100644 index 000000000..3b8d02a84 Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_11.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_12.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_12.tflite new file mode 100644 index 000000000..0b141b292 Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_12.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_13.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_13.tflite new file mode 100644 index 000000000..dbde768cf Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_13.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_14.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_14.tflite new file mode 100644 index 000000000..92d2f25de Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_14.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_15.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_15.tflite new file mode 100644 index 000000000..0e0510b9c Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_15.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_16.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_16.tflite new file mode 100644 index 000000000..814e94e25 Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_16.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_17.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_17.tflite new file mode 100644 index 000000000..38682fc99 Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_17.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_18.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_18.tflite new file mode 100644 index 000000000..4082b5b7e Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_18.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_19.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_19.tflite new file mode 100644 index 000000000..f5f2f653f Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_19.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_2.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_2.tflite new file mode 100644 index 000000000..efea1a6b3 Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_2.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_20.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_20.tflite new file mode 100644 index 000000000..3b8b30f86 Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_20.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_3.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_3.tflite new file mode 100644 index 000000000..817c58980 Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_3.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_4.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_4.tflite new file mode 100644 index 000000000..811a92079 Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_4.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_5.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_5.tflite new file mode 100644 index 000000000..03987519a Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_5.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_6.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_6.tflite new file mode 100644 index 000000000..6305061d0 Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_6.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_7.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_7.tflite new file mode 100644 index 000000000..c52951741 Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_7.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_8.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_8.tflite new file mode 100644 index 000000000..ab55a60d4 Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_8.tflite differ diff --git a/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_9.tflite b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_9.tflite new file mode 100644 index 000000000..5c212701a Binary files /dev/null and b/integration_tests/models/8x8/test_transpose_conv/test_transpose_conv_9.tflite differ diff --git a/integration_tests/models/8x8/test_zero_weights/test_zero_weights_0.tflite b/integration_tests/models/8x8/test_zero_weights/test_zero_weights_0.tflite new file mode 100644 index 000000000..d51c7dd33 Binary files /dev/null and b/integration_tests/models/8x8/test_zero_weights/test_zero_weights_0.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_0.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_0.tflite new file mode 100644 index 000000000..c1c3243e6 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_0.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_1.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_1.tflite new file mode 100644 index 000000000..8bf54b046 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_1.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_10.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_10.tflite new file mode 100644 index 000000000..26cd7af43 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_10.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_11.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_11.tflite new file mode 100644 index 000000000..b0a39a90c Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_11.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_12.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_12.tflite new file mode 100644 index 000000000..5b8e33dd3 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_12.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_13.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_13.tflite new file mode 100644 index 000000000..84b2ff6f7 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_13.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_14.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_14.tflite new file mode 100644 index 000000000..5476a0c16 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_14.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_15.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_15.tflite new file mode 100644 index 000000000..364443187 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_15.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_16.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_16.tflite new file mode 100644 index 000000000..d701e3dc8 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_16.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_17.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_17.tflite new file mode 100644 index 000000000..a1a97cc6c Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_17.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_18.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_18.tflite new file mode 100644 index 000000000..ddc6e5f70 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_18.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_19.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_19.tflite new file mode 100644 index 000000000..fa958d63f Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_19.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_2.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_2.tflite new file mode 100644 index 000000000..cd0018b2d Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_2.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_3.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_3.tflite new file mode 100644 index 000000000..19b08ce92 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_3.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_4.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_4.tflite new file mode 100644 index 000000000..11e709007 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_4.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_5.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_5.tflite new file mode 100644 index 000000000..34739e698 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_5.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_6.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_6.tflite new file mode 100644 index 000000000..72ca8c4df Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_6.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_7.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_7.tflite new file mode 100644 index 000000000..61c41f4a9 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_7.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_8.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_8.tflite new file mode 100644 index 000000000..1a32863c8 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_8.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_9.tflite b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_9.tflite new file mode 100644 index 000000000..aa30dfc28 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin/test_bconv2d_bin_9.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_0.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_0.tflite new file mode 100644 index 000000000..a997cd4d6 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_0.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_1.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_1.tflite new file mode 100644 index 000000000..0a9ce60d5 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_1.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_10.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_10.tflite new file mode 100644 index 000000000..f0de6a6e7 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_10.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_11.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_11.tflite new file mode 100644 index 000000000..90ae3be8d Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_11.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_12.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_12.tflite new file mode 100644 index 000000000..e259fa29e Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_12.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_13.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_13.tflite new file mode 100644 index 000000000..c01da3d4e Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_13.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_14.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_14.tflite new file mode 100644 index 000000000..31d5facef Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_14.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_15.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_15.tflite new file mode 100644 index 000000000..b28c0b821 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_15.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_16.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_16.tflite new file mode 100644 index 000000000..f38d2ba4a Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_16.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_17.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_17.tflite new file mode 100644 index 000000000..c1f66cb7d Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_17.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_18.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_18.tflite new file mode 100644 index 000000000..9ab216e98 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_18.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_19.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_19.tflite new file mode 100644 index 000000000..4278f23fc Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_19.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_2.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_2.tflite new file mode 100644 index 000000000..3d3cc1dc7 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_2.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_3.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_3.tflite new file mode 100644 index 000000000..ba46fecaf Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_3.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_4.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_4.tflite new file mode 100644 index 000000000..db03ef75f Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_4.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_5.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_5.tflite new file mode 100644 index 000000000..53e82c845 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_5.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_6.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_6.tflite new file mode 100644 index 000000000..bbfd9feaa Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_6.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_7.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_7.tflite new file mode 100644 index 000000000..71dd4dd51 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_7.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_8.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_8.tflite new file mode 100644 index 000000000..e8c36d95e Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_8.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_9.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_9.tflite new file mode 100644 index 000000000..817153e82 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI/test_bconv2d_bin_DI_9.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_0.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_0.tflite new file mode 100644 index 000000000..ac40f0634 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_0.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_1.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_1.tflite new file mode 100644 index 000000000..fb9d5deec Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_1.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_10.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_10.tflite new file mode 100644 index 000000000..a41b2f472 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_10.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_11.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_11.tflite new file mode 100644 index 000000000..5cf08b46a Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_11.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_12.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_12.tflite new file mode 100644 index 000000000..a68fc8c67 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_12.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_13.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_13.tflite new file mode 100644 index 000000000..e1e2f3e7d Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_13.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_14.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_14.tflite new file mode 100644 index 000000000..001a9df7d Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_14.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_15.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_15.tflite new file mode 100644 index 000000000..64ada87fe Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_15.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_16.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_16.tflite new file mode 100644 index 000000000..9fc4bc9ed Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_16.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_17.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_17.tflite new file mode 100644 index 000000000..e05f59db8 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_17.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_18.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_18.tflite new file mode 100644 index 000000000..788e3a4e3 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_18.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_19.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_19.tflite new file mode 100644 index 000000000..3c45ec002 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_19.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_2.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_2.tflite new file mode 100644 index 000000000..7a6f75d9f Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_2.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_3.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_3.tflite new file mode 100644 index 000000000..f16da6e70 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_3.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_4.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_4.tflite new file mode 100644 index 000000000..0b8ce9953 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_4.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_5.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_5.tflite new file mode 100644 index 000000000..7dcc41ad5 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_5.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_6.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_6.tflite new file mode 100644 index 000000000..561fdeac6 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_6.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_7.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_7.tflite new file mode 100644 index 000000000..cfe3924e6 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_7.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_8.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_8.tflite new file mode 100644 index 000000000..38d2ce9fd Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_8.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_9.tflite b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_9.tflite new file mode 100644 index 000000000..4ae30f35f Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_DI_padded/test_bconv2d_bin_DI_padded_9.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_0.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_0.tflite new file mode 100644 index 000000000..03795067f Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_0.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_1.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_1.tflite new file mode 100644 index 000000000..37a125870 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_1.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_10.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_10.tflite new file mode 100644 index 000000000..84167853c Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_10.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_11.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_11.tflite new file mode 100644 index 000000000..48a27d506 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_11.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_12.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_12.tflite new file mode 100644 index 000000000..f07d545e8 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_12.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_13.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_13.tflite new file mode 100644 index 000000000..436067c84 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_13.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_14.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_14.tflite new file mode 100644 index 000000000..1c051234e Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_14.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_15.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_15.tflite new file mode 100644 index 000000000..1cb963423 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_15.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_16.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_16.tflite new file mode 100644 index 000000000..47f243834 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_16.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_17.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_17.tflite new file mode 100644 index 000000000..29ca2bddf Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_17.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_18.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_18.tflite new file mode 100644 index 000000000..d368e9ce2 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_18.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_19.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_19.tflite new file mode 100644 index 000000000..b13af4b62 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_19.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_2.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_2.tflite new file mode 100644 index 000000000..bf5959c34 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_2.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_3.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_3.tflite new file mode 100644 index 000000000..f9063c3c1 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_3.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_4.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_4.tflite new file mode 100644 index 000000000..c22f4c005 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_4.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_5.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_5.tflite new file mode 100644 index 000000000..52ab5e58a Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_5.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_6.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_6.tflite new file mode 100644 index 000000000..045c27b53 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_6.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_7.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_7.tflite new file mode 100644 index 000000000..0ed0d3989 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_7.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_8.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_8.tflite new file mode 100644 index 000000000..a93e32c97 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_8.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_9.tflite b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_9.tflite new file mode 100644 index 000000000..cc760686c Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_bin_padded/test_bconv2d_bin_padded_9.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_0.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_0.tflite new file mode 100644 index 000000000..7aea233e8 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_0.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_1.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_1.tflite new file mode 100644 index 000000000..9aec3375e Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_1.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_10.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_10.tflite new file mode 100644 index 000000000..cf04df8da Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_10.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_11.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_11.tflite new file mode 100644 index 000000000..2a183255b Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_11.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_12.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_12.tflite new file mode 100644 index 000000000..90ee94d4d Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_12.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_13.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_13.tflite new file mode 100644 index 000000000..85abb1ddd Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_13.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_14.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_14.tflite new file mode 100644 index 000000000..80b1f8a0a Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_14.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_15.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_15.tflite new file mode 100644 index 000000000..24616ccab Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_15.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_16.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_16.tflite new file mode 100644 index 000000000..cdb26aa9f Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_16.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_17.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_17.tflite new file mode 100644 index 000000000..19eef23e5 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_17.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_18.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_18.tflite new file mode 100644 index 000000000..72a863a18 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_18.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_19.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_19.tflite new file mode 100644 index 000000000..959c3e292 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_19.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_2.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_2.tflite new file mode 100644 index 000000000..e4385ca19 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_2.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_3.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_3.tflite new file mode 100644 index 000000000..6fbaa4aa3 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_3.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_4.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_4.tflite new file mode 100644 index 000000000..1e93b49fa Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_4.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_5.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_5.tflite new file mode 100644 index 000000000..3d1c6eb44 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_5.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_6.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_6.tflite new file mode 100644 index 000000000..50516b382 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_6.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_7.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_7.tflite new file mode 100644 index 000000000..6bbb2ec99 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_7.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_8.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_8.tflite new file mode 100644 index 000000000..1a88f625f Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_8.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_9.tflite b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_9.tflite new file mode 100644 index 000000000..7e8d82083 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8/test_bconv2d_int8_9.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_0.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_0.tflite new file mode 100644 index 000000000..9c15f09bc Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_0.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_1.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_1.tflite new file mode 100644 index 000000000..780966bfa Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_1.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_10.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_10.tflite new file mode 100644 index 000000000..9e26384d0 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_10.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_11.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_11.tflite new file mode 100644 index 000000000..c818846c4 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_11.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_12.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_12.tflite new file mode 100644 index 000000000..11fb79698 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_12.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_13.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_13.tflite new file mode 100644 index 000000000..a66575382 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_13.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_14.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_14.tflite new file mode 100644 index 000000000..e7a9f8ceb Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_14.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_15.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_15.tflite new file mode 100644 index 000000000..174c911d5 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_15.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_16.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_16.tflite new file mode 100644 index 000000000..e6f48341e Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_16.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_17.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_17.tflite new file mode 100644 index 000000000..84f306a75 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_17.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_18.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_18.tflite new file mode 100644 index 000000000..07d6579ac Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_18.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_19.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_19.tflite new file mode 100644 index 000000000..3be6a7a31 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_19.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_2.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_2.tflite new file mode 100644 index 000000000..baf2031d1 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_2.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_3.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_3.tflite new file mode 100644 index 000000000..5977003e9 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_3.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_4.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_4.tflite new file mode 100644 index 000000000..52e90ff38 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_4.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_5.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_5.tflite new file mode 100644 index 000000000..7e44477a0 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_5.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_6.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_6.tflite new file mode 100644 index 000000000..53aa8b4b2 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_6.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_7.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_7.tflite new file mode 100644 index 000000000..73d8b0a48 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_7.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_8.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_8.tflite new file mode 100644 index 000000000..da93752c7 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_8.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_9.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_9.tflite new file mode 100644 index 000000000..28fdc27d0 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO/test_bconv2d_int8_DIDO_9.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_0.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_0.tflite new file mode 100644 index 000000000..7c4cd5c79 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_0.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_1.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_1.tflite new file mode 100644 index 000000000..df47b2cc2 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_1.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_10.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_10.tflite new file mode 100644 index 000000000..033c85607 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_10.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_11.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_11.tflite new file mode 100644 index 000000000..5d4193ef7 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_11.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_12.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_12.tflite new file mode 100644 index 000000000..46dc3ab32 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_12.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_13.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_13.tflite new file mode 100644 index 000000000..5825f9da6 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_13.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_14.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_14.tflite new file mode 100644 index 000000000..0636b6810 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_14.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_15.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_15.tflite new file mode 100644 index 000000000..e2234c10f Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_15.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_16.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_16.tflite new file mode 100644 index 000000000..3b50cda32 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_16.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_17.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_17.tflite new file mode 100644 index 000000000..e3af6b211 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_17.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_18.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_18.tflite new file mode 100644 index 000000000..7a6609430 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_18.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_19.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_19.tflite new file mode 100644 index 000000000..8ce21c0e8 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_19.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_2.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_2.tflite new file mode 100644 index 000000000..073123402 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_2.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_3.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_3.tflite new file mode 100644 index 000000000..3570d622e Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_3.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_4.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_4.tflite new file mode 100644 index 000000000..a406f7186 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_4.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_5.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_5.tflite new file mode 100644 index 000000000..2fcf40904 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_5.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_6.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_6.tflite new file mode 100644 index 000000000..763fb8405 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_6.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_7.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_7.tflite new file mode 100644 index 000000000..282280300 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_7.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_8.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_8.tflite new file mode 100644 index 000000000..0d5c44fa6 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_8.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_9.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_9.tflite new file mode 100644 index 000000000..13a29f927 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_activation/test_bconv2d_int8_DIDO_activation_9.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_0.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_0.tflite new file mode 100644 index 000000000..b7a8f5ada Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_0.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_1.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_1.tflite new file mode 100644 index 000000000..34ee86a1e Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_1.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_10.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_10.tflite new file mode 100644 index 000000000..a63322d8a Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_10.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_11.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_11.tflite new file mode 100644 index 000000000..691c0e515 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_11.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_12.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_12.tflite new file mode 100644 index 000000000..31234e881 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_12.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_13.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_13.tflite new file mode 100644 index 000000000..9d57d25f5 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_13.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_14.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_14.tflite new file mode 100644 index 000000000..b2cb9c2dc Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_14.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_15.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_15.tflite new file mode 100644 index 000000000..ad2dfabe5 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_15.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_16.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_16.tflite new file mode 100644 index 000000000..f08632836 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_16.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_17.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_17.tflite new file mode 100644 index 000000000..224adf593 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_17.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_18.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_18.tflite new file mode 100644 index 000000000..519bafd5d Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_18.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_19.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_19.tflite new file mode 100644 index 000000000..4cc8fb921 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_19.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_2.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_2.tflite new file mode 100644 index 000000000..7e5cfa44a Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_2.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_3.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_3.tflite new file mode 100644 index 000000000..536564f5d Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_3.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_4.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_4.tflite new file mode 100644 index 000000000..299666418 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_4.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_5.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_5.tflite new file mode 100644 index 000000000..a36356bab Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_5.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_6.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_6.tflite new file mode 100644 index 000000000..b4ad0daa2 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_6.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_7.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_7.tflite new file mode 100644 index 000000000..901417255 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_7.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_8.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_8.tflite new file mode 100644 index 000000000..b905381ca Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_8.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_9.tflite b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_9.tflite new file mode 100644 index 000000000..c71c95dcf Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_DIDO_padded/test_bconv2d_int8_DIDO_padded_9.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_0.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_0.tflite new file mode 100644 index 000000000..c0cc59bfe Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_0.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_1.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_1.tflite new file mode 100644 index 000000000..a16759617 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_1.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_10.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_10.tflite new file mode 100644 index 000000000..f38d1e024 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_10.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_11.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_11.tflite new file mode 100644 index 000000000..d613466ea Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_11.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_12.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_12.tflite new file mode 100644 index 000000000..3a6c0aa44 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_12.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_13.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_13.tflite new file mode 100644 index 000000000..ec0c6578f Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_13.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_14.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_14.tflite new file mode 100644 index 000000000..3ed1ad768 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_14.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_15.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_15.tflite new file mode 100644 index 000000000..1bfc058a8 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_15.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_16.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_16.tflite new file mode 100644 index 000000000..49a05cf0c Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_16.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_17.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_17.tflite new file mode 100644 index 000000000..c0776e776 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_17.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_18.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_18.tflite new file mode 100644 index 000000000..becc6f36c Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_18.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_19.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_19.tflite new file mode 100644 index 000000000..7fb5b900a Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_19.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_2.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_2.tflite new file mode 100644 index 000000000..1b71203e6 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_2.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_3.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_3.tflite new file mode 100644 index 000000000..e9e1b3225 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_3.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_4.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_4.tflite new file mode 100644 index 000000000..859ea025a Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_4.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_5.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_5.tflite new file mode 100644 index 000000000..22d2e376a Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_5.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_6.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_6.tflite new file mode 100644 index 000000000..82ae154ff Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_6.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_7.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_7.tflite new file mode 100644 index 000000000..3fd0c5958 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_7.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_8.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_8.tflite new file mode 100644 index 000000000..e548931f2 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_8.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_9.tflite b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_9.tflite new file mode 100644 index 000000000..4a5491710 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_activation/test_bconv2d_int8_activation_9.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_0.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_0.tflite new file mode 100644 index 000000000..32b7f34e2 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_0.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_1.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_1.tflite new file mode 100644 index 000000000..0355dc0f9 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_1.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_10.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_10.tflite new file mode 100644 index 000000000..0a0291dcd Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_10.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_11.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_11.tflite new file mode 100644 index 000000000..160fc5e31 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_11.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_12.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_12.tflite new file mode 100644 index 000000000..bc0213727 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_12.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_13.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_13.tflite new file mode 100644 index 000000000..556cbe8ce Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_13.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_14.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_14.tflite new file mode 100644 index 000000000..9d8be07f1 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_14.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_15.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_15.tflite new file mode 100644 index 000000000..9a260faea Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_15.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_16.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_16.tflite new file mode 100644 index 000000000..fec6c1cd2 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_16.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_17.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_17.tflite new file mode 100644 index 000000000..829ce662a Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_17.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_18.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_18.tflite new file mode 100644 index 000000000..4e8cbd86c Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_18.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_19.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_19.tflite new file mode 100644 index 000000000..8880d49d9 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_19.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_2.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_2.tflite new file mode 100644 index 000000000..5038a8ae8 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_2.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_3.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_3.tflite new file mode 100644 index 000000000..f4cb4216d Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_3.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_4.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_4.tflite new file mode 100644 index 000000000..c38632e4c Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_4.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_5.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_5.tflite new file mode 100644 index 000000000..b039a0f8b Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_5.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_6.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_6.tflite new file mode 100644 index 000000000..76d8a3a40 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_6.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_7.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_7.tflite new file mode 100644 index 000000000..eae8199d1 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_7.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_8.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_8.tflite new file mode 100644 index 000000000..e9faeb87b Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_8.tflite differ diff --git a/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_9.tflite b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_9.tflite new file mode 100644 index 000000000..e01c182e3 Binary files /dev/null and b/integration_tests/models/bnns/test_bconv2d_int8_padded/test_bconv2d_int8_padded_9.tflite differ diff --git a/integration_tests/models/complex_models/8x8/test_cnn_classifier/test_cnn_classifier_0.tflite b/integration_tests/models/complex_models/8x8/test_cnn_classifier/test_cnn_classifier_0.tflite new file mode 100644 index 000000000..c934591a3 Binary files /dev/null and b/integration_tests/models/complex_models/8x8/test_cnn_classifier/test_cnn_classifier_0.tflite differ diff --git a/integration_tests/models/complex_models/8x8/test_mobilenet_v1/in1.npy b/integration_tests/models/complex_models/8x8/test_mobilenet_v1/in1.npy new file mode 100644 index 000000000..26f942f18 Binary files /dev/null and b/integration_tests/models/complex_models/8x8/test_mobilenet_v1/in1.npy differ diff --git a/integration_tests/models/complex_models/8x8/test_mobilenet_v1/params.yaml b/integration_tests/models/complex_models/8x8/test_mobilenet_v1/params.yaml new file mode 100644 index 000000000..884d4342c --- /dev/null +++ b/integration_tests/models/complex_models/8x8/test_mobilenet_v1/params.yaml @@ -0,0 +1 @@ +MAX_ABS_ERROR: 2.0 diff --git a/integration_tests/models/complex_models/8x8/test_mobilenet_v1/test_mobilenet_v1_0.tflite b/integration_tests/models/complex_models/8x8/test_mobilenet_v1/test_mobilenet_v1_0.tflite new file mode 100644 index 000000000..e45a06fcd Binary files /dev/null and b/integration_tests/models/complex_models/8x8/test_mobilenet_v1/test_mobilenet_v1_0.tflite differ diff --git a/integration_tests/models/complex_models/8x8/test_mobilenet_v2/in1.npy b/integration_tests/models/complex_models/8x8/test_mobilenet_v2/in1.npy new file mode 100644 index 000000000..f524a6115 Binary files /dev/null and b/integration_tests/models/complex_models/8x8/test_mobilenet_v2/in1.npy differ diff --git a/integration_tests/models/complex_models/8x8/test_mobilenet_v2/params.yaml b/integration_tests/models/complex_models/8x8/test_mobilenet_v2/params.yaml new file mode 100644 index 000000000..df8a8a197 --- /dev/null +++ b/integration_tests/models/complex_models/8x8/test_mobilenet_v2/params.yaml @@ -0,0 +1,9 @@ +MAX_ABS_ERROR: 3.0 +COMPILER_FLAGS: + - ["xcore-naming-prefix", "model_mobilenetv2"] + - ["xcore-op-split-top-op", "0,7"] + - ["xcore-op-split-bottom-op", "6,14"] + - ["xcore-op-split-num-splits", "8,4"] + - ["xcore-op-split-tensor-arena", "True"] + - [xcore-conv-channelwise-split-size, "70000"] + - ["xcore-liveness-range-for-paging", "1000"] \ No newline at end of file diff --git a/integration_tests/models/complex_models/8x8/test_mobilenet_v2/test_mobilenetv2.tflite b/integration_tests/models/complex_models/8x8/test_mobilenet_v2/test_mobilenetv2.tflite new file mode 100644 index 000000000..137398069 Binary files /dev/null and b/integration_tests/models/complex_models/8x8/test_mobilenet_v2/test_mobilenetv2.tflite differ diff --git a/integration_tests/models/complex_models/8x8/test_mobilenet_v2_paging/in1.npy b/integration_tests/models/complex_models/8x8/test_mobilenet_v2_paging/in1.npy new file mode 100644 index 000000000..f524a6115 Binary files /dev/null and b/integration_tests/models/complex_models/8x8/test_mobilenet_v2_paging/in1.npy differ diff --git a/integration_tests/models/complex_models/8x8/test_mobilenet_v2_paging/params.yaml b/integration_tests/models/complex_models/8x8/test_mobilenet_v2_paging/params.yaml new file mode 100644 index 000000000..9f9822d3a --- /dev/null +++ b/integration_tests/models/complex_models/8x8/test_mobilenet_v2_paging/params.yaml @@ -0,0 +1,10 @@ +MAX_ABS_ERROR: 3.0 +COMPILER_FLAGS: + - ["xcore-naming-prefix", "model_mobilenetv2_paging"] + - ["xcore-op-split-top-op", "0,7"] + - ["xcore-op-split-bottom-op", "6,14"] + - ["xcore-op-split-num-splits", "8,4"] + - ["xcore-op-split-tensor-arena", "True"] + - [xcore-conv-channelwise-split-size, "70000"] + - ["xcore-liveness-range-for-paging", "5"] + - ["xcore-enable-paging", "True"] \ No newline at end of file diff --git a/integration_tests/models/complex_models/8x8/test_mobilenet_v2_paging/test_mobilenetv2.tflite b/integration_tests/models/complex_models/8x8/test_mobilenet_v2_paging/test_mobilenetv2.tflite new file mode 100644 index 000000000..137398069 Binary files /dev/null and b/integration_tests/models/complex_models/8x8/test_mobilenet_v2_paging/test_mobilenetv2.tflite differ diff --git a/integration_tests/models/complex_models/bnns/test_bnn/test_bnn_0.tflite b/integration_tests/models/complex_models/bnns/test_bnn/test_bnn_0.tflite new file mode 100644 index 000000000..cf99902b6 Binary files /dev/null and b/integration_tests/models/complex_models/bnns/test_bnn/test_bnn_0.tflite differ diff --git a/integration_tests/models/complex_models/float32/test_audio_model/model_float32.tflite b/integration_tests/models/complex_models/float32/test_audio_model/model_float32.tflite new file mode 100644 index 000000000..b2b64e14d Binary files /dev/null and b/integration_tests/models/complex_models/float32/test_audio_model/model_float32.tflite differ diff --git a/integration_tests/models/float32/test_concatenate/generate.py b/integration_tests/models/float32/test_concatenate/generate.py new file mode 100644 index 000000000..e138f3e77 --- /dev/null +++ b/integration_tests/models/float32/test_concatenate/generate.py @@ -0,0 +1,37 @@ +import numpy as np +import tensorflow as tf +from tensorflow import lite as tfl + +i = 0 + +def generate_concatenate_model(input_shapes, dtype, axis): + input_data = [tf.keras.Input(shape=input_shape, dtype=dtype, batch_size=1) for input_shape in input_shapes] + concatenated_output = tf.keras.layers.Concatenate(axis=axis)(input_data) + model = tf.keras.Model(inputs=input_data, outputs=concatenated_output) + converter = tfl.TFLiteConverter.from_keras_model(model) + if dtype == tf.int8 or dtype == tf.int16: + def representative_dataset_gen(): + for _ in range(100): + yield [np.random.uniform(low=-127, high=127, size=shp).astype(dtype.as_numpy_dtype) for shp in input_shapes] + converter.optimizations = [tf.lite.Optimize.DEFAULT] + converter.representative_dataset = representative_dataset_gen + if dtype == tf.int8: + converter.target_spec.supported_ops = [tfl.OpsSet.TFLITE_BUILTINS_INT8] + else: + converter.target_spec.supported_ops = [tfl.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8] + converter.inference_input_type = dtype + converter.inference_output_type = dtype + tflite_model = converter.convert() + global i + model_name = f'test_concatenate_{i}.tflite' + i+=1 + with open(model_name, 'wb') as f: + f.write(tflite_model) + print(f'Model saved: {model_name}') + + +generate_concatenate_model([(64), (64)], tf.float32, 0) +generate_concatenate_model([(2, 3), (2, 3)], tf.float32, 1) +generate_concatenate_model([(2, 3, 5), (2, 3, 5)], tf.float32, 0) +generate_concatenate_model([(2, 6, 5, 2), (2, 6, 5, 2)], tf.float32, 1) + diff --git a/integration_tests/models/float32/test_concatenate/params.yaml b/integration_tests/models/float32/test_concatenate/params.yaml new file mode 100644 index 000000000..b684ee66c --- /dev/null +++ b/integration_tests/models/float32/test_concatenate/params.yaml @@ -0,0 +1 @@ +MAX_ABS_ERROR: 0.0 diff --git a/integration_tests/models/float32/test_concatenate/test_concatenate_0.tflite b/integration_tests/models/float32/test_concatenate/test_concatenate_0.tflite new file mode 100644 index 000000000..b0d6dd0dd Binary files /dev/null and b/integration_tests/models/float32/test_concatenate/test_concatenate_0.tflite differ diff --git a/integration_tests/models/float32/test_concatenate/test_concatenate_1.tflite b/integration_tests/models/float32/test_concatenate/test_concatenate_1.tflite new file mode 100644 index 000000000..312c1916a Binary files /dev/null and b/integration_tests/models/float32/test_concatenate/test_concatenate_1.tflite differ diff --git a/integration_tests/models/float32/test_concatenate/test_concatenate_2.tflite b/integration_tests/models/float32/test_concatenate/test_concatenate_2.tflite new file mode 100644 index 000000000..69d78982c Binary files /dev/null and b/integration_tests/models/float32/test_concatenate/test_concatenate_2.tflite differ diff --git a/integration_tests/models/float32/test_concatenate/test_concatenate_3.tflite b/integration_tests/models/float32/test_concatenate/test_concatenate_3.tflite new file mode 100644 index 000000000..47825bc5a Binary files /dev/null and b/integration_tests/models/float32/test_concatenate/test_concatenate_3.tflite differ diff --git a/integration_tests/models/float32/test_pad/params.yaml b/integration_tests/models/float32/test_pad/params.yaml new file mode 100644 index 000000000..b684ee66c --- /dev/null +++ b/integration_tests/models/float32/test_pad/params.yaml @@ -0,0 +1 @@ +MAX_ABS_ERROR: 0.0 diff --git a/integration_tests/models/float32/test_pad/test_pad_21.tflite b/integration_tests/models/float32/test_pad/test_pad_21.tflite new file mode 100644 index 000000000..95e04bc6e Binary files /dev/null and b/integration_tests/models/float32/test_pad/test_pad_21.tflite differ diff --git a/integration_tests/models/float32/test_pad/test_pad_22.tflite b/integration_tests/models/float32/test_pad/test_pad_22.tflite new file mode 100644 index 000000000..30c33d4b2 Binary files /dev/null and b/integration_tests/models/float32/test_pad/test_pad_22.tflite differ diff --git a/integration_tests/models/float32/test_pad/test_pad_23.tflite b/integration_tests/models/float32/test_pad/test_pad_23.tflite new file mode 100644 index 000000000..72e818a19 Binary files /dev/null and b/integration_tests/models/float32/test_pad/test_pad_23.tflite differ diff --git a/integration_tests/models/float32/test_pad/test_pad_24.tflite b/integration_tests/models/float32/test_pad/test_pad_24.tflite new file mode 100644 index 000000000..cee6c533d Binary files /dev/null and b/integration_tests/models/float32/test_pad/test_pad_24.tflite differ diff --git a/integration_tests/models/float32/test_pad/test_pad_25.tflite b/integration_tests/models/float32/test_pad/test_pad_25.tflite new file mode 100644 index 000000000..ee741c656 Binary files /dev/null and b/integration_tests/models/float32/test_pad/test_pad_25.tflite differ diff --git a/integration_tests/models/float32/test_pad/test_pad_29.tflite b/integration_tests/models/float32/test_pad/test_pad_29.tflite new file mode 100644 index 000000000..e67cd1e47 Binary files /dev/null and b/integration_tests/models/float32/test_pad/test_pad_29.tflite differ diff --git a/integration_tests/models/float32/test_slice/params.yaml b/integration_tests/models/float32/test_slice/params.yaml new file mode 100644 index 000000000..b684ee66c --- /dev/null +++ b/integration_tests/models/float32/test_slice/params.yaml @@ -0,0 +1 @@ +MAX_ABS_ERROR: 0.0 diff --git a/integration_tests/models/float32/test_slice/test_slice_13.tflite b/integration_tests/models/float32/test_slice/test_slice_13.tflite new file mode 100644 index 000000000..0a7c3abb5 Binary files /dev/null and b/integration_tests/models/float32/test_slice/test_slice_13.tflite differ diff --git a/integration_tests/models/float32/test_slice/test_slice_14.tflite b/integration_tests/models/float32/test_slice/test_slice_14.tflite new file mode 100644 index 000000000..d8618322c Binary files /dev/null and b/integration_tests/models/float32/test_slice/test_slice_14.tflite differ diff --git a/integration_tests/models/float32/test_slice/test_slice_15.tflite b/integration_tests/models/float32/test_slice/test_slice_15.tflite new file mode 100644 index 000000000..900454844 Binary files /dev/null and b/integration_tests/models/float32/test_slice/test_slice_15.tflite differ diff --git a/integration_tests/models/float32/test_slice/test_slice_16.tflite b/integration_tests/models/float32/test_slice/test_slice_16.tflite new file mode 100644 index 000000000..0391570a4 Binary files /dev/null and b/integration_tests/models/float32/test_slice/test_slice_16.tflite differ diff --git a/integration_tests/models/float32/test_slice/test_slice_17.tflite b/integration_tests/models/float32/test_slice/test_slice_17.tflite new file mode 100644 index 000000000..bce5b0f3c Binary files /dev/null and b/integration_tests/models/float32/test_slice/test_slice_17.tflite differ diff --git a/integration_tests/models/float32/test_slice/test_slice_18.tflite b/integration_tests/models/float32/test_slice/test_slice_18.tflite new file mode 100644 index 000000000..ed004703d Binary files /dev/null and b/integration_tests/models/float32/test_slice/test_slice_18.tflite differ diff --git a/integration_tests/models/float32/test_slice/test_slice_19.tflite b/integration_tests/models/float32/test_slice/test_slice_19.tflite new file mode 100644 index 000000000..66101e48a Binary files /dev/null and b/integration_tests/models/float32/test_slice/test_slice_19.tflite differ diff --git a/integration_tests/models/float32/test_slice/test_slice_20.tflite b/integration_tests/models/float32/test_slice/test_slice_20.tflite new file mode 100644 index 000000000..746f5bd98 Binary files /dev/null and b/integration_tests/models/float32/test_slice/test_slice_20.tflite differ diff --git a/integration_tests/models/float32/test_slice/test_slice_21.tflite b/integration_tests/models/float32/test_slice/test_slice_21.tflite new file mode 100644 index 000000000..4c85d7c2f Binary files /dev/null and b/integration_tests/models/float32/test_slice/test_slice_21.tflite differ diff --git a/integration_tests/models/float32/test_slice/test_slice_22.tflite b/integration_tests/models/float32/test_slice/test_slice_22.tflite new file mode 100644 index 000000000..371a447ab Binary files /dev/null and b/integration_tests/models/float32/test_slice/test_slice_22.tflite differ diff --git a/integration_tests/models/float32/test_slice/test_slice_23.tflite b/integration_tests/models/float32/test_slice/test_slice_23.tflite new file mode 100644 index 000000000..4465d98c6 Binary files /dev/null and b/integration_tests/models/float32/test_slice/test_slice_23.tflite differ diff --git a/integration_tests/models/float32/test_slice/test_slice_24.tflite b/integration_tests/models/float32/test_slice/test_slice_24.tflite new file mode 100644 index 000000000..ab9b1304f Binary files /dev/null and b/integration_tests/models/float32/test_slice/test_slice_24.tflite differ diff --git a/integration_tests/models/float32/test_slice/test_slice_25.tflite b/integration_tests/models/float32/test_slice/test_slice_25.tflite new file mode 100644 index 000000000..463cbe281 Binary files /dev/null and b/integration_tests/models/float32/test_slice/test_slice_25.tflite differ diff --git a/integration_tests/runner.py b/integration_tests/runner.py new file mode 100644 index 000000000..e9d6a9ba6 --- /dev/null +++ b/integration_tests/runner.py @@ -0,0 +1,345 @@ +import time +import platform +import shutil +from pathlib import Path +import logging +import tempfile +from _pytest.fixtures import FixtureRequest +import numpy as np +import os +import sys +import subprocess +import larq_compute_engine as lce +import tensorflow as tf +from xmos_ai_tools.xinterpreters import TFLMHostInterpreter +from xmos_ai_tools import xformer +import xmos_ai_tools.runtime as rt +from xmos_ai_tools.io_server import IOServer +import yaml +from abc import ABC, abstractmethod, abstractproperty + +tf.keras.utils.set_random_seed(42) + +MAX_ABS_ERROR = 1 +ABS_AVG_ERROR = 1.0 / 4 +AVG_ABS_ERROR = 0.28 # 1.0 / 4 +REQUIRED_OUTPUTS = 2048 +LOGGER = logging.getLogger(__name__) + +FILE_PATH = Path(__file__).resolve() +ROOT_DIR = FILE_PATH.parents[1] +MAIN_CPP_PATH = FILE_PATH.parents[0] / "compile_test.cpp" +LIB_XUD_PATH = ROOT_DIR / "third_party" / "lib_xud" +DEVICE_TEST_PATH = FILE_PATH.parents[0] / "device_test" +LIB_TFLM_DIR_PATH = ROOT_DIR / "third_party" / "lib_tflite_micro" +LIB_NN_INCLUDE_PATH = ROOT_DIR / "third_party" / "lib_nn" +TFLM_SUBMODULES_PATH = LIB_TFLM_DIR_PATH / "lib_tflite_micro" / "submodules" +TFLM_INCLUDE_PATH = TFLM_SUBMODULES_PATH / "tflite-micro" +FLATBUFFERS_INCLUDE_PATH = TFLM_SUBMODULES_PATH / "flatbuffers" / "include" +# Assumes old version of clang +CPP_COMPILER = "g++" if platform.system() == "Linux" else "clang++" + + +def dont_throw(obj, attr_name, method_name): + try: + getattr(getattr(obj, attr_name), method_name)() + except AttributeError as e: + print(e) + pass + + +class AbstractRunner(ABC): + @abstractmethod + def predict(self, inputs: list) -> list: + pass + + +class AbstractRefRunner(AbstractRunner): + @abstractproperty + def input_details(self) -> tuple: + """Abstract property to get input details of model + + Returns: + tuple[list[type], list[list[int]]] + A tuple containing a list of dtypes and a list of shapes + expected by each of the model's inputs. + """ + pass + + +class AbstractXFRunner(AbstractRunner): + def __init__(self, model, thread_count, compiler_flags=None): + temp_dir = tempfile.TemporaryDirectory(suffix=str(os.getpid())) + self._temp_dir = temp_dir + self._dir_path = Path(temp_dir.name) + input_file = self._dir_path / "input.tflite" + with open(input_file, "wb") as fd: + fd.write(model) + output_file = self._dir_path / "model.tflite" + hyper_params = [("xcore-thread-count", thread_count)] + if compiler_flags: + hyper_params += compiler_flags + xformer.convert(input_file, output_file, hyper_params) + with open(output_file, "rb") as fd: + model = fd.read() + # We use interpreter for compiled too (for output details), it's a hack + self._interpreter = TFLMHostInterpreter() + self._interpreter.set_model(model_content=model, secondary_memory=False) + self._dets = self._interpreter.get_output_details() + + # Try/except in case we cancel operation before interpreter/dir initialised + def __del__(self): + dont_throw(self, "_interpreter", "close") + dont_throw(self, "_temp_dir", "cleanup") + + +class BnnInterpreter(AbstractRefRunner): + def __init__(self, model_content): + LOGGER.info("Creating LCE interpreter") + self._interpreter = lce.testing.Interpreter( + model_content, num_threads=1, use_reference_bconv=True + ) + + def predict(self, inputs): + LOGGER.info("Invoking LCE interpreter") + outs = self._interpreter.predict(inputs) + return [outs] if len(outs) == 1 else outs + + @property + def input_details(self): + return self._interpreter.input_types, self._interpreter.input_shapes + + +class TFLiteInterpreter(AbstractRefRunner): + def __init__(self, model_content): + LOGGER.info("Creating TFLite interpreter") + self._interpreter = tf.lite.Interpreter( + model_content=model_content, + experimental_op_resolver_type=tf.lite.experimental.OpResolverType.BUILTIN_REF, + experimental_preserve_all_tensors=True, + ) + self._interpreter.allocate_tensors() + dets = self._interpreter.get_input_details() + self._in_ids = [i["index"] for i in dets] + self._in_shapes = [i["shape"] for i in dets] + self._in_types = [i["dtype"] for i in dets] + + def predict(self, inputs): + LOGGER.info("Invoking TFLite interpreter") + self._interpreter.reset_all_variables() + for idx, input in zip(self._in_ids, inputs): + self._interpreter.set_tensor(idx, input) + self._interpreter.invoke() + dets = self._interpreter.get_output_details() + return [self._interpreter.get_tensor(i["index"]) for i in dets] + + @property + def input_details(self): + return self._in_types, self._in_shapes + + +class XFHostRuntime(AbstractXFRunner): + def __init__(self, model_content, thread_count): + path_var = os.path.dirname(rt.__file__) + super().__init__(model_content, thread_count) + self._model_exe_path = self._dir_path / "a.out" + cmd = [ + CPP_COMPILER, + "-DTF_LITE_DISABLE_X86_NEON", + "-DTF_LITE_STATIC_MEMORY", + "-DNO_INTERPRETER", + "-std=c++14", + f"-I{path_var}/include", + f"-I{self._dir_path}", + "-g", + "-O0", + f"-L{path_var}/lib", + f"{self._dir_path}/model.tflite.cpp", + f"{MAIN_CPP_PATH}", + "-o", + f"{self._model_exe_path}", + "-lhost_xtflitemicro", + ] + print(" ".join(cmd)) + run_cmd(cmd) + + def predict(self, inputs): + # main.cpp expect inputs as in{n} and writes outputs as out{m} for each input/output + for i, inp in enumerate(inputs): + input_name = self._dir_path / f"in{i}" + inp.tofile(input_name) + run_cmd([str(self._model_exe_path)], self._dir_path) + en = enumerate([(i["dtype"], i["shape"]) for i in self._dets]) + return [ + np.fromfile(self._dir_path / f"out{i}", dtype=d).reshape(s) + for i, (d, s) in en + ] + + def __del__(self): + dont_throw(self, "_interpreter", "close") + super().__del__() + + +class XFDeviceRuntime(AbstractXFRunner): + def __init__(self, model_content, thread_count): + super().__init__(model_content, thread_count) + # compile model, two dirs because xmake + dst_dir = self._dir_path / "device_test" + # dst_dir = DEVICE_TEST_PATH + shutil.copytree(LIB_XUD_PATH, self._dir_path / "lib_xud") + shutil.copytree(DEVICE_TEST_PATH, dst_dir) + shutil.copy(self._dir_path / "model.tflite.h", dst_dir / "src/") + shutil.copy(self._dir_path / "model.tflite.cpp", dst_dir / "src/") + run_cmd(["xmake", "-j4"], working_dir=dst_dir) + xe_path = dst_dir / "bin" / next((dst_dir / "bin").glob("*.xe")).name + # overwriting _interpreter from super() + dont_throw(self, "_interpreter", "close") + subprocess.run(["xrun", "--id", "0", xe_path]) + time.sleep(0.5) + self._interpreter = IOServer(output_details=self._dets) + self._interpreter.connect() + + def predict(self, inputs): + self._interpreter.reset() + for i, inp in enumerate(inputs): + self._interpreter.write_input_tensor(inp.tobytes(), tensor_num=i) + self._interpreter.start_inference() + return [self._interpreter.read_output_tensor(i) for i in range(len(self._dets))] + + +class XFHostInterpreter(AbstractXFRunner): + def __init__(self, model_content, thread_count, compiler_flags): + super().__init__(model_content, thread_count, compiler_flags) + + def predict(self, inputs): + self._interpreter.reset() + for i, j in enumerate(inputs): + self._interpreter.set_tensor(i, j) + self._interpreter.invoke() + return [self._interpreter.get_tensor(i["index"]) for i in self._dets] + + +def run_cmd(cmd, working_dir=None): + try: + subprocess.run( + cmd, + cwd=working_dir, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + check=True, + ) + except subprocess.CalledProcessError as e: + print(e.output) + sys.exit(1) + + +def get_params(model_path: Path) -> dict: + params = {} + params["COMPILER_FLAGS"] = "" + params["MAX_ABS_ERROR"] = MAX_ABS_ERROR + params["ABS_AVG_ERROR"] = ABS_AVG_ERROR + params["AVG_ABS_ERROR"] = AVG_ABS_ERROR + params["REQUIRED_OUTPUTS"] = REQUIRED_OUTPUTS + yaml_filename = os.path.join(os.path.dirname(model_path), "params.yaml") + if os.path.exists(yaml_filename): + with open(yaml_filename) as f: + params.update(yaml.safe_load(f)) + return params + + +def get_input_tensors(runner: AbstractRefRunner, parent_dir: Path) -> list: + types, shapes = runner.input_details + ins = [] + for i, (s, d) in enumerate(zip(shapes, types)): + f = parent_dir.joinpath(f"in{i+1}.npy") + if f.is_file(): + ins.append(np.load(f)) + elif d == np.float32: + ins.append(np.random.rand(*s).astype(np.float32)) + else: + mn, mx = np.iinfo(d).min, np.iinfo(d).max + ins.append(np.random.randint(mn, high=mx, size=s, dtype=d)) + return ins + + +# Run the model on Larq/TFLite interpreter, +# compare the output with xformed model on XCore TFLM +def test_model(request: FixtureRequest, filename: str) -> None: + # for attaching a debugger + flags = ["bnn", "device", "compiled", "s", "tc"] + opt_dict = {i: request.config.getoption(i) for i in flags} + if opt_dict["s"]: + time.sleep(5) + + model_path = Path(filename).resolve() + params = get_params(model_path) + + if not model_path.exists(): + LOGGER.error("Model file not found!") + assert False + # read in model from file + with open(model_path, "rb") as fd: + model_content = fd.read() + + if opt_dict["bnn"]: + ref_interpreter = BnnInterpreter(model_content) + else: + ref_interpreter = TFLiteInterpreter(model_content) + + # some models are special (such as detection_postprocess), they don't have + # a reference int8 TFLite operator and need to be loaded separately + special_path = model_path.parent.joinpath("special.tflite.xc") + if special_path.is_file(): + LOGGER.info("Processing special model") + with open(special_path, "rb") as fd: + model_content = fd.read() + + LOGGER.info("Invoking xformer to get xformed model...") + if opt_dict["compiled"]: + xf_runner = XFHostRuntime(model_content, opt_dict["tc"]) + elif opt_dict["device"]: + xf_runner = XFDeviceRuntime(model_content, opt_dict["tc"]) + else: + xf_runner = XFHostInterpreter(model_content, opt_dict["tc"], params["COMPILER_FLAGS"]) + + # Run tests + num_fails = run_out_count = run_out_err = run_out_abs_err = test = max_abs_err = 0 + while run_out_count < params["REQUIRED_OUTPUTS"]: + LOGGER.info(f"Run #{test}") + test += 1 + input_tensors = get_input_tensors(ref_interpreter, model_path.parent) + ref_outputs = ref_interpreter.predict(input_tensors) + xf_outputs = xf_runner.predict(input_tensors) + # Compare outputs + errors = np.concatenate( + [(a - b).reshape(-1) for a, b in zip(ref_outputs, xf_outputs)] + ) + + if not len(errors): + continue + + run_out_count += np.prod(errors.shape) + run_out_err += np.sum(errors) + run_out_abs_err += np.sum(np.abs(errors)) + max_abs_err = max(np.max(np.abs(errors)), max_abs_err) + + avg_err = run_out_err / run_out_count + avg_abs_err = run_out_abs_err / run_out_count + LOGGER.info(f"{max_abs_err} {avg_err} {avg_abs_err}") + + def fail(msg: str) -> None: + nonlocal num_fails + num_fails += 1 + LOGGER.error(msg) + LOGGER.error(f"Run #{test} failed") + + if max_abs_err > params["MAX_ABS_ERROR"]: + fail(f"Max abs error is too high: {max_abs_err}") + + if abs(avg_err) > params["ABS_AVG_ERROR"]: + fail(f"Abs avg error is too high: {abs(avg_err)}") + + if avg_abs_err > params["AVG_ABS_ERROR"]: + fail(f"Avg abs error is too high: {avg_abs_err}") + + assert num_fails == 0 diff --git a/mypy.ini b/mypy.ini deleted file mode 100644 index 036e2b653..000000000 --- a/mypy.ini +++ /dev/null @@ -1,40 +0,0 @@ -[mypy] -python_version = 3.6 -strict = True -implicit_reexport = True -cache_dir = /dev/nul -show_column_numbers = True -follow_imports = silent - -[mypy-tflite2xcore.*.schema_py_generated] -ignore_errors = True - -[mypy-numpy.*] -ignore_missing_imports = True - -[mypy-tensorflow.*] -ignore_missing_imports = True - -[mypy-dill.*] -ignore_missing_imports = True - -[mypy-pytest.*] -ignore_missing_imports = True - -[mypy-_pytest.*] -ignore_missing_imports = True - -[mypy-portalocker.*] -ignore_missing_imports = True - -[mypy-aenum.*] -ignore_missing_imports = True - -[mypy-flatbuffers.*] -ignore_missing_imports = True - -[mypy-larq.*] -ignore_missing_imports = True - -[mypy-larq_compute_engine.*] -ignore_missing_imports = True diff --git a/python/README.md b/python/README.md new file mode 100644 index 000000000..36e364bf3 --- /dev/null +++ b/python/README.md @@ -0,0 +1,4 @@ +Documentation +------------- + +Click [here](https://github.com/xmos/ai_tools/blob/!!COMMIT_HASH!!/README.md) for documentation on using xmos-ai-tools to deploy AI models on xcore. \ No newline at end of file diff --git a/python/pyproject.toml b/python/pyproject.toml new file mode 100644 index 000000000..00fcd75e9 --- /dev/null +++ b/python/pyproject.toml @@ -0,0 +1,11 @@ +[build-system] +requires = [ + "setuptools>=61", + "setuptools_scm>=8.0.0", + "wheel" +] +build-backend = "setuptools.build_meta" + +[tool.setuptools_scm] +root = ".." +local_scheme = "no-local-version" \ No newline at end of file diff --git a/python/setup.py b/python/setup.py new file mode 100644 index 000000000..05c5f34aa --- /dev/null +++ b/python/setup.py @@ -0,0 +1,126 @@ +#!/usr/bin/python3 + +# Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +# XMOS Public License: Version 1 + +import platform +from typing import Union + +from setuptools import setup, find_namespace_packages +from setuptools.command.install import install +import pathlib +import os +import subprocess + +# Find path to xcore-opt binary +here = pathlib.Path(__file__).parent.resolve() +exe_suffix = ".exe" if platform.system() == "Windows" else "" +XCOREOPT_BINARY: Union[pathlib.Path, str] = pathlib.Path.joinpath( + here.parent, "xformer", "bazel-bin", "xcore-opt" +) +XCOREOPT_BINARY = str(XCOREOPT_BINARY) + exe_suffix + +# Get the long description from the README file +LONG_README = (here / "README.md").read_text(encoding="utf-8") + + +# Fix link in Readme to current commit hash +def get_git_revision_hash() -> str: + return subprocess.check_output(["git", "rev-parse", "HEAD"]).decode("ascii").strip() + + +LONG_README = LONG_README.replace("!!COMMIT_HASH!!", get_git_revision_hash()) + +# xtflm_interpreter path and libs from lib_tflite_micro +XTFLM_INTERPRETER_LIBS = [ + "libs/linux/xtflm_python.so", + "libs/linux/xtflm_python.so.1.0.1", + "libs/macos/xtflm_python.dylib", + "libs/macos/xtflm_python.1.0.1.dylib", + "libs/windows/xtflm_python.dll", +] + +# xtflm_interpreter requires numpy +REQUIRED_PACKAGES = [ + "numpy<2.0", + "tflite>=2.4.0", +] + +# Force platform specific wheel. +# https://stackoverflow.com/questions/45150304 +try: + from wheel.bdist_wheel import bdist_wheel as _bdist_wheel + + class bdist_wheel(_bdist_wheel): + def finalize_options(self): + _bdist_wheel.finalize_options(self) + self.root_is_pure = False + + def get_tag(self): + python, abi, plat = _bdist_wheel.get_tag(self) + # We don't contain any python extensions so are version agnostic + # but still want to be platform specific. + python, abi = "py3", "none" + return python, abi, plat + +except ImportError: + bdist_wheel = None + + +# See https://github.com/bigartm/bigartm/issues/840 +class install_plat_lib(install): + def finalize_options(self): + install.finalize_options(self) + self.install_lib = self.install_platlib + + +# add device lib and headers as package data +device_files = { + root.replace(os.sep, "."): ["*.h", "*.a", "*.lib", "*.make", "*.cmake"] + for root, d, f in os.walk(os.path.join("xmos_ai_tools", "runtime")) +} + +# add host interpreter lib +package_files = {"xmos_ai_tools.xinterpreters": XTFLM_INTERPRETER_LIBS} +package_files.update(device_files) + +setup( + name="xmos_ai_tools", + author="XMOS", + author_email="support@xmos.com", + license="LICENSE.txt", + description="XMOS AI Tools", + long_description=LONG_README, + long_description_content_type="text/markdown", + url="https://github.com/xmos/ai_tools", + classifiers=[ + "License :: Other/Proprietary License", + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Intended Audience :: Education", + "Intended Audience :: Science/Research", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Topic :: Scientific/Engineering", + "Topic :: Scientific/Engineering :: Mathematics", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + "Topic :: Software Development", + "Topic :: Software Development :: Libraries", + "Topic :: Software Development :: Libraries :: Python Modules", + ], + python_requires=">=3.9", + packages=find_namespace_packages(), + install_requires=REQUIRED_PACKAGES, + package_data=package_files, + data_files=[ + ("Scripts" if platform.system() == "Windows" else "bin", [XCOREOPT_BINARY]) + ], + cmdclass={ + "bdist_wheel": bdist_wheel, + "install": install_plat_lib, + }, + keywords="tensorflow binarized neural networks", +) diff --git a/python/xmos_ai_tools/__init__.py b/python/xmos_ai_tools/__init__.py new file mode 100644 index 000000000..4b6c40f8f --- /dev/null +++ b/python/xmos_ai_tools/__init__.py @@ -0,0 +1,7 @@ +from importlib.metadata import version, PackageNotFoundError + +try: + __version__ = version(__name__) +except PackageNotFoundError: + # package is not installed + pass diff --git a/python/xmos_ai_tools/io_server/__init__.py b/python/xmos_ai_tools/io_server/__init__.py new file mode 100644 index 000000000..2b2a9fee0 --- /dev/null +++ b/python/xmos_ai_tools/io_server/__init__.py @@ -0,0 +1,151 @@ +# Copyright (c) 2020, XMOS Ltd, All rights reserved + +import usb +from typing import Tuple +import numpy as np + +IOSERVER_INVOKE = int(0x01) +IOSERVER_TENSOR_SEND_OUTPUT = int(0x02) +IOSERVER_TENSOR_RECV_INPUT = int(0x03) +IOSERVER_RESET = int(0x07) +IOSERVER_EXIT = int(0x08) + + +class IOServerError(Exception): + """Error from device""" + + pass + + +class IOError(IOServerError): + """IO Error from device""" + + pass + + +def handle_usb_error(func): + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except usb.core.USBError as e: + print(f"USB error {e}") + if e.backend_error_code == usb.backend.libusb1.LIBUSB_ERROR_PIPE: + raise IOError() + else: + raise IOServerError(f"Wow...") from e + + return wrapper + + +class IOServer: + def __init__(self, output_details: Tuple[dict, ...] = None, timeout=5000): + self.__out_ep = None + self.__in_ep = None + self._dev = None + self._output_details = output_details + self._timeout = timeout + self._max_block_size = 512 # TODO read from (usb) device? + super().__init__() + + def bytes_to_arr(self, data_bytes, tensor_num): + if self._output_details: + d = self._output_details[tensor_num] + s = d["shape"] + return np.frombuffer(data_bytes, dtype=d["dtype"])[: np.prod(s)].reshape(s) + return np.frombuffer(data_bytes, dtype=np.uint8) + + def write_input_tensor(self, raw_img, tensor_num=0, model_num=0): + self._download_data( + IOSERVER_TENSOR_RECV_INPUT, + raw_img, + tensor_num=tensor_num, + model_num=model_num, + ) + + def read_output_tensor(self, tensor_num=0, model_num=0): + # Retrieve result from device + data_read = self._upload_data( + IOSERVER_TENSOR_SEND_OUTPUT, + model_num=model_num, + tensor_num=tensor_num, + ) + assert type(data_read) is bytearray + return self.bytes_to_arr(data_read, tensor_num) + + def close(self): + if self._dev is not None: + self._dev.write(self._out_ep, bytes([IOSERVER_EXIT, 0, 0]), 1000) + usb.util.dispose_resources(self._dev) + self._dev = None + + @handle_usb_error + def _download_data(self, cmd, data_bytes, tensor_num=0, model_num=0): + # TODO rm this extra CMD packet + self._out_ep.write(bytes([cmd, model_num, tensor_num])) + self._out_ep.write(data_bytes, 1000) + if (len(data_bytes) % self._max_block_size) == 0: + self._out_ep.write(bytearray(), 1000) + + @handle_usb_error + def _upload_data(self, cmd, tensor_num=0, model_num=0): + read_data = bytearray() + self._out_ep.write(bytes([cmd, model_num, tensor_num]), self._timeout) + buff = usb.util.create_buffer(self._max_block_size) + read_len = self._dev.read(self._in_ep, buff, 10000) + read_data.extend(buff[:read_len]) + while read_len == self._max_block_size: + read_len = self._dev.read(self._in_ep, buff, 10000) + read_data.extend(buff[:read_len]) + + return read_data + + def _clear_error(self): + self._dev.clear_halt(self._out_ep) + self._dev.clear_halt(self._in_ep) + + def connect(self): + self._dev = None + while self._dev is None: + # TODO - more checks that we have the right device.. + self._dev = usb.core.find(idVendor=0x20B1, product="xAISRV") + + # set the active configuration. With no arguments, the first + # configuration will be the active one + self._dev.set_configuration() + + # get an endpoint instance + cfg = self._dev.get_active_configuration() + intf = cfg[(0, 0)] + self._out_ep = usb.util.find_descriptor( + intf, + # match the first OUT endpoint + custom_match=lambda e: usb.util.endpoint_direction(e.bEndpointAddress) + == usb.util.ENDPOINT_OUT, + ) + + self._in_ep = usb.util.find_descriptor( + intf, + # match the first IN endpoint + custom_match=lambda e: usb.util.endpoint_direction(e.bEndpointAddress) + == usb.util.ENDPOINT_IN, + ) + + assert self._out_ep is not None + assert self._in_ep is not None + + print("Connected to XCORE_IO_SERVER via USB") + + # TODO move to super() + def start_inference(self): + # Send cmd + self._out_ep.write(bytes([IOSERVER_INVOKE, 0, 0]), 1000) + + # Send out a 0 length packet + self._out_ep.write(bytes([]), 1000) + + def reset(self): + # Send cmd + self._out_ep.write(bytes([IOSERVER_RESET, 0, 0]), 1000) + + # Send out a 0 length packet + self._out_ep.write(bytes([]), 1000) diff --git a/tflite2xcore/tflite2xcore/tests/__init__.py b/python/xmos_ai_tools/runtime/__init__.py similarity index 100% rename from tflite2xcore/tflite2xcore/tests/__init__.py rename to python/xmos_ai_tools/runtime/__init__.py diff --git a/python/xmos_ai_tools/runtime/buildfiles/aitoolslib.cmake b/python/xmos_ai_tools/runtime/buildfiles/aitoolslib.cmake new file mode 100644 index 000000000..2744500ca --- /dev/null +++ b/python/xmos_ai_tools/runtime/buildfiles/aitoolslib.cmake @@ -0,0 +1,13 @@ +set(XMOS_AITOOLSLIB_DEFINITIONS + "TF_LITE_STATIC_MEMORY" + "TF_LITE_STRIP_ERROR_STRINGS" + "XCORE" + "NO_INTERPRETER" + ) + +if("${APP_BUILD_ARCH}" STREQUAL xs3a OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL XCORE_XS3A OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL XCORE_XS) + set(XMOS_AITOOLSLIB_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/../lib/libxtflitemicro.a") +else() + set(XMOS_AITOOLSLIB_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/../lib/libhost_xtflitemicro.a") +endif() +set(XMOS_AITOOLSLIB_INCLUDES "${CMAKE_CURRENT_LIST_DIR}/../include") diff --git a/python/xmos_ai_tools/runtime/buildfiles/aitoolslib.make b/python/xmos_ai_tools/runtime/buildfiles/aitoolslib.make new file mode 100644 index 000000000..708ffa62b --- /dev/null +++ b/python/xmos_ai_tools/runtime/buildfiles/aitoolslib.make @@ -0,0 +1,8 @@ +XMOS_AITOOLSLIB_DEFINITIONS = \ +-DTF_LITE_STATIC_MEMORY \ +-DTF_LITE_STRIP_ERROR_STRINGS \ +-DXCORE \ +-DNO_INTERPRETER + +XMOS_AITOOLSLIB_LIBRARIES = $(XMOS_AITOOLSLIB_PATH)/lib/libxtflitemicro.a +XMOS_AITOOLSLIB_INCLUDES = -I$(XMOS_AITOOLSLIB_PATH)/include diff --git a/python/xmos_ai_tools/xformer/__init__.py b/python/xmos_ai_tools/xformer/__init__.py new file mode 100644 index 000000000..2c6dec1e8 --- /dev/null +++ b/python/xmos_ai_tools/xformer/__init__.py @@ -0,0 +1,64 @@ +import subprocess +import typing +from pathlib import Path +from typing import Union, List, Optional, Tuple +from .flash import generate_flash +import re + +__compilation_stdout = "" +__compilation_stderr = "" +__arena_size = 0 + + +def convert( + filename: Union[str, Path], + outfile: Union[str, Path], + params: Optional[List[Tuple[str, Optional[str]]]], +) -> int: + args: List[str] = ["xcore-opt", "-o", str(outfile)] + + if params is not None: + for key, val in params: + if len(key) > 1: + flag: str = "--" + str(key) + else: + flag = "-" + str(key) + if str(val) == "" or val is None: + args.append(flag) + else: + args.append(f"{flag}={val}") + + args.append(str(filename)) + + try: + process_call: subprocess.CompletedProcess = subprocess.run( + [arg for arg in args], + check=True, text=True, capture_output=True, + ) + global __compilation_stdout, __compilation_stderr, __arena_size + __compilation_stdout = process_call.stdout + __compilation_stderr = process_call.stderr + size_str = re.sub("((.|\n|\r)*)Tensor arena size :", "", __compilation_stdout) + size_str = re.sub("(\n|\r)((.|\n|\r)*)", "", size_str) + __arena_size = int(size_str.strip()) + return process_call.returncode + except subprocess.CalledProcessError as e: + print(e) + print("Return code:", e.returncode) + print("Error output:", e.stderr) + + +def tensor_arena_size() -> int: + return __arena_size + + +def print_optimization_report(): + print(__compilation_stderr) + print(__compilation_stdout) + + +def print_help(show_hidden: Optional[bool] = False) -> int: + if show_hidden: + return subprocess.run(["xcore-opt", "--help-list-hidden"]).returncode + + return subprocess.run(["xcore-opt", "--help-list"]).returncode diff --git a/python/xmos_ai_tools/xformer/flash.py b/python/xmos_ai_tools/xformer/flash.py new file mode 100644 index 000000000..b33434296 --- /dev/null +++ b/python/xmos_ai_tools/xformer/flash.py @@ -0,0 +1,190 @@ +BYTES_FOR_MAGIC_PATTERN = 32 +BYTES_FOR_VERSION = 4 +BYTES_PER_ENGINE_HEADER = 16 +VERSION_MAJOR = 1 +VERSION_MINOR = 2 + + +class FlashBuilder: + class Header: + """ + Class that stores a header for a flash file system + The header comprises the addresses of the model, parameters, and operators + relative to the start address + """ + + def __init__(self, model_bytes, params_bytes, ops_bytes, xip_bytes, start): + self.model_start = start + self.parameters_start = self.model_start + model_bytes + 4 # len + self.operators_start = self.parameters_start + params_bytes # no len + self.xip_start = self.operators_start + ops_bytes # no len + new_start = self.xip_start + xip_bytes # no len + self.length = new_start - start + + def __init__(self, engines=1): + self.engines = engines + self.models = [bytes([])] * engines + self.params = [bytes([])] * engines + self.ops = [bytes([])] * engines + self.xips = [bytes([])] * engines + + @staticmethod + def read_whole_binary_file(filename): + """ + Reads a whole binary file in and returns bytes(). If the file to be read is called '-' + then an empty bytes is returned. + """ + if filename == "-": + return bytes([]) + try: + with open(filename, "rb") as input_fd: + contents = input_fd.read() + return contents + except: + print('File "%s" is not a readable file' % (filename)) + return None + + @staticmethod + def create_params_image(params=None, filename=None): + if params is None: + params = FlashBuilder.read_whole_binary_file(filename) + return params + + @staticmethod + def create_model_image(model=None, filename=None): + if model is None: + model = FlashBuilder.read_whole_binary_file(filename) + return model + + @staticmethod + def create_params_file(params_filename, params=None, input_filename=None): + image = FlashBuilder.create_params_image(params=params, filename=input_filename) + with open(params_filename, "wb") as output_fd: + output_fd.write(image) + + @staticmethod + def tobytes(integr): + """Converts an int to a LSB first quad of bytes""" + data = [] + for i in range(4): + data.append((integr >> (8 * i)) & 0xFF) + return bytes(data) + + @staticmethod + def swap_nibbles(x): + return (x & 0x0F) << 4 | (x & 0xF0) >> 4 + + def add_params(self, engine, params=None, filename=None): + image = FlashBuilder.create_params_image(params, filename) + self.params[engine] = image + + def add_model(self, engine, model=None, filename=None): + image = FlashBuilder.create_model_image(model, filename) + self.models[engine] = image + + def flash_image(self): + """ + Builds a flash image out of a collection of models and parameter blobs. + This function returns a bytes comprising the header, models, parameters, etc. + The whole thing should be written as is to flash + """ + headers = [None] * self.engines + start = ( + BYTES_FOR_MAGIC_PATTERN + + BYTES_FOR_VERSION + + BYTES_PER_ENGINE_HEADER * self.engines + ) + for i in range(self.engines): + headers[i] = FlashBuilder.Header( + len(self.models[i]), + len(self.params[i]), + len(self.ops[i]), + len(self.xips[i]), + start, + ) + start += headers[i].length + + # We add the magic fast flash pattern of 32 bytes at the very beginning + # After that comes the version + output = bytes( + [ + 0xFF, + 0x00, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0xFF, + 0x00, + 0xFF, + 0x00, + 0xFF, + 0x00, + 0xFF, + 0x00, + 0x31, + 0xF7, + 0xCE, + 0x08, + 0x31, + 0xF7, + 0xCE, + 0x08, + 0x9C, + 0x63, + 0x9C, + 0x63, + 0x9C, + 0x63, + 0x9C, + 0x63, + ] + ) + + output += bytes( + [VERSION_MAJOR, VERSION_MINOR, 0xFF ^ VERSION_MAJOR, 0xFF ^ VERSION_MINOR] + ) + + for i in range(self.engines): + output += FlashBuilder.tobytes( + headers[i].model_start + ) # encode start of model + output += FlashBuilder.tobytes( + headers[i].parameters_start + ) # encode start of params + output += FlashBuilder.tobytes( + headers[i].operators_start + ) # encode start of ops + output += FlashBuilder.tobytes(headers[i].xip_start) # encode start of xip + + for i in range(self.engines): + output += FlashBuilder.tobytes(len(self.models[i])) # encode len of model + output += self.models[i] # add model image + output += self.params[i] # add params image + output += self.ops[i] # add operators image + output += self.xips[i] # add exec in place image + return output + + def flash_file(self, filename): + """ + Builds a file for the host system that comprises a single parameter blob. + """ + output = self.flash_image() + # swap nibbles around + swapped_output = bytes([FlashBuilder.swap_nibbles(byte) for byte in output]) + with open(filename, "wb") as output_fd: + output_fd.write(swapped_output) + + +def generate_flash(*, output_file, model_files, param_files): + assert len(model_files) == len( + param_files + ), "The number of provided model files must match the number of param files!" + num_of_engines = len(model_files) + fb = FlashBuilder(engines=num_of_engines) + for i in range(num_of_engines): + fb.add_model(i, filename=model_files[i]) + fb.add_params(i, filename=param_files[i]) + fb.flash_file(output_file) diff --git a/python/xmos_ai_tools/xinterpreters/CMakeLists.txt b/python/xmos_ai_tools/xinterpreters/CMakeLists.txt new file mode 100644 index 000000000..3e1daf7c3 --- /dev/null +++ b/python/xmos_ai_tools/xinterpreters/CMakeLists.txt @@ -0,0 +1,117 @@ +cmake_minimum_required(VERSION 3.14) + +set(CMAKE_BUILD_TYPE "Release") +project(xtflm_python VERSION 1.0.1) + +# This variable is ignored on platforms other than Apple +if(APPLE) + execute_process(COMMAND xcrun --show-sdk-path + OUTPUT_VARIABLE CMAKE_OSX_SYSROOT + OUTPUT_STRIP_TRAILING_WHITESPACE) + + set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64" CACHE STRING "Build architectures for Mac OS X" FORCE) +endif() + +#********************** +# Build flags +#********************** +if (${CMAKE_SYSTEM_NAME} MATCHES "Windows") + set(BUILD_FLAGS "/O2") +else() + set(BUILD_FLAGS + # "-g" + "-O3") +endif() + + +if(DEFINED ENV{CMAKE_ENABLE_DARWIN_TARGET_ARM64}) + set(BUILD_FLAGS ${BUILD_FLAGS} "-target" "arm64-apple-macos11") +endif() + +set(TOP_DIR + "${CMAKE_CURRENT_SOURCE_DIR}/../../../third_party/lib_tflite_micro") + +include(${TOP_DIR}/cmakefiles/xtflm.cmake) + +#********************** +# Build host library +#********************** +add_library(host_xtflitemicro STATIC) +set(DEFINTIONS + "__xtflm_conf_h_exists__" + "NO_INTERPRETER" + "TF_LITE_STATIC_MEMORY" + "TF_LITE_DISABLE_X86_NEON" + "TF_LITE_STRIP_ERROR_STRINGS" + "NN_USE_REF" +) +list(APPEND DEFINTIONS "FLATBUFFERS_LOCALE_INDEPENDENT=0") +target_compile_features(host_xtflitemicro PUBLIC cxx_std_17) + +target_sources(host_xtflitemicro + PRIVATE ${TFLM_KERNEL_SOURCES} + PRIVATE ${TFLITE_SOURCES} + PRIVATE ${NN_SOURCES} + PRIVATE ${XTFLIB_KERNEL_SOURCES} +) + +if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set(BUILD_FLAGS ${BUILD_FLAGS} "-fPIC") +endif() +target_compile_options(host_xtflitemicro PRIVATE ${BUILD_FLAGS}) + +target_link_options(host_xtflitemicro PRIVATE ${BUILD_FLAGS}) +target_compile_definitions(host_xtflitemicro PUBLIC + ${DEFINTIONS} +) + +target_include_directories(host_xtflitemicro + PRIVATE ${ALL_INCLUDES} +) + +set(INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../runtime/lib") +install(TARGETS host_xtflitemicro DESTINATION ${INSTALL_DIR}) + +#********************** +# Build shared library +#********************** +add_library(xtflm_python SHARED) +set_target_properties(xtflm_python PROPERTIES VERSION ${PROJECT_VERSION}) +set_target_properties(xtflm_python PROPERTIES PREFIX "") +if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + target_link_libraries(xtflm_python stdc++ m pthread -static-libgcc) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + target_link_libraries(xtflm_python stdc++ m pthread) +endif() + +set(DEFINTIONS + "__xtflm_conf_h_exists__" + "TF_LITE_DISABLE_X86_NEON" + "NN_USE_REF" +) +target_compile_definitions(xtflm_python PUBLIC ${DEFINTIONS}) +target_compile_features(xtflm_python PUBLIC cxx_std_17) +target_compile_options(xtflm_python PRIVATE ${BUILD_FLAGS}) +target_link_options(xtflm_python PRIVATE ${BUILD_FLAGS}) + +target_sources(xtflm_python + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src/dll_interpreter.cc" + PRIVATE ${ALL_SOURCES} +) + +list(APPEND ALL_INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/src") + +target_include_directories(xtflm_python + PRIVATE ${ALL_INCLUDES} +) + +if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set(INSTALL_DIR "${PROJECT_SOURCE_DIR}/libs/linux") +elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(INSTALL_DIR "${PROJECT_SOURCE_DIR}/libs/macos") +else() # must be Windows + set(INSTALL_DIR "${PROJECT_SOURCE_DIR}/libs/windows") +endif() + +install(TARGETS xtflm_python DESTINATION ${INSTALL_DIR}) + diff --git a/python/xmos_ai_tools/xinterpreters/Makefile b/python/xmos_ai_tools/xinterpreters/Makefile new file mode 100644 index 000000000..9434724e1 --- /dev/null +++ b/python/xmos_ai_tools/xinterpreters/Makefile @@ -0,0 +1,10 @@ +install: + mkdir -p build + (cd build && cmake .. && make install -j4) + +clean: + rm -rf build + rm -rf libs + +test: + (cd tests && make test) diff --git a/python/xmos_ai_tools/xinterpreters/__init__.py b/python/xmos_ai_tools/xinterpreters/__init__.py new file mode 100644 index 000000000..47eec97e1 --- /dev/null +++ b/python/xmos_ai_tools/xinterpreters/__init__.py @@ -0,0 +1 @@ +from .host_interpreter import TFLMHostInterpreter diff --git a/python/xmos_ai_tools/xinterpreters/exceptions.py b/python/xmos_ai_tools/xinterpreters/exceptions.py new file mode 100644 index 000000000..c268f0488 --- /dev/null +++ b/python/xmos_ai_tools/xinterpreters/exceptions.py @@ -0,0 +1,38 @@ +# Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +# XMOS Public License: Version 1 + + +class InterpreterError(Exception): + pass + + +class AllocateTensorsError(InterpreterError): + pass + + +class InvokeError(InterpreterError): + pass + + +class SetTensorError(InterpreterError): + pass + + +class GetTensorError(InterpreterError): + pass + + +class ModelSizeError(InterpreterError): + pass + + +class ArenaSizeError(InterpreterError): + pass + + +class DeviceTimeoutError(InterpreterError): + pass + + +class GetProfilerTimesError(InterpreterError): + pass diff --git a/python/xmos_ai_tools/xinterpreters/host_interpreter.py b/python/xmos_ai_tools/xinterpreters/host_interpreter.py new file mode 100644 index 000000000..5fa6fe90b --- /dev/null +++ b/python/xmos_ai_tools/xinterpreters/host_interpreter.py @@ -0,0 +1,653 @@ +# Copyright 2022 XMOS LIMITED. This Software is subject to the terms of the +# XMOS Public License: Version 1 +import sys +import ctypes +from typing import Optional, Dict, Any, List +from tflite.Model import Model +from tflite.TensorType import TensorType +from tflite import opcode2name +from enum import Enum + +import numpy as np +from pathlib import Path + +from numpy import ndarray + +# DLL path for different platforms +__PARENT_DIR = Path(__file__).parent.absolute() +if sys.platform.startswith("linux"): + lib_path = str(Path.joinpath(__PARENT_DIR, "libs", "linux", "xtflm_python.so")) +elif sys.platform == "darwin": + lib_path = str(Path.joinpath(__PARENT_DIR, "libs", "macos", "xtflm_python.dylib")) +else: + lib_path = str(Path.joinpath(__PARENT_DIR, "libs", "windows", "xtflm_python.dll")) + +lib = ctypes.cdll.LoadLibrary(lib_path) + +from xmos_ai_tools.xinterpreters.exceptions import ( + InterpreterError, + AllocateTensorsError, + InvokeError, + SetTensorError, + GetTensorError, + ModelSizeError, + ArenaSizeError, + DeviceTimeoutError, +) + +MAX_TENSOR_ARENA_SIZE = 10000000 + + +class XTFLMInterpreterStatus(Enum): + OK = 0 + ERROR = 1 + + +class TFLMHostInterpreter: + """! The xcore interpreters host class. + The interpreter to be used on a host. + """ + + def __init__(self, max_tensor_arena_size: int = MAX_TENSOR_ARENA_SIZE) -> None: + """! Host interpreter initializer. + Sets up functions from the cdll, and calls to cdll function to create a new interpreter. + """ + self._error_msg = ctypes.create_string_buffer(4096) + + lib.new_interpreter.restype = ctypes.c_void_p + lib.new_interpreter.argtypes = [ + ctypes.c_size_t, + ctypes.c_size_t, + ] + + lib.print_memory_plan.restype = None + lib.print_memory_plan.argtypes = [ctypes.c_void_p] + + lib.delete_interpreter.restype = None + lib.delete_interpreter.argtypes = [ctypes.c_void_p] + + lib.initialize.restype = ctypes.c_int + lib.initialize.argtypes = [ + ctypes.c_void_p, + ctypes.c_char_p, + ctypes.c_size_t, + ctypes.c_char_p, + ] + + lib.set_input_tensor.restype = ctypes.c_int + lib.set_input_tensor.argtypes = [ + ctypes.c_void_p, + ctypes.c_size_t, + ctypes.c_void_p, + ctypes.c_int, + ] + + lib.get_output_tensor.restype = ctypes.c_int + lib.get_output_tensor.argtypes = [ + ctypes.c_void_p, + ctypes.c_size_t, + ctypes.c_void_p, + ctypes.c_int, + ] + + lib.get_input_tensor.restype = ctypes.c_int + lib.get_input_tensor.argtypes = [ + ctypes.c_void_p, + ctypes.c_size_t, + ctypes.c_void_p, + ctypes.c_int, + ] + + lib.reset.restype = ctypes.c_int + lib.reset.argtypes = [ctypes.c_void_p] + + lib.invoke.restype = ctypes.c_int + lib.invoke.argtypes = [ctypes.c_void_p] + + lib.get_error.restype = ctypes.c_size_t + lib.get_error.argtypes = [ctypes.c_void_p, ctypes.c_char_p] + + lib.arena_used_bytes.restype = ctypes.c_size_t + lib.arena_used_bytes.argtypes = [ + ctypes.c_void_p, + ] + + self._max_tensor_arena_size = max_tensor_arena_size + self.models: List[TFLMHostInterpreter.modelData] = [] + + def __enter__(self) -> "TFLMHostInterpreter": + return self + + def __exit__(self, exc_type, exc_value, exc_traceback) -> None: + """! Exit calls close function to delete interpreter""" + self.close() + + def initialise_interpreter(self, model_index: int = 0) -> None: + """! Interpreter initialiser, initialised interpreter with model and parameters (optional) + @param model_index The model to target, for interpreters that support multiple models + running concurrently. Defaults to 0 for use with a single model. + """ + max_arena_size = 50000000 + external_memory_size = 50000000 + self.obj = lib.new_interpreter(max_arena_size, external_memory_size) + currentModel = None + + for model in self.models: + if model.tile == model_index: + currentModel = model + + if currentModel is None: + print(f"No model at index {model_index} found.", sys.stderr) + raise IndexError + + assert currentModel.model_content is not None + + status = lib.initialize( + self.obj, + currentModel.model_content, + len(currentModel.model_content), + currentModel.params_content, + ) + if XTFLMInterpreterStatus(status) is XTFLMInterpreterStatus.ERROR: + raise RuntimeError("Unable to initialize interpreter") + + def set_tensor(self, tensor_index: int, value: ndarray, model_index=0) -> None: + """! Write the input tensor of a model. + @param value The blob of data to set the tensor to. + @param tensor_index The index of input tensor to target. Defaults to 0. + @param model_index The model to target, for interpreters that support multiple models + running concurrently. Defaults to 0 for use with a single model. + """ + val = value.tobytes() + + length = len(val) + length2 = self.get_input_tensor_size(tensor_index) + if length != length2: + print( + "ERROR: mismatching size in set_input_tensor %d vs %d" + % (length, length2) + ) + + self._check_status(lib.set_input_tensor(self.obj, tensor_index, val, length)) + + def get_tensor( + self, tensor_index: int = 0, model_index: int = 0, tensor: ndarray = None + ) -> ndarray: + """! Read data from the output tensor of a model. + @param tensor_index The index of output tensor to target. + @param model_index The model to target, for interpreters that support multiple models + running concurrently. Defaults to 0 for use with a single model. + @param tensor Tensor of correct shape to write into (optional). + @return The data that was stored in the output tensor. + """ + + count: Optional[int] + tensor_details: Optional[Dict[str, Any]] + count, tensor_details = next( + filter( + lambda x: x[1]["index"] == tensor_index, + enumerate(self.get_output_details()), + ), + (None, None), + ) + + if count is None or tensor_details is None: + print(f"No tensor at index {tensor_index} found.", sys.stderr) + raise IndexError + + length = self.get_tensor_size(tensor_index) + if tensor is None: + tensor = np.zeros(tensor_details["shape"], dtype=tensor_details["dtype"]) + else: + length = len(tensor.tobytes()) + if length != length: + print( + "ERROR: mismatching size in get_output_tensor %d vs %d" + % (length, length) + ) + + data_ptr = tensor.ctypes.data_as(ctypes.c_void_p) + self._check_status(lib.get_output_tensor(self.obj, count, data_ptr, length)) + return tensor + + def get_input_tensor(self, input_index: int = 0, model_index: int = 0) -> ndarray: + """! Read the data in the input tensor of a model. + @param input_index The index of input tensor to target. + @param model_index The engine to target, for interpreters that support multiple models + running concurrently. Defaults to 0 for use with a single model. + @return The data that was stored in the output tensor. + """ + tensor_details = self.get_input_details(model_index)[input_index] + tensor = np.zeros(tensor_details["shape"], dtype=tensor_details["dtype"]) + data_ptr = tensor.ctypes.data_as(ctypes.c_void_p) + + l = len(tensor.tobytes()) + self._check_status(lib.get_input_tensor(self.obj, input_index, data_ptr, l)) + return tensor + + def reset(self, model_index: int = 0) -> None: + """! Resets the model.""" + self._check_status(lib.reset(self.obj)) + + def invoke(self, model_index: int = 0) -> None: + """! Invoke the model and starting inference of the current + state of the tensors. + """ + INVOKE_CALLBACK_FUNC = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_int) + + self._check_status(lib.invoke(self.obj)) + + def close(self, model_index: int = 0) -> None: + """! Delete the interpreter. + @params model_index Defines which interpreter to target in systems with multiple. + """ + if self.obj: + lib.delete_interpreter(self.obj) + self.obj = None + + def tensor_arena_size(self) -> int: + """! Read the size of the tensor arena required. + @return size of the tensor arena as an integer. + """ + return lib.arena_used_bytes(self.obj) + + def _check_status(self, status) -> None: + """! Read a status code and raise an exception. + @param status Status code. + """ + if XTFLMInterpreterStatus(status) is XTFLMInterpreterStatus.ERROR: + lib.get_error(self.obj, self._error_msg) + raise RuntimeError(self._error_msg.value.decode("utf-8")) + + def print_memory_plan(self) -> None: + """! Print a plan of memory allocation""" + lib.print_memory_plan(self.obj) + + def allocate_tensors(self): + """! Dummy function to match tf.lite.Interpreter() API""" + return + + def get_input_tensor_size(self, input_index: int = 0, model_index: int = 0) -> int: + """! Read the size of the input tensor from the model. + @param input_index The index of input tensor to target. + @param model_index The model to target, for interpreters that support multiple models + running concurrently. Defaults to 0 for use with a single model. + @return The size of the input tensor as an integer. + """ + + # Select correct model from model list + model = self.get_model(model_index) + modelBuf = Model.GetRootAsModel(model.model_content, 0) + + # Get index of specific input tensor + tensorIndex = modelBuf.Subgraphs(0).Inputs(input_index) + + tensorType = modelBuf.Subgraphs(0).Tensors(tensorIndex).Type() + + tensorSize: int + if tensorType == TensorType.INT8: + tensorSize = 1 # int8 is 1 byte + elif tensorType == TensorType.INT16: + tensorSize = 2 # int16 is 2 bytes + elif tensorType == TensorType.INT32: + tensorSize = 4 # int32 is 4 bytes + elif tensorType == TensorType.FLOAT32: + tensorSize = 4 # float32 is 4 bytes + else: + print(tensorType) + self._check_status(XTFLMInterpreterStatus.ERROR) + tensorSize = 0 + + # Calculate tensor size by multiplying shape elements + for i in range(0, modelBuf.Subgraphs(0).Tensors(tensorIndex).ShapeLength()): + tensorSize = tensorSize * modelBuf.Subgraphs(0).Tensors(tensorIndex).Shape( + i + ) + return tensorSize + + def get_output_tensor_size( + self, output_index: int = 0, model_index: int = 0 + ) -> int: + """! Read the size of the output tensor from the model. + @param output_index The index of output tensor to target. + @param model_index The model to target, for interpreters that support multiple models + running concurrently. Defaults to 0 for use with a single model. + @return The size of the output tensor as an integer. + """ + + # Select correct model from model list + modelBuf = None + model = self.get_model(model_index) + modelBuf = Model.GetRootAsModel(model.model_content, 0) + + # Get index of specific output tensor + tensorIndex = modelBuf.Subgraphs(0).Outputs(output_index) + + tensorType = modelBuf.Subgraphs(0).Tensors(tensorIndex).Type() + + tensorSize: int + if tensorType == TensorType.INT8: + tensorSize = 1 # int8 is 1 byte + elif tensorType == TensorType.INT16: + tensorSize = 2 # int16 is 2 bytes + elif tensorType == TensorType.INT32: + tensorSize = 4 # int32 is 4 bytes + elif tensorType == TensorType.FLOAT32: + tensorSize = 4 # float32 is 4 bytes + else: + print(tensorType) + self._check_status(XTFLMInterpreterStatus.ERROR) + tensorSize = 0 + + # Calculate tensor size by multiplying shape elements + for i in range(0, modelBuf.Subgraphs(0).Tensors(tensorIndex).ShapeLength()): + tensorSize = tensorSize * modelBuf.Subgraphs(0).Tensors(tensorIndex).Shape( + i + ) + return tensorSize + + def get_tensor_size(self, tensor_index: int = 0, model_index: int = 0) -> int: + """! Read the size of the input tensor from the model. + @param tensor_index The index of input tensor to target. + @param model_index The model to target, for interpreters that support multiple models + running concurrently. Defaults to 0 for use with a single model. + @return The size of the input tensor as an integer. + """ + + # Select correct model from model list + modelBuf = None + model = self.get_model(model_index) + modelBuf = Model.GetRootAsModel(model.model_content, 0) + + tensorType = modelBuf.Subgraphs(0).Tensors(tensor_index).Type() + if tensorType == TensorType.INT8: + tensorSize = 1 # int8 is 1 byte + elif tensorType == TensorType.INT16: + tensorSize = 2 # int16 is 2 bytes + elif tensorType == TensorType.INT32: + tensorSize = 4 # int32 is 4 bytes + elif tensorType == TensorType.FLOAT32: + tensorSize = 4 # float32 is 4 bytes + else: + print(tensorType) + self._check_status(XTFLMInterpreterStatus.ERROR) + + # Calculate tensor size by multiplying shape elements + for i in range(0, modelBuf.Subgraphs(0).Tensors(tensor_index).ShapeLength()): + tensorSize = tensorSize * modelBuf.Subgraphs(0).Tensors(tensor_index).Shape( + i + ) + return tensorSize + + def get_input_details(self, model_index: int = 0) -> List[Dict[str, Any]]: + """! Reads the input tensor details from the model. + @param model_index The model to target, for interpreters that support multiple models + running concurrently. Defaults to 0 for use with a single model. + @return Tensor details, including the index, name, shape, data type, and quantization + parameters. + """ + + # Select correct model from model list + modelBuf = None + model = self.get_model(model_index) + modelBuf = Model.GetRootAsModel(model.model_content, 0) + + inputsList = [] + for input_ in range(0, modelBuf.Subgraphs(0).InputsLength()): + tensorIndex = modelBuf.Subgraphs(0).Inputs(input_) + + # Generate dictioary of tensor details + dtype: Union[Type[Any]] + if modelBuf.Subgraphs(0).Tensors(tensorIndex).Type() == TensorType.INT8: + dtype = np.int8 + elif modelBuf.Subgraphs(0).Tensors(tensorIndex).Type() == TensorType.INT16: + dtype = np.int16 + elif modelBuf.Subgraphs(0).Tensors(tensorIndex).Type() == TensorType.INT32: + dtype = np.int32 + elif ( + modelBuf.Subgraphs(0).Tensors(tensorIndex).Type() == TensorType.FLOAT32 + ): + dtype = np.float32 + else: + raise TypeError + + details = { + "name": str(modelBuf.Subgraphs(0).Tensors(tensorIndex).Name())[ + 1: + ].strip("'"), + "index": tensorIndex, + "shape": modelBuf.Subgraphs(0).Tensors(tensorIndex).ShapeAsNumpy(), + "shape_signature": modelBuf.Subgraphs(0) + .Tensors(tensorIndex) + .ShapeSignatureAsNumpy(), + "dtype": dtype, + "quantization": ( + modelBuf.Subgraphs(0).Tensors(tensorIndex).Quantization().Scale(0), + modelBuf.Subgraphs(0) + .Tensors(tensorIndex) + .Quantization() + .ZeroPoint(0), + ), + "quantization_parameters": { + "scales": modelBuf.Subgraphs(0) + .Tensors(tensorIndex) + .Quantization() + .ScaleAsNumpy(), + "zero_points": modelBuf.Subgraphs(0) + .Tensors(tensorIndex) + .Quantization() + .ZeroPointAsNumpy(), + "quantized_dimension": modelBuf.Subgraphs(0) + .Tensors(tensorIndex) + .Quantization() + .QuantizedDimension(), + }, + "sparsity_parameters": { + modelBuf.Subgraphs(0).Tensors(tensorIndex).Sparsity() + }, + } + inputsList.append(details) + + return inputsList + + def get_output_details(self, model_index: int = 0) -> List[Dict[str, Any]]: + """! Reads the output tensor details from the model. + @param output_index The index of output tensor to target. + @param model_index The model to target, for interpreters that support multiple models + running concurrently. Defaults to 0 for use with a single model. + @return Tensor details, including the index, name, shape, data type, and quantization + parameters. + """ + + # Select correct model from models list + model = self.get_model(model_index) + modelBuf = Model.GetRootAsModel(model.model_content, 0) + + outputsList = [] + for output_ in range(0, modelBuf.Subgraphs(0).OutputsLength()): + # Output tensor is last tensor + tensorIndex = modelBuf.Subgraphs(0).Outputs(output_) + + dtype: Union[Type[Any]] + # Generate dictionary of tensor details + if modelBuf.Subgraphs(0).Tensors(tensorIndex).Type() == TensorType.INT8: + dtype = np.int8 + elif modelBuf.Subgraphs(0).Tensors(tensorIndex).Type() == TensorType.INT16: + dtype = np.int16 + elif modelBuf.Subgraphs(0).Tensors(tensorIndex).Type() == TensorType.INT32: + dtype = np.int32 + elif ( + modelBuf.Subgraphs(0).Tensors(tensorIndex).Type() == TensorType.FLOAT32 + ): + dtype = np.float32 + + details = { + "name": str(modelBuf.Subgraphs(0).Tensors(tensorIndex).Name())[ + 1: + ].strip("'"), + "index": tensorIndex, + "shape": modelBuf.Subgraphs(0).Tensors(tensorIndex).ShapeAsNumpy(), + "shape_signature": modelBuf.Subgraphs(0) + .Tensors(tensorIndex) + .ShapeSignatureAsNumpy(), + "dtype": dtype, + "quantization": ( + modelBuf.Subgraphs(0).Tensors(tensorIndex).Quantization().Scale(0), + modelBuf.Subgraphs(0) + .Tensors(tensorIndex) + .Quantization() + .ZeroPoint(0), + ), + "quantization_parameters": { + "scales": modelBuf.Subgraphs(0) + .Tensors(tensorIndex) + .Quantization() + .ScaleAsNumpy(), + "zero_points": modelBuf.Subgraphs(0) + .Tensors(tensorIndex) + .Quantization() + .ZeroPointAsNumpy(), + "quantized_dimension": modelBuf.Subgraphs(0) + .Tensors(tensorIndex) + .Quantization() + .QuantizedDimension(), + }, + "sparsity_parameters": { + modelBuf.Subgraphs(0).Tensors(tensorIndex).Sparsity() + }, + } + outputsList.append(details) + + return outputsList + + def set_model( + self, + model_path: Optional[str] = None, + model_content: Optional[bytes] = None, + params_path: Optional[str] = None, + params_content: Optional[bytes] = None, + model_index: int = 0, + secondary_memory: bool = False, + flash: bool = False, + ) -> None: + """! Adds a model to the interpreter's list of models. + @param model_path The path to the model file (.tflite), alternative to model_content. + @param model_content The byte array representing a model, alternative to model_path. + @param params_path The path to the params file for the model, + alternative to params_content (optional). + @param params_content The byte array representing the model parameters, + alternative to params_path (optional). + @param model_index The model to target, for interpreters that support multiple models + running concurrently. Defaults to 0 for use with a single model. + """ + + # Check model_path or model_content is valid + if not model_path and not model_content: + raise ValueError("model_path or model_content must be provided") + tile_found = False + # Find correct model and replace + for model in self.models: + if model.tile == model_index: + model = self.modelData( + model_path, + model_content, + params_path, + params_content, + model_index, + secondary_memory, + flash, + ) + tile_found = True + break + # If model wasn't previously set, add it to list + if not tile_found: + self.models.append( + self.modelData( + model_path, + model_content, + params_path, + params_content, + model_index, + secondary_memory, + flash, + ) + ) + self.initialise_interpreter(model_index) + + def get_model(self, model_index: int = 0): + for model in self.models: + if model.tile == model_index: + return model + + class modelData: + """! The model data class + A class that holds a model and data associated with a single model. + """ + + def __init__( + self, + model_path: Optional[str], + model_content: Optional[bytes], + params_path: Optional[str], + params_content: Optional[bytes], + model_index: int, + secondary_memory: bool, + flash: bool, + ): + """! Model data initializer. + Sets up variables, generates a list of operators used in the model, + and reads model and params paths into byte arrays (content). + @param model_path Path to the model file (.tflite). + @param model_content Model model_content (byte array). + @param params_path Path to model parameters file. + @param params_content Model parameters content (byte array) + @param model_index The model to target, for interpreters that support multiple models + running concurrently. Defaults to 0 for use with a single model. + """ + self.model_path: Optional[str] = model_path + self.model_content: Optional[bytes] = model_content + self.params_path: Optional[str] = params_path + self.params_content: Optional[bytes] = params_content + self.tile: int = model_index + self.secondary_memory = secondary_memory + self.flash = flash + self.opList: List[str] = [] + self.pathToContent() + self.modelToOpList() + + def modelToOpList(self) -> None: + """! Generates operator list from model.""" + + # Load model + buffer = self.model_content + model = Model.GetRootAsModel(buffer, 0) + self.opList = [] + + # Iterate through operators in model and add operators to opList + for y in range(0, model.Subgraphs(0).OperatorsLength()): + opcode = model.OperatorCodes( + model.Subgraphs(0).Operators(y).OpcodeIndex() + ) + # If custom opcode parse string + if opcode.BuiltinCode() == 32: + self.opList.append(str(opcode.CustomCode()).strip("b'")) + # If built in op code, decode + else: + self.opList.append(opcode2name(opcode.BuiltinCode())) + + def pathToContent(self) -> None: + """! Reads model and params paths to content (byte arrays)""" + + # Check if path exists but not content + if self.model_content is None and self.model_path is not None: + with open(self.model_path, "rb") as input_fd: + self.model_content = input_fd.read() + + # Check if params_path exists but not params_content + if self.params_content is None and self.params_path is not None: + with open(self.params_path, "rb") as input_fd2: + self.params_content = input_fd2.read() + + # If params_content is None, set to empty byte array + if self.params_content is None: + self.params_content = bytes([]) diff --git a/python/xmos_ai_tools/xinterpreters/src/dll_interpreter.cc b/python/xmos_ai_tools/xinterpreters/src/dll_interpreter.cc new file mode 100644 index 000000000..2f76ecea1 --- /dev/null +++ b/python/xmos_ai_tools/xinterpreters/src/dll_interpreter.cc @@ -0,0 +1,201 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 +// #include "tensorflow/lite/micro/all_ops_resolver.h" + +#include "inference_engine.h" +#include +// #include "tensorflow/lite/micro/kernels/xcore/xcore_ops.h" +// #include "tensorflow/lite/micro/recording_micro_allocator. + +#ifdef _MSC_VER +#define DLLEXPORT __declspec(dllexport) +#else +#define DLLEXPORT +#endif + +//***************************************** +// C-API callable from Python +//***************************************** + +void add_lib_vision_ops( + tflite_micro::MicroMutableOpResolver *resolver) { + resolver->AddAddN(); + resolver->AddCast(); + resolver->AddFloor(); + resolver->AddGreater(); + resolver->AddGreaterEqual(); + resolver->AddLess(); + resolver->AddLessEqual(); + resolver->AddLogicalAnd(); + resolver->AddMul(); + resolver->AddNeg(); + resolver->AddPadV2(); + resolver->AddReduceMax(); + resolver->AddResizeBilinear(); + resolver->AddResizeNearestNeighbor(); + resolver->AddRound(); + resolver->AddRsqrt(); + resolver->AddStridedSlice(); + resolver->AddSlice(); + resolver->AddSub(); + resolver->AddGather(); + resolver->AddFullyConnected(); + resolver->AddTranspose(); + resolver->AddSplit(); + resolver->AddPack(); + resolver->AddUnpack(); + resolver->AddTanh(); + resolver->AddSplitV(); + resolver->AddShape(); + resolver->AddElu(); + resolver->AddBroadcastTo(); + resolver->AddLeakyRelu(); +} + +extern "C" { + +DLLEXPORT inference_engine *new_interpreter(size_t max_arena_size, size_t external_memory_size) { + inference_engine *ie = + (inference_engine *)calloc(sizeof(inference_engine), 1); + uint32_t *tensor_arena = (uint32_t *)calloc(max_arena_size, 1); + uint32_t *external_memory = (uint32_t *)calloc(external_memory_size, 1); + + struct tflite_micro_objects *s0 = new struct tflite_micro_objects; + + auto *resolver = inference_engine_initialize(ie, tensor_arena, + max_arena_size, external_memory, external_memory_size, s0); + + resolver->AddDequantize(); + resolver->AddSoftmax(); + resolver->AddMean(); + resolver->AddPad(); + resolver->AddPrelu(); + resolver->AddMaxPool2D(); + resolver->AddRelu6(); + resolver->AddReshape(); + resolver->AddConcatenation(); + resolver->AddAdd(); + resolver->AddMinimum(); + resolver->AddMaximum(); + resolver->AddRelu(); + resolver->AddLogistic(); + resolver->AddConv2D(); + resolver->AddQuantize(); + resolver->AddDepthwiseConv2D(); + resolver->AddDetectionPostprocess(); + resolver->AddTransposeConv(); + resolver->AddSum(); + resolver->AddAveragePool2D(); + resolver->AddUnidirectionalSequenceLSTM(); + resolver->AddIf(); + resolver->AddWhile(); + resolver->AddCallOnce(); + tflite_micro::ops::micro::xcore::RegisterXCOps(resolver); + add_lib_vision_ops(resolver); + + return ie; +} + +DLLEXPORT void delete_interpreter(inference_engine *ie) { + // inference_engine_unload_model(ie); + free(ie->tensor_arena); + free(ie->external_memory); + free(ie->xtflm); + free(ie); +} + +DLLEXPORT int initialize(inference_engine *ie, const char *model_content, + size_t model_content_size, const char *param_content) { + // We need to keep a copy of the model content + inference_engine_unload_model(ie); + uint32_t *m = (uint32_t *)model_content; + memcpy(ie->tensor_arena, m, model_content_size); + int r = inference_engine_load_model( + ie, model_content_size, ie->tensor_arena, (void *)param_content); + return kTfLiteOk; +} + +DLLEXPORT void print_memory_plan(inference_engine *ie) { + ie->xtflm->interpreter->PrintMemoryPlan(); +} + +// Unused +// DLLEXPORT size_t inputs_size(inference_engine *ie) { return ie->inputs; } + +// Unused +// DLLEXPORT size_t outputs_size(inference_engine *ie) { return ie->outputs; } + +// Unused +// DLLEXPORT size_t get_input_tensor_size(inference_engine *ie, int +// tensor_index) { +// return ie->input_sizes[tensor_index]; +// } + +// Unused +// DLLEXPORT size_t get_output_tensor_size(inference_engine *ie, int +// tensor_index) { +// return ie->output_sizes[tensor_index]; +// } + +DLLEXPORT size_t arena_used_bytes(inference_engine *ie) { + return ie->arena_needed_bytes; +} + +DLLEXPORT int set_input_tensor(inference_engine *ie, size_t tensor_index, + const void *value, const int size) { + memcpy(ie->input_buffers[tensor_index], value, size); + return 0; +} + +DLLEXPORT int get_input_tensor(inference_engine *ie, size_t tensor_index, + void *value, const int size) { + memcpy(value, ie->input_buffers[tensor_index], size); + return 0; +} + +DLLEXPORT int get_output_tensor(inference_engine *ie, size_t tensor_index, + void *value, const int size) { + memcpy(value, ie->output_buffers[tensor_index], size); + return 0; +} + +DLLEXPORT int invoke(inference_engine *ie) { return interp_invoke_par_5(ie); } + +DLLEXPORT int reset(inference_engine *ie) { return interp_reset(ie); } + +// Unused +// DLLEXPORT size_t get_tensor_details_buffer_sizes(inference_engine *ie, +// size_t tensor_index, size_t *dims, +// size_t *scales, size_t *zero_points) +// { +// return ie->xtflm->interpreter->GetTensorDetailsBufferSizes( +// tensor_index, dims, scales, zero_points); +// } + +// Unused +// DLLEXPORT int get_tensor_details(inference_engine *ie, size_t tensor_index, +// char *name, +// int name_len, int *shape, int *type, float *scale, +// int *zero_point) { +// return ie->xtflm->interpreter->GetTensorDetails( +// tensor_index, name, name_len, shape, type, scale, zero_point); +// } + +DLLEXPORT size_t get_error(inference_engine *ie, char *msg) { + std::strcpy(msg, (const char *)ie->debug_log_buffer); + return strlen(msg); +} + +// Unused +// DLLEXPORT size_t input_tensor_index(inference_engine *ie, size_t +// input_index) { +// return ie->xtflm->interpreter->input_tensor_index(input_index); +// } + +// Unused +// DLLEXPORT size_t output_tensor_index(inference_engine *ie, size_t +// output_index) { +// return ie->xtflm->interpreter->output_tensor_index(output_index); +// } + +} // extern "C" diff --git a/python/xmos_ai_tools/xinterpreters/src/xtflm_conf.h b/python/xmos_ai_tools/xinterpreters/src/xtflm_conf.h new file mode 100644 index 000000000..d78d457b3 --- /dev/null +++ b/python/xmos_ai_tools/xinterpreters/src/xtflm_conf.h @@ -0,0 +1,5 @@ +#define XTFLM_OPERATORS (250) +#define NUM_OUTPUT_TENSORS (40) +#define NUM_INPUT_TENSORS (40) +#define MAX_DEBUG_LOG_LENGTH (1024) +#define AISRV_GPIO_LENGTH (4) diff --git a/requirements.txt b/requirements.txt index 7b5510a59..ed78894f0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,20 @@ -numpy==1.19.4 -tensorflow==2.7.0 -pytest==6.2.5 +# python_version 3.11 +# pip_version 25.* + +tensorflow==2.15.0; sys_platform != 'darwin' and platform_machine != 'arm64' +tensorflow==2.11.0; sys_platform == 'darwin' and platform_machine == 'x86_64' +tensorflow-macos==2.15.0; sys_platform == 'darwin' and platform_machine == 'arm64' +numpy<2; sys_platform == 'darwin' and platform_machine == 'x86_64' +numpy>=1.20 +pkgconfig==1.5.5 +protobuf +pytest==7.0.1 +pytest-xdist==2.5.0 +pytest-rerunfailures==10.2 +flatbuffers>=2.0 +tflite==2.10.0 +pyusb>=1.2.1 +larq-compute-engine==0.13.0 +PyYAML==6.0 +h5py>=3.6.0 +setuptools_scm diff --git a/test/README.md b/test/README.md deleted file mode 100644 index 4365f51fe..000000000 --- a/test/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# Integration Tests - -Before running the integration tests, you must first install the `xcore_interpreter` python module as described in the main [`README.md`](../README.md). - -## Running all tests with the host interpreter - -To run all tests in the suite: -``` -pytest integration_test -``` - -When modifying the test suite itself (or the model generation framework in `tflite2xcore`) it is usually necessary to clear cached models and data: -``` -pytest integration_test --cache-clear -``` - -The model cache is currently not process-safe. Thus when running tests on multiple processes with `pytest-xdist`, it is usually necessary to specify `--dist loadfile`. -To run all tests using NUM worker processes: -``` -pytest integration_test -n NUM --dist loadfile -``` - -## Running tests with the device interpreter - -*To do this, the XMOS tools need to be installed and on the path.* - -To run on the device, specify the `--use-device` flag for any test. Some tests are skipped on the device to speed up execution or avoid known errors associated with insufficient arena size or other HW-related problems. - -Do not use the `-n` option when running on the device. - -## Running specific tests or configurations - -To run a specific test (function) in a module, use the `::` notation, e.g.: -``` -pytest integration_test/test_single_op_models/test_fully_connected.py::test_output -``` - -Test modules typically include multiple configurations, either defined by the `CONFIGS` variable in the module, or in an adjacent `.yml` file with identical base name (e.g. `test_fully_connected.{py,yml}`). -To run a single configuration with index `0` of a particular test (function): -``` -pytest integration_test/test_single_op_models/test_fully_connected.py::test_output[CONFIGS[0]] -``` - -## Dump test models - -Specifying `--dump models` will save the converted `.tflite` models in the model cache directory. To print the location of these saved models, set the logging level to `info` by setting `--log-cli-level=info`. - -## Other testing options - -For additional logging output, including case index for failures, specify a desired log level with `--log-cli-level={warning,info,debug}`. - -To halt at the first failure or error use the `-x` flag. - -For more info on built-in and custom options, run `pytest -h`, or consult the documentation https://docs.pytest.org/en/stable/contents.html. diff --git a/test/generate.ipynb b/test/generate.ipynb deleted file mode 100644 index e1bfdd70b..000000000 --- a/test/generate.ipynb +++ /dev/null @@ -1,1411 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import yaml\n", - "import lhsmdu\n", - "import numpy as np\n", - "from scipy.stats import distributions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def make_configs(params, conditions, *, N):\n", - " A = lhsmdu.sample(len(params), N)\n", - " distros = {\n", - " k: distributions.randint(0, len(p_vals))\n", - " for k, p_vals in params.items()\n", - " }\n", - " idx_map = {\n", - " key: np.int32(lhsmdu.inverseTransformSample(distros[key], floats)).flatten().tolist()\n", - " for floats, key in zip(A, params)\n", - " }\n", - "\n", - " configs = []\n", - " for b in zip(*idx_map.values()):\n", - " d = {k: params[j] for j, (k, params) in zip(b, params.items())}\n", - " if conditions(d):\n", - " configs.append(d)\n", - " return configs" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "noalias_dumper = yaml.dumper.SafeDumper\n", - "noalias_dumper.ignore_aliases = lambda self, data: True\n", - "def dump_configs(configs, filename):\n", - " with open(filename, \"w\") as f:\n", - " f.write(\n", - " \"# Copyright (c) 2020, XMOS Ltd, All rights reserved\\n\"\n", - " \"# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK\\n\"\n", - " )\n", - " yaml.dump({\"default\": dict(enumerate(configs))}, stream=f, Dumper=noalias_dumper)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_conv2d.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[1,4,5,8,12,15],\n", - " width=[1,4,7,8,14,20],\n", - " K_h=[1,2,3,5,7,9],\n", - " K_w=[1,3,4,5,7,9],\n", - " input_channels=[4,8,12,16,20,32,36,48],\n", - " output_channels=[4,8,12,16,28,32,48,52,64],\n", - " padding=[\"same\", \"valid\"],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def conditions(d):\n", - " if (d[\"K_w\"] == d[\"K_h\"] == 1 or d[\"K_w\"] * d[\"input_channels\"] <= 32):\n", - " return False\n", - " if d[\"num_threads\"] > d[\"height\"] or d[\"num_threads\"] > d[\"width\"]:\n", - " return False\n", - " if d[\"padding\"] == \"valid\":\n", - " if d[\"K_w\"] == d[\"width\"] and d[\"K_h\"] == d[\"height\"]:\n", - " # this would be single pixel conv2d\n", - " return False\n", - " return d[\"K_w\"] <= d[\"width\"] and d[\"K_h\"] <= d[\"height\"]\n", - " return True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions, N=100)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_conv2d.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_custom_relu_conv2d.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params[\"max_value\"] = [j/2 for j in range(1, 12)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions, N=50)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_custom_relu_conv2d.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_padded_conv2d.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[1,4,5,8,12,15],\n", - " width=[1,4,7,8,14,20],\n", - " K_h=[1,2,3,5,7,9],\n", - " K_w=[1,3,4,5,7,9],\n", - " input_channels=[4,8,12,16,20,32,36,48],\n", - " output_channels=[4,8,12,16,28,32,48,52,64],\n", - " pad_t=[0,1,2],\n", - " pad_b=[0,1,2],\n", - " pad_l=[0,1,2],\n", - " pad_r=[0,1,2],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def conditions(d):\n", - " if (d[\"K_w\"] == d[\"K_h\"] == 1 or d[\"K_w\"] * d[\"input_channels\"] <= 32):\n", - " return False\n", - " if d[\"num_threads\"] > d[\"height\"] or d[\"num_threads\"] > d[\"width\"]:\n", - " return False\n", - " if d[\"pad_t\"] == d[\"pad_b\"] == d[\"pad_l\"] == d[\"pad_r\"] == 0:\n", - " return False\n", - " padded_width = d[\"width\"] + d[\"pad_l\"] + d[\"pad_r\"]\n", - " padded_height = d[\"height\"] + d[\"pad_t\"] + d[\"pad_b\"]\n", - " if d[\"K_w\"] == padded_width and d[\"K_h\"] == padded_height:\n", - " # this would be single pixel conv2d\n", - " return False\n", - " return (\n", - " d[\"K_w\"] <= padded_width\n", - " and d[\"K_h\"] <= padded_height\n", - " and d[\"pad_r\"] < d[\"K_w\"] > d[\"pad_l\"]\n", - " and d[\"pad_t\"] < d[\"K_h\"] > d[\"pad_b\"]\n", - " ) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions, N=70)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_padded_conv2d.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_conv2d_1x1.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[1,4,5,8,12,15],\n", - " width=[1,4,7,8,14,20],\n", - " input_channels=[4,8,12,16,20,32,36,48],\n", - " output_channels=[4,8,12,16,28,32,48,52,64],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def conditions(d):\n", - " if d[\"width\"] == d[\"height\"] == 1:\n", - " # this would be single pixel conv2d\n", - " return False\n", - " return not (d[\"num_threads\"] > d[\"height\"] or d[\"num_threads\"] > d[\"width\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions, N=55)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_conv2d_1x1.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_conv2d_shallowin.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[1,4,5,8,12,15],\n", - " width=[1,4,7,8,14,20],\n", - " K_h=[1,2,3,5,7,9],\n", - " K_w=[1,2,3,4,5,7,8],\n", - " input_channels=[4,8,16,32],\n", - " output_channels=[4,8,12,16,28,32,48,52,64],\n", - " padding=[\"same\", \"valid\"],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def conditions(d):\n", - " if (d[\"K_w\"] == d[\"K_h\"] == 1 or d[\"K_w\"] * d[\"input_channels\"] > 32):\n", - " return False\n", - " if d[\"num_threads\"] > d[\"height\"] or d[\"num_threads\"] > d[\"width\"]:\n", - " return False\n", - " if d[\"padding\"] == \"valid\":\n", - " if d[\"K_w\"] == d[\"width\"] and d[\"K_h\"] == d[\"height\"]:\n", - " # this would be single pixel conv2d\n", - " return False\n", - " return d[\"K_w\"] <= d[\"width\"] and d[\"K_h\"] <= d[\"height\"]\n", - " return True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions, N=150)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_conv2d_shallowin.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_padded_conv2d_shallowin.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[1,4,5,8,12,15],\n", - " width=[1,4,7,8,14,20],\n", - " K_h=[1,2,3,5,7,9],\n", - " K_w=[1,2,3,4,5,7,8],\n", - " input_channels=[4,8,16,32],\n", - " output_channels=[4,8,12,16,28,32,48,52,64],\n", - " pad_t=[0,1,2],\n", - " pad_b=[0,1,2],\n", - " pad_l=[0,1,2],\n", - " pad_r=[0,1,2],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def conditions(d):\n", - " if (d[\"K_w\"] == d[\"K_h\"] == 1 or d[\"K_w\"] * d[\"input_channels\"] > 32):\n", - " return False\n", - " if d[\"num_threads\"] > d[\"height\"] or d[\"num_threads\"] > d[\"width\"]:\n", - " return False\n", - " if d[\"pad_t\"] == d[\"pad_b\"] == d[\"pad_l\"] == d[\"pad_r\"] == 0:\n", - " return False\n", - " padded_width = d[\"width\"] + d[\"pad_l\"] + d[\"pad_r\"]\n", - " padded_height = d[\"height\"] + d[\"pad_t\"] + d[\"pad_b\"]\n", - " if d[\"K_w\"] == padded_width and d[\"K_h\"] == padded_height:\n", - " # this would be single pixel conv2d\n", - " return False\n", - " return (\n", - " d[\"K_w\"] <= padded_width\n", - " and d[\"K_h\"] <= padded_height\n", - " and d[\"pad_r\"] < d[\"K_w\"] > d[\"pad_l\"]\n", - " and d[\"pad_t\"] < d[\"K_h\"] > d[\"pad_b\"]\n", - " ) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions, N=150)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_padded_conv2d_shallowin.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_depthwise_conv2d.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[1,4,5,8,12,15],\n", - " width=[1,4,7,8,14,20],\n", - " K_h=[1,2,3,5,7,9],\n", - " K_w=[1,2,3,4,5,7,8],\n", - " channels=[4,8,12,16,28,32,48,52,64],\n", - " padding=[\"same\", \"valid\"],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def conditions(d):\n", - " if d[\"num_threads\"] > d[\"height\"] or d[\"num_threads\"] > d[\"width\"]:\n", - " return False\n", - " if d[\"padding\"] == \"valid\":\n", - " return d[\"K_w\"] <= d[\"width\"] and d[\"K_h\"] <= d[\"height\"]\n", - " return True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions, N=70)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_depthwise_conv2d.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_padded_depthwise_conv2d.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[1,4,5,8,12,15],\n", - " width=[1,4,7,8,14,20],\n", - " K_h=[1,2,3,5,7,9],\n", - " K_w=[1,2,3,4,5,7,8],\n", - " channels=[4,8,12,16,28,32,48,52,64],\n", - " pad_t=[0,1,2],\n", - " pad_b=[0,1,2],\n", - " pad_l=[0,1,2],\n", - " pad_r=[0,1,2],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def conditions(d):\n", - " if d[\"num_threads\"] > d[\"height\"] or d[\"num_threads\"] > d[\"width\"]:\n", - " return False\n", - " if d[\"pad_t\"] == d[\"pad_b\"] == d[\"pad_l\"] == d[\"pad_r\"] == 0:\n", - " return False\n", - " return (\n", - " d[\"K_w\"] <= d[\"width\"] + d[\"pad_l\"] + d[\"pad_r\"]\n", - " and d[\"K_h\"] <= d[\"height\"] + d[\"pad_t\"] + d[\"pad_b\"]\n", - " and d[\"pad_r\"] < d[\"K_w\"] > d[\"pad_l\"]\n", - " and d[\"pad_t\"] < d[\"K_h\"] > d[\"pad_b\"]\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions, N=70)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_padded_depthwise_conv2d.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_maxpool2d.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[1,4,5,8,12,15],\n", - " width=[1,4,7,8,14,20],\n", - " K_h=[1,2,3],\n", - " K_w=[1,2,3],\n", - " channels=[4,8,12,16,28,32,48,52,64],\n", - " padding=[\"valid\"],\n", - " strides=[(1,1), (1,2), (2,1), (2,2), (1, 3), (3, 2)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def conditions(d):\n", - " if d[\"num_threads\"] > d[\"height\"] or d[\"num_threads\"] > d[\"width\"]:\n", - " return False\n", - " return d[\"K_w\"] <= d[\"width\"] and d[\"K_h\"] <= d[\"height\"]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions, N=62)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_maxpool2d.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_avgpool2d.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions, N=62)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_avgpool2d.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_global_avgpool2d.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[1,4,5,8,12,15],\n", - " width=[1,4,7,8,14,20],\n", - " channels=[4,8,12,16,28,32,48,52,64],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def conditions(d):\n", - " return not (\n", - " d[\"num_threads\"] > d[\"height\"] or d[\"num_threads\"] > d[\"width\"]\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions, N=55)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_global_avgpool2d.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Activations" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[1,4,5,8,12,15],\n", - " width=[1,4,7,8,14,20],\n", - " channels=[1,4,7,12,16,25,32,49],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for file in [\"test_relu.yml\", \"test_relu6.yml\", \"test_sigmoid.yml\", \"test_tanh.yml\"]:\n", - " configs = make_configs(params, conditions=lambda _: True, N=40)\n", - " print(file, len(configs))\n", - " dump_configs(configs, file)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_fully_connected.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[1,4,5,8,12,15],\n", - " width=[1,4,7,8,14,20],\n", - " channels=[1,4,7,12,16,25,32,49],\n", - " outputs=[1,4,7,12,16,25,32,49],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=40)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_fully_connected.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_single_pixel_conv2d.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " K_h=[1,2,4,5,8,12,15],\n", - " K_w=[1,3,4,7,9,14,20],\n", - " input_channels=[1,4,7,12,16,25,32,49],\n", - " output_channels=[1,4,7,12,16,25,32,49],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=20)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_single_pixel_conv2d.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_bsign.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[1,4,5,8],\n", - " width=[1,4,7,8],\n", - " input_channels=[i*32 for i in (1,4,7)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=20)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_bsign.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_bconv2d_bin_DI.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[7, 10, 12],\n", - " width=[6, 8, 11],\n", - " K_h=[1,2,3,6],\n", - " K_w=[1,3,4,5],\n", - " input_channels=[256,512],\n", - " output_channels=[32, 64],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=20)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_bconv2d_bin_DI.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_bconv2d_bin_DI_padded.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[7, 10, 12],\n", - " width=[6, 8, 11],\n", - " K_h=[2,3,6],\n", - " K_w=[3,4,5],\n", - " input_channels=[256,512],\n", - " output_channels=[32, 64],\n", - " padding=[\"same\"],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=20)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_bconv2d_bin_DI_padded.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_bconv2d_bin.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[7, 10, 12],\n", - " width=[6, 8, 11],\n", - " K_h=[1,2,3,6],\n", - " K_w=[1,3,4,5],\n", - " input_channels=[32, 128],\n", - " output_channels=[32, 64],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=20)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_bconv2d_bin.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_bconv2d_bin_padded.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[7, 10, 12],\n", - " width=[6, 8, 11],\n", - " K_h=[1,2,3,6],\n", - " K_w=[1,3,4,5],\n", - " input_channels=[32, 128],\n", - " output_channels=[32, 64],\n", - " padding=[\"same\"],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=20)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_bconv2d_bin_padded.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_pad.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[1,4,5,8,12,15],\n", - " width=[1,4,7,8,14,20],\n", - " channels=[4,8,12,16,28,32,48,52,64],\n", - " pad_t=[0,1,2],\n", - " pad_b=[0,1,2],\n", - " pad_l=[0,1,2],\n", - " pad_r=[0,1,2],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def conditions(d):\n", - " return sum(params[\"pad_\" + k] for k in \"tblr\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=20)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_pad.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_bconv2d_int8_DIDO.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[7, 10, 12],\n", - " width=[6, 8, 11],\n", - " K_h=[1,2,3,6],\n", - " K_w=[1,3,4,5],\n", - " input_channels=[256,512],\n", - " output_channels=[16, 48],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " output_range = [(range_min, range_max) for range_min in range(-4, 1, 2) for range_max in range(1, 6, 2)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=20)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_bconv2d_int8_DIDO.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_bconv2d_int8.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[7, 10, 12],\n", - " width=[6, 8, 11],\n", - " K_h=[1,2,3,6],\n", - " K_w=[1,3,4,5],\n", - " input_channels=[32, 128, 256+64],\n", - " output_channels=[4, 28, 32],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " output_range = [(range_min, range_max) for range_min in range(-4, 1, 2) for range_max in range(1, 6, 2)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=20)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_bconv2d_int8.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_bconv2d_int8_DIDO_padded.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[7, 10, 12],\n", - " width=[6, 8, 11],\n", - " K_h=[1,2,3,6],\n", - " K_w=[1,3,4,5],\n", - " input_channels=[256,512],\n", - " output_channels=[16, 48],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " padding=[\"same\"],\n", - " output_range = [(range_min, range_max) for range_min in range(-4, 1, 2) for range_max in range(1, 6, 2)]\n", - "# num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=20)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_bconv2d_int8_DIDO_padded.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_bconv2d_int8_padded.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[7, 10, 12],\n", - " width=[6, 8, 11],\n", - " K_h=[1,2,3,6],\n", - " K_w=[1,3,4,5],\n", - " input_channels=[32, 128, 256+64],\n", - " output_channels=[4, 28, 32],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " padding=[\"same\"],\n", - " output_range = [(range_min, range_max) for range_min in range(-4, 1, 2) for range_max in range(1, 6, 2)],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=20)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_bconv2d_int8_padded.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_bconv2d_int8_activation.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[7, 10, 12],\n", - " width=[6, 8, 11],\n", - " K_h=[1,2,3,6],\n", - " K_w=[1,3,4,5],\n", - " input_channels=[32, 128, 256+64],\n", - " output_channels=[4, 28, 32],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " output_range = [(range_min, range_max) for range_min in range(-4, 1, 2) for range_max in range(1, 6, 2)],\n", - " activation = [\"relu\", \"relu6\"],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=20)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_bconv2d_int8_activation.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_bconv2d_int8_DIDO_activation.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[7, 10, 12],\n", - " width=[6, 8, 11],\n", - " K_h=[1,2,3,6],\n", - " K_w=[1,3,4,5],\n", - " input_channels=[256,512],\n", - " output_channels=[16, 48],\n", - " strides=[(1,1), (1,2), (2,1), (2,2)],\n", - " output_range = [(range_min, range_max) for range_min in range(-4, 1, 2) for range_max in range(1, 6, 2)],\n", - " activation = [\"relu\", \"relu6\"],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=20)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_bconv2d_int8_DIDO_activation.yml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# test_add.yml" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params = dict(\n", - " height=[1,3,5,8,13,15],\n", - " width=[1,5,6,7,9,11],\n", - " channels=[4,11,13,51,53,64],\n", - " num_threads=[1,2,5],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "configs = make_configs(params, conditions=lambda _: True, N=20)\n", - "len(configs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dump_configs(configs, \"test_add.yml\")" - ] - }, - { - "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.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/test/integration_test/__init__.py b/test/integration_test/__init__.py deleted file mode 100644 index ef59eb051..000000000 --- a/test/integration_test/__init__.py +++ /dev/null @@ -1,441 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import logging -import pytest -import _pytest -import numpy as np -import tensorflow as tf -from abc import abstractmethod -from pathlib import Path -from typing import ( - Union, - List, - NamedTuple, - Tuple, - Dict, - Iterable, - Type, - Any, -) - -from tflite2xcore.utils import unpack_bits -from tflite2xcore.xcore_schema import XCOREModel -from tflite2xcore.model_generation import ( - TFLiteModel, - ModelGenerator, -) -from tflite2xcore.model_generation.runners import Runner -from tflite2xcore.model_generation.evaluators import ( - LarqEvaluator, - TFLiteEvaluator, - TFLiteQuantEvaluator, - XCoreEvaluator, -) -from tflite2xcore.model_generation.converters import ( - LarqConverter, - TFLiteFloatConverter, - TFLiteQuantConverter, - XCoreConverter, -) -from tflite2xcore.model_generation.data_factories import ( - TensorDataFactory, - InputInitializerDataFactory, -) - - -# ---------------------------------------------------------------------------- -# RUNNERS -# ---------------------------------------------------------------------------- - - -class IntegrationTestRunner(Runner): - _model_generator: "IntegrationTestModelGenerator" - _representative_data: tf.Tensor - - def __init__( - self, - generator: Type["IntegrationTestModelGenerator"], - *, - use_device: bool = False, - experimental_xformer2: bool = False, - only_experimental_xformer2: bool = False, - ) -> None: - super().__init__(generator) - self._use_device = use_device - - self._repr_data_factory = self.make_repr_data_factory() - self.register_data_factory(self._repr_data_factory) - - self._xcore_converter = XCoreConverter( - self, - self.get_xcore_reference_model, - experimental_xformer2=experimental_xformer2, - only_experimental_xformer2=only_experimental_xformer2, - ) - self.register_converter(self._xcore_converter) - - self._identity_converter = XCoreConverter( - self, - self._xcore_converter.get_converted_model, - experimental_xformer2=experimental_xformer2, - only_experimental_xformer2=only_experimental_xformer2, - ) - self.register_converter(self._identity_converter) - - self._xcore_evaluator = XCoreEvaluator( - self, - self.get_xcore_evaluation_data, - self._xcore_converter.get_converted_model, - self._xcore_converter.get_converted_model_params, - use_device=self._use_device, - ) - self.register_evaluator(self._xcore_evaluator) - - @abstractmethod - def get_xcore_reference_model(self) -> TFLiteModel: - raise NotImplementedError() - - def make_repr_data_factory(self) -> TensorDataFactory: - # representative data (e.g. for quantization and test) - return InputInitializerDataFactory( - self, lambda: self._model_generator.input_shape - ) - - @property - def repr_data_example_count(self) -> int: - return 10 - - def get_representative_data(self) -> tf.Tensor: - try: - return self._representative_data - except AttributeError: - try: - self._representative_data = self._repr_data_factory.make_data( - self.repr_data_example_count - ) - except AttributeError: - raise Exception( - "Cannot get quantization data before runner is run!" - ) from None - return self._representative_data - - @abstractmethod - def get_xcore_evaluation_data(self) -> Union[np.ndarray, tf.Tensor]: - raise NotImplementedError() - - @classmethod - def load(cls, dirpath: Union[Path, str]) -> "IntegrationTestRunner": - runner = super().load(dirpath) - assert isinstance(runner, IntegrationTestRunner) - return runner - - def rerun_post_cache(self) -> None: - self._xcore_converter.convert() - self._xcore_evaluator.evaluate() - - -class DefaultOutputData(NamedTuple): - reference_float: np.ndarray - reference_quant: np.ndarray - xcore: np.ndarray - - -class DefaultIntegrationTestRunner(IntegrationTestRunner): - outputs: DefaultOutputData - _xcore_evaluation_data: np.ndarray - - def __init__( - self, - generator: Type["IntegrationTestModelGenerator"], - **kwargs: Any, - ) -> None: - super().__init__(generator, **kwargs) - - # floating point reference - self._reference_float_converter = TFLiteFloatConverter( - self, self.get_built_model - ) - self.register_converter(self._reference_float_converter) - - self._reference_float_evaluator = TFLiteEvaluator( - self, - self.get_representative_data, - self._reference_float_converter.get_converted_model, - None, - ) - self.register_evaluator(self._reference_float_evaluator) - - # quantized reference - self._reference_quant_converter = TFLiteQuantConverter( - self, self.get_built_model, self.get_representative_data - ) - self.register_converter(self._reference_quant_converter) - - self._reference_quant_evaluator = TFLiteQuantEvaluator( - self, - self.get_representative_data, - self._reference_quant_converter.get_converted_model, - None, - ) - self.register_evaluator(self._reference_quant_evaluator) - - def get_xcore_reference_model(self) -> TFLiteModel: - return self._reference_quant_converter.get_converted_model() - - def get_xcore_evaluation_data(self) -> Union[np.ndarray, tf.Tensor]: - return self._reference_quant_evaluator.input_data - - def run(self) -> None: - """Defines how a DefaultIntegrationTestRunner should be run. - - Most integration tests require self.outputs to be set. - """ - super().run() - self._reference_float_converter.convert() - self._reference_quant_converter.convert() - - self._reference_quant_evaluator.evaluate() - self._reference_float_evaluator.evaluate() - - self.rerun_post_cache() - - def rerun_post_cache(self) -> None: - super().rerun_post_cache() - - self.outputs = DefaultOutputData( - self._reference_float_evaluator.output_data, - self._reference_quant_evaluator.output_data, - self._xcore_evaluator.output_data, - ) - self.converted_models.update( - { - "reference_quant": self._reference_quant_converter._model, - "xcore": self._xcore_converter._model, - } - ) - - def dump( - self, - dirpath: Path, - example_idx: Union[int, Iterable[int]] = [], - *, - dump_models: bool = True, - dump_visualizations: bool = True, - ) -> None: - if dump_models: - self.dump_models(dirpath, visualize=dump_visualizations) - - self.dump_data( - dirpath, - data={ - "input": self._xcore_evaluator.input_data, - "reference_quant_output": self.outputs.reference_quant, - "xcore_output": self.outputs.xcore, - }, - example_idx=example_idx, - ) - - -class BinarizedOutputData(NamedTuple): - reference_quant: np.ndarray - xcore: np.ndarray - - -class BinarizedTestRunner(IntegrationTestRunner): - outputs: BinarizedOutputData - - def __init__( - self, - generator: Type["IntegrationTestModelGenerator"], - **kwargs: Any, - ) -> None: - super().__init__(generator, **kwargs) - - self._lce_converter = self.make_lce_converter() - self.register_converter(self._lce_converter) - - self._lce_evaluator = LarqEvaluator( - self, self.get_representative_data, self._lce_converter.get_converted_model, None - ) - self.register_evaluator(self._lce_evaluator) - - def get_xcore_evaluation_data(self) -> Union[np.ndarray, tf.Tensor]: - return self.get_representative_data() - - def make_lce_converter(self) -> LarqConverter: - return LarqConverter(self, self.get_built_model) - - def get_xcore_reference_model(self) -> TFLiteModel: - return self._lce_converter.get_converted_model() - - def run(self) -> None: - super().run() - self._lce_converter.convert() - self._lce_evaluator.evaluate() - - self.rerun_post_cache() - - def rerun_post_cache(self) -> None: - super().rerun_post_cache() - - self.outputs = BinarizedOutputData( - self._lce_evaluator.output_data, - self._xcore_evaluator.output_data, - ) - self.converted_models.update( - { - "reference_lce": self._lce_converter._model, - "xcore": self._xcore_converter._model, - } - ) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class IntegrationTestModelGenerator(ModelGenerator): - @abstractmethod - def _build_core_model(self) -> tf.keras.Model: - raise NotImplementedError() - - def build(self) -> None: - self._prep_backend() - self._model = self._build_core_model() - self._model.build(self._model.input_shape) - - -# ---------------------------------------------------------------------------- -# HELPERS -# ---------------------------------------------------------------------------- - - -class FailedElement(NamedTuple): - idx: Tuple[int, ...] - diff: Union[int, float] - expected: Union[int, float] - predicted: Union[int, float] - - -def __log_deviations(diff: np.ndarray, level: int, *, msg: str) -> None: - logger = logging.getLogger() - if logger.isEnabledFor(level): - if np.issubdtype(diff.dtype, np.integer): - devs = [ - f"{c}/{diff.size} ({c / diff.size:.2%}) with diff={v}" - for v, c in zip(*np.unique(diff, return_counts=True)) - if v - ] - msg += " deviations: " + (", ".join(devs) if devs else "None") - else: - stats = { - "mean": np.mean(diff), - "stdev": np.std(diff), - "median": np.median(diff), - "min": np.min(diff), - "max": np.max(diff), - } - msg += f" deviation stats: {stats}" - - logger.log(level, msg) - - -class BatchedArrayComparison(NamedTuple): - failures: Dict[int, List[FailedElement]] - mean_abs_diffs: List[float] - - -def _compare_batched_arrays( - predicted: np.ndarray, - expected: np.ndarray, - tolerance: Union[int, float], - per_bits: bool = False, -) -> BatchedArrayComparison: - assert tolerance >= 0 - assert predicted.shape == expected.shape - - output_type = predicted.dtype - assert output_type == expected.dtype # NOTE: 'is' operator can be buggy, use == - if per_bits: - predicted = unpack_bits(predicted) - expected = unpack_bits(expected) - diffs = np.bitwise_xor(predicted, expected) - elif np.issubdtype(output_type, np.integer): - diffs = np.int64(predicted) - np.int64(expected) - elif np.issubdtype(output_type, np.floating): - tolerance = np.float32(tolerance) - diffs = np.float32(predicted) - np.float32(expected) - else: - raise TypeError("Only integer and float types are supported") - - failures: Dict[int, List[FailedElement]] = {} - mean_abs_diffs: List[float] = [] - for j, (arr, arr_ref, diff) in enumerate(zip(predicted, expected, diffs)): - __log_deviations(diff, logging.DEBUG, msg=f"Example {j}") - abs_diff = np.abs(diff) - diff_idx = zip(*np.where(abs_diff > tolerance)) - failed_elements = [ - FailedElement(idx, diff[idx], arr_ref[idx], arr[idx]) for idx in diff_idx - ] - if failed_elements: - failures[j] = failed_elements - - mean_abs_diffs.append(float(np.mean(abs_diff))) - - __log_deviations(diffs, logging.INFO, msg="Total") - return BatchedArrayComparison(failures, mean_abs_diffs) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mean_abs_diffs( - compared_outputs: BatchedArrayComparison, mean_abs_diff_tolerance: float -) -> None: - msg = [ - f"\nidx={j}: mean_abs_diff={mean_abs_diff} > tolerance={mean_abs_diff_tolerance}" - for j, mean_abs_diff in enumerate(compared_outputs.mean_abs_diffs) - if mean_abs_diff > mean_abs_diff_tolerance - ] - if msg: - pytest.fail( - f"The following examples have excessive mean deviations:{''.join(msg)}", - pytrace=False, - ) - - -def test_output( - compared_outputs: BatchedArrayComparison, request: _pytest.fixtures.SubRequest -) -> None: - verbose = request.config.getoption("verbose") > 0 - - if compared_outputs.failures: - msg = "The following examples have failed elements:" - msg += "".join( - f"\n{request.node.fspath}::{request.node.name} Example {j}" - + ( - "".join( - f"\nidx={e.idx}: diff={e.diff}, " - f"expected={e.expected}, predicted={e.predicted}" - for e in elements - ) - if verbose - else "" - ) - for j, elements in compared_outputs.failures.items() - ) - if not verbose: - msg += "\nSet verbosity > 0 for more details." - pytest.fail(msg, pytrace=False) - - -@pytest.mark.skip_on_device -@pytest.mark.skip_on_xformer2 -def test_idempotence(xcore_model: XCOREModel, run: IntegrationTestRunner) -> None: - run._identity_converter.convert() - identical_model = XCOREModel.deserialize(run._identity_converter._model) - assert xcore_model.is_equal(identical_model) diff --git a/test/integration_test/conftest.py b/test/integration_test/conftest.py deleted file mode 100644 index f22a5d175..000000000 --- a/test/integration_test/conftest.py +++ /dev/null @@ -1,289 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import yaml -import logging -import portalocker -import pytest -import _pytest -import numpy as np -from pathlib import Path -from typing import Dict, Type, Optional, Union, List - -from tflite2xcore.utils import dequantize -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.model_generation.utils import stringify_config - -from . import ( - IntegrationTestRunner, - DefaultIntegrationTestRunner, - _compare_batched_arrays, - BatchedArrayComparison, -) - - -# ---------------------------------------------------------------------------- -# HOOKS -# ---------------------------------------------------------------------------- - - -def pytest_addoption(parser: _pytest.config.argparsing.Parser) -> None: - parser.addoption( - "-C", - "--coverage", - action="store", - default="default", - choices=["reduced", "default", "extended"], - help="Set the coverage level", - ) - - parser.addoption( - "-D", - "--dump", - action="store", - default=None, - choices=[None, "models"], - help="Set what contents of the model generation runs should be dumped into cache for easier access.", - ) - - parser.addoption( - "--config-only", - action="store_true", - help="The model generators are configured but not run", - ) - - parser.addoption( - "--generate-only", - action="store_true", - help="The model generators are run and cached but outputs are not evaluated for correctness", - ) - - parser.addoption( - "--use-device", - action="store_true", - help="Execute interpreter on hardware device", - ) - - parser.addoption( - "--experimental-xformer2", - action="store_true", - help="Use MLIR-based xformer 2.0 for part of the optimization pipeline. Experimental.", - ) - - parser.addoption( - "--only-experimental-xformer2", - action="store_true", - help="Use MLIR-based xformer 2.0 for part of the optimization pipeline. Experimental.", - ) - - -def pytest_generate_tests(metafunc: _pytest.python.Metafunc) -> None: - if "run" in metafunc.fixturenames: - try: - configs = metafunc.module.__configs - except AttributeError: - try: - CONFIGS = metafunc.module.CONFIGS - config_file = Path(metafunc.module.__file__) - except AttributeError: - logging.debug(f"CONFIGS undefined in {metafunc.module}") - config_file = Path(metafunc.module.__file__).with_suffix(".yml") - try: - with open(config_file, "r") as f: - CONFIGS = yaml.load(f, Loader=yaml.FullLoader) - except FileNotFoundError: - logging.info( - "Cannot find .yml test config file and " - "test module does not contain CONFIGS" - ) - CONFIGS = {} - - coverage = metafunc.config.getoption("coverage") - try: - configs = list(CONFIGS[coverage].values()) if CONFIGS else [{}] - except KeyError: - raise KeyError( - "CONFIGS does not define coverage level " - f"'{coverage}' in {config_file.resolve()}" - ) from None - metafunc.module.__configs = configs - - metafunc.parametrize( - "run", - configs, - indirect=True, - ids=[f"CONFIGS[{j}]" for j, _ in enumerate(configs)], - ) - - -def pytest_collection_modifyitems( - config: _pytest.config.Config, items: List[pytest.Item] -) -> None: - use_device = config.getoption("--use-device") - use_xformer2 = config.getoption("--experimental-xformer2") or config.getoption("--only-experimental-xformer2") - skip_on_device = pytest.mark.skip(reason="Test skipped on device") - skip_on_xformer2 = pytest.mark.skip(reason="Test skipped when using xformer2") - for item in items: - if use_device and "skip_on_device" in item.keywords: - item.add_marker(skip_on_device) - elif use_xformer2 and "skip_on_xformer2" in item.keywords: - item.add_marker(skip_on_xformer2) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture(autouse=True) -def disable_gpus(monkeypatch: _pytest.monkeypatch.MonkeyPatch) -> None: - monkeypatch.setenv("CUDA_VISIBLE_DEVICES", "-1") - - -@pytest.fixture -def use_device(request: _pytest.fixtures.SubRequest) -> bool: - return bool(request.config.getoption("--use-device")) - - -@pytest.fixture -def experimental_xformer2(request: _pytest.fixtures.SubRequest) -> bool: - return bool(request.config.getoption("--experimental-xformer2")) - -@pytest.fixture -def only_experimental_xformer2(request: _pytest.fixtures.SubRequest) -> bool: - return bool(request.config.getoption("--only-experimental-xformer2")) - -_WORKER_CACHE: Dict[Path, IntegrationTestRunner] = {} - - -@pytest.fixture -def run( - request: _pytest.fixtures.SubRequest, use_device: bool -) -> IntegrationTestRunner: - try: - GENERATOR = request.module.GENERATOR - except AttributeError: - raise NameError("GENERATOR not designated in test") from None - - try: - RUNNER: Type[IntegrationTestRunner] = request.module.RUNNER - except AttributeError: - RUNNER = DefaultIntegrationTestRunner - - pytest_config = request.config - - if request.param.pop("skip_on_device", False) and use_device: - pytest.skip() - - runner = RUNNER( - GENERATOR, - use_device=use_device, - experimental_xformer2=pytest_config.getoption("--experimental-xformer2"), - only_experimental_xformer2=pytest_config.getoption("--only-experimental-xformer2"), - ) - runner.set_config(**request.param) - - logging.info(f"Config: {runner._config}") - if pytest_config.getoption("--config-only"): - pytest.skip() - - config_str = stringify_config(runner._config) - file_path = Path(request.module.__file__) - key = file_path.relative_to(pytest_config.rootdir) / config_str - - try: - runner = _WORKER_CACHE[key] - except KeyError: - pytest_cache = pytest_config.cache - if pytest_cache is None: - raise TypeError("pytest cache is not available") - - dirpath = pytest_cache.get(str(key), "") - if dirpath: - runner = runner.load(dirpath) - logging.debug(f"cached runner loaded from {dirpath}") - runner.rerun_post_cache() - else: - runner.run() - try: - with portalocker.BoundedSemaphore(1, hash(key), timeout=0): - dirpath = str(pytest_cache.makedir("model_cache") / key) - dirpath = runner.save(dirpath) - if pytest_config.getoption("dump") == "models": - runner.dump_models(dirpath) - - logging.debug(f"runner cached to {dirpath}") - pytest_cache.set(str(key), str(dirpath)) - except portalocker.AlreadyLocked: - # another process will write to cache - pass - _WORKER_CACHE[key] = runner - - if pytest_config.getoption("--generate-only"): - pytest.skip() - - return runner - - -@pytest.fixture -def xcore_model(run: IntegrationTestRunner) -> XCOREModel: - return XCOREModel.deserialize(run._xcore_converter._model) - - -@pytest.fixture -def reference_model(run: DefaultIntegrationTestRunner) -> XCOREModel: - return XCOREModel.deserialize(run.get_xcore_reference_model()) - - -@pytest.fixture -def abs_output_tolerance() -> int: - return 1 - - -@pytest.fixture -def bitpacked_outputs() -> bool: - return False - - -@pytest.fixture -def implicit_tolerance_margin() -> float: - return 0.05 - - -@pytest.fixture -def compared_outputs( - run: DefaultIntegrationTestRunner, - abs_output_tolerance: Optional[Union[int, float]], - bitpacked_outputs: bool, - implicit_tolerance_margin: float, -) -> BatchedArrayComparison: - if bitpacked_outputs: - return _compare_batched_arrays( - run.outputs.xcore, run.outputs.reference_quant, tolerance=0, per_bits=True - ) - if abs_output_tolerance is None: - # use implicitly derived tolerance - output_quantization = run._xcore_evaluator.output_quant - y_quant = run.outputs.reference_quant - y_float = run.outputs.reference_float - - # The implicit tolerance is derived from how much the quantized reference - # deviates from the floating point reference. - max_diff = np.max(np.abs(dequantize(y_quant, *output_quantization) - y_float)) - # max_diff is usually at least 1 bit, but we ensure this and add some room for error - abs_output_tolerance = max(float(max_diff), output_quantization.scale) * ( - 1 + implicit_tolerance_margin - ) - logging.info( - f"Using implicit absolute output tolerance: {abs_output_tolerance}" - ) - - return _compare_batched_arrays( - dequantize(run.outputs.xcore, *output_quantization), - run.outputs.reference_float, - abs_output_tolerance, - ) - - return _compare_batched_arrays( - run.outputs.xcore, run.outputs.reference_quant, abs_output_tolerance - ) diff --git a/test/integration_test/pytest.ini b/test/integration_test/pytest.ini deleted file mode 100644 index 64ff58573..000000000 --- a/test/integration_test/pytest.ini +++ /dev/null @@ -1,4 +0,0 @@ -[pytest] -markers = - skip_on_device: skips test on device (i.e. when --use-device is speficied) - skip_on_xformer2: skips tests when using new xformer 2.0 (i.e. when --experimental-xformer2 is speficied) diff --git a/test/integration_test/test_directed/__init__.py b/test/integration_test/test_directed/__init__.py deleted file mode 100644 index 74d95b753..000000000 --- a/test/integration_test/test_directed/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from .. import ( - BinarizedTestRunner, - IntegrationTestModelGenerator, - test_output, - test_idempotence, -) diff --git a/test/integration_test/test_directed/bnn_model/saved_model.pb b/test/integration_test/test_directed/bnn_model/saved_model.pb deleted file mode 100644 index fee6d36f8..000000000 Binary files a/test/integration_test/test_directed/bnn_model/saved_model.pb and /dev/null differ diff --git a/test/integration_test/test_directed/bnn_model/variables/variables.data-00000-of-00001 b/test/integration_test/test_directed/bnn_model/variables/variables.data-00000-of-00001 deleted file mode 100644 index fbb9ea8ea..000000000 Binary files a/test/integration_test/test_directed/bnn_model/variables/variables.data-00000-of-00001 and /dev/null differ diff --git a/test/integration_test/test_directed/bnn_model/variables/variables.index b/test/integration_test/test_directed/bnn_model/variables/variables.index deleted file mode 100644 index 1e4dfbf28..000000000 Binary files a/test/integration_test/test_directed/bnn_model/variables/variables.index and /dev/null differ diff --git a/test/integration_test/test_directed/test_bnn.py b/test/integration_test/test_directed/test_bnn.py deleted file mode 100644 index e6faca745..000000000 --- a/test/integration_test/test_directed/test_bnn.py +++ /dev/null @@ -1,178 +0,0 @@ -# Copyright 2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import logging -import tensorflow as tf -import numpy as np -from pathlib import Path -from typing import Optional, Type, Any -from tflite2xcore.utils import LoggingContext -from tflite2xcore.xcore_schema import ( - XCOREModel, - XCOREOpCodes, - BuiltinOpCodes, - OperatorCode, - TensorType, -) -from tflite2xcore.model_generation.data_factories import TensorDataFactory - -from . import IntegrationTestModelGenerator, BinarizedTestRunner - -from . import ( # pylint: disable=unused-import - test_idempotence, - test_output, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class BNNModelGenerator(IntegrationTestModelGenerator): - def _build_core_model(self) -> tf.keras.Model: - # tf may complain about missing gradients, so silence it - with LoggingContext(tf.get_logger(), logging.ERROR): - return tf.keras.models.load_model( - Path(__file__).parent / "bnn_model", compile=False - ) - - -GENERATOR = BNNModelGenerator - -# ---------------------------------------------------------------------------- -# DATA FACTORIES -# ---------------------------------------------------------------------------- - - -class CIFAR10TestDataFactory(TensorDataFactory): - def make_data(self, batch: Optional[int] = None) -> tf.Tensor: - _, (test_images, _) = tf.keras.datasets.cifar10.load_data() - assert self._shape_hook() == test_images.shape[1:] - return tf.cast(test_images - 128.0, tf.int8)[:batch] - - -class CIFAR10TestLabelFactory(TensorDataFactory): - def make_data(self, batch: Optional[int] = None) -> tf.Tensor: - _, (_, test_labels) = tf.keras.datasets.cifar10.load_data() - return tf.cast(test_labels, tf.int8)[:batch, 0] - - -# ---------------------------------------------------------------------------- -# RUNNERS -# ---------------------------------------------------------------------------- - - -class CIFAR10BinarizedTestRunner(BinarizedTestRunner): - def __init__( - self, - generator: Type[IntegrationTestModelGenerator], - **kwargs: Any, - ) -> None: - super().__init__(generator, **kwargs) - - self._ground_truth_data_factory = CIFAR10TestLabelFactory(self, lambda: tuple()) - self.register_data_factory(self._ground_truth_data_factory) - - @property - def repr_data_example_count(self) -> int: - # TODO: fix this when tools are more stable (on the device this tends to time out) - return 100 if self._use_device else 10000 - - def make_repr_data_factory(self) -> TensorDataFactory: - return CIFAR10TestDataFactory(self, lambda: self._model_generator.input_shape) - - def get_ground_truth_data(self) -> tf.Tensor: - return self._ground_truth_data_factory.make_data(self.repr_data_example_count) - - -RUNNER = CIFAR10BinarizedTestRunner - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def abs_output_tolerance(use_device: bool) -> int: - return 13 if use_device else 33 - - -@pytest.fixture -def expected_accuracy(use_device: bool) -> float: - return 0.79 if use_device else 0.6873 - - -@pytest.fixture -def expected_prediction_deviation(use_device: bool) -> int: - return 0 if use_device else 23 - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_prediction_deviation( - run: CIFAR10BinarizedTestRunner, expected_prediction_deviation: int -) -> None: - xcore_labels = np.argmax(run.outputs.xcore, axis=1) - reference_labels = np.argmax(run.outputs.reference_quant, axis=1) - deviation_indices = (reference_labels != xcore_labels).nonzero()[0] - assert len(deviation_indices) == expected_prediction_deviation - - -def test_accuracy(run: CIFAR10BinarizedTestRunner, expected_accuracy: float) -> None: - metric = tf.keras.metrics.Accuracy() - metric.update_state( - y_true=run.get_ground_truth_data(), y_pred=np.argmax(run.outputs.xcore, axis=1) - ) - assert metric.result().numpy() == np.float32(expected_accuracy) - - -@pytest.mark.skip_on_xformer2 -@pytest.mark.skip_on_device -def test_converted_model(xcore_model: XCOREModel, experimental_xformer2: bool) -> None: - subgraph = xcore_model.subgraphs[0] - - # check tensors - if experimental_xformer2: - assert len(subgraph.tensors) == 23 - else: - assert len(subgraph.tensors) == 24 - - assert len(subgraph.inputs) == 1 - input_tensor = subgraph.inputs[0] - assert input_tensor.type is TensorType.INT8 - input_shape = input_tensor.shape - assert len(input_shape) == 4 - assert input_shape[0] == 1 - assert input_shape[3] == 3 - - assert len(subgraph.outputs) == 1 - output_tensor = subgraph.outputs[0] - assert output_tensor.type is TensorType.INT8 - assert output_tensor.shape == (1, 10) - - # check operators - assert len(subgraph.operators) == 9 - - # check only first op - assert len(input_tensor.consumers) == 1 - assert input_tensor.consumers[0].operator_code.code is BuiltinOpCodes.PAD - - opcode_cnt = xcore_model.count_operator_codes() - assert opcode_cnt[OperatorCode(XCOREOpCodes.XC_bsign_8)] == 1 - assert opcode_cnt[OperatorCode(XCOREOpCodes.XC_bconv2d_bin)] == 1 - assert opcode_cnt[OperatorCode(XCOREOpCodes.XC_bconv2d_int8)] == 1 - assert opcode_cnt[OperatorCode(BuiltinOpCodes.PAD)] == 1 - assert opcode_cnt[OperatorCode(XCOREOpCodes.XC_conv2d_shallowin)] == 1 - assert opcode_cnt[OperatorCode(XCOREOpCodes.XC_pad)] == 2 - assert opcode_cnt[OperatorCode(XCOREOpCodes.XC_fc)] == 1 - assert opcode_cnt[OperatorCode(BuiltinOpCodes.SOFTMAX, version=2)] == 1 - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_directed/test_mobilenet_v1.py b/test/integration_test/test_directed/test_mobilenet_v1.py deleted file mode 100644 index a5407e138..000000000 --- a/test/integration_test/test_directed/test_mobilenet_v1.py +++ /dev/null @@ -1,196 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import os -import pytest -import tensorflow as tf -from typing import Optional, Tuple, Any -from tensorflow.python.keras.utils import ( # pylint: disable=no-name-in-module - data_utils, -) - -from tflite2xcore.xcore_schema import ( - XCOREModel, - XCOREOpCodes, - BuiltinOpCodes, - OperatorCode, - TensorType, -) -from tflite2xcore.model_generation import Configuration - -from . import IntegrationTestModelGenerator -from . import ( # pylint: disable=unused-import - test_idempotence, - test_output, -) - -# ---------------------------------------------------------------------------- -# HELPERS -# ---------------------------------------------------------------------------- - -BASE_WEIGHT_URL = ( - "https://storage.googleapis.com/tensorflow/keras-applications/mobilenet/" -) - - -def _MobileNet_safe( - input_shape: Optional[Tuple[int, int, int]] = None, - alpha: float = 1.0, - depth_multiplier: int = 1, - dropout: float = 1e-3, - include_top: bool = True, - weights: Optional[str] = "imagenet", - input_tensor: Optional[tf.Tensor] = None, - pooling: Optional[str] = None, - classes: int = 1000, - *args: Any, - **kwargs: Any, -) -> tf.keras.Model: - if weights == "imagenet" and (not include_top or classes == 1000): - input_shape = input_shape or (224, 224, 3) - rows = input_shape[0] - if ( - input_shape[0] == input_shape[1] - and depth_multiplier == 1 - and alpha in [0.25, 0.50, 0.75, 1.0] - and rows in [128, 160, 192, 224] - ): - if alpha == 1.0: - alpha_text = "1_0" - elif alpha == 0.75: - alpha_text = "7_5" - elif alpha == 0.50: - alpha_text = "5_0" - else: - alpha_text = "2_5" - - model_name = f"mobilenet_{alpha_text}_{rows}_tf" - if not include_top: - model_name += "_no_top" - model_name += ".h5" - weight_url = BASE_WEIGHT_URL + model_name - weights = data_utils.get_file( - model_name, - weight_url, - cache_subdir=f"/tmp/.keras/{os.getpid()}/", - ) - - return tf.keras.applications.MobileNet( - input_shape, - alpha, - depth_multiplier, - dropout, - include_top, - weights, - pooling, - classes, - *args, - **kwargs, - ) - - -def MobileNet(*args: Any, **kwargs: Any) -> tf.keras.Model: - """ Wrapper for tf.keras.applications.MobileNet to work around h5 multiprocess issues. """ - try: - return tf.keras.applications.MobileNet(*args, **kwargs) - except (KeyError, OSError) as e: - if e.args[0].startswith("Unable to open"): - return _MobileNet_safe(*args, **kwargs) - else: - raise - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class MobileNetV1ModelGenerator(IntegrationTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - self._config["input_size"] = cfg.pop("input_size") - self._config["alpha"] = cfg.pop("alpha") - super()._set_config(cfg) - - def _build_core_model(self) -> tf.keras.Model: - input_size = self._config["input_size"] - return MobileNet( - input_shape=(input_size, input_size, 3), alpha=self._config["alpha"] - ) - - -GENERATOR = MobileNetV1ModelGenerator - -# ---------------------------------------------------------------------------- -# CONFIGS -# ---------------------------------------------------------------------------- - - -CONFIGS = { - "default": {0: {"input_size": 128, "alpha": 0.25, "skip_on_device": True}}, -} - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def abs_output_tolerance() -> None: - return - - -# TODO: try removing this when global average pool is improved -@pytest.fixture -def implicit_tolerance_margin() -> float: - return 0.15 - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -@pytest.mark.skip_on_xformer2 -@pytest.mark.skip_on_device -def test_converted_model(xcore_model: XCOREModel, experimental_xformer2: bool) -> None: - subgraph = xcore_model.subgraphs[0] - - # check tensors - assert len(subgraph.tensors) == 90 - - assert len(subgraph.inputs) == 1 - input_tensor = subgraph.inputs[0] - assert input_tensor.type is TensorType.INT8 - input_shape = input_tensor.shape - assert len(input_shape) == 4 - assert input_shape[0] == 1 - assert input_shape[3] == 3 - - assert len(subgraph.outputs) == 1 - output_tensor = subgraph.outputs[0] - assert output_tensor.type is TensorType.INT8 - assert output_tensor.shape == (1, 1000) - - # check operators - assert len(subgraph.operators) == 31 - - # check only first op - assert len(input_tensor.consumers) == 1 - assert input_tensor.consumers[0].operator_code.code is BuiltinOpCodes.PAD - - opcode_cnt = xcore_model.count_operator_codes() - assert opcode_cnt[OperatorCode(XCOREOpCodes.XC_conv2d_1x1)] == 13 - assert opcode_cnt[OperatorCode(XCOREOpCodes.XC_conv2d_depthwise)] == 13 - assert opcode_cnt[OperatorCode(XCOREOpCodes.XC_conv2d_shallowin)] == 1 - assert opcode_cnt[OperatorCode(XCOREOpCodes.XC_avgpool2d_global)] == 1 - assert opcode_cnt[OperatorCode(XCOREOpCodes.XC_fc)] == 1 - assert opcode_cnt[OperatorCode(BuiltinOpCodes.SOFTMAX, version=2)] == 1 - if experimental_xformer2: - assert opcode_cnt[OperatorCode(BuiltinOpCodes.PAD, version=2)] == 1 - else: - assert opcode_cnt[OperatorCode(BuiltinOpCodes.PAD)] == 1 - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_directed/test_offset_saturating_ops.py b/test/integration_test/test_directed/test_offset_saturating_ops.py deleted file mode 100644 index 2dfe0927f..000000000 --- a/test/integration_test/test_directed/test_offset_saturating_ops.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf - -from tflite2xcore.model_generation import Configuration - -from .test_mobilenet_v1 import MobileNet -from . import IntegrationTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output, - test_idempotence, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class OffsetSaturatingModelGenerator(IntegrationTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - self._config["layers"] = cfg.pop("layers") - super()._set_config(cfg) - - def _build_core_model(self) -> tf.keras.Model: - source_model = MobileNet(input_shape=(128, 128, 3), alpha=0.25) - layers = [source_model.layers[idx] for idx in self._config["layers"]] - input_shape = layers[0].input_shape[1:] - - return tf.keras.models.Sequential( - layers=[tf.keras.layers.InputLayer(input_shape), *layers] - ) - - -GENERATOR = OffsetSaturatingModelGenerator - -# ---------------------------------------------------------------------------- -# CONFIGS -# ---------------------------------------------------------------------------- - - -CONFIGS = { - "default": { - 0: {"layers": [1, 2, 3, 4]}, - 1: {"layers": [8, 9, 10]}, - 2: {"layers": [15, 16, 17]}, - 3: {"layers": [21, 22, 23]}, - }, -} - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_directed/test_zero_weights.py b/test/integration_test/test_directed/test_zero_weights.py deleted file mode 100644 index f2b007938..000000000 --- a/test/integration_test/test_directed/test_zero_weights.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf - -from . import IntegrationTestModelGenerator - -from . import ( # pylint: disable=unused-import - test_idempotence, - test_output, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class ZeroWeightsModelGenerator(IntegrationTestModelGenerator): - def _build_core_model(self) -> tf.keras.Model: - initializer = tf.keras.initializers.Constant(0) - return tf.keras.Sequential( - [ - tf.keras.layers.Conv2D( - 4, - 4, - kernel_initializer=initializer, - bias_initializer=initializer, - input_shape=(20, 20, 20), - ), - tf.keras.layers.BatchNormalization(), - ] - ) - - -GENERATOR = ZeroWeightsModelGenerator - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture(autouse=True) -def skip_module(experimental_xformer2: bool) -> None: - major_version = tf.version.VERSION[:3] - if major_version == "2.4" and experimental_xformer2: - pytest.skip("Skipping test due to bug tf 2.4 bug") - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_directed/tmp.txt b/test/integration_test/test_directed/tmp.txt deleted file mode 100644 index cb9182aba..000000000 --- a/test/integration_test/test_directed/tmp.txt +++ /dev/null @@ -1,19 +0,0 @@ -============================= test session starts ============================== -platform darwin -- Python 3.6.8, pytest-5.2.0, py-1.8.0, pluggy-0.13.0 -rootdir: /Users/laszlokindrat/ai_tools/test/model_generation/integration_test, inifile: pytest.ini -plugins: xdist-1.30.0, forked-1.1.3 -collected 1 item - -test_bnn.py ->>>>>>>>>>>>>>>>>>> PDB set_trace (IO-capturing turned off) >>>>>>>>>>>>>>>>>>>> -> /Users/laszlokindrat/ai_tools/test/model_generation/integration_test/conftest.py(149)run() --> dirpath = pytest_config.cache.get(key, "") -(Pdb) --KeyboardInterrupt-- -(Pdb) --KeyboardInterrupt-- -(Pdb) --KeyboardInterrupt-- -(Pdb) --KeyboardInterrupt-- -(Pdb) --KeyboardInterrupt-- -(Pdb) --KeyboardInterrupt-- -(Pdb) --KeyboardInterrupt-- -(Pdb) --KeyboardInterrupt-- -(Pdb) \ No newline at end of file diff --git a/test/integration_test/test_single_op_models/__init__.py b/test/integration_test/test_single_op_models/__init__.py deleted file mode 100644 index 54b346897..000000000 --- a/test/integration_test/test_single_op_models/__init__.py +++ /dev/null @@ -1,144 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf -from abc import abstractmethod -from typing import Tuple, Optional - -from tflite2xcore.utils import asserting_cast -from tflite2xcore.model_generation import Configuration -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import XCOREOpCodes, ValidOpCodes - -from .. import ( - IntegrationTestRunner, - BinarizedTestRunner, - _compare_batched_arrays, - BatchedArrayComparison, - IntegrationTestModelGenerator, - test_output, - test_mean_abs_diffs, - test_idempotence, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class ImageInputOpTestModelGenerator(IntegrationTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - self._config.update({key: cfg.pop(key) for key in ["height", "width"]}) - super()._set_config(cfg) - - @property - @abstractmethod - def _input_channels(self) -> int: - raise NotImplementedError() - - @property - def _input_shape(self) -> Tuple[int, int, int]: - cfg = self._config - return cfg["height"], cfg["width"], self._input_channels - - @abstractmethod - def _op_layer( - self, *, input_shape: Optional[Tuple[int, int, int]] = None - ) -> tf.keras.layers.Layer: - raise NotImplementedError() - - def _build_core_model(self) -> tf.keras.Model: - return tf.keras.Sequential( - layers=[self._op_layer(input_shape=self._input_shape)] - ) - - -class PaddingMixin(ImageInputOpTestModelGenerator): - _PAD_KEYS = ("pad_t", "pad_b", "pad_l", "pad_r") - - def _set_config(self, cfg: Configuration) -> None: - self._config.update({key: cfg.pop(key, 1) for key in self._PAD_KEYS}) - super()._set_config(cfg) - - def check_config(self) -> None: - super().check_config() - for key in self._PAD_KEYS: - assert self._config[key] >= 0, f"{key} must be non-negative" - - def _pad_layer( - self, *, input_shape: Optional[Tuple[int, int, int]] = None - ) -> tf.keras.layers.Layer: - kwargs = {"input_shape": input_shape} if input_shape else {} - cfg = self._config - return tf.keras.layers.ZeroPadding2D( - padding=((cfg["pad_t"], cfg["pad_b"]), (cfg["pad_l"], cfg["pad_r"])), - **kwargs, - ) - - -class ChannelAgnosticOpTestModelGenerator(ImageInputOpTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - self._config["channels"] = cfg.pop("channels", 4) - super()._set_config(cfg) - - @property - def _input_channels(self) -> int: - return asserting_cast(int, self._config["channels"]) - - -class ChannelPreservingOpTestModelGenerator(ChannelAgnosticOpTestModelGenerator): - def check_config(self) -> None: - super().check_config() - assert self._config["channels"] % 4 == 0, "# of channels must be multiple of 4" - - -class FilterOpTestModelGenerator(ImageInputOpTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - self._config.update( - {key: cfg.pop(key) for key in ["K_h", "K_w", "padding", "strides"]} - ) - super()._set_config(cfg) - - def build(self) -> None: - try: - super().build() - except ValueError as e: - if e.args[0].startswith("Negative dimension size caused by"): - raise ValueError( - "Negative dimension size (Hint: if using 'valid' padding " - "verify that the kernel is at least the size of input image)" - ) from e - else: - raise - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -@pytest.mark.skip_on_device -@pytest.mark.skip_on_xformer2 -def test_converted_single_op_model( - xcore_model: XCOREModel, converted_op_code: XCOREOpCodes -) -> None: - operators = xcore_model.subgraphs[0].operators - assert len(operators) == 1 - op_code = operators[0].operator_code.code - assert ( - op_code is converted_op_code - ), f"expected: {converted_op_code}, got: {op_code}" - - -@pytest.mark.skip_on_device -def test_reference_model_regression( - reference_model: XCOREModel, reference_op_code: ValidOpCodes -) -> None: - operators = reference_model.subgraphs[0].operators - assert len(operators) == 1 - op_code = operators[0].operator_code.code - assert ( - op_code is reference_op_code - ), f"expected: {reference_op_code}, got: {op_code}" diff --git a/test/integration_test/test_single_op_models/test_activation/__init__.py b/test/integration_test/test_single_op_models/test_activation/__init__.py deleted file mode 100644 index 4b665fd8a..000000000 --- a/test/integration_test/test_single_op_models/test_activation/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import tensorflow as tf -from abc import abstractmethod -from typing import Callable, Optional, Tuple - -from .. import ( - ChannelAgnosticOpTestModelGenerator, - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class LUTActivationOpTestModelGenerator(ChannelAgnosticOpTestModelGenerator): - @property - @abstractmethod - def act_fun(self) -> Callable[[tf.Tensor], tf.Tensor]: - raise NotImplementedError() - - def _op_layer( - self, *, input_shape: Optional[Tuple[int, int, int]] = None - ) -> tf.keras.layers.Layer: - kwargs = {"input_shape": input_shape} if input_shape else {} - return tf.keras.layers.Lambda(self.act_fun, **kwargs) diff --git a/test/integration_test/test_single_op_models/test_activation/conftest.py b/test/integration_test/test_single_op_models/test_activation/conftest.py deleted file mode 100644 index 96a3d54c5..000000000 --- a/test/integration_test/test_single_op_models/test_activation/conftest.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import XCOREOpCodes - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_lookup_8 - - -@pytest.fixture -def abs_output_tolerance() -> int: - return 0 diff --git a/test/integration_test/test_single_op_models/test_activation/test_prelu.py b/test/integration_test/test_single_op_models/test_activation/test_prelu.py deleted file mode 100644 index 751a6727b..000000000 --- a/test/integration_test/test_single_op_models/test_activation/test_prelu.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf -from typing import Optional, Tuple - -from tflite2xcore.xcore_schema import BuiltinOpCodes -from tflite2xcore.model_generation import Configuration -from tflite2xcore.model_generation.utils import parse_init_config - -from . import ChannelAgnosticOpTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class PReluTestModelGenerator(ChannelAgnosticOpTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - self._config["alpha_init"] = cfg.pop("alpha_init", ("RandomUniform", -1, 1)) - super()._set_config(cfg) - - def _op_layer( - self, *, input_shape: Optional[Tuple[int, int, int]] = None - ) -> tf.keras.layers.Layer: - kwargs = {"input_shape": input_shape} if input_shape else {} - return tf.keras.layers.PReLU( - alpha_initializer=parse_init_config(*self._config["alpha_init"]), **kwargs - ) - - -GENERATOR = PReluTestModelGenerator - -# TODO: fix this if/when we support prelu -CONFIGS = {"default": {0: {"height": 5, "width": 5, "channels": 3}}} - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def converted_op_code() -> BuiltinOpCodes: - return BuiltinOpCodes.PRELU # TODO: fix this if/when we support prelu - - -@pytest.fixture -def reference_op_code() -> BuiltinOpCodes: - return BuiltinOpCodes.PRELU - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_activation/test_relu.py b/test/integration_test/test_single_op_models/test_activation/test_relu.py deleted file mode 100644 index 7ba174191..000000000 --- a/test/integration_test/test_single_op_models/test_activation/test_relu.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf -from typing import Callable - -from tflite2xcore.xcore_schema import BuiltinOpCodes - -from . import LUTActivationOpTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class ReluTestModelGenerator(LUTActivationOpTestModelGenerator): - @property - def act_fun(self) -> Callable[[tf.Tensor], tf.Tensor]: - return lambda x: tf.nn.relu(x) - - -GENERATOR = ReluTestModelGenerator - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def reference_op_code() -> BuiltinOpCodes: - return BuiltinOpCodes.RELU - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_activation/test_relu.yml b/test/integration_test/test_single_op_models/test_activation/test_relu.yml deleted file mode 100644 index fb3767686..000000000 --- a/test/integration_test/test_single_op_models/test_activation/test_relu.yml +++ /dev/null @@ -1,203 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - channels: 12 - height: 4 - num_threads: 5 - width: 1 - 1: - channels: 49 - height: 8 - num_threads: 1 - width: 8 - 2: - channels: 1 - height: 8 - num_threads: 1 - width: 8 - 3: - channels: 7 - height: 1 - num_threads: 1 - width: 4 - 4: - channels: 1 - height: 5 - num_threads: 2 - width: 7 - 5: - channels: 32 - height: 12 - num_threads: 2 - width: 8 - 6: - channels: 7 - height: 12 - num_threads: 5 - width: 4 - 7: - channels: 12 - height: 4 - num_threads: 1 - width: 14 - 8: - channels: 32 - height: 8 - num_threads: 5 - width: 14 - 9: - channels: 32 - height: 1 - num_threads: 1 - width: 8 - 10: - channels: 49 - height: 1 - num_threads: 1 - width: 8 - 11: - channels: 25 - height: 1 - num_threads: 2 - width: 20 - 12: - channels: 4 - height: 12 - num_threads: 1 - width: 7 - 13: - channels: 25 - height: 5 - num_threads: 2 - width: 4 - 14: - channels: 32 - height: 12 - num_threads: 5 - width: 14 - 15: - channels: 16 - height: 1 - num_threads: 1 - width: 4 - 16: - channels: 12 - height: 4 - num_threads: 1 - width: 20 - 17: - channels: 1 - height: 4 - num_threads: 5 - width: 7 - 18: - channels: 4 - height: 15 - num_threads: 1 - width: 7 - 19: - channels: 4 - height: 8 - num_threads: 2 - width: 1 - 20: - channels: 25 - height: 15 - num_threads: 1 - width: 4 - 21: - channels: 49 - height: 8 - num_threads: 5 - width: 7 - 22: - channels: 16 - height: 8 - num_threads: 5 - width: 1 - 23: - channels: 12 - height: 4 - num_threads: 5 - width: 7 - 24: - channels: 4 - height: 1 - num_threads: 5 - width: 4 - 25: - channels: 25 - height: 5 - num_threads: 2 - width: 14 - 26: - channels: 32 - height: 12 - num_threads: 1 - width: 1 - 27: - channels: 49 - height: 15 - num_threads: 1 - width: 14 - 28: - channels: 1 - height: 5 - num_threads: 5 - width: 20 - 29: - channels: 16 - height: 4 - num_threads: 2 - width: 20 - 30: - channels: 1 - height: 15 - num_threads: 2 - width: 14 - 31: - channels: 7 - height: 1 - num_threads: 2 - width: 8 - 32: - channels: 12 - height: 15 - num_threads: 2 - width: 1 - 33: - channels: 49 - height: 12 - num_threads: 2 - width: 4 - 34: - channels: 16 - height: 15 - num_threads: 5 - width: 20 - 35: - channels: 16 - height: 15 - num_threads: 2 - width: 14 - 36: - channels: 7 - height: 8 - num_threads: 5 - width: 20 - 37: - channels: 7 - height: 5 - num_threads: 5 - width: 1 - 38: - channels: 25 - height: 5 - num_threads: 5 - width: 1 - 39: - channels: 4 - height: 5 - num_threads: 1 - width: 14 diff --git a/test/integration_test/test_single_op_models/test_activation/test_relu6.py b/test/integration_test/test_single_op_models/test_activation/test_relu6.py deleted file mode 100644 index d925f1efc..000000000 --- a/test/integration_test/test_single_op_models/test_activation/test_relu6.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf -from typing import Callable - -from tflite2xcore.xcore_schema import BuiltinOpCodes - -from . import LUTActivationOpTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class Relu6TestModelGenerator(LUTActivationOpTestModelGenerator): - @property - def act_fun(self) -> Callable[[tf.Tensor], tf.Tensor]: - return lambda x: tf.nn.relu6(x) - - -GENERATOR = Relu6TestModelGenerator - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def reference_op_code() -> BuiltinOpCodes: - return BuiltinOpCodes.RELU6 - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_activation/test_relu6.yml b/test/integration_test/test_single_op_models/test_activation/test_relu6.yml deleted file mode 100644 index 886f026ff..000000000 --- a/test/integration_test/test_single_op_models/test_activation/test_relu6.yml +++ /dev/null @@ -1,203 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - channels: 4 - height: 1 - num_threads: 5 - width: 4 - 1: - channels: 7 - height: 15 - num_threads: 2 - width: 1 - 2: - channels: 1 - height: 1 - num_threads: 2 - width: 14 - 3: - channels: 1 - height: 4 - num_threads: 2 - width: 4 - 4: - channels: 25 - height: 8 - num_threads: 1 - width: 1 - 5: - channels: 25 - height: 8 - num_threads: 1 - width: 4 - 6: - channels: 25 - height: 5 - num_threads: 5 - width: 7 - 7: - channels: 49 - height: 5 - num_threads: 1 - width: 8 - 8: - channels: 32 - height: 5 - num_threads: 5 - width: 7 - 9: - channels: 12 - height: 15 - num_threads: 2 - width: 4 - 10: - channels: 32 - height: 4 - num_threads: 5 - width: 4 - 11: - channels: 12 - height: 8 - num_threads: 1 - width: 7 - 12: - channels: 16 - height: 5 - num_threads: 5 - width: 8 - 13: - channels: 12 - height: 8 - num_threads: 5 - width: 4 - 14: - channels: 16 - height: 5 - num_threads: 2 - width: 14 - 15: - channels: 7 - height: 1 - num_threads: 1 - width: 20 - 16: - channels: 4 - height: 12 - num_threads: 2 - width: 1 - 17: - channels: 49 - height: 8 - num_threads: 5 - width: 7 - 18: - channels: 7 - height: 4 - num_threads: 2 - width: 1 - 19: - channels: 7 - height: 8 - num_threads: 1 - width: 20 - 20: - channels: 25 - height: 1 - num_threads: 2 - width: 14 - 21: - channels: 16 - height: 12 - num_threads: 5 - width: 20 - 22: - channels: 32 - height: 5 - num_threads: 1 - width: 8 - 23: - channels: 32 - height: 5 - num_threads: 2 - width: 7 - 24: - channels: 49 - height: 12 - num_threads: 5 - width: 14 - 25: - channels: 12 - height: 12 - num_threads: 5 - width: 20 - 26: - channels: 1 - height: 4 - num_threads: 5 - width: 8 - 27: - channels: 25 - height: 15 - num_threads: 2 - width: 8 - 28: - channels: 16 - height: 12 - num_threads: 1 - width: 1 - 29: - channels: 7 - height: 15 - num_threads: 1 - width: 14 - 30: - channels: 4 - height: 15 - num_threads: 1 - width: 14 - 31: - channels: 16 - height: 12 - num_threads: 5 - width: 8 - 32: - channels: 4 - height: 1 - num_threads: 2 - width: 1 - 33: - channels: 1 - height: 12 - num_threads: 1 - width: 1 - 34: - channels: 49 - height: 15 - num_threads: 5 - width: 7 - 35: - channels: 1 - height: 4 - num_threads: 1 - width: 14 - 36: - channels: 32 - height: 15 - num_threads: 5 - width: 20 - 37: - channels: 49 - height: 1 - num_threads: 2 - width: 7 - 38: - channels: 12 - height: 4 - num_threads: 1 - width: 20 - 39: - channels: 4 - height: 1 - num_threads: 2 - width: 8 diff --git a/test/integration_test/test_single_op_models/test_activation/test_sigmoid.py b/test/integration_test/test_single_op_models/test_activation/test_sigmoid.py deleted file mode 100644 index 7d415b58a..000000000 --- a/test/integration_test/test_single_op_models/test_activation/test_sigmoid.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf -from typing import Callable - -from tflite2xcore.xcore_schema import BuiltinOpCodes - -from . import LUTActivationOpTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class SigmoidTestModelGenerator(LUTActivationOpTestModelGenerator): - @property - def act_fun(self) -> Callable[[tf.Tensor], tf.Tensor]: - return lambda x: tf.nn.sigmoid(x) - - -GENERATOR = SigmoidTestModelGenerator - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def reference_op_code() -> BuiltinOpCodes: - return BuiltinOpCodes.LOGISTIC - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_activation/test_sigmoid.yml b/test/integration_test/test_single_op_models/test_activation/test_sigmoid.yml deleted file mode 100644 index ab62ede3e..000000000 --- a/test/integration_test/test_single_op_models/test_activation/test_sigmoid.yml +++ /dev/null @@ -1,203 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - channels: 49 - height: 4 - num_threads: 1 - width: 8 - 1: - channels: 7 - height: 4 - num_threads: 5 - width: 8 - 2: - channels: 4 - height: 15 - num_threads: 1 - width: 1 - 3: - channels: 1 - height: 5 - num_threads: 1 - width: 8 - 4: - channels: 1 - height: 5 - num_threads: 5 - width: 1 - 5: - channels: 32 - height: 12 - num_threads: 1 - width: 20 - 6: - channels: 1 - height: 15 - num_threads: 1 - width: 8 - 7: - channels: 4 - height: 12 - num_threads: 2 - width: 1 - 8: - channels: 7 - height: 12 - num_threads: 2 - width: 20 - 9: - channels: 1 - height: 5 - num_threads: 1 - width: 8 - 10: - channels: 12 - height: 4 - num_threads: 2 - width: 4 - 11: - channels: 12 - height: 1 - num_threads: 1 - width: 7 - 12: - channels: 4 - height: 4 - num_threads: 1 - width: 8 - 13: - channels: 25 - height: 8 - num_threads: 5 - width: 1 - 14: - channels: 16 - height: 8 - num_threads: 5 - width: 20 - 15: - channels: 4 - height: 1 - num_threads: 2 - width: 20 - 16: - channels: 16 - height: 15 - num_threads: 5 - width: 20 - 17: - channels: 7 - height: 4 - num_threads: 2 - width: 14 - 18: - channels: 16 - height: 8 - num_threads: 2 - width: 14 - 19: - channels: 32 - height: 12 - num_threads: 2 - width: 8 - 20: - channels: 49 - height: 4 - num_threads: 5 - width: 4 - 21: - channels: 12 - height: 1 - num_threads: 2 - width: 14 - 22: - channels: 12 - height: 1 - num_threads: 5 - width: 7 - 23: - channels: 25 - height: 1 - num_threads: 2 - width: 1 - 24: - channels: 32 - height: 5 - num_threads: 1 - width: 7 - 25: - channels: 16 - height: 15 - num_threads: 5 - width: 14 - 26: - channels: 12 - height: 5 - num_threads: 2 - width: 4 - 27: - channels: 32 - height: 15 - num_threads: 5 - width: 7 - 28: - channels: 4 - height: 8 - num_threads: 5 - width: 14 - 29: - channels: 49 - height: 4 - num_threads: 2 - width: 4 - 30: - channels: 49 - height: 8 - num_threads: 1 - width: 4 - 31: - channels: 25 - height: 12 - num_threads: 1 - width: 14 - 32: - channels: 1 - height: 8 - num_threads: 5 - width: 7 - 33: - channels: 25 - height: 5 - num_threads: 2 - width: 4 - 34: - channels: 16 - height: 15 - num_threads: 1 - width: 14 - 35: - channels: 32 - height: 12 - num_threads: 1 - width: 7 - 36: - channels: 49 - height: 12 - num_threads: 2 - width: 7 - 37: - channels: 7 - height: 1 - num_threads: 2 - width: 1 - 38: - channels: 25 - height: 8 - num_threads: 5 - width: 1 - 39: - channels: 7 - height: 5 - num_threads: 5 - width: 20 diff --git a/test/integration_test/test_single_op_models/test_activation/test_tanh.py b/test/integration_test/test_single_op_models/test_activation/test_tanh.py deleted file mode 100644 index 3dd76cd43..000000000 --- a/test/integration_test/test_single_op_models/test_activation/test_tanh.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf -from typing import Callable - -from tflite2xcore.xcore_schema import BuiltinOpCodes - -from . import LUTActivationOpTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class TanhTestModelGenerator(LUTActivationOpTestModelGenerator): - @property - def act_fun(self) -> Callable[[tf.Tensor], tf.Tensor]: - return lambda x: tf.nn.tanh(x) - - -GENERATOR = TanhTestModelGenerator - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def reference_op_code() -> BuiltinOpCodes: - return BuiltinOpCodes.TANH - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_activation/test_tanh.yml b/test/integration_test/test_single_op_models/test_activation/test_tanh.yml deleted file mode 100644 index 38897ffb4..000000000 --- a/test/integration_test/test_single_op_models/test_activation/test_tanh.yml +++ /dev/null @@ -1,203 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - channels: 1 - height: 1 - num_threads: 1 - width: 4 - 1: - channels: 7 - height: 1 - num_threads: 1 - width: 14 - 2: - channels: 32 - height: 5 - num_threads: 2 - width: 14 - 3: - channels: 16 - height: 4 - num_threads: 5 - width: 1 - 4: - channels: 4 - height: 1 - num_threads: 5 - width: 1 - 5: - channels: 25 - height: 8 - num_threads: 5 - width: 7 - 6: - channels: 32 - height: 15 - num_threads: 1 - width: 8 - 7: - channels: 4 - height: 15 - num_threads: 5 - width: 4 - 8: - channels: 12 - height: 8 - num_threads: 2 - width: 8 - 9: - channels: 7 - height: 12 - num_threads: 5 - width: 7 - 10: - channels: 25 - height: 15 - num_threads: 1 - width: 4 - 11: - channels: 4 - height: 8 - num_threads: 5 - width: 7 - 12: - channels: 1 - height: 4 - num_threads: 1 - width: 14 - 13: - channels: 16 - height: 8 - num_threads: 2 - width: 20 - 14: - channels: 49 - height: 15 - num_threads: 2 - width: 7 - 15: - channels: 49 - height: 4 - num_threads: 5 - width: 14 - 16: - channels: 16 - height: 4 - num_threads: 5 - width: 8 - 17: - channels: 1 - height: 1 - num_threads: 5 - width: 1 - 18: - channels: 16 - height: 5 - num_threads: 5 - width: 20 - 19: - channels: 49 - height: 15 - num_threads: 2 - width: 8 - 20: - channels: 1 - height: 12 - num_threads: 1 - width: 20 - 21: - channels: 7 - height: 1 - num_threads: 2 - width: 14 - 22: - channels: 4 - height: 8 - num_threads: 2 - width: 1 - 23: - channels: 12 - height: 12 - num_threads: 1 - width: 7 - 24: - channels: 32 - height: 5 - num_threads: 5 - width: 8 - 25: - channels: 7 - height: 5 - num_threads: 5 - width: 4 - 26: - channels: 7 - height: 12 - num_threads: 1 - width: 14 - 27: - channels: 25 - height: 12 - num_threads: 2 - width: 8 - 28: - channels: 16 - height: 4 - num_threads: 1 - width: 4 - 29: - channels: 4 - height: 5 - num_threads: 5 - width: 20 - 30: - channels: 25 - height: 4 - num_threads: 1 - width: 4 - 31: - channels: 32 - height: 5 - num_threads: 1 - width: 20 - 32: - channels: 25 - height: 15 - num_threads: 1 - width: 20 - 33: - channels: 12 - height: 15 - num_threads: 2 - width: 20 - 34: - channels: 32 - height: 8 - num_threads: 2 - width: 1 - 35: - channels: 49 - height: 12 - num_threads: 2 - width: 4 - 36: - channels: 12 - height: 1 - num_threads: 2 - width: 8 - 37: - channels: 1 - height: 8 - num_threads: 1 - width: 1 - 38: - channels: 12 - height: 5 - num_threads: 1 - width: 1 - 39: - channels: 49 - height: 1 - num_threads: 2 - width: 7 diff --git a/test/integration_test/test_single_op_models/test_add.py b/test/integration_test/test_single_op_models/test_add.py deleted file mode 100644 index ab1e7659d..000000000 --- a/test/integration_test/test_single_op_models/test_add.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -import tensorflow as tf -from typing import Optional, Tuple -import random - -from tflite2xcore.xcore_schema import XCOREOpCodes - -from . import ChannelAgnosticOpTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class AddModelGenerator(ChannelAgnosticOpTestModelGenerator): - def _build_core_model(self) -> tf.keras.Model: - input = tf.keras.Input(shape=self._input_shape) - x2 = tf.random.normal([1, *self._input_shape], mean=random.random()) - out = self._op_layer()([input, x2]) - return tf.keras.models.Model(inputs=input, outputs=out) - - def _op_layer( - self, *, input_shape: Optional[Tuple[int, int, int]] = None - ) -> tf.keras.layers.Layer: - return tf.keras.layers.Add() - - -GENERATOR = AddModelGenerator - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_add_8 - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_add.yml b/test/integration_test/test_single_op_models/test_add.yml deleted file mode 100644 index 2a8cdd04c..000000000 --- a/test/integration_test/test_single_op_models/test_add.yml +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - channels: 4 - height: 15 - num_threads: 1 - width: 5 - 1: - channels: 51 - height: 3 - num_threads: 1 - width: 1 - 2: - channels: 64 - height: 15 - num_threads: 2 - width: 7 - 3: - channels: 53 - height: 5 - num_threads: 1 - width: 6 - 4: - channels: 11 - height: 8 - num_threads: 2 - width: 6 - 5: - channels: 64 - height: 1 - num_threads: 1 - width: 6 - 6: - channels: 13 - height: 15 - num_threads: 2 - width: 1 - 7: - channels: 11 - height: 1 - num_threads: 2 - width: 9 - 8: - channels: 11 - height: 13 - num_threads: 5 - width: 7 - 9: - channels: 13 - height: 13 - num_threads: 5 - width: 9 - 10: - channels: 53 - height: 1 - num_threads: 1 - width: 7 - 11: - channels: 51 - height: 3 - num_threads: 1 - width: 6 - 12: - channels: 64 - height: 8 - num_threads: 5 - width: 9 - 13: - channels: 4 - height: 5 - num_threads: 1 - width: 11 - 14: - channels: 53 - height: 13 - num_threads: 2 - width: 11 - 15: - channels: 13 - height: 13 - num_threads: 5 - width: 1 - 16: - channels: 51 - height: 5 - num_threads: 5 - width: 11 - 17: - channels: 51 - height: 8 - num_threads: 5 - width: 9 - 18: - channels: 13 - height: 3 - num_threads: 5 - width: 5 - 19: - channels: 4 - height: 5 - num_threads: 2 - width: 5 diff --git a/test/integration_test/test_single_op_models/test_binarized/__init__.py b/test/integration_test/test_single_op_models/test_binarized/__init__.py deleted file mode 100644 index 4b0037394..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/__init__.py +++ /dev/null @@ -1,210 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import _pytest -import larq -import numpy as np -import tensorflow as tf -import larq_compute_engine as lce -from typing import Optional, Tuple, Type, Any, Union, NamedTuple - -from tflite2xcore.utils import get_bitpacked_shape -from tflite2xcore.xcore_schema import ( - Tensor, - Buffer, - ExternalOpCodes, - TensorType, - XCOREModel, -) -from tflite2xcore.pass_manager import PassManager -from tflite2xcore.transformation_passes import ( - CanonicalizeLceQuantizedInputPass, - CanonicalizeLceQuantizedOutputPass, - UnifyEmptyBuffersPass, -) -from tflite2xcore.transformation_passes.transformation_passes import ( - OutputTensorMatchingPass, -) -from tflite2xcore.converter import CleanupManager - -from tflite2xcore.model_generation import Configuration, TFLiteModel, Hook -from tflite2xcore.model_generation.evaluators import LarqEvaluator -from tflite2xcore.model_generation.runners import Runner -from tflite2xcore.model_generation.converters import KerasModelConverter, LarqConverter -from tflite2xcore.model_generation.data_factories import InputInitializerDataFactory -from tflite2xcore.model_generation.utils import parse_init_config - -from .. import ( - BinarizedTestRunner, - test_reference_model_regression, - test_converted_single_op_model, - test_mean_abs_diffs, - test_output, -) -from ..test_conv2d import Conv2dWordAlignedTestModelGenerator - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class LarqCompositeTestModelGenerator(Conv2dWordAlignedTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - self._config["activation"] = cfg.pop("activation", "linear") - - self._config["output_range"] = cfg.pop("output_range", (-3, 3)) - - self._config["input_range"] = input_range = cfg.pop("input_range") - cfg["input_init"] = cfg.pop("input_init", ("RandomUniform", *input_range)) - - self._config.update( - {"bias_init": cfg.pop("bias_init", ("RandomUniform", -1, 1))} - ) - super()._set_config(cfg) - - def check_config(self) -> None: - super().check_config() - - assert self._config["activation"] in ("linear", "relu", "relu6") - - input_range = self._config["input_range"] - assert len(input_range) == 2 - assert input_range[0] <= 0 <= input_range[1] - - output_range = self._config["output_range"] - assert len(output_range) == 2 - assert output_range[0] <= 0 <= output_range[1] - - def _op_layer( - self, *, input_shape: Optional[Tuple[int, int, int]] = None - ) -> tf.keras.layers.Conv2D: - kwargs = {"input_shape": input_shape} if input_shape else {} - cfg = self._config - return larq.layers.QuantConv2D( - filters=cfg["output_channels"], - kernel_size=(cfg["K_h"], cfg["K_w"]), - padding=cfg["padding"], - pad_values=1, - strides=cfg["strides"], - input_quantizer="ste_sign", - kernel_quantizer="ste_sign", - kernel_constraint="weight_clip", - use_bias=False, - kernel_initializer=parse_init_config(*cfg["weight_init"]), - **kwargs, - ) - - def _fake_quant( - self, x: tf.Tensor, range_min: int = 0, range_max: int = 1 - ) -> tf.Tensor: - return tf.quantization.fake_quant_with_min_max_vars(x, range_min, range_max) - - def _build_core_model(self) -> tf.keras.Model: - img = tf.keras.layers.Input(shape=self._input_shape) - x = self._fake_quant(img, *self._config["input_range"]) - x = self._op_layer()(x) - if self._config["activation"] == "relu": - x = tf.keras.layers.ReLU()(x) - elif self._config["activation"] == "relu6": - x = tf.keras.layers.ReLU(6)(x) - x = tf.keras.layers.BatchNormalization( - beta_initializer=parse_init_config(*self._config["bias_init"]) - )(x) - x = self._fake_quant(x, *self._config["output_range"]) - return tf.keras.Model(img, x) - - -class BConv2dGenericTestModelGenerator(LarqCompositeTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - assert ( - "input_range" not in cfg - ), f"input_range cannot be specified for BConv2d tests" - cfg["input_range"] = (np.iinfo(np.int32).min, np.iinfo(np.int32).max) - - assert ( - "input_init" not in cfg - ), f"input_init cannot be specified for BConv2d tests" - super()._set_config(cfg) - - def check_config(self) -> None: - super().check_config() - assert ( - self._config["input_channels"] % 32 == 0 - ), "# of input channels must be multiple of 32" - - -# ---------------------------------------------------------------------------- -# CONVERTERS -# ---------------------------------------------------------------------------- - - -class RemoveSingleOutputOperatorPass(OutputTensorMatchingPass): - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args, **kwargs) - self._done = False - - def match(self, tensor: Tensor) -> bool: - return (not self._done) and super().match(tensor) - - def mutate(self, tensor: Tensor) -> None: - subgraph = tensor.subgraph - out_op = tensor.producers[0] - - subgraph.outputs.remove(tensor) - subgraph.outputs.append(out_op.inputs[0]) - subgraph.remove_operator(out_op) - - self._done = True - - -class LarqSingleOpConverter(LarqConverter): - """Converts a larq composite TFL model to a single op TFL model. - - This converter is to work around the fact that some larq ops - cannot be directly generated from keras layers. - """ - - def __init__( - self, - runner: Runner, - input_model_hook: Hook[tf.keras.Model], - strip: bool = False, - remove_last_op: bool = False, - ) -> None: - super().__init__(runner, input_model_hook) - self._strip = strip - self._remove_last_op = remove_last_op - - def convert(self) -> None: - super().convert() - - model_ir = XCOREModel.deserialize(self._model) - pass_mgr = PassManager(model_ir) - - if self._strip: - pass_mgr.register_pass(CanonicalizeLceQuantizedInputPass()) - pass_mgr.register_pass(CanonicalizeLceQuantizedOutputPass()) - if self._remove_last_op: - pass_mgr.register_pass(RemoveSingleOutputOperatorPass()) - - pass_mgr.register_pass(UnifyEmptyBuffersPass()) - pass_mgr.register_passes(CleanupManager()) - - pass_mgr.run_passes() - - self._model = model_ir.serialize() - - -# ---------------------------------------------------------------------------- -# CONVERTERS -# ---------------------------------------------------------------------------- - - -class BinarizedSingleOpRunner(BinarizedTestRunner): - def make_repr_data_factory(self) -> InputInitializerDataFactory: - return InputInitializerDataFactory( - self, - lambda: get_bitpacked_shape(self._model_generator.input_shape), - dtype=tf.int32, - ) diff --git a/test/integration_test/test_single_op_models/test_binarized/conftest.py b/test/integration_test/test_single_op_models/test_binarized/conftest.py deleted file mode 100644 index d67efb8e3..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/conftest.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def mean_abs_diff_tolerance() -> float: - return 0.0 - - -@pytest.fixture -def bitpacked_outputs() -> bool: - return True diff --git a/test/integration_test/test_single_op_models/test_binarized/padded/__init__.py b/test/integration_test/test_single_op_models/test_binarized/padded/__init__.py deleted file mode 100644 index ff7d4c094..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/padded/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import ( - XCOREOpCodes, - XCOREModel, -) - -from .. import ( - test_reference_model_regression, - test_mean_abs_diffs, - test_output, -) - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - -@pytest.mark.skip_on_xformer2 -@pytest.mark.skip_on_device -def test_converted_model( - xcore_model: XCOREModel, converted_op_code: XCOREOpCodes -) -> None: - subgraph = xcore_model.subgraphs[0] - operators = subgraph.operators - op = operators[-1] - - op_code = op.operator_code.code - assert ( - op_code is converted_op_code - ), f"expected: {converted_op_code}, got: {op_code}" - - if len(operators) == 2: - padded_input = op.inputs[0] - assert op.inputs[0].producers[0].operator_code.code is XCOREOpCodes.XC_pad - assert subgraph.inputs[0].shape != padded_input.shape diff --git a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_bin_DI_padded.py b/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_bin_DI_padded.py deleted file mode 100644 index d8615bb22..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_bin_DI_padded.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from ..test_bconv2d_bin_DI import ( # pylint: disable=unused-import - GENERATOR, - RUNNER, - reference_op_code, - converted_op_code, -) - -from . import ( # pylint: disable=unused-import - test_reference_model_regression, - test_converted_model, - test_mean_abs_diffs, -) - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_bin_DI_padded.yml b/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_bin_DI_padded.yml deleted file mode 100644 index 1a8e7efbe..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_bin_DI_padded.yml +++ /dev/null @@ -1,243 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 2 - K_w: 3 - height: 10 - input_channels: 256 - num_threads: 2 - output_channels: 32 - padding: same - strides: - - 1 - - 1 - width: 11 - 1: - K_h: 3 - K_w: 3 - height: 10 - input_channels: 512 - num_threads: 2 - output_channels: 32 - padding: same - strides: - - 1 - - 2 - width: 6 - 2: - K_h: 6 - K_w: 3 - height: 10 - input_channels: 256 - num_threads: 1 - output_channels: 64 - padding: same - strides: - - 2 - - 2 - width: 8 - 3: - K_h: 3 - K_w: 4 - height: 7 - input_channels: 256 - num_threads: 1 - output_channels: 64 - padding: same - strides: - - 1 - - 1 - width: 8 - 4: - K_h: 2 - K_w: 3 - height: 10 - input_channels: 256 - num_threads: 5 - output_channels: 64 - padding: same - strides: - - 1 - - 1 - width: 6 - 5: - K_h: 2 - K_w: 3 - height: 7 - input_channels: 512 - num_threads: 5 - output_channels: 64 - padding: same - strides: - - 1 - - 2 - width: 8 - 6: - K_h: 3 - K_w: 4 - height: 7 - input_channels: 256 - num_threads: 2 - output_channels: 64 - padding: same - strides: - - 2 - - 1 - width: 6 - 7: - K_h: 6 - K_w: 5 - height: 12 - input_channels: 256 - num_threads: 1 - output_channels: 64 - padding: same - strides: - - 2 - - 1 - width: 8 - 8: - K_h: 6 - K_w: 3 - height: 12 - input_channels: 512 - num_threads: 2 - output_channels: 32 - padding: same - strides: - - 1 - - 2 - width: 6 - 9: - K_h: 6 - K_w: 5 - height: 12 - input_channels: 512 - num_threads: 5 - output_channels: 32 - padding: same - strides: - - 2 - - 2 - width: 8 - 10: - K_h: 3 - K_w: 4 - height: 10 - input_channels: 256 - num_threads: 1 - output_channels: 64 - padding: same - strides: - - 1 - - 2 - width: 6 - 11: - K_h: 6 - K_w: 5 - height: 12 - input_channels: 256 - num_threads: 1 - output_channels: 32 - padding: same - strides: - - 2 - - 1 - width: 11 - 12: - K_h: 2 - K_w: 4 - height: 7 - input_channels: 512 - num_threads: 5 - output_channels: 32 - padding: same - strides: - - 2 - - 2 - width: 11 - 13: - K_h: 3 - K_w: 5 - height: 10 - input_channels: 256 - num_threads: 2 - output_channels: 32 - padding: same - strides: - - 1 - - 2 - width: 11 - 14: - K_h: 2 - K_w: 4 - height: 10 - input_channels: 512 - num_threads: 2 - output_channels: 32 - padding: same - strides: - - 2 - - 1 - width: 11 - 15: - K_h: 6 - K_w: 4 - height: 12 - input_channels: 512 - num_threads: 5 - output_channels: 64 - padding: same - strides: - - 2 - - 1 - width: 11 - 16: - K_h: 6 - K_w: 5 - height: 7 - input_channels: 512 - num_threads: 2 - output_channels: 32 - padding: same - strides: - - 2 - - 2 - width: 8 - 17: - K_h: 3 - K_w: 5 - height: 12 - input_channels: 256 - num_threads: 5 - output_channels: 64 - padding: same - strides: - - 1 - - 1 - width: 11 - 18: - K_h: 2 - K_w: 5 - height: 7 - input_channels: 512 - num_threads: 2 - output_channels: 64 - padding: same - strides: - - 2 - - 2 - width: 6 - 19: - K_h: 2 - K_w: 4 - height: 12 - input_channels: 512 - num_threads: 1 - output_channels: 32 - padding: same - strides: - - 1 - - 1 - width: 6 diff --git a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_bin_padded.py b/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_bin_padded.py deleted file mode 100644 index f84ec2ceb..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_bin_padded.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from ..test_bconv2d_bin import ( # pylint: disable=unused-import - GENERATOR, - RUNNER, - reference_op_code, - converted_op_code, -) - -from . import ( # pylint: disable=unused-import - test_reference_model_regression, - test_converted_model, - test_mean_abs_diffs, -) - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_bin_padded.yml b/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_bin_padded.yml deleted file mode 100644 index 2712a2a0d..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_bin_padded.yml +++ /dev/null @@ -1,243 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 2 - K_w: 4 - height: 12 - input_channels: 32 - num_threads: 2 - output_channels: 32 - padding: same - strides: - - 2 - - 2 - width: 6 - 1: - K_h: 6 - K_w: 1 - height: 7 - input_channels: 32 - num_threads: 1 - output_channels: 64 - padding: same - strides: - - 1 - - 2 - width: 8 - 2: - K_h: 3 - K_w: 1 - height: 12 - input_channels: 128 - num_threads: 2 - output_channels: 64 - padding: same - strides: - - 2 - - 1 - width: 11 - 3: - K_h: 6 - K_w: 3 - height: 10 - input_channels: 32 - num_threads: 5 - output_channels: 64 - padding: same - strides: - - 1 - - 1 - width: 8 - 4: - K_h: 1 - K_w: 3 - height: 7 - input_channels: 128 - num_threads: 2 - output_channels: 32 - padding: same - strides: - - 2 - - 2 - width: 8 - 5: - K_h: 1 - K_w: 5 - height: 7 - input_channels: 32 - num_threads: 1 - output_channels: 32 - padding: same - strides: - - 2 - - 1 - width: 11 - 6: - K_h: 3 - K_w: 1 - height: 7 - input_channels: 128 - num_threads: 2 - output_channels: 64 - padding: same - strides: - - 1 - - 1 - width: 11 - 7: - K_h: 1 - K_w: 4 - height: 12 - input_channels: 128 - num_threads: 1 - output_channels: 32 - padding: same - strides: - - 2 - - 2 - width: 8 - 8: - K_h: 2 - K_w: 5 - height: 12 - input_channels: 32 - num_threads: 2 - output_channels: 32 - padding: same - strides: - - 1 - - 2 - width: 6 - 9: - K_h: 6 - K_w: 3 - height: 10 - input_channels: 32 - num_threads: 5 - output_channels: 64 - padding: same - strides: - - 2 - - 2 - width: 6 - 10: - K_h: 2 - K_w: 3 - height: 10 - input_channels: 128 - num_threads: 5 - output_channels: 32 - padding: same - strides: - - 2 - - 1 - width: 11 - 11: - K_h: 6 - K_w: 4 - height: 10 - input_channels: 128 - num_threads: 2 - output_channels: 64 - padding: same - strides: - - 2 - - 2 - width: 8 - 12: - K_h: 2 - K_w: 3 - height: 7 - input_channels: 32 - num_threads: 5 - output_channels: 32 - padding: same - strides: - - 1 - - 1 - width: 8 - 13: - K_h: 1 - K_w: 4 - height: 7 - input_channels: 128 - num_threads: 5 - output_channels: 64 - padding: same - strides: - - 1 - - 1 - width: 6 - 14: - K_h: 3 - K_w: 1 - height: 12 - input_channels: 32 - num_threads: 5 - output_channels: 64 - padding: same - strides: - - 1 - - 2 - width: 6 - 15: - K_h: 6 - K_w: 4 - height: 10 - input_channels: 128 - num_threads: 1 - output_channels: 32 - padding: same - strides: - - 1 - - 1 - width: 11 - 16: - K_h: 3 - K_w: 5 - height: 10 - input_channels: 128 - num_threads: 1 - output_channels: 64 - padding: same - strides: - - 1 - - 2 - width: 8 - 17: - K_h: 1 - K_w: 5 - height: 10 - input_channels: 32 - num_threads: 5 - output_channels: 64 - padding: same - strides: - - 2 - - 1 - width: 11 - 18: - K_h: 2 - K_w: 1 - height: 10 - input_channels: 128 - num_threads: 1 - output_channels: 32 - padding: same - strides: - - 1 - - 2 - width: 11 - 19: - K_h: 3 - K_w: 5 - height: 12 - input_channels: 32 - num_threads: 1 - output_channels: 32 - padding: same - strides: - - 2 - - 1 - width: 6 diff --git a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_int8_DIDO_padded.py b/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_int8_DIDO_padded.py deleted file mode 100644 index 234e37252..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_int8_DIDO_padded.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from ..test_bconv2d_int8_DIDO import ( # pylint: disable=unused-import - GENERATOR, - RUNNER, - bitpacked_outputs, - reference_op_code, - converted_op_code, -) - -from . import ( # pylint: disable=unused-import - test_reference_model_regression, - test_converted_model, - test_output, -) - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_int8_DIDO_padded.yml b/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_int8_DIDO_padded.yml deleted file mode 100644 index 91ba069c7..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_int8_DIDO_padded.yml +++ /dev/null @@ -1,303 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 1 - K_w: 4 - activation: relu - height: 10 - input_channels: 256 - output_channels: 48 - output_range: - - -4 - - 1 - padding: same - strides: - - 1 - - 1 - width: 8 - 1: - K_h: 6 - K_w: 1 - activation: relu - height: 7 - input_channels: 256 - output_channels: 48 - output_range: - - -2 - - 5 - padding: same - strides: - - 1 - - 2 - width: 11 - 2: - K_h: 6 - K_w: 3 - activation: relu - height: 10 - input_channels: 256 - output_channels: 48 - output_range: - - -4 - - 3 - padding: same - strides: - - 1 - - 1 - width: 8 - 3: - K_h: 6 - K_w: 4 - activation: relu - height: 12 - input_channels: 256 - output_channels: 16 - output_range: - - 0 - - 5 - padding: same - strides: - - 1 - - 2 - width: 6 - 4: - K_h: 1 - K_w: 3 - activation: relu - height: 12 - input_channels: 512 - output_channels: 48 - output_range: - - 0 - - 1 - padding: same - strides: - - 1 - - 2 - width: 11 - 5: - K_h: 6 - K_w: 1 - activation: relu - height: 7 - input_channels: 256 - output_channels: 16 - output_range: - - -4 - - 3 - padding: same - strides: - - 2 - - 2 - width: 6 - 6: - K_h: 3 - K_w: 5 - activation: relu - height: 7 - input_channels: 256 - output_channels: 16 - output_range: - - -2 - - 1 - padding: same - strides: - - 1 - - 1 - width: 11 - 7: - K_h: 1 - K_w: 1 - activation: relu - height: 7 - input_channels: 512 - output_channels: 48 - output_range: - - -4 - - 3 - padding: same - strides: - - 2 - - 2 - width: 8 - 8: - K_h: 2 - K_w: 5 - activation: relu - height: 10 - input_channels: 512 - output_channels: 48 - output_range: - - -2 - - 5 - padding: same - strides: - - 2 - - 2 - width: 8 - 9: - K_h: 2 - K_w: 1 - activation: relu - height: 10 - input_channels: 512 - output_channels: 16 - output_range: - - 0 - - 3 - padding: same - strides: - - 1 - - 1 - width: 8 - 10: - K_h: 3 - K_w: 1 - activation: relu - height: 12 - input_channels: 512 - output_channels: 16 - output_range: - - -4 - - 5 - padding: same - strides: - - 2 - - 1 - width: 11 - 11: - K_h: 3 - K_w: 4 - activation: relu - height: 12 - input_channels: 512 - output_channels: 48 - output_range: - - -4 - - 5 - padding: same - strides: - - 1 - - 1 - width: 8 - 12: - K_h: 1 - K_w: 4 - activation: relu - height: 7 - input_channels: 512 - output_channels: 48 - output_range: - - -2 - - 1 - padding: same - strides: - - 2 - - 2 - width: 11 - 13: - K_h: 3 - K_w: 5 - activation: relu - height: 10 - input_channels: 256 - output_channels: 16 - output_range: - - -2 - - 3 - padding: same - strides: - - 2 - - 2 - width: 6 - 14: - K_h: 6 - K_w: 4 - activation: relu - height: 12 - input_channels: 256 - output_channels: 16 - output_range: - - 0 - - 3 - padding: same - strides: - - 1 - - 2 - width: 11 - 15: - K_h: 2 - K_w: 3 - activation: relu - height: 10 - input_channels: 512 - output_channels: 16 - output_range: - - -2 - - 3 - padding: same - strides: - - 2 - - 1 - width: 11 - 16: - K_h: 2 - K_w: 5 - activation: relu - height: 10 - input_channels: 256 - output_channels: 48 - output_range: - - 0 - - 1 - padding: same - strides: - - 2 - - 1 - width: 6 - 17: - K_h: 2 - K_w: 3 - activation: relu - height: 7 - input_channels: 512 - output_channels: 48 - output_range: - - 0 - - 1 - padding: same - strides: - - 2 - - 1 - width: 8 - 18: - K_h: 3 - K_w: 3 - activation: relu - height: 12 - input_channels: 512 - output_channels: 16 - output_range: - - 0 - - 5 - padding: same - strides: - - 2 - - 1 - width: 6 - 19: - K_h: 1 - K_w: 5 - activation: relu - height: 7 - input_channels: 256 - output_channels: 16 - output_range: - - -4 - - 1 - padding: same - strides: - - 1 - - 2 - width: 6 diff --git a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_int8_padded.py b/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_int8_padded.py deleted file mode 100644 index 745a56d32..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_int8_padded.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from ..test_bconv2d_int8 import ( # pylint: disable=unused-import - GENERATOR, - RUNNER, - bitpacked_outputs, - reference_op_code, - converted_op_code, -) - -from . import ( # pylint: disable=unused-import - test_reference_model_regression, - test_converted_model, - test_output, -) - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_int8_padded.yml b/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_int8_padded.yml deleted file mode 100644 index e3d2da861..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/padded/test_bconv2d_int8_padded.yml +++ /dev/null @@ -1,323 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 2 - K_w: 4 - activation: relu - height: 10 - input_channels: 32 - num_threads: 5 - output_channels: 4 - output_range: - - -4 - - 1 - padding: same - strides: - - 2 - - 1 - width: 8 - 1: - K_h: 3 - K_w: 5 - activation: relu - height: 10 - input_channels: 128 - num_threads: 5 - output_channels: 32 - output_range: - - -4 - - 5 - padding: same - strides: - - 2 - - 2 - width: 6 - 2: - K_h: 1 - K_w: 5 - activation: relu - height: 12 - input_channels: 320 - num_threads: 1 - output_channels: 4 - output_range: - - -2 - - 3 - padding: same - strides: - - 1 - - 2 - width: 8 - 3: - K_h: 3 - K_w: 4 - activation: relu - height: 7 - input_channels: 128 - num_threads: 5 - output_channels: 32 - output_range: - - 0 - - 5 - padding: same - strides: - - 2 - - 2 - width: 6 - 4: - K_h: 2 - K_w: 3 - activation: relu - height: 10 - input_channels: 320 - num_threads: 1 - output_channels: 28 - output_range: - - -2 - - 5 - padding: same - strides: - - 1 - - 2 - width: 8 - 5: - K_h: 2 - K_w: 1 - activation: relu - height: 7 - input_channels: 32 - num_threads: 1 - output_channels: 4 - output_range: - - -4 - - 1 - padding: same - strides: - - 1 - - 2 - width: 6 - 6: - K_h: 3 - K_w: 3 - activation: relu - height: 10 - input_channels: 128 - num_threads: 1 - output_channels: 4 - output_range: - - -4 - - 3 - padding: same - strides: - - 1 - - 1 - width: 11 - 7: - K_h: 1 - K_w: 3 - activation: relu - height: 12 - input_channels: 320 - num_threads: 5 - output_channels: 4 - output_range: - - -2 - - 1 - padding: same - strides: - - 2 - - 2 - width: 6 - 8: - K_h: 1 - K_w: 5 - activation: relu - height: 7 - input_channels: 128 - num_threads: 2 - output_channels: 28 - output_range: - - 0 - - 1 - padding: same - strides: - - 1 - - 1 - width: 11 - 9: - K_h: 3 - K_w: 1 - activation: relu - height: 12 - input_channels: 320 - num_threads: 1 - output_channels: 4 - output_range: - - -2 - - 5 - padding: same - strides: - - 1 - - 2 - width: 11 - 10: - K_h: 6 - K_w: 5 - activation: relu - height: 10 - input_channels: 320 - num_threads: 2 - output_channels: 32 - output_range: - - 0 - - 1 - padding: same - strides: - - 2 - - 1 - width: 11 - 11: - K_h: 1 - K_w: 5 - activation: relu - height: 12 - input_channels: 32 - num_threads: 2 - output_channels: 32 - output_range: - - -4 - - 1 - padding: same - strides: - - 1 - - 1 - width: 11 - 12: - K_h: 6 - K_w: 1 - activation: relu - height: 7 - input_channels: 32 - num_threads: 5 - output_channels: 28 - output_range: - - -4 - - 3 - padding: same - strides: - - 2 - - 1 - width: 11 - 13: - K_h: 6 - K_w: 1 - activation: relu - height: 7 - input_channels: 128 - num_threads: 5 - output_channels: 28 - output_range: - - -2 - - 1 - padding: same - strides: - - 2 - - 1 - width: 8 - 14: - K_h: 6 - K_w: 3 - activation: relu - height: 10 - input_channels: 128 - num_threads: 2 - output_channels: 28 - output_range: - - 0 - - 3 - padding: same - strides: - - 1 - - 2 - width: 8 - 15: - K_h: 2 - K_w: 4 - activation: relu - height: 10 - input_channels: 32 - num_threads: 2 - output_channels: 28 - output_range: - - -2 - - 3 - padding: same - strides: - - 1 - - 1 - width: 8 - 16: - K_h: 3 - K_w: 4 - activation: relu - height: 12 - input_channels: 32 - num_threads: 5 - output_channels: 4 - output_range: - - 0 - - 3 - padding: same - strides: - - 2 - - 2 - width: 6 - 17: - K_h: 2 - K_w: 4 - activation: relu - height: 7 - input_channels: 32 - num_threads: 1 - output_channels: 32 - output_range: - - 0 - - 3 - padding: same - strides: - - 1 - - 1 - width: 8 - 18: - K_h: 1 - K_w: 3 - activation: relu - height: 12 - input_channels: 320 - num_threads: 1 - output_channels: 28 - output_range: - - -2 - - 1 - padding: same - strides: - - 2 - - 2 - width: 11 - 19: - K_h: 6 - K_w: 1 - activation: relu - height: 12 - input_channels: 128 - num_threads: 2 - output_channels: 32 - output_range: - - 0 - - 5 - padding: same - strides: - - 2 - - 1 - width: 6 diff --git a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_bin.py b/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_bin.py deleted file mode 100644 index 99c65f644..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_bin.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import larq -import tensorflow as tf - -from tflite2xcore.xcore_schema import ExternalOpCodes, XCOREOpCodes -from tflite2xcore.model_generation import Configuration - -from . import ( - BinarizedSingleOpRunner, - BConv2dGenericTestModelGenerator, - LarqSingleOpConverter, -) - -from . import ( # pylint: disable=unused-import - test_reference_model_regression, - test_converted_single_op_model, - test_mean_abs_diffs, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class BConv2dBitpackedTestModelGenerator(BConv2dGenericTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - cfg.setdefault("padding", "valid") - for forbidden_key in ("activation", "output_range"): - assert ( - forbidden_key not in cfg - ), f"{forbidden_key} cannot be specified for BConv2dBitpacked tests" - super()._set_config(cfg) - - def check_config(self) -> None: - super().check_config() - assert ( - self._config["input_channels"] % 32 == 0 - ), "# of input channels must be multiple of 32" - - def _build_core_model(self) -> tf.keras.Model: - img = tf.keras.layers.Input(shape=self._input_shape) - x = self._fake_quant(img, *self._config["input_range"]) - x = self._op_layer()(x) - # NOTE: we need the next dummy layer in order to produce a bconv2d with bitpacked output - x = larq.layers.QuantConv2D( - filters=32, - kernel_size=(1, 1), - padding="valid", - pad_values=1, - strides=(1, 1), - input_quantizer="ste_sign", - kernel_quantizer="ste_sign", - kernel_constraint="weight_clip", - )(x) - x = self._fake_quant(x, *self._config["output_range"]) - return tf.keras.Model(img, x) - - -GENERATOR = BConv2dBitpackedTestModelGenerator - -# ---------------------------------------------------------------------------- -# RUNNERS -# ---------------------------------------------------------------------------- - - -class BConv2dBitpackedTestRunner(BinarizedSingleOpRunner): - def make_lce_converter(self) -> LarqSingleOpConverter: - return LarqSingleOpConverter( - self, self.get_built_model, strip=True, remove_last_op=True - ) - - -RUNNER = BConv2dBitpackedTestRunner - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def reference_op_code() -> ExternalOpCodes: - return ExternalOpCodes.LceBconv2d - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_bconv2d_bin - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_bin.yml b/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_bin.yml deleted file mode 100644 index 6a097a2d0..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_bin.yml +++ /dev/null @@ -1,223 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 3 - K_w: 3 - height: 12 - input_channels: 128 - num_threads: 2 - output_channels: 32 - strides: - - 2 - - 1 - width: 11 - 1: - K_h: 3 - K_w: 3 - height: 10 - input_channels: 32 - num_threads: 2 - output_channels: 64 - strides: - - 2 - - 1 - width: 8 - 2: - K_h: 6 - K_w: 1 - height: 7 - input_channels: 128 - num_threads: 5 - output_channels: 32 - strides: - - 2 - - 2 - width: 6 - 3: - K_h: 2 - K_w: 4 - height: 10 - input_channels: 128 - num_threads: 2 - output_channels: 32 - strides: - - 1 - - 1 - width: 6 - 4: - K_h: 1 - K_w: 1 - height: 12 - input_channels: 32 - num_threads: 1 - output_channels: 64 - strides: - - 1 - - 2 - width: 11 - 5: - K_h: 6 - K_w: 5 - height: 7 - input_channels: 128 - num_threads: 1 - output_channels: 32 - strides: - - 1 - - 2 - width: 11 - 6: - K_h: 6 - K_w: 4 - height: 10 - input_channels: 32 - num_threads: 2 - output_channels: 32 - strides: - - 1 - - 1 - width: 8 - 7: - K_h: 6 - K_w: 5 - height: 7 - input_channels: 32 - num_threads: 5 - output_channels: 64 - strides: - - 1 - - 2 - width: 8 - 8: - K_h: 2 - K_w: 5 - height: 12 - input_channels: 32 - num_threads: 5 - output_channels: 64 - strides: - - 2 - - 1 - width: 6 - 9: - K_h: 6 - K_w: 5 - height: 7 - input_channels: 128 - num_threads: 2 - output_channels: 32 - strides: - - 1 - - 1 - width: 8 - 10: - K_h: 1 - K_w: 1 - height: 10 - input_channels: 128 - num_threads: 1 - output_channels: 64 - strides: - - 2 - - 2 - width: 11 - 11: - K_h: 1 - K_w: 5 - height: 10 - input_channels: 128 - num_threads: 1 - output_channels: 64 - strides: - - 1 - - 1 - width: 11 - 12: - K_h: 3 - K_w: 1 - height: 10 - input_channels: 32 - num_threads: 1 - output_channels: 64 - strides: - - 1 - - 2 - width: 6 - 13: - K_h: 2 - K_w: 3 - height: 12 - input_channels: 128 - num_threads: 2 - output_channels: 32 - strides: - - 2 - - 2 - width: 6 - 14: - K_h: 3 - K_w: 4 - height: 12 - input_channels: 128 - num_threads: 5 - output_channels: 64 - strides: - - 1 - - 2 - width: 11 - 15: - K_h: 2 - K_w: 3 - height: 12 - input_channels: 32 - num_threads: 2 - output_channels: 32 - strides: - - 2 - - 1 - width: 8 - 16: - K_h: 3 - K_w: 1 - height: 12 - input_channels: 32 - num_threads: 2 - output_channels: 32 - strides: - - 2 - - 1 - width: 11 - 17: - K_h: 1 - K_w: 4 - height: 7 - input_channels: 32 - num_threads: 1 - output_channels: 64 - strides: - - 2 - - 2 - width: 8 - 18: - K_h: 1 - K_w: 3 - height: 10 - input_channels: 32 - num_threads: 5 - output_channels: 32 - strides: - - 1 - - 1 - width: 6 - 19: - K_h: 2 - K_w: 4 - height: 7 - input_channels: 128 - num_threads: 5 - output_channels: 64 - strides: - - 2 - - 2 - width: 6 diff --git a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_bin_DI.py b/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_bin_DI.py deleted file mode 100644 index 5cf690693..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_bin_DI.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import XCOREOpCodes - - -from .test_bconv2d_bin import reference_op_code # pylint: disable=unused-import -from .test_bconv2d_bin import ( - BConv2dBitpackedTestRunner, - BConv2dBitpackedTestModelGenerator, -) - -from . import ( # pylint: disable=unused-import - test_reference_model_regression, - test_converted_single_op_model, - test_mean_abs_diffs, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class BConv2dBitpackedDeepInTestModelGenerator(BConv2dBitpackedTestModelGenerator): - def check_config(self) -> None: - super().check_config() - assert ( - self._config["input_channels"] % 256 == 0 - ), "# of input channels must be multiple of 256" - - -GENERATOR = BConv2dBitpackedDeepInTestModelGenerator - -# ---------------------------------------------------------------------------- -# RUNNERS -# ---------------------------------------------------------------------------- - - -RUNNER = BConv2dBitpackedTestRunner - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_bconv2d_bin_DI - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_bin_DI.yml b/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_bin_DI.yml deleted file mode 100644 index 9cde4504c..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_bin_DI.yml +++ /dev/null @@ -1,223 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 6 - K_w: 3 - height: 10 - input_channels: 256 - num_threads: 5 - output_channels: 64 - strides: - - 1 - - 1 - width: 6 - 1: - K_h: 6 - K_w: 3 - height: 10 - input_channels: 256 - num_threads: 1 - output_channels: 32 - strides: - - 1 - - 1 - width: 6 - 2: - K_h: 6 - K_w: 3 - height: 12 - input_channels: 256 - num_threads: 1 - output_channels: 64 - strides: - - 1 - - 2 - width: 6 - 3: - K_h: 1 - K_w: 4 - height: 10 - input_channels: 512 - num_threads: 2 - output_channels: 64 - strides: - - 1 - - 2 - width: 11 - 4: - K_h: 2 - K_w: 1 - height: 12 - input_channels: 256 - num_threads: 1 - output_channels: 32 - strides: - - 1 - - 2 - width: 8 - 5: - K_h: 6 - K_w: 1 - height: 7 - input_channels: 256 - num_threads: 5 - output_channels: 64 - strides: - - 2 - - 2 - width: 11 - 6: - K_h: 1 - K_w: 4 - height: 10 - input_channels: 256 - num_threads: 2 - output_channels: 64 - strides: - - 2 - - 2 - width: 11 - 7: - K_h: 3 - K_w: 5 - height: 7 - input_channels: 256 - num_threads: 1 - output_channels: 32 - strides: - - 2 - - 2 - width: 8 - 8: - K_h: 3 - K_w: 1 - height: 12 - input_channels: 512 - num_threads: 2 - output_channels: 32 - strides: - - 1 - - 2 - width: 8 - 9: - K_h: 1 - K_w: 5 - height: 10 - input_channels: 512 - num_threads: 1 - output_channels: 64 - strides: - - 1 - - 2 - width: 8 - 10: - K_h: 2 - K_w: 1 - height: 12 - input_channels: 512 - num_threads: 5 - output_channels: 64 - strides: - - 2 - - 2 - width: 6 - 11: - K_h: 3 - K_w: 4 - height: 7 - input_channels: 256 - num_threads: 1 - output_channels: 64 - strides: - - 1 - - 1 - width: 11 - 12: - K_h: 6 - K_w: 4 - height: 12 - input_channels: 512 - num_threads: 5 - output_channels: 64 - strides: - - 2 - - 2 - width: 8 - 13: - K_h: 3 - K_w: 5 - height: 7 - input_channels: 512 - num_threads: 2 - output_channels: 32 - strides: - - 1 - - 1 - width: 11 - 14: - K_h: 2 - K_w: 4 - height: 7 - input_channels: 512 - num_threads: 1 - output_channels: 32 - strides: - - 2 - - 1 - width: 11 - 15: - K_h: 2 - K_w: 3 - height: 7 - input_channels: 256 - num_threads: 2 - output_channels: 32 - strides: - - 1 - - 1 - width: 6 - 16: - K_h: 2 - K_w: 1 - height: 12 - input_channels: 512 - num_threads: 2 - output_channels: 64 - strides: - - 2 - - 1 - width: 11 - 17: - K_h: 3 - K_w: 5 - height: 10 - input_channels: 256 - num_threads: 2 - output_channels: 32 - strides: - - 2 - - 1 - width: 8 - 18: - K_h: 1 - K_w: 3 - height: 10 - input_channels: 512 - num_threads: 5 - output_channels: 32 - strides: - - 2 - - 1 - width: 6 - 19: - K_h: 1 - K_w: 5 - height: 12 - input_channels: 512 - num_threads: 5 - output_channels: 32 - strides: - - 2 - - 1 - width: 6 diff --git a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8.py b/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8.py deleted file mode 100644 index 16daa90e4..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8.py +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import ExternalOpCodes, XCOREOpCodes -from tflite2xcore.model_generation import Configuration - -from . import ( - BinarizedSingleOpRunner, - BConv2dGenericTestModelGenerator, - LarqSingleOpConverter, -) - -from . import ( # pylint: disable=unused-import - test_reference_model_regression, - test_converted_single_op_model, - test_output, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class BConv2dInt8TestModelGenerator(BConv2dGenericTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - cfg.setdefault("padding", "valid") - super()._set_config(cfg) - - -GENERATOR = BConv2dInt8TestModelGenerator - -# ---------------------------------------------------------------------------- -# RUNNERS -# ---------------------------------------------------------------------------- - - -class BConv2dInt8TestRunner(BinarizedSingleOpRunner): - def make_lce_converter(self) -> LarqSingleOpConverter: - return LarqSingleOpConverter(self, self.get_built_model, strip=True) - - -RUNNER = BConv2dInt8TestRunner - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def bitpacked_outputs() -> bool: - return False - - -@pytest.fixture -def reference_op_code() -> ExternalOpCodes: - return ExternalOpCodes.LceBconv2d - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_bconv2d_int8 - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8.yml b/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8.yml deleted file mode 100644 index 0bbd56b4d..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8.yml +++ /dev/null @@ -1,303 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 3 - K_w: 1 - activation: relu - height: 7 - input_channels: 320 - num_threads: 1 - output_channels: 4 - output_range: - - -4 - - 5 - strides: - - 1 - - 1 - width: 11 - 1: - K_h: 1 - K_w: 5 - activation: relu - height: 10 - input_channels: 128 - num_threads: 2 - output_channels: 4 - output_range: - - -4 - - 1 - strides: - - 2 - - 1 - width: 11 - 2: - K_h: 3 - K_w: 3 - activation: relu - height: 7 - input_channels: 128 - num_threads: 5 - output_channels: 28 - output_range: - - -2 - - 5 - strides: - - 2 - - 1 - width: 8 - 3: - K_h: 1 - K_w: 4 - activation: relu - height: 12 - input_channels: 320 - num_threads: 5 - output_channels: 32 - output_range: - - -4 - - 1 - strides: - - 2 - - 1 - width: 8 - 4: - K_h: 2 - K_w: 4 - activation: relu - height: 12 - input_channels: 32 - num_threads: 1 - output_channels: 28 - output_range: - - 0 - - 3 - strides: - - 1 - - 1 - width: 6 - 5: - K_h: 6 - K_w: 1 - activation: relu - height: 10 - input_channels: 320 - num_threads: 2 - output_channels: 28 - output_range: - - 0 - - 1 - strides: - - 2 - - 2 - width: 6 - 6: - K_h: 2 - K_w: 1 - activation: relu - height: 12 - input_channels: 128 - num_threads: 1 - output_channels: 28 - output_range: - - -4 - - 5 - strides: - - 2 - - 2 - width: 6 - 7: - K_h: 2 - K_w: 5 - activation: relu - height: 12 - input_channels: 32 - num_threads: 2 - output_channels: 4 - output_range: - - 0 - - 1 - strides: - - 2 - - 1 - width: 6 - 8: - K_h: 1 - K_w: 3 - activation: relu - height: 10 - input_channels: 320 - num_threads: 5 - output_channels: 32 - output_range: - - 0 - - 5 - strides: - - 2 - - 2 - width: 8 - 9: - K_h: 1 - K_w: 4 - activation: relu - height: 7 - input_channels: 32 - num_threads: 2 - output_channels: 4 - output_range: - - -2 - - 3 - strides: - - 1 - - 2 - width: 11 - 10: - K_h: 6 - K_w: 1 - activation: relu - height: 10 - input_channels: 128 - num_threads: 1 - output_channels: 4 - output_range: - - 0 - - 5 - strides: - - 1 - - 2 - width: 11 - 11: - K_h: 6 - K_w: 3 - activation: relu - height: 12 - input_channels: 320 - num_threads: 5 - output_channels: 28 - output_range: - - -2 - - 1 - strides: - - 1 - - 2 - width: 11 - 12: - K_h: 6 - K_w: 5 - activation: relu - height: 12 - input_channels: 32 - num_threads: 1 - output_channels: 32 - output_range: - - 0 - - 1 - strides: - - 1 - - 1 - width: 6 - 13: - K_h: 2 - K_w: 5 - activation: relu - height: 7 - input_channels: 128 - num_threads: 5 - output_channels: 28 - output_range: - - -2 - - 3 - strides: - - 2 - - 1 - width: 8 - 14: - K_h: 3 - K_w: 4 - activation: relu - height: 10 - input_channels: 32 - num_threads: 5 - output_channels: 4 - output_range: - - 0 - - 5 - strides: - - 2 - - 2 - width: 8 - 15: - K_h: 6 - K_w: 3 - activation: relu - height: 10 - input_channels: 32 - num_threads: 2 - output_channels: 4 - output_range: - - -4 - - 3 - strides: - - 1 - - 1 - width: 11 - 16: - K_h: 3 - K_w: 1 - activation: relu - height: 12 - input_channels: 128 - num_threads: 5 - output_channels: 32 - output_range: - - -2 - - 1 - strides: - - 1 - - 1 - width: 6 - 17: - K_h: 1 - K_w: 4 - activation: relu - height: 7 - input_channels: 128 - num_threads: 2 - output_channels: 32 - output_range: - - -4 - - 5 - strides: - - 1 - - 2 - width: 11 - 18: - K_h: 2 - K_w: 3 - activation: relu - height: 10 - input_channels: 320 - num_threads: 2 - output_channels: 28 - output_range: - - -4 - - 3 - strides: - - 2 - - 2 - width: 8 - 19: - K_h: 3 - K_w: 5 - activation: relu - height: 7 - input_channels: 320 - num_threads: 1 - output_channels: 32 - output_range: - - -2 - - 5 - strides: - - 1 - - 2 - width: 8 diff --git a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_DIDO.py b/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_DIDO.py deleted file mode 100644 index 67f6c7365..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_DIDO.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import ExternalOpCodes, XCOREOpCodes - -from .test_bconv2d_int8 import BConv2dInt8TestModelGenerator -from .test_bconv2d_int8 import ( # pylint: disable=unused-import - bitpacked_outputs, - RUNNER, -) -from . import ( # pylint: disable=unused-import - test_reference_model_regression, - test_converted_single_op_model, - test_output, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class BConv2dInt8DeepInDeepOutTestModelGenerator(BConv2dInt8TestModelGenerator): - def check_config(self) -> None: - super().check_config() - assert ( - self._config["input_channels"] % 256 == 0 - ), "# of input channels must be multiple of 256" - assert ( - self._config["output_channels"] % 16 == 0 - ), "# of input channels must be multiple of 16" - - -GENERATOR = BConv2dInt8DeepInDeepOutTestModelGenerator - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def reference_op_code() -> ExternalOpCodes: - return ExternalOpCodes.LceBconv2d - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_bconv2d_int8_DIDO - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_DIDO.yml b/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_DIDO.yml deleted file mode 100644 index 0e6bdbea2..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_DIDO.yml +++ /dev/null @@ -1,303 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 2 - K_w: 4 - activation: relu - height: 7 - input_channels: 256 - num_threads: 1 - output_channels: 16 - output_range: - - -2 - - 5 - strides: - - 2 - - 2 - width: 8 - 1: - K_h: 3 - K_w: 3 - activation: relu - height: 7 - input_channels: 512 - num_threads: 2 - output_channels: 16 - output_range: - - -2 - - 1 - strides: - - 1 - - 2 - width: 8 - 2: - K_h: 2 - K_w: 4 - activation: relu - height: 7 - input_channels: 256 - num_threads: 1 - output_channels: 16 - output_range: - - 0 - - 1 - strides: - - 2 - - 2 - width: 8 - 3: - K_h: 6 - K_w: 5 - activation: relu - height: 12 - input_channels: 256 - num_threads: 1 - output_channels: 16 - output_range: - - 0 - - 1 - strides: - - 1 - - 2 - width: 8 - 4: - K_h: 1 - K_w: 1 - activation: relu - height: 7 - input_channels: 256 - num_threads: 2 - output_channels: 48 - output_range: - - -4 - - 3 - strides: - - 1 - - 1 - width: 11 - 5: - K_h: 3 - K_w: 4 - activation: relu - height: 10 - input_channels: 256 - num_threads: 1 - output_channels: 48 - output_range: - - -2 - - 1 - strides: - - 2 - - 2 - width: 8 - 6: - K_h: 3 - K_w: 1 - activation: relu - height: 12 - input_channels: 512 - num_threads: 2 - output_channels: 48 - output_range: - - -2 - - 1 - strides: - - 1 - - 1 - width: 6 - 7: - K_h: 1 - K_w: 5 - activation: relu - height: 7 - input_channels: 512 - num_threads: 5 - output_channels: 48 - output_range: - - 0 - - 3 - strides: - - 2 - - 1 - width: 6 - 8: - K_h: 6 - K_w: 4 - activation: relu - height: 10 - input_channels: 256 - num_threads: 5 - output_channels: 16 - output_range: - - -2 - - 3 - strides: - - 2 - - 1 - width: 6 - 9: - K_h: 6 - K_w: 3 - activation: relu - height: 12 - input_channels: 256 - num_threads: 5 - output_channels: 48 - output_range: - - 0 - - 3 - strides: - - 2 - - 1 - width: 11 - 10: - K_h: 1 - K_w: 3 - activation: relu - height: 10 - input_channels: 512 - num_threads: 2 - output_channels: 48 - output_range: - - -4 - - 3 - strides: - - 2 - - 2 - width: 11 - 11: - K_h: 3 - K_w: 5 - activation: relu - height: 12 - input_channels: 512 - num_threads: 1 - output_channels: 16 - output_range: - - -4 - - 1 - strides: - - 1 - - 2 - width: 11 - 12: - K_h: 1 - K_w: 1 - activation: relu - height: 10 - input_channels: 512 - num_threads: 5 - output_channels: 48 - output_range: - - -4 - - 1 - strides: - - 1 - - 2 - width: 8 - 13: - K_h: 3 - K_w: 5 - activation: relu - height: 12 - input_channels: 512 - num_threads: 5 - output_channels: 16 - output_range: - - 0 - - 1 - strides: - - 1 - - 2 - width: 6 - 14: - K_h: 2 - K_w: 5 - activation: relu - height: 10 - input_channels: 512 - num_threads: 5 - output_channels: 16 - output_range: - - -4 - - 5 - strides: - - 1 - - 1 - width: 6 - 15: - K_h: 2 - K_w: 1 - activation: relu - height: 12 - input_channels: 256 - num_threads: 1 - output_channels: 48 - output_range: - - 0 - - 5 - strides: - - 2 - - 1 - width: 11 - 16: - K_h: 2 - K_w: 3 - activation: relu - height: 10 - input_channels: 512 - num_threads: 2 - output_channels: 16 - output_range: - - 0 - - 5 - strides: - - 2 - - 2 - width: 6 - 17: - K_h: 6 - K_w: 4 - activation: relu - height: 7 - input_channels: 256 - num_threads: 2 - output_channels: 48 - output_range: - - -2 - - 5 - strides: - - 1 - - 1 - width: 6 - 18: - K_h: 1 - K_w: 3 - activation: relu - height: 7 - input_channels: 512 - num_threads: 1 - output_channels: 48 - output_range: - - -2 - - 3 - strides: - - 1 - - 1 - width: 11 - 19: - K_h: 6 - K_w: 1 - activation: relu - height: 12 - input_channels: 256 - num_threads: 5 - output_channels: 16 - output_range: - - -4 - - 3 - strides: - - 2 - - 1 - width: 11 diff --git a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_DIDO_activation.py b/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_DIDO_activation.py deleted file mode 100644 index e28e61a97..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_DIDO_activation.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from .test_bconv2d_int8_DIDO import ( # pylint: disable=unused-import - GENERATOR, - RUNNER, - bitpacked_outputs, - reference_op_code, - converted_op_code, -) - -from . import ( # pylint: disable=unused-import - test_reference_model_regression, - test_converted_single_op_model, - test_output, -) - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_DIDO_activation.yml b/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_DIDO_activation.yml deleted file mode 100644 index 11ad35ba7..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_DIDO_activation.yml +++ /dev/null @@ -1,303 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 3 - K_w: 3 - activation: relu - height: 7 - input_channels: 512 - num_threads: 2 - output_channels: 48 - output_range: - - -4 - - 1 - strides: - - 1 - - 2 - width: 6 - 1: - K_h: 2 - K_w: 4 - activation: relu - height: 10 - input_channels: 512 - num_threads: 2 - output_channels: 48 - output_range: - - -2 - - 1 - strides: - - 2 - - 2 - width: 8 - 2: - K_h: 2 - K_w: 5 - activation: relu - height: 12 - input_channels: 256 - num_threads: 1 - output_channels: 16 - output_range: - - 0 - - 5 - strides: - - 1 - - 1 - width: 6 - 3: - K_h: 1 - K_w: 4 - activation: relu - height: 12 - input_channels: 256 - num_threads: 5 - output_channels: 16 - output_range: - - -2 - - 1 - strides: - - 1 - - 1 - width: 8 - 4: - K_h: 6 - K_w: 4 - activation: relu - height: 12 - input_channels: 512 - num_threads: 1 - output_channels: 48 - output_range: - - -2 - - 3 - strides: - - 1 - - 1 - width: 8 - 5: - K_h: 1 - K_w: 3 - activation: relu - height: 12 - input_channels: 512 - num_threads: 2 - output_channels: 48 - output_range: - - 0 - - 1 - strides: - - 1 - - 2 - width: 8 - 6: - K_h: 2 - K_w: 5 - activation: relu - height: 10 - input_channels: 256 - num_threads: 5 - output_channels: 48 - output_range: - - -4 - - 5 - strides: - - 2 - - 2 - width: 8 - 7: - K_h: 3 - K_w: 1 - activation: relu - height: 7 - input_channels: 256 - num_threads: 2 - output_channels: 16 - output_range: - - -2 - - 5 - strides: - - 2 - - 1 - width: 11 - 8: - K_h: 6 - K_w: 1 - activation: relu - height: 12 - input_channels: 512 - num_threads: 5 - output_channels: 48 - output_range: - - -2 - - 5 - strides: - - 2 - - 1 - width: 6 - 9: - K_h: 1 - K_w: 5 - activation: relu - height: 10 - input_channels: 512 - num_threads: 5 - output_channels: 48 - output_range: - - 0 - - 3 - strides: - - 1 - - 1 - width: 11 - 10: - K_h: 2 - K_w: 3 - activation: relu - height: 7 - input_channels: 512 - num_threads: 1 - output_channels: 16 - output_range: - - -4 - - 5 - strides: - - 2 - - 1 - width: 6 - 11: - K_h: 1 - K_w: 4 - activation: relu - height: 10 - input_channels: 256 - num_threads: 1 - output_channels: 48 - output_range: - - 0 - - 5 - strides: - - 2 - - 1 - width: 11 - 12: - K_h: 6 - K_w: 1 - activation: relu - height: 12 - input_channels: 512 - num_threads: 1 - output_channels: 16 - output_range: - - -2 - - 3 - strides: - - 1 - - 2 - width: 11 - 13: - K_h: 6 - K_w: 3 - activation: relu - height: 7 - input_channels: 512 - num_threads: 2 - output_channels: 48 - output_range: - - -4 - - 3 - strides: - - 2 - - 2 - width: 8 - 14: - K_h: 2 - K_w: 1 - activation: relu - height: 10 - input_channels: 256 - num_threads: 1 - output_channels: 16 - output_range: - - -2 - - 1 - strides: - - 2 - - 2 - width: 8 - 15: - K_h: 3 - K_w: 5 - activation: relu - height: 7 - input_channels: 256 - num_threads: 2 - output_channels: 48 - output_range: - - 0 - - 3 - strides: - - 1 - - 2 - width: 11 - 16: - K_h: 1 - K_w: 1 - activation: relu - height: 12 - input_channels: 256 - num_threads: 2 - output_channels: 16 - output_range: - - 0 - - 3 - strides: - - 1 - - 1 - width: 6 - 17: - K_h: 3 - K_w: 5 - activation: relu - height: 10 - input_channels: 256 - num_threads: 5 - output_channels: 16 - output_range: - - -4 - - 1 - strides: - - 2 - - 1 - width: 11 - 18: - K_h: 3 - K_w: 3 - activation: relu - height: 7 - input_channels: 512 - num_threads: 1 - output_channels: 16 - output_range: - - 0 - - 1 - strides: - - 1 - - 2 - width: 11 - 19: - K_h: 6 - K_w: 4 - activation: relu - height: 7 - input_channels: 256 - num_threads: 5 - output_channels: 16 - output_range: - - -4 - - 3 - strides: - - 2 - - 2 - width: 6 diff --git a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_activation.py b/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_activation.py deleted file mode 100644 index c9bcfbdb4..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_activation.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from .test_bconv2d_int8 import ( # pylint: disable=unused-import - GENERATOR, - RUNNER, - bitpacked_outputs, - reference_op_code, - converted_op_code, -) - -from . import ( # pylint: disable=unused-import - test_reference_model_regression, - test_converted_single_op_model, - test_output, -) - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_activation.yml b/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_activation.yml deleted file mode 100644 index fff1ef76e..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/test_bconv2d_int8_activation.yml +++ /dev/null @@ -1,303 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 6 - K_w: 3 - activation: relu - height: 7 - input_channels: 32 - num_threads: 1 - output_channels: 4 - output_range: - - -2 - - 1 - strides: - - 2 - - 1 - width: 6 - 1: - K_h: 3 - K_w: 1 - activation: relu - height: 7 - input_channels: 128 - num_threads: 2 - output_channels: 4 - output_range: - - 0 - - 3 - strides: - - 2 - - 2 - width: 6 - 2: - K_h: 6 - K_w: 4 - activation: relu - height: 10 - input_channels: 320 - num_threads: 2 - output_channels: 28 - output_range: - - -4 - - 3 - strides: - - 2 - - 1 - width: 8 - 3: - K_h: 3 - K_w: 5 - activation: relu - height: 7 - input_channels: 320 - num_threads: 1 - output_channels: 32 - output_range: - - -2 - - 3 - strides: - - 1 - - 2 - width: 8 - 4: - K_h: 1 - K_w: 5 - activation: relu - height: 7 - input_channels: 320 - num_threads: 5 - output_channels: 32 - output_range: - - -4 - - 5 - strides: - - 1 - - 1 - width: 8 - 5: - K_h: 2 - K_w: 4 - activation: relu - height: 10 - input_channels: 32 - num_threads: 1 - output_channels: 32 - output_range: - - -4 - - 3 - strides: - - 2 - - 2 - width: 8 - 6: - K_h: 2 - K_w: 4 - activation: relu - height: 10 - input_channels: 128 - num_threads: 2 - output_channels: 4 - output_range: - - -4 - - 1 - strides: - - 2 - - 1 - width: 11 - 7: - K_h: 6 - K_w: 4 - activation: relu - height: 10 - input_channels: 320 - num_threads: 2 - output_channels: 4 - output_range: - - -4 - - 3 - strides: - - 1 - - 2 - width: 11 - 8: - K_h: 2 - K_w: 5 - activation: relu - height: 7 - input_channels: 32 - num_threads: 1 - output_channels: 32 - output_range: - - 0 - - 5 - strides: - - 2 - - 2 - width: 6 - 9: - K_h: 3 - K_w: 4 - activation: relu - height: 10 - input_channels: 32 - num_threads: 1 - output_channels: 28 - output_range: - - 0 - - 5 - strides: - - 1 - - 1 - width: 8 - 10: - K_h: 6 - K_w: 1 - activation: relu - height: 10 - input_channels: 320 - num_threads: 5 - output_channels: 28 - output_range: - - -2 - - 3 - strides: - - 2 - - 1 - width: 11 - 11: - K_h: 1 - K_w: 3 - activation: relu - height: 12 - input_channels: 128 - num_threads: 5 - output_channels: 28 - output_range: - - 0 - - 1 - strides: - - 1 - - 1 - width: 11 - 12: - K_h: 1 - K_w: 3 - activation: relu - height: 12 - input_channels: 128 - num_threads: 5 - output_channels: 4 - output_range: - - 0 - - 3 - strides: - - 2 - - 1 - width: 11 - 13: - K_h: 3 - K_w: 3 - activation: relu - height: 7 - input_channels: 128 - num_threads: 1 - output_channels: 32 - output_range: - - -4 - - 5 - strides: - - 1 - - 1 - width: 11 - 14: - K_h: 2 - K_w: 1 - activation: relu - height: 12 - input_channels: 128 - num_threads: 5 - output_channels: 28 - output_range: - - 0 - - 3 - strides: - - 1 - - 1 - width: 6 - 15: - K_h: 6 - K_w: 5 - activation: relu - height: 12 - input_channels: 320 - num_threads: 1 - output_channels: 28 - output_range: - - -2 - - 1 - strides: - - 1 - - 2 - width: 6 - 16: - K_h: 1 - K_w: 1 - activation: relu - height: 12 - input_channels: 128 - num_threads: 5 - output_channels: 28 - output_range: - - -2 - - 5 - strides: - - 2 - - 2 - width: 6 - 17: - K_h: 1 - K_w: 1 - activation: relu - height: 12 - input_channels: 320 - num_threads: 2 - output_channels: 4 - output_range: - - 0 - - 1 - strides: - - 1 - - 2 - width: 8 - 18: - K_h: 3 - K_w: 5 - activation: relu - height: 7 - input_channels: 32 - num_threads: 5 - output_channels: 32 - output_range: - - -4 - - 1 - strides: - - 2 - - 2 - width: 11 - 19: - K_h: 2 - K_w: 3 - activation: relu - height: 10 - input_channels: 32 - num_threads: 2 - output_channels: 4 - output_range: - - -2 - - 5 - strides: - - 1 - - 2 - width: 8 diff --git a/test/integration_test/test_single_op_models/test_binarized/test_bsign.py b/test/integration_test/test_single_op_models/test_binarized/test_bsign.py deleted file mode 100644 index ddbeae634..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/test_bsign.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf -import numpy as np - -from tflite2xcore.xcore_schema import ExternalOpCodes, XCOREOpCodes -from tflite2xcore.model_generation import Configuration -from tflite2xcore.model_generation.data_factories import InputInitializerDataFactory - -from . import ( - BinarizedSingleOpRunner, - LarqCompositeTestModelGenerator, - LarqSingleOpConverter, -) - -from . import ( # pylint: disable=unused-import - test_reference_model_regression, - test_converted_single_op_model, - test_mean_abs_diffs, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class BSignTestModelGenerator(LarqCompositeTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - for key in ("K_w", "K_h", "output_channels", "activation"): - assert key not in cfg, f"{key} should not be specified for bsign tests" - cfg["output_channels"] = 32 - cfg["K_w"] = cfg["K_h"] = 1 - super()._set_config(cfg) - - -GENERATOR = BSignTestModelGenerator - -# ---------------------------------------------------------------------------- -# RUNNERS -# ---------------------------------------------------------------------------- - - -class BSignTestRunner(BinarizedSingleOpRunner): - def make_lce_converter(self) -> LarqSingleOpConverter: - return LarqSingleOpConverter(self, self.get_built_model, remove_last_op=True) - - def _set_config(self, cfg: Configuration) -> None: - cfg["input_range"] = cfg.pop( - "input_range", (np.iinfo(np.int8).min, np.iinfo(np.int8).max) - ) - assert ( - "output_range" not in cfg - ), f"output_range cannot be specified for Bsign tests" - super()._set_config(cfg) - - def make_repr_data_factory(self) -> InputInitializerDataFactory: - return InputInitializerDataFactory( - self, lambda: self._model_generator.input_shape, dtype=tf.int8 - ) - - -RUNNER = BSignTestRunner - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def reference_op_code() -> ExternalOpCodes: - return ExternalOpCodes.LceQuantize - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_bsign_8 - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_binarized/test_bsign.yml b/test/integration_test/test_single_op_models/test_binarized/test_bsign.yml deleted file mode 100644 index e89f48598..000000000 --- a/test/integration_test/test_single_op_models/test_binarized/test_bsign.yml +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - height: 8 - input_channels: 32 - num_threads: 1 - width: 4 - 1: - height: 4 - input_channels: 128 - num_threads: 1 - width: 1 - 2: - height: 8 - input_channels: 224 - num_threads: 2 - width: 7 - 3: - height: 4 - input_channels: 224 - num_threads: 1 - width: 4 - 4: - height: 5 - input_channels: 32 - num_threads: 2 - width: 4 - 5: - height: 1 - input_channels: 224 - num_threads: 1 - width: 4 - 6: - height: 8 - input_channels: 128 - num_threads: 2 - width: 1 - 7: - height: 1 - input_channels: 32 - num_threads: 2 - width: 7 - 8: - height: 8 - input_channels: 32 - num_threads: 5 - width: 7 - 9: - height: 8 - input_channels: 128 - num_threads: 5 - width: 8 - 10: - height: 1 - input_channels: 224 - num_threads: 1 - width: 7 - 11: - height: 1 - input_channels: 128 - num_threads: 1 - width: 4 - 12: - height: 5 - input_channels: 224 - num_threads: 5 - width: 8 - 13: - height: 4 - input_channels: 32 - num_threads: 1 - width: 8 - 14: - height: 5 - input_channels: 224 - num_threads: 2 - width: 8 - 15: - height: 5 - input_channels: 128 - num_threads: 5 - width: 1 - 16: - height: 4 - input_channels: 128 - num_threads: 5 - width: 8 - 17: - height: 5 - input_channels: 128 - num_threads: 5 - width: 7 - 18: - height: 1 - input_channels: 128 - num_threads: 5 - width: 1 - 19: - height: 4 - input_channels: 32 - num_threads: 2 - width: 1 diff --git a/test/integration_test/test_single_op_models/test_conv2d/__init__.py b/test/integration_test/test_single_op_models/test_conv2d/__init__.py deleted file mode 100644 index 3d88c4409..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/__init__.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import tensorflow as tf -from abc import abstractmethod -from typing import Tuple, Optional - -from tflite2xcore.utils import asserting_cast -from tflite2xcore.model_generation import Configuration -from tflite2xcore.model_generation.utils import parse_init_config - -from .. import ( - PaddingMixin, - FilterOpTestModelGenerator, - ChannelPreservingOpTestModelGenerator, - test_output, - test_converted_single_op_model, - test_idempotence, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class AbstractConv2dTestModelGenerator(FilterOpTestModelGenerator): - @property - def _total_width(self) -> int: - return asserting_cast(int, self._config["width"]) - - @property - def _total_height(self) -> int: - return asserting_cast(int, self._config["height"]) - - def _set_config(self, cfg: Configuration) -> None: - self._config.update( - { - "weight_init": cfg.pop("weight_init", ("RandomUniform", -1, 1)), - "bias_init": cfg.pop("bias_init", ("Constant", 0)), - } - ) - cfg.setdefault("padding", "same") - cfg.setdefault("strides", (1, 1)) - super()._set_config(cfg) - - -class Conv2dGenericTestModelGenerator(AbstractConv2dTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - self._config.update( - { - "input_channels": cfg.pop("input_channels", 4), - "output_channels": cfg.pop("output_channels", 4), - } - ) - super()._set_config(cfg) - - @property - def _input_channels(self) -> int: - return asserting_cast(int, self._config["input_channels"]) - - def _op_layer( - self, *, input_shape: Optional[Tuple[int, int, int]] = None - ) -> tf.keras.layers.Conv2D: - kwargs = {"input_shape": input_shape} if input_shape else {} - cfg = self._config - return tf.keras.layers.Conv2D( - filters=cfg["output_channels"], - kernel_size=(cfg["K_h"], cfg["K_w"]), - padding=cfg["padding"], - strides=cfg["strides"], - bias_initializer=parse_init_config(*cfg["bias_init"]), - kernel_initializer=parse_init_config(*cfg["weight_init"]), - **kwargs, - ) - - -class Conv2dWordAlignedTestModelGenerator(Conv2dGenericTestModelGenerator): - def check_config(self) -> None: - super().check_config() - assert ( - self._config["input_channels"] % 4 == 0 - ), "# of input channels must be multiple of 4" - assert ( - self._config["output_channels"] % 4 == 0 - ), "# of output channels must be multiple of 4" - - -class Conv2dProperTestModelGenerator(Conv2dWordAlignedTestModelGenerator): - def check_config(self) -> None: - super().check_config() - if self._config["padding"] == "valid": - assert ( - self._config["K_h"] != self._total_height - or self._config["K_w"] != self._total_width - ), "identical kernel and image size with valid padding is reserved for single pixel testing" diff --git a/test/integration_test/test_single_op_models/test_conv2d/conftest.py b/test/integration_test/test_single_op_models/test_conv2d/conftest.py deleted file mode 100644 index 7a1930070..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/conftest.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_model import BuiltinOpCodes - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def reference_op_code() -> BuiltinOpCodes: - return BuiltinOpCodes.CONV_2D diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_conv2d.py b/test/integration_test/test_single_op_models/test_conv2d/test_conv2d.py deleted file mode 100644 index 98aec25d0..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_conv2d.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import XCOREOpCodes -from tflite2xcore.model_generation import Configuration - -from . import Conv2dProperTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class Conv2dTestModelGenerator(Conv2dProperTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - cfg.setdefault("input_channels", 20) - super()._set_config(cfg) - - def check_config(self) -> None: - super().check_config() - assert ( - self._config["K_w"] * self._config["input_channels"] > 32 - ), "K_w * input_channels <= 32 is reserved for conv2d_shallowin testing" - assert ( - self._config["K_h"] != 1 or self._config["K_w"] != 1 - ), "1x1 kernel is reserved for conv2d_1x1 testing" - - -GENERATOR = Conv2dTestModelGenerator - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_conv2d_deep - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_conv2d.yml b/test/integration_test/test_single_op_models/test_conv2d/test_conv2d.yml deleted file mode 100644 index 41fe5c09c..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_conv2d.yml +++ /dev/null @@ -1,483 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 1 - K_w: 4 - height: 1 - input_channels: 12 - num_threads: 1 - output_channels: 32 - padding: same - strides: - - 1 - - 2 - width: 8 - 1: - K_h: 1 - K_w: 3 - height: 8 - input_channels: 48 - num_threads: 1 - output_channels: 64 - padding: valid - strides: - - 2 - - 2 - width: 14 - 2: - K_h: 2 - K_w: 4 - height: 8 - input_channels: 20 - num_threads: 1 - output_channels: 8 - padding: valid - strides: - - 1 - - 1 - width: 4 - 3: - K_h: 9 - K_w: 9 - height: 5 - input_channels: 16 - num_threads: 2 - output_channels: 4 - padding: same - strides: - - 1 - - 1 - width: 8 - 4: - K_h: 9 - K_w: 9 - height: 15 - input_channels: 32 - num_threads: 1 - output_channels: 4 - padding: same - strides: - - 2 - - 2 - width: 20 - 5: - K_h: 3 - K_w: 4 - height: 15 - input_channels: 16 - num_threads: 5 - output_channels: 64 - padding: valid - strides: - - 2 - - 2 - width: 20 - 6: - K_h: 5 - K_w: 4 - height: 12 - input_channels: 20 - num_threads: 5 - output_channels: 52 - padding: same - strides: - - 1 - - 2 - width: 20 - 7: - K_h: 3 - K_w: 7 - height: 5 - input_channels: 16 - num_threads: 5 - output_channels: 16 - padding: valid - strides: - - 2 - - 2 - width: 7 - 8: - K_h: 2 - K_w: 7 - height: 1 - input_channels: 12 - num_threads: 1 - output_channels: 16 - padding: same - strides: - - 1 - - 1 - width: 20 - 9: - K_h: 3 - K_w: 7 - height: 4 - input_channels: 8 - num_threads: 2 - output_channels: 32 - padding: same - strides: - - 2 - - 1 - width: 20 - 10: - K_h: 5 - K_w: 5 - height: 12 - input_channels: 36 - num_threads: 5 - output_channels: 8 - padding: same - strides: - - 2 - - 1 - width: 20 - 11: - K_h: 7 - K_w: 7 - height: 15 - input_channels: 48 - num_threads: 2 - output_channels: 48 - padding: same - strides: - - 1 - - 2 - width: 20 - 12: - K_h: 3 - K_w: 9 - height: 12 - input_channels: 20 - num_threads: 1 - output_channels: 12 - padding: valid - strides: - - 2 - - 1 - width: 14 - 13: - K_h: 7 - K_w: 3 - height: 12 - input_channels: 32 - num_threads: 2 - output_channels: 48 - padding: same - strides: - - 2 - - 2 - width: 8 - 14: - K_h: 2 - K_w: 5 - height: 8 - input_channels: 12 - num_threads: 5 - output_channels: 64 - padding: same - strides: - - 2 - - 1 - width: 20 - 15: - K_h: 7 - K_w: 9 - height: 8 - input_channels: 32 - num_threads: 2 - output_channels: 32 - padding: same - strides: - - 2 - - 2 - width: 8 - 16: - K_h: 9 - K_w: 4 - height: 8 - input_channels: 48 - num_threads: 2 - output_channels: 12 - padding: same - strides: - - 1 - - 2 - width: 7 - 17: - K_h: 9 - K_w: 5 - height: 8 - input_channels: 12 - num_threads: 5 - output_channels: 16 - padding: same - strides: - - 1 - - 2 - width: 20 - 18: - K_h: 9 - K_w: 1 - height: 12 - input_channels: 36 - num_threads: 1 - output_channels: 4 - padding: valid - strides: - - 1 - - 2 - width: 8 - 19: - K_h: 5 - K_w: 3 - height: 8 - input_channels: 12 - num_threads: 2 - output_channels: 32 - padding: same - strides: - - 2 - - 1 - width: 7 - 20: - K_h: 5 - K_w: 1 - height: 4 - input_channels: 36 - num_threads: 2 - output_channels: 16 - padding: same - strides: - - 1 - - 2 - width: 20 - 21: - K_h: 1 - K_w: 7 - height: 5 - input_channels: 16 - num_threads: 2 - output_channels: 52 - padding: same - strides: - - 1 - - 1 - width: 8 - 22: - K_h: 2 - K_w: 5 - height: 5 - input_channels: 20 - num_threads: 1 - output_channels: 12 - padding: valid - strides: - - 2 - - 1 - width: 14 - 23: - K_h: 9 - K_w: 5 - height: 12 - input_channels: 36 - num_threads: 2 - output_channels: 8 - padding: valid - strides: - - 1 - - 1 - width: 7 - 24: - K_h: 3 - K_w: 9 - height: 12 - input_channels: 8 - num_threads: 2 - output_channels: 48 - padding: same - strides: - - 1 - - 2 - width: 20 - 25: - K_h: 5 - K_w: 7 - height: 8 - input_channels: 8 - num_threads: 2 - output_channels: 28 - padding: valid - strides: - - 1 - - 2 - width: 20 - 26: - K_h: 1 - K_w: 9 - height: 4 - input_channels: 36 - num_threads: 1 - output_channels: 8 - padding: same - strides: - - 2 - - 1 - width: 8 - 27: - K_h: 3 - K_w: 4 - height: 8 - input_channels: 12 - num_threads: 2 - output_channels: 48 - padding: valid - strides: - - 2 - - 2 - width: 14 - 28: - K_h: 1 - K_w: 4 - height: 8 - input_channels: 20 - num_threads: 5 - output_channels: 52 - padding: same - strides: - - 1 - - 2 - width: 20 - 29: - K_h: 7 - K_w: 9 - height: 15 - input_channels: 48 - num_threads: 1 - output_channels: 16 - padding: same - strides: - - 2 - - 2 - width: 4 - 30: - K_h: 5 - K_w: 1 - height: 8 - input_channels: 48 - num_threads: 1 - output_channels: 64 - padding: valid - strides: - - 1 - - 2 - width: 8 - 31: - K_h: 9 - K_w: 5 - height: 5 - input_channels: 48 - num_threads: 5 - output_channels: 4 - padding: same - strides: - - 2 - - 2 - width: 7 - 32: - K_h: 1 - K_w: 7 - height: 15 - input_channels: 36 - num_threads: 2 - output_channels: 16 - padding: valid - strides: - - 1 - - 1 - width: 7 - 33: - K_h: 5 - K_w: 4 - height: 5 - input_channels: 48 - num_threads: 2 - output_channels: 64 - padding: valid - strides: - - 1 - - 2 - width: 14 - 34: - K_h: 1 - K_w: 3 - height: 1 - input_channels: 32 - num_threads: 1 - output_channels: 48 - padding: same - strides: - - 2 - - 2 - width: 7 - 35: - K_h: 3 - K_w: 1 - height: 15 - input_channels: 48 - num_threads: 1 - output_channels: 12 - padding: same - strides: - - 2 - - 2 - width: 14 - 36: - K_h: 1 - K_w: 7 - height: 12 - input_channels: 32 - num_threads: 1 - output_channels: 48 - padding: same - strides: - - 2 - - 2 - width: 4 - 37: - K_h: 7 - K_w: 3 - height: 5 - input_channels: 12 - num_threads: 1 - output_channels: 32 - padding: same - strides: - - 2 - - 2 - width: 7 - 38: - K_h: 1 - K_w: 3 - height: 5 - input_channels: 48 - num_threads: 1 - output_channels: 8 - padding: valid - strides: - - 1 - - 1 - width: 4 - 39: - K_h: 5 - K_w: 5 - height: 15 - input_channels: 36 - num_threads: 1 - output_channels: 12 - padding: same - strides: - - 1 - - 1 - width: 20 diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_conv2d_1x1.py b/test/integration_test/test_single_op_models/test_conv2d/test_conv2d_1x1.py deleted file mode 100644 index 802e342bb..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_conv2d_1x1.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import XCOREOpCodes -from tflite2xcore.model_generation import Configuration - -from . import Conv2dProperTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class Conv2d1x1TestModelGenerator(Conv2dProperTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - cfg.setdefault("K_h", 1) - cfg.setdefault("K_w", 1) - cfg.setdefault("strides", (1, 1)) - super()._set_config(cfg) - - def check_config(self) -> None: - super().check_config() - assert self._config["K_h"] == 1, "Kernel height must be 1" - assert self._config["K_w"] == 1, "Kernel width must be 1" - assert self._config["strides"] == (1, 1), "strides must be (1, 1)" - - -GENERATOR = Conv2d1x1TestModelGenerator - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_conv2d_1x1 - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_conv2d_1x1.yml b/test/integration_test/test_single_op_models/test_conv2d/test_conv2d_1x1.yml deleted file mode 100644 index 5bbc817a5..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_conv2d_1x1.yml +++ /dev/null @@ -1,243 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - height: 4 - input_channels: 16 - num_threads: 1 - output_channels: 12 - width: 7 - 1: - height: 15 - input_channels: 8 - num_threads: 2 - output_channels: 52 - width: 7 - 2: - height: 8 - input_channels: 36 - num_threads: 1 - output_channels: 52 - width: 7 - 3: - height: 8 - input_channels: 8 - num_threads: 1 - output_channels: 16 - width: 4 - 4: - height: 5 - input_channels: 48 - num_threads: 1 - output_channels: 48 - width: 14 - 5: - height: 5 - input_channels: 8 - num_threads: 5 - output_channels: 28 - width: 20 - 6: - height: 8 - input_channels: 32 - num_threads: 2 - output_channels: 64 - width: 20 - 7: - height: 12 - input_channels: 36 - num_threads: 2 - output_channels: 52 - width: 8 - 8: - height: 5 - input_channels: 36 - num_threads: 1 - output_channels: 4 - width: 8 - 9: - height: 15 - input_channels: 4 - num_threads: 1 - output_channels: 12 - width: 7 - 10: - height: 12 - input_channels: 8 - num_threads: 2 - output_channels: 28 - width: 14 - 11: - height: 8 - input_channels: 32 - num_threads: 5 - output_channels: 16 - width: 20 - 12: - height: 5 - input_channels: 48 - num_threads: 2 - output_channels: 4 - width: 4 - 13: - height: 15 - input_channels: 36 - num_threads: 5 - output_channels: 32 - width: 8 - 14: - height: 12 - input_channels: 48 - num_threads: 2 - output_channels: 16 - width: 7 - 15: - height: 15 - input_channels: 20 - num_threads: 2 - output_channels: 64 - width: 8 - 16: - height: 12 - input_channels: 36 - num_threads: 5 - output_channels: 28 - width: 8 - 17: - height: 15 - input_channels: 20 - num_threads: 2 - output_channels: 8 - width: 14 - 18: - height: 15 - input_channels: 32 - num_threads: 2 - output_channels: 64 - width: 14 - 19: - height: 12 - input_channels: 48 - num_threads: 5 - output_channels: 52 - width: 20 - 20: - height: 15 - input_channels: 20 - num_threads: 1 - output_channels: 48 - width: 20 - 21: - height: 4 - input_channels: 16 - num_threads: 2 - output_channels: 8 - width: 8 - 22: - height: 5 - input_channels: 12 - num_threads: 1 - output_channels: 52 - width: 1 - 23: - height: 15 - input_channels: 4 - num_threads: 5 - output_channels: 48 - width: 7 - 24: - height: 5 - input_channels: 36 - num_threads: 2 - output_channels: 28 - width: 7 - 25: - height: 5 - input_channels: 48 - num_threads: 1 - output_channels: 4 - width: 1 - 26: - height: 1 - input_channels: 12 - num_threads: 1 - output_channels: 48 - width: 20 - 27: - height: 12 - input_channels: 48 - num_threads: 1 - output_channels: 32 - width: 8 - 28: - height: 8 - input_channels: 12 - num_threads: 5 - output_channels: 32 - width: 8 - 29: - height: 8 - input_channels: 12 - num_threads: 1 - output_channels: 64 - width: 1 - 30: - height: 8 - input_channels: 20 - num_threads: 2 - output_channels: 64 - width: 4 - 31: - height: 4 - input_channels: 12 - num_threads: 2 - output_channels: 32 - width: 8 - 32: - height: 15 - input_channels: 32 - num_threads: 5 - output_channels: 8 - width: 14 - 33: - height: 5 - input_channels: 4 - num_threads: 5 - output_channels: 16 - width: 20 - 34: - height: 4 - input_channels: 20 - num_threads: 1 - output_channels: 4 - width: 1 - 35: - height: 5 - input_channels: 20 - num_threads: 1 - output_channels: 48 - width: 20 - 36: - height: 1 - input_channels: 16 - num_threads: 1 - output_channels: 28 - width: 4 - 37: - height: 12 - input_channels: 12 - num_threads: 1 - output_channels: 4 - width: 4 - 38: - height: 4 - input_channels: 16 - num_threads: 1 - output_channels: 12 - width: 4 - 39: - height: 1 - input_channels: 4 - num_threads: 1 - output_channels: 12 - width: 14 diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_conv2d_shallowin.py b/test/integration_test/test_single_op_models/test_conv2d/test_conv2d_shallowin.py deleted file mode 100644 index 74cd72e33..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_conv2d_shallowin.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import XCOREOpCodes -from tflite2xcore.model_generation import Configuration - -from . import Conv2dProperTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class Conv2dShallowinTestModelGenerator(Conv2dProperTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - cfg.setdefault("input_channels", 4) - super()._set_config(cfg) - - def check_config(self) -> None: - super().check_config() - assert ( - self._config["K_w"] * self._config["input_channels"] <= 32 - ), "K_w * input_channels > 32 is reserved for general conv2d testing" - assert ( - self._config["K_h"] != 1 or self._config["K_w"] != 1 - ), "1x1 kernel is reserved for conv2d_1x1 testing" - - -GENERATOR = Conv2dShallowinTestModelGenerator - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_conv2d_shallowin - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_conv2d_shallowin.yml b/test/integration_test/test_single_op_models/test_conv2d/test_conv2d_shallowin.yml deleted file mode 100644 index d5e70ba65..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_conv2d_shallowin.yml +++ /dev/null @@ -1,483 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 7 - K_w: 2 - height: 15 - input_channels: 4 - num_threads: 1 - output_channels: 64 - padding: same - strides: - - 1 - - 2 - width: 7 - 1: - K_h: 1 - K_w: 4 - height: 5 - input_channels: 8 - num_threads: 2 - output_channels: 28 - padding: valid - strides: - - 1 - - 2 - width: 14 - 2: - K_h: 3 - K_w: 4 - height: 15 - input_channels: 4 - num_threads: 1 - output_channels: 64 - padding: same - strides: - - 2 - - 1 - width: 20 - 3: - K_h: 2 - K_w: 4 - height: 8 - input_channels: 8 - num_threads: 2 - output_channels: 52 - padding: same - strides: - - 2 - - 1 - width: 8 - 4: - K_h: 7 - K_w: 1 - height: 8 - input_channels: 16 - num_threads: 1 - output_channels: 64 - padding: valid - strides: - - 1 - - 1 - width: 20 - 5: - K_h: 2 - K_w: 2 - height: 8 - input_channels: 8 - num_threads: 2 - output_channels: 8 - padding: same - strides: - - 1 - - 1 - width: 8 - 6: - K_h: 7 - K_w: 1 - height: 12 - input_channels: 16 - num_threads: 5 - output_channels: 28 - padding: valid - strides: - - 1 - - 2 - width: 14 - 7: - K_h: 2 - K_w: 3 - height: 1 - input_channels: 4 - num_threads: 1 - output_channels: 28 - padding: same - strides: - - 2 - - 2 - width: 8 - 8: - K_h: 7 - K_w: 1 - height: 1 - input_channels: 8 - num_threads: 1 - output_channels: 16 - padding: same - strides: - - 1 - - 1 - width: 1 - 9: - K_h: 5 - K_w: 8 - height: 12 - input_channels: 4 - num_threads: 5 - output_channels: 64 - padding: same - strides: - - 2 - - 1 - width: 8 - 10: - K_h: 2 - K_w: 3 - height: 4 - input_channels: 8 - num_threads: 2 - output_channels: 52 - padding: same - strides: - - 2 - - 1 - width: 7 - 11: - K_h: 9 - K_w: 1 - height: 4 - input_channels: 8 - num_threads: 2 - output_channels: 8 - padding: same - strides: - - 1 - - 1 - width: 20 - 12: - K_h: 5 - K_w: 4 - height: 15 - input_channels: 8 - num_threads: 2 - output_channels: 4 - padding: same - strides: - - 2 - - 2 - width: 8 - 13: - K_h: 2 - K_w: 1 - height: 15 - input_channels: 32 - num_threads: 1 - output_channels: 28 - padding: same - strides: - - 1 - - 1 - width: 1 - 14: - K_h: 2 - K_w: 3 - height: 5 - input_channels: 4 - num_threads: 5 - output_channels: 16 - padding: same - strides: - - 2 - - 2 - width: 20 - 15: - K_h: 3 - K_w: 1 - height: 5 - input_channels: 8 - num_threads: 2 - output_channels: 16 - padding: valid - strides: - - 1 - - 1 - width: 20 - 16: - K_h: 3 - K_w: 1 - height: 8 - input_channels: 32 - num_threads: 5 - output_channels: 12 - padding: valid - strides: - - 2 - - 1 - width: 8 - 17: - K_h: 5 - K_w: 3 - height: 5 - input_channels: 4 - num_threads: 2 - output_channels: 12 - padding: same - strides: - - 1 - - 2 - width: 8 - 18: - K_h: 2 - K_w: 8 - height: 1 - input_channels: 4 - num_threads: 1 - output_channels: 12 - padding: same - strides: - - 2 - - 2 - width: 7 - 19: - K_h: 5 - K_w: 4 - height: 15 - input_channels: 4 - num_threads: 2 - output_channels: 4 - padding: valid - strides: - - 1 - - 1 - width: 7 - 20: - K_h: 3 - K_w: 5 - height: 8 - input_channels: 4 - num_threads: 1 - output_channels: 52 - padding: same - strides: - - 2 - - 2 - width: 4 - 21: - K_h: 3 - K_w: 3 - height: 8 - input_channels: 8 - num_threads: 2 - output_channels: 16 - padding: same - strides: - - 1 - - 2 - width: 4 - 22: - K_h: 2 - K_w: 4 - height: 8 - input_channels: 4 - num_threads: 2 - output_channels: 8 - padding: valid - strides: - - 1 - - 2 - width: 14 - 23: - K_h: 5 - K_w: 2 - height: 15 - input_channels: 16 - num_threads: 5 - output_channels: 16 - padding: same - strides: - - 2 - - 1 - width: 7 - 24: - K_h: 2 - K_w: 2 - height: 15 - input_channels: 8 - num_threads: 1 - output_channels: 64 - padding: same - strides: - - 2 - - 2 - width: 20 - 25: - K_h: 3 - K_w: 8 - height: 8 - input_channels: 4 - num_threads: 2 - output_channels: 12 - padding: valid - strides: - - 2 - - 1 - width: 20 - 26: - K_h: 7 - K_w: 2 - height: 4 - input_channels: 16 - num_threads: 2 - output_channels: 4 - padding: same - strides: - - 2 - - 1 - width: 7 - 27: - K_h: 1 - K_w: 2 - height: 15 - input_channels: 16 - num_threads: 5 - output_channels: 28 - padding: same - strides: - - 2 - - 1 - width: 20 - 28: - K_h: 3 - K_w: 5 - height: 12 - input_channels: 4 - num_threads: 1 - output_channels: 48 - padding: same - strides: - - 1 - - 1 - width: 8 - 29: - K_h: 5 - K_w: 2 - height: 8 - input_channels: 16 - num_threads: 2 - output_channels: 48 - padding: same - strides: - - 2 - - 1 - width: 20 - 30: - K_h: 7 - K_w: 5 - height: 1 - input_channels: 4 - num_threads: 1 - output_channels: 16 - padding: same - strides: - - 1 - - 2 - width: 4 - 31: - K_h: 9 - K_w: 3 - height: 5 - input_channels: 4 - num_threads: 2 - output_channels: 4 - padding: same - strides: - - 2 - - 2 - width: 14 - 32: - K_h: 3 - K_w: 4 - height: 4 - input_channels: 4 - num_threads: 2 - output_channels: 32 - padding: same - strides: - - 1 - - 1 - width: 4 - 33: - K_h: 9 - K_w: 2 - height: 15 - input_channels: 4 - num_threads: 1 - output_channels: 16 - padding: same - strides: - - 1 - - 1 - width: 1 - 34: - K_h: 2 - K_w: 1 - height: 8 - input_channels: 16 - num_threads: 1 - output_channels: 28 - padding: same - strides: - - 1 - - 1 - width: 4 - 35: - K_h: 5 - K_w: 1 - height: 8 - input_channels: 32 - num_threads: 1 - output_channels: 12 - padding: valid - strides: - - 2 - - 2 - width: 8 - 36: - K_h: 3 - K_w: 2 - height: 1 - input_channels: 4 - num_threads: 1 - output_channels: 8 - padding: same - strides: - - 2 - - 2 - width: 1 - 37: - K_h: 1 - K_w: 2 - height: 5 - input_channels: 8 - num_threads: 5 - output_channels: 12 - padding: valid - strides: - - 1 - - 2 - width: 14 - 38: - K_h: 2 - K_w: 1 - height: 12 - input_channels: 8 - num_threads: 5 - output_channels: 8 - padding: same - strides: - - 2 - - 1 - width: 8 - 39: - K_h: 7 - K_w: 8 - height: 8 - input_channels: 4 - num_threads: 5 - output_channels: 28 - padding: same - strides: - - 2 - - 1 - width: 8 diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_depthwise_conv2d.py b/test/integration_test/test_single_op_models/test_conv2d/test_depthwise_conv2d.py deleted file mode 100644 index 5d167cd11..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_depthwise_conv2d.py +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf -from typing import Tuple, Optional - -from tflite2xcore.xcore_schema import XCOREOpCodes, BuiltinOpCodes -from tflite2xcore.model_generation.utils import parse_init_config - -from . import ( - AbstractConv2dTestModelGenerator, - ChannelPreservingOpTestModelGenerator, -) -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class DepthwiseConv2dTestModelGenerator( - ChannelPreservingOpTestModelGenerator, AbstractConv2dTestModelGenerator -): - def _op_layer( - self, *, input_shape: Optional[Tuple[int, int, int]] = None - ) -> tf.keras.layers.DepthwiseConv2D: - kwargs = {"input_shape": input_shape} if input_shape else {} - cfg = self._config - return tf.keras.layers.DepthwiseConv2D( - kernel_size=(cfg["K_h"], cfg["K_w"]), - depth_multiplier=1, - padding=cfg["padding"], - strides=cfg["strides"], - bias_initializer=parse_init_config(*cfg["bias_init"]), - kernel_initializer=parse_init_config(*cfg["weight_init"]), - **kwargs - ) - - -GENERATOR = DepthwiseConv2dTestModelGenerator - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_conv2d_depthwise - - -@pytest.fixture -def reference_op_code() -> BuiltinOpCodes: - return BuiltinOpCodes.DEPTHWISE_CONV_2D - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_depthwise_conv2d.yml b/test/integration_test/test_single_op_models/test_conv2d/test_depthwise_conv2d.yml deleted file mode 100644 index 60f650e19..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_depthwise_conv2d.yml +++ /dev/null @@ -1,443 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 3 - K_w: 5 - channels: 4 - height: 15 - num_threads: 5 - padding: same - strides: - - 1 - - 2 - width: 7 - 1: - K_h: 9 - K_w: 2 - channels: 16 - height: 5 - num_threads: 5 - padding: same - strides: - - 2 - - 1 - width: 8 - 2: - K_h: 2 - K_w: 1 - channels: 48 - height: 8 - num_threads: 2 - padding: same - strides: - - 2 - - 1 - width: 7 - 3: - K_h: 1 - K_w: 2 - channels: 28 - height: 12 - num_threads: 5 - padding: same - strides: - - 2 - - 1 - width: 7 - 4: - K_h: 1 - K_w: 2 - channels: 4 - height: 8 - num_threads: 2 - padding: same - strides: - - 2 - - 1 - width: 14 - 5: - K_h: 9 - K_w: 2 - channels: 16 - height: 15 - num_threads: 1 - padding: valid - strides: - - 2 - - 2 - width: 14 - 6: - K_h: 5 - K_w: 5 - channels: 16 - height: 5 - num_threads: 1 - padding: same - strides: - - 2 - - 1 - width: 14 - 7: - K_h: 5 - K_w: 1 - channels: 8 - height: 4 - num_threads: 1 - padding: same - strides: - - 2 - - 1 - width: 20 - 8: - K_h: 5 - K_w: 8 - channels: 28 - height: 4 - num_threads: 1 - padding: same - strides: - - 1 - - 2 - width: 8 - 9: - K_h: 5 - K_w: 1 - channels: 4 - height: 5 - num_threads: 5 - padding: same - strides: - - 1 - - 1 - width: 20 - 10: - K_h: 2 - K_w: 3 - channels: 16 - height: 15 - num_threads: 2 - padding: same - strides: - - 2 - - 1 - width: 4 - 11: - K_h: 5 - K_w: 4 - channels: 28 - height: 8 - num_threads: 2 - padding: same - strides: - - 1 - - 2 - width: 7 - 12: - K_h: 7 - K_w: 3 - channels: 8 - height: 15 - num_threads: 1 - padding: valid - strides: - - 1 - - 1 - width: 8 - 13: - K_h: 3 - K_w: 4 - channels: 48 - height: 5 - num_threads: 2 - padding: same - strides: - - 1 - - 1 - width: 8 - 14: - K_h: 7 - K_w: 3 - channels: 4 - height: 8 - num_threads: 5 - padding: valid - strides: - - 2 - - 2 - width: 8 - 15: - K_h: 9 - K_w: 7 - channels: 32 - height: 5 - num_threads: 2 - padding: same - strides: - - 1 - - 1 - width: 7 - 16: - K_h: 1 - K_w: 8 - channels: 16 - height: 5 - num_threads: 2 - padding: same - strides: - - 1 - - 1 - width: 7 - 17: - K_h: 9 - K_w: 4 - channels: 32 - height: 15 - num_threads: 5 - padding: valid - strides: - - 1 - - 2 - width: 14 - 18: - K_h: 1 - K_w: 7 - channels: 52 - height: 5 - num_threads: 1 - padding: same - strides: - - 2 - - 2 - width: 4 - 19: - K_h: 7 - K_w: 4 - channels: 64 - height: 12 - num_threads: 5 - padding: valid - strides: - - 1 - - 1 - width: 20 - 20: - K_h: 7 - K_w: 8 - channels: 64 - height: 4 - num_threads: 1 - padding: same - strides: - - 2 - - 2 - width: 20 - 21: - K_h: 3 - K_w: 4 - channels: 64 - height: 5 - num_threads: 2 - padding: valid - strides: - - 2 - - 1 - width: 4 - 22: - K_h: 9 - K_w: 3 - channels: 12 - height: 8 - num_threads: 1 - padding: same - strides: - - 1 - - 2 - width: 4 - 23: - K_h: 1 - K_w: 7 - channels: 28 - height: 4 - num_threads: 2 - padding: same - strides: - - 2 - - 1 - width: 8 - 24: - K_h: 3 - K_w: 5 - channels: 48 - height: 4 - num_threads: 2 - padding: valid - strides: - - 2 - - 2 - width: 14 - 25: - K_h: 9 - K_w: 7 - channels: 16 - height: 12 - num_threads: 1 - padding: valid - strides: - - 2 - - 2 - width: 20 - 26: - K_h: 5 - K_w: 4 - channels: 4 - height: 12 - num_threads: 1 - padding: valid - strides: - - 2 - - 2 - width: 7 - 27: - K_h: 2 - K_w: 1 - channels: 52 - height: 15 - num_threads: 2 - padding: valid - strides: - - 1 - - 1 - width: 4 - 28: - K_h: 1 - K_w: 3 - channels: 64 - height: 12 - num_threads: 2 - padding: valid - strides: - - 1 - - 2 - width: 8 - 29: - K_h: 7 - K_w: 1 - channels: 64 - height: 5 - num_threads: 1 - padding: same - strides: - - 1 - - 2 - width: 8 - 30: - K_h: 2 - K_w: 3 - channels: 4 - height: 5 - num_threads: 2 - padding: same - strides: - - 2 - - 2 - width: 14 - 31: - K_h: 1 - K_w: 2 - channels: 52 - height: 15 - num_threads: 2 - padding: valid - strides: - - 2 - - 2 - width: 4 - 32: - K_h: 5 - K_w: 7 - channels: 32 - height: 15 - num_threads: 2 - padding: valid - strides: - - 2 - - 2 - width: 14 - 33: - K_h: 7 - K_w: 4 - channels: 12 - height: 5 - num_threads: 1 - padding: same - strides: - - 1 - - 2 - width: 7 - 34: - K_h: 2 - K_w: 4 - channels: 48 - height: 4 - num_threads: 1 - padding: same - strides: - - 1 - - 2 - width: 14 - 35: - K_h: 3 - K_w: 5 - channels: 8 - height: 12 - num_threads: 5 - padding: same - strides: - - 1 - - 2 - width: 8 - 36: - K_h: 9 - K_w: 5 - channels: 16 - height: 15 - num_threads: 1 - padding: same - strides: - - 2 - - 1 - width: 14 - 37: - K_h: 2 - K_w: 2 - channels: 8 - height: 8 - num_threads: 1 - padding: same - strides: - - 2 - - 1 - width: 7 - 38: - K_h: 3 - K_w: 3 - channels: 8 - height: 15 - num_threads: 1 - padding: valid - strides: - - 2 - - 2 - width: 14 - 39: - K_h: 1 - K_w: 1 - channels: 48 - height: 1 - num_threads: 1 - padding: valid - strides: - - 2 - - 1 - width: 1 diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/__init__.py b/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/__init__.py deleted file mode 100644 index 0be747586..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/__init__.py +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf - -from tflite2xcore.utils import asserting_cast -from tflite2xcore.xcore_schema import XCOREModel, ValidOpCodes, BuiltinOpCodes -from tflite2xcore.model_generation import Configuration - -from .. import ( - PaddingMixin, - AbstractConv2dTestModelGenerator, - test_output, - test_converted_single_op_model, - test_idempotence, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class ExplicitlyPaddedConv2dMixin(PaddingMixin, AbstractConv2dTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - assert ( - "padding" not in cfg - ), f"padding config should be defined by {self._PAD_KEYS}" - cfg["padding"] = "valid" - - super()._set_config(cfg) - - @property - def _total_width(self) -> int: - return ( - super()._total_width - + asserting_cast(int, self._config["pad_l"]) - + asserting_cast(int, self._config["pad_r"]) - ) - - @property - def _total_height(self) -> int: - return ( - super()._total_height - + asserting_cast(int, self._config["pad_t"]) - + asserting_cast(int, self._config["pad_b"]) - ) - - def _build_core_model(self) -> tf.keras.Model: - - return tf.keras.Sequential( - layers=[self._pad_layer(input_shape=self._input_shape), self._op_layer()] - ) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -@pytest.mark.skip_on_device -def test_reference_model_regression( - reference_model: XCOREModel, reference_op_code: ValidOpCodes -) -> None: - operators = reference_model.subgraphs[0].operators - assert len(operators) == 2 - assert operators[0].operator_code.code is BuiltinOpCodes.PAD - - op_code = operators[1].operator_code.code - assert ( - op_code is reference_op_code - ), f"expected: {reference_op_code}, got: {op_code}" diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_conv2d.py b/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_conv2d.py deleted file mode 100644 index 21a0c8575..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_conv2d.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from ..test_conv2d import Conv2dTestModelGenerator -from ..test_conv2d import converted_op_code # pylint: disable=unused-import -from . import ExplicitlyPaddedConv2dMixin -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_idempotence, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class PaddedConv2dTestModelGenerator( - ExplicitlyPaddedConv2dMixin, Conv2dTestModelGenerator -): - pass - - -GENERATOR = PaddedConv2dTestModelGenerator - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_conv2d.yml b/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_conv2d.yml deleted file mode 100644 index 4d7105d0e..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_conv2d.yml +++ /dev/null @@ -1,303 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 9 - K_w: 7 - height: 8 - input_channels: 32 - num_threads: 1 - output_channels: 28 - pad_b: 2 - pad_l: 1 - pad_r: 0 - pad_t: 0 - strides: - - 2 - - 2 - width: 7 - 1: - K_h: 2 - K_w: 5 - height: 8 - input_channels: 16 - num_threads: 5 - output_channels: 16 - pad_b: 1 - pad_l: 0 - pad_r: 1 - pad_t: 1 - strides: - - 2 - - 1 - width: 14 - 2: - K_h: 9 - K_w: 7 - height: 12 - input_channels: 16 - num_threads: 2 - output_channels: 28 - pad_b: 2 - pad_l: 0 - pad_r: 0 - pad_t: 1 - strides: - - 1 - - 2 - width: 20 - 3: - K_h: 5 - K_w: 7 - height: 5 - input_channels: 16 - num_threads: 1 - output_channels: 48 - pad_b: 1 - pad_l: 0 - pad_r: 2 - pad_t: 0 - strides: - - 1 - - 2 - width: 7 - 4: - K_h: 3 - K_w: 5 - height: 8 - input_channels: 16 - num_threads: 1 - output_channels: 64 - pad_b: 2 - pad_l: 2 - pad_r: 1 - pad_t: 2 - strides: - - 1 - - 2 - width: 20 - 5: - K_h: 9 - K_w: 5 - height: 15 - input_channels: 36 - num_threads: 5 - output_channels: 12 - pad_b: 2 - pad_l: 1 - pad_r: 1 - pad_t: 2 - strides: - - 1 - - 1 - width: 20 - 6: - K_h: 7 - K_w: 5 - height: 12 - input_channels: 8 - num_threads: 1 - output_channels: 16 - pad_b: 1 - pad_l: 1 - pad_r: 2 - pad_t: 2 - strides: - - 2 - - 2 - width: 8 - 7: - K_h: 7 - K_w: 5 - height: 15 - input_channels: 48 - num_threads: 5 - output_channels: 4 - pad_b: 0 - pad_l: 2 - pad_r: 2 - pad_t: 1 - strides: - - 1 - - 2 - width: 7 - 8: - K_h: 9 - K_w: 9 - height: 5 - input_channels: 8 - num_threads: 5 - output_channels: 12 - pad_b: 2 - pad_l: 0 - pad_r: 2 - pad_t: 2 - strides: - - 1 - - 2 - width: 8 - 9: - K_h: 3 - K_w: 7 - height: 5 - input_channels: 36 - num_threads: 2 - output_channels: 4 - pad_b: 1 - pad_l: 2 - pad_r: 2 - pad_t: 1 - strides: - - 1 - - 2 - width: 4 - 10: - K_h: 9 - K_w: 4 - height: 12 - input_channels: 32 - num_threads: 2 - output_channels: 32 - pad_b: 0 - pad_l: 1 - pad_r: 0 - pad_t: 2 - strides: - - 2 - - 1 - width: 20 - 11: - K_h: 7 - K_w: 9 - height: 12 - input_channels: 16 - num_threads: 2 - output_channels: 52 - pad_b: 1 - pad_l: 2 - pad_r: 2 - pad_t: 2 - strides: - - 2 - - 2 - width: 20 - 12: - K_h: 5 - K_w: 4 - height: 15 - input_channels: 48 - num_threads: 1 - output_channels: 52 - pad_b: 0 - pad_l: 1 - pad_r: 2 - pad_t: 0 - strides: - - 1 - - 2 - width: 1 - 13: - K_h: 9 - K_w: 9 - height: 12 - input_channels: 12 - num_threads: 2 - output_channels: 48 - pad_b: 2 - pad_l: 1 - pad_r: 0 - pad_t: 0 - strides: - - 1 - - 1 - width: 14 - 14: - K_h: 5 - K_w: 4 - height: 15 - input_channels: 20 - num_threads: 5 - output_channels: 28 - pad_b: 1 - pad_l: 1 - pad_r: 2 - pad_t: 2 - strides: - - 2 - - 2 - width: 14 - 15: - K_h: 3 - K_w: 4 - height: 15 - input_channels: 16 - num_threads: 5 - output_channels: 48 - pad_b: 2 - pad_l: 0 - pad_r: 0 - pad_t: 2 - strides: - - 2 - - 2 - width: 14 - 16: - K_h: 5 - K_w: 3 - height: 8 - input_channels: 16 - num_threads: 1 - output_channels: 48 - pad_b: 1 - pad_l: 1 - pad_r: 1 - pad_t: 2 - strides: - - 1 - - 1 - width: 20 - 17: - K_h: 7 - K_w: 3 - height: 8 - input_channels: 36 - num_threads: 1 - output_channels: 64 - pad_b: 0 - pad_l: 1 - pad_r: 1 - pad_t: 1 - strides: - - 1 - - 1 - width: 8 - 18: - K_h: 1 - K_w: 3 - height: 5 - input_channels: 16 - num_threads: 1 - output_channels: 32 - pad_b: 0 - pad_l: 0 - pad_r: 1 - pad_t: 0 - strides: - - 1 - - 1 - width: 20 - 19: - K_h: 3 - K_w: 7 - height: 5 - input_channels: 20 - num_threads: 1 - output_channels: 8 - pad_b: 1 - pad_l: 0 - pad_r: 1 - pad_t: 2 - strides: - - 1 - - 2 - width: 8 diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_conv2d_shallowin.py b/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_conv2d_shallowin.py deleted file mode 100644 index bdc695e6f..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_conv2d_shallowin.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from ..test_conv2d_shallowin import Conv2dShallowinTestModelGenerator -from . import ExplicitlyPaddedConv2dMixin -from ..test_conv2d_shallowin import converted_op_code # pylint: disable=unused-import -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_idempotence, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class PaddedConv2dShallowinTestModelGenerator( - ExplicitlyPaddedConv2dMixin, Conv2dShallowinTestModelGenerator -): - pass - - -GENERATOR = PaddedConv2dShallowinTestModelGenerator - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_conv2d_shallowin.yml b/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_conv2d_shallowin.yml deleted file mode 100644 index 973491da9..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_conv2d_shallowin.yml +++ /dev/null @@ -1,303 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 9 - K_w: 4 - height: 12 - input_channels: 8 - num_threads: 1 - output_channels: 12 - pad_b: 0 - pad_l: 2 - pad_r: 1 - pad_t: 1 - strides: - - 2 - - 1 - width: 14 - 1: - K_h: 5 - K_w: 5 - height: 15 - input_channels: 4 - num_threads: 1 - output_channels: 52 - pad_b: 1 - pad_l: 0 - pad_r: 1 - pad_t: 2 - strides: - - 1 - - 2 - width: 7 - 2: - K_h: 5 - K_w: 3 - height: 8 - input_channels: 4 - num_threads: 5 - output_channels: 8 - pad_b: 1 - pad_l: 2 - pad_r: 2 - pad_t: 2 - strides: - - 2 - - 2 - width: 7 - 3: - K_h: 2 - K_w: 4 - height: 4 - input_channels: 4 - num_threads: 1 - output_channels: 52 - pad_b: 0 - pad_l: 2 - pad_r: 2 - pad_t: 1 - strides: - - 2 - - 1 - width: 1 - 4: - K_h: 3 - K_w: 4 - height: 4 - input_channels: 8 - num_threads: 1 - output_channels: 32 - pad_b: 2 - pad_l: 2 - pad_r: 1 - pad_t: 1 - strides: - - 2 - - 1 - width: 14 - 5: - K_h: 9 - K_w: 3 - height: 12 - input_channels: 4 - num_threads: 5 - output_channels: 8 - pad_b: 1 - pad_l: 2 - pad_r: 2 - pad_t: 1 - strides: - - 1 - - 2 - width: 7 - 6: - K_h: 7 - K_w: 4 - height: 5 - input_channels: 8 - num_threads: 5 - output_channels: 16 - pad_b: 2 - pad_l: 0 - pad_r: 0 - pad_t: 0 - strides: - - 2 - - 2 - width: 7 - 7: - K_h: 3 - K_w: 7 - height: 5 - input_channels: 4 - num_threads: 5 - output_channels: 28 - pad_b: 2 - pad_l: 2 - pad_r: 0 - pad_t: 1 - strides: - - 2 - - 2 - width: 8 - 8: - K_h: 5 - K_w: 2 - height: 5 - input_channels: 4 - num_threads: 2 - output_channels: 16 - pad_b: 2 - pad_l: 0 - pad_r: 1 - pad_t: 2 - strides: - - 1 - - 2 - width: 7 - 9: - K_h: 7 - K_w: 2 - height: 8 - input_channels: 16 - num_threads: 2 - output_channels: 48 - pad_b: 2 - pad_l: 0 - pad_r: 0 - pad_t: 1 - strides: - - 2 - - 2 - width: 20 - 10: - K_h: 3 - K_w: 4 - height: 15 - input_channels: 8 - num_threads: 2 - output_channels: 12 - pad_b: 1 - pad_l: 0 - pad_r: 1 - pad_t: 2 - strides: - - 2 - - 2 - width: 14 - 11: - K_h: 7 - K_w: 4 - height: 15 - input_channels: 4 - num_threads: 2 - output_channels: 64 - pad_b: 0 - pad_l: 2 - pad_r: 2 - pad_t: 0 - strides: - - 1 - - 2 - width: 4 - 12: - K_h: 7 - K_w: 3 - height: 8 - input_channels: 4 - num_threads: 1 - output_channels: 16 - pad_b: 2 - pad_l: 0 - pad_r: 2 - pad_t: 2 - strides: - - 2 - - 1 - width: 1 - 13: - K_h: 3 - K_w: 4 - height: 5 - input_channels: 8 - num_threads: 2 - output_channels: 12 - pad_b: 1 - pad_l: 1 - pad_r: 0 - pad_t: 0 - strides: - - 2 - - 1 - width: 20 - 14: - K_h: 1 - K_w: 8 - height: 8 - input_channels: 4 - num_threads: 1 - output_channels: 64 - pad_b: 0 - pad_l: 1 - pad_r: 1 - pad_t: 0 - strides: - - 2 - - 1 - width: 8 - 15: - K_h: 5 - K_w: 8 - height: 15 - input_channels: 4 - num_threads: 5 - output_channels: 48 - pad_b: 0 - pad_l: 2 - pad_r: 0 - pad_t: 0 - strides: - - 2 - - 2 - width: 14 - 16: - K_h: 3 - K_w: 5 - height: 8 - input_channels: 4 - num_threads: 1 - output_channels: 16 - pad_b: 0 - pad_l: 0 - pad_r: 2 - pad_t: 0 - strides: - - 2 - - 1 - width: 8 - 17: - K_h: 3 - K_w: 3 - height: 15 - input_channels: 4 - num_threads: 1 - output_channels: 52 - pad_b: 2 - pad_l: 0 - pad_r: 2 - pad_t: 0 - strides: - - 2 - - 1 - width: 8 - 18: - K_h: 7 - K_w: 4 - height: 12 - input_channels: 4 - num_threads: 2 - output_channels: 4 - pad_b: 1 - pad_l: 1 - pad_r: 1 - pad_t: 1 - strides: - - 2 - - 1 - width: 8 - 19: - K_h: 5 - K_w: 2 - height: 8 - input_channels: 4 - num_threads: 2 - output_channels: 52 - pad_b: 2 - pad_l: 0 - pad_r: 0 - pad_t: 1 - strides: - - 2 - - 2 - width: 8 diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_depthwise_conv2d.py b/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_depthwise_conv2d.py deleted file mode 100644 index 34362efa4..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_depthwise_conv2d.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from ..test_depthwise_conv2d import DepthwiseConv2dTestModelGenerator -from . import ExplicitlyPaddedConv2dMixin -from ..test_depthwise_conv2d import ( # pylint: disable=unused-import - reference_op_code, - converted_op_code, -) -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_idempotence, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class PaddedDepthwiseConv2dTestModelGenerator( - ExplicitlyPaddedConv2dMixin, DepthwiseConv2dTestModelGenerator -): - pass - - -GENERATOR = PaddedDepthwiseConv2dTestModelGenerator - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_depthwise_conv2d.yml b/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_depthwise_conv2d.yml deleted file mode 100644 index 8ea18d925..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_explicit_padding/test_padded_depthwise_conv2d.yml +++ /dev/null @@ -1,283 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 7 - K_w: 4 - channels: 12 - height: 8 - num_threads: 1 - pad_b: 1 - pad_l: 1 - pad_r: 0 - pad_t: 1 - strides: - - 2 - - 1 - width: 8 - 1: - K_h: 9 - K_w: 1 - channels: 12 - height: 8 - num_threads: 1 - pad_b: 1 - pad_l: 0 - pad_r: 0 - pad_t: 0 - strides: - - 1 - - 2 - width: 4 - 2: - K_h: 3 - K_w: 3 - channels: 12 - height: 8 - num_threads: 2 - pad_b: 2 - pad_l: 2 - pad_r: 1 - pad_t: 2 - strides: - - 2 - - 2 - width: 14 - 3: - K_h: 7 - K_w: 3 - channels: 12 - height: 15 - num_threads: 5 - pad_b: 2 - pad_l: 2 - pad_r: 2 - pad_t: 2 - strides: - - 2 - - 2 - width: 14 - 4: - K_h: 9 - K_w: 4 - channels: 52 - height: 12 - num_threads: 1 - pad_b: 0 - pad_l: 1 - pad_r: 2 - pad_t: 2 - strides: - - 2 - - 1 - width: 14 - 5: - K_h: 9 - K_w: 3 - channels: 28 - height: 12 - num_threads: 2 - pad_b: 1 - pad_l: 2 - pad_r: 1 - pad_t: 0 - strides: - - 2 - - 2 - width: 20 - 6: - K_h: 5 - K_w: 2 - channels: 16 - height: 12 - num_threads: 2 - pad_b: 0 - pad_l: 0 - pad_r: 1 - pad_t: 0 - strides: - - 2 - - 1 - width: 20 - 7: - K_h: 5 - K_w: 3 - channels: 4 - height: 8 - num_threads: 1 - pad_b: 0 - pad_l: 1 - pad_r: 1 - pad_t: 2 - strides: - - 1 - - 2 - width: 20 - 8: - K_h: 7 - K_w: 5 - channels: 52 - height: 5 - num_threads: 1 - pad_b: 2 - pad_l: 0 - pad_r: 2 - pad_t: 0 - strides: - - 2 - - 2 - width: 20 - 9: - K_h: 7 - K_w: 7 - channels: 8 - height: 15 - num_threads: 1 - pad_b: 1 - pad_l: 1 - pad_r: 2 - pad_t: 0 - strides: - - 1 - - 1 - width: 7 - 10: - K_h: 5 - K_w: 3 - channels: 48 - height: 15 - num_threads: 5 - pad_b: 0 - pad_l: 2 - pad_r: 1 - pad_t: 1 - strides: - - 1 - - 1 - width: 14 - 11: - K_h: 7 - K_w: 7 - channels: 52 - height: 8 - num_threads: 1 - pad_b: 1 - pad_l: 0 - pad_r: 1 - pad_t: 0 - strides: - - 1 - - 1 - width: 8 - 12: - K_h: 7 - K_w: 4 - channels: 32 - height: 15 - num_threads: 1 - pad_b: 2 - pad_l: 2 - pad_r: 2 - pad_t: 1 - strides: - - 2 - - 2 - width: 8 - 13: - K_h: 2 - K_w: 8 - channels: 32 - height: 8 - num_threads: 2 - pad_b: 1 - pad_l: 0 - pad_r: 1 - pad_t: 0 - strides: - - 1 - - 2 - width: 7 - 14: - K_h: 9 - K_w: 5 - channels: 12 - height: 8 - num_threads: 2 - pad_b: 2 - pad_l: 0 - pad_r: 2 - pad_t: 2 - strides: - - 2 - - 1 - width: 8 - 15: - K_h: 3 - K_w: 7 - channels: 12 - height: 12 - num_threads: 2 - pad_b: 2 - pad_l: 1 - pad_r: 1 - pad_t: 0 - strides: - - 2 - - 2 - width: 20 - 16: - K_h: 7 - K_w: 5 - channels: 8 - height: 5 - num_threads: 1 - pad_b: 2 - pad_l: 0 - pad_r: 2 - pad_t: 1 - strides: - - 2 - - 1 - width: 14 - 17: - K_h: 5 - K_w: 4 - channels: 28 - height: 4 - num_threads: 2 - pad_b: 0 - pad_l: 2 - pad_r: 1 - pad_t: 2 - strides: - - 1 - - 2 - width: 8 - 18: - K_h: 3 - K_w: 1 - channels: 32 - height: 12 - num_threads: 5 - pad_b: 2 - pad_l: 0 - pad_r: 0 - pad_t: 2 - strides: - - 2 - - 2 - width: 7 - 19: - K_h: 3 - K_w: 3 - channels: 28 - height: 1 - num_threads: 1 - pad_b: 0 - pad_l: 1 - pad_r: 1 - pad_t: 2 - strides: - - 2 - - 1 - width: 1 diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_fused_relu/__init__.py b/test/integration_test/test_single_op_models/test_conv2d/test_fused_relu/__init__.py deleted file mode 100644 index 5171af25a..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_fused_relu/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import tensorflow as tf - -from tflite2xcore.model_generation import Configuration - -from .. import ( - AbstractConv2dTestModelGenerator, - test_output, - test_converted_single_op_model, - test_idempotence, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class FusedCustomReluMixin(AbstractConv2dTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - self._config["max_value"] = cfg.pop("max_value") - super()._set_config(cfg) - - def check_config(self) -> None: - super().check_config() - max_value = self._config["max_value"] - assert max_value > 0, f"max_value must be greater than 0, got {max_value}" - assert max_value != 6, f"max_value cannot be equal to 6 (Relu6 is not custom)" - - def _build_core_model(self) -> tf.keras.Model: - return tf.keras.Sequential( - layers=[ - self._op_layer(input_shape=self._input_shape), - tf.keras.layers.ReLU(max_value=self._config["max_value"]), - ] - ) diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_fused_relu/test_custom_relu_conv2d.py b/test/integration_test/test_single_op_models/test_conv2d/test_fused_relu/test_custom_relu_conv2d.py deleted file mode 100644 index a70df54cb..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_fused_relu/test_custom_relu_conv2d.py +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf -from tflite2xcore.xcore_schema import XCOREModel, BuiltinOpCodes - -from ..test_conv2d import Conv2dTestModelGenerator -from . import FusedCustomReluMixin -from ..test_conv2d import converted_op_code # pylint: disable=unused-import -from . import ( # pylint: disable=unused-import - test_output, - # test_converted_single_op_model, # TODO: enable - test_idempotence, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class CustomReluConv2dTestModelGenerator( - FusedCustomReluMixin, Conv2dTestModelGenerator -): - pass - - -GENERATOR = CustomReluConv2dTestModelGenerator - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def abs_output_tolerance() -> None: - return - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -@pytest.mark.skip_on_device -def test_reference_model_regression(reference_model: XCOREModel) -> None: - operators = reference_model.subgraphs[0].operators - - opcodes = [op.operator_code.code for op in operators] - major_version = tf.version.VERSION[:3] - if float(major_version) >= 2.5: - expected_opcodes = [ - BuiltinOpCodes.CONV_2D, - BuiltinOpCodes.MINIMUM, - BuiltinOpCodes.RELU, - ] - elif major_version == "2.4": - expected_opcodes = [ - BuiltinOpCodes.CONV_2D, - BuiltinOpCodes.QUANTIZE, - BuiltinOpCodes.QUANTIZE, - BuiltinOpCodes.MINIMUM, - BuiltinOpCodes.RELU, - ] - else: - expected_opcodes = [ - BuiltinOpCodes.CONV_2D, - BuiltinOpCodes.QUANTIZE, - BuiltinOpCodes.QUANTIZE, - BuiltinOpCodes.MINIMUM, - BuiltinOpCodes.QUANTIZE, - BuiltinOpCodes.MAXIMUM, - ] - assert opcodes == expected_opcodes - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_fused_relu/test_custom_relu_conv2d.yml b/test/integration_test/test_single_op_models/test_conv2d/test_fused_relu/test_custom_relu_conv2d.yml deleted file mode 100644 index e90de9f07..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_fused_relu/test_custom_relu_conv2d.yml +++ /dev/null @@ -1,263 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 2 - K_w: 3 - height: 5 - input_channels: 32 - max_value: 1.0 - num_threads: 1 - output_channels: 4 - padding: same - strides: - - 1 - - 2 - width: 20 - 1: - K_h: 5 - K_w: 4 - height: 12 - input_channels: 16 - max_value: 0.5 - num_threads: 2 - output_channels: 4 - padding: valid - strides: - - 1 - - 2 - width: 4 - 2: - K_h: 7 - K_w: 7 - height: 8 - input_channels: 36 - max_value: 2.5 - num_threads: 5 - output_channels: 8 - padding: same - strides: - - 2 - - 2 - width: 7 - 3: - K_h: 1 - K_w: 3 - height: 5 - input_channels: 12 - max_value: 1.5 - num_threads: 5 - output_channels: 8 - padding: same - strides: - - 1 - - 1 - width: 20 - 4: - K_h: 3 - K_w: 4 - height: 5 - input_channels: 12 - max_value: 1.0 - num_threads: 1 - output_channels: 32 - padding: same - strides: - - 2 - - 2 - width: 7 - 5: - K_h: 5 - K_w: 3 - height: 1 - input_channels: 36 - max_value: 4.5 - num_threads: 1 - output_channels: 12 - padding: same - strides: - - 1 - - 2 - width: 20 - 6: - K_h: 5 - K_w: 7 - height: 15 - input_channels: 48 - max_value: 1.0 - num_threads: 1 - output_channels: 52 - padding: valid - strides: - - 1 - - 1 - width: 7 - 7: - K_h: 3 - K_w: 4 - height: 12 - input_channels: 48 - max_value: 2.5 - num_threads: 1 - output_channels: 48 - padding: same - strides: - - 1 - - 1 - width: 14 - 8: - K_h: 1 - K_w: 9 - height: 4 - input_channels: 36 - max_value: 2.5 - num_threads: 1 - output_channels: 48 - padding: same - strides: - - 2 - - 2 - width: 8 - 9: - K_h: 1 - K_w: 5 - height: 8 - input_channels: 12 - max_value: 1.5 - num_threads: 1 - output_channels: 32 - padding: valid - strides: - - 2 - - 1 - width: 7 - 10: - K_h: 3 - K_w: 5 - height: 12 - input_channels: 12 - max_value: 4.0 - num_threads: 2 - output_channels: 48 - padding: same - strides: - - 1 - - 2 - width: 14 - 11: - K_h: 7 - K_w: 7 - height: 15 - input_channels: 36 - max_value: 2.5 - num_threads: 1 - output_channels: 16 - padding: same - strides: - - 2 - - 2 - width: 20 - 12: - K_h: 1 - K_w: 9 - height: 15 - input_channels: 20 - max_value: 3.0 - num_threads: 2 - output_channels: 8 - padding: valid - strides: - - 1 - - 2 - width: 14 - 13: - K_h: 9 - K_w: 9 - height: 5 - input_channels: 4 - max_value: 5.0 - num_threads: 1 - output_channels: 8 - padding: same - strides: - - 1 - - 1 - width: 8 - 14: - K_h: 3 - K_w: 7 - height: 5 - input_channels: 32 - max_value: 5.5 - num_threads: 5 - output_channels: 32 - padding: valid - strides: - - 1 - - 2 - width: 20 - 15: - K_h: 2 - K_w: 7 - height: 8 - input_channels: 36 - max_value: 1.5 - num_threads: 5 - output_channels: 12 - padding: same - strides: - - 1 - - 1 - width: 14 - 16: - K_h: 2 - K_w: 3 - height: 5 - input_channels: 16 - max_value: 4.5 - num_threads: 5 - output_channels: 52 - padding: same - strides: - - 1 - - 1 - width: 8 - 17: - K_h: 7 - K_w: 4 - height: 15 - input_channels: 36 - max_value: 5.0 - num_threads: 2 - output_channels: 16 - padding: valid - strides: - - 1 - - 2 - width: 4 - 18: - K_h: 5 - K_w: 3 - height: 15 - input_channels: 20 - max_value: 0.5 - num_threads: 2 - output_channels: 12 - padding: valid - strides: - - 2 - - 1 - width: 20 - 19: - K_h: 2 - K_w: 5 - height: 12 - input_channels: 20 - max_value: 1.5 - num_threads: 1 - output_channels: 28 - padding: same - strides: - - 2 - - 2 - width: 4 diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_single_pixel_conv2d.py b/test/integration_test/test_single_op_models/test_conv2d/test_single_pixel_conv2d.py deleted file mode 100644 index 8f7499663..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_single_pixel_conv2d.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import XCOREOpCodes -from tflite2xcore.model_generation import Configuration - -from . import Conv2dGenericTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class SinglePixelConv2dTestModelGenerator(Conv2dGenericTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - assert "height" not in cfg and "width" not in cfg, ( - "height and width should not be specified " - "(they are inferred from kernel height and width)" - ) - cfg["height"] = cfg.setdefault("K_h", 1) - cfg["width"] = cfg.setdefault("K_w", 1) - - cfg.setdefault("padding", "valid") - super()._set_config(cfg) - - def check_config(self) -> None: - super().check_config() - assert ( - self._config["padding"] == "valid" - ), "Only valid padding is allowed in single pixel conv2d tests" - - -GENERATOR = SinglePixelConv2dTestModelGenerator - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_fc - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_conv2d/test_single_pixel_conv2d.yml b/test/integration_test/test_single_op_models/test_conv2d/test_single_pixel_conv2d.yml deleted file mode 100644 index 19e08830b..000000000 --- a/test/integration_test/test_single_op_models/test_conv2d/test_single_pixel_conv2d.yml +++ /dev/null @@ -1,124 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 15 - K_w: 20 - input_channels: 49 - num_threads: 1 - output_channels: 12 - skip_on_device: True - 1: - K_h: 2 - K_w: 9 - input_channels: 25 - num_threads: 5 - output_channels: 49 - 2: - K_h: 12 - K_w: 3 - input_channels: 4 - num_threads: 1 - output_channels: 7 - 3: - K_h: 12 - K_w: 9 - input_channels: 12 - num_threads: 5 - output_channels: 32 - 4: - K_h: 8 - K_w: 14 - input_channels: 4 - num_threads: 2 - output_channels: 4 - 5: - K_h: 8 - K_w: 7 - input_channels: 49 - num_threads: 2 - output_channels: 49 - 6: - K_h: 2 - K_w: 3 - input_channels: 1 - num_threads: 2 - output_channels: 49 - 7: - K_h: 4 - K_w: 1 - input_channels: 32 - num_threads: 5 - output_channels: 16 - 8: - K_h: 1 - K_w: 7 - input_channels: 7 - num_threads: 2 - output_channels: 4 - 9: - K_h: 5 - K_w: 1 - input_channels: 12 - num_threads: 1 - output_channels: 1 - 10: - K_h: 8 - K_w: 14 - input_channels: 25 - num_threads: 5 - output_channels: 12 - 11: - K_h: 15 - K_w: 1 - input_channels: 32 - num_threads: 2 - output_channels: 12 - 12: - K_h: 15 - K_w: 4 - input_channels: 12 - num_threads: 2 - output_channels: 1 - 13: - K_h: 5 - K_w: 14 - input_channels: 1 - num_threads: 1 - output_channels: 25 - 14: - K_h: 2 - K_w: 9 - input_channels: 49 - num_threads: 5 - output_channels: 25 - 15: - K_h: 5 - K_w: 20 - input_channels: 25 - num_threads: 2 - output_channels: 7 - 16: - K_h: 5 - K_w: 3 - input_channels: 7 - num_threads: 1 - output_channels: 32 - 17: - K_h: 1 - K_w: 4 - input_channels: 16 - num_threads: 2 - output_channels: 4 - 18: - K_h: 1 - K_w: 20 - input_channels: 4 - num_threads: 5 - output_channels: 16 - 19: - K_h: 4 - K_w: 7 - input_channels: 16 - num_threads: 1 - output_channels: 16 diff --git a/test/integration_test/test_single_op_models/test_fully_connected.py b/test/integration_test/test_single_op_models/test_fully_connected.py deleted file mode 100644 index bedb9e989..000000000 --- a/test/integration_test/test_single_op_models/test_fully_connected.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf -from typing import Optional, Tuple - -from tflite2xcore.xcore_schema import XCOREOpCodes, BuiltinOpCodes, XCOREModel -from tflite2xcore.model_generation import Configuration -from tflite2xcore.model_generation.utils import parse_init_config - -from . import ChannelAgnosticOpTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class FullyConnectedTestModelGenerator(ChannelAgnosticOpTestModelGenerator): - def _set_config(self, cfg: Configuration) -> None: - self._config.update( - { - "weight_init": cfg.pop("weight_init", ("RandomUniform", -1, 1)), - "bias_init": cfg.pop("bias_init", ("RandomUniform", -1, 1)), - "outputs": cfg.pop("outputs"), - } - ) - super()._set_config(cfg) - - def _build_core_model(self) -> tf.keras.Model: - return tf.keras.Sequential( - layers=[ - tf.keras.layers.Flatten(input_shape=self._input_shape), - self._op_layer(), - ] - ) - - def _op_layer( - self, *, input_shape: Optional[Tuple[int, int, int]] = None - ) -> tf.keras.layers.Layer: - cfg = self._config - return tf.keras.layers.Dense( - cfg["outputs"], - activation="linear", - bias_initializer=parse_init_config(*cfg["bias_init"]), - kernel_initializer=parse_init_config(*cfg["weight_init"]), - ) - - -GENERATOR = FullyConnectedTestModelGenerator - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_fc - - -@pytest.fixture -def reference_op_code() -> BuiltinOpCodes: - return BuiltinOpCodes.FULLY_CONNECTED - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -@pytest.mark.skip_on_device -def test_reference_model_regression( - reference_model: XCOREModel, reference_op_code: BuiltinOpCodes -) -> None: - - operators = reference_model.subgraphs[0].operators - - assert 1 <= len(operators) <= 2 - if len(operators) == 2: - assert operators[0].operator_code.code is BuiltinOpCodes.RESHAPE - - op_code = operators[-1].operator_code.code - assert ( - op_code is reference_op_code - ), f"expected: {reference_op_code}, got: {op_code}" - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_fully_connected.yml b/test/integration_test/test_single_op_models/test_fully_connected.yml deleted file mode 100644 index fd20d6441..000000000 --- a/test/integration_test/test_single_op_models/test_fully_connected.yml +++ /dev/null @@ -1,244 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - channels: 1 - height: 4 - num_threads: 2 - outputs: 32 - width: 8 - 1: - channels: 49 - height: 8 - num_threads: 1 - outputs: 12 - width: 8 - 2: - channels: 4 - height: 4 - num_threads: 1 - outputs: 12 - width: 1 - 3: - channels: 4 - height: 5 - num_threads: 1 - outputs: 16 - width: 7 - 4: - channels: 1 - height: 5 - num_threads: 1 - outputs: 12 - width: 8 - 5: - channels: 25 - height: 5 - num_threads: 2 - outputs: 32 - width: 8 - 6: - channels: 25 - height: 1 - num_threads: 5 - outputs: 4 - width: 14 - 7: - channels: 32 - height: 5 - num_threads: 5 - outputs: 25 - width: 7 - 8: - channels: 32 - height: 12 - num_threads: 5 - outputs: 4 - width: 4 - 9: - channels: 49 - height: 8 - num_threads: 2 - outputs: 1 - width: 20 - 10: - channels: 49 - height: 1 - num_threads: 5 - outputs: 4 - width: 1 - 11: - channels: 25 - height: 8 - num_threads: 1 - outputs: 1 - width: 7 - 12: - channels: 32 - height: 5 - num_threads: 2 - outputs: 12 - width: 14 - 13: - channels: 12 - height: 12 - num_threads: 2 - outputs: 25 - width: 4 - 14: - channels: 7 - height: 12 - num_threads: 5 - outputs: 1 - width: 20 - 15: - channels: 1 - height: 4 - num_threads: 1 - outputs: 7 - width: 4 - 16: - channels: 16 - height: 15 - num_threads: 1 - outputs: 16 - width: 4 - 17: - channels: 4 - height: 8 - num_threads: 2 - outputs: 25 - width: 7 - 18: - channels: 16 - height: 15 - num_threads: 5 - outputs: 4 - width: 1 - 19: - channels: 49 - height: 1 - num_threads: 5 - outputs: 25 - width: 7 - 20: - channels: 12 - height: 8 - num_threads: 2 - outputs: 7 - width: 4 - 21: - channels: 7 - height: 1 - num_threads: 5 - outputs: 7 - width: 8 - 22: - channels: 16 - height: 4 - num_threads: 2 - outputs: 25 - width: 8 - 23: - channels: 25 - height: 8 - num_threads: 1 - outputs: 49 - width: 1 - 24: - channels: 32 - height: 4 - num_threads: 2 - outputs: 4 - width: 14 - 25: - channels: 49 - height: 12 - num_threads: 5 - outputs: 32 - width: 14 - skip_on_device: True - 26: - channels: 7 - height: 12 - num_threads: 1 - outputs: 32 - width: 20 - 27: - channels: 16 - height: 15 - num_threads: 5 - outputs: 16 - width: 20 - 28: - channels: 7 - height: 1 - num_threads: 2 - outputs: 49 - width: 20 - 29: - channels: 12 - height: 15 - num_threads: 2 - outputs: 16 - width: 14 - 30: - channels: 4 - height: 15 - num_threads: 1 - outputs: 16 - width: 4 - 31: - channels: 12 - height: 4 - num_threads: 5 - outputs: 49 - width: 7 - 32: - channels: 32 - height: 8 - num_threads: 5 - outputs: 1 - width: 20 - 33: - channels: 12 - height: 15 - num_threads: 1 - outputs: 7 - width: 8 - 34: - channels: 16 - height: 15 - num_threads: 2 - outputs: 7 - width: 1 - 35: - channels: 1 - height: 12 - num_threads: 1 - outputs: 49 - width: 20 - 36: - channels: 7 - height: 5 - num_threads: 5 - outputs: 49 - width: 1 - 37: - channels: 1 - height: 1 - num_threads: 2 - outputs: 12 - width: 7 - 38: - channels: 4 - height: 4 - num_threads: 5 - outputs: 32 - width: 4 - 39: - channels: 25 - height: 5 - num_threads: 1 - outputs: 1 - width: 14 diff --git a/test/integration_test/test_single_op_models/test_pad.py b/test/integration_test/test_single_op_models/test_pad.py deleted file mode 100644 index 7c66acab5..000000000 --- a/test/integration_test/test_single_op_models/test_pad.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf -from typing import Optional, Tuple - -from tflite2xcore.xcore_schema import XCOREOpCodes, BuiltinOpCodes - -from . import ChannelAgnosticOpTestModelGenerator, PaddingMixin -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class PadTestModelGenerator(ChannelAgnosticOpTestModelGenerator, PaddingMixin): - def _op_layer( - self, *, input_shape: Optional[Tuple[int, int, int]] = None - ) -> tf.keras.layers.Layer: - return self._pad_layer(input_shape=input_shape) - - -GENERATOR = PadTestModelGenerator - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def abs_output_tolerance() -> int: - return 0 - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_pad - - -@pytest.fixture -def reference_op_code() -> BuiltinOpCodes: - return BuiltinOpCodes.PAD - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_pad.yml b/test/integration_test/test_single_op_models/test_pad.yml deleted file mode 100644 index ca5a08d11..000000000 --- a/test/integration_test/test_single_op_models/test_pad.yml +++ /dev/null @@ -1,163 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - channels: 48 - height: 4 - pad_b: 0 - pad_l: 2 - pad_r: 0 - pad_t: 0 - width: 1 - 1: - channels: 48 - height: 5 - pad_b: 2 - pad_l: 0 - pad_r: 0 - pad_t: 1 - width: 1 - 2: - channels: 64 - height: 15 - pad_b: 0 - pad_l: 1 - pad_r: 0 - pad_t: 0 - width: 8 - 3: - channels: 52 - height: 5 - pad_b: 2 - pad_l: 2 - pad_r: 2 - pad_t: 0 - width: 7 - 4: - channels: 64 - height: 8 - pad_b: 0 - pad_l: 1 - pad_r: 1 - pad_t: 1 - width: 4 - 5: - channels: 32 - height: 1 - pad_b: 2 - pad_l: 2 - pad_r: 0 - pad_t: 1 - width: 4 - 6: - channels: 8 - height: 1 - pad_b: 2 - pad_l: 2 - pad_r: 2 - pad_t: 1 - width: 8 - 7: - channels: 12 - height: 5 - pad_b: 1 - pad_l: 1 - pad_r: 2 - pad_t: 2 - width: 20 - 8: - channels: 32 - height: 15 - pad_b: 1 - pad_l: 0 - pad_r: 1 - pad_t: 2 - width: 8 - 9: - channels: 16 - height: 8 - pad_b: 2 - pad_l: 0 - pad_r: 2 - pad_t: 2 - width: 7 - 10: - channels: 16 - height: 15 - pad_b: 2 - pad_l: 1 - pad_r: 2 - pad_t: 0 - width: 4 - 11: - channels: 64 - height: 1 - pad_b: 1 - pad_l: 1 - pad_r: 2 - pad_t: 2 - width: 8 - 12: - channels: 28 - height: 12 - pad_b: 1 - pad_l: 0 - pad_r: 0 - pad_t: 0 - width: 1 - 13: - channels: 8 - height: 4 - pad_b: 0 - pad_l: 2 - pad_r: 2 - pad_t: 0 - width: 20 - 14: - channels: 48 - height: 12 - pad_b: 1 - pad_l: 2 - pad_r: 1 - pad_t: 1 - width: 20 - 15: - channels: 12 - height: 15 - pad_b: 0 - pad_l: 0 - pad_r: 1 - pad_t: 2 - width: 20 - 16: - channels: 28 - height: 4 - pad_b: 1 - pad_l: 2 - pad_r: 1 - pad_t: 1 - width: 14 - 17: - channels: 4 - height: 8 - pad_b: 0 - pad_l: 1 - pad_r: 0 - pad_t: 1 - width: 14 - 18: - channels: 12 - height: 8 - pad_b: 2 - pad_l: 0 - pad_r: 1 - pad_t: 2 - width: 7 - 19: - channels: 4 - height: 1 - pad_b: 1 - pad_l: 0 - pad_r: 0 - pad_t: 2 - width: 1 diff --git a/test/integration_test/test_single_op_models/test_pool2d/__init__.py b/test/integration_test/test_single_op_models/test_pool2d/__init__.py deleted file mode 100644 index ae1ab26de..000000000 --- a/test/integration_test/test_single_op_models/test_pool2d/__init__.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import tensorflow as tf -from abc import abstractmethod -from typing import Tuple, Optional, Type, Union - -from tflite2xcore.model_generation import Configuration - -from .. import ( - FilterOpTestModelGenerator, - ChannelPreservingOpTestModelGenerator, - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class Pool2dGenericTestModelGenerator( - ChannelPreservingOpTestModelGenerator, FilterOpTestModelGenerator -): - def _set_config(self, cfg: Configuration) -> None: - cfg.setdefault("strides", (2, 2)) - cfg.setdefault("K_h", 2) - cfg.setdefault("K_w", 2) - cfg.setdefault("padding", "valid") - super()._set_config(cfg) - - def check_config(self) -> None: - super().check_config() - if self._config["padding"] == "same": - assert ( - self._config["height"] % 2 == self._config["width"] % 2 == 0 - and self._config["K_h"] == self._config["K_w"] == 2 - and self._config["strides"][0] == self._config["strides"][1] == 2 - ), "same padding is only allowed for the common 2x2 case" - - @property - @abstractmethod - def _op_class( - self, - ) -> Union[Type[tf.keras.layers.MaxPool2D], Type[tf.keras.layers.AvgPool2D]]: - raise NotImplementedError() - - def _op_layer( - self, *, input_shape: Optional[Tuple[int, int, int]] = None - ) -> tf.keras.layers.Layer: - kwargs = {"input_shape": input_shape} if input_shape else {} - cfg = self._config - return self._op_class( - pool_size=(cfg["K_h"], cfg["K_w"]), - strides=cfg["strides"], - padding=cfg["padding"], - **kwargs - ) diff --git a/test/integration_test/test_single_op_models/test_pool2d/test_avgpool2d.py b/test/integration_test/test_single_op_models/test_pool2d/test_avgpool2d.py deleted file mode 100644 index fcd60ae3c..000000000 --- a/test/integration_test/test_single_op_models/test_pool2d/test_avgpool2d.py +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf -from typing import Type - -from tflite2xcore.xcore_schema import XCOREOpCodes, BuiltinOpCodes - -from . import Pool2dGenericTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class AvgPool2dTestModelGenerator(Pool2dGenericTestModelGenerator): - @property - def _op_class(self) -> Type[tf.keras.layers.AvgPool2D]: - return tf.keras.layers.AvgPool2D # type: ignore - - -GENERATOR = AvgPool2dTestModelGenerator - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_avgpool2d - - -@pytest.fixture -def reference_op_code() -> BuiltinOpCodes: - return BuiltinOpCodes.AVERAGE_POOL_2D - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_pool2d/test_avgpool2d.yml b/test/integration_test/test_single_op_models/test_pool2d/test_avgpool2d.yml deleted file mode 100644 index c7b9b8b6d..000000000 --- a/test/integration_test/test_single_op_models/test_pool2d/test_avgpool2d.yml +++ /dev/null @@ -1,443 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 3 - K_w: 3 - channels: 12 - height: 8 - num_threads: 1 - padding: valid - strides: - - 2 - - 1 - width: 20 - 1: - K_h: 3 - K_w: 1 - channels: 4 - height: 8 - num_threads: 5 - padding: valid - strides: - - 2 - - 2 - width: 14 - 2: - K_h: 2 - K_w: 1 - channels: 12 - height: 12 - num_threads: 1 - padding: valid - strides: - - 1 - - 2 - width: 7 - 3: - K_h: 3 - K_w: 2 - channels: 16 - height: 12 - num_threads: 1 - padding: valid - strides: - - 1 - - 2 - width: 8 - 4: - K_h: 2 - K_w: 3 - channels: 64 - height: 15 - num_threads: 2 - padding: valid - strides: - - 1 - - 1 - width: 4 - 5: - K_h: 3 - K_w: 1 - channels: 8 - height: 5 - num_threads: 5 - padding: valid - strides: - - 1 - - 2 - width: 8 - 6: - K_h: 2 - K_w: 1 - channels: 64 - height: 8 - num_threads: 5 - padding: valid - strides: - - 1 - - 3 - width: 8 - 7: - K_h: 3 - K_w: 1 - channels: 4 - height: 12 - num_threads: 2 - padding: valid - strides: - - 1 - - 3 - width: 4 - 8: - K_h: 1 - K_w: 2 - channels: 16 - height: 12 - num_threads: 1 - padding: valid - strides: - - 3 - - 2 - width: 4 - 9: - K_h: 1 - K_w: 2 - channels: 48 - height: 5 - num_threads: 2 - padding: valid - strides: - - 2 - - 1 - width: 7 - 10: - K_h: 1 - K_w: 2 - channels: 4 - height: 12 - num_threads: 1 - padding: valid - strides: - - 1 - - 2 - width: 8 - 11: - K_h: 2 - K_w: 3 - channels: 4 - height: 4 - num_threads: 2 - padding: valid - strides: - - 1 - - 3 - width: 7 - 12: - K_h: 3 - K_w: 1 - channels: 28 - height: 5 - num_threads: 1 - padding: valid - strides: - - 1 - - 1 - width: 8 - 13: - K_h: 3 - K_w: 1 - channels: 28 - height: 15 - num_threads: 5 - padding: valid - strides: - - 1 - - 3 - width: 7 - 14: - K_h: 1 - K_w: 1 - channels: 52 - height: 15 - num_threads: 1 - padding: valid - strides: - - 1 - - 2 - width: 4 - 15: - K_h: 1 - K_w: 2 - channels: 64 - height: 12 - num_threads: 5 - padding: valid - strides: - - 2 - - 2 - width: 7 - 16: - K_h: 3 - K_w: 3 - channels: 28 - height: 12 - num_threads: 5 - padding: valid - strides: - - 3 - - 2 - width: 7 - 17: - K_h: 1 - K_w: 2 - channels: 8 - height: 12 - num_threads: 1 - padding: valid - strides: - - 2 - - 2 - width: 20 - 18: - K_h: 2 - K_w: 2 - channels: 12 - height: 8 - num_threads: 5 - padding: valid - strides: - - 2 - - 2 - width: 20 - 19: - K_h: 3 - K_w: 3 - channels: 52 - height: 15 - num_threads: 1 - padding: valid - strides: - - 3 - - 2 - width: 7 - 20: - K_h: 2 - K_w: 1 - channels: 8 - height: 8 - num_threads: 5 - padding: valid - strides: - - 1 - - 3 - width: 20 - 21: - K_h: 2 - K_w: 3 - channels: 8 - height: 5 - num_threads: 5 - padding: valid - strides: - - 2 - - 1 - width: 7 - 22: - K_h: 2 - K_w: 2 - channels: 52 - height: 8 - num_threads: 1 - padding: valid - strides: - - 1 - - 1 - width: 20 - 23: - K_h: 3 - K_w: 3 - channels: 48 - height: 4 - num_threads: 2 - padding: valid - strides: - - 2 - - 2 - width: 20 - 24: - K_h: 1 - K_w: 1 - channels: 64 - height: 12 - num_threads: 5 - padding: valid - strides: - - 1 - - 3 - width: 8 - 25: - K_h: 2 - K_w: 3 - channels: 48 - height: 15 - num_threads: 5 - padding: valid - strides: - - 1 - - 1 - width: 14 - 26: - K_h: 3 - K_w: 2 - channels: 28 - height: 4 - num_threads: 1 - padding: valid - strides: - - 2 - - 2 - width: 14 - 27: - K_h: 3 - K_w: 3 - channels: 52 - height: 5 - num_threads: 2 - padding: valid - strides: - - 1 - - 1 - width: 4 - 28: - K_h: 2 - K_w: 3 - channels: 12 - height: 8 - num_threads: 5 - padding: valid - strides: - - 2 - - 1 - width: 8 - 29: - K_h: 2 - K_w: 2 - channels: 52 - height: 8 - num_threads: 2 - padding: valid - strides: - - 1 - - 3 - width: 8 - 30: - K_h: 2 - K_w: 1 - channels: 64 - height: 4 - num_threads: 2 - padding: valid - strides: - - 1 - - 2 - width: 4 - 31: - K_h: 1 - K_w: 2 - channels: 16 - height: 15 - num_threads: 2 - padding: valid - strides: - - 1 - - 2 - width: 14 - 32: - K_h: 1 - K_w: 3 - channels: 12 - height: 12 - num_threads: 2 - padding: valid - strides: - - 1 - - 2 - width: 8 - 33: - K_h: 1 - K_w: 1 - channels: 8 - height: 15 - num_threads: 1 - padding: valid - strides: - - 1 - - 3 - width: 1 - 34: - K_h: 1 - K_w: 1 - channels: 32 - height: 5 - num_threads: 5 - padding: valid - strides: - - 2 - - 2 - width: 14 - 35: - K_h: 2 - K_w: 3 - channels: 48 - height: 15 - num_threads: 5 - padding: valid - strides: - - 3 - - 2 - width: 14 - 36: - K_h: 1 - K_w: 3 - channels: 52 - height: 8 - num_threads: 1 - padding: valid - strides: - - 2 - - 1 - width: 14 - 37: - K_h: 2 - K_w: 2 - channels: 32 - height: 5 - num_threads: 1 - padding: valid - strides: - - 2 - - 2 - width: 7 - 38: - K_h: 1 - K_w: 3 - channels: 52 - height: 4 - num_threads: 1 - padding: valid - strides: - - 2 - - 2 - width: 7 - 39: - K_h: 2 - K_w: 1 - channels: 8 - height: 5 - num_threads: 1 - padding: valid - strides: - - 2 - - 1 - width: 20 diff --git a/test/integration_test/test_single_op_models/test_pool2d/test_global_avgpool2d.py b/test/integration_test/test_single_op_models/test_pool2d/test_global_avgpool2d.py deleted file mode 100644 index 0729a0845..000000000 --- a/test/integration_test/test_single_op_models/test_pool2d/test_global_avgpool2d.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf -from typing import Optional, Tuple - -from tflite2xcore.xcore_schema import XCOREOpCodes, BuiltinOpCodes - -from . import ChannelPreservingOpTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output as _test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class GlobalAveragePooling2dTestModelGenerator(ChannelPreservingOpTestModelGenerator): - def _op_layer( - self, *, input_shape: Optional[Tuple[int, int, int]] = None - ) -> tf.keras.layers.Layer: - kwargs = {"input_shape": input_shape} if input_shape else {} - return tf.keras.layers.GlobalAveragePooling2D(**kwargs) - - -GENERATOR = GlobalAveragePooling2dTestModelGenerator - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_avgpool2d_global - - -@pytest.fixture -def reference_op_code() -> BuiltinOpCodes: - return BuiltinOpCodes.MEAN - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - -# TODO: fix this -def test_output(compared_outputs, request): # type: ignore - name = request.node.name - if tf.version.VERSION[:3] in ("2.4", "2.5"): - if ( - name.endswith("[CONFIGS[14]]") - or name.endswith("[CONFIGS[16]]") - or name.endswith("[CONFIGS[21]]") - ): - request.applymarker(pytest.mark.xfail(run=False)) - _test_output(compared_outputs, request) - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_pool2d/test_global_avgpool2d.yml b/test/integration_test/test_single_op_models/test_pool2d/test_global_avgpool2d.yml deleted file mode 100644 index 63c07017d..000000000 --- a/test/integration_test/test_single_op_models/test_pool2d/test_global_avgpool2d.yml +++ /dev/null @@ -1,203 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - channels: 4 - height: 8 - num_threads: 5 - width: 8 - 1: - channels: 32 - height: 15 - num_threads: 1 - width: 4 - 2: - channels: 64 - height: 8 - num_threads: 2 - width: 7 - 3: - channels: 64 - height: 8 - num_threads: 1 - width: 4 - 4: - channels: 16 - height: 15 - num_threads: 5 - width: 20 - 5: - channels: 12 - height: 8 - num_threads: 1 - width: 1 - 6: - channels: 8 - height: 5 - num_threads: 2 - width: 7 - 7: - channels: 52 - height: 8 - num_threads: 1 - width: 14 - 8: - channels: 48 - height: 15 - num_threads: 5 - width: 20 - 9: - channels: 32 - height: 12 - num_threads: 2 - width: 8 - 10: - channels: 52 - height: 8 - num_threads: 1 - width: 1 - 11: - channels: 48 - height: 15 - num_threads: 1 - width: 14 - 12: - channels: 16 - height: 15 - num_threads: 2 - width: 7 - 13: - channels: 8 - height: 5 - num_threads: 1 - width: 14 - 14: - channels: 8 - height: 8 - num_threads: 5 - width: 14 - 15: - channels: 28 - height: 15 - num_threads: 1 - width: 20 - 16: - channels: 8 - height: 12 - num_threads: 5 - width: 7 - 17: - channels: 28 - height: 4 - num_threads: 2 - width: 8 - 18: - channels: 28 - height: 12 - num_threads: 1 - width: 4 - 19: - channels: 12 - height: 5 - num_threads: 1 - width: 8 - 20: - channels: 12 - height: 8 - num_threads: 2 - width: 4 - 21: - channels: 16 - height: 5 - num_threads: 5 - width: 14 - 22: - channels: 64 - height: 15 - num_threads: 1 - width: 20 - 23: - channels: 4 - height: 12 - num_threads: 1 - width: 4 - 24: - channels: 52 - height: 5 - num_threads: 2 - width: 7 - 25: - channels: 28 - height: 15 - num_threads: 2 - width: 7 - 26: - channels: 48 - height: 1 - num_threads: 1 - width: 1 - 27: - channels: 4 - height: 8 - num_threads: 5 - width: 20 - 28: - channels: 4 - height: 12 - num_threads: 5 - width: 8 - 29: - channels: 8 - height: 5 - num_threads: 5 - width: 14 - 30: - channels: 48 - height: 5 - num_threads: 1 - width: 7 - 31: - channels: 32 - height: 15 - num_threads: 1 - width: 4 - 32: - channels: 48 - height: 5 - num_threads: 1 - width: 7 - 33: - channels: 32 - height: 4 - num_threads: 2 - width: 4 - 34: - channels: 52 - height: 8 - num_threads: 2 - width: 8 - 35: - channels: 12 - height: 5 - num_threads: 5 - width: 8 - 36: - channels: 12 - height: 12 - num_threads: 2 - width: 14 - 37: - channels: 64 - height: 4 - num_threads: 1 - width: 1 - 38: - channels: 28 - height: 4 - num_threads: 1 - width: 7 - 39: - channels: 64 - height: 4 - num_threads: 2 - width: 8 diff --git a/test/integration_test/test_single_op_models/test_pool2d/test_maxpool2d.py b/test/integration_test/test_single_op_models/test_pool2d/test_maxpool2d.py deleted file mode 100644 index 50a984137..000000000 --- a/test/integration_test/test_single_op_models/test_pool2d/test_maxpool2d.py +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import tensorflow as tf -from typing import Type - -from tflite2xcore.xcore_schema import XCOREOpCodes, BuiltinOpCodes - -from . import Pool2dGenericTestModelGenerator -from . import ( # pylint: disable=unused-import - test_output, - test_converted_single_op_model, - test_reference_model_regression, -) - - -# ---------------------------------------------------------------------------- -# GENERATORS -# ---------------------------------------------------------------------------- - - -class MaxPool2dTestModelGenerator(Pool2dGenericTestModelGenerator): - @property - def _op_class(self) -> Type[tf.keras.layers.MaxPool2D]: - return tf.keras.layers.MaxPool2D # type: ignore - - -GENERATOR = MaxPool2dTestModelGenerator - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def converted_op_code() -> XCOREOpCodes: - return XCOREOpCodes.XC_maxpool2d - - -@pytest.fixture -def reference_op_code() -> BuiltinOpCodes: - return BuiltinOpCodes.MAX_POOL_2D - - -if __name__ == "__main__": - pytest.main() diff --git a/test/integration_test/test_single_op_models/test_pool2d/test_maxpool2d.yml b/test/integration_test/test_single_op_models/test_pool2d/test_maxpool2d.yml deleted file mode 100644 index 9a98b4876..000000000 --- a/test/integration_test/test_single_op_models/test_pool2d/test_maxpool2d.yml +++ /dev/null @@ -1,443 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved -# RANDOMLY GENERATED CONFIGS, MODIFY AT OWN RISK -default: - 0: - K_h: 3 - K_w: 1 - channels: 12 - height: 12 - num_threads: 1 - padding: valid - strides: - - 1 - - 3 - width: 4 - 1: - K_h: 1 - K_w: 3 - channels: 52 - height: 4 - num_threads: 1 - padding: valid - strides: - - 1 - - 3 - width: 4 - 2: - K_h: 3 - K_w: 2 - channels: 8 - height: 5 - num_threads: 2 - padding: valid - strides: - - 2 - - 1 - width: 20 - 3: - K_h: 1 - K_w: 2 - channels: 8 - height: 12 - num_threads: 1 - padding: valid - strides: - - 3 - - 2 - width: 7 - 4: - K_h: 2 - K_w: 2 - channels: 8 - height: 4 - num_threads: 1 - padding: valid - strides: - - 3 - - 2 - width: 4 - 5: - K_h: 1 - K_w: 3 - channels: 16 - height: 5 - num_threads: 2 - padding: valid - strides: - - 3 - - 2 - width: 4 - 6: - K_h: 3 - K_w: 2 - channels: 28 - height: 15 - num_threads: 5 - padding: valid - strides: - - 2 - - 1 - width: 8 - 7: - K_h: 2 - K_w: 1 - channels: 16 - height: 12 - num_threads: 5 - padding: valid - strides: - - 1 - - 2 - width: 7 - 8: - K_h: 2 - K_w: 1 - channels: 32 - height: 4 - num_threads: 1 - padding: valid - strides: - - 3 - - 2 - width: 14 - 9: - K_h: 1 - K_w: 3 - channels: 28 - height: 12 - num_threads: 5 - padding: valid - strides: - - 2 - - 1 - width: 7 - 10: - K_h: 1 - K_w: 3 - channels: 4 - height: 8 - num_threads: 2 - padding: valid - strides: - - 1 - - 3 - width: 20 - 11: - K_h: 1 - K_w: 3 - channels: 52 - height: 5 - num_threads: 2 - padding: valid - strides: - - 1 - - 1 - width: 4 - 12: - K_h: 3 - K_w: 2 - channels: 12 - height: 8 - num_threads: 1 - padding: valid - strides: - - 1 - - 2 - width: 8 - 13: - K_h: 2 - K_w: 1 - channels: 64 - height: 4 - num_threads: 1 - padding: valid - strides: - - 2 - - 2 - width: 14 - 14: - K_h: 3 - K_w: 3 - channels: 64 - height: 4 - num_threads: 1 - padding: valid - strides: - - 1 - - 3 - width: 7 - 15: - K_h: 2 - K_w: 3 - channels: 12 - height: 15 - num_threads: 2 - padding: valid - strides: - - 1 - - 3 - width: 14 - 16: - K_h: 1 - K_w: 2 - channels: 52 - height: 1 - num_threads: 1 - padding: valid - strides: - - 1 - - 1 - width: 7 - 17: - K_h: 3 - K_w: 3 - channels: 32 - height: 5 - num_threads: 2 - padding: valid - strides: - - 2 - - 2 - width: 20 - 18: - K_h: 2 - K_w: 2 - channels: 12 - height: 8 - num_threads: 2 - padding: valid - strides: - - 3 - - 2 - width: 8 - 19: - K_h: 3 - K_w: 1 - channels: 28 - height: 8 - num_threads: 2 - padding: valid - strides: - - 2 - - 1 - width: 20 - 20: - K_h: 2 - K_w: 1 - channels: 12 - height: 5 - num_threads: 5 - padding: valid - strides: - - 3 - - 2 - width: 20 - 21: - K_h: 2 - K_w: 3 - channels: 4 - height: 5 - num_threads: 2 - padding: valid - strides: - - 2 - - 1 - width: 8 - 22: - K_h: 2 - K_w: 3 - channels: 8 - height: 12 - num_threads: 1 - padding: valid - strides: - - 1 - - 1 - width: 14 - 23: - K_h: 3 - K_w: 3 - channels: 48 - height: 15 - num_threads: 2 - padding: valid - strides: - - 2 - - 1 - width: 4 - 24: - K_h: 3 - K_w: 1 - channels: 48 - height: 12 - num_threads: 2 - padding: valid - strides: - - 1 - - 2 - width: 20 - 25: - K_h: 2 - K_w: 3 - channels: 48 - height: 12 - num_threads: 5 - padding: valid - strides: - - 1 - - 3 - width: 7 - 26: - K_h: 3 - K_w: 2 - channels: 32 - height: 15 - num_threads: 5 - padding: valid - strides: - - 1 - - 3 - width: 7 - 27: - K_h: 3 - K_w: 3 - channels: 4 - height: 12 - num_threads: 5 - padding: valid - strides: - - 1 - - 3 - width: 14 - 28: - K_h: 1 - K_w: 2 - channels: 52 - height: 8 - num_threads: 2 - padding: valid - strides: - - 2 - - 1 - width: 14 - 29: - K_h: 1 - K_w: 3 - channels: 16 - height: 8 - num_threads: 5 - padding: valid - strides: - - 1 - - 2 - width: 7 - 30: - K_h: 2 - K_w: 1 - channels: 64 - height: 12 - num_threads: 5 - padding: valid - strides: - - 2 - - 2 - width: 14 - 31: - K_h: 2 - K_w: 3 - channels: 12 - height: 8 - num_threads: 1 - padding: valid - strides: - - 2 - - 1 - width: 14 - 32: - K_h: 2 - K_w: 2 - channels: 64 - height: 5 - num_threads: 5 - padding: valid - strides: - - 2 - - 2 - width: 8 - 33: - K_h: 1 - K_w: 2 - channels: 64 - height: 15 - num_threads: 5 - padding: valid - strides: - - 2 - - 2 - width: 20 - 34: - K_h: 3 - K_w: 2 - channels: 8 - height: 15 - num_threads: 1 - padding: valid - strides: - - 1 - - 3 - width: 8 - 35: - K_h: 1 - K_w: 2 - channels: 48 - height: 15 - num_threads: 2 - padding: valid - strides: - - 1 - - 1 - width: 20 - 36: - K_h: 1 - K_w: 1 - channels: 4 - height: 8 - num_threads: 5 - padding: valid - strides: - - 3 - - 2 - width: 14 - 37: - K_h: 3 - K_w: 3 - channels: 32 - height: 8 - num_threads: 1 - padding: valid - strides: - - 1 - - 2 - width: 8 - 38: - K_h: 1 - K_w: 2 - channels: 64 - height: 15 - num_threads: 2 - padding: valid - strides: - - 1 - - 1 - width: 7 - 39: - K_h: 2 - K_w: 1 - channels: 28 - height: 4 - num_threads: 1 - padding: valid - strides: - - 1 - - 2 - width: 8 diff --git a/tflite2xcore/LICENSE.txt b/tflite2xcore/LICENSE.txt deleted file mode 100644 index 4d4087535..000000000 --- a/tflite2xcore/LICENSE.txt +++ /dev/null @@ -1,133 +0,0 @@ -Software Release License Agreement - -Copyright (c) 2017-2020, XMOS, All rights reserved. - -BY ACCESSING, USING, INSTALLING OR DOWNLOADING THE XMOS SOFTWARE, YOU AGREE TO BE BOUND BY THE FOLLOWING TERMS. IF YOU DO NOT AGREE TO THESE, DO NOT ATTEMPT TO DOWNLOAD, ACCESS OR USE THE XMOS Software. -Parties: - -(1) XMOS Limited, incorporated and registered in England and Wales with company number 5494985 whose registered office is 107 Cheapside, London, EC2V 6DN (XMOS). - -(2) An individual or legal entity exercising permissions granted by this License (Customer). - -If you are entering into this Agreement on behalf of another legal entity such as a company, partnership, university, college etc. (for example, as an employee, student or consultant), you warrant that you have authority to bind that entity. - -1. Definitions - -"License" means this Software License and any schedules or annexes to it. - -"License Fee" means the fee for the XMOS Software as detailed in any schedules or annexes to this Software License - -"Licensee Modifications" means all developments and modifications of the XMOS Software developed independently by the Customer. - -"XMOS Modifications" means all developments and modifications of the XMOS Software developed or co-developed by XMOS. - -"XMOS Hardware" means any XMOS hardware devices supplied by XMOS from time to time and/or the particular XMOS devices detailed in any schedules or annexes to this Software License. - -"XMOS Software" comprises the XMOS owned circuit designs, schematics, source code, object code, reference designs, (including related programmer comments and documentation, if any), error corrections, improvements, modifications (including XMOS Modifications) and updates. - -The headings in this License do not affect its interpretation. Save where the context otherwise requires, references to clauses and schedules are to clauses and schedules of this License. - -Unless the context otherwise requires: - -- references to XMOS and the Customer include their permitted successors and assigns; -- references to statutory provisions include those statutory provisions as amended or re-enacted; and -- references to any gender include all genders. - -Words in the singular include the plural and in the plural include the singular. - -2. License - -XMOS grants the Customer a non-exclusive license to use, develop, modify and distribute the XMOS Software in object code only with, or for the purpose of being used with, XMOS Hardware. - -Open Source Software (OSS) must be used and dealt with in accordance with any license terms under which OSS is distributed. - -3. Consideration - -In consideration of the mutual obligations contained in this License, the parties agree to its terms. - -4. Term - -Subject to clause 12 below, this License shall be perpetual. - -5. Restrictions on Use - -The Customer will adhere to all applicable import and export laws and regulations of the country in which it resides and of the United States and United Kingdom, without limitation. The Customer agrees that it is its responsibility to obtain copies of and to familiarise itself fully with these laws and regulations to avoid violation. - -6. Modifications - -The Customer will own all intellectual property rights in the Licensee Modifications but will undertake to provide XMOS with any fixes made to correct any bugs found in the XMOS Software on a non-exclusive, perpetual and royalty free license basis. - -XMOS will own all intellectual property rights in the XMOS Modifications. -The Customer may only use the Licensee Modifications and XMOS Modifications on, or in relation to, XMOS Hardware. - -7. Support - -Support of the XMOS Software may be provided by XMOS pursuant to a separate support agreement. - -8. Warranty and Disclaimer - -The XMOS Software is provided "AS IS" without a warranty of any kind. XMOS and its licensors' entire liability and Customer's exclusive remedy under this warranty to be determined in XMOS's sole and absolute discretion, will be either (a) the corrections of defects in media or replacement of the media, or (b) the refund of the license fee paid (if any). - -Whilst XMOS gives the Customer the ability to load their own software and applications onto XMOS devices, the security of such software and applications when on the XMOS devices is the Customer's own responsibility and any breach of security shall not be deemed a defect or failure of the hardware. XMOS shall have no liability whatsoever in relation to any costs, damages or other losses Customer may incur as a result of any breaches of security in relation to your software or applications. - -XMOS AND ITS LICENSORS DISCLAIM ALL OTHER WARRANTIES, EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY/ SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT EXCEPT TO THE EXTENT THAT THESE DISCLAIMERS ARE HELD TO BE LEGALLY INVALID UNDER APPLICABLE LAW. - -9. High Risk Activities - -The XMOS Software is not designed or intended for use in conjunction with on-line control equipment in hazardous environments requiring fail-safe performance, including without limitation the operation of nuclear facilities, aircraft navigation or communication systems, air traffic control, life support machines, or weapons systems (collectively "High Risk Activities") in which the failure of the XMOS Software could lead directly to death, personal injury, or severe physical or environmental damage. XMOS and its licensors specifically disclaim any express or implied warranties relating to use of the XMOS Software in connection with High Risk Activities. - -10. Liability - -TO THE EXTENT NOT PROHIBITED BY APPLICABLE LAW, NEITHER XMOS NOR ITS LICENSORS SHALL BE LIABLE FOR ANY LOST REVENUE, BUSINESS, PROFIT, CONTRACTS OR DATA, ADMINISTRATIVE OR OVERHEAD EXPENSES, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES HOWEVER CAUSED AND REGARDLESS OF THEORY OF LIABILITY ARISING OUT OF THIS LICENSE, EVEN IF XMOS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. In no event shall XMOS's liability to the Customer whether in contract, tort (including negligence), or otherwise exceed the License Fee. - -Customer agrees to indemnify, hold harmless, and defend XMOS and its licensors from and against any claims or lawsuits, including attorneys' fees and any other liabilities, demands, proceedings, damages, losses, costs, expenses fines and charges which are made or brought against or incurred by XMOS as a result of your use or distribution of the Licensee Modifications or your use or distribution of XMOS Software, or any development of it, other than in accordance with the terms of this License. - -11. Ownership - -The copyrights and all other intellectual and industrial property rights for the protection of information with respect to the XMOS Software (including the methods and techniques on which they are based) are retained by XMOS and/or its licensors. Nothing in this Agreement serves to transfer such rights. Customer may not sell, mortgage, underlet, sublease, sublicense, lend or transfer possession of the XMOS Software in any way whatsoever to any third party who is not bound by this Agreement. - -12. Termination - -Either party may terminate this License at any time on written notice to the other if the other: - -- is in material or persistent breach of any of the terms of this License and either that breach is incapable of remedy, or the other party fails to remedy that breach within 30 days after receiving written notice requiring it to remedy that breach; or -- is unable to pay its debts (within the meaning of section 123 of the Insolvency Act 1986), or becomes insolvent, or is subject to an order or a resolution for its liquidation, administration, winding-up or dissolution (otherwise than for the purposes of a solvent amalgamation or reconstruction), or has an administrative or other receiver, manager, trustee, liquidator, administrator or similar officer appointed over all or any substantial part of its assets, or enters into or proposes any composition or arrangement with its creditors generally, or is subject to any analogous event or proceeding in any applicable jurisdiction. - -Termination by either party in accordance with the rights contained in clause 12 shall be without prejudice to any other rights or remedies of that party accrued prior to termination. - -On termination for any reason: - -- all rights granted to the Customer under this License shall cease; -- the Customer shall cease all activities authorised by this License; -- the Customer shall immediately pay any sums due to XMOS under this License; and -- the Customer shall immediately destroy or return to the XMOS (at the XMOS's option) all copies of the XMOS Software then in its possession, custody or control and, in the case of destruction, certify to XMOS that it has done so. - -Clauses 5, 8, 9, 10 and 11 shall survive any effective termination of this Agreement. - -13. Third party rights - -No term of this License is intended to confer a benefit on, or to be enforceable by, any person who is not a party to this license. - -14. Confidentiality and publicity - -Each party shall, during the term of this License and thereafter, keep confidential all, and shall not use for its own purposes nor without the prior written consent of the other disclose to any third party any, information of a confidential nature (including, without limitation, trade secrets and information of commercial value) which may become known to such party from the other party and which relates to the other party, unless such information is public knowledge or already known to such party at the time of disclosure, or subsequently becomes public knowledge other than by breach of this license, or subsequently comes lawfully into the possession of such party from a third party. - -The terms of this license are confidential and may not be disclosed by the Customer without the prior written consent of XMOS. -The provisions of clause 14 shall remain in full force and effect notwithstanding termination of this license for any reason. - -15. Entire agreement - -This License and the documents annexed as appendices to this License or otherwise referred to herein contain the whole agreement between the parties relating to the subject matter hereof and supersede all prior agreements, arrangements and understandings between the parties relating to that subject matter. - -16. Assignment - -The Customer shall not assign this License or any of the rights granted under it without XMOS's prior written consent. - -17. Governing law and jurisdiction - -This License shall be governed by and construed in accordance with English law and each party hereby submits to the non-exclusive jurisdiction of the English courts. - -This License has been entered into on the date stated at the beginning of it. - -Schedule -XMOS tflite2xcore Library software \ No newline at end of file diff --git a/tflite2xcore/README.md b/tflite2xcore/README.md deleted file mode 100644 index acaddafa0..000000000 --- a/tflite2xcore/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# AI Extensions Python module - -# Python module info - -`tflite2xcore` is a Python module containing utilities for converting and optimizing an TensorFlow Lite model (.tflite) to deploy on an xCORE microprocessor. diff --git a/tflite2xcore/build_dist.sh b/tflite2xcore/build_dist.sh deleted file mode 100755 index d6811e0f9..000000000 --- a/tflite2xcore/build_dist.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/bash - -rm -rf dist - -python setup.py sdist bdist_wheel - -# if twine check dist/* ; then -# if [ "$1" = "--test" ] ; then -# twine upload --repository-url https://test.pypi.org/legacy/ dist/* -# else -# twine upload dist/* ; -# fi -# fi diff --git a/tflite2xcore/setup.py b/tflite2xcore/setup.py deleted file mode 100644 index 5c1376869..000000000 --- a/tflite2xcore/setup.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. -import setuptools - -LIB_FLEXBUFFERS = [ - "libs/linux/libflexbuffers.so", - "libs/linux/libflexbuffers.so.1.0.1", - "libs/macos/libflexbuffers.dylib", - "libs/macos/libflexbuffers.1.0.1.dylib", -] - -EXCLUDES = ["*tests", "*tests.*", "*model_generation", "*model_generation.*"] -SCRIPTS = ["xformer.py", "tflite2xcore/tflite_visualize.py"] - -INSTALL_REQUIRES = [ - "aenum>=2.2.4", - "dill>=0.3.1.1", - "flatbuffers==1.12", - "numpy>=1.19.5", - "tensorflow>=2.6.2,<=2.6.2", - "larq-compute-engine>=0.6.2", -] - -setuptools.setup( - name="tflite2xcore", - packages=setuptools.find_packages(exclude=EXCLUDES), - scripts=SCRIPTS, - python_requires=">=3.8.0", - install_requires=INSTALL_REQUIRES, - extras_require={ - "test": [ - "pytest>=5.2.0", - "pytest-xdist>=1.30.0", - "portalocker==2.0.0", - "keras-applications>=1.0.8", - "PyYAML>=5.3.1", - "larq>=0.11.1", - ], - "examples": [ - "scipy>=1.4.1", - "keras-preprocessing>=1.1.2", - "tqdm>=4.41.1", - "matplotlib>=3.1.1", - "jupyter>=1.0.0", - ], - "dev": [ - "mypy>=0.782", - "lhsmdu>=1.1", - "netron>=4.8.8", - ], - }, - package_data={"": LIB_FLEXBUFFERS}, - author="XMOS", - author_email="support@xmos.com", - description="XMOS Tools to convert TensorFlow Lite models to xCORE microcontrollers.", - license="LICENSE.txt", - keywords="xmos xcore", - use_scm_version={ - "root": "..", - "relative_to": __file__, - "version_scheme": "post-release", - }, - setup_requires=["setuptools_scm"], -) diff --git a/tflite2xcore/tflite2xcore/__init__.py b/tflite2xcore/tflite2xcore/__init__.py deleted file mode 100644 index da2fe08cd..000000000 --- a/tflite2xcore/tflite2xcore/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. -import sys -import ctypes - -from pathlib import Path - -__PARENT_DIR = Path(__file__).parent.absolute() -if sys.platform.startswith("linux"): - lib_path = str(__PARENT_DIR / "libs" / "linux" / "libflexbuffers.so") -elif sys.platform == "darwin": - lib_path = str(__PARENT_DIR / "libs" / "macos" / "libflexbuffers.dylib") -else: - raise RuntimeError("tflite2xcore is not yet supported on Windows!") - -libflexbuffers = ctypes.cdll.LoadLibrary(lib_path) -from . import version - -__version__ = version.get_version() - -from . import xcore_schema -from . import xcore_model -from . import execution_planning -from . import converter -from . import pass_manager -from . import parallelization -from . import tflite_visualize -from . import utils -from . import analyze -from . import model_generation diff --git a/tflite2xcore/tflite2xcore/analyze.py b/tflite2xcore/tflite2xcore/analyze.py deleted file mode 100644 index 1f2e732e9..000000000 --- a/tflite2xcore/tflite2xcore/analyze.py +++ /dev/null @@ -1,145 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import logging -from copy import copy - -from tflite2xcore.xcore_model import XCOREModel - - -def calc_subgraph_mem_req(subgraph): - operators = copy(subgraph.operators) - coexisting = set(subgraph.inputs) - op_mem_reqs = dict() - while operators: - op = operators.pop(0) - needed_tensors = op.inputs + op.outputs - coexisting.update(needed_tensors) - - op_mem_reqs[op.name] = { - "buffer_tensors": { - tensor.name: len(tensor.buffer.data) - for tensor in coexisting - if len(tensor.buffer.data) - }, - "arena_tensors": { - tensor.name: tensor.size - for tensor in coexisting - if not len(tensor.buffer.data) - }, - "init": 500, # TODO: this is a rough estimate - } - op_mem_reqs[op.name]["buffers"] = sum( - v for v in op_mem_reqs[op.name]["buffer_tensors"].values() - ) - op_mem_reqs[op.name]["arena"] = sum( - v for v in op_mem_reqs[op.name]["arena_tensors"].values() - ) - - coexisting = { - tensor - for tensor in coexisting - if ( - [consumer for consumer in tensor.consumers if consumer in operators] - or tensor in subgraph.outputs - ) - } - - return { - "op_mem_reqs": op_mem_reqs, - "buffers": sum( - len(buffer.data) - for buffer in subgraph.model.buffers - if [owner for owner in buffer.owners if owner in subgraph.tensors] - ), - "arena": max(op_info["arena"] for op_info in op_mem_reqs.values()), - "init": sum(op_info["init"] for op_info in op_mem_reqs.values()), - } - - -def analyze_model(model): - analysis = { - "subgraphs": [calc_subgraph_mem_req(subgraph) for subgraph in model.subgraphs] - } - analysis["buffers"] = sum(len(buffer.data) for buffer in model.buffers) - analysis["arena"] = max( - subgraph_info["arena"] for subgraph_info in analysis["subgraphs"] - ) - analysis["init"] = sum( - subgraph_info["init"] for subgraph_info in analysis["subgraphs"] - ) - - return analysis - - -# TODO: remove this someday since analysis should not rely on an interpreter -# however, currently the interpreter is the only method to determine the -# size of the tensor arena -def calc_arena_size(model_content): - try: - from xcore_interpreters import XCOREInterpreter - - with XCOREInterpreter(model_content=model_content) as interpreter: - logger = logging.getLogger("tensor_arena_allocations") - [logger.info(line) for line in interpreter.get_allocations().split("\n")] - return interpreter.tensor_arena_size - except RuntimeError as e: - print("Runtime Error: Failed calculating tensor arena size.") - print(str(e)) - - return None - - -def calc_weight_and_bias_fetch_sizes(model_content): - max_weights_size = 0 - max_bias_size = 0 - model = XCOREModel.deserialize(model_content) - for subgraph in model.subgraphs: - for op in subgraph.operators: - if "mem" in op.custom_options: - max_weights_size = max(max_weights_size, op.custom_options["mem"][0]) - max_bias_size = max(max_bias_size, op.custom_options["mem"][1]) - - return max_weights_size, max_bias_size - - -def print_report(tflite_output_path): - indent = " " * 2 - - with open(tflite_output_path, "rb") as fd: - model_content = fd.read() - model_size = len(model_content) - try: - tensor_arena_size = calc_arena_size(model_content) - max_weights_size, max_bias_size = calc_weight_and_bias_fetch_sizes( - model_content - ) - print(f"Model size: {model_size} (bytes)") - print() - if tensor_arena_size: - ram_used = model_size + tensor_arena_size - print("Model stored in RAM") - print(f"{indent}Tensor arena size: {tensor_arena_size} (bytes)") - print() - print(f"{indent}Total RAM required: {ram_used} (bytes)") - print() - if max_weights_size and max_bias_size: - print("Model stored in external memory (Flash or LPDDR)") - tensor_arena_size += max_weights_size + max_bias_size - print(f"{indent}Tensor arena size: {tensor_arena_size} (bytes)") - print() - print(f"{indent}Total RAM required: {tensor_arena_size}") - print(f"{indent}Total external memory required: {model_size}") - print() - else: - print("Unable to determine model memory requirements.") - except RuntimeError as e: - prefix = "Didn't find op for builtin opcode " - msg = e.args[0] - if msg.startswith(prefix): - op_details = msg.split("\n", 1)[0][len(prefix) :] - logging.warning( - f"Arena size calculation failed because of unknown op in the interpreter: {op_details}" - ) - else: - raise diff --git a/tflite2xcore/tflite2xcore/converter.py b/tflite2xcore/tflite2xcore/converter.py deleted file mode 100644 index 2aca5c6d7..000000000 --- a/tflite2xcore/tflite2xcore/converter.py +++ /dev/null @@ -1,359 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import os -import logging -import tempfile -import subprocess - -from pathlib import Path -from typing import Optional, Union, Any - -from tflite2xcore.pass_manager import PassManager -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore import transformation_passes as passes - - -XFORMER2_PATH = ( - Path(__file__).resolve().parents[2] - / "experimental" - / "xformer" - / "bazel-bin" - / "xcore-opt" -) - - -class CleanupManager(PassManager): - def __init__(self, model: Optional[XCOREModel] = None, **kwargs: Any) -> None: - super().__init__(model, **kwargs) - self.register_pass(passes.EliminateDeadOperatorsPass()) - self.register_pass(passes.EliminateDeadTensorsPass()) - self.register_pass(passes.EliminateDeadBuffersPass()) - - -class BasicCanonicalizationManager(PassManager): - def __init__( - self, - model: Optional[XCOREModel] = None, - *, - remove_float_interface: bool, - **kwargs: Any, - ) -> None: - super().__init__(model, **kwargs) - self.register_pass(passes.CanonicalizeEmptyBuffersPass()) - - if remove_float_interface: - self.register_pass(passes.CanonicalizeQuantizedInputPass()) - self.register_pass(passes.CanonicalizeQuantizedOutputPass()) - - # start with a round of constant folding - self.register_pass(passes.ConstantPropagationPass()) - - # canonicalize single pixel convolution - # 1x1 convolutions acting on 1x1 inputs (without padding) map trivially - # to a fully connected, so we canoncalize these to a builtin FULLY_CONNECTED - self.register_pass(passes.CanonicalizeSinglePixelConv2DPass()) - - # canonicalize reshape - # this ensures that RESHAPE has a single input tensor - # (no dynamic reshapes are currently supported) - self.register_pass(passes.CanonicalizeReshapePass()) - self.register_passes(CleanupManager()) # this is needed - - # canonicalize fully connected shapes - # the FC implementation flattens implicitly, so we remove RESHAPES before - # and after FULLY_CONNECTED ops - self.register_pass(passes.RemovePrecedingReshapePass()) - self.register_pass(passes.RemoveSubsequentReshapePass()) - - # canonicalize single channel depthwise convolutions - # depthwise convolutions with one input channel map trivially to ordinary - # convolutions with `depth_multiplier` output channels - self.register_pass(passes.CanonicalizeSingleinDepthwiseConv2DPass()) - self.register_pass(passes.LegalizeSingleinConv2DPass()) - - # canonicalize quantize ops - # two consecutive quantize ops have no effect besides adding error - self.register_pass(passes.RemoveRedundantInt8RequantizationPass()) - # the TFLM interpreter does not support newer versions of quantized - # so we downgrade where safe - self.register_pass(passes.LegalizeQuantizeVersionPass()) - - # need to cleanup after the intial canonicalization - self.register_passes(CleanupManager()) - - -class WordAlignmentCanonicalizationManager(PassManager): - def __init__(self, model: Optional[XCOREModel] = None, **kwargs: Any) -> None: - super().__init__(model, **kwargs) - - # canonicalize word alignment of inputs - # we insert explicit channel-wise padding to ensure that - # input channel counts to convolutions are divisible by 4 - # (this is currently required by our kernels) - self.register_pass(passes.CanonicalizeConv2DInputChannels()) - - -class ActivationLoweringManager(PassManager): - def __init__(self, model: Optional[XCOREModel] = None, experimental_xformer2: bool = False, **kwargs: Any) -> None: - super().__init__(model, **kwargs) - - # first we match ops and replace them - if not experimental_xformer2: - self.register_pass(passes.ReplaceReLUPass()) - self.register_pass(passes.ReplaceReLU6Pass()) - self.register_pass(passes.ReplaceTanhPass()) - self.register_pass(passes.ReplaceLogisticPass()) - # second we legalize the op by calculating the LUT - self.register_pass(passes.LegalizeXCLookupTablePass()) - - -class PoolingLoweringManager(PassManager): - def __init__(self, model: Optional[XCOREModel] = None, **kwargs: Any) -> None: - super().__init__(model, **kwargs) - - self.register_pass(passes.ReplaceMaxPool2D2x2Pass()) - self.register_pass(passes.ReplaceMaxPool2DPass()) - self.register_pass(passes.ReplaceAveragePool2D2x2Pass()) - self.register_pass(passes.ReplaceAveragePool2DPass()) - self.register_pass(passes.ReplaceGlobalAveragePool2DPass()) - - -class ParametricOperatorLoweringManager(PassManager): - def __init__( - self, - model: Optional[XCOREModel] = None, - *, - experimental_xformer2: bool = False, - **kwargs: Any, - ) -> None: - super().__init__(model, **kwargs) - - # first we match ops and replace them - if not experimental_xformer2: - self.register_pass(passes.ReplaceFullyConnectedPass()) - self.register_pass(passes.Replace1x1Conv2dPass()) - self.register_pass(passes.ReplaceShallowinConv2dPass()) - self.register_pass(passes.ReplaceDepthwiseConv2dPass()) - self.register_pass(passes.ReplaceDeepConv2dPass()) - - # second we legalize them by reshaping weight/bias tensors, - # calculating parameters specific to our kernels, - # and populating the custom options - if not experimental_xformer2: - self.register_pass(passes.LegalizeXCFullyConnectedPass()) - self.register_pass(passes.LegalizeXC1x1ConvPass()) - self.register_pass(passes.LegalizeXCShallowinConvPass()) - self.register_pass(passes.LegalizeXCDepthwiseConvPass()) - self.register_pass(passes.LegalizeXCDeepConvPass()) - - -class PaddingOptimizationManager(PassManager): - def __init__( - self, - model: Optional[XCOREModel] = None, - *, - remove_input_alignment_pad: bool, - experimental_xformer2: bool = False, - **kwargs: Any, - ) -> None: - super().__init__(model, **kwargs) - - # canonicalize by ensuring that spatial and other dims are decoupled - # first fuse consecutive PAD ops - # (injected by word alignment, bconv2d padding legalization, etc.) - self.register_pass(passes.FuseConsecutivePadsPass()) - # second split batch/channel-wise padding from spatial padding - self.register_pass(passes.SplitPaddingPass()) - - # we optimize the convolutions by fusing it with spatial padding - self.register_pass(passes.FuseConv2dPaddingPass()) - if remove_input_alignment_pad: - # remove word alignment padding on the input - self.register_pass(passes.RemovePaddingInputPass()) - # replace with optimized implementation where possible - self.register_pass(passes.ReplacePadPass()) - - # Fuse back any remaining PAD operators - self.register_pass(passes.FuseConsecutivePadsPass()) - - -class ParallelizationManager(PassManager): - def __init__( - self, model: Optional[XCOREModel] = None, *, num_threads: int, **kwargs: Any - ) -> None: - super().__init__(model, **kwargs) - - self.register_pass( - passes.ParallelizeFullyConnectedPass(num_threads=num_threads) - ) - self.register_pass(passes.ParallelizeConv2dPass(num_threads=num_threads)) - self.register_pass( - passes.ParallelizeDepthwiseConv2dPass(num_threads=num_threads) - ) - self.register_pass(passes.ParallelizePooling2DPass(num_threads=num_threads)) - self.register_pass( - passes.ParallelizeGlobalAveragePool2DPass(num_threads=num_threads) - ) - - self.register_pass(passes.ParallelizeBConv2dBinPass(num_threads=num_threads)) - self.register_pass(passes.ParallelizeBConv2dInt8Pass(num_threads=num_threads)) - self.register_pass(passes.ParallelizeAddPass(num_threads=num_threads)) - self.register_pass(passes.ParallelizeLUTPass(num_threads=num_threads)) - # pass_mgr.register_pass(passes.ParallelizeRequant16To8Pass(num_threads=num_threads)) # intentionally disabled - - # NOTE: scratch memory passes must be registered after parallelization passes - # TODO: it would be better if scratch memory calculation could be decoupled from parallelization - self.register_pass(passes.ScratchMemoryConv2dPass()) - self.register_pass(passes.ScratchMemoryConv2d1x1Pass()) - self.register_pass(passes.ScratchMemoryDepthwiseConv2dPass()) - self.register_pass(passes.ScratchMemoryFullyConnectedPass()) - - -class BinarizedOperatorLoweringManager(PassManager): - def __init__(self, model: Optional[XCOREModel] = None, **kwargs: Any) -> None: - super().__init__(model, **kwargs) - - # map LceQuantize to our bsign op - self.register_pass(passes.ReplaceLceQuantizePass()) - - # match bconv2d ops and replace them - self.register_pass(passes.ReplaceBconv2DBitpackedDeepInPass()) - self.register_pass(passes.ReplaceBconv2DBitpackedPass()) - self.register_pass(passes.ReplaceBconv2DInt8DeepInDeepOutPass()) - self.register_pass(passes.ReplaceBconv2DInt8Pass()) - - # we legalize the padding by injecting an explicit PAD where needed - self.register_pass(passes.LegalizeXCBconv2DPaddingPass()) - - # legalize the parameter tensors and custom options - self.register_pass(passes.LegalizeBconv2dBitpackedDeepInPass()) - self.register_pass(passes.LegalizeBconv2dBitpackedPass()) - self.register_pass(passes.LegalizeBconv2dInt8DeepInDeepOutPass()) - self.register_pass(passes.LegalizeBconv2dInt8Pass()) - - -class ExternalMemoryOptimizationManager(PassManager): - def __init__(self, model: Optional[XCOREModel] = None, **kwargs: Any) -> None: - super().__init__(model, **kwargs) - self.register_pass(passes.InsertExternalMemoryFetchPass()) - - -class FinalizationManager(PassManager): - def __init__( - self, - model: Optional[XCOREModel] = None, - *, - cleanup: bool, - minification: bool, - **kwargs: Any, - ) -> None: - super().__init__(model, **kwargs) - if cleanup: - self.register_passes(CleanupManager()) - - # TODO: this is actually a canonicalization pass - self.register_pass(passes.LegalizeOperatorOutputTensorNamePass()) - - self.register_pass(passes.FloatingPointWarningPass()) - - self.register_pass(passes.UnifyEmptyBuffersPass()) - self.register_pass(passes.EliminateDeadBuffersPass()) - - if minification: - self.register_pass(passes.MinifyQuantInfoPass()) - self.register_pass(passes.MinifyTensorNamesPass()) - - -def optimize_for_xcore( - model: XCOREModel, - *, - cleanup: bool = True, - minification: bool = False, - num_threads: Optional[int] = None, - intermediates_path: Optional[Union[str, Path]] = None, - remove_input_alignment_pad: bool = False, - remove_float_interface: bool = False, - external_memory: bool = False, - experimental_xformer2: bool = False, -) -> XCOREModel: - num_threads = num_threads or 1 - intermediates_path = Path(intermediates_path) if intermediates_path else None - - pass_mgr = PassManager(model, keep_intermediates=bool(intermediates_path)) - - # canonicalization - pass_mgr.register_passes( - BasicCanonicalizationManager(remove_float_interface=remove_float_interface) - ) - pass_mgr.register_passes(WordAlignmentCanonicalizationManager()) - - # lowering to the xcore ops - pass_mgr.register_passes(ActivationLoweringManager(experimental_xformer2=experimental_xformer2)) - pass_mgr.register_passes(PoolingLoweringManager()) - pass_mgr.register_passes(BinarizedOperatorLoweringManager()) - - if experimental_xformer2: - try: - pass_mgr.run_passes() - model.sanity_check() - finally: - if intermediates_path: - pass_mgr.save_intermediates(intermediates_path / "pre_xformer2") - intermediates_path /= "post_xformer2" - - with tempfile.TemporaryDirectory(suffix=str(os.getpid())) as dirname: - input_path = Path(dirname) / "input.tflite" - model.write_flatbuffer(input_path) - - output_path = Path(dirname) / "output.tflite" - cmd = [str(XFORMER2_PATH), str(input_path), "-o", str(output_path)] - p = subprocess.run(cmd, capture_output=True, check=True) - logging.debug(p.stdout) - - model = XCOREModel.read_flatbuffer(output_path) - - pass_mgr = PassManager(model, keep_intermediates=bool(intermediates_path)) - - pass_mgr.register_passes( - ParametricOperatorLoweringManager(experimental_xformer2=experimental_xformer2) - ) - - # TODO: finish these and find a manager for them: - pass_mgr.register_pass(passes.ReplaceAddPass()) - - # optimizations on xcore ops - pass_mgr.register_passes( - PaddingOptimizationManager( - remove_input_alignment_pad=remove_input_alignment_pad, experimental_xformer2=experimental_xformer2 - ) - ) - pass_mgr.register_passes(ParallelizationManager(num_threads=num_threads)) - if external_memory: - pass_mgr.register_passes(ExternalMemoryOptimizationManager()) - - # finalize (cleanup, minification, renaming, etc.) - pass_mgr.register_passes( - FinalizationManager(minification=minification, cleanup=cleanup) - ) - - try: - pass_mgr.run_passes() - model.sanity_check() - finally: - if intermediates_path: - pass_mgr.save_intermediates(intermediates_path) - - model.description = model.description + " + XMOS optimized." - - return model - - -def convert( - tflite_input_path: Union[str, Path], - tflite_output_path: Union[str, Path], - **kwargs: Any, -) -> None: - model = XCOREModel.read_flatbuffer(tflite_input_path) - model = optimize_for_xcore(model, **kwargs) - model.write_flatbuffer(tflite_output_path) diff --git a/tflite2xcore/tflite2xcore/execution_planning.py b/tflite2xcore/tflite2xcore/execution_planning.py deleted file mode 100644 index 1cc60d080..000000000 --- a/tflite2xcore/tflite2xcore/execution_planning.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from abc import ABC, abstractmethod -from typing import Sequence, Dict - -from tflite2xcore import xcore_schema as xir - - -class ExecutionPlanner(ABC): - def __init__(self, subgraph: xir.Subgraph): - self._graph = subgraph - - @abstractmethod - def make_plan(self) -> Sequence[xir.Operator]: - raise NotImplementedError() - - -class ReverseDepthFirstPlanner(ExecutionPlanner): - def make_plan(self) -> Sequence[xir.Operator]: - # rely on dict's insertion order guarantee (CPython 3.6+) - reverse_op_order: Dict[xir.Operator, None] = {} - - # initialize the op stack with a sentinel that we'll remove later - sentinel_op = self._graph.create_operator( - xir.OperatorCode(xir.XCOREOpCodes.DUMMY), - inputs=self._graph.outputs, - ) - sentinel_op.name = "SENTINEL" - op_stack = [sentinel_op] - - # dependency counts to be used to resolve ops that have multiple consumers - dependency_counts: Dict[xir.Operator, int] = {sentinel_op: 1} - - while op_stack: - op = op_stack.pop(-1) - if op in reverse_op_order: - # op already scheduled - continue - - if op not in dependency_counts: - # this is the first time we see this op, so count the dependencies - dependency_counts[op] = len( - {c for t in op.outputs for c in t.consumers} - ) - - if dependency_counts[op] <= 0: - raise Exception( - "Found operator with 0 or fewer dependencies (the graph may be corrupted)" - ) - - dependency_counts[op] -= 1 - if dependency_counts[op]: - # skip scheduling of op if there are other dependents - continue - - reverse_op_order[op] = None - for tin in sorted(op.inputs, key=lambda t: t.size): - op_stack.extend(tin.producers) - - # remove sentinel op - self._graph.remove_operator(sentinel_op) - del reverse_op_order[sentinel_op] - - # return ops in reverse order - return list(reversed(list(reverse_op_order.keys()))) diff --git a/tflite2xcore/tflite2xcore/model_generation/__init__.py b/tflite2xcore/tflite2xcore/model_generation/__init__.py deleted file mode 100644 index 8368df080..000000000 --- a/tflite2xcore/tflite2xcore/model_generation/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import tensorflow as tf -from typing import Union, Dict, Any, TypeVar -from typing_extensions import Protocol - -from tflite2xcore.utils import TFLiteModel - -Configuration = Dict[str, Any] - -T_co = TypeVar("T_co", covariant=True) - - -class Hook(Protocol[T_co]): - def __call__(self) -> T_co: - ... - - -from .model_generators import ModelGenerator diff --git a/tflite2xcore/tflite2xcore/model_generation/converters.py b/tflite2xcore/tflite2xcore/model_generation/converters.py deleted file mode 100644 index 095f0d45c..000000000 --- a/tflite2xcore/tflite2xcore/model_generation/converters.py +++ /dev/null @@ -1,161 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import os -import logging -import pathlib -import tempfile -import subprocess - -import tensorflow as tf -import larq_compute_engine as lce -from abc import abstractmethod -from typing import Union - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.converter import optimize_for_xcore, XFORMER2_PATH -from tflite2xcore.utils import quantize_converter - -from . import TFLiteModel, Configuration, Hook - -from .runners import Runner, RunnerDependent - -class Converter(RunnerDependent): - """Superclass for defining model conversion logic and storing converted models. - - Converter objects are registered in Runner objects. - """ - - _model: TFLiteModel - _model_params: str - - def __init__( - self, - runner: Runner, - input_model_hook: Hook[Union[TFLiteModel, tf.keras.Model]], - ) -> None: - self._runner = runner - self._input_model_hook = input_model_hook - - def get_converted_model(self) -> TFLiteModel: - try: - return self._model - except AttributeError: - raise Exception( - "Cannot get converted model before converter is run!" - ) from None - - def get_converted_model_params(self) -> str: - return self._model_params - - @abstractmethod - def convert(self) -> None: - """Sets self._model as defined in subclasses. - - This method should be called after the set_config method has prepared - the converter. - """ - raise NotImplementedError() - - -class KerasModelConverter(Converter): - """ Converts a Keras model to a TFLite model. """ - - _input_model_hook: Hook[tf.keras.Model] - - def __init__(self, runner: Runner, input_model_hook: Hook[tf.keras.Model]) -> None: - super().__init__(runner, input_model_hook) - - -class TFLiteFloatConverter(KerasModelConverter): - """ Converts a Keras model to a floating point TFLite model. """ - - def convert(self) -> None: - self._model = tf.lite.TFLiteConverter.from_keras_model( - self._input_model_hook() - ).convert() - - -class TFLiteQuantConverter(KerasModelConverter): - """ Converts a Keras model to a quantized TFLite model. """ - - def __init__( - self, - runner: Runner, - input_model_hook: Hook[tf.keras.Model], - repr_data_hook: Hook[tf.Tensor], - ) -> None: - super().__init__(runner, input_model_hook) - self._repr_data_hook = repr_data_hook - - def convert(self) -> None: - converter = tf.lite.TFLiteConverter.from_keras_model(self._input_model_hook()) - quantize_converter(converter, representative_data=self._repr_data_hook()) - self._model = converter.convert() - - -class XCoreConverter(Converter): - """ Converts a (quantized) TFLite model to an xcore.ai-optimized TFLite model. """ - - def __init__( - self, - runner: Runner, - input_model_hook: Hook[TFLiteModel], - *, - experimental_xformer2: bool = False, - only_experimental_xformer2: bool = False - ) -> None: - super().__init__(runner, input_model_hook) - self._experimental_xformer2 = experimental_xformer2 - self._only_experimental_xformer2 = only_experimental_xformer2 - - def _set_config(self, cfg: Configuration) -> None: - if "num_threads" not in self._config: - self._config["num_threads"] = cfg.pop("num_threads", 1) - - def convert(self) -> None: - model = self._input_model_hook() - if self._only_experimental_xformer2: - with tempfile.TemporaryDirectory(suffix=str(os.getpid())) as dirname: - input_path = pathlib.Path(dirname) / "input.tflite" - flash_image_file_path = pathlib.Path(dirname) / "model.params" - - with open(pathlib.Path(input_path).resolve(), "wb") as fd: - fd.write(model) - - output_path = pathlib.Path(dirname) / "output.tflite" - cmd = [str(XFORMER2_PATH), str(input_path), "-o", str(output_path),"--xcore-flash-image-file", str(flash_image_file_path)] - p = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, check=True) - logger = logging.getLogger() - logger.debug(p.stdout) - - with open(pathlib.Path(output_path).resolve(), "rb") as fd: - bits = bytes(fd.read()) - with open(pathlib.Path(flash_image_file_path).resolve(), "rb") as fd: - params = bytes(fd.read()) - - self._model = bits - self._model_params = params - - else: - model = XCOREModel.deserialize(model) - model = optimize_for_xcore( - model, - num_threads=self._config["num_threads"], - experimental_xformer2=self._experimental_xformer2, - ) - self._model = model.serialize() - self._model_params = None - - -class LarqConverter(KerasModelConverter): - """ Converts a Larq model to a TFLite model. """ - - def convert(self) -> None: - self._model = lce.convert_keras_model( - self._input_model_hook(), - inference_input_type=tf.int8, - inference_output_type=tf.int8, - target="xcore", - experimental_enable_bitpacked_activations=True, - ) diff --git a/tflite2xcore/tflite2xcore/model_generation/data_factories.py b/tflite2xcore/tflite2xcore/model_generation/data_factories.py deleted file mode 100644 index 6060381a0..000000000 --- a/tflite2xcore/tflite2xcore/model_generation/data_factories.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import tensorflow as tf -from abc import abstractmethod -from typing import Tuple, Optional, Any - -from . import Configuration, Hook -from .utils import parse_init_config -from .runners import Runner, RunnerDependent - - -class DataFactory(RunnerDependent): - @abstractmethod - def make_data(self) -> Any: - raise NotImplementedError() - - -class TensorDataFactory(DataFactory): - def __init__( - self, - runner: Runner, - shape_hook: Hook[Tuple[int, ...]], - dtype: tf.dtypes.DType = tf.float32, - ): - super().__init__(runner) - self._shape_hook = shape_hook - self._dtype = dtype - - @abstractmethod - def make_data(self, batch: Optional[int] = None) -> tf.Tensor: - raise NotImplementedError() - - -class InitializerDataFactory(TensorDataFactory): - @property - @abstractmethod - def initializer(self) -> tf.keras.initializers.Initializer: - raise NotImplementedError() - - def make_data(self, batch: Optional[int] = None) -> tf.Tensor: - shape = self._shape_hook() - if batch is not None: - shape = (batch, *shape) - - return self.initializer(shape, dtype=self._dtype) - - -class InputInitializerDataFactory(InitializerDataFactory): - def _set_config(self, cfg: Configuration) -> None: - if "input_init" not in self._config: - self._config["input_init"] = cfg.pop("input_init", ("RandomUniform", -1, 1)) - super()._set_config(cfg) - - @property - def initializer(self) -> tf.keras.initializers.Initializer: - return parse_init_config(*self._config["input_init"]) diff --git a/tflite2xcore/tflite2xcore/model_generation/evaluators.py b/tflite2xcore/tflite2xcore/model_generation/evaluators.py deleted file mode 100644 index 72be5f7ac..000000000 --- a/tflite2xcore/tflite2xcore/model_generation/evaluators.py +++ /dev/null @@ -1,198 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import tensorflow as tf -import numpy as np -import larq_compute_engine as lce -from abc import abstractmethod -from typing import Union - -from xtflm_interpreter import XTFLMInterpreter - -from tflite2xcore.utils import ( - quantize, - QuantizationTuple, - apply_interpreter_to_examples, -) - -from . import TFLiteModel, Hook - -from .runners import Runner, RunnerDependent - - -class Evaluator(RunnerDependent): - """Superclass for defining model evaluation logic. - - Evaluator objects are registered in Runner objects. - Evaluation means that output data is generated for a given - input, but it does not mean that a model is compared to another one. - """ - - _input_data: np.ndarray - _output_data: np.ndarray - - def __init__( - self, - runner: Runner, - input_data_hook: Hook[Union[tf.Tensor, np.ndarray]], - model_hook: Hook[Union[tf.keras.Model, TFLiteModel]], - model_params_hook: Hook[str], - ) -> None: - self._runner = runner - self._input_data_hook = input_data_hook - self._model_hook = model_hook - self._model_params_hook = model_params_hook - - @property - def input_data(self) -> np.ndarray: - try: - return self._input_data - except AttributeError: - raise Exception("Cannot get input data before evaluator is run!") from None - - @input_data.setter - def input_data(self, data: Union[tf.Tensor, np.ndarray]) -> None: - self._input_data = np.array(data) - - @property - def output_data(self) -> np.ndarray: - try: - return self._output_data - except AttributeError: - raise Exception("Cannot get output data before evaluator is run!") from None - - @output_data.setter - def output_data(self, data: Union[tf.Tensor, np.ndarray]) -> None: - self._output_data = np.array(data) - - @abstractmethod - def evaluate(self) -> None: - """ Populates self._input_data and self._output_data. """ - raise NotImplementedError() - - -class TFLiteEvaluator(Evaluator): - """ Defines the evaluation logic for a TFLite float model. """ - - _interpreter: tf.lite.Interpreter - - def __init__( - self, - runner: Runner, - input_data_hook: Hook[Union[tf.Tensor, np.ndarray]], - model_hook: Hook[TFLiteModel], - model_params_hook: Hook[str], - ) -> None: - super().__init__(runner, input_data_hook, model_hook, model_params_hook) - - def set_interpreter(self) -> None: - self._interpreter = tf.lite.Interpreter(model_content=self._model_hook()) - - def set_input_data(self) -> None: - self.input_data = self._input_data_hook() - - def evaluate(self) -> None: - self.set_interpreter() - self._interpreter.allocate_tensors() - self.set_input_data() - self.output_data = apply_interpreter_to_examples( - self._interpreter, self.input_data - ) - del self._interpreter - - -class TFLiteQuantEvaluator(TFLiteEvaluator): - """Defines the evaluation logic for a quantized TFLite model. - - The input and output quantization parameters are inferred from the model. - """ - - _input_type: np.dtype - _input_quant: QuantizationTuple - _output_quant: QuantizationTuple - - def __init__( - self, - runner: Runner, - input_data_hook: Hook[Union[tf.Tensor, np.ndarray]], - model_hook: Hook[TFLiteModel], - model_params_hook: Hook[str], - ) -> None: - super().__init__(runner, input_data_hook, model_hook, model_params_hook) - - @property - def input_quant(self) -> QuantizationTuple: - try: - return self._input_quant - except AttributeError: - raise Exception( - "Cannot get input quantization before evaluator is run!" - ) from None - - @property - def output_quant(self) -> QuantizationTuple: - try: - return self._output_quant - except AttributeError: - raise Exception( - "Cannot get output quantization before evaluator is run!" - ) from None - - def set_input_data(self) -> None: - input_details = self._interpreter.get_input_details()[0] - self._input_quant = QuantizationTuple(*input_details["quantization"]) - self._input_type = np.dtype(input_details["dtype"]) - self._output_quant = QuantizationTuple( - *self._interpreter.get_output_details()[0]["quantization"] - ) - - super().set_input_data() - if ( - self._input_type in (np.int8, np.int16) - and self.input_data.dtype == np.float32 - ): - self.input_data = quantize( - self.input_data, *self._input_quant, dtype=self._input_type - ) - - -class XCoreEvaluator(TFLiteQuantEvaluator): - """Defines the evaluation logic for a TFLite float model. - - The input and output quantization parameters are inferred from the model. - """ - - def __init__( - self, - runner: Runner, - input_data_hook: Hook[Union[tf.Tensor, np.ndarray]], - model_hook: Hook[TFLiteModel], - model_params_hook: Hook[str], - use_device: bool = False, - ) -> None: - super().__init__(runner, input_data_hook, model_hook, model_params_hook) - self._use_device = use_device - - def evaluate(self) -> None: - if self._use_device: - print('Warning: use device deprecated') - - if self._model_params_hook(): - self._interpreter = XTFLMInterpreter(model_content=self._model_hook(), params_content=self._model_params_hook()) - else: - self._interpreter = XTFLMInterpreter(model_content=self._model_hook()) - - with self._interpreter: - self.set_input_data() - self.output_data = apply_interpreter_to_examples( - self._interpreter, self.input_data - ) - - del self._interpreter - - -class LarqEvaluator(Evaluator): - def evaluate(self) -> None: - interpreter = lce.tflite.python.interpreter.Interpreter(self._model_hook()) - self.input_data = self._input_data_hook() - self.output_data = interpreter.predict(self.input_data) diff --git a/tflite2xcore/tflite2xcore/model_generation/model_generators.py b/tflite2xcore/tflite2xcore/model_generation/model_generators.py deleted file mode 100644 index 77486ce2b..000000000 --- a/tflite2xcore/tflite2xcore/model_generation/model_generators.py +++ /dev/null @@ -1,72 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import logging -import tensorflow as tf -from pathlib import Path -from abc import abstractmethod -from typing import Tuple, Iterator -from contextlib import contextmanager - -from tflite2xcore.utils import set_all_seeds, LoggingContext - -from .runners import Runner, RunnerDependent - - -class ModelGenerator(RunnerDependent): - """Superclass for defining parameterized automatic model generation. - - The main use case of this class is generation of the integration test - models. - """ - - _model: tf.keras.Model - - def __init__(self, runner: Runner) -> None: - self._runner = runner - - @abstractmethod - def build(self) -> None: - """Sets the _model field as needed by the subclass. - - The configuration should be set using the _set_config method before - calling this. - """ - raise NotImplementedError() - - def get_model(self) -> tf.keras.Model: - try: - return self._model - except AttributeError: - raise Exception( - "Cannot get generated model before build is called!" - ) from None - - def _prep_backend(self) -> None: - tf.keras.backend.clear_session() - set_all_seeds() - - @property - def input_shape(self) -> Tuple[int, ...]: - return self._model.input_shape[1:] # type:ignore # pylint: disable=no-member - - @property - def output_shape(self) -> Tuple[int, ...]: - return self._model.output_shape[1:] # type:ignore # pylint: disable=no-member - - @contextmanager - def save_model(self, dirpath: Path) -> Iterator[None]: - """Saves the underlying model contents and make the object temporarily pickleable. - - A model subdirectory is created. - """ - self._model.save(dirpath / "model") - tmp = self._model - del self._model - yield - self._model = tmp - - def load_model(self, dirpath: Path) -> None: - # tf may complain about missing training config, so silence it - with LoggingContext(tf.get_logger(), logging.ERROR): - self._model = tf.keras.models.load_model(dirpath / "model", compile=False) diff --git a/tflite2xcore/tflite2xcore/model_generation/runners.py b/tflite2xcore/tflite2xcore/model_generation/runners.py deleted file mode 100644 index fb90c7984..000000000 --- a/tflite2xcore/tflite2xcore/model_generation/runners.py +++ /dev/null @@ -1,167 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import logging -import dill -import numpy as np -import tensorflow as tf -from pathlib import Path -from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Dict, Any, List, Union, Type, Iterable - -from tflite2xcore import tflite_visualize - -from . import Configuration, TFLiteModel - -if TYPE_CHECKING: - from .evaluators import Evaluator - from .converters import Converter - from .data_factories import DataFactory - from .model_generators import ModelGenerator - -ConvertedModels = Dict[str, TFLiteModel] - - -class Runner(ABC): - """Superclass for defining the behavior of model generation runs. - - A Runner registers a ModelGenerator object along with all the - converters, evaluators, and data factories. - """ - - converted_models: ConvertedModels - _converters: List["Converter"] - _evaluators: List["Evaluator"] - _data_factories: List["DataFactory"] - _config: Configuration - - def __init__(self, generator: Type["ModelGenerator"]) -> None: - self._model_generator = generator(self) - self._converters = [] - self._evaluators = [] - self._data_factories = [] - - def register_converter(self, converter: "Converter") -> None: - self._converters.append(converter) - - def register_evaluator(self, evaluator: "Evaluator") -> None: - self._evaluators.append(evaluator) - - def register_data_factory(self, data_factory: "DataFactory") -> None: - self._data_factories.append(data_factory) - - @abstractmethod - def run(self) -> None: - """ Defines how the runner should be run once configured. """ - self._model_generator.build() - self.converted_models = {} - - def get_built_model(self) -> tf.keras.Model: - return self._model_generator.get_model() - - def check_config(self) -> None: - """ Checks if the current configuration parameters are legal. """ - # TODO: extend to converters and evaluators - self._model_generator.check_config() - - def _set_config(self, cfg: Configuration) -> None: - """Sets the relevant configuration parameters. - - This method operates on the config input argument in-place. - Subclasses should override this instead of the set_config method. - """ - self._model_generator._set_config(cfg) - for converter in self._converters: - converter._set_config(cfg) - for evaluator in self._evaluators: - evaluator._set_config(cfg) - for data_factory in self._data_factories: - data_factory._set_config(cfg) - - def set_config(self, **config: Any) -> None: - """Configures the runner before it is called. - - Default values for missing configuration parameters are set. - Subclasses should override set_config instead of this method. - """ - self._config = {} - self._set_config(config) - if config: - raise ValueError( - f"Unexpected configuration parameter(s): {', '.join(config.keys())}" - ) - self.check_config() - - def save(self, dirpath: Union[Path, str]) -> Path: - """Saves the Runner contents to the specified directory. - - If the directory doesn't exist, it is created. - """ - dirpath = Path(dirpath) - dirpath.mkdir(parents=True, exist_ok=True) - - with self._model_generator.save_model(dirpath): - with open(dirpath / "runner.dill", "wb") as f: - dill.dump(self, f) - - return dirpath - - @classmethod - def load(cls, dirpath: Union[Path, str]) -> "Runner": - dirpath = Path(dirpath) - with open(dirpath / "runner.dill", "rb") as f: - obj: "Runner" = dill.load(f) - assert isinstance(obj, cls) - - obj._model_generator.load_model(dirpath) - return obj - - def dump_models(self, dirpath: Path, *, visualize: bool = True) -> None: - for name, model in self.converted_models.items(): - name = "model_" + name - model_path = (dirpath / name).with_suffix(".tflite") - model_html = model_path.with_suffix(".html") - with open(model_path, "wb") as f: - f.write(model) - logging.debug(f"{name} dumped to {model_path}") - if visualize: - tflite_visualize.main(model_path, model_html) - logging.debug(f"{name} visualization dumped to {model_html}") - - all_models_name = ",".join(self.converted_models.keys()) - all_models_path = (dirpath / f"model_{{{all_models_name}}}").with_suffix( - ".tflite" - ) - logging.info(f"Models dumped to {all_models_path}") - - @staticmethod - def dump_data( - dirpath: Path, - *, - data: Dict[str, Union[tf.Tensor, np.ndarray]], - example_idx: Union[int, Iterable[int]] = [], - ) -> None: - example_idx = [example_idx] if isinstance(example_idx, int) else example_idx - for key, arr in data.items(): - for j in example_idx: - with open(dirpath / f"example_{j}.{key}", "wb") as f: - f.write(np.array(arr[j]).tobytes()) - - -class RunnerDependent(ABC): - def __init__(self, runner: "Runner") -> None: - self._runner = runner - - @property - def _config(self) -> Configuration: - return self._runner._config - - def check_config(self) -> None: - pass - - def _set_config(self, cfg: Configuration) -> None: - """Sets the relevant configuration parameters and returns the unused ones. - - This method operates on the cfg input argument in-place. - """ - pass diff --git a/tflite2xcore/tflite2xcore/model_generation/utils.py b/tflite2xcore/tflite2xcore/model_generation/utils.py deleted file mode 100644 index d53d39426..000000000 --- a/tflite2xcore/tflite2xcore/model_generation/utils.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import os -import tensorflow as tf -from collections.abc import Iterable -from typing import Union, Any, Tuple - -from . import Configuration - - -class RandomUniform(tf.keras.initializers.RandomUniform): # type: ignore - def __call__( - self, shape: Tuple[int, ...], dtype: tf.dtypes.DType = None - ) -> tf.Tensor: - try: - return super().__call__(shape, dtype) - except Exception as e: - if e.args and e.args[0].startswith("Invalid dtype "): - dtype = tf.dtypes.as_dtype(dtype) - if dtype in (tf.int8, tf.int16): - if self.minval < dtype.min: - raise ValueError( - f"initializer minval = {self.minval} < {dtype.min} = dtype.min" - ) from None - elif self.maxval > dtype.max: - raise ValueError( - f"initializer maxval = {self.maxval} < {dtype.max} = dtype.max" - ) from None - else: - return tf.cast( - self._random_generator.random_uniform( - shape, self.minval, self.maxval, tf.int32 - ), - dtype, - ) - raise - - -def parse_init_config( - name: str, *args: Union[int, float] -) -> tf.keras.initializers.Initializer: - if name == "RandomUniform": - init = RandomUniform - else: - init = getattr(tf.keras.initializers, name) - return init(*args) - - -def stringify_config(cfg: Configuration) -> str: - def stringify_value(v: Any) -> str: - if not isinstance(v, str) and isinstance(v, Iterable): - v = "(" + ",".join(str(c) for c in v) + ")" - return str(v).replace(" ", "_") - - return os.sep.join(k + "=" + stringify_value(v) for k, v in sorted(cfg.items())) diff --git a/tflite2xcore/tflite2xcore/parallelization.py b/tflite2xcore/tflite2xcore/parallelization.py deleted file mode 100644 index 71febad62..000000000 --- a/tflite2xcore/tflite2xcore/parallelization.py +++ /dev/null @@ -1,343 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import math -import logging -from abc import ABC, abstractmethod -from functools import partial -from typing import ( - Dict, - Any, - Callable, - List, - Tuple, - Optional, - SupportsFloat, - NamedTuple, - Generic, - TypeVar, - Sequence, -) - -from tflite2xcore.utils import ACC_PERIOD_INT8, WORD_SIZE_BYTES - -MAX_THREADS = 5 -CHANNEL_GROUP_SIZE = ACC_PERIOD_INT8 - - -class ParallelizationPlan(ABC): - def __init__( - self, num_threads: int, *, fixed_cost_per_thread: SupportsFloat - ) -> None: - self._num_threads = num_threads - self._fixed_cost_per_thread = fixed_cost_per_thread - - def estimate_fixed_cost(self) -> float: - return self._num_threads * float(self._fixed_cost_per_thread) - - @abstractmethod - def estimate_cost(self) -> SupportsFloat: - raise NotImplementedError() - - def __repr__(self) -> str: - return f"{type(self).__name__} (num_threads={self._num_threads}, cost={self.estimate_cost()})" - - def to_dict(self) -> Dict[str, Any]: - return {"th": self._num_threads} - - -class ElementWiseParallelizationPlan(ParallelizationPlan): - def __init__( - self, - num_threads: int, - *, - job_sizes: Optional[Sequence[int]] = None, - **kwargs: Any, - ) -> None: - super().__init__(num_threads, **kwargs) - self._job_sizes = list(job_sizes or []) - - def estimate_cost(self) -> SupportsFloat: - return max(self._job_sizes) + self.estimate_fixed_cost() - - def to_dict(self) -> Dict[str, Any]: - d = super().to_dict() - if self._job_sizes: - d["eg"] = self._job_sizes - return d - - -class _ChannelGroup(NamedTuple): - begin: int - end: int - - -class ChannelGroupParallelizationPlan(ParallelizationPlan): - def __init__( - self, - num_threads: int, - *, - channel_groups: Optional[Sequence[_ChannelGroup]] = None, - **kwargs: Any, - ) -> None: - super().__init__(num_threads, **kwargs) - self._channel_groups = list(channel_groups or []) - - def _estimate_channel_group_cost(self, changrp: _ChannelGroup) -> int: - if changrp.begin - changrp.begin + 1 == CHANNEL_GROUP_SIZE: - return 1 - else: - return 2 # NOTE: 2 might be a bit aggressive - - def estimate_cost(self) -> SupportsFloat: - return ( - sum( - self._estimate_channel_group_cost(changrp) - for changrp in self._channel_groups - ) - / self._num_threads - ) - - def to_dict(self) -> Dict[str, Any]: - d = super().to_dict() - if self._channel_groups: - d["cg"] = [tuple(t) for t in self._channel_groups] - return d - - -class _RowColumnSlice(NamedTuple): - top: int - left: int - rows: int - cols: int - - -class RowColumnParallelizationPlan(ChannelGroupParallelizationPlan): - def __init__( - self, - num_threads: int, - *, - row_column_slices: Optional[Sequence[_RowColumnSlice]] = None, - **kwargs: Any, - ) -> None: - super().__init__(num_threads, **kwargs) - self._row_col_slices = row_column_slices or [] - - def to_dict(self) -> Dict[str, Any]: - d = super().to_dict() - if self._row_col_slices is not None: - d["rc"] = [tuple(t) for t in self._row_col_slices] - return d - - def _estimate_row_slice_cost(self, row_col_slice: _RowColumnSlice) -> int: - return row_col_slice.rows * row_col_slice.cols - - def estimate_cost(self) -> SupportsFloat: - cost = 0 - for changrp_slice in self._channel_groups: - changrp_cost = self._estimate_channel_group_cost(changrp_slice) - - # TODO: make this cost estimate more general - assert len(self._row_col_slices) <= self._num_threads - cost += changrp_cost * max( - self._estimate_row_slice_cost(row_slice) - for row_slice in self._row_col_slices - ) - - return cost + self.estimate_fixed_cost() - - -class ParallelizationPlanner(ABC): - def __init__( - self, - *, - num_threads: int, - forced: bool = False, - fixed_cost_per_thread: SupportsFloat = 0, - ) -> None: - assert 0 < num_threads <= MAX_THREADS - self.logger = logging.getLogger(self.__class__.__name__) - self._num_threads = num_threads - self._forced = forced - self._fixed_cost_per_thread = fixed_cost_per_thread - - @abstractmethod - def create_n_thread_candidates(self, num_threads: int) -> None: - pass - - def create_candidate_plans(self) -> None: - for n in range(self._num_threads): - self.create_n_thread_candidates(n + 1) - - @abstractmethod - def find_optimal_plan(self) -> ParallelizationPlan: - raise NotImplementedError() - - -_P = TypeVar("_P", bound=ParallelizationPlan) - - -class NaiveParallelizationPlanner(ParallelizationPlanner, Generic[_P]): - def __init__(self, **kwargs: Any) -> None: - super().__init__(**kwargs) - self._candidate_plans: List[_P] = [] - - def add_candidate_plan(self, plan: _P) -> None: - self._candidate_plans.append(plan) - - def find_optimal_plan(self) -> _P: - if not self._candidate_plans: - self.create_candidate_plans() - - best_plan = min(self._candidate_plans, key=lambda plan: plan.estimate_cost()) - - if best_plan._num_threads == self._num_threads: - self.logger.debug(f"found best plan: {repr(best_plan)}") - return best_plan - else: - forced_candidates = [ - plan - for plan in self._candidate_plans - if plan._num_threads == self._num_threads - ] - best_forced_plan = None - if forced_candidates: - best_forced_plan = min( - forced_candidates, key=lambda plan: plan.estimate_cost() - ) - - if self._forced: - if best_forced_plan: - self.logger.warning( - f"forcing suboptimal plan {repr(best_forced_plan)} " - f"when better alternative {repr(best_plan)} exists." - ) - return best_forced_plan - - self.logger.warning( - f"no forced plan could be found, resolving to {repr(best_plan)}" - ) - else: - self.logger.debug( - f"replacing suboptimal plan {repr(best_forced_plan)} " - f"with better alternative {repr(best_plan)}." - ) - return best_plan - - -class ElementWisePlanner(NaiveParallelizationPlanner[ElementWiseParallelizationPlan]): - def __init__( - self, num_elements: int, *, alignment: int = WORD_SIZE_BYTES, **kwargs: Any - ) -> None: - super().__init__(**kwargs) - assert num_elements > 0 - self._num_elements = num_elements - self._alignment = alignment - - def create_n_thread_candidates(self, num_threads: int) -> None: - r = self._num_elements % self._alignment - full_vectors = (self._num_elements - r) // self._alignment - p = full_vectors % num_threads - k = (full_vectors - p) // num_threads - - job_sizes = [ - k * self._alignment + (idx < p) * self._alignment - for idx in range(num_threads) - ] - job_sizes[-1] += r - assert sum(job_sizes) == self._num_elements - - if 0 not in job_sizes: - self.add_candidate_plan( - ElementWiseParallelizationPlan( - num_threads, - job_sizes=job_sizes, - fixed_cost_per_thread=self._fixed_cost_per_thread, - ) - ) - - -class ChannelGroupSlicePlanner( - NaiveParallelizationPlanner[ChannelGroupParallelizationPlan] -): - def __init__(self, num_channels_out: int, **kwargs: Any) -> None: - super().__init__(**kwargs) - self._cout = num_channels_out - - def split_channelwise(self) -> List[_ChannelGroup]: - changrps = [] - num_changrps = math.ceil(self._cout / CHANNEL_GROUP_SIZE) - for i in range(num_changrps): - Cbegin = i * CHANNEL_GROUP_SIZE - Cend = min(Cbegin + CHANNEL_GROUP_SIZE - 1, self._cout - 1) - changrps.append(_ChannelGroup(Cbegin, Cend)) - - return changrps - - def create_n_thread_candidates(self, num_threads: int) -> None: - changrps = self.split_channelwise() - if len(changrps) >= num_threads: - self.add_candidate_plan( - ChannelGroupParallelizationPlan( - num_threads, - channel_groups=changrps, - fixed_cost_per_thread=self._fixed_cost_per_thread, - ) - ) - - -class SlicePlanner(NaiveParallelizationPlanner[RowColumnParallelizationPlan]): - def __init__( - self, num_channels_out: int, height: int, width: int, **kwargs: Any - ) -> None: - super().__init__(**kwargs) - assert height * width > 0, f"received height={height}, width={width}" - self._height, self._width = height, width - kwargs.pop("num_threads") - self._ch_group_planner = partial( - ChannelGroupSlicePlanner, num_channels_out, **kwargs - ) - - def _split_unidirectionally( - self, dim: int, num_threads: int - ) -> Tuple[List[int], List[int]]: - adjustments: Dict[int, Callable[[int], List[int]]] = { - 1: lambda rem: [0], - 2: lambda rem: [int(rem >= 1), 0], - 3: lambda rem: [int(rem >= 1), 0, int(rem >= 2)], - 4: lambda rem: [int(rem >= 1), int(rem == 3), 0, int(rem >= 2)], - 5: lambda rem: [ - int(rem >= 1), - int(rem >= 3), - 0, - int(rem >= 4), - int(rem >= 2), - ], - } - - base, rem = dim // num_threads, dim % num_threads - block_lengths = [base + a for a in adjustments[num_threads](rem)] - block_starts = [0] - for j in range(num_threads - 1): - block_starts.append(block_starts[j] + block_lengths[j]) - return block_starts, block_lengths - - def _split_vertically(self, num_threads: int) -> List[_RowColumnSlice]: - starts, heights = self._split_unidirectionally(self._height, num_threads) - return [ - _RowColumnSlice(starts[j], 0, heights[j], self._width) - for j in range(num_threads) - if heights[j] > 0 - ] - - def create_n_thread_candidates(self, num_threads: int) -> None: - self.add_candidate_plan( - RowColumnParallelizationPlan( - num_threads, - channel_groups=self._ch_group_planner( - num_threads=num_threads - ).split_channelwise(), - row_column_slices=self._split_vertically(num_threads), - fixed_cost_per_thread=self._fixed_cost_per_thread, - ) - ) diff --git a/tflite2xcore/tflite2xcore/pass_manager.py b/tflite2xcore/tflite2xcore/pass_manager.py deleted file mode 100644 index 1d234b5d3..000000000 --- a/tflite2xcore/tflite2xcore/pass_manager.py +++ /dev/null @@ -1,105 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import logging -from pathlib import Path -from collections import deque -from math import log10, ceil -from typing import TYPE_CHECKING, Iterable, Optional, List, Tuple, Deque - -from tflite2xcore import tflite_visualize - -if TYPE_CHECKING: - from tflite2xcore.xcore_model import XCOREModel - from tflite2xcore.transformation_passes import ModelTransformationPass - - -class PassManager: - def __init__( - self, - model: Optional["XCOREModel"] = None, - *, - debug: bool = False, - keep_intermediates: bool = False, - ) -> None: - self._queue: Deque["ModelTransformationPass"] = deque() - self.logger = logging.getLogger(self.__class__.__name__) - self._model: Optional["XCOREModel"] = None - if model: - self.register_model(model) - self._mutating_passes: List[Tuple[int, str]] = [] - self._intermediates: List[bytes] = [] - self.keep_intermediates = keep_intermediates - - def register_model(self, model: "XCOREModel") -> None: - assert model - self._model = model - - @property - def passes(self) -> Iterable["ModelTransformationPass"]: - for trf_pass in self._queue: - yield trf_pass - - def register_passes(self, other_mgr: "PassManager") -> None: - for trf_pass in other_mgr.passes: - self.register_pass(trf_pass) - - def register_pass(self, trf_pass: "ModelTransformationPass") -> None: - self._queue.append(trf_pass) - - def pop_pass(self) -> "ModelTransformationPass": - return self._queue.popleft() - - def save_intermediates(self, dirpath: Path, *, visualize: bool = True) -> None: - if len(self._intermediates) == 0: - self.logger.warning("No intermediate models were recorded!") - - dirpath.mkdir(parents=True, exist_ok=True) - - fill_width = ceil(log10(self._mutating_passes[-1][0])) - for (j, _), bits in zip(self._mutating_passes, self._intermediates): - basepath = dirpath.joinpath( - f"model_{self.__class__.__name__}_{j:0{fill_width}d}" - ).resolve() - filepath = basepath.with_suffix(".tflite") - with open(filepath, "wb") as f: - f.write(bits) - if visualize: - tflite_visualize.main(filepath, basepath.with_suffix(".html")) - self.logger.debug(f"Saved {filepath}") - - def run_passes(self) -> None: - if not self._model: - raise Exception("No model registered!") - - num_passes = len(self._queue) - self.logger.debug(f"Running {num_passes} passes...") - for n in range(num_passes): - trf_pass = self.pop_pass() - - self.logger.debug(f"Running pass #{n}/{num_passes}: {trf_pass}..") - - modified = trf_pass.run(self._model) - if __debug__: - try: - self._model.sanity_check() - except AssertionError as e: - self.logger.exception(e) - - if modified: - self._mutating_passes.append((n, trf_pass.__class__.__name__)) - if self.keep_intermediates: - # switch descriptions for the intermediate models - new_desc = str(self._mutating_passes) - self._model.description, old_desc = ( - new_desc, - self._model.description, - ) - self._intermediates.append(self._model.serialize()) - self._model.description = old_desc - - msg = "\n".join( - [f" #{p[0]}/{num_passes}: {p[1]}" for p in self._mutating_passes] - ) - if msg: - self.logger.info(f"The following passes mutated the model:\n{msg}") diff --git a/tflite2xcore/tflite2xcore/py.typed b/tflite2xcore/tflite2xcore/py.typed deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/conftest.py b/tflite2xcore/tflite2xcore/tests/conftest.py deleted file mode 100644 index ace842d51..000000000 --- a/tflite2xcore/tflite2xcore/tests/conftest.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - - -# ---------------------------------------------------------------------------- -# HOOKS -# ---------------------------------------------------------------------------- - - -def pytest_addoption(parser): - parser.addoption("--smoke", action="store_true", help="smoke test") - parser.addoption("--extended", action="store_true", help="extended test") - - -# TODO: this is deprecated, find a better way -def pytest_cmdline_preparse(config, args): - if "--smoke" in args and "--extended" in args: - raise pytest.UsageError('Only one of "--smoke" and "--extended" can be used') - - -def pytest_generate_tests(metafunc): - try: - PARAMS = metafunc.module.PARAMS - if metafunc.config.getoption("smoke"): - params = PARAMS.get("smoke", PARAMS["default"]) - elif metafunc.config.getoption("extended"): - params = PARAMS.get("extended", PARAMS["default"]) - else: - params = PARAMS["default"] - except AttributeError: - params = {} - - for name, values in params.items(): - if name in metafunc.fixturenames: - metafunc.parametrize(name, values) diff --git a/tflite2xcore/tflite2xcore/tests/pytest.ini b/tflite2xcore/tflite2xcore/tests/pytest.ini deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/runtests.py b/tflite2xcore/tflite2xcore/tests/runtests.py deleted file mode 100755 index 61618123d..000000000 --- a/tflite2xcore/tflite2xcore/tests/runtests.py +++ /dev/null @@ -1,194 +0,0 @@ -#!/usr/bin/env python -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import os -import pytest -import argparse -import sys -import atexit - -import multiprocessing as mp - -from io import StringIO -from enum import Enum, auto -from timeit import default_timer as timer -from typing import Counter, List, Tuple, Optional, NamedTuple, Callable, Sequence - - -class CollectionMode(Enum): - FILES = auto() - TESTS = auto() - - -class CollectorPlugin: - def __init__(self, *, mode: CollectionMode = CollectionMode.FILES) -> None: - self.counter = Counter[str]() - self.mode = mode - - def tests(self) -> List[Tuple[str, int]]: - return self.counter.most_common() - - def pytest_collection_modifyitems(self, items: List[pytest.Item]) -> None: - if self.mode is CollectionMode.FILES: - self.counter = Counter(item.nodeid.split("::")[0] for item in items) - elif self.mode is CollectionMode.TESTS: - self.counter = Counter(item.nodeid.split("[")[0] for item in items) - else: - raise ValueError(f"Unsupported collection mode {self.mode}") - - -Job = List[str] - - -class JobCollector: - def __init__( - self, - path: str, - *, - coverage_options: Optional[Sequence[str]] = None, - verbose: bool = False, - junit: bool = False, - ) -> None: - if not (os.path.exists(path) and os.path.isdir(path)): - raise ValueError(f"Invalid directory path: {path}") - - self.plugin = CollectorPlugin() - self.verbose = verbose - self.jobs: List[Job] = [] - self.path = path - self.junit = junit - - coverage_options = list(coverage_options or []) - self.optional_args = ["-qq"] + coverage_options - self.collection_job = [self.path, "--collect-only"] + self.optional_args - - def collect(self) -> int: - print("Collecting test cases...") - start = timer() - sys.stdout = StringIO() - try: - exit_code = pytest.main(self.collection_job, plugins=[self.plugin]) - finally: - output = sys.stdout.getvalue() - sys.stdout = sys.__stdout__ - print(f"Collection finished in {timer() - start:.2f}s.") - - if self.verbose or exit_code: - print(output) - - if not exit_code: - self.jobs = [] - tests = self.plugin.tests() - for path, _ in tests: - full_path = os.path.join(self.path, path) - cmd = [full_path, "--tb=short"] + self.optional_args - if self.junit: - cmd += ["--junitxml", full_path + "_junit.xml"] - self.jobs.append(cmd) - - print(f"{sum(cnt for _, cnt in tests)} CASES IN {len(self.jobs)} JOBS:") - for job, (_, cnt) in zip(self.jobs, tests): - print(f"{cnt} CASES IN: {' '.join(job)}") - - return exit_code - - -class JobResult(NamedTuple): - job: Job - output: str - time: float - exit_code: int - - -class JobExecutor: - def __init__( - self, - job_fun: Callable[[Job], JobResult], - *, - workers: int = 1, - verbose: bool = False, - ) -> None: - cpu_count = mp.cpu_count() - if workers == -1 or workers > cpu_count: - workers = cpu_count - elif workers < -1 or workers == 0: - raise ValueError(f"Invalid number of workers: {workers}") - - self.workers = workers - self.verbose = verbose - self.pool = mp.Pool(self.workers) - atexit.register(self.pool.close) - self.job_fun = job_fun - - def execute(self, jobs: Sequence[Job]) -> Sequence[JobResult]: - print(f"Executing {len(jobs)} jobs on {self.workers} workers...") - - start = timer() - outputs = self.pool.map(self.job_fun, jobs) - total = timer() - start - - passed = failed = 0 - for job, output, t, exit_code in outputs: - job_str = f"TIME={t:.2f}s in {' '.join(job)}" - if exit_code: - failed += 1 - print("FAILED:", job_str) - if self.verbose: - print(output) - print() - else: - passed += 1 - print("PASSED:", job_str) - - print(f"TOTAL: PASSED={passed}, FAILED={failed}, TIME={total:.2f}s") - return outputs - - -def run_job(job: Job) -> JobResult: - sys.stdout = StringIO() - try: - start = timer() - exit_code = pytest.main(job) - t = timer() - start - finally: - output = sys.stdout.getvalue() - sys.stdout = sys.__stdout__ - return JobResult(job, output, t, exit_code) - - -def main(raw_args: Optional[Sequence[str]] = None) -> None: - parser = argparse.ArgumentParser() - parser.add_argument("dir", nargs="?", default=os.path.curdir) - parser.add_argument("--smoke", action="store_true", default=False) - parser.add_argument("--extended", action="store_true", default=False) - parser.add_argument("--collect-only", action="store_true", default=False) - parser.add_argument("--junit", action="store_true", default=False) - parser.add_argument("-n", "--workers", type=int, default=1) - parser.add_argument("-v", "--verbose", action="store_true", default=False) - args = parser.parse_args(raw_args) - - coverage_options = [] - if args.smoke and args.extended: - raise ValueError('Only one of "--smoke" and "--extended" can be used') - elif args.smoke: - coverage_options.append("--smoke") - elif args.extended: - coverage_options.append("--extended") - - collector = JobCollector( - args.dir, - coverage_options=coverage_options, - verbose=args.verbose, - junit=args.junit, - ) - exit_code = collector.collect() - if exit_code or args.collect_only or not args.workers: - exit(exit_code) - - executor = JobExecutor(run_job, workers=args.workers, verbose=args.verbose) - executor.execute(collector.jobs) - - -if __name__ == "__main__": - main() diff --git a/tflite2xcore/tflite2xcore/tests/test_execution_planning/__init__.py b/tflite2xcore/tflite2xcore/tests/test_execution_planning/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_execution_planning/test_ReverseDepthFirstPlanner.py b/tflite2xcore/tflite2xcore/tests/test_execution_planning/test_ReverseDepthFirstPlanner.py deleted file mode 100644 index d3944a4cc..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_execution_planning/test_ReverseDepthFirstPlanner.py +++ /dev/null @@ -1,152 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -from typing import Type - -from tflite2xcore.execution_planning import ExecutionPlanner, ReverseDepthFirstPlanner - -from tflite2xcore import xcore_schema as xir - -DUMMY_OPERATOR_CODE = xir.OperatorCode(xir.XCOREOpCodes.DUMMY) - - -@pytest.fixture() # type: ignore -def PlannerUnderTest() -> Type[ReverseDepthFirstPlanner]: - return ReverseDepthFirstPlanner - - -def test_single_op_with_const(PlannerUnderTest: Type[ExecutionPlanner]) -> None: - subgraph = xir.Subgraph(model=xir.XCOREModel()) - - tin = subgraph.create_tensor( - "input", xir.TensorType.FLOAT32, shape=(1,), isinput=True - ) - tconst = subgraph.create_tensor("const", tin.type, tin.shape) - tout = subgraph.create_tensor("output", tin.type, tin.shape, isoutput=True) - op = subgraph.create_operator( - DUMMY_OPERATOR_CODE, inputs=[tin, tconst], outputs=[tout] - ) - - planner = PlannerUnderTest(subgraph) - assert planner.make_plan() == [op] - - -def test_single_op_with_two_outputs(PlannerUnderTest: Type[ExecutionPlanner]) -> None: - subgraph = xir.Subgraph(model=xir.XCOREModel()) - - tin = subgraph.create_tensor( - "input", xir.TensorType.FLOAT32, shape=(1,), isinput=True - ) - tout1 = subgraph.create_tensor("output1", tin.type, tin.shape, isoutput=True) - tout2 = subgraph.create_tensor("output2", tin.type, tin.shape, isoutput=True) - op = subgraph.create_operator( - DUMMY_OPERATOR_CODE, inputs=[tin], outputs=[tout1, tout2] - ) - - planner = PlannerUnderTest(subgraph) - assert planner.make_plan() == [op] - - -def test_linear_graph(PlannerUnderTest: Type[ExecutionPlanner]) -> None: - subgraph = xir.Subgraph(model=xir.XCOREModel()) - - tin = subgraph.create_tensor( - "input", xir.TensorType.FLOAT32, shape=(1,), isinput=True - ) - - t1 = subgraph.create_tensor("intermediate1", tin.type, tin.shape) - op1 = subgraph.create_operator(DUMMY_OPERATOR_CODE, inputs=[tin], outputs=[t1]) - - t2 = subgraph.create_tensor("intermediate2", t1.type, t1.shape) - op2 = subgraph.create_operator(DUMMY_OPERATOR_CODE, inputs=[t1], outputs=[t2]) - - tout = subgraph.create_tensor("output", t2.type, t2.shape, isoutput=True) - op3 = subgraph.create_operator(DUMMY_OPERATOR_CODE, inputs=[t2], outputs=[tout]) - - planner = PlannerUnderTest(subgraph) - assert planner.make_plan() == [op1, op2, op3] - - -def test_order_by_size(PlannerUnderTest: Type[ExecutionPlanner]) -> None: - subgraph = xir.Subgraph(model=xir.XCOREModel()) - - tin = subgraph.create_tensor( - "input", xir.TensorType.FLOAT32, shape=(1,), isinput=True - ) - - tout1 = subgraph.create_tensor("output1", tin.type, (1,), isoutput=True) - op1 = subgraph.create_operator(DUMMY_OPERATOR_CODE, inputs=[tin], outputs=[tout1]) - - tout2 = subgraph.create_tensor("output2", tin.type, (3,), isoutput=True) - op2 = subgraph.create_operator(DUMMY_OPERATOR_CODE, inputs=[tin], outputs=[tout2]) - - tout3 = subgraph.create_tensor("output3", tin.type, (2,), isoutput=True) - op3 = subgraph.create_operator(DUMMY_OPERATOR_CODE, inputs=[tin], outputs=[tout3]) - - planner = PlannerUnderTest(subgraph) - assert planner.make_plan() == [op1, op3, op2] - - -def test_symmetric_parallel_block(PlannerUnderTest: Type[ExecutionPlanner]) -> None: - subgraph = xir.Subgraph(model=xir.XCOREModel()) - - tin = subgraph.create_tensor( - "input", xir.TensorType.FLOAT32, shape=(1,), isinput=True - ) - t1_in = subgraph.create_tensor("branch1_input", tin.type, tin.shape) - t2_in = subgraph.create_tensor("branch2_input", tin.type, tin.shape) - op0 = subgraph.create_operator( - DUMMY_OPERATOR_CODE, inputs=[tin], outputs=[t1_in, t2_in] - ) - - t1_out = subgraph.create_tensor("branch1_output", t1_in.type, (2,)) # bigger - op1 = subgraph.create_operator( - DUMMY_OPERATOR_CODE, inputs=[t1_in], outputs=[t1_out] - ) - - t2_out = subgraph.create_tensor("branch2_output", t1_out.type, (1,)) # smaller - op2 = subgraph.create_operator( - DUMMY_OPERATOR_CODE, inputs=[t2_in], outputs=[t2_out] - ) - - tout = subgraph.create_tensor("output", tin.type, tin.shape, isoutput=True) - op3 = subgraph.create_operator( - DUMMY_OPERATOR_CODE, inputs=[t1_out, t2_out], outputs=[tout] - ) - - planner = PlannerUnderTest(subgraph) - assert planner.make_plan() == [op0, op2, op1, op3] - - -def test_asymmetric_parallel_block(PlannerUnderTest: Type[ExecutionPlanner]) -> None: - subgraph = xir.Subgraph(model=xir.XCOREModel()) - - tin = subgraph.create_tensor( - "input", xir.TensorType.FLOAT32, shape=(1,), isinput=True - ) - tmid = subgraph.create_tensor("branch_input", tin.type, tin.shape) - op0 = subgraph.create_operator(DUMMY_OPERATOR_CODE, inputs=[tin], outputs=[tmid]) - - t1_mid = subgraph.create_tensor("branch1_mid", tmid.type, tmid.shape) - op1 = subgraph.create_operator(DUMMY_OPERATOR_CODE, inputs=[tmid], outputs=[t1_mid]) - - t1_out = subgraph.create_tensor("branch1_out", t1_mid.type, shape=(1,)) # smaller - op2 = subgraph.create_operator( - DUMMY_OPERATOR_CODE, inputs=[t1_mid], outputs=[t1_out] - ) - - t2_out = subgraph.create_tensor("branch2_out", tmid.type, shape=(2,)) # bigger - op3 = subgraph.create_operator(DUMMY_OPERATOR_CODE, inputs=[tmid], outputs=[t2_out]) - - tout = subgraph.create_tensor("output", tin.type, tin.shape, isoutput=True) - op4 = subgraph.create_operator( - DUMMY_OPERATOR_CODE, inputs=[t1_out, t2_out], outputs=[tout] - ) - - planner = PlannerUnderTest(subgraph) - assert planner.make_plan() == [op0, op1, op2, op3, op4] - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_ir/__init__.py b/tflite2xcore/tflite2xcore/tests/test_ir/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_ir/builtin_operators.tflite b/tflite2xcore/tflite2xcore/tests/test_ir/builtin_operators.tflite deleted file mode 100644 index 0aec83443..000000000 Binary files a/tflite2xcore/tflite2xcore/tests/test_ir/builtin_operators.tflite and /dev/null differ diff --git a/tflite2xcore/tflite2xcore/tests/test_ir/test_BuiltinOptions.py b/tflite2xcore/tflite2xcore/tests/test_ir/test_BuiltinOptions.py deleted file mode 100644 index cedb9f0d0..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_ir/test_BuiltinOptions.py +++ /dev/null @@ -1,119 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -from typing import List, Dict, Any - -from tflite2xcore.xcore_schema import ( - BuiltinOpCodes, - BuiltinOptions, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -_BUILTIN_OP_CODE_NONES = [ - BuiltinOpCodes.CUSTOM, - BuiltinOpCodes.DELEGATE, - BuiltinOpCodes.EMBEDDING_LOOKUP, - BuiltinOpCodes.FLOOR, - BuiltinOpCodes.CEIL, - BuiltinOpCodes.HASHTABLE_LOOKUP, - BuiltinOpCodes.LOGISTIC, - BuiltinOpCodes.RELU, - BuiltinOpCodes.RELU_N1_TO_1, - BuiltinOpCodes.RELU6, - BuiltinOpCodes.ROUND, - BuiltinOpCodes.TANH, - BuiltinOpCodes.PRELU, - BuiltinOpCodes.SIN, - BuiltinOpCodes.LOG, - BuiltinOpCodes.SQRT, - BuiltinOpCodes.RSQRT, - BuiltinOpCodes.ELU, -] - -_BUILTIN_OP_CODE_REDUCERS = [ - BuiltinOpCodes.MEAN, - BuiltinOpCodes.REDUCE_MAX, - BuiltinOpCodes.REDUCE_MIN, - BuiltinOpCodes.REDUCE_PROD, - BuiltinOpCodes.REDUCE_ANY, - BuiltinOpCodes.SUM, -] - -_BUILTIN_OP_CODE_POOLS = [ - BuiltinOpCodes.AVERAGE_POOL_2D, - BuiltinOpCodes.L2_POOL_2D, - BuiltinOpCodes.MAX_POOL_2D, -] - - -PARAMS = { - level: { - "builtin_op_code": list(BuiltinOpCodes), - "builtin_option_type": list(BuiltinOptions), - "builtin_op_code_none": _BUILTIN_OP_CODE_NONES, - "builtin_op_code_reducer": _BUILTIN_OP_CODE_REDUCERS, - "builtin_op_code_pool": _BUILTIN_OP_CODE_POOLS, - } - for level in ["extended", "default", "smoke"] -} # type: Dict[str, Dict[str, List[Any]]] - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture -def option_type_map_values() -> List[BuiltinOptions]: - return [BuiltinOptions.from_BuiltinOpCodes(op_code) for op_code in BuiltinOpCodes] - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_option_type_map(builtin_op_code: BuiltinOpCodes) -> None: - option_type = BuiltinOptions.from_BuiltinOpCodes(builtin_op_code) - assert option_type in BuiltinOptions - if option_type is BuiltinOptions.NONE: - assert builtin_op_code in _BUILTIN_OP_CODE_NONES - if option_type is BuiltinOptions.ReducerOptions: - assert builtin_op_code in _BUILTIN_OP_CODE_REDUCERS - if option_type is BuiltinOptions.Pool2DOptions: - assert builtin_op_code in _BUILTIN_OP_CODE_POOLS - - -def test_option_type_map_values( - option_type_map_values: List[BuiltinOptions], builtin_option_type: BuiltinOptions -) -> None: - assert builtin_option_type in option_type_map_values - - -def test_option_type_map_nones(builtin_op_code_none: BuiltinOpCodes) -> None: - assert ( - BuiltinOptions.from_BuiltinOpCodes(builtin_op_code_none) is BuiltinOptions.NONE - ) - - -def test_option_type_map_reducers(builtin_op_code_reducer: BuiltinOpCodes) -> None: - assert ( - BuiltinOptions.from_BuiltinOpCodes(builtin_op_code_reducer) - is BuiltinOptions.ReducerOptions - ) - - -def test_option_type_map_pools(builtin_op_code_pool: BuiltinOpCodes) -> None: - assert ( - BuiltinOptions.from_BuiltinOpCodes(builtin_op_code_pool) - is BuiltinOptions.Pool2DOptions - ) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_ir/test_serialization.py b/tflite2xcore/tflite2xcore/tests/test_ir/test_serialization.py deleted file mode 100644 index d5288094d..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_ir/test_serialization.py +++ /dev/null @@ -1,149 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import os -import tempfile -import pytest - -from pathlib import Path - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import ( - ActivationFunctionType, - TensorType, - OperatorCode, - BuiltinOpCodes, - XCOREOpCodes, - Subgraph, -) - -import tensorflow as tf - -BUILTIN_OPERATORS_TEST_FILE = os.path.join( - Path(__file__).parent.absolute(), "builtin_operators.tflite" -) - - -def _test_read_flatbuffer(model): - - assert model.version == 3 - assert len(model.metadata) == 1 - assert len(model.operator_codes) == 6 - - assert len(model.buffers) == 18 - assert len(model.buffers[0].data) == 0 - assert len(model.buffers[4].data) == 128 - - assert len(model.subgraphs) == 1 - subgraph = model.subgraphs[0] - assert len(subgraph.operators) == 10 - assert len(subgraph.tensors) == 19 - assert len(subgraph.inputs) == 1 - assert len(subgraph.outputs) == 1 - assert len(subgraph.intermediates) == len(subgraph.tensors) - len( - subgraph.inputs - ) - len(subgraph.outputs) - - tensor = subgraph.tensors[2] - assert tensor.name == "arm_benchmark/conv2d/Conv2D_bias" - assert tensor.sanitized_name == "arm_benchmark_conv2d_Conv2D_bias" - assert tensor.type is TensorType.INT32 - assert tensor.shape == (32,) - assert len(tensor.buffer.data) == 128 - - operator = subgraph.operators[1] - assert operator.operator_code.code is BuiltinOpCodes.CONV_2D - assert operator.operator_code.version == 3 - - assert ( - operator.builtin_options["fused_activation_function"] - is ActivationFunctionType.RELU - ) - assert len(operator.inputs) == 3 - assert len(operator.outputs) == 1 - assert operator.outputs[0].name == "arm_benchmark/re_lu/Relu" - - -def test_read_flatbuffer(): - model = XCOREModel.read_flatbuffer(BUILTIN_OPERATORS_TEST_FILE) - - _test_read_flatbuffer(model) - - -def test_write_flatbuffer(): - model = XCOREModel.read_flatbuffer(BUILTIN_OPERATORS_TEST_FILE) - - tmp_file = os.path.join(tempfile.mkdtemp(), "test_write_flatbuffer.tflite") - bytes_expected = os.path.getsize(BUILTIN_OPERATORS_TEST_FILE) - bytes_written = model.write_flatbuffer(tmp_file) - - _test_read_flatbuffer(XCOREModel.read_flatbuffer(tmp_file)) - - # assert bytes_written <= bytes_expected - - # make sure it can be read by tensorflow interpreter - interpreter = tf.lite.Interpreter(model_path=tmp_file) - - assert interpreter is not None - - os.remove(tmp_file) - - -def test_custom_options(): - model = XCOREModel() - subgraph = Subgraph(model=model) - - input_tensor = subgraph.create_tensor( - "input_tensor", TensorType.INT16, [1, 5, 5, 4], isinput=True - ) - output_tensor = subgraph.create_tensor( - "output_tensor", TensorType.INT8, [1, 5, 5, 4], isoutput=True - ) - expected_operator = subgraph.create_operator( - OperatorCode(XCOREOpCodes.XC_requantize_16_to_8), - inputs=[input_tensor], - outputs=[output_tensor], - ) - - expected_operator.custom_options = { - "int": 1, - "bool": True, - "float": 1.100000023842, - "string": "test string", - "vector_of_ints": [3, 2, 1], - "vector_of_bools": [True, False], - "vector_of_floats": [1.100000023842, 1.100000023842], - "vector_of_strings": ["str1", "str2", "str3"], - "map": {"one": 1, "two": 2}, - "vector_of_vectors": [[3, 2, 1], [1, 2, 3], [3, 2, 1]], - "vector_of_maps": [ - {"map1": [1, 2, 3]}, - {"map2": [1, 2, 3]}, - {"map3": [1, 2, 3]}, - ], - "enum": BuiltinOpCodes.CONV_2D, - "vector_of_enums": [BuiltinOpCodes.CONV_2D, BuiltinOpCodes.ADD], - "map_of_enums": {"conv_2d": BuiltinOpCodes.CONV_2D, "add": BuiltinOpCodes.ADD}, - } - - tmp_file = os.path.join(tempfile.mkdtemp(), "test_custom_options.tflite") - bytes_written = model.write_flatbuffer(tmp_file) - - assert bytes_written > 0 - - model = XCOREModel.read_flatbuffer(tmp_file) - - loaded_operator = model.subgraphs[0].operators[0] - loaded_options = loaded_operator.custom_options - loaded_options["enum"] = BuiltinOpCodes(loaded_options["enum"]) - loaded_options["vector_of_enums"] = [ - BuiltinOpCodes(e) for e in loaded_options["vector_of_enums"] - ] - loaded_options["map_of_enums"] = { - k: BuiltinOpCodes(v) for k, v in loaded_options["map_of_enums"].items() - } - assert loaded_options == expected_operator.custom_options - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_parallelization/test_ChannelGroupSlicePlanner.py b/tflite2xcore/tflite2xcore/tests/test_parallelization/test_ChannelGroupSlicePlanner.py deleted file mode 100644 index 9540538a8..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_parallelization/test_ChannelGroupSlicePlanner.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -import numpy as np - -from tflite2xcore.parallelization import ChannelGroupSlicePlanner, MAX_THREADS - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -MAX_OUTPUT_CHANNELS = 75 - -PARAMS = {"default": {"num_channels": list(range(1, MAX_OUTPUT_CHANNELS + 1))}} - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -def generate_thread_cost_array(max_channels: int = MAX_OUTPUT_CHANNELS) -> np.ndarray: - thread_costs = np.zeros((max_channels, MAX_THREADS), dtype=np.float) - - for num_channels in range(1, max_channels + 1): - for num_threads in list(range(1, MAX_THREADS + 1)): - planner = ChannelGroupSlicePlanner( - num_channels, num_threads=num_threads, forced=True - ) - plan = planner.find_optimal_plan() - thread_costs[num_channels - 1, num_threads - 1] = plan.estimate_cost() - - return thread_costs - - -@pytest.fixture(scope="session") # type: ignore -def thread_cost_array() -> np.ndarray: - return generate_thread_cost_array() - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_channel_coverage(num_channels: int) -> None: - planner = ChannelGroupSlicePlanner(num_channels, num_threads=MAX_THREADS) - planner.create_candidate_plans() - for plan in planner._candidate_plans: - coverage_map = np.zeros(num_channels, dtype=bool) - for changrp in plan._channel_groups: - coverage_map[changrp.begin : changrp.end + 1] = True - assert np.all(coverage_map) - - -def test_optimal_thread_count(num_channels: int, thread_cost_array: np.ndarray) -> None: - planner = ChannelGroupSlicePlanner(num_channels, num_threads=MAX_THREADS) - plan = planner.find_optimal_plan() - costs = thread_cost_array[num_channels - 1, :] - assert np.min(costs) == plan.estimate_cost() - assert np.argmin(costs) == plan._num_threads - 1 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_parallelization/test_ElementWisePlanner.py b/tflite2xcore/tflite2xcore/tests/test_parallelization/test_ElementWisePlanner.py deleted file mode 100644 index 94a4fedda..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_parallelization/test_ElementWisePlanner.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -import numpy as np - -from tflite2xcore.parallelization import ElementWisePlanner, MAX_THREADS - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -MAX_ELEMENTS = 75 - -PARAMS = {"default": {"num_elements": list(range(1, MAX_ELEMENTS + 1))}} - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -def generate_thread_cost_array(max_elements: int = MAX_ELEMENTS) -> np.ndarray: - thread_costs = np.zeros((max_elements, MAX_THREADS), dtype=np.float) - - for num_elements in range(1, max_elements + 1): - for num_threads in list(range(1, MAX_THREADS + 1)): - planner = ElementWisePlanner( - num_elements, - num_threads=num_threads, - forced=True, - fixed_cost_per_thread=10, - ) - plan = planner.find_optimal_plan() - thread_costs[num_elements - 1, num_threads - 1] = plan.estimate_cost() - - return thread_costs - - -@pytest.fixture(scope="session") # type: ignore -def thread_cost_array() -> np.ndarray: - return generate_thread_cost_array() - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_element_coverage(num_elements: int) -> None: - planner = ElementWisePlanner( - num_elements, num_threads=MAX_THREADS, fixed_cost_per_thread=10 - ) - planner.create_candidate_plans() - for plan in planner._candidate_plans: - assert num_elements == sum(plan._job_sizes) - - -def test_optimal_thread_count(num_elements: int, thread_cost_array: np.ndarray) -> None: - planner = ElementWisePlanner( - num_elements, num_threads=MAX_THREADS, fixed_cost_per_thread=10 - ) - plan = planner.find_optimal_plan() - costs = thread_cost_array[num_elements - 1, :] - assert np.min(costs) == plan.estimate_cost() - assert np.argmin(costs) == plan._num_threads - 1 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_parallelization/test_SlicePlanner.py b/tflite2xcore/tflite2xcore/tests/test_parallelization/test_SlicePlanner.py deleted file mode 100644 index e316f155a..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_parallelization/test_SlicePlanner.py +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import itertools - -import numpy as np - -from tflite2xcore.parallelization import SlicePlanner, MAX_THREADS - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -MAX_OUTPUT_CHANNELS = 20 -MAX_HEIGHT = MAX_WIDTH = 10 - -PARAMS = { - "default": { - "num_channels": list(range(1, MAX_OUTPUT_CHANNELS + 1)), - "height": list(range(1, MAX_HEIGHT + 1)), - "width": list(range(1, MAX_WIDTH + 1)), - } -} - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -def generate_thread_cost_array( - max_channel: int = MAX_OUTPUT_CHANNELS, - max_height: int = MAX_HEIGHT, - max_width: int = MAX_WIDTH, -) -> np.ndarray: - thread_costs = np.zeros( - (max_channel, max_height, max_width, MAX_THREADS), dtype=np.float - ) - - for c, y, x in itertools.product( - range(max_channel), range(max_height), range(max_width) - ): - for num_threads in list(range(1, MAX_THREADS + 1)): - planner = SlicePlanner( - num_channels_out=c + 1, - height=y + 1, - width=x + 1, - num_threads=num_threads, - forced=True, - ) - plan = planner.find_optimal_plan() - thread_costs[c, y, x, num_threads - 1] = plan.estimate_cost() - - return thread_costs - - -@pytest.fixture(scope="session") # type: ignore -def thread_cost_array() -> np.ndarray: - return generate_thread_cost_array() - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_layout_coverage(num_channels: int, height: int, width: int) -> None: - planner = SlicePlanner(num_channels, height, width, num_threads=MAX_THREADS) - planner.create_candidate_plans() - for plan in planner._candidate_plans: - coverage_map = np.zeros((height, width), dtype=bool) - for block in plan._row_col_slices: - y_start, y_end = block.top, block.top + block.rows - x_start, x_end = block.left, block.left + block.cols - coverage_map[y_start:y_end, x_start:x_end] = True - assert np.all(coverage_map) - - coverage_map = np.zeros(num_channels, dtype=bool) - for changrp in plan._channel_groups: - coverage_map[changrp.begin : changrp.end + 1] = True - assert np.all(coverage_map) - - -def test_optimal_thread_count( - num_channels: int, height: int, width: int, thread_cost_array: np.ndarray -) -> None: - planner = SlicePlanner(num_channels, height, width, num_threads=MAX_THREADS) - plan = planner.find_optimal_plan() - costs = thread_cost_array[num_channels - 1, height - 1, width - 1, :] - assert np.min(costs) == plan.estimate_cost() - assert np.argmin(costs) == plan._num_threads - 1 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/conftest.py deleted file mode 100644 index be670b599..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/conftest.py +++ /dev/null @@ -1,136 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import itertools -from typing import List, Dict, Iterator, Tuple, Any - -from tflite2xcore.transformation_passes import ModelTransformationPass -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import TensorType, ValidOpCodes -from tflite2xcore.converter import CleanupManager - - -# ---------------------------------------------------------------------------- -# HELPERS -# ---------------------------------------------------------------------------- - - -def _make_name_type_pairs( - name: str, types: List[TensorType] -) -> Iterator[Dict[str, TensorType]]: - for n, t in zip(itertools.cycle([name]), types): - yield {n: t} - - -def _test_non_matching_params( - trf_pass: ModelTransformationPass, model: XCOREModel, *, op_idx: int = -1 -) -> None: - assert not trf_pass.match(model.subgraphs[0].operators[op_idx]) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - - -NON_INT8_TEST_TYPES = [ - TensorType.UINT8, - TensorType.INT32, - TensorType.FLOAT32, - TensorType.INT16, -] - -NON_INT32_TEST_TYPES = [ - TensorType.INT8, - TensorType.UINT8, - TensorType.INT16, - TensorType.FLOAT32, -] - -NON_FLOAT32_TEST_TYPES = [ - TensorType.INT8, - TensorType.INT16, - TensorType.INT32, - TensorType.UINT8, -] - -ParamsType = Dict[str, Dict[str, List[Any]]] - -PARAMS = { - "extended": { - "input_height": [9, 20, 32], - "input_width": [7, 17, 32], - "input_channels": [4, 16, 32, 36], - }, - "default": { - "input_height": [9, 20], - "input_width": [7, 17], - "input_channels": [4, 16, 32], - }, - "smoke": { - "input_height": [9, 20], - "input_width": [7, 17], - "input_channels": [4, 32], - }, -} # type: ParamsType - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def strides(stride_h: int, stride_w: int) -> Tuple[int, int]: - return (stride_h, stride_w) - - -@pytest.fixture() -def input_size(input_height: int, input_width: int) -> Tuple[int, int]: - return (input_height, input_width) - - -@pytest.fixture() -def input_shape( - input_size: Tuple[int, int], input_channels: int -) -> Tuple[int, int, int]: - return (*input_size, input_channels) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_matching_params( - trf_pass: ModelTransformationPass, model: XCOREModel, *, op_idx: int = -1 -) -> None: - assert trf_pass.match(model.subgraphs[0].operators[op_idx]) - - -def test_non_matching_tensors( - trf_pass: ModelTransformationPass, - model: XCOREModel, - non_matching_tensors: Dict[str, TensorType], -) -> None: - subgraph = model.subgraphs[0] - for name, type_ in non_matching_tensors.items(): - subgraph.get_tensor(name).type = type_ - _test_non_matching_params(trf_pass, model) - - -def test_replace_mutate( - trf_pass: ModelTransformationPass, model: XCOREModel, new_opcode: ValidOpCodes -) -> None: - # run replacement pass - trf_pass.run(model) - model.sanity_check() - - # clean up dangling op - CleanupManager(model).run_passes() - model.sanity_check() - - # check new op - op_code = model.subgraphs[0].operators[-1].operator_code.code - assert op_code is new_opcode, f"expected: {new_opcode}, got: {op_code}" diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/model_builders.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/model_builders.py deleted file mode 100644 index d2d70b873..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/model_builders.py +++ /dev/null @@ -1,877 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np -from typing import Callable, Tuple, Optional, Union -from copy import deepcopy - - -from tflite2xcore.utils import QuantizationTuple -from tflite2xcore.xcore_schema import ( - XCOREModel, - Subgraph, - ActivationFunctionType, - Padding, - TensorType, - OperatorCode, - BuiltinOpCodes, - XCOREOpCodes, -) - -ModelBuilder = Callable[..., XCOREModel] - - -def generate_dummy_data( - shape: Tuple[int, ...], dtype: Union[type, np.dtype] -) -> np.ndarray: - if np.issubdtype(dtype, np.int8): - t_max = np.iinfo(dtype).max - t_range = t_max - np.iinfo(dtype).min - return np.int8(np.arange(np.prod(shape)) % t_range - t_max) - else: - return np.arange(np.prod(shape), dtype=dtype) - - -def build_split(subgraph=None, *, input_shape, tensor_type, axis, num_splits): - assert 0 <= axis < len(input_shape) - assert 1 < num_splits <= input_shape[axis] - assert input_shape[axis] % num_splits == 0 - subgraph = subgraph or Subgraph(model=XCOREModel()) - - input_shape = [1, *input_shape] - tin = subgraph.create_tensor("input", tensor_type, shape=input_shape, isinput=True) - t_axis = subgraph.create_tensor("axis", TensorType.INT32, shape=[]) - t_axis.buffer.data = np.array([axis], dtype=np.int32) - - out_shape = ( - *input_shape[:axis], - int(input_shape[axis] // num_splits), - *input_shape[axis + 1 :], - ) - outputs = [ - subgraph.create_tensor(f"output_{j}", tin.type, out_shape, isoutput=True) - for j in range(num_splits) - ] - op = subgraph.create_operator( - OperatorCode(BuiltinOpCodes.SPLIT), inputs=[t_axis, tin], outputs=outputs - ) - op.builtin_options = {"num_splits": num_splits} - - return subgraph.model - - -def build_dequantize( - subgraph: Optional[Subgraph] = None, - *, - input_shape: Tuple[int, ...], - input_quantization: Optional[QuantizationTuple] = None, -) -> XCOREModel: - subgraph = subgraph or Subgraph(model=XCOREModel()) - - quant = input_quantization or QuantizationTuple(0.12, -35) - input_shape = [1, *input_shape] - qin = subgraph.create_tensor( - "input", - TensorType.INT8, - input_shape, - isinput=True, - quantization={"scale": [quant.scale], "zero_point": [quant.zero_point]}, - ) - - fout = subgraph.create_tensor( - "output_dequantized", TensorType.FLOAT32, qin.shape, isoutput=True - ) - - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.DEQUANTIZE), inputs=[qin], outputs=[fout] - ) - - return subgraph.model - - -def build_quantize( - subgraph: Optional[Subgraph] = None, - *, - input_shape: Tuple[int, ...], - output_quantization: Optional[QuantizationTuple] = None, -) -> XCOREModel: - subgraph = subgraph or Subgraph(model=XCOREModel()) - - input_shape = [1, *input_shape] - tin = subgraph.create_tensor("input", TensorType.FLOAT32, input_shape, isinput=True) - - quant = output_quantization or QuantizationTuple(0.12, -35) - qout = subgraph.create_tensor( - "output_quantized", - TensorType.INT8, - tin.shape, - isoutput=True, - quantization={"scale": [quant.scale], "zero_point": [quant.zero_point]}, - ) - - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.QUANTIZE), inputs=[tin], outputs=[qout] - ) - - return subgraph.model - - -def build_elementwise_op(builtin_opcode, subgraph=None, *, input_shape, tensor_type): - subgraph = subgraph or Subgraph(model=XCOREModel()) - - input_shape = [1, *input_shape] - quantization = {"scale": [0.35], "zero_point": [0]} - tin = subgraph.create_tensor( - "input", - tensor_type, - shape=input_shape, - isinput=True, - quantization=deepcopy(quantization), - ) - tout = subgraph.create_tensor( - "output", - tin.type, - shape=tin.shape, - isoutput=True, - quantization=deepcopy(quantization), - ) - subgraph.create_operator(OperatorCode(builtin_opcode), inputs=[tin], outputs=[tout]) - - return subgraph.model - - -def build_relu(subgraph=None, **kwargs): - return build_elementwise_op(BuiltinOpCodes.RELU, subgraph, **kwargs) - - -def build_relu6(subgraph=None, **kwargs): - return build_elementwise_op(BuiltinOpCodes.RELU6, subgraph, **kwargs) - - -def build_tanh(subgraph=None, **kwargs): - return build_elementwise_op(BuiltinOpCodes.TANH, subgraph, **kwargs) - - -def build_logistic(subgraph=None, **kwargs): - return build_elementwise_op(BuiltinOpCodes.LOGISTIC, subgraph, **kwargs) - - -def build_abs(subgraph=None, **kwargs): - return build_elementwise_op(BuiltinOpCodes.ABS, subgraph, **kwargs) - - -def build_mean(subgraph=None, *, input_shape, reduction_dims): - subgraph = subgraph or Subgraph(model=XCOREModel()) - - input_shape = [1, *input_shape] - tin = subgraph.create_tensor( - "input", - type_=TensorType.INT8, - shape=input_shape, - isinput=True, - quantization={"scale": [0.65], "zero_point": [-12]}, - ) - tred = subgraph.create_tensor( - "reduction_dims", TensorType.INT32, [len(reduction_dims)] - ) - tout = subgraph.create_tensor( - "output", - tin.type, - [tin.shape[0] + tin.shape[3]], - isoutput=True, - quantization={"scale": [0.42], "zero_point": [-11]}, - ) - tred.buffer.data = np.array(reduction_dims, dtype=np.int32) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.MEAN), inputs=[tin, tred], outputs=[tout] - ) - - return subgraph.model - - -def build_XC_avgpool2d_global(subgraph=None, *, input_shape, reduction_dims): - subgraph = subgraph or Subgraph(model=XCOREModel()) - - input_shape = [1, *input_shape] - tin = subgraph.create_tensor( - "input", type_=TensorType.INT8, shape=input_shape, isinput=True - ) - tred = subgraph.create_tensor( - "reduction_dims", TensorType.INT32, [len(reduction_dims)] - ) - tout = subgraph.create_tensor( - "output", tin.type, [tin.shape[0], tin.shape[3]], isoutput=True - ) - tred.buffer.data = np.array(reduction_dims, dtype=np.int32) - subgraph.create_operator( - OperatorCode(XCOREOpCodes.XC_avgpool2d_global), - inputs=[tin, tred], - outputs=[tout], - ) - - return subgraph.model - - -def build_argmax(subgraph=None, *, input_shape, input_type): - subgraph = subgraph or Subgraph(model=XCOREModel()) - - input_shape = [1, *input_shape] - tin = subgraph.create_tensor( - "input", type_=input_type, shape=input_shape, isinput=True - ) - tout = subgraph.create_tensor("output", TensorType.INT32, tin.shape, isoutput=True) - dim_tensor = subgraph.create_tensor("axis", TensorType.INT32, shape=[]) - dim_tensor.buffer.data = np.int32([1]) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.ARG_MAX), inputs=[tin, dim_tensor], outputs=[tout] - ) - - return subgraph.model - - -def build_pool( - builtin_opcode, - subgraph=None, - *, - input_shape, - padding, - pool_size, - strides, - fused_activation=ActivationFunctionType.NONE, -): - assert len(strides) == len(pool_size) == 2 - assert padding in Padding - assert fused_activation in [ - ActivationFunctionType.NONE, - ActivationFunctionType.RELU, - ActivationFunctionType.RELU6, - ] - subgraph = subgraph or Subgraph(model=XCOREModel()) - - input_shape = [1, *input_shape] - output_shape = [ # TODO: fix this: calculate based on strides and pool_size - input_shape[0], - input_shape[1] // 2, - input_shape[1] // 2, - input_shape[3], - ] - quantization = {"scale": [0.35], "zero_point": [0]} - tin = subgraph.create_tensor( - "input", - TensorType.INT8, - input_shape, - isinput=True, - quantization=deepcopy(quantization), - ) - tout = subgraph.create_tensor( - "output", - tin.type, - output_shape, - isoutput=True, - quantization=deepcopy(quantization), - ) - - op = subgraph.create_operator( - OperatorCode(builtin_opcode), inputs=[tin], outputs=[tout] - ) - op.builtin_options = { - "padding": padding, - "stride_h": strides[0], - "stride_w": strides[1], - "filter_height": pool_size[0], - "filter_width": pool_size[1], - "fused_activation_function": fused_activation, - } - - return subgraph.model - - -def build_maxpool(subgraph=None, **kwargs): - return build_pool(BuiltinOpCodes.MAX_POOL_2D, subgraph, **kwargs) - - -def build_avgpool(subgraph=None, **kwargs): - return build_pool(BuiltinOpCodes.AVERAGE_POOL_2D, subgraph, **kwargs) - - -def build_XC_pool(opcode, subgraph=None, *, input_shape, pool_size, strides): - subgraph = subgraph or Subgraph(model=XCOREModel()) - - input_shape = [1, *input_shape] - output_shape = [ - input_shape[0], - input_shape[1] // 2, - input_shape[1] // 2, - input_shape[3], - ] - quantization = {"scale": [0.35], "zero_point": [0]} - tin = subgraph.create_tensor( - "input", - TensorType.INT8, - input_shape, - isinput=True, - quantization=deepcopy(quantization), - ) - tout = subgraph.create_tensor( - "output", - tin.type, - output_shape, - isoutput=True, - quantization=deepcopy(quantization), - ) - - op = subgraph.create_operator(OperatorCode(opcode), inputs=[tin], outputs=[tout]) - op.add_custom_options( - pool=[pool_size[0], pool_size[0]], stride=[strides[0], strides[1]] - ) - - return subgraph.model - - -def build_XC_maxpool2d(subgraph=None, **kwargs): - return build_XC_pool(XCOREOpCodes.XC_maxpool2d, subgraph, **kwargs) - - -def build_XC_avgpool2d(subgraph=None, **kwargs): - return build_XC_pool(XCOREOpCodes.XC_avgpool2d, subgraph, **kwargs) - - -def build_fc(subgraph=None, *, outputs, input_shape, add_batch_dim=True): - subgraph = subgraph or Subgraph(model=XCOREModel()) - - if add_batch_dim: - # TODO unify this behaviour - input_shape = [1, *input_shape] - - weight_shape = [outputs, np.prod(input_shape[1:])] - - tin = subgraph.create_tensor( - "input", - TensorType.INT8, - input_shape, - isinput=True, - quantization={"scale": [0.02874], "zero_point": [-2]}, - ) - w = subgraph.create_tensor( - "weights", - TensorType.INT8, - weight_shape, - quantization={"scale": [0.00836], "zero_point": [0]}, - ) - b = subgraph.create_tensor( - "biases", - TensorType.INT32, - weight_shape[:1], - quantization={"scale": [0.00024], "zero_point": [0]}, - ) - tout = subgraph.create_tensor( - "output", - tin.type, - shape=[1, weight_shape[0]], - isoutput=True, - quantization={"scale": [0.11332], "zero_point": [6]}, - ) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.FULLY_CONNECTED), inputs=[tin, w, b], outputs=[tout] - ) - - # add dummy data so that the op can be mutated - w.buffer.data = generate_dummy_data(w.shape, np.int8) - b.buffer.data = generate_dummy_data(b.shape, np.int32) - - return subgraph.model - - -def build_XC_fc(subgraph=None, *, outputs, input_channels): - subgraph = subgraph or Subgraph(model=XCOREModel()) - - input_shape = [1, input_channels, 1, 1] - weight_shape = [outputs, np.prod(input_shape[1:])] - bso_shape = [int(np.ceil(outputs / 16)), 7, 16] - - tin = subgraph.create_tensor( - "input", - TensorType.INT8, - input_shape, - isinput=True, - quantization={"scale": [0.02874], "zero_point": [-2]}, - ) - w = subgraph.create_tensor( - "weights", - TensorType.INT8, - weight_shape, - quantization={"scale": [0.00836], "zero_point": [0]}, - ) - b = subgraph.create_tensor( - "biases", - TensorType.INT32, - bso_shape, - quantization={"scale": [0.00024], "zero_point": [0]}, - ) - tout = subgraph.create_tensor( - "output", - TensorType.INT8, - shape=[1, weight_shape[0]], - isoutput=True, - quantization={"scale": [0.11332], "zero_point": [6]}, - ) - subgraph.create_operator( - OperatorCode(XCOREOpCodes.XC_fc), inputs=[tin, w, b], outputs=[tout] - ) - - return subgraph.model - - -def build_XC_requantize_16_to_8(subgraph=None, *, outputs, input_channels): - subgraph = subgraph or Subgraph(model=XCOREModel()) - - input_shape = [1, input_channels, 1, 1] - weight_shape = [outputs, np.prod(input_shape[1:])] - - tin = subgraph.create_tensor( - "input", - TensorType.INT8, - input_shape, - isinput=True, - quantization={"scale": [0.02874], "zero_point": [-2]}, - ) - tout = subgraph.create_tensor( - "output", - TensorType.INT16, - shape=[1, weight_shape[0]], - isoutput=True, - quantization={"scale": [0.11332], "zero_point": [6]}, - ) - subgraph.create_operator( - OperatorCode(XCOREOpCodes.XC_requantize_16_to_8), inputs=[tin], outputs=[tout] - ) - - return subgraph.model - - -def build_intermediate_fc(subgraph=None, *, outputs, input_shape): - model = build_fc(subgraph, outputs=outputs, input_shape=input_shape) - subgraph = subgraph or model.subgraphs[0] - - subgraph.get_tensor("weights").name = "weights_1" - subgraph.get_tensor("biases").name = "biases_1" - - tmid = subgraph.get_tensor("output") - tmid.name = "intermediate" - subgraph.outputs.remove(tmid) - - return model - - -def build_conv2d(subgraph=None, *, weight_shape, input_size, padding, strides): - subgraph = subgraph or Subgraph(model=XCOREModel()) - assert padding in Padding - - height, width = input_size - C_out, K_h, K_w, C_in = weight_shape - - input_shape = [1, height, width, C_in] - tin = subgraph.create_tensor( - "input", - TensorType.INT8, - input_shape, - isinput=True, - quantization={"scale": [0.63], "zero_point": [-5]}, - ) - np.random.seed(42) - w = subgraph.create_tensor( - "weights", - TensorType.INT8, - weight_shape, - quantization={ - "scale": np.random.uniform(size=(C_out,)).astype(float).tolist(), - "zero_point": [0] * C_out, - }, - ) - b = subgraph.create_tensor( - "biases", - TensorType.INT32, - shape=[C_out], - quantization={ - "scale": [ - tin.quantization["scale"][0] * s for s in w.quantization["scale"] - ], - "zero_point": [0] * C_out, - }, - ) - - # add dummy data so that the op can be mutated - w.buffer.data = generate_dummy_data(w.shape, np.int8) - b.buffer.data = generate_dummy_data(b.shape, np.int32) - - if padding is Padding.SAME: - # TODO: this is incorrect if stride > 1 - output_shape = [1, height, width, C_out] - elif padding is Padding.VALID: - output_shape = [ - 1, - int(np.ceil((height - K_h + 1) / strides[0])), - int(np.ceil((width - K_w + 1) / strides[1])), - C_out, - ] - - tout = subgraph.create_tensor("output", tin.type, shape=output_shape, isoutput=True) - - op = subgraph.create_operator( - OperatorCode(BuiltinOpCodes.CONV_2D), inputs=[tin, w, b], outputs=[tout] - ) - op.builtin_options = { - "padding": padding, - "fused_activation_function": ActivationFunctionType.NONE, - "stride_h": strides[0], - "stride_w": strides[1], - "dilation_w_factor": 1, - "dilation_h_factor": 1, - } - - return subgraph.model - - -def build_depthwise_conv2d( - subgraph=None, *, weight_shape, input_size, padding, strides=(1, 1) -): - assert len(strides) == 2 - assert padding in Padding - subgraph = subgraph or Subgraph(model=XCOREModel()) - - # NOTE: weight_shape uses channel order HWIM (following TensorFlow DepthwiseConv) - height, width = input_size - K_h, K_w, C_in, depth_multiplier = weight_shape - C_out = C_in * depth_multiplier - - input_shape = [1, input_size[0], input_size[1], C_in] - weight_shape = [1, K_h, K_w, C_out] - tin = subgraph.create_tensor( - "input", - TensorType.INT8, - input_shape, - isinput=True, - quantization={"scale": [0.48], "zero_point": [15]}, - ) - np.random.seed(42) - w = subgraph.create_tensor( - "weights", - TensorType.INT8, - weight_shape, - quantization={ - "scale": np.random.uniform(size=(C_out,)).astype(float).tolist(), - "zero_point": [0] * C_out, - }, - ) - b = subgraph.create_tensor( - "biases", - TensorType.INT32, - shape=[C_out], - quantization={ - "scale": [ - tin.quantization["scale"][0] * s for s in w.quantization["scale"] - ], - "zero_point": [0] * C_out, - }, - ) - - # add dummy data so that the op can be mutated - w.buffer.data = generate_dummy_data(w.shape, np.int8) - b.buffer.data = generate_dummy_data(b.shape, np.int32) - - if padding is Padding.SAME: - output_shape = [1, height, width, C_out] - elif padding is Padding.VALID: - output_shape = [ - 1, - int(np.ceil((height - K_h + 1) / strides[0])), - int(np.ceil((width - K_w + 1) / strides[1])), - C_out, - ] - tout = subgraph.create_tensor("output", tin.type, output_shape, isoutput=True) - - op = subgraph.create_operator( - OperatorCode(BuiltinOpCodes.DEPTHWISE_CONV_2D), - inputs=[tin, w, b], - outputs=[tout], - ) - op.builtin_options = { - "padding": padding, - "depth_multiplier": depth_multiplier, - "stride_h": strides[0], - "stride_w": strides[1], - "dilation_w_factor": 1, - "dilation_h_factor": 1, - } - - return subgraph.model - - -SpatialPadding = Tuple[Tuple[int, int], Tuple[int, int]] - - -def _calculate_implicit_pads( - strides: Tuple[int, int], input_size: Tuple[int, int], kernel_size: Tuple[int, int] -) -> SpatialPadding: - return tuple( - (0, int(np.ceil((i - k) / s) * s - i + k)) - for s, i, k in zip(strides, input_size, kernel_size) - ) - - -def _calculate_out_size( - spatial_pads: SpatialPadding, - strides: Tuple[int, int], - input_size: Tuple[int, int], - kernel_size: Tuple[int, int], -) -> Tuple[int, int]: - return tuple( - int((i - k + p[0] + p[1]) / s + 1) - for p, s, i, k in zip(spatial_pads, strides, input_size, kernel_size) - ) - - -def build_XC_conv2d(opcode, subgraph=None, *, weight_shape, input_size, strides): - subgraph = subgraph or Subgraph(model=XCOREModel()) - - height, width = input_size - C_out, _, _, C_in = weight_shape - - input_shape = [1, height, width, C_in] - bso_shape = [int(np.ceil(C_out / 16)), 7, 16] - tin = subgraph.create_tensor("input", TensorType.INT8, input_shape, isinput=True) - w = subgraph.create_tensor("weights", TensorType.INT8, weight_shape) - b = subgraph.create_tensor("bso", TensorType.INT16, bso_shape) - - # valid padding - pads = _calculate_implicit_pads(strides, input_size, weight_shape[1:3]) - out_size = _calculate_out_size(pads, strides, input_size, weight_shape[1:3]) - output_shape = [C_out, *out_size, C_in] - tout = subgraph.create_tensor("output", tin.type, output_shape, isoutput=True) - - op = subgraph.create_operator( - OperatorCode(opcode), inputs=[tin, w, b], outputs=[tout] - ) - op.add_custom_options(pad=(pads[0][0], pads[1][0]), stride=(strides[0], strides[1])) - - return subgraph.model - - -def build_XC_conv2d_deep(subgraph=None, **kwargs): - return build_XC_conv2d(XCOREOpCodes.XC_conv2d_deep, subgraph, **kwargs) - - -def build_XC_conv2d_shallowin(subgraph=None, **kwargs): - return build_XC_conv2d(XCOREOpCodes.XC_conv2d_shallowin, subgraph, **kwargs) - - -def build_XC_conv2d_1x1(subgraph=None, **kwargs): - return build_XC_conv2d(XCOREOpCodes.XC_conv2d_1x1, subgraph, **kwargs) - - -def build_XC_conv2d_depthwise(subgraph=None, *, weight_shape, input_size, strides): - subgraph = subgraph or Subgraph(model=XCOREModel()) - - height, width = input_size - C_in = weight_shape[2] - - input_shape = [1, height, width, C_in] - bso_shape = [int(np.ceil(C_in / 16)), 7, 16] - tin = subgraph.create_tensor("input", TensorType.INT8, input_shape, isinput=True) - w = subgraph.create_tensor("weights", TensorType.INT8, weight_shape) - b = subgraph.create_tensor("bso", TensorType.INT16, bso_shape) - - # valid padding - pads = _calculate_implicit_pads(strides, input_size, weight_shape[:2]) - out_size = _calculate_out_size(pads, strides, input_size, weight_shape[:2]) - output_shape = [1, *out_size, C_in] - tout = subgraph.create_tensor("output", tin.type, output_shape, isoutput=True) - - op = subgraph.create_operator( - OperatorCode(XCOREOpCodes.XC_conv2d_depthwise), - inputs=[tin, w, b], - outputs=[tout], - ) - op.add_custom_options(pad=(pads[0][0], pads[1][0]), stride=(strides[0], strides[1])) - - return subgraph.model - - -def build_pad(subgraph=None, *, input_shape, paddings): - assert len(paddings) == len(input_shape) == 4 - for j, p in enumerate(paddings): - assert len(p) == 2, f"padding[{j}] is not a pair" - - subgraph = subgraph or Subgraph(model=XCOREModel()) - - output_shape = [i + sum(p) for i, p in zip(input_shape, paddings)] - tin = subgraph.create_tensor( - "unpadded", - TensorType.INT8, - input_shape, - isinput=True, - quantization={"scale": [0.09], "zero_point": [-15]}, - ) - tout = subgraph.create_tensor("padded", tin.type, output_shape, isoutput=True) - p = subgraph.create_tensor("paddings", TensorType.INT32, shape=[4, 2]) - p.buffer.data = np.int32(paddings) - - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.PAD), inputs=[tin, p], outputs=[tout] - ) - - return subgraph.model - - -def _glue_ops(op1, op2): - subgraph = op1.subgraph - assert subgraph is op2.subgraph - - old_input, old_output = op2.inputs[0], op1.outputs[0] - op2.inputs[0] = old_output - subgraph.remove_tensor(old_input) - if old_output in subgraph.outputs: - subgraph.outputs.remove(old_output) - old_output.consumers.append(op2) - - -def _glue_quantize(op): - subgraph = op.subgraph - intermediate = subgraph.outputs[0] - build_quantize(subgraph, input_shape=intermediate.shape) - _glue_ops(op, subgraph.operators[-1]) - - -def build_consecutive_pads(subgraph=None, *, input_shape, paddings_1, paddings_2): - model = build_pad(subgraph, input_shape=input_shape, paddings=paddings_1) - subgraph = subgraph or model.subgraphs[0] - - build_pad(subgraph, input_shape=subgraph.outputs[0].shape, paddings=paddings_2) - - pad_1, pad_2 = subgraph.operators[:2] - _glue_ops(pad_1, pad_2) - - return model - - -def build_non_input_pad(subgraph=None, *, input_shape, paddings): - model = build_pad(subgraph, input_shape=input_shape, paddings=paddings) - subgraph = subgraph or model.subgraphs[0] - - build_abs(subgraph, input_shape=input_shape, tensor_type=TensorType.INT8) - - pad1, abs1 = subgraph.operators[:2] - _glue_ops(abs1, pad1) - - return model - - -def build_reshape( - subgraph=None, - *, - input_shape, - output_shape, - add_batch_dim=False, - input_shape_tensor=True, -): - - if add_batch_dim: - # Prepend dims with batch dimension 1 - input_shape = [1, *input_shape] - - assert 0 < len(output_shape) < 5 - - assert np.prod(input_shape) == np.prod(output_shape), "Inconsistant shapes" - - subgraph = subgraph or Subgraph(model=XCOREModel()) - - tin = subgraph.create_tensor( - "original_shape", TensorType.INT8, input_shape, isinput=True - ) - tout = subgraph.create_tensor("reshaped", tin.type, output_shape, isoutput=True) - - if input_shape_tensor: - p = subgraph.create_tensor("shape", TensorType.INT32, shape=[len(output_shape)]) - p.buffer.data = np.int32(output_shape) - inputs = [tin, p] - else: - inputs = [tin] - - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.RESHAPE), - inputs=inputs, - outputs=[tout], - builtin_options={"new_shape": output_shape}, - ) - return subgraph.model - - -def build_fc_with_preceding_reshape( - subgraph=None, *, input_shape, fc_outputs, reshaped_input_shape -): - model = build_reshape( - subgraph, - input_shape=input_shape, - output_shape=reshaped_input_shape, - add_batch_dim=False, - ) - subgraph = model.subgraphs[0] - - build_fc( - model.subgraphs[0], - outputs=fc_outputs, - input_shape=reshaped_input_shape, - add_batch_dim=False, - ) - - _glue_ops(*subgraph.operators[:2]) - - return model - - -def build_fc_with_subsequent_reshape( - subgraph=None, *, fc_output_shape, reshaped_output_shape -): - model = build_fc( - subgraph, - outputs=np.prod(fc_output_shape), - input_shape=(1, 4), - add_batch_dim=False, - ) - subgraph = model.subgraphs[0] - - build_reshape( - subgraph, - input_shape=fc_output_shape, - output_shape=reshaped_output_shape, - add_batch_dim=False, - ) - fc, reshape = subgraph.operators[:2] - _glue_ops(fc, reshape) - - fc.outputs[0].shape = fc_output_shape - - return model - - -def build_padded_DW(subgraph=None, *, weight_shape, input_size, paddings, strides): - input_shape = [1, *input_size, weight_shape[-1]] - model = build_pad(subgraph, input_shape=input_shape, paddings=paddings) - subgraph = subgraph or model.subgraphs[0] - output_shape = subgraph.outputs[0].shape - - build_XC_conv2d_depthwise( - subgraph, - weight_shape=weight_shape, - input_size=output_shape[1:3], - strides=strides, - ) - - pad_op, conv_op = subgraph.operators[:2] - _glue_ops(pad_op, conv_op) - - old_input = conv_op.inputs[0] - pad_op.outputs[0].quantization = old_input.quantization - pad_op.inputs[0].quantization = old_input.quantization - - return model diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_add_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_add_passes/__init__.py deleted file mode 100644 index 46b12a650..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_add_passes/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from ..conftest import PARAMS, test_replace_mutate diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_add_passes/test_ReplaceAddPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_add_passes/test_ReplaceAddPass.py deleted file mode 100644 index 5240b20a7..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_add_passes/test_ReplaceAddPass.py +++ /dev/null @@ -1,142 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -from typing import Tuple, Optional - - -from tflite2xcore.transformation_passes import ReplaceAddPass -from tflite2xcore.xcore_schema import ( - XCOREModel, - Subgraph, - BuiltinOpCodes, - OperatorCode, - TensorType, - XCOREOpCodes, - Subgraph, -) -from . import test_replace_mutate as _test_replace_mutate - - -# ---------------------------------------------------------------------------- -# HELPERS -# ---------------------------------------------------------------------------- - - -def build_add( - subgraph: Optional[Subgraph] = None, - *, - input_shape: Tuple[int, ...], - tensor_type: TensorType -) -> XCOREModel: - subgraph = subgraph or Subgraph(model=XCOREModel()) - input_tensor_0 = subgraph.create_tensor( - "input_0", - tensor_type, - input_shape, - isinput=True, - quantization={"scale": [0.35], "zero_point": [0]}, - ) - input_tensor_1 = subgraph.create_tensor( - "input_1", - tensor_type, - input_shape, - isinput=True, - quantization={"scale": [0.15], "zero_point": [2]}, - ) - output_tensor = subgraph.create_tensor( - "output", - tensor_type, - input_shape, - isoutput=True, - quantization={"scale": [0.25], "zero_point": [1]}, - ) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.ADD), - inputs=[input_tensor_0, input_tensor_1], - outputs=[output_tensor], - ) - return subgraph.model - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = { - "default": { - "tensor_type": [TensorType.INT8], - "non_matching_tensor_type": [TensorType.INT16, TensorType.FLOAT32], - "input_height": [9, 20], - "input_width": [7, 17], - "input_channels": [4, 16, 32], - } -} - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> ReplaceAddPass: - return ReplaceAddPass() - - -@pytest.fixture() -def new_opcode() -> XCOREOpCodes: - return XCOREOpCodes.XC_add_8 - - -@pytest.fixture() -def model(input_shape: Tuple[int, int, int], tensor_type: TensorType) -> XCOREModel: - return build_add(input_shape=input_shape, tensor_type=tensor_type) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_matching_params(trf_pass: ReplaceAddPass, model: XCOREModel) -> None: - assert trf_pass.match(model.subgraphs[0].operators[0]) - - -def test_non_matching_tensor_type( - trf_pass: ReplaceAddPass, non_matching_tensor_type: TensorType, model: XCOREModel -) -> None: - model.subgraphs[0].get_tensor("input_1").type = TensorType - assert not trf_pass.match(model.subgraphs[0].operators[0]) - - -def test_non_matching_tensor_shape(trf_pass: ReplaceAddPass, model: XCOREModel) -> None: - current_shape = model.subgraphs[0].get_tensor("input_1").shape - new_shape = (current_shape[0] + 1, *current_shape[1:]) - model.subgraphs[0].get_tensor("input_1").shape = new_shape - assert not trf_pass.match(model.subgraphs[0].operators[0]) - - -def test_mutate( - trf_pass: ReplaceAddPass, model: XCOREModel, new_opcode: XCOREOpCodes -) -> None: - # run mutating pass - trf_pass.run(model) - model.sanity_check() - - _test_replace_mutate(trf_pass, model, new_opcode) - - # check operators - subgraph = model.subgraphs[0] - operators = subgraph.operators - assert len(operators) == 1 - op = operators[0] - - # check tensors - assert len(op.inputs) == 3 - assert len(op.outputs) == 1 - assert op.inputs[2].shape == (6,) - assert op.inputs[2].type is TensorType.INT32 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_constant_propagation_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_constant_propagation_passes/__init__.py deleted file mode 100644 index e613cb693..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_constant_propagation_passes/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np -from typing import Tuple, Optional - -from tflite2xcore.utils import QuantizationTuple -from tflite2xcore.xcore_model import XCOREModel - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - generate_dummy_data, - build_dequantize, - build_quantize, - _glue_ops, -) - -from ..conftest import ( # pylint: disable=unused-import - PARAMS, - test_matching_params, - _test_non_matching_params, -) - - -def build_quantize_dequantize_identity( - *, input_shape: Tuple[int, ...], quantization: Optional[QuantizationTuple] = None -) -> XCOREModel: - model = build_dequantize(input_shape=input_shape, input_quantization=quantization) - subgraph = model.subgraphs[0] - subgraph.operators[0].inputs[0].buffer.data = generate_dummy_data( - input_shape, np.int8 - ) - - build_quantize(subgraph, input_shape=input_shape, output_quantization=quantization) - _glue_ops(*subgraph.operators) - - subgraph.inputs = [] - - return model diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_constant_propagation_passes/test_ConstantPropagationPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_constant_propagation_passes/test_ConstantPropagationPass.py deleted file mode 100644 index d0425dc4c..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_constant_propagation_passes/test_ConstantPropagationPass.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -from typing import Tuple - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import ConstantPropagationPass -from tflite2xcore.converter import CleanupManager - -from . import build_quantize_dequantize_identity - -from . import ( # pylint: disable=unused-import - PARAMS, - test_matching_params as _test_matching_params, - _test_non_matching_params, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> ConstantPropagationPass: - return ConstantPropagationPass() - - -@pytest.fixture() -def model(input_shape: Tuple[int, int, int]) -> XCOREModel: - return build_quantize_dequantize_identity(input_shape=input_shape) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_matching_params(trf_pass: ConstantPropagationPass, model: XCOREModel) -> None: - _test_matching_params(trf_pass, model, op_idx=0) - - -def test_non_matching_input_tensor( - trf_pass: ConstantPropagationPass, model: XCOREModel -) -> None: - _test_non_matching_params(trf_pass, model, op_idx=1) - - -def test_mutate(trf_pass: ConstantPropagationPass, model: XCOREModel) -> None: - subgraph = model.subgraphs[0] - operators = subgraph.operators - old_output = subgraph.outputs[0] - assert not old_output.buffer.data - - data = operators[0].inputs[0].buffer.data - - # run mutating pass, then clean up - trf_pass.run(model) - model.sanity_check() - CleanupManager(model).run_passes() - - assert not operators - assert len(subgraph.tensors) == 1 - assert subgraph.tensors[0] is old_output - assert old_output.buffer.data == data - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/conftest.py deleted file mode 100644 index 38729d7c8..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/conftest.py +++ /dev/null @@ -1,218 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -from typing import Tuple -from copy import deepcopy - -from tflite2xcore.transformation_passes import ModelTransformationPass -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import Padding, XCOREOpCodes - -from tflite2xcore.tests.test_transformation_passes.model_builders import ModelBuilder -from ..test_fully_connected_passes.conftest import PARAMS as FC_PARAMS -from ..conftest import ( - PARAMS, - _test_non_matching_params, - test_matching_params, - test_non_matching_tensors, - test_replace_mutate as _test_replace_mutate, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -# NOTE: this is intentional to reduce test counts -PARAMS["extended"]["non_matching_tensors"] = FC_PARAMS["default"][ - "non_matching_tensors" -] -PARAMS["default"]["non_matching_tensors"] = FC_PARAMS["smoke"]["non_matching_tensors"] -PARAMS["smoke"]["non_matching_tensors"] = FC_PARAMS["smoke"]["non_matching_tensors"] - -PARAMS["extended"].update( - { - "kernel_height": [2, 3, 5, 7], - "kernel_width": [2, 3, 5, 7], - "non_matching_input_channels": [3, 9, 15], - "output_channels": PARAMS["extended"]["input_channels"], - "non_matching_output_channels": [3, 9, 15], - "padding": list(Padding), - "stride_h": [1, 2, 3], - "stride_w": [1, 2, 3], - } -) - -PARAMS["default"].update( - { - "kernel_height": [2, 3, 5], - "kernel_width": [2, 3, 5], - "non_matching_input_channels": [3, 15], - "input_channels": PARAMS["default"]["input_channels"][1:], - "output_channels": PARAMS["default"]["input_channels"][1:], - "non_matching_output_channels": [3, 15], - "padding": list(Padding), - "stride_h": [1, 2], - "stride_w": [1, 2], - } -) - -PARAMS["smoke"].update( - { - "kernel_height": [2, 3], - "kernel_width": [2, 3], - "non_matching_input_channels": [9], - "output_channels": PARAMS["smoke"]["input_channels"], - "non_matching_output_channels": [9], - "padding": list(Padding), - "stride_h": [1], - "stride_w": [1], - } -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def weight_shape( - output_channels: int, kernel_height: int, kernel_width: int, input_channels: int -) -> Tuple[int, int, int, int]: - return [output_channels, kernel_height, kernel_width, input_channels] - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_non_matching_output_channels( - trf_pass: ModelTransformationPass, - build_model: ModelBuilder, - non_matching_output_channels: int, - kernel_height: int, - kernel_width: int, - input_channels: int, - input_size: Tuple[int, int], - padding: Padding, - strides: Tuple[int, int], -) -> None: - model = build_model( - weight_shape=[ - non_matching_output_channels, - kernel_height, - kernel_width, - input_channels, - ], - input_size=input_size, - padding=padding, - strides=strides, - ) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_kernel_height( - trf_pass: ModelTransformationPass, - build_model: ModelBuilder, - output_channels: int, - non_matching_kernel_height: int, - kernel_width: int, - input_channels: int, - input_size: Tuple[int, int], - padding: Padding, - strides: Tuple[int, int], -) -> None: - model = build_model( - weight_shape=[ - output_channels, - non_matching_kernel_height, - kernel_width, - input_channels, - ], - input_size=input_size, - padding=padding, - strides=strides, - ) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_kernel_width( - trf_pass: ModelTransformationPass, - build_model: ModelBuilder, - output_channels: int, - kernel_height: int, - non_matching_kernel_width: int, - input_channels: int, - input_size: Tuple[int, int], - padding: Padding, - strides: Tuple[int, int], -) -> None: - model = build_model( - weight_shape=[ - output_channels, - kernel_height, - non_matching_kernel_width, - input_channels, - ], - input_size=input_size, - padding=padding, - strides=strides, - ) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_input_channels( - trf_pass: ModelTransformationPass, - build_model: ModelBuilder, - output_channels: int, - kernel_height: int, - kernel_width: int, - non_matching_input_channels: int, - input_size: Tuple[int, int], - padding: Padding, - strides: Tuple[int, int], -) -> None: - model = build_model( - weight_shape=[ - output_channels, - kernel_height, - kernel_width, - non_matching_input_channels, - ], - input_size=input_size, - padding=padding, - strides=strides, - ) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_stride_w( - trf_pass: ModelTransformationPass, model: XCOREModel, non_matching_stride_w: int -) -> None: - op = model.subgraphs[0].operators[0] - op.builtin_options["stride_w"] = non_matching_stride_w - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_stride_h( - trf_pass: ModelTransformationPass, model: XCOREModel, non_matching_stride_h: int -) -> None: - op = model.subgraphs[0].operators[0] - op.builtin_options["stride_h"] = non_matching_stride_h - _test_non_matching_params(trf_pass, model) - - -def test_replace_mutate( - trf_pass: ModelTransformationPass, model: XCOREModel, custom_opcode: XCOREOpCodes -) -> None: - _test_replace_mutate(trf_pass, model, custom_opcode) - - # check custom options - custom_options = model.subgraphs[0].operators[-1].custom_options - assert "illegal_params" in custom_options - assert custom_options["illegal_params"] is True diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_CanonicalizeSinglePixelConv2DPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_CanonicalizeSinglePixelConv2DPass.py deleted file mode 100644 index db92b9eaa..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_CanonicalizeSinglePixelConv2DPass.py +++ /dev/null @@ -1,160 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import numpy as np -from copy import deepcopy -from typing import Tuple - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import Padding, BuiltinOpCodes -from tflite2xcore.transformation_passes import CanonicalizeSinglePixelConv2DPass - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_conv2d, - ModelBuilder, -) - -from .conftest import ( - PARAMS, - _test_non_matching_params, - _test_replace_mutate, - test_matching_params, - test_non_matching_tensors, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - - -PARAMS = deepcopy(PARAMS) - -for params in PARAMS.values(): - params.update( - { - "input_channels": params["input_channels"] - + params["non_matching_input_channels"], - "output_channels": params["input_channels"] - + params["non_matching_output_channels"], - "input_height": params["kernel_height"] + params["input_height"], - "input_width": params["kernel_width"] + params["input_width"], - } - ) - -PARAMS["extended"].update( - {"input_height_deviation": [1, 2, 4], "input_width_deviation": [1, 2, 5]} -) -PARAMS["default"].update( - {"input_height_deviation": [1, 4], "input_width_deviation": [2, 5]} -) -PARAMS["smoke"].update({"input_height_deviation": [1], "input_width_deviation": [2]}) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def build_model() -> ModelBuilder: - return build_conv2d - - -@pytest.fixture() -def trf_pass() -> CanonicalizeSinglePixelConv2DPass: - return CanonicalizeSinglePixelConv2DPass() - - -@pytest.fixture() -def weight_shape( - output_channels: int, input_size: Tuple[int, int], input_channels: int -) -> Tuple[int, int, int, int]: - return [output_channels, *input_size, input_channels] - - -@pytest.fixture() -def model(weight_shape: Tuple[int, int, int, int]) -> XCOREModel: - return build_conv2d( - weight_shape=weight_shape, - input_size=weight_shape[1:3], - # padding and stride should not matter for this model - # but usind this builder guarantees the 1x1 output - padding=Padding.VALID, - strides=(1, 1), - ) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate(trf_pass: CanonicalizeSinglePixelConv2DPass, model: XCOREModel) -> None: - subgraph = model.subgraphs[0] - old_op = subgraph.operators[0] - - old_input, old_weights, old_bias = old_op.inputs[:3] - old_output = old_op.outputs[0] - - old_weight_shape = old_weights.shape - old_weight_quantization = old_weights.quantization - old_fused_activation = old_op.builtin_options["fused_activation_function"] - - _test_replace_mutate(trf_pass, model, BuiltinOpCodes.FULLY_CONNECTED) - new_op = subgraph.operators[0] - new_weights = new_op.inputs[1] - - # check tensor objects - assert old_input == new_op.inputs[0] - assert old_weights != new_weights - assert old_bias == new_op.inputs[2] - assert old_output == new_op.outputs[0] - - # check weight tensor - new_weight_shape = new_weights.shape - assert len(new_weight_shape) == 2 - assert old_weight_shape[0] == new_weight_shape[0] - assert np.prod(old_weight_shape[1:]) == new_weight_shape[1] - assert old_fused_activation == new_op.builtin_options["fused_activation_function"] - assert old_weight_quantization == new_weights.quantization - - -def test_non_matching_input_size( - trf_pass: CanonicalizeSinglePixelConv2DPass, - build_model: ModelBuilder, - weight_shape: Tuple[int, int, int, int], - input_height_deviation: int, - input_width_deviation: int, -) -> None: - input_size = ( - weight_shape[1] + input_height_deviation, - weight_shape[2] + input_width_deviation, - ) - model = build_conv2d( - weight_shape=weight_shape, - input_size=input_size, - # valid padding and strides equal to the input size ensures (1, 1) output - padding=Padding.VALID, - strides=input_size, - ) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_output_size( - trf_pass: CanonicalizeSinglePixelConv2DPass, - build_model: ModelBuilder, - weight_shape: Tuple[int, int, int, int], -) -> None: - model = build_conv2d( - weight_shape=weight_shape, - input_size=weight_shape[1:3], - padding=Padding.SAME, # this assumes that input is never 1x1 - strides=(1, 1), - ) - _test_non_matching_params(trf_pass, model) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_CanonicalizeSingleinDepthwiseConv2DPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_CanonicalizeSingleinDepthwiseConv2DPass.py deleted file mode 100644 index 73efa9558..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_CanonicalizeSingleinDepthwiseConv2DPass.py +++ /dev/null @@ -1,99 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import ( - CanonicalizeSingleinDepthwiseConv2DPass, - LegalizeSingleinConv2DPass, -) - -from .test_ReplaceDepthwiseConv2dPass import ( - weight_shape, - build_model, - model, - test_non_matching_input_channels, - test_non_matching_depth_multiplier, -) -from .conftest import ( - PARAMS, - test_matching_params, - test_non_matching_tensors, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -for k in PARAMS: - non_matching_input_channels = [ - c - for c in PARAMS[k]["input_channels"] + PARAMS[k]["non_matching_input_channels"] - if c > 1 - ] - PARAMS[k].update( - { - "input_channels": [1], - "non_matching_input_channels": non_matching_input_channels, - "depth_multiplier": PARAMS[k]["output_channels"], - "non_matching_depth_multiplier": PARAMS[k]["non_matching_output_channels"], - } - ) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> CanonicalizeSingleinDepthwiseConv2DPass: - return CanonicalizeSingleinDepthwiseConv2DPass() - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate( - trf_pass: CanonicalizeSingleinDepthwiseConv2DPass, model: XCOREModel -) -> None: - # extract reference data - subgraph = model.subgraphs[0] - old_op = subgraph.operators[0] - old_weight_shape = old_op.inputs[1].shape - old_bias = old_op.inputs[2] - - # run transformation passes - trf_pass.run(model) - model.sanity_check() - assert len(subgraph.operators) == 1 - - LegalizeSingleinConv2DPass().run(model) - model.sanity_check() - assert len(subgraph.operators) == 1 - - # check operator - op = subgraph.operators[0] - assert len(op.inputs) == 3 - assert len(op.outputs) == 1 - - # check weight shape - new_weight_shape = op.inputs[1].shape - assert new_weight_shape[0] == old_weight_shape[3] - assert new_weight_shape[1:2] == old_weight_shape[1:2] - assert new_weight_shape[3] == old_weight_shape[0] - - # check bias - assert old_bias is op.inputs[2] - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_Replace1x1Conv2dPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_Replace1x1Conv2dPass.py deleted file mode 100644 index 617235486..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_Replace1x1Conv2dPass.py +++ /dev/null @@ -1,113 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -from typing import Tuple -from copy import deepcopy - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import XCOREOpCodes, Padding -from tflite2xcore.transformation_passes import Replace1x1Conv2dPass - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_conv2d, - ModelBuilder, -) -from .conftest import ( - PARAMS, - test_replace_mutate as test_mutate, - test_matching_params, - test_non_matching_output_channels, - test_non_matching_kernel_height, - test_non_matching_kernel_width, - test_non_matching_input_channels, - test_non_matching_stride_h, - test_non_matching_stride_w, - test_non_matching_tensors, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -PARAMS["extended"].update( - { - "kernel_width": [1], - "non_matching_kernel_width": [2, 3, 5, 7], - "kernel_height": [1], - "non_matching_kernel_height": [2, 3, 5, 7], - "stride_h": [1], - "non_matching_stride_h": [2, 3], - "stride_w": [1], - "non_matching_stride_w": [2, 3], - } -) - -PARAMS["default"].update( - { - "kernel_width": [1], - "non_matching_kernel_width": [2, 3, 7], - "kernel_height": [1], - "non_matching_kernel_height": [2, 3, 7], - "stride_h": [1], - "non_matching_stride_h": [2, 3], - "stride_w": [1], - "non_matching_stride_w": [2, 3], - } -) - -PARAMS["smoke"].update( - { - "kernel_width": [1], - "non_matching_kernel_width": [2, 3], - "kernel_height": [1], - "non_matching_kernel_height": [2, 3], - "stride_h": [1], - "non_matching_stride_h": [2], - "stride_w": [1], - "non_matching_stride_w": [2], - } -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def build_model() -> ModelBuilder: - return build_conv2d - - -@pytest.fixture() -def trf_pass() -> Replace1x1Conv2dPass: - return Replace1x1Conv2dPass() - - -@pytest.fixture() -def model( - weight_shape: Tuple[int, int, int, int], - input_size: Tuple[int, int], - padding: Padding, - strides: Tuple[int, int], -) -> XCOREModel: - model = build_conv2d( - weight_shape=weight_shape, - input_size=input_size, - padding=padding, - strides=strides, - ) - return model - - -@pytest.fixture() -def custom_opcode() -> XCOREOpCodes: - return XCOREOpCodes.XC_conv2d_1x1 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_ReplaceDeepConv2dPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_ReplaceDeepConv2dPass.py deleted file mode 100644 index a4c83f7d5..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_ReplaceDeepConv2dPass.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -from typing import Tuple - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import XCOREOpCodes, Padding -from tflite2xcore.transformation_passes import ( - ModelTransformationPass, - ReplaceDeepConv2dPass, -) - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_conv2d, - ModelBuilder, -) -from .conftest import ( - PARAMS, - test_replace_mutate as _test_mutate, - test_matching_params, - test_non_matching_output_channels, - test_non_matching_input_channels, - test_non_matching_tensors, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() # type: ignore -def build_model() -> ModelBuilder: - return build_conv2d - - -@pytest.fixture() # type: ignore -def trf_pass() -> ReplaceDeepConv2dPass: - return ReplaceDeepConv2dPass() - - -@pytest.fixture() # type: ignore -def model( - weight_shape: Tuple[int, int, int, int], - input_size: Tuple[int, int], - padding: Padding, - strides: Tuple[int, int], -) -> XCOREModel: - return build_conv2d( - weight_shape=weight_shape, - input_size=input_size, - padding=padding, - strides=strides, - ) - - -@pytest.fixture() # type: ignore -def custom_opcode() -> XCOREOpCodes: - return XCOREOpCodes.XC_conv2d_deep - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate( - trf_pass: ModelTransformationPass, model: XCOREModel, custom_opcode: XCOREOpCodes -) -> None: - subgraph = model.subgraphs[0] - old_op = subgraph.operators[0] - strides = tuple(old_op.builtin_options[f"stride_{ax}"] for ax in ("h", "w")) - - _test_mutate(trf_pass, model, custom_opcode) - - custom_options = subgraph.operators[-1].custom_options - assert "stride" in custom_options - assert custom_options["stride"] == strides - - assert "pad" in custom_options - assert len(custom_options["pad"]) == 2 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_ReplaceDepthwiseConv2dPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_ReplaceDepthwiseConv2dPass.py deleted file mode 100644 index d8a2b0168..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_ReplaceDepthwiseConv2dPass.py +++ /dev/null @@ -1,143 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -from typing import Tuple -from copy import deepcopy - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import XCOREOpCodes, Padding -from tflite2xcore.transformation_passes import ( - ModelTransformationPass, - ReplaceDepthwiseConv2dPass, -) - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - ModelBuilder, - build_depthwise_conv2d, -) -from .conftest import ( - PARAMS, - _test_non_matching_params, - test_matching_params, - test_non_matching_tensors, -) -from .test_ReplaceDeepConv2dPass import test_mutate - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -PARAMS["extended"].update( - {"depth_multiplier": [1], "non_matching_depth_multiplier": [2, 5, 16]} -) - -PARAMS["default"].update( - {"depth_multiplier": [1], "non_matching_depth_multiplier": [2, 16]} -) - -PARAMS["smoke"].update({"depth_multiplier": [1], "non_matching_depth_multiplier": [16]}) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def build_model() -> ModelBuilder: - return build_depthwise_conv2d - - -@pytest.fixture() -def trf_pass() -> ReplaceDepthwiseConv2dPass: - return ReplaceDepthwiseConv2dPass() - - -@pytest.fixture() -def weight_shape( - depth_multiplier: int, kernel_height: int, kernel_width: int, input_channels: int -) -> Tuple[int, int, int, int]: - return [kernel_height, kernel_width, input_channels, depth_multiplier] - - -@pytest.fixture() -def model( - weight_shape: Tuple[int, int, int, int], - input_size: Tuple[int, int], - padding: Padding, - strides: Tuple[int, int], -) -> XCOREModel: - return build_depthwise_conv2d( - weight_shape=weight_shape, - input_size=input_size, - padding=padding, - strides=strides, - ) - - -@pytest.fixture() -def custom_opcode() -> XCOREOpCodes: - return XCOREOpCodes.XC_conv2d_depthwise - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_non_matching_input_channels( - trf_pass: ModelTransformationPass, - build_model: ModelBuilder, - depth_multiplier: int, - kernel_height: int, - kernel_width: int, - non_matching_input_channels: int, - input_size: Tuple[int, int], - padding: Padding, - strides: Tuple[int, int], -) -> None: - model = build_model( - weight_shape=[ - kernel_height, - kernel_width, - non_matching_input_channels, - depth_multiplier, - ], - input_size=input_size, - padding=padding, - strides=strides, - ) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_depth_multiplier( - trf_pass: ModelTransformationPass, - build_model: ModelBuilder, - non_matching_depth_multiplier: int, - kernel_height: int, - kernel_width: int, - input_channels: int, - input_size: Tuple[int, int], - padding: Padding, - strides: Tuple[int, int], -) -> None: - model = build_model( - weight_shape=[ - kernel_height, - kernel_width, - input_channels, - non_matching_depth_multiplier, - ], - input_size=input_size, - padding=padding, - strides=strides, - ) - _test_non_matching_params(trf_pass, model) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_ReplaceShallowinConv2dPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_ReplaceShallowinConv2dPass.py deleted file mode 100644 index d3dd18bd7..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_conv2d_passes/test_ReplaceShallowinConv2dPass.py +++ /dev/null @@ -1,126 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -from typing import Tuple -from copy import deepcopy - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import XCOREOpCodes, Padding -from tflite2xcore.transformation_passes import ReplaceShallowinConv2dPass - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - ModelBuilder, - build_conv2d, -) -from .conftest import ( - PARAMS, - _test_non_matching_params, - test_matching_params, - test_non_matching_output_channels, - test_non_matching_input_channels, - test_non_matching_tensors, -) -from .test_ReplaceDeepConv2dPass import test_mutate as _test_mutate - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -PARAMS["extended"].update( - {"input_channels": list(range(4, 36, 4)), "kernel_width": list(range(1, 9))} -) - -PARAMS["default"].update({"input_channels": [4, 8, 16], "kernel_width": [2, 3, 5]}) - -PARAMS["smoke"].update({"input_channels": [4, 8], "kernel_width": [3, 5]}) - -for k in PARAMS: - all_tails = [ - (kw, cin) - for cin in PARAMS[k]["input_channels"] - for kw in PARAMS[k]["kernel_width"] - ] - PARAMS[k].update( - weight_tail=[t for t in all_tails if t[0] * t[1] <= 32], - non_matching_weight_tail=[t for t in all_tails if t[0] * t[1] > 32], - ) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def build_model() -> ModelBuilder: - return build_conv2d - - -@pytest.fixture() -def trf_pass() -> ReplaceShallowinConv2dPass: - return ReplaceShallowinConv2dPass() - - -@pytest.fixture() -def weight_shape( - output_channels: int, kernel_height: int, weight_tail: int -) -> Tuple[int, int, int]: - return [output_channels, kernel_height, *weight_tail] - - -@pytest.fixture() -def model( - weight_shape: Tuple[int, int, int], - input_size: Tuple[int, int], - padding: Padding, - strides: Tuple[int, int], -) -> XCOREModel: - return build_conv2d( - weight_shape=weight_shape, - input_size=input_size, - padding=padding, - strides=strides, - ) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate(trf_pass: ReplaceShallowinConv2dPass, model: XCOREModel) -> None: - subgraph = model.subgraphs[0] - K_w = subgraph.operators[0].inputs[1].shape[2] - - _test_mutate(trf_pass, model, custom_opcode=XCOREOpCodes.XC_conv2d_shallowin) - - custom_options = subgraph.operators[-1].custom_options - assert "Kw" in custom_options - assert custom_options["Kw"] == K_w - - -def test_non_matching_weight_tail( - trf_pass: ReplaceShallowinConv2dPass, - build_model: ModelBuilder, - output_channels: int, - kernel_height: int, - non_matching_weight_tail: Tuple[int, int], - input_size: Tuple[int, int], - padding: Padding, - strides: Tuple[int, int], -) -> None: - model = build_model( - weight_shape=[output_channels, kernel_height, *non_matching_weight_tail], - input_size=input_size, - padding=padding, - strides=strides, - ) - _test_non_matching_params(trf_pass, model) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/__init__.py deleted file mode 100644 index b01e5a73d..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/__init__.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import TensorType - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_tanh, - _glue_ops, -) - -from ..conftest import ( # pylint: disable=unused-import - _test_non_matching_params, - test_matching_params, -) - -# ---------------------------------------------------------------------------- -# HELPERS -# ---------------------------------------------------------------------------- - - -def count_tensors(model: XCOREModel) -> int: - return sum(len(subgraph.tensors) for subgraph in model.subgraphs) - - -def count_operators(model: XCOREModel) -> int: - return sum(len(subgraph.operators) for subgraph in model.subgraphs) - - -def add_dangling_tensor(model: XCOREModel) -> None: - model.subgraphs[0].create_tensor( - "dangling_tensor", TensorType.INT16, shape=[1, 32, 1, 1] - ) - - -def add_dangling_ops(model: XCOREModel) -> None: - subgraph = model.subgraphs[0] - tin, tout = subgraph.inputs[0], subgraph.outputs[0] - - # add first op - build_tanh(subgraph, input_shape=tout.shape, tensor_type=tout.type) - _glue_ops(subgraph.operators[0], subgraph.operators[1]) - dangling_tensor = subgraph.operators[1].outputs[0] - - # add second op - build_tanh( - subgraph, input_shape=dangling_tensor.shape, tensor_type=dangling_tensor.type - ) - _glue_ops(subgraph.operators[1], subgraph.operators[2]) - - # fix inputs and outputs - subgraph.inputs, subgraph.outputs = [tin], [tout] diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/conftest.py deleted file mode 100644 index 96f3631b1..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/conftest.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import TensorType - -from tflite2xcore.tests.test_transformation_passes.model_builders import build_relu - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() # type: ignore -def model() -> XCOREModel: - return build_relu(input_shape=[2, 2, 4], tensor_type=TensorType.INT8) diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/dce_composite_test.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/dce_composite_test.py deleted file mode 100644 index 09d5bb127..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/dce_composite_test.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import XCOREModel, Metadata - -from tflite2xcore.transformation_passes import ( - EliminateDeadBuffersPass, - EliminateDeadTensorsPass, - EliminateDeadOperatorsPass, -) - -from . import ( - count_tensors, - count_operators, - add_dangling_ops, - add_dangling_tensor, -) - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_mutate(model: XCOREModel) -> None: - add_dangling_ops(model) - add_dangling_tensor(model) - Metadata("dummy", model) - num_ops = count_operators(model) - num_tensors = count_tensors(model) - num_buffers = len(model.buffers) - - # add_dangling_ops leaves two dead buffers, remove those first - pass2 = EliminateDeadBuffersPass() - pass2.run(model) - model.sanity_check() - - assert num_ops == count_operators(model) - assert num_tensors == count_tensors(model) - assert num_buffers == len(model.buffers) + 2 - - # this will remove two dead ops, and leave their outputs dangling - EliminateDeadOperatorsPass().run(model) - model.sanity_check() - - assert num_ops == count_operators(model) + 2 - assert num_tensors == count_tensors(model) - assert num_buffers == len(model.buffers) + 2 - - # this cleans up the original danling tensor, plus the other two left by the previous pass - EliminateDeadTensorsPass().run(model) - model.sanity_check() - - assert num_ops == count_operators(model) + 2 - assert num_tensors == count_tensors(model) + 3 - assert num_buffers == len(model.buffers) + 2 - - # each tensor leaves one dead buffer - pass2 = EliminateDeadBuffersPass() - pass2.run(model) - model.sanity_check() - - assert num_ops == count_operators(model) + 2 - assert num_tensors == count_tensors(model) + 3 - assert num_buffers == len(model.buffers) + 2 + 3 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/test_EliminateDeadBuffersPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/test_EliminateDeadBuffersPass.py deleted file mode 100644 index 0b3328976..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/test_EliminateDeadBuffersPass.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import XCOREModel, Buffer, Metadata -from tflite2xcore.transformation_passes import EliminateDeadBuffersPass - -from . import add_dangling_tensor - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() # type: ignore -def trf_pass() -> EliminateDeadBuffersPass: - return EliminateDeadBuffersPass() - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_non_matching(model: XCOREModel, trf_pass: EliminateDeadBuffersPass) -> None: - add_dangling_tensor(model) - Metadata("dummy", model) - num_buffers = len(model.buffers) - trf_pass.run(model) - model.sanity_check() - assert num_buffers == len(model.buffers) - - -def test_mutate_identity(model: XCOREModel, trf_pass: EliminateDeadBuffersPass) -> None: - num_buffers = len(model.buffers) - trf_pass.run(model) - model.sanity_check() - assert num_buffers == len(model.buffers) - - -def test_mutate(model: XCOREModel, trf_pass: EliminateDeadBuffersPass) -> None: - Buffer(model) - Metadata("dummy", model) - num_buffers = len(model.buffers) - trf_pass.run(model) - model.sanity_check() - assert num_buffers == len(model.buffers) + 1 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/test_EliminateDeadOperatorsPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/test_EliminateDeadOperatorsPass.py deleted file mode 100644 index aa920de18..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/test_EliminateDeadOperatorsPass.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import EliminateDeadOperatorsPass - -from . import count_operators, add_dangling_ops - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() # type:ignore -def trf_pass() -> EliminateDeadOperatorsPass: - return EliminateDeadOperatorsPass() - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_mutate_identity( - model: XCOREModel, trf_pass: EliminateDeadOperatorsPass -) -> None: - num_ops = count_operators(model) - trf_pass.run(model) - model.sanity_check() - assert num_ops == count_operators(model) - - -def test_mutate(model: XCOREModel, trf_pass: EliminateDeadOperatorsPass) -> None: - add_dangling_ops(model) - num_ops = count_operators(model) - trf_pass.run(model) - model.sanity_check() - assert num_ops == count_operators(model) + 2 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/test_EliminateDeadTensorsPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/test_EliminateDeadTensorsPass.py deleted file mode 100644 index 8cfc311e0..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_dce_passes/test_EliminateDeadTensorsPass.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import EliminateDeadTensorsPass - -from . import count_tensors, add_dangling_tensor - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() # type:ignore -def trf_pass() -> EliminateDeadTensorsPass: - return EliminateDeadTensorsPass() - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_mutate_identity(model: XCOREModel, trf_pass: EliminateDeadTensorsPass) -> None: - num_tensors = count_tensors(model) - trf_pass.run(model) - model.sanity_check() - assert num_tensors == count_tensors(model) - - -def test_mutate(model: XCOREModel, trf_pass: EliminateDeadTensorsPass) -> None: - add_dangling_tensor(model) - num_tensors = count_tensors(model) - trf_pass.run(model) - model.sanity_check() - assert num_tensors == count_tensors(model) + 1 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_fully_connected_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_fully_connected_passes/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_fully_connected_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_fully_connected_passes/conftest.py deleted file mode 100644 index 7d61f9d16..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_fully_connected_passes/conftest.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import itertools -from copy import deepcopy -from typing import Tuple - -from tflite2xcore.xcore_model import XCOREModel - -from tflite2xcore.tests.test_transformation_passes.model_builders import build_fc -from ..conftest import ( - PARAMS, - _test_non_matching_params, - _make_name_type_pairs, - NON_INT8_TEST_TYPES, - NON_INT32_TEST_TYPES, - test_matching_params, - test_non_matching_tensors, - test_replace_mutate, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -_NON_MATCHING_TENSORS = list( - itertools.chain( - _make_name_type_pairs("input", NON_INT8_TEST_TYPES), - _make_name_type_pairs("weights", NON_INT8_TEST_TYPES), - _make_name_type_pairs("biases", NON_INT32_TEST_TYPES), - _make_name_type_pairs("output", NON_INT8_TEST_TYPES), - ) -) - -PARAMS = deepcopy(PARAMS) - -PARAMS["extended"].update( - { - "input_channels": [5, 8, 10, 16, 29, 64], - "outputs": [1, 2, 10, 16, 29, 100], - "non_matching_tensors": _NON_MATCHING_TENSORS, - } -) - -PARAMS["default"].update( - { - "input_channels": [5, 10, 29, 64], - "outputs": [2, 10, 16, 100], - "non_matching_tensors": _NON_MATCHING_TENSORS[::2], - } -) - -PARAMS["smoke"].update( - { - "input_channels": [5, 29], - "outputs": [2, 10], - "non_matching_tensors": _NON_MATCHING_TENSORS[::4], - } -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def model(input_shape: Tuple[int, int, int], outputs: int) -> XCOREModel: - return build_fc(input_shape=input_shape, outputs=outputs) diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_fully_connected_passes/test_LegalizeXCFullyConnectedPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_fully_connected_passes/test_LegalizeXCFullyConnectedPass.py deleted file mode 100644 index de3a47d01..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_fully_connected_passes/test_LegalizeXCFullyConnectedPass.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import numpy as np - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import ( - ReplaceFullyConnectedPass, - LegalizeXCFullyConnectedPass, -) - -from .conftest import PARAMS - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_mutate(model: XCOREModel) -> None: - # extract original parameters - subgraph = model.subgraphs[0] - op = subgraph.operators[0] - - weight_shape_old = op.inputs[1].shape - assert len(weight_shape_old) == 2 - dim_out, dim_in = weight_shape_old - - bias_shape_old = op.inputs[2].shape - assert len(bias_shape_old) == 1 - assert bias_shape_old[0] == dim_out - - # run replacement pass - ReplaceFullyConnectedPass().run(model) - model.sanity_check() - assert len(subgraph.operators) == 1 - - # run legalization pass - LegalizeXCFullyConnectedPass().run(model) - model.sanity_check() - assert len(subgraph.operators) == 1 - new_op = subgraph.operators[0] - assert len(new_op.inputs) == 3 - - # check weight tensors - weight_shape_new = new_op.inputs[1].shape - assert len(weight_shape_new) == 2 - assert weight_shape_new[0] == dim_out - assert weight_shape_new[1] == int(np.ceil(dim_in / 4)) * 4 - - # check bias/scale/offset tensor - bso_shape = new_op.inputs[2].shape - assert len(bso_shape) == 3 - assert bso_shape[0] == int(np.ceil(dim_out / 16)) - assert bso_shape[1] == 7 - assert bso_shape[2] == 16 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_fully_connected_passes/test_ReplaceFullyConnectedPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_fully_connected_passes/test_ReplaceFullyConnectedPass.py deleted file mode 100644 index 680139a12..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_fully_connected_passes/test_ReplaceFullyConnectedPass.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import XCOREOpCodes -from tflite2xcore.transformation_passes import ReplaceFullyConnectedPass - -from .conftest import ( - PARAMS, - test_matching_params, - test_non_matching_tensors, - test_replace_mutate as test_mutate, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> ReplaceFullyConnectedPass: - return ReplaceFullyConnectedPass() - - -@pytest.fixture() -def new_opcode() -> XCOREOpCodes: - return XCOREOpCodes.XC_fc - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/__init__.py deleted file mode 100644 index 017f84a96..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/__init__.py +++ /dev/null @@ -1,259 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np -from copy import deepcopy -from typing import Tuple, Optional, Dict, Any - -from tflite2xcore.transformation_passes.lce_passes import ( - ReplaceBconv2DPass, - XC_BCONV2D_OPCODES, -) -from tflite2xcore.transformation_passes import ModelTransformationPass -from tflite2xcore.xcore_schema import ( - XCOREModel, - Subgraph, - TensorType, - ActivationFunctionType, - Padding, - OperatorCode, - ValidOpCodes, - ExternalOpCodes, - XCOREOpCodes, -) -from tflite2xcore.utils import calculate_same_output_size, calculate_valid_output_size - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - generate_dummy_data, -) - -from ..conftest import ParamsType -from ..conftest import ( # pylint: disable=unused-import - _make_name_type_pairs, - _test_non_matching_params, - test_matching_params, - test_non_matching_tensors, - test_replace_mutate as _test_mutate, -) -from ..test_conv2d_passes.conftest import test_replace_mutate as test_conv2d_mutate -from ..test_conv2d_passes.conftest import ( # pylint: disable=unused-import - PARAMS, - test_non_matching_input_channels, - test_non_matching_output_channels, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - - -PARAMS = deepcopy(PARAMS) - - -def update_lce_params(PARAMS: ParamsType) -> ParamsType: - for key in ( - "input_channels", - "non_matching_input_channels", - "output_channels", - "non_matching_output_channels", - ): - PARAMS["default"][key] = PARAMS["extended"][key][:-1] - PARAMS["smoke"][key] = PARAMS["default"][key][:-1] - non_matching_tensors = PARAMS["extended"]["non_matching_tensors"][::2] - PARAMS["default"]["non_matching_tensors"] = non_matching_tensors - PARAMS["smoke"]["non_matching_tensors"] = non_matching_tensors - - return PARAMS - - -PARAMS["extended"].update( - {"input_channels": [32, 128, 256], "non_matching_input_channels": [48, 130, 245]} -) - -# ---------------------------------------------------------------------------- -# MODEL BUILDERS -# ---------------------------------------------------------------------------- - - -def build_LceQuantize( - subgraph: Optional[Subgraph] = None, - *, - input_shape: Tuple[int, int, int], - input_tensor_type: TensorType = TensorType.INT8, -) -> XCOREModel: - subgraph = subgraph or Subgraph(model=XCOREModel()) - height, width, channels = input_shape - input_shape = (1, height, width, channels) - output_shape = (1, height, width, int(np.ceil(channels / 32))) - - tin = subgraph.create_tensor("input", input_tensor_type, input_shape, isinput=True) - tout = subgraph.create_tensor( - "output", TensorType.INT32, output_shape, isoutput=True - ) - - subgraph.create_operator( - OperatorCode(ExternalOpCodes.LceQuantize), inputs=[tin], outputs=[tout] - ) - - return subgraph.model - - -def build_bconv2d( - subgraph: Optional[Subgraph] = None, - *, - weight_shape: Tuple[int, int, int, int], - input_size: Tuple[int, int], - padding: Optional[Padding], - strides: Tuple[int, int], - opcode: ValidOpCodes, - output_tensor_type: TensorType = TensorType.INT8, -) -> XCOREModel: - subgraph = subgraph or Subgraph(model=XCOREModel()) - - # the given shapes are not bitpacked (i.e. true channel counts) - # so we bitpack them - C_out, _, _, C_in = weight_shape - bitpacked_input_channels = int(np.ceil(C_in / 32)) - weight_shape = (*weight_shape[:3], bitpacked_input_channels) - - # create input tensors - input_shape = [1, *input_size, bitpacked_input_channels] - tin = subgraph.create_tensor("input", TensorType.INT32, input_shape, isinput=True) - - w = subgraph.create_tensor("weights", TensorType.INT32, weight_shape) - w.buffer.data = generate_dummy_data(w.shape, np.int32) - - input_tensors = [tin, w] - if output_tensor_type is TensorType.INT32: - output_threshold = subgraph.create_tensor( - "output_threshold", TensorType.INT32, weight_shape[:1] - ) - output_threshold.buffer.data = generate_dummy_data( - output_threshold.shape, np.int32 - ) - - input_tensors.append(output_threshold) - - output_quantization = None - elif output_tensor_type is TensorType.INT8: - post_act_params: Dict[str, Any] = {"shape": weight_shape[:1]} - if opcode in XC_BCONV2D_OPCODES: - post_act_params["type_"] = TensorType.INT16 - dummy_data = generate_dummy_data(post_act_params["shape"], np.int16) - else: - post_act_params["type_"] = TensorType.FLOAT32 - dummy_data = generate_dummy_data(post_act_params["shape"], np.float32) - - post_act_mult = subgraph.create_tensor("post_act_mult", **post_act_params) - post_act_mult.buffer.data = dummy_data - - post_act_bias = subgraph.create_tensor("post_act_bias", **post_act_params) - post_act_bias.buffer.data = dummy_data - - input_tensors.extend([post_act_mult, post_act_bias]) - - output_quantization = {"scale": [0.46], "zero_point": [-54]} - else: - raise ValueError( - f"output_tensor_type must be {TensorType.INT32} or {TensorType.INT8}" - ) - - # check padding and determine output size - if padding is Padding.SAME: - output_size = calculate_same_output_size(input_size, strides) - else: - if padding is None: - assert opcode in XC_BCONV2D_OPCODES - elif padding is not Padding.VALID: - raise ValueError(f"Unsupported padding: {padding}") - output_size = calculate_valid_output_size( - input_size, strides, weight_shape[1:3] - ) - - tout = subgraph.create_tensor( - "output", - output_tensor_type, - shape=(1, *output_size, C_out), - isoutput=True, - quantization=output_quantization, - ) - - # create custom options - custom_options = {"padding": padding} if padding else {} - if opcode is ExternalOpCodes.LceBconv2d: - custom_options.update( - { - "channels_in": C_in, - "fused_activation_function": ActivationFunctionType.NONE, - "stride_height": strides[0], - "stride_width": strides[1], - "dilation_width_factor": 1, - "dilation_height_factor": 1, - } - ) - else: - custom_options["stride"] = strides - - # create operator - subgraph.create_operator( - OperatorCode(opcode), - inputs=input_tensors, - outputs=[tout], - custom_options=custom_options, - ) - - return subgraph.model - - -def build_lceBconv2d( - subgraph: Optional[Subgraph] = None, *, padding: Padding, **kwargs -) -> XCOREModel: - return build_bconv2d( - subgraph, padding=padding, opcode=ExternalOpCodes.LceBconv2d, **kwargs - ) - - -def build_XC_bconv2d( - subgraph: Optional[Subgraph] = None, - *, - opcode: XCOREOpCodes = XCOREOpCodes.XC_bconv2d_int8, - padding: Optional[Padding] = None, - **kwargs, -) -> XCOREModel: - return build_bconv2d(subgraph, padding=padding, opcode=opcode, **kwargs) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate( - trf_pass: ModelTransformationPass, model: XCOREModel, new_opcode: XCOREOpCodes -) -> None: - subgraph = model.subgraphs[0] - assert len(subgraph.operators) == 1 - - _test_mutate(trf_pass, model, new_opcode) - - -def test_bconv2d_mutate( - trf_pass: ReplaceBconv2DPass, model: XCOREModel, new_opcode: XCOREOpCodes -) -> None: - subgraph = model.subgraphs[0] - operators = subgraph.operators - op = operators[-1] - strides = op.custom_options["stride_height"], op.custom_options["stride_width"] - padding = op.custom_options["padding"] - - test_conv2d_mutate(trf_pass, model, new_opcode) - - assert len(operators) == 1 - - new_op = operators[-1] - assert "illegal_params" in new_op.custom_options - assert "stride" in new_op.custom_options - assert strides == new_op.custom_options["stride"] - assert "padding" in new_op.custom_options - assert padding == new_op.custom_options["padding"] diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/conftest.py deleted file mode 100644 index 42916a8ea..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/conftest.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from . import build_lceBconv2d -from ..test_conv2d_passes.conftest import weight_shape # pylint: disable=unused-import - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def build_model(): - return build_lceBconv2d diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeBconv2dBitpackedDeepInPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeBconv2dBitpackedDeepInPass.py deleted file mode 100644 index cbcb3c8b9..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeBconv2dBitpackedDeepInPass.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. -import pytest - -from tflite2xcore.transformation_passes import ( - LegalizeBconv2dBitpackedDeepInPass, - ReplaceBconv2DBitpackedDeepInPass, -) - -from .test_LegalizeBconv2dBitpackedPass import ( # pylint: disable=unused-import - test_mutate, -) -from .test_ReplaceBconv2DBitpackedDeepInPass import ( # pylint: disable=unused-import - model, - new_opcode, - PARAMS, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() # type: ignore -def replacement_pass() -> ReplaceBconv2DBitpackedDeepInPass: - return ReplaceBconv2DBitpackedDeepInPass() - - -@pytest.fixture() # type: ignore -def legalization_pass() -> LegalizeBconv2dBitpackedDeepInPass: - return LegalizeBconv2dBitpackedDeepInPass() - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeBconv2dBitpackedPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeBconv2dBitpackedPass.py deleted file mode 100644 index 137f3e36c..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeBconv2dBitpackedPass.py +++ /dev/null @@ -1,105 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. -import pytest -import numpy as np - -from tflite2xcore.utils import VECTOR_SIZE_WORDS, WORD_SIZE_BITS -from tflite2xcore.converter import CleanupManager -from tflite2xcore.transformation_passes import ( - LegalizeBconv2dBitpackedPass, - ReplaceBconv2DBitpackedPass, -) -from tflite2xcore.transformation_passes.lce_passes import FILLER -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import TensorType, XCOREOpCodes - -from .test_ReplaceBconv2DBitpackedPass import ( # pylint: disable=unused-import - model, - new_opcode, - PARAMS, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() # type: ignore -def replacement_pass() -> ReplaceBconv2DBitpackedPass: - return ReplaceBconv2DBitpackedPass() - - -@pytest.fixture() # type: ignore -def legalization_pass() -> LegalizeBconv2dBitpackedPass: - return LegalizeBconv2dBitpackedPass() - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate( - replacement_pass: ReplaceBconv2DBitpackedPass, - legalization_pass: LegalizeBconv2dBitpackedPass, - model: XCOREModel, - new_opcode: XCOREOpCodes, -) -> None: - subgraph = model.subgraphs[0] - - # run replacement pass - replacement_pass.mutate(subgraph.operators[0]) - CleanupManager(model).run_passes() - - bconv2d_op = subgraph.operators[0] - - op_code = bconv2d_op.operator_code.code - assert op_code is new_opcode, f"expected: {new_opcode}, got: {op_code}" - - old_weights = bconv2d_op.inputs[1] - old_thresholds = bconv2d_op.inputs[2] - - # ensure that legalization pass matches - assert legalization_pass.match(bconv2d_op) - - # run legalization pass - legalization_pass.mutate(bconv2d_op) - CleanupManager(model).run_passes() - - # basic checks - assert len(subgraph.operators) == 1 - assert bconv2d_op is subgraph.operators[0] - assert len(bconv2d_op.inputs) == 3 - - # check custom options - options = bconv2d_op.custom_options - assert "illegal_params" not in options - assert options["K"][:3] == old_weights.shape[:3] - assert options["K"][3] == old_weights.shape[3] * WORD_SIZE_BITS - - # check biases - new_thresholds = bconv2d_op.inputs[2] - assert new_thresholds is not old_thresholds - assert new_thresholds.type is TensorType.INT32 - assert new_thresholds.shape == old_thresholds.shape - - # check weights - new_weights = bconv2d_op.inputs[1] - assert new_weights is not old_weights - assert new_weights.type is TensorType.INT32 - assert len(new_weights.shape) == 1 - - kernel_channel_size = np.prod(old_weights.shape[1:]) - filler_size = ( - VECTOR_SIZE_WORDS - kernel_channel_size % VECTOR_SIZE_WORDS - ) % VECTOR_SIZE_WORDS - assert new_weights.shape[0] - np.prod(old_weights.shape) == filler_size - - if filler_size: - filler_bits = new_weights.as_array()[-filler_size:] - assert np.all(filler_bits == FILLER) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeBconv2dInt8DeepInDeepOutPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeBconv2dInt8DeepInDeepOutPass.py deleted file mode 100644 index 00a9ce0ed..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeBconv2dInt8DeepInDeepOutPass.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. -import pytest - -from tflite2xcore.transformation_passes import ( - LegalizeBconv2dInt8DeepInDeepOutPass, - ReplaceBconv2DInt8DeepInDeepOutPass, -) -from tflite2xcore.xcore_schema import XCOREModel, XCOREOpCodes - -from .test_LegalizeBconv2dInt8Pass import _test_mutate -from .test_ReplaceBconv2DInt8DeepInDeepOutPass import ( # pylint: disable=unused-import - model, - new_opcode, - PARAMS, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() # type: ignore -def replacement_pass() -> ReplaceBconv2DInt8DeepInDeepOutPass: - return ReplaceBconv2DInt8DeepInDeepOutPass() - - -@pytest.fixture() # type: ignore -def legalization_pass() -> LegalizeBconv2dInt8DeepInDeepOutPass: - return LegalizeBconv2dInt8DeepInDeepOutPass() - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate( - replacement_pass: ReplaceBconv2DInt8DeepInDeepOutPass, - legalization_pass: LegalizeBconv2dInt8DeepInDeepOutPass, - model: XCOREModel, - new_opcode: XCOREOpCodes, -) -> None: - _test_mutate(replacement_pass, legalization_pass, model, new_opcode) - - bconv2d_op = model.subgraphs[0].operators[0] - assert len(bconv2d_op.inputs) == 5 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeBconv2dInt8Pass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeBconv2dInt8Pass.py deleted file mode 100644 index 271fb7563..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeBconv2dInt8Pass.py +++ /dev/null @@ -1,136 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. -import pytest -import numpy as np - -from tflite2xcore.utils import VECTOR_SIZE_WORDS, WORD_SIZE_BITS -from tflite2xcore.converter import CleanupManager -from tflite2xcore.transformation_passes import ( - LegalizeBconv2dInt8Pass, - ReplaceBconv2DInt8Pass, -) -from tflite2xcore.transformation_passes.lce_passes import FILLER -from tflite2xcore.xcore_schema import XCOREModel, TensorType, XCOREOpCodes - -from .test_ReplaceBconv2DInt8Pass import ( # pylint: disable=unused-import - model, - new_opcode, - PARAMS, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() # type: ignore -def replacement_pass() -> ReplaceBconv2DInt8Pass: - return ReplaceBconv2DInt8Pass() - - -@pytest.fixture() # type: ignore -def legalization_pass() -> LegalizeBconv2dInt8Pass: - return LegalizeBconv2dInt8Pass() - - -# ---------------------------------------------------------------------------- -# HELPERS -# ---------------------------------------------------------------------------- - - -def _test_mutate( - replacement_pass: ReplaceBconv2DInt8Pass, - legalization_pass: LegalizeBconv2dInt8Pass, - model: XCOREModel, - new_opcode: XCOREOpCodes, -) -> None: - subgraph = model.subgraphs[0] - - # run replacement pass - replacement_pass.mutate(subgraph.operators[0]) - CleanupManager(model).run_passes() - - bconv2d_op = subgraph.operators[0] - - op_code = bconv2d_op.operator_code.code - assert op_code is new_opcode, f"expected: {new_opcode}, got: {op_code}" - - old_weights = bconv2d_op.inputs[1] - old_multipliers = bconv2d_op.inputs[2] - old_biases = bconv2d_op.inputs[3] - - # ensure that legalization pass matches - assert legalization_pass.match(bconv2d_op) - - # run legalization pass - legalization_pass.mutate(bconv2d_op) - CleanupManager(model).run_passes() - - # basic checks - assert len(subgraph.operators) == 1 - assert bconv2d_op is subgraph.operators[0] - - # check custom options - options = bconv2d_op.custom_options - assert "illegal_params" not in options - assert "fused_activation_function" not in options - assert options["K"][:3] == old_weights.shape[:3] - assert options["K"][3] == old_weights.shape[3] * WORD_SIZE_BITS - - # check multipliers - new_multipliers = bconv2d_op.inputs[2] - assert new_multipliers is not old_multipliers - assert new_multipliers.type is TensorType.INT16 - assert new_multipliers.shape == old_multipliers.shape - - # check biases - new_biases = bconv2d_op.inputs[3] - assert new_biases is not old_biases - assert new_biases.type is TensorType.INT16 - assert new_biases.shape == old_biases.shape - - # check output trf params - output_trf = bconv2d_op.inputs[4] - assert output_trf.type is TensorType.INT16 - assert output_trf.shape == (6 * 16 + 2,) - - # check weights - new_weights = bconv2d_op.inputs[1] - assert new_weights is not old_weights - assert new_weights.type is TensorType.INT32 - assert len(new_weights.shape) == 1 - - # TODO: find a more precise test - old_weight_size = np.prod(old_weights.shape) - assert new_weights.shape[0] - old_weight_size >= 8 - - fill = new_weights.as_array().ravel()[old_weight_size:] - assert np.all(fill == FILLER) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate( - replacement_pass: ReplaceBconv2DInt8Pass, - legalization_pass: LegalizeBconv2dInt8Pass, - model: XCOREModel, - new_opcode: XCOREOpCodes, -) -> None: - _test_mutate(replacement_pass, legalization_pass, model, new_opcode) - - bconv2d_op = model.subgraphs[0].operators[0] - assert len(bconv2d_op.inputs) == 6 - - # check accu_modifier - new_biases = bconv2d_op.inputs[3] - new_accu_modifier = bconv2d_op.inputs[5] - assert new_accu_modifier.type is TensorType.INT16 - assert new_accu_modifier.shape == new_biases.shape - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeXCBconv2DPaddingPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeXCBconv2DPaddingPass.py deleted file mode 100644 index 5cd506b31..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_LegalizeXCBconv2DPaddingPass.py +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -from typing import Tuple -from copy import deepcopy - -from tflite2xcore.transformation_passes.lce_passes import LegalizeXCBconv2DPaddingPass -from tflite2xcore.xcore_schema import Padding, XCOREOpCodes -from tflite2xcore.xcore_model import XCOREModel - -from . import build_XC_bconv2d, _test_non_matching_params -from . import ( # pylint: disable=unused-import - PARAMS, - test_matching_params, - test_mutate as _test_mutate, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -# NOTE: this is intentional to reduce test counts -PARAMS["extended"] = PARAMS["default"] -PARAMS["default"] = PARAMS["smoke"] - -for params in PARAMS.values(): - params["opcode"] = [XCOREOpCodes.XC_bconv2d_int8, XCOREOpCodes.XC_bconv2d_bin] - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> LegalizeXCBconv2DPaddingPass: - return LegalizeXCBconv2DPaddingPass() - - -@pytest.fixture() -def model( - weight_shape: Tuple[int, int, int, int], - input_size: Tuple[int, int], - padding: Padding, - strides: Tuple[int, int], - opcode: XCOREOpCodes, -) -> XCOREModel: - return build_XC_bconv2d( - weight_shape=weight_shape, - input_size=input_size, - padding=padding, - strides=strides, - opcode=opcode, - ) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate( - trf_pass: LegalizeXCBconv2DPaddingPass, - model: XCOREModel, - padding: Padding, - opcode: XCOREOpCodes, -) -> None: - subgraph = model.subgraphs[0] - old_input = subgraph.inputs[0] - old_output = subgraph.outputs[0] - - _test_mutate(trf_pass, model, opcode) - - operators = subgraph.operators - bconv2d_op = operators[-1] - - opcode_after = bconv2d_op.operator_code.code - assert opcode_after is opcode, f"expected: {opcode}, got: {opcode_after}" - - assert "padding" not in bconv2d_op.custom_options - assert old_output is bconv2d_op.outputs[0] - - if padding is Padding.VALID: - assert len(operators) == 1 - assert old_input is bconv2d_op.inputs[0] - else: - assert len(operators) == 2 - - pad_op = operators[0] - assert old_input is pad_op.inputs[0] - assert len(pad_op.inputs) == 2 - assert len(pad_op.outputs) == 1 - - intermediate = bconv2d_op.inputs[0] - assert intermediate is pad_op.outputs[0] - - # check that padding is sane - paddings = pad_op.inputs[1].as_array().tolist() - for j, (size, pads, padded_size) in enumerate( - zip(old_input.shape, paddings, intermediate.shape) - ): - assert ( - size + sum(pads) == padded_size - ), f"incorrect padded size in dimension {j}" - - -def test_non_matching_legal( - trf_pass: LegalizeXCBconv2DPaddingPass, - weight_shape: Tuple[int, int, int, int], - input_size: Tuple[int, int], - strides: Tuple[int, int], - opcode: XCOREOpCodes, -) -> None: - model = build_XC_bconv2d( - weight_shape=weight_shape, - input_size=input_size, - strides=strides, - opcode=opcode, - ) - - _test_non_matching_params(trf_pass, model) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceBconv2DBitpackedDeepInPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceBconv2DBitpackedDeepInPass.py deleted file mode 100644 index 20bfb1f4f..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceBconv2DBitpackedDeepInPass.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. -import pytest -from copy import deepcopy - -from tflite2xcore.transformation_passes import ReplaceBconv2DBitpackedDeepInPass -from tflite2xcore.xcore_schema import XCOREOpCodes - -from .test_ReplaceBconv2DBitpackedPass import ( # pylint: disable=unused-import - PARAMS, - model, - test_matching_params, - test_non_matching_tensors, - test_non_matching_input_channels, - test_mutate, -) -from .test_ReplaceBconv2DInt8DeepInDeepOutPass import PARAMS as DEEP_PARAMS - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - - -PARAMS = deepcopy(PARAMS) - -for key in PARAMS: - PARAMS[key]["input_channels"] = DEEP_PARAMS[key]["input_channels"] - PARAMS[key]["non_matching_input_channels"] = DEEP_PARAMS[key][ - "non_matching_input_channels" - ] - -# NOTE: this is intentional to reduce test counts -PARAMS["extended"] = PARAMS["default"] -PARAMS["default"] = PARAMS["smoke"] - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> ReplaceBconv2DBitpackedDeepInPass: - return ReplaceBconv2DBitpackedDeepInPass() - - -@pytest.fixture() -def new_opcode() -> XCOREOpCodes: - return XCOREOpCodes.XC_bconv2d_bin_DI - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceBconv2DBitpackedPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceBconv2DBitpackedPass.py deleted file mode 100644 index 9f743bb60..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceBconv2DBitpackedPass.py +++ /dev/null @@ -1,99 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. -import pytest -from copy import deepcopy -from typing import Tuple - -from tflite2xcore.transformation_passes import ReplaceBconv2DBitpackedPass -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import TensorType, XCOREOpCodes, Padding - -from . import ( - build_lceBconv2d, - _make_name_type_pairs, - update_lce_params, - test_bconv2d_mutate as _test_mutate, -) -from . import ( # pylint: disable=unused-import - PARAMS, - test_matching_params, - test_non_matching_tensors, - test_non_matching_input_channels, -) - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - - -PARAMS = deepcopy(PARAMS) - -PARAMS["extended"].update( - { - "output_channels": [32, 128, 256], - "non_matching_output_channels": [16, 20, 33], - "non_matching_tensors": list( - _make_name_type_pairs("output", [TensorType.FLOAT32, TensorType.INT8]) - ), - } -) - -PARAMS = update_lce_params(PARAMS) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> ReplaceBconv2DBitpackedPass: - return ReplaceBconv2DBitpackedPass() - - -@pytest.fixture() -def new_opcode() -> XCOREOpCodes: - return XCOREOpCodes.XC_bconv2d_bin - - -@pytest.fixture() -def model( - weight_shape: Tuple[int, int, int, int], - input_size: Tuple[int, int], - padding: Padding, - strides: Tuple[int, int], -) -> XCOREModel: - return build_lceBconv2d( - weight_shape=weight_shape, - input_size=input_size, - padding=padding, - strides=strides, - output_tensor_type=TensorType.INT32, - ) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate( - trf_pass: ReplaceBconv2DBitpackedPass, model: XCOREModel, new_opcode: XCOREOpCodes -) -> None: - subgraph = model.subgraphs[0] - operators = subgraph.operators - - _test_mutate(trf_pass, model, new_opcode) - - assert len(operators) == 1 - - new_op = operators[-1] - - assert len(new_op.inputs) == 3 - new_op.inputs[1].type is TensorType.INT32 - new_op.inputs[2].type is TensorType.INT32 - new_op.outputs[0].type is TensorType.INT8 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceBconv2DInt8DeepInDeepOutPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceBconv2DInt8DeepInDeepOutPass.py deleted file mode 100644 index a943f77db..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceBconv2DInt8DeepInDeepOutPass.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. -import pytest -from copy import deepcopy - -from tflite2xcore.transformation_passes import ReplaceBconv2DInt8DeepInDeepOutPass -from tflite2xcore.xcore_schema import XCOREOpCodes - -from . import update_lce_params -from .test_ReplaceBconv2DInt8Pass import ( # pylint: disable=unused-import - PARAMS, - model, - test_matching_params, - test_non_matching_tensors, - test_non_matching_input_channels, - test_non_matching_output_channels, - test_mutate, -) - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -PARAMS["extended"].update( - { - "output_channels": [16, 64, 128], - "non_matching_output_channels": [8, 17, 28], - "input_channels": [256, 512, 1024], - "non_matching_input_channels": [16, 21, 128], - } -) - -PARAMS = update_lce_params(PARAMS) - -# NOTE: this is intentional to reduce test counts -PARAMS["extended"] = PARAMS["default"] -PARAMS["default"] = PARAMS["smoke"] - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> ReplaceBconv2DInt8DeepInDeepOutPass: - return ReplaceBconv2DInt8DeepInDeepOutPass() - - -@pytest.fixture() -def new_opcode() -> XCOREOpCodes: - return XCOREOpCodes.XC_bconv2d_int8_DIDO - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceBconv2DInt8Pass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceBconv2DInt8Pass.py deleted file mode 100644 index a4e873117..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceBconv2DInt8Pass.py +++ /dev/null @@ -1,101 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. -import pytest -from copy import deepcopy -from typing import Tuple - -from tflite2xcore.transformation_passes import ReplaceBconv2DInt8Pass -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import XCOREOpCodes, Padding, TensorType - -from . import ( - build_lceBconv2d, - _make_name_type_pairs, - update_lce_params, - test_bconv2d_mutate as _test_mutate, -) -from . import ( # pylint: disable=unused-import - PARAMS, - test_matching_params, - test_non_matching_tensors, - test_non_matching_input_channels, - test_non_matching_output_channels, -) - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -PARAMS["extended"].update( - { - "output_channels": [4, 16, 32], - "non_matching_output_channels": [5, 9, 27], - "non_matching_tensors": list( - _make_name_type_pairs("output", [TensorType.FLOAT32, TensorType.INT32]) - ), - } -) - -PARAMS = update_lce_params(PARAMS) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> ReplaceBconv2DInt8Pass: - return ReplaceBconv2DInt8Pass() - - -@pytest.fixture() -def new_opcode() -> XCOREOpCodes: - return XCOREOpCodes.XC_bconv2d_int8 - - -@pytest.fixture() -def model( - weight_shape: Tuple[int, int, int, int], - input_size: Tuple[int, int], - padding: Padding, - strides: Tuple[int, int], -) -> XCOREModel: - return build_lceBconv2d( - weight_shape=weight_shape, - input_size=input_size, - padding=padding, - strides=strides, - ) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate( - trf_pass: ReplaceBconv2DInt8Pass, model: XCOREModel, new_opcode: XCOREOpCodes -) -> None: - subgraph = model.subgraphs[0] - operators = subgraph.operators - - _test_mutate(trf_pass, model, new_opcode) - - assert len(operators) == 1 - - new_op = operators[-1] - - assert "fused_activation_function" in new_op.custom_options - - assert len(new_op.inputs) == 4 - new_op.inputs[1].type is TensorType.INT32 - new_op.inputs[2].type is TensorType.INT16 - new_op.inputs[3].type is TensorType.INT16 - new_op.outputs[0].type is TensorType.INT8 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceLceQuantizePass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceLceQuantizePass.py deleted file mode 100644 index 299ddb730..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lce_passes/test_ReplaceLceQuantizePass.py +++ /dev/null @@ -1,80 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. -import pytest -from copy import deepcopy -from typing import Tuple - -from tflite2xcore.transformation_passes.lce_passes import ReplaceLceQuantizePass -from tflite2xcore.xcore_model import XCOREModel, TensorType -from tflite2xcore.xcore_schema import ( - TensorType, - XCOREOpCodes, -) - -from . import ( - build_LceQuantize, - _make_name_type_pairs, - _test_non_matching_params, - update_lce_params, -) -from . import ( # pylint: disable=unused-import - PARAMS, - test_matching_params, - test_non_matching_tensors, - test_mutate, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -PARAMS["extended"].update( - { - "non_matching_tensors": list( - _make_name_type_pairs("input", [TensorType.FLOAT32, TensorType.INT32]) - ), - } -) - -PARAMS = update_lce_params(PARAMS) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> ReplaceLceQuantizePass: - return ReplaceLceQuantizePass() - - -@pytest.fixture() -def new_opcode() -> XCOREOpCodes: - return XCOREOpCodes.XC_bsign_8 - - -@pytest.fixture() -def model(input_shape: Tuple[int, int, int]) -> XCOREModel: - return build_LceQuantize(input_shape=input_shape) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_non_matching_input_channels( - trf_pass: ReplaceLceQuantizePass, - non_matching_input_channels: int, - input_size: Tuple[int, int], -) -> None: - model = build_LceQuantize(input_shape=(*input_size, non_matching_input_channels)) - _test_non_matching_params(trf_pass, model) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/conftest.py deleted file mode 100644 index f274753c4..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/conftest.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -from copy import deepcopy - -from tflite2xcore.transformation_passes import LegalizeXCLookupTablePass -from tflite2xcore.xcore_schema import TensorType, XCOREOpCodes - -from ..conftest import test_matching_params, _test_non_matching_params - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = { - "default": { - "input_channels": [1, 2, 3, 4, 8, 16, 32], - "input_height": [1, 2, 3, 4, 5, 9], - "input_width": [1, 2, 3, 4, 5, 9], - "non_matching_input_type": [ - TensorType.INT16, - TensorType.INT32, - TensorType.UINT8, - TensorType.FLOAT32, - ], - "non_matching_output_type": [ - TensorType.INT16, - TensorType.INT32, - TensorType.UINT8, - TensorType.FLOAT32, - ], - }, - "smoke": { - "input_channels": [1, 4, 32], - "input_height": [1, 9], - "input_width": [1, 9], - "non_matching_input_type": [TensorType.INT16, TensorType.FLOAT32], - "non_matching_output_type": [TensorType.INT16, TensorType.FLOAT32], - }, -} - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def legalize_table_pass(): - return LegalizeXCLookupTablePass() - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_non_matching_input_type(trf_pass, model, non_matching_input_type): - op = model.subgraphs[0].operators[0] - op.inputs[0].type = non_matching_input_type - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_output_type(trf_pass, model, non_matching_output_type): - op = model.subgraphs[0].operators[0] - op.outputs[0].type = non_matching_output_type - _test_non_matching_params(trf_pass, model) - - -def test_mutate(trf_pass, legalize_table_pass, model): - # extract original parameters - subgraph = model.subgraphs[0] - tin_shape = deepcopy(subgraph.get_tensor("input").shape) - tout_shape = deepcopy(subgraph.get_tensor("output").shape) - original_opcode = subgraph.operators[0].operator_code.code - - # run replacement pass - trf_pass.run(model) - model.sanity_check() - - # check new op - op = subgraph.operators[-1] - assert op.operator_code.code is XCOREOpCodes.XC_lookup_8 - assert "original_opcode" in op.custom_options - assert op.custom_options["original_opcode"] is original_opcode - - # run table legalization pass - legalize_table_pass.run(model) - model.sanity_check() - assert "original_opcode" not in op.custom_options - - # check input/output tensors - tin = subgraph.get_tensor("input") - tout = subgraph.get_tensor("output") - - assert len(subgraph.operators) == 1 - assert len(subgraph.tensors) == 3 - assert tin in subgraph.inputs and tin not in subgraph.outputs - assert tout in subgraph.outputs and tout not in subgraph.inputs - assert tin.shape == tin_shape - assert tout.shape == tout_shape - - # check LUT shape - lut_tensor = op.inputs[1] - assert len(lut_tensor.buffer.data) == 256 - assert lut_tensor.shape == (256,) diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/test_ReplaceLogisticPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/test_ReplaceLogisticPass.py deleted file mode 100644 index 57a2bbeda..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/test_ReplaceLogisticPass.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import TensorType -from tflite2xcore.transformation_passes import ReplaceLogisticPass - -from tflite2xcore.tests.test_transformation_passes.model_builders import build_logistic -from .conftest import ( - PARAMS, - test_matching_params, - test_non_matching_input_type, - test_non_matching_output_type, - test_mutate, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass(): - return ReplaceLogisticPass() - - -@pytest.fixture() -def model(input_shape): - return build_logistic(input_shape=input_shape, tensor_type=TensorType.INT8) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/test_ReplaceReLU6Pass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/test_ReplaceReLU6Pass.py deleted file mode 100644 index 29fc00522..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/test_ReplaceReLU6Pass.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import TensorType -from tflite2xcore.transformation_passes import ReplaceReLU6Pass - -from tflite2xcore.tests.test_transformation_passes.model_builders import build_relu6 -from .conftest import ( - PARAMS, - test_matching_params, - test_non_matching_input_type, - test_non_matching_output_type, - test_mutate, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass(): - return ReplaceReLU6Pass() - - -@pytest.fixture() -def model(input_shape): - return build_relu6(input_shape=input_shape, tensor_type=TensorType.INT8) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/test_ReplaceReLUPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/test_ReplaceReLUPass.py deleted file mode 100644 index 3e91c7664..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/test_ReplaceReLUPass.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import TensorType -from tflite2xcore.transformation_passes import ReplaceReLUPass - -from tflite2xcore.tests.test_transformation_passes.model_builders import build_relu -from .conftest import ( - PARAMS, - test_matching_params, - test_non_matching_input_type, - test_non_matching_output_type, - test_mutate, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass(): - return ReplaceReLUPass() - - -@pytest.fixture() -def model(input_shape): - return build_relu(input_shape=input_shape, tensor_type=TensorType.INT8) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/test_ReplaceTanhPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/test_ReplaceTanhPass.py deleted file mode 100644 index 0f46d3be6..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_lut_passes/test_ReplaceTanhPass.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import TensorType -from tflite2xcore.transformation_passes import ReplaceTanhPass - -from tflite2xcore.tests.test_transformation_passes.model_builders import build_tanh -from .conftest import ( - PARAMS, - test_matching_params, - test_non_matching_input_type, - test_non_matching_output_type, - test_mutate, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass(): - return ReplaceTanhPass() - - -@pytest.fixture() -def model(input_shape): - return build_tanh(input_shape=input_shape, tensor_type=TensorType.INT8) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_op_version_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_op_version_passes/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_op_version_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_op_version_passes/conftest.py deleted file mode 100644 index 8e0040582..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_op_version_passes/conftest.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from ..conftest import ( - PARAMS, - _test_non_matching_params, - _make_name_type_pairs, - NON_INT8_TEST_TYPES, - NON_FLOAT32_TEST_TYPES, - test_matching_params, - test_non_matching_tensors, -) diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_op_version_passes/test_LegalizeQuantizeVersionPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_op_version_passes/test_LegalizeQuantizeVersionPass.py deleted file mode 100644 index 2f651f9eb..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_op_version_passes/test_LegalizeQuantizeVersionPass.py +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from typing import Tuple -from copy import deepcopy - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import BuiltinOpCodes -from tflite2xcore.transformation_passes import LegalizeQuantizeVersionPass - -from tflite2xcore.tests.test_transformation_passes.model_builders import build_quantize - -from .conftest import ( - PARAMS, - _test_non_matching_params, - _make_name_type_pairs, - NON_INT8_TEST_TYPES, - NON_FLOAT32_TEST_TYPES, - test_matching_params, - test_non_matching_tensors, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -_NON_MATCHING_TENSORS = list( - _make_name_type_pairs("input", NON_FLOAT32_TEST_TYPES) -) + list(_make_name_type_pairs("output_quantized", NON_INT8_TEST_TYPES)) - -for params in PARAMS.values(): - params.update( - {"non_matching_version": [1, 3], "non_matching_tensors": _NON_MATCHING_TENSORS} - ) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def model(input_shape: Tuple[int, int, int]) -> XCOREModel: - model = build_quantize(input_shape=input_shape) - model.subgraphs[0].operators[0].operator_code.version = 2 - return model - - -@pytest.fixture() -def trf_pass() -> LegalizeQuantizeVersionPass: - return LegalizeQuantizeVersionPass() - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_mutate(model: XCOREModel, trf_pass: LegalizeQuantizeVersionPass) -> None: - subgraph = model.subgraphs[0] - trf_pass.mutate(subgraph.operators[0]) - subgraph.sanity_check() - - assert len(subgraph.operators) == 1 - assert len(subgraph.tensors) == 2 - - op_code = subgraph.operators[0].operator_code - assert op_code.code is BuiltinOpCodes.QUANTIZE - assert op_code.version == 1 - - -def test_non_matching_version( - trf_pass: LegalizeQuantizeVersionPass, - input_shape: Tuple[int, int, int], - non_matching_version: int, -) -> None: - model = build_quantize(input_shape=input_shape) - model.subgraphs[0].operators[0].operator_code.version = non_matching_version - _test_non_matching_params(trf_pass, model) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/__init__.py deleted file mode 100644 index 161afb976..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from typing import Tuple - -from tflite2xcore.transformation_passes import ModelTransformationPass - -from ..model_builders import build_pad -from ..conftest import _test_non_matching_params, test_replace_mutate - -PaddingType = Tuple[Tuple[int, int], Tuple[int, int], Tuple[int, int], Tuple[int, int]] - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -def test_non_matching_paddings( - trf_pass: ModelTransformationPass, - input_shape: Tuple[int, int, int, int], - non_matching_paddings: PaddingType, -) -> None: - model = build_pad(input_shape=input_shape, paddings=non_matching_paddings) - _test_non_matching_params(trf_pass, model) diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/conftest.py deleted file mode 100644 index d3e666fea..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/conftest.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy -from itertools import product - -from ..conftest import ( - PARAMS, - ParamsType, - _test_non_matching_params, - test_matching_params, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -PADS = [0, 1, 2] - -PARAMS["extended"].update( - { - "input_batches": [1, 4], - "pad_t": PADS, - "pad_b": PADS, - "pad_l": PADS, - "pad_r": PADS, - "pad_batch_l": [0], - "pad_batch_r": PADS, - "pad_channel_l": [0], - "pad_channel_r": PADS, - } -) - -PARAMS["default"].update( - { - "input_batches": [1], - "pad_t": PADS, - "pad_b": PADS[:2], - "pad_l": PADS, - "pad_r": PADS[:2], - "pad_batch_l": [0], - "pad_batch_r": [0], - "pad_channel_l": [0], - "pad_channel_r": PADS, - } -) - -PARAMS["smoke"].update( - { - "input_batches": [1], - "pad_t": PADS[:1], - "pad_b": PADS, - "pad_l": PADS[:1], - "pad_r": PADS, - "pad_batch_l": [0], - "pad_batch_r": [0], - "pad_channel_l": [0], - "pad_channel_r": PADS[:2], - } -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def input_shape(input_batches, input_size, input_channels): - return [input_batches, *input_size, input_channels] - - -@pytest.fixture() -def paddings_HW(pad_t, pad_b, pad_l, pad_r): - return [(0, 0), (pad_t, pad_b), (pad_l, pad_r), (0, 0)] - - -@pytest.fixture() -def paddings_NC(pad_batch_l, pad_batch_r, pad_channel_l, pad_channel_r): - return [(pad_batch_r, pad_batch_r), (0, 0), (0, 0), (pad_channel_l, pad_channel_r)] - - -# ---------------------------------------------------------------------------- -# HELPERS -# ---------------------------------------------------------------------------- - - -def update_params_with_paddings(PARAMS, *, is_matching): - for params in PARAMS.values(): - all_paddings = list( - product( - product(params["pad_batch_l"], params["pad_batch_r"]), - product(params["pad_t"], params["pad_b"]), - product(params["pad_l"], params["pad_r"]), - product(params["pad_channel_l"], params["pad_channel_r"]), - ) - ) - - params.update( - { - "paddings": [ - padding for padding in all_paddings if is_matching(padding) - ], - "non_matching_paddings": [ - padding for padding in all_paddings if not is_matching(padding) - ], - } - ) - - return PARAMS diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/padding_composite_test.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/padding_composite_test.py deleted file mode 100644 index 0caf615a5..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/padding_composite_test.py +++ /dev/null @@ -1,122 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy - -from tflite2xcore.converter import CleanupManager -from tflite2xcore.transformation_passes import ( - SplitPaddingPass, - FuseConsecutivePadsPass, - FuseConv2dPaddingPass, -) -from tflite2xcore.xcore_schema import BuiltinOpCodes, XCOREOpCodes - -from ..model_builders import build_pad, build_padded_DW -from .test_SplitPaddingPass import ( - is_matching as is_split_matching, - PARAMS as SPLIT_PARAMS, -) -from .test_FuseConv2dPaddingPass import PARAMS as CONV_PARAMS, has_excessive_padding -from .conftest import PARAMS - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -for k in PARAMS: - PARAMS[k]["paddings"] = deepcopy(SPLIT_PARAMS[k]["paddings"]) - PARAMS[k]["splittable_spatial_params"] = [ - param_combo - for param_combo in CONV_PARAMS[k]["non_matching_channel_batch_params"] - if is_split_matching(param_combo.padding) - and not has_excessive_padding(param_combo) - ] - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_split_fuse_pad(input_shape, paddings): - model = build_pad(input_shape=input_shape, paddings=paddings) - operators = model.subgraphs[0].operators - assert len(operators) == 1 - pad_ori = operators[0].inputs[1] - paddings_ori = pad_ori.as_array() - - split_pass = SplitPaddingPass() - split_pass.run(model) - model.sanity_check() - assert len(operators) == 2 - op1, op2 = operators - assert op1.operator_code.code is op2.operator_code.code is BuiltinOpCodes.PAD - - split_pass = FuseConsecutivePadsPass() - split_pass.run(model) - model.sanity_check() - - # need to clean up dangling ops/tensors - CleanupManager(model).run_passes() - model.sanity_check() - - assert len(operators) == 1 - pad_new = operators[0].inputs[1] - assert pad_new is not pad_ori - paddings_new = pad_new.as_array() - assert paddings_new[0][0] == paddings_ori[0][0] - assert paddings_new[0][1] == paddings_ori[0][1] - assert paddings_new[1][0] == paddings_ori[1][0] - assert paddings_new[1][1] == paddings_ori[1][1] - assert paddings_new[2][0] == paddings_ori[2][0] - assert paddings_new[2][1] == paddings_ori[2][1] - assert paddings_new[3][0] == paddings_ori[3][0] - assert paddings_new[3][1] == paddings_ori[3][1] - - -def test_split_fuse_conv2d(splittable_spatial_params, input_channels): - model = build_padded_DW( - weight_shape=[*splittable_spatial_params.kernel_size, input_channels], - input_size=splittable_spatial_params.input_size, - paddings=splittable_spatial_params.padding, - strides=splittable_spatial_params.stride, - ) - operators = model.subgraphs[0].operators - assert len(operators) == 2 - paddings_ori = operators[0].inputs[1].as_array() - - split_pass = SplitPaddingPass() - split_pass.run(model) - model.sanity_check() - assert len(operators) == 3 - op1, op2, op3 = operators - assert op1.operator_code.code is op2.operator_code.code is BuiltinOpCodes.PAD - assert op3.operator_code.code is XCOREOpCodes.XC_conv2d_depthwise - - split_pass = FuseConv2dPaddingPass() - split_pass.run(model) - model.sanity_check() - - # need to clean up dangling ops/tensors - CleanupManager(model).run_passes() - model.sanity_check() - - assert len(operators) == 2 - op1, op2 = operators - assert op1.operator_code.code is BuiltinOpCodes.PAD - assert op2.operator_code.code is XCOREOpCodes.XC_conv2d_depthwise - paddings_new = operators[0].inputs[1].as_array() - assert paddings_new[1][0] == paddings_new[2][0] == 0 - assert paddings_new[1][1] == paddings_new[2][1] == 0 - assert paddings_new[0][0] == paddings_ori[0][0] - assert paddings_new[0][1] == paddings_ori[0][1] - assert paddings_new[3][0] == paddings_ori[3][0] - assert paddings_new[3][1] == paddings_ori[3][1] - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_FuseConsecutivePadsPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_FuseConsecutivePadsPass.py deleted file mode 100644 index e041b29d9..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_FuseConsecutivePadsPass.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy - -from tflite2xcore.converter import CleanupManager -from tflite2xcore.transformation_passes import FuseConsecutivePadsPass - -from ..model_builders import build_pad, build_consecutive_pads -from .conftest import ( - PARAMS, - _test_non_matching_params, - test_matching_params, - update_params_with_paddings, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = update_params_with_paddings(deepcopy(PARAMS), is_matching=lambda padding: True) - -# NOTE: this is intentional to keep test case count lower -PARAMS["default"]["paddings"] = PARAMS["smoke"]["paddings"] - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def build_model(): - return build_pad - - -@pytest.fixture() -def trf_pass(): - return FuseConsecutivePadsPass() - - -@pytest.fixture() -def model(input_shape, paddings, paddings_NC): - return build_consecutive_pads( - input_shape=input_shape, paddings_1=paddings, paddings_2=paddings_NC - ) - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_mutate(trf_pass, model): - # extract original padding values - subgraph = model.subgraphs[0] - assert len(subgraph.operators) == 2 - pad_1_ori = subgraph.operators[0].inputs[1] - pad_2_ori = subgraph.operators[1].inputs[1] - paddings_1_ori = pad_1_ori.as_array() - paddings_2_ori = pad_2_ori.as_array() - in_ori, out_ori = subgraph.inputs[0], subgraph.outputs[0] - - # run mutating pass - trf_pass.run(model) - model.sanity_check() - - # need to clean up dangling ops/tensors - CleanupManager(model).run_passes() - model.sanity_check() - - # check operator - assert len(subgraph.operators) == 1 - op = subgraph.operators[0] - assert len(op.inputs) == 2 - assert len(op.outputs) == 1 - - # check input/output tensors - assert len(subgraph.inputs) == len(subgraph.outputs) == 1 - in_new, out_new = subgraph.inputs[0], subgraph.outputs[0] - assert in_ori is in_new is op.inputs[0] - assert out_ori is out_new is op.outputs[0] - - # check parameters - pad_new = subgraph.operators[0].inputs[1] - paddings_new = pad_new.as_array() - assert pad_new is not pad_1_ori - assert pad_new is not pad_2_ori - assert paddings_new[0][0] == paddings_1_ori[0][0] + paddings_2_ori[0][0] - assert paddings_new[0][1] == paddings_1_ori[0][1] + paddings_2_ori[0][1] - assert paddings_new[1][0] == paddings_1_ori[1][0] + paddings_2_ori[1][0] - assert paddings_new[1][1] == paddings_1_ori[1][1] + paddings_2_ori[1][1] - assert paddings_new[2][0] == paddings_1_ori[2][0] + paddings_2_ori[2][0] - assert paddings_new[2][1] == paddings_1_ori[2][1] + paddings_2_ori[2][1] - assert paddings_new[3][0] == paddings_1_ori[3][0] + paddings_2_ori[3][0] - assert paddings_new[3][1] == paddings_1_ori[3][1] + paddings_2_ori[3][1] - - -def test_non_matching_single_pad(trf_pass, input_shape, paddings): - model = build_pad(input_shape=input_shape, paddings=paddings) - _test_non_matching_params(trf_pass, model) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_FuseConv2dPaddingPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_FuseConv2dPaddingPass.py deleted file mode 100644 index f7fed77e9..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_FuseConv2dPaddingPass.py +++ /dev/null @@ -1,204 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -from itertools import product -from copy import deepcopy -from typing import Tuple, NamedTuple - -from tflite2xcore.converter import CleanupManager -from tflite2xcore.transformation_passes import FuseConv2dPaddingPass -from tflite2xcore.xcore_schema import XCOREOpCodes -from tflite2xcore.xcore_model import XCOREModel - -from . import PaddingType -from ..model_builders import build_padded_DW, _calculate_implicit_pads, ModelBuilder -from ..test_conv2d_passes.conftest import ( - PARAMS as CONV_PARAMS, - _test_non_matching_params, - test_matching_params, -) -from .conftest import PARAMS, ParamsType - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -CONV_PARAMS = deepcopy(CONV_PARAMS) -PARAMS = deepcopy(PARAMS) - -# NOTE: this is intentional to keep test case count lower -PARAMS["extended"].update(CONV_PARAMS["default"]) -PARAMS["default"].update(CONV_PARAMS["smoke"]) -PARAMS["smoke"].update(CONV_PARAMS["smoke"]) - - -class ParamCombination(NamedTuple): - input_channels: int - input_size: Tuple[int, int] - kernel_size: Tuple[int, int] - stride: Tuple[int, int] - padding: PaddingType - - -def has_channel_batch_pad(padding: PaddingType) -> bool: - return not padding[0] == padding[3] == (0, 0) - - -def has_excessive_padding(param_combo: ParamCombination) -> bool: - implicit_pads = _calculate_implicit_pads( - param_combo.stride, param_combo.input_size, param_combo.kernel_size - ) - effective_pads = tuple( - tuple(sum(t) for t in zip(*pad_pairs)) - for pad_pairs in zip(implicit_pads, param_combo.padding[1:3]) - ) - - for p, k in zip(effective_pads, param_combo.kernel_size): - if p[0] >= k or p[1] >= k: - return True - return False - - -def update_params_with_paddings(PARAMS: ParamsType) -> ParamsType: - for params in PARAMS.values(): - input_sizes = product(params["input_height"], params["input_width"]) - kernel_sizes = product(params["kernel_height"], params["kernel_width"]) - strides = product(params["stride_h"], params["stride_w"]) - paddings = product( - product(params["pad_batch_l"], params["pad_batch_r"]), - product(params["pad_t"], params["pad_b"]), - product(params["pad_l"], params["pad_r"]), - product(params["pad_channel_l"], params["pad_channel_r"]), - ) - - non_matching_channel_batch_params = [] - non_matching_spatial_params = [] - matching_spatial_params = [] - - for t in product( - params["input_channels"], input_sizes, kernel_sizes, strides, paddings - ): - param_combo = ParamCombination(*t) - if has_channel_batch_pad(param_combo.padding): - non_matching_channel_batch_params.append(param_combo) - elif has_excessive_padding(param_combo): - non_matching_spatial_params.append(param_combo) - else: - matching_spatial_params.append(param_combo) - - params.update( - { - "non_matching_channel_batch_params": non_matching_channel_batch_params, - "non_matching_spatial_params": non_matching_spatial_params, - "matching_spatial_params": matching_spatial_params, - } - ) - return PARAMS - - -PARAMS = update_params_with_paddings(PARAMS) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def build_model() -> ModelBuilder: - return build_padded_DW - - -@pytest.fixture() -def trf_pass() -> FuseConv2dPaddingPass: - return FuseConv2dPaddingPass() - - -@pytest.fixture() -def model(matching_spatial_params: ParamCombination, input_channels: int) -> XCOREModel: - return build_padded_DW( - weight_shape=[*matching_spatial_params.kernel_size, input_channels], - input_size=matching_spatial_params.input_size, - paddings=matching_spatial_params.padding, - strides=matching_spatial_params.stride, - ) - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_mutate(trf_pass: FuseConv2dPaddingPass, model: XCOREModel) -> None: - # extract original model info - subgraph = model.subgraphs[0] - assert len(subgraph.operators) == 2 - pad_params_pad_ori = subgraph.operators[0].inputs[1].as_array() - pad_params_conv_ori = subgraph.operators[-1].custom_options["pad"] - in_ori, out_ori = subgraph.inputs[0], subgraph.outputs[0] - in_shape_ori, out_shape_ori = deepcopy(in_ori.shape), deepcopy(out_ori.shape) - - # run mutating pass - trf_pass.run(model) - model.sanity_check() - - # need to clean up dangling ops/tensors - CleanupManager(model).run_passes() - model.sanity_check() - - # check operator - assert len(subgraph.operators) == 1 - op = subgraph.operators[0] - assert op.operator_code.code is XCOREOpCodes.XC_conv2d_depthwise - assert len(op.inputs) == 3 - assert len(op.outputs) == 1 - - # check input/output tensors - assert len(subgraph.inputs) == len(subgraph.outputs) == 1 - in_new, out_new = subgraph.inputs[0], subgraph.outputs[0] - assert in_ori is in_new is op.inputs[0] - assert out_ori is out_new is op.outputs[0] - assert in_shape_ori == in_new.shape - assert out_shape_ori == out_new.shape - - # check 'pad' parameters - pad_params_new = op.custom_options["pad"] - assert len(pad_params_new) == 2 - assert -pad_params_new[0] - pad_params_conv_ori[0] == pad_params_pad_ori[1][0] - assert -pad_params_new[1] - pad_params_conv_ori[1] == pad_params_pad_ori[2][0] - - -def test_non_matching_channel_batch_params( - trf_pass: FuseConv2dPaddingPass, - build_model: ModelBuilder, - non_matching_channel_batch_params: ParamCombination, - input_channels: int, -) -> None: - model = build_model( - weight_shape=[*non_matching_channel_batch_params.kernel_size, input_channels], - input_size=non_matching_channel_batch_params.input_size, - paddings=non_matching_channel_batch_params.padding, - strides=non_matching_channel_batch_params.stride, - ) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_spatial_params( - trf_pass: FuseConv2dPaddingPass, - build_model: ModelBuilder, - non_matching_spatial_params: ParamCombination, - input_channels: int, -) -> None: - model = build_model( - weight_shape=[*non_matching_spatial_params.kernel_size, input_channels], - input_size=non_matching_spatial_params.input_size, - paddings=non_matching_spatial_params.padding, - strides=non_matching_spatial_params.stride, - ) - _test_non_matching_params(trf_pass, model) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_RemovePaddingInputPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_RemovePaddingInputPass.py deleted file mode 100644 index 57a7ef9db..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_RemovePaddingInputPass.py +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy - -from tflite2xcore.converter import CleanupManager -from tflite2xcore.transformation_passes.padding_passes import RemovePaddingInputPass - -from ..model_builders import build_pad, build_non_input_pad -from .conftest import ( - PARAMS, - _test_non_matching_params, - test_matching_params, - update_params_with_paddings, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - - -def only_channel_pad(padding): - return padding[-1] != (0, 0) and (all(pad == (0, 0) for pad in padding[:-1])) - - -PARAMS = update_params_with_paddings(deepcopy(PARAMS), is_matching=only_channel_pad) - -# NOTE: this is intentional to keep test case count lower -PARAMS["default"]["paddings"] = PARAMS["smoke"]["paddings"] - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass(): - return RemovePaddingInputPass() - - -@pytest.fixture() -def model(input_shape, paddings): - return build_pad(input_shape=input_shape, paddings=paddings) - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_mutate(trf_pass, model): - # extract original padding values - subgraph = model.subgraphs[0] - assert len(subgraph.operators) == 1 - out_ori = subgraph.outputs[0] - - # run mutating pass - trf_pass.run(model) - model.sanity_check() - - # need to clean up dangling ops/tensors - CleanupManager(model).run_passes() - model.sanity_check() - - # check pad operator has been removed - assert len(subgraph.operators) == 0 - - # check input/output tensors - new input/output should be old output - assert len(subgraph.inputs) == len(subgraph.outputs) == 1 - in_new, out_new = subgraph.inputs[0], subgraph.outputs[0] - assert in_new is out_ori - assert out_ori is out_new - - -def test_non_matching_non_input_pad(trf_pass, input_shape, paddings): - model = build_non_input_pad(input_shape=input_shape, paddings=paddings) - - for op in model.subgraphs[0].operators: - assert not trf_pass.match(op) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_ReplacePadPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_ReplacePadPass.py deleted file mode 100644 index 9e9c16763..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_ReplacePadPass.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import numpy as np -from typing import Tuple -from copy import deepcopy - -from tflite2xcore.transformation_passes import ReplacePadPass -from tflite2xcore.xcore_schema import BuiltinOpCodes, XCOREModel, XCOREOpCodes - -from . import PaddingType -from ..model_builders import build_pad, ModelBuilder - -from . import test_non_matching_paddings, test_replace_mutate as _test_replace_mutate -from .conftest import ( - PARAMS, - test_matching_params, - update_params_with_paddings, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - - -def is_matching(padding: PaddingType) -> bool: - return padding[0] == padding[3] == (0, 0) - - -PARAMS = update_params_with_paddings(deepcopy(PARAMS), is_matching=is_matching) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() # type: ignore -def build_model() -> ModelBuilder: - return build_pad - - -@pytest.fixture() # type: ignore -def trf_pass() -> ReplacePadPass: - return ReplacePadPass() - - -@pytest.fixture() -def new_opcode() -> XCOREOpCodes: - return XCOREOpCodes.XC_pad - - -@pytest.fixture() # type: ignore -def model(input_shape: Tuple[int, int, int, int], paddings: PaddingType) -> XCOREModel: - return build_pad(input_shape=input_shape, paddings=paddings) - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_mutate( - trf_pass: ReplacePadPass, model: XCOREModel, new_opcode: XCOREOpCodes -) -> None: - # extract original padding values - subgraph = model.subgraphs[0] - params_ori = subgraph.operators[-1].inputs[1].as_array().tolist() - - # run mutating pass - trf_pass.run(model) - model.sanity_check() - - _test_replace_mutate(trf_pass, model, new_opcode) - - # check operators - operators = subgraph.operators - assert len(operators) == 1 - op = operators[0] - - # check tensors - assert len(op.inputs) == 2 - assert len(op.outputs) == 1 - - # check parameters - params_new = op.inputs[1].as_array().tolist() - assert params_new == params_ori - - zero_point_byte = np.int8(op.inputs[0].quantization["zero_point"][0]).tobytes() - pad_value_bytes = np.int32(op.custom_options["pad_value"]).tobytes() - assert pad_value_bytes == zero_point_byte * 4 - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_SplitPaddingPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_SplitPaddingPass.py deleted file mode 100644 index c7d27936f..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_padding_passes/test_SplitPaddingPass.py +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy - -from tflite2xcore.transformation_passes import SplitPaddingPass -from tflite2xcore.xcore_schema import BuiltinOpCodes - -from ..model_builders import build_pad -from . import test_non_matching_paddings -from .conftest import ( - PARAMS, - _test_non_matching_params, - test_matching_params, - update_params_with_paddings, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - - -def is_matching(padding): - return (padding[0] != (0, 0) or padding[3] != (0, 0)) and ( - padding[1] != (0, 0) or padding[2] != (0, 0) - ) - - -PARAMS = update_params_with_paddings(deepcopy(PARAMS), is_matching=is_matching) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def build_model(): - return build_pad - - -@pytest.fixture() -def trf_pass(): - return SplitPaddingPass() - - -@pytest.fixture() -def model(input_shape, paddings): - return build_pad(input_shape=input_shape, paddings=paddings) - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_mutate(trf_pass, model): - # extract original padding values - subgraph = model.subgraphs[0] - params_ori = subgraph.operators[-1].inputs[1].as_array() - - # run mutating pass - trf_pass.run(model) - model.sanity_check() - - # check operators - operators = subgraph.operators - assert len(operators) == 2 - op_NC, op_HW = operators - assert op_NC.operator_code.code is op_HW.operator_code.code is BuiltinOpCodes.PAD - assert len(op_NC.inputs) == len(op_HW.inputs) == 2 - assert len(op_NC.outputs) == len(op_HW.outputs) == 1 - - # check input/output tensors - assert len(subgraph.inputs) == len(subgraph.outputs) == 1 - input_tensor, output_tensor = subgraph.inputs[0], subgraph.outputs[0] - assert input_tensor in op_NC.inputs - assert input_tensor not in op_NC.outputs + op_HW.inputs + op_HW.outputs - assert output_tensor in op_HW.outputs - assert output_tensor not in op_HW.inputs + op_NC.inputs + op_NC.outputs - - # check wiring - assert op_NC.outputs[0] is op_HW.inputs[0] - - # check parameters - params_NC = op_NC.inputs[1].as_array() - assert params_NC[1][0] == params_NC[2][0] == 0 - assert params_NC[1][1] == params_NC[2][1] == 0 - assert params_NC[0][0] == params_ori[0][0] - assert params_NC[0][1] == params_ori[0][1] - assert params_NC[3][0] == params_ori[3][0] - assert params_NC[3][1] == params_ori[3][1] - - params_HW = op_HW.inputs[1].as_array() - assert params_HW[0][0] == params_HW[3][0] == 0 - assert params_HW[0][1] == params_HW[3][1] == 0 - assert params_HW[1][0] == params_ori[1][0] - assert params_HW[1][1] == params_ori[1][1] - assert params_HW[2][0] == params_ori[2][0] - assert params_HW[2][1] == params_ori[2][1] - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/conftest.py deleted file mode 100644 index 8e3597913..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/conftest.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from tflite2xcore.transformation_passes import ModelTransformationPass -from tflite2xcore.xcore_model import XCOREModel - -from ..conftest import PARAMS, test_matching_params, _test_non_matching_params - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS["extended"].update({"num_threads": [1, 2, 3, 4, 5]}) - -PARAMS["default"].update({"num_threads": [1, 4, 5]}) - -PARAMS["smoke"].update({"num_threads": [5]}) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate( - trf_pass: ModelTransformationPass, model: XCOREModel, num_threads: int -) -> None: - op = model.subgraphs[0].operators[0] - assert "par" not in op.custom_options - - trf_pass.run(model) - model.sanity_check() - - _test_non_matching_params(trf_pass, model) - assert "par" in op.custom_options diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeConv2dPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeConv2dPass.py deleted file mode 100644 index 6b71ccd12..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeConv2dPass.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy -from typing import Tuple, Callable - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import ( - ModelTransformationPass, - ParallelizeConv2dPass, -) - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_XC_conv2d_deep, - build_XC_conv2d_shallowin, - build_XC_conv2d_1x1, -) - -from ..test_conv2d_passes.conftest import PARAMS, weight_shape -from .conftest import test_matching_params, test_mutate, PARAMS as PAR_PARAMS - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -for k in PARAMS: - PARAMS[k].update( - { - "num_threads": PAR_PARAMS[k]["num_threads"], - "model_builder": [ - build_XC_conv2d_deep, - build_XC_conv2d_shallowin, - build_XC_conv2d_1x1, - ], - } - ) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass(num_threads: int) -> ModelTransformationPass: - return ParallelizeConv2dPass(num_threads=num_threads) - - -@pytest.fixture() -def model( - model_builder: Callable[..., XCOREModel], - weight_shape: Tuple[int, int, int, int], - input_size: Tuple[int, int], - strides: Tuple[int, int], -) -> XCOREModel: - return model_builder( - weight_shape=weight_shape, input_size=input_size, strides=strides - ) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeDepthwiseConv2dPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeDepthwiseConv2dPass.py deleted file mode 100644 index 591c85543..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeDepthwiseConv2dPass.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy -from typing import Tuple - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import ( - ModelTransformationPass, - ParallelizeDepthwiseConv2dPass, -) - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_XC_conv2d_depthwise, -) - -from ..test_conv2d_passes.test_ReplaceDepthwiseConv2dPass import PARAMS, weight_shape -from .conftest import test_matching_params, test_mutate, PARAMS as PAR_PARAMS - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -for k in PARAMS: - PARAMS[k].update({"num_threads": PAR_PARAMS[k]["num_threads"]}) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass(num_threads: int) -> ModelTransformationPass: - return ParallelizeDepthwiseConv2dPass(num_threads=num_threads) - - -@pytest.fixture() -def model( - weight_shape: Tuple[int, int, int, int], - input_size: Tuple[int, int], - strides: Tuple[int, int], -) -> XCOREModel: - return build_XC_conv2d_depthwise( - weight_shape=weight_shape, input_size=input_size, strides=strides - ) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeFullyConnectedPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeFullyConnectedPass.py deleted file mode 100644 index f7e1acebe..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeFullyConnectedPass.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import ( - ModelTransformationPass, - ParallelizeFullyConnectedPass, -) - -from tflite2xcore.tests.test_transformation_passes.model_builders import build_XC_fc - -from ..test_fully_connected_passes.conftest import PARAMS -from .conftest import test_matching_params, test_mutate, PARAMS as PAR_PARAMS - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -for k in PARAMS: - PARAMS[k].update({"num_threads": PAR_PARAMS[k]["num_threads"]}) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass(num_threads: int) -> XCOREModel: - return ParallelizeFullyConnectedPass(num_threads=num_threads) - - -@pytest.fixture() -def model(outputs: int, input_channels: int) -> ModelTransformationPass: - return build_XC_fc(outputs=outputs, input_channels=input_channels) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeGlobalAveragePool2DPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeGlobalAveragePool2DPass.py deleted file mode 100644 index 66e8c9ae7..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeGlobalAveragePool2DPass.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy -from typing import Tuple - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import ( - ModelTransformationPass, - ParallelizeGlobalAveragePool2DPass, -) - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_XC_avgpool2d_global, -) - -from ..test_pooling_passes.test_ReplaceGlobalAveragePool2DPass import PARAMS -from .conftest import test_matching_params, test_mutate, PARAMS as PAR_PARAMS - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -for k in PARAMS: - PARAMS[k].update({"num_threads": PAR_PARAMS[k]["num_threads"]}) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass(num_threads: int) -> XCOREModel: - return ParallelizeGlobalAveragePool2DPass(num_threads=num_threads) - - -@pytest.fixture() -def model( - input_shape: Tuple[int, int, int], reduction_dims: Tuple[int, ...] -) -> ModelTransformationPass: - return build_XC_avgpool2d_global( - input_shape=input_shape, reduction_dims=reduction_dims - ) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizePool2DPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizePool2DPass.py deleted file mode 100644 index 56c20beed..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizePool2DPass.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy -from typing import Tuple, Callable - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import ( - ModelTransformationPass, - ParallelizePooling2DPass, -) - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_XC_maxpool2d, - build_XC_avgpool2d, -) - -from ..test_pooling_passes.conftest import PARAMS, pool_size -from .conftest import test_matching_params, test_mutate, PARAMS as PAR_PARAMS - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -for k in PARAMS: - PARAMS[k].update( - { - "num_threads": PAR_PARAMS[k]["num_threads"], - "model_builder": [build_XC_maxpool2d, build_XC_avgpool2d], - } - ) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass(num_threads: int) -> ModelTransformationPass: - return ParallelizePooling2DPass(num_threads=num_threads) - - -@pytest.fixture() -def model( - model_builder: Callable[..., XCOREModel], - input_shape: Tuple[int, int, int], - pool_size: Tuple[int, int], - strides: Tuple[int, int], -) -> XCOREModel: - return model_builder(input_shape=input_shape, pool_size=pool_size, strides=strides) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeRequant16To8Pass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeRequant16To8Pass.py deleted file mode 100644 index b68bd1933..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_parallelization_passes/test_ParallelizeRequant16To8Pass.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import ( - ModelTransformationPass, - ParallelizeRequant16To8Pass, -) - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_XC_requantize_16_to_8, -) - -from .test_ParallelizeFullyConnectedPass import PARAMS -from .conftest import test_matching_params, test_mutate - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass(num_threads: int) -> XCOREModel: - return ParallelizeRequant16To8Pass(num_threads=num_threads) - - -@pytest.fixture() -def model(outputs: int, input_channels: int) -> ModelTransformationPass: - return build_XC_requantize_16_to_8(outputs=outputs, input_channels=input_channels) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/conftest.py deleted file mode 100644 index d92fe4dad..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/conftest.py +++ /dev/null @@ -1,270 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -from typing import Tuple -from copy import deepcopy - -from tflite2xcore.transformation_passes import ModelTransformationPass -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import Padding, ActivationFunctionType, XCOREOpCodes - -from tflite2xcore.tests.test_transformation_passes.model_builders import ModelBuilder -from ..conftest import ( - PARAMS, - _test_non_matching_params, - test_matching_params, - test_replace_mutate as _test_replace_mutate, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -PARAMS["default"].update( - { - "non_matching_input_channels": [1, 3, 9, 15], - "padding": [Padding.VALID], - "non_matching_padding": [Padding.SAME], - "fused_activation": [ActivationFunctionType.NONE], - "non_matching_fused_activation": [ - ActivationFunctionType.RELU, - ActivationFunctionType.RELU6, - ], - "stride_h": [1, 2], - "stride_w": [1, 2], - "pool_h": [1, 2, 3], - "pool_w": [1, 2, 3], - } -) - -PARAMS["smoke"].update( - { - "non_matching_input_channels": [1, 9], - "padding": [Padding.VALID], - "non_matching_padding": [Padding.SAME], - "fused_activation": [ActivationFunctionType.NONE], - "non_matching_fused_activation": [ActivationFunctionType.RELU], - "stride_h": [2], - "stride_w": [2], - "pool_h": [2, 3], - "pool_w": [2, 3], - } -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def pool_size(pool_h, pool_w) -> Tuple[int, int]: - return (pool_h, pool_w) - - -@pytest.fixture() -def model( - build_model: ModelBuilder, - input_shape: Tuple[int, int, int], - pool_size: Tuple[int, int], - strides: Tuple[int, int], - padding: Padding, - fused_activation: ActivationFunctionType, -) -> XCOREModel: - return build_model( - input_shape=input_shape, - padding=padding, - pool_size=pool_size, - strides=strides, - fused_activation=fused_activation, - ) - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_mutate( - trf_pass: ModelTransformationPass, model: XCOREModel, custom_opcode: XCOREOpCodes -) -> None: - subgraph = model.subgraphs[0] - old_op = subgraph.operators[0] - strides = tuple(old_op.builtin_options[f"stride_{ax}"] for ax in ("h", "w")) - pool = tuple(old_op.builtin_options[f"filter_{ax}"] for ax in ("height", "width")) - - _test_replace_mutate(trf_pass, model, custom_opcode) - - custom_options = subgraph.operators[-1].custom_options - assert "pool" in custom_options - assert custom_options["pool"] == pool - assert "stride" in custom_options - assert custom_options["stride"] == strides - - -def test_non_matching_input_channels( - trf_pass: ModelTransformationPass, - build_model: ModelBuilder, - input_size: Tuple[int, int], - non_matching_input_channels: int, - pool_size: Tuple[int, int], - strides: Tuple[int, int], - padding: Padding, - fused_activation: ActivationFunctionType, -) -> None: - input_shape = (*input_size, non_matching_input_channels) - model = build_model( - input_shape=input_shape, - padding=padding, - pool_size=pool_size, - strides=strides, - fused_activation=fused_activation, - ) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_fused_activation( - trf_pass: ModelTransformationPass, - build_model: ModelBuilder, - input_shape: Tuple[int, int, int], - pool_size: Tuple[int, int], - strides: Tuple[int, int], - padding: Padding, - non_matching_fused_activation: ActivationFunctionType, -) -> None: - model = build_model( - input_shape=input_shape, - padding=padding, - pool_size=pool_size, - strides=strides, - fused_activation=non_matching_fused_activation, - ) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_input_height( - trf_pass: ModelTransformationPass, - build_model: ModelBuilder, - input_width: int, - non_matching_input_height: int, - input_channels: int, - pool_size: Tuple[int, int], - strides: Tuple[int, int], - padding: Padding, - fused_activation: ActivationFunctionType, -) -> None: - input_shape = (input_width, non_matching_input_height, input_channels) - model = build_model( - input_shape=input_shape, - padding=padding, - pool_size=pool_size, - strides=strides, - fused_activation=fused_activation, - ) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_input_width( - trf_pass: ModelTransformationPass, - build_model: ModelBuilder, - non_matching_input_width: int, - input_height: int, - input_channels: int, - pool_size: Tuple[int, int], - strides: Tuple[int, int], - padding: Padding, - fused_activation: ActivationFunctionType, -) -> None: - input_shape = (non_matching_input_width, input_height, input_channels) - model = build_model( - input_shape=input_shape, - padding=padding, - pool_size=pool_size, - strides=strides, - fused_activation=fused_activation, - ) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_pool_h( - trf_pass: ModelTransformationPass, - build_model: ModelBuilder, - input_shape: Tuple[int, int, int], - non_matching_pool_h: int, - pool_w: int, - strides: Tuple[int, int], - padding: Padding, - fused_activation: ActivationFunctionType, -) -> None: - model = build_model( - input_shape=input_shape, - padding=padding, - pool_size=(non_matching_pool_h, pool_w), - strides=strides, - fused_activation=fused_activation, - ) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_pool_w( - trf_pass: ModelTransformationPass, - build_model: ModelBuilder, - input_shape: Tuple[int, int, int], - pool_h: int, - non_matching_pool_w: int, - strides: Tuple[int, int], - padding: Padding, - fused_activation: ActivationFunctionType, -) -> None: - model = build_model( - input_shape=input_shape, - padding=padding, - pool_size=(pool_h, non_matching_pool_w), - strides=strides, - fused_activation=fused_activation, - ) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_stride_h( - trf_pass: ModelTransformationPass, - build_model: ModelBuilder, - input_shape: Tuple[int, int, int], - pool_size: Tuple[int, int], - non_matching_stride_h: int, - stride_w: int, - padding: Padding, - fused_activation: ActivationFunctionType, -) -> None: - model = build_model( - input_shape=input_shape, - padding=padding, - pool_size=pool_size, - strides=(non_matching_stride_h, stride_w), - fused_activation=fused_activation, - ) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_stride_w( - trf_pass: ModelTransformationPass, - build_model: ModelBuilder, - input_shape: Tuple[int, int, int], - pool_size: Tuple[int, int], - stride_h: int, - non_matching_stride_w: int, - padding: Padding, - fused_activation: ActivationFunctionType, -) -> None: - model = build_model( - input_shape=input_shape, - padding=padding, - pool_size=pool_size, - strides=(stride_h, non_matching_stride_w), - fused_activation=fused_activation, - ) - _test_non_matching_params(trf_pass, model) diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceAveragePool2D2x2Pass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceAveragePool2D2x2Pass.py deleted file mode 100644 index da57251ef..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceAveragePool2D2x2Pass.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy - -from tflite2xcore.xcore_schema import Padding, XCOREOpCodes -from tflite2xcore.transformation_passes import ReplaceAveragePool2D2x2Pass - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_avgpool, - ModelBuilder, -) -from .conftest import ( - PARAMS, - test_matching_params, - test_mutate, - test_non_matching_input_channels, - test_non_matching_fused_activation, - test_non_matching_input_height, - test_non_matching_input_width, - test_non_matching_pool_h, - test_non_matching_pool_w, - test_non_matching_stride_h, - test_non_matching_stride_w, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -PARAMS["default"].update( - { - "input_height": [2, 4, 8, 12], - "non_matching_input_height": [3, 9, 13, 23], - "input_width": [2, 4, 8, 12], - "non_matching_input_width": [3, 9, 13, 23], - "padding": list(Padding), - "stride_h": [2], - "non_matching_stride_h": [1, 3], - "stride_w": [2], - "non_matching_stride_w": [1, 3], - "pool_h": [2], - "non_matching_pool_h": [1, 3], - "pool_w": [2], - "non_matching_pool_w": [1, 3], - } -) - -PARAMS["smoke"].update( - { - "input_height": [2, 12], - "non_matching_input_height": [3, 13], - "input_width": [2, 12], - "non_matching_input_width": [3, 13], - "padding": list(Padding), - "stride_h": [2], - "non_matching_stride_h": [3], - "stride_w": [2], - "non_matching_stride_w": [3], - "pool_h": [2], - "non_matching_pool_h": [3], - "pool_w": [2], - "non_matching_pool_w": [3], - } -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def build_model() -> ModelBuilder: - return build_avgpool - - -@pytest.fixture() -def trf_pass() -> ReplaceAveragePool2D2x2Pass: - return ReplaceAveragePool2D2x2Pass() - - -@pytest.fixture() -def custom_opcode() -> XCOREOpCodes: - return XCOREOpCodes.XC_avgpool2d - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceAveragePool2DPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceAveragePool2DPass.py deleted file mode 100644 index edaedff3e..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceAveragePool2DPass.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.transformation_passes import ReplaceAveragePool2DPass - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_avgpool, - ModelBuilder, -) -from .test_ReplaceAveragePool2D2x2Pass import custom_opcode -from .conftest import ( - PARAMS, - test_matching_params, - test_mutate, - test_non_matching_input_channels, - test_non_matching_fused_activation, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def build_model() -> ModelBuilder: - return build_avgpool - - -@pytest.fixture() -def trf_pass() -> ReplaceAveragePool2DPass: - return ReplaceAveragePool2DPass() - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceGlobalAveragePool2DPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceGlobalAveragePool2DPass.py deleted file mode 100644 index fd24baeee..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceGlobalAveragePool2DPass.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import itertools -from typing import Tuple -from copy import deepcopy - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import XCOREOpCodes -from tflite2xcore.transformation_passes import ReplaceGlobalAveragePool2DPass - -from tflite2xcore.tests.test_transformation_passes.model_builders import build_mean -from .conftest import ( - PARAMS, - test_matching_params, - _test_non_matching_params, - _test_replace_mutate as _test_mutate, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -PARAMS["default"].update({"reduction_dims": [(1, 2), (2, 1)]}) -PARAMS["default"].update( - { - "non_matching_reduction_dims": [ - t - for t in itertools.chain( - itertools.product(range(4)), - itertools.product(range(4), repeat=2), - itertools.product(range(4), repeat=3), - ) - if t not in PARAMS["default"]["reduction_dims"] - ] - } -) - -PARAMS["smoke"].update({"reduction_dims": PARAMS["default"]["reduction_dims"]}) -PARAMS["smoke"].update( - { - "non_matching_reduction_dims": [ - t - for t in itertools.chain( - itertools.product(range(1, 4)), itertools.product(range(1, 4), repeat=2) - ) - if t not in PARAMS["smoke"]["reduction_dims"] - ] - } -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> ReplaceGlobalAveragePool2DPass: - return ReplaceGlobalAveragePool2DPass() - - -@pytest.fixture() -def model( - input_shape: Tuple[int, int, int], reduction_dims: Tuple[int, int] -) -> XCOREModel: - return build_mean(input_shape=input_shape, reduction_dims=reduction_dims) - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_mutate(trf_pass: ReplaceGlobalAveragePool2DPass, model: XCOREModel) -> None: - _test_mutate(trf_pass, model, new_opcode=XCOREOpCodes.XC_avgpool2d_global) - - # check bias/scale/offset tensor - op = model.subgraphs[0].operators[-1] - assert op.inputs[1].shape == (7,) - - -def test_non_matching_input_channels( - trf_pass: ReplaceGlobalAveragePool2DPass, - input_size: Tuple[int, int], - non_matching_input_channels: int, - reduction_dims: Tuple[int, int], -) -> None: - input_shape = (*input_size, non_matching_input_channels) - model = build_mean(input_shape=input_shape, reduction_dims=reduction_dims) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_reduction_dims( - trf_pass: ReplaceGlobalAveragePool2DPass, - input_shape: Tuple[int, int, int], - non_matching_reduction_dims: Tuple[int, ...], -) -> None: - model = build_mean( - input_shape=input_shape, reduction_dims=non_matching_reduction_dims - ) - _test_non_matching_params(trf_pass, model) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceMaxPool2D2x2Pass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceMaxPool2D2x2Pass.py deleted file mode 100644 index 5dd169ca5..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceMaxPool2D2x2Pass.py +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import XCOREOpCodes -from tflite2xcore.transformation_passes import ReplaceMaxPool2D2x2Pass - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_maxpool, - ModelBuilder, -) -from .test_ReplaceAveragePool2D2x2Pass import PARAMS -from .conftest import ( - test_matching_params, - test_mutate, - test_non_matching_input_channels, - test_non_matching_fused_activation, - test_non_matching_input_height, - test_non_matching_input_width, - test_non_matching_pool_h, - test_non_matching_pool_w, - test_non_matching_stride_h, - test_non_matching_stride_w, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def build_model() -> ModelBuilder: - return build_maxpool - - -@pytest.fixture() -def trf_pass() -> ReplaceMaxPool2D2x2Pass: - return ReplaceMaxPool2D2x2Pass() - - -@pytest.fixture() -def custom_opcode() -> XCOREOpCodes: - return XCOREOpCodes.XC_maxpool2d - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceMaxPool2DPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceMaxPool2DPass.py deleted file mode 100644 index 81231b9d1..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_pooling_passes/test_ReplaceMaxPool2DPass.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.transformation_passes import ReplaceMaxPool2DPass - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_maxpool, - ModelBuilder, -) -from .test_ReplaceMaxPool2D2x2Pass import custom_opcode -from .conftest import ( - PARAMS, - test_matching_params, - test_mutate, - test_non_matching_input_channels, - test_non_matching_fused_activation, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def build_model() -> ModelBuilder: - return build_maxpool - - -@pytest.fixture() -def trf_pass() -> ReplaceMaxPool2DPass: - return ReplaceMaxPool2DPass() - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/conftest.py deleted file mode 100644 index 8e0040582..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/conftest.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from ..conftest import ( - PARAMS, - _test_non_matching_params, - _make_name_type_pairs, - NON_INT8_TEST_TYPES, - NON_FLOAT32_TEST_TYPES, - test_matching_params, - test_non_matching_tensors, -) diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_CanonicalizeQuantizedInputPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_CanonicalizeQuantizedInputPass.py deleted file mode 100644 index 6b360077d..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_CanonicalizeQuantizedInputPass.py +++ /dev/null @@ -1,157 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import ( - XCOREModel, - Subgraph, - TensorType, - OperatorCode, - BuiltinOpCodes, -) -from tflite2xcore.transformation_passes import CanonicalizeQuantizedInputPass - - -@pytest.fixture() -def simple_model(): - subgraph = Subgraph(model=XCOREModel()) - - fin = subgraph.create_tensor( - "input", TensorType.FLOAT32, [1, 5, 5, 3], isinput=True - ) - qin = subgraph.create_tensor("quantized_input", TensorType.INT8, fin.shape) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.QUANTIZE), inputs=[fin], outputs=[qin] - ) - - qout = subgraph.create_tensor( - "quantized_output", TensorType.INT8, qin.shape, isoutput=True - ) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.ABS), inputs=[qin], outputs=[qout] - ) - - return subgraph.model - - -@pytest.fixture() -def dual_input_model(): - subgraph = Subgraph(model=XCOREModel()) - - fin1 = subgraph.create_tensor( - "input_1", TensorType.FLOAT32, [1, 5, 5, 3], isinput=True - ) - qin1 = subgraph.create_tensor("quantized_input_1", TensorType.INT8, fin1.shape) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.QUANTIZE), inputs=[fin1], outputs=[qin1] - ) - - fin2 = subgraph.create_tensor( - "input_2", TensorType.FLOAT32, fin1.shape, isinput=True - ) - qin2 = subgraph.create_tensor("quantized_input_2", TensorType.INT8, fin2.shape) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.QUANTIZE), inputs=[fin2], outputs=[qin2] - ) - - qout = subgraph.create_tensor( - "quantized_output", TensorType.INT8, qin1.shape, isoutput=True - ) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.ADD), inputs=[qin1, qin2], outputs=[qout] - ) - - return subgraph.model - - -@pytest.fixture() -def non_matching_model(): - subgraph = Subgraph(model=XCOREModel()) - - fin1 = subgraph.create_tensor( - "input_1", TensorType.FLOAT32, [1, 5, 5, 3], isinput=True - ) - qout1 = subgraph.create_tensor( - "quantized_output_1", TensorType.INT8, fin1.shape, isoutput=True - ) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.QUANTIZE), inputs=[fin1], outputs=[qout1] - ) - - fin2 = subgraph.create_tensor( - "input_2", TensorType.FLOAT32, [1, 3, 3, 8], isinput=True - ) - qout2 = subgraph.create_tensor( - "quantized_output_2", TensorType.INT8, fin2.shape, isoutput=True - ) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.QUANTIZE), inputs=[fin2], outputs=[qout2] - ) - - return subgraph.model - - -@pytest.fixture() -def trf_pass(): - return CanonicalizeQuantizedInputPass() - - -def test_match(simple_model, trf_pass): - assert trf_pass.match(simple_model.subgraphs[0].operators[0]) - - -def test_mutate(simple_model, trf_pass): - subgraph = simple_model.subgraphs[0] - trf_pass.mutate(subgraph.operators[0]) - subgraph.sanity_check() - - qin = subgraph.get_tensor("quantized_input") - qout = subgraph.get_tensor("quantized_output") - - assert len(subgraph.operators) == 1 - assert subgraph.operators[0].operator_code.code is BuiltinOpCodes.ABS - assert len(subgraph.tensors) == 2 - assert qin in subgraph.inputs and qin not in subgraph.outputs - assert qout in subgraph.outputs and qout not in subgraph.inputs - - -def test_run_simple(simple_model, trf_pass): - trf_pass.run(simple_model) - simple_model.sanity_check() - subgraph = simple_model.subgraphs[0] - - qin = subgraph.get_tensor("quantized_input") - qout = subgraph.get_tensor("quantized_output") - - assert len(subgraph.operators) == 1 - assert subgraph.operators[0].operator_code.code is BuiltinOpCodes.ABS - assert len(subgraph.tensors) == 2 - assert qin in subgraph.inputs and qin not in subgraph.outputs - assert qout in subgraph.outputs and qout not in subgraph.inputs - - -def test_run_dual_input(dual_input_model, trf_pass): - trf_pass.run(dual_input_model) - dual_input_model.sanity_check() - subgraph = dual_input_model.subgraphs[0] - - qin1 = subgraph.get_tensor("quantized_input_1") - qin2 = subgraph.get_tensor("quantized_input_2") - qout = subgraph.get_tensor("quantized_output") - - assert len(subgraph.operators) == 1 - assert subgraph.operators[0].operator_code.code is BuiltinOpCodes.ADD - assert len(subgraph.tensors) == 3 - assert qin1 in subgraph.inputs and qin1 not in subgraph.outputs - assert qin2 in subgraph.inputs and qin2 not in subgraph.outputs - assert qout in subgraph.outputs and qout not in subgraph.inputs - - -def test_non_match(trf_pass, non_matching_model): - for op in non_matching_model.subgraphs[0].operators: - assert not trf_pass.match(op) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_CanonicalizeQuantizedOutputPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_CanonicalizeQuantizedOutputPass.py deleted file mode 100644 index 0b26c9498..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_CanonicalizeQuantizedOutputPass.py +++ /dev/null @@ -1,167 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy - -from tflite2xcore.xcore_schema import TensorType, OperatorCode, BuiltinOpCodes -from tflite2xcore.transformation_passes import CanonicalizeQuantizedOutputPass - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_split, - build_dequantize, - build_abs, - _glue_ops, -) - -from .conftest import ( - PARAMS, - _test_non_matching_params, - _make_name_type_pairs, - NON_INT8_TEST_TYPES, - NON_FLOAT32_TEST_TYPES, - test_matching_params, - test_non_matching_tensors, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -_NON_MATCHING_TENSORS = [ - {**d1, **d2} # the types of "input" and "output" are changed concurrently - for d1, d2 in zip( - _make_name_type_pairs("input", NON_INT8_TEST_TYPES), - _make_name_type_pairs("output", NON_INT8_TEST_TYPES), - ) -] + list(_make_name_type_pairs("output_dequantized", NON_FLOAT32_TEST_TYPES)) - -PARAMS["default"].update( - {"num_splits": [2, 4], "non_matching_tensors": _NON_MATCHING_TENSORS} -) - -PARAMS["smoke"].update( - {"num_splits": [2], "non_matching_tensors": _NON_MATCHING_TENSORS[::2]} -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def model(input_shape): - model = build_abs(input_shape=input_shape, tensor_type=TensorType.INT8) - subgraph = model.subgraphs[0] - - build_dequantize(subgraph, input_shape=input_shape) - - _glue_ops(*subgraph.operators[:2]) - - return model - - -@pytest.fixture() -def model_multi_out(input_shape, num_splits): - model = build_split( - input_shape=input_shape, - num_splits=num_splits, - tensor_type=TensorType.INT8, - axis=2, - ) - subgraph = model.subgraphs[0] - - op = model.subgraphs[0].operators[0] - for qout in op.outputs: - subgraph.outputs.remove(qout) - fout = subgraph.create_tensor( - qout.name + "_float", TensorType.FLOAT32, qout.shape, isoutput=True - ) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.DEQUANTIZE), inputs=[qout], outputs=[fout] - ) - - return model - - -@pytest.fixture() -def model_non_matching_consumer(model, input_shape): - subgraph = model.subgraphs[0] - op_deq = subgraph.operators[-1] - - build_abs(subgraph, input_shape=input_shape, tensor_type=op_deq.outputs[0].type) - op_abs_2 = subgraph.operators[-1] - _glue_ops(op_deq, op_abs_2) # this removes op_deq.outputs[0] - subgraph.outputs.append(op_abs_2.inputs[0]) # so we put back its replacement - - return model - - -@pytest.fixture() -def trf_pass(): - return CanonicalizeQuantizedOutputPass() - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_mutate(model, trf_pass): - subgraph = model.subgraphs[0] - trf_pass.mutate(subgraph.operators[1]) - subgraph.sanity_check() - - qin = subgraph.get_tensor("input") - qout = subgraph.get_tensor("output") - - assert len(subgraph.operators) == 1 - assert subgraph.operators[0].operator_code.code is BuiltinOpCodes.ABS - assert len(subgraph.tensors) == 2 - assert qin in subgraph.inputs - assert qin not in subgraph.outputs - assert qout in subgraph.outputs - assert qout not in subgraph.inputs - - -def test_mutate_multi_out(model_multi_out, num_splits, trf_pass): - trf_pass.run(model_multi_out) - model_multi_out.sanity_check() - subgraph = model_multi_out.subgraphs[0] - - assert len(subgraph.operators) == 1 - assert subgraph.operators[0].operator_code.code is BuiltinOpCodes.SPLIT - assert len(subgraph.tensors) == 2 + num_splits # split has two inputs - - taxis = subgraph.get_tensor("axis") - assert taxis not in subgraph.outputs - assert taxis not in subgraph.inputs - - tin = subgraph.get_tensor("input") - assert tin in subgraph.inputs - assert tin not in subgraph.outputs - - assert len(subgraph.outputs) == num_splits - for j, tout in enumerate(subgraph.outputs): - assert tout not in subgraph.inputs, f"subgraph.outputs[{j}]" - - -def test_non_matching_input(trf_pass, input_shape): - # NOTE: a single DEQUANTIZE will always have an input tensor that is an input - # to the subgraph, hence it should not be matched - model = build_dequantize(input_shape=input_shape) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_consumers(trf_pass, model_non_matching_consumer): - for j, op in enumerate(model_non_matching_consumer.subgraphs[0].operators): - assert not trf_pass.match(op), f"subgraphs[0].operators[{j}]" - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_LegalizeFloatInputPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_LegalizeFloatInputPass.py deleted file mode 100644 index 4eb1869e7..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_LegalizeFloatInputPass.py +++ /dev/null @@ -1,153 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import ( - XCOREModel, - Subgraph, - TensorType, - OperatorCode, - BuiltinOpCodes, -) -from tflite2xcore.transformation_passes import LegalizeFloatInputPass - - -@pytest.fixture() -def simple_model(): - subgraph = Subgraph(model=XCOREModel()) - - qin = subgraph.create_tensor( - "quantized_input", TensorType.INT8, [1, 5, 5, 3], isinput=True - ) - qout = subgraph.create_tensor( - "quantized_output", TensorType.INT8, qin.shape, isoutput=True - ) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.ABS), inputs=[qin], outputs=[qout] - ) - - return subgraph.model - - -@pytest.fixture() -def dual_input_model(): - subgraph = Subgraph(model=XCOREModel()) - - qin1 = subgraph.create_tensor( - "quantized_input_1", TensorType.INT8, [1, 5, 5, 3], isinput=True - ) - qin2 = subgraph.create_tensor( - "quantized_input_2", TensorType.INT8, qin1.shape, isinput=True - ) - qout = subgraph.create_tensor( - "quantized_output", TensorType.INT8, qin1.shape, isoutput=True - ) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.ADD), inputs=[qin1, qin2], outputs=[qout] - ) - - return subgraph.model - - -@pytest.fixture() -def non_matching_model(): - subgraph = Subgraph(model=XCOREModel()) - - qin = subgraph.create_tensor( - "quantized_input", TensorType.INT32, [1, 5, 5, 3], isinput=True - ) - qout = subgraph.create_tensor( - "quantized_output", TensorType.INT32, qin.shape, isoutput=True - ) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.ABS), inputs=[qin], outputs=[qout] - ) - - fin = subgraph.create_tensor( - "float_input", TensorType.FLOAT32, [1, 3, 3, 8], isinput=True - ) - fout = subgraph.create_tensor( - "float_output", TensorType.FLOAT32, fin.shape, isoutput=True - ) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.ABS), inputs=[fin], outputs=[fout] - ) - - return subgraph.model - - -@pytest.fixture() -def trf_pass(): - return LegalizeFloatInputPass() - - -def test_match(simple_model, trf_pass): - assert trf_pass.match(simple_model.subgraphs[0].inputs[0]) - - -def test_mutate(simple_model, trf_pass): - subgraph = simple_model.subgraphs[0] - trf_pass.mutate(subgraph.inputs[0]) - simple_model.sanity_check() - - qin = subgraph.get_tensor("quantized_input") - fin = subgraph.get_tensor("quantized_input_float") - qout = subgraph.get_tensor("quantized_output") - - assert len(subgraph.operators) == 2 - assert len(subgraph.tensors) == 3 - assert len(subgraph.inputs) == 1 - assert len(subgraph.outputs) == 1 - assert fin in subgraph.inputs and fin not in subgraph.outputs - assert qin not in (subgraph.inputs + subgraph.outputs) - assert qout in subgraph.outputs and qout not in subgraph.inputs - - -def test_run_simple(simple_model, trf_pass): - trf_pass.run(simple_model) - simple_model.sanity_check() - subgraph = simple_model.subgraphs[0] - - qin = subgraph.get_tensor("quantized_input") - fin = subgraph.get_tensor("quantized_input_float") - qout = subgraph.get_tensor("quantized_output") - - assert len(subgraph.operators) == 2 - assert len(subgraph.tensors) == 3 - assert len(subgraph.inputs) == 1 - assert len(subgraph.outputs) == 1 - assert fin in subgraph.inputs and fin not in subgraph.outputs - assert qin not in (subgraph.inputs + subgraph.outputs) - assert qout in subgraph.outputs and qout not in subgraph.inputs - - -def test_run_dual_input(dual_input_model, trf_pass): - trf_pass.run(dual_input_model) - dual_input_model.sanity_check() - subgraph = dual_input_model.subgraphs[0] - - qin1 = subgraph.get_tensor("quantized_input_1") - qin2 = subgraph.get_tensor("quantized_input_2") - fin1 = subgraph.get_tensor("quantized_input_1_float") - fin2 = subgraph.get_tensor("quantized_input_2_float") - qout = subgraph.get_tensor("quantized_output") - - assert len(subgraph.operators) == 3 - assert len(subgraph.tensors) == 5 - assert len(subgraph.inputs) == 2 - assert len(subgraph.outputs) == 1 - assert qin1 not in (subgraph.inputs + subgraph.outputs) - assert qin2 not in (subgraph.inputs + subgraph.outputs) - assert fin1 in subgraph.inputs and fin1 not in subgraph.outputs - assert fin1 in subgraph.inputs and fin2 not in subgraph.outputs - assert qout in subgraph.outputs and qout not in subgraph.inputs - - -def test_non_match(trf_pass, non_matching_model): - for input_tensor in non_matching_model.subgraphs[0].inputs: - assert not trf_pass.match(input_tensor) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_LegalizeFloatOutputPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_LegalizeFloatOutputPass.py deleted file mode 100644 index a6f40b9b8..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_LegalizeFloatOutputPass.py +++ /dev/null @@ -1,112 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_schema import ( - XCOREModel, - Subgraph, - TensorType, - OperatorCode, - BuiltinOpCodes, -) -from tflite2xcore.transformation_passes import LegalizeFloatOutputPass - -from .test_LegalizeFloatInputPass import simple_model, non_matching_model - - -@pytest.fixture() -def dual_output_model(): - subgraph = Subgraph(model=XCOREModel()) - - # TODO: add operator options to specify split axis and number - qin = subgraph.create_tensor( - "quantized_input", TensorType.INT8, [1, 5, 5, 4], isinput=True - ) - qout1 = subgraph.create_tensor( - "quantized_output_1", TensorType.INT8, [1, 5, 5, 2], isoutput=True - ) - qout2 = subgraph.create_tensor( - "quantized_output_2", TensorType.INT8, [1, 5, 5, 2], isoutput=True - ) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.SPLIT), inputs=[qin], outputs=[qout1, qout2] - ) - - return subgraph.model - - -@pytest.fixture() -def trf_pass(): - return LegalizeFloatOutputPass() - - -def test_match(simple_model, trf_pass): - assert trf_pass.match(simple_model.subgraphs[0].outputs[0]) - - -def test_mutate(simple_model, trf_pass): - subgraph = simple_model.subgraphs[0] - trf_pass.mutate(subgraph.outputs[0]) - subgraph.sanity_check() - - qin = subgraph.get_tensor("quantized_input") - qout = subgraph.get_tensor("quantized_output") - fout = subgraph.get_tensor("quantized_output_float") - - assert len(subgraph.operators) == 2 - assert len(subgraph.tensors) == 3 - assert len(subgraph.inputs) == 1 - assert len(subgraph.outputs) == 1 - assert qin in subgraph.inputs and qin not in subgraph.outputs - assert qout not in (subgraph.inputs + subgraph.outputs) - assert fout in subgraph.outputs and fout not in subgraph.inputs - - -def test_run(simple_model, trf_pass): - trf_pass.run(simple_model) - simple_model.sanity_check() - subgraph = simple_model.subgraphs[0] - - qin = subgraph.get_tensor("quantized_input") - qout = subgraph.get_tensor("quantized_output") - fout = subgraph.get_tensor("quantized_output_float") - - assert len(subgraph.operators) == 2 - assert len(subgraph.tensors) == 3 - assert len(subgraph.inputs) == 1 - assert len(subgraph.outputs) == 1 - assert qin in subgraph.inputs and qin not in subgraph.outputs - assert qout not in (subgraph.inputs + subgraph.outputs) - assert fout in subgraph.outputs and fout not in subgraph.inputs - - -def test_run_dual_output(dual_output_model, trf_pass): - trf_pass.run(dual_output_model) - dual_output_model.sanity_check() - subgraph = dual_output_model.subgraphs[0] - - qin = subgraph.get_tensor("quantized_input") - qout_1 = subgraph.get_tensor("quantized_output_1") - qout_2 = subgraph.get_tensor("quantized_output_2") - fout_1 = subgraph.get_tensor("quantized_output_1_float") - fout_2 = subgraph.get_tensor("quantized_output_2_float") - - assert len(subgraph.operators) == 3 - assert len(subgraph.tensors) == 5 - assert len(subgraph.inputs) == 1 - assert len(subgraph.outputs) == 2 - assert qin in subgraph.inputs and qin not in subgraph.outputs - assert qout_1 not in (subgraph.inputs + subgraph.outputs) - assert qout_2 not in (subgraph.inputs + subgraph.outputs) - assert fout_1 in subgraph.outputs and fout_1 not in subgraph.inputs - assert fout_2 in subgraph.outputs and fout_2 not in subgraph.inputs - - -def test_non_match(trf_pass, non_matching_model): - for output_tensor in non_matching_model.subgraphs[0].outputs: - assert not trf_pass.match(output_tensor) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_RemoveRedundantInt8RequantizationPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_RemoveRedundantInt8RequantizationPass.py deleted file mode 100644 index 6dd039653..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_quantize_dequantize_passes/test_RemoveRedundantInt8RequantizationPass.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -import itertools -from copy import deepcopy -from typing import Tuple - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import TensorType, BuiltinOpCodes -from tflite2xcore.transformation_passes import RemoveRedundantInt8RequantizationPass - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_fc, - build_abs, - _glue_quantize, -) - -from ..test_fully_connected_passes.conftest import PARAMS -from .conftest import ( - NON_INT8_TEST_TYPES, - _make_name_type_pairs, - _test_non_matching_params, - test_matching_params, - test_non_matching_tensors, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -_NON_MATCHING_TENSORS = list( - itertools.chain( - _make_name_type_pairs("output_quantized", NON_INT8_TEST_TYPES), - _make_name_type_pairs("output", NON_INT8_TEST_TYPES), - ) -) - -PARAMS["extended"].update({"non_matching_tensors": _NON_MATCHING_TENSORS}) - -PARAMS["default"].update({"non_matching_tensors": _NON_MATCHING_TENSORS[::2]}) - -PARAMS["smoke"].update({"non_matching_tensors": _NON_MATCHING_TENSORS[::4]}) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> RemoveRedundantInt8RequantizationPass: - return RemoveRedundantInt8RequantizationPass() - - -@pytest.fixture() -def model(input_shape: Tuple[int, int, int], outputs: int) -> XCOREModel: - model = build_fc(input_shape=input_shape, outputs=outputs) - _glue_quantize(model.subgraphs[0].operators[0]) - return model - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate( - model: XCOREModel, trf_pass: RemoveRedundantInt8RequantizationPass -) -> None: - subgraph = model.subgraphs[0] - qin = subgraph.get_tensor("input") - qout = subgraph.get_tensor("output_quantized") - - trf_pass.mutate(subgraph.operators[1]) - subgraph.sanity_check() - - assert len(subgraph.operators) == 1 - assert subgraph.operators[0].operator_code.code is BuiltinOpCodes.FULLY_CONNECTED - assert len(subgraph.tensors) == 3 + 1 - assert qin in subgraph.inputs - assert qin not in subgraph.outputs - assert qout in subgraph.outputs - assert qout not in subgraph.inputs - - -def test_non_matching_consumers( - trf_pass: RemoveRedundantInt8RequantizationPass, model: XCOREModel -) -> None: - _glue_quantize(model.subgraphs[0].operators[0]) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_op( - trf_pass: RemoveRedundantInt8RequantizationPass, input_shape: Tuple[int, int, int] -) -> None: - model = build_abs(input_shape=input_shape, tensor_type=TensorType.INT8) - _glue_quantize(model.subgraphs[0].operators[0]) - _test_non_matching_params(trf_pass, model) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_renaming_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_renaming_passes/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_renaming_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_renaming_passes/conftest.py deleted file mode 100644 index e377bccc9..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_renaming_passes/conftest.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from ..conftest import PARAMS, test_matching_params, _test_non_matching_params diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_renaming_passes/test_LegalizeOperatorOutputTensorNamePass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_renaming_passes/test_LegalizeOperatorOutputTensorNamePass.py deleted file mode 100644 index 48009243f..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_renaming_passes/test_LegalizeOperatorOutputTensorNamePass.py +++ /dev/null @@ -1,183 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy - -from tflite2xcore.xcore_schema import TensorType -from tflite2xcore.transformation_passes import LegalizeOperatorOutputTensorNamePass - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_relu, - build_consecutive_pads, - build_split, -) - -from .conftest import ( - PARAMS, - test_matching_params as _test_matching_params, - _test_non_matching_params, -) - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -PARAMS["default"].update({"num_splits": [2, 4]}) - -PARAMS["smoke"].update({"num_splits": [2]}) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass(): - return LegalizeOperatorOutputTensorNamePass() - - -@pytest.fixture() -def model_simple(input_shape): - return build_relu(input_shape=input_shape, tensor_type=TensorType.INT8) - - -@pytest.fixture() -def model_multi_op(input_shape): - paddings = [[0] * 2] * 4 - return build_consecutive_pads( - input_shape=[1, *input_shape], paddings_1=paddings, paddings_2=paddings - ) - - -@pytest.fixture() -def model_multi_out(input_shape, num_splits): - return build_split( - input_shape=input_shape, - num_splits=num_splits, - tensor_type=TensorType.INT8, - axis=2, - ) - - -@pytest.fixture() -def model_multi_out_partial(input_shape, num_splits): - model = build_split( - input_shape=input_shape, - num_splits=num_splits, - tensor_type=TensorType.INT8, - axis=2, - ) - op = model.subgraphs[0].operators[0] - for j, tensor in enumerate(op.outputs[1:]): - tensor.name = f"{op.name}/output_{j+1}" - return model - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_matching_simple(trf_pass, model_simple): - _test_matching_params(trf_pass, model_simple) - - -def test_matching_multi_op(trf_pass, model_multi_op): - operators = model_multi_op.subgraphs[0].operators - assert trf_pass.match(operators[0]) - assert trf_pass.match(operators[1]) - - -def test_matching_multi_out(trf_pass, model_multi_out): - _test_matching_params(trf_pass, model_multi_out) - - -def test_matching_multi_out_partial(trf_pass, model_multi_out_partial): - _test_matching_params(trf_pass, model_multi_out_partial) - - -def test_non_matching_simple(trf_pass, model_simple): - subgraph = model_simple.subgraphs[0] - op = subgraph.operators[0] - t_out = op.outputs[0] - t_out.name = f"{op.name}/output" - _test_non_matching_params(trf_pass, model_simple) - - -def test_non_matching_multi_op(trf_pass, model_multi_op): - subgraph = model_multi_op.subgraphs[0] - for op in subgraph.operators: - assert len(op.outputs) == 1 - t_out = op.outputs[0] - t_out.name = f"{op.name}/output" - - for j, op in enumerate(subgraph.operators): - assert not trf_pass.match(op), f"op {j} should not be matched" - - -def test_non_matching_multi_out(trf_pass, model_multi_out): - subgraph = model_multi_out.subgraphs[0] - op = subgraph.operators[0] - for j, tensor in enumerate(op.outputs): - tensor.name = f"{op.name}/output_{j}" - - _test_non_matching_params(trf_pass, model_multi_out) - - -def test_mutate_simple(trf_pass, model_simple): - # run mutating pass - trf_pass.run(model_simple) - model_simple.sanity_check() - - op = model_simple.subgraphs[0].operators[-1] - assert op.outputs[0].name == f"{op.name}/output" - - -def test_mutate_multi_op(trf_pass, model_multi_op): - # run mutating pass - trf_pass.run(model_multi_op) - model_multi_op.sanity_check() - - for j, op in enumerate(model_multi_op.subgraphs[0].operators): - expected_name = f"{op.name}/output" - name = op.outputs[0].name - assert ( - name == expected_name - ), f"op {j} name: expected '{expected_name}', found '{name}'" - - -def test_mutate_multi_out(trf_pass, model_multi_out): - # run mutating pass - trf_pass.run(model_multi_out) - model_multi_out.sanity_check() - - op = model_multi_out.subgraphs[0].operators[-1] - for j, tensor in enumerate(op.outputs): - expected_name = f"{op.name}/output_{j}" - name = tensor.name - assert ( - name == expected_name - ), f"tensor {j} name: expected '{expected_name}', found '{name}'" - - -def test_mutate_multi_out_partial(trf_pass, model_multi_out_partial): - # run mutating pass - trf_pass.run(model_multi_out_partial) - model_multi_out_partial.sanity_check() - - op = model_multi_out_partial.subgraphs[0].operators[-1] - for j, tensor in enumerate(op.outputs): - expected_name = f"{op.name}/output_{j}" - name = tensor.name - assert ( - name == expected_name - ), f"tensor {j} name: expected '{expected_name}', found '{name}'" - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_reshape_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_reshape_passes/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_reshape_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_reshape_passes/conftest.py deleted file mode 100644 index 9d10ecea3..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_reshape_passes/conftest.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np -from copy import deepcopy -from itertools import product, chain -from typing import Tuple, NamedTuple, Callable - -from ..conftest import ( - ParamsType, - PARAMS, - _test_non_matching_params, - test_matching_params, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -PARAMS["extended"].update( - { - "input_batch": [1, 2], - "input_channels": [4, 8, 16], - "outputs": [2, 10], - } -) - -PARAMS["default"].update( - { - "input_batch": [1, 2], - "input_channels": [4, 32], - "outputs": [2, 10], - } -) - -PARAMS["smoke"].update( - { - "input_batch": [1], - "input_channels": [4, 32], - "outputs": [10], - } -) - - -# ---------------------------------------------------------------------------- -# HELPERS -# ---------------------------------------------------------------------------- - - -class ReshapeTuple(NamedTuple): - input: Tuple[int, ...] - output: Tuple[int, ...] - - -def update_params_with_reshape( - PARAMS: ParamsType, *, is_matching: Callable[[ReshapeTuple], bool] -) -> ParamsType: - for params in PARAMS.values(): - - def get_product_shape(*, dim=4, order="NHWC"): - if dim == 4: - if order == "NHWC": - return product( - params["input_batch"], - params["input_height"], - params["input_width"], - params["input_channels"], - ) - else: - return product( - params["input_batch"], - params["input_channels"], - params["input_height"], - params["input_width"], - ) - else: - return ( - (*p[: dim - 1], np.prod(p[dim - 1 :])) - for p in get_product_shape(dim=dim + 1, order=order) - ) - - all_reshapes = ( - ReshapeTuple(*p) - for p in chain( - product( - get_product_shape(dim=4), get_product_shape(dim=4, order="NCHW") - ), - product(get_product_shape(dim=4), get_product_shape(dim=3)), - product(get_product_shape(dim=3), get_product_shape(dim=2)), - ) - ) - - matching_reshape = params["reshape"] = [] - non_matching_reshape = params["non_matching_reshape"] = [] - for reshape in all_reshapes: - # this is a bit wasteful - if np.prod(reshape.input) == np.prod(reshape.output): - if is_matching(reshape): - matching_reshape.append(reshape) - else: - non_matching_reshape.append(reshape) - - return PARAMS diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_reshape_passes/test_CanonializeReshapePass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_reshape_passes/test_CanonializeReshapePass.py deleted file mode 100644 index 49beb7555..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_reshape_passes/test_CanonializeReshapePass.py +++ /dev/null @@ -1,93 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.converter import CleanupManager -from tflite2xcore.transformation_passes.reshape_passes import CanonicalizeReshapePass - -from ..model_builders import build_reshape -from .conftest import ( - ReshapeTuple, - PARAMS, - _test_non_matching_params, - test_matching_params, - update_params_with_reshape, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = update_params_with_reshape(deepcopy(PARAMS), is_matching=lambda _: True) - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> CanonicalizeReshapePass: - return CanonicalizeReshapePass() - - -@pytest.fixture() -def model(reshape: ReshapeTuple) -> XCOREModel: - return build_reshape(input_shape=reshape.input, output_shape=reshape.output) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate(trf_pass: CanonicalizeReshapePass, model: XCOREModel) -> None: - - subgraph = model.subgraphs[0] - assert len(subgraph.operators) == 1 - - in_ori, out_ori = subgraph.inputs[0], subgraph.outputs[0] - - assert (len(subgraph.operators[0].inputs)) == 2 - - # run mutating pass - trf_pass.run(model) - model.sanity_check() - - # need to clean up dangling ops/tensors - CleanupManager(model).run_passes() - model.sanity_check() - - assert len(subgraph.operators) == 1 - op = subgraph.operators[0] - assert len(op.inputs) == 1 - assert len(op.outputs) == 1 - - # check input/output tensors - assert len(subgraph.inputs) == 1 - assert len(subgraph.outputs) == 1 - - assert in_ori is op.inputs[0] - assert in_ori in subgraph.inputs - - assert out_ori is op.outputs[0] - assert out_ori in subgraph.outputs - - -def test_non_matching_no_shape_tensor( - trf_pass: CanonicalizeReshapePass, reshape: ReshapeTuple -) -> None: - model = build_reshape( - input_shape=reshape.input, - output_shape=reshape.output, - input_shape_tensor=False, - ) - _test_non_matching_params(trf_pass, model) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_reshape_passes/test_RemovePrecedingReshapePass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_reshape_passes/test_RemovePrecedingReshapePass.py deleted file mode 100644 index 782c8206f..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_reshape_passes/test_RemovePrecedingReshapePass.py +++ /dev/null @@ -1,109 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest -from copy import deepcopy - -from tflite2xcore.transformation_passes import ModelTransformationPass -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.converter import CleanupManager -from tflite2xcore.transformation_passes.reshape_passes import RemovePrecedingReshapePass -from tflite2xcore.xcore_schema import BuiltinOpCodes - -from ..model_builders import build_fc_with_preceding_reshape, build_reshape -from .conftest import ( - PARAMS, - ReshapeTuple, - _test_non_matching_params, - test_matching_params, - update_params_with_reshape, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - - -def is_matching_reshape(reshape: ReshapeTuple) -> bool: - # Check batch dim is unchanged - return reshape.input[0] == reshape.output[0] - - -PARAMS = update_params_with_reshape(deepcopy(PARAMS), is_matching=is_matching_reshape) - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> RemovePrecedingReshapePass: - return RemovePrecedingReshapePass() - - -@pytest.fixture() -def model(outputs: int, reshape: ReshapeTuple) -> XCOREModel: - return build_fc_with_preceding_reshape( - input_shape=reshape.input, - fc_outputs=outputs, - reshaped_input_shape=reshape.output, - ) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate(trf_pass: ModelTransformationPass, model: XCOREModel) -> None: - subgraph = model.subgraphs[0] - assert len(subgraph.operators) == 2 - - in_ori, out_ori = subgraph.inputs[0], subgraph.outputs[0] - - # run mutating pass - trf_pass.run(model) - model.sanity_check() - - # need to clean up dangling ops/tensors - CleanupManager(model).run_passes() - model.sanity_check() - - # Check FC operator and that RESHAPE has been removed - assert len(subgraph.operators) == 1 - op = subgraph.operators[0] - assert len(op.inputs) == 3 - assert len(op.outputs) == 1 - assert op.operator_code.code is BuiltinOpCodes.FULLY_CONNECTED - - # check input/output tensors - assert len(subgraph.inputs) == 1 - assert len(subgraph.outputs) == 1 - - assert in_ori is op.inputs[0] - assert in_ori in subgraph.inputs - assert out_ori is op.outputs[0] - assert out_ori in subgraph.outputs - - -def test_non_matching_reshape_only( - trf_pass: ModelTransformationPass, reshape: ReshapeTuple -) -> None: - model = build_reshape(input_shape=reshape.input, output_shape=reshape.output) - _test_non_matching_params(trf_pass, model) - - -def test_non_matching_simple( - trf_pass: ModelTransformationPass, outputs: int, non_matching_reshape: ReshapeTuple -) -> None: - model = build_fc_with_preceding_reshape( - input_shape=non_matching_reshape.input, - fc_outputs=outputs, - reshaped_input_shape=non_matching_reshape.output, - ) - _test_non_matching_params(trf_pass, model) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_reshape_passes/test_RemoveSubsequentReshapePass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_reshape_passes/test_RemoveSubsequentReshapePass.py deleted file mode 100644 index bb8a453a4..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_reshape_passes/test_RemoveSubsequentReshapePass.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes.reshape_passes import ( - RemoveSubsequentReshapePass, -) - -from ..model_builders import build_fc_with_subsequent_reshape -from .conftest import test_matching_params as _test_matching_params -from .test_RemovePrecedingReshapePass import ( - PARAMS, - ReshapeTuple, - test_non_matching_reshape_only, - # test_non_matching_simple, # TODO: fix this - test_mutate, -) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> RemoveSubsequentReshapePass: - return RemoveSubsequentReshapePass() - - -@pytest.fixture() -def model(outputs: int, reshape: ReshapeTuple) -> XCOREModel: - return build_fc_with_subsequent_reshape( - fc_output_shape=reshape.input, reshaped_output_shape=reshape.output - ) - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_matching_params( - trf_pass: RemoveSubsequentReshapePass, model: XCOREModel -) -> None: - _test_matching_params(trf_pass, model, op_idx=0) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/conftest.py deleted file mode 100644 index ae52377f9..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/conftest.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from tflite2xcore.transformation_passes import ModelTransformationPass -from tflite2xcore.xcore_model import XCOREModel - -from ..conftest import PARAMS, test_matching_params, _test_non_matching_params - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_mutate(trf_pass: ModelTransformationPass, model: XCOREModel) -> None: - op = model.subgraphs[0].operators[0] - assert "mem" not in op.custom_options - - trf_pass.run(model) - model.sanity_check() - - _test_non_matching_params(trf_pass, model) - assert "mem" in op.custom_options diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/test_ScratchMemoryConv2d1x1Pass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/test_ScratchMemoryConv2d1x1Pass.py deleted file mode 100644 index 673955fb5..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/test_ScratchMemoryConv2d1x1Pass.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from typing import Tuple - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import ( - ModelTransformationPass, - ScratchMemoryConv2d1x1Pass, -) - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_XC_conv2d_1x1, -) - -from ..test_conv2d_passes.test_Replace1x1Conv2dPass import PARAMS -from ..test_conv2d_passes.conftest import weight_shape -from .conftest import test_matching_params, test_mutate - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> ModelTransformationPass: - return ScratchMemoryConv2d1x1Pass() - - -@pytest.fixture() -def model( - weight_shape: Tuple[int, int, int, int], - input_size: Tuple[int, int], - strides: Tuple[int, int], -) -> XCOREModel: - return build_XC_conv2d_1x1( - weight_shape=weight_shape, input_size=input_size, strides=strides - ) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/test_ScratchMemoryConv2dPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/test_ScratchMemoryConv2dPass.py deleted file mode 100644 index 9cf4023e8..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/test_ScratchMemoryConv2dPass.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from copy import deepcopy -from typing import Tuple, Callable - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import ( - ModelTransformationPass, - ScratchMemoryConv2dPass, -) - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_XC_conv2d_deep, - build_XC_conv2d_shallowin, -) - -from ..test_conv2d_passes.conftest import PARAMS, weight_shape -from .conftest import test_matching_params, test_mutate - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(PARAMS) - -for k in PARAMS: - PARAMS[k].update( - {"model_builder": [build_XC_conv2d_deep, build_XC_conv2d_shallowin]} - ) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> ModelTransformationPass: - return ScratchMemoryConv2dPass() - - -@pytest.fixture() -def model( - model_builder: Callable[..., XCOREModel], - weight_shape: Tuple[int, int, int, int], - input_size: Tuple[int, int], - strides: Tuple[int, int], -) -> XCOREModel: - return model_builder( - weight_shape=weight_shape, input_size=input_size, strides=strides - ) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/test_ScratchMemoryDepthwiseConv2dPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/test_ScratchMemoryDepthwiseConv2dPass.py deleted file mode 100644 index a95055fcd..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/test_ScratchMemoryDepthwiseConv2dPass.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from typing import Tuple - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import ( - ModelTransformationPass, - ScratchMemoryDepthwiseConv2dPass, -) - -from tflite2xcore.tests.test_transformation_passes.model_builders import ( - build_XC_conv2d_depthwise, -) - -from ..test_conv2d_passes.test_ReplaceDepthwiseConv2dPass import PARAMS, weight_shape -from .conftest import test_matching_params, test_mutate - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> ModelTransformationPass: - return ScratchMemoryDepthwiseConv2dPass() - - -@pytest.fixture() -def model( - weight_shape: Tuple[int, int, int, int], - input_size: Tuple[int, int], - strides: Tuple[int, int], -) -> XCOREModel: - return build_XC_conv2d_depthwise( - weight_shape=weight_shape, input_size=input_size, strides=strides - ) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/test_ScratchMemoryFullyConnectedPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/test_ScratchMemoryFullyConnectedPass.py deleted file mode 100644 index e0c3a76d3..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_scratch_memory_passes/test_ScratchMemoryFullyConnectedPass.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.transformation_passes import ( - ModelTransformationPass, - ScratchMemoryFullyConnectedPass, -) - -from tflite2xcore.tests.test_transformation_passes.model_builders import build_XC_fc - -from ..test_fully_connected_passes.conftest import PARAMS -from .conftest import test_matching_params, test_mutate - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> ModelTransformationPass: - return ScratchMemoryFullyConnectedPass() - - -@pytest.fixture() -def model(outputs: int, input_channels: int) -> XCOREModel: - return build_XC_fc(outputs=outputs, input_channels=input_channels) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_warning_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_warning_passes/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_warning_passes/test_FloatingPointWarningPass.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_warning_passes/test_FloatingPointWarningPass.py deleted file mode 100644 index 03ff50264..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_warning_passes/test_FloatingPointWarningPass.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -from tflite2xcore.transformation_passes import FloatingPointWarningPass -from tflite2xcore.xcore_schema import XCOREModel, Subgraph, TensorType - -_TENSOR_SHAPE = (1, 1, 1, 1) - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = { - "default": { - "tensor_type": [TensorType.FLOAT32, TensorType.FLOAT16, TensorType.FLOAT64], - "non_matching_tensor_type": [ - TensorType.INT8, - TensorType.INT16, - TensorType.INT32, - TensorType.UINT8, - ], - } -} - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass() -> FloatingPointWarningPass: - return FloatingPointWarningPass() - - -@pytest.fixture() -def model(tensor_type: TensorType) -> XCOREModel: - subgraph = Subgraph(model=XCOREModel()) - subgraph.create_tensor("test_tensor", tensor_type, _TENSOR_SHAPE) - return subgraph.model - - -# ---------------------------------------------------------------------------- -# TESTS -# ---------------------------------------------------------------------------- - - -def test_matching_params(trf_pass: FloatingPointWarningPass, model: XCOREModel) -> None: - assert trf_pass.match(model.subgraphs[0].tensors[0]) - - -def test_non_matching_tensor_type( - trf_pass: FloatingPointWarningPass, non_matching_tensor_type: TensorType -) -> None: - subgraph = Subgraph(model=XCOREModel()) - test_tensor = subgraph.create_tensor( - "test_tensor", non_matching_tensor_type, _TENSOR_SHAPE - ) - assert not trf_pass.match(test_tensor) - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_word_alignment_passes/__init__.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_word_alignment_passes/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_word_alignment_passes/conftest.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_word_alignment_passes/conftest.py deleted file mode 100644 index 89d151a4f..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_word_alignment_passes/conftest.py +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from ..conftest import ( - PARAMS, - _test_non_matching_params, - test_matching_params, -) diff --git a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_word_alignment_passes/test_CanonicalizeConv2DInputChannels.py b/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_word_alignment_passes/test_CanonicalizeConv2DInputChannels.py deleted file mode 100644 index f1c2a2b70..000000000 --- a/tflite2xcore/tflite2xcore/tests/test_transformation_passes/test_word_alignment_passes/test_CanonicalizeConv2DInputChannels.py +++ /dev/null @@ -1,139 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pytest - -import numpy as np - -from copy import deepcopy - -from tflite2xcore.transformation_passes import CanonicalizeConv2DInputChannels -from tflite2xcore.xcore_schema import BuiltinOpCodes - -from tflite2xcore.tests.test_transformation_passes.model_builders import build_conv2d -from tflite2xcore.tests.test_transformation_passes.test_conv2d_passes.conftest import ( - PARAMS as CONV_PARAMS, - test_non_matching_input_channels, -) -from .conftest import ( - _test_non_matching_params, - test_matching_params, -) - - -# ---------------------------------------------------------------------------- -# PARAMETER VALUES -# ---------------------------------------------------------------------------- - -PARAMS = deepcopy(CONV_PARAMS) - -for k in PARAMS: - PARAMS[k]["input_channels"] = deepcopy( - CONV_PARAMS[k]["non_matching_input_channels"] - ) - PARAMS[k]["non_matching_input_channels"] = deepcopy( - CONV_PARAMS[k]["input_channels"] - ) - PARAMS[k]["output_channels"] = deepcopy( - CONV_PARAMS["smoke"]["output_channels"] - + CONV_PARAMS["smoke"]["non_matching_output_channels"] - ) - - -# ---------------------------------------------------------------------------- -# FIXTURES -# ---------------------------------------------------------------------------- - - -@pytest.fixture() -def trf_pass(): - return CanonicalizeConv2DInputChannels() - - -@pytest.fixture() -def build_model(): - return build_conv2d - - -@pytest.fixture() -def weight_shape(output_channels, kernel_height, kernel_width, input_channels): - return [output_channels, kernel_height, kernel_width, input_channels] - - -@pytest.fixture() -def model(weight_shape, input_size, padding, strides): - model = build_conv2d( - weight_shape=weight_shape, - input_size=input_size, - padding=padding, - strides=strides, - ) - return model - - -# ---------------------------------------------------------------------------- -# TEST FUNCTIONS -# ---------------------------------------------------------------------------- - - -def test_mutate(trf_pass, model): - subgraph = model.subgraphs[0] - assert len(subgraph.operators) == 1 - old_conv_op = subgraph.operators[0] - old_weight_shape = old_conv_op.inputs[1].shape - old_weights = old_conv_op.inputs[1].as_array() - assert old_weights.dtype is np.dtype(np.int8) - - # run padding pass - trf_pass.run(model) - model.sanity_check() - assert len(subgraph.operators) == 2 - - # test pad operator - pad_op = subgraph.operators[0] - assert pad_op.operator_code.code is BuiltinOpCodes.PAD - assert len(pad_op.inputs) == 2 - assert len(pad_op.outputs) == 1 - assert pad_op.inputs[0] in subgraph.inputs - - # test conv operator - conv_op = subgraph.operators[1] - assert conv_op.operator_code.code is BuiltinOpCodes.CONV_2D - assert len(conv_op.inputs) == 3 - assert len(conv_op.outputs) == 1 - assert conv_op.outputs[0] in subgraph.outputs - assert conv_op.inputs[0] is pad_op.outputs[0] - - # get channel counts - input_channels = pad_op.inputs[0].shape[3] - padded_channels = conv_op.inputs[0].shape[3] - pad_size = padded_channels - input_channels - - # test weight tensor shape - new_weight_shape = conv_op.inputs[1].shape - assert old_weight_shape[:3] == new_weight_shape[:3] - assert new_weight_shape[3] == padded_channels - new_weights = conv_op.inputs[1].as_array() - assert old_weights.dtype is np.dtype(np.int8) - assert np.all(new_weights[..., :input_channels] == old_weights) - assert np.all( - new_weights[..., input_channels:] - == np.zeros([*old_weight_shape[:3], pad_size], dtype=np.int8) - ) - - # test paddings tensor - paddings = pad_op.inputs[1] - pads_arr = paddings.as_array() - assert pads_arr.shape == paddings.shape == (4, 2) - assert pads_arr[0][0] == [0] - assert pads_arr[0][1] == [0] - assert pads_arr[1][0] == [0] - assert pads_arr[1][1] == [0] - assert pads_arr[2][0] == [0] - assert pads_arr[2][1] == [0] - assert pads_arr[3][0] == [0] - assert pads_arr[3][1] == [pad_size] - - -if __name__ == "__main__": - pytest.main() diff --git a/tflite2xcore/tflite2xcore/tflite_visualize.py b/tflite2xcore/tflite2xcore/tflite_visualize.py deleted file mode 100755 index 53dff4414..000000000 --- a/tflite2xcore/tflite2xcore/tflite_visualize.py +++ /dev/null @@ -1,824 +0,0 @@ -#!/usr/bin/env python -# Copyright 2017 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -import json -import os -import enum -import webbrowser -import tempfile -from pathlib import Path -from collections import Counter -from typing import Optional, Union - -from tflite2xcore.xcore_schema.flexbuffers import FlexbufferParser -from tflite2xcore.xcore_model import XCOREModel -from tflite2xcore.xcore_schema import XCOREOpCodes -from tflite2xcore.utils import VerbosityParser - -# A CSS description for making the visualizer -_CSS = """ - - - -""" -# TODO: reference d3.js script locally - -_D3_HTML_TEMPLATE = """ -""" - - -class OpCodeMapper: - """Maps an opcode index to a text representation.""" - - def __init__(self, data): - self.opcode_idx_to_name = [ - d["custom_code"] if d["builtin_code"] == "CUSTOM" else d["builtin_code"] - for d in data["operator_codes"] - ] - - self.color = [] - for d in data["operator_codes"]: - if d["builtin_code"] == "CUSTOM": - try: - XCOREOpCodes(d["custom_code"]) - color = "#00a000" # xcore optimized custom opcode - except ValueError: - color = "#a00000" # unknown custom opcode - else: - color = "#0000a0" - self.color.append(color) - - def __call__(self, opcode_idx, op_idx=None): - s = ( - self.opcode_idx_to_name[opcode_idx] - if opcode_idx < len(self.opcode_idx_to_name) - else "UNKNOWN" - ) - return f"{s} [{opcode_idx}]" if op_idx is None else f"({op_idx}) {s}" - - -class OpCodeTooltipMapper: - """Maps a list of opcode indices to a tooltip hoverable indicator of more.""" - - def __init__(self, model_dict, subgraph): - self.operators = subgraph["operators"] - self.opcode_mapper = OpCodeMapper(model_dict) - - def __call__(self, idx_list): - html = "" - for idx in idx_list: - html += self.opcode_mapper(self.operators[idx]["opcode_index"], idx) - html += "
" - html += f"
{idx_list}
" - return html - - -class DataSizeMapper: - """For buffers, report the number of bytes.""" - - @classmethod - def _format_bytes(cls, n): - return f"{n:,d} bytes" - - def __call__(self, x): - return "--" if x is None else self._format_bytes(len(x)) - - -class BufferOwnerMapper: - """For buffers, report the owners with tooltips.""" - - def __init__(self, model_dict): - self.subgraphs = model_dict["subgraphs"] - - def __call__(self, d): - if not isinstance(d, dict): - return "N/A" - - html_list = [] - for k, owners in d.items(): - subgraph = self.subgraphs[k] - tensor_mapper = TensorTooltipMapper(subgraph) - html_list.append(f"{k}: {tensor_mapper(owners)}") - - return ", ".join(html_list) if html_list else "--" - - -class TensorMapper: - """Maps a tensor index to a text representation.""" - - def __init__(self, subgraph, node_text=False): - self.tensors = subgraph["tensors"] - self.node_text = node_text - - def __call__(self, idx): - tensor = self.tensors[idx] - if self.node_text: - return ( - f"{tensor['name']}" - + "\n" - + f"({idx:d}) <{tensor['type']}> {tensor['shape']}" - ) - else: - return f"({idx:d}) {tensor['name']} <{tensor['type']}> {tensor['shape']}
" - - -class TensorTooltipMapper: - """Maps a list of tensor indices to a tooltip hoverable indicator of more.""" - - def __init__(self, subgraph): - self.tensor_mapper = TensorMapper(subgraph) - - def __call__(self, idx_list): - html = "" - for idx in idx_list: - html += self.tensor_mapper(idx) - html += f"{idx_list}" - return html - - -class DictMapper: - def __call__(self, d): - if d: - return { - k: (v.name if isinstance(v, enum.Enum) else v) for k, v in d.items() - } - else: - return d - - -class CustomOptionsMapper: - """Maps a list of bytes representing a flexbuffer to a dictionary.""" - - def __call__(self, custom_options): - return ( - FlexbufferParser().parse(bytes(custom_options)) if custom_options else None - ) - - -def GenerateGraph(subgraph_idx, g, opcode_mapper): - """Produces the HTML required to have a d3 visualization of the dag.""" - - def TensorID(idx): - return f"t{idx:d}" - - def OperatorID(idx): - return f"o{idx:d}" - - def NodeWidth(node_text): - return int(max(len(line) * 12 / 16 * 10 + 5 for line in node_text.split("\n"))) - - def NodeHeight(node_text): - return node_text.count("\n") * 15 + 25 - - edges, nodes = [], [] - tensor_nodes_info, op_nodes_info = [], [] - first, second = {}, {} - pixel_mult = 200 # TODO(aselle): multiplier for initial placement - width_mult = 170 # TODO(aselle): multiplier for initial placement - - tensor_mapper = TensorMapper(g, node_text=True) - - for tensor_index, tensor in enumerate(g["tensors"]): - t_node_text = f"({tensor_index:d}) {tensor['name']} {tensor['shape']}" - t_node_text = tensor_mapper(tensor_index) - tensor_nodes_info.append( - { - "text": t_node_text, - "width": NodeWidth(t_node_text), - "height": NodeHeight(t_node_text), - "color": "#fffacd", # default tensor color, should be only for parameters - } - ) - - for op_idx, op in enumerate(g["operators"]): - o_node_text = opcode_mapper(op["opcode_index"], op_idx) - op_nodes_info.append( - { - "text": o_node_text, - "width": NodeWidth(o_node_text), - "height": NodeHeight(o_node_text), - "color": opcode_mapper.color[op["opcode_index"]], - } - ) - - # coloring intermediate tensors - for tensor_index in op["outputs"]: - tensor_nodes_info[tensor_index]["color"] = "#dddddd" - - # coloring input/output tensors - for tensor_index in range(len(g["tensors"])): - if tensor_index in g["inputs"]: - tensor_nodes_info[tensor_index]["color"] = "#ccccff" - elif tensor_index in g["outputs"]: - tensor_nodes_info[tensor_index]["color"] = "#ffcccc" - - for op_index, op in enumerate(g["operators"]): - x = width_mult - for tensor_index in op["inputs"]: - if tensor_index not in first: - first[tensor_index] = ((op_index - 0.5 + 1) * pixel_mult, x) - x += tensor_nodes_info[tensor_index]["width"] + 10 # offset - edges.append( - {"source": TensorID(tensor_index), "target": OperatorID(op_index)} - ) - - x = width_mult - for tensor_index in op["outputs"]: - if tensor_index not in second: - second[tensor_index] = ((op_index + 0.5 + 1) * pixel_mult, x) - x += tensor_nodes_info[tensor_index]["width"] + 10 # offset - edges.append( - {"target": TensorID(tensor_index), "source": OperatorID(op_index)} - ) - - nodes.append( - { - "id": OperatorID(op_index), - "name": op_nodes_info[op_index]["text"], - "text_color": "#eeeeee", - "fill_color": op_nodes_info[op_index]["color"], - "edge_radius": 10, - "x": pixel_mult, - "y": (op_index + 1) * pixel_mult, - "node_width": op_nodes_info[op_index]["width"], - "node_height": op_nodes_info[op_index]["height"], - } - ) - - for tensor_index, tensor in enumerate(g["tensors"]): - initial_y = ( - first[tensor_index] - if tensor_index in first - else second[tensor_index] - if tensor_index in second - else (0, 0) - ) - - nodes.append( - { - "id": TensorID(tensor_index), - "name": tensor_nodes_info[tensor_index]["text"], - "text_color": "#000000", - "fill_color": tensor_nodes_info[tensor_index]["color"], - "edge_radius": 1, - "x": initial_y[1], - "y": initial_y[0], - "node_width": tensor_nodes_info[tensor_index]["width"], - "node_height": tensor_nodes_info[tensor_index]["height"], - } - ) - - graph_str = json.dumps({"nodes": nodes, "edges": edges}, indent=2) - html = _D3_HTML_TEMPLATE % (graph_str, subgraph_idx) - return html - - -def GenerateTableHtml(items, keys_to_print, display_index=True): - """Given a list of object values and keys to print, make an HTML table. - - Args: - items: Items to print an array of dicts. - keys_to_print: (key, display_fn). `key` is a key in the object. i.e. - items[0][key] should exist. display_fn is the mapping function on display. - i.e. the displayed html cell will have the string returned by - `mapping_fn(items[0][key])`. - display_index: add a column which is the index of each row in `items`. - Returns: - An html table. - """ - indent = " " * 2 - - # Print the list of items - html = "" - html += "\n" - if display_index: - html += f"{indent}\n" - for h, mapper in keys_to_print: - html += f"{indent}\n" - html += "" - - # print rows - for idx, tensor in enumerate(items): - html += "\n" - if display_index: - html += f"{indent}\n" - # print tensor.keys() - for h, mapper in keys_to_print: - val = tensor[h] if h in tensor else None - val = val if mapper is None else mapper(val) - html += f"{indent}\n" - - html += "" - html += "
index{h}
{idx}{val}
\n\n" - return html - - -def dict_to_html(data): - """Given a tflite model as a dictionary, produce html description.""" - - indent = " " * 2 - - html = "\n" - html += _CSS - html += "\n\n" - html += "

TensorFlow Lite Model

\n" - - toplevel_stuff = [ - ("filename", None), - ("filesize", DataSizeMapper()._format_bytes), - ("version", None), - ("description", None), - ] - - html += "" - for key, mapping in toplevel_stuff: - html += "\n" - html += f"{indent}\n" - val = data.get(key) if mapping is None else mapping(data.get(key)) - html += f"{indent}\n" - html += "" - html += "
{key}{val}
\n" - - for subgraph_idx, g in enumerate(data["subgraphs"]): - # Subgraph local specs on what to display - html += "\n
" - tensor_mapper = TensorTooltipMapper(g) - opcode_mapper = OpCodeMapper(data) - opcode_tooltip_mapper = OpCodeTooltipMapper(data, g) - custom_options_mapper = CustomOptionsMapper() - op_keys_to_display = [ - ("inputs", tensor_mapper), - ("outputs", tensor_mapper), - ("opcode_index", opcode_mapper), - ("builtin_options", DictMapper()), - ("custom_options", custom_options_mapper), - ] - tensor_keys_to_display = [ - ("name", None), - ("consumers", opcode_tooltip_mapper), - ("producers", opcode_tooltip_mapper), - ("type", None), - ("shape", None), - ("buffer", None), - ("quantization", DictMapper()), - ] - - html += "

Subgraph %d

\n" % subgraph_idx - - # Inputs and outputs. - html += "

Inputs/Outputs

\n" - html += GenerateTableHtml( - [{"inputs": g["inputs"], "outputs": g["outputs"]}], - [("inputs", tensor_mapper), ("outputs", tensor_mapper)], - display_index=False, - ) - - # Print the tensors. - html += "

Tensors

\n" - html += GenerateTableHtml(g["tensors"], tensor_keys_to_display) - - # Print the ops. - html += "

Ops

\n" - html += GenerateTableHtml(g["operators"], op_keys_to_display) - - # Visual graph. - html += "\n" % ( - subgraph_idx, - ) - html += GenerateGraph(subgraph_idx, g, opcode_mapper) - html += "
\n\n" - - # Buffers - size_mapper = DataSizeMapper() - buffer_keys_to_display = [ - ("data", size_mapper), - ("owners", BufferOwnerMapper(data)), - ] - total_bytes = sum(len(d["data"]) for d in data["buffers"]) - html += ( - "

Buffers " - f"(total: {size_mapper._format_bytes(total_bytes)}, " - f"{total_bytes/data['filesize']:.2%} of filesize)" - "

\n" - ) - html += GenerateTableHtml(data["buffers"], buffer_keys_to_display) - - # Operator codes - operator_keys_to_display = [ - ("builtin_code", None), - ("custom_code", None), - ("version", None), - ("count", None), - ] - op_cnt = sorted( - Counter( - op["opcode_index"] - for subgraph in data["subgraphs"] - for op in subgraph["operators"] - ).items() - ) - for d, p in zip(data["operator_codes"], op_cnt): - d["count"] = p[1] - html += "

Operator Codes

\n" - html += GenerateTableHtml(data["operator_codes"], operator_keys_to_display) - - html += "\n\n" - - return html - - -def model_to_html(model, filename=None): - if isinstance(model, (bytes, bytearray)): - model = XCOREModel.deserialize(model) - elif not isinstance(model, XCOREModel): - raise TypeError("model musy be XCOREModel or serialized flatbuffer model") - - try: - data = model.to_dict(extended=True) - except AttributeError as e: - if e.args[0] == "'Buffer' object has no attribute 'owners'": - data = model.to_dict(extended=False) - else: - raise - - if filename: - data["filename"] = filename - data["filesize"] = os.stat(filename).st_size - else: - data["filename"] = data["filesize"] = "--" - - return dict_to_html(data) - - -def main( - tflite_input: Union[str, Path], - html_output: Optional[Union[str, Path]] = None, - *, - open_browser: bool = False, -) -> None: - if html_output: # TODO: do this with a context manager - html_path = html_output - else: - html_file = tempfile.NamedTemporaryFile(delete=False) - html_path = html_file.name - - if not os.path.exists(tflite_input): - raise RuntimeError(f"Invalid filename {tflite_input}") - - html = model_to_html(XCOREModel.read_flatbuffer(tflite_input), tflite_input) - with open(html_path, "w") as f: - f.write(html) - - if open_browser: - webbrowser.open_new_tab("file://" + os.path.realpath(html_path)) - - if not html_output: - html_file.close() - - -if __name__ == "__main__": - parser = VerbosityParser( - verbosity_config=dict(action="store_true", default=False, help="Verbose mode.") - ) - parser.add_argument("tflite_input", help="Input .tflite file.") - parser.add_argument( - "-o", - "--html_output", - required=False, - default=None, - help="Output .html file. If not specified, a temporary file is created.", - ) - parser.add_argument( - "-b", - "--browser", - action="store_true", - help="Open browser after the .html is created.", - ) - args = parser.parse_args() - tflite_input, html_output = args.tflite_input, args.html_output - - main(tflite_input, html_output, open_browser=args.browser) diff --git a/tflite2xcore/tflite2xcore/transformation_passes/__init__.py b/tflite2xcore/tflite2xcore/transformation_passes/__init__.py deleted file mode 100644 index 9f76df6f9..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/__init__.py +++ /dev/null @@ -1,119 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from .transformation_passes import ModelTransformationPass, CanonicalizeEmptyBuffersPass - -from .lut_passes import ( - ReplaceTanhPass, - ReplaceLogisticPass, - ReplaceReLUPass, - ReplaceReLU6Pass, - LegalizeXCLookupTablePass, -) -from .conv2d_passes import ( - CanonicalizeSinglePixelConv2DPass, - CanonicalizeSingleinDepthwiseConv2DPass, - LegalizeSingleinConv2DPass, - Replace1x1Conv2dPass, - LegalizeXC1x1ConvPass, - ReplaceDepthwiseConv2dPass, - LegalizeXCDepthwiseConvPass, - ReplaceDeepConv2dPass, - LegalizeXCDeepConvPass, - ReplaceShallowinConv2dPass, - LegalizeXCShallowinConvPass, -) - -from .fully_connected_passes import ( - ReplaceFullyConnectedPass, - LegalizeXCFullyConnectedPass, -) - -from .pooling_passes import ( - ReplaceMaxPool2DPass, - ReplaceMaxPool2D2x2Pass, - ReplaceAveragePool2DPass, - ReplaceAveragePool2D2x2Pass, - ReplaceGlobalAveragePool2DPass, -) -from .padding_passes import ( - FuseConv2dPaddingPass, - SplitPaddingPass, - FuseConsecutivePadsPass, - RemovePaddingInputPass, - ReplacePadPass, -) - -from .quantize_dequantize_passes import ( - RemoveRedundantInt8RequantizationPass, - CanonicalizeQuantizedInputPass, - CanonicalizeQuantizedOutputPass, - CanonicalizeLceQuantizedOutputPass, - CanonicalizeLceQuantizedInputPass, - LegalizeFloatInputPass, - LegalizeFloatOutputPass, -) - -from .op_version_passes import LegalizeQuantizeVersionPass - -from .dce_passes import ( - EliminateDeadOperatorsPass, - EliminateDeadTensorsPass, - EliminateDeadBuffersPass, -) - -from .reshape_passes import ( - RemoveSubsequentReshapePass, - RemovePrecedingReshapePass, - CanonicalizeReshapePass, -) - -from .renaming_passes import LegalizeOperatorOutputTensorNamePass - -from .minification_passes import ( - MinifyQuantInfoPass, - MinifyTensorNamesPass, - UnifyEmptyBuffersPass, -) - -from .word_alignment_passes import CanonicalizeConv2DInputChannels - -from .parallelization_passes import ( - ParallelizeConv2dPass, - ParallelizeDepthwiseConv2dPass, - ParallelizeFullyConnectedPass, - ParallelizeRequant16To8Pass, - ParallelizePooling2DPass, - ParallelizeGlobalAveragePool2DPass, - ParallelizeBConv2dBinPass, - ParallelizeBConv2dInt8Pass, - ParallelizeLUTPass, - ParallelizeAddPass, -) - -from .scratch_memory_passes import ( - ScratchMemoryFullyConnectedPass, - ScratchMemoryConv2dPass, - ScratchMemoryConv2d1x1Pass, - ScratchMemoryDepthwiseConv2dPass, - InsertExternalMemoryFetchPass, -) - -from .constant_propagation_passes import ConstantPropagationPass - -from .lce_passes import ( - ReplaceBconv2DInt8Pass, - ReplaceBconv2DInt8DeepInDeepOutPass, - ReplaceBconv2DBitpackedPass, - ReplaceBconv2DBitpackedDeepInPass, - ReplaceLceQuantizePass, - LegalizeXCBconv2DPaddingPass, - LegalizeBconv2dInt8Pass, - LegalizeBconv2dInt8DeepInDeepOutPass, - LegalizeBconv2dBitpackedPass, - LegalizeBconv2dBitpackedDeepInPass, -) - -from .warning_passes import FloatingPointWarningPass - -from .add_passes import ReplaceAddPass diff --git a/tflite2xcore/tflite2xcore/transformation_passes/add_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/add_passes.py deleted file mode 100644 index efd6edf13..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/add_passes.py +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np - -from tflite2xcore.xcore_model import Operator -from tflite2xcore.xcore_schema import ( - BuiltinOpCodes, - OperatorCode, - XCOREOpCodes, - TensorType, -) - -from .transformation_passes import ReplaceQuantizedOperatorPass - - -class ReplaceAddPass(ReplaceQuantizedOperatorPass): - @property - def matching_opcode(self) -> BuiltinOpCodes: - return BuiltinOpCodes.ADD - - @property - def new_opcode(self) -> OperatorCode: - return OperatorCode(XCOREOpCodes.XC_add_8) - - def match(self, op: Operator) -> bool: - return ( - super().match(op) - and len(op.inputs) == 2 - and op.inputs[0].type is self.matching_input_type - and op.inputs[0].type is op.inputs[1].type is op.outputs[0].type - and op.inputs[0].shape == op.inputs[1].shape == op.outputs[0].shape - ) - - def mutate(self, op: Operator) -> Operator: - new_op = super().mutate(op) - - # constant picked so 8 bit number fits in 16 bits - s_0 = s_1 = -6 - - input_scales = ( - new_op.inputs[0].quantization["scale"][0], - new_op.inputs[1].quantization["scale"][0], - ) - - output_scale = new_op.outputs[0].quantization["scale"][0] - - scale_ratios = (input_scales[0] / output_scale, input_scales[1] / output_scale) - - max_ratio = max(scale_ratios) - - msb_max_ratio = int(np.floor(np.log2(max_ratio))) - - # constant picked for number fits in 16 bits - scale_mismatch = 14 - msb_max_ratio - - m_0 = np.round(scale_ratios[0] * 2 ** scale_mismatch) - m_1 = np.round(scale_ratios[1] * 2 ** scale_mismatch) - - s_out = max(0, scale_mismatch - s_0) - - output_zero_point = new_op.outputs[0].quantization["zero_point"][0] - - inputs_zero_points = ( - new_op.inputs[0].quantization["zero_point"][0], - new_op.inputs[1].quantization["zero_point"][0], - ) - - b = ( - (output_zero_point << s_out) - - m_0 * (inputs_zero_points[0] << -s_0) - - m_1 * (inputs_zero_points[1] << -s_1) - ) - - params = np.int32([s_0, m_0, s_1, m_1, b, s_out]) - - subgraph = new_op.subgraph - bias_scale_shift_tensor = subgraph.create_tensor( - f"{new_op.name}/bias_scale_shift", - TensorType.INT32, - consumers=[new_op], - shape=params.shape, - ) - new_op.inputs.append(bias_scale_shift_tensor) - - new_op.inputs[2].buffer.data = params - - return new_op diff --git a/tflite2xcore/tflite2xcore/transformation_passes/constant_propagation_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/constant_propagation_passes.py deleted file mode 100644 index 65dc05249..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/constant_propagation_passes.py +++ /dev/null @@ -1,80 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np -import tensorflow as tf -from copy import deepcopy -from typing import Iterable - -from tflite2xcore.xcore_schema import ( - BuiltinOpCodes, - XCOREModel, - Subgraph, - Operator, - Tensor, - Buffer, -) - -from .transformation_passes import OperatorMatchingPass - - -class ConstantPropagationPass(OperatorMatchingPass): - def match(self, op: Operator) -> bool: - if super().match(op): - for t in op.inputs: - if not t.is_constant: - return False - elif not t.buffer.data: - self.logger.warning("Found constant tensor with empty buffer") - - if op.operator_code.code in BuiltinOpCodes: - return True - else: - self.logger.warning( - f"Found unsupported operator {op.operator_code.code}" - ) - - return False - - def mutate(self, op: Operator) -> None: - # we first clone a single op model from the op - new_model = XCOREModel() - new_subgraph = Subgraph(model=new_model) - - def clone_tensors(old_tensors: Iterable[Tensor]) -> Iterable[Tensor]: - return (new_subgraph.clone_tensor(t) for t in old_tensors) - - new_op = new_subgraph.create_operator( - op.operator_code, - inputs=clone_tensors(op.inputs), - outputs=clone_tensors(op.outputs), - builtin_options=deepcopy(op.builtin_options), - ) - - # the new model will have no inputs (all op inputs are constant) - # all op outputs will be subgraph outputs as well - for tensor in new_op.outputs: - new_subgraph.outputs.append(tensor) - # rearranging buffers to satisfy the builtin interpreter - new_model.buffers.remove(tensor.buffer) - new_model.buffers = [ - tensor.buffer, - *new_model.buffers, - ] - - # run the single op model thourhg the builtin interpreter - # to get the propagated values - self.logger.debug("Propagating constant using tf.lite.Interpreter...") - interp = tf.lite.Interpreter(model_content=new_model.serialize()) - interp.allocate_tensors() - interp.invoke() - output_values = [ - interp.get_tensor(det["index"]) for det in interp.get_output_details() - ] - - # finally, mutate the original graph - assert len(op.outputs) == len(output_values) # sanity check - for tensor, data in zip(op.outputs, output_values): - tensor.buffer.owners.remove(tensor) - tensor.buffer = Buffer(op.model, np.array(data), owners=[tensor]) - op.subgraph.remove_operator(op) diff --git a/tflite2xcore/tflite2xcore/transformation_passes/conv2d_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/conv2d_passes.py deleted file mode 100644 index b47b637e5..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/conv2d_passes.py +++ /dev/null @@ -1,358 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np -from copy import deepcopy -from typing import Tuple - -from tflite2xcore.xcore_schema import ( - BuiltinOpCodes, - OperatorCode, - XCOREOpCodes, - FullyConnectedOptionsWeightsFormat, -) -from tflite2xcore.utils import WORD_SIZE_BYTES - -from .transformation_passes import ( - ReplaceQuantizedWeightBiasOperatorPass, - ReplaceXCWeightBiasOperatorPass, - LegalizeWeightBiasPass, - LegalizeXCWeightBiasPass, -) - - -class CanonicalizeSinglePixelConv2DPass(ReplaceQuantizedWeightBiasOperatorPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.CONV_2D - - @property - def new_opcode(self): - return OperatorCode(BuiltinOpCodes.FULLY_CONNECTED, version=7) - - def match(self, op): - with self.using(op): - return ( - super().match(op) - and self._weights.shape[1:3] == self._input.shape[1:3] - and self._output.shape[1] == self._output.shape[2] == 1 - ) - - def mutate(self, op): - builtin_options = { - "fused_activation_function": op.builtin_options[ - "fused_activation_function" - ], - "weights_format": FullyConnectedOptionsWeightsFormat.DEFAULT, - "keep_num_dims": False, - "asymmetric_quantize_inputs": False, - } - - new_op = super().mutate(op) - with self.using(new_op): - old_weight_tensor = self._weights - self._op.builtin_options = builtin_options - - new_weight_tensor = self._op.subgraph.create_tensor( - f"{self._op.name}/weights", - old_weight_tensor.type, - shape=( - old_weight_tensor.shape[0], - np.prod(old_weight_tensor.shape[1:]), - ), - quantization=old_weight_tensor.quantization, - consumers=[self._op], - buffer=old_weight_tensor.buffer, - ) - - # rewire old and new kernel tensors - old_weight_tensor.consumers.remove(self._op) - self._op.inputs[1] = new_weight_tensor - - return new_op - - -class CanonicalizeSingleinDepthwiseConv2DPass(ReplaceXCWeightBiasOperatorPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.DEPTHWISE_CONV_2D - - @property - def new_opcode(self): - return OperatorCode(BuiltinOpCodes.CONV_2D, version=3) - - @property - def _depth_multiplier(self): - return self._op.builtin_options["depth_multiplier"] - - def match(self, op): - with self.using(op): - # TODO: update this when conv2d output channel word alignment is done - return ( - super().match(op) - and self._input.shape[3] == 1 - and self._output.shape[3] % WORD_SIZE_BYTES == 0 # Cout divisible by 4 - ) - - def mutate(self, op): - with self.using(op): - builtin_options = deepcopy(self._op.builtin_options) - depth_multiplier = builtin_options.pop("depth_multiplier") - assert depth_multiplier == self._weights.shape[3] - - # create new op and update builtin options - new_op = super().mutate(op) - new_op.builtin_options = builtin_options - - return new_op - - -class LegalizeSingleinConv2DPass(LegalizeWeightBiasPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.CONV_2D - - def mutate_biases(self, op): - # NOTE: nothing to be done on the biases - pass - - def mutate_weights(self, op): - with self.using(op): - self._replace_weights(np.transpose(self._weights.as_array(), [3, 1, 2, 0])) - - -class ReplaceConv2DPass(ReplaceXCWeightBiasOperatorPass): - @property - def _strides(self): - options = self._op.builtin_options - return options["stride_h"], options["stride_w"] - - @property - def _dilation(self): - options = self._op.builtin_options - return options["dilation_h_factor"], options["dilation_w_factor"] - - @property - def _padding(self): - return self._op.builtin_options["padding"] - - def match(self, op): - if super().match(op): - with self.using(op): - if self._dilation != (1, 1): - self.logger.warning( - f"Found non-supported dilation: {self._dilation}" - ) - else: - return True - - return False - - -class LegalizeXCConvPass(LegalizeXCWeightBiasPass): - @property - def _new_weight_shape(self): - # by default, no reshaping is done - return self._weights.shape - - def mutate_weights(self, op): - with self.using(op): - self._replace_weights( - self._weights.as_array().reshape(self._new_weight_shape) - ) - - -class Replace1x1Conv2dPass(ReplaceConv2DPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.CONV_2D - - @property - def new_opcode(self): - return OperatorCode(XCOREOpCodes.XC_conv2d_1x1) - - def match(self, op): - if super().match(op): - with self.using(op): - return ( - self._strides == (1, 1) - and self._weights.shape[0] % WORD_SIZE_BYTES - == 0 # Cout divisible by 4 - and self._weights.shape[1] == 1 - and self._weights.shape[2] == 1 - and self._weights.shape[3] % WORD_SIZE_BYTES - == 0 # Cin divisible by 4 - ) - - return False - - -class LegalizeXC1x1ConvPass(LegalizeXCConvPass): - @property - def matching_opcode(self): - return XCOREOpCodes.XC_conv2d_1x1 - - def _zero_point_bias(self): - return np.sum( - self._weights.as_array(np.int64) * self._input_zero_point, axis=3 - ).squeeze() - - @property - def _new_weight_shape(self): - # NOTE: The reshape is not strictly necessary since the first dimension of - # the kernel should be 1 in TFLite - old_shape = self._weights.shape - return [old_shape[0], old_shape[3]] - - -class ReplacePaddedConv2DPass(ReplaceConv2DPass): - def _pad(self) -> Tuple[int, int]: - # pad: [top, left] - return tuple( - # first arg of max is <= for valid padding - max(int((o - 1) * s - i + k) // 2, 0) - for o, s, i, k in zip( - self._output.shape[1:3], - self._op.custom_options["stride"], - self._input.shape[1:3], - self._weights.shape[1:3], - ) - ) - - def mutate(self, op): - new_op = super().mutate(op) - - with self.using(op): - new_op.add_custom_options(stride=self._strides) - with self.using(new_op): - new_op.add_custom_options(pad=tuple(-p for p in self._pad())) - return new_op - - -class ReplaceDepthwiseConv2dPass(ReplacePaddedConv2DPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.DEPTHWISE_CONV_2D - - @property - def new_opcode(self): - return OperatorCode(XCOREOpCodes.XC_conv2d_depthwise) - - @property - def _depth_multiplier(self): - return self._op.builtin_options["depth_multiplier"] - - def match(self, op): - if super().match(op): - with self.using(op): - if self._depth_multiplier != 1: - self.logger.warning( - f"Found non-supported depthwise multiplier: {self._depth_multiplier}" - ) - else: - return ( - self._weights.shape[3] % WORD_SIZE_BYTES == 0 - ) # Cin divisible by 4 - - return False - - -class LegalizeXCDepthwiseConvPass(LegalizeXCConvPass): - @property - def matching_opcode(self): - return XCOREOpCodes.XC_conv2d_depthwise - - def _zero_point_bias(self): - # NOTE: first dimension of the kernel is always 1 in depthwise conv2d - return np.sum( - self._weights.as_array(np.int64) * self._input_zero_point, axis=(1, 2) - ).squeeze() - - @property - def _new_weight_shape(self): - # NOTE: The reshape is not strictly necessary since the first dimension of - # the kernel should be 1 in TFLite - return self._weights.shape[1:] - - -class ReplaceDeepConv2dPass(ReplacePaddedConv2DPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.CONV_2D - - @property - def new_opcode(self): - return OperatorCode(XCOREOpCodes.XC_conv2d_deep) - - def match(self, op): - if super().match(op): - with self.using(op): - return ( - self._weights.shape[0] % WORD_SIZE_BYTES == 0 # Cout divisible by 4 - and self._weights.shape[3] % WORD_SIZE_BYTES - == 0 # Cin divisible by 4 - ) - - return False - - -class LegalizeXCDeepConvPass(LegalizeXCConvPass): - @property - def matching_opcode(self): - return XCOREOpCodes.XC_conv2d_deep - - def _zero_point_bias(self): - return np.sum( - self._weights.as_array(np.int64) * self._input_zero_point, axis=(1, 2, 3) - ) - - -class ReplaceShallowinConv2dPass(ReplacePaddedConv2DPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.CONV_2D - - @property - def new_opcode(self): - return OperatorCode(XCOREOpCodes.XC_conv2d_shallowin) - - def match(self, op): - if super().match(op): - with self.using(op): - return ( - self._weights.shape[0] % WORD_SIZE_BYTES == 0 # Cout divisible by 4 - and self._weights.shape[3] % WORD_SIZE_BYTES - == 0 # Cin divisible by 4 - and np.prod(self._weights.shape[2:]) <= 32 # K_w * Cin <= 32 - ) - - return False - - def mutate(self, op): - new_op = super().mutate(op) - - with self.using(new_op): - new_op.add_custom_options(Kw=int(self._weights.shape[2])) - return new_op - - -class LegalizeXCShallowinConvPass(LegalizeXCConvPass): - @property - def matching_opcode(self): - return XCOREOpCodes.XC_conv2d_shallowin - - def _zero_point_bias(self): - return np.sum( - self._weights.as_array(np.int64) * self._input_zero_point, axis=(1, 2, 3) - ) - - def mutate_weights(self, op): - with self.using(op): - Kw_pad = int(32 / self._weights.shape[3] - self._weights.shape[2]) - unpadded_weights = self._weights.as_array().reshape(self._new_weight_shape) - self._replace_weights( - np.pad( - unpadded_weights, - pad_width=[(0, 0), (0, 0), (0, Kw_pad), (0, 0)], - ) - ) diff --git a/tflite2xcore/tflite2xcore/transformation_passes/dce_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/dce_passes.py deleted file mode 100644 index f7f19637f..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/dce_passes.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from .transformation_passes import ( - BufferMatchingPass, - TensorMatchingPass, - OperatorMatchingPass, -) - - -class EliminateDeadOperatorsPass(OperatorMatchingPass): - def match(self, op): - if super().match(op): - interface_tensors = set(op.subgraph.inputs + op.subgraph.outputs) - for t in op.outputs: - if t in interface_tensors or t.consumers: - return False - else: - return True - - return False - - def mutate(self, op): - op.subgraph.remove_operator(op) - - -class EliminateDeadTensorsPass(TensorMatchingPass): - def match(self, tensor): - return ( - super().match(tensor) - and tensor not in tensor.subgraph.inputs - and tensor not in tensor.subgraph.outputs - and not tensor.consumers - and not tensor.producers - ) - - def mutate(self, tensor): - tensor.subgraph.remove_tensor(tensor) - - -class EliminateDeadBuffersPass(BufferMatchingPass): - def match(self, buffer): - return super().match(buffer) and not buffer.owners - - def mutate(self, buffer): - buffer.model.buffers.remove(buffer) - - def run(self, model): - modified_cnt = super().run(model) - self.logger.debug(f"Removed {modified_cnt} dead buffers") - return modified_cnt diff --git a/tflite2xcore/tflite2xcore/transformation_passes/fully_connected_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/fully_connected_passes.py deleted file mode 100644 index bfe1ba06b..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/fully_connected_passes.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np - -from tflite2xcore.xcore_schema import ( - BuiltinOpCodes, - OperatorCode, - XCOREOpCodes, -) -from tflite2xcore.utils import WORD_SIZE_BYTES - -from .transformation_passes import ( - ReplaceXCWeightBiasOperatorPass, - LegalizeXCWeightBiasPass, -) - - -class ReplaceFullyConnectedPass(ReplaceXCWeightBiasOperatorPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.FULLY_CONNECTED - - @property - def new_opcode(self): - return OperatorCode(XCOREOpCodes.XC_fc) - - -class LegalizeXCFullyConnectedPass(LegalizeXCWeightBiasPass): - @property - def matching_opcode(self): - return XCOREOpCodes.XC_fc - - def _zero_point_bias(self): - return np.sum(self._weights.as_array(np.int64) * self._input_zero_point, axis=1) - - def mutate_weights(self, op): - with self.using(op): - # zero_padding weight tensor - col_pad = ( - WORD_SIZE_BYTES - 1 - (self._weights.shape[1] - 1) % WORD_SIZE_BYTES - ) - arr = np.pad(self._weights.as_array(), pad_width=[(0, 0), (0, col_pad)]) - - self._replace_weights(arr) diff --git a/tflite2xcore/tflite2xcore/transformation_passes/lce_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/lce_passes.py deleted file mode 100644 index 4ddd2fe8a..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/lce_passes.py +++ /dev/null @@ -1,709 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. -import numpy as np -from math import ceil -from typing import Tuple, List, NamedTuple, Dict - -from tflite2xcore.utils import ( - WORD_SIZE_BITS, - WORD_SIZE_BYTES, - VECTOR_SIZE_BITS, - VECTOR_SIZE_WORDS, - ACC_PERIOD_INT8, - xor_popcount, - calculate_same_padding, - get_unpacked_shape, - clrsb, -) -from tflite2xcore.xcore_schema import ( - Operator, - Padding, - TensorType, - ExternalOpCodes, - XCOREOpCodes, - OperatorCode, - BuiltinOpCodes, - ActivationFunctionType, -) - -from .transformation_passes import ( - OperatorMatchingPass, - ReplaceQuantizedOperatorPass, - LegalizeWeightBiasPass, -) -from .conv2d_passes import ReplaceConv2DPass - -FILLER = 0x55555555 - -XC_BCONV2D_OPCODES = ( - XCOREOpCodes.XC_bconv2d_bin, - XCOREOpCodes.XC_bconv2d_bin_DI, - XCOREOpCodes.XC_bconv2d_int8, - XCOREOpCodes.XC_bconv2d_int8_DIDO, -) - - -class ReplaceBconv2DPass(ReplaceConv2DPass): - @property - def matching_opcode(self) -> ExternalOpCodes: - return ExternalOpCodes.LceBconv2d - - @property - def matching_input_type(self) -> TensorType: - return TensorType.INT32 - - @property - def matching_biases_type(self) -> TensorType: - return TensorType.INT32 - - @property - def matching_weights_type(self) -> TensorType: - return TensorType.INT32 - - @property - def _strides(self) -> Tuple[int, int]: - options = self._op.custom_options - return options["stride_height"], options["stride_width"] - - @property - def _dilation(self) -> Tuple[int, int]: - options = self._op.custom_options - return options["dilation_height_factor"], options["dilation_width_factor"] - - @property - def _padding(self) -> Padding: - return Padding(self._op.custom_options["padding"]) - - @property - def _fused_activation_function(self) -> ActivationFunctionType: - return ActivationFunctionType( - self._op.custom_options["fused_activation_function"] - ) - - @property - def _input_channels(self) -> int: - return self._op.custom_options["channels_in"] - - @property - def _output_channels(self) -> int: - return self._weights.shape[0] - - def match(self, op: Operator) -> bool: - if super().match(op): - with self.using(op): - if self._input_channels != self._weights.shape[3] * WORD_SIZE_BITS: - self.logger.warning( - f"Found {self.matching_opcode} operator " - f"with {self._input_channels} input channels " - f"(not a multiple of {WORD_SIZE_BITS})." - ) - elif self._output_channels % WORD_SIZE_BYTES != 0: - self.logger.warning( - f"Found {self.matching_opcode} operator " - f"with {self._output_channels} output channels " - f"(not a multiple of {WORD_SIZE_BYTES})" - ) - else: - return True - - return False - - def mutate(self, op: Operator) -> Operator: - new_op = super().mutate(op) - with self.using(op): - new_op.add_custom_options(stride=self._strides, padding=self._padding) - return new_op - - -class ReplaceBconv2DInt8Pass(ReplaceBconv2DPass): - @property - def new_opcode(self) -> OperatorCode: - return OperatorCode(XCOREOpCodes.XC_bconv2d_int8) - - def _match_non_weight_inputs(self) -> bool: - return len(self._op.inputs) == 4 and all( - params_tensor.type is TensorType.FLOAT32 - and params_tensor.is_constant - and params_tensor not in self._op.subgraph.outputs - for params_tensor in self._op.inputs[2:] - ) - - def mutate(self, op: Operator) -> Operator: - new_op = super().mutate(op) - with self.using(op): - new_op.add_custom_options( - fused_activation_function=self._fused_activation_function - ) - return new_op - - -class ReplaceBconv2DInt8DeepInDeepOutPass(ReplaceBconv2DInt8Pass): - @property - def new_opcode(self) -> OperatorCode: - return OperatorCode(XCOREOpCodes.XC_bconv2d_int8_DIDO) - - def match(self, op: Operator) -> bool: - with self.using(op): - return ( - super().match(op) - and self._input_channels % VECTOR_SIZE_BITS == 0 - and self._output_channels % ACC_PERIOD_INT8 == 0 - ) - - -class ReplaceBconv2DBitpackedPass(ReplaceBconv2DPass): - @property - def matching_output_type(self) -> TensorType: - return TensorType.INT32 - - @property - def new_opcode(self) -> OperatorCode: - return OperatorCode(XCOREOpCodes.XC_bconv2d_bin) - - def _match_non_weight_inputs(self) -> bool: - return ( - len(self._op.inputs) == 3 - and self._op.inputs[2].type is TensorType.INT32 - and self._op.inputs[2].is_constant - and self._op.inputs[2] not in self._op.subgraph.outputs - ) - - def match(self, op: Operator) -> bool: - if super().match(op): - with self.using(op): - if self._output_channels % WORD_SIZE_BITS == 0: - return True - self.logger.warning( - f"Found {self.matching_opcode} operator with bitpacked output " - f"and {self._output_channels} output channels " - f"(not a multiple of {WORD_SIZE_BITS})" - ) - return False - - -class ReplaceBconv2DBitpackedDeepInPass(ReplaceBconv2DBitpackedPass): - @property - def new_opcode(self) -> OperatorCode: - return OperatorCode(XCOREOpCodes.XC_bconv2d_bin_DI) - - def match(self, op: Operator) -> bool: - with self.using(op): - return super().match(op) and self._input_channels % VECTOR_SIZE_BITS == 0 - - -class ReplaceLceQuantizePass(ReplaceQuantizedOperatorPass): - @property - def new_opcode(self) -> OperatorCode: - return OperatorCode(XCOREOpCodes.XC_bsign_8) - - @property - def matching_opcode(self) -> ExternalOpCodes: - return ExternalOpCodes.LceQuantize - - @property - def matching_output_type(self) -> TensorType: - return TensorType.INT32 - - def match(self, op: Operator) -> bool: - if super().match(op): - input_shape = op.inputs[0].shape - if len(input_shape) == 4 and input_shape[3] % WORD_SIZE_BITS == 0: - return True - self.logger.warning( - f"Found LceQuantize with illegal input shape {input_shape}" - ) - return False - - -class LegalizeBconv2dPass(LegalizeWeightBiasPass): - @property - def matching_input_type(self) -> TensorType: - return TensorType.INT32 - - @property - def _kernel_channel_size(self) -> int: - # call only after custom options are set with weights shape - return np.prod(self._op.custom_options["K"][1:]) # type: ignore - - @property - def _overlap_size(self) -> int: - return ( - VECTOR_SIZE_WORDS - - 1 - - (self._kernel_channel_size // WORD_SIZE_BITS - 1) % VECTOR_SIZE_WORDS - ) - - @property - def _fill_size(self) -> int: - return self._overlap_size - - @staticmethod - def __c_out_group_bounds(c_out_group: int, num_c_out: int) -> Tuple[int, int]: - c_out_group_start = c_out_group * ACC_PERIOD_INT8 - c_out_group_end = min(num_c_out, (c_out_group + 1) * ACC_PERIOD_INT8) - return c_out_group_start, c_out_group_end - - def mutate_weights(self, op: Operator) -> None: - with self.using(op): - weights = self._weights.as_array() - - num_c_out = weights.shape[0] - num_cout_groups = ceil(num_c_out / ACC_PERIOD_INT8) - - # first we reorder the weights - reordered_weight_channels: List[np.ndarray] = [] - for c_out_group in range(num_cout_groups): - c_start, c_end = self.__c_out_group_bounds(c_out_group, num_c_out) - chan_group = weights.reshape(num_c_out, -1)[c_start:c_end] - reordered_weight_channels.extend( - a.ravel() - for a in np.split( - np.flip(chan_group, axis=0), - [ - i * VECTOR_SIZE_WORDS - for i in range( - ceil(chan_group.shape[-1] / VECTOR_SIZE_WORDS) - ) - ], - axis=1, - ) - ) - - # then we need to add filler bits at the end of the last channel - # NOTE: this means that this tensor is no longer rectangular - reordered_weight_channels.append( - # TODO: fix this filler value - np.full(self._fill_size, FILLER, dtype=weights.dtype) - ) - self._replace_weights(np.concatenate(reordered_weight_channels)) - - def _calculate_overlap_correction(self, boggled_weights: np.ndarray) -> np.ndarray: - channel_size_words = self._kernel_channel_size // WORD_SIZE_BITS - tail_size = VECTOR_SIZE_WORDS - self._overlap_size - overlap_correction = np.empty(self._biases.shape, dtype=np.int32) - num_channels_out = self._biases.shape[0] - for c_out in range(num_channels_out): - c_out_group = c_out // ACC_PERIOD_INT8 - c_start, c_end = self.__c_out_group_bounds(c_out_group, num_channels_out) - reversed_offset = c_out % ACC_PERIOD_INT8 % (c_end - c_start) * tail_size - overlap_start = c_end * channel_size_words - reversed_offset - - junk = boggled_weights[overlap_start : overlap_start + self._overlap_size] - overlap_correction[c_out] = ( - xor_popcount(junk, np.zeros_like(junk)) - junk.size * WORD_SIZE_BITS / 2 - ) - return overlap_correction - - def mutate(self, op: Operator) -> Operator: - with self.using(op): - op.add_custom_options(K=get_unpacked_shape(self._weights.shape)) - # NOTE: the order of these mutations is strict - self.mutate_weights(op) - self.mutate_biases(op) - op.custom_options.pop("illegal_params") - return op - - -class LegalizeBconv2dInt8Pass(LegalizeBconv2dPass): - @property - def matching_opcode(self) -> XCOREOpCodes: - return XCOREOpCodes.XC_bconv2d_int8 - - @property - def matching_output_type(self) -> TensorType: - return TensorType.INT8 - - @property - def _fill_size(self) -> int: - k_p_adjust = ( - self._kernel_channel_size // WORD_SIZE_BITS - 1 - ) % VECTOR_SIZE_WORDS + 1 - patch_loop_counter = ceil(self._kernel_channel_size / VECTOR_SIZE_BITS) - 1 - out_tail_chans = int(self._weights.shape[0] - 1) % ACC_PERIOD_INT8 + 1 - fill_words = (patch_loop_counter > 0) * ( - ACC_PERIOD_INT8 - out_tail_chans - ) * VECTOR_SIZE_WORDS - k_p_adjust * out_tail_chans - return max(fill_words, VECTOR_SIZE_WORDS) - - def _calculate_accu_clamps(self) -> Tuple[float, float]: - # follow larq's implementation to get the output tranform clamps - INT32_MIN, INT32_MAX = np.iinfo(np.int32).min, np.iinfo(np.int32).max - activation_range_map: Dict[ActivationFunctionType, Tuple[int, int]] = { - ActivationFunctionType.NONE: (INT32_MIN, INT32_MAX), - ActivationFunctionType.RELU: (0, INT32_MAX), - ActivationFunctionType.RELU_N1_TO_1: (-1, 1), - ActivationFunctionType.RELU6: (0, 6), - } - nominal_clamps = activation_range_map[ - self._op.custom_options["fused_activation_function"] - ] - output_trf_clamps = ( - self._kernel_channel_size - - min(nominal_clamps[1], self._kernel_channel_size), - self._kernel_channel_size - - max(nominal_clamps[0], -self._kernel_channel_size), - ) - - # transform to xcore vpu accumulator space - return ( - (self._kernel_channel_size - output_trf_clamps[0]) / 2, - (self._kernel_channel_size - output_trf_clamps[1]) / 2, - ) - - @staticmethod - def __calculate_exp_bounds(arr: np.ndarray, bound_width: int) -> Tuple[int, int]: - min_exp = -1 - int(np.max(np.frexp(arr)[1])) - return min_exp, min_exp + bound_width - - def _calculate_MBA( - self, adjusted_pam: np.ndarray, adjusted_pab: np.ndarray - ) -> Tuple[int, int, int]: - # calculate bounds on A - accu_clamps = self._calculate_accu_clamps() - max_out = int(max(self._kernel_channel_size / 2, *accu_clamps)) - min_out = int(min(-self._kernel_channel_size / 2, *accu_clamps)) - rsb = min(clrsb(max_out), clrsb(min_out)) - Amin, Amax = rsb - 32 + 1, rsb - 16 - - # calculate bounds on M - Mmin, Mmax = self.__calculate_exp_bounds(adjusted_pam, bound_width=16) - - # calculate bounds on B - Bmin, Bmax = self.__calculate_exp_bounds(adjusted_pab, bound_width=16 + 14) - # ensure A + M = B, and that the addition is fine - Bmax = max(Bmax, Amax + Mmax - 1) - - for A in range(Amax, Amin - 1, -1): - for M in range(Mmax, Mmin - 1, -1): - B = A + M - if Bmin <= B <= Bmax: - return M, B, A - raise ValueError("quantized exponents cannot be determined") - - def _calculate_clamp_offsets(self, A: int) -> Tuple[int, int, int]: - shifted_accu_limits = tuple(c * 2 ** A for c in self._calculate_accu_clamps()) - - INT16_MAX = np.iinfo(np.int16).max - clamp_offsets = ( - int(INT16_MAX - shifted_accu_limits[0]), - int(-INT16_MAX - shifted_accu_limits[1]), - ) - - if abs(clamp_offsets[0]) >= abs(clamp_offsets[1]): - clamp_offsets = clamp_offsets[::-1] - clamp_far_half = clamp_offsets[1] // 2 - return (-clamp_offsets[0], -clamp_offsets[1] + clamp_far_half, clamp_far_half) - - class _ScalarQuantParams(NamedTuple): - M: int - clamp_offset_near: int - clamp_offset_far0: int - clamp_offset_far1: int - bias_multiplier: int - accu_shr: int - accu_shl: int - final_shr: int - adjusted_B: int - - def _calculate_scalar_quant_params( - self, adjusted_pam: np.ndarray, adjusted_pab: np.ndarray - ) -> "_ScalarQuantParams": - M, B, A = self._calculate_MBA(adjusted_pam, adjusted_pab) - assert B >= 8 - - _, Bmax_16 = self.__calculate_exp_bounds(adjusted_pab, bound_width=16) - accu_shift_signed = -A - - return self._ScalarQuantParams( - M, - *self._calculate_clamp_offsets(A), - bias_multiplier=2 ** max(0, B - Bmax_16), - accu_shr=max(0, accu_shift_signed), - accu_shl=min(accu_shift_signed, 0), - final_shr=B - 8, - adjusted_B=min(B, Bmax_16), - ) - - class _QuantParams(NamedTuple): - post_act_mult_quant: np.ndarray - post_act_bias_quant: np.ndarray - output_trf_params: np.ndarray - accu_modifier: np.ndarray - - def _calculate_quant_parameters( - self, adjusted_pam: np.ndarray, adjusted_pab: np.ndarray - ) -> "_QuantParams": - # first we calculate the scalar quantization parameters - q_params = self._calculate_scalar_quant_params(adjusted_pam, adjusted_pab) - - # then quantize the post activation multiplier and bias - pam_q = np.round(adjusted_pam * 2.0 ** q_params.M) - post_act_mult_quant = pam_q.astype(np.int16) - assert np.all(post_act_mult_quant == pam_q) - - # TODO: fix this so there is no need to clip - pab_q = np.round(adjusted_pab * 2.0 ** q_params.adjusted_B) - post_act_bias_quant = np.clip( - pab_q, np.iinfo(np.int16).min, np.iinfo(np.int16).max - ).astype(np.int16) - if np.any(post_act_bias_quant != pab_q): - self.logger.warning("clipped post_act_bias_quant") - - # output transform parameters need to be replicated and concatenated for efficiency - def fill_int16_vector(val: int) -> np.ndarray: - return np.full(16, val, dtype=np.int16) - - # TODO: fix this by reordering the underlying lib_nn struct - output_trf_params = np.concatenate( - [ - fill_int16_vector(getattr(q_params, field)) - for field in ( - "clamp_offset_near", - "clamp_offset_far0", - "clamp_offset_far1", - "bias_multiplier", - "final_shr", - "accu_shr", - ) - ] - + [np.frombuffer(np.int32(q_params.accu_shl).tobytes(), dtype=np.int16)] - ) - - # calculate quantized accumulator modifier - weights = self._weights.as_array() # already boggled - overlap_corrections = self._calculate_overlap_correction(weights) - accu_modifier = np.int16( - overlap_corrections / 2 ** (q_params.accu_shr + q_params.accu_shl) - ) - - return self._QuantParams( - post_act_mult_quant, post_act_bias_quant, output_trf_params, accu_modifier - ) - - def mutate_biases(self, op: Operator) -> None: - with self.using(op): - # first we adjust pam/pab as the larq kernel's output transform requires - output_scale = self._output.quantization["scale"][0] - output_zero_point = self._output.quantization["zero_point"][0] - post_act_mult_float = self._op.inputs[2].as_array() - post_act_bias_float = self._op.inputs[3].as_array() - - output_trf_pam = -post_act_mult_float / output_scale - output_trf_pab = ( - post_act_bias_float / output_scale - - output_trf_pam * self._kernel_channel_size - + output_zero_point - ) - - # then adjust pam/pad as required by our kernels - adjusted_pam = -2 * output_trf_pam - adjusted_pab = output_trf_pab + output_trf_pam * self._kernel_channel_size - - # calculate quantization parameters as required by the kernel - q_params = self._calculate_quant_parameters(adjusted_pam, adjusted_pab) - - # TODO: refactor the rest of this function - # create and populate new post_act_mult tensor - new_pam_tensor = self._op.subgraph.create_tensor( - f"{self._op.name}/post_act_mult", - TensorType.from_numpy_dtype(q_params.post_act_mult_quant.dtype), - q_params.post_act_mult_quant.shape, - consumers=[self._op], - ) - new_pam_tensor.buffer.data = q_params.post_act_mult_quant - - # replace old pam tensor - self._op.inputs[2].consumers.remove(self._op) - self._op.inputs[2] = new_pam_tensor - - # create and populate new post_act_bias tensor - new_pab_tensor = self._op.subgraph.create_tensor( - f"{self._op.name}/post_act_bias", - TensorType.from_numpy_dtype(q_params.post_act_bias_quant.dtype), - q_params.post_act_bias_quant.shape, - consumers=[self._op], - ) - new_pab_tensor.buffer.data = q_params.post_act_bias_quant - - # replace old pab tensor - self._op.inputs[3].consumers.remove(self._op) - self._op.inputs[3] = new_pab_tensor - - # create and populate new output_trf_tensor tensor - output_trf_tensor = self._op.subgraph.create_tensor( - f"{self._op.name}/output_trf_params", - TensorType.from_numpy_dtype(q_params.output_trf_params.dtype), - q_params.output_trf_params.shape, - consumers=[self._op], - ) - output_trf_tensor.buffer.data = q_params.output_trf_params - self._op.inputs.append(output_trf_tensor) - - # create and populate new output_trf_tensor tensor - accu_modifier_tensor = self._op.subgraph.create_tensor( - f"{self._op.name}/accu_modifier", - TensorType.from_numpy_dtype(q_params.accu_modifier.dtype), - q_params.accu_modifier.shape, - consumers=[self._op], - ) - accu_modifier_tensor.buffer.data = q_params.accu_modifier - self._op.inputs.append(accu_modifier_tensor) - - def mutate(self, op: Operator) -> Operator: - new_op = super().mutate(op) - new_op.custom_options.pop("fused_activation_function") - return new_op - - -class LegalizeBconv2dInt8DeepInDeepOutPass(LegalizeBconv2dInt8Pass): - @property - def matching_opcode(self) -> XCOREOpCodes: - return XCOREOpCodes.XC_bconv2d_int8_DIDO - - def mutate_biases(self, op: Operator) -> None: - super().mutate_biases(op) - - # we just need to make sure that there is no overlap - accu_modifier_tensor = op.inputs[5] - assert np.all(accu_modifier_tensor.as_array() == 0) - accu_modifier_tensor.consumers.remove(op) - del op.inputs[5] - - -class LegalizeBconv2dBitpackedPass(LegalizeBconv2dPass): - @property - def matching_output_type(self) -> TensorType: - return TensorType.INT32 - - @property - def matching_opcode(self) -> XCOREOpCodes: - return XCOREOpCodes.XC_bconv2d_bin - - def mutate_biases(self, op: Operator) -> None: - with self.using(op): - thresholds = self._biases.as_array() - weights = self._weights.as_array() # already boggled - - # first we need to calculate a correction term - # due to how our HW popcount differs from the Larq reference - popcount_correction = self._kernel_channel_size / 2 - - # second we need to calculate correction terms - # due to how we handle incomplete weights regsiters - # (the data register is padded with zeros, so the loaded kernel - # coeffs can have some junk loaded, and we correct that) - overlap_correction = self._calculate_overlap_correction(weights) - thresholds += np.int32(overlap_correction - popcount_correction) - - # boggle the lower and higher 2 bytes in every ACC_PERIOD_INT8 consecutive value - thresholds = np.concatenate( - [ - np.frombuffer( - np.frombuffer(cgroup.tobytes(), dtype=np.int16) - .reshape(ACC_PERIOD_INT8, 2) - .T.tobytes(), - dtype=np.int32, - ) - for cgroup in thresholds.reshape( - thresholds.shape[0] // ACC_PERIOD_INT8, ACC_PERIOD_INT8 - ) - ] - ) - - # create and populate new thresholds tensor - new_thresholds = self._op.subgraph.create_tensor( - f"{self._op.name}/thresholds", - TensorType.INT32, - thresholds.shape, - consumers=[self._op], - ) - new_thresholds.buffer.data = thresholds - - # replace old tensor - self._op.inputs[2].consumers.remove(self._op) - self._op.inputs[2] = new_thresholds - - -class LegalizeBconv2dBitpackedDeepInPass(LegalizeBconv2dBitpackedPass): - @property - def matching_opcode(self) -> XCOREOpCodes: - return XCOREOpCodes.XC_bconv2d_bin_DI - - @property - def _overlap_size(self) -> int: - return 0 - - -# Split out padding to a separate op from BConv -# TODO: this currently only matches with XC_bconv2d_* -# but going forward might like to extend this to other conv ops -# and make it a more general pass for all convolutions. -class LegalizeXCBconv2DPaddingPass(OperatorMatchingPass): - @property - def _strides(self) -> Tuple[int, int]: - return self._op.custom_options["stride"] - - @property - def _padding(self) -> Padding: - return self._op.custom_options["padding"] - - MATCHING_OPCODES = XC_BCONV2D_OPCODES - - def match(self, op: Operator) -> bool: - return ( - super().match(op) - and op.operator_code.code in self.MATCHING_OPCODES - and "padding" in op.custom_options - ) - - def mutate(self, op: Operator) -> Operator: - padding = Padding(op.custom_options.pop("padding")) - if padding is Padding.VALID: - return op - - old_input = op.inputs[0] - - # calculate paddings - with self.using(op): - input_and_strides = old_input.shape[1:3], self._strides - - paddings = np.int32( - [ - (0, 0), - *calculate_same_padding(*input_and_strides, op.inputs[1].shape[1:3]), - (0, 0), - ] - ) - - # return early if mode is SAME, but has no effect - if np.all(paddings == 0): - return op - - subgraph = op.subgraph - - # Construct paddings parameter tensor and padded input tensor - padding_tensor = subgraph.create_tensor( - f"{op.name}/paddings", TensorType.INT32, shape=paddings.shape - ) - padding_tensor.buffer.data = paddings - - padded_shape = tuple( - int(size + sum(pads)) for size, pads in zip(old_input.shape, paddings) - ) - padded_input_tensor = subgraph.create_tensor( - f"{op.name}/input", TensorType.INT32, shape=padded_shape, consumers=[op] - ) - - # create new PAD op and inject it before the convolution - pad_op = subgraph.create_operator( - OperatorCode(BuiltinOpCodes.PAD), - inputs=[old_input, padding_tensor], - outputs=[padded_input_tensor], - ) - subgraph.insert_operator(op, pad_op) - - # Cut connection from old input to the op - old_input.consumers.remove(op) - op.inputs[0] = padded_input_tensor - - return op diff --git a/tflite2xcore/tflite2xcore/transformation_passes/lut_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/lut_passes.py deleted file mode 100644 index 91f2efa71..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/lut_passes.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np - -from tflite2xcore.utils import quantize, dequantize -from tflite2xcore.xcore_schema import ( - TensorType, - BuiltinOpCodes, - OperatorCode, - XCOREOpCodes, -) - -from .transformation_passes import ( - ReplaceQuantizedOperatorPass, - QuantizedOperatorMatchingPass, -) - - -ACTIVATIONS = { - BuiltinOpCodes.RELU: lambda x: np.maximum(x, 0.0), - BuiltinOpCodes.RELU6: lambda x: np.minimum(np.maximum(x, 0.0), 6.0), - BuiltinOpCodes.TANH: lambda x: np.tanh(x), - BuiltinOpCodes.LOGISTIC: lambda x: 1.0 / (1.0 + np.exp(-x)), -} - - -class ReplaceWithXCLookupPass(ReplaceQuantizedOperatorPass): - @property - def new_opcode(self): - return OperatorCode(XCOREOpCodes.XC_lookup_8) - - def mutate(self, op): - new_op = super().mutate(op) - new_op.add_custom_options(original_opcode=self.matching_opcode) - return new_op - - -class LegalizeXCLookupTablePass(QuantizedOperatorMatchingPass): - @property - def matching_opcode(self): - return XCOREOpCodes.XC_lookup_8 - - def match(self, op): - return super().match(op) and "original_opcode" in op.custom_options - - def _dequantize_input(self, int_arr): - input_quant = self._input.quantization - return dequantize( - int_arr, input_quant["scale"][0], input_quant["zero_point"][0] - ) - - def _quantize_output(self, float_arr): - output_quant = self._output.quantization - return quantize( - float_arr, output_quant["scale"][0], output_quant["zero_point"][0] - ) - - def mutate(self, op): - inputs_int = np.arange(-128, 128, dtype=np.int8) - activation = ACTIVATIONS[op.custom_options.pop("original_opcode")] - with self.using(op): - outputs_int = self._quantize_output( - activation(self._dequantize_input(inputs_int)) - ) - outputs_int = np.concatenate([outputs_int[128:], outputs_int[0:128]]) - - lut_tensor = op.subgraph.create_tensor( - f"{op.name}/LUT", TensorType.INT8, shape=[len(outputs_int)], consumers=[op] - ) - lut_tensor.buffer.data = outputs_int - op.inputs.append(lut_tensor) - - -class ReplaceReLUPass(ReplaceWithXCLookupPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.RELU - - -class ReplaceReLU6Pass(ReplaceWithXCLookupPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.RELU6 - - -class ReplaceTanhPass(ReplaceWithXCLookupPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.TANH - - -class ReplaceLogisticPass(ReplaceWithXCLookupPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.LOGISTIC diff --git a/tflite2xcore/tflite2xcore/transformation_passes/minification_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/minification_passes.py deleted file mode 100644 index 79c95786d..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/minification_passes.py +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from tflite2xcore.xcore_schema import XCOREOpCodes, BuiltinOpCodes, Buffer, XCOREModel -from .transformation_passes import TensorMatchingPass, BufferMatchingPass - - -class MinifyQuantInfoPass(TensorMatchingPass): - # NOTE: it's risky to include the builtin ops here, but (at least in the - # micro interpreter), min/max info does not seem to be used - SAFE_OP_CODES = [c for c in XCOREOpCodes] + [c for c in BuiltinOpCodes] - - def match(self, tensor): - dependents = tensor.consumers + tensor.producers - quantization = tensor.quantization - - if super().match(tensor) and quantization and dependents: - for op in dependents: - if op.operator_code.code not in self.SAFE_OP_CODES: - # min/max info is removed if tensor only interacts with XC ops - return False - else: - return "min" in quantization or "max" in quantization - return False - - def mutate(self, tensor): - tensor.quantization.pop("min", None) - tensor.quantization.pop("max", None) - - -class MinifyTensorNamesPass(TensorMatchingPass): - def __new_tensor_name(self, tensor): - return str(self._obj_index) - - def match(self, tensor): - return super().match(tensor) and tensor.name != self.__new_tensor_name(tensor) - - def mutate(self, tensor): - tensor.name = self.__new_tensor_name(tensor) - - -# TODO: add tests -class UnifyEmptyBuffersPass(BufferMatchingPass): - def match(self, buffer: Buffer) -> bool: - return ( - super().match(buffer) - and not buffer - and buffer is not buffer.model.buffers[0] - and buffer.owners - ) - - def mutate(self, buffer: Buffer) -> None: - sentinel = buffer.model.buffers[0] - - for owner in buffer.owners: - owner.buffer = sentinel - sentinel.owners.append(owner) - - buffer.owners = [] - - def run(self, model: XCOREModel) -> int: - model.buffers.insert(0, Buffer()) - modified_cnt = super().run(model) - self.logger.debug(f"Unified {modified_cnt} empty buffers") - return modified_cnt diff --git a/tflite2xcore/tflite2xcore/transformation_passes/op_version_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/op_version_passes.py deleted file mode 100644 index a0a8fae87..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/op_version_passes.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from tflite2xcore.xcore_model import Operator -from tflite2xcore.xcore_schema import TensorType, BuiltinOpCodes - -from .transformation_passes import OperatorMatchingPass - - -class LegalizeQuantizeVersionPass(OperatorMatchingPass): - def match(self, op: Operator) -> bool: - if not super().match(op): - return False - - opcode = op.operator_code - return ( - opcode.code is BuiltinOpCodes.QUANTIZE - and opcode.version == 2 - and op.inputs[0].type is TensorType.FLOAT32 - and op.outputs[0].type is TensorType.INT8 - ) - - def mutate(self, op: Operator) -> None: - op.operator_code.version = 1 diff --git a/tflite2xcore/tflite2xcore/transformation_passes/padding_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/padding_passes.py deleted file mode 100644 index ac4d1bf6f..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/padding_passes.py +++ /dev/null @@ -1,339 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np -from typing import Tuple - -from tflite2xcore.xcore_schema import ( - Padding, - TensorType, - BuiltinOpCodes, - XCOREOpCodes, - OperatorCode, - Operator, -) - -from .transformation_passes import OperatorMatchingPass - - -class FuseConv2dPaddingPass(OperatorMatchingPass): - MATCHING_OPCODES = ( - XCOREOpCodes.XC_conv2d_depthwise, - XCOREOpCodes.XC_conv2d_deep, - XCOREOpCodes.XC_conv2d_shallowin, - ) - - @property - def _producer(self): - return self._op.inputs[0].producers[0] - - @property - def _pad_params(self): - return self._producer.inputs[1].as_array().tolist() - - @property - def _conv_pad(self) -> Tuple[int, int]: - return tuple(-p for p in self._op.custom_options["pad"]) - - @property - def _kernel_size(self): - opcode = self._op.operator_code.code - weights = self._op.inputs[1] - if opcode is XCOREOpCodes.XC_conv2d_depthwise: - return weights.shape[0:2] - elif opcode in (XCOREOpCodes.XC_conv2d_deep, XCOREOpCodes.XC_conv2d_shallowin): - return weights.shape[1:3] - - @staticmethod - def _calculate_end_padding(out_size, strides, in_size, kernel_size): - return tuple( - (o - 1) * s - i + k - for o, s, i, k in zip(out_size, strides, in_size, kernel_size) - ) - - def match(self, op): - if not super().match(op): - return False - - with self.using(op): - opcode = self._op.operator_code.code - if opcode not in self.MATCHING_OPCODES: - return False - - try: - if self._producer.operator_code.code is not BuiltinOpCodes.PAD: - return False - except IndexError: - # No producers found for input - return False - - pad_params = self._pad_params - if len(pad_params) != 4: - return False - - if pad_params[0] != [0, 0] or pad_params[3] != [0, 0]: - # NOTE: SplitPaddingPass decouples channel- and batch-wise padding - return False - - kernel_size = self._kernel_size - implicit_end_pads = self._calculate_end_padding( - out_size=op.outputs[0].shape[1:3], - strides=op.custom_options["stride"], - in_size=op.inputs[0].shape[1:3], - kernel_size=kernel_size, - ) - - conv_pad = self._conv_pad - - all_pads = ( - [conv_pad[0] + pad_params[1][0], implicit_end_pads[0] + pad_params[1][1]], - [conv_pad[1] + pad_params[2][0], implicit_end_pads[1] + pad_params[2][1]], - ) - - for p, k in zip(all_pads, kernel_size): - if p[0] >= k or p[1] >= k: - # kernels currently don't support this - self.logger.warning( - f"While fusing, found implicit padding={p}" - f" not smaller than kernel={kernel_size}" - ) - return False - - if len(conv_pad) == 2 and not isinstance(conv_pad, str): - return True - elif conv_pad in ["SAME", "VALID"] + list(Padding): - raise ValueError(f"Deprecated 'pad' option in {opcode}: 'pad'={conv_pad}") - else: - self.logger.warning(f"Invalid option in {opcode}: 'pad'={conv_pad}") - - return False - - def mutate(self, op): - with self.using(op): - producer = self._producer - pad_params = self._pad_params - old_pad = self._conv_pad - - # cut connection to old input - op.inputs[0].consumers.remove(op) - - # add connection from unpadded input to convolution operator - op.inputs[0] = producer.inputs[0] - op.inputs[0].consumers.append(op) - - # set padding: [top, left, zero_point] - op.custom_options["pad"] = [ - -(old_pad[0] + pad_params[1][0]), - -(old_pad[1] + pad_params[2][0]), - ] - - -class SplitPaddingPass(OperatorMatchingPass): - @property - def _pad_params(self): - return self._op.inputs[1].as_array().tolist() - - def match(self, op): - if not super().match(op): - return False - - with self.using(op): - opcode = self._op.operator_code.code - if opcode is not BuiltinOpCodes.PAD: - return False - - pad_params = self._pad_params - if len(pad_params) != 4: - return False - - return (pad_params[0] != [0, 0] or pad_params[3] != [0, 0]) and ( - pad_params[1] != [0, 0] or pad_params[2] != [0, 0] - ) - - def mutate(self, op): - subgraph = op.subgraph - - with self.using(op): - pad_params = self._pad_params - pads_NC = [pad_params[0], [0, 0], [0, 0], pad_params[3]] - pads_HW = [[0, 0], pad_params[1], pad_params[2], [0, 0]] - - # cut connection from old input to the op - old_input = op.inputs[0] - old_input.consumers.remove(op) - - # create new parameter tensor for the op, and replace old - # the old op will become the spatial padding - # this is needed because multiple ops can share the same parameter tensor - # NOTE: the old paddings tensor might be dangling and will be cleaned up later - op.inputs[1].consumers.remove(op) - op.inputs[1] = subgraph.create_tensor( - f"{op.name}/paddings", TensorType.INT32, shape=[4, 2], consumers=[op] - ) - op.inputs[1].buffer.data = np.int32(pads_HW) - - # create new (batch/channel-wise) operator - new_op = subgraph.create_operator( - OperatorCode(BuiltinOpCodes.PAD), inputs=[old_input] - ) - subgraph.insert_operator(op, new_op) - - # assign padding tensor to new op - new_op.inputs.append( - subgraph.create_tensor( - f"{new_op.name}/paddings", - TensorType.INT32, - shape=[4, 2], - consumers=[new_op], - ) - ) - new_op.inputs[1].buffer.data = np.int32(pads_NC) - - # create intermediate tensor and wire it up - intermediate_shape = [ - size + pad[0] + pad[1] for size, pad in zip(old_input.shape, pads_NC) - ] - op.inputs[0] = subgraph.create_tensor( - f"{new_op.name}/output", - old_input.type, - intermediate_shape, - consumers=[op], - producers=[new_op], - quantization=old_input.quantization, - ) - new_op.outputs.append(op.inputs[0]) - - -class FuseConsecutivePadsPass(OperatorMatchingPass): - @property - def _producer(self): - return self._op.inputs[0].producers[0] - - @property - def _pad_params(self): - return self._op.inputs[1].as_array() - - def match(self, op): - # the anchor is the second of two consecutive PAD ops - try: - with self.using(op): - return ( - super().match(op) - and self._op.operator_code.code is BuiltinOpCodes.PAD - and self._producer.operator_code.code is BuiltinOpCodes.PAD - ) - except IndexError: - # No producers found for input - return False - - def mutate(self, op): - subgraph = op.subgraph - with self.using(op): - producer = self._producer - this_params = self._pad_params - with self.using(producer): - producer_params = self._pad_params - new_params = this_params + producer_params - - # cut connection from old inputs to the anchor op - intermediate = op.inputs[0] - intermediate.consumers.remove(op) - op.inputs[1].consumers.remove(op) - - # create new parameter tensor for the op, and replace old - # this is needed because multiple ops can share the same parameter tensor - # NOTE: the old paddings tensor might be dangling and will be cleaned up later - op.inputs[1] = subgraph.create_tensor( - f"{op.name}/paddings", - TensorType.INT32, - shape=new_params.shape, - consumers=[op], - ) - op.inputs[1].buffer.data = new_params.astype(np.int32) - - # set up bypass connection - op.inputs[0] = producer.inputs[0] - producer.inputs[0].consumers.append(op) - - -class RemovePaddingInputPass(OperatorMatchingPass): - def match(self, op): - if op.operator_code.code is BuiltinOpCodes.PAD: - padding = op.inputs[1].as_array().tolist() - return ( - super().match(op) - # Match padding only where it is the first operator in the subgraph - and op.inputs[0] in op.subgraph.inputs - # Make sure no other op uses this input - and len(op.inputs[0].consumers) == 1 - # Match only padding in channel direction i.e. inserted for VPU alignment - and len(padding) == 4 - and padding[-1] != [0, 0] - and all(pad == [0, 0] for pad in padding[:-1]) - ) - else: - return False - - def mutate(self, op): - subgraph = op.subgraph - subgraph.inputs.append(op.outputs[0]) - subgraph.remove_tensor(op.inputs[0]) # DCE doesn't clean up subgraph inputs - subgraph.remove_operator(op) - - -class ReplacePadPass(OperatorMatchingPass): - @property - def new_opcode(self) -> OperatorCode: - return OperatorCode(XCOREOpCodes.XC_pad) - - def match(self, op: Operator) -> bool: - if super().match and op.operator_code.code is BuiltinOpCodes.PAD: - padding = op.inputs[1].as_array().tolist() - - try: - pad_value = op.inputs[0].quantization["zero_point"][0] - except KeyError: - pad_value = 0 - - input_type = op.inputs[0].type - if ( - np.can_cast(pad_value, input_type.to_numpy_dtype()) - and input_type.sizeof() <= 4 - ): - # match spatial pad only - if len(padding) == 4 and padding[-1] == [0, 0] and padding[0] == [0, 0]: - bytes_per_pixel = input_type.sizeof() * op.inputs[0].shape[3] - return bytes_per_pixel % 4 == 0 - else: - raise ValueError( - f"zero_point is out of bounds for tensor with type {input_type}" - ) - - return False - - def mutate(self, op: Operator) -> Operator: - new_op = op.subgraph.create_operator( - self.new_opcode, inputs=op.inputs, outputs=op.outputs - ) - new_op.subgraph.replace_operator(op, new_op) - - input_type = new_op.inputs[0].type - try: - pad_value = new_op.inputs[0].quantization["zero_point"][0] - except KeyError: - pad_value = 0 - - new_op.add_custom_options( - pad_value=int( - np.frombuffer( - np.full( - 4 // input_type.sizeof(), - pad_value, - dtype=input_type.to_numpy_dtype(), - ).tobytes(), - dtype=np.int32, - ) - ) - ) - - return new_op diff --git a/tflite2xcore/tflite2xcore/transformation_passes/parallelization_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/parallelization_passes.py deleted file mode 100644 index b4eac01a7..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/parallelization_passes.py +++ /dev/null @@ -1,166 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np -from abc import abstractmethod -from typing import Tuple, Optional, Any - -from tflite2xcore.xcore_schema import XCOREOpCodes, Operator -from tflite2xcore.parallelization import ( - ParallelizationPlanner, - SlicePlanner, - ChannelGroupSlicePlanner, - ElementWisePlanner, -) -from tflite2xcore.utils import WORD_SIZE_BITS, WORD_SIZE_BYTES, ACC_PERIOD_INT8 - -from .transformation_passes import OperatorMatchingPass - - -class ParallelizationPass(OperatorMatchingPass): - FIXED_COST_PER_THREAD = 0 - - @property - @abstractmethod - def MATCHING_OPCODES(self) -> Tuple[XCOREOpCodes, ...]: - return tuple() - - def __init__( - self, - *args: Any, - num_threads: Optional[int] = None, - forced: bool = False, - **kwargs: Any - ) -> None: - super().__init__(*args, **kwargs) - num_threads = num_threads or 1 - assert num_threads > 0 - self._planner_args = dict( - forced=forced, - num_threads=num_threads, - fixed_cost_per_thread=self.FIXED_COST_PER_THREAD, - ) - - def match(self, op: Operator) -> bool: - return ( - super().match(op) - and op.operator_code.code in self.MATCHING_OPCODES - and "par" not in op.custom_options - ) - - @property - @abstractmethod - def _planner(self) -> ParallelizationPlanner: - raise NotImplementedError() - - def mutate(self, op: Operator) -> None: - with self.using(op): - op.add_custom_options(par=self._planner.find_optimal_plan().to_dict()) - - -class ParallelizeElementWisePass(ParallelizationPass): - JOB_SIZE_ALIGNMENT = WORD_SIZE_BYTES - - @property - def _num_elements(self) -> int: - return int(np.prod(self._op.outputs[0].shape[1:])) - - @property - def _planner(self) -> ElementWisePlanner: - return ElementWisePlanner( - self._num_elements, alignment=self.JOB_SIZE_ALIGNMENT, **self._planner_args - ) - - -class ParallelizeLUTPass(ParallelizeElementWisePass): - MATCHING_OPCODES = (XCOREOpCodes.XC_lookup_8,) - FIXED_COST_PER_THREAD = 10 - JOB_SIZE_ALIGNMENT = 1 - - -class ParallelizeAddPass(ParallelizeElementWisePass): - MATCHING_OPCODES = (XCOREOpCodes.XC_add_8,) - FIXED_COST_PER_THREAD = 100 - - -class ParallelizeChannelWisePass(ParallelizeElementWisePass): - FIXED_COST_PER_THREAD = 0 - JOB_SIZE_ALIGNMENT = ACC_PERIOD_INT8 - - @property - def _num_elements(self) -> int: - num_channels = self._op.outputs[0].shape[-1] - assert num_channels % WORD_SIZE_BYTES == 0 - return num_channels - - -class ParallelizeGlobalAveragePool2DPass(ParallelizeChannelWisePass): - MATCHING_OPCODES = (XCOREOpCodes.XC_avgpool2d_global,) - - -class ChannelGroupParallelizationPass(ParallelizationPass): - @property - def _planner(self) -> ChannelGroupSlicePlanner: - output_shape = self._op.outputs[0].shape - Cout = np.prod(output_shape[1:]) # works even if output is (1, 1, 1, Cout) - assert output_shape[-1] == Cout - return ChannelGroupSlicePlanner(Cout, **self._planner_args) - - -class SpatialParallelizationPass(ParallelizationPass): - @property - def _cout(self) -> int: - return self._op.outputs[0].shape[3] - - @property - def _planner(self) -> SlicePlanner: - _, height, width, _ = self._op.outputs[0].shape - return SlicePlanner(self._cout, height, width, **self._planner_args) - - -class ParallelizeFullyConnectedPass(ChannelGroupParallelizationPass): - MATCHING_OPCODES = (XCOREOpCodes.XC_fc,) - - -class ParallelizeRequant16To8Pass(ChannelGroupParallelizationPass): - MATCHING_OPCODES = (XCOREOpCodes.XC_requantize_16_to_8,) - - -class ParallelizeConv2dPass(SpatialParallelizationPass): - MATCHING_OPCODES = ( - XCOREOpCodes.XC_conv2d_shallowin, - XCOREOpCodes.XC_conv2d_deep, - XCOREOpCodes.XC_conv2d_1x1, - ) - - -class ParallelizeBConv2dInt8Pass(SpatialParallelizationPass): - MATCHING_OPCODES = ( - XCOREOpCodes.XC_bconv2d_int8, - XCOREOpCodes.XC_bconv2d_int8_DIDO, - ) - - def mutate(self, op: Operator) -> None: - with self.using(op): - par = self._planner.find_optimal_plan().to_dict() - par.pop("cg") - op.add_custom_options(par=par) - - -class ParallelizeBConv2dBinPass(ParallelizeBConv2dInt8Pass): - MATCHING_OPCODES = ( - XCOREOpCodes.XC_bconv2d_bin, - XCOREOpCodes.XC_bconv2d_bin_DI, - ) - - @property - def _cout(self) -> int: - return super()._cout * WORD_SIZE_BITS - - -class ParallelizeDepthwiseConv2dPass(SpatialParallelizationPass): - MATCHING_OPCODES = (XCOREOpCodes.XC_conv2d_depthwise,) - - -class ParallelizePooling2DPass(SpatialParallelizationPass): - MATCHING_OPCODES = (XCOREOpCodes.XC_maxpool2d, XCOREOpCodes.XC_avgpool2d) diff --git a/tflite2xcore/tflite2xcore/transformation_passes/pooling_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/pooling_passes.py deleted file mode 100644 index 36c544e67..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/pooling_passes.py +++ /dev/null @@ -1,193 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np - -from tflite2xcore.xcore_schema import ( - ActivationFunctionType, - Padding, - TensorType, - BuiltinOpCodes, - OperatorCode, - XCOREOpCodes, -) -from tflite2xcore.utils import WORD_SIZE_BYTES - -from .transformation_passes import ReplaceQuantizedOperatorPass - - -class ReplacePool2DPass(ReplaceQuantizedOperatorPass): - @property - def _strides(self): - options = self._op.builtin_options - return options["stride_h"], options["stride_w"] - - @property - def _pool_size(self): - options = self._op.builtin_options - return options["filter_height"], options["filter_width"] - - @property - def _padding(self): - return self._op.builtin_options["padding"] - - @property - def _fused_activation(self): - return self._op.builtin_options["fused_activation_function"] - - def match(self, op): - if super().match(op): - with self.using(op): - return ( - self._input.quantization == self._output.quantization - and self._fused_activation is ActivationFunctionType.NONE - and self._input.shape[3] % 4 == 0 - ) - - return False - - def mutate(self, op): - new_op = super().mutate(op) - - with self.using(op): - new_op.add_custom_options(stride=self._strides, pool=self._pool_size) - - -class ReplacePool2D2x2Pass(ReplacePool2DPass): - def match(self, op): - if super().match(op): - with self.using(op): - return ( - self._strides == (2, 2) - and self._pool_size == (2, 2) - and self._input.shape[1] % 2 == 0 - and self._input.shape[2] % 2 == 0 - ) - - return False - - -class ReplaceMaxPool2DPass(ReplacePool2DPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.MAX_POOL_2D - - @property - def new_opcode(self): - return OperatorCode(XCOREOpCodes.XC_maxpool2d) - - def match(self, op): - if super().match(op): - with self.using(op): - return self._padding is Padding.VALID - - return False - - -class ReplaceMaxPool2D2x2Pass(ReplacePool2D2x2Pass): - @property - def matching_opcode(self): - return BuiltinOpCodes.MAX_POOL_2D - - @property - def new_opcode(self): - return OperatorCode(XCOREOpCodes.XC_maxpool2d) - - -class ReplaceAveragePool2DPass(ReplacePool2DPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.AVERAGE_POOL_2D - - @property - def new_opcode(self): - return OperatorCode(XCOREOpCodes.XC_avgpool2d) - - def match(self, op): - if super().match(op): - with self.using(op): - return self._padding is Padding.VALID - - return False - - -class ReplaceAveragePool2D2x2Pass(ReplacePool2D2x2Pass): - @property - def matching_opcode(self): - return BuiltinOpCodes.AVERAGE_POOL_2D - - @property - def new_opcode(self): - return OperatorCode(XCOREOpCodes.XC_avgpool2d) - - -class ReplaceGlobalAveragePool2DPass(ReplaceQuantizedOperatorPass): - @property - def matching_opcode(self): - return BuiltinOpCodes.MEAN - - @property - def new_opcode(self): - return OperatorCode(XCOREOpCodes.XC_avgpool2d_global) - - def match(self, op): - if super().match(op): - with self.using(op): - axis = self._op.inputs[1].as_array().flatten().tolist() - if axis == [1, 2] or axis == [2, 1]: - return self._input.shape[3] % WORD_SIZE_BYTES == 0 - else: - self.logger.warning("Axis is not either [1, 2] or [2, 1]") - - return False - - @property - def _bias_scale_shift(self): - num_pixels = self._input.shape[1] * self._input.shape[2] - rescaling = ( - self._input.quantization["scale"][0] / self._output.quantization["scale"][0] - ) - multiplier = rescaling / num_pixels - - scale = np.round(multiplier * 2 ** (7 - np.ceil(np.log2(multiplier)))) - if scale == 128.0: - scale /= 2 - shift = np.round(np.log2(scale / multiplier)) - bias = np.round( - ( - self._output.quantization["zero_point"][0] - - self._input.quantization["zero_point"][0] * rescaling - + 0.5 # needed because the tflite ref adds 0.5 to the bias - ) - * 2 ** shift - ) - - if shift > 24 or shift < 0: - raise ValueError( - f"Global Average Pool shift must be between 0 and 24, got {shift}." - ) - if scale > 127 or scale < 64: - raise ValueError( - f"Global Average Pool scale must be between 64 and 127, got {scale}." - ) - - return bias.astype(np.int32), scale.astype(np.int8), shift.astype(np.int16) - - def mutate(self, op): - new_op = super().mutate(op) - subgraph = new_op.subgraph - - with self.using(new_op): - # replace reduction_indices tensor with bias_scale_shift - new_op.inputs[1].consumers.remove(new_op) - new_op.inputs[1] = subgraph.create_tensor( - f"{new_op.name}/bias_scale_shift", - TensorType.INT8, - shape=[7], - consumers=[new_op], - ) - new_op.inputs[1].buffer.data = b"".join( - p.tobytes() for p in self._bias_scale_shift - ) - - return new_op diff --git a/tflite2xcore/tflite2xcore/transformation_passes/quantize_dequantize_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/quantize_dequantize_passes.py deleted file mode 100644 index 6aee1a931..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/quantize_dequantize_passes.py +++ /dev/null @@ -1,185 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from tflite2xcore.xcore_model import Operator, Tensor -from tflite2xcore.xcore_schema import ( - TensorType, - BuiltinOpCodes, - OperatorCode, - ExternalOpCodes, - ValidOpCodes, -) - -from .transformation_passes import ( - InputTensorMatchingPass, - OutputTensorMatchingPass, - QuantizedOperatorMatchingPass, -) - - -class RemoveRedundantInt8RequantizationPass(QuantizedOperatorMatchingPass): - @property - def matching_opcode(self) -> BuiltinOpCodes: - return BuiltinOpCodes.QUANTIZE - - _PRECEDING_OPCODES = ( - BuiltinOpCodes.CONV_2D, - BuiltinOpCodes.DEPTHWISE_CONV_2D, - BuiltinOpCodes.FULLY_CONNECTED, - BuiltinOpCodes.QUANTIZE, - ) - - def match(self, op: Operator) -> bool: - if super().match(op): - intermediate_tensor = op.inputs[0] - if ( - len(intermediate_tensor.consumers) == 1 - and len(intermediate_tensor.producers) == 1 - and intermediate_tensor not in op.subgraph.outputs - ): - producer_op = intermediate_tensor.producers[0] - return producer_op.operator_code.code in self._PRECEDING_OPCODES - return False - - def mutate(self, op: Operator) -> None: - subgraph = op.subgraph - intermediate_tensor = op.inputs[0] - output_tensor = op.outputs[0] - - producer_op = intermediate_tensor.producers[0] - producer_op.outputs[0] = output_tensor - output_tensor.producers.append(producer_op) - - # it is safe to remove the tensor and the intermediate op - # since the match checked that there are no other consumers - subgraph.remove_operator(op) - subgraph.remove_tensor(intermediate_tensor) - - -# TODO: improve tests for this -class CanonicalizeQuantizedInputPass(QuantizedOperatorMatchingPass): - @property - def matching_opcode(self) -> BuiltinOpCodes: - return BuiltinOpCodes.QUANTIZE - - @property - def matching_input_type(self) -> TensorType: - return TensorType.FLOAT32 - - def match(self, op: Operator) -> bool: - if super().match(op): - input_tensor, output_tensor = op.inputs[0], op.outputs[0] - return ( - input_tensor in op.subgraph.inputs - and len(input_tensor.consumers) == 1 - and output_tensor not in op.subgraph.outputs - ) - - return False - - def mutate(self, op: Operator) -> None: - subgraph = op.subgraph - subgraph.inputs.append(op.outputs[0]) - subgraph.remove_tensor(op.inputs[0]) # DCE doesn't clean up subgraph inputs - subgraph.remove_operator(op) - - -# TODO consider adding tests for this -class CanonicalizeLceQuantizedInputPass(CanonicalizeQuantizedInputPass): - @property - def matching_input_type(self) -> TensorType: - return TensorType.INT8 - - @property - def matching_output_type(self) -> TensorType: - return TensorType.INT32 - - @property - def matching_opcode(self) -> ValidOpCodes: - return ExternalOpCodes.LceQuantize - - -class CanonicalizeQuantizedOutputPass(QuantizedOperatorMatchingPass): - @property - def matching_opcode(self) -> BuiltinOpCodes: - return BuiltinOpCodes.DEQUANTIZE - - @property - def matching_output_type(self) -> TensorType: - return TensorType.FLOAT32 - - def match(self, op: Operator) -> bool: - if super().match(op): - try: - if op.operator_code.code is not self.matching_opcode: - return False - except AttributeError: - return False - - output_tensor = op.outputs[0] - if ( - output_tensor in op.subgraph.outputs - and not output_tensor.consumers - and op.inputs[0] not in op.subgraph.inputs - ): - if len(output_tensor.producers) == 1: - return True - else: - self.logger.warning( - f"Encountered output of removable {self.matching_opcode} " - "with more than one producer." - ) - - return False - - def mutate(self, op: Operator) -> None: - subgraph = op.subgraph - subgraph.outputs.append(op.inputs[0]) - subgraph.remove_tensor(op.outputs[0]) # DCE doesn't clean up subgraph outputs - subgraph.remove_operator(op) - - -# TODO consider adding tests for this -class CanonicalizeLceQuantizedOutputPass(CanonicalizeQuantizedOutputPass): - @property - def matching_input_type(self) -> TensorType: - return TensorType.INT32 - - @property - def matching_opcode(self) -> ValidOpCodes: - return ExternalOpCodes.LceDequantize - - -# TODO: improve tests for this -class LegalizeFloatInputPass(InputTensorMatchingPass): - def match(self, input_tensor: Tensor) -> bool: - return super().match(input_tensor) and input_tensor.type is TensorType.INT8 - - def mutate(self, qin: Tensor) -> None: - subgraph = qin.subgraph - fin = subgraph.create_tensor( - f"{qin.name}_float", TensorType.FLOAT32, qin.shape, isinput=True - ) - subgraph.inputs.remove(qin) - op = subgraph.create_operator( - OperatorCode(BuiltinOpCodes.QUANTIZE), inputs=[fin], outputs=[qin] - ) - # builtin interpreter prefers ops ordered this way - subgraph.operators.remove(op) - subgraph.operators.insert(0, op) - - -# TODO: improve tests for this -class LegalizeFloatOutputPass(OutputTensorMatchingPass): - def match(self, input_tensor: Tensor) -> bool: - return super().match(input_tensor) and input_tensor.type is TensorType.INT8 - - def mutate(self, qout: Tensor) -> None: - subgraph = qout.subgraph - fout = subgraph.create_tensor( - f"{qout.name}_float", TensorType.FLOAT32, qout.shape, isoutput=True - ) - subgraph.outputs.remove(qout) - subgraph.create_operator( - OperatorCode(BuiltinOpCodes.DEQUANTIZE), inputs=[qout], outputs=[fout] - ) diff --git a/tflite2xcore/tflite2xcore/transformation_passes/renaming_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/renaming_passes.py deleted file mode 100644 index 09670b88c..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/renaming_passes.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from .transformation_passes import OperatorMatchingPass - - -class LegalizeOperatorOutputTensorNamePass(OperatorMatchingPass): - def match(self, op): - if super().match(op): - if len(op.outputs) == 1: - return not op.outputs[0].name.startswith(f"{op.name}/output") - - for j, tensor in enumerate(op.outputs): - candidate_name = f"{op.name}/output_{j}" - if not tensor.name.startswith(candidate_name): - return True - - return False - - def __mutate_tensor_name(self, tensor, candidate_name): - subgraph = tensor.subgraph - if tensor.name != candidate_name: - unique_name = subgraph.make_unique_tensor_name(candidate_name) - - if unique_name is not candidate_name: - self.logger.warning( - f"candidate_name {candidate_name} is already used by " - f"tensor {subgraph.tensors.index(tensor)}, " - f"defaulting to {unique_name}" - ) - - tensor.name = unique_name - - def mutate(self, op): - if len(op.outputs) == 1: - self.__mutate_tensor_name(op.outputs[0], f"{op.name}/output") - else: - for j, tensor in enumerate(op.outputs): - self.__mutate_tensor_name(tensor, f"{op.name}/output_{j}") diff --git a/tflite2xcore/tflite2xcore/transformation_passes/reshape_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/reshape_passes.py deleted file mode 100644 index 995fd3fd6..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/reshape_passes.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np - -from tflite2xcore.xcore_schema import BuiltinOpCodes -from tflite2xcore.xcore_model import Operator - -from .transformation_passes import OperatorMatchingPass - - -class AdjacentReshapeMatchingPass(OperatorMatchingPass): - @property - def MATCHING_OPCODES(self): - return (BuiltinOpCodes.FULLY_CONNECTED,) - - @property - def _reshape_op(self): - return self._op.inputs[0].producers[0] - - def match(self, op: Operator) -> bool: - if super().match(op) and op.operator_code.code in self.MATCHING_OPCODES: - try: - with self.using(op): - reshape_op = self._reshape_op - except IndexError: - return False - - return ( - reshape_op.operator_code.code is BuiltinOpCodes.RESHAPE - and reshape_op.inputs[0].shape[0] == reshape_op.outputs[0].shape[0] - ) - - return False - - -class RemoveSubsequentReshapePass(AdjacentReshapeMatchingPass): - @property - def _reshape_op(self): - return self._op.outputs[0].consumers[0] - - def match(self, op: Operator) -> bool: - if super().match(op): - with self.using(op): - if len(self._reshape_op.inputs[0].consumers) == 1: - return True - self.logger.warning( - "Subsequent RESHAPE found with more than 1 consumer" - ) - return False - - def mutate(self, op: Operator) -> None: - with self.using(op): - reshape_op = self._reshape_op - - # Remove connection from old output to the anchor op - # then create the new connection - op.outputs[0].producers.remove(op) - op.outputs[0] = reshape_op.outputs[0] - op.outputs[0].producers.append(op) - - op.subgraph.remove_operator(reshape_op) - - -class RemovePrecedingReshapePass(AdjacentReshapeMatchingPass): - def mutate(self, op: Operator) -> None: - reshape_op = op.inputs[0].producers[0] - - # Remove connection from old input to the anchor op - # then create the new connection - op.inputs[0].consumers.remove(op) - op.inputs[0] = reshape_op.inputs[0] - op.inputs[0].consumers.append(op) - - -class CanonicalizeReshapePass(OperatorMatchingPass): - def match(self, op: Operator) -> bool: - if not (super().match(op) and op.operator_code.code is BuiltinOpCodes.RESHAPE): - return False - - try: - if list(op.builtin_options["new_shape"]) != list(op.outputs[0].shape): - raise ValueError( - "new_shape option to RESHAPE doesn't match output tensor shape" - ) - except (KeyError, TypeError): - # in tf2.2 the builtin options seems unused - self.logger.debug( - "Expected new_shape option to RESHAPE was not found " - "(ensure you are running tf2.2 or newer)" - ) - - if -1 in op.inputs[0].shape + op.outputs[0].shape: - self.logger.warning("Dynamically sized tensors are not supported") - return False - - assert np.prod(op.inputs[0].shape) == np.prod( - op.outputs[0].shape - ), "RESHAPE input and output shapes are not consistent" - - # NOTE: we used to check if op.inputs[1] is constant - # However since we neither we or the runtime currently supports - # dynamic shapes, this is disabled for now to enable better - # conversion of certain models (e.g. mobilenet v1) in tf2.3> - return len(op.inputs) == 2 - - def mutate(self, op: Operator) -> None: - # Remove connection between RESHAPE and input tensor[1], the new shape - op.inputs[1].consumers.remove(op) - op.inputs = op.inputs[:1] diff --git a/tflite2xcore/tflite2xcore/transformation_passes/scratch_memory_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/scratch_memory_passes.py deleted file mode 100644 index 6b2cc89ed..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/scratch_memory_passes.py +++ /dev/null @@ -1,167 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from abc import abstractmethod -from typing import Tuple - -from tflite2xcore.xcore_schema import XCOREOpCodes, Operator, Tensor, Buffer -from tflite2xcore.parallelization import CHANNEL_GROUP_SIZE -from tflite2xcore.xcore_schema.operator_code import OperatorCode - -from .transformation_passes import OperatorMatchingPass, TensorMatchingPass - - -class ScratchMemoryCalculationPass(OperatorMatchingPass): - @property - def _input(self): - return self._op.inputs[0] - - @property - def _weights(self): - return self._op.inputs[1] - - @property - def _biases(self): - return self._op.inputs[2] - - @property - @abstractmethod - def MATCHING_OPCODES(self) -> Tuple[XCOREOpCodes, ...]: - return tuple() - - def match(self, op: Operator) -> bool: - return ( - super().match(op) - and op.operator_code.code in self.MATCHING_OPCODES - and "mem" not in op.custom_options - ) - - @property - def _bias_scratch_size(self) -> int: - _, Bv, Bl = self._biases.shape - return Bv * Bl * self._biases.type.sizeof() - - @property - @abstractmethod - def _weights_scratch_size(self) -> int: - raise NotImplementedError() - - def mutate(self, op: Operator) -> None: - with self.using(op): - op.add_custom_options( - mem=[self._weights_scratch_size, self._bias_scratch_size] - ) - - -class ScratchMemoryFullyConnectedPass(ScratchMemoryCalculationPass): - MATCHING_OPCODES = (XCOREOpCodes.XC_fc,) - - @property - def _weights_scratch_size(self) -> int: - Cout, Cin = self._weights.shape - - custom_options = self._op.custom_options - if "par" in custom_options: - # NOTE: number of channel groups is at least number of threads - i_cg = custom_options["par"]["th"] - return Cin * (custom_options["par"]["cg"][i_cg - 1][1] + 1) - else: - return Cin * Cout - - @property - def _bias_scratch_size(self) -> int: - _, Bv, Bl = self._biases.shape - - custom_options = self._op.custom_options - if "par" in custom_options: - # NOTE: number of channel groups is at least number of threads - i_cg = custom_options["par"]["th"] - return Bv * Bl * self._biases.type.sizeof() * i_cg - else: - return Bv * Bl * self._biases.type.sizeof() - - -class Conv2dScratchMemoryCalculationPass(ScratchMemoryCalculationPass): - @property - @abstractmethod - def _kernel_size(self) -> Tuple[int, int]: - raise NotImplementedError() - - @property - def _max_channel_group_size(self): - custom_options = self._op.custom_options - if "par" in custom_options: - max_cg_size = max([cg[1] - cg[0] + 1 for cg in custom_options["par"]["cg"]]) - else: - max_cg_size = CHANNEL_GROUP_SIZE - - return max_cg_size - - @property - def _weights_scratch_size(self) -> int: - _, _, _, Cin = self._input.shape - Kh, Kw = self._kernel_size - return Cin * Kh * Kw * self._max_channel_group_size - - -class ScratchMemoryConv2dPass(Conv2dScratchMemoryCalculationPass): - MATCHING_OPCODES = ( - XCOREOpCodes.XC_conv2d_deep, - XCOREOpCodes.XC_conv2d_shallowin, - ) - - @property - def _kernel_size(self) -> Tuple[int, int]: - return self._weights.shape[1:3] - - -class ScratchMemoryDepthwiseConv2dPass(Conv2dScratchMemoryCalculationPass): - MATCHING_OPCODES = (XCOREOpCodes.XC_conv2d_depthwise,) - - @property - def _kernel_size(self) -> Tuple[int, int]: - return self._weights.shape[0:2] - - @property - def _weights_scratch_size(self) -> int: - Kh, Kw = self._kernel_size - return Kh * Kw * self._max_channel_group_size - - -class ScratchMemoryConv2d1x1Pass(Conv2dScratchMemoryCalculationPass): - MATCHING_OPCODES = (XCOREOpCodes.XC_conv2d_1x1,) - - @property - def _kernel_size(self) -> Tuple[int, int]: - return 1, 1 - - -class InsertExternalMemoryFetchPass(TensorMatchingPass): - MATCHING_OPCODES = ( - XCOREOpCodes.XC_bconv2d_bin, - XCOREOpCodes.XC_bconv2d_bin_DI, - XCOREOpCodes.XC_bconv2d_int8, - XCOREOpCodes.XC_bconv2d_int8_DIDO, - ) - - def match(self, tensor: Tensor) -> bool: - if super().match(tensor) and tensor.is_constant and len(tensor.consumers) == 1: - consumer = tensor.consumers[0] - return consumer.operator_code.code in self.MATCHING_OPCODES - return False - - def mutate(self, tensor: Tensor) -> None: - subgraph = tensor.subgraph - - # clone the constant tensor, rename the original, remove old buffer - new_tensor = subgraph.clone_tensor(tensor) - tensor.name = subgraph.make_unique_tensor_name(tensor.name) - tensor.buffer.owners = [] - tensor.buffer = Buffer(tensor.model, owners=[tensor]) - - # create and insert fetch op - fetch_op = subgraph.create_operator( - OperatorCode(XCOREOpCodes.XC_fetch), inputs=[new_tensor], outputs=[tensor] - ) - fetch_op.name = f"{new_tensor.name}/fetch" - subgraph.insert_operator(tensor.consumers[0], fetch_op) diff --git a/tflite2xcore/tflite2xcore/transformation_passes/transformation_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/transformation_passes.py deleted file mode 100644 index 77e43604c..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/transformation_passes.py +++ /dev/null @@ -1,512 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import logging -import numpy as np -from abc import ABC, abstractmethod -from contextlib import contextmanager -from typing import Any - -from tflite2xcore.xcore_schema import TensorType, OperatorCode, Operator, Buffer -from tflite2xcore.utils import ACC_PERIOD_INT8, format_array - - -class ModelTransformationPass(ABC): - def __init__(self): - self.logger = logging.getLogger(self.__class__.__name__) - - def _sanity_check(self, obj): - if __debug__: - try: - obj.sanity_check() - except AssertionError as e: - self.logger.exception(e) - - @abstractmethod - def run(self, model): - return 0 - - def __str__(self): - return self.__class__.__name__ - - -class SubgraphPass(ModelTransformationPass): - def __init__(self, *args: Any, **kwargs: Any): - super().__init__(*args, **kwargs) - self._subgraph_idx = -1 - self._obj_index = -1 - self._num_matches = 0 - - @abstractmethod - def match(self, obj) -> bool: - return True - - @abstractmethod - def target_iterable(self, subgraph): - pass - - def log_match(self, obj): - self.logger.debug(f"matched {obj}") - - @abstractmethod - def run_subgraph(self, subgraph): - pass - - def run(self, model): - modified_cnt = 0 - for self._subgraph_idx, subgraph in enumerate(model.subgraphs): - self.logger.debug(f"running on subgraph {self._subgraph_idx}") - if self.run_subgraph(subgraph): - modified_cnt += 1 - - self._subgraph_idx = -1 - return modified_cnt - - -class SubgraphAnalysisPass(SubgraphPass): - def run_subgraph(self, subgraph): - self._num_matches = 0 - for self._obj_index, obj in enumerate(self.target_iterable(subgraph)): - if self.match(obj): - self._num_matches += 1 - self.log_match(obj) - self._sanity_check(obj) - return 0 - - -class SubgraphTransformationPass(SubgraphPass): - @abstractmethod - def mutate(self, obj): - pass - - def run_subgraph(self, subgraph): - self._num_matches = 0 - while True: - for self._obj_index, obj in enumerate(self.target_iterable(subgraph)): - if self.match(obj): - self._num_matches += 1 - self.log_match(obj) - self._sanity_check(obj) - self.mutate(obj) - self._sanity_check(subgraph) - break - else: - self._obj_index = -1 - return self._num_matches - - -class OperatorMatchingPass(SubgraphTransformationPass): - _op: Operator - - def __init__(self, *args: Any, **kwargs: Any): - super().__init__(*args, **kwargs) - self._op = None - - def target_iterable(self, subgraph): - return subgraph.operators - - @contextmanager - def using(self, op): - self._op, original_op = op, self._op - yield - self._op = original_op - - def log_match(self, op): - super().log_match(f"operator [{self._obj_index}]: {op.operator_code}") - - -class TensorMatchingPass(SubgraphTransformationPass): - def target_iterable(self, subgraph): - return subgraph.tensors - - def log_match(self, tensor): - super().log_match(f"tensor [{self._obj_index}]: {tensor.name}") - - -class BufferMatchingPass(ModelTransformationPass): - def __init__(self, *args: Any, **kwargs: Any): - super().__init__(*args, **kwargs) - self._buffer_idx = -1 - - @abstractmethod - def match(self, buffer): - return True - - @abstractmethod - def mutate(self, buffer): - pass - - def log_match(self, buffer): - self.logger.debug( - f"matched buffer [{self._buffer_idx}] of length " - f"{len(buffer)} with {len(buffer.owners)} owners" - ) - - def run(self, model): - modified_cnt = 0 - while True: - for self._buffer_idx, buffer in enumerate(model.buffers): - if self.match(buffer): - self.log_match(buffer) - modified_cnt += 1 - - self._sanity_check(buffer) - self.mutate(buffer) - self._sanity_check(model) - break - else: - self._buffer_idx = -1 - return modified_cnt - - -# TODO: add tests -class CanonicalizeEmptyBuffersPass(ModelTransformationPass): - def run(self, model): - if model.buffers: - sentinel = model.buffers[0] - if not sentinel: # buffer 0 has to be empty - for tensor in sentinel.owners: - tensor.buffer = Buffer(model) - tensor.buffer.owners.append(tensor) - del model.buffers[0] - return 1 - return 0 - - -class InputTensorMatchingPass(SubgraphTransformationPass): - def target_iterable(self, subgraph): - return subgraph.inputs - - def log_match(self, tensor): - super().log_match(f"input [{self._obj_index}]: {tensor.name}") - - -class OutputTensorMatchingPass(SubgraphTransformationPass): - def target_iterable(self, subgraph): - return subgraph.outputs - - def log_match(self, tensor): - super().log_match(f"output [{self._obj_index}]: {tensor.name}") - - -class QuantizedOperatorMatchingPass(OperatorMatchingPass): - @property - def _output(self): - return self._op.outputs[0] - - @property - def _input(self): - return self._op.inputs[0] - - @property - def _input_zero_point(self): - return int(self._input.quantization["zero_point"][0]) - - @property - def _output_zero_point(self): - return int(self._output.quantization["zero_point"][0]) - - @property - @abstractmethod - def matching_opcode(self): - raise NotImplementedError() - - @property - def matching_input_type(self) -> TensorType: - return TensorType.INT8 - - @property - def matching_output_type(self) -> TensorType: - return TensorType.INT8 - - def match(self, op): - if super().match(op) and op.operator_code.code is self.matching_opcode: - with self.using(op): - return ( - self._input.type is self.matching_input_type - and self._output.type is self.matching_output_type - ) - return False - - -class ReplaceQuantizedOperatorPass(QuantizedOperatorMatchingPass): - @property - @abstractmethod - def new_opcode(self) -> OperatorCode: - raise NotImplementedError() - - def mutate(self, op): - new_op = op.subgraph.create_operator( - self.new_opcode, inputs=op.inputs, outputs=op.outputs - ) - new_op.subgraph.replace_operator(op, new_op) - return new_op - - -class ReplaceQuantizedWeightBiasOperatorPass(ReplaceQuantizedOperatorPass): - @property - def _weights(self): - return self._op.inputs[1] - - @property - def _biases(self): - return self._op.inputs[2] - - @property - def matching_biases_type(self) -> TensorType: - return TensorType.INT32 - - @property - def matching_weights_type(self) -> TensorType: - return TensorType.INT8 - - def _match_non_weight_inputs(self) -> bool: - try: - return ( - self._biases.type is self.matching_biases_type - and self._biases.is_constant - and self._biases not in self._op.subgraph.outputs - ) - except IndexError: - # if bias is missing, the operator should match - return True - - def match(self, op): - with self.using(op): - return ( - super().match(op) - and self._weights.type is self.matching_weights_type - # NOTE: the current implementations don't allow mutating ops - # if one of the parameter tensors is an output or not constant - and self._weights.is_constant - and self._weights not in op.subgraph.outputs - and self._match_non_weight_inputs() - ) - - -class ReplaceXCWeightBiasOperatorPass(ReplaceQuantizedWeightBiasOperatorPass): - def mutate(self, op): - new_op = super().mutate(op) - new_op.add_custom_options(illegal_params=True) - return new_op - - -# TODO: refactor properties -class LegalizeWeightBiasPass(QuantizedOperatorMatchingPass): - @property - def _biases(self): - return self._op.inputs[2] - - @property - def _weights(self): - return self._op.inputs[1] - - @abstractmethod - def mutate_biases(self, op): - pass - - @abstractmethod - def mutate_weights(self, op): - pass - - def _replace_weights(self, arr) -> None: - # create and populate new weight tensor - subgraph = self._op.subgraph - new_weights = subgraph.create_tensor( - f"{self._op.name}/weights", - TensorType.from_numpy_dtype(arr.dtype), - arr.shape, - consumers=[self._op], - ) - new_weights.buffer.data = arr - - # replace old tensor - self._weights.consumers.remove(self._op) - self._op.inputs[1] = new_weights - - def match(self, op) -> bool: - if super().match(op) and "illegal_params" in op.custom_options: - return op.custom_options["illegal_params"] - return False - - def mutate(self, op): - # NOTE: the order of these mutations is strict - self.mutate_biases(op) - self.mutate_weights(op) - op.custom_options.pop("illegal_params") - return op - - -class LegalizeXCWeightBiasPass(LegalizeWeightBiasPass): - def _multiplier(self): - output_scale = self._output.quantization["scale"][0] - bias_scale = np.array(self._biases.quantization["scale"]) - return bias_scale / output_scale - - @abstractmethod - def _zero_point_bias(self): - pass - - def _unified_bias(self): - arr_64 = self._biases.as_array(np.int64) - self._zero_point_bias().astype( - np.int64 - ) - arr_32 = np.clip(arr_64, -(2 ** 31), 2 ** 31 - 1).astype(np.int32) - if np.any(arr_32 != arr_64): - self.logger.warning("_unified_bias saturated 32 bit!") - return arr_32 - - @staticmethod - def __pad_to_acc_period(arr): - pad = ACC_PERIOD_INT8 - 1 - (arr.shape[0] - 1) % ACC_PERIOD_INT8 - return np.pad(arr, pad_width=[(0, pad)]) - - def _bias_arr(self): - # calculate bias values with the effect of quantization changes - bias = self._unified_bias() - - # zero pad and reshape - bias = self.__pad_to_acc_period(bias) - - # splitting lower and upper 16 bits of each 32 bit value - tmp_shape = (bias.shape[0] // ACC_PERIOD_INT8, ACC_PERIOD_INT8, -1) - new_bias = np.frombuffer(bias.flatten().tobytes(), dtype=np.int16).reshape( - tmp_shape - ) - return np.stack([new_bias[:, :, 1], new_bias[:, :, 0]], axis=1) - - @property - def _SHIFT_ADJUSTMENT(self): - # NOTE: If we would not need to add the offset separately, the intermediate - # could never saturate, and this value would be 8. But decreasing to 7 - # means that we get an extra bit of headroom in the intermediate. - # TODO: investigate if this could be calculated/estimated from the parameters - return 7 - - def _shift_scale(self): - multiplier = self._multiplier() - # NOTE: VLMUL expects one factor in Q2.14 - # we have 1 <= scale < 2 represented in Q2.14 - - multiplier_mask = multiplier != 0 - rshift = np.full(multiplier.shape, 16) - rshift[multiplier_mask] = -np.ceil(np.log2(multiplier[multiplier_mask])) + 1 - scale = np.full(multiplier.shape, 2 ** 15 - 1) - scale[multiplier_mask] = np.round( - multiplier[multiplier_mask] * 2 ** (14 + rshift[multiplier_mask]) - ) - - for j in range(len(scale)): - if scale[j] == 2 ** 15: - rshift[j] -= 1 - scale[j] /= 2 - # we are using 16 bits instead of 8 so we need to adjust the shift - rshift[j] -= self._SHIFT_ADJUSTMENT - - bias_size = np.prod(self._biases.shape) - if len(scale) == 1: - rshift = np.repeat(rshift, bias_size) - scale = np.repeat(scale, bias_size) - rshift, scale = np.int16(rshift), np.int16(scale) - if rshift.shape != scale.shape: - raise ValueError( - f"Shift and scale shapes don't match: {rshift.shape} != {scale.shape}" - ) - return rshift, scale - - @property - def _OUTPUT_BITS(self): - return 8 - - @property - def _MAX_POST_SHIFT(self): - return 22 + self._SHIFT_ADJUSTMENT - self._OUTPUT_BITS - - def _scale_offset_arr(self): - # calculate right shift/scale - rshift, scale = self._shift_scale() - - # zero pad and reshape into appropriate array - rshift = self.__pad_to_acc_period(rshift) - scale = self.__pad_to_acc_period(scale) - - # split left and right shift into pre and post scaling shifts - shift_pre = np.maximum(rshift, 0) - shift_post = self._MAX_POST_SHIFT * np.ones( - rshift.shape, dtype=rshift.dtype - ) + np.minimum(rshift, 0) - if np.any(shift_post.flatten() < 0): - raise ValueError( - "Negative shift_post encountered: " f"{format_array(shift_post)}" - ) - - # calculate offset - raw_offset = ( - np.float64(self._output_zero_point) - * 2 ** shift_post.astype(np.float64) - * 2 ** (self._OUTPUT_BITS - 8) - ).flatten() - - offset_scale = np.round(np.sqrt(np.abs(raw_offset))).astype(np.int16) - offset = np.zeros(offset_scale.shape, dtype=offset_scale.dtype) - pos_ind = offset_scale > 0 - offset[pos_ind] = np.round(raw_offset[pos_ind] / offset_scale[pos_ind]).astype( - np.int16 - ) - - new_shape = (-1, ACC_PERIOD_INT8) - return np.stack( - [ - shift_pre.reshape(new_shape), - scale.reshape(new_shape), - offset_scale.reshape(new_shape), - offset.reshape(new_shape), - shift_post.reshape(new_shape), - ], - axis=1, - ) - - def _bso_arr(self): - return np.concatenate([self._bias_arr(), self._scale_offset_arr()], axis=1) - - def __add_const_zero_bias(self): - out_channels = self._output.shape[-1] - input_scale = self._input.quantization["scale"][0] - new_biases = self._op.subgraph.create_tensor( - f"{self._op.name}/const_zero_bias", - TensorType.INT32, - shape=(out_channels,), - consumers=[self._op], - quantization={ - "scale": [ - input_scale * weight_scale - for weight_scale in self._weights.quantization["scale"] - ], - "zero_point": [0] * out_channels, - }, - ) - new_biases.buffer.data = np.zeros(new_biases.shape, dtype=np.int32) - self._op.inputs.append(new_biases) - - def mutate_biases(self, op): - with self.using(op): - try: - self._biases - except IndexError: - self.__add_const_zero_bias() - - # calculate the bias/scale/offset tensor - bso = self._bso_arr() - - # create and populate new bias tensor - new_biases = self._op.subgraph.create_tensor( - f"{self._op.name}/bias_shift_scale", - TensorType.INT16, - bso.shape, - consumers=[self._op], - ) - new_biases.buffer.data = bso - - # replace old tensor - self._biases.consumers.remove(self._op) - self._op.inputs[2] = new_biases diff --git a/tflite2xcore/tflite2xcore/transformation_passes/warning_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/warning_passes.py deleted file mode 100644 index 3d70214c8..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/warning_passes.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from typing import Iterable - -from tflite2xcore.xcore_model import Tensor, Subgraph -from tflite2xcore.xcore_schema import TensorType - -from .transformation_passes import SubgraphAnalysisPass - - -class FloatingPointWarningPass(SubgraphAnalysisPass): - def match(self, tensor: Tensor) -> bool: - return super().match(tensor) and tensor.type in ( - TensorType.FLOAT64, - TensorType.FLOAT32, - TensorType.FLOAT16, - ) - - def target_iterable(self, subgraph: Subgraph) -> Iterable[Tensor]: - return subgraph.tensors - - def log_match(self, tensor: Tensor) -> None: - self.logger.info(f"Floating Point Tensor: {tensor}") - - def run_subgraph(self, subgraph: Subgraph) -> int: - super().run_subgraph(subgraph) - if self._num_matches: - self.logger.warning(f"Floating Point Tensors Found: {self._num_matches}") - return 0 diff --git a/tflite2xcore/tflite2xcore/transformation_passes/word_alignment_passes.py b/tflite2xcore/tflite2xcore/transformation_passes/word_alignment_passes.py deleted file mode 100644 index 163678cbc..000000000 --- a/tflite2xcore/tflite2xcore/transformation_passes/word_alignment_passes.py +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np -from copy import deepcopy - -from tflite2xcore.xcore_schema import TensorType, BuiltinOpCodes, OperatorCode - -from .transformation_passes import QuantizedOperatorMatchingPass - - -class CanonicalizeConv2DInputChannels(QuantizedOperatorMatchingPass): - @property - def _weights(self): - return self._op.inputs[1] - - @property - def _biases(self): - return self._op.inputs[2] - - @property - def matching_opcode(self): - return BuiltinOpCodes.CONV_2D - - def match(self, op): - if super().match(op): - with self.using(op): - input_shape = self._input.shape - return ( - len(input_shape) == 4 - and input_shape[-1] % 4 - # NOTE: the current implementation doesn't allow mutating - # if the weight tensor is an output or not a constant - and self._weights.is_constant - and self._weights not in op.subgraph.outputs - ) - return False - - def mutate(self, op): - subgraph = op.subgraph - - with self.using(op): - old_weight_tensor = self._weights - old_shape = old_weight_tensor.shape - new_shape = [*old_shape[:3], int(4 * np.ceil(old_shape[3] / 4))] - pad_size = new_shape[3] - old_shape[3] - - pads = [[0, 0], [0, 0], [0, 0], [0, pad_size]] - - # create new zero padded kernel tensor - # TODO: this could be done better if we had constant folding, by - # adding an appropriate padding op between the original and - # the new weights, and let it be folded later. - # (this would also work if the weight/bias is an input/output) - new_weight_tensor = subgraph.create_tensor( - f"{self._op.name}/weights", - old_weight_tensor.type, - new_shape, - quantization=old_weight_tensor.quantization, - consumers=[self._op], - ) - new_weight_tensor.buffer.data = np.pad(self._weights.as_array(), pads) - - # rewire old and new kernel tensors - old_weight_tensor.consumers.remove(self._op) - self._op.inputs[1] = new_weight_tensor - - # create new channel-wise padding operator - old_input = self._input - pad_op = subgraph.create_operator( - OperatorCode(BuiltinOpCodes.PAD), inputs=[old_input] - ) - subgraph.insert_operator(self._op, pad_op) - old_input.consumers.remove(self._op) - - # create paddings tensor and connect to op - paddings_tensor = subgraph.create_tensor( - f"{pad_op.name}/paddings", - TensorType.INT32, - shape=[4, 2], - consumers=[pad_op], - ) - paddings_tensor.buffer.data = np.int32(pads) - pad_op.inputs.append(paddings_tensor) - - # create intermediate tensor and wire up to conv and pad ops - self._op.inputs[0] = subgraph.create_tensor( - f"{self._op.name}/xc_padded_input", - TensorType.INT8, - shape=[*old_input.shape[:3], new_shape[3]], - producers=[pad_op], - consumers=[self._op], - quantization=deepcopy(old_input.quantization), - ) - pad_op.outputs.append(self._op.inputs[0]) diff --git a/tflite2xcore/tflite2xcore/utils.py b/tflite2xcore/tflite2xcore/utils.py deleted file mode 100644 index faf49a889..000000000 --- a/tflite2xcore/tflite2xcore/utils.py +++ /dev/null @@ -1,392 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import os -import re -import random -import argparse -import logging -import numpy as np -import tensorflow as tf -from math import log2, ceil -from functools import wraps -from types import TracebackType -from typing import ( - Union, - Optional, - Dict, - Any, - TypeVar, - Callable, - cast, - Type, - NamedTuple, - Iterator, - List, - Tuple, -) - -# ----------------------------------------------------------------------------- -# WIDELY USED TYPES AND TYPING HELPERS -# ----------------------------------------------------------------------------- - -_T = TypeVar("_T") - - -def asserting_cast(t: Type[_T], x: Any) -> _T: - """WARNING: this function should be used sparingly!""" - assert isinstance(x, t), type(x) - return x - - -class QuantizationTuple(NamedTuple): - scale: float - zero_point: int - - -TFLiteModel = Union[bytes, bytearray] -PaddingTuple = Tuple[Tuple[int, int], ...] -ShapeTuple = Tuple[int, ...] - - -# ----------------------------------------------------------------------------- -# XCORE MAGIC NUMBERS -# ----------------------------------------------------------------------------- - -ACC_PERIOD_INT8 = 16 - -WORD_SIZE_BYTES = 4 -WORD_SIZE_BITS = WORD_SIZE_BYTES * 8 -VECTOR_SIZE_WORDS = 8 -VECTOR_SIZE_BYTES = VECTOR_SIZE_WORDS * 4 -VECTOR_SIZE_BITS = VECTOR_SIZE_BYTES * 8 - -# ----------------------------------------------------------------------------- -# REPRODUCIBILITY -# ----------------------------------------------------------------------------- - -DEFAULT_SEED = 123 - - -def set_all_seeds(seed: int = DEFAULT_SEED) -> None: - tf.random.set_seed(seed) - np.random.seed(seed) - random.seed(seed) - - -def set_gpu_usage(use_gpu: bool, verbose: Union[bool, int]) -> None: - # can throw annoying error if CUDA cannot be initialized - try: - default_log_level = os.environ["TF_CPP_MIN_LOG_LEVEL"] - if not verbose: - os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" - gpus = tf.config.experimental.list_physical_devices("GPU") - os.environ["TF_CPP_MIN_LOG_LEVEL"] = default_log_level - except KeyError: - gpus = tf.config.experimental.list_physical_devices("GPU") - - if gpus: - if use_gpu: - for gpu in gpus: - tf.config.experimental.set_memory_growth(gpu, enable=True) - else: - logging.info("GPUs disabled.") - tf.config.experimental.set_visible_devices([], "GPU") - elif use_gpu: - logging.warning("No available GPUs found, defaulting to CPU.") - logging.debug(f"Eager execution enabled: {tf.executing_eagerly()}") - - -# ----------------------------------------------------------------------------- -# LOGGING & STRING FORMATTING -# ----------------------------------------------------------------------------- - - -def set_verbosity(verbosity: int = 0) -> None: - verbosities = [logging.WARNING, logging.INFO, logging.DEBUG] - verbosity = min(verbosity, len(verbosities) - 1) - - logging.basicConfig(level=verbosities[verbosity]) - if not verbosity: - logging.getLogger("tensorflow").setLevel(logging.ERROR) - - -class VerbosityParser(argparse.ArgumentParser): - def __init__( - self, - *args: Any, - verbosity_config: Optional[Dict[str, Any]] = None, - **kwargs: Any, - ) -> None: - self.logger = logging.getLogger(self.__class__.__name__) - kwargs.setdefault("formatter_class", argparse.ArgumentDefaultsHelpFormatter) - kwargs.setdefault("conflict_handler", "resolve") - super().__init__(*args, **kwargs) - - verbosity_config = verbosity_config or dict() - verbosity_config.setdefault("action", "count") - verbosity_config.setdefault("default", 0) - verbosity_config.setdefault( - "help", - "Set verbosity level. " - "-v: summary info of mutations; -vv: detailed mutation and debug info.", - ) - self.add_argument("-v", "--verbose", **verbosity_config) - - def parse_args(self, *args, **kwargs): # type: ignore - args = super().parse_args(*args, **kwargs) - set_verbosity(args.verbose) # type: ignore - set_gpu_usage(args.use_gpu if hasattr(args, "use_gpu") else False, args.verbose) # type: ignore - return args - - -def snake_to_camel(word: str) -> str: - output = "".join(x.capitalize() or "_" for x in word.split("_")) - return output[0].lower() + output[1:] - - -def camel_to_snake(name: str) -> str: - name = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", name) - return re.sub("([a-z0-9])([A-Z])", r"\1_\2", name).lower() - - -def format_array(arr: np.ndarray, style: str = "") -> str: - msg = f"numpy.ndarray, shape={arr.shape}, dtype={arr.dtype}:\n" - if style.endswith("_scale_offset_arr"): - msg += f"shift_pre:\n{arr[:, 0]}\n" - msg += f"scale:\n{arr[:, 1]}\n" - msg += f"offset_scale:\n{arr[:, 2]}\n" - msg += f"offset:\n{arr[:, 3]}\n" - msg += f"shift_post:\n{arr[:, 4]}" - else: - msg += f"{arr}" - return msg + "\n" - - -_RT = TypeVar("_RT") -_DecoratedFunc = TypeVar("_DecoratedFunc", bound=Callable[..., _RT]) - - -def log_method_output( - level: int = logging.DEBUG, logger: Optional[logging.Logger] = None -) -> Callable[[_DecoratedFunc], _DecoratedFunc]: - def _log_method_output(func: _DecoratedFunc) -> _DecoratedFunc: - @wraps(func) - def wrapper(self: Any, *args: Any, **kwargs: Any) -> _RT: - try: - logger = logger or self.logger - except AttributeError: - logger = logging.getLogger() - - out: _RT = func(self, *args, **kwargs) - msg = f"{func.__name__} output:\n" - if isinstance(out, np.ndarray): - msg += format_array(out, func.__name__) - else: - msg += f"{out}\n" - - logger.log(level, msg) - return out - - return cast(_DecoratedFunc, wrapper) - - return _log_method_output - - -class LoggingContext: - def __init__( - self, - logger: logging.Logger, - level: Optional[int] = None, - handler: Optional[logging.Handler] = None, - close: bool = True, - ) -> None: - self.logger = logger - self.level = level - self.handler = handler - self.close = close - - def __enter__(self) -> None: - if self.level is not None: - self.old_level = self.logger.level - self.logger.setLevel(self.level) - if self.handler: - self.logger.addHandler(self.handler) - - def __exit__( - self, - exception_type: Optional[Type[BaseException]], - exception_value: Optional[BaseException], - traceback: Optional[TracebackType], - ) -> None: - if self.level is not None: - self.logger.setLevel(self.old_level) - if self.handler: - self.logger.removeHandler(self.handler) - if self.handler and self.close: - self.handler.close() - - -# ----------------------------------------------------------------------------- -# BINARY OPERATION HELPERS -# ----------------------------------------------------------------------------- - - -def unpack_bits(arr: np.ndarray) -> np.ndarray: - assert arr.dtype == np.int32 - unpacked_shape = (*arr.shape[:-1], arr.shape[-1] * WORD_SIZE_BITS) - return np.unpackbits( # pylint: disable=no-member - np.frombuffer(arr.tobytes(), dtype=np.uint8) - ).reshape(unpacked_shape) - - -def xor_popcount(a: np.ndarray, b: np.ndarray) -> int: - assert a.dtype == b.dtype == np.int32 - return np.count_nonzero(unpack_bits(np.bitwise_xor(a, b))) # type: ignore - - -def clrsb(a: int, bitwidth: int = 32) -> int: - """ counts leading redundant sign bits """ - return bitwidth - ceil(log2(abs(a))) - 1 - - -# ----------------------------------------------------------------------------- -# QUANTIZATION HELPERS -# ----------------------------------------------------------------------------- - - -def quantize( - arr: np.ndarray, - scale: float, - zero_point: int, - dtype: Union[type, "np.dtype"] = np.int8, -) -> np.ndarray: - t = np.round(np.float32(arr) / np.float32(scale)).astype(np.int32) + zero_point - return np.clip(t, np.iinfo(dtype).min, np.iinfo(dtype).max).astype(dtype) - - -def dequantize(arr: np.ndarray, scale: float, zero_point: int) -> np.ndarray: - return np.float32(arr.astype(np.int32) - np.int32(zero_point)) * np.float32(scale) - - -# ----------------------------------------------------------------------------- -# MODEL CONVERSION AND EVALUATION HELPERS -# ----------------------------------------------------------------------------- - - -def quantize_converter( - converter: tf.lite.TFLiteConverter, - representative_data: Union[tf.Tensor, np.ndarray], - *, - show_progress_step: int = 0, -) -> None: - converter.optimizations = [tf.lite.Optimize.DEFAULT] - converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] - converter.inference_input_type = tf.int8 - converter.inference_output_type = tf.int8 - x_train_ds = tf.data.Dataset.from_tensor_slices(representative_data).batch(1) - - def representative_data_gen() -> Iterator[List[tf.Tensor]]: - for j, input_value in enumerate(x_train_ds.take(representative_data.shape[0])): - if show_progress_step and (j + 1) % show_progress_step == 0: - logging.info( - "Converter quantization processed examples " - f"{j+1:6d}/{representative_data.shape[0]}" - ) - yield [input_value] - - converter.representative_dataset = representative_data_gen - - -def apply_interpreter_to_examples( - interpreter: tf.lite.Interpreter, - examples: Union[tf.Tensor, np.ndarray], - *, - interpreter_input_ind: Optional[int] = None, - interpreter_output_ind: Optional[int] = None, - show_progress_step: int = 0, - show_pid: bool = False, -) -> np.ndarray: - interpreter.allocate_tensors() - if interpreter_input_ind is None: - interpreter_input_ind = interpreter.get_input_details()[0]["index"] - if interpreter_output_ind is None: - interpreter_output_ind = interpreter.get_output_details()[0]["index"] - - outputs = [] - for j, x in enumerate(examples): - if show_progress_step and (j + 1) % show_progress_step == 0: - if show_pid: - logging.info( - f"(PID {os.getpid()}) Evaluated examples {j+1:6d}/{examples.shape[0]}" - ) - else: - logging.info(f"Evaluated examples {j+1:6d}/{examples.shape[0]}") - interpreter.set_tensor(interpreter_input_ind, np.expand_dims(x, 0)) - interpreter.invoke() - y = interpreter.get_tensor(interpreter_output_ind) - outputs.append(y) - - return np.vstack(outputs) if isinstance(examples, np.ndarray) else outputs - - -def quantize_keras_model( - model: tf.keras.Model, - representative_data: Union[tf.Tensor, np.ndarray], - show_progress_step: int = 0, -) -> TFLiteModel: - converter = tf.lite.TFLiteConverter.from_keras_model(model) - quantize_converter( - converter, representative_data, show_progress_step=show_progress_step - ) - return converter.convert() # type: ignore - - -# ----------------------------------------------------------------------------- -# SHAPE COMPUTATION HELPERS -# ----------------------------------------------------------------------------- - - -def _calculate_valid_output_size(in_size: int, stride: int, k_dim: int) -> int: - assert in_size >= k_dim - return ceil((in_size - k_dim + 1) / stride) - - -def calculate_valid_output_size( - input_size: ShapeTuple, strides: ShapeTuple, kernel_size: ShapeTuple -) -> ShapeTuple: - return tuple( - _calculate_valid_output_size(*t) for t in zip(input_size, strides, kernel_size) - ) - - -def _calculate_same_output_size(in_size: int, stride: int) -> int: - return ceil(in_size / stride) - - -def calculate_same_output_size( - input_size: ShapeTuple, strides: ShapeTuple -) -> ShapeTuple: - return tuple(_calculate_same_output_size(*t) for t in zip(input_size, strides)) - - -def calculate_same_padding( - input_size: ShapeTuple, strides: ShapeTuple, kernel_size: ShapeTuple -) -> PaddingTuple: - def calc_axis_pad(in_size: int, stride: int, k_dim: int) -> Tuple[int, int]: - out_size = _calculate_same_output_size(in_size, stride) - total_pad = max((out_size - 1) * stride + k_dim - in_size, 0) - pad_start = total_pad // 2 - return (pad_start, total_pad - pad_start) - - return tuple(calc_axis_pad(*t) for t in zip(input_size, strides, kernel_size)) - - -def get_bitpacked_shape(shape: Tuple[int, ...]) -> Tuple[int, ...]: - channels = shape[-1] - assert channels % WORD_SIZE_BITS == 0 - return (*shape[:-1], channels // WORD_SIZE_BITS) - - -def get_unpacked_shape(shape: Tuple[int, ...]) -> Tuple[int, ...]: - return (*shape[:-1], shape[-1] * WORD_SIZE_BITS) diff --git a/tflite2xcore/tflite2xcore/version.py b/tflite2xcore/tflite2xcore/version.py deleted file mode 100644 index 5c231f2c9..000000000 --- a/tflite2xcore/tflite2xcore/version.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. -from contextlib import suppress - - -def get_version() -> str: - with suppress(Exception): - try: - # use setuptools_scm if installed - # setuptools_scm will append commit info the base version number - from setuptools_scm import get_version - - return get_version( - root="../..", relative_to=__file__, version_scheme="post-release" - ) - except ImportError: - # fall back to the builtin importlib_metadata module - # importlib_metadata returns the version number in the package metadata - from importlib_metadata import version - - try: - return version(__name__) - except: - return "Unable to determine version from package." diff --git a/tflite2xcore/tflite2xcore/xcore_model.py b/tflite2xcore/tflite2xcore/xcore_model.py deleted file mode 100644 index a976a3ee4..000000000 --- a/tflite2xcore/tflite2xcore/xcore_model.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from tflite2xcore.xcore_schema import * diff --git a/tflite2xcore/tflite2xcore/xcore_schema/README.md b/tflite2xcore/tflite2xcore/xcore_schema/README.md deleted file mode 100644 index 115eb1d42..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# Generating schema_py_generated.py - -## Install flatbuffers version 1.12.0 or newer - -Pull/Clone & checkout release branch - -Build latests flatc - - > mkdir buld - > cd build - > cmake ../ - > make install - -## Generate schema - -Run - - > ./flatc --python --gen-mutable --gen-object-api --no-includes path/to/schema.fbs - -Concat the generated .py files into a single module - - > find ./tflite -name '*.py' -exec cat {} + | sed '/import flatbuffers/d' | sed '/from flatbuffers.compat import import_numpy/d' | sed '/np = import_numpy()/d' | sed '/# namespace: tflite/d' | sed '/# automatically generated by the FlatBuffers compiler, do not modify/d' > schema_py_generated.py - -Add the following lines to schema_py_generated.py - - import flatbuffers - import numpy as np diff --git a/tflite2xcore/tflite2xcore/xcore_schema/__init__.py b/tflite2xcore/tflite2xcore/xcore_schema/__init__.py deleted file mode 100644 index 55504c46f..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from . import flexbuffers -from .tensor_type import TensorType -from .op_codes import BuiltinOpCodes, ExternalOpCodes, XCOREOpCodes -from .misc_enums import ( - QuantizationDetails, - ActivationFunctionType, - FullyConnectedOptionsWeightsFormat, - Padding, -) -from .builtin_options import BuiltinOptions - -from .ir_object import _IRObject, _ModelDependent, _SubgraphDependent -from .operator_code import OperatorCode, ValidOpCodes, CustomOpCodes -from .data_container import Buffer, Metadata, _DataContainer -from .operator import _OpOptionsType, Operator -from .tensor import Tensor, _ShapeInputType -from .subgraph import Subgraph - - -from .xcore_model import XCOREModel - -from . import xcore_model diff --git a/tflite2xcore/tflite2xcore/xcore_schema/builtin_options.py b/tflite2xcore/tflite2xcore/xcore_schema/builtin_options.py deleted file mode 100644 index d2669601f..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/builtin_options.py +++ /dev/null @@ -1,146 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -# type: ignore - -from enum import Enum - -from . import schema_py_generated as schema, BuiltinOpCodes - -BuiltinOptions = Enum( - "BuiltinOptions", - {k: v for k, v in vars(schema.BuiltinOptions).items() if not k.startswith("__")}, -) - -# this mapping should follow the schema and: -# tensorflow/tensorflow/lite/core/api/flatbuffer_conversions.cc -__BuiltinOptions_from_BuiltinOpCodes = { - BuiltinOpCodes.ADD: BuiltinOptions.AddOptions, - BuiltinOpCodes.AVERAGE_POOL_2D: BuiltinOptions.Pool2DOptions, - BuiltinOpCodes.CONCATENATION: BuiltinOptions.ConcatenationOptions, - BuiltinOpCodes.CONV_2D: BuiltinOptions.Conv2DOptions, - BuiltinOpCodes.DEPTHWISE_CONV_2D: BuiltinOptions.DepthwiseConv2DOptions, - BuiltinOpCodes.DEPTH_TO_SPACE: BuiltinOptions.DepthToSpaceOptions, - BuiltinOpCodes.DEQUANTIZE: BuiltinOptions.DequantizeOptions, - BuiltinOpCodes.EMBEDDING_LOOKUP: BuiltinOptions.NONE, - BuiltinOpCodes.FLOOR: BuiltinOptions.NONE, - BuiltinOpCodes.FULLY_CONNECTED: BuiltinOptions.FullyConnectedOptions, - BuiltinOpCodes.HASHTABLE_LOOKUP: BuiltinOptions.NONE, - BuiltinOpCodes.L2_NORMALIZATION: BuiltinOptions.L2NormOptions, - BuiltinOpCodes.L2_POOL_2D: BuiltinOptions.Pool2DOptions, - BuiltinOpCodes.LOCAL_RESPONSE_NORMALIZATION: BuiltinOptions.LocalResponseNormalizationOptions, - BuiltinOpCodes.LOGISTIC: BuiltinOptions.NONE, - BuiltinOpCodes.LSH_PROJECTION: BuiltinOptions.LSHProjectionOptions, - BuiltinOpCodes.LSTM: BuiltinOptions.LSTMOptions, - BuiltinOpCodes.MAX_POOL_2D: BuiltinOptions.Pool2DOptions, - BuiltinOpCodes.MUL: BuiltinOptions.MulOptions, - BuiltinOpCodes.RELU: BuiltinOptions.NONE, - BuiltinOpCodes.RELU_N1_TO_1: BuiltinOptions.NONE, - BuiltinOpCodes.RELU6: BuiltinOptions.NONE, - BuiltinOpCodes.RESHAPE: BuiltinOptions.ReshapeOptions, - BuiltinOpCodes.RESIZE_BILINEAR: BuiltinOptions.ResizeBilinearOptions, - BuiltinOpCodes.RNN: BuiltinOptions.RNNOptions, - BuiltinOpCodes.SOFTMAX: BuiltinOptions.SoftmaxOptions, - BuiltinOpCodes.SPACE_TO_DEPTH: BuiltinOptions.SpaceToDepthOptions, - BuiltinOpCodes.SVDF: BuiltinOptions.SVDFOptions, - BuiltinOpCodes.TANH: BuiltinOptions.NONE, - BuiltinOpCodes.CONCAT_EMBEDDINGS: BuiltinOptions.ConcatEmbeddingsOptions, - BuiltinOpCodes.SKIP_GRAM: BuiltinOptions.SkipGramOptions, - BuiltinOpCodes.CALL: BuiltinOptions.CallOptions, - BuiltinOpCodes.CUSTOM: BuiltinOptions.NONE, - BuiltinOpCodes.EMBEDDING_LOOKUP_SPARSE: BuiltinOptions.EmbeddingLookupSparseOptions, - BuiltinOpCodes.PAD: BuiltinOptions.PadOptions, - BuiltinOpCodes.UNIDIRECTIONAL_SEQUENCE_RNN: BuiltinOptions.SequenceRNNOptions, - BuiltinOpCodes.GATHER: BuiltinOptions.GatherOptions, - BuiltinOpCodes.BATCH_TO_SPACE_ND: BuiltinOptions.BatchToSpaceNDOptions, - BuiltinOpCodes.SPACE_TO_BATCH_ND: BuiltinOptions.SpaceToBatchNDOptions, - BuiltinOpCodes.TRANSPOSE: BuiltinOptions.TransposeOptions, - BuiltinOpCodes.MEAN: BuiltinOptions.ReducerOptions, - BuiltinOpCodes.SUB: BuiltinOptions.SubOptions, - BuiltinOpCodes.DIV: BuiltinOptions.DivOptions, - BuiltinOpCodes.SQUEEZE: BuiltinOptions.SqueezeOptions, - BuiltinOpCodes.UNIDIRECTIONAL_SEQUENCE_LSTM: BuiltinOptions.UnidirectionalSequenceLSTMOptions, - BuiltinOpCodes.STRIDED_SLICE: BuiltinOptions.StridedSliceOptions, - BuiltinOpCodes.BIDIRECTIONAL_SEQUENCE_RNN: BuiltinOptions.BidirectionalSequenceRNNOptions, - BuiltinOpCodes.EXP: BuiltinOptions.ExpOptions, - BuiltinOpCodes.TOPK_V2: BuiltinOptions.TopKV2Options, - BuiltinOpCodes.SPLIT: BuiltinOptions.SplitOptions, - BuiltinOpCodes.LOG_SOFTMAX: BuiltinOptions.LogSoftmaxOptions, - BuiltinOpCodes.DELEGATE: BuiltinOptions.NONE, - BuiltinOpCodes.BIDIRECTIONAL_SEQUENCE_LSTM: BuiltinOptions.BidirectionalSequenceLSTMOptions, - BuiltinOpCodes.CAST: BuiltinOptions.CastOptions, - BuiltinOpCodes.PRELU: BuiltinOptions.NONE, - BuiltinOpCodes.MAXIMUM: BuiltinOptions.MaximumMinimumOptions, - BuiltinOpCodes.ARG_MAX: BuiltinOptions.ArgMaxOptions, - BuiltinOpCodes.MINIMUM: BuiltinOptions.MaximumMinimumOptions, - BuiltinOpCodes.LESS: BuiltinOptions.LessOptions, - BuiltinOpCodes.NEG: BuiltinOptions.NegOptions, - BuiltinOpCodes.PADV2: BuiltinOptions.PadV2Options, - BuiltinOpCodes.GREATER: BuiltinOptions.GreaterOptions, - BuiltinOpCodes.GREATER_EQUAL: BuiltinOptions.GreaterEqualOptions, - BuiltinOpCodes.LESS_EQUAL: BuiltinOptions.LessEqualOptions, - BuiltinOpCodes.SELECT: BuiltinOptions.SelectOptions, - BuiltinOpCodes.SLICE: BuiltinOptions.SliceOptions, - BuiltinOpCodes.SIN: BuiltinOptions.NONE, - BuiltinOpCodes.TRANSPOSE_CONV: BuiltinOptions.TransposeConvOptions, - BuiltinOpCodes.SPARSE_TO_DENSE: BuiltinOptions.SparseToDenseOptions, - BuiltinOpCodes.TILE: BuiltinOptions.TileOptions, - BuiltinOpCodes.EXPAND_DIMS: BuiltinOptions.ExpandDimsOptions, - BuiltinOpCodes.EQUAL: BuiltinOptions.EqualOptions, - BuiltinOpCodes.NOT_EQUAL: BuiltinOptions.NotEqualOptions, - BuiltinOpCodes.LOG: BuiltinOptions.NONE, - BuiltinOpCodes.SUM: BuiltinOptions.ReducerOptions, - BuiltinOpCodes.SQRT: BuiltinOptions.NONE, - BuiltinOpCodes.RSQRT: BuiltinOptions.NONE, - BuiltinOpCodes.SHAPE: BuiltinOptions.ShapeOptions, - BuiltinOpCodes.POW: BuiltinOptions.PowOptions, - BuiltinOpCodes.ARG_MIN: BuiltinOptions.ArgMinOptions, - BuiltinOpCodes.FAKE_QUANT: BuiltinOptions.FakeQuantOptions, - BuiltinOpCodes.REDUCE_PROD: BuiltinOptions.ReducerOptions, - BuiltinOpCodes.REDUCE_MAX: BuiltinOptions.ReducerOptions, - BuiltinOpCodes.PACK: BuiltinOptions.PackOptions, - BuiltinOpCodes.LOGICAL_OR: BuiltinOptions.LogicalOrOptions, - BuiltinOpCodes.ONE_HOT: BuiltinOptions.OneHotOptions, - BuiltinOpCodes.LOGICAL_AND: BuiltinOptions.LogicalAndOptions, - BuiltinOpCodes.LOGICAL_NOT: BuiltinOptions.LogicalNotOptions, - BuiltinOpCodes.UNPACK: BuiltinOptions.UnpackOptions, - BuiltinOpCodes.REDUCE_MIN: BuiltinOptions.ReducerOptions, - BuiltinOpCodes.FLOOR_DIV: BuiltinOptions.FloorDivOptions, - BuiltinOpCodes.REDUCE_ANY: BuiltinOptions.ReducerOptions, - BuiltinOpCodes.SQUARE: BuiltinOptions.SquareOptions, - BuiltinOpCodes.ZEROS_LIKE: BuiltinOptions.ZerosLikeOptions, - BuiltinOpCodes.FILL: BuiltinOptions.FillOptions, - BuiltinOpCodes.FLOOR_MOD: BuiltinOptions.FloorModOptions, - BuiltinOpCodes.RANGE: BuiltinOptions.RangeOptions, - BuiltinOpCodes.RESIZE_NEAREST_NEIGHBOR: BuiltinOptions.ResizeNearestNeighborOptions, - BuiltinOpCodes.LEAKY_RELU: BuiltinOptions.LeakyReluOptions, - BuiltinOpCodes.SQUARED_DIFFERENCE: BuiltinOptions.SquaredDifferenceOptions, - BuiltinOpCodes.MIRROR_PAD: BuiltinOptions.MirrorPadOptions, - BuiltinOpCodes.ABS: BuiltinOptions.AbsOptions, - BuiltinOpCodes.SPLIT_V: BuiltinOptions.SplitVOptions, - BuiltinOpCodes.UNIQUE: BuiltinOptions.UniqueOptions, - BuiltinOpCodes.CEIL: BuiltinOptions.NONE, - BuiltinOpCodes.REVERSE_V2: BuiltinOptions.ReverseV2Options, - BuiltinOpCodes.ADD_N: BuiltinOptions.AddNOptions, - BuiltinOpCodes.GATHER_ND: BuiltinOptions.GatherNdOptions, - BuiltinOpCodes.COS: BuiltinOptions.CosOptions, - BuiltinOpCodes.WHERE: BuiltinOptions.WhereOptions, - BuiltinOpCodes.RANK: BuiltinOptions.RankOptions, - BuiltinOpCodes.ELU: BuiltinOptions.NONE, - BuiltinOpCodes.REVERSE_SEQUENCE: BuiltinOptions.ReverseSequenceOptions, - BuiltinOpCodes.MATRIX_DIAG: BuiltinOptions.MatrixDiagOptions, - BuiltinOpCodes.QUANTIZE: BuiltinOptions.QuantizeOptions, - BuiltinOpCodes.MATRIX_SET_DIAG: BuiltinOptions.MatrixSetDiagOptions, - BuiltinOpCodes.ROUND: BuiltinOptions.NONE, - BuiltinOpCodes.HARD_SWISH: BuiltinOptions.HardSwishOptions, - BuiltinOpCodes.IF: BuiltinOptions.IfOptions, - BuiltinOpCodes.WHILE: BuiltinOptions.WhileOptions, - BuiltinOpCodes.NON_MAX_SUPPRESSION_V4: BuiltinOptions.NonMaxSuppressionV4Options, - BuiltinOpCodes.NON_MAX_SUPPRESSION_V5: BuiltinOptions.NonMaxSuppressionV5Options, - BuiltinOpCodes.SCATTER_ND: BuiltinOptions.ScatterNdOptions, - BuiltinOpCodes.SELECT_V2: BuiltinOptions.SelectV2Options, - BuiltinOpCodes.DENSIFY: BuiltinOptions.DensifyOptions, - BuiltinOpCodes.SEGMENT_SUM: BuiltinOptions.SegmentSumOptions, - BuiltinOpCodes.BATCH_MATMUL: BuiltinOptions.BatchMatMulOptions, -} -BuiltinOptions.from_BuiltinOpCodes = lambda x: __BuiltinOptions_from_BuiltinOpCodes[x] diff --git a/tflite2xcore/tflite2xcore/xcore_schema/builtin_options.pyi b/tflite2xcore/tflite2xcore/xcore_schema/builtin_options.pyi deleted file mode 100644 index 4269e451e..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/builtin_options.pyi +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved - -from enum import IntEnum -from typing import Callable, Any - -from . import BuiltinOpCodes - -class BuiltinOptions(IntEnum): - # TODO: consider adding fields for IDE support - @classmethod - def __call__(cls, x: Any) -> BuiltinOptions: ... - from_BuiltinOpCodes: Callable[[BuiltinOpCodes], BuiltinOptions] diff --git a/tflite2xcore/tflite2xcore/xcore_schema/data_container.py b/tflite2xcore/tflite2xcore/xcore_schema/data_container.py deleted file mode 100644 index eb9d2d468..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/data_container.py +++ /dev/null @@ -1,98 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import logging -import numpy as np -from typing import TYPE_CHECKING, Iterable, Optional, Union, List, Any - -from . import _ModelDependent, TensorType - -if TYPE_CHECKING: - from .xcore_model import XCOREModel - from . import Tensor - - -_BufferDataType = Union[list, tuple, bytes, bytearray, np.ndarray] - - -class _DataContainer(_ModelDependent): - def __init__( - self, - name: Optional[str] = None, - model: Optional["XCOREModel"] = None, - data: Optional[_BufferDataType] = None, - ) -> None: - super().__init__(name, model) - self.data = data # type: ignore # see https://github.com/python/mypy/issues/3004 - - @property - def data(self) -> bytes: - return self._data - - @data.setter - def data(self, data: Optional[_BufferDataType]) -> None: - if data is None: - self._data = b"" - elif isinstance(data, (list, tuple, bytes, bytearray)): - # this ensures immutability and that lists have uint8 elements only - self._data = bytes(data) - elif isinstance(data, np.ndarray): - try: - TensorType.from_numpy_dtype(data.dtype) - except KeyError: - # we throw a warning if a non-convertible datatype is used - logging.getLogger("XCOREModel").warning( - f"Numpy array of type {data.dtype} stored in buffer" - ) - self._data = data.tobytes() - else: - raise TypeError(f"data must be list/tuple of bytes or numpy array") - - def __len__(self) -> int: - return len(self.data) - - def is_equal(self, other: Any) -> bool: - return super().is_equal(other) and self.data == other.data - - -class Buffer(_DataContainer): - def __init__( - self, - model: Optional["XCOREModel"] = None, - data: Optional[_BufferDataType] = None, - *, - owners: Optional[Iterable["Tensor"]] = None, - ) -> None: - super().__init__(None, model, data) - self.owners: List["Tensor"] = list( - owners or [] - ) # TODO: should this be managed by Tensor? - - def __str__(self) -> str: - return f"Buffer[{len(self.data)}]" - - def is_equal(self, other: Any) -> bool: - # check owner length only to avoid circular dependencies - return super().is_equal(other) and len(self.owners) == len(other.owners) - - def sanity_check(self) -> None: - assert self in self.model.buffers - for owner in self.owners: - assert owner.buffer is self - - -class Metadata(_DataContainer): - def __init__( - self, - name: str, - model: Optional["XCOREModel"] = None, - data: Optional[_BufferDataType] = None, - ) -> None: - super().__init__(name, model, data) - - def __str__(self) -> str: - return f"name={self.name}, data={list(self.data)}" - - def sanity_check(self) -> None: - super().sanity_check - assert self in self.model.metadata diff --git a/tflite2xcore/tflite2xcore/xcore_schema/dict_conversion.py b/tflite2xcore/tflite2xcore/xcore_schema/dict_conversion.py deleted file mode 100644 index 038ad8386..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/dict_conversion.py +++ /dev/null @@ -1,223 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np -from enum import Enum -from typing import TYPE_CHECKING, Dict, Union, Any - -from tflite2xcore.utils import camel_to_snake, snake_to_camel - -from .flexbuffers import FlexbufferBuilder -from . import ( - schema_py_generated as schema, - Buffer, - Subgraph, - Tensor, - Operator, - Metadata, - ActivationFunctionType, - Padding, - OperatorCode, - QuantizationDetails, - BuiltinOpCodes, - BuiltinOptions, -) - -if TYPE_CHECKING: - from . import XCOREModel - - -def create_dict_from_operator_code( - operator_code: OperatorCode, -) -> Dict[str, Union[str, int]]: - operator_code_dict: Dict[str, Union[str, int]] = {"version": operator_code.version} - - if operator_code.code in BuiltinOpCodes: - operator_code_dict["builtin_code"] = operator_code.name - else: - operator_code_dict["builtin_code"] = BuiltinOpCodes.CUSTOM.name - operator_code_dict["custom_code"] = operator_code.name - - return operator_code_dict - - -def create_dict_from_operator(operator: Operator) -> Dict[str, Any]: - tensors = operator.subgraph.tensors - operator_codes = operator.subgraph.model.operator_codes - - operator_dict = { - "opcode_index": operator_codes.index(operator.operator_code), - "inputs": [tensors.index(input_tensor) for input_tensor in operator.inputs], - "outputs": [tensors.index(input_tensor) for input_tensor in operator.outputs], - "custom_options_format": "FLEXBUFFERS", - } - - if operator.builtin_options: - operator_dict["builtin_options"] = operator.builtin_options - - if operator.custom_options: - fbb = FlexbufferBuilder(operator.custom_options) - operator_dict["custom_options"] = fbb.get_bytes() - - return operator_dict - - -def create_dict_from_tensor( - tensor: Tensor, *, extended: bool = False -) -> Dict[str, Any]: - subgraph = tensor.subgraph - buffers = subgraph.model.buffers - - tensor_dict = { - "name": tensor.name, - "type": tensor.type.name, - "shape": tensor.shape, - "buffer": buffers.index(tensor.buffer), - } - - if tensor.quantization: - tensor_dict["quantization"] = tensor.quantization - - if extended: - operators = subgraph.operators - tensor_dict["consumers"] = sorted(operators.index(t) for t in tensor.consumers) - tensor_dict["producers"] = sorted(operators.index(t) for t in tensor.producers) - - return tensor_dict - - -def create_dict_from_subgraph( - subgraph: Subgraph, *, extended: bool = False -) -> Dict[str, Any]: - tensors = subgraph.tensors - - subgraph_dict = { - "tensors": [ - create_dict_from_tensor(tensor, extended=extended) for tensor in tensors - ], - "inputs": [tensors.index(input_tensor) for input_tensor in subgraph.inputs], - "outputs": [tensors.index(output_tensor) for output_tensor in subgraph.outputs], - "operators": [ - create_dict_from_operator(operator) for operator in subgraph.operators - ], - } - - if subgraph.name: - subgraph_dict["name"] = subgraph.name - - return subgraph_dict - - -def create_dict_from_buffer( - buffer: Buffer, *, extended: bool = False -) -> Dict[str, Any]: - buffer_dict: Dict[str, Any] = ( - {"data": buffer.data} if buffer.data is not None else {} - ) - - if extended: - owners_dict: Dict[Union[int, str], Any] = dict() - model = buffer.model - - # track down and tally all owners - for owner in buffer.owners: - subgraph = owner.subgraph - owner_idx = model.subgraphs.index(subgraph) - owners_in_subgraph = owners_dict.setdefault(owner_idx, []) - owners_in_subgraph.append(subgraph.tensors.index(owner)) - - # sort the ordering - owners_dict = dict(sorted(owners_dict.items())) - for subgraph_idx in owners_dict: - owners_dict[subgraph_idx].sort() - - buffer_dict["owners"] = owners_dict - - return buffer_dict - - -def create_dict_from_metadata(metadata: Metadata) -> Dict[str, Union[bytes, str, None]]: - return { - "name": metadata.name, - "data": metadata.data, - } - - -def create_dict_from_model( - model: "XCOREModel", *, extended: bool = False -) -> Dict[str, Any]: - return { - "version": model.version, - "description": model.description, - "metadata": [ - create_dict_from_metadata(metadata) for metadata in model.metadata - ], - "buffers": [ - create_dict_from_buffer(buffer, extended=extended) - for buffer in model.buffers - ], - "subgraphs": [ - create_dict_from_subgraph(subgraph, extended=extended) - for subgraph in model.subgraphs - ], - "operator_codes": [ - create_dict_from_operator_code(operator_code) - for operator_code in model.operator_codes - ], - } - - -def builtin_options_to_dict(builtin_options: Any) -> Dict[str, Any]: - dict_ = {camel_to_snake(k): v for k, v in vars(builtin_options).items()} - if "fused_activation_function" in dict_: - dict_["fused_activation_function"] = ActivationFunctionType( - dict_["fused_activation_function"] - ) - if "padding" in dict_: - dict_["padding"] = Padding(dict_["padding"]) - - return dict_ - - -def dict_to_builtin_options(type_: int, dict_: Dict[str, Any]) -> Any: - class_identifier = BuiltinOptions(type_).name + "T" - - builtin_class = getattr(schema, class_identifier) - builtin_options = builtin_class() - - for k, v in dict_.items(): - if isinstance(v, Enum): - v = v.value - - setattr(builtin_options, snake_to_camel(k), v) - - return builtin_options - - -def quantization_to_dict( - quantization: schema.QuantizationParametersT, -) -> Dict[str, Any]: - def value_map(k: str, v: Any) -> Any: - if k == "detailsType": - v = QuantizationDetails(v) - elif isinstance(v, np.ndarray): - v = v.tolist() - return v - - return { - camel_to_snake(k): value_map(k, v) - for k, v in vars(quantization).items() - if v is not None - } - - -def dict_to_quantization(dict_: Dict[str, Any]) -> schema.QuantizationParametersT: - quantization: schema.QuantizationParametersT = schema.QuantizationParametersT() # type: ignore - - for k, v in dict_.items(): - if isinstance(v, Enum): - v = v.value - - setattr(quantization, snake_to_camel(k), v) - - return quantization diff --git a/tflite2xcore/tflite2xcore/xcore_schema/flexbuffers.py b/tflite2xcore/tflite2xcore/xcore_schema/flexbuffers.py deleted file mode 100644 index 69b292844..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/flexbuffers.py +++ /dev/null @@ -1,165 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import json -import struct -import ctypes -import numpy as np -from enum import Enum -from typing import Dict, Any, List, Optional, Union - -from tflite2xcore import libflexbuffers as lib - - -class FlexbufferBuilder: - def __init__(self, data: Optional[Dict[str, Any]] = None) -> None: - lib.new_builder.restype = ctypes.c_void_p - - lib.builder_clear.argtypes = [ctypes.c_void_p] - lib.builder_clear.restype = ctypes.c_void_p - - lib.builder_start_map.argtypes = [ctypes.c_void_p, ctypes.c_char_p] - lib.builder_start_map.restype = ctypes.c_size_t - - lib.builder_end_map.argtypes = [ctypes.c_void_p, ctypes.c_size_t] - lib.builder_string.restype = ctypes.c_size_t - - lib.builder_start_vector.argtypes = [ctypes.c_void_p, ctypes.c_char_p] - lib.builder_string.restype = ctypes.c_size_t - - lib.builder_end_vector.argtypes = [ - ctypes.c_void_p, - ctypes.c_size_t, - ctypes.c_bool, - ctypes.c_bool, - ] - lib.builder_string.restype = ctypes.c_size_t - - lib.builder_int.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int] - lib.builder_int.restype = ctypes.c_void_p - - lib.builder_uint.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_uint] - lib.builder_uint.restype = ctypes.c_void_p - - lib.builder_bool.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_bool] - lib.builder_bool.restype = ctypes.c_void_p - - lib.builder_float.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_float] - lib.builder_float.restype = ctypes.c_void_p - - lib.builder_string.argtypes = [ - ctypes.c_void_p, - ctypes.c_char_p, - ctypes.c_char_p, - ] - lib.builder_string.restype = ctypes.c_void_p - - lib.builder_vector_int.argtypes = [ctypes.c_void_p, ctypes.c_int] - lib.builder_vector_int.restype = ctypes.c_void_p - - lib.builder_vector_bool.argtypes = [ctypes.c_void_p, ctypes.c_bool] - lib.builder_vector_bool.restype = ctypes.c_void_p - - lib.builder_vector_float.argtypes = [ctypes.c_void_p, ctypes.c_float] - lib.builder_vector_float.restype = ctypes.c_void_p - - lib.builder_vector_string.argtypes = [ctypes.c_void_p, ctypes.c_char_p] - lib.builder_vector_string.restype = ctypes.c_void_p - - lib.builder_finish.argtypes = [ctypes.c_void_p] - lib.builder_finish.restype = ctypes.c_void_p - - lib.builder_get_buffer.argtypes = [ctypes.c_void_p, ctypes.c_char_p] - lib.builder_get_buffer.restype = ctypes.c_size_t - - self.obj = lib.new_builder() - - if data: - self.set_data(data) - - def _add_vector(self, data: List[Any], key_ascii: Optional[bytes] = None) -> int: - size = lib.builder_start_vector(self.obj, key_ascii) - for list_item in data: - if isinstance(list_item, Enum): - list_item = list_item.value - - list_item_type = type(list_item) # TODO: fix this - if np.issubdtype(list_item_type, np.signedinteger): - lib.builder_vector_int(self.obj, int(list_item)) - elif np.issubdtype(list_item_type, np.bool_): - lib.builder_vector_bool(self.obj, bool(list_item)) - elif np.issubdtype(list_item_type, np.floating): - lib.builder_vector_float(self.obj, float(list_item)) - elif list_item_type is str: - lib.builder_vector_string(self.obj, list_item.encode("ascii")) - elif list_item_type is dict: - self._add_map(list_item) - elif list_item_type in (list, tuple, np.ndarray): - self._add_vector(list(list_item)) - else: - raise Exception( - f"Type {list_item_type} not supported (list item={list_item})" - ) - size = lib.builder_end_vector(self.obj, size, False, False) - - return size # type: ignore - - def _add_map(self, data: Dict[str, Any], key_ascii: Optional[bytes] = None) -> int: - msize = lib.builder_start_map(self.obj, key_ascii) - - for key, value in data.items(): - key_ascii = key.encode("ascii") - if isinstance(value, Enum): - value = value.value - - value_type = type(value) - if np.issubdtype(value_type, np.signedinteger): - lib.builder_int(self.obj, key_ascii, int(value)) - elif np.issubdtype(value_type, np.bool_): - lib.builder_bool(self.obj, key_ascii, bool(value)) - elif np.issubdtype(value_type, np.floating): - lib.builder_float(self.obj, key_ascii, float(value)) - elif value_type is str: - lib.builder_string(self.obj, key_ascii, value.encode("ascii")) - elif value_type is dict: - self._add_map(value, key_ascii) - elif value_type in (list, tuple, np.ndarray): - self._add_vector(list(value), key_ascii) - else: - raise Exception( - f"Type {value_type} not supported (key={key}, value={value})" - ) - - size = lib.builder_end_map(self.obj, msize) - return size # type: ignore - - def set_data(self, data: Dict[str, Any]) -> None: - lib.builder_clear(self.obj) - - self._add_map(data) - - lib.builder_finish(self.obj) - - def get_bytes(self, size: int = 1024) -> List[int]: - buf = ctypes.create_string_buffer(size) - actual_size = lib.builder_get_buffer(self.obj, buf) - return [int(ubyte[0]) for ubyte in struct.iter_unpack("B", buf[0:actual_size])] # type: ignore - - -class FlexbufferParser: - def __init__(self) -> None: - lib.parse_flexbuffer.argtypes = [ctypes.c_char_p, ctypes.c_size_t] - lib.parse_flexbuffer.restype = ctypes.c_size_t - - def parse(self, buffer: bytes, size: int = 100000) -> Any: - if not buffer: - return {} - - char_array = ctypes.c_char * len(buffer) - json_buffer = ctypes.create_string_buffer(size) - - actual_size = lib.parse_flexbuffer( - char_array.from_buffer_copy(buffer), len(buffer), json_buffer, size - ) - - return json.loads(json_buffer[0:actual_size]) # type: ignore diff --git a/tflite2xcore/tflite2xcore/xcore_schema/ir_object.py b/tflite2xcore/tflite2xcore/xcore_schema/ir_object.py deleted file mode 100644 index 7edf036e5..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/ir_object.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, TypeVar, Sequence, List, Any, Optional - -_S = TypeVar("_S", bound="_IRObject") - -if TYPE_CHECKING: - from .xcore_model import XCOREModel, Subgraph - - -class _IRObject(ABC): - def __init__(self, name: Optional[str] = None) -> None: - self.name = name or "" - - @abstractmethod - def sanity_check(self) -> None: - raise NotImplementedError() - - @staticmethod - def sequence_equal(l1: Sequence[_S], l2: Sequence[_S]) -> bool: - return len(l1) == len(l2) and all(a.is_equal(b) for a, b in zip(l1, l2)) - - @staticmethod - def _remove_if_contained(ll: List[_S], obj: _S) -> None: - try: - ll.remove(obj) - except ValueError: - pass - - def is_equal(self, other: Any) -> bool: - if type(self) is type(other): - self.sanity_check() - other.sanity_check() - return True - return False - - -class _ModelDependent(_IRObject): - _model: "XCOREModel" - - def __init__( - self, name: Optional[str] = None, model: Optional["XCOREModel"] = None - ): - super().__init__(name) - if model: - model.register_dependent(self) - - @property - def model(self) -> "XCOREModel": - return self._model - - -class _SubgraphDependent(_IRObject): - _subgraph: "Subgraph" - - @property - def subgraph(self) -> "Subgraph": - return self._subgraph - - @property - def model(self) -> "XCOREModel": - return self.subgraph._model diff --git a/tflite2xcore/tflite2xcore/xcore_schema/misc_enums.py b/tflite2xcore/tflite2xcore/xcore_schema/misc_enums.py deleted file mode 100644 index c88b8decd..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/misc_enums.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -# type: ignore - -from enum import Enum - -from . import schema_py_generated as schema - - -ActivationFunctionType = Enum( - "ActivationFunctionType", - { - k: v - for k, v in vars(schema.ActivationFunctionType).items() - if not k.startswith("__") - }, -) - - -QuantizationDetails = Enum( - "QuantizationDetails", - { - k: v - for k, v in vars(schema.QuantizationDetails).items() - if not k.startswith("__") - }, -) - - -FullyConnectedOptionsWeightsFormat = Enum( - "FullyConnectedOptionsWeightsFormat", - { - k: v - for k, v in vars(schema.FullyConnectedOptionsWeightsFormat).items() - if not k.startswith("__") - }, -) - -Padding = Enum( - "Padding", {k: v for k, v in vars(schema.Padding).items() if not k.startswith("__")} -) diff --git a/tflite2xcore/tflite2xcore/xcore_schema/misc_enums.pyi b/tflite2xcore/tflite2xcore/xcore_schema/misc_enums.pyi deleted file mode 100644 index f59f179a6..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/misc_enums.pyi +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) 2019-2020, XMOS Ltd, All rights reserved - -from enum import IntEnum - -# TODO: consider adding fields to this enums for IDE support - -class ActivationFunctionType(IntEnum): - NONE: ActivationFunctionType - RELU: ActivationFunctionType - RELU_N1_TO_1: ActivationFunctionType - RELU6: ActivationFunctionType - TANH: ActivationFunctionType - SIGN_BIT: ActivationFunctionType - -class QuantizationDetails(IntEnum): ... -class FullyConnectedOptionsWeightsFormat(IntEnum): ... - -class Padding(IntEnum): - SAME: Padding - VALID: Padding diff --git a/tflite2xcore/tflite2xcore/xcore_schema/op_codes.py b/tflite2xcore/tflite2xcore/xcore_schema/op_codes.py deleted file mode 100644 index e8d2f12b4..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/op_codes.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -# type: ignore - -import enum -import aenum -from typing import Union - -from . import schema_py_generated as schema - -BuiltinOpCodes = enum.Enum( - "BuiltinOpCodes", - {k: v for k, v in vars(schema.BuiltinOperator).items() if not k.startswith("__")}, -) - - -class ExternalOpCodes(aenum.Enum): - def _generate_next_value_(name: str, *_) -> str: # pylint: disable=no-self-argument - return name - - LceQuantize = aenum.auto() - LceBconv2d = aenum.auto() - LceDequantize = aenum.auto() - - @classmethod - def add_new_opcode(cls, name: str) -> "ExternalOpCodes": - assert name.isidentifier() - try: - return cls[name] - except KeyError: - aenum.extend_enum(cls, name) - return cls[name] - - -class XCOREOpCodes(enum.Enum): - def _generate_next_value_(name: str, *_) -> str: # pylint: disable=no-self-argument - return name - - DUMMY = enum.auto() # for testing purposes only - XC_lookup_8 = enum.auto() - XC_argmax_16 = enum.auto() # currently not used by any passes - XC_maxpool2d = enum.auto() - XC_avgpool2d = enum.auto() - XC_avgpool2d_global = enum.auto() - XC_fc = enum.auto() - XC_requantize_16_to_8 = enum.auto() # currently unused - XC_conv2d_shallowin = enum.auto() - XC_conv2d_deep = enum.auto() - XC_conv2d_1x1 = enum.auto() - XC_conv2d_depthwise = enum.auto() - XC_bsign_8 = enum.auto() - XC_bconv2d_int8 = enum.auto() - XC_bconv2d_int8_DIDO = enum.auto() - XC_bconv2d_bin = enum.auto() - XC_bconv2d_bin_DI = enum.auto() - XC_add_8 = enum.auto() - XC_pad = enum.auto() - XC_fetch = enum.auto() diff --git a/tflite2xcore/tflite2xcore/xcore_schema/op_codes.pyi b/tflite2xcore/tflite2xcore/xcore_schema/op_codes.pyi deleted file mode 100644 index 515be397d..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/op_codes.pyi +++ /dev/null @@ -1,163 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved - -import enum -import aenum -from typing import Type - -class BuiltinOpCodes(enum.IntEnum): - ADD: BuiltinOpCodes - AVERAGE_POOL_2D: BuiltinOpCodes - CONCATENATION: BuiltinOpCodes - CONV_2D: BuiltinOpCodes - DEPTHWISE_CONV_2D: BuiltinOpCodes - DEPTH_TO_SPACE: BuiltinOpCodes - DEQUANTIZE: BuiltinOpCodes - EMBEDDING_LOOKUP: BuiltinOpCodes - FLOOR: BuiltinOpCodes - FULLY_CONNECTED: BuiltinOpCodes - HASHTABLE_LOOKUP: BuiltinOpCodes - L2_NORMALIZATION: BuiltinOpCodes - L2_POOL_2D: BuiltinOpCodes - LOCAL_RESPONSE_NORMALIZATION: BuiltinOpCodes - LOGISTIC: BuiltinOpCodes - LSH_PROJECTION: BuiltinOpCodes - LSTM: BuiltinOpCodes - MAX_POOL_2D: BuiltinOpCodes - MUL: BuiltinOpCodes - RELU: BuiltinOpCodes - RELU_N1_TO_1: BuiltinOpCodes - RELU6: BuiltinOpCodes - RESHAPE: BuiltinOpCodes - RESIZE_BILINEAR: BuiltinOpCodes - RNN: BuiltinOpCodes - SOFTMAX: BuiltinOpCodes - SPACE_TO_DEPTH: BuiltinOpCodes - SVDF: BuiltinOpCodes - TANH: BuiltinOpCodes - CONCAT_EMBEDDINGS: BuiltinOpCodes - SKIP_GRAM: BuiltinOpCodes - CALL: BuiltinOpCodes - CUSTOM: BuiltinOpCodes - EMBEDDING_LOOKUP_SPARSE: BuiltinOpCodes - PAD: BuiltinOpCodes - UNIDIRECTIONAL_SEQUENCE_RNN: BuiltinOpCodes - GATHER: BuiltinOpCodes - BATCH_TO_SPACE_ND: BuiltinOpCodes - SPACE_TO_BATCH_ND: BuiltinOpCodes - TRANSPOSE: BuiltinOpCodes - MEAN: BuiltinOpCodes - SUB: BuiltinOpCodes - DIV: BuiltinOpCodes - SQUEEZE: BuiltinOpCodes - UNIDIRECTIONAL_SEQUENCE_LSTM: BuiltinOpCodes - STRIDED_SLICE: BuiltinOpCodes - BIDIRECTIONAL_SEQUENCE_RNN: BuiltinOpCodes - EXP: BuiltinOpCodes - TOPK_V2: BuiltinOpCodes - SPLIT: BuiltinOpCodes - LOG_SOFTMAX: BuiltinOpCodes - DELEGATE: BuiltinOpCodes - BIDIRECTIONAL_SEQUENCE_LSTM: BuiltinOpCodes - CAST: BuiltinOpCodes - PRELU: BuiltinOpCodes - MAXIMUM: BuiltinOpCodes - ARG_MAX: BuiltinOpCodes - MINIMUM: BuiltinOpCodes - LESS: BuiltinOpCodes - NEG: BuiltinOpCodes - PADV2: BuiltinOpCodes - GREATER: BuiltinOpCodes - GREATER_EQUAL: BuiltinOpCodes - LESS_EQUAL: BuiltinOpCodes - SELECT: BuiltinOpCodes - SLICE: BuiltinOpCodes - SIN: BuiltinOpCodes - TRANSPOSE_CONV: BuiltinOpCodes - SPARSE_TO_DENSE: BuiltinOpCodes - TILE: BuiltinOpCodes - EXPAND_DIMS: BuiltinOpCodes - EQUAL: BuiltinOpCodes - NOT_EQUAL: BuiltinOpCodes - LOG: BuiltinOpCodes - SUM: BuiltinOpCodes - SQRT: BuiltinOpCodes - RSQRT: BuiltinOpCodes - SHAPE: BuiltinOpCodes - POW: BuiltinOpCodes - ARG_MIN: BuiltinOpCodes - FAKE_QUANT: BuiltinOpCodes - REDUCE_PROD: BuiltinOpCodes - REDUCE_MAX: BuiltinOpCodes - PACK: BuiltinOpCodes - LOGICAL_OR: BuiltinOpCodes - ONE_HOT: BuiltinOpCodes - LOGICAL_AND: BuiltinOpCodes - LOGICAL_NOT: BuiltinOpCodes - UNPACK: BuiltinOpCodes - REDUCE_MIN: BuiltinOpCodes - FLOOR_DIV: BuiltinOpCodes - REDUCE_ANY: BuiltinOpCodes - SQUARE: BuiltinOpCodes - ZEROS_LIKE: BuiltinOpCodes - FILL: BuiltinOpCodes - FLOOR_MOD: BuiltinOpCodes - RANGE: BuiltinOpCodes - RESIZE_NEAREST_NEIGHBOR: BuiltinOpCodes - LEAKY_RELU: BuiltinOpCodes - SQUARED_DIFFERENCE: BuiltinOpCodes - MIRROR_PAD: BuiltinOpCodes - ABS: BuiltinOpCodes - SPLIT_V: BuiltinOpCodes - UNIQUE: BuiltinOpCodes - CEIL: BuiltinOpCodes - REVERSE_V2: BuiltinOpCodes - ADD_N: BuiltinOpCodes - GATHER_ND: BuiltinOpCodes - COS: BuiltinOpCodes - WHERE: BuiltinOpCodes - RANK: BuiltinOpCodes - ELU: BuiltinOpCodes - REVERSE_SEQUENCE: BuiltinOpCodes - MATRIX_DIAG: BuiltinOpCodes - QUANTIZE: BuiltinOpCodes - MATRIX_SET_DIAG: BuiltinOpCodes - ROUND: BuiltinOpCodes - HARD_SWISH: BuiltinOpCodes - IF: BuiltinOpCodes - WHILE: BuiltinOpCodes - NON_MAX_SUPPRESSION_V4: BuiltinOpCodes - NON_MAX_SUPPRESSION_V5: BuiltinOpCodes - SCATTER_ND: BuiltinOpCodes - SELECT_V2: BuiltinOpCodes - DENSIFY: BuiltinOpCodes - SEGMENT_SUM: BuiltinOpCodes - BATCH_MATMUL: BuiltinOpCodes - -class ExternalOpCodes(aenum.Enum): # type: ignore - LceQuantize: ExternalOpCodes - LceBconv2d: ExternalOpCodes - LceDequantize: ExternalOpCodes - @classmethod - def add_new_opcode(cls: Type[ExternalOpCodes], name: str) -> ExternalOpCodes: ... - -class XCOREOpCodes(enum.Enum): - DUMMY: XCOREOpCodes - XC_lookup_8: XCOREOpCodes - XC_argmax_16: XCOREOpCodes - XC_maxpool2d: XCOREOpCodes - XC_avgpool2d: XCOREOpCodes - XC_avgpool2d_global: XCOREOpCodes - XC_fc: XCOREOpCodes - XC_requantize_16_to_8: XCOREOpCodes - XC_conv2d_shallowin: XCOREOpCodes - XC_conv2d_deep: XCOREOpCodes - XC_conv2d_1x1: XCOREOpCodes - XC_conv2d_depthwise: XCOREOpCodes - XC_bsign_8: XCOREOpCodes - XC_bconv2d_int8: XCOREOpCodes - XC_bconv2d_int8_DIDO: XCOREOpCodes - XC_bconv2d_bin: XCOREOpCodes - XC_bconv2d_bin_DI: XCOREOpCodes - XC_add_8: XCOREOpCodes - XC_pad: XCOREOpCodes - XC_fetch: XCOREOpCodes diff --git a/tflite2xcore/tflite2xcore/xcore_schema/operator.py b/tflite2xcore/tflite2xcore/xcore_schema/operator.py deleted file mode 100644 index 9eb01e6b9..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/operator.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from typing import TYPE_CHECKING, Optional, Dict, Any, Iterable - -if TYPE_CHECKING: - from . import Tensor, Subgraph, XCOREModel - -from . import _IRObject, OperatorCode - - -_OpOptionsType = Dict[str, Any] - - -class Operator(_IRObject): - name: str - - def __init__( - self, - subgraph: "Subgraph", - operator_code: OperatorCode, - name: Optional[str] = None, - inputs: Optional[Iterable["Tensor"]] = None, - outputs: Optional[Iterable["Tensor"]] = None, - builtin_options: Optional[_OpOptionsType] = None, - custom_options: Optional[_OpOptionsType] = None, - ) -> None: - # Generally, do not use this constructor to instantiate Operator! - # Use Subgraph.create_operator instead. - - super().__init__(name or "") - self.subgraph = subgraph # parent - self.operator_code = operator_code - self.inputs = list(inputs or []) - self.outputs = list(outputs or []) - self.builtin_options = builtin_options or {} - self.custom_options = custom_options or {} - - def add_custom_options(self, **kwargs: Any) -> None: - if kwargs: - self.custom_options.update(kwargs) - - @property - def model(self) -> "XCOREModel": - return self.subgraph.model - - def __str__(self) -> str: - return f"({self.subgraph.operators.index(self)}) operator_code={self.operator_code}" - - def is_equal(self, other: Any) -> bool: - return ( - super().is_equal(other) - and self.operator_code == other.operator_code - # and self.name == other.name # intentionally not compared - and self.sequence_equal(self.inputs, other.inputs) - and self.sequence_equal(self.outputs, other.outputs) - and self.builtin_options == other.builtin_options - and self.custom_options == other.custom_options - ) - - def sanity_check(self) -> None: - assert self in self.subgraph.operators - # check double links with inputs/outputs - for tensor in self.inputs: - assert self in tensor.consumers - for tensor in self.outputs: - assert self in tensor.producers diff --git a/tflite2xcore/tflite2xcore/xcore_schema/operator_code.py b/tflite2xcore/tflite2xcore/xcore_schema/operator_code.py deleted file mode 100644 index 7c65a630b..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/operator_code.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from typing import Optional, Union, Any - -from . import XCOREOpCodes, ExternalOpCodes, BuiltinOpCodes - -CustomOpCodes = Union[XCOREOpCodes, ExternalOpCodes] - -ValidOpCodes = Union[BuiltinOpCodes, CustomOpCodes] - - -class OperatorCode: - def __init__(self, opcode: ValidOpCodes, *, version: Optional[int] = None) -> None: - self.version = version or 1 - self.code = opcode - - @property - def name(self) -> str: - return self.code.name - - @property - def value(self) -> Union[int, str]: - return self.code.value - - def __eq__(self, obj: Any) -> bool: - return ( - isinstance(obj, OperatorCode) - and obj.code is self.code - and obj.version == self.version - ) - - def __hash__(self) -> int: - return hash(str(self)) - - def __str__(self) -> str: - return f"{self.code} (version {self.version})" diff --git a/tflite2xcore/tflite2xcore/xcore_schema/schema_py_generated.py b/tflite2xcore/tflite2xcore/xcore_schema/schema_py_generated.py deleted file mode 100644 index a54cbac3c..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/schema_py_generated.py +++ /dev/null @@ -1,9738 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. -import flatbuffers -import numpy as np - -class BatchToSpaceNDOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsBatchToSpaceNDOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = BatchToSpaceNDOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def BatchToSpaceNDOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # BatchToSpaceNDOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def BatchToSpaceNDOptionsStart(builder): builder.StartObject(0) -def BatchToSpaceNDOptionsEnd(builder): return builder.EndObject() - - -class BatchToSpaceNDOptionsT(object): - - # BatchToSpaceNDOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - batchToSpaceNDOptions = BatchToSpaceNDOptions() - batchToSpaceNDOptions.Init(buf, pos) - return cls.InitFromObj(batchToSpaceNDOptions) - - @classmethod - def InitFromObj(cls, batchToSpaceNDOptions): - x = BatchToSpaceNDOptionsT() - x._UnPack(batchToSpaceNDOptions) - return x - - # BatchToSpaceNDOptionsT - def _UnPack(self, batchToSpaceNDOptions): - if batchToSpaceNDOptions is None: - return - - # BatchToSpaceNDOptionsT - def Pack(self, builder): - BatchToSpaceNDOptionsStart(builder) - batchToSpaceNDOptions = BatchToSpaceNDOptionsEnd(builder) - return batchToSpaceNDOptions - - - -class MirrorPadOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsMirrorPadOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = MirrorPadOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def MirrorPadOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # MirrorPadOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # MirrorPadOptions - def Mode(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - -def MirrorPadOptionsStart(builder): builder.StartObject(1) -def MirrorPadOptionsAddMode(builder, mode): builder.PrependInt8Slot(0, mode, 0) -def MirrorPadOptionsEnd(builder): return builder.EndObject() - - -class MirrorPadOptionsT(object): - - # MirrorPadOptionsT - def __init__(self): - self.mode = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - mirrorPadOptions = MirrorPadOptions() - mirrorPadOptions.Init(buf, pos) - return cls.InitFromObj(mirrorPadOptions) - - @classmethod - def InitFromObj(cls, mirrorPadOptions): - x = MirrorPadOptionsT() - x._UnPack(mirrorPadOptions) - return x - - # MirrorPadOptionsT - def _UnPack(self, mirrorPadOptions): - if mirrorPadOptions is None: - return - self.mode = mirrorPadOptions.Mode() - - # MirrorPadOptionsT - def Pack(self, builder): - MirrorPadOptionsStart(builder) - MirrorPadOptionsAddMode(builder, self.mode) - mirrorPadOptions = MirrorPadOptionsEnd(builder) - return mirrorPadOptions - - - -class ArgMaxOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsArgMaxOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ArgMaxOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def ArgMaxOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ArgMaxOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # ArgMaxOptions - def OutputType(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - -def ArgMaxOptionsStart(builder): builder.StartObject(1) -def ArgMaxOptionsAddOutputType(builder, outputType): builder.PrependInt8Slot(0, outputType, 0) -def ArgMaxOptionsEnd(builder): return builder.EndObject() - - -class ArgMaxOptionsT(object): - - # ArgMaxOptionsT - def __init__(self): - self.outputType = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - argMaxOptions = ArgMaxOptions() - argMaxOptions.Init(buf, pos) - return cls.InitFromObj(argMaxOptions) - - @classmethod - def InitFromObj(cls, argMaxOptions): - x = ArgMaxOptionsT() - x._UnPack(argMaxOptions) - return x - - # ArgMaxOptionsT - def _UnPack(self, argMaxOptions): - if argMaxOptions is None: - return - self.outputType = argMaxOptions.OutputType() - - # ArgMaxOptionsT - def Pack(self, builder): - ArgMaxOptionsStart(builder) - ArgMaxOptionsAddOutputType(builder, self.outputType) - argMaxOptions = ArgMaxOptionsEnd(builder) - return argMaxOptions - - - -class ReducerOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsReducerOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ReducerOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def ReducerOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ReducerOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # ReducerOptions - def KeepDims(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def ReducerOptionsStart(builder): builder.StartObject(1) -def ReducerOptionsAddKeepDims(builder, keepDims): builder.PrependBoolSlot(0, keepDims, 0) -def ReducerOptionsEnd(builder): return builder.EndObject() - - -class ReducerOptionsT(object): - - # ReducerOptionsT - def __init__(self): - self.keepDims = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - reducerOptions = ReducerOptions() - reducerOptions.Init(buf, pos) - return cls.InitFromObj(reducerOptions) - - @classmethod - def InitFromObj(cls, reducerOptions): - x = ReducerOptionsT() - x._UnPack(reducerOptions) - return x - - # ReducerOptionsT - def _UnPack(self, reducerOptions): - if reducerOptions is None: - return - self.keepDims = reducerOptions.KeepDims() - - # ReducerOptionsT - def Pack(self, builder): - ReducerOptionsStart(builder) - ReducerOptionsAddKeepDims(builder, self.keepDims) - reducerOptions = ReducerOptionsEnd(builder) - return reducerOptions - - - -class QuantizeOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsQuantizeOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = QuantizeOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def QuantizeOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # QuantizeOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def QuantizeOptionsStart(builder): builder.StartObject(0) -def QuantizeOptionsEnd(builder): return builder.EndObject() - - -class QuantizeOptionsT(object): - - # QuantizeOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - quantizeOptions = QuantizeOptions() - quantizeOptions.Init(buf, pos) - return cls.InitFromObj(quantizeOptions) - - @classmethod - def InitFromObj(cls, quantizeOptions): - x = QuantizeOptionsT() - x._UnPack(quantizeOptions) - return x - - # QuantizeOptionsT - def _UnPack(self, quantizeOptions): - if quantizeOptions is None: - return - - # QuantizeOptionsT - def Pack(self, builder): - QuantizeOptionsStart(builder) - quantizeOptions = QuantizeOptionsEnd(builder) - return quantizeOptions - - - -class SubGraph(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSubGraph(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SubGraph() - x.Init(buf, n + offset) - return x - - @classmethod - def SubGraphBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SubGraph - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # SubGraph - def Tensors(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - x = self._tab.Vector(o) - x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4 - x = self._tab.Indirect(x) - obj = Tensor() - obj.Init(self._tab.Bytes, x) - return obj - return None - - # SubGraph - def TensorsLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # SubGraph - def TensorsIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - return o == 0 - - # SubGraph - def Inputs(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # SubGraph - def InputsAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # SubGraph - def InputsLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # SubGraph - def InputsIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - return o == 0 - - # SubGraph - def Outputs(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # SubGraph - def OutputsAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # SubGraph - def OutputsLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # SubGraph - def OutputsIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - return o == 0 - - # SubGraph - def Operators(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - x = self._tab.Vector(o) - x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4 - x = self._tab.Indirect(x) - obj = Operator() - obj.Init(self._tab.Bytes, x) - return obj - return None - - # SubGraph - def OperatorsLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # SubGraph - def OperatorsIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - return o == 0 - - # SubGraph - def Name(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - if o != 0: - return self._tab.String(o + self._tab.Pos) - return None - -def SubGraphStart(builder): builder.StartObject(5) -def SubGraphAddTensors(builder, tensors): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(tensors), 0) -def SubGraphStartTensorsVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def SubGraphAddInputs(builder, inputs): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(inputs), 0) -def SubGraphStartInputsVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def SubGraphAddOutputs(builder, outputs): builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(outputs), 0) -def SubGraphStartOutputsVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def SubGraphAddOperators(builder, operators): builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(operators), 0) -def SubGraphStartOperatorsVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def SubGraphAddName(builder, name): builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0) -def SubGraphEnd(builder): return builder.EndObject() - -try: - from typing import List -except: - pass - -class SubGraphT(object): - - # SubGraphT - def __init__(self): - self.tensors = None # type: List[TensorT] - self.inputs = None # type: List[int] - self.outputs = None # type: List[int] - self.operators = None # type: List[OperatorT] - self.name = None # type: str - - @classmethod - def InitFromBuf(cls, buf, pos): - subGraph = SubGraph() - subGraph.Init(buf, pos) - return cls.InitFromObj(subGraph) - - @classmethod - def InitFromObj(cls, subGraph): - x = SubGraphT() - x._UnPack(subGraph) - return x - - # SubGraphT - def _UnPack(self, subGraph): - if subGraph is None: - return - if not subGraph.TensorsIsNone(): - self.tensors = [] - for i in range(subGraph.TensorsLength()): - if subGraph.Tensors(i) is None: - self.tensors.append(None) - else: - tensor_ = TensorT.InitFromObj(subGraph.Tensors(i)) - self.tensors.append(tensor_) - if not subGraph.InputsIsNone(): - if np is None: - self.inputs = [] - for i in range(subGraph.InputsLength()): - self.inputs.append(subGraph.Inputs(i)) - else: - self.inputs = subGraph.InputsAsNumpy() - if not subGraph.OutputsIsNone(): - if np is None: - self.outputs = [] - for i in range(subGraph.OutputsLength()): - self.outputs.append(subGraph.Outputs(i)) - else: - self.outputs = subGraph.OutputsAsNumpy() - if not subGraph.OperatorsIsNone(): - self.operators = [] - for i in range(subGraph.OperatorsLength()): - if subGraph.Operators(i) is None: - self.operators.append(None) - else: - operator_ = OperatorT.InitFromObj(subGraph.Operators(i)) - self.operators.append(operator_) - self.name = subGraph.Name() - - # SubGraphT - def Pack(self, builder): - if self.tensors is not None: - tensorslist = [] - for i in range(len(self.tensors)): - tensorslist.append(self.tensors[i].Pack(builder)) - SubGraphStartTensorsVector(builder, len(self.tensors)) - for i in reversed(range(len(self.tensors))): - builder.PrependUOffsetTRelative(tensorslist[i]) - tensors = builder.EndVector(len(self.tensors)) - if self.inputs is not None: - if np is not None and type(self.inputs) is np.ndarray: - inputs = builder.CreateNumpyVector(self.inputs) - else: - SubGraphStartInputsVector(builder, len(self.inputs)) - for i in reversed(range(len(self.inputs))): - builder.PrependInt32(self.inputs[i]) - inputs = builder.EndVector(len(self.inputs)) - if self.outputs is not None: - if np is not None and type(self.outputs) is np.ndarray: - outputs = builder.CreateNumpyVector(self.outputs) - else: - SubGraphStartOutputsVector(builder, len(self.outputs)) - for i in reversed(range(len(self.outputs))): - builder.PrependInt32(self.outputs[i]) - outputs = builder.EndVector(len(self.outputs)) - if self.operators is not None: - operatorslist = [] - for i in range(len(self.operators)): - operatorslist.append(self.operators[i].Pack(builder)) - SubGraphStartOperatorsVector(builder, len(self.operators)) - for i in reversed(range(len(self.operators))): - builder.PrependUOffsetTRelative(operatorslist[i]) - operators = builder.EndVector(len(self.operators)) - if self.name is not None: - name = builder.CreateString(self.name) - SubGraphStart(builder) - if self.tensors is not None: - SubGraphAddTensors(builder, tensors) - if self.inputs is not None: - SubGraphAddInputs(builder, inputs) - if self.outputs is not None: - SubGraphAddOutputs(builder, outputs) - if self.operators is not None: - SubGraphAddOperators(builder, operators) - if self.name is not None: - SubGraphAddName(builder, name) - subGraph = SubGraphEnd(builder) - return subGraph - - - -class SquareOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSquareOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SquareOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SquareOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SquareOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def SquareOptionsStart(builder): builder.StartObject(0) -def SquareOptionsEnd(builder): return builder.EndObject() - - -class SquareOptionsT(object): - - # SquareOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - squareOptions = SquareOptions() - squareOptions.Init(buf, pos) - return cls.InitFromObj(squareOptions) - - @classmethod - def InitFromObj(cls, squareOptions): - x = SquareOptionsT() - x._UnPack(squareOptions) - return x - - # SquareOptionsT - def _UnPack(self, squareOptions): - if squareOptions is None: - return - - # SquareOptionsT - def Pack(self, builder): - SquareOptionsStart(builder) - squareOptions = SquareOptionsEnd(builder) - return squareOptions - - - -class OperatorCode(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsOperatorCode(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = OperatorCode() - x.Init(buf, n + offset) - return x - - @classmethod - def OperatorCodeBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # OperatorCode - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # OperatorCode - def BuiltinCode(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # OperatorCode - def CustomCode(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.String(o + self._tab.Pos) - return None - - # OperatorCode - def Version(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 1 - -def OperatorCodeStart(builder): builder.StartObject(3) -def OperatorCodeAddBuiltinCode(builder, builtinCode): builder.PrependInt8Slot(0, builtinCode, 0) -def OperatorCodeAddCustomCode(builder, customCode): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(customCode), 0) -def OperatorCodeAddVersion(builder, version): builder.PrependInt32Slot(2, version, 1) -def OperatorCodeEnd(builder): return builder.EndObject() - - -class OperatorCodeT(object): - - # OperatorCodeT - def __init__(self): - self.builtinCode = 0 # type: int - self.customCode = None # type: str - self.version = 1 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - operatorCode = OperatorCode() - operatorCode.Init(buf, pos) - return cls.InitFromObj(operatorCode) - - @classmethod - def InitFromObj(cls, operatorCode): - x = OperatorCodeT() - x._UnPack(operatorCode) - return x - - # OperatorCodeT - def _UnPack(self, operatorCode): - if operatorCode is None: - return - self.builtinCode = operatorCode.BuiltinCode() - self.customCode = operatorCode.CustomCode() - self.version = operatorCode.Version() - - # OperatorCodeT - def Pack(self, builder): - if self.customCode is not None: - customCode = builder.CreateString(self.customCode) - OperatorCodeStart(builder) - OperatorCodeAddBuiltinCode(builder, self.builtinCode) - if self.customCode is not None: - OperatorCodeAddCustomCode(builder, customCode) - OperatorCodeAddVersion(builder, self.version) - operatorCode = OperatorCodeEnd(builder) - return operatorCode - - - -class Metadata(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsMetadata(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = Metadata() - x.Init(buf, n + offset) - return x - - @classmethod - def MetadataBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # Metadata - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # Metadata - def Name(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.String(o + self._tab.Pos) - return None - - # Metadata - def Buffer(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos) - return 0 - -def MetadataStart(builder): builder.StartObject(2) -def MetadataAddName(builder, name): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0) -def MetadataAddBuffer(builder, buffer): builder.PrependUint32Slot(1, buffer, 0) -def MetadataEnd(builder): return builder.EndObject() - - -class MetadataT(object): - - # MetadataT - def __init__(self): - self.name = None # type: str - self.buffer = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - metadata = Metadata() - metadata.Init(buf, pos) - return cls.InitFromObj(metadata) - - @classmethod - def InitFromObj(cls, metadata): - x = MetadataT() - x._UnPack(metadata) - return x - - # MetadataT - def _UnPack(self, metadata): - if metadata is None: - return - self.name = metadata.Name() - self.buffer = metadata.Buffer() - - # MetadataT - def Pack(self, builder): - if self.name is not None: - name = builder.CreateString(self.name) - MetadataStart(builder) - if self.name is not None: - MetadataAddName(builder, name) - MetadataAddBuffer(builder, self.buffer) - metadata = MetadataEnd(builder) - return metadata - - - -class TopKV2Options(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsTopKV2Options(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = TopKV2Options() - x.Init(buf, n + offset) - return x - - @classmethod - def TopKV2OptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # TopKV2Options - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def TopKV2OptionsStart(builder): builder.StartObject(0) -def TopKV2OptionsEnd(builder): return builder.EndObject() - - -class TopKV2OptionsT(object): - - # TopKV2OptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - topKV2Options = TopKV2Options() - topKV2Options.Init(buf, pos) - return cls.InitFromObj(topKV2Options) - - @classmethod - def InitFromObj(cls, topKV2Options): - x = TopKV2OptionsT() - x._UnPack(topKV2Options) - return x - - # TopKV2OptionsT - def _UnPack(self, topKV2Options): - if topKV2Options is None: - return - - # TopKV2OptionsT - def Pack(self, builder): - TopKV2OptionsStart(builder) - topKV2Options = TopKV2OptionsEnd(builder) - return topKV2Options - - - -class SqueezeOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSqueezeOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SqueezeOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SqueezeOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SqueezeOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # SqueezeOptions - def SqueezeDims(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # SqueezeOptions - def SqueezeDimsAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # SqueezeOptions - def SqueezeDimsLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # SqueezeOptions - def SqueezeDimsIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - return o == 0 - -def SqueezeOptionsStart(builder): builder.StartObject(1) -def SqueezeOptionsAddSqueezeDims(builder, squeezeDims): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(squeezeDims), 0) -def SqueezeOptionsStartSqueezeDimsVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def SqueezeOptionsEnd(builder): return builder.EndObject() - -try: - from typing import List -except: - pass - -class SqueezeOptionsT(object): - - # SqueezeOptionsT - def __init__(self): - self.squeezeDims = None # type: List[int] - - @classmethod - def InitFromBuf(cls, buf, pos): - squeezeOptions = SqueezeOptions() - squeezeOptions.Init(buf, pos) - return cls.InitFromObj(squeezeOptions) - - @classmethod - def InitFromObj(cls, squeezeOptions): - x = SqueezeOptionsT() - x._UnPack(squeezeOptions) - return x - - # SqueezeOptionsT - def _UnPack(self, squeezeOptions): - if squeezeOptions is None: - return - if not squeezeOptions.SqueezeDimsIsNone(): - if np is None: - self.squeezeDims = [] - for i in range(squeezeOptions.SqueezeDimsLength()): - self.squeezeDims.append(squeezeOptions.SqueezeDims(i)) - else: - self.squeezeDims = squeezeOptions.SqueezeDimsAsNumpy() - - # SqueezeOptionsT - def Pack(self, builder): - if self.squeezeDims is not None: - if np is not None and type(self.squeezeDims) is np.ndarray: - squeezeDims = builder.CreateNumpyVector(self.squeezeDims) - else: - SqueezeOptionsStartSqueezeDimsVector(builder, len(self.squeezeDims)) - for i in reversed(range(len(self.squeezeDims))): - builder.PrependInt32(self.squeezeDims[i]) - squeezeDims = builder.EndVector(len(self.squeezeDims)) - SqueezeOptionsStart(builder) - if self.squeezeDims is not None: - SqueezeOptionsAddSqueezeDims(builder, squeezeDims) - squeezeOptions = SqueezeOptionsEnd(builder) - return squeezeOptions - - - -class CosOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsCosOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = CosOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def CosOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # CosOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def CosOptionsStart(builder): builder.StartObject(0) -def CosOptionsEnd(builder): return builder.EndObject() - - -class CosOptionsT(object): - - # CosOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - cosOptions = CosOptions() - cosOptions.Init(buf, pos) - return cls.InitFromObj(cosOptions) - - @classmethod - def InitFromObj(cls, cosOptions): - x = CosOptionsT() - x._UnPack(cosOptions) - return x - - # CosOptionsT - def _UnPack(self, cosOptions): - if cosOptions is None: - return - - # CosOptionsT - def Pack(self, builder): - CosOptionsStart(builder) - cosOptions = CosOptionsEnd(builder) - return cosOptions - - - -class AddOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsAddOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = AddOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def AddOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # AddOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # AddOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - -def AddOptionsStart(builder): builder.StartObject(1) -def AddOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) -def AddOptionsEnd(builder): return builder.EndObject() - - -class AddOptionsT(object): - - # AddOptionsT - def __init__(self): - self.fusedActivationFunction = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - addOptions = AddOptions() - addOptions.Init(buf, pos) - return cls.InitFromObj(addOptions) - - @classmethod - def InitFromObj(cls, addOptions): - x = AddOptionsT() - x._UnPack(addOptions) - return x - - # AddOptionsT - def _UnPack(self, addOptions): - if addOptions is None: - return - self.fusedActivationFunction = addOptions.FusedActivationFunction() - - # AddOptionsT - def Pack(self, builder): - AddOptionsStart(builder) - AddOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - addOptions = AddOptionsEnd(builder) - return addOptions - - - -class AbsOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsAbsOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = AbsOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def AbsOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # AbsOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def AbsOptionsStart(builder): builder.StartObject(0) -def AbsOptionsEnd(builder): return builder.EndObject() - - -class AbsOptionsT(object): - - # AbsOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - absOptions = AbsOptions() - absOptions.Init(buf, pos) - return cls.InitFromObj(absOptions) - - @classmethod - def InitFromObj(cls, absOptions): - x = AbsOptionsT() - x._UnPack(absOptions) - return x - - # AbsOptionsT - def _UnPack(self, absOptions): - if absOptions is None: - return - - # AbsOptionsT - def Pack(self, builder): - AbsOptionsStart(builder) - absOptions = AbsOptionsEnd(builder) - return absOptions - - - -class MulOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsMulOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = MulOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def MulOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # MulOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # MulOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - -def MulOptionsStart(builder): builder.StartObject(1) -def MulOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) -def MulOptionsEnd(builder): return builder.EndObject() - - -class MulOptionsT(object): - - # MulOptionsT - def __init__(self): - self.fusedActivationFunction = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - mulOptions = MulOptions() - mulOptions.Init(buf, pos) - return cls.InitFromObj(mulOptions) - - @classmethod - def InitFromObj(cls, mulOptions): - x = MulOptionsT() - x._UnPack(mulOptions) - return x - - # MulOptionsT - def _UnPack(self, mulOptions): - if mulOptions is None: - return - self.fusedActivationFunction = mulOptions.FusedActivationFunction() - - # MulOptionsT - def Pack(self, builder): - MulOptionsStart(builder) - MulOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - mulOptions = MulOptionsEnd(builder) - return mulOptions - - -class MirrorPadMode(object): - REFLECT = 0 - SYMMETRIC = 1 - - - -class BuiltinOperator(object): - ADD = 0 - AVERAGE_POOL_2D = 1 - CONCATENATION = 2 - CONV_2D = 3 - DEPTHWISE_CONV_2D = 4 - DEPTH_TO_SPACE = 5 - DEQUANTIZE = 6 - EMBEDDING_LOOKUP = 7 - FLOOR = 8 - FULLY_CONNECTED = 9 - HASHTABLE_LOOKUP = 10 - L2_NORMALIZATION = 11 - L2_POOL_2D = 12 - LOCAL_RESPONSE_NORMALIZATION = 13 - LOGISTIC = 14 - LSH_PROJECTION = 15 - LSTM = 16 - MAX_POOL_2D = 17 - MUL = 18 - RELU = 19 - RELU_N1_TO_1 = 20 - RELU6 = 21 - RESHAPE = 22 - RESIZE_BILINEAR = 23 - RNN = 24 - SOFTMAX = 25 - SPACE_TO_DEPTH = 26 - SVDF = 27 - TANH = 28 - CONCAT_EMBEDDINGS = 29 - SKIP_GRAM = 30 - CALL = 31 - CUSTOM = 32 - EMBEDDING_LOOKUP_SPARSE = 33 - PAD = 34 - UNIDIRECTIONAL_SEQUENCE_RNN = 35 - GATHER = 36 - BATCH_TO_SPACE_ND = 37 - SPACE_TO_BATCH_ND = 38 - TRANSPOSE = 39 - MEAN = 40 - SUB = 41 - DIV = 42 - SQUEEZE = 43 - UNIDIRECTIONAL_SEQUENCE_LSTM = 44 - STRIDED_SLICE = 45 - BIDIRECTIONAL_SEQUENCE_RNN = 46 - EXP = 47 - TOPK_V2 = 48 - SPLIT = 49 - LOG_SOFTMAX = 50 - DELEGATE = 51 - BIDIRECTIONAL_SEQUENCE_LSTM = 52 - CAST = 53 - PRELU = 54 - MAXIMUM = 55 - ARG_MAX = 56 - MINIMUM = 57 - LESS = 58 - NEG = 59 - PADV2 = 60 - GREATER = 61 - GREATER_EQUAL = 62 - LESS_EQUAL = 63 - SELECT = 64 - SLICE = 65 - SIN = 66 - TRANSPOSE_CONV = 67 - SPARSE_TO_DENSE = 68 - TILE = 69 - EXPAND_DIMS = 70 - EQUAL = 71 - NOT_EQUAL = 72 - LOG = 73 - SUM = 74 - SQRT = 75 - RSQRT = 76 - SHAPE = 77 - POW = 78 - ARG_MIN = 79 - FAKE_QUANT = 80 - REDUCE_PROD = 81 - REDUCE_MAX = 82 - PACK = 83 - LOGICAL_OR = 84 - ONE_HOT = 85 - LOGICAL_AND = 86 - LOGICAL_NOT = 87 - UNPACK = 88 - REDUCE_MIN = 89 - FLOOR_DIV = 90 - REDUCE_ANY = 91 - SQUARE = 92 - ZEROS_LIKE = 93 - FILL = 94 - FLOOR_MOD = 95 - RANGE = 96 - RESIZE_NEAREST_NEIGHBOR = 97 - LEAKY_RELU = 98 - SQUARED_DIFFERENCE = 99 - MIRROR_PAD = 100 - ABS = 101 - SPLIT_V = 102 - UNIQUE = 103 - CEIL = 104 - REVERSE_V2 = 105 - ADD_N = 106 - GATHER_ND = 107 - COS = 108 - WHERE = 109 - RANK = 110 - ELU = 111 - REVERSE_SEQUENCE = 112 - MATRIX_DIAG = 113 - QUANTIZE = 114 - MATRIX_SET_DIAG = 115 - ROUND = 116 - HARD_SWISH = 117 - IF = 118 - WHILE = 119 - NON_MAX_SUPPRESSION_V4 = 120 - NON_MAX_SUPPRESSION_V5 = 121 - SCATTER_ND = 122 - SELECT_V2 = 123 - DENSIFY = 124 - SEGMENT_SUM = 125 - BATCH_MATMUL = 126 - - - - -class Uint16Vector(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsUint16Vector(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = Uint16Vector() - x.Init(buf, n + offset) - return x - - @classmethod - def Uint16VectorBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # Uint16Vector - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # Uint16Vector - def Values(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Uint16Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 2)) - return 0 - - # Uint16Vector - def ValuesAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint16Flags, o) - return 0 - - # Uint16Vector - def ValuesLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Uint16Vector - def ValuesIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - return o == 0 - -def Uint16VectorStart(builder): builder.StartObject(1) -def Uint16VectorAddValues(builder, values): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(values), 0) -def Uint16VectorStartValuesVector(builder, numElems): return builder.StartVector(2, numElems, 2) -def Uint16VectorEnd(builder): return builder.EndObject() - -try: - from typing import List -except: - pass - -class Uint16VectorT(object): - - # Uint16VectorT - def __init__(self): - self.values = None # type: List[int] - - @classmethod - def InitFromBuf(cls, buf, pos): - uint16Vector = Uint16Vector() - uint16Vector.Init(buf, pos) - return cls.InitFromObj(uint16Vector) - - @classmethod - def InitFromObj(cls, uint16Vector): - x = Uint16VectorT() - x._UnPack(uint16Vector) - return x - - # Uint16VectorT - def _UnPack(self, uint16Vector): - if uint16Vector is None: - return - if not uint16Vector.ValuesIsNone(): - if np is None: - self.values = [] - for i in range(uint16Vector.ValuesLength()): - self.values.append(uint16Vector.Values(i)) - else: - self.values = uint16Vector.ValuesAsNumpy() - - # Uint16VectorT - def Pack(self, builder): - if self.values is not None: - if np is not None and type(self.values) is np.ndarray: - values = builder.CreateNumpyVector(self.values) - else: - Uint16VectorStartValuesVector(builder, len(self.values)) - for i in reversed(range(len(self.values))): - builder.PrependUint16(self.values[i]) - values = builder.EndVector(len(self.values)) - Uint16VectorStart(builder) - if self.values is not None: - Uint16VectorAddValues(builder, values) - uint16Vector = Uint16VectorEnd(builder) - return uint16Vector - - - -class NotEqualOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsNotEqualOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = NotEqualOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def NotEqualOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # NotEqualOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def NotEqualOptionsStart(builder): builder.StartObject(0) -def NotEqualOptionsEnd(builder): return builder.EndObject() - - -class NotEqualOptionsT(object): - - # NotEqualOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - notEqualOptions = NotEqualOptions() - notEqualOptions.Init(buf, pos) - return cls.InitFromObj(notEqualOptions) - - @classmethod - def InitFromObj(cls, notEqualOptions): - x = NotEqualOptionsT() - x._UnPack(notEqualOptions) - return x - - # NotEqualOptionsT - def _UnPack(self, notEqualOptions): - if notEqualOptions is None: - return - - # NotEqualOptionsT - def Pack(self, builder): - NotEqualOptionsStart(builder) - notEqualOptions = NotEqualOptionsEnd(builder) - return notEqualOptions - - - -class ExpOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsExpOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ExpOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def ExpOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ExpOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def ExpOptionsStart(builder): builder.StartObject(0) -def ExpOptionsEnd(builder): return builder.EndObject() - - -class ExpOptionsT(object): - - # ExpOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - expOptions = ExpOptions() - expOptions.Init(buf, pos) - return cls.InitFromObj(expOptions) - - @classmethod - def InitFromObj(cls, expOptions): - x = ExpOptionsT() - x._UnPack(expOptions) - return x - - # ExpOptionsT - def _UnPack(self, expOptions): - if expOptions is None: - return - - # ExpOptionsT - def Pack(self, builder): - ExpOptionsStart(builder) - expOptions = ExpOptionsEnd(builder) - return expOptions - - - -class TileOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsTileOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = TileOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def TileOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # TileOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def TileOptionsStart(builder): builder.StartObject(0) -def TileOptionsEnd(builder): return builder.EndObject() - - -class TileOptionsT(object): - - # TileOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - tileOptions = TileOptions() - tileOptions.Init(buf, pos) - return cls.InitFromObj(tileOptions) - - @classmethod - def InitFromObj(cls, tileOptions): - x = TileOptionsT() - x._UnPack(tileOptions) - return x - - # TileOptionsT - def _UnPack(self, tileOptions): - if tileOptions is None: - return - - # TileOptionsT - def Pack(self, builder): - TileOptionsStart(builder) - tileOptions = TileOptionsEnd(builder) - return tileOptions - - - -class LeakyReluOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsLeakyReluOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = LeakyReluOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def LeakyReluOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # LeakyReluOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # LeakyReluOptions - def Alpha(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos) - return 0.0 - -def LeakyReluOptionsStart(builder): builder.StartObject(1) -def LeakyReluOptionsAddAlpha(builder, alpha): builder.PrependFloat32Slot(0, alpha, 0.0) -def LeakyReluOptionsEnd(builder): return builder.EndObject() - - -class LeakyReluOptionsT(object): - - # LeakyReluOptionsT - def __init__(self): - self.alpha = 0.0 # type: float - - @classmethod - def InitFromBuf(cls, buf, pos): - leakyReluOptions = LeakyReluOptions() - leakyReluOptions.Init(buf, pos) - return cls.InitFromObj(leakyReluOptions) - - @classmethod - def InitFromObj(cls, leakyReluOptions): - x = LeakyReluOptionsT() - x._UnPack(leakyReluOptions) - return x - - # LeakyReluOptionsT - def _UnPack(self, leakyReluOptions): - if leakyReluOptions is None: - return - self.alpha = leakyReluOptions.Alpha() - - # LeakyReluOptionsT - def Pack(self, builder): - LeakyReluOptionsStart(builder) - LeakyReluOptionsAddAlpha(builder, self.alpha) - leakyReluOptions = LeakyReluOptionsEnd(builder) - return leakyReluOptions - - - -class SelectOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSelectOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SelectOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SelectOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SelectOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def SelectOptionsStart(builder): builder.StartObject(0) -def SelectOptionsEnd(builder): return builder.EndObject() - - -class SelectOptionsT(object): - - # SelectOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - selectOptions = SelectOptions() - selectOptions.Init(buf, pos) - return cls.InitFromObj(selectOptions) - - @classmethod - def InitFromObj(cls, selectOptions): - x = SelectOptionsT() - x._UnPack(selectOptions) - return x - - # SelectOptionsT - def _UnPack(self, selectOptions): - if selectOptions is None: - return - - # SelectOptionsT - def Pack(self, builder): - SelectOptionsStart(builder) - selectOptions = SelectOptionsEnd(builder) - return selectOptions - - - -class FillOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsFillOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = FillOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def FillOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # FillOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def FillOptionsStart(builder): builder.StartObject(0) -def FillOptionsEnd(builder): return builder.EndObject() - - -class FillOptionsT(object): - - # FillOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - fillOptions = FillOptions() - fillOptions.Init(buf, pos) - return cls.InitFromObj(fillOptions) - - @classmethod - def InitFromObj(cls, fillOptions): - x = FillOptionsT() - x._UnPack(fillOptions) - return x - - # FillOptionsT - def _UnPack(self, fillOptions): - if fillOptions is None: - return - - # FillOptionsT - def Pack(self, builder): - FillOptionsStart(builder) - fillOptions = FillOptionsEnd(builder) - return fillOptions - - - -class GatherOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsGatherOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = GatherOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def GatherOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # GatherOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # GatherOptions - def Axis(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - -def GatherOptionsStart(builder): builder.StartObject(1) -def GatherOptionsAddAxis(builder, axis): builder.PrependInt32Slot(0, axis, 0) -def GatherOptionsEnd(builder): return builder.EndObject() - - -class GatherOptionsT(object): - - # GatherOptionsT - def __init__(self): - self.axis = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - gatherOptions = GatherOptions() - gatherOptions.Init(buf, pos) - return cls.InitFromObj(gatherOptions) - - @classmethod - def InitFromObj(cls, gatherOptions): - x = GatherOptionsT() - x._UnPack(gatherOptions) - return x - - # GatherOptionsT - def _UnPack(self, gatherOptions): - if gatherOptions is None: - return - self.axis = gatherOptions.Axis() - - # GatherOptionsT - def Pack(self, builder): - GatherOptionsStart(builder) - GatherOptionsAddAxis(builder, self.axis) - gatherOptions = GatherOptionsEnd(builder) - return gatherOptions - - -class TensorType(object): - FLOAT32 = 0 - FLOAT16 = 1 - INT32 = 2 - UINT8 = 3 - INT64 = 4 - STRING = 5 - BOOL = 6 - INT16 = 7 - COMPLEX64 = 8 - INT8 = 9 - FLOAT64 = 10 - - - - -class PadOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsPadOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = PadOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def PadOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # PadOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def PadOptionsStart(builder): builder.StartObject(0) -def PadOptionsEnd(builder): return builder.EndObject() - - -class PadOptionsT(object): - - # PadOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - padOptions = PadOptions() - padOptions.Init(buf, pos) - return cls.InitFromObj(padOptions) - - @classmethod - def InitFromObj(cls, padOptions): - x = PadOptionsT() - x._UnPack(padOptions) - return x - - # PadOptionsT - def _UnPack(self, padOptions): - if padOptions is None: - return - - # PadOptionsT - def Pack(self, builder): - PadOptionsStart(builder) - padOptions = PadOptionsEnd(builder) - return padOptions - - - -class LogicalOrOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsLogicalOrOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = LogicalOrOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def LogicalOrOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # LogicalOrOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def LogicalOrOptionsStart(builder): builder.StartObject(0) -def LogicalOrOptionsEnd(builder): return builder.EndObject() - - -class LogicalOrOptionsT(object): - - # LogicalOrOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - logicalOrOptions = LogicalOrOptions() - logicalOrOptions.Init(buf, pos) - return cls.InitFromObj(logicalOrOptions) - - @classmethod - def InitFromObj(cls, logicalOrOptions): - x = LogicalOrOptionsT() - x._UnPack(logicalOrOptions) - return x - - # LogicalOrOptionsT - def _UnPack(self, logicalOrOptions): - if logicalOrOptions is None: - return - - # LogicalOrOptionsT - def Pack(self, builder): - LogicalOrOptionsStart(builder) - logicalOrOptions = LogicalOrOptionsEnd(builder) - return logicalOrOptions - - - -class NegOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsNegOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = NegOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def NegOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # NegOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def NegOptionsStart(builder): builder.StartObject(0) -def NegOptionsEnd(builder): return builder.EndObject() - - -class NegOptionsT(object): - - # NegOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - negOptions = NegOptions() - negOptions.Init(buf, pos) - return cls.InitFromObj(negOptions) - - @classmethod - def InitFromObj(cls, negOptions): - x = NegOptionsT() - x._UnPack(negOptions) - return x - - # NegOptionsT - def _UnPack(self, negOptions): - if negOptions is None: - return - - # NegOptionsT - def Pack(self, builder): - NegOptionsStart(builder) - negOptions = NegOptionsEnd(builder) - return negOptions - - - -class DepthToSpaceOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsDepthToSpaceOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = DepthToSpaceOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def DepthToSpaceOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # DepthToSpaceOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # DepthToSpaceOptions - def BlockSize(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - -def DepthToSpaceOptionsStart(builder): builder.StartObject(1) -def DepthToSpaceOptionsAddBlockSize(builder, blockSize): builder.PrependInt32Slot(0, blockSize, 0) -def DepthToSpaceOptionsEnd(builder): return builder.EndObject() - - -class DepthToSpaceOptionsT(object): - - # DepthToSpaceOptionsT - def __init__(self): - self.blockSize = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - depthToSpaceOptions = DepthToSpaceOptions() - depthToSpaceOptions.Init(buf, pos) - return cls.InitFromObj(depthToSpaceOptions) - - @classmethod - def InitFromObj(cls, depthToSpaceOptions): - x = DepthToSpaceOptionsT() - x._UnPack(depthToSpaceOptions) - return x - - # DepthToSpaceOptionsT - def _UnPack(self, depthToSpaceOptions): - if depthToSpaceOptions is None: - return - self.blockSize = depthToSpaceOptions.BlockSize() - - # DepthToSpaceOptionsT - def Pack(self, builder): - DepthToSpaceOptionsStart(builder) - DepthToSpaceOptionsAddBlockSize(builder, self.blockSize) - depthToSpaceOptions = DepthToSpaceOptionsEnd(builder) - return depthToSpaceOptions - - - -class SoftmaxOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSoftmaxOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SoftmaxOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SoftmaxOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SoftmaxOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # SoftmaxOptions - def Beta(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos) - return 0.0 - -def SoftmaxOptionsStart(builder): builder.StartObject(1) -def SoftmaxOptionsAddBeta(builder, beta): builder.PrependFloat32Slot(0, beta, 0.0) -def SoftmaxOptionsEnd(builder): return builder.EndObject() - - -class SoftmaxOptionsT(object): - - # SoftmaxOptionsT - def __init__(self): - self.beta = 0.0 # type: float - - @classmethod - def InitFromBuf(cls, buf, pos): - softmaxOptions = SoftmaxOptions() - softmaxOptions.Init(buf, pos) - return cls.InitFromObj(softmaxOptions) - - @classmethod - def InitFromObj(cls, softmaxOptions): - x = SoftmaxOptionsT() - x._UnPack(softmaxOptions) - return x - - # SoftmaxOptionsT - def _UnPack(self, softmaxOptions): - if softmaxOptions is None: - return - self.beta = softmaxOptions.Beta() - - # SoftmaxOptionsT - def Pack(self, builder): - SoftmaxOptionsStart(builder) - SoftmaxOptionsAddBeta(builder, self.beta) - softmaxOptions = SoftmaxOptionsEnd(builder) - return softmaxOptions - - - -class TransposeOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsTransposeOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = TransposeOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def TransposeOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # TransposeOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def TransposeOptionsStart(builder): builder.StartObject(0) -def TransposeOptionsEnd(builder): return builder.EndObject() - - -class TransposeOptionsT(object): - - # TransposeOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - transposeOptions = TransposeOptions() - transposeOptions.Init(buf, pos) - return cls.InitFromObj(transposeOptions) - - @classmethod - def InitFromObj(cls, transposeOptions): - x = TransposeOptionsT() - x._UnPack(transposeOptions) - return x - - # TransposeOptionsT - def _UnPack(self, transposeOptions): - if transposeOptions is None: - return - - # TransposeOptionsT - def Pack(self, builder): - TransposeOptionsStart(builder) - transposeOptions = TransposeOptionsEnd(builder) - return transposeOptions - - - -class OneHotOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsOneHotOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = OneHotOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def OneHotOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # OneHotOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # OneHotOptions - def Axis(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - -def OneHotOptionsStart(builder): builder.StartObject(1) -def OneHotOptionsAddAxis(builder, axis): builder.PrependInt32Slot(0, axis, 0) -def OneHotOptionsEnd(builder): return builder.EndObject() - - -class OneHotOptionsT(object): - - # OneHotOptionsT - def __init__(self): - self.axis = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - oneHotOptions = OneHotOptions() - oneHotOptions.Init(buf, pos) - return cls.InitFromObj(oneHotOptions) - - @classmethod - def InitFromObj(cls, oneHotOptions): - x = OneHotOptionsT() - x._UnPack(oneHotOptions) - return x - - # OneHotOptionsT - def _UnPack(self, oneHotOptions): - if oneHotOptions is None: - return - self.axis = oneHotOptions.Axis() - - # OneHotOptionsT - def Pack(self, builder): - OneHotOptionsStart(builder) - OneHotOptionsAddAxis(builder, self.axis) - oneHotOptions = OneHotOptionsEnd(builder) - return oneHotOptions - - - -class GatherNdOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsGatherNdOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = GatherNdOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def GatherNdOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # GatherNdOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def GatherNdOptionsStart(builder): builder.StartObject(0) -def GatherNdOptionsEnd(builder): return builder.EndObject() - - -class GatherNdOptionsT(object): - - # GatherNdOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - gatherNdOptions = GatherNdOptions() - gatherNdOptions.Init(buf, pos) - return cls.InitFromObj(gatherNdOptions) - - @classmethod - def InitFromObj(cls, gatherNdOptions): - x = GatherNdOptionsT() - x._UnPack(gatherNdOptions) - return x - - # GatherNdOptionsT - def _UnPack(self, gatherNdOptions): - if gatherNdOptions is None: - return - - # GatherNdOptionsT - def Pack(self, builder): - GatherNdOptionsStart(builder) - gatherNdOptions = GatherNdOptionsEnd(builder) - return gatherNdOptions - - - -class BidirectionalSequenceRNNOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsBidirectionalSequenceRNNOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = BidirectionalSequenceRNNOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def BidirectionalSequenceRNNOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # BidirectionalSequenceRNNOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # BidirectionalSequenceRNNOptions - def TimeMajor(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - - # BidirectionalSequenceRNNOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # BidirectionalSequenceRNNOptions - def MergeOutputs(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - - # BidirectionalSequenceRNNOptions - def AsymmetricQuantizeInputs(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def BidirectionalSequenceRNNOptionsStart(builder): builder.StartObject(4) -def BidirectionalSequenceRNNOptionsAddTimeMajor(builder, timeMajor): builder.PrependBoolSlot(0, timeMajor, 0) -def BidirectionalSequenceRNNOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(1, fusedActivationFunction, 0) -def BidirectionalSequenceRNNOptionsAddMergeOutputs(builder, mergeOutputs): builder.PrependBoolSlot(2, mergeOutputs, 0) -def BidirectionalSequenceRNNOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(3, asymmetricQuantizeInputs, 0) -def BidirectionalSequenceRNNOptionsEnd(builder): return builder.EndObject() - - -class BidirectionalSequenceRNNOptionsT(object): - - # BidirectionalSequenceRNNOptionsT - def __init__(self): - self.timeMajor = False # type: bool - self.fusedActivationFunction = 0 # type: int - self.mergeOutputs = False # type: bool - self.asymmetricQuantizeInputs = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - bidirectionalSequenceRNNOptions = BidirectionalSequenceRNNOptions() - bidirectionalSequenceRNNOptions.Init(buf, pos) - return cls.InitFromObj(bidirectionalSequenceRNNOptions) - - @classmethod - def InitFromObj(cls, bidirectionalSequenceRNNOptions): - x = BidirectionalSequenceRNNOptionsT() - x._UnPack(bidirectionalSequenceRNNOptions) - return x - - # BidirectionalSequenceRNNOptionsT - def _UnPack(self, bidirectionalSequenceRNNOptions): - if bidirectionalSequenceRNNOptions is None: - return - self.timeMajor = bidirectionalSequenceRNNOptions.TimeMajor() - self.fusedActivationFunction = bidirectionalSequenceRNNOptions.FusedActivationFunction() - self.mergeOutputs = bidirectionalSequenceRNNOptions.MergeOutputs() - self.asymmetricQuantizeInputs = bidirectionalSequenceRNNOptions.AsymmetricQuantizeInputs() - - # BidirectionalSequenceRNNOptionsT - def Pack(self, builder): - BidirectionalSequenceRNNOptionsStart(builder) - BidirectionalSequenceRNNOptionsAddTimeMajor(builder, self.timeMajor) - BidirectionalSequenceRNNOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - BidirectionalSequenceRNNOptionsAddMergeOutputs(builder, self.mergeOutputs) - BidirectionalSequenceRNNOptionsAddAsymmetricQuantizeInputs(builder, self.asymmetricQuantizeInputs) - bidirectionalSequenceRNNOptions = BidirectionalSequenceRNNOptionsEnd(builder) - return bidirectionalSequenceRNNOptions - - - -class UnpackOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsUnpackOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = UnpackOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def UnpackOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # UnpackOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # UnpackOptions - def Num(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # UnpackOptions - def Axis(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - -def UnpackOptionsStart(builder): builder.StartObject(2) -def UnpackOptionsAddNum(builder, num): builder.PrependInt32Slot(0, num, 0) -def UnpackOptionsAddAxis(builder, axis): builder.PrependInt32Slot(1, axis, 0) -def UnpackOptionsEnd(builder): return builder.EndObject() - - -class UnpackOptionsT(object): - - # UnpackOptionsT - def __init__(self): - self.num = 0 # type: int - self.axis = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - unpackOptions = UnpackOptions() - unpackOptions.Init(buf, pos) - return cls.InitFromObj(unpackOptions) - - @classmethod - def InitFromObj(cls, unpackOptions): - x = UnpackOptionsT() - x._UnPack(unpackOptions) - return x - - # UnpackOptionsT - def _UnPack(self, unpackOptions): - if unpackOptions is None: - return - self.num = unpackOptions.Num() - self.axis = unpackOptions.Axis() - - # UnpackOptionsT - def Pack(self, builder): - UnpackOptionsStart(builder) - UnpackOptionsAddNum(builder, self.num) - UnpackOptionsAddAxis(builder, self.axis) - unpackOptions = UnpackOptionsEnd(builder) - return unpackOptions - - - -class WhileOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsWhileOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = WhileOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def WhileOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # WhileOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # WhileOptions - def CondSubgraphIndex(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # WhileOptions - def BodySubgraphIndex(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - -def WhileOptionsStart(builder): builder.StartObject(2) -def WhileOptionsAddCondSubgraphIndex(builder, condSubgraphIndex): builder.PrependInt32Slot(0, condSubgraphIndex, 0) -def WhileOptionsAddBodySubgraphIndex(builder, bodySubgraphIndex): builder.PrependInt32Slot(1, bodySubgraphIndex, 0) -def WhileOptionsEnd(builder): return builder.EndObject() - - -class WhileOptionsT(object): - - # WhileOptionsT - def __init__(self): - self.condSubgraphIndex = 0 # type: int - self.bodySubgraphIndex = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - whileOptions = WhileOptions() - whileOptions.Init(buf, pos) - return cls.InitFromObj(whileOptions) - - @classmethod - def InitFromObj(cls, whileOptions): - x = WhileOptionsT() - x._UnPack(whileOptions) - return x - - # WhileOptionsT - def _UnPack(self, whileOptions): - if whileOptions is None: - return - self.condSubgraphIndex = whileOptions.CondSubgraphIndex() - self.bodySubgraphIndex = whileOptions.BodySubgraphIndex() - - # WhileOptionsT - def Pack(self, builder): - WhileOptionsStart(builder) - WhileOptionsAddCondSubgraphIndex(builder, self.condSubgraphIndex) - WhileOptionsAddBodySubgraphIndex(builder, self.bodySubgraphIndex) - whileOptions = WhileOptionsEnd(builder) - return whileOptions - - - -class NonMaxSuppressionV5Options(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsNonMaxSuppressionV5Options(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = NonMaxSuppressionV5Options() - x.Init(buf, n + offset) - return x - - @classmethod - def NonMaxSuppressionV5OptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # NonMaxSuppressionV5Options - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def NonMaxSuppressionV5OptionsStart(builder): builder.StartObject(0) -def NonMaxSuppressionV5OptionsEnd(builder): return builder.EndObject() - - -class NonMaxSuppressionV5OptionsT(object): - - # NonMaxSuppressionV5OptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - nonMaxSuppressionV5Options = NonMaxSuppressionV5Options() - nonMaxSuppressionV5Options.Init(buf, pos) - return cls.InitFromObj(nonMaxSuppressionV5Options) - - @classmethod - def InitFromObj(cls, nonMaxSuppressionV5Options): - x = NonMaxSuppressionV5OptionsT() - x._UnPack(nonMaxSuppressionV5Options) - return x - - # NonMaxSuppressionV5OptionsT - def _UnPack(self, nonMaxSuppressionV5Options): - if nonMaxSuppressionV5Options is None: - return - - # NonMaxSuppressionV5OptionsT - def Pack(self, builder): - NonMaxSuppressionV5OptionsStart(builder) - nonMaxSuppressionV5Options = NonMaxSuppressionV5OptionsEnd(builder) - return nonMaxSuppressionV5Options - - -class BuiltinOptions(object): - NONE = 0 - Conv2DOptions = 1 - DepthwiseConv2DOptions = 2 - ConcatEmbeddingsOptions = 3 - LSHProjectionOptions = 4 - Pool2DOptions = 5 - SVDFOptions = 6 - RNNOptions = 7 - FullyConnectedOptions = 8 - SoftmaxOptions = 9 - ConcatenationOptions = 10 - AddOptions = 11 - L2NormOptions = 12 - LocalResponseNormalizationOptions = 13 - LSTMOptions = 14 - ResizeBilinearOptions = 15 - CallOptions = 16 - ReshapeOptions = 17 - SkipGramOptions = 18 - SpaceToDepthOptions = 19 - EmbeddingLookupSparseOptions = 20 - MulOptions = 21 - PadOptions = 22 - GatherOptions = 23 - BatchToSpaceNDOptions = 24 - SpaceToBatchNDOptions = 25 - TransposeOptions = 26 - ReducerOptions = 27 - SubOptions = 28 - DivOptions = 29 - SqueezeOptions = 30 - SequenceRNNOptions = 31 - StridedSliceOptions = 32 - ExpOptions = 33 - TopKV2Options = 34 - SplitOptions = 35 - LogSoftmaxOptions = 36 - CastOptions = 37 - DequantizeOptions = 38 - MaximumMinimumOptions = 39 - ArgMaxOptions = 40 - LessOptions = 41 - NegOptions = 42 - PadV2Options = 43 - GreaterOptions = 44 - GreaterEqualOptions = 45 - LessEqualOptions = 46 - SelectOptions = 47 - SliceOptions = 48 - TransposeConvOptions = 49 - SparseToDenseOptions = 50 - TileOptions = 51 - ExpandDimsOptions = 52 - EqualOptions = 53 - NotEqualOptions = 54 - ShapeOptions = 55 - PowOptions = 56 - ArgMinOptions = 57 - FakeQuantOptions = 58 - PackOptions = 59 - LogicalOrOptions = 60 - OneHotOptions = 61 - LogicalAndOptions = 62 - LogicalNotOptions = 63 - UnpackOptions = 64 - FloorDivOptions = 65 - SquareOptions = 66 - ZerosLikeOptions = 67 - FillOptions = 68 - BidirectionalSequenceLSTMOptions = 69 - BidirectionalSequenceRNNOptions = 70 - UnidirectionalSequenceLSTMOptions = 71 - FloorModOptions = 72 - RangeOptions = 73 - ResizeNearestNeighborOptions = 74 - LeakyReluOptions = 75 - SquaredDifferenceOptions = 76 - MirrorPadOptions = 77 - AbsOptions = 78 - SplitVOptions = 79 - UniqueOptions = 80 - ReverseV2Options = 81 - AddNOptions = 82 - GatherNdOptions = 83 - CosOptions = 84 - WhereOptions = 85 - RankOptions = 86 - ReverseSequenceOptions = 87 - MatrixDiagOptions = 88 - QuantizeOptions = 89 - MatrixSetDiagOptions = 90 - HardSwishOptions = 91 - IfOptions = 92 - WhileOptions = 93 - DepthToSpaceOptions = 94 - NonMaxSuppressionV4Options = 95 - NonMaxSuppressionV5Options = 96 - ScatterNdOptions = 97 - SelectV2Options = 98 - DensifyOptions = 99 - SegmentSumOptions = 100 - BatchMatMulOptions = 101 - - -def BuiltinOptionsCreator(unionType, table): - from flatbuffers.table import Table - if not isinstance(table, Table): - return None - if unionType == BuiltinOptions().Conv2DOptions: - return Conv2DOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().DepthwiseConv2DOptions: - return DepthwiseConv2DOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ConcatEmbeddingsOptions: - return ConcatEmbeddingsOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().LSHProjectionOptions: - return LSHProjectionOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().Pool2DOptions: - return Pool2DOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SVDFOptions: - return SVDFOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().RNNOptions: - return RNNOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().FullyConnectedOptions: - return FullyConnectedOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SoftmaxOptions: - return SoftmaxOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ConcatenationOptions: - return ConcatenationOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().AddOptions: - return AddOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().L2NormOptions: - return L2NormOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().LocalResponseNormalizationOptions: - return LocalResponseNormalizationOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().LSTMOptions: - return LSTMOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ResizeBilinearOptions: - return ResizeBilinearOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().CallOptions: - return CallOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ReshapeOptions: - return ReshapeOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SkipGramOptions: - return SkipGramOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SpaceToDepthOptions: - return SpaceToDepthOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().EmbeddingLookupSparseOptions: - return EmbeddingLookupSparseOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().MulOptions: - return MulOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().PadOptions: - return PadOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().GatherOptions: - return GatherOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().BatchToSpaceNDOptions: - return BatchToSpaceNDOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SpaceToBatchNDOptions: - return SpaceToBatchNDOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().TransposeOptions: - return TransposeOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ReducerOptions: - return ReducerOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SubOptions: - return SubOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().DivOptions: - return DivOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SqueezeOptions: - return SqueezeOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SequenceRNNOptions: - return SequenceRNNOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().StridedSliceOptions: - return StridedSliceOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ExpOptions: - return ExpOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().TopKV2Options: - return TopKV2OptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SplitOptions: - return SplitOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().LogSoftmaxOptions: - return LogSoftmaxOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().CastOptions: - return CastOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().DequantizeOptions: - return DequantizeOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().MaximumMinimumOptions: - return MaximumMinimumOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ArgMaxOptions: - return ArgMaxOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().LessOptions: - return LessOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().NegOptions: - return NegOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().PadV2Options: - return PadV2OptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().GreaterOptions: - return GreaterOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().GreaterEqualOptions: - return GreaterEqualOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().LessEqualOptions: - return LessEqualOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SelectOptions: - return SelectOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SliceOptions: - return SliceOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().TransposeConvOptions: - return TransposeConvOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SparseToDenseOptions: - return SparseToDenseOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().TileOptions: - return TileOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ExpandDimsOptions: - return ExpandDimsOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().EqualOptions: - return EqualOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().NotEqualOptions: - return NotEqualOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ShapeOptions: - return ShapeOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().PowOptions: - return PowOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ArgMinOptions: - return ArgMinOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().FakeQuantOptions: - return FakeQuantOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().PackOptions: - return PackOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().LogicalOrOptions: - return LogicalOrOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().OneHotOptions: - return OneHotOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().LogicalAndOptions: - return LogicalAndOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().LogicalNotOptions: - return LogicalNotOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().UnpackOptions: - return UnpackOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().FloorDivOptions: - return FloorDivOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SquareOptions: - return SquareOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ZerosLikeOptions: - return ZerosLikeOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().FillOptions: - return FillOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().BidirectionalSequenceLSTMOptions: - return BidirectionalSequenceLSTMOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().BidirectionalSequenceRNNOptions: - return BidirectionalSequenceRNNOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().UnidirectionalSequenceLSTMOptions: - return UnidirectionalSequenceLSTMOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().FloorModOptions: - return FloorModOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().RangeOptions: - return RangeOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ResizeNearestNeighborOptions: - return ResizeNearestNeighborOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().LeakyReluOptions: - return LeakyReluOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SquaredDifferenceOptions: - return SquaredDifferenceOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().MirrorPadOptions: - return MirrorPadOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().AbsOptions: - return AbsOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SplitVOptions: - return SplitVOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().UniqueOptions: - return UniqueOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ReverseV2Options: - return ReverseV2OptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().AddNOptions: - return AddNOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().GatherNdOptions: - return GatherNdOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().CosOptions: - return CosOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().WhereOptions: - return WhereOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().RankOptions: - return RankOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ReverseSequenceOptions: - return ReverseSequenceOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().MatrixDiagOptions: - return MatrixDiagOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().QuantizeOptions: - return QuantizeOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().MatrixSetDiagOptions: - return MatrixSetDiagOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().HardSwishOptions: - return HardSwishOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().IfOptions: - return IfOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().WhileOptions: - return WhileOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().DepthToSpaceOptions: - return DepthToSpaceOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().NonMaxSuppressionV4Options: - return NonMaxSuppressionV4OptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().NonMaxSuppressionV5Options: - return NonMaxSuppressionV5OptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().ScatterNdOptions: - return ScatterNdOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SelectV2Options: - return SelectV2OptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().DensifyOptions: - return DensifyOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().SegmentSumOptions: - return SegmentSumOptionsT.InitFromBuf(table.Bytes, table.Pos) - if unionType == BuiltinOptions().BatchMatMulOptions: - return BatchMatMulOptionsT.InitFromBuf(table.Bytes, table.Pos) - return None - - - -class DivOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsDivOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = DivOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def DivOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # DivOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # DivOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - -def DivOptionsStart(builder): builder.StartObject(1) -def DivOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) -def DivOptionsEnd(builder): return builder.EndObject() - - -class DivOptionsT(object): - - # DivOptionsT - def __init__(self): - self.fusedActivationFunction = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - divOptions = DivOptions() - divOptions.Init(buf, pos) - return cls.InitFromObj(divOptions) - - @classmethod - def InitFromObj(cls, divOptions): - x = DivOptionsT() - x._UnPack(divOptions) - return x - - # DivOptionsT - def _UnPack(self, divOptions): - if divOptions is None: - return - self.fusedActivationFunction = divOptions.FusedActivationFunction() - - # DivOptionsT - def Pack(self, builder): - DivOptionsStart(builder) - DivOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - divOptions = DivOptionsEnd(builder) - return divOptions - - - -class UnidirectionalSequenceLSTMOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsUnidirectionalSequenceLSTMOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = UnidirectionalSequenceLSTMOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def UnidirectionalSequenceLSTMOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # UnidirectionalSequenceLSTMOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # UnidirectionalSequenceLSTMOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # UnidirectionalSequenceLSTMOptions - def CellClip(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos) - return 0.0 - - # UnidirectionalSequenceLSTMOptions - def ProjClip(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos) - return 0.0 - - # UnidirectionalSequenceLSTMOptions - def TimeMajor(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - - # UnidirectionalSequenceLSTMOptions - def AsymmetricQuantizeInputs(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def UnidirectionalSequenceLSTMOptionsStart(builder): builder.StartObject(5) -def UnidirectionalSequenceLSTMOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) -def UnidirectionalSequenceLSTMOptionsAddCellClip(builder, cellClip): builder.PrependFloat32Slot(1, cellClip, 0.0) -def UnidirectionalSequenceLSTMOptionsAddProjClip(builder, projClip): builder.PrependFloat32Slot(2, projClip, 0.0) -def UnidirectionalSequenceLSTMOptionsAddTimeMajor(builder, timeMajor): builder.PrependBoolSlot(3, timeMajor, 0) -def UnidirectionalSequenceLSTMOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(4, asymmetricQuantizeInputs, 0) -def UnidirectionalSequenceLSTMOptionsEnd(builder): return builder.EndObject() - - -class UnidirectionalSequenceLSTMOptionsT(object): - - # UnidirectionalSequenceLSTMOptionsT - def __init__(self): - self.fusedActivationFunction = 0 # type: int - self.cellClip = 0.0 # type: float - self.projClip = 0.0 # type: float - self.timeMajor = False # type: bool - self.asymmetricQuantizeInputs = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - unidirectionalSequenceLSTMOptions = UnidirectionalSequenceLSTMOptions() - unidirectionalSequenceLSTMOptions.Init(buf, pos) - return cls.InitFromObj(unidirectionalSequenceLSTMOptions) - - @classmethod - def InitFromObj(cls, unidirectionalSequenceLSTMOptions): - x = UnidirectionalSequenceLSTMOptionsT() - x._UnPack(unidirectionalSequenceLSTMOptions) - return x - - # UnidirectionalSequenceLSTMOptionsT - def _UnPack(self, unidirectionalSequenceLSTMOptions): - if unidirectionalSequenceLSTMOptions is None: - return - self.fusedActivationFunction = unidirectionalSequenceLSTMOptions.FusedActivationFunction() - self.cellClip = unidirectionalSequenceLSTMOptions.CellClip() - self.projClip = unidirectionalSequenceLSTMOptions.ProjClip() - self.timeMajor = unidirectionalSequenceLSTMOptions.TimeMajor() - self.asymmetricQuantizeInputs = unidirectionalSequenceLSTMOptions.AsymmetricQuantizeInputs() - - # UnidirectionalSequenceLSTMOptionsT - def Pack(self, builder): - UnidirectionalSequenceLSTMOptionsStart(builder) - UnidirectionalSequenceLSTMOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - UnidirectionalSequenceLSTMOptionsAddCellClip(builder, self.cellClip) - UnidirectionalSequenceLSTMOptionsAddProjClip(builder, self.projClip) - UnidirectionalSequenceLSTMOptionsAddTimeMajor(builder, self.timeMajor) - UnidirectionalSequenceLSTMOptionsAddAsymmetricQuantizeInputs(builder, self.asymmetricQuantizeInputs) - unidirectionalSequenceLSTMOptions = UnidirectionalSequenceLSTMOptionsEnd(builder) - return unidirectionalSequenceLSTMOptions - - - -class GreaterOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsGreaterOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = GreaterOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def GreaterOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # GreaterOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def GreaterOptionsStart(builder): builder.StartObject(0) -def GreaterOptionsEnd(builder): return builder.EndObject() - - -class GreaterOptionsT(object): - - # GreaterOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - greaterOptions = GreaterOptions() - greaterOptions.Init(buf, pos) - return cls.InitFromObj(greaterOptions) - - @classmethod - def InitFromObj(cls, greaterOptions): - x = GreaterOptionsT() - x._UnPack(greaterOptions) - return x - - # GreaterOptionsT - def _UnPack(self, greaterOptions): - if greaterOptions is None: - return - - # GreaterOptionsT - def Pack(self, builder): - GreaterOptionsStart(builder) - greaterOptions = GreaterOptionsEnd(builder) - return greaterOptions - - - -class ArgMinOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsArgMinOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ArgMinOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def ArgMinOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ArgMinOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # ArgMinOptions - def OutputType(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - -def ArgMinOptionsStart(builder): builder.StartObject(1) -def ArgMinOptionsAddOutputType(builder, outputType): builder.PrependInt8Slot(0, outputType, 0) -def ArgMinOptionsEnd(builder): return builder.EndObject() - - -class ArgMinOptionsT(object): - - # ArgMinOptionsT - def __init__(self): - self.outputType = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - argMinOptions = ArgMinOptions() - argMinOptions.Init(buf, pos) - return cls.InitFromObj(argMinOptions) - - @classmethod - def InitFromObj(cls, argMinOptions): - x = ArgMinOptionsT() - x._UnPack(argMinOptions) - return x - - # ArgMinOptionsT - def _UnPack(self, argMinOptions): - if argMinOptions is None: - return - self.outputType = argMinOptions.OutputType() - - # ArgMinOptionsT - def Pack(self, builder): - ArgMinOptionsStart(builder) - ArgMinOptionsAddOutputType(builder, self.outputType) - argMinOptions = ArgMinOptionsEnd(builder) - return argMinOptions - - -class CustomOptionsFormat(object): - FLEXBUFFERS = 0 - - - - -class FloorModOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsFloorModOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = FloorModOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def FloorModOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # FloorModOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def FloorModOptionsStart(builder): builder.StartObject(0) -def FloorModOptionsEnd(builder): return builder.EndObject() - - -class FloorModOptionsT(object): - - # FloorModOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - floorModOptions = FloorModOptions() - floorModOptions.Init(buf, pos) - return cls.InitFromObj(floorModOptions) - - @classmethod - def InitFromObj(cls, floorModOptions): - x = FloorModOptionsT() - x._UnPack(floorModOptions) - return x - - # FloorModOptionsT - def _UnPack(self, floorModOptions): - if floorModOptions is None: - return - - # FloorModOptionsT - def Pack(self, builder): - FloorModOptionsStart(builder) - floorModOptions = FloorModOptionsEnd(builder) - return floorModOptions - - - -class QuantizationParameters(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsQuantizationParameters(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = QuantizationParameters() - x.Init(buf, n + offset) - return x - - @classmethod - def QuantizationParametersBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # QuantizationParameters - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # QuantizationParameters - def Min(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Float32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # QuantizationParameters - def MinAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Float32Flags, o) - return 0 - - # QuantizationParameters - def MinLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # QuantizationParameters - def MinIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - return o == 0 - - # QuantizationParameters - def Max(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Float32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # QuantizationParameters - def MaxAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Float32Flags, o) - return 0 - - # QuantizationParameters - def MaxLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # QuantizationParameters - def MaxIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - return o == 0 - - # QuantizationParameters - def Scale(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Float32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # QuantizationParameters - def ScaleAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Float32Flags, o) - return 0 - - # QuantizationParameters - def ScaleLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # QuantizationParameters - def ScaleIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - return o == 0 - - # QuantizationParameters - def ZeroPoint(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8)) - return 0 - - # QuantizationParameters - def ZeroPointAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int64Flags, o) - return 0 - - # QuantizationParameters - def ZeroPointLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # QuantizationParameters - def ZeroPointIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - return o == 0 - - # QuantizationParameters - def DetailsType(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) - return 0 - - # QuantizationParameters - def Details(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - if o != 0: - from flatbuffers.table import Table - obj = Table(bytearray(), 0) - self._tab.Union(obj, o) - return obj - return None - - # QuantizationParameters - def QuantizedDimension(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - -def QuantizationParametersStart(builder): builder.StartObject(7) -def QuantizationParametersAddMin(builder, min): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(min), 0) -def QuantizationParametersStartMinVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def QuantizationParametersAddMax(builder, max): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(max), 0) -def QuantizationParametersStartMaxVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def QuantizationParametersAddScale(builder, scale): builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(scale), 0) -def QuantizationParametersStartScaleVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def QuantizationParametersAddZeroPoint(builder, zeroPoint): builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(zeroPoint), 0) -def QuantizationParametersStartZeroPointVector(builder, numElems): return builder.StartVector(8, numElems, 8) -def QuantizationParametersAddDetailsType(builder, detailsType): builder.PrependUint8Slot(4, detailsType, 0) -def QuantizationParametersAddDetails(builder, details): builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(details), 0) -def QuantizationParametersAddQuantizedDimension(builder, quantizedDimension): builder.PrependInt32Slot(6, quantizedDimension, 0) -def QuantizationParametersEnd(builder): return builder.EndObject() - -try: - from typing import List, Union -except: - pass - -class QuantizationParametersT(object): - - # QuantizationParametersT - def __init__(self): - self.min = None # type: List[float] - self.max = None # type: List[float] - self.scale = None # type: List[float] - self.zeroPoint = None # type: List[int] - self.detailsType = 0 # type: int - self.details = None # type: Union[None, CustomQuantizationT] - self.quantizedDimension = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - quantizationParameters = QuantizationParameters() - quantizationParameters.Init(buf, pos) - return cls.InitFromObj(quantizationParameters) - - @classmethod - def InitFromObj(cls, quantizationParameters): - x = QuantizationParametersT() - x._UnPack(quantizationParameters) - return x - - # QuantizationParametersT - def _UnPack(self, quantizationParameters): - if quantizationParameters is None: - return - if not quantizationParameters.MinIsNone(): - if np is None: - self.min = [] - for i in range(quantizationParameters.MinLength()): - self.min.append(quantizationParameters.Min(i)) - else: - self.min = quantizationParameters.MinAsNumpy() - if not quantizationParameters.MaxIsNone(): - if np is None: - self.max = [] - for i in range(quantizationParameters.MaxLength()): - self.max.append(quantizationParameters.Max(i)) - else: - self.max = quantizationParameters.MaxAsNumpy() - if not quantizationParameters.ScaleIsNone(): - if np is None: - self.scale = [] - for i in range(quantizationParameters.ScaleLength()): - self.scale.append(quantizationParameters.Scale(i)) - else: - self.scale = quantizationParameters.ScaleAsNumpy() - if not quantizationParameters.ZeroPointIsNone(): - if np is None: - self.zeroPoint = [] - for i in range(quantizationParameters.ZeroPointLength()): - self.zeroPoint.append(quantizationParameters.ZeroPoint(i)) - else: - self.zeroPoint = quantizationParameters.ZeroPointAsNumpy() - self.detailsType = quantizationParameters.DetailsType() - self.details = QuantizationDetailsCreator(self.detailsType, quantizationParameters.Details()) - self.quantizedDimension = quantizationParameters.QuantizedDimension() - - # QuantizationParametersT - def Pack(self, builder): - if self.min is not None: - if np is not None and type(self.min) is np.ndarray: - min = builder.CreateNumpyVector(self.min) - else: - QuantizationParametersStartMinVector(builder, len(self.min)) - for i in reversed(range(len(self.min))): - builder.PrependFloat32(self.min[i]) - min = builder.EndVector(len(self.min)) - if self.max is not None: - if np is not None and type(self.max) is np.ndarray: - max = builder.CreateNumpyVector(self.max) - else: - QuantizationParametersStartMaxVector(builder, len(self.max)) - for i in reversed(range(len(self.max))): - builder.PrependFloat32(self.max[i]) - max = builder.EndVector(len(self.max)) - if self.scale is not None: - if np is not None and type(self.scale) is np.ndarray: - scale = builder.CreateNumpyVector(self.scale) - else: - QuantizationParametersStartScaleVector(builder, len(self.scale)) - for i in reversed(range(len(self.scale))): - builder.PrependFloat32(self.scale[i]) - scale = builder.EndVector(len(self.scale)) - if self.zeroPoint is not None: - if np is not None and type(self.zeroPoint) is np.ndarray: - zeroPoint = builder.CreateNumpyVector(self.zeroPoint) - else: - QuantizationParametersStartZeroPointVector(builder, len(self.zeroPoint)) - for i in reversed(range(len(self.zeroPoint))): - builder.PrependInt64(self.zeroPoint[i]) - zeroPoint = builder.EndVector(len(self.zeroPoint)) - if self.details is not None: - details = self.details.Pack(builder) - QuantizationParametersStart(builder) - if self.min is not None: - QuantizationParametersAddMin(builder, min) - if self.max is not None: - QuantizationParametersAddMax(builder, max) - if self.scale is not None: - QuantizationParametersAddScale(builder, scale) - if self.zeroPoint is not None: - QuantizationParametersAddZeroPoint(builder, zeroPoint) - QuantizationParametersAddDetailsType(builder, self.detailsType) - if self.details is not None: - QuantizationParametersAddDetails(builder, details) - QuantizationParametersAddQuantizedDimension(builder, self.quantizedDimension) - quantizationParameters = QuantizationParametersEnd(builder) - return quantizationParameters - - - -class SliceOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSliceOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SliceOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SliceOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SliceOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def SliceOptionsStart(builder): builder.StartObject(0) -def SliceOptionsEnd(builder): return builder.EndObject() - - -class SliceOptionsT(object): - - # SliceOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - sliceOptions = SliceOptions() - sliceOptions.Init(buf, pos) - return cls.InitFromObj(sliceOptions) - - @classmethod - def InitFromObj(cls, sliceOptions): - x = SliceOptionsT() - x._UnPack(sliceOptions) - return x - - # SliceOptionsT - def _UnPack(self, sliceOptions): - if sliceOptions is None: - return - - # SliceOptionsT - def Pack(self, builder): - SliceOptionsStart(builder) - sliceOptions = SliceOptionsEnd(builder) - return sliceOptions - - - -class WhereOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsWhereOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = WhereOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def WhereOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # WhereOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def WhereOptionsStart(builder): builder.StartObject(0) -def WhereOptionsEnd(builder): return builder.EndObject() - - -class WhereOptionsT(object): - - # WhereOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - whereOptions = WhereOptions() - whereOptions.Init(buf, pos) - return cls.InitFromObj(whereOptions) - - @classmethod - def InitFromObj(cls, whereOptions): - x = WhereOptionsT() - x._UnPack(whereOptions) - return x - - # WhereOptionsT - def _UnPack(self, whereOptions): - if whereOptions is None: - return - - # WhereOptionsT - def Pack(self, builder): - WhereOptionsStart(builder) - whereOptions = WhereOptionsEnd(builder) - return whereOptions - - - -class Conv2DOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsConv2DOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = Conv2DOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def Conv2DOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # Conv2DOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # Conv2DOptions - def Padding(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # Conv2DOptions - def StrideW(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # Conv2DOptions - def StrideH(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # Conv2DOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # Conv2DOptions - def DilationWFactor(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 1 - - # Conv2DOptions - def DilationHFactor(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 1 - -def Conv2DOptionsStart(builder): builder.StartObject(6) -def Conv2DOptionsAddPadding(builder, padding): builder.PrependInt8Slot(0, padding, 0) -def Conv2DOptionsAddStrideW(builder, strideW): builder.PrependInt32Slot(1, strideW, 0) -def Conv2DOptionsAddStrideH(builder, strideH): builder.PrependInt32Slot(2, strideH, 0) -def Conv2DOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(3, fusedActivationFunction, 0) -def Conv2DOptionsAddDilationWFactor(builder, dilationWFactor): builder.PrependInt32Slot(4, dilationWFactor, 1) -def Conv2DOptionsAddDilationHFactor(builder, dilationHFactor): builder.PrependInt32Slot(5, dilationHFactor, 1) -def Conv2DOptionsEnd(builder): return builder.EndObject() - - -class Conv2DOptionsT(object): - - # Conv2DOptionsT - def __init__(self): - self.padding = 0 # type: int - self.strideW = 0 # type: int - self.strideH = 0 # type: int - self.fusedActivationFunction = 0 # type: int - self.dilationWFactor = 1 # type: int - self.dilationHFactor = 1 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - conv2DOptions = Conv2DOptions() - conv2DOptions.Init(buf, pos) - return cls.InitFromObj(conv2DOptions) - - @classmethod - def InitFromObj(cls, conv2DOptions): - x = Conv2DOptionsT() - x._UnPack(conv2DOptions) - return x - - # Conv2DOptionsT - def _UnPack(self, conv2DOptions): - if conv2DOptions is None: - return - self.padding = conv2DOptions.Padding() - self.strideW = conv2DOptions.StrideW() - self.strideH = conv2DOptions.StrideH() - self.fusedActivationFunction = conv2DOptions.FusedActivationFunction() - self.dilationWFactor = conv2DOptions.DilationWFactor() - self.dilationHFactor = conv2DOptions.DilationHFactor() - - # Conv2DOptionsT - def Pack(self, builder): - Conv2DOptionsStart(builder) - Conv2DOptionsAddPadding(builder, self.padding) - Conv2DOptionsAddStrideW(builder, self.strideW) - Conv2DOptionsAddStrideH(builder, self.strideH) - Conv2DOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - Conv2DOptionsAddDilationWFactor(builder, self.dilationWFactor) - Conv2DOptionsAddDilationHFactor(builder, self.dilationHFactor) - conv2DOptions = Conv2DOptionsEnd(builder) - return conv2DOptions - - - -class PadV2Options(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsPadV2Options(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = PadV2Options() - x.Init(buf, n + offset) - return x - - @classmethod - def PadV2OptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # PadV2Options - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def PadV2OptionsStart(builder): builder.StartObject(0) -def PadV2OptionsEnd(builder): return builder.EndObject() - - -class PadV2OptionsT(object): - - # PadV2OptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - padV2Options = PadV2Options() - padV2Options.Init(buf, pos) - return cls.InitFromObj(padV2Options) - - @classmethod - def InitFromObj(cls, padV2Options): - x = PadV2OptionsT() - x._UnPack(padV2Options) - return x - - # PadV2OptionsT - def _UnPack(self, padV2Options): - if padV2Options is None: - return - - # PadV2OptionsT - def Pack(self, builder): - PadV2OptionsStart(builder) - padV2Options = PadV2OptionsEnd(builder) - return padV2Options - - - -class L2NormOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsL2NormOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = L2NormOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def L2NormOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # L2NormOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # L2NormOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - -def L2NormOptionsStart(builder): builder.StartObject(1) -def L2NormOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) -def L2NormOptionsEnd(builder): return builder.EndObject() - - -class L2NormOptionsT(object): - - # L2NormOptionsT - def __init__(self): - self.fusedActivationFunction = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - l2NormOptions = L2NormOptions() - l2NormOptions.Init(buf, pos) - return cls.InitFromObj(l2NormOptions) - - @classmethod - def InitFromObj(cls, l2NormOptions): - x = L2NormOptionsT() - x._UnPack(l2NormOptions) - return x - - # L2NormOptionsT - def _UnPack(self, l2NormOptions): - if l2NormOptions is None: - return - self.fusedActivationFunction = l2NormOptions.FusedActivationFunction() - - # L2NormOptionsT - def Pack(self, builder): - L2NormOptionsStart(builder) - L2NormOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - l2NormOptions = L2NormOptionsEnd(builder) - return l2NormOptions - - - -class NonMaxSuppressionV4Options(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsNonMaxSuppressionV4Options(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = NonMaxSuppressionV4Options() - x.Init(buf, n + offset) - return x - - @classmethod - def NonMaxSuppressionV4OptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # NonMaxSuppressionV4Options - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def NonMaxSuppressionV4OptionsStart(builder): builder.StartObject(0) -def NonMaxSuppressionV4OptionsEnd(builder): return builder.EndObject() - - -class NonMaxSuppressionV4OptionsT(object): - - # NonMaxSuppressionV4OptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - nonMaxSuppressionV4Options = NonMaxSuppressionV4Options() - nonMaxSuppressionV4Options.Init(buf, pos) - return cls.InitFromObj(nonMaxSuppressionV4Options) - - @classmethod - def InitFromObj(cls, nonMaxSuppressionV4Options): - x = NonMaxSuppressionV4OptionsT() - x._UnPack(nonMaxSuppressionV4Options) - return x - - # NonMaxSuppressionV4OptionsT - def _UnPack(self, nonMaxSuppressionV4Options): - if nonMaxSuppressionV4Options is None: - return - - # NonMaxSuppressionV4OptionsT - def Pack(self, builder): - NonMaxSuppressionV4OptionsStart(builder) - nonMaxSuppressionV4Options = NonMaxSuppressionV4OptionsEnd(builder) - return nonMaxSuppressionV4Options - - - -class RankOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsRankOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = RankOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def RankOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # RankOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def RankOptionsStart(builder): builder.StartObject(0) -def RankOptionsEnd(builder): return builder.EndObject() - - -class RankOptionsT(object): - - # RankOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - rankOptions = RankOptions() - rankOptions.Init(buf, pos) - return cls.InitFromObj(rankOptions) - - @classmethod - def InitFromObj(cls, rankOptions): - x = RankOptionsT() - x._UnPack(rankOptions) - return x - - # RankOptionsT - def _UnPack(self, rankOptions): - if rankOptions is None: - return - - # RankOptionsT - def Pack(self, builder): - RankOptionsStart(builder) - rankOptions = RankOptionsEnd(builder) - return rankOptions - - - -class ConcatEmbeddingsOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsConcatEmbeddingsOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ConcatEmbeddingsOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def ConcatEmbeddingsOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ConcatEmbeddingsOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # ConcatEmbeddingsOptions - def NumChannels(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # ConcatEmbeddingsOptions - def NumColumnsPerChannel(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # ConcatEmbeddingsOptions - def NumColumnsPerChannelAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # ConcatEmbeddingsOptions - def NumColumnsPerChannelLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # ConcatEmbeddingsOptions - def NumColumnsPerChannelIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - return o == 0 - - # ConcatEmbeddingsOptions - def EmbeddingDimPerChannel(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # ConcatEmbeddingsOptions - def EmbeddingDimPerChannelAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # ConcatEmbeddingsOptions - def EmbeddingDimPerChannelLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # ConcatEmbeddingsOptions - def EmbeddingDimPerChannelIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - return o == 0 - -def ConcatEmbeddingsOptionsStart(builder): builder.StartObject(3) -def ConcatEmbeddingsOptionsAddNumChannels(builder, numChannels): builder.PrependInt32Slot(0, numChannels, 0) -def ConcatEmbeddingsOptionsAddNumColumnsPerChannel(builder, numColumnsPerChannel): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(numColumnsPerChannel), 0) -def ConcatEmbeddingsOptionsStartNumColumnsPerChannelVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def ConcatEmbeddingsOptionsAddEmbeddingDimPerChannel(builder, embeddingDimPerChannel): builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(embeddingDimPerChannel), 0) -def ConcatEmbeddingsOptionsStartEmbeddingDimPerChannelVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def ConcatEmbeddingsOptionsEnd(builder): return builder.EndObject() - -try: - from typing import List -except: - pass - -class ConcatEmbeddingsOptionsT(object): - - # ConcatEmbeddingsOptionsT - def __init__(self): - self.numChannels = 0 # type: int - self.numColumnsPerChannel = None # type: List[int] - self.embeddingDimPerChannel = None # type: List[int] - - @classmethod - def InitFromBuf(cls, buf, pos): - concatEmbeddingsOptions = ConcatEmbeddingsOptions() - concatEmbeddingsOptions.Init(buf, pos) - return cls.InitFromObj(concatEmbeddingsOptions) - - @classmethod - def InitFromObj(cls, concatEmbeddingsOptions): - x = ConcatEmbeddingsOptionsT() - x._UnPack(concatEmbeddingsOptions) - return x - - # ConcatEmbeddingsOptionsT - def _UnPack(self, concatEmbeddingsOptions): - if concatEmbeddingsOptions is None: - return - self.numChannels = concatEmbeddingsOptions.NumChannels() - if not concatEmbeddingsOptions.NumColumnsPerChannelIsNone(): - if np is None: - self.numColumnsPerChannel = [] - for i in range(concatEmbeddingsOptions.NumColumnsPerChannelLength()): - self.numColumnsPerChannel.append(concatEmbeddingsOptions.NumColumnsPerChannel(i)) - else: - self.numColumnsPerChannel = concatEmbeddingsOptions.NumColumnsPerChannelAsNumpy() - if not concatEmbeddingsOptions.EmbeddingDimPerChannelIsNone(): - if np is None: - self.embeddingDimPerChannel = [] - for i in range(concatEmbeddingsOptions.EmbeddingDimPerChannelLength()): - self.embeddingDimPerChannel.append(concatEmbeddingsOptions.EmbeddingDimPerChannel(i)) - else: - self.embeddingDimPerChannel = concatEmbeddingsOptions.EmbeddingDimPerChannelAsNumpy() - - # ConcatEmbeddingsOptionsT - def Pack(self, builder): - if self.numColumnsPerChannel is not None: - if np is not None and type(self.numColumnsPerChannel) is np.ndarray: - numColumnsPerChannel = builder.CreateNumpyVector(self.numColumnsPerChannel) - else: - ConcatEmbeddingsOptionsStartNumColumnsPerChannelVector(builder, len(self.numColumnsPerChannel)) - for i in reversed(range(len(self.numColumnsPerChannel))): - builder.PrependInt32(self.numColumnsPerChannel[i]) - numColumnsPerChannel = builder.EndVector(len(self.numColumnsPerChannel)) - if self.embeddingDimPerChannel is not None: - if np is not None and type(self.embeddingDimPerChannel) is np.ndarray: - embeddingDimPerChannel = builder.CreateNumpyVector(self.embeddingDimPerChannel) - else: - ConcatEmbeddingsOptionsStartEmbeddingDimPerChannelVector(builder, len(self.embeddingDimPerChannel)) - for i in reversed(range(len(self.embeddingDimPerChannel))): - builder.PrependInt32(self.embeddingDimPerChannel[i]) - embeddingDimPerChannel = builder.EndVector(len(self.embeddingDimPerChannel)) - ConcatEmbeddingsOptionsStart(builder) - ConcatEmbeddingsOptionsAddNumChannels(builder, self.numChannels) - if self.numColumnsPerChannel is not None: - ConcatEmbeddingsOptionsAddNumColumnsPerChannel(builder, numColumnsPerChannel) - if self.embeddingDimPerChannel is not None: - ConcatEmbeddingsOptionsAddEmbeddingDimPerChannel(builder, embeddingDimPerChannel) - concatEmbeddingsOptions = ConcatEmbeddingsOptionsEnd(builder) - return concatEmbeddingsOptions - - - -class Tensor(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsTensor(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = Tensor() - x.Init(buf, n + offset) - return x - - @classmethod - def TensorBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # Tensor - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # Tensor - def Shape(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # Tensor - def ShapeAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # Tensor - def ShapeLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Tensor - def ShapeIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - return o == 0 - - # Tensor - def Type(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # Tensor - def Buffer(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos) - return 0 - - # Tensor - def Name(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return self._tab.String(o + self._tab.Pos) - return None - - # Tensor - def Quantization(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - if o != 0: - x = self._tab.Indirect(o + self._tab.Pos) - obj = QuantizationParameters() - obj.Init(self._tab.Bytes, x) - return obj - return None - - # Tensor - def IsVariable(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - - # Tensor - def Sparsity(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16)) - if o != 0: - x = self._tab.Indirect(o + self._tab.Pos) - obj = SparsityParameters() - obj.Init(self._tab.Bytes, x) - return obj - return None - - # Tensor - def ShapeSignature(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # Tensor - def ShapeSignatureAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # Tensor - def ShapeSignatureLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Tensor - def ShapeSignatureIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) - return o == 0 - -def TensorStart(builder): builder.StartObject(8) -def TensorAddShape(builder, shape): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(shape), 0) -def TensorStartShapeVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def TensorAddType(builder, type): builder.PrependInt8Slot(1, type, 0) -def TensorAddBuffer(builder, buffer): builder.PrependUint32Slot(2, buffer, 0) -def TensorAddName(builder, name): builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0) -def TensorAddQuantization(builder, quantization): builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(quantization), 0) -def TensorAddIsVariable(builder, isVariable): builder.PrependBoolSlot(5, isVariable, 0) -def TensorAddSparsity(builder, sparsity): builder.PrependUOffsetTRelativeSlot(6, flatbuffers.number_types.UOffsetTFlags.py_type(sparsity), 0) -def TensorAddShapeSignature(builder, shapeSignature): builder.PrependUOffsetTRelativeSlot(7, flatbuffers.number_types.UOffsetTFlags.py_type(shapeSignature), 0) -def TensorStartShapeSignatureVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def TensorEnd(builder): return builder.EndObject() - -try: - from typing import List, Optional -except: - pass - -class TensorT(object): - - # TensorT - def __init__(self): - self.shape = None # type: List[int] - self.type = 0 # type: int - self.buffer = 0 # type: int - self.name = None # type: str - self.quantization = None # type: Optional[QuantizationParametersT] - self.isVariable = False # type: bool - self.sparsity = None # type: Optional[SparsityParametersT] - self.shapeSignature = None # type: List[int] - - @classmethod - def InitFromBuf(cls, buf, pos): - tensor = Tensor() - tensor.Init(buf, pos) - return cls.InitFromObj(tensor) - - @classmethod - def InitFromObj(cls, tensor): - x = TensorT() - x._UnPack(tensor) - return x - - # TensorT - def _UnPack(self, tensor): - if tensor is None: - return - if not tensor.ShapeIsNone(): - if np is None: - self.shape = [] - for i in range(tensor.ShapeLength()): - self.shape.append(tensor.Shape(i)) - else: - self.shape = tensor.ShapeAsNumpy() - self.type = tensor.Type() - self.buffer = tensor.Buffer() - self.name = tensor.Name() - if tensor.Quantization() is not None: - self.quantization = QuantizationParametersT.InitFromObj(tensor.Quantization()) - self.isVariable = tensor.IsVariable() - if tensor.Sparsity() is not None: - self.sparsity = SparsityParametersT.InitFromObj(tensor.Sparsity()) - if not tensor.ShapeSignatureIsNone(): - if np is None: - self.shapeSignature = [] - for i in range(tensor.ShapeSignatureLength()): - self.shapeSignature.append(tensor.ShapeSignature(i)) - else: - self.shapeSignature = tensor.ShapeSignatureAsNumpy() - - # TensorT - def Pack(self, builder): - if self.shape is not None: - if np is not None and type(self.shape) is np.ndarray: - shape = builder.CreateNumpyVector(self.shape) - else: - TensorStartShapeVector(builder, len(self.shape)) - for i in reversed(range(len(self.shape))): - builder.PrependInt32(self.shape[i]) - shape = builder.EndVector(len(self.shape)) - if self.name is not None: - name = builder.CreateString(self.name) - if self.quantization is not None: - quantization = self.quantization.Pack(builder) - if self.sparsity is not None: - sparsity = self.sparsity.Pack(builder) - if self.shapeSignature is not None: - if np is not None and type(self.shapeSignature) is np.ndarray: - shapeSignature = builder.CreateNumpyVector(self.shapeSignature) - else: - TensorStartShapeSignatureVector(builder, len(self.shapeSignature)) - for i in reversed(range(len(self.shapeSignature))): - builder.PrependInt32(self.shapeSignature[i]) - shapeSignature = builder.EndVector(len(self.shapeSignature)) - TensorStart(builder) - if self.shape is not None: - TensorAddShape(builder, shape) - TensorAddType(builder, self.type) - TensorAddBuffer(builder, self.buffer) - if self.name is not None: - TensorAddName(builder, name) - if self.quantization is not None: - TensorAddQuantization(builder, quantization) - TensorAddIsVariable(builder, self.isVariable) - if self.sparsity is not None: - TensorAddSparsity(builder, sparsity) - if self.shapeSignature is not None: - TensorAddShapeSignature(builder, shapeSignature) - tensor = TensorEnd(builder) - return tensor - - - -class SplitVOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSplitVOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SplitVOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SplitVOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SplitVOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # SplitVOptions - def NumSplits(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - -def SplitVOptionsStart(builder): builder.StartObject(1) -def SplitVOptionsAddNumSplits(builder, numSplits): builder.PrependInt32Slot(0, numSplits, 0) -def SplitVOptionsEnd(builder): return builder.EndObject() - - -class SplitVOptionsT(object): - - # SplitVOptionsT - def __init__(self): - self.numSplits = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - splitVOptions = SplitVOptions() - splitVOptions.Init(buf, pos) - return cls.InitFromObj(splitVOptions) - - @classmethod - def InitFromObj(cls, splitVOptions): - x = SplitVOptionsT() - x._UnPack(splitVOptions) - return x - - # SplitVOptionsT - def _UnPack(self, splitVOptions): - if splitVOptions is None: - return - self.numSplits = splitVOptions.NumSplits() - - # SplitVOptionsT - def Pack(self, builder): - SplitVOptionsStart(builder) - SplitVOptionsAddNumSplits(builder, self.numSplits) - splitVOptions = SplitVOptionsEnd(builder) - return splitVOptions - - - -class SkipGramOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSkipGramOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SkipGramOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SkipGramOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SkipGramOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # SkipGramOptions - def NgramSize(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # SkipGramOptions - def MaxSkipSize(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # SkipGramOptions - def IncludeAllNgrams(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def SkipGramOptionsStart(builder): builder.StartObject(3) -def SkipGramOptionsAddNgramSize(builder, ngramSize): builder.PrependInt32Slot(0, ngramSize, 0) -def SkipGramOptionsAddMaxSkipSize(builder, maxSkipSize): builder.PrependInt32Slot(1, maxSkipSize, 0) -def SkipGramOptionsAddIncludeAllNgrams(builder, includeAllNgrams): builder.PrependBoolSlot(2, includeAllNgrams, 0) -def SkipGramOptionsEnd(builder): return builder.EndObject() - - -class SkipGramOptionsT(object): - - # SkipGramOptionsT - def __init__(self): - self.ngramSize = 0 # type: int - self.maxSkipSize = 0 # type: int - self.includeAllNgrams = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - skipGramOptions = SkipGramOptions() - skipGramOptions.Init(buf, pos) - return cls.InitFromObj(skipGramOptions) - - @classmethod - def InitFromObj(cls, skipGramOptions): - x = SkipGramOptionsT() - x._UnPack(skipGramOptions) - return x - - # SkipGramOptionsT - def _UnPack(self, skipGramOptions): - if skipGramOptions is None: - return - self.ngramSize = skipGramOptions.NgramSize() - self.maxSkipSize = skipGramOptions.MaxSkipSize() - self.includeAllNgrams = skipGramOptions.IncludeAllNgrams() - - # SkipGramOptionsT - def Pack(self, builder): - SkipGramOptionsStart(builder) - SkipGramOptionsAddNgramSize(builder, self.ngramSize) - SkipGramOptionsAddMaxSkipSize(builder, self.maxSkipSize) - SkipGramOptionsAddIncludeAllNgrams(builder, self.includeAllNgrams) - skipGramOptions = SkipGramOptionsEnd(builder) - return skipGramOptions - - -class LSHProjectionType(object): - UNKNOWN = 0 - SPARSE = 1 - DENSE = 2 - - - -class LSTMKernelType(object): - FULL = 0 - BASIC = 1 - - - - -class RangeOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsRangeOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = RangeOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def RangeOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # RangeOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def RangeOptionsStart(builder): builder.StartObject(0) -def RangeOptionsEnd(builder): return builder.EndObject() - - -class RangeOptionsT(object): - - # RangeOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - rangeOptions = RangeOptions() - rangeOptions.Init(buf, pos) - return cls.InitFromObj(rangeOptions) - - @classmethod - def InitFromObj(cls, rangeOptions): - x = RangeOptionsT() - x._UnPack(rangeOptions) - return x - - # RangeOptionsT - def _UnPack(self, rangeOptions): - if rangeOptions is None: - return - - # RangeOptionsT - def Pack(self, builder): - RangeOptionsStart(builder) - rangeOptions = RangeOptionsEnd(builder) - return rangeOptions - - - -class RNNOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsRNNOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = RNNOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def RNNOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # RNNOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # RNNOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # RNNOptions - def AsymmetricQuantizeInputs(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def RNNOptionsStart(builder): builder.StartObject(2) -def RNNOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) -def RNNOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(1, asymmetricQuantizeInputs, 0) -def RNNOptionsEnd(builder): return builder.EndObject() - - -class RNNOptionsT(object): - - # RNNOptionsT - def __init__(self): - self.fusedActivationFunction = 0 # type: int - self.asymmetricQuantizeInputs = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - rNNOptions = RNNOptions() - rNNOptions.Init(buf, pos) - return cls.InitFromObj(rNNOptions) - - @classmethod - def InitFromObj(cls, rNNOptions): - x = RNNOptionsT() - x._UnPack(rNNOptions) - return x - - # RNNOptionsT - def _UnPack(self, rNNOptions): - if rNNOptions is None: - return - self.fusedActivationFunction = rNNOptions.FusedActivationFunction() - self.asymmetricQuantizeInputs = rNNOptions.AsymmetricQuantizeInputs() - - # RNNOptionsT - def Pack(self, builder): - RNNOptionsStart(builder) - RNNOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - RNNOptionsAddAsymmetricQuantizeInputs(builder, self.asymmetricQuantizeInputs) - rNNOptions = RNNOptionsEnd(builder) - return rNNOptions - - - -class MatrixSetDiagOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsMatrixSetDiagOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = MatrixSetDiagOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def MatrixSetDiagOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # MatrixSetDiagOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def MatrixSetDiagOptionsStart(builder): builder.StartObject(0) -def MatrixSetDiagOptionsEnd(builder): return builder.EndObject() - - -class MatrixSetDiagOptionsT(object): - - # MatrixSetDiagOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - matrixSetDiagOptions = MatrixSetDiagOptions() - matrixSetDiagOptions.Init(buf, pos) - return cls.InitFromObj(matrixSetDiagOptions) - - @classmethod - def InitFromObj(cls, matrixSetDiagOptions): - x = MatrixSetDiagOptionsT() - x._UnPack(matrixSetDiagOptions) - return x - - # MatrixSetDiagOptionsT - def _UnPack(self, matrixSetDiagOptions): - if matrixSetDiagOptions is None: - return - - # MatrixSetDiagOptionsT - def Pack(self, builder): - MatrixSetDiagOptionsStart(builder) - matrixSetDiagOptions = MatrixSetDiagOptionsEnd(builder) - return matrixSetDiagOptions - - - -class ZerosLikeOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsZerosLikeOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ZerosLikeOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def ZerosLikeOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ZerosLikeOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def ZerosLikeOptionsStart(builder): builder.StartObject(0) -def ZerosLikeOptionsEnd(builder): return builder.EndObject() - - -class ZerosLikeOptionsT(object): - - # ZerosLikeOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - zerosLikeOptions = ZerosLikeOptions() - zerosLikeOptions.Init(buf, pos) - return cls.InitFromObj(zerosLikeOptions) - - @classmethod - def InitFromObj(cls, zerosLikeOptions): - x = ZerosLikeOptionsT() - x._UnPack(zerosLikeOptions) - return x - - # ZerosLikeOptionsT - def _UnPack(self, zerosLikeOptions): - if zerosLikeOptions is None: - return - - # ZerosLikeOptionsT - def Pack(self, builder): - ZerosLikeOptionsStart(builder) - zerosLikeOptions = ZerosLikeOptionsEnd(builder) - return zerosLikeOptions - - -class CombinerType(object): - SUM = 0 - MEAN = 1 - SQRTN = 2 - - - - -class HardSwishOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsHardSwishOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = HardSwishOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def HardSwishOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # HardSwishOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def HardSwishOptionsStart(builder): builder.StartObject(0) -def HardSwishOptionsEnd(builder): return builder.EndObject() - - -class HardSwishOptionsT(object): - - # HardSwishOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - hardSwishOptions = HardSwishOptions() - hardSwishOptions.Init(buf, pos) - return cls.InitFromObj(hardSwishOptions) - - @classmethod - def InitFromObj(cls, hardSwishOptions): - x = HardSwishOptionsT() - x._UnPack(hardSwishOptions) - return x - - # HardSwishOptionsT - def _UnPack(self, hardSwishOptions): - if hardSwishOptions is None: - return - - # HardSwishOptionsT - def Pack(self, builder): - HardSwishOptionsStart(builder) - hardSwishOptions = HardSwishOptionsEnd(builder) - return hardSwishOptions - - - -class MaximumMinimumOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsMaximumMinimumOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = MaximumMinimumOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def MaximumMinimumOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # MaximumMinimumOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def MaximumMinimumOptionsStart(builder): builder.StartObject(0) -def MaximumMinimumOptionsEnd(builder): return builder.EndObject() - - -class MaximumMinimumOptionsT(object): - - # MaximumMinimumOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - maximumMinimumOptions = MaximumMinimumOptions() - maximumMinimumOptions.Init(buf, pos) - return cls.InitFromObj(maximumMinimumOptions) - - @classmethod - def InitFromObj(cls, maximumMinimumOptions): - x = MaximumMinimumOptionsT() - x._UnPack(maximumMinimumOptions) - return x - - # MaximumMinimumOptionsT - def _UnPack(self, maximumMinimumOptions): - if maximumMinimumOptions is None: - return - - # MaximumMinimumOptionsT - def Pack(self, builder): - MaximumMinimumOptionsStart(builder) - maximumMinimumOptions = MaximumMinimumOptionsEnd(builder) - return maximumMinimumOptions - - - -class ResizeBilinearOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsResizeBilinearOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ResizeBilinearOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def ResizeBilinearOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ResizeBilinearOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # ResizeBilinearOptions - def AlignCorners(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - - # ResizeBilinearOptions - def HalfPixelCenters(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def ResizeBilinearOptionsStart(builder): builder.StartObject(4) -def ResizeBilinearOptionsAddAlignCorners(builder, alignCorners): builder.PrependBoolSlot(2, alignCorners, 0) -def ResizeBilinearOptionsAddHalfPixelCenters(builder, halfPixelCenters): builder.PrependBoolSlot(3, halfPixelCenters, 0) -def ResizeBilinearOptionsEnd(builder): return builder.EndObject() - - -class ResizeBilinearOptionsT(object): - - # ResizeBilinearOptionsT - def __init__(self): - self.alignCorners = False # type: bool - self.halfPixelCenters = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - resizeBilinearOptions = ResizeBilinearOptions() - resizeBilinearOptions.Init(buf, pos) - return cls.InitFromObj(resizeBilinearOptions) - - @classmethod - def InitFromObj(cls, resizeBilinearOptions): - x = ResizeBilinearOptionsT() - x._UnPack(resizeBilinearOptions) - return x - - # ResizeBilinearOptionsT - def _UnPack(self, resizeBilinearOptions): - if resizeBilinearOptions is None: - return - self.alignCorners = resizeBilinearOptions.AlignCorners() - self.halfPixelCenters = resizeBilinearOptions.HalfPixelCenters() - - # ResizeBilinearOptionsT - def Pack(self, builder): - ResizeBilinearOptionsStart(builder) - ResizeBilinearOptionsAddAlignCorners(builder, self.alignCorners) - ResizeBilinearOptionsAddHalfPixelCenters(builder, self.halfPixelCenters) - resizeBilinearOptions = ResizeBilinearOptionsEnd(builder) - return resizeBilinearOptions - - - -class ConcatenationOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsConcatenationOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ConcatenationOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def ConcatenationOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ConcatenationOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # ConcatenationOptions - def Axis(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # ConcatenationOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - -def ConcatenationOptionsStart(builder): builder.StartObject(2) -def ConcatenationOptionsAddAxis(builder, axis): builder.PrependInt32Slot(0, axis, 0) -def ConcatenationOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(1, fusedActivationFunction, 0) -def ConcatenationOptionsEnd(builder): return builder.EndObject() - - -class ConcatenationOptionsT(object): - - # ConcatenationOptionsT - def __init__(self): - self.axis = 0 # type: int - self.fusedActivationFunction = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - concatenationOptions = ConcatenationOptions() - concatenationOptions.Init(buf, pos) - return cls.InitFromObj(concatenationOptions) - - @classmethod - def InitFromObj(cls, concatenationOptions): - x = ConcatenationOptionsT() - x._UnPack(concatenationOptions) - return x - - # ConcatenationOptionsT - def _UnPack(self, concatenationOptions): - if concatenationOptions is None: - return - self.axis = concatenationOptions.Axis() - self.fusedActivationFunction = concatenationOptions.FusedActivationFunction() - - # ConcatenationOptionsT - def Pack(self, builder): - ConcatenationOptionsStart(builder) - ConcatenationOptionsAddAxis(builder, self.axis) - ConcatenationOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - concatenationOptions = ConcatenationOptionsEnd(builder) - return concatenationOptions - - - -class LogSoftmaxOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsLogSoftmaxOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = LogSoftmaxOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def LogSoftmaxOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # LogSoftmaxOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def LogSoftmaxOptionsStart(builder): builder.StartObject(0) -def LogSoftmaxOptionsEnd(builder): return builder.EndObject() - - -class LogSoftmaxOptionsT(object): - - # LogSoftmaxOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - logSoftmaxOptions = LogSoftmaxOptions() - logSoftmaxOptions.Init(buf, pos) - return cls.InitFromObj(logSoftmaxOptions) - - @classmethod - def InitFromObj(cls, logSoftmaxOptions): - x = LogSoftmaxOptionsT() - x._UnPack(logSoftmaxOptions) - return x - - # LogSoftmaxOptionsT - def _UnPack(self, logSoftmaxOptions): - if logSoftmaxOptions is None: - return - - # LogSoftmaxOptionsT - def Pack(self, builder): - LogSoftmaxOptionsStart(builder) - logSoftmaxOptions = LogSoftmaxOptionsEnd(builder) - return logSoftmaxOptions - - - -class SplitOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSplitOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SplitOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SplitOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SplitOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # SplitOptions - def NumSplits(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - -def SplitOptionsStart(builder): builder.StartObject(1) -def SplitOptionsAddNumSplits(builder, numSplits): builder.PrependInt32Slot(0, numSplits, 0) -def SplitOptionsEnd(builder): return builder.EndObject() - - -class SplitOptionsT(object): - - # SplitOptionsT - def __init__(self): - self.numSplits = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - splitOptions = SplitOptions() - splitOptions.Init(buf, pos) - return cls.InitFromObj(splitOptions) - - @classmethod - def InitFromObj(cls, splitOptions): - x = SplitOptionsT() - x._UnPack(splitOptions) - return x - - # SplitOptionsT - def _UnPack(self, splitOptions): - if splitOptions is None: - return - self.numSplits = splitOptions.NumSplits() - - # SplitOptionsT - def Pack(self, builder): - SplitOptionsStart(builder) - SplitOptionsAddNumSplits(builder, self.numSplits) - splitOptions = SplitOptionsEnd(builder) - return splitOptions - - - -class SelectV2Options(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSelectV2Options(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SelectV2Options() - x.Init(buf, n + offset) - return x - - @classmethod - def SelectV2OptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SelectV2Options - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def SelectV2OptionsStart(builder): builder.StartObject(0) -def SelectV2OptionsEnd(builder): return builder.EndObject() - - -class SelectV2OptionsT(object): - - # SelectV2OptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - selectV2Options = SelectV2Options() - selectV2Options.Init(buf, pos) - return cls.InitFromObj(selectV2Options) - - @classmethod - def InitFromObj(cls, selectV2Options): - x = SelectV2OptionsT() - x._UnPack(selectV2Options) - return x - - # SelectV2OptionsT - def _UnPack(self, selectV2Options): - if selectV2Options is None: - return - - # SelectV2OptionsT - def Pack(self, builder): - SelectV2OptionsStart(builder) - selectV2Options = SelectV2OptionsEnd(builder) - return selectV2Options - - -class FullyConnectedOptionsWeightsFormat(object): - DEFAULT = 0 - SHUFFLED4x16INT8 = 1 - - - -class SparseIndexVector(object): - NONE = 0 - Int32Vector = 1 - Uint16Vector = 2 - Uint8Vector = 3 - - -def SparseIndexVectorCreator(unionType, table): - from flatbuffers.table import Table - if not isinstance(table, Table): - return None - if unionType == SparseIndexVector().Int32Vector: - return Int32VectorT.InitFromBuf(table.Bytes, table.Pos) - if unionType == SparseIndexVector().Uint16Vector: - return Uint16VectorT.InitFromBuf(table.Bytes, table.Pos) - if unionType == SparseIndexVector().Uint8Vector: - return Uint8VectorT.InitFromBuf(table.Bytes, table.Pos) - return None - - - -class SquaredDifferenceOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSquaredDifferenceOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SquaredDifferenceOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SquaredDifferenceOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SquaredDifferenceOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def SquaredDifferenceOptionsStart(builder): builder.StartObject(0) -def SquaredDifferenceOptionsEnd(builder): return builder.EndObject() - - -class SquaredDifferenceOptionsT(object): - - # SquaredDifferenceOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - squaredDifferenceOptions = SquaredDifferenceOptions() - squaredDifferenceOptions.Init(buf, pos) - return cls.InitFromObj(squaredDifferenceOptions) - - @classmethod - def InitFromObj(cls, squaredDifferenceOptions): - x = SquaredDifferenceOptionsT() - x._UnPack(squaredDifferenceOptions) - return x - - # SquaredDifferenceOptionsT - def _UnPack(self, squaredDifferenceOptions): - if squaredDifferenceOptions is None: - return - - # SquaredDifferenceOptionsT - def Pack(self, builder): - SquaredDifferenceOptionsStart(builder) - squaredDifferenceOptions = SquaredDifferenceOptionsEnd(builder) - return squaredDifferenceOptions - - - -class ReverseSequenceOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsReverseSequenceOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ReverseSequenceOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def ReverseSequenceOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ReverseSequenceOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # ReverseSequenceOptions - def SeqDim(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # ReverseSequenceOptions - def BatchDim(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - -def ReverseSequenceOptionsStart(builder): builder.StartObject(2) -def ReverseSequenceOptionsAddSeqDim(builder, seqDim): builder.PrependInt32Slot(0, seqDim, 0) -def ReverseSequenceOptionsAddBatchDim(builder, batchDim): builder.PrependInt32Slot(1, batchDim, 0) -def ReverseSequenceOptionsEnd(builder): return builder.EndObject() - - -class ReverseSequenceOptionsT(object): - - # ReverseSequenceOptionsT - def __init__(self): - self.seqDim = 0 # type: int - self.batchDim = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - reverseSequenceOptions = ReverseSequenceOptions() - reverseSequenceOptions.Init(buf, pos) - return cls.InitFromObj(reverseSequenceOptions) - - @classmethod - def InitFromObj(cls, reverseSequenceOptions): - x = ReverseSequenceOptionsT() - x._UnPack(reverseSequenceOptions) - return x - - # ReverseSequenceOptionsT - def _UnPack(self, reverseSequenceOptions): - if reverseSequenceOptions is None: - return - self.seqDim = reverseSequenceOptions.SeqDim() - self.batchDim = reverseSequenceOptions.BatchDim() - - # ReverseSequenceOptionsT - def Pack(self, builder): - ReverseSequenceOptionsStart(builder) - ReverseSequenceOptionsAddSeqDim(builder, self.seqDim) - ReverseSequenceOptionsAddBatchDim(builder, self.batchDim) - reverseSequenceOptions = ReverseSequenceOptionsEnd(builder) - return reverseSequenceOptions - - - -class ShapeOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsShapeOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ShapeOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def ShapeOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ShapeOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # ShapeOptions - def OutType(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - -def ShapeOptionsStart(builder): builder.StartObject(1) -def ShapeOptionsAddOutType(builder, outType): builder.PrependInt8Slot(0, outType, 0) -def ShapeOptionsEnd(builder): return builder.EndObject() - - -class ShapeOptionsT(object): - - # ShapeOptionsT - def __init__(self): - self.outType = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - shapeOptions = ShapeOptions() - shapeOptions.Init(buf, pos) - return cls.InitFromObj(shapeOptions) - - @classmethod - def InitFromObj(cls, shapeOptions): - x = ShapeOptionsT() - x._UnPack(shapeOptions) - return x - - # ShapeOptionsT - def _UnPack(self, shapeOptions): - if shapeOptions is None: - return - self.outType = shapeOptions.OutType() - - # ShapeOptionsT - def Pack(self, builder): - ShapeOptionsStart(builder) - ShapeOptionsAddOutType(builder, self.outType) - shapeOptions = ShapeOptionsEnd(builder) - return shapeOptions - - - -class ReverseV2Options(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsReverseV2Options(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ReverseV2Options() - x.Init(buf, n + offset) - return x - - @classmethod - def ReverseV2OptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ReverseV2Options - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def ReverseV2OptionsStart(builder): builder.StartObject(0) -def ReverseV2OptionsEnd(builder): return builder.EndObject() - - -class ReverseV2OptionsT(object): - - # ReverseV2OptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - reverseV2Options = ReverseV2Options() - reverseV2Options.Init(buf, pos) - return cls.InitFromObj(reverseV2Options) - - @classmethod - def InitFromObj(cls, reverseV2Options): - x = ReverseV2OptionsT() - x._UnPack(reverseV2Options) - return x - - # ReverseV2OptionsT - def _UnPack(self, reverseV2Options): - if reverseV2Options is None: - return - - # ReverseV2OptionsT - def Pack(self, builder): - ReverseV2OptionsStart(builder) - reverseV2Options = ReverseV2OptionsEnd(builder) - return reverseV2Options - - - -class Operator(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsOperator(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = Operator() - x.Init(buf, n + offset) - return x - - @classmethod - def OperatorBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # Operator - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # Operator - def OpcodeIndex(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos) - return 0 - - # Operator - def Inputs(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # Operator - def InputsAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # Operator - def InputsLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Operator - def InputsIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - return o == 0 - - # Operator - def Outputs(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # Operator - def OutputsAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # Operator - def OutputsLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Operator - def OutputsIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - return o == 0 - - # Operator - def BuiltinOptionsType(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) - return 0 - - # Operator - def BuiltinOptions(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - if o != 0: - from flatbuffers.table import Table - obj = Table(bytearray(), 0) - self._tab.Union(obj, o) - return obj - return None - - # Operator - def CustomOptions(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) - return 0 - - # Operator - def CustomOptionsAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) - return 0 - - # Operator - def CustomOptionsLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Operator - def CustomOptionsIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - return o == 0 - - # Operator - def CustomOptionsFormat(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # Operator - def MutatingVariableInputs(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.BoolFlags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) - return 0 - - # Operator - def MutatingVariableInputsAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.BoolFlags, o) - return 0 - - # Operator - def MutatingVariableInputsLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Operator - def MutatingVariableInputsIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) - return o == 0 - - # Operator - def Intermediates(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # Operator - def IntermediatesAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # Operator - def IntermediatesLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Operator - def IntermediatesIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20)) - return o == 0 - -def OperatorStart(builder): builder.StartObject(9) -def OperatorAddOpcodeIndex(builder, opcodeIndex): builder.PrependUint32Slot(0, opcodeIndex, 0) -def OperatorAddInputs(builder, inputs): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(inputs), 0) -def OperatorStartInputsVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def OperatorAddOutputs(builder, outputs): builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(outputs), 0) -def OperatorStartOutputsVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def OperatorAddBuiltinOptionsType(builder, builtinOptionsType): builder.PrependUint8Slot(3, builtinOptionsType, 0) -def OperatorAddBuiltinOptions(builder, builtinOptions): builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(builtinOptions), 0) -def OperatorAddCustomOptions(builder, customOptions): builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(customOptions), 0) -def OperatorStartCustomOptionsVector(builder, numElems): return builder.StartVector(1, numElems, 1) -def OperatorAddCustomOptionsFormat(builder, customOptionsFormat): builder.PrependInt8Slot(6, customOptionsFormat, 0) -def OperatorAddMutatingVariableInputs(builder, mutatingVariableInputs): builder.PrependUOffsetTRelativeSlot(7, flatbuffers.number_types.UOffsetTFlags.py_type(mutatingVariableInputs), 0) -def OperatorStartMutatingVariableInputsVector(builder, numElems): return builder.StartVector(1, numElems, 1) -def OperatorAddIntermediates(builder, intermediates): builder.PrependUOffsetTRelativeSlot(8, flatbuffers.number_types.UOffsetTFlags.py_type(intermediates), 0) -def OperatorStartIntermediatesVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def OperatorEnd(builder): return builder.EndObject() - -try: - from typing import List, Union -except: - pass - -class OperatorT(object): - - # OperatorT - def __init__(self): - self.opcodeIndex = 0 # type: int - self.inputs = None # type: List[int] - self.outputs = None # type: List[int] - self.builtinOptionsType = 0 # type: int - self.builtinOptions = None # type: Union[None, Conv2DOptionsT, DepthwiseConv2DOptionsT, ConcatEmbeddingsOptionsT, LSHProjectionOptionsT, Pool2DOptionsT, SVDFOptionsT, RNNOptionsT, FullyConnectedOptionsT, SoftmaxOptionsT, ConcatenationOptionsT, AddOptionsT, L2NormOptionsT, LocalResponseNormalizationOptionsT, LSTMOptionsT, ResizeBilinearOptionsT, CallOptionsT, ReshapeOptionsT, SkipGramOptionsT, SpaceToDepthOptionsT, EmbeddingLookupSparseOptionsT, MulOptionsT, PadOptionsT, GatherOptionsT, BatchToSpaceNDOptionsT, SpaceToBatchNDOptionsT, TransposeOptionsT, ReducerOptionsT, SubOptionsT, DivOptionsT, SqueezeOptionsT, SequenceRNNOptionsT, StridedSliceOptionsT, ExpOptionsT, TopKV2OptionsT, SplitOptionsT, LogSoftmaxOptionsT, CastOptionsT, DequantizeOptionsT, MaximumMinimumOptionsT, ArgMaxOptionsT, LessOptionsT, NegOptionsT, PadV2OptionsT, GreaterOptionsT, GreaterEqualOptionsT, LessEqualOptionsT, SelectOptionsT, SliceOptionsT, TransposeConvOptionsT, SparseToDenseOptionsT, TileOptionsT, ExpandDimsOptionsT, EqualOptionsT, NotEqualOptionsT, ShapeOptionsT, PowOptionsT, ArgMinOptionsT, FakeQuantOptionsT, PackOptionsT, LogicalOrOptionsT, OneHotOptionsT, LogicalAndOptionsT, LogicalNotOptionsT, UnpackOptionsT, FloorDivOptionsT, SquareOptionsT, ZerosLikeOptionsT, FillOptionsT, BidirectionalSequenceLSTMOptionsT, BidirectionalSequenceRNNOptionsT, UnidirectionalSequenceLSTMOptionsT, FloorModOptionsT, RangeOptionsT, ResizeNearestNeighborOptionsT, LeakyReluOptionsT, SquaredDifferenceOptionsT, MirrorPadOptionsT, AbsOptionsT, SplitVOptionsT, UniqueOptionsT, ReverseV2OptionsT, AddNOptionsT, GatherNdOptionsT, CosOptionsT, WhereOptionsT, RankOptionsT, ReverseSequenceOptionsT, MatrixDiagOptionsT, QuantizeOptionsT, MatrixSetDiagOptionsT, HardSwishOptionsT, IfOptionsT, WhileOptionsT, DepthToSpaceOptionsT, NonMaxSuppressionV4OptionsT, NonMaxSuppressionV5OptionsT, ScatterNdOptionsT, SelectV2OptionsT, DensifyOptionsT, SegmentSumOptionsT, BatchMatMulOptionsT] - self.customOptions = None # type: List[int] - self.customOptionsFormat = 0 # type: int - self.mutatingVariableInputs = None # type: List[bool] - self.intermediates = None # type: List[int] - - @classmethod - def InitFromBuf(cls, buf, pos): - operator = Operator() - operator.Init(buf, pos) - return cls.InitFromObj(operator) - - @classmethod - def InitFromObj(cls, operator): - x = OperatorT() - x._UnPack(operator) - return x - - # OperatorT - def _UnPack(self, operator): - if operator is None: - return - self.opcodeIndex = operator.OpcodeIndex() - if not operator.InputsIsNone(): - if np is None: - self.inputs = [] - for i in range(operator.InputsLength()): - self.inputs.append(operator.Inputs(i)) - else: - self.inputs = operator.InputsAsNumpy() - if not operator.OutputsIsNone(): - if np is None: - self.outputs = [] - for i in range(operator.OutputsLength()): - self.outputs.append(operator.Outputs(i)) - else: - self.outputs = operator.OutputsAsNumpy() - self.builtinOptionsType = operator.BuiltinOptionsType() - self.builtinOptions = BuiltinOptionsCreator(self.builtinOptionsType, operator.BuiltinOptions()) - if not operator.CustomOptionsIsNone(): - if np is None: - self.customOptions = [] - for i in range(operator.CustomOptionsLength()): - self.customOptions.append(operator.CustomOptions(i)) - else: - self.customOptions = operator.CustomOptionsAsNumpy() - self.customOptionsFormat = operator.CustomOptionsFormat() - if not operator.MutatingVariableInputsIsNone(): - if np is None: - self.mutatingVariableInputs = [] - for i in range(operator.MutatingVariableInputsLength()): - self.mutatingVariableInputs.append(operator.MutatingVariableInputs(i)) - else: - self.mutatingVariableInputs = operator.MutatingVariableInputsAsNumpy() - if not operator.IntermediatesIsNone(): - if np is None: - self.intermediates = [] - for i in range(operator.IntermediatesLength()): - self.intermediates.append(operator.Intermediates(i)) - else: - self.intermediates = operator.IntermediatesAsNumpy() - - # OperatorT - def Pack(self, builder): - if self.inputs is not None: - if np is not None and type(self.inputs) is np.ndarray: - inputs = builder.CreateNumpyVector(self.inputs) - else: - OperatorStartInputsVector(builder, len(self.inputs)) - for i in reversed(range(len(self.inputs))): - builder.PrependInt32(self.inputs[i]) - inputs = builder.EndVector(len(self.inputs)) - if self.outputs is not None: - if np is not None and type(self.outputs) is np.ndarray: - outputs = builder.CreateNumpyVector(self.outputs) - else: - OperatorStartOutputsVector(builder, len(self.outputs)) - for i in reversed(range(len(self.outputs))): - builder.PrependInt32(self.outputs[i]) - outputs = builder.EndVector(len(self.outputs)) - if self.builtinOptions is not None: - builtinOptions = self.builtinOptions.Pack(builder) - if self.customOptions is not None: - if np is not None and type(self.customOptions) is np.ndarray: - customOptions = builder.CreateNumpyVector(self.customOptions) - else: - OperatorStartCustomOptionsVector(builder, len(self.customOptions)) - for i in reversed(range(len(self.customOptions))): - builder.PrependUint8(self.customOptions[i]) - customOptions = builder.EndVector(len(self.customOptions)) - if self.mutatingVariableInputs is not None: - if np is not None and type(self.mutatingVariableInputs) is np.ndarray: - mutatingVariableInputs = builder.CreateNumpyVector(self.mutatingVariableInputs) - else: - OperatorStartMutatingVariableInputsVector(builder, len(self.mutatingVariableInputs)) - for i in reversed(range(len(self.mutatingVariableInputs))): - builder.PrependBool(self.mutatingVariableInputs[i]) - mutatingVariableInputs = builder.EndVector(len(self.mutatingVariableInputs)) - if self.intermediates is not None: - if np is not None and type(self.intermediates) is np.ndarray: - intermediates = builder.CreateNumpyVector(self.intermediates) - else: - OperatorStartIntermediatesVector(builder, len(self.intermediates)) - for i in reversed(range(len(self.intermediates))): - builder.PrependInt32(self.intermediates[i]) - intermediates = builder.EndVector(len(self.intermediates)) - OperatorStart(builder) - OperatorAddOpcodeIndex(builder, self.opcodeIndex) - if self.inputs is not None: - OperatorAddInputs(builder, inputs) - if self.outputs is not None: - OperatorAddOutputs(builder, outputs) - OperatorAddBuiltinOptionsType(builder, self.builtinOptionsType) - if self.builtinOptions is not None: - OperatorAddBuiltinOptions(builder, builtinOptions) - if self.customOptions is not None: - OperatorAddCustomOptions(builder, customOptions) - OperatorAddCustomOptionsFormat(builder, self.customOptionsFormat) - if self.mutatingVariableInputs is not None: - OperatorAddMutatingVariableInputs(builder, mutatingVariableInputs) - if self.intermediates is not None: - OperatorAddIntermediates(builder, intermediates) - operator = OperatorEnd(builder) - return operator - - - -class SequenceRNNOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSequenceRNNOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SequenceRNNOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SequenceRNNOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SequenceRNNOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # SequenceRNNOptions - def TimeMajor(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - - # SequenceRNNOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # SequenceRNNOptions - def AsymmetricQuantizeInputs(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def SequenceRNNOptionsStart(builder): builder.StartObject(3) -def SequenceRNNOptionsAddTimeMajor(builder, timeMajor): builder.PrependBoolSlot(0, timeMajor, 0) -def SequenceRNNOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(1, fusedActivationFunction, 0) -def SequenceRNNOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(2, asymmetricQuantizeInputs, 0) -def SequenceRNNOptionsEnd(builder): return builder.EndObject() - - -class SequenceRNNOptionsT(object): - - # SequenceRNNOptionsT - def __init__(self): - self.timeMajor = False # type: bool - self.fusedActivationFunction = 0 # type: int - self.asymmetricQuantizeInputs = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - sequenceRNNOptions = SequenceRNNOptions() - sequenceRNNOptions.Init(buf, pos) - return cls.InitFromObj(sequenceRNNOptions) - - @classmethod - def InitFromObj(cls, sequenceRNNOptions): - x = SequenceRNNOptionsT() - x._UnPack(sequenceRNNOptions) - return x - - # SequenceRNNOptionsT - def _UnPack(self, sequenceRNNOptions): - if sequenceRNNOptions is None: - return - self.timeMajor = sequenceRNNOptions.TimeMajor() - self.fusedActivationFunction = sequenceRNNOptions.FusedActivationFunction() - self.asymmetricQuantizeInputs = sequenceRNNOptions.AsymmetricQuantizeInputs() - - # SequenceRNNOptionsT - def Pack(self, builder): - SequenceRNNOptionsStart(builder) - SequenceRNNOptionsAddTimeMajor(builder, self.timeMajor) - SequenceRNNOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - SequenceRNNOptionsAddAsymmetricQuantizeInputs(builder, self.asymmetricQuantizeInputs) - sequenceRNNOptions = SequenceRNNOptionsEnd(builder) - return sequenceRNNOptions - - - -class Model(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsModel(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = Model() - x.Init(buf, n + offset) - return x - - @classmethod - def ModelBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # Model - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # Model - def Version(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos) - return 0 - - # Model - def OperatorCodes(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - x = self._tab.Vector(o) - x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4 - x = self._tab.Indirect(x) - obj = OperatorCode() - obj.Init(self._tab.Bytes, x) - return obj - return None - - # Model - def OperatorCodesLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Model - def OperatorCodesIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - return o == 0 - - # Model - def Subgraphs(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - x = self._tab.Vector(o) - x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4 - x = self._tab.Indirect(x) - obj = SubGraph() - obj.Init(self._tab.Bytes, x) - return obj - return None - - # Model - def SubgraphsLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Model - def SubgraphsIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - return o == 0 - - # Model - def Description(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return self._tab.String(o + self._tab.Pos) - return None - - # Model - def Buffers(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - if o != 0: - x = self._tab.Vector(o) - x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4 - x = self._tab.Indirect(x) - obj = Buffer() - obj.Init(self._tab.Bytes, x) - return obj - return None - - # Model - def BuffersLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Model - def BuffersIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - return o == 0 - - # Model - def MetadataBuffer(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # Model - def MetadataBufferAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # Model - def MetadataBufferLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Model - def MetadataBufferIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - return o == 0 - - # Model - def Metadata(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16)) - if o != 0: - x = self._tab.Vector(o) - x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4 - x = self._tab.Indirect(x) - obj = Metadata() - obj.Init(self._tab.Bytes, x) - return obj - return None - - # Model - def MetadataLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Model - def MetadataIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16)) - return o == 0 - -def ModelStart(builder): builder.StartObject(7) -def ModelAddVersion(builder, version): builder.PrependUint32Slot(0, version, 0) -def ModelAddOperatorCodes(builder, operatorCodes): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(operatorCodes), 0) -def ModelStartOperatorCodesVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def ModelAddSubgraphs(builder, subgraphs): builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(subgraphs), 0) -def ModelStartSubgraphsVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def ModelAddDescription(builder, description): builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(description), 0) -def ModelAddBuffers(builder, buffers): builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(buffers), 0) -def ModelStartBuffersVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def ModelAddMetadataBuffer(builder, metadataBuffer): builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(metadataBuffer), 0) -def ModelStartMetadataBufferVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def ModelAddMetadata(builder, metadata): builder.PrependUOffsetTRelativeSlot(6, flatbuffers.number_types.UOffsetTFlags.py_type(metadata), 0) -def ModelStartMetadataVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def ModelEnd(builder): return builder.EndObject() - -try: - from typing import List -except: - pass - -class ModelT(object): - - # ModelT - def __init__(self): - self.version = 0 # type: int - self.operatorCodes = None # type: List[OperatorCodeT] - self.subgraphs = None # type: List[SubGraphT] - self.description = None # type: str - self.buffers = None # type: List[BufferT] - self.metadataBuffer = None # type: List[int] - self.metadata = None # type: List[MetadataT] - - @classmethod - def InitFromBuf(cls, buf, pos): - model = Model() - model.Init(buf, pos) - return cls.InitFromObj(model) - - @classmethod - def InitFromObj(cls, model): - x = ModelT() - x._UnPack(model) - return x - - # ModelT - def _UnPack(self, model): - if model is None: - return - self.version = model.Version() - if not model.OperatorCodesIsNone(): - self.operatorCodes = [] - for i in range(model.OperatorCodesLength()): - if model.OperatorCodes(i) is None: - self.operatorCodes.append(None) - else: - operatorCode_ = OperatorCodeT.InitFromObj(model.OperatorCodes(i)) - self.operatorCodes.append(operatorCode_) - if not model.SubgraphsIsNone(): - self.subgraphs = [] - for i in range(model.SubgraphsLength()): - if model.Subgraphs(i) is None: - self.subgraphs.append(None) - else: - subGraph_ = SubGraphT.InitFromObj(model.Subgraphs(i)) - self.subgraphs.append(subGraph_) - self.description = model.Description() - if not model.BuffersIsNone(): - self.buffers = [] - for i in range(model.BuffersLength()): - if model.Buffers(i) is None: - self.buffers.append(None) - else: - buffer_ = BufferT.InitFromObj(model.Buffers(i)) - self.buffers.append(buffer_) - if not model.MetadataBufferIsNone(): - if np is None: - self.metadataBuffer = [] - for i in range(model.MetadataBufferLength()): - self.metadataBuffer.append(model.MetadataBuffer(i)) - else: - self.metadataBuffer = model.MetadataBufferAsNumpy() - if not model.MetadataIsNone(): - self.metadata = [] - for i in range(model.MetadataLength()): - if model.Metadata(i) is None: - self.metadata.append(None) - else: - metadata_ = MetadataT.InitFromObj(model.Metadata(i)) - self.metadata.append(metadata_) - - # ModelT - def Pack(self, builder): - if self.operatorCodes is not None: - operatorCodeslist = [] - for i in range(len(self.operatorCodes)): - operatorCodeslist.append(self.operatorCodes[i].Pack(builder)) - ModelStartOperatorCodesVector(builder, len(self.operatorCodes)) - for i in reversed(range(len(self.operatorCodes))): - builder.PrependUOffsetTRelative(operatorCodeslist[i]) - operatorCodes = builder.EndVector(len(self.operatorCodes)) - if self.subgraphs is not None: - subgraphslist = [] - for i in range(len(self.subgraphs)): - subgraphslist.append(self.subgraphs[i].Pack(builder)) - ModelStartSubgraphsVector(builder, len(self.subgraphs)) - for i in reversed(range(len(self.subgraphs))): - builder.PrependUOffsetTRelative(subgraphslist[i]) - subgraphs = builder.EndVector(len(self.subgraphs)) - if self.description is not None: - description = builder.CreateString(self.description) - if self.buffers is not None: - bufferslist = [] - for i in range(len(self.buffers)): - bufferslist.append(self.buffers[i].Pack(builder)) - ModelStartBuffersVector(builder, len(self.buffers)) - for i in reversed(range(len(self.buffers))): - builder.PrependUOffsetTRelative(bufferslist[i]) - buffers = builder.EndVector(len(self.buffers)) - if self.metadataBuffer is not None: - if np is not None and type(self.metadataBuffer) is np.ndarray: - metadataBuffer = builder.CreateNumpyVector(self.metadataBuffer) - else: - ModelStartMetadataBufferVector(builder, len(self.metadataBuffer)) - for i in reversed(range(len(self.metadataBuffer))): - builder.PrependInt32(self.metadataBuffer[i]) - metadataBuffer = builder.EndVector(len(self.metadataBuffer)) - if self.metadata is not None: - metadatalist = [] - for i in range(len(self.metadata)): - metadatalist.append(self.metadata[i].Pack(builder)) - ModelStartMetadataVector(builder, len(self.metadata)) - for i in reversed(range(len(self.metadata))): - builder.PrependUOffsetTRelative(metadatalist[i]) - metadata = builder.EndVector(len(self.metadata)) - ModelStart(builder) - ModelAddVersion(builder, self.version) - if self.operatorCodes is not None: - ModelAddOperatorCodes(builder, operatorCodes) - if self.subgraphs is not None: - ModelAddSubgraphs(builder, subgraphs) - if self.description is not None: - ModelAddDescription(builder, description) - if self.buffers is not None: - ModelAddBuffers(builder, buffers) - if self.metadataBuffer is not None: - ModelAddMetadataBuffer(builder, metadataBuffer) - if self.metadata is not None: - ModelAddMetadata(builder, metadata) - model = ModelEnd(builder) - return model - - - -class PackOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsPackOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = PackOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def PackOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # PackOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # PackOptions - def ValuesCount(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # PackOptions - def Axis(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - -def PackOptionsStart(builder): builder.StartObject(2) -def PackOptionsAddValuesCount(builder, valuesCount): builder.PrependInt32Slot(0, valuesCount, 0) -def PackOptionsAddAxis(builder, axis): builder.PrependInt32Slot(1, axis, 0) -def PackOptionsEnd(builder): return builder.EndObject() - - -class PackOptionsT(object): - - # PackOptionsT - def __init__(self): - self.valuesCount = 0 # type: int - self.axis = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - packOptions = PackOptions() - packOptions.Init(buf, pos) - return cls.InitFromObj(packOptions) - - @classmethod - def InitFromObj(cls, packOptions): - x = PackOptionsT() - x._UnPack(packOptions) - return x - - # PackOptionsT - def _UnPack(self, packOptions): - if packOptions is None: - return - self.valuesCount = packOptions.ValuesCount() - self.axis = packOptions.Axis() - - # PackOptionsT - def Pack(self, builder): - PackOptionsStart(builder) - PackOptionsAddValuesCount(builder, self.valuesCount) - PackOptionsAddAxis(builder, self.axis) - packOptions = PackOptionsEnd(builder) - return packOptions - - - -class LessEqualOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsLessEqualOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = LessEqualOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def LessEqualOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # LessEqualOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def LessEqualOptionsStart(builder): builder.StartObject(0) -def LessEqualOptionsEnd(builder): return builder.EndObject() - - -class LessEqualOptionsT(object): - - # LessEqualOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - lessEqualOptions = LessEqualOptions() - lessEqualOptions.Init(buf, pos) - return cls.InitFromObj(lessEqualOptions) - - @classmethod - def InitFromObj(cls, lessEqualOptions): - x = LessEqualOptionsT() - x._UnPack(lessEqualOptions) - return x - - # LessEqualOptionsT - def _UnPack(self, lessEqualOptions): - if lessEqualOptions is None: - return - - # LessEqualOptionsT - def Pack(self, builder): - LessEqualOptionsStart(builder) - lessEqualOptions = LessEqualOptionsEnd(builder) - return lessEqualOptions - - -class ActivationFunctionType(object): - NONE = 0 - RELU = 1 - RELU_N1_TO_1 = 2 - RELU6 = 3 - TANH = 4 - SIGN_BIT = 5 - - - - -class LogicalAndOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsLogicalAndOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = LogicalAndOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def LogicalAndOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # LogicalAndOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def LogicalAndOptionsStart(builder): builder.StartObject(0) -def LogicalAndOptionsEnd(builder): return builder.EndObject() - - -class LogicalAndOptionsT(object): - - # LogicalAndOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - logicalAndOptions = LogicalAndOptions() - logicalAndOptions.Init(buf, pos) - return cls.InitFromObj(logicalAndOptions) - - @classmethod - def InitFromObj(cls, logicalAndOptions): - x = LogicalAndOptionsT() - x._UnPack(logicalAndOptions) - return x - - # LogicalAndOptionsT - def _UnPack(self, logicalAndOptions): - if logicalAndOptions is None: - return - - # LogicalAndOptionsT - def Pack(self, builder): - LogicalAndOptionsStart(builder) - logicalAndOptions = LogicalAndOptionsEnd(builder) - return logicalAndOptions - - - -class DequantizeOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsDequantizeOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = DequantizeOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def DequantizeOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # DequantizeOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def DequantizeOptionsStart(builder): builder.StartObject(0) -def DequantizeOptionsEnd(builder): return builder.EndObject() - - -class DequantizeOptionsT(object): - - # DequantizeOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - dequantizeOptions = DequantizeOptions() - dequantizeOptions.Init(buf, pos) - return cls.InitFromObj(dequantizeOptions) - - @classmethod - def InitFromObj(cls, dequantizeOptions): - x = DequantizeOptionsT() - x._UnPack(dequantizeOptions) - return x - - # DequantizeOptionsT - def _UnPack(self, dequantizeOptions): - if dequantizeOptions is None: - return - - # DequantizeOptionsT - def Pack(self, builder): - DequantizeOptionsStart(builder) - dequantizeOptions = DequantizeOptionsEnd(builder) - return dequantizeOptions - - -class QuantizationDetails(object): - NONE = 0 - CustomQuantization = 1 - - -def QuantizationDetailsCreator(unionType, table): - from flatbuffers.table import Table - if not isinstance(table, Table): - return None - if unionType == QuantizationDetails().CustomQuantization: - return CustomQuantizationT.InitFromBuf(table.Bytes, table.Pos) - return None - - - -class StridedSliceOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsStridedSliceOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = StridedSliceOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def StridedSliceOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # StridedSliceOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # StridedSliceOptions - def BeginMask(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # StridedSliceOptions - def EndMask(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # StridedSliceOptions - def EllipsisMask(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # StridedSliceOptions - def NewAxisMask(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # StridedSliceOptions - def ShrinkAxisMask(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - -def StridedSliceOptionsStart(builder): builder.StartObject(5) -def StridedSliceOptionsAddBeginMask(builder, beginMask): builder.PrependInt32Slot(0, beginMask, 0) -def StridedSliceOptionsAddEndMask(builder, endMask): builder.PrependInt32Slot(1, endMask, 0) -def StridedSliceOptionsAddEllipsisMask(builder, ellipsisMask): builder.PrependInt32Slot(2, ellipsisMask, 0) -def StridedSliceOptionsAddNewAxisMask(builder, newAxisMask): builder.PrependInt32Slot(3, newAxisMask, 0) -def StridedSliceOptionsAddShrinkAxisMask(builder, shrinkAxisMask): builder.PrependInt32Slot(4, shrinkAxisMask, 0) -def StridedSliceOptionsEnd(builder): return builder.EndObject() - - -class StridedSliceOptionsT(object): - - # StridedSliceOptionsT - def __init__(self): - self.beginMask = 0 # type: int - self.endMask = 0 # type: int - self.ellipsisMask = 0 # type: int - self.newAxisMask = 0 # type: int - self.shrinkAxisMask = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - stridedSliceOptions = StridedSliceOptions() - stridedSliceOptions.Init(buf, pos) - return cls.InitFromObj(stridedSliceOptions) - - @classmethod - def InitFromObj(cls, stridedSliceOptions): - x = StridedSliceOptionsT() - x._UnPack(stridedSliceOptions) - return x - - # StridedSliceOptionsT - def _UnPack(self, stridedSliceOptions): - if stridedSliceOptions is None: - return - self.beginMask = stridedSliceOptions.BeginMask() - self.endMask = stridedSliceOptions.EndMask() - self.ellipsisMask = stridedSliceOptions.EllipsisMask() - self.newAxisMask = stridedSliceOptions.NewAxisMask() - self.shrinkAxisMask = stridedSliceOptions.ShrinkAxisMask() - - # StridedSliceOptionsT - def Pack(self, builder): - StridedSliceOptionsStart(builder) - StridedSliceOptionsAddBeginMask(builder, self.beginMask) - StridedSliceOptionsAddEndMask(builder, self.endMask) - StridedSliceOptionsAddEllipsisMask(builder, self.ellipsisMask) - StridedSliceOptionsAddNewAxisMask(builder, self.newAxisMask) - StridedSliceOptionsAddShrinkAxisMask(builder, self.shrinkAxisMask) - stridedSliceOptions = StridedSliceOptionsEnd(builder) - return stridedSliceOptions - - - -class Int32Vector(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsInt32Vector(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = Int32Vector() - x.Init(buf, n + offset) - return x - - @classmethod - def Int32VectorBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # Int32Vector - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # Int32Vector - def Values(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # Int32Vector - def ValuesAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # Int32Vector - def ValuesLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Int32Vector - def ValuesIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - return o == 0 - -def Int32VectorStart(builder): builder.StartObject(1) -def Int32VectorAddValues(builder, values): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(values), 0) -def Int32VectorStartValuesVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def Int32VectorEnd(builder): return builder.EndObject() - -try: - from typing import List -except: - pass - -class Int32VectorT(object): - - # Int32VectorT - def __init__(self): - self.values = None # type: List[int] - - @classmethod - def InitFromBuf(cls, buf, pos): - int32Vector = Int32Vector() - int32Vector.Init(buf, pos) - return cls.InitFromObj(int32Vector) - - @classmethod - def InitFromObj(cls, int32Vector): - x = Int32VectorT() - x._UnPack(int32Vector) - return x - - # Int32VectorT - def _UnPack(self, int32Vector): - if int32Vector is None: - return - if not int32Vector.ValuesIsNone(): - if np is None: - self.values = [] - for i in range(int32Vector.ValuesLength()): - self.values.append(int32Vector.Values(i)) - else: - self.values = int32Vector.ValuesAsNumpy() - - # Int32VectorT - def Pack(self, builder): - if self.values is not None: - if np is not None and type(self.values) is np.ndarray: - values = builder.CreateNumpyVector(self.values) - else: - Int32VectorStartValuesVector(builder, len(self.values)) - for i in reversed(range(len(self.values))): - builder.PrependInt32(self.values[i]) - values = builder.EndVector(len(self.values)) - Int32VectorStart(builder) - if self.values is not None: - Int32VectorAddValues(builder, values) - int32Vector = Int32VectorEnd(builder) - return int32Vector - - - -class LocalResponseNormalizationOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsLocalResponseNormalizationOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = LocalResponseNormalizationOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def LocalResponseNormalizationOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # LocalResponseNormalizationOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # LocalResponseNormalizationOptions - def Radius(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # LocalResponseNormalizationOptions - def Bias(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos) - return 0.0 - - # LocalResponseNormalizationOptions - def Alpha(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos) - return 0.0 - - # LocalResponseNormalizationOptions - def Beta(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos) - return 0.0 - -def LocalResponseNormalizationOptionsStart(builder): builder.StartObject(4) -def LocalResponseNormalizationOptionsAddRadius(builder, radius): builder.PrependInt32Slot(0, radius, 0) -def LocalResponseNormalizationOptionsAddBias(builder, bias): builder.PrependFloat32Slot(1, bias, 0.0) -def LocalResponseNormalizationOptionsAddAlpha(builder, alpha): builder.PrependFloat32Slot(2, alpha, 0.0) -def LocalResponseNormalizationOptionsAddBeta(builder, beta): builder.PrependFloat32Slot(3, beta, 0.0) -def LocalResponseNormalizationOptionsEnd(builder): return builder.EndObject() - - -class LocalResponseNormalizationOptionsT(object): - - # LocalResponseNormalizationOptionsT - def __init__(self): - self.radius = 0 # type: int - self.bias = 0.0 # type: float - self.alpha = 0.0 # type: float - self.beta = 0.0 # type: float - - @classmethod - def InitFromBuf(cls, buf, pos): - localResponseNormalizationOptions = LocalResponseNormalizationOptions() - localResponseNormalizationOptions.Init(buf, pos) - return cls.InitFromObj(localResponseNormalizationOptions) - - @classmethod - def InitFromObj(cls, localResponseNormalizationOptions): - x = LocalResponseNormalizationOptionsT() - x._UnPack(localResponseNormalizationOptions) - return x - - # LocalResponseNormalizationOptionsT - def _UnPack(self, localResponseNormalizationOptions): - if localResponseNormalizationOptions is None: - return - self.radius = localResponseNormalizationOptions.Radius() - self.bias = localResponseNormalizationOptions.Bias() - self.alpha = localResponseNormalizationOptions.Alpha() - self.beta = localResponseNormalizationOptions.Beta() - - # LocalResponseNormalizationOptionsT - def Pack(self, builder): - LocalResponseNormalizationOptionsStart(builder) - LocalResponseNormalizationOptionsAddRadius(builder, self.radius) - LocalResponseNormalizationOptionsAddBias(builder, self.bias) - LocalResponseNormalizationOptionsAddAlpha(builder, self.alpha) - LocalResponseNormalizationOptionsAddBeta(builder, self.beta) - localResponseNormalizationOptions = LocalResponseNormalizationOptionsEnd(builder) - return localResponseNormalizationOptions - - - -class SpaceToBatchNDOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSpaceToBatchNDOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SpaceToBatchNDOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SpaceToBatchNDOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SpaceToBatchNDOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def SpaceToBatchNDOptionsStart(builder): builder.StartObject(0) -def SpaceToBatchNDOptionsEnd(builder): return builder.EndObject() - - -class SpaceToBatchNDOptionsT(object): - - # SpaceToBatchNDOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - spaceToBatchNDOptions = SpaceToBatchNDOptions() - spaceToBatchNDOptions.Init(buf, pos) - return cls.InitFromObj(spaceToBatchNDOptions) - - @classmethod - def InitFromObj(cls, spaceToBatchNDOptions): - x = SpaceToBatchNDOptionsT() - x._UnPack(spaceToBatchNDOptions) - return x - - # SpaceToBatchNDOptionsT - def _UnPack(self, spaceToBatchNDOptions): - if spaceToBatchNDOptions is None: - return - - # SpaceToBatchNDOptionsT - def Pack(self, builder): - SpaceToBatchNDOptionsStart(builder) - spaceToBatchNDOptions = SpaceToBatchNDOptionsEnd(builder) - return spaceToBatchNDOptions - - - -class DimensionMetadata(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsDimensionMetadata(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = DimensionMetadata() - x.Init(buf, n + offset) - return x - - @classmethod - def DimensionMetadataBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # DimensionMetadata - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # DimensionMetadata - def Format(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # DimensionMetadata - def DenseSize(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # DimensionMetadata - def ArraySegmentsType(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) - return 0 - - # DimensionMetadata - def ArraySegments(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - from flatbuffers.table import Table - obj = Table(bytearray(), 0) - self._tab.Union(obj, o) - return obj - return None - - # DimensionMetadata - def ArrayIndicesType(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) - return 0 - - # DimensionMetadata - def ArrayIndices(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - if o != 0: - from flatbuffers.table import Table - obj = Table(bytearray(), 0) - self._tab.Union(obj, o) - return obj - return None - -def DimensionMetadataStart(builder): builder.StartObject(6) -def DimensionMetadataAddFormat(builder, format): builder.PrependInt8Slot(0, format, 0) -def DimensionMetadataAddDenseSize(builder, denseSize): builder.PrependInt32Slot(1, denseSize, 0) -def DimensionMetadataAddArraySegmentsType(builder, arraySegmentsType): builder.PrependUint8Slot(2, arraySegmentsType, 0) -def DimensionMetadataAddArraySegments(builder, arraySegments): builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(arraySegments), 0) -def DimensionMetadataAddArrayIndicesType(builder, arrayIndicesType): builder.PrependUint8Slot(4, arrayIndicesType, 0) -def DimensionMetadataAddArrayIndices(builder, arrayIndices): builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(arrayIndices), 0) -def DimensionMetadataEnd(builder): return builder.EndObject() - -try: - from typing import Union -except: - pass - -class DimensionMetadataT(object): - - # DimensionMetadataT - def __init__(self): - self.format = 0 # type: int - self.denseSize = 0 # type: int - self.arraySegmentsType = 0 # type: int - self.arraySegments = None # type: Union[None, Int32VectorT, Uint16VectorT, Uint8VectorT] - self.arrayIndicesType = 0 # type: int - self.arrayIndices = None # type: Union[None, Int32VectorT, Uint16VectorT, Uint8VectorT] - - @classmethod - def InitFromBuf(cls, buf, pos): - dimensionMetadata = DimensionMetadata() - dimensionMetadata.Init(buf, pos) - return cls.InitFromObj(dimensionMetadata) - - @classmethod - def InitFromObj(cls, dimensionMetadata): - x = DimensionMetadataT() - x._UnPack(dimensionMetadata) - return x - - # DimensionMetadataT - def _UnPack(self, dimensionMetadata): - if dimensionMetadata is None: - return - self.format = dimensionMetadata.Format() - self.denseSize = dimensionMetadata.DenseSize() - self.arraySegmentsType = dimensionMetadata.ArraySegmentsType() - self.arraySegments = SparseIndexVectorCreator(self.arraySegmentsType, dimensionMetadata.ArraySegments()) - self.arrayIndicesType = dimensionMetadata.ArrayIndicesType() - self.arrayIndices = SparseIndexVectorCreator(self.arrayIndicesType, dimensionMetadata.ArrayIndices()) - - # DimensionMetadataT - def Pack(self, builder): - if self.arraySegments is not None: - arraySegments = self.arraySegments.Pack(builder) - if self.arrayIndices is not None: - arrayIndices = self.arrayIndices.Pack(builder) - DimensionMetadataStart(builder) - DimensionMetadataAddFormat(builder, self.format) - DimensionMetadataAddDenseSize(builder, self.denseSize) - DimensionMetadataAddArraySegmentsType(builder, self.arraySegmentsType) - if self.arraySegments is not None: - DimensionMetadataAddArraySegments(builder, arraySegments) - DimensionMetadataAddArrayIndicesType(builder, self.arrayIndicesType) - if self.arrayIndices is not None: - DimensionMetadataAddArrayIndices(builder, arrayIndices) - dimensionMetadata = DimensionMetadataEnd(builder) - return dimensionMetadata - - - -class Pool2DOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsPool2DOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = Pool2DOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def Pool2DOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # Pool2DOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # Pool2DOptions - def Padding(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # Pool2DOptions - def StrideW(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # Pool2DOptions - def StrideH(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # Pool2DOptions - def FilterWidth(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # Pool2DOptions - def FilterHeight(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # Pool2DOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - -def Pool2DOptionsStart(builder): builder.StartObject(6) -def Pool2DOptionsAddPadding(builder, padding): builder.PrependInt8Slot(0, padding, 0) -def Pool2DOptionsAddStrideW(builder, strideW): builder.PrependInt32Slot(1, strideW, 0) -def Pool2DOptionsAddStrideH(builder, strideH): builder.PrependInt32Slot(2, strideH, 0) -def Pool2DOptionsAddFilterWidth(builder, filterWidth): builder.PrependInt32Slot(3, filterWidth, 0) -def Pool2DOptionsAddFilterHeight(builder, filterHeight): builder.PrependInt32Slot(4, filterHeight, 0) -def Pool2DOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(5, fusedActivationFunction, 0) -def Pool2DOptionsEnd(builder): return builder.EndObject() - - -class Pool2DOptionsT(object): - - # Pool2DOptionsT - def __init__(self): - self.padding = 0 # type: int - self.strideW = 0 # type: int - self.strideH = 0 # type: int - self.filterWidth = 0 # type: int - self.filterHeight = 0 # type: int - self.fusedActivationFunction = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - pool2DOptions = Pool2DOptions() - pool2DOptions.Init(buf, pos) - return cls.InitFromObj(pool2DOptions) - - @classmethod - def InitFromObj(cls, pool2DOptions): - x = Pool2DOptionsT() - x._UnPack(pool2DOptions) - return x - - # Pool2DOptionsT - def _UnPack(self, pool2DOptions): - if pool2DOptions is None: - return - self.padding = pool2DOptions.Padding() - self.strideW = pool2DOptions.StrideW() - self.strideH = pool2DOptions.StrideH() - self.filterWidth = pool2DOptions.FilterWidth() - self.filterHeight = pool2DOptions.FilterHeight() - self.fusedActivationFunction = pool2DOptions.FusedActivationFunction() - - # Pool2DOptionsT - def Pack(self, builder): - Pool2DOptionsStart(builder) - Pool2DOptionsAddPadding(builder, self.padding) - Pool2DOptionsAddStrideW(builder, self.strideW) - Pool2DOptionsAddStrideH(builder, self.strideH) - Pool2DOptionsAddFilterWidth(builder, self.filterWidth) - Pool2DOptionsAddFilterHeight(builder, self.filterHeight) - Pool2DOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - pool2DOptions = Pool2DOptionsEnd(builder) - return pool2DOptions - - - -class ScatterNdOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsScatterNdOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ScatterNdOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def ScatterNdOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ScatterNdOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def ScatterNdOptionsStart(builder): builder.StartObject(0) -def ScatterNdOptionsEnd(builder): return builder.EndObject() - - -class ScatterNdOptionsT(object): - - # ScatterNdOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - scatterNdOptions = ScatterNdOptions() - scatterNdOptions.Init(buf, pos) - return cls.InitFromObj(scatterNdOptions) - - @classmethod - def InitFromObj(cls, scatterNdOptions): - x = ScatterNdOptionsT() - x._UnPack(scatterNdOptions) - return x - - # ScatterNdOptionsT - def _UnPack(self, scatterNdOptions): - if scatterNdOptions is None: - return - - # ScatterNdOptionsT - def Pack(self, builder): - ScatterNdOptionsStart(builder) - scatterNdOptions = ScatterNdOptionsEnd(builder) - return scatterNdOptions - - - -class DepthwiseConv2DOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsDepthwiseConv2DOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = DepthwiseConv2DOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def DepthwiseConv2DOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # DepthwiseConv2DOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # DepthwiseConv2DOptions - def Padding(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # DepthwiseConv2DOptions - def StrideW(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # DepthwiseConv2DOptions - def StrideH(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # DepthwiseConv2DOptions - def DepthMultiplier(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # DepthwiseConv2DOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # DepthwiseConv2DOptions - def DilationWFactor(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 1 - - # DepthwiseConv2DOptions - def DilationHFactor(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 1 - -def DepthwiseConv2DOptionsStart(builder): builder.StartObject(7) -def DepthwiseConv2DOptionsAddPadding(builder, padding): builder.PrependInt8Slot(0, padding, 0) -def DepthwiseConv2DOptionsAddStrideW(builder, strideW): builder.PrependInt32Slot(1, strideW, 0) -def DepthwiseConv2DOptionsAddStrideH(builder, strideH): builder.PrependInt32Slot(2, strideH, 0) -def DepthwiseConv2DOptionsAddDepthMultiplier(builder, depthMultiplier): builder.PrependInt32Slot(3, depthMultiplier, 0) -def DepthwiseConv2DOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(4, fusedActivationFunction, 0) -def DepthwiseConv2DOptionsAddDilationWFactor(builder, dilationWFactor): builder.PrependInt32Slot(5, dilationWFactor, 1) -def DepthwiseConv2DOptionsAddDilationHFactor(builder, dilationHFactor): builder.PrependInt32Slot(6, dilationHFactor, 1) -def DepthwiseConv2DOptionsEnd(builder): return builder.EndObject() - - -class DepthwiseConv2DOptionsT(object): - - # DepthwiseConv2DOptionsT - def __init__(self): - self.padding = 0 # type: int - self.strideW = 0 # type: int - self.strideH = 0 # type: int - self.depthMultiplier = 0 # type: int - self.fusedActivationFunction = 0 # type: int - self.dilationWFactor = 1 # type: int - self.dilationHFactor = 1 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - depthwiseConv2DOptions = DepthwiseConv2DOptions() - depthwiseConv2DOptions.Init(buf, pos) - return cls.InitFromObj(depthwiseConv2DOptions) - - @classmethod - def InitFromObj(cls, depthwiseConv2DOptions): - x = DepthwiseConv2DOptionsT() - x._UnPack(depthwiseConv2DOptions) - return x - - # DepthwiseConv2DOptionsT - def _UnPack(self, depthwiseConv2DOptions): - if depthwiseConv2DOptions is None: - return - self.padding = depthwiseConv2DOptions.Padding() - self.strideW = depthwiseConv2DOptions.StrideW() - self.strideH = depthwiseConv2DOptions.StrideH() - self.depthMultiplier = depthwiseConv2DOptions.DepthMultiplier() - self.fusedActivationFunction = depthwiseConv2DOptions.FusedActivationFunction() - self.dilationWFactor = depthwiseConv2DOptions.DilationWFactor() - self.dilationHFactor = depthwiseConv2DOptions.DilationHFactor() - - # DepthwiseConv2DOptionsT - def Pack(self, builder): - DepthwiseConv2DOptionsStart(builder) - DepthwiseConv2DOptionsAddPadding(builder, self.padding) - DepthwiseConv2DOptionsAddStrideW(builder, self.strideW) - DepthwiseConv2DOptionsAddStrideH(builder, self.strideH) - DepthwiseConv2DOptionsAddDepthMultiplier(builder, self.depthMultiplier) - DepthwiseConv2DOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - DepthwiseConv2DOptionsAddDilationWFactor(builder, self.dilationWFactor) - DepthwiseConv2DOptionsAddDilationHFactor(builder, self.dilationHFactor) - depthwiseConv2DOptions = DepthwiseConv2DOptionsEnd(builder) - return depthwiseConv2DOptions - - - -class Uint8Vector(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsUint8Vector(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = Uint8Vector() - x.Init(buf, n + offset) - return x - - @classmethod - def Uint8VectorBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # Uint8Vector - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # Uint8Vector - def Values(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) - return 0 - - # Uint8Vector - def ValuesAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) - return 0 - - # Uint8Vector - def ValuesLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Uint8Vector - def ValuesIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - return o == 0 - -def Uint8VectorStart(builder): builder.StartObject(1) -def Uint8VectorAddValues(builder, values): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(values), 0) -def Uint8VectorStartValuesVector(builder, numElems): return builder.StartVector(1, numElems, 1) -def Uint8VectorEnd(builder): return builder.EndObject() - -try: - from typing import List -except: - pass - -class Uint8VectorT(object): - - # Uint8VectorT - def __init__(self): - self.values = None # type: List[int] - - @classmethod - def InitFromBuf(cls, buf, pos): - uint8Vector = Uint8Vector() - uint8Vector.Init(buf, pos) - return cls.InitFromObj(uint8Vector) - - @classmethod - def InitFromObj(cls, uint8Vector): - x = Uint8VectorT() - x._UnPack(uint8Vector) - return x - - # Uint8VectorT - def _UnPack(self, uint8Vector): - if uint8Vector is None: - return - if not uint8Vector.ValuesIsNone(): - if np is None: - self.values = [] - for i in range(uint8Vector.ValuesLength()): - self.values.append(uint8Vector.Values(i)) - else: - self.values = uint8Vector.ValuesAsNumpy() - - # Uint8VectorT - def Pack(self, builder): - if self.values is not None: - if np is not None and type(self.values) is np.ndarray: - values = builder.CreateNumpyVector(self.values) - else: - Uint8VectorStartValuesVector(builder, len(self.values)) - for i in reversed(range(len(self.values))): - builder.PrependUint8(self.values[i]) - values = builder.EndVector(len(self.values)) - Uint8VectorStart(builder) - if self.values is not None: - Uint8VectorAddValues(builder, values) - uint8Vector = Uint8VectorEnd(builder) - return uint8Vector - - - -class FullyConnectedOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsFullyConnectedOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = FullyConnectedOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def FullyConnectedOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # FullyConnectedOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # FullyConnectedOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # FullyConnectedOptions - def WeightsFormat(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # FullyConnectedOptions - def KeepNumDims(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - - # FullyConnectedOptions - def AsymmetricQuantizeInputs(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def FullyConnectedOptionsStart(builder): builder.StartObject(4) -def FullyConnectedOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) -def FullyConnectedOptionsAddWeightsFormat(builder, weightsFormat): builder.PrependInt8Slot(1, weightsFormat, 0) -def FullyConnectedOptionsAddKeepNumDims(builder, keepNumDims): builder.PrependBoolSlot(2, keepNumDims, 0) -def FullyConnectedOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(3, asymmetricQuantizeInputs, 0) -def FullyConnectedOptionsEnd(builder): return builder.EndObject() - - -class FullyConnectedOptionsT(object): - - # FullyConnectedOptionsT - def __init__(self): - self.fusedActivationFunction = 0 # type: int - self.weightsFormat = 0 # type: int - self.keepNumDims = False # type: bool - self.asymmetricQuantizeInputs = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - fullyConnectedOptions = FullyConnectedOptions() - fullyConnectedOptions.Init(buf, pos) - return cls.InitFromObj(fullyConnectedOptions) - - @classmethod - def InitFromObj(cls, fullyConnectedOptions): - x = FullyConnectedOptionsT() - x._UnPack(fullyConnectedOptions) - return x - - # FullyConnectedOptionsT - def _UnPack(self, fullyConnectedOptions): - if fullyConnectedOptions is None: - return - self.fusedActivationFunction = fullyConnectedOptions.FusedActivationFunction() - self.weightsFormat = fullyConnectedOptions.WeightsFormat() - self.keepNumDims = fullyConnectedOptions.KeepNumDims() - self.asymmetricQuantizeInputs = fullyConnectedOptions.AsymmetricQuantizeInputs() - - # FullyConnectedOptionsT - def Pack(self, builder): - FullyConnectedOptionsStart(builder) - FullyConnectedOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - FullyConnectedOptionsAddWeightsFormat(builder, self.weightsFormat) - FullyConnectedOptionsAddKeepNumDims(builder, self.keepNumDims) - FullyConnectedOptionsAddAsymmetricQuantizeInputs(builder, self.asymmetricQuantizeInputs) - fullyConnectedOptions = FullyConnectedOptionsEnd(builder) - return fullyConnectedOptions - - - -class CastOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsCastOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = CastOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def CastOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # CastOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # CastOptions - def InDataType(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # CastOptions - def OutDataType(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - -def CastOptionsStart(builder): builder.StartObject(2) -def CastOptionsAddInDataType(builder, inDataType): builder.PrependInt8Slot(0, inDataType, 0) -def CastOptionsAddOutDataType(builder, outDataType): builder.PrependInt8Slot(1, outDataType, 0) -def CastOptionsEnd(builder): return builder.EndObject() - - -class CastOptionsT(object): - - # CastOptionsT - def __init__(self): - self.inDataType = 0 # type: int - self.outDataType = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - castOptions = CastOptions() - castOptions.Init(buf, pos) - return cls.InitFromObj(castOptions) - - @classmethod - def InitFromObj(cls, castOptions): - x = CastOptionsT() - x._UnPack(castOptions) - return x - - # CastOptionsT - def _UnPack(self, castOptions): - if castOptions is None: - return - self.inDataType = castOptions.InDataType() - self.outDataType = castOptions.OutDataType() - - # CastOptionsT - def Pack(self, builder): - CastOptionsStart(builder) - CastOptionsAddInDataType(builder, self.inDataType) - CastOptionsAddOutDataType(builder, self.outDataType) - castOptions = CastOptionsEnd(builder) - return castOptions - - - -class EqualOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsEqualOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = EqualOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def EqualOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # EqualOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def EqualOptionsStart(builder): builder.StartObject(0) -def EqualOptionsEnd(builder): return builder.EndObject() - - -class EqualOptionsT(object): - - # EqualOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - equalOptions = EqualOptions() - equalOptions.Init(buf, pos) - return cls.InitFromObj(equalOptions) - - @classmethod - def InitFromObj(cls, equalOptions): - x = EqualOptionsT() - x._UnPack(equalOptions) - return x - - # EqualOptionsT - def _UnPack(self, equalOptions): - if equalOptions is None: - return - - # EqualOptionsT - def Pack(self, builder): - EqualOptionsStart(builder) - equalOptions = EqualOptionsEnd(builder) - return equalOptions - - -class Padding(object): - SAME = 0 - VALID = 1 - - - - -class FakeQuantOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsFakeQuantOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = FakeQuantOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def FakeQuantOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # FakeQuantOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # FakeQuantOptions - def Min(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos) - return 0.0 - - # FakeQuantOptions - def Max(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos) - return 0.0 - - # FakeQuantOptions - def NumBits(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # FakeQuantOptions - def NarrowRange(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def FakeQuantOptionsStart(builder): builder.StartObject(4) -def FakeQuantOptionsAddMin(builder, min): builder.PrependFloat32Slot(0, min, 0.0) -def FakeQuantOptionsAddMax(builder, max): builder.PrependFloat32Slot(1, max, 0.0) -def FakeQuantOptionsAddNumBits(builder, numBits): builder.PrependInt32Slot(2, numBits, 0) -def FakeQuantOptionsAddNarrowRange(builder, narrowRange): builder.PrependBoolSlot(3, narrowRange, 0) -def FakeQuantOptionsEnd(builder): return builder.EndObject() - - -class FakeQuantOptionsT(object): - - # FakeQuantOptionsT - def __init__(self): - self.min = 0.0 # type: float - self.max = 0.0 # type: float - self.numBits = 0 # type: int - self.narrowRange = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - fakeQuantOptions = FakeQuantOptions() - fakeQuantOptions.Init(buf, pos) - return cls.InitFromObj(fakeQuantOptions) - - @classmethod - def InitFromObj(cls, fakeQuantOptions): - x = FakeQuantOptionsT() - x._UnPack(fakeQuantOptions) - return x - - # FakeQuantOptionsT - def _UnPack(self, fakeQuantOptions): - if fakeQuantOptions is None: - return - self.min = fakeQuantOptions.Min() - self.max = fakeQuantOptions.Max() - self.numBits = fakeQuantOptions.NumBits() - self.narrowRange = fakeQuantOptions.NarrowRange() - - # FakeQuantOptionsT - def Pack(self, builder): - FakeQuantOptionsStart(builder) - FakeQuantOptionsAddMin(builder, self.min) - FakeQuantOptionsAddMax(builder, self.max) - FakeQuantOptionsAddNumBits(builder, self.numBits) - FakeQuantOptionsAddNarrowRange(builder, self.narrowRange) - fakeQuantOptions = FakeQuantOptionsEnd(builder) - return fakeQuantOptions - - - -class AddNOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsAddNOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = AddNOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def AddNOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # AddNOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def AddNOptionsStart(builder): builder.StartObject(0) -def AddNOptionsEnd(builder): return builder.EndObject() - - -class AddNOptionsT(object): - - # AddNOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - addNOptions = AddNOptions() - addNOptions.Init(buf, pos) - return cls.InitFromObj(addNOptions) - - @classmethod - def InitFromObj(cls, addNOptions): - x = AddNOptionsT() - x._UnPack(addNOptions) - return x - - # AddNOptionsT - def _UnPack(self, addNOptions): - if addNOptions is None: - return - - # AddNOptionsT - def Pack(self, builder): - AddNOptionsStart(builder) - addNOptions = AddNOptionsEnd(builder) - return addNOptions - - - -class ResizeNearestNeighborOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsResizeNearestNeighborOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ResizeNearestNeighborOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def ResizeNearestNeighborOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ResizeNearestNeighborOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # ResizeNearestNeighborOptions - def AlignCorners(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - - # ResizeNearestNeighborOptions - def HalfPixelCenters(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def ResizeNearestNeighborOptionsStart(builder): builder.StartObject(2) -def ResizeNearestNeighborOptionsAddAlignCorners(builder, alignCorners): builder.PrependBoolSlot(0, alignCorners, 0) -def ResizeNearestNeighborOptionsAddHalfPixelCenters(builder, halfPixelCenters): builder.PrependBoolSlot(1, halfPixelCenters, 0) -def ResizeNearestNeighborOptionsEnd(builder): return builder.EndObject() - - -class ResizeNearestNeighborOptionsT(object): - - # ResizeNearestNeighborOptionsT - def __init__(self): - self.alignCorners = False # type: bool - self.halfPixelCenters = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - resizeNearestNeighborOptions = ResizeNearestNeighborOptions() - resizeNearestNeighborOptions.Init(buf, pos) - return cls.InitFromObj(resizeNearestNeighborOptions) - - @classmethod - def InitFromObj(cls, resizeNearestNeighborOptions): - x = ResizeNearestNeighborOptionsT() - x._UnPack(resizeNearestNeighborOptions) - return x - - # ResizeNearestNeighborOptionsT - def _UnPack(self, resizeNearestNeighborOptions): - if resizeNearestNeighborOptions is None: - return - self.alignCorners = resizeNearestNeighborOptions.AlignCorners() - self.halfPixelCenters = resizeNearestNeighborOptions.HalfPixelCenters() - - # ResizeNearestNeighborOptionsT - def Pack(self, builder): - ResizeNearestNeighborOptionsStart(builder) - ResizeNearestNeighborOptionsAddAlignCorners(builder, self.alignCorners) - ResizeNearestNeighborOptionsAddHalfPixelCenters(builder, self.halfPixelCenters) - resizeNearestNeighborOptions = ResizeNearestNeighborOptionsEnd(builder) - return resizeNearestNeighborOptions - - - -class SubOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSubOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SubOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SubOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SubOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # SubOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - -def SubOptionsStart(builder): builder.StartObject(1) -def SubOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) -def SubOptionsEnd(builder): return builder.EndObject() - - -class SubOptionsT(object): - - # SubOptionsT - def __init__(self): - self.fusedActivationFunction = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - subOptions = SubOptions() - subOptions.Init(buf, pos) - return cls.InitFromObj(subOptions) - - @classmethod - def InitFromObj(cls, subOptions): - x = SubOptionsT() - x._UnPack(subOptions) - return x - - # SubOptionsT - def _UnPack(self, subOptions): - if subOptions is None: - return - self.fusedActivationFunction = subOptions.FusedActivationFunction() - - # SubOptionsT - def Pack(self, builder): - SubOptionsStart(builder) - SubOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - subOptions = SubOptionsEnd(builder) - return subOptions - - - -class LSTMOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsLSTMOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = LSTMOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def LSTMOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # LSTMOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # LSTMOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # LSTMOptions - def CellClip(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos) - return 0.0 - - # LSTMOptions - def ProjClip(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos) - return 0.0 - - # LSTMOptions - def KernelType(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # LSTMOptions - def AsymmetricQuantizeInputs(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def LSTMOptionsStart(builder): builder.StartObject(5) -def LSTMOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) -def LSTMOptionsAddCellClip(builder, cellClip): builder.PrependFloat32Slot(1, cellClip, 0.0) -def LSTMOptionsAddProjClip(builder, projClip): builder.PrependFloat32Slot(2, projClip, 0.0) -def LSTMOptionsAddKernelType(builder, kernelType): builder.PrependInt8Slot(3, kernelType, 0) -def LSTMOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(4, asymmetricQuantizeInputs, 0) -def LSTMOptionsEnd(builder): return builder.EndObject() - - -class LSTMOptionsT(object): - - # LSTMOptionsT - def __init__(self): - self.fusedActivationFunction = 0 # type: int - self.cellClip = 0.0 # type: float - self.projClip = 0.0 # type: float - self.kernelType = 0 # type: int - self.asymmetricQuantizeInputs = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - lSTMOptions = LSTMOptions() - lSTMOptions.Init(buf, pos) - return cls.InitFromObj(lSTMOptions) - - @classmethod - def InitFromObj(cls, lSTMOptions): - x = LSTMOptionsT() - x._UnPack(lSTMOptions) - return x - - # LSTMOptionsT - def _UnPack(self, lSTMOptions): - if lSTMOptions is None: - return - self.fusedActivationFunction = lSTMOptions.FusedActivationFunction() - self.cellClip = lSTMOptions.CellClip() - self.projClip = lSTMOptions.ProjClip() - self.kernelType = lSTMOptions.KernelType() - self.asymmetricQuantizeInputs = lSTMOptions.AsymmetricQuantizeInputs() - - # LSTMOptionsT - def Pack(self, builder): - LSTMOptionsStart(builder) - LSTMOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - LSTMOptionsAddCellClip(builder, self.cellClip) - LSTMOptionsAddProjClip(builder, self.projClip) - LSTMOptionsAddKernelType(builder, self.kernelType) - LSTMOptionsAddAsymmetricQuantizeInputs(builder, self.asymmetricQuantizeInputs) - lSTMOptions = LSTMOptionsEnd(builder) - return lSTMOptions - - - -class LogicalNotOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsLogicalNotOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = LogicalNotOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def LogicalNotOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # LogicalNotOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def LogicalNotOptionsStart(builder): builder.StartObject(0) -def LogicalNotOptionsEnd(builder): return builder.EndObject() - - -class LogicalNotOptionsT(object): - - # LogicalNotOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - logicalNotOptions = LogicalNotOptions() - logicalNotOptions.Init(buf, pos) - return cls.InitFromObj(logicalNotOptions) - - @classmethod - def InitFromObj(cls, logicalNotOptions): - x = LogicalNotOptionsT() - x._UnPack(logicalNotOptions) - return x - - # LogicalNotOptionsT - def _UnPack(self, logicalNotOptions): - if logicalNotOptions is None: - return - - # LogicalNotOptionsT - def Pack(self, builder): - LogicalNotOptionsStart(builder) - logicalNotOptions = LogicalNotOptionsEnd(builder) - return logicalNotOptions - - - -class IfOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsIfOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = IfOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def IfOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # IfOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # IfOptions - def ThenSubgraphIndex(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # IfOptions - def ElseSubgraphIndex(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - -def IfOptionsStart(builder): builder.StartObject(2) -def IfOptionsAddThenSubgraphIndex(builder, thenSubgraphIndex): builder.PrependInt32Slot(0, thenSubgraphIndex, 0) -def IfOptionsAddElseSubgraphIndex(builder, elseSubgraphIndex): builder.PrependInt32Slot(1, elseSubgraphIndex, 0) -def IfOptionsEnd(builder): return builder.EndObject() - - -class IfOptionsT(object): - - # IfOptionsT - def __init__(self): - self.thenSubgraphIndex = 0 # type: int - self.elseSubgraphIndex = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - ifOptions = IfOptions() - ifOptions.Init(buf, pos) - return cls.InitFromObj(ifOptions) - - @classmethod - def InitFromObj(cls, ifOptions): - x = IfOptionsT() - x._UnPack(ifOptions) - return x - - # IfOptionsT - def _UnPack(self, ifOptions): - if ifOptions is None: - return - self.thenSubgraphIndex = ifOptions.ThenSubgraphIndex() - self.elseSubgraphIndex = ifOptions.ElseSubgraphIndex() - - # IfOptionsT - def Pack(self, builder): - IfOptionsStart(builder) - IfOptionsAddThenSubgraphIndex(builder, self.thenSubgraphIndex) - IfOptionsAddElseSubgraphIndex(builder, self.elseSubgraphIndex) - ifOptions = IfOptionsEnd(builder) - return ifOptions - - - -class BatchMatMulOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsBatchMatMulOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = BatchMatMulOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def BatchMatMulOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # BatchMatMulOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # BatchMatMulOptions - def AdjX(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - - # BatchMatMulOptions - def AdjY(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def BatchMatMulOptionsStart(builder): builder.StartObject(2) -def BatchMatMulOptionsAddAdjX(builder, adjX): builder.PrependBoolSlot(0, adjX, 0) -def BatchMatMulOptionsAddAdjY(builder, adjY): builder.PrependBoolSlot(1, adjY, 0) -def BatchMatMulOptionsEnd(builder): return builder.EndObject() - - -class BatchMatMulOptionsT(object): - - # BatchMatMulOptionsT - def __init__(self): - self.adjX = False # type: bool - self.adjY = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - batchMatMulOptions = BatchMatMulOptions() - batchMatMulOptions.Init(buf, pos) - return cls.InitFromObj(batchMatMulOptions) - - @classmethod - def InitFromObj(cls, batchMatMulOptions): - x = BatchMatMulOptionsT() - x._UnPack(batchMatMulOptions) - return x - - # BatchMatMulOptionsT - def _UnPack(self, batchMatMulOptions): - if batchMatMulOptions is None: - return - self.adjX = batchMatMulOptions.AdjX() - self.adjY = batchMatMulOptions.AdjY() - - # BatchMatMulOptionsT - def Pack(self, builder): - BatchMatMulOptionsStart(builder) - BatchMatMulOptionsAddAdjX(builder, self.adjX) - BatchMatMulOptionsAddAdjY(builder, self.adjY) - batchMatMulOptions = BatchMatMulOptionsEnd(builder) - return batchMatMulOptions - - -class DimensionType(object): - DENSE = 0 - SPARSE_CSR = 1 - - - - -class ExpandDimsOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsExpandDimsOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ExpandDimsOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def ExpandDimsOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ExpandDimsOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def ExpandDimsOptionsStart(builder): builder.StartObject(0) -def ExpandDimsOptionsEnd(builder): return builder.EndObject() - - -class ExpandDimsOptionsT(object): - - # ExpandDimsOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - expandDimsOptions = ExpandDimsOptions() - expandDimsOptions.Init(buf, pos) - return cls.InitFromObj(expandDimsOptions) - - @classmethod - def InitFromObj(cls, expandDimsOptions): - x = ExpandDimsOptionsT() - x._UnPack(expandDimsOptions) - return x - - # ExpandDimsOptionsT - def _UnPack(self, expandDimsOptions): - if expandDimsOptions is None: - return - - # ExpandDimsOptionsT - def Pack(self, builder): - ExpandDimsOptionsStart(builder) - expandDimsOptions = ExpandDimsOptionsEnd(builder) - return expandDimsOptions - - - -class FloorDivOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsFloorDivOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = FloorDivOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def FloorDivOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # FloorDivOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def FloorDivOptionsStart(builder): builder.StartObject(0) -def FloorDivOptionsEnd(builder): return builder.EndObject() - - -class FloorDivOptionsT(object): - - # FloorDivOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - floorDivOptions = FloorDivOptions() - floorDivOptions.Init(buf, pos) - return cls.InitFromObj(floorDivOptions) - - @classmethod - def InitFromObj(cls, floorDivOptions): - x = FloorDivOptionsT() - x._UnPack(floorDivOptions) - return x - - # FloorDivOptionsT - def _UnPack(self, floorDivOptions): - if floorDivOptions is None: - return - - # FloorDivOptionsT - def Pack(self, builder): - FloorDivOptionsStart(builder) - floorDivOptions = FloorDivOptionsEnd(builder) - return floorDivOptions - - - -class DensifyOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsDensifyOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = DensifyOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def DensifyOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # DensifyOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def DensifyOptionsStart(builder): builder.StartObject(0) -def DensifyOptionsEnd(builder): return builder.EndObject() - - -class DensifyOptionsT(object): - - # DensifyOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - densifyOptions = DensifyOptions() - densifyOptions.Init(buf, pos) - return cls.InitFromObj(densifyOptions) - - @classmethod - def InitFromObj(cls, densifyOptions): - x = DensifyOptionsT() - x._UnPack(densifyOptions) - return x - - # DensifyOptionsT - def _UnPack(self, densifyOptions): - if densifyOptions is None: - return - - # DensifyOptionsT - def Pack(self, builder): - DensifyOptionsStart(builder) - densifyOptions = DensifyOptionsEnd(builder) - return densifyOptions - - - -class LessOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsLessOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = LessOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def LessOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # LessOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def LessOptionsStart(builder): builder.StartObject(0) -def LessOptionsEnd(builder): return builder.EndObject() - - -class LessOptionsT(object): - - # LessOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - lessOptions = LessOptions() - lessOptions.Init(buf, pos) - return cls.InitFromObj(lessOptions) - - @classmethod - def InitFromObj(cls, lessOptions): - x = LessOptionsT() - x._UnPack(lessOptions) - return x - - # LessOptionsT - def _UnPack(self, lessOptions): - if lessOptions is None: - return - - # LessOptionsT - def Pack(self, builder): - LessOptionsStart(builder) - lessOptions = LessOptionsEnd(builder) - return lessOptions - - - -class BidirectionalSequenceLSTMOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsBidirectionalSequenceLSTMOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = BidirectionalSequenceLSTMOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def BidirectionalSequenceLSTMOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # BidirectionalSequenceLSTMOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # BidirectionalSequenceLSTMOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # BidirectionalSequenceLSTMOptions - def CellClip(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos) - return 0.0 - - # BidirectionalSequenceLSTMOptions - def ProjClip(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos) - return 0.0 - - # BidirectionalSequenceLSTMOptions - def MergeOutputs(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - - # BidirectionalSequenceLSTMOptions - def TimeMajor(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return True - - # BidirectionalSequenceLSTMOptions - def AsymmetricQuantizeInputs(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def BidirectionalSequenceLSTMOptionsStart(builder): builder.StartObject(6) -def BidirectionalSequenceLSTMOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(0, fusedActivationFunction, 0) -def BidirectionalSequenceLSTMOptionsAddCellClip(builder, cellClip): builder.PrependFloat32Slot(1, cellClip, 0.0) -def BidirectionalSequenceLSTMOptionsAddProjClip(builder, projClip): builder.PrependFloat32Slot(2, projClip, 0.0) -def BidirectionalSequenceLSTMOptionsAddMergeOutputs(builder, mergeOutputs): builder.PrependBoolSlot(3, mergeOutputs, 0) -def BidirectionalSequenceLSTMOptionsAddTimeMajor(builder, timeMajor): builder.PrependBoolSlot(4, timeMajor, 1) -def BidirectionalSequenceLSTMOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(5, asymmetricQuantizeInputs, 0) -def BidirectionalSequenceLSTMOptionsEnd(builder): return builder.EndObject() - - -class BidirectionalSequenceLSTMOptionsT(object): - - # BidirectionalSequenceLSTMOptionsT - def __init__(self): - self.fusedActivationFunction = 0 # type: int - self.cellClip = 0.0 # type: float - self.projClip = 0.0 # type: float - self.mergeOutputs = False # type: bool - self.timeMajor = True # type: bool - self.asymmetricQuantizeInputs = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - bidirectionalSequenceLSTMOptions = BidirectionalSequenceLSTMOptions() - bidirectionalSequenceLSTMOptions.Init(buf, pos) - return cls.InitFromObj(bidirectionalSequenceLSTMOptions) - - @classmethod - def InitFromObj(cls, bidirectionalSequenceLSTMOptions): - x = BidirectionalSequenceLSTMOptionsT() - x._UnPack(bidirectionalSequenceLSTMOptions) - return x - - # BidirectionalSequenceLSTMOptionsT - def _UnPack(self, bidirectionalSequenceLSTMOptions): - if bidirectionalSequenceLSTMOptions is None: - return - self.fusedActivationFunction = bidirectionalSequenceLSTMOptions.FusedActivationFunction() - self.cellClip = bidirectionalSequenceLSTMOptions.CellClip() - self.projClip = bidirectionalSequenceLSTMOptions.ProjClip() - self.mergeOutputs = bidirectionalSequenceLSTMOptions.MergeOutputs() - self.timeMajor = bidirectionalSequenceLSTMOptions.TimeMajor() - self.asymmetricQuantizeInputs = bidirectionalSequenceLSTMOptions.AsymmetricQuantizeInputs() - - # BidirectionalSequenceLSTMOptionsT - def Pack(self, builder): - BidirectionalSequenceLSTMOptionsStart(builder) - BidirectionalSequenceLSTMOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - BidirectionalSequenceLSTMOptionsAddCellClip(builder, self.cellClip) - BidirectionalSequenceLSTMOptionsAddProjClip(builder, self.projClip) - BidirectionalSequenceLSTMOptionsAddMergeOutputs(builder, self.mergeOutputs) - BidirectionalSequenceLSTMOptionsAddTimeMajor(builder, self.timeMajor) - BidirectionalSequenceLSTMOptionsAddAsymmetricQuantizeInputs(builder, self.asymmetricQuantizeInputs) - bidirectionalSequenceLSTMOptions = BidirectionalSequenceLSTMOptionsEnd(builder) - return bidirectionalSequenceLSTMOptions - - - -class SegmentSumOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSegmentSumOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SegmentSumOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SegmentSumOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SegmentSumOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def SegmentSumOptionsStart(builder): builder.StartObject(0) -def SegmentSumOptionsEnd(builder): return builder.EndObject() - - -class SegmentSumOptionsT(object): - - # SegmentSumOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - segmentSumOptions = SegmentSumOptions() - segmentSumOptions.Init(buf, pos) - return cls.InitFromObj(segmentSumOptions) - - @classmethod - def InitFromObj(cls, segmentSumOptions): - x = SegmentSumOptionsT() - x._UnPack(segmentSumOptions) - return x - - # SegmentSumOptionsT - def _UnPack(self, segmentSumOptions): - if segmentSumOptions is None: - return - - # SegmentSumOptionsT - def Pack(self, builder): - SegmentSumOptionsStart(builder) - segmentSumOptions = SegmentSumOptionsEnd(builder) - return segmentSumOptions - - - -class EmbeddingLookupSparseOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsEmbeddingLookupSparseOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = EmbeddingLookupSparseOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def EmbeddingLookupSparseOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # EmbeddingLookupSparseOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # EmbeddingLookupSparseOptions - def Combiner(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - -def EmbeddingLookupSparseOptionsStart(builder): builder.StartObject(1) -def EmbeddingLookupSparseOptionsAddCombiner(builder, combiner): builder.PrependInt8Slot(0, combiner, 0) -def EmbeddingLookupSparseOptionsEnd(builder): return builder.EndObject() - - -class EmbeddingLookupSparseOptionsT(object): - - # EmbeddingLookupSparseOptionsT - def __init__(self): - self.combiner = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - embeddingLookupSparseOptions = EmbeddingLookupSparseOptions() - embeddingLookupSparseOptions.Init(buf, pos) - return cls.InitFromObj(embeddingLookupSparseOptions) - - @classmethod - def InitFromObj(cls, embeddingLookupSparseOptions): - x = EmbeddingLookupSparseOptionsT() - x._UnPack(embeddingLookupSparseOptions) - return x - - # EmbeddingLookupSparseOptionsT - def _UnPack(self, embeddingLookupSparseOptions): - if embeddingLookupSparseOptions is None: - return - self.combiner = embeddingLookupSparseOptions.Combiner() - - # EmbeddingLookupSparseOptionsT - def Pack(self, builder): - EmbeddingLookupSparseOptionsStart(builder) - EmbeddingLookupSparseOptionsAddCombiner(builder, self.combiner) - embeddingLookupSparseOptions = EmbeddingLookupSparseOptionsEnd(builder) - return embeddingLookupSparseOptions - - - -class SparseToDenseOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSparseToDenseOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SparseToDenseOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SparseToDenseOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SparseToDenseOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # SparseToDenseOptions - def ValidateIndices(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def SparseToDenseOptionsStart(builder): builder.StartObject(1) -def SparseToDenseOptionsAddValidateIndices(builder, validateIndices): builder.PrependBoolSlot(0, validateIndices, 0) -def SparseToDenseOptionsEnd(builder): return builder.EndObject() - - -class SparseToDenseOptionsT(object): - - # SparseToDenseOptionsT - def __init__(self): - self.validateIndices = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - sparseToDenseOptions = SparseToDenseOptions() - sparseToDenseOptions.Init(buf, pos) - return cls.InitFromObj(sparseToDenseOptions) - - @classmethod - def InitFromObj(cls, sparseToDenseOptions): - x = SparseToDenseOptionsT() - x._UnPack(sparseToDenseOptions) - return x - - # SparseToDenseOptionsT - def _UnPack(self, sparseToDenseOptions): - if sparseToDenseOptions is None: - return - self.validateIndices = sparseToDenseOptions.ValidateIndices() - - # SparseToDenseOptionsT - def Pack(self, builder): - SparseToDenseOptionsStart(builder) - SparseToDenseOptionsAddValidateIndices(builder, self.validateIndices) - sparseToDenseOptions = SparseToDenseOptionsEnd(builder) - return sparseToDenseOptions - - - -class MatrixDiagOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsMatrixDiagOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = MatrixDiagOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def MatrixDiagOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # MatrixDiagOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def MatrixDiagOptionsStart(builder): builder.StartObject(0) -def MatrixDiagOptionsEnd(builder): return builder.EndObject() - - -class MatrixDiagOptionsT(object): - - # MatrixDiagOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - matrixDiagOptions = MatrixDiagOptions() - matrixDiagOptions.Init(buf, pos) - return cls.InitFromObj(matrixDiagOptions) - - @classmethod - def InitFromObj(cls, matrixDiagOptions): - x = MatrixDiagOptionsT() - x._UnPack(matrixDiagOptions) - return x - - # MatrixDiagOptionsT - def _UnPack(self, matrixDiagOptions): - if matrixDiagOptions is None: - return - - # MatrixDiagOptionsT - def Pack(self, builder): - MatrixDiagOptionsStart(builder) - matrixDiagOptions = MatrixDiagOptionsEnd(builder) - return matrixDiagOptions - - - -class LSHProjectionOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsLSHProjectionOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = LSHProjectionOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def LSHProjectionOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # LSHProjectionOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # LSHProjectionOptions - def Type(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - -def LSHProjectionOptionsStart(builder): builder.StartObject(1) -def LSHProjectionOptionsAddType(builder, type): builder.PrependInt8Slot(0, type, 0) -def LSHProjectionOptionsEnd(builder): return builder.EndObject() - - -class LSHProjectionOptionsT(object): - - # LSHProjectionOptionsT - def __init__(self): - self.type = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - lSHProjectionOptions = LSHProjectionOptions() - lSHProjectionOptions.Init(buf, pos) - return cls.InitFromObj(lSHProjectionOptions) - - @classmethod - def InitFromObj(cls, lSHProjectionOptions): - x = LSHProjectionOptionsT() - x._UnPack(lSHProjectionOptions) - return x - - # LSHProjectionOptionsT - def _UnPack(self, lSHProjectionOptions): - if lSHProjectionOptions is None: - return - self.type = lSHProjectionOptions.Type() - - # LSHProjectionOptionsT - def Pack(self, builder): - LSHProjectionOptionsStart(builder) - LSHProjectionOptionsAddType(builder, self.type) - lSHProjectionOptions = LSHProjectionOptionsEnd(builder) - return lSHProjectionOptions - - - -class SparsityParameters(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSparsityParameters(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SparsityParameters() - x.Init(buf, n + offset) - return x - - @classmethod - def SparsityParametersBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SparsityParameters - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # SparsityParameters - def TraversalOrder(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # SparsityParameters - def TraversalOrderAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # SparsityParameters - def TraversalOrderLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # SparsityParameters - def TraversalOrderIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - return o == 0 - - # SparsityParameters - def BlockMap(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # SparsityParameters - def BlockMapAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # SparsityParameters - def BlockMapLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # SparsityParameters - def BlockMapIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - return o == 0 - - # SparsityParameters - def DimMetadata(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - x = self._tab.Vector(o) - x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4 - x = self._tab.Indirect(x) - obj = DimensionMetadata() - obj.Init(self._tab.Bytes, x) - return obj - return None - - # SparsityParameters - def DimMetadataLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # SparsityParameters - def DimMetadataIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - return o == 0 - -def SparsityParametersStart(builder): builder.StartObject(3) -def SparsityParametersAddTraversalOrder(builder, traversalOrder): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(traversalOrder), 0) -def SparsityParametersStartTraversalOrderVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def SparsityParametersAddBlockMap(builder, blockMap): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(blockMap), 0) -def SparsityParametersStartBlockMapVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def SparsityParametersAddDimMetadata(builder, dimMetadata): builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(dimMetadata), 0) -def SparsityParametersStartDimMetadataVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def SparsityParametersEnd(builder): return builder.EndObject() - -try: - from typing import List -except: - pass - -class SparsityParametersT(object): - - # SparsityParametersT - def __init__(self): - self.traversalOrder = None # type: List[int] - self.blockMap = None # type: List[int] - self.dimMetadata = None # type: List[DimensionMetadataT] - - @classmethod - def InitFromBuf(cls, buf, pos): - sparsityParameters = SparsityParameters() - sparsityParameters.Init(buf, pos) - return cls.InitFromObj(sparsityParameters) - - @classmethod - def InitFromObj(cls, sparsityParameters): - x = SparsityParametersT() - x._UnPack(sparsityParameters) - return x - - # SparsityParametersT - def _UnPack(self, sparsityParameters): - if sparsityParameters is None: - return - if not sparsityParameters.TraversalOrderIsNone(): - if np is None: - self.traversalOrder = [] - for i in range(sparsityParameters.TraversalOrderLength()): - self.traversalOrder.append(sparsityParameters.TraversalOrder(i)) - else: - self.traversalOrder = sparsityParameters.TraversalOrderAsNumpy() - if not sparsityParameters.BlockMapIsNone(): - if np is None: - self.blockMap = [] - for i in range(sparsityParameters.BlockMapLength()): - self.blockMap.append(sparsityParameters.BlockMap(i)) - else: - self.blockMap = sparsityParameters.BlockMapAsNumpy() - if not sparsityParameters.DimMetadataIsNone(): - self.dimMetadata = [] - for i in range(sparsityParameters.DimMetadataLength()): - if sparsityParameters.DimMetadata(i) is None: - self.dimMetadata.append(None) - else: - dimensionMetadata_ = DimensionMetadataT.InitFromObj(sparsityParameters.DimMetadata(i)) - self.dimMetadata.append(dimensionMetadata_) - - # SparsityParametersT - def Pack(self, builder): - if self.traversalOrder is not None: - if np is not None and type(self.traversalOrder) is np.ndarray: - traversalOrder = builder.CreateNumpyVector(self.traversalOrder) - else: - SparsityParametersStartTraversalOrderVector(builder, len(self.traversalOrder)) - for i in reversed(range(len(self.traversalOrder))): - builder.PrependInt32(self.traversalOrder[i]) - traversalOrder = builder.EndVector(len(self.traversalOrder)) - if self.blockMap is not None: - if np is not None and type(self.blockMap) is np.ndarray: - blockMap = builder.CreateNumpyVector(self.blockMap) - else: - SparsityParametersStartBlockMapVector(builder, len(self.blockMap)) - for i in reversed(range(len(self.blockMap))): - builder.PrependInt32(self.blockMap[i]) - blockMap = builder.EndVector(len(self.blockMap)) - if self.dimMetadata is not None: - dimMetadatalist = [] - for i in range(len(self.dimMetadata)): - dimMetadatalist.append(self.dimMetadata[i].Pack(builder)) - SparsityParametersStartDimMetadataVector(builder, len(self.dimMetadata)) - for i in reversed(range(len(self.dimMetadata))): - builder.PrependUOffsetTRelative(dimMetadatalist[i]) - dimMetadata = builder.EndVector(len(self.dimMetadata)) - SparsityParametersStart(builder) - if self.traversalOrder is not None: - SparsityParametersAddTraversalOrder(builder, traversalOrder) - if self.blockMap is not None: - SparsityParametersAddBlockMap(builder, blockMap) - if self.dimMetadata is not None: - SparsityParametersAddDimMetadata(builder, dimMetadata) - sparsityParameters = SparsityParametersEnd(builder) - return sparsityParameters - - - -class UniqueOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsUniqueOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = UniqueOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def UniqueOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # UniqueOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # UniqueOptions - def IdxOutType(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 2 - -def UniqueOptionsStart(builder): builder.StartObject(1) -def UniqueOptionsAddIdxOutType(builder, idxOutType): builder.PrependInt8Slot(0, idxOutType, 2) -def UniqueOptionsEnd(builder): return builder.EndObject() - - -class UniqueOptionsT(object): - - # UniqueOptionsT - def __init__(self): - self.idxOutType = 2 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - uniqueOptions = UniqueOptions() - uniqueOptions.Init(buf, pos) - return cls.InitFromObj(uniqueOptions) - - @classmethod - def InitFromObj(cls, uniqueOptions): - x = UniqueOptionsT() - x._UnPack(uniqueOptions) - return x - - # UniqueOptionsT - def _UnPack(self, uniqueOptions): - if uniqueOptions is None: - return - self.idxOutType = uniqueOptions.IdxOutType() - - # UniqueOptionsT - def Pack(self, builder): - UniqueOptionsStart(builder) - UniqueOptionsAddIdxOutType(builder, self.idxOutType) - uniqueOptions = UniqueOptionsEnd(builder) - return uniqueOptions - - - -class ReshapeOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsReshapeOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = ReshapeOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def ReshapeOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # ReshapeOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # ReshapeOptions - def NewShape(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Int32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4)) - return 0 - - # ReshapeOptions - def NewShapeAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int32Flags, o) - return 0 - - # ReshapeOptions - def NewShapeLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # ReshapeOptions - def NewShapeIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - return o == 0 - -def ReshapeOptionsStart(builder): builder.StartObject(1) -def ReshapeOptionsAddNewShape(builder, newShape): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(newShape), 0) -def ReshapeOptionsStartNewShapeVector(builder, numElems): return builder.StartVector(4, numElems, 4) -def ReshapeOptionsEnd(builder): return builder.EndObject() - -try: - from typing import List -except: - pass - -class ReshapeOptionsT(object): - - # ReshapeOptionsT - def __init__(self): - self.newShape = None # type: List[int] - - @classmethod - def InitFromBuf(cls, buf, pos): - reshapeOptions = ReshapeOptions() - reshapeOptions.Init(buf, pos) - return cls.InitFromObj(reshapeOptions) - - @classmethod - def InitFromObj(cls, reshapeOptions): - x = ReshapeOptionsT() - x._UnPack(reshapeOptions) - return x - - # ReshapeOptionsT - def _UnPack(self, reshapeOptions): - if reshapeOptions is None: - return - if not reshapeOptions.NewShapeIsNone(): - if np is None: - self.newShape = [] - for i in range(reshapeOptions.NewShapeLength()): - self.newShape.append(reshapeOptions.NewShape(i)) - else: - self.newShape = reshapeOptions.NewShapeAsNumpy() - - # ReshapeOptionsT - def Pack(self, builder): - if self.newShape is not None: - if np is not None and type(self.newShape) is np.ndarray: - newShape = builder.CreateNumpyVector(self.newShape) - else: - ReshapeOptionsStartNewShapeVector(builder, len(self.newShape)) - for i in reversed(range(len(self.newShape))): - builder.PrependInt32(self.newShape[i]) - newShape = builder.EndVector(len(self.newShape)) - ReshapeOptionsStart(builder) - if self.newShape is not None: - ReshapeOptionsAddNewShape(builder, newShape) - reshapeOptions = ReshapeOptionsEnd(builder) - return reshapeOptions - - - -class PowOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsPowOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = PowOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def PowOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # PowOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def PowOptionsStart(builder): builder.StartObject(0) -def PowOptionsEnd(builder): return builder.EndObject() - - -class PowOptionsT(object): - - # PowOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - powOptions = PowOptions() - powOptions.Init(buf, pos) - return cls.InitFromObj(powOptions) - - @classmethod - def InitFromObj(cls, powOptions): - x = PowOptionsT() - x._UnPack(powOptions) - return x - - # PowOptionsT - def _UnPack(self, powOptions): - if powOptions is None: - return - - # PowOptionsT - def Pack(self, builder): - PowOptionsStart(builder) - powOptions = PowOptionsEnd(builder) - return powOptions - - - -class GreaterEqualOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsGreaterEqualOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = GreaterEqualOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def GreaterEqualOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # GreaterEqualOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - -def GreaterEqualOptionsStart(builder): builder.StartObject(0) -def GreaterEqualOptionsEnd(builder): return builder.EndObject() - - -class GreaterEqualOptionsT(object): - - # GreaterEqualOptionsT - def __init__(self): - pass - - @classmethod - def InitFromBuf(cls, buf, pos): - greaterEqualOptions = GreaterEqualOptions() - greaterEqualOptions.Init(buf, pos) - return cls.InitFromObj(greaterEqualOptions) - - @classmethod - def InitFromObj(cls, greaterEqualOptions): - x = GreaterEqualOptionsT() - x._UnPack(greaterEqualOptions) - return x - - # GreaterEqualOptionsT - def _UnPack(self, greaterEqualOptions): - if greaterEqualOptions is None: - return - - # GreaterEqualOptionsT - def Pack(self, builder): - GreaterEqualOptionsStart(builder) - greaterEqualOptions = GreaterEqualOptionsEnd(builder) - return greaterEqualOptions - - - -class SVDFOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSVDFOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SVDFOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SVDFOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SVDFOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # SVDFOptions - def Rank(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # SVDFOptions - def FusedActivationFunction(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # SVDFOptions - def AsymmetricQuantizeInputs(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) - return False - -def SVDFOptionsStart(builder): builder.StartObject(3) -def SVDFOptionsAddRank(builder, rank): builder.PrependInt32Slot(0, rank, 0) -def SVDFOptionsAddFusedActivationFunction(builder, fusedActivationFunction): builder.PrependInt8Slot(1, fusedActivationFunction, 0) -def SVDFOptionsAddAsymmetricQuantizeInputs(builder, asymmetricQuantizeInputs): builder.PrependBoolSlot(2, asymmetricQuantizeInputs, 0) -def SVDFOptionsEnd(builder): return builder.EndObject() - - -class SVDFOptionsT(object): - - # SVDFOptionsT - def __init__(self): - self.rank = 0 # type: int - self.fusedActivationFunction = 0 # type: int - self.asymmetricQuantizeInputs = False # type: bool - - @classmethod - def InitFromBuf(cls, buf, pos): - sVDFOptions = SVDFOptions() - sVDFOptions.Init(buf, pos) - return cls.InitFromObj(sVDFOptions) - - @classmethod - def InitFromObj(cls, sVDFOptions): - x = SVDFOptionsT() - x._UnPack(sVDFOptions) - return x - - # SVDFOptionsT - def _UnPack(self, sVDFOptions): - if sVDFOptions is None: - return - self.rank = sVDFOptions.Rank() - self.fusedActivationFunction = sVDFOptions.FusedActivationFunction() - self.asymmetricQuantizeInputs = sVDFOptions.AsymmetricQuantizeInputs() - - # SVDFOptionsT - def Pack(self, builder): - SVDFOptionsStart(builder) - SVDFOptionsAddRank(builder, self.rank) - SVDFOptionsAddFusedActivationFunction(builder, self.fusedActivationFunction) - SVDFOptionsAddAsymmetricQuantizeInputs(builder, self.asymmetricQuantizeInputs) - sVDFOptions = SVDFOptionsEnd(builder) - return sVDFOptions - - - -class CustomQuantization(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsCustomQuantization(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = CustomQuantization() - x.Init(buf, n + offset) - return x - - @classmethod - def CustomQuantizationBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # CustomQuantization - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # CustomQuantization - def Custom(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) - return 0 - - # CustomQuantization - def CustomAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) - return 0 - - # CustomQuantization - def CustomLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # CustomQuantization - def CustomIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - return o == 0 - -def CustomQuantizationStart(builder): builder.StartObject(1) -def CustomQuantizationAddCustom(builder, custom): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(custom), 0) -def CustomQuantizationStartCustomVector(builder, numElems): return builder.StartVector(1, numElems, 1) -def CustomQuantizationEnd(builder): return builder.EndObject() - -try: - from typing import List -except: - pass - -class CustomQuantizationT(object): - - # CustomQuantizationT - def __init__(self): - self.custom = None # type: List[int] - - @classmethod - def InitFromBuf(cls, buf, pos): - customQuantization = CustomQuantization() - customQuantization.Init(buf, pos) - return cls.InitFromObj(customQuantization) - - @classmethod - def InitFromObj(cls, customQuantization): - x = CustomQuantizationT() - x._UnPack(customQuantization) - return x - - # CustomQuantizationT - def _UnPack(self, customQuantization): - if customQuantization is None: - return - if not customQuantization.CustomIsNone(): - if np is None: - self.custom = [] - for i in range(customQuantization.CustomLength()): - self.custom.append(customQuantization.Custom(i)) - else: - self.custom = customQuantization.CustomAsNumpy() - - # CustomQuantizationT - def Pack(self, builder): - if self.custom is not None: - if np is not None and type(self.custom) is np.ndarray: - custom = builder.CreateNumpyVector(self.custom) - else: - CustomQuantizationStartCustomVector(builder, len(self.custom)) - for i in reversed(range(len(self.custom))): - builder.PrependUint8(self.custom[i]) - custom = builder.EndVector(len(self.custom)) - CustomQuantizationStart(builder) - if self.custom is not None: - CustomQuantizationAddCustom(builder, custom) - customQuantization = CustomQuantizationEnd(builder) - return customQuantization - - - -class SpaceToDepthOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsSpaceToDepthOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = SpaceToDepthOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def SpaceToDepthOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # SpaceToDepthOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # SpaceToDepthOptions - def BlockSize(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - -def SpaceToDepthOptionsStart(builder): builder.StartObject(1) -def SpaceToDepthOptionsAddBlockSize(builder, blockSize): builder.PrependInt32Slot(0, blockSize, 0) -def SpaceToDepthOptionsEnd(builder): return builder.EndObject() - - -class SpaceToDepthOptionsT(object): - - # SpaceToDepthOptionsT - def __init__(self): - self.blockSize = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - spaceToDepthOptions = SpaceToDepthOptions() - spaceToDepthOptions.Init(buf, pos) - return cls.InitFromObj(spaceToDepthOptions) - - @classmethod - def InitFromObj(cls, spaceToDepthOptions): - x = SpaceToDepthOptionsT() - x._UnPack(spaceToDepthOptions) - return x - - # SpaceToDepthOptionsT - def _UnPack(self, spaceToDepthOptions): - if spaceToDepthOptions is None: - return - self.blockSize = spaceToDepthOptions.BlockSize() - - # SpaceToDepthOptionsT - def Pack(self, builder): - SpaceToDepthOptionsStart(builder) - SpaceToDepthOptionsAddBlockSize(builder, self.blockSize) - spaceToDepthOptions = SpaceToDepthOptionsEnd(builder) - return spaceToDepthOptions - - - -class TransposeConvOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsTransposeConvOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = TransposeConvOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def TransposeConvOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # TransposeConvOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # TransposeConvOptions - def Padding(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos) - return 0 - - # TransposeConvOptions - def StrideW(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - - # TransposeConvOptions - def StrideH(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos) - return 0 - -def TransposeConvOptionsStart(builder): builder.StartObject(3) -def TransposeConvOptionsAddPadding(builder, padding): builder.PrependInt8Slot(0, padding, 0) -def TransposeConvOptionsAddStrideW(builder, strideW): builder.PrependInt32Slot(1, strideW, 0) -def TransposeConvOptionsAddStrideH(builder, strideH): builder.PrependInt32Slot(2, strideH, 0) -def TransposeConvOptionsEnd(builder): return builder.EndObject() - - -class TransposeConvOptionsT(object): - - # TransposeConvOptionsT - def __init__(self): - self.padding = 0 # type: int - self.strideW = 0 # type: int - self.strideH = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - transposeConvOptions = TransposeConvOptions() - transposeConvOptions.Init(buf, pos) - return cls.InitFromObj(transposeConvOptions) - - @classmethod - def InitFromObj(cls, transposeConvOptions): - x = TransposeConvOptionsT() - x._UnPack(transposeConvOptions) - return x - - # TransposeConvOptionsT - def _UnPack(self, transposeConvOptions): - if transposeConvOptions is None: - return - self.padding = transposeConvOptions.Padding() - self.strideW = transposeConvOptions.StrideW() - self.strideH = transposeConvOptions.StrideH() - - # TransposeConvOptionsT - def Pack(self, builder): - TransposeConvOptionsStart(builder) - TransposeConvOptionsAddPadding(builder, self.padding) - TransposeConvOptionsAddStrideW(builder, self.strideW) - TransposeConvOptionsAddStrideH(builder, self.strideH) - transposeConvOptions = TransposeConvOptionsEnd(builder) - return transposeConvOptions - - - -class Buffer(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsBuffer(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = Buffer() - x.Init(buf, n + offset) - return x - - @classmethod - def BufferBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # Buffer - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # Buffer - def Data(self, j): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - a = self._tab.Vector(o) - return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) - return 0 - - # Buffer - def DataAsNumpy(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) - return 0 - - # Buffer - def DataLength(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.VectorLen(o) - return 0 - - # Buffer - def DataIsNone(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - return o == 0 - -def BufferStart(builder): builder.StartObject(1) -def BufferAddData(builder, data): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(data), 0) -def BufferStartDataVector(builder, numElems): return builder.StartVector(1, numElems, 1) -def BufferEnd(builder): return builder.EndObject() - -try: - from typing import List -except: - pass - -class BufferT(object): - - # BufferT - def __init__(self): - self.data = None # type: List[int] - - @classmethod - def InitFromBuf(cls, buf, pos): - buffer = Buffer() - buffer.Init(buf, pos) - return cls.InitFromObj(buffer) - - @classmethod - def InitFromObj(cls, buffer): - x = BufferT() - x._UnPack(buffer) - return x - - # BufferT - def _UnPack(self, buffer): - if buffer is None: - return - if not buffer.DataIsNone(): - if np is None: - self.data = [] - for i in range(buffer.DataLength()): - self.data.append(buffer.Data(i)) - else: - self.data = buffer.DataAsNumpy() - - # BufferT - def Pack(self, builder): - if self.data is not None: - if np is not None and type(self.data) is np.ndarray: - data = builder.CreateNumpyVector(self.data) - else: - BufferStartDataVector(builder, len(self.data)) - for i in reversed(range(len(self.data))): - builder.PrependUint8(self.data[i]) - data = builder.EndVector(len(self.data)) - BufferStart(builder) - if self.data is not None: - BufferAddData(builder, data) - buffer = BufferEnd(builder) - return buffer - - - -class CallOptions(object): - __slots__ = ['_tab'] - - @classmethod - def GetRootAsCallOptions(cls, buf, offset): - n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) - x = CallOptions() - x.Init(buf, n + offset) - return x - - @classmethod - def CallOptionsBufferHasIdentifier(cls, buf, offset, size_prefixed=False): - return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) - - # CallOptions - def Init(self, buf, pos): - self._tab = flatbuffers.table.Table(buf, pos) - - # CallOptions - def Subgraph(self): - o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) - if o != 0: - return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos) - return 0 - -def CallOptionsStart(builder): builder.StartObject(1) -def CallOptionsAddSubgraph(builder, subgraph): builder.PrependUint32Slot(0, subgraph, 0) -def CallOptionsEnd(builder): return builder.EndObject() - - -class CallOptionsT(object): - - # CallOptionsT - def __init__(self): - self.subgraph = 0 # type: int - - @classmethod - def InitFromBuf(cls, buf, pos): - callOptions = CallOptions() - callOptions.Init(buf, pos) - return cls.InitFromObj(callOptions) - - @classmethod - def InitFromObj(cls, callOptions): - x = CallOptionsT() - x._UnPack(callOptions) - return x - - # CallOptionsT - def _UnPack(self, callOptions): - if callOptions is None: - return - self.subgraph = callOptions.Subgraph() - - # CallOptionsT - def Pack(self, builder): - CallOptionsStart(builder) - CallOptionsAddSubgraph(builder, self.subgraph) - callOptions = CallOptionsEnd(builder) - return callOptions diff --git a/tflite2xcore/tflite2xcore/xcore_schema/subgraph.py b/tflite2xcore/tflite2xcore/xcore_schema/subgraph.py deleted file mode 100644 index a87c8dcba..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/subgraph.py +++ /dev/null @@ -1,214 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from copy import deepcopy -from typing import TYPE_CHECKING, Any, Optional, Iterable, List - -from . import ( - _ModelDependent, - TensorType, - OperatorCode, - Buffer, - _ShapeInputType, - Tensor, - Operator, - _OpOptionsType, -) - -if TYPE_CHECKING: - from . import XCOREModel - - -class Subgraph(_ModelDependent): - def __init__( - self, - name: Optional[str] = None, - model: Optional["XCOREModel"] = None, - inputs: Optional[Iterable[Tensor]] = None, - outputs: Optional[Iterable[Tensor]] = None, - operators: Optional[Iterable[Operator]] = None, - tensors: Optional[Iterable[Tensor]] = None, - ) -> None: - super().__init__(name, model) - self.inputs: List[Tensor] = list(inputs or []) - self.outputs: List[Tensor] = list(outputs or []) - self.operators: List[Operator] = list(operators or []) - self.tensors: List[Tensor] = list(tensors or []) - - @property - def intermediates(self) -> List[Tensor]: - # intermediates are any tensors that are not an input or an output - return [t for t in self.tensors if t not in (self.inputs + self.outputs)] - - def is_equal(self, other: Any) -> bool: - return ( - super().is_equal(other) - # and self.name == other.name # intentionally not compared - and self.sequence_equal(self.inputs, other.inputs) - and self.sequence_equal(self.outputs, other.outputs) - and self.sequence_equal(self.operators, other.operators) - and self.sequence_equal(self.tensors, other.tensors) - ) - - def create_tensor( - self, - name: str, - type_: TensorType, - shape: _ShapeInputType, - *, - buffer: Optional[Buffer] = None, - quantization: Optional[_OpOptionsType] = None, - isinput: bool = False, - isoutput: bool = False, - producers: Optional[Iterable[Operator]] = None, - consumers: Optional[Iterable[Operator]] = None, - ) -> Tensor: - - name = self.make_unique_tensor_name(name) - tensor = Tensor(self, name, type_, shape, quantization, producers, consumers) - - if buffer is None: - try: - buffer = Buffer(self._model) - except AttributeError: - buffer = Buffer() - tensor.buffer = buffer - tensor.buffer.owners.append(tensor) - - self.tensors.append(tensor) - if isinput: - self.inputs.append(tensor) - if isoutput: - self.outputs.append(tensor) - return tensor - - def remove_tensor(self, tensor: Tensor) -> None: - """Removes the tensor from the subgraph and cuts all its connections. - - Note that the tensor will be left in an illegal state. - """ - assert tensor in self.tensors - self.tensors.remove(tensor) - self._remove_if_contained(self.inputs, tensor) - self._remove_if_contained(self.outputs, tensor) - for op in tensor.consumers: - self._remove_if_contained(op.inputs, tensor) - for op in tensor.producers: - self._remove_if_contained(op.outputs, tensor) - tensor.buffer.owners.remove(tensor) - - # TODO: fix this - # del tensor.consumers, tensor.producers, tensor.subgraph, tensor.buffer - del tensor.consumers, tensor.producers, tensor.buffer - - def generate_unique_op_name(self, operator_code: OperatorCode) -> str: - existing_names = [op.name for op in self.operators] - j = 0 - while True: - j, new_name = j + 1, f"{operator_code.name}_{j}" - if new_name not in existing_names: - return new_name - - def make_unique_tensor_name(self, candidate_name: str) -> str: - existing_names = [ - name - for tensor in self.tensors - for name in (tensor.name, tensor.sanitized_name) - ] - - j, new_name = 1, candidate_name - while True: - if new_name not in existing_names: - return new_name - j, new_name = j + 1, f"{candidate_name}_{j}" - - def create_operator( - self, - operator_code: OperatorCode, - *, - inputs: Optional[Iterable[Tensor]] = None, - outputs: Optional[Iterable[Tensor]] = None, - builtin_options: Optional[_OpOptionsType] = None, - custom_options: Optional[_OpOptionsType] = None, - ) -> Operator: - name = self.generate_unique_op_name(operator_code) - operator = Operator( - self, operator_code, name, inputs, outputs, builtin_options, custom_options - ) - self.operators.append(operator) - for input_tensor in operator.inputs: - input_tensor.consumers.append(operator) - for output_tensor in operator.outputs: - output_tensor.producers.append(operator) - return operator - - def remove_operator(self, op: Operator) -> None: - """Removes the operator from the subgraph and cuts all its connections. - - Note that the operator will be left in an illegal state. - """ - assert op in self.operators - self.operators.remove(op) - for t in op.inputs: - self._remove_if_contained(t.consumers, op) - for t in op.outputs: - self._remove_if_contained(t.producers, op) - del op.inputs, op.outputs, op.subgraph - - def insert_operator( - self, ref_op: Operator, new_op: Operator, after: bool = False - ) -> None: - """NOTE: this does not rewire inputs/outputs""" - # find location of reference op - try: - ref_idx = self.operators.index(ref_op) - except ValueError as e: - raise ValueError("Cannot find reference operator in the subgraph") from e - - # remove new_op from list if already in the subgraph - if new_op in self.operators: - self.operators.remove(new_op) - - # (re)insert new op before/after reference op - self.operators.insert(ref_idx + (1 if after else 0), new_op) - - def replace_operator(self, op: Operator, new_op: Operator) -> None: - """NOTE: this does not rewire inputs/outputs""" - # insert new op - try: - self.insert_operator(op, new_op) - except ValueError: - raise ValueError("Cannot find operator to replace in the subgraph") - # remove old op - self.remove_operator(op) - - def clone_tensor(self, tensor: Tensor) -> Tensor: - return self.create_tensor( - tensor.name, - tensor.type, - tensor.shape, - quantization=deepcopy(tensor.quantization), - buffer=Buffer(self.model, tensor.buffer.data), - ) - - def get_tensor(self, name: str) -> Tensor: - for t in self.tensors: - if t.name == name: - return t - raise ValueError(f"Tensor with name {name} not found!") - - def sanity_check(self) -> None: - assert self in self.model.subgraphs - # check for duplicates - assert len(self.inputs) == len(set(self.inputs)) - assert len(self.outputs) == len(set(self.outputs)) - assert len(self.operators) == len(set(self.operators)) - assert len(self.tensors) == len(set(self.tensors)) - # make sure inputs and outputs are not misplaced - for tensor in self.inputs + self.outputs: - assert tensor in self.tensors - # the subgraph is sane as long as all its objects are sane - for op in self.operators: - op.sanity_check() - for tensor in self.tensors: - tensor.sanity_check() diff --git a/tflite2xcore/tflite2xcore/xcore_schema/tensor.py b/tflite2xcore/tflite2xcore/xcore_schema/tensor.py deleted file mode 100644 index ab4a03bd9..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/tensor.py +++ /dev/null @@ -1,119 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import numpy as np -from typing import TYPE_CHECKING, Optional, Iterable, Union, List, Tuple, Any - -from . import ( - TensorType, - _SubgraphDependent, - Buffer, - Operator, - _OpOptionsType, -) - -if TYPE_CHECKING: - from . import Subgraph - -_ShapeInputType = Union[None, Iterable[Union[int, np.integer]], np.ndarray] - - -class Tensor(_SubgraphDependent): - name: str - buffer: Buffer - - def __init__( - self, - subgraph: "Subgraph", - name: str, - type_: TensorType, - shape: _ShapeInputType, - quantization: Optional[_OpOptionsType] = None, - producers: Optional[Iterable[Operator]] = None, - consumers: Optional[Iterable[Operator]] = None, - ) -> None: - # Generally, do not use this constructor to instantiate Tensor! - # Use Subgraph.create_tensor instead. - - super().__init__(name or "") - self._subgraph = subgraph # parent - assert isinstance(type_, TensorType) - self.type = type_ - self.shape: Tuple[int, ...] = shape # type: ignore # see https://github.com/python/mypy/issues/3004 - - self.quantization = quantization or {} - self.producers: List[Operator] = list(producers or []) - self.consumers: List[Operator] = list(consumers or []) - - @property - def shape(self) -> Tuple[int, ...]: - return self._shape - - @shape.setter - def shape(self, shape: _ShapeInputType) -> None: - if shape is None: - shape = [] - elif isinstance(shape, np.ndarray): - shape = shape.tolist() - else: - shape = list(shape) - - for j, s in enumerate(shape): - if not isinstance(s, (int, np.integer)): - raise TypeError( - "Tensor.shape must be an iterable of integers, " - f"got shape[{j}] = {s} with type {type(s)}" - ) - - self._shape = tuple(int(s) for s in shape) - - def is_equal(self, other: Any) -> bool: - return ( - super().is_equal(other) - # and self.name == other.name # intentionally not compared - and self.buffer.is_equal(other.buffer) - and self.type == other.type - and self.shape == other.shape - and self.quantization == other.quantization - and len(self.producers) == len(other.producers) # avoids circular deps - and len(self.consumers) == len(other.consumers) # avoids circular deps - ) - - def __str__(self) -> str: - return f"name={self.name}, type={self.type.name}, shape={self.shape}, buffer={self.buffer}" - - def sanity_check(self) -> None: - assert self in self.subgraph.tensors - assert self in self.buffer.owners - # check double links with consumers/producers - for op in self.producers: - assert self in op.outputs - for op in self.consumers: - assert self in op.inputs - - @property - def sanitized_name(self) -> str: - """Return a name that is safe to use in source code""" - return self.name.replace("/", "_") - - @property - def size(self) -> int: - return self.type.sizeof() * np.prod(self.shape) # type: ignore - - def as_array(self, dtype: Optional[type] = None) -> np.ndarray: - arr = np.copy( - np.frombuffer(self.buffer._data, dtype=self.type.to_numpy_dtype()) - ) - if dtype: - arr = arr.astype(dtype) - return arr.reshape(self.shape) - - @property - def is_constant(self) -> bool: - # There is an esoteric case where by a tensor without any producers could potentially be - # modified if it shares a buffer with a tensor from another subgraph. - # As such we also check if all owners of its buffer have no producers and are not inputs - return all( - not t.producers and t not in self.subgraph.inputs - for t in self.buffer.owners - ) diff --git a/tflite2xcore/tflite2xcore/xcore_schema/tensor_type.py b/tflite2xcore/tflite2xcore/xcore_schema/tensor_type.py deleted file mode 100644 index 6c92f1bc6..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/tensor_type.py +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -# type: ignore - -import numpy as np -from enum import Enum - -from . import schema_py_generated as schema - -TensorType = Enum( - "TensorType", - {k: v for k, v in vars(schema.TensorType).items() if not k.startswith("__")}, -) - -__TensorType_to_stdint_type = { - # TensorType.STRING: None, # intentionally not supported - TensorType.FLOAT64: "float64_t", - TensorType.FLOAT32: "float32_t", - TensorType.FLOAT16: "float16_t", - TensorType.COMPLEX64: "complex64_t", - TensorType.INT64: "int64_t", - TensorType.INT32: "int32_t", - TensorType.INT16: "int16_t", - TensorType.INT8: "int8_t", - TensorType.UINT8: "uint8_t", - TensorType.BOOL: "uint8_t", -} -TensorType.to_stdint_type = lambda self: __TensorType_to_stdint_type[self] - -__TensorType_sizeof = { - # TensorType.STRING: None, # intentionally not supported - TensorType.FLOAT64: 8, - TensorType.FLOAT32: 4, - TensorType.FLOAT16: 2, - TensorType.COMPLEX64: 8, - TensorType.INT64: 8, - TensorType.INT32: 4, - TensorType.INT16: 2, - TensorType.INT8: 1, - TensorType.UINT8: 1, - TensorType.BOOL: 1, -} -TensorType.sizeof = lambda self: __TensorType_sizeof[self] - -__TensorType_to_numpy_dtype = { - # TensorType.STRING: None, # intentionally not supported - TensorType.FLOAT64: np.dtype(np.float64), - TensorType.FLOAT32: np.dtype(np.float32), - TensorType.FLOAT16: np.dtype(np.float16), - TensorType.COMPLEX64: np.dtype(np.complex64), - TensorType.INT64: np.dtype(np.int64), - TensorType.INT32: np.dtype(np.int32), - TensorType.INT16: np.dtype(np.int16), - TensorType.INT8: np.dtype(np.int8), - TensorType.UINT8: np.dtype(np.uint8), - TensorType.BOOL: np.dtype(np.bool_), -} -TensorType.to_numpy_dtype = lambda self: __TensorType_to_numpy_dtype[self] - -__TensorType_from_numpy_dtype = { - np.dtype(np.float64): TensorType.FLOAT64, - np.dtype(np.float32): TensorType.FLOAT32, - np.dtype(np.float16): TensorType.FLOAT16, - np.dtype(np.complex64): TensorType.COMPLEX64, - np.dtype(np.int64): TensorType.INT64, - np.dtype(np.int32): TensorType.INT32, - np.dtype(np.int16): TensorType.INT16, - np.dtype(np.int8): TensorType.INT8, - np.dtype(np.uint8): TensorType.UINT8, - np.dtype(np.bool_): TensorType.BOOL, -} -TensorType.from_numpy_dtype = lambda x: __TensorType_from_numpy_dtype[np.dtype(x)] diff --git a/tflite2xcore/tflite2xcore/xcore_schema/tensor_type.pyi b/tflite2xcore/tflite2xcore/xcore_schema/tensor_type.pyi deleted file mode 100644 index a384b6db5..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/tensor_type.pyi +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) 2020, XMOS Ltd, All rights reserved - -import enum -import numpy as np -from typing import Callable, Any - -class TensorType(enum.IntEnum): - STRING: TensorType - FLOAT64: TensorType - FLOAT32: TensorType - FLOAT16: TensorType - COMPLEX64: TensorType - INT64: TensorType - INT32: TensorType - INT16: TensorType - INT8: TensorType - UINT8: TensorType - BOOL: TensorType - @classmethod - def __call__(cls, x: Any) -> TensorType: ... - def to_stdint_type(self) -> str: ... - def sizeof(self) -> int: ... - def to_numpy_dtype(self) -> np.dtype: ... - from_numpy_dtype: Callable[[np.dtype], TensorType] diff --git a/tflite2xcore/tflite2xcore/xcore_schema/xcore_model.py b/tflite2xcore/tflite2xcore/xcore_schema/xcore_model.py deleted file mode 100644 index a59b03168..000000000 --- a/tflite2xcore/tflite2xcore/xcore_schema/xcore_model.py +++ /dev/null @@ -1,463 +0,0 @@ -# Copyright 2019-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -import pathlib -import flatbuffers -import logging -from typing import ( - Dict, - Any, - Union, - Optional, - Iterable, - List, - Counter, - TypeVar, - Type, - overload, - cast, - MutableSequence, -) - -from . import ( - _IRObject, - _ModelDependent, - _DataContainer, - OperatorCode, - Buffer, - Subgraph, - Metadata, - BuiltinOpCodes, - XCOREOpCodes, - ExternalOpCodes, - ValidOpCodes, - TensorType, - schema_py_generated as schema, -) -from .dict_conversion import ( - builtin_options_to_dict, - dict_to_builtin_options, - quantization_to_dict, - dict_to_quantization, - create_dict_from_model, -) -from .flexbuffers import FlexbufferBuilder, FlexbufferParser -from .builtin_options import BuiltinOptions - -from tflite2xcore.utils import asserting_cast -from tflite2xcore.execution_planning import ReverseDepthFirstPlanner - -_R = TypeVar("_R", bound="XCOREModel") - -_T = TypeVar("_T", bound="_ModelDependent") - - -class _ModelDependentContainer(MutableSequence[_T]): - def __init__(self, model: "XCOREModel", objects: Optional[Iterable[_T]] = None): - self._model = model - self._objects: List[_T] = [] - if objects: - self.extend(objects) # pylint: disable=no-member - - @overload - def __getitem__(self, key: int) -> _T: - ... - - @overload - def __getitem__(self, key: slice) -> "_ModelDependentContainer[_T]": - ... - - def __getitem__( - self, key: Union[int, slice] - ) -> Union[_T, "_ModelDependentContainer[_T]"]: - if isinstance(key, int): - return self._objects[key] - - return _ModelDependentContainer(self._model, self._objects[key]) - - def __delitem__(self, key: Union[int, slice]) -> None: - objects = [self[key]] if isinstance(key, int) else self[key] - for obj in objects: - del obj._model - del self._objects[key] - - @overload - def __setitem__(self, key: int, obj: _T) -> None: - ... - - @overload - def __setitem__(self, key: slice, objects: Iterable[_T]) -> None: - ... - - def __setitem__( - self, key: Union[int, slice], objects: Union[_T, Iterable[_T]] - ) -> None: - # NOTE: mypy cannot correctly infer the type of objects given the type of key - # so the casts below are to suppress the resulting mypy errors - - if isinstance(key, int): - del self._objects[key]._model - obj = cast(_T, objects) - self._objects[key] = obj - obj._model = self._model - return - - # NOTE: since key must be a slice now, there is guarantee that - # self._objects[key] has the same length as objects - - old_objects = self._objects[key] - for old_obj in old_objects: - del old_obj._model - - # objects can be an iterator, so we need to set _model on the fly - def set_model(obj: _T) -> _T: - obj._model = self._model - return obj - - self._objects[key] = (set_model(obj) for obj in cast(Iterable[_T], objects)) - - def insert(self, idx: int, obj: _T) -> None: - self._objects.insert(idx, obj) - obj._model = self._model - - def __len__(self) -> int: - return len(self._objects) - - -class XCOREModel(_IRObject): - def __init__( - self, - version: Optional[int] = None, - description: Optional[str] = None, - subgraphs: Optional[Iterable[Subgraph]] = None, - buffers: Optional[Iterable[Buffer]] = None, - metadata: Optional[Iterable[Metadata]] = None, - ) -> None: - super().__init__() - self.version = version or 3 - self.description = description or "" - self.buffers = _ModelDependentContainer[Buffer](self, buffers) - self.metadata = _ModelDependentContainer[Metadata](self, metadata) - self.subgraphs = _ModelDependentContainer[Subgraph](self, subgraphs) - - def register_dependent(self, dependent: _ModelDependent) -> None: - if isinstance(dependent, Buffer): - self.buffers.append(dependent) # pylint: disable=no-member - elif isinstance(dependent, Metadata): - self.metadata.append(dependent) # pylint: disable=no-member - elif isinstance(dependent, Subgraph): - self.subgraphs.append(dependent) # pylint: disable=no-member - else: - raise TypeError(f"Unsupported model dependent with type {type(dependent)}") - - def is_equal(self, other: Any) -> bool: - return ( - super().is_equal(other) - and self.version == other.version - # and self.description == other.description # intentionally not compared - and self.sequence_equal(self.buffers, other.buffers) - and self.sequence_equal(self.subgraphs, other.subgraphs) - and self.sequence_equal(self.metadata, other.metadata) - ) - - def count_operator_codes(self) -> Counter[OperatorCode]: - return Counter( - operator.operator_code - for subgraph in self.subgraphs - for operator in subgraph.operators - ) - - @property - def operator_codes(self) -> List[OperatorCode]: - # sort the operators codes from most frequent to least frequent - # why? because the flatbuffer is a tiny bit smaller if we do - return [op_code for op_code, _ in self.count_operator_codes().most_common()] - - def sanity_check(self) -> None: - # check for duplicates - assert len(self.subgraphs) == len(set(self.subgraphs)) - assert len(self.buffers) == len(set(self.buffers)) - assert len(self.metadata) == len(set(self.metadata)) - # the model is sane as long as all its subgraphs are sane - for subgraph in self.subgraphs: - subgraph.sanity_check() - for buffer in self.buffers: - buffer.sanity_check() - for metadata in self.metadata: - metadata.sanity_check() - - @classmethod - def _from_flatbuffer_model(cls: Type[_R], modelT: schema.ModelT) -> _R: - model = cls( - version=modelT.version, - description=modelT.description.decode("utf-8") # type: ignore - if modelT.description - else None, - ) - - # load metadata - metadata_map = { - metadataT.buffer: Metadata( - name=metadataT.name.decode("utf-8") # type: ignore - if metadataT.name - else None, - model=model, - data=modelT.buffers[metadataT.buffer].data, - ) - for metadataT in modelT.metadata or [] - } - - # check that buffer 0 is empty - # NOTE: BufferT.data can be np.ndarray - buffer_0_data = modelT.buffers[0].data - if buffer_0_data is not None and len(buffer_0_data) > 0: - logging.warning("Non-empty buffer 0 in flatbuffer!") - - # create all non-metadata buffers - buffer_map = { - idx: Buffer(model, bufferT.data) - for idx, bufferT in enumerate(modelT.buffers) - if idx not in metadata_map - } - - # create operator codes lookup - operator_codes_lut = [] - for operator_codeT in modelT.operatorCodes: - opcode: ValidOpCodes = BuiltinOpCodes(operator_codeT.builtinCode) - if opcode is BuiltinOpCodes.CUSTOM: - custom_code = operator_codeT.customCode.decode("utf-8") # type: ignore - try: - opcode = XCOREOpCodes(custom_code) - except ValueError: - opcode = ExternalOpCodes.add_new_opcode(custom_code) - operator_codes_lut.append( - OperatorCode(opcode, version=operator_codeT.version) - ) - - # load subgraphs - for subgraph_index, subgraphT in enumerate(modelT.subgraphs): - subgraph = Subgraph( - name=subgraphT.name.decode("utf-8") # type: ignore - if subgraphT.name - else None, - model=model, - ) - - # load tensors - tensors = [] - for tensor_index, tensorT in enumerate(subgraphT.tensors): - is_input = tensor_index in subgraphT.inputs - is_output = tensor_index in subgraphT.outputs - - # load quantization - quantization = None - if hasattr(tensorT, "quantization") and tensorT.quantization: - quantization = quantization_to_dict(tensorT.quantization) - - if tensorT.buffer in metadata_map: - # a tensor is referencing a metadata buffer - # this shouldn't happen, but we can work around it - metadata = metadata_map[tensorT.buffer] - logging.warning( - f"Tensor {tensor_index} referencing " - f'metadata "{metadata.name}" with buffer {tensorT.buffer}' - ) - buffer_map[tensorT.buffer] = Buffer(model, metadata.data) - - tensor = subgraph.create_tensor( - name=tensorT.name.decode("utf-8"), # type: ignore - type_=TensorType(tensorT.type), - shape=tensorT.shape, - buffer=buffer_map[tensorT.buffer], - quantization=quantization, - isinput=is_input, - isoutput=is_output, - ) - tensors.append(tensor) - - # load operators & set inputs/outputs (registers op as tensor consumer/producer) - for operator_index, operatorT in enumerate(subgraphT.operators): - options = {} - if ( - hasattr(operatorT, "builtinOptions") - and operatorT.builtinOptions is not None - ): - options["builtin_options"] = builtin_options_to_dict( - operatorT.builtinOptions - ) - if ( - hasattr(operatorT, "customOptions") - and operatorT.customOptions is not None - ): - options["custom_options"] = FlexbufferParser().parse( - bytes(operatorT.customOptions) - ) - - def is_valid_tensor_index( - idx: int, lower: int = -1, upper: int = len(tensors) - ) -> bool: - if idx < lower or idx >= upper: - raise ValueError( - f"Invalid input tensor index [{idx}]: " - f"subgraph [{subgraph_index}], " - f"operator [{operator_index}], " - f"bounds: [{lower}, {upper}]" - ) - - return idx != -1 # -1 encodes optional for input indices - - subgraph.create_operator( - operator_code=operator_codes_lut[operatorT.opcodeIndex], - inputs=[ - tensors[input_index] - for input_index in operatorT.inputs - if is_valid_tensor_index(input_index) - ], - outputs=[ - tensors[output_index] - for output_index in operatorT.outputs - if is_valid_tensor_index(output_index, lower=0) - ], - **options, - ) - - model.sanity_check() - return model - - @classmethod - def deserialize(cls: Type[_R], bits: bytes) -> _R: - model_obj = schema.Model.GetRootAsModel(bits, 0) # type: ignore - modelT = schema.ModelT.InitFromObj(model_obj) # type: ignore - return cls._from_flatbuffer_model(modelT) - - @classmethod - def read_flatbuffer(cls: Type[_R], filename: Union[pathlib.Path, str]) -> _R: - with open(pathlib.Path(filename).resolve(), "rb") as fd: - bits = bytes(fd.read()) - - return cls.deserialize(bits) - - def _to_flatbuffer_model(self) -> schema.ModelT: - modelT = schema.ModelT() # type: ignore - modelT.version = self.version - modelT.description = self.description - - modelT.buffers = [] - - def create_buffer_from_container(data_container: _DataContainer) -> int: - """ returns the index of the serialized bufferT object""" - bufferT = schema.BufferT() # type: ignore - if len(data_container.data) > 0: - bufferT.data = list(data_container.data) - modelT.buffers.append(bufferT) - return len(modelT.buffers) - 1 - - # check that buffer 0 is empty - if self.buffers[0]: - logging.warning("Non-empty buffer 0 in model!") - - # create tensor buffers - buffer_idx_map: Dict[Buffer, int] = {} - for buffer in self.buffers: - buffer_idx_map[buffer] = create_buffer_from_container(buffer) - - # create metadata and their buffers - modelT.metadata = [] - for metadata in self.metadata: - metadataT = schema.MetadataT() # type: ignore - metadataT.name = metadata.name - metadataT.buffer = create_buffer_from_container(metadata) - modelT.metadata.append(metadataT) - - # create operator_codes - modelT.operatorCodes = [] - for operator_code in self.operator_codes: - operatorCodeT = schema.OperatorCodeT() # type: ignore - if operator_code.code in BuiltinOpCodes: - operatorCodeT.builtinCode = asserting_cast(int, operator_code.value) - else: - operatorCodeT.builtinCode = BuiltinOpCodes.CUSTOM.value - operatorCodeT.customCode = operator_code.name - operatorCodeT.version = operator_code.version - modelT.operatorCodes.append(operatorCodeT) - - # create subgraphs - modelT.subgraphs = [] - for subgraph in self.subgraphs: - subgraphT = schema.SubGraphT() # type: ignore - subgraphT.name = subgraph.name - - # set inputs and outputs - subgraphT.inputs = [subgraph.tensors.index(t) for t in subgraph.inputs] - subgraphT.outputs = [subgraph.tensors.index(t) for t in subgraph.outputs] - - # set tensors - subgraphT.tensors = [] - for tensor in subgraph.tensors: - tensorT = schema.TensorT() # type: ignore - tensorT.name = tensor.name - tensorT.shape = list(tensor.shape) - tensorT.buffer = buffer_idx_map[tensor.buffer] - tensorT.type = tensor.type.value - if tensor.quantization: - tensorT.quantization = dict_to_quantization(tensor.quantization) - subgraphT.tensors.append(tensorT) - - # set operators - subgraphT.operators = [] - planner = ReverseDepthFirstPlanner(subgraph) - for operator in planner.make_plan(): - operatorT = schema.OperatorT() # type: ignore - op_code = operator.operator_code - operatorT.opcodeIndex = self.operator_codes.index(op_code) - - operatorT.inputs = [subgraph.tensors.index(t) for t in operator.inputs] - operatorT.outputs = [ - subgraph.tensors.index(t) for t in operator.outputs - ] - - # TODO: fix this hack - # we need a better data structure to represent inputs/outputs of operators - if op_code.code is ExternalOpCodes.LceBconv2d: - if len(operatorT.inputs) == 3: - # bitpacked output - operatorT.inputs = ( - operatorT.inputs[:2] + [-1, -1] + operatorT.inputs[-1:] - ) - else: - # int8 output - operatorT.inputs = operatorT.inputs + [-1] - - if op_code.code in BuiltinOpCodes: - builtin_options_type = BuiltinOptions.from_BuiltinOpCodes( - op_code.code - ) - operatorT.builtinOptionsType = builtin_options_type.value - - if operator.builtin_options: - operatorT.builtinOptions = dict_to_builtin_options( - builtin_options_type, operator.builtin_options - ) - - if operator.custom_options: - fbb = FlexbufferBuilder(operator.custom_options) - operatorT.customOptions = fbb.get_bytes() - subgraphT.operators.append(operatorT) - - modelT.subgraphs.append(subgraphT) - - return modelT - - def serialize(self) -> bytes: - modelT = self._to_flatbuffer_model() - builder = flatbuffers.Builder(1024 * 1024) - model_offset = modelT.Pack(builder) # type: ignore - builder.Finish(model_offset, file_identifier=b"TFL3") - return bytes(builder.Output()) - - def write_flatbuffer(self, filename: Union[pathlib.Path, str]) -> int: - with open(pathlib.Path(filename).resolve(), "wb") as fd: - return fd.write(self.serialize()) - - def to_dict(self, *args: Any, **kwargs: Any) -> Dict[Any, Any]: - return create_dict_from_model(self, *args, **kwargs) diff --git a/tflite2xcore/xformer.py b/tflite2xcore/xformer.py deleted file mode 100755 index b4ee28af4..000000000 --- a/tflite2xcore/xformer.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python -O -# Copyright 2020-2021 XMOS LIMITED. -# This Software is subject to the terms of the XMOS Public Licence: Version 1. - -from pathlib import Path - -from tflite2xcore import utils, analyze, version -import tflite2xcore.converter as xcore_conv - -if __name__ == "__main__": - parser = utils.VerbosityParser() - parser.add_argument("tflite_input", help="Input .tflite file.") - parser.add_argument("tflite_output", help="Output .tflite file.") - parser.add_argument( - "--minify", - action="store_true", - default=False, - help="Make the model smaller at the expense of readability.", - ) - parser.add_argument( - "-par", - "--num_threads", - type=int, - default=1, - help="Number of parallel threads for xcore.ai optimization.", - ) - parser.add_argument( - "--intermediates_path", - default=None, - help="Path to directory for storing intermediate models. If not given " - "intermediate models will not be saved. If path doesn't exists, " - "it will be created. Contents may be overwritten.", - ) - parser.add_argument( - "--analyze", - action="store_true", - default=False, - help="Analyze the output model. " - "A report is printed showing the runtime memory footprint of the model.", - ) - parser.add_argument( - "--remove_input_alignment_pad", - action="store_true", - default=False, - help="Remove channel-wise padding on the input tensor(s). " - "The new input tensor will have the padded size, " - "so the padding should be implemented by the application developer.", - ) - parser.add_argument( - "--version", - action="version", - version=version.get_version(), - help="Display the version of the xformer", - ) - parser.add_argument( - "--ext_mem", - action="store_true", - default=False, - help="Experimental flag for better external memory support.", - ) - parser.add_argument( - "--experimental-xformer2", - action="store_true", - default=False, - help="Use MLIR-based xformer 2.0 for part of the optimization pipeline. Experimental.", - ) - parser.add_argument( - "--only-experimental-xformer2", - action="store_true", - default=False, - help="Use only MLIR-based xformer 2.0. Experimental.", - ) - - args = parser.parse_args() - - utils.set_verbosity(args.verbose) - - tflite_input_path = Path(args.tflite_input) - tflite_output_path = Path(args.tflite_output) - - xcore_conv.convert( - tflite_input_path, - tflite_output_path, - minification=args.minify, - num_threads=args.num_threads, - intermediates_path=args.intermediates_path, - remove_input_alignment_pad=args.remove_input_alignment_pad, - external_memory=args.ext_mem, - experimental_xformer2=args.experimental_xformer2, - only_experimental_xformer2=args.only_experimental_xformer2 - ) - - print(f"Conversion successful, output: {tflite_output_path}") - - if args.analyze: - analyze.print_report(tflite_output_path) diff --git a/third_party/flatbuffers b/third_party/flatbuffers deleted file mode 160000 index 6df40a247..000000000 --- a/third_party/flatbuffers +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6df40a2471737b27271bdd9b900ab5f3aec746c7 diff --git a/third_party/lib_nn b/third_party/lib_nn index 45f17a5df..d756600c9 160000 --- a/third_party/lib_nn +++ b/third_party/lib_nn @@ -1 +1 @@ -Subproject commit 45f17a5df3a4d40e5027c1c881944cd2be25c959 +Subproject commit d756600c966499ba67321f17e4f2d601fd29aa57 diff --git a/third_party/lib_tflite_micro b/third_party/lib_tflite_micro index 9b45e297a..642ac44e7 160000 --- a/third_party/lib_tflite_micro +++ b/third_party/lib_tflite_micro @@ -1 +1 @@ -Subproject commit 9b45e297a917ee3372e425b53ab3494a4bb76634 +Subproject commit 642ac44e7a61e657195c433610cbd443c74b98f7 diff --git a/third_party/lib_xud b/third_party/lib_xud new file mode 160000 index 000000000..a3b230a48 --- /dev/null +++ b/third_party/lib_xud @@ -0,0 +1 @@ +Subproject commit a3b230a48661a8ad170756a541744568c592f3fc diff --git a/tools/precision profiling/.gitignore b/tools/precision profiling/.gitignore deleted file mode 100644 index ae94a13a7..000000000 --- a/tools/precision profiling/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -/venv -stage0/* -stage1/* -stage2/* -tflite_models/* -xcore_models/* -graphs/* -hists/* -/investigation -erroneousChannels.py -investigateConv.py -report/*.png -report/*.rst -!report/report.html diff --git a/tools/precision profiling/README.md b/tools/precision profiling/README.md deleted file mode 100644 index 9820ec479..000000000 --- a/tools/precision profiling/README.md +++ /dev/null @@ -1,55 +0,0 @@ -Precision Profiling -====================== - -Summary -------- -This tool can be used to split up a keras model trained with imagenet weights, and evaluate the accuracy of each layer when compared to a tflite and xcore conversion of the model. - -Installation ------------- - -### TFLM Interpreter -For the model you decide to use, operators may need to be added to the resolver in ../../third_party/lib_tflite_micro/tflm_interpreters for the xcore model to run. - -You will also need to build the tflm_interpreter, from ../../third_party/lib_tflite_micro/tflm_interpreter run: - - `make install` -### Flatbuffer tflite library -You will also need to build the flatc compiler from the flatbuffers module, and use it to compile the tflite library. - -From ../../third_party/lib_tflite_micro/lib_tflite_micro/submodules/flatbuffers run: - - `mkdir build` - - `cd build` - - `cmake ..` - - `make` - -This will have build flatc. Next to compile the schema run: - - `./flatc --python -o ../../../../../../tools/precision\ profiling/ ../../../../../../tools/precision\ profiling/schema.fbs` -### Virtual Environment and other dependencies -A virtual environment is reccomended such aw venv. Once an environment is active use requirements.txt to install the required dependencies. - - `pip3 install -r requirements.txt` - - `pip3 install -i https://test.pypi.org/simple/ xmos-tools` - -Running model_splitting.py ---------------------------- - -Due to the high memory requirements of this program, the tool can be run in 3 sections. - -First, pass the "generate" option when running model_splitting.py to generate the datasets and models required. - -`python3 model_splitting.py generate` - -The "evaluate" option will load these models, and run the datasets through the models to produce outputs. - -`python3 model_splitting.py evaluate` - -The "compare" option will then take these outputs, and compare them to produce various error metrics, and graphs displaying these metrics. - -`python3 model_splitting.py compare` diff --git a/tools/precision profiling/goldfish.png b/tools/precision profiling/goldfish.png deleted file mode 100644 index e15116dfe..000000000 Binary files a/tools/precision profiling/goldfish.png and /dev/null differ diff --git a/tools/precision profiling/model_splitting.py b/tools/precision profiling/model_splitting.py deleted file mode 100644 index 20e032603..000000000 --- a/tools/precision profiling/model_splitting.py +++ /dev/null @@ -1,71 +0,0 @@ -import ms_lib as ms -from ms_lib import layerArtifacts -import sys - -# Interface -if len(sys.argv) == 1: - print('Option 1 must:\n- generate\n- evaluate\n- compare') - quit() - -elif (sys.argv[1] == 'generate') or (sys.argv[1] == 'evaluate') or (sys.argv[1] == 'compare'): - pass -else: - print('Option 1 must:\n- generate\n- evaluate\n- compare') - quit() - -if sys.argv[1] == 'generate': - # Generate Base mode and image input - ######################################### - model = ms.generateBaseModel(0.25, 224) - im = ms.prepare_image('ostrich.png', 224) - im2 = ms.prepare_image('goldfish.png', 224) - - # Initialise Layers and Set inputs/outputs - ############################################ - Layers = ms.tfLayerArtifacts(model) - ref_outputs = ms.referenceOutputs(model, im) - ms.setInputsOutputs(Layers, ref_outputs, im) - - # Representative Datasets - ############################################# - ms.setRepDatasets(Layers, 500) - - # Generate tflite models - ############################################# - for Layer in Layers: - Layer.createTfliteModel() - Layer.createXcoreModel() - Layer.modelToOpList() - print(Layer.opList) - - # Save Layer objects as pickles - ############################################# - ms.saveLayers(Layers, 0) - -elif sys.argv[1] == 'evaluate': - # Load Layer objects - ########################################### - Layers = ms.loadLayers(0) - - # Evaluate tflite and xcore layers - ########################################### - for layer in Layers: - layer.eveluateTf(clampOut=True) - layer.evaluateTflite() - layer.evaluateXcore() - - ms.saveLayers(Layers, 1) - -elif sys.argv[1] == 'compare': - Layers = ms.loadLayers(1) - for layer in Layers: - layer.calcErrors('tf', 'tflite') - layer.calcErrors('tf', 'xcore') - layer.calcErrors('tflite', 'xcore') - layer.errorHists() - ms.saveLayers(Layers, 2) - ms.errorSpreadsheet(Layers) - ms.mainGraphs(Layers, 'average') - ms.mainGraphs(Layers, 'absolute') - ms.mainGraphs(Layers, 'maximum absolute') - ms.mainGraphs(Layers, 'mean squared') diff --git a/tools/precision profiling/ms_lib.py b/tools/precision profiling/ms_lib.py deleted file mode 100644 index 10af08c00..000000000 --- a/tools/precision profiling/ms_lib.py +++ /dev/null @@ -1,480 +0,0 @@ -import os, sys, pickle, logging - -import tensorflow as tf -from tensorflow.python.ops.numpy_ops import np_config -np_config.enable_numpy_behavior() -from keras.applications.imagenet_utils import decode_predictions -from tflm_interpreter import TFLMInterpreter -from xmos_tools import xformer as xf -import tensorflow_datasets as tfds -import numpy as np - -from pprint import pprint -from keras.preprocessing import image -from openpyxl import Workbook -import matplotlib.pyplot as plt - -from tflite.Model import Model - -os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' -tf.get_logger().setLevel(logging.ERROR) - - -class layerArtifacts: - def __init__(self, tfModel, layerID): - self.tfModel = tfModel - self.layerID = layerID - - opList = [] - - repDataset = None - - Input = None - refOutput = None - outputs = [] - - tfliteModel = None - tfliteRefOutput = None - tfliteOutputs = [] - - xcoreRefOutput = None - xcoreOutputs = [] - - tf_tflite_error = None - tf_tflite_abserror = None - tf_tflite_maxabs = None - tf_tflite_mse = None - tf_tflite_hist = None - - tf_xcore_error = None - tf_xcore_abserror = None - tf_xcore_maxabs = None - tf_xcore_mse = None - tf_xcore_hist = None - - tflite_xcore_error = None - tflite_xcore_abserror = None - tflite_xcore_maxabs = None - tflite_xcore_mse = None - tflite_xcore_hist = None - - def repDatasetGenerator(self): - for a in self.repDataset: - yield a - - def createTfliteModel(self): - os.makedirs('./tflite_models', exist_ok = True) - print('Generating tflite model ' + str(self.layerID)) - converter = tf.lite.TFLiteConverter.from_keras_model(self.tfModel) - converter.optimizations = [tf.lite.Optimize.DEFAULT] - converter.representative_dataset = self.repDatasetGenerator - converter.inference_input_type = tf.int8 - converter.inference_output_type = tf.int8 - converter.target_spec.supported_ops = [ - tf.lite.OpsSet.TFLITE_BUILTINS, - tf.lite.OpsSet.SELECT_TF_OPS, - ] - - self.tfliteModel = converter.convert() - - with open('./tflite_models/{}.tflite'.format(self.layerID), 'wb') as f: - f.write(self.tfliteModel) - - def saveTflite(self): - os.makedirs('./tflite_models', exist_ok = True) - if os.path.exists('./tflite_models/{}.tflite'.format(self.layerID)): - os.system('rm ./tflite_models/{}.tflite'.format(self.layerID)) - with open('./tflite_models/' + str(self.layerID) + '.tflite', 'wb') as f: - f.write(self.tfliteModel) - - def createXcoreModel(self): - print('Generating xcore model ' + str(self.layerID)) - os.makedirs('./xcore_models', exist_ok = True) - if os.path.exists('./xcore_models/{}.tflite'.format(self.layerID)): - os.system('rm ./xcore_models/{}.tflite'.format(self.layerID)) - xf.convert('./tflite_models/{}.tflite'.format(self.layerID), './xcore_models/{}.tflite'.format(self.layerID), params=None) - - def eveluateTf(self, clampOut): - print('Evaluating TF layer: '+str(self.layerID)) - self.outputs = [] - - for datapoint in self.repDataset: - x = self.tfModel.predict(datapoint[0]) - if clampOut: - self.outputs.append(clamp(self.outQuantize(x.astype(np.float32)))) - else: - self.outputs.append(self.outQuantize(x.astype(np.float32))) - - def modelToOpList(self): - # Update the path to your model - with open('./tflite_models/{}.tflite'.format(self.layerID), "rb") as model_file: - buffer = model_file.read() - - # Get Model - model = Model.GetRootAs(buffer) - self.opList = [] - for y in range(0, model.Subgraphs(0).OperatorsLength()): - opcode = model.OperatorCodes(model.Subgraphs(0).Operators(y).OpcodeIndex()) - if opcode.BuiltinCode() == 32: - self.opList.append(str(opcode.CustomCode()).strip("b'")) - else: - self.opList.append(opcode.BuiltinCode()) - - f = open('./schema.fbs', "r") - lines = f.readlines()[108:238] - for line in lines: - if '/' in line: - lines.remove(line) - for line in lines: - if '/' in line: - lines.remove(line) - for j in range(len(self.opList)): - for line in lines: - split = line.split(' = ') - if str(self.opList[j]) == split[1].strip(',').strip('\n').strip(','): - self.opList[j] = split[0].strip() - break - - def evaluateTflite(self): - print('Evaluating tflite layer: '+str(self.layerID)) - self.tfliteOutputs = [] - interpreter = tf.lite.Interpreter(model_path='./tflite_models/{}.tflite'.format(self.layerID)) - interpreter.allocate_tensors() - out = interpreter.get_output_details()[0] # Model has single output. - inp = interpreter.get_input_details()[0] - interpreter.set_tensor(inp['index'], self.inQuantize(self.Input)) - interpreter.invoke() - self.tfliteRefOutput = self.outDequantize(interpreter.get_tensor(out['index'])) - - for datapoint in self.repDataset: - interpreter.set_tensor(inp['index'], self.inQuantize(datapoint[0])) - interpreter.invoke() - self.tfliteOutputs.append(interpreter.get_tensor(out['index']).astype(np.float32)) - - def evaluateXcore(self): - print('Evaluating xcore layer: '+str(self.layerID)) - self.xcoreOutputs = [] - interpreter = TFLMInterpreter(model_path='./xcore_models/{}.tflite'.format(self.layerID)) - interpreter.set_input_tensor(0, self.inQuantize(self.Input)) - interpreter.invoke() - self.xcoreRefOutput = self.outDequantize(interpreter.get_output_tensor(0)) - - for datapoint in self.repDataset: - interpreter.set_input_tensor(0, self.inQuantize(datapoint[0])) - interpreter.invoke() - self.xcoreOutputs.append(interpreter.get_output_tensor(0).astype(np.float32)) - - def inQuantize(self, data): - interpreter = tf.lite.Interpreter(model_path='./tflite_models/{}.tflite'.format(self.layerID)) - scale, zero_point = interpreter.get_input_details()[0].get('quantization') - return np.round(clamp((data/scale)+zero_point)).astype(np.int8) - - def outQuantize(self, data): - interpreter = tf.lite.Interpreter(model_path='./tflite_models/{}.tflite'.format(self.layerID)) - scale, zero_point = interpreter.get_output_details()[0].get('quantization') - return clamp((data/scale)+zero_point) - - def outDequantize(self, data): - interpreter = tf.lite.Interpreter(model_path='./tflite_models/{}.tflite'.format(self.layerID)) - scale, zero_point = interpreter.get_output_details()[0].get('quantization') - return ((data.astype(np.float32)-zero_point)*scale) - - def calcErrors(self, data1, data2, findError=False): - - print('Calculating {} {} errors for layer: '.format(data1, data2)+str(self.layerID)) - - if data1 == 'tf': - if data2 == 'tflite': - self.tf_tflite_error, self.tf_tflite_abserror, self.tf_tflite_maxabs, self.tf_tflite_mse, self.tf_tflite_hist = calcErrorSet(self.outputs, self.tfliteOutputs, findError) - - elif data2 == 'xcore': - self.tf_xcore_error, self.tf_xcore_abserror, self.tf_xcore_maxabs, self.tf_xcore_mse, self.tf_xcore_hist = calcErrorSet(self.outputs, self.xcoreOutputs, findError) - elif data1 == 'tflite' and data2 == 'xcore': - self.tflite_xcore_error, self.tflite_xcore_abserror, self.tflite_xcore_maxabs, self.tflite_xcore_mse, self.tflite_xcore_hist = calcErrorSet(self.tfliteOutputs, self.xcoreOutputs, findError) - - def errorHists(self): - print('Producing hist for layer {}'.format(self.layerID)) - - hist1 = genHist(self.tf_tflite_hist, self.layerID, 'tf_tflite', self.opList) - hist2 = genHist(self.tf_xcore_hist, self.layerID, 'tf_xcore', self.opList) - hist3 = genHist(self.tflite_xcore_hist, self.layerID, 'tflite_xcore', self.opList) - saveHist(hist1, 'tf_tflite', self.layerID) - saveHist(hist2, 'tf_xcore', self.layerID) - saveHist(hist3, 'tflite_xcore', self.layerID) - plt.close('all') - -def clamp(datapoint): - return np.clip(datapoint, -128, 127) - -def genHist(histogram, layer, hist_type, opList): - fig, ax = plt.subplots() - dim = len(histogram[0]) - xlimit = max(histogram[1][-1], abs(histogram[1][0])) - dimw = (xlimit*2) / (dim*1.5) - ax.bar(histogram[1][:-1], histogram[0], width = dimw, align = 'center') - ax.set_yscale('log') - ax.set_xlabel("Error") - ax.set_ylabel("Frequency") - ax.set_xlim(-xlimit, xlimit) - ax.set_title("{} layer {} Average Error Histogram (ops: {})".format(hist_type, layer, str(opList))) - - return fig - -def saveHist(fig, hist_type, layer): - os.makedirs('./hists', exist_ok = True) - fig.savefig('hists/{}_{}.png'.format(hist_type, layer)) - -def calcErrorSet(out1, out2, findError=False): - samples = len(out1) - - error = 0 - for x1, x2 in zip(out1, out2): - error += x1 - x2 - error = error/samples - error = error.mean() - - abserror = 0 - for x1, x2 in zip(out1, out2): - abserror += abs(x1 - x2) - abserror = abserror/samples - abserror = abserror.mean() - - maxabs = [] - for x1, x2 in zip(out1, out2): - maxabs.append(np.max(abs(x1 - x2))) - maxabs = np.max(maxabs) - - mse = 0 - for x1, x2 in zip(out1, out2): - mse += np.square(x1 - x2) - mse = mse/samples - mse = mse.mean() - - hist = [] - histList = [] - i = 0 - for x1, x2 in zip(out1, out2): - histList.append(list((x1 - x2).flatten())) - histList = list(np.concatenate(histList).flat) - # print(histList) - hist = np.histogram(histList, 40) - - return error, abserror, maxabs, mse, hist - -def mainGraphs(Layers, error_type): - os.makedirs('./graphs', exist_ok = True) - tf_tflite_err = [] - tf_xcore_err = [] - tflite_xcore_err = [] - for layer in Layers: - if error_type == 'average': - tf_tflite_err.append(layer.tf_tflite_error) - tf_xcore_err.append(layer.tf_xcore_error) - tflite_xcore_err.append(layer.tflite_xcore_error) - elif error_type == 'absolute': - tf_tflite_err.append(layer.tf_tflite_abserror) - tf_xcore_err.append(layer.tf_xcore_abserror) - tflite_xcore_err.append(layer.tflite_xcore_abserror) - elif error_type == 'maximum absolute': - tf_tflite_err.append(layer.tf_tflite_maxabs) - tf_xcore_err.append(layer.tf_xcore_maxabs) - tflite_xcore_err.append(layer.tflite_xcore_maxabs) - elif error_type == 'mean squared': - tf_tflite_err.append(layer.tf_tflite_mse) - tf_xcore_err.append(layer.tf_xcore_mse) - tflite_xcore_err.append(layer.tflite_xcore_mse) - - width = 0.35 # the width of the bars - - fig, ax = plt.subplots() - xax = range(0,35) - rects1 = ax.bar(xax, tf_tflite_err, width, label='tf - tflite {}'.format(error_type)) - rects2 = ax.bar([i+width for i in xax], tf_xcore_err, width, label='tf - xcore {}'.format(error_type)) - - # Add some text for labels, title and custom x-axis tick labels, etc. - ax.set_ylabel('Error') - ax.set_xlabel('Layer') - ax.set_title('tf - tflite/xcore {} error'.format(error_type)) - ax.legend() - - fig.tight_layout() - ylim = ax.get_ylim() - fig.savefig('graphs/tf_quant_{}.png'.format(error_type)) - plt.close('all') - - width = 0.7 - fig, ax = plt.subplots() - rects1 = ax.bar(xax, tflite_xcore_err, width, label='tflite - xcore {}'.format(error_type)) - - # Add some text for labels, title and custom x-axis tick labels, etc. - ax.set_ylabel('Error') - ax.set_xlabel('Layer') - ax.set_title('tflite - xcore {} error'.format(error_type)) - ax.legend() - ax.set_ylim(ylim) - fig.tight_layout() - fig.savefig('graphs/tflite_xcore_{}.png'.format(error_type)) - plt.close('all') - -# Generates a Mobilenet V1 TensorFlow model with the supplied parameters -# ret: mobilenetv1 tf model -def generateBaseModel(alpha=0.25, inputDim=224): - model = tf.keras.applications.mobilenet.MobileNet( - alpha=alpha, input_shape=(inputDim, inputDim, 3), weights='imagenet', classes=1000 - ) - return model - -# Loads the image pointed to by 'path', in the form required as input by a tf model -# ret: image as numpy array -def prepare_image(file, dims): - img = image.load_img(file, target_size=(dims, dims)) - img_array = image.img_to_array(img) - img_array_expanded_dims = np.expand_dims(img_array, axis=0) - return img_array_expanded_dims/256.0 - 0.5 - -# Splits the supplied model apart into layers (group bn and relu with conv) -# ret: list of tf models -def tfLayerArtifacts(model): - - layers_as_models = [] - ret_layers_as_models = [] - for i in range(1, len(model.layers)): - # Generate Models for each individual layer - if ("_bn" in model.layers[i].name) or ('_relu' in model.layers[i].name) or ('dropout' in model.layers[i].name): - layers_as_models[-1].add(model.layers[i]) - else: - layer_model = tf.keras.Sequential() - layer_model.add(model.layers[i]) - layers_as_models.append(layer_model) - for layer_mod in layers_as_models: - layer_mod.build(input_shape=layer_mod.layers[0].input_shape) - layer_mod.compile() - ret_layers_as_models.append(layer_mod) - - print('Number of layers: ' + str(len(layers_as_models))) - - Layers = [] - i = 0 - for layer in layers_as_models: - artifact = layerArtifacts(layer, i) - Layers.append(artifact) - i += 1 - - return Layers - -# Generates the outputs from each layer of the base model when image is the initial input -# ret: list of outputs -def referenceOutputs(model, image): - reference_outputs = [] - - part_model = tf.keras.Sequential() - part_model.inputs = model.inputs - - for i in range(1, len(model.layers)): - # Generate reference outputs for each layer - part_model.add(model.layers[i]) - part_model.compile() - if ("conv" in model.layers[i].name) and ('_bn' in model.layers[i+1].name): - pass - elif ("_bn" in model.layers[i].name): - pass - elif("dropout" in model.layers[i].name): - pass - else: - prediction = part_model.predict(image) - reference_outputs.append(prediction) - - return reference_outputs - -def setInputsOutputs(Layers, ref_outputs, im): - for x, out in zip(Layers,ref_outputs): - x.refOutput = out - Layers[0].Input = im - for i in range(1, len(Layers)): - Layers[i].Input = Layers[i-1].refOutput - -def setRepDatasets(Layers, samples): - ds = tfds.load( - 'imagenet_v2', - split = ('test'), - with_info = False, - as_supervised = False - ) - - dataset = [] - for data in ds: - a = data['image'].numpy() - a = tf.image.resize(a, (224, 224)) #q - a = (a.astype(np.float32)/255.0) -0.5 - a = [a.reshape(1, *Layers[0].tfModel.input_shape[1:])] #deq - dataset.append(a) - Layers[0].repDataset = dataset[:samples] - - for i in range(0, len(Layers)-1): - print('generating rep dataset {}'.format(i+1)) - rDataset = [] - for datapoint in Layers[i].repDataset: - res = Layers[i].tfModel.predict(datapoint) - res = [res.reshape(1, *Layers[i+1].tfModel.input_shape[1:])] - rDataset.append(res) - Layers[i+1].repDataset = rDataset - -def saveLayers(Layers, stage): - os.makedirs('./stage0', exist_ok = True) - os.makedirs('./stage1', exist_ok = True) - os.makedirs('./stage2', exist_ok = True) - print('\nSaving Layers...\n') - for Layer in Layers: - with open('./stage{}/{}'.format(stage, Layer.layerID),"wb") as f: - pickle.dump(Layer, f) - f.close() - -def loadLayers(stage): - print('\nLoading Layers...\n') - Layers = [] - - files = [int(x) for x in os.listdir('./stage{}/'.format(stage))] - files.sort() - assert len(files) > 0, "No Layers found to be loaded" - for file in files: - with open('./stage{}/'.format(stage) + str(file),'rb') as f: - layer = pickle.load(f) - - Layers.append(layer) - - return Layers - -def errorSpreadsheet(Layers): - workbook = Workbook() - sheet = workbook.active - sheet["A1"] = "Layer" - sheet["B1"] = "tf - tflite average error" - sheet["C1"] = "tf - tflite average abs error" - sheet["D1"] = "tf - tflite max abs error" - sheet["E1"] = "tf - tflite mse" - sheet["F1"] = "tf - xcore average error" - sheet["G1"] = "tf - xcore average abs error" - sheet["H1"] = "tf - xcore max abs error" - sheet["I1"] = "tf - xcore mse" - sheet["J1"] = "tflite - xcore average error" - sheet["K1"] = "tflite - xcore average abs error" - sheet["L1"] = "tflite - xcore max abs error" - sheet["M1"] = "tflite - xcore mse" - - - for i in range(0, len(Layers)): - sheet["A{}".format(i+2)] = Layers[i].layerID - sheet["B{}".format(i+2)] = Layers[i].tf_tflite_error - sheet["C{}".format(i+2)] = Layers[i].tf_tflite_abserror - sheet["D{}".format(i+2)] = Layers[i].tf_tflite_maxabs - sheet["E{}".format(i+2)] = Layers[i].tf_tflite_mse - sheet["F{}".format(i+2)] = Layers[i].tf_xcore_error - sheet["G{}".format(i+2)] = Layers[i].tf_xcore_abserror - sheet["H{}".format(i+2)] = Layers[i].tf_xcore_maxabs - sheet["I{}".format(i+2)] = Layers[i].tf_xcore_mse - sheet["J{}".format(i+2)] = Layers[i].tflite_xcore_error - sheet["K{}".format(i+2)] = Layers[i].tflite_xcore_abserror - sheet["L{}".format(i+2)] = Layers[i].tflite_xcore_maxabs - sheet["M{}".format(i+2)] = Layers[i].tflite_xcore_mse - - workbook.save("error_results.xlsx") \ No newline at end of file diff --git a/tools/precision profiling/ostrich.png b/tools/precision profiling/ostrich.png deleted file mode 100644 index 6108a5ff6..000000000 Binary files a/tools/precision profiling/ostrich.png and /dev/null differ diff --git a/tools/precision profiling/report/report.html b/tools/precision profiling/report/report.html deleted file mode 100644 index e3ff62751..000000000 --- a/tools/precision profiling/report/report.html +++ /dev/null @@ -1,511 +0,0 @@ - - - - - - -Codestin Search App - - - -
-

Accuracy of Machine Learning Kernals

- -

As the process of optimising a model for the xcore applies a quantisation and -changes the operators used, it is important to measure the precision of this -optimised model to ensure it still meets the required precision.

-

This document will discuss a method for measuring this precision, and comparing -it to that of equivalent tensorflow and tensorflow lite models. For comparison -the model used is a MobileNetV1 model with an Alpha parameter of 0.25, and an -input image dimensionality of 224 x 224 x 3.

-
-

Method

-

The precision of an xcore model is calculated by comparing the results it produces -to that of the equivalent tensorflow and tensorflow lite models. This is done for -every layer in a given model. This process is detailed below.

-
-

Step 1: Generate a tensorflow model

-

The first step is to produce a tensorflow base model from Keras. This model will -be the model that the tflite and xcore models are derived from, and will act as a -precision baseline for comparison.

-

In this case a MobileNetV1 model with an Alpha of 0.25 and a 224x224x3 input image -resolution was generated. Any model that is trained with imagenet weights can be -generated here.

-
-
-

Step 2: Seperate Model by layer

-

The next step is to seperate the tensorflow model up into it's different layers -and create a tensorflow model for each layer. Some layers such as relus, batch norms, -and dropouts are combined with the convolution layer before them as this is really -part of running the convolution and do not make sense on their own.

-
-
-

Step 3: Convert to tensorflow lite

-

Keras has built in functionality for converting Keras tensorflow models into -tensorflow lite models. This process however requires a representative dataset to -be generated for each model.

-

As the model in question is trained with imagenet weights, imagenet_v2 images are -loaded from tensorflow datasets and are used to form a representative dataset for -the input layer (layer 0). In this case a sample of 500 images from imagenet_v2 -was used.

-

A representative dataset is then generated for each subsequent layer. This is -done by using a model made up of the first layer, and every layer up to the target -layer combined. This model is then used to generate predictions for each image -in the original representative dataset, to create a representative dataset of size -500 for each layer.

-

Once each layer has an associated representative datasset, it can be converted to -a tensorflow lite model. This is an intermediary step to converting to an xcore -model, and can be used as a precision comparison.

-
-
-

Step 4: Convert to xcore

-

Finally for each layer, the tensorflow lite model associated can be converted -into an xcore optimised model using the xcore-opt command line tool.

-
-
-

Step 5: Evaluate tensorflow, tensorflow lite and xcore models

-

This stage involves using the representative dataset from each layer, and running -each image through three models associated with that layer to generate 3x500 -outputs. This is done so that we have a large sample of outputs from each model -so that the models can be compared more effecively.

-
-
-
-

Comparison

-

In order to compare the three models, a number of metrics are calculated. These -are calculated between tensorflow and tflite, tensorflow and xcore, and tflite -and xcore models. The metrics calculated are:

-
    -
  • Average Error
  • -
  • Average Absolute Error
  • -
  • Max Absolute Error
  • -
  • Mean Squared Error
  • -
  • A Histogram of Average Errors
  • -
-

For this comparison, the results of the tensorflow model are quantised so -that they can be directly compared with the outputs of the two quantised -models. This quantisation has a range between (-128, 127) for any value.

-

For each error, the first graph contains the metric for tensorflow and -tensorflow lite, plotted along with that for tensorflow and xcore. The -second plot displays the metric for tensorflow lite and xcore.

-
-

Average Error

-

avg1 avg2

-

In terms of average error, for most layers in this model the quantised -models are very similar to the tensorflow model. The error is slightly -higher in layers at the start, and the xcore model has a large error -in layer 29.

-

More interestingly, the xcore and tflite models are almost identical -in this metric, other than in layers 4, 6, and 29 where there are large -divergences.

-
-
-

Average Absolute Error

-

avgabs1 avgabs2

-

With the Average Absolute Error, we see a higher error in a lot of the -layers for the tensorflow comparison, as these errors would have been -hidden postive and negative errors for the previous metric. The tflite and -xcore comparisons with tensorflow here are very simlar, with some -variation around the problem layers identified in the Average Error.

-

The tflite vs xcore comparison shows a similar pattern to Average Error, -with spikes in the same layers, and a higher baseline error throughout.

-
-
-

Maximum Absolute Error

-

maxabs1 maxabs2

-

The Maximum Absolute Error can bring attention to any large element specific -errors that are masked by averages. Here we see that compared to tensorflow, -the tflite and xcore models have idential Max Absolute Error, except for a -small difference in layer 4. Overall these quantised models have -significant Max Errors for each layer, with a big error in layer 30.

-

When comparing the two quantised models directly, we see that for most layers -the Maximum Absolute Error is great with values of 0 or 1. There are 2 layers -that have higher errors however, in layers 6 and 29.

-
-
-

Mean Squared Error

-

mse1 mse2

-

The Mean Squared Error gives us similar results as shown by the Average Absolute -Error. It will suppress the layers with smaller errors, and accentuates the spikes -we saw. When comparing tensorflow to the quantised models, this makes the errors -in layers 6 and 30 stand out. And in the tflite vs xcore graph the differences in -layers 4, 6 and 29 are amplified.

-
-
-

Average Error Histograms

-

There are a large number of histograms produced, as 3 are created per layer. One -for tf - tflite average error, one for tf - xcore, and one for tflite - xcore. -These histograms take all the individual output errors from a layer and place -them in bins of size 0.2 between -2.1 and 2.1. The frequency for each bin is -plotted as a histogram.

-

hist34a hist34b hist34c

-

As there are so many histograms, the final layer will be focused on. In the -first two histograms, displaying errors between the tensorflow model and -the quantised models, the distribution of errors is almost identical. With -a large number of errors around zero, and lots of errors at plus and minus -1. There is also a cluster of errors in the -2 region. The tflite - xcore -histogram however shows very few large errors, with most elements having -an error inthe -0.1 - 0.1 region, with a small number of errors around -the -1 region.

-

If we then plot the histograms of the layers that displayed higher errors -in earlier graphs, 4, 6, and 29.

-

hist4a hist4b hist4c

-

hist6a hist6b hist6c

-

hist29a hist29b hist29c

-
-
-
- - diff --git a/tools/precision profiling/requirements.txt b/tools/precision profiling/requirements.txt deleted file mode 100644 index ffc1c6d7d..000000000 --- a/tools/precision profiling/requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -tensorflow -tensorflow-datasets -keras -pickle-mixin -numpy -prettyprinter -Pillow -../../third_party/lib_tflite_micro/tflm_interpreter -openpyxl -matplotlib \ No newline at end of file diff --git a/tools/precision profiling/schema.fbs b/tools/precision profiling/schema.fbs deleted file mode 100644 index 5e2f9c477..000000000 --- a/tools/precision profiling/schema.fbs +++ /dev/null @@ -1,940 +0,0 @@ -// Copyright 2017 The TensorFlow Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Revision History -// Version 0: Initial version. -// Version 1: Add subgraphs to schema. -// Version 2: Rename operators to conform to NN API. -// Version 3: Move buffer data from Model.Subgraph.Tensors to Model.Buffers. - -namespace tflite; - -// This corresponds to the version. -file_identifier "TFL3"; -// File extension of any written files. -file_extension "tflite"; - -// IMPORTANT: All new members of tables, enums and unions must be added at the -// end to ensure backwards compatibility. - -// The type of data stored in a tensor. -enum TensorType : byte { - FLOAT32 = 0, - FLOAT16 = 1, - INT32 = 2, - UINT8 = 3, - INT64 = 4, - STRING = 5, - BOOL = 6, - INT16 = 7, - COMPLEX64 = 8, - INT8 = 9, -} - -// Custom quantization parameters for experimenting with new quantization -// techniques. -table CustomQuantization { - custom:[ubyte] (force_align: 16); -} - -// Represents a specific quantization technique's parameters. -union QuantizationDetails { - CustomQuantization, -} - -// Parameters for converting a quantized tensor back to float. -table QuantizationParameters { - // These four parameters are the asymmetric linear quantization parameters. - // Given a quantized value q, the corresponding float value f should be: - // f = scale * (q - zero_point) - // For other quantization types, the QuantizationDetails below is used. - min:[float]; // For importing back into tensorflow. - max:[float]; // For importing back into tensorflow. - scale:[float]; // For dequantizing the tensor's values. - zero_point:[long]; - - // If this is not none, the other quantization parameters (i.e. min, max, - // scale, zero_point fields above) are ignored and the value of the - // QuantizationDetails union should be used. - details:QuantizationDetails; - - // Specifies the dimension of the Tensor's shape that the scales and - // zero_points correspond to. For example, a tensor t, with dims=[4, 3, 2, 1] - // with quantization params: - // scale=[1.0, 2.0, 3.0], zero_point=[1, 2, 3], quantization_dimension=1 - // will be quantized across the second dimension of t. - // t[:, 0, :, :] will have scale[0]=1.0, zero_point[0]=1 - // t[:, 1, :, :] will have scale[1]=2.0, zero_point[0]=2 - // t[:, 2, :, :] will have scale[2]=3.0, zero_point[0]=3 - quantized_dimension:int; -} - -table Tensor { - // The tensor shape. The meaning of each entry is operator-specific but - // builtin ops use: [batch size, height, width, number of channels] (That's - // Tensorflow's NHWC). - shape:[int]; - type:TensorType; - // An index that refers to the buffers table at the root of the model. Or, - // if there is no data buffer associated (i.e. intermediate results), then - // this is 0 (which refers to an always existent empty buffer). - // - // The data_buffer itself is an opaque container, with the assumption that the - // target device is little-endian. In addition, all builtin operators assume - // the memory is ordered such that if `shape` is [4, 3, 2], then index - // [i, j, k] maps to data_buffer[i*3*2 + j*2 + k]. - buffer:uint; - name:string; // For debugging and importing back into tensorflow. - quantization:QuantizationParameters; // Optional. - - is_variable:bool = false; -} - -// A list of builtin operators. Builtin operators are slightly faster than custom -// ones, but not by much. Moreover, while custom operators accept an opaque -// object containing configuration parameters, builtins have a predetermined -// set of acceptable options. -enum BuiltinOperator : byte { - ADD = 0, - AVERAGE_POOL_2D = 1, - CONCATENATION = 2, - CONV_2D = 3, - DEPTHWISE_CONV_2D = 4, - DEPTH_TO_SPACE = 5, - DEQUANTIZE = 6, - EMBEDDING_LOOKUP = 7, - FLOOR = 8, - FULLY_CONNECTED = 9, - HASHTABLE_LOOKUP = 10, - L2_NORMALIZATION = 11, - L2_POOL_2D = 12, - LOCAL_RESPONSE_NORMALIZATION = 13, - LOGISTIC = 14, - LSH_PROJECTION = 15, - LSTM = 16, - MAX_POOL_2D = 17, - MUL = 18, - RELU = 19, - // NOTE(aselle): RELU_N1_TO_1 used to be called RELU1, but it was renamed - // since different model developers use RELU1 in different ways. Never - // create another op called RELU1. - RELU_N1_TO_1 = 20, - RELU6 = 21, - RESHAPE = 22, - RESIZE_BILINEAR = 23, - RNN = 24, - SOFTMAX = 25, - SPACE_TO_DEPTH = 26, - SVDF = 27, - TANH = 28, - // TODO(aselle): Consider rename to CONCATENATE_EMBEDDINGS - CONCAT_EMBEDDINGS = 29, - SKIP_GRAM = 30, - CALL = 31, - CUSTOM = 32, - EMBEDDING_LOOKUP_SPARSE = 33, - PAD = 34, - UNIDIRECTIONAL_SEQUENCE_RNN = 35, - GATHER = 36, - BATCH_TO_SPACE_ND = 37, - SPACE_TO_BATCH_ND = 38, - TRANSPOSE = 39, - MEAN = 40, - SUB = 41, - DIV = 42, - SQUEEZE = 43, - UNIDIRECTIONAL_SEQUENCE_LSTM = 44, - STRIDED_SLICE = 45, - BIDIRECTIONAL_SEQUENCE_RNN = 46, - EXP = 47, - TOPK_V2 = 48, - SPLIT = 49, - LOG_SOFTMAX = 50, - // DELEGATE is a special op type for the operations which are delegated to - // other backends. - // WARNING: Experimental interface, subject to change - DELEGATE = 51, - BIDIRECTIONAL_SEQUENCE_LSTM = 52, - CAST = 53, - PRELU = 54, - MAXIMUM = 55, - ARG_MAX = 56, - MINIMUM = 57, - LESS = 58, - NEG = 59, - PADV2 = 60, - GREATER = 61, - GREATER_EQUAL = 62, - LESS_EQUAL = 63, - SELECT = 64, - SLICE = 65, - SIN = 66, - TRANSPOSE_CONV = 67, - SPARSE_TO_DENSE = 68, - TILE = 69, - EXPAND_DIMS = 70, - EQUAL = 71, - NOT_EQUAL = 72, - LOG = 73, - SUM = 74, - SQRT = 75, - RSQRT = 76, - SHAPE = 77, - POW = 78, - ARG_MIN = 79, - FAKE_QUANT = 80, - REDUCE_PROD = 81, - REDUCE_MAX = 82, - PACK = 83, - LOGICAL_OR = 84, - ONE_HOT = 85, - LOGICAL_AND = 86, - LOGICAL_NOT = 87, - UNPACK = 88, - REDUCE_MIN = 89, - FLOOR_DIV = 90, - REDUCE_ANY = 91, - SQUARE = 92, - ZEROS_LIKE = 93, - FILL = 94, - FLOOR_MOD = 95, - RANGE = 96, - RESIZE_NEAREST_NEIGHBOR = 97, - LEAKY_RELU = 98, - SQUARED_DIFFERENCE = 99, - MIRROR_PAD = 100, - ABS = 101, - SPLIT_V = 102, - UNIQUE = 103, - CEIL = 104, - REVERSE_V2 = 105, - ADD_N = 106, - GATHER_ND = 107, - COS = 108, - WHERE = 109, - RANK = 110, - ELU = 111, - REVERSE_SEQUENCE = 112, - MATRIX_DIAG = 113, - QUANTIZE = 114, - MATRIX_SET_DIAG = 115, - ROUND = 116, - HARD_SWISH = 117, - IF = 118, - WHILE = 119, - NON_MAX_SUPPRESSION_V4 = 120, - NON_MAX_SUPPRESSION_V5 = 121, - SCATTER_ND = 122 -} - -// Options for the builtin operators. -union BuiltinOptions { - Conv2DOptions, - DepthwiseConv2DOptions, - ConcatEmbeddingsOptions, - LSHProjectionOptions, - Pool2DOptions, - SVDFOptions, - RNNOptions, - FullyConnectedOptions, - SoftmaxOptions, - ConcatenationOptions, - AddOptions, - L2NormOptions, - LocalResponseNormalizationOptions, - LSTMOptions, - ResizeBilinearOptions, - CallOptions, - ReshapeOptions, - SkipGramOptions, - SpaceToDepthOptions, - EmbeddingLookupSparseOptions, - MulOptions, - PadOptions, - GatherOptions, - BatchToSpaceNDOptions, - SpaceToBatchNDOptions, - TransposeOptions, - ReducerOptions, - SubOptions, - DivOptions, - SqueezeOptions, - SequenceRNNOptions, - StridedSliceOptions, - ExpOptions, - TopKV2Options, - SplitOptions, - LogSoftmaxOptions, - CastOptions, - DequantizeOptions, - MaximumMinimumOptions, - ArgMaxOptions, - LessOptions, - NegOptions, - PadV2Options, - GreaterOptions, - GreaterEqualOptions, - LessEqualOptions, - SelectOptions, - SliceOptions, - TransposeConvOptions, - SparseToDenseOptions, - TileOptions, - ExpandDimsOptions, - EqualOptions, - NotEqualOptions, - ShapeOptions, - PowOptions, - ArgMinOptions, - FakeQuantOptions, - PackOptions, - LogicalOrOptions, - OneHotOptions, - LogicalAndOptions, - LogicalNotOptions, - UnpackOptions, - FloorDivOptions, - SquareOptions, - ZerosLikeOptions, - FillOptions, - BidirectionalSequenceLSTMOptions, - BidirectionalSequenceRNNOptions, - UnidirectionalSequenceLSTMOptions, - FloorModOptions, - RangeOptions, - ResizeNearestNeighborOptions, - LeakyReluOptions, - SquaredDifferenceOptions, - MirrorPadOptions, - AbsOptions, - SplitVOptions, - UniqueOptions, - ReverseV2Options, - AddNOptions, - GatherNdOptions, - CosOptions, - WhereOptions, - RankOptions, - ReverseSequenceOptions, - MatrixDiagOptions, - QuantizeOptions, - MatrixSetDiagOptions, - HardSwishOptions, - IfOptions, - WhileOptions, - DepthToSpaceOptions, - NonMaxSuppressionV4Options, - NonMaxSuppressionV5Options, - ScatterNdOptions -} - -enum Padding : byte { SAME, VALID } - -enum ActivationFunctionType : byte { - NONE = 0, - RELU = 1, - RELU_N1_TO_1 = 2, - RELU6 = 3, - TANH = 4, - SIGN_BIT = 5, -} - -table Conv2DOptions { - padding:Padding; - stride_w:int; - stride_h:int; - fused_activation_function:ActivationFunctionType; - dilation_w_factor:int = 1; - dilation_h_factor:int = 1; -} - -table Pool2DOptions { - padding:Padding; - stride_w:int; - stride_h:int; - filter_width:int; - filter_height:int; - fused_activation_function:ActivationFunctionType; -} - -table DepthwiseConv2DOptions { - // Parameters for DepthwiseConv version 1 or above. - padding:Padding; - stride_w:int; - stride_h:int; - // `depth_multiplier` is redundant. It's used by CPU kernels in - // TensorFlow 2.0 or below, but ignored in versions above. - // See comments in lite/c/builtin_op_data.h for more details. - depth_multiplier:int; - fused_activation_function:ActivationFunctionType; - // Parameters for DepthwiseConv version 2 or above. - dilation_w_factor:int = 1; - dilation_h_factor:int = 1; -} - -table ConcatEmbeddingsOptions { - num_channels:int; - num_columns_per_channel:[int]; - embedding_dim_per_channel:[int]; // This could be inferred from parameters. -} - -enum LSHProjectionType: byte { - UNKNOWN = 0, - SPARSE = 1, - DENSE = 2, -} - -table LSHProjectionOptions { - type: LSHProjectionType; -} - -table SVDFOptions { - rank:int; - fused_activation_function:ActivationFunctionType; -} - -// An implementation of TensorFlow RNNCell. -table RNNOptions { - fused_activation_function:ActivationFunctionType; -} - -// An implementation of TensorFlow dynamic_rnn with RNNCell. -table SequenceRNNOptions { - time_major:bool; - fused_activation_function:ActivationFunctionType; -} - -// An implementation of TensorFlow bidrectional_dynamic_rnn with RNNCell. -table BidirectionalSequenceRNNOptions { - time_major:bool; - fused_activation_function:ActivationFunctionType; - merge_outputs: bool; -} - -enum FullyConnectedOptionsWeightsFormat: byte { - DEFAULT = 0, - SHUFFLED4x16INT8 = 1, -} - -// An implementation of TensorFlow fully_connected (a.k.a Dense) layer. -table FullyConnectedOptions { - // Parameters for FullyConnected version 1 or above. - fused_activation_function:ActivationFunctionType; - - // Parameters for FullyConnected version 2 or above. - weights_format:FullyConnectedOptionsWeightsFormat = DEFAULT; - - // Parameters for FullyConnected version 5 or above. - // If set to true, then the number of dimension is preserved. Furthermore, - // all but the last dimension of the input and output shapes will be equal. - keep_num_dims: bool; -} - -table SoftmaxOptions { - beta: float; -} - -// An implementation of TensorFlow concat. -table ConcatenationOptions { - axis:int; - fused_activation_function:ActivationFunctionType; -} - -table AddOptions { - fused_activation_function:ActivationFunctionType; -} - -table MulOptions { - fused_activation_function:ActivationFunctionType; -} - -table L2NormOptions { - fused_activation_function:ActivationFunctionType; -} - -table LocalResponseNormalizationOptions { - radius:int; - bias:float; - alpha:float; - beta:float; -} - -enum LSTMKernelType : byte { - // Full LSTM kernel which supports peephole and projection. - FULL = 0, - // Basic LSTM kernels. Equivalent to TensorFlow BasicLSTMCell. - BASIC = 1, -} - -// An implementation of TensorFlow LSTMCell and CoupledInputForgetGateLSTMCell -table LSTMOptions { - // Parameters for LSTM version 1 or above. - fused_activation_function:ActivationFunctionType; - cell_clip: float; // Optional, 0.0 means no clipping - proj_clip: float; // Optional, 0.0 means no clipping - - // Parameters for LSTM version 2 or above. - // Basic kernel is only supported in version 2 or above. - kernel_type: LSTMKernelType = FULL; -} - -// An implementation of TensorFlow dynamic_rnn with LSTMCell. -table UnidirectionalSequenceLSTMOptions { - fused_activation_function:ActivationFunctionType; - cell_clip: float; // Optional, 0.0 means no clipping - proj_clip: float; // Optional, 0.0 means no clipping - - // If true then first dimension is sequence, otherwise batch. - time_major:bool; -} - -table BidirectionalSequenceLSTMOptions { - // Parameters supported by version 1: - fused_activation_function:ActivationFunctionType; - cell_clip: float; // Optional, 0.0 means no clipping - proj_clip: float; // Optional, 0.0 means no clipping - - // If true, store the outputs of both directions into the first output. - merge_outputs: bool; - - // Parameters supported by version 2: - // If true then first dimension is sequence, otherwise batch. - // Version 1 implementations assumed time_major to be true, so this default - // value should never change. - time_major: bool = true; -} - -table ResizeBilinearOptions { - new_height: int (deprecated); - new_width: int (deprecated); - align_corners: bool; -} - -table ResizeNearestNeighborOptions { - align_corners: bool; -} - -// A call operation options -table CallOptions { - // The subgraph index that needs to be called. - subgraph:uint; -} - -table PadOptions { -} - -table PadV2Options { -} - -table ReshapeOptions { - new_shape:[int]; -} - -table SpaceToBatchNDOptions { -} - -table BatchToSpaceNDOptions { -} - -table SkipGramOptions { - ngram_size: int; - max_skip_size: int; - include_all_ngrams: bool; -} - -table SpaceToDepthOptions { - block_size: int; -} - -table DepthToSpaceOptions { - block_size: int; -} - -table SubOptions { - fused_activation_function:ActivationFunctionType; -} - -table DivOptions { - fused_activation_function:ActivationFunctionType; -} - -table TopKV2Options { -} - -enum CombinerType : byte { - SUM = 0, - MEAN = 1, - SQRTN = 2, -} - -table EmbeddingLookupSparseOptions { - combiner:CombinerType; -} - -table GatherOptions { - axis: int; -} - -table TransposeOptions { -} - -table ExpOptions { -} - -table CosOptions { -} - -table ReducerOptions { - keep_dims: bool; -} - -table SqueezeOptions { - squeeze_dims:[int]; -} - -table SplitOptions { - num_splits: int; -} - -table SplitVOptions { - num_splits: int; -} - -table StridedSliceOptions { - begin_mask: int; - end_mask: int; - ellipsis_mask: int; - new_axis_mask: int; - shrink_axis_mask: int; -} - -table LogSoftmaxOptions { -} - -table CastOptions { - in_data_type: TensorType; - out_data_type: TensorType; -} - -table DequantizeOptions { -} - -table MaximumMinimumOptions { -} - -table TileOptions { -} - -table ArgMaxOptions { - output_type : TensorType; -} - -table ArgMinOptions { - output_type : TensorType; -} - -table GreaterOptions { -} - -table GreaterEqualOptions { -} - -table LessOptions { -} - -table LessEqualOptions { -} - -table NegOptions { -} - -table SelectOptions { -} - -table SliceOptions { -} - -table TransposeConvOptions { - padding:Padding; - stride_w:int; - stride_h:int; -} - -table ExpandDimsOptions { -} - -table SparseToDenseOptions { - validate_indices:bool; -} - -table EqualOptions { -} - -table NotEqualOptions { -} - -table ShapeOptions { - // Optional output type of the operation (int32 or int64). Defaults to int32. - out_type : TensorType; -} - -table RankOptions { -} - -table PowOptions { -} - -table FakeQuantOptions { - // Parameters supported by version 1: - min:float; - max:float; - num_bits:int; - - // Parameters supported by version 2: - narrow_range:bool; -} - -table PackOptions { - values_count:int; - axis:int; -} - -table LogicalOrOptions { -} - -table OneHotOptions { - axis:int; -} - -table AbsOptions { -} - - -table HardSwishOptions { -} - -table LogicalAndOptions { -} - -table LogicalNotOptions { -} - -table UnpackOptions { - num:int; - axis:int; -} - -table FloorDivOptions { -} - -table SquareOptions { -} - -table ZerosLikeOptions { -} - -table FillOptions { -} - -table FloorModOptions { -} - -table RangeOptions { -} - -table LeakyReluOptions { - alpha:float; -} - -table SquaredDifferenceOptions { -} - -enum MirrorPadMode : byte { - // Doesn't include borders. - REFLECT = 0, - // Includes borders. - SYMMETRIC = 1, -} - -table MirrorPadOptions { - mode:MirrorPadMode; -} - -table UniqueOptions { - idx_out_type:TensorType = INT32; -} - -table ReverseV2Options { -} - -table AddNOptions { -} - -table GatherNdOptions { -} - -table WhereOptions { -} - -table ReverseSequenceOptions { - seq_dim:int; - batch_dim:int = 0; -} - -table MatrixDiagOptions { -} - -table QuantizeOptions { -} - -table MatrixSetDiagOptions { -} - -table IfOptions { - then_subgraph_index:int; - else_subgraph_index:int; -} - -table WhileOptions { - cond_subgraph_index:int; - body_subgraph_index:int; -} - -table NonMaxSuppressionV4Options { -} - -table NonMaxSuppressionV5Options { -} - -table ScatterNdOptions { -} - -// An OperatorCode can be an enum value (BuiltinOperator) if the operator is a -// builtin, or a string if the operator is custom. -table OperatorCode { - builtin_code:BuiltinOperator; - custom_code:string; - - // The version of the operator. The version need to be bumped whenever new - // parameters are introduced into an op. - version:int = 1; -} - -enum CustomOptionsFormat : byte { - FLEXBUFFERS = 0, -} - -// An operator takes tensors as inputs and outputs. The type of operation being -// performed is determined by an index into the list of valid OperatorCodes, -// while the specifics of each operations is configured using builtin_options -// or custom_options. -table Operator { - // Index into the operator_codes array. Using an integer here avoids - // complicate map lookups. - opcode_index:uint; - - // Optional input and output tensors are indicated by -1. - inputs:[int]; - outputs:[int]; - - builtin_options:BuiltinOptions; - custom_options:[ubyte]; - custom_options_format:CustomOptionsFormat; - - // A list of booleans indicating the input tensors which are being mutated by - // this operator.(e.g. used by RNN and LSTM). - // For example, if the "inputs" array refers to 5 tensors and the second and - // fifth are mutable variables, then this list will contain - // [false, true, false, false, true]. - // - // If the list is empty, no variable is mutated in this operator. - // The list either has the same length as `inputs`, or is empty. - mutating_variable_inputs:[bool]; - - // A list of indices to the subgraph's "tensors" that are internal to an Op. - // Internal tensors are those that do not flow in or out of the operation, - // but instead are part of internal computation. As such, the operation's - // implementation may manage its memory more efficiently. They are needed - // however (i.e. not just an implementation detail) since they are part of the - // computation, which may require relevant metadata such as quantization - // parameters. - intermediates:[int]; -} - -// The root type, defining a subgraph, which typically represents an entire -// model. -table SubGraph { - // A list of all tensors used in this subgraph. - tensors:[Tensor]; - - // Indices of the tensors that are inputs into this subgraph. Note this is - // the list of non-static tensors that feed into the subgraph for inference. - inputs:[int]; - - // Indices of the tensors that are outputs out of this subgraph. Note this is - // the list of output tensors that are considered the product of the - // subgraph's inference. - outputs:[int]; - - // All operators, in execution order. - operators:[Operator]; - - // Name of this subgraph (used for debugging). - name:string; -} - -// Table of raw data buffers (used for constant tensors). Referenced by tensors -// by index. The generous alignment accommodates mmap-friendly data structures. -table Buffer { - data:[ubyte] (force_align: 16); -} - -table Metadata { - // A human readable string to uniquely identify a Metadata. - name:string; - // An index to the buffers table. - buffer:uint; -} - -table Model { - // Version of the schema. - version:uint; - - // A list of all operator codes used in this model. This is - // kept in order because operators carry an index into this - // vector. - operator_codes:[OperatorCode]; - - // All the subgraphs of the model. The 0th is assumed to be the main - // model. - subgraphs:[SubGraph]; - - // A description of the model. - description:string; - - // Buffers of the model. - // Note the 0th entry of this array must be an empty buffer (sentinel). - // This is a convention so that tensors without a buffer can provide 0 as - // their buffer. - buffers:[Buffer]; - - // Metadata about the model. Indirects into the existings buffers list. - // Deprecated, prefer to use metadata field. - metadata_buffer:[int]; - - // Metadata about the model. - metadata:[Metadata]; -} - -root_type Model; \ No newline at end of file diff --git a/utils/lib_flexbuffers/CMakeLists.txt b/utils/lib_flexbuffers/CMakeLists.txt deleted file mode 100644 index f8af7a33c..000000000 --- a/utils/lib_flexbuffers/CMakeLists.txt +++ /dev/null @@ -1,49 +0,0 @@ -cmake_minimum_required(VERSION 3.14) - -project(libflexbuffers VERSION 1.0.1) - -# This variable is ignored on platforms other than Apple -set(CMAKE_OSX_SYSROOT /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk) - -#********************** -# Paths -#********************** - -set(AI_TOOLS_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../..") - -#********************** -# Build flags -#********************** -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_C_FLAGS "-std=c99") - -#********************** -# Build shared library -#********************** - -add_library(libflexbuffers SHARED) -set_target_properties(libflexbuffers PROPERTIES VERSION ${PROJECT_VERSION}) -set_target_properties(libflexbuffers PROPERTIES PREFIX "") -target_link_libraries(libflexbuffers stdc++ m) - - -target_sources(libflexbuffers - PRIVATE "${AI_TOOLS_ROOT_DIR}/third_party/flatbuffers/src/util.cpp" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src/flexbuffer_helpers.cpp" -) - -target_include_directories(libflexbuffers - PRIVATE "${AI_TOOLS_ROOT_DIR}/third_party/flatbuffers/include" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" -) - -if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - set(INSTALL_DIR "${PROJECT_SOURCE_DIR}/../../tflite2xcore/tflite2xcore/libs/linux") -elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - set(INSTALL_DIR "${PROJECT_SOURCE_DIR}/../../tflite2xcore/tflite2xcore/libs/macos") -else() # must be Windows - set(INSTALL_DIR "${PROJECT_SOURCE_DIR}/../../tflite2xcore/tflite2xcore/libs/windows") -endif() - -install(TARGETS libflexbuffers DESTINATION ${INSTALL_DIR}) diff --git a/utils/lib_flexbuffers/README.md b/utils/lib_flexbuffers/README.md deleted file mode 100644 index 4852b5a6d..000000000 --- a/utils/lib_flexbuffers/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# XCORE Flexbuffer Python Bindings - -This project contains Python bindings for a subset of the Flexbuffer classes. This subset is used to serialize model custom options using the Flexbuffer format. - -## Building - -Install CMake version 3.14 or newer (https://cmake.org/download/). - -Modify your path to include the CMake binaries. Run the CMake application and -click Tools...How to Install For Command Line Use. - -Make a directory for the build - - > mkdir build - > cd build - -Run cmake - - > cmake ../ - > make - -To install - - > make install diff --git a/utils/lib_flexbuffers/build.sh b/utils/lib_flexbuffers/build.sh deleted file mode 100755 index ab23399b7..000000000 --- a/utils/lib_flexbuffers/build.sh +++ /dev/null @@ -1,11 +0,0 @@ -set -e - -echo "****************************" -echo "* Building lib_flexbuffers" -echo "****************************" - -mkdir -p build -cd build -cmake ../ -make install -cd .. diff --git a/utils/lib_flexbuffers/src/flexbuffer_helpers.cpp b/utils/lib_flexbuffers/src/flexbuffer_helpers.cpp deleted file mode 100644 index 0361bf961..000000000 --- a/utils/lib_flexbuffers/src/flexbuffer_helpers.cpp +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2020-2021 XMOS LIMITED. -// This Software is subject to the terms of the XMOS Public Licence: Version 1. -#include -#include - -#include "flatbuffers/flexbuffers.h" - -extern "C" { -// ************************ -// flexbuffers::Builder API -// see -// https://github.com/google/flatbuffers/blob/master/include/flatbuffers/flexbuffers.h -// see: https://google.github.io/flatbuffers/flexbuffers.html -// ************************ - -flexbuffers::Builder* new_builder() { return new flexbuffers::Builder(); } - -size_t builder_start_map(flexbuffers::Builder* fbb, const char* key = nullptr) { - if (key) - return fbb->StartMap(key); - else - return fbb->StartMap(); -} - -size_t builder_end_map(flexbuffers::Builder* fbb, size_t size) { - return fbb->EndMap(size); -} - -size_t builder_start_vector(flexbuffers::Builder* fbb, - const char* key = nullptr) { - if (key) - return fbb->StartVector(key); - else - return fbb->StartVector(); -} - -size_t builder_end_vector(flexbuffers::Builder* fbb, size_t size, bool typed, - bool fixed) { - return fbb->EndVector(size, typed, fixed); -} - -void builder_clear(flexbuffers::Builder* fbb) { fbb->Clear(); } - -void builder_int(flexbuffers::Builder* fbb, const char* key, int64_t val) { - fbb->Int(key, val); -} - -void builder_vector_int(flexbuffers::Builder* fbb, int64_t val) { - fbb->Int(val); -} - -void builder_uint(flexbuffers::Builder* fbb, const char* key, uint64_t val) { - fbb->UInt(key, val); -} - -void builder_vector_uint(flexbuffers::Builder* fbb, uint64_t val) { - fbb->UInt(val); -} - -void builder_bool(flexbuffers::Builder* fbb, const char* key, bool val) { - fbb->Bool(key, val); -} - -void builder_vector_bool(flexbuffers::Builder* fbb, bool val) { - fbb->Bool(val); -} - -void builder_float(flexbuffers::Builder* fbb, const char* key, float val) { - fbb->Float(key, val); -} - -void builder_vector_float(flexbuffers::Builder* fbb, float val) { - fbb->Float(val); -} - -void builder_string(flexbuffers::Builder* fbb, const char* key, - const char* val) { - fbb->String(key, val); -} - -void builder_vector_string(flexbuffers::Builder* fbb, const char* val) { - fbb->String(val); -} - -void builder_finish(flexbuffers::Builder* fbb) { fbb->Finish(); } - -size_t builder_get_buffer(flexbuffers::Builder* fbb, char* buf) { - std::vector bytes = fbb->GetBuffer(); - - for (std::size_t i = 0; i < bytes.size(); ++i) { - buf[i] = bytes[i]; - } - - return bytes.size(); -} - -size_t parse_flexbuffer(const uint8_t* fb, size_t size, char* buf) { - std::vector bytes(fb, fb + size); - std::string json; - - flexbuffers::GetRoot(bytes).ToString(true, true, json); - strncpy(buf, json.c_str(), json.length()); - - return json.length(); -} - -} // extern "C" diff --git a/xformer/.bazelrc b/xformer/.bazelrc new file mode 100644 index 000000000..b795948e4 --- /dev/null +++ b/xformer/.bazelrc @@ -0,0 +1,132 @@ +# We depend on headers from tflite-micro and lib_tflite_micro which +# have not been explicitly specified as bazel dependencies +# The standalone spawn_strategy simply symlinks to the local repos, +# so all files are available +build --spawn_strategy=standalone + +# Needed for tensorflow +build --experimental_repo_remote_exec + +# Disable visibility checks (works around some private deps in TensorFlow) +build --nocheck_visibility + +build --features=-force_no_whole_archive + +# Auto pick OS-specific config +build --enable_platform_specific_config + +# Default define for SETUPTOOLS_SCM_VERSION +# Use --define SETUPTOOLS_SCM_VERSION=$(python -m setuptools_scm -c ../python/pyproject.toml) +build --define SETUPTOOLS_SCM_VERSION="Not_built_with_version_info!" + +# Avoid hitting command line argument limit +build:macos --features=archive_param_file + +# C++17 standard version is required. +build:linux --cxxopt=-std=c++17 +build:linux --host_cxxopt=-std=c++17 +build:macos --cxxopt=-std=c++17 +build:macos --host_cxxopt=-std=c++17 +build:windows --cxxopt=/std:c++17 +build:windows --host_cxxopt=/std:c++17 + +# Suppress C++ compiler warnings, otherwise build logs become 10s of MBs. +build:linux --copt=-w +build:linux --host_copt=-w +build:macos --copt=-w +build:windows --copt=/W0 + +# Tensorflow uses M_* math constants that only get defined by MSVC headers if +# _USE_MATH_DEFINES is defined. +build:windows --copt=/D_USE_MATH_DEFINES +build:windows --host_copt=/D_USE_MATH_DEFINES + +# Make sure to include as little of windows.h as possible +build:windows --copt=-DWIN32_LEAN_AND_MEAN +build:windows --host_copt=-DWIN32_LEAN_AND_MEAN +build:windows --copt=-DNOGDI +build:windows --host_copt=-DNOGDI + +# On Windows, `__cplusplus` is wrongly defined without this switch +# See https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +build:windows --copt=/Zc:__cplusplus +build:windows --host_copt=/Zc:__cplusplus + +# Speed Windows compile times. Available in VS 16.4 (we are on 16.11). See +# https://groups.google.com/a/tensorflow.org/d/topic/build/SsW98Eo7l3o/discussion +build:windows --copt=/d2ReducedOptimizeHugeFunctions +build:windows --host_copt=/d2ReducedOptimizeHugeFunctions + +# MSVC (Windows): Standards-conformant preprocessor mode +# See https://docs.microsoft.com/en-us/cpp/preprocessor/preprocessor-experimental-overview +build:windows --copt=/Zc:preprocessor +build:windows --host_copt=/Zc:preprocessor + +# Misc build options we need for windows. +build:windows --linkopt=/DEBUG +build:windows --host_linkopt=/DEBUG +build:windows --linkopt=/OPT:REF +build:windows --host_linkopt=/OPT:REF +build:windows --linkopt=/OPT:ICF +build:windows --host_linkopt=/OPT:ICF + +# Verbose failure logs when something goes wrong +build:windows --verbose_failures + +# Work around potential issues with large command lines on windows. +# See: https://github.com/bazelbuild/bazel/issues/5163 +build:windows --features=compiler_param_file +build:windows --features=archive_param_file + +build:windows --enable_runfiles + +# Link with these libs only on macos +build:macos --linkopt=-framework +build:macos --linkopt=Foundation +build:macos --linkopt=-framework +build:macos --linkopt=SystemConfiguration + +# Exclude TFRT integration for anything but Linux. +build:macos --config=no_tfrt +build:windows --config=no_tfrt +build:no_tfrt --deleted_packages=tensorflow/compiler/mlir/tfrt,tensorflow/compiler/mlir/tfrt/benchmarks,tensorflow/compiler/mlir/tfrt/ir,tensorflow/compiler/mlir/tfrt/ir/mlrt,tensorflow/compiler/mlir/tfrt/jit/python_binding,tensorflow/compiler/mlir/tfrt/jit/transforms,tensorflow/compiler/mlir/tfrt/python_tests,tensorflow/compiler/mlir/tfrt/tests,tensorflow/compiler/mlir/tfrt/tests/mlrt,tensorflow/compiler/mlir/tfrt/tests/ir,tensorflow/compiler/mlir/tfrt/tests/analysis,tensorflow/compiler/mlir/tfrt/tests/jit,tensorflow/compiler/mlir/tfrt/tests/lhlo_to_tfrt,tensorflow/compiler/mlir/tfrt/tests/lhlo_to_jitrt,tensorflow/compiler/mlir/tfrt/tests/tf_to_corert,tensorflow/compiler/mlir/tfrt/tests/tf_to_tfrt_data,tensorflow/compiler/mlir/tfrt/tests/saved_model,tensorflow/compiler/mlir/tfrt/transforms/lhlo_gpu_to_tfrt_gpu,tensorflow/compiler/mlir/tfrt/transforms/mlrt,tensorflow/core/runtime_fallback,tensorflow/core/runtime_fallback/conversion,tensorflow/core/runtime_fallback/kernel,tensorflow/core/runtime_fallback/opdefs,tensorflow/core/runtime_fallback/runtime,tensorflow/core/runtime_fallback/util,tensorflow/core/runtime_fallback/test,tensorflow/core/runtime_fallback/test/gpu,tensorflow/core/runtime_fallback/test/saved_model,tensorflow/core/runtime_fallback/test/testdata,tensorflow/core/tfrt/stubs,tensorflow/core/tfrt/tfrt_session,tensorflow/core/tfrt/mlrt,tensorflow/core/tfrt/mlrt/attribute,tensorflow/core/tfrt/mlrt/kernel,tensorflow/core/tfrt/mlrt/bytecode,tensorflow/core/tfrt/mlrt/interpreter,tensorflow/compiler/mlir/tfrt/translate/mlrt,tensorflow/compiler/mlir/tfrt/translate/mlrt/testdata,tensorflow/core/tfrt/gpu,tensorflow/core/tfrt/run_handler_thread_pool,tensorflow/core/tfrt/runtime,tensorflow/core/tfrt/saved_model,tensorflow/core/tfrt/graph_executor,tensorflow/core/tfrt/saved_model/tests,tensorflow/core/tfrt/tpu,tensorflow/core/tfrt/utils,tensorflow/core/tfrt/utils/debug,tensorflow/core/tfrt/saved_model/python,tensorflow/core/tfrt/graph_executor/python,tensorflow/core/tfrt/saved_model/utils + +# Address sanitizer +# CC=clang bazel build --config asan +build:asan --strip=never +build:asan --copt -Wno-macro-redefined +build:asan --copt -fsanitize=address +build:asan --copt -DADDRESS_SANITIZER +build:asan --copt -g +build:asan --copt -O0 +build:asan --copt -fno-omit-frame-pointer +build:asan --copt -fno-sanitize-recover=all +build:asan --copt -gmlt +build:asan --linkopt -fsanitize=address + +build:ubsan --copt -fsanitize=undefined +build:ubsan --linkopt -fsanitize=undefined +build:ubsan --action_env=UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1 + +# BAZEL DEBUG BUILD NOTES +# Creating a debug build for Tensorflow is extremely taxing. Enabling debug for all of Tensorflow makes the build and link process take 3-4 hours. It finally doesn't work as the library is too large to be loaded. +# As a solution to this problem, the bazel option --per_file_copt is awesome as it allows just the files within a particular package to be built with different flags. +# This is used in the below command to create a Tensorflow build which includes only debug symbols for Tensorflow Lite. Tensorflow also requires bazel version 3.7.2, so this is used locally just for the Tensorflow build. +# In the following command, we build the target "build_pip_package". This builds all(most) of Tensorflow and creates a Python whl package which we can "pip install". This can then be used to debug the TFLite interpreter when we are invoking it via the Tensorflow Python API, such as in xformer1. +# bazel build -c opt --strip="never" --per_file_copt="//tensorflow/lite/.*\.cc@-g,-O0" //tensorflow/tools/pip_package:build_pip_package + +# Use the following command to create a debug build for xformer2 +# bazel build -c dbg --spawn_strategy=local --javacopt="-g" --copt="-g" --strip="never" //:xcore-opt + +# Use our custom-configured c++ toolchain. +#build:linux_config --crosstool_top=//toolchain:gnu_suite + +# Use --cpu as a differentiator. +#build:linux_config --cpu=k8 + +# Use the default Bazel C++ toolchain to build the tools used during the +# build. +#build:linux_config --host_crosstool_top=//toolchain:gnu_suite + +# Put user-specific options in .bazelrc.user +try-import %workspace%/.bazelrc.user diff --git a/xformer/.bazelversion b/xformer/.bazelversion new file mode 100644 index 000000000..dfda3e0b4 --- /dev/null +++ b/xformer/.bazelversion @@ -0,0 +1 @@ +6.1.0 diff --git a/experimental/xformer/.gitignore b/xformer/.gitignore similarity index 100% rename from experimental/xformer/.gitignore rename to xformer/.gitignore diff --git a/xformer/Analysis/MemoryPlan.cpp b/xformer/Analysis/MemoryPlan.cpp new file mode 100644 index 000000000..95b8f1912 --- /dev/null +++ b/xformer/Analysis/MemoryPlan.cpp @@ -0,0 +1,779 @@ +// Copyright 2023 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Analysis/MemoryPlan.h" +#include "IR/XCoreOps.h" +#include "Transforms/Options.h" +#include "Utils/Util.h" + +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/Format.h" + +#define DEBUG_TYPE "xcore-memory-plan" + +namespace mlir::xcore { + +MemoryPlan::MemoryPlan(Operation *operation) + : liveness(operation), op(operation) { + build(); +} + +void MemoryPlan::build() { + if (!llvm::isa(op)) { + return; + } + + auto funcOp = dyn_cast(op); + + auto getAlignedValueSize = [](Value v) { + auto type = v.getType().dyn_cast(); + size_t k = static_cast(utils::getShapedTypeSize(type)); + // Align size up to double word = 8 bytes + k = ((k + 7) / 8) * 8; + return k; + }; + + for (BlockArgument argument : funcOp.getArguments()) { + bool isExternallyAllocated = false; + // If the input is externally allocated, then it won't have any uses + if (argument.use_empty()) { + isExternallyAllocated = true; + } + valueInfo.insert({argument, + {valueInfo.size(), getAlignedValueSize(argument), + /*isConstantOp=*/false, -1, -1, isExternallyAllocated}}); + values.push_back(argument); + } + + funcOp.walk([&](Operation *op) { + if (op == funcOp || llvm::isa(op)) { + return; + } + + bool isConstantOp = false; + // TODO(renjieliu): Find a generic way to deal with const ops. + if (op->hasTrait() || + llvm::isa(op)) { + isConstantOp = true; + } + + if (!llvm::isa(op)) { + operationIds.insert({op, operationIds.size()}); + operations.push_back(op); + } + + // If this is an output tensor which is externally stored, then we don't + // want to allocate that + if (llvm::isa(op)) { + if (op->getNumResults() == 1 && op->getResult(0).hasOneUse() && + llvm::isa(*op->getResult(0).user_begin())) { + auto result = op->getResult(0); + assert(valueInfo.count(result) == 0); + valueInfo.insert( + {result, + {valueInfo.size(), getAlignedValueSize(result), isConstantOp, -1, + -1, /*isExternallyAllocated=*/true}}); + values.push_back(result); + return; + } + } + + for (Value result : op->getResults()) { + if (result.getType().isa()) { + continue; + } + assert(valueInfo.count(result) == 0); + valueInfo.insert( + {result, + {valueInfo.size(), getAlignedValueSize(result), isConstantOp, -1, -1, + /*isExternallyAllocated=*/false}}); + values.push_back(result); + } + }); + + // Liveness + // Struct with start op and end op + assert(op->getNumRegions() == 1); + assert(op->getRegion(0).hasOneBlock()); + + Block *block = &op->getRegion(0).front(); + + const LivenessBlockInfo *lvb = liveness.getLiveness(block); + for (auto v : values) { + Operation *startOp = lvb->getStartOperation(v); + valueInfo[v].firstUsed = operationIds[startOp]; + valueInfo[v].lastUsed = operationIds[lvb->getEndOperation(v, startOp)]; + } +} + +Operation *MemoryPlan::getOpWithMaxMemoryUsed() { + Block *block = &op->getRegion(0).front(); + const LivenessBlockInfo *lvb = liveness.getLiveness(block); + + int maxSize = -1; + Operation *maxOp; + for (auto o : operations) { + if (o->hasTrait() || + llvm::isa(o)) { + continue; + } + int size = 0; + for (auto v : lvb->currentlyLiveValues(o)) { + if (!valueInfo[v].isConstant) + size += valueInfo[v].size; + } + if (size > maxSize) { + maxSize = size; + maxOp = o; + } + LLVM_DEBUG(llvm::dbgs() + << "\nop " << operationIds[o] << " width = " << size); + } + LLVM_DEBUG(llvm::dbgs() << "\nMax op " << operationIds[maxOp] + << " width = " << maxSize); + LLVM_DEBUG(llvm::dbgs() << "\n\n"); + return maxOp; +} + +int MemoryPlan::getOffset(Value v, int size, + DenseMap &valueInfo, + ValuesOrderedByOffset &allocatedValues) { + int offset = 0; + + // Go through all allocated buffers + // They are ordered by offset + for (auto i : allocatedValues) { + Value allocatedVal = i.first; + int allocatedOffset = i.second; + + if ((valueInfo[allocatedVal].firstUsed > valueInfo[v].lastUsed) || + (valueInfo[v].firstUsed > valueInfo[allocatedVal].lastUsed)) { + // There is no overlap with this buffer. We move on until we have a clash. + // When there is a clash, we know we can allocate before that one if there + // is space as we don't overlap with any of those buffers. + continue; + } + + // Found an overlapping buffer + if (allocatedOffset - offset >= size) { + // There is a gap + break; + } else { + // Move offset to end of current buffer if larger + int end = allocatedOffset + valueInfo[allocatedVal].size; + if (end > offset) { + offset = end; + } + } + } + + return offset; +} + +void MemoryPlan::buildInputOutputTensorMaps( + llvm::StringMap &inputTensorMap, + llvm::StringMap &outputTensorMap) { + auto buildMap = [&](StringRef argAttr, StringRef nameAttr, + llvm::SmallVector &attrsInOrder) { + llvm::StringMap map; + llvm::SmallVector argNames; + auto funcOp = dyn_cast(op); + + llvm::SmallVector inputNames; + auto dictAttr = + funcOp->getAttrOfType("tf.entry_function"); + if (auto str = + dictAttr.get(nameAttr).dyn_cast_or_null()) { + str.getValue().split(inputNames, ',', /*MaxSplit=*/-1, + /*KeepEmpty=*/false); + } + + auto argAttrs = funcOp->getAttrOfType(argAttr); + if (argAttrs) { + for (auto attr : argAttrs) { + auto d = attr.dyn_cast_or_null(); + + const ArrayRef indexPathAttrs = + d.get("tf_saved_model.index_path").cast().getValue(); + auto stringAttr = + indexPathAttrs[0].dyn_cast_or_null(); + if (!stringAttr) + continue; + argNames.push_back(stringAttr.getValue().str()); + } + } else { + for (int i = 0; i < inputNames.size(); i++) { + argNames.push_back(inputNames[i].str()); + } + } + + assert(argNames.size() == inputNames.size()); + for (int i = 0; i < inputNames.size(); i++) { + map[inputNames[i].str()] = argNames[i]; + attrsInOrder.push_back(argNames[i]); + } + return map; + }; + + llvm::StringMap inNameToAttrMap, outNameToAttrMap; + llvm::SmallVector attrsInOrder; + + inNameToAttrMap = buildMap("arg_attrs", "inputs", attrsInOrder); + outNameToAttrMap = buildMap("res_attrs", "outputs", attrsInOrder); + + for (int i = 0; i < inNameToAttrMap.size(); i++) { + inputTensorMap[attrsInOrder[i]] = values[i]; + } + + for (auto v : values) { + if (auto loc = v.getLoc()->dyn_cast_or_null()) { + if (outNameToAttrMap.count(loc.getName())) { + outputTensorMap[outNameToAttrMap[loc.getName()]] = v; + } + } + } +} + +bool MemoryPlan::getValsIfValidOverlappableOp( + Operation *o, llvm::DenseMap> outInMap, + llvm::DenseSet outputTensorSet, + llvm::DenseSet overlappedWithBranchSet, bool overlapModifyingOps, + Value &inVal, Value &outVal) { + if (o->hasTrait()) { + inVal = o->getOperand(0); + outVal = o->getResult(0); + + if (outputTensorSet.contains(outVal)) { + // This value is an output tensor that is being same allocated with + // input tensor. This would have been handled in the special case. + return false; + } else if (o->hasTrait()) { + // These ops don't do modification, so safe to overlap + return true; + } else if (!overlapModifyingOps) { + // Only non modifying ops are overlapped + return false; + } else if (outInMap.count(outVal)) { + // This value has already been added for allocation to an output + // tensor in the special case, and so cannot be overlapped with a + // modification op + return false; + } else if ((o->getNumOperands() == 1 && inVal.hasOneUse() && + !valueInfo[inVal].isConstant) || + (o->getNumOperands() > 1 && + !o->hasTrait() && + (inVal.hasOneUse() && !valueInfo[inVal].isConstant || + o->getOperand(1).hasOneUse() && + !valueInfo[o->getOperand(1)].isConstant))) { + + // The inval to this op has been already allocated to a branched op, and + // so it is not safe to overlap a modification op + if (overlappedWithBranchSet.contains(inVal)) { + return false; + } + + if (o->getNumOperands() > 1 && + (!inVal.hasOneUse() || valueInfo[inVal].isConstant)) { + inVal = o->getOperand(1); + } + return true; + } + } + + return false; +} + +std::vector MemoryPlan::getAllocatedOffsets(const bool overlapModifyingOps, + int &peakMemoryUsed, + int &peakOpId) { + std::vector offsets; + // Copy of valueInfo + auto vInfo = valueInfo; + + // Handle input output tensor same allocations + llvm::DenseSet inputTensorSet; + llvm::DenseSet outputTensorSet; + llvm::StringMap inputTensorMap, outputTensorMap; + + if (sameAllocationInputOutputTensorOption.size() > 0) { + buildInputOutputTensorMaps(inputTensorMap, outputTensorMap); + for (int i = 0; i < sameAllocationInputOutputTensorOption.size(); + i = i + 2) { + inputTensorSet.insert( + inputTensorMap[sameAllocationInputOutputTensorOption[i]]); + outputTensorSet.insert( + outputTensorMap[sameAllocationInputOutputTensorOption[i + 1]]); + } + } + + // Overlap buffers + // When overlapping, (consider special case below) we try to allocate the + // input val to an op and then put the output val in the same space. This + // means we might have to increase the input val size to accommodate the + // output val. We also have to store the actual offset info for the input val, + // so that the input val can be stored at the right offset after allocation. + // + // + // For e.g, inval of size 10, outval of size 15 + // All values have to be aligned + // Difference = 15 - 10 = 5 + // Aligned difference = 5 -> 8 + // Aligned sizes for inval and outval = 10->16 and 15->16 + // outInMap[outVal] = {inVal, 8} + // Allocated size for inval = 16 + 8 = 24 + // Actual offset for inval = 8 + // So if inval is allocated at offset 100, outval will be allocated at 100, + // and inVal will be allocated at 108 + llvm::DenseMap> outInMap; + llvm::SmallVector outValList; + llvm::DenseSet overlappedWithBranchSet; + llvm::DenseMap inValActualOffsetMap; + // Special case: + // Only applicable when input/output tensors are same allocated and we want + // to fold in a NonModifying Op such as Reshape. In this case, we + // allocate the input val to the output tensor instead, as output tensor is + // already allocated to same space as the input tensor. + for (auto o : operations) { + if (o->hasTrait()) { + auto outVal = o->getResult(0); + if (outputTensorSet.contains(outVal)) { + auto inVal = o->getOperand(0); + outInMap[inVal] = {outVal, 0}; + // First used is modified as we are allocating in the in to out + // direction + vInfo[outVal].firstUsed = + std::min(vInfo[outVal].firstUsed, vInfo[inVal].firstUsed); + + inValActualOffsetMap[outVal] = 0; + } + } + } + + for (auto o : operations) { + // We iterate through overlappable ops + Value inVal, outVal; + if (getValsIfValidOverlappableOp(o, outInMap, outputTensorSet, + overlappedWithBranchSet, + overlapModifyingOps, inVal, outVal)) { + + if (o->hasTrait() && + (!inVal.hasOneUse() || overlappedWithBranchSet.contains(inVal))) { + overlappedWithBranchSet.insert(outVal); + } + + auto unalignedSizeInVal = + utils::getShapedTypeSize(inVal.getType().dyn_cast()); + auto unalignedSizeOutV = + utils::getShapedTypeSize(outVal.getType().dyn_cast()); + auto unalignedOffset = unalignedSizeOutV - unalignedSizeInVal; + // Align offset up to double word = 8 bytes + auto offset = unalignedOffset < 0 ? 0 : ((unalignedOffset + 7) / 8) * 8; + + outInMap[outVal] = {inVal, offset}; + outValList.push_back(outVal); + + // Set last Used of input Val + vInfo[inVal].lastUsed = + std::max(vInfo[outVal].lastUsed, vInfo[inVal].lastUsed); + // The aligned input val size plus aligned offset might be larger + // than aligned output val size + // eg in = 10, out = 19 + vInfo[inVal].size = + std::max(vInfo[inVal].size + offset, vInfo[outVal].size); + + inValActualOffsetMap[inVal] = offset; + } + } + + // Tidy up outInMap + // Combine out values overlapping with the same in value + // + // out1 -> in1 + // out2 -> out1 + // = + // out2 -> in1 + for (auto outV : outValList) { + auto inVal = outInMap[outV].first; + assert(inVal != nullptr); + auto inOffset = outInMap[outV].second; + // If inVal is another outVal, it's a chain + if (outInMap.count(inVal)) { + // + inValActualOffsetMap.erase(inVal); + + auto chainedInVal = outInMap[inVal].first; + auto chainedOffset = outInMap[inVal].second; + outInMap[outV] = {chainedInVal, inOffset + chainedOffset}; + + // We adjust the inVal parameters to account for the new out value + vInfo[chainedInVal].lastUsed = + std::max(vInfo[outV].lastUsed, vInfo[chainedInVal].lastUsed); + inValActualOffsetMap[chainedInVal] = std::max( + inValActualOffsetMap[chainedInVal], inOffset + chainedOffset); + vInfo[chainedInVal].size = + std::max(vInfo[outV].size, vInfo[chainedInVal].size + inOffset); + } + } + + // Debug + // printf("\n\nDumping overlapped values\n"); + // int k = 0; + // for (auto op : operations) { + // if (op->hasTrait()) { + // auto outVal = op->getResult(0); + // if (outInMap.count(outVal)) { + // printf("\n\nval %d\n", k++); + // outVal.dump(); + // printf("overlapped onto\n"); + // outInMap[outVal].first.dump(); + // } + // } + // } + // Confirm that all NoModification ops have been handled + int cnt = 0; + // printf("\n\n"); + for (auto op : operations) { + if (op->hasTrait()) { + auto inVal = op->getOperand(0); + auto outVal = op->getResult(0); + if (outputTensorSet.contains(outVal)) { + if (!outInMap.count(inVal)) { + cnt++; + // printf("Not found %d!\n", cnt); + // op->dump(); + // outVal.dump(); + } + } else if (!outInMap.count(outVal)) { + cnt++; + // printf("Not found %d!\n", cnt); + // op->dump(); + // inVal.dump(); + } + } + } + assert(cnt == 0 && "All NoModification ops have not been memory allocated!"); + + // The comparator keeps the buffers ordered by id if their sizes are the + // same + auto DecreasingSizesComparator = [&](QueueItem &lhs, QueueItem &rhs) { + if (lhs.second != rhs.second) { + return lhs.second < rhs.second; + } + return vInfo[lhs.first].id < vInfo[rhs.first].id; + }; + // The top item is the largest one. + llvm::PriorityQueue, + decltype(DecreasingSizesComparator)> + queue(DecreasingSizesComparator); + + // Insert values and their sizes into priority queue + // InOutmap prevents adding in values which are overlapped + // In a chain of overlapped values, only the last value is allocated and the + // rest are patched up and add in allocated values list later + // Don't insert same allocation input and output tensors into queue as they + // are allocated separately + for (auto v : values) { + if (!outInMap.count(v) && !vInfo[v].isConstant && + !vInfo[v].isExternallyAllocated && !outputTensorSet.contains(v) && + !inputTensorSet.contains(v)) { + queue.push({v, vInfo[v].size}); + } + } + + ValuesOrderedByOffset allocatedValues; + + // If there are same allocation input and output tensors, allocate those first + if (sameAllocationInputOutputTensorOption.size() > 0) { + // Allocate first input and output tensor with offsets of zero + allocatedValues.insert( + {inputTensorMap[sameAllocationInputOutputTensorOption[0]], 0}); + allocatedValues.insert( + {outputTensorMap[sameAllocationInputOutputTensorOption[1]], 0}); + + for (int i = 2; i < sameAllocationInputOutputTensorOption.size(); + i = i + 2) { + auto inputTensor = + inputTensorMap[sameAllocationInputOutputTensorOption[i]]; + int newOffset = getOffset(inputTensor, vInfo[inputTensor].size, vInfo, + allocatedValues); + allocatedValues.insert({inputTensor, newOffset}); + allocatedValues.insert( + {outputTensorMap[sameAllocationInputOutputTensorOption[i + 1]], + newOffset}); + } + } else { + // Else allocate the largest tensor at offset zero + auto v = queue.top().first; + queue.pop(); + allocatedValues.insert({v, 0}); + } + + while (!queue.empty()) { + auto v = queue.top().first; + auto size = queue.top().second; + queue.pop(); + + int newOffset = getOffset(v, size, vInfo, allocatedValues); + allocatedValues.insert({v, newOffset}); + } + + // Patch up overlapped buffers + for (auto val : outInMap) { + auto out = val.first; + auto inVal = val.second.first; + auto outValOffset = val.second.second; + + auto it = + std::find_if(allocatedValues.begin(), allocatedValues.end(), + [&](const QueueItem &p) { return p.first == inVal; }); + + if (it != allocatedValues.end()) { + int currentOffset = it->second; + allocatedValues.insert( + {out, currentOffset + inValActualOffsetMap[inVal] - outValOffset}); + } else { + out.dump(); + inVal.dump(); + assert(false); + } + } + + for (auto val : inValActualOffsetMap) { + auto inVal = val.first; + auto actualOffset = val.second; + auto it = + std::find_if(allocatedValues.begin(), allocatedValues.end(), + [&](const QueueItem &p) { return p.first == inVal; }); + + if (it != allocatedValues.end()) { + int currentOffset = it->second; + allocatedValues.erase(it); + allocatedValues.insert({inVal, currentOffset + actualOffset}); + } else { + assert(false); + } + } + + // Insert -1 offset for constant values + // -111 is an offset used to denote externally allocated tensor + // This is declared for the runtime in greedy_memory_planner.h as + // kXcoreOfflinePlannedBuffer + for (auto v : values) { + if (vInfo[v].isExternallyAllocated) { + allocatedValues.insert({v, -111}); + } else if (vInfo[v].isConstant) { + allocatedValues.insert({v, -1}); + } + } + + // Sort the allocated offsets by id, i.e., execution order + auto cmp = [&](QueueItem a, QueueItem b) { + return vInfo[a.first].id < vInfo[b.first].id; + }; + std::multiset allocatedValuesOrderedByID(cmp); + for (auto i : allocatedValues) { + allocatedValuesOrderedByID.insert(i); + } + + // Create map of value and allocated offsets including patched ones + DenseMap valOffsetMap; + for (auto i : allocatedValuesOrderedByID) { + valOffsetMap[i.first] = i.second; + } + + // Confirm that no ops have same offset for input and output + for (auto op : operations) { + if (op->hasTrait()) { + auto inVal = op->getOperand(0); + auto outVal = op->getResult(0); + assert(valOffsetMap[inVal] == valOffsetMap[outVal] && + "NoModification ops must have same allocation offset!"); + } + } + + // Check if buffers clash + // for (auto i : allocatedValuesOrderedByID) { + // for (auto j : allocatedValuesOrderedByID) { + // if (vInfo[i.first].id < vInfo[j.first].id) { + // if ((vInfo[i.first].firstUsed > vInfo[j.first].firstUsed && + // vInfo[i.first].firstUsed < vInfo[j.first].lastUsed) || + // (vInfo[j.first].firstUsed > vInfo[i.first].firstUsed && + // vInfo[j.first].firstUsed < vInfo[i.first].lastUsed)) { + // auto iBegin = i.second; + // auto iEnd = i.second + vInfo[i.first].size; + // auto jBegin = j.second; + // auto jEnd = j.second + vInfo[j.first].size; + // if ((iBegin > jBegin && iBegin < jEnd) || + // (jBegin > iBegin && jBegin < iEnd)) { + // printf("\n\nProblem!"); + // std::cout << "\nValue one " << vInfo[i.first].id + // << ", size = " << vInfo[i.first].size + // << ", offset = " << i.second + // << ", first = " << vInfo[i.first].firstUsed + // << ", last = " << vInfo[i.first].lastUsed; + // std::cout << "\nValue two " << vInfo[j.first].id + // << ", size = " << vInfo[j.first].size + // << ", offset = " << j.second + // << ", first = " << vInfo[j.first].firstUsed + // << ", last = " << vInfo[j.first].lastUsed; + // } + // } + // } + // } + // } + + size_t peakUsed = 0; + size_t peakUsedValueID = 0; + size_t maxId = 0; + nonConstantAllocatedValues.clear(); + nonConstantOffsets.clear(); + LLVM_DEBUG(llvm::dbgs() << "\nAllocated offsets : "); + for (auto i : allocatedValuesOrderedByID) { + offsets.push_back(i.second); + if (!vInfo[i.first].isConstant) { + maxId++; + nonConstantAllocatedValues.push_back(i.first); + nonConstantOffsets.push_back(i.second); + // valueInfo instead of vInfo as vInfo size has been modified + size_t currentSize = valueInfo[i.first].size + i.second; + if (currentSize >= peakUsed) { + peakUsed = currentSize; + peakOpId = maxId; + } + } + LLVM_DEBUG(llvm::dbgs() << "\nValue " << vInfo[i.first].id + << ", size = " << valueInfo[i.first].size + << ", offset = " << i.second + << ", first = " << vInfo[i.first].firstUsed + << ", last = " << vInfo[i.first].lastUsed << "\n"); + // i.first.dump(); + } + LLVM_DEBUG(llvm::dbgs() << "\n\nPEAK USED : " << peakUsed << "\n\n"); + LLVM_DEBUG(llvm::dbgs() << "\n\n"); + peakMemoryUsed = peakUsed; + + // printf("\npeakmemory %d, vid %d maxid %d, opid %d\n", peakMemoryUsed, + // vInfo[values[peakUsedValueID]].id, maxId, peakOpId); + + return offsets; +} + +char MemoryPlan::getOrdinalCharacter(int i) { + if (i < 10) { + return '0' + i; + } else if (i < 36) { + return 'a' + (i - 10); + } else if (i < 62) { + return 'A' + (i - 36); + } + return '*'; +} + +void MemoryPlan::printMemoryPlan() { + llvm::outs() << "\nMEMORY PLAN ANALYSIS\n" + << "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯"; + + // llvm::outs() << "\nAllocated Offsets\n"; + // for (int i = 0; i < nonConstantAllocatedValues.size(); ++i) { + // llvm::outs() << llvm::format( + // "\n%c (id=%d): size=%d, offset=%d, first_used=%d last_used=%d", + // getOrdinalCharacter(i), i, + // valueInfo[nonConstantAllocatedValues[i]].size, nonConstantOffsets[i], + // valueInfo[nonConstantAllocatedValues[i]].firstUsed, + // valueInfo[nonConstantAllocatedValues[i]].lastUsed); + // } + // llvm::outs() << "\n"; + + // llvm::outs() << "\nMemory Plan\n"; + + constexpr int kLineWidth = 60; + int max_size = kLineWidth; + int max_time = 0; + for (int i = 0; i < nonConstantAllocatedValues.size(); ++i) { + const int offset = nonConstantOffsets[i]; + const int last_time_used = + valueInfo[nonConstantAllocatedValues[i]].lastUsed; + const int size = offset + valueInfo[nonConstantAllocatedValues[i]].size; + if (size > max_size) { + max_size = size; + } + if (last_time_used > max_time) { + max_time = last_time_used; + } + } + + char line[kLineWidth + 1]; + for (int t = 0; t <= max_time; ++t) { + for (int c = 0; c < kLineWidth; ++c) { + line[c] = '.'; + } + int memory_use = 0; + int peakSize = 0; + for (int i = 0; i < nonConstantAllocatedValues.size(); ++i) { + if ((t < valueInfo[nonConstantAllocatedValues[i]].firstUsed) || + (t > valueInfo[nonConstantAllocatedValues[i]].lastUsed)) { + continue; + } + const int offset = nonConstantOffsets[i]; + if (offset == -1) { + continue; + } + + const int size = valueInfo[nonConstantAllocatedValues[i]].size; + if (peakSize < offset + size) { + peakSize = offset + size; + } + + memory_use += size; + const int line_start = (offset * kLineWidth) / max_size; + const int line_end = ((offset + size) * kLineWidth) / max_size; + for (int n = line_start; n < line_end; ++n) { + if (line[n] == '.') { + line[n] = getOrdinalCharacter(i); + } else { + line[n] = '!'; + } + } + } + line[kLineWidth] = 0; + + llvm::outs() << llvm::format( + "\n%-20s %s%d: %s (%dk), (%dk)", + operations[t]->getName().stripDialect().str().c_str(), + t < 10 ? " " : "", t, (const char *)line, (memory_use + 1023) / 1024, + (peakSize + 1023) / 1024); + } + llvm::outs() << "\n"; +} + +int MemoryPlan::getNextBottomOpId(int opId) { + Block *block = &op->getRegion(0).front(); + const LivenessBlockInfo *lvb = liveness.getLiveness(block); + Operation *startOp = lvb->getStartOperation(nonConstantAllocatedValues[opId]); + Operation *endOp = + lvb->getEndOperation(nonConstantAllocatedValues[opId], startOp); + int nextOpId = operationIds[endOp]; + + if (nextOpId < opId) { + nextOpId = -1; + } else if (nextOpId == opId) { + nextOpId++; + } + + if (nextOpId != -1) { + startOp = lvb->getStartOperation(nonConstantAllocatedValues[nextOpId]); + endOp = lvb->getEndOperation(nonConstantAllocatedValues[nextOpId], startOp); + int nextNextOpId = operationIds[endOp]; + if (nextNextOpId != nextOpId) { + nextOpId = nextNextOpId; + } + } + + return nextOpId; +} + +} // namespace mlir::xcore diff --git a/xformer/Analysis/MemoryPlan.h b/xformer/Analysis/MemoryPlan.h new file mode 100644 index 000000000..ece4bf2f6 --- /dev/null +++ b/xformer/Analysis/MemoryPlan.h @@ -0,0 +1,125 @@ +// Copyright 2023 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#ifndef XFORMER_ANALYSIS_MEMORYPLAN_H +#define XFORMER_ANALYSIS_MEMORYPLAN_H + +#include "mlir/Analysis/Liveness.h" +#include "mlir/IR/Value.h" +#include "llvm/ADT/PriorityQueue.h" +#include "llvm/ADT/StringMap.h" + +#include + +namespace mlir { +namespace xcore { + +struct ValueInfo { + size_t id; + size_t size; + bool isConstant; + int firstUsed; + int lastUsed; + bool isExternallyAllocated; +}; + +// Represents an analysis for memory planning of a given FuncOp for a model. +// - Uses liveness analysis and a greedy algorithm to arrange buffers in memory. +// - Tries to overlap input and output buffers based on the op characteristics. +// - Calculates maximum width of the network for planning operator splitting. + +// Future optimizations to consider +// - Reorder graph optimization +// Associative Instruction Reordering to Alleviate Register Pressure +// https://hal.inria.fr/hal-01956260/document + +class MemoryPlan { +public: + MemoryPlan(Operation *op); + + // The offset allocation algorithm is similar in implementation to the greedy + // memory planner in tflite-micro. The algorithm works like this: + // - The buffers are sorted in descending order of size. A PriorityQueue is + // used for this. + // - The largest buffer is allocated at offset zero. + // - The rest of the buffers are popped from the queue in descending size + // order. + // - Every popped buffer is compared with the already allocated buffers. + // - The first gap between simultaneously active buffers that the current + // buffer fits into will be used. + // - If no large-enough gap is found, the current buffer is placed after the + // last buffer that's simultaneously active. + // - This continues until all buffers are placed, and the offsets stored. + std::vector getAllocatedOffsets(const bool overlapOps, + int &peakMemoryUsed, int &peakOpId); + + Operation *getOpWithMaxMemoryUsed(); + + int getNextBottomOpId(int opId); + + DenseMap getOperationsIDMap() { return operationIds; } + + std::vector getOperationsSequence() { return operations; } + + std::vector getValuesSequence() { return values; } + + DenseMap getValuesInfoMap() { return valueInfo; } + + void buildInputOutputTensorMaps(llvm::StringMap &inputTensorMap, + llvm::StringMap &outputTensorMap); + + // OpSplitPlan getOpSplitPlan(); + + void printMemoryPlan(); + +private: + /// Initializes the internal mappings. + void build(); + + using QueueItem = std::pair; + // + struct IncreasingOffsetsComparator { + bool operator()(const QueueItem &lhs, const QueueItem &rhs) const { + return (lhs.second < rhs.second); + } + }; + // + using ValuesOrderedByOffset = + std::multiset; + + int getOffset(Value v, int size, DenseMap &valueInfo, + ValuesOrderedByOffset &allocatedOffsets); + + bool getValsIfValidOverlappableOp( + Operation *o, llvm::DenseMap> outInMap, + llvm::DenseSet outputTensorSet, + llvm::DenseSet overlappedWithBranchSet, bool overlapModifyingOps, + Value &inVal, Value &outVal); + + char getOrdinalCharacter(int i); + + DenseMap valueInfo; + + std::vector values; + + // Maps each Operation to a unique ID according to the program sequence. + DenseMap operationIds; + + // Stores all operations according to the program sequence. + std::vector operations; + + // Stores non constant values and offsets + // We need them for printing out the memory plan without getting polluted with + // constant values. + std::vector nonConstantAllocatedValues; + std::vector nonConstantOffsets; + + Liveness liveness; + + Operation *op; +}; + +} // namespace xcore +} // namespace mlir + +#endif // XFORMER_ANALYSIS_MEMORYPLAN_H diff --git a/xformer/BUILD b/xformer/BUILD new file mode 100644 index 000000000..67c2f39dc --- /dev/null +++ b/xformer/BUILD @@ -0,0 +1,274 @@ +load("@llvm-project//mlir:tblgen.bzl", "gentbl_cc_library", "td_library") +load("@bazel_skylib//rules:common_settings.bzl", "bool_flag") + +package( + default_visibility = ["//visibility:public"], +) + +genrule( + name = "version_check", + srcs = ["version_check.sh"], + cmd = "cp $< $@ && chmod +x $@ && $@ BAZEL_BUILD", + outs = ["version_check_output"], +) + +td_library( + name = "xc_dialect_td", + srcs = [ + "IR/XCoreOps.td" + ], + includes = ["external/org_tensorflow"], + deps = [ + "@llvm-project//mlir:FuncTdFiles", + "@llvm-project//mlir:SideEffectInterfacesTdFiles", + "@org_tensorflow//tensorflow/compiler/mlir/tensorflow:tensorflow_ops_td_files", + "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_ops_td_files", + ], +) + +td_library( + name = "utils_td", + srcs = [ + "Utils/Utils.td", + ], +) + +td_library( + name = "tfl_patterns_td", + srcs = [ + "Transforms/TFLPatterns.td", + ], + includes = ["external/org_tensorflow", "external/lce"], + deps = [ + "@lce//larq_compute_engine/mlir:lce_ops_td_file", + "@llvm-project//mlir:FuncTdFiles", + "@org_tensorflow//tensorflow/compiler/mlir/tensorflow:tensorflow_ops_td_files", + "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_ops_td_files", + ":utils_td", + ], +) + +td_library( + name = "xc_patterns_td", + srcs = [ + "Transforms/XCPatterns.td", + ], + includes = ["external/org_tensorflow", "external/lce"], + deps = [ + ":xc_dialect_td", + ":utils_td", + "@lce//larq_compute_engine/mlir:lce_ops_td_file", + "@llvm-project//mlir:ArithOpsTdFiles", + ], +) + +td_library( + name = "load_constant_op_patterns_td", + srcs = [ + "Transforms/LoadConstantOpPatterns.td", + ], + includes = ["external/org_tensorflow"], + deps = [ + ":xc_dialect_td", + "@llvm-project//mlir:ArithOpsTdFiles", + ], +) + +td_library( + name = "conv_patterns_td", + srcs = [ + "Transforms/ConvPatterns.td", + ], + includes = ["external/org_tensorflow"], + deps = [ + ":xc_dialect_td", + "@llvm-project//mlir:ArithOpsTdFiles", + ], +) + +td_library( + name = "conv_revert_patterns_td", + srcs = [ + "Transforms/ConvRevertPatterns.td", + ], + includes = ["external/org_tensorflow"], + deps = [ + ":xc_dialect_td", + "@llvm-project//mlir:ArithOpsTdFiles", + ], +) + +gentbl_cc_library( + name = "xc_ops_inc_gen", + tbl_outs = [ + (["-gen-enum-decls"], "IR/XCoreEnumOps.h.inc"), + (["-gen-enum-defs"], "IR/XCoreEnumOps.cpp.inc"), + (["-gen-op-decls"], "IR/XCoreOps.h.inc"), + (["-gen-op-defs"], "IR/XCoreOps.cpp.inc"), + (["-gen-dialect-decls", "-dialect=xc"], "IR/XCoreDialect.h.inc"), + (["-gen-dialect-defs", "-dialect=xc"], "IR/XCoreDialect.cpp.inc"), + (["-gen-dialect-doc", "-dialect=xc"], "IR/XCoreOps.md"), + ], + tblgen = "@llvm-project//mlir:mlir-tblgen", + td_file = "IR/XCoreOps.td", + deps = [ + ":xc_dialect_td", + ], +) + +gentbl_cc_library( + name = "xc_patterns_inc_gen", + tbl_outs = [ + (["-gen-rewriters"], "Transforms/GeneratedXCPatterns.inc"), + ], + tblgen = "@llvm-project//mlir:mlir-tblgen", + td_file = "Transforms/XCPatterns.td", + deps = [ + ":xc_patterns_td", + ], +) + +gentbl_cc_library( + name = "tfl_patterns_inc_gen", + tbl_outs = [ + (["-gen-rewriters"], "Transforms/GeneratedTFLPatterns.inc"), + ], + tblgen = "@llvm-project//mlir:mlir-tblgen", + td_file = "Transforms/TFLPatterns.td", + deps = [ + ":tfl_patterns_td", + ], +) + +gentbl_cc_library( + name = "load_constant_op_patterns_inc_gen", + tbl_outs = [ + (["-gen-rewriters"], "Transforms/GeneratedLoadConstantOpPatterns.inc"), + ], + tblgen = "@llvm-project//mlir:mlir-tblgen", + td_file = "Transforms/LoadConstantOpPatterns.td", + deps = [ + ":load_constant_op_patterns_td", + ], +) + +gentbl_cc_library( + name = "conv_patterns_inc_gen", + tbl_outs = [ + (["-gen-rewriters"], "Transforms/GeneratedConvPatterns.inc"), + ], + tblgen = "@llvm-project//mlir:mlir-tblgen", + td_file = "Transforms/ConvPatterns.td", + deps = [ + ":conv_patterns_td", + ], +) + +gentbl_cc_library( + name = "conv_revert_patterns_inc_gen", + tbl_outs = [ + (["-gen-rewriters"], "Transforms/GeneratedConvRevertPatterns.inc"), + ], + tblgen = "@llvm-project//mlir:mlir-tblgen", + td_file = "Transforms/ConvRevertPatterns.td", + deps = [ + ":conv_revert_patterns_td", + ], +) + +cc_library( + name = "xcore_passes", + srcs = glob(["Transforms/*.cpp"]) + glob(["Analysis/*.cpp"]) +[ + "IR/XCoreEnumOps.h.inc", + "IR/XCoreEnumOps.cpp.inc", + "IR/XCoreOps.cpp", + "IR/XCoreDialect.h.inc", + "IR/XCoreDialect.cpp.inc", + "IR/XCoreOps.cpp.inc", + "IR/XCoreOps.h.inc", + "Transforms/GeneratedXCPatterns.inc", + "Transforms/GeneratedTFLPatterns.inc", + "Transforms/GeneratedLoadConstantOpPatterns.inc", + "Transforms/GeneratedConvPatterns.inc", + "Transforms/GeneratedConvRevertPatterns.inc" + ], + hdrs = [ + "Analysis/MemoryPlan.h", + "Transforms/ConvPatterns.h", + "Transforms/Options.h", + "Transforms/Passes.h", + "Utils/Diagnostics.h", + "Utils/FileIO.h", + "Utils/ThreadSupport.h", + "IR/XCoreOps.h", + ], + deps = [ + ":xc_ops_inc_gen", + ":xc_patterns_inc_gen", + ":tfl_patterns_inc_gen", + ":load_constant_op_patterns_inc_gen", + ":conv_patterns_inc_gen", + ":conv_revert_patterns_inc_gen", + ":utils", + "@lce//larq_compute_engine/mlir:larq_compute_engine_translate_tflite", + "@llvm-project//mlir:IR", + "@llvm-project//mlir:Pass", + "@llvm-project//mlir:QuantOps", + "@lib_nn//:nn_lib", + "@org_tensorflow//tensorflow/compiler/mlir/lite:validators", + "@org_tensorflow//tensorflow/compiler/mlir/tensorflow:cluster_util", + ], +) + +cc_library( + name = "utils", + srcs = glob(["Utils/*.cpp"]), + hdrs = glob(["Utils/*.h"]), + deps = [ + "@llvm-project//llvm:Support", + "@llvm-project//mlir:IR", + "@llvm-project//mlir:Pass", + "@llvm-project//mlir:Support", + "@org_tensorflow//tensorflow/compiler/mlir/lite:flatbuffer_import", + "@org_tensorflow//tensorflow/compiler/mlir/lite:flatbuffer_export", + "@lib_nn//:nn_lib", + ], +) + +bool_flag( + name = "disable_version_check", + build_setting_default = False, + visibility = ["//visibility:public"], +) + +config_setting( + name = "have_disabled_version_check", + flag_values = { ":disable_version_check": "true" } +) + +cc_binary( + name = "xcore-opt", + srcs = ["XCoreOptMain.cpp", + "Version.h", + ], + deps = [ + "@lib_tflite_micro//:shared_headers", + "@lib_tflmc//:tflmc_lib", + ":xcore_passes", + "@llvm-project//mlir:IR", + "@llvm-project//mlir:FuncDialect", + "@llvm-project//mlir:QuantOps", + "@llvm-project//llvm:Support", + "@llvm-project//mlir:Pass", + "@llvm-project//mlir:Support", + "@llvm-project//mlir:TransformUtils", + "@llvm-project//mlir:MlirOptLib", + ], + data = select({ + ":have_disabled_version_check": [], + "//conditions:default": [ + ":version_check_output", + ], + }), + local_defines = ['SETUPTOOLS_SCM_VERSION=\\\"$(SETUPTOOLS_SCM_VERSION)\\\"'], +) diff --git a/xformer/IR/XCoreOps.cpp b/xformer/IR/XCoreOps.cpp new file mode 100644 index 000000000..47cd1afe6 --- /dev/null +++ b/xformer/IR/XCoreOps.cpp @@ -0,0 +1,37 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "IR/XCoreOps.h" + +// Generated dialect defs. +#include "IR/XCoreDialect.cpp.inc" + +#define GET_OP_CLASSES +#include "IR/XCoreOps.cpp.inc" + +#include "IR/XCoreEnumOps.cpp.inc" + +#include "mlir/IR/TypeUtilities.h" + +namespace mlir::xcore { + +void XCoreDialect::initialize() { + addOperations< +#define GET_OP_LIST +#include "IR/XCoreOps.cpp.inc" + >(); +} + +//===----------------------------------------------------------------------===// +// PadOp +//===----------------------------------------------------------------------===// + +OpFoldResult PadOp::fold(FoldAdaptor) { + if (succeeded( + verifyCompatibleShapes(getInput().getType(), getOutput().getType()))) + return getInput(); + + return {}; +} + +} // namespace mlir::xcore diff --git a/xformer/IR/XCoreOps.h b/xformer/IR/XCoreOps.h new file mode 100644 index 000000000..58371d3b3 --- /dev/null +++ b/xformer/IR/XCoreOps.h @@ -0,0 +1,54 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#ifndef XFORMER_IR_XCOREOPS_H +#define XFORMER_IR_XCOREOPS_H + +#include "mlir/Bytecode/BytecodeOpInterface.h" +#include "mlir/Dialect/Quant/QuantTypes.h" +#include "mlir/Interfaces/InferTypeOpInterface.h" +#include "mlir/Interfaces/SideEffectInterfaces.h" + +// clang-format off +#include "IR/XCoreDialect.h.inc" +// clang-format on + +#include "IR/XCoreEnumOps.h.inc" + +namespace mlir { +namespace OpTrait { +namespace xcore { + +template +class MemoryOverlappable : public TraitBase { +}; + +template +class NonModifying : public TraitBase {}; + +template +class OnlyOverlappableWithInput + : public TraitBase {}; + +} // namespace xcore +} // namespace OpTrait +} // namespace mlir + +#define GET_OP_CLASSES +#include "IR/XCoreOps.h.inc" + +constexpr int CONCAT_OP_MAX_INPUTS = 13; + +constexpr char kMetadataXCOffsets[] = "xc.offsets"; +constexpr char kMetadataXCPeakOpId[] = "xc.peak_op_id"; +constexpr char kMetadataXCPeakUsage[] = "xc.peak_usage"; +constexpr char kMetadataXCNumExternalInputTensors[] = + "xc.num_external_input_tensors"; +constexpr char kMetadataXCNumExternalOutputTensors[] = + "xc.num_external_output_tensors"; +constexpr char kMetadataXCNumExternalInputTensorsData[] = + "xc.num_external_input_tensors_data"; +constexpr char kMetadataXCNumExternalOutputTensorsData[] = + "xc.num_external_output_tensors_data"; + +#endif // XFORMER_IR_XCOREOPS_H diff --git a/xformer/IR/XCoreOps.td b/xformer/IR/XCoreOps.td new file mode 100644 index 000000000..d36d60cb2 --- /dev/null +++ b/xformer/IR/XCoreOps.td @@ -0,0 +1,530 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +//===----------------------------------------------------------------------===// +// +// This is the operation definition file for XCore dialect operations. +// +//===----------------------------------------------------------------------===// + +include "mlir/IR/OpBase.td" +include "mlir/IR/PatternBase.td" +include "mlir/IR/EnumAttr.td" +include "mlir/Interfaces/InferTypeOpInterface.td" +include "mlir/Interfaces/SideEffectInterfaces.td" +include "tensorflow/compiler/mlir/lite/quantization/quantization.td" + +//===----------------------------------------------------------------------===// +// XCore dialect definitions +//===----------------------------------------------------------------------===// + +#ifndef XCORE_DIALECT +#define XCORE_DIALECT + +def XCoreDialect : Dialect { + let name = "xc"; + + let summary = "Types and operations for XCore dialect"; + let description = [{ + This dialect contains operations for XCore. This dialect will be used in + conjunction with the TensorFlow dialects for converting & optimizing + TF graphs to be deployed on XCore. + }]; + + let cppNamespace = "::mlir::xcore"; +} + +//===----------------------------------------------------------------------===// +// XCore op definitions +//===----------------------------------------------------------------------===// + +// Base class for the operation in this dialect +class XC_Op traits = []> + : Op { + + let extraClassDeclaration = [{ std::vector buildCustomOptions(); }]; +} + +// Trait +def XC_MemoryOverlappable : NativeOpTrait<"xcore::MemoryOverlappable">; +def XC_NonModifying : NativeOpTrait<"xcore::NonModifying">; +def XC_OnlyOverlappableWithInput + : NativeOpTrait<"xcore::OnlyOverlappableWithInput">; + +// Conv2D + +def XC_Conv2D_ValidDirect : I32EnumAttrCase<"ValidDirect", 0>; +def XC_Conv2D_ValidIndirect : I32EnumAttrCase<"ValidIndirect", 1>; +def XC_Conv2D_PaddedIndirect : I32EnumAttrCase<"PaddedIndirect", 2>; +def XC_DW_Conv2D_ValidDirect : I32EnumAttrCase<"DepthwiseValidDirect", 3>; +def XC_DW_Conv2D_PaddedIndirect : I32EnumAttrCase<"DepthwisePaddedIndirect", 4>; +def XC_BNN_Conv2D_ValidDirect_Binary + : I32EnumAttrCase<"BNNValidDirectBinary", 5>; +def XC_BNN_Conv2D_ValidIndirect_Binary + : I32EnumAttrCase<"BNNValidIndirectBinary", 6>; +def XC_BNN_Conv2D_ValidDirect_Int8 : I32EnumAttrCase<"BNNValidDirectInt8", 7>; +def XC_BNN_Conv2D_ValidIndirect_Int8 + : I32EnumAttrCase<"BNNValidIndirectInt8", 8>; +def XC_Conv2D_ValidDirect_Int16 : I32EnumAttrCase<"ValidDirectI16", 9>; + +def XC_Conv2D_TypeAttr + : I32EnumAttr< + "Conv2DType", "conv2d type enum", + [XC_Conv2D_ValidDirect, XC_Conv2D_ValidIndirect, + XC_Conv2D_PaddedIndirect, XC_DW_Conv2D_ValidDirect, + XC_DW_Conv2D_PaddedIndirect, XC_BNN_Conv2D_ValidDirect_Binary, + XC_BNN_Conv2D_ValidIndirect_Binary, XC_BNN_Conv2D_ValidDirect_Int8, + XC_BNN_Conv2D_ValidIndirect_Int8, XC_Conv2D_ValidDirect_Int16]>; + +def XC_Conv2D_Group : I32EnumAttrCase<"Group", 0>; +def XC_Conv2D_Channelwise : I32EnumAttrCase<"Channelwise", 1>; + +def XC_Conv2D_OTAttr : I32EnumAttr<"OtType", "output transform type enum", + [XC_Conv2D_Group, XC_Conv2D_Channelwise]>; + +def XC_SliceOp : XC_Op<"slice", [Pure]> { + let summary = "Slice op"; + + let description = [{Slice op.}]; + + let arguments = (ins TensorOf<[QI8, QI16, F32, I8, I32]>:$input, + + I32Attr:$start, I32Attr:$offset, I32Attr:$size, I32Attr:$num_copies, + BoolAttr:$use_vpu); + + let results = (outs TensorOf<[QI8, QI16, F32, I8, I32]>:$output); +} + +def XC_FakeSliceOp : XC_Op<"fake_slice", [Pure]> { + let summary = "Fake slice op"; + + let description = [{Fake slice op.}]; + + let arguments = (ins AnyTensor:$input); + + let results = (outs AnyTensor:$output); +} + +def XC_BroadcastOp : XC_Op<"broadcast", [Pure]> { + let summary = "Broadcast op"; + + let description = [{Broadcast op.}]; + + let arguments = (ins TensorOf<[QI8, QI16, F32, I8, I32]>:$input, + + I32Attr:$size, I32Attr:$num_copies, I32Attr:$num_broadcasts, + BoolAttr:$use_vpu); + + let results = (outs TensorOf<[QI8, QI16, F32, I8, I32]>:$output); +} + +def XC_PadOp : XC_Op<"pad", [Pure, XC_MemoryOverlappable]> { + let summary = "Pad op"; + + let description = [{Pad op.}]; + + let arguments = (ins TensorOf<[QI8, QI16, F32, I8, I32]>:$input, + + I32Attr:$start, I32Attr:$pad_size, I32Attr:$size, I32Attr:$num_copies, + I32Attr:$zero_point, I32Attr:$end, BoolAttr:$use_vpu); + + let results = (outs TensorOf<[QI8, QI16, F32, I8, I32]>:$output); + + let hasFolder = 1; +} + +def XC_ConcatOp : XC_Op<"concat", [Pure]> { + let summary = "Concat op"; + + let description = [{Concat op.}]; + + let arguments = (ins Variadic>:$input, + + I32Attr:$num_copies, I32ArrayAttr:$sizes, I32Attr:$num_inputs, + BoolAttr:$use_vpu); + + let results = (outs TensorOf<[QI8, QI16, F32, I8, I32]>:$output); +} + +def XC_TransposeOp : XC_Op<"transpose", [Pure]> { + let summary = "Transpose op"; + + let description = [{Transpose op.}]; + + let arguments = (ins TensorOf<[QI8, QI16, F32, I8, I32]>:$input, + + I32ArrayAttr:$offsets, I32ArrayAttr:$t_shape); + + let results = (outs TensorOf<[QI8, QI16, F32, I8, I32]>:$output); +} + +def XC_AddOp : XC_Op<"add", [Pure, XC_MemoryOverlappable]> { + let summary = "Add op"; + + let description = [{Add op.}]; + + let arguments = (ins TensorOf<[QI8]>:$input1, TensorOf<[QI8]>:$input2, + StrAttr:$fused_activation_function, + + I32Attr:$multiplier1, I32Attr:$multiplier2, I32Attr:$bias, + I32Attr:$shift); + + let results = (outs TensorOf<[QI8]>:$output); +} + +def XC_MeanOp : XC_Op<"mean", [Pure]> { + let summary = "Mean op"; + + let description = [{Mean op.}]; + + let arguments = (ins TensorOf<[QI8]>:$input, + + I32Attr:$start, I32Attr:$mean, I32Attr:$end, F32Attr:$in_zero_point, + F32Attr:$out_zero_point, F32Attr:$scale_mul); + + let results = (outs TensorOf<[QI8]>:$output); +} + +def XC_MeanI16Op : XC_Op<"meani16", [Pure]> { + let summary = "Mean int16 op"; + + let description = [{Mean int16 op.}]; + + let arguments = (ins TensorOf<[QI16]>:$input, + + I32Attr:$start, I32Attr:$mean, I32Attr:$end, F32Attr:$scale_mul); + + let results = (outs TensorOf<[QI16]>:$output); +} + +def XC_MulOp : XC_Op<"mul", [Pure, XC_MemoryOverlappable]> { + let summary = "Mul op"; + + let description = [{Mul op.}]; + + let arguments = (ins TensorOf<[QI8]>:$input1, TensorOf<[QI8]>:$input2, + + StrAttr:$mul_params); + + let results = (outs TensorOf<[QI8]>:$output); +} + +def XC_UnaryI16_Quantize : I32EnumAttrCase<"Quantize", 0>; +def XC_UnaryI16_Requantize : I32EnumAttrCase<"Requantize", 1>; +def XC_UnaryI16_Dequantize : I32EnumAttrCase<"Dequantize", 2>; +def XC_UnaryI16_OpTypeAttr + : I32EnumAttr<"UnaryI16OpType", "op type enum", + [XC_UnaryI16_Quantize, XC_UnaryI16_Requantize, + XC_UnaryI16_Dequantize]>; + +def XC_UnaryI16Op : XC_Op<"unaryi16", [Pure]> { + let summary = "Unary I16 op"; + + let description = [{Unary I16 op.}]; + + let arguments = (ins TensorOf<[QI16, F32]>:$input, TensorOf<[UI8]>:$blob, + + I32Attr:$op_type); + + let results = (outs TensorOf<[QI16, F32]>:$output); +} + +def XC_BinaryI16_Add : I32EnumAttrCase<"Add", 0>; +def XC_BinaryI16_Mul : I32EnumAttrCase<"Mul", 1>; +def XC_BinaryI16_OpTypeAttr + : I32EnumAttr<"BinaryI16OpType", + "op type enum", [XC_BinaryI16_Add, XC_BinaryI16_Mul]>; + +def XC_BinaryI16Op : XC_Op<"binaryi16", [Pure, XC_MemoryOverlappable]> { + let summary = "Binary I16 op"; + + let description = [{Binary I16 op.}]; + + let arguments = (ins TensorOf<[QI16]>:$input1, TensorOf<[QI16]>:$input2, + TensorOf<[UI8]>:$blob, + + I32Attr:$op_type); + + let results = (outs TensorOf<[QI16]>:$output); +} + +def XC_Beta_ActivationF32Op + : XC_Op<"beta_activationf32", [Pure, XC_MemoryOverlappable]> { + let summary = "Beta ActivationF32 op"; + + let description = [{Beta ActivationF32 op.}]; + + let arguments = (ins TensorOf<[F32]>:$input, I32Attr:$type); + + let results = (outs TensorOf<[F32]>:$output); +} + +def XC_Beta_ConcatF32Op : XC_Op<"beta_concatf32", [Pure]> { + let summary = "Beta ConcatF32 op"; + + let description = [{Beta ConcatF32 op.}]; + + let arguments = (ins Variadic>:$input); + + let results = (outs TensorOf<[F32]>:$output); +} + +def XC_Beta_ConvF32Op : XC_Op<"beta_convf32", [Pure]> { + let summary = "Beta ConvF32 op"; + + let description = [{Beta ConvF32 op.}]; + + let arguments = (ins TensorOf<[F32]>:$input, TensorOf<[F32, UI8]>:$kernels, + TensorOf<[F32]>:$bias); + + let results = (outs TensorOf<[F32]>:$output); +} + +def XC_Beta_TransposeConvF32Op : XC_Op<"beta_transposeconvf32", [Pure]> { + let summary = "Beta Transpose ConvF32 op"; + + let description = [{Beta Transpose ConvF32 op.}]; + + let arguments = (ins TensorOf<[F32]>:$input, TensorOf<[F32, UI8]>:$kernels, + TensorOf<[F32]>:$bias); + + let results = (outs TensorOf<[F32]>:$output); +} + +def XC_Beta_FcF32Op : XC_Op<"beta_fcf32", [Pure]> { + let summary = "Beta Fc F32 op"; + + let description = [{Beta Fc ConvF32 op.}]; + + let arguments = (ins TensorOf<[F32]>:$input, TensorOf<[F32, UI8]>:$kernels); + + let results = (outs TensorOf<[F32]>:$output); +} + +def XC_MaxPool2DOp : XC_Op<"maxpool2d", [Pure]> { + let summary = "MaxPool2D op"; + + let description = [{MaxPool2D op.}]; + + let arguments = (ins TensorOf<[QI8]>:$input, + // The scratch buffer tensor + AnyTypeOf<[TensorOf<[I8]>, NoneType]>:$scratch_tensor, + StrAttr:$memcpy_fn_param, StrAttr:$aggregate_fn_param, + StrAttr:$output_transform_fn_param, I32Attr:$scratch_bytes, + I32Attr:$thread_count, StrArrayAttr:$abstract_kernel_params); + + let results = (outs TensorOf<[QI8]>:$output); +} + +def XC_SoftmaxOp : XC_Op<"softmax", [Pure]> { + let summary = "Softmax op"; + + let description = [{Softmax op.}]; + + let arguments = (ins TensorOf<[QI8]>:$input, TensorOf<[F32]>:$lut); + + let results = (outs TensorOf<[QI8]>:$output); +} + +def XC_BatchedSoftmaxOp : XC_Op<"batched_softmax", [Pure]> { + let summary = "Batched softmax op"; + + let description = [{Batched softmax op.}]; + + let arguments = (ins TensorOf<[QI8]>:$input, TensorOf<[F32]>:$lut); + + let results = (outs TensorOf<[QI8]>:$output); +} + +def XC_Conv2DV2Op : XC_Op<"conv2d_v2", [Pure]> { + let summary = "Conv2D V2 op"; + + let description = [{Conv2D V2 op.}]; + + let arguments = (ins + // I32 input is for BNNs + TensorOf<[QI8, QI16, I32]>:$input, + TensorOf<[I8]>:$weights, TensorOf<[I16, I32]>:$mulsbiases_or_thresholds, + // The partial output parameter is used when we chain convolutions + AnyTypeOf<[TensorOf<[QI8, QI16]>, NoneType]>:$partial_output, + // The scratch buffer tensor + AnyTypeOf<[TensorOf<[I8]>, NoneType]>:$scratch_tensor, + StrAttr:$conv2d_kernel_type, StrAttr:$memcpy_fn_param, + StrAttr:$aggregate_fn_param, StrAttr:$output_transform_fn_param, + StrAttr:$output_transform_type, I32Attr:$scratch_bytes, + I32Attr:$thread_count, StrArrayAttr:$abstract_kernel_params); + + // I32 output is for BNNs + let results = (outs TensorOf<[QI8, QI16, I32]>:$output); +} + +// This op is not exported to the flatbuffer +def XC_FakeScratchBufferOp : XC_Op<"fake_scratch", [Pure]> { + let summary = "Fake scratch buffer op"; + + let description = [{Fake scratch buffer op.}]; + + let results = (outs TensorOf<[I8]>:$output); +} + +def XC_FakeConv2DOp : XC_Op<"fake_conv2d", [Pure]> { + let summary = "Fake Conv2D op"; + + let description = [{Fake Conv2D op.}]; + + let arguments = (ins TensorOf<[QI8, QI16]>:$input, TensorOf<[QI8]>:$filter, + AnyTypeOf<[TensorOf<[I32, QI32]>, NoneType]>:$bias, + // The partial output parameter is used when we chain convolutions + AnyTypeOf<[TensorOf<[QI8, QI16]>, NoneType]>:$partial_output, + I32Attr:$dilation_h_factor, I32Attr:$dilation_w_factor, + StrAttr:$fused_activation_function, StrAttr:$padding, + // For using explicit padding + AnyTypeOf<[TensorOf<[I32, I64]>, NoneType]>:$padding_values, + I32Attr:$stride_h, I32Attr:$stride_w, + // The following parameters are used when we chain convolutions + // so that we can read and write to the correct locations + I32Attr:$output_sub_h, I32Attr:$output_sub_w, I32Attr:$output_stride_h, + I32Attr:$output_stride_w, I32Attr:$input_offset); + + let results = (outs TensorOf<[QI8, QI16]>:$output); +} + +def XC_FakeDepthwiseConv2DOp : XC_Op<"fake_depthwise_conv2d", [Pure]> { + let summary = "Fake Depthwise Conv2D op"; + + let description = [{Fake Depthwise Conv2D op.}]; + + let arguments = (ins TensorOf<[QI8, QI16]>:$input, TensorOf<[QI8]>:$filter, + AnyTypeOf<[TensorOf<[I32, QI32]>, NoneType]>:$bias, + I32Attr:$dilation_h_factor, I32Attr:$dilation_w_factor, + StrAttr:$fused_activation_function, StrAttr:$padding, + // For using explicit padding + AnyTypeOf<[TensorOf<[I32, I64]>, NoneType]>:$padding_values, + I32Attr:$stride_h, I32Attr:$stride_w, I32Attr:$depth_multiplier); + + let results = (outs TensorOf<[QI8, QI16]>:$output); +} + +def XC_LookupOp : XC_Op<"lookup", [Pure, XC_MemoryOverlappable, + XC_OnlyOverlappableWithInput]> { + let summary = "Lookup table op"; + + let description = [{Lookup table op.}]; + + let arguments = (ins TensorOf<[QI8, QI16]>:$input, TensorOf<[UI8]>:$lut); + + let results = (outs TensorOf<[QI8, QI16]>:$output); +} + +def XC_Pad3To4Op : XC_Op<"pad_3_to_4", [Pure, XC_MemoryOverlappable]> { + let summary = "Pad 3 to 4 op"; + + let description = [{Pad 3 to 4 op.}]; + + let arguments = (ins TensorOf<[QI8]>:$input, I32Attr:$pad_value); + + let results = (outs TensorOf<[QI8]>:$output); +} + +def XC_Pad1To4Op : XC_Op<"pad_1_to_4", [Pure, XC_MemoryOverlappable]> { + let summary = "Pad 1 to 4 op"; + + let description = [{Pad 1 to 4 op.}]; + + let arguments = (ins TensorOf<[QI8]>:$input, I32Attr:$pad_value); + + let results = (outs TensorOf<[QI8]>:$output); +} + +def XC_Expand8To16Op : XC_Op<"expand_8_to_16", [Pure]> { + let summary = "Expand weights from 8 bit to 16 bits op"; + + let description = [{Expand weights from 8 bit to 16 bits op.}]; + + let arguments = (ins TensorOf<[I8]>:$input); + + let results = (outs TensorOf<[I8]>:$output); +} + +def XC_LoadConstantOp + : XC_Op<"ld_constant", [Pure, SameOperandsAndResultType]> { + let summary = "Load constant op"; + + let description = [{Load constant op.}]; + + let arguments = (ins AnyTensor:$input); + + let results = (outs AnyTensor:$output); +} + +def XC_NoOp : XC_Op<"no_op", [Pure, XC_MemoryOverlappable, XC_NonModifying]> { + let summary = "No op"; + + let description = [{No op.}]; + + let arguments = (ins AnyTensor:$input); + + let results = (outs AnyTensor:$output); +} + +def XC_LoadWeights_Sync : I32EnumAttrCase<"Sync", 0>; +def XC_LoadWeights_DDR : I32EnumAttrCase<"DDR", 1>; +def XC_LoadWeights_Async : I32EnumAttrCase<"Async", 2>; +def XC_LoadWeights_OpTypeAttr + : I32EnumAttr<"LoadWeightsOpType", "op type enum", + [XC_LoadWeights_Sync, XC_LoadWeights_DDR, + XC_LoadWeights_Async]>; + +def XC_LoadWeightsOp : XC_Op<"ld_weights", [Pure]> { + let summary = "Load weights op"; + + let description = [{Load weights op.}]; + + let arguments = (ins I32Attr:$address, I32ArrayAttr:$sizes, StrAttr:$op_type); + + let results = (outs Variadic:$output); +} + +def XC_LoadWeightsWaitOp + : XC_Op<"ld_weights_wait", [Pure, XC_MemoryOverlappable, XC_NonModifying]> { + let summary = "Load weights wait op"; + + let description = [{Load weights wait op.}]; + + let arguments = (ins Variadic:$input); + + let results = (outs Variadic:$output); +} + +def XC_StoreTensorOp : XC_Op<"store_tensor", [Pure]> { + let summary = "Store tensor op"; + + let description = [{Store tensor op.}]; + + let arguments = (ins AnyTensor:$input, I32Attr:$address, I32Attr:$size); + + let results = (outs AnyTensor:$output); +} + +def XC_LoadTensorOp : XC_Op<"load_tensor", [Pure]> { + let summary = "Load tensor op"; + + let description = [{Load tensor op.}]; + + let arguments = (ins Variadic, NoneType]>>:$input, + I32Attr:$address, I32Attr:$size); + + let results = (outs AnyTensor:$output); +} + +def XC_Bsign8Op : XC_Op<"bsign_8", [Pure]> { + let summary = "Binary sign op"; + + let description = [{Binary sign op.}]; + + let arguments = (ins TensorOf<[QI8]>:$input); + + let results = (outs TensorOf<[I32]>:$output); +} + +#endif // XCORE_DIALECT diff --git a/xformer/README.md b/xformer/README.md new file mode 100644 index 000000000..9311a7a3b --- /dev/null +++ b/xformer/README.md @@ -0,0 +1,59 @@ +Build instructions +-- + +`Bazel` is used to build this program. The choice of build system is +driven by the most complex dependency (Tensorflow). + +Note before the first step ensure that you are in the conda venv as +mentioned [here](https://github.com/xmos/ai_tools#readme) and +have followed all steps including installing the necessary Python +packages from `requirements.txt`. + +Also note that submodules need to be cloned and tflite-micro needs to be patched before building `xformer`. +The following command should be run from this repo's root: + + ./build.sh -T init + +See instructions [here](https://github.com/xmos/ai_tools/blob/develop/docs/rst/build-from-source.rst) + +With Bazel installed (check `.bazelversion` for current version or use [bazelisk](https://github.com/bazelbuild/bazelisk) which handles this for you), +you can build with the following command (make sure you run it from the directory /ai_tools/xformer): + + bazel build //:xcore-opt + +or if you are using bazelisk: + + bazelisk build //:xcore-opt + +To run the binary on an input tflite file: + + ./bazel-bin/xcore-opt -o + +To view the various supported options: + + ./bazel-bin/xcore-opt --help + + +Python package instructions +-- + +After building the xcore-opt binary, the python package can be built +with the following command (make sure you run it from the directory +/ai_tools/xformer/python): + + cd python + python setup.py bdist_wheel + +The wheel file will be created in a newly created `dist` folder. +This can now be installed via pip or uploaded to pypi via twine. + +Test instructions +-- + +We use [llvm-lit](https://llvm.org/docs/CommandGuide/lit.html) for writing unit tests. This makes it easier to test the impact of a single pass. To run all lit tests in the `Test` folder, use the following command: + + bazel test //Test:all + +An individual test can be run by combining the `test filename` and `.test` suffix to create the bazel target name. For example, the following command: + + bazel test //Test:xcfc-to-tflcustom.mlir.test diff --git a/experimental/TESTING.rst b/xformer/TESTING.rst similarity index 100% rename from experimental/TESTING.rst rename to xformer/TESTING.rst diff --git a/experimental/xformer/Test/BUILD b/xformer/Test/BUILD similarity index 100% rename from experimental/xformer/Test/BUILD rename to xformer/Test/BUILD diff --git a/xformer/Test/activation-lowering.mlir b/xformer/Test/activation-lowering.mlir new file mode 100644 index 000000000..d2d84eddf --- /dev/null +++ b/xformer/Test/activation-lowering.mlir @@ -0,0 +1,120 @@ +// RUN: xcore-opt --mlir-io %s --xcore-apply-xcpatterns | FileCheck %s + +// CHECK-LABEL: relu_1 +func.func @relu_1(%arg0: tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> attributes {tf.entry_function = {inputs = "lambda_input_int8", outputs = "Identity_int8"}} { + // CHECK: "0x828486888A8C8E90929496989A9C9EA0A2A4A6A8AAACAEB0B2B4B6B8BABCBEC0C2C4C6C8CACCCED0D2D4D6D8DADCDEE0E2E4E6E8EAECEEF0F2F4F6F8FAFCFE00020406080A0C0E10121416181A1C1E20222426282A2C2E30323436383A3C3E40424446484A4C4E50525456585A5C5E60626466686A6C6E70727476787A7C7E7F8080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080" + // CHECK-SAME: tensor<256xui8> + // CHECK: xc.lookup + %0 = "tfl.relu"(%arg0) : (tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> + return %0 : tensor<1x12x4x7x!quant.uniform> +} + +// ----- + +// CHECK-LABEL: relu_2 +func.func @relu_2(%arg0: tensor<1x12x2x4x!quant.uniform>) -> tensor<1x12x2x4x!quant.uniform> attributes {tf.entry_function = {inputs = "lambda_input_int8", outputs = "Identity_int8"}} { + // CHECK: "0x828486888A8C8E90929496989A9C9EA0A2A4A6A8AAACAEB0B2B4B6B8BABCBEC0C2C4C6C8CACCCED0D2D4D6D8DADCDEE0E2E4E6E8EAECEEF0F2F4F6F8FAFCFE00020406080A0C0E10121416181A1C1E20222426282A2C2E30323436383A3C3E40424446484A4C4E50525456585A5C5E60626466686A6C6E70727476787A7C7E7F8080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080" + // CHECK-SAME: tensor<256xui8> + // CHECK: xc.lookup + %0 = "tfl.relu"(%arg0) : (tensor<1x12x2x4x!quant.uniform>) -> tensor<1x12x2x4x!quant.uniform> + return %0 : tensor<1x12x2x4x!quant.uniform> +} + +// ----- + +// CHECK-LABEL: relu6_1 +func.func @relu6_1(%arg0: tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> attributes {tf.entry_function = {inputs = "lambda_input_int8", outputs = "Identity_int8"}} { + // CHECK: "0x828486888A8C8E90929496989A9C9EA0A2A4A6A8AAACAEB0B2B4B6B8BABCBEC0C2C4C6C8CACCCED0D2D4D6D8DADCDEE0E2E4E6E8EAECEEF0F2F4F6F8FAFCFE00020406080A0C0E10121416181A1C1E20222426282A2C2E30323436383A3C3E40424446484A4C4E50525456585A5C5E60626466686A6C6E70727476787A7C7E7F8080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080" + // CHECK-SAME: tensor<256xui8> + // CHECK: xc.lookup + %0 = "tfl.relu6"(%arg0) : (tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> + return %0 : tensor<1x12x4x7x!quant.uniform> +} + +// ----- + +// CHECK-LABEL: relu6_2 +func.func @relu6_2(%arg0: tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> attributes {tf.entry_function = {inputs = "lambda_input_int8", outputs = "Identity_int8"}} { + // CHECK: "0x828486888A8C8E90929496989A9C9EA0A2A4A6A8AAACAEB0B2B4B6B8BABCBEC0C2C4C6C8CACCCED0D2D4D6D8DADCDEE0E2E4E6E8EAECEEF0F2F4F6F8FAFCFE00020406080A0C0E10121416181A1C1E20222426282A2C2E30323436383A3C3E40424446484A4C4E50525456585A5C5E60626466686A6C6E70727476787A7C7E7F8080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080" + // CHECK-SAME: tensor<256xui8> + // CHECK: xc.lookup + %0 = "tfl.relu6"(%arg0) : (tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> + return %0 : tensor<1x12x4x7x!quant.uniform> +} + +// ----- + +// CHECK-LABEL: tanh_1 +func.func @tanh_1(%arg0: tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> attributes {tf.entry_function = {inputs = "lambda_input_int8", outputs = "Identity_int8"}} { + // CHECK: "0x828486888A8C8E90929496989A9C9EA0A2A4A6A8AAACAEAFB1B3B5B7B9BBBDBFC1C2C4C6C8CACCCDCFD1D3D5D6D8DADCDDDFE1E3E4E6E8E9EBEDEEF0F1F3F5F6F8F9FBFCFEFF0102040507080A0B0C0E0F111213151617191A1B1C1E1F2021222425262728292A2C2D2E2F303132333435363738393A3B3C3D3D3E3F404142438080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080" + // CHECK-SAME: tensor<256xui8> + // CHECK: xc.lookup + %0 = "tfl.tanh"(%arg0) : (tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> + return %0 : tensor<1x12x4x7x!quant.uniform> +} + +// ----- + +// CHECK-LABEL: tanh_2 +func.func @tanh_2(%arg0: tensor<1x5x2x2x!quant.uniform>) -> tensor<1x5x2x2x!quant.uniform> attributes {tf.entry_function = {inputs = "lambda_input_int8", outputs = "Identity_int8"}} { + // CHECK: "0x84888C9094989C9FA3A7AAAEB1B5B8BBBEC1C4C7CACCCFD1D4D6D8DADCDEE0E1E3E5E6E7E9EAEBECEDEEEFF0F1F2F3F4F4F5F6F6F7F7F8F8F9F9F9FAFAFAFBFBFBFCFCFCFCFCFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080" + // CHECK-SAME: tensor<256xui8> + // CHECK: xc.lookup + %0 = "tfl.tanh"(%arg0) : (tensor<1x5x2x2x!quant.uniform>) -> tensor<1x5x2x2x!quant.uniform> + return %0 : tensor<1x5x2x2x!quant.uniform> +} + +// ----- + +// CHECK-LABEL: logistic_1 +func.func @logistic_1(%arg0: tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> attributes {tf.entry_function = {inputs = "lambda_input_int8", outputs = "Identity_int8"}} { + // CHECK: "0x000101020203030404050506060707080809090A0A0B0B0C0C0D0D0E0E0F0F0F10101111121213131414151516161717181819191A1A1B1B1C1C1D1D1E1E1E1F1F202021212222232324242425252626272728282929292A2A2B2B2C2C2D2D2D2E2E2F2F3030303131323233333334343535353636373738383839393A3A3A3BC5C5C6C6C6C7C7C8C8C8C9C9CACACBCBCBCCCCCDCDCDCECECFCFD0D0D0D1D1D2D2D3D3D3D4D4D5D5D6D6D7D7D7D8D8D9D9DADADBDBDCDCDDDDDDDEDEDFDFE0E0E1E1E2E2E3E3E4E4E4E5E5E6E6E7E7E8E8E9E9EAEAEBEBECECEDEDEEEEEFEFF0F0F1F1F2F2F3F3F4F4F5F5F6F6F7F7F8F8F9F9FAFAFBFBFCFCFDFDFEFEFFFF00" + // CHECK-SAME: tensor<256xui8> + // CHECK: xc.lookup + %0 = "tfl.logistic"(%arg0) : (tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> + return %0 : tensor<1x12x4x7x!quant.uniform> +} + +// ----- + +// CHECK-LABEL: logistic_2 +func.func @logistic_2(%arg0: tensor<1x4x4x4x!quant.uniform>) -> tensor<1x4x4x4x!quant.uniform> attributes {tf.entry_function = {inputs = "lambda_input_int8", outputs = "Identity_int8"}} { + // CHECK: "0xC1C2C3C4C5C6C7C8C9CACBCCCDCECFCFD0D1D2D3D4D5D6D7D8D8D9DADBDCDDDDDEDFE0E0E1E2E3E3E4E5E5E6E7E7E8E8E9EAEAEBEBECECEDEDEEEEEFEFF0F0F0F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFAFBFBFBFBFBFBFBFCFCFCFCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFD82828283838383838383838383838484848484848484858585858585858686868686878787878788888888898989898A8A8A8A8B8B8B8C8C8C8D8D8E8E8E8F8F909090919192929393949495959697979898999A9A9B9C9C9D9E9E9FA0A1A1A2A3A4A5A5A6A7A8A9AAABACACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0" + // CHECK-SAME: tensor<256xui8> + // CHECK: xc.lookup + %0 = "tfl.logistic"(%arg0) : (tensor<1x4x4x4x!quant.uniform>) -> tensor<1x4x4x4x!quant.uniform> + return %0 : tensor<1x4x4x4x!quant.uniform> +} + +// ----- + +// CHECK-LABEL: tanh_i16_1 +func.func @tanh_i16_1(%arg0: tensor<1x96x!quant.uniform> {tf_saved_model.index_path = ["conv2d_input"]}) -> (tensor<1x96x!quant.uniform> {tf_saved_model.index_path = ["conv2d"]}) attributes {tf.entry_function = {inputs = "serving_default_conv2d_input:0", outputs = "StatefulPartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + // CHECK: "0x02B6008000000000E9C10080000000006DD000800000000026E2008000000000C9F70080000000002F120180000000006632018000000000B659018000000000AE8901800000000039C4018000000000B00B028000000000E1620280000000004ACD028000000000234F0380000000009CED03800000000002AF0480000000000A9B05800000010001BB068000000100761A0880000001005BC7098000000100BBD20B800000010066510E8000000100BE5C118000000200C5131580000002002B9C1980000003001C241F8000000300C2E3258000000400A81F2E80000005005A2B388000000600B56C448000000700E35F5380000008001B9C658000000A008BD97B8001000C006AF8968001000F008609B880010012008758E080010016005578118101001B00E5514D8102002100EB35968102002800A7F1EE8102003100A5E75A8203003B00412CDE8204004800C8A67D8304005800FC363F8405006B0091DE29850600810054EE458607009C00A5349D870900BC00B12A3B890A00E300FD1B2D8B0C0011016640828D0F004601BEBF4B9011008501AA919C931300CE01D92889971600210229D8269C19007F0282DD8AA11B00E702A204C9A71D00590367DCF1AE1F00D1038A8C10B71F004E04EF7328C01E00C904EED732CA1C003F05D0091DD51800A8059B78C7E01300FE05341806ED0C003B06EF59A2F904005B0644A55E06FC005B060FE7FA12F4003B06C586391FED00FE05B6F5E32AE800A805C227CE35E4003F05EA8BD83FE200C9047273F048E1004E04B2230F51E100D1038CFB3758E3005903B922765EE500E7021A28DA63E7007F026CD77768EA002102996E646CED00CE018140B56FEF008501D4BF7E72F100460137E4D374F40011017CD5C576F600E30083CB6378F700BC00CE11BB79F9009C008C21D77AFA0081001CC9C17BFB006B004D59837CFC005800D0D3227DFC0048006918A67DFD003B00640E127EFE0031001FCA6A7EFE00280023AEB37EFE002100B187EF7EFF001B007FA7207FFF0016007EF6487FFF0012009A076A7FFF000F007826857FFF000C00E7639B7F00000A001FA0AD7F000008004D93BC7F00000700A7D4C87F0000060059E0D27F000005003F1CDB7F00000400E5DBE17F00000300D663E77F000003003BECEB7F0000020042A3EF7F000002009AAEF27F00000100462DF57F00000100A538F77F000001008AE5F87F00000100FF44FA7F00000100F664FB7F00000100FE50FC7F000000006412FD7F00000000DDB0FD7F00000000B632FE7F000000001F9DFE7F0000000050F4FE7F00000000C73BFF7F000000005276FF7F000000004AA6FF7F000000009ACDFF7F00000000D1EDFF7F00000000FFFFFF7F00000000FFFFFF7F00000000FFFFFF7F00000000FFFFFF7F00000000FFFFFF7F00000000" + // CHECK-SAME: tensor<1024xui8> + // CHECK: xc.lookup + %0 = "tfl.tanh"(%arg0) : (tensor<1x96x!quant.uniform>) -> tensor<1x96x!quant.uniform> + return %0 : tensor<1x96x!quant.uniform> +} + +// ----- + +// CHECK-LABEL: tanh_i16_2 +func.func @tanh_i16_2(%arg0: tensor<1x129x!quant.uniform> {tf_saved_model.index_path = ["conv2d_input"]}) -> (tensor<1x129x!quant.uniform> {tf_saved_model.index_path = ["conv2d"]}) attributes {tf.entry_function = {inputs = "serving_default_conv2d_input:0", outputs = "StatefulPartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + // CHECK: "0x02B6008000000000E9C10080000000006DD000800000000026E2008000000000C9F70080000000002F120180000000006632018000000000B659018000000000AE8901800000000039C4018000000000B00B028000000000E1620280000000004ACD028000000000234F0380000000009CED03800000000002AF0480000000000A9B05800000010001BB068000000100761A0880000001005BC7098000000100BBD20B800000010066510E8000000100BE5C118000000200C5131580000002002B9C1980000003001C241F8000000300C2E3258000000400A81F2E80000005005A2B388000000600B56C448000000700E35F5380000008001B9C658000000A008BD97B8001000C006AF8968001000F008609B880010012008758E080010016005578118101001B00E5514D8102002100EB35968102002800A7F1EE8102003100A5E75A8203003B00412CDE8204004800C8A67D8304005800FC363F8405006B0091DE29850600810054EE458607009C00A5349D870900BC00B12A3B890A00E300FD1B2D8B0C0011016640828D0F004601BEBF4B9011008501AA919C931300CE01D92889971600210229D8269C19007F0282DD8AA11B00E702A204C9A71D00590367DCF1AE1F00D1038A8C10B71F004E04EF7328C01E00C904EED732CA1C003F05D0091DD51800A8059B78C7E01300FE05341806ED0C003B06EF59A2F904005B0644A55E06FC005B060FE7FA12F4003B06C586391FED00FE05B6F5E32AE800A805C227CE35E4003F05EA8BD83FE200C9047273F048E1004E04B2230F51E100D1038CFB3758E3005903B922765EE500E7021A28DA63E7007F026CD77768EA002102996E646CED00CE018140B56FEF008501D4BF7E72F100460137E4D374F40011017CD5C576F600E30083CB6378F700BC00CE11BB79F9009C008C21D77AFA0081001CC9C17BFB006B004D59837CFC005800D0D3227DFC0048006918A67DFD003B00640E127EFE0031001FCA6A7EFE00280023AEB37EFE002100B187EF7EFF001B007FA7207FFF0016007EF6487FFF0012009A076A7FFF000F007826857FFF000C00E7639B7F00000A001FA0AD7F000008004D93BC7F00000700A7D4C87F0000060059E0D27F000005003F1CDB7F00000400E5DBE17F00000300D663E77F000003003BECEB7F0000020042A3EF7F000002009AAEF27F00000100462DF57F00000100A538F77F000001008AE5F87F00000100FF44FA7F00000100F664FB7F00000100FE50FC7F000000006412FD7F00000000DDB0FD7F00000000B632FE7F000000001F9DFE7F0000000050F4FE7F00000000C73BFF7F000000005276FF7F000000004AA6FF7F000000009ACDFF7F00000000D1EDFF7F00000000FFFFFF7F00000000FFFFFF7F00000000FFFFFF7F00000000FFFFFF7F00000000FFFFFF7F00000000" + // CHECK-SAME: tensor<1024xui8> + // CHECK: xc.lookup + %0 = "tfl.tanh"(%arg0) : (tensor<1x129x!quant.uniform>) -> tensor<1x129x!quant.uniform> + return %0 : tensor<1x129x!quant.uniform> +} + +// ----- + +// CHECK-LABEL: sigmoid_i16_1 +func.func @sigmoid_i16_1(%arg0: tensor<1x96x!quant.uniform> {tf_saved_model.index_path = ["conv2d_input"]}) -> (tensor<1x96x!quant.uniform> {tf_saved_model.index_path = ["conv2d"]}) attributes {tf.entry_function = {inputs = "serving_default_conv2d_input:0", outputs = "StatefulPartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + // CHECK: "0x482F3B00000003003051410000000300C91648000000040011914F0000000400C3D257000000040088F060000000050026016B0000000500B51D760000000600DA618200000006000CEC8F0000000700D4DD9E00000008001E5CAF00000009008A8FC10000000A00C8A4D50000000B00F9CCEB0000000C001A3E040100000D0077331F0100000E0024EE3C010000100084B55D0100001100D4D7810100001300C0AAA90101001500068CD5010100170019E2050201001900D11C3B0201001C0020B6750201001F00CC32B602010022002A23FD0201002500DC234B030100290085DEA00301002D007E0AFF0301003100726D660401003600EFDBD70401003B00D239540501004100927ADC050200470054A1710602004E00C2C014070200550096FAC60702005D00C57E890802006600358A5D0902006F00F764440A03007800E65F3F0B030083009BD14F0C03008E00A112770D03009A00E578B60E0300A60038520F100300B3000EDE82110300C100394612130400CF00ED96BE140400DE0001B688160400ED00925971180400FC0051FE781A04000C01C1DD9F1C04001B01A1E4E51E04002B0130AA4A2104003A015568CD2304004901A5F56C26030057015BC1272903006401D5D1FB2B030070011DC6E62E03007B016EDAE5310200840148F0F53402008C016C9913380100920126263B3B01009601E3B5683E000098010E4A984100009801D3D9C544FF0096018A66ED47FF009201AD0F0B4BFE008C0185251B4EFE008401DF391A51FD007B01202E0554FD007001A33ED956FD006401580A9459FD005701AB97335CFC004901D455B65EFC003A015B1B1B61FC002B013D226163FC001B01B1018865FC000C0170A68F67FC00FC00024A7869FC00ED001169426BFC00DE00C8B9EE6CFC00CF00F5217E6EFD00C100CAADF16FFD00B30021874A71FD00A60061ED8972FD009A006D2EB173FD008E001CA0C174FD0083000C9BBC75FD007800D375A376FE006F003E817777FE0066006B053A78FE005D00403FEC78FE005500AE5E8F79FE004E006E85247AFE00470032C6AC7AFF0041001424297BFF003B0091929A7BFF00360084F5017CFF0031008021607CFF002D0026DCB57CFF002900D7DC037DFF00250033CD4A7DFF002200E2498B7DFF001F0030E3C57DFF001C00E91DFB7DFF00190002742B7EFF0017004055577EFF0015002F287F7E000013007D4AA37E00001100D811C47E0000100086CCE17E00000E00E1C1FC7E00000D000933157F00000C00365B2B7F00000B0078703F7F00000A00E2A3517F000009002D22627F00000800FA13717F00000700269E7E7F000006004AE28A7F00000600DAFE957F00000500750FA07F000005003A2DA97F00000400F26EB17F0000040036E9B87F00000400CEAEBF7F00000300B7D0C57F00000300" + // CHECK-SAME: tensor<1024xui8> + // CHECK: xc.lookup + %0 = "tfl.logistic"(%arg0) : (tensor<1x96x!quant.uniform>) -> tensor<1x96x!quant.uniform> + return %0 : tensor<1x96x!quant.uniform> +} \ No newline at end of file diff --git a/xformer/Test/add_broadcast.mlir b/xformer/Test/add_broadcast.mlir new file mode 100644 index 000000000..faf8920be --- /dev/null +++ b/xformer/Test/add_broadcast.mlir @@ -0,0 +1,9 @@ +// RUN: xcore-opt --mlir-io %s --xcore-replace-addsub | FileCheck %s + +// CHECK-LABEL: add_broadcast +func.func @add_broadcast(%arg0: tensor<1x15x1x1x!quant.uniform> {tf_saved_model.index_path = ["input_1"]}) -> (tensor> {tf_saved_model.index_path = ["add"]}) attributes {tf.entry_function = {inputs = "serving_default_input_1:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + // CHECK: xc.add + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1x15x5x4x!quant.uniform>, value = dense<"0xE2C0F3CCE60A09CB1A1B3705FBC416FFDCEF06D4F41603E0D70404EBEC2DE5331FEFE61416F407D12ABBFA7F23190229D580243AF4E8DEB0D50428EB1110E202FCE2F435F6F5F8D9043DE3C510CEEE02F619F4BCE6FBF1F30B21F4EE0EB310EF0C1115E6D520E810DC004E3C07F2CFB5BC150E0B1BFFD1503D1BC7F6FCFA2539F4DE0AD81A4031CB094853FBE30B09C61AEC28CAD53BD035DA07E519CF151E13F9CF1DF9EEE6FA1FC8D61BB0ED61C0B1E527FBCFC7144930E707F41DF3F6BEF9CF0511F81B37C32BDF10DAE30B0E09302EC9E40828F70D14FE110CE5090C1BE4EF0BFA0905F6F9A7F2EA34EADC14E6DF16EB09D025F2FAEF47FD2D09021926DD2C1ED9090521F93C21E3F10F4C1617040FF1C518EAE51A01FD1CEF16DF03FB37FC31FE07F9EE13E83FE8C565"> : tensor<1x15x5x4xi8>} : () -> tensor<1x15x5x4x!quant.uniform> + %1 = tfl.add(%arg0, %0) {fused_activation_function = "NONE"} : (tensor<1x15x1x1x!quant.uniform>, tensor<1x15x5x4x!quant.uniform>) -> tensor> + return %1 : tensor> +} diff --git a/xformer/Test/avg_pool_2d.mlir b/xformer/Test/avg_pool_2d.mlir new file mode 100644 index 000000000..0542ebecf --- /dev/null +++ b/xformer/Test/avg_pool_2d.mlir @@ -0,0 +1,40 @@ +// RUN: xcore-opt --mlir-io %s --xcore-replace-avgpool-with-conv2d | FileCheck %s + +// CHECK-LABEL: main2x2 +func.func @main2x2(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "average_pooling2d_input", outputs = "Identity"}} { + + // CHECK: tfl.depthwise_conv_2d + // CHECK-SAME: stride_h = 2 : i32 + // CHECK-SAME: stride_w = 2 : i32 + // CHECK-SAME: tensor<1x2x2x4x!quant.uniform + // CHECK-NOT: tfl.average_pool_2d + %0 = "tfl.average_pool_2d"(%arg0) {filter_height = 2 : i32, filter_width = 2 : i32, fused_activation_function = "NONE", padding = "VALID", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>) -> tensor> + // CHECK: return + return %0 : tensor> +} + +// CHECK-LABEL: main3x3 +func.func @main3x3(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "average_pooling2d_input", outputs = "Identity"}} { + + // CHECK: tfl.depthwise_conv_2d + // CHECK-SAME: stride_h = 3 : i32 + // CHECK-SAME: stride_w = 3 : i32 + // CHECK-SAME: tensor<1x3x3x4x!quant.uniform + // CHECK-NOT: tfl.average_pool_2d + %0 = "tfl.average_pool_2d"(%arg0) {filter_height = 3 : i32, filter_width = 3 : i32, fused_activation_function = "NONE", padding = "VALID", stride_h = 3 : i32, stride_w = 3 : i32} : (tensor>) -> tensor> + // CHECK: return + return %0 : tensor> +} + +// CHECK-LABEL: main4x4 +func.func @main4x4(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "average_pooling2d_input", outputs = "Identity"}} { + + // CHECK: tfl.depthwise_conv_2d + // CHECK-SAME: stride_h = 1 : i32 + // CHECK-SAME: stride_w = 1 : i32 + // CHECK-SAME: tensor<1x4x4x4x!quant.uniform + // CHECK-NOT: tfl.average_pool_2d + %0 = "tfl.average_pool_2d"(%arg0) {filter_height = 4 : i32, filter_width = 4 : i32, fused_activation_function = "NONE", padding = "VALID", stride_h = 1 : i32, stride_w = 1 : i32} : (tensor>) -> tensor> + // CHECK: return + return %0 : tensor> +} diff --git a/experimental/xformer/Test/conv2d.mlir b/xformer/Test/conv2d.mlir similarity index 90% rename from experimental/xformer/Test/conv2d.mlir rename to xformer/Test/conv2d.mlir index fc56a3804..5f7176b69 100644 --- a/experimental/xformer/Test/conv2d.mlir +++ b/xformer/Test/conv2d.mlir @@ -1,7 +1,7 @@ // RUN: xcore-opt --mlir-io %s --xcore-replace-conv2d | FileCheck %s // CHECK-LABEL: padded_indirect -func @padded_indirect(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "conv2d_input", outputs = "Identity"}} { +func.func @padded_indirect(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "conv2d_input", outputs = "Identity"}} { %0 = "tfl.pseudo_qconst"() {qtype = tensor<4x1x9x4x!quant.uniform:f32:0, {0.0078621776774525642,0.0078216465190052986,0.0078239291906356812,0.0078047262504696846}>>, value = dense<1> : tensor<4x1x9x4xi8>} : () -> tensor<4x1x9x4x!quant.uniform:f32:0, {0.0078621776774525642,0.0078216465190052986,0.0078239291906356812,0.0078047262504696846}>> %1 = "tfl.pseudo_qconst"() {qtype = tensor<4x!quant.uniform>, value = dense<0> : tensor<4xi32>} : () -> tensor<4x!quant.uniform> @@ -14,7 +14,7 @@ func @padded_indirect(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "conv2d_input", outputs = "Identity"}} { +func.func @valid_indirect(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "conv2d_input", outputs = "Identity"}} { %0 = "tfl.pseudo_qconst"() {qtype = tensor<16x3x3x16x!quant.uniform:f32:0, {0.0078621776774525642,0.0077851288951933384,0.0076941768638789654,0.007869236171245575,0.007815798744559288,0.0078112063929438591,0.0077464901842176914,0.0078260786831378936,0.0078160781413316727,0.0078216465190052986,0.0078375879675149918,0.0078175142407417297,0.0078369667753577232,0.0078147416934370995,0.0078694447875022888,0.0078470427542924881}>>, value = dense<1> : tensor<16x3x3x16xi8>} : () -> tensor<16x3x3x16x!quant.uniform:f32:0, {0.0078621776774525642,0.0077851288951933384,0.0076941768638789654,0.007869236171245575,0.007815798744559288,0.0078112063929438591,0.0077464901842176914,0.0078260786831378936,0.0078160781413316727,0.0078216465190052986,0.0078375879675149918,0.0078175142407417297,0.0078369667753577232,0.0078147416934370995,0.0078694447875022888,0.0078470427542924881}>> %1 = "tfl.pseudo_qconst"() {qtype = tensor<16x!quant.uniform>, value = dense<0> : tensor<16xi32>} : () -> tensor<16x!quant.uniform> @@ -27,7 +27,7 @@ func @valid_indirect(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "conv2d_input", outputs = "Identity"}} { +func.func @valid_direct1(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "conv2d_input", outputs = "Identity"}} { %0 = "tfl.pseudo_qconst"() {qtype = tensor<16x3x3x32x!quant.uniform:f32:0, {0.0078621776774525642,0.0078625492751598358,0.0078548826277256011,0.007869236171245575,0.0078516323119401932,0.0078112063929438591,0.0078599303960800171,0.0078289676457643509,0.0078668594360351563,0.0078529221937060356,0.0078452629968523979,0.0078603299334645271,0.0078511722385883331,0.0078590558841824532,0.0078701050952076912,0.0078737959265708923}>>, value = dense<1> : tensor<16x3x3x32xi8>} : () -> tensor<16x3x3x32x!quant.uniform:f32:0, {0.0078621776774525642,0.0078625492751598358,0.0078548826277256011,0.007869236171245575,0.0078516323119401932,0.0078112063929438591,0.0078599303960800171,0.0078289676457643509,0.0078668594360351563,0.0078529221937060356,0.0078452629968523979,0.0078603299334645271,0.0078511722385883331,0.0078590558841824532,0.0078701050952076912,0.0078737959265708923}>> %1 = "tfl.pseudo_qconst"() {qtype = tensor<16x!quant.uniform>, value = dense<0> : tensor<16xi32>} : () -> tensor<16x!quant.uniform> @@ -40,7 +40,7 @@ func @valid_direct1(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "conv2d_input", outputs = "Identity"}} { +func.func @valid_direct2(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "conv2d_input", outputs = "Identity"}} { %0 = "tfl.pseudo_qconst"() {qtype = tensor<16x1x1x32x!quant.uniform:f32:0, {0.0078621776774525642,0.0075159505940973759,0.0076126507483422756,0.0073894253000617027,0.0068393861874938011,0.0077006686478853226,0.0075865150429308414,0.0078260786831378936,0.0077599729411303997,0.0078216465190052986,0.0078239291906356812,0.0078081502579152584,0.0078369667753577232,0.0077880122698843479,0.0077783181332051754,0.0078047262504696846}>>, value = dense<1> : tensor<16x1x1x32xi8>} : () -> tensor<16x1x1x32x!quant.uniform:f32:0, {0.0078621776774525642,0.0075159505940973759,0.0076126507483422756,0.0073894253000617027,0.0068393861874938011,0.0077006686478853226,0.0075865150429308414,0.0078260786831378936,0.0077599729411303997,0.0078216465190052986,0.0078239291906356812,0.0078081502579152584,0.0078369667753577232,0.0077880122698843479,0.0077783181332051754,0.0078047262504696846}>> %1 = "tfl.pseudo_qconst"() {qtype = tensor<16x!quant.uniform>, value = dense<0> : tensor<16xi32>} : () -> tensor<16x!quant.uniform> @@ -53,7 +53,7 @@ func @valid_direct2(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "conv2d_input", outputs = "Identity"}} { +func.func @invalid_output_depth(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "conv2d_input", outputs = "Identity"}} { %0 = "tfl.pseudo_qconst"() {qtype = tensor<3x1x9x4x!quant.uniform:f32:0, {0.0078621776774525642,0.0078216465190052986,0.0078047262504696846}>>, value = dense<1> : tensor<3x1x9x4xi8>} : () -> tensor<3x1x9x4x!quant.uniform:f32:0, {0.0078621776774525642,0.0078216465190052986,0.0078047262504696846}>> %1 = "tfl.pseudo_qconst"() {qtype = tensor<3x!quant.uniform>, value = dense<0> : tensor<3xi32>} : () -> tensor<3x!quant.uniform> @@ -65,7 +65,7 @@ func @invalid_output_depth(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "conv2d_input", outputs = "Identity"}} { +func.func @invalid_input_depth(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "conv2d_input", outputs = "Identity"}} { %0 = "tfl.pseudo_qconst"() {qtype = tensor<4x1x9x3x!quant.uniform:f32:0, {0.0078621776774525642,0.0078216465190052986,0.0078239291906356812,0.0078047262504696846}>>, value = dense<1> : tensor<4x1x9x3xi8>} : () -> tensor<4x1x9x3x!quant.uniform:f32:0, {0.0078621776774525642,0.0078216465190052986,0.0078239291906356812,0.0078047262504696846}>> %1 = "tfl.pseudo_qconst"() {qtype = tensor<4x!quant.uniform>, value = dense<0> : tensor<4xi32>} : () -> tensor<4x!quant.uniform> diff --git a/xformer/Test/convpatterns.mlir b/xformer/Test/convpatterns.mlir new file mode 100644 index 000000000..906b574c6 --- /dev/null +++ b/xformer/Test/convpatterns.mlir @@ -0,0 +1,51 @@ +// RUN: xcore-opt --mlir-io %s --xcore-replace-conv2d --xcore-conv-err-threshold=0.0 | FileCheck %s + +// RUN: xcore-opt --mlir-io %s --xcore-replace-conv2d --xcore-conv-err-threshold=1.0 | FileCheck %s -check-prefix=REPLACE-CHECK + +// RUN: xcore-opt --mlir-io %s --xcore-replace-conv2d --xcore-conv-err-threshold=0.25 --xcore-force-conv-err-full-check | FileCheck %s -check-prefix=REPLACE2-CHECK + +// CHECK-LABEL: notreplaced1 +func.func @notreplaced1(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "average_pooling2d_input", outputs = "Identity"}} { + %cst = arith.constant dense<0> : tensor<4xi32> + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1x2x2x4x!quant.uniform>, value = dense<1> : tensor<1x2x2x4xi8>} : () -> tensor<1x2x2x4x!quant.uniform> + %1 = "tfl.depthwise_conv_2d"(%arg0, %0, %cst) {depth_multiplier = 1 : i32, dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "NONE", padding = "VALID", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<1x2x2x4x!quant.uniform>, tensor<4xi32>) -> tensor> + // CHECK: tfl.depthwise_conv_2d + // CHECK-SAME: {depth_multiplier = 1 : i32, dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "NONE", padding = "VALID", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<1x2x2x4x!quant.uniform>, tensor<4xi32>) -> tensor> + return %1 : tensor> +} + +// ----- + +// CHECK-LABEL: notreplaced2 +func.func @notreplaced2(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "average_pooling2d_input", outputs = "Identity"}} { + %cst = arith.constant dense<0> : tensor<4xi32> + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1x2x2x4x!quant.uniform>, value = dense<1> : tensor<1x2x2x4xi8>} : () -> tensor<1x2x2x4x!quant.uniform> + %1 = "tfl.depthwise_conv_2d"(%arg0, %0, %cst) {depth_multiplier = 1 : i32, dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "NONE", padding = "SAME", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<1x2x2x4x!quant.uniform>, tensor<4xi32>) -> tensor> + // CHECK: tfl.depthwise_conv_2d + // CHECK-SAME: {depth_multiplier = 1 : i32, dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "NONE", padding = "SAME", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<1x2x2x4x!quant.uniform>, tensor<4xi32>) -> tensor> + return %1 : tensor> +} + +// ----- + +// REPLACE-CHECK-LABEL: replaced1 +func.func @replaced1(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "average_pooling2d_input", outputs = "Identity"}} { + %cst = arith.constant dense<0> : tensor<4xi32> + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1x2x2x4x!quant.uniform>, value = dense<1> : tensor<1x2x2x4xi8>} : () -> tensor<1x2x2x4x!quant.uniform> + %1 = "tfl.depthwise_conv_2d"(%arg0, %0, %cst) {depth_multiplier = 1 : i32, dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "NONE", padding = "VALID", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<1x2x2x4x!quant.uniform>, tensor<4xi32>) -> tensor> + // REPLACE-CHECK: xc.conv2d_v2 + // REPLACE-CHECK-NOT: tfl.depthwise_conv_2d + return %1 : tensor> +} + +// ----- + +// REPLACE2-CHECK-LABEL: replaced2 +func.func @replaced2(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "average_pooling2d_input", outputs = "Identity"}} { + %cst = arith.constant dense<0> : tensor<4xi32> + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1x2x2x4x!quant.uniform>, value = dense<1> : tensor<1x2x2x4xi8>} : () -> tensor<1x2x2x4x!quant.uniform> + %1 = "tfl.depthwise_conv_2d"(%arg0, %0, %cst) {depth_multiplier = 1 : i32, dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "NONE", padding = "VALID", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<1x2x2x4x!quant.uniform>, tensor<4xi32>) -> tensor> + // REPLACE2-CHECK: xc.conv2d_v2 + // REPLACE2-CHECK-NOT: tfl.depthwise_conv_2d + return %1 : tensor> +} diff --git a/experimental/xformer/Test/fc-to-conv2d.mlir b/xformer/Test/fc-to-conv2d.mlir similarity index 83% rename from experimental/xformer/Test/fc-to-conv2d.mlir rename to xformer/Test/fc-to-conv2d.mlir index 9738aa413..366a62852 100644 --- a/experimental/xformer/Test/fc-to-conv2d.mlir +++ b/xformer/Test/fc-to-conv2d.mlir @@ -1,7 +1,7 @@ // RUN: xcore-opt --mlir-io %s --xcore-replace-fc-with-conv2d | FileCheck %s // CHECK-LABEL: valid_fc -func @valid_fc(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "flatten_input", outputs = "Identity"}} { +func.func @valid_fc(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "flatten_input", outputs = "Identity"}} { %0 = "tfl.pseudo_const"() {value = dense<[-1, 32]> : tensor<2xi32>} : () -> tensor<2xi32> // CHECK: tfl.reshape %1 = "tfl.reshape"(%arg0, %0) : (tensor>, tensor<2xi32>) -> tensor> @@ -10,15 +10,15 @@ func @valid_fc(%arg0: tensor>, tensor<32x32x!quant.uniform:f32, 0.0078694447875022888>>, tensor<32x!quant.uniform>) -> tensor> return %4 : tensor> -} \ No newline at end of file +} diff --git a/xformer/Test/invalid-loadconstantop.mlir b/xformer/Test/invalid-loadconstantop.mlir new file mode 100644 index 000000000..782952568 --- /dev/null +++ b/xformer/Test/invalid-loadconstantop.mlir @@ -0,0 +1,16 @@ +// RUN: xcore-opt --mlir-io %s --xcore-apply-loadconstantop-patterns -verify-diagnostics + +// expected-error@+1 {{Weights file option should be provided to run this pass!}} +func.func @invalid(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "flatten_input", outputs = "Identity"}} { + %cst = arith.constant dense<[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]> : tensor<10xi8> + %cst_0 = arith.constant dense<[[11, 12, 13, 14, 15, 16, 17, 18, 19, 10]]> : tensor<1x10xi16> + %cst_1 = arith.constant dense<[-1, 1, 1, 32]> : tensor<4xi64> + %cst_2 = arith.constant dense<[-1, 32]> : tensor<2xi64> + %cst_3 = "tfl.no_value"() {value} : () -> none + %0 = "tfl.pseudo_const"() {value = dense<[-1, 32]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.reshape"(%arg0, %0) : (tensor>, tensor<2xi32>) -> tensor> + %2 = "tfl.reshape"(%1, %cst_1) : (tensor>, tensor<4xi64>) -> tensor> + %3 = "xc.conv2d_v2"(%2, %cst, %cst_0, %cst_3, %cst_3) {abstract_kernel_params = ["\00\00\00\00\01\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00 \00\00\00"], aggregate_fn_param = " \08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \08\00\00\CA~=\18\FC\1C\86\1B\BE\0D\B0U\13\CC\16\B57\DA*\22I0\F9~\88c\D8K\E2\A1\F3P^\16W\8B\C0\85\F8\F5[\AB\825\05\DC\97, rQ\FCf\F6\A1\A2\B3\7F+\E5\F9\04\E1\CA\05\A8\F6\F6Iv\9BQ\B6M\B9\89\EA\1F\B1\1C\AD\8D-,C\BB\DF^\F0\1C>\82\E9\99G\AA\BB\12\D5c*\89m\03\9FP\97\14\AFP\AA\D42\A2\8C3\87P%\09M\DC\0CB\A2p\82y\BF|\13\A6\C4\F5%\D3WhW\D1\00#~\F4_\A5\F5\A2f4\85]k\8A\DD\93\0B\0B\DF\04\DD\82\AB\8A\97\91\DD\D4X\83\8A=_v=\85\A2\19\87\A4\E6\1A?F=\CC~\06\83\D1\DBU\A0\EC\82=\84%M\18\E1\D1\AB\C8\1D\8B\BE\D6h\C8\E8\F1\DD\EE`\F3\E1h75\A3\87\04/'\96\C9\10\AB\A2\147\FD\B3\C6\AE\08\F4\83JoK\93\CD\8EZ\\S\CB<\BEv[\CE\CA\B1\FB\FC\0AR\E4sV\04x\EA\99\A8z \FE+e\C9\84\AD\F2E\89\88\8B\C6\C5wa{>\BA\CF\E6\005\A5:\9F\8B\CA2\07\D0=\F2Jz\85\B7\17\CA\A5fM\DC\9F\91\1E\1Aj\DF\ED\A8I\DC\1DW\90\19\92\FA\84\11\15\9C\B7\AC\02\BD\03/\05\BFxk\BF\E4\AE\A2'p\F4d^\988M_\D7\B4!\CDn4Q\93\AE\D9\AC\B6K\0A\C4\D6\A2\16i<\B1M\A1\F2N\AD*\C0O\0CVs\E9\FA\CF\DBWEZw\9F\AF\A5bu\04{\A1!\EF\8C$&u\A9\1F&\A6\E6\22=\AEB\B8\D9\8A\F8\D7l\12\DA\09\98\10\07AP\A9yv\BC[xI\CAs\D6\A1,\E4\EF\DD\9E\F6\FA\D4\B9\B3\A6\B5j\A1&)d\0D\DA\DFV\E8\F0\F0f+\D5\AB\7Fq/\89\9A\15\81\BA2\ED`\EB\88\12\D4\C7\90i?\E7\98\AB:\E5\E2y\87\EA\93s\F4'\CBb\B1^\893\C3\C6\B6\BA\96$+\AF\EA\99\17\CE+O\B80\AC\10\DE\DCIl\B1\CATB\EA/\E9\AF\99g\00\01Y\BF/\82\A6\BF\EF0\D5k\A2\FA\1BM$\9A~@|\EFu\9By\A9>\99\E1;\0F\053G#\0B\A4\A8\1A^\E8W\07\EB`\98s\D4ZtV\1D\82A\C2\FF\13\E0\EF\F6MRP\A8\CE\22`\FC\BE\82\19\04}\B7\ED\FE\D8\197Yj\F5\BA^#f\C3\05\8F|vK\AB\E0k\D6qx\F0U\95{\D0\F1\F2\CA\B1N\FEI\C0\1990\04@\EB\0C\99\B4\9BjN\15\03\C0rd\D2\84\BA\96HZ\8CN:\8C\07@A\8C\B1DFq\C4u m\88b\10?Us\8F\8A\9C\BC\C9\A5\\\84\0E(f\8CF*\BF\FC\F72\BC\0A=k\AEG\0C2sq\B6X\07\FE\9A\22\F9c\03\BC\F7\15+r\EFOy\9E\E3\00\11#h_\A9\96\11\C5\FD\B9\82\EA,\D60}\96Z\8A .\0B\CB\D3/\AF\EC5\\\AA\DC#\8DM\8C\A7\94[TP\AD\BD+\16\87\06/8\06\D6[\C9 \F8\83C\869$EU\\\C6e\155\C7cK\CD\D4\1C\0A\19\A6E\A7\12\BC\DB\06\B5\EC\F2]rIn\D2\B6\B5DA\DA\C3N46M\A4\BE\10\16\12\C1\D7\CA=RRf\1D\A5\F6\A8\B5,\E6\0Bj\FF\EE\86C;D\E2\FD\97\08\A7\E9\06G\FBM\ECS\BE6Qe%1\14\81N\1F\DD7X\DF\9A\9D\F40\E3\1B\9F\F1\B8\A5o\AF\DB2\DF\B4\1DR\F6y\B0<\AD\CB\EAYD\D5v;M\EC\8F>f@\A6\8D,,\0EiJ\E0c\E6\E5\E8\DBR\94\E6%\03v\9DO\0A\96\BAX}\8E\CF\09\94|\06j\84\B3\FE\81H\A4-\F0\A65W\02?\BB6\B4\0A\D8B|\91\D3\22\BEw\E32\C4G#\EA\16\01|\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", conv2d_kernel_type = "ValidDirect", memcpy_fn_param = " \00\00\00 \00\00\00", output_transform_fn_param = "\E4\00\00\00 \00\00\00 \00\00\00\00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\00\00\00\00\C1\0F\A9\BD\22\03\D5\F9u\F5\B9\B8\DA\00g\F3@\B1\C1\EBQ\0A4\DF\ED\16\BD\01{\10\12\E0.\D3S\D57\12\B7\03\D1\10u\E6\AE\E0\11\F0m\FD\A3\12\A1\19\9A\D6-\BC1\EE\C3\C5\7F\EF\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk", output_transform_type = "Group" : i32, scratch_bytes = 0 : i32, thread_count = 1 : i32} : (tensor>, tensor<10xi8>, tensor<1x10xi16>, none, none) -> tensor> + %4 = "tfl.reshape"(%3, %cst_2) : (tensor>, tensor<2xi64>) -> tensor> + return %4 : tensor> +} diff --git a/xformer/Test/invalid-loadflashop.mlir b/xformer/Test/invalid-loadflashop.mlir new file mode 100644 index 000000000..8495a387b --- /dev/null +++ b/xformer/Test/invalid-loadflashop.mlir @@ -0,0 +1,18 @@ +// RUN: xcore-opt --mlir-io %s --xcore-write-weights -verify-diagnostics + +// expected-error@+1 {{Weights file option should be provided to run this pass!}} +func.func @valid(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "flatten_input", outputs = "Identity"}} { + %cst = arith.constant dense<[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]> : tensor<10xi8> + %cst_0 = arith.constant dense<[[11, 12, 13, 14, 15, 16, 17, 18, 19, 10]]> : tensor<1x10xi16> + %cst_1 = arith.constant dense<[-1, 1, 1, 32]> : tensor<4xi64> + %cst_2 = arith.constant dense<[-1, 32]> : tensor<2xi64> + %cst_3 = arith.constant dense<[-1, 32]> : tensor<2xi32> + %cst_4 = "tfl.no_value"() {value} : () -> none + %0 = "tfl.reshape"(%arg0, %cst_3) : (tensor>, tensor<2xi32>) -> tensor> + %1 = "tfl.reshape"(%0, %cst_1) : (tensor>, tensor<4xi64>) -> tensor> + %2 = "xc.ld_constant"(%cst) : (tensor<10xi8>) -> tensor<10xi8> + %3 = "xc.ld_constant"(%cst_0) : (tensor<1x10xi16>) -> tensor<1x10xi16> + %4 = "xc.conv2d_v2"(%1, %2, %3, %cst_4, %cst_4) {abstract_kernel_params = ["\00\00\00\00\01\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00 \00\00\00"], aggregate_fn_param = " \08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \08\00\00\CA~=\18\FC\1C\86\1B\BE\0D\B0U\13\CC\16\B57\DA*\22I0\F9~\88c\D8K\E2\A1\F3P^\16W\8B\C0\85\F8\F5[\AB\825\05\DC\97, rQ\FCf\F6\A1\A2\B3\7F+\E5\F9\04\E1\CA\05\A8\F6\F6Iv\9BQ\B6M\B9\89\EA\1F\B1\1C\AD\8D-,C\BB\DF^\F0\1C>\82\E9\99G\AA\BB\12\D5c*\89m\03\9FP\97\14\AFP\AA\D42\A2\8C3\87P%\09M\DC\0CB\A2p\82y\BF|\13\A6\C4\F5%\D3WhW\D1\00#~\F4_\A5\F5\A2f4\85]k\8A\DD\93\0B\0B\DF\04\DD\82\AB\8A\97\91\DD\D4X\83\8A=_v=\85\A2\19\87\A4\E6\1A?F=\CC~\06\83\D1\DBU\A0\EC\82=\84%M\18\E1\D1\AB\C8\1D\8B\BE\D6h\C8\E8\F1\DD\EE`\F3\E1h75\A3\87\04/'\96\C9\10\AB\A2\147\FD\B3\C6\AE\08\F4\83JoK\93\CD\8EZ\\S\CB<\BEv[\CE\CA\B1\FB\FC\0AR\E4sV\04x\EA\99\A8z \FE+e\C9\84\AD\F2E\89\88\8B\C6\C5wa{>\BA\CF\E6\005\A5:\9F\8B\CA2\07\D0=\F2Jz\85\B7\17\CA\A5fM\DC\9F\91\1E\1Aj\DF\ED\A8I\DC\1DW\90\19\92\FA\84\11\15\9C\B7\AC\02\BD\03/\05\BFxk\BF\E4\AE\A2'p\F4d^\988M_\D7\B4!\CDn4Q\93\AE\D9\AC\B6K\0A\C4\D6\A2\16i<\B1M\A1\F2N\AD*\C0O\0CVs\E9\FA\CF\DBWEZw\9F\AF\A5bu\04{\A1!\EF\8C$&u\A9\1F&\A6\E6\22=\AEB\B8\D9\8A\F8\D7l\12\DA\09\98\10\07AP\A9yv\BC[xI\CAs\D6\A1,\E4\EF\DD\9E\F6\FA\D4\B9\B3\A6\B5j\A1&)d\0D\DA\DFV\E8\F0\F0f+\D5\AB\7Fq/\89\9A\15\81\BA2\ED`\EB\88\12\D4\C7\90i?\E7\98\AB:\E5\E2y\87\EA\93s\F4'\CBb\B1^\893\C3\C6\B6\BA\96$+\AF\EA\99\17\CE+O\B80\AC\10\DE\DCIl\B1\CATB\EA/\E9\AF\99g\00\01Y\BF/\82\A6\BF\EF0\D5k\A2\FA\1BM$\9A~@|\EFu\9By\A9>\99\E1;\0F\053G#\0B\A4\A8\1A^\E8W\07\EB`\98s\D4ZtV\1D\82A\C2\FF\13\E0\EF\F6MRP\A8\CE\22`\FC\BE\82\19\04}\B7\ED\FE\D8\197Yj\F5\BA^#f\C3\05\8F|vK\AB\E0k\D6qx\F0U\95{\D0\F1\F2\CA\B1N\FEI\C0\1990\04@\EB\0C\99\B4\9BjN\15\03\C0rd\D2\84\BA\96HZ\8CN:\8C\07@A\8C\B1DFq\C4u m\88b\10?Us\8F\8A\9C\BC\C9\A5\\\84\0E(f\8CF*\BF\FC\F72\BC\0A=k\AEG\0C2sq\B6X\07\FE\9A\22\F9c\03\BC\F7\15+r\EFOy\9E\E3\00\11#h_\A9\96\11\C5\FD\B9\82\EA,\D60}\96Z\8A .\0B\CB\D3/\AF\EC5\\\AA\DC#\8DM\8C\A7\94[TP\AD\BD+\16\87\06/8\06\D6[\C9 \F8\83C\869$EU\\\C6e\155\C7cK\CD\D4\1C\0A\19\A6E\A7\12\BC\DB\06\B5\EC\F2]rIn\D2\B6\B5DA\DA\C3N46M\A4\BE\10\16\12\C1\D7\CA=RRf\1D\A5\F6\A8\B5,\E6\0Bj\FF\EE\86C;D\E2\FD\97\08\A7\E9\06G\FBM\ECS\BE6Qe%1\14\81N\1F\DD7X\DF\9A\9D\F40\E3\1B\9F\F1\B8\A5o\AF\DB2\DF\B4\1DR\F6y\B0<\AD\CB\EAYD\D5v;M\EC\8F>f@\A6\8D,,\0EiJ\E0c\E6\E5\E8\DBR\94\E6%\03v\9DO\0A\96\BAX}\8E\CF\09\94|\06j\84\B3\FE\81H\A4-\F0\A65W\02?\BB6\B4\0A\D8B|\91\D3\22\BEw\E32\C4G#\EA\16\01|\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", conv2d_kernel_type = "ValidDirect", memcpy_fn_param = " \00\00\00 \00\00\00", output_transform_fn_param = "\E4\00\00\00 \00\00\00 \00\00\00\00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\00\00\00\00\C1\0F\A9\BD\22\03\D5\F9u\F5\B9\B8\DA\00g\F3@\B1\C1\EBQ\0A4\DF\ED\16\BD\01{\10\12\E0.\D3S\D57\12\B7\03\D1\10u\E6\AE\E0\11\F0m\FD\A3\12\A1\19\9A\D6-\BC1\EE\C3\C5\7F\EF\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk", output_transform_type = "Group", scratch_bytes = 0 : i32, thread_count = 1 : i32} : (tensor>, tensor<10xi8>, tensor<1x10xi16>, none, none) -> tensor> + %5 = "tfl.reshape"(%4, %cst_2) : (tensor>, tensor<2xi64>) -> tensor> + return %5 : tensor> +} diff --git a/xformer/Test/invalid-op_split.mlir b/xformer/Test/invalid-op_split.mlir new file mode 100644 index 000000000..d727df9db --- /dev/null +++ b/xformer/Test/invalid-op_split.mlir @@ -0,0 +1,23 @@ +// RUN: xcore-opt --mlir-io %s --xcore-op-split --xcore-op-split-bottom-op=1 --xcore-op-split-top-op=0 --xcore-op-split-num-splits=4,2 -verify-diagnostics + +// expected-error@+1 {{Top, bottom, and num splits must have the same number of elements!}} +func.func @valid(%arg0: tensor> {tf_saved_model.index_path = ["input_1"]}) -> (tensor> {tf_saved_model.index_path = ["flatten"]}) attributes {tf.entry_function = {inputs = "serving_default_input_1:0", outputs = "StatefulPartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1x3x3x3x!quant.uniform:f32:3, {0.0023649996146559715,0.0027379693929105997,0.0026506464928388596}>>, value = dense<[[[[76, 120, -127], [36, 127, -64], [71, -62, -125]], [[57, -119, -65], [127, 35, 8], [33, 67, 109]], [[-95, -125, 36], [35, 11, -88], [-115, 10, 125]]]]> : tensor<1x3x3x3xi8>} : () -> tensor<1x3x3x3x!quant.uniform:f32:3, {0.0023649996146559715,0.0027379693929105997,0.0026506464928388596}>> + %1 = "tfl.pseudo_qconst"() {qtype = tensor<3x!quant.uniform>, value = dense<0> : tensor<3xi32>} : () -> tensor<3x!quant.uniform> + %2 = "tfl.depthwise_conv_2d"(%arg0, %0, %1) {depth_multiplier = 1 : i32, dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "RELU", padding = "SAME", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<1x3x3x3x!quant.uniform:f32:3, {0.0023649996146559715,0.0027379693929105997,0.0026506464928388596}>>, tensor<3x!quant.uniform>) -> tensor> + %3 = "tfl.pseudo_qconst"() {qtype = tensor<16x3x3x3x!quant.uniform:f32:0, {0.0014437723439186811,0.0014597849221900105,0.001420574844814837,0.0014492113841697574,0.001421501743607223,0.0014076699735596776,0.0014516471419483423,0.0014101744163781404,0.0014633313985541463,0.0014459114754572511,0.0014596916735172272,0.0014302945928648114,0.0014560583513230085,0.0013650214532390237,0.0013345152838155627,0.0011339284246787429}>>, value = dense<"0x213DC5437BD20CE4C9AF58497F6DB7E9A3457C674A1992B2EA9AC7E0FD666BF75657817E02EE64EA865F424068095BC10A1931A670C3DA4C9D22349B017DD4273076B57D7032BD53451071F23056B17F1A66162E31127F1BC7FB84BB0B51C1F687B6577833D457FD3AAD884E7F71F98E2C45F0BF08579208826DCD17B7C5B6BC9D83E28803A2EBE0FEB08E10EF811BDD0FC474DDBC86375F68FA45F3D7687BC8940E23C247BD4F51A952291A6F597ED7A3B93CA56E7FCF1AF67AE01032548C28BC64DABCEB776B333E2CE611A640797641C03AD82D811134E9C3AA1B8DED0B389759E6D01DD3F5A7337FF1891BBF027577F49947C5631751A8CF412087FBB733479CEB7FFC1AF7FF25969C01949E79B2D2035238814543E971B52837C7AAB8DFACE0E5FD38317B4D52639FE26F36F3266F2FBD4A2B2A0030D47EA9490A2CC0B2F8C6947F065D81530354257245D1CD58E9BDDC6EC70989489CDE5B74C16BF36981ABA5F68F3FC5987CD8D605F575BB54A232DBC74C931825C8A564AD37154B9AA329A743CFAA8B3BB93081F793A6D65063CAA89937812A148C3384D4DFC720A40D3E8C895EDD538352D54FC5E50BB4A5"> : tensor<16x3x3x3xi8>} : () -> tensor<16x3x3x3x!quant.uniform:f32:0, {0.0014437723439186811,0.0014597849221900105,0.001420574844814837,0.0014492113841697574,0.001421501743607223,0.0014076699735596776,0.0014516471419483423,0.0014101744163781404,0.0014633313985541463,0.0014459114754572511,0.0014596916735172272,0.0014302945928648114,0.0014560583513230085,0.0013650214532390237,0.0013345152838155627,0.0011339284246787429}>> + %4 = "tfl.pseudo_qconst"() {qtype = tensor<16x!quant.uniform>, value = dense<0> : tensor<16xi32>} : () -> tensor<16x!quant.uniform> + %5 = "tfl.conv_2d"(%2, %3, %4) {dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "RELU", padding = "SAME", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<16x3x3x3x!quant.uniform:f32:0, {0.0014437723439186811,0.0014597849221900105,0.001420574844814837,0.0014492113841697574,0.001421501743607223,0.0014076699735596776,0.0014516471419483423,0.0014101744163781404,0.0014633313985541463,0.0014459114754572511,0.0014596916735172272,0.0014302945928648114,0.0014560583513230085,0.0013650214532390237,0.0013345152838155627,0.0011339284246787429}>>, tensor<16x!quant.uniform>) -> tensor> + %6 = "tfl.pseudo_qconst"() {qtype = tensor<1x5x5x16x!quant.uniform:f32:3, {9.1009301831945777E-4,9.1781304217875003E-4,9.1962364967912436E-4,9.0859358897432685E-4,8.4896688349545001E-4,9.0845930390059947E-4,9.1558427084237337E-4,8.9595851022750139E-4,8.8337581837549806E-4,9.2442648019641638E-4,8.8296335889026523E-4,9.1139855794608592E-4,9.1666786465793848E-4,9.057100978679955E-4,9.1333308955654502E-4,9.3005714006721973E-4}>>, value = dense<"0x6C327F6000A8FF7F81819DDC53FB7F1C65816DEE538194DFA8D2B71930A6F5E6258428FDDF3D795FE8966919E123F6DA2E633DF8C66D79DBBEF9D50F9992D2BE79E237B07F5E9C57AA342F1B95B1505607B551072202DDC5316B749713973E9A8158459BBB4E899B47FD1375B78227F3796E1C4AD2C095FB9A215DC68D67B513C0995CF8B3275D745BB88B4C4E76272EBDAEBA7679C57C8257E0580623A5C4694F8355F4466D39740A9C1E81AD91D2813945D8C0A316ECFA9FFE9F979C12B38F625EBF244D0CDC11754135AA48CE9D7B637AFE134074A870523C7F4AB6EA05B6DB1026EE791ABDBEF4B2CD947CFCD77CA846B0C038FA950BA0255B7724810EB5BF86437177A9995E0FC1EF993FBA292A8B169B38D70DC57BFF4CB43B6EC7381FBFC308CDE350C483C9E18B7498EDA7A9FC44BAEA5F31ABC741572DCCE8D631BB0F19286FE8E1F58F30E920CE2817C3F1F694B3FA6D450BCCE5F96ABFD8D61755F25E3ABB88C071446162B0426C384D5E8202387F594781D485F2F771812AE9B88C39D59C7EDAA756C322D0ECB802B264"> : tensor<1x5x5x16xi8>} : () -> tensor<1x5x5x16x!quant.uniform:f32:3, {9.1009301831945777E-4,9.1781304217875003E-4,9.1962364967912436E-4,9.0859358897432685E-4,8.4896688349545001E-4,9.0845930390059947E-4,9.1558427084237337E-4,8.9595851022750139E-4,8.8337581837549806E-4,9.2442648019641638E-4,8.8296335889026523E-4,9.1139855794608592E-4,9.1666786465793848E-4,9.057100978679955E-4,9.1333308955654502E-4,9.3005714006721973E-4}>> + %7 = "tfl.pseudo_qconst"() {qtype = tensor<16x!quant.uniform>, value = dense<0> : tensor<16xi32>} : () -> tensor<16x!quant.uniform> + %8 = "tfl.depthwise_conv_2d"(%5, %6, %7) {depth_multiplier = 1 : i32, dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "RELU", padding = "SAME", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<1x5x5x16x!quant.uniform:f32:3, {9.1009301831945777E-4,9.1781304217875003E-4,9.1962364967912436E-4,9.0859358897432685E-4,8.4896688349545001E-4,9.0845930390059947E-4,9.1558427084237337E-4,8.9595851022750139E-4,8.8337581837549806E-4,9.2442648019641638E-4,8.8296335889026523E-4,9.1139855794608592E-4,9.1666786465793848E-4,9.057100978679955E-4,9.1333308955654502E-4,9.3005714006721973E-4}>>, tensor<16x!quant.uniform>) -> tensor> + %9 = "tfl.pseudo_qconst"() {qtype = tensor<64x3x3x16x!quant.uniform:f32:0, {7.1298982948064804E-4,7.1314373053610325E-4,7.0626667002215981E-4,7.1525172097608447E-4,7.1281660348176956E-4,7.1170128649100661E-4,7.147284341044724E-4,7.1787572233006358E-4,7.1748998016119003E-4,7.0696225157007575E-4,7.1554299211129546E-4,7.0627970853820443E-4,7.1665924042463303E-4,7.1737688267603517E-4,7.1848940569907427E-4,7.1836583083495498E-4,7.1072939317673445E-4,7.1127078263089061E-4,7.1365822805091739E-4,7.0970511296764016E-4,7.1450922405347228E-4,7.1552395820617676E-4,7.0258928462862968E-4,7.1684538852423429E-4,7.1760034188628197E-4,7.1205222047865391E-4,7.1585795376449823E-4,7.1420235326513648E-4,7.143018301576376E-4,7.1218173252418637E-4,7.0836633676663041E-4,7.1518839104101062E-4,7.1455654688179493E-4,7.1557157207280397E-4,7.001166814006865E-4,7.1154290344566107E-4,7.1500451304018497E-4,7.1761995786800981E-4,7.1818620199337602E-4,7.1500451304018497E-4,7.169906166382134E-4,7.1578531060367823E-4,7.1105360984802246E-4,7.0511980447918177E-4,7.0904038148000836E-4,7.1780185680836439E-4,7.0992461405694485E-4,7.1855931309983134E-4,7.159222150221467E-4,7.1412796387448907E-4,7.1253773057833314E-4,7.1021477924659848E-4,7.1754056261852384E-4,7.0436904206871986E-4,7.1367528289556503E-4,7.1876432048156857E-4,7.1284861769527197E-4,7.1521359495818615E-4,7.1699143154546618E-4,7.1569310966879129E-4,7.1247154846787453E-4,7.1289850166067481E-4,7.1745348395779729E-4,7.1236916119232774E-4}>>, value = dense<"0x85F71133133B774C4034C897C398080C7D9C427DA137A8ECB914091CE1FF5307DA86CD7116A60CB206DF8B03DE196E2B3BCFA2EE4C6B397205690D58FAD49F27F53FEAEACB9498CD11DB9C6B387DCBDD503CD44D4320602EAB37FC22D8704B95BDE649A27CC2E53BE07B4488C1AB04C5699DDDE2BA9A298DD81C92494B811254D300B7199A5786ED34B141AF35672DBE634F28ADF60153405AAD53910EE530E5A2B68C4E8FD95CBA613B8BB1456F56AA719A4CE21BB840B037A601B8BA50B105111206CFBBC3E234C6F130FDCD3338ECDC7A550CAC1CC8FE4ECC07DBDDD1F12E407A676D728CEBA768E2B1B032A247D89411BF1E553A8D4419E2D2BF1BF396F6C3ED08330A3FFC37BE85E09A5747E409A18C81FEF6E246EB20E3A1360EB9C4CC4ECECA546C128108A463B7C695260E512078A9FA414967C4DDC627CC75F89B99F1EBFA0F8D2A0C186356533A4D846C913EACFFD1A9088A7CF0F51C47F851FC646B9DF1E456E2E3A04C522454660BC80C591D98583B1D4264E16CC5AFD8C935309641BBCA378FCFA5EF172AA3A100E35FA86A84DCA72131D671067BA86B82EFD062DDBD010E3CF532E842F74EC673D1F03D18E91A24F4CCFA107C9D34E1C2554B6E4D6D689F9B1E7F1E07F9B4A55741617D8377FB45B6F2A4E38E9227B9D762F8CE924BCF6E3CA21947C3E735F513F8A0936AF53AA778F53A58E3B7B94E108C7F09C38CFC5EE35E5AFE3FDBBDF5C442A18710B48BA6526090BD9A4A25C5ED16C31BE7702978ED6FA6EA898CC9F328C2CD2854A31F8649C675FE3B369DB5CEEE4A2EB612C3A8A1ED6BA4CD7ADC7BE273F07752858F517479E218A50D345EFC96F3F1F29FEDF55FC5BA75883DE051E985EFD641072FB9BF06DC8882CFF441C7989B0D2DE4872067ADC7BBFABCF3C5E4A8299A0ADA775FF12961EAD8A41087789581F5AD670CAE926B433294F87C36ABADE189B2ABA63AC835B3124EEA4A856A369303AC6C121BF7B44DB794F6FA96197865EEF86D69EE6BE1B691F415E31EE59DE5C1A629EF13FEB2878F950119A0461964048C9C0F38D455B95B81ADF7CBE27C50587C9357DA255887E1621766DE98C65F15261C4A2336344CD56A66B91FA2491D81482D4C2B9CB631F5B888A98FA4D49801EAD7257A98D42E0292500C1206986A2A3A46E08495FD6786A707FE0081FC164CB06474D83C36B64A14814119C7B90FBD2A711B6B7FC958B19042FC6D5EE82E1AC1D8613832002334B2D18DE176C8E43D5D08EE2B2E4234AF8B64531D3438E346D852D66BA80F724223BA6CD78B380906E692B63AEFFDF99BF6E05C3A2D5AC901186AA2A009A91EEB3CFB22D4827D0A29DCDEB3316D8D93717AFDCE952BCE46819A2D1A6199A93E85FC12708EEDFAD429CF3E8A5A7BD43867322DD4E3ABE4F00E91C686D9673269A8C3BF8886327CFC8E59DC0956A9A630AE59AC49981327E113830548BE8E81C85B1803FB479C5FCD474344817592A3CDEA88C22960D360FFBC9D10A7B5E9E4DA32D3BF4505E694E35BD9A642046D9E6B0167D663168D384C4B388E86EEFF60BAE747CC4B66DAC901850A6ADB32A65C404B30C013F6B2FF9BC7EE761DA245A4F1480DBD1A1C977E2A569F6B3BF128E971561570B5FC222979E8FC46D32B608A6D26EC59BE23F8199B49F1A0D30DC078E605D8FBE26076B1D010FF81D66DED6156CD3B329BFF2808E49D87FEF4A32932B9EDA136EE7D4B9843ACC924926CE9EE57111E1C37034D8B614BBAA8527A546E9D66588B6BC3A6E5B5783253953773F49AC8796CBB8F7C79CC9EB2F3433ABC32CF90C5D60FAE9CDF3692D352AC642A61AF65656F6DD2C7561D4E15B15DA56DCDF68B129F2FCB96AC2D7C9C77EBC98709C26EE3523396D0C0DA8F02CEBB48752BC6FC1D73ACAEAE472F4F73324BCFC202AA2F5C8E852A31AD257F9E32AF4ADB3CC4E51DBD6631B5D80A037FE3D9E32554E8BD02B8BCBE509C1C8CBCD1CB609B02E2DC6AEB3E204B0D9C939B1C5029836B16AFD9BD9D6908031C0B5197146BEB294D196D6A5E27686B13DEBCBC2234497549DEB2C9429C39009B40F81613CDE9E18CD42B2426DF9EC34B99E669789E9CCFE4EBE0A82C9B1A0843E65877633CC3F45CC41E0C9230CD7B4DF6F75FF9427479194CE352AF67E36F6C061EF6EA4FF8770A6663C6D532B3D3FE0A2CF21CA6FC1A6F1BEF9516C460D373364C0BEDF914CB3FE390A721010AC37F2184B5B6A5DF69F40E26BD8A453DAC8EA77770B566CB718FFD5B025B895E9DB1B86DE5CA5CC16D59481563C889003C7F397D8C92ECE70357E29AE98ADEB61DCD55434885BB350182E10F2859F082F708568D25BE881BFB8B28897AF19BDE92FA16D2047DFB83678A1A38CB4EAB78AAB1B6E802F72C73452902A175CB172A0905AFC5687E04A3EFC7ECEED7E25740EE7044EEF45847D99A1EC54A0ACFEE14C4D6C94D52A028245FAA3171C6DED43A9DCDFA247AA6931219F176A4AD061D778C387E814908A72F44025F4664AAED3D000802BA722AA473EAAC7178C57062F982190E7F0CC885D3881255DA0698288E9AD5888BF1F9A950D9583A9FD24EB938F66C8C1D9A52D2D8198F3197398607758644F6C424B86C46786293E01869D9F08EF5A38981DBC84E9E08E7C4CB1FD2852D141CDA6F20C387B75231DD05F3C222297A8DF0699DAD0E942A840574F203F2C89CF8F075BB00D78F7F1027DB4C003E345AA74965390C090ADED717C452929D8C79204435DCE096F7C4B7CB1C4B48FF02562B42CF93BC2E0C92BDE972E53D057BBE4F4E7E917CBB6D6FEEB55D1AA8750A7234B24525B6B164377D2E0D8A32885747BB0C26545BA8CA4682B1885D98F4DA3A7403422F415FFF6010D395BEC4E0BDD0C26E14E671F6545D0F9BE63B2481A5C76819F43C40F3B5F19C3C35696831FDF17E5D6DE07BE1C84757E00664CD6765BB38A665086A8876C9365D6278F79777C81B9242177C4331B5B13918FAC21E367E6A5A95969667BA1BA2BF4BB2BCB2B0916C21DE3B6E6F8CFF3FADFDCF26889F567E6E0E91853D824C2E46B4C08B7EEC8DD08148FD23B241699AA052D10DC29F228188DEB05CF04F8A13E7041394A117DA59E814696D284D1B08FDD051EDCD3BAF6B765D4FD04B56F4A5B5D35D02699B5F7ED2D43EF0FF7A2FAB799677DD22B59F202B5453FD3F2FE99CA5973F98C35E73B2D7C88D8EE69F5C13688DD8BFEDBBF47E67319FDDE9A599EC1ECB50E1AF4610FB1AF0849341FA8D7B9A18CB0C23B3DD69F92064AE961FC107EF5062A7CBE5FC5921BABA05301B4F200CCD0AA3A09EA4C4E6F992E728A7C7D6254DFE919EFF824CB003C1FCB9FEED9F3EF2FF818FC661BAC501692184C22860DD22614B7A162CD4F2A06B8A4A0E082C613604FB87ADF4C15585C211407E20418656B5901CE5BE5B427070B1AED49BDC84085128FACF2538C9B1D7041E22F80586FBD2EB15D7EAFCCD54F0BFCAA29F04FFEC0DCF98463B007E69F8D8A6072106DDC897922C0C30C79F7862F4CCA8CEABCAEF6BCE2EEFA2E98D7F0D541FE06BC3A5CE5342C1CF90004D8F48F0E2FAE3336632515ABEAF0C5C70298CF8A366D37E5234BCBF8B38B8DCFEBECAF769314881F6D9A40C0E1EE36E47324478EB7DF6C72BA3C20563735B41C31EFCA1B0A20B7879841F249E56D3F92BC08FFAE92F28FF9E6ADD60699F0C8D7E7624BED6A9C551742217618C8724F7626A6EF1B2C1A583C26CCF8509A08B2CA04A6E19B9EE480A2BA84A6DE9CAE1503C3E0AD4CB702A1A88B82D3819B9CB3CB472813C82CF4DF0690FDB5AA29E6A4000453886E11DE425EBB1FFE448993BCCCBAF9CB3FB503C40024D70F91532B47CD98518F1FF516EB486432470903B750624D23B3864192633EB3C457FB14990EC1689C4DAC4F20884A43AF12884F21F1A0E8DD86D3B37D6BE6E9A4BB14D7B9CD9E001ECF86316A609B3191E8861E33223459A7F00D26A6E601DF7A6327E84FC8D5986B04A02BDCC4BCDBC598E75B946C53BE129AA36AC8BFE3C71179DC975F357963B443EF4C23834027342AD67A434CF79A142593264DB8B3BDA27FD907C7E3C102FA4AB524FE56756A1E75DB89DC449FB6B8C08E8D567095D87D55DA90B0044D3EFC1817A232888DB9792413A384BA13C730DBA3FB669E5C684872A2869C5F9E1EA002FE193259006742C959902EBB347EC52FAF47B50837FE9CEDE2E84B49DC7B729B38DF2BFD6A5A19F1BC042B23A320C0D6B16A7504061297595524421AFA64A415411A40D6B93D9E79C86F6AE04CFF1E38367579CAA6BAFA98AA476EE81A41B4B6ACF6790575273BD6F893100E848545451CD531463A974B9E6548F9993398E17E049F6AF00AC6122050C48F7A564F225241E6433D1C799A77EF341DD9FA83FE60324A67A8EF7C33704952D0A507681CC182FC0BAFBB86C3278F7573D40FD12E9CE109684A7B4F14A72E23AADD8B58956D3C75C76F0189A4AE819B5EB085B1335DF85670D37710A436786E88C25BDB8AB94102A0DDC758AED125A5BF84424C3007EE0307F276F55F234F0676DC2389A1F67ACF1631DD3D75FA15E45CC6884163A051ABE41995515EF6A4910CA252C0FB3244EB96CEAE59A34BA9F4F51A639476956CEE2796D0AD83E78640E27975534A64BE8153F76749FA26F9EE0318E075499D285E5C62716D2476B0A1F106B5FB9504B528D4625BAECC69DBDA8DD59D2DB673C600B5033712C6F1118BD49BA40960C1227067CDA34703B6A6B4D00899B51775CEEAD1832B9F2D892B5977037D3203457CD0C3F17B9D13D1C23FED12D36E9DF35B545128564F048017701D4126B10FC1D8486B8DE3715707BEB1A5C9F819AFB970C3F632553D72AB7FED8F95DADEB43304FD6CD14660A2F170C08C793CFB7553DC3708292FF1983D2298117537C89B87BE930DA3197B824B10AF6C3759F4EF2F1A43EC0AFCC56E753C25767B275CB88F75FADA47E1DC162DB4D3F9335B12FA0C35AA5AB42C203D24ECF07FB5257DB34854F70681E145809F37E301DCB29F774604FB86F2AFB9DBBAFB468B770A7CBDB139F10E4C1E90513352B491BC92C87AAB8D9B8159B1F11FC4E1B7E53E3AC9C693B73506C70FB63C4074D2A49C49367049FD97F0434BEB25D06C0AB0E9EE2146041DB89EA973422B5D31990681A0BEDE7861A7593A4751E9CE0D7C03A1B3D7D4F2D1DF7880F08DD93BC1333FBFAD19ACEDABDDC56A0FBBD0D75E89E934776167FCE88E8292D0B7DB6B9145E91C98F670576A649A2B370181E2530D0A34E7B08EEC7A6C0E06F08A9B2C36E463241D97C3CC2CA58E8866C25F6A6F7A2358CC1CD32142DD41C40A7B5F03F3CB31B863F09415E1159C62D5153E5DC6D797CAB3ADFB0A9B5FEE5E35BD4AD398250C7E67197EA35FA6A021BB354A2E0F9363F5058C5C4F9C581AE69EF950266A6C20A7E11759FB0482F23F41951112C3A9217C2E1376ED363848B6B4AFCDBCF3F934BF968E2023E14CE4488810DAC03663ACE9730208A1316836C4E920716D0CFD14066864E28402A789559A850FA415B746F49D94AFD039F9F81D26A421FE0A6A547756A60BEF7D3C0299B0EC74C44F9D095BCF8B6A44BABBD1F79D0FAC3B6BC1875AE57782B2F759FCFB6A108F8F84F076AAD7192A06D8A7E3EC259B000F4EBF8BBFA0365C8A8686FC47C90D0C1FA513EA52E0502EB5A730E7F0429B9D910346E905B9F1F17FE02D0DD7DFDE7A53D8FC72FA1AFC76A9FB178C1C5C61B948D2E4D83EFF41BC4DA3FD2DB15413C1D2F6D90F676E7284092AD66FCC01030D988703085A97949B1E76E434788E87ED62E01118DFD72D575176D6CE3C6072FF372F8458D220995130C2312167EBCF8A532549E8A8ACC9160F065F888AF3FE3367C62BEBE3ADD1CC1CC36AF9F770E991074AA7D05AF295A6CDFF890250184473D3FF50CA51F58FFE82A7284EC28DB35D7979139F0CC4896A7C885787F4DF9FDB98B5F4EE5C3B38895C6495430685E5EF9711C4120C406891944174ED676D72704B604E329873251CB1989B219E8C0197BC4113AD47B02FAFBCA40133DF5F47AED03E4946217BA1375CE83EDD999B0AB1592009CDF3483EAB16B2EE3D8BC7ECCF9C0671D45575469DD36642034D2D58316B302176925526334D41C759A0A6A539A8332A664635E23F86963857A792D04B83F30771959AE8E78B342536C6CD43B449A7D25E27567B439D261F488B67FA7743E301BD5AC147F5729748C5025525BF3B8AECBB63FE0D1F65C036F7362ADC9C279C32284BBD948684E88583A89903148293B2BF4320E0C31E56AA6B5288CF08C0442C93B020F111CAFA7E8E4E8A07B7CD8062B995808F871C2C034DB940BA8DDC7EE1F742777451BE08DA4E831E1CDF0157408197F86D9CB67F649CAA7C8E9B20889A7E5338DD112F6D3938BA0AB85E9BA47B51393BBAE8350F6716FA2641CBC1F489911BB8F24EC672D863C25970B908EE97421BB89A9B066549BB1214238C7B34ABCD1FE3E99B73B13143CEA6FED427C700106248D62EFEB03F3013D61A119054E921C53F6A290B32B08B9E3745CAB646AA3B606EB1E8B64E19757FA079CFE8819B85792C6EADFED10CCEDA3A283DF4BE1683778AB8BE9A79834236DCC5F6C007A8E2877CF34A9973AF7D66A8AB73A77E85EB40F7F03000BED73EF37FBA4921EC4B739227C450DD7C199AD7B271834B25347DB6EB362D47A42C7A79B8A98B1F806C4D6A37A43F86360930017B77FF631418DC9089AFAC4A66DFE0CE94040DC90130175A591BFD9530F3DE5B72610C48C6F44D1DA7D5B759DED869EC8C975E58468C6F6A5BFA0C845AD85677CE8F31493DFCB02EB3B24B1AD9E26B3E6BBA97294528CF10E67AE45EB5F33A0F8E24F200D4B46E6E0FE1C7AA483D6553204832E184F8F02686A9A1BC10B636C0CA3DEC67710BA713577606D6B6C58E3F900033CEC72C915C5FC36090EA5E77C548ECE0262814C151521D80871397E9A88977C399D55F27AC3200970261FDF0AE3E9E38DD32EA2491716B85FFC3A94562B15E41E4960BC2093A83E8C5E0E8A8B077D76139A022E4F82F720CC9AD8CF6858B09E4BE188A4182842AF029E06ECCD58F6D9ECDF86D2844FB416282A688E97F07D3782A8EA48FD7A55581B49610ACC98986FA938F51C14A918705B273FDE2F2C05FEC3A45718EE0FB8B3249769A621E3F7D1A02BDE270B96C522839CDDAA693E75EDA1B1B20AE6B641E021CF8DDB11B5D327679C9CEAB8A3764C6B7217173393D177554A8A9D79EC8AE88B6D0B437BDEEBBFA185560E6C55F25EA47F58045EF278A71276C119349B66AC4FE841ADF4F082A6F0722DC26A03B56461BF8624E3479FC01391029C11832854FE1D81B17EC0B24C8A906A3D2279D360FD453F70127D581307C9A67DEBCF6C7617E0F3444B94F89B8456D15C02753FFFC74012CA1EABEB859A63DB8817BD2DE1AA6037C1648931C14773DF4DE0AF4A2D19B41A5699679E23B25F7AFFB0EA5BAA689CAB5B98626EE451C7E1CA5DE13BBBE9D8A587B46199700A56D10AF3E30BF125542DEFD2221DCC762CCCA27A9B1E175EB4AE4D5DDAA7E43AB4D6BED74C6F443A9003C34D64A27F0D0A54FB180ADFDD9E5A393629FC9D57D888EF86FABE746151B6543241CB4830D3EB1B72C6F7D1A1AC2ACD0D58CE23A1664A0AC582D5AF8DE1159D5708B70E47446471B0525E99072399EFF48B4AF8840C311B73D4CF30D2C74121AC36E85C39C7974B6B2D2CC665224CA0C1C9E292A9D2415AE633C834C8695DA6E49FBBE92E4A06FB39B9C9CFD84C05B5256EA3074ECA73817CABE4F706EBA810EB5846B2FB652CF71E38B4927B3E23D576603DCCF7071E23F3F7C3C23348CC033B953A6996DC66ED8D04ED509F2AF528DFAEB6142292E8D6E40FAA82B6D519F2918E0F6E024700F1D9751EED28F6A06F304DC5673B56FAB6D1735C50A75BF58BC9709E1F8C30F1F72AF73E934D10C607CB553A0C38A2E5C338F04FAB9A4C3006DDAF6BAD5C7693D5A7A04B3455A0757AB4B186002CEF4C6637D95F371F4343FBBC9156D3FF7F003135A8793F71CF175DA200FB36AE77CA0C84C6669EF1B49DA1606CABDD61318EBA850333015A26CBB1697FE2AE724B8BD617FEC269D5FBFBB222D8F31A097F2492211839BF95A541646B4CCB15E9F12D6F3C01D08B01022436ABAEC5930796F2C82FE24EDF61C454ABF230E0CE73E8DB27A2F145317133F7A4ECB740B24BD130153A415D3AE65B182F2FB617BD92047BD6248F7D964AC92F79C69D82BF26BF0FEB67F29F9CA1BA2008CFFDB531C21B4E1E2875FF40D7048A778DD4CF03E593E3B404AD2F89B919BED1AAF67E554C35650326D004B88E515456E4FF4E633FEC4E10BA693BFB934E8B3B055E48DB8ADFCAAEB17986B667DDA1BA5F2FC2860708917D0F828E9C642736858941E9EA7122A4E1846CD871D2C1CF09F3EA78CE67B9EB8F0E2F3FB435D68194ECFEA712AB3D373E2B6A15BE461BC252B3404698B6FC6A35B6F625F18C315A198A4BE57B7D199365E9304688BFE6613002D9DB31D396BB199C83F08631DD0F19C74934E47C0F4FBE0D73D203A1A6FC4B8D0E33B711B51F1417A4FC5C823CAE547C5DC46AF0A39C19E3325DFE08CBCE258CA8957F84DA8F0329BA2FD4C9DC371AE0EA3188FAE9D723C2692B3871BFC3C8A2B40E86616F23F9ED522ED73E55F262C8DCC77EF51B6D82846883B3396B79215F2404E00CB70E4B7251A4087520FEEB1CCCE3A43FDFD17F3E588C57A22CF0B9BCA0F00F774B636C0A982BE545432249502D5C34A3D8161C7540A775AF4355FC829E86F83962E9C6F7E55BF6A9F21393B67E6A2E0667B8CA22B4F4FEE57764B8485FBD17CE4F3EB8BFF97488F13A3B5B47115BA5D1582770F6DA699C48270A1B03FCB355FE66E4F28AC40CD42397AF222831948699B75551E008FDDFD0C9CFBE07C8359AF29B90B2CFA1DE814A2911F3B60F065E5471A42618E91A6E78160676185C34102702DE9F50379F37A11DA77DFEEE0DF736351689248945F7FEFA210337CC00B7F010D249CA54511D61165387BCCAEBC1BD90E9BF8411BF9609D85B66408A9AA25F61C10BB0CF713015CA39BFB0CE67A21C2EFE41C1F2E5C77781B1F4CF976BCC8FBFDDBD6CC788C4FFF8979ED9991D58D44776FF1FDABD0C65A5BD33D1F22923A0ED37C531EE90743602FBDACF2B9FC06486276AB108C7E5B3DD4CA8849F3336C081A5B0F6CC6D9C14A54579FB4A064791BB375D5741D6AACC02B4BFC35128CD09CD41E71B9500BD483456B9552C6CD2C71BA01A8B95AC30FDFA06EC6E1204A4792B5CBC5B5E5081B0E8AF81CD3E12A19BFB4F635D25ECC31B9AC1276186CB0226DB861F40C62B5C4847CACB2E5027D623EFAA81AC5F319597BFBC81D26169B23F3A421B3F3828080589A5B4825111CAE647F29BCD17DB9094A7E07F4429890DDCBFC8AE46C2A65CCDD91195727C95FFBD9AF4551AC336CF9F533E198EF33200A4465242C891272A314A27A1B18CF1175A890DADE02C581EE83B94C0B3FA2F27B59BD06BFB4D9DA1BC8147E090714875F6559C8594221599F7224C90E806DE2CC9B37A3DFD4FF292702E1481E37462762B4BB5F6E6010C2A69B61AC9569CDC35FA0349C8A7392A855A50FA5AB27B165C512EE4D1DB5FDCBBFE6C240E51E8B90C0D7047C90B198A0150694042094E33A699381E259E43D6423776BEFF27844BFE065929ABC70B2A6F201B069349DB831ECC55087C1665699A1DA27BDC811FBB75521A40EB3BD4ABE49DA704CDA6BBA8D52A1F873D13A3D4EE5A0679FFCA76FA00129F078717DBB804275C77AA93CCF5A6E899DA9C1142EC3F7C4C62BA99382BB96116DB65844099400F84DD3FB99C23C22C6E51B5389886534B229D3863C4AEBF9E8A89DAC02584699BE30FE4D39254CBB7BA7E264C7A2F0416519D8B140C235CBBEF589A23362186C91C8ECDBD6A388A8F662FCBAC63FCC8DB1735DC9177D30D70B3B0E25FF80E8ED689C534B5C7C8D76767EE7DDD76E9380FFF08502DB0C3A5C96E72B73AEB667C42EF71699B6606F7A5783ED55371AB2F555AD281E84CF9BA4EA99FAB493604FA2DAAEB825C924B830C49A83B67CDE2CDE63F383E33BD9A3897F1685A8A41E1996CBFD51925AD5ABDC0A43F32294A68FA2E532FD070C1FABCAD715F7EC0B4282A13286816F4DACBC8EFB8569428A604BDC227FE9AFA9133CA8C30DAE90956CA2184EBB7B2DEE17B5C4FD769EFE5E27B8BEED811EA6F1172D624AA4E224F6642E4FC44CBC46B4BA5F7552E5E0FD1A54B1508903A1FFDFAEF21C019B511AF7AD77F6AADE5332FEE7C5021A63579FB9EEE821EE9E0E565A5B5781323577934A192ABAE60980EA59E1026EEFDFBFB0D7FA6FD9149CD58097F4CB1EAA89BA6C582A2F5CF3A453F4A1932B32BD7A8C29F667308CB67D646826AFB9FBBB5E657E53B53AD4365065907288390C0770260BE1AB0E665BDF35487D9126DE15CE8E151FCB2CFFA7F183FD1381ECCA39BFB9AE6978A74AB1AE6A873B4A74BCB5468549B1DF7F4C0E353FD0171C38EC3272A3D4CEA2AB00FDB49C8855BEADB7BCF14B69F51ED997F953550F333D245F3C24953896EDFB3EBE1E92D3B6D2AD739BB2A32E975B3AB7FBCEB031A5E106EC52AE1E53E676D6243F10BD6C5926ECBA29BD1F66F914EF97C6367D13C02EC53453EA373415D1C2B45AF3DA3F3084010540B0C0920E3D5BE5A2CE30F4DBD69C1D4F62786EFAC439186987B1746029DE092D06F7DAF558A70852103DCA2D94FE426B226F439D7661A6BDB2A2D9079CAE1FA5FD5A66637E2CE2DD5942461E0AB05FD7A9DAAE2697D8E9FDD3A4F7959C82781B6F1A4990B92A84FE2E50AE825AE7D1F23CF54D1940315B138EA6C30B4F8FEDFB65FE12402BCA486655398CD47BA1815CFCF09160126FE562D789F3D74D746C269FC4BD4DA683033C39FD775FDA550E77700361EC7F3B0B947FB201FBE1FD8688725A9BD4B8C232A24F8A929A153CAB15F4B0F00576871C3A7BE84EC8B3B44A46EE85D2C556B2A61A1C37F4410BC72B52B093A8974B12A9E473FFE27AEBB751CD994D39F491C854A72882A6D8BD54DDC3A9AB5D1F5EB1AA5C0369968C968CD062098C91CDE4A59DBADEE62DFFF09260607649B49C332B493F8A256B1EAA2A36DD4625B325B3084AE95F7264A0A7C5E59F4B29D960CA41E1B888E6A81EA12E186DE193BC09668CFBEBB5BA1BC21F39483C128B88C7785B43C064FAA70BD3B77D8181636606550DEF72E16D33A1A04040BBEFA794049429FEFEB06FFFC137B58B87ADDB1411EEAEB4E2477B998D627CD3C1C2B21EAD7DB4884AEC00CD78425A38BD4499687F9E6FA2A221C2B81360E2D59C4B5ABE4C978F7DC511AEFDDDF54089A63468F97EB5533D1058B8416692C41BC9B3AF52486F532062828828E568F77F6C4AFC170311D5F98C3167E95AA3D6C123F93E75827DFEA33B18B779111FEAD07456F209BF9E19EA7A049E03AA7BEAAF0ABBB0AB5B62E6E8F4E9D476FE242A97AA01E5C813534C5818960F0A74E3CFB2F2E3B50F1BA3E52983ECAEA6E41E35B30BAA1856683E18F4B878E6999825CA1EBB0F96B9D6FF9BF1AA3D19B2FF3481F8F2363942DD4079F1AC258D409E576ACFD64D1D17F45C89C5ED84E83AFE03C62BAF444A7179EA5138B84095C6C2EC7DA1C150A10E273B0CC2A76B94DF6E3220FB24D5DBE5048B63C6BEBEB857FD7AACB6FD005BCEFDF086C36E369DBC35F367D195E48CA75788E1CEF958A3273C7CBA1B79A1D2DB17481DF284EAD5AFB6EFAC94982B9D4E1410C88A5AD1C957921271B40DB022D00CC423F840AC59C1987603FF934856E8EF9DEE8A815A84C0DB127A583FDB344263BB608002F645B9BDB9D2BB5BF84D5F4E78FB32F1968491412F7BEBFB02C95496F8EDEBF396DD442E38C40C6AA2AA3AD935736132EC073D033029CE2D9F732F30419A00FB007A40110B8C22674354FE9947A42F1C511B36CBA0E0A9275BDAB9D26ABD5725D66EC43CA1DECD990D55FB8B57E8A53E52DA32681D63851C9617A1B0D4BF693450CA2473A0DDB3221193402768393CAF0611E3E32B0EA3BB3722678F8AB3A38A8E35791265415AE668F0B1769738C2F6B1DA8C0D188F876E1BF4852D792DE7EC7F9033E2A9775F805F2DBDD1EE0725CD2CAE1316B001D99F15A99CD2291F7BE187EAC50F146D1F68EDD3D3C25D0165F7608AFD60603E4D49D849B36C50D0432CE17B945165D0EF12619AD51DE97049D77DB564B5D4ABE83A38B3163DEDB2B4B3AC54F6E2C504F76C7398D3A5320F2EE0C8F6BBC95B75AC462EA6909186143843898B9632D7412F29EAB978FBF3451FEE9CE193F7FD2B902903AEBB000788313DBD72A3B32464CBBF24A7CC097A0937A7AA26B7589418B9729A895EF038BB6B773F11C9381B54C25E0F5BE52F09BB579B636434C66B6EBD2270A2F30BEFBD534CCE0FB0D175B8CCF50CE22C1313BE79B8913F6FD6BC6EA278BA764E7E2B9E892DBF13D29271A2EE0C9C3846E09AC7E408DD9CBCC554ABA2D1EE4D139BE389C74A755C98CB7AAC963B8A0350619591C5F096082C2EBAAFA84890D55F296699DC894A2D3AF5F79826CBE6FE8123A1F00C0B8E5588CC0E66746E15D7F70ABD62C3137A849EB6B32CAA1F6A3538ED78A4D048BF34D297C2E3ED62543BCAC374F669558147ABDB1A1DA6B309FE0333FB87C8C8E3FBC129ADA2F556A144AA7E23C5DA796CB1F2544B964E38F75DBEC2BCFB3ECB7B1C15246672001406C437D2B30D771C01FE968EC9835C4E35FFED693AA41F95E3E1DDFF7BF3756C7422B985BBCE3D54A452194324E56392FF6FAFB337BF2720DAE368EA5C616F0DEDF7E05CD520CA531B82CCA0AB2C6840B3FFA062647B15557B1A738B79DBB18DFED10FD05FFD43B81C65372C1B588B9D391D6894DACD6D92ECD1D7961A0A362E9F41973C5F204CF772688EF1594AC02E8E5E0CB300CAA44CC9C8250F88ED66C4A4EE2013C"> : tensor<64x3x3x16xi8>} : () -> tensor<64x3x3x16x!quant.uniform:f32:0, {7.1298982948064804E-4,7.1314373053610325E-4,7.0626667002215981E-4,7.1525172097608447E-4,7.1281660348176956E-4,7.1170128649100661E-4,7.147284341044724E-4,7.1787572233006358E-4,7.1748998016119003E-4,7.0696225157007575E-4,7.1554299211129546E-4,7.0627970853820443E-4,7.1665924042463303E-4,7.1737688267603517E-4,7.1848940569907427E-4,7.1836583083495498E-4,7.1072939317673445E-4,7.1127078263089061E-4,7.1365822805091739E-4,7.0970511296764016E-4,7.1450922405347228E-4,7.1552395820617676E-4,7.0258928462862968E-4,7.1684538852423429E-4,7.1760034188628197E-4,7.1205222047865391E-4,7.1585795376449823E-4,7.1420235326513648E-4,7.143018301576376E-4,7.1218173252418637E-4,7.0836633676663041E-4,7.1518839104101062E-4,7.1455654688179493E-4,7.1557157207280397E-4,7.001166814006865E-4,7.1154290344566107E-4,7.1500451304018497E-4,7.1761995786800981E-4,7.1818620199337602E-4,7.1500451304018497E-4,7.169906166382134E-4,7.1578531060367823E-4,7.1105360984802246E-4,7.0511980447918177E-4,7.0904038148000836E-4,7.1780185680836439E-4,7.0992461405694485E-4,7.1855931309983134E-4,7.159222150221467E-4,7.1412796387448907E-4,7.1253773057833314E-4,7.1021477924659848E-4,7.1754056261852384E-4,7.0436904206871986E-4,7.1367528289556503E-4,7.1876432048156857E-4,7.1284861769527197E-4,7.1521359495818615E-4,7.1699143154546618E-4,7.1569310966879129E-4,7.1247154846787453E-4,7.1289850166067481E-4,7.1745348395779729E-4,7.1236916119232774E-4}>> + %10 = "tfl.pseudo_qconst"() {qtype = tensor<64x!quant.uniform>, value = dense<0> : tensor<64xi32>} : () -> tensor<64x!quant.uniform> + %11 = "tfl.conv_2d"(%8, %9, %10) {dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "RELU", padding = "SAME", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<64x3x3x16x!quant.uniform:f32:0, {7.1298982948064804E-4,7.1314373053610325E-4,7.0626667002215981E-4,7.1525172097608447E-4,7.1281660348176956E-4,7.1170128649100661E-4,7.147284341044724E-4,7.1787572233006358E-4,7.1748998016119003E-4,7.0696225157007575E-4,7.1554299211129546E-4,7.0627970853820443E-4,7.1665924042463303E-4,7.1737688267603517E-4,7.1848940569907427E-4,7.1836583083495498E-4,7.1072939317673445E-4,7.1127078263089061E-4,7.1365822805091739E-4,7.0970511296764016E-4,7.1450922405347228E-4,7.1552395820617676E-4,7.0258928462862968E-4,7.1684538852423429E-4,7.1760034188628197E-4,7.1205222047865391E-4,7.1585795376449823E-4,7.1420235326513648E-4,7.143018301576376E-4,7.1218173252418637E-4,7.0836633676663041E-4,7.1518839104101062E-4,7.1455654688179493E-4,7.1557157207280397E-4,7.001166814006865E-4,7.1154290344566107E-4,7.1500451304018497E-4,7.1761995786800981E-4,7.1818620199337602E-4,7.1500451304018497E-4,7.169906166382134E-4,7.1578531060367823E-4,7.1105360984802246E-4,7.0511980447918177E-4,7.0904038148000836E-4,7.1780185680836439E-4,7.0992461405694485E-4,7.1855931309983134E-4,7.159222150221467E-4,7.1412796387448907E-4,7.1253773057833314E-4,7.1021477924659848E-4,7.1754056261852384E-4,7.0436904206871986E-4,7.1367528289556503E-4,7.1876432048156857E-4,7.1284861769527197E-4,7.1521359495818615E-4,7.1699143154546618E-4,7.1569310966879129E-4,7.1247154846787453E-4,7.1289850166067481E-4,7.1745348395779729E-4,7.1236916119232774E-4}>>, tensor<64x!quant.uniform>) -> tensor> + %12 = "tfl.pseudo_qconst"() {qtype = tensor<1x3x3x64x!quant.uniform:f32:3, {7.8201084397733212E-4,7.1399228181689978E-4,7.0008879993110895E-4,7.832564297132194E-4,7.0294673787429929E-4,7.733298116363585E-4,6.7833112552762032E-4,6.738741067238152E-4,7.1754230884835124E-4,7.6487951446324587E-4,7.167066796682775E-4,6.2525062821805477E-4,6.8717659451067448E-4,4.5714006409980357E-4,7.252834620885551E-4,7.0978340227156878E-4,6.7625846713781357E-4,3.6877556703984737E-4,7.7486899681389332E-4,7.603993290103972E-4,7.7564507955685258E-4,7.6702301157638431E-4,6.9791945861652493E-4,7.7208585571497679E-4,6.9574412191286683E-4,6.5551052102819085E-4,7.175576756708324E-4,7.9461914720013738E-4,7.3698384221643209E-4,7.5012189336121082E-4,6.6112977219745517E-4,7.7181740198284388E-4,7.2377349715679884E-4,7.4077816680073738E-4,7.5427640695124865E-4,7.4047519592568278E-4,7.7879999298602343E-4,7.8563136048614979E-4,5.4388720309361815E-4,6.8243971327319741E-4,7.84830073826015E-4,7.6970586087554693E-4,6.7805452272295952E-4,7.4038049206137657E-4,6.9970340700820088E-4,6.5066164825111628E-4,7.8806630335748196E-4,7.645274163223803E-4,5.3054117597639561E-4,7.263099541887641E-4,6.9105927832424641E-4,6.3904555281624198E-4,6.943047046661377E-4,7.4700353434309363E-4,7.7856081770732999E-4,6.6190230427309871E-4,7.5756519800052047E-4,7.8628078335896134E-4,6.8693130742758512E-4,7.3553412221372128E-4,7.8125012805685401E-4,7.614599890075624E-4,7.8850419959053397E-4,5.8270583394914865E-4}>>, value = dense<"0x3B56FE7F81F7EE81038A29016626B0F049722B81B4E00C3ED8A5244C7F13E22DB064C1F281FDC11F154A9F8DECCA7F174AA5273811C90A7F2781A0238166469E129EF074BB95841AEE071EE3E2005C34A3123450BB4F58DA6DE8219931971135B8A5813DE57F6A81824F81127F81B8DECB16052E2242683A3E5B9B7F70817F217F27FC74424A97AD127285C285180060387F816D988181FCC1CD298171967C3116A892D7594681241381A4F477168A0FAF99307F0E7F740AC5B8C5D675BDE381397F4CB5E7D58975FA89A3914FD7814B38A16113B2318E4A2E814E5B438181998541B48985D12939F7D28BA08914C6E0E4708C3EE365E4C58134817DF4953E8561A98101E31F81577FEE810779B9BAA47F8D01927C75D57F22B6F06593379F7F81BBB84E8C6A20B8057689620850213899E97FE9BC206DE9015DC68E813B7D57323BF6143A10E4CA546F8C45D11E05FB350A1CB9F62C110105E9EFDC9C2C2D092FBD59BEDC67C7FA3AD72B9634EE757FC9422B47FF8D81FB9C7CEBD39B71A7F762CF9F41907F98F1AD7FDDF53A7FA98169C07C139BF3510FCB8539DBAE4F1403B096077F778187D937D1857F6DE715217F8192D122BE70024BB63D1B1507763ED5B86C75C7695232C2875075C16CCF0CA0339AF28195B943091E815219D4BDF6DE7FCBB18736DF7B7F27C27933B141658C73DECB7FCA7776EA387A38C781BD249720C41AAD819A1BBCD94A8181D1F64A5B3678505E2654637F819630D9C0FA53DC978CB04909A17194A2992118825548BDCCD7CED99EE852BC4FE48B7E15A3DC"> : tensor<1x3x3x64xi8>} : () -> tensor<1x3x3x64x!quant.uniform:f32:3, {7.8201084397733212E-4,7.1399228181689978E-4,7.0008879993110895E-4,7.832564297132194E-4,7.0294673787429929E-4,7.733298116363585E-4,6.7833112552762032E-4,6.738741067238152E-4,7.1754230884835124E-4,7.6487951446324587E-4,7.167066796682775E-4,6.2525062821805477E-4,6.8717659451067448E-4,4.5714006409980357E-4,7.252834620885551E-4,7.0978340227156878E-4,6.7625846713781357E-4,3.6877556703984737E-4,7.7486899681389332E-4,7.603993290103972E-4,7.7564507955685258E-4,7.6702301157638431E-4,6.9791945861652493E-4,7.7208585571497679E-4,6.9574412191286683E-4,6.5551052102819085E-4,7.175576756708324E-4,7.9461914720013738E-4,7.3698384221643209E-4,7.5012189336121082E-4,6.6112977219745517E-4,7.7181740198284388E-4,7.2377349715679884E-4,7.4077816680073738E-4,7.5427640695124865E-4,7.4047519592568278E-4,7.7879999298602343E-4,7.8563136048614979E-4,5.4388720309361815E-4,6.8243971327319741E-4,7.84830073826015E-4,7.6970586087554693E-4,6.7805452272295952E-4,7.4038049206137657E-4,6.9970340700820088E-4,6.5066164825111628E-4,7.8806630335748196E-4,7.645274163223803E-4,5.3054117597639561E-4,7.263099541887641E-4,6.9105927832424641E-4,6.3904555281624198E-4,6.943047046661377E-4,7.4700353434309363E-4,7.7856081770732999E-4,6.6190230427309871E-4,7.5756519800052047E-4,7.8628078335896134E-4,6.8693130742758512E-4,7.3553412221372128E-4,7.8125012805685401E-4,7.614599890075624E-4,7.8850419959053397E-4,5.8270583394914865E-4}>> + %13 = "tfl.pseudo_qconst"() {qtype = tensor<64x!quant.uniform>, value = dense<0> : tensor<64xi32>} : () -> tensor<64x!quant.uniform> + %14 = "tfl.depthwise_conv_2d"(%11, %12, %13) {depth_multiplier = 1 : i32, dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "RELU", padding = "SAME", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<1x3x3x64x!quant.uniform:f32:3, {7.8201084397733212E-4,7.1399228181689978E-4,7.0008879993110895E-4,7.832564297132194E-4,7.0294673787429929E-4,7.733298116363585E-4,6.7833112552762032E-4,6.738741067238152E-4,7.1754230884835124E-4,7.6487951446324587E-4,7.167066796682775E-4,6.2525062821805477E-4,6.8717659451067448E-4,4.5714006409980357E-4,7.252834620885551E-4,7.0978340227156878E-4,6.7625846713781357E-4,3.6877556703984737E-4,7.7486899681389332E-4,7.603993290103972E-4,7.7564507955685258E-4,7.6702301157638431E-4,6.9791945861652493E-4,7.7208585571497679E-4,6.9574412191286683E-4,6.5551052102819085E-4,7.175576756708324E-4,7.9461914720013738E-4,7.3698384221643209E-4,7.5012189336121082E-4,6.6112977219745517E-4,7.7181740198284388E-4,7.2377349715679884E-4,7.4077816680073738E-4,7.5427640695124865E-4,7.4047519592568278E-4,7.7879999298602343E-4,7.8563136048614979E-4,5.4388720309361815E-4,6.8243971327319741E-4,7.84830073826015E-4,7.6970586087554693E-4,6.7805452272295952E-4,7.4038049206137657E-4,6.9970340700820088E-4,6.5066164825111628E-4,7.8806630335748196E-4,7.645274163223803E-4,5.3054117597639561E-4,7.263099541887641E-4,6.9105927832424641E-4,6.3904555281624198E-4,6.943047046661377E-4,7.4700353434309363E-4,7.7856081770732999E-4,6.6190230427309871E-4,7.5756519800052047E-4,7.8628078335896134E-4,6.8693130742758512E-4,7.3553412221372128E-4,7.8125012805685401E-4,7.614599890075624E-4,7.8850419959053397E-4,5.8270583394914865E-4}>>, tensor<64x!quant.uniform>) -> tensor> + %15 = "tfl.pseudo_const"() {value = dense<[-1, 4096]> : tensor<2xi32>} : () -> tensor<2xi32> + %16 = "tfl.reshape"(%14, %15) : (tensor>, tensor<2xi32>) -> tensor> + return %16 : tensor> +} diff --git a/experimental/xformer/Test/lit_test.bzl b/xformer/Test/lit_test.bzl similarity index 100% rename from experimental/xformer/Test/lit_test.bzl rename to xformer/Test/lit_test.bzl diff --git a/xformer/Test/loadconstantop.mlir b/xformer/Test/loadconstantop.mlir new file mode 100644 index 000000000..3a34ad20f --- /dev/null +++ b/xformer/Test/loadconstantop.mlir @@ -0,0 +1,45 @@ +// RUN: xcore-opt --mlir-io %s --xcore-apply-loadconstantop-patterns --xcore-weights-file=/dev/null --xcore-load-externally-if-larger=0 | FileCheck %s + +// RUN: xcore-opt --mlir-io %s --xcore-apply-loadconstantop-patterns --xcore-weights-file=/dev/null --xcore-load-externally-if-larger=16 | FileCheck %s -check-prefix=LARGER-CHECK + +// CHECK-LABEL: valid +func.func @valid(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "flatten_input", outputs = "Identity"}} { + %cst = arith.constant dense<[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]> : tensor<10xi8> + %cst_0 = arith.constant dense<[[11, 12, 13, 14, 15, 16, 17, 18, 19, 10]]> : tensor<1x10xi16> + %cst_1 = arith.constant dense<[-1, 1, 1, 32]> : tensor<4xi64> + %cst_2 = arith.constant dense<[-1, 32]> : tensor<2xi64> + %cst_3 = "tfl.no_value"() {value} : () -> none + %0 = "tfl.pseudo_const"() {value = dense<[-1, 32]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.reshape"(%arg0, %0) : (tensor>, tensor<2xi32>) -> tensor> + %2 = "tfl.reshape"(%1, %cst_1) : (tensor>, tensor<4xi64>) -> tensor> + // CHECK: xc.ld_constant + // CHECK: xc.ld_constant + // CHECK: xc.ld_constant + // CHECK: xc.ld_constant + // CHECK: xc.ld_constant + // CHECK: xc.conv2d_v2 + %3 = "xc.conv2d_v2"(%2, %cst, %cst_0, %cst_3, %cst_3) {abstract_kernel_params = ["\00\00\00\00\01\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00 \00\00\00"], aggregate_fn_param = " \08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \08\00\00\CA~=\18\FC\1C\86\1B\BE\0D\B0U\13\CC\16\B57\DA*\22I0\F9~\88c\D8K\E2\A1\F3P^\16W\8B\C0\85\F8\F5[\AB\825\05\DC\97, rQ\FCf\F6\A1\A2\B3\7F+\E5\F9\04\E1\CA\05\A8\F6\F6Iv\9BQ\B6M\B9\89\EA\1F\B1\1C\AD\8D-,C\BB\DF^\F0\1C>\82\E9\99G\AA\BB\12\D5c*\89m\03\9FP\97\14\AFP\AA\D42\A2\8C3\87P%\09M\DC\0CB\A2p\82y\BF|\13\A6\C4\F5%\D3WhW\D1\00#~\F4_\A5\F5\A2f4\85]k\8A\DD\93\0B\0B\DF\04\DD\82\AB\8A\97\91\DD\D4X\83\8A=_v=\85\A2\19\87\A4\E6\1A?F=\CC~\06\83\D1\DBU\A0\EC\82=\84%M\18\E1\D1\AB\C8\1D\8B\BE\D6h\C8\E8\F1\DD\EE`\F3\E1h75\A3\87\04/'\96\C9\10\AB\A2\147\FD\B3\C6\AE\08\F4\83JoK\93\CD\8EZ\\S\CB<\BEv[\CE\CA\B1\FB\FC\0AR\E4sV\04x\EA\99\A8z \FE+e\C9\84\AD\F2E\89\88\8B\C6\C5wa{>\BA\CF\E6\005\A5:\9F\8B\CA2\07\D0=\F2Jz\85\B7\17\CA\A5fM\DC\9F\91\1E\1Aj\DF\ED\A8I\DC\1DW\90\19\92\FA\84\11\15\9C\B7\AC\02\BD\03/\05\BFxk\BF\E4\AE\A2'p\F4d^\988M_\D7\B4!\CDn4Q\93\AE\D9\AC\B6K\0A\C4\D6\A2\16i<\B1M\A1\F2N\AD*\C0O\0CVs\E9\FA\CF\DBWEZw\9F\AF\A5bu\04{\A1!\EF\8C$&u\A9\1F&\A6\E6\22=\AEB\B8\D9\8A\F8\D7l\12\DA\09\98\10\07AP\A9yv\BC[xI\CAs\D6\A1,\E4\EF\DD\9E\F6\FA\D4\B9\B3\A6\B5j\A1&)d\0D\DA\DFV\E8\F0\F0f+\D5\AB\7Fq/\89\9A\15\81\BA2\ED`\EB\88\12\D4\C7\90i?\E7\98\AB:\E5\E2y\87\EA\93s\F4'\CBb\B1^\893\C3\C6\B6\BA\96$+\AF\EA\99\17\CE+O\B80\AC\10\DE\DCIl\B1\CATB\EA/\E9\AF\99g\00\01Y\BF/\82\A6\BF\EF0\D5k\A2\FA\1BM$\9A~@|\EFu\9By\A9>\99\E1;\0F\053G#\0B\A4\A8\1A^\E8W\07\EB`\98s\D4ZtV\1D\82A\C2\FF\13\E0\EF\F6MRP\A8\CE\22`\FC\BE\82\19\04}\B7\ED\FE\D8\197Yj\F5\BA^#f\C3\05\8F|vK\AB\E0k\D6qx\F0U\95{\D0\F1\F2\CA\B1N\FEI\C0\1990\04@\EB\0C\99\B4\9BjN\15\03\C0rd\D2\84\BA\96HZ\8CN:\8C\07@A\8C\B1DFq\C4u m\88b\10?Us\8F\8A\9C\BC\C9\A5\\\84\0E(f\8CF*\BF\FC\F72\BC\0A=k\AEG\0C2sq\B6X\07\FE\9A\22\F9c\03\BC\F7\15+r\EFOy\9E\E3\00\11#h_\A9\96\11\C5\FD\B9\82\EA,\D60}\96Z\8A .\0B\CB\D3/\AF\EC5\\\AA\DC#\8DM\8C\A7\94[TP\AD\BD+\16\87\06/8\06\D6[\C9 \F8\83C\869$EU\\\C6e\155\C7cK\CD\D4\1C\0A\19\A6E\A7\12\BC\DB\06\B5\EC\F2]rIn\D2\B6\B5DA\DA\C3N46M\A4\BE\10\16\12\C1\D7\CA=RRf\1D\A5\F6\A8\B5,\E6\0Bj\FF\EE\86C;D\E2\FD\97\08\A7\E9\06G\FBM\ECS\BE6Qe%1\14\81N\1F\DD7X\DF\9A\9D\F40\E3\1B\9F\F1\B8\A5o\AF\DB2\DF\B4\1DR\F6y\B0<\AD\CB\EAYD\D5v;M\EC\8F>f@\A6\8D,,\0EiJ\E0c\E6\E5\E8\DBR\94\E6%\03v\9DO\0A\96\BAX}\8E\CF\09\94|\06j\84\B3\FE\81H\A4-\F0\A65W\02?\BB6\B4\0A\D8B|\91\D3\22\BEw\E32\C4G#\EA\16\01|\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", conv2d_kernel_type = "ValidDirect", memcpy_fn_param = " \00\00\00 \00\00\00", output_transform_fn_param = "\E4\00\00\00 \00\00\00 \00\00\00\00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\00\00\00\00\C1\0F\A9\BD\22\03\D5\F9u\F5\B9\B8\DA\00g\F3@\B1\C1\EBQ\0A4\DF\ED\16\BD\01{\10\12\E0.\D3S\D57\12\B7\03\D1\10u\E6\AE\E0\11\F0m\FD\A3\12\A1\19\9A\D6-\BC1\EE\C3\C5\7F\EF\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk", output_transform_type = "Group" : i32, scratch_bytes = 0 : i32, thread_count = 1 : i32} : (tensor>, tensor<10xi8>, tensor<1x10xi16>, none, none) -> tensor> + %4 = "tfl.reshape"(%3, %cst_2) : (tensor>, tensor<2xi64>) -> tensor> + return %4 : tensor> +} + +// ----- + +// LARGER-CHECK-LABEL: valid2 +func.func @valid2(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "flatten_input", outputs = "Identity"}} { + %cst = arith.constant dense<[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]> : tensor<10xi8> + %cst_0 = arith.constant dense<[[11, 12, 13, 14, 15, 16, 17, 18, 19, 10]]> : tensor<1x10xi16> + %cst_1 = arith.constant dense<[-1, 1, 1, 32]> : tensor<4xi64> + %cst_2 = arith.constant dense<[-1, 32]> : tensor<2xi64> + %cst_3 = "tfl.no_value"() {value} : () -> none + %0 = "tfl.pseudo_const"() {value = dense<[-1, 32]> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.reshape"(%arg0, %0) : (tensor>, tensor<2xi32>) -> tensor> + %2 = "tfl.reshape"(%1, %cst_1) : (tensor>, tensor<4xi64>) -> tensor> + // LARGER-CHECK: xc.ld_constant + // LARGER-CHECK: xc.ld_constant + // LARGER-CHECK-NOT: xc.ld_constant + // LARGER-CHECK: xc.conv2d_v2 + %3 = "xc.conv2d_v2"(%2, %cst, %cst_0, %cst_3, %cst_3) {abstract_kernel_params = ["\00\00\00\00\01\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00 \00\00\00"], aggregate_fn_param = " \08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \08\00\00\CA~=\18\FC\1C\86\1B\BE\0D\B0U\13\CC\16\B57\DA*\22I0\F9~\88c\D8K\E2\A1\F3P^\16W\8B\C0\85\F8\F5[\AB\825\05\DC\97, rQ\FCf\F6\A1\A2\B3\7F+\E5\F9\04\E1\CA\05\A8\F6\F6Iv\9BQ\B6M\B9\89\EA\1F\B1\1C\AD\8D-,C\BB\DF^\F0\1C>\82\E9\99G\AA\BB\12\D5c*\89m\03\9FP\97\14\AFP\AA\D42\A2\8C3\87P%\09M\DC\0CB\A2p\82y\BF|\13\A6\C4\F5%\D3WhW\D1\00#~\F4_\A5\F5\A2f4\85]k\8A\DD\93\0B\0B\DF\04\DD\82\AB\8A\97\91\DD\D4X\83\8A=_v=\85\A2\19\87\A4\E6\1A?F=\CC~\06\83\D1\DBU\A0\EC\82=\84%M\18\E1\D1\AB\C8\1D\8B\BE\D6h\C8\E8\F1\DD\EE`\F3\E1h75\A3\87\04/'\96\C9\10\AB\A2\147\FD\B3\C6\AE\08\F4\83JoK\93\CD\8EZ\\S\CB<\BEv[\CE\CA\B1\FB\FC\0AR\E4sV\04x\EA\99\A8z \FE+e\C9\84\AD\F2E\89\88\8B\C6\C5wa{>\BA\CF\E6\005\A5:\9F\8B\CA2\07\D0=\F2Jz\85\B7\17\CA\A5fM\DC\9F\91\1E\1Aj\DF\ED\A8I\DC\1DW\90\19\92\FA\84\11\15\9C\B7\AC\02\BD\03/\05\BFxk\BF\E4\AE\A2'p\F4d^\988M_\D7\B4!\CDn4Q\93\AE\D9\AC\B6K\0A\C4\D6\A2\16i<\B1M\A1\F2N\AD*\C0O\0CVs\E9\FA\CF\DBWEZw\9F\AF\A5bu\04{\A1!\EF\8C$&u\A9\1F&\A6\E6\22=\AEB\B8\D9\8A\F8\D7l\12\DA\09\98\10\07AP\A9yv\BC[xI\CAs\D6\A1,\E4\EF\DD\9E\F6\FA\D4\B9\B3\A6\B5j\A1&)d\0D\DA\DFV\E8\F0\F0f+\D5\AB\7Fq/\89\9A\15\81\BA2\ED`\EB\88\12\D4\C7\90i?\E7\98\AB:\E5\E2y\87\EA\93s\F4'\CBb\B1^\893\C3\C6\B6\BA\96$+\AF\EA\99\17\CE+O\B80\AC\10\DE\DCIl\B1\CATB\EA/\E9\AF\99g\00\01Y\BF/\82\A6\BF\EF0\D5k\A2\FA\1BM$\9A~@|\EFu\9By\A9>\99\E1;\0F\053G#\0B\A4\A8\1A^\E8W\07\EB`\98s\D4ZtV\1D\82A\C2\FF\13\E0\EF\F6MRP\A8\CE\22`\FC\BE\82\19\04}\B7\ED\FE\D8\197Yj\F5\BA^#f\C3\05\8F|vK\AB\E0k\D6qx\F0U\95{\D0\F1\F2\CA\B1N\FEI\C0\1990\04@\EB\0C\99\B4\9BjN\15\03\C0rd\D2\84\BA\96HZ\8CN:\8C\07@A\8C\B1DFq\C4u m\88b\10?Us\8F\8A\9C\BC\C9\A5\\\84\0E(f\8CF*\BF\FC\F72\BC\0A=k\AEG\0C2sq\B6X\07\FE\9A\22\F9c\03\BC\F7\15+r\EFOy\9E\E3\00\11#h_\A9\96\11\C5\FD\B9\82\EA,\D60}\96Z\8A .\0B\CB\D3/\AF\EC5\\\AA\DC#\8DM\8C\A7\94[TP\AD\BD+\16\87\06/8\06\D6[\C9 \F8\83C\869$EU\\\C6e\155\C7cK\CD\D4\1C\0A\19\A6E\A7\12\BC\DB\06\B5\EC\F2]rIn\D2\B6\B5DA\DA\C3N46M\A4\BE\10\16\12\C1\D7\CA=RRf\1D\A5\F6\A8\B5,\E6\0Bj\FF\EE\86C;D\E2\FD\97\08\A7\E9\06G\FBM\ECS\BE6Qe%1\14\81N\1F\DD7X\DF\9A\9D\F40\E3\1B\9F\F1\B8\A5o\AF\DB2\DF\B4\1DR\F6y\B0<\AD\CB\EAYD\D5v;M\EC\8F>f@\A6\8D,,\0EiJ\E0c\E6\E5\E8\DBR\94\E6%\03v\9DO\0A\96\BAX}\8E\CF\09\94|\06j\84\B3\FE\81H\A4-\F0\A65W\02?\BB6\B4\0A\D8B|\91\D3\22\BEw\E32\C4G#\EA\16\01|\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", conv2d_kernel_type = "ValidDirect", memcpy_fn_param = " \00\00\00 \00\00\00", output_transform_fn_param = "\E4\00\00\00 \00\00\00 \00\00\00\00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\00\00\00\00\C1\0F\A9\BD\22\03\D5\F9u\F5\B9\B8\DA\00g\F3@\B1\C1\EBQ\0A4\DF\ED\16\BD\01{\10\12\E0.\D3S\D57\12\B7\03\D1\10u\E6\AE\E0\11\F0m\FD\A3\12\A1\19\9A\D6-\BC1\EE\C3\C5\7F\EF\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk", output_transform_type = "Group" : i32, scratch_bytes = 0 : i32, thread_count = 1 : i32} : (tensor>, tensor<10xi8>, tensor<1x10xi16>, none, none) -> tensor> + %4 = "tfl.reshape"(%3, %cst_2) : (tensor>, tensor<2xi64>) -> tensor> + return %4 : tensor> +} diff --git a/xformer/Test/loadweightsop.mlir b/xformer/Test/loadweightsop.mlir new file mode 100644 index 000000000..a57257912 --- /dev/null +++ b/xformer/Test/loadweightsop.mlir @@ -0,0 +1,21 @@ +// RUN: xcore-opt --mlir-io %s --xcore-write-weights --xcore-weights-file=/dev/null | FileCheck %s + +// CHECK-LABEL: valid +func.func @valid(%arg0: tensor>) -> tensor> attributes {tf.entry_function = {inputs = "flatten_input", outputs = "Identity"}} { + %cst = arith.constant dense<[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]> : tensor<10xi8> + %cst_0 = arith.constant dense<[[11, 12, 13, 14, 15, 16, 17, 18, 19, 10]]> : tensor<1x10xi16> + %cst_1 = arith.constant dense<[-1, 1, 1, 32]> : tensor<4xi64> + %cst_2 = arith.constant dense<[-1, 32]> : tensor<2xi64> + %cst_3 = arith.constant dense<[-1, 32]> : tensor<2xi32> + %cst_4 = "tfl.no_value"() {value} : () -> none + %0 = "tfl.reshape"(%arg0, %cst_3) : (tensor>, tensor<2xi32>) -> tensor> + %1 = "tfl.reshape"(%0, %cst_1) : (tensor>, tensor<4xi64>) -> tensor> + // CHECK: xc.ld_weights + // CHECK-NOT: xc.ld_weights + // CHECK: xc.conv2d_v2 + %2 = "xc.ld_constant"(%cst) : (tensor<10xi8>) -> tensor<10xi8> + %3 = "xc.ld_constant"(%cst_0) : (tensor<1x10xi16>) -> tensor<1x10xi16> + %4 = "xc.conv2d_v2"(%1, %2, %3, %cst_4, %cst_4) {abstract_kernel_params = ["\00\00\00\00\01\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00 \00\00\00"], aggregate_fn_param = " \08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \08\00\00\CA~=\18\FC\1C\86\1B\BE\0D\B0U\13\CC\16\B57\DA*\22I0\F9~\88c\D8K\E2\A1\F3P^\16W\8B\C0\85\F8\F5[\AB\825\05\DC\97, rQ\FCf\F6\A1\A2\B3\7F+\E5\F9\04\E1\CA\05\A8\F6\F6Iv\9BQ\B6M\B9\89\EA\1F\B1\1C\AD\8D-,C\BB\DF^\F0\1C>\82\E9\99G\AA\BB\12\D5c*\89m\03\9FP\97\14\AFP\AA\D42\A2\8C3\87P%\09M\DC\0CB\A2p\82y\BF|\13\A6\C4\F5%\D3WhW\D1\00#~\F4_\A5\F5\A2f4\85]k\8A\DD\93\0B\0B\DF\04\DD\82\AB\8A\97\91\DD\D4X\83\8A=_v=\85\A2\19\87\A4\E6\1A?F=\CC~\06\83\D1\DBU\A0\EC\82=\84%M\18\E1\D1\AB\C8\1D\8B\BE\D6h\C8\E8\F1\DD\EE`\F3\E1h75\A3\87\04/'\96\C9\10\AB\A2\147\FD\B3\C6\AE\08\F4\83JoK\93\CD\8EZ\\S\CB<\BEv[\CE\CA\B1\FB\FC\0AR\E4sV\04x\EA\99\A8z \FE+e\C9\84\AD\F2E\89\88\8B\C6\C5wa{>\BA\CF\E6\005\A5:\9F\8B\CA2\07\D0=\F2Jz\85\B7\17\CA\A5fM\DC\9F\91\1E\1Aj\DF\ED\A8I\DC\1DW\90\19\92\FA\84\11\15\9C\B7\AC\02\BD\03/\05\BFxk\BF\E4\AE\A2'p\F4d^\988M_\D7\B4!\CDn4Q\93\AE\D9\AC\B6K\0A\C4\D6\A2\16i<\B1M\A1\F2N\AD*\C0O\0CVs\E9\FA\CF\DBWEZw\9F\AF\A5bu\04{\A1!\EF\8C$&u\A9\1F&\A6\E6\22=\AEB\B8\D9\8A\F8\D7l\12\DA\09\98\10\07AP\A9yv\BC[xI\CAs\D6\A1,\E4\EF\DD\9E\F6\FA\D4\B9\B3\A6\B5j\A1&)d\0D\DA\DFV\E8\F0\F0f+\D5\AB\7Fq/\89\9A\15\81\BA2\ED`\EB\88\12\D4\C7\90i?\E7\98\AB:\E5\E2y\87\EA\93s\F4'\CBb\B1^\893\C3\C6\B6\BA\96$+\AF\EA\99\17\CE+O\B80\AC\10\DE\DCIl\B1\CATB\EA/\E9\AF\99g\00\01Y\BF/\82\A6\BF\EF0\D5k\A2\FA\1BM$\9A~@|\EFu\9By\A9>\99\E1;\0F\053G#\0B\A4\A8\1A^\E8W\07\EB`\98s\D4ZtV\1D\82A\C2\FF\13\E0\EF\F6MRP\A8\CE\22`\FC\BE\82\19\04}\B7\ED\FE\D8\197Yj\F5\BA^#f\C3\05\8F|vK\AB\E0k\D6qx\F0U\95{\D0\F1\F2\CA\B1N\FEI\C0\1990\04@\EB\0C\99\B4\9BjN\15\03\C0rd\D2\84\BA\96HZ\8CN:\8C\07@A\8C\B1DFq\C4u m\88b\10?Us\8F\8A\9C\BC\C9\A5\\\84\0E(f\8CF*\BF\FC\F72\BC\0A=k\AEG\0C2sq\B6X\07\FE\9A\22\F9c\03\BC\F7\15+r\EFOy\9E\E3\00\11#h_\A9\96\11\C5\FD\B9\82\EA,\D60}\96Z\8A .\0B\CB\D3/\AF\EC5\\\AA\DC#\8DM\8C\A7\94[TP\AD\BD+\16\87\06/8\06\D6[\C9 \F8\83C\869$EU\\\C6e\155\C7cK\CD\D4\1C\0A\19\A6E\A7\12\BC\DB\06\B5\EC\F2]rIn\D2\B6\B5DA\DA\C3N46M\A4\BE\10\16\12\C1\D7\CA=RRf\1D\A5\F6\A8\B5,\E6\0Bj\FF\EE\86C;D\E2\FD\97\08\A7\E9\06G\FBM\ECS\BE6Qe%1\14\81N\1F\DD7X\DF\9A\9D\F40\E3\1B\9F\F1\B8\A5o\AF\DB2\DF\B4\1DR\F6y\B0<\AD\CB\EAYD\D5v;M\EC\8F>f@\A6\8D,,\0EiJ\E0c\E6\E5\E8\DBR\94\E6%\03v\9DO\0A\96\BAX}\8E\CF\09\94|\06j\84\B3\FE\81H\A4-\F0\A65W\02?\BB6\B4\0A\D8B|\91\D3\22\BEw\E32\C4G#\EA\16\01|\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", conv2d_kernel_type = "ValidDirect", memcpy_fn_param = " \00\00\00 \00\00\00", output_transform_fn_param = "\E4\00\00\00 \00\00\00 \00\00\00\00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \00 \0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\0E\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\02\00\00\00\00\00\C1\0F\A9\BD\22\03\D5\F9u\F5\B9\B8\DA\00g\F3@\B1\C1\EBQ\0A4\DF\ED\16\BD\01{\10\12\E0.\D3S\D57\12\B7\03\D1\10u\E6\AE\E0\11\F0m\FD\A3\12\A1\19\9A\D6-\BC1\EE\C3\C5\7F\EF\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk\FBk", output_transform_type = "Group" : i32, scratch_bytes = 0 : i32, thread_count = 1 : i32} : (tensor>, tensor<10xi8>, tensor<1x10xi16>, none, none) -> tensor> + %5 = "tfl.reshape"(%4, %cst_2) : (tensor>, tensor<2xi64>) -> tensor> + return %5 : tensor> +} diff --git a/xformer/Test/memory-plan_1.mlir b/xformer/Test/memory-plan_1.mlir new file mode 100644 index 000000000..7ab084e99 --- /dev/null +++ b/xformer/Test/memory-plan_1.mlir @@ -0,0 +1,7 @@ +// RUN: xcore-opt --mlir-io %s --xcore-plan-memory -mlir-print-ir-module-scope -mlir-disable-threading | FileCheck %s + +// CHECK: xc.offsets = dense<[384, 0]> : vector<2xi32> +func.func @main(%arg0: tensor<1x4x1x48x!quant.uniform> {tf_saved_model.index_path = ["zero_padding2d_input"]}) -> (tensor<1x4x3x48x!quant.uniform> {tf_saved_model.index_path = ["zero_padding2d"]}) attributes {tf.entry_function = {inputs = "serving_default_zero_padding2d_input:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %0 = "xc.pad"(%arg0) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 48 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x1x48x!quant.uniform>) -> tensor<1x4x3x48x!quant.uniform> + return %0 : tensor<1x4x3x48x!quant.uniform> +} \ No newline at end of file diff --git a/xformer/Test/memory-plan_2.mlir b/xformer/Test/memory-plan_2.mlir new file mode 100644 index 000000000..20d6788fe --- /dev/null +++ b/xformer/Test/memory-plan_2.mlir @@ -0,0 +1,9 @@ +// RUN: xcore-opt --mlir-io %s --xcore-plan-memory -mlir-print-ir-module-scope -mlir-disable-threading | FileCheck %s + +// CHECK: xc.offsets = dense<[1152, 768, 384, 0]> : vector<4xi32> +func.func @main(%arg0: tensor<1x4x1x48x!quant.uniform> {tf_saved_model.index_path = ["zero_padding2d_input"]}) -> (tensor<1x4x7x48x!quant.uniform> {tf_saved_model.index_path = ["zero_padding2d"]}) attributes {tf.entry_function = {inputs = "serving_default_zero_padding2d_input:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %0 = "xc.pad"(%arg0) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 48 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x1x48x!quant.uniform>) -> tensor<1x4x3x48x!quant.uniform> + %1 = "xc.pad"(%0) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 144 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x3x48x!quant.uniform>) -> tensor<1x4x5x48x!quant.uniform> + %2 = "xc.pad"(%1) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 240 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x5x48x!quant.uniform>) -> tensor<1x4x7x48x!quant.uniform> + return %2 : tensor<1x4x7x48x!quant.uniform> +} \ No newline at end of file diff --git a/xformer/Test/memory-plan_3.mlir b/xformer/Test/memory-plan_3.mlir new file mode 100644 index 000000000..a9b1787fb --- /dev/null +++ b/xformer/Test/memory-plan_3.mlir @@ -0,0 +1,11 @@ +// RUN: xcore-opt --mlir-io %s --xcore-plan-memory -mlir-print-ir-module-scope -mlir-disable-threading | FileCheck %s + +// CHECK: xc.offsets = dense<[4608, 4224, 3840, 3456, 1728, 0]> : vector<6xi32> +func.func @main(%arg0: tensor<1x4x1x48x!quant.uniform>) -> (tensor<1x4x9x48x!quant.uniform>, tensor<1x4x9x48x!quant.uniform>) attributes {tf.entry_function = {inputs = "arg0", outputs = "4,5"}} { + %0 = "xc.pad"(%arg0) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 48 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x1x48x!quant.uniform>) -> tensor<1x4x3x48x!quant.uniform> + %1 = "xc.pad"(%0) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 144 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x3x48x!quant.uniform>) -> tensor<1x4x5x48x!quant.uniform> + %2 = "xc.pad"(%1) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 240 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x5x48x!quant.uniform>) -> tensor<1x4x7x48x!quant.uniform> + %3 = "xc.pad"(%2) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 336 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x7x48x!quant.uniform>) -> tensor<1x4x9x48x!quant.uniform> + %4 = "xc.pad"(%2) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 336 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x7x48x!quant.uniform>) -> tensor<1x4x9x48x!quant.uniform> + return %3, %4 : tensor<1x4x9x48x!quant.uniform>, tensor<1x4x9x48x!quant.uniform> +} \ No newline at end of file diff --git a/xformer/Test/memory-plan_4.mlir b/xformer/Test/memory-plan_4.mlir new file mode 100644 index 000000000..00c0022d7 --- /dev/null +++ b/xformer/Test/memory-plan_4.mlir @@ -0,0 +1,15 @@ +// RUN: xcore-opt --mlir-io %s --xcore-plan-memory -mlir-print-ir-module-scope -mlir-disable-threading | FileCheck %s + +// CHECK: xc.offsets = dense<[6144, 5760, 5376, 4992, 3264, 2880, 2496, 768, 384, 0]> : vector<10xi32> +func.func @main(%arg0: tensor<1x4x1x48x!quant.uniform>) -> (tensor<1x4x13x48x!quant.uniform>, tensor<1x4x13x48x!quant.uniform>) attributes {tf.entry_function = {inputs = "arg0", outputs = "6,9"}} { + %0 = "xc.pad"(%arg0) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 48 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x1x48x!quant.uniform>) -> tensor<1x4x3x48x!quant.uniform> + %1 = "xc.pad"(%0) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 144 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x3x48x!quant.uniform>) -> tensor<1x4x5x48x!quant.uniform> + %2 = "xc.pad"(%1) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 240 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x5x48x!quant.uniform>) -> tensor<1x4x7x48x!quant.uniform> + %3 = "xc.pad"(%2) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 336 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x7x48x!quant.uniform>) -> tensor<1x4x9x48x!quant.uniform> + %4 = "xc.pad"(%3) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 432 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x9x48x!quant.uniform>) -> tensor<1x4x11x48x!quant.uniform> + %5 = "xc.pad"(%4) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 528 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x11x48x!quant.uniform>) -> tensor<1x4x13x48x!quant.uniform> + %6 = "xc.pad"(%2) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 336 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x7x48x!quant.uniform>) -> tensor<1x4x9x48x!quant.uniform> + %7 = "xc.pad"(%6) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 432 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x9x48x!quant.uniform>) -> tensor<1x4x11x48x!quant.uniform> + %8 = "xc.pad"(%7) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 528 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x11x48x!quant.uniform>) -> tensor<1x4x13x48x!quant.uniform> + return %5, %8 : tensor<1x4x13x48x!quant.uniform>, tensor<1x4x13x48x!quant.uniform> +} \ No newline at end of file diff --git a/xformer/Test/memory-plan_5.mlir b/xformer/Test/memory-plan_5.mlir new file mode 100644 index 000000000..1738b94ef --- /dev/null +++ b/xformer/Test/memory-plan_5.mlir @@ -0,0 +1,17 @@ +// RUN: xcore-opt --mlir-io %s --xcore-plan-memory -mlir-print-ir-module-scope -mlir-disable-threading | FileCheck %s + +// CHECK: xc.offsets = dense<[1152, 768, 384, 0, 9792, 9408, 9024, 7296, 6528, 1536, 768, 0]> : vector<12xi32> +func.func @main(%arg0: tensor<1x4x1x48x!quant.uniform>) -> tensor<1x4x17x96x!quant.uniform> attributes {tf.entry_function = {inputs = "arg0", outputs = "C"}} { + %0 = "xc.pad"(%arg0) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 48 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x1x48x!quant.uniform>) -> tensor<1x4x3x48x!quant.uniform> + %1 = "xc.pad"(%0) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 144 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x3x48x!quant.uniform>) -> tensor<1x4x5x48x!quant.uniform> + %2 = "xc.pad"(%1) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 240 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x5x48x!quant.uniform>) -> tensor<1x4x7x48x!quant.uniform> + %3 = "xc.pad"(%2) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 336 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x7x48x!quant.uniform>) -> tensor<1x4x9x48x!quant.uniform> + %4 = "xc.pad"(%3) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 432 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x9x48x!quant.uniform>) -> tensor<1x4x11x48x!quant.uniform> + %5 = "xc.pad"(%4) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 528 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x11x48x!quant.uniform>) -> tensor<1x4x13x48x!quant.uniform> + %6 = "xc.pad"(%2) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 96 : i32, size = 336 : i32, start = 96 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x7x48x!quant.uniform>) -> tensor<1x4x9x48x!quant.uniform> + %7 = "xc.pad"(%6) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 192 : i32, size = 432 : i32, start = 192 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x9x48x!quant.uniform>) -> tensor<1x4x13x48x!quant.uniform> + %8 = "xc.concat"(%5, %7) <{num_copies = 52 : i32, sizes = [48 : i32, 48 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32], num_inputs = 2 : i32, use_vpu = true}> : (tensor<1x4x13x48x!quant.uniform>, tensor<1x4x13x48x!quant.uniform>) -> tensor<1x4x13x96x!quant.uniform> + %9 = "xc.pad"(%8) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 192 : i32, size = 1248 : i32, start = 192 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x13x96x!quant.uniform>) -> tensor<1x4x15x96x!quant.uniform> + %10 = "xc.pad"(%9) <{end = 0 : i32, num_copies = 3 : i32, pad_size = 192 : i32, size = 1440 : i32, start = 192 : i32, use_vpu = true, zero_point = -1 : i32}> : (tensor<1x4x15x96x!quant.uniform>) -> tensor<1x4x17x96x!quant.uniform> + return %10 : tensor<1x4x17x96x!quant.uniform> +} diff --git a/experimental/xformer/Test/mlir_example.tflite b/xformer/Test/mlir_example.tflite similarity index 100% rename from experimental/xformer/Test/mlir_example.tflite rename to xformer/Test/mlir_example.tflite diff --git a/xformer/Test/op_split.mlir b/xformer/Test/op_split.mlir new file mode 100644 index 000000000..90f065b64 --- /dev/null +++ b/xformer/Test/op_split.mlir @@ -0,0 +1,51 @@ +// RUN: xcore-opt --mlir-io %s --xcore-op-split --xcore-op-split-bottom-op=1 --xcore-op-split-top-op=0 --xcore-op-split-num-splits=4 | FileCheck %s + +// CHECK-LABEL: five_layers +func.func @five_layers(%arg0: tensor> {tf_saved_model.index_path = ["input_1"]}) -> (tensor> {tf_saved_model.index_path = ["flatten"]}) attributes {tf.entry_function = {inputs = "serving_default_input_1:0", outputs = "StatefulPartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + // CHECK: tfl.slice + // CHECK: tfl.pad + // CHECK: tfl.depthwise_conv_2d + // CHECK: tfl.pad + // CHECK: tfl.conv_2d + + // CHECK: tfl.slice + // CHECK: tfl.pad + // CHECK: tfl.depthwise_conv_2d + // CHECK: tfl.pad + // CHECK: tfl.conv_2d + + // CHECK: tfl.slice + // CHECK: tfl.pad + // CHECK: tfl.depthwise_conv_2d + // CHECK: tfl.pad + // CHECK: tfl.conv_2d + + // CHECK: tfl.slice + // CHECK: tfl.pad + // CHECK: tfl.depthwise_conv_2d + // CHECK: tfl.pad + // CHECK: tfl.conv_2d + + // CHECK: tfl.concatenation + + // CHECK-NOT: tfl.slice + // CHECK-NOT: tfl.concatenation + %0 = "tfl.pseudo_qconst"() {qtype = tensor<1x3x3x3x!quant.uniform:f32:3, {0.0023649996146559715,0.0027379693929105997,0.0026506464928388596}>>, value = dense<[[[[76, 120, -127], [36, 127, -64], [71, -62, -125]], [[57, -119, -65], [127, 35, 8], [33, 67, 109]], [[-95, -125, 36], [35, 11, -88], [-115, 10, 125]]]]> : tensor<1x3x3x3xi8>} : () -> tensor<1x3x3x3x!quant.uniform:f32:3, {0.0023649996146559715,0.0027379693929105997,0.0026506464928388596}>> + %1 = "tfl.pseudo_qconst"() {qtype = tensor<3x!quant.uniform>, value = dense<0> : tensor<3xi32>} : () -> tensor<3x!quant.uniform> + %2 = "tfl.depthwise_conv_2d"(%arg0, %0, %1) {depth_multiplier = 1 : i32, dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "RELU", padding = "SAME", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<1x3x3x3x!quant.uniform:f32:3, {0.0023649996146559715,0.0027379693929105997,0.0026506464928388596}>>, tensor<3x!quant.uniform>) -> tensor> + %3 = "tfl.pseudo_qconst"() {qtype = tensor<16x3x3x3x!quant.uniform:f32:0, {0.0014437723439186811,0.0014597849221900105,0.001420574844814837,0.0014492113841697574,0.001421501743607223,0.0014076699735596776,0.0014516471419483423,0.0014101744163781404,0.0014633313985541463,0.0014459114754572511,0.0014596916735172272,0.0014302945928648114,0.0014560583513230085,0.0013650214532390237,0.0013345152838155627,0.0011339284246787429}>>, value = dense<"0x213DC5437BD20CE4C9AF58497F6DB7E9A3457C674A1992B2EA9AC7E0FD666BF75657817E02EE64EA865F424068095BC10A1931A670C3DA4C9D22349B017DD4273076B57D7032BD53451071F23056B17F1A66162E31127F1BC7FB84BB0B51C1F687B6577833D457FD3AAD884E7F71F98E2C45F0BF08579208826DCD17B7C5B6BC9D83E28803A2EBE0FEB08E10EF811BDD0FC474DDBC86375F68FA45F3D7687BC8940E23C247BD4F51A952291A6F597ED7A3B93CA56E7FCF1AF67AE01032548C28BC64DABCEB776B333E2CE611A640797641C03AD82D811134E9C3AA1B8DED0B389759E6D01DD3F5A7337FF1891BBF027577F49947C5631751A8CF412087FBB733479CEB7FFC1AF7FF25969C01949E79B2D2035238814543E971B52837C7AAB8DFACE0E5FD38317B4D52639FE26F36F3266F2FBD4A2B2A0030D47EA9490A2CC0B2F8C6947F065D81530354257245D1CD58E9BDDC6EC70989489CDE5B74C16BF36981ABA5F68F3FC5987CD8D605F575BB54A232DBC74C931825C8A564AD37154B9AA329A743CFAA8B3BB93081F793A6D65063CAA89937812A148C3384D4DFC720A40D3E8C895EDD538352D54FC5E50BB4A5"> : tensor<16x3x3x3xi8>} : () -> tensor<16x3x3x3x!quant.uniform:f32:0, {0.0014437723439186811,0.0014597849221900105,0.001420574844814837,0.0014492113841697574,0.001421501743607223,0.0014076699735596776,0.0014516471419483423,0.0014101744163781404,0.0014633313985541463,0.0014459114754572511,0.0014596916735172272,0.0014302945928648114,0.0014560583513230085,0.0013650214532390237,0.0013345152838155627,0.0011339284246787429}>> + %4 = "tfl.pseudo_qconst"() {qtype = tensor<16x!quant.uniform>, value = dense<0> : tensor<16xi32>} : () -> tensor<16x!quant.uniform> + %5 = "tfl.conv_2d"(%2, %3, %4) {dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "RELU", padding = "SAME", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<16x3x3x3x!quant.uniform:f32:0, {0.0014437723439186811,0.0014597849221900105,0.001420574844814837,0.0014492113841697574,0.001421501743607223,0.0014076699735596776,0.0014516471419483423,0.0014101744163781404,0.0014633313985541463,0.0014459114754572511,0.0014596916735172272,0.0014302945928648114,0.0014560583513230085,0.0013650214532390237,0.0013345152838155627,0.0011339284246787429}>>, tensor<16x!quant.uniform>) -> tensor> + %6 = "tfl.pseudo_qconst"() {qtype = tensor<1x5x5x16x!quant.uniform:f32:3, {9.1009301831945777E-4,9.1781304217875003E-4,9.1962364967912436E-4,9.0859358897432685E-4,8.4896688349545001E-4,9.0845930390059947E-4,9.1558427084237337E-4,8.9595851022750139E-4,8.8337581837549806E-4,9.2442648019641638E-4,8.8296335889026523E-4,9.1139855794608592E-4,9.1666786465793848E-4,9.057100978679955E-4,9.1333308955654502E-4,9.3005714006721973E-4}>>, value = dense<"0x6C327F6000A8FF7F81819DDC53FB7F1C65816DEE538194DFA8D2B71930A6F5E6258428FDDF3D795FE8966919E123F6DA2E633DF8C66D79DBBEF9D50F9992D2BE79E237B07F5E9C57AA342F1B95B1505607B551072202DDC5316B749713973E9A8158459BBB4E899B47FD1375B78227F3796E1C4AD2C095FB9A215DC68D67B513C0995CF8B3275D745BB88B4C4E76272EBDAEBA7679C57C8257E0580623A5C4694F8355F4466D39740A9C1E81AD91D2813945D8C0A316ECFA9FFE9F979C12B38F625EBF244D0CDC11754135AA48CE9D7B637AFE134074A870523C7F4AB6EA05B6DB1026EE791ABDBEF4B2CD947CFCD77CA846B0C038FA950BA0255B7724810EB5BF86437177A9995E0FC1EF993FBA292A8B169B38D70DC57BFF4CB43B6EC7381FBFC308CDE350C483C9E18B7498EDA7A9FC44BAEA5F31ABC741572DCCE8D631BB0F19286FE8E1F58F30E920CE2817C3F1F694B3FA6D450BCCE5F96ABFD8D61755F25E3ABB88C071446162B0426C384D5E8202387F594781D485F2F771812AE9B88C39D59C7EDAA756C322D0ECB802B264"> : tensor<1x5x5x16xi8>} : () -> tensor<1x5x5x16x!quant.uniform:f32:3, {9.1009301831945777E-4,9.1781304217875003E-4,9.1962364967912436E-4,9.0859358897432685E-4,8.4896688349545001E-4,9.0845930390059947E-4,9.1558427084237337E-4,8.9595851022750139E-4,8.8337581837549806E-4,9.2442648019641638E-4,8.8296335889026523E-4,9.1139855794608592E-4,9.1666786465793848E-4,9.057100978679955E-4,9.1333308955654502E-4,9.3005714006721973E-4}>> + %7 = "tfl.pseudo_qconst"() {qtype = tensor<16x!quant.uniform>, value = dense<0> : tensor<16xi32>} : () -> tensor<16x!quant.uniform> + %8 = "tfl.depthwise_conv_2d"(%5, %6, %7) {depth_multiplier = 1 : i32, dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "RELU", padding = "SAME", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<1x5x5x16x!quant.uniform:f32:3, {9.1009301831945777E-4,9.1781304217875003E-4,9.1962364967912436E-4,9.0859358897432685E-4,8.4896688349545001E-4,9.0845930390059947E-4,9.1558427084237337E-4,8.9595851022750139E-4,8.8337581837549806E-4,9.2442648019641638E-4,8.8296335889026523E-4,9.1139855794608592E-4,9.1666786465793848E-4,9.057100978679955E-4,9.1333308955654502E-4,9.3005714006721973E-4}>>, tensor<16x!quant.uniform>) -> tensor> + %9 = "tfl.pseudo_qconst"() {qtype = tensor<64x3x3x16x!quant.uniform:f32:0, {7.1298982948064804E-4,7.1314373053610325E-4,7.0626667002215981E-4,7.1525172097608447E-4,7.1281660348176956E-4,7.1170128649100661E-4,7.147284341044724E-4,7.1787572233006358E-4,7.1748998016119003E-4,7.0696225157007575E-4,7.1554299211129546E-4,7.0627970853820443E-4,7.1665924042463303E-4,7.1737688267603517E-4,7.1848940569907427E-4,7.1836583083495498E-4,7.1072939317673445E-4,7.1127078263089061E-4,7.1365822805091739E-4,7.0970511296764016E-4,7.1450922405347228E-4,7.1552395820617676E-4,7.0258928462862968E-4,7.1684538852423429E-4,7.1760034188628197E-4,7.1205222047865391E-4,7.1585795376449823E-4,7.1420235326513648E-4,7.143018301576376E-4,7.1218173252418637E-4,7.0836633676663041E-4,7.1518839104101062E-4,7.1455654688179493E-4,7.1557157207280397E-4,7.001166814006865E-4,7.1154290344566107E-4,7.1500451304018497E-4,7.1761995786800981E-4,7.1818620199337602E-4,7.1500451304018497E-4,7.169906166382134E-4,7.1578531060367823E-4,7.1105360984802246E-4,7.0511980447918177E-4,7.0904038148000836E-4,7.1780185680836439E-4,7.0992461405694485E-4,7.1855931309983134E-4,7.159222150221467E-4,7.1412796387448907E-4,7.1253773057833314E-4,7.1021477924659848E-4,7.1754056261852384E-4,7.0436904206871986E-4,7.1367528289556503E-4,7.1876432048156857E-4,7.1284861769527197E-4,7.1521359495818615E-4,7.1699143154546618E-4,7.1569310966879129E-4,7.1247154846787453E-4,7.1289850166067481E-4,7.1745348395779729E-4,7.1236916119232774E-4}>>, value = dense<"0x85F71133133B774C4034C897C398080C7D9C427DA137A8ECB914091CE1FF5307DA86CD7116A60CB206DF8B03DE196E2B3BCFA2EE4C6B397205690D58FAD49F27F53FEAEACB9498CD11DB9C6B387DCBDD503CD44D4320602EAB37FC22D8704B95BDE649A27CC2E53BE07B4488C1AB04C5699DDDE2BA9A298DD81C92494B811254D300B7199A5786ED34B141AF35672DBE634F28ADF60153405AAD53910EE530E5A2B68C4E8FD95CBA613B8BB1456F56AA719A4CE21BB840B037A601B8BA50B105111206CFBBC3E234C6F130FDCD3338ECDC7A550CAC1CC8FE4ECC07DBDDD1F12E407A676D728CEBA768E2B1B032A247D89411BF1E553A8D4419E2D2BF1BF396F6C3ED08330A3FFC37BE85E09A5747E409A18C81FEF6E246EB20E3A1360EB9C4CC4ECECA546C128108A463B7C695260E512078A9FA414967C4DDC627CC75F89B99F1EBFA0F8D2A0C186356533A4D846C913EACFFD1A9088A7CF0F51C47F851FC646B9DF1E456E2E3A04C522454660BC80C591D98583B1D4264E16CC5AFD8C935309641BBCA378FCFA5EF172AA3A100E35FA86A84DCA72131D671067BA86B82EFD062DDBD010E3CF532E842F74EC673D1F03D18E91A24F4CCFA107C9D34E1C2554B6E4D6D689F9B1E7F1E07F9B4A55741617D8377FB45B6F2A4E38E9227B9D762F8CE924BCF6E3CA21947C3E735F513F8A0936AF53AA778F53A58E3B7B94E108C7F09C38CFC5EE35E5AFE3FDBBDF5C442A18710B48BA6526090BD9A4A25C5ED16C31BE7702978ED6FA6EA898CC9F328C2CD2854A31F8649C675FE3B369DB5CEEE4A2EB612C3A8A1ED6BA4CD7ADC7BE273F07752858F517479E218A50D345EFC96F3F1F29FEDF55FC5BA75883DE051E985EFD641072FB9BF06DC8882CFF441C7989B0D2DE4872067ADC7BBFABCF3C5E4A8299A0ADA775FF12961EAD8A41087789581F5AD670CAE926B433294F87C36ABADE189B2ABA63AC835B3124EEA4A856A369303AC6C121BF7B44DB794F6FA96197865EEF86D69EE6BE1B691F415E31EE59DE5C1A629EF13FEB2878F950119A0461964048C9C0F38D455B95B81ADF7CBE27C50587C9357DA255887E1621766DE98C65F15261C4A2336344CD56A66B91FA2491D81482D4C2B9CB631F5B888A98FA4D49801EAD7257A98D42E0292500C1206986A2A3A46E08495FD6786A707FE0081FC164CB06474D83C36B64A14814119C7B90FBD2A711B6B7FC958B19042FC6D5EE82E1AC1D8613832002334B2D18DE176C8E43D5D08EE2B2E4234AF8B64531D3438E346D852D66BA80F724223BA6CD78B380906E692B63AEFFDF99BF6E05C3A2D5AC901186AA2A009A91EEB3CFB22D4827D0A29DCDEB3316D8D93717AFDCE952BCE46819A2D1A6199A93E85FC12708EEDFAD429CF3E8A5A7BD43867322DD4E3ABE4F00E91C686D9673269A8C3BF8886327CFC8E59DC0956A9A630AE59AC49981327E113830548BE8E81C85B1803FB479C5FCD474344817592A3CDEA88C22960D360FFBC9D10A7B5E9E4DA32D3BF4505E694E35BD9A642046D9E6B0167D663168D384C4B388E86EEFF60BAE747CC4B66DAC901850A6ADB32A65C404B30C013F6B2FF9BC7EE761DA245A4F1480DBD1A1C977E2A569F6B3BF128E971561570B5FC222979E8FC46D32B608A6D26EC59BE23F8199B49F1A0D30DC078E605D8FBE26076B1D010FF81D66DED6156CD3B329BFF2808E49D87FEF4A32932B9EDA136EE7D4B9843ACC924926CE9EE57111E1C37034D8B614BBAA8527A546E9D66588B6BC3A6E5B5783253953773F49AC8796CBB8F7C79CC9EB2F3433ABC32CF90C5D60FAE9CDF3692D352AC642A61AF65656F6DD2C7561D4E15B15DA56DCDF68B129F2FCB96AC2D7C9C77EBC98709C26EE3523396D0C0DA8F02CEBB48752BC6FC1D73ACAEAE472F4F73324BCFC202AA2F5C8E852A31AD257F9E32AF4ADB3CC4E51DBD6631B5D80A037FE3D9E32554E8BD02B8BCBE509C1C8CBCD1CB609B02E2DC6AEB3E204B0D9C939B1C5029836B16AFD9BD9D6908031C0B5197146BEB294D196D6A5E27686B13DEBCBC2234497549DEB2C9429C39009B40F81613CDE9E18CD42B2426DF9EC34B99E669789E9CCFE4EBE0A82C9B1A0843E65877633CC3F45CC41E0C9230CD7B4DF6F75FF9427479194CE352AF67E36F6C061EF6EA4FF8770A6663C6D532B3D3FE0A2CF21CA6FC1A6F1BEF9516C460D373364C0BEDF914CB3FE390A721010AC37F2184B5B6A5DF69F40E26BD8A453DAC8EA77770B566CB718FFD5B025B895E9DB1B86DE5CA5CC16D59481563C889003C7F397D8C92ECE70357E29AE98ADEB61DCD55434885BB350182E10F2859F082F708568D25BE881BFB8B28897AF19BDE92FA16D2047DFB83678A1A38CB4EAB78AAB1B6E802F72C73452902A175CB172A0905AFC5687E04A3EFC7ECEED7E25740EE7044EEF45847D99A1EC54A0ACFEE14C4D6C94D52A028245FAA3171C6DED43A9DCDFA247AA6931219F176A4AD061D778C387E814908A72F44025F4664AAED3D000802BA722AA473EAAC7178C57062F982190E7F0CC885D3881255DA0698288E9AD5888BF1F9A950D9583A9FD24EB938F66C8C1D9A52D2D8198F3197398607758644F6C424B86C46786293E01869D9F08EF5A38981DBC84E9E08E7C4CB1FD2852D141CDA6F20C387B75231DD05F3C222297A8DF0699DAD0E942A840574F203F2C89CF8F075BB00D78F7F1027DB4C003E345AA74965390C090ADED717C452929D8C79204435DCE096F7C4B7CB1C4B48FF02562B42CF93BC2E0C92BDE972E53D057BBE4F4E7E917CBB6D6FEEB55D1AA8750A7234B24525B6B164377D2E0D8A32885747BB0C26545BA8CA4682B1885D98F4DA3A7403422F415FFF6010D395BEC4E0BDD0C26E14E671F6545D0F9BE63B2481A5C76819F43C40F3B5F19C3C35696831FDF17E5D6DE07BE1C84757E00664CD6765BB38A665086A8876C9365D6278F79777C81B9242177C4331B5B13918FAC21E367E6A5A95969667BA1BA2BF4BB2BCB2B0916C21DE3B6E6F8CFF3FADFDCF26889F567E6E0E91853D824C2E46B4C08B7EEC8DD08148FD23B241699AA052D10DC29F228188DEB05CF04F8A13E7041394A117DA59E814696D284D1B08FDD051EDCD3BAF6B765D4FD04B56F4A5B5D35D02699B5F7ED2D43EF0FF7A2FAB799677DD22B59F202B5453FD3F2FE99CA5973F98C35E73B2D7C88D8EE69F5C13688DD8BFEDBBF47E67319FDDE9A599EC1ECB50E1AF4610FB1AF0849341FA8D7B9A18CB0C23B3DD69F92064AE961FC107EF5062A7CBE5FC5921BABA05301B4F200CCD0AA3A09EA4C4E6F992E728A7C7D6254DFE919EFF824CB003C1FCB9FEED9F3EF2FF818FC661BAC501692184C22860DD22614B7A162CD4F2A06B8A4A0E082C613604FB87ADF4C15585C211407E20418656B5901CE5BE5B427070B1AED49BDC84085128FACF2538C9B1D7041E22F80586FBD2EB15D7EAFCCD54F0BFCAA29F04FFEC0DCF98463B007E69F8D8A6072106DDC897922C0C30C79F7862F4CCA8CEABCAEF6BCE2EEFA2E98D7F0D541FE06BC3A5CE5342C1CF90004D8F48F0E2FAE3336632515ABEAF0C5C70298CF8A366D37E5234BCBF8B38B8DCFEBECAF769314881F6D9A40C0E1EE36E47324478EB7DF6C72BA3C20563735B41C31EFCA1B0A20B7879841F249E56D3F92BC08FFAE92F28FF9E6ADD60699F0C8D7E7624BED6A9C551742217618C8724F7626A6EF1B2C1A583C26CCF8509A08B2CA04A6E19B9EE480A2BA84A6DE9CAE1503C3E0AD4CB702A1A88B82D3819B9CB3CB472813C82CF4DF0690FDB5AA29E6A4000453886E11DE425EBB1FFE448993BCCCBAF9CB3FB503C40024D70F91532B47CD98518F1FF516EB486432470903B750624D23B3864192633EB3C457FB14990EC1689C4DAC4F20884A43AF12884F21F1A0E8DD86D3B37D6BE6E9A4BB14D7B9CD9E001ECF86316A609B3191E8861E33223459A7F00D26A6E601DF7A6327E84FC8D5986B04A02BDCC4BCDBC598E75B946C53BE129AA36AC8BFE3C71179DC975F357963B443EF4C23834027342AD67A434CF79A142593264DB8B3BDA27FD907C7E3C102FA4AB524FE56756A1E75DB89DC449FB6B8C08E8D567095D87D55DA90B0044D3EFC1817A232888DB9792413A384BA13C730DBA3FB669E5C684872A2869C5F9E1EA002FE193259006742C959902EBB347EC52FAF47B50837FE9CEDE2E84B49DC7B729B38DF2BFD6A5A19F1BC042B23A320C0D6B16A7504061297595524421AFA64A415411A40D6B93D9E79C86F6AE04CFF1E38367579CAA6BAFA98AA476EE81A41B4B6ACF6790575273BD6F893100E848545451CD531463A974B9E6548F9993398E17E049F6AF00AC6122050C48F7A564F225241E6433D1C799A77EF341DD9FA83FE60324A67A8EF7C33704952D0A507681CC182FC0BAFBB86C3278F7573D40FD12E9CE109684A7B4F14A72E23AADD8B58956D3C75C76F0189A4AE819B5EB085B1335DF85670D37710A436786E88C25BDB8AB94102A0DDC758AED125A5BF84424C3007EE0307F276F55F234F0676DC2389A1F67ACF1631DD3D75FA15E45CC6884163A051ABE41995515EF6A4910CA252C0FB3244EB96CEAE59A34BA9F4F51A639476956CEE2796D0AD83E78640E27975534A64BE8153F76749FA26F9EE0318E075499D285E5C62716D2476B0A1F106B5FB9504B528D4625BAECC69DBDA8DD59D2DB673C600B5033712C6F1118BD49BA40960C1227067CDA34703B6A6B4D00899B51775CEEAD1832B9F2D892B5977037D3203457CD0C3F17B9D13D1C23FED12D36E9DF35B545128564F048017701D4126B10FC1D8486B8DE3715707BEB1A5C9F819AFB970C3F632553D72AB7FED8F95DADEB43304FD6CD14660A2F170C08C793CFB7553DC3708292FF1983D2298117537C89B87BE930DA3197B824B10AF6C3759F4EF2F1A43EC0AFCC56E753C25767B275CB88F75FADA47E1DC162DB4D3F9335B12FA0C35AA5AB42C203D24ECF07FB5257DB34854F70681E145809F37E301DCB29F774604FB86F2AFB9DBBAFB468B770A7CBDB139F10E4C1E90513352B491BC92C87AAB8D9B8159B1F11FC4E1B7E53E3AC9C693B73506C70FB63C4074D2A49C49367049FD97F0434BEB25D06C0AB0E9EE2146041DB89EA973422B5D31990681A0BEDE7861A7593A4751E9CE0D7C03A1B3D7D4F2D1DF7880F08DD93BC1333FBFAD19ACEDABDDC56A0FBBD0D75E89E934776167FCE88E8292D0B7DB6B9145E91C98F670576A649A2B370181E2530D0A34E7B08EEC7A6C0E06F08A9B2C36E463241D97C3CC2CA58E8866C25F6A6F7A2358CC1CD32142DD41C40A7B5F03F3CB31B863F09415E1159C62D5153E5DC6D797CAB3ADFB0A9B5FEE5E35BD4AD398250C7E67197EA35FA6A021BB354A2E0F9363F5058C5C4F9C581AE69EF950266A6C20A7E11759FB0482F23F41951112C3A9217C2E1376ED363848B6B4AFCDBCF3F934BF968E2023E14CE4488810DAC03663ACE9730208A1316836C4E920716D0CFD14066864E28402A789559A850FA415B746F49D94AFD039F9F81D26A421FE0A6A547756A60BEF7D3C0299B0EC74C44F9D095BCF8B6A44BABBD1F79D0FAC3B6BC1875AE57782B2F759FCFB6A108F8F84F076AAD7192A06D8A7E3EC259B000F4EBF8BBFA0365C8A8686FC47C90D0C1FA513EA52E0502EB5A730E7F0429B9D910346E905B9F1F17FE02D0DD7DFDE7A53D8FC72FA1AFC76A9FB178C1C5C61B948D2E4D83EFF41BC4DA3FD2DB15413C1D2F6D90F676E7284092AD66FCC01030D988703085A97949B1E76E434788E87ED62E01118DFD72D575176D6CE3C6072FF372F8458D220995130C2312167EBCF8A532549E8A8ACC9160F065F888AF3FE3367C62BEBE3ADD1CC1CC36AF9F770E991074AA7D05AF295A6CDFF890250184473D3FF50CA51F58FFE82A7284EC28DB35D7979139F0CC4896A7C885787F4DF9FDB98B5F4EE5C3B38895C6495430685E5EF9711C4120C406891944174ED676D72704B604E329873251CB1989B219E8C0197BC4113AD47B02FAFBCA40133DF5F47AED03E4946217BA1375CE83EDD999B0AB1592009CDF3483EAB16B2EE3D8BC7ECCF9C0671D45575469DD36642034D2D58316B302176925526334D41C759A0A6A539A8332A664635E23F86963857A792D04B83F30771959AE8E78B342536C6CD43B449A7D25E27567B439D261F488B67FA7743E301BD5AC147F5729748C5025525BF3B8AECBB63FE0D1F65C036F7362ADC9C279C32284BBD948684E88583A89903148293B2BF4320E0C31E56AA6B5288CF08C0442C93B020F111CAFA7E8E4E8A07B7CD8062B995808F871C2C034DB940BA8DDC7EE1F742777451BE08DA4E831E1CDF0157408197F86D9CB67F649CAA7C8E9B20889A7E5338DD112F6D3938BA0AB85E9BA47B51393BBAE8350F6716FA2641CBC1F489911BB8F24EC672D863C25970B908EE97421BB89A9B066549BB1214238C7B34ABCD1FE3E99B73B13143CEA6FED427C700106248D62EFEB03F3013D61A119054E921C53F6A290B32B08B9E3745CAB646AA3B606EB1E8B64E19757FA079CFE8819B85792C6EADFED10CCEDA3A283DF4BE1683778AB8BE9A79834236DCC5F6C007A8E2877CF34A9973AF7D66A8AB73A77E85EB40F7F03000BED73EF37FBA4921EC4B739227C450DD7C199AD7B271834B25347DB6EB362D47A42C7A79B8A98B1F806C4D6A37A43F86360930017B77FF631418DC9089AFAC4A66DFE0CE94040DC90130175A591BFD9530F3DE5B72610C48C6F44D1DA7D5B759DED869EC8C975E58468C6F6A5BFA0C845AD85677CE8F31493DFCB02EB3B24B1AD9E26B3E6BBA97294528CF10E67AE45EB5F33A0F8E24F200D4B46E6E0FE1C7AA483D6553204832E184F8F02686A9A1BC10B636C0CA3DEC67710BA713577606D6B6C58E3F900033CEC72C915C5FC36090EA5E77C548ECE0262814C151521D80871397E9A88977C399D55F27AC3200970261FDF0AE3E9E38DD32EA2491716B85FFC3A94562B15E41E4960BC2093A83E8C5E0E8A8B077D76139A022E4F82F720CC9AD8CF6858B09E4BE188A4182842AF029E06ECCD58F6D9ECDF86D2844FB416282A688E97F07D3782A8EA48FD7A55581B49610ACC98986FA938F51C14A918705B273FDE2F2C05FEC3A45718EE0FB8B3249769A621E3F7D1A02BDE270B96C522839CDDAA693E75EDA1B1B20AE6B641E021CF8DDB11B5D327679C9CEAB8A3764C6B7217173393D177554A8A9D79EC8AE88B6D0B437BDEEBBFA185560E6C55F25EA47F58045EF278A71276C119349B66AC4FE841ADF4F082A6F0722DC26A03B56461BF8624E3479FC01391029C11832854FE1D81B17EC0B24C8A906A3D2279D360FD453F70127D581307C9A67DEBCF6C7617E0F3444B94F89B8456D15C02753FFFC74012CA1EABEB859A63DB8817BD2DE1AA6037C1648931C14773DF4DE0AF4A2D19B41A5699679E23B25F7AFFB0EA5BAA689CAB5B98626EE451C7E1CA5DE13BBBE9D8A587B46199700A56D10AF3E30BF125542DEFD2221DCC762CCCA27A9B1E175EB4AE4D5DDAA7E43AB4D6BED74C6F443A9003C34D64A27F0D0A54FB180ADFDD9E5A393629FC9D57D888EF86FABE746151B6543241CB4830D3EB1B72C6F7D1A1AC2ACD0D58CE23A1664A0AC582D5AF8DE1159D5708B70E47446471B0525E99072399EFF48B4AF8840C311B73D4CF30D2C74121AC36E85C39C7974B6B2D2CC665224CA0C1C9E292A9D2415AE633C834C8695DA6E49FBBE92E4A06FB39B9C9CFD84C05B5256EA3074ECA73817CABE4F706EBA810EB5846B2FB652CF71E38B4927B3E23D576603DCCF7071E23F3F7C3C23348CC033B953A6996DC66ED8D04ED509F2AF528DFAEB6142292E8D6E40FAA82B6D519F2918E0F6E024700F1D9751EED28F6A06F304DC5673B56FAB6D1735C50A75BF58BC9709E1F8C30F1F72AF73E934D10C607CB553A0C38A2E5C338F04FAB9A4C3006DDAF6BAD5C7693D5A7A04B3455A0757AB4B186002CEF4C6637D95F371F4343FBBC9156D3FF7F003135A8793F71CF175DA200FB36AE77CA0C84C6669EF1B49DA1606CABDD61318EBA850333015A26CBB1697FE2AE724B8BD617FEC269D5FBFBB222D8F31A097F2492211839BF95A541646B4CCB15E9F12D6F3C01D08B01022436ABAEC5930796F2C82FE24EDF61C454ABF230E0CE73E8DB27A2F145317133F7A4ECB740B24BD130153A415D3AE65B182F2FB617BD92047BD6248F7D964AC92F79C69D82BF26BF0FEB67F29F9CA1BA2008CFFDB531C21B4E1E2875FF40D7048A778DD4CF03E593E3B404AD2F89B919BED1AAF67E554C35650326D004B88E515456E4FF4E633FEC4E10BA693BFB934E8B3B055E48DB8ADFCAAEB17986B667DDA1BA5F2FC2860708917D0F828E9C642736858941E9EA7122A4E1846CD871D2C1CF09F3EA78CE67B9EB8F0E2F3FB435D68194ECFEA712AB3D373E2B6A15BE461BC252B3404698B6FC6A35B6F625F18C315A198A4BE57B7D199365E9304688BFE6613002D9DB31D396BB199C83F08631DD0F19C74934E47C0F4FBE0D73D203A1A6FC4B8D0E33B711B51F1417A4FC5C823CAE547C5DC46AF0A39C19E3325DFE08CBCE258CA8957F84DA8F0329BA2FD4C9DC371AE0EA3188FAE9D723C2692B3871BFC3C8A2B40E86616F23F9ED522ED73E55F262C8DCC77EF51B6D82846883B3396B79215F2404E00CB70E4B7251A4087520FEEB1CCCE3A43FDFD17F3E588C57A22CF0B9BCA0F00F774B636C0A982BE545432249502D5C34A3D8161C7540A775AF4355FC829E86F83962E9C6F7E55BF6A9F21393B67E6A2E0667B8CA22B4F4FEE57764B8485FBD17CE4F3EB8BFF97488F13A3B5B47115BA5D1582770F6DA699C48270A1B03FCB355FE66E4F28AC40CD42397AF222831948699B75551E008FDDFD0C9CFBE07C8359AF29B90B2CFA1DE814A2911F3B60F065E5471A42618E91A6E78160676185C34102702DE9F50379F37A11DA77DFEEE0DF736351689248945F7FEFA210337CC00B7F010D249CA54511D61165387BCCAEBC1BD90E9BF8411BF9609D85B66408A9AA25F61C10BB0CF713015CA39BFB0CE67A21C2EFE41C1F2E5C77781B1F4CF976BCC8FBFDDBD6CC788C4FFF8979ED9991D58D44776FF1FDABD0C65A5BD33D1F22923A0ED37C531EE90743602FBDACF2B9FC06486276AB108C7E5B3DD4CA8849F3336C081A5B0F6CC6D9C14A54579FB4A064791BB375D5741D6AACC02B4BFC35128CD09CD41E71B9500BD483456B9552C6CD2C71BA01A8B95AC30FDFA06EC6E1204A4792B5CBC5B5E5081B0E8AF81CD3E12A19BFB4F635D25ECC31B9AC1276186CB0226DB861F40C62B5C4847CACB2E5027D623EFAA81AC5F319597BFBC81D26169B23F3A421B3F3828080589A5B4825111CAE647F29BCD17DB9094A7E07F4429890DDCBFC8AE46C2A65CCDD91195727C95FFBD9AF4551AC336CF9F533E198EF33200A4465242C891272A314A27A1B18CF1175A890DADE02C581EE83B94C0B3FA2F27B59BD06BFB4D9DA1BC8147E090714875F6559C8594221599F7224C90E806DE2CC9B37A3DFD4FF292702E1481E37462762B4BB5F6E6010C2A69B61AC9569CDC35FA0349C8A7392A855A50FA5AB27B165C512EE4D1DB5FDCBBFE6C240E51E8B90C0D7047C90B198A0150694042094E33A699381E259E43D6423776BEFF27844BFE065929ABC70B2A6F201B069349DB831ECC55087C1665699A1DA27BDC811FBB75521A40EB3BD4ABE49DA704CDA6BBA8D52A1F873D13A3D4EE5A0679FFCA76FA00129F078717DBB804275C77AA93CCF5A6E899DA9C1142EC3F7C4C62BA99382BB96116DB65844099400F84DD3FB99C23C22C6E51B5389886534B229D3863C4AEBF9E8A89DAC02584699BE30FE4D39254CBB7BA7E264C7A2F0416519D8B140C235CBBEF589A23362186C91C8ECDBD6A388A8F662FCBAC63FCC8DB1735DC9177D30D70B3B0E25FF80E8ED689C534B5C7C8D76767EE7DDD76E9380FFF08502DB0C3A5C96E72B73AEB667C42EF71699B6606F7A5783ED55371AB2F555AD281E84CF9BA4EA99FAB493604FA2DAAEB825C924B830C49A83B67CDE2CDE63F383E33BD9A3897F1685A8A41E1996CBFD51925AD5ABDC0A43F32294A68FA2E532FD070C1FABCAD715F7EC0B4282A13286816F4DACBC8EFB8569428A604BDC227FE9AFA9133CA8C30DAE90956CA2184EBB7B2DEE17B5C4FD769EFE5E27B8BEED811EA6F1172D624AA4E224F6642E4FC44CBC46B4BA5F7552E5E0FD1A54B1508903A1FFDFAEF21C019B511AF7AD77F6AADE5332FEE7C5021A63579FB9EEE821EE9E0E565A5B5781323577934A192ABAE60980EA59E1026EEFDFBFB0D7FA6FD9149CD58097F4CB1EAA89BA6C582A2F5CF3A453F4A1932B32BD7A8C29F667308CB67D646826AFB9FBBB5E657E53B53AD4365065907288390C0770260BE1AB0E665BDF35487D9126DE15CE8E151FCB2CFFA7F183FD1381ECCA39BFB9AE6978A74AB1AE6A873B4A74BCB5468549B1DF7F4C0E353FD0171C38EC3272A3D4CEA2AB00FDB49C8855BEADB7BCF14B69F51ED997F953550F333D245F3C24953896EDFB3EBE1E92D3B6D2AD739BB2A32E975B3AB7FBCEB031A5E106EC52AE1E53E676D6243F10BD6C5926ECBA29BD1F66F914EF97C6367D13C02EC53453EA373415D1C2B45AF3DA3F3084010540B0C0920E3D5BE5A2CE30F4DBD69C1D4F62786EFAC439186987B1746029DE092D06F7DAF558A70852103DCA2D94FE426B226F439D7661A6BDB2A2D9079CAE1FA5FD5A66637E2CE2DD5942461E0AB05FD7A9DAAE2697D8E9FDD3A4F7959C82781B6F1A4990B92A84FE2E50AE825AE7D1F23CF54D1940315B138EA6C30B4F8FEDFB65FE12402BCA486655398CD47BA1815CFCF09160126FE562D789F3D74D746C269FC4BD4DA683033C39FD775FDA550E77700361EC7F3B0B947FB201FBE1FD8688725A9BD4B8C232A24F8A929A153CAB15F4B0F00576871C3A7BE84EC8B3B44A46EE85D2C556B2A61A1C37F4410BC72B52B093A8974B12A9E473FFE27AEBB751CD994D39F491C854A72882A6D8BD54DDC3A9AB5D1F5EB1AA5C0369968C968CD062098C91CDE4A59DBADEE62DFFF09260607649B49C332B493F8A256B1EAA2A36DD4625B325B3084AE95F7264A0A7C5E59F4B29D960CA41E1B888E6A81EA12E186DE193BC09668CFBEBB5BA1BC21F39483C128B88C7785B43C064FAA70BD3B77D8181636606550DEF72E16D33A1A04040BBEFA794049429FEFEB06FFFC137B58B87ADDB1411EEAEB4E2477B998D627CD3C1C2B21EAD7DB4884AEC00CD78425A38BD4499687F9E6FA2A221C2B81360E2D59C4B5ABE4C978F7DC511AEFDDDF54089A63468F97EB5533D1058B8416692C41BC9B3AF52486F532062828828E568F77F6C4AFC170311D5F98C3167E95AA3D6C123F93E75827DFEA33B18B779111FEAD07456F209BF9E19EA7A049E03AA7BEAAF0ABBB0AB5B62E6E8F4E9D476FE242A97AA01E5C813534C5818960F0A74E3CFB2F2E3B50F1BA3E52983ECAEA6E41E35B30BAA1856683E18F4B878E6999825CA1EBB0F96B9D6FF9BF1AA3D19B2FF3481F8F2363942DD4079F1AC258D409E576ACFD64D1D17F45C89C5ED84E83AFE03C62BAF444A7179EA5138B84095C6C2EC7DA1C150A10E273B0CC2A76B94DF6E3220FB24D5DBE5048B63C6BEBEB857FD7AACB6FD005BCEFDF086C36E369DBC35F367D195E48CA75788E1CEF958A3273C7CBA1B79A1D2DB17481DF284EAD5AFB6EFAC94982B9D4E1410C88A5AD1C957921271B40DB022D00CC423F840AC59C1987603FF934856E8EF9DEE8A815A84C0DB127A583FDB344263BB608002F645B9BDB9D2BB5BF84D5F4E78FB32F1968491412F7BEBFB02C95496F8EDEBF396DD442E38C40C6AA2AA3AD935736132EC073D033029CE2D9F732F30419A00FB007A40110B8C22674354FE9947A42F1C511B36CBA0E0A9275BDAB9D26ABD5725D66EC43CA1DECD990D55FB8B57E8A53E52DA32681D63851C9617A1B0D4BF693450CA2473A0DDB3221193402768393CAF0611E3E32B0EA3BB3722678F8AB3A38A8E35791265415AE668F0B1769738C2F6B1DA8C0D188F876E1BF4852D792DE7EC7F9033E2A9775F805F2DBDD1EE0725CD2CAE1316B001D99F15A99CD2291F7BE187EAC50F146D1F68EDD3D3C25D0165F7608AFD60603E4D49D849B36C50D0432CE17B945165D0EF12619AD51DE97049D77DB564B5D4ABE83A38B3163DEDB2B4B3AC54F6E2C504F76C7398D3A5320F2EE0C8F6BBC95B75AC462EA6909186143843898B9632D7412F29EAB978FBF3451FEE9CE193F7FD2B902903AEBB000788313DBD72A3B32464CBBF24A7CC097A0937A7AA26B7589418B9729A895EF038BB6B773F11C9381B54C25E0F5BE52F09BB579B636434C66B6EBD2270A2F30BEFBD534CCE0FB0D175B8CCF50CE22C1313BE79B8913F6FD6BC6EA278BA764E7E2B9E892DBF13D29271A2EE0C9C3846E09AC7E408DD9CBCC554ABA2D1EE4D139BE389C74A755C98CB7AAC963B8A0350619591C5F096082C2EBAAFA84890D55F296699DC894A2D3AF5F79826CBE6FE8123A1F00C0B8E5588CC0E66746E15D7F70ABD62C3137A849EB6B32CAA1F6A3538ED78A4D048BF34D297C2E3ED62543BCAC374F669558147ABDB1A1DA6B309FE0333FB87C8C8E3FBC129ADA2F556A144AA7E23C5DA796CB1F2544B964E38F75DBEC2BCFB3ECB7B1C15246672001406C437D2B30D771C01FE968EC9835C4E35FFED693AA41F95E3E1DDFF7BF3756C7422B985BBCE3D54A452194324E56392FF6FAFB337BF2720DAE368EA5C616F0DEDF7E05CD520CA531B82CCA0AB2C6840B3FFA062647B15557B1A738B79DBB18DFED10FD05FFD43B81C65372C1B588B9D391D6894DACD6D92ECD1D7961A0A362E9F41973C5F204CF772688EF1594AC02E8E5E0CB300CAA44CC9C8250F88ED66C4A4EE2013C"> : tensor<64x3x3x16xi8>} : () -> tensor<64x3x3x16x!quant.uniform:f32:0, {7.1298982948064804E-4,7.1314373053610325E-4,7.0626667002215981E-4,7.1525172097608447E-4,7.1281660348176956E-4,7.1170128649100661E-4,7.147284341044724E-4,7.1787572233006358E-4,7.1748998016119003E-4,7.0696225157007575E-4,7.1554299211129546E-4,7.0627970853820443E-4,7.1665924042463303E-4,7.1737688267603517E-4,7.1848940569907427E-4,7.1836583083495498E-4,7.1072939317673445E-4,7.1127078263089061E-4,7.1365822805091739E-4,7.0970511296764016E-4,7.1450922405347228E-4,7.1552395820617676E-4,7.0258928462862968E-4,7.1684538852423429E-4,7.1760034188628197E-4,7.1205222047865391E-4,7.1585795376449823E-4,7.1420235326513648E-4,7.143018301576376E-4,7.1218173252418637E-4,7.0836633676663041E-4,7.1518839104101062E-4,7.1455654688179493E-4,7.1557157207280397E-4,7.001166814006865E-4,7.1154290344566107E-4,7.1500451304018497E-4,7.1761995786800981E-4,7.1818620199337602E-4,7.1500451304018497E-4,7.169906166382134E-4,7.1578531060367823E-4,7.1105360984802246E-4,7.0511980447918177E-4,7.0904038148000836E-4,7.1780185680836439E-4,7.0992461405694485E-4,7.1855931309983134E-4,7.159222150221467E-4,7.1412796387448907E-4,7.1253773057833314E-4,7.1021477924659848E-4,7.1754056261852384E-4,7.0436904206871986E-4,7.1367528289556503E-4,7.1876432048156857E-4,7.1284861769527197E-4,7.1521359495818615E-4,7.1699143154546618E-4,7.1569310966879129E-4,7.1247154846787453E-4,7.1289850166067481E-4,7.1745348395779729E-4,7.1236916119232774E-4}>> + %10 = "tfl.pseudo_qconst"() {qtype = tensor<64x!quant.uniform>, value = dense<0> : tensor<64xi32>} : () -> tensor<64x!quant.uniform> + %11 = "tfl.conv_2d"(%8, %9, %10) {dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "RELU", padding = "SAME", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<64x3x3x16x!quant.uniform:f32:0, {7.1298982948064804E-4,7.1314373053610325E-4,7.0626667002215981E-4,7.1525172097608447E-4,7.1281660348176956E-4,7.1170128649100661E-4,7.147284341044724E-4,7.1787572233006358E-4,7.1748998016119003E-4,7.0696225157007575E-4,7.1554299211129546E-4,7.0627970853820443E-4,7.1665924042463303E-4,7.1737688267603517E-4,7.1848940569907427E-4,7.1836583083495498E-4,7.1072939317673445E-4,7.1127078263089061E-4,7.1365822805091739E-4,7.0970511296764016E-4,7.1450922405347228E-4,7.1552395820617676E-4,7.0258928462862968E-4,7.1684538852423429E-4,7.1760034188628197E-4,7.1205222047865391E-4,7.1585795376449823E-4,7.1420235326513648E-4,7.143018301576376E-4,7.1218173252418637E-4,7.0836633676663041E-4,7.1518839104101062E-4,7.1455654688179493E-4,7.1557157207280397E-4,7.001166814006865E-4,7.1154290344566107E-4,7.1500451304018497E-4,7.1761995786800981E-4,7.1818620199337602E-4,7.1500451304018497E-4,7.169906166382134E-4,7.1578531060367823E-4,7.1105360984802246E-4,7.0511980447918177E-4,7.0904038148000836E-4,7.1780185680836439E-4,7.0992461405694485E-4,7.1855931309983134E-4,7.159222150221467E-4,7.1412796387448907E-4,7.1253773057833314E-4,7.1021477924659848E-4,7.1754056261852384E-4,7.0436904206871986E-4,7.1367528289556503E-4,7.1876432048156857E-4,7.1284861769527197E-4,7.1521359495818615E-4,7.1699143154546618E-4,7.1569310966879129E-4,7.1247154846787453E-4,7.1289850166067481E-4,7.1745348395779729E-4,7.1236916119232774E-4}>>, tensor<64x!quant.uniform>) -> tensor> + %12 = "tfl.pseudo_qconst"() {qtype = tensor<1x3x3x64x!quant.uniform:f32:3, {7.8201084397733212E-4,7.1399228181689978E-4,7.0008879993110895E-4,7.832564297132194E-4,7.0294673787429929E-4,7.733298116363585E-4,6.7833112552762032E-4,6.738741067238152E-4,7.1754230884835124E-4,7.6487951446324587E-4,7.167066796682775E-4,6.2525062821805477E-4,6.8717659451067448E-4,4.5714006409980357E-4,7.252834620885551E-4,7.0978340227156878E-4,6.7625846713781357E-4,3.6877556703984737E-4,7.7486899681389332E-4,7.603993290103972E-4,7.7564507955685258E-4,7.6702301157638431E-4,6.9791945861652493E-4,7.7208585571497679E-4,6.9574412191286683E-4,6.5551052102819085E-4,7.175576756708324E-4,7.9461914720013738E-4,7.3698384221643209E-4,7.5012189336121082E-4,6.6112977219745517E-4,7.7181740198284388E-4,7.2377349715679884E-4,7.4077816680073738E-4,7.5427640695124865E-4,7.4047519592568278E-4,7.7879999298602343E-4,7.8563136048614979E-4,5.4388720309361815E-4,6.8243971327319741E-4,7.84830073826015E-4,7.6970586087554693E-4,6.7805452272295952E-4,7.4038049206137657E-4,6.9970340700820088E-4,6.5066164825111628E-4,7.8806630335748196E-4,7.645274163223803E-4,5.3054117597639561E-4,7.263099541887641E-4,6.9105927832424641E-4,6.3904555281624198E-4,6.943047046661377E-4,7.4700353434309363E-4,7.7856081770732999E-4,6.6190230427309871E-4,7.5756519800052047E-4,7.8628078335896134E-4,6.8693130742758512E-4,7.3553412221372128E-4,7.8125012805685401E-4,7.614599890075624E-4,7.8850419959053397E-4,5.8270583394914865E-4}>>, value = dense<"0x3B56FE7F81F7EE81038A29016626B0F049722B81B4E00C3ED8A5244C7F13E22DB064C1F281FDC11F154A9F8DECCA7F174AA5273811C90A7F2781A0238166469E129EF074BB95841AEE071EE3E2005C34A3123450BB4F58DA6DE8219931971135B8A5813DE57F6A81824F81127F81B8DECB16052E2242683A3E5B9B7F70817F217F27FC74424A97AD127285C285180060387F816D988181FCC1CD298171967C3116A892D7594681241381A4F477168A0FAF99307F0E7F740AC5B8C5D675BDE381397F4CB5E7D58975FA89A3914FD7814B38A16113B2318E4A2E814E5B438181998541B48985D12939F7D28BA08914C6E0E4708C3EE365E4C58134817DF4953E8561A98101E31F81577FEE810779B9BAA47F8D01927C75D57F22B6F06593379F7F81BBB84E8C6A20B8057689620850213899E97FE9BC206DE9015DC68E813B7D57323BF6143A10E4CA546F8C45D11E05FB350A1CB9F62C110105E9EFDC9C2C2D092FBD59BEDC67C7FA3AD72B9634EE757FC9422B47FF8D81FB9C7CEBD39B71A7F762CF9F41907F98F1AD7FDDF53A7FA98169C07C139BF3510FCB8539DBAE4F1403B096077F778187D937D1857F6DE715217F8192D122BE70024BB63D1B1507763ED5B86C75C7695232C2875075C16CCF0CA0339AF28195B943091E815219D4BDF6DE7FCBB18736DF7B7F27C27933B141658C73DECB7FCA7776EA387A38C781BD249720C41AAD819A1BBCD94A8181D1F64A5B3678505E2654637F819630D9C0FA53DC978CB04909A17194A2992118825548BDCCD7CED99EE852BC4FE48B7E15A3DC"> : tensor<1x3x3x64xi8>} : () -> tensor<1x3x3x64x!quant.uniform:f32:3, {7.8201084397733212E-4,7.1399228181689978E-4,7.0008879993110895E-4,7.832564297132194E-4,7.0294673787429929E-4,7.733298116363585E-4,6.7833112552762032E-4,6.738741067238152E-4,7.1754230884835124E-4,7.6487951446324587E-4,7.167066796682775E-4,6.2525062821805477E-4,6.8717659451067448E-4,4.5714006409980357E-4,7.252834620885551E-4,7.0978340227156878E-4,6.7625846713781357E-4,3.6877556703984737E-4,7.7486899681389332E-4,7.603993290103972E-4,7.7564507955685258E-4,7.6702301157638431E-4,6.9791945861652493E-4,7.7208585571497679E-4,6.9574412191286683E-4,6.5551052102819085E-4,7.175576756708324E-4,7.9461914720013738E-4,7.3698384221643209E-4,7.5012189336121082E-4,6.6112977219745517E-4,7.7181740198284388E-4,7.2377349715679884E-4,7.4077816680073738E-4,7.5427640695124865E-4,7.4047519592568278E-4,7.7879999298602343E-4,7.8563136048614979E-4,5.4388720309361815E-4,6.8243971327319741E-4,7.84830073826015E-4,7.6970586087554693E-4,6.7805452272295952E-4,7.4038049206137657E-4,6.9970340700820088E-4,6.5066164825111628E-4,7.8806630335748196E-4,7.645274163223803E-4,5.3054117597639561E-4,7.263099541887641E-4,6.9105927832424641E-4,6.3904555281624198E-4,6.943047046661377E-4,7.4700353434309363E-4,7.7856081770732999E-4,6.6190230427309871E-4,7.5756519800052047E-4,7.8628078335896134E-4,6.8693130742758512E-4,7.3553412221372128E-4,7.8125012805685401E-4,7.614599890075624E-4,7.8850419959053397E-4,5.8270583394914865E-4}>> + %13 = "tfl.pseudo_qconst"() {qtype = tensor<64x!quant.uniform>, value = dense<0> : tensor<64xi32>} : () -> tensor<64x!quant.uniform> + %14 = "tfl.depthwise_conv_2d"(%11, %12, %13) {depth_multiplier = 1 : i32, dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "RELU", padding = "SAME", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<1x3x3x64x!quant.uniform:f32:3, {7.8201084397733212E-4,7.1399228181689978E-4,7.0008879993110895E-4,7.832564297132194E-4,7.0294673787429929E-4,7.733298116363585E-4,6.7833112552762032E-4,6.738741067238152E-4,7.1754230884835124E-4,7.6487951446324587E-4,7.167066796682775E-4,6.2525062821805477E-4,6.8717659451067448E-4,4.5714006409980357E-4,7.252834620885551E-4,7.0978340227156878E-4,6.7625846713781357E-4,3.6877556703984737E-4,7.7486899681389332E-4,7.603993290103972E-4,7.7564507955685258E-4,7.6702301157638431E-4,6.9791945861652493E-4,7.7208585571497679E-4,6.9574412191286683E-4,6.5551052102819085E-4,7.175576756708324E-4,7.9461914720013738E-4,7.3698384221643209E-4,7.5012189336121082E-4,6.6112977219745517E-4,7.7181740198284388E-4,7.2377349715679884E-4,7.4077816680073738E-4,7.5427640695124865E-4,7.4047519592568278E-4,7.7879999298602343E-4,7.8563136048614979E-4,5.4388720309361815E-4,6.8243971327319741E-4,7.84830073826015E-4,7.6970586087554693E-4,6.7805452272295952E-4,7.4038049206137657E-4,6.9970340700820088E-4,6.5066164825111628E-4,7.8806630335748196E-4,7.645274163223803E-4,5.3054117597639561E-4,7.263099541887641E-4,6.9105927832424641E-4,6.3904555281624198E-4,6.943047046661377E-4,7.4700353434309363E-4,7.7856081770732999E-4,6.6190230427309871E-4,7.5756519800052047E-4,7.8628078335896134E-4,6.8693130742758512E-4,7.3553412221372128E-4,7.8125012805685401E-4,7.614599890075624E-4,7.8850419959053397E-4,5.8270583394914865E-4}>>, tensor<64x!quant.uniform>) -> tensor> + %15 = "tfl.pseudo_const"() {value = dense<[-1, 4096]> : tensor<2xi32>} : () -> tensor<2xi32> + %16 = "tfl.reshape"(%14, %15) : (tensor>, tensor<2xi32>) -> tensor> + return %16 : tensor> +} diff --git a/xformer/Test/op_split_2.mlir b/xformer/Test/op_split_2.mlir new file mode 100644 index 000000000..9fab986f1 --- /dev/null +++ b/xformer/Test/op_split_2.mlir @@ -0,0 +1,14 @@ +// RUN: xcore-opt --mlir-io %s --xcore-op-split --xcore-op-split-bottom-op=0 --xcore-op-split-top-op=1 --xcore-op-split-num-splits=4 | FileCheck %s + +// CHECK-LABEL: op_split_test_pad +func.func @op_split_test_pad(%arg0: tensor>) -> (tensor>) attributes {tf.entry_function = {inputs = "serving_default_image_input:0", outputs = "StatefulPartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %0 = "tfl.pseudo_const"() {value = dense<10> : tensor<2xi32>} : () -> tensor<2xi32> + %1 = "tfl.pseudo_const"() {value = dense<[[0, 0], [1, 0], [1, 0], [0, 0]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> + // CHECK{LITERAL}: dense<[[0, 0], [1, 0], [1, 0], [0, 0]]> : tensor<4x2xi32> + // CHECK{LITERAL}: dense<[[0, 0], [0, 0], [1, 0], [0, 0]]> : tensor<4x2xi32> + %2 = "tfl.pad"(%arg0, %1) : (tensor>, tensor<4x2xi32>) -> tensor> + %3 = "tfl.pseudo_qconst"() {qtype = tensor<8x3x3x1x!quant.uniform:f32:0, {0.013641691766679287,0.018241593614220619,0.085280418395996094,0.011317887343466282,0.02877839095890522,0.012768007814884186,0.025234472006559372,0.022730587050318718}>>, value = dense<[[[[19], [102], [70]], [[-21], [127], [92]], [[5], [-28], [-39]]], [[[-20], [86], [127]], [[-24], [34], [62]], [[30], [-16], [-26]]], [[[-13], [-17], [-13]], [[32], [-121], [-127]], [[-17], [6], [42]]], [[[22], [105], [100]], [[-13], [127], [95]], [[-12], [-46], [-61]]], [[[52], [127], [67]], [[-19], [-28], [-59]], [[-21], [18], [13]]], [[[38], [127], [110]], [[-27], [124], [95]], [[-6], [-26], [-63]]], [[[-15], [18], [44]], [[1], [100], [127]], [[-2], [-44], [-31]]], [[[-8], [-81], [-127]], [[21], [-20], [-32]], [[-16], [6], [0]]]]> : tensor<8x3x3x1xi8>} : () -> tensor<8x3x3x1x!quant.uniform:f32:0, {0.013641691766679287,0.018241593614220619,0.085280418395996094,0.011317887343466282,0.02877839095890522,0.012768007814884186,0.025234472006559372,0.022730587050318718}>> + %4 = "tfl.pseudo_qconst"() {qtype = tensor<8x!quant.uniform>, value = dense<[5664, 3198, 1604, -22657, 1055, -12052, 1630, -10665]> : tensor<8xi32>} : () -> tensor<8x!quant.uniform> + %5 = "tfl.conv_2d"(%2, %3, %4) {dilation_h_factor = 1 : i32, dilation_w_factor = 1 : i32, fused_activation_function = "RELU6", padding = "VALID", stride_h = 2 : i32, stride_w = 2 : i32} : (tensor>, tensor<8x3x3x1x!quant.uniform:f32:0, {0.013641691766679287,0.018241593614220619,0.085280418395996094,0.011317887343466282,0.02877839095890522,0.012768007814884186,0.025234472006559372,0.022730587050318718}>>, tensor<8x!quant.uniform>) -> tensor> + return %5 : tensor> +} \ No newline at end of file diff --git a/xformer/Test/padding.mlir b/xformer/Test/padding.mlir new file mode 100644 index 000000000..48cddb108 --- /dev/null +++ b/xformer/Test/padding.mlir @@ -0,0 +1,41 @@ +// RUN: xcore-opt --mlir-io %s --xcore-replace-pad | FileCheck %s + +// CHECK-LABEL: replace_pad_negative_zeropoint +func.func @replace_pad_negative_zeropoint(%arg0: tensor<1x4x1x48x!quant.uniform>) -> tensor<1x4x3x48x!quant.uniform> attributes {tf.entry_function = {inputs = "zero_padding2d_input_int8", outputs = "Identity_int8"}} { + %0 = "tfl.pseudo_const"() {value = dense<[[0, 0], [0, 0], [2, 0], [0, 0]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> + // CHECK: xc.pad + // CHECK-SAME: zero_point = -151587082 : i32 + %1 = "tfl.pad"(%arg0, %0) : (tensor<1x4x1x48x!quant.uniform>, tensor<4x2xi32>) -> tensor<1x4x3x48x!quant.uniform> + return %1 : tensor<1x4x3x48x!quant.uniform> +} + +// ----- + +// CHECK-LABEL: replace_pad_positive_zeropoint +func.func @replace_pad_positive_zeropoint(%arg0: tensor<1x4x1x48x!quant.uniform>) -> tensor<1x4x3x48x!quant.uniform> attributes {tf.entry_function = {inputs = "zero_padding2d_input_int8", outputs = "Identity_int8"}} { + %0 = "tfl.pseudo_const"() {value = dense<[[0, 0], [0, 0], [2, 0], [0, 0]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> + // CHECK: xc.pad + // CHECK-SAME: zero_point = 168430090 : i32 + %1 = "tfl.pad"(%arg0, %0) : (tensor<1x4x1x48x!quant.uniform>, tensor<4x2xi32>) -> tensor<1x4x3x48x!quant.uniform> + return %1 : tensor<1x4x3x48x!quant.uniform> +} + +// ----- + +// CHECK-LABEL: replace_pad_with_invalid_shape +func.func @replace_pad_with_invalid_shape(%arg0: tensor<1x4x48x!quant.uniform>) -> tensor<1x4x48x!quant.uniform> attributes {tf.entry_function = {inputs = "zero_padding2d_input_int8", outputs = "Identity_int8"}} { + %0 = "tfl.pseudo_const"() {value = dense<[[0, 0], [0, 0], [2, 0]]> : tensor<3x2xi32>} : () -> tensor<3x2xi32> + // CHECK-NOT: xc.pad + %1 = "tfl.pad"(%arg0, %0) : (tensor<1x4x48x!quant.uniform>, tensor<3x2xi32>) -> tensor<1x4x48x!quant.uniform> + return %1 : tensor<1x4x48x!quant.uniform> +} + +// ----- + +// CHECK-LABEL: replace_pad_with_batchchannel_padding +func.func @replace_pad_with_batchchannel_padding(%arg0: tensor<1x4x1x48x!quant.uniform>) -> tensor<1x4x3x48x!quant.uniform> attributes {tf.entry_function = {inputs = "zero_padding2d_input_int8", outputs = "Identity_int8"}} { + %0 = "tfl.pseudo_const"() {value = dense<[[1, 1], [0, 0], [2, 0], [1, 1]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> + // CHECK: xc.pad + %1 = "tfl.pad"(%arg0, %0) : (tensor<1x4x1x48x!quant.uniform>, tensor<4x2xi32>) -> tensor<1x4x3x48x!quant.uniform> + return %1 : tensor<1x4x3x48x!quant.uniform> +} diff --git a/xformer/Test/pytorch_transpose.mlir b/xformer/Test/pytorch_transpose.mlir new file mode 100644 index 000000000..e5a02e09e --- /dev/null +++ b/xformer/Test/pytorch_transpose.mlir @@ -0,0 +1,39 @@ +// RUN: xcore-opt --mlir-io %s --xcore-optimize-transpose | FileCheck %s + +// CHECK-LABEL: hoist_pad_above_transpose +func.func @hoist_pad_above_transpose(%arg0: tensor>) -> (tensor>) { + %10 = "tfl.pseudo_const"() {value = dense<[0, 3, 1, 2]> : tensor<4xi32>} : () -> tensor<4xi32> + %11 = "tfl.pseudo_const"() {value = dense<[0, 2, 3, 1]> : tensor<4xi32>} : () -> tensor<4xi32> + %12 = "tfl.pseudo_const"() {value = dense<[[0, 0], [0, 0], [1, 1], [1, 1]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> + // CHECK: pad + // CHECK-NOT: transpose + %18 = "tfl.transpose"(%arg0, %10) : (tensor>, tensor<4xi32>) -> tensor> + %20 = "tfl.pad"(%18, %12) : (tensor>, tensor<4x2xi32>) -> tensor> + %19 = "tfl.transpose"(%20, %11) : (tensor>, tensor<4xi32>) -> tensor> + return %19 : tensor> +} + +// CHECK-LABEL: fold_cancellable_transpose +func.func @fold_cancellable_transpose(%arg0: tensor>) -> (tensor>) { + %10 = "tfl.pseudo_const"() {value = dense<[0, 3, 1, 2]> : tensor<4xi32>} : () -> tensor<4xi32> + %11 = "tfl.pseudo_const"() {value = dense<[0, 2, 3, 1]> : tensor<4xi32>} : () -> tensor<4xi32> + %12 = "tfl.pseudo_const"() {value = dense<[[0, 0], [1, 1], [1, 1], [0, 0]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> + // CHECK-NOT: transpose + // CHECK: pad + %18 = "tfl.transpose"(%arg0, %10) : (tensor>, tensor<4xi32>) -> tensor> + %19 = "tfl.transpose"(%18, %11) : (tensor>, tensor<4xi32>) -> tensor> + %20 = "tfl.pad"(%19, %12) : (tensor>, tensor<4x2xi32>) -> tensor> + return %20 : tensor> +} + +// CHECK-LABEL: merge_consecutive_transposes +func.func @merge_consecutive_transposes(%arg0: tensor>) -> (tensor>) { + // CHECK: dense<[0, 1, 3, 2]> + // CHECK: transpose + // CHECK-NOT: transpose + %10 = "tfl.pseudo_const"() {value = dense<[0, 2, 3, 1]> : tensor<4xi32>} : () -> tensor<4xi32> + %11 = "tfl.pseudo_const"() {value = dense<[0, 3, 2, 1]> : tensor<4xi32>} : () -> tensor<4xi32> + %18 = "tfl.transpose"(%arg0, %10) : (tensor>, tensor<4xi32>) -> tensor> + %19 = "tfl.transpose"(%18, %11) : (tensor>, tensor<4xi32>) -> tensor> + return %19 : tensor> +} diff --git a/xformer/Test/pytorch_transpose_input.mlir b/xformer/Test/pytorch_transpose_input.mlir new file mode 100644 index 000000000..55ab7d8c0 --- /dev/null +++ b/xformer/Test/pytorch_transpose_input.mlir @@ -0,0 +1,58 @@ +// RUN: xcore-opt --mlir-io %s --xcore-optimize-transpose | FileCheck %s +// RUN: xcore-opt --mlir-io %s --xcore-optimize-transpose --xcore-allow-input-modification | FileCheck %s -check-prefix=INPUT-CHECK + +// CHECK-LABEL: hoist_pad_above_transpose +func.func @hoist_pad_above_transpose(%arg0: tensor>) -> (tensor>) { + %10 = "tfl.pseudo_const"() {value = dense<[0, 3, 1, 2]> : tensor<4xi32>} : () -> tensor<4xi32> + %11 = "tfl.pseudo_const"() {value = dense<[0, 2, 3, 1]> : tensor<4xi32>} : () -> tensor<4xi32> + %12 = "tfl.pseudo_const"() {value = dense<[[0, 0], [0, 0], [1, 1], [1, 1]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> + // CHECK: pad + // CHECK-NOT: transpose + %18 = "tfl.transpose"(%arg0, %10) : (tensor>, tensor<4xi32>) -> tensor> + %20 = "tfl.pad"(%18, %12) : (tensor>, tensor<4x2xi32>) -> tensor> + %19 = "tfl.transpose"(%20, %11) : (tensor>, tensor<4xi32>) -> tensor> + return %19 : tensor> +} + +// ----- + +// CHECK-LABEL: fold_cancellable_transpose +func.func @fold_cancellable_transpose(%arg0: tensor>) -> (tensor>) { + %10 = "tfl.pseudo_const"() {value = dense<[0, 3, 1, 2]> : tensor<4xi32>} : () -> tensor<4xi32> + %11 = "tfl.pseudo_const"() {value = dense<[0, 2, 3, 1]> : tensor<4xi32>} : () -> tensor<4xi32> + %12 = "tfl.pseudo_const"() {value = dense<[[0, 0], [1, 1], [1, 1], [0, 0]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> + // CHECK-NOT: transpose + // CHECK: pad + %18 = "tfl.transpose"(%arg0, %10) : (tensor>, tensor<4xi32>) -> tensor> + %19 = "tfl.transpose"(%18, %11) : (tensor>, tensor<4xi32>) -> tensor> + %20 = "tfl.pad"(%19, %12) : (tensor>, tensor<4x2xi32>) -> tensor> + return %20 : tensor> +} + +// ----- + +// INPUT-CHECK-LABEL: fold_to_input +// INPUT-CHECK: %arg0: tensor>) -> (tensor>) { + %10 = "tfl.pseudo_const"() {value = dense<[0, 3, 1, 2]> : tensor<4xi32>} : () -> tensor<4xi32> + %11 = "tfl.pseudo_const"() {value = dense<[0, 2, 3, 1]> : tensor<4xi32>} : () -> tensor<4xi32> + %12 = "tfl.pseudo_const"() {value = dense<[[0, 0], [1, 1], [1, 1], [0, 0]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> + // INPUT-CHECK-NOT: transpose + %19 = "tfl.transpose"(%arg0, %11) : (tensor>, tensor<4xi32>) -> tensor> + %20 = "tfl.pad"(%19, %12) : (tensor>, tensor<4x2xi32>) -> tensor> + return %20 : tensor> +} + +// ----- + +// CHECK-LABEL: fold_to_input2 +// CHECK: %arg0: tensor>) -> (tensor>) { + %10 = "tfl.pseudo_const"() {value = dense<[0, 3, 1, 2]> : tensor<4xi32>} : () -> tensor<4xi32> + %11 = "tfl.pseudo_const"() {value = dense<[0, 2, 3, 1]> : tensor<4xi32>} : () -> tensor<4xi32> + %12 = "tfl.pseudo_const"() {value = dense<[[0, 0], [1, 1], [1, 1], [0, 0]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> + // CHECK: transpose + %19 = "tfl.transpose"(%arg0, %11) : (tensor>, tensor<4xi32>) -> tensor> + %20 = "tfl.pad"(%19, %12) : (tensor>, tensor<4x2xi32>) -> tensor> + return %20 : tensor> +} diff --git a/experimental/xformer/Test/run_lit.sh b/xformer/Test/run_lit.sh similarity index 100% rename from experimental/xformer/Test/run_lit.sh rename to xformer/Test/run_lit.sh diff --git a/experimental/xformer/Test/tfl_fc.tflite b/xformer/Test/tfl_fc.tflite similarity index 100% rename from experimental/xformer/Test/tfl_fc.tflite rename to xformer/Test/tfl_fc.tflite diff --git a/xformer/Test/tflpatterns.mlir b/xformer/Test/tflpatterns.mlir new file mode 100644 index 000000000..e64a5c789 --- /dev/null +++ b/xformer/Test/tflpatterns.mlir @@ -0,0 +1,15 @@ +// RUN: xcore-opt --mlir-io %s --xcore-apply-tflpatterns | FileCheck %s + +// CHECK-LABEL: hoist_quantize_above_concat +func.func @hoist_quantize_above_concat(%arg0: tensor> {tf_saved_model.index_path = ["input_1"]}) -> (tensor> {tf_saved_model.index_path = ["concatenate_2"]}) attributes {tf.entry_function = {inputs = "serving_default_input_1:0", outputs = "StatefulPartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + %1 = "tfl.pseudo_qconst"() {qtype = tensor>, value = dense<1> : tensor<3072x1xi8>} : () -> tensor> + %2 = "tfl.pseudo_qconst"() {qtype = tensor>, value = dense<1> : tensor<768x1xi8>} : () -> tensor> + %3 = "tfl.pseudo_qconst"() {qtype = tensor>, value = dense<1> : tensor<192x1xi8>} : () -> tensor> + // CHECK: tfl.quantize + // CHECK: tfl.quantize + // CHECK: tfl.quantize + %204 = "tfl.concatenation"(%1, %2, %3) {axis = 1 : i32, fused_activation_function = "NONE"} : (tensor>, tensor>, tensor>) -> tensor> + // CHECK-NOT: tfl.quantize + %205 = "tfl.quantize"(%204) {qtype = tensor>} : (tensor>) -> tensor> + return %205 : tensor> +} diff --git a/xformer/Test/translate-to-customops.mlir b/xformer/Test/translate-to-customops.mlir new file mode 100644 index 000000000..a6113991f --- /dev/null +++ b/xformer/Test/translate-to-customops.mlir @@ -0,0 +1,10 @@ +// RUN: xcore-opt --mlir-io %s --xcore-translate-to-customop | FileCheck %s + +// CHECK-LABEL: activation_lowering +func.func @activation_lowering(%arg0: tensor<1x12x4x7x!quant.uniform>) -> tensor<1x12x4x7x!quant.uniform> attributes {tf.entry_function = {inputs = "lambda_input_int8", outputs = "Identity_int8"}} { + %cst = arith.constant dense<"0x828486888A8C8E90929496989A9C9EA0A2A4A6A8AAACAEB0B2B4B6B8BABCBEC0C2C4C6C8CACCCED0D2D4D6D8DADCDEE0E2E4E6E8EAECEEF0F2F4F6F8FAFCFE00020406080A0C0E10121416181A1C1E20222426282A2C2E30323436383A3C3E40424446484A4C4E50525456585A5C5E60626466686A6C6E70727476787A7C7E7F8080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080"> : tensor<256xui8> +// CHECK: tfl.custom +// CHECK-SAME: XC_lookup + %0 = "xc.lookup"(%arg0, %cst) {thread_count = 5 : i32} : (tensor<1x12x4x7x!quant.uniform>, tensor<256xui8>) -> tensor<1x12x4x7x!quant.uniform> + return %0 : tensor<1x12x4x7x!quant.uniform> +} diff --git a/xformer/Test/valid_broadcast.mlir b/xformer/Test/valid_broadcast.mlir new file mode 100644 index 000000000..86d5c1d2f --- /dev/null +++ b/xformer/Test/valid_broadcast.mlir @@ -0,0 +1,47 @@ +// RUN: xcore-opt --mlir-io %s --xcore-replace-broadcast | FileCheck %s + +// CHECK-LABEL: valid_broadcast1 +func.func @valid_broadcast1(%arg0: tensor<1x5x1x16x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x5x8x16x!quant.uniform> {tf_saved_model.index_path = ["tf.broadcast_to_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + // CHECK: xc.broadcast + // CHECK-NOT: tfl.broadcast_to + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[1, 5, 8, 16]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.broadcast_to"(%arg0, %0) : (tensor<1x5x1x16x!quant.uniform>, tensor<4xi32>) -> tensor<1x5x8x16x!quant.uniform> + return %1 : tensor<1x5x8x16x!quant.uniform> +} + +// CHECK-LABEL: valid_broadcast2 +func.func @valid_broadcast2(%arg0: tensor<1x5x8x1x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x5x8x16x!quant.uniform> {tf_saved_model.index_path = ["tf.broadcast_to_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + // CHECK: xc.broadcast + // CHECK-NOT: tfl.broadcast_to + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[1, 5, 8, 16]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.broadcast_to"(%arg0, %0) : (tensor<1x5x8x1x!quant.uniform>, tensor<4xi32>) -> tensor<1x5x8x16x!quant.uniform> + return %1 : tensor<1x5x8x16x!quant.uniform> +} + +// CHECK-LABEL: valid_broadcast3 +func.func @valid_broadcast3(%arg0: tensor<1x5x8x1x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x5x8x23x!quant.uniform> {tf_saved_model.index_path = ["tf.broadcast_to_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + // CHECK: xc.broadcast + // CHECK-NOT: tfl.broadcast_to + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[1, 5, 8, 23]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.broadcast_to"(%arg0, %0) : (tensor<1x5x8x1x!quant.uniform>, tensor<4xi32>) -> tensor<1x5x8x23x!quant.uniform> + return %1 : tensor<1x5x8x23x!quant.uniform> +} + +// CHECK-LABEL: valid_broadcast4 +func.func @valid_broadcast4(%arg0: tensor<1x5x1x1x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x5x8x23x!quant.uniform> {tf_saved_model.index_path = ["tf.broadcast_to_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + // CHECK: xc.broadcast + // CHECK-NOT: tfl.broadcast_to + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[1, 5, 8, 23]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.broadcast_to"(%arg0, %0) : (tensor<1x5x1x1x!quant.uniform>, tensor<4xi32>) -> tensor<1x5x8x23x!quant.uniform> + return %1 : tensor<1x5x8x23x!quant.uniform> +} + +// CHECK-LABEL: valid_broadcast5 +func.func @valid_broadcast5(%arg0: tensor<8x23x!quant.uniform> {tf_saved_model.index_path = ["input_2"]}) -> (tensor<1x5x8x23x!quant.uniform> {tf_saved_model.index_path = ["tf.broadcast_to_1"]}) attributes {tf.entry_function = {inputs = "serving_default_input_2:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + // CHECK: xc.broadcast + // CHECK-NOT: tfl.broadcast_to + %0 = "tfl.pseudo_qconst"() {qtype = tensor<4xi32>, value = dense<[1, 5, 8, 23]> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.broadcast_to"(%arg0, %0) : (tensor<8x23x!quant.uniform>, tensor<4xi32>) -> tensor<1x5x8x23x!quant.uniform> + return %1 : tensor<1x5x8x23x!quant.uniform> +} + diff --git a/xformer/Test/valid_concat.mlir b/xformer/Test/valid_concat.mlir new file mode 100644 index 000000000..f0151ff72 --- /dev/null +++ b/xformer/Test/valid_concat.mlir @@ -0,0 +1,23 @@ +// RUN: xcore-opt --mlir-io %s --xcore-replace-concat | FileCheck %s + +// CHECK-LABEL: valid_concat +func.func @valid_concat(%arg0: tensor<1x2x6x5x2xf32> {tf_saved_model.index_path = ["input_8"]}, %arg1: tensor<1x2x6x5x2xf32> {tf_saved_model.index_path = ["input_7"]}) -> (tensor<1x4x6x5x2xf32> {tf_saved_model.index_path = ["concatenate_3"]}) attributes {tf.entry_function = {inputs = "serving_default_input_8:0,serving_default_input_7:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + // CHECK: xc.concat + // CHECK-NOT: tfl.concatenation + %0 = "tfl.quantize"(%arg1) {qtype = tensor<1x2x6x5x2x!quant.uniform>} : (tensor<1x2x6x5x2xf32>) -> tensor<1x2x6x5x2x!quant.uniform> + %1 = "tfl.quantize"(%arg0) {qtype = tensor<1x2x6x5x2x!quant.uniform>} : (tensor<1x2x6x5x2xf32>) -> tensor<1x2x6x5x2x!quant.uniform> + %2 = "tfl.quantize"(%1) {qtype = tensor<1x2x6x5x2x!quant.uniform>} : (tensor<1x2x6x5x2x!quant.uniform>) -> tensor<1x2x6x5x2x!quant.uniform> + %3 = "tfl.concatenation"(%0, %2) {axis = 1 : i32, fused_activation_function = "NONE"} : (tensor<1x2x6x5x2x!quant.uniform>, tensor<1x2x6x5x2x!quant.uniform>) -> tensor<1x4x6x5x2x!quant.uniform> + %4 = "tfl.dequantize"(%3) : (tensor<1x4x6x5x2x!quant.uniform>) -> tensor<1x4x6x5x2xf32> + return %4 : tensor<1x4x6x5x2xf32> +} + +// CHECK-LABEL: valid_concat_40 +func.func @valid_concat_40(%arg0: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_110"]}, %arg1: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_113"]}, %arg2: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_108"]}, %arg3: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_93"]}, %arg4: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_104"]}, %arg5: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_111"]}, %arg6: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_99"]}, %arg7: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_116"]}, %arg8: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_114"]}, %arg9: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_102"]}, %arg10: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_119"]}, %arg11: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_95"]}, %arg12: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_84"]}, %arg13: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_106"]}, %arg14: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_112"]}, %arg15: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_96"]}, %arg16: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_88"]}, %arg17: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_98"]}, %arg18: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_86"]}, %arg19: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_105"]}, %arg20: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_115"]}, %arg21: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_85"]}, %arg22: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_91"]}, %arg23: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_89"]}, %arg24: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_90"]}, %arg25: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_117"]}, %arg26: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_118"]}, %arg27: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_87"]}, %arg28: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_81"]}, %arg29: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_120"]}, %arg30: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_103"]}, %arg31: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_100"]}, %arg32: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_94"]}, %arg33: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_109"]}, %arg34: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_82"]}, %arg35: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_92"]}, %arg36: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_97"]}, %arg37: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_107"]}, %arg38: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_101"]}, %arg39: tensor<1x2x6x5x2xi8> {tf_saved_model.index_path = ["input_83"]}) -> (tensor<1x2x6x200x2xi8> {tf_saved_model.index_path = ["tf.concat_11"]}) attributes {tf.entry_function = {inputs = "serving_default_input_110:0,serving_default_input_113:0,serving_default_input_108:0,serving_default_input_93:0,serving_default_input_104:0,serving_default_input_111:0,serving_default_input_99:0,serving_default_input_116:0,serving_default_input_114:0,serving_default_input_102:0,serving_default_input_119:0,serving_default_input_95:0,serving_default_input_84:0,serving_default_input_106:0,serving_default_input_112:0,serving_default_input_96:0,serving_default_input_88:0,serving_default_input_98:0,serving_default_input_86:0,serving_default_input_105:0,serving_default_input_115:0,serving_default_input_85:0,serving_default_input_91:0,serving_default_input_89:0,serving_default_input_90:0,serving_default_input_117:0,serving_default_input_118:0,serving_default_input_87:0,serving_default_input_81:0,serving_default_input_120:0,serving_default_input_103:0,serving_default_input_100:0,serving_default_input_94:0,serving_default_input_109:0,serving_default_input_82:0,serving_default_input_92:0,serving_default_input_97:0,serving_default_input_107:0,serving_default_input_101:0,serving_default_input_83:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + // CHECK: xc.concat + // CHECK: xc.concat + // CHECK: xc.concat + // CHECK-NOT: tfl.concatenation + %0 = "tfl.concatenation"(%arg28, %arg34, %arg39, %arg12, %arg21, %arg18, %arg27, %arg16, %arg23, %arg24, %arg22, %arg35, %arg3, %arg32, %arg11, %arg15, %arg36, %arg17, %arg6, %arg31, %arg38, %arg9, %arg30, %arg4, %arg19, %arg13, %arg37, %arg2, %arg33, %arg0, %arg5, %arg14, %arg1, %arg8, %arg20, %arg7, %arg25, %arg26, %arg10, %arg29) {axis = 3 : i32, fused_activation_function = "NONE"} : (tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>, tensor<1x2x6x5x2xi8>) -> tensor<1x2x6x200x2xi8> + return %0 : tensor<1x2x6x200x2xi8> +} diff --git a/xformer/Test/valid_pad.mlir b/xformer/Test/valid_pad.mlir new file mode 100644 index 000000000..ddab70dfb --- /dev/null +++ b/xformer/Test/valid_pad.mlir @@ -0,0 +1,10 @@ +// RUN: xcore-opt --mlir-io %s --xcore-replace-pad | FileCheck %s + +// CHECK-LABEL: valid_pad +func.func @valid_pad(%arg0: tensor<1x8x8x9xf32> {tf_saved_model.index_path = ["input_1"]}) -> (tensor<1x9x9x9xf32> {tf_saved_model.index_path = ["zero_padding2d"]}) attributes {tf.entry_function = {inputs = "serving_default_input_1:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + // CHECK: xc.pad + // CHECK-NOT: tfl.pad + %0 = "tfl.pseudo_const"() {value = dense<[[0, 0], [0, 1], [0, 1], [0, 0]]> : tensor<4x2xi32>} : () -> tensor<4x2xi32> + %1 = "tfl.pad"(%arg0, %0) : (tensor<1x8x8x9xf32>, tensor<4x2xi32>) -> tensor<1x9x9x9xf32> + return %1 : tensor<1x9x9x9xf32> +} diff --git a/xformer/Test/valid_slice.mlir b/xformer/Test/valid_slice.mlir new file mode 100644 index 000000000..1a0327283 --- /dev/null +++ b/xformer/Test/valid_slice.mlir @@ -0,0 +1,11 @@ +// RUN: xcore-opt --mlir-io %s --xcore-replace-slice | FileCheck %s + +// CHECK-LABEL: valid_slice1 +func.func @valid_slice1(%arg0: tensor<1x8x15x32xi8> {tf_saved_model.index_path = ["input_7"]}) -> (tensor<1x8x15x28xi8> {tf_saved_model.index_path = ["tf.slice_6"]}) attributes {tf.entry_function = {inputs = "serving_default_input_7:0", outputs = "PartitionedCall:0"}, tf_saved_model.exported_names = ["serving_default"]} { + // CHECK: xc.slice + // CHECK-NOT: tfl.slice + %0 = "tfl.pseudo_const"() {value = dense<0> : tensor<4xi32>} : () -> tensor<4xi32> + %1 = "tfl.pseudo_const"() {value = dense<[1, 8, 15, 28]> : tensor<4xi32>} : () -> tensor<4xi32> + %2 = "tfl.slice"(%arg0, %0, %1) : (tensor<1x8x15x32xi8>, tensor<4xi32>, tensor<4xi32>) -> tensor<1x8x15x28xi8> + return %2 : tensor<1x8x15x28xi8> +} diff --git a/xformer/Transforms/ApplyLoadConstantOpPatterns.cpp b/xformer/Transforms/ApplyLoadConstantOpPatterns.cpp new file mode 100644 index 000000000..91b09748d --- /dev/null +++ b/xformer/Transforms/ApplyLoadConstantOpPatterns.cpp @@ -0,0 +1,85 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "IR/XCoreOps.h" +#include "Transforms/Options.h" + +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +namespace { +// Apply generated patterns. +struct ApplyLoadConstantOpPatterns + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ApplyLoadConstantOpPatterns) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { + return "xcore-apply-loadconstantop-patterns"; + } + StringRef getDescription() const final { + return "Apply load constant op optimization patterns."; + } + void runOnOperation() override; +}; + +static int totalSize_ = 0; + +bool shouldBeLoadedExternally(Attribute values) { + if (totalSize_ > maxLoadExternalSizeOption) { + return false; + } + // values might be UnitAttr or BoolAttr which are too small to be loaded + // externally anyway + auto totalSizeInBits = 0; + if (values.isa()) { + auto valuesAttr = values.cast(); + totalSizeInBits = + (valuesAttr.getNumElements() * + valuesAttr.getType().getElementType().getIntOrFloatBitWidth()); + } + totalSize_ += totalSizeInBits / CHAR_BIT; + return totalSizeInBits / CHAR_BIT > loadExternallyIfLargerOption; +} + +bool isNotUsedByLoadConstantOp(Value result) { + if (result.hasOneUse()) { + if (llvm::isa(*result.getUsers().begin())) { + return false; + } + } + return true; +} + +#include "Transforms/GeneratedLoadConstantOpPatterns.inc" + +void ApplyLoadConstantOpPatterns::runOnOperation() { + func::FuncOp f = getOperation(); + if (weightsFilenameOption.empty()) { + f.emitError("Weights file option should be provided to run this pass!"); + signalPassFailure(); + return; + } + + RewritePatternSet patterns(&getContext()); + func::FuncOp func = getOperation(); + populateWithGenerated(patterns); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ApplyLoadConstantOpPatterns pass. +std::unique_ptr> +createApplyLoadConstantOpPatternsPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ApplyTFLPatterns.cpp b/xformer/Transforms/ApplyTFLPatterns.cpp new file mode 100644 index 000000000..62f71ac6e --- /dev/null +++ b/xformer/Transforms/ApplyTFLPatterns.cpp @@ -0,0 +1,190 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "IR/XCoreOps.h" +#include "Utils/Util.h" + +#include "larq_compute_engine/mlir/ir/lce_ops.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" +#include "tensorflow/core/framework/kernel_shape_util.h" + +namespace mlir::xcore { + +namespace { +// Apply generated TFL patterns. +struct ApplyTFLPatterns + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ApplyTFLPatterns) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-apply-tflpatterns"; } + StringRef getDescription() const final { + return "Apply generated TFL optimization patterns."; + } + void runOnOperation() override; +}; + +template +SmallVector +getConvPaddingValues(PatternRewriter &rewriter, T conv2DOp, + int64_t dilationHeight, int64_t dilationWidth, + int64_t strideHeight, int64_t strideWidth, + int64_t filterHeight, int64_t filterWidth) { + auto inputType = + conv2DOp.getInput().getType().template dyn_cast(); + auto inputHeight = inputType.getDimSize(1); + auto inputWidth = inputType.getDimSize(2); + + // Find padding values + int64_t newHeight, newWidth; + int64_t padTop, padBottom, padLeft, padRight; + if (tensorflow::GetWindowedOutputSizeVerbose( + inputHeight, filterHeight, dilationHeight, strideHeight, + tensorflow::Padding::SAME, &newHeight, &padTop, + &padBottom) != tensorflow::OkStatus()) { + conv2DOp->emitError("Could not obtain SAME padding values for Conv op!"); + } + if (tensorflow::GetWindowedOutputSizeVerbose( + inputWidth, filterWidth, dilationWidth, strideWidth, + tensorflow::Padding::SAME, &newWidth, &padLeft, + &padRight) != tensorflow::OkStatus()) { + conv2DOp->emitError("Could not obtain SAME padding values for Conv op!"); + } + + std::vector paddingValues{0, + 0, + static_cast(padTop), + static_cast(padBottom), + static_cast(padLeft), + static_cast(padRight), + 0, + 0}; + + RankedTensorType type = RankedTensorType::get({4, 2}, rewriter.getI32Type()); + auto attr = DenseIntElementsAttr::get(type, paddingValues); + auto paddingOp = + rewriter.create(conv2DOp->getLoc(), type, attr); + + // Obtain the output type so that we can use it to denote the returnType for + // the PadOp in Tablegen DRR + auto batch = inputType.getDimSize(0); + auto depth = inputType.getDimSize(3); + auto outputHeight = inputHeight + padTop + padBottom; + auto outputWidth = inputWidth + padLeft + padRight; + RankedTensorType outputType = RankedTensorType::get( + {batch, outputHeight, outputWidth, depth}, inputType.getElementType()); + auto outputTypeOp = rewriter.create( + conv2DOp->getLoc(), outputType, + DenseIntElementsAttr::get( + RankedTensorType::get({1}, rewriter.getI32Type()), {1})); + return SmallVector({paddingOp, outputTypeOp}); +} + +template +SmallVector getConv2DPaddingValues(PatternRewriter &rewriter, + T conv2DOp) { + auto filterType = + conv2DOp.getFilter().getType().template dyn_cast(); + auto filterHeight = filterType.getDimSize(1); + auto filterWidth = filterType.getDimSize(2); + return getConvPaddingValues( + rewriter, conv2DOp, conv2DOp.getDilationHFactor(), + conv2DOp.getDilationWFactor(), conv2DOp.getStrideH(), + conv2DOp.getStrideW(), filterHeight, filterWidth); +} + +template +SmallVector getMaxPool2DPaddingValues(PatternRewriter &rewriter, + T maxpoolOp) { + return getConvPaddingValues( + rewriter, maxpoolOp, 1, 1, maxpoolOp.getStrideH(), maxpoolOp.getStrideW(), + maxpoolOp.getFilterHeight(), maxpoolOp.getFilterWidth()); +} + +SmallVector getBConv2DPaddingValues(PatternRewriter &rewriter, + mlir::lq::Bconv2dOp conv2DOp) { + auto filterType = + conv2DOp.getFilter().getType().template dyn_cast(); + auto filterHeight = filterType.getDimSize(1); + auto filterWidth = filterType.getDimSize(2); + return getConvPaddingValues( + rewriter, conv2DOp, conv2DOp.getDilationHeightFactor(), + conv2DOp.getDilationWidthFactor(), conv2DOp.getStrideHeight(), + conv2DOp.getStrideWidth(), filterHeight, filterWidth); +} + +struct HoistQuantizeAboveConcatPattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::QuantizeOp quantizeOp, + PatternRewriter &rewriter) const override { + // Parent op must be concat + auto concatOp = dyn_cast_or_null( + quantizeOp.getInput().getDefiningOp()); + if (!concatOp) { + return failure(); + } + if (!concatOp.getOutput().getType().getElementType().isa()) { + return failure(); + } + + SmallVector quantizeOps; + TFL::QuantizeOp newQuantizeOp; + for (int i = 0; i < concatOp->getNumOperands(); ++i) { + auto newQType = quant::CastQuantizedTypeAttrFromExpressedType( + rewriter, quantizeOp.getQtypeAttr(), + quant::QuantizedType::castToExpressedType( + concatOp.getOperand(i).getType()), + -1); + newQuantizeOp = rewriter.create( + quantizeOp.getLoc(), newQType.getValue(), concatOp.getOperand(i), + newQType); + quantizeOps.push_back(newQuantizeOp.getResult()); + } + + // We use one of the quantizeops to get the output element type with the new + // quantized parameters. + // All of them have the same quantization parameters + RankedTensorType newOutputType = RankedTensorType::get( + concatOp.getOutput().getType().cast().getShape(), + newQuantizeOp.getOutput() + .getType() + .cast() + .getElementType()); + + auto newConcatOp = rewriter.create( + concatOp.getLoc(), newOutputType, quantizeOps, concatOp.getAxis(), + concatOp.getFusedActivationFunction()); + + rewriter.replaceOp(quantizeOp, newConcatOp.getOutput()); + + return success(); + } +}; + +#include "Transforms/GeneratedTFLPatterns.inc" + +void ApplyTFLPatterns::runOnOperation() { + auto *ctx = &getContext(); + RewritePatternSet patterns(ctx); + func::FuncOp func = getOperation(); + + populateWithGenerated(patterns); + patterns.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ApplyTFLPatterns pass. +std::unique_ptr> createApplyTFLPatternsPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ApplyXCPatterns.cpp b/xformer/Transforms/ApplyXCPatterns.cpp new file mode 100644 index 000000000..40061d640 --- /dev/null +++ b/xformer/Transforms/ApplyXCPatterns.cpp @@ -0,0 +1,367 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "IR/XCoreOps.h" +#include "Utils/Diagnostics.h" +#include "Utils/Util.h" + +#include "Transforms/Options.h" +#include "larq_compute_engine/mlir/ir/lce_ops.h" +#include "lib_nn/api/add_int16_transform.h" +#include "lib_nn/api/dequantize_int16_transform.h" +#include "lib_nn/api/multiply_int16_transform.h" +#include "lib_nn/api/nn_layers.h" +#include "lib_nn/api/quadratic_approximation.h" +#include "lib_nn/api/quantize_int16_transform.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" +#include "tensorflow/compiler/mlir/lite/utils/validators.h" +#include + +namespace mlir::xcore { + +namespace { +// Apply generated XC patterns. +struct ApplyXCPatterns + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ApplyXCPatterns) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-apply-xcpatterns"; } + StringRef getDescription() const final { + return "Apply generated XC optimization patterns."; + } + void runOnOperation() override; +}; + +bool isBetaFloatEnabled() { return enableBetaFloatOption; } + +IntegerAttr getPadValue(PatternRewriter &rewriter, Value inputVal) { + auto inputType = inputVal.getType().cast(); + auto elementType = inputType.getElementType(); + + // For quantized input type, padValue is the zero_point + // Otherwise, it is zero + int padValue = 0; + if (elementType.isa()) { + auto inputQType = elementType.dyn_cast(); + padValue = inputQType.getZeroPoint(); + elementType = elementType.cast().getStorageType(); + } + + assert(elementType.isIntOrFloat() && + "Type has to be I32, F32, or I8 if quantized!"); + // padValue has to be four bytes + // For input type of int8, this would be arranged as b,b,b,b + if (elementType.isInteger(8)) { + padValue = padValue << 24 | (padValue << 16 & 0x00FFFFFF) | + (padValue << 8 & 0x0000FFFF) | (padValue & 0x000000FF); + } + + return rewriter.getI32IntegerAttr(padValue); +} + +IntegerAttr getActivationType(PatternRewriter &rewriter, Operation *op) { + // TODO: Refactor to use shared header file for enum + if (isa(op)) { + return rewriter.getI32IntegerAttr(0); + } else if (isa(op)) { + return rewriter.getI32IntegerAttr(1); + } else if (isa(op)) { + return rewriter.getI32IntegerAttr(2); + } else { + llvm_unreachable("Unsupported op!"); + } +} + +DenseElementsAttr getExpLookupF32(PatternRewriter &rewriter, Operation *op) { + RankedTensorType inputType = + op->getOperand(0).getType().dyn_cast(); + auto inputQType = + inputType.getElementType().dyn_cast(); + double inputScale = inputQType.getScale(); + int64_t inputZeroPoint = inputQType.getZeroPoint(); + + RankedTensorType outputType = + op->getResult(0).getType().dyn_cast(); + auto outputQType = + outputType.getElementType().dyn_cast(); + double outputScale = outputQType.getScale(); + int64_t outputZeroPoint = outputQType.getZeroPoint(); + assert(outputZeroPoint == -128 && outputScale == 1.0f / 256.0f && + "Output range must be 0-1"); + llvm::SmallVector resultVector; + resultVector.resize(256); + // generateExpLUT(inputZeroPoint, inputScale, resultVector.data()); + for (int i = 0; i < 256; i++) { + float x = ((i - 128) - inputZeroPoint) * inputScale; + resultVector[i] = expf(x); + } + ShapedType lookupTableType = + RankedTensorType::get({256}, rewriter.getF32Type()); + auto lookupTableAttr = + DenseElementsAttr::get(lookupTableType, resultVector); + return lookupTableAttr; +} + +DenseElementsAttr getLookupTableI16(PatternRewriter &rewriter, + Operation *activationOp, Operation *inputOp, + Operation *outputOp) { + // Get input scale and input zero point + RankedTensorType inputType = + inputOp->getOperand(0).getType().dyn_cast(); + auto inputQType = + inputType.getElementType().dyn_cast(); + double inputScale = inputQType.getScale(); + int64_t inputZeroPoint = inputQType.getZeroPoint(); + + // Get output scale and output zero point + RankedTensorType outputType = + outputOp->getResult(0).getType().dyn_cast(); + auto outputQType = + outputType.getElementType().dyn_cast(); + double outputScale = outputQType.getScale(); + assert(outputScale != 0 && "Output scale of zero is not supported!"); + int64_t outputZeroPoint = outputQType.getZeroPoint(); + + float_function_t fn; + + if (isa(activationOp)) { + fn = approximation_function_tanh; + } else if (isa(activationOp)) { + fn = approximation_function_logistics; + } else if (isa(activationOp)) { + fn = approximation_function_elu; + } else if (isa(activationOp)) { + fn = approximation_function_relu; + } else if (isa(activationOp)) { + fn = approximation_function_relu6; + } else { + llvm_unreachable("Unsupported op!"); + } + + double square_error; + int max_error; + int chunks = 128; + quadratic_function_table_t table; + quadratic_approximation_generator(&table, fn, inputScale, outputScale, chunks, + &max_error, &square_error); + if (max_error > quadraticLookupErrorOption) { + std::stringstream msg; + msg << "Quadratic approximation error of " << max_error + << " larger than set threshold of " << quadraticLookupErrorOption + << ", therefore reverting to reference op!" << std::endl + << "Inspect the output, and if suitable, set a " + "higher threshold with --xcore-quadratic-lookup-error." + << std::endl; + activationOp->emitWarning( + utils::getMsgWithLocPrefix(*activationOp, msg.str())); + (void)rewriter.notifyMatchFailure( + activationOp->getLoc(), "Cannot calculate quadratic approximation!"); + return {}; + } + + auto length = quadratic_function_table_number_bytes(&table); + uint8_t *bytes = quadratic_function_table_bytes(&table); + + ArrayRef tableData = ArrayRef(bytes, length); + ShapedType lookupTableType = RankedTensorType::get( + {length}, rewriter.getIntegerType(8, /*signed=*/false)); + auto lookupTableAttr = + DenseElementsAttr::get(lookupTableType, tableData); + return lookupTableAttr; +} + +DenseElementsAttr getLookupTableI16(PatternRewriter &rewriter, Operation *op) { + return getLookupTableI16(rewriter, op, op, op); +} + +DenseElementsAttr getLookupTableI8(PatternRewriter &rewriter, Operation *op, + FloatAttr leakyReluAlpha) { + llvm::SmallVector inputVector; + inputVector.resize(256); + + // The inputvector has 256 input values in the following order, + // 0, 1, 2... -> 127 and + // -128, -127, -126... -> -1 + std::iota(inputVector.begin(), inputVector.begin() + 128, 0); + std::iota(inputVector.begin() + 128, inputVector.end(), -128); + + // Get input scale and input zero point + RankedTensorType inputType = + op->getOperand(0).getType().dyn_cast(); + auto inputQType = + inputType.getElementType().dyn_cast(); + double inputScale = inputQType.getScale(); + int64_t inputZeroPoint = inputQType.getZeroPoint(); + + // Get output scale and output zero point + RankedTensorType outputType = + op->getResult(0).getType().dyn_cast(); + auto outputQType = + outputType.getElementType().dyn_cast(); + double outputScale = outputQType.getScale(); + assert(outputScale != 0 && "Output scale of zero is not supported!"); + int64_t outputZeroPoint = outputQType.getZeroPoint(); + + // Dequantize the input vector + llvm::SmallVector dequantizedVector; + std::transform(inputVector.begin(), inputVector.end(), + std::back_inserter(dequantizedVector), [&](int8_t n) { + return static_cast( + (static_cast(n) - inputZeroPoint) * inputScale); + }); + + // Apply the activation function to the dequantized vector + if (isa(op)) { + std::for_each(dequantizedVector.begin(), dequantizedVector.end(), + [](double &x) { x = std::max(x, 0.0); }); + } else if (isa(op)) { + std::for_each(dequantizedVector.begin(), dequantizedVector.end(), + [](double &x) { x = std::min(std::max(x, 0.0), 6.0); }); + } else if (isa(op)) { + std::for_each(dequantizedVector.begin(), dequantizedVector.end(), + [](double &x) { x = tanh(x); }); + } else if (isa(op)) { + std::for_each(dequantizedVector.begin(), dequantizedVector.end(), + [](double &x) { x = 1.0 / (1.0 + exp(-x)); }); + } else if (isa(op)) { + std::for_each( + dequantizedVector.begin(), dequantizedVector.end(), + [](double &x) { x = x * std::min(std::max(x + 3, 0.0), 6.0) / 6; }); + } else if (isa(op)) { + auto alpha = leakyReluAlpha.getValueAsDouble(); + std::for_each(dequantizedVector.begin(), dequantizedVector.end(), + [&](double &x) { x = std::max(alpha * x, x); }); + } else if (isa(op)) { + // We don't need to do anything here + } else { + llvm_unreachable("Unsupported op!"); + } + + // Quantize to create the result vector + llvm::SmallVector resultVector; + std::transform( + dequantizedVector.begin(), dequantizedVector.end(), + std::back_inserter(resultVector), [&](double n) { + int32_t t = + static_cast(round(n / outputScale)) + outputZeroPoint; + return static_cast(std::max( + {std::min({(int32_t)t, (int32_t)INT8_MAX}), (int32_t)INT8_MIN})); + }); + + ShapedType lookupTableType = RankedTensorType::get( + {256}, rewriter.getIntegerType(8, /*signed=*/false)); + auto lookupTableAttr = + DenseElementsAttr::get(lookupTableType, resultVector); + return lookupTableAttr; +} + +DenseElementsAttr getBinaryI16Blob(PatternRewriter &rewriter, Operation *op, + bool binaryInputs = true) { + // Get input scale + RankedTensorType inputType = + op->getOperand(0).getType().dyn_cast(); + double inputScale = 1; + if (auto inputQType = inputType.getElementType() + .dyn_cast()) { + inputScale = inputQType.getScale(); + } + + double inputScale2 = 1; + if (binaryInputs) { + RankedTensorType inputType2 = + op->getOperand(1).getType().dyn_cast(); + if (auto inputQType2 = inputType2.getElementType() + .dyn_cast()) { + inputScale2 = inputQType2.getScale(); + } + } + + // Get output scale + RankedTensorType outputType = + op->getResult(0).getType().dyn_cast(); + double outputScale = 1; + if (auto outputQType = outputType.getElementType() + .dyn_cast()) { + outputScale = outputQType.getScale(); + } + assert(outputScale != 0 && "Output scale of zero is not supported!"); + + int length; + std::vector blob; + std::string errMsg(ERR_MSG_DESCRIPTOR_FAIL_BYTES(), '\0'); + int succeeded; + if (isa(op) && inputType.getElementType().isF32()) { + length = QUANTIZE_INT16_TENSOR_BYTES(); + blob.resize(length); + succeeded = quantize_int16_tensor_blob((void *)blob.data(), outputScale); + } else if (isa(op)) { + length = REQUANTIZE_INT16_TENSOR_BYTES(); + blob.resize(length); + succeeded = requantize_int16_tensor_blob((void *)blob.data(), inputScale, + outputScale, errMsg.data()); + } else if (isa(op)) { + length = DEQUANTIZE_INT16_TENSOR_BYTES(); + blob.resize(length); + succeeded = dequantize_int16_tensor_blob((void *)blob.data(), inputScale, + errMsg.data()); + } else if (isa(op)) { + length = ADD_INT16_TENSOR_BYTES(); + blob.resize(length); + succeeded = add_int16_tensor_blob((void *)blob.data(), inputScale, + inputScale2, outputScale, errMsg.data()); + } else if (isa(op)) { + length = ADD_INT16_TENSOR_BYTES(); + blob.resize(length); + succeeded = add_int16_tensor_blob((void *)blob.data(), inputScale, + -inputScale2, outputScale, errMsg.data()); + } else if (isa(op)) { + length = MULTIPLY_INT16_TENSOR_BYTES(); + blob.resize(length); + succeeded = + multiply_int16_tensor_blob((void *)blob.data(), inputScale, inputScale2, + outputScale, errMsg.data()); + } else { + llvm_unreachable("Unsupported op!"); + } + + if (!succeeded) { + op->emitWarning(utils::getMsgWithLocPrefix(*op, errMsg)); + (void)rewriter.notifyMatchFailure(op->getLoc(), "Cannot obtain blob!"); + return {}; + } + + ArrayRef blobData = ArrayRef(blob.data(), length); + ShapedType blobType = RankedTensorType::get( + {length}, rewriter.getIntegerType(8, /*signed=*/false)); + auto blobAttr = DenseElementsAttr::get(blobType, blobData); + return blobAttr; +} + +DenseElementsAttr getUnaryI16Blob(PatternRewriter &rewriter, Operation *op) { + return getBinaryI16Blob(rewriter, op, /*binaryInputs=*/false); +} + +#include "Transforms/GeneratedXCPatterns.inc" + +void ApplyXCPatterns::runOnOperation() { + RewritePatternSet patterns(&getContext()); + func::FuncOp func = getOperation(); + + populateWithGenerated(patterns); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ApplyXCPatterns pass. +std::unique_ptr> createApplyXCPatternsPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ConvPatterns.h b/xformer/Transforms/ConvPatterns.h new file mode 100644 index 000000000..0972f2d47 --- /dev/null +++ b/xformer/Transforms/ConvPatterns.h @@ -0,0 +1,314 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#ifndef XFORMER_TRANSFORMS_CONVPATTERNS_H +#define XFORMER_TRANSFORMS_CONVPATTERNS_H + +#include "IR/XCoreOps.h" + +#include "larq_compute_engine/mlir/ir/lce_ops.h" +#include "lib_nn/api/AbstractKernel.hpp" +#include "lib_nn/api/AggregateFn.hpp" +#include "lib_nn/api/MemCpyFn.hpp" +#include "lib_nn/api/OutputTransformFn.hpp" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir { +namespace xcore { + +struct TFLConvArgs { + Operation *convOp; + int outputHeight, outputWidth, outputDepth, outputZeroPoint; + int inputHeight, inputWidth, inputDepth, inputZeroPoint; + int filterHeight, filterWidth, filterDepth; + std::vector filter; + std::vector bias; + std::vector effectiveMultiplier; + int8_t padValue; + bool toBePadded; + nn::padding_t padding; + nn::ImageGeometry Y; + nn::ImageGeometry X; + nn::WindowGeometry K; + llvm::SmallVector> imageRegionSplits; + double quantErrorThreshold; + bool quantErrorFullCheckEnabled; + bool isI16Conv; +}; + +struct BConvArgs { + Operation *convOp; + int outputHeight, outputWidth, outputDepth; + int inputHeight, inputWidth, inputDepth; + int filterHeight, filterWidth, filterDepth; + bool binaryOutput; + int32_t clampMin, clampMax; + std::vector filter; + std::vector postActivationBias; + std::vector postActivationMultiplier; + std::vector threshold; + int8_t padValue; + nn::ImageGeometry Y; + nn::ImageGeometry X; + nn::WindowGeometry K; + llvm::SmallVector> imageRegionSplits; + bool isI16Conv; +}; + +// XC Conv2D Base class +// ConcreteType would be TFL Conv types or Larq BConv2D +// Replaces them with XC Conv2D +template +class ReplaceWithXCConv2DBase : public OpRewritePattern { +public: + ReplaceWithXCConv2DBase(std::unordered_set *errorOpsSet, + MLIRContext *context) + : OpRewritePattern(context), errorOpsSet_(errorOpsSet) {} + + LogicalResult matchAndRewrite(ConvOpType op, + PatternRewriter &rewriter) const override; + +public: + std::unordered_set *errorOpsSet_; +}; + +// +// +// +// Handle Larq BNN Conv2D +class ReplaceBConv2DPattern + : public ReplaceWithXCConv2DBase { +public: + using BaseType = + ReplaceWithXCConv2DBase; + ReplaceBConv2DPattern(std::unordered_set *errorOpsSet, + MLIRContext *context) + : BaseType(errorOpsSet, context) {} + + LogicalResult checkIfValid(lq::Bconv2dOp op) const; + + LogicalResult getArgs(lq::Bconv2dOp op, BConvArgs &args) const; + + LogicalResult getKernelType(const BConvArgs &args, Conv2DType &kt) const; + + LogicalResult getSerializedParamsAndTensors( + const BConvArgs &args, const Conv2DType &kt, OtType &otType, + llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, + std::vector &mulsBiasesOrThresholdsData, + int &scratchBytes) const; + + LogicalResult getSerializedParamsAndTensors( + const BConvArgs &args, const Conv2DType &kt, OtType &otType, + llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, + std::vector &mulsBiasesOrThresholdsData, + int &scratchBytes) const; + +private: + LogicalResult getBConv2DValidDirectBinaryParams( + const BConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &thresholdsData, + int &scratchBytes) const; + + LogicalResult getBConv2DValidIndirectBinaryParams( + const BConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &thresholdsData, + int &scratchBytes) const; + + LogicalResult getBConv2DValidDirectInt8Params( + const BConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &mulsBiasesData, + int &scratchBytes) const; + + LogicalResult getBConv2DValidIndirectInt8Params( + const BConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &mulsBiasesData, + int &scratchBytes) const; +}; + +// +// +// TFL Conv2D Base class +// TFLConvOpType would be XC_FakeConv2D or XC_FakeDepthwiseConv2D +template +class ReplaceConv2DBase : public ReplaceWithXCConv2DBase< + ReplaceConv2DBase, + TFLConvOpType, TFLConvArgs> { +public: + using BaseType = + ReplaceWithXCConv2DBase, + TFLConvOpType, TFLConvArgs>; + ReplaceConv2DBase(std::unordered_set *errorOpsSet, + MLIRContext *context) + : BaseType(errorOpsSet, context) {} + + LogicalResult checkIfValid(TFLConvOpType op) const { return success(); } + + LogicalResult getArgs(TFLConvOpType op, TFLConvArgs &args) const; + + LogicalResult getKernelType(const TFLConvArgs &args, Conv2DType &kt) const { + if (failed( + static_cast(this)->getKernelType(args, kt))) { + return failure(); + } + return success(); + } + + template + LogicalResult getSerializedParamsAndTensors( + const TFLConvArgs &args, const Conv2DType &kt, OtType &otType, + llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, + std::vector &mulsBiasesData, int &scratchBytes) const { + if (failed(static_cast(this) + ->getSerializedParamsAndTensors( + args, kt, otType, strParams, abstractKernelParams, + weightsData, mulsBiasesData, scratchBytes))) { + return failure(); + } + return success(); + } +}; + +// +// +// +// Handle XC_FakeConv2D +class ReplaceConv2DPattern + : public ReplaceConv2DBase { +public: + using BaseType = ReplaceConv2DBase; + ReplaceConv2DPattern(std::unordered_set *errorOpsSet, + MLIRContext *context) + : BaseType(errorOpsSet, context) {} + + LogicalResult getKernelType(const TFLConvArgs &args, Conv2DType &kt) const; + + // Conv is quantized along dimension 0 + int getQuantizationIndex() const { return 0; } + + LogicalResult getSerializedParamsAndTensors( + const TFLConvArgs &args, const Conv2DType &kt, OtType &otType, + llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &mulsBiasesData, + int &scratchBytes) const; + + LogicalResult getSerializedParamsAndTensors( + const TFLConvArgs &args, const Conv2DType &kt, OtType &otType, + llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &mulsBiasesData, + int &scratchBytes) const; + +private: + LogicalResult getConv2DPaddedIndirectParams( + const TFLConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, int &scratchBytes) const; + + LogicalResult getConv2DValidIndirectParams( + const TFLConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, int &scratchBytes) const; + + LogicalResult getConv2DValidDirectParams( + const TFLConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, int &scratchBytes) const; + + LogicalResult getConv2DValidDirectI16Params( + const TFLConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &mulsBiasesData, + int &scratchBytes) const; + + LogicalResult + getOutputTransformParams(const TFLConvArgs &args, std::string &otStr, + OtType &otType, + std::vector &mulsBiasesData) const; +}; + +// +// +// +// Handle XC_FakeDepthwiseConv2D +class ReplaceDepthwiseConv2DPattern + : public ReplaceConv2DBase { +public: + using BaseType = + ReplaceConv2DBase; + ReplaceDepthwiseConv2DPattern(std::unordered_set *errorOpsSet, + MLIRContext *context) + : BaseType(errorOpsSet, context) {} + + LogicalResult getKernelType(const TFLConvArgs &args, Conv2DType &kt) const; + + // DepthwiseConv is quantized along dimension 3 + int getQuantizationIndex() const { return 3; } + + LogicalResult getSerializedParamsAndTensors( + const TFLConvArgs &args, const Conv2DType &kt, OtType &otType, + llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &mulsBiasesData, + int &scratchBytes) const; + + LogicalResult getSerializedParamsAndTensors( + const TFLConvArgs &args, const Conv2DType &kt, OtType &otType, + llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &mulsBiasesData, + int &scratchBytes) const; + +private: + LogicalResult getDepthwiseConv2DValidDirectParams( + const TFLConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, int &scratchBytes) const; + + LogicalResult getDepthwiseConv2DPaddedIndirectParams( + const TFLConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, int &scratchBytes) const; + + LogicalResult + getOutputTransformParams(const TFLConvArgs &args, std::string &otStr, + OtType &otType, + std::vector &mulsBiasesData) const; +}; + +static llvm::SmallVector getAbstractKernelParamsForMultipleThreads( + llvm::SmallVector> imageRegionSplits, + const nn::ImageGeometry &Y, int subH = 0, int subW = 0, int strideH = 1, + int strideW = 1, int inputOffset = 0) { + llvm::SmallVector abstractKernelParams; + for (auto ®ionsplits : imageRegionSplits) { + auto ir = + nn::ImageRegion(regionsplits[0], regionsplits[1], regionsplits[2], + regionsplits[3], regionsplits[4], regionsplits[5]); + nn::AbstractKernel ak(Y, ir, VPU_INT8_ACC_PERIOD, subH, subW, strideH, + strideW, inputOffset); + auto akParams = ak.getParams(); + std::string akpStr = std::string((char *)&akParams, sizeof(akParams)); + abstractKernelParams.push_back(akpStr); + } + return abstractKernelParams; +} + +} // namespace xcore +} // namespace mlir + +#endif // XFORMER_TRANSFORMS_CONVPATTERNS_H diff --git a/xformer/Transforms/ConvPatterns.td b/xformer/Transforms/ConvPatterns.td new file mode 100644 index 000000000..2596a6cc9 --- /dev/null +++ b/xformer/Transforms/ConvPatterns.td @@ -0,0 +1,139 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +include "mlir/Dialect/Arith/IR/ArithOps.td" +include "mlir/Dialect/Func/IR/FuncOps.td" +include "tensorflow/compiler/mlir/lite/ir/tfl_ops.td" + +include "IR/XCoreOps.td" +include "Utils/Utils.td" + +// Unfuse Relu from Conv if output zero point is not -128 for QI8 output +// XC Conv assumes there is no RELU, or that if there is one, it is being +// clamped to -128 Add benefit so that this pattern runs first +def : Pat<(TFL_Conv2DOp:$output TensorOf<[QI8]>:$input, TensorOf<[QI8]>:$f, + AnyTypeOf<[TensorOf<[I32, QI32]>, NoneType]>:$b, $dh, $dw, + TFL_AF_Relu, $wf, $sh, $sw), + (TFL_ReluOp(TFL_Conv2DOp $input, $f, $b, $dh, $dw, TFL_AF_None, $wf, + $sh, $sw, (returnType $output))), + [(IsZeroPointNotEqualTo<-128> $output)], [], (addBenefit 20)>; + +def : Pat<(TFL_DepthwiseConv2DOp:$output TensorOf<[QI8]>:$input, + TensorOf<[QI8]>:$f, TensorOf<[I32, QI32]>:$b, $dh, $dw, + TFL_AF_Relu, $wf, $sh, $sw, $dm), + (TFL_ReluOp(TFL_DepthwiseConv2DOp $input, $f, $b, $dh, $dw, + TFL_AF_None, $wf, $sh, $sw, $dm, (returnType $output))), + [(IsZeroPointNotEqualTo<-128> $output)], [], (addBenefit 20)>; + +// Unfuse Relu from Conv for QI16 +def : Pat<(TFL_Conv2DOp:$output TensorOf<[QI16]>:$input, TensorOf<[QI8]>:$f, + AnyTypeOf<[TensorOf<[I32, QI32]>, NoneType]>:$b, $dh, $dw, + TFL_AF_Relu, $wf, $sh, $sw), + (TFL_ReluOp(TFL_Conv2DOp $input, $f, $b, $dh, $dw, TFL_AF_None, $wf, + $sh, $sw, (returnType $output))), + [], [], (addBenefit 20)>; + +def : Pat<(TFL_DepthwiseConv2DOp:$output TensorOf<[QI16]>:$input, + TensorOf<[QI8]>:$f, TensorOf<[I32, QI32]>:$b, $dh, $dw, + TFL_AF_Relu, $wf, $sh, $sw, $dm), + (TFL_ReluOp(TFL_DepthwiseConv2DOp $input, $f, $b, $dh, $dw, + TFL_AF_None, $wf, $sh, $sw, $dm, (returnType $output))), + [], [], (addBenefit 20)>; + +// Unfuse Relu6 for QI8 +def : Pat<(TFL_Conv2DOp:$output TensorOf<[QI8]>:$input, TensorOf<[QI8]>:$f, + AnyTypeOf<[TensorOf<[I32, QI32]>, NoneType]>:$b, $dh, $dw, + TFL_AF_Relu6, $wf, $sh, $sw), + (TFL_Relu6Op(TFL_Conv2DOp $input, $f, $b, $dh, $dw, TFL_AF_None, $wf, + $sh, $sw, (returnType $output))), + [(IsZeroPointNotEqualTo<-128> $output)], [], (addBenefit 20)>; + +def : Pat<(TFL_DepthwiseConv2DOp:$output TensorOf<[QI8]>:$input, + TensorOf<[QI8]>:$f, TensorOf<[I32, QI32]>:$b, $dh, $dw, + TFL_AF_Relu6, $wf, $sh, $sw, $dm), + (TFL_Relu6Op(TFL_DepthwiseConv2DOp $input, $f, $b, $dh, $dw, + TFL_AF_None, $wf, $sh, $sw, $dm, (returnType $output))), + [(IsZeroPointNotEqualTo<-128> $output)], [], (addBenefit 20)>; + +// Unfuse Relu6 for QI16 +def : Pat<(TFL_Conv2DOp:$output TensorOf<[QI16]>:$input, TensorOf<[QI8]>:$f, + AnyTypeOf<[TensorOf<[I32, QI32]>, NoneType]>:$b, $dh, $dw, + TFL_AF_Relu6, $wf, $sh, $sw), + (TFL_Relu6Op(TFL_Conv2DOp $input, $f, $b, $dh, $dw, TFL_AF_None, $wf, + $sh, $sw, (returnType $output))), + [], [], (addBenefit 20)>; + +def : Pat<(TFL_DepthwiseConv2DOp:$output TensorOf<[QI16]>:$input, + TensorOf<[QI8]>:$f, TensorOf<[I32, QI32]>:$b, $dh, $dw, + TFL_AF_Relu6, $wf, $sh, $sw, $dm), + (TFL_Relu6Op(TFL_DepthwiseConv2DOp $input, $f, $b, $dh, $dw, + TFL_AF_None, $wf, $sh, $sw, $dm, (returnType $output))), + [], [], (addBenefit 20)>; + +def CreateNoneValue : NativeCodeCall<"$_builder.create($0." + "getLoc(), $_builder.getUnitAttr())">; + +// Check that input channels equals filter channels +// We don't optimize grouped convolutions yet +def HasEqualChannels + : Constraint().getDimSize(3) == " + "$1.getType().cast().getDimSize(3)">>; + +def IsConstOp + : Constraint< + CPred<"dyn_cast_or_null($0.getDefiningOp()) || " + "dyn_cast_or_null($0.getDefiningOp()) || " + "dyn_cast_or_null($0.getDefiningOp())">>; + +// TFL_Conv2D() -> XC_FakeConv2D() +def : Pat<(TFL_Conv2DOp:$output TensorOf<[QI8, QI16]>:$input, + TensorOf<[QI8]>:$f, + AnyTypeOf<[TensorOf<[I32, QI32]>, NoneType]>:$b, $dh, $dw, $faf, + $wf, $sh, $sw), + (XC_FakeConv2DOp $input, $f, $b, (CreateNoneValue $input), $dh, $dw, + $faf, $wf, (CreateNoneValue $input), $sh, $sw, + ConstantAttr, ConstantAttr, + ConstantAttr, ConstantAttr, + ConstantAttr), + [(HasMultipleOfNBytesPerPixel<4> $input), + (HasMultipleOfNBytesPerPixel<4> $output), + (HasEqualChannels $input, $f), (IsConstOp $f), +]>; + +// TFL_DepthwiseConv2D() -> XC_FakeDepthwiseConv2D() +def : Pat<(TFL_DepthwiseConv2DOp:$output TensorOf<[QI8]>:$input, + TensorOf<[QI8]>:$f, TensorOf<[I32, QI32]>:$b, $dh, $dw, $faf, $wf, + $sh, $sw, $dm), + (XC_FakeDepthwiseConv2DOp $input, $f, $b, $dh, $dw, $faf, $wf, + (CreateNoneValue $input), $sh, $sw, $dm), + [(HasMultipleOfNBytesPerPixel<4> $input), + (HasMultipleOfNBytesPerPixel<4> $output), (IsConstOp $f), +]>; + +def getCompressedFloats : NativeCodeCall<"getCompressedFloats($_builder, $0)">; + +// Special case, we only optimize conv with filter width 3, filter height +// 2, and stride height 2 +def Hasfw5fh2 + : Constraint().getRank() == 4 && " + "$0.getType().cast().getDimSize(1) == 3 && " + "$0.getType().cast().getDimSize(2) == 2">>; + +// F32 TFL_Conv2D() -> XC_Beta_ConvF32() +def : Pat<(TFL_Conv2DOp:$output TensorOf<[F32]>:$input, TensorOf<[F32]>:$f, + TensorOf<[F32]>:$b, $dh, $dw, $faf, $wf, + ConstantAttr, ConstantAttr), + (XC_Beta_ConvF32Op $input, $f, $b), + [(Hasfw5fh2 $f), (isBetaFloatEnabled)]>; + +// // F32 TFL_TransposeConv2D() -> XC_Beta_TransposeConvF32() +def : Pat<(TFL_TransposeConvOp:$output $outshape, TensorOf<[F32]>:$f, + TensorOf<[F32]>:$input, TensorOf<[F32]>:$b, $wf, + ConstantAttr, ConstantAttr, $faf), + (XC_Beta_TransposeConvF32Op $input, $f, $b), + [(Hasfw5fh2 $f), (isBetaFloatEnabled)]>; + +// // F32 TFL_FullyConnected() -> XC_Beta_FcF32() +def : Pat<(TFL_FullyConnectedOp:$output TensorOf<[F32]>:$input, + TensorOf<[F32]>:$f, $b, $faf, $wf, $knd, $aqi), + (XC_Beta_FcF32Op $input, $f), [(isBetaFloatEnabled)]>; diff --git a/xformer/Transforms/ConvPatternsLCE.cpp b/xformer/Transforms/ConvPatternsLCE.cpp new file mode 100644 index 000000000..3085baf0f --- /dev/null +++ b/xformer/Transforms/ConvPatternsLCE.cpp @@ -0,0 +1,470 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Transforms/ConvPatterns.h" +#include "Transforms/Options.h" +#include "Utils/Util.h" + +namespace mlir::xcore { + +// Handle Larq BNN Conv2D +LogicalResult +ReplaceBConv2DPattern::checkIfValid(lq::Bconv2dOp conv2DOp) const { + // For BConv2D, we emit error messages since we don't have a reference op + // The compilation will fail as we haven't defined a TFL custom op for BConv2D + + // Check for invalid types and return + // Check filter is I32 + if (!conv2DOp.getFilter() + .getType() + .template cast() + .getElementType() + .isInteger(32)) { + conv2DOp.emitError("Filter type must be int32(packed binary) for BConv2D!"); + return failure(); + } + + // Check output is I32 or QI8 + auto outputElementType = conv2DOp.getOutput() + .getType() + .template cast() + .getElementType(); + if (!utils::isNBitSignedQType<8>(outputElementType) && + !outputElementType.isInteger(32)) { + conv2DOp.emitError( + "Output type must be int32(packed binary) or int8 for BConv2D!"); + return failure(); + } + + // If we have QI8 output, check activation function is RELU + if (outputElementType.template isa() && + !(conv2DOp.getFusedActivationFunction() == "RELU")) { + conv2DOp.emitError("Activation function must be RELU for BConv2D int8!"); + return failure(); + } + + // Check padding is VALID + if (!(conv2DOp.getPadding() == "VALID")) { + conv2DOp.emitError("Only VALID padding is supported for BConv2D!"); + return failure(); + } + + // Check channels_in is a multiple of 32 + if (!(conv2DOp.getChannelsIn() % 32 == 0)) { + conv2DOp.emitError( + "Only channels_in of multiples of 32 is supported for BConv2D!"); + return failure(); + } + + auto outputType = + conv2DOp.getOutput().getType().template dyn_cast(); + auto outputDepth = outputType.getDimSize(3); + // If we have QI8 output, check output depth is a multiple of four + if (outputElementType.template isa() && + (outputDepth % 4 != 0)) { + conv2DOp.emitError( + "Output depth must be a multiple of four for BConv2D int8!"); + return failure(); + } + + return success(); +} + +LogicalResult ReplaceBConv2DPattern::getArgs(lq::Bconv2dOp conv2DOp, + BConvArgs &args) const { + // Retrieve remaining args + // Find if binary output for the BConv2D + bool binaryOutput = true; + if (conv2DOp.getOutput() + .getType() + .template cast() + .getElementType() + .template isa()) { + binaryOutput = false; + } + + // For binary output, convert depth to bits which is the number of input and + // output channels + // For int8 output, convert + // - input depth to bits which is the number of input channels + // - filter depth which is of type int32 to number of int8s which is the + // number of output channels + // - output depth is already of int8 type which should be the correct number + // of output channels + args.inputDepth *= sizeof(int32_t) * CHAR_BIT; + if (binaryOutput) { + args.outputDepth *= sizeof(int32_t) * CHAR_BIT; + args.filterDepth *= sizeof(int32_t) * CHAR_BIT; + } else { + args.filterDepth *= sizeof(int32_t); + } + + // Get filter values + DenseElementsAttr filterAttr; + matchPattern(conv2DOp.getFilter(), m_Constant(&filterAttr)); + auto filterVector = std::vector{filterAttr.value_begin(), + filterAttr.value_end()}; + + std::vector biasVector; + std::vector multiplierVector; + std::vector thresholdVector; + if (binaryOutput) { + // Get threshold values + DenseElementsAttr thresholdAttr; + matchPattern(conv2DOp.getOutputThreshold(), m_Constant(&thresholdAttr)); + thresholdVector = std::vector{thresholdAttr.value_begin(), + thresholdAttr.value_end()}; + } else { + // Get bias values + DenseElementsAttr biasAttr; + matchPattern(conv2DOp.getPostActivationBias(), m_Constant(&biasAttr)); + biasVector = std::vector{biasAttr.value_begin(), + biasAttr.value_end()}; + + // Get multiplier values + DenseElementsAttr multiplierAttr; + matchPattern(conv2DOp.getPostActivationMultiplier(), + m_Constant(&multiplierAttr)); + multiplierVector = std::vector{multiplierAttr.value_begin(), + multiplierAttr.value_end()}; + + // Fuse the back-transformation and int8 scale/zero-point into + // the output transform multiplier/bias + // Based on OneTimeSetup() in + // https://github.com/larq/compute-engine/blob/main/larq_compute_engine/tflite/kernels/bconv2d.cc#L353 + auto outputType = + conv2DOp.getOutput().getType().template dyn_cast(); + auto outputQType = + outputType.getElementType() + .template dyn_cast(); + auto outputScale = outputQType.getScale(); + auto outputZeroPoint = outputQType.getZeroPoint(); + + int32_t backtransformAdd = + args.filterHeight * args.filterWidth * conv2DOp.getChannelsIn(); + + for (int i = 0; i < args.outputDepth; ++i) { + auto postMul = multiplierVector[i]; + auto postBias = biasVector[i]; + multiplierVector[i] = -1 * postMul / outputScale; + biasVector[i] = + (postBias + static_cast(backtransformAdd) * postMul) / + outputScale + + outputZeroPoint; + } + + // Initialize min and max clamp values for RELU + // Based on CalculateActivationRange() in + // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/kernels/kernel_util.h#L266 + assert(conv2DOp.getFusedActivationFunction() == "RELU" && + "Activation function should be RELU for the clamp value " + "initialization!"); + int32_t nominalClampMin = 0; + int32_t nominalClampMax = std::numeric_limits::max(); + + nominalClampMin = std::max(nominalClampMin, -1 * backtransformAdd); + nominalClampMax = std::min(nominalClampMax, backtransformAdd); + args.clampMin = -1 * nominalClampMax + backtransformAdd; + args.clampMax = -1 * nominalClampMin + backtransformAdd; + } + + // Init lib_nn structs + // Output could be int8 or binary + args.Y = nn::ImageGeometry(args.outputHeight, args.outputWidth, + args.outputDepth, binaryOutput ? 1 : 8); + // Input is in binary + args.X = + nn::ImageGeometry(args.inputHeight, args.inputWidth, args.inputDepth, 1); + args.K = nn::WindowGeometry( + args.filterHeight, args.filterWidth, args.filterDepth, 0, 0, + conv2DOp.getStrideHeight(), conv2DOp.getStrideWidth(), 1, + conv2DOp.getDilationHeightFactor(), conv2DOp.getDilationWidthFactor()); + + // TODO, we are not padding at the moment, but the pad value might have to be + // changed for BNNs + args.padValue = 0; + args.binaryOutput = binaryOutput; + args.filter = filterVector; + args.postActivationBias = biasVector; + args.postActivationMultiplier = multiplierVector; + args.threshold = thresholdVector; + + return success(); +} + +LogicalResult ReplaceBConv2DPattern::getKernelType(const BConvArgs &args, + Conv2DType &kt) const { + // In case of binary output, since the input and output types are int32(packed + // binary), they will always be a multiple of 32 channels + // Hence we don't need to check for that case + if (args.inputDepth % 256 == 0 && args.binaryOutput) { + kt = Conv2DType::BNNValidDirectBinary; + } else if (args.inputDepth % 256 == 0 && args.outputDepth % 16 == 0) { + kt = Conv2DType::BNNValidDirectInt8; + } else if (args.binaryOutput) { + kt = Conv2DType::BNNValidIndirectBinary; + } else { + kt = Conv2DType::BNNValidIndirectInt8; + } + + return success(); +} + +LogicalResult ReplaceBConv2DPattern::getSerializedParamsAndTensors( + const BConvArgs &args, const Conv2DType &kt, OtType &otType, + llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &thresholdsData, + int &scratchBytes) const { + otType = OtType::Group; + switch (kt) { + case Conv2DType::BNNValidDirectBinary: + if (failed(getBConv2DValidDirectBinaryParams( + args, strParams, abstractKernelParams, weightsData, thresholdsData, + scratchBytes))) { + return failure(); + } + break; + case Conv2DType::BNNValidIndirectBinary: + if (failed(getBConv2DValidIndirectBinaryParams( + args, strParams, abstractKernelParams, weightsData, thresholdsData, + scratchBytes))) { + return failure(); + } + break; + case Conv2DType::BNNValidDirectInt8: + if (failed(getBConv2DValidDirectInt8Params( + args, strParams, abstractKernelParams, weightsData, thresholdsData, + scratchBytes))) { + return failure(); + } + break; + case Conv2DType::BNNValidIndirectInt8: + if (failed(getBConv2DValidIndirectInt8Params( + args, strParams, abstractKernelParams, weightsData, thresholdsData, + scratchBytes))) { + return failure(); + } + break; + default: + // This shouldn't happen! + return failure(); + } + return success(); +} + +LogicalResult ReplaceBConv2DPattern::getSerializedParamsAndTensors( + const BConvArgs &args, const Conv2DType &kt, OtType &otType, + llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &thresholdsData, + int &scratchBytes) const { + return failure(); +} + +LogicalResult ReplaceBConv2DPattern::getBConv2DValidDirectBinaryParams( + const BConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &thresholdsData, + int &scratchBytes) const { + nn::DerefInputFn imToCol(args.X, args.K); + auto imToColParams = imToCol.getParams(); + + std::array filterShape = {args.outputDepth, args.filterHeight, + args.filterWidth, args.inputDepth}; + nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( + (int8_t *)args.filter.data(), filterShape, 1, args.padValue); + + nn::MatMulBinaryDirectFn af(args.X, args.K, args.inputDepth); + auto afParams = af.getParams(); + + // adjust the thresholds from xorpopcount space + // to xcore space + auto adjustedThresholds = nn::OT_binary::adjust_thresholds( + args.threshold, args.inputDepth, args.K, rw); + + nn::OutputTransformFn::pad_final_access(adjustedThresholds, VPU_INT16_EPV, + (int16_t)args.padValue); + + std::string mfStr = + std::string((char *)&imToColParams, sizeof(imToColParams)); + std::string afStr = std::string((char *)&afParams, sizeof(afParams)); + std::string otStr = ""; + + abstractKernelParams = + getAbstractKernelParamsForMultipleThreads(args.imageRegionSplits, args.Y); + strParams.push_back(mfStr); + strParams.push_back(afStr); + strParams.push_back(otStr); + weightsData = rw.weights; + thresholdsData = adjustedThresholds; + scratchBytes = 0; + + return success(); +} + +LogicalResult ReplaceBConv2DPattern::getBConv2DValidIndirectBinaryParams( + const BConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &thresholdsData, + int &scratchBytes) const { + nn::ImToColValid imToCol(args.X, args.K, args.inputDepth); + auto imToColParams = imToCol.getParams(); + + std::array filterShape = {args.outputDepth, args.filterHeight, + args.filterWidth, args.inputDepth}; + nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( + (int8_t *)args.filter.data(), filterShape, 1, args.padValue); + + const int elementsPerByte = 8; + int inputBytes = + args.filterHeight * args.filterWidth * args.inputDepth / elementsPerByte; + nn::MatMulBinary af(args.outputDepth, inputBytes); + auto afParams = af.getParams(); + + // adjust the thresholds from xorpopcount space + // to xcore space + auto adjustedThresholds = nn::OT_binary::adjust_thresholds( + args.threshold, args.inputDepth, args.K, rw); + + nn::OutputTransformFn::pad_final_access(adjustedThresholds, VPU_INT16_EPV, + (int16_t)args.padValue); + + std::string mfStr = + std::string((char *)&imToColParams, sizeof(imToColParams)); + std::string afStr = std::string((char *)&afParams, sizeof(afParams)); + std::string otStr = ""; + + abstractKernelParams = + getAbstractKernelParamsForMultipleThreads(args.imageRegionSplits, args.Y); + strParams.push_back(mfStr); + strParams.push_back(afStr); + strParams.push_back(otStr); + weightsData = rw.weights; + thresholdsData = adjustedThresholds; + scratchBytes = nn::MatMulInt8::get_scratch_mem_bytes(inputBytes) + 32; + + return success(); +} + +LogicalResult ReplaceBConv2DPattern::getBConv2DValidDirectInt8Params( + const BConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &mulsBiasesData, + int &scratchBytes) const { + nn::DerefInputFn imToCol(args.X, args.K); + auto imToColParams = imToCol.getParams(); + + std::array filterShape = {args.outputDepth, args.filterHeight, + args.filterWidth, args.inputDepth}; + nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( + (int8_t *)args.filter.data(), filterShape, 1, args.padValue); + + nn::MatMulBinaryDirectFn af(args.X, args.K, args.inputDepth); + auto afParams = af.getParams(); + + int receptiveVolume = args.filterHeight * args.filterWidth * args.inputDepth; + nn::MulsAndBias mulAndBiases = nn::OT_int8_clamped::canonicalise_mul_and_bias( + args.postActivationMultiplier, args.postActivationBias, receptiveVolume, + args.clampMin, args.clampMax, args.outputDepth); + auto accuOverlaps = nn::OT_int8_clamped::get_accumulator_overlaps( + receptiveVolume, args.outputDepth, rw); + auto quantizer = nn::OutputTransformFnInt8_Group::Quantizer(); + nn::OutputTransformFnInt8_Group::QuantisationParams qp = + quantizer.quantise_activation(mulAndBiases, + targetArchOption == XS3A + ? nn_vlmul_shr_t::VLMUL_SHR_XS3A + : nn_vlmul_shr_t::VLMUL_SHR_VX4A, + false); + + auto serialisedOffsetsMultipliersAndBiases = + nn::OutputTransformFn::serialise_memory(accuOverlaps, qp.multipliers, + qp.biases); + nn::OutputTransformFn::pad_final_access(serialisedOffsetsMultipliersAndBiases, + VPU_INT16_EPV, + (int16_t)args.padValue); + + nn::OT_int8_clamped ot((int32_t)args.outputDepth, qp.initial_shr, + qp.final_shr); + auto otParams = ot.getParams(); + + std::string mfStr = + std::string((char *)&imToColParams, sizeof(imToColParams)); + std::string afStr = std::string((char *)&afParams, sizeof(afParams)); + std::string otStr = std::string((char *)&otParams, sizeof(otParams)); + + abstractKernelParams = + getAbstractKernelParamsForMultipleThreads(args.imageRegionSplits, args.Y); + strParams.push_back(mfStr); + strParams.push_back(afStr); + strParams.push_back(otStr); + weightsData = rw.weights; + mulsBiasesData = serialisedOffsetsMultipliersAndBiases; + scratchBytes = 0; + + return success(); +} + +LogicalResult ReplaceBConv2DPattern::getBConv2DValidIndirectInt8Params( + const BConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &mulsBiasesData, + int &scratchBytes) const { + nn::ImToColValid imToCol(args.X, args.K, args.inputDepth); + auto imToColParams = imToCol.getParams(); + + std::array filterShape = {args.outputDepth, args.filterHeight, + args.filterWidth, args.inputDepth}; + nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( + (int8_t *)args.filter.data(), filterShape, 1, args.padValue); + + const int elementsPerByte = 8; + int inputBytes = + args.filterHeight * args.filterWidth * args.inputDepth / elementsPerByte; + + nn::MatMulBinary af(args.outputDepth, inputBytes); + auto afParams = af.getParams(); + + int receptiveVolume = args.filterHeight * args.filterWidth * args.inputDepth; + nn::MulsAndBias mulAndBiases = nn::OT_int8_clamped::canonicalise_mul_and_bias( + args.postActivationMultiplier, args.postActivationBias, receptiveVolume, + args.clampMin, args.clampMax, args.outputDepth); + auto accuOverlaps = nn::OT_int8_clamped::get_accumulator_overlaps( + receptiveVolume, args.outputDepth, rw); + auto quantizer = nn::OutputTransformFnInt8_Group::Quantizer(); + nn::OutputTransformFnInt8_Group::QuantisationParams qp = + quantizer.quantise_activation(mulAndBiases, + targetArchOption == XS3A + ? nn_vlmul_shr_t::VLMUL_SHR_XS3A + : nn_vlmul_shr_t::VLMUL_SHR_VX4A, + false); + + auto serialisedOffsetsMultipliersAndBiases = + nn::OutputTransformFn::serialise_memory(accuOverlaps, qp.multipliers, + qp.biases); + nn::OutputTransformFn::pad_final_access(serialisedOffsetsMultipliersAndBiases, + VPU_INT16_EPV, + (int16_t)args.padValue); + + nn::OT_int8_clamped ot((int32_t)args.outputDepth, qp.initial_shr, + qp.final_shr); + auto otParams = ot.getParams(); + + std::string mfStr = + std::string((char *)&imToColParams, sizeof(imToColParams)); + std::string afStr = std::string((char *)&afParams, sizeof(afParams)); + std::string otStr = std::string((char *)&otParams, sizeof(otParams)); + + abstractKernelParams = + getAbstractKernelParamsForMultipleThreads(args.imageRegionSplits, args.Y); + strParams.push_back(mfStr); + strParams.push_back(afStr); + strParams.push_back(otStr); + weightsData = rw.weights; + mulsBiasesData = serialisedOffsetsMultipliersAndBiases; + scratchBytes = nn::MatMulInt8::get_scratch_mem_bytes(inputBytes) + 32; + + return success(); +} + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ConvPatternsTFL.cpp b/xformer/Transforms/ConvPatternsTFL.cpp new file mode 100644 index 000000000..8abb8bb2d --- /dev/null +++ b/xformer/Transforms/ConvPatternsTFL.cpp @@ -0,0 +1,758 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Transforms/ConvPatterns.h" +#include "Transforms/Options.h" +#include "Utils/Diagnostics.h" +extern "C" { +#include "lib_nn/api/output_transform_fn_int16.h" +#include "lib_nn/api/output_transform_fn_int16_kernel_transform.h" +} + +#include "tensorflow/core/framework/kernel_shape_util.h" + +#include + +namespace mlir::xcore { + +// TFL Conv2D Base class implementation +// TFLConvOpType would be XC_FakeConv2D or XC_FakeDepthwiseConv2D +template +LogicalResult ReplaceConv2DBase::getArgs( + TFLConvOpType conv2DOp, TFLConvArgs &args) const { + // Retrieve remaining args + // Get output zero point + auto outputType = + conv2DOp.getOutput().getType().template dyn_cast(); + auto outputQType = outputType.getElementType() + .template dyn_cast(); + auto outputScale = outputQType.getScale(); + auto outputZeroPoint = outputQType.getZeroPoint(); + + // Get input zero point + auto inputType = + conv2DOp.getInput().getType().template dyn_cast(); + auto inputQType = inputType.getElementType() + .template dyn_cast(); + auto inputScale = inputQType.getScale(); + auto inputZeroPoint = inputQType.getZeroPoint(); + + // Get filter values + auto filterQConstOp = + dyn_cast(conv2DOp.getFilter().getDefiningOp()); + auto filter = filterQConstOp.getValue().template cast(); + auto filterVector = + std::vector{filter.template getValues().begin(), + filter.template getValues().end()}; + + // Get bias values + // If no bias exists, create vector with zero values + std::vector biasVector; + if (!conv2DOp.getBias().getType().template isa()) { + DenseElementsAttr biasesAttr; + if (conv2DOp.getBias() + .getType() + .template cast() + .getElementType() + .template isa()) { + auto biasQConstOp = + dyn_cast(conv2DOp.getBias().getDefiningOp()); + biasesAttr = biasQConstOp.getValue().template cast(); + } else { + matchPattern(conv2DOp.getBias(), m_Constant(&biasesAttr)); + } + biasVector = + std::vector{biasesAttr.template getValues().begin(), + biasesAttr.template getValues().end()}; + } else { + biasVector = std::vector(args.outputDepth, 0); + } + + // Calculate effectiveOutputScale + std::vector effectiveOutputScaleVector; + auto filterQConstOpType = + filterQConstOp.getQtype().template cast(); + bool isPerChannelQuantized = false; + double filterScale; + ArrayRef filterScales; + if (auto filterQType = + filterQConstOpType.getElementType() + .template dyn_cast()) { + filterScale = filterQType.getScale(); + } else if (auto filterQType = + filterQConstOpType.getElementType() + .template dyn_cast()) { + isPerChannelQuantized = true; + filterScales = filterQType.getScales(); + } else { + return failure(); + } + + // Conv is quantized along dimension 0 + // DepthwiseConv is quantized along dimension 3 + // https://www.tensorflow.org/lite/performance/quantization_spec + int dim = static_cast(this)->getQuantizationIndex(); + auto filterType = + conv2DOp.getFilter().getType().template dyn_cast(); + auto numOutputChannels = filterType.getDimSize(dim); + for (int i = 0; i < numOutputChannels; ++i) { + auto scale = isPerChannelQuantized ? filterScales[i] : filterScale; + assert(outputScale != 0 && "outputScale should not be zero!"); + effectiveOutputScaleVector.push_back(inputScale * scale / outputScale); + } + + // Clamp multipliers + float minVal = *std::min_element(effectiveOutputScaleVector.begin(), + effectiveOutputScaleVector.end()); + // float avgVal = std::accumulate(effectiveOutputScaleVector.begin(), + // effectiveOutputScaleVector.end(), 0.0) / + // effectiveOutputScaleVector.size(); + for (int i = 0; i < effectiveOutputScaleVector.size(); ++i) { + float tmp = std::min(effectiveOutputScaleVector[i], + minVal * convMultiplierFactorOption); + if (tmp != effectiveOutputScaleVector[i]) { + // Mention which numbers have been clamped + std::stringstream msg; + msg << std::endl + << "CLAMPED conv multiplier index " << i << " from " << std::fixed + << std::setprecision(18) << effectiveOutputScaleVector[i] << " to " + << tmp << std::endl; + conv2DOp.emitRemark(utils::getMsgWithLocPrefix(conv2DOp, msg.str())); + effectiveOutputScaleVector[i] = tmp; + } + } + + // Find padding values + int64_t newHeight, newWidth; + int64_t padTop, padBottom, padLeft, padRight; + + if (conv2DOp.getPadding() == "EXPLICIT") { + DenseElementsAttr paddingAttr; + matchPattern(conv2DOp.getPaddingValues(), m_Constant(&paddingAttr)); + // The padding values for the PadOp are stored as a 4x2 tensor 0,0 and 0,1 + // is for the batch dimension and 3,0, and 3,1 for the channel/depth 1,0 and + // 1,1 is top and bottom, and 2,0 and 2,1 is left and right which are the + // padding values we need + padTop = paddingAttr.template getValues()[{1, 0}]; + padBottom = paddingAttr.template getValues()[{1, 1}]; + padLeft = paddingAttr.template getValues()[{2, 0}]; + padRight = paddingAttr.template getValues()[{2, 1}]; + } else { + tensorflow::Padding opPadding = conv2DOp.getPadding() == "VALID" + ? tensorflow::Padding::VALID + : tensorflow::Padding::SAME; + if (tensorflow::GetWindowedOutputSizeVerbose( + args.inputHeight, args.filterHeight, conv2DOp.getDilationHFactor(), + conv2DOp.getStrideH(), opPadding, &newHeight, &padTop, + &padBottom) != tensorflow::OkStatus()) { + return failure(); + } + if (tensorflow::GetWindowedOutputSizeVerbose( + args.inputWidth, args.filterWidth, conv2DOp.getDilationWFactor(), + conv2DOp.getStrideW(), opPadding, &newWidth, &padLeft, + &padRight) != tensorflow::OkStatus()) { + return failure(); + } + } + args.toBePadded = + padTop != 0 || padBottom != 0 || padLeft != 0 || padRight != 0; + + args.padding = {static_cast(padTop), static_cast(padLeft), + static_cast(padBottom), + static_cast(padRight)}; + args.padValue = 0; + + // Init lib_nn structs + args.Y = + nn::ImageGeometry(args.outputHeight, args.outputWidth, args.outputDepth, + /*elementBits=*/args.isI16Conv ? 16 : 8); + args.X = nn::ImageGeometry(args.inputHeight, args.inputWidth, args.inputDepth, + /*elementBits=*/args.isI16Conv ? 16 : 8); + args.K = nn::WindowGeometry( + args.filterHeight, args.filterWidth, args.filterDepth, -args.padding.top, + -args.padding.left, conv2DOp.getStrideH(), conv2DOp.getStrideW(), 1, + conv2DOp.getDilationHFactor(), conv2DOp.getDilationWFactor()); + + args.outputZeroPoint = outputZeroPoint; + args.inputZeroPoint = inputZeroPoint; + args.filter = filterVector; + args.bias = biasVector; + args.effectiveMultiplier = effectiveOutputScaleVector; + + // Obtain quant error threshold from command-line option + args.quantErrorThreshold = convQuantErrorThresholdOption; + args.quantErrorFullCheckEnabled = convForceErrorCheckOption; + return success(); +} + +// Since we are not defining the template functions in the header, we need +// explicit template class instantiations to avoid linker errors +template class ReplaceConv2DBase; +template class ReplaceConv2DBase; + +// +// +// +// Handle TFL Conv2D specific functions +LogicalResult ReplaceConv2DPattern::getKernelType(const TFLConvArgs &args, + Conv2DType &kt) const { + if (args.isI16Conv) { + if (args.inputDepth % 16 == 0 && args.outputDepth % 16 == 0) { + kt = Conv2DType::ValidDirectI16; + return success(); + } else { + return failure(); + } + } + + if (args.toBePadded) { + kt = Conv2DType::PaddedIndirect; + } else if (args.inputDepth % 32 == 0 && args.outputDepth % 16 == 0) { + kt = Conv2DType::ValidDirect; + } else { + kt = Conv2DType::ValidIndirect; + } + return success(); +} + +LogicalResult ReplaceConv2DPattern::getSerializedParamsAndTensors( + const TFLConvArgs &args, const Conv2DType &kt, OtType &otType, + llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &mulsBiasesData, + int &scratchBytes) const { + switch (kt) { + case Conv2DType::ValidDirect: + if (failed(getConv2DValidDirectParams(args, strParams, abstractKernelParams, + weightsData, scratchBytes))) { + return failure(); + } + break; + case Conv2DType::ValidIndirect: + if (failed(getConv2DValidIndirectParams(args, strParams, + abstractKernelParams, weightsData, + scratchBytes))) { + return failure(); + } + break; + case Conv2DType::PaddedIndirect: + if (failed(getConv2DPaddedIndirectParams(args, strParams, + abstractKernelParams, weightsData, + scratchBytes))) { + return failure(); + } + break; + default: + // This shouldn't happen! + return failure(); + } + + assert(strParams.size() == 2 && + "strParams should contain memcpyFn params and aggregateFn params!"); + std::string otStr; + if (failed(getOutputTransformParams(args, otStr, otType, mulsBiasesData))) { + return failure(); + } + strParams.push_back(otStr); + + return success(); +} + +// +LogicalResult ReplaceConv2DPattern::getSerializedParamsAndTensors( + const TFLConvArgs &args, const Conv2DType &kt, OtType &otType, + llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &mulsBiasesData, + int &scratchBytes) const { + + assert(kt == Conv2DType::ValidDirectI16); + otType = OtType::Group; + // + if (failed(getConv2DValidDirectI16Params(args, strParams, + abstractKernelParams, weightsData, + mulsBiasesData, scratchBytes))) { + // + assert(strParams.size() == 3 && "strParams should contain memcpyFn params, " + "aggregateFn params, and otFn params!"); + return failure(); + } + + return success(); +} + +LogicalResult ReplaceConv2DPattern::getOutputTransformParams( + const TFLConvArgs &args, std::string &otStr, OtType &otType, + std::vector &mulsBiasesData) const { + + otType = OtType::Group; + + if (convDebugOption) { + std::string message; + llvm::raw_string_ostream os(message); + std::cout << std::endl; + args.convOp->print(os); + std::stringstream msg; + msg << "Conv2D DEBUG" << std::endl; + std::cout << message << std::endl + << utils::getMsgWithLocPrefix(*args.convOp, msg.str()) + << std::endl; + } + + nn::MulsAndBias mulAndBiases = + nn::OutputTransformFnInt8::canonicalise_mul_and_bias( + args.effectiveMultiplier, args.bias, args.filter, args.inputZeroPoint, + args.outputZeroPoint, args.outputDepth, convDebugOption); + if (convDebugOption) { + nn::OutputTransformFn::layerwise_stats(mulAndBiases); + } + + // Try group OT + auto quantizer = nn::OutputTransformFnInt8_Group::Quantizer(); + nn::OutputTransformFnInt8_Group::QuantisationParams qp = + quantizer.quantise_activation(mulAndBiases, + targetArchOption == XS3A + ? nn_vlmul_shr_t::VLMUL_SHR_XS3A + : nn_vlmul_shr_t::VLMUL_SHR_VX4A, + convDebugOption); + + double quantError = nn::OutputTransformFnInt8::get_quant_error( + mulAndBiases, qp, args.quantErrorFullCheckEnabled); + if (quantError > args.quantErrorThreshold) { + // Try channelwise OT + auto quantizer = nn::OutputTransformFnInt8_Channelwise::Quantizer(); + nn::OutputTransformFnInt8_Channelwise::QuantisationParams qp = + quantizer.quantise_activation(mulAndBiases, + targetArchOption == XS3A + ? nn_vlmul_shr_t::VLMUL_SHR_XS3A + : nn_vlmul_shr_t::VLMUL_SHR_VX4A, + convDebugOption); + + quantError = nn::OutputTransformFnInt8_Channelwise::get_quant_error( + mulAndBiases, qp, true); + + if (quantError > args.quantErrorThreshold) { + std::stringstream msg; + msg << std::endl + << "WARNING: Op left unoptimized!" << std::endl + << "Reason: Quantization error of " << quantError + << " larger than set threshold of " << args.quantErrorThreshold + << ", therefore reverting to reference Conv2D op" << std::endl + << "Name: " << utils::getLocName(*args.convOp) << std::endl + << "Solution: Inspect the output, and if suitable, set a " + "higher threshold with --xcore-conv-err-threshold" + << std::endl; + if (!errorOpsSet_->count(args.convOp)) { + errorOpsSet_->insert(args.convOp); + llvm::errs() << msg.str(); + } + return failure(); + } else { + otType = OtType::Channelwise; + + auto serialisedMultipliersAndBiases = + nn::OutputTransformFn::serialise_memory(qp.initial_shifts, + qp.multipliers, qp.biases); + nn::OutputTransformFn::pad_final_access(serialisedMultipliersAndBiases, + VPU_INT16_EPV, + (int16_t)args.padValue); + nn::OT_int8_channelwise ot((int32_t)args.outputDepth, qp.final_shr); + auto otParams = ot.getParams(); + otStr = std::string((char *)&otParams, sizeof(otParams)); + + mulsBiasesData = serialisedMultipliersAndBiases; + return success(); + } + } + + if (otType == OtType::Group) { + auto serialisedMultipliersAndBiases = + nn::OutputTransformFn::serialise_memory(qp.multipliers, qp.biases); + nn::OutputTransformFn::pad_final_access( + serialisedMultipliersAndBiases, VPU_INT16_EPV, (int16_t)args.padValue); + nn::OT_int8 ot((int32_t)args.outputDepth, qp.initial_shr, qp.final_shr); + auto otParams = ot.getParams(); + otStr = std::string((char *)&otParams, sizeof(otParams)); + + mulsBiasesData = serialisedMultipliersAndBiases; + } + + return success(); +} + +LogicalResult ReplaceConv2DPattern::getConv2DPaddedIndirectParams( + const TFLConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, int &scratchBytes) const { + + nn::ImToColPadded imToCol(args.X, args.K, args.padding, args.inputDepth, + args.inputZeroPoint); + auto imToColParams = imToCol.getParams(); + + std::array filterShape = {args.outputDepth, args.filterHeight, + args.filterWidth, args.inputDepth}; + nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( + (int8_t *)args.filter.data(), filterShape, 8, args.padValue); + int inputBytes = args.filterHeight * args.filterWidth * args.inputDepth; + nn::MatMulInt8 af(args.outputDepth, inputBytes); + auto afParams = af.getParams(); + + std::string mfStr = + std::string((char *)&imToColParams, sizeof(imToColParams)); + std::string afStr = std::string((char *)&afParams, sizeof(afParams)); + + auto conv2DOp = dyn_cast(args.convOp); + abstractKernelParams = getAbstractKernelParamsForMultipleThreads( + args.imageRegionSplits, args.Y, conv2DOp.getOutputSubH(), + conv2DOp.getOutputSubW(), conv2DOp.getOutputStrideH(), + conv2DOp.getOutputStrideW(), conv2DOp.getInputOffset()); + strParams.push_back(mfStr); + strParams.push_back(afStr); + weightsData = rw.weights; + scratchBytes = + nn::MatMulInt8::get_scratch_mem_bytes(inputBytes) + 32; //[asj] FIXME + + return success(); +} + +LogicalResult ReplaceConv2DPattern::getConv2DValidIndirectParams( + const TFLConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, int &scratchBytes) const { + + nn::ImToColValid imToCol(args.X, args.K, args.inputDepth); + auto imToColParams = imToCol.getParams(); + + std::array filterShape = {args.outputDepth, args.filterHeight, + args.filterWidth, args.inputDepth}; + nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( + (int8_t *)args.filter.data(), filterShape, 8, args.padValue); + int inputBytes = args.filterHeight * args.filterWidth * args.inputDepth; + nn::MatMulInt8 af(args.outputDepth, inputBytes); + auto afParams = af.getParams(); + + std::string mfStr = + std::string((char *)&imToColParams, sizeof(imToColParams)); + std::string afStr = std::string((char *)&afParams, sizeof(afParams)); + + auto conv2DOp = dyn_cast(args.convOp); + abstractKernelParams = getAbstractKernelParamsForMultipleThreads( + args.imageRegionSplits, args.Y, conv2DOp.getOutputSubH(), + conv2DOp.getOutputSubW(), conv2DOp.getOutputStrideH(), + conv2DOp.getOutputStrideW(), conv2DOp.getInputOffset()); + strParams.push_back(mfStr); + strParams.push_back(afStr); + weightsData = rw.weights; + scratchBytes = + nn::MatMulInt8::get_scratch_mem_bytes(inputBytes) + 32; //[asj] FIXME + + return success(); +} + +LogicalResult ReplaceConv2DPattern::getConv2DValidDirectParams( + const TFLConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, int &scratchBytes) const { + + nn::DerefInputFn imToCol(args.X, args.K); + auto imToColParams = imToCol.getParams(); + + std::array filterShape = {args.outputDepth, args.filterHeight, + args.filterWidth, args.inputDepth}; + nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( + (int8_t *)args.filter.data(), filterShape, 8, args.padValue); + nn::MatMulDirectFn af(args.X, args.K, args.inputDepth); + auto afParams = af.getParams(); + + std::string mfStr = + std::string((char *)&imToColParams, sizeof(imToColParams)); + std::string afStr = std::string((char *)&afParams, sizeof(afParams)); + + auto conv2DOp = dyn_cast(args.convOp); + abstractKernelParams = getAbstractKernelParamsForMultipleThreads( + args.imageRegionSplits, args.Y, conv2DOp.getOutputSubH(), + conv2DOp.getOutputSubW(), conv2DOp.getOutputStrideH(), + conv2DOp.getOutputStrideW(), conv2DOp.getInputOffset()); + strParams.push_back(mfStr); + strParams.push_back(afStr); + weightsData = rw.weights; + scratchBytes = 0; + + return success(); +} + +LogicalResult ReplaceConv2DPattern::getConv2DValidDirectI16Params( + const TFLConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &mulsBiasesData, + int &scratchBytes) const { + + nn::DerefInputFn imToCol(args.X, args.K); + auto imToColParams = imToCol.getParams(); + + nn::MatMulDirectFn af(args.X, args.K, args.inputDepth); + auto afParams = af.getParams(); + + std::array filterShape = {args.outputDepth, args.filterHeight, + args.filterWidth, args.inputDepth}; + nn::Conv2dReorderedWeights rw = nn::MatMulInt8::reorder_kernel_weights( + (int8_t *)args.filter.data(), filterShape, 8, args.padValue, + /*isI16Conv=*/true); + + auto numInputCoefficients = + args.filterHeight * args.filterWidth * args.inputDepth; + std::vector filterOut(args.filter.size()); + std::vector mulsAndBiasOut(args.bias.size() * 2); + output_transform_fn_int16_kernel_transform( + args.filter.data(), args.effectiveMultiplier.data(), args.bias.data(), + filterOut.data(), mulsAndBiasOut.data(), numInputCoefficients, + args.outputDepth); + otfn_int16_params_t otParams = {(int32_t)args.outputDepth}; + + std::string mfStr = + std::string((char *)&imToColParams, sizeof(imToColParams)); + std::string afStr = std::string((char *)&afParams, sizeof(afParams)); + std::string otStr = std::string((char *)&otParams, sizeof(otParams)); + + auto conv2DOp = dyn_cast(args.convOp); + abstractKernelParams = getAbstractKernelParamsForMultipleThreads( + args.imageRegionSplits, args.Y, conv2DOp.getOutputSubH(), + conv2DOp.getOutputSubW(), conv2DOp.getOutputStrideH(), + conv2DOp.getOutputStrideW(), conv2DOp.getInputOffset()); + + strParams.push_back(mfStr); + strParams.push_back(afStr); + strParams.push_back(otStr); + + weightsData = rw.weights; + mulsBiasesData = mulsAndBiasOut; + scratchBytes = 0; + + return success(); +} + +// +// +// +// Handle TFL DepthwiseConv2D +LogicalResult +ReplaceDepthwiseConv2DPattern::getKernelType(const TFLConvArgs &args, + Conv2DType &kt) const { + if (args.toBePadded) { + kt = Conv2DType::DepthwisePaddedIndirect; + } else { + kt = Conv2DType::DepthwiseValidDirect; + } + return success(); +} + +LogicalResult ReplaceDepthwiseConv2DPattern::getSerializedParamsAndTensors( + const TFLConvArgs &args, const Conv2DType &kt, OtType &otType, + llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &mulsBiasesData, + int &scratchBytes) const { + switch (kt) { + case Conv2DType::DepthwiseValidDirect: + if (failed(getDepthwiseConv2DValidDirectParams( + args, strParams, abstractKernelParams, weightsData, + scratchBytes))) { + return failure(); + } + break; + case Conv2DType::DepthwisePaddedIndirect: + if (failed(getDepthwiseConv2DPaddedIndirectParams( + args, strParams, abstractKernelParams, weightsData, + scratchBytes))) { + return failure(); + } + break; + default: + // This shouldn't happen! + return failure(); + } + + assert(strParams.size() == 2 && + "strParams should contain memcpyFn params and aggregateFn params!"); + std::string otStr; + + if (failed(getOutputTransformParams(args, otStr, otType, mulsBiasesData))) { + return failure(); + } + strParams.push_back(otStr); + + return success(); +} + +LogicalResult ReplaceDepthwiseConv2DPattern::getSerializedParamsAndTensors( + const TFLConvArgs &args, const Conv2DType &kt, OtType &otType, + llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, std::vector &mulsBiasesData, + int &scratchBytes) const { + return failure(); +} + +LogicalResult ReplaceDepthwiseConv2DPattern::getOutputTransformParams( + const TFLConvArgs &args, std::string &otStr, OtType &otType, + std::vector &mulsBiasesData) const { + std::array filterShape = {1, args.filterHeight, args.filterWidth, + args.inputDepth}; + + otType = OtType::Group; + + if (convDebugOption) { + std::string message; + llvm::raw_string_ostream os(message); + std::cout << std::endl; + args.convOp->print(os); + std::stringstream msg; + msg << "DepthwiseConv2D DEBUG" << std::endl; + std::cout << message << std::endl + << utils::getMsgWithLocPrefix(*args.convOp, msg.str()) + << std::endl; + } + + nn::MulsAndBias mulAndBiases = + nn::OutputTransformFnInt8::canonicalise_mul_and_bias_dw( + args.effectiveMultiplier, args.bias, args.filter, filterShape, + args.inputZeroPoint, args.outputZeroPoint, args.outputDepth, + convDebugOption); + if (convDebugOption) { + nn::OutputTransformFn::layerwise_stats(mulAndBiases); + } + + // Try group OT + auto quantizer = nn::OutputTransformFnInt8_Group::Quantizer(); + nn::OutputTransformFnInt8_Group::QuantisationParams qp = + quantizer.quantise_activation(mulAndBiases, + targetArchOption == XS3A + ? nn_vlmul_shr_t::VLMUL_SHR_XS3A + : nn_vlmul_shr_t::VLMUL_SHR_VX4A, + convDebugOption); + + double quantError = nn::OutputTransformFnInt8::get_quant_error( + mulAndBiases, qp, args.quantErrorFullCheckEnabled); + if (quantError > args.quantErrorThreshold) { + // Try channelwise OT + auto quantizer = nn::OutputTransformFnInt8_Channelwise::Quantizer(); + nn::OutputTransformFnInt8_Channelwise::QuantisationParams qp = + quantizer.quantise_activation(mulAndBiases, + targetArchOption == XS3A + ? nn_vlmul_shr_t::VLMUL_SHR_XS3A + : nn_vlmul_shr_t::VLMUL_SHR_VX4A, + convDebugOption); + + quantError = nn::OutputTransformFnInt8_Channelwise::get_quant_error( + mulAndBiases, qp, true); + if (quantError > args.quantErrorThreshold) { + std::stringstream msg; + msg << std::endl + << "WARNING: Op left unoptimized!" << std::endl + << "Reason: Quantization error of " << quantError + << " larger than set threshold of " << args.quantErrorThreshold + << ", therefore reverting to reference DepthwiseConv2D op" + << std::endl + << "Name: " << utils::getLocName(*args.convOp) << std::endl + << "Solution: Inspect the output, and if suitable, set a " + "higher threshold with --xcore-conv-err-threshold" + << std::endl; + if (!errorOpsSet_->count(args.convOp)) { + errorOpsSet_->insert(args.convOp); + llvm::errs() << msg.str(); + } + return failure(); + } else { + otType = OtType::Channelwise; + + auto serialisedMultipliersAndBiases = + nn::OutputTransformFn::serialise_memory(qp.initial_shifts, + qp.multipliers, qp.biases); + nn::OutputTransformFn::pad_final_access(serialisedMultipliersAndBiases, + VPU_INT16_EPV, + (int16_t)args.padValue); + nn::OT_int8_channelwise ot((int32_t)args.outputDepth, qp.final_shr); + auto otParams = ot.getParams(); + + otStr = std::string((char *)&otParams, sizeof(otParams)); + mulsBiasesData = serialisedMultipliersAndBiases; + return success(); + } + } + if (otType == OtType::Group) { + auto serialisedMultipliersAndBiases = + nn::OutputTransformFn::serialise_memory(qp.multipliers, qp.biases); + nn::OutputTransformFn::pad_final_access( + serialisedMultipliersAndBiases, VPU_INT16_EPV, (int16_t)args.padValue); + nn::OT_int8 ot((int32_t)args.outputDepth, qp.initial_shr, qp.final_shr); + auto otParams = ot.getParams(); + + otStr = std::string((char *)&otParams, sizeof(otParams)); + mulsBiasesData = serialisedMultipliersAndBiases; + return success(); + } +} + +LogicalResult +ReplaceDepthwiseConv2DPattern::getDepthwiseConv2DValidDirectParams( + const TFLConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, int &scratchBytes) const { + + nn::DerefInputFn imToCol(args.X, args.K); + auto imToColParams = imToCol.getParams(); + + std::array filterShape = {1, args.filterHeight, args.filterWidth, + args.inputDepth}; + nn::Conv2dReorderedWeights rw = nn::MatMulDirectFn_DW::reorder_kernel_weights( + (int8_t *)args.filter.data(), filterShape, args.padValue); + nn::MatMulDirectFn_DW af(args.X, args.K); + auto afParams = af.getParams(); + + std::string mfStr = + std::string((char *)&imToColParams, sizeof(imToColParams)); + std::string afStr = std::string((char *)&afParams, sizeof(afParams)); + + abstractKernelParams = + getAbstractKernelParamsForMultipleThreads(args.imageRegionSplits, args.Y); + strParams.push_back(mfStr); + strParams.push_back(afStr); + weightsData = rw.weights; + scratchBytes = 0; + + return success(); +} + +LogicalResult +ReplaceDepthwiseConv2DPattern::getDepthwiseConv2DPaddedIndirectParams( + const TFLConvArgs &args, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, int &scratchBytes) const { + + nn::ImToColPadded imToCol(args.X, args.K, args.padding, 16, + args.inputZeroPoint); + auto imToColParams = imToCol.getParams(); + + std::array filterShape = {1, args.filterHeight, args.filterWidth, + args.inputDepth}; + nn::Conv2dReorderedWeights rw = nn::MatMulDirectFn_DW::reorder_kernel_weights( + (int8_t *)args.filter.data(), filterShape, args.padValue); + nn::MatMulDirectFn_DW af(args.K); + auto afParams = af.getParams(); + + std::string mfStr = + std::string((char *)&imToColParams, sizeof(imToColParams)); + std::string afStr = std::string((char *)&afParams, sizeof(afParams)); + + abstractKernelParams = + getAbstractKernelParamsForMultipleThreads(args.imageRegionSplits, args.Y); + strParams.push_back(mfStr); + strParams.push_back(afStr); + weightsData = rw.weights; + scratchBytes = nn::MatMulDirectFn_DW::get_scratch_mem_bytes(filterShape); + + return success(); +} + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ConvRevertPatterns.td b/xformer/Transforms/ConvRevertPatterns.td new file mode 100644 index 000000000..0e76948c7 --- /dev/null +++ b/xformer/Transforms/ConvRevertPatterns.td @@ -0,0 +1,19 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +include "mlir/Dialect/Arith/IR/ArithOps.td" +include "mlir/Dialect/Func/IR/FuncOps.td" +include "tensorflow/compiler/mlir/lite/ir/tfl_ops.td" + +include "IR/XCoreOps.td" + +// XC_FakeConv2D -> TFL_Conv2D() +def : Pat<(XC_FakeConv2DOp $input, $f, $b, $po, $dh, $dw, $faf, $p, $pv, $sh, + $sw, $osbh, $osbw, $osh, $osw, $io), + (TFL_Conv2DOp $input, $f, $b, $dh, $dw, $faf, $p, $sh, $sw)>; + +// XC_FakeDepthwiseConv2D -> TFL_DepthwiseConv2D() +def : Pat<(XC_FakeDepthwiseConv2DOp $input, $f, $b, $dh, $dw, $faf, $p, $pv, + $sh, $sw, $dm), + (TFL_DepthwiseConv2DOp $input, $f, $b, $dh, $dw, $faf, $p, $sh, $sw, + $dm)>; diff --git a/xformer/Transforms/LoadConstantOpPatterns.td b/xformer/Transforms/LoadConstantOpPatterns.td new file mode 100644 index 000000000..220224552 --- /dev/null +++ b/xformer/Transforms/LoadConstantOpPatterns.td @@ -0,0 +1,26 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +include "mlir/Dialect/Arith/IR/ArithOps.td" +include "mlir/Dialect/Func/IR/FuncOps.td" +include "tensorflow/compiler/mlir/lite/ir/tfl_ops.td" + +include "IR/XCoreOps.td" + +def ShouldBeLoadedExternally + : Constraint>; + +// This constraint checks if the pattern has already been applied to the const +// op +def IsNotUsedByLoadConstantOp + : Constraint>; + +foreach constOp = [Arith_ConstantOp, TFL_ConstOp] in { + def : Pat<(constOp:$op $attr), (XC_LoadConstantOp(constOp $attr)), + [(IsNotUsedByLoadConstantOp $op), + (ShouldBeLoadedExternally $attr)]>; +} + +def : Pat<(TFL_QConstOp:$op $qtype, $attr), + (XC_LoadConstantOp(TFL_QConstOp $qtype, $attr)), + [(IsNotUsedByLoadConstantOp $op), (ShouldBeLoadedExternally $attr)]>; diff --git a/xformer/Transforms/OpSplit.cpp b/xformer/Transforms/OpSplit.cpp new file mode 100644 index 000000000..226ed9e3c --- /dev/null +++ b/xformer/Transforms/OpSplit.cpp @@ -0,0 +1,1337 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Analysis/MemoryPlan.h" +#include "IR/XCoreOps.h" +#include "Transforms/Options.h" +#include "Utils/Util.h" + +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" +#include "tensorflow/compiler/mlir/tensorflow/utils/cluster_util.h" +#include "tensorflow/core/framework/kernel_shape_util.h" + +namespace mlir::xcore { + +namespace { +static constexpr char opSplitLabel[] = "opSplitLabel"; +static constexpr char opSplitLabelStartSplits[] = "opSplitLabelStartSplits"; +static constexpr char opSplitLabelNumSplits[] = "opSplitLabelNumSplits"; + +// OpSplit +struct OpSplit : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(OpSplit) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + registry.insert(); + } + StringRef getArgument() const final { return "xcore-op-split"; } + StringRef getDescription() const final { return "Op Split."; } + void runOnOperation() override; +}; + +TFL::SliceOp createSliceOp(PatternRewriter &rewriter, Location loc, Value input, + ArrayRef begin, ArrayRef size, + Type outputElemType) { + RankedTensorType outputType = + RankedTensorType::get({1, size[1], size[2], size[3]}, outputElemType); + auto beginConstantOp = + rewriter.create(loc, rewriter.getI32TensorAttr(begin)); + auto sizeConstantOp = + rewriter.create(loc, rewriter.getI32TensorAttr(size)); + auto sliceOp = rewriter.create(loc, outputType, input, + beginConstantOp, sizeConstantOp); + sliceOp->setAttr(opSplitLabel, rewriter.getUnitAttr()); + return sliceOp; +} + +LogicalResult isRaisableSlice(PatternRewriter &rewriter, TFL::SliceOp slice) { + // Only raise slices that have been inserted with op split pass + if (!slice->hasAttr(opSplitLabel)) + return failure(); + + auto definingOp = slice.getInput().getDefiningOp(); + // Do not raise slice if defining op does not have op split label + if (!definingOp->hasAttr(opSplitLabel)) + return failure(); + + // All other uses of defining op must be eligible slices + // We currently only opsplit ops with one result + int numEligibleSlices = 0; + for (const mlir::OpOperand &use : definingOp->getResult(0).getUses()) { + mlir::Operation *op = use.getOwner(); + if (auto sliceOp = dyn_cast_or_null(op)) { + if (!sliceOp->hasAttr(opSplitLabel)) { + return failure(); + } else { + numEligibleSlices++; + } + } else { + return failure(); + } + } + + // No of eligible slices must be greater than or equal to set num of splits + // If there are more slices, we should try to combine before raising + if (!definingOp->hasAttr(opSplitLabelNumSplits)) + return failure(); + + auto attr = definingOp->getAttr(opSplitLabelNumSplits); + int numSplits = attr.cast().getInt(); + if (numSplits != -1 && numEligibleSlices < numSplits) { + return failure(); + } else { + definingOp->setAttr(opSplitLabelNumSplits, rewriter.getI32IntegerAttr(-1)); + } + + return success(); +} + +LogicalResult combineSliceWithExisting(PatternRewriter &rewriter, + TFL::SliceOp slice) { + Value inp = slice.getInput(); + + // All other uses of defining op must be slices + // We currently only opsplit ops with one result + SmallVector sliceOps; + for (const mlir::OpOperand &use : inp.getUses()) { + mlir::Operation *op = use.getOwner(); + if (auto sliceOp = dyn_cast_or_null(op)) { + // We only support slices on height dimension + // Slice must have rank 4 and dim 0, 2, 3 must be the same for input and + // output + auto inType = sliceOp.getInput().getType().cast(); + auto outType = sliceOp.getOutput().getType().cast(); + if (inType.getRank() != 4 || + inType.getDimSize(0) != outType.getDimSize(0) || + inType.getDimSize(2) != outType.getDimSize(2) || + inType.getDimSize(3) != outType.getDimSize(3)) { + return failure(); + } + // Dont push current slice op + if (sliceOp != slice) { + sliceOps.push_back(sliceOp); + } + } + } + + auto f = slice->getParentOfType(); + + // Get begin index for slice + DenseElementsAttr attr; + int sliceBegin, sliceSize, candidateBegin, candidateSize; + if (!matchPattern(slice.getBegin(), m_Constant(&attr))) { + return failure(); + } + sliceBegin = attr.getValues()[1]; + if (!matchPattern(slice.getSize(), m_Constant(&attr))) { + return failure(); + } + sliceSize = attr.getValues()[1]; + + int i; + for (i = 0; i < sliceOps.size(); i++) { + // If slice op matches with another op in list, + // remove current one and attach to that + // Only need to consider height dimension as we only slice on that + if (!matchPattern(sliceOps[i].getBegin(), m_Constant(&attr))) { + return failure(); + } + candidateBegin = attr.getValues()[1]; + if (!matchPattern(sliceOps[i].getSize(), m_Constant(&attr))) { + return failure(); + } + candidateSize = attr.getValues()[1]; + + if (sliceBegin >= candidateBegin && + sliceBegin + sliceSize <= candidateBegin + candidateSize) { + // This slice can be attached to some slice in the list + break; + } else if (candidateBegin >= sliceBegin && + candidateBegin + candidateSize <= sliceBegin + sliceSize) { + // Another slice in the list can be attached to this slice + // We cannot modify that slice at this point + // So we return success() to come back here again + return success(); + } + } + + if (i < sliceOps.size()) { + // Slice can be removed + if (sliceBegin == candidateBegin && sliceSize == candidateSize) { + rewriter.replaceOp(slice, sliceOps[i].getOutput()); + } else { + // Create new slice + if (!matchPattern(sliceOps[i].getBegin(), m_Constant(&attr))) { + return failure(); + } + int32_t newBeginAttr[4] = { + attr.getValues()[0], sliceBegin - candidateBegin, + attr.getValues()[2], attr.getValues()[3]}; + if (!matchPattern(slice.getSize(), m_Constant(&attr))) { + return failure(); + } + // Same as slice size attr + int32_t newSizeAttr[4] = { + attr.getValues()[0], attr.getValues()[1], + attr.getValues()[2], attr.getValues()[3]}; + // We set the insertion point here, in case the slice to be attached is + // earlier in execution order. The new slice will be inserted after + rewriter.setInsertionPointAfter(sliceOps[i]); + auto newSlice = createSliceOp( + rewriter, sliceOps[i].getLoc(), sliceOps[i], newBeginAttr, + newSizeAttr, slice.getOutput().getType().getElementType()); + newSlice->removeAttr(opSplitLabel); + rewriter.replaceOp(slice, newSlice.getOutput()); + // We have to reorder the new slice uses here, in case the slice to be + // attached is earlier in execution order. All the subsequent ops in that + // opsplit branch is moved in execution order to be after the new slice + TF::ReorderOpResultUses(newSlice); + } + return success(); + } + return failure(); +} + +template +struct OpSplitPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TargetOp targetOp, + PatternRewriter &rewriter) const override { + // Do not split ops already split + // Only start splitting if the label is present + if (!(targetOp->hasAttr(opSplitLabelStartSplits))) + return failure(); + + int numSplits = 0; + auto attr = targetOp->getAttr(opSplitLabelNumSplits); + numSplits = attr.template cast().getInt(); + + if (targetOp->hasAttr(opSplitLabel)) + return failure(); + + // Output type must be QI8 + if (!utils::isNBitSignedQType<8>( + utils::getValElementType(targetOp.getResult()))) + return failure(); + + // Data from target op needed later + auto targetOutput = targetOp.getResult(); + auto outputType = + targetOutput.getType().template dyn_cast(); + int32_t outputHeight = outputType.getDimSize(1); + int32_t outputWidth = outputType.getDimSize(2); + int32_t outputDepth = outputType.getDimSize(3); + + // Clone the op as we want to replace it with the same op type but with + // slices and concat inserted after it + auto targetReplacement = llvm::cast(rewriter.clone(*targetOp)); + + // Apply label, so that the same op is not rewritten a second time. + targetReplacement->setAttr(opSplitLabel, rewriter.getUnitAttr()); + + // Will hold slice op to insert after target op + SmallVector sliceOps; + + int32_t sliceHeight = outputHeight / numSplits; + + // The remainder will be distributed between the splits + // to keep them about the same size + int32_t sliceHeightRemainder = outputHeight % numSplits; + + // For loop uses end index of previous slice created + // needs to initalized to zero for first slice + int32_t prevEndIndex = 0; + + // Loops creates slices with correct params + for (size_t i = 0; i < numSplits; i++) { + // Distributes remainder between slices + int32_t currentSliceHeight = sliceHeight; + if (i < sliceHeightRemainder) + currentSliceHeight++; + + int32_t begin[4] = {0, prevEndIndex, 0, 0}; + int32_t size[4] = {1, currentSliceHeight, outputWidth, outputDepth}; + auto sliceOp = + createSliceOp(rewriter, targetReplacement.getLoc(), targetReplacement, + begin, size, outputType.getElementType()); + + prevEndIndex += currentSliceHeight; + + // Store created slice op to use as input to concat + sliceOps.push_back(sliceOp.getResult()); + } + + // Create concat op that concats on dim 1, height + auto concatOp = rewriter.create( + targetReplacement.getLoc(), targetOutput.getType(), sliceOps, 1, + "NONE"); + concatOp->setAttr(opSplitLabel, rewriter.getUnitAttr()); + + // Replace target op with [cloned target op -> slices -> concat] + rewriter.replaceOp(targetOp, concatOp.getOutput()); + + return success(); + } +}; + +template +struct RaiseFakeSlicePattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(FakeSliceOp fakeSlice, + PatternRewriter &rewriter) const override { + auto definingOp = fakeSlice.getInput().getDefiningOp(); + // If fakeslice is only defined by const ops, remove it as we have reached + // the top + if (dyn_cast_or_null(definingOp) || + dyn_cast_or_null(definingOp)) { + rewriter.replaceOp(fakeSlice, fakeSlice->getOperand(0)); + return success(); + } + + // No of fake slices must be equal to set num of splits + if (!definingOp->hasAttr(opSplitLabelNumSplits)) + return failure(); + auto attr = definingOp->getAttr(opSplitLabelNumSplits); + int numSplits = attr.cast().getInt(); + auto beginAttr = fakeSlice->getAttr("begin").cast(); + if (beginAttr.size() != numSplits) { + return failure(); + } + + if (!dyn_cast_or_null(definingOp)) { + return failure(); + } + + // Do not raise fake slice if op does not have op split label + if (!(definingOp->hasAttr(opSplitLabel))) + return failure(); + + auto sliceOutShape = utils::getValShape(fakeSlice.getOutput()); + + // Create new fake slice above op + auto sliceReplacement = rewriter.clone(*fakeSlice); + sliceReplacement->setOperand(0, definingOp->getOperand(0)); + sliceReplacement->getResult(0).setType(definingOp->getOperand(0).getType()); + auto opReplacement = rewriter.clone(*definingOp); + opReplacement->setOperand(0, sliceReplacement->getResult(0)); + + // replace fakeslice with new fakeslice -> op + rewriter.replaceOp(fakeSlice, opReplacement->getResult(0)); + + return success(); + } +}; + +template +struct RaiseFakeSliceConstPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(FakeSliceOp fakeSlice, + PatternRewriter &rewriter) const override { + auto definingOp = fakeSlice.getInput().getDefiningOp(); + // If fakeslice is only defined by const ops, remove it as we have reached + // the top + if (dyn_cast_or_null(definingOp)) { + rewriter.replaceOp(fakeSlice, fakeSlice->getOperand(0)); + return success(); + } + return failure(); + } +}; + +struct RaiseFakeSliceToSliceMeanPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(FakeSliceOp fakeSlice, + PatternRewriter &rewriter) const override { + // If slice does not have a defining op, return failure + if (!(fakeSlice.getInput().getDefiningOp())) { + return failure(); + } + + auto meanOriginal = + dyn_cast_or_null(fakeSlice.getInput().getDefiningOp()); + if (!meanOriginal) { + return failure(); + } + + // Do not raise slice if op does not have op split label + if (!(meanOriginal->hasAttr(opSplitLabel))) + return failure(); + + auto beginAttr = fakeSlice->getAttr("begin").cast(); + auto sizeAttr = fakeSlice->getAttr("size").cast(); + assert(beginAttr.size() == sizeAttr.size()); + + // We only support all equal slices at the moment + assert(sizeAttr.size() > 1); + auto size = sizeAttr.getValue()[0].cast(); + for (int i = 1; i < sizeAttr.size(); i++) { + auto size2 = sizeAttr.getValue()[i].cast(); + if (size != size2) { + return failure(); + } + } + + // For each begin and size attr, create slice and corresponding mean op + SmallVector meanOps; + for (int i = 0; i < beginAttr.size(); i++) { + auto begin = beginAttr.getValue()[i].cast(); + auto beginVector = std::vector{ + begin.getValues().begin(), begin.getValues().end()}; + + auto size = sizeAttr.getValue()[i].cast(); + auto sizeVector = std::vector{size.getValues().begin(), + size.getValues().end()}; + + // Create slice and mean op + auto sliceReplacement = createSliceOp( + rewriter, fakeSlice.getLoc(), meanOriginal.getInput(), beginVector, + sizeVector, utils::getValElementType(meanOriginal.getInput())); + + auto meanReplacement = + llvm::cast(rewriter.clone(*meanOriginal)); + meanReplacement.setOperand(0, sliceReplacement); + + meanOps.push_back(meanReplacement.getResult()); + } + // Create concat and final mean op + auto meanOutShape = utils::getValShape(meanOriginal.getOutput()); + RankedTensorType newOutputType = RankedTensorType::get( + {1, static_cast(beginAttr.size()), 1, meanOutShape[3]}, + utils::getValElementType(meanOriginal.getOutput())); + auto newConcatOp = rewriter.create( + meanOriginal.getLoc(), newOutputType, meanOps, /*axis=*/1, "NONE"); + + auto meanReplacement = + llvm::cast(rewriter.clone(*meanOriginal)); + meanReplacement.setOperand(0, newConcatOp); + + // Replace fake slice with new slices -> mean ops -> concat -> mean + rewriter.replaceOp(fakeSlice, meanReplacement->getResult(0)); + + return success(); + } +}; + +// struct RaiseSliceToInputPattern : public OpRewritePattern { +// using OpRewritePattern::OpRewritePattern; + +// LogicalResult matchAndRewrite(TFL::SliceOp slice, +// PatternRewriter &rewriter) const override { +// auto f = slice->getParentOfType(); +// // If slice does not have a defining op, return failure +// if (!slice.getInput().getDefiningOp() || +// !isa(slice.getInput().getDefiningOp())) { +// return failure(); +// } + +// if (failed(isRaisableSlice(rewriter, slice))) { +// return failure(); +// } + +// if (succeeded(combineSliceWithExisting(rewriter, slice))) { +// return success(); +// } + +// if (isa(slice.getInput().getDefiningOp())) { +// // assert if concat axis is batch as that is where we opsplit +// // return failure(); +// } + +// if (isa(slice.getInput().getDefiningOp())) { +// // assert if slice axis is batch as that is where we opsplit +// // return failure(); +// } + +// auto opOriginal = llvm::cast(slice.getInput().getDefiningOp()); + +// DenseElementsAttr beginAttr, sizeAttr; +// if (!matchPattern(slice.getBegin(), m_Constant(&beginAttr))) { +// return failure(); +// } +// if (!matchPattern(slice.getSize(), m_Constant(&sizeAttr))) { +// return failure(); +// } + +// auto sliceOutShape = utils::getValShape(slice.getOutput()); +// auto opReplacement = llvm::cast(rewriter.clone(*opOriginal)); +// RankedTensorType opReplacementType = RankedTensorType::get( +// sliceOutShape, utils::getValElementType(opOriginal.getResult())); +// opReplacement->getResult(0).setType(opReplacementType); + +// auto outputType = +// opOriginal.getResult().getType().template cast(); +// auto getSliceOp = [&](int argNo, Value arg) -> Value { +// auto argType = arg.getType().cast(); +// if (1 /*utils::hasSameShape(argType, outputType)*/) { +// rewriter.setInsertionPoint(opReplacement); +// // auto newSlice = llvm::cast(rewriter.clone(*slice)); + +// // int32_t beginAttr[4] = { +// // 0, static_cast(newEndIndex - newOutputHeight), 0, 0}; +// auto argShape = argType.getShape(); +// int32_t newBeginAttr[4] = {beginAttr.getValues()[0], +// beginAttr.getValues()[1], +// beginAttr.getValues()[2], +// beginAttr.getValues()[3]}; +// int32_t newSizeAttr[4] = {1, static_cast(sliceOutShape[1]), +// static_cast(argShape[2]), +// static_cast(argShape[3])}; +// auto newSlice = +// createSliceOp(rewriter, slice.getLoc(), arg, newBeginAttr, +// newSizeAttr, utils::getValElementType(arg)); + +// // newSlice.setOperand(0, arg); +// // RankedTensorType newSliceType = RankedTensorType::get( +// // {sliceOutShape[0], sliceOutShape[1], argShape[2], +// argShape[3]}, +// // utils::getValElementType(arg)); +// // newSlice->getResult(0).setType(newSliceType); +// return newSlice; +// } else { +// auto fakeSlice = dyn_cast_or_null(arg.getDefiningOp()); +// if (!fakeSlice) { +// rewriter.setInsertionPoint(opOriginal); +// auto newFsOp = +// rewriter.create(arg.getLoc(), arg.getType(), arg); + +// llvm::SmallVector beginVals; +// beginVals.push_back(beginAttr); +// newFsOp->setAttr("begin", rewriter.getArrayAttr(beginVals)); + +// llvm::SmallVector sizeVals; +// sizeVals.push_back(sizeAttr); +// newFsOp->setAttr("size", rewriter.getArrayAttr(sizeVals)); + +// auto opReplacement = +// llvm::cast(rewriter.clone(*opOriginal)); +// opReplacement->setOperand(argNo, newFsOp); +// opOriginal.getResult().replaceAllUsesWith(opReplacement); +// rewriter.eraseOp(opOriginal); +// return newFsOp; +// } else { +// auto begin = fakeSlice->getAttr("begin").cast(); +// llvm::SmallVector beginVals = { +// begin.getValue().begin(), begin.getValue().end()}; +// beginVals.push_back(beginAttr); +// fakeSlice->setAttr("begin", rewriter.getArrayAttr(beginVals)); + +// auto size = fakeSlice->getAttr("size").cast(); +// llvm::SmallVector sizeVals = { +// size.getValue().begin(), size.getValue().end()}; +// sizeVals.push_back(sizeAttr); +// fakeSlice->setAttr("size", rewriter.getArrayAttr(sizeVals)); +// } +// return fakeSlice; +// } +// }; + +// // Create new slices for above op +// int numOperands = opOriginal.getNumOperands(); +// if (isa(slice.getInput().getDefiningOp())) { +// // assert if slice axis is batch as that is where we opsplit +// // return failure(); +// numOperands = 1; +// } +// for (int i = 0; i < numOperands; i++) { +// auto sliceOp = getSliceOp(i, opOriginal->getOperand(i)); +// opReplacement->setOperand(i, sliceOp); +// } + +// // replace slice with new slice -> new op +// rewriter.replaceOp(slice, opReplacement.getResult()); + +// return success(); +// } +// }; + +template +struct RaiseSlicePattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::SliceOp slice, + PatternRewriter &rewriter) const override { + auto f = slice->getParentOfType(); + // If slice does not have a defining op, return failure + if (!slice.getInput().getDefiningOp() || + !isa(slice.getInput().getDefiningOp())) { + return failure(); + } + + if (failed(isRaisableSlice(rewriter, slice))) { + return failure(); + } + + if (succeeded(combineSliceWithExisting(rewriter, slice))) { + return success(); + } + + if (isa(slice.getInput().getDefiningOp())) { + // assert if concat axis is batch as that is where we opsplit + // return failure(); + } + + if (isa(slice.getInput().getDefiningOp())) { + // assert if slice axis is batch as that is where we opsplit + // return failure(); + } + + auto opOriginal = llvm::cast(slice.getInput().getDefiningOp()); + + DenseElementsAttr beginAttr, sizeAttr; + if (!matchPattern(slice.getBegin(), m_Constant(&beginAttr))) { + return failure(); + } + if (!matchPattern(slice.getSize(), m_Constant(&sizeAttr))) { + return failure(); + } + + auto sliceOutShape = utils::getValShape(slice.getOutput()); + auto opReplacement = llvm::cast(rewriter.clone(*opOriginal)); + RankedTensorType opReplacementType = RankedTensorType::get( + sliceOutShape, utils::getValElementType(opOriginal.getResult())); + opReplacement->getResult(0).setType(opReplacementType); + + auto outputType = + opOriginal.getResult().getType().template cast(); + auto getSliceOp = [&](int argNo, Value arg) -> Value { + auto argType = arg.getType().cast(); + if (1 /*utils::hasSameShape(argType, outputType)*/) { + rewriter.setInsertionPoint(opReplacement); + // auto newSlice = llvm::cast(rewriter.clone(*slice)); + + // int32_t beginAttr[4] = { + // 0, static_cast(newEndIndex - newOutputHeight), 0, 0}; + auto argShape = argType.getShape(); + int32_t newBeginAttr[4] = {beginAttr.getValues()[0], + beginAttr.getValues()[1], + beginAttr.getValues()[2], + beginAttr.getValues()[3]}; + int32_t newSizeAttr[4] = {1, static_cast(sliceOutShape[1]), + static_cast(argShape[2]), + static_cast(argShape[3])}; + auto newSlice = + createSliceOp(rewriter, slice.getLoc(), arg, newBeginAttr, + newSizeAttr, utils::getValElementType(arg)); + + // newSlice.setOperand(0, arg); + // RankedTensorType newSliceType = RankedTensorType::get( + // {sliceOutShape[0], sliceOutShape[1], argShape[2], argShape[3]}, + // utils::getValElementType(arg)); + // newSlice->getResult(0).setType(newSliceType); + return newSlice; + } else { + auto fakeSlice = dyn_cast_or_null(arg.getDefiningOp()); + if (!fakeSlice) { + rewriter.setInsertionPoint(opOriginal); + auto newFsOp = + rewriter.create(arg.getLoc(), arg.getType(), arg); + + llvm::SmallVector beginVals; + beginVals.push_back(beginAttr); + newFsOp->setAttr("begin", rewriter.getArrayAttr(beginVals)); + + llvm::SmallVector sizeVals; + sizeVals.push_back(sizeAttr); + newFsOp->setAttr("size", rewriter.getArrayAttr(sizeVals)); + + auto opReplacement = llvm::cast(rewriter.clone(*opOriginal)); + opReplacement->setOperand(argNo, newFsOp); + opOriginal.getResult().replaceAllUsesWith(opReplacement); + rewriter.eraseOp(opOriginal); + return newFsOp; + } else { + auto begin = fakeSlice->getAttr("begin").cast(); + llvm::SmallVector beginVals = { + begin.getValue().begin(), begin.getValue().end()}; + beginVals.push_back(beginAttr); + fakeSlice->setAttr("begin", rewriter.getArrayAttr(beginVals)); + + auto size = fakeSlice->getAttr("size").cast(); + llvm::SmallVector sizeVals = { + size.getValue().begin(), size.getValue().end()}; + sizeVals.push_back(sizeAttr); + fakeSlice->setAttr("size", rewriter.getArrayAttr(sizeVals)); + } + return fakeSlice; + } + }; + + // Create new slices for above op + int numOperands = opOriginal.getNumOperands(); + if (isa(slice.getInput().getDefiningOp())) { + // assert if slice axis is batch as that is where we opsplit + // return failure(); + numOperands = 1; + } + for (int i = 0; i < numOperands; i++) { + auto sliceOp = getSliceOp(i, opOriginal->getOperand(i)); + opReplacement->setOperand(i, sliceOp); + } + + // replace slice with new slice -> new op + rewriter.replaceOp(slice, opReplacement.getResult()); + + return success(); + } +}; + +template +struct RaiseSliceUnaryPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::SliceOp slice, + PatternRewriter &rewriter) const override { + auto f = slice->getParentOfType(); + // If slice does not have a defining op, return failure + if (!slice.getInput().getDefiningOp() || + !isa(slice.getInput().getDefiningOp())) { + return failure(); + } + + if (failed(isRaisableSlice(rewriter, slice))) { + return failure(); + } + + if (succeeded(combineSliceWithExisting(rewriter, slice))) { + return success(); + } + + auto opOriginal = llvm::cast(slice.getInput().getDefiningOp()); + + DenseElementsAttr beginAttr, sizeAttr; + if (!matchPattern(slice.getBegin(), m_Constant(&beginAttr))) { + return failure(); + } + if (!matchPattern(slice.getSize(), m_Constant(&sizeAttr))) { + return failure(); + } + + auto sliceOutShape = utils::getValShape(slice.getOutput()); + auto opReplacement = llvm::cast(rewriter.clone(*opOriginal)); + RankedTensorType opReplacementType = RankedTensorType::get( + sliceOutShape, utils::getValElementType(opOriginal.getResult())); + opReplacement->getResult(0).setType(opReplacementType); + + auto outputType = + opOriginal.getResult().getType().template cast(); + auto getSliceOp = [&](int argNo, Value arg) -> Value { + auto argType = arg.getType().cast(); + if (utils::hasSameShape(argType, outputType)) { + rewriter.setInsertionPoint(opReplacement); + auto newSlice = llvm::cast(rewriter.clone(*slice)); + newSlice.setOperand(0, arg); + RankedTensorType newSliceType = + RankedTensorType::get(sliceOutShape, utils::getValElementType(arg)); + newSlice->getResult(0).setType(newSliceType); + return newSlice; + } else { + auto fakeSlice = dyn_cast_or_null(arg.getDefiningOp()); + if (!fakeSlice) { + rewriter.setInsertionPoint(opOriginal); + auto newFsOp = + rewriter.create(arg.getLoc(), arg.getType(), arg); + + llvm::SmallVector beginVals; + beginVals.push_back(beginAttr); + newFsOp->setAttr("begin", rewriter.getArrayAttr(beginVals)); + + llvm::SmallVector sizeVals; + sizeVals.push_back(sizeAttr); + newFsOp->setAttr("size", rewriter.getArrayAttr(sizeVals)); + + auto opReplacement = llvm::cast(rewriter.clone(*opOriginal)); + opReplacement->setOperand(argNo, newFsOp); + opOriginal.getResult().replaceAllUsesWith(opReplacement); + rewriter.eraseOp(opOriginal); + return newFsOp; + } else { + auto begin = fakeSlice->getAttr("begin").cast(); + llvm::SmallVector beginVals = { + begin.getValue().begin(), begin.getValue().end()}; + beginVals.push_back(beginAttr); + fakeSlice->setAttr("begin", rewriter.getArrayAttr(beginVals)); + + auto size = fakeSlice->getAttr("size").cast(); + llvm::SmallVector sizeVals = { + size.getValue().begin(), size.getValue().end()}; + sizeVals.push_back(sizeAttr); + fakeSlice->setAttr("size", rewriter.getArrayAttr(sizeVals)); + } + return fakeSlice; + } + }; + + // Create new slices for above op + // auto sliceLHS = getSliceOp(0, opOriginal.getLhs()); + auto sliceRHS = getSliceOp(0, opOriginal->getOperand(0)); + // opReplacement.setOperand(0, sliceLHS); + opReplacement->setOperand(0, sliceRHS); + + // replace slice with new slice -> new op + rewriter.replaceOp(slice, opReplacement.getResult()); + + return success(); + } +}; + +template +struct RaiseSliceBinaryPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::SliceOp slice, + PatternRewriter &rewriter) const override { + auto f = slice->getParentOfType(); + // If slice does not have a defining op, return failure + if (!slice.getInput().getDefiningOp() || + !isa(slice.getInput().getDefiningOp())) { + return failure(); + } + + if (failed(isRaisableSlice(rewriter, slice))) { + return failure(); + } + + if (succeeded(combineSliceWithExisting(rewriter, slice))) { + return success(); + } + + auto opOriginal = llvm::cast(slice.getInput().getDefiningOp()); + + DenseElementsAttr beginAttr, sizeAttr; + if (!matchPattern(slice.getBegin(), m_Constant(&beginAttr))) { + return failure(); + } + if (!matchPattern(slice.getSize(), m_Constant(&sizeAttr))) { + return failure(); + } + + auto sliceOutShape = utils::getValShape(slice.getOutput()); + auto opReplacement = llvm::cast(rewriter.clone(*opOriginal)); + RankedTensorType opReplacementType = RankedTensorType::get( + sliceOutShape, utils::getValElementType(opOriginal.getOutput())); + opReplacement->getResult(0).setType(opReplacementType); + + auto outputType = + opOriginal.getOutput().getType().template cast(); + auto getSliceOp = [&](int argNo, Value arg) -> Value { + auto argType = arg.getType().cast(); + if (utils::hasSameShape(argType, outputType)) { + rewriter.setInsertionPoint(opReplacement); + auto newSlice = llvm::cast(rewriter.clone(*slice)); + newSlice.setOperand(0, arg); + RankedTensorType newSliceType = + RankedTensorType::get(sliceOutShape, utils::getValElementType(arg)); + newSlice->getResult(0).setType(newSliceType); + return newSlice; + } else { + auto fakeSlice = dyn_cast_or_null(arg.getDefiningOp()); + if (!fakeSlice) { + rewriter.setInsertionPoint(opOriginal); + auto newFsOp = + rewriter.create(arg.getLoc(), arg.getType(), arg); + + llvm::SmallVector beginVals; + beginVals.push_back(beginAttr); + newFsOp->setAttr("begin", rewriter.getArrayAttr(beginVals)); + + llvm::SmallVector sizeVals; + sizeVals.push_back(sizeAttr); + newFsOp->setAttr("size", rewriter.getArrayAttr(sizeVals)); + + auto opReplacement = + llvm::cast(rewriter.clone(*opOriginal)); + opReplacement.setOperand(argNo, newFsOp); + opOriginal.getOutput().replaceAllUsesWith(opReplacement); + rewriter.eraseOp(opOriginal); + return newFsOp; + } else { + auto begin = fakeSlice->getAttr("begin").cast(); + llvm::SmallVector beginVals = { + begin.getValue().begin(), begin.getValue().end()}; + beginVals.push_back(beginAttr); + fakeSlice->setAttr("begin", rewriter.getArrayAttr(beginVals)); + + auto size = fakeSlice->getAttr("size").cast(); + llvm::SmallVector sizeVals = { + size.getValue().begin(), size.getValue().end()}; + sizeVals.push_back(sizeAttr); + fakeSlice->setAttr("size", rewriter.getArrayAttr(sizeVals)); + } + return fakeSlice; + } + }; + + // Create new slices for above op + auto sliceLHS = getSliceOp(0, opOriginal.getLhs()); + auto sliceRHS = getSliceOp(1, opOriginal.getRhs()); + opReplacement.setOperand(0, sliceLHS); + opReplacement.setOperand(1, sliceRHS); + + // replace slice with new slice -> new op + rewriter.replaceOp(slice, opReplacement.getOutput()); + + return success(); + } +}; + +template +struct RaiseSliceConvPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::SliceOp slice, + PatternRewriter &rewriter) const override { + // If slice does not have a defining op, return failure + if (!slice.getInput().getDefiningOp() || + !isa(slice.getInput().getDefiningOp())) { + return failure(); + } + + if (failed(isRaisableSlice(rewriter, slice))) { + return failure(); + } + + if (succeeded(combineSliceWithExisting(rewriter, slice))) { + return success(); + } + + // Get data from conv needed to raise slice + auto convOriginal = llvm::cast(slice.getInput().getDefiningOp()); + + auto convOriginalInput = + convOriginal.getInput().getType().template cast(); + auto inputHeight = convOriginalInput.getDimSize(1); + auto inputWidth = convOriginalInput.getDimSize(2); + auto inputChannels = convOriginalInput.getDimSize(3); + + auto convOriginalOutput = + convOriginal.getOutput().getType().template cast(); + auto outputHeight = convOriginalOutput.getDimSize(1); + auto outputChannels = convOriginalOutput.getDimSize(3); + + int filterHeight, filterWidth; + if (auto op = + dyn_cast(slice.getInput().getDefiningOp())) { + filterHeight = op.getFilterHeight(); + filterWidth = op.getFilterWidth(); + } else if (auto op = + dyn_cast(slice.getInput().getDefiningOp())) { + auto filterType = + op.getFilter().getType().template dyn_cast(); + filterHeight = filterType.getDimSize(1); + filterWidth = filterType.getDimSize(2); + } + if (auto op = dyn_cast( + slice.getInput().getDefiningOp())) { + auto filterType = + op.getFilter().getType().template dyn_cast(); + filterHeight = filterType.getDimSize(1); + filterWidth = filterType.getDimSize(2); + } + + auto strideHeight = convOriginal.getStrideH(); + auto strideWidth = convOriginal.getStrideW(); + + DenseElementsAttr attr; + if (!matchPattern(slice.getBegin(), m_Constant(&attr))) { + return failure(); + } + auto beginIndex = attr.getValues()[1]; + if (!matchPattern(slice.getSize(), m_Constant(&attr))) { + return failure(); + } + auto sizeIndex = attr.getValues()[1]; + auto endIndex = beginIndex + sizeIndex; + + // Get original slice's output height + auto sliceOutput = slice.getOutput().getType().cast(); + auto sliceOutputHeight = sliceOutput.getDimSize(1); + + int32_t newEndIndex; + int32_t newOutputHeight; + int64_t padTop, padBottom, padLeft, padRight; + padTop = padBottom = padLeft = padRight = 0; + + int dilation_h_factor = 1; + int dilation_w_factor = 1; + int64_t newHeight, newWidth; + tensorflow::Padding opPadding = convOriginal.getPadding() == "VALID" + ? tensorflow::Padding::VALID + : tensorflow::Padding::SAME; + // Get pad values for conv op + if (tensorflow::GetWindowedOutputSizeVerbose( + inputHeight, filterHeight, dilation_h_factor, strideHeight, + opPadding, &newHeight, &padTop, + &padBottom) != tensorflow::OkStatus()) { + return failure(); + } + if (tensorflow::GetWindowedOutputSizeVerbose( + inputWidth, filterWidth, dilation_w_factor, strideWidth, opPadding, + &newWidth, &padLeft, &padRight) != tensorflow::OkStatus()) { + return failure(); + } + + // Check if padding is same + int32_t lostFraction = 0; + if (convOriginal.getPadding() == "VALID") { + if (endIndex == outputHeight) { + newEndIndex = inputHeight; + lostFraction = + (inputHeight - filterHeight + strideHeight) % strideHeight; + } else { + newEndIndex = endIndex * strideHeight - strideHeight + filterHeight; + } + } else if (convOriginal.getPadding() == "SAME") { + // Check if this is left most split + if (beginIndex == 0) { + newEndIndex = + endIndex * strideHeight - strideHeight + filterHeight - padTop; + padBottom = 0; + + } else if (endIndex == outputHeight) { + newEndIndex = endIndex * strideHeight - strideHeight + filterHeight - + padTop - padBottom; + padTop = 0; + + } else { + newEndIndex = + endIndex * strideHeight - strideHeight + filterHeight - padTop; + padTop = 0; + padBottom = 0; + } + } + // Calculate new output height after raising slice above conv + newOutputHeight = sliceOutputHeight * strideHeight - strideHeight + + filterHeight - padTop - padBottom + lostFraction; + + int32_t beginAttr[4] = { + 0, static_cast(newEndIndex - newOutputHeight), 0, 0}; + int32_t sizeAttr[4] = {1, static_cast(newOutputHeight), + static_cast(inputWidth), + static_cast(inputChannels)}; + auto sliceReplacement = createSliceOp( + rewriter, slice.getLoc(), convOriginal.getInput(), beginAttr, sizeAttr, + utils::getValElementType(convOriginal.getInput())); + + // Adjust shape for padding + // For valid conv the shapes will not change since pad values are zero + auto paddedHeight = newOutputHeight + padTop + padBottom; + auto paddedWidth = inputWidth + padLeft + padRight; + + // If padding is same, create pad op to extract padding + TFL::PadOp padOp; + if (convOriginal.getPadding() == "SAME") { + std::vector paddingValues{0, + 0, + static_cast(padTop), + static_cast(padBottom), + static_cast(padLeft), + static_cast(padRight), + 0, + 0}; + + RankedTensorType paddingsType = + RankedTensorType::get({4, 2}, rewriter.getI32Type()); + + Value paddings = rewriter.create( + slice.getLoc(), + DenseIntElementsAttr::get(paddingsType, paddingValues)); + + auto paddedResultType = RankedTensorType::get( + {1, paddedHeight, paddedWidth, inputChannels}, + utils::getValElementType(convOriginal.getInput())); + + padOp = rewriter.create(slice.getLoc(), paddedResultType, + sliceReplacement, paddings); + } + + auto convReplacement = llvm::cast(rewriter.clone(*convOriginal)); + + RankedTensorType newConvType = RankedTensorType::get( + {1, (paddedHeight + strideHeight - filterHeight) / strideHeight, + (paddedWidth + strideWidth - filterWidth) / strideWidth, + outputChannels}, + utils::getValElementType(convOriginal.getOutput())); + convReplacement->getResult(0).setType(newConvType); + + // if valid padding no need for pad op, connect to slice + // else connect to pad op + if (convOriginal.getPadding() == "VALID") { + // Connect new conv's input to new slice + convReplacement->setOperand(0, sliceReplacement); + + } else if (convOriginal.getPadding() == "SAME") { + // Connect new conv's input to pad op + convReplacement->setOperand(0, padOp); + + // Change padding on cloned conv to valid since + // padding was extracted to pad op + convReplacement->setAttr("padding", rewriter.getStringAttr("VALID")); + } + + // replace slice with new slice -> new conv + // or new slice -> pad -> new conv + rewriter.replaceOp(slice, convReplacement.getOutput()); + + return success(); + } +}; + +struct RaiseSlicePadPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::SliceOp slice, + PatternRewriter &rewriter) const override { + if (!slice.getInput().getDefiningOp() || + !isa(slice.getInput().getDefiningOp())) { + return failure(); + } + + if (failed(isRaisableSlice(rewriter, slice))) { + return failure(); + } + + if (succeeded(combineSliceWithExisting(rewriter, slice))) { + return success(); + } + + auto padOriginal = llvm::cast(slice.getInput().getDefiningOp()); + + // Do not raise slice if op does not have op split label + if (!(padOriginal->hasAttr(opSplitLabel))) + return failure(); + + // Get data from pad needed to raise slice + auto padOriginalInput = + padOriginal.getInput().getType().template cast(); + auto inputWidth = padOriginalInput.getDimSize(2); + auto inputChannels = padOriginalInput.getDimSize(3); + + auto padOriginalOutput = + padOriginal.getOutput().getType().template cast(); + auto outputHeight = padOriginalOutput.getDimSize(1); + auto outputChannels = padOriginalOutput.getDimSize(3); + + int64_t padTop, padBottom, padLeft, padRight; + + DenseIntElementsAttr padAttr; + if (!matchPattern(padOriginal.getPadding(), m_Constant(&padAttr))) { + return failure(); + } + // Keep padding values the same in the last dimension + auto padVal = padAttr.getValues(); + padTop = padVal[{1, 0}]; + padBottom = padVal[{1, 1}]; + padLeft = padVal[{2, 0}]; + padRight = padVal[{2, 1}]; + + // Get original slice's output height + auto sliceOutput = slice.getOutput().getType().cast(); + auto sliceOutputHeight = sliceOutput.getDimSize(1); + auto sliceOutputWidth = sliceOutput.getDimSize(2); + + // get end index of slice + DenseElementsAttr attr; + if (!matchPattern(slice.getSize(), m_Constant(&attr))) { + return failure(); + } + auto sizeIndex = attr.getValues()[1]; + + // Get begin index for slice + if (!matchPattern(slice.getBegin(), m_Constant(&attr))) { + return failure(); + } + auto beginIndex = attr.getValues()[1]; + auto endIndex = beginIndex + sizeIndex; + + int32_t newEndIndex; + int32_t newOutputHeight; + + if (beginIndex == 0) { + newEndIndex = endIndex - padTop; + padBottom = 0; + + } else if (endIndex == outputHeight) { // end + newEndIndex = endIndex - padTop - padBottom; + padTop = 0; + + } else { + newEndIndex = endIndex - padTop; + padTop = 0; + padBottom = 0; + } + + // Calculate new output height after raising slice above pad + newOutputHeight = sliceOutputHeight - padTop - padBottom; + + int32_t beginAttr[4] = { + 0, static_cast(newEndIndex - newOutputHeight), 0, 0}; + int32_t sizeAttr[4] = {1, static_cast(newOutputHeight), + static_cast(inputWidth), + static_cast(inputChannels)}; + auto sliceReplacement = createSliceOp( + rewriter, slice.getLoc(), padOriginal.getInput(), beginAttr, sizeAttr, + utils::getValElementType(padOriginal.getInput())); + + // Adjust shape for padding + auto paddedHeight = newOutputHeight + padTop + padBottom; + auto paddedWidth = inputWidth + padLeft + padRight; + + std::vector paddingValues{0, + 0, + static_cast(padTop), + static_cast(padBottom), + static_cast(padLeft), + static_cast(padRight), + padVal[{3, 0}], + padVal[{3, 1}]}; + + RankedTensorType paddingsType = + RankedTensorType::get({4, 2}, rewriter.getI32Type()); + + Value paddings = rewriter.create( + slice.getLoc(), DenseIntElementsAttr::get(paddingsType, paddingValues)); + + auto paddedResultType = + RankedTensorType::get({1, paddedHeight, paddedWidth, outputChannels}, + utils::getValElementType(padOriginal.getInput())); + + auto padReplacement = rewriter.create( + slice.getLoc(), paddedResultType, sliceReplacement, paddings); + + // replace slice with new slice -> new pad + rewriter.replaceOp(slice, padReplacement.getOutput()); + + return success(); + } +}; + +struct CombineSlicesPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::SliceOp slice, + PatternRewriter &rewriter) const override { + + if (succeeded(combineSliceWithExisting(rewriter, slice))) { + return success(); + } + + return failure(); + } +}; + +void OpSplit::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + + auto &startOps = opSplitBottomOpsOption; + auto &endOps = opSplitTopOpsOption; + auto &numSplits = opSplitNumSplitsOption; + + // Check if the sizes of startOps, endOps, and numSplits are equal + if (!(startOps.size() == endOps.size() && + endOps.size() == numSplits.size())) { + // If they are not, emit an error message and signal pass failure + func.emitError( + "Top, bottom, and num splits must have the same number of elements!"); + signalPassFailure(); + return; + } + + OpBuilder builder(func); + for (int i = 0; i < startOps.size(); ++i) { + int k = 0; + func.walk([&](Operation *op) { + if (!op->hasTrait() && + !llvm::isa(op)) { + if (k == startOps[i]) { + // If op is slice, just raise it, do not split it + if (isa(op)) { + op->setAttr(opSplitLabel, builder.getUnitAttr()); + auto sliceOp = llvm::cast(op); + sliceOp.getInput().getDefiningOp()->setAttr(opSplitLabel, + builder.getUnitAttr()); + } else { // add label to insert slice under op later + op->setAttr(opSplitLabelStartSplits, builder.getUnitAttr()); + op->setAttr(opSplitLabelNumSplits, + builder.getI32IntegerAttr(numSplits[i])); + } + } else if (k < startOps[i] && k >= endOps[i]) { + op->setAttr(opSplitLabel, builder.getUnitAttr()); + op->setAttr(opSplitLabelNumSplits, + builder.getI32IntegerAttr(numSplits[i])); + } + k++; + } + }); + } + + RewritePatternSet patterns1(ctx); + + patterns1.insert>(ctx); + patterns1.insert>(ctx); + + patterns1.insert>(ctx); + patterns1.insert>(ctx); + patterns1.insert>(ctx); + patterns1.insert>(ctx); + patterns1.insert>(ctx); + patterns1.insert>(ctx); + patterns1.insert>(ctx); + patterns1.insert>(ctx); + + (void)applyPatternsAndFoldGreedily(func, std::move(patterns1)); + + RewritePatternSet patterns2(ctx); + // We are restricting pattern matching to only move slices above when they + // have reached the number of set splits. This means many pass iterations + // would fail as they don't meet the criteria. We increase the maxIterations + // count here so that more iterations are tried before the rewriter decides + // failure. + GreedyRewriteConfig config; + config.maxIterations = 50; + + patterns2.insert>(ctx); + patterns2.insert>(ctx); + patterns2.insert>(ctx); + patterns2.insert>(ctx); + patterns2.insert>(ctx); + patterns2.insert>(ctx); + patterns2.insert(ctx); + + patterns2.insert>(ctx); + patterns2.insert>(ctx); + patterns2.insert>(ctx); + + patterns2.insert>(ctx); + patterns2.insert>(ctx); + patterns2.insert>(ctx); + patterns2.insert>(ctx); + patterns2.insert(ctx); + + (void)applyPatternsAndFoldGreedily(func, std::move(patterns2), config); + // Combine slices after op splitting + // At the top ops, it's possible that they are slices left to be combined as + // those slices have not been raised further. + // Combine them here. + RewritePatternSet patterns3(ctx); + patterns3.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns3)); +} // void OpSplit::runOnOperation() { +} // namespace + +// Creates an instance of the OpSplit pass. +std::unique_ptr> createOpSplitPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/OptimizeConv2D.cpp b/xformer/Transforms/OptimizeConv2D.cpp new file mode 100644 index 000000000..77ef5865c --- /dev/null +++ b/xformer/Transforms/OptimizeConv2D.cpp @@ -0,0 +1,849 @@ +// Copyright 2023 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Transforms/Options.h" + +#include "Utils/Util.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +namespace { +// Optimize TFL Conv2D. +struct OptimizeConv2D + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(OptimizeConv2D) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-optimize-conv2d"; } + StringRef getDescription() const final { return "Optimize TFL Conv2D."; } + void runOnOperation() override; +}; + +struct ChannelwiseSplitConv2DOutputPattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::Conv2DOp op, + PatternRewriter &rewriter) const override { + // Check for invalid types and return + // Input type must be QI8 or QI16 + auto inputElementType = + op.getInput().getType().template cast().getElementType(); + if (!utils::isNBitSignedQType<8>(inputElementType) && + !utils::isNBitSignedQType<16>(inputElementType)) { + return failure(); + } + + auto filterElementType = + op.getFilter().getType().cast().getElementType(); + if (!utils::isNBitSignedQType<8>(filterElementType)) { + return failure(); + } + + // If bias exists, it must be QI32 + if (auto biasType = op.getBias().getType().dyn_cast()) { + if (!utils::isNBitSignedQType<32>(biasType.getElementType())) + return failure(); + } + + // Lamdba to split filter or bias based on whether it is per channelwise + // quantization. + // If per channelwise quantization, we have to split the + // quantization params. + auto getSplitResultType = [](int splitSize, int elems, + std::initializer_list &shape, + TFL::QConstOp op, ShapedType opType) { + Type splitResultType = + RankedTensorType::get(shape, opType.getElementType()); + + auto opQType = op.getQtype().template cast(); + + if (auto qType = + opQType.getElementType() + .dyn_cast()) { + auto scaleVector = + std::vector{qType.getScales().begin() + elems, + qType.getScales().begin() + elems + splitSize}; + + auto zeroPointVector = std::vector{ + qType.getZeroPoints().begin() + elems, + qType.getZeroPoints().begin() + elems + splitSize}; + + auto newQType = quant::UniformQuantizedPerAxisType::getChecked( + op.getLoc(), qType.getFlags(), qType.getStorageType(), + qType.getExpressedType(), scaleVector, zeroPointVector, + qType.getQuantizedDimension(), qType.getStorageTypeMin(), + qType.getStorageTypeMax()); + + splitResultType = newQType.castFromExpressedType( + quant::AnyQuantizedType::castToExpressedType(splitResultType)); + } + return splitResultType; + }; + + if (!llvm::isa(op.getFilter().getDefiningOp())) + return failure(); + + auto filterQConstOp = + dyn_cast(op.getFilter().getDefiningOp()); + auto filterType = op.getFilter().getType().cast(); + auto filter = filterQConstOp.getValue().cast(); + auto filterSize = filter.size(); + + // We want to try to keep the split filtersize less than specified size + int numSplits = ceil(filterSize / convChannelwiseSplitSizeOption); + + // Let's split the filter batch size as that's the same as bias size and + // output channel size + // We want splits to be multiples of four + auto filterBatchSize = filterType.getShape()[0]; + // Only try to split if at least two splits are possible + if (numSplits < 2 || filterBatchSize / 4 < 2) { + return failure(); + } + + // We want splits to be multiples of four, so we divide here and multiply + // after calculating the split sizes + int tmp = filterBatchSize / 4; + int d = tmp / numSplits; + int r = tmp % numSplits; + llvm::SmallVector splitSizes; + // If not an even split, we distribute the remainder to the first few splits + for (int i = 0; i < numSplits; ++i) { + if (r > 0) { + splitSizes.push_back((d + 1) * 4); + r -= 1; + } else { + splitSizes.push_back(d * 4); + } + } + + bool biasPresent = true; + if (!op.getBias().getType().isa()) { + auto biasQConstOp = dyn_cast(op.getBias().getDefiningOp()); + auto bias = biasQConstOp.getValue().cast(); + assert(bias.size() == filterBatchSize); + } else { + biasPresent = false; + } + + assert(op.getOutput().getType().cast().getShape()[3] == + filterBatchSize); + + SmallVector conv2DOps; + int elems = 0; + for (int i = 0; i < splitSizes.size(); ++i) { + // Create split filter + auto splitFilterShape = { + static_cast(splitSizes[i]), filterType.getShape()[1], + filterType.getShape()[2], filterType.getShape()[3]}; + auto splitFilterResultType = getSplitResultType( + splitSizes[i], elems, splitFilterShape, filterQConstOp, filterType); + auto splitFilterValueType = + RankedTensorType::get(splitFilterShape, rewriter.getIntegerType(8)); + auto filterSizeExcludingBatch = filterType.getShape()[1] * + filterType.getShape()[2] * + filterType.getShape()[3]; + auto filterVector = std::vector{ + filter.getValues().begin() + elems * filterSizeExcludingBatch, + filter.getValues().begin() + + ((elems + splitSizes[i]) * filterSizeExcludingBatch)}; + + auto splitFilterQConstOp = rewriter.create( + op.getLoc(), mlir::TypeAttr::get(splitFilterResultType), + mlir::DenseElementsAttr::get(splitFilterValueType, + llvm::ArrayRef(filterVector))); + + Value splitBiasQConstOpOrNone; + if (biasPresent) { + // Create split bias + auto biasQConstOp = + dyn_cast(op.getBias().getDefiningOp()); + auto biasType = op.getBias().getType().cast(); + auto bias = biasQConstOp.getValue().cast(); + + auto splitBiasShape = {static_cast(splitSizes[i])}; + auto splitBiasResultType = getSplitResultType( + splitSizes[i], elems, splitBiasShape, biasQConstOp, biasType); + auto splitBiasValueType = + RankedTensorType::get(splitBiasShape, rewriter.getIntegerType(32)); + auto biasVector = std::vector{ + bias.getValues().begin() + elems, + bias.getValues().begin() + elems + splitSizes[i]}; + + splitBiasQConstOpOrNone = rewriter.create( + op.getLoc(), mlir::TypeAttr::get(splitBiasResultType), + mlir::DenseElementsAttr::get(splitBiasValueType, + llvm::ArrayRef(biasVector))); + } else { + splitBiasQConstOpOrNone = op.getBias(); + } + + // Add split Conv2Ds + auto outputType = op.getOutput().getType().cast(); + auto splitResultType = RankedTensorType::get( + {outputType.getShape()[0], outputType.getShape()[1], + outputType.getShape()[2], splitSizes[i]}, + outputType.getElementType()); + + auto newConv2DOp = rewriter.create( + op.getLoc(), splitResultType, op.getInput(), splitFilterQConstOp, + splitBiasQConstOpOrNone, op.getDilationHFactor(), + op.getDilationWFactor(), op.getFusedActivationFunction(), "VALID", + op.getStrideH(), op.getStrideW()); + + conv2DOps.push_back(newConv2DOp.getResult()); + + elems += splitSizes[i]; + } + + // Add concatenation op with axis 3, the channel dimension + auto newConcatOp = rewriter.create( + op.getLoc(), op.getOutput().getType(), conv2DOps, 3, "NONE"); + + rewriter.replaceOp(op, newConcatOp.getOutput()); + return success(); + } +}; + +template +Value createInputPadOp(int padDepthSize, T convOp, PatternRewriter &rewriter) { + RankedTensorType paddingsType = + RankedTensorType::get({4, 2}, rewriter.getI32Type()); + + // Pad the input depth + std::vector paddingsValues = {0, 0, 0, 0, 0, 0, 0, padDepthSize}; + Value paddings = rewriter.create( + convOp.getLoc(), DenseIntElementsAttr::get(paddingsType, paddingsValues)); + auto inputShape = + convOp.getInput().getType().template cast().getShape(); + + auto paddedInputResultType = RankedTensorType::get( + {inputShape[0], inputShape[1], inputShape[2], + inputShape[3] + padDepthSize}, + convOp.getInput().getType().template cast().getElementType()); + + // Set the PadOp output as the Conv2D input + Value padOpOutput = rewriter.create( + convOp.getLoc(), paddedInputResultType, convOp.getInput(), paddings); + return padOpOutput; +} + +Type getPaddedResultType(int padSize, std::initializer_list &shape, + TFL::QConstOp op, ShapedType opType) { + Type paddedResultType = RankedTensorType::get(shape, opType.getElementType()); + + auto opQType = op.getQtype().template cast(); + if (auto qType = opQType.getElementType() + .dyn_cast()) { + auto scaleVector = + std::vector{qType.getScales().begin(), qType.getScales().end()}; + llvm::SmallVector paddedScaleVector; + paddedScaleVector.reserve(scaleVector.size() + padSize); + paddedScaleVector.insert(paddedScaleVector.end(), scaleVector.begin(), + scaleVector.end()); + paddedScaleVector.insert(paddedScaleVector.end(), padSize, 1.0); + + auto zeroPointVector = std::vector{qType.getZeroPoints().begin(), + qType.getZeroPoints().end()}; + llvm::SmallVector paddedZeroPointVector; + paddedZeroPointVector.reserve(zeroPointVector.size() + padSize); + paddedZeroPointVector.insert(paddedZeroPointVector.end(), + zeroPointVector.begin(), + zeroPointVector.end()); + paddedZeroPointVector.insert(paddedZeroPointVector.end(), padSize, 0); + + auto newQType = quant::UniformQuantizedPerAxisType::getChecked( + op.getLoc(), qType.getFlags(), qType.getStorageType(), + qType.getExpressedType(), paddedScaleVector, paddedZeroPointVector, + qType.getQuantizedDimension(), qType.getStorageTypeMin(), + qType.getStorageTypeMax()); + + paddedResultType = newQType.castFromExpressedType( + quant::AnyQuantizedType::castToExpressedType(paddedResultType)); + } + + return paddedResultType; +} + +template +Value createPaddedFilterOp(int padSize, int padDim, T convOp, + PatternRewriter &rewriter) { + assert(padDim == 0 || padDim == 3 && "filter padDim must be 0 or 3!"); + + Value filterVal; + if (auto cOp = dyn_cast(convOp.getOperation())) { + filterVal = cOp.getWeights(); + } else if (auto cOp = dyn_cast(convOp.getOperation())) { + filterVal = cOp.getFilter(); + } else if (auto cOp = + dyn_cast(convOp.getOperation())) { + filterVal = cOp.getFilter(); + } else { + assert(false && "Shouldn't be here!"); + } + + auto filterQConstOp = dyn_cast(filterVal.getDefiningOp()); + auto filter = filterQConstOp.getValue().template cast(); + + auto filterVector = + std::vector{filter.template getValues().begin(), + filter.template getValues().end()}; + auto filterShape = + filterVal.getType().template cast().getShape(); + std::vector paddedShape(4, 0); + for (int i = 0; i < 4; i++) { + paddedShape[i] = filterShape[i]; + if (i == padDim) { + paddedShape[i] += padSize; + } + } + + llvm::SmallVector paddedFilterVector; + paddedFilterVector.reserve(paddedShape[0] * paddedShape[1] * paddedShape[2] * + paddedShape[3]); + + if (padDim == 3) { + // Pad the filter depth + for (int i = 0; i < filterVector.size(); i += filterShape[3]) { + paddedFilterVector.insert(paddedFilterVector.end(), + filterVector.begin() + i, + filterVector.begin() + i + filterShape[3]); + paddedFilterVector.insert(paddedFilterVector.end(), padSize, 0); + } + } else { + // Pad the filter batch + paddedFilterVector.insert(paddedFilterVector.end(), filterVector.begin(), + filterVector.end()); + paddedFilterVector.insert( + paddedFilterVector.end(), + padSize * paddedShape[1] * paddedShape[2] * paddedShape[3], 0); + } + + auto paddedFilterShape = {paddedShape[0], paddedShape[1], paddedShape[2], + paddedShape[3]}; + Type paddedFilterResultType; + if (convOp.GetQuantizationDimIndex() == padDim) { + // If the pad dimension is the quantization dimension, then might have + // to pad the quantization params + paddedFilterResultType = + getPaddedResultType(padSize, paddedFilterShape, filterQConstOp, + filterVal.getType().template cast()); + } else { + paddedFilterResultType = RankedTensorType::get( + paddedFilterShape, + filterVal.getType().template cast().getElementType()); + } + + RankedTensorType paddedFilterValueType = + RankedTensorType::get(paddedFilterShape, rewriter.getIntegerType(8)); + + // Create a new QConstOp with the padded data + Value paddedFilterOp = rewriter.create( + convOp.getLoc(), mlir::TypeAttr::get(paddedFilterResultType), + DenseElementsAttr::get(paddedFilterValueType, + paddedFilterVector)); + return paddedFilterOp; +} + +template +Value createPaddedBiasOp(int padSize, T convOp, PatternRewriter &rewriter) { + auto biasQConstOp = dyn_cast(convOp.getBias().getDefiningOp()); + auto bias = biasQConstOp.getValue().template cast(); + + std::vector biasVector; + DenseElementsAttr biasesAttr; + if (convOp.getBias() + .getType() + .template cast() + .getElementType() + .template isa()) { + auto biasQConstOp = + dyn_cast(convOp.getBias().getDefiningOp()); + biasesAttr = biasQConstOp.getValue().template cast(); + } else { + matchPattern(convOp.getBias(), m_Constant(&biasesAttr)); + } + biasVector = + std::vector{biasesAttr.template getValues().begin(), + biasesAttr.template getValues().end()}; + + auto biasShape = + convOp.getBias().getType().template cast().getShape(); + + llvm::SmallVector paddedBiasVector; + paddedBiasVector.reserve(biasShape[0] + padSize); + + // Pad the bias batch + paddedBiasVector.insert(paddedBiasVector.end(), biasVector.begin(), + biasVector.end()); + paddedBiasVector.insert(paddedBiasVector.end(), padSize, 0); + + auto paddedBiasShape = {biasShape[0] + padSize}; + auto paddedBiasResultType = getPaddedResultType( + padSize, paddedBiasShape, biasQConstOp, + convOp.getBias().getType().template cast()); + RankedTensorType paddedBiasValueType = + RankedTensorType::get(paddedBiasShape, rewriter.getIntegerType(32)); + + // Create a new QConstOp with the padded data + Value paddedBiasOp = rewriter.create( + convOp.getLoc(), mlir::TypeAttr::get(paddedBiasResultType), + DenseElementsAttr::get(paddedBiasValueType, paddedBiasVector)); + return paddedBiasOp; +} + +template +TFL::SliceOp +createPaddedConvWithSliceOp(int padSize, T convOp, Value paddedFilterOp, + Value paddedBiasOp, PatternRewriter &rewriter) { + auto outputShape = + convOp.getOutput().getType().template cast().getShape(); + auto convReplacement = llvm::cast(rewriter.clone(*convOp)); + + RankedTensorType newConvType = + RankedTensorType::get({outputShape[0], outputShape[1], outputShape[2], + outputShape[3] + padSize}, + convOp.getOutput() + .getType() + .template cast() + .getElementType()); + convReplacement->getResult(0).setType(newConvType); + convReplacement.setOperand(1, paddedFilterOp); + + // For Conv2D and DepthwiseConv2D, bias operand index is 2 + int biasOperandIndex = 2; + + // For TransposeConv, we have to update the output shape operand + if (auto cOp = + dyn_cast(convReplacement.getOperation())) { + DenseElementsAttr attr; + matchPattern(cOp.getOutputShape(), m_Constant(&attr)); + auto outputShape = std::vector{attr.getValues().begin(), + attr.getValues().end()}; + outputShape[3] = outputShape[3] + padSize; + auto outputShapeOp = rewriter.create( + cOp->getLoc(), cOp.getOutputShape().getType(), + DenseIntElementsAttr::get(cOp.getOutputShape().getType(), outputShape)); + cOp.setOperand(0, outputShapeOp); + // For TransposeConv, bias operand index is 3 + biasOperandIndex = 3; + } + + if (!convReplacement.getBias().getType().template isa()) { + convReplacement.setOperand(biasOperandIndex, paddedBiasOp); + } + + // Create slice op + int beginAttr[4] = {0, 0, 0, 0}; + auto beginConstantOp = rewriter.create( + convReplacement.getLoc(), rewriter.getI32TensorAttr(beginAttr)); + + int sizeAttr[4] = {1, static_cast(outputShape[1]) - beginAttr[1], + static_cast(outputShape[2]) - beginAttr[2], + static_cast(outputShape[3]) - beginAttr[3]}; + auto sizeConstantOp = rewriter.create( + convReplacement.getLoc(), rewriter.getI32TensorAttr(sizeAttr)); + + auto sliceOp = rewriter.create( + convOp.getLoc(), convOp.getOutput().getType(), convReplacement, + beginConstantOp, sizeConstantOp); + return sliceOp; +} + +struct SameToValidTransposeConvPattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::TransposeConvOp tConvOp, + PatternRewriter &rewriter) const override { + // Check for invalid types and return + // Input type must be QI8 + auto inputElementType = + tConvOp.getInput().getType().cast().getElementType(); + if (!utils::isNBitSignedQType<8>(inputElementType) && + !utils::isNBitSignedQType<16>(inputElementType)) { + return failure(); + } + + auto filterElementType = + tConvOp.getWeights().getType().cast().getElementType(); + if (!utils::isNBitSignedQType<8>(filterElementType) && + !utils::isNBitSignedQType<16>(filterElementType)) { + return failure(); + } + + if (tConvOp.getPadding() != "SAME") { + return failure(); + } + + tConvOp.setPadding("VALID"); + auto tConvReplacement = + llvm::cast(rewriter.clone(*tConvOp)); + + // Calculate Transpose conv VALID output size + auto inputShape = + tConvOp.getInput().getType().cast().getShape(); + auto weightsShape = + tConvOp.getWeights().getType().cast().getShape(); + auto validHeight = + (inputShape[1] - 1) * tConvOp.getStrideH() + weightsShape[1]; + auto validWidth = + (inputShape[2] - 1) * tConvOp.getStrideW() + weightsShape[2]; + + auto outputShape = + tConvOp.getOutput().getType().cast().getShape(); + int newOutputShapeAttr[4] = { + static_cast(outputShape[0]), static_cast(validHeight), + static_cast(validWidth), static_cast(outputShape[3])}; + + auto outputShapeConstantOp = rewriter.create( + tConvReplacement.getLoc(), + rewriter.getI32TensorAttr(newOutputShapeAttr)); + tConvReplacement->setOperand(0, outputShapeConstantOp); + + RankedTensorType newtConvType = RankedTensorType::get( + {outputShape[0], validHeight, validWidth, outputShape[3]}, + tConvOp.getOutput().getType().cast().getElementType()); + tConvReplacement->getResult(0).setType(newtConvType); + + int sliceHeight = weightsShape[1] - tConvOp.getStrideH(); + int sliceWidth = weightsShape[2] - tConvOp.getStrideW(); + if (sliceHeight == 0 && sliceWidth == 0) { + rewriter.replaceOp(tConvOp, tConvReplacement->getResult(0)); + return success(); + } + int sliceHeightLeft = sliceHeight / 2; + int sliceWidthLeft = sliceWidth / 2; + int beginAttr[4] = {0, sliceHeightLeft, sliceWidthLeft, 0}; + int sizeAttr[4] = {static_cast(1), + static_cast(outputShape[1]), + static_cast(outputShape[2]), + static_cast(outputShape[3])}; + // create slice op + + auto beginConstantOp = rewriter.create( + tConvReplacement.getLoc(), rewriter.getI32TensorAttr(beginAttr)); + + auto sizeConstantOp = rewriter.create( + tConvReplacement.getLoc(), rewriter.getI32TensorAttr(sizeAttr)); + + auto sliceOp = rewriter.create( + tConvOp.getLoc(), tConvOp.getOutput().getType(), tConvReplacement, + beginConstantOp, sizeConstantOp); + + // Replace op with slice op + rewriter.replaceOp(tConvOp, sliceOp.getOutput()); + + return success(); + } +}; + +template +struct PadConv2DInputPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(Conv2DOp conv2DOp, + PatternRewriter &rewriter) const override { + // For Conv2D, input operand index is 0 + // Strangely, for TransposeConv, input operand index is 2 + int inputOperandIndex = 0; + + // Check for invalid types and return + // Input type must be QI8 or QI16 + auto inputElementType = conv2DOp.getInput() + .getType() + .template cast() + .getElementType(); + if (!utils::isNBitSignedQType<8>(inputElementType) && + !utils::isNBitSignedQType<16>(inputElementType)) { + return failure(); + } + + // Filter type must be QI8 + Value filterVal; + if (auto convOp = dyn_cast(conv2DOp.getOperation())) { + filterVal = convOp.getWeights(); + inputOperandIndex = 2; + } else if (auto convOp = dyn_cast(conv2DOp.getOperation())) { + filterVal = convOp.getFilter(); + } else { + return failure(); + } + auto filterElementType = + filterVal.getType().template cast().getElementType(); + if (!utils::isNBitSignedQType<8>(filterElementType)) { + return failure(); + } + + // If bias exists, it must be QI32 + if (auto biasType = + conv2DOp.getBias().getType().template dyn_cast()) { + if (!utils::isNBitSignedQType<32>(biasType.getElementType())) + return failure(); + } + + // Output type must be QI8 or QI16 + auto outputElementType = conv2DOp.getOutput() + .getType() + .template cast() + .getElementType(); + if (!utils::isNBitSignedQType<8>(outputElementType) && + !utils::isNBitSignedQType<16>(outputElementType)) { + return failure(); + } + bool i16Conv = false; + if (inputElementType.template cast() + .getStorageTypeIntegralWidth() == 16 && + outputElementType.template cast() + .getStorageTypeIntegralWidth() == 16) { + i16Conv = true; + } + + // Align depth up to multiple of four for int8 and sixteen for int16 + auto inputDepth = + conv2DOp.getInput().getType().template cast().getDimSize(3); + int alignedDepth = i16Conv ? 16 : 4; + int padDepthSize = + (((inputDepth + alignedDepth - 1) / alignedDepth) * alignedDepth) - + inputDepth; + + if (padDepthSize == 0) { + return failure(); + } + + // Pad the Conv2D input + Value padOpOutput = createInputPadOp(padDepthSize, conv2DOp, rewriter); + conv2DOp.setOperand(inputOperandIndex, padOpOutput); + + // Pad the Conv2D filter + // We need to do this at compile time instead of using a PadOp + // as we use the padded filter values for the boggling calculations + // for creating the XC Conv2D ops + Value paddedQConstOpOutput = + createPaddedFilterOp(padDepthSize, /*padDim=*/3, conv2DOp, rewriter); + // Set the QConstOp output as the Conv2D filter + conv2DOp.setOperand(1, paddedQConstOpOutput); + + return success(); + } +}; + +template +struct PadConv2DOutputPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(Conv2DOp conv2DOp, + PatternRewriter &rewriter) const override { + // Check for invalid types and return + // Input type must be QI8 or QI16 + auto inputElementType = conv2DOp.getInput() + .getType() + .template cast() + .getElementType(); + if (!utils::isNBitSignedQType<8>(inputElementType) && + !utils::isNBitSignedQType<16>(inputElementType)) { + return failure(); + } + + // Filter type must be QI8 + Value filterVal; + if (auto convOp = dyn_cast(conv2DOp.getOperation())) { + filterVal = convOp.getWeights(); + } else if (auto convOp = dyn_cast(conv2DOp.getOperation())) { + filterVal = convOp.getFilter(); + } else { + return failure(); + } + auto filterElementType = + filterVal.getType().template cast().getElementType(); + if (!utils::isNBitSignedQType<8>(filterElementType)) { + return failure(); + } + + // If bias exists, it must be QI32 + if (auto biasType = + conv2DOp.getBias().getType().template dyn_cast()) { + if (!utils::isNBitSignedQType<32>(biasType.getElementType())) + return failure(); + } + + // Output type must be QI8 or QI16 + auto outputElementType = conv2DOp.getOutput() + .getType() + .template cast() + .getElementType(); + if (!utils::isNBitSignedQType<8>(outputElementType) && + !utils::isNBitSignedQType<16>(outputElementType)) { + return failure(); + } + bool i16Conv = false; + if (inputElementType.template cast() + .getStorageTypeIntegralWidth() == 16 && + outputElementType.template cast() + .getStorageTypeIntegralWidth() == 16) { + i16Conv = true; + } + + // Align depth up to multiple of four for int8 and sixteen for int16 + auto outputShape = conv2DOp.getOutput() + .getType() + .template cast() + .getShape(); + int alignedDepth = i16Conv ? 16 : 4; + int padSize = + (((outputShape[3] + alignedDepth - 1) / alignedDepth) * alignedDepth) - + outputShape[3]; + + if (padSize == 0) { + return failure(); + } + + // Pad the Conv2D filter + // We need to do this at compile time instead of using a PadOp + // as we use the padded filter values for the boggling calculations + // for creating the XC Conv2D ops + Value paddedFilterOp = + createPaddedFilterOp(padSize, /*padDim=*/0, conv2DOp, rewriter); + Value paddedBiasOp; + if (!conv2DOp.getBias().getType().template isa()) { + paddedBiasOp = createPaddedBiasOp(padSize, conv2DOp, rewriter); + } + + // Create conv op with padded output size and Slice to slice the + // padded output + auto sliceOp = createPaddedConvWithSliceOp( + padSize, conv2DOp, paddedFilterOp, paddedBiasOp, rewriter); + + // Replace op with slice op + rewriter.replaceOp(conv2DOp, sliceOp.getOutput()); + + return success(); + } +}; + +struct PadTo4DepthwiseConv2DPattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::DepthwiseConv2DOp dConv2DOp, + PatternRewriter &rewriter) const override { + // Check for invalid types and return + // Input type must be QI8 + auto inputElementType = + dConv2DOp.getInput().getType().cast().getElementType(); + if (!utils::isNBitSignedQType<8>(inputElementType)) { + return failure(); + } + + // Filter type must be + auto filterElementType = + dConv2DOp.getFilter().getType().cast().getElementType(); + if (!utils::isNBitSignedQType<8>(filterElementType)) { + return failure(); + } + + // If bias exists, it must be QI32 + if (auto biasType = + dConv2DOp.getBias().getType().template dyn_cast()) { + if (!utils::isNBitSignedQType<32>(biasType.getElementType())) + return failure(); + } + + // Align depth up to multiple of four + auto inputDepth = + dConv2DOp.getInput().getType().cast().getDimSize(3); + auto outputShape = dConv2DOp.getOutput() + .getType() + .template cast() + .getShape(); + if (inputDepth != outputShape[3]) { + return failure(); + } + int padSize = (((inputDepth + 3) / 4) * 4) - inputDepth; + + if (padSize == 0) { + return failure(); + } + + // Pad the dConv2D input + Value padOpOutput = createInputPadOp(padSize, dConv2DOp, rewriter); + dConv2DOp.setOperand(0, padOpOutput); + + // Pad the dConv2D filter + Value paddedFilterOp = + createPaddedFilterOp(padSize, /*padDim=*/3, dConv2DOp, rewriter); + Value paddedBiasOp; + if (!dConv2DOp.getBias().getType().template isa()) { + paddedBiasOp = createPaddedBiasOp(padSize, dConv2DOp, rewriter); + } + + // Create conv op with padded output size and slice to slice the + // padded output + auto sliceOp = createPaddedConvWithSliceOp( + padSize, dConv2DOp, paddedFilterOp, paddedBiasOp, rewriter); + + // Replace op with slice op + rewriter.replaceOp(dConv2DOp, sliceOp.getOutput()); + + return success(); + } +}; + +void OptimizeConv2D::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + RewritePatternSet patterns(ctx); + // Convert TransposeConv2D with SAME padding to VALID padding + slice + patterns.insert(ctx); + + // For int8, we pad to 4 channels + // For int16, we pad to 16 channels + // To align Conv2D input, we insert a pad op to pad the input + // channels and pad the conv filter channels + patterns.insert>(ctx); + patterns.insert>(ctx); + // For int8, we pad to 4 channels + // For int16, we pad to 16 channels + // To align Conv2D output, we pad the conv filter batch and + // bias, pad conv2d output channels, and add a slice to remove the + // padded section + patterns.insert>(ctx); + patterns.insert>(ctx); + // For DepthwiseConv2D, input and output channels are the same. + // To align DepthwiseConv2D input/output to 4 channels, we insert a pad op to + // pad the input channels, pad the conv filter channels and bias, pad + // conv2d output channels, and add a slice to remove the padded + // section + patterns.insert(ctx); + FrozenRewritePatternSet frozenPatterns(std::move(patterns)); + (void)applyPatternsAndFoldGreedily(func, frozenPatterns); + + // We apply channelwise splitting after padding. + RewritePatternSet patterns2(ctx); + // When the filter is too large, we channelwise split the conv2d output to + // make multiple conv2ds so that the filter for each can be loaded separately. + // This means the filter batch gets split. We also have to split the + // quantization params. + patterns2.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns2)); + + // We apply padding once after channelwise splitting if there are some convs + // that are left unoptimized + (void)applyPatternsAndFoldGreedily(func, frozenPatterns); +} +} // namespace + +// Creates an instance of the OptimizeConv2D pass. +std::unique_ptr> createOptimizeConv2DPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/OptimizeTranspose.cpp b/xformer/Transforms/OptimizeTranspose.cpp new file mode 100644 index 000000000..aa52ed7f5 --- /dev/null +++ b/xformer/Transforms/OptimizeTranspose.cpp @@ -0,0 +1,732 @@ +// Copyright 2023 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Transforms/Options.h" + +#include "Utils/Util.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" +#include "tensorflow/compiler/mlir/tensorflow/ir/tf_ops_layout_helper.h" + +namespace mlir::xcore { + +namespace { +// Optimize TFL Transpose. +struct OptimizeTranspose + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(OptimizeTranspose) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-optimize-transpose"; } + StringRef getDescription() const final { return "Optimize TFL Transpose."; } + void runOnOperation() override; +}; + +static SmallVector +computeInversePermutation(const SmallVector &permVec) { + SmallVector invPermVec(permVec.size()); + for (size_t i = 0; i < permVec.size(); ++i) { + invPermVec[permVec[i]] = i; + } + return invPermVec; +} + +struct FoldTrReFCPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::FullyConnectedOp fcOp, + PatternRewriter &rewriter) const override { + // Match the pattern: transpose -> reshape -> fully_connected + + // Check that the input to fully_connected is a reshape + auto reshapeOp = fcOp.getInput().getDefiningOp(); + if (!reshapeOp || !reshapeOp->hasOneUse()) + return failure(); + + // Check that the input to reshape is a transpose + auto transposeOp = reshapeOp.getInput().getDefiningOp(); + if (!transposeOp || !transposeOp->hasOneUse()) + return failure(); + + // Ensure that the fully_connected op has a single use + if (!fcOp->hasOneUse()) + return failure(); + + // Get permutation attribute from transpose + DenseIntElementsAttr permAttr; + if (!matchPattern(transposeOp.getPerm(), m_Constant(&permAttr))) + return failure(); + + SmallVector permVec = utils::denseToVector(permAttr); + + // Compute inverse permutation vector + SmallVector invPermVec = computeInversePermutation(permVec); + + // Get input shape + auto reshapeInputType = + reshapeOp.getInput().getType().dyn_cast(); + if (!reshapeInputType) + return failure(); + + // Transpose the filter weights + Value filter = fcOp.getFilter(); + Value bias = fcOp.getBias(); + + { + // Get filter type and shape + auto filterType = filter.getType().dyn_cast(); + if (!filterType) + return failure(); + + auto filterShape = filterType.getShape(); + SmallVector filterShapeVec(filterShape.begin(), + filterShape.end()); + + int64_t outputSize = filterShapeVec[0]; + + // Reshape the filter to reshapeInputShape[1:] + [outputSize] + auto reshapeInputShape = reshapeInputType.getShape(); + SmallVector reshapedFilterShapeVec( + reshapeInputShape.begin() + 1, reshapeInputShape.end()); + reshapedFilterShapeVec.push_back(outputSize); + + // Prepare permutation vector for the filter (excluding batch dimension) + SmallVector filterPermVec; + for (size_t i = 1; i < invPermVec.size(); ++i) { + filterPermVec.push_back(invPermVec[i] - 1); + } + filterPermVec.push_back(invPermVec.size() - 1); + + Value finalFilter; + if (failed(utils::reshapeTransposeReshape( + rewriter, filter, reshapedFilterShapeVec, filterPermVec, + filterShapeVec, finalFilter))) { + llvm::outs() << "Failed to reshape filter\n"; + return failure(); + } + + filter = finalFilter; + } + + // Bias remains the same; no need to adjust it + + // Create new reshape op (from transpose's input to reshape's output) + Value newInput = transposeOp.getInput(); + + auto newReshapeOp = rewriter.create( + reshapeOp.getLoc(), reshapeOp.getResult().getType(), newInput, + reshapeOp.getShape()); + + // Create new fully_connected op with adjusted filter + auto newFullyConnectedOp = rewriter.create( + fcOp.getLoc(), fcOp.getResult(0).getType(), newReshapeOp.getResult(), + filter, bias, fcOp.getFusedActivationFunctionAttr(), + fcOp.getWeightsFormatAttr(), fcOp.getKeepNumDimsAttr(), + fcOp.getAsymmetricQuantizeInputsAttr()); + + // Replace the original fully_connected op with the new one + rewriter.replaceOp(fcOp, newFullyConnectedOp.getResults()); + + // Erase the old reshape and transpose ops if they are no longer used + if (reshapeOp.use_empty()) + rewriter.eraseOp(reshapeOp); + if (transposeOp.use_empty()) + rewriter.eraseOp(transposeOp); + + return success(); + } +}; + +struct FoldDoubleTransposePattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + LogicalResult matchAndRewrite(TFL::TransposeOp transposeOp, + PatternRewriter &rewriter) const override { + // Ensure the TransposeOp has a single use + if (!transposeOp->hasOneUse()) + return failure(); + // Check if the user operation is a transpose op + Operation *userOp = *transposeOp->getUsers().begin(); + auto userTransposeOp = dyn_cast(userOp); + if (!userTransposeOp) + return failure(); + // Get the permutation used in the transposes + DenseIntElementsAttr perm0; + DenseIntElementsAttr perm1; + if (!matchPattern(transposeOp.getPerm(), m_Constant(&perm0)) || + !matchPattern(userTransposeOp.getPerm(), m_Constant(&perm1))) + return failure(); + + SmallVector permVec; + for (auto val : perm1.getValues()) { + permVec.push_back(perm0.getValues()[val]); + } + // Create perm constant op + auto permType = RankedTensorType::get( + {static_cast(permVec.size())}, rewriter.getIntegerType(32)); + + auto permAttr = DenseIntElementsAttr::get(permType, permVec); + auto permConstOp = + rewriter.create(transposeOp.getLoc(), permType, permAttr); + + // Create new transposeOp + auto newTransposeOp = rewriter.create( + transposeOp.getLoc(), userTransposeOp.getType(), transposeOp.getInput(), + permConstOp.getResult()); + + rewriter.replaceOp(userOp, newTransposeOp.getResult()); + rewriter.eraseOp(transposeOp); + return success(); + } +}; + +// Replace TransposeOp with ReshapeOp if equivalent +// Transpose is equivalent to reshape if we only permute consecutive dimensions +// and only one of those permuted dimensions isn't of size 1 +struct FoldTransposeToReshapePattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + LogicalResult matchAndRewrite(TFL::TransposeOp transposeOp, + PatternRewriter &rewriter) const override { + DenseIntElementsAttr perm; + if (!matchPattern(transposeOp.getPerm(), m_Constant(&perm))) + return failure(); + + SmallVector permVec; + for (auto val : perm.getValues()) { + permVec.push_back(val); + } + // get input shape + auto inputType = + transposeOp.getInput().getType().dyn_cast(); + if (!inputType) + return failure(); + ArrayRef inputShape = inputType.getShape(); + for (size_t i = 0; i < permVec.size(); ++i) { + if (permVec[i] == i) + continue; + // check if all shapes between i and permVec[i] are 1, except for at most + // one + int s = permVec[i] < i ? permVec[i] : i; + int e = permVec[i] < i ? i : permVec[i]; + bool foundNonOne = false; + for (size_t j = s; j <= e; ++j) { + if (inputShape[j] != 1) { + if (foundNonOne) + return failure(); + foundNonOne = true; + } + } + } + // get output shape + auto outputType = + transposeOp.getResult().getType().dyn_cast(); + // convert to small vector + SmallVector outputShape; + for (auto val : outputType.getShape()) { + outputShape.push_back(val); + } + // Create new shape constant op + auto newShapeConstOp = + utils::createShapeConstOp(rewriter, transposeOp.getLoc(), outputShape); + // assume transpose can be replaced with reshape + auto reshapeOp = rewriter.create( + transposeOp.getLoc(), transposeOp.getType(), transposeOp.getInput(), + newShapeConstOp); + + rewriter.replaceOp(transposeOp, reshapeOp.getResult()); + return success(); + } +}; + +struct FoldFCReTrPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::TransposeOp transposeOp, + PatternRewriter &rewriter) const override { + // Match the pattern: fully_connected -> reshape -> transpose + auto reshapeOp = transposeOp.getInput().getDefiningOp(); + if (!reshapeOp || !reshapeOp->hasOneUse()) + return failure(); + + auto fullyConnectedOp = + reshapeOp.getInput().getDefiningOp(); + if (!fullyConnectedOp || !fullyConnectedOp->hasOneUse()) + return failure(); + + // Get types and shapes + auto fcInputType = + fullyConnectedOp.getInput().getType().dyn_cast(); + auto fcOutputType = + fullyConnectedOp.getResult(0).getType().dyn_cast(); + auto reshapeOutputType = + reshapeOp.getResult().getType().dyn_cast(); + auto transposeOutputType = + transposeOp.getResult().getType().dyn_cast(); + + if (!fcInputType || !fcOutputType || !reshapeOutputType || + !transposeOutputType) + return failure(); + + // Check if the batch dimension (assumed to be dimension 0) remains + // unchanged + auto fcOutputShape = fcOutputType.getShape(); + auto reshapeOutputShape = reshapeOutputType.getShape(); + auto transposeOutputShape = transposeOutputType.getShape(); + + if (fcOutputShape.empty() || reshapeOutputShape.empty()) + return failure(); // Expecting non-scalar tensors + + if (fcOutputShape[0] != reshapeOutputShape[0]) + return failure(); // Batch dimension changed in reshape + + // Get permutation attribute from transpose + DenseIntElementsAttr permAttr; + if (!matchPattern(transposeOp.getPerm(), m_Constant(&permAttr))) + return failure(); + + SmallVector permVec = utils::denseToVector(permAttr); + + // Compute inverse permutation vector + SmallVector invPermVec = computeInversePermutation(permVec); + + // Check if batch dimension remains at position 0 after transpose + if (invPermVec.empty() || invPermVec[0] != 0) + return failure(); + + // Prepare to transform the filter and bias + Value filter = fullyConnectedOp.getFilter(); + Value bias = fullyConnectedOp.getBias(); + + // Process bias + { + // Get bias type and shape + auto biasType = bias.getType().dyn_cast(); + if (!biasType) + return failure(); + auto biasShape = biasType.getShape(); + SmallVector biasShapeVec(biasShape.begin(), biasShape.end()); + + // Use transpose output shape as reshape shape for bias + SmallVector transposeOutputShapeVec( + transposeOutputShape.begin(), transposeOutputShape.end()); + + Value finalBias; + if (failed(utils::reshapeTransposeReshape( + rewriter, bias, transposeOutputShapeVec, invPermVec, biasShapeVec, + finalBias))) + return failure(); + + bias = finalBias; + } + + // Process filter + { + // Get filter type and shape + auto filterType = filter.getType().dyn_cast(); + if (!filterType) + return failure(); + + auto filterShape = filterType.getShape(); + SmallVector filterShapeVec(filterShape.begin(), + filterShape.end()); + + // Compute new filter reshape shape + SmallVector filterOutShapeVec = {filterShape[1]}; + filterOutShapeVec.insert(filterOutShapeVec.end(), + transposeOutputShape.begin() + 1, + transposeOutputShape.end()); + + Value finalFilter; + if (failed(utils::reshapeTransposeReshape(rewriter, filter, + filterOutShapeVec, invPermVec, + filterShapeVec, finalFilter))) + return failure(); + + filter = finalFilter; + } + + // Create new fully connected op with adjusted filter and bias + auto newFullyConnectedOp = rewriter.create( + fullyConnectedOp.getLoc(), fcOutputType, fullyConnectedOp.getInput(), + filter, bias, fullyConnectedOp.getFusedActivationFunctionAttr(), + fullyConnectedOp.getWeightsFormatAttr(), + fullyConnectedOp.getKeepNumDimsAttr(), + fullyConnectedOp.getAsymmetricQuantizeInputsAttr()); + + // Create new reshape op with the output type of the original transpose op + SmallVector originalShapeVec(transposeOutputShape.begin(), + transposeOutputShape.end()); + Value newShapeConstOp = utils::createShapeConstOp( + rewriter, transposeOp.getLoc(), originalShapeVec); + + // Create new reshape op + auto newReshapeOp = rewriter.create( + reshapeOp.getLoc(), transposeOutputType, + newFullyConnectedOp.getResult(0), newShapeConstOp); + + // Replace the original transpose op with the new reshape op + rewriter.replaceOp(transposeOp, newReshapeOp.getResult()); + + return success(); + } +}; + +struct MoveTransposeForwardOverUnaryOpPattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::TransposeOp transposeOp, + PatternRewriter &rewriter) const override { + // Ensure the TransposeOp has a single use + if (!transposeOp->hasOneUse()) + return failure(); + + Operation *userOp = *transposeOp->getUsers().begin(); + + // Check if the user operation is a unary op that can commute with + // transpose + if (!isa(userOp)) + return failure(); + + // Get the types of the input and output tensors + auto transposeInputType = + transposeOp.getInput().getType().dyn_cast(); + auto transposeOutputType = + transposeOp.getType().dyn_cast(); + if (!transposeInputType || !transposeOutputType) + return failure(); + + // Get the permutation used in the transpose + Value perm = transposeOp.getPerm(); + + Value newUnaryOpResult; + auto loc = userOp->getLoc(); + auto input = transposeOp.getInput(); + + // Retrieve the original unary operation's output type + auto originalUnaryOutputType = + userOp->getResult(0).getType().dyn_cast(); + if (!originalUnaryOutputType) + return failure(); + + // Create a new output type for the unary op with the same shape as + // 'input' and the same element type as the original output type + auto newUnaryOutputType = RankedTensorType::get( + transposeInputType.getShape(), originalUnaryOutputType.getElementType(), + originalUnaryOutputType.getEncoding()); + + if (auto quantizeOp = dyn_cast(userOp)) { + // For QuantizeOp, create new QuantizeOp with input as 'input' and + // output type adjusted + + // Create new QuantizeOp with adjusted output type + newUnaryOpResult = rewriter.create( + loc, newUnaryOutputType, input, quantizeOp.getQtypeAttr()); + + } else if (auto absOp = dyn_cast(userOp)) { + newUnaryOpResult = + rewriter.create(loc, newUnaryOutputType, input); + } else if (auto negOp = dyn_cast(userOp)) { + newUnaryOpResult = + rewriter.create(loc, newUnaryOutputType, input); + } else if (auto reluOp = dyn_cast(userOp)) { + newUnaryOpResult = + rewriter.create(loc, newUnaryOutputType, input); + } else if (auto relu6Op = dyn_cast(userOp)) { + newUnaryOpResult = + rewriter.create(loc, newUnaryOutputType, input); + } else if (auto leakyReluOp = dyn_cast(userOp)) { + newUnaryOpResult = rewriter.create( + loc, newUnaryOutputType, input, leakyReluOp.getAlphaAttr()); + } else if (auto tanhOp = dyn_cast(userOp)) { + newUnaryOpResult = + rewriter.create(loc, newUnaryOutputType, input); + } else if (auto logisticOp = dyn_cast(userOp)) { + newUnaryOpResult = + rewriter.create(loc, newUnaryOutputType, input); + } else { + // This should not happen as we checked the op type earlier + return failure(); + } + + // Create a new Transpose operation after the unary operation + auto newTransposeOp = rewriter.create( + transposeOp.getLoc(), originalUnaryOutputType, newUnaryOpResult, perm); + + // Replace the original user operation's result with the new transpose + // result + rewriter.replaceOp(userOp, newTransposeOp.getResult()); + + // Remove the original TransposeOp + rewriter.eraseOp(transposeOp); + + return success(); + } +}; + +struct MoveTransposeForwardOverConcatOpPattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::ConcatenationOp concatOp, + PatternRewriter &rewriter) const override { + // Get all input operands + auto inputs = concatOp.getValues(); + + // Check that all inputs are TransposeOps with the same permutation + SmallVector newInputs; + DenseIntElementsAttr commonPermAttr; + for (auto input : inputs) { + auto transposeOp = input.getDefiningOp(); + if (!transposeOp) + return failure(); + + // Get permutation attribute + DenseIntElementsAttr permAttr; + if (!matchPattern(transposeOp.getPerm(), m_Constant(&permAttr))) + return failure(); + + // Check if the permutation is the same as others + if (commonPermAttr) { + if (permAttr != commonPermAttr) + return failure(); + } else { + commonPermAttr = permAttr; + } + + // Collect the inputs to the transpose ops + newInputs.push_back(transposeOp.getInput()); + } + + // Get the permutation vector + SmallVector permVec; + for (auto val : commonPermAttr.getValues()) { + permVec.push_back(val); + } + + // Compute the inverse permutation + SmallVector invPerm(permVec.size()); + for (size_t i = 0; i < permVec.size(); ++i) { + invPerm[permVec[i]] = i; + } + + // Adjust the axis according to the inverse permutation + int32_t oldAxis = concatOp.getAxis(); + int64_t rank = permVec.size(); + if (oldAxis < 0) { + oldAxis += rank; + } + if (oldAxis < 0 || oldAxis >= rank) { + return failure(); // Invalid axis + } + int32_t newAxis = permVec[oldAxis]; + + // Collect input types and compute the new result type + SmallVector inputTypes; + for (auto input : newInputs) { + auto inputType = input.getType().dyn_cast(); + if (!inputType) { + return failure(); + } + inputTypes.push_back(inputType); + } + + // Ensure all input types have the same rank + for (auto type : inputTypes) { + if (type.getRank() != rank) { + return failure(); + } + } + + // Compute the shape of the concatenated tensor + SmallVector resultShape(inputTypes[0].getShape().begin(), + inputTypes[0].getShape().end()); + for (size_t i = 1; i < inputTypes.size(); ++i) { + auto shape = inputTypes[i].getShape(); + resultShape[newAxis] += shape[newAxis]; + } + + // Create the new ConcatenationOp with the correct result type and axis + auto elementType = inputTypes[0].getElementType(); + auto newConcatType = RankedTensorType::get(resultShape, elementType); + auto newConcatOp = rewriter.create( + concatOp.getLoc(), newConcatType, newInputs, + rewriter.getI32IntegerAttr(newAxis), + concatOp.getFusedActivationFunctionAttr()); + + // Create the permutation constant with correct data types + auto permType = RankedTensorType::get( + {static_cast(permVec.size())}, rewriter.getIntegerType(32)); + auto permAttr = DenseIntElementsAttr::get(permType, permVec); + auto permConstOp = + rewriter.create(concatOp.getLoc(), permType, permAttr); + + // Create the new TransposeOp with the original output type + auto newTransposeOp = rewriter.create( + concatOp.getLoc(), concatOp.getType(), newConcatOp.getResult(), + permConstOp.getResult()); + + rewriter.replaceOp(concatOp, newTransposeOp.getResult()); + return success(); + } +}; + +struct HoistTransposeWCHAbovePadPattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::TransposeOp op, + PatternRewriter &rewriter) const override { + + // Check for invalid types and return + // Defining op must be pad + auto padOp = dyn_cast_or_null(op.getInput().getDefiningOp()); + if (!padOp) { + return failure(); + } + + // Get transpose permutation + DenseIntElementsAttr perm; + if (!matchPattern(op.getPerm(), m_Constant(&perm))) { + return failure(); + } + + // Confirm transpose permutation is 0,2,3,1 i.e., NWCH + // Remnants of Pytorch to TFlite conversion + auto permVal = perm.getValues(); + if (perm.size() != 4 || permVal[0] != 0 || permVal[1] != 2 || + permVal[2] != 3 || permVal[3] != 1) { + return failure(); + } + + // Get padding val + DenseIntElementsAttr pad; + if (!matchPattern(padOp.getPadding(), m_Constant(&pad))) { + return failure(); + } + + // Confirm padding is only in last two dimensions + auto padVal = pad.getValues(); + if (padVal[{0, 0}] != 0 || padVal[{0, 1}] != 0 || padVal[{1, 0}] != 0 || + padVal[{1, 1}] != 0 || padVal[{2, 0}] != 1 || padVal[{2, 1}] != 1 || + padVal[{3, 0}] != 1 || padVal[{3, 1}] != 1) { + return failure(); + } + + // Create new TransposeOp + auto padInputShape = + padOp.getInput().getType().cast().getShape(); + auto tranposeResultType = RankedTensorType::get( + {padInputShape[0], padInputShape[2], padInputShape[3], + padInputShape[1]}, + padOp.getInput().getType().cast().getElementType()); + auto newTranspose = rewriter.create( + padOp.getLoc(), tranposeResultType, padOp.getInput(), op.getPerm()); + + // Create new padding attr with spatial dimensions + std::vector paddingValues{0, 0, 1, 1, 1, 1, 0, 0}; + auto paddingAttr = DenseIntElementsAttr::get( + RankedTensorType::get({4, 2}, rewriter.getI32Type()), paddingValues); + auto paddingOp = rewriter.create( + padOp->getLoc(), RankedTensorType::get({4, 2}, rewriter.getI32Type()), + paddingAttr); + auto newPad = rewriter.create( + padOp.getLoc(), op.getOutput().getType(), newTranspose, paddingOp); + + rewriter.replaceOp(op, newPad.getOutput()); + return success(); + } +}; + +struct FoldTransposeWCHToInput : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::TransposeOp op, + PatternRewriter &rewriter) const override { + + // Check for invalid types and return + // Get transpose permutation + DenseIntElementsAttr perm; + if (!matchPattern(op.getPerm(), m_Constant(&perm))) { + return failure(); + } + + // Confirm transpose permutation is 0,2,3,1 i.e., NWCH + // Remnants of Pytorch to TFlite conversion + auto permVal = perm.getValues(); + if (perm.size() != 4 || permVal[0] != 0 || permVal[1] != 2 || + permVal[2] != 3 || permVal[3] != 1) { + return failure(); + } + + // If input to the transpose is block arg, and block arg has only one use, + // we can fold the transpose + if (auto blockArg = op.getInput().dyn_cast()) { + if (blockArg.hasOneUse()) { + auto funcOp = cast(blockArg.getOwner()->getParentOp()); + + // Set function type to the transpose output type as we are changing + // the input + FunctionType funcType = funcOp.getFunctionType(); + llvm::SmallVector newInputTypes(funcType.getInputs().begin(), + funcType.getInputs().end()); + newInputTypes[blockArg.getArgNumber()] = op.getOutput().getType(); + auto newFuncType = FunctionType::get( + rewriter.getContext(), newInputTypes, funcOp.getResultTypes()); + funcOp.setType(newFuncType); + + // Set block arg type to the transpose output type + blockArg.setType(op.getOutput().getType()); + + // Remove transpose + rewriter.replaceOp(op, op.getInput()); + } + } + + return success(); + } +}; + +void OptimizeTranspose::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + + // Try to merge transpose -> ops -> inverse transpose + RewritePatternSet mergePatterns(ctx); + mergePatterns + .insert(ctx); + if (mergeTransposeOption) { + (void)applyPatternsAndFoldGreedily(func, std::move(mergePatterns)); + } + + // Other transpose optimizations + RewritePatternSet patterns(ctx); + + patterns.insert(ctx); + patterns.insert(ctx); + patterns.insert(ctx); + // TODO - enable after transpose permutation fix + // patterns.insert(ctx); + // patterns.insert(ctx); + if (allowInputModificationOption) { + patterns.insert(ctx); + } + + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the OptimizeTranspose pass. +std::unique_ptr> createOptimizeTransposePass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/Options.h b/xformer/Transforms/Options.h new file mode 100644 index 000000000..1cd9933bc --- /dev/null +++ b/xformer/Transforms/Options.h @@ -0,0 +1,50 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#ifndef XFORMER_TRANSFORMS_OPTIONS_H +#define XFORMER_TRANSFORMS_OPTIONS_H + +#include "llvm/Support/CommandLine.h" + +namespace mlir { +namespace xcore { + +enum TargetArch { + XS3A, + VX4A, +}; + +extern llvm::cl::opt quadraticLookupErrorOption; +extern llvm::cl::opt enableBetaFloatOption; +extern llvm::cl::opt threadCountOption; +extern llvm::cl::opt weightsFilenameOption; +extern llvm::cl::opt loadExternallyIfLargerOption; +extern llvm::cl::opt weightsAsArrayOption; +extern llvm::cl::opt asyncLoadWeightsOption; +extern llvm::cl::opt weightsInExternalMemory; +extern llvm::cl::opt maxLoadExternalSizeOption; +extern llvm::cl::opt convQuantErrorThresholdOption; +extern llvm::cl::opt convForceErrorCheckOption; +extern llvm::cl::opt convMultiplierFactorOption; +extern llvm::cl::opt opSplitTensorArenaOption; +extern llvm::cl::opt opSplitTargetSizeOption; +extern llvm::cl::list opSplitBottomOpsOption; +extern llvm::cl::list opSplitTopOpsOption; +extern llvm::cl::list opSplitNumSplitsOption; +extern llvm::cl::opt allowInputModificationOption; +extern llvm::cl::opt mergeTransposeOption; +extern llvm::cl::opt convDebugOption; +extern llvm::cl::opt overlapConvOption; +extern llvm::cl::opt tryOverlapModifyingOpsOption; +extern llvm::cl::opt enablePagingOption; +extern llvm::cl::opt livenessPagingOption; +extern llvm::cl::opt convChannelwiseSplitSizeOption; +extern llvm::cl::list sameAllocationInputOutputTensorOption; +extern llvm::cl::list loadInputExternallyOption; +extern llvm::cl::list storeOutputExternallyOption; +extern llvm::cl::opt targetArchOption; + +} // namespace xcore +} // namespace mlir + +#endif // XFORMER_TRANSFORMS_OPTIONS_H diff --git a/xformer/Transforms/Paging.cpp b/xformer/Transforms/Paging.cpp new file mode 100644 index 000000000..a13f2adbb --- /dev/null +++ b/xformer/Transforms/Paging.cpp @@ -0,0 +1,412 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Analysis/MemoryPlan.h" +#include "IR/XCoreOps.h" +#include "Transforms/Options.h" +#include "Utils/Util.h" + +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +namespace { +struct Paging : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(Paging) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-run-paging"; } + StringRef getDescription() const final { return "Run paging pass"; } + void runOnOperation() override; +}; + +struct ConvertToStoreLoadPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::SliceOp slice, + PatternRewriter &rewriter) const override { + auto f = slice->getParentOfType(); + + // TODO + // if (!slice->hasAttr(opSplitLabel) || + // slice->hasAttr(opSplitLabelNumSplits)) { + // return failure(); + // } + + printf("found slice\n"); + + auto dummyResultType = + RankedTensorType::get({1}, rewriter.getIntegerType(8)); + auto sliceReplacement = rewriter.create( + slice.getLoc(), dummyResultType, slice.getInput(), 1, 1); + + SmallVector sliceOps; + sliceOps.push_back(sliceReplacement); + auto loadOp = rewriter.create( + slice.getLoc(), slice.getOutput().getType(), sliceOps, 1, 1); + + // replace slice with new slice -> new pad + rewriter.replaceOp(slice, loadOp.getOutput()); + + return success(); + } +}; + +struct ConvertToStoreLoadConcatPattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::ConcatenationOp concat, + PatternRewriter &rewriter) const override { + // TODO + // if (!concat->hasAttr(opSplitLabel) || + // concat->hasAttr(opSplitLabelNumSplits)) { + // return failure(); + // } + + printf("found concat\n"); + + SmallVector storeOps; + for (int i = 0; i < concat->getNumOperands(); ++i) { + auto dummyResultType = + RankedTensorType::get({1}, rewriter.getIntegerType(8)); + rewriter.setInsertionPointAfter(concat.getOperand(i).getDefiningOp()); + auto storeOp = rewriter.create( + concat.getLoc(), dummyResultType, concat.getOperand(i), 1, 1); + storeOps.push_back(storeOp); + } + auto loadOp = rewriter.create( + concat.getLoc(), concat.getOutput().getType(), storeOps, 1, 1); + + // replace slice with new slice -> new pad + rewriter.replaceOp(concat, loadOp.getOutput()); + + return success(); + } +}; + +struct CombineLoadSliceToPartialLoadPattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::SliceOp slice, + PatternRewriter &rewriter) const override { + if (!(slice.getInput().getDefiningOp())) { + return failure(); + } + + if (!isa(slice.getInput().getDefiningOp())) { + return failure(); + } + + auto loadOriginal = + llvm::cast(slice.getInput().getDefiningOp()); + int addressOriginal = loadOriginal.getAddress(); + + auto loadReplacement = + llvm::cast(rewriter.clone(*loadOriginal)); + + DenseElementsAttr attr; + if (!matchPattern(slice.getBegin(), m_Constant(&attr))) { + return failure(); + } + + // Calculate strides + auto inputShape = + slice.getInput().getType().dyn_cast().getShape(); + int batchStride = inputShape[1] * inputShape[2] * inputShape[3]; + int heightStride = inputShape[2] * inputShape[3]; + int widthStride = inputShape[3]; + int channelStride = 1; + + auto beginVal = attr.getValues(); + int addressOffset = beginVal[0] * batchStride + beginVal[1] * heightStride + + beginVal[2] * widthStride + beginVal[3] * channelStride; + addressOffset *= + utils::getTypeSize(slice.getInput().getType().getElementType()); + + int newSize = utils::getShapedTypeSize( + slice.getOutput().getType().dyn_cast()); + + loadReplacement.setAddress(addressOriginal + addressOffset); + loadReplacement.setSize(newSize); + loadReplacement->getResult(0).setType(slice.getOutput().getType()); + rewriter.replaceOp(slice, loadReplacement.getOutput()); + + return success(); + } +}; + +// struct CombineSliceStoreToPartialStorePattern : public +// OpRewritePattern { +// using OpRewritePattern::OpRewritePattern; + +// LogicalResult matchAndRewrite(StoreTensorOp store, +// PatternRewriter &rewriter) const override { +// if (!(store.getInput().getDefiningOp())) { +// return failure(); +// } + +// if (!isa(store.getInput().getDefiningOp())) { +// return failure(); +// } + +// auto slice = store.getInput().getDefiningOp(); + +// store->getResult(0).setType(slice->getResult(0).getType()); +// store->setOperand(0, slice->getOperand(0)); +// rewriter.replaceOp(slice, store->getResult(0)); + +// return success(); +// } +// }; + +struct ReorderLoadStorePattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(StoreTensorOp storeTensorOp, + PatternRewriter &rewriter) const override { + auto opInput = storeTensorOp.getInput(); + + if (opInput.getDefiningOp() && isa(opInput.getDefiningOp())) { + storeTensorOp->moveAfter(opInput.getDefiningOp()); + return success(); + } + + return failure(); + } +}; + +struct RaiseSliceLoadTensorInputPattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::SliceOp slice, + PatternRewriter &rewriter) const override { + auto f = slice->getParentOfType(); + // If slice does not have a defining op, return failure + if (!slice.getInput().getDefiningOp() || + !isa(slice.getInput().getDefiningOp())) { + return failure(); + } + + auto opOriginal = + llvm::cast(slice.getInput().getDefiningOp()); + + DenseElementsAttr beginAttr, sizeAttr; + if (!matchPattern(slice.getBegin(), m_Constant(&beginAttr))) { + return failure(); + } + if (!matchPattern(slice.getSize(), m_Constant(&sizeAttr))) { + return failure(); + } + + auto sliceOutShape = utils::getValShape(slice.getOutput()); + auto opReplacement = llvm::cast(rewriter.clone(*opOriginal)); + RankedTensorType opReplacementType = RankedTensorType::get( + sliceOutShape, utils::getValElementType(opOriginal.getResult())); + opReplacement->getResult(0).setType(opReplacementType); + + auto outputType = + opOriginal.getResult().getType().template cast(); + + // replace slice with new slice -> new op + rewriter.replaceOp(slice, opReplacement.getResult()); + + return success(); + } +}; + +void Paging::runOnOperation() { + auto func = getOperation(); + auto module = func->getParentOfType(); + auto *ctx = &getContext(); + OpBuilder builder(func); + + auto &mem = getAnalysis(); + llvm::StringMap inputTensorMap, outputTensorMap; + mem.buildInputOutputTensorMaps(inputTensorMap, outputTensorMap); + + int address = 0; + if (loadInputExternallyOption.size() > 0) { + llvm::DenseSet inputArgIndexSet; + for (int i = 0; i < loadInputExternallyOption.size(); i = i + 1) { + for (int j = 0; j < func.getNumArguments(); j++) { + if (inputTensorMap[loadInputExternallyOption[i]] == + func.getArgument(j)) { + inputArgIndexSet.insert(j); + } + } + } + std::vector externalInputTensorsData; + module->setAttr(kMetadataXCNumExternalInputTensors, + builder.getI32IntegerAttr(inputArgIndexSet.size())); + + for (auto index : inputArgIndexSet) { + BlockArgument inp = func.getArgument(index); + builder.setInsertionPointToStart(inp.getOwner()); + auto noValueOp = builder.create( + inp.getLoc(), builder.getNoneType(), builder.getUnitAttr()); + llvm::SmallVector ops; + ops.push_back(noValueOp); + int size = utils::getShapedTypeSize(inp.getType().dyn_cast()); + // Align address to four + address = ((address + 3) / 4) * 4; + auto loadOp = builder.create(inp.getLoc(), inp.getType(), + ops, address, size); + inp.replaceAllUsesWith(loadOp); + + // TODO + externalInputTensorsData.push_back(index); + externalInputTensorsData.push_back(address); + externalInputTensorsData.push_back(size); + + // TODO + address += size; + } + assert(externalInputTensorsData.size() == inputArgIndexSet.size() * 3); + if (externalInputTensorsData.size()) { + module->setAttr(kMetadataXCNumExternalInputTensorsData, + builder.getI32VectorAttr(externalInputTensorsData)); + } + } + + if (storeOutputExternallyOption.size() > 0) { + llvm::DenseSet outputIndexSet; + for (int i = 0; i < storeOutputExternallyOption.size(); i = i + 1) { + auto term = func.back().getTerminator(); + for (int j = 0; j < term->getNumOperands(); j++) { + if (outputTensorMap[storeOutputExternallyOption[i]] == + term->getOperand(j)) { + outputIndexSet.insert(j); + } + } + } + std::vector externalOutputTensorsData; + module->setAttr(kMetadataXCNumExternalOutputTensors, + builder.getI32IntegerAttr(outputIndexSet.size())); + + auto term = func.back().getTerminator(); + for (auto index : outputIndexSet) { + auto op = term->getOperand(index); + builder.setInsertionPointAfterValue(op); + + int size = utils::getShapedTypeSize(op.getType().dyn_cast()); + // Align address to four + address = ((address + 3) / 4) * 4; + auto storeOp = builder.create(op.getLoc(), op.getType(), + op, address, size); + term->setOperand(index, storeOp); + + // TODO + externalOutputTensorsData.push_back(index); + externalOutputTensorsData.push_back(address); + externalOutputTensorsData.push_back(size); + + // TODO + address += size; + } + + // TOD + assert(externalOutputTensorsData.size() == outputIndexSet.size() * 3); + if (externalOutputTensorsData.size()) { + module->setAttr(kMetadataXCNumExternalOutputTensorsData, + builder.getI32VectorAttr(externalOutputTensorsData)); + } + } + + RewritePatternSet patterns1(ctx); + patterns1.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns1)); + + // TODO + // Try store_tensor and load_tensor ops + // Op split slices are lowered to one store, and multiple partial loads + // Op split concats are lowered to partial stores, and one load + // RewritePatternSet patterns3(ctx); + // patterns3.insert(ctx); + // patterns3.insert(ctx); + // (void)applyPatternsAndFoldGreedily(func, std::move(patterns3)); + + // RewritePatternSet patterns4(ctx); + // patterns4.insert(ctx); + // (void)applyPatternsAndFoldGreedily(func, std::move(patterns4)); + + // RewritePatternSet patterns5(ctx); + // patterns5.insert(ctx); + // (void)applyPatternsAndFoldGreedily(func, std::move(patterns5)); + + // Insert store_tensor and load_tensor based on liveness range for paging + getAnalysisManager().clear(); + auto &m = getAnalysis(); + auto opIdMap = m.getOperationsIDMap(); + auto ops = m.getOperationsSequence(); + auto values = m.getValuesSequence(); + auto vInfoMap = m.getValuesInfoMap(); + + llvm::SetVector convOpIds; + + for (auto v : values) { + // If v is not constant + // If first used and last used is more than livenessPagingOption + // Go through all uses of value + // Insert store tensor after value creation and then load tensor before each + // use + if (!vInfoMap[v].isConstant && + vInfoMap[v].lastUsed - vInfoMap[v].firstUsed > livenessPagingOption) { + SmallVector uses; + for (mlir::OpOperand &use : v.getUses()) { + uses.push_back(&use); + } + + auto dummyResultType = + RankedTensorType::get({1}, builder.getIntegerType(8)); + + Value storeOp; + int size = utils::getShapedTypeSize(v.getType().dyn_cast()); + + // Align address to four + address = ((address + 3) / 4) * 4; + if (auto blockArg = v.dyn_cast()) { + builder.setInsertionPointToStart(blockArg.getOwner()); + storeOp = builder.create(v.getLoc(), dummyResultType, v, + address, size); + } else { + Operation *defOp = v.getDefiningOp(); + builder.setInsertionPointAfter(defOp); + storeOp = builder.create( + defOp->getLoc(), dummyResultType, v, address, size); + } + + for (OpOperand *use : uses) { + mlir::Operation *op = use->getOwner(); + builder.setInsertionPoint(op); + auto loadOp = builder.create(op->getLoc(), v.getType(), + storeOp, address, size); + use->set(loadOp.getResult()); + } + + address += size; + } + } + llvm::outs() << "\nExternal memory size : " << address << "\n"; + module->setAttr("xc.paging_size", builder.getI32IntegerAttr(address)); + RewritePatternSet patterns5(ctx); + patterns5.insert(ctx); + // patterns5.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns5)); +} +} // namespace + +// Creates an instance of the Paging pass. +std::unique_ptr> createPagingPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore \ No newline at end of file diff --git a/xformer/Transforms/Passes.cpp b/xformer/Transforms/Passes.cpp new file mode 100644 index 000000000..d791b4751 --- /dev/null +++ b/xformer/Transforms/Passes.cpp @@ -0,0 +1,81 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Transforms/Passes.h" +#include "Transforms/Options.h" + +#include "larq_compute_engine/mlir/transforms/passes.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Pass/PassManager.h" +#include "mlir/Transforms/Passes.h" + +namespace mlir::xcore { + +void buildXCorePreOpSplitPassPipeline(OpPassManager &pm) { + // Run pass from LCE to convert Larq ops which are in TFL custom op format to + // Larq dialect + pm.addPass(mlir::TFL::CreateTranslateToLCEPass()); + pm.addPass(createVerifyInputOutputTensorOptionsPass()); + // Convert dynamic shapes in batch dimension to static + pm.addPass(createRemoveDynamicShapePass()); +} + +void buildXCoreRemainingPassPipeline(OpPassManager &pm) { + // TFL passes + pm.addPass(createOptimizeTransposePass()); + // Run canonicalization for constant folding Transpose, if any + pm.addPass(mlir::createCanonicalizerPass()); + pm.addPass(createOptimizeTransposePass()); + pm.addPass(createReplaceAvgPoolWithConv2DPass()); + pm.addPass(createReplaceFCWithConv2DPass()); + if (opSplitTensorArenaOption) { + pm.addPass(createOpSplitPass()); + } + if (enablePagingOption) { + pm.addPass(createPagingPass()); + } + pm.addPass(createApplyTFLPatternsPass()); + pm.addPass(createReplaceAvgPoolWithConv2DPass()); + pm.addPass(createOptimizeConv2DPass()); + pm.addPass(mlir::createCanonicalizerPass()); + pm.addPass(createApplyTFLPatternsPass()); + pm.addPass(createReplaceStridedSlicePass()); + // Run canonicalization, which includes combining Reshapes + pm.addPass(mlir::createCanonicalizerPass()); + + // XC passes + pm.addPass(createReplaceAddSubPass()); + pm.addPass(createReplaceMaxPoolPass()); + pm.addPass(createReplaceMulPass()); + pm.addPass(createReplaceMeanPass()); + pm.addPass(createReplaceSumPass()); + pm.addPass(createReplaceTransposeConvPass()); + pm.addPass(createReplaceConv2DPass()); + pm.addPass(createReplaceSlicePass()); + pm.addPass(createReplaceBroadcastPass()); + pm.addPass(createReplaceConcatPass()); + pm.addPass(createReplaceTransposePass()); + pm.addPass(createApplyXCPatternsPass()); + pm.addPass(createReplacePadPass()); + // Add to pipeline only if weights file option is provided + if (!weightsFilenameOption.empty()) { + pm.addPass(createApplyLoadConstantOpPatternsPass()); + pm.addPass(createWriteWeightsPass()); + } + // Run canonicalization, which includes combining Reshapes + pm.addPass(mlir::createCanonicalizerPass()); + pm.addPass(createPlanMemoryPass()); + pm.addPass(createTranslateToCustomOpPass()); +} + +void registerXCorePassPipeline() { + mlir::PassPipelineRegistration<> pipeline( + "xcore-tfl-pipeline", + "Run XCore passes for transforming TFLite code into XCore", + [](OpPassManager &passManager) { + buildXCorePreOpSplitPassPipeline(passManager); + buildXCoreRemainingPassPipeline(passManager); + }); +} + +} // namespace mlir::xcore diff --git a/xformer/Transforms/Passes.h b/xformer/Transforms/Passes.h new file mode 100644 index 000000000..8ed638f50 --- /dev/null +++ b/xformer/Transforms/Passes.h @@ -0,0 +1,66 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#ifndef XFORMER_TRANSFORMS_PASSES_H +#define XFORMER_TRANSFORMS_PASSES_H + +#include "mlir/Dialect/Func/IR/FuncOps.h" +#include "mlir/Pass/Pass.h" + +namespace mlir { +namespace xcore { + +//===----------------------------------------------------------------------===// +// Pipelines +//===----------------------------------------------------------------------===// + +// Create a single pipeline that will run all the needed passes in the right +// order. +void buildXCorePreOpSplitPassPipeline(OpPassManager &pm); +void buildXCoreRemainingPassPipeline(OpPassManager &pm); + +//===----------------------------------------------------------------------===// +// XCore-specific passes +//===----------------------------------------------------------------------===// + +std::unique_ptr> createOptimizeTransposePass(); +std::unique_ptr> +createReplaceAvgPoolWithConv2DPass(); +std::unique_ptr> createReplaceFCWithConv2DPass(); +std::unique_ptr> createOptimizeConv2DPass(); +std::unique_ptr> createOpSplitPass(); +std::unique_ptr> createPagingPass(); +std::unique_ptr> createApplyTFLPatternsPass(); +std::unique_ptr> +createVerifyInputOutputTensorOptionsPass(); +std::unique_ptr> createRemoveDynamicShapePass(); +std::unique_ptr> createReplaceAddSubPass(); +std::unique_ptr> createReplaceMulPass(); +std::unique_ptr> createReplaceMeanPass(); +std::unique_ptr> createReplaceSumPass(); +std::unique_ptr> createReplaceMaxPoolPass(); +std::unique_ptr> createReplaceStridedSlicePass(); +std::unique_ptr> createReplaceSlicePass(); +std::unique_ptr> createReplaceBroadcastPass(); +std::unique_ptr> createReplacePadPass(); +std::unique_ptr> createReplaceConcatPass(); +std::unique_ptr> createReplaceTransposePass(); +std::unique_ptr> createReplaceConv2DPass(); +std::unique_ptr> createReplaceTransposeConvPass(); +std::unique_ptr> createApplyXCPatternsPass(); +std::unique_ptr> +createApplyLoadConstantOpPatternsPass(); +std::unique_ptr> createWriteWeightsPass(); +std::unique_ptr> createPlanMemoryPass(); +std::unique_ptr> createTranslateToCustomOpPass(); + +//===----------------------------------------------------------------------===// +// Registration +//===----------------------------------------------------------------------===// + +void registerXCorePassPipeline(); + +} // namespace xcore +} // namespace mlir + +#endif // XFORMER_TRANSFORMS_PASSES_H diff --git a/xformer/Transforms/PlanMemory.cpp b/xformer/Transforms/PlanMemory.cpp new file mode 100644 index 000000000..79413acd2 --- /dev/null +++ b/xformer/Transforms/PlanMemory.cpp @@ -0,0 +1,83 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Analysis/MemoryPlan.h" +#include "IR/XCoreOps.h" +#include "Transforms/Options.h" + +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +namespace { +// Write flash image +struct PlanMemory + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PlanMemory) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-plan-memory"; } + StringRef getDescription() const final { return "Plan memory"; } + void runOnOperation() override; +}; + +void PlanMemory::runOnOperation() { + auto func = getOperation(); + + bool unSupportedOpsInGraph = false; + func.walk([&](Operation *op) { + if (llvm::isa(op)) { + unSupportedOpsInGraph = true; + } + }); + + if (!unSupportedOpsInGraph) { + auto module = func->getParentOfType(); + OpBuilder builder(module); + + auto &m = getAnalysis(); + int peakMemoryUsedWithOverlap, peakMemoryUsedWithoutOverlap, peakOpId; + auto offlineOffsetsWithoutOverlap = m.getAllocatedOffsets( + /*overlapModifyingOps=*/false, peakMemoryUsedWithoutOverlap, peakOpId); + if (!tryOverlapModifyingOpsOption) { + module->setAttr(kMetadataXCOffsets, + builder.getI32VectorAttr(offlineOffsetsWithoutOverlap)); + module->setAttr(kMetadataXCPeakOpId, builder.getI32IntegerAttr(peakOpId)); + module->setAttr(kMetadataXCPeakUsage, + builder.getI32IntegerAttr(peakMemoryUsedWithoutOverlap)); + } else { + auto offlineOffsetsWithOverlap = m.getAllocatedOffsets( + /*overlapModifyingOps=*/true, peakMemoryUsedWithOverlap, peakOpId); + + module->setAttr(kMetadataXCPeakOpId, builder.getI32IntegerAttr(peakOpId)); + + if (peakMemoryUsedWithOverlap <= peakMemoryUsedWithoutOverlap) { + module->setAttr(kMetadataXCOffsets, + builder.getI32VectorAttr(offlineOffsetsWithOverlap)); + module->setAttr(kMetadataXCPeakUsage, + builder.getI32IntegerAttr(peakMemoryUsedWithOverlap)); + } else { + module->setAttr(kMetadataXCOffsets, + builder.getI32VectorAttr(offlineOffsetsWithoutOverlap)); + module->setAttr( + kMetadataXCPeakUsage, + builder.getI32IntegerAttr(peakMemoryUsedWithoutOverlap)); + } + } + } +} +} // namespace + +// Creates an instance of the PlanMemory pass. +std::unique_ptr> createPlanMemoryPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/RemoveDynamicShape.cpp b/xformer/Transforms/RemoveDynamicShape.cpp new file mode 100644 index 000000000..7054af80b --- /dev/null +++ b/xformer/Transforms/RemoveDynamicShape.cpp @@ -0,0 +1,98 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "IR/XCoreOps.h" + +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +namespace { +struct RemoveDynamicShape + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RemoveDynamicShape) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-remove-dynamic-shape"; } + StringRef getDescription() const final { return "Remove dynamic shape"; } + void runOnOperation() override; +}; + +void RemoveDynamicShape::runOnOperation() { + auto func = getOperation(); + auto *ctx = &getContext(); + + // Lambda for getting a new type with dynamic changed to static + auto getNewTensorType = [&](TensorType tensorType) { + TensorType newType = tensorType; + // If batch dim is dynamic, make it of size one + if (tensorType.hasRank() && tensorType.getRank() > 1 && + tensorType.getDimSize(0) == ShapedType::kDynamic) { + llvm::ArrayRef shape = tensorType.getShape(); + std::vector newShape; + newShape.reserve(shape.size()); + for (auto &dim : shape) { + newShape.push_back(static_cast(dim)); + } + newShape[0] = 1; + newType = tensorType.clone(llvm::ArrayRef(newShape)); + } + return newType; + }; + + // Handle func arguments and return types + llvm::SmallVector newFuncInputTypes; + newFuncInputTypes.resize(func.getNumArguments()); + llvm::SmallVector newFuncOutputTypes; + newFuncOutputTypes.resize(func.getNumResults()); + + for (BlockArgument argument : func.getArguments()) { + auto tensorType = argument.getType().dyn_cast(); + auto newType = getNewTensorType(tensorType); + newFuncInputTypes[argument.getArgNumber()] = newType; + argument.setType(newType); + } + + for (int i = 0; i < func.getNumResults(); ++i) { + auto tensorType = func.getResultTypes()[i].dyn_cast(); + newFuncOutputTypes[i] = getNewTensorType(tensorType); + } + FunctionType funcType = func.getFunctionType(); + auto newFuncType = + FunctionType::get(ctx, newFuncInputTypes, newFuncOutputTypes); + func.setType(newFuncType); + + // Iterate through all other ops + func.walk([&](Operation *op) { + if (op == func) { + return; + } + + for (Value result : op->getResults()) { + if (result.getType().isa()) { + continue; + } + auto tensorType = result.getType().dyn_cast(); + result.setType(getNewTensorType(tensorType)); + } + }); + + // Save function name to be later used for memory plan pass analysis + auto module = func->getParentOfType(); + OpBuilder builder(module); + module->setAttr("xc.fn_name", builder.getStringAttr(func.getName())); +} +} // namespace + +// Creates an instance of the RemoveDynamicShape pass. +std::unique_ptr> createRemoveDynamicShapePass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplaceAddSub.cpp b/xformer/Transforms/ReplaceAddSub.cpp new file mode 100644 index 000000000..afb73ecd3 --- /dev/null +++ b/xformer/Transforms/ReplaceAddSub.cpp @@ -0,0 +1,113 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "IR/XCoreOps.h" +#include "Utils/Util.h" + +#include "lib_nn/api/MemCpyFn.hpp" +#include "mlir/IR/TypeUtilities.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +namespace { +// Replace TFL Add with Add for XCore. +struct ReplaceAddSub + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplaceAddSub) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-replace-addsub"; } + StringRef getDescription() const final { + return "Replace TFL Add/Sub with Add for XCore."; + } + void runOnOperation() override; +}; + +template +LogicalResult replaceAddorSub(T addOp, PatternRewriter &rewriter, + bool negateForSub) { + if (!utils::checkBinaryCompatibility(addOp)) + return failure(); + + auto lhsQType = utils::getQType(addOp.getLhs()); + auto lhsScale = lhsQType.getScale(); + auto lhsZeroPoint = lhsQType.getZeroPoint(); + + auto rhsQType = utils::getQType(addOp.getRhs()); + auto rhsScale = rhsQType.getScale(); + auto rhsZeroPoint = rhsQType.getZeroPoint(); + + auto outputQType = utils::getQType(addOp.getOutput()); + auto outputScale = outputQType.getScale(); + auto outputZeroPoint = outputQType.getZeroPoint(); + + double lhsRatio = lhsScale / outputScale; + double rhsRatio = rhsScale / outputScale; + + // We find the max in case there is a large difference + // between lhs and rhs scales. + double maxR = std::max(lhsRatio, rhsRatio); + // We want the max shift to be 14 bits + int shift = int(floor(log2(pow(2, 14) / maxR))); + + // For doing subtraction with add op + rhsRatio = negateForSub ? -rhsRatio : rhsRatio; + + // Multipliers are converted to fixed-point + int m1 = round(lhsRatio * pow(2, shift)); + int m2 = round(rhsRatio * pow(2, shift)); + int bias = round((outputZeroPoint - (lhsZeroPoint * lhsRatio) - + (rhsZeroPoint * rhsRatio)) * + pow(2, shift)); + + auto xcAddOp = rewriter.create( + addOp.getLoc(), addOp.getType(), addOp.getLhs(), addOp.getRhs(), + rewriter.getStringAttr(addOp.getFusedActivationFunction()), + rewriter.getI32IntegerAttr(m1), rewriter.getI32IntegerAttr(m2), + rewriter.getI32IntegerAttr(bias), rewriter.getI32IntegerAttr(shift)); + rewriter.replaceOp(addOp, xcAddOp.getOutput()); + + return success(); +} + +struct ReplaceAddPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::AddOp addOp, + PatternRewriter &rewriter) const override { + return replaceAddorSub(addOp, rewriter, /*negateForSub=*/false); + } +}; + +struct ReplaceSubPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::SubOp subOp, + PatternRewriter &rewriter) const override { + return replaceAddorSub(subOp, rewriter, /*negateForSub=*/true); + } +}; + +void ReplaceAddSub::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + RewritePatternSet patterns(ctx); + patterns.insert(ctx); + patterns.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ReplaceAddSub pass. +std::unique_ptr> createReplaceAddSubPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplaceAvgPoolWithConv2D.cpp b/xformer/Transforms/ReplaceAvgPoolWithConv2D.cpp new file mode 100644 index 000000000..bee738ea4 --- /dev/null +++ b/xformer/Transforms/ReplaceAvgPoolWithConv2D.cpp @@ -0,0 +1,131 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 +#include "Utils/Util.h" + +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +namespace { +// Replace TFL AveragePool2D with TFL DepthwiseConv2D. +struct ReplaceAvgPoolWithConv2D + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplaceAvgPoolWithConv2D) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { + return "xcore-replace-avgpool-with-conv2d"; + } + StringRef getDescription() const final { + return "Replace TFL Avgpool with Conv2D operations."; + } + void runOnOperation() override; +}; + +struct ReplaceAvgPoolWithConv2DPattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::AveragePool2DOp avgPoolOp, + PatternRewriter &rewriter) const override { + + auto inputElementalType = + avgPoolOp.getInput().getType().cast().getElementType(); + + auto outputElementalType = + avgPoolOp.getOutput().getType().cast().getElementType(); + + // Check for invalid types and return + // Input type must be QI8 + if (!utils::isNBitSignedQType<8>(inputElementalType) || + !utils::isNBitSignedQType<8>(outputElementalType)) { + return failure(); + } + + auto inputType = + avgPoolOp.getInput().getType().dyn_cast(); + auto inputDepth = inputType.getDimSize(3); + + auto filterHeight = avgPoolOp.getFilterHeight(); + auto filterWidth = avgPoolOp.getFilterWidth(); + + float scaleFactor = 1. / (filterHeight * filterWidth); + + int64_t storageTypeMin = + quant::QuantizedType::getDefaultMinimumForInteger(/*isSigned=*/true, 8); + int64_t storageTypeMax = + quant::QuantizedType::getDefaultMaximumForInteger(/*isSigned=*/true, 8); + + /* + The quantisation stratergy we are using is to set all elements of the filter + to one and to control the scaling with the QTypes scalar. The zero point + will be 0. In order to achieve an AvgPool2D we simply sum all elements of + the receptive field then scale by 1./count(the receptive field). + */ + UniformQuantizedType int8ElementQtype = + mlir::quant::UniformQuantizedType::get( + true, rewriter.getIntegerType(8), rewriter.getF32Type(), + scaleFactor, 0, storageTypeMin, storageTypeMax); + + auto filterResultType = RankedTensorType::get( + {1, filterHeight, filterWidth, inputDepth}, int8ElementQtype); + + RankedTensorType filterValueType = RankedTensorType::get( + {1, filterHeight, filterWidth, inputDepth}, rewriter.getIntegerType(8)); + + // These are the actual values that the quantised filter will hold. + std::vector filterVector(filterHeight * filterWidth * inputDepth, + 1); + + Value filter = rewriter.create( + avgPoolOp.getLoc(), mlir::TypeAttr::get(filterResultType), + DenseElementsAttr::get(filterValueType, filterVector)); + + //[asj] This may need to be QI32 but I32 seems to work + RankedTensorType biasType = + RankedTensorType::get({inputDepth}, rewriter.getI32Type()); + std::vector biasValues(inputDepth, 0); + auto bias = rewriter.create( + avgPoolOp->getLoc(), DenseIntElementsAttr::get(biasType, biasValues)); + + auto conv2dOp = rewriter.create( + avgPoolOp.getLoc(), avgPoolOp.getType(), avgPoolOp.getInput(), filter, + bias, // TODO [asj]how do we drop the bias? + /*dilation_h_factor=*/1, + /*dilation_w_factor=*/1, + /*fused_activation_function=*/avgPoolOp.getFusedActivationFunction(), + /*padding=*/avgPoolOp.getPadding(), + /*stride_h=*/avgPoolOp.getStrideH(), + /*stride_w=*/avgPoolOp.getStrideW(), + /*depth_multiplier=*/1); + + rewriter.replaceOp(avgPoolOp, conv2dOp.getOutput()); + + return success(); + } +}; + +void ReplaceAvgPoolWithConv2D::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + + RewritePatternSet patterns(ctx); + patterns.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ReplaceAvgPoolWithConv2D pass. +std::unique_ptr> +createReplaceAvgPoolWithConv2DPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplaceBroadcast.cpp b/xformer/Transforms/ReplaceBroadcast.cpp new file mode 100644 index 000000000..ed30b48c6 --- /dev/null +++ b/xformer/Transforms/ReplaceBroadcast.cpp @@ -0,0 +1,129 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "IR/XCoreOps.h" + +#include "Utils/Util.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +extern "C" { +#include "lib_nn/api/nn_layers.h" +} + +namespace mlir::xcore { + +namespace { + +// Replace TFL Broadcast with Broadcast for XCore. +struct ReplaceBroadcast + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplaceBroadcast) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-replace-broadcast"; } + StringRef getDescription() const final { + return "Replace TFL Broadcast with Broadcast for XCore."; + } + void runOnOperation() override; +}; + +struct ReplaceBroadcastPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::BroadcastToOp broadcastOp, + PatternRewriter &rewriter) const override { + + auto inputType = broadcastOp.getInput().getType().cast(); + auto outputType = + broadcastOp.getOutput().getType().cast(); + if (!inputType.hasStaticShape()) + return failure(); + + if (utils::checkSliceNoOp(inputType, outputType)) { + rewriter.replaceOp(broadcastOp, broadcastOp.getInput()); + return success(); + } + + // If the input is a constant, LLVM's Canonicalizer will + // fold the broadcast into a constant later. + if (matchPattern(broadcastOp.getInput(), m_Constant()) || + matchPattern(broadcastOp.getInput(), m_Op())) { + return failure(); + } + + Type inputElementType = inputType.getElementType(); + + auto inShape = inputType.getShape(); + auto outShape = outputType.getShape(); + + std::vector inShapeVec(inShape.begin(), inShape.end()); + std::vector outShapeVec(outShape.begin(), outShape.end()); + + // if number of dimensions are different, and in shape has fewer dimensions + // than out shape pad in shape with 1s + if (inShapeVec.size() < outShapeVec.size()) + inShapeVec.insert(inShapeVec.begin(), + outShapeVec.size() - inShapeVec.size(), 1); + + // check dimensions are compatible for broadcasting + for (int i = 0; i < inShapeVec.size(); i++) + if (inShapeVec[i] != outShapeVec[i] && inShapeVec[i] != 1) + return failure(); + + // check only broadcasting along 1 dimension (or consecutive dimensions) + bool canBroadcast = true; + int size = utils::getTypeSize(inputElementType); + int num_copies = 1, num_broadcasts = 1; + for (int i = 0; i < inShapeVec.size(); i++) { + if (canBroadcast) { + if (inShapeVec[i] != outShapeVec[i]) + num_copies *= outShapeVec[i]; + else { + if (num_copies != 1 && outShapeVec[i] != 1) { + canBroadcast = false; + size *= inShapeVec[i]; + } else + num_broadcasts *= outShapeVec[i]; + } + } else { + if (inShapeVec[i] != outShapeVec[i]) + return failure(); + size *= inShapeVec[i]; + } + } + + bool isVpu = size % 4 == 0; + auto binaryObjectBroadcastOp = rewriter.create( + broadcastOp.getLoc(), broadcastOp.getType(), broadcastOp.getInput(), + rewriter.getI32IntegerAttr(size), + rewriter.getI32IntegerAttr(num_copies), + rewriter.getI32IntegerAttr(num_broadcasts), + rewriter.getBoolAttr(isVpu)); + + rewriter.replaceOp(broadcastOp, binaryObjectBroadcastOp.getOutput()); + + return success(); + } +}; + +void ReplaceBroadcast::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + RewritePatternSet patterns(ctx); + patterns.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ReplaceBroadcast pass. +std::unique_ptr> createReplaceBroadcastPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplaceConcat.cpp b/xformer/Transforms/ReplaceConcat.cpp new file mode 100644 index 000000000..aa42958dc --- /dev/null +++ b/xformer/Transforms/ReplaceConcat.cpp @@ -0,0 +1,178 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "IR/XCoreOps.h" + +#include "Utils/Util.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +// 13 because flexbuffers are allocated in multiples of 16 bytes, and the op +// already allocates 2 integers and a boolean on top of CONCAT_OP_MAX_INPUTS * 4 +// bytes. This will use 64 bytes per concat op. +// +// This number must match kMaxNumInputs in the ConcatOp definition in the +// runtime. +namespace mlir::xcore { + +namespace { + +// Replace TFL Concatenate with Concat for XCore. +struct ReplaceConcat + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplaceConcat) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-replace-concat"; } + StringRef getDescription() const final { + return "Replace TFL Concatenate with Concat for XCore."; + } + void runOnOperation() override; +}; + +bool isConcatConvertible(TFL::ConcatenationOp concatOp) { + auto values = concatOp.getValues(); + for (int i = 0; i < values.size(); i++) { + auto inputType = values[i].getType().cast(); + if (!inputType.hasStaticShape()) + return false; + } + if (concatOp.getFusedActivationFunction() != "NONE") + return false; + return true; +} + +struct SplitConcatPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::ConcatenationOp concatOp, + PatternRewriter &rewriter) const override { + + // No need to split if the op won't be converted to XC concat anyway + if (!isConcatConvertible(concatOp)) + return failure(); + mlir::Operation::operand_range values = concatOp.getValues(); + int num_inputs = values.size(); + if (num_inputs <= CONCAT_OP_MAX_INPUTS) + return failure(); + + auto outputType = concatOp.getOutput().getType().cast(); + Type elementType = outputType.getElementType(); + ArrayRef outputShape = outputType.getShape(); + const int axis = concatOp.getAxis() == -1 ? outputType.getRank() - 1 + : concatOp.getAxis(); + + int axisShape = 0; + for (int i = 0; i < CONCAT_OP_MAX_INPUTS; i++) { + auto inputType = values[i].getType().cast(); + axisShape += inputType.getShape()[axis]; + } + int rank = outputType.getRank(); + + std::vector newShape; + for (int i = 0; i < rank; i++) + if (i == axis) + newShape.push_back(axisShape); + else + newShape.push_back(outputShape[i]); + + auto newOutputType = + RankedTensorType::get(ArrayRef(newShape), elementType); + auto firstValues = values.take_front(CONCAT_OP_MAX_INPUTS); + + auto first_concatOp = rewriter.create( + concatOp.getLoc(), newOutputType, firstValues, concatOp.getAxis(), + "NONE"); + + Value first_output = first_concatOp.getResult(); + OperandRange remainingValues = values.drop_front(CONCAT_OP_MAX_INPUTS); + SmallVector remainingValuesVec; + remainingValuesVec.push_back(first_output); + for (auto value : remainingValues) + remainingValuesVec.push_back(value); + + auto remaining_concatOp = rewriter.create( + concatOp.getLoc(), outputType, remainingValuesVec, concatOp.getAxis(), + concatOp.getFusedActivationFunction()); + + rewriter.replaceOp(concatOp, remaining_concatOp.getResult()); + return success(); + } +}; + +struct ReplaceConcatPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::ConcatenationOp concatOp, + PatternRewriter &rewriter) const override { + + if (!isConcatConvertible(concatOp)) + return failure(); + + auto values = concatOp.getValues(); + int num_inputs = values.size(); + if (num_inputs > CONCAT_OP_MAX_INPUTS) + return failure(); + + ArrayRef inputShapes[CONCAT_OP_MAX_INPUTS]; + for (int i = 0; i < num_inputs; i++) { + auto inputType = values[i].getType().cast(); + inputShapes[i] = inputType.getShape(); + } + + auto outputType = concatOp.getOutput().getType().cast(); + Type elementType = outputType.getElementType(); + + int axis = concatOp.getAxis(); + const int rank = outputType.getRank(); + if (axis < 0) + axis = rank + axis; + + const size_t dtype_size = utils::getTypeSize(elementType); + int num_copies = 1; + for (int i = 0; i < axis; i++) { + num_copies *= outputType.getShape()[i]; + } + + bool isVpu = true; + int32_t sizes[CONCAT_OP_MAX_INPUTS]; + for (int i = 0; i < num_inputs; i++) { + sizes[i] = dtype_size; + for (int j = axis; j < rank; j++) + sizes[i] *= inputShapes[i][j]; + if (sizes[i] % 4 != 0) + isVpu = false; + } + + auto binaryObjectConcatOp = rewriter.create( + concatOp.getLoc(), concatOp.getType(), values, + rewriter.getI32IntegerAttr(num_copies), rewriter.getI32ArrayAttr(sizes), + rewriter.getI32IntegerAttr(num_inputs), rewriter.getBoolAttr(isVpu)); + + rewriter.replaceOp(concatOp, binaryObjectConcatOp.getOutput()); + + return success(); + } +}; + +void ReplaceConcat::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + RewritePatternSet patterns(ctx); + patterns.insert(ctx); + patterns.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ReplaceConcat pass. +std::unique_ptr> createReplaceConcatPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplaceConv2D.cpp b/xformer/Transforms/ReplaceConv2D.cpp new file mode 100644 index 000000000..c3724c791 --- /dev/null +++ b/xformer/Transforms/ReplaceConv2D.cpp @@ -0,0 +1,311 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "IR/XCoreOps.h" +#include "Transforms/ConvPatterns.h" +#include "Transforms/Options.h" +#include "Utils/ThreadSupport.h" +#include "Utils/Util.h" + +#include "larq_compute_engine/mlir/ir/lce_ops.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +template +static LogicalResult obtainSerializedParamsMulsBiasesOp( + const ConcreteType *builder, PatternRewriter &rewriter, + ConvOpType &conv2DOp, const ArgsType &args, const Conv2DType &kt, + OtType &otType, llvm::SmallVector &strParams, + llvm::SmallVector &abstractKernelParams, + std::vector &weightsData, int &scratchBytes, + arith::ConstantOp &mulsBiasesOrThresholdsConstantOp) { + std::vector mulsBiasesOrThresholdsData; + + // Obtain serialized params and calculated tensors from lib_nn for the + // conv2d kernel type + if (failed(builder->getSerializedParamsAndTensors( + args, kt, otType, strParams, abstractKernelParams, weightsData, + mulsBiasesOrThresholdsData, scratchBytes))) { + return failure(); + } + ShapedType mulsBiasesOrThresholdsType = RankedTensorType::get( + {static_cast(mulsBiasesOrThresholdsData.size())}, + rewriter.getIntegerType(sizeof(MulsAndBiasType) * CHAR_BIT)); + auto mulsBiasesOrThresholdsAttr = DenseElementsAttr::get( + mulsBiasesOrThresholdsType, mulsBiasesOrThresholdsData); + mulsBiasesOrThresholdsConstantOp = rewriter.create( + conv2DOp.getLoc(), mulsBiasesOrThresholdsAttr); + return success(); +} + +// XC Conv2D Base class implementation +// ConcreteType would be TFL Conv types or Larq BConv2D +// Replaces them with XC Conv2D +template +LogicalResult +ReplaceWithXCConv2DBase::matchAndRewrite( + ConvOpType op, PatternRewriter &rewriter) const { + auto conv2DOp = static_cast(op); + auto builder = static_cast(this); + + // Check if the op has invalid types + if (failed(builder->checkIfValid(conv2DOp))) { + return failure(); + } + + // Extract common args from the op + ArgsType args; + args.convOp = conv2DOp.getOperation(); + auto inputType = + conv2DOp.getInput().getType().template dyn_cast(); + auto outputType = + conv2DOp.getOutput().getType().template dyn_cast(); + auto filterType = + conv2DOp.getFilter().getType().template dyn_cast(); + args.inputHeight = inputType.getDimSize(1); + args.inputWidth = inputType.getDimSize(2); + args.inputDepth = inputType.getDimSize(3); + args.outputHeight = outputType.getDimSize(1); + args.outputWidth = outputType.getDimSize(2); + args.outputDepth = outputType.getDimSize(3); + args.filterHeight = filterType.getDimSize(1); + args.filterWidth = filterType.getDimSize(2); + args.filterDepth = filterType.getDimSize(3); + // Check if convolution is an int16 one + args.isI16Conv = (utils::isNBitSignedQType<16>(inputType.getElementType()) && + utils::isNBitSignedQType<16>(outputType.getElementType())); + + // Get op-type specific args + if (failed(builder->getArgs(conv2DOp, args))) { + return failure(); + } + + Conv2DType kernelType; + if (failed(builder->getKernelType(args, kernelType))) { + return failure(); + } + + OtType otType; + + llvm::SmallVector abstractKernelParams; + std::string memcpyFnParam, aggregateFnParam, outputTransformFnParam, + kernelTypeEnumParam, otTypeEnumParam; + + int32_t scratchByteParam; + + // Obtain thread count from command-line option + llvm::SmallVector strParams; + int scratchBytes = 0; + // Get image region splits for multiple threads + // When we multi-thread Transpose Conv, we have to take output strides into + // account + if (auto fakeConv2DOp = dyn_cast(conv2DOp.getOperation())) { + args.imageRegionSplits = utils::getImageRegionThreadSplits( + threadCountOption, args.Y.height, args.Y.width, args.Y.depth, + fakeConv2DOp.getOutputSubH(), fakeConv2DOp.getOutputSubW(), + fakeConv2DOp.getOutputStrideH(), fakeConv2DOp.getOutputStrideW()); + } else { + args.imageRegionSplits = utils::getImageRegionThreadSplits( + threadCountOption, args.Y.height, args.Y.width, args.Y.depth); + } + + // + std::vector weightsData; + arith::ConstantOp mulsBiasesOrThresholdsConstantOp; + + if (args.isI16Conv) { + if (failed(obtainSerializedParamsMulsBiasesOp( + builder, rewriter, conv2DOp, args, kernelType, otType, strParams, + abstractKernelParams, weightsData, scratchBytes, + mulsBiasesOrThresholdsConstantOp))) { + return failure(); + } + } else { + if (failed(obtainSerializedParamsMulsBiasesOp( + builder, rewriter, conv2DOp, args, kernelType, otType, strParams, + abstractKernelParams, weightsData, scratchBytes, + mulsBiasesOrThresholdsConstantOp))) { + return failure(); + } + } + + // The actual thread count might be less than the count specified on the + // command-line + // If the output height/width is smaller than the specified + // thread count, only the required number of threads would be used + // The number of abstract kernel params gives us the actual thread count + int actualThreadCount = abstractKernelParams.size(); + + // Prepare params to create Conv2DV2 Op + kernelTypeEnumParam = stringifyConv2DType(kernelType).str(); + memcpyFnParam = strParams[0]; + aggregateFnParam = strParams[1]; + outputTransformFnParam = strParams[2]; + otTypeEnumParam = stringifyOtType(otType).str(); + scratchByteParam = scratchBytes; + + // Create a string array attr from a vector of strings + auto getStringArrayAttr = [&](llvm::SmallVector value) { + auto attrs = llvm::to_vector<8>( + llvm::map_range(value, [&](std::string v) -> Attribute { + return rewriter.getStringAttr(v); + })); + return rewriter.getArrayAttr(attrs); + }; + + // Create the tensors for weights + ShapedType weightsType = RankedTensorType::get( + {static_cast(weightsData.size())}, rewriter.getIntegerType(8)); + auto weightsAttr = DenseElementsAttr::get(weightsType, weightsData); + Value weightsOrExpand8To16Op; + if (args.isI16Conv) { + auto wOp = + rewriter.create(conv2DOp.getLoc(), weightsAttr); + ShapedType expandedType = + RankedTensorType::get({static_cast(weightsData.size() * 2)}, + rewriter.getIntegerType(8)); + weightsOrExpand8To16Op = + rewriter.create(conv2DOp.getLoc(), expandedType, wOp); + } else { + weightsOrExpand8To16Op = + rewriter.create(conv2DOp.getLoc(), weightsAttr); + } + + // If FakeConv2DOp, then we want to pass in the partial output tensor, in case + // it is being used If not, we use a no value op. + Value partialOutputTensorOp; + if (auto fakeConv2DOp = dyn_cast(conv2DOp.getOperation())) { + partialOutputTensorOp = fakeConv2DOp.getPartialOutput(); + } else { + partialOutputTensorOp = rewriter.create( + rewriter.getUnknownLoc(), rewriter.getNoneType(), + rewriter.getUnitAttr()); + } + + // Create scratch buffer tensor for conv and for expanding I16 weights + Value scratchTensorOp; + // Create scratch buffer space for all threads + int32_t scratchBufferSize = scratchByteParam * actualThreadCount; + + if (scratchBufferSize > 0) { + ShapedType scratchType = + RankedTensorType::get({static_cast(scratchBufferSize)}, + rewriter.getIntegerType(8)); + scratchTensorOp = + rewriter.create(conv2DOp.getLoc(), scratchType); + } else { + scratchTensorOp = rewriter.create(rewriter.getUnknownLoc(), + rewriter.getNoneType(), + rewriter.getUnitAttr()); + } + + // Create the Conv2DV2 Op with the params and kernel type + auto newConv2DV2Op = rewriter.create( + conv2DOp.getLoc(), conv2DOp.getType(), conv2DOp.getInput(), + weightsOrExpand8To16Op, mulsBiasesOrThresholdsConstantOp, + partialOutputTensorOp, scratchTensorOp, + rewriter.getStringAttr(kernelTypeEnumParam), + rewriter.getStringAttr(memcpyFnParam), + rewriter.getStringAttr(aggregateFnParam), + rewriter.getStringAttr(outputTransformFnParam), + rewriter.getStringAttr(otTypeEnumParam), + rewriter.getI32IntegerAttr(scratchByteParam), + rewriter.getI32IntegerAttr(actualThreadCount), + getStringArrayAttr(abstractKernelParams)); + rewriter.replaceOp(conv2DOp, newConv2DV2Op.getOutput()); + + return success(); +} + +namespace { +// Replace with XC Conv2D pass +struct ReplaceConv2D + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplaceConv2D) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry + .insert(); + } + StringRef getArgument() const final { return "xcore-replace-conv2d"; } + StringRef getDescription() const final { + return "Replace Conv2D with XC Conv2D pass"; + } + void runOnOperation() override; +}; + +DenseElementsAttr getCompressedFloats(PatternRewriter &rewriter, + Value floatVal) { + auto constOp = dyn_cast(floatVal.getDefiningOp()); + auto floats = constOp.getValue().cast(); + std::vector uint8Vector; + int k = 0; + for (auto &i : floats.getRawData()) { + if (k % 4 == 0) { + uint8Vector.push_back(0); + } else { + uint8Vector.push_back(i); + } + k++; + } + + ShapedType compressedFloatsType = + RankedTensorType::get({static_cast(uint8Vector.size())}, + rewriter.getIntegerType(8, /*signed=*/false)); + auto compressedFloatsAttr = + DenseElementsAttr::get(compressedFloatsType, uint8Vector); + return compressedFloatsAttr; +} + +bool isBetaFloatEnabled() { return enableBetaFloatOption; } + +namespace convpatterns { +#include "Transforms/GeneratedConvPatterns.inc" +} + +namespace convrevertpatterns { +#include "Transforms/GeneratedConvRevertPatterns.inc" +} + +void ReplaceConv2D::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + + // Apply patterns to lower TFL Conv to XC Fake Conv ops + // This helps in pattern matching only types we support for xcore such as QI8 + // and for handling issues such as EXPLICIT padding which is not supported in + // TFL Conv ops + RewritePatternSet patterns1(ctx); + convpatterns::populateWithGenerated(patterns1); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns1)); + + // Replace with XC Conv2D op + RewritePatternSet patterns2(ctx); + std::unordered_set errorOpsSet; + patterns2.insert(&errorOpsSet, ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns2)); + + // Revert remaining XC Fake Conv ops back to TFL Conv2D ops + RewritePatternSet patterns3(ctx); + convrevertpatterns::populateWithGenerated(patterns3); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns3)); + + // Store as an attribute in the module +} +} // namespace + +// Creates an instance of the ReplaceConv2D pass. +std::unique_ptr> createReplaceConv2DPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplaceFCWithConv2D.cpp b/xformer/Transforms/ReplaceFCWithConv2D.cpp new file mode 100644 index 000000000..df359bf39 --- /dev/null +++ b/xformer/Transforms/ReplaceFCWithConv2D.cpp @@ -0,0 +1,179 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Utils/Util.h" + +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +namespace { +// Replace suitable TFL FullyConnected with TFL Conv2D for XCore. +struct ReplaceFCWithConv2D + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplaceFCWithConv2D) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-replace-fc-with-conv2d"; } + StringRef getDescription() const final { + return "Replace suitable TFL FullyConnected with TFL Conv2D"; + } + void runOnOperation() override; +}; + +struct ReplaceFCWithConv2DPattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::FullyConnectedOp fcOp, + PatternRewriter &rewriter) const override { + auto fcInputElementType = + fcOp.getInput().getType().cast().getElementType(); + auto fcFilterElementType = + fcOp.getFilter().getType().cast().getElementType(); + + // Check for invalid types and return + // Input type must be QI8 or QI16 + if (!utils::isNBitSignedQType<8>(fcInputElementType) && + !utils::isNBitSignedQType<16>(fcInputElementType)) + return failure(); + + if (!utils::isNBitSignedQType<8>(fcFilterElementType)) + return failure(); + + // If bias exists, it must be QI32 + if (auto biasType = fcOp.getBias().getType().dyn_cast()) { + if (!utils::isNBitSignedQType<32>(biasType.getElementType())) + return failure(); + } + + if (fcOp.getWeightsFormat() != "DEFAULT") { + return failure(); + } + + // Add a ReshapeOp before Conv2D for expanding input to 4 dims + auto inputType = fcOp.getInput().getType().cast(); + int spatialInDim = inputType.getRank() - 2; + int channelInDim = inputType.getRank() - 1; + + std::vector expandedInputShapeVector = { + 1LL, 1LL, + inputType.isDynamicDim(spatialInDim) + ? 1 + : inputType.getShape()[spatialInDim], + inputType.getShape()[channelInDim]}; + auto expandedInputResultType = RankedTensorType::get( + expandedInputShapeVector, inputType.getElementType()); + + std::vector expandedReshapeConstantVector = { + 1, 1, + static_cast(inputType.isDynamicDim(spatialInDim) + ? 1 + : inputType.getDimSize(spatialInDim)), + static_cast(inputType.getDimSize(channelInDim))}; + RankedTensorType expandedShapeType = + RankedTensorType::get({4}, rewriter.getI32Type()); + auto expandedShapeConstantOp = rewriter.create( + fcOp.getLoc(), expandedShapeType, + DenseIntElementsAttr::get(expandedShapeType, + expandedReshapeConstantVector)); + auto reshapeInputOp = rewriter.create( + fcOp.getLoc(), expandedInputResultType, fcOp.getInput(), + expandedShapeConstantOp); + + // Expand filter to 4 dims + auto filterQConstOp = + dyn_cast(fcOp.getFilter().getDefiningOp()); + auto filter = filterQConstOp.getValue().cast(); + auto filterType = fcOp.getFilter().getType().cast(); + std::vector expandedFilterVector = {filterType.getShape()[0], 1, 1, + filterType.getShape()[1]}; + auto expandedFilterType = RankedTensorType::get( + expandedFilterVector, filterType.getElementType()); + auto expandedFilterQConstOp = rewriter.create( + fcOp.getLoc(), mlir::TypeAttr::get(expandedFilterType), filter); + + // Add a Conv2D to replace the FC + auto result0Type = fcOp.getResult(0).getType().cast(); + int spatialOutDim = result0Type.getRank() - 2; + int channelOutDim = result0Type.getRank() - 1; + std::vector expandedResultVector = { + 1, 1, + result0Type.isDynamicDim(spatialOutDim) + ? 1 + : result0Type.getShape()[spatialOutDim], + result0Type.getShape()[channelOutDim]}; + auto expandedResultType = RankedTensorType::get( + expandedResultVector, result0Type.getElementType()); + auto newConv2DOp = rewriter.create( + fcOp.getLoc(), expandedResultType, reshapeInputOp, + expandedFilterQConstOp, fcOp.getBias(), 1, 1, + fcOp.getFusedActivationFunction(), "VALID", 1, 1); + + // Add a ReshapeOp after Conv2D for squeezing output back to 2 or 3 dims + auto newConv2DOutputType = + newConv2DOp.getOutput().getType().cast(); + std::vector squeezedOutputShapeVector; + std::vector squeezedReshapeConstantVector; + RankedTensorType squeezedShapeType; + // If three output dimensions for the fully connected + if (result0Type.getRank() == 3) { + squeezedOutputShapeVector = {1, result0Type.getShape()[spatialOutDim], + result0Type.getShape()[channelOutDim]}; + squeezedReshapeConstantVector = { + 1, + static_cast(newConv2DOutputType.isDynamicDim(2) + ? 1 + : newConv2DOutputType.getDimSize(2)), + static_cast(newConv2DOutputType.getDimSize(3))}; + squeezedShapeType = RankedTensorType::get({3}, rewriter.getI32Type()); + } else { + squeezedOutputShapeVector = {result0Type.getShape()[spatialOutDim], + result0Type.getShape()[channelOutDim]}; + squeezedReshapeConstantVector = { + static_cast(newConv2DOutputType.isDynamicDim(2) + ? 1 + : newConv2DOutputType.getDimSize(2)), + static_cast(newConv2DOutputType.getDimSize(3))}; + squeezedShapeType = RankedTensorType::get({2}, rewriter.getI32Type()); + } + + auto squeezedOutputResultType = RankedTensorType::get( + squeezedOutputShapeVector, newConv2DOutputType.getElementType()); + auto squeezedShapeConstantOp = rewriter.create( + fcOp.getLoc(), squeezedShapeType, + DenseIntElementsAttr::get(squeezedShapeType, + squeezedReshapeConstantVector)); + auto reshapeOutputOp = rewriter.create( + fcOp.getLoc(), squeezedOutputResultType, newConv2DOp.getOutput(), + squeezedShapeConstantOp); + + // Replace the FC with the new ops + rewriter.replaceOp(fcOp, reshapeOutputOp.getOutput()); + + return success(); + } +}; + +void ReplaceFCWithConv2D::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + + RewritePatternSet patterns(ctx); + patterns.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ReplaceFCWithConv2D pass. +std::unique_ptr> createReplaceFCWithConv2DPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplaceMaxPool2D.cpp b/xformer/Transforms/ReplaceMaxPool2D.cpp new file mode 100644 index 000000000..146cedfe7 --- /dev/null +++ b/xformer/Transforms/ReplaceMaxPool2D.cpp @@ -0,0 +1,131 @@ +#include "IR/XCoreOps.h" +#include "Transforms/Options.h" + +#include "Utils/ThreadSupport.h" +#include "lib_nn/api/AbstractKernel.hpp" +#include "lib_nn/api/AggregateFn.hpp" +#include "lib_nn/api/MemCpyFn.hpp" +#include "lib_nn/api/OutputTransformFn.hpp" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +namespace { +struct ReplaceMaxPool2D + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplaceMaxPool2D) + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-replace-maxpool2d"; } + StringRef getDescription() const final { + return "Replace TFL MaxPool2D with MaxPool2D for XCore."; + } + void runOnOperation() override; +}; + +struct ReplaceMaxPool2DPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::MaxPool2DOp mPoolOp, + PatternRewriter &rewriter) const override { + auto inputType = + mPoolOp.getInput().getType().template dyn_cast(); + auto outputType = + mPoolOp.getOutput().getType().template dyn_cast(); + auto inputHeight = inputType.getDimSize(1); + auto inputWidth = inputType.getDimSize(2); + auto inputDepth = inputType.getDimSize(3); + auto outputHeight = outputType.getDimSize(1); + auto outputWidth = outputType.getDimSize(2); + auto outputDepth = outputType.getDimSize(3); + // Input depth must be multiple of four + if (inputDepth % 4 != 0) { + return failure(); + } + auto splits = utils::getImageRegionThreadSplits( + threadCountOption, outputHeight, outputWidth, outputDepth); + + auto actualThreadCount = splits.size(); + // Create a string array attr from a vector of strings + auto getStringArrayAttr = [&](llvm::SmallVector value) { + auto attrs = llvm::to_vector<8>( + llvm::map_range(value, [&](std::string v) -> Attribute { + return rewriter.getStringAttr(v); + })); + return rewriter.getArrayAttr(attrs); + }; + int32_t scratchByteParam = + nn::MatMulInt8::get_scratch_mem_bytes(mPoolOp.getFilterWidth() * + mPoolOp.getFilterHeight()) + + 32; //[asj] FIXME + nn::ImageGeometry X(inputHeight, inputWidth, inputDepth); + nn::ImageGeometry Y(outputHeight, outputWidth, outputDepth); + llvm::SmallVector akp; + for (auto ®ion : splits) { + nn::ImageRegion ir(region[0], region[1], region[2], region[3], region[4], + region[5]); + nn::AbstractKernel ak(Y, ir, VPU_INT8_ACC_PERIOD); + auto akParams = ak.getParams(); + auto akpStr = std::string((char *)&akParams, sizeof(akParams)); + akp.push_back(akpStr); + } + nn::ImageRegion ir(0, 0, 0, outputHeight, outputWidth, outputDepth); + nn::WindowGeometry window( + mPoolOp.getFilterHeight(), mPoolOp.getFilterWidth(), 1, 0, 0, + mPoolOp.getStrideH(), mPoolOp.getStrideW(), 1, 1, 1); + nn::DerefInputFn mf(X, window); + nn::MatMulDirectFn_DW af(X, window); + // TODO + nn::OT_int8_channelwise ot(outputDepth, 0); + auto mfParams = mf.getParams(); + auto afParams = af.getParams(); + auto otParams = ot.getParams(); + auto mfStr = std::string((char *)&mfParams, sizeof(mfParams)); + auto afStr = std::string((char *)&afParams, sizeof(afParams)); + auto otStr = std::string((char *)&otParams, sizeof(otParams)); + + // Create scratch buffer tensor + Value scratchTensorOp; + // Create scratch buffer space for all threads + int32_t scratchBufferSize = scratchByteParam * actualThreadCount; + if (scratchBufferSize > 0) { + ShapedType scratchType = + RankedTensorType::get({static_cast(scratchBufferSize)}, + rewriter.getIntegerType(8)); + scratchTensorOp = + rewriter.create(mPoolOp.getLoc(), scratchType); + } else { + scratchTensorOp = rewriter.create( + rewriter.getUnknownLoc(), rewriter.getNoneType(), + rewriter.getUnitAttr()); + } + + auto xcMaxPool2DOp = rewriter.create( + mPoolOp.getLoc(), mPoolOp.getType(), mPoolOp.getInput(), + scratchTensorOp, rewriter.getStringAttr(mfStr), + rewriter.getStringAttr(afStr), rewriter.getStringAttr(otStr), + rewriter.getI32IntegerAttr(scratchByteParam), + rewriter.getI32IntegerAttr(actualThreadCount), getStringArrayAttr(akp)); + rewriter.replaceOp(mPoolOp, xcMaxPool2DOp.getOutput()); + return success(); + } +}; + +void ReplaceMaxPool2D::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + RewritePatternSet patterns(ctx); + patterns.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace +std::unique_ptr> createReplaceMaxPoolPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplaceMean.cpp b/xformer/Transforms/ReplaceMean.cpp new file mode 100644 index 000000000..a5dc86b28 --- /dev/null +++ b/xformer/Transforms/ReplaceMean.cpp @@ -0,0 +1,134 @@ +#include "IR/XCoreOps.h" +#include "Utils/Util.h" + +extern "C" { +#include "lib_nn/api/nn_layers.h" +} +#include "mlir/IR/TypeUtilities.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" +#include "tensorflow/compiler/mlir/lite/utils/validators.h" + +namespace mlir::xcore { + +namespace { +// Replace TFL Mean with Mean or Mean16 for XCore. +struct ReplaceMean + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplaceMean) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-replace-mean"; } + StringRef getDescription() const final { + return "Replace TFL Mean with Mean or Mean16 for XCore."; + } + void runOnOperation() override; +}; + +struct ReplaceMeanPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::MeanOp meanOp, + PatternRewriter &rewriter) const override { + + auto input = meanOp.getInput(); + auto output = meanOp.getOutput(); + + DenseElementsAttr axisAttr; + if (!matchPattern(meanOp.getAxis(), m_Constant(&axisAttr))) { + return failure(); + } + auto axisValues = axisAttr.getValues(); + std::vector axis(axisValues.begin(), axisValues.end()); + int32_t minAxis = *std::min_element(axis.begin(), axis.end()); + int32_t maxAxis = *std::max_element(axis.begin(), axis.end()); + if (maxAxis - minAxis > axis.size() - 1) { + return failure(); + } + + auto inputType = input.getType().cast(); + auto outputType = output.getType().cast(); + + // Check if input and output are either int8 or int16. + bool isInt8 = utils::isNBitSignedQType<8>(inputType.getElementType()) && + utils::isNBitSignedQType<8>(outputType.getElementType()); + + bool isInt16 = utils::isNBitSignedQType<16>(inputType.getElementType()) && + utils::isNBitSignedQType<16>(outputType.getElementType()); + + if (!(isInt8 || isInt16)) { + return failure(); + } + + auto inputShape = inputType.getShape(); + int rank = inputShape.size(); + + int beginDims = 1; + for (int i = 0; i < minAxis; i++) { + beginDims *= inputShape[i]; + } + + int endDims = 1; + for (int i = maxAxis + 1; i < rank; i++) { + endDims *= inputShape[i]; + } + + int meanDims = 1; + for (int i = minAxis; i <= maxAxis; i++) { + meanDims *= inputShape[i]; + } + + auto inputQType = utils::getQType(input); + auto outputQType = utils::getQType(output); + + float scaleMul = inputQType.getScale() / outputQType.getScale() / + static_cast(meanDims); + auto scaleMulAttr = rewriter.getF32FloatAttr(scaleMul); + + auto beginDimsAttr = rewriter.getI32IntegerAttr(beginDims); + auto endDimsAttr = rewriter.getI32IntegerAttr(endDims); + auto meanDimsAttr = rewriter.getI32IntegerAttr(meanDims); + + if (isInt8) { + float inZeroPoint = static_cast(inputQType.getZeroPoint()); + float outZeroPoint = static_cast(outputQType.getZeroPoint()); + auto inZeroPointAttr = rewriter.getF32FloatAttr(inZeroPoint); + auto outZeroPointAttr = rewriter.getF32FloatAttr(outZeroPoint); + + auto xcMeanOp = rewriter.create( + meanOp.getLoc(), meanOp.getType(), meanOp.getInput(), beginDimsAttr, + meanDimsAttr, endDimsAttr, inZeroPointAttr, outZeroPointAttr, + scaleMulAttr); + rewriter.replaceOp(meanOp, xcMeanOp.getOutput()); + } else { // isInt16 + // Zero points are always zero for int16 and are not passed to Mean16Op. + auto xcMeanOp = rewriter.create( + meanOp.getLoc(), meanOp.getType(), meanOp.getInput(), beginDimsAttr, + meanDimsAttr, endDimsAttr, scaleMulAttr); + rewriter.replaceOp(meanOp, xcMeanOp.getOutput()); + } + + return success(); + } +}; + +void ReplaceMean::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + RewritePatternSet patterns(ctx); + patterns.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ReplaceMean pass. +std::unique_ptr> createReplaceMeanPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplaceMul.cpp b/xformer/Transforms/ReplaceMul.cpp new file mode 100644 index 000000000..9eee21f35 --- /dev/null +++ b/xformer/Transforms/ReplaceMul.cpp @@ -0,0 +1,85 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "IR/XCoreOps.h" +#include "Utils/Util.h" + +extern "C" { +#include "lib_nn/api/nn_layers.h" +} +#include "mlir/IR/TypeUtilities.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" +#include "tensorflow/compiler/mlir/lite/utils/validators.h" + +namespace mlir::xcore { + +namespace { +// Replace TFL Mul with Mul for XCore. +struct ReplaceMul + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplaceMul) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-replace-mul"; } + StringRef getDescription() const final { + return "Replace TFL Mul with Mul for XCore."; + } + void runOnOperation() override; +}; + +struct ReplaceMulPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::MulOp mulOp, + PatternRewriter &rewriter) const override { + + if (!utils::checkBinaryCompatibility(mulOp)) + return failure(); + + auto lhsQType = utils::getQType(mulOp.getLhs()); + auto lhsScale = lhsQType.getScale(); + auto lhsZeroPoint = lhsQType.getZeroPoint(); + + auto rhsQType = utils::getQType(mulOp.getRhs()); + auto rhsScale = rhsQType.getScale(); + auto rhsZeroPoint = rhsQType.getZeroPoint(); + + auto outputQType = utils::getQType(mulOp.getOutput()); + auto outputScale = outputQType.getScale(); + auto outputZeroPoint = outputQType.getZeroPoint(); + + nn_mul_params_t mp; + mul_boggle(&mp, lhsScale, rhsScale, outputScale, lhsZeroPoint, rhsZeroPoint, + outputZeroPoint); + auto mpStr = std::string((char *)&mp, sizeof(nn_mul_params_t)); + + auto xcMulOp = + rewriter.create(mulOp.getLoc(), mulOp.getType(), mulOp.getLhs(), + mulOp.getRhs(), rewriter.getStringAttr(mpStr)); + rewriter.replaceOp(mulOp, xcMulOp.getOutput()); + + return success(); + } +}; + +void ReplaceMul::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + RewritePatternSet patterns(ctx); + patterns.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ReplaceMul pass. +std::unique_ptr> createReplaceMulPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplacePad.cpp b/xformer/Transforms/ReplacePad.cpp new file mode 100644 index 000000000..0a8dfd34e --- /dev/null +++ b/xformer/Transforms/ReplacePad.cpp @@ -0,0 +1,165 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "IR/XCoreOps.h" + +#include "Utils/Util.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +extern "C" { +#include "lib_nn/api/nn_layers.h" +#include "lib_nn/api/vpu_memset_256.h" +} + +namespace mlir::xcore { + +namespace { + +// Replace TFL Pad with Pad for XCore. +struct ReplacePad + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplacePad) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-replace-pad"; } + StringRef getDescription() const final { + return "Replace TFL Pad with Pad for XCore."; + } + void runOnOperation() override; +}; + +template +struct ReplacePadPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(PadOrPadV2Op padOp, + PatternRewriter &rewriter) const override { + + auto inputType = + padOp.getInput().getType().template cast(); + auto outputType = + padOp.getOutput().getType().template cast(); + + if (!inputType.hasStaticShape()) { + return failure(); + } + + if (utils::checkSliceNoOp(inputType, outputType)) { + rewriter.replaceOp(padOp, padOp.getInput()); + return success(); + } + + // If the input is a constant, LLVM's Canonicalizer will + // fold the pad into a constant later. + if (matchPattern(padOp.getInput(), m_Constant()) || + matchPattern(padOp.getInput(), m_Op())) { + return failure(); + } + + DenseElementsAttr paddingAttr; + matchPattern(padOp.getPadding(), m_Constant(&paddingAttr)); + auto paddingValues = paddingAttr.getValues(); + + std::vector paddingValuesStart; + std::vector paddingValuesEnd; + for (int i = 0; i < paddingValues.size(); i += 2) + paddingValuesStart.push_back(paddingValues[i]); + for (int i = 1; i < paddingValues.size(); i += 2) + paddingValuesEnd.push_back(paddingValues[i]); + auto inputShape = inputType.getShape(); + auto outputShape = outputType.getShape(); + std::vector inShapeVec(inputShape.begin(), inputShape.end()); + std::vector outShapeVec(outputShape.begin(), outputShape.end()); + + // Assuming we can translate the pad op to reshape -> pad -> reshape + // such that the number of dimensions of the pad in the middle is as small + // as possible, rank would represent that number of dimensions. + int rank = utils::mergeAxes(paddingValuesStart, paddingValuesEnd, + inShapeVec, outShapeVec, inputType.getRank()); + + if (rank > 2) + return failure(); + + Type elementType = inputType.getElementType(); + const size_t dtype_size = utils::getTypeSize(elementType); + paddingValuesStart[rank - 1] *= dtype_size; + paddingValuesEnd[rank - 1] *= dtype_size; + outShapeVec[rank - 1] *= dtype_size; + inShapeVec[rank - 1] *= dtype_size; + + int32_t zero_point = 0; + + if (elementType.isa()) { + if (auto padV2Op = dyn_cast(padOp.getOperation())) { + auto pQConstOp = dyn_cast( + padV2Op.getConstantValues().getDefiningOp()); + auto attr = pQConstOp.getValue().template cast(); + if (attr.getNumElements() != 1) { + return failure(); + } + auto padVector = + std::vector{attr.template getValues().begin(), + attr.template getValues().end()}; + zero_point = BROADCAST_8_TO_32(padVector[0]); + } else { + auto inputQType = elementType.dyn_cast(); + zero_point = BROADCAST_8_TO_32(inputQType.getZeroPoint()); + } + } + + int32_t start, pad_size, size, num_copies, end; + if (rank == 1) { + start = paddingValuesStart[0]; + pad_size = 0; + size = inShapeVec[0]; + num_copies = 0; + end = paddingValuesEnd[0]; + } else { + // We have a special optimised Pad3to4 op for this case + if ((inShapeVec[1] == 3) && (outShapeVec[1] == 4)) + return failure(); + start = paddingValuesStart[0] * outShapeVec[1] + paddingValuesStart[1]; + pad_size = paddingValuesStart[1] + paddingValuesEnd[1]; + size = inShapeVec[1]; + num_copies = inShapeVec[0] - 1; + end = paddingValuesEnd[0] * outShapeVec[1] + paddingValuesEnd[1]; + } + bool isVpu = + start % 4 == 0 && pad_size % 4 == 0 && size % 4 == 0 && end % 4 == 0; + + auto binaryObjectPadOp = rewriter.create( + padOp.getLoc(), padOp.getType(), padOp.getInput(), + rewriter.getI32IntegerAttr(start), rewriter.getI32IntegerAttr(pad_size), + rewriter.getI32IntegerAttr(size), + rewriter.getI32IntegerAttr(num_copies), + rewriter.getI32IntegerAttr(zero_point), rewriter.getI32IntegerAttr(end), + rewriter.getBoolAttr(isVpu)); + + rewriter.replaceOp(padOp, binaryObjectPadOp.getOutput()); + + return success(); + } +}; + +void ReplacePad::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + RewritePatternSet patterns(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ReplacePad pass. +std::unique_ptr> createReplacePadPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplaceSlice.cpp b/xformer/Transforms/ReplaceSlice.cpp new file mode 100644 index 000000000..5ea407b25 --- /dev/null +++ b/xformer/Transforms/ReplaceSlice.cpp @@ -0,0 +1,133 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "IR/XCoreOps.h" + +#include "Utils/Util.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +extern "C" { +#include "lib_nn/api/nn_layers.h" +} + +namespace mlir::xcore { + +namespace { + +// Replace TFL Slice with Slice for XCore. +struct ReplaceSlice + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplaceSlice) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-replace-slice"; } + StringRef getDescription() const final { + return "Replace TFL Slice with Slice for XCore."; + } + void runOnOperation() override; +}; + +struct ReplaceSlicePattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::SliceOp sliceOp, + PatternRewriter &rewriter) const override { + + auto inputType = sliceOp.getInput().getType().cast(); + auto outputType = sliceOp.getOutput().getType().cast(); + + if (!inputType.hasStaticShape()) + return failure(); + + if (utils::checkSliceNoOp(inputType, outputType)) { + rewriter.replaceOp(sliceOp, sliceOp.getInput()); + return success(); + } + + // If the input is a constant, LLVM's Canonicalizer will + // fold the slice into a constant later. + if (matchPattern(sliceOp.getInput(), m_Constant()) || + matchPattern(sliceOp.getInput(), m_Op())) { + return failure(); + } + + Type inputElementType = inputType.getElementType(); + + DenseElementsAttr beginAttr; + matchPattern(sliceOp.getBegin(), m_Constant(&beginAttr)); + auto beginValues = beginAttr.getValues(); + + DenseElementsAttr sizeAttr; + matchPattern(sliceOp.getSize(), m_Constant(&sizeAttr)); + auto sizeValues = sizeAttr.getValues(); + + auto inShape = inputType.getShape(); + auto outShape = outputType.getShape(); + + std::vector begin(beginValues.begin(), beginValues.end()); + std::vector sizes(sizeValues.begin(), sizeValues.end()); + std::vector inShapeVec(inShape.begin(), inShape.end()); + std::vector outShapeVec(outShape.begin(), outShape.end()); + + // Assuming we can translate the slice op to reshape -> slice -> reshape + // such that the number of dimensions of the slice in the middle is as small + // as possible, rank would represent that number of dimensions. + int rank = utils::mergeAxes(begin, sizes, inShapeVec, outShapeVec, + inputType.getRank()); + + if (rank > 2) + return failure(); + + const size_t dtype_size = utils::getTypeSize(inputElementType); + begin[rank - 1] *= dtype_size; + sizes[rank - 1] *= dtype_size; + inShapeVec[rank - 1] *= dtype_size; + outShapeVec[rank - 1] *= dtype_size; + + int32_t start, offset, size, num_copies; + if (rank == 1) { + start = begin[0]; + offset = inShapeVec[0]; + size = outShapeVec[0]; + num_copies = 1; + } else { + start = begin[0] * inShapeVec[1] + begin[1]; + offset = inShapeVec[1]; + size = outShapeVec[1]; + num_copies = outShapeVec[0]; + } + + bool isVpu = start % 4 == 0 && size % 4 == 0 && offset % 4 == 0; + auto binaryObjectSliceOp = rewriter.create( + sliceOp.getLoc(), sliceOp.getType(), sliceOp.getInput(), + rewriter.getI32IntegerAttr(start), rewriter.getI32IntegerAttr(offset), + rewriter.getI32IntegerAttr(size), + rewriter.getI32IntegerAttr(num_copies), rewriter.getBoolAttr(isVpu)); + + rewriter.replaceOp(sliceOp, binaryObjectSliceOp.getOutput()); + + return success(); + } +}; + +void ReplaceSlice::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + RewritePatternSet patterns(ctx); + patterns.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ReplaceSlice pass. +std::unique_ptr> createReplaceSlicePass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplaceStridedSlice.cpp b/xformer/Transforms/ReplaceStridedSlice.cpp new file mode 100644 index 000000000..c5db1c32d --- /dev/null +++ b/xformer/Transforms/ReplaceStridedSlice.cpp @@ -0,0 +1,163 @@ +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +namespace { +// Replace TFL StridedSlice with TFL Slice wherever possible. +struct ReplaceStridedSlice + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplaceStridedSlice) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-replace-stridedslice"; } + StringRef getDescription() const final { + return "Replace TFL StridedSlice with StridedSlice for XCore."; + } + void runOnOperation() override; +}; + +// Utility to check if a StridedSliceOp can be replaced with a SliceOp +bool canReplaceWithSlice(TFL::StridedSliceOp stridedSliceOp) { + // Check input shape is static + auto inputType = stridedSliceOp.getInput().getType().dyn_cast(); + if (!inputType || !inputType.hasStaticShape()) { + return false; + } + + // Check all strides are 1 + DenseIntElementsAttr stridesAttr; + matchPattern(stridedSliceOp.getStrides(), m_Constant(&stridesAttr)); + if (!stridesAttr) + return false; + for (auto stride : stridesAttr) + if (!stride.isOne()) + return false; + + if (stridedSliceOp.getEllipsisMask() != 0 || + stridedSliceOp.getNewAxisMask() != 0) { + return false; + } + return true; +} + +struct ReplaceStridedSlicePattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::StridedSliceOp stridedSliceOp, + PatternRewriter &rewriter) const override { + + if (!canReplaceWithSlice(stridedSliceOp)) + return failure(); + + auto inputType = + stridedSliceOp.getInput().getType().dyn_cast(); + auto rank = inputType.getRank(); + + // Get begin/end attributes + DenseIntElementsAttr beginAttr; + matchPattern(stridedSliceOp.getBegin(), m_Constant(&beginAttr)); + if (!beginAttr) + return failure(); + auto begin = beginAttr.getValues(); + + DenseIntElementsAttr endAttr; + matchPattern(stridedSliceOp.getEnd(), m_Constant(&endAttr)); + if (!beginAttr) + return failure(); + auto end = endAttr.getValues(); + + std::vector newBegin(rank), newSize(rank); + + // If mask is set, set begin and end to 0 and input shape + // respectively + // If mask is not set, set begin and end to the actual values + // If the value is negative, it means size - value + // StridedSliceOp has an end attribute, SliceOp has size + // Size is end - begin. + for (int i = 0; i < rank; i++) { + if (stridedSliceOp.getBeginMask() & (1 << i)) + newBegin[i] = 0; + else + newBegin[i] = + begin[i] < 0 ? inputType.getShape()[i] + begin[i] : begin[i]; + if (stridedSliceOp.getEndMask() & (1 << i)) + newSize[i] = inputType.getShape()[i] - newBegin[i]; + else { + auto currentEnd = + end[i] < 0 ? inputType.getShape()[i] + end[i] : end[i]; + newSize[i] = currentEnd - newBegin[i]; + } + } + int64_t shrinkMask = stridedSliceOp.getShrinkAxisMask(); + std::vector newOutputShape; + for (int i = 0; i < rank; ++i) { + if (!(shrinkMask & (1 << i))) { // Check if we should NOT shrink + newOutputShape.push_back(newSize[i]); // Retain size + } + } + + auto shapeAttrType = + RankedTensorType::get({rank}, rewriter.getIntegerType(32)); + + // create constant ops for begin and size + auto beginConstantOp = rewriter.create( + stridedSliceOp.getLoc(), shapeAttrType, + DenseIntElementsAttr::get(shapeAttrType, newBegin)); + auto sizeConstantOp = rewriter.create( + stridedSliceOp.getLoc(), shapeAttrType, + DenseIntElementsAttr::get(shapeAttrType, newSize)); + + // RankedTensorType needs int64_t + std::vector newSize64(newSize.begin(), newSize.end()); + + // create sliceOp + auto sliceOp = rewriter.create( + stridedSliceOp.getLoc(), + RankedTensorType::get(ArrayRef(newSize64), + stridedSliceOp.getType().getElementType()), + stridedSliceOp.getInput(), beginConstantOp, sizeConstantOp); + + // add reshape if shrinkMask is not 0 + if (shrinkMask != 0) { + auto newShapeAttrType = + RankedTensorType::get({static_cast(newOutputShape.size())}, + rewriter.getIntegerType(32)); + auto shapeConstantOp = rewriter.create( + stridedSliceOp.getLoc(), newShapeAttrType, + DenseIntElementsAttr::get(newShapeAttrType, newOutputShape)); + std::vector newOutputShape64(newOutputShape.begin(), + newOutputShape.end()); + auto newOutputType = RankedTensorType::get( + newOutputShape64, sliceOp.getType().getElementType()); + auto reshape = rewriter.create( + stridedSliceOp.getLoc(), newOutputType, sliceOp, shapeConstantOp); + rewriter.replaceOp(stridedSliceOp, reshape.getOutput()); + } else { + rewriter.replaceOp(stridedSliceOp, sliceOp.getOutput()); + } + return success(); + } +}; + +void ReplaceStridedSlice::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + RewritePatternSet patterns(ctx); + patterns.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ReplaceStridedSlice pass. +std::unique_ptr> createReplaceStridedSlicePass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplaceSum.cpp b/xformer/Transforms/ReplaceSum.cpp new file mode 100644 index 000000000..b5a788401 --- /dev/null +++ b/xformer/Transforms/ReplaceSum.cpp @@ -0,0 +1,133 @@ +#include "IR/XCoreOps.h" +#include "Utils/Util.h" + +extern "C" { +#include "lib_nn/api/nn_layers.h" +} +#include "mlir/IR/TypeUtilities.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" +#include "tensorflow/compiler/mlir/lite/utils/validators.h" + +namespace mlir::xcore { + +namespace { +// Replace TFL Sum with Mean or Mean16 for XCore. +struct ReplaceSum + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplaceSum) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-replace-sum"; } + StringRef getDescription() const final { + return "Replace TFL Sum with Mean or Mean16 for XCore."; + } + void runOnOperation() override; +}; + +struct ReplaceSumPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::SumOp sumOp, + PatternRewriter &rewriter) const override { + + auto input = sumOp.getInput(); + auto output = sumOp.getOutput(); + + DenseElementsAttr axisAttr; + matchPattern(sumOp.getAxes(), m_Constant(&axisAttr)); + auto axisValues = axisAttr.getValues(); + std::vector axis(axisValues.begin(), axisValues.end()); + int32_t minAxis = *std::min_element(axis.begin(), axis.end()); + int32_t maxAxis = *std::max_element(axis.begin(), axis.end()); + if (maxAxis - minAxis > axis.size() - 1) { + return failure(); + } + + auto inputType = input.getType().cast(); + auto outputType = output.getType().cast(); + + // Check if input and output are either int8 or int16. + bool isInt8 = utils::isNBitSignedQType<8>(inputType.getElementType()) && + utils::isNBitSignedQType<8>(outputType.getElementType()); + + bool isInt16 = utils::isNBitSignedQType<16>(inputType.getElementType()) && + utils::isNBitSignedQType<16>(outputType.getElementType()); + + if (!(isInt8 || isInt16)) { + return failure(); + } + + auto inputShape = inputType.getShape(); + auto outputShape = outputType.getShape(); + + int rank = inputShape.size(); + + int beginDims = 1; + for (int i = 0; i < minAxis; i++) { + beginDims *= inputShape[i]; + } + + int endDims = 1; + for (int i = maxAxis + 1; i < rank; i++) { + endDims *= inputShape[i]; + } + + int sumDims = 1; + for (int i = minAxis; i <= maxAxis; i++) { + sumDims *= inputShape[i]; + } + + auto inputQType = utils::getQType(input); + auto outputQType = utils::getQType(output); + + float scaleMul = inputQType.getScale() / outputQType.getScale(); + auto scaleMulAttr = rewriter.getF32FloatAttr(scaleMul); + + auto beginDimsAttr = rewriter.getI32IntegerAttr(beginDims); + auto endDimsAttr = rewriter.getI32IntegerAttr(endDims); + auto meanDimsAttr = rewriter.getI32IntegerAttr(sumDims); + + if (isInt8) { + float inZeroPoint = static_cast(inputQType.getZeroPoint()); + float outZeroPoint = static_cast(outputQType.getZeroPoint()); + auto inZeroPointAttr = rewriter.getF32FloatAttr(inZeroPoint); + auto outZeroPointAttr = rewriter.getF32FloatAttr(outZeroPoint); + + auto xcSumOp = rewriter.create( + sumOp.getLoc(), sumOp.getType(), sumOp.getInput(), beginDimsAttr, + meanDimsAttr, endDimsAttr, inZeroPointAttr, outZeroPointAttr, + scaleMulAttr); + rewriter.replaceOp(sumOp, xcSumOp.getOutput()); + } else { // isInt16 + // Zero points are always zero for int16 and are not passed to Mean16Op. + auto xcSumOp = rewriter.create( + sumOp.getLoc(), sumOp.getType(), sumOp.getInput(), beginDimsAttr, + meanDimsAttr, endDimsAttr, scaleMulAttr); + rewriter.replaceOp(sumOp, xcSumOp.getOutput()); + } + + return success(); + } +}; + +void ReplaceSum::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + RewritePatternSet patterns(ctx); + patterns.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ReplaceSum pass. +std::unique_ptr> createReplaceSumPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplaceTranspose.cpp b/xformer/Transforms/ReplaceTranspose.cpp new file mode 100644 index 000000000..2e1c9f8a8 --- /dev/null +++ b/xformer/Transforms/ReplaceTranspose.cpp @@ -0,0 +1,192 @@ +// Replace TFL Transpose with Transpose for XCore. +#include "IR/XCoreOps.h" +#include "Utils/Util.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +namespace { + +// Replace TFL Transpose with xcore Transpose for XCore. +struct ReplaceTranspose + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplaceTranspose) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-replace-transpose"; } + StringRef getDescription() const final { + return "Replace TFL Transpose with xcore Transpose for XCore."; + } + void runOnOperation() override; +}; + +int twoConsecutive(const SmallVector &perm) { + for (int i = 0; i < (int)perm.size() - 1; ++i) { + if (perm[i] + 1 == perm[i + 1]) { + return i; // Return the index i, not perm[i] + } + } + return -1; +} + +struct ReplaceTransposePattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::TransposeOp transposeOp, + PatternRewriter &rewriter) const override { + + auto inputType = + transposeOp.getInput().getType().dyn_cast(); + if (!inputType || !inputType.hasStaticShape()) + return failure(); + + ArrayRef inputShape = inputType.getShape(); + int64_t rank = inputShape.size(); + + Value permValue = transposeOp.getPerm(); + DenseIntElementsAttr permAttr; + if (!matchPattern(permValue, m_Constant(&permAttr))) { + return failure(); + } + + SmallVector perm; + for (auto val : permAttr.getValues()) { + perm.push_back(val.getSExtValue()); + } + + SmallVector reducedShape; + SmallVector reducedPerm; + { + SmallVector oldToNew; + oldToNew.reserve(rank); + for (int i = 0; i < rank; ++i) { + if (inputShape[i] != 1) { + oldToNew.push_back((int)reducedShape.size()); + reducedShape.push_back(inputShape[i]); + } else { + oldToNew.push_back(-1); + } + } + + for (auto p : perm) { + if (oldToNew[p] != -1) { + reducedPerm.push_back(oldToNew[p]); + } + } + + if (reducedShape.empty()) { + reducedShape.push_back(1); + reducedPerm.push_back(0); + } + } + + const size_t dtype_size = utils::getTypeSize(inputType.getElementType()); + if (dtype_size != 1) { + reducedShape.push_back((int64_t)dtype_size); + reducedPerm.push_back((int64_t)reducedShape.size() - 1); + } + auto mergeConsecutiveDims = [&](SmallVector &shape, + SmallVector &perm) { + while (true) { + int i = twoConsecutive(perm); + if (i == -1) + break; + int64_t p1 = perm[i]; + int64_t p2 = perm[i + 1]; + + shape[p1] *= shape[p2]; + shape.erase(shape.begin() + p2); + perm.erase(perm.begin() + i + 1); + for (int j = 0; j < (int)perm.size(); ++j) { + if (perm[j] > p2) { + perm[j] -= 1; + } + } + } + }; + + mergeConsecutiveDims(reducedShape, reducedPerm); + + if (reducedShape.size() > 4) { + return failure(); + } + + // If size of reducedShape < 4, pad with 1's at the beginning + // After padding shapes, adjust perm so that it matches + int dimCount = (int)reducedShape.size(); + int pad = 4 - dimCount; + if (pad > 0) { + // Insert 1's at the start of shape + SmallVector paddedShape; + SmallVector paddedPerm; + paddedShape.resize(4, 1); // fill with ones + for (int i = 0; i < dimCount; ++i) { + paddedShape[pad + i] = reducedShape[i]; + } + + for (int i = 0; i < pad; ++i) { + paddedPerm.push_back(i); + } + for (auto p : reducedPerm) { + paddedPerm.push_back(p + pad); + } + + reducedShape = paddedShape; + reducedPerm = paddedPerm; + } + + const int RANK = 4; + SmallVector offsets(RANK); + for (int i = 0; i < RANK; ++i) { + int32_t prod = 1; + for (int j = i + 1; j < RANK; ++j) { + prod *= (int32_t)reducedShape[j]; + } + offsets[i] = prod; + } + + SmallVector permutedOffsets(RANK); + for (int i = 0; i < RANK; ++i) { + permutedOffsets[i] = offsets[reducedPerm[i]]; + } + + // t_shape = tuple(SHAPE[p] for p in PERM) + SmallVector tShape(RANK); + for (int i = 0; i < RANK; ++i) { + tShape[i] = (int32_t)reducedShape[reducedPerm[i]]; + } + + auto outputType = transposeOp.getOutput().getType(); + auto newTransposeOp = rewriter.create( + transposeOp.getLoc(), outputType, transposeOp.getInput(), + rewriter.getI32ArrayAttr(permutedOffsets), + rewriter.getI32ArrayAttr(tShape)); + + rewriter.replaceOp(transposeOp, newTransposeOp.getResult()); + + return success(); + } +}; + +void ReplaceTranspose::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + RewritePatternSet patterns(ctx); + patterns.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} + +} // namespace + +// Creates an instance of the ReplaceTranspose pass. +std::unique_ptr> createReplaceTransposePass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/ReplaceTransposeConv.cpp b/xformer/Transforms/ReplaceTransposeConv.cpp new file mode 100644 index 000000000..995eac602 --- /dev/null +++ b/xformer/Transforms/ReplaceTransposeConv.cpp @@ -0,0 +1,252 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "IR/XCoreOps.h" +#include "Utils/Util.h" + +#include "lib_nn/api/TransposeConv.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +namespace { +// Replace TFL TransposeConv with Conv for XCore. +struct ReplaceTransposeConv + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ReplaceTransposeConv) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-replace-transposeconv"; } + StringRef getDescription() const final { + return "Replace TFL TransposeConv with Conv for XCore."; + } + void runOnOperation() override; +}; + +struct ReplaceTransposeConvPattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(TFL::TransposeConvOp tConvOp, + PatternRewriter &rewriter) const override { + // Check for invalid types and return + // Input type must be QI8 or QI16 + auto inputElementType = + tConvOp.getInput().getType().cast().getElementType(); + auto weightsElementType = + tConvOp.getWeights().getType().cast().getElementType(); + auto outputElementType = + tConvOp.getOutput().getType().cast().getElementType(); + + if (!utils::isNBitSignedQType<8>(inputElementType) && + !utils::isNBitSignedQType<16>(inputElementType)) + return failure(); + + if (!utils::isNBitSignedQType<8>(weightsElementType)) + return failure(); + + if (!utils::isNBitSignedQType<8>(outputElementType) && + !utils::isNBitSignedQType<16>(outputElementType)) + return failure(); + + if (tConvOp.getPadding() != "VALID") { + return failure(); + } + + bool i16TransposeConv = false; + if (inputElementType.cast() + .getStorageTypeIntegralWidth() == 16 && + outputElementType.cast() + .getStorageTypeIntegralWidth() == 16) { + i16TransposeConv = true; + } + + auto inputType = + tConvOp.getInput().getType().template dyn_cast(); + auto outputType = + tConvOp.getOutput().getType().template dyn_cast(); + auto weightsType = + tConvOp.getWeights().getType().template dyn_cast(); + auto inputWidth = inputType.getDimSize(2); + auto inputDepth = inputType.getDimSize(3); + auto outputDepth = outputType.getDimSize(3); + auto weightsHeight = weightsType.getDimSize(1); + auto weightsWidth = weightsType.getDimSize(2); + + // Input and output depth must be multiple of four + if (inputDepth % 4 != 0 || outputDepth % 4 != 0) { + return failure(); + } + + // If int16, then input and output depth must be multiple of sixteen + if (i16TransposeConv && (inputDepth % 16 != 0 || outputDepth % 16 != 0)) { + return failure(); + } + + // Get weights values + auto weightsQConstOp = + dyn_cast(tConvOp.getWeights().getDefiningOp()); + auto weightsQConstOpType = + weightsQConstOp.getQtype().template cast(); + auto weights = + weightsQConstOp.getValue().template cast(); + auto weightsVector = + std::vector{weights.template getValues().begin(), + weights.template getValues().end()}; + + // + // + // + // + + // This is the shape of the conv2d transpose kernel + std::array original_kernel_shape = { + {static_cast(outputDepth), static_cast(weightsHeight), + static_cast(weightsWidth), static_cast(inputDepth)}}; + + std::vector convParams = transpose_conv_reorder_kernel_weights( + (int8_t *)weightsVector.data(), original_kernel_shape, + tConvOp.getStrideH(), tConvOp.getStrideW()); + + int vertical_padding = 0; + int horizontal_padding = 0; + for (ConvParams c : convParams) { + std::array sub_kernel_shape = c.kernelShape; + vertical_padding = std::max(vertical_padding, sub_kernel_shape[1] - 1); + horizontal_padding = + std::max(horizontal_padding, sub_kernel_shape[2] - 1); + } + + // + // + // Create pad op if necessary + // + // + RankedTensorType paddingsType = + RankedTensorType::get({4, 2}, rewriter.getI32Type()); + + // Pad the input depth + if (vertical_padding > 0 || horizontal_padding > 0) { + std::vector paddingsValues = {0, + 0, + vertical_padding, + vertical_padding, + horizontal_padding, + horizontal_padding, + 0, + 0}; + Value paddings = rewriter.create( + tConvOp.getLoc(), + DenseIntElementsAttr::get(paddingsType, paddingsValues)); + auto inputShape = tConvOp.getInput() + .getType() + .template cast() + .getShape(); + + auto paddedInputResultType = RankedTensorType::get( + {inputShape[0], inputShape[1] + 2 * vertical_padding, + inputShape[2] + 2 * horizontal_padding, inputShape[3]}, + tConvOp.getInput() + .getType() + .template cast() + .getElementType()); + + // Set the PadOp output as the Conv2D input + Value padOpOutput = + rewriter.create(tConvOp.getLoc(), paddedInputResultType, + tConvOp.getInput(), paddings); + // Strangely, operand 2 is the input for TFL Transpose Conv + tConvOp.setOperand(2, padOpOutput); + } + + // + // + // + // + + FakeConv2DOp prevOp = nullptr; + FakeConv2DOp currentOp = nullptr; + for (ConvParams c : convParams) { + // Calculate input offset + auto this_kernels_vertical_padding = c.kernelShape[1] - 1; + auto this_kernels_horizontal_padding = c.kernelShape[2] - 1; + auto inputOffset = + inputDepth * (horizontal_padding - this_kernels_horizontal_padding) + + (inputDepth * (vertical_padding - this_kernels_vertical_padding) * + (inputWidth + 2 * horizontal_padding)); + + // inputOffset is in bytes. + // For int16, we have to multiply by two as the offset is double that of + // int8 + inputOffset = i16TransposeConv ? inputOffset * 2 : inputOffset; + + int64_t subWeightsShape[] = {c.kernelShape[0], c.kernelShape[1], + c.kernelShape[2], c.kernelShape[3]}; + auto subWeightsResultType = RankedTensorType::get( + subWeightsShape, weightsQConstOpType.getElementType()); + auto subWeightsValueType = + RankedTensorType::get(subWeightsShape, rewriter.getIntegerType(8)); + + auto subWeightsQConstOp = rewriter.create( + tConvOp.getLoc(), mlir::TypeAttr::get(subWeightsResultType), + mlir::DenseElementsAttr::get(subWeightsValueType, + llvm::ArrayRef(c.weights))); + + auto noneValue = rewriter.create(rewriter.getUnknownLoc(), + rewriter.getNoneType(), + rewriter.getUnitAttr()); + // We want the input strides to be 1,1 and the output strides to be the + // transpose conv strides + if (!prevOp) { + currentOp = rewriter.create( + tConvOp.getLoc(), tConvOp.getType(), tConvOp.getInput(), + subWeightsQConstOp, tConvOp.getBias(), noneValue, + /*dilation_h_factor=*/1, + /*dilation_w_factor=*/1, + /*fused_activation_function=*/tConvOp.getFusedActivationFunction(), + /*padding=*/tConvOp.getPadding(), noneValue, + /*stride_h=*/1, + /*stride_w=*/1, c.subH, c.subW, tConvOp.getStrideH(), + tConvOp.getStrideW(), inputOffset); + } else { + currentOp = rewriter.create( + tConvOp.getLoc(), tConvOp.getType(), tConvOp.getInput(), + subWeightsQConstOp, tConvOp.getBias(), prevOp.getOutput(), + /*dilation_h_factor=*/1, + /*dilation_w_factor=*/1, + /*fused_activation_function=*/tConvOp.getFusedActivationFunction(), + /*padding=*/tConvOp.getPadding(), noneValue, + /*stride_h=*/1, + /*stride_w=*/1, c.subH, c.subW, tConvOp.getStrideH(), + tConvOp.getStrideW(), inputOffset); + } + prevOp = currentOp; + } + + rewriter.replaceOp(tConvOp, currentOp.getOutput()); + + return success(); + } +}; + +void ReplaceTransposeConv::runOnOperation() { + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + RewritePatternSet patterns(ctx); + patterns.insert(ctx); + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} +} // namespace + +// Creates an instance of the ReplaceTransposeConv pass. +std::unique_ptr> createReplaceTransposeConvPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/TFLPatterns.td b/xformer/Transforms/TFLPatterns.td new file mode 100644 index 000000000..eaa981181 --- /dev/null +++ b/xformer/Transforms/TFLPatterns.td @@ -0,0 +1,205 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +include "mlir/IR/PatternBase.td" +include "mlir/Dialect/Arith/IR/ArithOps.td" +include "mlir/Dialect/Func/IR/FuncOps.td" +include "tensorflow/compiler/mlir/lite/ir/tfl_ops.td" +include "tensorflow/compiler/mlir/lite/quantization/ir/QuantOps.td" +include "larq_compute_engine/mlir/ir/lce_ops.td" +include "Utils/Utils.td" + +// Fold Quantfork Stats ops which are created for 16x8 +// when quantized using TFLite convertor +def : Pat<(quantfork_StatisticsOp $input, $a, $b, $c), + (replaceWithValue $input)>; + +// Fold Reshape with constant ops +def getReshapedQuantAttr + : NativeCodeCall< + "$0.cast().reshape(quant::QuantizedType::" + "castToStorageType($1.getType()).cast())">; + +def getReshapedAttr + : NativeCodeCall<"$0.cast().reshape($1.getType().cast<" + "ShapedType>())">; + +foreach constOp = [Arith_ConstantOp, TFL_ConstOp] in { + def : Pat<(TFL_ReshapeOp:$output(constOp:$input_op $input_attr), $shape), + (constOp(getReshapedAttr $input_attr, $output))>; +} + +def : Pat<(TFL_ReshapeOp:$output(TFL_QConstOp:$op $qtype, $attr), $shape), + (TFL_QConstOp(getTypeAttrOf1WithQParamsOf0 $op, $output), + (getReshapedQuantAttr $attr, $output))>; + +// Convert Quantize(Reshape()) -> Reshape(Quantize()) +// This is to merge Quantize with Conv2D if possible +def : Pat<(TFL_QuantizeOp(TFL_ReshapeOp $input, $shape), $qtype), + (TFL_ReshapeOp + (TFL_QuantizeOp $input, (UpdateShapeWithAxis<-1> $qtype, $input)), + $shape), + [(IsQuantizedType<8> $input), (IsQuantizedType<16> $input)]>; + +// Fuse Quantize(Quantize()) -> Quantize() +def : Pat<(TFL_QuantizeOp(TFL_QuantizeOp $input, $qtype1), $qtype2), + (TFL_QuantizeOp $input, $qtype2)>; + +// Fuse Quantize(Conv2D()) -> Conv2D() +def : Pat<(TFL_QuantizeOp + (TFL_Conv2DOp $input, $f, $b, $dh, $dw, $faf, $p, $sh, $sw), + $qtype), + (TFL_Conv2DOp $input, $f, $b, $dh, $dw, $faf, $p, $sh, $sw)>; + +def : Pat<(TFL_QuantizeOp(TFL_DepthwiseConv2DOp $input, $f, $b, $dh, $dw, $faf, + $p, $sh, $sw, $dm), + $qtype), + (TFL_DepthwiseConv2DOp $input, $f, $b, $dh, $dw, $faf, $p, $sh, $sw, + $dm)>; + +// TFL_Conv2D() with SAME padding -> TFL_Conv2D(Pad()) +def : Pat<(TFL_Conv2DOp:$output TensorOf<[QI8, QI16]>:$input, + TensorOf<[QI8]>:$f, + AnyTypeOf<[TensorOf<[I32, QI32]>, NoneType]>:$b, $dh, $dw, $faf, + TFL_PAD_Same, $sh, $sw), + (TFL_Conv2DOp(TFL_PadOp $input, + (GetConv2DPaddingValues:$ret__0 $output), (returnType $ret__1)), + $f, $b, $dh, $dw, $faf, TFL_PAD_Valid, $sh, $sw)>; + +// TFL_DepthwiseConv2D() with SAME padding-> TFL_DepthwiseConv2D(Pad()) +def : Pat<(TFL_DepthwiseConv2DOp:$output TensorOf<[QI8]>:$input, + TensorOf<[QI8]>:$f, TensorOf<[I32, QI32]>:$b, $dh, $dw, $faf, + TFL_PAD_Same, $sh, $sw, $dm), + (TFL_DepthwiseConv2DOp(TFL_PadOp $input, + (GetDepthwiseConv2DPaddingValues:$ret__0 $output), + (returnType $ret__1)), + $f, $b, $dh, $dw, $faf, TFL_PAD_Valid, $sh, $sw, $dm)>; + +def getTypeAttrForSingleInt8WithQParamsOf0 + : NativeCodeCall<"mlir::TypeAttr::get(dyn_cast($0.getType().cast<" + "ShapedType>().getElementType()).castFromExpressedType(" + "RankedTensorType::get({}, rewriter.getF32Type())))">; +def getPadValueOfMinInt8 + : NativeCodeCall<"DenseElementsAttr::get(RankedTensorType::get({}, " + "rewriter.getIntegerType(8)), {-128})">; + +// TFL_MaxPool2D() with SAME padding -> TFL_MaxPool2D(Pad()) +def : Pat<(TFL_MaxPool2DOp:$output TensorOf<[QI8, QI16]>:$input, TFL_PAD_Same, + $sw, $sh, $fw, $fh, $faf), + (TFL_MaxPool2DOp(TFL_PadV2Op $input, + (GetMaxPool2DPaddingValues:$ret__0 $output), + (TFL_QConstOp(getTypeAttrForSingleInt8WithQParamsOf0 $output), + (getPadValueOfMinInt8)), + (returnType $ret__1)), + TFL_PAD_Valid, $sw, $sh, $fw, $fh, $faf)>; + +def : Pat<(TFL_ReluOp(TFL_MinimumOp $lhs, $rhs)), + (TFL_ReluOp $lhs), [(IsSplatAndEqualTo<127> $rhs)]>; + +// Merge Relu with Conv +def : Pat<(TFL_ReluOp:$output(TFL_Conv2DOp $input, $f, $b, $dh, $dw, + TFL_AF_None, $p, $sh, $sw)), + (TFL_Conv2DOp $input, $f, $b, $dh, $dw, TFL_AF_Relu, $p, $sh, $sw)>; + +// Unfuse activation functions from binary ops +// TFL Add, Sub, Mul +foreach binaryOp = [TFL_AddOp, TFL_SubOp, TFL_MulOp] in { + foreach activation = [[TFL_AF_Relu, TFL_ReluOp], [TFL_AF_Relu1, TFL_Relu1Op], + [TFL_AF_Relu6, TFL_Relu6Op], [TFL_AF_Tanh, TFL_TanhOp], + [TFL_AF_Sign, TFL_SignOp], + ] in { + def : Pat<(binaryOp:$output TensorOf<[QI8, QI16]>:$input1, + TensorOf<[QI8, QI16]>:$input2, activation[0]), + (activation[1](binaryOp $input1, $input2, TFL_AF_None, + (returnType $output)))>; + } +} + +def HasUnequalShape + : Constraint(), " + "$1.getType().cast())">>; + +def getShapeAttr + : NativeCodeCall< + "$_builder.getI32TensorAttr(utils::getI32DimFromI64Dim($0.getType()." + "cast().getShape()))">; + +// Add TFL_BroadcastToOp if necessary +// TFL Add, Sub, Mul +foreach binaryOp = [TFL_AddOp, TFL_SubOp, TFL_MulOp] in { + def : Pat<(binaryOp:$output TensorOf<[QI8, QI16]>:$input1, + TensorOf<[QI8, QI16]>:$input2, $activation), + (binaryOp(TFL_BroadcastToOp $input1, + (TFL_ConstOp(getShapeAttr $output)), + (returnType(getTypeOf1WithQParamsOf0 $input1, $output))), + $input2, $activation), + [(HasUnequalShape $input1, $output)]>; + + def : Pat<(binaryOp:$output TensorOf<[QI8, QI16]>:$input1, + TensorOf<[QI8, QI16]>:$input2, $activation), + (binaryOp $input1, + (TFL_BroadcastToOp $input2, (TFL_ConstOp(getShapeAttr $output)), + (returnType(getTypeOf1WithQParamsOf0 $input2, $output))), + $activation), + [(HasUnequalShape $input2, $output)]>; +} + +// PadChannel(PadSpatial) to PadSpatial(PadChannel) +// Match cases where arith constant op and tfl constant op are both used +foreach constOp = [Arith_ConstantOp, TFL_ConstOp] in { + def : Pat<(TFL_PadOp:$output(TFL_PadOp $input, + (constOp:$padding_spatial_op $padding_spatial_attr)), + (constOp:$padding_channel_op $padding_channel_attr)), + (TFL_PadOp(TFL_PadOp $input, $padding_channel_op, + (returnType(PadChannelOutputType $input, $output))), + $padding_spatial_op), + [(HasOnlySpatialPadding $padding_spatial_attr), + (HasOnlyChannelPadding $padding_channel_attr), + ]>; +} + +def get4To3Shape + : NativeCodeCall<"RankedTensorType::get({$0.getType().cast()." + "getDimSize(0)," + "$0.getType().cast().getDimSize(1) * " + "$0.getType().cast().getDimSize(2)," + "$0.getType().cast().getDimSize(3)}, " + "$0.getType().cast().getElementType())">; + +def get4To3ShapeAttr + : NativeCodeCall< + "DenseIntElementsAttr::get(RankedTensorType::get({3}, " + "rewriter.getI32Type()), " + "{static_cast($0.getType().cast().getDimSize(0))" + ", " + "static_cast($0.getType().cast().getDimSize(1) " + "* $0.getType().cast().getDimSize(2)), " + "static_cast($0.getType().cast().getDimSize(3))}" + ")">; + +// Reshape Softmax of rank 4 to rank 3 with a Reshape to combine batches +def : Pat<(TFL_SoftmaxOp:$output TensorOf<[QI8]>:$input, $beta), + (TFL_ReshapeOp(TFL_SoftmaxOp(TFL_ReshapeOp $input, + (TFL_ConstOp(get4To3ShapeAttr $input)), + (returnType(get4To3Shape $input))), + $beta, (returnType(get4To3Shape $output))), + (TFL_ConstOp(getShapeAttr $output))), + [(HasRank<4> $output)]>; + +// Replace LQ_Bconv2DOp of SAME padding with a pad_value of one with +// LQ_Bconv2DOp(TFL_Pad()) of VALID padding. We cannot do this when the +// pad_value is zero as detailed below. +// Comment copied from +// https://github.com/larq/compute-engine/blob/main/larq_compute_engine/core/bconv2d/zero_padding_correction.h#L6 +// "When we compute a convolution that requires "SAME" padding we pad with the +// value zero, meaning bitpacked bits 0, representing the value +1; thus we +// compute 'same one' padding by default. A correction is needed if we want +// 'same zero' padding instead -- we have to add or subtract a value to elements +// at the edge of the output tensor." +def : Pat<(LQ_Bconv2dOp:$output $input, $f, $m, $b, $t, $cin, $dh, $dw, $faf, + ConstantAttr, TFL_PAD_Same, $sh, $sw), + (LQ_Bconv2dOp(TFL_PadOp $input, + (GetBConv2DPaddingValues:$ret__0 $output), (returnType $ret__1)), + $f, $m, $b, $t, $cin, $dh, $dw, $faf, ConstantAttr, + TFL_PAD_Valid, $sh, $sw)>; diff --git a/xformer/Transforms/TranslateToCustomOp.cpp b/xformer/Transforms/TranslateToCustomOp.cpp new file mode 100644 index 000000000..23756e020 --- /dev/null +++ b/xformer/Transforms/TranslateToCustomOp.cpp @@ -0,0 +1,367 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Analysis/MemoryPlan.h" +#include "IR/XCoreOps.h" +#include "Transforms/Options.h" + +#include "flatbuffers/flexbuffers.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +std::vector NoOp::buildCustomOptions() { return {}; } +std::vector Expand8To16Op::buildCustomOptions() { return {}; } +std::vector FakeScratchBufferOp::buildCustomOptions() { return {}; } +std::vector Bsign8Op::buildCustomOptions() { return {}; } +std::vector LoadWeightsWaitOp::buildCustomOptions() { return {}; } + +std::vector UnaryI16Op::buildCustomOptions() { + flexbuffers::Builder fbb; + fbb.Map([&]() { fbb.Int("type", (int32_t)getOpType()); }); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector BinaryI16Op::buildCustomOptions() { + flexbuffers::Builder fbb; + fbb.Map([&]() { fbb.Int("type", (int32_t)getOpType()); }); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector FakeSliceOp::buildCustomOptions() { return {}; } + +std::vector Beta_ActivationF32Op::buildCustomOptions() { + flexbuffers::Builder fbb; + fbb.Map([&]() { fbb.Int("type", (int32_t)getType()); }); + fbb.Finish(); + return fbb.GetBuffer(); +} +std::vector Beta_ConcatF32Op::buildCustomOptions() { return {}; } +std::vector Beta_ConvF32Op::buildCustomOptions() { return {}; } +std::vector Beta_TransposeConvF32Op::buildCustomOptions() { + return {}; +} +std::vector Beta_FcF32Op::buildCustomOptions() { return {}; } +std::vector LookupOp::buildCustomOptions() { return {}; } +std::vector SoftmaxOp::buildCustomOptions() { return {}; } +std::vector BatchedSoftmaxOp::buildCustomOptions() { return {}; } + +std::vector StoreTensorOp::buildCustomOptions() { + flexbuffers::Builder fbb; + fbb.Map([&]() { + fbb.Int("a", (int32_t)getAddress()); + fbb.Int("s", (int32_t)getSize()); + }); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector LoadTensorOp::buildCustomOptions() { + flexbuffers::Builder fbb; + fbb.Map([&]() { + fbb.Int("a", (int32_t)getAddress()); + fbb.Int("s", (int32_t)getSize()); + }); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector AddOp::buildCustomOptions() { + flexbuffers::Builder fbb; + fbb.Map([&]() { + fbb.Int("m1", (int32_t)getMultiplier1()); + fbb.Int("m2", (int32_t)getMultiplier2()); + fbb.Int("bias", (int32_t)getBias()); + fbb.Int("shift", (int32_t)getShift()); + }); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector MulOp::buildCustomOptions() { + flexbuffers::Builder fbb; + fbb.Map([&]() { fbb.String("mp", getMulParams().str()); }); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector MeanOp::buildCustomOptions() { + flexbuffers::Builder fbb; + auto rootMap = fbb.StartMap(); + fbb.Int("s", (int32_t)getStart()); + fbb.Int("m", (int32_t)getMean()); + fbb.Int("e", (int32_t)getEnd()); + fbb.IndirectFloat("i", getInZeroPoint().convertToFloat()); + fbb.IndirectFloat("o", getOutZeroPoint().convertToFloat()); + fbb.IndirectFloat("sm", getScaleMul().convertToFloat()); + fbb.EndMap(rootMap); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector MeanI16Op::buildCustomOptions() { + flexbuffers::Builder fbb; + auto rootMap = fbb.StartMap(); + fbb.Int("s", (int32_t)getStart()); + fbb.Int("m", (int32_t)getMean()); + fbb.Int("e", (int32_t)getEnd()); + fbb.IndirectFloat("sm", getScaleMul().convertToFloat()); + fbb.EndMap(rootMap); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector SliceOp::buildCustomOptions() { + flexbuffers::Builder fbb; + auto rootMap = fbb.StartMap(); + fbb.Int("s", (int32_t)getStart()); + fbb.Int("o", (int32_t)getOffset()); + fbb.Int("l", (int32_t)getSize()); + fbb.Int("n", (int32_t)getNumCopies()); + fbb.Bool("v", (bool)getUseVpu()); + fbb.EndMap(rootMap); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector BroadcastOp::buildCustomOptions() { + flexbuffers::Builder fbb; + auto rootMap = fbb.StartMap(); + fbb.Int("s", (int32_t)getSize()); + fbb.Int("n", (int32_t)getNumCopies()); + fbb.Int("b", (int32_t)getNumBroadcasts()); + fbb.Bool("v", (bool)getUseVpu()); + fbb.EndMap(rootMap); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector PadOp::buildCustomOptions() { + flexbuffers::Builder fbb; + auto rootMap = fbb.StartMap(); + fbb.Int("s", (int32_t)getStart()); + fbb.Int("p", (int32_t)getPadSize()); + fbb.Int("l", (int32_t)getSize()); + fbb.Int("n", (int32_t)getNumCopies()); + fbb.Int("z", (int32_t)getZeroPoint()); + fbb.Int("e", (int32_t)getEnd()); + fbb.Bool("v", (bool)getUseVpu()); + fbb.EndMap(rootMap); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector ConcatOp::buildCustomOptions() { + flexbuffers::Builder fbb; + auto rootMap = fbb.StartMap(); + fbb.Int("n", (int32_t)getNumCopies()); + auto sizesVec = fbb.StartVector("s"); + auto sizes = getSizes().cast(); + for (int i = 0; i < CONCAT_OP_MAX_INPUTS; ++i) { + fbb.Int(sizes[i].cast().getInt()); + } + fbb.EndVector(sizesVec, false, false); + fbb.Int("i", (int32_t)getNumInputs()); + fbb.Bool("v", (bool)getUseVpu()); + fbb.EndMap(rootMap); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector TransposeOp::buildCustomOptions() { + flexbuffers::Builder fbb; + auto rootMap = fbb.StartMap(); + auto tShapeVec = fbb.StartVector("s"); + auto tShape = getTShape().cast(); + for (int i = 0; i < 4; ++i) { + fbb.Int(tShape[i].cast().getInt()); + } + fbb.EndVector(tShapeVec, false, false); + auto offsetsVec = fbb.StartVector("o"); + auto offsets = getOffsets().cast(); + for (int j = 0; j < 4; ++j) { + fbb.Int(offsets[j].cast().getInt()); + } + fbb.EndVector(offsetsVec, false, false); + fbb.EndMap(rootMap); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector LoadWeightsOp::buildCustomOptions() { + flexbuffers::Builder fbb; + auto rootMap = fbb.StartMap(); + fbb.Int("a", (int32_t)getAddress()); + auto sizesVec = fbb.StartVector("s"); + for (int i = 0; i < getSizes().cast().size(); ++i) { + fbb.Int(getSizes().cast()[i].cast().getInt()); + } + fbb.EndVector(sizesVec, false, false); + fbb.Int("t", (int32_t)(symbolizeLoadWeightsOpType(getOpType()).value())); + fbb.EndMap(rootMap); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector Pad3To4Op::buildCustomOptions() { + flexbuffers::Builder fbb; + fbb.Map([&]() { fbb.Int("pv", (int32_t)getPadValue()); }); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector Pad1To4Op::buildCustomOptions() { + flexbuffers::Builder fbb; + fbb.Map([&]() { fbb.Int("pv", (int32_t)getPadValue()); }); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector Conv2DV2Op::buildCustomOptions() { + flexbuffers::Builder fbb; + auto rootMap = fbb.StartMap(); + // TODO: Create a flatbuffer schema for xc ops. + // The flexbuffer data for xc conv2d has been carefully arranged so + // that each param is aligned to four bytes. + // DO NOT CHANGE THE NAMES OR ORDER OF PARAMS HERE. + // This is so that we can directly access them without creating + // persistent buffers. + // The alignment is why we are adding a dummy "00" to the end of + // abstract kernel params. This is necessary when we have multiple + // threads. + fbb.String("mp", getMemcpyFnParam().str()); + fbb.String("a", getAggregateFnParam().str()); + fbb.String("o", getOutputTransformFnParam().str()); + int threadCount = (int)getThreadCount(); + auto akpVec = fbb.StartVector("p"); + for (int i = 0; i < threadCount; ++i) { + fbb.String(getAbstractKernelParams() + .cast()[i] + .cast() + .getValue() + .str() + + "00"); + } + fbb.EndVector(akpVec, false, false); + fbb.Int("s", (int32_t)getScratchBytes()); + fbb.Int("k", (int32_t)(symbolizeConv2DType(getConv2dKernelType()).value())); + fbb.Int("t", (int32_t)(symbolizeOtType(getOutputTransformType()).value())); + + fbb.EndMap(rootMap); + fbb.Finish(); + return fbb.GetBuffer(); +} + +std::vector MaxPool2DOp::buildCustomOptions() { + // TODO: Is the alignement messed up? + flexbuffers::Builder fbb; + auto rootMap = fbb.StartMap(); + fbb.String("mp", getMemcpyFnParam().str()); + fbb.String("a", getAggregateFnParam().str()); + fbb.String("o", getOutputTransformFnParam().str()); + int threadCount = (int)getThreadCount(); + auto akpVec = fbb.StartVector("p"); + for (int i = 0; i < threadCount; ++i) { + fbb.String(getAbstractKernelParams() + .cast()[i] + .cast() + .getValue() + .str() + + "00"); + } + fbb.EndVector(akpVec, false, false); + fbb.Int("s", (int32_t)getScratchBytes()); + + fbb.EndMap(rootMap); + fbb.Finish(); + return fbb.GetBuffer(); +} + +namespace { +/// This pass translates XCore ops to TFLite custom ops. +struct TranslateToCustomOp + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TranslateToCustomOp) + + StringRef getArgument() const final { return "xcore-translate-to-customop"; } + StringRef getDescription() const final { + return "Translate to custom ops in TensorFlow Lite dialect"; + } + void runOnOperation() override; +}; + +template +struct RewriteToCustomOp : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(XCoreOp xc_op, + PatternRewriter &rewriter) const override { + auto options = xc_op.buildCustomOptions(); + auto *op = xc_op.getOperation(); + auto type = RankedTensorType::get({static_cast(options.size())}, + rewriter.getIntegerType(8)); + std::string options_bytes(options.begin(), options.end()); + auto attr = TFL::ConstBytesAttr::get(op->getContext(), options_bytes); + + rewriter.replaceOpWithNewOp( + op, op->getResultTypes(), op->getOperands(), + "XC_" + std::string(XCoreOp::getOperationName().drop_front(3)), attr); + return success(); + } +}; + +void TranslateToCustomOp::runOnOperation() { + auto *ctx = &getContext(); + RewritePatternSet patterns(ctx); + func::FuncOp func = getOperation(); + + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + patterns.insert>(ctx); + + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); +} + +} // namespace + +// Creates an instance of the TranslateToCustomOp pass. +std::unique_ptr> createTranslateToCustomOpPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/VerifyInputOutputTensorOptions.cpp b/xformer/Transforms/VerifyInputOutputTensorOptions.cpp new file mode 100644 index 000000000..e7188a5d6 --- /dev/null +++ b/xformer/Transforms/VerifyInputOutputTensorOptions.cpp @@ -0,0 +1,227 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Analysis/MemoryPlan.h" +#include "IR/XCoreOps.h" +#include "Transforms/Options.h" +#include "Utils/Util.h" + +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" + +namespace mlir::xcore { + +namespace { +struct VerifyInputOutputTensorOptions + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(VerifyInputOutputTensorOptions) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-preset-allocations"; } + StringRef getDescription() const final { return "Remove dynamic shape"; } + void runOnOperation() override; +}; + +void VerifyInputOutputTensorOptions::runOnOperation() { + auto func = getOperation(); + auto *ctx = &getContext(); + + auto &m = getAnalysis(); + llvm::StringMap inputTensorMap, outputTensorMap; + m.buildInputOutputTensorMaps(inputTensorMap, outputTensorMap); + + auto verifyExternalOption = [&](llvm::cl::list &option, + llvm::StringMap &tensorMap, + std::string inOrOutStr) { + bool succeeded = true; + if (option.size() > 0) { + // Check names of tensors + for (int i = 0; i < option.size(); i = i + 1) { + if (!tensorMap.count(option[i])) { + func.emitError() << option[i] << " not present in " << inOrOutStr + << " tensors. Please check the name!"; + succeeded = false; + } + } + if (!succeeded) { + return succeeded; + } + + succeeded = true; + if (sameAllocationInputOutputTensorOption.size() > 0) { + llvm::StringMap loadExternalTensorMap; + for (int i = 0; i < option.size(); i = i + 1) { + loadExternalTensorMap[option[i]] = 1; + } + for (int i = 0; i < sameAllocationInputOutputTensorOption.size(); + i = i + 2) { + if (loadExternalTensorMap.count( + sameAllocationInputOutputTensorOption[i])) { + func.emitError() + << "Cannot specify the same " << inOrOutStr << " tensor " + << sameAllocationInputOutputTensorOption[i] + << " in both --xcore-load-" << inOrOutStr + << "-tensors-externally " + "and --xcore-same-allocation-input-output-tensor " + << "options!"; + succeeded = false; + } + } + if (!succeeded) { + return succeeded; + } + } + } + return succeeded; + }; + + if (!verifyExternalOption(loadInputExternallyOption, inputTensorMap, + "input")) { + signalPassFailure(); + return; + } + + if (!verifyExternalOption(storeOutputExternallyOption, outputTensorMap, + "output")) { + signalPassFailure(); + return; + } + + if (sameAllocationInputOutputTensorOption.size() > 0) { + + auto &m = getAnalysis(); + llvm::StringMap inputTensorMap, outputTensorMap; + m.buildInputOutputTensorMaps(inputTensorMap, outputTensorMap); + + bool failed = false; + // Check names of input and output tensors + for (int i = 0; i < sameAllocationInputOutputTensorOption.size(); + i = i + 2) { + if (!inputTensorMap.count(sameAllocationInputOutputTensorOption[i])) { + func.emitError() + << sameAllocationInputOutputTensorOption[i] + << " not present in input tensors. Please check the name!"; + failed = true; + } + if (!outputTensorMap.count( + sameAllocationInputOutputTensorOption[i + 1])) { + func.emitError() + << sameAllocationInputOutputTensorOption[i + 1] + << " not present in output tensors. Please check the name!"; + failed = true; + } + } + + if (failed) { + signalPassFailure(); + return; + } + + // Check sizes + auto vInfo = m.getValuesInfoMap(); + for (int i = 0; i < sameAllocationInputOutputTensorOption.size(); + i = i + 2) { + if (vInfo[inputTensorMap[sameAllocationInputOutputTensorOption[i]]] + .size != + vInfo[outputTensorMap[sameAllocationInputOutputTensorOption[i + 1]]] + .size) { + func.emitError() << "Size of input tensor " + << sameAllocationInputOutputTensorOption[i] + << " is not equal to output tensor " + << sameAllocationInputOutputTensorOption[i + 1] + << ". Please check!"; + failed = true; + } + } + + // Check quantization + for (int i = 0; i < sameAllocationInputOutputTensorOption.size(); + i = i + 2) { + auto inQType = dyn_cast_or_null( + inputTensorMap[sameAllocationInputOutputTensorOption[i]] + .getType() + .cast() + .getElementType()); + auto outQType = dyn_cast_or_null( + outputTensorMap[sameAllocationInputOutputTensorOption[i + 1]] + .getType() + .cast() + .getElementType()); + if (inQType && !outQType) { + func.emitError() << "Input tensor " + << sameAllocationInputOutputTensorOption[i] + << " is quantized, but " + << sameAllocationInputOutputTensorOption[i + 1] + << " is not. Please check!"; + failed = true; + } else if (!inQType && outQType) { + func.emitError() << "Input tensor " + << sameAllocationInputOutputTensorOption[i] + << " is not quantized, but " + << sameAllocationInputOutputTensorOption[i + 1] + << " is quantized. Please check!"; + failed = true; + } else if (inQType && outQType) { + // Both are quantized, but check element sizes, maybe i8 and i16 + + auto inScale = inQType.getScale(); + auto inZeroPoint = inQType.getZeroPoint(); + + auto outScale = outQType.getScale(); + auto outZeroPoint = outQType.getZeroPoint(); + if (inScale != outScale || inZeroPoint != outZeroPoint) { + // change input block arg to output quantization + + // insert quantize op to convert back to original input quantization + // auto module = func->getParentOfType(); + // OpBuilder builder(module); + // auto outVal = + // outputTensorMap[sameAllocationInputOutputTensorOption[i + // + 1]]; auto newQType = inQType.castFromExpressedType( + // quant::QuantizedType::castToExpressedType(outVal.getType())); + // auto newQuantizeOp = builder.create( + // inVal.getLoc(), newQType, outVal, TypeAttr::get(inQType)); + + auto inVal = inputTensorMap[sameAllocationInputOutputTensorOption[i]]; + auto typeNumBits = + utils::getTypeSize( + inVal.getType().cast().getElementType()) * + 8; + double maxError = 1.0 / (2 << (typeNumBits - 1)); + if (abs(inScale - outScale) > maxError) { + func.emitError() + << "Input tensor " << sameAllocationInputOutputTensorOption[i] + << " has scale of " << inScale << " and zeropoint of " + << inZeroPoint << ", but output tensor " + << sameAllocationInputOutputTensorOption[i + 1] + << " has scale of " << outScale << " and zeropoint of " + << outZeroPoint << ". Please check!"; + failed = true; + } + } + } else if (!inQType && !outQType) { + // Both are not quantized, but check element sizes, maybe i8 and i16 + } + } + + if (failed) { + signalPassFailure(); + return; + } + } +} +} // namespace + +// Creates an instance of the VerifyInputOutputTensorOptions pass. +std::unique_ptr> +createVerifyInputOutputTensorOptionsPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/WriteWeights.cpp b/xformer/Transforms/WriteWeights.cpp new file mode 100644 index 000000000..861afef66 --- /dev/null +++ b/xformer/Transforms/WriteWeights.cpp @@ -0,0 +1,251 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Analysis/MemoryPlan.h" +#include "IR/XCoreOps.h" +#include "Transforms/Options.h" +#include "Utils/FileIO.h" +#include "Utils/TileRamSupport.h" + +#include "mlir/Pass/Pass.h" +#include "mlir/Support/FileUtilities.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" +#include "llvm/Support/ToolOutputFile.h" + +namespace mlir::xcore { + +namespace { +// Write weights to a file +struct WriteWeights + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(WriteWeights) + + void getDependentDialects(DialectRegistry ®istry) const final { + registry.insert(); + } + StringRef getArgument() const final { return "xcore-write-weights"; } + StringRef getDescription() const final { return "Write weights"; } + void runOnOperation() override; +}; + +struct WriteWeightsPattern : public OpRewritePattern { + WriteWeightsPattern(std::vector> *tensorsVec, + MLIRContext *context) + : OpRewritePattern(context), tensorsVec_(tensorsVec) {} + + std::vector getTensorData(LoadConstantOp loadOp) const { + DenseElementsAttr attr; + if (loadOp.getInput() + .getType() + .cast() + .getElementType() + .isa()) { + auto qConstOp = + dyn_cast(loadOp.getInput().getDefiningOp()); + attr = qConstOp.getValue().template cast(); + } else { + matchPattern(loadOp.getInput(), m_Constant(&attr)); + } + + std::vector tensorData; + int n = attr.isSplat() ? attr.getNumElements() : 1; + for (int i = 0; i < n; ++i) { + tensorData.insert(tensorData.end(), attr.getRawData().begin(), + attr.getRawData().end()); + } + return tensorData; + } + + // Helper function to pad tensor data to 32-byte alignment + void padTensorDataToDDRAlignment(std::vector &tensorData, + LoadWeightsOpType &opType) const { + auto alignedSize = ((tensorData.size() + 31) / 32) * 32; + auto toBePaddedSize = alignedSize - tensorData.size(); + // Pad with zeros + tensorData.insert(tensorData.end(), toBePaddedSize, 0); + } + + LogicalResult matchAndRewrite(LoadConstantOp loadOp, + PatternRewriter &rewriter) const override { + std::vector tensorData; + SmallVector dataSizes; + + int address = 0; + for (auto const &t : *tensorsVec_) { + address += t.size(); + } + + // We try to combine loads to one op if the load has only one use or if the + // load is not from external memory. + // The source address for external memory loads have to be aligned to 32 + // bytes/256 bits for max speed For DDR, we are padding data to 32 bytes + // alignment, so that the next load starts at a 32 byte aligned address + LoadWeightsOpType opType = LoadWeightsOpType::Sync; + if (loadOp.getResult().hasOneUse()) { + auto use = loadOp->use_begin(); + Operation *ownerOp = use->getOwner(); + + SmallVector outputTypes; + SmallVector opNums; + + for (int i = 0; i < ownerOp->getNumOperands(); i++) { + auto loadOpForOwnerOp = dyn_cast_or_null( + ownerOp->getOperand(i).getDefiningOp()); + + if (loadOpForOwnerOp) { + std::vector loadOpData = getTensorData(loadOpForOwnerOp); + dataSizes.push_back(rewriter.getI32IntegerAttr(loadOpData.size())); + tensorData.insert(tensorData.end(), loadOpData.begin(), + loadOpData.end()); + outputTypes.push_back(loadOpForOwnerOp.getType()); + opNums.push_back(i); + } + } + padTensorDataToDDRAlignment(tensorData, opType); + if (weightsInExternalMemory) { + opType = LoadWeightsOpType::DDR; + } + + auto loadWeightsOp = rewriter.create( + loadOp.getLoc(), outputTypes, address, + rewriter.getArrayAttr(dataSizes), stringifyLoadWeightsOpType(opType)); + + for (int i = 0; i < opNums.size(); i++) { + ownerOp->setOperand(opNums[i], loadWeightsOp.getResult(i)); + } + + loadWeightsOp->moveBefore(ownerOp); + loadOp.erase(); + } else { + std::vector loadOpData = getTensorData(loadOp); + dataSizes.push_back(rewriter.getI32IntegerAttr(loadOpData.size())); + tensorData.insert(tensorData.end(), loadOpData.begin(), loadOpData.end()); + padTensorDataToDDRAlignment(tensorData, opType); + if (weightsInExternalMemory) { + opType = LoadWeightsOpType::DDR; + } + auto loadWeightsOp = rewriter.create( + loadOp.getLoc(), loadOp.getType(), address, + rewriter.getArrayAttr(dataSizes), stringifyLoadWeightsOpType(opType)); + rewriter.replaceOp(loadOp, loadWeightsOp.getOutput()); + + // Find all uses of loadWeightsOp and find the first Owner op + // so that we can move the loading to just before that op. + mlir::Operation *firstOwnerOp = + loadWeightsOp->getResult(0).getUses().begin()->getOwner(); + for (const mlir::OpOperand &use : loadWeightsOp->getResult(0).getUses()) { + mlir::Operation *op = use.getOwner(); + if (op->isBeforeInBlock(firstOwnerOp)) { + firstOwnerOp = op; + } + } + loadWeightsOp->moveBefore(firstOwnerOp); + } + + tensorsVec_->push_back(tensorData); + + return success(); + } + +private: + std::vector> *tensorsVec_; +}; + +struct LowerToAsyncLoadsPattern : public OpRewritePattern { + LowerToAsyncLoadsPattern(MLIRContext *context) + : OpRewritePattern(context) {} + + LogicalResult matchAndRewrite(LoadWeightsOp loadWeightsOp, + PatternRewriter &rewriter) const override { + if (loadWeightsOp.getOpType() != + stringifyLoadWeightsOpType(LoadWeightsOpType::Sync)) { + return failure(); + } + + // We use loadWeightsOp.getResultTypes() as Load Weights op can have + // variadic number of results + auto loadWeightsAsyncOp = rewriter.create( + loadWeightsOp.getLoc(), loadWeightsOp.getResultTypes(), + loadWeightsOp.getAddress(), loadWeightsOp.getSizes(), + stringifyLoadWeightsOpType(LoadWeightsOpType::Async)); + + auto loadWeightsWaitOp = rewriter.create( + loadWeightsAsyncOp.getLoc(), loadWeightsAsyncOp.getResultTypes(), + loadWeightsAsyncOp.getResults()); + + rewriter.replaceOp(loadWeightsOp, loadWeightsWaitOp.getOutput()); + + return success(); + } +}; + +void WriteWeights::runOnOperation() { + func::FuncOp f = getOperation(); + if (weightsFilenameOption.empty()) { + f.emitError("Weights file option should be provided to run this pass!"); + signalPassFailure(); + return; + } + + auto *ctx = &getContext(); + func::FuncOp func = getOperation(); + // For each LoadOp in the graph, save the tensor data, and replace the LoadOp + // with a LoadWeightsOp + std::vector> tensorsVec; + RewritePatternSet patterns(ctx); + patterns.insert(&tensorsVec, ctx); + if (asyncLoadWeightsOption) { + patterns.insert(ctx); + } + (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); + + // Reorder async load to be before previous convolution + // so that the compute can be overlapped with the load + auto &m = getAnalysis(); + auto opIdMap = m.getOperationsIDMap(); + auto ops = m.getOperationsSequence(); + + llvm::SetVector convOpIds; + for (auto o : ops) { + if (llvm::isa(o)) { + convOpIds.insert(opIdMap[o]); + } + } + + for (auto o : ops) { + if (llvm::isa(o)) { + auto ldOp = dyn_cast(o); + if (ldOp.getOpType() == + stringifyLoadWeightsOpType(LoadWeightsOpType::Async)) { + int idx = llvm::lower_bound(convOpIds, opIdMap[o]) - convOpIds.begin(); + if (idx > 0) { + o->moveBefore(ops[convOpIds[idx - 1]]); + } + } + } + } + + int pagingSize = 0; + if (enablePagingOption) { + auto module = func->getParentOfType(); + pagingSize = module->getAttrOfType("xc.paging_size").getInt(); + } + if (failed(utils::writeWeightsToFile(weightsFilenameOption, tensorsVec, + pagingSize, weightsAsArrayOption, + weightsInExternalMemory))) { + f.emitError("Failed to write weights to file!"); + signalPassFailure(); + return; + } +} +} // namespace + +// Creates an instance of the WriteWeights pass. +std::unique_ptr> createWriteWeightsPass() { + return std::make_unique(); +} + +static PassRegistration pass; + +} // namespace mlir::xcore diff --git a/xformer/Transforms/XCPatterns.td b/xformer/Transforms/XCPatterns.td new file mode 100644 index 000000000..e6a5314f7 --- /dev/null +++ b/xformer/Transforms/XCPatterns.td @@ -0,0 +1,216 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +// This is the optimization pattern definition file for XCore. +include "mlir/Dialect/Arith/IR/ArithOps.td" +include "mlir/Dialect/Func/IR/FuncOps.td" +include "tensorflow/compiler/mlir/lite/ir/tfl_ops.td" +include "larq_compute_engine/mlir/ir/lce_ops.td" + +include "IR/XCoreOps.td" +include "Utils/Utils.td" + +// Reshape to No op +def : Pat<(TFL_ReshapeOp $input, $shape), (XC_NoOp $input)>; + +// Activation lowering patterns +// Activation lookup i8 +def getLookupTableI8 + : NativeCodeCall<"getLookupTableI8($_builder, $0.getDefiningOp(), $1)">; + +foreach activationOp = [TFL_ReluOp, TFL_Relu6Op, TFL_TanhOp, TFL_LogisticOp, + TFL_HardSwishOp] in { + def : Pat<(activationOp:$output TensorOf<[QI8]>:$input), + (XC_LookupOp $input, (Arith_ConstantOp(getLookupTableI8 $output, + ConstantAttr)))>; +} + +def : Pat<(TFL_LeakyReluOp:$output TensorOf<[QI8]>:$input, $alpha), + (XC_LookupOp $input, (Arith_ConstantOp(getLookupTableI8 $output, + $alpha)))>; + +def : Pat<(TFL_QuantizeOp:$output TensorOf<[QI8]>:$input, $qtype), + (XC_LookupOp $input, (Arith_ConstantOp(getLookupTableI8 $output, + ConstantAttr)))>; + +// Activation lookup i16 +def getLookupTableI16OrFail + : NativeCodeCall<"getLookupTableI16($_builder, $0.getDefiningOp()); " + "if(blob == nullptr){return failure();}">; + +foreach activationOp = [TFL_LogisticOp, TFL_TanhOp, TFL_ReluOp, + TFL_Relu6Op] in { + def : Pat<(activationOp:$output TensorOf<[QI16]>:$input), + (XC_LookupOp $input, + (Arith_ConstantOp(getLookupTableI16OrFail:$blob $output)))>; +} + +// Softmax lookup +def getExpLookupF32 + : NativeCodeCall<"getExpLookupF32($_builder, $0.getDefiningOp())">; + +// Softmax constraint: batch size must be 1, number of dimensions must be 2 +// (batch, dim) +def isSingleSegment + : Constraint().getRank() == 2">>; + +def isSingleBatch + : Constraint().getDimSize(0) == 1">>; +def isMultiBatch + : Constraint().getRank() == 2 && " + "$0.getType().cast().getDimSize(0) != 1) || " + "($0.getType().cast().getRank() == 3 && " + "$0.getType().cast().getDimSize(1) != 1)">>; + +def betaIsOne : Constraint>; + +// Softmax -> XC_SoftmaxOp if single batch else XC_BatchedSoftmaxOp +def : Pat<(TFL_SoftmaxOp:$output TensorOf<[QI8]>:$input, $beta), + (XC_SoftmaxOp $input, (Arith_ConstantOp(getExpLookupF32 $output))), + [(betaIsOne $beta), (isSingleSegment $input), + (isSingleBatch $input)]>; +def : Pat<(TFL_SoftmaxOp:$output TensorOf<[QI8]>:$input, $beta), + (XC_BatchedSoftmaxOp $input, + (Arith_ConstantOp(getExpLookupF32 $output))), + [(betaIsOne $beta), (isMultiBatch $input)]>; + +// Beta float activation lookup +def getActivationType + : NativeCodeCall<"getActivationType($_builder, $0.getDefiningOp())">; + +foreach activationOp = [TFL_EluOp, TFL_LogisticOp, TFL_TanhOp] in { + def : Pat<(activationOp:$output TensorOf<[F32]>:$input), + (XC_Beta_ActivationF32Op $input, (getActivationType $output)), + [(isBetaFloatEnabled)]>; +} + +// ELU(Dequantize(int16)) -> Dequantize(XC_LookupOp()) +def getLookupTableI16WithInputOutputOrFail + : NativeCodeCall<"getLookupTableI16($_builder, $0.getDefiningOp(), " + "$1.getDefiningOp(), $2.getDefiningOp()); if(blob == " + "nullptr){return failure();}">; +def : Pat<(TFL_EluOp:$output2 + (TFL_DequantizeOp:$output1 TensorOf<[QI16]>:$input)), + (TFL_DequantizeOp(XC_LookupOp $input, + (Arith_ConstantOp( + getLookupTableI16WithInputOutputOrFail:$blob $output2, + $output1, $input)), + (returnType $input))), + []>; + +def : Pat<(TFL_ConcatenationOp $input, $axis, $faf), + (XC_Beta_ConcatF32Op $input), [(isBetaFloatEnabled)]>; + +// Unary i16 +// If we cannot obtain the blob, we want the pattern to fail. +// The return value of the function is stored in a variable named "blob". +// We use that to check if it is a nullptr. +def getUnaryI16BlobOrFail + : NativeCodeCall<"getUnaryI16Blob($_builder, $0.getDefiningOp()); if(blob " + "== nullptr){return failure();}">; +// TFL Quantize(f32 to i16), Quantize(i16 to i16), Dequantize +def : Pat<(TFL_QuantizeOp:$output TensorOf<[F32]>:$input, $qtype), + (XC_UnaryI16Op $input, + (Arith_ConstantOp(getUnaryI16BlobOrFail:$blob $output)), + XC_UnaryI16_Quantize), + [(IsQuantizedType<16> $output)]>; +def : Pat<(TFL_QuantizeOp:$output TensorOf<[QI16]>:$input, $qtype), + (XC_UnaryI16Op $input, + (Arith_ConstantOp(getUnaryI16BlobOrFail:$blob $output)), + XC_UnaryI16_Requantize)>; +def : Pat<(TFL_DequantizeOp:$output TensorOf<[QI16]>:$input), + (XC_UnaryI16Op $input, + (Arith_ConstantOp(getUnaryI16BlobOrFail:$blob $output)), + XC_UnaryI16_Dequantize)>; + +// Binary i16 +// If we cannot obtain the blob, we want the pattern to fail. +// The return value of the function is stored in a variable named "blob". +// We use that to check if it is a nullptr. +def getBinaryI16BlobOrFail + : NativeCodeCall<"getBinaryI16Blob($_builder, $0.getDefiningOp()); if(blob " + "== nullptr){return failure();}">; +// TFL Add, Sub, Mul +def : Pat<(TFL_AddOp:$output TensorOf<[QI16]>:$input1, TensorOf<[QI16]>:$input2, + TFL_AF_None), + (XC_BinaryI16Op $input1, $input2, + (Arith_ConstantOp(getBinaryI16BlobOrFail:$blob $output)), + XC_BinaryI16_Add)>; + +def : Pat<(TFL_SubOp:$output TensorOf<[QI16]>:$input1, TensorOf<[QI16]>:$input2, + TFL_AF_None), + (XC_BinaryI16Op $input1, $input2, + (Arith_ConstantOp(getBinaryI16BlobOrFail:$blob $output)), + XC_BinaryI16_Add)>; + +def : Pat<(TFL_MulOp:$output TensorOf<[QI16]>:$input1, TensorOf<[QI16]>:$input2, + TFL_AF_None), + (XC_BinaryI16Op $input1, $input2, + (Arith_ConstantOp(getBinaryI16BlobOrFail:$blob $output)), + XC_BinaryI16_Mul)>; + +// Pad patterns +def getPadValue : NativeCodeCall<"getPadValue($_builder, $0)">; + +class HasNTo4Channel + : Constraint< + CPred<"$0.getType().cast().getDimSize(3) == "#n#" && " + "$1.getType().cast().getDimSize(3) == 4">>; + +foreach constOp = [Arith_ConstantOp, TFL_ConstOp] in { + def : Pat<(TFL_PadOp:$output TensorOf<[QI8]>:$input, + (constOp:$padding_op $padding_attr)), + (XC_Pad3To4Op $input, (getPadValue $input)), + [(HasOnlyChannelPadding $padding_attr), + (HasNTo4Channel<3> $input, $output), + ]>; + + def : Pat<(TFL_PadOp:$output TensorOf<[QI8]>:$input, + (constOp:$padding_op $padding_attr)), + (XC_Pad1To4Op $input, (getPadValue $input)), + [(HasOnlyChannelPadding $padding_attr), + (HasNTo4Channel<1> $input, $output), + ]>; +} + +// Lower special Concatenation op PyTorch remnant to XC_Pad3to4 +// If the second input of concatenation is with a constant of all values zero, +// and input has channels 3 and output has channels 4 +class HasExactValues + : Constraint; +def Front : NativeCodeCall<"$0.front()", 1>; +// Checks if second input is integer constant and its splat value is equal to +// zero. +def IsSecondInputSplatAndEqualToZero + : Constraint< + CPred<"$0.back().getDefiningOp() && " + "dyn_cast($0.back().getDefiningOp()) && " + "dyn_cast($0.back().getDefiningOp()).getValue()." + "cast().isSplat() && " + "dyn_cast($0.back().getDefiningOp()).getValue()." + "cast().getSplatValue() == 0">>; +def AreChannels3And4 + : Constraint< + CPred<"$0.front().getType().cast().getDimSize(3) == 3 && " + "$1.getType().cast().getDimSize(3) == 4">>; +def : Pat<(TFL_ConcatenationOp:$output $varg, $axis, $faf), + (XC_Pad3To4Op(Front $varg), ConstantAttr), + [(HasExactValues<2> $varg), (IsSecondInputSplatAndEqualToZero $varg), + (AreChannels3And4 $varg, $output)]>; + +// Fuse XC_Conv2D(Reshape()) -> XC_Conv2D() +def : Pat<(XC_Conv2DV2Op:$cout(TFL_ReshapeOp:$rout $input, $shape), $weights, + $muls, $po, $st, $kt, $mp, $aggp, $otp, $ott, $scratch, $tc, + $akp), + (XC_Conv2DV2Op $input, $weights, $muls, $po, $st, $kt, $mp, $aggp, + $otp, $ott, $scratch, $tc, $akp)>; + +// Fuse Reshape(XC_Conv2D()) -> XC_Conv2D() +def : Pat<(TFL_ReshapeOp(XC_Conv2DV2Op $input, $weights, $muls, $po, $st, $kt, + $mp, $aggp, $otp, $ott, $scratch, $tc, $akp), + $shape), + (XC_Conv2DV2Op $input, $weights, $muls, $po, $st, $kt, $mp, $aggp, + $otp, $ott, $scratch, $tc, $akp)>; + +// Replace LQ_QuantizeOp with XC_bsign_8 +def : Pat<(LQ_QuantizeOp $input), (XC_Bsign8Op $input)>; diff --git a/xformer/Utils/Diagnostics.h b/xformer/Utils/Diagnostics.h new file mode 100644 index 000000000..4b2e0712e --- /dev/null +++ b/xformer/Utils/Diagnostics.h @@ -0,0 +1,30 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#ifndef XFORMER_UTILS_DIAGNOSTICS_H +#define XFORMER_UTILS_DIAGNOSTICS_H + +#include + +namespace mlir::xcore::utils { + +template std::string getMsgWithLocPrefix(T &op, std::string msg) { + std::string message; + llvm::raw_string_ostream os(message); + if (!op.getLoc().template isa()) { + os << op.getLoc() << " : "; + } + os << msg; + return message; +} + +template std::string getLocName(T &op) { + if (auto name_loc = op.getLoc().template dyn_cast()) { + return name_loc.getName().str(); + } + return ""; +} + +} // namespace mlir::xcore::utils + +#endif // XFORMER_UTILS_DIAGNOSTICS_H diff --git a/xformer/Utils/FileIO.cpp b/xformer/Utils/FileIO.cpp new file mode 100644 index 000000000..a3b82f079 --- /dev/null +++ b/xformer/Utils/FileIO.cpp @@ -0,0 +1,151 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Utils/FileIO.h" +#include "Utils/TileRamSupport.h" + +#include "mlir/Support/FileUtilities.h" +#include "tensorflow/compiler/mlir/lite/flatbuffer_export.h" +#include "tensorflow/compiler/mlir/lite/flatbuffer_import.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/ToolOutputFile.h" + +namespace mlir::xcore::utils { + +LogicalResult writeDataToFile(const std::string &filename, std::string data) { + auto outputFile = openOutputFile(filename); + if (!outputFile) { + llvm::errs() << "Could not open output file: " << filename << "\n"; + return failure(); + } + outputFile->os() << data; + outputFile->keep(); + return success(); +} + +LogicalResult writeWeightsToFile(const std::string &filename, + std::vector> tensorsVec, + int pagingSize, bool writeWeightsAsArray, + bool placeInExternalMemory) { + if (writeWeightsAsArray) { + std::ostringstream cOut; + cOut << R"(#include )" + << "\n" + << R"(#include ")" << llvm::sys::path::filename(filename).str() + << R"(.h")" + << "\n\n"; + + if (placeInExternalMemory) { + cOut << R"(#ifdef __xcore__)" + << "\n" + << R"(__attribute__ ((section(".ExtMem.data"))))" + << "\n" + << "#endif" + << "\n"; + } else { + // Weights are to be placed in SRAM tile + // Add tile ram server header + auto tileHeader = utils::tileRamServerHeader(); + tensorsVec.insert(tensorsVec.begin(), tileHeader); + } + + cOut << "const int8_t weights[WEIGHTS_SIZE + PAGING_SIZE] = {\n"; + int lineEnding = 0; + int weightsSize = 0; + for (auto const &tensor : tensorsVec) { + for (auto const &i : tensor) { + cOut << (int)i << ", "; + lineEnding++; + weightsSize++; + if (lineEnding > 80) { + cOut << "\n"; + lineEnding = 0; + } + } + } + + cOut << R"(}; +)"; + + if (failed(utils::writeDataToFile(filename + ".c", cOut.str()))) { + return failure(); + } + + std::ostringstream hOut; + hOut << R"(#ifndef WEIGHTSGEN_H +#define WEIGHTSGEN_H + +#define WEIGHTS_SIZE ()" + << weightsSize << R"(U) +#define PAGING_SIZE ()" + << pagingSize << R"(U) + +#endif // WEIGHTSGEN_H +)"; + + return utils::writeDataToFile(filename + ".h", hOut.str()); + + } else { + // Write data for flash image + // Combine data for the tensors + std::string data; + for (auto const &tensor : tensorsVec) { + data += std::string(tensor.data(), tensor.size()); + } + + return utils::writeDataToFile(filename, data); + } +} + +LogicalResult getFlatBufferStringFromMLIR( + mlir::ModuleOp module, std::map metadata, + const bool &dontMinify, std::string &flatBufferString) { + std::unique_ptr op_or_arg_name_mapper; + if (dontMinify) { + op_or_arg_name_mapper = + std::make_unique(); + } else { + op_or_arg_name_mapper = + std::make_unique(); + } + + tflite::FlatbufferExportOptions options; + bool emit_builtin_tflite_ops = true; + bool emit_select_tf_ops = true; + bool emit_custom_ops = true; + + options.toco_flags.set_force_select_tf_ops(!emit_builtin_tflite_ops); + options.toco_flags.set_enable_select_tf_ops(emit_select_tf_ops); + options.toco_flags.set_allow_custom_ops(emit_custom_ops); + options.op_or_arg_name_mapper = op_or_arg_name_mapper.get(); + options.metadata = metadata; + + if (!tflite::MlirToFlatBufferTranslateFunction(module, options, + &flatBufferString)) { + emitError(UnknownLoc::get(module.getContext())) + << "Error converting MLIR to flatbuffer string!"; + return failure(); + } + return success(); +} + +mlir::OwningOpRef +readFlatBufferFileToMLIR(const std::string &filename, + mlir::MLIRContext *context) { + std::string errorMessage; + auto inputFile = openInputFile(filename, &errorMessage); + if (!inputFile) { + emitError(UnknownLoc::get(context)) << errorMessage; + return mlir::OwningOpRef(nullptr); + } + + auto loc = mlir::FileLineColLoc::get(context, filename, 0, 0); + mlir::OwningOpRef mod = + tflite::FlatBufferToMlir(absl::string_view(inputFile->getBufferStart(), + inputFile->getBufferSize()), + context, loc); + return mod; +} + +} // namespace mlir::xcore::utils diff --git a/xformer/Utils/FileIO.h b/xformer/Utils/FileIO.h new file mode 100644 index 000000000..6c0cbedc4 --- /dev/null +++ b/xformer/Utils/FileIO.h @@ -0,0 +1,28 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#ifndef XFORMER_UTILS_FILEIO_H +#define XFORMER_UTILS_FILEIO_H + +#include "mlir/IR/BuiltinOps.h" + +namespace mlir::xcore::utils { + +LogicalResult writeDataToFile(const std::string &filename, std::string data); + +LogicalResult writeWeightsToFile(const std::string &filename, + std::vector> tensorsVec, + int pagingSize, bool writeWeightsAsArray, + bool placeInExternalMemory); + +LogicalResult getFlatBufferStringFromMLIR( + mlir::ModuleOp module, std::map metadata, + const bool &dontMinify, std::string &flatBufferString); + +mlir::OwningOpRef +readFlatBufferFileToMLIR(const std::string &filename, + mlir::MLIRContext *context); + +} // namespace mlir::xcore::utils + +#endif // XFORMER_UTILS_FILEIO_H diff --git a/xformer/Utils/ThreadSupport.cpp b/xformer/Utils/ThreadSupport.cpp new file mode 100644 index 000000000..3dc480a5c --- /dev/null +++ b/xformer/Utils/ThreadSupport.cpp @@ -0,0 +1,264 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Utils/ThreadSupport.h" + +#include "mlir/Support/LogicalResult.h" + +#include "lib_nn/api/nn_op_utils.h" + +#include + +namespace mlir::xcore::utils { + +namespace { + +mlir::LogicalResult +getSmallDimSplits(llvm::SmallVector> &imageRegionSplits, + const int &numThreads, const int &dimSize, + bool isHeightChosenDim, const int &alignedImageHeight, + const int &alignedImageWidth, const int &imageHeight, + const int &imageWidth, const int &subH, const int &subW, + const int &strideH, const int &strideW) { + if (dimSize >= numThreads) { + return failure(); + } + + int otherDim; + llvm::SmallVector x, y, h, w, xx, yy, hh, ww; + if (isHeightChosenDim) { + otherDim = alignedImageWidth; + } else { + otherDim = alignedImageHeight; + } + if (otherDim == 1) { + return failure(); + } + + if (dimSize == 4) { + assert(numThreads == 5); + if (otherDim == 4) { + xx = {0, 1, 2, 3, 3}; + yy = {0, 0, 0, 0, 2}; + hh = {1, 1, 1, 1, 1}; + ww = {4, 4, 4, 2, 2}; + } else if (otherDim == 3) { + xx = {0, 1, 2, 3, 3}; + yy = {0, 0, 0, 0, 2}; + hh = {1, 1, 1, 1, 1}; + ww = {3, 3, 3, 2, 1}; + } else if (otherDim == 2) { + xx = {0, 1, 2, 3, 3}; + yy = {0, 0, 0, 0, 1}; + hh = {1, 1, 1, 1, 1}; + ww = {2, 2, 2, 1, 1}; + } + } else if (dimSize == 3) { + if (numThreads == 4) { + if (otherDim == 3) { + xx = {0, 1, 2, 2}; + yy = {0, 0, 0, 2}; + hh = {1, 1, 1, 1}; + ww = {3, 3, 2, 1}; + } else if (otherDim == 2) { + xx = {0, 1, 2, 2}; + yy = {0, 0, 0, 1}; + hh = {1, 1, 1, 1}; + ww = {2, 2, 1, 1}; + } + } else { + assert(numThreads == 5); + if (otherDim == 3) { + xx = {0, 1, 1, 2, 2}; + yy = {0, 0, 2, 0, 2}; + hh = {1, 1, 1, 1, 1}; + ww = {3, 2, 1, 2, 1}; + } else if (otherDim == 2) { + xx = {0, 1, 1, 2, 2}; + yy = {0, 0, 1, 0, 1}; + hh = {1, 1, 1, 1, 1}; + ww = {2, 1, 1, 1, 1}; + } + } + + } else if (dimSize == 2) { + if (numThreads == 3) { + assert(otherDim == 2); + xx = {0, 1, 1}; + yy = {0, 0, 1}; + hh = {1, 1, 1}; + ww = {2, 1, 1}; + } else { + assert(numThreads == 4 || numThreads == 5); + assert(otherDim == 2); + xx = {0, 0, 1, 1}; + yy = {0, 1, 0, 1}; + hh = {1, 1, 1, 1}; + ww = {1, 1, 1, 1}; + } + } + + if (isHeightChosenDim) { + x = xx; + y = yy; + h = hh; + w = ww; + } else { + x = yy; + y = xx; + h = ww; + w = hh; + } + + for (int i = 0; i < x.size(); i++) { + x[i] = x[i] * strideH; + y[i] = y[i] * strideW; + h[i] = h[i] * strideH; + w[i] = w[i] * strideW; + } + + // If odd sizes, will need to adjust the last split + if (isHeightChosenDim && imageHeight % 2 == 1) { + h[h.size() - 1]++; + } else if (!isHeightChosenDim && imageWidth % 2 == 1) { + w[w.size() - 1]++; + } + + for (int i = 0; i < x.size(); i++) { + if (isHeightChosenDim) { + h[i] = (x[i] + subH + h[i] > imageHeight && imageHeight % 2 == 1) + ? h[i] - 1 + : h[i]; + } else { + w[i] = (y[i] + subW + w[i] > imageWidth && imageWidth % 2 == 1) ? w[i] - 1 + : w[i]; + } + imageRegionSplits.push_back({x[i] + subH, y[i] + subW, h[i], w[i]}); + } + return success(); +} + +llvm::SmallVector> +getDepthwiseThreadSplits(const int &numThreads, const int &imageHeight, + const int &imageWidth, const int &imageDepth) { + int s[5]; + int e[5]; + int tc = calculateThreadSplit(numThreads, imageDepth, s, e, 16); + + llvm::SmallVector> imageRegionSplits; + + for (int i = 0; i < tc; i++) { + imageRegionSplits.push_back( + {0, 0, s[i], imageHeight, imageWidth, e[i] - s[i]}); + } + + return imageRegionSplits; +} + +} // namespace + +llvm::SmallVector> +getImageRegionThreadSplits(const int &numThreads, const int &imageHeight, + const int &imageWidth, const int &imageDepth, + const int subH, const int subW, const int strideH, + const int strideW) { + // Special case for 1x1 convolutions + // We try to split these depthwise(channelwise) + if (imageHeight == 1 && imageWidth == 1 && subH == 0 && subW == 0 && + strideH == 1 && strideW == 1) { + return getDepthwiseThreadSplits(numThreads, imageHeight, imageWidth, + imageDepth); + } + + // Decide between height or width as the chosen dimension to split + // + // If we can cleanly divide a dimension by numThreads, we choose that one + // If that's not possible, we pick the larger dimension + int dimSize; + bool isHeightChosenDim; + // When we multi-thread Transpose Conv, we have to take output strides into + // account + auto alignedImageHeight = imageHeight / strideH; + auto alignedImageWidth = imageWidth / strideW; + + if (alignedImageHeight % numThreads == 0) { + dimSize = alignedImageHeight; + isHeightChosenDim = true; + } else if (alignedImageWidth % numThreads == 0) { + dimSize = alignedImageWidth; + isHeightChosenDim = false; + } else { + dimSize = alignedImageHeight > alignedImageWidth ? alignedImageHeight + : alignedImageWidth; + isHeightChosenDim = alignedImageHeight > alignedImageWidth ? true : false; + } + + llvm::SmallVector> imageRegionSplits; + // Handle small dim cases using tables + // TODO + // if (dimSize <= 4) { + // if (succeeded(getSmallDimSplits(imageRegionSplits, numThreads, dimSize, + // isHeightChosenDim, alignedImageHeight, + // alignedImageWidth, imageHeight, + // imageWidth, subH, subW, strideH, + // strideW))) { + // return imageRegionSplits; + // } + // } + + // Divide the work among the threads + // + // For e.g., + // If the dim size is 6 and numThreads is 4, + // we split the work as 2, 2, 1, 1 + // + // If the dim size is smaller than numThreads, + // For e.g., + // If the dim size is 2 and numThreads is 3, + // we will only use two threads + llvm::SmallVector dimSplits; + for (int i = numThreads; i > 0; --i) { + auto split = static_cast(ceil(double(dimSize) / double(i))); + dimSize -= split; + if (split > 0) { + if (isHeightChosenDim) { + dimSplits.push_back(split * strideH); + } else { + dimSplits.push_back(split * strideW); + } + } + } + + // If odd sizes, will need to adjust the last split + if ((isHeightChosenDim && imageHeight % 2 == 1) || + (!isHeightChosenDim && imageWidth % 2 == 1)) { + dimSplits[dimSplits.size() - 1]++; + } + + // Create imageRegions for each of the threads + // An imageregion is of the form + // {topLeftRow, topLeftColumn, numberOfRows, numberOfColumns} + int topLeftRow = 0; + int topLeftColumn = 0; + for (auto &split : dimSplits) { + if (isHeightChosenDim) { + split = (topLeftRow + subH + split > imageHeight && imageHeight % 2 == 1) + ? split - 1 + : split; + imageRegionSplits.push_back( + {topLeftRow + subH, topLeftColumn, 0, split, imageWidth, imageDepth}); + topLeftRow += split; + } else { + split = (topLeftColumn + subW + split > imageWidth && imageWidth % 2 == 1) + ? split - 1 + : split; + imageRegionSplits.push_back({topLeftRow, topLeftColumn + subW, 0, + imageHeight, split, imageDepth}); + topLeftColumn += split; + } + } + + return imageRegionSplits; +} + +} // namespace mlir::xcore::utils diff --git a/xformer/Utils/ThreadSupport.h b/xformer/Utils/ThreadSupport.h new file mode 100644 index 000000000..f7289dad9 --- /dev/null +++ b/xformer/Utils/ThreadSupport.h @@ -0,0 +1,21 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#ifndef XFORMER_UTILS_THREADSUPPORT_H +#define XFORMER_UTILS_THREADSUPPORT_H + +#include "llvm/ADT/SmallVector.h" + +#include + +namespace mlir::xcore::utils { + +llvm::SmallVector> +getImageRegionThreadSplits(const int &threadCount, const int &imageHeight, + const int &imageWidth, const int &imageDepth, + const int subH = 0, const int subW = 0, + const int strideH = 1, const int strideW = 1); + +} // namespace mlir::xcore::utils + +#endif // XFORMER_UTILS_THREADSUPPORT_H diff --git a/xformer/Utils/TileRamSupport.cpp b/xformer/Utils/TileRamSupport.cpp new file mode 100644 index 000000000..db02754b5 --- /dev/null +++ b/xformer/Utils/TileRamSupport.cpp @@ -0,0 +1,21 @@ +#include "Utils/TileRamSupport.h" + +namespace mlir::xcore::utils { + +std::vector tileRamServerHeader() { + // TODO: Change flash_t struct to mem_server_header_t + // We are reusing the flash_t struct in lib_tflite_micro as the header + // The header version is stored as one integer + // There are four parameter integers in the flash_t struct + // Altogether 20 bytes + constexpr int headerSize = 20; + std::vector header(headerSize, 0); + header[0] = 1; + header[1] = 2; + header[2] = ~1; + header[3] = ~2; + header[8] = headerSize; + return header; +} + +} // namespace mlir::xcore::utils diff --git a/xformer/Utils/TileRamSupport.h b/xformer/Utils/TileRamSupport.h new file mode 100644 index 000000000..09ae1cefb --- /dev/null +++ b/xformer/Utils/TileRamSupport.h @@ -0,0 +1,14 @@ +#ifndef XFORMER_UTILS_TILESUPPORT_H +#define XFORMER_UTILS_TILESUPPORT_H + +#include + +namespace mlir::xcore::utils { + +/** Function that creates a tile_ram_header + */ +std::vector tileRamServerHeader(); + +} // namespace mlir::xcore::utils + +#endif // XFORMER_UTILS_TILESUPPORT_H diff --git a/xformer/Utils/Util.cpp b/xformer/Utils/Util.cpp new file mode 100644 index 000000000..c8ae9904f --- /dev/null +++ b/xformer/Utils/Util.cpp @@ -0,0 +1,209 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Utils/Util.h" + +#include "mlir/Dialect/Quant/QuantTypes.h" +#include "llvm/ADT/ArrayRef.h" + +namespace mlir::xcore::utils { + +size_t getTypeSize(Type type) { + if (auto quantType = type.dyn_cast()) { + return quantType.getStorageType().getIntOrFloatBitWidth() / 8; + } else if (auto floatType = type.dyn_cast()) { + return floatType.getWidth() / 8; + } else if (auto intType = type.dyn_cast()) { + return intType.getWidth() / 8; + } else { + llvm_unreachable("Unsupported type"); + } + return 0; +} + +int getShapedTypeSize(ShapedType t) { + int sizeInBytes = getTypeSize(t.getElementType()); + + llvm::ArrayRef shape = t.getShape(); + // Handle dynamic shapes + for (auto &dim : shape) { + sizeInBytes *= (ShapedType::isDynamic(dim) ? 1 : dim); + } + + return sizeInBytes; +} + +SmallVector getI32DimFromI64Dim(ArrayRef dims) { + SmallVector output_shape_values; + for (auto dim : dims) { + output_shape_values.push_back( + ShapedType::isDynamic(dim) ? -1 : static_cast(dim)); + } + return output_shape_values; +} + +quant::UniformQuantizedType +getQType(mlir::TypedValue tensor) { + return tensor.getType() + .cast() + .getElementType() + .cast(); +} + +bool hasSameShape(ShapedType type1, ShapedType type2) { + llvm::ArrayRef shape1 = type1.getShape(); + llvm::ArrayRef shape2 = type2.getShape(); + + if (shape1.size() != shape2.size()) { + return false; + } + + // Handle dynamic shapes + for (int i = 0; i < shape1.size(); i++) { + int d1 = (ShapedType::isDynamic(shape1[i]) ? 1 : shape1[i]); + int d2 = (ShapedType::isDynamic(shape2[i]) ? 1 : shape2[i]); + if (d1 != d2) { + return false; + } + } + + return true; +} + +bool hasOnlyChannelPadding(DenseIntElementsAttr attr) { + if (attr.getNumElements() != 8) + return false; + auto values = attr.getValues(); + return values[{0, 0}] == 0 && values[{0, 1}] == 0 && values[{1, 0}] == 0 && + values[{1, 1}] == 0 && values[{2, 0}] == 0 && values[{2, 1}] == 0; +} + +bool hasOnlySpatialPadding(DenseIntElementsAttr attr) { + if (attr.getNumElements() != 8) + return false; + auto values = attr.getValues(); + return values[{0, 0}] == 0 && values[{0, 1}] == 0 && values[{3, 0}] == 0 && + values[{3, 1}] == 0; +} + +Type getValElementType(Value tensor) { + return tensor.getType().template cast().getElementType(); +} + +ArrayRef getValShape(Value tensor) { + return tensor.getType().template cast().getShape(); +} + +bool checkSliceNoOp(RankedTensorType inputType, RankedTensorType outputType) { + const int rank = inputType.getRank(); + if (rank != outputType.getRank()) { + return false; + } + bool isNoOp = true; + for (int i = 0; i < rank; i++) { + if (inputType.getDimSize(i) != outputType.getDimSize(i)) { + isNoOp = false; + break; + } + } + return isNoOp; +} + +int mergeAxes(std::vector &begin, std::vector &size, + std::vector &inShape, std::vector &outShape, + int rank) { + + for (int i = rank - 1; i > 0; i--) { + while ((inShape[i] == outShape[i]) && (i > 0)) { + const int mul = inShape[i]; + inShape[i - 1] *= mul; + outShape[i - 1] *= mul; + begin[i - 1] *= mul; + size[i - 1] *= mul; + inShape.erase(inShape.begin() + i); + outShape.erase(outShape.begin() + i); + begin.erase(begin.begin() + i); + size.erase(size.begin() + i); + rank -= 1; + i -= 1; + } + } + if ((inShape[0] == 1) && (outShape[0] == 1)) { + inShape.erase(inShape.begin()); + outShape.erase(outShape.begin()); + begin.erase(begin.begin()); + size.erase(size.begin()); + rank -= 1; + } + return rank; +} + +// Creates a constant op for a shape vector. +Value createShapeConstOp(PatternRewriter &rewriter, Location loc, + const SmallVector &shapeVec) { + SmallVector shapeVecI32; + for (auto val : shapeVec) { + shapeVecI32.push_back(static_cast(val)); + } + auto shapeType = RankedTensorType::get( + {static_cast(shapeVecI32.size())}, rewriter.getI32Type()); + auto shapeAttr = DenseIntElementsAttr::get(shapeType, shapeVecI32); + return rewriter.create(loc, shapeType, shapeAttr); +} + +// Helper function for reshape-transpose-reshape pattern. +LogicalResult +reshapeTransposeReshape(PatternRewriter &rewriter, Value tensor, + const SmallVector &reshapeShape, + const SmallVector &permVec, + const SmallVector &origShape, + Value &result) { + auto loc = tensor.getLoc(); + auto tensorType = tensor.getType().cast(); + auto elementType = tensorType.getElementType(); + + // Reshape tensor to reshapeShapeExclBatch. + Value newShapeOp = createShapeConstOp(rewriter, loc, reshapeShape); + if (!newShapeOp) + return failure(); + auto reshapedType = RankedTensorType::get(reshapeShape, elementType); + auto reshapedTensor = + rewriter.create(loc, reshapedType, tensor, newShapeOp); + + // Convert permVecExclBatch to int32_t vector. + SmallVector permVecI32; + for (auto val : permVec) { + permVecI32.push_back(static_cast(val)); + } + + // Create perm op. + auto permType = RankedTensorType::get( + {static_cast(permVecI32.size())}, rewriter.getI32Type()); + auto permAttr = DenseIntElementsAttr::get(permType, permVecI32); + auto permOp = rewriter.create(loc, permType, permAttr); + + // Compute transposed shape. + SmallVector transposedShape; + for (auto idx : permVec) { + if (idx < 0 || idx >= reshapeShape.size()) + return failure(); + transposedShape.push_back(reshapeShape[idx]); + } + auto transposedType = RankedTensorType::get(transposedShape, elementType); + + // Transpose. + auto transposedTensor = rewriter.create( + loc, transposedType, reshapedTensor, permOp); + + // Reshape back to original shape. + Value origShapeOp = createShapeConstOp(rewriter, loc, origShape); + if (!origShapeOp) + return failure(); + auto finalTensor = rewriter.create( + loc, tensorType, transposedTensor, origShapeOp); + + result = finalTensor.getResult(); + return success(); +} + +} // namespace mlir::xcore::utils diff --git a/xformer/Utils/Util.h b/xformer/Utils/Util.h new file mode 100644 index 000000000..23e082292 --- /dev/null +++ b/xformer/Utils/Util.h @@ -0,0 +1,94 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#ifndef XFORMER_UTILS_UTIL_H +#define XFORMER_UTILS_UTIL_H + +#include "mlir/Dialect/Quant/QuantTypes.h" +#include "mlir/IR/BuiltinTypeInterfaces.h" +#include "mlir/IR/BuiltinTypes.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" +#include + +namespace mlir::xcore::utils { + +int getShapedTypeSize(ShapedType t); +bool hasSameShape(ShapedType type1, ShapedType type2); +size_t getTypeSize(Type type); +SmallVector getI32DimFromI64Dim(ArrayRef dims); +bool hasOnlyChannelPadding(DenseIntElementsAttr attr); +bool hasOnlySpatialPadding(DenseIntElementsAttr attr); + +quant::UniformQuantizedType getQType(mlir::TypedValue tensor); + +bool checkSliceNoOp(RankedTensorType inputType, RankedTensorType outputType); + +template bool isNBitSignedQType(Type type) { + return (type.template isa() && + type.template cast().isSigned() && + type.template cast() + .getStorageTypeIntegralWidth() == N); +} + +Type getValElementType(Value tensor); + +ArrayRef getValShape(Value tensor); + +template +ArrayRef castArrayRef(ArrayRef ref) { + std::vector output; + for (auto val : ref) { + output.push_back(static_cast(val)); + } + return ArrayRef(output); +} + +template bool checkBinaryCompatibility(T op) { + auto lhsType = op.getLhs().getType().template cast(); + auto rhsType = op.getRhs().getType().template cast(); + auto outputType = op.getOutput().getType().template cast(); + + // Check for invalid types and return + // We don't currently handle the unusual case where both input shapes have + // to be broadcasted. Either both input shapes must match the output or one + // of the inputs has to be broadcasted. + if (!hasSameShape(rhsType, outputType) && + !hasSameShape(lhsType, outputType)) { + return false; + } + Type lhsElemType = lhsType.getElementType(); + Type rhsElemType = rhsType.getElementType(); + Type outputElemType = outputType.getElementType(); + + if (!isNBitSignedQType<8>(lhsElemType) || + !isNBitSignedQType<8>(rhsElemType) || + !isNBitSignedQType<8>(outputElemType)) { + return false; + } + return true; +} + +int mergeAxes(std::vector &begin, std::vector &size, + std::vector &inShape, std::vector &outShape, + int rank); + +Value createShapeConstOp(PatternRewriter &rewriter, Location loc, + const SmallVector &shapeVec); + +LogicalResult +reshapeTransposeReshape(PatternRewriter &rewriter, Value tensor, + const SmallVector &reshapeShape, + const SmallVector &permVec, + const SmallVector &origShape, + Value &result); + +template +static SmallVector denseToVector(DenseIntElementsAttr permAttr) { + SmallVector permVec; + for (auto val : permAttr.getValues()) + permVec.push_back(static_cast(val)); + return permVec; +} +} // namespace mlir::xcore::utils + +#endif // XFORMER_UTILS_UTIL_H diff --git a/xformer/Utils/Utils.td b/xformer/Utils/Utils.td new file mode 100644 index 000000000..c0c722ad5 --- /dev/null +++ b/xformer/Utils/Utils.td @@ -0,0 +1,128 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +// Utility predicates that are shared by multiple passes. + +def isBetaFloatEnabled : Constraint>; + +// Check that bytes per pixel is a multiple of n +class HasMultipleOfNBytesPerPixel + : Constraint< + CPred<"$0.getType().cast().getDimSize(3) % "#n#" == 0">>; + +def HasOnlyChannelPadding + : Constraint())">>; + +def HasOnlySpatialPadding + : Constraint())">>; + +// Casts $1 to a dequantized type and then casts that to a quantized type +// using the quantization parameters from the type in $0 +// $0 = tensor +// $1 = tensor +// We create tensor +class UpdateShapeWithAxis + : NativeCodeCall< + "quant::CastQuantizedTypeAttrFromExpressedType($_builder, $0, " + "quant::QuantizedType::castToExpressedType($1.getType()), "#i#")">; + +class IsQuantizedType + : Constraint($0.getType().cast()." + "getElementType())">>; + +// Get padding values and output type as two return values +def GetConv2DPaddingValues + : NativeCodeCall<"getConv2DPaddingValues($_builder, " + "$0.getDefiningOp())", + 2>; + +// Get padding values and output type as two return values +def GetDepthwiseConv2DPaddingValues + : NativeCodeCall< + "getConv2DPaddingValues($_builder, " + "$0.getDefiningOp())", + 2>; + +// Get padding values and output type as two return values +def GetMaxPool2DPaddingValues + : NativeCodeCall<"getMaxPool2DPaddingValues($_builder, " + "$0.getDefiningOp())", + 2>; + +// PyTorch remnant opt +// Relu(Minimum(x, 127)) -> Relu(x) +// We can ignore minimum of (x,127) as it doesn't do anything +class IsSplatAndEqualTo + : Constraint< + CPred<"dyn_cast($0.getDefiningOp()) && " + "dyn_cast($0.getDefiningOp()).getValue()." + "cast().isSplat() && " + "dyn_cast($0.getDefiningOp()).getValue()." + "cast().getSplatValue() == "#n>>; + +class IsZeroPointNotEqualTo + : Constraint< + CPred<"dyn_cast($0.getType().cast<" + "ShapedType>().getElementType()).getZeroPoint() != "#n>>; + +// Get the dimension size as integer attr. +class GetDimAsI32 + : NativeCodeCall< + "$_builder.getIntegerAttr($_builder.getIntegerType(32), " + "$0.getType().cast().getDimSize("#n#"))">; + +def getTypeOf1WithQParamsOf0 + : NativeCodeCall< + "dyn_cast($0.getType().cast<" + "ShapedType>().getElementType()).castFromExpressedType(mlir::quant::" + "UniformQuantizedType::castToExpressedType($1.getType()))">; + +def getTypeAttrOf1WithQParamsOf0 + : NativeCodeCall< + "mlir::TypeAttr::get(dyn_cast($0." + "getType().cast().getElementType())." + "castFromExpressedType(mlir::quant::UniformQuantizedType::" + "castToExpressedType($1.getType())))">; + +def HasSpatialAxisForMean + : Constraint().getNumElements() == 2 && " + "($0.cast().getValues()[0] == 1 " + "&&" + "$0.cast().getValues()[1] == 2)">>; + +class HasRank + : Constraint().getRank() == "#n>>; + +def getExpandedShape + : NativeCodeCall<"RankedTensorType::get({1, 1, " + "$0.getType().cast().isDynamicDim(0)?1:$0." + "getType().cast().getDimSize(0)," + "$0.getType().cast().getDimSize(1)}, " + "$0.getType().cast().getElementType())">; + +def getExpandedShapeAttr + : NativeCodeCall< + "DenseIntElementsAttr::get(RankedTensorType::get({2}, " + "rewriter.getI32Type()), " + "{static_cast($0.getType().cast().isDynamicDim(" + "0)?1: $0.getType().cast().getDimSize(0)), " + "static_cast($0.getType().cast()." + "getDimSize(1))})">; + +def PadChannelOutputType + : NativeCodeCall< + "RankedTensorType::get({$0.getType().cast().getDimSize(0)" + ", $0.getType().cast().getDimSize(1), " + "$0.getType().cast().getDimSize(2), " + "$1.getType().cast().getDimSize(3)}, " + "$0.getType().cast().getElementType())">; + +// Get padding values and output type as two return values +def GetBConv2DPaddingValues + : NativeCodeCall<"getBConv2DPaddingValues($_builder, " + "$0.getDefiningOp())", + 2>; diff --git a/xformer/Version.h b/xformer/Version.h new file mode 100644 index 000000000..e0338ce2a --- /dev/null +++ b/xformer/Version.h @@ -0,0 +1,15 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#ifndef XFORMER_VERSION_H_ +#define XFORMER_VERSION_H_ + +namespace xformer { + +unsigned majorVersion = 1; +unsigned minorVersion = 4; +unsigned patchVersion = 1; + +} // namespace xformer + +#endif // XFORMER_VERSION_H_ diff --git a/xformer/WORKSPACE b/xformer/WORKSPACE new file mode 100644 index 000000000..8ede7600f --- /dev/null +++ b/xformer/WORKSPACE @@ -0,0 +1,143 @@ +workspace(name = "xformer") + +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") + +################################ Platforms #################################### +# Adding this to address JDK not found on M1 macs for bazel error +# https://github.com/GerritCodeReview/gerrit/commit/06b7b99768bfb6f611f70be741c8cb4f82afdf44 +http_archive( + name = "platforms", + sha256 = "379113459b0feaf6bfbb584a91874c065078aa673222846ac765f86661c27407", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.5/platforms-0.0.5.tar.gz", + "https://github.com/bazelbuild/platforms/releases/download/0.0.5/platforms-0.0.5.tar.gz", + ], +) + +################################## Skylib ##################################### +SKYLIB_VERSION = "1.3.0" + +http_archive( + name = "bazel_skylib", + sha256 = "74d544d96f4a5bb630d465ca8bbcfe231e3594e5aae57e1edbf17a6eb3ca2506", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/{version}/bazel-skylib-{version}.tar.gz".format(version = SKYLIB_VERSION), + "https://github.com/bazelbuild/bazel-skylib/releases/download/{version}/bazel-skylib-{version}.tar.gz".format(version = SKYLIB_VERSION), + ], +) +load("@bazel_skylib//lib:paths.bzl", "paths") + +############################### Compile Commands ############################### +# Hedron's Compile Commands Extractor for Bazel, used to get clangd to work +# Replace commit hash with latest version, later setup automatic update tool maybe? +BCCE_HASH = "eca42c63700fccdc49cf58177e0a96f0f6075a68" +http_archive( + name = "hedron_compile_commands", + url = "https://github.com/hedronvision/bazel-compile-commands-extractor/archive/{hash}.tar.gz".format(hash = BCCE_HASH), + strip_prefix = "bazel-compile-commands-extractor-{hash}".format(hash = BCCE_HASH), +) +load("@hedron_compile_commands//:workspace_setup.bzl", "hedron_compile_commands_setup") +hedron_compile_commands_setup() + +################################## TensorFlow ################################## +http_archive( + name = "org_tensorflow", + patch_args = ["-p1"], + patches = [ + "//patches:flatbuffer_export.patch", + "//patches:llvm_python.patch", + "//patches:softmax.patch", + ], + sha256 = "f771db8d96ca13c72f73c85c9cfb6f5358e2de3dd62a97a9ae4b672fe4c6d094", + strip_prefix = "tensorflow-2.15.0", + urls = [ + "https://github.com/tensorflow/tensorflow/archive/refs/tags/v2.15.0.zip", + ], +) + +http_archive( + name = "rules_python", + sha256 = "0a8003b044294d7840ac7d9d73eef05d6ceb682d7516781a4ec62eeb34702578", + strip_prefix = "rules_python-0.24.0", + url = "https://github.com/bazelbuild/rules_python/archive/refs/tags/0.24.0.tar.gz", +) + +load("@rules_python//python:repositories.bzl", "python_register_toolchains") +load( + "@org_tensorflow//tensorflow/tools/toolchains/python:python_repo.bzl", + "python_repository", +) + +python_repository(name = "python_version_repo") + +load("@python_version_repo//:py_version.bzl", "HERMETIC_PYTHON_VERSION") + +python_register_toolchains( + name = "python", + ignore_root_user_error = True, + python_version = HERMETIC_PYTHON_VERSION, +) + +# Import all of the tensorflow dependencies. Note that we are deliberately +# letting TensorFlow take control of all the dependencies it sets up, whereas +# ours are initialized with `maybe`. Actually tracking this with Bazel is PITA +# and for now this gets TF stuff building. This includes, for instance, +# @llvm-project and @com_google_absl. +load("@org_tensorflow//tensorflow:workspace3.bzl", "tf_workspace3") +tf_workspace3() +load("@org_tensorflow//tensorflow:workspace2.bzl", "tf_workspace2") +tf_workspace2() +load("@org_tensorflow//tensorflow:workspace1.bzl", "tf_workspace1") +tf_workspace1() +load("@org_tensorflow//tensorflow:workspace0.bzl", "tf_workspace0") +tf_workspace0() + +################################# lib_nn ####################################### +new_local_repository( + name = "lib_nn", + path = "../third_party/lib_nn", + build_file = "lib_nn.BUILD", +) + +############################# lib_tflite_micro ################################# +new_local_repository( + name = "lib_tflite_micro", + path = "../third_party/lib_tflite_micro", + build_file = "lib_tflite_micro.BUILD", +) + +########################### tflite_micro_compiler ############################## +new_local_repository( + name = "lib_tflmc", + path = "../third_party/lib_tflite_micro/tflite_micro_compiler", + build_file = "lib_tflmc.BUILD", +) + +############################## tflite_micro #################################### +local_repository( + name = "tflite_micro", + path = "../third_party/lib_tflite_micro/lib_tflite_micro/submodules/tflite-micro", +) + +# We require this due to includes in BUILD file in tflite_micro/python/tflite_micro +load("@rules_python//python:pip.bzl", "pip_parse") +pip_parse( + name = "tflm_pip_deps", + requirements_lock = "@tflite_micro//third_party:python_requirements.txt", +) + +########################### larq compute engine ################################ +http_archive( + name = "lce", + patch_args = ["-p1"], + patches = [ + "//patches:tf_update.patch", + ], + sha256 = "809412dec49eb061bf7a64b721782b02cd47321a118b99c9cfa092756eef781b", + strip_prefix = "compute-engine-0.13.0", + urls = [ + "https://github.com/larq/compute-engine/archive/refs/tags/v0.13.0.zip", + ], +) + diff --git a/xformer/XCoreOptMain.cpp b/xformer/XCoreOptMain.cpp new file mode 100644 index 000000000..adf8cdff9 --- /dev/null +++ b/xformer/XCoreOptMain.cpp @@ -0,0 +1,819 @@ +// Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +// XMOS Public License: Version 1 + +#include "Analysis/MemoryPlan.h" +#include "IR/XCoreOps.h" +#include "Transforms/Options.h" +#include "Transforms/Passes.h" +#include "Utils/FileIO.h" +#include "Version.h" + +#include "lib_nn/api/version.h" +#include "lib_tflite_micro/api/version.h" +#include "lib_tflite_micro/api/xcore_shared_config.h" +#include "mlir/Dialect/Quant/QuantOps.h" +#include "mlir/IR/AsmState.h" +#include "mlir/Parser/Parser.h" +#include "mlir/Pass/PassManager.h" +#include "mlir/Support/FileUtilities.h" +#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/Format.h" +#include "llvm/Support/InitLLVM.h" +#include "llvm/Support/SourceMgr.h" +#include "llvm/Support/ToolOutputFile.h" +// TODO: dpk +// refactor tflmc to have include folder +#include "src/Api.h" + +using namespace llvm; +using namespace mlir; + +namespace mlir::xcore { + +// Mark all our options with this category, everything else (except for -version +// and -help) will be hidden. +static cl::OptionCategory XformerCategory("Xformer options"); + +llvm::cl::opt targetArchOption( + "xcore-target-arch", cl::desc("Choose target architecture:"), + cl::values(clEnumVal(XS3A, "XS3A"), clEnumVal(VX4A, "VX4A")), + cl::init(XS3A), cl::cat(XformerCategory)); + +llvm::cl::list loadInputExternallyOption( + "xcore-load-input-tensors-externally", + cl::desc( + "Place the specified input tensors in external memory. This is " + "useful when input tensors are larger than what would fit in SRAM. The " + "format is \"input_tensor_name_1,input_tensor_name_2,...\""), + cl::CommaSeparated, cl::cat(XformerCategory)); + +llvm::cl::list storeOutputExternallyOption( + "xcore-store-output-tensors-externally", + cl::desc("Place the specified output tensors in external memory. This is " + "useful when output tensors are larger than what would fit in " + "SRAM. The " + "format is \"output_tensor_name_1,output_tensor_name_2,...\""), + cl::CommaSeparated, cl::cat(XformerCategory)); + +llvm::cl::list sameAllocationInputOutputTensorOption( + "xcore-same-allocation-input-output-tensor", + cl::desc("Allocate this input and output tensor in the same memory " + "location. This helps avoiding a memcopy from output to input in " + "case of recurrent networks. The first tensor must be the input."), + cl::CommaSeparated, cl::cat(XformerCategory)); + +cl::opt enableMemoryAnalysisOption( + "xcore-run-memory-analysis", + cl::desc("Run memory analysis to aid in operation splitting."), + cl::init(false), cl::cat(XformerCategory)); + +cl::opt + quadraticLookupErrorOption("xcore-quadratic-lookup-error", + cl::desc("Used only for int16. Defaults to TFL " + "ops if quadratic lookup error is more " + "than provided " + "(default = 1)."), + cl::init(1), cl::cat(XformerCategory)); + +cl::opt enableBetaFloatOption("xcore-enable-beta-float", + cl::desc("Enable beta float support."), + cl::init(false), cl::cat(XformerCategory)); + +cl::opt threadCountOption("xcore-thread-count", + cl::desc("[-tc] Thread count"), cl::init(1), + cl::cat(XformerCategory)); + +cl::alias aliasThreadCountOption("tc", + cl::desc("Alias to --xcore-thread-count"), + cl::aliasopt(threadCountOption)); + +cl::opt + weightsFilenameOption("xcore-weights-file", + cl::desc("[-f] The file to write weights into so " + "that they can be externally loaded."), + cl::value_desc("filename"), cl::init(""), + cl::cat(XformerCategory)); + +cl::alias aliasWeightsFilenameOption("f", + cl::desc("Alias for --xcore-weights-file"), + cl::aliasopt(weightsFilenameOption)); + +cl::opt weightsAsArrayOption( + "xcore-write-weights-as-array", + cl::desc( + "Write the weights in the form of an array in a source file (creates " + ".c/.h files with as the file name)."), + cl::init(false), cl::cat(XformerCategory)); + +cl::opt weightsInExternalMemory( + "xcore-weights-in-external-memory", + cl::desc("Annotate the generated weights array with an attribute to place " + "it in external memory."), + cl::init(false), cl::cat(XformerCategory)); + +cl::opt asyncLoadWeightsOption( + "xcore-async-load-weights", + cl::desc("Enable loading weights from flash asynchronously. This does not " + "affect loads from external memory."), + cl::init(false), cl::cat(XformerCategory)); + +cl::opt loadExternallyIfLargerOption( + "xcore-load-externally-if-larger", + cl::desc("Load constants externally if larger than given limit in bytes " + "(default = 96 bytes). Cannot be specified when " + "xcore-weights-file is not provided."), + cl::init(96), cl::cat(XformerCategory), cl::Hidden); + +cl::opt maxLoadExternalSizeOption( + "xcore-max-load-external-size", + cl::desc("The size of external load image from flash or tile will be " + "limited to the max specified bytes " + "(default = UINT_MAX bytes)."), + cl::init(UINT_MAX), cl::cat(XformerCategory), cl::Hidden); + +// This option is to provide an error threshold. +// The maximum average error between the reference and quantised +// implementations of the output transform over each channel is used to decide +// if to replace TFL Conv ops with XC Conv ops. +// The average is defined over the range of non-saturating +// accumulators, i.e. accumulators that do not reach a saturating output in the +// int8 space. The error calcualated is the maximum average for all of the +// channels. +cl::opt convQuantErrorThresholdOption( + "xcore-conv-err-threshold", + cl::desc("Defaults to TFL Conv ops if channel quantization error is more " + "than the provided threshold " + "(default = 0.25)."), + cl::init(0.25), cl::cat(XformerCategory)); + +cl::opt convForceErrorCheckOption( + "xcore-force-conv-err-full-check", + cl::desc("Enable higher precision(more time-consuming) check for " + "calculating channel quantization error."), + cl::init(false), cl::cat(XformerCategory), cl::Hidden); + +cl::opt convMultiplierFactorOption( + "xcore-conv-multiplier-factor", + cl::desc("If the dynamic range for multipliers is too large, quantization " + "error increases. This option is a temporary solution to set all " + "the multipliers to be clamped to a specified multiple of the " + "minimum multiplier." + "(default = UINT32_MAX)."), + cl::init(UINT32_MAX), cl::cat(XformerCategory), cl::Hidden); + +cl::opt opSplitTensorArenaOption( + "xcore-op-split-tensor-arena", + cl::desc("Enable prototype op split to reduce tensor arena size."), + cl::init(false), cl::cat(XformerCategory)); + +cl::opt + opSplitTargetSizeOption("xcore-op-split-target-size", + cl::desc("Op split target max tensor arena size."), + cl::init(700000), cl::cat(XformerCategory)); + +cl::list + opSplitBottomOpsOption("xcore-op-split-bottom-op", + cl::desc("Manual override Op split, bottom op."), + cl::CommaSeparated, cl::cat(XformerCategory)); + +cl::list opSplitTopOpsOption("xcore-op-split-top-op", + cl::desc("Manual override Op split, top op."), + cl::CommaSeparated, cl::cat(XformerCategory)); + +cl::list opSplitNumSplitsOption( + "xcore-op-split-num-splits", + cl::desc("Manual override Op split, number of splits."), cl::CommaSeparated, + cl::cat(XformerCategory)); + +cl::opt allowInputModificationOption( + "xcore-allow-input-modification", + cl::desc("Allow the compiler to modify input tensor for optimizations."), + cl::init(false), cl::cat(XformerCategory), cl::Hidden); + +cl::opt mergeTransposeOption( + "xcore-merge-transpose", + cl::desc("Try to merge transpose and inverse transpose together."), + cl::init(true), cl::cat(XformerCategory), cl::Hidden); + +cl::opt convDebugOption("xcore-conv-debug", + cl::desc("Enable conv debug prints."), + cl::init(false), cl::cat(XformerCategory), + cl::Hidden); + +cl::opt tryOverlapModifyingOpsOption( + "xcore-try-overlap-modifying-ops", + cl::desc("Try to overlap modifying ops in the memory allocator"), + cl::init(true), cl::cat(XformerCategory), cl::Hidden); + +cl::opt enablePagingOption("xcore-enable-paging", + cl::desc("Enable paging."), cl::init(false), + cl::cat(XformerCategory), cl::Hidden); + +cl::opt + livenessPagingOption("xcore-liveness-range-for-paging", + cl::desc("Control the first used and last used range " + "over which paging is applied"), + cl::init(30), cl::cat(XformerCategory), cl::Hidden); + +cl::opt convChannelwiseSplitSizeOption( + "xcore-conv-channelwise-split-size", + cl::desc( + "Specify channelwise split size for convolutions (default = 100000)."), + cl::init(100000), cl::cat(XformerCategory), cl::Hidden); + +} // namespace mlir::xcore + +static LogicalResult runPassPipeline(const PassPipelineCLParser &passPipeline, + const OwningOpRef &mod, + MLIRContext *context) { + auto module = mod.get(); + PassManager pm(module->getName(), mlir::OpPassManager::Nesting::Implicit); + applyPassManagerCLOptions(pm); + + auto errorHandler = [&](const Twine &msg) { + return emitError(UnknownLoc::get(context)) << msg; + }; + + if (passPipeline.hasAnyOccurrences()) { + // Build the provided pipeline. + if (failed(passPipeline.addToPipeline(pm, errorHandler))) + return failure(); + + // Run the pipeline. + if (failed(pm.run(*mod))) + return failure(); + + } else { + + xcore::buildXCorePreOpSplitPassPipeline(pm); + if (failed(pm.run(*mod))) { + return failure(); + } + + int lastGoodId = 0; + unsigned lastGoodNumSplits = 4; + if (mlir::xcore::enableMemoryAnalysisOption) { + + auto fnName = + mod.get()->getAttr("xc.fn_name").cast().str(); + // run a pass with certain config and get arena size + // do that again until small size + // continue with that mod + + auto funcOp = mod.get().lookupSymbol(fnName); + auto mPlan = mlir::xcore::MemoryPlan(funcOp); + int peakUsage, peakOpId; + auto offlineOffsetsWithoutOverlap = mPlan.getAllocatedOffsets( + /*overlapOps=*/false, peakUsage, peakOpId); + mPlan.printMemoryPlan(); + + // set config for op split + // set op id with 4 splits + // find memory usage, if 10% larger okay, otherwise give up + int lastGoodUsage = 0; + + mlir::xcore::opSplitTopOpsOption.clear(); + mlir::xcore::opSplitTopOpsOption.setInitialValues({0}); + mlir::xcore::opSplitBottomOpsOption.clear(); + mlir::xcore::opSplitBottomOpsOption.setInitialValues( + {static_cast(peakOpId)}); + mlir::xcore::opSplitNumSplitsOption.clear(); + mlir::xcore::opSplitNumSplitsOption.setInitialValues({lastGoodNumSplits}); + + // otherwise try down + // get next down op from current bottom op + // rerun + // if under 10% larger, okay + // while( there is next op && peaksize is under 10% larger than current + // size) + + auto moduleClone = mod.get().clone(); + PassManager pm3(moduleClone->getName(), + mlir::OpPassManager::Nesting::Implicit); + pm3.addPass(mlir::xcore::createOpSplitPass()); + pm3.addPass(mlir::xcore::createPlanMemoryPass()); + + int nextId = peakOpId; + int currentUsage = peakUsage; + bool twoConsecutiveIncreasesInPeakUsage = false; + while (nextId != -1) { + currentUsage = peakUsage; + mlir::xcore::opSplitBottomOpsOption.clear(); + mlir::xcore::opSplitBottomOpsOption.overwriteDefault(); + mlir::xcore::opSplitBottomOpsOption.setInitialValues( + {static_cast(nextId)}); + + auto moduleClone = mod.get().clone(); + OwningOpRef cloneMod(moduleClone); + if (failed(pm3.run(*cloneMod))) { + return failure(); + } + + if (auto attr = moduleClone->getAttr(kMetadataXCPeakUsage)) { + peakUsage = attr.cast().getInt(); + } else { + return failure(); + } + // printf("split bottom op id = %d, usage = %d\n", nextId, peakUsage); + + if (peakUsage >= currentUsage) { + if (!twoConsecutiveIncreasesInPeakUsage) { + twoConsecutiveIncreasesInPeakUsage = true; + } else { + break; + } + } else { + twoConsecutiveIncreasesInPeakUsage = false; + lastGoodId = nextId; + lastGoodUsage = peakUsage; + } + nextId = mPlan.getNextBottomOpId(nextId); + } + + if (lastGoodId != 0) { + mlir::xcore::opSplitBottomOpsOption.clear(); + mlir::xcore::opSplitBottomOpsOption.overwriteDefault(); + mlir::xcore::opSplitBottomOpsOption.setInitialValues( + {static_cast(lastGoodId)}); + + // now find ideal number of splits + currentUsage = lastGoodUsage; + peakUsage = lastGoodUsage; + unsigned numSplits = 4; + while (numSplits == 4 || peakUsage < currentUsage) { + numSplits++; + currentUsage = peakUsage; + mlir::xcore::opSplitNumSplitsOption.clear(); + mlir::xcore::opSplitNumSplitsOption.overwriteDefault(); + mlir::xcore::opSplitNumSplitsOption.setInitialValues({numSplits}); + + auto moduleClone = mod.get().clone(); + OwningOpRef cloneMod(moduleClone); + if (failed(pm3.run(*cloneMod))) { + return failure(); + } + + if (auto attr = moduleClone->getAttr(kMetadataXCPeakUsage)) { + peakUsage = attr.cast().getInt(); + } else { + return failure(); + } + + if (peakUsage < currentUsage) { + lastGoodNumSplits = numSplits; + } + // printf("splits = %d, usage = %d\n", numSplits, peakUsage); + } + } + llvm::outs() << "\nOPERATION SPLIT ANALYSIS (BETA FEATURE)\n" + << "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯"; + llvm::outs() << llvm::format( + "\nThe compiler suggests the following configuration for operation " + "splitting:\nStart op is 0, End op is %d and Number of Splits is " + "%d\nPass the following options to the compiler to get started:\n" + "--xcore-op-split-tensor-arena=1 --xcore-op-split-top-op=0 " + "--xcore-op-split-bottom-op=%d --xcore-op-split-num-splits=%d\n\n", + lastGoodId, lastGoodNumSplits, lastGoodId, lastGoodNumSplits); + // We want to quit at this point and not continue other compiler passes + return success(); + } + + xcore::buildXCoreRemainingPassPipeline(pm); + if (failed(pm.run(*mod))) { + return failure(); + } + } + return success(); +} + +static LogicalResult isCompatibleVersion(cl::opt &version, + int32_t majorVersion, + int32_t minorVersion, + int32_t patchVersion) { + if (!version.empty()) { + SmallVector partsStr; + llvm::SplitString(version, partsStr, "."); + if (partsStr.size() != 3) { + return failure(); + } + SmallVector parts; + int val = 0; + for (auto &i : partsStr) { + if (!llvm::to_integer(i, val, 10)) { + return failure(); + } + parts.push_back(val); + } + + // Check provided repo version with compiler version + // If major version is zero, then minor versions must match + // Otherwise, major versions must match and compiler version + // must be less or equal to provided repo version + if ((majorVersion == 0 && parts[0] == 0 && minorVersion != parts[1]) || + (majorVersion != parts[0]) || (minorVersion > parts[1])) { + return failure(); + } + } + return success(); +} + +static void PrintVersion(raw_ostream &OS) { + OS << SETUPTOOLS_SCM_VERSION << '\n'; +} + +int main(int argc, char **argv) { + llvm::InitLLVM y(argc, argv); + + // Override the default '-h' and use the default PrintHelpMessage() + static llvm::cl::opt help("h", llvm::cl::desc("Alias for -help"), + llvm::cl::Hidden); + + static cl::opt inputFilename(cl::Positional, + cl::desc("")); + static cl::opt outputFilename("o", cl::desc("Output filename"), + cl::value_desc("filename")); + static cl::opt mlirIOEnabled( + "mlir-io", cl::desc("Enable MLIR input and output"), cl::init(false), + cl::cat(mlir::xcore::XformerCategory), cl::Hidden); + static cl::opt verifyDiagnosticsEnabled( + "verify-diagnostics", + cl::desc("Check that emitted diagnostics match " + "expected-* lines on the corresponding line"), + cl::init(false)); + static cl::opt dontMinifyEnabled( + "xcore-dont-minify", + cl::desc("Do not strip debug info and minify the model"), cl::init(false), + cl::cat(mlir::xcore::XformerCategory), cl::Hidden); + static cl::opt tflmcPrefixOption( + "xcore-naming-prefix", + cl::desc("[-xp] Specify naming prefix for compiled model" + "(default = \"model_\")."), + cl::init("model_"), cl::cat(mlir::xcore::XformerCategory)); + static cl::alias aliasTflmcPrefixOption( + "xp", cl::desc("Alias for --xcore-naming-prefix"), + cl::aliasopt(tflmcPrefixOption), cl::cat(mlir::xcore::XformerCategory)); + static cl::opt tflmcPrintEnabled( + "xcore-tflmc-print", cl::desc("Print out memory allocation plan"), + cl::init(false), cl::cat(mlir::xcore::XformerCategory)); + static cl::opt versionLibTfliteMicro( + "xcore-compatible-with-lib-tflite-micro", + cl::desc("Check if lib_tflite_micro version is compatible"), cl::init(""), + cl::cat(mlir::xcore::XformerCategory), cl::Hidden); + static cl::opt versionLibNN( + "xcore-compatible-with-lib-nn", + cl::desc("Check if lib_nn version is compatible"), cl::init(""), + cl::cat(mlir::xcore::XformerCategory), cl::Hidden); + + // Register any command line options. + registerPassManagerCLOptions(); + registerAsmPrinterCLOptions(); + registerMLIRContextCLOptions(); + xcore::registerXCorePassPipeline(); + PassPipelineCLParser passPipeline("", "Compiler passes to run"); + cl::SetVersionPrinter(PrintVersion); + cl::HideUnrelatedOptions(mlir::xcore::XformerCategory); + cl::ParseCommandLineOptions(argc, argv); + if (help) { + llvm::cl::PrintHelpMessage(); + return 0; + } + + // Initialize dialects. + MLIRContext context; + context.loadDialect(); + context.loadDialect(); + context.loadDialect(); + context.loadDialect(); + context.loadDialect(); + context.printOpOnDiagnostic(!verifyDiagnosticsEnabled); + + auto failedMessage = [&](const Twine &msg) { + emitError(UnknownLoc::get(&context)) << msg; + return 1; + }; + + // Validate options + if (mlir::xcore::enableMemoryAnalysisOption && argc > 3) { + return failedMessage("Please don't specify any other options with the " + "--xcore-run-memory-analysis option!"); + } + + if (mlir::xcore::enableMemoryAnalysisOption && !outputFilename.empty()) { + return failedMessage("Please don't specify an output filename with the " + "--xcore-run-memory-analysis option!"); + } + if (!mlirIOEnabled && !mlir::xcore::enableMemoryAnalysisOption && + outputFilename.empty()) { + return failedMessage( + "Please specify an output filename using the -o option!"); + } + + if (mlir::xcore::weightsInExternalMemory.getNumOccurrences() > 0 && + mlir::xcore::weightsAsArrayOption.getNumOccurrences() == 0) { + return failedMessage( + "Please specify xcore-write-weights-as-array" + " when using the xcore-weights-in-external-memory option!"); + } + + if (mlir::xcore::weightsInExternalMemory.getNumOccurrences() > 0 && + mlir::xcore::asyncLoadWeightsOption.getNumOccurrences() > 0) { + return failedMessage("Please don't specify xcore-weights-in-external-memory" + " when using the xcore-async-load-weights option!"); + } + + if (mlir::xcore::loadExternallyIfLargerOption.getNumOccurrences() > 0 && + mlir::xcore::weightsFilenameOption.empty()) { + return failedMessage( + "Please specify the xcore-weights-file option when specifying the " + "xcore-load-externally-if-larger option!"); + } + + if (mlir::xcore::opSplitTargetSizeOption.getNumOccurrences() > 0 && + (!(mlir::xcore::opSplitBottomOpsOption.empty()) || + !(mlir::xcore::opSplitTopOpsOption.empty()) || + !(mlir::xcore::opSplitNumSplitsOption.empty()))) { + return failedMessage( + "Target size option cannot be used with top, bottom, and " + "numSplits options"); + } + + if (mlir::xcore::threadCountOption < 1 || + mlir::xcore::threadCountOption > 5) { + return failedMessage("Please specify a thread count between one and five!"); + } + + llvm::DenseMap positionCountMap; + for (int i = 0; i < mlir::xcore::sameAllocationInputOutputTensorOption.size(); + i++) { + int pos = mlir::xcore::sameAllocationInputOutputTensorOption.getPosition(i); + if (positionCountMap.count(pos)) { + positionCountMap[pos]++; + } else { + positionCountMap[pos] = 1; + } + } + for (auto i : positionCountMap) { + if (i.second != 2) { + return failedMessage( + "Please specify two tensors, an input tensor and output tensor for " + "each of xcore-same-allocation-input-output-tensor options!"); + } + } + + if (mlir::xcore::loadInputExternallyOption.getNumOccurrences() > 0 && + !mlir::xcore::enablePagingOption) { + return failedMessage( + "Please enable the xcore-enable-paging option when specifying the " + "xcore-load-input-tensors-externally option!"); + } + + if (mlir::xcore::storeOutputExternallyOption.getNumOccurrences() > 0 && + !mlir::xcore::enablePagingOption) { + return failedMessage( + "Please enable the xcore-enable-paging option when specifying the " + "xcore-store-output-tensors-externally option!"); + } + + if (failed(isCompatibleVersion( + versionLibTfliteMicro, lib_tflite_micro::major_version, + lib_tflite_micro::minor_version, lib_tflite_micro::patch_version))) { + return failedMessage("Incompatible lib_tflite_micro version!\n\nPlease use " + "lib_tflite_micro version " + + Twine(lib_tflite_micro::major_version) + "." + + Twine(lib_tflite_micro::minor_version) + "." + + Twine(lib_tflite_micro::patch_version)); + } + + if (failed(isCompatibleVersion(versionLibNN, lib_nn::major_version, + lib_nn::minor_version, + lib_nn::patch_version))) { + return failedMessage("Incompatible lib_nn version!\n\nPlease use " + "lib_nn version " + + Twine(lib_nn::major_version) + "." + + Twine(lib_nn::minor_version) + "." + + Twine(lib_nn::patch_version)); + } + + // Parse input. + OwningOpRef mod; + SourceMgr sourceMgr; + if (mlirIOEnabled) { + // Parse the MLIR input file. + std::string errorMessage; + auto file = mlir::openInputFile(inputFilename, &errorMessage); + if (!file) { + return failedMessage(errorMessage); + } + sourceMgr.AddNewSourceBuffer(std::move(file), SMLoc()); + mod = parseSourceFile(sourceMgr, &context); + } else { + // Read flatbuffer and convert to serialized MLIR string. + mod = xcore::utils::readFlatBufferFileToMLIR(inputFilename, &context); + if (!mod) { + return failedMessage("Unable to read flatbuffer file!"); + } + } + + // Disable printing op on diagnostics such as error, remark, warning + context.printOpOnDiagnostic(false); + SourceMgrDiagnosticHandler sourceMgrHandler(sourceMgr, &context); + + // Run transformations + if (verifyDiagnosticsEnabled) { + SourceMgrDiagnosticVerifierHandler sourceMgrHandler(sourceMgr, &context); + (void)runPassPipeline(passPipeline, mod, &context); + if (failed(sourceMgrHandler.verify())) { + return 1; + } + } else { + if (failed(runPassPipeline(passPipeline, mod, &context))) { + return 1; + } + } + + // Print output + if (mlirIOEnabled) { + // Print the MLIR output to stdout + std::string errorMessage; + auto output = mlir::openOutputFile("-", &errorMessage); + if (!output) { + return failedMessage(errorMessage); + } + mod->print(output->os()); + output->os() << '\n'; + } + // Write modified flatbuffer to output file + if (!outputFilename.empty()) { + // Translate MLIR to flatbuffer string + // Prepare metadata + auto modul = mod.get(); + + struct shared_config::xcore_metadata_t sharedCfg; + // Store target arch + sharedCfg.target_arch = mlir::xcore::targetArchOption == mlir::xcore::XS3A + ? nn_target_arch_t::TARGET_ARCH_XS3A + : nn_target_arch_t::TARGET_ARCH_VX4A; + // Store version info + sharedCfg.lib_nn_major_version = lib_nn::major_version; + sharedCfg.lib_nn_minor_version = lib_nn::minor_version; + sharedCfg.lib_nn_patch_version = lib_nn::patch_version; + sharedCfg.lib_tflite_micro_major_version = lib_tflite_micro::major_version; + sharedCfg.lib_tflite_micro_minor_version = lib_tflite_micro::minor_version; + sharedCfg.lib_tflite_micro_patch_version = lib_tflite_micro::patch_version; + sharedCfg.xformer_major_version = xformer::majorVersion; + sharedCfg.xformer_minor_version = xformer::minorVersion; + sharedCfg.xformer_patch_version = xformer::patchVersion; + // Store number of threads needed to execute the model + sharedCfg.required_thread_count = mlir::xcore::threadCountOption; + // By default, there are no externally allocated tensors + sharedCfg.num_external_input_tensors = 0; + sharedCfg.num_external_output_tensors = 0; + auto bufferData = std::string((char *)&sharedCfg, + sizeof(shared_config::xcore_metadata_t)); + + // If there are externally allocated tensors, we mark them in the metadata + if (mlir::xcore::loadInputExternallyOption.size() > 0 || + mlir::xcore::storeOutputExternallyOption.size() > 0) { + if (modul->hasAttr(kMetadataXCNumExternalInputTensorsData)) { + sharedCfg.num_external_input_tensors = + modul + ->getAttrOfType( + kMetadataXCNumExternalInputTensors) + .getInt(); + } + if (modul->hasAttr(kMetadataXCNumExternalOutputTensors)) { + sharedCfg.num_external_output_tensors = + modul + ->getAttrOfType( + kMetadataXCNumExternalOutputTensors) + .getInt(); + } + DenseIntElementsAttr vecattr; + std::vector tensorsData; + if (modul->hasAttr(kMetadataXCNumExternalInputTensorsData)) { + vecattr = modul->getAttrOfType( + kMetadataXCNumExternalInputTensorsData); + tensorsData = std::vector{vecattr.getValues().begin(), + vecattr.getValues().end()}; + assert(tensorsData.size() < shared_config::xcoreMaxNumOfTensors * 3 && + "Externally allocated input tensors exceeds max number!"); + memcpy(&sharedCfg.external_input_tensors_data, + (char *)tensorsData.data(), tensorsData.size() * 4); + } + if (modul->hasAttr(kMetadataXCNumExternalOutputTensorsData)) { + vecattr = modul->getAttrOfType( + kMetadataXCNumExternalOutputTensorsData); + tensorsData = std::vector{vecattr.getValues().begin(), + vecattr.getValues().end()}; + assert(tensorsData.size() < shared_config::xcoreMaxNumOfTensors * 3 && + "Externally allocated output tensors exceeds max number!"); + memcpy(&sharedCfg.external_output_tensors_data, + (char *)tensorsData.data(), tensorsData.size() * 4); + } + bufferData = std::string((char *)&sharedCfg, + sizeof(shared_config::xcore_metadata_t)); + } + // Align to sixteen bytes as metadata value has to be 16-byte aligned + // buffer + bufferData.resize(((bufferData.size() + 15) / 16) * 16); + + std::map metadata; + auto xcoreConfigMetadata = + std::make_pair(shared_config::xcoreMetadataName, bufferData); + + // Offline offsets metadata + + // std::vector offline_offsets = { + // 73728, -1, -1, -1, -1, -1, -1, 0, 129024, 73728, 166272, 132096, + // 73728, 153984, 132096, 73728, 132096, 73728, 0, 52224, 0}; + if (auto attr = modul->getAttr(kMetadataXCOffsets)) { + auto offline_offsets = std::vector{ + attr.cast().getValues().begin(), + attr.cast().getValues().end()}; + + constexpr char kOfflineMemAllocMetadata[] = "OfflineMemoryAllocation"; + /* + | 0 | Offline allocation format version | + | 1 | Subgraph index to which this allocation applies | + | 2 | Number offsets following: n | + | 3 | Byte offset of tensor #0 or -1 to allocate at runtime | + | 4 | Byte offset of tensor #1 or -1 to allocate at runtime | + | ... | ... | + | 3+(n-1) | Byte offset of tensor #(n-1) or -1 to allocate at runtime | + */ + offline_offsets.insert(offline_offsets.begin(), + {0, 0, (int)offline_offsets.size()}); + // Align to sixteen bytes as metadata value has to be 16-byte aligned + // buffer + offline_offsets.resize(((offline_offsets.size() + 3) / 4) * 4); + + auto offlineOffsetsData = std::string((char *)offline_offsets.data(), + offline_offsets.size() * 4); + + auto k = (int32_t *)offlineOffsetsData.data(); +#define DEBUG_TYPE "xcore-memory-plan" + LLVM_DEBUG(llvm::dbgs() << "\n\n"); + for (int i = 0; i < offline_offsets.size(); i++) { + LLVM_DEBUG(llvm::dbgs() << k[i] << ", "); + } + LLVM_DEBUG(llvm::dbgs() << "\n\n"); + + auto offlineOffsetsMetadata = + std::make_pair(kOfflineMemAllocMetadata, offlineOffsetsData); + + LLVM_DEBUG(llvm::dbgs() << "\n\nOFFLINE OFFSETS ENABLED!\n\n"); +#undef DEBUG_TYPE + + metadata.insert(offlineOffsetsMetadata); + } + metadata.insert(xcoreConfigMetadata); + + std::string flatBufferString; + if (failed(xcore::utils::getFlatBufferStringFromMLIR( + modul, metadata, dontMinifyEnabled, flatBufferString))) { + return failedMessage("Failed to obtain flatbuffer string from MLIR!"); + } + + // Write tflite file + std::string outFilename(outputFilename); + if (failed(xcore::utils::writeDataToFile(outFilename, flatBufferString))) { + return failedMessage("Failed to write output tflite file!"); + } + + // Invoke tflmc and get info + std::stringstream tflmcSourceString, tflmcHeaderString; + try { + std::string argsString; + for (int i = 1; i < argc; i++) { + argsString.append(argv[i]).append(" "); + } + tflmc::TFLMC_Compiler compiler(flatBufferString.data(), &sharedCfg, + SETUPTOOLS_SCM_VERSION, argsString, + tflmcPrefixOption, tflmcPrintEnabled); + llvm::outs() << "Tensor arena size : " << compiler.getTensorArenaSize() + << "\n"; + compiler.writeSource(tflmcSourceString); + compiler.writeHeader(tflmcHeaderString); + } catch (const std::exception &e) { + return failedMessage(e.what()); + } catch (...) { + return failedMessage("Unknown exception while invoking tflmc!"); + } + + std::string tflmcSourceFilename(outputFilename + ".cpp"); + if (failed(xcore::utils::writeDataToFile(tflmcSourceFilename, + tflmcSourceString.str()))) { + return failedMessage("Failed to write output source file!"); + } + + std::string tflmcHeaderFilename(outputFilename + ".h"); + if (failed(xcore::utils::writeDataToFile(tflmcHeaderFilename, + tflmcHeaderString.str()))) { + return failedMessage("Failed to write output header file!"); + } + } + + return 0; +} diff --git a/xformer/lib_nn.BUILD b/xformer/lib_nn.BUILD new file mode 100644 index 000000000..60e78331b --- /dev/null +++ b/xformer/lib_nn.BUILD @@ -0,0 +1,24 @@ +package( + default_visibility = ["//visibility:public"], +) + +cc_library( + name = "nn_lib", + hdrs = glob(["lib_nn/api/*.h*"]) + + glob(["lib_nn/api/geom/*.h*"]) + + glob(["lib_nn/src/asm/*.h*"]) + + glob(["lib_nn/src/*.h*"]), + srcs = glob(["lib_nn/src/c/*.c"]) + + glob(["lib_nn/src/c/util/depthwise/*.c"]) + + glob(["lib_nn/src/c/util/deep/*.c"]) + + glob(["lib_nn/src/c/util/binary/*.c"]) + + glob(["lib_nn/src/c/util/shallow/*.c"]) + + glob(["lib_nn/src/asm/*.c"]) + + glob(["lib_nn/src/cpp/*.cpp"]) + + glob(["lib_nn/src/cpp/filt2d/*.cpp"]) + + glob(["lib_nn/src/cpp/filt2d/geom/*.cpp"]), + includes = ["../../external/lib_nn/lib_nn/api"], + local_defines = ["NN_USE_REF"], + deps = [], + alwayslink = 1, +) diff --git a/xformer/lib_tflite_micro.BUILD b/xformer/lib_tflite_micro.BUILD new file mode 100644 index 000000000..1c327eb7f --- /dev/null +++ b/xformer/lib_tflite_micro.BUILD @@ -0,0 +1,59 @@ +package( + default_visibility = ["//visibility:public"], +) + +cc_library( + name = "shared_headers", + srcs = [ + "lib_tflite_micro/api/version.h", + "lib_tflite_micro/api/xcore_shared_config.h", + ], +) + +filegroup( + name = "XTFLIB_SOURCES", + srcs = [ + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_error_reporter.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_interpreter.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_profiler.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_ops.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_utils.cc", + ], +) + +filegroup( + name = "XTFLIB_KERNEL_SOURCES", + srcs = [ + "lib_tflite_micro/src/thread_call_host_emulation.c", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_common.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_custom_options.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_bsign.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_conv2d_v2.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_maxpool2d.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_detection_post.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_load_weights_wait.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_load_store_tensor.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_lookup.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_softmax.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_batched_softmax.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_add.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_pad.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_concat.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_transpose.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_n_to_4.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_slice.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_broadcast.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_mul.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_mean.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_meani16.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_expand_8_to_16.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_binaryi16.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_unaryi16.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_beta_activationf32.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_beta_convf32.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_beta_concatf32.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_beta_transposeconvf32.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/xcore_beta_fcf32.cc", + "lib_tflite_micro/src/tflite-xcore-kernels/conv2d_float.c", + ], +) diff --git a/xformer/lib_tflmc.BUILD b/xformer/lib_tflmc.BUILD new file mode 100644 index 000000000..3a6f90370 --- /dev/null +++ b/xformer/lib_tflmc.BUILD @@ -0,0 +1,222 @@ +package( + default_visibility = ["//visibility:public"], +) + +filegroup( + name = "TFLITE_SOURCES", + srcs = [ + "@tflite_micro//tensorflow/lite:array.cc", + "@tflite_micro//tensorflow/lite/core/c:common.cc", + "@tflite_micro//tensorflow/lite/kernels/internal:common.cc", + "@tflite_micro//tensorflow/lite/core/api:error_reporter.cc", + "@tflite_micro//tensorflow/lite/core/api:tensor_utils.cc", + "@tflite_micro//tensorflow/lite/core/api:flatbuffer_conversions.cc", + "@tflite_micro//tensorflow/lite/kernels:kernel_util.cc", + "@tflite_micro//tensorflow/lite/kernels/internal:quantization_util.cc", + "@tflite_micro//tensorflow/lite/kernels/internal:portable_tensor_utils.cc", + "@tflite_micro//tensorflow/lite/kernels/internal:tensor_ctypes.cc", + "@tflite_micro//tensorflow/lite/schema:schema_utils.cc", + "@tflite_micro//tensorflow/lite/micro:micro_log.cc", + ], +) + +filegroup( + name = "TFLM_SOURCES", + srcs = [ + "@tflite_micro//tensorflow/lite/micro:micro_op_resolver.cc", + "@tflite_micro//tensorflow/lite/micro:micro_allocator.cc", + "@tflite_micro//tensorflow/lite/micro:micro_allocation_info.cc", + "@tflite_micro//tensorflow/lite/micro:micro_context.cc", + "@tflite_micro//tensorflow/lite/micro:micro_interpreter.cc", + "@tflite_micro//tensorflow/lite/micro:micro_interpreter_context.cc", + "@tflite_micro//tensorflow/lite/micro:micro_interpreter_graph.cc", + "@tflite_micro//tensorflow/lite/micro:micro_profiler.cc", + "@tflite_micro//tensorflow/lite/micro:micro_time.cc", + "@tflite_micro//tensorflow/lite/micro:mock_micro_graph.cc", + "@tflite_micro//tensorflow/lite/micro:recording_micro_allocator.cc", + "@tflite_micro//tensorflow/lite/micro:system_setup.cc", + "@tflite_micro//tensorflow/lite/micro:test_helpers.cc", + "@tflite_micro//tensorflow/lite/micro:test_helper_custom_ops.cc", + "@tflite_micro//tensorflow/lite/micro/arena_allocator:non_persistent_arena_buffer_allocator.cc", + "@tflite_micro//tensorflow/lite/micro/arena_allocator:persistent_arena_buffer_allocator.cc", + "@tflite_micro//tensorflow/lite/micro/arena_allocator:recording_single_arena_buffer_allocator.cc", + "@tflite_micro//tensorflow/lite/micro/arena_allocator:single_arena_buffer_allocator.cc", + "@tflite_micro//tensorflow/lite/micro/memory_planner:linear_memory_planner.cc", + "@tflite_micro//tensorflow/lite/micro/memory_planner:greedy_memory_planner.cc", + "@tflite_micro//python/tflite_micro:python_ops_resolver.cc", + ], +) + +filegroup( + name = "TFLM_KERNEL_SOURCES", + srcs = [ + # We need to add below files to kernel sources as they are used from the kernels + # and we need the files to link successfully + "@tflite_micro//tensorflow/lite/micro:flatbuffer_utils.cc", + "@tflite_micro//tensorflow/lite/micro/tflite_bridge:micro_error_reporter.cc", + "@tflite_micro//tensorflow/lite/micro/tflite_bridge:flatbuffer_conversions_bridge.cc", + "@tflite_micro//tensorflow/lite/micro:micro_resource_variable.cc", + "@tflite_micro//tensorflow/lite/micro:micro_utils.cc", + "@tflite_micro//tensorflow/lite/micro:memory_helpers.cc", + + "@tflite_micro//tensorflow/lite/micro/kernels:activations.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:activations_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:add.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:add_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:add_n.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:slice.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:arg_min_max.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:batch_to_space_nd.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:broadcast_args.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:broadcast_to.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:cast.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:ceil.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:circular_buffer.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:circular_buffer_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:circular_buffer_flexbuffers_generated_data.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:comparisons.cc", + "@tflite_micro//tensorflow/lite/kernels/internal:reference/comparisons.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:concatenation.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:conv.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:conv_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:cumsum.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:depth_to_space.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:depthwise_conv.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:depthwise_conv_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:dequantize.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:dequantize_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:detection_postprocess_flexbuffers_generated_data.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:div.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:elementwise.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:elu.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:ethosu.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:exp.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:expand_dims.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:fill.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:floor.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:floor_div.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:floor_mod.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:fully_connected.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:fully_connected_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:gather.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:gather_nd.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:hard_swish.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:hard_swish_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:kernel_util.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:l2_pool_2d.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:l2norm.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:leaky_relu.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:leaky_relu_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:log_softmax.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:logical.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:logical_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:logistic.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:logistic_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:maximum_minimum.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:mirror_pad.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:mul.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:mul_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:neg.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:pack.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:pad.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:pooling.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:pooling_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:prelu.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:prelu_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:quantize.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:quantize_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:reduce.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:reduce_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:reshape.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:reshape_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:resize_bilinear.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:resize_nearest_neighbor.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:round.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:select.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:shape.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:softmax.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:softmax_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:space_to_batch_nd.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:space_to_depth.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:split.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:split_v.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:squared_difference.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:squeeze.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:strided_slice.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:strided_slice_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:sub.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:sub_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:svdf.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:svdf_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:tanh.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:transpose.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:transpose_conv.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:unpack.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:micro_tensor_utils.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:lstm_eval.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:lstm_eval_common.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:unidirectional_sequence_lstm.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:zeros_like.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:if.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:while.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:call_once.cc", + ], +) + +filegroup( + name = "EXTRA_KERNEL_SOURCES", + srcs = [ + # We dont support these kernels yet for compiled models + # They link with micro_graph from within the kernels + "@tflite_micro//tensorflow/lite/micro/kernels:var_handle.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:read_variable.cc", + "@tflite_micro//tensorflow/lite/micro/kernels:assign_variable.cc", + ], +) + +cc_library( + name = "tflmc_lib", + hdrs = [ + "src/Api.h", + "src/CodeWriter.h", + "src/Compiler.h", + "src/MemMap.h", + "src/TypeToString.h", + "src/xtflm_conf.h", + ], + srcs = [ + "src/Api.cc", + "src/CodeWriter.cc", + "src/Compiler.cc", + "src/MemMap.cc", + "src/TypeToString.cc", + "@lib_tflite_micro//:XTFLIB_SOURCES", + "@lib_tflite_micro//:XTFLIB_KERNEL_SOURCES", + "//:TFLM_SOURCES", + "//:TFLITE_SOURCES", + "//:TFLM_KERNEL_SOURCES", + "//:EXTRA_KERNEL_SOURCES", + ], + deps = [ + "@lib_nn//:nn_lib", + "@lib_tflite_micro//:shared_headers", + "@llvm-project//llvm:Support" + ], + local_defines = [ + "__xtflm_conf_h_exists__", + "NN_USE_REF", + #"TF_LITE_STATIC_MEMORY", + "TF_LITE_DISABLE_X86_NEON", + "SUFFICIENT_ARENA_SIZE=128*1024*1024", + ], + includes = [ + "src", + "../../external/lib_tflite_micro/lib_tflite_micro/submodules/tflite-micro", + "../../external/lib_tflite_micro/lib_tflite_micro/submodules/flatbuffers/include", + "../../external/lib_tflite_micro/lib_tflite_micro/submodules/gemmlowp", + "../../external/lib_tflite_micro/lib_tflite_micro/submodules/ruy", + "../../external/lib_tflite_micro/lib_tflite_micro/src/tflite-xcore-kernels", + "../../external/lib_tflite_micro/lib_tflite_micro/src", + "../../external/lib_tflite_micro/lib_tflite_micro/api", + ], +) diff --git a/xformer/modelrunner.py b/xformer/modelrunner.py new file mode 100644 index 000000000..c035b627d --- /dev/null +++ b/xformer/modelrunner.py @@ -0,0 +1,285 @@ +# Copyright 2021 XMOS LIMITED. This Software is subject to the terms of the +# XMOS Public License: Version 1 +import os +import tempfile +import subprocess +import numpy as np +import pathlib +import argparse +import cv2 +from itertools import chain + +import tensorflow as tf +import larq_compute_engine as lce +from xmos_ai_tools.xinterpreters import TFLMHostInterpreter + +#from tflite_micro.python.tflite_micro import runtime + +def checksum_calc(data): + res = np.uint8(0) + for i in range(0, len(data)): + res -= np.uint8(data[i]) + return res + + +XFORMER2_PATH = pathlib.Path(__file__).resolve().parents[0] / "bazel-bin" / "xcore-opt" + + +def dequantize(arr: np.ndarray, scale: float, zero_point: int) -> np.float32: + return np.float32(arr.astype(np.int32) - np.int32(zero_point)) * np.float32(scale) + + +def get_xformed_model(model, args): + with tempfile.TemporaryDirectory(suffix=str(os.getpid())) as dirname: + input_path = pathlib.Path(dirname) / "input.tflite" + + with open(pathlib.Path(input_path).resolve(), "wb") as fd: + fd.write(model) + + params_path = pathlib.Path(dirname) / "output.params" + output_path = pathlib.Path(dirname) / "output.tflite" + cmd = [ + str(XFORMER2_PATH), + str(input_path), + "-o", + str(output_path), + "--xcore-thread-count=" + args.tc, + "--xcore-weights-file=" + str(params_path), + # "--lce-translate-tfl", + # "--xcore-optimize-maxpool2d", + # "--xcore-replace-with-conv2dv2", + # "--xcore-translate-to-customop" + # "--xcore-op-split-tensor-arena", + # "--xcore-op-split-bottom-op=20", + # "--xcore-op-split-top-op=0", + # "--xcore-op-split-num-splits=5", + # "--xcore-conv-err-threshold=3.6", + # "--xcore-offline-offsets=1", + # "--xcore-overlap=1" + ] + p = subprocess.run( + cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, check=True + ) + print(p.stdout) + with open(pathlib.Path(output_path).resolve(), "rb") as fd: + output_bits = bytes(fd.read()) + with open(pathlib.Path(params_path).resolve(), "rb") as fd: + params_bits = bytes(fd.read()) + return output_bits, params_bits + + +def test_inference(args): + model = args.model + + with open(model, "rb") as fd: + model_content = fd.read() + + # for attaching a debugger + if args.s: + import time + + time.sleep(5) + + if args.bnn: + print("Creating LCE interpreter...") + interpreter = lce.testing.Interpreter( + model_content, num_threads=1, use_reference_bconv=True + ) + # interpreter = lce.testing.Interpreter(model_content, num_threads=1) + input_tensor_type = interpreter.input_types[0] + input_tensor_shape = interpreter.input_shapes[0] + + else: + print("Creating TFLite interpreter...") + # interpreter = tf.lite.Interpreter( + # model_content=model_content) + interpreter = tf.lite.Interpreter( + model_content=model_content, + experimental_op_resolver_type=tf.lite.experimental. + OpResolverType.BUILTIN_REF, experimental_preserve_all_tensors=True) + # tflm_interpreter = runtime.Interpreter.from_bytes(model_content, arena_size=128 * 1024 * 1024) + + # interpreter = tf.lite.Interpreter(model_content=model_content, experimental_op_resolver_type=tf.lite.experimental.OpResolverType.BUILTIN_WITHOUT_DEFAULT_DELEGATES) + interpreter.allocate_tensors() + num_of_inputs = len(interpreter.get_input_details()) + input_tensor_type = [] + input_tensor_shape = [] + for i in range(num_of_inputs): + input_tensor_type.append(interpreter.get_input_details()[i]["dtype"]) + input_tensor_shape.append(interpreter.get_input_details()[i]["shape"]) + + # input_tensor = np.array(100 * np.random.random_sample(input_tensor_shape), dtype=input_tensor_type) + # interpreter.set_tensor(input_tensor_details["index"], input_tensor) + # print("Invoking TFLite interpreter...") + # interpreter.invoke() + + if args.input: + print("Input provided via file...") + s = input_tensor_shape + img = cv2.imread(args.input) + res = cv2.resize(img, dsize=(s[1], s[2]), interpolation=cv2.INTER_CUBIC) + + input_tensor = np.array(res, dtype=input_tensor_type) + input_tensor.shape = input_tensor_shape + + # print(repr(input_tensor)) + print("Invoking xformer to get converted model...") + xformed_model, params = get_xformed_model(model_content, args) + + print("Creating TFLM XCore interpreter...") + ie = TFLMHostInterpreter() + ie.set_model( + model_content=xformed_model, params_content=params, secondary_memory=True + ) + # ie.set_model(model_content=xformed_model, secondary_memory=True) + + if args.cifar: + (_, _), (test_images, _) = tf.keras.datasets.cifar10.load_data() + # shift images from 0-255 to -128-127 + test_images = tf.cast(test_images - 128.0, tf.int8) + + # Run tests + num_of_fails = 0 + for test in range(0, int(args.n)): + print("Run #" + str(test)) + input_tensor = [] + if args.cifar: + print("Using cifar images...") + # add batch dim + input_tensor = np.expand_dims(test_images[test], axis=0) + else: + print("Creating random input...") + # print(k) + # k = np.load("1.npy") + + for i in range(num_of_inputs): + k = [] + import math + step = math.ceil((np.iinfo(input_tensor_type[i]).max * 2) / 85) + n = np.iinfo(input_tensor_type[i]).min + for j in range(0, np.prod(input_tensor_shape[i])): + if n >= np.iinfo(input_tensor_type[i]).max + 1: + n = np.iinfo(input_tensor_type[i]).min + k.append(n) + n = n + step + # input_tensor.append(np.array(255 * np.random.random_sample(input_tensor_shape[i]) - 128, dtype=input_tensor_type[i])) + # input_tensor.append(np.array(1 * np.ones(input_tensor_shape[i]), dtype=input_tensor_type[i])) + input_tensor.append( + np.reshape( + np.asarray(k, dtype=input_tensor_type[i]), input_tensor_shape[i] + ) + ) + + if args.bnn: + print("Invoking LCE interpreter...") + outputs = interpreter.predict(input_tensor) + # for some reason, batch dim is missing in lce when only one output + if len(outputs) == 1: + outputs = [outputs] + num_of_outputs = len(outputs) + else: + for i in range(num_of_inputs): + # tflm_interpreter.set_input(input_tensor[i], i) + + interpreter.set_tensor( + interpreter.get_input_details()[i]["index"], input_tensor[i] + ) + print("Invoking TFLite interpreter...") + # tflm_interpreter.invoke() + + interpreter.invoke() + + num_of_outputs = len(interpreter.get_output_details()) + outputs = [] + output_scales = [] + output_zero_points = [] + for i in range(num_of_outputs): + # outputs.append( + # tflm_interpreter.get_output(i) + # ) + + outputs.append( + interpreter.get_tensor(interpreter.get_output_details()[i]["index"]) + ) + quant_params = interpreter.get_output_details()[i][ + "quantization_parameters" + ] + output_scales.append(quant_params["scales"]) + output_zero_points.append(quant_params["zero_points"]) + + # print("Creating 2nd LCE interpreter...") + # ie = lce.testing.Interpreter(xformed_model, num_threads=1, use_reference_bconv=True) + # outputs2 = ie.predict(input_tensor) + # # for some reason, batch dim is missing in lce when only one output + # if len(outputs2) == 1: + # outputs2 = [outputs2] + # print(outputs2) + + print("Invoking XCORE interpreter...") + for i in range(num_of_inputs): + ie.set_tensor(i, input_tensor[i]) + ie.invoke() + xformer_outputs = [] + for i in range(num_of_outputs): + xformer_outputs.append(ie.get_tensor(ie.get_output_details()[i]["index"])) + + np.set_printoptions(threshold=np.inf) + # Compare outputs + for i in range(num_of_outputs): + print("Comparing output number " + str(i) + "...") + try: + print("xformer output") + print(xformer_outputs[i].flatten()) + print("checksum") + print(checksum_calc(xformer_outputs[i].flatten().tobytes())) + print("host output") + print(outputs[i].flatten()) + print("checksum") + print(checksum_calc(outputs[i].flatten().tobytes())) + + errors = np.array( + list( + chain( + *[ + np.array(a - b).reshape(-1) + for a, b in zip(outputs, xformer_outputs) + ] + ) + ) + ).reshape(-1) + print("Max error = ", np.max(np.abs(errors))) + # if quantized output, we dequantize it before comparing + if output_scales[i]: + outputs[i] = dequantize( + outputs[i], output_scales[i], output_zero_points[i] + ) + xformer_outputs[i] = dequantize( + xformer_outputs[i], output_scales[i], output_zero_points[i] + ) + np.testing.assert_equal(outputs[i], xformer_outputs[i]) + except Exception as e: + num_of_fails += 1 + print(e) + print("Run #" + str(test) + " failed") + # np.testing.assert_equal(outputs[i], outputs2[i]) + return num_of_fails + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("model", help="provide model tflite file") + parser.add_argument("--input", help="input file") + parser.add_argument("--bnn", default=False, action="store_true", help="run bnn") + parser.add_argument( + "--s", default=False, action="store_true", help="sleep for 5 seconds" + ) + parser.add_argument( + "--cifar", default=False, action="store_true", help="enable cifar test data" + ) + parser.add_argument("--n", default=1, help="num of runs") + parser.add_argument("--tc", help="thread count") + args = parser.parse_args() + + num_of_fails = test_inference(args) + print("\nTotal tests = " + str(args.n)) + print("Total fails = " + str(num_of_fails)) diff --git a/experimental/xformer/patches/BUILD b/xformer/patches/BUILD similarity index 100% rename from experimental/xformer/patches/BUILD rename to xformer/patches/BUILD diff --git a/xformer/patches/flatbuffer_export.patch b/xformer/patches/flatbuffer_export.patch new file mode 100644 index 000000000..2c9b3dedc --- /dev/null +++ b/xformer/patches/flatbuffer_export.patch @@ -0,0 +1,55 @@ +diff --git a/tensorflow/compiler/mlir/lite/flatbuffer_export.cc b/tensorflow/compiler/mlir/lite/flatbuffer_export.cc +index 1a55e517791..cb2c21c8861 100644 +--- a/tensorflow/compiler/mlir/lite/flatbuffer_export.cc ++++ b/tensorflow/compiler/mlir/lite/flatbuffer_export.cc +@@ -244,6 +244,14 @@ static bool IsConst(Operation* op) { + mlir::stablehlo::ConstantOp>(op); + } + ++// We don't want to export XC scratch buffer ops ++static bool IsFakeXCOp(Operation* op) { ++ if(auto customOp = dyn_cast(op)){ ++ return customOp.getCustomCode().str() == "XC_fake_scratch"; ++ } ++ return false; ++} ++ + static bool IsTFResourceOp(Operation* op) { + for (const auto& operand : op->getOperands()) { + auto elementType = getElementTypeOrSelf(operand.getType()); +@@ -2462,6 +2470,9 @@ std::optional> Translator::BuildSubGraph( + // Skip constant ops as they don't represent a TFLite operator. + if (IsConst(&inst)) continue; + ++ // We don't want to export XC scratch buffer ops. ++ if (IsFakeXCOp(&inst)) continue; ++ + // Fetch operand and result tensor indices. + std::vector results; + results.reserve(inst.getNumResults()); +@@ -2577,10 +2588,12 @@ Translator::CreateMetadataVector() { + } + for (const auto& kv : metadata_) { + const std::string& val = kv.second; +- // Only take the first kByteStringSize values. +- const int count = std::min(kByteStringSize, val.length()); +- std::string value = std::string(kByteStringSize, '\0') +- .assign(val.begin(), val.begin() + count); ++ if (val.length() % 16 != 0) { ++ module_.emitError("metadata string must be aligned to 16 bytes"); ++ return std::nullopt; ++ } ++ std::string value = std::string(val.length(), '\0') ++ .assign(val.begin(), val.begin() + val.length()); + metadata.push_back(BuildMetadata(kv.first, value)); + } + +@@ -2986,8 +2999,6 @@ std::optional Translator::TranslateInternal() { + mac_str = absl::StrFormat("%.3f G ", + static_cast(ops_count / 2) / billion); + } +- LOG(INFO) << "Estimated count of arithmetic ops: " << flops_str +- << " ops, equivalently " << mac_str << " MACs"; + } + + std::string model_description; diff --git a/xformer/patches/llvm_python.patch b/xformer/patches/llvm_python.patch new file mode 100644 index 000000000..869a56505 --- /dev/null +++ b/xformer/patches/llvm_python.patch @@ -0,0 +1,42 @@ +diff --git a/third_party/llvm/llvm_python.patch b/third_party/llvm/llvm_python.patch +new file mode 100644 +index 00000000000..2c8e46188af +--- /dev/null ++++ b/third_party/llvm/llvm_python.patch +@@ -0,0 +1,24 @@ ++diff --git a/utils/bazel/configure.bzl b/utils/bazel/configure.bzl ++index 88a576548e16..7fb7cd82a31c 100644 ++--- a/utils/bazel/configure.bzl +++++ b/utils/bazel/configure.bzl ++@@ -31,13 +31,18 @@ DEFAULT_TARGETS = [ ++ "XCore", ++ ] ++ +++_PYTHON_BIN_PATH = "PYTHON_BIN_PATH" +++ ++ def _overlay_directories(repository_ctx): ++ src_path = repository_ctx.path(Label("@llvm-raw//:WORKSPACE")).dirname ++ bazel_path = src_path.get_child("utils").get_child("bazel") ++ overlay_path = bazel_path.get_child("llvm-project-overlay") ++ script_path = bazel_path.get_child("overlay_directories.py") ++ ++- python_bin = repository_ctx.which("python3") +++ python_bin = repository_ctx.os.environ.get(_PYTHON_BIN_PATH) +++ if not python_bin: +++ python_bin = repository_ctx.which("python3") +++ ++ if not python_bin: ++ # Windows typically just defines "python" as python3. The script itself ++ # contains a check to ensure python3. +diff --git a/third_party/llvm/workspace.bzl b/third_party/llvm/workspace.bzl +index d4965bcee18..56f666e2acd 100644 +--- a/third_party/llvm/workspace.bzl ++++ b/third_party/llvm/workspace.bzl +@@ -19,6 +19,7 @@ def repo(name): + patch_file = [ + "//third_party/llvm:generated.patch", # Autogenerated, don't remove. + "//third_party/llvm:build.patch", ++ "//third_party/llvm:llvm_python.patch", + "//third_party/llvm:mathextras.patch", + "//third_party/llvm:toolchains.patch", + "//third_party/llvm:zstd.patch", diff --git a/xformer/patches/softmax.patch b/xformer/patches/softmax.patch new file mode 100644 index 000000000..c31093b6c --- /dev/null +++ b/xformer/patches/softmax.patch @@ -0,0 +1,18 @@ +diff --git a/tensorflow/lite/kernels/internal/quantization_util.cc b/tensorflow/lite/kernels/internal/quantization_util.cc +index 62045d67a30..4b8cfbafe35 100644 +--- a/tensorflow/lite/kernels/internal/quantization_util.cc ++++ b/tensorflow/lite/kernels/internal/quantization_util.cc +@@ -314,8 +314,13 @@ void PreprocessSoftmaxScaling(double beta, double input_scale, + max_real_multiplier); + #endif // TFLITE_EMULATE_FLOAT + ++if(input_beta_real_multiplier > 1.) { + QuantizeMultiplierGreaterThanOne(input_beta_real_multiplier, + quantized_multiplier, left_shift); ++} else { ++ QuantizeMultiplierSmallerThanOneExp(input_beta_real_multiplier, ++ quantized_multiplier, left_shift); ++} + } + + void PreprocessLogSoftmaxScalingExp(double beta, double input_scale, diff --git a/xformer/patches/tf_update.patch b/xformer/patches/tf_update.patch new file mode 100644 index 000000000..c8c1f26c6 --- /dev/null +++ b/xformer/patches/tf_update.patch @@ -0,0 +1,25 @@ +diff --git a/larq_compute_engine/mlir/BUILD b/larq_compute_engine/mlir/BUILD +index d174313..9300137 100644 +--- a/larq_compute_engine/mlir/BUILD ++++ b/larq_compute_engine/mlir/BUILD +@@ -9,7 +9,7 @@ package( + td_library( + name = "lce_ops_td_file", + srcs = ["ir/lce_ops.td"], +- includes = ["/external/org_tensorflow"], ++ includes = ["/../org_tensorflow"], + deps = [ + "@llvm-project//mlir:SideEffectInterfacesTdFiles", + "@org_tensorflow//tensorflow/compiler/mlir/lite:tensorflow_lite_ops_td_files", +diff --git a/larq_compute_engine/mlir/ir/lce_ops.h b/larq_compute_engine/mlir/ir/lce_ops.h +index f19dd81..0293e18 100644 +--- a/larq_compute_engine/mlir/ir/lce_ops.h ++++ b/larq_compute_engine/mlir/ir/lce_ops.h +@@ -1,6 +1,7 @@ + #ifndef LARQ_COMPUTE_ENGINE_MLIR_IR_LCE_OPS_H_ + #define LARQ_COMPUTE_ENGINE_MLIR_IR_LCE_OPS_H_ + ++#include "mlir/Bytecode/BytecodeOpInterface.h" + #include "mlir/Dialect/Quant/QuantTypes.h" + #include "mlir/Interfaces/SideEffectInterfaces.h" + diff --git a/xformer/version_check.sh b/xformer/version_check.sh new file mode 100755 index 000000000..74952acd1 --- /dev/null +++ b/xformer/version_check.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +CUR_DIR=$(pwd) + +if [ "$1" == "BAZEL_BUILD" ] +then + LIB_TFLITE_MICRO_DIR="../../external/lib_tflite_micro/lib_tflite_micro" +else + LIB_TFLITE_MICRO_DIR="../third_party/lib_tflite_micro/lib_tflite_micro" +fi + +cd $LIB_TFLITE_MICRO_DIR +if ! ../version_check.sh; then + exit 1 +fi + +cd $CUR_DIR/Transforms +printf "\nRunning version check for xformer..." + +# in xformer folder +TAG=$(git describe --tags --abbrev=0) +GIT_VERSION=$(printf ${TAG} | sed 's/v//') +cd .. + +printf "\nGit version = "$GIT_VERSION + +function get_version() +{ + local filename=$1 + MAJOR=$(grep 'major' $filename | awk '{print $4}' | sed 's/;//') + MINOR=$(grep 'minor' $filename | awk '{print $4}' | sed 's/;//') + PATCH=$(grep 'patch' $filename | awk '{print $4}' | sed 's/;//') + printf "$MAJOR.$MINOR.$PATCH" +} + +VERSION_H="Version.h" + +VERSION_H_STR=$(get_version $VERSION_H) +printf "\nVersion header = "$VERSION_H_STR + +if [ "$GIT_VERSION" != "$VERSION_H_STR" ] +then printf "\nVersion mismatch!" && exit 1 +fi + +printf "\n" +exit 0